diff options
author | cvs2svn <cvs2svn@FreeBSD.org> | 2002-06-29 01:43:10 +0000 |
---|---|---|
committer | cvs2svn <cvs2svn@FreeBSD.org> | 2002-06-29 01:43:10 +0000 |
commit | 3576ada073433c365307cfbc63ea51b8e635f8cb (patch) | |
tree | 52775b4fbe09ebb69ee9dcefedfd4f339ac8cd5c | |
parent | 84b39cc0d1b28a5e64be1136fc2f597632436a20 (diff) |
Notes
552 files changed, 0 insertions, 282729 deletions
diff --git a/contrib/gdb/bfd/COPYING b/contrib/gdb/bfd/COPYING deleted file mode 100644 index a43ea2126fb6b..0000000000000 --- a/contrib/gdb/bfd/COPYING +++ /dev/null @@ -1,339 +0,0 @@ - GNU GENERAL PUBLIC LICENSE - Version 2, June 1991 - - Copyright (C) 1989, 1991 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 licenses for most software are designed to take away your -freedom to share and change it. By contrast, the GNU 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. This -General Public License applies to most of the Free Software -Foundation's software and to any other program whose authors commit to -using it. (Some other Free Software Foundation software is covered by -the GNU Library General Public License instead.) You can apply it to -your programs, too. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -this service if you wish), 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 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 show them these terms so they know 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. - - Finally, any free program is threatened constantly by software -patents. We wish to avoid the danger that redistributors of a free -program will individually obtain patent licenses, in effect making the -program proprietary. To prevent this, we have made it clear that any -patent must be licensed for everyone's free use or not licensed at all. - - 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 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 derivative work under copyright law: -that is to say, a work containing the Program or a portion of it, -either verbatim or with modifications and/or translated into another -language. (Hereinafter, translation is included without limitation in -the term "modification".) Each licensee is addressed as "you". - -Activities other than copying, distribution and modification are not -covered by this License; they are outside its scope. The act of -running the Program is not restricted, and the output from the Program -is covered only if its contents constitute a work based on the -Program (independent of having been made by running the Program). -Whether that is true depends on what the Program does. - - 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 License and to the absence of any warranty; -and give any other recipients of the Program a copy of this License -along with the Program. - -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. - - 2. You may modify your copy or copies of the Program or any portion -of it, thus forming a work based on the Program, and copy and -distribute such modifications or work under the terms of Section 1 -above, provided that you also meet all of these conditions: - - a) You must cause the modified files to carry prominent notices - stating that you changed the files and the date of any change. - - b) You must cause any work that you distribute or publish, that in - whole or in part contains or is derived from the Program or any - part thereof, to be licensed as a whole at no charge to all third - parties under the terms of this License. - - c) If the modified program normally reads commands interactively - when run, you must cause it, when started running for such - interactive use in the most ordinary 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 - License. (Exception: if the Program itself is interactive but - does not normally print such an announcement, your work based on - the Program is not required to print an announcement.) - -These requirements apply to the modified work as a whole. If -identifiable sections of that work are not derived from the Program, -and can be reasonably considered independent and separate works in -themselves, then this License, and its terms, do not apply to those -sections when you distribute them as separate works. But when you -distribute the same sections as part of a whole which is a work based -on the Program, the distribution of the whole must be on the terms of -this License, whose permissions for other licensees extend to the -entire whole, and thus to each and every part regardless of who wrote it. - -Thus, it is not the intent of this section to claim rights or contest -your rights to work written entirely by you; rather, the intent is to -exercise the right to control the distribution of derivative or -collective works based on the Program. - -In addition, mere aggregation of another work not based on the Program -with the Program (or with a work based on the Program) on a volume of -a storage or distribution medium does not bring the other work under -the scope of this License. - - 3. You may copy and distribute the Program (or a work based on it, -under Section 2) in object code or executable form under the terms of -Sections 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 Sections - 1 and 2 above on a medium customarily used for software interchange; or, - - b) Accompany it with a written offer, valid for at least three - years, to give any third party, for a charge no more than your - cost of physically performing source distribution, a complete - machine-readable copy of the corresponding source code, to be - distributed under the terms of Sections 1 and 2 above on a medium - customarily used for software interchange; or, - - c) Accompany it with the information you received as to the offer - to distribute corresponding source code. (This alternative is - allowed only for noncommercial distribution and only if you - received the program in object code or executable form with such - an offer, in accord with Subsection b above.) - -The source code for a work means the preferred form of the work for -making modifications to it. For an executable work, complete source -code means all the source code for all modules it contains, plus any -associated interface definition files, plus the scripts used to -control compilation and installation of the executable. However, as a -special exception, the source code distributed need not include -anything that is normally distributed (in either source or binary -form) with the major components (compiler, kernel, and so on) of the -operating system on which the executable runs, unless that component -itself accompanies the executable. - -If distribution of executable or object code is made by offering -access to copy from a designated place, then offering equivalent -access to copy the source code from the same place counts as -distribution of the source code, even though third parties are not -compelled to copy the source along with the object code. - - 4. You may not copy, modify, sublicense, or distribute the Program -except as expressly provided under this License. Any attempt -otherwise to copy, modify, sublicense or distribute the Program is -void, and will automatically terminate your rights under this License. -However, parties who have received copies, or rights, from you under -this License will not have their licenses terminated so long as such -parties remain in full compliance. - - 5. You are not required to accept this License, since you have not -signed it. However, nothing else grants you permission to modify or -distribute the Program or its derivative works. These actions are -prohibited by law if you do not accept this License. Therefore, by -modifying or distributing 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 for copying, distributing or modifying -the Program or works based on it. - - 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. -You are not responsible for enforcing compliance by third parties to -this License. - - 7. If, as a consequence of a court judgment or allegation of patent -infringement or for any other reason (not limited to patent issues), -conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot -distribute so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you -may not distribute the Program at all. For example, if a patent -license would not permit royalty-free redistribution of the Program by -all those who receive copies directly or indirectly through you, then -the only way you could satisfy both it and this License would be to -refrain entirely from distribution of the Program. - -If any portion of this section is held invalid or unenforceable under -any particular circumstance, the balance of the section is intended to -apply and the section as a whole is intended to apply in other -circumstances. - -It is not the purpose of this section to induce you to infringe any -patents or other property right claims or to contest validity of any -such claims; this section has the sole purpose of protecting the -integrity of the free software distribution system, which is -implemented by public license practices. Many people have made -generous contributions to the wide range of software distributed -through that system in reliance on consistent application of that -system; it is up to the author/donor to decide if he or she is willing -to distribute software through any other system and a licensee cannot -impose that choice. - -This section is intended to make thoroughly clear what is believed to -be a consequence of the rest of this License. - - 8. If the distribution and/or use of the Program is restricted in -certain countries either by patents or by copyrighted interfaces, the -original copyright holder who places the Program under this License -may add an explicit geographical distribution limitation excluding -those countries, so that distribution is permitted only in or among -countries not thus excluded. In such case, this License incorporates -the limitation as if written in the body of this License. - - 9. 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 this 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 -this License, you may choose any version ever published by the Free Software -Foundation. - - 10. 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 - - 11. 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. - - 12. 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 the public, 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 2 of the License, 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) 19yy 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 is a sample; alter the names: - - Yoyodyne, Inc., hereby disclaims all copyright interest in the program - `Gnomovision' (which makes passes at compilers) written by James Hacker. - - <signature of Ty Coon>, 1 April 1989 - Ty Coon, President of Vice - -This General Public License does not permit incorporating your program into -proprietary programs. If your program is a subroutine library, you may -consider it more useful to permit linking proprietary applications with the -library. If this is what you want to do, use the GNU Library General -Public License instead of this License. diff --git a/contrib/gdb/bfd/Makefile.in b/contrib/gdb/bfd/Makefile.in deleted file mode 100644 index e531cf85dc589..0000000000000 --- a/contrib/gdb/bfd/Makefile.in +++ /dev/null @@ -1,1090 +0,0 @@ -# Makefile template for Configure for the BFD library. -# Copyright (C) 1990, 91, 92, 93, 94, 95, 1996 -# Free Software Foundation, Inc. -# Written by Cygnus Support. -# -# This file is part of BFD, the Binary File Descriptor library. -# -# 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 2 of the License, 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - -VPATH = @srcdir@ -srcdir = @srcdir@ - -prefix = @prefix@ - -program_transform_name = @program_transform_name@ -exec_prefix = @exec_prefix@ -bindir = $(exec_prefix)/bin -libdir = $(exec_prefix)/lib - -datadir = $(prefix)/lib -mandir = $(prefix)/man -man1dir = $(mandir)/man1 -man2dir = $(mandir)/man2 -man3dir = $(mandir)/man3 -man4dir = $(mandir)/man4 -man5dir = $(mandir)/man5 -man6dir = $(mandir)/man6 -man7dir = $(mandir)/man7 -man8dir = $(mandir)/man8 -man9dir = $(mandir)/man9 -infodir = $(prefix)/info -includedir = $(prefix)/include -oldincludedir = -docdir = doc - -SHELL = /bin/sh - -INSTALL = @INSTALL@ -INSTALL_PROGRAM = @INSTALL_PROGRAM@ -INSTALL_DATA = @INSTALL_DATA@ - -AR = @AR@ -AR_FLAGS = rc -CC = @CC@ -CFLAGS = @CFLAGS@ -MAKEINFO = makeinfo -RANLIB = @RANLIB@ - -ALLLIBS = @ALLLIBS@ - -PICFLAG = @PICFLAG@ -SHLIB = @SHLIB@ -SHLIB_CC = @SHLIB_CC@ -SHLIB_CFLAGS = @SHLIB_CFLAGS@ -COMMON_SHLIB = @COMMON_SHLIB@ -SHLINK = @SHLINK@ - -SONAME = lib`echo $(SHLIB) | sed -e 's/^lib//' | sed '$(program_transform_name)'` - -CC_FOR_BUILD = @CC_FOR_BUILD@ - -INCDIR = $(srcdir)/../include -CSEARCH = -I. -I$(srcdir) -I$(INCDIR) -DEP = mkdep - -SUBDIRS = doc - -TARGETLIB = libbfd.a - -# bfd.h goes here, for now -BFD_H = bfd.h - -# Some of these files should be in BFD*_BACKENDS below, but some programs -# won't link without them. So, in order for some of the minimal-bfd -# hacks to work, they're also included here for now. -# gdb: elf.o -# objdump: elf.o -# -# Also, Jim Kingdon notes: -# Writing S-records should be included in all (or at least most) -# *-*-coff, *-*-aout, etc., configurations, because people will want to -# be able to use objcopy to create S-records. (S-records are not useful -# for the debugger, so if you are downloading things as S-records you -# need two copies of the executable, one to download and one for the -# debugger). -BFD_LIBS = \ - archive.o archures.o bfd.o cache.o coffgen.o corefile.o \ - format.o init.o libbfd.o opncls.o reloc.o \ - section.o syms.o targets.o hash.o linker.o \ - elf.o srec.o binary.o tekhex.o ihex.o stab-syms.o - -BFD_LIBS_CFILES = \ - archive.c archures.c bfd.c cache.c coffgen.c corefile.c \ - format.c init.c libbfd.c opncls.c reloc.c \ - section.c syms.c targets.c hash.c linker.c \ - elf.c srec.c binary.c tekhex.c ihex.c stab-syms.c - -# This list is alphabetized to make it easier to keep in sync -# with the decls and initializer in archures.c. -ALL_MACHINES = \ - cpu-a29k.o \ - cpu-alpha.o \ - cpu-arm.o \ - cpu-h8300.o \ - cpu-h8500.o \ - cpu-hppa.o \ - cpu-i386.o \ - cpu-i860.o \ - cpu-i960.o \ - cpu-m68k.o \ - cpu-m88k.o \ - cpu-mips.o \ - cpu-ns32k.o \ - cpu-powerpc.o \ - cpu-rs6000.o \ - cpu-sh.o \ - cpu-sparc.o \ - cpu-vax.o \ - cpu-we32k.o \ - cpu-w65.o \ - cpu-z8k.o - -ALL_MACHINES_CFILES = \ - cpu-a29k.c \ - cpu-alpha.c \ - cpu-arm.c \ - cpu-h8300.c \ - cpu-h8500.c \ - cpu-hppa.c \ - cpu-i386.c \ - cpu-i860.c \ - cpu-i960.c \ - cpu-m68k.c \ - cpu-m88k.c \ - cpu-mips.c \ - cpu-ns32k.c \ - cpu-powerpc.c \ - cpu-rs6000.c \ - cpu-sh.c \ - cpu-sparc.c \ - cpu-vax.c \ - cpu-we32k.c \ - cpu-w65.c \ - cpu-z8k.c - -# The .o files needed by all of the 32 bit vectors that are configured into -# target_vector in targets.c if configured with --enable-targets=all. -BFD32_BACKENDS = \ - aout-adobe.o \ - aout-ns32k.o \ - aout0.o \ - aout32.o \ - bout.o \ - cf-i386lynx.o \ - cf-m68klynx.o \ - cf-sparclynx.o \ - coff-a29k.o \ - coff-apollo.o \ - coff-arm.o \ - coff-aux.o \ - coff-h8300.o \ - coff-h8500.o \ - coff-i386.o \ - coff-go32.o \ - coff-i860.o \ - coff-i960.o \ - coff-m68k.o \ - coff-m88k.o \ - coff-mips.o \ - coff-pmac.o \ - coff-rs6000.o \ - coff-sh.o \ - coff-sparc.o \ - coff-u68k.o \ - coff-we32k.o \ - coff-w65.o \ - coff-z8k.o \ - cofflink.o \ - ecoff.o \ - ecofflink.o \ - elf32-gen.o \ - elf32-hppa.o \ - elf32-i386.o \ - elf32-i860.o \ - elf32-m68k.o \ - elf32-m88k.o \ - elf32-mips.o \ - elf32-ppc.o \ - elf32-sparc.o \ - elf32.o \ - elflink.o \ - hp300hpux.o \ - som.o \ - i386aout.o \ - i386bsd.o \ - i386freebsd.o \ - i386linux.o \ - i386lynx.o \ - i386msdos.o \ - i386netbsd.o \ - i386mach3.o \ - i386os9k.o \ - ieee.o \ - m68klinux.o \ - m68klynx.o \ - m68knetbsd.o \ - m88kmach3.o \ - mipsbsd.o \ - newsos3.o \ - nlm.o \ - nlm32-i386.o \ - nlm32-sparc.o \ - nlm32-ppc.o \ - nlm32.o \ - ns32knetbsd.o \ - oasys.o \ - pc532-mach.o \ - pe-arm.o \ - pei-arm.o \ - pe-i386.o \ - pei-i386.o \ - pe-ppc.o \ - pei-ppc.o \ - reloc16.o \ - sparclynx.o \ - sparcnetbsd.o \ - sunos.o \ - tekhex.o \ - versados.o \ - xcofflink.o - -BFD32_BACKENDS_CFILES = \ - aout-adobe.c \ - aout-ns32k.c \ - aout0.c \ - aout32.c \ - bout.c \ - cf-i386lynx.c \ - cf-m68klynx.c \ - cf-sparclynx.c \ - coff-a29k.c \ - coff-apollo.c \ - coff-arm.c \ - coff-aux.c \ - coff-h8300.c \ - coff-h8500.c \ - coff-i386.c \ - coff-i860.c \ - coff-go32.c \ - coff-i960.c \ - coff-m68k.c \ - coff-m88k.c \ - coff-mips.c \ - coff-pmac.c \ - coff-rs6000.c \ - coff-sh.c \ - coff-sparc.c \ - coff-u68k.c \ - coff-we32k.c \ - coff-w65.c \ - coff-z8k.c \ - cofflink.c \ - ecoff.c \ - ecofflink.c \ - elf32-gen.c \ - elf32-hppa.c \ - elf32-i386.c \ - elf32-i860.c \ - elf32-m68k.c \ - elf32-m88k.c \ - elf32-mips.c \ - elf32-ppc.c \ - elf32-sparc.c \ - elf32.c \ - elflink.c \ - hp300hpux.c \ - som.c \ - i386aout.c \ - i386bsd.c \ - i386freebsd.c \ - i386linux.c \ - i386lynx.c \ - i386msdos.c \ - i386netbsd.c \ - i386mach3.c \ - i386os9k.c \ - ieee.c \ - m68klinux.c \ - m68klynx.c \ - m68knetbsd.c \ - m88kmach3.c \ - mipsbsd.c \ - newsos3.c \ - nlm.c \ - nlm32-i386.c \ - nlm32-sparc.c \ - nlm32-ppc.c \ - nlm32.c \ - ns32knetbsd.c \ - oasys.c \ - pc532-mach.c \ - pe-arm.c \ - pei-arm.c \ - pe-i386.c \ - pei-i386.c \ - pe-ppc.c \ - pei-ppc.c \ - reloc16.c \ - sparclynx.c \ - sparcnetbsd.c \ - sunos.c \ - tekhex.c \ - versados.c \ - xcofflink.c - -# The .o files needed by all of the 64 bit vectors that are configured into -# target_vector in targets.c if configured with --enable-targets=all -# and --enable-64-bit-bfd. -BFD64_BACKENDS = \ - aout64.o \ - coff-alpha.o \ - demo64.o \ - elf64-gen.o \ - elf64-sparc.o \ - elf64.o \ - nlm32-alpha.o \ - nlm64.o - -BFD64_BACKENDS_CFILES = \ - aout64.c \ - coff-alpha.c \ - demo64.c \ - elf64-gen.c \ - elf64-sparc.c \ - elf64.c \ - nlm32-alpha.c \ - nlm64.c - -OPTIONAL_BACKENDS = \ - aix386-core.o \ - hpux-core.o \ - irix-core.o \ - lynx-core.o \ - osf-core.o \ - trad-core.o \ - cisco-core.o - -OPTIONAL_BACKENDS_CFILES = \ - aix386-core.c \ - hpux-core.c \ - irix-core.c \ - lynx-core.c \ - osf-core.c \ - trad-core.c \ - cisco-core.c - -# These are defined by configure.in: -WORDSIZE = @wordsize@ -ALL_BACKENDS = @all_backends@ -BFD_BACKENDS = @bfd_backends@ -BFD_MACHINES = @bfd_machines@ -TDEFAULTS = @tdefaults@ - -all: - -FLAGS_TO_PASS = \ - "prefix=$(prefix)" \ - "exec_prefix=$(exec_prefix)" \ - "against=$(against)" \ - "AR=$(AR)" \ - "AR_FLAGS=$(AR_FLAGS)" \ - "CC=$(CC)" \ - "CC_FOR_BUILD=$(CC_FOR_BUILD)" \ - "CFLAGS=$(CFLAGS)" \ - "RANLIB=$(RANLIB)" \ - "MAKEINFO=$(MAKEINFO)" \ - "INSTALL=$(INSTALL)" \ - "INSTALL_DATA=$(INSTALL_DATA)" \ - "INSTALL_PROGRAM=$(INSTALL_PROGRAM)" - -ALL_CFLAGS=@HDEFINES@ @COREFLAG@ @TDEFINES@ $(CSEARCH) $(CSWITCHES) $(CFLAGS) -.c.o: - if [ -n "$(PICFLAG)" ]; then \ - $(CC) -c $(PICFLAG) $(ALL_CFLAGS) $< -o pic/$@; \ - else true; fi - $(CC) -c $(ALL_CFLAGS) $< - -bfd_libs_here = -all_machines_here = -bfd32_backends_here = -core_files_here = -configs_not_included_in_all_targets_option_here = - -# C source files that correspond to .o's. -CFILES = \ - $(BFD_LIBS_CFILES) \ - $(ALL_MACHINES_CFILES) \ - $(BFD32_BACKENDS_CFILES) \ - $(BFD64_BACKENDS_CFILES) \ - $(OPTIONAL_BACKENDS_CFILES) \ - i386dynix.c hp300bsd.c - -HFILES = aout-target.h aoutf1.h aoutx.h coffcode.h \ - coffswap.h ecoffswap.h elf32-hppa.h elf32-target.h elf64-target.h \ - elfcode.h hppa_stubs.h libaout.h libbfd.h \ - libcoff.h libecoff.h elf-bfd.h libhppa.h libieee.h libnlm.h \ - liboasys.h nlm-target.h nlmcode.h som.h genlink.h netbsd.h - -all: Makefile $(ALLLIBS) @PICLIST@ - @$(MAKE) subdir_do DO=all "DODIRS=$(SUBDIRS)" $(FLAGS_TO_PASS) - -.NOEXPORT: -MAKEOVERRIDES= - -.PHONY: check installcheck -check: - @echo No testsuites exist for the BFD library. Nothing to check. - -installcheck: - @echo No testsuites exist for the BFD library. Nothing to check. - -info dvi : force - @$(MAKE) subdir_do DO=$@ "DODIRS=$(SUBDIRS)" $(FLAGS_TO_PASS) - -clean-info: - @$(MAKE) subdir_do DO=clean-info "DODIRS=$(SUBDIRS)" $(FLAGS_TO_PASS) - -install-info: force - @$(MAKE) subdir_do DO=install-info "DODIRS=$(SUBDIRS)" $(FLAGS_TO_PASS) - -diststuff: info - -# Various kinds of .o files to put in libbfd.a: -# BFD_LIBS Generic routines, always needed. -# BFD_BACKENDS Routines the configured targets need. -# BFD_MACHINES Architecture-specific routines the configured targets need. -# COREFILE Core file routines for a native configuration -OFILES = $(BFD_LIBS) $(BFD_BACKENDS) $(BFD_MACHINES) @COREFILE@ - -stamp-ofiles: Makefile - rm -f tofiles - f=""; \ - for i in $(OFILES) ; do \ - case " $$f " in \ - *" $$i "*) ;; \ - *) f="$$f $$i" ;; \ - esac ; \ - done ; \ - echo $$f > tofiles - $(srcdir)/../move-if-change tofiles ofiles - touch stamp-ofiles - -ofiles: stamp-ofiles ; @true - -$(TARGETLIB): $(OFILES) ofiles - rm -f $(TARGETLIB) - @echo ofiles = `cat ofiles` - $(AR) $(AR_FLAGS) $(TARGETLIB) `cat ofiles` - $(RANLIB) $(TARGETLIB) - -stamp-piclist: ofiles - rm -f tpiclist - if [ -n "$(PICFLAG)" ]; then \ - sed -e 's,\([^ ][^ ]*\),pic/\1,g' ofiles > tpiclist; \ - else \ - cp ofiles tpiclist; \ - fi - $(srcdir)/../move-if-change tpiclist piclist - touch stamp-piclist - -piclist: stamp-piclist ; @true - -$(SHLIB): stamp-picdir $(OFILES) piclist - rm -f $(SHLIB) - $(SHLIB_CC) $(SHLIB_CFLAGS) -o $(SHLIB) `cat piclist` - -# We make a link from libbfd.so to libbfd.so.VERSION for linking, and -# also a link from libTARGET-bfd.so.VERSION for running. -$(SHLINK): $(SHLIB) - ts=lib`echo $(SHLIB) | sed -e 's/^lib//' | sed -e '$(program_transform_name)'`; \ - if [ "$$ts" != "$(SHLIB)" ]; then \ - rm -f $$ts; \ - ln -sf $(SHLIB) $$ts; \ - else true; fi - rm -f $(SHLINK) - ln -sf $(SHLIB) $(SHLINK) - -# This target creates libTARGET-bfd.so.VERSION as a symlink to -# libbfd.so.VERSION. It is used on SunOS, which does not have SONAME. -stamp-tshlink: $(SHLIB) - tf=lib`echo $(SHLIB) | sed -e 's/^lib//' | sed '$(program_transform_name)'`; \ - if [ "$$tf" != "$(SHLIB)" ]; then \ - rm -f $$tf; \ - ln -sf $(SHLIB) $$tf; \ - else true; fi - touch stamp-tshlink - -# When compiling archures.c and targets.c, supply the default target -# info from configure. - -targets.o: targets.c Makefile - if [ -n "$(PICFLAG)" ]; then \ - $(CC) -c $(PICFLAG) $(TDEFAULTS) $(ALL_CFLAGS) $(srcdir)/targets.c -o pic/targets.o; \ - else true; fi - $(CC) -c $(TDEFAULTS) $(ALL_CFLAGS) $(srcdir)/targets.c - -archures.o: archures.c Makefile - if [ -n "$(PICFLAG)" ]; then \ - $(CC) -c $(PICFLAG) $(TDEFAULTS) $(ALL_CFLAGS) $(srcdir)/archures.c -o pic/archures.o; \ - else true; fi - $(CC) -c $(TDEFAULTS) $(ALL_CFLAGS) $(srcdir)/archures.c - -elf32-target.h : elfxx-target.h - rm -f elf32-target.h - sed -e s/NN/32/g < $(srcdir)/elfxx-target.h > elf32-target.new - mv -f elf32-target.new elf32-target.h - -elf64-target.h : elfxx-target.h - rm -f elf64-target.h - sed -e s/NN/64/g < $(srcdir)/elfxx-target.h > elf64-target.new - mv -f elf64-target.new elf64-target.h - -subdir_do: force - @for i in $(DODIRS); do \ - if [ -d ./$$i ] ; then \ - if (cd ./$$i; \ - $(MAKE) $(FLAGS_TO_PASS) $(DO)) ; then true ; \ - else exit 1 ; fi ; \ - else true ; fi ; \ - done - -tags etags: TAGS - -TAGS: force - etags $(INCDIR)/*.h $(srcdir)/*.h $(srcdir)/*.c - -do_mostlyclean: - rm -f *.o *~ core *.E *.p *.ip aout-params.h gen-aout config.log \ - pic/*.o -do_clean: do_mostlyclean - rm -f libbfd.a TAGS bfd.h stmp-bfd.h ofiles stamp-ofiles \ - elf32-target.h elf64-target.h $(SHLIB) $(SHLINK) \ - piclist stamp-piclist -do_distclean: do_clean - rm -f Makefile config.status config.cache config.h stamp-h - rm -rf pic stamp-picdir -do_maintainer_clean: do_distclean - rm -f $(srcdir)/bfd-in2.h $(srcdir)/libbfd.h $(srcdir)/libcoff.h - -mostlyclean: do_mostlyclean - $(MAKE) subdir_do DO=mostlyclean "DODIRS=$(SUBDIRS)" $(FLAGS_TO_PASS) -clean: do_clean - $(MAKE) subdir_do DO=clean "DODIRS=$(SUBDIRS)" $(FLAGS_TO_PASS) -distclean: - $(MAKE) subdir_do DO=distclean "DODIRS=$(SUBDIRS)" $(FLAGS_TO_PASS) - $(MAKE) do_distclean -clobber maintainer-clean realclean: - @echo "This command is intended for maintainers to use;" - @echo "it deletes files that may require special tools to rebuild." - $(MAKE) subdir_do DO=maintainer-clean "DODIRS=$(SUBDIRS)" $(FLAGS_TO_PASS) - $(MAKE) do_maintainer_clean - -BFD_H_DEPS= $(INCDIR)/ansidecl.h $(INCDIR)/obstack.h -LOCAL_H_DEPS= libbfd.h sysdep.h config.h -$(BFD_LIBS): $(BFD_H) $(BFD_H_DEPS) $(LOCAL_H_DEPS) -$(BFD_MACHINES): $(BFD_H) $(BFD_H_DEPS) $(LOCAL_H_DEPS) -$(BFD_BACKENDS): $(BFD_H) $(BFD_H_DEPS) $(LOCAL_H_DEPS) -$(OPTIONAL_BACKENDS): $(BFD_H) $(BFD_H_DEPS) $(LOCAL_H_DEPS) - -# Get around a Sun Make bug in SunOS 4.1.1 with VPATH -cpu-i386.o:cpu-i386.c -cpu-z8k.o: cpu-z8k.c -cpu-h8500.o: cpu-h8500.c -cpu-we32k.o: cpu-we32k.c - -saber: - #suppress 65 on bfd_map_over_sections - #suppress 66 on bfd_map_over_sections - #suppress 67 on bfd_map_over_sections - #suppress 68 on bfd_map_over_sections - #suppress 69 on bfd_map_over_sections - #suppress 70 on bfd_map_over_sections - #suppress 110 in bfd_map_over_sections - #suppress 112 in bfd_map_over_sections - #suppress 530 - #suppress 590 in swap_exec_header - #suppress 590 in _bfd_dummy_core_file_matches_executable_p - #suppress 590 in bfd_dont_truncate_arname - #suppress 590 on ignore - #suppress 590 on abfd - #setopt load_flags $(CFLAGS) - #load $(CFILES) - - -#----------------------------------------------------------------------------- -# 'STANDARD' GNU/960 TARGETS BELOW THIS POINT -# -# 'VERSION' file must be present and contain a string of the form "x.y" -#----------------------------------------------------------------------------- - -ver960.c: FORCE - rm -f ver960.c - echo "char ${TARG}_ver[]= \"${TARG} `cat VERSION`, `date`\";" > ver960.c - - -# This target should be invoked before building a new release. -# 'VERSION' file must be present and contain a string of the form "x.y" -# -roll: - @V=`cat VERSION` ; \ - MAJ=`sed 's/\..*//' VERSION` ; \ - MIN=`sed 's/.*\.//' VERSION` ; \ - V=$$MAJ.`expr $$MIN + 1` ; \ - rm -f VERSION ; \ - echo $$V >VERSION ; \ - echo Version $$V - -# Dummy target to force execution of dependent targets. -# -force: - -install: $(ALLLIBS) - for f in $(ALLLIBS); do \ - if [ "$$f" = "stamp-tshlink" ]; then \ - continue; \ - fi; \ - tf=lib`echo $$f | sed -e 's/^lib//' | sed '$(program_transform_name)'`; \ - rm -f $(libdir)/$$tf; \ - if [ "$$f" = "$(SHLINK)" ]; then \ - ts=lib`echo $(SHLIB) | sed -e 's/^lib//' | sed '$(program_transform_name)'`; \ - ln -sf $$ts $(libdir)/$$tf; \ - elif [ "$$f" = "$(SHLIB)" ]; then \ - $(INSTALL_PROGRAM) $$f $(libdir)/$$tf; \ - else \ - $(INSTALL_DATA) $$f $(libdir)/$$tf; \ - $(RANLIB) $(libdir)/$$tf; \ - chmod a-x $(libdir)/$$tf; \ - fi; \ - done -# Install BFD include file, and others that it needs. Install them -# both in GCC's include directory, and in the system include dir -# if configured as $(oldincludedir) -- which it usually isnt. - $(INSTALL_DATA) $(BFD_H) $(includedir)/bfd.h - $(INSTALL_DATA) $(INCDIR)/ansidecl.h $(includedir)/ansidecl.h - $(INSTALL_DATA) $(INCDIR)/bfdlink.h $(includedir)/bfdlink.h - $(INSTALL_DATA) $(INCDIR)/obstack.h $(includedir)/obstack.h - -if test -z "$(oldincludedir)"; then true; else \ - test -d $(oldincludedir) || mkdir $(oldincludedir); \ - $(INSTALL_DATA) $(BFD_H) $(oldincludedir)/bfd.h; \ - $(INSTALL_DATA) $(INCDIR)/ansidecl.h $(oldincludedir)/ansidecl.h; \ - $(INSTALL_DATA) $(INCDIR)/bfdlink.h $(oldincludedir)/bfdlink.h; \ - $(INSTALL_DATA) $(INCDIR)/obstack.h $(oldincludedir)/obstack.h; \ - $(MAKE) subdir_do DO=install "DODIRS=$(SUBDIRS)" $(FLAGS_TO_PASS); \ - fi - -Makefile: Makefile.in config.status - CONFIG_FILES=Makefile CONFIG_HEADERS= $(SHELL) ./config.status - -config.h: stamp-h ; @true -stamp-h: config.in config.status - CONFIG_FILES= CONFIG_HEADERS=config.h:config.in $(SHELL) ./config.status - -config.status: configure configure.host config.bfd - $(SHELL) config.status --recheck - -# Have to get rid of .dep1 here so that "$?" later includes all of $(CFILES). -.dep: dep.sed $(CFILES) $(HFILES) bfd.h - rm -f .dep1 - $(MAKE) DEP=$(DEP) .dep1 - sed -f dep.sed <.dep1 >.dep - -# This rule really wants a mkdep that runs "gcc -MM". -# The NetBSD mkdep overwrites any existing file contents, and doesn't insert -# the "DO NOT DELETE" line. -# Other mkdep versions require a file that already exists, and do insert it. -# Hence the weirdness.... -.dep1: $(CFILES) - rm -f .dep2 .dep2a - echo '# DO NOT DELETE THIS LINE -- mkdep uses it.' > .dep2 - echo > .dep2a - $(DEP) -f .dep2a $(ALL_CFLAGS) $? - sed -e '/DO NOT DELETE/d' -e '/^$$/d' < .dep2a >> .dep2 - rm -f .dep2a - $(srcdir)/../move-if-change .dep2 .dep1 - -dep.sed: dep-in.sed config.status - sed <$(srcdir)/dep-in.sed >dep.sed \ - -e 's!@BFD_H@!$(BFD_H)!' \ - -e 's!@INCDIR@!$(INCDIR)!' \ - -e 's!@SRCDIR@!$(srcdir)!' - -dep: .dep - sed -e '/^..DO NOT DELETE THIS LINE/,$$d' < Makefile > tmp-Makefile - cat .dep >> tmp-Makefile - $(srcdir)/../move-if-change tmp-Makefile Makefile - -dep-in: .dep - sed -e '/^..DO NOT DELETE THIS LINE/,$$d' < $(srcdir)/Makefile.in > tmp-Makefile.in - cat .dep >> tmp-Makefile.in - $(srcdir)/../move-if-change tmp-Makefile.in $(srcdir)/Makefile.in - -host-aout.o: Makefile - -# The following program can be used to generate a simple config file -# which can be folded into an h-XXX file for a new host, with some editing. -aout-params.h: gen-aout - ./gen-aout host > aout-params.h -gen-aout: $(srcdir)/gen-aout.c Makefile - $(CC) -o gen-aout $(CFLAGS) $(LFLAGS) $(srcdir)/gen-aout.c - -BFDIN_H= $(srcdir)/bfd-in2.h - -$(BFD_H): stmp-bfd.h ; @true - -stmp-bfd.h : $(srcdir)/bfd-in2.h Makefile - rm -f bfd.h-new - sed -e 's/@WORDSIZE@/$(WORDSIZE)/' \ - -e "s/@VERSION@/`cat $(srcdir)/VERSION`/" \ - -e 's/@BFD_HOST_64BIT_LONG@/@HOST_64BIT_LONG@/' \ - < $(srcdir)/bfd-in2.h \ - > bfd.h-new - $(srcdir)/../move-if-change bfd.h-new $(BFD_H) - touch stmp-bfd.h - -# Could really use a "copy-if-change"... -headers: - (cd $(docdir); $(MAKE) protos $(FLAGS_TO_PASS)) - cp $(docdir)/bfd.h bfd-in2.h-new - $(srcdir)/../move-if-change bfd-in2.h-new $(srcdir)/bfd-in2.h - cp $(docdir)/libbfd.h libbfd.h-new - $(srcdir)/../move-if-change libbfd.h-new $(srcdir)/libbfd.h - cp $(docdir)/libcoff.h libcoff.h-new - $(srcdir)/../move-if-change libcoff.h-new $(srcdir)/libcoff.h - -# The rules for the generated header files are here so that people can -# type `make bfd-in2.h' if they remove it. They are not run by default. -$(srcdir)/bfd-in2.h: - (cd $(docdir); $(MAKE) bfd.h $(FLAGS_TO_PASS)) - cp $(docdir)/bfd.h bfd-in2.h-new - $(srcdir)/../move-if-change bfd-in2.h-new $(srcdir)/bfd-in2.h -$(srcdir)/libbfd.h: - (cd $(docdir); $(MAKE) libbfd.h $(FLAGS_TO_PASS)) - cp $(docdir)/libbfd.h libbfd.h-new - $(srcdir)/../move-if-change libbfd.h-new $(srcdir)/libbfd.h -$(srcdir)/libcoff.h: - (cd $(docdir); $(MAKE) libcoff.h $(FLAGS_TO_PASS)) - cp $(docdir)/libcoff.h libcoff.h-new - $(srcdir)/../move-if-change libcoff.h-new $(srcdir)/libcoff.h - -bfd.info: - (cd $(docdir); $(MAKE) bfd.info $(FLAGS_TO_PASS)) - -bfd.dvi: - (cd $(docdir); $(MAKE) bfd.dvi $(FLAGS_TO_PASS)) - -bfd.ps: - (cd $(docdir); $(MAKE) bfd.ps $(FLAGS_TO_PASS)) - - -$(OFILES): stamp-picdir - -stamp-picdir: - if [ -n "$(PICFLAG)" ] && [ ! -d pic ]; then \ - mkdir pic; \ - else true; fi - touch stamp-picdir - -# What appears below is generated by a hacked mkdep using gcc -MM. - -# DO NOT DELETE THIS LINE -- mkdep uses it. -# DO NOT PUT ANYTHING AFTER THIS LINE, IT WILL GO AWAY. -archive.o: archive.c $(INCDIR)/aout/ar.h $(INCDIR)/aout/ranlib.h -archures.o: archures.c -bfd.o: bfd.c $(INCDIR)/bfdlink.h $(INCDIR)/coff/internal.h \ - $(INCDIR)/coff/sym.h libcoff.h libecoff.h $(INCDIR)/coff/ecoff.h \ - elf-bfd.h $(INCDIR)/elf/common.h $(INCDIR)/elf/internal.h \ - $(INCDIR)/elf/external.h -cache.o: cache.c -coffgen.o: coffgen.c $(INCDIR)/coff/internal.h libcoff.h \ - $(INCDIR)/bfdlink.h -corefile.o: corefile.c -format.o: format.c -init.o: init.c -libbfd.o: libbfd.c -opncls.o: opncls.c -reloc.o: reloc.c $(INCDIR)/bfdlink.h -section.o: section.c -syms.o: syms.c $(INCDIR)/bfdlink.h $(INCDIR)/aout/stab_gnu.h \ - $(INCDIR)/aout/stab.def -targets.o: targets.c -hash.o: hash.c -linker.o: linker.c $(INCDIR)/bfdlink.h genlink.h -elf.o: elf.c $(INCDIR)/bfdlink.h elf-bfd.h $(INCDIR)/elf/common.h \ - $(INCDIR)/elf/internal.h $(INCDIR)/elf/external.h -srec.o: srec.c $(INCDIR)/libiberty.h -binary.o: binary.c -tekhex.o: tekhex.c $(INCDIR)/libiberty.h -ihex.o: ihex.c $(INCDIR)/libiberty.h -stab-syms.o: stab-syms.c libaout.h $(INCDIR)/bfdlink.h \ - $(INCDIR)/aout/aout64.h $(INCDIR)/aout/stab.def -cpu-a29k.o: cpu-a29k.c -cpu-alpha.o: cpu-alpha.c -cpu-arm.o: cpu-arm.c -cpu-h8300.o: cpu-h8300.c -cpu-h8500.o: cpu-h8500.c -cpu-hppa.o: cpu-hppa.c -cpu-i386.o: cpu-i386.c -cpu-i860.o: cpu-i860.c -cpu-i960.o: cpu-i960.c -cpu-m68k.o: cpu-m68k.c -cpu-m88k.o: cpu-m88k.c -cpu-mips.o: cpu-mips.c -cpu-ns32k.o: cpu-ns32k.c -cpu-powerpc.o: cpu-powerpc.c -cpu-rs6000.o: cpu-rs6000.c -cpu-sh.o: cpu-sh.c -cpu-sparc.o: cpu-sparc.c -cpu-vax.o: cpu-vax.c -cpu-we32k.o: cpu-we32k.c -cpu-w65.o: cpu-w65.c -cpu-z8k.o: cpu-z8k.c -aout-adobe.o: aout-adobe.c $(INCDIR)/aout/adobe.h $(INCDIR)/aout/stab_gnu.h \ - $(INCDIR)/aout/stab.def libaout.h $(INCDIR)/bfdlink.h -aout-ns32k.o: aout-ns32k.c $(INCDIR)/aout/aout64.h \ - libaout.h $(INCDIR)/bfdlink.h -aout0.o: aout0.c aoutf1.h $(INCDIR)/aout/sun4.h libaout.h \ - $(INCDIR)/bfdlink.h $(INCDIR)/aout/aout64.h $(INCDIR)/aout/stab_gnu.h \ - $(INCDIR)/aout/stab.def $(INCDIR)/aout/ar.h aout-target.h -aout32.o: aout32.c aoutx.h $(INCDIR)/bfdlink.h libaout.h \ - $(INCDIR)/aout/aout64.h $(INCDIR)/aout/stab_gnu.h $(INCDIR)/aout/stab.def \ - $(INCDIR)/aout/ar.h -bout.o: bout.c $(INCDIR)/bfdlink.h genlink.h $(INCDIR)/bout.h \ - $(INCDIR)/aout/stab_gnu.h $(INCDIR)/aout/stab.def libaout.h -cf-i386lynx.o: cf-i386lynx.c coff-i386.c $(INCDIR)/coff/i386.h \ - $(INCDIR)/coff/internal.h libcoff.h $(INCDIR)/bfdlink.h \ - coffcode.h coffswap.h -cf-m68klynx.o: cf-m68klynx.c coff-m68k.c $(INCDIR)/coff/m68k.h \ - $(INCDIR)/coff/internal.h libcoff.h $(INCDIR)/bfdlink.h \ - coffcode.h coffswap.h -cf-sparclynx.o: cf-sparclynx.c coff-sparc.c $(INCDIR)/coff/sparc.h \ - $(INCDIR)/coff/internal.h libcoff.h $(INCDIR)/bfdlink.h \ - coffcode.h coffswap.h -coff-a29k.o: coff-a29k.c $(INCDIR)/coff/a29k.h $(INCDIR)/coff/internal.h \ - libcoff.h $(INCDIR)/bfdlink.h coffcode.h coffswap.h -coff-apollo.o: coff-apollo.c $(INCDIR)/coff/apollo.h \ - $(INCDIR)/coff/internal.h libcoff.h $(INCDIR)/bfdlink.h \ - coffcode.h coffswap.h -coff-arm.o: coff-arm.c $(INCDIR)/coff/arm.h $(INCDIR)/coff/internal.h \ - libcoff.h $(INCDIR)/bfdlink.h coffcode.h coffswap.h -coff-aux.o: coff-aux.c $(INCDIR)/coff/aux-coff.h $(INCDIR)/coff/internal.h \ - $(INCDIR)/coff/m68k.h coff-m68k.c libcoff.h $(INCDIR)/bfdlink.h \ - coffcode.h coffswap.h -coff-h8300.o: coff-h8300.c $(INCDIR)/bfdlink.h $(INCDIR)/coff/h8300.h \ - $(INCDIR)/coff/internal.h libcoff.h coffcode.h coffswap.h -coff-h8500.o: coff-h8500.c $(INCDIR)/bfdlink.h $(INCDIR)/coff/h8500.h \ - $(INCDIR)/coff/internal.h libcoff.h coffcode.h coffswap.h -coff-i386.o: coff-i386.c $(INCDIR)/coff/i386.h $(INCDIR)/coff/internal.h \ - libcoff.h $(INCDIR)/bfdlink.h coffcode.h coffswap.h -coff-i860.o: coff-i860.c $(INCDIR)/coff/i860.h $(INCDIR)/coff/internal.h \ - libcoff.h $(INCDIR)/bfdlink.h coffcode.h coffswap.h -coff-go32.o: coff-go32.c coff-i386.c $(INCDIR)/coff/i386.h \ - $(INCDIR)/coff/internal.h libcoff.h $(INCDIR)/bfdlink.h \ - coffcode.h coffswap.h -coff-i960.o: coff-i960.c $(INCDIR)/coff/i960.h $(INCDIR)/coff/internal.h \ - libcoff.h $(INCDIR)/bfdlink.h coffcode.h coffswap.h -coff-m68k.o: coff-m68k.c $(INCDIR)/coff/m68k.h $(INCDIR)/coff/internal.h \ - libcoff.h $(INCDIR)/bfdlink.h coffcode.h coffswap.h -coff-m88k.o: coff-m88k.c $(INCDIR)/coff/m88k.h $(INCDIR)/coff/internal.h \ - libcoff.h $(INCDIR)/bfdlink.h coffcode.h coffswap.h -coff-mips.o: coff-mips.c $(INCDIR)/bfdlink.h $(INCDIR)/coff/internal.h \ - $(INCDIR)/coff/sym.h $(INCDIR)/coff/symconst.h $(INCDIR)/coff/ecoff.h \ - $(INCDIR)/coff/mips.h libcoff.h libecoff.h coffswap.h \ - ecoffswap.h -coff-pmac.o: coff-pmac.c coff-rs6000.c $(INCDIR)/coff/internal.h \ - $(INCDIR)/coff/rs6000.h libcoff.h $(INCDIR)/bfdlink.h \ - coffcode.h coffswap.h -coff-rs6000.o: coff-rs6000.c $(INCDIR)/coff/internal.h \ - $(INCDIR)/coff/rs6000.h libcoff.h $(INCDIR)/bfdlink.h \ - coffcode.h coffswap.h -coff-sh.o: coff-sh.c $(INCDIR)/bfdlink.h $(INCDIR)/coff/sh.h \ - $(INCDIR)/coff/internal.h libcoff.h coffcode.h coffswap.h -coff-sparc.o: coff-sparc.c $(INCDIR)/coff/sparc.h $(INCDIR)/coff/internal.h \ - libcoff.h $(INCDIR)/bfdlink.h coffcode.h coffswap.h -coff-u68k.o: coff-u68k.c coff-m68k.c $(INCDIR)/coff/m68k.h \ - $(INCDIR)/coff/internal.h libcoff.h $(INCDIR)/bfdlink.h \ - coffcode.h coffswap.h -coff-we32k.o: coff-we32k.c $(INCDIR)/coff/we32k.h $(INCDIR)/coff/internal.h \ - libcoff.h $(INCDIR)/bfdlink.h coffcode.h coffswap.h -coff-w65.o: coff-w65.c $(INCDIR)/bfdlink.h $(INCDIR)/coff/w65.h \ - $(INCDIR)/coff/internal.h libcoff.h coffcode.h coffswap.h -coff-z8k.o: coff-z8k.c $(INCDIR)/bfdlink.h $(INCDIR)/coff/z8k.h \ - $(INCDIR)/coff/internal.h libcoff.h coffcode.h coffswap.h -cofflink.o: cofflink.c $(INCDIR)/bfdlink.h $(INCDIR)/coff/internal.h \ - libcoff.h -ecoff.o: ecoff.c $(INCDIR)/bfdlink.h $(INCDIR)/aout/ar.h \ - $(INCDIR)/aout/ranlib.h $(INCDIR)/aout/stab_gnu.h $(INCDIR)/aout/stab.def \ - libaout.h $(INCDIR)/aout/aout64.h $(INCDIR)/coff/internal.h \ - $(INCDIR)/coff/sym.h $(INCDIR)/coff/symconst.h $(INCDIR)/coff/ecoff.h \ - libcoff.h libecoff.h -ecofflink.o: ecofflink.c $(INCDIR)/bfdlink.h $(INCDIR)/aout/stab_gnu.h \ - $(INCDIR)/aout/stab.def $(INCDIR)/coff/internal.h $(INCDIR)/coff/sym.h \ - $(INCDIR)/coff/symconst.h $(INCDIR)/coff/ecoff.h -elf32-gen.o: elf32-gen.c elf-bfd.h $(INCDIR)/elf/common.h \ - $(INCDIR)/elf/internal.h $(INCDIR)/elf/external.h $(INCDIR)/bfdlink.h \ - elf32-target.h -elf32-hppa.o: elf32-hppa.c $(INCDIR)/bfdlink.h elf-bfd.h \ - $(INCDIR)/elf/common.h $(INCDIR)/elf/internal.h $(INCDIR)/elf/external.h \ - elf32-hppa.h libhppa.h $(INCDIR)/elf/hppa.h hppa_stubs.h \ - elf32-target.h -elf32-i386.o: elf32-i386.c $(INCDIR)/bfdlink.h elf-bfd.h \ - $(INCDIR)/elf/common.h $(INCDIR)/elf/internal.h $(INCDIR)/elf/external.h \ - elf32-target.h -elf32-i860.o: elf32-i860.c elf-bfd.h $(INCDIR)/elf/common.h \ - $(INCDIR)/elf/internal.h $(INCDIR)/elf/external.h $(INCDIR)/bfdlink.h \ - elf32-target.h -elf32-m68k.o: elf32-m68k.c $(INCDIR)/bfdlink.h elf-bfd.h \ - $(INCDIR)/elf/common.h $(INCDIR)/elf/internal.h $(INCDIR)/elf/external.h \ - elf32-target.h -elf32-m88k.o: elf32-m88k.c elf-bfd.h $(INCDIR)/elf/common.h \ - $(INCDIR)/elf/internal.h $(INCDIR)/elf/external.h $(INCDIR)/bfdlink.h \ - elf32-target.h -elf32-mips.o: elf32-mips.c $(INCDIR)/bfdlink.h genlink.h \ - elf-bfd.h $(INCDIR)/elf/common.h $(INCDIR)/elf/internal.h \ - $(INCDIR)/elf/external.h $(INCDIR)/elf/mips.h $(INCDIR)/coff/sym.h \ - $(INCDIR)/coff/symconst.h $(INCDIR)/coff/internal.h \ - $(INCDIR)/coff/ecoff.h $(INCDIR)/coff/mips.h ecoffswap.h \ - elf32-target.h -elf32-ppc.o: elf32-ppc.c $(INCDIR)/bfdlink.h elf-bfd.h \ - $(INCDIR)/elf/common.h $(INCDIR)/elf/internal.h $(INCDIR)/elf/external.h \ - $(INCDIR)/elf/ppc.h elf32-target.h -elf32-sparc.o: elf32-sparc.c $(INCDIR)/bfdlink.h elf-bfd.h \ - $(INCDIR)/elf/common.h $(INCDIR)/elf/internal.h $(INCDIR)/elf/external.h \ - $(INCDIR)/elf/sparc.h elf32-target.h -elf32.o: elf32.c elfcode.h $(INCDIR)/bfdlink.h elf-bfd.h \ - $(INCDIR)/elf/common.h $(INCDIR)/elf/internal.h $(INCDIR)/elf/external.h \ - elfcore.h elflink.h -elflink.o: elflink.c $(INCDIR)/bfdlink.h elf-bfd.h \ - $(INCDIR)/elf/common.h $(INCDIR)/elf/internal.h $(INCDIR)/elf/external.h -hp300hpux.o: hp300hpux.c $(INCDIR)/aout/hp300hpux.h \ - aoutx.h $(INCDIR)/bfdlink.h libaout.h $(INCDIR)/aout/aout64.h \ - $(INCDIR)/aout/stab_gnu.h $(INCDIR)/aout/stab.def $(INCDIR)/aout/ar.h \ - aout-target.h -som.o: som.c -i386aout.o: i386aout.c libaout.h $(INCDIR)/bfdlink.h \ - aout-target.h $(INCDIR)/aout/aout64.h $(INCDIR)/aout/stab_gnu.h \ - $(INCDIR)/aout/stab.def $(INCDIR)/aout/ar.h -i386bsd.o: i386bsd.c libaout.h $(INCDIR)/bfdlink.h \ - aout-target.h $(INCDIR)/aout/aout64.h $(INCDIR)/aout/stab_gnu.h \ - $(INCDIR)/aout/stab.def $(INCDIR)/aout/ar.h -i386freebsd.o: i386freebsd.c freebsd.h libaout.h $(INCDIR)/bfdlink.h \ - aout-target.h $(INCDIR)/aout/aout64.h $(INCDIR)/aout/stab_gnu.h \ - $(INCDIR)/aout/stab.def $(INCDIR)/aout/ar.h -i386linux.o: i386linux.c $(INCDIR)/aout/aout64.h $(INCDIR)/aout/stab_gnu.h \ - $(INCDIR)/aout/stab.def $(INCDIR)/aout/ar.h libaout.h \ - $(INCDIR)/bfdlink.h aout-target.h -i386lynx.o: i386lynx.c libaout.h $(INCDIR)/bfdlink.h \ - $(INCDIR)/aout/aout64.h aout-target.h $(INCDIR)/aout/stab_gnu.h \ - $(INCDIR)/aout/stab.def $(INCDIR)/aout/ar.h -i386msdos.o: i386msdos.c libaout.h $(INCDIR)/bfdlink.h -i386netbsd.o: i386netbsd.c netbsd.h libaout.h $(INCDIR)/bfdlink.h \ - aout-target.h $(INCDIR)/aout/aout64.h $(INCDIR)/aout/stab_gnu.h \ - $(INCDIR)/aout/stab.def $(INCDIR)/aout/ar.h -i386mach3.o: i386mach3.c $(INCDIR)/aout/aout64.h $(INCDIR)/aout/stab_gnu.h \ - $(INCDIR)/aout/stab.def $(INCDIR)/aout/ar.h libaout.h \ - $(INCDIR)/bfdlink.h aout-target.h -i386os9k.o: i386os9k.c $(INCDIR)/bfdlink.h libaout.h \ - $(INCDIR)/os9k.h -ieee.o: ieee.c $(INCDIR)/ieee.h libieee.h -m68klinux.o: m68klinux.c $(INCDIR)/aout/aout64.h $(INCDIR)/aout/stab_gnu.h \ - $(INCDIR)/aout/stab.def $(INCDIR)/aout/ar.h libaout.h \ - $(INCDIR)/bfdlink.h aout-target.h -m68klynx.o: m68klynx.c libaout.h $(INCDIR)/bfdlink.h \ - $(INCDIR)/aout/aout64.h aout-target.h $(INCDIR)/aout/stab_gnu.h \ - $(INCDIR)/aout/stab.def $(INCDIR)/aout/ar.h -m68knetbsd.o: m68knetbsd.c netbsd.h libaout.h $(INCDIR)/bfdlink.h \ - aout-target.h $(INCDIR)/aout/aout64.h $(INCDIR)/aout/stab_gnu.h \ - $(INCDIR)/aout/stab.def $(INCDIR)/aout/ar.h -m88kmach3.o: m88kmach3.c libaout.h $(INCDIR)/bfdlink.h \ - aout-target.h $(INCDIR)/aout/aout64.h $(INCDIR)/aout/stab_gnu.h \ - $(INCDIR)/aout/stab.def $(INCDIR)/aout/ar.h -mipsbsd.o: mipsbsd.c libaout.h $(INCDIR)/bfdlink.h \ - aout-target.h $(INCDIR)/aout/aout64.h $(INCDIR)/aout/stab_gnu.h \ - $(INCDIR)/aout/stab.def $(INCDIR)/aout/ar.h -newsos3.o: newsos3.c $(INCDIR)/aout/aout64.h $(INCDIR)/aout/stab_gnu.h \ - $(INCDIR)/aout/stab.def $(INCDIR)/aout/ar.h libaout.h \ - $(INCDIR)/bfdlink.h aout-target.h -nlm.o: nlm.c libnlm.h $(INCDIR)/nlm/common.h $(INCDIR)/nlm/internal.h \ - $(INCDIR)/nlm/external.h -nlm32-i386.o: nlm32-i386.c $(INCDIR)/nlm/i386-ext.h \ - libnlm.h $(INCDIR)/nlm/common.h $(INCDIR)/nlm/internal.h \ - $(INCDIR)/nlm/external.h nlmswap.h nlm-target.h -nlm32-sparc.o: nlm32-sparc.c $(INCDIR)/nlm/sparc32-ext.h \ - libnlm.h $(INCDIR)/nlm/common.h $(INCDIR)/nlm/internal.h \ - $(INCDIR)/nlm/external.h nlmswap.h nlm-target.h -nlm32-ppc.o: nlm32-ppc.c $(INCDIR)/nlm/ppc-ext.h libnlm.h \ - $(INCDIR)/nlm/common.h $(INCDIR)/nlm/internal.h $(INCDIR)/nlm/external.h \ - nlmswap.h nlm-target.h -nlm32.o: nlm32.c nlmcode.h libnlm.h $(INCDIR)/nlm/common.h \ - $(INCDIR)/nlm/internal.h $(INCDIR)/nlm/external.h -ns32knetbsd.o: ns32knetbsd.c netbsd.h libaout.h $(INCDIR)/bfdlink.h \ - aout-target.h $(INCDIR)/aout/aout64.h $(INCDIR)/aout/stab_gnu.h \ - $(INCDIR)/aout/stab.def $(INCDIR)/aout/ar.h -oasys.o: oasys.c $(INCDIR)/oasys.h liboasys.h -pc532-mach.o: pc532-mach.c libaout.h $(INCDIR)/bfdlink.h \ - $(INCDIR)/aout/aout64.h aout-target.h $(INCDIR)/aout/stab_gnu.h \ - $(INCDIR)/aout/stab.def $(INCDIR)/aout/ar.h -pe-arm.o: pe-arm.c coff-arm.c $(INCDIR)/coff/arm.h \ - $(INCDIR)/coff/internal.h $(INCDIR)/coff/pe.h libcoff.h \ - $(INCDIR)/bfdlink.h coffcode.h peicode.h -pei-arm.o: pei-arm.c coff-arm.c $(INCDIR)/coff/arm.h \ - $(INCDIR)/coff/internal.h $(INCDIR)/coff/pe.h libcoff.h \ - $(INCDIR)/bfdlink.h coffcode.h peicode.h -pe-i386.o: pe-i386.c coff-i386.c $(INCDIR)/coff/i386.h \ - $(INCDIR)/coff/internal.h $(INCDIR)/coff/pe.h libcoff.h \ - $(INCDIR)/bfdlink.h coffcode.h peicode.h -pei-i386.o: pei-i386.c coff-i386.c $(INCDIR)/coff/i386.h \ - $(INCDIR)/coff/internal.h $(INCDIR)/coff/pe.h libcoff.h \ - $(INCDIR)/bfdlink.h coffcode.h peicode.h -pe-ppc.o: pe-ppc.c coff-ppc.c $(INCDIR)/coff/powerpc.h \ - $(INCDIR)/coff/internal.h $(INCDIR)/coff/pe.h libcoff.h \ - $(INCDIR)/bfdlink.h coffcode.h peicode.h -pei-ppc.o: pei-ppc.c coff-ppc.c $(INCDIR)/coff/powerpc.h \ - $(INCDIR)/coff/internal.h $(INCDIR)/coff/pe.h libcoff.h \ - $(INCDIR)/bfdlink.h coffcode.h peicode.h -reloc16.o: reloc16.c $(INCDIR)/bfdlink.h genlink.h \ - $(INCDIR)/coff/internal.h libcoff.h -sparclynx.o: sparclynx.c $(INCDIR)/aout/sun4.h libaout.h \ - $(INCDIR)/bfdlink.h $(INCDIR)/aout/aout64.h $(INCDIR)/aout/stab_gnu.h \ - $(INCDIR)/aout/stab.def $(INCDIR)/aout/ar.h aout-target.h -sparcnetbsd.o: sparcnetbsd.c netbsd.h libaout.h $(INCDIR)/bfdlink.h \ - aout-target.h $(INCDIR)/aout/aout64.h $(INCDIR)/aout/stab_gnu.h \ - $(INCDIR)/aout/stab.def $(INCDIR)/aout/ar.h -sunos.o: sunos.c $(INCDIR)/bfdlink.h libaout.h aoutf1.h \ - $(INCDIR)/aout/sun4.h $(INCDIR)/aout/aout64.h $(INCDIR)/aout/stab_gnu.h \ - $(INCDIR)/aout/stab.def $(INCDIR)/aout/ar.h aout-target.h -versados.o: versados.c $(INCDIR)/libiberty.h -xcofflink.o: xcofflink.c $(INCDIR)/bfdlink.h $(INCDIR)/coff/internal.h \ - libcoff.h -aout64.o: aout64.c aoutx.h $(INCDIR)/bfdlink.h libaout.h \ - $(INCDIR)/aout/aout64.h $(INCDIR)/aout/stab_gnu.h $(INCDIR)/aout/stab.def \ - $(INCDIR)/aout/ar.h -coff-alpha.o: coff-alpha.c $(INCDIR)/bfdlink.h $(INCDIR)/coff/internal.h \ - $(INCDIR)/coff/sym.h $(INCDIR)/coff/symconst.h $(INCDIR)/coff/ecoff.h \ - $(INCDIR)/coff/alpha.h $(INCDIR)/aout/ar.h libcoff.h \ - libecoff.h coffswap.h ecoffswap.h -demo64.o: demo64.c aoutf1.h $(INCDIR)/aout/sun4.h libaout.h \ - $(INCDIR)/bfdlink.h $(INCDIR)/aout/aout64.h $(INCDIR)/aout/stab_gnu.h \ - $(INCDIR)/aout/stab.def $(INCDIR)/aout/ar.h aout-target.h -elf64-gen.o: elf64-gen.c elf-bfd.h $(INCDIR)/elf/common.h \ - $(INCDIR)/elf/internal.h $(INCDIR)/elf/external.h $(INCDIR)/bfdlink.h \ - elf64-target.h -elf64-sparc.o: elf64-sparc.c elf-bfd.h $(INCDIR)/elf/common.h \ - $(INCDIR)/elf/internal.h $(INCDIR)/elf/external.h $(INCDIR)/bfdlink.h \ - $(INCDIR)/elf/sparc.h elf64-target.h -elf64.o: elf64.c elfcode.h $(INCDIR)/bfdlink.h elf-bfd.h \ - $(INCDIR)/elf/common.h $(INCDIR)/elf/internal.h $(INCDIR)/elf/external.h \ - elfcore.h elflink.h -nlm32-alpha.o: nlm32-alpha.c $(INCDIR)/nlm/alpha-ext.h \ - libnlm.h $(INCDIR)/nlm/common.h $(INCDIR)/nlm/internal.h \ - $(INCDIR)/nlm/external.h nlmswap.h nlm-target.h -nlm64.o: nlm64.c nlmcode.h libnlm.h $(INCDIR)/nlm/common.h \ - $(INCDIR)/nlm/internal.h $(INCDIR)/nlm/external.h -aix386-core.o: aix386-core.c $(INCDIR)/coff/i386.h \ - $(INCDIR)/coff/internal.h libcoff.h $(INCDIR)/bfdlink.h -hpux-core.o: hpux-core.c -irix-core.o: irix-core.c -lynx-core.o: lynx-core.c -osf-core.o: osf-core.c -trad-core.o: trad-core.c libaout.h $(INCDIR)/bfdlink.h -cisco-core.o: cisco-core.c -i386dynix.o: i386dynix.c $(INCDIR)/aout/dynix3.h aoutx.h \ - $(INCDIR)/bfdlink.h libaout.h $(INCDIR)/aout/aout64.h \ - $(INCDIR)/aout/stab_gnu.h $(INCDIR)/aout/stab.def $(INCDIR)/aout/ar.h \ - aout-target.h -hp300bsd.o: hp300bsd.c libaout.h $(INCDIR)/bfdlink.h \ - aout-target.h $(INCDIR)/aout/aout64.h $(INCDIR)/aout/stab_gnu.h \ - $(INCDIR)/aout/stab.def $(INCDIR)/aout/ar.h -# IF YOU PUT ANYTHING HERE IT WILL GO AWAY diff --git a/contrib/gdb/bfd/PORTING b/contrib/gdb/bfd/PORTING deleted file mode 100644 index c8bfd77b96ffb..0000000000000 --- a/contrib/gdb/bfd/PORTING +++ /dev/null @@ -1,83 +0,0 @@ - Preliminary Notes on Porting BFD - -------------------------------- - -The 'host' is the system a tool runs *on*. -The 'target' is the system a tool runs *for*, i.e. -a tool can read/write the binaries of the target. - -Porting to a new host ---------------------- -Pick a name for your host. Call that <host>. -(<host> might be sun4, ...) -Create a file hosts/<host>.mh. - -Porting to a new target ------------------------ -Pick a name for your target. Call that <target>. -Call the name for your CPU architecture <cpu>. -You need to create <target>.c and config/<target>.mt, -and add a case for it to a case statements in bfd/configure.host and -bfd/config.bfd, which associates each canonical host type with a BFD -host type (used as the base of the makefile fragment names), and to the -table in bfd/configure.in which associates each target vector with -the .o files it uses. - -config/<target>.mt is a Makefile fragment. -The following is usually enough: -DEFAULT_VECTOR=<target>_vec -SELECT_ARCHITECTURES=bfd_<cpu>_arch - -See the list of cpu types in archures.c, or "ls cpu-*.c". -If your architecture is new, you need to add it to the tables -in bfd/archures.c, opcodes/configure.in, and binutils/objdump.c. - -For more information about .mt and .mh files, see config/README. - -The file <target>.c is the hard part. It implements the -bfd_target <target>_vec, which includes pointers to -functions that do the actual <target>-specific methods. - -Porting to a <target> that uses the a.out binary format -------------------------------------------------------- - -In this case, the include file aout-target.h probaby does most -of what you need. The program gen-aout generates <target>.c for -you automatically for many a.out systems. Do: - make gen-aout - ./gen-aout <target> > <target>.c -(This only works if you are building on the target ("native"). -If you must make a cross-port from scratch, copy the most -similar existing file that includes aout-target.h, and fix what is wrong.) - -Check the parameters in <target>.c, and fix anything that is wrong. -(Also let us know about it; perhaps we can improve gen-aout.c.) - -TARGET_IS_BIG_ENDIAN_P - Should be defined if <target> is big-endian. - -N_HEADER_IN_TEXT(x) - See discussion in ../include/aout/aout64.h. - -BYTES_IN_WORD - Number of bytes per word. (Usually 4 but can be 8.) - -ARCH - Number of bits per word. (Usually 32, but can be 64.) - -ENTRY_CAN_BE_ZERO - Define if the extry point (start address of an - executable program) can be 0x0. - -TEXT_START_ADDR - The address of the start of the text segemnt in - virtual memory. Normally, the same as the entry point. - -TARGET_PAGE_SIZE - -SEGMENT_SIZE - Usually, the same as the TARGET_PAGE_SIZE. - Alignment needed for the data segment. - -TARGETNAME - The name of the target, for run-time lookups. - Usually "a.out-<target>" diff --git a/contrib/gdb/bfd/TODO b/contrib/gdb/bfd/TODO deleted file mode 100644 index 08a3641b1adec..0000000000000 --- a/contrib/gdb/bfd/TODO +++ /dev/null @@ -1,25 +0,0 @@ -Things that still need to be done: -*- Text -*- - - o - A source of space lossage is that all the target-dependent code - is in a single bfd_target structure. Hence all the code for - *writing* object files is still pulled into all the applications - that only care about *reading* (gdb, nm, objdump), while gas has - to carry along all the unneded baggage for reading objects. And - so on. This would be a substantial change, and the payoff would - not all that great (essentially none if bfd is used as a shared - library). - - o - The storage needed by BFD data structures is also larger than strictly - needed. This may be difficult to do much about. - - o - implement bfd_abort, which should close the bfd but not alter the - filesystem. - - o - update the bfd doc; write a how-to-write-a-backend doc, take out - the stupid quips and fill in all the blanks. - - o - upgrade the reloc handling as per Steve's suggestion. - - - - diff --git a/contrib/gdb/bfd/VERSION b/contrib/gdb/bfd/VERSION deleted file mode 100644 index 9ddf6b5ad1a60..0000000000000 --- a/contrib/gdb/bfd/VERSION +++ /dev/null @@ -1 +0,0 @@ -cygnus-2.6 diff --git a/contrib/gdb/bfd/acconfig.h b/contrib/gdb/bfd/acconfig.h deleted file mode 100644 index 647798cbe9f09..0000000000000 --- a/contrib/gdb/bfd/acconfig.h +++ /dev/null @@ -1,19 +0,0 @@ - -/* Whether malloc must be declared even if <stdlib.h> is included. */ -#undef NEED_DECLARATION_MALLOC - -/* Whether free must be declared even if <stdlib.h> is included. */ -#undef NEED_DECLARATION_FREE -@TOP@ - -/* Do we need to use the b modifier when opening binary files? */ -#undef USE_BINARY_FOPEN - -/* Name of host specific header file to include in trad-core.c. */ -#undef TRAD_HEADER - -/* Define only if <sys/procfs.h> is available *and* it defines prstatus_t. */ -#undef HAVE_SYS_PROCFS_H - -/* Do we really want to use mmap if it's available? */ -#undef USE_MMAP diff --git a/contrib/gdb/bfd/aclocal.m4 b/contrib/gdb/bfd/aclocal.m4 deleted file mode 100644 index 1f5027e48589a..0000000000000 --- a/contrib/gdb/bfd/aclocal.m4 +++ /dev/null @@ -1,43 +0,0 @@ -dnl See whether we need to use fopen-bin.h rather than fopen-same.h. -AC_DEFUN(BFD_BINARY_FOPEN, -[AC_REQUIRE([AC_CANONICAL_SYSTEM]) -case "${host}" in -changequote(,)dnl -i[345]86-*-msdos* | i[345]86-*-go32* | *-*-cygwin32) -changequote([,])dnl - AC_DEFINE(USE_BINARY_FOPEN) ;; -esac])dnl - -dnl Get a default for CC_FOR_BUILD to put into Makefile. -AC_DEFUN(BFD_CC_FOR_BUILD, -[# Put a plausible default for CC_FOR_BUILD in Makefile. -AC_REQUIRE([AC_C_CROSS])dnl -if test -z "$CC_FOR_BUILD"; then - if test "x$cross_compiling" = "xno"; then - CC_FOR_BUILD='$(CC)' - else - CC_FOR_BUILD=gcc - fi -fi -AC_SUBST(CC_FOR_BUILD)])dnl - -dnl See whether we need a declaration for a function. -AC_DEFUN(BFD_NEED_DECLARATION, -[AC_MSG_CHECKING([whether $1 must be declared]) -AC_CACHE_VAL(bfd_cv_decl_needed_$1, -[AC_TRY_COMPILE([ -#include <stdio.h> -#ifdef HAVE_STDLIB_H -#include <stdlib.h> -#endif -#ifdef HAVE_UNISTD_H -#include <unistd.h> -#endif], -[char *(*pfn) = (char *(*)) $1], -bfd_cv_decl_needed_$1=no, bfd_cv_decl_needed_$1=yes)]) -AC_MSG_RESULT($bfd_cv_decl_needed_$1) -if test $bfd_cv_decl_needed_$1 = yes; then - bfd_tr_decl=NEED_DECLARATION_`echo $1 | tr 'abcdefghijklmnopqrstuvwxyz' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'` - AC_DEFINE_UNQUOTED($bfd_tr_decl) -fi -])dnl diff --git a/contrib/gdb/bfd/aix386-core.c b/contrib/gdb/bfd/aix386-core.c deleted file mode 100644 index 21ec9a6d4313b..0000000000000 --- a/contrib/gdb/bfd/aix386-core.c +++ /dev/null @@ -1,285 +0,0 @@ -/* BFD back-end for AIX on PS/2 core files. - This was based on trad-core.c, which was written by John Gilmore of - Cygnus Support. - Copyright 1988, 1989, 1991, 1992, 1993, 1994 Free Software Foundation, Inc. - Written by Minh Tran-Le <TRANLE@INTELLICORP.COM>. - Converted to back end form by Ian Lance Taylor <ian@cygnus.com>. - -This file is part of BFD, the Binary File Descriptor library. - -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 2 of the License, 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ - -#include "bfd.h" -#include "sysdep.h" -#include "libbfd.h" -#include "obstack.h" -#include "coff/i386.h" -#include "coff/internal.h" -#include "libcoff.h" - -#include <stdio.h> -#include <stddef.h> -#include <signal.h> - -#include <errno.h> - -#if defined (_AIX) && defined (_I386) -#define NOCHECKS /* this is for coredump.h */ -#define _h_USER /* avoid including user.h from coredump.h */ -#include <uinfo.h> -#include <sys/i386/coredump.h> -#endif /* _AIX && _I386 */ - -/* maybe this could work on some other i386 but I have not tried it - * mtranle@paris - Tue Sep 24 12:49:35 1991 - */ - -#ifndef COR_MAGIC -# define COR_MAGIC "core" -#endif - -/* need this cast because ptr is really void * */ -#define core_hdr(bfd) \ - (((bfd->tdata.trad_core_data))->hdr) -#define core_section(bfd,n) \ - (((bfd)->tdata.trad_core_data)->sections[n]) -#define core_regsec(bfd) \ - (((bfd)->tdata.trad_core_data)->reg_section) -#define core_reg2sec(bfd) \ - (((bfd)->tdata.trad_core_data)->reg2_section) - -/* These are stored in the bfd's tdata */ -struct trad_core_struct { - struct corehdr *hdr; /* core file header */ - asection *reg_section; - asection *reg2_section; - asection *sections[MAX_CORE_SEGS]; -}; - -static const bfd_target * -aix386_core_file_p (abfd) - bfd *abfd; -{ - int i,n; - unsigned char longbuf[4]; /* Raw bytes of various header fields */ - int core_size = sizeof (struct corehdr); - struct corehdr *core; - struct mergem { - struct trad_core_struct coredata; - struct corehdr internal_core; - } *mergem; - - if (bfd_read ((PTR)longbuf, 1, sizeof (longbuf), abfd) != sizeof (longbuf)) - { - if (bfd_get_error () != bfd_error_system_call) - bfd_set_error (bfd_error_wrong_format); - return 0; - } - - if (strncmp(longbuf,COR_MAGIC,4)) return 0; - - if (bfd_seek (abfd, 0L, false) < 0) return 0; - - mergem = (struct mergem *)bfd_zalloc (abfd, sizeof (struct mergem)); - if (mergem == NULL) - return 0; - - core = &mergem->internal_core; - - if ((bfd_read ((PTR) core, 1, core_size, abfd)) != core_size) - { - if (bfd_get_error () != bfd_error_system_call) - bfd_set_error (bfd_error_wrong_format); - bfd_release (abfd, (char *)mergem); - return 0; - } - - set_tdata (abfd, &mergem->coredata); - core_hdr (abfd) = core; - - /* create the sections. This is raunchy, but bfd_close wants to reclaim - them */ - core_regsec (abfd) = (asection *) bfd_zalloc (abfd, sizeof (asection)); - if (core_regsec (abfd) == NULL) - { - loser: - bfd_release (abfd, (char *)mergem); - return 0; - } - core_reg2sec (abfd) = (asection *) bfd_zalloc (abfd, sizeof (asection)); - if (core_reg2sec (abfd) == NULL) - { - loser1: - bfd_release (abfd, core_regsec (abfd)); - goto loser; - } - - for (i=0, n=0 ; (i < MAX_CORE_SEGS) && (core->cd_segs[i].cs_type) ; i++) - { - if (core->cd_segs[i].cs_offset == 0) - continue; - core_section (abfd,n) = - (asection *) bfd_zalloc (abfd, sizeof (asection)); - if (core_section (abfd,n) == NULL) - { - int j; - if (n > 0) - { - for (j=0; j < n; j++) - bfd_release (abfd, core_section(abfd, j)); - } - bfd_release (abfd, (char *)mergem); - goto loser1; - } - - switch (core->cd_segs[i].cs_type) - { - case COR_TYPE_DATA: - core_section (abfd, n)->name = ".data"; - core_section (abfd, n)->flags = (SEC_ALLOC + SEC_LOAD + - SEC_HAS_CONTENTS); - break; - case COR_TYPE_STACK: - core_section (abfd, n)->name = ".stack"; - core_section (abfd, n)->flags = (SEC_ALLOC + SEC_LOAD + - SEC_HAS_CONTENTS); - break; - case COR_TYPE_LIBDATA: - core_section (abfd, n)->name = ".libdata"; - core_section (abfd, n)->flags = (SEC_ALLOC + SEC_HAS_CONTENTS); - break; - case COR_TYPE_WRITE: - core_section (abfd, n)->name = ".writeable"; - core_section (abfd, n)->flags = (SEC_ALLOC + SEC_HAS_CONTENTS); - break; - case COR_TYPE_MSC: - core_section (abfd, n)->name = ".misc"; - core_section (abfd, n)->flags = (SEC_ALLOC + SEC_HAS_CONTENTS); - break; - default: - core_section (abfd, n)->name = ".unknown"; - core_section (abfd, n)->flags = (SEC_ALLOC + SEC_HAS_CONTENTS); - break; - } - core_section (abfd, n)->_raw_size = core->cd_segs[i].cs_len; - core_section (abfd, n)->vma = core->cd_segs[i].cs_address; - core_section (abfd, n)->filepos = core->cd_segs[i].cs_offset; - core_section (abfd, n)->alignment_power = 2; - core_section (abfd, n)->next = NULL; - if (n > 0) - core_section (abfd, (n-1))->next = core_section (abfd, n); - - abfd->section_count = ++n; - } - - core_regsec (abfd)->name = ".reg"; - core_reg2sec (abfd)->name = ".reg2"; - - core_regsec (abfd)->flags = SEC_HAS_CONTENTS; - core_reg2sec (abfd)->flags = SEC_HAS_CONTENTS; - - core_regsec (abfd)->_raw_size = sizeof(core->cd_regs); - core_reg2sec (abfd)->_raw_size = sizeof(core->cd_fpregs); - - core_regsec (abfd)->vma = -1; - core_reg2sec (abfd)->vma = -1; - - /* We'll access the regs afresh in the core file, like any section: */ - core_regsec (abfd)->filepos = (file_ptr)offsetof(struct corehdr,cd_regs[0]); - core_reg2sec (abfd)->filepos = (file_ptr)offsetof(struct corehdr, - cd_fpregs); - - /* add the 2 reg fake sections to abfd */ - abfd->section_count += 2; - abfd->sections = core_regsec (abfd); - core_regsec (abfd)->next = core_reg2sec (abfd); - core_reg2sec (abfd)->next = core_section (abfd, 0); - - return abfd->xvec; -} - -static char * -aix386_core_file_failing_command (abfd) - bfd *abfd; -{ - return core_hdr (abfd)->cd_comm; -} - -static int -aix386_core_file_failing_signal (abfd) - bfd *abfd; -{ - return core_hdr (abfd)->cd_cursig; -} - -static boolean -aix386_core_file_matches_executable_p (core_bfd, exec_bfd) - bfd *core_bfd; - bfd *exec_bfd; -{ - return true; /* FIXME, We have no way of telling at this - point */ -} - -/* If somebody calls any byte-swapping routines, shoot them. */ -void -swap_abort() -{ - abort(); /* This way doesn't require any declaration for ANSI to fuck up */ -} -#define NO_GET ((PROTO(bfd_vma, (*), ( const bfd_byte *))) swap_abort ) -#define NO_GETS ((PROTO(bfd_signed_vma, (*), (const bfd_byte *))) swap_abort ) -#define NO_PUT ((PROTO(void, (*), (bfd_vma, bfd_byte *))) swap_abort ) - -const bfd_target aix386_core_vec = - { - "aix386-core", - bfd_target_unknown_flavour, - BFD_ENDIAN_BIG, /* target byte order */ - BFD_ENDIANG_BIG, /* target headers byte order */ - (HAS_RELOC | EXEC_P | /* object flags */ - HAS_LINENO | HAS_DEBUG | - HAS_SYMS | HAS_LOCALS | WP_TEXT), - - (SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD | SEC_RELOC), /* section flags */ - 0, /* leading underscore */ - ' ', /* ar_pad_char */ - 16, /* ar_max_namelen */ - NO_GET, NO_GETS, NO_PUT, - NO_GET, NO_GETS, NO_PUT, - NO_GET, NO_GETS, NO_PUT, /* data */ - NO_GET, NO_GETS, NO_PUT, - NO_GET, NO_GETS, NO_PUT, - NO_GET, NO_GETS, NO_PUT, /* hdrs */ - - {_bfd_dummy_target, _bfd_dummy_target, - _bfd_dummy_target, aix386_core_file_p}, - {bfd_false, bfd_false, /* bfd_create_object */ - bfd_false, bfd_false}, - {bfd_false, bfd_false, /* bfd_write_contents */ - bfd_false, bfd_false}, - - BFD_JUMP_TABLE_GENERIC (_bfd_generic), - BFD_JUMP_TABLE_COPY (_bfd_generic), - BFD_JUMP_TABLE_CORE (aix386), - BFD_JUMP_TABLE_ARCHIVE (_bfd_noarchive), - BFD_JUMP_TABLE_SYMBOLS (_bfd_nosymbols), - BFD_JUMP_TABLE_RELOCS (_bfd_norelocs), - BFD_JUMP_TABLE_WRITE (_bfd_generic), - BFD_JUMP_TABLE_LINK (_bfd_nolink), - BFD_JUMP_TABLE_DYNAMIC (_bfd_nodynamic), - - (PTR) 0 -}; diff --git a/contrib/gdb/bfd/aout-adobe.c b/contrib/gdb/bfd/aout-adobe.c deleted file mode 100644 index 36d230de9e8a6..0000000000000 --- a/contrib/gdb/bfd/aout-adobe.c +++ /dev/null @@ -1,528 +0,0 @@ -/* BFD back-end for a.out.adobe binaries. - Copyright 1990, 1991, 1992, 1993, 1994 Free Software Foundation, Inc. - Written by Cygnus Support. Based on bout.c. - -This file is part of BFD, the Binary File Descriptor library. - -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 2 of the License, 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ - -#include "bfd.h" -#include "sysdep.h" -#include "libbfd.h" - -#include "aout/adobe.h" - -#include "aout/stab_gnu.h" -#include "libaout.h" /* BFD a.out internal data structures */ - -extern const bfd_target a_out_adobe_vec; /* Forward decl */ - -static const bfd_target *aout_adobe_callback PARAMS ((bfd *)); - -extern boolean aout_32_slurp_symbol_table PARAMS ((bfd *abfd)); -extern boolean aout_32_write_syms PARAMS ((bfd *)); -static void aout_adobe_write_section PARAMS ((bfd *abfd, sec_ptr sect)); - -/* Swaps the information in an executable header taken from a raw byte - stream memory image, into the internal exec_header structure. */ - -void aout_adobe_swap_exec_header_in - PARAMS ((bfd *abfd, struct external_exec *raw_bytes, - struct internal_exec *execp)); - -void -aout_adobe_swap_exec_header_in (abfd, raw_bytes, execp) - bfd *abfd; - struct external_exec *raw_bytes; - struct internal_exec *execp; -{ - struct external_exec *bytes = (struct external_exec *)raw_bytes; - - /* Now fill in fields in the execp, from the bytes in the raw data. */ - execp->a_info = bfd_h_get_32 (abfd, bytes->e_info); - execp->a_text = GET_WORD (abfd, bytes->e_text); - execp->a_data = GET_WORD (abfd, bytes->e_data); - execp->a_bss = GET_WORD (abfd, bytes->e_bss); - execp->a_syms = GET_WORD (abfd, bytes->e_syms); - execp->a_entry = GET_WORD (abfd, bytes->e_entry); - execp->a_trsize = GET_WORD (abfd, bytes->e_trsize); - execp->a_drsize = GET_WORD (abfd, bytes->e_drsize); -} - -/* Swaps the information in an internal exec header structure into the - supplied buffer ready for writing to disk. */ - -PROTO(void, aout_adobe_swap_exec_header_out, - (bfd *abfd, - struct internal_exec *execp, - struct external_exec *raw_bytes)); -void -aout_adobe_swap_exec_header_out (abfd, execp, raw_bytes) - bfd *abfd; - struct internal_exec *execp; - struct external_exec *raw_bytes; -{ - struct external_exec *bytes = (struct external_exec *)raw_bytes; - - /* Now fill in fields in the raw data, from the fields in the exec struct. */ - bfd_h_put_32 (abfd, execp->a_info , bytes->e_info); - PUT_WORD (abfd, execp->a_text , bytes->e_text); - PUT_WORD (abfd, execp->a_data , bytes->e_data); - PUT_WORD (abfd, execp->a_bss , bytes->e_bss); - PUT_WORD (abfd, execp->a_syms , bytes->e_syms); - PUT_WORD (abfd, execp->a_entry , bytes->e_entry); - PUT_WORD (abfd, execp->a_trsize, bytes->e_trsize); - PUT_WORD (abfd, execp->a_drsize, bytes->e_drsize); -} - - -static const bfd_target * -aout_adobe_object_p (abfd) - bfd *abfd; -{ - struct internal_exec anexec; - struct external_exec exec_bytes; - char *targ; - - if (bfd_read ((PTR) &exec_bytes, 1, EXEC_BYTES_SIZE, abfd) - != EXEC_BYTES_SIZE) { - if (bfd_get_error () != bfd_error_system_call) - bfd_set_error (bfd_error_wrong_format); - return 0; - } - - anexec.a_info = bfd_h_get_32 (abfd, exec_bytes.e_info); - - /* Normally we just compare for the magic number. - However, a bunch of Adobe tools aren't fixed up yet; they generate - files using ZMAGIC(!). - If the environment variable GNUTARGET is set to "a.out.adobe", we will - take just about any a.out file as an Adobe a.out file. FIXME! */ - - if (N_BADMAG (anexec)) { - extern char *getenv (); - - targ = getenv ("GNUTARGET"); - if (targ && !strcmp (targ, a_out_adobe_vec.name)) - ; /* Just continue anyway, if specifically set to this format */ - else - { - bfd_set_error (bfd_error_wrong_format); - return 0; - } - } - - aout_adobe_swap_exec_header_in (abfd, &exec_bytes, &anexec); - return aout_32_some_aout_object_p (abfd, &anexec, aout_adobe_callback); -} - - -/* Finish up the opening of a b.out file for reading. Fill in all the - fields that are not handled by common code. */ - -static const bfd_target * -aout_adobe_callback (abfd) - bfd *abfd; -{ - struct internal_exec *execp = exec_hdr (abfd); - asection *sect; - struct external_segdesc ext[1]; - char *section_name; - char try_again[30]; /* name and number */ - char *newname; - int trynum; - flagword flags; - - /* Architecture and machine type -- unknown in this format. */ - bfd_set_arch_mach(abfd, bfd_arch_unknown, 0); - - /* The positions of the string table and symbol table. */ - obj_str_filepos (abfd) = N_STROFF (*execp); - obj_sym_filepos (abfd) = N_SYMOFF (*execp); - - /* Suck up the section information from the file, one section at a time. */ - - for (;;) { - if (bfd_read ((PTR) ext, 1, sizeof (*ext), abfd) != sizeof (*ext)) { - if (bfd_get_error () != bfd_error_system_call) - bfd_set_error (bfd_error_wrong_format); - return 0; - } - switch (ext->e_type[0]) { - case N_TEXT: - section_name = ".text"; - flags = SEC_CODE | SEC_LOAD | SEC_ALLOC | SEC_HAS_CONTENTS; - break; - - case N_DATA: - section_name = ".data"; - flags = SEC_DATA | SEC_LOAD | SEC_ALLOC | SEC_HAS_CONTENTS; - break; - - case N_BSS: - section_name = ".bss"; - flags = SEC_DATA | SEC_HAS_CONTENTS; - break; - - case 0: - goto no_more_sections; - - default: - (*_bfd_error_handler) - ("%s: Unknown section type in a.out.adobe file: %x\n", - bfd_get_filename (abfd), ext->e_type[0]); - goto no_more_sections; - } - - /* First one is called ".text" or whatever; subsequent ones are - ".text1", ".text2", ... */ - - bfd_set_error (bfd_error_no_error); - sect = bfd_make_section (abfd, section_name); - trynum = 0; - while (!sect) { - if (bfd_get_error () != bfd_error_no_error) - return 0; /* Some other error -- slide into the sunset */ - sprintf (try_again, "%s%d", section_name, ++trynum); - sect = bfd_make_section (abfd, try_again); - } - - /* Fix the name, if it is a sprintf'd name. */ - if (sect->name == try_again) { - newname = (char *) bfd_zalloc(abfd, strlen (sect->name)); - if (newname == NULL) - return 0; - strcpy (newname, sect->name); - sect->name = newname; - } - - /* Now set the section's attributes. */ - bfd_set_section_flags (abfd, sect, flags); - sect->_raw_size = ((ext->e_size[0] << 8) /* Assumed big-endian */ - | ext->e_size[1] << 8) - | ext->e_size[2]; - sect->_cooked_size = sect->_raw_size; - sect->vma = bfd_h_get_32 (abfd, ext->e_virtbase); - sect->filepos = bfd_h_get_32 (abfd, ext->e_filebase); - /* FIXME XXX alignment? */ - - /* Set relocation information for first section of each type. */ - if (trynum == 0) switch (ext->e_type[0]) { - case N_TEXT: - sect->rel_filepos = N_TRELOFF (*execp); - sect->reloc_count = execp->a_trsize; - break; - - case N_DATA: - sect->rel_filepos = N_DRELOFF (*execp); - sect->reloc_count = execp->a_drsize; - break; - } - } -no_more_sections: - - adata(abfd).reloc_entry_size = sizeof (struct reloc_std_external); - adata(abfd).symbol_entry_size = sizeof (struct external_nlist); - adata(abfd).page_size = 1; /* Not applicable. */ - adata(abfd).segment_size = 1; /* Not applicable. */ - adata(abfd).exec_bytes_size = EXEC_BYTES_SIZE; - - return abfd->xvec; -} - -struct bout_data_struct { - struct aoutdata a; - struct internal_exec e; -}; - -static boolean -aout_adobe_mkobject (abfd) - bfd *abfd; -{ - struct bout_data_struct *rawptr; - - rawptr = (struct bout_data_struct *) bfd_zalloc (abfd, sizeof (struct bout_data_struct)); - if (rawptr == NULL) - return false; - - abfd->tdata.bout_data = rawptr; - exec_hdr (abfd) = &rawptr->e; - - adata(abfd).reloc_entry_size = sizeof (struct reloc_std_external); - adata(abfd).symbol_entry_size = sizeof (struct external_nlist); - adata(abfd).page_size = 1; /* Not applicable. */ - adata(abfd).segment_size = 1; /* Not applicable. */ - adata(abfd).exec_bytes_size = EXEC_BYTES_SIZE; - - return true; -} - - -static boolean -aout_adobe_write_object_contents (abfd) - bfd *abfd; -{ - struct external_exec swapped_hdr; - static struct external_segdesc sentinel[1]; /* Initialized to zero */ - asection *sect; - - exec_hdr (abfd)->a_info = ZMAGIC; - - /* Calculate text size as total of text sections, etc. */ - - exec_hdr (abfd)->a_text = 0; - exec_hdr (abfd)->a_data = 0; - exec_hdr (abfd)->a_bss = 0; - exec_hdr (abfd)->a_trsize = 0; - exec_hdr (abfd)->a_drsize = 0; - - for (sect = abfd->sections; sect; sect = sect->next) { - if (sect->flags & SEC_CODE) { - exec_hdr (abfd)->a_text += sect->_raw_size; - exec_hdr (abfd)->a_trsize += sect->reloc_count * - sizeof (struct reloc_std_external); - } else if (sect->flags & SEC_DATA) { - exec_hdr (abfd)->a_data += sect->_raw_size; - exec_hdr (abfd)->a_drsize += sect->reloc_count * - sizeof (struct reloc_std_external); - } else if (sect->flags & SEC_ALLOC && !(sect->flags & SEC_LOAD)) { - exec_hdr (abfd)->a_bss += sect->_raw_size; - } - } - - exec_hdr (abfd)->a_syms = bfd_get_symcount (abfd) - * sizeof (struct external_nlist); - exec_hdr (abfd)->a_entry = bfd_get_start_address (abfd); - - aout_adobe_swap_exec_header_out (abfd, exec_hdr (abfd), &swapped_hdr); - - if (bfd_seek (abfd, (file_ptr) 0, SEEK_SET) != 0 - || (bfd_write ((PTR) &swapped_hdr, 1, EXEC_BYTES_SIZE, abfd) - != EXEC_BYTES_SIZE)) - return false; - - /* Now write out the section information. Text first, data next, rest - afterward. */ - - for (sect = abfd->sections; sect; sect = sect->next) { - if (sect->flags & SEC_CODE) { - aout_adobe_write_section (abfd, sect); - } - } - for (sect = abfd->sections; sect; sect = sect->next) { - if (sect->flags & SEC_DATA) { - aout_adobe_write_section (abfd, sect); - } - } - for (sect = abfd->sections; sect; sect = sect->next) { - if (!(sect->flags & (SEC_CODE|SEC_DATA))) { - aout_adobe_write_section (abfd, sect); - } - } - - /* Write final `sentinel` section header (with type of 0). */ - if (bfd_write ((PTR) sentinel, 1, sizeof (*sentinel), abfd) - != sizeof (*sentinel)) - return false; - - /* Now write out reloc info, followed by syms and strings */ - if (bfd_get_symcount (abfd) != 0) - { - if (bfd_seek (abfd, (file_ptr)(N_SYMOFF(*exec_hdr(abfd))), SEEK_SET) - != 0) - return false; - - if (! aout_32_write_syms (abfd)) - return false; - - if (bfd_seek (abfd, (file_ptr)(N_TRELOFF(*exec_hdr(abfd))), SEEK_SET) - != 0) - return false; - - for (sect = abfd->sections; sect; sect = sect->next) { - if (sect->flags & SEC_CODE) { - if (!aout_32_squirt_out_relocs (abfd, sect)) - return false; - } - } - - if (bfd_seek (abfd, (file_ptr)(N_DRELOFF(*exec_hdr(abfd))), SEEK_SET) - != 0) - return false; - - for (sect = abfd->sections; sect; sect = sect->next) { - if (sect->flags & SEC_DATA) { - if (!aout_32_squirt_out_relocs (abfd, sect)) - return false; - } - } - } - return true; -} - -static void -aout_adobe_write_section (abfd, sect) - bfd *abfd; - sec_ptr sect; -{ - /* FIXME XXX */ -} - -static boolean -aout_adobe_set_section_contents (abfd, section, location, offset, count) - bfd *abfd; - asection *section; - PTR location; - file_ptr offset; - bfd_size_type count; -{ - file_ptr section_start; - sec_ptr sect; - - if (abfd->output_has_begun == false) { /* set by bfd.c handler */ - - /* Assign file offsets to sections. Text sections are first, and - are contiguous. Then data sections. Everything else at the end. */ - - section_start = N_TXTOFF (ignore<-->me); - - for (sect = abfd->sections; sect; sect = sect->next) { - if (sect->flags & SEC_CODE) { - sect->filepos = section_start; - /* FIXME: Round to alignment */ - section_start += sect->_raw_size; - } - } - - for (sect = abfd->sections; sect; sect = sect->next) { - if (sect->flags & SEC_DATA) { - sect->filepos = section_start; - /* FIXME: Round to alignment */ - section_start += sect->_raw_size; - } - } - - for (sect = abfd->sections; sect; sect = sect->next) { - if (sect->flags & SEC_HAS_CONTENTS && - !(sect->flags & (SEC_CODE|SEC_DATA))) { - sect->filepos = section_start; - /* FIXME: Round to alignment */ - section_start += sect->_raw_size; - } - } - } - - /* regardless, once we know what we're doing, we might as well get going */ - if (bfd_seek (abfd, section->filepos + offset, SEEK_SET) != 0) - return false; - - if (count != 0) { - return (bfd_write ((PTR)location, 1, count, abfd) == count) ?true:false; - } - return true; -} - -static boolean -aout_adobe_set_arch_mach (abfd, arch, machine) - bfd *abfd; - enum bfd_architecture arch; - unsigned long machine; -{ - if (! bfd_default_set_arch_mach (abfd, arch, machine)) - return false; - - if (arch == bfd_arch_unknown - || arch == bfd_arch_m68k) - return true; - - return false; -} - -static int -aout_adobe_sizeof_headers (ignore_abfd, ignore) - bfd *ignore_abfd; - boolean ignore; -{ - return sizeof(struct internal_exec); -} - - - - -/* Build the transfer vector for Adobe A.Out files. */ - -#define aout_32_close_and_cleanup aout_32_bfd_free_cached_info - -#define aout_32_bfd_make_debug_symbol \ - ((asymbol *(*) PARAMS ((bfd *, void *, unsigned long))) bfd_nullvoidptr) - -#define aout_32_bfd_reloc_type_lookup \ - ((reloc_howto_type *(*) \ - PARAMS ((bfd *, bfd_reloc_code_real_type))) bfd_nullvoidptr) - -#define aout_32_set_arch_mach aout_adobe_set_arch_mach -#define aout_32_set_section_contents aout_adobe_set_section_contents - -#define aout_32_sizeof_headers aout_adobe_sizeof_headers -#define aout_32_bfd_get_relocated_section_contents \ - bfd_generic_get_relocated_section_contents -#define aout_32_get_section_contents_in_window _bfd_generic_get_section_contents_in_window -#define aout_32_bfd_relax_section bfd_generic_relax_section -#define aout_32_bfd_link_hash_table_create \ - _bfd_generic_link_hash_table_create -#define aout_32_bfd_link_add_symbols _bfd_generic_link_add_symbols -#define aout_32_bfd_final_link _bfd_generic_final_link -#define aout_32_bfd_link_split_section _bfd_generic_link_split_section - -const bfd_target a_out_adobe_vec = -{ - "a.out.adobe", /* name */ - bfd_target_aout_flavour, - BFD_ENDIAN_BIG, /* data byte order is unknown (big assumed) */ - BFD_ENDIAN_BIG, /* hdr byte order is big */ - (HAS_RELOC | EXEC_P | /* object flags */ - HAS_LINENO | HAS_DEBUG | - HAS_SYMS | HAS_LOCALS | WP_TEXT ), - /* section flags */ - (SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD | SEC_CODE | SEC_DATA | SEC_RELOC), - '_', /* symbol leading char */ - ' ', /* ar_pad_char */ - 16, /* ar_max_namelen */ - - bfd_getb64, bfd_getb_signed_64, bfd_putb64, - bfd_getb32, bfd_getb_signed_32, bfd_putb32, - bfd_getb16, bfd_getb_signed_16, bfd_putb16, /* data */ - bfd_getb64, bfd_getb_signed_64, bfd_putb64, - bfd_getb32, bfd_getb_signed_32, bfd_putb32, - bfd_getb16, bfd_getb_signed_16, bfd_putb16, /* hdrs */ - {_bfd_dummy_target, aout_adobe_object_p, /* bfd_check_format */ - bfd_generic_archive_p, _bfd_dummy_target}, - {bfd_false, aout_adobe_mkobject, /* bfd_set_format */ - _bfd_generic_mkarchive, bfd_false}, - {bfd_false, aout_adobe_write_object_contents, /* bfd_write_contents */ - _bfd_write_archive_contents, bfd_false}, - - BFD_JUMP_TABLE_GENERIC (aout_32), - BFD_JUMP_TABLE_COPY (_bfd_generic), - BFD_JUMP_TABLE_CORE (_bfd_nocore), - BFD_JUMP_TABLE_ARCHIVE (_bfd_archive_bsd), - BFD_JUMP_TABLE_SYMBOLS (aout_32), - BFD_JUMP_TABLE_RELOCS (aout_32), - BFD_JUMP_TABLE_WRITE (aout_32), - BFD_JUMP_TABLE_LINK (aout_32), - BFD_JUMP_TABLE_DYNAMIC (_bfd_nodynamic), - - (PTR) 0 -}; diff --git a/contrib/gdb/bfd/aout-arm.c b/contrib/gdb/bfd/aout-arm.c deleted file mode 100644 index 978664a48aaf7..0000000000000 --- a/contrib/gdb/bfd/aout-arm.c +++ /dev/null @@ -1,548 +0,0 @@ -/* BFD back-end for raw ARM a.out binaries. - Copyright (C) 1994, 1995 Free Software Foundation, Inc. - Contributed by Richard Earnshaw (rwe@pegasus.esprit.ec.org) - -This file is part of BFD, the Binary File Descriptor library. - -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 2 of the License, 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ - - -#define N_TXTADDR(x) \ - ((N_MAGIC(x) == NMAGIC) ? 0x8000 : \ - (N_MAGIC(x) != ZMAGIC) ? 0 : \ - (N_SHARED_LIB(x)) ? ((x).a_entry & ~(TARGET_PAGE_SIZE - 1)) : \ - TEXT_START_ADDR) - -#define TEXT_START_ADDR 0x8000 -#define TARGET_PAGE_SIZE 0x8000 -#define SEGMENT_SIZE TARGET_PAGE_SIZE -#define DEFAULT_ARCH bfd_arch_arm - -#define MY(OP) CAT(aoutarm_,OP) -#define N_BADMAG(x) ((((x).a_info & ~007200) != ZMAGIC) && \ - (((x).a_info & ~006000) != OMAGIC) && \ - ((x).a_info != NMAGIC)) -#define N_MAGIC(x) ((x).a_info & ~07200) - -#include "bfd.h" -#include "sysdep.h" -#include "assert.h" - -#define MYARM(OP) CAT(aoutarm_,OP) -reloc_howto_type *MYARM(bfd_reloc_type_lookup) - PARAMS((bfd *, bfd_reloc_code_real_type)); -static boolean MYARM(write_object_contents) PARAMS((bfd *)); - -/* Avoid multiple defininitions from aoutx if supporting standarad a.out - as well as our own. */ -#define NAME(x,y) CAT3(aoutarm,_32_,y) - -#define MY_bfd_reloc_type_lookup aoutarm_bfd_reloc_type_lookup - -#include "libaout.h" -#include "aout/aout64.h" - -static bfd_reloc_status_type -MY(fix_pcrel_26_done) PARAMS ((bfd *, arelent *, asymbol *, PTR, - asection *, bfd *, char **)); - -static bfd_reloc_status_type -MY(fix_pcrel_26) PARAMS ((bfd *, arelent *, asymbol *, PTR, - asection *, bfd *, char **)); -static void MY(swap_std_reloc_in) PARAMS ((bfd *, struct reloc_std_external *, - arelent *, asymbol **, - bfd_size_type)); -void MY(swap_std_reloc_out) PARAMS ((bfd *, arelent *, - struct reloc_std_external *)); - -reloc_howto_type MY(howto_table)[] = -{ - /* type rs size bsz pcrel bitpos ovrf sf name part_inpl readmask setmask - pcdone */ - HOWTO (0, 0, 0, 8, false, 0, complain_overflow_bitfield, 0, "8", true, - 0x000000ff, 0x000000ff, false), - HOWTO (1, 0, 1, 16, false, 0, complain_overflow_bitfield, 0, "16", true, - 0x0000ffff, 0x0000ffff, false), - HOWTO (2, 0, 2, 32, false, 0, complain_overflow_bitfield, 0, "32", true, - 0xffffffff, 0xffffffff, false), - HOWTO (3, 2, 2, 26, true, 0, complain_overflow_signed, MY(fix_pcrel_26), - "ARM26", true, 0x00ffffff, 0x00ffffff, true), - HOWTO (4, 0, 0, 8, true, 0, complain_overflow_signed, 0, "DISP8", true, - 0x000000ff, 0x000000ff, true), - HOWTO (5, 0, 1, 16, true, 0, complain_overflow_signed, 0, "DISP16", true, - 0x0000ffff, 0x0000ffff, true), - HOWTO (6, 0, 2, 32, true, 0, complain_overflow_signed, 0, "DISP32", true, - 0xffffffff, 0xffffffff, true), - HOWTO (7, 2, 2, 26, false, 0, complain_overflow_signed, - MY(fix_pcrel_26_done), "ARM26D", true, 0x0, 0x0, - false), - {-1}, - HOWTO (9, 0, -1, 16, false, 0, complain_overflow_bitfield, 0, "NEG16", true, - 0x0000ffff, 0x0000ffff, false), - HOWTO (10, 0, -2, 32, false, 0, complain_overflow_bitfield, 0, "NEG32", true, - 0xffffffff, 0xffffffff, false) -}; - -#define RELOC_ARM_BITS_NEG_BIG ((unsigned int) 0x08) -#define RELOC_ARM_BITS_NEG_LITTLE ((unsigned int) 0x10) - -reloc_howto_type * -MY(reloc_howto)(abfd, rel, r_index, r_extern, r_pcrel) - bfd *abfd; - struct reloc_std_external *rel; - int *r_index; - int *r_extern; - int *r_pcrel; -{ - unsigned int r_length; - unsigned int r_pcrel_done; - unsigned int r_neg; - int index; - - *r_pcrel = 0; - if (bfd_header_big_endian (abfd)) - { - *r_index = ((rel->r_index[0] << 16) - | (rel->r_index[1] << 8) - | rel->r_index[2]); - *r_extern = (0 != (rel->r_type[0] & RELOC_STD_BITS_EXTERN_BIG)); - r_pcrel_done = (0 != (rel->r_type[0] & RELOC_STD_BITS_PCREL_BIG)); - r_neg = (0 != (rel->r_type[0] & RELOC_ARM_BITS_NEG_BIG)); - r_length = ((rel->r_type[0] & RELOC_STD_BITS_LENGTH_BIG) - >> RELOC_STD_BITS_LENGTH_SH_BIG); - } - else - { - *r_index = ((rel->r_index[2] << 16) - | (rel->r_index[1] << 8) - | rel->r_index[0]); - *r_extern = (0 != (rel->r_type[0] & RELOC_STD_BITS_EXTERN_LITTLE)); - r_pcrel_done = (0 != (rel->r_type[0] & RELOC_STD_BITS_PCREL_LITTLE)); - r_neg = (0 != (rel->r_type[0] & RELOC_ARM_BITS_NEG_LITTLE)); - r_length = ((rel->r_type[0] & RELOC_STD_BITS_LENGTH_LITTLE) - >> RELOC_STD_BITS_LENGTH_SH_LITTLE); - } - index = r_length + 4 * r_pcrel_done + 8 * r_neg; - if (index == 3) - *r_pcrel = 1; - - return MY(howto_table) + index; -} - -#define MY_reloc_howto(BFD, REL, IN, EX, PC) \ - MY(reloc_howto) (BFD, REL, &IN, &EX, &PC) - -void -MY(put_reloc)(abfd, r_extern, r_index, value, howto, reloc) - bfd *abfd; - int r_extern; - int r_index; - long value; - reloc_howto_type *howto; - struct reloc_std_external *reloc; -{ - unsigned int r_length; - int r_pcrel; - int r_neg; - - PUT_WORD (abfd, value, reloc->r_address); - r_length = howto->size ; /* Size as a power of two */ - - /* Special case for branch relocations. */ - if (howto->type == 3 || howto->type == 7) - r_length = 3; - - r_pcrel = howto->type & 4; /* PC Relative done? */ - r_neg = howto->type & 8; /* Negative relocation */ - if (bfd_header_big_endian (abfd)) - { - reloc->r_index[0] = r_index >> 16; - reloc->r_index[1] = r_index >> 8; - reloc->r_index[2] = r_index; - reloc->r_type[0] = - ((r_extern ? RELOC_STD_BITS_EXTERN_BIG : 0) - | (r_pcrel ? RELOC_STD_BITS_PCREL_BIG : 0) - | (r_neg ? RELOC_ARM_BITS_NEG_BIG : 0) - | (r_length << RELOC_STD_BITS_LENGTH_SH_BIG)); - } - else - { - reloc->r_index[2] = r_index >> 16; - reloc->r_index[1] = r_index >> 8; - reloc->r_index[0] = r_index; - reloc->r_type[0] = - ((r_extern ? RELOC_STD_BITS_EXTERN_LITTLE : 0) - | (r_pcrel ? RELOC_STD_BITS_PCREL_LITTLE : 0) - | (r_neg ? RELOC_ARM_BITS_NEG_LITTLE : 0) - | (r_length << RELOC_STD_BITS_LENGTH_SH_LITTLE)); - } -} - -#define MY_put_reloc(BFD, EXT, IDX, VAL, HOWTO, RELOC) \ - MY(put_reloc)(BFD, EXT, IDX, VAL, HOWTO, RELOC) - -void -MY(relocatable_reloc)(howto, abfd, reloc, amount, r_addr) - reloc_howto_type *howto; - bfd *abfd; - struct reloc_std_external *reloc; - bfd_vma *amount; - bfd_vma r_addr; -{ - if (howto->type == 3) - { - if (reloc->r_type[0] - & (bfd_header_big_endian (abfd) - ? RELOC_STD_BITS_EXTERN_BIG : RELOC_STD_BITS_EXTERN_LITTLE)) - { - /* The reloc is still external, so don't modify anything. */ - *amount = 0; - } - else - { - *amount -= r_addr; - /* Change the r_pcrel value -- on the ARM, this bit is set once the - relocation is done. */ - if (bfd_header_big_endian (abfd)) - reloc->r_type[0] |= RELOC_STD_BITS_PCREL_BIG; - else - reloc->r_type[0] |= RELOC_STD_BITS_PCREL_LITTLE; - } - } - else if (howto->type == 7) - *amount = 0; -} - -#define MY_relocatable_reloc(HOW, BFD, REL, AMOUNT, ADDR) \ - MY(relocatable_reloc)(HOW, BFD, REL, &(AMOUNT), ADDR) - -static bfd_reloc_status_type -MY(fix_pcrel_26_done) (abfd, reloc_entry, symbol, data, input_section, - output_bfd, error_message) - bfd *abfd; - arelent *reloc_entry; - asymbol *symbol; - PTR data; - asection *input_section; - bfd *output_bfd; - char **error_message; -{ - /* This is dead simple at present. */ - return bfd_reloc_ok; -} - -static bfd_reloc_status_type -MY(fix_pcrel_26) (abfd, reloc_entry, symbol, data, input_section, - output_bfd, error_message) - bfd *abfd; - arelent *reloc_entry; - asymbol *symbol; - PTR data; - asection *input_section; - bfd *output_bfd; - char **error_message; -{ - bfd_vma relocation; - bfd_size_type addr = reloc_entry->address; - long target = bfd_get_32 (abfd, (bfd_byte *) data + addr); - bfd_reloc_status_type flag = bfd_reloc_ok; - - /* If this is an undefined symbol, return error */ - if (symbol->section == &bfd_und_section - && (symbol->flags & BSF_WEAK) == 0) - return output_bfd ? bfd_reloc_ok : bfd_reloc_undefined; - - /* If the sections are different, and we are doing a partial relocation, - just ignore it for now. */ - if (symbol->section->name != input_section->name - && output_bfd != (bfd *)NULL) - return bfd_reloc_ok; - - relocation = (target & 0x00ffffff) << 2; - relocation = (relocation ^ 0x02000000) - 0x02000000; /* Sign extend */ - relocation += symbol->value; - relocation += symbol->section->output_section->vma; - relocation += symbol->section->output_offset; - relocation += reloc_entry->addend; - relocation -= input_section->output_section->vma; - relocation -= input_section->output_offset; - relocation -= addr; - if (relocation & 3) - return bfd_reloc_overflow; - - /* Check for overflow */ - if (relocation & 0x02000000) - { - if ((relocation & ~0x03ffffff) != ~0x03ffffff) - flag = bfd_reloc_overflow; - } - else if (relocation & ~0x03ffffff) - flag = bfd_reloc_overflow; - - target &= ~0x00ffffff; - target |= (relocation >> 2) & 0x00ffffff; - bfd_put_32 (abfd, target, (bfd_byte *) data + addr); - - /* Now the ARM magic... Change the reloc type so that it is marked as done. - Strictly this is only necessary if we are doing a partial relocation. */ - reloc_entry->howto = &MY(howto_table)[7]; - - return flag; -} - -reloc_howto_type * -MY(bfd_reloc_type_lookup)(abfd,code) - bfd *abfd; - bfd_reloc_code_real_type code; -{ -#define ASTD(i,j) case i: return &MY(howto_table)[j] - if (code == BFD_RELOC_CTOR) - switch (bfd_get_arch_info (abfd)->bits_per_address) - { - case 32: - code = BFD_RELOC_32; - break; - default: return (CONST struct reloc_howto_struct *) 0; - } - - switch (code) - { - ASTD (BFD_RELOC_16, 1); - ASTD (BFD_RELOC_32, 2); - ASTD (BFD_RELOC_ARM_PCREL_BRANCH, 3); - ASTD (BFD_RELOC_8_PCREL, 4); - ASTD (BFD_RELOC_16_PCREL, 5); - ASTD (BFD_RELOC_32_PCREL, 6); - default: return (CONST struct reloc_howto_struct *) 0; - } -} - -#define MY_swap_std_reloc_in MY(swap_std_reloc_in) -#define MY_swap_std_reloc_out MY(swap_std_reloc_out) -#define MY_get_section_contents _bfd_generic_get_section_contents -/* #define MY_bfd_link_hash_table_create _bfd_generic_link_hash_table_create */ -/* #define MY_bfd_link_add_symbols _bfd_generic_link_add_symbols */ -/* #define MY_bfd_final_link _bfd_generic_final_link */ - -#include "aoutx.h" - -static void -MY_swap_std_reloc_in (abfd, bytes, cache_ptr, symbols, symcount) - bfd *abfd; - struct reloc_std_external *bytes; - arelent *cache_ptr; - asymbol **symbols; - bfd_size_type symcount; -{ - int r_index; - int r_extern; - unsigned int r_length; - int r_pcrel; - struct aoutdata *su = &(abfd->tdata.aout_data->a); - - cache_ptr->address = bfd_h_get_32 (abfd, bytes->r_address); - - cache_ptr->howto = MY_reloc_howto (abfd, bytes, r_index, r_extern, r_pcrel); - - MOVE_ADDRESS (0); -} - -void -MY_swap_std_reloc_out (abfd, g, natptr) - bfd *abfd; - arelent *g; - struct reloc_std_external *natptr; -{ - int r_index; - asymbol *sym = *(g->sym_ptr_ptr); - int r_extern; - int r_length; - int r_pcrel; - int r_neg = 0; /* Negative relocs use the BASEREL bit. */ - asection *output_section = sym->section->output_section; - - PUT_WORD(abfd, g->address, natptr->r_address); - - r_length = g->howto->size ; /* Size as a power of two */ - if (r_length < 0) - { - r_length = -r_length; - r_neg = 1; - } - - r_pcrel = (int) g->howto->pc_relative; /* Relative to PC? */ - - /* For RISC iX, in pc-relative relocs the r_pcrel bit means that the - relocation has been done already (Only for the 26-bit one I think)???!!! - */ - - if (g->howto->type == 3) - { - r_length = 3; - r_pcrel = 0; - } - else if (g->howto->type == 7) - { - r_length = 3; - r_pcrel = 1; - } - - -#if 0 - /* For a standard reloc, the addend is in the object file. */ - r_addend = g->addend + (*(g->sym_ptr_ptr))->section->output_section->vma; -#endif - - /* name was clobbered by aout_write_syms to be symbol index */ - - /* If this relocation is relative to a symbol then set the - r_index to the symbols index, and the r_extern bit. - - Absolute symbols can come in in two ways, either as an offset - from the abs section, or as a symbol which has an abs value. - check for that here - */ - - if (bfd_is_com_section (output_section) - || output_section == &bfd_abs_section - || output_section == &bfd_und_section) - { - if (bfd_abs_section.symbol == sym) - { - /* Whoops, looked like an abs symbol, but is really an offset - from the abs section */ - r_index = 0; - r_extern = 0; - } - else - { - /* Fill in symbol */ - r_extern = 1; - r_index = (*(g->sym_ptr_ptr))->KEEPIT; - } - } - else - { - /* Just an ordinary section */ - r_extern = 0; - r_index = output_section->target_index; - } - - /* now the fun stuff */ - if (bfd_header_big_endian (abfd)) - { - natptr->r_index[0] = r_index >> 16; - natptr->r_index[1] = r_index >> 8; - natptr->r_index[2] = r_index; - natptr->r_type[0] = - ( (r_extern ? RELOC_STD_BITS_EXTERN_BIG: 0) - | (r_pcrel ? RELOC_STD_BITS_PCREL_BIG: 0) - | (r_neg ? RELOC_ARM_BITS_NEG_BIG: 0) - | (r_length << RELOC_STD_BITS_LENGTH_SH_BIG)); - } - else - { - natptr->r_index[2] = r_index >> 16; - natptr->r_index[1] = r_index >> 8; - natptr->r_index[0] = r_index; - natptr->r_type[0] = - ( (r_extern ? RELOC_STD_BITS_EXTERN_LITTLE: 0) - | (r_pcrel ? RELOC_STD_BITS_PCREL_LITTLE: 0) - | (r_neg ? RELOC_ARM_BITS_NEG_LITTLE: 0) - | (r_length << RELOC_STD_BITS_LENGTH_SH_LITTLE)); - } -} - -#define MY_BFD_TARGET - -#include "aout-target.h" - -const bfd_target aout_arm_little_vec = -{ - "a.out-arm-little", /* name */ - bfd_target_aout_flavour, - BFD_ENDIAN_LITTLE, /* target byte order (little) */ - BFD_ENDIAN_LITTLE, /* target headers byte order (little) */ - (HAS_RELOC | EXEC_P | /* object flags */ - HAS_LINENO | HAS_DEBUG | - HAS_SYMS | HAS_LOCALS | DYNAMIC | WP_TEXT | D_PAGED), - (SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD | SEC_RELOC), /* section flags */ - MY_symbol_leading_char, - AR_PAD_CHAR, /* ar_pad_char */ - 15, /* ar_max_namelen */ - bfd_getl64, bfd_getl_signed_64, bfd_putl64, - bfd_getl32, bfd_getl_signed_32, bfd_putl32, - bfd_getl16, bfd_getl_signed_16, bfd_putl16, /* data */ - bfd_getl64, bfd_getl_signed_64, bfd_putl64, - bfd_getl32, bfd_getl_signed_32, bfd_putl32, - bfd_getl16, bfd_getl_signed_16, bfd_putl16, /* hdrs */ - {_bfd_dummy_target, MY_object_p, /* bfd_check_format */ - bfd_generic_archive_p, MY_core_file_p}, - {bfd_false, MY_mkobject, /* bfd_set_format */ - _bfd_generic_mkarchive, bfd_false}, - {bfd_false, MY_write_object_contents, /* bfd_write_contents */ - _bfd_write_archive_contents, bfd_false}, - - BFD_JUMP_TABLE_GENERIC (MY), - BFD_JUMP_TABLE_COPY (MY), - BFD_JUMP_TABLE_CORE (MY), - BFD_JUMP_TABLE_ARCHIVE (MY), - BFD_JUMP_TABLE_SYMBOLS (MY), - BFD_JUMP_TABLE_RELOCS (MY), - BFD_JUMP_TABLE_WRITE (MY), - BFD_JUMP_TABLE_LINK (MY), - BFD_JUMP_TABLE_DYNAMIC (MY), - - (PTR) MY_backend_data, -}; - -const bfd_target aout_arm_big_vec = -{ - "a.out-arm-big", /* name */ - bfd_target_aout_flavour, - BFD_ENDIAN_BIG, /* target byte order (big) */ - BFD_ENDIAN_BIG, /* target headers byte order (big) */ - (HAS_RELOC | EXEC_P | /* object flags */ - HAS_LINENO | HAS_DEBUG | - HAS_SYMS | HAS_LOCALS | DYNAMIC | WP_TEXT | D_PAGED), - (SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD | SEC_RELOC), /* section flags */ - MY_symbol_leading_char, - AR_PAD_CHAR, /* ar_pad_char */ - 15, /* ar_max_namelen */ - bfd_getb64, bfd_getb_signed_64, bfd_putb64, - bfd_getb32, bfd_getb_signed_32, bfd_putb32, - bfd_getb16, bfd_getb_signed_16, bfd_putb16, /* data */ - bfd_getb64, bfd_getb_signed_64, bfd_putb64, - bfd_getb32, bfd_getb_signed_32, bfd_putb32, - bfd_getb16, bfd_getb_signed_16, bfd_putb16, /* hdrs */ - {_bfd_dummy_target, MY_object_p, /* bfd_check_format */ - bfd_generic_archive_p, MY_core_file_p}, - {bfd_false, MY_mkobject, /* bfd_set_format */ - _bfd_generic_mkarchive, bfd_false}, - {bfd_false, MY_write_object_contents, /* bfd_write_contents */ - _bfd_write_archive_contents, bfd_false}, - - BFD_JUMP_TABLE_GENERIC (MY), - BFD_JUMP_TABLE_COPY (MY), - BFD_JUMP_TABLE_CORE (MY), - BFD_JUMP_TABLE_ARCHIVE (MY), - BFD_JUMP_TABLE_SYMBOLS (MY), - BFD_JUMP_TABLE_RELOCS (MY), - BFD_JUMP_TABLE_WRITE (MY), - BFD_JUMP_TABLE_LINK (MY), - BFD_JUMP_TABLE_DYNAMIC (MY), - - (PTR) MY_backend_data, -}; diff --git a/contrib/gdb/bfd/aout-encap.c b/contrib/gdb/bfd/aout-encap.c deleted file mode 100644 index c25f9037dce00..0000000000000 --- a/contrib/gdb/bfd/aout-encap.c +++ /dev/null @@ -1,236 +0,0 @@ -/* BFD back-end for a.out files encapsulated with COFF headers. - Copyright (C) 1990, 1991 Free Software Foundation, Inc. - -This file is part of BFD, the Binary File Descriptor library. - -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 2 of the License, 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ - -/* THIS MODULE IS NOT FINISHED. IT PROBABLY DOESN'T EVEN COMPILE. */ - -#if 0 -#define TARGET_PAGE_SIZE 4096 -#define SEGMENT_SIZE TARGET_PAGE_SIZE -#define TEXT_START_ADDR 0 -#define BYTES_IN_WORD 4 -#endif - -#include "bfd.h" -#include <sysdep.h> -#include "libbfd.h" -#include <aout/aout64.h> -#include "aout/stab_gnu.h" -#include "aout/ar.h" -#include "libaout.h" /* BFD a.out internal data structures */ - -const bfd_target *encap_real_callback (); - -const bfd_target * -encap_object_p (abfd) - bfd *abfd; -{ - unsigned char magicbuf[4]; /* Raw bytes of magic number from file */ - unsigned long magic; /* Swapped magic number */ - short coff_magic; - struct external_exec exec_bytes; - struct internal_exec exec; - - if (bfd_read ((PTR)magicbuf, 1, sizeof (magicbuf), abfd) != - sizeof (magicbuf)) - { - if (bfd_get_error () != bfd_error_system_call) - bfd_set_error (bfd_error_wrong_format); - return 0; - } - - coff_magic = bfd_h_get_16 (abfd, magicbuf); - if (coff_magic != COFF_MAGIC) - return 0; /* Not an encap coff file */ - - __header_offset_temp==COFF_MAGIC ? sizeof(struct coffheader) : 0) - (fseek ((f), HEADER_OFFSET((f)), 1)) - - magic = bfd_h_get_32 (abfd, magicbuf); - - if (N_BADMAG (*((struct internal_exec *) &magic))) return 0; - - struct external_exec exec_bytes; - if (bfd_read ((PTR) &exec_bytes, 1, EXEC_BYTES_SIZE, abfd) - != EXEC_BYTES_SIZE) { - if (bfd_get_error () != bfd_error_system_call) - bfd_set_error (bfd_error_wrong_format); - return 0; - } - NAME(aout,swap_exec_header_in)(abfd, &exec_bytes, &exec); - - return aout_32_some_aout_object_p (abfd, &exec, encap_realcallback); -} - -/* Finish up the reading of a encapsulated-coff a.out file header */ -const bfd_target * -encap_real_callback (abfd) - bfd *abfd; -{ - struct internal_exec *execp = exec_hdr (abfd); - - MY(callback)(abfd, execp); - - /* If we have a coff header, it can give us better values for - text_start and exec_data_start. This is particularly useful - for remote debugging of embedded systems. */ - if (N_FLAGS(exec_aouthdr) & N_FLAGS_COFF_ENCAPSULATE) - { - struct coffheader ch; - int val; - val = lseek (execchan, -(sizeof (AOUTHDR) + sizeof (ch)), 1); - if (val == -1) - perror_with_name (filename); - val = myread (execchan, &ch, sizeof (ch)); - if (val < 0) - perror_with_name (filename); - text_start = ch.text_start; - exec_data_start = ch.data_start; - } else - { - text_start = - IS_OBJECT_FILE (exec_aouthdr) ? 0 : N_TXTADDR (exec_aouthdr); - exec_data_start = IS_OBJECT_FILE (exec_aouthdr) - ? exec_aouthdr.a_text : N_DATADDR (exec_aouthdr); - } - - /* Determine the architecture and machine type of the object file. */ - bfd_default_set_arch_mach(abfd, bfd_arch_m68k, 0); /* FIXME */ - - return abfd->xvec; -} - -/* Write an object file in Encapsulated COFF format. - Section contents have already been written. We write the - file header, symbols, and relocation. */ - -boolean -encap_write_object_contents (abfd) - bfd *abfd; -{ - bfd_size_type data_pad = 0; - struct external_exec exec_bytes; - struct internal_exec *execp = exec_hdr (abfd); - -/****** FIXME: Fragments from the old GNU LD program for dealing with - encap coff. */ -struct coffheader coffheader; -int need_coff_header; - - /* Determine whether to count the header as part of - the text size, and initialize the text size accordingly. - This depends on the kind of system and on the output format selected. */ - - N_SET_MAGIC (outheader, magic); -#ifdef INITIALIZE_HEADER - INITIALIZE_HEADER; -#endif - - text_size = sizeof (struct exec); -#ifdef COFF_ENCAPSULATE - if (relocatable_output == 0 && file_table[0].just_syms_flag == 0) - { - need_coff_header = 1; - /* set this flag now, since it will change the values of N_TXTOFF, etc */ - N_SET_FLAGS (outheader, aout_backend_info (abfd)->exec_hdr_flags); - text_size += sizeof (struct coffheader); - } -#endif - -#ifdef COFF_ENCAPSULATE - if (need_coff_header) - { - /* We are encapsulating BSD format within COFF format. */ - struct coffscn *tp, *dp, *bp; - - tp = &coffheader.scns[0]; - dp = &coffheader.scns[1]; - bp = &coffheader.scns[2]; - - strcpy (tp->s_name, ".text"); - tp->s_paddr = text_start; - tp->s_vaddr = text_start; - tp->s_size = text_size; - tp->s_scnptr = sizeof (struct coffheader) + sizeof (struct exec); - tp->s_relptr = 0; - tp->s_lnnoptr = 0; - tp->s_nreloc = 0; - tp->s_nlnno = 0; - tp->s_flags = 0x20; - strcpy (dp->s_name, ".data"); - dp->s_paddr = data_start; - dp->s_vaddr = data_start; - dp->s_size = data_size; - dp->s_scnptr = tp->s_scnptr + tp->s_size; - dp->s_relptr = 0; - dp->s_lnnoptr = 0; - dp->s_nreloc = 0; - dp->s_nlnno = 0; - dp->s_flags = 0x40; - strcpy (bp->s_name, ".bss"); - bp->s_paddr = dp->s_vaddr + dp->s_size; - bp->s_vaddr = bp->s_paddr; - bp->s_size = bss_size; - bp->s_scnptr = 0; - bp->s_relptr = 0; - bp->s_lnnoptr = 0; - bp->s_nreloc = 0; - bp->s_nlnno = 0; - bp->s_flags = 0x80; - - coffheader.f_magic = COFF_MAGIC; - coffheader.f_nscns = 3; - /* store an unlikely time so programs can - * tell that there is a bsd header - */ - coffheader.f_timdat = 1; - coffheader.f_symptr = 0; - coffheader.f_nsyms = 0; - coffheader.f_opthdr = 28; - coffheader.f_flags = 0x103; - /* aouthdr */ - coffheader.magic = ZMAGIC; - coffheader.vstamp = 0; - coffheader.tsize = tp->s_size; - coffheader.dsize = dp->s_size; - coffheader.bsize = bp->s_size; - coffheader.entry = outheader.a_entry; - coffheader.text_start = tp->s_vaddr; - coffheader.data_start = dp->s_vaddr; - } -#endif - -#ifdef COFF_ENCAPSULATE - if (need_coff_header) - mywrite (&coffheader, sizeof coffheader, 1, outdesc); -#endif - -#ifndef COFF_ENCAPSULATE - padfile (N_TXTOFF (outheader) - sizeof outheader, outdesc); -#endif - - text_size -= N_TXTOFF (outheader); - WRITE_HEADERS(abfd, execp); - return true; -} - -#define MY_write_object_content encap_write_object_contents -#define MY_object_p encap_object_p -#define MY_exec_hdr_flags N_FLAGS_COFF_ENCAPSULATE - -#include "aout-target.h" diff --git a/contrib/gdb/bfd/aout-ns32k.c b/contrib/gdb/bfd/aout-ns32k.c deleted file mode 100644 index 269e053fe5ac7..0000000000000 --- a/contrib/gdb/bfd/aout-ns32k.c +++ /dev/null @@ -1,399 +0,0 @@ -/* BFD back-end for ns32k a.out-ish binaries. - Copyright (C) 1990, 1991, 1992, 1994, 1995 Free Software Foundation, Inc. - Contributed by Ian Dall (idall@eleceng.adelaide.edu.au). - -This file is part of BFD, the Binary File Descriptor library. - -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 2 of the License, 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ - -#define BYTES_IN_WORD 4 - -#include "bfd.h" -#include "aout/aout64.h" - -#define MYNS(OP) CAT(ns32kaout_,OP) -reloc_howto_type * -MYNS(bfd_reloc_type_lookup) - PARAMS((bfd *abfd AND - bfd_reloc_code_real_type code)); - -boolean -MYNS(write_object_contents) - PARAMS((bfd *abfd)); - -/* Avoid multiple definitions from aoutx if supporting standard a.out format(s) - * as well as this one - */ -#define NAME(x,y) CAT3(ns32kaout,_32_,y) - -void bfd_ns32k_arch PARAMS ((void)); -long ns32k_get_displacement PARAMS ((bfd_byte *buffer, long offset, long size)); -int ns32k_put_displacement PARAMS ((long value, bfd_byte *buffer, long offset, long size)); -long ns32k_get_immediate PARAMS ((bfd_byte *buffer, long offset, long size)); -int ns32k_put_immediate PARAMS ((long value, bfd_byte *buffer, long offset, long size)); -bfd_reloc_status_type - ns32k_reloc_disp PARAMS ((bfd *abfd, arelent *reloc_entry, - struct symbol_cache_entry *symbol, - PTR data, - asection *input_section, - bfd *output_bfd, - char **error_message)); -bfd_reloc_status_type - ns32k_reloc_imm PARAMS ((bfd *abfd, - arelent *reloc_entry, - struct symbol_cache_entry *symbol, - PTR data, - asection *input_section, - bfd *output_bfd, - char **error_message)); -bfd_reloc_status_type - ns32k_final_link_relocate PARAMS ((reloc_howto_type *howto, - bfd *input_bfd, - asection *input_section, - bfd_byte *contents, - bfd_vma address, - bfd_vma value, - bfd_vma addend )); -bfd_reloc_status_type - ns32k_relocate_contents PARAMS ((reloc_howto_type *howto, - bfd *input_bfd, - bfd_vma relocation, - bfd_byte *location)); - -#include "libaout.h" - -#define MY(OP) MYNS(OP) - -#define MY_swap_std_reloc_in MY(swap_std_reloc_in) -#define MY_swap_std_reloc_out MY(swap_std_reloc_out) - -static void -MY_swap_std_reloc_in PARAMS ((bfd *abfd, struct reloc_std_external *bytes, - arelent *cache_ptr, asymbol **symbols, - bfd_size_type symcount)); - -static void -MY_swap_std_reloc_out PARAMS ((bfd *abfd, arelent *g, - struct reloc_std_external *natptr)); - -/* The ns32k series is ah, unusual, when it comes to relocation. - * There are three storage methods for relocateable objects. There - * are displacements, immediate operands and ordinary twos complement - * data. Of these, only the last fits into the standard relocation - * scheme. Immediate operands are stored huffman encoded and - * immediate operands are stored big endian (where as the natural byte - * order is little endian for this achitecture). - - * Note that the ns32k displacement storage method is orthogonal to - * whether the relocation is pc relative or not. The "displacement" - * storage scheme is used for essentially all address constants. The - * displacement can be relative to zero (absolute displacement), - * relative to the pc (pc relative), the stack pointer, the frame - * pointer, the static base register and general purpose register etc. - - * For example: - * - * sym1: .long . # pc relative 2's complement - * sym1: .long foo # 2's complement not pc relative - * - * self: movd @self, r0 # pc relative displacement - * movd foo, r0 # non pc relative displacement - * - * self: movd self, r0 # pc relative immediate - * movd foo, r0 # non pc relative immediate - * - * In addition, for historical reasons the encoding of the relocation types - * in the a.out format relocation entries is such that even the relocation - * methods which are standard are not encoded the standard way. - * - */ - -reloc_howto_type MY(howto_table)[] = -{ -/* ns32k immediate operands */ -HOWTO(BFD_RELOC_NS32K_IMM_8, 0, 0, 8, false, 0, true, - ns32k_reloc_imm, "NS32K_IMM_8", - true, 0x000000ff,0x000000ff, false), -HOWTO(BFD_RELOC_NS32K_IMM_16, 0, 1, 16, false, 0, true, - ns32k_reloc_imm, "NS32K_IMM_16", - true, 0x0000ffff,0x0000ffff, false), -HOWTO(BFD_RELOC_NS32K_IMM_32, 0, 2, 32, false, 0, true, - ns32k_reloc_imm, "NS32K_IMM_32", - true, 0xffffffff,0xffffffff, false), -HOWTO(BFD_RELOC_NS32K_IMM_8_PCREL, 0, 0, 8, true, 0, false, - ns32k_reloc_imm, "PCREL_NS32K_IMM_8", - true, 0x000000ff, 0x000000ff, false), -HOWTO(BFD_RELOC_NS32K_IMM_16_PCREL, 0, 1, 16, true, 0, false, - ns32k_reloc_imm, "PCREL_NS32K_IMM_16", - true, 0x0000ffff,0x0000ffff, false), -HOWTO(BFD_RELOC_NS32K_IMM_32_PCREL, 0, 2, 32, true, 0, false, - ns32k_reloc_imm, "PCREL_NS32K_IMM_32", - true, 0xffffffff,0xffffffff, false), - -/* ns32k displacements */ -HOWTO(BFD_RELOC_NS32K_DISP_8, 0, 0, 8, false, 0, true, - ns32k_reloc_disp, "NS32K_DISP_8", - true, 0x000000ff,0x000000ff, false), -HOWTO(BFD_RELOC_NS32K_DISP_16, 0, 1, 16, false, 0, true, - ns32k_reloc_disp, "NS32K_DISP_16", - true, 0x0000ffff, 0x0000ffff, false), -HOWTO(BFD_RELOC_NS32K_DISP_32, 0, 2, 32, false, 0, true, - ns32k_reloc_disp, "NS32K_DISP_32", - true, 0xffffffff, 0xffffffff, false), -HOWTO(BFD_RELOC_NS32K_DISP_8_PCREL, 0, 0, 8, true, 0, false, - ns32k_reloc_disp, "PCREL_NS32K_DISP_8", - true, 0x000000ff,0x000000ff, false), -HOWTO(BFD_RELOC_NS32K_DISP_16_PCREL, 0, 1, 16, true, 0, false, - ns32k_reloc_disp, "PCREL_NS32K_DISP_16", - true, 0x0000ffff,0x0000ffff, false), -HOWTO(BFD_RELOC_NS32K_DISP_32_PCREL, 0, 2, 32, true, 0, false, - ns32k_reloc_disp, "PCREL_NS32K_DISP_32", - true, 0xffffffff,0xffffffff, false), - -/* Normal 2's complement */ -HOWTO(BFD_RELOC_8, 0, 0, 8, false, 0, complain_overflow_bitfield,0, - "8", true, 0x000000ff,0x000000ff, false), -HOWTO(BFD_RELOC_16, 0, 1, 16, false, 0, complain_overflow_bitfield,0, - "16", true, 0x0000ffff,0x0000ffff, false), -HOWTO(BFD_RELOC_32, 0, 2, 32, false, 0, complain_overflow_bitfield,0, - "32", true, 0xffffffff,0xffffffff, false), -HOWTO(BFD_RELOC_8_PCREL, 0, 0, 8, true, 0, complain_overflow_signed, 0, - "PCREL_8", true, 0x000000ff,0x000000ff, false), -HOWTO(BFD_RELOC_16_PCREL, 0, 1, 16, true, 0, complain_overflow_signed, 0, - "PCREL_16", true, 0x0000ffff,0x0000ffff, false), -HOWTO(BFD_RELOC_32_PCREL, 0, 2, 32, true, 0, complain_overflow_signed, 0, - "PCREL_32", true, 0xffffffff,0xffffffff, false), -}; - - -#define CTOR_TABLE_RELOC_HOWTO(BFD) (MY(howto_table) + 14) - -#define RELOC_STD_BITS_NS32K_TYPE_BIG 0x06 -#define RELOC_STD_BITS_NS32K_TYPE_LITTLE 0x60 -#define RELOC_STD_BITS_NS32K_TYPE_SH_BIG 1 -#define RELOC_STD_BITS_NS32K_TYPE_SH_LITTLE 5 - -reloc_howto_type * -MY(reloc_howto)(abfd, rel, r_index, r_extern, r_pcrel) - bfd *abfd; - struct reloc_std_external *rel; - int *r_index; - int *r_extern; - int *r_pcrel; -{ - unsigned int r_length; - int r_ns32k_type; -/* BFD_ASSERT(bfd_header_little_endian (abfd)); */ - *r_index = ((rel->r_index[2] << 16) - | (rel->r_index[1] << 8) - | rel->r_index[0] ); - *r_extern = (0 != (rel->r_type[0] & RELOC_STD_BITS_EXTERN_LITTLE)); - *r_pcrel = (0 != (rel->r_type[0] & RELOC_STD_BITS_PCREL_LITTLE)); - r_length = ((rel->r_type[0] & RELOC_STD_BITS_LENGTH_LITTLE) - >> RELOC_STD_BITS_LENGTH_SH_LITTLE); - r_ns32k_type = ((rel->r_type[0] & RELOC_STD_BITS_NS32K_TYPE_LITTLE) - >> RELOC_STD_BITS_NS32K_TYPE_SH_LITTLE); - return (MY(howto_table) + r_length + 3 * (*r_pcrel) + 6 * r_ns32k_type); -} - -#define MY_reloc_howto(BFD,REL,IN,EX,PC) MY(reloc_howto)(BFD, REL, &IN, &EX, &PC) - -void -MY(put_reloc)(abfd, r_extern, r_index, value, howto, reloc) - bfd *abfd; - int r_extern; - int r_index; - long value; - reloc_howto_type *howto; - struct reloc_std_external *reloc; -{ - unsigned int r_length; - int r_pcrel; - int r_ns32k_type; - PUT_WORD (abfd, value, reloc->r_address); - r_length = howto->size ; /* Size as a power of two */ - r_pcrel = (int) howto->pc_relative; /* Relative to PC? */ - r_ns32k_type = (howto - MY(howto_table) )/6; -/* BFD_ASSERT (bfd_header_little_endian (abfd)); */ - reloc->r_index[2] = r_index >> 16; - reloc->r_index[1] = r_index >> 8; - reloc->r_index[0] = r_index; - reloc->r_type[0] = - (r_extern? RELOC_STD_BITS_EXTERN_LITTLE: 0) - | (r_pcrel? RELOC_STD_BITS_PCREL_LITTLE: 0) - | (r_length << RELOC_STD_BITS_LENGTH_SH_LITTLE) - | (r_ns32k_type << RELOC_STD_BITS_NS32K_TYPE_SH_LITTLE); -} - -#define MY_put_reloc(BFD, EXT, IDX, VAL, HOWTO, RELOC) \ - MY(put_reloc)(BFD, EXT, IDX, VAL, HOWTO, RELOC) - -#define STAT_FOR_EXEC - -#define MY_final_link_relocate ns32k_final_link_relocate -#define MY_relocate_contents ns32k_relocate_contents - -#include <aoutx.h> - -reloc_howto_type * - MY(bfd_reloc_type_lookup)(abfd,code) - bfd *abfd; - bfd_reloc_code_real_type code; -{ - -#define ENTRY(i,j) case i: return &MY(howto_table)[j] - - int ext = obj_reloc_entry_size (abfd) == RELOC_EXT_SIZE; - - BFD_ASSERT(ext == 0); - if (code == BFD_RELOC_CTOR) - switch (bfd_get_arch_info (abfd)->bits_per_address) - { - case 32: - code = BFD_RELOC_32; - break; - } - switch (code) - { - ENTRY(BFD_RELOC_NS32K_IMM_8, 0); - ENTRY(BFD_RELOC_NS32K_IMM_16, 1); - ENTRY(BFD_RELOC_NS32K_IMM_32, 2); - ENTRY(BFD_RELOC_NS32K_IMM_8_PCREL, 3); - ENTRY(BFD_RELOC_NS32K_IMM_16_PCREL, 4); - ENTRY(BFD_RELOC_NS32K_IMM_32_PCREL, 5); - ENTRY(BFD_RELOC_NS32K_DISP_8, 6); - ENTRY(BFD_RELOC_NS32K_DISP_16, 7); - ENTRY(BFD_RELOC_NS32K_DISP_32, 8); - ENTRY(BFD_RELOC_NS32K_DISP_8_PCREL, 9); - ENTRY(BFD_RELOC_NS32K_DISP_16_PCREL, 10); - ENTRY(BFD_RELOC_NS32K_DISP_32_PCREL, 11); - ENTRY(BFD_RELOC_8, 12); - ENTRY(BFD_RELOC_16, 13); - ENTRY(BFD_RELOC_32, 14); - ENTRY(BFD_RELOC_8_PCREL, 15); - ENTRY(BFD_RELOC_16_PCREL, 16); - ENTRY(BFD_RELOC_32_PCREL, 17); - default: return (reloc_howto_type *) NULL; - } -#undef ENTRY -} - - -static void -MY_swap_std_reloc_in (abfd, bytes, cache_ptr, symbols, symcount) - bfd *abfd; - struct reloc_std_external *bytes; - arelent *cache_ptr; - asymbol **symbols; - bfd_size_type symcount; -{ - int r_index; - int r_extern; - int r_pcrel; - struct aoutdata *su = &(abfd->tdata.aout_data->a); - - cache_ptr->address = bfd_h_get_32 (abfd, bytes->r_address); - - /* now the fun stuff */ - - cache_ptr->howto = MY_reloc_howto(abfd, bytes, r_index, r_extern, r_pcrel); - - MOVE_ADDRESS(0); -} - -static void -MY_swap_std_reloc_out (abfd, g, natptr) - bfd *abfd; - arelent *g; - struct reloc_std_external *natptr; -{ - int r_index; - asymbol *sym = *(g->sym_ptr_ptr); - int r_extern; - unsigned int r_addend; - asection *output_section = sym->section->output_section; - - r_addend = g->addend + (*(g->sym_ptr_ptr))->section->output_section->vma; - - /* name was clobbered by aout_write_syms to be symbol index */ - - /* If this relocation is relative to a symbol then set the - r_index to the symbols index, and the r_extern bit. - - Absolute symbols can come in in two ways, either as an offset - from the abs section, or as a symbol which has an abs value. - Check for that here. */ - - if (bfd_is_com_section (output_section) - || output_section == &bfd_abs_section - || output_section == &bfd_und_section) - { - if (bfd_abs_section.symbol == sym) - { - /* Whoops, looked like an abs symbol, but is really an offset - from the abs section */ - r_index = 0; - r_extern = 0; - } - else - { - /* Fill in symbol */ - r_extern = 1; -#undef KEEPIT -#define KEEPIT udata.i - r_index = (*(g->sym_ptr_ptr))->KEEPIT; -#undef KEEPIT - } - } - else - { - /* Just an ordinary section */ - r_extern = 0; - r_index = output_section->target_index; - } - - MY_put_reloc (abfd, r_extern, r_index, g->address, g->howto, natptr); -} - -bfd_reloc_status_type -ns32k_relocate_contents (howto, input_bfd, relocation, location) - reloc_howto_type *howto; - bfd *input_bfd; - bfd_vma relocation; - bfd_byte *location; -{ - int r_ns32k_type = (howto - MY(howto_table)) / 6; - long (*get_data)(); - int (*put_data)(); - - switch (r_ns32k_type) - { - case 0: - get_data = ns32k_get_immediate; - put_data = ns32k_put_immediate; - break; - case 1: - get_data = ns32k_get_displacement; - put_data = ns32k_put_displacement; - break; - case 2: - return _bfd_relocate_contents (howto, input_bfd, relocation, - location); - /* NOT REACHED */ - break; - } - return do_ns32k_reloc_contents (howto, input_bfd, relocation, - location, get_data, put_data); -} diff --git a/contrib/gdb/bfd/aout-target.h b/contrib/gdb/bfd/aout-target.h deleted file mode 100644 index 6711a714a5715..0000000000000 --- a/contrib/gdb/bfd/aout-target.h +++ /dev/null @@ -1,607 +0,0 @@ -/* Define a target vector and some small routines for a variant of a.out. - Copyright (C) 1990, 91, 92, 93, 94, 95, 1996 Free Software Foundation, Inc. - -This file is part of BFD, the Binary File Descriptor library. - -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 2 of the License, 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ - -#include "aout/aout64.h" -#include "aout/stab_gnu.h" -#include "aout/ar.h" -/*#include "libaout.h"*/ - -extern reloc_howto_type * NAME(aout,reloc_type_lookup) (); - -/* Set parameters about this a.out file that are machine-dependent. - This routine is called from some_aout_object_p just before it returns. */ -#ifndef MY_callback -static const bfd_target * -MY(callback) (abfd) - bfd *abfd; -{ - struct internal_exec *execp = exec_hdr (abfd); - unsigned int arch_align_power; - unsigned long arch_align; - - /* Calculate the file positions of the parts of a newly read aout header */ - obj_textsec (abfd)->_raw_size = N_TXTSIZE(*execp); - - /* The virtual memory addresses of the sections */ - obj_textsec (abfd)->vma = N_TXTADDR(*execp); - obj_datasec (abfd)->vma = N_DATADDR(*execp); - obj_bsssec (abfd)->vma = N_BSSADDR(*execp); - - obj_textsec (abfd)->lma = obj_textsec (abfd)->vma; - obj_datasec (abfd)->lma = obj_datasec (abfd)->vma; - obj_bsssec (abfd)->lma = obj_bsssec (abfd)->vma; - - /* The file offsets of the sections */ - obj_textsec (abfd)->filepos = N_TXTOFF (*execp); - obj_datasec (abfd)->filepos = N_DATOFF (*execp); - - /* The file offsets of the relocation info */ - obj_textsec (abfd)->rel_filepos = N_TRELOFF(*execp); - obj_datasec (abfd)->rel_filepos = N_DRELOFF(*execp); - - /* The file offsets of the string table and symbol table. */ - obj_sym_filepos (abfd) = N_SYMOFF (*execp); - obj_str_filepos (abfd) = N_STROFF (*execp); - - /* Determine the architecture and machine type of the object file. */ -#ifdef SET_ARCH_MACH - SET_ARCH_MACH(abfd, *execp); -#else - bfd_default_set_arch_mach(abfd, DEFAULT_ARCH, 0); -#endif - - /* Now that we know the architecture, set the alignments of the - sections. This is normally done by NAME(aout,new_section_hook), - but when the initial sections were created the architecture had - not yet been set. However, for backward compatibility, we don't - set the alignment power any higher than as required by the size - of the section. */ - arch_align_power = bfd_get_arch_info (abfd)->section_align_power; - arch_align = 1 << arch_align_power; - if ((BFD_ALIGN (obj_textsec (abfd)->_raw_size, arch_align) - == obj_textsec (abfd)->_raw_size) - && (BFD_ALIGN (obj_datasec (abfd)->_raw_size, arch_align) - == obj_datasec (abfd)->_raw_size) - && (BFD_ALIGN (obj_bsssec (abfd)->_raw_size, arch_align) - == obj_bsssec (abfd)->_raw_size)) - { - obj_textsec (abfd)->alignment_power = arch_align_power; - obj_datasec (abfd)->alignment_power = arch_align_power; - obj_bsssec (abfd)->alignment_power = arch_align_power; - } - - /* Don't set sizes now -- can't be sure until we know arch & mach. - Sizes get set in set_sizes callback, later. */ -#if 0 - adata(abfd).page_size = TARGET_PAGE_SIZE; -#ifdef SEGMENT_SIZE - adata(abfd).segment_size = SEGMENT_SIZE; -#else - adata(abfd).segment_size = TARGET_PAGE_SIZE; -#endif - adata(abfd).exec_bytes_size = EXEC_BYTES_SIZE; -#endif - - return abfd->xvec; -} -#endif - -#ifndef MY_object_p -/* Finish up the reading of an a.out file header */ - -static const bfd_target * -MY(object_p) (abfd) - bfd *abfd; -{ - struct external_exec exec_bytes; /* Raw exec header from file */ - struct internal_exec exec; /* Cleaned-up exec header */ - const bfd_target *target; - - if (bfd_read ((PTR) &exec_bytes, 1, EXEC_BYTES_SIZE, abfd) - != EXEC_BYTES_SIZE) { - if (bfd_get_error () != bfd_error_system_call) - bfd_set_error (bfd_error_wrong_format); - return 0; - } - -#ifdef SWAP_MAGIC - exec.a_info = SWAP_MAGIC (exec_bytes.e_info); -#else - exec.a_info = bfd_h_get_32 (abfd, exec_bytes.e_info); -#endif /* SWAP_MAGIC */ - - if (N_BADMAG (exec)) return 0; -#ifdef MACHTYPE_OK - if (!(MACHTYPE_OK (N_MACHTYPE (exec)))) return 0; -#endif - - NAME(aout,swap_exec_header_in)(abfd, &exec_bytes, &exec); - -#ifdef SWAP_MAGIC - /* swap_exec_header_in read in a_info with the wrong byte order */ - exec.a_info = SWAP_MAGIC (exec_bytes.e_info); -#endif /* SWAP_MAGIC */ - - target = NAME(aout,some_aout_object_p) (abfd, &exec, MY(callback)); - -#ifdef ENTRY_CAN_BE_ZERO - /* The NEWSOS3 entry-point is/was 0, which (amongst other lossage) - * means that it isn't obvious if EXEC_P should be set. - * All of the following must be true for an executable: - * There must be no relocations, the bfd can be neither an - * archive nor an archive element, and the file must be executable. */ - - if (exec.a_trsize + exec.a_drsize == 0 - && bfd_get_format(abfd) == bfd_object && abfd->my_archive == NULL) - { - struct stat buf; -#ifndef S_IXUSR -#define S_IXUSR 0100 /* Execute by owner. */ -#endif - if (stat(abfd->filename, &buf) == 0 && (buf.st_mode & S_IXUSR)) - abfd->flags |= EXEC_P; - } -#endif /* ENTRY_CAN_BE_ZERO */ - - return target; -} -#define MY_object_p MY(object_p) -#endif - - -#ifndef MY_mkobject -static boolean -MY(mkobject) (abfd) - bfd *abfd; -{ - if (NAME(aout,mkobject)(abfd) == false) - return false; -#if 0 /* Sizes get set in set_sizes callback, later, after we know - the architecture and machine. */ - adata(abfd).page_size = TARGET_PAGE_SIZE; -#ifdef SEGMENT_SIZE - adata(abfd).segment_size = SEGMENT_SIZE; -#else - adata(abfd).segment_size = TARGET_PAGE_SIZE; -#endif - adata(abfd).exec_bytes_size = EXEC_BYTES_SIZE; -#endif - return true; -} -#define MY_mkobject MY(mkobject) -#endif - -#ifndef MY_bfd_copy_private_section_data - -/* Copy private section data. This actually does nothing with the - sections. It copies the subformat field. We copy it here, because - we need to know whether this is a QMAGIC file before we set the - section contents, and copy_private_bfd_data is not called until - after the section contents have been set. */ - -/*ARGSUSED*/ -static boolean -MY_bfd_copy_private_section_data (ibfd, isec, obfd, osec) - bfd *ibfd; - asection *isec; - bfd *obfd; - asection *osec; -{ - if (bfd_get_flavour (obfd) == bfd_target_aout_flavour) - obj_aout_subformat (obfd) = obj_aout_subformat (ibfd); - return true; -} - -#endif - -/* Write an object file. - Section contents have already been written. We write the - file header, symbols, and relocation. */ - -#ifndef MY_write_object_contents -static boolean -MY(write_object_contents) (abfd) - bfd *abfd; -{ - struct external_exec exec_bytes; - struct internal_exec *execp = exec_hdr (abfd); - -#if CHOOSE_RELOC_SIZE - CHOOSE_RELOC_SIZE(abfd); -#else - obj_reloc_entry_size (abfd) = RELOC_STD_SIZE; -#endif - - WRITE_HEADERS(abfd, execp); - - return true; -} -#define MY_write_object_contents MY(write_object_contents) -#endif - -#ifndef MY_set_sizes -static boolean -MY(set_sizes) (abfd) - bfd *abfd; -{ - adata(abfd).page_size = TARGET_PAGE_SIZE; - -#ifdef SEGMENT_SIZE - adata(abfd).segment_size = SEGMENT_SIZE; -#else - adata(abfd).segment_size = TARGET_PAGE_SIZE; -#endif - -#ifdef ZMAGIC_DISK_BLOCK_SIZE - adata(abfd).zmagic_disk_block_size = ZMAGIC_DISK_BLOCK_SIZE; -#else - adata(abfd).zmagic_disk_block_size = TARGET_PAGE_SIZE; -#endif - - adata(abfd).exec_bytes_size = EXEC_BYTES_SIZE; - return true; -} -#define MY_set_sizes MY(set_sizes) -#endif - -#ifndef MY_exec_hdr_flags -#define MY_exec_hdr_flags 0 -#endif - -#ifndef MY_backend_data - -#ifndef MY_zmagic_contiguous -#define MY_zmagic_contiguous 0 -#endif -#ifndef MY_text_includes_header -#define MY_text_includes_header 0 -#endif -#ifndef MY_exec_header_not_counted -#define MY_exec_header_not_counted 0 -#endif -#ifndef MY_add_dynamic_symbols -#define MY_add_dynamic_symbols 0 -#endif -#ifndef MY_add_one_symbol -#define MY_add_one_symbol 0 -#endif -#ifndef MY_link_dynamic_object -#define MY_link_dynamic_object 0 -#endif -#ifndef MY_write_dynamic_symbol -#define MY_write_dynamic_symbol 0 -#endif -#ifndef MY_check_dynamic_reloc -#define MY_check_dynamic_reloc 0 -#endif -#ifndef MY_finish_dynamic_link -#define MY_finish_dynamic_link 0 -#endif - -static CONST struct aout_backend_data MY(backend_data) = { - MY_zmagic_contiguous, - MY_text_includes_header, - MY_exec_hdr_flags, - 0, /* text vma? */ - MY_set_sizes, - MY_exec_header_not_counted, - MY_add_dynamic_symbols, - MY_add_one_symbol, - MY_link_dynamic_object, - MY_write_dynamic_symbol, - MY_check_dynamic_reloc, - MY_finish_dynamic_link -}; -#define MY_backend_data &MY(backend_data) -#endif - -#ifndef MY_final_link_callback - -/* Callback for the final_link routine to set the section offsets. */ - -static void MY_final_link_callback - PARAMS ((bfd *, file_ptr *, file_ptr *, file_ptr *)); - -static void -MY_final_link_callback (abfd, ptreloff, pdreloff, psymoff) - bfd *abfd; - file_ptr *ptreloff; - file_ptr *pdreloff; - file_ptr *psymoff; -{ - struct internal_exec *execp = exec_hdr (abfd); - - *ptreloff = N_TRELOFF (*execp); - *pdreloff = N_DRELOFF (*execp); - *psymoff = N_SYMOFF (*execp); -} - -#endif - -#ifndef MY_bfd_final_link - -/* Final link routine. We need to use a call back to get the correct - offsets in the output file. */ - -static boolean -MY_bfd_final_link (abfd, info) - bfd *abfd; - struct bfd_link_info *info; -{ - return NAME(aout,final_link) (abfd, info, MY_final_link_callback); -} - -#endif - -/* We assume BFD generic archive files. */ -#ifndef MY_openr_next_archived_file -#define MY_openr_next_archived_file bfd_generic_openr_next_archived_file -#endif -#ifndef MY_get_elt_at_index -#define MY_get_elt_at_index _bfd_generic_get_elt_at_index -#endif -#ifndef MY_generic_stat_arch_elt -#define MY_generic_stat_arch_elt bfd_generic_stat_arch_elt -#endif -#ifndef MY_slurp_armap -#define MY_slurp_armap bfd_slurp_bsd_armap -#endif -#ifndef MY_slurp_extended_name_table -#define MY_slurp_extended_name_table _bfd_slurp_extended_name_table -#endif -#ifndef MY_construct_extended_name_table -#define MY_construct_extended_name_table \ - _bfd_archive_bsd_construct_extended_name_table -#endif -#ifndef MY_write_armap -#define MY_write_armap bsd_write_armap -#endif -#ifndef MY_read_ar_hdr -#define MY_read_ar_hdr _bfd_generic_read_ar_hdr -#endif -#ifndef MY_truncate_arname -#define MY_truncate_arname bfd_bsd_truncate_arname -#endif -#ifndef MY_update_armap_timestamp -#define MY_update_armap_timestamp _bfd_archive_bsd_update_armap_timestamp -#endif - -/* No core file defined here -- configure in trad-core.c separately. */ -#ifndef MY_core_file_failing_command -#define MY_core_file_failing_command _bfd_nocore_core_file_failing_command -#endif -#ifndef MY_core_file_failing_signal -#define MY_core_file_failing_signal _bfd_nocore_core_file_failing_signal -#endif -#ifndef MY_core_file_matches_executable_p -#define MY_core_file_matches_executable_p \ - _bfd_nocore_core_file_matches_executable_p -#endif -#ifndef MY_core_file_p -#define MY_core_file_p _bfd_dummy_target -#endif - -#ifndef MY_bfd_debug_info_start -#define MY_bfd_debug_info_start bfd_void -#endif -#ifndef MY_bfd_debug_info_end -#define MY_bfd_debug_info_end bfd_void -#endif -#ifndef MY_bfd_debug_info_accumulate -#define MY_bfd_debug_info_accumulate \ - (void (*) PARAMS ((bfd*, struct sec *))) bfd_void -#endif - -#ifndef MY_core_file_failing_command -#define MY_core_file_failing_command NAME(aout,core_file_failing_command) -#endif -#ifndef MY_core_file_failing_signal -#define MY_core_file_failing_signal NAME(aout,core_file_failing_signal) -#endif -#ifndef MY_core_file_matches_executable_p -#define MY_core_file_matches_executable_p NAME(aout,core_file_matches_executable_p) -#endif -#ifndef MY_set_section_contents -#define MY_set_section_contents NAME(aout,set_section_contents) -#endif -#ifndef MY_get_section_contents -#define MY_get_section_contents NAME(aout,get_section_contents) -#endif -#ifndef MY_get_section_contents_in_window -#define MY_get_section_contents_in_window _bfd_generic_get_section_contents_in_window -#endif -#ifndef MY_new_section_hook -#define MY_new_section_hook NAME(aout,new_section_hook) -#endif -#ifndef MY_get_symtab_upper_bound -#define MY_get_symtab_upper_bound NAME(aout,get_symtab_upper_bound) -#endif -#ifndef MY_get_symtab -#define MY_get_symtab NAME(aout,get_symtab) -#endif -#ifndef MY_get_reloc_upper_bound -#define MY_get_reloc_upper_bound NAME(aout,get_reloc_upper_bound) -#endif -#ifndef MY_canonicalize_reloc -#define MY_canonicalize_reloc NAME(aout,canonicalize_reloc) -#endif -#ifndef MY_make_empty_symbol -#define MY_make_empty_symbol NAME(aout,make_empty_symbol) -#endif -#ifndef MY_print_symbol -#define MY_print_symbol NAME(aout,print_symbol) -#endif -#ifndef MY_get_symbol_info -#define MY_get_symbol_info NAME(aout,get_symbol_info) -#endif -#ifndef MY_get_lineno -#define MY_get_lineno NAME(aout,get_lineno) -#endif -#ifndef MY_set_arch_mach -#define MY_set_arch_mach NAME(aout,set_arch_mach) -#endif -#ifndef MY_find_nearest_line -#define MY_find_nearest_line NAME(aout,find_nearest_line) -#endif -#ifndef MY_sizeof_headers -#define MY_sizeof_headers NAME(aout,sizeof_headers) -#endif -#ifndef MY_bfd_get_relocated_section_contents -#define MY_bfd_get_relocated_section_contents \ - bfd_generic_get_relocated_section_contents -#endif -#ifndef MY_bfd_relax_section -#define MY_bfd_relax_section bfd_generic_relax_section -#endif -#ifndef MY_bfd_reloc_type_lookup -#define MY_bfd_reloc_type_lookup NAME(aout,reloc_type_lookup) -#endif -#ifndef MY_bfd_make_debug_symbol -#define MY_bfd_make_debug_symbol 0 -#endif -#ifndef MY_read_minisymbols -#define MY_read_minisymbols NAME(aout,read_minisymbols) -#endif -#ifndef MY_minisymbol_to_symbol -#define MY_minisymbol_to_symbol NAME(aout,minisymbol_to_symbol) -#endif -#ifndef MY_bfd_link_hash_table_create -#define MY_bfd_link_hash_table_create NAME(aout,link_hash_table_create) -#endif -#ifndef MY_bfd_link_add_symbols -#define MY_bfd_link_add_symbols NAME(aout,link_add_symbols) -#endif -#ifndef MY_bfd_link_split_section -#define MY_bfd_link_split_section _bfd_generic_link_split_section -#endif - - -#ifndef MY_bfd_copy_private_bfd_data -#define MY_bfd_copy_private_bfd_data _bfd_generic_bfd_copy_private_bfd_data -#endif - -#ifndef MY_bfd_merge_private_bfd_data -#define MY_bfd_merge_private_bfd_data _bfd_generic_bfd_merge_private_bfd_data -#endif - -#ifndef MY_bfd_copy_private_symbol_data -#define MY_bfd_copy_private_symbol_data _bfd_generic_bfd_copy_private_symbol_data -#endif - -#ifndef MY_bfd_print_private_bfd_data -#define MY_bfd_print_private_bfd_data _bfd_generic_bfd_print_private_bfd_data -#endif - -#ifndef MY_bfd_set_private_flags -#define MY_bfd_set_private_flags _bfd_generic_bfd_set_private_flags -#endif - -#ifndef MY_bfd_is_local_label -#define MY_bfd_is_local_label bfd_generic_is_local_label -#endif - -#ifndef MY_bfd_free_cached_info -#define MY_bfd_free_cached_info NAME(aout,bfd_free_cached_info) -#endif - -#ifndef MY_close_and_cleanup -#define MY_close_and_cleanup MY_bfd_free_cached_info -#endif - -#ifndef MY_get_dynamic_symtab_upper_bound -#define MY_get_dynamic_symtab_upper_bound \ - _bfd_nodynamic_get_dynamic_symtab_upper_bound -#endif -#ifndef MY_canonicalize_dynamic_symtab -#define MY_canonicalize_dynamic_symtab \ - _bfd_nodynamic_canonicalize_dynamic_symtab -#endif -#ifndef MY_get_dynamic_reloc_upper_bound -#define MY_get_dynamic_reloc_upper_bound \ - _bfd_nodynamic_get_dynamic_reloc_upper_bound -#endif -#ifndef MY_canonicalize_dynamic_reloc -#define MY_canonicalize_dynamic_reloc \ - _bfd_nodynamic_canonicalize_dynamic_reloc -#endif - -/* Aout symbols normally have leading underscores */ -#ifndef MY_symbol_leading_char -#define MY_symbol_leading_char '_' -#endif - -/* Aout archives normally use spaces for padding */ -#ifndef AR_PAD_CHAR -#define AR_PAD_CHAR ' ' -#endif - -#ifndef MY_BFD_TARGET -const bfd_target MY(vec) = -{ - TARGETNAME, /* name */ - bfd_target_aout_flavour, -#ifdef TARGET_IS_BIG_ENDIAN_P - BFD_ENDIAN_BIG, /* target byte order (big) */ - BFD_ENDIAN_BIG, /* target headers byte order (big) */ -#else - BFD_ENDIAN_LITTLE, /* target byte order (little) */ - BFD_ENDIAN_LITTLE, /* target headers byte order (little) */ -#endif - (HAS_RELOC | EXEC_P | /* object flags */ - HAS_LINENO | HAS_DEBUG | - HAS_SYMS | HAS_LOCALS | DYNAMIC | WP_TEXT | D_PAGED), - (SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD | SEC_RELOC), /* section flags */ - MY_symbol_leading_char, - AR_PAD_CHAR, /* ar_pad_char */ - 15, /* ar_max_namelen */ -#ifdef TARGET_IS_BIG_ENDIAN_P - bfd_getb64, bfd_getb_signed_64, bfd_putb64, - bfd_getb32, bfd_getb_signed_32, bfd_putb32, - bfd_getb16, bfd_getb_signed_16, bfd_putb16, /* data */ - bfd_getb64, bfd_getb_signed_64, bfd_putb64, - bfd_getb32, bfd_getb_signed_32, bfd_putb32, - bfd_getb16, bfd_getb_signed_16, bfd_putb16, /* hdrs */ -#else - bfd_getl64, bfd_getl_signed_64, bfd_putl64, - bfd_getl32, bfd_getl_signed_32, bfd_putl32, - bfd_getl16, bfd_getl_signed_16, bfd_putl16, /* data */ - bfd_getl64, bfd_getl_signed_64, bfd_putl64, - bfd_getl32, bfd_getl_signed_32, bfd_putl32, - bfd_getl16, bfd_getl_signed_16, bfd_putl16, /* hdrs */ -#endif - {_bfd_dummy_target, MY_object_p, /* bfd_check_format */ - bfd_generic_archive_p, MY_core_file_p}, - {bfd_false, MY_mkobject, /* bfd_set_format */ - _bfd_generic_mkarchive, bfd_false}, - {bfd_false, MY_write_object_contents, /* bfd_write_contents */ - _bfd_write_archive_contents, bfd_false}, - - BFD_JUMP_TABLE_GENERIC (MY), - BFD_JUMP_TABLE_COPY (MY), - BFD_JUMP_TABLE_CORE (MY), - BFD_JUMP_TABLE_ARCHIVE (MY), - BFD_JUMP_TABLE_SYMBOLS (MY), - BFD_JUMP_TABLE_RELOCS (MY), - BFD_JUMP_TABLE_WRITE (MY), - BFD_JUMP_TABLE_LINK (MY), - BFD_JUMP_TABLE_DYNAMIC (MY), - - (PTR) MY_backend_data, -}; -#endif /* MY_BFD_TARGET */ diff --git a/contrib/gdb/bfd/aout0.c b/contrib/gdb/bfd/aout0.c deleted file mode 100644 index 5bc7ae0f67f8c..0000000000000 --- a/contrib/gdb/bfd/aout0.c +++ /dev/null @@ -1,32 +0,0 @@ -/* BFD backend for SunOS style a.out with flags set to 0 - Copyright (C) 1990, 91, 92, 93, 1994 Free Software Foundation, Inc. - Written by Cygnus Support. - -This file is part of BFD, the Binary File Descriptor library. - -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 2 of the License, 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ - -#define TARGETNAME "a.out-zero-big" -#define MY(OP) CAT(aout0_big_,OP) - -#include "bfd.h" - -#define MY_exec_hdr_flags 0 - -#define MACHTYPE_OK(mtype) \ - ((mtype) == M_UNKNOWN || (mtype) == M_68010 || (mtype) == M_68020) - -/* Include the usual a.out support. */ -#include "aoutf1.h" diff --git a/contrib/gdb/bfd/aout32.c b/contrib/gdb/bfd/aout32.c deleted file mode 100644 index bfc40b46303bc..0000000000000 --- a/contrib/gdb/bfd/aout32.c +++ /dev/null @@ -1,23 +0,0 @@ -/* BFD back-end for 32-bit a.out files. - Copyright (C) 1990, 91, 92, 93, 94 Free Software Foundation, Inc. - Written by Cygnus Support. - -This file is part of BFD, the Binary File Descriptor library. - -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 2 of the License, 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ - -#define ARCH_SIZE 32 - -#include "aoutx.h" diff --git a/contrib/gdb/bfd/aout64.c b/contrib/gdb/bfd/aout64.c deleted file mode 100644 index 84036c885a294..0000000000000 --- a/contrib/gdb/bfd/aout64.c +++ /dev/null @@ -1,31 +0,0 @@ -/* BFD back-end for 64-bit a.out files. - Copyright 1990, 1991, 1992 Free Software Foundation, Inc. - Written by Cygnus Support. - -This file is part of BFD, the Binary File Descriptor library. - -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 2 of the License, 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ - -#define ARCH_SIZE 64 - -/* aoutx.h requires definitions for BMAGIC and QMAGIC. */ -#ifndef BMAGIC -#define BMAGIC 0 -#endif -#ifndef QMAGIC -#define QMAGIC 0 -#endif - -#include "aoutx.h" diff --git a/contrib/gdb/bfd/aoutf1.h b/contrib/gdb/bfd/aoutf1.h deleted file mode 100644 index 690d528b5c44f..0000000000000 --- a/contrib/gdb/bfd/aoutf1.h +++ /dev/null @@ -1,788 +0,0 @@ -/* A.out "format 1" file handling code for BFD. - Copyright 1990, 1991, 1992, 1993 Free Software Foundation, Inc. - Written by Cygnus Support. - -This file is part of BFD, the Binary File Descriptor library. - -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 2 of the License, 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ - -#include "bfd.h" -#include "sysdep.h" -#include "libbfd.h" - -#include "aout/sun4.h" -#include "libaout.h" /* BFD a.out internal data structures */ - -#include "aout/aout64.h" -#include "aout/stab_gnu.h" -#include "aout/ar.h" - -/* This is needed to reject a NewsOS file, e.g. in - gdb/testsuite/gdb.t10/crossload.exp. <kingdon@cygnus.com> - I needed to add M_UNKNOWN to recognize a 68000 object, so this will - probably no longer reject a NewsOS object. <ian@cygnus.com>. */ -#ifndef MACHTYPE_OK -#define MACHTYPE_OK(mtype) \ - (((mtype) == M_SPARC && bfd_lookup_arch (bfd_arch_sparc, 0) != NULL) \ - || (((mtype) == M_UNKNOWN || (mtype) == M_68010 || (mtype) == M_68020) \ - && bfd_lookup_arch (bfd_arch_m68k, 0) != NULL)) -#endif - -/* -The file @code{aoutf1.h} contains the code for BFD's -a.out back end. Control over the generated back end is given by these -two preprocessor names: -@table @code -@item ARCH_SIZE -This value should be either 32 or 64, depending upon the size of an -int in the target format. It changes the sizes of the structs which -perform the memory/disk mapping of structures. - -The 64 bit backend may only be used if the host compiler supports 64 -ints (eg long long with gcc), by defining the name @code{BFD_HOST_64_BIT} in @code{bfd.h}. -With this name defined, @emph{all} bfd operations are performed with 64bit -arithmetic, not just those to a 64bit target. - -@item TARGETNAME -The name put into the target vector. -@item -@end table - -*/ - -/*SUPPRESS558*/ -/*SUPPRESS529*/ - -static void -#if ARCH_SIZE == 64 -sunos_64_set_arch_mach -#else -sunos_32_set_arch_mach -#endif - (abfd, machtype) - bfd *abfd; - int machtype; -{ - /* Determine the architecture and machine type of the object file. */ - enum bfd_architecture arch; - long machine; - switch (machtype) - { - - case M_UNKNOWN: - /* Some Sun3s make magic numbers without cpu types in them, so - we'll default to the 68000. */ - arch = bfd_arch_m68k; - machine = 68000; - break; - - case M_68010: - case M_HP200: - arch = bfd_arch_m68k; - machine = 68010; - break; - - case M_68020: - case M_HP300: - arch = bfd_arch_m68k; - machine = 68020; - break; - - case M_SPARC: - arch = bfd_arch_sparc; - machine = 0; - break; - - case M_386: - case M_386_DYNIX: - arch = bfd_arch_i386; - machine = 0; - break; - - case M_29K: - arch = bfd_arch_a29k; - machine = 0; - break; - - case M_HPUX: - arch = bfd_arch_m68k; - machine = 0; - break; - - default: - arch = bfd_arch_obscure; - machine = 0; - break; - } - bfd_set_arch_mach (abfd, arch, machine); -} - -#define SET_ARCH_MACH(ABFD, EXEC) \ - NAME(sunos,set_arch_mach)(ABFD, N_MACHTYPE (EXEC)); \ - choose_reloc_size(ABFD); - -/* Determine the size of a relocation entry, based on the architecture */ -static void -choose_reloc_size (abfd) - bfd *abfd; -{ - switch (bfd_get_arch (abfd)) - { - case bfd_arch_sparc: - case bfd_arch_a29k: - obj_reloc_entry_size (abfd) = RELOC_EXT_SIZE; - break; - default: - obj_reloc_entry_size (abfd) = RELOC_STD_SIZE; - break; - } -} - -/* Write an object file in SunOS format. - Section contents have already been written. We write the - file header, symbols, and relocation. */ - -static boolean -#if ARCH_SIZE == 64 -aout_64_sunos4_write_object_contents -#else -aout_32_sunos4_write_object_contents -#endif - (abfd) - bfd *abfd; -{ - struct external_exec exec_bytes; - struct internal_exec *execp = exec_hdr (abfd); - - /* Magic number, maestro, please! */ - switch (bfd_get_arch (abfd)) - { - case bfd_arch_m68k: - switch (bfd_get_mach (abfd)) - { - case 68000: - N_SET_MACHTYPE (*execp, M_UNKNOWN); - break; - case 68010: - N_SET_MACHTYPE (*execp, M_68010); - break; - default: - case 68020: - N_SET_MACHTYPE (*execp, M_68020); - break; - } - break; - case bfd_arch_sparc: - N_SET_MACHTYPE (*execp, M_SPARC); - break; - case bfd_arch_i386: - N_SET_MACHTYPE (*execp, M_386); - break; - case bfd_arch_a29k: - N_SET_MACHTYPE (*execp, M_29K); - break; - default: - N_SET_MACHTYPE (*execp, M_UNKNOWN); - } - - choose_reloc_size (abfd); - - N_SET_FLAGS (*execp, aout_backend_info (abfd)->exec_hdr_flags); - - N_SET_DYNAMIC (*execp, bfd_get_file_flags (abfd) & DYNAMIC); - - WRITE_HEADERS (abfd, execp); - - return true; -} - -/* core files */ - -#define CORE_MAGIC 0x080456 -#define CORE_NAMELEN 16 - -/* The core structure is taken from the Sun documentation. - Unfortunately, they don't document the FPA structure, or at least I - can't find it easily. Fortunately the core header contains its own - length. So this shouldn't cause problems, except for c_ucode, which - so far we don't use but is easy to find with a little arithmetic. */ - -/* But the reg structure can be gotten from the SPARC processor handbook. - This really should be in a GNU include file though so that gdb can use - the same info. */ -struct regs -{ - int r_psr; - int r_pc; - int r_npc; - int r_y; - int r_g1; - int r_g2; - int r_g3; - int r_g4; - int r_g5; - int r_g6; - int r_g7; - int r_o0; - int r_o1; - int r_o2; - int r_o3; - int r_o4; - int r_o5; - int r_o6; - int r_o7; -}; - -/* Taken from Sun documentation: */ - -/* FIXME: It's worse than we expect. This struct contains TWO substructs - neither of whose size we know, WITH STUFF IN BETWEEN THEM! We can't - even portably access the stuff in between! */ - -struct external_sparc_core - { - int c_magic; /* Corefile magic number */ - int c_len; /* Sizeof (struct core) */ -#define SPARC_CORE_LEN 432 - int c_regs[19]; /* General purpose registers -- MACHDEP SIZE */ - struct external_exec c_aouthdr; /* A.out header */ - int c_signo; /* Killing signal, if any */ - int c_tsize; /* Text size (bytes) */ - int c_dsize; /* Data size (bytes) */ - int c_ssize; /* Stack size (bytes) */ - char c_cmdname[CORE_NAMELEN + 1]; /* Command name */ - double fp_stuff[1]; /* external FPU state (size unknown by us) */ - /* The type "double" is critical here, for alignment. - SunOS declares a struct here, but the struct's alignment - is double since it contains doubles. */ - int c_ucode; /* Exception no. from u_code */ - /* (this member is not accessible by name since we don't - portably know the size of fp_stuff.) */ - }; - -/* Core files generated by the BCP (the part of Solaris which allows - it to run SunOS4 a.out files). */ -struct external_solaris_bcp_core - { - int c_magic; /* Corefile magic number */ - int c_len; /* Sizeof (struct core) */ -#define SOLARIS_BCP_CORE_LEN 456 - int c_regs[19]; /* General purpose registers -- MACHDEP SIZE */ - int c_exdata_vp; /* exdata structure */ - int c_exdata_tsize; - int c_exdata_dsize; - int c_exdata_bsize; - int c_exdata_lsize; - int c_exdata_nshlibs; - short c_exdata_mach; - short c_exdata_mag; - int c_exdata_toffset; - int c_exdata_doffset; - int c_exdata_loffset; - int c_exdata_txtorg; - int c_exdata_datorg; - int c_exdata_entloc; - int c_signo; /* Killing signal, if any */ - int c_tsize; /* Text size (bytes) */ - int c_dsize; /* Data size (bytes) */ - int c_ssize; /* Stack size (bytes) */ - char c_cmdname[CORE_NAMELEN + 1]; /* Command name */ - double fp_stuff[1]; /* external FPU state (size unknown by us) */ - /* The type "double" is critical here, for alignment. - SunOS declares a struct here, but the struct's alignment - is double since it contains doubles. */ - int c_ucode; /* Exception no. from u_code */ - /* (this member is not accessible by name since we don't - portably know the size of fp_stuff.) */ - }; - -struct external_sun3_core - { - int c_magic; /* Corefile magic number */ - int c_len; /* Sizeof (struct core) */ -#define SUN3_CORE_LEN 826 /* As of SunOS 4.1.1 */ - int c_regs[18]; /* General purpose registers -- MACHDEP SIZE */ - struct external_exec c_aouthdr; /* A.out header */ - int c_signo; /* Killing signal, if any */ - int c_tsize; /* Text size (bytes) */ - int c_dsize; /* Data size (bytes) */ - int c_ssize; /* Stack size (bytes) */ - char c_cmdname[CORE_NAMELEN + 1]; /* Command name */ - double fp_stuff[1]; /* external FPU state (size unknown by us) */ - /* The type "double" is critical here, for alignment. - SunOS declares a struct here, but the struct's alignment - is double since it contains doubles. */ - int c_ucode; /* Exception no. from u_code */ - /* (this member is not accessible by name since we don't - portably know the size of fp_stuff.) */ - }; - -struct internal_sunos_core - { - int c_magic; /* Corefile magic number */ - int c_len; /* Sizeof (struct core) */ - long c_regs_pos; /* file offset of General purpose registers */ - int c_regs_size; /* size of General purpose registers */ - struct internal_exec c_aouthdr; /* A.out header */ - int c_signo; /* Killing signal, if any */ - int c_tsize; /* Text size (bytes) */ - int c_dsize; /* Data size (bytes) */ - bfd_vma c_data_addr; /* Data start (address) */ - int c_ssize; /* Stack size (bytes) */ - bfd_vma c_stacktop; /* Stack top (address) */ - char c_cmdname[CORE_NAMELEN + 1]; /* Command name */ - long fp_stuff_pos; /* file offset of external FPU state (regs) */ - int fp_stuff_size; /* Size of it */ - int c_ucode; /* Exception no. from u_code */ - }; - -/* byte-swap in the Sun-3 core structure */ -static void -swapcore_sun3 (abfd, ext, intcore) - bfd *abfd; - char *ext; - struct internal_sunos_core *intcore; -{ - struct external_sun3_core *extcore = (struct external_sun3_core *) ext; - - intcore->c_magic = bfd_h_get_32 (abfd, (unsigned char *) &extcore->c_magic); - intcore->c_len = bfd_h_get_32 (abfd, (unsigned char *) &extcore->c_len); - intcore->c_regs_pos = (long) (((struct external_sun3_core *) 0)->c_regs); - intcore->c_regs_size = sizeof (extcore->c_regs); -#if ARCH_SIZE == 64 - aout_64_swap_exec_header_in -#else - aout_32_swap_exec_header_in -#endif - (abfd, &extcore->c_aouthdr, &intcore->c_aouthdr); - intcore->c_signo = bfd_h_get_32 (abfd, (unsigned char *) &extcore->c_signo); - intcore->c_tsize = bfd_h_get_32 (abfd, (unsigned char *) &extcore->c_tsize); - intcore->c_dsize = bfd_h_get_32 (abfd, (unsigned char *) &extcore->c_dsize); - intcore->c_data_addr = N_DATADDR (intcore->c_aouthdr); - intcore->c_ssize = bfd_h_get_32 (abfd, (unsigned char *) &extcore->c_ssize); - memcpy (intcore->c_cmdname, extcore->c_cmdname, sizeof (intcore->c_cmdname)); - intcore->fp_stuff_pos = (long) (((struct external_sun3_core *) 0)->fp_stuff); - /* FP stuff takes up whole rest of struct, except c_ucode. */ - intcore->fp_stuff_size = intcore->c_len - (sizeof extcore->c_ucode) - - (file_ptr) (((struct external_sun3_core *) 0)->fp_stuff); - /* Ucode is the last thing in the struct -- just before the end */ - intcore->c_ucode = - bfd_h_get_32 (abfd, - intcore->c_len - sizeof (extcore->c_ucode) + (unsigned char *) extcore); - intcore->c_stacktop = 0x0E000000; /* By experimentation */ -} - - -/* byte-swap in the Sparc core structure */ -static void -swapcore_sparc (abfd, ext, intcore) - bfd *abfd; - char *ext; - struct internal_sunos_core *intcore; -{ - struct external_sparc_core *extcore = (struct external_sparc_core *) ext; - - intcore->c_magic = bfd_h_get_32 (abfd, (unsigned char *) &extcore->c_magic); - intcore->c_len = bfd_h_get_32 (abfd, (unsigned char *) &extcore->c_len); - intcore->c_regs_pos = (long) (((struct external_sparc_core *) 0)->c_regs); - intcore->c_regs_size = sizeof (extcore->c_regs); -#if ARCH_SIZE == 64 - aout_64_swap_exec_header_in -#else - aout_32_swap_exec_header_in -#endif - (abfd, &extcore->c_aouthdr, &intcore->c_aouthdr); - intcore->c_signo = bfd_h_get_32 (abfd, (unsigned char *) &extcore->c_signo); - intcore->c_tsize = bfd_h_get_32 (abfd, (unsigned char *) &extcore->c_tsize); - intcore->c_dsize = bfd_h_get_32 (abfd, (unsigned char *) &extcore->c_dsize); - intcore->c_data_addr = N_DATADDR (intcore->c_aouthdr); - intcore->c_ssize = bfd_h_get_32 (abfd, (unsigned char *) &extcore->c_ssize); - memcpy (intcore->c_cmdname, extcore->c_cmdname, sizeof (intcore->c_cmdname)); - intcore->fp_stuff_pos = (long) (((struct external_sparc_core *) 0)->fp_stuff); - /* FP stuff takes up whole rest of struct, except c_ucode. */ - intcore->fp_stuff_size = intcore->c_len - (sizeof extcore->c_ucode) - - (file_ptr) (((struct external_sparc_core *) 0)->fp_stuff); - /* Ucode is the last thing in the struct -- just before the end */ - intcore->c_ucode = - bfd_h_get_32 (abfd, - intcore->c_len - sizeof (extcore->c_ucode) + (unsigned char *) extcore); - - /* Supposedly the user stack grows downward from the bottom of kernel memory. - Presuming that this remains true, this definition will work. */ - /* Now sun has provided us with another challenge. The value is different - for sparc2 and sparc10 (both running SunOS 4.1.3). We pick one or - the other based on the current value of the stack pointer. This - loses (a) if the stack pointer has been clobbered, or (b) if the stack - is larger than 128 megabytes. - - It's times like these you're glad they're switching to ELF. - - Note that using include files or nlist on /vmunix would be wrong, - because we want the value for this core file, no matter what kind of - machine we were compiled on or are running on. */ -#define SPARC_USRSTACK_SPARC2 ((bfd_vma)0xf8000000) -#define SPARC_USRSTACK_SPARC10 ((bfd_vma)0xf0000000) - { - bfd_vma sp = bfd_h_get_32 - (abfd, (unsigned char *) &((struct regs *) &extcore->c_regs[0])->r_o6); - if (sp < SPARC_USRSTACK_SPARC10) - intcore->c_stacktop = SPARC_USRSTACK_SPARC10; - else - intcore->c_stacktop = SPARC_USRSTACK_SPARC2; - } -} - -/* byte-swap in the Solaris BCP core structure */ -static void -swapcore_solaris_bcp (abfd, ext, intcore) - bfd *abfd; - char *ext; - struct internal_sunos_core *intcore; -{ - struct external_solaris_bcp_core *extcore = - (struct external_solaris_bcp_core *) ext; - - intcore->c_magic = bfd_h_get_32 (abfd, (unsigned char *) &extcore->c_magic); - intcore->c_len = bfd_h_get_32 (abfd, (unsigned char *) &extcore->c_len); - intcore->c_regs_pos = (long) (((struct external_solaris_bcp_core *) 0)->c_regs); - intcore->c_regs_size = sizeof (extcore->c_regs); - - /* The Solaris BCP exdata structure does not contain an a_syms field, - so we are unable to synthesize an internal exec header. - Luckily we are able to figure out the start address of the data section, - which is the only thing needed from the internal exec header, - from the exdata structure. - - As of Solaris 2.3, BCP core files for statically linked executables - are buggy. The exdata structure is not properly filled in, and - the data section is written from address zero instead of the data - start address. */ - memset ((PTR) &intcore->c_aouthdr, 0, sizeof (struct internal_exec)); - intcore->c_data_addr = - bfd_h_get_32 (abfd, (unsigned char *) &extcore->c_exdata_datorg); - intcore->c_signo = bfd_h_get_32 (abfd, (unsigned char *) &extcore->c_signo); - intcore->c_tsize = bfd_h_get_32 (abfd, (unsigned char *) &extcore->c_tsize); - intcore->c_dsize = bfd_h_get_32 (abfd, (unsigned char *) &extcore->c_dsize); - intcore->c_ssize = bfd_h_get_32 (abfd, (unsigned char *) &extcore->c_ssize); - memcpy (intcore->c_cmdname, extcore->c_cmdname, sizeof (intcore->c_cmdname)); - intcore->fp_stuff_pos = - (long) (((struct external_solaris_bcp_core *) 0)->fp_stuff); - /* FP stuff takes up whole rest of struct, except c_ucode. */ - intcore->fp_stuff_size = intcore->c_len - (sizeof extcore->c_ucode) - - (file_ptr) (((struct external_solaris_bcp_core *) 0)->fp_stuff); - /* Ucode is the last thing in the struct -- just before the end */ - intcore->c_ucode = - bfd_h_get_32 (abfd, - intcore->c_len - sizeof (extcore->c_ucode) + (unsigned char *) extcore); - - /* Supposedly the user stack grows downward from the bottom of kernel memory. - Presuming that this remains true, this definition will work. */ - /* Now sun has provided us with another challenge. The value is different - for sparc2 and sparc10 (both running SunOS 4.1.3). We pick one or - the other based on the current value of the stack pointer. This - loses (a) if the stack pointer has been clobbered, or (b) if the stack - is larger than 128 megabytes. - - It's times like these you're glad they're switching to ELF. - - Note that using include files or nlist on /vmunix would be wrong, - because we want the value for this core file, no matter what kind of - machine we were compiled on or are running on. */ -#define SPARC_USRSTACK_SPARC2 ((bfd_vma)0xf8000000) -#define SPARC_USRSTACK_SPARC10 ((bfd_vma)0xf0000000) - { - bfd_vma sp = bfd_h_get_32 - (abfd, (unsigned char *) &((struct regs *) &extcore->c_regs[0])->r_o6); - if (sp < SPARC_USRSTACK_SPARC10) - intcore->c_stacktop = SPARC_USRSTACK_SPARC10; - else - intcore->c_stacktop = SPARC_USRSTACK_SPARC2; - } -} - -/* need this cast because ptr is really void * */ -#define core_hdr(bfd) ((bfd)->tdata.sun_core_data) -#define core_datasec(bfd) (core_hdr(bfd)->data_section) -#define core_stacksec(bfd) (core_hdr(bfd)->stack_section) -#define core_regsec(bfd) (core_hdr(bfd)->reg_section) -#define core_reg2sec(bfd) (core_hdr(bfd)->reg2_section) - -/* These are stored in the bfd's tdata */ -struct sun_core_struct -{ - struct internal_sunos_core *hdr; /* core file header */ - asection *data_section; - asection *stack_section; - asection *reg_section; - asection *reg2_section; -}; - -static const bfd_target * -sunos4_core_file_p (abfd) - bfd *abfd; -{ - unsigned char longbuf[4]; /* Raw bytes of various header fields */ - bfd_size_type core_size; - unsigned long core_mag; - struct internal_sunos_core *core; - char *extcore; - struct mergem - { - struct sun_core_struct suncoredata; - struct internal_sunos_core internal_sunos_core; - char external_core[1]; - } - *mergem; - - if (bfd_read ((PTR) longbuf, 1, sizeof (longbuf), abfd) != - sizeof (longbuf)) - return 0; - core_mag = bfd_h_get_32 (abfd, longbuf); - - if (core_mag != CORE_MAGIC) - return 0; - - /* SunOS core headers can vary in length; second word is size; */ - if (bfd_read ((PTR) longbuf, 1, sizeof (longbuf), abfd) != - sizeof (longbuf)) - return 0; - core_size = bfd_h_get_32 (abfd, longbuf); - /* Sanity check */ - if (core_size > 20000) - return 0; - - if (bfd_seek (abfd, (file_ptr) 0, SEEK_SET) < 0) - return 0; - - mergem = (struct mergem *) bfd_zalloc (abfd, core_size + sizeof (struct mergem)); - if (mergem == NULL) - return 0; - - extcore = mergem->external_core; - - if ((bfd_read ((PTR) extcore, 1, core_size, abfd)) != core_size) - { - bfd_release (abfd, (char *) mergem); - return 0; - } - - /* Validate that it's a core file we know how to handle, due to sun - botching the positioning of registers and other fields in a machine - dependent way. */ - core = &mergem->internal_sunos_core; - switch (core_size) - { - case SPARC_CORE_LEN: - swapcore_sparc (abfd, extcore, core); - break; - case SUN3_CORE_LEN: - swapcore_sun3 (abfd, extcore, core); - break; - case SOLARIS_BCP_CORE_LEN: - swapcore_solaris_bcp (abfd, extcore, core); - break; - default: - bfd_set_error (bfd_error_system_call); /* FIXME */ - bfd_release (abfd, (char *) mergem); - return 0; - } - - abfd->tdata.sun_core_data = &mergem->suncoredata; - abfd->tdata.sun_core_data->hdr = core; - - /* create the sections. This is raunchy, but bfd_close wants to reclaim - them */ - core_stacksec (abfd) = (asection *) bfd_zalloc (abfd, sizeof (asection)); - if (core_stacksec (abfd) == NULL) - { - loser: - bfd_release (abfd, (char *) mergem); - return 0; - } - core_datasec (abfd) = (asection *) bfd_zalloc (abfd, sizeof (asection)); - if (core_datasec (abfd) == NULL) - { - loser1: - bfd_release (abfd, core_stacksec (abfd)); - goto loser; - } - core_regsec (abfd) = (asection *) bfd_zalloc (abfd, sizeof (asection)); - if (core_regsec (abfd) == NULL) - { - loser2: - bfd_release (abfd, core_datasec (abfd)); - goto loser1; - } - core_reg2sec (abfd) = (asection *) bfd_zalloc (abfd, sizeof (asection)); - if (core_reg2sec (abfd) == NULL) - { - bfd_release (abfd, core_regsec (abfd)); - goto loser2; - } - - core_stacksec (abfd)->name = ".stack"; - core_datasec (abfd)->name = ".data"; - core_regsec (abfd)->name = ".reg"; - core_reg2sec (abfd)->name = ".reg2"; - - core_stacksec (abfd)->flags = SEC_ALLOC + SEC_LOAD + SEC_HAS_CONTENTS; - core_datasec (abfd)->flags = SEC_ALLOC + SEC_LOAD + SEC_HAS_CONTENTS; - core_regsec (abfd)->flags = SEC_HAS_CONTENTS; - core_reg2sec (abfd)->flags = SEC_HAS_CONTENTS; - - core_stacksec (abfd)->_raw_size = core->c_ssize; - core_datasec (abfd)->_raw_size = core->c_dsize; - core_regsec (abfd)->_raw_size = core->c_regs_size; - core_reg2sec (abfd)->_raw_size = core->fp_stuff_size; - - core_stacksec (abfd)->vma = (core->c_stacktop - core->c_ssize); - core_datasec (abfd)->vma = core->c_data_addr; - core_regsec (abfd)->vma = 0; - core_reg2sec (abfd)->vma = 0; - - core_stacksec (abfd)->filepos = core->c_len + core->c_dsize; - core_datasec (abfd)->filepos = core->c_len; - /* We'll access the regs afresh in the core file, like any section: */ - core_regsec (abfd)->filepos = (file_ptr) core->c_regs_pos; - core_reg2sec (abfd)->filepos = (file_ptr) core->fp_stuff_pos; - - /* Align to word at least */ - core_stacksec (abfd)->alignment_power = 2; - core_datasec (abfd)->alignment_power = 2; - core_regsec (abfd)->alignment_power = 2; - core_reg2sec (abfd)->alignment_power = 2; - - abfd->sections = core_stacksec (abfd); - core_stacksec (abfd)->next = core_datasec (abfd); - core_datasec (abfd)->next = core_regsec (abfd); - core_regsec (abfd)->next = core_reg2sec (abfd); - - abfd->section_count = 4; - - return abfd->xvec; -} - -static char * -sunos4_core_file_failing_command (abfd) - bfd *abfd; -{ - return core_hdr (abfd)->hdr->c_cmdname; -} - -static int -sunos4_core_file_failing_signal (abfd) - bfd *abfd; -{ - return core_hdr (abfd)->hdr->c_signo; -} - -static boolean -sunos4_core_file_matches_executable_p (core_bfd, exec_bfd) - bfd *core_bfd; - bfd *exec_bfd; -{ - if (core_bfd->xvec != exec_bfd->xvec) - { - bfd_set_error (bfd_error_system_call); - return false; - } - - /* Solaris core files do not include an aouthdr. */ - if ((core_hdr (core_bfd)->hdr)->c_len == SOLARIS_BCP_CORE_LEN) - return true; - - return (memcmp ((char *) &((core_hdr (core_bfd)->hdr)->c_aouthdr), - (char *) exec_hdr (exec_bfd), - sizeof (struct internal_exec)) == 0) ? true : false; -} - -#define MY_set_sizes sunos4_set_sizes -static boolean -sunos4_set_sizes (abfd) - bfd *abfd; -{ - switch (bfd_get_arch (abfd)) - { - default: - return false; - case bfd_arch_sparc: - adata (abfd).page_size = 0x2000; - adata (abfd).segment_size = 0x2000; - adata (abfd).exec_bytes_size = EXEC_BYTES_SIZE; - return true; - case bfd_arch_m68k: - adata (abfd).page_size = 0x2000; - adata (abfd).segment_size = 0x20000; - adata (abfd).exec_bytes_size = EXEC_BYTES_SIZE; - return true; - } -} - -/* We default to setting the toolversion field to 1, as is required by - SunOS. */ -#ifndef MY_exec_hdr_flags -#define MY_exec_hdr_flags 1 -#endif - -#ifndef MY_add_dynamic_symbols -#define MY_add_dynamic_symbols 0 -#endif -#ifndef MY_add_one_symbol -#define MY_add_one_symbol 0 -#endif -#ifndef MY_link_dynamic_object -#define MY_link_dynamic_object 0 -#endif -#ifndef MY_write_dynamic_symbol -#define MY_write_dynamic_symbol 0 -#endif -#ifndef MY_check_dynamic_reloc -#define MY_check_dynamic_reloc 0 -#endif -#ifndef MY_finish_dynamic_link -#define MY_finish_dynamic_link 0 -#endif - -static CONST struct aout_backend_data sunos4_aout_backend = -{ - 0, /* zmagic files are not contiguous */ - 1, /* text includes header */ - MY_exec_hdr_flags, - 0, /* default text vma */ - sunos4_set_sizes, - 0, /* header is counted in zmagic text */ - MY_add_dynamic_symbols, - MY_add_one_symbol, - MY_link_dynamic_object, - MY_write_dynamic_symbol, - MY_check_dynamic_reloc, - MY_finish_dynamic_link -}; - -#define MY_core_file_failing_command sunos4_core_file_failing_command -#define MY_core_file_failing_signal sunos4_core_file_failing_signal -#define MY_core_file_matches_executable_p sunos4_core_file_matches_executable_p - -#define MY_bfd_debug_info_start bfd_void -#define MY_bfd_debug_info_end bfd_void -#define MY_bfd_debug_info_accumulate \ - (void (*) PARAMS ((bfd *, struct sec *))) bfd_void -#define MY_core_file_p sunos4_core_file_p -#define MY_write_object_contents NAME(aout,sunos4_write_object_contents) -#define MY_backend_data &sunos4_aout_backend - -#define TARGET_IS_BIG_ENDIAN_P - -#include "aout-target.h" diff --git a/contrib/gdb/bfd/aoutx.h b/contrib/gdb/bfd/aoutx.h deleted file mode 100644 index 4b04943e028ba..0000000000000 --- a/contrib/gdb/bfd/aoutx.h +++ /dev/null @@ -1,5525 +0,0 @@ -/* BFD semi-generic back-end for a.out binaries. - Copyright 1990, 91, 92, 93, 94, 95, 1996 Free Software Foundation, Inc. - Written by Cygnus Support. - -This file is part of BFD, the Binary File Descriptor library. - -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 2 of the License, 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ - -/* -SECTION - a.out backends - - -DESCRIPTION - - BFD supports a number of different flavours of a.out format, - though the major differences are only the sizes of the - structures on disk, and the shape of the relocation - information. - - The support is split into a basic support file @file{aoutx.h} - and other files which derive functions from the base. One - derivation file is @file{aoutf1.h} (for a.out flavour 1), and - adds to the basic a.out functions support for sun3, sun4, 386 - and 29k a.out files, to create a target jump vector for a - specific target. - - This information is further split out into more specific files - for each machine, including @file{sunos.c} for sun3 and sun4, - @file{newsos3.c} for the Sony NEWS, and @file{demo64.c} for a - demonstration of a 64 bit a.out format. - - The base file @file{aoutx.h} defines general mechanisms for - reading and writing records to and from disk and various - other methods which BFD requires. It is included by - @file{aout32.c} and @file{aout64.c} to form the names - <<aout_32_swap_exec_header_in>>, <<aout_64_swap_exec_header_in>>, etc. - - As an example, this is what goes on to make the back end for a - sun4, from @file{aout32.c}: - -| #define ARCH_SIZE 32 -| #include "aoutx.h" - - Which exports names: - -| ... -| aout_32_canonicalize_reloc -| aout_32_find_nearest_line -| aout_32_get_lineno -| aout_32_get_reloc_upper_bound -| ... - - from @file{sunos.c}: - -| #define TARGET_NAME "a.out-sunos-big" -| #define VECNAME sunos_big_vec -| #include "aoutf1.h" - - requires all the names from @file{aout32.c}, and produces the jump vector - -| sunos_big_vec - - The file @file{host-aout.c} is a special case. It is for a large set - of hosts that use ``more or less standard'' a.out files, and - for which cross-debugging is not interesting. It uses the - standard 32-bit a.out support routines, but determines the - file offsets and addresses of the text, data, and BSS - sections, the machine architecture and machine type, and the - entry point address, in a host-dependent manner. Once these - values have been determined, generic code is used to handle - the object file. - - When porting it to run on a new system, you must supply: - -| HOST_PAGE_SIZE -| HOST_SEGMENT_SIZE -| HOST_MACHINE_ARCH (optional) -| HOST_MACHINE_MACHINE (optional) -| HOST_TEXT_START_ADDR -| HOST_STACK_END_ADDR - - in the file @file{../include/sys/h-@var{XXX}.h} (for your host). These - values, plus the structures and macros defined in @file{a.out.h} on - your host system, will produce a BFD target that will access - ordinary a.out files on your host. To configure a new machine - to use @file{host-aout.c}, specify: - -| TDEFAULTS = -DDEFAULT_VECTOR=host_aout_big_vec -| TDEPFILES= host-aout.o trad-core.o - - in the @file{config/@var{XXX}.mt} file, and modify @file{configure.in} - to use the - @file{@var{XXX}.mt} file (by setting "<<bfd_target=XXX>>") when your - configuration is selected. - -*/ - -/* Some assumptions: - * Any BFD with D_PAGED set is ZMAGIC, and vice versa. - Doesn't matter what the setting of WP_TEXT is on output, but it'll - get set on input. - * Any BFD with D_PAGED clear and WP_TEXT set is NMAGIC. - * Any BFD with both flags clear is OMAGIC. - (Just want to make these explicit, so the conditions tested in this - file make sense if you're more familiar with a.out than with BFD.) */ - -#define KEEPIT udata.i - -#include <string.h> /* For strchr and friends */ -#include <ctype.h> -#include "bfd.h" -#include <sysdep.h> -#include "bfdlink.h" - -#include "libaout.h" -#include "libbfd.h" -#include "aout/aout64.h" -#include "aout/stab_gnu.h" -#include "aout/ar.h" - -static boolean aout_get_external_symbols PARAMS ((bfd *)); -static boolean translate_from_native_sym_flags - PARAMS ((bfd *, aout_symbol_type *)); -static boolean translate_to_native_sym_flags - PARAMS ((bfd *, asymbol *, struct external_nlist *)); - -/* -SUBSECTION - Relocations - -DESCRIPTION - The file @file{aoutx.h} provides for both the @emph{standard} - and @emph{extended} forms of a.out relocation records. - - The standard records contain only an - address, a symbol index, and a type field. The extended records - (used on 29ks and sparcs) also have a full integer for an - addend. - -*/ -#ifndef CTOR_TABLE_RELOC_HOWTO -#define CTOR_TABLE_RELOC_IDX 2 -#define CTOR_TABLE_RELOC_HOWTO(BFD) ((obj_reloc_entry_size(BFD) == RELOC_EXT_SIZE \ - ? howto_table_ext : howto_table_std) \ - + CTOR_TABLE_RELOC_IDX) -#endif - -#ifndef MY_swap_std_reloc_in -#define MY_swap_std_reloc_in NAME(aout,swap_std_reloc_in) -#endif - -#ifndef MY_swap_std_reloc_out -#define MY_swap_std_reloc_out NAME(aout,swap_std_reloc_out) -#endif - -#ifndef MY_final_link_relocate -#define MY_final_link_relocate _bfd_final_link_relocate -#endif - -#ifndef MY_relocate_contents -#define MY_relocate_contents _bfd_relocate_contents -#endif - -#define howto_table_ext NAME(aout,ext_howto_table) -#define howto_table_std NAME(aout,std_howto_table) - -reloc_howto_type howto_table_ext[] = -{ - /* type rs size bsz pcrel bitpos ovrf sf name part_inpl readmask setmask pcdone */ - HOWTO(RELOC_8, 0, 0, 8, false, 0, complain_overflow_bitfield,0,"8", false, 0,0x000000ff, false), - HOWTO(RELOC_16, 0, 1, 16, false, 0, complain_overflow_bitfield,0,"16", false, 0,0x0000ffff, false), - HOWTO(RELOC_32, 0, 2, 32, false, 0, complain_overflow_bitfield,0,"32", false, 0,0xffffffff, false), - HOWTO(RELOC_DISP8, 0, 0, 8, true, 0, complain_overflow_signed,0,"DISP8", false, 0,0x000000ff, false), - HOWTO(RELOC_DISP16, 0, 1, 16, true, 0, complain_overflow_signed,0,"DISP16", false, 0,0x0000ffff, false), - HOWTO(RELOC_DISP32, 0, 2, 32, true, 0, complain_overflow_signed,0,"DISP32", false, 0,0xffffffff, false), - HOWTO(RELOC_WDISP30,2, 2, 30, true, 0, complain_overflow_signed,0,"WDISP30", false, 0,0x3fffffff, false), - HOWTO(RELOC_WDISP22,2, 2, 22, true, 0, complain_overflow_signed,0,"WDISP22", false, 0,0x003fffff, false), - HOWTO(RELOC_HI22, 10, 2, 22, false, 0, complain_overflow_bitfield,0,"HI22", false, 0,0x003fffff, false), - HOWTO(RELOC_22, 0, 2, 22, false, 0, complain_overflow_bitfield,0,"22", false, 0,0x003fffff, false), - HOWTO(RELOC_13, 0, 2, 13, false, 0, complain_overflow_bitfield,0,"13", false, 0,0x00001fff, false), - HOWTO(RELOC_LO10, 0, 2, 10, false, 0, complain_overflow_dont,0,"LO10", false, 0,0x000003ff, false), - HOWTO(RELOC_SFA_BASE,0, 2, 32, false, 0, complain_overflow_bitfield,0,"SFA_BASE", false, 0,0xffffffff, false), - HOWTO(RELOC_SFA_OFF13,0,2, 32, false, 0, complain_overflow_bitfield,0,"SFA_OFF13",false, 0,0xffffffff, false), - HOWTO(RELOC_BASE10, 0, 2, 10, false, 0, complain_overflow_dont,0,"BASE10", false, 0,0x000003ff, false), - HOWTO(RELOC_BASE13, 0, 2, 13, false, 0, complain_overflow_bitfield,0,"BASE13", false, 0,0x00001fff, false), - HOWTO(RELOC_BASE22, 10, 2, 22, false, 0, complain_overflow_bitfield,0,"BASE22", false, 0,0x003fffff, false), - HOWTO(RELOC_PC10, 0, 2, 10, true, 0, complain_overflow_dont,0,"PC10", false, 0,0x000003ff, true), - HOWTO(RELOC_PC22, 10, 2, 22, true, 0, complain_overflow_signed,0,"PC22", false, 0,0x003fffff, true), - HOWTO(RELOC_JMP_TBL,2, 2, 30, true, 0, complain_overflow_signed,0,"JMP_TBL", false, 0,0x3fffffff, false), - HOWTO(RELOC_SEGOFF16,0, 2, 0, false, 0, complain_overflow_bitfield,0,"SEGOFF16", false, 0,0x00000000, false), - HOWTO(RELOC_GLOB_DAT,0, 2, 0, false, 0, complain_overflow_bitfield,0,"GLOB_DAT", false, 0,0x00000000, false), - HOWTO(RELOC_JMP_SLOT,0, 2, 0, false, 0, complain_overflow_bitfield,0,"JMP_SLOT", false, 0,0x00000000, false), - HOWTO(RELOC_RELATIVE,0, 2, 0, false, 0, complain_overflow_bitfield,0,"RELATIVE", false, 0,0x00000000, false), -}; - -/* Convert standard reloc records to "arelent" format (incl byte swap). */ - -reloc_howto_type howto_table_std[] = { - /* type rs size bsz pcrel bitpos ovrf sf name part_inpl readmask setmask pcdone */ -HOWTO( 0, 0, 0, 8, false, 0, complain_overflow_bitfield,0,"8", true, 0x000000ff,0x000000ff, false), -HOWTO( 1, 0, 1, 16, false, 0, complain_overflow_bitfield,0,"16", true, 0x0000ffff,0x0000ffff, false), -HOWTO( 2, 0, 2, 32, false, 0, complain_overflow_bitfield,0,"32", true, 0xffffffff,0xffffffff, false), -HOWTO( 3, 0, 4, 64, false, 0, complain_overflow_bitfield,0,"64", true, 0xdeaddead,0xdeaddead, false), -HOWTO( 4, 0, 0, 8, true, 0, complain_overflow_signed, 0,"DISP8", true, 0x000000ff,0x000000ff, false), -HOWTO( 5, 0, 1, 16, true, 0, complain_overflow_signed, 0,"DISP16", true, 0x0000ffff,0x0000ffff, false), -HOWTO( 6, 0, 2, 32, true, 0, complain_overflow_signed, 0,"DISP32", true, 0xffffffff,0xffffffff, false), -HOWTO( 7, 0, 4, 64, true, 0, complain_overflow_signed, 0,"DISP64", true, 0xfeedface,0xfeedface, false), -HOWTO( 8, 0, 2, 0, false, 0, complain_overflow_bitfield,0,"GOT_REL", false, 0,0x00000000, false), -HOWTO( 9, 0, 1, 16, false, 0, complain_overflow_bitfield,0,"BASE16", false,0xffffffff,0xffffffff, false), -HOWTO(10, 0, 2, 32, false, 0, complain_overflow_bitfield,0,"BASE32", false,0xffffffff,0xffffffff, false), -{ -1 }, -{ -1 }, -{ -1 }, -{ -1 }, -{ -1 }, - HOWTO(16, 0, 2, 0, false, 0, complain_overflow_bitfield,0,"JMP_TABLE", false, 0,0x00000000, false), -{ -1 }, -{ -1 }, -{ -1 }, -{ -1 }, -{ -1 }, -{ -1 }, -{ -1 }, -{ -1 }, { -1 }, { -1 }, { -1 }, { -1 }, { -1 }, { -1 }, { -1 }, - HOWTO(32, 0, 2, 0, false, 0, complain_overflow_bitfield,0,"RELATIVE", false, 0,0x00000000, false), -{ -1 }, -{ -1 }, -{ -1 }, -{ -1 }, -{ -1 }, -{ -1 }, -{ -1 }, - HOWTO(40, 0, 2, 0, false, 0, complain_overflow_bitfield,0,"BASEREL", false, 0,0x00000000, false), -}; - -#define TABLE_SIZE(TABLE) (sizeof(TABLE)/sizeof(TABLE[0])) - -reloc_howto_type * -NAME(aout,reloc_type_lookup) (abfd,code) - bfd *abfd; - bfd_reloc_code_real_type code; -{ -#define EXT(i,j) case i: return &howto_table_ext[j] -#define STD(i,j) case i: return &howto_table_std[j] - int ext = obj_reloc_entry_size (abfd) == RELOC_EXT_SIZE; - if (code == BFD_RELOC_CTOR) - switch (bfd_get_arch_info (abfd)->bits_per_address) - { - case 32: - code = BFD_RELOC_32; - break; - case 64: - code = BFD_RELOC_64; - break; - } - if (ext) - switch (code) - { - EXT (BFD_RELOC_32, 2); - EXT (BFD_RELOC_HI22, 8); - EXT (BFD_RELOC_LO10, 11); - EXT (BFD_RELOC_32_PCREL_S2, 6); - EXT (BFD_RELOC_SPARC_WDISP22, 7); - EXT (BFD_RELOC_SPARC13, 10); - EXT (BFD_RELOC_SPARC_GOT10, 14); - EXT (BFD_RELOC_SPARC_BASE13, 15); - EXT (BFD_RELOC_SPARC_GOT13, 15); - EXT (BFD_RELOC_SPARC_GOT22, 16); - EXT (BFD_RELOC_SPARC_PC10, 17); - EXT (BFD_RELOC_SPARC_PC22, 18); - EXT (BFD_RELOC_SPARC_WPLT30, 19); - default: return (reloc_howto_type *) NULL; - } - else - /* std relocs */ - switch (code) - { - STD (BFD_RELOC_16, 1); - STD (BFD_RELOC_32, 2); - STD (BFD_RELOC_8_PCREL, 4); - STD (BFD_RELOC_16_PCREL, 5); - STD (BFD_RELOC_32_PCREL, 6); - STD (BFD_RELOC_16_BASEREL, 9); - STD (BFD_RELOC_32_BASEREL, 10); - default: return (reloc_howto_type *) NULL; - } -} - -/* -SUBSECTION - Internal entry points - -DESCRIPTION - @file{aoutx.h} exports several routines for accessing the - contents of an a.out file, which are gathered and exported in - turn by various format specific files (eg sunos.c). - -*/ - -/* -FUNCTION - aout_@var{size}_swap_exec_header_in - -SYNOPSIS - void aout_@var{size}_swap_exec_header_in, - (bfd *abfd, - struct external_exec *raw_bytes, - struct internal_exec *execp); - -DESCRIPTION - Swap the information in an executable header @var{raw_bytes} taken - from a raw byte stream memory image into the internal exec header - structure @var{execp}. -*/ - -#ifndef NAME_swap_exec_header_in -void -NAME(aout,swap_exec_header_in) (abfd, raw_bytes, execp) - bfd *abfd; - struct external_exec *raw_bytes; - struct internal_exec *execp; -{ - struct external_exec *bytes = (struct external_exec *)raw_bytes; - - /* The internal_exec structure has some fields that are unused in this - configuration (IE for i960), so ensure that all such uninitialized - fields are zero'd out. There are places where two of these structs - are memcmp'd, and thus the contents do matter. */ - memset ((PTR) execp, 0, sizeof (struct internal_exec)); - /* Now fill in fields in the execp, from the bytes in the raw data. */ - execp->a_info = bfd_h_get_32 (abfd, bytes->e_info); - execp->a_text = GET_WORD (abfd, bytes->e_text); - execp->a_data = GET_WORD (abfd, bytes->e_data); - execp->a_bss = GET_WORD (abfd, bytes->e_bss); - execp->a_syms = GET_WORD (abfd, bytes->e_syms); - execp->a_entry = GET_WORD (abfd, bytes->e_entry); - execp->a_trsize = GET_WORD (abfd, bytes->e_trsize); - execp->a_drsize = GET_WORD (abfd, bytes->e_drsize); -} -#define NAME_swap_exec_header_in NAME(aout,swap_exec_header_in) -#endif - -/* -FUNCTION - aout_@var{size}_swap_exec_header_out - -SYNOPSIS - void aout_@var{size}_swap_exec_header_out - (bfd *abfd, - struct internal_exec *execp, - struct external_exec *raw_bytes); - -DESCRIPTION - Swap the information in an internal exec header structure - @var{execp} into the buffer @var{raw_bytes} ready for writing to disk. -*/ -void -NAME(aout,swap_exec_header_out) (abfd, execp, raw_bytes) - bfd *abfd; - struct internal_exec *execp; - struct external_exec *raw_bytes; -{ - struct external_exec *bytes = (struct external_exec *)raw_bytes; - - /* Now fill in fields in the raw data, from the fields in the exec struct. */ - bfd_h_put_32 (abfd, execp->a_info , bytes->e_info); - PUT_WORD (abfd, execp->a_text , bytes->e_text); - PUT_WORD (abfd, execp->a_data , bytes->e_data); - PUT_WORD (abfd, execp->a_bss , bytes->e_bss); - PUT_WORD (abfd, execp->a_syms , bytes->e_syms); - PUT_WORD (abfd, execp->a_entry , bytes->e_entry); - PUT_WORD (abfd, execp->a_trsize, bytes->e_trsize); - PUT_WORD (abfd, execp->a_drsize, bytes->e_drsize); -} - -/* Make all the section for an a.out file. */ - -boolean -NAME(aout,make_sections) (abfd) - bfd *abfd; -{ - if (obj_textsec (abfd) == (asection *) NULL - && bfd_make_section (abfd, ".text") == (asection *) NULL) - return false; - if (obj_datasec (abfd) == (asection *) NULL - && bfd_make_section (abfd, ".data") == (asection *) NULL) - return false; - if (obj_bsssec (abfd) == (asection *) NULL - && bfd_make_section (abfd, ".bss") == (asection *) NULL) - return false; - return true; -} - -/* -FUNCTION - aout_@var{size}_some_aout_object_p - -SYNOPSIS - const bfd_target *aout_@var{size}_some_aout_object_p - (bfd *abfd, - const bfd_target *(*callback_to_real_object_p)()); - -DESCRIPTION - Some a.out variant thinks that the file open in @var{abfd} - checking is an a.out file. Do some more checking, and set up - for access if it really is. Call back to the calling - environment's "finish up" function just before returning, to - handle any last-minute setup. -*/ - -const bfd_target * -NAME(aout,some_aout_object_p) (abfd, execp, callback_to_real_object_p) - bfd *abfd; - struct internal_exec *execp; - const bfd_target *(*callback_to_real_object_p) PARAMS ((bfd *)); -{ - struct aout_data_struct *rawptr, *oldrawptr; - const bfd_target *result; - - rawptr = (struct aout_data_struct *) bfd_zalloc (abfd, sizeof (struct aout_data_struct )); - if (rawptr == NULL) - return 0; - - oldrawptr = abfd->tdata.aout_data; - abfd->tdata.aout_data = rawptr; - - /* Copy the contents of the old tdata struct. - In particular, we want the subformat, since for hpux it was set in - hp300hpux.c:swap_exec_header_in and will be used in - hp300hpux.c:callback. */ - if (oldrawptr != NULL) - *abfd->tdata.aout_data = *oldrawptr; - - abfd->tdata.aout_data->a.hdr = &rawptr->e; - *(abfd->tdata.aout_data->a.hdr) = *execp; /* Copy in the internal_exec struct */ - execp = abfd->tdata.aout_data->a.hdr; - - /* Set the file flags */ - abfd->flags = NO_FLAGS; - if (execp->a_drsize || execp->a_trsize) - abfd->flags |= HAS_RELOC; - /* Setting of EXEC_P has been deferred to the bottom of this function */ - if (execp->a_syms) - abfd->flags |= HAS_LINENO | HAS_DEBUG | HAS_SYMS | HAS_LOCALS; - if (N_DYNAMIC(*execp)) - abfd->flags |= DYNAMIC; - - if (N_MAGIC (*execp) == ZMAGIC) - { - abfd->flags |= D_PAGED | WP_TEXT; - adata (abfd).magic = z_magic; - } - else if (N_MAGIC (*execp) == QMAGIC) - { - abfd->flags |= D_PAGED | WP_TEXT; - adata (abfd).magic = z_magic; - adata (abfd).subformat = q_magic_format; - } - else if (N_MAGIC (*execp) == NMAGIC) - { - abfd->flags |= WP_TEXT; - adata (abfd).magic = n_magic; - } - else if (N_MAGIC (*execp) == OMAGIC - || N_MAGIC (*execp) == BMAGIC) - adata (abfd).magic = o_magic; - else - { - /* Should have been checked with N_BADMAG before this routine - was called. */ - abort (); - } - - bfd_get_start_address (abfd) = execp->a_entry; - - obj_aout_symbols (abfd) = (aout_symbol_type *)NULL; - bfd_get_symcount (abfd) = execp->a_syms / sizeof (struct external_nlist); - - /* The default relocation entry size is that of traditional V7 Unix. */ - obj_reloc_entry_size (abfd) = RELOC_STD_SIZE; - - /* The default symbol entry size is that of traditional Unix. */ - obj_symbol_entry_size (abfd) = EXTERNAL_NLIST_SIZE; - -#ifdef USE_MMAP - bfd_init_window (&obj_aout_sym_window (abfd)); - bfd_init_window (&obj_aout_string_window (abfd)); -#endif - obj_aout_external_syms (abfd) = NULL; - obj_aout_external_strings (abfd) = NULL; - obj_aout_sym_hashes (abfd) = NULL; - - if (! NAME(aout,make_sections) (abfd)) - return NULL; - - obj_datasec (abfd)->_raw_size = execp->a_data; - obj_bsssec (abfd)->_raw_size = execp->a_bss; - - obj_textsec (abfd)->flags = - (execp->a_trsize != 0 - ? (SEC_ALLOC | SEC_LOAD | SEC_CODE | SEC_HAS_CONTENTS | SEC_RELOC) - : (SEC_ALLOC | SEC_LOAD | SEC_CODE | SEC_HAS_CONTENTS)); - obj_datasec (abfd)->flags = - (execp->a_drsize != 0 - ? (SEC_ALLOC | SEC_LOAD | SEC_DATA | SEC_HAS_CONTENTS | SEC_RELOC) - : (SEC_ALLOC | SEC_LOAD | SEC_DATA | SEC_HAS_CONTENTS)); - obj_bsssec (abfd)->flags = SEC_ALLOC; - -#ifdef THIS_IS_ONLY_DOCUMENTATION - /* The common code can't fill in these things because they depend - on either the start address of the text segment, the rounding - up of virtual addresses between segments, or the starting file - position of the text segment -- all of which varies among different - versions of a.out. */ - - /* Call back to the format-dependent code to fill in the rest of the - fields and do any further cleanup. Things that should be filled - in by the callback: */ - - struct exec *execp = exec_hdr (abfd); - - obj_textsec (abfd)->size = N_TXTSIZE(*execp); - obj_textsec (abfd)->raw_size = N_TXTSIZE(*execp); - /* data and bss are already filled in since they're so standard */ - - /* The virtual memory addresses of the sections */ - obj_textsec (abfd)->vma = N_TXTADDR(*execp); - obj_datasec (abfd)->vma = N_DATADDR(*execp); - obj_bsssec (abfd)->vma = N_BSSADDR(*execp); - - /* The file offsets of the sections */ - obj_textsec (abfd)->filepos = N_TXTOFF(*execp); - obj_datasec (abfd)->filepos = N_DATOFF(*execp); - - /* The file offsets of the relocation info */ - obj_textsec (abfd)->rel_filepos = N_TRELOFF(*execp); - obj_datasec (abfd)->rel_filepos = N_DRELOFF(*execp); - - /* The file offsets of the string table and symbol table. */ - obj_str_filepos (abfd) = N_STROFF (*execp); - obj_sym_filepos (abfd) = N_SYMOFF (*execp); - - /* Determine the architecture and machine type of the object file. */ - switch (N_MACHTYPE (*exec_hdr (abfd))) { - default: - abfd->obj_arch = bfd_arch_obscure; - break; - } - - adata(abfd)->page_size = TARGET_PAGE_SIZE; - adata(abfd)->segment_size = SEGMENT_SIZE; - adata(abfd)->exec_bytes_size = EXEC_BYTES_SIZE; - - return abfd->xvec; - - /* The architecture is encoded in various ways in various a.out variants, - or is not encoded at all in some of them. The relocation size depends - on the architecture and the a.out variant. Finally, the return value - is the bfd_target vector in use. If an error occurs, return zero and - set bfd_error to the appropriate error code. - - Formats such as b.out, which have additional fields in the a.out - header, should cope with them in this callback as well. */ -#endif /* DOCUMENTATION */ - - result = (*callback_to_real_object_p)(abfd); - - /* Now that the segment addresses have been worked out, take a better - guess at whether the file is executable. If the entry point - is within the text segment, assume it is. (This makes files - executable even if their entry point address is 0, as long as - their text starts at zero.). */ - if ((execp->a_entry >= obj_textsec(abfd)->vma) && - (execp->a_entry < obj_textsec(abfd)->vma + obj_textsec(abfd)->_raw_size)) - abfd->flags |= EXEC_P; -#ifdef STAT_FOR_EXEC - else - { - struct stat stat_buf; - - /* The original heuristic doesn't work in some important cases. - The a.out file has no information about the text start - address. For files (like kernels) linked to non-standard - addresses (ld -Ttext nnn) the entry point may not be between - the default text start (obj_textsec(abfd)->vma) and - (obj_textsec(abfd)->vma) + text size. This is not just a mach - issue. Many kernels are loaded at non standard addresses. */ - if (abfd->iostream != NULL - && (abfd->flags & BFD_IN_MEMORY) == 0 - && (fstat(fileno((FILE *) (abfd->iostream)), &stat_buf) == 0) - && ((stat_buf.st_mode & 0111) != 0)) - abfd->flags |= EXEC_P; - } -#endif /* STAT_FOR_EXEC */ - - if (result) - { -#if 0 /* These should be set correctly anyways. */ - abfd->sections = obj_textsec (abfd); - obj_textsec (abfd)->next = obj_datasec (abfd); - obj_datasec (abfd)->next = obj_bsssec (abfd); -#endif - } - else - { - free (rawptr); - abfd->tdata.aout_data = oldrawptr; - } - return result; -} - -/* -FUNCTION - aout_@var{size}_mkobject - -SYNOPSIS - boolean aout_@var{size}_mkobject, (bfd *abfd); - -DESCRIPTION - Initialize BFD @var{abfd} for use with a.out files. -*/ - -boolean -NAME(aout,mkobject) (abfd) - bfd *abfd; -{ - struct aout_data_struct *rawptr; - - bfd_set_error (bfd_error_system_call); - - /* Use an intermediate variable for clarity */ - rawptr = (struct aout_data_struct *)bfd_zalloc (abfd, sizeof (struct aout_data_struct )); - - if (rawptr == NULL) - return false; - - abfd->tdata.aout_data = rawptr; - exec_hdr (abfd) = &(rawptr->e); - - obj_textsec (abfd) = (asection *)NULL; - obj_datasec (abfd) = (asection *)NULL; - obj_bsssec (abfd) = (asection *)NULL; - - return true; -} - - -/* -FUNCTION - aout_@var{size}_machine_type - -SYNOPSIS - enum machine_type aout_@var{size}_machine_type - (enum bfd_architecture arch, - unsigned long machine)); - -DESCRIPTION - Keep track of machine architecture and machine type for - a.out's. Return the <<machine_type>> for a particular - architecture and machine, or <<M_UNKNOWN>> if that exact architecture - and machine can't be represented in a.out format. - - If the architecture is understood, machine type 0 (default) - is always understood. -*/ - -enum machine_type -NAME(aout,machine_type) (arch, machine, unknown) - enum bfd_architecture arch; - unsigned long machine; - boolean *unknown; -{ - enum machine_type arch_flags; - - arch_flags = M_UNKNOWN; - *unknown = true; - - switch (arch) { - case bfd_arch_sparc: - if (machine == 0 - || machine == bfd_mach_sparc - || machine == bfd_mach_sparc_v9) - arch_flags = M_SPARC; - break; - - case bfd_arch_m68k: - switch (machine) { - case 0: arch_flags = M_68010; break; - case 68000: arch_flags = M_UNKNOWN; *unknown = false; break; - case 68010: arch_flags = M_68010; break; - case 68020: arch_flags = M_68020; break; - default: arch_flags = M_UNKNOWN; break; - } - break; - - case bfd_arch_i386: - if (machine == 0) arch_flags = M_386; - break; - - case bfd_arch_a29k: - if (machine == 0) arch_flags = M_29K; - break; - - case bfd_arch_arm: - if (machine == 0) arch_flags = M_ARM; - break; - - case bfd_arch_mips: - switch (machine) { - case 0: - case 2000: - case 3000: arch_flags = M_MIPS1; break; - case 4000: /* mips3 */ - case 4400: - case 8000: /* mips4 */ - /* real mips2: */ - case 6000: arch_flags = M_MIPS2; break; - default: arch_flags = M_UNKNOWN; break; - } - break; - - case bfd_arch_ns32k: - switch (machine) { - case 0: arch_flags = M_NS32532; break; - case 32032: arch_flags = M_NS32032; break; - case 32532: arch_flags = M_NS32532; break; - default: arch_flags = M_UNKNOWN; break; - } - break; - - case bfd_arch_vax: - *unknown = false; - break; - - - default: - arch_flags = M_UNKNOWN; - } - - if (arch_flags != M_UNKNOWN) - *unknown = false; - - return arch_flags; -} - - -/* -FUNCTION - aout_@var{size}_set_arch_mach - -SYNOPSIS - boolean aout_@var{size}_set_arch_mach, - (bfd *, - enum bfd_architecture arch, - unsigned long machine)); - -DESCRIPTION - Set the architecture and the machine of the BFD @var{abfd} to the - values @var{arch} and @var{machine}. Verify that @var{abfd}'s format - can support the architecture required. -*/ - -boolean -NAME(aout,set_arch_mach) (abfd, arch, machine) - bfd *abfd; - enum bfd_architecture arch; - unsigned long machine; -{ - if (! bfd_default_set_arch_mach (abfd, arch, machine)) - return false; - - if (arch != bfd_arch_unknown) - { - boolean unknown; - - NAME(aout,machine_type) (arch, machine, &unknown); - if (unknown) - return false; - } - - /* Determine the size of a relocation entry */ - switch (arch) { - case bfd_arch_sparc: - case bfd_arch_a29k: - case bfd_arch_mips: - obj_reloc_entry_size (abfd) = RELOC_EXT_SIZE; - break; - default: - obj_reloc_entry_size (abfd) = RELOC_STD_SIZE; - break; - } - - return (*aout_backend_info(abfd)->set_sizes) (abfd); -} - -static void -adjust_o_magic (abfd, execp) - bfd *abfd; - struct internal_exec *execp; -{ - file_ptr pos = adata (abfd).exec_bytes_size; - bfd_vma vma = 0; - int pad = 0; - - /* Text. */ - obj_textsec(abfd)->filepos = pos; - if (!obj_textsec(abfd)->user_set_vma) - obj_textsec(abfd)->vma = vma; - else - vma = obj_textsec(abfd)->vma; - - pos += obj_textsec(abfd)->_raw_size; - vma += obj_textsec(abfd)->_raw_size; - - /* Data. */ - if (!obj_datasec(abfd)->user_set_vma) - { -#if 0 /* ?? Does alignment in the file image really matter? */ - pad = align_power (vma, obj_datasec(abfd)->alignment_power) - vma; -#endif - obj_textsec(abfd)->_raw_size += pad; - pos += pad; - vma += pad; - obj_datasec(abfd)->vma = vma; - } - else - vma = obj_datasec(abfd)->vma; - obj_datasec(abfd)->filepos = pos; - pos += obj_datasec(abfd)->_raw_size; - vma += obj_datasec(abfd)->_raw_size; - - /* BSS. */ - if (!obj_bsssec(abfd)->user_set_vma) - { -#if 0 - pad = align_power (vma, obj_bsssec(abfd)->alignment_power) - vma; -#endif - obj_datasec(abfd)->_raw_size += pad; - pos += pad; - vma += pad; - obj_bsssec(abfd)->vma = vma; - } - else - { - /* The VMA of the .bss section is set by the the VMA of the - .data section plus the size of the .data section. We may - need to add padding bytes to make this true. */ - pad = obj_bsssec (abfd)->vma - vma; - if (pad > 0) - { - obj_datasec (abfd)->_raw_size += pad; - pos += pad; - } - } - obj_bsssec(abfd)->filepos = pos; - - /* Fix up the exec header. */ - execp->a_text = obj_textsec(abfd)->_raw_size; - execp->a_data = obj_datasec(abfd)->_raw_size; - execp->a_bss = obj_bsssec(abfd)->_raw_size; - N_SET_MAGIC (*execp, OMAGIC); -} - -static void -adjust_z_magic (abfd, execp) - bfd *abfd; - struct internal_exec *execp; -{ - bfd_size_type data_pad, text_pad; - file_ptr text_end; - CONST struct aout_backend_data *abdp; - int ztih; /* Nonzero if text includes exec header. */ - - abdp = aout_backend_info (abfd); - - /* Text. */ - ztih = (abdp != NULL - && (abdp->text_includes_header - || obj_aout_subformat (abfd) == q_magic_format)); - obj_textsec(abfd)->filepos = (ztih - ? adata(abfd).exec_bytes_size - : adata(abfd).zmagic_disk_block_size); - if (! obj_textsec(abfd)->user_set_vma) - { - /* ?? Do we really need to check for relocs here? */ - obj_textsec(abfd)->vma = ((abfd->flags & HAS_RELOC) - ? 0 - : (ztih - ? (abdp->default_text_vma - + adata(abfd).exec_bytes_size) - : abdp->default_text_vma)); - text_pad = 0; - } - else - { - /* The .text section is being loaded at an unusual address. We - may need to pad it such that the .data section starts at a page - boundary. */ - if (ztih) - text_pad = ((obj_textsec (abfd)->filepos - obj_textsec (abfd)->vma) - & (adata (abfd).page_size - 1)); - else - text_pad = ((- obj_textsec (abfd)->vma) - & (adata (abfd).page_size - 1)); - } - - /* Find start of data. */ - if (ztih) - { - text_end = obj_textsec (abfd)->filepos + obj_textsec (abfd)->_raw_size; - text_pad += BFD_ALIGN (text_end, adata (abfd).page_size) - text_end; - } - else - { - /* Note that if page_size == zmagic_disk_block_size, then - filepos == page_size, and this case is the same as the ztih - case. */ - text_end = obj_textsec (abfd)->_raw_size; - text_pad += BFD_ALIGN (text_end, adata (abfd).page_size) - text_end; - text_end += obj_textsec (abfd)->filepos; - } - obj_textsec(abfd)->_raw_size += text_pad; - text_end += text_pad; - - /* Data. */ - if (!obj_datasec(abfd)->user_set_vma) - { - bfd_vma vma; - vma = obj_textsec(abfd)->vma + obj_textsec(abfd)->_raw_size; - obj_datasec(abfd)->vma = BFD_ALIGN (vma, adata(abfd).segment_size); - } - if (abdp && abdp->zmagic_mapped_contiguous) - { - text_pad = (obj_datasec(abfd)->vma - - obj_textsec(abfd)->vma - - obj_textsec(abfd)->_raw_size); - obj_textsec(abfd)->_raw_size += text_pad; - } - obj_datasec(abfd)->filepos = (obj_textsec(abfd)->filepos - + obj_textsec(abfd)->_raw_size); - - /* Fix up exec header while we're at it. */ - execp->a_text = obj_textsec(abfd)->_raw_size; - if (ztih && (!abdp || (abdp && !abdp->exec_header_not_counted))) - execp->a_text += adata(abfd).exec_bytes_size; - if (obj_aout_subformat (abfd) == q_magic_format) - N_SET_MAGIC (*execp, QMAGIC); - else - N_SET_MAGIC (*execp, ZMAGIC); - - /* Spec says data section should be rounded up to page boundary. */ - obj_datasec(abfd)->_raw_size - = align_power (obj_datasec(abfd)->_raw_size, - obj_bsssec(abfd)->alignment_power); - execp->a_data = BFD_ALIGN (obj_datasec(abfd)->_raw_size, - adata(abfd).page_size); - data_pad = execp->a_data - obj_datasec(abfd)->_raw_size; - - /* BSS. */ - if (!obj_bsssec(abfd)->user_set_vma) - obj_bsssec(abfd)->vma = (obj_datasec(abfd)->vma - + obj_datasec(abfd)->_raw_size); - /* If the BSS immediately follows the data section and extra space - in the page is left after the data section, fudge data - in the header so that the bss section looks smaller by that - amount. We'll start the bss section there, and lie to the OS. - (Note that a linker script, as well as the above assignment, - could have explicitly set the BSS vma to immediately follow - the data section.) */ - if (align_power (obj_bsssec(abfd)->vma, obj_bsssec(abfd)->alignment_power) - == obj_datasec(abfd)->vma + obj_datasec(abfd)->_raw_size) - execp->a_bss = (data_pad > obj_bsssec(abfd)->_raw_size) ? 0 : - obj_bsssec(abfd)->_raw_size - data_pad; - else - execp->a_bss = obj_bsssec(abfd)->_raw_size; -} - -static void -adjust_n_magic (abfd, execp) - bfd *abfd; - struct internal_exec *execp; -{ - file_ptr pos = adata(abfd).exec_bytes_size; - bfd_vma vma = 0; - int pad; - - /* Text. */ - obj_textsec(abfd)->filepos = pos; - if (!obj_textsec(abfd)->user_set_vma) - obj_textsec(abfd)->vma = vma; - else - vma = obj_textsec(abfd)->vma; - pos += obj_textsec(abfd)->_raw_size; - vma += obj_textsec(abfd)->_raw_size; - - /* Data. */ - obj_datasec(abfd)->filepos = pos; - if (!obj_datasec(abfd)->user_set_vma) - obj_datasec(abfd)->vma = BFD_ALIGN (vma, adata(abfd).segment_size); - vma = obj_datasec(abfd)->vma; - - /* Since BSS follows data immediately, see if it needs alignment. */ - vma += obj_datasec(abfd)->_raw_size; - pad = align_power (vma, obj_bsssec(abfd)->alignment_power) - vma; - obj_datasec(abfd)->_raw_size += pad; - pos += obj_datasec(abfd)->_raw_size; - - /* BSS. */ - if (!obj_bsssec(abfd)->user_set_vma) - obj_bsssec(abfd)->vma = vma; - else - vma = obj_bsssec(abfd)->vma; - - /* Fix up exec header. */ - execp->a_text = obj_textsec(abfd)->_raw_size; - execp->a_data = obj_datasec(abfd)->_raw_size; - execp->a_bss = obj_bsssec(abfd)->_raw_size; - N_SET_MAGIC (*execp, NMAGIC); -} - -boolean -NAME(aout,adjust_sizes_and_vmas) (abfd, text_size, text_end) - bfd *abfd; - bfd_size_type *text_size; - file_ptr *text_end; -{ - struct internal_exec *execp = exec_hdr (abfd); - - if (! NAME(aout,make_sections) (abfd)) - return false; - - if (adata(abfd).magic != undecided_magic) - return true; - - obj_textsec(abfd)->_raw_size = - align_power(obj_textsec(abfd)->_raw_size, - obj_textsec(abfd)->alignment_power); - - *text_size = obj_textsec (abfd)->_raw_size; - /* Rule (heuristic) for when to pad to a new page. Note that there - are (at least) two ways demand-paged (ZMAGIC) files have been - handled. Most Berkeley-based systems start the text segment at - (TARGET_PAGE_SIZE). However, newer versions of SUNOS start the text - segment right after the exec header; the latter is counted in the - text segment size, and is paged in by the kernel with the rest of - the text. */ - - /* This perhaps isn't the right way to do this, but made it simpler for me - to understand enough to implement it. Better would probably be to go - right from BFD flags to alignment/positioning characteristics. But the - old code was sloppy enough about handling the flags, and had enough - other magic, that it was a little hard for me to understand. I think - I understand it better now, but I haven't time to do the cleanup this - minute. */ - - if (abfd->flags & D_PAGED) - /* Whether or not WP_TEXT is set -- let D_PAGED override. */ - adata(abfd).magic = z_magic; - else if (abfd->flags & WP_TEXT) - adata(abfd).magic = n_magic; - else - adata(abfd).magic = o_magic; - -#ifdef BFD_AOUT_DEBUG /* requires gcc2 */ -#if __GNUC__ >= 2 - fprintf (stderr, "%s text=<%x,%x,%x> data=<%x,%x,%x> bss=<%x,%x,%x>\n", - ({ char *str; - switch (adata(abfd).magic) { - case n_magic: str = "NMAGIC"; break; - case o_magic: str = "OMAGIC"; break; - case z_magic: str = "ZMAGIC"; break; - default: abort (); - } - str; - }), - obj_textsec(abfd)->vma, obj_textsec(abfd)->_raw_size, - obj_textsec(abfd)->alignment_power, - obj_datasec(abfd)->vma, obj_datasec(abfd)->_raw_size, - obj_datasec(abfd)->alignment_power, - obj_bsssec(abfd)->vma, obj_bsssec(abfd)->_raw_size, - obj_bsssec(abfd)->alignment_power); -#endif -#endif - - switch (adata(abfd).magic) - { - case o_magic: - adjust_o_magic (abfd, execp); - break; - case z_magic: - adjust_z_magic (abfd, execp); - break; - case n_magic: - adjust_n_magic (abfd, execp); - break; - default: - abort (); - } - -#ifdef BFD_AOUT_DEBUG - fprintf (stderr, " text=<%x,%x,%x> data=<%x,%x,%x> bss=<%x,%x>\n", - obj_textsec(abfd)->vma, obj_textsec(abfd)->_raw_size, - obj_textsec(abfd)->filepos, - obj_datasec(abfd)->vma, obj_datasec(abfd)->_raw_size, - obj_datasec(abfd)->filepos, - obj_bsssec(abfd)->vma, obj_bsssec(abfd)->_raw_size); -#endif - - return true; -} - -/* -FUNCTION - aout_@var{size}_new_section_hook - -SYNOPSIS - boolean aout_@var{size}_new_section_hook, - (bfd *abfd, - asection *newsect)); - -DESCRIPTION - Called by the BFD in response to a @code{bfd_make_section} - request. -*/ -boolean -NAME(aout,new_section_hook) (abfd, newsect) - bfd *abfd; - asection *newsect; -{ - /* align to double at least */ - newsect->alignment_power = bfd_get_arch_info(abfd)->section_align_power; - - - if (bfd_get_format (abfd) == bfd_object) - { - if (obj_textsec(abfd) == NULL && !strcmp(newsect->name, ".text")) { - obj_textsec(abfd)= newsect; - newsect->target_index = N_TEXT; - return true; - } - - if (obj_datasec(abfd) == NULL && !strcmp(newsect->name, ".data")) { - obj_datasec(abfd) = newsect; - newsect->target_index = N_DATA; - return true; - } - - if (obj_bsssec(abfd) == NULL && !strcmp(newsect->name, ".bss")) { - obj_bsssec(abfd) = newsect; - newsect->target_index = N_BSS; - return true; - } - - } - - /* We allow more than three sections internally */ - return true; -} - -boolean -NAME(aout,set_section_contents) (abfd, section, location, offset, count) - bfd *abfd; - sec_ptr section; - PTR location; - file_ptr offset; - bfd_size_type count; -{ - file_ptr text_end; - bfd_size_type text_size; - - if (! abfd->output_has_begun) - { - if (! NAME(aout,adjust_sizes_and_vmas) (abfd, &text_size, &text_end)) - return false; - } - - if (section == obj_bsssec (abfd)) - { - bfd_set_error (bfd_error_no_contents); - return false; - } - - if (section != obj_textsec (abfd) - && section != obj_datasec (abfd)) - { - (*_bfd_error_handler) - ("%s: can not represent section `%s' in a.out object file format", - bfd_get_filename (abfd), bfd_get_section_name (abfd, section)); - bfd_set_error (bfd_error_nonrepresentable_section); - return false; - } - - if (count != 0) - { - if (bfd_seek (abfd, section->filepos + offset, SEEK_SET) != 0 - || bfd_write (location, 1, count, abfd) != count) - return false; - } - - return true; -} - -/* Read the external symbols from an a.out file. */ - -static boolean -aout_get_external_symbols (abfd) - bfd *abfd; -{ - if (obj_aout_external_syms (abfd) == (struct external_nlist *) NULL) - { - bfd_size_type count; - struct external_nlist *syms; - - count = exec_hdr (abfd)->a_syms / EXTERNAL_NLIST_SIZE; - -#ifdef USE_MMAP - if (bfd_get_file_window (abfd, - obj_sym_filepos (abfd), exec_hdr (abfd)->a_syms, - &obj_aout_sym_window (abfd), true) == false) - return false; - syms = (struct external_nlist *) obj_aout_sym_window (abfd).data; -#else - /* We allocate using malloc to make the values easy to free - later on. If we put them on the obstack it might not be - possible to free them. */ - syms = ((struct external_nlist *) - bfd_malloc ((size_t) count * EXTERNAL_NLIST_SIZE)); - if (syms == (struct external_nlist *) NULL && count != 0) - return false; - - if (bfd_seek (abfd, obj_sym_filepos (abfd), SEEK_SET) != 0 - || (bfd_read (syms, 1, exec_hdr (abfd)->a_syms, abfd) - != exec_hdr (abfd)->a_syms)) - { - free (syms); - return false; - } -#endif - - obj_aout_external_syms (abfd) = syms; - obj_aout_external_sym_count (abfd) = count; - } - - if (obj_aout_external_strings (abfd) == NULL - && exec_hdr (abfd)->a_syms != 0) - { - unsigned char string_chars[BYTES_IN_WORD]; - bfd_size_type stringsize; - char *strings; - - /* Get the size of the strings. */ - if (bfd_seek (abfd, obj_str_filepos (abfd), SEEK_SET) != 0 - || (bfd_read ((PTR) string_chars, BYTES_IN_WORD, 1, abfd) - != BYTES_IN_WORD)) - return false; - stringsize = GET_WORD (abfd, string_chars); - -#ifdef USE_MMAP - if (bfd_get_file_window (abfd, obj_str_filepos (abfd), stringsize, - &obj_aout_string_window (abfd), true) == false) - return false; - strings = (char *) obj_aout_string_window (abfd).data; -#else - strings = (char *) bfd_malloc ((size_t) stringsize + 1); - if (strings == NULL) - return false; - - /* Skip space for the string count in the buffer for convenience - when using indexes. */ - if (bfd_read (strings + BYTES_IN_WORD, 1, stringsize - BYTES_IN_WORD, - abfd) - != stringsize - BYTES_IN_WORD) - { - free (strings); - return false; - } -#endif - - /* Ensure that a zero index yields an empty string. */ - strings[0] = '\0'; - - strings[stringsize - 1] = 0; - - obj_aout_external_strings (abfd) = strings; - obj_aout_external_string_size (abfd) = stringsize; - } - - return true; -} - -/* Translate an a.out symbol into a BFD symbol. The desc, other, type - and symbol->value fields of CACHE_PTR will be set from the a.out - nlist structure. This function is responsible for setting - symbol->flags and symbol->section, and adjusting symbol->value. */ - -static boolean -translate_from_native_sym_flags (abfd, cache_ptr) - bfd *abfd; - aout_symbol_type *cache_ptr; -{ - flagword visible; - - if ((cache_ptr->type & N_STAB) != 0 - || cache_ptr->type == N_FN) - { - asection *sec; - - /* This is a debugging symbol. */ - - cache_ptr->symbol.flags = BSF_DEBUGGING; - - /* Work out the symbol section. */ - switch (cache_ptr->type & N_TYPE) - { - case N_TEXT: - case N_FN: - sec = obj_textsec (abfd); - break; - case N_DATA: - sec = obj_datasec (abfd); - break; - case N_BSS: - sec = obj_bsssec (abfd); - break; - default: - case N_ABS: - sec = bfd_abs_section_ptr; - break; - } - - cache_ptr->symbol.section = sec; - cache_ptr->symbol.value -= sec->vma; - - return true; - } - - /* Get the default visibility. This does not apply to all types, so - we just hold it in a local variable to use if wanted. */ - if ((cache_ptr->type & N_EXT) == 0) - visible = BSF_LOCAL; - else - visible = BSF_GLOBAL; - - switch (cache_ptr->type) - { - default: - case N_ABS: case N_ABS | N_EXT: - cache_ptr->symbol.section = bfd_abs_section_ptr; - cache_ptr->symbol.flags = visible; - break; - - case N_UNDF | N_EXT: - if (cache_ptr->symbol.value != 0) - { - /* This is a common symbol. */ - cache_ptr->symbol.flags = BSF_GLOBAL; - cache_ptr->symbol.section = bfd_com_section_ptr; - } - else - { - cache_ptr->symbol.flags = 0; - cache_ptr->symbol.section = bfd_und_section_ptr; - } - break; - - case N_TEXT: case N_TEXT | N_EXT: - cache_ptr->symbol.section = obj_textsec (abfd); - cache_ptr->symbol.value -= cache_ptr->symbol.section->vma; - cache_ptr->symbol.flags = visible; - break; - - /* N_SETV symbols used to represent set vectors placed in the - data section. They are no longer generated. Theoretically, - it was possible to extract the entries and combine them with - new ones, although I don't know if that was ever actually - done. Unless that feature is restored, treat them as data - symbols. */ - case N_SETV: case N_SETV | N_EXT: - case N_DATA: case N_DATA | N_EXT: - cache_ptr->symbol.section = obj_datasec (abfd); - cache_ptr->symbol.value -= cache_ptr->symbol.section->vma; - cache_ptr->symbol.flags = visible; - break; - - case N_BSS: case N_BSS | N_EXT: - cache_ptr->symbol.section = obj_bsssec (abfd); - cache_ptr->symbol.value -= cache_ptr->symbol.section->vma; - cache_ptr->symbol.flags = visible; - break; - - case N_SETA: case N_SETA | N_EXT: - case N_SETT: case N_SETT | N_EXT: - case N_SETD: case N_SETD | N_EXT: - case N_SETB: case N_SETB | N_EXT: - { - asection *section; - arelent_chain *reloc; - asection *into_section; - - /* This is a set symbol. The name of the symbol is the name - of the set (e.g., __CTOR_LIST__). The value of the symbol - is the value to add to the set. We create a section with - the same name as the symbol, and add a reloc to insert the - appropriate value into the section. - - This action is actually obsolete; it used to make the - linker do the right thing, but the linker no longer uses - this function. */ - - section = bfd_get_section_by_name (abfd, cache_ptr->symbol.name); - if (section == NULL) - { - char *copy; - - copy = bfd_alloc (abfd, strlen (cache_ptr->symbol.name) + 1); - if (copy == NULL) - return false; - - strcpy (copy, cache_ptr->symbol.name); - section = bfd_make_section (abfd, copy); - if (section == NULL) - return false; - } - - reloc = (arelent_chain *) bfd_alloc (abfd, sizeof (arelent_chain)); - if (reloc == NULL) - return false; - - /* Build a relocation entry for the constructor. */ - switch (cache_ptr->type & N_TYPE) - { - case N_SETA: - into_section = bfd_abs_section_ptr; - cache_ptr->type = N_ABS; - break; - case N_SETT: - into_section = obj_textsec (abfd); - cache_ptr->type = N_TEXT; - break; - case N_SETD: - into_section = obj_datasec (abfd); - cache_ptr->type = N_DATA; - break; - case N_SETB: - into_section = obj_bsssec (abfd); - cache_ptr->type = N_BSS; - break; - } - - /* Build a relocation pointing into the constructor section - pointing at the symbol in the set vector specified. */ - reloc->relent.addend = cache_ptr->symbol.value; - cache_ptr->symbol.section = into_section; - reloc->relent.sym_ptr_ptr = into_section->symbol_ptr_ptr; - - /* We modify the symbol to belong to a section depending upon - the name of the symbol, and add to the size of the section - to contain a pointer to the symbol. Build a reloc entry to - relocate to this symbol attached to this section. */ - section->flags = SEC_CONSTRUCTOR | SEC_RELOC; - - section->reloc_count++; - section->alignment_power = 2; - - reloc->next = section->constructor_chain; - section->constructor_chain = reloc; - reloc->relent.address = section->_raw_size; - section->_raw_size += BYTES_IN_WORD; - - reloc->relent.howto = CTOR_TABLE_RELOC_HOWTO(abfd); - - cache_ptr->symbol.flags |= BSF_CONSTRUCTOR; - } - break; - - case N_WARNING: - /* This symbol is the text of a warning message. The next - symbol is the symbol to associate the warning with. If a - reference is made to that symbol, a warning is issued. */ - cache_ptr->symbol.flags = BSF_DEBUGGING | BSF_WARNING; - cache_ptr->symbol.section = bfd_abs_section_ptr; - break; - - case N_INDR: case N_INDR | N_EXT: - /* An indirect symbol. This consists of two symbols in a row. - The first symbol is the name of the indirection. The second - symbol is the name of the target. A reference to the first - symbol becomes a reference to the second. */ - cache_ptr->symbol.flags = BSF_DEBUGGING | BSF_INDIRECT | visible; - cache_ptr->symbol.section = bfd_ind_section_ptr; - break; - - case N_WEAKU: - cache_ptr->symbol.section = bfd_und_section_ptr; - cache_ptr->symbol.flags = BSF_WEAK; - break; - - case N_WEAKA: - cache_ptr->symbol.section = bfd_abs_section_ptr; - cache_ptr->symbol.flags = BSF_WEAK; - break; - - case N_WEAKT: - cache_ptr->symbol.section = obj_textsec (abfd); - cache_ptr->symbol.value -= cache_ptr->symbol.section->vma; - cache_ptr->symbol.flags = BSF_WEAK; - break; - - case N_WEAKD: - cache_ptr->symbol.section = obj_datasec (abfd); - cache_ptr->symbol.value -= cache_ptr->symbol.section->vma; - cache_ptr->symbol.flags = BSF_WEAK; - break; - - case N_WEAKB: - cache_ptr->symbol.section = obj_bsssec (abfd); - cache_ptr->symbol.value -= cache_ptr->symbol.section->vma; - cache_ptr->symbol.flags = BSF_WEAK; - break; - } - - return true; -} - -/* Set the fields of SYM_POINTER according to CACHE_PTR. */ - -static boolean -translate_to_native_sym_flags (abfd, cache_ptr, sym_pointer) - bfd *abfd; - asymbol *cache_ptr; - struct external_nlist *sym_pointer; -{ - bfd_vma value = cache_ptr->value; - asection *sec; - bfd_vma off; - - /* Mask out any existing type bits in case copying from one section - to another. */ - sym_pointer->e_type[0] &= ~N_TYPE; - - sec = bfd_get_section (cache_ptr); - off = 0; - - if (sec == NULL) - { - /* This case occurs, e.g., for the *DEBUG* section of a COFF - file. */ - (*_bfd_error_handler) - ("%s: can not represent section `%s' in a.out object file format", - bfd_get_filename (abfd), bfd_get_section_name (abfd, sec)); - bfd_set_error (bfd_error_nonrepresentable_section); - return false; - } - - if (sec->output_section != NULL) - { - off = sec->output_offset; - sec = sec->output_section; - } - - if (bfd_is_abs_section (sec)) - sym_pointer->e_type[0] |= N_ABS; - else if (sec == obj_textsec (abfd)) - sym_pointer->e_type[0] |= N_TEXT; - else if (sec == obj_datasec (abfd)) - sym_pointer->e_type[0] |= N_DATA; - else if (sec == obj_bsssec (abfd)) - sym_pointer->e_type[0] |= N_BSS; - else if (bfd_is_und_section (sec)) - sym_pointer->e_type[0] = N_UNDF | N_EXT; - else if (bfd_is_ind_section (sec)) - sym_pointer->e_type[0] = N_INDR; - else if (bfd_is_com_section (sec)) - sym_pointer->e_type[0] = N_UNDF | N_EXT; - else - { - (*_bfd_error_handler) - ("%s: can not represent section `%s' in a.out object file format", - bfd_get_filename (abfd), bfd_get_section_name (abfd, sec)); - bfd_set_error (bfd_error_nonrepresentable_section); - return false; - } - - /* Turn the symbol from section relative to absolute again */ - value += sec->vma + off; - - if ((cache_ptr->flags & BSF_WARNING) != 0) - sym_pointer->e_type[0] = N_WARNING; - - if ((cache_ptr->flags & BSF_DEBUGGING) != 0) - sym_pointer->e_type[0] = ((aout_symbol_type *) cache_ptr)->type; - else if ((cache_ptr->flags & BSF_GLOBAL) != 0) - sym_pointer->e_type[0] |= N_EXT; - - if ((cache_ptr->flags & BSF_CONSTRUCTOR) != 0) - { - int type = ((aout_symbol_type *) cache_ptr)->type; - switch (type) - { - case N_ABS: type = N_SETA; break; - case N_TEXT: type = N_SETT; break; - case N_DATA: type = N_SETD; break; - case N_BSS: type = N_SETB; break; - } - sym_pointer->e_type[0] = type; - } - - if ((cache_ptr->flags & BSF_WEAK) != 0) - { - int type; - - switch (sym_pointer->e_type[0] & N_TYPE) - { - default: - case N_ABS: type = N_WEAKA; break; - case N_TEXT: type = N_WEAKT; break; - case N_DATA: type = N_WEAKD; break; - case N_BSS: type = N_WEAKB; break; - case N_UNDF: type = N_WEAKU; break; - } - sym_pointer->e_type[0] = type; - } - - PUT_WORD(abfd, value, sym_pointer->e_value); - - return true; -} - -/* Native-level interface to symbols. */ - -asymbol * -NAME(aout,make_empty_symbol) (abfd) - bfd *abfd; -{ - aout_symbol_type *new = - (aout_symbol_type *)bfd_zalloc (abfd, sizeof (aout_symbol_type)); - if (!new) - return NULL; - new->symbol.the_bfd = abfd; - - return &new->symbol; -} - -/* Translate a set of internal symbols into external symbols. */ - -boolean -NAME(aout,translate_symbol_table) (abfd, in, ext, count, str, strsize, dynamic) - bfd *abfd; - aout_symbol_type *in; - struct external_nlist *ext; - bfd_size_type count; - char *str; - bfd_size_type strsize; - boolean dynamic; -{ - struct external_nlist *ext_end; - - ext_end = ext + count; - for (; ext < ext_end; ext++, in++) - { - bfd_vma x; - - x = GET_WORD (abfd, ext->e_strx); - in->symbol.the_bfd = abfd; - - /* For the normal symbols, the zero index points at the number - of bytes in the string table but is to be interpreted as the - null string. For the dynamic symbols, the number of bytes in - the string table is stored in the __DYNAMIC structure and the - zero index points at an actual string. */ - if (x == 0 && ! dynamic) - in->symbol.name = ""; - else if (x < strsize) - in->symbol.name = str + x; - else - return false; - - in->symbol.value = GET_SWORD (abfd, ext->e_value); - in->desc = bfd_h_get_16 (abfd, ext->e_desc); - in->other = bfd_h_get_8 (abfd, ext->e_other); - in->type = bfd_h_get_8 (abfd, ext->e_type); - in->symbol.udata.p = NULL; - - if (! translate_from_native_sym_flags (abfd, in)) - return false; - - if (dynamic) - in->symbol.flags |= BSF_DYNAMIC; - } - - return true; -} - -/* We read the symbols into a buffer, which is discarded when this - function exits. We read the strings into a buffer large enough to - hold them all plus all the cached symbol entries. */ - -boolean -NAME(aout,slurp_symbol_table) (abfd) - bfd *abfd; -{ - struct external_nlist *old_external_syms; - aout_symbol_type *cached; - size_t cached_size; - - /* If there's no work to be done, don't do any */ - if (obj_aout_symbols (abfd) != (aout_symbol_type *) NULL) - return true; - - old_external_syms = obj_aout_external_syms (abfd); - - if (! aout_get_external_symbols (abfd)) - return false; - - cached_size = (obj_aout_external_sym_count (abfd) - * sizeof (aout_symbol_type)); - cached = (aout_symbol_type *) bfd_malloc (cached_size); - if (cached == NULL && cached_size != 0) - return false; - if (cached_size != 0) - memset (cached, 0, cached_size); - - /* Convert from external symbol information to internal. */ - if (! (NAME(aout,translate_symbol_table) - (abfd, cached, - obj_aout_external_syms (abfd), - obj_aout_external_sym_count (abfd), - obj_aout_external_strings (abfd), - obj_aout_external_string_size (abfd), - false))) - { - free (cached); - return false; - } - - bfd_get_symcount (abfd) = obj_aout_external_sym_count (abfd); - - obj_aout_symbols (abfd) = cached; - - /* It is very likely that anybody who calls this function will not - want the external symbol information, so if it was allocated - because of our call to aout_get_external_symbols, we free it up - right away to save space. */ - if (old_external_syms == (struct external_nlist *) NULL - && obj_aout_external_syms (abfd) != (struct external_nlist *) NULL) - { -#ifdef USE_MMAP - bfd_free_window (&obj_aout_sym_window (abfd)); -#else - free (obj_aout_external_syms (abfd)); -#endif - obj_aout_external_syms (abfd) = NULL; - } - - return true; -} - -/* We use a hash table when writing out symbols so that we only write - out a particular string once. This helps particularly when the - linker writes out stabs debugging entries, because each different - contributing object file tends to have many duplicate stabs - strings. - - This hash table code breaks dbx on SunOS 4.1.3, so we don't do it - if BFD_TRADITIONAL_FORMAT is set. */ - -static bfd_size_type add_to_stringtab - PARAMS ((bfd *, struct bfd_strtab_hash *, const char *, boolean)); -static boolean emit_stringtab PARAMS ((bfd *, struct bfd_strtab_hash *)); - -/* Get the index of a string in a strtab, adding it if it is not - already present. */ - -static INLINE bfd_size_type -add_to_stringtab (abfd, tab, str, copy) - bfd *abfd; - struct bfd_strtab_hash *tab; - const char *str; - boolean copy; -{ - boolean hash; - bfd_size_type index; - - /* An index of 0 always means the empty string. */ - if (str == 0 || *str == '\0') - return 0; - - /* Don't hash if BFD_TRADITIONAL_FORMAT is set, because SunOS dbx - doesn't understand a hashed string table. */ - hash = true; - if ((abfd->flags & BFD_TRADITIONAL_FORMAT) != 0) - hash = false; - - index = _bfd_stringtab_add (tab, str, hash, copy); - - if (index != (bfd_size_type) -1) - { - /* Add BYTES_IN_WORD to the return value to account for the - space taken up by the string table size. */ - index += BYTES_IN_WORD; - } - - return index; -} - -/* Write out a strtab. ABFD is already at the right location in the - file. */ - -static boolean -emit_stringtab (abfd, tab) - register bfd *abfd; - struct bfd_strtab_hash *tab; -{ - bfd_byte buffer[BYTES_IN_WORD]; - - /* The string table starts with the size. */ - PUT_WORD (abfd, _bfd_stringtab_size (tab) + BYTES_IN_WORD, buffer); - if (bfd_write ((PTR) buffer, 1, BYTES_IN_WORD, abfd) != BYTES_IN_WORD) - return false; - - return _bfd_stringtab_emit (abfd, tab); -} - -boolean -NAME(aout,write_syms) (abfd) - bfd *abfd; -{ - unsigned int count ; - asymbol **generic = bfd_get_outsymbols (abfd); - struct bfd_strtab_hash *strtab; - - strtab = _bfd_stringtab_init (); - if (strtab == NULL) - return false; - - for (count = 0; count < bfd_get_symcount (abfd); count++) - { - asymbol *g = generic[count]; - bfd_size_type indx; - struct external_nlist nsp; - - indx = add_to_stringtab (abfd, strtab, g->name, false); - if (indx == (bfd_size_type) -1) - goto error_return; - PUT_WORD (abfd, indx, (bfd_byte *) nsp.e_strx); - - if (bfd_asymbol_flavour(g) == abfd->xvec->flavour) - { - bfd_h_put_16(abfd, aout_symbol(g)->desc, nsp.e_desc); - bfd_h_put_8(abfd, aout_symbol(g)->other, nsp.e_other); - bfd_h_put_8(abfd, aout_symbol(g)->type, nsp.e_type); - } - else - { - bfd_h_put_16(abfd,0, nsp.e_desc); - bfd_h_put_8(abfd, 0, nsp.e_other); - bfd_h_put_8(abfd, 0, nsp.e_type); - } - - if (! translate_to_native_sym_flags (abfd, g, &nsp)) - goto error_return; - - if (bfd_write((PTR)&nsp,1,EXTERNAL_NLIST_SIZE, abfd) - != EXTERNAL_NLIST_SIZE) - goto error_return; - - /* NB: `KEEPIT' currently overlays `udata.p', so set this only - here, at the end. */ - g->KEEPIT = count; - } - - if (! emit_stringtab (abfd, strtab)) - goto error_return; - - _bfd_stringtab_free (strtab); - - return true; - -error_return: - _bfd_stringtab_free (strtab); - return false; -} - - -long -NAME(aout,get_symtab) (abfd, location) - bfd *abfd; - asymbol **location; -{ - unsigned int counter = 0; - aout_symbol_type *symbase; - - if (!NAME(aout,slurp_symbol_table)(abfd)) - return -1; - - for (symbase = obj_aout_symbols(abfd); counter++ < bfd_get_symcount (abfd);) - *(location++) = (asymbol *)( symbase++); - *location++ =0; - return bfd_get_symcount (abfd); -} - - -/* Standard reloc stuff */ -/* Output standard relocation information to a file in target byte order. */ - -void -NAME(aout,swap_std_reloc_out) (abfd, g, natptr) - bfd *abfd; - arelent *g; - struct reloc_std_external *natptr; -{ - int r_index; - asymbol *sym = *(g->sym_ptr_ptr); - int r_extern; - unsigned int r_length; - int r_pcrel; - int r_baserel, r_jmptable, r_relative; - asection *output_section = sym->section->output_section; - - PUT_WORD(abfd, g->address, natptr->r_address); - - r_length = g->howto->size ; /* Size as a power of two */ - r_pcrel = (int) g->howto->pc_relative; /* Relative to PC? */ - /* XXX This relies on relocs coming from a.out files. */ - r_baserel = (g->howto->type & 8) != 0; - r_jmptable = (g->howto->type & 16) != 0; - r_relative = (g->howto->type & 32) != 0; - -#if 0 - /* For a standard reloc, the addend is in the object file. */ - r_addend = g->addend + (*(g->sym_ptr_ptr))->section->output_section->vma; -#endif - - /* name was clobbered by aout_write_syms to be symbol index */ - - /* If this relocation is relative to a symbol then set the - r_index to the symbols index, and the r_extern bit. - - Absolute symbols can come in in two ways, either as an offset - from the abs section, or as a symbol which has an abs value. - check for that here - */ - - - if (bfd_is_com_section (output_section) - || bfd_is_abs_section (output_section) - || bfd_is_und_section (output_section)) - { - if (bfd_abs_section_ptr->symbol == sym) - { - /* Whoops, looked like an abs symbol, but is really an offset - from the abs section */ - r_index = 0; - r_extern = 0; - } - else - { - /* Fill in symbol */ - r_extern = 1; - r_index = (*(g->sym_ptr_ptr))->KEEPIT; - - } - } - else - { - /* Just an ordinary section */ - r_extern = 0; - r_index = output_section->target_index; - } - - /* now the fun stuff */ - if (bfd_header_big_endian (abfd)) { - natptr->r_index[0] = r_index >> 16; - natptr->r_index[1] = r_index >> 8; - natptr->r_index[2] = r_index; - natptr->r_type[0] = - (r_extern? RELOC_STD_BITS_EXTERN_BIG: 0) - | (r_pcrel? RELOC_STD_BITS_PCREL_BIG: 0) - | (r_baserel? RELOC_STD_BITS_BASEREL_BIG: 0) - | (r_jmptable? RELOC_STD_BITS_JMPTABLE_BIG: 0) - | (r_relative? RELOC_STD_BITS_RELATIVE_BIG: 0) - | (r_length << RELOC_STD_BITS_LENGTH_SH_BIG); - } else { - natptr->r_index[2] = r_index >> 16; - natptr->r_index[1] = r_index >> 8; - natptr->r_index[0] = r_index; - natptr->r_type[0] = - (r_extern? RELOC_STD_BITS_EXTERN_LITTLE: 0) - | (r_pcrel? RELOC_STD_BITS_PCREL_LITTLE: 0) - | (r_baserel? RELOC_STD_BITS_BASEREL_LITTLE: 0) - | (r_jmptable? RELOC_STD_BITS_JMPTABLE_LITTLE: 0) - | (r_relative? RELOC_STD_BITS_RELATIVE_LITTLE: 0) - | (r_length << RELOC_STD_BITS_LENGTH_SH_LITTLE); - } -} - - -/* Extended stuff */ -/* Output extended relocation information to a file in target byte order. */ - -void -NAME(aout,swap_ext_reloc_out) (abfd, g, natptr) - bfd *abfd; - arelent *g; - register struct reloc_ext_external *natptr; -{ - int r_index; - int r_extern; - unsigned int r_type; - unsigned int r_addend; - asymbol *sym = *(g->sym_ptr_ptr); - asection *output_section = sym->section->output_section; - - PUT_WORD (abfd, g->address, natptr->r_address); - - r_type = (unsigned int) g->howto->type; - - r_addend = g->addend; - if ((sym->flags & BSF_SECTION_SYM) != 0) - r_addend += (*(g->sym_ptr_ptr))->section->output_section->vma; - - /* If this relocation is relative to a symbol then set the - r_index to the symbols index, and the r_extern bit. - - Absolute symbols can come in in two ways, either as an offset - from the abs section, or as a symbol which has an abs value. - check for that here. */ - - if (bfd_is_abs_section (bfd_get_section (sym))) - { - r_extern = 0; - r_index = 0; - } - else if ((sym->flags & BSF_SECTION_SYM) == 0) - { - if (bfd_is_und_section (bfd_get_section (sym)) - || (sym->flags & BSF_GLOBAL) != 0) - r_extern = 1; - else - r_extern = 0; - r_index = (*(g->sym_ptr_ptr))->KEEPIT; - } - else - { - /* Just an ordinary section */ - r_extern = 0; - r_index = output_section->target_index; - } - - /* now the fun stuff */ - if (bfd_header_big_endian (abfd)) { - natptr->r_index[0] = r_index >> 16; - natptr->r_index[1] = r_index >> 8; - natptr->r_index[2] = r_index; - natptr->r_type[0] = - ((r_extern? RELOC_EXT_BITS_EXTERN_BIG: 0) - | (r_type << RELOC_EXT_BITS_TYPE_SH_BIG)); - } else { - natptr->r_index[2] = r_index >> 16; - natptr->r_index[1] = r_index >> 8; - natptr->r_index[0] = r_index; - natptr->r_type[0] = - (r_extern? RELOC_EXT_BITS_EXTERN_LITTLE: 0) - | (r_type << RELOC_EXT_BITS_TYPE_SH_LITTLE); - } - - PUT_WORD (abfd, r_addend, natptr->r_addend); -} - -/* BFD deals internally with all things based from the section they're - in. so, something in 10 bytes into a text section with a base of - 50 would have a symbol (.text+10) and know .text vma was 50. - - Aout keeps all it's symbols based from zero, so the symbol would - contain 60. This macro subs the base of each section from the value - to give the true offset from the section */ - - -#define MOVE_ADDRESS(ad) \ - if (r_extern) { \ - /* undefined symbol */ \ - cache_ptr->sym_ptr_ptr = symbols + r_index; \ - cache_ptr->addend = ad; \ - } else { \ - /* defined, section relative. replace symbol with pointer to \ - symbol which points to section */ \ - switch (r_index) { \ - case N_TEXT: \ - case N_TEXT | N_EXT: \ - cache_ptr->sym_ptr_ptr = obj_textsec(abfd)->symbol_ptr_ptr; \ - cache_ptr->addend = ad - su->textsec->vma; \ - break; \ - case N_DATA: \ - case N_DATA | N_EXT: \ - cache_ptr->sym_ptr_ptr = obj_datasec(abfd)->symbol_ptr_ptr; \ - cache_ptr->addend = ad - su->datasec->vma; \ - break; \ - case N_BSS: \ - case N_BSS | N_EXT: \ - cache_ptr->sym_ptr_ptr = obj_bsssec(abfd)->symbol_ptr_ptr; \ - cache_ptr->addend = ad - su->bsssec->vma; \ - break; \ - default: \ - case N_ABS: \ - case N_ABS | N_EXT: \ - cache_ptr->sym_ptr_ptr = bfd_abs_section_ptr->symbol_ptr_ptr; \ - cache_ptr->addend = ad; \ - break; \ - } \ - } \ - -void -NAME(aout,swap_ext_reloc_in) (abfd, bytes, cache_ptr, symbols, symcount) - bfd *abfd; - struct reloc_ext_external *bytes; - arelent *cache_ptr; - asymbol **symbols; - bfd_size_type symcount; -{ - unsigned int r_index; - int r_extern; - unsigned int r_type; - struct aoutdata *su = &(abfd->tdata.aout_data->a); - - cache_ptr->address = (GET_SWORD (abfd, bytes->r_address)); - - /* now the fun stuff */ - if (bfd_header_big_endian (abfd)) { - r_index = (bytes->r_index[0] << 16) - | (bytes->r_index[1] << 8) - | bytes->r_index[2]; - r_extern = (0 != (bytes->r_type[0] & RELOC_EXT_BITS_EXTERN_BIG)); - r_type = (bytes->r_type[0] & RELOC_EXT_BITS_TYPE_BIG) - >> RELOC_EXT_BITS_TYPE_SH_BIG; - } else { - r_index = (bytes->r_index[2] << 16) - | (bytes->r_index[1] << 8) - | bytes->r_index[0]; - r_extern = (0 != (bytes->r_type[0] & RELOC_EXT_BITS_EXTERN_LITTLE)); - r_type = (bytes->r_type[0] & RELOC_EXT_BITS_TYPE_LITTLE) - >> RELOC_EXT_BITS_TYPE_SH_LITTLE; - } - - cache_ptr->howto = howto_table_ext + r_type; - - /* Base relative relocs are always against the symbol table, - regardless of the setting of r_extern. r_extern just reflects - whether the symbol the reloc is against is local or global. */ - if (r_type == RELOC_BASE10 - || r_type == RELOC_BASE13 - || r_type == RELOC_BASE22) - r_extern = 1; - - if (r_extern && r_index > symcount) - { - /* We could arrange to return an error, but it might be useful - to see the file even if it is bad. */ - r_extern = 0; - r_index = N_ABS; - } - - MOVE_ADDRESS(GET_SWORD(abfd, bytes->r_addend)); -} - -void -NAME(aout,swap_std_reloc_in) (abfd, bytes, cache_ptr, symbols, symcount) - bfd *abfd; - struct reloc_std_external *bytes; - arelent *cache_ptr; - asymbol **symbols; - bfd_size_type symcount; -{ - unsigned int r_index; - int r_extern; - unsigned int r_length; - int r_pcrel; - int r_baserel, r_jmptable, r_relative; - struct aoutdata *su = &(abfd->tdata.aout_data->a); - unsigned int howto_idx; - - cache_ptr->address = bfd_h_get_32 (abfd, bytes->r_address); - - /* now the fun stuff */ - if (bfd_header_big_endian (abfd)) { - r_index = (bytes->r_index[0] << 16) - | (bytes->r_index[1] << 8) - | bytes->r_index[2]; - r_extern = (0 != (bytes->r_type[0] & RELOC_STD_BITS_EXTERN_BIG)); - r_pcrel = (0 != (bytes->r_type[0] & RELOC_STD_BITS_PCREL_BIG)); - r_baserel = (0 != (bytes->r_type[0] & RELOC_STD_BITS_BASEREL_BIG)); - r_jmptable= (0 != (bytes->r_type[0] & RELOC_STD_BITS_JMPTABLE_BIG)); - r_relative= (0 != (bytes->r_type[0] & RELOC_STD_BITS_RELATIVE_BIG)); - r_length = (bytes->r_type[0] & RELOC_STD_BITS_LENGTH_BIG) - >> RELOC_STD_BITS_LENGTH_SH_BIG; - } else { - r_index = (bytes->r_index[2] << 16) - | (bytes->r_index[1] << 8) - | bytes->r_index[0]; - r_extern = (0 != (bytes->r_type[0] & RELOC_STD_BITS_EXTERN_LITTLE)); - r_pcrel = (0 != (bytes->r_type[0] & RELOC_STD_BITS_PCREL_LITTLE)); - r_baserel = (0 != (bytes->r_type[0] & RELOC_STD_BITS_BASEREL_LITTLE)); - r_jmptable= (0 != (bytes->r_type[0] & RELOC_STD_BITS_JMPTABLE_LITTLE)); - r_relative= (0 != (bytes->r_type[0] & RELOC_STD_BITS_RELATIVE_LITTLE)); - r_length = (bytes->r_type[0] & RELOC_STD_BITS_LENGTH_LITTLE) - >> RELOC_STD_BITS_LENGTH_SH_LITTLE; - } - - howto_idx = r_length + 4 * r_pcrel + 8 * r_baserel - + 16 * r_jmptable + 32 * r_relative; - BFD_ASSERT (howto_idx < TABLE_SIZE (howto_table_std)); - cache_ptr->howto = howto_table_std + howto_idx; - BFD_ASSERT (cache_ptr->howto->type != (unsigned int) -1); - - /* Base relative relocs are always against the symbol table, - regardless of the setting of r_extern. r_extern just reflects - whether the symbol the reloc is against is local or global. */ - if (r_baserel) - r_extern = 1; - - if (r_extern && r_index > symcount) - { - /* We could arrange to return an error, but it might be useful - to see the file even if it is bad. */ - r_extern = 0; - r_index = N_ABS; - } - - MOVE_ADDRESS(0); -} - -/* Read and swap the relocs for a section. */ - -boolean -NAME(aout,slurp_reloc_table) (abfd, asect, symbols) - bfd *abfd; - sec_ptr asect; - asymbol **symbols; -{ - unsigned int count; - bfd_size_type reloc_size; - PTR relocs; - arelent *reloc_cache; - size_t each_size; - unsigned int counter = 0; - arelent *cache_ptr; - - if (asect->relocation) - return true; - - if (asect->flags & SEC_CONSTRUCTOR) - return true; - - if (asect == obj_datasec (abfd)) - reloc_size = exec_hdr(abfd)->a_drsize; - else if (asect == obj_textsec (abfd)) - reloc_size = exec_hdr(abfd)->a_trsize; - else if (asect == obj_bsssec (abfd)) - reloc_size = 0; - else - { - bfd_set_error (bfd_error_invalid_operation); - return false; - } - - if (bfd_seek (abfd, asect->rel_filepos, SEEK_SET) != 0) - return false; - - each_size = obj_reloc_entry_size (abfd); - - count = reloc_size / each_size; - - reloc_cache = (arelent *) bfd_malloc ((size_t) (count * sizeof (arelent))); - if (reloc_cache == NULL && count != 0) - return false; - memset (reloc_cache, 0, count * sizeof (arelent)); - - relocs = bfd_malloc ((size_t) reloc_size); - if (relocs == NULL && reloc_size != 0) - { - free (reloc_cache); - return false; - } - - if (bfd_read (relocs, 1, reloc_size, abfd) != reloc_size) - { - free (relocs); - free (reloc_cache); - return false; - } - - cache_ptr = reloc_cache; - if (each_size == RELOC_EXT_SIZE) - { - register struct reloc_ext_external *rptr = - (struct reloc_ext_external *) relocs; - - for (; counter < count; counter++, rptr++, cache_ptr++) - NAME(aout,swap_ext_reloc_in) (abfd, rptr, cache_ptr, symbols, - bfd_get_symcount (abfd)); - } - else - { - register struct reloc_std_external *rptr = - (struct reloc_std_external *) relocs; - - for (; counter < count; counter++, rptr++, cache_ptr++) - MY_swap_std_reloc_in (abfd, rptr, cache_ptr, symbols, - bfd_get_symcount (abfd)); - } - - free (relocs); - - asect->relocation = reloc_cache; - asect->reloc_count = cache_ptr - reloc_cache; - - return true; -} - -/* Write out a relocation section into an object file. */ - -boolean -NAME(aout,squirt_out_relocs) (abfd, section) - bfd *abfd; - asection *section; -{ - arelent **generic; - unsigned char *native, *natptr; - size_t each_size; - - unsigned int count = section->reloc_count; - size_t natsize; - - if (count == 0) return true; - - each_size = obj_reloc_entry_size (abfd); - natsize = each_size * count; - native = (unsigned char *) bfd_zalloc (abfd, natsize); - if (!native) - return false; - - generic = section->orelocation; - - if (each_size == RELOC_EXT_SIZE) - { - for (natptr = native; - count != 0; - --count, natptr += each_size, ++generic) - NAME(aout,swap_ext_reloc_out) (abfd, *generic, (struct reloc_ext_external *)natptr); - } - else - { - for (natptr = native; - count != 0; - --count, natptr += each_size, ++generic) - MY_swap_std_reloc_out(abfd, *generic, (struct reloc_std_external *)natptr); - } - - if ( bfd_write ((PTR) native, 1, natsize, abfd) != natsize) { - bfd_release(abfd, native); - return false; - } - bfd_release (abfd, native); - - return true; -} - -/* This is stupid. This function should be a boolean predicate */ -long -NAME(aout,canonicalize_reloc) (abfd, section, relptr, symbols) - bfd *abfd; - sec_ptr section; - arelent **relptr; - asymbol **symbols; -{ - arelent *tblptr = section->relocation; - unsigned int count; - - if (section == obj_bsssec (abfd)) - { - *relptr = NULL; - return 0; - } - - if (!(tblptr || NAME(aout,slurp_reloc_table)(abfd, section, symbols))) - return -1; - - if (section->flags & SEC_CONSTRUCTOR) { - arelent_chain *chain = section->constructor_chain; - for (count = 0; count < section->reloc_count; count ++) { - *relptr ++ = &chain->relent; - chain = chain->next; - } - } - else { - tblptr = section->relocation; - - for (count = 0; count++ < section->reloc_count;) - { - *relptr++ = tblptr++; - } - } - *relptr = 0; - - return section->reloc_count; -} - -long -NAME(aout,get_reloc_upper_bound) (abfd, asect) - bfd *abfd; - sec_ptr asect; -{ - if (bfd_get_format (abfd) != bfd_object) { - bfd_set_error (bfd_error_invalid_operation); - return -1; - } - if (asect->flags & SEC_CONSTRUCTOR) { - return (sizeof (arelent *) * (asect->reloc_count+1)); - } - - if (asect == obj_datasec (abfd)) - return (sizeof (arelent *) - * ((exec_hdr(abfd)->a_drsize / obj_reloc_entry_size (abfd)) - + 1)); - - if (asect == obj_textsec (abfd)) - return (sizeof (arelent *) - * ((exec_hdr(abfd)->a_trsize / obj_reloc_entry_size (abfd)) - + 1)); - - if (asect == obj_bsssec (abfd)) - return sizeof (arelent *); - - if (asect == obj_bsssec (abfd)) - return 0; - - bfd_set_error (bfd_error_invalid_operation); - return -1; -} - - -long -NAME(aout,get_symtab_upper_bound) (abfd) - bfd *abfd; -{ - if (!NAME(aout,slurp_symbol_table)(abfd)) - return -1; - - return (bfd_get_symcount (abfd)+1) * (sizeof (aout_symbol_type *)); -} - -/*ARGSUSED*/ - alent * -NAME(aout,get_lineno) (ignore_abfd, ignore_symbol) - bfd *ignore_abfd; - asymbol *ignore_symbol; -{ -return (alent *)NULL; -} - -/*ARGSUSED*/ -void -NAME(aout,get_symbol_info) (ignore_abfd, symbol, ret) - bfd *ignore_abfd; - asymbol *symbol; - symbol_info *ret; -{ - bfd_symbol_info (symbol, ret); - - if (ret->type == '?') - { - int type_code = aout_symbol(symbol)->type & 0xff; - const char *stab_name = bfd_get_stab_name (type_code); - static char buf[10]; - - if (stab_name == NULL) - { - sprintf(buf, "(%d)", type_code); - stab_name = buf; - } - ret->type = '-'; - ret->stab_type = type_code; - ret->stab_other = (unsigned)(aout_symbol(symbol)->other & 0xff); - ret->stab_desc = (unsigned)(aout_symbol(symbol)->desc & 0xffff); - ret->stab_name = stab_name; - } -} - -/*ARGSUSED*/ -void -NAME(aout,print_symbol) (ignore_abfd, afile, symbol, how) - bfd *ignore_abfd; - PTR afile; - asymbol *symbol; - bfd_print_symbol_type how; -{ - FILE *file = (FILE *)afile; - - switch (how) { - case bfd_print_symbol_name: - if (symbol->name) - fprintf(file,"%s", symbol->name); - break; - case bfd_print_symbol_more: - fprintf(file,"%4x %2x %2x",(unsigned)(aout_symbol(symbol)->desc & 0xffff), - (unsigned)(aout_symbol(symbol)->other & 0xff), - (unsigned)(aout_symbol(symbol)->type)); - break; - case bfd_print_symbol_all: - { - CONST char *section_name = symbol->section->name; - - - bfd_print_symbol_vandf((PTR)file,symbol); - - fprintf(file," %-5s %04x %02x %02x", - section_name, - (unsigned)(aout_symbol(symbol)->desc & 0xffff), - (unsigned)(aout_symbol(symbol)->other & 0xff), - (unsigned)(aout_symbol(symbol)->type & 0xff)); - if (symbol->name) - fprintf(file," %s", symbol->name); - } - break; - } -} - -/* If we don't have to allocate more than 1MB to hold the generic - symbols, we use the generic minisymbol methord: it's faster, since - it only translates the symbols once, not multiple times. */ -#define MINISYM_THRESHOLD (1000000 / sizeof (asymbol)) - -/* Read minisymbols. For minisymbols, we use the unmodified a.out - symbols. The minisymbol_to_symbol function translates these into - BFD asymbol structures. */ - -long -NAME(aout,read_minisymbols) (abfd, dynamic, minisymsp, sizep) - bfd *abfd; - boolean dynamic; - PTR *minisymsp; - unsigned int *sizep; -{ - if (dynamic) - { - /* We could handle the dynamic symbols here as well, but it's - easier to hand them off. */ - return _bfd_generic_read_minisymbols (abfd, dynamic, minisymsp, sizep); - } - - if (! aout_get_external_symbols (abfd)) - return -1; - - if (obj_aout_external_sym_count (abfd) < MINISYM_THRESHOLD) - return _bfd_generic_read_minisymbols (abfd, dynamic, minisymsp, sizep); - - *minisymsp = (PTR) obj_aout_external_syms (abfd); - - /* By passing the external symbols back from this routine, we are - giving up control over the memory block. Clear - obj_aout_external_syms, so that we do not try to free it - ourselves. */ - obj_aout_external_syms (abfd) = NULL; - - *sizep = EXTERNAL_NLIST_SIZE; - return obj_aout_external_sym_count (abfd); -} - -/* Convert a minisymbol to a BFD asymbol. A minisymbol is just an - unmodified a.out symbol. The SYM argument is a structure returned - by bfd_make_empty_symbol, which we fill in here. */ - -asymbol * -NAME(aout,minisymbol_to_symbol) (abfd, dynamic, minisym, sym) - bfd *abfd; - boolean dynamic; - const PTR minisym; - asymbol *sym; -{ - if (dynamic - || obj_aout_external_sym_count (abfd) < MINISYM_THRESHOLD) - return _bfd_generic_minisymbol_to_symbol (abfd, dynamic, minisym, sym); - - memset (sym, 0, sizeof (aout_symbol_type)); - - /* We call translate_symbol_table to translate a single symbol. */ - if (! (NAME(aout,translate_symbol_table) - (abfd, - (aout_symbol_type *) sym, - (struct external_nlist *) minisym, - (bfd_size_type) 1, - obj_aout_external_strings (abfd), - obj_aout_external_string_size (abfd), - false))) - return NULL; - - return sym; -} - -/* - provided a BFD, a section and an offset into the section, calculate - and return the name of the source file and the line nearest to the - wanted location. -*/ - -boolean -NAME(aout,find_nearest_line) - (abfd, section, symbols, offset, filename_ptr, functionname_ptr, line_ptr) - bfd *abfd; - asection *section; - asymbol **symbols; - bfd_vma offset; - CONST char **filename_ptr; - CONST char **functionname_ptr; - unsigned int *line_ptr; -{ - /* Run down the file looking for the filename, function and linenumber */ - asymbol **p; - CONST char *directory_name = NULL; - CONST char *main_file_name = NULL; - CONST char *current_file_name = NULL; - CONST char *line_file_name = NULL; /* Value of current_file_name at line number. */ - bfd_vma low_line_vma = 0; - bfd_vma low_func_vma = 0; - asymbol *func = 0; - size_t filelen, funclen; - char *buf; - - *filename_ptr = abfd->filename; - *functionname_ptr = 0; - *line_ptr = 0; - if (symbols != (asymbol **)NULL) { - for (p = symbols; *p; p++) { - aout_symbol_type *q = (aout_symbol_type *)(*p); - next: - switch (q->type){ - case N_SO: - main_file_name = current_file_name = q->symbol.name; - /* Look ahead to next symbol to check if that too is an N_SO. */ - p++; - if (*p == NULL) - break; - q = (aout_symbol_type *)(*p); - if (q->type != (int)N_SO) - goto next; - - /* Found a second N_SO First is directory; second is filename. */ - directory_name = current_file_name; - main_file_name = current_file_name = q->symbol.name; - if (obj_textsec(abfd) != section) - goto done; - break; - case N_SOL: - current_file_name = q->symbol.name; - break; - - case N_SLINE: - - case N_DSLINE: - case N_BSLINE: - /* We'll keep this if it resolves nearer than the one we have - already. */ - if (q->symbol.value >= low_line_vma - && q->symbol.value <= offset) - { - *line_ptr = q->desc; - low_line_vma = q->symbol.value; - line_file_name = current_file_name; - } - break; - case N_FUN: - { - /* We'll keep this if it is nearer than the one we have already */ - if (q->symbol.value >= low_func_vma && - q->symbol.value <= offset) { - low_func_vma = q->symbol.value; - func = (asymbol *)q; - } - else if (q->symbol.value > offset) - goto done; - } - break; - } - } - } - - done: - if (*line_ptr != 0) - main_file_name = line_file_name; - - if (main_file_name == NULL - || main_file_name[0] == '/' - || directory_name == NULL) - filelen = 0; - else - filelen = strlen (directory_name) + strlen (main_file_name); - if (func == NULL) - funclen = 0; - else - funclen = strlen (bfd_asymbol_name (func)); - - if (adata (abfd).line_buf != NULL) - free (adata (abfd).line_buf); - if (filelen + funclen == 0) - adata (abfd).line_buf = buf = NULL; - else - { - buf = (char *) bfd_malloc (filelen + funclen + 2); - adata (abfd).line_buf = buf; - if (buf == NULL) - return false; - } - - if (main_file_name != NULL) - { - if (main_file_name[0] == '/' || directory_name == NULL) - *filename_ptr = main_file_name; - else - { - sprintf (buf, "%s%s", directory_name, main_file_name); - *filename_ptr = buf; - buf += filelen + 1; - } - } - - if (func) - { - const char *function = func->name; - char *p; - - /* The caller expects a symbol name. We actually have a - function name, without the leading underscore. Put the - underscore back in, so that the caller gets a symbol name. */ - if (bfd_get_symbol_leading_char (abfd) == '\0') - strcpy (buf, function); - else - { - buf[0] = bfd_get_symbol_leading_char (abfd); - strcpy (buf + 1, function); - } - /* Have to remove : stuff */ - p = strchr (buf, ':'); - if (p != NULL) - *p = '\0'; - *functionname_ptr = buf; - } - - return true; -} - -/*ARGSUSED*/ -int -NAME(aout,sizeof_headers) (abfd, execable) - bfd *abfd; - boolean execable; -{ - return adata(abfd).exec_bytes_size; -} - -/* Free all information we have cached for this BFD. We can always - read it again later if we need it. */ - -boolean -NAME(aout,bfd_free_cached_info) (abfd) - bfd *abfd; -{ - asection *o; - - if (bfd_get_format (abfd) != bfd_object) - return true; - -#define BFCI_FREE(x) if (x != NULL) { free (x); x = NULL; } - BFCI_FREE (obj_aout_symbols (abfd)); -#ifdef USE_MMAP - obj_aout_external_syms (abfd) = 0; - bfd_free_window (&obj_aout_sym_window (abfd)); - bfd_free_window (&obj_aout_string_window (abfd)); - obj_aout_external_strings (abfd) = 0; -#else - BFCI_FREE (obj_aout_external_syms (abfd)); - BFCI_FREE (obj_aout_external_strings (abfd)); -#endif - for (o = abfd->sections; o != (asection *) NULL; o = o->next) - BFCI_FREE (o->relocation); -#undef BFCI_FREE - - return true; -} - -/* a.out link code. */ - -static boolean aout_link_add_object_symbols - PARAMS ((bfd *, struct bfd_link_info *)); -static boolean aout_link_check_archive_element - PARAMS ((bfd *, struct bfd_link_info *, boolean *)); -static boolean aout_link_free_symbols PARAMS ((bfd *)); -static boolean aout_link_check_ar_symbols - PARAMS ((bfd *, struct bfd_link_info *, boolean *pneeded)); -static boolean aout_link_add_symbols - PARAMS ((bfd *, struct bfd_link_info *)); - -/* Routine to create an entry in an a.out link hash table. */ - -struct bfd_hash_entry * -NAME(aout,link_hash_newfunc) (entry, table, string) - struct bfd_hash_entry *entry; - struct bfd_hash_table *table; - const char *string; -{ - struct aout_link_hash_entry *ret = (struct aout_link_hash_entry *) entry; - - /* Allocate the structure if it has not already been allocated by a - subclass. */ - if (ret == (struct aout_link_hash_entry *) NULL) - ret = ((struct aout_link_hash_entry *) - bfd_hash_allocate (table, sizeof (struct aout_link_hash_entry))); - if (ret == (struct aout_link_hash_entry *) NULL) - return (struct bfd_hash_entry *) ret; - - /* Call the allocation method of the superclass. */ - ret = ((struct aout_link_hash_entry *) - _bfd_link_hash_newfunc ((struct bfd_hash_entry *) ret, - table, string)); - if (ret) - { - /* Set local fields. */ - ret->written = false; - ret->indx = -1; - } - - return (struct bfd_hash_entry *) ret; -} - -/* Initialize an a.out link hash table. */ - -boolean -NAME(aout,link_hash_table_init) (table, abfd, newfunc) - struct aout_link_hash_table *table; - bfd *abfd; - struct bfd_hash_entry *(*newfunc) PARAMS ((struct bfd_hash_entry *, - struct bfd_hash_table *, - const char *)); -{ - return _bfd_link_hash_table_init (&table->root, abfd, newfunc); -} - -/* Create an a.out link hash table. */ - -struct bfd_link_hash_table * -NAME(aout,link_hash_table_create) (abfd) - bfd *abfd; -{ - struct aout_link_hash_table *ret; - - ret = ((struct aout_link_hash_table *) - bfd_alloc (abfd, sizeof (struct aout_link_hash_table))); - if (ret == NULL) - return (struct bfd_link_hash_table *) NULL; - if (! NAME(aout,link_hash_table_init) (ret, abfd, - NAME(aout,link_hash_newfunc))) - { - free (ret); - return (struct bfd_link_hash_table *) NULL; - } - return &ret->root; -} - -/* Given an a.out BFD, add symbols to the global hash table as - appropriate. */ - -boolean -NAME(aout,link_add_symbols) (abfd, info) - bfd *abfd; - struct bfd_link_info *info; -{ - switch (bfd_get_format (abfd)) - { - case bfd_object: - return aout_link_add_object_symbols (abfd, info); - case bfd_archive: - return _bfd_generic_link_add_archive_symbols - (abfd, info, aout_link_check_archive_element); - default: - bfd_set_error (bfd_error_wrong_format); - return false; - } -} - -/* Add symbols from an a.out object file. */ - -static boolean -aout_link_add_object_symbols (abfd, info) - bfd *abfd; - struct bfd_link_info *info; -{ - if (! aout_get_external_symbols (abfd)) - return false; - if (! aout_link_add_symbols (abfd, info)) - return false; - if (! info->keep_memory) - { - if (! aout_link_free_symbols (abfd)) - return false; - } - return true; -} - -/* Check a single archive element to see if we need to include it in - the link. *PNEEDED is set according to whether this element is - needed in the link or not. This is called from - _bfd_generic_link_add_archive_symbols. */ - -static boolean -aout_link_check_archive_element (abfd, info, pneeded) - bfd *abfd; - struct bfd_link_info *info; - boolean *pneeded; -{ - if (! aout_get_external_symbols (abfd)) - return false; - - if (! aout_link_check_ar_symbols (abfd, info, pneeded)) - return false; - - if (*pneeded) - { - if (! aout_link_add_symbols (abfd, info)) - return false; - } - - if (! info->keep_memory || ! *pneeded) - { - if (! aout_link_free_symbols (abfd)) - return false; - } - - return true; -} - -/* Free up the internal symbols read from an a.out file. */ - -static boolean -aout_link_free_symbols (abfd) - bfd *abfd; -{ - if (obj_aout_external_syms (abfd) != (struct external_nlist *) NULL) - { -#ifdef USE_MMAP - bfd_free_window (&obj_aout_sym_window (abfd)); -#else - free ((PTR) obj_aout_external_syms (abfd)); -#endif - obj_aout_external_syms (abfd) = (struct external_nlist *) NULL; - } - if (obj_aout_external_strings (abfd) != (char *) NULL) - { -#ifdef USE_MMAP - bfd_free_window (&obj_aout_string_window (abfd)); -#else - free ((PTR) obj_aout_external_strings (abfd)); -#endif - obj_aout_external_strings (abfd) = (char *) NULL; - } - return true; -} - -/* Look through the internal symbols to see if this object file should - be included in the link. We should include this object file if it - defines any symbols which are currently undefined. If this object - file defines a common symbol, then we may adjust the size of the - known symbol but we do not include the object file in the link - (unless there is some other reason to include it). */ - -static boolean -aout_link_check_ar_symbols (abfd, info, pneeded) - bfd *abfd; - struct bfd_link_info *info; - boolean *pneeded; -{ - register struct external_nlist *p; - struct external_nlist *pend; - char *strings; - - *pneeded = false; - - /* Look through all the symbols. */ - p = obj_aout_external_syms (abfd); - pend = p + obj_aout_external_sym_count (abfd); - strings = obj_aout_external_strings (abfd); - for (; p < pend; p++) - { - int type = bfd_h_get_8 (abfd, p->e_type); - const char *name; - struct bfd_link_hash_entry *h; - - /* Ignore symbols that are not externally visible. This is an - optimization only, as we check the type more thoroughly - below. */ - if (((type & N_EXT) == 0 - || (type & N_STAB) != 0 - || type == N_FN) - && type != N_WEAKA - && type != N_WEAKT - && type != N_WEAKD - && type != N_WEAKB) - { - if (type == N_WARNING - || type == N_INDR) - ++p; - continue; - } - - name = strings + GET_WORD (abfd, p->e_strx); - h = bfd_link_hash_lookup (info->hash, name, false, false, true); - - /* We are only interested in symbols that are currently - undefined or common. */ - if (h == (struct bfd_link_hash_entry *) NULL - || (h->type != bfd_link_hash_undefined - && h->type != bfd_link_hash_common)) - { - if (type == (N_INDR | N_EXT)) - ++p; - continue; - } - - if (type == (N_TEXT | N_EXT) - || type == (N_DATA | N_EXT) - || type == (N_BSS | N_EXT) - || type == (N_ABS | N_EXT) - || type == (N_INDR | N_EXT)) - { - /* This object file defines this symbol. We must link it - in. This is true regardless of whether the current - definition of the symbol is undefined or common. If the - current definition is common, we have a case in which we - have already seen an object file including - int a; - and this object file from the archive includes - int a = 5; - In such a case we must include this object file. - - FIXME: The SunOS 4.1.3 linker will pull in the archive - element if the symbol is defined in the .data section, - but not if it is defined in the .text section. That - seems a bit crazy to me, and I haven't implemented it. - However, it might be correct. */ - if (! (*info->callbacks->add_archive_element) (info, abfd, name)) - return false; - *pneeded = true; - return true; - } - - if (type == (N_UNDF | N_EXT)) - { - bfd_vma value; - - value = GET_WORD (abfd, p->e_value); - if (value != 0) - { - /* This symbol is common in the object from the archive - file. */ - if (h->type == bfd_link_hash_undefined) - { - bfd *symbfd; - unsigned int power; - - symbfd = h->u.undef.abfd; - if (symbfd == (bfd *) NULL) - { - /* This symbol was created as undefined from - outside BFD. We assume that we should link - in the object file. This is done for the -u - option in the linker. */ - if (! (*info->callbacks->add_archive_element) (info, - abfd, - name)) - return false; - *pneeded = true; - return true; - } - /* Turn the current link symbol into a common - symbol. It is already on the undefs list. */ - h->type = bfd_link_hash_common; - h->u.c.p = ((struct bfd_link_hash_common_entry *) - bfd_hash_allocate (&info->hash->table, - sizeof (struct bfd_link_hash_common_entry))); - if (h->u.c.p == NULL) - return false; - - h->u.c.size = value; - - /* FIXME: This isn't quite right. The maximum - alignment of a common symbol should be set by the - architecture of the output file, not of the input - file. */ - power = bfd_log2 (value); - if (power > bfd_get_arch_info (abfd)->section_align_power) - power = bfd_get_arch_info (abfd)->section_align_power; - h->u.c.p->alignment_power = power; - - h->u.c.p->section = bfd_make_section_old_way (symbfd, - "COMMON"); - } - else - { - /* Adjust the size of the common symbol if - necessary. */ - if (value > h->u.c.size) - h->u.c.size = value; - } - } - } - - if (type == N_WEAKA - || type == N_WEAKT - || type == N_WEAKD - || type == N_WEAKB) - { - /* This symbol is weak but defined. We must pull it in if - the current link symbol is undefined, but we don't want - it if the current link symbol is common. */ - if (h->type == bfd_link_hash_undefined) - { - if (! (*info->callbacks->add_archive_element) (info, abfd, name)) - return false; - *pneeded = true; - return true; - } - } - } - - /* We do not need this object file. */ - return true; -} - -/* Add all symbols from an object file to the hash table. */ - -static boolean -aout_link_add_symbols (abfd, info) - bfd *abfd; - struct bfd_link_info *info; -{ - boolean (*add_one_symbol) PARAMS ((struct bfd_link_info *, bfd *, - const char *, flagword, asection *, - bfd_vma, const char *, boolean, - boolean, - struct bfd_link_hash_entry **)); - struct external_nlist *syms; - bfd_size_type sym_count; - char *strings; - boolean copy; - struct aout_link_hash_entry **sym_hash; - register struct external_nlist *p; - struct external_nlist *pend; - - syms = obj_aout_external_syms (abfd); - sym_count = obj_aout_external_sym_count (abfd); - strings = obj_aout_external_strings (abfd); - if (info->keep_memory) - copy = false; - else - copy = true; - - if ((abfd->flags & DYNAMIC) != 0 - && aout_backend_info (abfd)->add_dynamic_symbols != NULL) - { - if (! ((*aout_backend_info (abfd)->add_dynamic_symbols) - (abfd, info, &syms, &sym_count, &strings))) - return false; - } - - /* We keep a list of the linker hash table entries that correspond - to particular symbols. We could just look them up in the hash - table, but keeping the list is more efficient. Perhaps this - should be conditional on info->keep_memory. */ - sym_hash = ((struct aout_link_hash_entry **) - bfd_alloc (abfd, - ((size_t) sym_count - * sizeof (struct aout_link_hash_entry *)))); - if (sym_hash == NULL && sym_count != 0) - return false; - obj_aout_sym_hashes (abfd) = sym_hash; - - add_one_symbol = aout_backend_info (abfd)->add_one_symbol; - if (add_one_symbol == NULL) - add_one_symbol = _bfd_generic_link_add_one_symbol; - - p = syms; - pend = p + sym_count; - for (; p < pend; p++, sym_hash++) - { - int type; - const char *name; - bfd_vma value; - asection *section; - flagword flags; - const char *string; - - *sym_hash = NULL; - - type = bfd_h_get_8 (abfd, p->e_type); - - /* Ignore debugging symbols. */ - if ((type & N_STAB) != 0) - continue; - - name = strings + GET_WORD (abfd, p->e_strx); - value = GET_WORD (abfd, p->e_value); - flags = BSF_GLOBAL; - string = NULL; - switch (type) - { - default: - abort (); - - case N_UNDF: - case N_ABS: - case N_TEXT: - case N_DATA: - case N_BSS: - case N_FN_SEQ: - case N_COMM: - case N_SETV: - case N_FN: - /* Ignore symbols that are not externally visible. */ - continue; - case N_INDR: - /* Ignore local indirect symbol. */ - ++p; - ++sym_hash; - continue; - - case N_UNDF | N_EXT: - if (value == 0) - { - section = bfd_und_section_ptr; - flags = 0; - } - else - section = bfd_com_section_ptr; - break; - case N_ABS | N_EXT: - section = bfd_abs_section_ptr; - break; - case N_TEXT | N_EXT: - section = obj_textsec (abfd); - value -= bfd_get_section_vma (abfd, section); - break; - case N_DATA | N_EXT: - case N_SETV | N_EXT: - /* Treat N_SETV symbols as N_DATA symbol; see comment in - translate_from_native_sym_flags. */ - section = obj_datasec (abfd); - value -= bfd_get_section_vma (abfd, section); - break; - case N_BSS | N_EXT: - section = obj_bsssec (abfd); - value -= bfd_get_section_vma (abfd, section); - break; - case N_INDR | N_EXT: - /* An indirect symbol. The next symbol is the symbol - which this one really is. */ - BFD_ASSERT (p + 1 < pend); - ++p; - string = strings + GET_WORD (abfd, p->e_strx); - section = bfd_ind_section_ptr; - flags |= BSF_INDIRECT; - break; - case N_COMM | N_EXT: - section = bfd_com_section_ptr; - break; - case N_SETA: case N_SETA | N_EXT: - section = bfd_abs_section_ptr; - flags |= BSF_CONSTRUCTOR; - break; - case N_SETT: case N_SETT | N_EXT: - section = obj_textsec (abfd); - flags |= BSF_CONSTRUCTOR; - value -= bfd_get_section_vma (abfd, section); - break; - case N_SETD: case N_SETD | N_EXT: - section = obj_datasec (abfd); - flags |= BSF_CONSTRUCTOR; - value -= bfd_get_section_vma (abfd, section); - break; - case N_SETB: case N_SETB | N_EXT: - section = obj_bsssec (abfd); - flags |= BSF_CONSTRUCTOR; - value -= bfd_get_section_vma (abfd, section); - break; - case N_WARNING: - /* A warning symbol. The next symbol is the one to warn - about. */ - BFD_ASSERT (p + 1 < pend); - ++p; - string = name; - name = strings + GET_WORD (abfd, p->e_strx); - section = bfd_und_section_ptr; - flags |= BSF_WARNING; - break; - case N_WEAKU: - section = bfd_und_section_ptr; - flags = BSF_WEAK; - break; - case N_WEAKA: - section = bfd_abs_section_ptr; - flags = BSF_WEAK; - break; - case N_WEAKT: - section = obj_textsec (abfd); - value -= bfd_get_section_vma (abfd, section); - flags = BSF_WEAK; - break; - case N_WEAKD: - section = obj_datasec (abfd); - value -= bfd_get_section_vma (abfd, section); - flags = BSF_WEAK; - break; - case N_WEAKB: - section = obj_bsssec (abfd); - value -= bfd_get_section_vma (abfd, section); - flags = BSF_WEAK; - break; - } - - if (! ((*add_one_symbol) - (info, abfd, name, flags, section, value, string, copy, false, - (struct bfd_link_hash_entry **) sym_hash))) - return false; - - /* Restrict the maximum alignment of a common symbol based on - the architecture, since a.out has no way to represent - alignment requirements of a section in a .o file. FIXME: - This isn't quite right: it should use the architecture of the - output file, not the input files. */ - if ((*sym_hash)->root.type == bfd_link_hash_common - && ((*sym_hash)->root.u.c.p->alignment_power > - bfd_get_arch_info (abfd)->section_align_power)) - (*sym_hash)->root.u.c.p->alignment_power = - bfd_get_arch_info (abfd)->section_align_power; - - /* If this is a set symbol, and we are not building sets, then - it is possible for the hash entry to not have been set. In - such a case, treat the symbol as not globally defined. */ - if ((*sym_hash)->root.type == bfd_link_hash_new) - { - BFD_ASSERT ((flags & BSF_CONSTRUCTOR) != 0); - *sym_hash = NULL; - } - - if (type == (N_INDR | N_EXT) || type == N_WARNING) - ++sym_hash; - } - - return true; -} - -/* A hash table used for header files with N_BINCL entries. */ - -struct aout_link_includes_table -{ - struct bfd_hash_table root; -}; - -/* A linked list of totals that we have found for a particular header - file. */ - -struct aout_link_includes_totals -{ - struct aout_link_includes_totals *next; - bfd_vma total; -}; - -/* An entry in the header file hash table. */ - -struct aout_link_includes_entry -{ - struct bfd_hash_entry root; - /* List of totals we have found for this file. */ - struct aout_link_includes_totals *totals; -}; - -/* Look up an entry in an the header file hash table. */ - -#define aout_link_includes_lookup(table, string, create, copy) \ - ((struct aout_link_includes_entry *) \ - bfd_hash_lookup (&(table)->root, (string), (create), (copy))) - -/* During the final link step we need to pass around a bunch of - information, so we do it in an instance of this structure. */ - -struct aout_final_link_info -{ - /* General link information. */ - struct bfd_link_info *info; - /* Output bfd. */ - bfd *output_bfd; - /* Reloc file positions. */ - file_ptr treloff, dreloff; - /* File position of symbols. */ - file_ptr symoff; - /* String table. */ - struct bfd_strtab_hash *strtab; - /* Header file hash table. */ - struct aout_link_includes_table includes; - /* A buffer large enough to hold the contents of any section. */ - bfd_byte *contents; - /* A buffer large enough to hold the relocs of any section. */ - PTR relocs; - /* A buffer large enough to hold the symbol map of any input BFD. */ - int *symbol_map; - /* A buffer large enough to hold output symbols of any input BFD. */ - struct external_nlist *output_syms; -}; - -static struct bfd_hash_entry *aout_link_includes_newfunc - PARAMS ((struct bfd_hash_entry *, struct bfd_hash_table *, const char *)); -static boolean aout_link_input_bfd - PARAMS ((struct aout_final_link_info *, bfd *input_bfd)); -static boolean aout_link_write_symbols - PARAMS ((struct aout_final_link_info *, bfd *input_bfd)); -static boolean aout_link_write_other_symbol - PARAMS ((struct aout_link_hash_entry *, PTR)); -static boolean aout_link_input_section - PARAMS ((struct aout_final_link_info *, bfd *input_bfd, - asection *input_section, file_ptr *reloff_ptr, - bfd_size_type rel_size)); -static boolean aout_link_input_section_std - PARAMS ((struct aout_final_link_info *, bfd *input_bfd, - asection *input_section, struct reloc_std_external *, - bfd_size_type rel_size, bfd_byte *contents)); -static boolean aout_link_input_section_ext - PARAMS ((struct aout_final_link_info *, bfd *input_bfd, - asection *input_section, struct reloc_ext_external *, - bfd_size_type rel_size, bfd_byte *contents)); -static INLINE asection *aout_reloc_index_to_section - PARAMS ((bfd *, int)); -static boolean aout_link_reloc_link_order - PARAMS ((struct aout_final_link_info *, asection *, - struct bfd_link_order *)); - -/* The function to create a new entry in the header file hash table. */ - -static struct bfd_hash_entry * -aout_link_includes_newfunc (entry, table, string) - struct bfd_hash_entry *entry; - struct bfd_hash_table *table; - const char *string; -{ - struct aout_link_includes_entry *ret = - (struct aout_link_includes_entry *) entry; - - /* Allocate the structure if it has not already been allocated by a - subclass. */ - if (ret == (struct aout_link_includes_entry *) NULL) - ret = ((struct aout_link_includes_entry *) - bfd_hash_allocate (table, - sizeof (struct aout_link_includes_entry))); - if (ret == (struct aout_link_includes_entry *) NULL) - return (struct bfd_hash_entry *) ret; - - /* Call the allocation method of the superclass. */ - ret = ((struct aout_link_includes_entry *) - bfd_hash_newfunc ((struct bfd_hash_entry *) ret, table, string)); - if (ret) - { - /* Set local fields. */ - ret->totals = NULL; - } - - return (struct bfd_hash_entry *) ret; -} - -/* Do the final link step. This is called on the output BFD. The - INFO structure should point to a list of BFDs linked through the - link_next field which can be used to find each BFD which takes part - in the output. Also, each section in ABFD should point to a list - of bfd_link_order structures which list all the input sections for - the output section. */ - -boolean -NAME(aout,final_link) (abfd, info, callback) - bfd *abfd; - struct bfd_link_info *info; - void (*callback) PARAMS ((bfd *, file_ptr *, file_ptr *, file_ptr *)); -{ - struct aout_final_link_info aout_info; - boolean includes_hash_initialized = false; - register bfd *sub; - bfd_size_type trsize, drsize; - size_t max_contents_size; - size_t max_relocs_size; - size_t max_sym_count; - bfd_size_type text_size; - file_ptr text_end; - register struct bfd_link_order *p; - asection *o; - boolean have_link_order_relocs; - - if (info->shared) - abfd->flags |= DYNAMIC; - - aout_info.info = info; - aout_info.output_bfd = abfd; - aout_info.contents = NULL; - aout_info.relocs = NULL; - aout_info.symbol_map = NULL; - aout_info.output_syms = NULL; - - if (! bfd_hash_table_init_n (&aout_info.includes.root, - aout_link_includes_newfunc, - 251)) - goto error_return; - includes_hash_initialized = true; - - /* Figure out the largest section size. Also, if generating - relocateable output, count the relocs. */ - trsize = 0; - drsize = 0; - max_contents_size = 0; - max_relocs_size = 0; - max_sym_count = 0; - for (sub = info->input_bfds; sub != NULL; sub = sub->link_next) - { - size_t sz; - - if (info->relocateable) - { - if (bfd_get_flavour (sub) == bfd_target_aout_flavour) - { - trsize += exec_hdr (sub)->a_trsize; - drsize += exec_hdr (sub)->a_drsize; - } - else - { - /* FIXME: We need to identify the .text and .data sections - and call get_reloc_upper_bound and canonicalize_reloc to - work out the number of relocs needed, and then multiply - by the reloc size. */ - (*_bfd_error_handler) - ("%s: relocateable link from %s to %s not supported", - bfd_get_filename (abfd), - sub->xvec->name, abfd->xvec->name); - bfd_set_error (bfd_error_invalid_operation); - goto error_return; - } - } - - if (bfd_get_flavour (sub) == bfd_target_aout_flavour) - { - sz = bfd_section_size (sub, obj_textsec (sub)); - if (sz > max_contents_size) - max_contents_size = sz; - sz = bfd_section_size (sub, obj_datasec (sub)); - if (sz > max_contents_size) - max_contents_size = sz; - - sz = exec_hdr (sub)->a_trsize; - if (sz > max_relocs_size) - max_relocs_size = sz; - sz = exec_hdr (sub)->a_drsize; - if (sz > max_relocs_size) - max_relocs_size = sz; - - sz = obj_aout_external_sym_count (sub); - if (sz > max_sym_count) - max_sym_count = sz; - } - } - - if (info->relocateable) - { - if (obj_textsec (abfd) != (asection *) NULL) - trsize += (_bfd_count_link_order_relocs (obj_textsec (abfd) - ->link_order_head) - * obj_reloc_entry_size (abfd)); - if (obj_datasec (abfd) != (asection *) NULL) - drsize += (_bfd_count_link_order_relocs (obj_datasec (abfd) - ->link_order_head) - * obj_reloc_entry_size (abfd)); - } - - exec_hdr (abfd)->a_trsize = trsize; - exec_hdr (abfd)->a_drsize = drsize; - - exec_hdr (abfd)->a_entry = bfd_get_start_address (abfd); - - /* Adjust the section sizes and vmas according to the magic number. - This sets a_text, a_data and a_bss in the exec_hdr and sets the - filepos for each section. */ - if (! NAME(aout,adjust_sizes_and_vmas) (abfd, &text_size, &text_end)) - goto error_return; - - /* The relocation and symbol file positions differ among a.out - targets. We are passed a callback routine from the backend - specific code to handle this. - FIXME: At this point we do not know how much space the symbol - table will require. This will not work for any (nonstandard) - a.out target that needs to know the symbol table size before it - can compute the relocation file positions. This may or may not - be the case for the hp300hpux target, for example. */ - (*callback) (abfd, &aout_info.treloff, &aout_info.dreloff, - &aout_info.symoff); - obj_textsec (abfd)->rel_filepos = aout_info.treloff; - obj_datasec (abfd)->rel_filepos = aout_info.dreloff; - obj_sym_filepos (abfd) = aout_info.symoff; - - /* We keep a count of the symbols as we output them. */ - obj_aout_external_sym_count (abfd) = 0; - - /* We accumulate the string table as we write out the symbols. */ - aout_info.strtab = _bfd_stringtab_init (); - if (aout_info.strtab == NULL) - goto error_return; - - /* Allocate buffers to hold section contents and relocs. */ - aout_info.contents = (bfd_byte *) bfd_malloc (max_contents_size); - aout_info.relocs = (PTR) bfd_malloc (max_relocs_size); - aout_info.symbol_map = (int *) bfd_malloc (max_sym_count * sizeof (int *)); - aout_info.output_syms = ((struct external_nlist *) - bfd_malloc ((max_sym_count + 1) - * sizeof (struct external_nlist))); - if ((aout_info.contents == NULL && max_contents_size != 0) - || (aout_info.relocs == NULL && max_relocs_size != 0) - || (aout_info.symbol_map == NULL && max_sym_count != 0) - || aout_info.output_syms == NULL) - goto error_return; - - /* If we have a symbol named __DYNAMIC, force it out now. This is - required by SunOS. Doing this here rather than in sunos.c is a - hack, but it's easier than exporting everything which would be - needed. */ - { - struct aout_link_hash_entry *h; - - h = aout_link_hash_lookup (aout_hash_table (info), "__DYNAMIC", - false, false, false); - if (h != NULL) - aout_link_write_other_symbol (h, &aout_info); - } - - /* The most time efficient way to do the link would be to read all - the input object files into memory and then sort out the - information into the output file. Unfortunately, that will - probably use too much memory. Another method would be to step - through everything that composes the text section and write it - out, and then everything that composes the data section and write - it out, and then write out the relocs, and then write out the - symbols. Unfortunately, that requires reading stuff from each - input file several times, and we will not be able to keep all the - input files open simultaneously, and reopening them will be slow. - - What we do is basically process one input file at a time. We do - everything we need to do with an input file once--copy over the - section contents, handle the relocation information, and write - out the symbols--and then we throw away the information we read - from it. This approach requires a lot of lseeks of the output - file, which is unfortunate but still faster than reopening a lot - of files. - - We use the output_has_begun field of the input BFDs to see - whether we have already handled it. */ - for (sub = info->input_bfds; sub != (bfd *) NULL; sub = sub->link_next) - sub->output_has_begun = false; - - have_link_order_relocs = false; - for (o = abfd->sections; o != (asection *) NULL; o = o->next) - { - for (p = o->link_order_head; - p != (struct bfd_link_order *) NULL; - p = p->next) - { - if (p->type == bfd_indirect_link_order - && (bfd_get_flavour (p->u.indirect.section->owner) - == bfd_target_aout_flavour)) - { - bfd *input_bfd; - - input_bfd = p->u.indirect.section->owner; - if (! input_bfd->output_has_begun) - { - if (! aout_link_input_bfd (&aout_info, input_bfd)) - goto error_return; - input_bfd->output_has_begun = true; - } - } - else if (p->type == bfd_section_reloc_link_order - || p->type == bfd_symbol_reloc_link_order) - { - /* These are handled below. */ - have_link_order_relocs = true; - } - else - { - if (! _bfd_default_link_order (abfd, info, o, p)) - goto error_return; - } - } - } - - /* Write out any symbols that we have not already written out. */ - aout_link_hash_traverse (aout_hash_table (info), - aout_link_write_other_symbol, - (PTR) &aout_info); - - /* Now handle any relocs we were asked to create by the linker. - These did not come from any input file. We must do these after - we have written out all the symbols, so that we know the symbol - indices to use. */ - if (have_link_order_relocs) - { - for (o = abfd->sections; o != (asection *) NULL; o = o->next) - { - for (p = o->link_order_head; - p != (struct bfd_link_order *) NULL; - p = p->next) - { - if (p->type == bfd_section_reloc_link_order - || p->type == bfd_symbol_reloc_link_order) - { - if (! aout_link_reloc_link_order (&aout_info, o, p)) - goto error_return; - } - } - } - } - - if (aout_info.contents != NULL) - { - free (aout_info.contents); - aout_info.contents = NULL; - } - if (aout_info.relocs != NULL) - { - free (aout_info.relocs); - aout_info.relocs = NULL; - } - if (aout_info.symbol_map != NULL) - { - free (aout_info.symbol_map); - aout_info.symbol_map = NULL; - } - if (aout_info.output_syms != NULL) - { - free (aout_info.output_syms); - aout_info.output_syms = NULL; - } - if (includes_hash_initialized) - { - bfd_hash_table_free (&aout_info.includes.root); - includes_hash_initialized = false; - } - - /* Finish up any dynamic linking we may be doing. */ - if (aout_backend_info (abfd)->finish_dynamic_link != NULL) - { - if (! (*aout_backend_info (abfd)->finish_dynamic_link) (abfd, info)) - goto error_return; - } - - /* Update the header information. */ - abfd->symcount = obj_aout_external_sym_count (abfd); - exec_hdr (abfd)->a_syms = abfd->symcount * EXTERNAL_NLIST_SIZE; - obj_str_filepos (abfd) = obj_sym_filepos (abfd) + exec_hdr (abfd)->a_syms; - obj_textsec (abfd)->reloc_count = - exec_hdr (abfd)->a_trsize / obj_reloc_entry_size (abfd); - obj_datasec (abfd)->reloc_count = - exec_hdr (abfd)->a_drsize / obj_reloc_entry_size (abfd); - - /* Write out the string table. */ - if (bfd_seek (abfd, obj_str_filepos (abfd), SEEK_SET) != 0) - goto error_return; - return emit_stringtab (abfd, aout_info.strtab); - - error_return: - if (aout_info.contents != NULL) - free (aout_info.contents); - if (aout_info.relocs != NULL) - free (aout_info.relocs); - if (aout_info.symbol_map != NULL) - free (aout_info.symbol_map); - if (aout_info.output_syms != NULL) - free (aout_info.output_syms); - if (includes_hash_initialized) - bfd_hash_table_free (&aout_info.includes.root); - return false; -} - -/* Link an a.out input BFD into the output file. */ - -static boolean -aout_link_input_bfd (finfo, input_bfd) - struct aout_final_link_info *finfo; - bfd *input_bfd; -{ - bfd_size_type sym_count; - - BFD_ASSERT (bfd_get_format (input_bfd) == bfd_object); - - /* If this is a dynamic object, it may need special handling. */ - if ((input_bfd->flags & DYNAMIC) != 0 - && aout_backend_info (input_bfd)->link_dynamic_object != NULL) - { - return ((*aout_backend_info (input_bfd)->link_dynamic_object) - (finfo->info, input_bfd)); - } - - /* Get the symbols. We probably have them already, unless - finfo->info->keep_memory is false. */ - if (! aout_get_external_symbols (input_bfd)) - return false; - - sym_count = obj_aout_external_sym_count (input_bfd); - - /* Write out the symbols and get a map of the new indices. The map - is placed into finfo->symbol_map. */ - if (! aout_link_write_symbols (finfo, input_bfd)) - return false; - - /* Relocate and write out the sections. These functions use the - symbol map created by aout_link_write_symbols. */ - if (! aout_link_input_section (finfo, input_bfd, - obj_textsec (input_bfd), - &finfo->treloff, - exec_hdr (input_bfd)->a_trsize) - || ! aout_link_input_section (finfo, input_bfd, - obj_datasec (input_bfd), - &finfo->dreloff, - exec_hdr (input_bfd)->a_drsize)) - return false; - - /* If we are not keeping memory, we don't need the symbols any - longer. We still need them if we are keeping memory, because the - strings in the hash table point into them. */ - if (! finfo->info->keep_memory) - { - if (! aout_link_free_symbols (input_bfd)) - return false; - } - - return true; -} - -/* Adjust and write out the symbols for an a.out file. Set the new - symbol indices into a symbol_map. */ - -static boolean -aout_link_write_symbols (finfo, input_bfd) - struct aout_final_link_info *finfo; - bfd *input_bfd; -{ - bfd *output_bfd; - bfd_size_type sym_count; - char *strings; - enum bfd_link_strip strip; - enum bfd_link_discard discard; - struct external_nlist *outsym; - bfd_size_type strtab_index; - register struct external_nlist *sym; - struct external_nlist *sym_end; - struct aout_link_hash_entry **sym_hash; - int *symbol_map; - boolean pass; - boolean skip_next; - - output_bfd = finfo->output_bfd; - sym_count = obj_aout_external_sym_count (input_bfd); - strings = obj_aout_external_strings (input_bfd); - strip = finfo->info->strip; - discard = finfo->info->discard; - outsym = finfo->output_syms; - - /* First write out a symbol for this object file, unless we are - discarding such symbols. */ - if (strip != strip_all - && (strip != strip_some - || bfd_hash_lookup (finfo->info->keep_hash, input_bfd->filename, - false, false) != NULL) - && discard != discard_all) - { - bfd_h_put_8 (output_bfd, N_TEXT, outsym->e_type); - bfd_h_put_8 (output_bfd, 0, outsym->e_other); - bfd_h_put_16 (output_bfd, (bfd_vma) 0, outsym->e_desc); - strtab_index = add_to_stringtab (output_bfd, finfo->strtab, - input_bfd->filename, false); - if (strtab_index == (bfd_size_type) -1) - return false; - PUT_WORD (output_bfd, strtab_index, outsym->e_strx); - PUT_WORD (output_bfd, - (bfd_get_section_vma (output_bfd, - obj_textsec (input_bfd)->output_section) - + obj_textsec (input_bfd)->output_offset), - outsym->e_value); - ++obj_aout_external_sym_count (output_bfd); - ++outsym; - } - - pass = false; - skip_next = false; - sym = obj_aout_external_syms (input_bfd); - sym_end = sym + sym_count; - sym_hash = obj_aout_sym_hashes (input_bfd); - symbol_map = finfo->symbol_map; - memset (symbol_map, 0, sym_count * sizeof *symbol_map); - for (; sym < sym_end; sym++, sym_hash++, symbol_map++) - { - const char *name; - int type; - struct aout_link_hash_entry *h; - boolean skip; - asection *symsec; - bfd_vma val = 0; - boolean copy; - - /* We set *symbol_map to 0 above for all symbols. If it has - already been set to -1 for this symbol, it means that we are - discarding it because it appears in a duplicate header file. - See the N_BINCL code below. */ - if (*symbol_map == -1) - continue; - - /* Initialize *symbol_map to -1, which means that the symbol was - not copied into the output file. We will change it later if - we do copy the symbol over. */ - *symbol_map = -1; - - type = bfd_h_get_8 (input_bfd, sym->e_type); - name = strings + GET_WORD (input_bfd, sym->e_strx); - - h = NULL; - - if (pass) - { - /* Pass this symbol through. It is the target of an - indirect or warning symbol. */ - val = GET_WORD (input_bfd, sym->e_value); - pass = false; - } - else if (skip_next) - { - /* Skip this symbol, which is the target of an indirect - symbol that we have changed to no longer be an indirect - symbol. */ - skip_next = false; - continue; - } - else - { - struct aout_link_hash_entry *hresolve; - - /* We have saved the hash table entry for this symbol, if - there is one. Note that we could just look it up again - in the hash table, provided we first check that it is an - external symbol. */ - h = *sym_hash; - - /* Use the name from the hash table, in case the symbol was - wrapped. */ - if (h != NULL) - name = h->root.root.string; - - /* If this is an indirect or warning symbol, then change - hresolve to the base symbol. We also change *sym_hash so - that the relocation routines relocate against the real - symbol. */ - hresolve = h; - if (h != (struct aout_link_hash_entry *) NULL - && (h->root.type == bfd_link_hash_indirect - || h->root.type == bfd_link_hash_warning)) - { - hresolve = (struct aout_link_hash_entry *) h->root.u.i.link; - while (hresolve->root.type == bfd_link_hash_indirect - || hresolve->root.type == bfd_link_hash_warning) - hresolve = ((struct aout_link_hash_entry *) - hresolve->root.u.i.link); - *sym_hash = hresolve; - } - - /* If the symbol has already been written out, skip it. */ - if (h != (struct aout_link_hash_entry *) NULL - && h->root.type != bfd_link_hash_warning - && h->written) - { - if ((type & N_TYPE) == N_INDR - || type == N_WARNING) - skip_next = true; - *symbol_map = h->indx; - continue; - } - - /* See if we are stripping this symbol. */ - skip = false; - switch (strip) - { - case strip_none: - break; - case strip_debugger: - if ((type & N_STAB) != 0) - skip = true; - break; - case strip_some: - if (bfd_hash_lookup (finfo->info->keep_hash, name, false, false) - == NULL) - skip = true; - break; - case strip_all: - skip = true; - break; - } - if (skip) - { - if (h != (struct aout_link_hash_entry *) NULL) - h->written = true; - continue; - } - - /* Get the value of the symbol. */ - if ((type & N_TYPE) == N_TEXT - || type == N_WEAKT) - symsec = obj_textsec (input_bfd); - else if ((type & N_TYPE) == N_DATA - || type == N_WEAKD) - symsec = obj_datasec (input_bfd); - else if ((type & N_TYPE) == N_BSS - || type == N_WEAKB) - symsec = obj_bsssec (input_bfd); - else if ((type & N_TYPE) == N_ABS - || type == N_WEAKA) - symsec = bfd_abs_section_ptr; - else if (((type & N_TYPE) == N_INDR - && (hresolve == (struct aout_link_hash_entry *) NULL - || (hresolve->root.type != bfd_link_hash_defined - && hresolve->root.type != bfd_link_hash_defweak - && hresolve->root.type != bfd_link_hash_common))) - || type == N_WARNING) - { - /* Pass the next symbol through unchanged. The - condition above for indirect symbols is so that if - the indirect symbol was defined, we output it with - the correct definition so the debugger will - understand it. */ - pass = true; - val = GET_WORD (input_bfd, sym->e_value); - symsec = NULL; - } - else if ((type & N_STAB) != 0) - { - val = GET_WORD (input_bfd, sym->e_value); - symsec = NULL; - } - else - { - /* If we get here with an indirect symbol, it means that - we are outputting it with a real definition. In such - a case we do not want to output the next symbol, - which is the target of the indirection. */ - if ((type & N_TYPE) == N_INDR) - skip_next = true; - - symsec = NULL; - - /* We need to get the value from the hash table. We use - hresolve so that if we have defined an indirect - symbol we output the final definition. */ - if (h == (struct aout_link_hash_entry *) NULL) - { - switch (type & N_TYPE) - { - case N_SETT: - symsec = obj_textsec (input_bfd); - break; - case N_SETD: - symsec = obj_datasec (input_bfd); - break; - case N_SETB: - symsec = obj_bsssec (input_bfd); - break; - case N_SETA: - symsec = bfd_abs_section_ptr; - break; - default: - val = 0; - break; - } - } - else if (hresolve->root.type == bfd_link_hash_defined - || hresolve->root.type == bfd_link_hash_defweak) - { - asection *input_section; - asection *output_section; - - /* This case usually means a common symbol which was - turned into a defined symbol. */ - input_section = hresolve->root.u.def.section; - output_section = input_section->output_section; - BFD_ASSERT (bfd_is_abs_section (output_section) - || output_section->owner == output_bfd); - val = (hresolve->root.u.def.value - + bfd_get_section_vma (output_bfd, output_section) - + input_section->output_offset); - - /* Get the correct type based on the section. If - this is a constructed set, force it to be - globally visible. */ - if (type == N_SETT - || type == N_SETD - || type == N_SETB - || type == N_SETA) - type |= N_EXT; - - type &=~ N_TYPE; - - if (output_section == obj_textsec (output_bfd)) - type |= (hresolve->root.type == bfd_link_hash_defined - ? N_TEXT - : N_WEAKT); - else if (output_section == obj_datasec (output_bfd)) - type |= (hresolve->root.type == bfd_link_hash_defined - ? N_DATA - : N_WEAKD); - else if (output_section == obj_bsssec (output_bfd)) - type |= (hresolve->root.type == bfd_link_hash_defined - ? N_BSS - : N_WEAKB); - else - type |= (hresolve->root.type == bfd_link_hash_defined - ? N_ABS - : N_WEAKA); - } - else if (hresolve->root.type == bfd_link_hash_common) - val = hresolve->root.u.c.size; - else if (hresolve->root.type == bfd_link_hash_undefweak) - { - val = 0; - type = N_WEAKU; - } - else - val = 0; - } - if (symsec != (asection *) NULL) - val = (symsec->output_section->vma - + symsec->output_offset - + (GET_WORD (input_bfd, sym->e_value) - - symsec->vma)); - - /* If this is a global symbol set the written flag, and if - it is a local symbol see if we should discard it. */ - if (h != (struct aout_link_hash_entry *) NULL) - { - h->written = true; - h->indx = obj_aout_external_sym_count (output_bfd); - } - else if ((type & N_TYPE) != N_SETT - && (type & N_TYPE) != N_SETD - && (type & N_TYPE) != N_SETB - && (type & N_TYPE) != N_SETA) - { - switch (discard) - { - case discard_none: - break; - case discard_l: - if (*name == *finfo->info->lprefix - && (finfo->info->lprefix_len == 1 - || strncmp (name, finfo->info->lprefix, - finfo->info->lprefix_len) == 0)) - skip = true; - break; - case discard_all: - skip = true; - break; - } - if (skip) - { - pass = false; - continue; - } - } - - /* An N_BINCL symbol indicates the start of the stabs - entries for a header file. We need to scan ahead to the - next N_EINCL symbol, ignoring nesting, adding up all the - characters in the symbol names, not including the file - numbers in types (the first number after an open - parenthesis). */ - if (type == N_BINCL) - { - struct external_nlist *incl_sym; - int nest; - struct aout_link_includes_entry *incl_entry; - struct aout_link_includes_totals *t; - - val = 0; - nest = 0; - for (incl_sym = sym + 1; incl_sym < sym_end; incl_sym++) - { - int incl_type; - - incl_type = bfd_h_get_8 (input_bfd, incl_sym->e_type); - if (incl_type == N_EINCL) - { - if (nest == 0) - break; - --nest; - } - else if (incl_type == N_BINCL) - ++nest; - else if (nest == 0) - { - const char *s; - - s = strings + GET_WORD (input_bfd, incl_sym->e_strx); - for (; *s != '\0'; s++) - { - val += *s; - if (*s == '(') - { - /* Skip the file number. */ - ++s; - while (isdigit ((unsigned char) *s)) - ++s; - --s; - } - } - } - } - - /* If we have already included a header file with the - same value, then replace this one with an N_EXCL - symbol. */ - copy = ! finfo->info->keep_memory; - incl_entry = aout_link_includes_lookup (&finfo->includes, - name, true, copy); - if (incl_entry == NULL) - return false; - for (t = incl_entry->totals; t != NULL; t = t->next) - if (t->total == val) - break; - if (t == NULL) - { - /* This is the first time we have seen this header - file with this set of stabs strings. */ - t = ((struct aout_link_includes_totals *) - bfd_hash_allocate (&finfo->includes.root, - sizeof *t)); - if (t == NULL) - return false; - t->total = val; - t->next = incl_entry->totals; - incl_entry->totals = t; - } - else - { - int *incl_map; - - /* This is a duplicate header file. We must change - it to be an N_EXCL entry, and mark all the - included symbols to prevent outputting them. */ - type = N_EXCL; - - nest = 0; - for (incl_sym = sym + 1, incl_map = symbol_map + 1; - incl_sym < sym_end; - incl_sym++, incl_map++) - { - int incl_type; - - incl_type = bfd_h_get_8 (input_bfd, incl_sym->e_type); - if (incl_type == N_EINCL) - { - if (nest == 0) - { - *incl_map = -1; - break; - } - --nest; - } - else if (incl_type == N_BINCL) - ++nest; - else if (nest == 0) - *incl_map = -1; - } - } - } - } - - /* Copy this symbol into the list of symbols we are going to - write out. */ - bfd_h_put_8 (output_bfd, type, outsym->e_type); - bfd_h_put_8 (output_bfd, bfd_h_get_8 (input_bfd, sym->e_other), - outsym->e_other); - bfd_h_put_16 (output_bfd, bfd_h_get_16 (input_bfd, sym->e_desc), - outsym->e_desc); - copy = false; - if (! finfo->info->keep_memory) - { - /* name points into a string table which we are going to - free. If there is a hash table entry, use that string. - Otherwise, copy name into memory. */ - if (h != (struct aout_link_hash_entry *) NULL) - name = h->root.root.string; - else - copy = true; - } - strtab_index = add_to_stringtab (output_bfd, finfo->strtab, - name, copy); - if (strtab_index == (bfd_size_type) -1) - return false; - PUT_WORD (output_bfd, strtab_index, outsym->e_strx); - PUT_WORD (output_bfd, val, outsym->e_value); - *symbol_map = obj_aout_external_sym_count (output_bfd); - ++obj_aout_external_sym_count (output_bfd); - ++outsym; - } - - /* Write out the output symbols we have just constructed. */ - if (outsym > finfo->output_syms) - { - bfd_size_type outsym_count; - - if (bfd_seek (output_bfd, finfo->symoff, SEEK_SET) != 0) - return false; - outsym_count = outsym - finfo->output_syms; - if (bfd_write ((PTR) finfo->output_syms, - (bfd_size_type) EXTERNAL_NLIST_SIZE, - (bfd_size_type) outsym_count, output_bfd) - != outsym_count * EXTERNAL_NLIST_SIZE) - return false; - finfo->symoff += outsym_count * EXTERNAL_NLIST_SIZE; - } - - return true; -} - -/* Write out a symbol that was not associated with an a.out input - object. */ - -static boolean -aout_link_write_other_symbol (h, data) - struct aout_link_hash_entry *h; - PTR data; -{ - struct aout_final_link_info *finfo = (struct aout_final_link_info *) data; - bfd *output_bfd; - int type; - bfd_vma val; - struct external_nlist outsym; - bfd_size_type indx; - - output_bfd = finfo->output_bfd; - - if (aout_backend_info (output_bfd)->write_dynamic_symbol != NULL) - { - if (! ((*aout_backend_info (output_bfd)->write_dynamic_symbol) - (output_bfd, finfo->info, h))) - { - /* FIXME: No way to handle errors. */ - abort (); - } - } - - if (h->written) - return true; - - h->written = true; - - /* An indx of -2 means the symbol must be written. */ - if (h->indx != -2 - && (finfo->info->strip == strip_all - || (finfo->info->strip == strip_some - && bfd_hash_lookup (finfo->info->keep_hash, h->root.root.string, - false, false) == NULL))) - return true; - - switch (h->root.type) - { - default: - abort (); - /* Avoid variable not initialized warnings. */ - return true; - case bfd_link_hash_new: - /* This can happen for set symbols when sets are not being - built. */ - return true; - case bfd_link_hash_undefined: - type = N_UNDF | N_EXT; - val = 0; - break; - case bfd_link_hash_defined: - case bfd_link_hash_defweak: - { - asection *sec; - - sec = h->root.u.def.section->output_section; - BFD_ASSERT (bfd_is_abs_section (sec) - || sec->owner == output_bfd); - if (sec == obj_textsec (output_bfd)) - type = h->root.type == bfd_link_hash_defined ? N_TEXT : N_WEAKT; - else if (sec == obj_datasec (output_bfd)) - type = h->root.type == bfd_link_hash_defined ? N_DATA : N_WEAKD; - else if (sec == obj_bsssec (output_bfd)) - type = h->root.type == bfd_link_hash_defined ? N_BSS : N_WEAKB; - else - type = h->root.type == bfd_link_hash_defined ? N_ABS : N_WEAKA; - type |= N_EXT; - val = (h->root.u.def.value - + sec->vma - + h->root.u.def.section->output_offset); - } - break; - case bfd_link_hash_common: - type = N_UNDF | N_EXT; - val = h->root.u.c.size; - break; - case bfd_link_hash_undefweak: - type = N_WEAKU; - val = 0; - case bfd_link_hash_indirect: - case bfd_link_hash_warning: - /* FIXME: Ignore these for now. The circumstances under which - they should be written out are not clear to me. */ - return true; - } - - bfd_h_put_8 (output_bfd, type, outsym.e_type); - bfd_h_put_8 (output_bfd, 0, outsym.e_other); - bfd_h_put_16 (output_bfd, 0, outsym.e_desc); - indx = add_to_stringtab (output_bfd, finfo->strtab, h->root.root.string, - false); - if (indx == (bfd_size_type) -1) - { - /* FIXME: No way to handle errors. */ - abort (); - } - PUT_WORD (output_bfd, indx, outsym.e_strx); - PUT_WORD (output_bfd, val, outsym.e_value); - - if (bfd_seek (output_bfd, finfo->symoff, SEEK_SET) != 0 - || bfd_write ((PTR) &outsym, (bfd_size_type) EXTERNAL_NLIST_SIZE, - (bfd_size_type) 1, output_bfd) != EXTERNAL_NLIST_SIZE) - { - /* FIXME: No way to handle errors. */ - abort (); - } - - finfo->symoff += EXTERNAL_NLIST_SIZE; - h->indx = obj_aout_external_sym_count (output_bfd); - ++obj_aout_external_sym_count (output_bfd); - - return true; -} - -/* Link an a.out section into the output file. */ - -static boolean -aout_link_input_section (finfo, input_bfd, input_section, reloff_ptr, - rel_size) - struct aout_final_link_info *finfo; - bfd *input_bfd; - asection *input_section; - file_ptr *reloff_ptr; - bfd_size_type rel_size; -{ - bfd_size_type input_size; - PTR relocs; - - /* Get the section contents. */ - input_size = bfd_section_size (input_bfd, input_section); - if (! bfd_get_section_contents (input_bfd, input_section, - (PTR) finfo->contents, - (file_ptr) 0, input_size)) - return false; - - /* Read in the relocs if we haven't already done it. */ - if (aout_section_data (input_section) != NULL - && aout_section_data (input_section)->relocs != NULL) - relocs = aout_section_data (input_section)->relocs; - else - { - relocs = finfo->relocs; - if (rel_size > 0) - { - if (bfd_seek (input_bfd, input_section->rel_filepos, SEEK_SET) != 0 - || bfd_read (relocs, 1, rel_size, input_bfd) != rel_size) - return false; - } - } - - /* Relocate the section contents. */ - if (obj_reloc_entry_size (input_bfd) == RELOC_STD_SIZE) - { - if (! aout_link_input_section_std (finfo, input_bfd, input_section, - (struct reloc_std_external *) relocs, - rel_size, finfo->contents)) - return false; - } - else - { - if (! aout_link_input_section_ext (finfo, input_bfd, input_section, - (struct reloc_ext_external *) relocs, - rel_size, finfo->contents)) - return false; - } - - /* Write out the section contents. */ - if (! bfd_set_section_contents (finfo->output_bfd, - input_section->output_section, - (PTR) finfo->contents, - input_section->output_offset, - input_size)) - return false; - - /* If we are producing relocateable output, the relocs were - modified, and we now write them out. */ - if (finfo->info->relocateable && rel_size > 0) - { - if (bfd_seek (finfo->output_bfd, *reloff_ptr, SEEK_SET) != 0) - return false; - if (bfd_write (relocs, (bfd_size_type) 1, rel_size, finfo->output_bfd) - != rel_size) - return false; - *reloff_ptr += rel_size; - - /* Assert that the relocs have not run into the symbols, and - that if these are the text relocs they have not run into the - data relocs. */ - BFD_ASSERT (*reloff_ptr <= obj_sym_filepos (finfo->output_bfd) - && (reloff_ptr != &finfo->treloff - || (*reloff_ptr - <= obj_datasec (finfo->output_bfd)->rel_filepos))); - } - - return true; -} - -/* Get the section corresponding to a reloc index. */ - -static INLINE asection * -aout_reloc_index_to_section (abfd, indx) - bfd *abfd; - int indx; -{ - switch (indx & N_TYPE) - { - case N_TEXT: - return obj_textsec (abfd); - case N_DATA: - return obj_datasec (abfd); - case N_BSS: - return obj_bsssec (abfd); - case N_ABS: - case N_UNDF: - return bfd_abs_section_ptr; - default: - abort (); - } -} - -/* Relocate an a.out section using standard a.out relocs. */ - -static boolean -aout_link_input_section_std (finfo, input_bfd, input_section, relocs, - rel_size, contents) - struct aout_final_link_info *finfo; - bfd *input_bfd; - asection *input_section; - struct reloc_std_external *relocs; - bfd_size_type rel_size; - bfd_byte *contents; -{ - boolean (*check_dynamic_reloc) PARAMS ((struct bfd_link_info *, - bfd *, asection *, - struct aout_link_hash_entry *, - PTR, bfd_byte *, boolean *, - bfd_vma *)); - bfd *output_bfd; - boolean relocateable; - struct external_nlist *syms; - char *strings; - struct aout_link_hash_entry **sym_hashes; - int *symbol_map; - bfd_size_type reloc_count; - register struct reloc_std_external *rel; - struct reloc_std_external *rel_end; - - output_bfd = finfo->output_bfd; - check_dynamic_reloc = aout_backend_info (output_bfd)->check_dynamic_reloc; - - BFD_ASSERT (obj_reloc_entry_size (input_bfd) == RELOC_STD_SIZE); - BFD_ASSERT (input_bfd->xvec->header_byteorder - == output_bfd->xvec->header_byteorder); - - relocateable = finfo->info->relocateable; - syms = obj_aout_external_syms (input_bfd); - strings = obj_aout_external_strings (input_bfd); - sym_hashes = obj_aout_sym_hashes (input_bfd); - symbol_map = finfo->symbol_map; - - reloc_count = rel_size / RELOC_STD_SIZE; - rel = relocs; - rel_end = rel + reloc_count; - for (; rel < rel_end; rel++) - { - bfd_vma r_addr; - int r_index; - int r_extern; - int r_pcrel; - int r_baserel = 0; - reloc_howto_type *howto; - struct aout_link_hash_entry *h = NULL; - bfd_vma relocation; - bfd_reloc_status_type r; - - r_addr = GET_SWORD (input_bfd, rel->r_address); - -#ifdef MY_reloc_howto - howto = MY_reloc_howto(input_bfd, rel, r_index, r_extern, r_pcrel); -#else - { - int r_jmptable; - int r_relative; - int r_length; - unsigned int howto_idx; - - if (bfd_header_big_endian (input_bfd)) - { - r_index = ((rel->r_index[0] << 16) - | (rel->r_index[1] << 8) - | rel->r_index[2]); - r_extern = (0 != (rel->r_type[0] & RELOC_STD_BITS_EXTERN_BIG)); - r_pcrel = (0 != (rel->r_type[0] & RELOC_STD_BITS_PCREL_BIG)); - r_baserel = (0 != (rel->r_type[0] & RELOC_STD_BITS_BASEREL_BIG)); - r_jmptable= (0 != (rel->r_type[0] & RELOC_STD_BITS_JMPTABLE_BIG)); - r_relative= (0 != (rel->r_type[0] & RELOC_STD_BITS_RELATIVE_BIG)); - r_length = ((rel->r_type[0] & RELOC_STD_BITS_LENGTH_BIG) - >> RELOC_STD_BITS_LENGTH_SH_BIG); - } - else - { - r_index = ((rel->r_index[2] << 16) - | (rel->r_index[1] << 8) - | rel->r_index[0]); - r_extern = (0 != (rel->r_type[0] & RELOC_STD_BITS_EXTERN_LITTLE)); - r_pcrel = (0 != (rel->r_type[0] & RELOC_STD_BITS_PCREL_LITTLE)); - r_baserel = (0 != (rel->r_type[0] - & RELOC_STD_BITS_BASEREL_LITTLE)); - r_jmptable= (0 != (rel->r_type[0] - & RELOC_STD_BITS_JMPTABLE_LITTLE)); - r_relative= (0 != (rel->r_type[0] - & RELOC_STD_BITS_RELATIVE_LITTLE)); - r_length = ((rel->r_type[0] & RELOC_STD_BITS_LENGTH_LITTLE) - >> RELOC_STD_BITS_LENGTH_SH_LITTLE); - } - - howto_idx = (r_length + 4 * r_pcrel + 8 * r_baserel - + 16 * r_jmptable + 32 * r_relative); - BFD_ASSERT (howto_idx < TABLE_SIZE (howto_table_std)); - howto = howto_table_std + howto_idx; - } -#endif - - if (relocateable) - { - /* We are generating a relocateable output file, and must - modify the reloc accordingly. */ - if (r_extern) - { - /* If we know the symbol this relocation is against, - convert it into a relocation against a section. This - is what the native linker does. */ - h = sym_hashes[r_index]; - if (h != (struct aout_link_hash_entry *) NULL - && (h->root.type == bfd_link_hash_defined - || h->root.type == bfd_link_hash_defweak)) - { - asection *output_section; - - /* Change the r_extern value. */ - if (bfd_header_big_endian (output_bfd)) - rel->r_type[0] &=~ RELOC_STD_BITS_EXTERN_BIG; - else - rel->r_type[0] &=~ RELOC_STD_BITS_EXTERN_LITTLE; - - /* Compute a new r_index. */ - output_section = h->root.u.def.section->output_section; - if (output_section == obj_textsec (output_bfd)) - r_index = N_TEXT; - else if (output_section == obj_datasec (output_bfd)) - r_index = N_DATA; - else if (output_section == obj_bsssec (output_bfd)) - r_index = N_BSS; - else - r_index = N_ABS; - - /* Add the symbol value and the section VMA to the - addend stored in the contents. */ - relocation = (h->root.u.def.value - + output_section->vma - + h->root.u.def.section->output_offset); - } - else - { - /* We must change r_index according to the symbol - map. */ - r_index = symbol_map[r_index]; - - if (r_index == -1) - { - if (h != NULL) - { - /* We decided to strip this symbol, but it - turns out that we can't. Note that we - lose the other and desc information here. - I don't think that will ever matter for a - global symbol. */ - if (h->indx < 0) - { - h->indx = -2; - h->written = false; - if (! aout_link_write_other_symbol (h, - (PTR) finfo)) - return false; - } - r_index = h->indx; - } - else - { - const char *name; - - name = strings + GET_WORD (input_bfd, - syms[r_index].e_strx); - if (! ((*finfo->info->callbacks->unattached_reloc) - (finfo->info, name, input_bfd, input_section, - r_addr))) - return false; - r_index = 0; - } - } - - relocation = 0; - } - - /* Write out the new r_index value. */ - if (bfd_header_big_endian (output_bfd)) - { - rel->r_index[0] = r_index >> 16; - rel->r_index[1] = r_index >> 8; - rel->r_index[2] = r_index; - } - else - { - rel->r_index[2] = r_index >> 16; - rel->r_index[1] = r_index >> 8; - rel->r_index[0] = r_index; - } - } - else - { - asection *section; - - /* This is a relocation against a section. We must - adjust by the amount that the section moved. */ - section = aout_reloc_index_to_section (input_bfd, r_index); - relocation = (section->output_section->vma - + section->output_offset - - section->vma); - } - - /* Change the address of the relocation. */ - PUT_WORD (output_bfd, - r_addr + input_section->output_offset, - rel->r_address); - - /* Adjust a PC relative relocation by removing the reference - to the original address in the section and including the - reference to the new address. */ - if (r_pcrel) - relocation -= (input_section->output_section->vma - + input_section->output_offset - - input_section->vma); - -#ifdef MY_relocatable_reloc - MY_relocatable_reloc (howto, output_bfd, rel, relocation, r_addr); -#endif - - if (relocation == 0) - r = bfd_reloc_ok; - else - r = MY_relocate_contents (howto, - input_bfd, relocation, - contents + r_addr); - } - else - { - boolean hundef; - - /* We are generating an executable, and must do a full - relocation. */ - hundef = false; - if (r_extern) - { - h = sym_hashes[r_index]; - - if (h != (struct aout_link_hash_entry *) NULL - && (h->root.type == bfd_link_hash_defined - || h->root.type == bfd_link_hash_defweak)) - { - relocation = (h->root.u.def.value - + h->root.u.def.section->output_section->vma - + h->root.u.def.section->output_offset); - } - else if (h != (struct aout_link_hash_entry *) NULL - && h->root.type == bfd_link_hash_undefweak) - relocation = 0; - else - { - hundef = true; - relocation = 0; - } - } - else - { - asection *section; - - section = aout_reloc_index_to_section (input_bfd, r_index); - relocation = (section->output_section->vma - + section->output_offset - - section->vma); - if (r_pcrel) - relocation += input_section->vma; - } - - if (check_dynamic_reloc != NULL) - { - boolean skip; - - if (! ((*check_dynamic_reloc) - (finfo->info, input_bfd, input_section, h, - (PTR) rel, contents, &skip, &relocation))) - return false; - if (skip) - continue; - } - - /* Now warn if a global symbol is undefined. We could not - do this earlier, because check_dynamic_reloc might want - to skip this reloc. */ - if (hundef && ! finfo->info->shared && ! r_baserel) - { - const char *name; - - if (h != NULL) - name = h->root.root.string; - else - name = strings + GET_WORD (input_bfd, syms[r_index].e_strx); - if (! ((*finfo->info->callbacks->undefined_symbol) - (finfo->info, name, input_bfd, input_section, r_addr))) - return false; - } - - r = MY_final_link_relocate (howto, - input_bfd, input_section, - contents, r_addr, relocation, - (bfd_vma) 0); - } - - if (r != bfd_reloc_ok) - { - switch (r) - { - default: - case bfd_reloc_outofrange: - abort (); - case bfd_reloc_overflow: - { - const char *name; - - if (r_extern) - name = strings + GET_WORD (input_bfd, - syms[r_index].e_strx); - else - { - asection *s; - - s = aout_reloc_index_to_section (input_bfd, r_index); - name = bfd_section_name (input_bfd, s); - } - if (! ((*finfo->info->callbacks->reloc_overflow) - (finfo->info, name, howto->name, - (bfd_vma) 0, input_bfd, input_section, r_addr))) - return false; - } - break; - } - } - } - - return true; -} - -/* Relocate an a.out section using extended a.out relocs. */ - -static boolean -aout_link_input_section_ext (finfo, input_bfd, input_section, relocs, - rel_size, contents) - struct aout_final_link_info *finfo; - bfd *input_bfd; - asection *input_section; - struct reloc_ext_external *relocs; - bfd_size_type rel_size; - bfd_byte *contents; -{ - boolean (*check_dynamic_reloc) PARAMS ((struct bfd_link_info *, - bfd *, asection *, - struct aout_link_hash_entry *, - PTR, bfd_byte *, boolean *, - bfd_vma *)); - bfd *output_bfd; - boolean relocateable; - struct external_nlist *syms; - char *strings; - struct aout_link_hash_entry **sym_hashes; - int *symbol_map; - bfd_size_type reloc_count; - register struct reloc_ext_external *rel; - struct reloc_ext_external *rel_end; - - output_bfd = finfo->output_bfd; - check_dynamic_reloc = aout_backend_info (output_bfd)->check_dynamic_reloc; - - BFD_ASSERT (obj_reloc_entry_size (input_bfd) == RELOC_EXT_SIZE); - BFD_ASSERT (input_bfd->xvec->header_byteorder - == output_bfd->xvec->header_byteorder); - - relocateable = finfo->info->relocateable; - syms = obj_aout_external_syms (input_bfd); - strings = obj_aout_external_strings (input_bfd); - sym_hashes = obj_aout_sym_hashes (input_bfd); - symbol_map = finfo->symbol_map; - - reloc_count = rel_size / RELOC_EXT_SIZE; - rel = relocs; - rel_end = rel + reloc_count; - for (; rel < rel_end; rel++) - { - bfd_vma r_addr; - int r_index; - int r_extern; - unsigned int r_type; - bfd_vma r_addend; - struct aout_link_hash_entry *h = NULL; - asection *r_section = NULL; - bfd_vma relocation; - - r_addr = GET_SWORD (input_bfd, rel->r_address); - - if (bfd_header_big_endian (input_bfd)) - { - r_index = ((rel->r_index[0] << 16) - | (rel->r_index[1] << 8) - | rel->r_index[2]); - r_extern = (0 != (rel->r_type[0] & RELOC_EXT_BITS_EXTERN_BIG)); - r_type = ((rel->r_type[0] & RELOC_EXT_BITS_TYPE_BIG) - >> RELOC_EXT_BITS_TYPE_SH_BIG); - } - else - { - r_index = ((rel->r_index[2] << 16) - | (rel->r_index[1] << 8) - | rel->r_index[0]); - r_extern = (0 != (rel->r_type[0] & RELOC_EXT_BITS_EXTERN_LITTLE)); - r_type = ((rel->r_type[0] & RELOC_EXT_BITS_TYPE_LITTLE) - >> RELOC_EXT_BITS_TYPE_SH_LITTLE); - } - - r_addend = GET_SWORD (input_bfd, rel->r_addend); - - BFD_ASSERT (r_type < TABLE_SIZE (howto_table_ext)); - - if (relocateable) - { - /* We are generating a relocateable output file, and must - modify the reloc accordingly. */ - if (r_extern) - { - /* If we know the symbol this relocation is against, - convert it into a relocation against a section. This - is what the native linker does. */ - h = sym_hashes[r_index]; - if (h != (struct aout_link_hash_entry *) NULL - && (h->root.type == bfd_link_hash_defined - || h->root.type == bfd_link_hash_defweak)) - { - asection *output_section; - - /* Change the r_extern value. */ - if (bfd_header_big_endian (output_bfd)) - rel->r_type[0] &=~ RELOC_EXT_BITS_EXTERN_BIG; - else - rel->r_type[0] &=~ RELOC_EXT_BITS_EXTERN_LITTLE; - - /* Compute a new r_index. */ - output_section = h->root.u.def.section->output_section; - if (output_section == obj_textsec (output_bfd)) - r_index = N_TEXT; - else if (output_section == obj_datasec (output_bfd)) - r_index = N_DATA; - else if (output_section == obj_bsssec (output_bfd)) - r_index = N_BSS; - else - r_index = N_ABS; - - /* Add the symbol value and the section VMA to the - addend. */ - relocation = (h->root.u.def.value - + output_section->vma - + h->root.u.def.section->output_offset); - - /* Now RELOCATION is the VMA of the final - destination. If this is a PC relative reloc, - then ADDEND is the negative of the source VMA. - We want to set ADDEND to the difference between - the destination VMA and the source VMA, which - means we must adjust RELOCATION by the change in - the source VMA. This is done below. */ - } - else - { - /* We must change r_index according to the symbol - map. */ - r_index = symbol_map[r_index]; - - if (r_index == -1) - { - if (h != NULL) - { - /* We decided to strip this symbol, but it - turns out that we can't. Note that we - lose the other and desc information here. - I don't think that will ever matter for a - global symbol. */ - if (h->indx < 0) - { - h->indx = -2; - h->written = false; - if (! aout_link_write_other_symbol (h, - (PTR) finfo)) - return false; - } - r_index = h->indx; - } - else - { - const char *name; - - name = strings + GET_WORD (input_bfd, - syms[r_index].e_strx); - if (! ((*finfo->info->callbacks->unattached_reloc) - (finfo->info, name, input_bfd, input_section, - r_addr))) - return false; - r_index = 0; - } - } - - relocation = 0; - - /* If this is a PC relative reloc, then the addend - is the negative of the source VMA. We must - adjust it by the change in the source VMA. This - is done below. */ - } - - /* Write out the new r_index value. */ - if (bfd_header_big_endian (output_bfd)) - { - rel->r_index[0] = r_index >> 16; - rel->r_index[1] = r_index >> 8; - rel->r_index[2] = r_index; - } - else - { - rel->r_index[2] = r_index >> 16; - rel->r_index[1] = r_index >> 8; - rel->r_index[0] = r_index; - } - } - else - { - /* This is a relocation against a section. We must - adjust by the amount that the section moved. */ - r_section = aout_reloc_index_to_section (input_bfd, r_index); - relocation = (r_section->output_section->vma - + r_section->output_offset - - r_section->vma); - - /* If this is a PC relative reloc, then the addend is - the difference in VMA between the destination and the - source. We have just adjusted for the change in VMA - of the destination, so we must also adjust by the - change in VMA of the source. This is done below. */ - } - - /* As described above, we must always adjust a PC relative - reloc by the change in VMA of the source. */ - if (howto_table_ext[r_type].pc_relative) - relocation -= (input_section->output_section->vma - + input_section->output_offset - - input_section->vma); - - /* Change the addend if necessary. */ - if (relocation != 0) - PUT_WORD (output_bfd, r_addend + relocation, rel->r_addend); - - /* Change the address of the relocation. */ - PUT_WORD (output_bfd, - r_addr + input_section->output_offset, - rel->r_address); - } - else - { - boolean hundef; - bfd_reloc_status_type r; - - /* We are generating an executable, and must do a full - relocation. */ - hundef = false; - if (r_extern) - { - h = sym_hashes[r_index]; - - if (h != (struct aout_link_hash_entry *) NULL - && (h->root.type == bfd_link_hash_defined - || h->root.type == bfd_link_hash_defweak)) - { - relocation = (h->root.u.def.value - + h->root.u.def.section->output_section->vma - + h->root.u.def.section->output_offset); - } - else if (h != (struct aout_link_hash_entry *) NULL - && h->root.type == bfd_link_hash_undefweak) - relocation = 0; - else - { - hundef = true; - relocation = 0; - } - } - else if (r_type == RELOC_BASE10 - || r_type == RELOC_BASE13 - || r_type == RELOC_BASE22) - { - struct external_nlist *sym; - int type; - - /* For base relative relocs, r_index is always an index - into the symbol table, even if r_extern is 0. */ - sym = syms + r_index; - type = bfd_h_get_8 (input_bfd, sym->e_type); - if ((type & N_TYPE) == N_TEXT - || type == N_WEAKT) - r_section = obj_textsec (input_bfd); - else if ((type & N_TYPE) == N_DATA - || type == N_WEAKD) - r_section = obj_datasec (input_bfd); - else if ((type & N_TYPE) == N_BSS - || type == N_WEAKB) - r_section = obj_bsssec (input_bfd); - else if ((type & N_TYPE) == N_ABS - || type == N_WEAKA) - r_section = bfd_abs_section_ptr; - else - abort (); - relocation = (r_section->output_section->vma - + r_section->output_offset - + (GET_WORD (input_bfd, sym->e_value) - - r_section->vma)); - } - else - { - r_section = aout_reloc_index_to_section (input_bfd, r_index); - - /* If this is a PC relative reloc, then R_ADDEND is the - difference between the two vmas, or - old_dest_sec + old_dest_off - (old_src_sec + old_src_off) - where - old_dest_sec == section->vma - and - old_src_sec == input_section->vma - and - old_src_off == r_addr - - _bfd_final_link_relocate expects RELOCATION + - R_ADDEND to be the VMA of the destination minus - r_addr (the minus r_addr is because this relocation - is not pcrel_offset, which is a bit confusing and - should, perhaps, be changed), or - new_dest_sec - where - new_dest_sec == output_section->vma + output_offset - We arrange for this to happen by setting RELOCATION to - new_dest_sec + old_src_sec - old_dest_sec - - If this is not a PC relative reloc, then R_ADDEND is - simply the VMA of the destination, so we set - RELOCATION to the change in the destination VMA, or - new_dest_sec - old_dest_sec - */ - relocation = (r_section->output_section->vma - + r_section->output_offset - - r_section->vma); - if (howto_table_ext[r_type].pc_relative) - relocation += input_section->vma; - } - - if (check_dynamic_reloc != NULL) - { - boolean skip; - - if (! ((*check_dynamic_reloc) - (finfo->info, input_bfd, input_section, h, - (PTR) rel, contents, &skip, &relocation))) - return false; - if (skip) - continue; - } - - /* Now warn if a global symbol is undefined. We could not - do this earlier, because check_dynamic_reloc might want - to skip this reloc. */ - if (hundef - && ! finfo->info->shared - && r_type != RELOC_BASE10 - && r_type != RELOC_BASE13 - && r_type != RELOC_BASE22) - { - const char *name; - - if (h != NULL) - name = h->root.root.string; - else - name = strings + GET_WORD (input_bfd, syms[r_index].e_strx); - if (! ((*finfo->info->callbacks->undefined_symbol) - (finfo->info, name, input_bfd, input_section, r_addr))) - return false; - } - - r = MY_final_link_relocate (howto_table_ext + r_type, - input_bfd, input_section, - contents, r_addr, relocation, - r_addend); - if (r != bfd_reloc_ok) - { - switch (r) - { - default: - case bfd_reloc_outofrange: - abort (); - case bfd_reloc_overflow: - { - const char *name; - - if (r_extern - || r_type == RELOC_BASE10 - || r_type == RELOC_BASE13 - || r_type == RELOC_BASE22) - name = strings + GET_WORD (input_bfd, - syms[r_index].e_strx); - else - { - asection *s; - - s = aout_reloc_index_to_section (input_bfd, r_index); - name = bfd_section_name (input_bfd, s); - } - if (! ((*finfo->info->callbacks->reloc_overflow) - (finfo->info, name, howto_table_ext[r_type].name, - r_addend, input_bfd, input_section, r_addr))) - return false; - } - break; - } - } - } - } - - return true; -} - -/* Handle a link order which is supposed to generate a reloc. */ - -static boolean -aout_link_reloc_link_order (finfo, o, p) - struct aout_final_link_info *finfo; - asection *o; - struct bfd_link_order *p; -{ - struct bfd_link_order_reloc *pr; - int r_index; - int r_extern; - reloc_howto_type *howto; - file_ptr *reloff_ptr; - struct reloc_std_external srel; - struct reloc_ext_external erel; - PTR rel_ptr; - - pr = p->u.reloc.p; - - if (p->type == bfd_section_reloc_link_order) - { - r_extern = 0; - if (bfd_is_abs_section (pr->u.section)) - r_index = N_ABS | N_EXT; - else - { - BFD_ASSERT (pr->u.section->owner == finfo->output_bfd); - r_index = pr->u.section->target_index; - } - } - else - { - struct aout_link_hash_entry *h; - - BFD_ASSERT (p->type == bfd_symbol_reloc_link_order); - r_extern = 1; - h = ((struct aout_link_hash_entry *) - bfd_wrapped_link_hash_lookup (finfo->output_bfd, finfo->info, - pr->u.name, false, false, true)); - if (h != (struct aout_link_hash_entry *) NULL - && h->indx >= 0) - r_index = h->indx; - else if (h != NULL) - { - /* We decided to strip this symbol, but it turns out that we - can't. Note that we lose the other and desc information - here. I don't think that will ever matter for a global - symbol. */ - h->indx = -2; - h->written = false; - if (! aout_link_write_other_symbol (h, (PTR) finfo)) - return false; - r_index = h->indx; - } - else - { - if (! ((*finfo->info->callbacks->unattached_reloc) - (finfo->info, pr->u.name, (bfd *) NULL, - (asection *) NULL, (bfd_vma) 0))) - return false; - r_index = 0; - } - } - - howto = bfd_reloc_type_lookup (finfo->output_bfd, pr->reloc); - if (howto == 0) - { - bfd_set_error (bfd_error_bad_value); - return false; - } - - if (o == obj_textsec (finfo->output_bfd)) - reloff_ptr = &finfo->treloff; - else if (o == obj_datasec (finfo->output_bfd)) - reloff_ptr = &finfo->dreloff; - else - abort (); - - if (obj_reloc_entry_size (finfo->output_bfd) == RELOC_STD_SIZE) - { -#ifdef MY_put_reloc - MY_put_reloc(finfo->output_bfd, r_extern, r_index, p->offset, howto, - &srel); -#else - { - int r_pcrel; - int r_baserel; - int r_jmptable; - int r_relative; - int r_length; - - r_pcrel = howto->pc_relative; - r_baserel = (howto->type & 8) != 0; - r_jmptable = (howto->type & 16) != 0; - r_relative = (howto->type & 32) != 0; - r_length = howto->size; - - PUT_WORD (finfo->output_bfd, p->offset, srel.r_address); - if (bfd_header_big_endian (finfo->output_bfd)) - { - srel.r_index[0] = r_index >> 16; - srel.r_index[1] = r_index >> 8; - srel.r_index[2] = r_index; - srel.r_type[0] = - ((r_extern ? RELOC_STD_BITS_EXTERN_BIG : 0) - | (r_pcrel ? RELOC_STD_BITS_PCREL_BIG : 0) - | (r_baserel ? RELOC_STD_BITS_BASEREL_BIG : 0) - | (r_jmptable ? RELOC_STD_BITS_JMPTABLE_BIG : 0) - | (r_relative ? RELOC_STD_BITS_RELATIVE_BIG : 0) - | (r_length << RELOC_STD_BITS_LENGTH_SH_BIG)); - } - else - { - srel.r_index[2] = r_index >> 16; - srel.r_index[1] = r_index >> 8; - srel.r_index[0] = r_index; - srel.r_type[0] = - ((r_extern ? RELOC_STD_BITS_EXTERN_LITTLE : 0) - | (r_pcrel ? RELOC_STD_BITS_PCREL_LITTLE : 0) - | (r_baserel ? RELOC_STD_BITS_BASEREL_LITTLE : 0) - | (r_jmptable ? RELOC_STD_BITS_JMPTABLE_LITTLE : 0) - | (r_relative ? RELOC_STD_BITS_RELATIVE_LITTLE : 0) - | (r_length << RELOC_STD_BITS_LENGTH_SH_LITTLE)); - } - } -#endif - rel_ptr = (PTR) &srel; - - /* We have to write the addend into the object file, since - standard a.out relocs are in place. It would be more - reliable if we had the current contents of the file here, - rather than assuming zeroes, but we can't read the file since - it was opened using bfd_openw. */ - if (pr->addend != 0) - { - bfd_size_type size; - bfd_reloc_status_type r; - bfd_byte *buf; - boolean ok; - - size = bfd_get_reloc_size (howto); - buf = (bfd_byte *) bfd_zmalloc (size); - if (buf == (bfd_byte *) NULL) - return false; - r = MY_relocate_contents (howto, finfo->output_bfd, - pr->addend, buf); - switch (r) - { - case bfd_reloc_ok: - break; - default: - case bfd_reloc_outofrange: - abort (); - case bfd_reloc_overflow: - if (! ((*finfo->info->callbacks->reloc_overflow) - (finfo->info, - (p->type == bfd_section_reloc_link_order - ? bfd_section_name (finfo->output_bfd, - pr->u.section) - : pr->u.name), - howto->name, pr->addend, (bfd *) NULL, - (asection *) NULL, (bfd_vma) 0))) - { - free (buf); - return false; - } - break; - } - ok = bfd_set_section_contents (finfo->output_bfd, o, - (PTR) buf, - (file_ptr) p->offset, - size); - free (buf); - if (! ok) - return false; - } - } - else - { - PUT_WORD (finfo->output_bfd, p->offset, erel.r_address); - - if (bfd_header_big_endian (finfo->output_bfd)) - { - erel.r_index[0] = r_index >> 16; - erel.r_index[1] = r_index >> 8; - erel.r_index[2] = r_index; - erel.r_type[0] = - ((r_extern ? RELOC_EXT_BITS_EXTERN_BIG : 0) - | (howto->type << RELOC_EXT_BITS_TYPE_SH_BIG)); - } - else - { - erel.r_index[2] = r_index >> 16; - erel.r_index[1] = r_index >> 8; - erel.r_index[0] = r_index; - erel.r_type[0] = - (r_extern ? RELOC_EXT_BITS_EXTERN_LITTLE : 0) - | (howto->type << RELOC_EXT_BITS_TYPE_SH_LITTLE); - } - - PUT_WORD (finfo->output_bfd, pr->addend, erel.r_addend); - - rel_ptr = (PTR) &erel; - } - - if (bfd_seek (finfo->output_bfd, *reloff_ptr, SEEK_SET) != 0 - || (bfd_write (rel_ptr, (bfd_size_type) 1, - obj_reloc_entry_size (finfo->output_bfd), - finfo->output_bfd) - != obj_reloc_entry_size (finfo->output_bfd))) - return false; - - *reloff_ptr += obj_reloc_entry_size (finfo->output_bfd); - - /* Assert that the relocs have not run into the symbols, and that n - the text relocs have not run into the data relocs. */ - BFD_ASSERT (*reloff_ptr <= obj_sym_filepos (finfo->output_bfd) - && (reloff_ptr != &finfo->treloff - || (*reloff_ptr - <= obj_datasec (finfo->output_bfd)->rel_filepos))); - - return true; -} diff --git a/contrib/gdb/bfd/archive.c b/contrib/gdb/bfd/archive.c deleted file mode 100644 index 248b9181e75eb..0000000000000 --- a/contrib/gdb/bfd/archive.c +++ /dev/null @@ -1,2094 +0,0 @@ -/* BFD back-end for archive files (libraries). - Copyright 1990, 91, 92, 93, 94, 95, 1996 Free Software Foundation, Inc. - Written by Cygnus Support. Mostly Gumby Henkel-Wallace's fault. - -This file is part of BFD, the Binary File Descriptor library. - -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 2 of the License, 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ - -/* -@setfilename archive-info -SECTION - Archives - -DESCRIPTION - An archive (or library) is just another BFD. It has a symbol - table, although there's not much a user program will do with it. - - The big difference between an archive BFD and an ordinary BFD - is that the archive doesn't have sections. Instead it has a - chain of BFDs that are considered its contents. These BFDs can - be manipulated like any other. The BFDs contained in an - archive opened for reading will all be opened for reading. You - may put either input or output BFDs into an archive opened for - output; they will be handled correctly when the archive is closed. - - Use <<bfd_openr_next_archived_file>> to step through - the contents of an archive opened for input. You don't - have to read the entire archive if you don't want - to! Read it until you find what you want. - - Archive contents of output BFDs are chained through the - <<next>> pointer in a BFD. The first one is findable through - the <<archive_head>> slot of the archive. Set it with - <<bfd_set_archive_head>> (q.v.). A given BFD may be in only one - open output archive at a time. - - As expected, the BFD archive code is more general than the - archive code of any given environment. BFD archives may - contain files of different formats (e.g., a.out and coff) and - even different architectures. You may even place archives - recursively into archives! - - This can cause unexpected confusion, since some archive - formats are more expressive than others. For instance, Intel - COFF archives can preserve long filenames; SunOS a.out archives - cannot. If you move a file from the first to the second - format and back again, the filename may be truncated. - Likewise, different a.out environments have different - conventions as to how they truncate filenames, whether they - preserve directory names in filenames, etc. When - interoperating with native tools, be sure your files are - homogeneous. - - Beware: most of these formats do not react well to the - presence of spaces in filenames. We do the best we can, but - can't always handle this case due to restrictions in the format of - archives. Many Unix utilities are braindead in regards to - spaces and such in filenames anyway, so this shouldn't be much - of a restriction. - - Archives are supported in BFD in <<archive.c>>. - -*/ - -/* Assumes: - o - all archive elements start on an even boundary, newline padded; - o - all arch headers are char *; - o - all arch headers are the same size (across architectures). -*/ - -/* Some formats provide a way to cram a long filename into the short - (16 chars) space provided by a BSD archive. The trick is: make a - special "file" in the front of the archive, sort of like the SYMDEF - entry. If the filename is too long to fit, put it in the extended - name table, and use its index as the filename. To prevent - confusion prepend the index with a space. This means you can't - have filenames that start with a space, but then again, many Unix - utilities can't handle that anyway. - - This scheme unfortunately requires that you stand on your head in - order to write an archive since you need to put a magic file at the - front, and need to touch every entry to do so. C'est la vie. - - We support two variants of this idea: - The SVR4 format (extended name table is named "//"), - and an extended pseudo-BSD variant (extended name table is named - "ARFILENAMES/"). The origin of the latter format is uncertain. - - BSD 4.4 uses a third scheme: It writes a long filename - directly after the header. This allows 'ar q' to work. - We currently can read BSD 4.4 archives, but not write them. -*/ - -/* Summary of archive member names: - - Symbol table (must be first): - "__.SYMDEF " - Symbol table, Berkeley style, produced by ranlib. - "/ " - Symbol table, system 5 style. - - Long name table (must be before regular file members): - "// " - Long name table, System 5 R4 style. - "ARFILENAMES/ " - Long name table, non-standard extended BSD (not BSD 4.4). - - Regular file members with short names: - "filename.o/ " - Regular file, System 5 style (embedded spaces ok). - "filename.o " - Regular file, Berkeley style (no embedded spaces). - - Regular files with long names (or embedded spaces, for BSD variants): - "/18 " - SVR4 style, name at offset 18 in name table. - "#1/23 " - Long name (or embedded paces) 23 characters long, - BSD 4.4 style, full name follows header. - Implemented for reading, not writing. - " 18 " - Long name 18 characters long, extended pseudo-BSD. - */ - -#include "bfd.h" -#include "sysdep.h" -#include "libbfd.h" -#include "aout/ar.h" -#include "aout/ranlib.h" -#include <errno.h> -#include <string.h> /* For memchr, strrchr and friends */ -#include <ctype.h> - -#ifndef errno -extern int errno; -#endif - -#ifdef GNU960 -#define BFD_GNU960_ARMAG(abfd) (BFD_COFF_FILE_P((abfd)) ? ARMAG : ARMAGB) -#endif - -/* Can't define this in hosts/foo.h, because (e.g. in gprof) the hosts file - is included, then obstack.h, which thinks if offsetof is defined, it - doesn't need to include stddef.h. */ -/* Define offsetof for those systems which lack it */ - -#if !defined (offsetof) -#define offsetof(TYPE, MEMBER) ((unsigned long) &((TYPE *)0)->MEMBER) -#endif - -/* We keep a cache of archive filepointers to archive elements to - speed up searching the archive by filepos. We only add an entry to - the cache when we actually read one. We also don't sort the cache; - it's generally short enough to search linearly. - Note that the pointers here point to the front of the ar_hdr, not - to the front of the contents! -*/ -struct ar_cache -{ - file_ptr ptr; - bfd *arelt; - struct ar_cache *next; -}; - -#define ar_padchar(abfd) ((abfd)->xvec->ar_pad_char) -#define ar_maxnamelen(abfd) ((abfd)->xvec->ar_max_namelen) - -#define arch_eltdata(bfd) ((struct areltdata *)((bfd)->arelt_data)) -#define arch_hdr(bfd) ((struct ar_hdr *)arch_eltdata(bfd)->arch_header) - -static char *get_extended_arelt_filename PARAMS ((bfd *arch, - const char *name)); -static boolean do_slurp_bsd_armap PARAMS ((bfd *abfd)); -static boolean do_slurp_coff_armap PARAMS ((bfd *abfd)); -static const char *normalize PARAMS ((bfd *, const char *file)); -static struct areltdata *bfd_ar_hdr_from_filesystem PARAMS ((bfd *abfd, - const char *)); - -boolean -_bfd_generic_mkarchive (abfd) - bfd *abfd; -{ - abfd->tdata.aout_ar_data = ((struct artdata *) - bfd_zalloc (abfd, sizeof (struct artdata))); - - if (bfd_ardata (abfd) == NULL) - return false; - - bfd_ardata (abfd)->cache = NULL; - bfd_ardata (abfd)->archive_head = NULL; - bfd_ardata (abfd)->symdefs = NULL; - bfd_ardata (abfd)->extended_names = NULL; - bfd_ardata (abfd)->tdata = NULL; - - return true; -} - -/* -FUNCTION - bfd_get_next_mapent - -SYNOPSIS - symindex bfd_get_next_mapent(bfd *abfd, symindex previous, carsym **sym); - -DESCRIPTION - Step through archive @var{abfd}'s symbol table (if it - has one). Successively update @var{sym} with the next symbol's - information, returning that symbol's (internal) index into the - symbol table. - - Supply <<BFD_NO_MORE_SYMBOLS>> as the @var{previous} entry to get - the first one; returns <<BFD_NO_MORE_SYMBOLS>> when you've already - got the last one. - - A <<carsym>> is a canonical archive symbol. The only - user-visible element is its name, a null-terminated string. -*/ - -symindex -bfd_get_next_mapent (abfd, prev, entry) - bfd *abfd; - symindex prev; - carsym **entry; -{ - if (!bfd_has_map (abfd)) - { - bfd_set_error (bfd_error_invalid_operation); - return BFD_NO_MORE_SYMBOLS; - } - - if (prev == BFD_NO_MORE_SYMBOLS) - prev = 0; - else - ++prev; - if (prev >= bfd_ardata (abfd)->symdef_count) - return BFD_NO_MORE_SYMBOLS; - - *entry = (bfd_ardata (abfd)->symdefs + prev); - return prev; -} - -/* To be called by backends only */ - -bfd * -_bfd_create_empty_archive_element_shell (obfd) - bfd *obfd; -{ - return _bfd_new_bfd_contained_in (obfd); -} - -/* -FUNCTION - bfd_set_archive_head - -SYNOPSIS - boolean bfd_set_archive_head(bfd *output, bfd *new_head); - -DESCRIPTION - Set the head of the chain of - BFDs contained in the archive @var{output} to @var{new_head}. -*/ - -boolean -bfd_set_archive_head (output_archive, new_head) - bfd *output_archive; - bfd *new_head; -{ - - output_archive->archive_head = new_head; - return true; -} - -bfd * -_bfd_look_for_bfd_in_cache (arch_bfd, filepos) - bfd *arch_bfd; - file_ptr filepos; -{ - struct ar_cache *current; - - for (current = bfd_ardata (arch_bfd)->cache; current != NULL; - current = current->next) - if (current->ptr == filepos) - return current->arelt; - - return NULL; -} - -/* Kind of stupid to call cons for each one, but we don't do too many */ -boolean -_bfd_add_bfd_to_archive_cache (arch_bfd, filepos, new_elt) - bfd *arch_bfd, *new_elt; - file_ptr filepos; -{ - struct ar_cache *new_cache = ((struct ar_cache *) - bfd_zalloc (arch_bfd, - sizeof (struct ar_cache))); - - if (new_cache == NULL) - return false; - - new_cache->ptr = filepos; - new_cache->arelt = new_elt; - new_cache->next = (struct ar_cache *) NULL; - if (bfd_ardata (arch_bfd)->cache == NULL) - bfd_ardata (arch_bfd)->cache = new_cache; - else - { - struct ar_cache *current = bfd_ardata (arch_bfd)->cache; - - while (current->next != NULL) - current = current->next; - current->next = new_cache; - } - - return true; -} - -/* The name begins with space. Hence the rest of the name is an index into - the string table. */ - -static char * -get_extended_arelt_filename (arch, name) - bfd *arch; - const char *name; -{ - unsigned long index = 0; - - /* Should extract string so that I can guarantee not to overflow into - the next region, but I'm too lazy. */ - errno = 0; - /* Skip first char, which is '/' in SVR4 or ' ' in some other variants. */ - index = strtol (name + 1, NULL, 10); - if (errno != 0) - { - bfd_set_error (bfd_error_malformed_archive); - return NULL; - } - - return bfd_ardata (arch)->extended_names + index; -} - -/* This functions reads an arch header and returns an areltdata pointer, or - NULL on error. - - Presumes the file pointer is already in the right place (ie pointing - to the ar_hdr in the file). Moves the file pointer; on success it - should be pointing to the front of the file contents; on failure it - could have been moved arbitrarily. -*/ - -PTR -_bfd_generic_read_ar_hdr (abfd) - bfd *abfd; -{ - return _bfd_generic_read_ar_hdr_mag (abfd, (const char *) NULL); -} - -/* Alpha ECOFF uses an optional different ARFMAG value, so we have a - variant of _bfd_generic_read_ar_hdr which accepts a magic string. */ - -PTR -_bfd_generic_read_ar_hdr_mag (abfd, mag) - bfd *abfd; - const char *mag; -{ - struct ar_hdr hdr; - char *hdrp = (char *) &hdr; - unsigned int parsed_size; - struct areltdata *ared; - char *filename = NULL; - unsigned int namelen = 0; - unsigned int allocsize = sizeof (struct areltdata) + sizeof (struct ar_hdr); - char *allocptr = 0; - - if (bfd_read ((PTR) hdrp, 1, sizeof (struct ar_hdr), abfd) - != sizeof (struct ar_hdr)) - { - if (bfd_get_error () != bfd_error_system_call) - bfd_set_error (bfd_error_no_more_archived_files); - return NULL; - } - if (strncmp (hdr.ar_fmag, ARFMAG, 2) != 0 - && (mag == NULL - || strncmp (hdr.ar_fmag, mag, 2) != 0)) - { - bfd_set_error (bfd_error_malformed_archive); - return NULL; - } - - errno = 0; - parsed_size = strtol (hdr.ar_size, NULL, 10); - if (errno != 0) - { - bfd_set_error (bfd_error_malformed_archive); - return NULL; - } - - /* Extract the filename from the archive - there are two ways to - specify an extendend name table, either the first char of the - name is a space, or it's a slash. */ - if ((hdr.ar_name[0] == '/' - || (hdr.ar_name[0] == ' ' - && memchr (hdr.ar_name, '/', ar_maxnamelen (abfd)) == NULL)) - && bfd_ardata (abfd)->extended_names != NULL) - { - filename = get_extended_arelt_filename (abfd, hdr.ar_name); - if (filename == NULL) - { - bfd_set_error (bfd_error_malformed_archive); - return NULL; - } - } - /* BSD4.4-style long filename. - Only implemented for reading, so far! */ - else if (hdr.ar_name[0] == '#' && hdr.ar_name[1] == '1' - && hdr.ar_name[2] == '/' && isdigit (hdr.ar_name[3])) - { - /* BSD-4.4 extended name */ - namelen = atoi (&hdr.ar_name[3]); - allocsize += namelen + 1; - parsed_size -= namelen; - - allocptr = bfd_zalloc (abfd, allocsize); - if (allocptr == NULL) - return NULL; - filename = (allocptr - + sizeof (struct areltdata) - + sizeof (struct ar_hdr)); - if (bfd_read (filename, 1, namelen, abfd) != namelen) - { - if (bfd_get_error () != bfd_error_system_call) - bfd_set_error (bfd_error_no_more_archived_files); - return NULL; - } - filename[namelen] = '\0'; - } - else - { - /* We judge the end of the name by looking for '/' or ' '. - Note: The SYSV format (terminated by '/') allows embedded - spaces, so only look for ' ' if we don't find '/'. */ - - namelen = 0; - while (hdr.ar_name[namelen] != '\0' && - hdr.ar_name[namelen] != '/') - { - namelen++; - if (namelen == (unsigned) ar_maxnamelen (abfd)) - { - namelen = 0; - while (hdr.ar_name[namelen] != ' ' - && namelen < (unsigned) ar_maxnamelen (abfd)) - namelen++; - break; - } - } - - allocsize += namelen + 1; - } - - if (!allocptr) - { - allocptr = bfd_zalloc (abfd, allocsize); - if (allocptr == NULL) - return NULL; - } - - ared = (struct areltdata *) allocptr; - - ared->arch_header = allocptr + sizeof (struct areltdata); - memcpy ((char *) ared->arch_header, (char *) &hdr, sizeof (struct ar_hdr)); - ared->parsed_size = parsed_size; - - if (filename != NULL) - ared->filename = filename; - else - { - ared->filename = allocptr + (sizeof (struct areltdata) + - sizeof (struct ar_hdr)); - if (namelen) - memcpy (ared->filename, hdr.ar_name, namelen); - ared->filename[namelen] = '\0'; - } - - return (PTR) ared; -} - -/* This is an internal function; it's mainly used when indexing - through the archive symbol table, but also used to get the next - element, since it handles the bookkeeping so nicely for us. */ - -bfd * -_bfd_get_elt_at_filepos (archive, filepos) - bfd *archive; - file_ptr filepos; -{ - struct areltdata *new_areldata; - bfd *n_nfd; - - n_nfd = _bfd_look_for_bfd_in_cache (archive, filepos); - if (n_nfd) - return n_nfd; - - if (0 > bfd_seek (archive, filepos, SEEK_SET)) - return NULL; - - if ((new_areldata = (struct areltdata *) _bfd_read_ar_hdr (archive)) == NULL) - return NULL; - - n_nfd = _bfd_create_empty_archive_element_shell (archive); - if (n_nfd == NULL) - { - bfd_release (archive, (PTR) new_areldata); - return NULL; - } - - n_nfd->origin = bfd_tell (archive); - n_nfd->arelt_data = (PTR) new_areldata; - n_nfd->filename = new_areldata->filename; - - if (_bfd_add_bfd_to_archive_cache (archive, filepos, n_nfd)) - return n_nfd; - - /* huh? */ - bfd_release (archive, (PTR) n_nfd); - bfd_release (archive, (PTR) new_areldata); - return NULL; -} - -/* Return the BFD which is referenced by the symbol in ABFD indexed by - INDEX. INDEX should have been returned by bfd_get_next_mapent. */ - -bfd * -_bfd_generic_get_elt_at_index (abfd, index) - bfd *abfd; - symindex index; -{ - carsym *entry; - - entry = bfd_ardata (abfd)->symdefs + index; - return _bfd_get_elt_at_filepos (abfd, entry->file_offset); -} - -/* -FUNCTION - bfd_openr_next_archived_file - -SYNOPSIS - bfd *bfd_openr_next_archived_file(bfd *archive, bfd *previous); - -DESCRIPTION - Provided a BFD, @var{archive}, containing an archive and NULL, open - an input BFD on the first contained element and returns that. - Subsequent calls should pass - the archive and the previous return value to return a created - BFD to the next contained element. NULL is returned when there - are no more. - -*/ - -bfd * -bfd_openr_next_archived_file (archive, last_file) - bfd *archive; - bfd *last_file; -{ - if ((bfd_get_format (archive) != bfd_archive) || - (archive->direction == write_direction)) - { - bfd_set_error (bfd_error_invalid_operation); - return NULL; - } - - return BFD_SEND (archive, - openr_next_archived_file, - (archive, - last_file)); -} - -bfd * -bfd_generic_openr_next_archived_file (archive, last_file) - bfd *archive; - bfd *last_file; -{ - file_ptr filestart; - - if (!last_file) - filestart = bfd_ardata (archive)->first_file_filepos; - else - { - unsigned int size = arelt_size (last_file); - /* Pad to an even boundary... - Note that last_file->origin can be odd in the case of - BSD-4.4-style element with a long odd size. */ - filestart = last_file->origin + size; - filestart += filestart % 2; - } - - return _bfd_get_elt_at_filepos (archive, filestart); -} - - -const bfd_target * -bfd_generic_archive_p (abfd) - bfd *abfd; -{ - struct artdata *tdata_hold; - char armag[SARMAG + 1]; - - tdata_hold = abfd->tdata.aout_ar_data; - - if (bfd_read ((PTR) armag, 1, SARMAG, abfd) != SARMAG) - { - if (bfd_get_error () != bfd_error_system_call) - bfd_set_error (bfd_error_wrong_format); - return NULL; - } - -#ifdef GNU960 - if (strncmp (armag, BFD_GNU960_ARMAG (abfd), SARMAG) != 0) - return 0; -#else - if (strncmp (armag, ARMAG, SARMAG) != 0 && - strncmp (armag, ARMAGB, SARMAG) != 0) - return 0; -#endif - - /* We are setting bfd_ardata(abfd) here, but since bfd_ardata - involves a cast, we can't do it as the left operand of assignment. */ - abfd->tdata.aout_ar_data = ((struct artdata *) - bfd_zalloc (abfd, sizeof (struct artdata))); - - if (bfd_ardata (abfd) == NULL) - return NULL; - - bfd_ardata (abfd)->first_file_filepos = SARMAG; - bfd_ardata (abfd)->cache = NULL; - bfd_ardata (abfd)->archive_head = NULL; - bfd_ardata (abfd)->symdefs = NULL; - bfd_ardata (abfd)->extended_names = NULL; - bfd_ardata (abfd)->tdata = NULL; - - if (!BFD_SEND (abfd, _bfd_slurp_armap, (abfd))) - { - bfd_release (abfd, bfd_ardata (abfd)); - abfd->tdata.aout_ar_data = tdata_hold; - return NULL; - } - - if (!BFD_SEND (abfd, _bfd_slurp_extended_name_table, (abfd))) - { - bfd_release (abfd, bfd_ardata (abfd)); - abfd->tdata.aout_ar_data = tdata_hold; - return NULL; - } - - if (bfd_has_map (abfd)) - { - bfd *first; - - /* This archive has a map, so we may presume that the contents - are object files. Make sure that if the first file in the - archive can be recognized as an object file, it is for this - target. If not, assume that this is the wrong format. If - the first file is not an object file, somebody is doing - something weird, and we permit it so that ar -t will work. - - This is done because any normal format will recognize any - normal archive, regardless of the format of the object files. - We do accept an empty archive. */ - - first = bfd_openr_next_archived_file (abfd, (bfd *) NULL); - if (first != NULL) - { - boolean fail; - - first->target_defaulted = false; - fail = false; - if (bfd_check_format (first, bfd_object) - && first->xvec != abfd->xvec) - { - (void) bfd_close (first); - bfd_release (abfd, bfd_ardata (abfd)); - abfd->tdata.aout_ar_data = tdata_hold; - bfd_set_error (bfd_error_wrong_format); - return NULL; - } - - /* We ought to close first here, but we can't, because we - have no way to remove it from the archive cache. FIXME. */ - } - } - - return abfd->xvec; -} - -/* Some constants for a 32 bit BSD archive structure. We do not - support 64 bit archives presently; so far as I know, none actually - exist. Supporting them would require changing these constants, and - changing some bfd_h_get_32 to bfd_h_get_64. */ - -/* The size of an external symdef structure. */ -#define BSD_SYMDEF_SIZE 8 - -/* The offset from the start of a symdef structure to the file offset. */ -#define BSD_SYMDEF_OFFSET_SIZE 4 - -/* The size of the symdef count. */ -#define BSD_SYMDEF_COUNT_SIZE 4 - -/* The size of the string count. */ -#define BSD_STRING_COUNT_SIZE 4 - -/* Returns false on error, true otherwise */ - -static boolean -do_slurp_bsd_armap (abfd) - bfd *abfd; -{ - struct areltdata *mapdata; - unsigned int counter; - bfd_byte *raw_armap, *rbase; - struct artdata *ardata = bfd_ardata (abfd); - char *stringbase; - unsigned int parsed_size; - carsym *set; - - mapdata = (struct areltdata *) _bfd_read_ar_hdr (abfd); - if (mapdata == NULL) - return false; - parsed_size = mapdata->parsed_size; - bfd_release (abfd, (PTR) mapdata); /* Don't need it any more. */ - - raw_armap = (bfd_byte *) bfd_zalloc (abfd, parsed_size); - if (raw_armap == (bfd_byte *) NULL) - return false; - - if (bfd_read ((PTR) raw_armap, 1, parsed_size, abfd) != parsed_size) - { - if (bfd_get_error () != bfd_error_system_call) - bfd_set_error (bfd_error_malformed_archive); - byebye: - bfd_release (abfd, (PTR) raw_armap); - return false; - } - - ardata->symdef_count = bfd_h_get_32 (abfd, raw_armap) / BSD_SYMDEF_SIZE; - - if (ardata->symdef_count * BSD_SYMDEF_SIZE > - parsed_size - BSD_SYMDEF_COUNT_SIZE) - { - /* Probably we're using the wrong byte ordering. */ - bfd_set_error (bfd_error_wrong_format); - goto byebye; - } - - ardata->cache = 0; - rbase = raw_armap + BSD_SYMDEF_COUNT_SIZE; - stringbase = ((char *) rbase - + ardata->symdef_count * BSD_SYMDEF_SIZE - + BSD_STRING_COUNT_SIZE); - ardata->symdefs = (carsym *) bfd_alloc (abfd, - (ardata->symdef_count - * sizeof (carsym))); - if (!ardata->symdefs) - return false; - - for (counter = 0, set = ardata->symdefs; - counter < ardata->symdef_count; - counter++, set++, rbase += BSD_SYMDEF_SIZE) - { - set->name = bfd_h_get_32 (abfd, rbase) + stringbase; - set->file_offset = bfd_h_get_32 (abfd, rbase + BSD_SYMDEF_OFFSET_SIZE); - } - - ardata->first_file_filepos = bfd_tell (abfd); - /* Pad to an even boundary if you have to */ - ardata->first_file_filepos += (ardata->first_file_filepos) % 2; - /* FIXME, we should provide some way to free raw_ardata when - we are done using the strings from it. For now, it seems - to be allocated on an obstack anyway... */ - bfd_has_map (abfd) = true; - return true; -} - -/* Returns false on error, true otherwise */ -static boolean -do_slurp_coff_armap (abfd) - bfd *abfd; -{ - struct areltdata *mapdata; - int *raw_armap, *rawptr; - struct artdata *ardata = bfd_ardata (abfd); - char *stringbase; - unsigned int stringsize; - unsigned int parsed_size; - carsym *carsyms; - unsigned int nsymz; /* Number of symbols in armap. */ - bfd_vma (*swap) PARAMS ((const bfd_byte *)); - char int_buf[sizeof (long)]; - unsigned int carsym_size, ptrsize, i; - - mapdata = (struct areltdata *) _bfd_read_ar_hdr (abfd); - if (mapdata == NULL) - return false; - parsed_size = mapdata->parsed_size; - bfd_release (abfd, (PTR) mapdata); /* Don't need it any more. */ - - if (bfd_read ((PTR) int_buf, 1, 4, abfd) != 4) - { - if (bfd_get_error () != bfd_error_system_call) - bfd_set_error (bfd_error_malformed_archive); - return false; - } - /* It seems that all numeric information in a coff archive is always - in big endian format, nomatter the host or target. */ - swap = bfd_getb32; - nsymz = bfd_getb32 ((PTR) int_buf); - stringsize = parsed_size - (4 * nsymz) - 4; - -#if 1 - /* ... except that some archive formats are broken, and it may be our - fault - the i960 little endian coff sometimes has big and sometimes - little, because our tools changed. Here's a horrible hack to clean - up the crap. */ - - if (stringsize > 0xfffff) - { - /* This looks dangerous, let's do it the other way around */ - nsymz = bfd_getl32 ((PTR) int_buf); - stringsize = parsed_size - (4 * nsymz) - 4; - swap = bfd_getl32; - } -#endif - - /* The coff armap must be read sequentially. So we construct a - bsd-style one in core all at once, for simplicity. */ - - carsym_size = (nsymz * sizeof (carsym)); - ptrsize = (4 * nsymz); - - ardata->symdefs = (carsym *) bfd_zalloc (abfd, carsym_size + stringsize + 1); - if (ardata->symdefs == NULL) - return false; - carsyms = ardata->symdefs; - stringbase = ((char *) ardata->symdefs) + carsym_size; - - /* Allocate and read in the raw offsets. */ - raw_armap = (int *) bfd_alloc (abfd, ptrsize); - if (raw_armap == NULL) - goto release_symdefs; - if (bfd_read ((PTR) raw_armap, 1, ptrsize, abfd) != ptrsize - || bfd_read ((PTR) stringbase, 1, stringsize, abfd) != stringsize) - { - if (bfd_get_error () != bfd_error_system_call) - bfd_set_error (bfd_error_malformed_archive); - goto release_raw_armap; - } - - /* OK, build the carsyms */ - for (i = 0; i < nsymz; i++) - { - rawptr = raw_armap + i; - carsyms->file_offset = swap ((PTR) rawptr); - carsyms->name = stringbase; - stringbase += strlen (stringbase) + 1; - carsyms++; - } - *stringbase = 0; - - ardata->symdef_count = nsymz; - ardata->first_file_filepos = bfd_tell (abfd); - /* Pad to an even boundary if you have to */ - ardata->first_file_filepos += (ardata->first_file_filepos) % 2; - - - bfd_has_map (abfd) = true; - bfd_release (abfd, (PTR) raw_armap); - - - /* Check for a second archive header (as used by PE) */ - { - struct areltdata *tmp; - - bfd_seek (abfd, ardata->first_file_filepos, SEEK_SET); - tmp = (struct areltdata *) _bfd_read_ar_hdr (abfd); - if (tmp != NULL) - { - if (tmp->arch_header[0] == '/' - && tmp->arch_header[1] == ' ') - { - ardata->first_file_filepos += - (tmp->parsed_size + sizeof(struct ar_hdr) + 1) & ~1; - } - bfd_release (abfd, tmp); - } - } - - return true; - -release_raw_armap: - bfd_release (abfd, (PTR) raw_armap); -release_symdefs: - bfd_release (abfd, (PTR) (ardata)->symdefs); - return false; -} - -/* This routine can handle either coff-style or bsd-style armaps. - Returns false on error, true otherwise */ - -boolean -bfd_slurp_armap (abfd) - bfd *abfd; -{ - char nextname[17]; - int i = bfd_read ((PTR) nextname, 1, 16, abfd); - - if (i == 0) - return true; - if (i != 16) - return false; - - if (bfd_seek (abfd, (file_ptr) - 16, SEEK_CUR) != 0) - return false; - - if (!strncmp (nextname, "__.SYMDEF ", 16) - || !strncmp (nextname, "__.SYMDEF/ ", 16)) /* old Linux archives */ - return do_slurp_bsd_armap (abfd); - else if (!strncmp (nextname, "/ ", 16)) - return do_slurp_coff_armap (abfd); - - bfd_has_map (abfd) = false; - return true; -} - -/* Returns false on error, true otherwise */ -/* flavor 2 of a bsd armap, similar to bfd_slurp_bsd_armap except the - header is in a slightly different order and the map name is '/'. - This flavour is used by hp300hpux. */ - -#define HPUX_SYMDEF_COUNT_SIZE 2 - -boolean -bfd_slurp_bsd_armap_f2 (abfd) - bfd *abfd; -{ - struct areltdata *mapdata; - char nextname[17]; - unsigned int counter; - bfd_byte *raw_armap, *rbase; - struct artdata *ardata = bfd_ardata (abfd); - char *stringbase; - unsigned int stringsize; - carsym *set; - int i = bfd_read ((PTR) nextname, 1, 16, abfd); - - if (i == 0) - return true; - if (i != 16) - return false; - - /* The archive has at least 16 bytes in it */ - if (bfd_seek (abfd, -16L, SEEK_CUR) != 0) - return false; - - if (!strncmp (nextname, "__.SYMDEF ", 16) - || !strncmp (nextname, "__.SYMDEF/ ", 16)) /* old Linux archives */ - return do_slurp_bsd_armap (abfd); - - if (strncmp (nextname, "/ ", 16)) - { - bfd_has_map (abfd) = false; - return true; - } - - mapdata = (struct areltdata *) _bfd_read_ar_hdr (abfd); - if (mapdata == NULL) - return false; - - raw_armap = (bfd_byte *) bfd_zalloc (abfd, mapdata->parsed_size); - if (raw_armap == NULL) - { - byebye: - bfd_release (abfd, (PTR) mapdata); - return false; - } - - if (bfd_read ((PTR) raw_armap, 1, mapdata->parsed_size, abfd) != - mapdata->parsed_size) - { - if (bfd_get_error () != bfd_error_system_call) - bfd_set_error (bfd_error_malformed_archive); - byebyebye: - bfd_release (abfd, (PTR) raw_armap); - goto byebye; - } - - ardata->symdef_count = bfd_h_get_16 (abfd, (PTR) raw_armap); - - if (ardata->symdef_count * BSD_SYMDEF_SIZE - > mapdata->parsed_size - HPUX_SYMDEF_COUNT_SIZE) - { - /* Probably we're using the wrong byte ordering. */ - bfd_set_error (bfd_error_wrong_format); - goto byebyebye; - } - - ardata->cache = 0; - - stringsize = bfd_h_get_32 (abfd, raw_armap + HPUX_SYMDEF_COUNT_SIZE); - /* skip sym count and string sz */ - stringbase = ((char *) raw_armap - + HPUX_SYMDEF_COUNT_SIZE - + BSD_STRING_COUNT_SIZE); - rbase = (bfd_byte *) stringbase + stringsize; - ardata->symdefs = (carsym *) bfd_alloc (abfd, - (ardata->symdef_count - * BSD_SYMDEF_SIZE)); - if (!ardata->symdefs) - return false; - - for (counter = 0, set = ardata->symdefs; - counter < ardata->symdef_count; - counter++, set++, rbase += BSD_SYMDEF_SIZE) - { - set->name = bfd_h_get_32 (abfd, rbase) + stringbase; - set->file_offset = bfd_h_get_32 (abfd, rbase + BSD_SYMDEF_OFFSET_SIZE); - } - - ardata->first_file_filepos = bfd_tell (abfd); - /* Pad to an even boundary if you have to */ - ardata->first_file_filepos += (ardata->first_file_filepos) % 2; - /* FIXME, we should provide some way to free raw_ardata when - we are done using the strings from it. For now, it seems - to be allocated on an obstack anyway... */ - bfd_has_map (abfd) = true; - return true; -} - -/** Extended name table. - - Normally archives support only 14-character filenames. - - Intel has extended the format: longer names are stored in a special - element (the first in the archive, or second if there is an armap); - the name in the ar_hdr is replaced by <space><index into filename - element>. Index is the P.R. of an int (decimal). Data General have - extended the format by using the prefix // for the special element */ - -/* Returns false on error, true otherwise */ -boolean -_bfd_slurp_extended_name_table (abfd) - bfd *abfd; -{ - char nextname[17]; - struct areltdata *namedata; - - /* FIXME: Formatting sucks here, and in case of failure of BFD_READ, - we probably don't want to return true. */ - bfd_seek (abfd, bfd_ardata (abfd)->first_file_filepos, SEEK_SET); - if (bfd_read ((PTR) nextname, 1, 16, abfd) == 16) - { - if (bfd_seek (abfd, (file_ptr) - 16, SEEK_CUR) != 0) - return false; - - if (strncmp (nextname, "ARFILENAMES/ ", 16) != 0 && - strncmp (nextname, "// ", 16) != 0) - { - bfd_ardata (abfd)->extended_names = NULL; - return true; - } - - namedata = (struct areltdata *) _bfd_read_ar_hdr (abfd); - if (namedata == NULL) - return false; - - bfd_ardata (abfd)->extended_names = - bfd_zalloc (abfd, namedata->parsed_size); - if (bfd_ardata (abfd)->extended_names == NULL) - { - byebye: - bfd_release (abfd, (PTR) namedata); - return false; - } - - if (bfd_read ((PTR) bfd_ardata (abfd)->extended_names, 1, - namedata->parsed_size, abfd) != namedata->parsed_size) - { - if (bfd_get_error () != bfd_error_system_call) - bfd_set_error (bfd_error_malformed_archive); - bfd_release (abfd, (PTR) (bfd_ardata (abfd)->extended_names)); - bfd_ardata (abfd)->extended_names = NULL; - goto byebye; - } - - /* Since the archive is supposed to be printable if it contains - text, the entries in the list are newline-padded, not null - padded. In SVR4-style archives, the names also have a - trailing '/'. DOS/NT created archive often have \ in them - We'll fix all problems here.. */ - { - char *temp = bfd_ardata (abfd)->extended_names; - char *limit = temp + namedata->parsed_size; - for (; temp < limit; ++temp) { - if (*temp == '\012') - temp[temp[-1] == '/' ? -1 : 0] = '\0'; - if (*temp == '\\') - *temp = '/'; - } - } - - /* Pad to an even boundary if you have to */ - bfd_ardata (abfd)->first_file_filepos = bfd_tell (abfd); - bfd_ardata (abfd)->first_file_filepos += - (bfd_ardata (abfd)->first_file_filepos) % 2; - - /* FIXME, we can't release namedata here because it was allocated - below extended_names on the obstack... */ - /* bfd_release (abfd, namedata); */ - } - return true; -} - -#ifdef VMS - -/* Return a copy of the stuff in the filename between any :]> and a - semicolon */ -static const char * -normalize (abfd, file) - bfd *abfd; - const char *file; -{ - CONST char *first; - CONST char *last; - char *copy; - - first = file + strlen (file) - 1; - last = first + 1; - - while (first != file) - { - if (*first == ';') - last = first; - if (*first == ':' || *first == ']' || *first == '>') - { - first++; - break; - } - first--; - } - - copy = (char *) bfd_alloc (abfd, last - first + 1); - if (copy == NULL) - return NULL; - - memcpy (copy, first, last - first); - copy[last - first] = 0; - - return copy; -} - -#else -static const char * -normalize (abfd, file) - bfd *abfd; - const char *file; -{ - const char *filename = strrchr (file, '/'); - - if (filename != (char *) NULL) - filename++; - else - filename = file; - return filename; -} -#endif - -/* Build a BFD style extended name table. */ - -boolean -_bfd_archive_bsd_construct_extended_name_table (abfd, tabloc, tablen, name) - bfd *abfd; - char **tabloc; - bfd_size_type *tablen; - const char **name; -{ - *name = "ARFILENAMES/"; - return _bfd_construct_extended_name_table (abfd, false, tabloc, tablen); -} - -/* Build an SVR4 style extended name table. */ - -boolean -_bfd_archive_coff_construct_extended_name_table (abfd, tabloc, tablen, name) - bfd *abfd; - char **tabloc; - bfd_size_type *tablen; - const char **name; -{ - *name = "//"; - return _bfd_construct_extended_name_table (abfd, true, tabloc, tablen); -} - -/* Follows archive_head and produces an extended name table if - necessary. Returns (in tabloc) a pointer to an extended name - table, and in tablen the length of the table. If it makes an entry - it clobbers the filename so that the element may be written without - further massage. Returns true if it ran successfully, false if - something went wrong. A successful return may still involve a - zero-length tablen! */ - -boolean -_bfd_construct_extended_name_table (abfd, trailing_slash, tabloc, tablen) - bfd *abfd; - boolean trailing_slash; - char **tabloc; - bfd_size_type *tablen; -{ - unsigned int maxname = abfd->xvec->ar_max_namelen; - unsigned int total_namelen = 0; - bfd *current; - char *strptr; - - *tablen = 0; - - /* Figure out how long the table should be */ - for (current = abfd->archive_head; current != NULL; current = current->next) - { - const char *normal; - unsigned int thislen; - - normal = normalize (current, current->filename); - if (normal == NULL) - return false; - - thislen = strlen (normal); - - if (thislen > maxname - && (bfd_get_file_flags (abfd) & BFD_TRADITIONAL_FORMAT) != 0) - thislen = maxname; - - if (thislen > maxname) - { - /* Add one to leave room for \n. */ - total_namelen += thislen + 1; - if (trailing_slash) - { - /* Leave room for trailing slash. */ - ++total_namelen; - } - } - else - { - struct ar_hdr *hdr = arch_hdr (current); - if (strncmp (normal, hdr->ar_name, thislen) != 0 - || (thislen < sizeof hdr->ar_name - && hdr->ar_name[thislen] != ar_padchar (current))) - { - /* Must have been using extended format even though it - didn't need to. Fix it to use normal format. */ - memcpy (hdr->ar_name, normal, thislen); - if (thislen < maxname - || (thislen == maxname && thislen < sizeof hdr->ar_name)) - hdr->ar_name[thislen] = ar_padchar (current); - } - } - } - - if (total_namelen == 0) - return true; - - *tabloc = bfd_zalloc (abfd, total_namelen); - if (*tabloc == NULL) - return false; - - *tablen = total_namelen; - strptr = *tabloc; - - for (current = abfd->archive_head; current != NULL; current = - current->next) - { - const char *normal; - unsigned int thislen; - - normal = normalize (current, current->filename); - if (normal == NULL) - return false; - - thislen = strlen (normal); - if (thislen > maxname) - { - /* Works for now; may need to be re-engineered if we - encounter an oddball archive format and want to - generalise this hack. */ - struct ar_hdr *hdr = arch_hdr (current); - strcpy (strptr, normal); - if (! trailing_slash) - strptr[thislen] = '\012'; - else - { - strptr[thislen] = '/'; - strptr[thislen + 1] = '\012'; - } - hdr->ar_name[0] = ar_padchar (current); - /* We know there will always be enough room (one of the few - cases where you may safely use sprintf). */ - sprintf ((hdr->ar_name) + 1, "%-d", (unsigned) (strptr - *tabloc)); - /* Kinda Kludgy. We should just use the returned value of - sprintf but not all implementations get this right */ - { - char *temp = hdr->ar_name + 2; - for (; temp < hdr->ar_name + maxname; temp++) - if (*temp == '\0') - *temp = ' '; - } - strptr += thislen + 1; - if (trailing_slash) - ++strptr; - } - } - - return true; -} - -/** A couple of functions for creating ar_hdrs */ - -/* Takes a filename, returns an arelt_data for it, or NULL if it can't - make one. The filename must refer to a filename in the filesystem. - The filename field of the ar_hdr will NOT be initialized */ - -static struct areltdata * -bfd_ar_hdr_from_filesystem (abfd, filename) - bfd *abfd; - const char *filename; -{ - struct stat status; - struct areltdata *ared; - struct ar_hdr *hdr; - char *temp, *temp1; - - if (stat (filename, &status) != 0) - { - bfd_set_error (bfd_error_system_call); - return NULL; - } - - ared = (struct areltdata *) bfd_zalloc (abfd, sizeof (struct ar_hdr) + - sizeof (struct areltdata)); - if (ared == NULL) - return NULL; - hdr = (struct ar_hdr *) (((char *) ared) + sizeof (struct areltdata)); - - /* ar headers are space padded, not null padded! */ - memset ((PTR) hdr, ' ', sizeof (struct ar_hdr)); - - strncpy (hdr->ar_fmag, ARFMAG, 2); - - /* Goddamned sprintf doesn't permit MAXIMUM field lengths */ - sprintf ((hdr->ar_date), "%-12ld", (long) status.st_mtime); - sprintf ((hdr->ar_uid), "%ld", (long) status.st_uid); - sprintf ((hdr->ar_gid), "%ld", (long) status.st_gid); - sprintf ((hdr->ar_mode), "%-8o", (unsigned int) status.st_mode); - sprintf ((hdr->ar_size), "%-10ld", (long) status.st_size); - /* Correct for a lossage in sprintf whereby it null-terminates. I cannot - understand how these C losers could design such a ramshackle bunch of - IO operations */ - temp = (char *) hdr; - temp1 = temp + sizeof (struct ar_hdr) - 2; - for (; temp < temp1; temp++) - { - if (*temp == '\0') - *temp = ' '; - } - strncpy (hdr->ar_fmag, ARFMAG, 2); - ared->parsed_size = status.st_size; - ared->arch_header = (char *) hdr; - - return ared; -} - -/* This is magic required by the "ar" program. Since it's - undocumented, it's undocumented. You may think that it would take - a strong stomach to write this, and it does, but it takes even a - stronger stomach to try to code around such a thing! */ - -struct ar_hdr * -bfd_special_undocumented_glue (abfd, filename) - bfd *abfd; - char *filename; -{ - struct areltdata *ar_elt = bfd_ar_hdr_from_filesystem (abfd, filename); - if (ar_elt == NULL) - return NULL; - return (struct ar_hdr *) ar_elt->arch_header; -} - - -/* Analogous to stat call */ -int -bfd_generic_stat_arch_elt (abfd, buf) - bfd *abfd; - struct stat *buf; -{ - struct ar_hdr *hdr; - char *aloser; - - if (abfd->arelt_data == NULL) - { - bfd_set_error (bfd_error_invalid_operation); - return -1; - } - - hdr = arch_hdr (abfd); - -#define foo(arelt, stelt, size) \ - buf->stelt = strtol (hdr->arelt, &aloser, size); \ - if (aloser == hdr->arelt) return -1; - - foo (ar_date, st_mtime, 10); - foo (ar_uid, st_uid, 10); - foo (ar_gid, st_gid, 10); - foo (ar_mode, st_mode, 8); - - buf->st_size = arch_eltdata (abfd)->parsed_size; - - return 0; -} - -void -bfd_dont_truncate_arname (abfd, pathname, arhdr) - bfd *abfd; - CONST char *pathname; - char *arhdr; -{ - /* FIXME: This interacts unpleasantly with ar's quick-append option. - Fortunately ic960 users will never use that option. Fixing this - is very hard; fortunately I know how to do it and will do so once - intel's release is out the door. */ - - struct ar_hdr *hdr = (struct ar_hdr *) arhdr; - size_t length; - const char *filename; - size_t maxlen = ar_maxnamelen (abfd); - - if ((bfd_get_file_flags (abfd) & BFD_TRADITIONAL_FORMAT) != 0) - { - bfd_bsd_truncate_arname (abfd, pathname, arhdr); - return; - } - - filename = normalize (abfd, pathname); - if (filename == NULL) - { - /* FIXME */ - abort (); - } - - length = strlen (filename); - - if (length <= maxlen) - memcpy (hdr->ar_name, filename, length); - - /* Add the padding character if there is room for it. */ - if (length < maxlen - || (length == maxlen && length < sizeof hdr->ar_name)) - (hdr->ar_name)[length] = ar_padchar (abfd); -} - -void -bfd_bsd_truncate_arname (abfd, pathname, arhdr) - bfd *abfd; - CONST char *pathname; - char *arhdr; -{ - struct ar_hdr *hdr = (struct ar_hdr *) arhdr; - int length; - CONST char *filename = strrchr (pathname, '/'); - int maxlen = ar_maxnamelen (abfd); - - if (filename == NULL) - filename = pathname; - else - ++filename; - - length = strlen (filename); - - if (length <= maxlen) - memcpy (hdr->ar_name, filename, length); - else - { - /* pathname: meet procrustes */ - memcpy (hdr->ar_name, filename, maxlen); - length = maxlen; - } - - if (length < maxlen) - (hdr->ar_name)[length] = ar_padchar (abfd); -} - -/* Store name into ar header. Truncates the name to fit. - 1> strip pathname to be just the basename. - 2> if it's short enuf to fit, stuff it in. - 3> If it doesn't end with .o, truncate it to fit - 4> truncate it before the .o, append .o, stuff THAT in. */ - -/* This is what gnu ar does. It's better but incompatible with the - bsd ar. */ - -void -bfd_gnu_truncate_arname (abfd, pathname, arhdr) - bfd *abfd; - CONST char *pathname; - char *arhdr; -{ - struct ar_hdr *hdr = (struct ar_hdr *) arhdr; - int length; - CONST char *filename = strrchr (pathname, '/'); - int maxlen = ar_maxnamelen (abfd); - - if (filename == NULL) - filename = pathname; - else - ++filename; - - length = strlen (filename); - - if (length <= maxlen) - memcpy (hdr->ar_name, filename, length); - else - { /* pathname: meet procrustes */ - memcpy (hdr->ar_name, filename, maxlen); - if ((filename[length - 2] == '.') && (filename[length - 1] == 'o')) - { - hdr->ar_name[maxlen - 2] = '.'; - hdr->ar_name[maxlen - 1] = 'o'; - } - length = maxlen; - } - - if (length < 16) - (hdr->ar_name)[length] = ar_padchar (abfd); -} - -/* The BFD is open for write and has its format set to bfd_archive */ - -boolean -_bfd_write_archive_contents (arch) - bfd *arch; -{ - bfd *current; - char *etable = NULL; - bfd_size_type elength = 0; - const char *ename = NULL; - boolean makemap = bfd_has_map (arch); - boolean hasobjects = false; /* if no .o's, don't bother to make a map */ - bfd_size_type wrote; - unsigned int i; - int tries; - - /* Verify the viability of all entries; if any of them live in the - filesystem (as opposed to living in an archive open for input) - then construct a fresh ar_hdr for them. */ - for (current = arch->archive_head; current; current = current->next) - { - if (bfd_write_p (current)) - { - bfd_set_error (bfd_error_invalid_operation); - return false; - } - if (!current->arelt_data) - { - current->arelt_data = - (PTR) bfd_ar_hdr_from_filesystem (arch, current->filename); - if (!current->arelt_data) - return false; - - /* Put in the file name */ - BFD_SEND (arch, _bfd_truncate_arname, (arch, - current->filename, - (char *) arch_hdr (current))); - } - - if (makemap && ! hasobjects) - { /* don't bother if we won't make a map! */ - if ((bfd_check_format (current, bfd_object)) -#if 0 /* FIXME -- these are not set correctly */ - && ((bfd_get_file_flags (current) & HAS_SYMS)) -#endif - ) - hasobjects = true; - } - } - - if (!BFD_SEND (arch, _bfd_construct_extended_name_table, - (arch, &etable, &elength, &ename))) - return false; - - if (bfd_seek (arch, (file_ptr) 0, SEEK_SET) != 0) - return false; -#ifdef GNU960 - wrote = bfd_write (BFD_GNU960_ARMAG (arch), 1, SARMAG, arch); -#else - wrote = bfd_write (ARMAG, 1, SARMAG, arch); -#endif - if (wrote != SARMAG) - return false; - - if (makemap && hasobjects) - { - if (_bfd_compute_and_write_armap (arch, elength) != true) - return false; - } - - if (elength != 0) - { - struct ar_hdr hdr; - - memset ((char *) (&hdr), 0, sizeof (struct ar_hdr)); - strcpy (hdr.ar_name, ename); - /* Round size up to even number in archive header. */ - sprintf (&(hdr.ar_size[0]), "%-10d", - (int) ((elength + 1) & ~1)); - strncpy (hdr.ar_fmag, ARFMAG, 2); - for (i = 0; i < sizeof (struct ar_hdr); i++) - if (((char *) (&hdr))[i] == '\0') - (((char *) (&hdr))[i]) = ' '; - if ((bfd_write ((char *) &hdr, 1, sizeof (struct ar_hdr), arch) - != sizeof (struct ar_hdr)) - || bfd_write (etable, 1, elength, arch) != elength) - return false; - if ((elength % 2) == 1) - { - if (bfd_write ("\012", 1, 1, arch) != 1) - return false; - } - } - - for (current = arch->archive_head; current; current = current->next) - { - char buffer[DEFAULT_BUFFERSIZE]; - unsigned int remaining = arelt_size (current); - struct ar_hdr *hdr = arch_hdr (current); - - /* write ar header */ - if (bfd_write ((char *) hdr, 1, sizeof (*hdr), arch) != sizeof (*hdr)) - return false; - if (bfd_seek (current, (file_ptr) 0, SEEK_SET) != 0) - return false; - while (remaining) - { - unsigned int amt = DEFAULT_BUFFERSIZE; - if (amt > remaining) - amt = remaining; - errno = 0; - if (bfd_read (buffer, amt, 1, current) != amt) - { - if (bfd_get_error () != bfd_error_system_call) - bfd_set_error (bfd_error_malformed_archive); - return false; - } - if (bfd_write (buffer, amt, 1, arch) != amt) - return false; - remaining -= amt; - } - if ((arelt_size (current) % 2) == 1) - { - if (bfd_write ("\012", 1, 1, arch) != 1) - return false; - } - } - - if (makemap && hasobjects) - { - /* Verify the timestamp in the archive file. If it would not be - accepted by the linker, rewrite it until it would be. If - anything odd happens, break out and just return. (The - Berkeley linker checks the timestamp and refuses to read the - table-of-contents if it is >60 seconds less than the file's - modified-time. That painful hack requires this painful hack. */ - tries = 1; - do - { - if (bfd_update_armap_timestamp (arch)) - break; - (*_bfd_error_handler) - ("Warning: writing archive was slow: rewriting timestamp\n"); - } - while (++tries < 6); - } - - return true; -} - -/* Note that the namidx for the first symbol is 0 */ - -boolean -_bfd_compute_and_write_armap (arch, elength) - bfd *arch; - unsigned int elength; -{ - char *first_name = NULL; - bfd *current; - file_ptr elt_no = 0; - struct orl *map = NULL; - int orl_max = 1024; /* fine initial default */ - int orl_count = 0; - int stridx = 0; /* string index */ - asymbol **syms = NULL; - long syms_max = 0; - boolean ret; - - /* Dunno if this is the best place for this info... */ - if (elength != 0) - elength += sizeof (struct ar_hdr); - elength += elength % 2; - - map = (struct orl *) bfd_malloc (orl_max * sizeof (struct orl)); - if (map == NULL) - goto error_return; - - /* We put the symbol names on the arch obstack, and then discard - them when done. */ - first_name = bfd_alloc (arch, 1); - if (first_name == NULL) - goto error_return; - - /* Drop all the files called __.SYMDEF, we're going to make our - own */ - while (arch->archive_head && - strcmp (arch->archive_head->filename, "__.SYMDEF") == 0) - arch->archive_head = arch->archive_head->next; - - /* Map over each element */ - for (current = arch->archive_head; - current != (bfd *) NULL; - current = current->next, elt_no++) - { - if ((bfd_check_format (current, bfd_object) == true) - && ((bfd_get_file_flags (current) & HAS_SYMS))) - { - long storage; - long symcount; - long src_count; - - storage = bfd_get_symtab_upper_bound (current); - if (storage < 0) - goto error_return; - - if (storage != 0) - { - if (storage > syms_max) - { - if (syms_max > 0) - free (syms); - syms_max = storage; - syms = (asymbol **) bfd_malloc ((size_t) syms_max); - if (syms == NULL) - goto error_return; - } - symcount = bfd_canonicalize_symtab (current, syms); - if (symcount < 0) - goto error_return; - - /* Now map over all the symbols, picking out the ones we want */ - for (src_count = 0; src_count < symcount; src_count++) - { - flagword flags = (syms[src_count])->flags; - asection *sec = syms[src_count]->section; - - if ((flags & BSF_GLOBAL || - flags & BSF_WEAK || - flags & BSF_INDIRECT || - bfd_is_com_section (sec)) - && ! bfd_is_und_section (sec)) - { - size_t namelen; - struct orl *new_map; - - /* This symbol will go into the archive header */ - if (orl_count == orl_max) - { - orl_max *= 2; - new_map = - ((struct orl *) - bfd_realloc (map, orl_max * sizeof (struct orl))); - if (new_map == (struct orl *) NULL) - goto error_return; - - map = new_map; - } - - namelen = strlen (syms[src_count]->name); - map[orl_count].name = ((char **) - bfd_alloc (arch, - sizeof (char *))); - if (map[orl_count].name == NULL) - goto error_return; - *(map[orl_count].name) = bfd_alloc (arch, namelen + 1); - if (*(map[orl_count].name) == NULL) - goto error_return; - strcpy (*(map[orl_count].name), syms[src_count]->name); - (map[orl_count]).pos = (file_ptr) current; - (map[orl_count]).namidx = stridx; - - stridx += namelen + 1; - ++orl_count; - } - } - } - - /* Now ask the BFD to free up any cached information, so we - don't fill all of memory with symbol tables. */ - if (! bfd_free_cached_info (current)) - goto error_return; - } - } - - /* OK, now we have collected all the data, let's write them out */ - ret = BFD_SEND (arch, write_armap, - (arch, elength, map, orl_count, stridx)); - - if (syms_max > 0) - free (syms); - if (map != NULL) - free (map); - if (first_name != NULL) - bfd_release (arch, first_name); - - return ret; - - error_return: - if (syms_max > 0) - free (syms); - if (map != NULL) - free (map); - if (first_name != NULL) - bfd_release (arch, first_name); - - return false; -} - -boolean -bsd_write_armap (arch, elength, map, orl_count, stridx) - bfd *arch; - unsigned int elength; - struct orl *map; - unsigned int orl_count; - int stridx; -{ - int padit = stridx & 1; - unsigned int ranlibsize = orl_count * BSD_SYMDEF_SIZE; - unsigned int stringsize = stridx + padit; - /* Include 8 bytes to store ranlibsize and stringsize in output. */ - unsigned int mapsize = ranlibsize + stringsize + 8; - file_ptr firstreal; - bfd *current = arch->archive_head; - bfd *last_elt = current; /* last element arch seen */ - bfd_byte temp[4]; - unsigned int count; - struct ar_hdr hdr; - struct stat statbuf; - unsigned int i; - - firstreal = mapsize + elength + sizeof (struct ar_hdr) + SARMAG; - - stat (arch->filename, &statbuf); - memset ((char *) (&hdr), 0, sizeof (struct ar_hdr)); - sprintf (hdr.ar_name, RANLIBMAG); - /* Remember the timestamp, to keep it holy. But fudge it a little. */ - bfd_ardata (arch)->armap_timestamp = statbuf.st_mtime + ARMAP_TIME_OFFSET; - bfd_ardata (arch)->armap_datepos = (SARMAG - + offsetof (struct ar_hdr, ar_date[0])); - sprintf (hdr.ar_date, "%ld", bfd_ardata (arch)->armap_timestamp); - sprintf (hdr.ar_uid, "%ld", (long) getuid ()); - sprintf (hdr.ar_gid, "%ld", (long) getgid ()); - sprintf (hdr.ar_size, "%-10d", (int) mapsize); - strncpy (hdr.ar_fmag, ARFMAG, 2); - for (i = 0; i < sizeof (struct ar_hdr); i++) - if (((char *) (&hdr))[i] == '\0') - (((char *) (&hdr))[i]) = ' '; - if (bfd_write ((char *) &hdr, 1, sizeof (struct ar_hdr), arch) - != sizeof (struct ar_hdr)) - return false; - bfd_h_put_32 (arch, (bfd_vma) ranlibsize, temp); - if (bfd_write (temp, 1, sizeof (temp), arch) != sizeof (temp)) - return false; - - for (count = 0; count < orl_count; count++) - { - bfd_byte buf[BSD_SYMDEF_SIZE]; - - if (((bfd *) (map[count]).pos) != last_elt) - { - do - { - firstreal += arelt_size (current) + sizeof (struct ar_hdr); - firstreal += firstreal % 2; - current = current->next; - } - while (current != (bfd *) (map[count]).pos); - } /* if new archive element */ - - last_elt = current; - bfd_h_put_32 (arch, map[count].namidx, buf); - bfd_h_put_32 (arch, firstreal, buf + BSD_SYMDEF_OFFSET_SIZE); - if (bfd_write (buf, BSD_SYMDEF_SIZE, 1, arch) != BSD_SYMDEF_SIZE) - return false; - } - - /* now write the strings themselves */ - bfd_h_put_32 (arch, stringsize, temp); - if (bfd_write (temp, 1, sizeof (temp), arch) != sizeof (temp)) - return false; - for (count = 0; count < orl_count; count++) - { - size_t len = strlen (*map[count].name) + 1; - - if (bfd_write (*map[count].name, 1, len, arch) != len) - return false; - } - - /* The spec sez this should be a newline. But in order to be - bug-compatible for sun's ar we use a null. */ - if (padit) - { - if (bfd_write ("", 1, 1, arch) != 1) - return false; - } - - return true; -} - -/* At the end of archive file handling, update the timestamp in the - file, so the linker will accept it. - - Return true if the timestamp was OK, or an unusual problem happened. - Return false if we updated the timestamp. */ - -boolean -_bfd_archive_bsd_update_armap_timestamp (arch) - bfd *arch; -{ - struct stat archstat; - struct ar_hdr hdr; - unsigned int i; - - /* Flush writes, get last-write timestamp from file, and compare it - to the timestamp IN the file. */ - bfd_flush (arch); - if (bfd_stat (arch, &archstat) == -1) - { - perror ("Reading archive file mod timestamp"); - return true; /* Can't read mod time for some reason */ - } - if (archstat.st_mtime <= bfd_ardata (arch)->armap_timestamp) - return true; /* OK by the linker's rules */ - - /* Update the timestamp. */ - bfd_ardata (arch)->armap_timestamp = archstat.st_mtime + ARMAP_TIME_OFFSET; - - /* Prepare an ASCII version suitable for writing. */ - memset (hdr.ar_date, 0, sizeof (hdr.ar_date)); - sprintf (hdr.ar_date, "%ld", bfd_ardata (arch)->armap_timestamp); - for (i = 0; i < sizeof (hdr.ar_date); i++) - if (hdr.ar_date[i] == '\0') - (hdr.ar_date)[i] = ' '; - - /* Write it into the file. */ - bfd_ardata (arch)->armap_datepos = (SARMAG - + offsetof (struct ar_hdr, ar_date[0])); - if (bfd_seek (arch, bfd_ardata (arch)->armap_datepos, SEEK_SET) != 0 - || (bfd_write (hdr.ar_date, sizeof (hdr.ar_date), 1, arch) - != sizeof (hdr.ar_date))) - { - /* FIXME: bfd can't call perror. */ - perror ("Writing updated armap timestamp"); - return true; /* Some error while writing */ - } - - return false; /* We updated the timestamp successfully. */ -} - -/* A coff armap looks like : - lARMAG - struct ar_hdr with name = '/' - number of symbols - offset of file for symbol 0 - offset of file for symbol 1 - - offset of file for symbol n-1 - symbol name 0 - symbol name 1 - - symbol name n-1 -*/ - -boolean -coff_write_armap (arch, elength, map, symbol_count, stridx) - bfd *arch; - unsigned int elength; - struct orl *map; - unsigned int symbol_count; - int stridx; -{ - /* The size of the ranlib is the number of exported symbols in the - archive * the number of bytes in a int, + an int for the count */ - unsigned int ranlibsize = (symbol_count * 4) + 4; - unsigned int stringsize = stridx; - unsigned int mapsize = stringsize + ranlibsize; - file_ptr archive_member_file_ptr; - bfd *current = arch->archive_head; - unsigned int count; - struct ar_hdr hdr; - unsigned int i; - int padit = mapsize & 1; - - if (padit) - mapsize++; - - /* work out where the first object file will go in the archive */ - archive_member_file_ptr = (mapsize - + elength - + sizeof (struct ar_hdr) - + SARMAG); - - memset ((char *) (&hdr), 0, sizeof (struct ar_hdr)); - hdr.ar_name[0] = '/'; - sprintf (hdr.ar_size, "%-10d", (int) mapsize); - sprintf (hdr.ar_date, "%ld", (long) time (NULL)); - /* This, at least, is what Intel coff sets the values to.: */ - sprintf ((hdr.ar_uid), "%d", 0); - sprintf ((hdr.ar_gid), "%d", 0); - sprintf ((hdr.ar_mode), "%-7o", (unsigned) 0); - strncpy (hdr.ar_fmag, ARFMAG, 2); - - for (i = 0; i < sizeof (struct ar_hdr); i++) - if (((char *) (&hdr))[i] == '\0') - (((char *) (&hdr))[i]) = ' '; - - /* Write the ar header for this item and the number of symbols */ - - if (bfd_write ((PTR) &hdr, 1, sizeof (struct ar_hdr), arch) - != sizeof (struct ar_hdr)) - return false; - - bfd_write_bigendian_4byte_int (arch, symbol_count); - - /* Two passes, first write the file offsets for each symbol - - remembering that each offset is on a two byte boundary. */ - - /* Write out the file offset for the file associated with each - symbol, and remember to keep the offsets padded out. */ - - current = arch->archive_head; - count = 0; - while (current != (bfd *) NULL && count < symbol_count) - { - /* For each symbol which is used defined in this object, write out - the object file's address in the archive */ - - while (((bfd *) (map[count]).pos) == current) - { - bfd_write_bigendian_4byte_int (arch, archive_member_file_ptr); - count++; - } - /* Add size of this archive entry */ - archive_member_file_ptr += (arelt_size (current) - + sizeof (struct ar_hdr)); - /* remember aboout the even alignment */ - archive_member_file_ptr += archive_member_file_ptr % 2; - current = current->next; - } - - /* now write the strings themselves */ - for (count = 0; count < symbol_count; count++) - { - size_t len = strlen (*map[count].name) + 1; - - if (bfd_write (*map[count].name, 1, len, arch) != len) - return false; - } - - /* The spec sez this should be a newline. But in order to be - bug-compatible for arc960 we use a null. */ - if (padit) - { - if (bfd_write ("", 1, 1, arch) != 1) - return false; - } - - return true; -} diff --git a/contrib/gdb/bfd/archures.c b/contrib/gdb/bfd/archures.c deleted file mode 100644 index 1db8bc24b86fa..0000000000000 --- a/contrib/gdb/bfd/archures.c +++ /dev/null @@ -1,720 +0,0 @@ -/* BFD library support routines for architectures. - Copyright (C) 1990, 91, 92, 93, 94, 95, 1996 Free Software Foundation, Inc. - Hacked by John Gilmore and Steve Chamberlain of Cygnus Support. - -This file is part of BFD, the Binary File Descriptor library. - -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 2 of the License, 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ - -#include "bfd.h" -#include "sysdep.h" -#include "libbfd.h" -#include <ctype.h> - -/* - -SECTION - Architectures - - BFD keeps one atom in a BFD describing the - architecture of the data attached to the BFD: a pointer to a - <<bfd_arch_info_type>>. - - Pointers to structures can be requested independently of a BFD - so that an architecture's information can be interrogated - without access to an open BFD. - - The architecture information is provided by each architecture package. - The set of default architectures is selected by the macro - <<SELECT_ARCHITECTURES>>. This is normally set up in the - @file{config/@var{target}.mt} file of your choice. If the name is not - defined, then all the architectures supported are included. - - When BFD starts up, all the architectures are called with an - initialize method. It is up to the architecture back end to - insert as many items into the list of architectures as it wants to; - generally this would be one for each machine and one for the - default case (an item with a machine field of 0). - - BFD's idea of an architecture is implemented in @file{archures.c}. -*/ - -/* - -SUBSECTION - bfd_architecture - -DESCRIPTION - This enum gives the object file's CPU architecture, in a - global sense---i.e., what processor family does it belong to? - Another field indicates which processor within - the family is in use. The machine gives a number which - distinguishes different versions of the architecture, - containing, for example, 2 and 3 for Intel i960 KA and i960 KB, - and 68020 and 68030 for Motorola 68020 and 68030. - -.enum bfd_architecture -.{ -. bfd_arch_unknown, {* File arch not known *} -. bfd_arch_obscure, {* Arch known, not one of these *} -. bfd_arch_m68k, {* Motorola 68xxx *} -. bfd_arch_vax, {* DEC Vax *} -. bfd_arch_i960, {* Intel 960 *} -. {* The order of the following is important. -. lower number indicates a machine type that -. only accepts a subset of the instructions -. available to machines with higher numbers. -. The exception is the "ca", which is -. incompatible with all other machines except -. "core". *} -. -.#define bfd_mach_i960_core 1 -.#define bfd_mach_i960_ka_sa 2 -.#define bfd_mach_i960_kb_sb 3 -.#define bfd_mach_i960_mc 4 -.#define bfd_mach_i960_xa 5 -.#define bfd_mach_i960_ca 6 -.#define bfd_mach_i960_jx 7 -.#define bfd_mach_i960_hx 8 -. -. bfd_arch_a29k, {* AMD 29000 *} -. bfd_arch_sparc, {* SPARC *} -.#define bfd_mach_sparc 1 -.{* The difference between v8plus and v9 is that v9 is a true 64 bit env. *} -.#define bfd_mach_sparc_v8plus 2 -.#define bfd_mach_sparc_v8plusa 3 {* with ultrasparc add'ns *} -.#define bfd_mach_sparc_v9 4 -.#define bfd_mach_sparc_v9a 5 {* with ultrasparc add'ns *} -.{* Nonzero if MACH has the v9 instruction set. *} -.#define bfd_mach_sparc_v9_p(mach) ((mach) != bfd_mach_sparc) -. bfd_arch_mips, {* MIPS Rxxxx *} -. bfd_arch_i386, {* Intel 386 *} -. bfd_arch_we32k, {* AT&T WE32xxx *} -. bfd_arch_tahoe, {* CCI/Harris Tahoe *} -. bfd_arch_i860, {* Intel 860 *} -. bfd_arch_romp, {* IBM ROMP PC/RT *} -. bfd_arch_alliant, {* Alliant *} -. bfd_arch_convex, {* Convex *} -. bfd_arch_m88k, {* Motorola 88xxx *} -. bfd_arch_pyramid, {* Pyramid Technology *} -. bfd_arch_h8300, {* Hitachi H8/300 *} -.#define bfd_mach_h8300 1 -.#define bfd_mach_h8300h 2 -. bfd_arch_powerpc, {* PowerPC *} -. bfd_arch_rs6000, {* IBM RS/6000 *} -. bfd_arch_hppa, {* HP PA RISC *} -. bfd_arch_z8k, {* Zilog Z8000 *} -.#define bfd_mach_z8001 1 -.#define bfd_mach_z8002 2 -. bfd_arch_h8500, {* Hitachi H8/500 *} -. bfd_arch_sh, {* Hitachi SH *} -. bfd_arch_alpha, {* Dec Alpha *} -. bfd_arch_arm, {* Advanced Risc Machines ARM *} -. bfd_arch_ns32k, {* National Semiconductors ns32000 *} -. bfd_arch_w65, {* WDC 65816 *} -. bfd_arch_last -. }; - - -*/ - -/* - -SUBSECTION - bfd_arch_info - -DESCRIPTION - This structure contains information on architectures for use - within BFD. - -. -.typedef struct bfd_arch_info -.{ -. int bits_per_word; -. int bits_per_address; -. int bits_per_byte; -. enum bfd_architecture arch; -. unsigned long mach; -. const char *arch_name; -. const char *printable_name; -. unsigned int section_align_power; -. {* true if this is the default machine for the architecture *} -. boolean the_default; -. const struct bfd_arch_info * (*compatible) -. PARAMS ((const struct bfd_arch_info *a, -. const struct bfd_arch_info *b)); -. -. boolean (*scan) PARAMS ((const struct bfd_arch_info *, const char *)); -. -. const struct bfd_arch_info *next; -.} bfd_arch_info_type; -*/ - -extern const bfd_arch_info_type bfd_a29k_arch; -extern const bfd_arch_info_type bfd_alpha_arch; -extern const bfd_arch_info_type bfd_arm_arch; -extern const bfd_arch_info_type bfd_h8300_arch; -extern const bfd_arch_info_type bfd_h8500_arch; -extern const bfd_arch_info_type bfd_hppa_arch; -extern const bfd_arch_info_type bfd_i386_arch; -extern const bfd_arch_info_type bfd_i860_arch; -extern const bfd_arch_info_type bfd_i960_arch; -extern const bfd_arch_info_type bfd_m68k_arch; -extern const bfd_arch_info_type bfd_m88k_arch; -extern const bfd_arch_info_type bfd_mips_arch; -extern const bfd_arch_info_type bfd_powerpc_arch; -extern const bfd_arch_info_type bfd_rs6000_arch; -extern const bfd_arch_info_type bfd_sh_arch; -extern const bfd_arch_info_type bfd_sparc_arch; -extern const bfd_arch_info_type bfd_vax_arch; -extern const bfd_arch_info_type bfd_we32k_arch; -extern const bfd_arch_info_type bfd_z8k_arch; -extern const bfd_arch_info_type bfd_ns32k_arch; -extern const bfd_arch_info_type bfd_w65_arch; - -static const bfd_arch_info_type * const bfd_archures_list[] = -{ -#ifdef SELECT_ARCHITECTURES - SELECT_ARCHITECTURES, -#else - &bfd_a29k_arch, - &bfd_alpha_arch, - &bfd_arm_arch, - &bfd_h8300_arch, - &bfd_h8500_arch, - &bfd_hppa_arch, - &bfd_i386_arch, - &bfd_i860_arch, - &bfd_i960_arch, - &bfd_m68k_arch, - &bfd_m88k_arch, - &bfd_mips_arch, - &bfd_powerpc_arch, - &bfd_rs6000_arch, - &bfd_sh_arch, - &bfd_sparc_arch, - &bfd_vax_arch, - &bfd_we32k_arch, - &bfd_z8k_arch, - &bfd_ns32k_arch, - &bfd_w65_arch, -#endif - 0 -}; - -/* -FUNCTION - bfd_printable_name - -SYNOPSIS - const char *bfd_printable_name(bfd *abfd); - -DESCRIPTION - Return a printable string representing the architecture and machine - from the pointer to the architecture info structure. - -*/ - -const char * -bfd_printable_name (abfd) - bfd *abfd; -{ - return abfd->arch_info->printable_name; -} - - - -/* -FUNCTION - bfd_scan_arch - -SYNOPSIS - const bfd_arch_info_type *bfd_scan_arch(const char *string); - -DESCRIPTION - Figure out if BFD supports any cpu which could be described with - the name @var{string}. Return a pointer to an <<arch_info>> - structure if a machine is found, otherwise NULL. - -*/ - -const bfd_arch_info_type * -bfd_scan_arch (string) - const char *string; -{ - const bfd_arch_info_type * const *app, *ap; - - /* Look through all the installed architectures */ - for (app = bfd_archures_list; *app != NULL; app++) - { - for (ap = *app; ap != NULL; ap = ap->next) - { - if (ap->scan (ap, string)) - return ap; - } - } - - return NULL; -} - - - -/* -FUNCTION - bfd_arch_get_compatible - -SYNOPSIS - const bfd_arch_info_type *bfd_arch_get_compatible( - const bfd *abfd, - const bfd *bbfd); - -DESCRIPTION - Determine whether two BFDs' - architectures and machine types are compatible. Calculates - the lowest common denominator between the two architectures - and machine types implied by the BFDs and returns a pointer to - an <<arch_info>> structure describing the compatible machine. -*/ - -const bfd_arch_info_type * -bfd_arch_get_compatible (abfd, bbfd) - const bfd *abfd; - const bfd *bbfd; -{ - /* If either architecture is unknown, then all we can do is assume - the user knows what he's doing. */ - if (abfd->arch_info->arch == bfd_arch_unknown) - return bbfd->arch_info; - if (bbfd->arch_info->arch == bfd_arch_unknown) - return abfd->arch_info; - - /* Otherwise architecture-specific code has to decide. */ - return abfd->arch_info->compatible (abfd->arch_info, bbfd->arch_info); -} - - -/* -INTERNAL_DEFINITION - bfd_default_arch_struct - -DESCRIPTION - The <<bfd_default_arch_struct>> is an item of - <<bfd_arch_info_type>> which has been initialized to a fairly - generic state. A BFD starts life by pointing to this - structure, until the correct back end has determined the real - architecture of the file. - -.extern const bfd_arch_info_type bfd_default_arch_struct; - -*/ - -const bfd_arch_info_type bfd_default_arch_struct = -{ - 32,32,8,bfd_arch_unknown,0,"unknown","unknown",2,true, - bfd_default_compatible, - bfd_default_scan, - 0, -}; - -/* -FUNCTION - bfd_set_arch_info - -SYNOPSIS - void bfd_set_arch_info(bfd *abfd, const bfd_arch_info_type *arg); - -DESCRIPTION - Set the architecture info of @var{abfd} to @var{arg}. -*/ - -void -bfd_set_arch_info (abfd, arg) - bfd *abfd; - const bfd_arch_info_type *arg; -{ - abfd->arch_info = arg; -} - -/* -INTERNAL_FUNCTION - bfd_default_set_arch_mach - -SYNOPSIS - boolean bfd_default_set_arch_mach(bfd *abfd, - enum bfd_architecture arch, - unsigned long mach); - -DESCRIPTION - Set the architecture and machine type in BFD @var{abfd} - to @var{arch} and @var{mach}. Find the correct - pointer to a structure and insert it into the <<arch_info>> - pointer. -*/ - -boolean -bfd_default_set_arch_mach (abfd, arch, mach) - bfd *abfd; - enum bfd_architecture arch; - unsigned long mach; -{ - const bfd_arch_info_type * const *app, *ap; - - for (app = bfd_archures_list; *app != NULL; app++) - { - for (ap = *app; ap != NULL; ap = ap->next) - { - if (ap->arch == arch - && (ap->mach == mach - || (mach == 0 && ap->the_default))) - { - abfd->arch_info = ap; - return true; - } - } - } - - abfd->arch_info = &bfd_default_arch_struct; - bfd_set_error (bfd_error_bad_value); - return false; -} - - -/* -FUNCTION - bfd_get_arch - -SYNOPSIS - enum bfd_architecture bfd_get_arch(bfd *abfd); - -DESCRIPTION - Return the enumerated type which describes the BFD @var{abfd}'s - architecture. - -*/ - -enum bfd_architecture -bfd_get_arch (abfd) - bfd *abfd; -{ - return abfd->arch_info->arch; -} - -/* -FUNCTION - bfd_get_mach - -SYNOPSIS - unsigned long bfd_get_mach(bfd *abfd); - -DESCRIPTION - Return the long type which describes the BFD @var{abfd}'s - machine. -*/ - -unsigned long -bfd_get_mach (abfd) - bfd *abfd; -{ - return abfd->arch_info->mach; -} - -/* -FUNCTION - bfd_arch_bits_per_byte - -SYNOPSIS - unsigned int bfd_arch_bits_per_byte(bfd *abfd); - -DESCRIPTION - Return the number of bits in one of the BFD @var{abfd}'s - architecture's bytes. - -*/ - -unsigned int -bfd_arch_bits_per_byte (abfd) - bfd *abfd; -{ - return abfd->arch_info->bits_per_byte; -} - -/* -FUNCTION - bfd_arch_bits_per_address - -SYNOPSIS - unsigned int bfd_arch_bits_per_address(bfd *abfd); - -DESCRIPTION - Return the number of bits in one of the BFD @var{abfd}'s - architecture's addresses. -*/ - -unsigned int -bfd_arch_bits_per_address (abfd) - bfd *abfd; -{ - return abfd->arch_info->bits_per_address; -} - - -/* -INTERNAL_FUNCTION - bfd_default_compatible - -SYNOPSIS - const bfd_arch_info_type *bfd_default_compatible - (const bfd_arch_info_type *a, - const bfd_arch_info_type *b); - -DESCRIPTION - The default function for testing for compatibility. -*/ - -const bfd_arch_info_type * -bfd_default_compatible (a,b) - const bfd_arch_info_type *a; - const bfd_arch_info_type *b; -{ - if (a->arch != b->arch) - return NULL; - - if (a->mach > b->mach) - return a; - - if (b->mach > a->mach) - return b; - - return a; -} - - -/* -INTERNAL_FUNCTION - bfd_default_scan - -SYNOPSIS - boolean bfd_default_scan(const struct bfd_arch_info *info, const char *string); - -DESCRIPTION - The default function for working out whether this is an - architecture hit and a machine hit. -*/ - -boolean -bfd_default_scan (info, string) - const struct bfd_arch_info *info; - const char *string; -{ - const char *ptr_src; - const char *ptr_tst; - unsigned long number; - enum bfd_architecture arch; - - /* First test for an exact match */ - if (strcmp (string, info->printable_name) == 0) - return true; - - /* See how much of the supplied string matches with the - architecture, eg the string m68k:68020 would match the 68k entry - up to the :, then we get left with the machine number */ - - for (ptr_src = string, ptr_tst = info->arch_name; - *ptr_src && *ptr_tst; - ptr_src++, ptr_tst++) - { - if (*ptr_src != *ptr_tst) break; - } - - /* Chewed up as much of the architecture as will match, skip any - colons */ - if (*ptr_src == ':') - ptr_src++; - - if (*ptr_src == 0) - { - /* nothing more, then only keep this one if it is the default - machine for this architecture */ - return info->the_default; - } - - number = 0; - while (isdigit(*ptr_src)) - { - number = number * 10 + *ptr_src - '0'; - ptr_src++; - } - - switch (number) - { - case 65: - arch = bfd_arch_w65; - break; - - case 300: - arch = bfd_arch_h8300; - break; - - case 500: - arch = bfd_arch_h8500; - break; - - case 68010: - case 68020: - case 68030: - case 68040: - case 68332: - case 68050: - case 68000: - arch = bfd_arch_m68k; - break; - - case 386: - case 80386: - case 486: - case 80486: - arch = bfd_arch_i386; - break; - - case 29000: - arch = bfd_arch_a29k; - break; - - case 8000: - arch = bfd_arch_z8k; - break; - - case 32000: - arch = bfd_arch_we32k; - break; - - case 860: - case 80860: - arch = bfd_arch_i860; - break; - case 960: - case 80960: - arch = bfd_arch_i960; - break; - - case 2000: - case 3000: - case 4000: - case 4400: - arch = bfd_arch_mips; - break; - - case 6000: - arch = bfd_arch_rs6000; - break; - - default: - return false; - } - - if (arch != info->arch) - return false; - - if (number != info->mach) - return false; - - return true; -} - - -/* -FUNCTION - bfd_get_arch_info - -SYNOPSIS - const bfd_arch_info_type * bfd_get_arch_info(bfd *abfd); - -DESCRIPTION - Return the architecture info struct in @var{abfd}. -*/ - -const bfd_arch_info_type * -bfd_get_arch_info (abfd) - bfd *abfd; -{ - return abfd->arch_info; -} - - -/* -FUNCTION - bfd_lookup_arch - -SYNOPSIS - const bfd_arch_info_type *bfd_lookup_arch - (enum bfd_architecture - arch, - unsigned long machine); - -DESCRIPTION - Look for the architecure info structure which matches the - arguments @var{arch} and @var{machine}. A machine of 0 matches the - machine/architecture structure which marks itself as the - default. -*/ - -const bfd_arch_info_type * -bfd_lookup_arch (arch, machine) - enum bfd_architecture arch; - unsigned long machine; -{ - const bfd_arch_info_type * const *app, *ap; - - for (app = bfd_archures_list; *app != NULL; app++) - { - for (ap = *app; ap != NULL; ap = ap->next) - { - if (ap->arch == arch - && (ap->mach == machine - || (machine == 0 && ap->the_default))) - return ap; - } - } - - return NULL; -} - - -/* -FUNCTION - bfd_printable_arch_mach - -SYNOPSIS - const char *bfd_printable_arch_mach - (enum bfd_architecture arch, unsigned long machine); - -DESCRIPTION - Return a printable string representing the architecture and - machine type. - - This routine is depreciated. -*/ - -const char * -bfd_printable_arch_mach (arch, machine) - enum bfd_architecture arch; - unsigned long machine; -{ - const bfd_arch_info_type *ap = bfd_lookup_arch (arch, machine); - - if (ap) - return ap->printable_name; - return "UNKNOWN!"; -} diff --git a/contrib/gdb/bfd/bfd-in.h b/contrib/gdb/bfd/bfd-in.h deleted file mode 100644 index d2912396551a0..0000000000000 --- a/contrib/gdb/bfd/bfd-in.h +++ /dev/null @@ -1,668 +0,0 @@ -/* Main header file for the bfd library -- portable access to object files. - Copyright 1990, 91, 92, 93, 94, 95, 1996 Free Software Foundation, Inc. - Contributed by Cygnus Support. - -** NOTE: bfd.h and bfd-in2.h are GENERATED files. Don't change them; -** instead, change bfd-in.h or the other BFD source files processed to -** generate these files. - -This file is part of BFD, the Binary File Descriptor library. - -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 2 of the License, 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ - -/* bfd.h -- The only header file required by users of the bfd library - -The bfd.h file is generated from bfd-in.h and various .c files; if you -change it, your changes will probably be lost. - -All the prototypes and definitions following the comment "THE FOLLOWING -IS EXTRACTED FROM THE SOURCE" are extracted from the source files for -BFD. If you change it, someone oneday will extract it from the source -again, and your changes will be lost. To save yourself from this bind, -change the definitions in the source in the bfd directory. Type "make -docs" and then "make headers" in that directory, and magically this file -will change to reflect your changes. - -If you don't have the tools to perform the extraction, then you are -safe from someone on your system trampling over your header files. -You should still maintain the equivalence between the source and this -file though; every change you make to the .c file should be reflected -here. */ - -#ifndef __BFD_H_SEEN__ -#define __BFD_H_SEEN__ - -#ifdef __cplusplus -extern "C" { -#endif - -#include "ansidecl.h" -#include "obstack.h" - -/* These two lines get substitutions done by commands in Makefile.in. */ -#define BFD_VERSION "@VERSION@" -#define BFD_ARCH_SIZE @WORDSIZE@ -#define BFD_HOST_64BIT_LONG @BFD_HOST_64BIT_LONG@ - -#if BFD_ARCH_SIZE >= 64 -#define BFD64 -#endif - -#ifndef INLINE -#if __GNUC__ >= 2 -#define INLINE __inline__ -#else -#define INLINE -#endif -#endif - -/* forward declaration */ -typedef struct _bfd bfd; - -/* To squelch erroneous compiler warnings ("illegal pointer - combination") from the SVR3 compiler, we would like to typedef - boolean to int (it doesn't like functions which return boolean. - Making sure they are never implicitly declared to return int - doesn't seem to help). But this file is not configured based on - the host. */ -/* General rules: functions which are boolean return true on success - and false on failure (unless they're a predicate). -- bfd.doc */ -/* I'm sure this is going to break something and someone is going to - force me to change it. */ -/* typedef enum boolean {false, true} boolean; */ -/* Yup, SVR4 has a "typedef enum boolean" in <sys/types.h> -fnf */ -/* It gets worse if the host also defines a true/false enum... -sts */ -/* And even worse if your compiler has built-in boolean types... -law */ -#if defined (__GNUG__) && (__GNUC_MINOR__ > 5) -#define TRUE_FALSE_ALREADY_DEFINED -#endif -#ifdef MPW -/* Pre-emptive strike - get the file with the enum. */ -#include <Types.h> -#define TRUE_FALSE_ALREADY_DEFINED -#endif /* MPW */ -#ifndef TRUE_FALSE_ALREADY_DEFINED -typedef enum bfd_boolean {false, true} boolean; -#define BFD_TRUE_FALSE -#else -/* Use enum names that will appear nowhere else. */ -typedef enum bfd_boolean {bfd_fffalse, bfd_tttrue} boolean; -#endif - -/* A pointer to a position in a file. */ -/* FIXME: This should be using off_t from <sys/types.h>. - For now, try to avoid breaking stuff by not including <sys/types.h> here. - This will break on systems with 64-bit file offsets (e.g. 4.4BSD). - Probably the best long-term answer is to avoid using file_ptr AND off_t - in this header file, and to handle this in the BFD implementation - rather than in its interface. */ -/* typedef off_t file_ptr; */ -typedef long int file_ptr; - -/* Support for different sizes of target format ints and addresses. - If the type `long' is at least 64 bits, BFD_HOST_64BIT_LONG will be - set to 1 above. Otherwise, if gcc is being used, this code will - use gcc's "long long" type. Otherwise, the compilation will fail - if 64-bit targets are requested. */ - -#ifdef BFD64 - -#ifndef BFD_HOST_64_BIT -#if BFD_HOST_64BIT_LONG -#define BFD_HOST_64_BIT long -#else -#ifdef __GNUC__ -#define BFD_HOST_64_BIT long long -#endif /* defined (__GNUC__) */ -#endif /* ! BFD_HOST_64BIT_LONG */ -#endif /* ! defined (BFD_HOST_64_BIT) */ - -typedef unsigned BFD_HOST_64_BIT bfd_vma; -typedef BFD_HOST_64_BIT bfd_signed_vma; -typedef unsigned BFD_HOST_64_BIT bfd_size_type; -typedef unsigned BFD_HOST_64_BIT symvalue; - -#ifndef fprintf_vma -#if BFD_HOST_64BIT_LONG -#define sprintf_vma(s,x) sprintf (s, "%016lx", x) -#define fprintf_vma(f,x) fprintf (f, "%016lx", x) -#else -#define _bfd_int64_low(x) ((unsigned long) (((x) & 0xffffffff))) -#define _bfd_int64_high(x) ((unsigned long) (((x) >> 32) & 0xffffffff)) -#define fprintf_vma(s,x) \ - fprintf ((s), "%08lx%08lx", _bfd_int64_high (x), _bfd_int64_low (x)) -#define sprintf_vma(s,x) \ - sprintf ((s), "%08lx%08lx", _bfd_int64_high (x), _bfd_int64_low (x)) -#endif -#endif - -#else /* not BFD64 */ - -/* Represent a target address. Also used as a generic unsigned type - which is guaranteed to be big enough to hold any arithmetic types - we need to deal with. */ -typedef unsigned long bfd_vma; - -/* A generic signed type which is guaranteed to be big enough to hold any - arithmetic types we need to deal with. Can be assumed to be compatible - with bfd_vma in the same way that signed and unsigned ints are compatible - (as parameters, in assignment, etc). */ -typedef long bfd_signed_vma; - -typedef unsigned long symvalue; -typedef unsigned long bfd_size_type; - -/* Print a bfd_vma x on stream s. */ -#define fprintf_vma(s,x) fprintf(s, "%08lx", x) -#define sprintf_vma(s,x) sprintf(s, "%08lx", x) -#endif /* not BFD64 */ -#define printf_vma(x) fprintf_vma(stdout,x) - -typedef unsigned int flagword; /* 32 bits of flags */ -typedef unsigned char bfd_byte; - -/** File formats */ - -typedef enum bfd_format { - bfd_unknown = 0, /* file format is unknown */ - bfd_object, /* linker/assember/compiler output */ - bfd_archive, /* object archive file */ - bfd_core, /* core dump */ - bfd_type_end} /* marks the end; don't use it! */ - bfd_format; - -/* Values that may appear in the flags field of a BFD. These also - appear in the object_flags field of the bfd_target structure, where - they indicate the set of flags used by that backend (not all flags - are meaningful for all object file formats) (FIXME: at the moment, - the object_flags values have mostly just been copied from backend - to another, and are not necessarily correct). */ - -/* No flags. */ -#define NO_FLAGS 0x00 - -/* BFD contains relocation entries. */ -#define HAS_RELOC 0x01 - -/* BFD is directly executable. */ -#define EXEC_P 0x02 - -/* BFD has line number information (basically used for F_LNNO in a - COFF header). */ -#define HAS_LINENO 0x04 - -/* BFD has debugging information. */ -#define HAS_DEBUG 0x08 - -/* BFD has symbols. */ -#define HAS_SYMS 0x10 - -/* BFD has local symbols (basically used for F_LSYMS in a COFF - header). */ -#define HAS_LOCALS 0x20 - -/* BFD is a dynamic object. */ -#define DYNAMIC 0x40 - -/* Text section is write protected (if D_PAGED is not set, this is - like an a.out NMAGIC file) (the linker sets this by default, but - clears it for -r or -N). */ -#define WP_TEXT 0x80 - -/* BFD is dynamically paged (this is like an a.out ZMAGIC file) (the - linker sets this by default, but clears it for -r or -n or -N). */ -#define D_PAGED 0x100 - -/* BFD is relaxable (this means that bfd_relax_section may be able to - do something) (sometimes bfd_relax_section can do something even if - this is not set). */ -#define BFD_IS_RELAXABLE 0x200 - -/* This may be set before writing out a BFD to request using a - traditional format. For example, this is used to request that when - writing out an a.out object the symbols not be hashed to eliminate - duplicates. */ -#define BFD_TRADITIONAL_FORMAT 0x400 - -/* This flag indicates that the BFD contents are actually cached in - memory. If this is set, iostream points to a bfd_in_memory struct. */ -#define BFD_IN_MEMORY 0x800 - -/* symbols and relocation */ - -/* A count of carsyms (canonical archive symbols). */ -typedef unsigned long symindex; - -/* How to perform a relocation. */ -typedef const struct reloc_howto_struct reloc_howto_type; - -#define BFD_NO_MORE_SYMBOLS ((symindex) ~0) - -/* General purpose part of a symbol X; - target specific parts are in libcoff.h, libaout.h, etc. */ - -#define bfd_get_section(x) ((x)->section) -#define bfd_get_output_section(x) ((x)->section->output_section) -#define bfd_set_section(x,y) ((x)->section) = (y) -#define bfd_asymbol_base(x) ((x)->section->vma) -#define bfd_asymbol_value(x) (bfd_asymbol_base(x) + (x)->value) -#define bfd_asymbol_name(x) ((x)->name) -/*Perhaps future: #define bfd_asymbol_bfd(x) ((x)->section->owner)*/ -#define bfd_asymbol_bfd(x) ((x)->the_bfd) -#define bfd_asymbol_flavour(x) (bfd_asymbol_bfd(x)->xvec->flavour) - -/* A canonical archive symbol. */ -/* This is a type pun with struct ranlib on purpose! */ -typedef struct carsym { - char *name; - file_ptr file_offset; /* look here to find the file */ -} carsym; /* to make these you call a carsymogen */ - - -/* Used in generating armaps (archive tables of contents). - Perhaps just a forward definition would do? */ -struct orl { /* output ranlib */ - char **name; /* symbol name */ - file_ptr pos; /* bfd* or file position */ - int namidx; /* index into string table */ -}; - - -/* Linenumber stuff */ -typedef struct lineno_cache_entry { - unsigned int line_number; /* Linenumber from start of function*/ - union { - struct symbol_cache_entry *sym; /* Function name */ - unsigned long offset; /* Offset into section */ - } u; -} alent; - -/* object and core file sections */ - -#define align_power(addr, align) \ - ( ((addr) + ((1<<(align))-1)) & (-1 << (align))) - -typedef struct sec *sec_ptr; - -#define bfd_get_section_name(bfd, ptr) ((ptr)->name + 0) -#define bfd_get_section_vma(bfd, ptr) ((ptr)->vma + 0) -#define bfd_get_section_alignment(bfd, ptr) ((ptr)->alignment_power + 0) -#define bfd_section_name(bfd, ptr) ((ptr)->name) -#define bfd_section_size(bfd, ptr) (bfd_get_section_size_before_reloc(ptr)) -#define bfd_section_vma(bfd, ptr) ((ptr)->vma) -#define bfd_section_alignment(bfd, ptr) ((ptr)->alignment_power) -#define bfd_get_section_flags(bfd, ptr) ((ptr)->flags + 0) -#define bfd_get_section_userdata(bfd, ptr) ((ptr)->userdata) - -#define bfd_is_com_section(ptr) (((ptr)->flags & SEC_IS_COMMON) != 0) - -#define bfd_set_section_vma(bfd, ptr, val) (((ptr)->vma = (ptr)->lma= (val)), ((ptr)->user_set_vma = (boolean)true), true) -#define bfd_set_section_alignment(bfd, ptr, val) (((ptr)->alignment_power = (val)),true) -#define bfd_set_section_userdata(bfd, ptr, val) (((ptr)->userdata = (val)),true) - -typedef struct stat stat_type; - -typedef enum bfd_print_symbol -{ - bfd_print_symbol_name, - bfd_print_symbol_more, - bfd_print_symbol_all -} bfd_print_symbol_type; - -/* Information about a symbol that nm needs. */ - -typedef struct _symbol_info -{ - symvalue value; - char type; - CONST char *name; /* Symbol name. */ - unsigned char stab_type; /* Stab type. */ - char stab_other; /* Stab other. */ - short stab_desc; /* Stab desc. */ - CONST char *stab_name; /* String for stab type. */ -} symbol_info; - -/* Get the name of a stabs type code. */ - -extern const char *bfd_get_stab_name PARAMS ((int)); - -/* Hash table routines. There is no way to free up a hash table. */ - -/* An element in the hash table. Most uses will actually use a larger - structure, and an instance of this will be the first field. */ - -struct bfd_hash_entry -{ - /* Next entry for this hash code. */ - struct bfd_hash_entry *next; - /* String being hashed. */ - const char *string; - /* Hash code. This is the full hash code, not the index into the - table. */ - unsigned long hash; -}; - -/* A hash table. */ - -struct bfd_hash_table -{ - /* The hash array. */ - struct bfd_hash_entry **table; - /* The number of slots in the hash table. */ - unsigned int size; - /* A function used to create new elements in the hash table. The - first entry is itself a pointer to an element. When this - function is first invoked, this pointer will be NULL. However, - having the pointer permits a hierarchy of method functions to be - built each of which calls the function in the superclass. Thus - each function should be written to allocate a new block of memory - only if the argument is NULL. */ - struct bfd_hash_entry *(*newfunc) PARAMS ((struct bfd_hash_entry *, - struct bfd_hash_table *, - const char *)); - /* An obstack for this hash table. */ - struct obstack memory; -}; - -/* Initialize a hash table. */ -extern boolean bfd_hash_table_init - PARAMS ((struct bfd_hash_table *, - struct bfd_hash_entry *(*) (struct bfd_hash_entry *, - struct bfd_hash_table *, - const char *))); - -/* Initialize a hash table specifying a size. */ -extern boolean bfd_hash_table_init_n - PARAMS ((struct bfd_hash_table *, - struct bfd_hash_entry *(*) (struct bfd_hash_entry *, - struct bfd_hash_table *, - const char *), - unsigned int size)); - -/* Free up a hash table. */ -extern void bfd_hash_table_free PARAMS ((struct bfd_hash_table *)); - -/* Look up a string in a hash table. If CREATE is true, a new entry - will be created for this string if one does not already exist. The - COPY argument must be true if this routine should copy the string - into newly allocated memory when adding an entry. */ -extern struct bfd_hash_entry *bfd_hash_lookup - PARAMS ((struct bfd_hash_table *, const char *, boolean create, - boolean copy)); - -/* Replace an entry in a hash table. */ -extern void bfd_hash_replace - PARAMS ((struct bfd_hash_table *, struct bfd_hash_entry *old, - struct bfd_hash_entry *nw)); - -/* Base method for creating a hash table entry. */ -extern struct bfd_hash_entry *bfd_hash_newfunc - PARAMS ((struct bfd_hash_entry *, struct bfd_hash_table *, - const char *)); - -/* Grab some space for a hash table entry. */ -extern PTR bfd_hash_allocate PARAMS ((struct bfd_hash_table *, - unsigned int)); - -/* Traverse a hash table in a random order, calling a function on each - element. If the function returns false, the traversal stops. The - INFO argument is passed to the function. */ -extern void bfd_hash_traverse PARAMS ((struct bfd_hash_table *, - boolean (*) (struct bfd_hash_entry *, - PTR), - PTR info)); - -/* Semi-portable string concatenation in cpp. - The CAT4 hack is to avoid a problem with some strict ANSI C preprocessors. - The problem is, "32_" is not a valid preprocessing token, and we don't - want extra underscores (e.g., "nlm_32_"). The XCAT2 macro will cause the - inner CAT macros to be evaluated first, producing still-valid pp-tokens. - Then the final concatenation can be done. (Sigh.) */ -#ifndef CAT -#ifdef SABER -#define CAT(a,b) a##b -#define CAT3(a,b,c) a##b##c -#define CAT4(a,b,c,d) a##b##c##d -#else -#if defined(__STDC__) || defined(ALMOST_STDC) -#define CAT(a,b) a##b -#define CAT3(a,b,c) a##b##c -#define XCAT2(a,b) CAT(a,b) -#define CAT4(a,b,c,d) XCAT2(CAT(a,b),CAT(c,d)) -#else -#define CAT(a,b) a/**/b -#define CAT3(a,b,c) a/**/b/**/c -#define CAT4(a,b,c,d) a/**/b/**/c/**/d -#endif -#endif -#endif - -#define COFF_SWAP_TABLE (PTR) &bfd_coff_std_swap_table - -/* User program access to BFD facilities */ - -/* Direct I/O routines, for programs which know more about the object - file than BFD does. Use higher level routines if possible. */ - -extern bfd_size_type bfd_read - PARAMS ((PTR, bfd_size_type size, bfd_size_type nitems, bfd *abfd)); -extern bfd_size_type bfd_write - PARAMS ((const PTR, bfd_size_type size, bfd_size_type nitems, bfd *abfd)); -extern int bfd_seek PARAMS ((bfd *abfd, file_ptr fp, int direction)); -extern long bfd_tell PARAMS ((bfd *abfd)); -extern int bfd_flush PARAMS ((bfd *abfd)); -extern int bfd_stat PARAMS ((bfd *abfd, struct stat *)); - - -/* Cast from const char * to char * so that caller can assign to - a char * without a warning. */ -#define bfd_get_filename(abfd) ((char *) (abfd)->filename) -#define bfd_get_cacheable(abfd) ((abfd)->cacheable) -#define bfd_get_format(abfd) ((abfd)->format) -#define bfd_get_target(abfd) ((abfd)->xvec->name) -#define bfd_get_flavour(abfd) ((abfd)->xvec->flavour) -#define bfd_big_endian(abfd) ((abfd)->xvec->byteorder == BFD_ENDIAN_BIG) -#define bfd_little_endian(abfd) ((abfd)->xvec->byteorder == BFD_ENDIAN_LITTLE) -#define bfd_header_big_endian(abfd) \ - ((abfd)->xvec->header_byteorder == BFD_ENDIAN_BIG) -#define bfd_header_little_endian(abfd) \ - ((abfd)->xvec->header_byteorder == BFD_ENDIAN_LITTLE) -#define bfd_get_file_flags(abfd) ((abfd)->flags) -#define bfd_applicable_file_flags(abfd) ((abfd)->xvec->object_flags) -#define bfd_applicable_section_flags(abfd) ((abfd)->xvec->section_flags) -#define bfd_my_archive(abfd) ((abfd)->my_archive) -#define bfd_has_map(abfd) ((abfd)->has_armap) - -#define bfd_valid_reloc_types(abfd) ((abfd)->xvec->valid_reloc_types) -#define bfd_usrdata(abfd) ((abfd)->usrdata) - -#define bfd_get_start_address(abfd) ((abfd)->start_address) -#define bfd_get_symcount(abfd) ((abfd)->symcount) -#define bfd_get_outsymbols(abfd) ((abfd)->outsymbols) -#define bfd_count_sections(abfd) ((abfd)->section_count) - -#define bfd_get_symbol_leading_char(abfd) ((abfd)->xvec->symbol_leading_char) - -#define bfd_set_cacheable(abfd,bool) (((abfd)->cacheable = (boolean)(bool)), true) - -extern boolean bfd_record_phdr - PARAMS ((bfd *, unsigned long, boolean, flagword, boolean, bfd_vma, - boolean, boolean, unsigned int, struct sec **)); - -/* Byte swapping routines. */ - -bfd_vma bfd_getb64 PARAMS ((const unsigned char *)); -bfd_vma bfd_getl64 PARAMS ((const unsigned char *)); -bfd_signed_vma bfd_getb_signed_64 PARAMS ((const unsigned char *)); -bfd_signed_vma bfd_getl_signed_64 PARAMS ((const unsigned char *)); -bfd_vma bfd_getb32 PARAMS ((const unsigned char *)); -bfd_vma bfd_getl32 PARAMS ((const unsigned char *)); -bfd_signed_vma bfd_getb_signed_32 PARAMS ((const unsigned char *)); -bfd_signed_vma bfd_getl_signed_32 PARAMS ((const unsigned char *)); -bfd_vma bfd_getb16 PARAMS ((const unsigned char *)); -bfd_vma bfd_getl16 PARAMS ((const unsigned char *)); -bfd_signed_vma bfd_getb_signed_16 PARAMS ((const unsigned char *)); -bfd_signed_vma bfd_getl_signed_16 PARAMS ((const unsigned char *)); -void bfd_putb64 PARAMS ((bfd_vma, unsigned char *)); -void bfd_putl64 PARAMS ((bfd_vma, unsigned char *)); -void bfd_putb32 PARAMS ((bfd_vma, unsigned char *)); -void bfd_putl32 PARAMS ((bfd_vma, unsigned char *)); -void bfd_putb16 PARAMS ((bfd_vma, unsigned char *)); -void bfd_putl16 PARAMS ((bfd_vma, unsigned char *)); - -/* Externally visible ECOFF routines. */ - -#if defined(__STDC__) || defined(ALMOST_STDC) -struct ecoff_debug_info; -struct ecoff_debug_swap; -struct ecoff_extr; -struct symbol_cache_entry; -struct bfd_link_info; -struct bfd_link_hash_entry; -#endif -extern bfd_vma bfd_ecoff_get_gp_value PARAMS ((bfd * abfd)); -extern boolean bfd_ecoff_set_gp_value PARAMS ((bfd *abfd, bfd_vma gp_value)); -extern boolean bfd_ecoff_set_regmasks - PARAMS ((bfd *abfd, unsigned long gprmask, unsigned long fprmask, - unsigned long *cprmask)); -extern PTR bfd_ecoff_debug_init - PARAMS ((bfd *output_bfd, struct ecoff_debug_info *output_debug, - const struct ecoff_debug_swap *output_swap, - struct bfd_link_info *)); -extern void bfd_ecoff_debug_free - PARAMS ((PTR handle, bfd *output_bfd, struct ecoff_debug_info *output_debug, - const struct ecoff_debug_swap *output_swap, - struct bfd_link_info *)); -extern boolean bfd_ecoff_debug_accumulate - PARAMS ((PTR handle, bfd *output_bfd, struct ecoff_debug_info *output_debug, - const struct ecoff_debug_swap *output_swap, - bfd *input_bfd, struct ecoff_debug_info *input_debug, - const struct ecoff_debug_swap *input_swap, - struct bfd_link_info *)); -extern boolean bfd_ecoff_debug_accumulate_other - PARAMS ((PTR handle, bfd *output_bfd, struct ecoff_debug_info *output_debug, - const struct ecoff_debug_swap *output_swap, bfd *input_bfd, - struct bfd_link_info *)); -extern boolean bfd_ecoff_debug_externals - PARAMS ((bfd *abfd, struct ecoff_debug_info *debug, - const struct ecoff_debug_swap *swap, - boolean relocateable, - boolean (*get_extr) (struct symbol_cache_entry *, - struct ecoff_extr *), - void (*set_index) (struct symbol_cache_entry *, - bfd_size_type))); -extern boolean bfd_ecoff_debug_one_external - PARAMS ((bfd *abfd, struct ecoff_debug_info *debug, - const struct ecoff_debug_swap *swap, - const char *name, struct ecoff_extr *esym)); -extern bfd_size_type bfd_ecoff_debug_size - PARAMS ((bfd *abfd, struct ecoff_debug_info *debug, - const struct ecoff_debug_swap *swap)); -extern boolean bfd_ecoff_write_debug - PARAMS ((bfd *abfd, struct ecoff_debug_info *debug, - const struct ecoff_debug_swap *swap, file_ptr where)); -extern boolean bfd_ecoff_write_accumulated_debug - PARAMS ((PTR handle, bfd *abfd, struct ecoff_debug_info *debug, - const struct ecoff_debug_swap *swap, - struct bfd_link_info *info, file_ptr where)); -extern boolean bfd_mips_ecoff_create_embedded_relocs - PARAMS ((bfd *, struct bfd_link_info *, struct sec *, struct sec *, - char **)); - -/* Externally visible ELF routines. */ - -struct bfd_link_needed_list -{ - struct bfd_link_needed_list *next; - bfd *by; - const char *name; -}; - -extern boolean bfd_elf32_record_link_assignment - PARAMS ((bfd *, struct bfd_link_info *, const char *, boolean)); -extern boolean bfd_elf64_record_link_assignment - PARAMS ((bfd *, struct bfd_link_info *, const char *, boolean)); -extern struct bfd_link_needed_list *bfd_elf_get_needed_list - PARAMS ((bfd *, struct bfd_link_info *)); -extern boolean bfd_elf32_size_dynamic_sections - PARAMS ((bfd *, const char *, const char *, boolean, - struct bfd_link_info *, struct sec **)); -extern boolean bfd_elf64_size_dynamic_sections - PARAMS ((bfd *, const char *, const char *, boolean, - struct bfd_link_info *, struct sec **)); -extern void bfd_elf_set_dt_needed_name PARAMS ((bfd *, const char *)); -extern const char *bfd_elf_get_dt_soname PARAMS ((bfd *)); - -/* SunOS shared library support routines for the linker. */ - -extern struct bfd_link_needed_list *bfd_sunos_get_needed_list - PARAMS ((bfd *, struct bfd_link_info *)); -extern boolean bfd_sunos_record_link_assignment - PARAMS ((bfd *, struct bfd_link_info *, const char *)); -extern boolean bfd_sunos_size_dynamic_sections - PARAMS ((bfd *, struct bfd_link_info *, struct sec **, struct sec **, - struct sec **)); - -/* Linux shared library support routines for the linker. */ - -extern boolean bfd_i386linux_size_dynamic_sections - PARAMS ((bfd *, struct bfd_link_info *)); -extern boolean bfd_m68klinux_size_dynamic_sections - PARAMS ((bfd *, struct bfd_link_info *)); - -/* mmap hacks */ - -struct _bfd_window_internal; -typedef struct _bfd_window_internal bfd_window_internal; - -typedef struct _bfd_window { - /* What the user asked for. */ - PTR data; - bfd_size_type size; - /* The actual window used by BFD. Small user-requested read-only - regions sharing a page may share a single window into the object - file. Read-write versions shouldn't until I've fixed things to - keep track of which portions have been claimed by the - application; don't want to give the same region back when the - application wants two writable copies! */ - struct _bfd_window_internal *i; -} bfd_window; - -extern void bfd_init_window PARAMS ((bfd_window *)); -extern void bfd_free_window PARAMS ((bfd_window *)); -extern boolean bfd_get_file_window - PARAMS ((bfd *, file_ptr, bfd_size_type, bfd_window *, boolean)); - -/* XCOFF support routines for the linker. */ - -extern boolean bfd_xcoff_link_record_set - PARAMS ((bfd *, struct bfd_link_info *, struct bfd_link_hash_entry *, - bfd_size_type)); -extern boolean bfd_xcoff_import_symbol - PARAMS ((bfd *, struct bfd_link_info *, struct bfd_link_hash_entry *, - bfd_vma, const char *, const char *, const char *)); -extern boolean bfd_xcoff_export_symbol - PARAMS ((bfd *, struct bfd_link_info *, struct bfd_link_hash_entry *, - boolean)); -extern boolean bfd_xcoff_link_count_reloc - PARAMS ((bfd *, struct bfd_link_info *, const char *)); -extern boolean bfd_xcoff_record_link_assignment - PARAMS ((bfd *, struct bfd_link_info *, const char *)); -extern boolean bfd_xcoff_size_dynamic_sections - PARAMS ((bfd *, struct bfd_link_info *, const char *, const char *, - unsigned long, unsigned long, unsigned long, boolean, - int, boolean, boolean, struct sec **)); - -/* And more from the source. */ diff --git a/contrib/gdb/bfd/bfd-in2.h b/contrib/gdb/bfd/bfd-in2.h deleted file mode 100644 index d238d5afa4a03..0000000000000 --- a/contrib/gdb/bfd/bfd-in2.h +++ /dev/null @@ -1,2479 +0,0 @@ -/* Main header file for the bfd library -- portable access to object files. - Copyright 1990, 91, 92, 93, 94, 95, 1996 Free Software Foundation, Inc. - Contributed by Cygnus Support. - -** NOTE: bfd.h and bfd-in2.h are GENERATED files. Don't change them; -** instead, change bfd-in.h or the other BFD source files processed to -** generate these files. - -This file is part of BFD, the Binary File Descriptor library. - -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 2 of the License, 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ - -/* bfd.h -- The only header file required by users of the bfd library - -The bfd.h file is generated from bfd-in.h and various .c files; if you -change it, your changes will probably be lost. - -All the prototypes and definitions following the comment "THE FOLLOWING -IS EXTRACTED FROM THE SOURCE" are extracted from the source files for -BFD. If you change it, someone oneday will extract it from the source -again, and your changes will be lost. To save yourself from this bind, -change the definitions in the source in the bfd directory. Type "make -docs" and then "make headers" in that directory, and magically this file -will change to reflect your changes. - -If you don't have the tools to perform the extraction, then you are -safe from someone on your system trampling over your header files. -You should still maintain the equivalence between the source and this -file though; every change you make to the .c file should be reflected -here. */ - -#ifndef __BFD_H_SEEN__ -#define __BFD_H_SEEN__ - -#ifdef __cplusplus -extern "C" { -#endif - -#include "ansidecl.h" -#include "obstack.h" - -/* These two lines get substitutions done by commands in Makefile.in. */ -#define BFD_VERSION "@VERSION@" -#define BFD_ARCH_SIZE @WORDSIZE@ -#define BFD_HOST_64BIT_LONG @BFD_HOST_64BIT_LONG@ - -#if BFD_ARCH_SIZE >= 64 -#define BFD64 -#endif - -#ifndef INLINE -#if __GNUC__ >= 2 -#define INLINE __inline__ -#else -#define INLINE -#endif -#endif - -/* forward declaration */ -typedef struct _bfd bfd; - -/* To squelch erroneous compiler warnings ("illegal pointer - combination") from the SVR3 compiler, we would like to typedef - boolean to int (it doesn't like functions which return boolean. - Making sure they are never implicitly declared to return int - doesn't seem to help). But this file is not configured based on - the host. */ -/* General rules: functions which are boolean return true on success - and false on failure (unless they're a predicate). -- bfd.doc */ -/* I'm sure this is going to break something and someone is going to - force me to change it. */ -/* typedef enum boolean {false, true} boolean; */ -/* Yup, SVR4 has a "typedef enum boolean" in <sys/types.h> -fnf */ -/* It gets worse if the host also defines a true/false enum... -sts */ -/* And even worse if your compiler has built-in boolean types... -law */ -#if defined (__GNUG__) && (__GNUC_MINOR__ > 5) -#define TRUE_FALSE_ALREADY_DEFINED -#endif -#ifdef MPW -/* Pre-emptive strike - get the file with the enum. */ -#include <Types.h> -#define TRUE_FALSE_ALREADY_DEFINED -#endif /* MPW */ -#ifndef TRUE_FALSE_ALREADY_DEFINED -typedef enum bfd_boolean {false, true} boolean; -#define BFD_TRUE_FALSE -#else -/* Use enum names that will appear nowhere else. */ -typedef enum bfd_boolean {bfd_fffalse, bfd_tttrue} boolean; -#endif - -/* A pointer to a position in a file. */ -/* FIXME: This should be using off_t from <sys/types.h>. - For now, try to avoid breaking stuff by not including <sys/types.h> here. - This will break on systems with 64-bit file offsets (e.g. 4.4BSD). - Probably the best long-term answer is to avoid using file_ptr AND off_t - in this header file, and to handle this in the BFD implementation - rather than in its interface. */ -/* typedef off_t file_ptr; */ -typedef long int file_ptr; - -/* Support for different sizes of target format ints and addresses. - If the type `long' is at least 64 bits, BFD_HOST_64BIT_LONG will be - set to 1 above. Otherwise, if gcc is being used, this code will - use gcc's "long long" type. Otherwise, the compilation will fail - if 64-bit targets are requested. */ - -#ifdef BFD64 - -#ifndef BFD_HOST_64_BIT -#if BFD_HOST_64BIT_LONG -#define BFD_HOST_64_BIT long -#else -#ifdef __GNUC__ -#define BFD_HOST_64_BIT long long -#endif /* defined (__GNUC__) */ -#endif /* ! BFD_HOST_64BIT_LONG */ -#endif /* ! defined (BFD_HOST_64_BIT) */ - -typedef unsigned BFD_HOST_64_BIT bfd_vma; -typedef BFD_HOST_64_BIT bfd_signed_vma; -typedef unsigned BFD_HOST_64_BIT bfd_size_type; -typedef unsigned BFD_HOST_64_BIT symvalue; - -#ifndef fprintf_vma -#if BFD_HOST_64BIT_LONG -#define sprintf_vma(s,x) sprintf (s, "%016lx", x) -#define fprintf_vma(f,x) fprintf (f, "%016lx", x) -#else -#define _bfd_int64_low(x) ((unsigned long) (((x) & 0xffffffff))) -#define _bfd_int64_high(x) ((unsigned long) (((x) >> 32) & 0xffffffff)) -#define fprintf_vma(s,x) \ - fprintf ((s), "%08lx%08lx", _bfd_int64_high (x), _bfd_int64_low (x)) -#define sprintf_vma(s,x) \ - sprintf ((s), "%08lx%08lx", _bfd_int64_high (x), _bfd_int64_low (x)) -#endif -#endif - -#else /* not BFD64 */ - -/* Represent a target address. Also used as a generic unsigned type - which is guaranteed to be big enough to hold any arithmetic types - we need to deal with. */ -typedef unsigned long bfd_vma; - -/* A generic signed type which is guaranteed to be big enough to hold any - arithmetic types we need to deal with. Can be assumed to be compatible - with bfd_vma in the same way that signed and unsigned ints are compatible - (as parameters, in assignment, etc). */ -typedef long bfd_signed_vma; - -typedef unsigned long symvalue; -typedef unsigned long bfd_size_type; - -/* Print a bfd_vma x on stream s. */ -#define fprintf_vma(s,x) fprintf(s, "%08lx", x) -#define sprintf_vma(s,x) sprintf(s, "%08lx", x) -#endif /* not BFD64 */ -#define printf_vma(x) fprintf_vma(stdout,x) - -typedef unsigned int flagword; /* 32 bits of flags */ -typedef unsigned char bfd_byte; - -/** File formats */ - -typedef enum bfd_format { - bfd_unknown = 0, /* file format is unknown */ - bfd_object, /* linker/assember/compiler output */ - bfd_archive, /* object archive file */ - bfd_core, /* core dump */ - bfd_type_end} /* marks the end; don't use it! */ - bfd_format; - -/* Values that may appear in the flags field of a BFD. These also - appear in the object_flags field of the bfd_target structure, where - they indicate the set of flags used by that backend (not all flags - are meaningful for all object file formats) (FIXME: at the moment, - the object_flags values have mostly just been copied from backend - to another, and are not necessarily correct). */ - -/* No flags. */ -#define NO_FLAGS 0x00 - -/* BFD contains relocation entries. */ -#define HAS_RELOC 0x01 - -/* BFD is directly executable. */ -#define EXEC_P 0x02 - -/* BFD has line number information (basically used for F_LNNO in a - COFF header). */ -#define HAS_LINENO 0x04 - -/* BFD has debugging information. */ -#define HAS_DEBUG 0x08 - -/* BFD has symbols. */ -#define HAS_SYMS 0x10 - -/* BFD has local symbols (basically used for F_LSYMS in a COFF - header). */ -#define HAS_LOCALS 0x20 - -/* BFD is a dynamic object. */ -#define DYNAMIC 0x40 - -/* Text section is write protected (if D_PAGED is not set, this is - like an a.out NMAGIC file) (the linker sets this by default, but - clears it for -r or -N). */ -#define WP_TEXT 0x80 - -/* BFD is dynamically paged (this is like an a.out ZMAGIC file) (the - linker sets this by default, but clears it for -r or -n or -N). */ -#define D_PAGED 0x100 - -/* BFD is relaxable (this means that bfd_relax_section may be able to - do something) (sometimes bfd_relax_section can do something even if - this is not set). */ -#define BFD_IS_RELAXABLE 0x200 - -/* This may be set before writing out a BFD to request using a - traditional format. For example, this is used to request that when - writing out an a.out object the symbols not be hashed to eliminate - duplicates. */ -#define BFD_TRADITIONAL_FORMAT 0x400 - -/* This flag indicates that the BFD contents are actually cached in - memory. If this is set, iostream points to a bfd_in_memory struct. */ -#define BFD_IN_MEMORY 0x800 - -/* symbols and relocation */ - -/* A count of carsyms (canonical archive symbols). */ -typedef unsigned long symindex; - -/* How to perform a relocation. */ -typedef const struct reloc_howto_struct reloc_howto_type; - -#define BFD_NO_MORE_SYMBOLS ((symindex) ~0) - -/* General purpose part of a symbol X; - target specific parts are in libcoff.h, libaout.h, etc. */ - -#define bfd_get_section(x) ((x)->section) -#define bfd_get_output_section(x) ((x)->section->output_section) -#define bfd_set_section(x,y) ((x)->section) = (y) -#define bfd_asymbol_base(x) ((x)->section->vma) -#define bfd_asymbol_value(x) (bfd_asymbol_base(x) + (x)->value) -#define bfd_asymbol_name(x) ((x)->name) -/*Perhaps future: #define bfd_asymbol_bfd(x) ((x)->section->owner)*/ -#define bfd_asymbol_bfd(x) ((x)->the_bfd) -#define bfd_asymbol_flavour(x) (bfd_asymbol_bfd(x)->xvec->flavour) - -/* A canonical archive symbol. */ -/* This is a type pun with struct ranlib on purpose! */ -typedef struct carsym { - char *name; - file_ptr file_offset; /* look here to find the file */ -} carsym; /* to make these you call a carsymogen */ - - -/* Used in generating armaps (archive tables of contents). - Perhaps just a forward definition would do? */ -struct orl { /* output ranlib */ - char **name; /* symbol name */ - file_ptr pos; /* bfd* or file position */ - int namidx; /* index into string table */ -}; - - -/* Linenumber stuff */ -typedef struct lineno_cache_entry { - unsigned int line_number; /* Linenumber from start of function*/ - union { - struct symbol_cache_entry *sym; /* Function name */ - unsigned long offset; /* Offset into section */ - } u; -} alent; - -/* object and core file sections */ - -#define align_power(addr, align) \ - ( ((addr) + ((1<<(align))-1)) & (-1 << (align))) - -typedef struct sec *sec_ptr; - -#define bfd_get_section_name(bfd, ptr) ((ptr)->name + 0) -#define bfd_get_section_vma(bfd, ptr) ((ptr)->vma + 0) -#define bfd_get_section_alignment(bfd, ptr) ((ptr)->alignment_power + 0) -#define bfd_section_name(bfd, ptr) ((ptr)->name) -#define bfd_section_size(bfd, ptr) (bfd_get_section_size_before_reloc(ptr)) -#define bfd_section_vma(bfd, ptr) ((ptr)->vma) -#define bfd_section_alignment(bfd, ptr) ((ptr)->alignment_power) -#define bfd_get_section_flags(bfd, ptr) ((ptr)->flags + 0) -#define bfd_get_section_userdata(bfd, ptr) ((ptr)->userdata) - -#define bfd_is_com_section(ptr) (((ptr)->flags & SEC_IS_COMMON) != 0) - -#define bfd_set_section_vma(bfd, ptr, val) (((ptr)->vma = (ptr)->lma= (val)), ((ptr)->user_set_vma = (boolean)true), true) -#define bfd_set_section_alignment(bfd, ptr, val) (((ptr)->alignment_power = (val)),true) -#define bfd_set_section_userdata(bfd, ptr, val) (((ptr)->userdata = (val)),true) - -typedef struct stat stat_type; - -typedef enum bfd_print_symbol -{ - bfd_print_symbol_name, - bfd_print_symbol_more, - bfd_print_symbol_all -} bfd_print_symbol_type; - -/* Information about a symbol that nm needs. */ - -typedef struct _symbol_info -{ - symvalue value; - char type; - CONST char *name; /* Symbol name. */ - unsigned char stab_type; /* Stab type. */ - char stab_other; /* Stab other. */ - short stab_desc; /* Stab desc. */ - CONST char *stab_name; /* String for stab type. */ -} symbol_info; - -/* Get the name of a stabs type code. */ - -extern const char *bfd_get_stab_name PARAMS ((int)); - -/* Hash table routines. There is no way to free up a hash table. */ - -/* An element in the hash table. Most uses will actually use a larger - structure, and an instance of this will be the first field. */ - -struct bfd_hash_entry -{ - /* Next entry for this hash code. */ - struct bfd_hash_entry *next; - /* String being hashed. */ - const char *string; - /* Hash code. This is the full hash code, not the index into the - table. */ - unsigned long hash; -}; - -/* A hash table. */ - -struct bfd_hash_table -{ - /* The hash array. */ - struct bfd_hash_entry **table; - /* The number of slots in the hash table. */ - unsigned int size; - /* A function used to create new elements in the hash table. The - first entry is itself a pointer to an element. When this - function is first invoked, this pointer will be NULL. However, - having the pointer permits a hierarchy of method functions to be - built each of which calls the function in the superclass. Thus - each function should be written to allocate a new block of memory - only if the argument is NULL. */ - struct bfd_hash_entry *(*newfunc) PARAMS ((struct bfd_hash_entry *, - struct bfd_hash_table *, - const char *)); - /* An obstack for this hash table. */ - struct obstack memory; -}; - -/* Initialize a hash table. */ -extern boolean bfd_hash_table_init - PARAMS ((struct bfd_hash_table *, - struct bfd_hash_entry *(*) (struct bfd_hash_entry *, - struct bfd_hash_table *, - const char *))); - -/* Initialize a hash table specifying a size. */ -extern boolean bfd_hash_table_init_n - PARAMS ((struct bfd_hash_table *, - struct bfd_hash_entry *(*) (struct bfd_hash_entry *, - struct bfd_hash_table *, - const char *), - unsigned int size)); - -/* Free up a hash table. */ -extern void bfd_hash_table_free PARAMS ((struct bfd_hash_table *)); - -/* Look up a string in a hash table. If CREATE is true, a new entry - will be created for this string if one does not already exist. The - COPY argument must be true if this routine should copy the string - into newly allocated memory when adding an entry. */ -extern struct bfd_hash_entry *bfd_hash_lookup - PARAMS ((struct bfd_hash_table *, const char *, boolean create, - boolean copy)); - -/* Replace an entry in a hash table. */ -extern void bfd_hash_replace - PARAMS ((struct bfd_hash_table *, struct bfd_hash_entry *old, - struct bfd_hash_entry *nw)); - -/* Base method for creating a hash table entry. */ -extern struct bfd_hash_entry *bfd_hash_newfunc - PARAMS ((struct bfd_hash_entry *, struct bfd_hash_table *, - const char *)); - -/* Grab some space for a hash table entry. */ -extern PTR bfd_hash_allocate PARAMS ((struct bfd_hash_table *, - unsigned int)); - -/* Traverse a hash table in a random order, calling a function on each - element. If the function returns false, the traversal stops. The - INFO argument is passed to the function. */ -extern void bfd_hash_traverse PARAMS ((struct bfd_hash_table *, - boolean (*) (struct bfd_hash_entry *, - PTR), - PTR info)); - -/* Semi-portable string concatenation in cpp. - The CAT4 hack is to avoid a problem with some strict ANSI C preprocessors. - The problem is, "32_" is not a valid preprocessing token, and we don't - want extra underscores (e.g., "nlm_32_"). The XCAT2 macro will cause the - inner CAT macros to be evaluated first, producing still-valid pp-tokens. - Then the final concatenation can be done. (Sigh.) */ -#ifndef CAT -#ifdef SABER -#define CAT(a,b) a##b -#define CAT3(a,b,c) a##b##c -#define CAT4(a,b,c,d) a##b##c##d -#else -#if defined(__STDC__) || defined(ALMOST_STDC) -#define CAT(a,b) a##b -#define CAT3(a,b,c) a##b##c -#define XCAT2(a,b) CAT(a,b) -#define CAT4(a,b,c,d) XCAT2(CAT(a,b),CAT(c,d)) -#else -#define CAT(a,b) a/**/b -#define CAT3(a,b,c) a/**/b/**/c -#define CAT4(a,b,c,d) a/**/b/**/c/**/d -#endif -#endif -#endif - -#define COFF_SWAP_TABLE (PTR) &bfd_coff_std_swap_table - -/* User program access to BFD facilities */ - -/* Direct I/O routines, for programs which know more about the object - file than BFD does. Use higher level routines if possible. */ - -extern bfd_size_type bfd_read - PARAMS ((PTR, bfd_size_type size, bfd_size_type nitems, bfd *abfd)); -extern bfd_size_type bfd_write - PARAMS ((const PTR, bfd_size_type size, bfd_size_type nitems, bfd *abfd)); -extern int bfd_seek PARAMS ((bfd *abfd, file_ptr fp, int direction)); -extern long bfd_tell PARAMS ((bfd *abfd)); -extern int bfd_flush PARAMS ((bfd *abfd)); -extern int bfd_stat PARAMS ((bfd *abfd, struct stat *)); - - -/* Cast from const char * to char * so that caller can assign to - a char * without a warning. */ -#define bfd_get_filename(abfd) ((char *) (abfd)->filename) -#define bfd_get_cacheable(abfd) ((abfd)->cacheable) -#define bfd_get_format(abfd) ((abfd)->format) -#define bfd_get_target(abfd) ((abfd)->xvec->name) -#define bfd_get_flavour(abfd) ((abfd)->xvec->flavour) -#define bfd_big_endian(abfd) ((abfd)->xvec->byteorder == BFD_ENDIAN_BIG) -#define bfd_little_endian(abfd) ((abfd)->xvec->byteorder == BFD_ENDIAN_LITTLE) -#define bfd_header_big_endian(abfd) \ - ((abfd)->xvec->header_byteorder == BFD_ENDIAN_BIG) -#define bfd_header_little_endian(abfd) \ - ((abfd)->xvec->header_byteorder == BFD_ENDIAN_LITTLE) -#define bfd_get_file_flags(abfd) ((abfd)->flags) -#define bfd_applicable_file_flags(abfd) ((abfd)->xvec->object_flags) -#define bfd_applicable_section_flags(abfd) ((abfd)->xvec->section_flags) -#define bfd_my_archive(abfd) ((abfd)->my_archive) -#define bfd_has_map(abfd) ((abfd)->has_armap) - -#define bfd_valid_reloc_types(abfd) ((abfd)->xvec->valid_reloc_types) -#define bfd_usrdata(abfd) ((abfd)->usrdata) - -#define bfd_get_start_address(abfd) ((abfd)->start_address) -#define bfd_get_symcount(abfd) ((abfd)->symcount) -#define bfd_get_outsymbols(abfd) ((abfd)->outsymbols) -#define bfd_count_sections(abfd) ((abfd)->section_count) - -#define bfd_get_symbol_leading_char(abfd) ((abfd)->xvec->symbol_leading_char) - -#define bfd_set_cacheable(abfd,bool) (((abfd)->cacheable = (boolean)(bool)), true) - -extern boolean bfd_record_phdr - PARAMS ((bfd *, unsigned long, boolean, flagword, boolean, bfd_vma, - boolean, boolean, unsigned int, struct sec **)); - -/* Byte swapping routines. */ - -bfd_vma bfd_getb64 PARAMS ((const unsigned char *)); -bfd_vma bfd_getl64 PARAMS ((const unsigned char *)); -bfd_signed_vma bfd_getb_signed_64 PARAMS ((const unsigned char *)); -bfd_signed_vma bfd_getl_signed_64 PARAMS ((const unsigned char *)); -bfd_vma bfd_getb32 PARAMS ((const unsigned char *)); -bfd_vma bfd_getl32 PARAMS ((const unsigned char *)); -bfd_signed_vma bfd_getb_signed_32 PARAMS ((const unsigned char *)); -bfd_signed_vma bfd_getl_signed_32 PARAMS ((const unsigned char *)); -bfd_vma bfd_getb16 PARAMS ((const unsigned char *)); -bfd_vma bfd_getl16 PARAMS ((const unsigned char *)); -bfd_signed_vma bfd_getb_signed_16 PARAMS ((const unsigned char *)); -bfd_signed_vma bfd_getl_signed_16 PARAMS ((const unsigned char *)); -void bfd_putb64 PARAMS ((bfd_vma, unsigned char *)); -void bfd_putl64 PARAMS ((bfd_vma, unsigned char *)); -void bfd_putb32 PARAMS ((bfd_vma, unsigned char *)); -void bfd_putl32 PARAMS ((bfd_vma, unsigned char *)); -void bfd_putb16 PARAMS ((bfd_vma, unsigned char *)); -void bfd_putl16 PARAMS ((bfd_vma, unsigned char *)); - -/* Externally visible ECOFF routines. */ - -#if defined(__STDC__) || defined(ALMOST_STDC) -struct ecoff_debug_info; -struct ecoff_debug_swap; -struct ecoff_extr; -struct symbol_cache_entry; -struct bfd_link_info; -struct bfd_link_hash_entry; -#endif -extern bfd_vma bfd_ecoff_get_gp_value PARAMS ((bfd * abfd)); -extern boolean bfd_ecoff_set_gp_value PARAMS ((bfd *abfd, bfd_vma gp_value)); -extern boolean bfd_ecoff_set_regmasks - PARAMS ((bfd *abfd, unsigned long gprmask, unsigned long fprmask, - unsigned long *cprmask)); -extern PTR bfd_ecoff_debug_init - PARAMS ((bfd *output_bfd, struct ecoff_debug_info *output_debug, - const struct ecoff_debug_swap *output_swap, - struct bfd_link_info *)); -extern void bfd_ecoff_debug_free - PARAMS ((PTR handle, bfd *output_bfd, struct ecoff_debug_info *output_debug, - const struct ecoff_debug_swap *output_swap, - struct bfd_link_info *)); -extern boolean bfd_ecoff_debug_accumulate - PARAMS ((PTR handle, bfd *output_bfd, struct ecoff_debug_info *output_debug, - const struct ecoff_debug_swap *output_swap, - bfd *input_bfd, struct ecoff_debug_info *input_debug, - const struct ecoff_debug_swap *input_swap, - struct bfd_link_info *)); -extern boolean bfd_ecoff_debug_accumulate_other - PARAMS ((PTR handle, bfd *output_bfd, struct ecoff_debug_info *output_debug, - const struct ecoff_debug_swap *output_swap, bfd *input_bfd, - struct bfd_link_info *)); -extern boolean bfd_ecoff_debug_externals - PARAMS ((bfd *abfd, struct ecoff_debug_info *debug, - const struct ecoff_debug_swap *swap, - boolean relocateable, - boolean (*get_extr) (struct symbol_cache_entry *, - struct ecoff_extr *), - void (*set_index) (struct symbol_cache_entry *, - bfd_size_type))); -extern boolean bfd_ecoff_debug_one_external - PARAMS ((bfd *abfd, struct ecoff_debug_info *debug, - const struct ecoff_debug_swap *swap, - const char *name, struct ecoff_extr *esym)); -extern bfd_size_type bfd_ecoff_debug_size - PARAMS ((bfd *abfd, struct ecoff_debug_info *debug, - const struct ecoff_debug_swap *swap)); -extern boolean bfd_ecoff_write_debug - PARAMS ((bfd *abfd, struct ecoff_debug_info *debug, - const struct ecoff_debug_swap *swap, file_ptr where)); -extern boolean bfd_ecoff_write_accumulated_debug - PARAMS ((PTR handle, bfd *abfd, struct ecoff_debug_info *debug, - const struct ecoff_debug_swap *swap, - struct bfd_link_info *info, file_ptr where)); -extern boolean bfd_mips_ecoff_create_embedded_relocs - PARAMS ((bfd *, struct bfd_link_info *, struct sec *, struct sec *, - char **)); - -/* Externally visible ELF routines. */ - -struct bfd_link_needed_list -{ - struct bfd_link_needed_list *next; - bfd *by; - const char *name; -}; - -extern boolean bfd_elf32_record_link_assignment - PARAMS ((bfd *, struct bfd_link_info *, const char *, boolean)); -extern boolean bfd_elf64_record_link_assignment - PARAMS ((bfd *, struct bfd_link_info *, const char *, boolean)); -extern struct bfd_link_needed_list *bfd_elf_get_needed_list - PARAMS ((bfd *, struct bfd_link_info *)); -extern boolean bfd_elf32_size_dynamic_sections - PARAMS ((bfd *, const char *, const char *, boolean, - struct bfd_link_info *, struct sec **)); -extern boolean bfd_elf64_size_dynamic_sections - PARAMS ((bfd *, const char *, const char *, boolean, - struct bfd_link_info *, struct sec **)); -extern void bfd_elf_set_dt_needed_name PARAMS ((bfd *, const char *)); -extern const char *bfd_elf_get_dt_soname PARAMS ((bfd *)); - -/* SunOS shared library support routines for the linker. */ - -extern struct bfd_link_needed_list *bfd_sunos_get_needed_list - PARAMS ((bfd *, struct bfd_link_info *)); -extern boolean bfd_sunos_record_link_assignment - PARAMS ((bfd *, struct bfd_link_info *, const char *)); -extern boolean bfd_sunos_size_dynamic_sections - PARAMS ((bfd *, struct bfd_link_info *, struct sec **, struct sec **, - struct sec **)); - -/* Linux shared library support routines for the linker. */ - -extern boolean bfd_i386linux_size_dynamic_sections - PARAMS ((bfd *, struct bfd_link_info *)); -extern boolean bfd_m68klinux_size_dynamic_sections - PARAMS ((bfd *, struct bfd_link_info *)); - -/* mmap hacks */ - -struct _bfd_window_internal; -typedef struct _bfd_window_internal bfd_window_internal; - -typedef struct _bfd_window { - /* What the user asked for. */ - PTR data; - bfd_size_type size; - /* The actual window used by BFD. Small user-requested read-only - regions sharing a page may share a single window into the object - file. Read-write versions shouldn't until I've fixed things to - keep track of which portions have been claimed by the - application; don't want to give the same region back when the - application wants two writable copies! */ - struct _bfd_window_internal *i; -} bfd_window; - -extern void bfd_init_window PARAMS ((bfd_window *)); -extern void bfd_free_window PARAMS ((bfd_window *)); -extern boolean bfd_get_file_window - PARAMS ((bfd *, file_ptr, bfd_size_type, bfd_window *, boolean)); - -/* XCOFF support routines for the linker. */ - -extern boolean bfd_xcoff_link_record_set - PARAMS ((bfd *, struct bfd_link_info *, struct bfd_link_hash_entry *, - bfd_size_type)); -extern boolean bfd_xcoff_import_symbol - PARAMS ((bfd *, struct bfd_link_info *, struct bfd_link_hash_entry *, - bfd_vma, const char *, const char *, const char *)); -extern boolean bfd_xcoff_export_symbol - PARAMS ((bfd *, struct bfd_link_info *, struct bfd_link_hash_entry *, - boolean)); -extern boolean bfd_xcoff_link_count_reloc - PARAMS ((bfd *, struct bfd_link_info *, const char *)); -extern boolean bfd_xcoff_record_link_assignment - PARAMS ((bfd *, struct bfd_link_info *, const char *)); -extern boolean bfd_xcoff_size_dynamic_sections - PARAMS ((bfd *, struct bfd_link_info *, const char *, const char *, - unsigned long, unsigned long, unsigned long, boolean, - int, boolean, boolean, struct sec **)); - -/* And more from the source. */ -void -bfd_init PARAMS ((void)); - -bfd * -bfd_openr PARAMS ((CONST char *filename, CONST char *target)); - -bfd * -bfd_fdopenr PARAMS ((CONST char *filename, CONST char *target, int fd)); - -bfd * -bfd_openstreamr PARAMS (()); - -bfd * -bfd_openw PARAMS ((CONST char *filename, CONST char *target)); - -boolean -bfd_close PARAMS ((bfd *abfd)); - -boolean -bfd_close_all_done PARAMS ((bfd *)); - -bfd_size_type -bfd_alloc_size PARAMS ((bfd *abfd)); - -bfd * -bfd_create PARAMS ((CONST char *filename, bfd *templ)); - - - /* Byte swapping macros for user section data. */ - -#define bfd_put_8(abfd, val, ptr) \ - (*((unsigned char *)(ptr)) = (unsigned char)(val)) -#define bfd_put_signed_8 \ - bfd_put_8 -#define bfd_get_8(abfd, ptr) \ - (*(unsigned char *)(ptr)) -#define bfd_get_signed_8(abfd, ptr) \ - ((*(unsigned char *)(ptr) ^ 0x80) - 0x80) - -#define bfd_put_16(abfd, val, ptr) \ - BFD_SEND(abfd, bfd_putx16, ((val),(ptr))) -#define bfd_put_signed_16 \ - bfd_put_16 -#define bfd_get_16(abfd, ptr) \ - BFD_SEND(abfd, bfd_getx16, (ptr)) -#define bfd_get_signed_16(abfd, ptr) \ - BFD_SEND (abfd, bfd_getx_signed_16, (ptr)) - -#define bfd_put_32(abfd, val, ptr) \ - BFD_SEND(abfd, bfd_putx32, ((val),(ptr))) -#define bfd_put_signed_32 \ - bfd_put_32 -#define bfd_get_32(abfd, ptr) \ - BFD_SEND(abfd, bfd_getx32, (ptr)) -#define bfd_get_signed_32(abfd, ptr) \ - BFD_SEND(abfd, bfd_getx_signed_32, (ptr)) - -#define bfd_put_64(abfd, val, ptr) \ - BFD_SEND(abfd, bfd_putx64, ((val), (ptr))) -#define bfd_put_signed_64 \ - bfd_put_64 -#define bfd_get_64(abfd, ptr) \ - BFD_SEND(abfd, bfd_getx64, (ptr)) -#define bfd_get_signed_64(abfd, ptr) \ - BFD_SEND(abfd, bfd_getx_signed_64, (ptr)) - - - /* Byte swapping macros for file header data. */ - -#define bfd_h_put_8(abfd, val, ptr) \ - bfd_put_8 (abfd, val, ptr) -#define bfd_h_put_signed_8(abfd, val, ptr) \ - bfd_put_8 (abfd, val, ptr) -#define bfd_h_get_8(abfd, ptr) \ - bfd_get_8 (abfd, ptr) -#define bfd_h_get_signed_8(abfd, ptr) \ - bfd_get_signed_8 (abfd, ptr) - -#define bfd_h_put_16(abfd, val, ptr) \ - BFD_SEND(abfd, bfd_h_putx16,(val,ptr)) -#define bfd_h_put_signed_16 \ - bfd_h_put_16 -#define bfd_h_get_16(abfd, ptr) \ - BFD_SEND(abfd, bfd_h_getx16,(ptr)) -#define bfd_h_get_signed_16(abfd, ptr) \ - BFD_SEND(abfd, bfd_h_getx_signed_16, (ptr)) - -#define bfd_h_put_32(abfd, val, ptr) \ - BFD_SEND(abfd, bfd_h_putx32,(val,ptr)) -#define bfd_h_put_signed_32 \ - bfd_h_put_32 -#define bfd_h_get_32(abfd, ptr) \ - BFD_SEND(abfd, bfd_h_getx32,(ptr)) -#define bfd_h_get_signed_32(abfd, ptr) \ - BFD_SEND(abfd, bfd_h_getx_signed_32, (ptr)) - -#define bfd_h_put_64(abfd, val, ptr) \ - BFD_SEND(abfd, bfd_h_putx64,(val, ptr)) -#define bfd_h_put_signed_64 \ - bfd_h_put_64 -#define bfd_h_get_64(abfd, ptr) \ - BFD_SEND(abfd, bfd_h_getx64,(ptr)) -#define bfd_h_get_signed_64(abfd, ptr) \ - BFD_SEND(abfd, bfd_h_getx_signed_64, (ptr)) - -typedef struct sec -{ - /* The name of the section; the name isn't a copy, the pointer is - the same as that passed to bfd_make_section. */ - - CONST char *name; - - /* Which section is it; 0..nth. */ - - int index; - - /* The next section in the list belonging to the BFD, or NULL. */ - - struct sec *next; - - /* The field flags contains attributes of the section. Some - flags are read in from the object file, and some are - synthesized from other information. */ - - flagword flags; - -#define SEC_NO_FLAGS 0x000 - - /* Tells the OS to allocate space for this section when loading. - This is clear for a section containing debug information - only. */ -#define SEC_ALLOC 0x001 - - /* Tells the OS to load the section from the file when loading. - This is clear for a .bss section. */ -#define SEC_LOAD 0x002 - - /* The section contains data still to be relocated, so there is - some relocation information too. */ -#define SEC_RELOC 0x004 - -#if 0 /* Obsolete ? */ -#define SEC_BALIGN 0x008 -#endif - - /* A signal to the OS that the section contains read only - data. */ -#define SEC_READONLY 0x010 - - /* The section contains code only. */ -#define SEC_CODE 0x020 - - /* The section contains data only. */ -#define SEC_DATA 0x040 - - /* The section will reside in ROM. */ -#define SEC_ROM 0x080 - - /* The section contains constructor information. This section - type is used by the linker to create lists of constructors and - destructors used by <<g++>>. When a back end sees a symbol - which should be used in a constructor list, it creates a new - section for the type of name (e.g., <<__CTOR_LIST__>>), attaches - the symbol to it, and builds a relocation. To build the lists - of constructors, all the linker has to do is catenate all the - sections called <<__CTOR_LIST__>> and relocate the data - contained within - exactly the operations it would peform on - standard data. */ -#define SEC_CONSTRUCTOR 0x100 - - /* The section is a constuctor, and should be placed at the - end of the text, data, or bss section(?). */ -#define SEC_CONSTRUCTOR_TEXT 0x1100 -#define SEC_CONSTRUCTOR_DATA 0x2100 -#define SEC_CONSTRUCTOR_BSS 0x3100 - - /* The section has contents - a data section could be - <<SEC_ALLOC>> | <<SEC_HAS_CONTENTS>>; a debug section could be - <<SEC_HAS_CONTENTS>> */ -#define SEC_HAS_CONTENTS 0x200 - - /* An instruction to the linker to not output the section - even if it has information which would normally be written. */ -#define SEC_NEVER_LOAD 0x400 - - /* The section is a COFF shared library section. This flag is - only for the linker. If this type of section appears in - the input file, the linker must copy it to the output file - without changing the vma or size. FIXME: Although this - was originally intended to be general, it really is COFF - specific (and the flag was renamed to indicate this). It - might be cleaner to have some more general mechanism to - allow the back end to control what the linker does with - sections. */ -#define SEC_COFF_SHARED_LIBRARY 0x800 - - /* The section is a common section (symbols may be defined - multiple times, the value of a symbol is the amount of - space it requires, and the largest symbol value is the one - used). Most targets have exactly one of these (which we - translate to bfd_com_section_ptr), but ECOFF has two. */ -#define SEC_IS_COMMON 0x8000 - - /* The section contains only debugging information. For - example, this is set for ELF .debug and .stab sections. - strip tests this flag to see if a section can be - discarded. */ -#define SEC_DEBUGGING 0x10000 - - /* The contents of this section are held in memory pointed to - by the contents field. This is checked by - bfd_get_section_contents, and the data is retrieved from - memory if appropriate. */ -#define SEC_IN_MEMORY 0x20000 - - /* The contents of this section are to be excluded by the - linker for executable and shared objects unless those - objects are to be further relocated. */ -#define SEC_EXCLUDE 0x40000 - - /* The contents of this section are to be sorted by the - based on the address specified in the associated symbol - table. */ -#define SEC_SORT_ENTRIES 0x80000 - - /* End of section flags. */ - - /* The virtual memory address of the section - where it will be - at run time. The symbols are relocated against this. The - user_set_vma flag is maintained by bfd; if it's not set, the - backend can assign addresses (for example, in <<a.out>>, where - the default address for <<.data>> is dependent on the specific - target and various flags). */ - - bfd_vma vma; - boolean user_set_vma; - - /* The load address of the section - where it would be in a - rom image; really only used for writing section header - information. */ - - bfd_vma lma; - - /* The size of the section in bytes, as it will be output. - contains a value even if the section has no contents (e.g., the - size of <<.bss>>). This will be filled in after relocation */ - - bfd_size_type _cooked_size; - - /* The original size on disk of the section, in bytes. Normally this - value is the same as the size, but if some relaxing has - been done, then this value will be bigger. */ - - bfd_size_type _raw_size; - - /* If this section is going to be output, then this value is the - offset into the output section of the first byte in the input - section. E.g., if this was going to start at the 100th byte in - the output section, this value would be 100. */ - - bfd_vma output_offset; - - /* The output section through which to map on output. */ - - struct sec *output_section; - - /* The alignment requirement of the section, as an exponent of 2 - - e.g., 3 aligns to 2^3 (or 8). */ - - unsigned int alignment_power; - - /* If an input section, a pointer to a vector of relocation - records for the data in this section. */ - - struct reloc_cache_entry *relocation; - - /* If an output section, a pointer to a vector of pointers to - relocation records for the data in this section. */ - - struct reloc_cache_entry **orelocation; - - /* The number of relocation records in one of the above */ - - unsigned reloc_count; - - /* Information below is back end specific - and not always used - or updated. */ - - /* File position of section data */ - - file_ptr filepos; - - /* File position of relocation info */ - - file_ptr rel_filepos; - - /* File position of line data */ - - file_ptr line_filepos; - - /* Pointer to data for applications */ - - PTR userdata; - - /* If the SEC_IN_MEMORY flag is set, this points to the actual - contents. */ - unsigned char *contents; - - /* Attached line number information */ - - alent *lineno; - - /* Number of line number records */ - - unsigned int lineno_count; - - /* When a section is being output, this value changes as more - linenumbers are written out */ - - file_ptr moving_line_filepos; - - /* What the section number is in the target world */ - - int target_index; - - PTR used_by_bfd; - - /* If this is a constructor section then here is a list of the - relocations created to relocate items within it. */ - - struct relent_chain *constructor_chain; - - /* The BFD which owns the section. */ - - bfd *owner; - - boolean reloc_done; - /* A symbol which points at this section only */ - struct symbol_cache_entry *symbol; - struct symbol_cache_entry **symbol_ptr_ptr; - - struct bfd_link_order *link_order_head; - struct bfd_link_order *link_order_tail; -} asection ; - - /* These sections are global, and are managed by BFD. The application - and target back end are not permitted to change the values in - these sections. New code should use the section_ptr macros rather - than referring directly to the const sections. The const sections - may eventually vanish. */ -#define BFD_ABS_SECTION_NAME "*ABS*" -#define BFD_UND_SECTION_NAME "*UND*" -#define BFD_COM_SECTION_NAME "*COM*" -#define BFD_IND_SECTION_NAME "*IND*" - - /* the absolute section */ -extern const asection bfd_abs_section; -#define bfd_abs_section_ptr ((asection *) &bfd_abs_section) -#define bfd_is_abs_section(sec) ((sec) == bfd_abs_section_ptr) - /* Pointer to the undefined section */ -extern const asection bfd_und_section; -#define bfd_und_section_ptr ((asection *) &bfd_und_section) -#define bfd_is_und_section(sec) ((sec) == bfd_und_section_ptr) - /* Pointer to the common section */ -extern const asection bfd_com_section; -#define bfd_com_section_ptr ((asection *) &bfd_com_section) - /* Pointer to the indirect section */ -extern const asection bfd_ind_section; -#define bfd_ind_section_ptr ((asection *) &bfd_ind_section) -#define bfd_is_ind_section(sec) ((sec) == bfd_ind_section_ptr) - -extern const struct symbol_cache_entry * const bfd_abs_symbol; -extern const struct symbol_cache_entry * const bfd_com_symbol; -extern const struct symbol_cache_entry * const bfd_und_symbol; -extern const struct symbol_cache_entry * const bfd_ind_symbol; -#define bfd_get_section_size_before_reloc(section) \ - (section->reloc_done ? (abort(),1): (section)->_raw_size) -#define bfd_get_section_size_after_reloc(section) \ - ((section->reloc_done) ? (section)->_cooked_size: (abort(),1)) -asection * -bfd_get_section_by_name PARAMS ((bfd *abfd, CONST char *name)); - -asection * -bfd_make_section_old_way PARAMS ((bfd *abfd, CONST char *name)); - -asection * -bfd_make_section_anyway PARAMS ((bfd *abfd, CONST char *name)); - -asection * -bfd_make_section PARAMS ((bfd *, CONST char *name)); - -boolean -bfd_set_section_flags PARAMS ((bfd *abfd, asection *sec, flagword flags)); - -void -bfd_map_over_sections PARAMS ((bfd *abfd, - void (*func)(bfd *abfd, - asection *sect, - PTR obj), - PTR obj)); - -boolean -bfd_set_section_size PARAMS ((bfd *abfd, asection *sec, bfd_size_type val)); - -boolean -bfd_set_section_contents - PARAMS ((bfd *abfd, - asection *section, - PTR data, - file_ptr offset, - bfd_size_type count)); - -boolean -bfd_get_section_contents - PARAMS ((bfd *abfd, asection *section, PTR location, - file_ptr offset, bfd_size_type count)); - -boolean -bfd_copy_private_section_data PARAMS ((bfd *ibfd, asection *isec, bfd *obfd, asection *osec)); - -#define bfd_copy_private_section_data(ibfd, isection, obfd, osection) \ - BFD_SEND (ibfd, _bfd_copy_private_section_data, \ - (ibfd, isection, obfd, osection)) -enum bfd_architecture -{ - bfd_arch_unknown, /* File arch not known */ - bfd_arch_obscure, /* Arch known, not one of these */ - bfd_arch_m68k, /* Motorola 68xxx */ - bfd_arch_vax, /* DEC Vax */ - bfd_arch_i960, /* Intel 960 */ - /* The order of the following is important. - lower number indicates a machine type that - only accepts a subset of the instructions - available to machines with higher numbers. - The exception is the "ca", which is - incompatible with all other machines except - "core". */ - -#define bfd_mach_i960_core 1 -#define bfd_mach_i960_ka_sa 2 -#define bfd_mach_i960_kb_sb 3 -#define bfd_mach_i960_mc 4 -#define bfd_mach_i960_xa 5 -#define bfd_mach_i960_ca 6 -#define bfd_mach_i960_jx 7 -#define bfd_mach_i960_hx 8 - - bfd_arch_a29k, /* AMD 29000 */ - bfd_arch_sparc, /* SPARC */ -#define bfd_mach_sparc 1 - /* The difference between v8plus and v9 is that v9 is a true 64 bit env. */ -#define bfd_mach_sparc_v8plus 2 -#define bfd_mach_sparc_v8plusa 3 /* with ultrasparc add'ns */ -#define bfd_mach_sparc_v9 4 -#define bfd_mach_sparc_v9a 5 /* with ultrasparc add'ns */ - /* Nonzero if MACH has the v9 instruction set. */ -#define bfd_mach_sparc_v9_p(mach) ((mach) != bfd_mach_sparc) - bfd_arch_mips, /* MIPS Rxxxx */ - bfd_arch_i386, /* Intel 386 */ - bfd_arch_we32k, /* AT&T WE32xxx */ - bfd_arch_tahoe, /* CCI/Harris Tahoe */ - bfd_arch_i860, /* Intel 860 */ - bfd_arch_romp, /* IBM ROMP PC/RT */ - bfd_arch_alliant, /* Alliant */ - bfd_arch_convex, /* Convex */ - bfd_arch_m88k, /* Motorola 88xxx */ - bfd_arch_pyramid, /* Pyramid Technology */ - bfd_arch_h8300, /* Hitachi H8/300 */ -#define bfd_mach_h8300 1 -#define bfd_mach_h8300h 2 - bfd_arch_powerpc, /* PowerPC */ - bfd_arch_rs6000, /* IBM RS/6000 */ - bfd_arch_hppa, /* HP PA RISC */ - bfd_arch_z8k, /* Zilog Z8000 */ -#define bfd_mach_z8001 1 -#define bfd_mach_z8002 2 - bfd_arch_h8500, /* Hitachi H8/500 */ - bfd_arch_sh, /* Hitachi SH */ - bfd_arch_alpha, /* Dec Alpha */ - bfd_arch_arm, /* Advanced Risc Machines ARM */ - bfd_arch_ns32k, /* National Semiconductors ns32000 */ - bfd_arch_w65, /* WDC 65816 */ - bfd_arch_last - }; - -typedef struct bfd_arch_info -{ - int bits_per_word; - int bits_per_address; - int bits_per_byte; - enum bfd_architecture arch; - unsigned long mach; - const char *arch_name; - const char *printable_name; - unsigned int section_align_power; - /* true if this is the default machine for the architecture */ - boolean the_default; - const struct bfd_arch_info * (*compatible) - PARAMS ((const struct bfd_arch_info *a, - const struct bfd_arch_info *b)); - - boolean (*scan) PARAMS ((const struct bfd_arch_info *, const char *)); - - const struct bfd_arch_info *next; -} bfd_arch_info_type; -const char * -bfd_printable_name PARAMS ((bfd *abfd)); - -const bfd_arch_info_type * -bfd_scan_arch PARAMS ((const char *string)); - -const bfd_arch_info_type * -bfd_arch_get_compatible PARAMS (( - const bfd *abfd, - const bfd *bbfd)); - -void -bfd_set_arch_info PARAMS ((bfd *abfd, const bfd_arch_info_type *arg)); - -enum bfd_architecture -bfd_get_arch PARAMS ((bfd *abfd)); - -unsigned long -bfd_get_mach PARAMS ((bfd *abfd)); - -unsigned int -bfd_arch_bits_per_byte PARAMS ((bfd *abfd)); - -unsigned int -bfd_arch_bits_per_address PARAMS ((bfd *abfd)); - -const bfd_arch_info_type * -bfd_get_arch_info PARAMS ((bfd *abfd)); - -const bfd_arch_info_type * -bfd_lookup_arch - PARAMS ((enum bfd_architecture - arch, - unsigned long machine)); - -const char * -bfd_printable_arch_mach - PARAMS ((enum bfd_architecture arch, unsigned long machine)); - -typedef enum bfd_reloc_status -{ - /* No errors detected */ - bfd_reloc_ok, - - /* The relocation was performed, but there was an overflow. */ - bfd_reloc_overflow, - - /* The address to relocate was not within the section supplied. */ - bfd_reloc_outofrange, - - /* Used by special functions */ - bfd_reloc_continue, - - /* Unsupported relocation size requested. */ - bfd_reloc_notsupported, - - /* Unused */ - bfd_reloc_other, - - /* The symbol to relocate against was undefined. */ - bfd_reloc_undefined, - - /* The relocation was performed, but may not be ok - presently - generated only when linking i960 coff files with i960 b.out - symbols. If this type is returned, the error_message argument - to bfd_perform_relocation will be set. */ - bfd_reloc_dangerous - } - bfd_reloc_status_type; - - -typedef struct reloc_cache_entry -{ - /* A pointer into the canonical table of pointers */ - struct symbol_cache_entry **sym_ptr_ptr; - - /* offset in section */ - bfd_size_type address; - - /* addend for relocation value */ - bfd_vma addend; - - /* Pointer to how to perform the required relocation */ - reloc_howto_type *howto; - -} arelent; -enum complain_overflow -{ - /* Do not complain on overflow. */ - complain_overflow_dont, - - /* Complain if the bitfield overflows, whether it is considered - as signed or unsigned. */ - complain_overflow_bitfield, - - /* Complain if the value overflows when considered as signed - number. */ - complain_overflow_signed, - - /* Complain if the value overflows when considered as an - unsigned number. */ - complain_overflow_unsigned -}; - -struct reloc_howto_struct -{ - /* The type field has mainly a documetary use - the back end can - do what it wants with it, though normally the back end's - external idea of what a reloc number is stored - in this field. For example, a PC relative word relocation - in a coff environment has the type 023 - because that's - what the outside world calls a R_PCRWORD reloc. */ - unsigned int type; - - /* The value the final relocation is shifted right by. This drops - unwanted data from the relocation. */ - unsigned int rightshift; - - /* The size of the item to be relocated. This is *not* a - power-of-two measure. To get the number of bytes operated - on by a type of relocation, use bfd_get_reloc_size. */ - int size; - - /* The number of bits in the item to be relocated. This is used - when doing overflow checking. */ - unsigned int bitsize; - - /* Notes that the relocation is relative to the location in the - data section of the addend. The relocation function will - subtract from the relocation value the address of the location - being relocated. */ - boolean pc_relative; - - /* The bit position of the reloc value in the destination. - The relocated value is left shifted by this amount. */ - unsigned int bitpos; - - /* What type of overflow error should be checked for when - relocating. */ - enum complain_overflow complain_on_overflow; - - /* If this field is non null, then the supplied function is - called rather than the normal function. This allows really - strange relocation methods to be accomodated (e.g., i960 callj - instructions). */ - bfd_reloc_status_type (*special_function) - PARAMS ((bfd *abfd, - arelent *reloc_entry, - struct symbol_cache_entry *symbol, - PTR data, - asection *input_section, - bfd *output_bfd, - char **error_message)); - - /* The textual name of the relocation type. */ - char *name; - - /* When performing a partial link, some formats must modify the - relocations rather than the data - this flag signals this.*/ - boolean partial_inplace; - - /* The src_mask selects which parts of the read in data - are to be used in the relocation sum. E.g., if this was an 8 bit - bit of data which we read and relocated, this would be - 0x000000ff. When we have relocs which have an addend, such as - sun4 extended relocs, the value in the offset part of a - relocating field is garbage so we never use it. In this case - the mask would be 0x00000000. */ - bfd_vma src_mask; - - /* The dst_mask selects which parts of the instruction are replaced - into the instruction. In most cases src_mask == dst_mask, - except in the above special case, where dst_mask would be - 0x000000ff, and src_mask would be 0x00000000. */ - bfd_vma dst_mask; - - /* When some formats create PC relative instructions, they leave - the value of the pc of the place being relocated in the offset - slot of the instruction, so that a PC relative relocation can - be made just by adding in an ordinary offset (e.g., sun3 a.out). - Some formats leave the displacement part of an instruction - empty (e.g., m88k bcs); this flag signals the fact.*/ - boolean pcrel_offset; - -}; -#define HOWTO(C, R,S,B, P, BI, O, SF, NAME, INPLACE, MASKSRC, MASKDST, PC) \ - {(unsigned)C,R,S,B, P, BI, O,SF,NAME,INPLACE,MASKSRC,MASKDST,PC} -#define NEWHOWTO( FUNCTION, NAME,SIZE,REL,IN) HOWTO(0,0,SIZE,0,REL,0,complain_overflow_dont,FUNCTION, NAME,false,0,0,IN) - -#define HOWTO_PREPARE(relocation, symbol) \ - { \ - if (symbol != (asymbol *)NULL) { \ - if (bfd_is_com_section (symbol->section)) { \ - relocation = 0; \ - } \ - else { \ - relocation = symbol->value; \ - } \ - } \ -} -int -bfd_get_reloc_size PARAMS ((reloc_howto_type *)); - -typedef struct relent_chain { - arelent relent; - struct relent_chain *next; -} arelent_chain; -bfd_reloc_status_type - -bfd_perform_relocation - PARAMS ((bfd *abfd, - arelent *reloc_entry, - PTR data, - asection *input_section, - bfd *output_bfd, - char **error_message)); - -bfd_reloc_status_type - -bfd_install_relocation - PARAMS ((bfd *abfd, - arelent *reloc_entry, - PTR data, bfd_vma data_start, - asection *input_section, - char **error_message)); - -enum bfd_reloc_code_real { - _dummy_first_bfd_reloc_code_real, - - -/* Basic absolute relocations of N bits. */ - BFD_RELOC_64, - BFD_RELOC_32, - BFD_RELOC_26, - BFD_RELOC_16, - BFD_RELOC_14, - BFD_RELOC_8, - -/* PC-relative relocations. Sometimes these are relative to the address -of the relocation itself; sometimes they are relative to the start of -the section containing the relocation. It depends on the specific target. - -The 24-bit relocation is used in some Intel 960 configurations. */ - BFD_RELOC_64_PCREL, - BFD_RELOC_32_PCREL, - BFD_RELOC_24_PCREL, - BFD_RELOC_16_PCREL, - BFD_RELOC_12_PCREL, - BFD_RELOC_8_PCREL, - -/* For ELF. */ - BFD_RELOC_32_GOT_PCREL, - BFD_RELOC_16_GOT_PCREL, - BFD_RELOC_8_GOT_PCREL, - BFD_RELOC_32_GOTOFF, - BFD_RELOC_16_GOTOFF, - BFD_RELOC_LO16_GOTOFF, - BFD_RELOC_HI16_GOTOFF, - BFD_RELOC_HI16_S_GOTOFF, - BFD_RELOC_8_GOTOFF, - BFD_RELOC_32_PLT_PCREL, - BFD_RELOC_24_PLT_PCREL, - BFD_RELOC_16_PLT_PCREL, - BFD_RELOC_8_PLT_PCREL, - BFD_RELOC_32_PLTOFF, - BFD_RELOC_16_PLTOFF, - BFD_RELOC_LO16_PLTOFF, - BFD_RELOC_HI16_PLTOFF, - BFD_RELOC_HI16_S_PLTOFF, - BFD_RELOC_8_PLTOFF, - -/* Relocations used by 68K ELF. */ - BFD_RELOC_68K_GLOB_DAT, - BFD_RELOC_68K_JMP_SLOT, - BFD_RELOC_68K_RELATIVE, - -/* Linkage-table relative. */ - BFD_RELOC_32_BASEREL, - BFD_RELOC_16_BASEREL, - BFD_RELOC_LO16_BASEREL, - BFD_RELOC_HI16_BASEREL, - BFD_RELOC_HI16_S_BASEREL, - BFD_RELOC_8_BASEREL, - BFD_RELOC_RVA, - -/* Absolute 8-bit relocation, but used to form an address like 0xFFnn. */ - BFD_RELOC_8_FFnn, - -/* These PC-relative relocations are stored as word displacements -- -i.e., byte displacements shifted right two bits. The 30-bit word -displacement (<<32_PCREL_S2>> -- 32 bits, shifted 2) is used on the -SPARC. (SPARC tools generally refer to this as <<WDISP30>>.) The -signed 16-bit displacement is used on the MIPS, and the 23-bit -displacement is used on the Alpha. */ - BFD_RELOC_32_PCREL_S2, - BFD_RELOC_16_PCREL_S2, - BFD_RELOC_23_PCREL_S2, - -/* High 22 bits and low 10 bits of 32-bit value, placed into lower bits of -the target word. These are used on the SPARC. */ - BFD_RELOC_HI22, - BFD_RELOC_LO10, - -/* For systems that allocate a Global Pointer register, these are -displacements off that register. These relocation types are -handled specially, because the value the register will have is -decided relatively late. */ - BFD_RELOC_GPREL16, - BFD_RELOC_GPREL32, - -/* Reloc types used for i960/b.out. */ - BFD_RELOC_I960_CALLJ, - -/* SPARC ELF relocations. There is probably some overlap with other -relocation types already defined. */ - BFD_RELOC_NONE, - BFD_RELOC_SPARC_WDISP22, - BFD_RELOC_SPARC22, - BFD_RELOC_SPARC13, - BFD_RELOC_SPARC_GOT10, - BFD_RELOC_SPARC_GOT13, - BFD_RELOC_SPARC_GOT22, - BFD_RELOC_SPARC_PC10, - BFD_RELOC_SPARC_PC22, - BFD_RELOC_SPARC_WPLT30, - BFD_RELOC_SPARC_COPY, - BFD_RELOC_SPARC_GLOB_DAT, - BFD_RELOC_SPARC_JMP_SLOT, - BFD_RELOC_SPARC_RELATIVE, - BFD_RELOC_SPARC_UA32, - -/* I think these are specific to SPARC a.out (e.g., Sun 4). */ - BFD_RELOC_SPARC_BASE13, - BFD_RELOC_SPARC_BASE22, - -/* Some relocations we're using for SPARC V9 -- subject to change. */ -#define BFD_RELOC_SPARC_64 BFD_RELOC_64 - BFD_RELOC_SPARC_10, - BFD_RELOC_SPARC_11, - BFD_RELOC_SPARC_OLO10, - BFD_RELOC_SPARC_HH22, - BFD_RELOC_SPARC_HM10, - BFD_RELOC_SPARC_LM22, - BFD_RELOC_SPARC_PC_HH22, - BFD_RELOC_SPARC_PC_HM10, - BFD_RELOC_SPARC_PC_LM22, - BFD_RELOC_SPARC_WDISP16, - BFD_RELOC_SPARC_WDISP19, - BFD_RELOC_SPARC_GLOB_JMP, - BFD_RELOC_SPARC_7, - BFD_RELOC_SPARC_6, - BFD_RELOC_SPARC_5, - -/* Alpha ECOFF relocations. Some of these treat the symbol or "addend" -in some special way. -For GPDISP_HI16 ("gpdisp") relocations, the symbol is ignored when -writing; when reading, it will be the absolute section symbol. The -addend is the displacement in bytes of the "lda" instruction from -the "ldah" instruction (which is at the address of this reloc). */ - BFD_RELOC_ALPHA_GPDISP_HI16, - -/* For GPDISP_LO16 ("ignore") relocations, the symbol is handled as -with GPDISP_HI16 relocs. The addend is ignored when writing the -relocations out, and is filled in with the file's GP value on -reading, for convenience. */ - BFD_RELOC_ALPHA_GPDISP_LO16, - -/* The Alpha LITERAL/LITUSE relocs are produced by a symbol reference; -the assembler turns it into a LDQ instruction to load the address of -the symbol, and then fills in a register in the real instruction. - -The LITERAL reloc, at the LDQ instruction, refers to the .lita -section symbol. The addend is ignored when writing, but is filled -in with the file's GP value on reading, for convenience, as with the -GPDISP_LO16 reloc. - -The LITUSE reloc, on the instruction using the loaded address, gives -information to the linker that it might be able to use to optimize -away some literal section references. The symbol is ignored (read -as the absolute section symbol), and the "addend" indicates the type -of instruction using the register: -1 - "memory" fmt insn -2 - byte-manipulation (byte offset reg) -3 - jsr (target of branch) - -The GNU linker currently doesn't do any of this optimizing. */ - BFD_RELOC_ALPHA_LITERAL, - BFD_RELOC_ALPHA_LITUSE, - -/* The HINT relocation indicates a value that should be filled into the -"hint" field of a jmp/jsr/ret instruction, for possible branch- -prediction logic which may be provided on some processors. */ - BFD_RELOC_ALPHA_HINT, - -/* Bits 27..2 of the relocation address shifted right 2 bits; -simple reloc otherwise. */ - BFD_RELOC_MIPS_JMP, - -/* High 16 bits of 32-bit value; simple reloc. */ - BFD_RELOC_HI16, - -/* High 16 bits of 32-bit value but the low 16 bits will be sign -extended and added to form the final result. If the low 16 -bits form a negative number, we need to add one to the high value -to compensate for the borrow when the low bits are added. */ - BFD_RELOC_HI16_S, - -/* Low 16 bits. */ - BFD_RELOC_LO16, - -/* Like BFD_RELOC_HI16_S, but PC relative. */ - BFD_RELOC_PCREL_HI16_S, - -/* Like BFD_RELOC_LO16, but PC relative. */ - BFD_RELOC_PCREL_LO16, - -/* Relocation relative to the global pointer. */ -#define BFD_RELOC_MIPS_GPREL BFD_RELOC_GPREL16 - -/* Relocation against a MIPS literal section. */ - BFD_RELOC_MIPS_LITERAL, - -/* MIPS ELF relocations. */ - BFD_RELOC_MIPS_GOT16, - BFD_RELOC_MIPS_CALL16, -#define BFD_RELOC_MIPS_GPREL32 BFD_RELOC_GPREL32 - BFD_RELOC_MIPS_GOT_HI16, - BFD_RELOC_MIPS_GOT_LO16, - BFD_RELOC_MIPS_CALL_HI16, - BFD_RELOC_MIPS_CALL_LO16, - -/* i386/elf relocations */ - BFD_RELOC_386_GOT32, - BFD_RELOC_386_PLT32, - BFD_RELOC_386_COPY, - BFD_RELOC_386_GLOB_DAT, - BFD_RELOC_386_JUMP_SLOT, - BFD_RELOC_386_RELATIVE, - BFD_RELOC_386_GOTOFF, - BFD_RELOC_386_GOTPC, - -/* ns32k relocations */ - BFD_RELOC_NS32K_IMM_8, - BFD_RELOC_NS32K_IMM_16, - BFD_RELOC_NS32K_IMM_32, - BFD_RELOC_NS32K_IMM_8_PCREL, - BFD_RELOC_NS32K_IMM_16_PCREL, - BFD_RELOC_NS32K_IMM_32_PCREL, - BFD_RELOC_NS32K_DISP_8, - BFD_RELOC_NS32K_DISP_16, - BFD_RELOC_NS32K_DISP_32, - BFD_RELOC_NS32K_DISP_8_PCREL, - BFD_RELOC_NS32K_DISP_16_PCREL, - BFD_RELOC_NS32K_DISP_32_PCREL, - -/* Power(rs6000) and PowerPC relocations. */ - BFD_RELOC_PPC_B26, - BFD_RELOC_PPC_BA26, - BFD_RELOC_PPC_TOC16, - BFD_RELOC_PPC_B16, - BFD_RELOC_PPC_B16_BRTAKEN, - BFD_RELOC_PPC_B16_BRNTAKEN, - BFD_RELOC_PPC_BA16, - BFD_RELOC_PPC_BA16_BRTAKEN, - BFD_RELOC_PPC_BA16_BRNTAKEN, - BFD_RELOC_PPC_COPY, - BFD_RELOC_PPC_GLOB_DAT, - BFD_RELOC_PPC_JMP_SLOT, - BFD_RELOC_PPC_RELATIVE, - BFD_RELOC_PPC_LOCAL24PC, - BFD_RELOC_PPC_EMB_NADDR32, - BFD_RELOC_PPC_EMB_NADDR16, - BFD_RELOC_PPC_EMB_NADDR16_LO, - BFD_RELOC_PPC_EMB_NADDR16_HI, - BFD_RELOC_PPC_EMB_NADDR16_HA, - BFD_RELOC_PPC_EMB_SDAI16, - BFD_RELOC_PPC_EMB_SDA2I16, - BFD_RELOC_PPC_EMB_SDA2REL, - BFD_RELOC_PPC_EMB_SDA21, - BFD_RELOC_PPC_EMB_MRKREF, - BFD_RELOC_PPC_EMB_RELSEC16, - BFD_RELOC_PPC_EMB_RELST_LO, - BFD_RELOC_PPC_EMB_RELST_HI, - BFD_RELOC_PPC_EMB_RELST_HA, - BFD_RELOC_PPC_EMB_BIT_FLD, - BFD_RELOC_PPC_EMB_RELSDA, - -/* The type of reloc used to build a contructor table - at the moment -probably a 32 bit wide absolute relocation, but the target can choose. -It generally does map to one of the other relocation types. */ - BFD_RELOC_CTOR, - -/* ARM 26 bit pc-relative branch. The lowest two bits must be zero and are -not stored in the instruction. */ - BFD_RELOC_ARM_PCREL_BRANCH, - -/* These relocs are only used within the ARM assembler. They are not -(at present) written to any object files. */ - BFD_RELOC_ARM_IMMEDIATE, - BFD_RELOC_ARM_OFFSET_IMM, - BFD_RELOC_ARM_SHIFT_IMM, - BFD_RELOC_ARM_SWI, - BFD_RELOC_ARM_MULTI, - BFD_RELOC_ARM_CP_OFF_IMM, - BFD_RELOC_ARM_ADR_IMM, - BFD_RELOC_ARM_LDR_IMM, - BFD_RELOC_ARM_LITERAL, - BFD_RELOC_ARM_IN_POOL, - BFD_RELOC_UNUSED }; -typedef enum bfd_reloc_code_real bfd_reloc_code_real_type; -reloc_howto_type * - -bfd_reloc_type_lookup PARAMS ((bfd *abfd, bfd_reloc_code_real_type code)); - -const char * -bfd_get_reloc_code_name PARAMS ((bfd_reloc_code_real_type code)); - - -typedef struct symbol_cache_entry -{ - /* A pointer to the BFD which owns the symbol. This information - is necessary so that a back end can work out what additional - information (invisible to the application writer) is carried - with the symbol. - - This field is *almost* redundant, since you can use section->owner - instead, except that some symbols point to the global sections - bfd_{abs,com,und}_section. This could be fixed by making - these globals be per-bfd (or per-target-flavor). FIXME. */ - - struct _bfd *the_bfd; /* Use bfd_asymbol_bfd(sym) to access this field. */ - - /* The text of the symbol. The name is left alone, and not copied; the - application may not alter it. */ - CONST char *name; - - /* The value of the symbol. This really should be a union of a - numeric value with a pointer, since some flags indicate that - a pointer to another symbol is stored here. */ - symvalue value; - - /* Attributes of a symbol: */ - -#define BSF_NO_FLAGS 0x00 - - /* The symbol has local scope; <<static>> in <<C>>. The value - is the offset into the section of the data. */ -#define BSF_LOCAL 0x01 - - /* The symbol has global scope; initialized data in <<C>>. The - value is the offset into the section of the data. */ -#define BSF_GLOBAL 0x02 - - /* The symbol has global scope and is exported. The value is - the offset into the section of the data. */ -#define BSF_EXPORT BSF_GLOBAL /* no real difference */ - - /* A normal C symbol would be one of: - <<BSF_LOCAL>>, <<BSF_FORT_COMM>>, <<BSF_UNDEFINED>> or - <<BSF_GLOBAL>> */ - - /* The symbol is a debugging record. The value has an arbitary - meaning. */ -#define BSF_DEBUGGING 0x08 - - /* The symbol denotes a function entry point. Used in ELF, - perhaps others someday. */ -#define BSF_FUNCTION 0x10 - - /* Used by the linker. */ -#define BSF_KEEP 0x20 -#define BSF_KEEP_G 0x40 - - /* A weak global symbol, overridable without warnings by - a regular global symbol of the same name. */ -#define BSF_WEAK 0x80 - - /* This symbol was created to point to a section, e.g. ELF's - STT_SECTION symbols. */ -#define BSF_SECTION_SYM 0x100 - - /* The symbol used to be a common symbol, but now it is - allocated. */ -#define BSF_OLD_COMMON 0x200 - - /* The default value for common data. */ -#define BFD_FORT_COMM_DEFAULT_VALUE 0 - - /* In some files the type of a symbol sometimes alters its - location in an output file - ie in coff a <<ISFCN>> symbol - which is also <<C_EXT>> symbol appears where it was - declared and not at the end of a section. This bit is set - by the target BFD part to convey this information. */ - -#define BSF_NOT_AT_END 0x400 - - /* Signal that the symbol is the label of constructor section. */ -#define BSF_CONSTRUCTOR 0x800 - - /* Signal that the symbol is a warning symbol. The name is a - warning. The name of the next symbol is the one to warn about; - if a reference is made to a symbol with the same name as the next - symbol, a warning is issued by the linker. */ -#define BSF_WARNING 0x1000 - - /* Signal that the symbol is indirect. This symbol is an indirect - pointer to the symbol with the same name as the next symbol. */ -#define BSF_INDIRECT 0x2000 - - /* BSF_FILE marks symbols that contain a file name. This is used - for ELF STT_FILE symbols. */ -#define BSF_FILE 0x4000 - - /* Symbol is from dynamic linking information. */ -#define BSF_DYNAMIC 0x8000 - - /* The symbol denotes a data object. Used in ELF, and perhaps - others someday. */ -#define BSF_OBJECT 0x10000 - - flagword flags; - - /* A pointer to the section to which this symbol is - relative. This will always be non NULL, there are special - sections for undefined and absolute symbols. */ - struct sec *section; - - /* Back end special data. */ - union - { - PTR p; - bfd_vma i; - } udata; - -} asymbol; -#define bfd_get_symtab_upper_bound(abfd) \ - BFD_SEND (abfd, _bfd_get_symtab_upper_bound, (abfd)) -boolean -bfd_is_local_label PARAMS ((bfd *abfd, asymbol *sym)); - -#define bfd_is_local_label(abfd, sym) \ - BFD_SEND (abfd, _bfd_is_local_label,(abfd, sym)) -#define bfd_canonicalize_symtab(abfd, location) \ - BFD_SEND (abfd, _bfd_canonicalize_symtab,\ - (abfd, location)) -boolean -bfd_set_symtab PARAMS ((bfd *abfd, asymbol **location, unsigned int count)); - -void -bfd_print_symbol_vandf PARAMS ((PTR file, asymbol *symbol)); - -#define bfd_make_empty_symbol(abfd) \ - BFD_SEND (abfd, _bfd_make_empty_symbol, (abfd)) -#define bfd_make_debug_symbol(abfd,ptr,size) \ - BFD_SEND (abfd, _bfd_make_debug_symbol, (abfd, ptr, size)) -int -bfd_decode_symclass PARAMS ((asymbol *symbol)); - -void -bfd_symbol_info PARAMS ((asymbol *symbol, symbol_info *ret)); - -boolean -bfd_copy_private_symbol_data PARAMS ((bfd *ibfd, asymbol *isym, bfd *obfd, asymbol *osym)); - -#define bfd_copy_private_symbol_data(ibfd, isymbol, obfd, osymbol) \ - BFD_SEND (ibfd, _bfd_copy_private_symbol_data, \ - (ibfd, isymbol, obfd, osymbol)) -struct _bfd -{ - /* The filename the application opened the BFD with. */ - CONST char *filename; - - /* A pointer to the target jump table. */ - const struct bfd_target *xvec; - - /* To avoid dragging too many header files into every file that - includes `<<bfd.h>>', IOSTREAM has been declared as a "char - *", and MTIME as a "long". Their correct types, to which they - are cast when used, are "FILE *" and "time_t". The iostream - is the result of an fopen on the filename. However, if the - BFD_IN_MEMORY flag is set, then iostream is actually a pointer - to a bfd_in_memory struct. */ - PTR iostream; - - /* Is the file descriptor being cached? That is, can it be closed as - needed, and re-opened when accessed later? */ - - boolean cacheable; - - /* Marks whether there was a default target specified when the - BFD was opened. This is used to select which matching algorithm - to use to choose the back end. */ - - boolean target_defaulted; - - /* The caching routines use these to maintain a - least-recently-used list of BFDs */ - - struct _bfd *lru_prev, *lru_next; - - /* When a file is closed by the caching routines, BFD retains - state information on the file here: */ - - file_ptr where; - - /* and here: (``once'' means at least once) */ - - boolean opened_once; - - /* Set if we have a locally maintained mtime value, rather than - getting it from the file each time: */ - - boolean mtime_set; - - /* File modified time, if mtime_set is true: */ - - long mtime; - - /* Reserved for an unimplemented file locking extension.*/ - - int ifd; - - /* The format which belongs to the BFD. (object, core, etc.) */ - - bfd_format format; - - /* The direction the BFD was opened with*/ - - enum bfd_direction {no_direction = 0, - read_direction = 1, - write_direction = 2, - both_direction = 3} direction; - - /* Format_specific flags*/ - - flagword flags; - - /* Currently my_archive is tested before adding origin to - anything. I believe that this can become always an add of - origin, with origin set to 0 for non archive files. */ - - file_ptr origin; - - /* Remember when output has begun, to stop strange things - from happening. */ - boolean output_has_begun; - - /* Pointer to linked list of sections*/ - struct sec *sections; - - /* The number of sections */ - unsigned int section_count; - - /* Stuff only useful for object files: - The start address. */ - bfd_vma start_address; - - /* Used for input and output*/ - unsigned int symcount; - - /* Symbol table for output BFD (with symcount entries) */ - struct symbol_cache_entry **outsymbols; - - /* Pointer to structure which contains architecture information*/ - const struct bfd_arch_info *arch_info; - - /* Stuff only useful for archives:*/ - PTR arelt_data; - struct _bfd *my_archive; /* The containing archive BFD. */ - struct _bfd *next; /* The next BFD in the archive. */ - struct _bfd *archive_head; /* The first BFD in the archive. */ - boolean has_armap; - - /* A chain of BFD structures involved in a link. */ - struct _bfd *link_next; - - /* A field used by _bfd_generic_link_add_archive_symbols. This will - be used only for archive elements. */ - int archive_pass; - - /* Used by the back end to hold private data. */ - - union - { - struct aout_data_struct *aout_data; - struct artdata *aout_ar_data; - struct _oasys_data *oasys_obj_data; - struct _oasys_ar_data *oasys_ar_data; - struct coff_tdata *coff_obj_data; - struct pe_tdata *pe_obj_data; - struct xcoff_tdata *xcoff_obj_data; - struct ecoff_tdata *ecoff_obj_data; - struct ieee_data_struct *ieee_data; - struct ieee_ar_data_struct *ieee_ar_data; - struct srec_data_struct *srec_data; - struct ihex_data_struct *ihex_data; - struct tekhex_data_struct *tekhex_data; - struct elf_obj_tdata *elf_obj_data; - struct nlm_obj_tdata *nlm_obj_data; - struct bout_data_struct *bout_data; - struct sun_core_struct *sun_core_data; - struct trad_core_struct *trad_core_data; - struct som_data_struct *som_data; - struct hpux_core_struct *hpux_core_data; - struct hppabsd_core_struct *hppabsd_core_data; - struct sgi_core_struct *sgi_core_data; - struct lynx_core_struct *lynx_core_data; - struct osf_core_struct *osf_core_data; - struct cisco_core_struct *cisco_core_data; - struct versados_data_struct *versados_data; - struct netbsd_core_struct *netbsd_core_data; - PTR any; - } tdata; - - /* Used by the application to hold private data*/ - PTR usrdata; - - /* Where all the allocated stuff under this BFD goes */ - struct obstack memory; -}; - -typedef enum bfd_error -{ - bfd_error_no_error = 0, - bfd_error_system_call, - bfd_error_invalid_target, - bfd_error_wrong_format, - bfd_error_invalid_operation, - bfd_error_no_memory, - bfd_error_no_symbols, - bfd_error_no_armap, - bfd_error_no_more_archived_files, - bfd_error_malformed_archive, - bfd_error_file_not_recognized, - bfd_error_file_ambiguously_recognized, - bfd_error_no_contents, - bfd_error_nonrepresentable_section, - bfd_error_no_debug_section, - bfd_error_bad_value, - bfd_error_file_truncated, - bfd_error_file_too_big, - bfd_error_invalid_error_code -} bfd_error_type; - -bfd_error_type -bfd_get_error PARAMS ((void)); - -void -bfd_set_error PARAMS ((bfd_error_type error_tag)); - -CONST char * -bfd_errmsg PARAMS ((bfd_error_type error_tag)); - -void -bfd_perror PARAMS ((CONST char *message)); - -typedef void (*bfd_error_handler_type) PARAMS ((const char *, ...)); - -bfd_error_handler_type -bfd_set_error_handler PARAMS ((bfd_error_handler_type)); - -void -bfd_set_error_program_name PARAMS ((const char *)); - -long -bfd_get_reloc_upper_bound PARAMS ((bfd *abfd, asection *sect)); - -long -bfd_canonicalize_reloc - PARAMS ((bfd *abfd, - asection *sec, - arelent **loc, - asymbol **syms)); - -void -bfd_set_reloc - PARAMS ((bfd *abfd, asection *sec, arelent **rel, unsigned int count) - - ); - -boolean -bfd_set_file_flags PARAMS ((bfd *abfd, flagword flags)); - -boolean -bfd_set_start_address PARAMS ((bfd *abfd, bfd_vma vma)); - -long -bfd_get_mtime PARAMS ((bfd *abfd)); - -long -bfd_get_size PARAMS ((bfd *abfd)); - -int -bfd_get_gp_size PARAMS ((bfd *abfd)); - -void -bfd_set_gp_size PARAMS ((bfd *abfd, int i)); - -bfd_vma -bfd_scan_vma PARAMS ((CONST char *string, CONST char **end, int base)); - -boolean -bfd_copy_private_bfd_data PARAMS ((bfd *ibfd, bfd *obfd)); - -#define bfd_copy_private_bfd_data(ibfd, obfd) \ - BFD_SEND (ibfd, _bfd_copy_private_bfd_data, \ - (ibfd, obfd)) -boolean -bfd_merge_private_bfd_data PARAMS ((bfd *ibfd, bfd *obfd)); - -#define bfd_merge_private_bfd_data(ibfd, obfd) \ - BFD_SEND (ibfd, _bfd_merge_private_bfd_data, \ - (ibfd, obfd)) -boolean -bfd_set_private_flags PARAMS ((bfd *abfd, flagword flags)); - -#define bfd_set_private_flags(abfd, flags) \ - BFD_SEND (abfd, _bfd_set_private_flags, \ - (abfd, flags)) -#define bfd_sizeof_headers(abfd, reloc) \ - BFD_SEND (abfd, _bfd_sizeof_headers, (abfd, reloc)) - -#define bfd_find_nearest_line(abfd, sec, syms, off, file, func, line) \ - BFD_SEND (abfd, _bfd_find_nearest_line, (abfd, sec, syms, off, file, func, line)) - - /* Do these three do anything useful at all, for any back end? */ -#define bfd_debug_info_start(abfd) \ - BFD_SEND (abfd, _bfd_debug_info_start, (abfd)) - -#define bfd_debug_info_end(abfd) \ - BFD_SEND (abfd, _bfd_debug_info_end, (abfd)) - -#define bfd_debug_info_accumulate(abfd, section) \ - BFD_SEND (abfd, _bfd_debug_info_accumulate, (abfd, section)) - - -#define bfd_stat_arch_elt(abfd, stat) \ - BFD_SEND (abfd, _bfd_stat_arch_elt,(abfd, stat)) - -#define bfd_update_armap_timestamp(abfd) \ - BFD_SEND (abfd, _bfd_update_armap_timestamp, (abfd)) - -#define bfd_set_arch_mach(abfd, arch, mach)\ - BFD_SEND ( abfd, _bfd_set_arch_mach, (abfd, arch, mach)) - -#define bfd_relax_section(abfd, section, link_info, again) \ - BFD_SEND (abfd, _bfd_relax_section, (abfd, section, link_info, again)) - -#define bfd_link_hash_table_create(abfd) \ - BFD_SEND (abfd, _bfd_link_hash_table_create, (abfd)) - -#define bfd_link_add_symbols(abfd, info) \ - BFD_SEND (abfd, _bfd_link_add_symbols, (abfd, info)) - -#define bfd_final_link(abfd, info) \ - BFD_SEND (abfd, _bfd_final_link, (abfd, info)) - -#define bfd_free_cached_info(abfd) \ - BFD_SEND (abfd, _bfd_free_cached_info, (abfd)) - -#define bfd_get_dynamic_symtab_upper_bound(abfd) \ - BFD_SEND (abfd, _bfd_get_dynamic_symtab_upper_bound, (abfd)) - -#define bfd_print_private_bfd_data(abfd, file)\ - BFD_SEND (abfd, _bfd_print_private_bfd_data, (abfd, file)) - -#define bfd_canonicalize_dynamic_symtab(abfd, asymbols) \ - BFD_SEND (abfd, _bfd_canonicalize_dynamic_symtab, (abfd, asymbols)) - -#define bfd_get_dynamic_reloc_upper_bound(abfd) \ - BFD_SEND (abfd, _bfd_get_dynamic_reloc_upper_bound, (abfd)) - -#define bfd_canonicalize_dynamic_reloc(abfd, arels, asyms) \ - BFD_SEND (abfd, _bfd_canonicalize_dynamic_reloc, (abfd, arels, asyms)) - -extern bfd_byte *bfd_get_relocated_section_contents - PARAMS ((bfd *, struct bfd_link_info *, - struct bfd_link_order *, bfd_byte *, - boolean, asymbol **)); - -symindex -bfd_get_next_mapent PARAMS ((bfd *abfd, symindex previous, carsym **sym)); - -boolean -bfd_set_archive_head PARAMS ((bfd *output, bfd *new_head)); - -bfd * -bfd_openr_next_archived_file PARAMS ((bfd *archive, bfd *previous)); - -CONST char * -bfd_core_file_failing_command PARAMS ((bfd *abfd)); - -int -bfd_core_file_failing_signal PARAMS ((bfd *abfd)); - -boolean -core_file_matches_executable_p - PARAMS ((bfd *core_bfd, bfd *exec_bfd)); - -#define BFD_SEND(bfd, message, arglist) \ - ((*((bfd)->xvec->message)) arglist) - -#ifdef DEBUG_BFD_SEND -#undef BFD_SEND -#define BFD_SEND(bfd, message, arglist) \ - (((bfd) && (bfd)->xvec && (bfd)->xvec->message) ? \ - ((*((bfd)->xvec->message)) arglist) : \ - (bfd_assert (__FILE__,__LINE__), NULL)) -#endif -#define BFD_SEND_FMT(bfd, message, arglist) \ - (((bfd)->xvec->message[(int)((bfd)->format)]) arglist) - -#ifdef DEBUG_BFD_SEND -#undef BFD_SEND_FMT -#define BFD_SEND_FMT(bfd, message, arglist) \ - (((bfd) && (bfd)->xvec && (bfd)->xvec->message) ? \ - (((bfd)->xvec->message[(int)((bfd)->format)]) arglist) : \ - (bfd_assert (__FILE__,__LINE__), NULL)) -#endif -enum bfd_flavour { - bfd_target_unknown_flavour, - bfd_target_aout_flavour, - bfd_target_coff_flavour, - bfd_target_ecoff_flavour, - bfd_target_elf_flavour, - bfd_target_ieee_flavour, - bfd_target_nlm_flavour, - bfd_target_oasys_flavour, - bfd_target_tekhex_flavour, - bfd_target_srec_flavour, - bfd_target_ihex_flavour, - bfd_target_som_flavour, - bfd_target_os9k_flavour, - bfd_target_versados_flavour, - bfd_target_msdos_flavour -}; - -enum bfd_endian { BFD_ENDIAN_BIG, BFD_ENDIAN_LITTLE, BFD_ENDIAN_UNKNOWN }; - - /* Forward declaration. */ -typedef struct bfd_link_info _bfd_link_info; - -typedef struct bfd_target -{ - char *name; - enum bfd_flavour flavour; - enum bfd_endian byteorder; - enum bfd_endian header_byteorder; - flagword object_flags; - flagword section_flags; - char symbol_leading_char; - char ar_pad_char; - unsigned short ar_max_namelen; - bfd_vma (*bfd_getx64) PARAMS ((const bfd_byte *)); - bfd_signed_vma (*bfd_getx_signed_64) PARAMS ((const bfd_byte *)); - void (*bfd_putx64) PARAMS ((bfd_vma, bfd_byte *)); - bfd_vma (*bfd_getx32) PARAMS ((const bfd_byte *)); - bfd_signed_vma (*bfd_getx_signed_32) PARAMS ((const bfd_byte *)); - void (*bfd_putx32) PARAMS ((bfd_vma, bfd_byte *)); - bfd_vma (*bfd_getx16) PARAMS ((const bfd_byte *)); - bfd_signed_vma (*bfd_getx_signed_16) PARAMS ((const bfd_byte *)); - void (*bfd_putx16) PARAMS ((bfd_vma, bfd_byte *)); - bfd_vma (*bfd_h_getx64) PARAMS ((const bfd_byte *)); - bfd_signed_vma (*bfd_h_getx_signed_64) PARAMS ((const bfd_byte *)); - void (*bfd_h_putx64) PARAMS ((bfd_vma, bfd_byte *)); - bfd_vma (*bfd_h_getx32) PARAMS ((const bfd_byte *)); - bfd_signed_vma (*bfd_h_getx_signed_32) PARAMS ((const bfd_byte *)); - void (*bfd_h_putx32) PARAMS ((bfd_vma, bfd_byte *)); - bfd_vma (*bfd_h_getx16) PARAMS ((const bfd_byte *)); - bfd_signed_vma (*bfd_h_getx_signed_16) PARAMS ((const bfd_byte *)); - void (*bfd_h_putx16) PARAMS ((bfd_vma, bfd_byte *)); - const struct bfd_target *(*_bfd_check_format[bfd_type_end]) PARAMS ((bfd *)); - boolean (*_bfd_set_format[bfd_type_end]) PARAMS ((bfd *)); - boolean (*_bfd_write_contents[bfd_type_end]) PARAMS ((bfd *)); - - /* Generic entry points. */ -#define BFD_JUMP_TABLE_GENERIC(NAME)\ -CAT(NAME,_close_and_cleanup),\ -CAT(NAME,_bfd_free_cached_info),\ -CAT(NAME,_new_section_hook),\ -CAT(NAME,_get_section_contents),\ -CAT(NAME,_get_section_contents_in_window) - - /* Called when the BFD is being closed to do any necessary cleanup. */ - boolean (*_close_and_cleanup) PARAMS ((bfd *)); - /* Ask the BFD to free all cached information. */ - boolean (*_bfd_free_cached_info) PARAMS ((bfd *)); - /* Called when a new section is created. */ - boolean (*_new_section_hook) PARAMS ((bfd *, sec_ptr)); - /* Read the contents of a section. */ - boolean (*_bfd_get_section_contents) PARAMS ((bfd *, sec_ptr, PTR, - file_ptr, bfd_size_type)); - boolean (*_bfd_get_section_contents_in_window) - PARAMS ((bfd *, sec_ptr, bfd_window *, - file_ptr, bfd_size_type)); - - /* Entry points to copy private data. */ -#define BFD_JUMP_TABLE_COPY(NAME)\ -CAT(NAME,_bfd_copy_private_bfd_data),\ -CAT(NAME,_bfd_merge_private_bfd_data),\ -CAT(NAME,_bfd_copy_private_section_data),\ -CAT(NAME,_bfd_copy_private_symbol_data),\ -CAT(NAME,_bfd_set_private_flags),\ -CAT(NAME,_bfd_print_private_bfd_data)\ - /* Called to copy BFD general private data from one object file - to another. */ - boolean (*_bfd_copy_private_bfd_data) PARAMS ((bfd *, bfd *)); - /* Called to merge BFD general private data from one object file - to a common output file when linking. */ - boolean (*_bfd_merge_private_bfd_data) PARAMS ((bfd *, bfd *)); - /* Called to copy BFD private section data from one object file - to another. */ - boolean (*_bfd_copy_private_section_data) PARAMS ((bfd *, sec_ptr, - bfd *, sec_ptr)); - /* Called to copy BFD private symbol data from one symbol - to another. */ - boolean (*_bfd_copy_private_symbol_data) PARAMS ((bfd *, asymbol *, - bfd *, asymbol *)); - /* Called to set private backend flags */ - boolean (*_bfd_set_private_flags) PARAMS ((bfd *, flagword)); - - /* Called to print private BFD data */ - boolean (*_bfd_print_private_bfd_data) PARAMS ((bfd *, PTR)); - - /* Core file entry points. */ -#define BFD_JUMP_TABLE_CORE(NAME)\ -CAT(NAME,_core_file_failing_command),\ -CAT(NAME,_core_file_failing_signal),\ -CAT(NAME,_core_file_matches_executable_p) - char * (*_core_file_failing_command) PARAMS ((bfd *)); - int (*_core_file_failing_signal) PARAMS ((bfd *)); - boolean (*_core_file_matches_executable_p) PARAMS ((bfd *, bfd *)); - - /* Archive entry points. */ -#define BFD_JUMP_TABLE_ARCHIVE(NAME)\ -CAT(NAME,_slurp_armap),\ -CAT(NAME,_slurp_extended_name_table),\ -CAT(NAME,_construct_extended_name_table),\ -CAT(NAME,_truncate_arname),\ -CAT(NAME,_write_armap),\ -CAT(NAME,_read_ar_hdr),\ -CAT(NAME,_openr_next_archived_file),\ -CAT(NAME,_get_elt_at_index),\ -CAT(NAME,_generic_stat_arch_elt),\ -CAT(NAME,_update_armap_timestamp) - boolean (*_bfd_slurp_armap) PARAMS ((bfd *)); - boolean (*_bfd_slurp_extended_name_table) PARAMS ((bfd *)); - boolean (*_bfd_construct_extended_name_table) - PARAMS ((bfd *, char **, bfd_size_type *, const char **)); - void (*_bfd_truncate_arname) PARAMS ((bfd *, CONST char *, char *)); - boolean (*write_armap) PARAMS ((bfd *arch, - unsigned int elength, - struct orl *map, - unsigned int orl_count, - int stridx)); - PTR (*_bfd_read_ar_hdr_fn) PARAMS ((bfd *)); - bfd * (*openr_next_archived_file) PARAMS ((bfd *arch, bfd *prev)); -#define bfd_get_elt_at_index(b,i) BFD_SEND(b, _bfd_get_elt_at_index, (b,i)) - bfd * (*_bfd_get_elt_at_index) PARAMS ((bfd *, symindex)); - int (*_bfd_stat_arch_elt) PARAMS ((bfd *, struct stat *)); - boolean (*_bfd_update_armap_timestamp) PARAMS ((bfd *)); - - /* Entry points used for symbols. */ -#define BFD_JUMP_TABLE_SYMBOLS(NAME)\ -CAT(NAME,_get_symtab_upper_bound),\ -CAT(NAME,_get_symtab),\ -CAT(NAME,_make_empty_symbol),\ -CAT(NAME,_print_symbol),\ -CAT(NAME,_get_symbol_info),\ -CAT(NAME,_bfd_is_local_label),\ -CAT(NAME,_get_lineno),\ -CAT(NAME,_find_nearest_line),\ -CAT(NAME,_bfd_make_debug_symbol),\ -CAT(NAME,_read_minisymbols),\ -CAT(NAME,_minisymbol_to_symbol) - long (*_bfd_get_symtab_upper_bound) PARAMS ((bfd *)); - long (*_bfd_canonicalize_symtab) PARAMS ((bfd *, - struct symbol_cache_entry **)); - struct symbol_cache_entry * - (*_bfd_make_empty_symbol) PARAMS ((bfd *)); - void (*_bfd_print_symbol) PARAMS ((bfd *, PTR, - struct symbol_cache_entry *, - bfd_print_symbol_type)); -#define bfd_print_symbol(b,p,s,e) BFD_SEND(b, _bfd_print_symbol, (b,p,s,e)) - void (*_bfd_get_symbol_info) PARAMS ((bfd *, - struct symbol_cache_entry *, - symbol_info *)); -#define bfd_get_symbol_info(b,p,e) BFD_SEND(b, _bfd_get_symbol_info, (b,p,e)) - boolean (*_bfd_is_local_label) PARAMS ((bfd *, asymbol *)); - - alent * (*_get_lineno) PARAMS ((bfd *, struct symbol_cache_entry *)); - boolean (*_bfd_find_nearest_line) PARAMS ((bfd *abfd, - struct sec *section, struct symbol_cache_entry **symbols, - bfd_vma offset, CONST char **file, CONST char **func, - unsigned int *line)); - /* Back-door to allow format-aware applications to create debug symbols - while using BFD for everything else. Currently used by the assembler - when creating COFF files. */ - asymbol * (*_bfd_make_debug_symbol) PARAMS (( - bfd *abfd, - void *ptr, - unsigned long size)); -#define bfd_read_minisymbols(b, d, m, s) \ - BFD_SEND (b, _read_minisymbols, (b, d, m, s)) - long (*_read_minisymbols) PARAMS ((bfd *, boolean, PTR *, - unsigned int *)); -#define bfd_minisymbol_to_symbol(b, d, m, f) \ - BFD_SEND (b, _minisymbol_to_symbol, (b, d, m, f)) - asymbol *(*_minisymbol_to_symbol) PARAMS ((bfd *, boolean, const PTR, - asymbol *)); - - /* Routines for relocs. */ -#define BFD_JUMP_TABLE_RELOCS(NAME)\ -CAT(NAME,_get_reloc_upper_bound),\ -CAT(NAME,_canonicalize_reloc),\ -CAT(NAME,_bfd_reloc_type_lookup) - long (*_get_reloc_upper_bound) PARAMS ((bfd *, sec_ptr)); - long (*_bfd_canonicalize_reloc) PARAMS ((bfd *, sec_ptr, arelent **, - struct symbol_cache_entry **)); - /* See documentation on reloc types. */ - reloc_howto_type * - (*reloc_type_lookup) PARAMS ((bfd *abfd, - bfd_reloc_code_real_type code)); - - /* Routines used when writing an object file. */ -#define BFD_JUMP_TABLE_WRITE(NAME)\ -CAT(NAME,_set_arch_mach),\ -CAT(NAME,_set_section_contents) - boolean (*_bfd_set_arch_mach) PARAMS ((bfd *, enum bfd_architecture, - unsigned long)); - boolean (*_bfd_set_section_contents) PARAMS ((bfd *, sec_ptr, PTR, - file_ptr, bfd_size_type)); - - /* Routines used by the linker. */ -#define BFD_JUMP_TABLE_LINK(NAME)\ -CAT(NAME,_sizeof_headers),\ -CAT(NAME,_bfd_get_relocated_section_contents),\ -CAT(NAME,_bfd_relax_section),\ -CAT(NAME,_bfd_link_hash_table_create),\ -CAT(NAME,_bfd_link_add_symbols),\ -CAT(NAME,_bfd_final_link),\ -CAT(NAME,_bfd_link_split_section) - int (*_bfd_sizeof_headers) PARAMS ((bfd *, boolean)); - bfd_byte * (*_bfd_get_relocated_section_contents) PARAMS ((bfd *, - struct bfd_link_info *, struct bfd_link_order *, - bfd_byte *data, boolean relocateable, - struct symbol_cache_entry **)); - - boolean (*_bfd_relax_section) PARAMS ((bfd *, struct sec *, - struct bfd_link_info *, boolean *again)); - - /* Create a hash table for the linker. Different backends store - different information in this table. */ - struct bfd_link_hash_table *(*_bfd_link_hash_table_create) PARAMS ((bfd *)); - - /* Add symbols from this object file into the hash table. */ - boolean (*_bfd_link_add_symbols) PARAMS ((bfd *, struct bfd_link_info *)); - - /* Do a link based on the link_order structures attached to each - section of the BFD. */ - boolean (*_bfd_final_link) PARAMS ((bfd *, struct bfd_link_info *)); - - /* Should this section be split up into smaller pieces during linking. */ - boolean (*_bfd_link_split_section) PARAMS ((bfd *, struct sec *)); - - /* Routines to handle dynamic symbols and relocs. */ -#define BFD_JUMP_TABLE_DYNAMIC(NAME)\ -CAT(NAME,_get_dynamic_symtab_upper_bound),\ -CAT(NAME,_canonicalize_dynamic_symtab),\ -CAT(NAME,_get_dynamic_reloc_upper_bound),\ -CAT(NAME,_canonicalize_dynamic_reloc) - /* Get the amount of memory required to hold the dynamic symbols. */ - long (*_bfd_get_dynamic_symtab_upper_bound) PARAMS ((bfd *)); - /* Read in the dynamic symbols. */ - long (*_bfd_canonicalize_dynamic_symtab) - PARAMS ((bfd *, struct symbol_cache_entry **)); - /* Get the amount of memory required to hold the dynamic relocs. */ - long (*_bfd_get_dynamic_reloc_upper_bound) PARAMS ((bfd *)); - /* Read in the dynamic relocs. */ - long (*_bfd_canonicalize_dynamic_reloc) - PARAMS ((bfd *, arelent **, struct symbol_cache_entry **)); - - PTR backend_data; -} bfd_target; -const bfd_target * -bfd_find_target PARAMS ((CONST char *target_name, bfd *abfd)); - -const char ** -bfd_target_list PARAMS ((void)); - -boolean -bfd_check_format PARAMS ((bfd *abfd, bfd_format format)); - -boolean -bfd_check_format_matches PARAMS ((bfd *abfd, bfd_format format, char ***matching)); - -boolean -bfd_set_format PARAMS ((bfd *abfd, bfd_format format)); - -CONST char * -bfd_format_string PARAMS ((bfd_format format)); - -#ifdef __cplusplus -} -#endif -#endif diff --git a/contrib/gdb/bfd/bfd.c b/contrib/gdb/bfd/bfd.c deleted file mode 100644 index 10ec67efaa6f5..0000000000000 --- a/contrib/gdb/bfd/bfd.c +++ /dev/null @@ -1,1144 +0,0 @@ -/* Generic BFD library interface and support routines. - Copyright (C) 1990, 91, 92, 93, 94, 95, 1996 Free Software Foundation, Inc. - Written by Cygnus Support. - -This file is part of BFD, the Binary File Descriptor library. - -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 2 of the License, 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ - -/* -SECTION - <<typedef bfd>> - - A BFD has type <<bfd>>; objects of this type are the - cornerstone of any application using BFD. Using BFD - consists of making references though the BFD and to data in the BFD. - - Here is the structure that defines the type <<bfd>>. It - contains the major data about the file and pointers - to the rest of the data. - -CODE_FRAGMENT -. -.struct _bfd -.{ -. {* The filename the application opened the BFD with. *} -. CONST char *filename; -. -. {* A pointer to the target jump table. *} -. const struct bfd_target *xvec; -. -. {* To avoid dragging too many header files into every file that -. includes `<<bfd.h>>', IOSTREAM has been declared as a "char -. *", and MTIME as a "long". Their correct types, to which they -. are cast when used, are "FILE *" and "time_t". The iostream -. is the result of an fopen on the filename. However, if the -. BFD_IN_MEMORY flag is set, then iostream is actually a pointer -. to a bfd_in_memory struct. *} -. PTR iostream; -. -. {* Is the file descriptor being cached? That is, can it be closed as -. needed, and re-opened when accessed later? *} -. -. boolean cacheable; -. -. {* Marks whether there was a default target specified when the -. BFD was opened. This is used to select which matching algorithm -. to use to choose the back end. *} -. -. boolean target_defaulted; -. -. {* The caching routines use these to maintain a -. least-recently-used list of BFDs *} -. -. struct _bfd *lru_prev, *lru_next; -. -. {* When a file is closed by the caching routines, BFD retains -. state information on the file here: *} -. -. file_ptr where; -. -. {* and here: (``once'' means at least once) *} -. -. boolean opened_once; -. -. {* Set if we have a locally maintained mtime value, rather than -. getting it from the file each time: *} -. -. boolean mtime_set; -. -. {* File modified time, if mtime_set is true: *} -. -. long mtime; -. -. {* Reserved for an unimplemented file locking extension.*} -. -. int ifd; -. -. {* The format which belongs to the BFD. (object, core, etc.) *} -. -. bfd_format format; -. -. {* The direction the BFD was opened with*} -. -. enum bfd_direction {no_direction = 0, -. read_direction = 1, -. write_direction = 2, -. both_direction = 3} direction; -. -. {* Format_specific flags*} -. -. flagword flags; -. -. {* Currently my_archive is tested before adding origin to -. anything. I believe that this can become always an add of -. origin, with origin set to 0 for non archive files. *} -. -. file_ptr origin; -. -. {* Remember when output has begun, to stop strange things -. from happening. *} -. boolean output_has_begun; -. -. {* Pointer to linked list of sections*} -. struct sec *sections; -. -. {* The number of sections *} -. unsigned int section_count; -. -. {* Stuff only useful for object files: -. The start address. *} -. bfd_vma start_address; -. -. {* Used for input and output*} -. unsigned int symcount; -. -. {* Symbol table for output BFD (with symcount entries) *} -. struct symbol_cache_entry **outsymbols; -. -. {* Pointer to structure which contains architecture information*} -. const struct bfd_arch_info *arch_info; -. -. {* Stuff only useful for archives:*} -. PTR arelt_data; -. struct _bfd *my_archive; {* The containing archive BFD. *} -. struct _bfd *next; {* The next BFD in the archive. *} -. struct _bfd *archive_head; {* The first BFD in the archive. *} -. boolean has_armap; -. -. {* A chain of BFD structures involved in a link. *} -. struct _bfd *link_next; -. -. {* A field used by _bfd_generic_link_add_archive_symbols. This will -. be used only for archive elements. *} -. int archive_pass; -. -. {* Used by the back end to hold private data. *} -. -. union -. { -. struct aout_data_struct *aout_data; -. struct artdata *aout_ar_data; -. struct _oasys_data *oasys_obj_data; -. struct _oasys_ar_data *oasys_ar_data; -. struct coff_tdata *coff_obj_data; -. struct pe_tdata *pe_obj_data; -. struct xcoff_tdata *xcoff_obj_data; -. struct ecoff_tdata *ecoff_obj_data; -. struct ieee_data_struct *ieee_data; -. struct ieee_ar_data_struct *ieee_ar_data; -. struct srec_data_struct *srec_data; -. struct ihex_data_struct *ihex_data; -. struct tekhex_data_struct *tekhex_data; -. struct elf_obj_tdata *elf_obj_data; -. struct nlm_obj_tdata *nlm_obj_data; -. struct bout_data_struct *bout_data; -. struct sun_core_struct *sun_core_data; -. struct trad_core_struct *trad_core_data; -. struct som_data_struct *som_data; -. struct hpux_core_struct *hpux_core_data; -. struct hppabsd_core_struct *hppabsd_core_data; -. struct sgi_core_struct *sgi_core_data; -. struct lynx_core_struct *lynx_core_data; -. struct osf_core_struct *osf_core_data; -. struct cisco_core_struct *cisco_core_data; -. struct versados_data_struct *versados_data; -. struct netbsd_core_struct *netbsd_core_data; -. PTR any; -. } tdata; -. -. {* Used by the application to hold private data*} -. PTR usrdata; -. -. {* Where all the allocated stuff under this BFD goes *} -. struct obstack memory; -.}; -. -*/ - -#include "bfd.h" -#include "sysdep.h" - -#ifdef ANSI_PROTOTYPES -#include <stdarg.h> -#else -#include <varargs.h> -#endif - -#include "bfdlink.h" -#include "libbfd.h" -#include "coff/internal.h" -#include "coff/sym.h" -#include "libcoff.h" -#include "libecoff.h" -#undef obj_symbols -#include "elf-bfd.h" - -#include <ctype.h> - -/* provide storage for subsystem, stack and heap data which may have been - passed in on the command line. Ld puts this data into a bfd_link_info - struct which ultimately gets passed in to the bfd. When it arrives, copy - it to the following struct so that the data will be available in coffcode.h - where it is needed. The typedef's used are defined in bfd.h */ - - - -/* -SECTION - Error reporting - - Most BFD functions return nonzero on success (check their - individual documentation for precise semantics). On an error, - they call <<bfd_set_error>> to set an error condition that callers - can check by calling <<bfd_get_error>>. - If that returns <<bfd_error_system_call>>, then check - <<errno>>. - - The easiest way to report a BFD error to the user is to - use <<bfd_perror>>. - -SUBSECTION - Type <<bfd_error_type>> - - The values returned by <<bfd_get_error>> are defined by the - enumerated type <<bfd_error_type>>. - -CODE_FRAGMENT -. -.typedef enum bfd_error -.{ -. bfd_error_no_error = 0, -. bfd_error_system_call, -. bfd_error_invalid_target, -. bfd_error_wrong_format, -. bfd_error_invalid_operation, -. bfd_error_no_memory, -. bfd_error_no_symbols, -. bfd_error_no_armap, -. bfd_error_no_more_archived_files, -. bfd_error_malformed_archive, -. bfd_error_file_not_recognized, -. bfd_error_file_ambiguously_recognized, -. bfd_error_no_contents, -. bfd_error_nonrepresentable_section, -. bfd_error_no_debug_section, -. bfd_error_bad_value, -. bfd_error_file_truncated, -. bfd_error_file_too_big, -. bfd_error_invalid_error_code -.} bfd_error_type; -. -*/ - -#undef strerror -extern char *strerror(); - -static bfd_error_type bfd_error = bfd_error_no_error; - -CONST char *CONST bfd_errmsgs[] = { - "No error", - "System call error", - "Invalid bfd target", - "File in wrong format", - "Invalid operation", - "Memory exhausted", - "No symbols", - "Archive has no index; run ranlib to add one", - "No more archived files", - "Malformed archive", - "File format not recognized", - "File format is ambiguous", - "Section has no contents", - "Nonrepresentable section on output", - "Symbol needs debug section which does not exist", - "Bad value", - "File truncated", - "File too big", - "#<Invalid error code>" - }; - -/* -FUNCTION - bfd_get_error - -SYNOPSIS - bfd_error_type bfd_get_error (void); - -DESCRIPTION - Return the current BFD error condition. -*/ - -bfd_error_type -bfd_get_error () -{ - return bfd_error; -} - -/* -FUNCTION - bfd_set_error - -SYNOPSIS - void bfd_set_error (bfd_error_type error_tag); - -DESCRIPTION - Set the BFD error condition to be @var{error_tag}. -*/ - -void -bfd_set_error (error_tag) - bfd_error_type error_tag; -{ - bfd_error = error_tag; -} - -/* -FUNCTION - bfd_errmsg - -SYNOPSIS - CONST char *bfd_errmsg (bfd_error_type error_tag); - -DESCRIPTION - Return a string describing the error @var{error_tag}, or - the system error if @var{error_tag} is <<bfd_error_system_call>>. -*/ - -CONST char * -bfd_errmsg (error_tag) - bfd_error_type error_tag; -{ -#ifndef errno - extern int errno; -#endif - if (error_tag == bfd_error_system_call) - { - const char *errmsg; - - errmsg = strerror (errno); - if (errmsg == NULL) - { - static char buf[32]; - - sprintf (buf, "Error %d", errno); - errmsg = buf; - } - return errmsg; - } - - if ((((int)error_tag <(int) bfd_error_no_error) || - ((int)error_tag > (int)bfd_error_invalid_error_code))) - error_tag = bfd_error_invalid_error_code;/* sanity check */ - - return bfd_errmsgs [(int)error_tag]; -} - -/* -FUNCTION - bfd_perror - -SYNOPSIS - void bfd_perror (CONST char *message); - -DESCRIPTION - Print to the standard error stream a string describing the - last BFD error that occurred, or the last system error if - the last BFD error was a system call failure. If @var{message} - is non-NULL and non-empty, the error string printed is preceded - by @var{message}, a colon, and a space. It is followed by a newline. -*/ - -void -bfd_perror (message) - CONST char *message; -{ - if (bfd_get_error () == bfd_error_system_call) - perror((char *)message); /* must be system error then... */ - else { - if (message == NULL || *message == '\0') - fprintf (stderr, "%s\n", bfd_errmsg (bfd_get_error ())); - else - fprintf (stderr, "%s: %s\n", message, bfd_errmsg (bfd_get_error ())); - } -} - -/* -SUBSECTION - BFD error handler - - Some BFD functions want to print messages describing the - problem. They call a BFD error handler function. This - function may be overriden by the program. - - The BFD error handler acts like printf. - -CODE_FRAGMENT -. -.typedef void (*bfd_error_handler_type) PARAMS ((const char *, ...)); -. -*/ - -/* The program name used when printing BFD error messages. */ - -static const char *_bfd_error_program_name; - -/* This is the default routine to handle BFD error messages. */ - -#ifdef ANSI_PROTOTYPES - -static void _bfd_default_error_handler PARAMS ((const char *s, ...)); - -static void -_bfd_default_error_handler (const char *s, ...) -{ - va_list p; - - if (_bfd_error_program_name != NULL) - fprintf (stderr, "%s: ", _bfd_error_program_name); - - va_start (p, s); - - vfprintf (stderr, s, p); - - va_end (p); - - fprintf (stderr, "\n"); -} - -#else /* ! defined (ANSI_PROTOTYPES) */ - -static void _bfd_default_error_handler (); - -static void -_bfd_default_error_handler (va_alist) - va_dcl -{ - va_list p; - const char *s; - - if (_bfd_error_program_name != NULL) - fprintf (stderr, "%s: ", _bfd_error_program_name); - - va_start (p); - - s = va_arg (p, const char *); - vfprintf (stderr, s, p); - - va_end (p); - - fprintf (stderr, "\n"); -} - -#endif /* ! defined (ANSI_PROTOTYPES) */ - -/* This is a function pointer to the routine which should handle BFD - error messages. It is called when a BFD routine encounters an - error for which it wants to print a message. Going through a - function pointer permits a program linked against BFD to intercept - the messages and deal with them itself. */ - -bfd_error_handler_type _bfd_error_handler = _bfd_default_error_handler; - -/* -FUNCTION - bfd_set_error_handler - -SYNOPSIS - bfd_error_handler_type bfd_set_error_handler (bfd_error_handler_type); - -DESCRIPTION - Set the BFD error handler function. Returns the previous - function. -*/ - -bfd_error_handler_type -bfd_set_error_handler (pnew) - bfd_error_handler_type pnew; -{ - bfd_error_handler_type pold; - - pold = _bfd_error_handler; - _bfd_error_handler = pnew; - return pold; -} - -/* -FUNCTION - bfd_set_error_program_name - -SYNOPSIS - void bfd_set_error_program_name (const char *); - -DESCRIPTION - Set the program name to use when printing a BFD error. This - is printed before the error message followed by a colon and - space. The string must not be changed after it is passed to - this function. -*/ - -void -bfd_set_error_program_name (name) - const char *name; -{ - _bfd_error_program_name = name; -} - -/* -SECTION - Symbols -*/ - -/* -FUNCTION - bfd_get_reloc_upper_bound - -SYNOPSIS - long bfd_get_reloc_upper_bound(bfd *abfd, asection *sect); - -DESCRIPTION - Return the number of bytes required to store the - relocation information associated with section @var{sect} - attached to bfd @var{abfd}. If an error occurs, return -1. - -*/ - - -long -bfd_get_reloc_upper_bound (abfd, asect) - bfd *abfd; - sec_ptr asect; -{ - if (abfd->format != bfd_object) { - bfd_set_error (bfd_error_invalid_operation); - return -1; - } - - return BFD_SEND (abfd, _get_reloc_upper_bound, (abfd, asect)); -} - -/* -FUNCTION - bfd_canonicalize_reloc - -SYNOPSIS - long bfd_canonicalize_reloc - (bfd *abfd, - asection *sec, - arelent **loc, - asymbol **syms); - -DESCRIPTION - Call the back end associated with the open BFD - @var{abfd} and translate the external form of the relocation - information attached to @var{sec} into the internal canonical - form. Place the table into memory at @var{loc}, which has - been preallocated, usually by a call to - <<bfd_get_reloc_upper_bound>>. Returns the number of relocs, or - -1 on error. - - The @var{syms} table is also needed for horrible internal magic - reasons. - - -*/ -long -bfd_canonicalize_reloc (abfd, asect, location, symbols) - bfd *abfd; - sec_ptr asect; - arelent **location; - asymbol **symbols; -{ - if (abfd->format != bfd_object) { - bfd_set_error (bfd_error_invalid_operation); - return -1; - } - return BFD_SEND (abfd, _bfd_canonicalize_reloc, - (abfd, asect, location, symbols)); -} - -/* -FUNCTION - bfd_set_reloc - -SYNOPSIS - void bfd_set_reloc - (bfd *abfd, asection *sec, arelent **rel, unsigned int count) - -DESCRIPTION - Set the relocation pointer and count within - section @var{sec} to the values @var{rel} and @var{count}. - The argument @var{abfd} is ignored. - -*/ -/*ARGSUSED*/ -void -bfd_set_reloc (ignore_abfd, asect, location, count) - bfd *ignore_abfd; - sec_ptr asect; - arelent **location; - unsigned int count; -{ - asect->orelocation = location; - asect->reloc_count = count; -} - -/* -FUNCTION - bfd_set_file_flags - -SYNOPSIS - boolean bfd_set_file_flags(bfd *abfd, flagword flags); - -DESCRIPTION - Set the flag word in the BFD @var{abfd} to the value @var{flags}. - - Possible errors are: - o <<bfd_error_wrong_format>> - The target bfd was not of object format. - o <<bfd_error_invalid_operation>> - The target bfd was open for reading. - o <<bfd_error_invalid_operation>> - - The flag word contained a bit which was not applicable to the - type of file. E.g., an attempt was made to set the <<D_PAGED>> bit - on a BFD format which does not support demand paging. - -*/ - -boolean -bfd_set_file_flags (abfd, flags) - bfd *abfd; - flagword flags; -{ - if (abfd->format != bfd_object) { - bfd_set_error (bfd_error_wrong_format); - return false; - } - - if (bfd_read_p (abfd)) { - bfd_set_error (bfd_error_invalid_operation); - return false; - } - - bfd_get_file_flags (abfd) = flags; - if ((flags & bfd_applicable_file_flags (abfd)) != flags) { - bfd_set_error (bfd_error_invalid_operation); - return false; - } - -return true; -} - -void -bfd_assert (file, line) - const char *file; - int line; -{ - (*_bfd_error_handler) ("bfd assertion fail %s:%d", file, line); -} - - -/* -FUNCTION - bfd_set_start_address - -SYNOPSIS - boolean bfd_set_start_address(bfd *abfd, bfd_vma vma); - -DESCRIPTION - Make @var{vma} the entry point of output BFD @var{abfd}. - -RETURNS - Returns <<true>> on success, <<false>> otherwise. -*/ - -boolean -bfd_set_start_address(abfd, vma) -bfd *abfd; -bfd_vma vma; -{ - abfd->start_address = vma; - return true; -} - - -/* -FUNCTION - bfd_get_mtime - -SYNOPSIS - long bfd_get_mtime(bfd *abfd); - -DESCRIPTION - Return the file modification time (as read from the file system, or - from the archive header for archive members). - -*/ - -long -bfd_get_mtime (abfd) - bfd *abfd; -{ - FILE *fp; - struct stat buf; - - if (abfd->mtime_set) - return abfd->mtime; - - fp = bfd_cache_lookup (abfd); - if (0 != fstat (fileno (fp), &buf)) - return 0; - - abfd->mtime = buf.st_mtime; /* Save value in case anyone wants it */ - return buf.st_mtime; -} - -/* -FUNCTION - bfd_get_size - -SYNOPSIS - long bfd_get_size(bfd *abfd); - -DESCRIPTION - Return the file size (as read from file system) for the file - associated with BFD @var{abfd}. - - The initial motivation for, and use of, this routine is not - so we can get the exact size of the object the BFD applies to, since - that might not be generally possible (archive members for example). - It would be ideal if someone could eventually modify - it so that such results were guaranteed. - - Instead, we want to ask questions like "is this NNN byte sized - object I'm about to try read from file offset YYY reasonable?" - As as example of where we might do this, some object formats - use string tables for which the first <<sizeof(long)>> bytes of the - table contain the size of the table itself, including the size bytes. - If an application tries to read what it thinks is one of these - string tables, without some way to validate the size, and for - some reason the size is wrong (byte swapping error, wrong location - for the string table, etc.), the only clue is likely to be a read - error when it tries to read the table, or a "virtual memory - exhausted" error when it tries to allocate 15 bazillon bytes - of space for the 15 bazillon byte table it is about to read. - This function at least allows us to answer the quesion, "is the - size reasonable?". -*/ - -long -bfd_get_size (abfd) - bfd *abfd; -{ - FILE *fp; - struct stat buf; - - if ((abfd->flags & BFD_IN_MEMORY) != 0) - return ((struct bfd_in_memory *) abfd->iostream)->size; - - fp = bfd_cache_lookup (abfd); - if (0 != fstat (fileno (fp), &buf)) - return 0; - - return buf.st_size; -} - -/* -FUNCTION - bfd_get_gp_size - -SYNOPSIS - int bfd_get_gp_size(bfd *abfd); - -DESCRIPTION - Return the maximum size of objects to be optimized using the GP - register under MIPS ECOFF. This is typically set by the <<-G>> - argument to the compiler, assembler or linker. -*/ - -int -bfd_get_gp_size (abfd) - bfd *abfd; -{ - if (abfd->format == bfd_object) - { - if (abfd->xvec->flavour == bfd_target_ecoff_flavour) - return ecoff_data (abfd)->gp_size; - else if (abfd->xvec->flavour == bfd_target_elf_flavour) - return elf_gp_size (abfd); - } - return 0; -} - -/* -FUNCTION - bfd_set_gp_size - -SYNOPSIS - void bfd_set_gp_size(bfd *abfd, int i); - -DESCRIPTION - Set the maximum size of objects to be optimized using the GP - register under ECOFF or MIPS ELF. This is typically set by - the <<-G>> argument to the compiler, assembler or linker. -*/ - -void -bfd_set_gp_size (abfd, i) - bfd *abfd; - int i; -{ - /* Don't try to set GP size on an archive or core file! */ - if (abfd->format != bfd_object) - return; - if (abfd->xvec->flavour == bfd_target_ecoff_flavour) - ecoff_data (abfd)->gp_size = i; - else if (abfd->xvec->flavour == bfd_target_elf_flavour) - elf_gp_size (abfd) = i; -} - -/* Get the GP value. This is an internal function used by some of the - relocation special_function routines on targets which support a GP - register. */ - -bfd_vma -_bfd_get_gp_value (abfd) - bfd *abfd; -{ - if (abfd->format == bfd_object) - { - if (abfd->xvec->flavour == bfd_target_ecoff_flavour) - return ecoff_data (abfd)->gp; - else if (abfd->xvec->flavour == bfd_target_elf_flavour) - return elf_gp (abfd); - } - return 0; -} - -/* Set the GP value. */ - -void -_bfd_set_gp_value (abfd, v) - bfd *abfd; - bfd_vma v; -{ - if (abfd->format != bfd_object) - return; - if (abfd->xvec->flavour == bfd_target_ecoff_flavour) - ecoff_data (abfd)->gp = v; - else if (abfd->xvec->flavour == bfd_target_elf_flavour) - elf_gp (abfd) = v; -} - -/* -FUNCTION - bfd_scan_vma - -SYNOPSIS - bfd_vma bfd_scan_vma(CONST char *string, CONST char **end, int base); - -DESCRIPTION - Convert, like <<strtoul>>, a numerical expression - @var{string} into a <<bfd_vma>> integer, and return that integer. - (Though without as many bells and whistles as <<strtoul>>.) - The expression is assumed to be unsigned (i.e., positive). - If given a @var{base}, it is used as the base for conversion. - A base of 0 causes the function to interpret the string - in hex if a leading "0x" or "0X" is found, otherwise - in octal if a leading zero is found, otherwise in decimal. - - Overflow is not detected. -*/ - -bfd_vma -bfd_scan_vma (string, end, base) - CONST char *string; - CONST char **end; - int base; -{ - bfd_vma value; - int digit; - - /* Let the host do it if possible. */ - if (sizeof(bfd_vma) <= sizeof(unsigned long)) - return (bfd_vma) strtoul (string, (char **) end, base); - - /* A negative base makes no sense, and we only need to go as high as hex. */ - if ((base < 0) || (base > 16)) - return (bfd_vma) 0; - - if (base == 0) - { - if (string[0] == '0') - { - if ((string[1] == 'x') || (string[1] == 'X')) - base = 16; - /* XXX should we also allow "0b" or "0B" to set base to 2? */ - else - base = 8; - } - else - base = 10; - } - if ((base == 16) && - (string[0] == '0') && ((string[1] == 'x') || (string[1] == 'X'))) - string += 2; - /* XXX should we also skip over "0b" or "0B" if base is 2? */ - -/* Speed could be improved with a table like hex_value[] in gas. */ -#define HEX_VALUE(c) \ - (isxdigit(c) ? \ - (isdigit(c) ? \ - (c - '0') : \ - (10 + c - (islower(c) ? 'a' : 'A'))) : \ - 42) - - for (value = 0; (digit = HEX_VALUE(*string)) < base; string++) - { - value = value * base + digit; - } - - if (end) - *end = string; - - return value; -} - -/* -FUNCTION - bfd_copy_private_bfd_data - -SYNOPSIS - boolean bfd_copy_private_bfd_data(bfd *ibfd, bfd *obfd); - -DESCRIPTION - Copy private BFD information from the BFD @var{ibfd} to the - the BFD @var{obfd}. Return <<true>> on success, <<false>> on error. - Possible error returns are: - - o <<bfd_error_no_memory>> - - Not enough memory exists to create private data for @var{obfd}. - -.#define bfd_copy_private_bfd_data(ibfd, obfd) \ -. BFD_SEND (ibfd, _bfd_copy_private_bfd_data, \ -. (ibfd, obfd)) - -*/ - -/* -FUNCTION - bfd_merge_private_bfd_data - -SYNOPSIS - boolean bfd_merge_private_bfd_data(bfd *ibfd, bfd *obfd); - -DESCRIPTION - Merge private BFD information from the BFD @var{ibfd} to the - the output file BFD @var{obfd} when linking. Return <<true>> - on success, <<false>> on error. Possible error returns are: - - o <<bfd_error_no_memory>> - - Not enough memory exists to create private data for @var{obfd}. - -.#define bfd_merge_private_bfd_data(ibfd, obfd) \ -. BFD_SEND (ibfd, _bfd_merge_private_bfd_data, \ -. (ibfd, obfd)) - -*/ - -/* -FUNCTION - bfd_set_private_flags - -SYNOPSIS - boolean bfd_set_private_flags(bfd *abfd, flagword flags); - -DESCRIPTION - Set private BFD flag information in the BFD @var{abfd}. - Return <<true>> on success, <<false>> on error. Possible error - returns are: - - o <<bfd_error_no_memory>> - - Not enough memory exists to create private data for @var{obfd}. - -.#define bfd_set_private_flags(abfd, flags) \ -. BFD_SEND (abfd, _bfd_set_private_flags, \ -. (abfd, flags)) - -*/ - -/* -FUNCTION - stuff - -DESCRIPTION - Stuff which should be documented: - -.#define bfd_sizeof_headers(abfd, reloc) \ -. BFD_SEND (abfd, _bfd_sizeof_headers, (abfd, reloc)) -. -.#define bfd_find_nearest_line(abfd, sec, syms, off, file, func, line) \ -. BFD_SEND (abfd, _bfd_find_nearest_line, (abfd, sec, syms, off, file, func, line)) -. -. {* Do these three do anything useful at all, for any back end? *} -.#define bfd_debug_info_start(abfd) \ -. BFD_SEND (abfd, _bfd_debug_info_start, (abfd)) -. -.#define bfd_debug_info_end(abfd) \ -. BFD_SEND (abfd, _bfd_debug_info_end, (abfd)) -. -.#define bfd_debug_info_accumulate(abfd, section) \ -. BFD_SEND (abfd, _bfd_debug_info_accumulate, (abfd, section)) -. -. -.#define bfd_stat_arch_elt(abfd, stat) \ -. BFD_SEND (abfd, _bfd_stat_arch_elt,(abfd, stat)) -. -.#define bfd_update_armap_timestamp(abfd) \ -. BFD_SEND (abfd, _bfd_update_armap_timestamp, (abfd)) -. -.#define bfd_set_arch_mach(abfd, arch, mach)\ -. BFD_SEND ( abfd, _bfd_set_arch_mach, (abfd, arch, mach)) -. -.#define bfd_relax_section(abfd, section, link_info, again) \ -. BFD_SEND (abfd, _bfd_relax_section, (abfd, section, link_info, again)) -. -.#define bfd_link_hash_table_create(abfd) \ -. BFD_SEND (abfd, _bfd_link_hash_table_create, (abfd)) -. -.#define bfd_link_add_symbols(abfd, info) \ -. BFD_SEND (abfd, _bfd_link_add_symbols, (abfd, info)) -. -.#define bfd_final_link(abfd, info) \ -. BFD_SEND (abfd, _bfd_final_link, (abfd, info)) -. -.#define bfd_free_cached_info(abfd) \ -. BFD_SEND (abfd, _bfd_free_cached_info, (abfd)) -. -.#define bfd_get_dynamic_symtab_upper_bound(abfd) \ -. BFD_SEND (abfd, _bfd_get_dynamic_symtab_upper_bound, (abfd)) -. -.#define bfd_print_private_bfd_data(abfd, file)\ -. BFD_SEND (abfd, _bfd_print_private_bfd_data, (abfd, file)) -. -.#define bfd_canonicalize_dynamic_symtab(abfd, asymbols) \ -. BFD_SEND (abfd, _bfd_canonicalize_dynamic_symtab, (abfd, asymbols)) -. -.#define bfd_get_dynamic_reloc_upper_bound(abfd) \ -. BFD_SEND (abfd, _bfd_get_dynamic_reloc_upper_bound, (abfd)) -. -.#define bfd_canonicalize_dynamic_reloc(abfd, arels, asyms) \ -. BFD_SEND (abfd, _bfd_canonicalize_dynamic_reloc, (abfd, arels, asyms)) -. -.extern bfd_byte *bfd_get_relocated_section_contents -. PARAMS ((bfd *, struct bfd_link_info *, -. struct bfd_link_order *, bfd_byte *, -. boolean, asymbol **)); -. - -*/ - -bfd_byte * -bfd_get_relocated_section_contents (abfd, link_info, link_order, data, - relocateable, symbols) - bfd *abfd; - struct bfd_link_info *link_info; - struct bfd_link_order *link_order; - bfd_byte *data; - boolean relocateable; - asymbol **symbols; -{ - bfd *abfd2; - bfd_byte *(*fn) PARAMS ((bfd *, struct bfd_link_info *, - struct bfd_link_order *, bfd_byte *, boolean, - asymbol **)); - - if (link_order->type == bfd_indirect_link_order) - { - abfd2 = link_order->u.indirect.section->owner; - if (abfd2 == 0) - abfd2 = abfd; - } - else - abfd2 = abfd; - fn = abfd2->xvec->_bfd_get_relocated_section_contents; - - return (*fn) (abfd, link_info, link_order, data, relocateable, symbols); -} - -/* Record information about an ELF program header. */ - -boolean -bfd_record_phdr (abfd, type, flags_valid, flags, at_valid, at, - includes_filehdr, includes_phdrs, count, secs) - bfd *abfd; - unsigned long type; - boolean flags_valid; - flagword flags; - boolean at_valid; - bfd_vma at; - boolean includes_filehdr; - boolean includes_phdrs; - unsigned int count; - asection **secs; -{ - struct elf_segment_map *m, **pm; - - if (bfd_get_flavour (abfd) != bfd_target_elf_flavour) - return true; - - m = ((struct elf_segment_map *) - bfd_alloc (abfd, - (sizeof (struct elf_segment_map) - + (count - 1) * sizeof (asection *)))); - if (m == NULL) - return false; - - m->next = NULL; - m->p_type = type; - m->p_flags = flags; - m->p_paddr = at; - m->p_flags_valid = flags_valid; - m->p_paddr_valid = at_valid; - m->includes_filehdr = includes_filehdr; - m->includes_phdrs = includes_phdrs; - m->count = count; - if (count > 0) - memcpy (m->sections, secs, count * sizeof (asection *)); - - for (pm = &elf_tdata (abfd)->segment_map; *pm != NULL; pm = &(*pm)->next) - ; - *pm = m; - - return true; -} diff --git a/contrib/gdb/bfd/binary.c b/contrib/gdb/bfd/binary.c deleted file mode 100644 index a480e464e96bc..0000000000000 --- a/contrib/gdb/bfd/binary.c +++ /dev/null @@ -1,348 +0,0 @@ -/* BFD back-end for binary objects. - Copyright 1994 Free Software Foundation, Inc. - Written by Ian Lance Taylor, Cygnus Support, <ian@cygnus.com> - -This file is part of BFD, the Binary File Descriptor library. - -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 2 of the License, 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ - -/* This is a BFD backend which may be used to write binary objects. - It may only be used for output, not input. The intention is that - this may be used as an output format for objcopy in order to - generate raw binary data. - - This is very simple. The only complication is that the real data - will start at some address X, and in some cases we will not want to - include X zeroes just to get to that point. Since the start - address is not meaningful for this object file format, we use it - instead to indicate the number of zeroes to skip at the start of - the file. objcopy cooperates by specially setting the start - address to zero by default. */ - -#include <ctype.h> - -#include "bfd.h" -#include "sysdep.h" -#include "libbfd.h" - -/* Any bfd we create by reading a binary file has three symbols: - a start symbol, an end symbol, and an absolute length symbol. */ -#define BIN_SYMS 3 - -static boolean binary_mkobject PARAMS ((bfd *)); -static const bfd_target *binary_object_p PARAMS ((bfd *)); -static boolean binary_get_section_contents - PARAMS ((bfd *, asection *, PTR, file_ptr, bfd_size_type)); -static long binary_get_symtab_upper_bound PARAMS ((bfd *)); -static char *mangle_name PARAMS ((bfd *, char *)); -static long binary_get_symtab PARAMS ((bfd *, asymbol **)); -static asymbol *binary_make_empty_symbol PARAMS ((bfd *)); -static void binary_get_symbol_info PARAMS ((bfd *, asymbol *, symbol_info *)); -static boolean binary_set_section_contents - PARAMS ((bfd *, asection *, PTR, file_ptr, bfd_size_type)); -static int binary_sizeof_headers PARAMS ((bfd *, boolean)); - -/* Create a binary object. Invoked via bfd_set_format. */ - -static boolean -binary_mkobject (abfd) - bfd *abfd; -{ - return true; -} - -/* Any file may be considered to be a binary file, provided the target - was not defaulted. That is, it must be explicitly specified as - being binary. */ - -static const bfd_target * -binary_object_p (abfd) - bfd *abfd; -{ - struct stat statbuf; - asection *sec; - - if (abfd->target_defaulted) - { - bfd_set_error (bfd_error_wrong_format); - return NULL; - } - - abfd->symcount = BIN_SYMS; - - /* Find the file size. */ - if (bfd_stat (abfd, &statbuf) < 0) - { - bfd_set_error (bfd_error_system_call); - return NULL; - } - - /* One data section. */ - sec = bfd_make_section (abfd, ".data"); - if (sec == NULL) - return NULL; - sec->flags = SEC_ALLOC | SEC_LOAD | SEC_DATA | SEC_HAS_CONTENTS; - sec->vma = 0; - sec->_raw_size = statbuf.st_size; - sec->filepos = 0; - - abfd->tdata.any = (PTR) sec; - - return abfd->xvec; -} - -#define binary_close_and_cleanup _bfd_generic_close_and_cleanup -#define binary_bfd_free_cached_info _bfd_generic_bfd_free_cached_info -#define binary_new_section_hook _bfd_generic_new_section_hook - -/* Get contents of the only section. */ - -static boolean -binary_get_section_contents (abfd, section, location, offset, count) - bfd *abfd; - asection *section; - PTR location; - file_ptr offset; - bfd_size_type count; -{ - if (bfd_seek (abfd, offset, SEEK_SET) != 0 - || bfd_read (location, 1, count, abfd) != count) - return false; - return true; -} - -/* Return the amount of memory needed to read the symbol table. */ - -static long -binary_get_symtab_upper_bound (abfd) - bfd *abfd; -{ - return (BIN_SYMS + 1) * sizeof (asymbol *); -} - -/* Create a symbol name based on the bfd's filename. */ - -static char * -mangle_name (abfd, suffix) - bfd *abfd; - char *suffix; -{ - int size; - char *buf; - char *p; - - size = (strlen (bfd_get_filename (abfd)) - + strlen (suffix) - + sizeof "_binary__"); - - buf = (char *) bfd_alloc (abfd, size); - if (buf == NULL) - return ""; - - sprintf (buf, "_binary_%s_%s", bfd_get_filename (abfd), suffix); - - /* Change any non-alphanumeric characters to underscores. */ - for (p = buf; *p; p++) - if (! isalnum (*p)) - *p = '_'; - - return buf; -} - -/* Return the symbol table. */ - -static long -binary_get_symtab (abfd, alocation) - bfd *abfd; - asymbol **alocation; -{ - asection *sec = (asection *) abfd->tdata.any; - asymbol *syms; - unsigned int i; - - syms = (asymbol *) bfd_alloc (abfd, BIN_SYMS * sizeof (asymbol)); - if (syms == NULL) - return false; - - /* Start symbol. */ - syms[0].the_bfd = abfd; - syms[0].name = mangle_name (abfd, "start"); - syms[0].value = 0; - syms[0].flags = BSF_GLOBAL; - syms[0].section = sec; - syms[0].udata.p = NULL; - - /* End symbol. */ - syms[1].the_bfd = abfd; - syms[1].name = mangle_name (abfd, "end"); - syms[1].value = sec->_raw_size; - syms[1].flags = BSF_GLOBAL; - syms[1].section = sec; - syms[1].udata.p = NULL; - - /* Size symbol. */ - syms[2].the_bfd = abfd; - syms[2].name = mangle_name (abfd, "size"); - syms[2].value = sec->_raw_size; - syms[2].flags = BSF_GLOBAL; - syms[2].section = bfd_abs_section_ptr; - syms[2].udata.p = NULL; - - for (i = 0; i < BIN_SYMS; i++) - *alocation++ = syms++; - *alocation = NULL; - - return BIN_SYMS; -} - -/* Make an empty symbol. */ - -static asymbol * -binary_make_empty_symbol (abfd) - bfd *abfd; -{ - return (asymbol *) bfd_alloc (abfd, sizeof (asymbol)); -} - -#define binary_print_symbol _bfd_nosymbols_print_symbol - -/* Get information about a symbol. */ - -static void -binary_get_symbol_info (ignore_abfd, symbol, ret) - bfd *ignore_abfd; - asymbol *symbol; - symbol_info *ret; -{ - bfd_symbol_info (symbol, ret); -} - -#define binary_bfd_is_local_label bfd_generic_is_local_label -#define binary_get_lineno _bfd_nosymbols_get_lineno -#define binary_find_nearest_line _bfd_nosymbols_find_nearest_line -#define binary_bfd_make_debug_symbol _bfd_nosymbols_bfd_make_debug_symbol -#define binary_read_minisymbols _bfd_generic_read_minisymbols -#define binary_minisymbol_to_symbol _bfd_generic_minisymbol_to_symbol - -#define binary_get_reloc_upper_bound \ - ((long (*) PARAMS ((bfd *, asection *))) bfd_0l) -#define binary_canonicalize_reloc \ - ((long (*) PARAMS ((bfd *, asection *, arelent **, asymbol **))) bfd_0l) -#define binary_bfd_reloc_type_lookup _bfd_norelocs_bfd_reloc_type_lookup - -/* Set the architecture of a binary file. */ -#define binary_set_arch_mach _bfd_generic_set_arch_mach - -/* Write section contents of a binary file. */ - -static boolean -binary_set_section_contents (abfd, sec, data, offset, size) - bfd *abfd; - asection *sec; - PTR data; - file_ptr offset; - bfd_size_type size; -{ - if (! abfd->output_has_begun) - { - bfd_vma low; - asection *s; - - /* The lowest section VMA sets the virtual address of the start - of the file. We use the set the file position of all the - sections. */ - low = abfd->sections->vma; - for (s = abfd->sections->next; s != NULL; s = s->next) - if (s->vma < low) - low = s->vma; - - for (s = abfd->sections; s != NULL; s = s->next) - s->filepos = s->vma - low; - - abfd->output_has_begun = true; - } - - return _bfd_generic_set_section_contents (abfd, sec, data, offset, size); -} - -/* No space is required for header information. */ - -static int -binary_sizeof_headers (abfd, exec) - bfd *abfd; - boolean exec; -{ - return 0; -} - -#define binary_bfd_get_relocated_section_contents \ - bfd_generic_get_relocated_section_contents -#define binary_bfd_relax_section bfd_generic_relax_section -#define binary_bfd_link_hash_table_create _bfd_generic_link_hash_table_create -#define binary_bfd_link_add_symbols _bfd_generic_link_add_symbols -#define binary_bfd_final_link _bfd_generic_final_link -#define binary_bfd_link_split_section _bfd_generic_link_split_section -#define binary_get_section_contents_in_window \ - _bfd_generic_get_section_contents_in_window - -const bfd_target binary_vec = -{ - "binary", /* name */ - bfd_target_unknown_flavour, /* flavour */ - BFD_ENDIAN_UNKNOWN, /* byteorder */ - BFD_ENDIAN_UNKNOWN, /* header_byteorder */ - EXEC_P, /* object_flags */ - (SEC_ALLOC | SEC_LOAD | SEC_READONLY | SEC_CODE | SEC_DATA - | SEC_ROM | SEC_HAS_CONTENTS), /* section_flags */ - 0, /* symbol_leading_char */ - ' ', /* ar_pad_char */ - 16, /* ar_max_namelen */ - bfd_getb64, bfd_getb_signed_64, bfd_putb64, - bfd_getb32, bfd_getb_signed_32, bfd_putb32, - bfd_getb16, bfd_getb_signed_16, bfd_putb16, /* data */ - bfd_getb64, bfd_getb_signed_64, bfd_putb64, - bfd_getb32, bfd_getb_signed_32, bfd_putb32, - bfd_getb16, bfd_getb_signed_16, bfd_putb16, /* hdrs */ - { /* bfd_check_format */ - _bfd_dummy_target, - binary_object_p, /* bfd_check_format */ - _bfd_dummy_target, - _bfd_dummy_target, - }, - { /* bfd_set_format */ - bfd_false, - binary_mkobject, - bfd_false, - bfd_false, - }, - { /* bfd_write_contents */ - bfd_false, - bfd_true, - bfd_false, - bfd_false, - }, - - BFD_JUMP_TABLE_GENERIC (binary), - BFD_JUMP_TABLE_COPY (_bfd_generic), - BFD_JUMP_TABLE_CORE (_bfd_nocore), - BFD_JUMP_TABLE_ARCHIVE (_bfd_noarchive), - BFD_JUMP_TABLE_SYMBOLS (binary), - BFD_JUMP_TABLE_RELOCS (binary), - BFD_JUMP_TABLE_WRITE (binary), - BFD_JUMP_TABLE_LINK (binary), - BFD_JUMP_TABLE_DYNAMIC (_bfd_nodynamic), - - NULL -}; diff --git a/contrib/gdb/bfd/bout.c b/contrib/gdb/bfd/bout.c deleted file mode 100644 index 9da4b825b02a2..0000000000000 --- a/contrib/gdb/bfd/bout.c +++ /dev/null @@ -1,1471 +0,0 @@ -/* BFD back-end for Intel 960 b.out binaries. - Copyright 1990, 91, 92, 93, 94, 95, 1996 Free Software Foundation, Inc. - Written by Cygnus Support. - -This file is part of BFD, the Binary File Descriptor library. - -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 2 of the License, 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ - - -#include "bfd.h" -#include "sysdep.h" -#include "libbfd.h" -#include "bfdlink.h" -#include "genlink.h" -#include "bout.h" - -#include "aout/stab_gnu.h" -#include "libaout.h" /* BFD a.out internal data structures */ - - -static int aligncode PARAMS ((bfd *abfd, asection *input_section, - arelent *r, unsigned int shrink)); -static void perform_slip PARAMS ((bfd *abfd, unsigned int slip, - asection *input_section, bfd_vma value)); -static boolean b_out_squirt_out_relocs PARAMS ((bfd *abfd, asection *section)); -static const bfd_target *b_out_callback PARAMS ((bfd *)); -static bfd_reloc_status_type calljx_callback - PARAMS ((bfd *, struct bfd_link_info *, arelent *, PTR src, PTR dst, - asection *)); -static bfd_reloc_status_type callj_callback - PARAMS ((bfd *, struct bfd_link_info *, arelent *, PTR data, - unsigned int srcidx, unsigned int dstidx, asection *, boolean)); -static bfd_vma get_value PARAMS ((arelent *, struct bfd_link_info *, - asection *)); -static int abs32code PARAMS ((bfd *, asection *, arelent *, - unsigned int, struct bfd_link_info *)); -static boolean b_out_bfd_relax_section PARAMS ((bfd *, asection *, - struct bfd_link_info *, - boolean *)); -static bfd_byte *b_out_bfd_get_relocated_section_contents - PARAMS ((bfd *, struct bfd_link_info *, struct bfd_link_order *, - bfd_byte *, boolean, asymbol **)); - -/* Swaps the information in an executable header taken from a raw byte - stream memory image, into the internal exec_header structure. */ - -void -bout_swap_exec_header_in (abfd, raw_bytes, execp) - bfd *abfd; - struct external_exec *raw_bytes; - struct internal_exec *execp; -{ - struct external_exec *bytes = (struct external_exec *)raw_bytes; - - /* Now fill in fields in the execp, from the bytes in the raw data. */ - execp->a_info = bfd_h_get_32 (abfd, bytes->e_info); - execp->a_text = GET_WORD (abfd, bytes->e_text); - execp->a_data = GET_WORD (abfd, bytes->e_data); - execp->a_bss = GET_WORD (abfd, bytes->e_bss); - execp->a_syms = GET_WORD (abfd, bytes->e_syms); - execp->a_entry = GET_WORD (abfd, bytes->e_entry); - execp->a_trsize = GET_WORD (abfd, bytes->e_trsize); - execp->a_drsize = GET_WORD (abfd, bytes->e_drsize); - execp->a_tload = GET_WORD (abfd, bytes->e_tload); - execp->a_dload = GET_WORD (abfd, bytes->e_dload); - execp->a_talign = bytes->e_talign[0]; - execp->a_dalign = bytes->e_dalign[0]; - execp->a_balign = bytes->e_balign[0]; - execp->a_relaxable = bytes->e_relaxable[0]; -} - -/* Swaps the information in an internal exec header structure into the - supplied buffer ready for writing to disk. */ - -PROTO(void, bout_swap_exec_header_out, - (bfd *abfd, - struct internal_exec *execp, - struct external_exec *raw_bytes)); -void -bout_swap_exec_header_out (abfd, execp, raw_bytes) - bfd *abfd; - struct internal_exec *execp; - struct external_exec *raw_bytes; -{ - struct external_exec *bytes = (struct external_exec *)raw_bytes; - - /* Now fill in fields in the raw data, from the fields in the exec struct. */ - bfd_h_put_32 (abfd, execp->a_info , bytes->e_info); - PUT_WORD (abfd, execp->a_text , bytes->e_text); - PUT_WORD (abfd, execp->a_data , bytes->e_data); - PUT_WORD (abfd, execp->a_bss , bytes->e_bss); - PUT_WORD (abfd, execp->a_syms , bytes->e_syms); - PUT_WORD (abfd, execp->a_entry , bytes->e_entry); - PUT_WORD (abfd, execp->a_trsize, bytes->e_trsize); - PUT_WORD (abfd, execp->a_drsize, bytes->e_drsize); - PUT_WORD (abfd, execp->a_tload , bytes->e_tload); - PUT_WORD (abfd, execp->a_dload , bytes->e_dload); - bytes->e_talign[0] = execp->a_talign; - bytes->e_dalign[0] = execp->a_dalign; - bytes->e_balign[0] = execp->a_balign; - bytes->e_relaxable[0] = execp->a_relaxable; -} - - -static const bfd_target * -b_out_object_p (abfd) - bfd *abfd; -{ - struct internal_exec anexec; - struct external_exec exec_bytes; - - if (bfd_read ((PTR) &exec_bytes, 1, EXEC_BYTES_SIZE, abfd) - != EXEC_BYTES_SIZE) { - if (bfd_get_error () != bfd_error_system_call) - bfd_set_error (bfd_error_wrong_format); - return 0; - } - - anexec.a_info = bfd_h_get_32 (abfd, exec_bytes.e_info); - - if (N_BADMAG (anexec)) { - bfd_set_error (bfd_error_wrong_format); - return 0; - } - - bout_swap_exec_header_in (abfd, &exec_bytes, &anexec); - return aout_32_some_aout_object_p (abfd, &anexec, b_out_callback); -} - - -/* Finish up the opening of a b.out file for reading. Fill in all the - fields that are not handled by common code. */ - -static const bfd_target * -b_out_callback (abfd) - bfd *abfd; -{ - struct internal_exec *execp = exec_hdr (abfd); - unsigned long bss_start; - - /* Architecture and machine type */ - bfd_set_arch_mach(abfd, - bfd_arch_i960, /* B.out only used on i960 */ - bfd_mach_i960_core /* Default */ - ); - - /* The positions of the string table and symbol table. */ - obj_str_filepos (abfd) = N_STROFF (*execp); - obj_sym_filepos (abfd) = N_SYMOFF (*execp); - - /* The alignments of the sections */ - obj_textsec (abfd)->alignment_power = execp->a_talign; - obj_datasec (abfd)->alignment_power = execp->a_dalign; - obj_bsssec (abfd)->alignment_power = execp->a_balign; - - /* The starting addresses of the sections. */ - obj_textsec (abfd)->vma = execp->a_tload; - obj_datasec (abfd)->vma = execp->a_dload; - - /* And reload the sizes, since the aout module zaps them */ - obj_textsec (abfd)->_raw_size = execp->a_text; - - bss_start = execp->a_dload + execp->a_data; /* BSS = end of data section */ - obj_bsssec (abfd)->vma = align_power (bss_start, execp->a_balign); - - /* The file positions of the sections */ - obj_textsec (abfd)->filepos = N_TXTOFF(*execp); - obj_datasec (abfd)->filepos = N_DATOFF(*execp); - - /* The file positions of the relocation info */ - obj_textsec (abfd)->rel_filepos = N_TROFF(*execp); - obj_datasec (abfd)->rel_filepos = N_DROFF(*execp); - - adata(abfd).page_size = 1; /* Not applicable. */ - adata(abfd).segment_size = 1; /* Not applicable. */ - adata(abfd).exec_bytes_size = EXEC_BYTES_SIZE; - - if (execp->a_relaxable) - abfd->flags |= BFD_IS_RELAXABLE; - return abfd->xvec; -} - -struct bout_data_struct { - struct aoutdata a; - struct internal_exec e; -}; - -static boolean -b_out_mkobject (abfd) - bfd *abfd; -{ - struct bout_data_struct *rawptr; - - rawptr = (struct bout_data_struct *) bfd_zalloc (abfd, sizeof (struct bout_data_struct)); - if (rawptr == NULL) - return false; - - abfd->tdata.bout_data = rawptr; - exec_hdr (abfd) = &rawptr->e; - - obj_textsec (abfd) = (asection *)NULL; - obj_datasec (abfd) = (asection *)NULL; - obj_bsssec (abfd) = (asection *)NULL; - - return true; -} - -static boolean -b_out_write_object_contents (abfd) - bfd *abfd; -{ - struct external_exec swapped_hdr; - - if (! aout_32_make_sections (abfd)) - return false; - - exec_hdr (abfd)->a_info = BMAGIC; - - exec_hdr (abfd)->a_text = obj_textsec (abfd)->_raw_size; - exec_hdr (abfd)->a_data = obj_datasec (abfd)->_raw_size; - exec_hdr (abfd)->a_bss = obj_bsssec (abfd)->_raw_size; - exec_hdr (abfd)->a_syms = bfd_get_symcount (abfd) * sizeof (struct nlist); - exec_hdr (abfd)->a_entry = bfd_get_start_address (abfd); - exec_hdr (abfd)->a_trsize = ((obj_textsec (abfd)->reloc_count) * - sizeof (struct relocation_info)); - exec_hdr (abfd)->a_drsize = ((obj_datasec (abfd)->reloc_count) * - sizeof (struct relocation_info)); - - exec_hdr (abfd)->a_talign = obj_textsec (abfd)->alignment_power; - exec_hdr (abfd)->a_dalign = obj_datasec (abfd)->alignment_power; - exec_hdr (abfd)->a_balign = obj_bsssec (abfd)->alignment_power; - - exec_hdr (abfd)->a_tload = obj_textsec (abfd)->vma; - exec_hdr (abfd)->a_dload = obj_datasec (abfd)->vma; - - bout_swap_exec_header_out (abfd, exec_hdr (abfd), &swapped_hdr); - - if (bfd_seek (abfd, (file_ptr) 0, SEEK_SET) != 0 - || (bfd_write ((PTR) &swapped_hdr, 1, EXEC_BYTES_SIZE, abfd) - != EXEC_BYTES_SIZE)) - return false; - - /* Now write out reloc info, followed by syms and strings */ - if (bfd_get_symcount (abfd) != 0) - { - if (bfd_seek (abfd, (file_ptr)(N_SYMOFF(*exec_hdr(abfd))), SEEK_SET) - != 0) - return false; - - if (! aout_32_write_syms (abfd)) - return false; - - if (bfd_seek (abfd, (file_ptr)(N_TROFF(*exec_hdr(abfd))), SEEK_SET) != 0) - return false; - - if (!b_out_squirt_out_relocs (abfd, obj_textsec (abfd))) return false; - if (bfd_seek (abfd, (file_ptr)(N_DROFF(*exec_hdr(abfd))), SEEK_SET) - != 0) - return false; - - if (!b_out_squirt_out_relocs (abfd, obj_datasec (abfd))) return false; - } - return true; -} - -/** Some reloc hackery */ - -#define CALLS 0x66003800 /* Template for 'calls' instruction */ -#define BAL 0x0b000000 /* Template for 'bal' instruction */ -#define BALX 0x85000000 /* Template for 'balx' instruction */ -#define BAL_MASK 0x00ffffff -#define CALL 0x09000000 -#define PCREL13_MASK 0x1fff - - -#define output_addr(sec) ((sec)->output_offset+(sec)->output_section->vma) - -/* Magic to turn callx into calljx */ -static bfd_reloc_status_type -calljx_callback (abfd, link_info, reloc_entry, src, dst, input_section) - bfd *abfd; - struct bfd_link_info *link_info; - arelent *reloc_entry; - PTR src; - PTR dst; - asection *input_section; -{ - int word = bfd_get_32 (abfd, src); - asymbol *symbol_in = *(reloc_entry->sym_ptr_ptr); - aout_symbol_type *symbol = aout_symbol (symbol_in); - bfd_vma value; - - value = get_value (reloc_entry, link_info, input_section); - - if (IS_CALLNAME (symbol->other)) - { - aout_symbol_type *balsym = symbol+1; - int inst = bfd_get_32 (abfd, (bfd_byte *) src-4); - /* The next symbol should be an N_BALNAME */ - BFD_ASSERT (IS_BALNAME (balsym->other)); - inst &= BAL_MASK; - inst |= BALX; - bfd_put_32 (abfd, inst, (bfd_byte *) dst-4); - symbol = balsym; - value = (symbol->symbol.value - + output_addr (symbol->symbol.section)); - } - - word += value + reloc_entry->addend; - - bfd_put_32(abfd, word, dst); - return bfd_reloc_ok; -} - - -/* Magic to turn call into callj */ -static bfd_reloc_status_type -callj_callback (abfd, link_info, reloc_entry, data, srcidx, dstidx, - input_section, shrinking) - bfd *abfd; - struct bfd_link_info *link_info; - arelent *reloc_entry; - PTR data; - unsigned int srcidx; - unsigned int dstidx; - asection *input_section; - boolean shrinking; -{ - int word = bfd_get_32 (abfd, (bfd_byte *) data + srcidx); - asymbol *symbol_in = *(reloc_entry->sym_ptr_ptr); - aout_symbol_type *symbol = aout_symbol (symbol_in); - bfd_vma value; - - value = get_value (reloc_entry, link_info, input_section); - - if (IS_OTHER(symbol->other)) - { - /* Call to a system procedure - replace code with system - procedure number. */ - word = CALLS | (symbol->other - 1); - } - else if (IS_CALLNAME(symbol->other)) - { - aout_symbol_type *balsym = symbol+1; - - /* The next symbol should be an N_BALNAME. */ - BFD_ASSERT(IS_BALNAME(balsym->other)); - - /* We are calling a leaf, so replace the call instruction with a - bal. */ - word = BAL | ((word - + output_addr (balsym->symbol.section) - + balsym->symbol.value + reloc_entry->addend - - dstidx - - output_addr (input_section)) - & BAL_MASK); - } - else if ((symbol->symbol.flags & BSF_SECTION_SYM) != 0) - { - /* A callj against a symbol in the same section is a fully - resolved relative call. We don't need to do anything here. - If the symbol is not in the same section, I'm not sure what - to do; fortunately, this case will probably never arise. */ - BFD_ASSERT (! shrinking); - BFD_ASSERT (symbol->symbol.section == input_section); - } - else - { - word = CALL | (((word & BAL_MASK) - + value - + reloc_entry->addend - - (shrinking ? dstidx : 0) - - output_addr (input_section)) - & BAL_MASK); - } - bfd_put_32(abfd, word, (bfd_byte *) data + dstidx); - return bfd_reloc_ok; -} - -/* type rshift size bitsize pcrel bitpos absolute overflow check*/ - -#define ABS32CODE 0 -#define ABS32CODE_SHRUNK 1 -#define PCREL24 2 -#define CALLJ 3 -#define ABS32 4 -#define PCREL13 5 -#define ABS32_MAYBE_RELAXABLE 1 -#define ABS32_WAS_RELAXABLE 2 - -#define ALIGNER 10 -#define ALIGNDONE 11 -static reloc_howto_type howto_reloc_callj = -HOWTO(CALLJ, 0, 2, 24, true, 0, complain_overflow_signed, 0,"callj", true, 0x00ffffff, 0x00ffffff,false); -static reloc_howto_type howto_reloc_abs32 = -HOWTO(ABS32, 0, 2, 32, false, 0, complain_overflow_bitfield,0,"abs32", true, 0xffffffff,0xffffffff,false); -static reloc_howto_type howto_reloc_pcrel24 = -HOWTO(PCREL24, 0, 2, 24, true, 0, complain_overflow_signed,0,"pcrel24", true, 0x00ffffff,0x00ffffff,false); - -static reloc_howto_type howto_reloc_pcrel13 = -HOWTO(PCREL13, 0, 2, 13, true, 0, complain_overflow_signed,0,"pcrel13", true, 0x00001fff,0x00001fff,false); - - -static reloc_howto_type howto_reloc_abs32codeshrunk = -HOWTO(ABS32CODE_SHRUNK, 0, 2, 24, true, 0, complain_overflow_signed, 0,"callx->callj", true, 0x00ffffff, 0x00ffffff,false); - -static reloc_howto_type howto_reloc_abs32code = -HOWTO(ABS32CODE, 0, 2, 32, false, 0, complain_overflow_bitfield,0,"callx", true, 0xffffffff,0xffffffff,false); - -static reloc_howto_type howto_align_table[] = { - HOWTO (ALIGNER, 0, 0x1, 0, false, 0, complain_overflow_dont, 0, "align16", false, 0, 0, false), - HOWTO (ALIGNER, 0, 0x3, 0, false, 0, complain_overflow_dont, 0, "align32", false, 0, 0, false), - HOWTO (ALIGNER, 0, 0x7, 0, false, 0, complain_overflow_dont, 0, "align64", false, 0, 0, false), - HOWTO (ALIGNER, 0, 0xf, 0, false, 0, complain_overflow_dont, 0, "align128", false, 0, 0, false), -}; - -static reloc_howto_type howto_done_align_table[] = { - HOWTO (ALIGNDONE, 0x1, 0x1, 0, false, 0, complain_overflow_dont, 0, "donealign16", false, 0, 0, false), - HOWTO (ALIGNDONE, 0x3, 0x3, 0, false, 0, complain_overflow_dont, 0, "donealign32", false, 0, 0, false), - HOWTO (ALIGNDONE, 0x7, 0x7, 0, false, 0, complain_overflow_dont, 0, "donealign64", false, 0, 0, false), - HOWTO (ALIGNDONE, 0xf, 0xf, 0, false, 0, complain_overflow_dont, 0, "donealign128", false, 0, 0, false), -}; - -static reloc_howto_type * -b_out_bfd_reloc_type_lookup (abfd, code) - bfd *abfd; - bfd_reloc_code_real_type code; -{ - switch (code) - { - default: - return 0; - case BFD_RELOC_I960_CALLJ: - return &howto_reloc_callj; - case BFD_RELOC_32: - case BFD_RELOC_CTOR: - return &howto_reloc_abs32; - case BFD_RELOC_24_PCREL: - return &howto_reloc_pcrel24; - } -} - -/* Allocate enough room for all the reloc entries, plus pointers to them all */ - -static boolean -b_out_slurp_reloc_table (abfd, asect, symbols) - bfd *abfd; - sec_ptr asect; - asymbol **symbols; -{ - register struct relocation_info *rptr; - unsigned int counter ; - arelent *cache_ptr ; - int extern_mask, pcrel_mask, callj_mask, length_shift; - int incode_mask; - int size_mask; - bfd_vma prev_addr = 0; - unsigned int count; - size_t reloc_size; - struct relocation_info *relocs; - arelent *reloc_cache; - - if (asect->relocation) - return true; - if (!aout_32_slurp_symbol_table (abfd)) - return false; - - if (asect == obj_datasec (abfd)) { - reloc_size = exec_hdr(abfd)->a_drsize; - goto doit; - } - - if (asect == obj_textsec (abfd)) { - reloc_size = exec_hdr(abfd)->a_trsize; - goto doit; - } - - if (asect == obj_bsssec (abfd)) { - reloc_size = 0; - goto doit; - } - - bfd_set_error (bfd_error_invalid_operation); - return false; - - doit: - if (bfd_seek (abfd, (file_ptr)(asect->rel_filepos), SEEK_SET) != 0) - return false; - count = reloc_size / sizeof (struct relocation_info); - - relocs = (struct relocation_info *) bfd_malloc (reloc_size); - if (!relocs && reloc_size != 0) - return false; - reloc_cache = (arelent *) bfd_malloc ((count+1) * sizeof (arelent)); - if (!reloc_cache) { - if (relocs != NULL) - free ((char*)relocs); - return false; - } - - if (bfd_read ((PTR) relocs, 1, reloc_size, abfd) != reloc_size) { - free (reloc_cache); - if (relocs != NULL) - free (relocs); - return false; - } - - - - if (bfd_header_big_endian (abfd)) { - /* big-endian bit field allocation order */ - pcrel_mask = 0x80; - extern_mask = 0x10; - incode_mask = 0x08; - callj_mask = 0x02; - size_mask = 0x20; - length_shift = 5; - } else { - /* little-endian bit field allocation order */ - pcrel_mask = 0x01; - extern_mask = 0x08; - incode_mask = 0x10; - callj_mask = 0x40; - size_mask = 0x02; - length_shift = 1; - } - - for (rptr = relocs, cache_ptr = reloc_cache, counter = 0; - counter < count; - counter++, rptr++, cache_ptr++) - { - unsigned char *raw = (unsigned char *)rptr; - unsigned int symnum; - cache_ptr->address = bfd_h_get_32 (abfd, raw + 0); - cache_ptr->howto = 0; - if (bfd_header_big_endian (abfd)) - { - symnum = (raw[4] << 16) | (raw[5] << 8) | raw[6]; - } - else - { - symnum = (raw[6] << 16) | (raw[5] << 8) | raw[4]; - } - - if (raw[7] & extern_mask) - { - /* if this is set then the r_index is a index into the symbol table; - * if the bit is not set then r_index contains a section map. - * we either fill in the sym entry with a pointer to the symbol, - * or point to the correct section - */ - cache_ptr->sym_ptr_ptr = symbols + symnum; - cache_ptr->addend = 0; - } else - { - /* in a.out symbols are relative to the beginning of the - * file rather than sections ? - * (look in translate_from_native_sym_flags) - * the reloc entry addend has added to it the offset into the - * file of the data, so subtract the base to make the reloc - * section relative */ - int s; - { - /* sign-extend symnum from 24 bits to whatever host uses */ - s = symnum; - if (s & (1 << 23)) - s |= (~0) << 24; - } - cache_ptr->sym_ptr_ptr = (asymbol **)NULL; - switch (s) - { - case N_TEXT: - case N_TEXT | N_EXT: - cache_ptr->sym_ptr_ptr = obj_textsec(abfd)->symbol_ptr_ptr; - cache_ptr->addend = - obj_textsec(abfd)->vma; - break; - case N_DATA: - case N_DATA | N_EXT: - cache_ptr->sym_ptr_ptr = obj_datasec(abfd)->symbol_ptr_ptr; - cache_ptr->addend = - obj_datasec(abfd)->vma; - break; - case N_BSS: - case N_BSS | N_EXT: - cache_ptr->sym_ptr_ptr = obj_bsssec(abfd)->symbol_ptr_ptr; - cache_ptr->addend = - obj_bsssec(abfd)->vma; - break; - case N_ABS: - case N_ABS | N_EXT: - cache_ptr->sym_ptr_ptr = obj_bsssec(abfd)->symbol_ptr_ptr; - cache_ptr->addend = 0; - break; - case -2: /* .align */ - if (raw[7] & pcrel_mask) - { - cache_ptr->howto = &howto_align_table[(raw[7] >> length_shift) & 3]; - cache_ptr->sym_ptr_ptr = bfd_abs_section_ptr->symbol_ptr_ptr; - } - else - { - /* .org? */ - abort (); - } - cache_ptr->addend = 0; - break; - default: - BFD_ASSERT(0); - break; - } - - } - - /* the i960 only has a few relocation types: - abs 32-bit and pcrel 24bit. except for callj's! */ - if (cache_ptr->howto != 0) - ; - else if (raw[7] & callj_mask) - { - cache_ptr->howto = &howto_reloc_callj; - } - else if ( raw[7] & pcrel_mask) - { - if (raw[7] & size_mask) - cache_ptr->howto = &howto_reloc_pcrel13; - else - cache_ptr->howto = &howto_reloc_pcrel24; - } - else - { - if (raw[7] & incode_mask) - { - cache_ptr->howto = &howto_reloc_abs32code; - } - else - { - cache_ptr->howto = &howto_reloc_abs32; - } - } - if (cache_ptr->address < prev_addr) - { - /* Ouch! this reloc is out of order, insert into the right place - */ - arelent tmp; - arelent *cursor = cache_ptr-1; - bfd_vma stop = cache_ptr->address; - tmp = *cache_ptr; - while (cursor->address > stop && cursor >= reloc_cache) - { - cursor[1] = cursor[0]; - cursor--; - } - cursor[1] = tmp; - } - else - { - prev_addr = cache_ptr->address; - } - } - - - if (relocs != NULL) - free (relocs); - asect->relocation = reloc_cache; - asect->reloc_count = count; - - - return true; -} - - -static boolean -b_out_squirt_out_relocs (abfd, section) - bfd *abfd; - asection *section; -{ - arelent **generic; - int r_extern = 0; - int r_idx; - int incode_mask; - int len_1; - unsigned int count = section->reloc_count; - struct relocation_info *native, *natptr; - size_t natsize = count * sizeof (struct relocation_info); - int extern_mask, pcrel_mask, len_2, callj_mask; - if (count == 0) return true; - generic = section->orelocation; - native = ((struct relocation_info *) bfd_malloc (natsize)); - if (!native && natsize != 0) - return false; - - if (bfd_header_big_endian (abfd)) - { - /* Big-endian bit field allocation order */ - pcrel_mask = 0x80; - extern_mask = 0x10; - len_2 = 0x40; - len_1 = 0x20; - callj_mask = 0x02; - incode_mask = 0x08; - } - else - { - /* Little-endian bit field allocation order */ - pcrel_mask = 0x01; - extern_mask = 0x08; - len_2 = 0x04; - len_1 = 0x02; - callj_mask = 0x40; - incode_mask = 0x10; - } - - for (natptr = native; count > 0; --count, ++natptr, ++generic) - { - arelent *g = *generic; - unsigned char *raw = (unsigned char *)natptr; - asymbol *sym = *(g->sym_ptr_ptr); - - asection *output_section = sym->section->output_section; - - bfd_h_put_32(abfd, g->address, raw); - /* Find a type in the output format which matches the input howto - - * at the moment we assume input format == output format FIXME!! - */ - r_idx = 0; - /* FIXME: Need callj stuff here, and to check the howto entries to - be sure they are real for this architecture. */ - if (g->howto== &howto_reloc_callj) - { - raw[7] = callj_mask + pcrel_mask + len_2; - } - else if (g->howto == &howto_reloc_pcrel24) - { - raw[7] = pcrel_mask + len_2; - } - else if (g->howto == &howto_reloc_pcrel13) - { - raw[7] = pcrel_mask + len_1; - } - else if (g->howto == &howto_reloc_abs32code) - { - raw[7] = len_2 + incode_mask; - } - else if (g->howto >= howto_align_table - && g->howto <= (howto_align_table - + sizeof (howto_align_table) / sizeof (howto_align_table[0]) - - 1)) - { - /* symnum == -2; extern_mask not set, pcrel_mask set */ - r_idx = -2; - r_extern = 0; - raw[7] = (pcrel_mask - | ((g->howto - howto_align_table) << 1)); - } - else { - raw[7] = len_2; - } - - if (r_idx != 0) - /* already mucked with r_extern, r_idx */; - else if (bfd_is_com_section (output_section) - || bfd_is_abs_section (output_section) - || bfd_is_und_section (output_section)) - { - - if (bfd_abs_section_ptr->symbol == sym) - { - /* Whoops, looked like an abs symbol, but is really an offset - from the abs section */ - r_idx = 0; - r_extern = 0; - } - else - { - /* Fill in symbol */ - - r_extern = 1; - r_idx = (*g->sym_ptr_ptr)->udata.i; - } - } - else - { - /* Just an ordinary section */ - r_extern = 0; - r_idx = output_section->target_index; - } - - if (bfd_header_big_endian (abfd)) { - raw[4] = (unsigned char) (r_idx >> 16); - raw[5] = (unsigned char) (r_idx >> 8); - raw[6] = (unsigned char) (r_idx ); - } else { - raw[6] = (unsigned char) (r_idx >> 16); - raw[5] = (unsigned char) (r_idx>> 8); - raw[4] = (unsigned char) (r_idx ); - } - if (r_extern) - raw[7] |= extern_mask; - } - - if (bfd_write ((PTR) native, 1, natsize, abfd) != natsize) { - free((PTR)native); - return false; - } - free ((PTR)native); - - return true; -} - -/* This is stupid. This function should be a boolean predicate */ -static long -b_out_canonicalize_reloc (abfd, section, relptr, symbols) - bfd *abfd; - sec_ptr section; - arelent **relptr; - asymbol **symbols; -{ - arelent *tblptr; - unsigned int count; - - if ((section->flags & SEC_CONSTRUCTOR) != 0) - { - arelent_chain *chain = section->constructor_chain; - for (count = 0; count < section->reloc_count; count++) - { - *relptr++ = &chain->relent; - chain = chain->next; - } - } - else - { - if (section->relocation == NULL - && ! b_out_slurp_reloc_table (abfd, section, symbols)) - return -1; - - tblptr = section->relocation; - for (count = 0; count++ < section->reloc_count;) - *relptr++ = tblptr++; - } - - *relptr = NULL; - - return section->reloc_count; -} - -static long -b_out_get_reloc_upper_bound (abfd, asect) - bfd *abfd; - sec_ptr asect; -{ - if (bfd_get_format (abfd) != bfd_object) { - bfd_set_error (bfd_error_invalid_operation); - return -1; - } - - if (asect->flags & SEC_CONSTRUCTOR) - return sizeof (arelent *) * (asect->reloc_count + 1); - - if (asect == obj_datasec (abfd)) - return (sizeof (arelent *) * - ((exec_hdr(abfd)->a_drsize / sizeof (struct relocation_info)) - +1)); - - if (asect == obj_textsec (abfd)) - return (sizeof (arelent *) * - ((exec_hdr(abfd)->a_trsize / sizeof (struct relocation_info)) - +1)); - - if (asect == obj_bsssec (abfd)) - return 0; - - bfd_set_error (bfd_error_invalid_operation); - return -1; -} - -static boolean -b_out_set_section_contents (abfd, section, location, offset, count) - bfd *abfd; - asection *section; - PTR location; - file_ptr offset; - bfd_size_type count; -{ - - if (abfd->output_has_begun == false) { /* set by bfd.c handler */ - if (! aout_32_make_sections (abfd)) - return false; - - obj_textsec (abfd)->filepos = sizeof(struct internal_exec); - obj_datasec(abfd)->filepos = obj_textsec(abfd)->filepos - + obj_textsec (abfd)->_raw_size; - - } - /* regardless, once we know what we're doing, we might as well get going */ - if (bfd_seek (abfd, section->filepos + offset, SEEK_SET) != 0) - return false; - - if (count != 0) { - return (bfd_write ((PTR)location, 1, count, abfd) == count) ?true:false; - } - return true; -} - -static boolean -b_out_set_arch_mach (abfd, arch, machine) - bfd *abfd; - enum bfd_architecture arch; - unsigned long machine; -{ - bfd_default_set_arch_mach(abfd, arch, machine); - - if (arch == bfd_arch_unknown) /* Unknown machine arch is OK */ - return true; - if (arch == bfd_arch_i960) /* i960 default is OK */ - switch (machine) { - case bfd_mach_i960_core: - case bfd_mach_i960_kb_sb: - case bfd_mach_i960_mc: - case bfd_mach_i960_xa: - case bfd_mach_i960_ca: - case bfd_mach_i960_ka_sa: - case bfd_mach_i960_jx: - case bfd_mach_i960_hx: - case 0: - return true; - default: - return false; - } - - return false; -} - -static int -b_out_sizeof_headers (ignore_abfd, ignore) - bfd *ignore_abfd; - boolean ignore; -{ - return sizeof(struct internal_exec); -} - - - -/************************************************************************/ -static bfd_vma -get_value (reloc, link_info, input_section) - arelent *reloc; - struct bfd_link_info *link_info; - asection *input_section; -{ - bfd_vma value; - asymbol *symbol = *(reloc->sym_ptr_ptr); - - /* A symbol holds a pointer to a section, and an offset from the - base of the section. To relocate, we find where the section will - live in the output and add that in */ - - if (bfd_is_und_section (symbol->section)) - { - struct bfd_link_hash_entry *h; - - /* The symbol is undefined in this BFD. Look it up in the - global linker hash table. FIXME: This should be changed when - we convert b.out to use a specific final_link function and - change the interface to bfd_relax_section to not require the - generic symbols. */ - h = bfd_wrapped_link_hash_lookup (input_section->owner, link_info, - bfd_asymbol_name (symbol), - false, false, true); - if (h != (struct bfd_link_hash_entry *) NULL - && (h->type == bfd_link_hash_defined - || h->type == bfd_link_hash_defweak)) - value = h->u.def.value + output_addr (h->u.def.section); - else if (h != (struct bfd_link_hash_entry *) NULL - && h->type == bfd_link_hash_common) - value = h->u.c.size; - else - { - if (! ((*link_info->callbacks->undefined_symbol) - (link_info, bfd_asymbol_name (symbol), - input_section->owner, input_section, reloc->address))) - abort (); - value = 0; - } - } - else - { - value = symbol->value + output_addr (symbol->section); - } - - /* Add the value contained in the relocation */ - value += reloc->addend; - - return value; -} - -static void -perform_slip (abfd, slip, input_section, value) - bfd *abfd; - unsigned int slip; - asection *input_section; - bfd_vma value; -{ - asymbol **s; - - s = _bfd_generic_link_get_symbols (abfd); - BFD_ASSERT (s != (asymbol **) NULL); - - /* Find all symbols past this point, and make them know - what's happened */ - while (*s) - { - asymbol *p = *s; - if (p->section == input_section) - { - /* This was pointing into this section, so mangle it */ - if (p->value > value) - { - p->value -=slip; - if (p->udata.p != NULL) - { - struct generic_link_hash_entry *h; - - h = (struct generic_link_hash_entry *) p->udata.p; - BFD_ASSERT (h->root.type == bfd_link_hash_defined); - h->root.u.def.value -= slip; - BFD_ASSERT (h->root.u.def.value == p->value); - } - } - } - s++; - - } -} - -/* This routine works out if the thing we want to get to can be - reached with a 24bit offset instead of a 32 bit one. - If it can, then it changes the amode */ - -static int -abs32code (abfd, input_section, r, shrink, link_info) - bfd *abfd; - asection *input_section; - arelent *r; - unsigned int shrink; - struct bfd_link_info *link_info; -{ - bfd_vma value = get_value (r, link_info, input_section); - bfd_vma dot = output_addr (input_section) + r->address; - bfd_vma gap; - - /* See if the address we're looking at within 2^23 bytes of where - we are, if so then we can use a small branch rather than the - jump we were going to */ - - gap = value - (dot - shrink); - - - if (-1<<23 < (long)gap && (long)gap < 1<<23 ) - { - /* Change the reloc type from 32bitcode possible 24, to 24bit - possible 32 */ - - r->howto = &howto_reloc_abs32codeshrunk; - /* The place to relc moves back by four bytes */ - r->address -=4; - - /* This will be four bytes smaller in the long run */ - shrink += 4 ; - perform_slip (abfd, 4, input_section, r->address-shrink + 4); - } - return shrink; -} - -static int -aligncode (abfd, input_section, r, shrink) - bfd *abfd; - asection *input_section; - arelent *r; - unsigned int shrink; -{ - bfd_vma dot = output_addr (input_section) + r->address; - bfd_vma gap; - bfd_vma old_end; - bfd_vma new_end; - int shrink_delta; - int size = r->howto->size; - - /* Reduce the size of the alignment so that it's still aligned but - smaller - the current size is already the same size as or bigger - than the alignment required. */ - - /* calculate the first byte following the padding before we optimize */ - old_end = ((dot + size ) & ~size) + size+1; - /* work out where the new end will be - remember that we're smaller - than we used to be */ - new_end = ((dot - shrink + size) & ~size); - - /* This is the new end */ - gap = old_end - ((dot + size) & ~size); - - shrink_delta = (old_end - new_end) - shrink; - - if (shrink_delta) - { - /* Change the reloc so that it knows how far to align to */ - r->howto = howto_done_align_table + (r->howto - howto_align_table); - - /* Encode the stuff into the addend - for future use we need to - know how big the reloc used to be */ - r->addend = old_end - dot + r->address; - - /* This will be N bytes smaller in the long run, adjust all the symbols */ - perform_slip (abfd, shrink_delta, input_section, r->address - shrink); - shrink += shrink_delta; - } - return shrink; -} - -static boolean -b_out_bfd_relax_section (abfd, i, link_info, again) - bfd *abfd; - asection *i; - struct bfd_link_info *link_info; - boolean *again; -{ - /* Get enough memory to hold the stuff */ - bfd *input_bfd = i->owner; - asection *input_section = i; - int shrink = 0 ; - arelent **reloc_vector = NULL; - long reloc_size = bfd_get_reloc_upper_bound(input_bfd, - input_section); - - if (reloc_size < 0) - return false; - - /* We only run this relaxation once. It might work to run it - multiple times, but it hasn't been tested. */ - *again = false; - - if (reloc_size) - { - long reloc_count; - - reloc_vector = (arelent **) bfd_malloc (reloc_size); - if (reloc_vector == NULL && reloc_size != 0) - goto error_return; - - /* Get the relocs and think about them */ - reloc_count = - bfd_canonicalize_reloc (input_bfd, input_section, reloc_vector, - _bfd_generic_link_get_symbols (input_bfd)); - if (reloc_count < 0) - goto error_return; - if (reloc_count > 0) - { - arelent **parent; - for (parent = reloc_vector; *parent; parent++) - { - arelent *r = *parent; - switch (r->howto->type) - { - case ALIGNER: - /* An alignment reloc */ - shrink = aligncode (abfd, input_section, r, shrink); - break; - case ABS32CODE: - /* A 32bit reloc in an addressing mode */ - shrink = abs32code (input_bfd, input_section, r, shrink, - link_info); - break; - case ABS32CODE_SHRUNK: - shrink+=4; - break; - } - } - } - } - input_section->_cooked_size = input_section->_raw_size - shrink; - - if (reloc_vector != NULL) - free (reloc_vector); - return true; - error_return: - if (reloc_vector != NULL) - free (reloc_vector); - return false; -} - -static bfd_byte * -b_out_bfd_get_relocated_section_contents (in_abfd, link_info, link_order, - data, relocateable, symbols) - bfd *in_abfd; - struct bfd_link_info *link_info; - struct bfd_link_order *link_order; - bfd_byte *data; - boolean relocateable; - asymbol **symbols; -{ - /* Get enough memory to hold the stuff */ - bfd *input_bfd = link_order->u.indirect.section->owner; - asection *input_section = link_order->u.indirect.section; - long reloc_size = bfd_get_reloc_upper_bound(input_bfd, - input_section); - arelent **reloc_vector = NULL; - long reloc_count; - - if (reloc_size < 0) - goto error_return; - - /* If producing relocateable output, don't bother to relax. */ - if (relocateable) - return bfd_generic_get_relocated_section_contents (in_abfd, link_info, - link_order, - data, relocateable, - symbols); - - reloc_vector = (arelent **) bfd_malloc (reloc_size); - if (reloc_vector == NULL && reloc_size != 0) - goto error_return; - - input_section->reloc_done = 1; - - /* read in the section */ - BFD_ASSERT (true == bfd_get_section_contents(input_bfd, - input_section, - data, - 0, - input_section->_raw_size)); - - reloc_count = bfd_canonicalize_reloc (input_bfd, - input_section, - reloc_vector, - symbols); - if (reloc_count < 0) - goto error_return; - if (reloc_count > 0) - { - arelent **parent = reloc_vector; - arelent *reloc ; - - unsigned int dst_address = 0; - unsigned int src_address = 0; - unsigned int run; - unsigned int idx; - - /* Find how long a run we can do */ - while (dst_address < link_order->size) - { - reloc = *parent; - if (reloc) - { - /* Note that the relaxing didn't tie up the addresses in the - relocation, so we use the original address to work out the - run of non-relocated data */ - BFD_ASSERT (reloc->address >= src_address); - run = reloc->address - src_address; - parent++; - } - else - { - run = link_order->size - dst_address; - } - /* Copy the bytes */ - for (idx = 0; idx < run; idx++) - { - data[dst_address++] = data[src_address++]; - } - - /* Now do the relocation */ - - if (reloc) - { - switch (reloc->howto->type) - { - case ABS32CODE: - calljx_callback (in_abfd, link_info, reloc, - src_address + data, dst_address + data, - input_section); - src_address+=4; - dst_address+=4; - break; - case ABS32: - bfd_put_32(in_abfd, - (bfd_get_32 (in_abfd, data+src_address) - + get_value (reloc, link_info, input_section)), - data+dst_address); - src_address+=4; - dst_address+=4; - break; - case CALLJ: - callj_callback (in_abfd, link_info, reloc, data, src_address, - dst_address, input_section, false); - src_address+=4; - dst_address+=4; - break; - case ALIGNDONE: - BFD_ASSERT (reloc->addend >= src_address); - BFD_ASSERT (reloc->addend <= input_section->_raw_size); - src_address = reloc->addend; - dst_address = ((dst_address + reloc->howto->size) - & ~reloc->howto->size); - break; - case ABS32CODE_SHRUNK: - /* This used to be a callx, but we've found out that a - callj will reach, so do the right thing. */ - callj_callback (in_abfd, link_info, reloc, data, - src_address + 4, dst_address, input_section, - true); - dst_address+=4; - src_address+=8; - break; - case PCREL24: - { - long int word = bfd_get_32(in_abfd, data+src_address); - bfd_vma value; - - value = get_value (reloc, link_info, input_section); - word = ((word & ~BAL_MASK) - | (((word & BAL_MASK) - + value - - output_addr (input_section) - + reloc->addend) - & BAL_MASK)); - - bfd_put_32(in_abfd,word, data+dst_address); - dst_address+=4; - src_address+=4; - - } - break; - - case PCREL13: - { - long int word = bfd_get_32(in_abfd, data+src_address); - bfd_vma value; - - value = get_value (reloc, link_info, input_section); - word = ((word & ~PCREL13_MASK) - | (((word & PCREL13_MASK) - + value - + reloc->addend - - output_addr (input_section)) - & PCREL13_MASK)); - - bfd_put_32(in_abfd,word, data+dst_address); - dst_address+=4; - src_address+=4; - - } - break; - - default: - abort(); - } - } - } - } - if (reloc_vector != NULL) - free (reloc_vector); - return data; - error_return: - if (reloc_vector != NULL) - free (reloc_vector); - return NULL; -} -/***********************************************************************/ - -/* Build the transfer vectors for Big and Little-Endian B.OUT files. */ - -#define aout_32_bfd_make_debug_symbol _bfd_nosymbols_bfd_make_debug_symbol -#define aout_32_close_and_cleanup aout_32_bfd_free_cached_info - -#define b_out_bfd_link_hash_table_create _bfd_generic_link_hash_table_create -#define b_out_bfd_link_add_symbols _bfd_generic_link_add_symbols -#define b_out_bfd_final_link _bfd_generic_final_link -#define b_out_bfd_link_split_section _bfd_generic_link_split_section - -#define aout_32_get_section_contents_in_window \ - _bfd_generic_get_section_contents_in_window - -const bfd_target b_out_vec_big_host = -{ - "b.out.big", /* name */ - bfd_target_aout_flavour, - BFD_ENDIAN_LITTLE, /* data byte order is little */ - BFD_ENDIAN_BIG, /* hdr byte order is big */ - (HAS_RELOC | EXEC_P | /* object flags */ - HAS_LINENO | HAS_DEBUG | - HAS_SYMS | HAS_LOCALS | WP_TEXT | BFD_IS_RELAXABLE ), - (SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD | SEC_RELOC), /* section flags */ - '_', /* symbol leading char */ - ' ', /* ar_pad_char */ - 16, /* ar_max_namelen */ - - bfd_getl64, bfd_getl_signed_64, bfd_putl64, - bfd_getl32, bfd_getl_signed_32, bfd_putl32, - bfd_getl16, bfd_getl_signed_16, bfd_putl16, /* data */ - bfd_getb64, bfd_getb_signed_64, bfd_putb64, - bfd_getb32, bfd_getb_signed_32, bfd_putb32, - bfd_getb16, bfd_getb_signed_16, bfd_putb16, /* hdrs */ - {_bfd_dummy_target, b_out_object_p, /* bfd_check_format */ - bfd_generic_archive_p, _bfd_dummy_target}, - {bfd_false, b_out_mkobject, /* bfd_set_format */ - _bfd_generic_mkarchive, bfd_false}, - {bfd_false, b_out_write_object_contents, /* bfd_write_contents */ - _bfd_write_archive_contents, bfd_false}, - - BFD_JUMP_TABLE_GENERIC (aout_32), - BFD_JUMP_TABLE_COPY (_bfd_generic), - BFD_JUMP_TABLE_CORE (_bfd_nocore), - BFD_JUMP_TABLE_ARCHIVE (_bfd_archive_bsd), - BFD_JUMP_TABLE_SYMBOLS (aout_32), - BFD_JUMP_TABLE_RELOCS (b_out), - BFD_JUMP_TABLE_WRITE (b_out), - BFD_JUMP_TABLE_LINK (b_out), - BFD_JUMP_TABLE_DYNAMIC (_bfd_nodynamic), - - (PTR) 0, -}; - - -const bfd_target b_out_vec_little_host = -{ - "b.out.little", /* name */ - bfd_target_aout_flavour, - BFD_ENDIAN_LITTLE, /* data byte order is little */ - BFD_ENDIAN_LITTLE, /* header byte order is little */ - (HAS_RELOC | EXEC_P | /* object flags */ - HAS_LINENO | HAS_DEBUG | - HAS_SYMS | HAS_LOCALS | WP_TEXT | BFD_IS_RELAXABLE ), - (SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD | SEC_RELOC), /* section flags */ - '_', /* symbol leading char */ - ' ', /* ar_pad_char */ - 16, /* ar_max_namelen */ - bfd_getl64, bfd_getl_signed_64, bfd_putl64, - bfd_getl32, bfd_getl_signed_32, bfd_putl32, - bfd_getl16, bfd_getl_signed_16, bfd_putl16, /* data */ - bfd_getl64, bfd_getl_signed_64, bfd_putl64, - bfd_getl32, bfd_getl_signed_32, bfd_putl32, - bfd_getl16, bfd_getl_signed_16, bfd_putl16, /* hdrs */ - - {_bfd_dummy_target, b_out_object_p, /* bfd_check_format */ - bfd_generic_archive_p, _bfd_dummy_target}, - {bfd_false, b_out_mkobject, /* bfd_set_format */ - _bfd_generic_mkarchive, bfd_false}, - {bfd_false, b_out_write_object_contents, /* bfd_write_contents */ - _bfd_write_archive_contents, bfd_false}, - - BFD_JUMP_TABLE_GENERIC (aout_32), - BFD_JUMP_TABLE_COPY (_bfd_generic), - BFD_JUMP_TABLE_CORE (_bfd_nocore), - BFD_JUMP_TABLE_ARCHIVE (_bfd_archive_bsd), - BFD_JUMP_TABLE_SYMBOLS (aout_32), - BFD_JUMP_TABLE_RELOCS (b_out), - BFD_JUMP_TABLE_WRITE (b_out), - BFD_JUMP_TABLE_LINK (b_out), - BFD_JUMP_TABLE_DYNAMIC (_bfd_nodynamic), - - (PTR) 0 -}; diff --git a/contrib/gdb/bfd/cache.c b/contrib/gdb/bfd/cache.c deleted file mode 100644 index ef15877ccd579..0000000000000 --- a/contrib/gdb/bfd/cache.c +++ /dev/null @@ -1,347 +0,0 @@ -/* BFD library -- caching of file descriptors. - Copyright 1990, 91, 92, 93, 94, 95, 1996 Free Software Foundation, Inc. - Hacked by Steve Chamberlain of Cygnus Support (steve@cygnus.com). - -This file is part of BFD, the Binary File Descriptor library. - -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 2 of the License, 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ - -/* -SECTION - File caching - - The file caching mechanism is embedded within BFD and allows - the application to open as many BFDs as it wants without - regard to the underlying operating system's file descriptor - limit (often as low as 20 open files). The module in - <<cache.c>> maintains a least recently used list of - <<BFD_CACHE_MAX_OPEN>> files, and exports the name - <<bfd_cache_lookup>>, which runs around and makes sure that - the required BFD is open. If not, then it chooses a file to - close, closes it and opens the one wanted, returning its file - handle. - -*/ - -#include "bfd.h" -#include "sysdep.h" -#include "libbfd.h" - -static void insert PARAMS ((bfd *)); -static void snip PARAMS ((bfd *)); -static boolean close_one PARAMS ((void)); -static boolean bfd_cache_delete PARAMS ((bfd *)); - -/* -INTERNAL_FUNCTION - BFD_CACHE_MAX_OPEN macro - -DESCRIPTION - The maximum number of files which the cache will keep open at - one time. - -.#define BFD_CACHE_MAX_OPEN 10 - -*/ - -/* The number of BFD files we have open. */ - -static int open_files; - -/* -INTERNAL_FUNCTION - bfd_last_cache - -SYNOPSIS - extern bfd *bfd_last_cache; - -DESCRIPTION - Zero, or a pointer to the topmost BFD on the chain. This is - used by the <<bfd_cache_lookup>> macro in @file{libbfd.h} to - determine when it can avoid a function call. -*/ - -bfd *bfd_last_cache; - -/* - INTERNAL_FUNCTION - bfd_cache_lookup - - DESCRIPTION - Check to see if the required BFD is the same as the last one - looked up. If so, then it can use the stream in the BFD with - impunity, since it can't have changed since the last lookup; - otherwise, it has to perform the complicated lookup function. - - .#define bfd_cache_lookup(x) \ - . ((x)==bfd_last_cache? \ - . (FILE*)(bfd_last_cache->iostream): \ - . bfd_cache_lookup_worker(x)) - - - */ - -/* Insert a BFD into the cache. */ - -static INLINE void -insert (abfd) - bfd *abfd; -{ - if (bfd_last_cache == NULL) - { - abfd->lru_next = abfd; - abfd->lru_prev = abfd; - } - else - { - abfd->lru_next = bfd_last_cache; - abfd->lru_prev = bfd_last_cache->lru_prev; - abfd->lru_prev->lru_next = abfd; - abfd->lru_next->lru_prev = abfd; - } - bfd_last_cache = abfd; -} - -/* Remove a BFD from the cache. */ - -static INLINE void -snip (abfd) - bfd *abfd; -{ - abfd->lru_prev->lru_next = abfd->lru_next; - abfd->lru_next->lru_prev = abfd->lru_prev; - if (abfd == bfd_last_cache) - { - bfd_last_cache = abfd->lru_next; - if (abfd == bfd_last_cache) - bfd_last_cache = NULL; - } -} - -/* We need to open a new file, and the cache is full. Find the least - recently used cacheable BFD and close it. */ - -static boolean -close_one () -{ - register bfd *kill; - - if (bfd_last_cache == NULL) - kill = NULL; - else - { - for (kill = bfd_last_cache->lru_prev; - ! kill->cacheable; - kill = kill->lru_prev) - { - if (kill == bfd_last_cache) - { - kill = NULL; - break; - } - } - } - - if (kill == NULL) - { - /* There are no open cacheable BFD's. */ - return true; - } - - kill->where = ftell ((FILE *) kill->iostream); - - return bfd_cache_delete (kill); -} - -/* Close a BFD and remove it from the cache. */ - -static boolean -bfd_cache_delete (abfd) - bfd *abfd; -{ - boolean ret; - - if (fclose ((FILE *) abfd->iostream) == 0) - ret = true; - else - { - ret = false; - bfd_set_error (bfd_error_system_call); - } - - snip (abfd); - - abfd->iostream = NULL; - --open_files; - - return ret; -} - -/* -INTERNAL_FUNCTION - bfd_cache_init - -SYNOPSIS - boolean bfd_cache_init (bfd *abfd); - -DESCRIPTION - Add a newly opened BFD to the cache. -*/ - -boolean -bfd_cache_init (abfd) - bfd *abfd; -{ - BFD_ASSERT (abfd->iostream != NULL); - if (open_files >= BFD_CACHE_MAX_OPEN) - { - if (! close_one ()) - return false; - } - insert (abfd); - ++open_files; - return true; -} - -/* -INTERNAL_FUNCTION - bfd_cache_close - -SYNOPSIS - boolean bfd_cache_close (bfd *abfd); - -DESCRIPTION - Remove the BFD @var{abfd} from the cache. If the attached file is open, - then close it too. - -RETURNS - <<false>> is returned if closing the file fails, <<true>> is - returned if all is well. -*/ - -boolean -bfd_cache_close (abfd) - bfd *abfd; -{ - if (abfd->iostream == NULL - || (abfd->flags & BFD_IN_MEMORY) != 0) - return true; - - return bfd_cache_delete (abfd); -} - -/* -INTERNAL_FUNCTION - bfd_open_file - -SYNOPSIS - FILE* bfd_open_file(bfd *abfd); - -DESCRIPTION - Call the OS to open a file for @var{abfd}. Return the <<FILE *>> - (possibly <<NULL>>) that results from this operation. Set up the - BFD so that future accesses know the file is open. If the <<FILE *>> - returned is <<NULL>>, then it won't have been put in the - cache, so it won't have to be removed from it. -*/ - -FILE * -bfd_open_file (abfd) - bfd *abfd; -{ - abfd->cacheable = true; /* Allow it to be closed later. */ - - if (open_files >= BFD_CACHE_MAX_OPEN) - { - if (! close_one ()) - return NULL; - } - - switch (abfd->direction) - { - case read_direction: - case no_direction: - abfd->iostream = (PTR) fopen (abfd->filename, FOPEN_RB); - break; - case both_direction: - case write_direction: - if (abfd->opened_once == true) - { - abfd->iostream = (PTR) fopen (abfd->filename, FOPEN_RUB); - if (abfd->iostream == NULL) - abfd->iostream = (PTR) fopen (abfd->filename, FOPEN_WUB); - } - else - { - /*open for creat */ - abfd->iostream = (PTR) fopen (abfd->filename, FOPEN_WB); - abfd->opened_once = true; - } - break; - } - - if (abfd->iostream != NULL) - { - if (! bfd_cache_init (abfd)) - return NULL; - } - - return (FILE *) abfd->iostream; -} - -/* -INTERNAL_FUNCTION - bfd_cache_lookup_worker - -SYNOPSIS - FILE *bfd_cache_lookup_worker(bfd *abfd); - -DESCRIPTION - Called when the macro <<bfd_cache_lookup>> fails to find a - quick answer. Find a file descriptor for @var{abfd}. If - necessary, it open it. If there are already more than - <<BFD_CACHE_MAX_OPEN>> files open, it tries to close one first, to - avoid running out of file descriptors. -*/ - -FILE * -bfd_cache_lookup_worker (abfd) - bfd *abfd; -{ - if ((abfd->flags & BFD_IN_MEMORY) != 0) - abort (); - - if (abfd->my_archive) - abfd = abfd->my_archive; - - if (abfd->iostream != NULL) - { - /* Move the file to the start of the cache. */ - if (abfd != bfd_last_cache) - { - snip (abfd); - insert (abfd); - } - } - else - { - if (bfd_open_file (abfd) == NULL) - return NULL; - if (fseek ((FILE *) abfd->iostream, abfd->where, SEEK_SET) != 0) - return NULL; - } - - return (FILE *) abfd->iostream; -} diff --git a/contrib/gdb/bfd/cf-i386lynx.c b/contrib/gdb/bfd/cf-i386lynx.c deleted file mode 100644 index 2a14bde8f12d1..0000000000000 --- a/contrib/gdb/bfd/cf-i386lynx.c +++ /dev/null @@ -1,31 +0,0 @@ -/* BFD back-end for Intel 386 COFF LynxOS files. - Copyright 1993, 1994 Free Software Foundation, Inc. - Written by Cygnus Support. - -This file is part of BFD, the Binary File Descriptor library. - -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 2 of the License, 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ - -#include "bfd.h" -#include "sysdep.h" - -#define TARGET_SYM i386lynx_coff_vec -#define TARGET_NAME "coff-i386-lynx" - -#define LYNXOS - -#define COFF_LONG_FILENAMES - -#include "coff-i386.c" diff --git a/contrib/gdb/bfd/cf-m68klynx.c b/contrib/gdb/bfd/cf-m68klynx.c deleted file mode 100644 index 8149dc68319a1..0000000000000 --- a/contrib/gdb/bfd/cf-m68klynx.c +++ /dev/null @@ -1,223 +0,0 @@ -/* BFD back-end for Motorola M68K COFF LynxOS files. - Copyright 1993, 1994, 1995 Free Software Foundation, Inc. - Written by Cygnus Support. - -This file is part of BFD, the Binary File Descriptor library. - -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 2 of the License, 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ - -#define TARGET_SYM m68klynx_coff_vec -#define TARGET_NAME "coff-m68k-lynx" - -#define LYNXOS - -#define COFF_LONG_FILENAMES - -#define _bfd_m68kcoff_howto_table _bfd_m68klynx_howto_table -#define _bfd_m68kcoff_rtype2howto _bfd_m68klynx_rtype2howto -#define _bfd_m68kcoff_howto2rtype _bfd_m68klynx_howto2rtype -#define _bfd_m68kcoff_reloc_type_lookup _bfd_m68klynx_reloc_type_lookup - -#define LYNX_SPECIAL_FN _bfd_m68klynx_special_fn - -#include "bfd.h" -#include "sysdep.h" - -#ifdef ANSI_PROTOTYPES -struct internal_reloc; -struct coff_link_hash_entry; -struct internal_syment; -#endif - -static bfd_reloc_status_type _bfd_m68klynx_special_fn - PARAMS ((bfd *, arelent *, asymbol *, PTR, asection *, bfd *, char **)); -static reloc_howto_type *coff_m68k_lynx_rtype_to_howto - PARAMS ((bfd *, asection *, struct internal_reloc *, - struct coff_link_hash_entry *, struct internal_syment *, - bfd_vma *)); - -/* For some reason when using m68k COFF the value stored in the .text - section for a reference to a common symbol is the value itself plus - any desired offset. (taken from work done by Ian Taylor, Cygnus Support, - for I386 COFF). */ - -/* If we are producing relocateable output, we need to do some - adjustments to the object file that are not done by the - bfd_perform_relocation function. This function is called by every - reloc type to make any required adjustments. */ - -static bfd_reloc_status_type -_bfd_m68klynx_special_fn (abfd, reloc_entry, symbol, data, input_section, - output_bfd, error_message) - bfd *abfd; - arelent *reloc_entry; - asymbol *symbol; - PTR data; - asection *input_section; - bfd *output_bfd; - char **error_message; -{ - symvalue diff; - - if (output_bfd == (bfd *) NULL) - return bfd_reloc_continue; - - if (bfd_is_com_section (symbol->section)) - { - /* We are relocating a common symbol. The current value in the - object file is ORIG + OFFSET, where ORIG is the value of the - common symbol as seen by the object file when it was compiled - (this may be zero if the symbol was undefined) and OFFSET is - the offset into the common symbol (normally zero, but may be - non-zero when referring to a field in a common structure). - ORIG is the negative of reloc_entry->addend, which is set by - the CALC_ADDEND macro below. We want to replace the value in - the object file with NEW + OFFSET, where NEW is the value of - the common symbol which we are going to put in the final - object file. NEW is symbol->value. */ - diff = symbol->value + reloc_entry->addend; - } - else - { - /* For some reason bfd_perform_relocation always effectively - ignores the addend for a COFF target when producing - relocateable output. This seems to be always wrong for 386 - COFF, so we handle the addend here instead. */ - diff = reloc_entry->addend; - } - -#define DOIT(x) \ - x = ((x & ~howto->dst_mask) | (((x & howto->src_mask) + diff) & howto->dst_mask)) - - if (diff != 0) - { - reloc_howto_type *howto = reloc_entry->howto; - unsigned char *addr = (unsigned char *) data + reloc_entry->address; - - switch (howto->size) - { - case 0: - { - char x = bfd_get_8 (abfd, addr); - DOIT (x); - bfd_put_8 (abfd, x, addr); - } - break; - - case 1: - { - short x = bfd_get_16 (abfd, addr); - DOIT (x); - bfd_put_16 (abfd, x, addr); - } - break; - - case 2: - { - long x = bfd_get_32 (abfd, addr); - DOIT (x); - bfd_put_32 (abfd, x, addr); - } - break; - - default: - abort (); - } - } - - /* Now let bfd_perform_relocation finish everything up. */ - return bfd_reloc_continue; -} -/* Compute the addend of a reloc. If the reloc is to a common symbol, - the object file contains the value of the common symbol. By the - time this is called, the linker may be using a different symbol - from a different object file with a different value. Therefore, we - hack wildly to locate the original symbol from this file so that we - can make the correct adjustment. This macro sets coffsym to the - symbol from the original file, and uses it to set the addend value - correctly. If this is not a common symbol, the usual addend - calculation is done, except that an additional tweak is needed for - PC relative relocs. - FIXME: This macro refers to symbols and asect; these are from the - calling function, not the macro arguments. */ - -#define CALC_ADDEND(abfd, ptr, reloc, cache_ptr) \ - { \ - coff_symbol_type *coffsym = (coff_symbol_type *) NULL; \ - if (ptr && bfd_asymbol_bfd (ptr) != abfd) \ - coffsym = (obj_symbols (abfd) \ - + (cache_ptr->sym_ptr_ptr - symbols)); \ - else if (ptr) \ - coffsym = coff_symbol_from (abfd, ptr); \ - if (coffsym != (coff_symbol_type *) NULL \ - && coffsym->native->u.syment.n_scnum == 0) \ - cache_ptr->addend = - coffsym->native->u.syment.n_value; \ - else if (ptr && bfd_asymbol_bfd (ptr) == abfd \ - && ptr->section != (asection *) NULL) \ - cache_ptr->addend = - (ptr->section->vma + ptr->value); \ - else \ - cache_ptr->addend = 0; \ - if (ptr && (reloc.r_type == R_PCRBYTE \ - || reloc.r_type == R_PCRWORD \ - || reloc.r_type == R_PCRLONG)) \ - cache_ptr->addend += asect->vma; \ - } - -#define coff_rtype_to_howto coff_m68k_lynx_rtype_to_howto - -#include "coff-m68k.c" - -/* coff-m68k.c uses the special COFF backend linker. We need to - adjust common symbols. - - We can't define this function until after we have included - coff-m68k.c, because it uses RTYPE2HOWTO. */ - -/*ARGSUSED*/ -static reloc_howto_type * -coff_m68k_lynx_rtype_to_howto (abfd, sec, rel, h, sym, addendp) - bfd *abfd; - asection *sec; - struct internal_reloc *rel; - struct coff_link_hash_entry *h; - struct internal_syment *sym; - bfd_vma *addendp; -{ - arelent relent; - reloc_howto_type *howto; - - RTYPE2HOWTO (&relent, rel); - - howto = relent.howto; - - if (sym != NULL && sym->n_scnum == 0 && sym->n_value != 0) - { - /* This is a common symbol. The section contents include the - size (sym->n_value) as an addend. The relocate_section - function will be adding in the final value of the symbol. We - need to subtract out the current size in order to get the - correct result. */ - BFD_ASSERT (h != NULL); - *addendp -= sym->n_value; - } - - /* If the output symbol is common (in which case this must be a - relocateable link), we need to add in the final size of the - common symbol. */ - if (h != NULL && h->root.type == bfd_link_hash_common) - *addendp += h->root.u.c.size; - - return howto; -} diff --git a/contrib/gdb/bfd/cf-sparclynx.c b/contrib/gdb/bfd/cf-sparclynx.c deleted file mode 100644 index 774a099fefbc5..0000000000000 --- a/contrib/gdb/bfd/cf-sparclynx.c +++ /dev/null @@ -1,28 +0,0 @@ -/* BFD back-end for Sparc COFF LynxOS files. - Copyright 1993 Free Software Foundation, Inc. - Written by Cygnus Support. - -This file is part of BFD, the Binary File Descriptor library. - -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 2 of the License, 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ - -#define TARGET_SYM sparclynx_coff_vec -#define TARGET_NAME "coff-sparc-lynx" - -#define LYNXOS - -#define COFF_LONG_FILENAMES - -#include "coff-sparc.c" diff --git a/contrib/gdb/bfd/cisco-core.c b/contrib/gdb/bfd/cisco-core.c deleted file mode 100644 index a25115cc52386..0000000000000 --- a/contrib/gdb/bfd/cisco-core.c +++ /dev/null @@ -1,313 +0,0 @@ -/* BFD back-end for CISCO crash dumps. - -Copyright 1994 Free Software Foundation, Inc. - -This file is part of BFD, the Binary File Descriptor library. - -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 2 of the License, 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ - -#include "bfd.h" -#include "sysdep.h" -#include "libbfd.h" -/* core_file_failing_signal returns a host signal (this probably should - be fixed). */ -#include <signal.h> - -#define CRASH_INFO (0xffc) -#define CRASH_MAGIC 0xdead1234 - -typedef enum { - CRASH_REASON_NOTCRASHED = 0, - CRASH_REASON_EXCEPTION = 1, - CRASH_REASON_CORRUPT = 2, - } crashreason; - -struct crashinfo_external -{ - char magic[4]; /* Magic number */ - char version[4]; /* Version number */ - char reason[4]; /* Crash reason */ - char cpu_vector[4]; /* CPU vector for exceptions */ - char registers[4]; /* Pointer to saved registers */ - char rambase[4]; /* Base of RAM (not in V1 crash info) */ -}; - -struct cisco_core_struct -{ - int sig; -}; - -static const bfd_target * -cisco_core_file_p (abfd) - bfd *abfd; -{ - char buf[4]; - unsigned int crashinfo_offset; - struct crashinfo_external crashinfo; - int nread; - unsigned int rambase; - sec_ptr asect; - struct stat statbuf; - - if (bfd_seek (abfd, CRASH_INFO, SEEK_SET) != 0) - return NULL; - - nread = bfd_read (buf, 1, 4, abfd); - if (nread != 4) - { - if (bfd_get_error () != bfd_error_system_call) - bfd_set_error (bfd_error_wrong_format); - return NULL; - } - crashinfo_offset = bfd_get_32 (abfd, buf); - - if (bfd_seek (abfd, crashinfo_offset, SEEK_SET) != 0) - return NULL; - - nread = bfd_read (&crashinfo, 1, sizeof (crashinfo), abfd); - if (nread != sizeof (crashinfo)) - { - if (bfd_get_error () != bfd_error_system_call) - bfd_set_error (bfd_error_wrong_format); - return NULL; - } - - if (bfd_stat (abfd, &statbuf) < 0) - { - bfd_set_error (bfd_error_system_call); - return NULL; - } - - if (bfd_get_32 (abfd, crashinfo.magic) != CRASH_MAGIC) - { - bfd_set_error (bfd_error_wrong_format); - return NULL; - } - - switch (bfd_get_32 (abfd, crashinfo.version)) - { - case 0: - bfd_set_error (bfd_error_wrong_format); - return NULL; - case 1: - rambase = 0; - break; - default: - case 2: - rambase = bfd_get_32 (abfd, crashinfo.rambase); - break; - } - - /* OK, we believe you. You're a core file. */ - - abfd->tdata.cisco_core_data = - ((struct cisco_core_struct *) - bfd_zmalloc (sizeof (struct cisco_core_struct))); - if (abfd->tdata.cisco_core_data == NULL) - return NULL; - - switch ((crashreason) bfd_get_32 (abfd, crashinfo.reason)) - { - case CRASH_REASON_NOTCRASHED: - /* Crash file probably came from write core. */ - abfd->tdata.cisco_core_data->sig = 0; - break; - case CRASH_REASON_CORRUPT: - /* The crash context area was corrupt -- proceed with caution. - We have no way of passing this information back to the caller. */ - abfd->tdata.cisco_core_data->sig = 0; - break; - case CRASH_REASON_EXCEPTION: - /* Crash occured due to CPU exception. */ - - /* This is 68k-specific; for MIPS we'll need to interpret - cpu_vector differently based on the target configuration - (since CISCO core files don't seem to have the processor - encoded in them). */ - - switch (bfd_get_32 (abfd, crashinfo.cpu_vector)) - { - /* bus error */ - case 2 : abfd->tdata.cisco_core_data->sig = SIGBUS; break; - /* address error */ - case 3 : abfd->tdata.cisco_core_data->sig = SIGBUS; break; - /* illegal instruction */ - case 4 : abfd->tdata.cisco_core_data->sig = SIGILL; break; - /* zero divide */ - case 5 : abfd->tdata.cisco_core_data->sig = SIGFPE; break; - /* chk instruction */ - case 6 : abfd->tdata.cisco_core_data->sig = SIGFPE; break; - /* trapv instruction */ - case 7 : abfd->tdata.cisco_core_data->sig = SIGFPE; break; - /* privilege violation */ - case 8 : abfd->tdata.cisco_core_data->sig = SIGSEGV; break; - /* trace trap */ - case 9 : abfd->tdata.cisco_core_data->sig = SIGTRAP; break; - /* line 1010 emulator */ - case 10: abfd->tdata.cisco_core_data->sig = SIGILL; break; - /* line 1111 emulator */ - case 11: abfd->tdata.cisco_core_data->sig = SIGILL; break; - - /* Coprocessor protocol violation. Using a standard MMU or FPU - this cannot be triggered by software. Call it a SIGBUS. */ - case 13: abfd->tdata.cisco_core_data->sig = SIGBUS; break; - - /* interrupt */ - case 31: abfd->tdata.cisco_core_data->sig = SIGINT; break; - /* breakpoint */ - case 33: abfd->tdata.cisco_core_data->sig = SIGTRAP; break; - - /* floating point err */ - case 48: abfd->tdata.cisco_core_data->sig = SIGFPE; break; - /* floating point err */ - case 49: abfd->tdata.cisco_core_data->sig = SIGFPE; break; - /* zero divide */ - case 50: abfd->tdata.cisco_core_data->sig = SIGFPE; break; - /* underflow */ - case 51: abfd->tdata.cisco_core_data->sig = SIGFPE; break; - /* operand error */ - case 52: abfd->tdata.cisco_core_data->sig = SIGFPE; break; - /* overflow */ - case 53: abfd->tdata.cisco_core_data->sig = SIGFPE; break; - /* NAN */ - case 54: abfd->tdata.cisco_core_data->sig = SIGFPE; break; - default: - /* "software generated"*/ - abfd->tdata.cisco_core_data->sig = SIGEMT; - } - break; - default: - /* Unknown crash reason. */ - abfd->tdata.cisco_core_data->sig = 0; - break; - } - - abfd->sections = NULL; - abfd->section_count = 0; - - asect = (asection *) bfd_zmalloc (sizeof (asection)); - if (asect == NULL) - goto error_return; - asect->name = ".reg"; - asect->flags = SEC_HAS_CONTENTS; - /* This can be bigger than the real size. Set it to the size of the whole - core file. */ - asect->_raw_size = statbuf.st_size; - asect->vma = 0; - asect->filepos = bfd_get_32 (abfd, crashinfo.registers) - rambase; - asect->next = abfd->sections; - abfd->sections = asect; - ++abfd->section_count; - - /* There is only one section containing data from the target system's RAM. - We call it .data. */ - asect = (asection *) bfd_zmalloc (sizeof (asection)); - if (asect == NULL) - goto error_return; - asect->name = ".data"; - asect->flags = SEC_ALLOC | SEC_LOAD | SEC_HAS_CONTENTS; - /* The size of memory is the size of the core file itself. */ - asect->_raw_size = statbuf.st_size; - asect->vma = rambase; - asect->filepos = 0; - asect->next = abfd->sections; - abfd->sections = asect; - ++abfd->section_count; - - return abfd->xvec; - - error_return: - { - sec_ptr nextsect; - for (asect = abfd->sections; asect != NULL;) - { - nextsect = asect->next; - free (asect); - asect = nextsect; - } - free (abfd->tdata.cisco_core_data); - return NULL; - } -} - -char * -cisco_core_file_failing_command (abfd) - bfd *abfd; -{ - return NULL; -} - -int -cisco_core_file_failing_signal (abfd) - bfd *abfd; -{ - return abfd->tdata.cisco_core_data->sig; -} - -boolean -cisco_core_file_matches_executable_p (core_bfd, exec_bfd) - bfd *core_bfd; - bfd *exec_bfd; -{ - return true; -} - -const bfd_target cisco_core_vec = - { - "trad-core", - bfd_target_unknown_flavour, - BFD_ENDIAN_BIG, /* target byte order */ - BFD_ENDIAN_BIG, /* target headers byte order */ - (HAS_RELOC | EXEC_P | /* object flags */ - HAS_LINENO | HAS_DEBUG | - HAS_SYMS | HAS_LOCALS | WP_TEXT | D_PAGED), - (SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD | SEC_RELOC), /* section flags */ - 0, /* symbol prefix */ - ' ', /* ar_pad_char */ - 16, /* ar_max_namelen */ - bfd_getb64, bfd_getb_signed_64, bfd_putb64, - bfd_getb32, bfd_getb_signed_32, bfd_putb32, - bfd_getb16, bfd_getb_signed_16, bfd_putb16, /* data */ - bfd_getb64, bfd_getb_signed_64, bfd_putb64, - bfd_getb32, bfd_getb_signed_32, bfd_putb32, - bfd_getb16, bfd_getb_signed_16, bfd_putb16, /* hdrs */ - - { /* bfd_check_format */ - _bfd_dummy_target, /* unknown format */ - _bfd_dummy_target, /* object file */ - _bfd_dummy_target, /* archive */ - cisco_core_file_p /* a core file */ - }, - { /* bfd_set_format */ - bfd_false, bfd_false, - bfd_false, bfd_false - }, - { /* bfd_write_contents */ - bfd_false, bfd_false, - bfd_false, bfd_false - }, - - BFD_JUMP_TABLE_GENERIC (_bfd_generic), - BFD_JUMP_TABLE_COPY (_bfd_generic), - BFD_JUMP_TABLE_CORE (cisco), - BFD_JUMP_TABLE_ARCHIVE (_bfd_noarchive), - BFD_JUMP_TABLE_SYMBOLS (_bfd_nosymbols), - BFD_JUMP_TABLE_RELOCS (_bfd_norelocs), - BFD_JUMP_TABLE_WRITE (_bfd_generic), - BFD_JUMP_TABLE_LINK (_bfd_nolink), - BFD_JUMP_TABLE_DYNAMIC (_bfd_nodynamic), - - (PTR) 0 /* backend_data */ -}; diff --git a/contrib/gdb/bfd/coff-a29k.c b/contrib/gdb/bfd/coff-a29k.c deleted file mode 100644 index 3ceabfba5c46e..0000000000000 --- a/contrib/gdb/bfd/coff-a29k.c +++ /dev/null @@ -1,641 +0,0 @@ -/* BFD back-end for AMD 29000 COFF binaries. - Copyright 1990, 1991, 1992, 1993, 1994 Free Software Foundation, Inc. - Contributed by David Wood at New York University 7/8/91. - -This file is part of BFD, the Binary File Descriptor library. - -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 2 of the License, 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ - -#define A29K 1 - -#include "bfd.h" -#include "sysdep.h" -#include "libbfd.h" -#include "obstack.h" -#include "coff/a29k.h" -#include "coff/internal.h" -#include "libcoff.h" - -static long get_symbol_value PARAMS ((asymbol *)); -static bfd_reloc_status_type a29k_reloc - PARAMS ((bfd *, arelent *, asymbol *, PTR, asection *, bfd *, char **)); -static boolean coff_a29k_relocate_section - PARAMS ((bfd *, struct bfd_link_info *, bfd *, asection *, bfd_byte *, - struct internal_reloc *, struct internal_syment *, asection **)); -static boolean coff_a29k_adjust_symndx - PARAMS ((bfd *, struct bfd_link_info *, bfd *, asection *, - struct internal_reloc *, boolean *)); - -#define COFF_DEFAULT_SECTION_ALIGNMENT_POWER (2) - -#define INSERT_HWORD(WORD,HWORD) \ - (((WORD) & 0xff00ff00) | (((HWORD) & 0xff00) << 8) | ((HWORD)& 0xff)) -#define EXTRACT_HWORD(WORD) \ - ((((WORD) & 0x00ff0000) >> 8) | ((WORD)& 0xff)) -#define SIGN_EXTEND_HWORD(HWORD) \ - ((HWORD) & 0x8000 ? (HWORD)|(~0xffffL) : (HWORD)) - -/* Provided the symbol, returns the value reffed */ -static long -get_symbol_value (symbol) - asymbol *symbol; -{ - long relocation = 0; - - if (bfd_is_com_section (symbol->section)) - { - relocation = 0; - } - else - { - relocation = symbol->value + - symbol->section->output_section->vma + - symbol->section->output_offset; - } - - return(relocation); -} - -/* this function is in charge of performing all the 29k relocations */ - -static bfd_reloc_status_type -a29k_reloc (abfd, reloc_entry, symbol_in, data, input_section, output_bfd, - error_message) - bfd *abfd; - arelent *reloc_entry; - asymbol *symbol_in; - PTR data; - asection *input_section; - bfd *output_bfd; - char **error_message; -{ - /* the consth relocation comes in two parts, we have to remember - the state between calls, in these variables */ - static boolean part1_consth_active = false; - static unsigned long part1_consth_value; - - unsigned long insn; - unsigned long sym_value; - unsigned long unsigned_value; - unsigned short r_type; - long signed_value; - - unsigned long addr = reloc_entry->address ; /*+ input_section->vma*/ - bfd_byte *hit_data =addr + (bfd_byte *)(data); - - r_type = reloc_entry->howto->type; - - if (output_bfd) { - /* Partial linking - do nothing */ - reloc_entry->address += input_section->output_offset; - return bfd_reloc_ok; - - } - - if (symbol_in != NULL - && bfd_is_und_section (symbol_in->section)) - { - /* Keep the state machine happy in case we're called again */ - if (r_type == R_IHIHALF) - { - part1_consth_active = true; - part1_consth_value = 0; - } - return(bfd_reloc_undefined); - } - - if ((part1_consth_active) && (r_type != R_IHCONST)) - { - part1_consth_active = false; - *error_message = (char *) "Missing IHCONST"; - return(bfd_reloc_dangerous); - } - - - sym_value = get_symbol_value(symbol_in); - - switch (r_type) - { - case R_IREL: - insn = bfd_get_32(abfd, hit_data); - /* Take the value in the field and sign extend it */ - signed_value = EXTRACT_HWORD(insn); - signed_value = SIGN_EXTEND_HWORD(signed_value); - signed_value <<= 2; - - /* See the note on the R_IREL reloc in coff_a29k_relocate_section. */ - if (signed_value == - (long) reloc_entry->address) - signed_value = 0; - - signed_value += sym_value + reloc_entry->addend; - if ((signed_value & ~0x3ffff) == 0) - { /* Absolute jmp/call */ - insn |= (1<<24); /* Make it absolute */ - /* FIXME: Should we change r_type to R_IABS */ - } - else - { - /* Relative jmp/call, so subtract from the value the - address of the place we're coming from */ - signed_value -= (reloc_entry->address - + input_section->output_section->vma - + input_section->output_offset); - if (signed_value>0x1ffff || signed_value<-0x20000) - return(bfd_reloc_overflow); - } - signed_value >>= 2; - insn = INSERT_HWORD(insn, signed_value); - bfd_put_32(abfd, insn ,hit_data); - break; - case R_ILOHALF: - insn = bfd_get_32(abfd, hit_data); - unsigned_value = EXTRACT_HWORD(insn); - unsigned_value += sym_value + reloc_entry->addend; - insn = INSERT_HWORD(insn, unsigned_value); - bfd_put_32(abfd, insn, hit_data); - break; - case R_IHIHALF: - insn = bfd_get_32(abfd, hit_data); - /* consth, part 1 - Just get the symbol value that is referenced */ - part1_consth_active = true; - part1_consth_value = sym_value + reloc_entry->addend; - /* Don't modify insn until R_IHCONST */ - break; - case R_IHCONST: - insn = bfd_get_32(abfd, hit_data); - /* consth, part 2 - Now relocate the reference */ - if (part1_consth_active == false) { - *error_message = (char *) "Missing IHIHALF"; - return(bfd_reloc_dangerous); - } - /* sym_ptr_ptr = r_symndx, in coff_slurp_reloc_table() */ - unsigned_value = 0; /*EXTRACT_HWORD(insn) << 16;*/ - unsigned_value += reloc_entry->addend; /* r_symndx */ - unsigned_value += part1_consth_value; - unsigned_value = unsigned_value >> 16; - insn = INSERT_HWORD(insn, unsigned_value); - part1_consth_active = false; - bfd_put_32(abfd, insn, hit_data); - break; - case R_BYTE: - insn = bfd_get_8(abfd, hit_data); - unsigned_value = insn + sym_value + reloc_entry->addend; - if (unsigned_value & 0xffffff00) - return(bfd_reloc_overflow); - bfd_put_8(abfd, unsigned_value, hit_data); - break; - case R_HWORD: - insn = bfd_get_16(abfd, hit_data); - unsigned_value = insn + sym_value + reloc_entry->addend; - if (unsigned_value & 0xffff0000) - return(bfd_reloc_overflow); - bfd_put_16(abfd, insn, hit_data); - break; - case R_WORD: - insn = bfd_get_32(abfd, hit_data); - insn += sym_value + reloc_entry->addend; - bfd_put_32(abfd, insn, hit_data); - break; - default: - *error_message = "Unrecognized reloc"; - return (bfd_reloc_dangerous); - } - - - return(bfd_reloc_ok); -} - -/* type rightshift - size - bitsize - pc-relative - bitpos - absolute - complain_on_overflow - special_function - relocation name - partial_inplace - src_mask -*/ - -/*FIXME: I'm not real sure about this table */ -static reloc_howto_type howto_table[] = -{ - {R_ABS, 0, 3, 32, false, 0, complain_overflow_bitfield,a29k_reloc,"ABS", true, 0xffffffff,0xffffffff, false}, - {1}, {2}, {3}, {4}, {5}, {6}, {7}, {8}, {9}, {10}, - {11}, {12}, {13}, {14}, {15}, {16}, {17}, {18}, {19}, {20}, - {21}, {22}, {23}, - {R_IREL, 0, 3, 32, true, 0, complain_overflow_signed,a29k_reloc,"IREL", true, 0xffffffff,0xffffffff, false}, - {R_IABS, 0, 3, 32, false, 0, complain_overflow_bitfield, a29k_reloc,"IABS", true, 0xffffffff,0xffffffff, false}, - {R_ILOHALF, 0, 3, 16, true, 0, complain_overflow_signed, a29k_reloc,"ILOHALF", true, 0x0000ffff,0x0000ffff, false}, - {R_IHIHALF, 0, 3, 16, true, 16, complain_overflow_signed, a29k_reloc,"IHIHALF", true, 0xffff0000,0xffff0000, false}, - {R_IHCONST, 0, 3, 16, true, 0, complain_overflow_signed, a29k_reloc,"IHCONST", true, 0xffff0000,0xffff0000, false}, - {R_BYTE, 0, 0, 8, false, 0, complain_overflow_bitfield, a29k_reloc,"BYTE", true, 0x000000ff,0x000000ff, false}, - {R_HWORD, 0, 1, 16, false, 0, complain_overflow_bitfield, a29k_reloc,"HWORD", true, 0x0000ffff,0x0000ffff, false}, - {R_WORD, 0, 2, 32, false, 0, complain_overflow_bitfield, a29k_reloc,"WORD", true, 0xffffffff,0xffffffff, false}, -}; - -#define BADMAG(x) A29KBADMAG(x) - -#define RELOC_PROCESSING(relent, reloc, symbols, abfd, section) \ - reloc_processing(relent, reloc, symbols, abfd, section) - -static void -reloc_processing (relent,reloc, symbols, abfd, section) - arelent *relent; - struct internal_reloc *reloc; - asymbol **symbols; - bfd *abfd; - asection *section; -{ - static bfd_vma ihihalf_vaddr = (bfd_vma) -1; - - relent->address = reloc->r_vaddr; - relent->howto = howto_table + reloc->r_type; - if (reloc->r_type == R_IHCONST) - { - /* The address of an R_IHCONST should always be the address of - the immediately preceding R_IHIHALF. relocs generated by gas - are correct, but relocs generated by High C are different (I - can't figure out what the address means for High C). We can - handle both gas and High C by ignoring the address here, and - simply reusing the address saved for R_IHIHALF. */ - if (ihihalf_vaddr == (bfd_vma) -1) - abort (); - relent->address = ihihalf_vaddr; - ihihalf_vaddr = (bfd_vma) -1; - relent->addend = reloc->r_symndx; - relent->sym_ptr_ptr= bfd_abs_section_ptr->symbol_ptr_ptr; - } - else - { - asymbol *ptr; - relent->sym_ptr_ptr = symbols + obj_convert(abfd)[reloc->r_symndx]; - - ptr = *(relent->sym_ptr_ptr); - - if (ptr - && bfd_asymbol_bfd(ptr) == abfd - - && ((ptr->flags & BSF_OLD_COMMON)== 0)) - { - relent->addend = 0; - } - else - { - relent->addend = 0; - } - relent->address-= section->vma; - if (reloc->r_type == R_IHIHALF) - ihihalf_vaddr = relent->address; - else if (ihihalf_vaddr != (bfd_vma) -1) - abort (); - } -} - -/* The reloc processing routine for the optimized COFF linker. */ - -static boolean -coff_a29k_relocate_section (output_bfd, info, input_bfd, input_section, - contents, relocs, syms, sections) - bfd *output_bfd; - struct bfd_link_info *info; - bfd *input_bfd; - asection *input_section; - bfd_byte *contents; - struct internal_reloc *relocs; - struct internal_syment *syms; - asection **sections; -{ - struct internal_reloc *rel; - struct internal_reloc *relend; - boolean hihalf; - bfd_vma hihalf_val; - - /* If we are performing a relocateable link, we don't need to do a - thing. The caller will take care of adjusting the reloc - addresses and symbol indices. */ - if (info->relocateable) - return true; - - hihalf = false; - hihalf_val = 0; - - rel = relocs; - relend = rel + input_section->reloc_count; - for (; rel < relend; rel++) - { - long symndx; - bfd_byte *loc; - struct coff_link_hash_entry *h; - struct internal_syment *sym; - asection *sec; - bfd_vma val; - boolean overflow; - unsigned long insn; - long signed_value; - unsigned long unsigned_value; - bfd_reloc_status_type rstat; - - symndx = rel->r_symndx; - loc = contents + rel->r_vaddr - input_section->vma; - - if (symndx == -1) - h = NULL; - else - h = obj_coff_sym_hashes (input_bfd)[symndx]; - - sym = NULL; - sec = NULL; - val = 0; - - /* An R_IHCONST reloc does not have a symbol. Instead, the - symbol index is an addend. R_IHCONST is always used in - conjunction with R_IHHALF. */ - if (rel->r_type != R_IHCONST) - { - if (h == NULL) - { - if (symndx == -1) - sec = bfd_abs_section_ptr; - else - { - sym = syms + symndx; - sec = sections[symndx]; - val = (sec->output_section->vma - + sec->output_offset - + sym->n_value - - sec->vma); - } - } - else - { - if (h->root.type == bfd_link_hash_defined - || h->root.type == bfd_link_hash_defweak) - { - sec = h->root.u.def.section; - val = (h->root.u.def.value - + sec->output_section->vma - + sec->output_offset); - } - else - { - if (! ((*info->callbacks->undefined_symbol) - (info, h->root.root.string, input_bfd, input_section, - rel->r_vaddr - input_section->vma))) - return false; - } - } - - if (hihalf) - { - if (! ((*info->callbacks->reloc_dangerous) - (info, "missing IHCONST reloc", input_bfd, - input_section, rel->r_vaddr - input_section->vma))) - return false; - hihalf = false; - } - } - - overflow = false; - - switch (rel->r_type) - { - default: - bfd_set_error (bfd_error_bad_value); - return false; - - case R_IREL: - insn = bfd_get_32 (input_bfd, loc); - - /* Extract the addend. */ - signed_value = EXTRACT_HWORD (insn); - signed_value = SIGN_EXTEND_HWORD (signed_value); - signed_value <<= 2; - - /* Unfortunately, there are two different versions of COFF - a29k. In the original AMD version, the value stored in - the field for the R_IREL reloc is a simple addend. In - the GNU version, the value is the negative of the address - of the reloc within section. We try to cope here by - assuming the AMD version, unless the addend is exactly - the negative of the address; in the latter case we assume - the GNU version. This means that something like - .text - nop - jmp i-4 - will fail, because the addend of -4 will happen to equal - the negative of the address within the section. The - compiler will never generate code like this. - - At some point in the future we may want to take out this - check. */ - - if (signed_value == - (long) (rel->r_vaddr - input_section->vma)) - signed_value = 0; - - /* Determine the destination of the jump. */ - signed_value += val; - - if ((signed_value & ~0x3ffff) == 0) - { - /* We can use an absolute jump. */ - insn |= (1 << 24); - } - else - { - /* Make the destination PC relative. */ - signed_value -= (input_section->output_section->vma - + input_section->output_offset - + (rel->r_vaddr - input_section->vma)); - if (signed_value > 0x1ffff || signed_value < - 0x20000) - { - overflow = true; - signed_value = 0; - } - } - - /* Put the adjusted value back into the instruction. */ - signed_value >>= 2; - insn = INSERT_HWORD (insn, signed_value); - - bfd_put_32 (input_bfd, (bfd_vma) insn, loc); - - break; - - case R_ILOHALF: - insn = bfd_get_32 (input_bfd, loc); - unsigned_value = EXTRACT_HWORD (insn); - unsigned_value += val; - insn = INSERT_HWORD (insn, unsigned_value); - bfd_put_32 (input_bfd, insn, loc); - break; - - case R_IHIHALF: - /* Save the value for the R_IHCONST reloc. */ - hihalf = true; - hihalf_val = val; - break; - - case R_IHCONST: - if (! hihalf) - { - if (! ((*info->callbacks->reloc_dangerous) - (info, "missing IHIHALF reloc", input_bfd, - input_section, rel->r_vaddr - input_section->vma))) - return false; - hihalf_val = 0; - } - - insn = bfd_get_32 (input_bfd, loc); - unsigned_value = rel->r_symndx + hihalf_val; - unsigned_value >>= 16; - insn = INSERT_HWORD (insn, unsigned_value); - bfd_put_32 (input_bfd, (bfd_vma) insn, loc); - - hihalf = false; - - break; - - case R_BYTE: - case R_HWORD: - case R_WORD: - rstat = _bfd_relocate_contents (howto_table + rel->r_type, - input_bfd, val, loc); - if (rstat == bfd_reloc_overflow) - overflow = true; - else if (rstat != bfd_reloc_ok) - abort (); - break; - } - - if (overflow) - { - const char *name; - char buf[SYMNMLEN + 1]; - - if (symndx == -1) - name = "*ABS*"; - else if (h != NULL) - name = h->root.root.string; - else if (sym == NULL) - name = "*unknown*"; - else if (sym->_n._n_n._n_zeroes == 0 - && sym->_n._n_n._n_offset != 0) - name = obj_coff_strings (input_bfd) + sym->_n._n_n._n_offset; - else - { - strncpy (buf, sym->_n._n_name, SYMNMLEN); - buf[SYMNMLEN] = '\0'; - name = buf; - } - - if (! ((*info->callbacks->reloc_overflow) - (info, name, howto_table[rel->r_type].name, (bfd_vma) 0, - input_bfd, input_section, - rel->r_vaddr - input_section->vma))) - return false; - } - } - - return true; -} - -#define coff_relocate_section coff_a29k_relocate_section - -/* We don't want to change the symndx of a R_IHCONST reloc, since it - is actually an addend, not a symbol index at all. */ - -/*ARGSUSED*/ -static boolean -coff_a29k_adjust_symndx (obfd, info, ibfd, sec, irel, adjustedp) - bfd *obfd; - struct bfd_link_info *info; - bfd *ibfd; - asection *sec; - struct internal_reloc *irel; - boolean *adjustedp; -{ - if (irel->r_type == R_IHCONST) - *adjustedp = true; - else - *adjustedp = false; - return true; -} - -#define coff_adjust_symndx coff_a29k_adjust_symndx - -#include "coffcode.h" - -const bfd_target a29kcoff_big_vec = -{ - "coff-a29k-big", /* name */ - bfd_target_coff_flavour, - BFD_ENDIAN_BIG, /* data byte order is big */ - BFD_ENDIAN_BIG, /* header byte order is big */ - - (HAS_RELOC | EXEC_P | /* object flags */ - HAS_LINENO | HAS_DEBUG | - HAS_SYMS | HAS_LOCALS | WP_TEXT), - - (SEC_HAS_CONTENTS | SEC_ALLOC /* section flags */ - | SEC_LOAD | SEC_RELOC - | SEC_READONLY ), - '_', /* leading underscore */ - '/', /* ar_pad_char */ - 15, /* ar_max_namelen */ - /* data */ - bfd_getb64, bfd_getb_signed_64, bfd_putb64, - bfd_getb32, bfd_getb_signed_32, bfd_putb32, - bfd_getb16, bfd_getb_signed_16, bfd_putb16, - /* hdrs */ - bfd_getb64, bfd_getb_signed_64, bfd_putb64, - bfd_getb32, bfd_getb_signed_32, bfd_putb32, - bfd_getb16, bfd_getb_signed_16, bfd_putb16, - - { - - _bfd_dummy_target, - coff_object_p, - bfd_generic_archive_p, - _bfd_dummy_target - }, - { - bfd_false, - coff_mkobject, - _bfd_generic_mkarchive, - bfd_false - }, - { - bfd_false, - coff_write_object_contents, - _bfd_write_archive_contents, - bfd_false - }, - - BFD_JUMP_TABLE_GENERIC (coff), - BFD_JUMP_TABLE_COPY (coff), - BFD_JUMP_TABLE_CORE (_bfd_nocore), - BFD_JUMP_TABLE_ARCHIVE (_bfd_archive_coff), - BFD_JUMP_TABLE_SYMBOLS (coff), - BFD_JUMP_TABLE_RELOCS (coff), - BFD_JUMP_TABLE_WRITE (coff), - BFD_JUMP_TABLE_LINK (coff), - BFD_JUMP_TABLE_DYNAMIC (_bfd_nodynamic), - - COFF_SWAP_TABLE - }; diff --git a/contrib/gdb/bfd/coff-alpha.c b/contrib/gdb/bfd/coff-alpha.c deleted file mode 100644 index b14f3ef207b6b..0000000000000 --- a/contrib/gdb/bfd/coff-alpha.c +++ /dev/null @@ -1,2390 +0,0 @@ -/* BFD back-end for ALPHA Extended-Coff files. - Copyright 1993, 1994, 1995, 1996 Free Software Foundation, Inc. - Modified from coff-mips.c by Steve Chamberlain <sac@cygnus.com> and - Ian Lance Taylor <ian@cygnus.com>. - -This file is part of BFD, the Binary File Descriptor library. - -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 2 of the License, 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ - -#include "bfd.h" -#include "sysdep.h" -#include "bfdlink.h" -#include "libbfd.h" -#include "coff/internal.h" -#include "coff/sym.h" -#include "coff/symconst.h" -#include "coff/ecoff.h" -#include "coff/alpha.h" -#include "aout/ar.h" -#include "libcoff.h" -#include "libecoff.h" - -/* Prototypes for static functions. */ - -static const bfd_target *alpha_ecoff_object_p PARAMS ((bfd *)); -static boolean alpha_ecoff_bad_format_hook PARAMS ((bfd *abfd, PTR filehdr)); -static PTR alpha_ecoff_mkobject_hook PARAMS ((bfd *, PTR filehdr, PTR aouthdr)); -static void alpha_ecoff_swap_reloc_in PARAMS ((bfd *, PTR, - struct internal_reloc *)); -static void alpha_ecoff_swap_reloc_out PARAMS ((bfd *, - const struct internal_reloc *, - PTR)); -static void alpha_adjust_reloc_in PARAMS ((bfd *, - const struct internal_reloc *, - arelent *)); -static void alpha_adjust_reloc_out PARAMS ((bfd *, const arelent *, - struct internal_reloc *)); -static bfd_byte *alpha_ecoff_get_relocated_section_contents - PARAMS ((bfd *abfd, struct bfd_link_info *, struct bfd_link_order *, - bfd_byte *data, boolean relocateable, asymbol **symbols)); -static bfd_vma alpha_convert_external_reloc - PARAMS ((bfd *, struct bfd_link_info *, bfd *, struct external_reloc *, - struct ecoff_link_hash_entry *)); -static boolean alpha_relocate_section PARAMS ((bfd *, struct bfd_link_info *, - bfd *, asection *, - bfd_byte *, PTR)); -static boolean alpha_adjust_headers - PARAMS ((bfd *, struct internal_filehdr *, struct internal_aouthdr *)); -static PTR alpha_ecoff_read_ar_hdr PARAMS ((bfd *)); -static bfd *alpha_ecoff_get_elt_at_filepos PARAMS ((bfd *, file_ptr)); -static bfd *alpha_ecoff_openr_next_archived_file PARAMS ((bfd *, bfd *)); -static bfd *alpha_ecoff_get_elt_at_index PARAMS ((bfd *, symindex)); - -/* ECOFF has COFF sections, but the debugging information is stored in - a completely different format. ECOFF targets use some of the - swapping routines from coffswap.h, and some of the generic COFF - routines in coffgen.c, but, unlike the real COFF targets, do not - use coffcode.h itself. - - Get the generic COFF swapping routines, except for the reloc, - symbol, and lineno ones. Give them ecoff names. Define some - accessor macros for the large sizes used for Alpha ECOFF. */ - -#define GET_FILEHDR_SYMPTR bfd_h_get_64 -#define PUT_FILEHDR_SYMPTR bfd_h_put_64 -#define GET_AOUTHDR_TSIZE bfd_h_get_64 -#define PUT_AOUTHDR_TSIZE bfd_h_put_64 -#define GET_AOUTHDR_DSIZE bfd_h_get_64 -#define PUT_AOUTHDR_DSIZE bfd_h_put_64 -#define GET_AOUTHDR_BSIZE bfd_h_get_64 -#define PUT_AOUTHDR_BSIZE bfd_h_put_64 -#define GET_AOUTHDR_ENTRY bfd_h_get_64 -#define PUT_AOUTHDR_ENTRY bfd_h_put_64 -#define GET_AOUTHDR_TEXT_START bfd_h_get_64 -#define PUT_AOUTHDR_TEXT_START bfd_h_put_64 -#define GET_AOUTHDR_DATA_START bfd_h_get_64 -#define PUT_AOUTHDR_DATA_START bfd_h_put_64 -#define GET_SCNHDR_PADDR bfd_h_get_64 -#define PUT_SCNHDR_PADDR bfd_h_put_64 -#define GET_SCNHDR_VADDR bfd_h_get_64 -#define PUT_SCNHDR_VADDR bfd_h_put_64 -#define GET_SCNHDR_SIZE bfd_h_get_64 -#define PUT_SCNHDR_SIZE bfd_h_put_64 -#define GET_SCNHDR_SCNPTR bfd_h_get_64 -#define PUT_SCNHDR_SCNPTR bfd_h_put_64 -#define GET_SCNHDR_RELPTR bfd_h_get_64 -#define PUT_SCNHDR_RELPTR bfd_h_put_64 -#define GET_SCNHDR_LNNOPTR bfd_h_get_64 -#define PUT_SCNHDR_LNNOPTR bfd_h_put_64 - -#define ALPHAECOFF - -#define NO_COFF_RELOCS -#define NO_COFF_SYMBOLS -#define NO_COFF_LINENOS -#define coff_swap_filehdr_in alpha_ecoff_swap_filehdr_in -#define coff_swap_filehdr_out alpha_ecoff_swap_filehdr_out -#define coff_swap_aouthdr_in alpha_ecoff_swap_aouthdr_in -#define coff_swap_aouthdr_out alpha_ecoff_swap_aouthdr_out -#define coff_swap_scnhdr_in alpha_ecoff_swap_scnhdr_in -#define coff_swap_scnhdr_out alpha_ecoff_swap_scnhdr_out -#include "coffswap.h" - -/* Get the ECOFF swapping routines. */ -#define ECOFF_64 -#include "ecoffswap.h" - -/* How to process the various reloc types. */ - -static bfd_reloc_status_type -reloc_nil PARAMS ((bfd *, arelent *, asymbol *, PTR, - asection *, bfd *, char **)); - -static bfd_reloc_status_type -reloc_nil (abfd, reloc, sym, data, sec, output_bfd, error_message) - bfd *abfd; - arelent *reloc; - asymbol *sym; - PTR data; - asection *sec; - bfd *output_bfd; - char **error_message; -{ - return bfd_reloc_ok; -} - -/* In case we're on a 32-bit machine, construct a 64-bit "-1" value - from smaller values. Start with zero, widen, *then* decrement. */ -#define MINUS_ONE (((bfd_vma)0) - 1) - -static reloc_howto_type alpha_howto_table[] = -{ - /* Reloc type 0 is ignored by itself. However, it appears after a - GPDISP reloc to identify the location where the low order 16 bits - of the gp register are loaded. */ - HOWTO (ALPHA_R_IGNORE, /* type */ - 0, /* rightshift */ - 0, /* size (0 = byte, 1 = short, 2 = long) */ - 8, /* bitsize */ - true, /* pc_relative */ - 0, /* bitpos */ - complain_overflow_dont, /* complain_on_overflow */ - reloc_nil, /* special_function */ - "IGNORE", /* name */ - true, /* partial_inplace */ - 0, /* src_mask */ - 0, /* dst_mask */ - true), /* pcrel_offset */ - - /* A 32 bit reference to a symbol. */ - HOWTO (ALPHA_R_REFLONG, /* type */ - 0, /* rightshift */ - 2, /* size (0 = byte, 1 = short, 2 = long) */ - 32, /* bitsize */ - false, /* pc_relative */ - 0, /* bitpos */ - complain_overflow_bitfield, /* complain_on_overflow */ - 0, /* special_function */ - "REFLONG", /* name */ - true, /* partial_inplace */ - 0xffffffff, /* src_mask */ - 0xffffffff, /* dst_mask */ - false), /* pcrel_offset */ - - /* A 64 bit reference to a symbol. */ - HOWTO (ALPHA_R_REFQUAD, /* type */ - 0, /* rightshift */ - 4, /* size (0 = byte, 1 = short, 2 = long) */ - 64, /* bitsize */ - false, /* pc_relative */ - 0, /* bitpos */ - complain_overflow_bitfield, /* complain_on_overflow */ - 0, /* special_function */ - "REFQUAD", /* name */ - true, /* partial_inplace */ - MINUS_ONE, /* src_mask */ - MINUS_ONE, /* dst_mask */ - false), /* pcrel_offset */ - - /* A 32 bit GP relative offset. This is just like REFLONG except - that when the value is used the value of the gp register will be - added in. */ - HOWTO (ALPHA_R_GPREL32, /* type */ - 0, /* rightshift */ - 2, /* size (0 = byte, 1 = short, 2 = long) */ - 32, /* bitsize */ - false, /* pc_relative */ - 0, /* bitpos */ - complain_overflow_bitfield, /* complain_on_overflow */ - 0, /* special_function */ - "GPREL32", /* name */ - true, /* partial_inplace */ - 0xffffffff, /* src_mask */ - 0xffffffff, /* dst_mask */ - false), /* pcrel_offset */ - - /* Used for an instruction that refers to memory off the GP - register. The offset is 16 bits of the 32 bit instruction. This - reloc always seems to be against the .lita section. */ - HOWTO (ALPHA_R_LITERAL, /* type */ - 0, /* rightshift */ - 2, /* size (0 = byte, 1 = short, 2 = long) */ - 16, /* bitsize */ - false, /* pc_relative */ - 0, /* bitpos */ - complain_overflow_signed, /* complain_on_overflow */ - 0, /* special_function */ - "LITERAL", /* name */ - true, /* partial_inplace */ - 0xffff, /* src_mask */ - 0xffff, /* dst_mask */ - false), /* pcrel_offset */ - - /* This reloc only appears immediately following a LITERAL reloc. - It identifies a use of the literal. It seems that the linker can - use this to eliminate a portion of the .lita section. The symbol - index is special: 1 means the literal address is in the base - register of a memory format instruction; 2 means the literal - address is in the byte offset register of a byte-manipulation - instruction; 3 means the literal address is in the target - register of a jsr instruction. This does not actually do any - relocation. */ - HOWTO (ALPHA_R_LITUSE, /* type */ - 0, /* rightshift */ - 2, /* size (0 = byte, 1 = short, 2 = long) */ - 32, /* bitsize */ - false, /* pc_relative */ - 0, /* bitpos */ - complain_overflow_dont, /* complain_on_overflow */ - reloc_nil, /* special_function */ - "LITUSE", /* name */ - false, /* partial_inplace */ - 0, /* src_mask */ - 0, /* dst_mask */ - false), /* pcrel_offset */ - - /* Load the gp register. This is always used for a ldah instruction - which loads the upper 16 bits of the gp register. The next reloc - will be an IGNORE reloc which identifies the location of the lda - instruction which loads the lower 16 bits. The symbol index of - the GPDISP instruction appears to actually be the number of bytes - between the ldah and lda instructions. This gives two different - ways to determine where the lda instruction is; I don't know why - both are used. The value to use for the relocation is the - difference between the GP value and the current location; the - load will always be done against a register holding the current - address. */ - HOWTO (ALPHA_R_GPDISP, /* type */ - 16, /* rightshift */ - 2, /* size (0 = byte, 1 = short, 2 = long) */ - 16, /* bitsize */ - true, /* pc_relative */ - 0, /* bitpos */ - complain_overflow_dont, /* complain_on_overflow */ - reloc_nil, /* special_function */ - "GPDISP", /* name */ - true, /* partial_inplace */ - 0xffff, /* src_mask */ - 0xffff, /* dst_mask */ - true), /* pcrel_offset */ - - /* A 21 bit branch. The native assembler generates these for - branches within the text segment, and also fills in the PC - relative offset in the instruction. */ - HOWTO (ALPHA_R_BRADDR, /* type */ - 2, /* rightshift */ - 2, /* size (0 = byte, 1 = short, 2 = long) */ - 21, /* bitsize */ - true, /* pc_relative */ - 0, /* bitpos */ - complain_overflow_signed, /* complain_on_overflow */ - 0, /* special_function */ - "BRADDR", /* name */ - true, /* partial_inplace */ - 0x1fffff, /* src_mask */ - 0x1fffff, /* dst_mask */ - false), /* pcrel_offset */ - - /* A hint for a jump to a register. */ - HOWTO (ALPHA_R_HINT, /* type */ - 2, /* rightshift */ - 2, /* size (0 = byte, 1 = short, 2 = long) */ - 14, /* bitsize */ - true, /* pc_relative */ - 0, /* bitpos */ - complain_overflow_dont, /* complain_on_overflow */ - 0, /* special_function */ - "HINT", /* name */ - true, /* partial_inplace */ - 0x3fff, /* src_mask */ - 0x3fff, /* dst_mask */ - false), /* pcrel_offset */ - - /* 16 bit PC relative offset. */ - HOWTO (ALPHA_R_SREL16, /* type */ - 0, /* rightshift */ - 1, /* size (0 = byte, 1 = short, 2 = long) */ - 16, /* bitsize */ - true, /* pc_relative */ - 0, /* bitpos */ - complain_overflow_signed, /* complain_on_overflow */ - 0, /* special_function */ - "SREL16", /* name */ - true, /* partial_inplace */ - 0xffff, /* src_mask */ - 0xffff, /* dst_mask */ - false), /* pcrel_offset */ - - /* 32 bit PC relative offset. */ - HOWTO (ALPHA_R_SREL32, /* type */ - 0, /* rightshift */ - 2, /* size (0 = byte, 1 = short, 2 = long) */ - 32, /* bitsize */ - true, /* pc_relative */ - 0, /* bitpos */ - complain_overflow_signed, /* complain_on_overflow */ - 0, /* special_function */ - "SREL32", /* name */ - true, /* partial_inplace */ - 0xffffffff, /* src_mask */ - 0xffffffff, /* dst_mask */ - false), /* pcrel_offset */ - - /* A 64 bit PC relative offset. */ - HOWTO (ALPHA_R_SREL64, /* type */ - 0, /* rightshift */ - 4, /* size (0 = byte, 1 = short, 2 = long) */ - 64, /* bitsize */ - true, /* pc_relative */ - 0, /* bitpos */ - complain_overflow_signed, /* complain_on_overflow */ - 0, /* special_function */ - "SREL64", /* name */ - true, /* partial_inplace */ - MINUS_ONE, /* src_mask */ - MINUS_ONE, /* dst_mask */ - false), /* pcrel_offset */ - - /* Push a value on the reloc evaluation stack. */ - HOWTO (ALPHA_R_OP_PUSH, /* type */ - 0, /* rightshift */ - 0, /* size (0 = byte, 1 = short, 2 = long) */ - 0, /* bitsize */ - false, /* pc_relative */ - 0, /* bitpos */ - complain_overflow_dont, /* complain_on_overflow */ - 0, /* special_function */ - "OP_PUSH", /* name */ - false, /* partial_inplace */ - 0, /* src_mask */ - 0, /* dst_mask */ - false), /* pcrel_offset */ - - /* Store the value from the stack at the given address. Store it in - a bitfield of size r_size starting at bit position r_offset. */ - HOWTO (ALPHA_R_OP_STORE, /* type */ - 0, /* rightshift */ - 4, /* size (0 = byte, 1 = short, 2 = long) */ - 64, /* bitsize */ - false, /* pc_relative */ - 0, /* bitpos */ - complain_overflow_dont, /* complain_on_overflow */ - 0, /* special_function */ - "OP_STORE", /* name */ - false, /* partial_inplace */ - 0, /* src_mask */ - MINUS_ONE, /* dst_mask */ - false), /* pcrel_offset */ - - /* Subtract the reloc address from the value on the top of the - relocation stack. */ - HOWTO (ALPHA_R_OP_PSUB, /* type */ - 0, /* rightshift */ - 0, /* size (0 = byte, 1 = short, 2 = long) */ - 0, /* bitsize */ - false, /* pc_relative */ - 0, /* bitpos */ - complain_overflow_dont, /* complain_on_overflow */ - 0, /* special_function */ - "OP_PSUB", /* name */ - false, /* partial_inplace */ - 0, /* src_mask */ - 0, /* dst_mask */ - false), /* pcrel_offset */ - - /* Shift the value on the top of the relocation stack right by the - given value. */ - HOWTO (ALPHA_R_OP_PRSHIFT, /* type */ - 0, /* rightshift */ - 0, /* size (0 = byte, 1 = short, 2 = long) */ - 0, /* bitsize */ - false, /* pc_relative */ - 0, /* bitpos */ - complain_overflow_dont, /* complain_on_overflow */ - 0, /* special_function */ - "OP_PRSHIFT", /* name */ - false, /* partial_inplace */ - 0, /* src_mask */ - 0, /* dst_mask */ - false), /* pcrel_offset */ - - /* Adjust the GP value for a new range in the object file. */ - HOWTO (ALPHA_R_GPVALUE, /* type */ - 0, /* rightshift */ - 0, /* size (0 = byte, 1 = short, 2 = long) */ - 0, /* bitsize */ - false, /* pc_relative */ - 0, /* bitpos */ - complain_overflow_dont, /* complain_on_overflow */ - 0, /* special_function */ - "GPVALUE", /* name */ - false, /* partial_inplace */ - 0, /* src_mask */ - 0, /* dst_mask */ - false) /* pcrel_offset */ -}; - -/* Recognize an Alpha ECOFF file. */ - -static const bfd_target * -alpha_ecoff_object_p (abfd) - bfd *abfd; -{ - static const bfd_target *ret; - - ret = coff_object_p (abfd); - - if (ret != NULL) - { - asection *sec; - - /* Alpha ECOFF has a .pdata section. The lnnoptr field of the - .pdata section is the number of entries it contains. Each - entry takes up 8 bytes. The number of entries is required - since the section is aligned to a 16 byte boundary. When we - link .pdata sections together, we do not want to include the - alignment bytes. We handle this on input by faking the size - of the .pdata section to remove the unwanted alignment bytes. - On output we will set the lnnoptr field and force the - alignment. */ - sec = bfd_get_section_by_name (abfd, _PDATA); - if (sec != (asection *) NULL) - { - bfd_size_type size; - - size = sec->line_filepos * 8; - BFD_ASSERT (size == bfd_section_size (abfd, sec) - || size + 8 == bfd_section_size (abfd, sec)); - if (! bfd_set_section_size (abfd, sec, size)) - return NULL; - } - } - - return ret; -} - -/* See whether the magic number matches. */ - -static boolean -alpha_ecoff_bad_format_hook (abfd, filehdr) - bfd *abfd; - PTR filehdr; -{ - struct internal_filehdr *internal_f = (struct internal_filehdr *) filehdr; - - if (ALPHA_ECOFF_BADMAG (*internal_f)) - return false; - - return true; -} - -/* This is a hook called by coff_real_object_p to create any backend - specific information. */ - -static PTR -alpha_ecoff_mkobject_hook (abfd, filehdr, aouthdr) - bfd *abfd; - PTR filehdr; - PTR aouthdr; -{ - PTR ecoff; - - ecoff = _bfd_ecoff_mkobject_hook (abfd, filehdr, aouthdr); - - if (ecoff != NULL) - { - struct internal_filehdr *internal_f = (struct internal_filehdr *) filehdr; - - /* Set additional BFD flags according to the object type from the - machine specific file header flags. */ - switch (internal_f->f_flags & F_ALPHA_OBJECT_TYPE_MASK) - { - case F_ALPHA_SHARABLE: - abfd->flags |= DYNAMIC; - break; - case F_ALPHA_CALL_SHARED: - /* Always executable if using shared libraries as the run time - loader might resolve undefined references. */ - abfd->flags |= (DYNAMIC | EXEC_P); - break; - } - } - return ecoff; -} - -/* Reloc handling. */ - -/* Swap a reloc in. */ - -static void -alpha_ecoff_swap_reloc_in (abfd, ext_ptr, intern) - bfd *abfd; - PTR ext_ptr; - struct internal_reloc *intern; -{ - const RELOC *ext = (RELOC *) ext_ptr; - - intern->r_vaddr = bfd_h_get_64 (abfd, (bfd_byte *) ext->r_vaddr); - intern->r_symndx = bfd_h_get_32 (abfd, (bfd_byte *) ext->r_symndx); - - BFD_ASSERT (bfd_header_little_endian (abfd)); - - intern->r_type = ((ext->r_bits[0] & RELOC_BITS0_TYPE_LITTLE) - >> RELOC_BITS0_TYPE_SH_LITTLE); - intern->r_extern = (ext->r_bits[1] & RELOC_BITS1_EXTERN_LITTLE) != 0; - intern->r_offset = ((ext->r_bits[1] & RELOC_BITS1_OFFSET_LITTLE) - >> RELOC_BITS1_OFFSET_SH_LITTLE); - /* Ignored the reserved bits. */ - intern->r_size = ((ext->r_bits[3] & RELOC_BITS3_SIZE_LITTLE) - >> RELOC_BITS3_SIZE_SH_LITTLE); - - if (intern->r_type == ALPHA_R_LITUSE - || intern->r_type == ALPHA_R_GPDISP) - { - /* Handle the LITUSE and GPDISP relocs specially. Its symndx - value is not actually a symbol index, but is instead a - special code. We put the code in the r_size field, and - clobber the symndx. */ - if (intern->r_size != 0) - abort (); - intern->r_size = intern->r_symndx; - intern->r_symndx = RELOC_SECTION_NONE; - } - else if (intern->r_type == ALPHA_R_IGNORE) - { - /* The IGNORE reloc generally follows a GPDISP reloc, and is - against the .lita section. The section is irrelevant. */ - if (! intern->r_extern && - intern->r_symndx == RELOC_SECTION_ABS) - abort (); - if (! intern->r_extern && intern->r_symndx == RELOC_SECTION_LITA) - intern->r_symndx = RELOC_SECTION_ABS; - } -} - -/* Swap a reloc out. */ - -static void -alpha_ecoff_swap_reloc_out (abfd, intern, dst) - bfd *abfd; - const struct internal_reloc *intern; - PTR dst; -{ - RELOC *ext = (RELOC *) dst; - long symndx; - unsigned char size; - - /* Undo the hackery done in swap_reloc_in. */ - if (intern->r_type == ALPHA_R_LITUSE - || intern->r_type == ALPHA_R_GPDISP) - { - symndx = intern->r_size; - size = 0; - } - else if (intern->r_type == ALPHA_R_IGNORE - && ! intern->r_extern - && intern->r_symndx == RELOC_SECTION_ABS) - { - symndx = RELOC_SECTION_LITA; - size = intern->r_size; - } - else - { - symndx = intern->r_symndx; - size = intern->r_size; - } - - BFD_ASSERT (intern->r_extern - || (intern->r_symndx >= 0 && intern->r_symndx <= 14)); - - bfd_h_put_64 (abfd, intern->r_vaddr, (bfd_byte *) ext->r_vaddr); - bfd_h_put_32 (abfd, symndx, (bfd_byte *) ext->r_symndx); - - BFD_ASSERT (bfd_header_little_endian (abfd)); - - ext->r_bits[0] = ((intern->r_type << RELOC_BITS0_TYPE_SH_LITTLE) - & RELOC_BITS0_TYPE_LITTLE); - ext->r_bits[1] = ((intern->r_extern ? RELOC_BITS1_EXTERN_LITTLE : 0) - | ((intern->r_offset << RELOC_BITS1_OFFSET_SH_LITTLE) - & RELOC_BITS1_OFFSET_LITTLE)); - ext->r_bits[2] = 0; - ext->r_bits[3] = ((size << RELOC_BITS3_SIZE_SH_LITTLE) - & RELOC_BITS3_SIZE_LITTLE); -} - -/* Finish canonicalizing a reloc. Part of this is generic to all - ECOFF targets, and that part is in ecoff.c. The rest is done in - this backend routine. It must fill in the howto field. */ - -static void -alpha_adjust_reloc_in (abfd, intern, rptr) - bfd *abfd; - const struct internal_reloc *intern; - arelent *rptr; -{ - if (intern->r_type > ALPHA_R_GPVALUE) - abort (); - - switch (intern->r_type) - { - case ALPHA_R_BRADDR: - case ALPHA_R_SREL16: - case ALPHA_R_SREL32: - case ALPHA_R_SREL64: - /* The PC relative relocs do not seem to use the section VMA as - a negative addend. */ - rptr->addend = 0; - break; - - case ALPHA_R_GPREL32: - case ALPHA_R_LITERAL: - /* Copy the gp value for this object file into the addend, to - ensure that we are not confused by the linker. */ - if (! intern->r_extern) - rptr->addend += ecoff_data (abfd)->gp; - break; - - case ALPHA_R_LITUSE: - case ALPHA_R_GPDISP: - /* The LITUSE and GPDISP relocs do not use a symbol, or an - addend, but they do use a special code. Put this code in the - addend field. */ - rptr->addend = intern->r_size; - break; - - case ALPHA_R_OP_STORE: - /* The STORE reloc needs the size and offset fields. We store - them in the addend. */ - BFD_ASSERT (intern->r_offset <= 256 && intern->r_size <= 256); - rptr->addend = (intern->r_offset << 8) + intern->r_size; - break; - - case ALPHA_R_OP_PUSH: - case ALPHA_R_OP_PSUB: - case ALPHA_R_OP_PRSHIFT: - /* The PUSH, PSUB and PRSHIFT relocs do not actually use an - address. I believe that the address supplied is really an - addend. */ - rptr->addend = intern->r_vaddr; - break; - - case ALPHA_R_GPVALUE: - /* Set the addend field to the new GP value. */ - rptr->addend = intern->r_symndx + ecoff_data (abfd)->gp; - break; - - case ALPHA_R_IGNORE: - /* If the type is ALPHA_R_IGNORE, make sure this is a reference - to the absolute section so that the reloc is ignored. For - some reason the address of this reloc type is not adjusted by - the section vma. We record the gp value for this object file - here, for convenience when doing the GPDISP relocation. */ - rptr->sym_ptr_ptr = bfd_abs_section_ptr->symbol_ptr_ptr; - rptr->address = intern->r_vaddr; - rptr->addend = ecoff_data (abfd)->gp; - break; - - default: - break; - } - - rptr->howto = &alpha_howto_table[intern->r_type]; -} - -/* When writing out a reloc we need to pull some values back out of - the addend field into the reloc. This is roughly the reverse of - alpha_adjust_reloc_in, except that there are several changes we do - not need to undo. */ - -static void -alpha_adjust_reloc_out (abfd, rel, intern) - bfd *abfd; - const arelent *rel; - struct internal_reloc *intern; -{ - switch (intern->r_type) - { - case ALPHA_R_LITUSE: - case ALPHA_R_GPDISP: - intern->r_size = rel->addend; - break; - - case ALPHA_R_OP_STORE: - intern->r_size = rel->addend & 0xff; - intern->r_offset = (rel->addend >> 8) & 0xff; - break; - - case ALPHA_R_OP_PUSH: - case ALPHA_R_OP_PSUB: - case ALPHA_R_OP_PRSHIFT: - intern->r_vaddr = rel->addend; - break; - - case ALPHA_R_IGNORE: - intern->r_vaddr = rel->address; - break; - - default: - break; - } -} - -/* The size of the stack for the relocation evaluator. */ -#define RELOC_STACKSIZE (10) - -/* Alpha ECOFF relocs have a built in expression evaluator as well as - other interdependencies. Rather than use a bunch of special - functions and global variables, we use a single routine to do all - the relocation for a section. I haven't yet worked out how the - assembler is going to handle this. */ - -static bfd_byte * -alpha_ecoff_get_relocated_section_contents (abfd, link_info, link_order, - data, relocateable, symbols) - bfd *abfd; - struct bfd_link_info *link_info; - struct bfd_link_order *link_order; - bfd_byte *data; - boolean relocateable; - asymbol **symbols; -{ - bfd *input_bfd = link_order->u.indirect.section->owner; - asection *input_section = link_order->u.indirect.section; - long reloc_size = bfd_get_reloc_upper_bound (input_bfd, input_section); - arelent **reloc_vector = NULL; - long reloc_count; - bfd *output_bfd = relocateable ? abfd : (bfd *) NULL; - bfd_vma gp; - boolean gp_undefined; - bfd_vma stack[RELOC_STACKSIZE]; - int tos = 0; - - if (reloc_size < 0) - goto error_return; - reloc_vector = (arelent **) bfd_malloc (reloc_size); - if (reloc_vector == NULL && reloc_size != 0) - goto error_return; - - if (! bfd_get_section_contents (input_bfd, input_section, data, - (file_ptr) 0, input_section->_raw_size)) - goto error_return; - - /* The section size is not going to change. */ - input_section->_cooked_size = input_section->_raw_size; - input_section->reloc_done = true; - - reloc_count = bfd_canonicalize_reloc (input_bfd, input_section, - reloc_vector, symbols); - if (reloc_count < 0) - goto error_return; - if (reloc_count == 0) - goto successful_return; - - /* Get the GP value for the output BFD. */ - gp_undefined = false; - gp = _bfd_get_gp_value (abfd); - if (gp == 0) - { - if (relocateable != false) - { - asection *sec; - bfd_vma lo; - - /* Make up a value. */ - lo = (bfd_vma) -1; - for (sec = abfd->sections; sec != NULL; sec = sec->next) - { - if (sec->vma < lo - && (strcmp (sec->name, ".sbss") == 0 - || strcmp (sec->name, ".sdata") == 0 - || strcmp (sec->name, ".lit4") == 0 - || strcmp (sec->name, ".lit8") == 0 - || strcmp (sec->name, ".lita") == 0)) - lo = sec->vma; - } - gp = lo + 0x8000; - _bfd_set_gp_value (abfd, gp); - } - else - { - struct bfd_link_hash_entry *h; - - h = bfd_link_hash_lookup (link_info->hash, "_gp", false, false, - true); - if (h == (struct bfd_link_hash_entry *) NULL - || h->type != bfd_link_hash_defined) - gp_undefined = true; - else - { - gp = (h->u.def.value - + h->u.def.section->output_section->vma - + h->u.def.section->output_offset); - _bfd_set_gp_value (abfd, gp); - } - } - } - - for (; *reloc_vector != (arelent *) NULL; reloc_vector++) - { - arelent *rel; - bfd_reloc_status_type r; - char *err; - - rel = *reloc_vector; - r = bfd_reloc_ok; - switch (rel->howto->type) - { - case ALPHA_R_IGNORE: - rel->address += input_section->output_offset; - break; - - case ALPHA_R_REFLONG: - case ALPHA_R_REFQUAD: - case ALPHA_R_BRADDR: - case ALPHA_R_HINT: - case ALPHA_R_SREL16: - case ALPHA_R_SREL32: - case ALPHA_R_SREL64: - if (relocateable - && ((*rel->sym_ptr_ptr)->flags & BSF_SECTION_SYM) == 0) - { - rel->address += input_section->output_offset; - break; - } - r = bfd_perform_relocation (input_bfd, rel, data, input_section, - output_bfd, &err); - break; - - case ALPHA_R_GPREL32: - /* This relocation is used in a switch table. It is a 32 - bit offset from the current GP value. We must adjust it - by the different between the original GP value and the - current GP value. The original GP value is stored in the - addend. We adjust the addend and let - bfd_perform_relocation finish the job. */ - rel->addend -= gp; - r = bfd_perform_relocation (input_bfd, rel, data, input_section, - output_bfd, &err); - if (r == bfd_reloc_ok && gp_undefined) - { - r = bfd_reloc_dangerous; - err = (char *) "GP relative relocation used when GP not defined"; - } - break; - - case ALPHA_R_LITERAL: - /* This is a reference to a literal value, generally - (always?) in the .lita section. This is a 16 bit GP - relative relocation. Sometimes the subsequent reloc is a - LITUSE reloc, which indicates how this reloc is used. - This sometimes permits rewriting the two instructions - referred to by the LITERAL and the LITUSE into different - instructions which do not refer to .lita. This can save - a memory reference, and permits removing a value from - .lita thus saving GP relative space. - - We do not these optimizations. To do them we would need - to arrange to link the .lita section first, so that by - the time we got here we would know the final values to - use. This would not be particularly difficult, but it is - not currently implemented. */ - - { - unsigned long insn; - - /* I believe that the LITERAL reloc will only apply to a - ldq or ldl instruction, so check my assumption. */ - insn = bfd_get_32 (input_bfd, data + rel->address); - BFD_ASSERT (((insn >> 26) & 0x3f) == 0x29 - || ((insn >> 26) & 0x3f) == 0x28); - - rel->addend -= gp; - r = bfd_perform_relocation (input_bfd, rel, data, input_section, - output_bfd, &err); - if (r == bfd_reloc_ok && gp_undefined) - { - r = bfd_reloc_dangerous; - err = - (char *) "GP relative relocation used when GP not defined"; - } - } - break; - - case ALPHA_R_LITUSE: - /* See ALPHA_R_LITERAL above for the uses of this reloc. It - does not cause anything to happen, itself. */ - rel->address += input_section->output_offset; - break; - - case ALPHA_R_GPDISP: - /* This marks the ldah of an ldah/lda pair which loads the - gp register with the difference of the gp value and the - current location. The second of the pair is r_size bytes - ahead; it used to be marked with an ALPHA_R_IGNORE reloc, - but that no longer happens in OSF/1 3.2. */ - { - unsigned long insn1, insn2; - bfd_vma addend; - - /* Get the two instructions. */ - insn1 = bfd_get_32 (input_bfd, data + rel->address); - insn2 = bfd_get_32 (input_bfd, data + rel->address + rel->addend); - - BFD_ASSERT (((insn1 >> 26) & 0x3f) == 0x09); /* ldah */ - BFD_ASSERT (((insn2 >> 26) & 0x3f) == 0x08); /* lda */ - - /* Get the existing addend. We must account for the sign - extension done by lda and ldah. */ - addend = ((insn1 & 0xffff) << 16) + (insn2 & 0xffff); - if (insn1 & 0x8000) - { - addend -= 0x80000000; - addend -= 0x80000000; - } - if (insn2 & 0x8000) - addend -= 0x10000; - - /* The existing addend includes the different between the - gp of the input BFD and the address in the input BFD. - Subtract this out. */ - addend -= (ecoff_data (input_bfd)->gp - - (input_section->vma + rel->address)); - - /* Now add in the final gp value, and subtract out the - final address. */ - addend += (gp - - (input_section->output_section->vma - + input_section->output_offset - + rel->address)); - - /* Change the instructions, accounting for the sign - extension, and write them out. */ - if (addend & 0x8000) - addend += 0x10000; - insn1 = (insn1 & 0xffff0000) | ((addend >> 16) & 0xffff); - insn2 = (insn2 & 0xffff0000) | (addend & 0xffff); - - bfd_put_32 (input_bfd, (bfd_vma) insn1, data + rel->address); - bfd_put_32 (input_bfd, (bfd_vma) insn2, - data + rel->address + rel->addend); - - rel->address += input_section->output_offset; - } - break; - - case ALPHA_R_OP_PUSH: - /* Push a value on the reloc evaluation stack. */ - { - asymbol *symbol; - bfd_vma relocation; - - if (relocateable) - { - rel->address += input_section->output_offset; - break; - } - - /* Figure out the relocation of this symbol. */ - symbol = *rel->sym_ptr_ptr; - - if (bfd_is_und_section (symbol->section)) - r = bfd_reloc_undefined; - - if (bfd_is_com_section (symbol->section)) - relocation = 0; - else - relocation = symbol->value; - relocation += symbol->section->output_section->vma; - relocation += symbol->section->output_offset; - relocation += rel->addend; - - if (tos >= RELOC_STACKSIZE) - abort (); - - stack[tos++] = relocation; - } - break; - - case ALPHA_R_OP_STORE: - /* Store a value from the reloc stack into a bitfield. */ - { - bfd_vma val; - int offset, size; - - if (relocateable) - { - rel->address += input_section->output_offset; - break; - } - - if (tos == 0) - abort (); - - /* The offset and size for this reloc are encoded into the - addend field by alpha_adjust_reloc_in. */ - offset = (rel->addend >> 8) & 0xff; - size = rel->addend & 0xff; - - val = bfd_get_64 (abfd, data + rel->address); - val &=~ (((1 << size) - 1) << offset); - val |= (stack[--tos] & ((1 << size) - 1)) << offset; - bfd_put_64 (abfd, val, data + rel->address); - } - break; - - case ALPHA_R_OP_PSUB: - /* Subtract a value from the top of the stack. */ - { - asymbol *symbol; - bfd_vma relocation; - - if (relocateable) - { - rel->address += input_section->output_offset; - break; - } - - /* Figure out the relocation of this symbol. */ - symbol = *rel->sym_ptr_ptr; - - if (bfd_is_und_section (symbol->section)) - r = bfd_reloc_undefined; - - if (bfd_is_com_section (symbol->section)) - relocation = 0; - else - relocation = symbol->value; - relocation += symbol->section->output_section->vma; - relocation += symbol->section->output_offset; - relocation += rel->addend; - - if (tos == 0) - abort (); - - stack[tos - 1] -= relocation; - } - break; - - case ALPHA_R_OP_PRSHIFT: - /* Shift the value on the top of the stack. */ - { - asymbol *symbol; - bfd_vma relocation; - - if (relocateable) - { - rel->address += input_section->output_offset; - break; - } - - /* Figure out the relocation of this symbol. */ - symbol = *rel->sym_ptr_ptr; - - if (bfd_is_und_section (symbol->section)) - r = bfd_reloc_undefined; - - if (bfd_is_com_section (symbol->section)) - relocation = 0; - else - relocation = symbol->value; - relocation += symbol->section->output_section->vma; - relocation += symbol->section->output_offset; - relocation += rel->addend; - - if (tos == 0) - abort (); - - stack[tos - 1] >>= relocation; - } - break; - - case ALPHA_R_GPVALUE: - /* I really don't know if this does the right thing. */ - gp = rel->addend; - gp_undefined = false; - break; - - default: - abort (); - } - - if (relocateable) - { - asection *os = input_section->output_section; - - /* A partial link, so keep the relocs. */ - os->orelocation[os->reloc_count] = rel; - os->reloc_count++; - } - - if (r != bfd_reloc_ok) - { - switch (r) - { - case bfd_reloc_undefined: - if (! ((*link_info->callbacks->undefined_symbol) - (link_info, bfd_asymbol_name (*rel->sym_ptr_ptr), - input_bfd, input_section, rel->address))) - goto error_return; - break; - case bfd_reloc_dangerous: - if (! ((*link_info->callbacks->reloc_dangerous) - (link_info, err, input_bfd, input_section, - rel->address))) - goto error_return; - break; - case bfd_reloc_overflow: - if (! ((*link_info->callbacks->reloc_overflow) - (link_info, bfd_asymbol_name (*rel->sym_ptr_ptr), - rel->howto->name, rel->addend, input_bfd, - input_section, rel->address))) - goto error_return; - break; - case bfd_reloc_outofrange: - default: - abort (); - break; - } - } - } - - if (tos != 0) - abort (); - - successful_return: - if (reloc_vector != NULL) - free (reloc_vector); - return data; - - error_return: - if (reloc_vector != NULL) - free (reloc_vector); - return NULL; -} - -/* Get the howto structure for a generic reloc type. */ - -static reloc_howto_type * -alpha_bfd_reloc_type_lookup (abfd, code) - bfd *abfd; - bfd_reloc_code_real_type code; -{ - int alpha_type; - - switch (code) - { - case BFD_RELOC_32: - alpha_type = ALPHA_R_REFLONG; - break; - case BFD_RELOC_64: - case BFD_RELOC_CTOR: - alpha_type = ALPHA_R_REFQUAD; - break; - case BFD_RELOC_GPREL32: - alpha_type = ALPHA_R_GPREL32; - break; - case BFD_RELOC_ALPHA_LITERAL: - alpha_type = ALPHA_R_LITERAL; - break; - case BFD_RELOC_ALPHA_LITUSE: - alpha_type = ALPHA_R_LITUSE; - break; - case BFD_RELOC_ALPHA_GPDISP_HI16: - alpha_type = ALPHA_R_GPDISP; - break; - case BFD_RELOC_ALPHA_GPDISP_LO16: - alpha_type = ALPHA_R_IGNORE; - break; - case BFD_RELOC_23_PCREL_S2: - alpha_type = ALPHA_R_BRADDR; - break; - case BFD_RELOC_ALPHA_HINT: - alpha_type = ALPHA_R_HINT; - break; - case BFD_RELOC_16_PCREL: - alpha_type = ALPHA_R_SREL16; - break; - case BFD_RELOC_32_PCREL: - alpha_type = ALPHA_R_SREL32; - break; - case BFD_RELOC_64_PCREL: - alpha_type = ALPHA_R_SREL64; - break; -#if 0 - case ???: - alpha_type = ALPHA_R_OP_PUSH; - break; - case ???: - alpha_type = ALPHA_R_OP_STORE; - break; - case ???: - alpha_type = ALPHA_R_OP_PSUB; - break; - case ???: - alpha_type = ALPHA_R_OP_PRSHIFT; - break; - case ???: - alpha_type = ALPHA_R_GPVALUE; - break; -#endif - default: - return (reloc_howto_type *) NULL; - } - - return &alpha_howto_table[alpha_type]; -} - -/* A helper routine for alpha_relocate_section which converts an - external reloc when generating relocateable output. Returns the - relocation amount. */ - -static bfd_vma -alpha_convert_external_reloc (output_bfd, info, input_bfd, ext_rel, h) - bfd *output_bfd; - struct bfd_link_info *info; - bfd *input_bfd; - struct external_reloc *ext_rel; - struct ecoff_link_hash_entry *h; -{ - unsigned long r_symndx; - bfd_vma relocation; - - BFD_ASSERT (info->relocateable); - - if (h->root.type == bfd_link_hash_defined - || h->root.type == bfd_link_hash_defweak) - { - asection *hsec; - const char *name; - - /* This symbol is defined in the output. Convert the reloc from - being against the symbol to being against the section. */ - - /* Clear the r_extern bit. */ - ext_rel->r_bits[1] &=~ RELOC_BITS1_EXTERN_LITTLE; - - /* Compute a new r_symndx value. */ - hsec = h->root.u.def.section; - name = bfd_get_section_name (output_bfd, hsec->output_section); - - r_symndx = -1; - switch (name[1]) - { - case 'A': - if (strcmp (name, "*ABS*") == 0) - r_symndx = RELOC_SECTION_ABS; - break; - case 'b': - if (strcmp (name, ".bss") == 0) - r_symndx = RELOC_SECTION_BSS; - break; - case 'd': - if (strcmp (name, ".data") == 0) - r_symndx = RELOC_SECTION_DATA; - break; - case 'f': - if (strcmp (name, ".fini") == 0) - r_symndx = RELOC_SECTION_FINI; - break; - case 'i': - if (strcmp (name, ".init") == 0) - r_symndx = RELOC_SECTION_INIT; - break; - case 'l': - if (strcmp (name, ".lita") == 0) - r_symndx = RELOC_SECTION_LITA; - else if (strcmp (name, ".lit8") == 0) - r_symndx = RELOC_SECTION_LIT8; - else if (strcmp (name, ".lit4") == 0) - r_symndx = RELOC_SECTION_LIT4; - break; - case 'p': - if (strcmp (name, ".pdata") == 0) - r_symndx = RELOC_SECTION_PDATA; - break; - case 'r': - if (strcmp (name, ".rdata") == 0) - r_symndx = RELOC_SECTION_RDATA; - else if (strcmp (name, ".rconst") == 0) - r_symndx = RELOC_SECTION_RCONST; - break; - case 's': - if (strcmp (name, ".sdata") == 0) - r_symndx = RELOC_SECTION_SDATA; - else if (strcmp (name, ".sbss") == 0) - r_symndx = RELOC_SECTION_SBSS; - break; - case 't': - if (strcmp (name, ".text") == 0) - r_symndx = RELOC_SECTION_TEXT; - break; - case 'x': - if (strcmp (name, ".xdata") == 0) - r_symndx = RELOC_SECTION_XDATA; - break; - } - - if (r_symndx == -1) - abort (); - - /* Add the section VMA and the symbol value. */ - relocation = (h->root.u.def.value - + hsec->output_section->vma - + hsec->output_offset); - } - else - { - /* Change the symndx value to the right one for - the output BFD. */ - r_symndx = h->indx; - if (r_symndx == -1) - { - /* Caller must give an error. */ - r_symndx = 0; - } - relocation = 0; - } - - /* Write out the new r_symndx value. */ - bfd_h_put_32 (input_bfd, (bfd_vma) r_symndx, - (bfd_byte *) ext_rel->r_symndx); - - return relocation; -} - -/* Relocate a section while linking an Alpha ECOFF file. This is - quite similar to get_relocated_section_contents. Perhaps they - could be combined somehow. */ - -static boolean -alpha_relocate_section (output_bfd, info, input_bfd, input_section, - contents, external_relocs) - bfd *output_bfd; - struct bfd_link_info *info; - bfd *input_bfd; - asection *input_section; - bfd_byte *contents; - PTR external_relocs; -{ - asection **symndx_to_section, *lita_sec; - struct ecoff_link_hash_entry **sym_hashes; - bfd_vma gp; - boolean gp_undefined; - bfd_vma stack[RELOC_STACKSIZE]; - int tos = 0; - struct external_reloc *ext_rel; - struct external_reloc *ext_rel_end; - - /* We keep a table mapping the symndx found in an internal reloc to - the appropriate section. This is faster than looking up the - section by name each time. */ - symndx_to_section = ecoff_data (input_bfd)->symndx_to_section; - if (symndx_to_section == (asection **) NULL) - { - symndx_to_section = ((asection **) - bfd_alloc (input_bfd, - (NUM_RELOC_SECTIONS - * sizeof (asection *)))); - if (!symndx_to_section) - return false; - - symndx_to_section[RELOC_SECTION_NONE] = NULL; - symndx_to_section[RELOC_SECTION_TEXT] = - bfd_get_section_by_name (input_bfd, ".text"); - symndx_to_section[RELOC_SECTION_RDATA] = - bfd_get_section_by_name (input_bfd, ".rdata"); - symndx_to_section[RELOC_SECTION_DATA] = - bfd_get_section_by_name (input_bfd, ".data"); - symndx_to_section[RELOC_SECTION_SDATA] = - bfd_get_section_by_name (input_bfd, ".sdata"); - symndx_to_section[RELOC_SECTION_SBSS] = - bfd_get_section_by_name (input_bfd, ".sbss"); - symndx_to_section[RELOC_SECTION_BSS] = - bfd_get_section_by_name (input_bfd, ".bss"); - symndx_to_section[RELOC_SECTION_INIT] = - bfd_get_section_by_name (input_bfd, ".init"); - symndx_to_section[RELOC_SECTION_LIT8] = - bfd_get_section_by_name (input_bfd, ".lit8"); - symndx_to_section[RELOC_SECTION_LIT4] = - bfd_get_section_by_name (input_bfd, ".lit4"); - symndx_to_section[RELOC_SECTION_XDATA] = - bfd_get_section_by_name (input_bfd, ".xdata"); - symndx_to_section[RELOC_SECTION_PDATA] = - bfd_get_section_by_name (input_bfd, ".pdata"); - symndx_to_section[RELOC_SECTION_FINI] = - bfd_get_section_by_name (input_bfd, ".fini"); - symndx_to_section[RELOC_SECTION_LITA] = - bfd_get_section_by_name (input_bfd, ".lita"); - symndx_to_section[RELOC_SECTION_ABS] = bfd_abs_section_ptr; - symndx_to_section[RELOC_SECTION_RCONST] = - bfd_get_section_by_name (input_bfd, ".rconst"); - - ecoff_data (input_bfd)->symndx_to_section = symndx_to_section; - } - - sym_hashes = ecoff_data (input_bfd)->sym_hashes; - - /* On the Alpha, the .lita section must be addressable by the global - pointer. To support large programs, we need to allow multiple - global pointers. This works as long as each input .lita section - is <64KB big. This implies that when producing relocatable - output, the .lita section is limited to 64KB. . */ - - lita_sec = symndx_to_section[RELOC_SECTION_LITA]; - gp = _bfd_get_gp_value (output_bfd); - if (! info->relocateable && lita_sec != NULL) - { - struct ecoff_section_tdata *lita_sec_data; - - /* Make sure we have a section data structure to which we can - hang on to the gp value we pick for the section. */ - lita_sec_data = ecoff_section_data (input_bfd, lita_sec); - if (lita_sec_data == NULL) - { - lita_sec_data = ((struct ecoff_section_tdata *) - bfd_zalloc (input_bfd, - sizeof (struct ecoff_section_tdata))); - ecoff_section_data (input_bfd, lita_sec) = lita_sec_data; - } - - if (lita_sec_data->gp != 0) - { - /* If we already assigned a gp to this section, we better - stick with that value. */ - gp = lita_sec_data->gp; - } - else - { - bfd_vma lita_vma; - bfd_size_type lita_size; - - lita_vma = lita_sec->output_offset + lita_sec->output_section->vma; - lita_size = lita_sec->_cooked_size; - if (lita_size == 0) - lita_size = lita_sec->_raw_size; - - if (gp == 0 - || lita_vma < gp - 0x8000 - || lita_vma + lita_size >= gp + 0x8000) - { - /* Either gp hasn't been set at all or the current gp - cannot address this .lita section. In both cases we - reset the gp to point into the "middle" of the - current input .lita section. */ - if (gp && !ecoff_data (output_bfd)->issued_multiple_gp_warning) - { - (*info->callbacks->warning) (info, - "using multiple gp values", - (char *) NULL, output_bfd, - (asection *) NULL, (bfd_vma) 0); - ecoff_data (output_bfd)->issued_multiple_gp_warning = true; - } - if (lita_vma < gp - 0x8000) - gp = lita_vma + lita_size - 0x8000; - else - gp = lita_vma + 0x8000; - - } - - lita_sec_data->gp = gp; - } - - _bfd_set_gp_value (output_bfd, gp); - } - - gp_undefined = (gp == 0); - - BFD_ASSERT (bfd_header_little_endian (output_bfd)); - BFD_ASSERT (bfd_header_little_endian (input_bfd)); - - ext_rel = (struct external_reloc *) external_relocs; - ext_rel_end = ext_rel + input_section->reloc_count; - for (; ext_rel < ext_rel_end; ext_rel++) - { - bfd_vma r_vaddr; - unsigned long r_symndx; - int r_type; - int r_extern; - int r_offset; - int r_size; - boolean relocatep; - boolean adjust_addrp; - boolean gp_usedp; - bfd_vma addend; - - r_vaddr = bfd_h_get_64 (input_bfd, (bfd_byte *) ext_rel->r_vaddr); - r_symndx = bfd_h_get_32 (input_bfd, (bfd_byte *) ext_rel->r_symndx); - - r_type = ((ext_rel->r_bits[0] & RELOC_BITS0_TYPE_LITTLE) - >> RELOC_BITS0_TYPE_SH_LITTLE); - r_extern = (ext_rel->r_bits[1] & RELOC_BITS1_EXTERN_LITTLE) != 0; - r_offset = ((ext_rel->r_bits[1] & RELOC_BITS1_OFFSET_LITTLE) - >> RELOC_BITS1_OFFSET_SH_LITTLE); - /* Ignored the reserved bits. */ - r_size = ((ext_rel->r_bits[3] & RELOC_BITS3_SIZE_LITTLE) - >> RELOC_BITS3_SIZE_SH_LITTLE); - - relocatep = false; - adjust_addrp = true; - gp_usedp = false; - addend = 0; - - switch (r_type) - { - default: - abort (); - - case ALPHA_R_IGNORE: - /* This reloc appears after a GPDISP reloc. On earlier - versions of OSF/1, It marked the position of the second - instruction to be altered by the GPDISP reloc, but it is - not otherwise used for anything. For some reason, the - address of the relocation does not appear to include the - section VMA, unlike the other relocation types. */ - if (info->relocateable) - bfd_h_put_64 (input_bfd, - input_section->output_offset + r_vaddr, - (bfd_byte *) ext_rel->r_vaddr); - adjust_addrp = false; - break; - - case ALPHA_R_REFLONG: - case ALPHA_R_REFQUAD: - case ALPHA_R_BRADDR: - case ALPHA_R_HINT: - case ALPHA_R_SREL16: - case ALPHA_R_SREL32: - case ALPHA_R_SREL64: - relocatep = true; - break; - - case ALPHA_R_GPREL32: - /* This relocation is used in a switch table. It is a 32 - bit offset from the current GP value. We must adjust it - by the different between the original GP value and the - current GP value. */ - relocatep = true; - addend = ecoff_data (input_bfd)->gp - gp; - gp_usedp = true; - break; - - case ALPHA_R_LITERAL: - /* This is a reference to a literal value, generally - (always?) in the .lita section. This is a 16 bit GP - relative relocation. Sometimes the subsequent reloc is a - LITUSE reloc, which indicates how this reloc is used. - This sometimes permits rewriting the two instructions - referred to by the LITERAL and the LITUSE into different - instructions which do not refer to .lita. This can save - a memory reference, and permits removing a value from - .lita thus saving GP relative space. - - We do not these optimizations. To do them we would need - to arrange to link the .lita section first, so that by - the time we got here we would know the final values to - use. This would not be particularly difficult, but it is - not currently implemented. */ - - /* I believe that the LITERAL reloc will only apply to a ldq - or ldl instruction, so check my assumption. */ - { - unsigned long insn; - - insn = bfd_get_32 (input_bfd, - contents + r_vaddr - input_section->vma); - BFD_ASSERT (((insn >> 26) & 0x3f) == 0x29 - || ((insn >> 26) & 0x3f) == 0x28); - } - - relocatep = true; - addend = ecoff_data (input_bfd)->gp - gp; - gp_usedp = true; - break; - - case ALPHA_R_LITUSE: - /* See ALPHA_R_LITERAL above for the uses of this reloc. It - does not cause anything to happen, itself. */ - break; - - case ALPHA_R_GPDISP: - /* This marks the ldah of an ldah/lda pair which loads the - gp register with the difference of the gp value and the - current location. The second of the pair is r_symndx - bytes ahead. It used to be marked with an ALPHA_R_IGNORE - reloc, but OSF/1 3.2 no longer does that. */ - { - unsigned long insn1, insn2; - - /* Get the two instructions. */ - insn1 = bfd_get_32 (input_bfd, - contents + r_vaddr - input_section->vma); - insn2 = bfd_get_32 (input_bfd, - (contents - + r_vaddr - - input_section->vma - + r_symndx)); - - BFD_ASSERT (((insn1 >> 26) & 0x3f) == 0x09); /* ldah */ - BFD_ASSERT (((insn2 >> 26) & 0x3f) == 0x08); /* lda */ - - /* Get the existing addend. We must account for the sign - extension done by lda and ldah. */ - addend = ((insn1 & 0xffff) << 16) + (insn2 & 0xffff); - if (insn1 & 0x8000) - { - /* This is addend -= 0x100000000 without causing an - integer overflow on a 32 bit host. */ - addend -= 0x80000000; - addend -= 0x80000000; - } - if (insn2 & 0x8000) - addend -= 0x10000; - - /* The existing addend includes the difference between the - gp of the input BFD and the address in the input BFD. - We want to change this to the difference between the - final GP and the final address. */ - addend += (gp - - ecoff_data (input_bfd)->gp - + input_section->vma - - (input_section->output_section->vma - + input_section->output_offset)); - - /* Change the instructions, accounting for the sign - extension, and write them out. */ - if (addend & 0x8000) - addend += 0x10000; - insn1 = (insn1 & 0xffff0000) | ((addend >> 16) & 0xffff); - insn2 = (insn2 & 0xffff0000) | (addend & 0xffff); - - bfd_put_32 (input_bfd, (bfd_vma) insn1, - contents + r_vaddr - input_section->vma); - bfd_put_32 (input_bfd, (bfd_vma) insn2, - contents + r_vaddr - input_section->vma + r_symndx); - - gp_usedp = true; - } - break; - - case ALPHA_R_OP_PUSH: - case ALPHA_R_OP_PSUB: - case ALPHA_R_OP_PRSHIFT: - /* Manipulate values on the reloc evaluation stack. The - r_vaddr field is not an address in input_section, it is - the current value (including any addend) of the object - being used. */ - if (! r_extern) - { - asection *s; - - s = symndx_to_section[r_symndx]; - if (s == (asection *) NULL) - abort (); - addend = s->output_section->vma + s->output_offset - s->vma; - } - else - { - struct ecoff_link_hash_entry *h; - - h = sym_hashes[r_symndx]; - if (h == (struct ecoff_link_hash_entry *) NULL) - abort (); - - if (! info->relocateable) - { - if (h->root.type == bfd_link_hash_defined - || h->root.type == bfd_link_hash_defweak) - addend = (h->root.u.def.value - + h->root.u.def.section->output_section->vma - + h->root.u.def.section->output_offset); - else - { - /* Note that we pass the address as 0, since we - do not have a meaningful number for the - location within the section that is being - relocated. */ - if (! ((*info->callbacks->undefined_symbol) - (info, h->root.root.string, input_bfd, - input_section, (bfd_vma) 0))) - return false; - addend = 0; - } - } - else - { - if (h->root.type != bfd_link_hash_defined - && h->root.type != bfd_link_hash_defweak - && h->indx == -1) - { - /* This symbol is not being written out. Pass - the address as 0, as with undefined_symbol, - above. */ - if (! ((*info->callbacks->unattached_reloc) - (info, h->root.root.string, input_bfd, - input_section, (bfd_vma) 0))) - return false; - } - - addend = alpha_convert_external_reloc (output_bfd, info, - input_bfd, - ext_rel, h); - } - } - - addend += r_vaddr; - - if (info->relocateable) - { - /* Adjust r_vaddr by the addend. */ - bfd_h_put_64 (input_bfd, addend, - (bfd_byte *) ext_rel->r_vaddr); - } - else - { - switch (r_type) - { - case ALPHA_R_OP_PUSH: - if (tos >= RELOC_STACKSIZE) - abort (); - stack[tos++] = addend; - break; - - case ALPHA_R_OP_PSUB: - if (tos == 0) - abort (); - stack[tos - 1] -= addend; - break; - - case ALPHA_R_OP_PRSHIFT: - if (tos == 0) - abort (); - stack[tos - 1] >>= addend; - break; - } - } - - adjust_addrp = false; - break; - - case ALPHA_R_OP_STORE: - /* Store a value from the reloc stack into a bitfield. If - we are generating relocateable output, all we do is - adjust the address of the reloc. */ - if (! info->relocateable) - { - bfd_vma mask; - bfd_vma val; - - if (tos == 0) - abort (); - - /* Get the relocation mask. The separate steps and the - casts to bfd_vma are attempts to avoid a bug in the - Alpha OSF 1.3 C compiler. See reloc.c for more - details. */ - mask = 1; - mask <<= (bfd_vma) r_size; - mask -= 1; - - /* FIXME: I don't know what kind of overflow checking, - if any, should be done here. */ - val = bfd_get_64 (input_bfd, - contents + r_vaddr - input_section->vma); - val &=~ mask << (bfd_vma) r_offset; - val |= (stack[--tos] & mask) << (bfd_vma) r_offset; - bfd_put_64 (input_bfd, val, - contents + r_vaddr - input_section->vma); - } - break; - - case ALPHA_R_GPVALUE: - /* I really don't know if this does the right thing. */ - gp = ecoff_data (input_bfd)->gp + r_symndx; - gp_undefined = false; - break; - } - - if (relocatep) - { - reloc_howto_type *howto; - struct ecoff_link_hash_entry *h = NULL; - asection *s = NULL; - bfd_vma relocation; - bfd_reloc_status_type r; - - /* Perform a relocation. */ - - howto = &alpha_howto_table[r_type]; - - if (r_extern) - { - h = sym_hashes[r_symndx]; - /* If h is NULL, that means that there is a reloc - against an external symbol which we thought was just - a debugging symbol. This should not happen. */ - if (h == (struct ecoff_link_hash_entry *) NULL) - abort (); - } - else - { - if (r_symndx >= NUM_RELOC_SECTIONS) - s = NULL; - else - s = symndx_to_section[r_symndx]; - - if (s == (asection *) NULL) - abort (); - } - - if (info->relocateable) - { - /* We are generating relocateable output, and must - convert the existing reloc. */ - if (r_extern) - { - if (h->root.type != bfd_link_hash_defined - && h->root.type != bfd_link_hash_defweak - && h->indx == -1) - { - /* This symbol is not being written out. */ - if (! ((*info->callbacks->unattached_reloc) - (info, h->root.root.string, input_bfd, - input_section, r_vaddr - input_section->vma))) - return false; - } - - relocation = alpha_convert_external_reloc (output_bfd, - info, - input_bfd, - ext_rel, - h); - } - else - { - /* This is a relocation against a section. Adjust - the value by the amount the section moved. */ - relocation = (s->output_section->vma - + s->output_offset - - s->vma); - } - - /* If this is PC relative, the existing object file - appears to already have the reloc worked out. We - must subtract out the old value and add in the new - one. */ - if (howto->pc_relative) - relocation -= (input_section->output_section->vma - + input_section->output_offset - - input_section->vma); - - /* Put in any addend. */ - relocation += addend; - - /* Adjust the contents. */ - r = _bfd_relocate_contents (howto, input_bfd, relocation, - (contents - + r_vaddr - - input_section->vma)); - } - else - { - /* We are producing a final executable. */ - if (r_extern) - { - /* This is a reloc against a symbol. */ - if (h->root.type == bfd_link_hash_defined - || h->root.type == bfd_link_hash_defweak) - { - asection *hsec; - - hsec = h->root.u.def.section; - relocation = (h->root.u.def.value - + hsec->output_section->vma - + hsec->output_offset); - } - else - { - if (! ((*info->callbacks->undefined_symbol) - (info, h->root.root.string, input_bfd, - input_section, - r_vaddr - input_section->vma))) - return false; - relocation = 0; - } - } - else - { - /* This is a reloc against a section. */ - relocation = (s->output_section->vma - + s->output_offset - - s->vma); - - /* Adjust a PC relative relocation by removing the - reference to the original source section. */ - if (howto->pc_relative) - relocation += input_section->vma; - } - - r = _bfd_final_link_relocate (howto, - input_bfd, - input_section, - contents, - r_vaddr - input_section->vma, - relocation, - addend); - } - - if (r != bfd_reloc_ok) - { - switch (r) - { - default: - case bfd_reloc_outofrange: - abort (); - case bfd_reloc_overflow: - { - const char *name; - - if (r_extern) - name = sym_hashes[r_symndx]->root.root.string; - else - name = bfd_section_name (input_bfd, - symndx_to_section[r_symndx]); - if (! ((*info->callbacks->reloc_overflow) - (info, name, alpha_howto_table[r_type].name, - (bfd_vma) 0, input_bfd, input_section, - r_vaddr - input_section->vma))) - return false; - } - break; - } - } - } - - if (info->relocateable && adjust_addrp) - { - /* Change the address of the relocation. */ - bfd_h_put_64 (input_bfd, - (input_section->output_section->vma - + input_section->output_offset - - input_section->vma - + r_vaddr), - (bfd_byte *) ext_rel->r_vaddr); - } - - if (gp_usedp && gp_undefined) - { - if (! ((*info->callbacks->reloc_dangerous) - (info, "GP relative relocation when GP not defined", - input_bfd, input_section, r_vaddr - input_section->vma))) - return false; - /* Only give the error once per link. */ - gp = 4; - _bfd_set_gp_value (output_bfd, gp); - gp_undefined = false; - } - } - - if (tos != 0) - abort (); - - return true; -} - -/* Do final adjustments to the filehdr and the aouthdr. This routine - sets the dynamic bits in the file header. */ - -/*ARGSUSED*/ -static boolean -alpha_adjust_headers (abfd, fhdr, ahdr) - bfd *abfd; - struct internal_filehdr *fhdr; - struct internal_aouthdr *ahdr; -{ - if ((abfd->flags & (DYNAMIC | EXEC_P)) == (DYNAMIC | EXEC_P)) - fhdr->f_flags |= F_ALPHA_CALL_SHARED; - else if ((abfd->flags & DYNAMIC) != 0) - fhdr->f_flags |= F_ALPHA_SHARABLE; - return true; -} - -/* Archive handling. In OSF/1 (or Digital Unix) v3.2, Digital - introduced archive packing, in which the elements in an archive are - optionally compressed using a simple dictionary scheme. We know - how to read such archives, but we don't write them. */ - -#define alpha_ecoff_slurp_armap _bfd_ecoff_slurp_armap -#define alpha_ecoff_slurp_extended_name_table \ - _bfd_ecoff_slurp_extended_name_table -#define alpha_ecoff_construct_extended_name_table \ - _bfd_ecoff_construct_extended_name_table -#define alpha_ecoff_truncate_arname _bfd_ecoff_truncate_arname -#define alpha_ecoff_write_armap _bfd_ecoff_write_armap -#define alpha_ecoff_generic_stat_arch_elt _bfd_ecoff_generic_stat_arch_elt -#define alpha_ecoff_update_armap_timestamp _bfd_ecoff_update_armap_timestamp - -/* A compressed file uses this instead of ARFMAG. */ - -#define ARFZMAG "Z\012" - -/* Read an archive header. This is like the standard routine, but it - also accepts ARFZMAG. */ - -static PTR -alpha_ecoff_read_ar_hdr (abfd) - bfd *abfd; -{ - struct areltdata *ret; - struct ar_hdr *h; - - ret = (struct areltdata *) _bfd_generic_read_ar_hdr_mag (abfd, ARFZMAG); - if (ret == NULL) - return NULL; - - h = (struct ar_hdr *) ret->arch_header; - if (strncmp (h->ar_fmag, ARFZMAG, 2) == 0) - { - bfd_byte ab[8]; - - /* This is a compressed file. We must set the size correctly. - The size is the eight bytes after the dummy file header. */ - if (bfd_seek (abfd, FILHSZ, SEEK_CUR) != 0 - || bfd_read (ab, 1, 8, abfd) != 8 - || bfd_seek (abfd, - (FILHSZ + 8), SEEK_CUR) != 0) - return NULL; - - ret->parsed_size = bfd_h_get_64 (abfd, ab); - } - - return (PTR) ret; -} - -/* Get an archive element at a specified file position. This is where - we uncompress the archive element if necessary. */ - -static bfd * -alpha_ecoff_get_elt_at_filepos (archive, filepos) - bfd *archive; - file_ptr filepos; -{ - bfd *nbfd = NULL; - struct areltdata *tdata; - struct ar_hdr *hdr; - bfd_byte ab[8]; - bfd_size_type size; - bfd_byte *buf, *p; - struct bfd_in_memory *bim; - - nbfd = _bfd_get_elt_at_filepos (archive, filepos); - if (nbfd == NULL) - goto error_return; - - if ((nbfd->flags & BFD_IN_MEMORY) != 0) - { - /* We have already expanded this BFD. */ - return nbfd; - } - - tdata = (struct areltdata *) nbfd->arelt_data; - hdr = (struct ar_hdr *) tdata->arch_header; - if (strncmp (hdr->ar_fmag, ARFZMAG, 2) != 0) - return nbfd; - - /* We must uncompress this element. We do this by copying it into a - memory buffer, and making bfd_read and bfd_seek use that buffer. - This can use a lot of memory, but it's simpler than getting a - temporary file, making that work with the file descriptor caching - code, and making sure that it is deleted at all appropriate - times. It can be changed if it ever becomes important. */ - - /* The compressed file starts with a dummy ECOFF file header. */ - if (bfd_seek (nbfd, FILHSZ, SEEK_SET) != 0) - goto error_return; - - /* The next eight bytes are the real file size. */ - if (bfd_read (ab, 1, 8, nbfd) != 8) - goto error_return; - size = bfd_h_get_64 (nbfd, ab); - - if (size == 0) - buf = NULL; - else - { - bfd_size_type left; - bfd_byte dict[4096]; - unsigned int h; - bfd_byte b; - - buf = (bfd_byte *) bfd_alloc (nbfd, size); - if (buf == NULL) - goto error_return; - p = buf; - - left = size; - - /* I don't know what the next eight bytes are for. */ - if (bfd_read (ab, 1, 8, nbfd) != 8) - goto error_return; - - /* This is the uncompression algorithm. It's a simple - dictionary based scheme in which each character is predicted - by a hash of the previous three characters. A control byte - indicates whether the character is predicted or whether it - appears in the input stream; each control byte manages the - next eight bytes in the output stream. */ - memset (dict, 0, sizeof dict); - h = 0; - while (bfd_read (&b, 1, 1, nbfd) == 1) - { - unsigned int i; - - for (i = 0; i < 8; i++, b >>= 1) - { - bfd_byte n; - - if ((b & 1) == 0) - n = dict[h]; - else - { - if (! bfd_read (&n, 1, 1, nbfd)) - goto error_return; - dict[h] = n; - } - - *p++ = n; - - --left; - if (left == 0) - break; - - h <<= 4; - h ^= n; - h &= sizeof dict - 1; - } - - if (left == 0) - break; - } - } - - /* Now the uncompressed file contents are in buf. */ - bim = ((struct bfd_in_memory *) - bfd_alloc (nbfd, sizeof (struct bfd_in_memory))); - if (bim == NULL) - goto error_return; - bim->size = size; - bim->buffer = buf; - - nbfd->mtime_set = true; - nbfd->mtime = strtol (hdr->ar_date, (char **) NULL, 10); - - nbfd->flags |= BFD_IN_MEMORY; - nbfd->iostream = (PTR) bim; - BFD_ASSERT (! nbfd->cacheable); - - return nbfd; - - error_return: - if (nbfd != NULL) - bfd_close (nbfd); - return NULL; -} - -/* Open the next archived file. */ - -static bfd * -alpha_ecoff_openr_next_archived_file (archive, last_file) - bfd *archive; - bfd *last_file; -{ - file_ptr filestart; - - if (last_file == NULL) - filestart = bfd_ardata (archive)->first_file_filepos; - else - { - struct areltdata *t; - struct ar_hdr *h; - bfd_size_type size; - - /* We can't use arelt_size here, because that uses parsed_size, - which is the uncompressed size. We need the compressed size. */ - t = (struct areltdata *) last_file->arelt_data; - h = (struct ar_hdr *) t->arch_header; - size = strtol (h->ar_size, (char **) NULL, 10); - - /* Pad to an even boundary... - Note that last_file->origin can be odd in the case of - BSD-4.4-style element with a long odd size. */ - filestart = last_file->origin + size; - filestart += filestart % 2; - } - - return alpha_ecoff_get_elt_at_filepos (archive, filestart); -} - -/* Open the archive file given an index into the armap. */ - -static bfd * -alpha_ecoff_get_elt_at_index (abfd, index) - bfd *abfd; - symindex index; -{ - carsym *entry; - - entry = bfd_ardata (abfd)->symdefs + index; - return alpha_ecoff_get_elt_at_filepos (abfd, entry->file_offset); -} - -/* This is the ECOFF backend structure. The backend field of the - target vector points to this. */ - -static const struct ecoff_backend_data alpha_ecoff_backend_data = -{ - /* COFF backend structure. */ - { - (void (*) PARAMS ((bfd *,PTR,int,int,int,int,PTR))) bfd_void, /* aux_in */ - (void (*) PARAMS ((bfd *,PTR,PTR))) bfd_void, /* sym_in */ - (void (*) PARAMS ((bfd *,PTR,PTR))) bfd_void, /* lineno_in */ - (unsigned (*) PARAMS ((bfd *,PTR,int,int,int,int,PTR)))bfd_void,/*aux_out*/ - (unsigned (*) PARAMS ((bfd *,PTR,PTR))) bfd_void, /* sym_out */ - (unsigned (*) PARAMS ((bfd *,PTR,PTR))) bfd_void, /* lineno_out */ - (unsigned (*) PARAMS ((bfd *,PTR,PTR))) bfd_void, /* reloc_out */ - alpha_ecoff_swap_filehdr_out, alpha_ecoff_swap_aouthdr_out, - alpha_ecoff_swap_scnhdr_out, - FILHSZ, AOUTSZ, SCNHSZ, 0, 0, 0, 0, true, - alpha_ecoff_swap_filehdr_in, alpha_ecoff_swap_aouthdr_in, - alpha_ecoff_swap_scnhdr_in, NULL, - alpha_ecoff_bad_format_hook, _bfd_ecoff_set_arch_mach_hook, - alpha_ecoff_mkobject_hook, _bfd_ecoff_styp_to_sec_flags, - _bfd_ecoff_set_alignment_hook, _bfd_ecoff_slurp_symbol_table, - NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL - }, - /* Supported architecture. */ - bfd_arch_alpha, - /* Initial portion of armap string. */ - "________64", - /* The page boundary used to align sections in a demand-paged - executable file. E.g., 0x1000. */ - 0x2000, - /* True if the .rdata section is part of the text segment, as on the - Alpha. False if .rdata is part of the data segment, as on the - MIPS. */ - true, - /* Bitsize of constructor entries. */ - 64, - /* Reloc to use for constructor entries. */ - &alpha_howto_table[ALPHA_R_REFQUAD], - { - /* Symbol table magic number. */ - magicSym2, - /* Alignment of debugging information. E.g., 4. */ - 8, - /* Sizes of external symbolic information. */ - sizeof (struct hdr_ext), - sizeof (struct dnr_ext), - sizeof (struct pdr_ext), - sizeof (struct sym_ext), - sizeof (struct opt_ext), - sizeof (struct fdr_ext), - sizeof (struct rfd_ext), - sizeof (struct ext_ext), - /* Functions to swap in external symbolic data. */ - ecoff_swap_hdr_in, - ecoff_swap_dnr_in, - ecoff_swap_pdr_in, - ecoff_swap_sym_in, - ecoff_swap_opt_in, - ecoff_swap_fdr_in, - ecoff_swap_rfd_in, - ecoff_swap_ext_in, - _bfd_ecoff_swap_tir_in, - _bfd_ecoff_swap_rndx_in, - /* Functions to swap out external symbolic data. */ - ecoff_swap_hdr_out, - ecoff_swap_dnr_out, - ecoff_swap_pdr_out, - ecoff_swap_sym_out, - ecoff_swap_opt_out, - ecoff_swap_fdr_out, - ecoff_swap_rfd_out, - ecoff_swap_ext_out, - _bfd_ecoff_swap_tir_out, - _bfd_ecoff_swap_rndx_out, - /* Function to read in symbolic data. */ - _bfd_ecoff_slurp_symbolic_info - }, - /* External reloc size. */ - RELSZ, - /* Reloc swapping functions. */ - alpha_ecoff_swap_reloc_in, - alpha_ecoff_swap_reloc_out, - /* Backend reloc tweaking. */ - alpha_adjust_reloc_in, - alpha_adjust_reloc_out, - /* Relocate section contents while linking. */ - alpha_relocate_section, - /* Do final adjustments to filehdr and aouthdr. */ - alpha_adjust_headers, - /* Read an element from an archive at a given file position. */ - alpha_ecoff_get_elt_at_filepos -}; - -/* Looking up a reloc type is Alpha specific. */ -#define _bfd_ecoff_bfd_reloc_type_lookup alpha_bfd_reloc_type_lookup - -/* So is getting relocated section contents. */ -#define _bfd_ecoff_bfd_get_relocated_section_contents \ - alpha_ecoff_get_relocated_section_contents - -/* Handling file windows is generic. */ -#define _bfd_ecoff_get_section_contents_in_window \ - _bfd_generic_get_section_contents_in_window - -/* Relaxing sections is generic. */ -#define _bfd_ecoff_bfd_relax_section bfd_generic_relax_section - -const bfd_target ecoffalpha_little_vec = -{ - "ecoff-littlealpha", /* name */ - bfd_target_ecoff_flavour, - BFD_ENDIAN_LITTLE, /* data byte order is little */ - BFD_ENDIAN_LITTLE, /* header byte order is little */ - - (HAS_RELOC | EXEC_P | /* object flags */ - HAS_LINENO | HAS_DEBUG | - HAS_SYMS | HAS_LOCALS | DYNAMIC | WP_TEXT | D_PAGED), - - (SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD | SEC_RELOC | SEC_CODE | SEC_DATA), - 0, /* leading underscore */ - ' ', /* ar_pad_char */ - 15, /* ar_max_namelen */ - bfd_getl64, bfd_getl_signed_64, bfd_putl64, - bfd_getl32, bfd_getl_signed_32, bfd_putl32, - bfd_getl16, bfd_getl_signed_16, bfd_putl16, /* data */ - bfd_getl64, bfd_getl_signed_64, bfd_putl64, - bfd_getl32, bfd_getl_signed_32, bfd_putl32, - bfd_getl16, bfd_getl_signed_16, bfd_putl16, /* hdrs */ - - {_bfd_dummy_target, alpha_ecoff_object_p, /* bfd_check_format */ - _bfd_ecoff_archive_p, _bfd_dummy_target}, - {bfd_false, _bfd_ecoff_mkobject, /* bfd_set_format */ - _bfd_generic_mkarchive, bfd_false}, - {bfd_false, _bfd_ecoff_write_object_contents, /* bfd_write_contents */ - _bfd_write_archive_contents, bfd_false}, - - BFD_JUMP_TABLE_GENERIC (_bfd_ecoff), - BFD_JUMP_TABLE_COPY (_bfd_ecoff), - BFD_JUMP_TABLE_CORE (_bfd_nocore), - BFD_JUMP_TABLE_ARCHIVE (alpha_ecoff), - BFD_JUMP_TABLE_SYMBOLS (_bfd_ecoff), - BFD_JUMP_TABLE_RELOCS (_bfd_ecoff), - BFD_JUMP_TABLE_WRITE (_bfd_ecoff), - BFD_JUMP_TABLE_LINK (_bfd_ecoff), - BFD_JUMP_TABLE_DYNAMIC (_bfd_nodynamic), - - (PTR) &alpha_ecoff_backend_data -}; diff --git a/contrib/gdb/bfd/coff-apollo.c b/contrib/gdb/bfd/coff-apollo.c deleted file mode 100644 index 561b1c7ab62f2..0000000000000 --- a/contrib/gdb/bfd/coff-apollo.c +++ /dev/null @@ -1,162 +0,0 @@ -/* BFD back-end for Apollo 68000 COFF binaries. - Copyright 1990, 1991, 1992, 1993, 1994 Free Software Foundation, Inc. - By Troy Rollo (troy@cbme.unsw.edu.au) - Based on m68k standard COFF version Written by Cygnus Support. - -This file is part of BFD, the Binary File Descriptor library. - -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 2 of the License, 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ - -#include "bfd.h" -#include "sysdep.h" -#include "libbfd.h" -#include "obstack.h" -#include "coff/apollo.h" -#include "coff/internal.h" -#include "libcoff.h" - -#define COFF_DEFAULT_SECTION_ALIGNMENT_POWER (3) - -#ifdef ONLY_DECLARE_RELOCS -extern reloc_howto_type apollocoff_howto_table[]; -#else -reloc_howto_type apollocoff_howto_table[] = -{ - HOWTO(R_RELBYTE, 0, 0, 8, false, 0, complain_overflow_bitfield, 0, "8", true, 0x000000ff,0x000000ff, false), - HOWTO(R_RELWORD, 0, 1, 16, false, 0, complain_overflow_bitfield, 0, "16", true, 0x0000ffff,0x0000ffff, false), - HOWTO(R_RELLONG, 0, 2, 32, false, 0, complain_overflow_bitfield, 0, "32", true, 0xffffffff,0xffffffff, false), - HOWTO(R_PCRBYTE, 0, 0, 8, true, 0, complain_overflow_signed, 0, "DISP8", true, 0x000000ff,0x000000ff, false), - HOWTO(R_PCRWORD, 0, 1, 16, true, 0, complain_overflow_signed, 0, "DISP16", true, 0x0000ffff,0x0000ffff, false), - HOWTO(R_PCRLONG, 0, 2, 32, true, 0, complain_overflow_signed, 0, "DISP32", true, 0xffffffff,0xffffffff, false), - HOWTO(R_RELLONG_NEG, 0, -2, 32, false, 0, complain_overflow_bitfield, 0, "-32", true, 0xffffffff,0xffffffff, false), -}; -#endif /* not ONLY_DECLARE_RELOCS */ - -#ifndef BADMAG -#define BADMAG(x) M68KBADMAG(x) -#endif -#define APOLLO_M68 1 /* Customize coffcode.h */ - -/* Turn a howto into a reloc number */ - -#ifdef ONLY_DECLARE_RELOCS -extern void apollo_rtype2howto PARAMS ((arelent *internal, int relocentry)); -extern int apollo_howto2rtype PARAMS ((reloc_howto_type *)); -#else -void -apollo_rtype2howto(internal, relocentry) - arelent *internal; - int relocentry; -{ - switch (relocentry) - { - case R_RELBYTE: internal->howto = apollocoff_howto_table + 0; break; - case R_RELWORD: internal->howto = apollocoff_howto_table + 1; break; - case R_RELLONG: internal->howto = apollocoff_howto_table + 2; break; - case R_PCRBYTE: internal->howto = apollocoff_howto_table + 3; break; - case R_PCRWORD: internal->howto = apollocoff_howto_table + 4; break; - case R_PCRLONG: internal->howto = apollocoff_howto_table + 5; break; - case R_RELLONG_NEG: internal->howto = apollocoff_howto_table + 6; break; - } -} - -int -apollo_howto2rtype (internal) - reloc_howto_type *internal; -{ - if (internal->pc_relative) - { - switch (internal->bitsize) - { - case 32: return R_PCRLONG; - case 16: return R_PCRWORD; - case 8: return R_PCRBYTE; - } - } - else - { - switch (internal->bitsize) - { - case 32: return R_RELLONG; - case 16: return R_RELWORD; - case 8: return R_RELBYTE; - } - } - return R_RELLONG; -} -#endif /* not ONLY_DECLARE_RELOCS */ - -#define RTYPE2HOWTO(internal, relocentry) \ - apollo_rtype2howto(internal, (relocentry)->r_type) - -#define SELECT_RELOC(external, internal) \ - external.r_type = apollo_howto2rtype(internal); - -#include "coffcode.h" - -const bfd_target -#ifdef TARGET_SYM - TARGET_SYM = -#else - apollocoff_vec = -#endif -{ -#ifdef TARGET_NAME - TARGET_NAME, -#else - "apollo-m68k", /* name */ -#endif - bfd_target_coff_flavour, - BFD_ENDIAN_BIG, /* data byte order is big */ - BFD_ENDIAN_BIG, /* header byte order is big */ - - (HAS_RELOC | EXEC_P | /* object flags */ - HAS_LINENO | HAS_DEBUG | - HAS_SYMS | HAS_LOCALS | WP_TEXT), - - (SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD | SEC_RELOC), /* section flags */ -#ifdef NAMES_HAVE_UNDERSCORE - '_', -#else - 0, /* leading underscore */ -#endif - '/', /* ar_pad_char */ - 15, /* ar_max_namelen */ - bfd_getb64, bfd_getb_signed_64, bfd_putb64, - bfd_getb32, bfd_getb_signed_32, bfd_putb32, - bfd_getb16, bfd_getb_signed_16, bfd_putb16, /* data */ - bfd_getb64, bfd_getb_signed_64, bfd_putb64, - bfd_getb32, bfd_getb_signed_32, bfd_putb32, - bfd_getb16, bfd_getb_signed_16, bfd_putb16, /* hdrs */ - - {_bfd_dummy_target, coff_object_p, /* bfd_check_format */ - bfd_generic_archive_p, _bfd_dummy_target}, - {bfd_false, coff_mkobject, _bfd_generic_mkarchive, /* bfd_set_format */ - bfd_false}, - {bfd_false, coff_write_object_contents, /* bfd_write_contents */ - _bfd_write_archive_contents, bfd_false}, - - BFD_JUMP_TABLE_GENERIC (coff), - BFD_JUMP_TABLE_COPY (coff), - BFD_JUMP_TABLE_CORE (_bfd_nocore), - BFD_JUMP_TABLE_ARCHIVE (_bfd_archive_coff), - BFD_JUMP_TABLE_SYMBOLS (coff), - BFD_JUMP_TABLE_RELOCS (coff), - BFD_JUMP_TABLE_WRITE (coff), - BFD_JUMP_TABLE_LINK (coff), - BFD_JUMP_TABLE_DYNAMIC (_bfd_nodynamic), - - COFF_SWAP_TABLE - }; diff --git a/contrib/gdb/bfd/coff-arm.c b/contrib/gdb/bfd/coff-arm.c deleted file mode 100644 index bb16b046ae146..0000000000000 --- a/contrib/gdb/bfd/coff-arm.c +++ /dev/null @@ -1,537 +0,0 @@ -/* BFD back-end for ARM COFF files. - Copyright 1990, 1991, 1992, 1993, 1994, 1995 Free Software Foundation, Inc. - Written by Cygnus Support. - -This file is part of BFD, the Binary File Descriptor library. - -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 2 of the License, 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ - -#include "bfd.h" -#include "sysdep.h" -#include "libbfd.h" -#include "obstack.h" - -#include "coff/arm.h" - -#include "coff/internal.h" - -#ifdef COFF_WITH_PE -#include "coff/pe.h" -#endif - -#include "libcoff.h" - -static bfd_reloc_status_type -aoutarm_fix_pcrel_26_done PARAMS ((bfd *, arelent *, asymbol *, PTR, - asection *, bfd *, char **)); - -static bfd_reloc_status_type -aoutarm_fix_pcrel_26 PARAMS ((bfd *, arelent *, asymbol *, PTR, - asection *, bfd *, char **)); - - -static bfd_reloc_status_type coff_arm_reloc - PARAMS ((bfd *, arelent *, asymbol *, PTR, asection *, bfd *, char **)); - - -/* Used by the assembler. */ -static bfd_reloc_status_type -coff_arm_reloc (abfd, reloc_entry, symbol, data, input_section, output_bfd, - error_message) - bfd *abfd; - arelent *reloc_entry; - asymbol *symbol; - PTR data; - asection *input_section; - bfd *output_bfd; - char **error_message; -{ - symvalue diff; - if (output_bfd == (bfd *) NULL) - return bfd_reloc_continue; - - diff = reloc_entry->addend; - -#define DOIT(x) \ - x = ((x & ~howto->dst_mask) | (((x & howto->src_mask) + diff) & howto->dst_mask)) - - if (diff != 0) - { - reloc_howto_type *howto = reloc_entry->howto; - unsigned char *addr = (unsigned char *) data + reloc_entry->address; - - switch (howto->size) - { - case 0: - { - char x = bfd_get_8 (abfd, addr); - DOIT (x); - bfd_put_8 (abfd, x, addr); - } - break; - - case 1: - { - short x = bfd_get_16 (abfd, addr); - DOIT (x); - bfd_put_16 (abfd, x, addr); - } - break; - - case 2: - { - long x = bfd_get_32 (abfd, addr); - DOIT (x); - bfd_put_32 (abfd, x, addr); - } - break; - - default: - abort (); - } - } - - /* Now let bfd_perform_relocation finish everything up. */ - return bfd_reloc_continue; -} - -#ifndef PCRELOFFSET -#define PCRELOFFSET true -#endif - -static reloc_howto_type aoutarm_std_reloc_howto[] = -{ - /* type rs size bsz pcrel bitpos ovrf sf name part_inpl readmask setmask pcdone */ - HOWTO(0, /* type */ - 0, /* rs */ - 0, /* size */ - 8, /* bsz */ - false, /* pcrel */ - 0, /* bitpos */ - complain_overflow_bitfield, /* ovf */ - coff_arm_reloc, /* sf */ - "8", /*name */ - true, /* partial */ - 0x000000ff, /*read mask */ - 0x000000ff, /* setmask */ - PCRELOFFSET /* pcdone */), - HOWTO(1, - 0, - 1, - 16, - false, - 0, - complain_overflow_bitfield, - coff_arm_reloc, - "16", - true, - 0x0000ffff, - 0x0000ffff, - PCRELOFFSET), - HOWTO( 2, - 0, - 2, - 32, - false, - 0, - complain_overflow_bitfield, - coff_arm_reloc, - "32", - true, - 0xffffffff, - 0xffffffff, - PCRELOFFSET), - HOWTO( 3, - 2, - 2, - 26, - true, - 0, - complain_overflow_signed, - aoutarm_fix_pcrel_26 , - "ARM26", - false, - 0x00ffffff, - 0x00ffffff, - PCRELOFFSET), - HOWTO( 4, - 0, - 0, - 8, - true, - 0, - complain_overflow_signed, - coff_arm_reloc, - "DISP8", - true, - 0x000000ff, - 0x000000ff, - true), - HOWTO( 5, - 0, - 1, - 16, - true, - 0, - complain_overflow_signed, - coff_arm_reloc, - "DISP16", - true, - 0x0000ffff, - 0x0000ffff, - true), - HOWTO( 6, - 0, - 2, - 32, - true, - 0, - complain_overflow_signed, - coff_arm_reloc, - "DISP32", - true, - 0xffffffff, - 0xffffffff, - true), - HOWTO( 7, - 2, - 2, - 26, - false, - 0, - complain_overflow_signed, - aoutarm_fix_pcrel_26_done, - "ARM26D", - true, - 0x00ffffff, - 0x00ffffff, - false), - {-1}, - HOWTO( 9, - 0, - -1, - 16, - false, - 0, - complain_overflow_bitfield, - coff_arm_reloc, - "NEG16", - true, - 0x0000ffff, - 0x0000ffff, - false), - HOWTO( 10, - 0, - -2, - 32, - false, - 0, - complain_overflow_bitfield, - coff_arm_reloc, - "NEG32", - true, - 0xffffffff, - 0xffffffff, - false), - HOWTO( 11, - 0, - 2, - 32, - false, - 0, - complain_overflow_bitfield, - coff_arm_reloc, - "rva32", - true, - 0xffffffff, - 0xffffffff, - PCRELOFFSET), -}; -#ifdef COFF_WITH_PE -/* Return true if this relocation should - appear in the output .reloc section. */ - -static boolean in_reloc_p (abfd, howto) - bfd * abfd; - reloc_howto_type *howto; -{ - return !howto->pc_relative && howto->type != 11; -} -#endif - - -#define RTYPE2HOWTO(cache_ptr, dst) \ - (cache_ptr)->howto = aoutarm_std_reloc_howto + (dst)->r_type; - -#define coff_rtype_to_howto coff_arm_rtype_to_howto - -static reloc_howto_type * -coff_arm_rtype_to_howto (abfd, sec, rel, h, sym, addendp) - bfd *abfd; - asection *sec; - struct internal_reloc *rel; - struct coff_link_hash_entry *h; - struct internal_syment *sym; - bfd_vma *addendp; -{ - reloc_howto_type *howto; - - howto = aoutarm_std_reloc_howto + rel->r_type; - - if (rel->r_type == 11) - { - *addendp -= pe_data(sec->output_section->owner)->pe_opthdr.ImageBase; - } - return howto; - -} -/* Used by the assembler. */ - -static bfd_reloc_status_type -aoutarm_fix_pcrel_26_done (abfd, reloc_entry, symbol, data, input_section, - output_bfd, error_message) - bfd *abfd; - arelent *reloc_entry; - asymbol *symbol; - PTR data; - asection *input_section; - bfd *output_bfd; - char **error_message; -{ - /* This is dead simple at present. */ - return bfd_reloc_ok; -} - -/* Used by the assembler. */ - -static bfd_reloc_status_type -aoutarm_fix_pcrel_26 (abfd, reloc_entry, symbol, data, input_section, - output_bfd, error_message) - bfd *abfd; - arelent *reloc_entry; - asymbol *symbol; - PTR data; - asection *input_section; - bfd *output_bfd; - char **error_message; -{ - bfd_vma relocation; - bfd_size_type addr = reloc_entry->address; - long target = bfd_get_32 (abfd, (bfd_byte *) data + addr); - bfd_reloc_status_type flag = bfd_reloc_ok; - - /* If this is an undefined symbol, return error */ - if (symbol->section == &bfd_und_section - && (symbol->flags & BSF_WEAK) == 0) - return output_bfd ? bfd_reloc_continue : bfd_reloc_undefined; - - /* If the sections are different, and we are doing a partial relocation, - just ignore it for now. */ - if (symbol->section->name != input_section->name - && output_bfd != (bfd *)NULL) - return bfd_reloc_continue; - - relocation = (target & 0x00ffffff) << 2; - relocation = (relocation ^ 0x02000000) - 0x02000000; /* Sign extend */ - relocation += symbol->value; - relocation += symbol->section->output_section->vma; - relocation += symbol->section->output_offset; - relocation += reloc_entry->addend; - relocation -= input_section->output_section->vma; - relocation -= input_section->output_offset; - relocation -= addr; - if (relocation & 3) - return bfd_reloc_overflow; - - /* Check for overflow */ - if (relocation & 0x02000000) - { - if ((relocation & ~0x03ffffff) != ~0x03ffffff) - flag = bfd_reloc_overflow; - } - else if (relocation & ~0x03ffffff) - flag = bfd_reloc_overflow; - - target &= ~0x00ffffff; - target |= (relocation >> 2) & 0x00ffffff; - bfd_put_32 (abfd, target, (bfd_byte *) data + addr); - - /* Now the ARM magic... Change the reloc type so that it is marked as done. - Strictly this is only necessary if we are doing a partial relocation. */ - reloc_entry->howto = &aoutarm_std_reloc_howto[7]; - - return flag; -} - - -static CONST struct reloc_howto_struct * -arm_reloc_type_lookup(abfd,code) - bfd *abfd; - bfd_reloc_code_real_type code; -{ -#define ASTD(i,j) case i: return &aoutarm_std_reloc_howto[j] - if (code == BFD_RELOC_CTOR) - switch (bfd_get_arch_info (abfd)->bits_per_address) - { - case 32: - code = BFD_RELOC_32; - break; - default: return (CONST struct reloc_howto_struct *) 0; - } - - switch (code) - { - ASTD (BFD_RELOC_16, 1); - ASTD (BFD_RELOC_32, 2); - ASTD (BFD_RELOC_ARM_PCREL_BRANCH, 3); - ASTD (BFD_RELOC_8_PCREL, 4); - ASTD (BFD_RELOC_16_PCREL, 5); - ASTD (BFD_RELOC_32_PCREL, 6); - ASTD (BFD_RELOC_RVA, 11); - default: return (CONST struct reloc_howto_struct *) 0; - } -} - - -#define coff_bfd_reloc_type_lookup arm_reloc_type_lookup - -#define COFF_DEFAULT_SECTION_ALIGNMENT_POWER (2) -#define COFF_PAGE_SIZE 0x1000 -/* Turn a howto into a reloc nunmber */ - -#define SELECT_RELOC(x,howto) { x.r_type = howto->type; } -#define BADMAG(x) ARMBADMAG(x) -#define ARM 1 /* Customize coffcode.h */ - - -/* We use the special COFF backend linker. */ -#define coff_relocate_section _bfd_coff_generic_relocate_section - - -#include "coffcode.h" - -const bfd_target -#ifdef TARGET_LITTLE_SYM -TARGET_LITTLE_SYM = -#else -armcoff_little_vec = -#endif -{ -#ifdef TARGET_LITTLE_NAME - TARGET_LITTLE_NAME, -#else - "coff-arm-little", -#endif - bfd_target_coff_flavour, - BFD_ENDIAN_LITTLE, /* data byte order is little */ - BFD_ENDIAN_LITTLE, /* header byte order is little */ - - (HAS_RELOC | EXEC_P | /* object flags */ - HAS_LINENO | HAS_DEBUG | - HAS_SYMS | HAS_LOCALS | WP_TEXT | D_PAGED), - - (SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD | SEC_RELOC), /* section flags */ -#ifdef TARGET_UNDERSCORE - TARGET_UNDERSCORE, /* leading underscore */ -#else - 0, /* leading underscore */ -#endif - '/', /* ar_pad_char */ - 15, /* ar_max_namelen */ - - bfd_getl64, bfd_getl_signed_64, bfd_putl64, - bfd_getl32, bfd_getl_signed_32, bfd_putl32, - bfd_getl16, bfd_getl_signed_16, bfd_putl16, /* data */ - bfd_getl64, bfd_getl_signed_64, bfd_putl64, - bfd_getl32, bfd_getl_signed_32, bfd_putl32, - bfd_getl16, bfd_getl_signed_16, bfd_putl16, /* hdrs */ - -/* Note that we allow an object file to be treated as a core file as well. */ - {_bfd_dummy_target, coff_object_p, /* bfd_check_format */ - bfd_generic_archive_p, coff_object_p}, - {bfd_false, coff_mkobject, _bfd_generic_mkarchive, /* bfd_set_format */ - bfd_false}, - {bfd_false, coff_write_object_contents, /* bfd_write_contents */ - _bfd_write_archive_contents, bfd_false}, - - BFD_JUMP_TABLE_GENERIC (coff), - BFD_JUMP_TABLE_COPY (coff), - BFD_JUMP_TABLE_CORE (_bfd_nocore), - BFD_JUMP_TABLE_ARCHIVE (_bfd_archive_coff), - BFD_JUMP_TABLE_SYMBOLS (coff), - BFD_JUMP_TABLE_RELOCS (coff), - BFD_JUMP_TABLE_WRITE (coff), - BFD_JUMP_TABLE_LINK (coff), - BFD_JUMP_TABLE_DYNAMIC (_bfd_nodynamic), - - COFF_SWAP_TABLE, -}; - -const bfd_target -#ifdef TARGET_BIG_SYM -TARGET_BIG_SYM = -#else -armcoff_big_vec = -#endif -{ -#ifdef TARGET_BIG_NAME - TARGET_BIG_NAME, -#else - "coff-arm-big", -#endif - bfd_target_coff_flavour, - BFD_ENDIAN_BIG, /* data byte order is big */ - BFD_ENDIAN_BIG, /* header byte order is big */ - - (HAS_RELOC | EXEC_P | /* object flags */ - HAS_LINENO | HAS_DEBUG | - HAS_SYMS | HAS_LOCALS | WP_TEXT | D_PAGED), - - (SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD | SEC_RELOC), /* section flags */ -#ifdef TARGET_UNDERSCORE - TARGET_UNDERSCORE, /* leading underscore */ -#else - 0, /* leading underscore */ -#endif - '/', /* ar_pad_char */ - 15, /* ar_max_namelen */ - - bfd_getb64, bfd_getb_signed_64, bfd_putb64, - bfd_getb32, bfd_getb_signed_32, bfd_putb32, - bfd_getb16, bfd_getb_signed_16, bfd_putb16, /* data */ - bfd_getb64, bfd_getb_signed_64, bfd_putb64, - bfd_getb32, bfd_getb_signed_32, bfd_putb32, - bfd_getb16, bfd_getb_signed_16, bfd_putb16, /* hdrs */ - -/* Note that we allow an object file to be treated as a core file as well. */ - {_bfd_dummy_target, coff_object_p, /* bfd_check_format */ - bfd_generic_archive_p, coff_object_p}, - {bfd_false, coff_mkobject, _bfd_generic_mkarchive, /* bfd_set_format */ - bfd_false}, - {bfd_false, coff_write_object_contents, /* bfd_write_contents */ - _bfd_write_archive_contents, bfd_false}, - - BFD_JUMP_TABLE_GENERIC (coff), - BFD_JUMP_TABLE_COPY (coff), - BFD_JUMP_TABLE_CORE (_bfd_nocore), - BFD_JUMP_TABLE_ARCHIVE (_bfd_archive_coff), - BFD_JUMP_TABLE_SYMBOLS (coff), - BFD_JUMP_TABLE_RELOCS (coff), - BFD_JUMP_TABLE_WRITE (coff), - BFD_JUMP_TABLE_LINK (coff), - BFD_JUMP_TABLE_DYNAMIC (_bfd_nodynamic), - - COFF_SWAP_TABLE, -}; diff --git a/contrib/gdb/bfd/coff-aux.c b/contrib/gdb/bfd/coff-aux.c deleted file mode 100644 index 1dba9d5c465a6..0000000000000 --- a/contrib/gdb/bfd/coff-aux.c +++ /dev/null @@ -1,332 +0,0 @@ -/* BFD back-end for Apple M68K COFF A/UX 3.x files. - Copyright 1996 Free Software Foundation, Inc. - Portions written by Richard Henderson <rth@tamu.edu>, - COMMON symbol munging cribbed from cf-m68klynx.c which was - written by Cygnus Support. - -This file is part of BFD, the Binary File Descriptor library. - -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 2 of the License, 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ - -#define TARGET_SYM m68kaux_coff_vec -#define TARGET_NAME "coff-m68k-aux" - -#ifndef TARG_AUX -#define TARG_AUX -#endif - -#define COFF_LONG_FILENAMES - -/* 4k pages */ -#define COFF_PAGE_SIZE 0x1000 - -/* On AUX, a STYP_NOLOAD|STYP_BSS section is part of a shared library. */ -#define BSS_NOLOAD_IS_SHARED_LIBRARY - -#define _bfd_m68kcoff_howto_table _bfd_m68kaux_howto_table -#define _bfd_m68kcoff_rtype2howto _bfd_m68kaux_rtype2howto -#define _bfd_m68kcoff_howto2rtype _bfd_m68kaux_howto2rtype -#define _bfd_m68kcoff_reloc_type_lookup _bfd_m68kaux_reloc_type_lookup - -/* Rather than change names lots of places, reuse the same hack */ -#define LYNX_SPECIAL_FN _bfd_m68kaux_special_fn - -#include "bfd.h" -#include "sysdep.h" - -#ifdef ANSI_PROTOTYPES -struct internal_reloc; -struct coff_link_hash_entry; -struct internal_syment; -#endif - - -static bfd_reloc_status_type _bfd_m68kaux_special_fn - PARAMS ((bfd *, arelent *, asymbol *, PTR, asection *, bfd *, char **)); -static reloc_howto_type *coff_m68k_aux_rtype_to_howto - PARAMS ((bfd *, asection *, struct internal_reloc *, - struct coff_link_hash_entry *, struct internal_syment *, - bfd_vma *)); -static boolean coff_m68k_aux_link_add_one_symbol - PARAMS ((struct bfd_link_info *, bfd *, const char *, flagword, - asection *, bfd_vma, const char *, boolean, boolean, - struct bfd_link_hash_entry **)); - - -#define coff_rtype_to_howto coff_m68k_aux_rtype_to_howto -#define coff_link_add_one_symbol coff_m68k_aux_link_add_one_symbol - - -/* Compute the addend of a reloc. If the reloc is to a common symbol, - the object file contains the value of the common symbol. By the - time this is called, the linker may be using a different symbol - from a different object file with a different value. Therefore, we - hack wildly to locate the original symbol from this file so that we - can make the correct adjustment. This macro sets coffsym to the - symbol from the original file, and uses it to set the addend value - correctly. If this is not a common symbol, the usual addend - calculation is done, except that an additional tweak is needed for - PC relative relocs. - FIXME: This macro refers to symbols and asect; these are from the - calling function, not the macro arguments. */ - -#define CALC_ADDEND(abfd, ptr, reloc, cache_ptr) \ - { \ - coff_symbol_type *coffsym = (coff_symbol_type *) NULL; \ - if (ptr && bfd_asymbol_bfd (ptr) != abfd) \ - coffsym = (obj_symbols (abfd) \ - + (cache_ptr->sym_ptr_ptr - symbols)); \ - else if (ptr) \ - coffsym = coff_symbol_from (abfd, ptr); \ - if (coffsym != (coff_symbol_type *) NULL \ - && coffsym->native->u.syment.n_scnum == 0) \ - cache_ptr->addend = - coffsym->native->u.syment.n_value; \ - else if (ptr && bfd_asymbol_bfd (ptr) == abfd \ - && ptr->section != (asection *) NULL) \ - cache_ptr->addend = - (ptr->section->vma + ptr->value); \ - else \ - cache_ptr->addend = 0; \ - if (ptr && (reloc.r_type == R_PCRBYTE \ - || reloc.r_type == R_PCRWORD \ - || reloc.r_type == R_PCRLONG)) \ - cache_ptr->addend += asect->vma; \ - } - - - -#include "coff/aux-coff.h" /* override coff/internal.h and coff/m68k.h */ -#include "coff-m68k.c" - - - -/* For some reason when using m68k COFF the value stored in the .text - section for a reference to a common symbol is the value itself plus - any desired offset. (taken from work done by Ian Taylor, Cygnus Support, - for I386 COFF). */ - -/* If we are producing relocateable output, we need to do some - adjustments to the object file that are not done by the - bfd_perform_relocation function. This function is called by every - reloc type to make any required adjustments. */ - -static bfd_reloc_status_type -_bfd_m68kaux_special_fn (abfd, reloc_entry, symbol, data, input_section, - output_bfd, error_message) - bfd *abfd; - arelent *reloc_entry; - asymbol *symbol; - PTR data; - asection *input_section; - bfd *output_bfd; - char **error_message; -{ - symvalue diff; - - if (output_bfd == (bfd *) NULL) - return bfd_reloc_continue; - - if (bfd_is_com_section (symbol->section)) - { - /* We are relocating a common symbol. The current value in the - object file is ORIG + OFFSET, where ORIG is the value of the - common symbol as seen by the object file when it was compiled - (this may be zero if the symbol was undefined) and OFFSET is - the offset into the common symbol (normally zero, but may be - non-zero when referring to a field in a common structure). - ORIG is the negative of reloc_entry->addend, which is set by - the CALC_ADDEND macro below. We want to replace the value in - the object file with NEW + OFFSET, where NEW is the value of - the common symbol which we are going to put in the final - object file. NEW is symbol->value. */ - diff = symbol->value + reloc_entry->addend; - } - else - { - /* For some reason bfd_perform_relocation always effectively - ignores the addend for a COFF target when producing - relocateable output. This seems to be always wrong for 386 - COFF, so we handle the addend here instead. */ - diff = reloc_entry->addend; - } - -#define DOIT(x) \ - x = ((x & ~howto->dst_mask) | \ - (((x & howto->src_mask) + diff) & howto->dst_mask)) - - if (diff != 0) - { - reloc_howto_type *howto = reloc_entry->howto; - unsigned char *addr = (unsigned char *) data + reloc_entry->address; - - switch (howto->size) - { - case 0: - { - char x = bfd_get_8 (abfd, addr); - DOIT (x); - bfd_put_8 (abfd, x, addr); - } - break; - - case 1: - { - short x = bfd_get_16 (abfd, addr); - DOIT (x); - bfd_put_16 (abfd, x, addr); - } - break; - - case 2: - { - long x = bfd_get_32 (abfd, addr); - DOIT (x); - bfd_put_32 (abfd, x, addr); - } - break; - - default: - abort (); - } - } - - /* Now let bfd_perform_relocation finish everything up. */ - return bfd_reloc_continue; -} - - -/* coff-m68k.c uses the special COFF backend linker. We need to - adjust common symbols. */ - -/*ARGSUSED*/ -static reloc_howto_type * -coff_m68k_aux_rtype_to_howto (abfd, sec, rel, h, sym, addendp) - bfd *abfd; - asection *sec; - struct internal_reloc *rel; - struct coff_link_hash_entry *h; - struct internal_syment *sym; - bfd_vma *addendp; -{ - arelent relent; - reloc_howto_type *howto; - - RTYPE2HOWTO (&relent, rel); - - howto = relent.howto; - - if (sym != NULL && sym->n_scnum == 0 && sym->n_value != 0) - { - /* This is a common symbol. The section contents include the - size (sym->n_value) as an addend. The relocate_section - function will be adding in the final value of the symbol. We - need to subtract out the current size in order to get the - correct result. */ - BFD_ASSERT (h != NULL); - *addendp -= sym->n_value; - } - - /* If the output symbol is common (in which case this must be a - relocateable link), we need to add in the final size of the - common symbol. */ - if (h != NULL && h->root.type == bfd_link_hash_common) - *addendp += h->root.u.c.size; - - return howto; -} - - -/* We need non-absolute symbols to override absolute symbols. This - mirrors Apple's "solution" to let a static library symbol override - a shared library symbol. On the whole not a good thing, given how - shared libraries work here, but can work if you are careful with - what you include in the shared object. */ - -boolean -coff_m68k_aux_link_add_one_symbol (info, abfd, name, flags, section, value, - string, copy, collect, hashp) - struct bfd_link_info *info; - bfd *abfd; - const char *name; - flagword flags; - asection *section; - bfd_vma value; - const char *string; - boolean copy; - boolean collect; - struct bfd_link_hash_entry **hashp; -{ - struct bfd_link_hash_entry *h; - - if ((flags & (BSF_WARNING | BSF_CONSTRUCTOR | BSF_WEAK)) == 0 && - !bfd_is_und_section (section) && - !bfd_is_com_section (section)) - { - /* The new symbol is a definition or an indirect definition */ - - /* This bit copied from linker.c */ - if (hashp != NULL && *hashp != NULL) - { - h = *hashp; - BFD_ASSERT (strcmp (h->root.string, name) == 0); - } - else - { - h = bfd_link_hash_lookup (info->hash, name, true, copy, false); - if (h == NULL) - { - if (hashp != NULL) - *hashp = NULL; - return false; - } - } - - if (info->notice_hash != (struct bfd_hash_table *) NULL - && (bfd_hash_lookup (info->notice_hash, name, false, false) - != (struct bfd_hash_entry *) NULL)) - { - if (! (*info->callbacks->notice) (info, name, abfd, section, value)) - return false; - } - - if (hashp != (struct bfd_link_hash_entry **) NULL) - *hashp = h; - /* end duplication from linker.c */ - - if (h->type == bfd_link_hash_defined - || h->type == bfd_link_hash_indirect) - { - asection *msec; - - if (h->type == bfd_link_hash_defined) - msec = h->u.def.section; - else - msec = bfd_ind_section_ptr; - - if (bfd_is_abs_section (msec) && !bfd_is_abs_section (section)) - { - h->u.def.section = section; - h->u.def.value = value; - return true; - } - else if (bfd_is_abs_section (section) && !bfd_is_abs_section (msec)) - return true; - } - } - - /* If we didn't exit early, finish processing in the generic routine */ - return _bfd_generic_link_add_one_symbol (info, abfd, name, flags, section, - value, string, copy, collect, - hashp); -} diff --git a/contrib/gdb/bfd/coff-go32.c b/contrib/gdb/bfd/coff-go32.c deleted file mode 100644 index be4adb24f5297..0000000000000 --- a/contrib/gdb/bfd/coff-go32.c +++ /dev/null @@ -1,25 +0,0 @@ -/* BFD back-end for Intel 386 COFF files (go32 variant). - Copyright 1990, 1991, 1992, 1993, 1994 Free Software Foundation, Inc. - Written by DJ Delorie. - -This file is part of BFD, the Binary File Descriptor library. - -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 2 of the License, 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ - -#define TARGET_SYM go32coff_vec -#define TARGET_NAME "coff-go32" -#define TARGET_UNDERSCORE '_' - -#include "coff-i386.c" diff --git a/contrib/gdb/bfd/coff-h8300.c b/contrib/gdb/bfd/coff-h8300.c deleted file mode 100644 index 48d0d5a213b74..0000000000000 --- a/contrib/gdb/bfd/coff-h8300.c +++ /dev/null @@ -1,650 +0,0 @@ -/* BFD back-end for Hitachi H8/300 COFF binaries. - Copyright 1990, 1991, 1992, 1993, 1994, 1995 Free Software Foundation, Inc. - Written by Steve Chamberlain, <sac@cygnus.com>. - -This file is part of BFD, the Binary File Descriptor library. - -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 2 of the License, 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ - -#include "bfd.h" -#include "sysdep.h" -#include "obstack.h" -#include "libbfd.h" -#include "bfdlink.h" -#include "genlink.h" -#include "coff/h8300.h" -#include "coff/internal.h" -#include "libcoff.h" - -#define COFF_DEFAULT_SECTION_ALIGNMENT_POWER (1) - - -/* special handling for H8/300 relocs. - We only come here for pcrel stuff and return normally if not an -r link. - When doing -r, we can't do any arithmetic for the pcrel stuff, because - the code in reloc.c assumes that we can manipulate the targets of - the pcrel branches. This isn't so, since the H8/300 can do relaxing, - which means that the gap after the instruction may not be enough to - contain the offset required for the branch, so we have to use the only - the addend until the final link */ - -static bfd_reloc_status_type -special (abfd, reloc_entry, symbol, data, input_section, output_bfd, - error_message) - bfd *abfd; - arelent *reloc_entry; - asymbol *symbol; - PTR data; - asection *input_section; - bfd *output_bfd; - char **error_message; -{ - if (output_bfd == (bfd *) NULL) - return bfd_reloc_continue; - - return bfd_reloc_ok; -} - -static reloc_howto_type howto_table[] = -{ - HOWTO (R_RELBYTE, 0, 0, 8, false, 0, complain_overflow_bitfield, special, "8", false, 0x000000ff, 0x000000ff, false), - HOWTO (R_RELWORD, 0, 1, 16, false, 0, complain_overflow_bitfield, special, "16", false, 0x0000ffff, 0x0000ffff, false), - HOWTO (R_RELLONG, 0, 2, 32, false, 0, complain_overflow_bitfield, special, "32", false, 0xffffffff, 0xffffffff, false), - HOWTO (R_PCRBYTE, 0, 0, 8, true, 0, complain_overflow_signed, special, "DISP8", false, 0x000000ff, 0x000000ff, true), - HOWTO (R_PCRWORD, 0, 1, 16, true, 0, complain_overflow_signed, special, "DISP16", false, 0x0000ffff, 0x0000ffff, true), - HOWTO (R_PCRLONG, 0, 2, 32, true, 0, complain_overflow_signed, special, "DISP32", false, 0xffffffff, 0xffffffff, true), - HOWTO (R_MOVB1, 0, 1, 16, false, 0, complain_overflow_bitfield, special, "16/8", false, 0x0000ffff, 0x0000ffff, false), - HOWTO (R_MOVB2, 0, 1, 16, false, 0, complain_overflow_bitfield, special, "8/16", false, 0x0000ffff, 0x0000ffff, false), - HOWTO (R_JMP1, 0, 1, 16, false, 0, complain_overflow_bitfield, special, "16/pcrel", false, 0x0000ffff, 0x0000ffff, false), - HOWTO (R_JMP2, 0, 0, 8, false, 0, complain_overflow_bitfield, special, "pcrecl/16", false, 0x000000ff, 0x000000ff, false), - - - HOWTO (R_JMPL1, 0, 2, 32, false, 0, complain_overflow_bitfield, special, "24/pcrell", false, 0x00ffffff, 0x00ffffff, false), - HOWTO (R_JMPL_B8, 0, 0, 8, false, 0, complain_overflow_bitfield, special, "pc8/24", false, 0x000000ff, 0x000000ff, false), - - HOWTO (R_MOVLB1, 0, 1, 16, false, 0, complain_overflow_bitfield,special, "24/8", false, 0x0000ffff, 0x0000ffff, false), - HOWTO (R_MOVLB2, 0, 1, 16, false, 0, complain_overflow_bitfield, special, "8/24", false, 0x0000ffff, 0x0000ffff, false), - - /* An indirect reference to a function. This causes the function's address - to be added to the function vector in lo-mem and puts the address of - the function vector's entry in the jsr instruction. */ - HOWTO (R_MEM_INDIRECT, 0, 0, 8, false, 0, complain_overflow_bitfield, special, "8/indirect", false, 0x000000ff, 0x000000ff, false), - -}; - - -/* Turn a howto into a reloc number */ - -#define SELECT_RELOC(x,howto) \ - { x.r_type = select_reloc(howto); } - -#define BADMAG(x) (H8300BADMAG(x)&& H8300HBADMAG(x)) -#define H8300 1 /* Customize coffcode.h */ -#define __A_MAGIC_SET__ - - - -/* Code to swap in the reloc */ -#define SWAP_IN_RELOC_OFFSET bfd_h_get_32 -#define SWAP_OUT_RELOC_OFFSET bfd_h_put_32 -#define SWAP_OUT_RELOC_EXTRA(abfd, src, dst) \ - dst->r_stuff[0] = 'S'; \ - dst->r_stuff[1] = 'C'; - - -static int -select_reloc (howto) - reloc_howto_type *howto; -{ - return howto->type; -} - -/* Code to turn a r_type into a howto ptr, uses the above howto table - */ - -static void -rtype2howto (internal, dst) - arelent *internal; - struct internal_reloc *dst; -{ - switch (dst->r_type) - { - case R_RELBYTE: - internal->howto = howto_table + 0; - break; - case R_RELWORD: - internal->howto = howto_table + 1; - break; - case R_RELLONG: - internal->howto = howto_table + 2; - break; - case R_PCRBYTE: - internal->howto = howto_table + 3; - break; - case R_PCRWORD: - internal->howto = howto_table + 4; - break; - case R_PCRLONG: - internal->howto = howto_table + 5; - break; - case R_MOVB1: - internal->howto = howto_table + 6; - break; - case R_MOVB2: - internal->howto = howto_table + 7; - break; - case R_JMP1: - internal->howto = howto_table + 8; - break; - case R_JMP2: - internal->howto = howto_table + 9; - break; - case R_JMPL1: - internal->howto = howto_table + 10; - break; - case R_JMPL_B8: - internal->howto = howto_table + 11; - break; - case R_MOVLB1: - internal->howto = howto_table + 12; - break; - case R_MOVLB2: - internal->howto = howto_table + 13; - break; - case R_MEM_INDIRECT: - internal->howto = howto_table + 14; - break; - default: - abort (); - break; - } -} - -#define RTYPE2HOWTO(internal, relocentry) rtype2howto(internal,relocentry) - - -/* Perform any necessaru magic to the addend in a reloc entry */ - - -#define CALC_ADDEND(abfd, symbol, ext_reloc, cache_ptr) \ - cache_ptr->addend = ext_reloc.r_offset; - - -#define RELOC_PROCESSING(relent,reloc,symbols,abfd,section) \ - reloc_processing(relent, reloc, symbols, abfd, section) - -static void -reloc_processing (relent, reloc, symbols, abfd, section) - arelent * relent; - struct internal_reloc *reloc; - asymbol ** symbols; - bfd * abfd; - asection * section; -{ - relent->address = reloc->r_vaddr; - rtype2howto (relent, reloc); - - if (((int) reloc->r_symndx) > 0) - { - relent->sym_ptr_ptr = symbols + obj_convert (abfd)[reloc->r_symndx]; - } - else - { - relent->sym_ptr_ptr = bfd_abs_section_ptr->symbol_ptr_ptr; - } - - - - relent->addend = reloc->r_offset; - - relent->address -= section->vma; - /* relent->section = 0;*/ -} - - -static int -h8300_reloc16_estimate(abfd, input_section, reloc, shrink, link_info) - bfd *abfd; - asection *input_section; - arelent *reloc; - unsigned int shrink; - struct bfd_link_info *link_info; -{ - bfd_vma value; - bfd_vma dot; - bfd_vma gap; - - /* The address of the thing to be relocated will have moved back by - the size of the shrink - but we don't change reloc->address here, - since we need it to know where the relocation lives in the source - uncooked section */ - - /* reloc->address -= shrink; conceptual */ - - bfd_vma address = reloc->address - shrink; - - - switch (reloc->howto->type) - { - case R_MOVB2: - case R_JMP2: - shrink+=2; - break; - - /* Thing is a move one byte */ - case R_MOVB1: - value = bfd_coff_reloc16_get_value(reloc, link_info, input_section); - - if (value >= 0xff00) - { - - /* Change the reloc type from 16bit, possible 8 to 8bit - possible 16 */ - reloc->howto = reloc->howto + 1; - /* The place to relc moves back by one */ - /* This will be two bytes smaller in the long run */ - shrink +=2 ; - bfd_perform_slip(abfd, 2, input_section, address); - } - - break; - /* This is the 24 bit branch which could become an 8 bitter, - the relocation points to the first byte of the insn, not the - actual data */ - - case R_JMPL1: - value = bfd_coff_reloc16_get_value(reloc, link_info, input_section); - - dot = input_section->output_section->vma + - input_section->output_offset + address; - - /* See if the address we're looking at within 127 bytes of where - we are, if so then we can use a small branch rather than the - jump we were going to */ - - gap = value - dot ; - - if (-120 < (long)gap && (long)gap < 120 ) - { - - /* Change the reloc type from 24bit, possible 8 to 8bit - possible 32 */ - reloc->howto = reloc->howto + 1; - /* This will be two bytes smaller in the long run */ - shrink +=2 ; - bfd_perform_slip(abfd, 2, input_section, address); - } - break; - - case R_JMP1: - - value = bfd_coff_reloc16_get_value(reloc, link_info, input_section); - - dot = input_section->output_section->vma + - input_section->output_offset + address; - - /* See if the address we're looking at within 127 bytes of where - we are, if so then we can use a small branch rather than the - jump we were going to */ - - gap = value - (dot - shrink); - - - if (-120 < (long)gap && (long)gap < 120 ) - { - - /* Change the reloc type from 16bit, possible 8 to 8bit - possible 16 */ - reloc->howto = reloc->howto + 1; - /* The place to relc moves back by one */ - - /* This will be two bytes smaller in the long run */ - shrink +=2 ; - bfd_perform_slip(abfd, 2, input_section, address); - } - break; - } - - - return shrink; -} - - -/* First phase of a relaxing link */ - -/* Reloc types - large small - R_MOVB1 R_MOVB2 mov.b with 16bit or 8 bit address - R_JMP1 R_JMP2 jmp or pcrel branch - R_JMPL1 R_JMPL_B8 24jmp or pcrel branch - R_MOVLB1 R_MOVLB2 24 or 8 bit reloc for mov.b - -*/ - -static void -h8300_reloc16_extra_cases (abfd, link_info, link_order, reloc, data, src_ptr, - dst_ptr) - bfd *abfd; - struct bfd_link_info *link_info; - struct bfd_link_order *link_order; - arelent *reloc; - bfd_byte *data; - unsigned int *src_ptr; - unsigned int *dst_ptr; -{ - unsigned int src_address = *src_ptr; - unsigned int dst_address = *dst_ptr; - asection *input_section = link_order->u.indirect.section; - - switch (reloc->howto->type) - { - /* A 24 bit branch which could be a 8 bit pcrel, really pointing to - the byte before the 24bit hole, so we can treat it as a 32bit pointer */ - case R_PCRBYTE: - { - bfd_vma dot = link_order->offset - + dst_address - + link_order->u.indirect.section->output_section->vma; - int gap = (bfd_coff_reloc16_get_value (reloc, link_info, input_section) - - dot); - if (gap > 127 || gap < -128) - { - if (! ((*link_info->callbacks->reloc_overflow) - (link_info, bfd_asymbol_name (*reloc->sym_ptr_ptr), - reloc->howto->name, reloc->addend, input_section->owner, - input_section, reloc->address))) - abort (); - } - gap &= ~1; - bfd_put_8 (abfd, gap, data + dst_address); - dst_address++; - src_address++; - - break; - } - case R_PCRWORD: - { - bfd_vma dot = link_order->offset - + dst_address - + link_order->u.indirect.section->output_section->vma; - int gap = (bfd_coff_reloc16_get_value (reloc, link_info, input_section) - - dot) - 1; - if (gap > 32767 || gap < -32768) - { - if (! ((*link_info->callbacks->reloc_overflow) - (link_info, bfd_asymbol_name (*reloc->sym_ptr_ptr), - reloc->howto->name, reloc->addend, input_section->owner, - input_section, reloc->address))) - abort (); - } - - bfd_put_16 (abfd, gap, data + dst_address); - dst_address+=2; - src_address+=2; - - break; - } - - case R_MEM_INDIRECT: /* Temporary */ - case R_RELBYTE: - { - unsigned int gap = bfd_coff_reloc16_get_value (reloc, link_info, - input_section); - if (gap < 0xff - || (gap >= 0x0000ff00 - && gap <= 0x0000ffff) - || ( gap >= 0x00ffff00 - && gap <= 0x00ffffff) - || ( gap >= 0xffffff00 - && gap <= 0xffffffff)) - { - bfd_put_8 (abfd, gap, data + dst_address); - dst_address += 1; - src_address += 1; - } - else - { - if (! ((*link_info->callbacks->reloc_overflow) - (link_info, bfd_asymbol_name (*reloc->sym_ptr_ptr), - reloc->howto->name, reloc->addend, input_section->owner, - input_section, reloc->address))) - abort (); - } - } - break; - case R_JMP1: - /* A relword which would have like to have been a pcrel */ - case R_MOVB1: - /* A relword which would like to have been modified but - didn't make it */ - case R_RELWORD: - bfd_put_16 (abfd, - bfd_coff_reloc16_get_value (reloc, link_info, input_section), - data + dst_address); - dst_address += 2; - src_address += 2; - break; - case R_RELLONG: - bfd_put_32 (abfd, - bfd_coff_reloc16_get_value (reloc, link_info, input_section), - data + dst_address); - dst_address += 4; - src_address += 4; - break; - - case R_MOVB2: - /* Special relaxed type, there will be a gap between where we - get stuff from and where we put stuff to now - - for a mov.b @aa:16 -> mov.b @aa:8 - opcode 0x6a 0x0y offset - -> 0x2y off - */ - if (data[dst_address - 1] != 0x6a) - abort (); - switch (data[src_address] & 0xf0) - { - case 0x00: - /* Src is memory */ - data[dst_address - 1] = (data[src_address] & 0xf) | 0x20; - break; - case 0x80: - /* Src is reg */ - data[dst_address - 1] = (data[src_address] & 0xf) | 0x30; - break; - default: - abort (); - } - - /* the offset must fit ! after all, what was all the relaxing - about ? */ - - bfd_put_8 (abfd, - bfd_coff_reloc16_get_value (reloc, link_info, input_section), - data + dst_address); - - /* Note the magic - src goes up by two bytes, but dst by only - one */ - dst_address += 1; - src_address += 3; - - break; - - case R_JMP2: - - /* Speciial relaxed type */ - { - bfd_vma dot = link_order->offset - + dst_address - + link_order->u.indirect.section->output_section->vma; - - int gap = (bfd_coff_reloc16_get_value (reloc, link_info, input_section) - - dot - 1); - - if ((gap & ~0xff) != 0 && ((gap & 0xff00) != 0xff00)) - abort (); - - bfd_put_8 (abfd, gap, data + dst_address); - - switch (data[dst_address - 1]) - { - case 0x5e: - /* jsr -> bsr */ - bfd_put_8 (abfd, 0x55, data + dst_address - 1); - break; - case 0x5a: - /* jmp ->bra */ - bfd_put_8 (abfd, 0x40, data + dst_address - 1); - break; - - default: - abort (); - } - dst_address++; - src_address += 3; - - break; - } - break; - - case R_JMPL_B8: /* 24 bit branch which is now 8 bits */ - - /* Speciial relaxed type */ - { - bfd_vma dot = link_order->offset - + dst_address - + link_order->u.indirect.section->output_section->vma; - - int gap = (bfd_coff_reloc16_get_value (reloc, link_info, input_section) - - dot - 2); - - if ((gap & ~0xff) != 0 && ((gap & 0xff00) != 0xff00)) - abort (); - - switch (data[src_address]) - { - case 0x5e: - /* jsr -> bsr */ - bfd_put_8 (abfd, 0x55, data + dst_address); - break; - case 0x5a: - /* jmp ->bra */ - bfd_put_8 (abfd, 0x40, data + dst_address); - break; - - default: - bfd_put_8 (abfd, 0xde, data + dst_address); - break; - } - - bfd_put_8 (abfd, gap, data + dst_address + 1); - dst_address += 2; - src_address += 4; - - break; - } - - case R_JMPL1: - { - int v = bfd_coff_reloc16_get_value (reloc, link_info, input_section); - int o = bfd_get_32 (abfd, data + src_address); - v = (v & 0x00ffffff) | (o & 0xff000000); - bfd_put_32 (abfd, v, data + dst_address); - dst_address += 4; - src_address += 4; - } - - break; - - - /* A 24 bit mov which could be an 8 bit move, really pointing to - the byte before the 24bit hole, so we can treat it as a 32bit pointer */ - case R_MOVLB1: - { - int v = bfd_coff_reloc16_get_value (reloc, link_info, input_section); - int o = bfd_get_32 (abfd, data + dst_address); - v = (v & 0x00ffffff) | (o & 0xff000000); - bfd_put_32 (abfd, v, data + dst_address); - dst_address += 4; - src_address += 4; - } - - break; - default: - - abort (); - break; - - } - *src_ptr = src_address; - *dst_ptr = dst_address; - -} - -#define coff_reloc16_extra_cases h8300_reloc16_extra_cases -#define coff_reloc16_estimate h8300_reloc16_estimate - -#define COFF_LONG_FILENAMES -#include "coffcode.h" - - -#undef coff_bfd_get_relocated_section_contents -#undef coff_bfd_relax_section -#define coff_bfd_get_relocated_section_contents \ - bfd_coff_reloc16_get_relocated_section_contents -#define coff_bfd_relax_section bfd_coff_reloc16_relax_section - - - -const bfd_target h8300coff_vec = -{ - "coff-h8300", /* name */ - bfd_target_coff_flavour, - BFD_ENDIAN_BIG, /* data byte order is big */ - BFD_ENDIAN_BIG, /* header byte order is big */ - - (HAS_RELOC | EXEC_P | /* object flags */ - HAS_LINENO | HAS_DEBUG | - HAS_SYMS | HAS_LOCALS | WP_TEXT | BFD_IS_RELAXABLE ), - (SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD | SEC_RELOC), /* section flags */ - '_', /* leading char */ - '/', /* ar_pad_char */ - 15, /* ar_max_namelen */ - bfd_getb64, bfd_getb_signed_64, bfd_putb64, - bfd_getb32, bfd_getb_signed_32, bfd_putb32, - bfd_getb16, bfd_getb_signed_16, bfd_putb16, /* data */ - bfd_getb64, bfd_getb_signed_64, bfd_putb64, - bfd_getb32, bfd_getb_signed_32, bfd_putb32, - bfd_getb16, bfd_getb_signed_16, bfd_putb16, /* hdrs */ - - {_bfd_dummy_target, coff_object_p, /* bfd_check_format */ - bfd_generic_archive_p, _bfd_dummy_target}, - {bfd_false, coff_mkobject, _bfd_generic_mkarchive, /* bfd_set_format */ - bfd_false}, - {bfd_false, coff_write_object_contents, /* bfd_write_contents */ - _bfd_write_archive_contents, bfd_false}, - - BFD_JUMP_TABLE_GENERIC (coff), - BFD_JUMP_TABLE_COPY (coff), - BFD_JUMP_TABLE_CORE (_bfd_nocore), - BFD_JUMP_TABLE_ARCHIVE (_bfd_archive_coff), - BFD_JUMP_TABLE_SYMBOLS (coff), - BFD_JUMP_TABLE_RELOCS (coff), - BFD_JUMP_TABLE_WRITE (coff), - BFD_JUMP_TABLE_LINK (coff), - BFD_JUMP_TABLE_DYNAMIC (_bfd_nodynamic), - - COFF_SWAP_TABLE, -}; diff --git a/contrib/gdb/bfd/coff-h8500.c b/contrib/gdb/bfd/coff-h8500.c deleted file mode 100644 index f416f8fa28259..0000000000000 --- a/contrib/gdb/bfd/coff-h8500.c +++ /dev/null @@ -1,355 +0,0 @@ -/* BFD back-end for Hitachi H8/500 COFF binaries. - Copyright 1993, 1994 Free Software Foundation, Inc. - Contributed by Cygnus Support. - Written by Steve Chamberlain, <sac@cygnus.com>. - -This file is part of BFD, the Binary File Descriptor library. - -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 2 of the License, 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ - -#include "bfd.h" -#include "sysdep.h" -#include "obstack.h" -#include "libbfd.h" -#include "bfdlink.h" -#include "coff/h8500.h" -#include "coff/internal.h" -#include "libcoff.h" - -#define COFF_DEFAULT_SECTION_ALIGNMENT_POWER (1) - -static reloc_howto_type r_imm8 = -HOWTO (R_H8500_IMM8, 0, 1, 8, false, 0, - complain_overflow_bitfield, 0, "r_imm8", true, 0x000000ff, 0x000000ff, false); - -static reloc_howto_type r_imm16 = -HOWTO (R_H8500_IMM16, 0, 1, 16, false, 0, - complain_overflow_bitfield, 0, "r_imm16", true, 0x0000ffff, 0x0000ffff, false); - -static reloc_howto_type r_imm24 = -HOWTO (R_H8500_IMM24, 0, 1, 24, false, 0, - complain_overflow_bitfield, 0, "r_imm24", true, 0x00ffffff, 0x00ffffff, false); - -static reloc_howto_type r_imm32 = -HOWTO (R_H8500_IMM32, 0, 1, 32, false, 0, - complain_overflow_bitfield, 0, "r_imm32", true, 0xffffffff, 0xffffffff, false); - - -static reloc_howto_type r_high8 = -HOWTO (R_H8500_HIGH8, 0, 1, 8, false, 0, - complain_overflow_dont, 0, "r_high8", true, 0x000000ff, 0x000000ff, false); - -static reloc_howto_type r_low16 = -HOWTO (R_H8500_LOW16, 0, 1, 16, false, 0, - complain_overflow_dont, 0, "r_low16", true, 0x0000ffff, 0x0000ffff, false); - -static reloc_howto_type r_pcrel8 = -HOWTO (R_H8500_PCREL8, 0, 1, 8, true, 0, complain_overflow_signed, 0, "r_pcrel8", true, 0, 0, true); - - -static reloc_howto_type r_pcrel16 = -HOWTO (R_H8500_PCREL16, 0, 1, 16, true, 0, complain_overflow_signed, 0, "r_pcrel16", true, 0, 0, true); - -static reloc_howto_type r_high16 = -HOWTO (R_H8500_HIGH16, 0, 1, 8, false, 0, - complain_overflow_dont, 0, "r_high16", true, 0x000ffff, 0x0000ffff, false); - - -/* Turn a howto into a reloc number */ - -static int -coff_h8500_select_reloc (howto) - reloc_howto_type *howto; -{ - return howto->type; -} - -#define SELECT_RELOC(x,howto) x.r_type = coff_h8500_select_reloc(howto) - - -#define BADMAG(x) H8500BADMAG(x) -#define H8500 1 /* Customize coffcode.h */ - -#define __A_MAGIC_SET__ - -/* Code to swap in the reloc */ -#define SWAP_IN_RELOC_OFFSET bfd_h_get_32 -#define SWAP_OUT_RELOC_OFFSET bfd_h_put_32 -#define SWAP_OUT_RELOC_EXTRA(abfd, src, dst) \ - dst->r_stuff[0] = 'S'; \ - dst->r_stuff[1] = 'C'; - -/* Code to turn a r_type into a howto ptr, uses the above howto table - */ - -static void -rtype2howto(internal, dst) - arelent * internal; - struct internal_reloc *dst; -{ - switch (dst->r_type) - { - default: - abort (); - break; - case R_H8500_IMM8: - internal->howto = &r_imm8; - break; - case R_H8500_IMM16: - internal->howto = &r_imm16; - break; - case R_H8500_IMM24: - internal->howto = &r_imm24; - break; - case R_H8500_IMM32: - internal->howto = &r_imm32; - break; - case R_H8500_PCREL8: - internal->howto = &r_pcrel8; - break; - case R_H8500_PCREL16: - internal->howto = &r_pcrel16; - break; - case R_H8500_HIGH8: - internal->howto = &r_high8; - break; - case R_H8500_HIGH16: - internal->howto = &r_high16; - break; - case R_H8500_LOW16: - internal->howto = &r_low16; - break; - } -} - -#define RTYPE2HOWTO(internal, relocentry) rtype2howto(internal,relocentry) - - -/* Perform any necessaru magic to the addend in a reloc entry */ - - -#define CALC_ADDEND(abfd, symbol, ext_reloc, cache_ptr) \ - cache_ptr->addend = ext_reloc.r_offset; - - -#define RELOC_PROCESSING(relent,reloc,symbols,abfd,section) \ - reloc_processing(relent, reloc, symbols, abfd, section) - -static void reloc_processing (relent, reloc, symbols, abfd, section) - arelent * relent; - struct internal_reloc *reloc; - asymbol ** symbols; - bfd * abfd; - asection * section; -{ - relent->address = reloc->r_vaddr; - rtype2howto (relent, reloc); - - if (reloc->r_symndx > 0) - { - relent->sym_ptr_ptr = symbols + obj_convert (abfd)[reloc->r_symndx]; - } - else - { - relent->sym_ptr_ptr = bfd_abs_section_ptr->symbol_ptr_ptr; - } - - - relent->addend = reloc->r_offset; - relent->address -= section->vma; -} - -static void -extra_case (in_abfd, link_info, link_order, reloc, data, src_ptr, dst_ptr) - bfd *in_abfd; - struct bfd_link_info *link_info; - struct bfd_link_order *link_order; - arelent *reloc; - bfd_byte *data; - unsigned int *src_ptr; - unsigned int *dst_ptr; -{ - bfd_byte *d = data+*dst_ptr; - asection *input_section = link_order->u.indirect.section; - switch (reloc->howto->type) - { - case R_H8500_IMM8: - bfd_put_8 (in_abfd, - bfd_coff_reloc16_get_value (reloc, link_info, input_section), - d); - (*dst_ptr) += 1; - (*src_ptr) += 1; - break; - - case R_H8500_HIGH8: - bfd_put_8 (in_abfd, - (bfd_coff_reloc16_get_value (reloc, link_info, input_section) - >> 16), - d ); - (*dst_ptr) += 1; - (*src_ptr) += 1; - break; - - case R_H8500_IMM16: - bfd_put_16 (in_abfd, - bfd_coff_reloc16_get_value (reloc, link_info, input_section), - d ); - (*dst_ptr) += 2; - (*src_ptr) += 2; - break; - - case R_H8500_LOW16: - bfd_put_16 (in_abfd, - bfd_coff_reloc16_get_value (reloc, link_info, input_section), - d); - - (*dst_ptr) += 2; - (*src_ptr) += 2; - break; - - case R_H8500_HIGH16: - bfd_put_16 (in_abfd, - (bfd_coff_reloc16_get_value (reloc, link_info, input_section) - >>16), - d); - - (*dst_ptr) += 2; - (*src_ptr) += 2; - break; - - case R_H8500_IMM24: - { - int v = bfd_coff_reloc16_get_value(reloc, link_info, input_section); - int o = bfd_get_32(in_abfd, data+ *dst_ptr -1); - v = (v & 0x00ffffff) | (o & 0xff00000); - bfd_put_32 (in_abfd, v, data + *dst_ptr -1); - (*dst_ptr) +=3; - (*src_ptr)+=3;; - } - break; - case R_H8500_IMM32: - { - int v = bfd_coff_reloc16_get_value(reloc, link_info, input_section); - bfd_put_32 (in_abfd, v, data + *dst_ptr); - (*dst_ptr) +=4; - (*src_ptr)+=4;; - } - break; - - - case R_H8500_PCREL8: - { - bfd_vma dst = bfd_coff_reloc16_get_value (reloc, link_info, - input_section); - bfd_vma dot = link_order->offset - + *dst_ptr - + link_order->u.indirect.section->output_section->vma; - int gap = dst - dot - 1; /* -1 since were in the odd byte of the - word and the pc's been incremented */ - - if (gap > 128 || gap < -128) - { - if (! ((*link_info->callbacks->reloc_overflow) - (link_info, bfd_asymbol_name (*reloc->sym_ptr_ptr), - reloc->howto->name, reloc->addend, input_section->owner, - input_section, reloc->address))) - abort (); - } - bfd_put_8 (in_abfd, gap, data + *dst_ptr); - (*dst_ptr)++; - (*src_ptr)++; - break; - } - case R_H8500_PCREL16: - { - bfd_vma dst = bfd_coff_reloc16_get_value (reloc, link_info, - input_section); - bfd_vma dot = link_order->offset - + *dst_ptr - + link_order->u.indirect.section->output_section->vma; - int gap = dst - dot - 1; /* -1 since were in the odd byte of the - word and the pc's been incremented */ - - if (gap > 32767 || gap < -32768) - { - if (! ((*link_info->callbacks->reloc_overflow) - (link_info, bfd_asymbol_name (*reloc->sym_ptr_ptr), - reloc->howto->name, reloc->addend, input_section->owner, - input_section, reloc->address))) - abort (); - } - bfd_put_16 (in_abfd, gap, data + *dst_ptr); - (*dst_ptr)+=2; - (*src_ptr)+=2; - break; - } - - default: - abort (); - } -} - -#define coff_reloc16_extra_cases extra_case - -#include "coffcode.h" - - -#undef coff_bfd_get_relocated_section_contents -#undef coff_bfd_relax_section -#define coff_bfd_get_relocated_section_contents \ - bfd_coff_reloc16_get_relocated_section_contents -#define coff_bfd_relax_section bfd_coff_reloc16_relax_section - -const bfd_target h8500coff_vec = -{ - "coff-h8500", /* name */ - bfd_target_coff_flavour, - BFD_ENDIAN_BIG, /* data byte order is big */ - BFD_ENDIAN_BIG, /* header byte order is big */ - - (HAS_RELOC | EXEC_P | /* object flags */ - HAS_LINENO | HAS_DEBUG | - HAS_SYMS | HAS_LOCALS | WP_TEXT), - - (SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD | SEC_RELOC), /* section flags */ - '_', /* leading symbol underscore */ - '/', /* ar_pad_char */ - 15, /* ar_max_namelen */ - bfd_getb64, bfd_getb_signed_64, bfd_putb64, - bfd_getb32, bfd_getb_signed_32, bfd_putb32, - bfd_getb16, bfd_getb_signed_16, bfd_putb16, /* data */ - bfd_getb64, bfd_getb_signed_64, bfd_putb64, - bfd_getb32, bfd_getb_signed_32, bfd_putb32, - bfd_getb16, bfd_getb_signed_16, bfd_putb16, /* hdrs */ - - {_bfd_dummy_target, coff_object_p, /* bfd_check_format */ - bfd_generic_archive_p, _bfd_dummy_target}, - {bfd_false, coff_mkobject, _bfd_generic_mkarchive, /* bfd_set_format */ - bfd_false}, - {bfd_false, coff_write_object_contents, /* bfd_write_contents */ - _bfd_write_archive_contents, bfd_false}, - - BFD_JUMP_TABLE_GENERIC (coff), - BFD_JUMP_TABLE_COPY (coff), - BFD_JUMP_TABLE_CORE (_bfd_nocore), - BFD_JUMP_TABLE_ARCHIVE (_bfd_archive_coff), - BFD_JUMP_TABLE_SYMBOLS (coff), - BFD_JUMP_TABLE_RELOCS (coff), - BFD_JUMP_TABLE_WRITE (coff), - BFD_JUMP_TABLE_LINK (coff), - BFD_JUMP_TABLE_DYNAMIC (_bfd_nodynamic), - - COFF_SWAP_TABLE, -}; diff --git a/contrib/gdb/bfd/coff-i386.c b/contrib/gdb/bfd/coff-i386.c deleted file mode 100644 index d905b53cda83b..0000000000000 --- a/contrib/gdb/bfd/coff-i386.c +++ /dev/null @@ -1,493 +0,0 @@ -/* BFD back-end for Intel 386 COFF files. - Copyright 1990, 1991, 1992, 1993, 1994, 1995 Free Software Foundation, Inc. - Written by Cygnus Support. - -This file is part of BFD, the Binary File Descriptor library. - -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 2 of the License, 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ - -#include "bfd.h" -#include "sysdep.h" -#include "libbfd.h" -#include "obstack.h" - -#include "coff/i386.h" - -#include "coff/internal.h" - -#ifdef COFF_WITH_PE -#include "coff/pe.h" -#endif - -#include "libcoff.h" - -static bfd_reloc_status_type coff_i386_reloc - PARAMS ((bfd *, arelent *, asymbol *, PTR, asection *, bfd *, char **)); -static reloc_howto_type *coff_i386_rtype_to_howto - PARAMS ((bfd *, asection *, struct internal_reloc *, - struct coff_link_hash_entry *, struct internal_syment *, - - bfd_vma *)); - -#define COFF_DEFAULT_SECTION_ALIGNMENT_POWER (2) -/* The page size is a guess based on ELF. */ - -#define COFF_PAGE_SIZE 0x1000 - -/* For some reason when using i386 COFF the value stored in the .text - section for a reference to a common symbol is the value itself plus - any desired offset. Ian Taylor, Cygnus Support. */ - -/* If we are producing relocateable output, we need to do some - adjustments to the object file that are not done by the - bfd_perform_relocation function. This function is called by every - reloc type to make any required adjustments. */ - -static bfd_reloc_status_type -coff_i386_reloc (abfd, reloc_entry, symbol, data, input_section, output_bfd, - error_message) - bfd *abfd; - arelent *reloc_entry; - asymbol *symbol; - PTR data; - asection *input_section; - bfd *output_bfd; - char **error_message; -{ - symvalue diff; - - if (output_bfd == (bfd *) NULL) - return bfd_reloc_continue; - - - if (bfd_is_com_section (symbol->section)) - { - /* We are relocating a common symbol. The current value in the - object file is ORIG + OFFSET, where ORIG is the value of the - common symbol as seen by the object file when it was compiled - (this may be zero if the symbol was undefined) and OFFSET is - the offset into the common symbol (normally zero, but may be - non-zero when referring to a field in a common structure). - ORIG is the negative of reloc_entry->addend, which is set by - the CALC_ADDEND macro below. We want to replace the value in - the object file with NEW + OFFSET, where NEW is the value of - the common symbol which we are going to put in the final - object file. NEW is symbol->value. */ - diff = symbol->value + reloc_entry->addend; - } - else - { - /* For some reason bfd_perform_relocation always effectively - ignores the addend for a COFF target when producing - relocateable output. This seems to be always wrong for 386 - COFF, so we handle the addend here instead. */ - diff = reloc_entry->addend; - } - - -#ifdef COFF_WITH_PE - if (reloc_entry->howto->type == 7) - { -/* diff -= coff_data(output_bfd)->link_info->pe_info.image_base.value;*/ - exit(1); - } -#endif - -#define DOIT(x) \ - x = ((x & ~howto->dst_mask) | (((x & howto->src_mask) + diff) & howto->dst_mask)) - - if (diff != 0) - { - reloc_howto_type *howto = reloc_entry->howto; - unsigned char *addr = (unsigned char *) data + reloc_entry->address; - - switch (howto->size) - { - case 0: - { - char x = bfd_get_8 (abfd, addr); - DOIT (x); - bfd_put_8 (abfd, x, addr); - } - break; - - case 1: - { - short x = bfd_get_16 (abfd, addr); - DOIT (x); - bfd_put_16 (abfd, x, addr); - } - break; - - case 2: - { - long x = bfd_get_32 (abfd, addr); - DOIT (x); - bfd_put_32 (abfd, x, addr); - } - break; - - default: - abort (); - } - } - - /* Now let bfd_perform_relocation finish everything up. */ - return bfd_reloc_continue; -} - -#ifdef COFF_WITH_PE -/* Return true if this relocation should - appear in the output .reloc section. */ - -static boolean in_reloc_p(abfd, howto) - bfd * abfd; - reloc_howto_type *howto; -{ - return ! howto->pc_relative && howto->type != R_IMAGEBASE; -} -#endif - -#ifndef PCRELOFFSET -#define PCRELOFFSET false -#endif - -static reloc_howto_type howto_table[] = -{ - {0}, - {1}, - {2}, - {3}, - {4}, - {5}, - HOWTO (R_DIR32, /* type */ - 0, /* rightshift */ - 2, /* size (0 = byte, 1 = short, 2 = long) */ - 32, /* bitsize */ - false, /* pc_relative */ - 0, /* bitpos */ - complain_overflow_bitfield, /* complain_on_overflow */ - coff_i386_reloc, /* special_function */ - "dir32", /* name */ - true, /* partial_inplace */ - 0xffffffff, /* src_mask */ - 0xffffffff, /* dst_mask */ - true), /* pcrel_offset */ - /* {7}, */ - HOWTO (R_IMAGEBASE, /* type */ - 0, /* rightshift */ - 2, /* size (0 = byte, 1 = short, 2 = long) */ - 32, /* bitsize */ - false, /* pc_relative */ - 0, /* bitpos */ - complain_overflow_bitfield, /* complain_on_overflow */ - coff_i386_reloc, /* special_function */ - "rva32", /* name */ - true, /* partial_inplace */ - 0xffffffff, /* src_mask */ - 0xffffffff, /* dst_mask */ - false), /* pcrel_offset */ - {010}, - {011}, - {012}, - {013}, - {014}, - {015}, - {016}, - HOWTO (R_RELBYTE, /* type */ - 0, /* rightshift */ - 0, /* size (0 = byte, 1 = short, 2 = long) */ - 8, /* bitsize */ - false, /* pc_relative */ - 0, /* bitpos */ - complain_overflow_bitfield, /* complain_on_overflow */ - coff_i386_reloc, /* special_function */ - "8", /* name */ - true, /* partial_inplace */ - 0x000000ff, /* src_mask */ - 0x000000ff, /* dst_mask */ - PCRELOFFSET), /* pcrel_offset */ - HOWTO (R_RELWORD, /* type */ - 0, /* rightshift */ - 1, /* size (0 = byte, 1 = short, 2 = long) */ - 16, /* bitsize */ - false, /* pc_relative */ - 0, /* bitpos */ - complain_overflow_bitfield, /* complain_on_overflow */ - coff_i386_reloc, /* special_function */ - "16", /* name */ - true, /* partial_inplace */ - 0x0000ffff, /* src_mask */ - 0x0000ffff, /* dst_mask */ - PCRELOFFSET), /* pcrel_offset */ - HOWTO (R_RELLONG, /* type */ - 0, /* rightshift */ - 2, /* size (0 = byte, 1 = short, 2 = long) */ - 32, /* bitsize */ - false, /* pc_relative */ - 0, /* bitpos */ - complain_overflow_bitfield, /* complain_on_overflow */ - coff_i386_reloc, /* special_function */ - "32", /* name */ - true, /* partial_inplace */ - 0xffffffff, /* src_mask */ - 0xffffffff, /* dst_mask */ - PCRELOFFSET), /* pcrel_offset */ - HOWTO (R_PCRBYTE, /* type */ - 0, /* rightshift */ - 0, /* size (0 = byte, 1 = short, 2 = long) */ - 8, /* bitsize */ - true, /* pc_relative */ - 0, /* bitpos */ - complain_overflow_signed, /* complain_on_overflow */ - coff_i386_reloc, /* special_function */ - "DISP8", /* name */ - true, /* partial_inplace */ - 0x000000ff, /* src_mask */ - 0x000000ff, /* dst_mask */ - PCRELOFFSET), /* pcrel_offset */ - HOWTO (R_PCRWORD, /* type */ - 0, /* rightshift */ - 1, /* size (0 = byte, 1 = short, 2 = long) */ - 16, /* bitsize */ - true, /* pc_relative */ - 0, /* bitpos */ - complain_overflow_signed, /* complain_on_overflow */ - coff_i386_reloc, /* special_function */ - "DISP16", /* name */ - true, /* partial_inplace */ - 0x0000ffff, /* src_mask */ - 0x0000ffff, /* dst_mask */ - PCRELOFFSET), /* pcrel_offset */ - HOWTO (R_PCRLONG, /* type */ - 0, /* rightshift */ - 2, /* size (0 = byte, 1 = short, 2 = long) */ - 32, /* bitsize */ - true, /* pc_relative */ - 0, /* bitpos */ - complain_overflow_signed, /* complain_on_overflow */ - coff_i386_reloc, /* special_function */ - "DISP32", /* name */ - true, /* partial_inplace */ - 0xffffffff, /* src_mask */ - 0xffffffff, /* dst_mask */ - PCRELOFFSET) /* pcrel_offset */ -}; - -/* Turn a howto into a reloc nunmber */ - -#define SELECT_RELOC(x,howto) { x.r_type = howto->type; } -#define BADMAG(x) I386BADMAG(x) -#define I386 1 /* Customize coffcode.h */ - -#define RTYPE2HOWTO(cache_ptr, dst) \ - (cache_ptr)->howto = howto_table + (dst)->r_type; - -/* For 386 COFF a STYP_NOLOAD | STYP_BSS section is part of a shared - library. On some other COFF targets STYP_BSS is normally - STYP_NOLOAD. */ -#define BSS_NOLOAD_IS_SHARED_LIBRARY - -/* Compute the addend of a reloc. If the reloc is to a common symbol, - the object file contains the value of the common symbol. By the - time this is called, the linker may be using a different symbol - from a different object file with a different value. Therefore, we - hack wildly to locate the original symbol from this file so that we - can make the correct adjustment. This macro sets coffsym to the - symbol from the original file, and uses it to set the addend value - correctly. If this is not a common symbol, the usual addend - calculation is done, except that an additional tweak is needed for - PC relative relocs. - FIXME: This macro refers to symbols and asect; these are from the - calling function, not the macro arguments. */ - -#define CALC_ADDEND(abfd, ptr, reloc, cache_ptr) \ - { \ - coff_symbol_type *coffsym = (coff_symbol_type *) NULL; \ - if (ptr && bfd_asymbol_bfd (ptr) != abfd) \ - coffsym = (obj_symbols (abfd) \ - + (cache_ptr->sym_ptr_ptr - symbols)); \ - else if (ptr) \ - coffsym = coff_symbol_from (abfd, ptr); \ - if (coffsym != (coff_symbol_type *) NULL \ - && coffsym->native->u.syment.n_scnum == 0) \ - cache_ptr->addend = - coffsym->native->u.syment.n_value; \ - else if (ptr && bfd_asymbol_bfd (ptr) == abfd \ - && ptr->section != (asection *) NULL) \ - cache_ptr->addend = - (ptr->section->vma + ptr->value); \ - else \ - cache_ptr->addend = 0; \ - if (ptr && howto_table[reloc.r_type].pc_relative) \ - cache_ptr->addend += asect->vma; \ - } - -/* We use the special COFF backend linker. */ -#define coff_relocate_section _bfd_coff_generic_relocate_section - -static reloc_howto_type * -coff_i386_rtype_to_howto (abfd, sec, rel, h, sym, addendp) - bfd *abfd; - asection *sec; - struct internal_reloc *rel; - struct coff_link_hash_entry *h; - struct internal_syment *sym; - bfd_vma *addendp; -{ - - reloc_howto_type *howto; - - howto = howto_table + rel->r_type; - -#ifdef COFF_WITH_PE - *addendp = 0; -#endif - - if (howto->pc_relative) - *addendp += sec->vma; - - if (sym != NULL && sym->n_scnum == 0 && sym->n_value != 0) - { - /* This is a common symbol. The section contents include the - size (sym->n_value) as an addend. The relocate_section - function will be adding in the final value of the symbol. We - need to subtract out the current size in order to get the - correct result. */ - - BFD_ASSERT (h != NULL); - - -#ifndef COFF_WITH_PE - /* I think we *do* want to bypass this. If we don't, I have seen some data - parameters get the wrong relcation address. If I link two versions - with and without this section bypassed and then do a binary comparison, - the addresses which are different can be looked up in the map. The - case in which this section has been bypassed has addresses which correspond - to values I can find in the map */ - *addendp -= sym->n_value; -#endif - } - - /* If the output symbol is common (in which case this must be a - relocateable link), we need to add in the final size of the - common symbol. */ - if (h != NULL && h->root.type == bfd_link_hash_common) - *addendp += h->root.u.c.size; - - -#ifdef COFF_WITH_PE - if (howto->pc_relative) - *addendp -= 4; - - if (rel->r_type == R_IMAGEBASE) - { - *addendp -= pe_data(sec->output_section->owner)->pe_opthdr.ImageBase; - } -#endif - - return howto; -} - - -#define coff_bfd_reloc_type_lookup coff_i386_reloc_type_lookup - - -static reloc_howto_type * -coff_i386_reloc_type_lookup (abfd, code) - bfd *abfd; - bfd_reloc_code_real_type code; -{ - switch (code) - { - case BFD_RELOC_RVA: - return howto_table +R_IMAGEBASE; - case BFD_RELOC_32: - return howto_table + R_DIR32; - case BFD_RELOC_32_PCREL: - return howto_table + R_PCRLONG; - default: - BFD_FAIL (); - return 0; - } -} - - - -#define coff_rtype_to_howto coff_i386_rtype_to_howto - -#include "coffcode.h" - -static const bfd_target * -i3coff_object_p(a) - bfd *a; -{ - return coff_object_p(a); -} - -const bfd_target -#ifdef TARGET_SYM - TARGET_SYM = -#else - i386coff_vec = -#endif -{ -#ifdef TARGET_NAME - TARGET_NAME, -#else - "coff-i386", /* name */ -#endif - bfd_target_coff_flavour, - BFD_ENDIAN_LITTLE, /* data byte order is little */ - BFD_ENDIAN_LITTLE, /* header byte order is little */ - - (HAS_RELOC | EXEC_P | /* object flags */ - HAS_LINENO | HAS_DEBUG | - HAS_SYMS | HAS_LOCALS | WP_TEXT | D_PAGED), - - (SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD | SEC_RELOC), /* section flags */ -#ifdef TARGET_UNDERSCORE - TARGET_UNDERSCORE, /* leading underscore */ -#else - 0, /* leading underscore */ -#endif - '/', /* ar_pad_char */ - 15, /* ar_max_namelen */ - - bfd_getl64, bfd_getl_signed_64, bfd_putl64, - bfd_getl32, bfd_getl_signed_32, bfd_putl32, - bfd_getl16, bfd_getl_signed_16, bfd_putl16, /* data */ - bfd_getl64, bfd_getl_signed_64, bfd_putl64, - bfd_getl32, bfd_getl_signed_32, bfd_putl32, - bfd_getl16, bfd_getl_signed_16, bfd_putl16, /* hdrs */ - -/* Note that we allow an object file to be treated as a core file as well. */ - {_bfd_dummy_target, i3coff_object_p, /* bfd_check_format */ - bfd_generic_archive_p, i3coff_object_p}, - {bfd_false, coff_mkobject, _bfd_generic_mkarchive, /* bfd_set_format */ - bfd_false}, - {bfd_false, coff_write_object_contents, /* bfd_write_contents */ - _bfd_write_archive_contents, bfd_false}, - - BFD_JUMP_TABLE_GENERIC (coff), - BFD_JUMP_TABLE_COPY (coff), - BFD_JUMP_TABLE_CORE (_bfd_nocore), - BFD_JUMP_TABLE_ARCHIVE (_bfd_archive_coff), - BFD_JUMP_TABLE_SYMBOLS (coff), - BFD_JUMP_TABLE_RELOCS (coff), - BFD_JUMP_TABLE_WRITE (coff), - BFD_JUMP_TABLE_LINK (coff), - BFD_JUMP_TABLE_DYNAMIC (_bfd_nodynamic), - - COFF_SWAP_TABLE, -}; diff --git a/contrib/gdb/bfd/coff-i860.c b/contrib/gdb/bfd/coff-i860.c deleted file mode 100644 index 9605cdf0b8523..0000000000000 --- a/contrib/gdb/bfd/coff-i860.c +++ /dev/null @@ -1,423 +0,0 @@ -/* BFD back-end for Intel 860 COFF files. - Copyright 1990, 1991, 1992, 1993, 1994, 1995 Free Software Foundation, Inc. - Created mostly by substituting "860" for "386" in coff-i386.c - Harry Dolan <dolan@ssd.intel.com>, October 1995 - -This file is part of BFD, the Binary File Descriptor library. - -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 2 of the License, 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ - -#include "bfd.h" -#include "sysdep.h" -#include "libbfd.h" -#include "obstack.h" - -#include "coff/i860.h" - -#include "coff/internal.h" - -#include "libcoff.h" - -static bfd_reloc_status_type coff_i860_reloc - PARAMS ((bfd *, arelent *, asymbol *, PTR, asection *, bfd *, char **)); -static reloc_howto_type *coff_i860_rtype_to_howto - PARAMS ((bfd *, asection *, struct internal_reloc *, - struct coff_link_hash_entry *, struct internal_syment *, - bfd_vma *)); - -#define COFF_DEFAULT_SECTION_ALIGNMENT_POWER (2) -/* The page size is a guess based on ELF. */ - -#define COFF_PAGE_SIZE 0x1000 - -/* For some reason when using i860 COFF the value stored in the .text - section for a reference to a common symbol is the value itself plus - any desired offset. Ian Taylor, Cygnus Support. */ - -/* If we are producing relocateable output, we need to do some - adjustments to the object file that are not done by the - bfd_perform_relocation function. This function is called by every - reloc type to make any required adjustments. */ - -static bfd_reloc_status_type -coff_i860_reloc (abfd, reloc_entry, symbol, data, input_section, output_bfd, - error_message) - bfd *abfd; - arelent *reloc_entry; - asymbol *symbol; - PTR data; - asection *input_section; - bfd *output_bfd; - char **error_message; -{ - symvalue diff; - - if (output_bfd == (bfd *) NULL) - return bfd_reloc_continue; - - - if (bfd_is_com_section (symbol->section)) - { - /* We are relocating a common symbol. The current value in the - object file is ORIG + OFFSET, where ORIG is the value of the - common symbol as seen by the object file when it was compiled - (this may be zero if the symbol was undefined) and OFFSET is - the offset into the common symbol (normally zero, but may be - non-zero when referring to a field in a common structure). - ORIG is the negative of reloc_entry->addend, which is set by - the CALC_ADDEND macro below. We want to replace the value in - the object file with NEW + OFFSET, where NEW is the value of - the common symbol which we are going to put in the final - object file. NEW is symbol->value. */ - diff = symbol->value + reloc_entry->addend; - } - else - { - /* For some reason bfd_perform_relocation always effectively - ignores the addend for a COFF target when producing - relocateable output. This seems to be always wrong for 860 - COFF, so we handle the addend here instead. */ - diff = reloc_entry->addend; - } - - -#define DOIT(x) \ - x = ((x & ~howto->dst_mask) | (((x & howto->src_mask) + diff) & howto->dst_mask)) - - if (diff != 0) - { - reloc_howto_type *howto = reloc_entry->howto; - unsigned char *addr = (unsigned char *) data + reloc_entry->address; - - switch (howto->size) - { - case 0: - { - char x = bfd_get_8 (abfd, addr); - DOIT (x); - bfd_put_8 (abfd, x, addr); - } - break; - - case 1: - { - short x = bfd_get_16 (abfd, addr); - DOIT (x); - bfd_put_16 (abfd, x, addr); - } - break; - - case 2: - { - long x = bfd_get_32 (abfd, addr); - DOIT (x); - bfd_put_32 (abfd, x, addr); - } - break; - - default: - abort (); - } - } - - /* Now let bfd_perform_relocation finish everything up. */ - return bfd_reloc_continue; -} - -#ifndef PCRELOFFSET -#define PCRELOFFSET false -#endif - -static reloc_howto_type howto_table[] = -{ - {0}, - {1}, - {2}, - {3}, - {4}, - {5}, - HOWTO (R_DIR32, /* type */ - 0, /* rightshift */ - 2, /* size (0 = byte, 1 = short, 2 = long) */ - 32, /* bitsize */ - false, /* pc_relative */ - 0, /* bitpos */ - complain_overflow_bitfield, /* complain_on_overflow */ - coff_i860_reloc, /* special_function */ - "dir32", /* name */ - true, /* partial_inplace */ - 0xffffffff, /* src_mask */ - 0xffffffff, /* dst_mask */ - true), /* pcrel_offset */ - /* {7}, */ - HOWTO (R_IMAGEBASE, /* type */ - 0, /* rightshift */ - 2, /* size (0 = byte, 1 = short, 2 = long) */ - 32, /* bitsize */ - false, /* pc_relative */ - 0, /* bitpos */ - complain_overflow_bitfield, /* complain_on_overflow */ - coff_i860_reloc, /* special_function */ - "rva32", /* name */ - true, /* partial_inplace */ - 0xffffffff, /* src_mask */ - 0xffffffff, /* dst_mask */ - false), /* pcrel_offset */ - {010}, - {011}, - {012}, - {013}, - {014}, - {015}, - {016}, - HOWTO (R_RELBYTE, /* type */ - 0, /* rightshift */ - 0, /* size (0 = byte, 1 = short, 2 = long) */ - 8, /* bitsize */ - false, /* pc_relative */ - 0, /* bitpos */ - complain_overflow_bitfield, /* complain_on_overflow */ - coff_i860_reloc, /* special_function */ - "8", /* name */ - true, /* partial_inplace */ - 0x000000ff, /* src_mask */ - 0x000000ff, /* dst_mask */ - PCRELOFFSET), /* pcrel_offset */ - HOWTO (R_RELWORD, /* type */ - 0, /* rightshift */ - 1, /* size (0 = byte, 1 = short, 2 = long) */ - 16, /* bitsize */ - false, /* pc_relative */ - 0, /* bitpos */ - complain_overflow_bitfield, /* complain_on_overflow */ - coff_i860_reloc, /* special_function */ - "16", /* name */ - true, /* partial_inplace */ - 0x0000ffff, /* src_mask */ - 0x0000ffff, /* dst_mask */ - PCRELOFFSET), /* pcrel_offset */ - HOWTO (R_RELLONG, /* type */ - 0, /* rightshift */ - 2, /* size (0 = byte, 1 = short, 2 = long) */ - 32, /* bitsize */ - false, /* pc_relative */ - 0, /* bitpos */ - complain_overflow_bitfield, /* complain_on_overflow */ - coff_i860_reloc, /* special_function */ - "32", /* name */ - true, /* partial_inplace */ - 0xffffffff, /* src_mask */ - 0xffffffff, /* dst_mask */ - PCRELOFFSET), /* pcrel_offset */ - HOWTO (R_PCRBYTE, /* type */ - 0, /* rightshift */ - 0, /* size (0 = byte, 1 = short, 2 = long) */ - 8, /* bitsize */ - true, /* pc_relative */ - 0, /* bitpos */ - complain_overflow_signed, /* complain_on_overflow */ - coff_i860_reloc, /* special_function */ - "DISP8", /* name */ - true, /* partial_inplace */ - 0x000000ff, /* src_mask */ - 0x000000ff, /* dst_mask */ - PCRELOFFSET), /* pcrel_offset */ - HOWTO (R_PCRWORD, /* type */ - 0, /* rightshift */ - 1, /* size (0 = byte, 1 = short, 2 = long) */ - 16, /* bitsize */ - true, /* pc_relative */ - 0, /* bitpos */ - complain_overflow_signed, /* complain_on_overflow */ - coff_i860_reloc, /* special_function */ - "DISP16", /* name */ - true, /* partial_inplace */ - 0x0000ffff, /* src_mask */ - 0x0000ffff, /* dst_mask */ - PCRELOFFSET), /* pcrel_offset */ - HOWTO (R_PCRLONG, /* type */ - 0, /* rightshift */ - 2, /* size (0 = byte, 1 = short, 2 = long) */ - 32, /* bitsize */ - true, /* pc_relative */ - 0, /* bitpos */ - complain_overflow_signed, /* complain_on_overflow */ - coff_i860_reloc, /* special_function */ - "DISP32", /* name */ - true, /* partial_inplace */ - 0xffffffff, /* src_mask */ - 0xffffffff, /* dst_mask */ - PCRELOFFSET) /* pcrel_offset */ -}; - -/* Turn a howto into a reloc nunmber */ - -#define SELECT_RELOC(x,howto) { x.r_type = howto->type; } -#define BADMAG(x) I860BADMAG(x) -#define I860 1 /* Customize coffcode.h */ - -#define RTYPE2HOWTO(cache_ptr, dst) \ - (cache_ptr)->howto = howto_table + (dst)->r_type; - -/* For 860 COFF a STYP_NOLOAD | STYP_BSS section is part of a shared - library. On some other COFF targets STYP_BSS is normally - STYP_NOLOAD. */ -#define BSS_NOLOAD_IS_SHARED_LIBRARY - -/* Compute the addend of a reloc. If the reloc is to a common symbol, - the object file contains the value of the common symbol. By the - time this is called, the linker may be using a different symbol - from a different object file with a different value. Therefore, we - hack wildly to locate the original symbol from this file so that we - can make the correct adjustment. This macro sets coffsym to the - symbol from the original file, and uses it to set the addend value - correctly. If this is not a common symbol, the usual addend - calculation is done, except that an additional tweak is needed for - PC relative relocs. - FIXME: This macro refers to symbols and asect; these are from the - calling function, not the macro arguments. */ - -#define CALC_ADDEND(abfd, ptr, reloc, cache_ptr) \ - { \ - coff_symbol_type *coffsym = (coff_symbol_type *) NULL; \ - if (ptr && bfd_asymbol_bfd (ptr) != abfd) \ - coffsym = (obj_symbols (abfd) \ - + (cache_ptr->sym_ptr_ptr - symbols)); \ - else if (ptr) \ - coffsym = coff_symbol_from (abfd, ptr); \ - if (coffsym != (coff_symbol_type *) NULL \ - && coffsym->native->u.syment.n_scnum == 0) \ - cache_ptr->addend = - coffsym->native->u.syment.n_value; \ - else if (ptr && bfd_asymbol_bfd (ptr) == abfd \ - && ptr->section != (asection *) NULL) \ - cache_ptr->addend = - (ptr->section->vma + ptr->value); \ - else \ - cache_ptr->addend = 0; \ - if (ptr && howto_table[reloc.r_type].pc_relative) \ - cache_ptr->addend += asect->vma; \ - } - -/* We use the special COFF backend linker. */ -#define coff_relocate_section _bfd_coff_generic_relocate_section - -static reloc_howto_type * -coff_i860_rtype_to_howto (abfd, sec, rel, h, sym, addendp) - bfd *abfd; - asection *sec; - struct internal_reloc *rel; - struct coff_link_hash_entry *h; - struct internal_syment *sym; - bfd_vma *addendp; -{ - - reloc_howto_type *howto; - - howto = howto_table + rel->r_type; - - if (howto->pc_relative) - *addendp += sec->vma; - - if (sym != NULL && sym->n_scnum == 0 && sym->n_value != 0) - { - /* This is a common symbol. The section contents include the - size (sym->n_value) as an addend. The relocate_section - function will be adding in the final value of the symbol. We - need to subtract out the current size in order to get the - correct result. */ - - BFD_ASSERT (h != NULL); - - - /* I think we *do* want to bypass this. If we don't, I have seen some data - parameters get the wrong relcation address. If I link two versions - with and without this section bypassed and then do a binary comparison, - the addresses which are different can be looked up in the map. The - case in which this section has been bypassed has addresses which correspond - to values I can find in the map */ - *addendp -= sym->n_value; - } - - /* If the output symbol is common (in which case this must be a - relocateable link), we need to add in the final size of the - common symbol. */ - if (h != NULL && h->root.type == bfd_link_hash_common) - *addendp += h->root.u.c.size; - - return howto; -} - -#define coff_rtype_to_howto coff_i860_rtype_to_howto - -#include "coffcode.h" - -static const bfd_target * -i3coff_object_p(a) - bfd *a; -{ - return coff_object_p(a); -} - -const bfd_target -#ifdef TARGET_SYM - TARGET_SYM = -#else - i860coff_vec = -#endif -{ -#ifdef TARGET_NAME - TARGET_NAME, -#else - "coff-i860", /* name */ -#endif - bfd_target_coff_flavour, - BFD_ENDIAN_LITTLE, /* data byte order is little */ - BFD_ENDIAN_LITTLE, /* header byte order is little */ - - (HAS_RELOC | EXEC_P | /* object flags */ - HAS_LINENO | HAS_DEBUG | - HAS_SYMS | HAS_LOCALS | WP_TEXT | D_PAGED), - - (SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD | SEC_RELOC), /* section flags */ - '_', /* leading underscore */ - '/', /* ar_pad_char */ - 15, /* ar_max_namelen */ - - bfd_getl64, bfd_getl_signed_64, bfd_putl64, - bfd_getl32, bfd_getl_signed_32, bfd_putl32, - bfd_getl16, bfd_getl_signed_16, bfd_putl16, /* data */ - bfd_getl64, bfd_getl_signed_64, bfd_putl64, - bfd_getl32, bfd_getl_signed_32, bfd_putl32, - bfd_getl16, bfd_getl_signed_16, bfd_putl16, /* hdrs */ - -/* Note that we allow an object file to be treated as a core file as well. */ - {_bfd_dummy_target, i3coff_object_p, /* bfd_check_format */ - bfd_generic_archive_p, i3coff_object_p}, - {bfd_false, coff_mkobject, _bfd_generic_mkarchive, /* bfd_set_format */ - bfd_false}, - {bfd_false, coff_write_object_contents, /* bfd_write_contents */ - _bfd_write_archive_contents, bfd_false}, - - BFD_JUMP_TABLE_GENERIC (coff), - BFD_JUMP_TABLE_COPY (coff), - BFD_JUMP_TABLE_CORE (_bfd_nocore), - BFD_JUMP_TABLE_ARCHIVE (_bfd_archive_coff), - BFD_JUMP_TABLE_SYMBOLS (coff), - BFD_JUMP_TABLE_RELOCS (coff), - BFD_JUMP_TABLE_WRITE (coff), - BFD_JUMP_TABLE_LINK (coff), - BFD_JUMP_TABLE_DYNAMIC (_bfd_nodynamic), - - COFF_SWAP_TABLE, -}; diff --git a/contrib/gdb/bfd/coff-i960.c b/contrib/gdb/bfd/coff-i960.c deleted file mode 100644 index ed30125f0fa4a..0000000000000 --- a/contrib/gdb/bfd/coff-i960.c +++ /dev/null @@ -1,683 +0,0 @@ -/* BFD back-end for Intel 960 COFF files. - Copyright (C) 1990, 91, 92, 93, 94, 1995 Free Software Foundation, Inc. - Written by Cygnus Support. - -This file is part of BFD, the Binary File Descriptor library. - -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 2 of the License, 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ - -#define I960 1 -#define BADMAG(x) I960BADMAG(x) - -#include "bfd.h" -#include "sysdep.h" -#include "libbfd.h" -#include "obstack.h" -#include "coff/i960.h" -#include "coff/internal.h" -#include "libcoff.h" /* to allow easier abstraction-breaking */ - -static bfd_reloc_status_type optcall_callback - PARAMS ((bfd *, arelent *, asymbol *, PTR, asection *, bfd *, char **)); -static bfd_reloc_status_type coff_i960_relocate - PARAMS ((bfd *, arelent *, asymbol *, PTR, asection *, bfd *, char **)); -static reloc_howto_type *coff_i960_reloc_type_lookup - PARAMS ((bfd *, bfd_reloc_code_real_type)); -static boolean coff_i960_start_final_link - PARAMS ((bfd *, struct bfd_link_info *)); -static boolean coff_i960_relocate_section - PARAMS ((bfd *, struct bfd_link_info *, bfd *, asection *, bfd_byte *, - struct internal_reloc *, struct internal_syment *, asection **)); -static boolean coff_i960_adjust_symndx - PARAMS ((bfd *, struct bfd_link_info *, bfd *, asection *, - struct internal_reloc *, boolean *)); - -#define COFF_DEFAULT_SECTION_ALIGNMENT_POWER (3) - -/* The i960 does not support an MMU, so COFF_PAGE_SIZE can be - arbitrarily small. */ -#define COFF_PAGE_SIZE 1 - -#define COFF_LONG_FILENAMES - -/* This is just like the usual CALC_ADDEND, but it includes the - section VMA for PC relative relocs. */ -#ifndef CALC_ADDEND -#define CALC_ADDEND(abfd, ptr, reloc, cache_ptr) \ - { \ - coff_symbol_type *coffsym = (coff_symbol_type *) NULL; \ - if (ptr && bfd_asymbol_bfd (ptr) != abfd) \ - coffsym = (obj_symbols (abfd) \ - + (cache_ptr->sym_ptr_ptr - symbols)); \ - else if (ptr) \ - coffsym = coff_symbol_from (abfd, ptr); \ - if (coffsym != (coff_symbol_type *) NULL \ - && coffsym->native->u.syment.n_scnum == 0) \ - cache_ptr->addend = 0; \ - else if (ptr && bfd_asymbol_bfd (ptr) == abfd \ - && ptr->section != (asection *) NULL) \ - cache_ptr->addend = - (ptr->section->vma + ptr->value); \ - else \ - cache_ptr->addend = 0; \ - if (ptr && (reloc.r_type == 25 || reloc.r_type == 27)) \ - cache_ptr->addend += asect->vma; \ - } -#endif - -#define CALLS 0x66003800 /* Template for 'calls' instruction */ -#define BAL 0x0b000000 /* Template for 'bal' instruction */ -#define BAL_MASK 0x00ffffff - -static bfd_reloc_status_type -optcall_callback (abfd, reloc_entry, symbol_in, data, - input_section, ignore_bfd, error_message) - bfd *abfd; - arelent *reloc_entry; - asymbol *symbol_in; - PTR data; - asection *input_section; - bfd *ignore_bfd; - char **error_message; -{ - /* This item has already been relocated correctly, but we may be - * able to patch in yet better code - done by digging out the - * correct info on this symbol */ - bfd_reloc_status_type result; - coff_symbol_type *cs = coffsymbol(symbol_in); - - /* Don't do anything with symbols which aren't tied up yet, - except move the reloc. */ - if (bfd_is_und_section (cs->symbol.section)) { - reloc_entry->address += input_section->output_offset; - return bfd_reloc_ok; - } - - /* So the target symbol has to be of coff type, and the symbol - has to have the correct native information within it */ - if ((bfd_asymbol_flavour(&cs->symbol) != bfd_target_coff_flavour) - || (cs->native == (combined_entry_type *)NULL)) - { - /* This is interesting, consider the case where we're outputting coff - from a mix n match input, linking from coff to a symbol defined in a - bout file will cause this match to be true. Should I complain? This - will only work if the bout symbol is non leaf. */ - *error_message = - (char *) "uncertain calling convention for non-COFF symbol"; - result = bfd_reloc_dangerous; - } - else - { - switch (cs->native->u.syment.n_sclass) - { - case C_LEAFSTAT: - case C_LEAFEXT: - /* This is a call to a leaf procedure, replace instruction with a bal - to the correct location. */ - { - union internal_auxent *aux = &((cs->native+2)->u.auxent); - int word = bfd_get_32(abfd, (bfd_byte *)data + reloc_entry->address); - int olf = (aux->x_bal.x_balntry - cs->native->u.syment.n_value); - BFD_ASSERT(cs->native->u.syment.n_numaux==2); - - /* We replace the original call instruction with a bal to - the bal entry point - the offset of which is described in - the 2nd auxent of the original symbol. We keep the native - sym and auxents untouched, so the delta between the two - is the offset of the bal entry point. */ - word = ((word + olf) & BAL_MASK) | BAL; - bfd_put_32(abfd, word, (bfd_byte *) data + reloc_entry->address); - } - result = bfd_reloc_ok; - break; - case C_SCALL: - /* This is a call to a system call, replace with a calls to # */ - BFD_ASSERT(0); - result = bfd_reloc_ok; - break; - default: - result = bfd_reloc_ok; - break; - } - } - return result; -} - -/* i960 COFF is used by VxWorks 5.1. However, VxWorks 5.1 does not - appear to correctly handle a reloc against a symbol defined in the - same object file. It appears to simply discard such relocs, rather - than adding their values into the object file. We handle this here - by converting all relocs against defined symbols into relocs - against the section symbol, when generating a relocateable output - file. - - Note that this function is only called if we are not using the COFF - specific backend linker. It only does something when doing a - relocateable link, which will almost certainly fail when not - generating COFF i960 output, so this function is actually no longer - useful. It was used before this target was converted to use the - COFF specific backend linker. */ - -static bfd_reloc_status_type -coff_i960_relocate (abfd, reloc_entry, symbol, data, input_section, - output_bfd, error_message) - bfd *abfd; - arelent *reloc_entry; - asymbol *symbol; - PTR data; - asection *input_section; - bfd *output_bfd; - char **error_message; -{ - asection *osec; - - if (output_bfd == NULL) - { - /* Not generating relocateable output file. */ - return bfd_reloc_continue; - } - - if (bfd_is_und_section (bfd_get_section (symbol))) - { - /* Symbol is not defined, so no need to worry about it. */ - return bfd_reloc_continue; - } - - if (bfd_is_com_section (bfd_get_section (symbol))) - { - /* I don't really know what the right action is for a common - symbol. */ - return bfd_reloc_continue; - } - - /* Convert the reloc to use the section symbol. FIXME: This method - is ridiculous. */ - osec = bfd_get_section (symbol)->output_section; - if (coff_section_data (output_bfd, osec) != NULL - && coff_section_data (output_bfd, osec)->tdata != NULL) - reloc_entry->sym_ptr_ptr = - (asymbol **) coff_section_data (output_bfd, osec)->tdata; - else - { - const char *sec_name; - asymbol **syms, **sym_end; - - sec_name = bfd_get_section_name (output_bfd, osec); - syms = bfd_get_outsymbols (output_bfd); - sym_end = syms + bfd_get_symcount (output_bfd); - for (; syms < sym_end; syms++) - { - if (bfd_asymbol_name (*syms) != NULL - && (*syms)->value == 0 - && strcmp ((*syms)->section->output_section->name, - sec_name) == 0) - break; - } - - if (syms >= sym_end) - abort (); - - reloc_entry->sym_ptr_ptr = syms; - - if (coff_section_data (output_bfd, osec) == NULL) - { - osec->used_by_bfd = - ((PTR) bfd_zalloc (abfd, - sizeof (struct coff_section_tdata))); - if (osec->used_by_bfd == NULL) - return bfd_reloc_overflow; - } - coff_section_data (output_bfd, osec)->tdata = (PTR) syms; - } - - /* Let bfd_perform_relocation do its thing, which will include - stuffing the symbol addend into the object file. */ - return bfd_reloc_continue; -} - -static reloc_howto_type howto_rellong = - HOWTO ((unsigned int) R_RELLONG, 0, 2, 32,false, 0, - complain_overflow_bitfield, coff_i960_relocate,"rellong", true, - 0xffffffff, 0xffffffff, 0); -static reloc_howto_type howto_iprmed = - HOWTO (R_IPRMED, 0, 2, 24,true,0, complain_overflow_signed, - coff_i960_relocate, "iprmed ", true, 0x00ffffff, 0x00ffffff, 0); -static reloc_howto_type howto_optcall = - HOWTO (R_OPTCALL, 0,2,24,true,0, complain_overflow_signed, - optcall_callback, "optcall", true, 0x00ffffff, 0x00ffffff, 0); - -static reloc_howto_type * -coff_i960_reloc_type_lookup (abfd, code) - bfd *abfd; - bfd_reloc_code_real_type code; -{ - switch (code) - { - default: - return 0; - case BFD_RELOC_I960_CALLJ: - return &howto_optcall; - case BFD_RELOC_32: - case BFD_RELOC_CTOR: - return &howto_rellong; - case BFD_RELOC_24_PCREL: - return &howto_iprmed; - } -} - -/* The real code is in coffcode.h */ - -#define RTYPE2HOWTO(cache_ptr, dst) \ -{ \ - reloc_howto_type *howto_ptr; \ - switch ((dst)->r_type) { \ - case 17: howto_ptr = &howto_rellong; break; \ - case 25: howto_ptr = &howto_iprmed; break; \ - case 27: howto_ptr = &howto_optcall; break; \ - default: howto_ptr = 0; break; \ - } \ - (cache_ptr)->howto = howto_ptr; \ - } - -/* i960 COFF is used by VxWorks 5.1. However, VxWorks 5.1 does not - appear to correctly handle a reloc against a symbol defined in the - same object file. It appears to simply discard such relocs, rather - than adding their values into the object file. We handle this by - converting all relocs against global symbols into relocs against - internal symbols at the start of the section. This routine is - called at the start of the linking process, and it creates the - necessary symbols. */ - -static boolean -coff_i960_start_final_link (abfd, info) - bfd *abfd; - struct bfd_link_info *info; -{ - bfd_size_type symesz = bfd_coff_symesz (abfd); - asection *o; - bfd_byte *esym; - - if (! info->relocateable) - return true; - - esym = (bfd_byte *) bfd_malloc (symesz); - if (esym == NULL) - return false; - - if (bfd_seek (abfd, obj_sym_filepos (abfd), SEEK_SET) != 0) - return false; - - for (o = abfd->sections; o != NULL; o = o->next) - { - struct internal_syment isym; - - strncpy (isym._n._n_name, o->name, SYMNMLEN); - isym.n_value = 0; - isym.n_scnum = o->target_index; - isym.n_type = T_NULL; - isym.n_sclass = C_STAT; - isym.n_numaux = 0; - - bfd_coff_swap_sym_out (abfd, (PTR) &isym, (PTR) esym); - - if (bfd_write (esym, symesz, 1, abfd) != symesz) - { - free (esym); - return false; - } - - obj_raw_syment_count (abfd) += 1; - } - - free (esym); - - return true; -} - -/* The reloc processing routine for the optimized COFF linker. */ - -static boolean -coff_i960_relocate_section (output_bfd, info, input_bfd, input_section, - contents, relocs, syms, sections) - bfd *output_bfd; - struct bfd_link_info *info; - bfd *input_bfd; - asection *input_section; - bfd_byte *contents; - struct internal_reloc *relocs; - struct internal_syment *syms; - asection **sections; -{ - struct internal_reloc *rel; - struct internal_reloc *relend; - - rel = relocs; - relend = rel + input_section->reloc_count; - for (; rel < relend; rel++) - { - long symndx; - struct coff_link_hash_entry *h; - struct internal_syment *sym; - bfd_vma addend; - bfd_vma val; - reloc_howto_type *howto; - bfd_reloc_status_type rstat = bfd_reloc_ok; - boolean done; - - symndx = rel->r_symndx; - - if (symndx == -1) - { - h = NULL; - sym = NULL; - } - else - { - h = obj_coff_sym_hashes (input_bfd)[symndx]; - sym = syms + symndx; - } - - if (sym != NULL && sym->n_scnum != 0) - addend = - sym->n_value; - else - addend = 0; - - switch (rel->r_type) - { - case 17: howto = &howto_rellong; break; - case 25: howto = &howto_iprmed; break; - case 27: howto = &howto_optcall; break; - default: - bfd_set_error (bfd_error_bad_value); - return false; - } - - val = 0; - - if (h == NULL) - { - asection *sec; - - if (symndx == -1) - { - sec = bfd_abs_section_ptr; - val = 0; - } - else - { - sec = sections[symndx]; - val = (sec->output_section->vma - + sec->output_offset - + sym->n_value - - sec->vma); - } - } - else - { - if (h->root.type == bfd_link_hash_defined - || h->root.type == bfd_link_hash_defweak) - { - asection *sec; - - sec = h->root.u.def.section; - val = (h->root.u.def.value - + sec->output_section->vma - + sec->output_offset); - } - else if (! info->relocateable) - { - if (! ((*info->callbacks->undefined_symbol) - (info, h->root.root.string, input_bfd, input_section, - rel->r_vaddr - input_section->vma))) - return false; - } - } - - done = false; - - if (howto->type == R_OPTCALL && ! info->relocateable && symndx != -1) - { - int class; - - if (h != NULL) - class = h->class; - else - class = sym->n_sclass; - - switch (class) - { - case C_NULL: - /* This symbol is apparently not from a COFF input file. - We warn, and then assume that it is not a leaf - function. */ - if (! ((*info->callbacks->reloc_dangerous) - (info, - "uncertain calling convention for non-COFF symbol", - input_bfd, input_section, - rel->r_vaddr - input_section->vma))) - return false; - break; - case C_LEAFSTAT: - case C_LEAFEXT: - /* This is a call to a leaf procedure; use the bal - instruction. */ - { - long olf; - unsigned long word; - - if (h != NULL) - { - BFD_ASSERT (h->numaux == 2); - olf = h->aux[1].x_bal.x_balntry; - } - else - { - bfd_byte *esyms; - union internal_auxent aux; - - BFD_ASSERT (sym->n_numaux == 2); - esyms = (bfd_byte *) obj_coff_external_syms (input_bfd); - esyms += (symndx + 2) * bfd_coff_symesz (input_bfd); - bfd_coff_swap_aux_in (input_bfd, (PTR) esyms, sym->n_type, - sym->n_sclass, 1, sym->n_numaux, - (PTR) &aux); - olf = aux.x_bal.x_balntry; - } - - word = bfd_get_32 (input_bfd, - (contents - + (rel->r_vaddr - input_section->vma))); - word = ((word + olf - val) & BAL_MASK) | BAL; - bfd_put_32 (input_bfd, - word, - (contents - + (rel->r_vaddr - input_section->vma))); - done = true; - } - break; - case C_SCALL: - BFD_ASSERT (0); - break; - } - } - - if (! done) - { - if (howto->pc_relative) - addend += input_section->vma; - rstat = _bfd_final_link_relocate (howto, input_bfd, input_section, - contents, - rel->r_vaddr - input_section->vma, - val, addend); - } - - switch (rstat) - { - default: - abort (); - case bfd_reloc_ok: - break; - case bfd_reloc_overflow: - { - const char *name; - char buf[SYMNMLEN + 1]; - - if (symndx == -1) - name = "*ABS*"; - else if (h != NULL) - name = h->root.root.string; - else - { - name = _bfd_coff_internal_syment_name (input_bfd, sym, buf); - if (name == NULL) - return false; - } - - if (! ((*info->callbacks->reloc_overflow) - (info, name, howto->name, (bfd_vma) 0, input_bfd, - input_section, rel->r_vaddr - input_section->vma))) - return false; - } - } - } - - return true; -} - -/* Adjust the symbol index of any reloc against a global symbol to - instead be a reloc against the internal symbol we created specially - for the section. */ - -/*ARGSUSED*/ -static boolean -coff_i960_adjust_symndx (obfd, info, ibfd, sec, irel, adjustedp) - bfd *obfd; - struct bfd_link_info *info; - bfd *ibfd; - asection *sec; - struct internal_reloc *irel; - boolean *adjustedp; -{ - struct coff_link_hash_entry *h; - - *adjustedp = false; - - h = obj_coff_sym_hashes (ibfd)[irel->r_symndx]; - if (h == NULL - || (h->root.type != bfd_link_hash_defined - && h->root.type != bfd_link_hash_defweak)) - return true; - - irel->r_symndx = h->root.u.def.section->output_section->target_index - 1; - *adjustedp = true; - - return true; -} - -#define coff_start_final_link coff_i960_start_final_link - -#define coff_relocate_section coff_i960_relocate_section - -#define coff_adjust_symndx coff_i960_adjust_symndx - -#define coff_bfd_reloc_type_lookup coff_i960_reloc_type_lookup - -#include "coffcode.h" - -const bfd_target icoff_little_vec = -{ - "coff-Intel-little", /* name */ - bfd_target_coff_flavour, - BFD_ENDIAN_LITTLE, /* data byte order is little */ - BFD_ENDIAN_LITTLE, /* header byte order is little */ - - (HAS_RELOC | EXEC_P | /* object flags */ - HAS_LINENO | HAS_DEBUG | - HAS_SYMS | HAS_LOCALS | WP_TEXT), - - (SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD | SEC_RELOC), /* section flags */ - '_', /* leading underscore */ - '/', /* ar_pad_char */ - 15, /* ar_max_namelen */ - - bfd_getl64, bfd_getl_signed_64, bfd_putl64, - bfd_getl32, bfd_getl_signed_32, bfd_putl32, - bfd_getl16, bfd_getl_signed_16, bfd_putl16, /* data */ - bfd_getl64, bfd_getl_signed_64, bfd_putl64, - bfd_getl32, bfd_getl_signed_32, bfd_putl32, - bfd_getl16, bfd_getl_signed_16, bfd_putl16, /* hdrs */ - - {_bfd_dummy_target, coff_object_p, /* bfd_check_format */ - bfd_generic_archive_p, _bfd_dummy_target}, - {bfd_false, coff_mkobject, /* bfd_set_format */ - _bfd_generic_mkarchive, bfd_false}, - {bfd_false, coff_write_object_contents, /* bfd_write_contents */ - _bfd_write_archive_contents, bfd_false}, - - BFD_JUMP_TABLE_GENERIC (coff), - BFD_JUMP_TABLE_COPY (coff), - BFD_JUMP_TABLE_CORE (_bfd_nocore), - BFD_JUMP_TABLE_ARCHIVE (_bfd_archive_coff), - BFD_JUMP_TABLE_SYMBOLS (coff), - BFD_JUMP_TABLE_RELOCS (coff), - BFD_JUMP_TABLE_WRITE (coff), - BFD_JUMP_TABLE_LINK (coff), - BFD_JUMP_TABLE_DYNAMIC (_bfd_nodynamic), - - COFF_SWAP_TABLE, -}; - - -const bfd_target icoff_big_vec = -{ - "coff-Intel-big", /* name */ - bfd_target_coff_flavour, - BFD_ENDIAN_LITTLE, /* data byte order is little */ - BFD_ENDIAN_BIG, /* header byte order is big */ - - (HAS_RELOC | EXEC_P | /* object flags */ - HAS_LINENO | HAS_DEBUG | - HAS_SYMS | HAS_LOCALS | WP_TEXT), - - (SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD | SEC_RELOC), /* section flags */ - '_', /* leading underscore */ - '/', /* ar_pad_char */ - 15, /* ar_max_namelen */ - -bfd_getl64, bfd_getl_signed_64, bfd_putl64, - bfd_getl32, bfd_getl_signed_32, bfd_putl32, - bfd_getl16, bfd_getl_signed_16, bfd_putl16, /* data */ -bfd_getb64, bfd_getb_signed_64, bfd_putb64, - bfd_getb32, bfd_getb_signed_32, bfd_putb32, - bfd_getb16, bfd_getb_signed_16, bfd_putb16, /* hdrs */ - - {_bfd_dummy_target, coff_object_p, /* bfd_check_format */ - bfd_generic_archive_p, _bfd_dummy_target}, - {bfd_false, coff_mkobject, /* bfd_set_format */ - _bfd_generic_mkarchive, bfd_false}, - {bfd_false, coff_write_object_contents, /* bfd_write_contents */ - _bfd_write_archive_contents, bfd_false}, - - BFD_JUMP_TABLE_GENERIC (coff), - BFD_JUMP_TABLE_COPY (coff), - BFD_JUMP_TABLE_CORE (_bfd_nocore), - BFD_JUMP_TABLE_ARCHIVE (_bfd_archive_coff), - BFD_JUMP_TABLE_SYMBOLS (coff), - BFD_JUMP_TABLE_RELOCS (coff), - BFD_JUMP_TABLE_WRITE (coff), - BFD_JUMP_TABLE_LINK (coff), - BFD_JUMP_TABLE_DYNAMIC (_bfd_nodynamic), - - COFF_SWAP_TABLE, -}; diff --git a/contrib/gdb/bfd/coff-m68k.c b/contrib/gdb/bfd/coff-m68k.c deleted file mode 100644 index 77fb45b6d6403..0000000000000 --- a/contrib/gdb/bfd/coff-m68k.c +++ /dev/null @@ -1,203 +0,0 @@ -/* BFD back-end for Motorola 68000 COFF binaries. - Copyright 1990, 91, 92, 93, 94, 95, 1996 Free Software Foundation, Inc. - Written by Cygnus Support. - -This file is part of BFD, the Binary File Descriptor library. - -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 2 of the License, 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ - -#include "bfd.h" -#include "sysdep.h" -#include "libbfd.h" -#include "obstack.h" -#include "coff/m68k.h" -#include "coff/internal.h" -#include "libcoff.h" - -#ifndef LYNX_SPECIAL_FN -#define LYNX_SPECIAL_FN 0 -#endif - -#define COFF_DEFAULT_SECTION_ALIGNMENT_POWER (2) - -#ifndef COFF_PAGE_SIZE -/* The page size is a guess based on ELF. */ -#define COFF_PAGE_SIZE 0x2000 -#endif - -/* Clean up namespace. */ -#define m68kcoff_howto_table _bfd_m68kcoff_howto_table -#define m68k_rtype2howto _bfd_m68kcoff_rtype2howto -#define m68k_howto2rtype _bfd_m68kcoff_howto2rtype -#define m68k_reloc_type_lookup _bfd_m68kcoff_reloc_type_lookup - -#ifdef ONLY_DECLARE_RELOCS -extern reloc_howto_type m68kcoff_howto_table[]; -#else -reloc_howto_type m68kcoff_howto_table[] = -{ - HOWTO(R_RELBYTE, 0, 0, 8, false, 0, complain_overflow_bitfield, LYNX_SPECIAL_FN, "8", true, 0x000000ff,0x000000ff, false), - HOWTO(R_RELWORD, 0, 1, 16, false, 0, complain_overflow_bitfield, LYNX_SPECIAL_FN, "16", true, 0x0000ffff,0x0000ffff, false), - HOWTO(R_RELLONG, 0, 2, 32, false, 0, complain_overflow_bitfield, LYNX_SPECIAL_FN, "32", true, 0xffffffff,0xffffffff, false), - HOWTO(R_PCRBYTE, 0, 0, 8, true, 0, complain_overflow_signed, LYNX_SPECIAL_FN, "DISP8", true, 0x000000ff,0x000000ff, false), - HOWTO(R_PCRWORD, 0, 1, 16, true, 0, complain_overflow_signed, LYNX_SPECIAL_FN, "DISP16", true, 0x0000ffff,0x0000ffff, false), - HOWTO(R_PCRLONG, 0, 2, 32, true, 0, complain_overflow_signed, LYNX_SPECIAL_FN, "DISP32", true, 0xffffffff,0xffffffff, false), - HOWTO(R_RELLONG_NEG, 0, -2, 32, false, 0, complain_overflow_bitfield, LYNX_SPECIAL_FN, "-32", true, 0xffffffff,0xffffffff, false), -}; -#endif /* not ONLY_DECLARE_RELOCS */ - -#ifndef BADMAG -#define BADMAG(x) M68KBADMAG(x) -#endif -#define M68 1 /* Customize coffcode.h */ - -/* Turn a howto into a reloc number */ - -#ifdef ONLY_DECLARE_RELOCS -extern void m68k_rtype2howto PARAMS ((arelent *internal, int relocentry)); -extern int m68k_howto2rtype PARAMS ((reloc_howto_type *)); -extern reloc_howto_type *m68k_reloc_type_lookup - PARAMS ((bfd *, bfd_reloc_code_real_type)); -#else -void -m68k_rtype2howto(internal, relocentry) - arelent *internal; - int relocentry; -{ - switch (relocentry) - { - case R_RELBYTE: internal->howto = m68kcoff_howto_table + 0; break; - case R_RELWORD: internal->howto = m68kcoff_howto_table + 1; break; - case R_RELLONG: internal->howto = m68kcoff_howto_table + 2; break; - case R_PCRBYTE: internal->howto = m68kcoff_howto_table + 3; break; - case R_PCRWORD: internal->howto = m68kcoff_howto_table + 4; break; - case R_PCRLONG: internal->howto = m68kcoff_howto_table + 5; break; - case R_RELLONG_NEG: internal->howto = m68kcoff_howto_table + 6; break; - } -} - -int -m68k_howto2rtype (internal) - reloc_howto_type *internal; -{ - if (internal->pc_relative) - { - switch (internal->bitsize) - { - case 32: return R_PCRLONG; - case 16: return R_PCRWORD; - case 8: return R_PCRBYTE; - } - } - else - { - switch (internal->bitsize) - { - case 32: return R_RELLONG; - case 16: return R_RELWORD; - case 8: return R_RELBYTE; - } - } - return R_RELLONG; -} - -reloc_howto_type * -m68k_reloc_type_lookup (abfd, code) - bfd *abfd; - bfd_reloc_code_real_type code; -{ - switch (code) - { - default: return NULL; - case BFD_RELOC_8: return m68kcoff_howto_table + 0; - case BFD_RELOC_16: return m68kcoff_howto_table + 1; - case BFD_RELOC_CTOR: - case BFD_RELOC_32: return m68kcoff_howto_table + 2; - case BFD_RELOC_8_PCREL: return m68kcoff_howto_table + 3; - case BFD_RELOC_16_PCREL: return m68kcoff_howto_table + 4; - case BFD_RELOC_32_PCREL: return m68kcoff_howto_table + 5; - /* FIXME: There doesn't seem to be a code for R_RELLONG_NEG. */ - } - /*NOTREACHED*/ -} - -#endif /* not ONLY_DECLARE_RELOCS */ - -#define RTYPE2HOWTO(internal, relocentry) \ - m68k_rtype2howto(internal, (relocentry)->r_type) - -#define SELECT_RELOC(external, internal) \ - external.r_type = m68k_howto2rtype(internal); - -#define coff_bfd_reloc_type_lookup m68k_reloc_type_lookup - -#define coff_relocate_section _bfd_coff_generic_relocate_section - -#include "coffcode.h" - -const bfd_target -#ifdef TARGET_SYM - TARGET_SYM = -#else - m68kcoff_vec = -#endif -{ -#ifdef TARGET_NAME - TARGET_NAME, -#else - "coff-m68k", /* name */ -#endif - bfd_target_coff_flavour, - BFD_ENDIAN_BIG, /* data byte order is big */ - BFD_ENDIAN_BIG, /* header byte order is big */ - - (HAS_RELOC | EXEC_P | /* object flags */ - HAS_LINENO | HAS_DEBUG | - HAS_SYMS | HAS_LOCALS | WP_TEXT | D_PAGED), - - (SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD | SEC_RELOC), /* section flags */ -#ifdef NAMES_HAVE_UNDERSCORE - '_', -#else - 0, /* leading underscore */ -#endif - '/', /* ar_pad_char */ - 15, /* ar_max_namelen */ - bfd_getb64, bfd_getb_signed_64, bfd_putb64, - bfd_getb32, bfd_getb_signed_32, bfd_putb32, - bfd_getb16, bfd_getb_signed_16, bfd_putb16, /* data */ - bfd_getb64, bfd_getb_signed_64, bfd_putb64, - bfd_getb32, bfd_getb_signed_32, bfd_putb32, - bfd_getb16, bfd_getb_signed_16, bfd_putb16, /* hdrs */ - - {_bfd_dummy_target, coff_object_p, /* bfd_check_format */ - bfd_generic_archive_p, _bfd_dummy_target}, - {bfd_false, coff_mkobject, _bfd_generic_mkarchive, /* bfd_set_format */ - bfd_false}, - {bfd_false, coff_write_object_contents, /* bfd_write_contents */ - _bfd_write_archive_contents, bfd_false}, - - BFD_JUMP_TABLE_GENERIC (coff), - BFD_JUMP_TABLE_COPY (coff), - BFD_JUMP_TABLE_CORE (_bfd_nocore), - BFD_JUMP_TABLE_ARCHIVE (_bfd_archive_coff), - BFD_JUMP_TABLE_SYMBOLS (coff), - BFD_JUMP_TABLE_RELOCS (coff), - BFD_JUMP_TABLE_WRITE (coff), - BFD_JUMP_TABLE_LINK (coff), - BFD_JUMP_TABLE_DYNAMIC (_bfd_nodynamic), - - COFF_SWAP_TABLE - }; diff --git a/contrib/gdb/bfd/coff-m88k.c b/contrib/gdb/bfd/coff-m88k.c deleted file mode 100644 index 414106d7bcb08..0000000000000 --- a/contrib/gdb/bfd/coff-m88k.c +++ /dev/null @@ -1,311 +0,0 @@ -/* BFD back-end for Motorola 88000 COFF "Binary Compatability Standard" files. - Copyright 1990, 1991, 1992, 1993, 1994 Free Software Foundation, Inc. - Written by Cygnus Support. - -This file is part of BFD, the Binary File Descriptor library. - -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 2 of the License, 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ - -#define M88 1 /* Customize various include files */ -#include "bfd.h" -#include "sysdep.h" -#include "libbfd.h" -#include "obstack.h" -#include "coff/m88k.h" -#include "coff/internal.h" -#include "libcoff.h" - -static bfd_reloc_status_type m88k_special_reloc - PARAMS ((bfd *, arelent *, asymbol *, PTR, asection *, bfd *, char **)); -static void rtype2howto PARAMS ((arelent *, struct internal_reloc *)); -static void reloc_processing - PARAMS ((arelent *, struct internal_reloc *, asymbol **, bfd *, asection *)); - -#define COFF_DEFAULT_SECTION_ALIGNMENT_POWER (3) - -static bfd_reloc_status_type -m88k_special_reloc (abfd, reloc_entry, symbol, data, - input_section, output_bfd, error_message) - bfd *abfd; - arelent *reloc_entry; - asymbol *symbol; - PTR data; - asection *input_section; - bfd *output_bfd; - char **error_message; -{ - reloc_howto_type *howto = reloc_entry->howto; - - switch (howto->type) - { - case R_HVRT16: - case R_LVRT16: - if (output_bfd != (bfd *) NULL) - { - /* This is a partial relocation, and we want to apply the - relocation to the reloc entry rather than the raw data. - Modify the reloc inplace to reflect what we now know. */ - - reloc_entry->address += input_section->output_offset; - } - else - { - bfd_vma output_base = 0; - bfd_vma addr = reloc_entry->address; - bfd_vma x = bfd_get_16 (abfd, (bfd_byte *) data + addr); - asection *reloc_target_output_section; - long relocation = 0; - - /* Work out which section the relocation is targetted at and the - initial relocation command value. */ - - /* Get symbol value. (Common symbols are special.) */ - if (bfd_is_com_section (symbol->section)) - relocation = 0; - else - relocation = symbol->value; - - reloc_target_output_section = symbol->section->output_section; - - /* Convert input-section-relative symbol value to absolute. */ - if (output_bfd) - output_base = 0; - else - output_base = reloc_target_output_section->vma; - - relocation += output_base + symbol->section->output_offset; - - /* Add in supplied addend. */ - relocation += ((reloc_entry->addend << howto->bitsize) + x); - - reloc_entry->addend = 0; - - relocation >>= (bfd_vma) howto->rightshift; - - /* Shift everything up to where it's going to be used */ - - relocation <<= (bfd_vma) howto->bitpos; - - if (relocation) - bfd_put_16 (abfd, relocation, (unsigned char *) data + addr); - } - - return bfd_reloc_ok; - break; - - default: - if (output_bfd != (bfd *) NULL) - { - /* This is a partial relocation, and we want to apply the - relocation to the reloc entry rather than the raw data. - Modify the reloc inplace to reflect what we now know. */ - - reloc_entry->address += input_section->output_offset; - return bfd_reloc_ok; - } - break; - } - - if (output_bfd == (bfd *) NULL) - return bfd_reloc_continue; - - return bfd_reloc_ok; -} - -static reloc_howto_type howto_table[] = -{ - HOWTO (R_PCR16L, /* type */ - 02, /* rightshift */ - 1, /* size (0 = byte, 1 = short, 2 = long) */ - 16, /* bitsize */ - true, /* pc_relative */ - 0, /* bitpos */ - complain_overflow_signed, /* complain_on_overflow */ - m88k_special_reloc, /* special_function */ - "PCR16L", /* name */ - false, /* partial_inplace */ - 0x0000ffff, /* src_mask */ - 0x0000ffff, /* dst_mask */ - true), /* pcrel_offset */ - - HOWTO (R_PCR26L, /* type */ - 02, /* rightshift */ - 2, /* size (0 = byte, 1 = short, 2 = long) */ - 26, /* bitsize */ - true, /* pc_relative */ - 0, /* bitpos */ - complain_overflow_signed, /* complain_on_overflow */ - m88k_special_reloc, /* special_function */ - "PCR26L", /* name */ - false, /* partial_inplace */ - 0x03ffffff, /* src_mask */ - 0x03ffffff, /* dst_mask */ - true), /* pcrel_offset */ - - HOWTO (R_VRT16, /* type */ - 00, /* rightshift */ - 1, /* size (0 = byte, 1 = short, 2 = long) */ - 16, /* bitsize */ - false, /* pc_relative */ - 0, /* bitpos */ - complain_overflow_bitfield, /* complain_on_overflow */ - m88k_special_reloc, /* special_function */ - "VRT16", /* name */ - false, /* partial_inplace */ - 0x0000ffff, /* src_mask */ - 0x0000ffff, /* dst_mask */ - true), /* pcrel_offset */ - - HOWTO (R_HVRT16, /* type */ - 16, /* rightshift */ - 1, /* size (0 = byte, 1 = short, 2 = long) */ - 16, /* bitsize */ - false, /* pc_relative */ - 0, /* bitpos */ - complain_overflow_dont, /* complain_on_overflow */ - m88k_special_reloc, /* special_function */ - "HVRT16", /* name */ - false, /* partial_inplace */ - 0x0000ffff, /* src_mask */ - 0x0000ffff, /* dst_mask */ - true), /* pcrel_offset */ - - HOWTO (R_LVRT16, /* type */ - 00, /* rightshift */ - 1, /* size (0 = byte, 1 = short, 2 = long) */ - 16, /* bitsize */ - false, /* pc_relative */ - 0, /* bitpos */ - complain_overflow_dont, /* complain_on_overflow */ - m88k_special_reloc, /* special_function */ - "LVRT16", /* name */ - false, /* partial_inplace */ - 0x0000ffff, /* src_mask */ - 0x0000ffff, /* dst_mask */ - true), /* pcrel_offset */ - - HOWTO (R_VRT32, /* type */ - 00, /* rightshift */ - 2, /* size (0 = byte, 1 = short, 2 = long) */ - 32, /* bitsize */ - false, /* pc_relative */ - 0, /* bitpos */ - complain_overflow_bitfield, /* complain_on_overflow */ - m88k_special_reloc, /* special_function */ - "VRT32", /* name */ - false, /* partial_inplace */ - 0xffffffff, /* src_mask */ - 0xffffffff, /* dst_mask */ - true), /* pcrel_offset */ -}; - -/* Code to turn an external r_type into a pointer to an entry in the - above howto table. */ -static void -rtype2howto (cache_ptr, dst) - arelent *cache_ptr; - struct internal_reloc *dst; -{ - if (dst->r_type >= R_PCR16L && dst->r_type <= R_VRT32) - { - cache_ptr->howto = howto_table + dst->r_type - R_PCR16L; - } - else - { - BFD_ASSERT (0); - } -} - -#define RTYPE2HOWTO(cache_ptr, dst) rtype2howto (cache_ptr, dst) - - -/* Code to swap in the reloc offset */ -#define SWAP_IN_RELOC_OFFSET bfd_h_get_16 -#define SWAP_OUT_RELOC_OFFSET bfd_h_put_16 - - -#define RELOC_PROCESSING(relent,reloc,symbols,abfd,section) \ - reloc_processing(relent, reloc, symbols, abfd, section) - -static void -reloc_processing (relent, reloc, symbols, abfd, section) - arelent *relent; - struct internal_reloc *reloc; - asymbol **symbols; - bfd *abfd; - asection *section; -{ - relent->address = reloc->r_vaddr; - rtype2howto (relent, reloc); - - if (((int) reloc->r_symndx) > 0) - { - relent->sym_ptr_ptr = symbols + obj_convert (abfd)[reloc->r_symndx]; - } - else - { - relent->sym_ptr_ptr = bfd_abs_section_ptr->symbol_ptr_ptr; - } - - relent->addend = reloc->r_offset; - relent->address -= section->vma; -} - -#define BADMAG(x) MC88BADMAG(x) -#include "coffcode.h" - -#undef coff_write_armap - -const bfd_target m88kbcs_vec = -{ - "coff-m88kbcs", /* name */ - bfd_target_coff_flavour, - BFD_ENDIAN_BIG, /* data byte order is big */ - BFD_ENDIAN_BIG, /* header byte order is big */ - - (HAS_RELOC | EXEC_P | /* object flags */ - HAS_LINENO | HAS_DEBUG | - HAS_SYMS | HAS_LOCALS | WP_TEXT), - - (SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD | SEC_RELOC), /* section flags */ - '_', /* leading underscore */ - '/', /* ar_pad_char */ - 15, /* ar_max_namelen */ - bfd_getb64, bfd_getb_signed_64, bfd_putb64, - bfd_getb32, bfd_getb_signed_32, bfd_putb32, - bfd_getb16, bfd_getb_signed_16, bfd_putb16, /* data */ - bfd_getb64, bfd_getb_signed_64, bfd_putb64, - bfd_getb32, bfd_getb_signed_32, bfd_putb32, - bfd_getb16, bfd_getb_signed_16, bfd_putb16, /* hdrs */ - - {_bfd_dummy_target, coff_object_p, /* bfd_check_format */ - bfd_generic_archive_p, _bfd_dummy_target}, - {bfd_false, coff_mkobject, _bfd_generic_mkarchive, /* bfd_set_format */ - bfd_false}, - {bfd_false, coff_write_object_contents, /* bfd_write_contents */ - _bfd_write_archive_contents, bfd_false}, - - BFD_JUMP_TABLE_GENERIC (coff), - BFD_JUMP_TABLE_COPY (coff), - BFD_JUMP_TABLE_CORE (_bfd_nocore), - BFD_JUMP_TABLE_ARCHIVE (_bfd_archive_coff), - BFD_JUMP_TABLE_SYMBOLS (coff), - BFD_JUMP_TABLE_RELOCS (coff), - BFD_JUMP_TABLE_WRITE (coff), - BFD_JUMP_TABLE_LINK (coff), - BFD_JUMP_TABLE_DYNAMIC (_bfd_nodynamic), - - COFF_SWAP_TABLE, -}; diff --git a/contrib/gdb/bfd/coff-mips.c b/contrib/gdb/bfd/coff-mips.c deleted file mode 100644 index c860f9a4d5396..0000000000000 --- a/contrib/gdb/bfd/coff-mips.c +++ /dev/null @@ -1,2596 +0,0 @@ -/* BFD back-end for MIPS Extended-Coff files. - Copyright 1990, 91, 92, 93, 94, 95, 1996 Free Software Foundation, Inc. - Original version by Per Bothner. - Full support added by Ian Lance Taylor, ian@cygnus.com. - -This file is part of BFD, the Binary File Descriptor library. - -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 2 of the License, 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ - -#include "bfd.h" -#include "sysdep.h" -#include "bfdlink.h" -#include "libbfd.h" -#include "coff/internal.h" -#include "coff/sym.h" -#include "coff/symconst.h" -#include "coff/ecoff.h" -#include "coff/mips.h" -#include "libcoff.h" -#include "libecoff.h" - -/* Prototypes for static functions. */ - -static boolean mips_ecoff_bad_format_hook PARAMS ((bfd *abfd, PTR filehdr)); -static void mips_ecoff_swap_reloc_in PARAMS ((bfd *, PTR, - struct internal_reloc *)); -static void mips_ecoff_swap_reloc_out PARAMS ((bfd *, - const struct internal_reloc *, - PTR)); -static void mips_adjust_reloc_in PARAMS ((bfd *, - const struct internal_reloc *, - arelent *)); -static void mips_adjust_reloc_out PARAMS ((bfd *, const arelent *, - struct internal_reloc *)); -static bfd_reloc_status_type mips_generic_reloc PARAMS ((bfd *abfd, - arelent *reloc, - asymbol *symbol, - PTR data, - asection *section, - bfd *output_bfd, - char **error)); -static bfd_reloc_status_type mips_refhi_reloc PARAMS ((bfd *abfd, - arelent *reloc, - asymbol *symbol, - PTR data, - asection *section, - bfd *output_bfd, - char **error)); -static bfd_reloc_status_type mips_reflo_reloc PARAMS ((bfd *abfd, - arelent *reloc, - asymbol *symbol, - PTR data, - asection *section, - bfd *output_bfd, - char **error)); -static bfd_reloc_status_type mips_gprel_reloc PARAMS ((bfd *abfd, - arelent *reloc, - asymbol *symbol, - PTR data, - asection *section, - bfd *output_bfd, - char **error)); -static bfd_reloc_status_type mips_relhi_reloc PARAMS ((bfd *abfd, - arelent *reloc, - asymbol *symbol, - PTR data, - asection *section, - bfd *output_bfd, - char **error)); -static bfd_reloc_status_type mips_rello_reloc PARAMS ((bfd *abfd, - arelent *reloc, - asymbol *symbol, - PTR data, - asection *section, - bfd *output_bfd, - char **error)); -static bfd_reloc_status_type mips_switch_reloc PARAMS ((bfd *abfd, - arelent *reloc, - asymbol *symbol, - PTR data, - asection *section, - bfd *output_bfd, - char **error)); -static void mips_relocate_hi PARAMS ((struct internal_reloc *refhi, - struct internal_reloc *reflo, - bfd *input_bfd, - asection *input_section, - bfd_byte *contents, - size_t adjust, - bfd_vma relocation, - boolean pcrel)); -static boolean mips_relocate_section PARAMS ((bfd *, struct bfd_link_info *, - bfd *, asection *, - bfd_byte *, PTR)); -static boolean mips_read_relocs PARAMS ((bfd *, asection *)); -static boolean mips_relax_section PARAMS ((bfd *, asection *, - struct bfd_link_info *, - boolean *)); -static boolean mips_relax_pcrel16 PARAMS ((struct bfd_link_info *, bfd *, - asection *, - struct ecoff_link_hash_entry *, - bfd_byte *, bfd_vma)); - -/* ECOFF has COFF sections, but the debugging information is stored in - a completely different format. ECOFF targets use some of the - swapping routines from coffswap.h, and some of the generic COFF - routines in coffgen.c, but, unlike the real COFF targets, do not - use coffcode.h itself. - - Get the generic COFF swapping routines, except for the reloc, - symbol, and lineno ones. Give them ECOFF names. */ -#define MIPSECOFF -#define NO_COFF_RELOCS -#define NO_COFF_SYMBOLS -#define NO_COFF_LINENOS -#define coff_swap_filehdr_in mips_ecoff_swap_filehdr_in -#define coff_swap_filehdr_out mips_ecoff_swap_filehdr_out -#define coff_swap_aouthdr_in mips_ecoff_swap_aouthdr_in -#define coff_swap_aouthdr_out mips_ecoff_swap_aouthdr_out -#define coff_swap_scnhdr_in mips_ecoff_swap_scnhdr_in -#define coff_swap_scnhdr_out mips_ecoff_swap_scnhdr_out -#include "coffswap.h" - -/* Get the ECOFF swapping routines. */ -#define ECOFF_32 -#include "ecoffswap.h" - -/* How to process the various relocs types. */ - -static reloc_howto_type mips_howto_table[] = -{ - /* Reloc type 0 is ignored. The reloc reading code ensures that - this is a reference to the .abs section, which will cause - bfd_perform_relocation to do nothing. */ - HOWTO (MIPS_R_IGNORE, /* type */ - 0, /* rightshift */ - 0, /* size (0 = byte, 1 = short, 2 = long) */ - 8, /* bitsize */ - false, /* pc_relative */ - 0, /* bitpos */ - complain_overflow_dont, /* complain_on_overflow */ - 0, /* special_function */ - "IGNORE", /* name */ - false, /* partial_inplace */ - 0, /* src_mask */ - 0, /* dst_mask */ - false), /* pcrel_offset */ - - /* A 16 bit reference to a symbol, normally from a data section. */ - HOWTO (MIPS_R_REFHALF, /* type */ - 0, /* rightshift */ - 1, /* size (0 = byte, 1 = short, 2 = long) */ - 16, /* bitsize */ - false, /* pc_relative */ - 0, /* bitpos */ - complain_overflow_bitfield, /* complain_on_overflow */ - mips_generic_reloc, /* special_function */ - "REFHALF", /* name */ - true, /* partial_inplace */ - 0xffff, /* src_mask */ - 0xffff, /* dst_mask */ - false), /* pcrel_offset */ - - /* A 32 bit reference to a symbol, normally from a data section. */ - HOWTO (MIPS_R_REFWORD, /* type */ - 0, /* rightshift */ - 2, /* size (0 = byte, 1 = short, 2 = long) */ - 32, /* bitsize */ - false, /* pc_relative */ - 0, /* bitpos */ - complain_overflow_bitfield, /* complain_on_overflow */ - mips_generic_reloc, /* special_function */ - "REFWORD", /* name */ - true, /* partial_inplace */ - 0xffffffff, /* src_mask */ - 0xffffffff, /* dst_mask */ - false), /* pcrel_offset */ - - /* A 26 bit absolute jump address. */ - HOWTO (MIPS_R_JMPADDR, /* type */ - 2, /* rightshift */ - 2, /* size (0 = byte, 1 = short, 2 = long) */ - 26, /* bitsize */ - false, /* pc_relative */ - 0, /* bitpos */ - complain_overflow_dont, /* complain_on_overflow */ - /* This needs complex overflow - detection, because the upper four - bits must match the PC. */ - mips_generic_reloc, /* special_function */ - "JMPADDR", /* name */ - true, /* partial_inplace */ - 0x3ffffff, /* src_mask */ - 0x3ffffff, /* dst_mask */ - false), /* pcrel_offset */ - - /* The high 16 bits of a symbol value. Handled by the function - mips_refhi_reloc. */ - HOWTO (MIPS_R_REFHI, /* type */ - 16, /* rightshift */ - 2, /* size (0 = byte, 1 = short, 2 = long) */ - 16, /* bitsize */ - false, /* pc_relative */ - 0, /* bitpos */ - complain_overflow_bitfield, /* complain_on_overflow */ - mips_refhi_reloc, /* special_function */ - "REFHI", /* name */ - true, /* partial_inplace */ - 0xffff, /* src_mask */ - 0xffff, /* dst_mask */ - false), /* pcrel_offset */ - - /* The low 16 bits of a symbol value. */ - HOWTO (MIPS_R_REFLO, /* type */ - 0, /* rightshift */ - 2, /* size (0 = byte, 1 = short, 2 = long) */ - 16, /* bitsize */ - false, /* pc_relative */ - 0, /* bitpos */ - complain_overflow_dont, /* complain_on_overflow */ - mips_reflo_reloc, /* special_function */ - "REFLO", /* name */ - true, /* partial_inplace */ - 0xffff, /* src_mask */ - 0xffff, /* dst_mask */ - false), /* pcrel_offset */ - - /* A reference to an offset from the gp register. Handled by the - function mips_gprel_reloc. */ - HOWTO (MIPS_R_GPREL, /* type */ - 0, /* rightshift */ - 2, /* size (0 = byte, 1 = short, 2 = long) */ - 16, /* bitsize */ - false, /* pc_relative */ - 0, /* bitpos */ - complain_overflow_signed, /* complain_on_overflow */ - mips_gprel_reloc, /* special_function */ - "GPREL", /* name */ - true, /* partial_inplace */ - 0xffff, /* src_mask */ - 0xffff, /* dst_mask */ - false), /* pcrel_offset */ - - /* A reference to a literal using an offset from the gp register. - Handled by the function mips_gprel_reloc. */ - HOWTO (MIPS_R_LITERAL, /* type */ - 0, /* rightshift */ - 2, /* size (0 = byte, 1 = short, 2 = long) */ - 16, /* bitsize */ - false, /* pc_relative */ - 0, /* bitpos */ - complain_overflow_signed, /* complain_on_overflow */ - mips_gprel_reloc, /* special_function */ - "LITERAL", /* name */ - true, /* partial_inplace */ - 0xffff, /* src_mask */ - 0xffff, /* dst_mask */ - false), /* pcrel_offset */ - - { 8 }, - { 9 }, - { 10 }, - { 11 }, - - /* This reloc is a Cygnus extension used when generating position - independent code for embedded systems. It represents a 16 bit PC - relative reloc rightshifted twice as used in the MIPS branch - instructions. */ - HOWTO (MIPS_R_PCREL16, /* type */ - 2, /* rightshift */ - 2, /* size (0 = byte, 1 = short, 2 = long) */ - 16, /* bitsize */ - true, /* pc_relative */ - 0, /* bitpos */ - complain_overflow_signed, /* complain_on_overflow */ - mips_generic_reloc, /* special_function */ - "PCREL16", /* name */ - true, /* partial_inplace */ - 0xffff, /* src_mask */ - 0xffff, /* dst_mask */ - true), /* pcrel_offset */ - - /* This reloc is a Cygnus extension used when generating position - independent code for embedded systems. It represents the high 16 - bits of a PC relative reloc. The next reloc must be - MIPS_R_RELLO, and the addend is formed from the addends of the - two instructions, just as in MIPS_R_REFHI and MIPS_R_REFLO. The - final value is actually PC relative to the location of the - MIPS_R_RELLO reloc, not the MIPS_R_RELHI reloc. */ - HOWTO (MIPS_R_RELHI, /* type */ - 16, /* rightshift */ - 2, /* size (0 = byte, 1 = short, 2 = long) */ - 16, /* bitsize */ - true, /* pc_relative */ - 0, /* bitpos */ - complain_overflow_bitfield, /* complain_on_overflow */ - mips_relhi_reloc, /* special_function */ - "RELHI", /* name */ - true, /* partial_inplace */ - 0xffff, /* src_mask */ - 0xffff, /* dst_mask */ - true), /* pcrel_offset */ - - /* This reloc is a Cygnus extension used when generating position - independent code for embedded systems. It represents the low 16 - bits of a PC relative reloc. */ - HOWTO (MIPS_R_RELLO, /* type */ - 0, /* rightshift */ - 2, /* size (0 = byte, 1 = short, 2 = long) */ - 16, /* bitsize */ - true, /* pc_relative */ - 0, /* bitpos */ - complain_overflow_dont, /* complain_on_overflow */ - mips_rello_reloc, /* special_function */ - "RELLO", /* name */ - true, /* partial_inplace */ - 0xffff, /* src_mask */ - 0xffff, /* dst_mask */ - true), /* pcrel_offset */ - - { 15 }, - { 16 }, - { 17 }, - { 18 }, - { 19 }, - { 20 }, - { 21 }, - - /* This reloc is a Cygnus extension used when generating position - independent code for embedded systems. It represents an entry in - a switch table, which is the difference between two symbols in - the .text section. The symndx is actually the offset from the - reloc address to the subtrahend. See include/coff/mips.h for - more details. */ - HOWTO (MIPS_R_SWITCH, /* type */ - 0, /* rightshift */ - 2, /* size (0 = byte, 1 = short, 2 = long) */ - 32, /* bitsize */ - true, /* pc_relative */ - 0, /* bitpos */ - complain_overflow_dont, /* complain_on_overflow */ - mips_switch_reloc, /* special_function */ - "SWITCH", /* name */ - true, /* partial_inplace */ - 0xffffffff, /* src_mask */ - 0xffffffff, /* dst_mask */ - true) /* pcrel_offset */ -}; - -#define MIPS_HOWTO_COUNT \ - (sizeof mips_howto_table / sizeof mips_howto_table[0]) - -/* When the linker is doing relaxing, it may change a external PCREL16 - reloc. This typically represents an instruction like - bal foo - We change it to - .set noreorder - bal $L1 - lui $at,%hi(foo - $L1) - $L1: - addiu $at,%lo(foo - $L1) - addu $at,$at,$31 - jalr $at - PCREL16_EXPANSION_ADJUSTMENT is the number of bytes this changes the - instruction by. */ - -#define PCREL16_EXPANSION_ADJUSTMENT (4 * 4) - -/* See whether the magic number matches. */ - -static boolean -mips_ecoff_bad_format_hook (abfd, filehdr) - bfd *abfd; - PTR filehdr; -{ - struct internal_filehdr *internal_f = (struct internal_filehdr *) filehdr; - - switch (internal_f->f_magic) - { - case MIPS_MAGIC_1: - /* I don't know what endianness this implies. */ - return true; - - case MIPS_MAGIC_BIG: - case MIPS_MAGIC_BIG2: - case MIPS_MAGIC_BIG3: - return bfd_big_endian (abfd); - - case MIPS_MAGIC_LITTLE: - case MIPS_MAGIC_LITTLE2: - case MIPS_MAGIC_LITTLE3: - return bfd_little_endian (abfd); - - default: - return false; - } -} - -/* Reloc handling. MIPS ECOFF relocs are packed into 8 bytes in - external form. They use a bit which indicates whether the symbol - is external. */ - -/* Swap a reloc in. */ - -static void -mips_ecoff_swap_reloc_in (abfd, ext_ptr, intern) - bfd *abfd; - PTR ext_ptr; - struct internal_reloc *intern; -{ - const RELOC *ext = (RELOC *) ext_ptr; - - intern->r_vaddr = bfd_h_get_32 (abfd, (bfd_byte *) ext->r_vaddr); - if (bfd_header_big_endian (abfd)) - { - intern->r_symndx = (((int) ext->r_bits[0] - << RELOC_BITS0_SYMNDX_SH_LEFT_BIG) - | ((int) ext->r_bits[1] - << RELOC_BITS1_SYMNDX_SH_LEFT_BIG) - | ((int) ext->r_bits[2] - << RELOC_BITS2_SYMNDX_SH_LEFT_BIG)); - intern->r_type = ((ext->r_bits[3] & RELOC_BITS3_TYPE_BIG) - >> RELOC_BITS3_TYPE_SH_BIG); - intern->r_extern = (ext->r_bits[3] & RELOC_BITS3_EXTERN_BIG) != 0; - } - else - { - intern->r_symndx = (((int) ext->r_bits[0] - << RELOC_BITS0_SYMNDX_SH_LEFT_LITTLE) - | ((int) ext->r_bits[1] - << RELOC_BITS1_SYMNDX_SH_LEFT_LITTLE) - | ((int) ext->r_bits[2] - << RELOC_BITS2_SYMNDX_SH_LEFT_LITTLE)); - intern->r_type = (((ext->r_bits[3] & RELOC_BITS3_TYPE_LITTLE) - >> RELOC_BITS3_TYPE_SH_LITTLE) - | ((ext->r_bits[3] & RELOC_BITS3_TYPEHI_LITTLE) - << RELOC_BITS3_TYPEHI_SH_LITTLE)); - intern->r_extern = (ext->r_bits[3] & RELOC_BITS3_EXTERN_LITTLE) != 0; - } - - /* If this is a MIPS_R_SWITCH reloc, or an internal MIPS_R_RELHI or - MIPS_R_RELLO reloc, r_symndx is actually the offset from the - reloc address to the base of the difference (see - include/coff/mips.h for more details). We copy symndx into the - r_offset field so as not to confuse ecoff_slurp_reloc_table in - ecoff.c. In adjust_reloc_in we then copy r_offset into the reloc - addend. */ - if (intern->r_type == MIPS_R_SWITCH - || (! intern->r_extern - && (intern->r_type == MIPS_R_RELLO - || intern->r_type == MIPS_R_RELHI))) - { - BFD_ASSERT (! intern->r_extern); - intern->r_offset = intern->r_symndx; - if (intern->r_offset & 0x800000) - intern->r_offset -= 0x1000000; - intern->r_symndx = RELOC_SECTION_TEXT; - } -} - -/* Swap a reloc out. */ - -static void -mips_ecoff_swap_reloc_out (abfd, intern, dst) - bfd *abfd; - const struct internal_reloc *intern; - PTR dst; -{ - RELOC *ext = (RELOC *) dst; - long r_symndx; - - BFD_ASSERT (intern->r_extern - || (intern->r_symndx >= 0 && intern->r_symndx <= 12)); - - /* If this is a MIPS_R_SWITCH reloc, or an internal MIPS_R_RELLO or - MIPS_R_RELHI reloc, we actually want to write the contents of - r_offset out as the symbol index. This undoes the change made by - mips_ecoff_swap_reloc_in. */ - if (intern->r_type != MIPS_R_SWITCH - && (intern->r_extern - || (intern->r_type != MIPS_R_RELHI - && intern->r_type != MIPS_R_RELLO))) - r_symndx = intern->r_symndx; - else - { - BFD_ASSERT (intern->r_symndx == RELOC_SECTION_TEXT); - r_symndx = intern->r_offset & 0xffffff; - } - - bfd_h_put_32 (abfd, intern->r_vaddr, (bfd_byte *) ext->r_vaddr); - if (bfd_header_big_endian (abfd)) - { - ext->r_bits[0] = r_symndx >> RELOC_BITS0_SYMNDX_SH_LEFT_BIG; - ext->r_bits[1] = r_symndx >> RELOC_BITS1_SYMNDX_SH_LEFT_BIG; - ext->r_bits[2] = r_symndx >> RELOC_BITS2_SYMNDX_SH_LEFT_BIG; - ext->r_bits[3] = (((intern->r_type << RELOC_BITS3_TYPE_SH_BIG) - & RELOC_BITS3_TYPE_BIG) - | (intern->r_extern ? RELOC_BITS3_EXTERN_BIG : 0)); - } - else - { - ext->r_bits[0] = r_symndx >> RELOC_BITS0_SYMNDX_SH_LEFT_LITTLE; - ext->r_bits[1] = r_symndx >> RELOC_BITS1_SYMNDX_SH_LEFT_LITTLE; - ext->r_bits[2] = r_symndx >> RELOC_BITS2_SYMNDX_SH_LEFT_LITTLE; - ext->r_bits[3] = (((intern->r_type << RELOC_BITS3_TYPE_SH_LITTLE) - & RELOC_BITS3_TYPE_LITTLE) - | ((intern->r_type >> RELOC_BITS3_TYPEHI_SH_LITTLE - & RELOC_BITS3_TYPEHI_LITTLE)) - | (intern->r_extern ? RELOC_BITS3_EXTERN_LITTLE : 0)); - } -} - -/* Finish canonicalizing a reloc. Part of this is generic to all - ECOFF targets, and that part is in ecoff.c. The rest is done in - this backend routine. It must fill in the howto field. */ - -static void -mips_adjust_reloc_in (abfd, intern, rptr) - bfd *abfd; - const struct internal_reloc *intern; - arelent *rptr; -{ - if (intern->r_type > MIPS_R_SWITCH) - abort (); - - if (! intern->r_extern - && (intern->r_type == MIPS_R_GPREL - || intern->r_type == MIPS_R_LITERAL)) - rptr->addend += ecoff_data (abfd)->gp; - - /* If the type is MIPS_R_IGNORE, make sure this is a reference to - the absolute section so that the reloc is ignored. */ - if (intern->r_type == MIPS_R_IGNORE) - rptr->sym_ptr_ptr = bfd_abs_section_ptr->symbol_ptr_ptr; - - /* If this is a MIPS_R_SWITCH reloc, or an internal MIPS_R_RELHI or - MIPS_R_RELLO reloc, we want the addend field of the BFD relocto - hold the value which was originally in the symndx field of the - internal MIPS ECOFF reloc. This value was copied into - intern->r_offset by mips_swap_reloc_in, and here we copy it into - the addend field. */ - if (intern->r_type == MIPS_R_SWITCH - || (! intern->r_extern - && (intern->r_type == MIPS_R_RELHI - || intern->r_type == MIPS_R_RELLO))) - rptr->addend = intern->r_offset; - - rptr->howto = &mips_howto_table[intern->r_type]; -} - -/* Make any adjustments needed to a reloc before writing it out. None - are needed for MIPS. */ - -static void -mips_adjust_reloc_out (abfd, rel, intern) - bfd *abfd; - const arelent *rel; - struct internal_reloc *intern; -{ - /* For a MIPS_R_SWITCH reloc, or an internal MIPS_R_RELHI or - MIPS_R_RELLO reloc, we must copy rel->addend into - intern->r_offset. This will then be written out as the symbol - index by mips_ecoff_swap_reloc_out. This operation parallels the - action of mips_adjust_reloc_in. */ - if (intern->r_type == MIPS_R_SWITCH - || (! intern->r_extern - && (intern->r_type == MIPS_R_RELHI - || intern->r_type == MIPS_R_RELLO))) - intern->r_offset = rel->addend; -} - -/* ECOFF relocs are either against external symbols, or against - sections. If we are producing relocateable output, and the reloc - is against an external symbol, and nothing has given us any - additional addend, the resulting reloc will also be against the - same symbol. In such a case, we don't want to change anything - about the way the reloc is handled, since it will all be done at - final link time. Rather than put special case code into - bfd_perform_relocation, all the reloc types use this howto - function. It just short circuits the reloc if producing - relocateable output against an external symbol. */ - -static bfd_reloc_status_type -mips_generic_reloc (abfd, - reloc_entry, - symbol, - data, - input_section, - output_bfd, - error_message) - bfd *abfd; - arelent *reloc_entry; - asymbol *symbol; - PTR data; - asection *input_section; - bfd *output_bfd; - char **error_message; -{ - if (output_bfd != (bfd *) NULL - && (symbol->flags & BSF_SECTION_SYM) == 0 - && reloc_entry->addend == 0) - { - reloc_entry->address += input_section->output_offset; - return bfd_reloc_ok; - } - - return bfd_reloc_continue; -} - -/* Do a REFHI relocation. This has to be done in combination with a - REFLO reloc, because there is a carry from the REFLO to the REFHI. - Here we just save the information we need; we do the actual - relocation when we see the REFLO. MIPS ECOFF requires that the - REFLO immediately follow the REFHI, so this ought to work. */ - -static bfd_byte *mips_refhi_addr; -static bfd_vma mips_refhi_addend; - -static bfd_reloc_status_type -mips_refhi_reloc (abfd, - reloc_entry, - symbol, - data, - input_section, - output_bfd, - error_message) - bfd *abfd; - arelent *reloc_entry; - asymbol *symbol; - PTR data; - asection *input_section; - bfd *output_bfd; - char **error_message; -{ - bfd_reloc_status_type ret; - bfd_vma relocation; - - /* If we're relocating, and this an external symbol, we don't want - to change anything. */ - if (output_bfd != (bfd *) NULL - && (symbol->flags & BSF_SECTION_SYM) == 0 - && reloc_entry->addend == 0) - { - reloc_entry->address += input_section->output_offset; - return bfd_reloc_ok; - } - - ret = bfd_reloc_ok; - if (bfd_is_und_section (symbol->section) - && output_bfd == (bfd *) NULL) - ret = bfd_reloc_undefined; - - if (bfd_is_com_section (symbol->section)) - relocation = 0; - else - relocation = symbol->value; - - relocation += symbol->section->output_section->vma; - relocation += symbol->section->output_offset; - relocation += reloc_entry->addend; - - if (reloc_entry->address > input_section->_cooked_size) - return bfd_reloc_outofrange; - - /* Save the information, and let REFLO do the actual relocation. */ - mips_refhi_addr = (bfd_byte *) data + reloc_entry->address; - mips_refhi_addend = relocation; - - if (output_bfd != (bfd *) NULL) - reloc_entry->address += input_section->output_offset; - - return ret; -} - -/* Do a REFLO relocation. This is a straightforward 16 bit inplace - relocation; this function exists in order to do the REFHI - relocation described above. */ - -static bfd_reloc_status_type -mips_reflo_reloc (abfd, - reloc_entry, - symbol, - data, - input_section, - output_bfd, - error_message) - bfd *abfd; - arelent *reloc_entry; - asymbol *symbol; - PTR data; - asection *input_section; - bfd *output_bfd; - char **error_message; -{ - if (mips_refhi_addr != (bfd_byte *) NULL) - { - unsigned long insn; - unsigned long val; - unsigned long vallo; - - /* Do the REFHI relocation. Note that we actually don't need to - know anything about the REFLO itself, except where to find - the low 16 bits of the addend needed by the REFHI. */ - insn = bfd_get_32 (abfd, mips_refhi_addr); - vallo = (bfd_get_32 (abfd, (bfd_byte *) data + reloc_entry->address) - & 0xffff); - val = ((insn & 0xffff) << 16) + vallo; - val += mips_refhi_addend; - - /* The low order 16 bits are always treated as a signed value. - Therefore, a negative value in the low order bits requires an - adjustment in the high order bits. We need to make this - adjustment in two ways: once for the bits we took from the - data, and once for the bits we are putting back in to the - data. */ - if ((vallo & 0x8000) != 0) - val -= 0x10000; - if ((val & 0x8000) != 0) - val += 0x10000; - - insn = (insn &~ 0xffff) | ((val >> 16) & 0xffff); - bfd_put_32 (abfd, insn, mips_refhi_addr); - - mips_refhi_addr = (bfd_byte *) NULL; - } - - /* Now do the REFLO reloc in the usual way. */ - return mips_generic_reloc (abfd, reloc_entry, symbol, data, - input_section, output_bfd, error_message); -} - -/* Do a GPREL relocation. This is a 16 bit value which must become - the offset from the gp register. */ - -static bfd_reloc_status_type -mips_gprel_reloc (abfd, - reloc_entry, - symbol, - data, - input_section, - output_bfd, - error_message) - bfd *abfd; - arelent *reloc_entry; - asymbol *symbol; - PTR data; - asection *input_section; - bfd *output_bfd; - char **error_message; -{ - boolean relocateable; - bfd_vma gp; - bfd_vma relocation; - unsigned long val; - unsigned long insn; - - /* If we're relocating, and this is an external symbol with no - addend, we don't want to change anything. We will only have an - addend if this is a newly created reloc, not read from an ECOFF - file. */ - if (output_bfd != (bfd *) NULL - && (symbol->flags & BSF_SECTION_SYM) == 0 - && reloc_entry->addend == 0) - { - reloc_entry->address += input_section->output_offset; - return bfd_reloc_ok; - } - - if (output_bfd != (bfd *) NULL) - relocateable = true; - else - { - relocateable = false; - output_bfd = symbol->section->output_section->owner; - } - - if (bfd_is_und_section (symbol->section) - && relocateable == false) - return bfd_reloc_undefined; - - /* We have to figure out the gp value, so that we can adjust the - symbol value correctly. We look up the symbol _gp in the output - BFD. If we can't find it, we're stuck. We cache it in the ECOFF - target data. We don't need to adjust the symbol value for an - external symbol if we are producing relocateable output. */ - gp = _bfd_get_gp_value (output_bfd); - if (gp == 0 - && (relocateable == false - || (symbol->flags & BSF_SECTION_SYM) != 0)) - { - if (relocateable != false) - { - /* Make up a value. */ - gp = symbol->section->output_section->vma + 0x4000; - _bfd_set_gp_value (output_bfd, gp); - } - else - { - unsigned int count; - asymbol **sym; - unsigned int i; - - count = bfd_get_symcount (output_bfd); - sym = bfd_get_outsymbols (output_bfd); - - if (sym == (asymbol **) NULL) - i = count; - else - { - for (i = 0; i < count; i++, sym++) - { - register CONST char *name; - - name = bfd_asymbol_name (*sym); - if (*name == '_' && strcmp (name, "_gp") == 0) - { - gp = bfd_asymbol_value (*sym); - _bfd_set_gp_value (output_bfd, gp); - break; - } - } - } - - if (i >= count) - { - /* Only get the error once. */ - gp = 4; - _bfd_set_gp_value (output_bfd, gp); - *error_message = - (char *) "GP relative relocation when _gp not defined"; - return bfd_reloc_dangerous; - } - } - } - - if (bfd_is_com_section (symbol->section)) - relocation = 0; - else - relocation = symbol->value; - - relocation += symbol->section->output_section->vma; - relocation += symbol->section->output_offset; - - if (reloc_entry->address > input_section->_cooked_size) - return bfd_reloc_outofrange; - - insn = bfd_get_32 (abfd, (bfd_byte *) data + reloc_entry->address); - - /* Set val to the offset into the section or symbol. */ - val = ((insn & 0xffff) + reloc_entry->addend) & 0xffff; - if (val & 0x8000) - val -= 0x10000; - - /* Adjust val for the final section location and GP value. If we - are producing relocateable output, we don't want to do this for - an external symbol. */ - if (relocateable == false - || (symbol->flags & BSF_SECTION_SYM) != 0) - val += relocation - gp; - - insn = (insn &~ 0xffff) | (val & 0xffff); - bfd_put_32 (abfd, insn, (bfd_byte *) data + reloc_entry->address); - - if (relocateable != false) - reloc_entry->address += input_section->output_offset; - - /* Make sure it fit in 16 bits. */ - if (val >= 0x8000 && val < 0xffff8000) - return bfd_reloc_overflow; - - return bfd_reloc_ok; -} - -/* Do a RELHI relocation. We do this in conjunction with a RELLO - reloc, just as REFHI and REFLO are done together. RELHI and RELLO - are Cygnus extensions used when generating position independent - code for embedded systems. */ - -static bfd_byte *mips_relhi_addr; -static bfd_vma mips_relhi_addend; - -static bfd_reloc_status_type -mips_relhi_reloc (abfd, - reloc_entry, - symbol, - data, - input_section, - output_bfd, - error_message) - bfd *abfd; - arelent *reloc_entry; - asymbol *symbol; - PTR data; - asection *input_section; - bfd *output_bfd; - char **error_message; -{ - bfd_reloc_status_type ret; - bfd_vma relocation; - - /* If this is a reloc against a section symbol, then it is correct - in the object file. The only time we want to change this case is - when we are relaxing, and that is handled entirely by - mips_relocate_section and never calls this function. */ - if ((symbol->flags & BSF_SECTION_SYM) != 0) - { - if (output_bfd != (bfd *) NULL) - reloc_entry->address += input_section->output_offset; - return bfd_reloc_ok; - } - - /* This is an external symbol. If we're relocating, we don't want - to change anything. */ - if (output_bfd != (bfd *) NULL) - { - reloc_entry->address += input_section->output_offset; - return bfd_reloc_ok; - } - - ret = bfd_reloc_ok; - if (bfd_is_und_section (symbol->section) - && output_bfd == (bfd *) NULL) - ret = bfd_reloc_undefined; - - if (bfd_is_com_section (symbol->section)) - relocation = 0; - else - relocation = symbol->value; - - relocation += symbol->section->output_section->vma; - relocation += symbol->section->output_offset; - relocation += reloc_entry->addend; - - if (reloc_entry->address > input_section->_cooked_size) - return bfd_reloc_outofrange; - - /* Save the information, and let RELLO do the actual relocation. */ - mips_relhi_addr = (bfd_byte *) data + reloc_entry->address; - mips_relhi_addend = relocation; - - if (output_bfd != (bfd *) NULL) - reloc_entry->address += input_section->output_offset; - - return ret; -} - -/* Do a RELLO relocation. This is a straightforward 16 bit PC - relative relocation; this function exists in order to do the RELHI - relocation described above. */ - -static bfd_reloc_status_type -mips_rello_reloc (abfd, - reloc_entry, - symbol, - data, - input_section, - output_bfd, - error_message) - bfd *abfd; - arelent *reloc_entry; - asymbol *symbol; - PTR data; - asection *input_section; - bfd *output_bfd; - char **error_message; -{ - if (mips_relhi_addr != (bfd_byte *) NULL) - { - unsigned long insn; - unsigned long val; - unsigned long vallo; - - /* Do the RELHI relocation. Note that we actually don't need to - know anything about the RELLO itself, except where to find - the low 16 bits of the addend needed by the RELHI. */ - insn = bfd_get_32 (abfd, mips_relhi_addr); - vallo = (bfd_get_32 (abfd, (bfd_byte *) data + reloc_entry->address) - & 0xffff); - val = ((insn & 0xffff) << 16) + vallo; - val += mips_relhi_addend; - - /* If the symbol is defined, make val PC relative. If the - symbol is not defined we don't want to do this, because we - don't want the value in the object file to incorporate the - address of the reloc. */ - if (! bfd_is_und_section (bfd_get_section (symbol)) - && ! bfd_is_com_section (bfd_get_section (symbol))) - val -= (input_section->output_section->vma - + input_section->output_offset - + reloc_entry->address); - - /* The low order 16 bits are always treated as a signed value. - Therefore, a negative value in the low order bits requires an - adjustment in the high order bits. We need to make this - adjustment in two ways: once for the bits we took from the - data, and once for the bits we are putting back in to the - data. */ - if ((vallo & 0x8000) != 0) - val -= 0x10000; - if ((val & 0x8000) != 0) - val += 0x10000; - - insn = (insn &~ 0xffff) | ((val >> 16) & 0xffff); - bfd_put_32 (abfd, insn, mips_relhi_addr); - - mips_relhi_addr = (bfd_byte *) NULL; - } - - /* If this is a reloc against a section symbol, then it is correct - in the object file. The only time we want to change this case is - when we are relaxing, and that is handled entirely by - mips_relocate_section and never calls this function. */ - if ((symbol->flags & BSF_SECTION_SYM) != 0) - { - if (output_bfd != (bfd *) NULL) - reloc_entry->address += input_section->output_offset; - return bfd_reloc_ok; - } - - /* bfd_perform_relocation does not handle pcrel_offset relocations - correctly when generating a relocateable file, so handle them - directly here. */ - if (output_bfd != (bfd *) NULL) - { - reloc_entry->address += input_section->output_offset; - return bfd_reloc_ok; - } - - /* Now do the RELLO reloc in the usual way. */ - return mips_generic_reloc (abfd, reloc_entry, symbol, data, - input_section, output_bfd, error_message); -} - -/* This is the special function for the MIPS_R_SWITCH reloc. This - special reloc is normally correct in the object file, and only - requires special handling when relaxing. We don't want - bfd_perform_relocation to tamper with it at all. */ - -/*ARGSUSED*/ -static bfd_reloc_status_type -mips_switch_reloc (abfd, - reloc_entry, - symbol, - data, - input_section, - output_bfd, - error_message) - bfd *abfd; - arelent *reloc_entry; - asymbol *symbol; - PTR data; - asection *input_section; - bfd *output_bfd; - char **error_message; -{ - return bfd_reloc_ok; -} - -/* Get the howto structure for a generic reloc type. */ - -static reloc_howto_type * -mips_bfd_reloc_type_lookup (abfd, code) - bfd *abfd; - bfd_reloc_code_real_type code; -{ - int mips_type; - - switch (code) - { - case BFD_RELOC_16: - mips_type = MIPS_R_REFHALF; - break; - case BFD_RELOC_32: - case BFD_RELOC_CTOR: - mips_type = MIPS_R_REFWORD; - break; - case BFD_RELOC_MIPS_JMP: - mips_type = MIPS_R_JMPADDR; - break; - case BFD_RELOC_HI16_S: - mips_type = MIPS_R_REFHI; - break; - case BFD_RELOC_LO16: - mips_type = MIPS_R_REFLO; - break; - case BFD_RELOC_MIPS_GPREL: - mips_type = MIPS_R_GPREL; - break; - case BFD_RELOC_MIPS_LITERAL: - mips_type = MIPS_R_LITERAL; - break; - case BFD_RELOC_16_PCREL_S2: - mips_type = MIPS_R_PCREL16; - break; - case BFD_RELOC_PCREL_HI16_S: - mips_type = MIPS_R_RELHI; - break; - case BFD_RELOC_PCREL_LO16: - mips_type = MIPS_R_RELLO; - break; - case BFD_RELOC_GPREL32: - mips_type = MIPS_R_SWITCH; - break; - default: - return (reloc_howto_type *) NULL; - } - - return &mips_howto_table[mips_type]; -} - -/* A helper routine for mips_relocate_section which handles the REFHI - and RELHI relocations. The REFHI relocation must be followed by a - REFLO relocation (and RELHI by a RELLO), and the addend used is - formed from the addends of both instructions. */ - -static void -mips_relocate_hi (refhi, reflo, input_bfd, input_section, contents, adjust, - relocation, pcrel) - struct internal_reloc *refhi; - struct internal_reloc *reflo; - bfd *input_bfd; - asection *input_section; - bfd_byte *contents; - size_t adjust; - bfd_vma relocation; - boolean pcrel; -{ - unsigned long insn; - unsigned long val; - unsigned long vallo; - - insn = bfd_get_32 (input_bfd, - contents + adjust + refhi->r_vaddr - input_section->vma); - vallo = (bfd_get_32 (input_bfd, - contents + adjust + reflo->r_vaddr - input_section->vma) - & 0xffff); - val = ((insn & 0xffff) << 16) + vallo; - val += relocation; - - /* The low order 16 bits are always treated as a signed value. - Therefore, a negative value in the low order bits requires an - adjustment in the high order bits. We need to make this - adjustment in two ways: once for the bits we took from the data, - and once for the bits we are putting back in to the data. */ - if ((vallo & 0x8000) != 0) - val -= 0x10000; - - if (pcrel) - val -= (input_section->output_section->vma - + input_section->output_offset - + (reflo->r_vaddr - input_section->vma + adjust)); - - if ((val & 0x8000) != 0) - val += 0x10000; - - insn = (insn &~ 0xffff) | ((val >> 16) & 0xffff); - bfd_put_32 (input_bfd, (bfd_vma) insn, - contents + adjust + refhi->r_vaddr - input_section->vma); -} - -/* Relocate a section while linking a MIPS ECOFF file. */ - -static boolean -mips_relocate_section (output_bfd, info, input_bfd, input_section, - contents, external_relocs) - bfd *output_bfd; - struct bfd_link_info *info; - bfd *input_bfd; - asection *input_section; - bfd_byte *contents; - PTR external_relocs; -{ - asection **symndx_to_section; - struct ecoff_link_hash_entry **sym_hashes; - bfd_vma gp; - boolean gp_undefined; - size_t adjust; - long *offsets; - struct external_reloc *ext_rel; - struct external_reloc *ext_rel_end; - unsigned int i; - boolean got_lo; - struct internal_reloc lo_int_rel; - - BFD_ASSERT (input_bfd->xvec->header_byteorder - == output_bfd->xvec->header_byteorder); - - /* We keep a table mapping the symndx found in an internal reloc to - the appropriate section. This is faster than looking up the - section by name each time. */ - symndx_to_section = ecoff_data (input_bfd)->symndx_to_section; - if (symndx_to_section == (asection **) NULL) - { - symndx_to_section = ((asection **) - bfd_alloc (input_bfd, - (NUM_RELOC_SECTIONS - * sizeof (asection *)))); - if (!symndx_to_section) - return false; - - symndx_to_section[RELOC_SECTION_NONE] = NULL; - symndx_to_section[RELOC_SECTION_TEXT] = - bfd_get_section_by_name (input_bfd, ".text"); - symndx_to_section[RELOC_SECTION_RDATA] = - bfd_get_section_by_name (input_bfd, ".rdata"); - symndx_to_section[RELOC_SECTION_DATA] = - bfd_get_section_by_name (input_bfd, ".data"); - symndx_to_section[RELOC_SECTION_SDATA] = - bfd_get_section_by_name (input_bfd, ".sdata"); - symndx_to_section[RELOC_SECTION_SBSS] = - bfd_get_section_by_name (input_bfd, ".sbss"); - symndx_to_section[RELOC_SECTION_BSS] = - bfd_get_section_by_name (input_bfd, ".bss"); - symndx_to_section[RELOC_SECTION_INIT] = - bfd_get_section_by_name (input_bfd, ".init"); - symndx_to_section[RELOC_SECTION_LIT8] = - bfd_get_section_by_name (input_bfd, ".lit8"); - symndx_to_section[RELOC_SECTION_LIT4] = - bfd_get_section_by_name (input_bfd, ".lit4"); - symndx_to_section[RELOC_SECTION_XDATA] = NULL; - symndx_to_section[RELOC_SECTION_PDATA] = NULL; - symndx_to_section[RELOC_SECTION_FINI] = - bfd_get_section_by_name (input_bfd, ".fini"); - symndx_to_section[RELOC_SECTION_LITA] = NULL; - symndx_to_section[RELOC_SECTION_ABS] = NULL; - - ecoff_data (input_bfd)->symndx_to_section = symndx_to_section; - } - - sym_hashes = ecoff_data (input_bfd)->sym_hashes; - - gp = _bfd_get_gp_value (output_bfd); - if (gp == 0) - gp_undefined = true; - else - gp_undefined = false; - - got_lo = false; - - adjust = 0; - - if (ecoff_section_data (input_bfd, input_section) == NULL) - offsets = NULL; - else - offsets = ecoff_section_data (input_bfd, input_section)->offsets; - - ext_rel = (struct external_reloc *) external_relocs; - ext_rel_end = ext_rel + input_section->reloc_count; - for (i = 0; ext_rel < ext_rel_end; ext_rel++, i++) - { - struct internal_reloc int_rel; - bfd_vma addend; - reloc_howto_type *howto; - struct ecoff_link_hash_entry *h = NULL; - asection *s = NULL; - bfd_vma relocation; - bfd_reloc_status_type r; - - if (! got_lo) - mips_ecoff_swap_reloc_in (input_bfd, (PTR) ext_rel, &int_rel); - else - { - int_rel = lo_int_rel; - got_lo = false; - } - - BFD_ASSERT (int_rel.r_type - < sizeof mips_howto_table / sizeof mips_howto_table[0]); - - /* The REFHI and RELHI relocs requires special handling. they - must be followed by a REFLO or RELLO reloc, respectively, and - the addend is formed from both relocs. */ - if (int_rel.r_type == MIPS_R_REFHI - || int_rel.r_type == MIPS_R_RELHI) - { - BFD_ASSERT ((ext_rel + 1) < ext_rel_end); - mips_ecoff_swap_reloc_in (input_bfd, (PTR) (ext_rel + 1), - &lo_int_rel); - BFD_ASSERT ((lo_int_rel.r_type - == (int_rel.r_type == MIPS_R_REFHI - ? MIPS_R_REFLO - : MIPS_R_RELLO)) - && int_rel.r_extern == lo_int_rel.r_extern - && int_rel.r_symndx == lo_int_rel.r_symndx); - got_lo = true; - } - - howto = &mips_howto_table[int_rel.r_type]; - - /* The SWITCH reloc must be handled specially. This reloc is - marks the location of a difference between two portions of an - object file. The symbol index does not reference a symbol, - but is actually the offset from the reloc to the subtrahend - of the difference. This reloc is correct in the object file, - and needs no further adjustment, unless we are relaxing. If - we are relaxing, we may have to add in an offset. Since no - symbols are involved in this reloc, we handle it completely - here. */ - if (int_rel.r_type == MIPS_R_SWITCH) - { - if (offsets != NULL - && offsets[i] != 0) - { - r = _bfd_relocate_contents (howto, input_bfd, - (bfd_vma) offsets[i], - (contents - + adjust - + int_rel.r_vaddr - - input_section->vma)); - BFD_ASSERT (r == bfd_reloc_ok); - } - - continue; - } - - if (int_rel.r_extern) - { - h = sym_hashes[int_rel.r_symndx]; - /* If h is NULL, that means that there is a reloc against an - external symbol which we thought was just a debugging - symbol. This should not happen. */ - if (h == (struct ecoff_link_hash_entry *) NULL) - abort (); - } - else - { - if (int_rel.r_symndx < 0 || int_rel.r_symndx >= NUM_RELOC_SECTIONS) - s = NULL; - else - s = symndx_to_section[int_rel.r_symndx]; - - if (s == (asection *) NULL) - abort (); - } - - /* The GPREL reloc uses an addend: the difference in the GP - values. */ - if (int_rel.r_type != MIPS_R_GPREL - && int_rel.r_type != MIPS_R_LITERAL) - addend = 0; - else - { - if (gp_undefined) - { - if (! ((*info->callbacks->reloc_dangerous) - (info, "GP relative relocation when GP not defined", - input_bfd, input_section, - int_rel.r_vaddr - input_section->vma))) - return false; - /* Only give the error once per link. */ - gp = 4; - _bfd_set_gp_value (output_bfd, gp); - gp_undefined = false; - } - if (! int_rel.r_extern) - { - /* This is a relocation against a section. The current - addend in the instruction is the difference between - INPUT_SECTION->vma and the GP value of INPUT_BFD. We - must change this to be the difference between the - final definition (which will end up in RELOCATION) - and the GP value of OUTPUT_BFD (which is in GP). */ - addend = ecoff_data (input_bfd)->gp - gp; - } - else if (! info->relocateable - || h->root.type == bfd_link_hash_defined - || h->root.type == bfd_link_hash_defweak) - { - /* This is a relocation against a defined symbol. The - current addend in the instruction is simply the - desired offset into the symbol (normally zero). We - are going to change this into a relocation against a - defined symbol, so we want the instruction to hold - the difference between the final definition of the - symbol (which will end up in RELOCATION) and the GP - value of OUTPUT_BFD (which is in GP). */ - addend = - gp; - } - else - { - /* This is a relocation against an undefined or common - symbol. The current addend in the instruction is - simply the desired offset into the symbol (normally - zero). We are generating relocateable output, and we - aren't going to define this symbol, so we just leave - the instruction alone. */ - addend = 0; - } - } - - /* If we are relaxing, mips_relax_section may have set - offsets[i] to some value. A value of 1 means we must expand - a PC relative branch into a multi-instruction of sequence, - and any other value is an addend. */ - if (offsets != NULL - && offsets[i] != 0) - { - BFD_ASSERT (! info->relocateable); - BFD_ASSERT (int_rel.r_type == MIPS_R_PCREL16 - || int_rel.r_type == MIPS_R_RELHI - || int_rel.r_type == MIPS_R_RELLO); - if (offsets[i] != 1) - addend += offsets[i]; - else - { - bfd_byte *here; - - BFD_ASSERT (int_rel.r_extern - && int_rel.r_type == MIPS_R_PCREL16); - - /* Move the rest of the instructions up. */ - here = (contents - + adjust - + int_rel.r_vaddr - - input_section->vma); - memmove (here + PCREL16_EXPANSION_ADJUSTMENT, here, - (size_t) (input_section->_raw_size - - (int_rel.r_vaddr - input_section->vma))); - - /* Generate the new instructions. */ - if (! mips_relax_pcrel16 (info, input_bfd, input_section, - h, here, - (input_section->output_section->vma - + input_section->output_offset - + (int_rel.r_vaddr - - input_section->vma) - + adjust))) - return false; - - /* We must adjust everything else up a notch. */ - adjust += PCREL16_EXPANSION_ADJUSTMENT; - - /* mips_relax_pcrel16 handles all the details of this - relocation. */ - continue; - } - } - - /* If we are relaxing, and this is a reloc against the .text - segment, we may need to adjust it if some branches have been - expanded. The reloc types which are likely to occur in the - .text section are handled efficiently by mips_relax_section, - and thus do not need to be handled here. */ - if (ecoff_data (input_bfd)->debug_info.adjust != NULL - && ! int_rel.r_extern - && int_rel.r_symndx == RELOC_SECTION_TEXT - && (strcmp (bfd_get_section_name (input_bfd, input_section), - ".text") != 0 - || (int_rel.r_type != MIPS_R_PCREL16 - && int_rel.r_type != MIPS_R_SWITCH - && int_rel.r_type != MIPS_R_RELHI - && int_rel.r_type != MIPS_R_RELLO))) - { - bfd_vma adr; - struct ecoff_value_adjust *a; - - /* We need to get the addend so that we know whether we need - to adjust the address. */ - BFD_ASSERT (int_rel.r_type == MIPS_R_REFWORD); - - adr = bfd_get_32 (input_bfd, - (contents - + adjust - + int_rel.r_vaddr - - input_section->vma)); - - for (a = ecoff_data (input_bfd)->debug_info.adjust; - a != (struct ecoff_value_adjust *) NULL; - a = a->next) - { - if (adr >= a->start && adr < a->end) - addend += a->adjust; - } - } - - if (info->relocateable) - { - /* We are generating relocateable output, and must convert - the existing reloc. */ - if (int_rel.r_extern) - { - if ((h->root.type == bfd_link_hash_defined - || h->root.type == bfd_link_hash_defweak) - && ! bfd_is_abs_section (h->root.u.def.section)) - { - const char *name; - - /* This symbol is defined in the output. Convert - the reloc from being against the symbol to being - against the section. */ - - /* Clear the r_extern bit. */ - int_rel.r_extern = 0; - - /* Compute a new r_symndx value. */ - s = h->root.u.def.section; - name = bfd_get_section_name (output_bfd, - s->output_section); - - int_rel.r_symndx = -1; - switch (name[1]) - { - case 'b': - if (strcmp (name, ".bss") == 0) - int_rel.r_symndx = RELOC_SECTION_BSS; - break; - case 'd': - if (strcmp (name, ".data") == 0) - int_rel.r_symndx = RELOC_SECTION_DATA; - break; - case 'f': - if (strcmp (name, ".fini") == 0) - int_rel.r_symndx = RELOC_SECTION_FINI; - break; - case 'i': - if (strcmp (name, ".init") == 0) - int_rel.r_symndx = RELOC_SECTION_INIT; - break; - case 'l': - if (strcmp (name, ".lit8") == 0) - int_rel.r_symndx = RELOC_SECTION_LIT8; - else if (strcmp (name, ".lit4") == 0) - int_rel.r_symndx = RELOC_SECTION_LIT4; - break; - case 'r': - if (strcmp (name, ".rdata") == 0) - int_rel.r_symndx = RELOC_SECTION_RDATA; - break; - case 's': - if (strcmp (name, ".sdata") == 0) - int_rel.r_symndx = RELOC_SECTION_SDATA; - else if (strcmp (name, ".sbss") == 0) - int_rel.r_symndx = RELOC_SECTION_SBSS; - break; - case 't': - if (strcmp (name, ".text") == 0) - int_rel.r_symndx = RELOC_SECTION_TEXT; - break; - } - - if (int_rel.r_symndx == -1) - abort (); - - /* Add the section VMA and the symbol value. */ - relocation = (h->root.u.def.value - + s->output_section->vma - + s->output_offset); - - /* For a PC relative relocation, the object file - currently holds just the addend. We must adjust - by the address to get the right value. */ - if (howto->pc_relative) - { - relocation -= int_rel.r_vaddr - input_section->vma; - - /* If we are converting a RELHI or RELLO reloc - from being against an external symbol to - being against a section, we must put a - special value into the r_offset field. This - value is the old addend. The r_offset for - both the RELOHI and RELLO relocs are the - same, and we set both when we see RELHI. */ - if (int_rel.r_type == MIPS_R_RELHI) - { - long addhi, addlo; - - addhi = bfd_get_32 (input_bfd, - (contents - + adjust - + int_rel.r_vaddr - - input_section->vma)); - addhi &= 0xffff; - if (addhi & 0x8000) - addhi -= 0x10000; - addhi <<= 16; - - addlo = bfd_get_32 (input_bfd, - (contents - + adjust - + lo_int_rel.r_vaddr - - input_section->vma)); - addlo &= 0xffff; - if (addlo & 0x8000) - addlo -= 0x10000; - - int_rel.r_offset = addhi + addlo; - lo_int_rel.r_offset = int_rel.r_offset; - } - } - - h = NULL; - } - else - { - /* Change the symndx value to the right one for the - output BFD. */ - int_rel.r_symndx = h->indx; - if (int_rel.r_symndx == -1) - { - /* This symbol is not being written out. */ - if (! ((*info->callbacks->unattached_reloc) - (info, h->root.root.string, input_bfd, - input_section, - int_rel.r_vaddr - input_section->vma))) - return false; - int_rel.r_symndx = 0; - } - relocation = 0; - } - } - else - { - /* This is a relocation against a section. Adjust the - value by the amount the section moved. */ - relocation = (s->output_section->vma - + s->output_offset - - s->vma); - } - - relocation += addend; - addend = 0; - - /* Adjust a PC relative relocation by removing the reference - to the original address in the section and including the - reference to the new address. However, external RELHI - and RELLO relocs are PC relative, but don't include any - reference to the address. The addend is merely an - addend. */ - if (howto->pc_relative - && (! int_rel.r_extern - || (int_rel.r_type != MIPS_R_RELHI - && int_rel.r_type != MIPS_R_RELLO))) - relocation -= (input_section->output_section->vma - + input_section->output_offset - - input_section->vma); - - /* Adjust the contents. */ - if (relocation == 0) - r = bfd_reloc_ok; - else - { - if (int_rel.r_type != MIPS_R_REFHI - && int_rel.r_type != MIPS_R_RELHI) - r = _bfd_relocate_contents (howto, input_bfd, relocation, - (contents - + adjust - + int_rel.r_vaddr - - input_section->vma)); - else - { - mips_relocate_hi (&int_rel, &lo_int_rel, - input_bfd, input_section, contents, - adjust, relocation, - int_rel.r_type == MIPS_R_RELHI); - r = bfd_reloc_ok; - } - } - - /* Adjust the reloc address. */ - int_rel.r_vaddr += (input_section->output_section->vma - + input_section->output_offset - - input_section->vma); - - /* Save the changed reloc information. */ - mips_ecoff_swap_reloc_out (input_bfd, &int_rel, (PTR) ext_rel); - } - else - { - /* We are producing a final executable. */ - if (int_rel.r_extern) - { - /* This is a reloc against a symbol. */ - if (h->root.type == bfd_link_hash_defined - || h->root.type == bfd_link_hash_defweak) - { - asection *hsec; - - hsec = h->root.u.def.section; - relocation = (h->root.u.def.value - + hsec->output_section->vma - + hsec->output_offset); - } - else - { - if (! ((*info->callbacks->undefined_symbol) - (info, h->root.root.string, input_bfd, - input_section, - int_rel.r_vaddr - input_section->vma))) - return false; - relocation = 0; - } - } - else - { - /* This is a reloc against a section. */ - relocation = (s->output_section->vma - + s->output_offset - - s->vma); - - /* A PC relative reloc is already correct in the object - file. Make it look like a pcrel_offset relocation by - adding in the start address. */ - if (howto->pc_relative) - { - if (int_rel.r_type != MIPS_R_RELHI) - relocation += int_rel.r_vaddr + adjust; - else - relocation += lo_int_rel.r_vaddr + adjust; - } - } - - if (int_rel.r_type != MIPS_R_REFHI - && int_rel.r_type != MIPS_R_RELHI) - r = _bfd_final_link_relocate (howto, - input_bfd, - input_section, - contents, - (int_rel.r_vaddr - - input_section->vma - + adjust), - relocation, - addend); - else - { - mips_relocate_hi (&int_rel, &lo_int_rel, input_bfd, - input_section, contents, adjust, - relocation, - int_rel.r_type == MIPS_R_RELHI); - r = bfd_reloc_ok; - } - } - - /* MIPS_R_JMPADDR requires peculiar overflow detection. The - instruction provides a 28 bit address (the two lower bits are - implicit zeroes) which is combined with the upper four bits - of the instruction address. */ - if (r == bfd_reloc_ok - && int_rel.r_type == MIPS_R_JMPADDR - && (((relocation - + addend - + (int_rel.r_extern ? 0 : s->vma)) - & 0xf0000000) - != ((input_section->output_section->vma - + input_section->output_offset - + (int_rel.r_vaddr - input_section->vma) - + adjust) - & 0xf0000000))) - r = bfd_reloc_overflow; - - if (r != bfd_reloc_ok) - { - switch (r) - { - default: - case bfd_reloc_outofrange: - abort (); - case bfd_reloc_overflow: - { - const char *name; - - if (int_rel.r_extern) - name = h->root.root.string; - else - name = bfd_section_name (input_bfd, s); - if (! ((*info->callbacks->reloc_overflow) - (info, name, howto->name, (bfd_vma) 0, - input_bfd, input_section, - int_rel.r_vaddr - input_section->vma))) - return false; - } - break; - } - } - } - - return true; -} - -/* Read in the relocs for a section. */ - -static boolean -mips_read_relocs (abfd, sec) - bfd *abfd; - asection *sec; -{ - struct ecoff_section_tdata *section_tdata; - - section_tdata = ecoff_section_data (abfd, sec); - if (section_tdata == (struct ecoff_section_tdata *) NULL) - { - sec->used_by_bfd = - (PTR) bfd_alloc_by_size_t (abfd, sizeof (struct ecoff_section_tdata)); - if (sec->used_by_bfd == NULL) - return false; - - section_tdata = ecoff_section_data (abfd, sec); - section_tdata->external_relocs = NULL; - section_tdata->contents = NULL; - section_tdata->offsets = NULL; - } - - if (section_tdata->external_relocs == NULL) - { - bfd_size_type external_relocs_size; - - external_relocs_size = (ecoff_backend (abfd)->external_reloc_size - * sec->reloc_count); - - section_tdata->external_relocs = - (PTR) bfd_alloc (abfd, external_relocs_size); - if (section_tdata->external_relocs == NULL && external_relocs_size != 0) - return false; - - if (bfd_seek (abfd, sec->rel_filepos, SEEK_SET) != 0 - || (bfd_read (section_tdata->external_relocs, 1, - external_relocs_size, abfd) - != external_relocs_size)) - return false; - } - - return true; -} - -/* Relax a section when linking a MIPS ECOFF file. This is used for - embedded PIC code, which always uses PC relative branches which - only have an 18 bit range on MIPS. If a branch is not in range, we - generate a long instruction sequence to compensate. Each time we - find a branch to expand, we have to check all the others again to - make sure they are still in range. This is slow, but it only has - to be done when -relax is passed to the linker. - - This routine figures out which branches need to expand; the actual - expansion is done in mips_relocate_section when the section - contents are relocated. The information is stored in the offsets - field of the ecoff_section_tdata structure. An offset of 1 means - that the branch must be expanded into a multi-instruction PC - relative branch (such an offset will only occur for a PC relative - branch to an external symbol). Any other offset must be a multiple - of four, and is the amount to change the branch by (such an offset - will only occur for a PC relative branch within the same section). - - We do not modify the section relocs or contents themselves so that - if memory usage becomes an issue we can discard them and read them - again. The only information we must save in memory between this - routine and the mips_relocate_section routine is the table of - offsets. */ - -static boolean -mips_relax_section (abfd, sec, info, again) - bfd *abfd; - asection *sec; - struct bfd_link_info *info; - boolean *again; -{ - struct ecoff_section_tdata *section_tdata; - bfd_byte *contents = NULL; - long *offsets; - struct external_reloc *ext_rel; - struct external_reloc *ext_rel_end; - unsigned int i; - - /* Assume we are not going to need another pass. */ - *again = false; - - /* If we are not generating an ECOFF file, this is much too - confusing to deal with. */ - if (info->hash->creator->flavour != bfd_get_flavour (abfd)) - return true; - - /* If there are no relocs, there is nothing to do. */ - if (sec->reloc_count == 0) - return true; - - /* We are only interested in PC relative relocs, and why would there - ever be one from anything but the .text section? */ - if (strcmp (bfd_get_section_name (abfd, sec), ".text") != 0) - return true; - - /* Read in the relocs, if we haven't already got them. */ - section_tdata = ecoff_section_data (abfd, sec); - if (section_tdata == (struct ecoff_section_tdata *) NULL - || section_tdata->external_relocs == NULL) - { - if (! mips_read_relocs (abfd, sec)) - goto error_return; - section_tdata = ecoff_section_data (abfd, sec); - } - - if (sec->_cooked_size == 0) - { - /* We must initialize _cooked_size only the first time we are - called. */ - sec->_cooked_size = sec->_raw_size; - } - - contents = section_tdata->contents; - offsets = section_tdata->offsets; - - /* Look for any external PC relative relocs. Internal PC relative - relocs are already correct in the object file, so they certainly - can not overflow. */ - ext_rel = (struct external_reloc *) section_tdata->external_relocs; - ext_rel_end = ext_rel + sec->reloc_count; - for (i = 0; ext_rel < ext_rel_end; ext_rel++, i++) - { - struct internal_reloc int_rel; - struct ecoff_link_hash_entry *h; - asection *hsec; - bfd_signed_vma relocation; - struct external_reloc *adj_ext_rel; - unsigned int adj_i; - unsigned long ext_count; - struct ecoff_link_hash_entry **adj_h_ptr; - struct ecoff_link_hash_entry **adj_h_ptr_end; - struct ecoff_value_adjust *adjust; - - /* If we have already expanded this reloc, we certainly don't - need to do it again. */ - if (offsets != (long *) NULL && offsets[i] == 1) - continue; - - /* Quickly check that this reloc is external PCREL16. */ - if (bfd_header_big_endian (abfd)) - { - if ((ext_rel->r_bits[3] & RELOC_BITS3_EXTERN_BIG) == 0 - || (((ext_rel->r_bits[3] & RELOC_BITS3_TYPE_BIG) - >> RELOC_BITS3_TYPE_SH_BIG) - != MIPS_R_PCREL16)) - continue; - } - else - { - if ((ext_rel->r_bits[3] & RELOC_BITS3_EXTERN_LITTLE) == 0 - || (((ext_rel->r_bits[3] & RELOC_BITS3_TYPE_LITTLE) - >> RELOC_BITS3_TYPE_SH_LITTLE) - != MIPS_R_PCREL16)) - continue; - } - - mips_ecoff_swap_reloc_in (abfd, (PTR) ext_rel, &int_rel); - - h = ecoff_data (abfd)->sym_hashes[int_rel.r_symndx]; - if (h == (struct ecoff_link_hash_entry *) NULL) - abort (); - - if (h->root.type != bfd_link_hash_defined - && h->root.type != bfd_link_hash_defweak) - { - /* Just ignore undefined symbols. These will presumably - generate an error later in the link. */ - continue; - } - - /* Get the value of the symbol. */ - hsec = h->root.u.def.section; - relocation = (h->root.u.def.value - + hsec->output_section->vma - + hsec->output_offset); - - /* Subtract out the current address. */ - relocation -= (sec->output_section->vma - + sec->output_offset - + (int_rel.r_vaddr - sec->vma)); - - /* The addend is stored in the object file. In the normal case - of ``bal symbol'', the addend will be -4. It will only be - different in the case of ``bal symbol+constant''. To avoid - always reading in the section contents, we don't check the - addend in the object file (we could easily check the contents - if we happen to have already read them in, but I fear that - this could be confusing). This means we will screw up if - there is a branch to a symbol that is in range, but added to - a constant which puts it out of range; in such a case the - link will fail with a reloc overflow error. Since the - compiler will never generate such code, it should be easy - enough to work around it by changing the assembly code in the - source file. */ - relocation -= 4; - - /* Now RELOCATION is the number we want to put in the object - file. See whether it fits. */ - if (relocation >= -0x20000 && relocation < 0x20000) - continue; - - /* Now that we know this reloc needs work, which will rarely - happen, go ahead and grab the section contents. */ - if (contents == (bfd_byte *) NULL) - { - if (info->keep_memory) - contents = (bfd_byte *) bfd_alloc (abfd, sec->_raw_size); - else - contents = (bfd_byte *) bfd_malloc ((size_t) sec->_raw_size); - if (contents == (bfd_byte *) NULL) - goto error_return; - if (! bfd_get_section_contents (abfd, sec, (PTR) contents, - (file_ptr) 0, sec->_raw_size)) - goto error_return; - if (info->keep_memory) - section_tdata->contents = contents; - } - - /* We only support changing the bal instruction. It would be - possible to handle other PC relative branches, but some of - them (the conditional branches) would require a different - length instruction sequence which would complicate both this - routine and mips_relax_pcrel16. It could be written if - somebody felt it were important. Ignoring this reloc will - presumably cause a reloc overflow error later on. */ - if (bfd_get_32 (abfd, contents + int_rel.r_vaddr - sec->vma) - != 0x0411ffff) /* bgezal $0,. == bal . */ - continue; - - /* Bother. We need to expand this reloc, and we will need to - make another relaxation pass since this change may put other - relocs out of range. We need to examine the local branches - and we need to allocate memory to hold the offsets we must - add to them. We also need to adjust the values of all - symbols in the object file following this location. */ - - sec->_cooked_size += PCREL16_EXPANSION_ADJUSTMENT; - *again = true; - - if (offsets == (long *) NULL) - { - size_t size; - - size = sec->reloc_count * sizeof (long); - offsets = (long *) bfd_alloc_by_size_t (abfd, size); - if (offsets == (long *) NULL) - goto error_return; - memset (offsets, 0, size); - section_tdata->offsets = offsets; - } - - offsets[i] = 1; - - /* Now look for all PC relative references that cross this reloc - and adjust their offsets. */ - adj_ext_rel = (struct external_reloc *) section_tdata->external_relocs; - for (adj_i = 0; adj_ext_rel < ext_rel_end; adj_ext_rel++, adj_i++) - { - struct internal_reloc adj_int_rel; - bfd_vma start, stop; - int change; - - mips_ecoff_swap_reloc_in (abfd, (PTR) adj_ext_rel, &adj_int_rel); - - if (adj_int_rel.r_type == MIPS_R_PCREL16) - { - unsigned long insn; - - /* We only care about local references. External ones - will be relocated correctly anyhow. */ - if (adj_int_rel.r_extern) - continue; - - /* We are only interested in a PC relative reloc within - this section. FIXME: Cross section PC relative - relocs may not be handled correctly; does anybody - care? */ - if (adj_int_rel.r_symndx != RELOC_SECTION_TEXT) - continue; - - start = adj_int_rel.r_vaddr; - - insn = bfd_get_32 (abfd, - contents + adj_int_rel.r_vaddr - sec->vma); - - stop = (insn & 0xffff) << 2; - if ((stop & 0x20000) != 0) - stop -= 0x40000; - stop += adj_int_rel.r_vaddr + 4; - } - else if (adj_int_rel.r_type == MIPS_R_RELHI) - { - struct internal_reloc rello; - long addhi, addlo; - - /* The next reloc must be MIPS_R_RELLO, and we handle - them together. */ - BFD_ASSERT (adj_ext_rel + 1 < ext_rel_end); - - mips_ecoff_swap_reloc_in (abfd, (PTR) (adj_ext_rel + 1), &rello); - - BFD_ASSERT (rello.r_type == MIPS_R_RELLO); - - addhi = bfd_get_32 (abfd, - contents + adj_int_rel.r_vaddr - sec->vma); - addhi &= 0xffff; - if (addhi & 0x8000) - addhi -= 0x10000; - addhi <<= 16; - - addlo = bfd_get_32 (abfd, contents + rello.r_vaddr - sec->vma); - addlo &= 0xffff; - if (addlo & 0x8000) - addlo -= 0x10000; - - if (adj_int_rel.r_extern) - { - /* The value we want here is - sym - RELLOaddr + addend - which we can express as - sym - (RELLOaddr - addend) - Therefore if we are expanding the area between - RELLOaddr and RELLOaddr - addend we must adjust - the addend. This is admittedly ambiguous, since - we might mean (sym + addend) - RELLOaddr, but in - practice we don't, and there is no way to handle - that case correctly since at this point we have - no idea whether any reloc is being expanded - between sym and sym + addend. */ - start = rello.r_vaddr - (addhi + addlo); - stop = rello.r_vaddr; - } - else - { - /* An internal RELHI/RELLO pair represents the - difference between two addresses, $LC0 - foo. - The symndx value is actually the difference - between the reloc address and $LC0. This lets us - compute $LC0, and, by considering the addend, - foo. If the reloc we are expanding falls between - those two relocs, we must adjust the addend. At - this point, the symndx value is actually in the - r_offset field, where it was put by - mips_ecoff_swap_reloc_in. */ - start = rello.r_vaddr - adj_int_rel.r_offset; - stop = start + addhi + addlo; - } - } - else if (adj_int_rel.r_type == MIPS_R_SWITCH) - { - /* A MIPS_R_SWITCH reloc represents a word of the form - .word $L3-$LS12 - The value in the object file is correct, assuming the - original value of $L3. The symndx value is actually - the difference between the reloc address and $LS12. - This lets us compute the original value of $LS12 as - vaddr - symndx - and the original value of $L3 as - vaddr - symndx + addend - where addend is the value from the object file. At - this point, the symndx value is actually found in the - r_offset field, since it was moved by - mips_ecoff_swap_reloc_in. */ - start = adj_int_rel.r_vaddr - adj_int_rel.r_offset; - stop = start + bfd_get_32 (abfd, - (contents - + adj_int_rel.r_vaddr - - sec->vma)); - } - else - continue; - - /* If the range expressed by this reloc, which is the - distance between START and STOP crosses the reloc we are - expanding, we must adjust the offset. The sign of the - adjustment depends upon the direction in which the range - crosses the reloc being expanded. */ - if (start <= int_rel.r_vaddr && stop > int_rel.r_vaddr) - change = PCREL16_EXPANSION_ADJUSTMENT; - else if (start > int_rel.r_vaddr && stop <= int_rel.r_vaddr) - change = - PCREL16_EXPANSION_ADJUSTMENT; - else - change = 0; - - offsets[adj_i] += change; - - if (adj_int_rel.r_type == MIPS_R_RELHI) - { - adj_ext_rel++; - adj_i++; - offsets[adj_i] += change; - } - } - - /* Find all symbols in this section defined by this object file - and adjust their values. Note that we decide whether to - adjust the value based on the value stored in the ECOFF EXTR - structure, because the value stored in the hash table may - have been changed by an earlier expanded reloc and thus may - no longer correctly indicate whether the symbol is before or - after the expanded reloc. */ - ext_count = ecoff_data (abfd)->debug_info.symbolic_header.iextMax; - adj_h_ptr = ecoff_data (abfd)->sym_hashes; - adj_h_ptr_end = adj_h_ptr + ext_count; - for (; adj_h_ptr < adj_h_ptr_end; adj_h_ptr++) - { - struct ecoff_link_hash_entry *adj_h; - - adj_h = *adj_h_ptr; - if (adj_h != (struct ecoff_link_hash_entry *) NULL - && (adj_h->root.type == bfd_link_hash_defined - || adj_h->root.type == bfd_link_hash_defweak) - && adj_h->root.u.def.section == sec - && adj_h->esym.asym.value > int_rel.r_vaddr) - adj_h->root.u.def.value += PCREL16_EXPANSION_ADJUSTMENT; - } - - /* Add an entry to the symbol value adjust list. This is used - by bfd_ecoff_debug_accumulate to adjust the values of - internal symbols and FDR's. */ - adjust = ((struct ecoff_value_adjust *) - bfd_alloc (abfd, sizeof (struct ecoff_value_adjust))); - if (adjust == (struct ecoff_value_adjust *) NULL) - goto error_return; - - adjust->start = int_rel.r_vaddr; - adjust->end = sec->vma + sec->_raw_size; - adjust->adjust = PCREL16_EXPANSION_ADJUSTMENT; - - adjust->next = ecoff_data (abfd)->debug_info.adjust; - ecoff_data (abfd)->debug_info.adjust = adjust; - } - - if (contents != (bfd_byte *) NULL && ! info->keep_memory) - free (contents); - - return true; - - error_return: - if (contents != (bfd_byte *) NULL && ! info->keep_memory) - free (contents); - return false; -} - -/* This routine is called from mips_relocate_section when a PC - relative reloc must be expanded into the five instruction sequence. - It handles all the details of the expansion, including resolving - the reloc. */ - -static boolean -mips_relax_pcrel16 (info, input_bfd, input_section, h, location, address) - struct bfd_link_info *info; - bfd *input_bfd; - asection *input_section; - struct ecoff_link_hash_entry *h; - bfd_byte *location; - bfd_vma address; -{ - bfd_vma relocation; - - /* 0x0411ffff is bgezal $0,. == bal . */ - BFD_ASSERT (bfd_get_32 (input_bfd, location) == 0x0411ffff); - - /* We need to compute the distance between the symbol and the - current address plus eight. */ - relocation = (h->root.u.def.value - + h->root.u.def.section->output_section->vma - + h->root.u.def.section->output_offset); - relocation -= address + 8; - - /* If the lower half is negative, increment the upper 16 half. */ - if ((relocation & 0x8000) != 0) - relocation += 0x10000; - - bfd_put_32 (input_bfd, 0x04110001, location); /* bal .+8 */ - bfd_put_32 (input_bfd, - 0x3c010000 | ((relocation >> 16) & 0xffff), /* lui $at,XX */ - location + 4); - bfd_put_32 (input_bfd, - 0x24210000 | (relocation & 0xffff), /* addiu $at,$at,XX */ - location + 8); - bfd_put_32 (input_bfd, 0x003f0821, location + 12); /* addu $at,$at,$ra */ - bfd_put_32 (input_bfd, 0x0020f809, location + 16); /* jalr $at */ - - return true; -} - -/* Given a .sdata section and a .rel.sdata in-memory section, store - relocation information into the .rel.sdata section which can be - used at runtime to relocate the section. This is called by the - linker when the --embedded-relocs switch is used. This is called - after the add_symbols entry point has been called for all the - objects, and before the final_link entry point is called. This - function presumes that the object was compiled using - -membedded-pic. */ - -boolean -bfd_mips_ecoff_create_embedded_relocs (abfd, info, datasec, relsec, errmsg) - bfd *abfd; - struct bfd_link_info *info; - asection *datasec; - asection *relsec; - char **errmsg; -{ - struct ecoff_link_hash_entry **sym_hashes; - struct ecoff_section_tdata *section_tdata; - struct external_reloc *ext_rel; - struct external_reloc *ext_rel_end; - bfd_byte *p; - - BFD_ASSERT (! info->relocateable); - - *errmsg = NULL; - - if (datasec->reloc_count == 0) - return true; - - sym_hashes = ecoff_data (abfd)->sym_hashes; - - if (! mips_read_relocs (abfd, datasec)) - return false; - - relsec->contents = (bfd_byte *) bfd_alloc (abfd, datasec->reloc_count * 4); - if (relsec->contents == NULL) - return false; - - p = relsec->contents; - - section_tdata = ecoff_section_data (abfd, datasec); - ext_rel = (struct external_reloc *) section_tdata->external_relocs; - ext_rel_end = ext_rel + datasec->reloc_count; - for (; ext_rel < ext_rel_end; ext_rel++, p += 4) - { - struct internal_reloc int_rel; - boolean text_relative; - - mips_ecoff_swap_reloc_in (abfd, (PTR) ext_rel, &int_rel); - - /* We are going to write a four byte word into the runtime reloc - section. The word will be the address in the data section - which must be relocated. This must be on a word boundary, - which means the lower two bits must be zero. We use the - least significant bit to indicate how the value in the data - section must be relocated. A 0 means that the value is - relative to the text section, while a 1 indicates that the - value is relative to the data section. Given that we are - assuming the code was compiled using -membedded-pic, there - should not be any other possibilities. */ - - /* We can only relocate REFWORD relocs at run time. */ - if (int_rel.r_type != MIPS_R_REFWORD) - { - *errmsg = "unsupported reloc type"; - bfd_set_error (bfd_error_bad_value); - return false; - } - - if (int_rel.r_extern) - { - struct ecoff_link_hash_entry *h; - - h = sym_hashes[int_rel.r_symndx]; - /* If h is NULL, that means that there is a reloc against an - external symbol which we thought was just a debugging - symbol. This should not happen. */ - if (h == (struct ecoff_link_hash_entry *) NULL) - abort (); - if ((h->root.type == bfd_link_hash_defined - || h->root.type == bfd_link_hash_defweak) - && (h->root.u.def.section->flags & SEC_CODE) != 0) - text_relative = true; - else - text_relative = false; - } - else - { - switch (int_rel.r_symndx) - { - case RELOC_SECTION_TEXT: - text_relative = true; - break; - case RELOC_SECTION_SDATA: - case RELOC_SECTION_SBSS: - case RELOC_SECTION_LIT8: - text_relative = false; - break; - default: - /* No other sections should appear in -membedded-pic - code. */ - *errmsg = "reloc against unsupported section"; - bfd_set_error (bfd_error_bad_value); - return false; - } - } - - if ((int_rel.r_offset & 3) != 0) - { - *errmsg = "reloc not properly aligned"; - bfd_set_error (bfd_error_bad_value); - return false; - } - - bfd_put_32 (abfd, - (int_rel.r_vaddr - datasec->vma + datasec->output_offset - + (text_relative ? 0 : 1)), - p); - } - - return true; -} - -/* This is the ECOFF backend structure. The backend field of the - target vector points to this. */ - -static const struct ecoff_backend_data mips_ecoff_backend_data = -{ - /* COFF backend structure. */ - { - (void (*) PARAMS ((bfd *,PTR,int,int,int,int,PTR))) bfd_void, /* aux_in */ - (void (*) PARAMS ((bfd *,PTR,PTR))) bfd_void, /* sym_in */ - (void (*) PARAMS ((bfd *,PTR,PTR))) bfd_void, /* lineno_in */ - (unsigned (*) PARAMS ((bfd *,PTR,int,int,int,int,PTR)))bfd_void,/*aux_out*/ - (unsigned (*) PARAMS ((bfd *,PTR,PTR))) bfd_void, /* sym_out */ - (unsigned (*) PARAMS ((bfd *,PTR,PTR))) bfd_void, /* lineno_out */ - (unsigned (*) PARAMS ((bfd *,PTR,PTR))) bfd_void, /* reloc_out */ - mips_ecoff_swap_filehdr_out, mips_ecoff_swap_aouthdr_out, - mips_ecoff_swap_scnhdr_out, - FILHSZ, AOUTSZ, SCNHSZ, 0, 0, 0, 0, true, - mips_ecoff_swap_filehdr_in, mips_ecoff_swap_aouthdr_in, - mips_ecoff_swap_scnhdr_in, NULL, - mips_ecoff_bad_format_hook, _bfd_ecoff_set_arch_mach_hook, - _bfd_ecoff_mkobject_hook, _bfd_ecoff_styp_to_sec_flags, - _bfd_ecoff_set_alignment_hook, _bfd_ecoff_slurp_symbol_table, - NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL - }, - /* Supported architecture. */ - bfd_arch_mips, - /* Initial portion of armap string. */ - "__________", - /* The page boundary used to align sections in a demand-paged - executable file. E.g., 0x1000. */ - 0x1000, - /* True if the .rdata section is part of the text segment, as on the - Alpha. False if .rdata is part of the data segment, as on the - MIPS. */ - false, - /* Bitsize of constructor entries. */ - 32, - /* Reloc to use for constructor entries. */ - &mips_howto_table[MIPS_R_REFWORD], - { - /* Symbol table magic number. */ - magicSym, - /* Alignment of debugging information. E.g., 4. */ - 4, - /* Sizes of external symbolic information. */ - sizeof (struct hdr_ext), - sizeof (struct dnr_ext), - sizeof (struct pdr_ext), - sizeof (struct sym_ext), - sizeof (struct opt_ext), - sizeof (struct fdr_ext), - sizeof (struct rfd_ext), - sizeof (struct ext_ext), - /* Functions to swap in external symbolic data. */ - ecoff_swap_hdr_in, - ecoff_swap_dnr_in, - ecoff_swap_pdr_in, - ecoff_swap_sym_in, - ecoff_swap_opt_in, - ecoff_swap_fdr_in, - ecoff_swap_rfd_in, - ecoff_swap_ext_in, - _bfd_ecoff_swap_tir_in, - _bfd_ecoff_swap_rndx_in, - /* Functions to swap out external symbolic data. */ - ecoff_swap_hdr_out, - ecoff_swap_dnr_out, - ecoff_swap_pdr_out, - ecoff_swap_sym_out, - ecoff_swap_opt_out, - ecoff_swap_fdr_out, - ecoff_swap_rfd_out, - ecoff_swap_ext_out, - _bfd_ecoff_swap_tir_out, - _bfd_ecoff_swap_rndx_out, - /* Function to read in symbolic data. */ - _bfd_ecoff_slurp_symbolic_info - }, - /* External reloc size. */ - RELSZ, - /* Reloc swapping functions. */ - mips_ecoff_swap_reloc_in, - mips_ecoff_swap_reloc_out, - /* Backend reloc tweaking. */ - mips_adjust_reloc_in, - mips_adjust_reloc_out, - /* Relocate section contents while linking. */ - mips_relocate_section, - /* Do final adjustments to filehdr and aouthdr. */ - NULL, - /* Read an element from an archive at a given file position. */ - _bfd_get_elt_at_filepos -}; - -/* Looking up a reloc type is MIPS specific. */ -#define _bfd_ecoff_bfd_reloc_type_lookup mips_bfd_reloc_type_lookup - -/* Getting relocated section contents is generic. */ -#define _bfd_ecoff_bfd_get_relocated_section_contents \ - bfd_generic_get_relocated_section_contents - -/* Handling file windows is generic. */ -#define _bfd_ecoff_get_section_contents_in_window \ - _bfd_generic_get_section_contents_in_window - -/* Relaxing sections is MIPS specific. */ -#define _bfd_ecoff_bfd_relax_section mips_relax_section - -const bfd_target ecoff_little_vec = -{ - "ecoff-littlemips", /* name */ - bfd_target_ecoff_flavour, - BFD_ENDIAN_LITTLE, /* data byte order is little */ - BFD_ENDIAN_LITTLE, /* header byte order is little */ - - (HAS_RELOC | EXEC_P | /* object flags */ - HAS_LINENO | HAS_DEBUG | - HAS_SYMS | HAS_LOCALS | WP_TEXT | D_PAGED), - - (SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD | SEC_RELOC | SEC_CODE | SEC_DATA), - 0, /* leading underscore */ - ' ', /* ar_pad_char */ - 15, /* ar_max_namelen */ - bfd_getl64, bfd_getl_signed_64, bfd_putl64, - bfd_getl32, bfd_getl_signed_32, bfd_putl32, - bfd_getl16, bfd_getl_signed_16, bfd_putl16, /* data */ - bfd_getl64, bfd_getl_signed_64, bfd_putl64, - bfd_getl32, bfd_getl_signed_32, bfd_putl32, - bfd_getl16, bfd_getl_signed_16, bfd_putl16, /* hdrs */ - - {_bfd_dummy_target, coff_object_p, /* bfd_check_format */ - _bfd_ecoff_archive_p, _bfd_dummy_target}, - {bfd_false, _bfd_ecoff_mkobject, /* bfd_set_format */ - _bfd_generic_mkarchive, bfd_false}, - {bfd_false, _bfd_ecoff_write_object_contents, /* bfd_write_contents */ - _bfd_write_archive_contents, bfd_false}, - - BFD_JUMP_TABLE_GENERIC (_bfd_ecoff), - BFD_JUMP_TABLE_COPY (_bfd_ecoff), - BFD_JUMP_TABLE_CORE (_bfd_nocore), - BFD_JUMP_TABLE_ARCHIVE (_bfd_ecoff), - BFD_JUMP_TABLE_SYMBOLS (_bfd_ecoff), - BFD_JUMP_TABLE_RELOCS (_bfd_ecoff), - BFD_JUMP_TABLE_WRITE (_bfd_ecoff), - BFD_JUMP_TABLE_LINK (_bfd_ecoff), - BFD_JUMP_TABLE_DYNAMIC (_bfd_nodynamic), - - (PTR) &mips_ecoff_backend_data -}; - -const bfd_target ecoff_big_vec = -{ - "ecoff-bigmips", /* name */ - bfd_target_ecoff_flavour, - BFD_ENDIAN_BIG, /* data byte order is big */ - BFD_ENDIAN_BIG, /* header byte order is big */ - - (HAS_RELOC | EXEC_P | /* object flags */ - HAS_LINENO | HAS_DEBUG | - HAS_SYMS | HAS_LOCALS | WP_TEXT | D_PAGED), - - (SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD | SEC_RELOC | SEC_CODE | SEC_DATA), - 0, /* leading underscore */ - ' ', /* ar_pad_char */ - 15, /* ar_max_namelen */ - bfd_getb64, bfd_getb_signed_64, bfd_putb64, - bfd_getb32, bfd_getb_signed_32, bfd_putb32, - bfd_getb16, bfd_getb_signed_16, bfd_putb16, - bfd_getb64, bfd_getb_signed_64, bfd_putb64, - bfd_getb32, bfd_getb_signed_32, bfd_putb32, - bfd_getb16, bfd_getb_signed_16, bfd_putb16, - {_bfd_dummy_target, coff_object_p, /* bfd_check_format */ - _bfd_ecoff_archive_p, _bfd_dummy_target}, - {bfd_false, _bfd_ecoff_mkobject, /* bfd_set_format */ - _bfd_generic_mkarchive, bfd_false}, - {bfd_false, _bfd_ecoff_write_object_contents, /* bfd_write_contents */ - _bfd_write_archive_contents, bfd_false}, - - BFD_JUMP_TABLE_GENERIC (_bfd_ecoff), - BFD_JUMP_TABLE_COPY (_bfd_ecoff), - BFD_JUMP_TABLE_CORE (_bfd_nocore), - BFD_JUMP_TABLE_ARCHIVE (_bfd_ecoff), - BFD_JUMP_TABLE_SYMBOLS (_bfd_ecoff), - BFD_JUMP_TABLE_RELOCS (_bfd_ecoff), - BFD_JUMP_TABLE_WRITE (_bfd_ecoff), - BFD_JUMP_TABLE_LINK (_bfd_ecoff), - BFD_JUMP_TABLE_DYNAMIC (_bfd_nodynamic), - - (PTR) &mips_ecoff_backend_data -}; diff --git a/contrib/gdb/bfd/coff-pmac.c b/contrib/gdb/bfd/coff-pmac.c deleted file mode 100644 index f3332d98959b7..0000000000000 --- a/contrib/gdb/bfd/coff-pmac.c +++ /dev/null @@ -1,27 +0,0 @@ -/* BFD back-end for Apple et al PowerPC Mac "XCOFF" files. - Copyright 1995 Free Software Foundation, Inc. - -This file is part of BFD, the Binary File Descriptor library. - -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 2 of the License, 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ - -#define TARGET_SYM pmac_xcoff_vec -#define TARGET_NAME "xcoff-powermac" - -/* Tweak coffcode.h based on this being a PowerMac instead of RS/6000. */ - -#define POWERMAC - -#include "coff-rs6000.c" diff --git a/contrib/gdb/bfd/coff-ppc.c b/contrib/gdb/bfd/coff-ppc.c deleted file mode 100644 index 4caf3d8dc01d8..0000000000000 --- a/contrib/gdb/bfd/coff-ppc.c +++ /dev/null @@ -1,3255 +0,0 @@ -/* BFD back-end for PowerPC Microsoft Portable Executable files. - Copyright 1990, 1991, 1992, 1993, 1994, 1995, 1996 Free Software Foundation, Inc. - - Original version pieced together by Kim Knuttila (krk@cygnus.com) - - There is nothing new under the sun. This file draws a lot on other - coff files, in particular, those for the rs/6000, alpha, mips, and - intel backends, and the PE work for the arm. - -This file is part of BFD, the Binary File Descriptor library. - -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 2 of the License, 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. */ - -/* Current State: - - objdump works - - relocs generated by gas - - ld will link files, but they do not run. - - dlltool will not produce correct output in some .reloc cases, and will - not produce the right glue code for dll function calls. -*/ - - -#include "bfd.h" -#include "sysdep.h" - -#include "libbfd.h" -#include "obstack.h" - -#include "coff/powerpc.h" -#include "coff/internal.h" - -#include "coff/pe.h" - -#ifdef BADMAG -#undef BADMAG -#endif - -#define BADMAG(x) PPCBADMAG(x) - -#include "libcoff.h" - -/* The toc is a set of bfd_vma fields. We use the fact that valid */ -/* addresses are even (i.e. the bit representing "1" is off) to allow */ -/* us to encode a little extra information in the field */ -/* - Unallocated addresses are intialized to 1. */ -/* - Allocated addresses are even numbers. */ -/* The first time we actually write a reference to the toc in the bfd, */ -/* we want to record that fact in a fixup file (if it is asked for), so */ -/* we keep track of whether or not an address has been written by marking */ -/* the low order bit with a "1" upon writing */ - -#define SET_UNALLOCATED(x) ((x) = 1) -#define IS_UNALLOCATED(x) ((x) == 1) - -#define IS_WRITTEN(x) ((x) & 1) -#define MARK_AS_WRITTEN(x) ((x) |= 1) -#define MAKE_ADDR_AGAIN(x) ((x) &= ~1) - -/* In order not to add an int to every hash table item for every coff - linker, we define our own hash table, derived from the coff one */ - -/* PE linker hash table entries. */ - -struct ppc_coff_link_hash_entry -{ - struct coff_link_hash_entry root; /* First entry, as required */ - - /* As we wonder around the relocs, we'll keep the assigned toc_offset - here */ - bfd_vma toc_offset; /* Our addition, as required */ - int symbol_is_glue; - unsigned long int glue_insn; - char eye_catcher[8]; -}; - -/* Need a 7 char string for an eye catcher */ -#define EYE "krkjunk" - -#define CHECK_EYE(addr) \ - if (strcmp(addr, EYE) != 0) \ - { \ - fprintf(stderr,\ - "File %s, line %d, Hash check failure, bad eye %8s\n", \ - __FILE__, __LINE__, addr); \ - abort(); \ - } - -/* PE linker hash table. */ - -struct ppc_coff_link_hash_table -{ - struct coff_link_hash_table root; /* First entry, as required */ -}; - -static struct bfd_hash_entry *ppc_coff_link_hash_newfunc - PARAMS ((struct bfd_hash_entry *, struct bfd_hash_table *, - const char *)); - -/* Routine to create an entry in the link hash table. */ - -static struct bfd_hash_entry * -ppc_coff_link_hash_newfunc (entry, table, string) - struct bfd_hash_entry *entry; - struct bfd_hash_table *table; - const char *string; -{ - struct ppc_coff_link_hash_entry *ret = - (struct ppc_coff_link_hash_entry *) entry; - - /* Allocate the structure if it has not already been allocated by a - subclass. */ - if (ret == (struct ppc_coff_link_hash_entry *) NULL) - ret = (struct ppc_coff_link_hash_entry *) - bfd_hash_allocate (table, - sizeof (struct ppc_coff_link_hash_entry)); - - if (ret == (struct ppc_coff_link_hash_entry *) NULL) - return NULL; - - /* Call the allocation method of the superclass. */ - ret = ((struct ppc_coff_link_hash_entry *) - _bfd_coff_link_hash_newfunc ((struct bfd_hash_entry *) ret, - table, string)); - - if (ret) - { - /* Initialize the local fields. */ - SET_UNALLOCATED(ret->toc_offset); - ret->symbol_is_glue = 0; - ret->glue_insn = 0; - strcpy(ret->eye_catcher, EYE); - } - - return (struct bfd_hash_entry *) ret; -} - -/* Initialize a PE linker hash table. */ - -static boolean -ppc_coff_link_hash_table_init (table, abfd, newfunc) - struct ppc_coff_link_hash_table *table; - bfd *abfd; - struct bfd_hash_entry *(*newfunc) PARAMS ((struct bfd_hash_entry *, - struct bfd_hash_table *, - const char *)); -{ - return _bfd_coff_link_hash_table_init (&table->root, abfd, newfunc); -} - -/* Create a PE linker hash table. */ - -static struct bfd_link_hash_table * -ppc_coff_link_hash_table_create (abfd) - bfd *abfd; -{ - struct ppc_coff_link_hash_table *ret; - - ret = ((struct ppc_coff_link_hash_table *) - bfd_alloc (abfd, sizeof (struct ppc_coff_link_hash_table))); - if (ret == NULL) - return NULL; - if (! ppc_coff_link_hash_table_init (ret, abfd, - ppc_coff_link_hash_newfunc)) - { - bfd_release (abfd, ret); - return (struct bfd_link_hash_table *) NULL; - } - return &ret->root.root; -} - -/* Now, tailor coffcode.h to use our hash stuff */ - -#define coff_bfd_link_hash_table_create ppc_coff_link_hash_table_create - - -/* The nt loader points the toc register to &toc + 32768, in order to */ -/* use the complete range of a 16-bit displacement (I guess). We have */ -/* to adjust for this when we fix up loads displaced off the toc reg. */ -#define TOC_LOAD_ADJUSTMENT (-32768) -#define TOC_SECTION_NAME ".private.toc" - -/* The main body of code is in coffcode.h. */ - -#define COFF_DEFAULT_SECTION_ALIGNMENT_POWER (3) - -/* In case we're on a 32-bit machine, construct a 64-bit "-1" value - from smaller values. Start with zero, widen, *then* decrement. */ -#define MINUS_ONE (((bfd_vma)0) - 1) - -/* these should definitely go in a header file somewhere... */ - -/* NOP */ -#define IMAGE_REL_PPC_ABSOLUTE 0x0000 - -/* 64-bit address */ -#define IMAGE_REL_PPC_ADDR64 0x0001 - -/* 32-bit address */ -#define IMAGE_REL_PPC_ADDR32 0x0002 - -/* 26-bit address, shifted left 2 (branch absolute) */ -#define IMAGE_REL_PPC_ADDR24 0x0003 - -/* 16-bit address */ -#define IMAGE_REL_PPC_ADDR16 0x0004 - -/* 16-bit address, shifted left 2 (load doubleword) */ -#define IMAGE_REL_PPC_ADDR14 0x0005 - -/* 26-bit PC-relative offset, shifted left 2 (branch relative) */ -#define IMAGE_REL_PPC_REL24 0x0006 - -/* 16-bit PC-relative offset, shifted left 2 (br cond relative) */ -#define IMAGE_REL_PPC_REL14 0x0007 - -/* 16-bit offset from TOC base */ -#define IMAGE_REL_PPC_TOCREL16 0x0008 - -/* 16-bit offset from TOC base, shifted left 2 (load doubleword) */ -#define IMAGE_REL_PPC_TOCREL14 0x0009 - -/* 32-bit addr w/o image base */ -#define IMAGE_REL_PPC_ADDR32NB 0x000A - -/* va of containing section (as in an image sectionhdr) */ -#define IMAGE_REL_PPC_SECREL 0x000B - -/* sectionheader number */ -#define IMAGE_REL_PPC_SECTION 0x000C - -/* substitute TOC restore instruction iff symbol is glue code */ -#define IMAGE_REL_PPC_IFGLUE 0x000D - -/* symbol is glue code; virtual address is TOC restore instruction */ -#define IMAGE_REL_PPC_IMGLUE 0x000E - -/* va of containing section (limited to 16 bits) */ -#define IMAGE_REL_PPC_SECREL16 0x000F - -/* stuff to handle immediate data when the number of bits in the */ -/* data is greater than the number of bits in the immediate field */ -/* We need to do (usually) 32 bit arithmetic on 16 bit chunks */ -#define IMAGE_REL_PPC_REFHI 0x0010 -#define IMAGE_REL_PPC_REFLO 0x0011 -#define IMAGE_REL_PPC_PAIR 0x0012 - -/* This is essentially the same as tocrel16, with TOCDEFN assumed */ -#define IMAGE_REL_PPC_TOCREL16_DEFN 0x0013 - -/* Flag bits in IMAGE_RELOCATION.TYPE */ - -/* subtract reloc value rather than adding it */ -#define IMAGE_REL_PPC_NEG 0x0100 - -/* fix branch prediction bit to predict branch taken */ -#define IMAGE_REL_PPC_BRTAKEN 0x0200 - -/* fix branch prediction bit to predict branch not taken */ -#define IMAGE_REL_PPC_BRNTAKEN 0x0400 - -/* toc slot defined in file (or, data in toc) */ -#define IMAGE_REL_PPC_TOCDEFN 0x0800 - -/* masks to isolate above values in IMAGE_RELOCATION.Type */ -#define IMAGE_REL_PPC_TYPEMASK 0x00FF -#define IMAGE_REL_PPC_FLAGMASK 0x0F00 - -#define EXTRACT_TYPE(x) ((x) & IMAGE_REL_PPC_TYPEMASK) -#define EXTRACT_FLAGS(x) ((x) & IMAGE_REL_PPC_FLAGMASK) -#define EXTRACT_JUNK(x) \ - ((x) & ~(IMAGE_REL_PPC_TYPEMASK | IMAGE_REL_PPC_FLAGMASK)) - - -/* static helper functions to make relocation work */ -/* (Work In Progress) */ - -static bfd_reloc_status_type ppc_refhi_reloc PARAMS ((bfd *abfd, - arelent *reloc, - asymbol *symbol, - PTR data, - asection *section, - bfd *output_bfd, - char **error)); -static bfd_reloc_status_type ppc_reflo_reloc PARAMS ((bfd *abfd, - arelent *reloc, - asymbol *symbol, - PTR data, - asection *section, - bfd *output_bfd, - char **error)); -static bfd_reloc_status_type ppc_pair_reloc PARAMS ((bfd *abfd, - arelent *reloc, - asymbol *symbol, - PTR data, - asection *section, - bfd *output_bfd, - char **error)); - - -static bfd_reloc_status_type ppc_toc16_reloc PARAMS ((bfd *abfd, - arelent *reloc, - asymbol *symbol, - PTR data, - asection *section, - bfd *output_bfd, - char **error)); - -static bfd_reloc_status_type ppc_addr32nb_reloc PARAMS ((bfd *abfd, - arelent *reloc, - asymbol *symbol, - PTR data, - asection *section, - bfd *output_bfd, - char **error)); - -static bfd_reloc_status_type ppc_section_reloc PARAMS ((bfd *abfd, - arelent *reloc, - asymbol *symbol, - PTR data, - asection *section, - bfd *output_bfd, - char **error)); - -static bfd_reloc_status_type ppc_secrel_reloc PARAMS ((bfd *abfd, - arelent *reloc, - asymbol *symbol, - PTR data, - asection *section, - bfd *output_bfd, - char **error)); - -static bfd_reloc_status_type ppc_imglue_reloc PARAMS ((bfd *abfd, - arelent *reloc, - asymbol *symbol, - PTR data, - asection *section, - bfd *output_bfd, - char **error)); - - - -static boolean in_reloc_p PARAMS((bfd *abfd, reloc_howto_type *howto)); - - -/* FIXME: It'll take a while to get through all of these. I only need a few to - get us started, so those I'll make sure work. Those marked FIXME are either - completely unverified or have a specific unknown marked in the comment */ - -/*---------------------------------------------------------------------------*/ -/* */ -/* Relocation entries for Windows/NT on PowerPC. */ -/* */ -/* From the document "" we find the following listed as used relocs: */ -/* */ -/* ABSOLUTE : The noop */ -/* ADDR[64|32|16] : fields that hold addresses in data fields or the */ -/* 16 bit displacement field on a load/store. */ -/* ADDR[24|14] : fields that hold addresses in branch and cond */ -/* branches. These represent [26|16] bit addresses. */ -/* The low order 2 bits are preserved. */ -/* REL[24|14] : branches relative to the Instruction Address */ -/* register. These represent [26|16] bit addresses, */ -/* as before. The instruction field will be zero, and */ -/* the address of the SYM will be inserted at link time. */ -/* TOCREL16 : 16 bit displacement field referring to a slot in */ -/* toc. */ -/* TOCREL14 : 16 bit displacement field, similar to REL14 or ADDR14. */ -/* ADDR32NB : 32 bit address relative to the virtual origin. */ -/* (On the alpha, this is always a linker generated thunk)*/ -/* (i.e. 32bit addr relative to the image base) */ -/* SECREL : The value is relative to the start of the section */ -/* containing the symbol. */ -/* SECTION : access to the header containing the item. Supports the */ -/* codeview debugger. */ -/* */ -/* In particular, note that the document does not indicate that the */ -/* relocations listed in the header file are used. */ -/* */ -/* */ -/* */ -/*---------------------------------------------------------------------------*/ - -static reloc_howto_type ppc_coff_howto_table[] = -{ - /* IMAGE_REL_PPC_ABSOLUTE 0x0000 NOP */ - /* Unused: */ - HOWTO (IMAGE_REL_PPC_ABSOLUTE, /* type */ - 0, /* rightshift */ - 0, /* size (0 = byte, 1 = short, 2 = long) */ - 0, /* bitsize */ - false, /* pc_relative */ - 0, /* bitpos */ - complain_overflow_dont, /* dont complain_on_overflow */ - 0, /* special_function */ - "ABSOLUTE", /* name */ - false, /* partial_inplace */ - 0x00, /* src_mask */ - 0x00, /* dst_mask */ - false), /* pcrel_offset */ - - /* IMAGE_REL_PPC_ADDR64 0x0001 64-bit address */ - /* Unused: */ - HOWTO(IMAGE_REL_PPC_ADDR64, /* type */ - 0, /* rightshift */ - 3, /* size (0 = byte, 1 = short, 2 = long) */ - 64, /* bitsize */ - false, /* pc_relative */ - 0, /* bitpos */ - complain_overflow_bitfield, /* complain_on_overflow */ - 0, /* special_function */ - "ADDR64", /* name */ - true, /* partial_inplace */ - MINUS_ONE, /* src_mask */ - MINUS_ONE, /* dst_mask */ - false), /* pcrel_offset */ - - /* IMAGE_REL_PPC_ADDR32 0x0002 32-bit address */ - /* Used: */ - HOWTO (IMAGE_REL_PPC_ADDR32, /* type */ - 0, /* rightshift */ - 2, /* size (0 = byte, 1 = short, 2 = long) */ - 32, /* bitsize */ - false, /* pc_relative */ - 0, /* bitpos */ - complain_overflow_bitfield, /* complain_on_overflow */ - 0, /* special_function */ - "ADDR32", /* name */ - true, /* partial_inplace */ - 0xffffffff, /* src_mask */ - 0xffffffff, /* dst_mask */ - false), /* pcrel_offset */ - - /* IMAGE_REL_PPC_ADDR24 0x0003 26-bit address, shifted left 2 (branch absolute) */ - /* the LI field is in bit 6 through bit 29 is 24 bits, + 2 for the shift */ - /* Of course, That's the IBM approved bit numbering, which is not what */ - /* anyone else uses.... The li field is in bit 2 thru 25 */ - /* Used: */ - HOWTO (IMAGE_REL_PPC_ADDR24, /* type */ - 0, /* rightshift */ - 2, /* size (0 = byte, 1 = short, 2 = long) */ - 26, /* bitsize */ - false, /* pc_relative */ - 0, /* bitpos */ - complain_overflow_bitfield, /* complain_on_overflow */ - 0, /* special_function */ - "ADDR24", /* name */ - true, /* partial_inplace */ - 0x07fffffc, /* src_mask */ - 0x07fffffc, /* dst_mask */ - false), /* pcrel_offset */ - - /* IMAGE_REL_PPC_ADDR16 0x0004 16-bit address */ - /* Used: */ - HOWTO (IMAGE_REL_PPC_ADDR16, /* type */ - 0, /* rightshift */ - 1, /* size (0 = byte, 1 = short, 2 = long) */ - 16, /* bitsize */ - false, /* pc_relative */ - 0, /* bitpos */ - complain_overflow_signed, /* complain_on_overflow */ - 0, /* special_function */ - "ADDR16", /* name */ - true, /* partial_inplace */ - 0xffff, /* src_mask */ - 0xffff, /* dst_mask */ - false), /* pcrel_offset */ - - /* IMAGE_REL_PPC_ADDR14 0x0005 */ - /* 16-bit address, shifted left 2 (load doubleword) */ - /* FIXME: the mask is likely wrong, and the bit position may be as well */ - /* Unused: */ - HOWTO (IMAGE_REL_PPC_ADDR14, /* type */ - 1, /* rightshift */ - 1, /* size (0 = byte, 1 = short, 2 = long) */ - 16, /* bitsize */ - false, /* pc_relative */ - 0, /* bitpos */ - complain_overflow_signed, /* complain_on_overflow */ - 0, /* special_function */ - "ADDR16", /* name */ - true, /* partial_inplace */ - 0xffff, /* src_mask */ - 0xffff, /* dst_mask */ - false), /* pcrel_offset */ - - /* IMAGE_REL_PPC_REL24 0x0006 */ - /* 26-bit PC-relative offset, shifted left 2 (branch relative) */ - /* Used: */ - HOWTO (IMAGE_REL_PPC_REL24, /* type */ - 0, /* rightshift */ - 2, /* size (0 = byte, 1 = short, 2 = long) */ - 26, /* bitsize */ - true, /* pc_relative */ - 0, /* bitpos */ - complain_overflow_signed, /* complain_on_overflow */ - 0, /* special_function */ - "REL24", /* name */ - true, /* partial_inplace */ - 0x3fffffc, /* src_mask */ - 0x3fffffc, /* dst_mask */ - false), /* pcrel_offset */ - - /* IMAGE_REL_PPC_REL14 0x0007 */ - /* 16-bit PC-relative offset, shifted left 2 (br cond relative) */ - /* FIXME: the mask is likely wrong, and the bit position may be as well */ - /* FIXME: how does it know how far to shift? */ - /* Unused: */ - HOWTO (IMAGE_REL_PPC_ADDR14, /* type */ - 1, /* rightshift */ - 1, /* size (0 = byte, 1 = short, 2 = long) */ - 16, /* bitsize */ - false, /* pc_relative */ - 0, /* bitpos */ - complain_overflow_signed, /* complain_on_overflow */ - 0, /* special_function */ - "ADDR16", /* name */ - true, /* partial_inplace */ - 0xffff, /* src_mask */ - 0xffff, /* dst_mask */ - true), /* pcrel_offset */ - - /* IMAGE_REL_PPC_TOCREL16 0x0008 */ - /* 16-bit offset from TOC base */ - /* Used: */ - HOWTO (IMAGE_REL_PPC_TOCREL16,/* type */ - 0, /* rightshift */ - 1, /* size (0 = byte, 1 = short, 2 = long) */ - 16, /* bitsize */ - false, /* pc_relative */ - 0, /* bitpos */ - complain_overflow_dont, /* complain_on_overflow */ - ppc_toc16_reloc, /* special_function */ - "TOCREL16", /* name */ - false, /* partial_inplace */ - 0xffff, /* src_mask */ - 0xffff, /* dst_mask */ - false), /* pcrel_offset */ - - /* IMAGE_REL_PPC_TOCREL14 0x0009 */ - /* 16-bit offset from TOC base, shifted left 2 (load doubleword) */ - /* Unused: */ - HOWTO (IMAGE_REL_PPC_TOCREL14,/* type */ - 1, /* rightshift */ - 1, /* size (0 = byte, 1 = short, 2 = long) */ - 16, /* bitsize */ - false, /* pc_relative */ - 0, /* bitpos */ - complain_overflow_signed, /* complain_on_overflow */ - 0, /* special_function */ - "TOCREL14", /* name */ - false, /* partial_inplace */ - 0xffff, /* src_mask */ - 0xffff, /* dst_mask */ - false), /* pcrel_offset */ - - /* IMAGE_REL_PPC_ADDR32NB 0x000A */ - /* 32-bit addr w/ image base */ - /* Unused: */ - HOWTO (IMAGE_REL_PPC_ADDR32NB,/* type */ - 0, /* rightshift */ - 2, /* size (0 = byte, 1 = short, 2 = long) */ - 32, /* bitsize */ - false, /* pc_relative */ - 0, /* bitpos */ - complain_overflow_signed, /* complain_on_overflow */ - 0, /* special_function */ - "ADDR32NB", /* name */ - true, /* partial_inplace */ - 0xffffffff, /* src_mask */ - 0xffffffff, /* dst_mask */ - false), /* pcrel_offset */ - - /* IMAGE_REL_PPC_SECREL 0x000B */ - /* va of containing section (as in an image sectionhdr) */ - /* Unused: */ - HOWTO (IMAGE_REL_PPC_SECREL,/* type */ - 0, /* rightshift */ - 2, /* size (0 = byte, 1 = short, 2 = long) */ - 32, /* bitsize */ - false, /* pc_relative */ - 0, /* bitpos */ - complain_overflow_signed, /* complain_on_overflow */ - ppc_secrel_reloc, /* special_function */ - "SECREL", /* name */ - true, /* partial_inplace */ - 0xffffffff, /* src_mask */ - 0xffffffff, /* dst_mask */ - true), /* pcrel_offset */ - - /* IMAGE_REL_PPC_SECTION 0x000C */ - /* sectionheader number */ - /* Unused: */ - HOWTO (IMAGE_REL_PPC_SECTION,/* type */ - 0, /* rightshift */ - 2, /* size (0 = byte, 1 = short, 2 = long) */ - 32, /* bitsize */ - false, /* pc_relative */ - 0, /* bitpos */ - complain_overflow_signed, /* complain_on_overflow */ - ppc_section_reloc, /* special_function */ - "SECTION", /* name */ - true, /* partial_inplace */ - 0xffffffff, /* src_mask */ - 0xffffffff, /* dst_mask */ - true), /* pcrel_offset */ - - /* IMAGE_REL_PPC_IFGLUE 0x000D */ - /* substitute TOC restore instruction iff symbol is glue code */ - /* Used: */ - HOWTO (IMAGE_REL_PPC_IFGLUE,/* type */ - 0, /* rightshift */ - 2, /* size (0 = byte, 1 = short, 2 = long) */ - 32, /* bitsize */ - false, /* pc_relative */ - 0, /* bitpos */ - complain_overflow_signed, /* complain_on_overflow */ - 0, /* special_function */ - "IFGLUE", /* name */ - true, /* partial_inplace */ - 0xffffffff, /* src_mask */ - 0xffffffff, /* dst_mask */ - false), /* pcrel_offset */ - - /* IMAGE_REL_PPC_IMGLUE 0x000E */ - /* symbol is glue code; virtual address is TOC restore instruction */ - /* Unused: */ - HOWTO (IMAGE_REL_PPC_IMGLUE,/* type */ - 0, /* rightshift */ - 2, /* size (0 = byte, 1 = short, 2 = long) */ - 32, /* bitsize */ - false, /* pc_relative */ - 0, /* bitpos */ - complain_overflow_dont, /* complain_on_overflow */ - ppc_imglue_reloc, /* special_function */ - "IMGLUE", /* name */ - false, /* partial_inplace */ - 0xffffffff, /* src_mask */ - 0xffffffff, /* dst_mask */ - false), /* pcrel_offset */ - - /* IMAGE_REL_PPC_SECREL16 0x000F */ - /* va of containing section (limited to 16 bits) */ - /* Unused: */ - HOWTO (IMAGE_REL_PPC_SECREL16,/* type */ - 0, /* rightshift */ - 1, /* size (0 = byte, 1 = short, 2 = long) */ - 16, /* bitsize */ - false, /* pc_relative */ - 0, /* bitpos */ - complain_overflow_signed, /* complain_on_overflow */ - 0, /* special_function */ - "SECREL16", /* name */ - true, /* partial_inplace */ - 0xffff, /* src_mask */ - 0xffff, /* dst_mask */ - true), /* pcrel_offset */ - - /* IMAGE_REL_PPC_REFHI 0x0010 */ - /* Unused: */ - HOWTO (IMAGE_REL_PPC_REFHI, /* type */ - 0, /* rightshift */ - 1, /* size (0 = byte, 1 = short, 2 = long) */ - 16, /* bitsize */ - false, /* pc_relative */ - 0, /* bitpos */ - complain_overflow_signed, /* complain_on_overflow */ - ppc_refhi_reloc, /* special_function */ - "REFHI", /* name */ - true, /* partial_inplace */ - 0xffffffff, /* src_mask */ - 0xffffffff, /* dst_mask */ - false), /* pcrel_offset */ - - /* IMAGE_REL_PPC_REFLO 0x0011 */ - /* Unused: */ - HOWTO (IMAGE_REL_PPC_REFLO, /* type */ - 0, /* rightshift */ - 1, /* size (0 = byte, 1 = short, 2 = long) */ - 16, /* bitsize */ - false, /* pc_relative */ - 0, /* bitpos */ - complain_overflow_signed, /* complain_on_overflow */ - ppc_refhi_reloc, /* special_function */ - "REFLO", /* name */ - true, /* partial_inplace */ - 0xffffffff, /* src_mask */ - 0xffffffff, /* dst_mask */ - false), /* pcrel_offset */ - - /* IMAGE_REL_PPC_PAIR 0x0012 */ - /* Unused: */ - HOWTO (IMAGE_REL_PPC_PAIR, /* type */ - 0, /* rightshift */ - 1, /* size (0 = byte, 1 = short, 2 = long) */ - 16, /* bitsize */ - false, /* pc_relative */ - 0, /* bitpos */ - complain_overflow_signed, /* complain_on_overflow */ - ppc_pair_reloc, /* special_function */ - "PAIR", /* name */ - true, /* partial_inplace */ - 0xffffffff, /* src_mask */ - 0xffffffff, /* dst_mask */ - false), /* pcrel_offset */ - - /* IMAGE_REL_PPC_TOCREL16_DEFN 0x0013 */ - /* 16-bit offset from TOC base, without causing a definition */ - /* Used: */ - HOWTO ( (IMAGE_REL_PPC_TOCREL16 | IMAGE_REL_PPC_TOCDEFN), /* type */ - 0, /* rightshift */ - 1, /* size (0 = byte, 1 = short, 2 = long) */ - 16, /* bitsize */ - false, /* pc_relative */ - 0, /* bitpos */ - complain_overflow_dont, /* complain_on_overflow */ - 0, /* special_function */ - "TOCREL16, TOCDEFN", /* name */ - false, /* partial_inplace */ - 0xffff, /* src_mask */ - 0xffff, /* dst_mask */ - false), /* pcrel_offset */ - -}; - - - - -/* Some really cheezy macros that can be turned on to test stderr :-) */ - -#ifdef DEBUG_RELOC -#define UN_IMPL(x) \ -{ \ - static int i; \ - if (i == 0) \ - { \ - i = 1; \ - fprintf(stderr,"Unimplemented Relocation -- %s\n",x); \ - } \ -} - -#define DUMP_RELOC(n,r) \ -{ \ - fprintf(stderr,"%s sym %d, addr %d, addend %d\n", \ - n, (*(r->sym_ptr_ptr))->name, \ - r->address, r->addend); \ -} - -/* Given a reloc name, n, and a pointer to an internal_reloc, - dump out interesting information on the contents - -#define n_name _n._n_name -#define n_zeroes _n._n_n._n_zeroes -#define n_offset _n._n_n._n_offset - -*/ - -#define DUMP_RELOC2(n,r) \ -{ \ - fprintf(stderr,"%s sym %d, r_vaddr %d %s\n", \ - n, r->r_symndx, r->r_vaddr,\ - (((r->r_type) & IMAGE_REL_PPC_TOCDEFN) == 0) \ - ?" ":" TOCDEFN" ); \ -} - -#else -#define UN_IMPL(x) -#define DUMP_RELOC(n,r) -#define DUMP_RELOC2(n,r) -#endif - - - -/* toc construction and management routines */ -extern bfd* bfd_of_toc_owner; -extern long int global_toc_size; - -extern long int import_table_size; -extern long int first_thunk_address; -extern long int thunk_size; - -enum toc_type -{ - default_toc, - toc_32, - toc_64 -}; - -enum ref_category -{ - priv, - pub, - data -}; - -struct list_ele -{ - struct list_ele *next; - bfd_vma addr; - enum ref_category cat; - int offset; - const char *name; -}; - -extern struct list_ele *head; -extern struct list_ele *tail; - -static void -record_toc(toc_section, our_toc_offset, cat, name) - asection *toc_section; - int our_toc_offset; - enum ref_category cat; - const char *name; -{ - /* add this entry to our toc addr-offset-name list */ - struct list_ele *t; - t = bfd_malloc (sizeof (struct list_ele)); - if (t == NULL) - abort (); - t->next = 0; - t->offset = our_toc_offset; - t->name = name; - t->cat = cat; - t->addr = toc_section->output_offset + our_toc_offset; - - if (head == 0) - { - head = t; - tail = t; - } - else - { - tail->next = t; - tail = t; - } -} - -/* record a toc offset against a symbol */ -static int -ppc_record_toc_entry(abfd, info, sec, sym, toc_kind) - bfd *abfd; - struct bfd_link_info *info; - asection *sec; - int sym; - enum toc_type toc_kind; -{ - bfd_byte *t; - bfd_byte *old_contents; - asection *s; - int element_size; - int data; - int offset; - struct ppc_coff_link_hash_entry *h; - struct coff_symbol_struct *target; - int ret_val; - const char *name; - - int *local_syms; - - h = 0; - - h = (struct ppc_coff_link_hash_entry *) (obj_coff_sym_hashes (abfd)[sym]); - if (h != 0) - { - CHECK_EYE(h->eye_catcher); - } - - if (h == 0) - { - local_syms = obj_coff_local_toc_table(abfd); - if (local_syms == 0) - { - int i; - /* allocate a table */ - local_syms = - (int *) bfd_zalloc (abfd, - obj_raw_syment_count(abfd) * sizeof(int)); - if (local_syms == 0) - return false; - obj_coff_local_toc_table(abfd) = local_syms; - for (i = 0; i < obj_raw_syment_count(abfd); ++i) - { - SET_UNALLOCATED(local_syms[i]); - } - } - - if (IS_UNALLOCATED(local_syms[sym])) - { - local_syms[sym] = global_toc_size; - ret_val = global_toc_size; - global_toc_size += 4; - - /* The size must fit in a 16bit displacment */ - if (global_toc_size >= 65535) - { - fprintf(stderr, - "Exceeded toc size of 65535\n"); - abort(); - } - -#ifdef TOC_DEBUG - fprintf(stderr, - "Setting toc_offset for local sym %d to %d\n", - sym, ret_val); -#endif - } - else - { - ret_val = local_syms[sym]; -#ifdef TOC_DEBUG - fprintf(stderr, - "toc_offset already set for local sym %d to %d\n", - sym, ret_val); -#endif - } - } - else - { - name = h->root.root.root.string; - - /* check to see if there's a toc slot allocated. If not, do it - here. It will be used in relocate_section */ - if (IS_UNALLOCATED(h->toc_offset)) - { - h->toc_offset = global_toc_size; - ret_val = global_toc_size; - global_toc_size += 4; - - /* The size must fit in a 16bit displacment */ - if (global_toc_size >= 65535) - { - fprintf(stderr, - "Exceeded toc size of 65535\n"); - abort(); - } - -#ifdef TOC_DEBUG - fprintf(stderr, - "Setting toc_offset for sym %d (%s) [h=%p] to %d\n", - sym, name, h, ret_val); -#endif - } - else - { - ret_val = h->toc_offset; -#ifdef TOC_DEBUG - fprintf(stderr, - "toc_offset already set for sym %d (%s) [h=%p] to %d\n", - sym, name, h, ret_val); -#endif - } - } - - return ret_val; -} -/* FIXME: record a toc offset against a data-in-toc symbol */ -/* Now, there is currenly some confusion on what this means. In some - compilers one sees the moral equivalent of: - .tocd - define some data - .text - refer to the data with a [tocv] qualifier - In general, one sees something to indicate that a tocd has been - seen, and that would trigger the allocation of data in toc. The IBM - docs seem to suggest that anything with the TOCDEFN qualifier should - never trigger storage allocation. However, in the kernel32.lib that - we've been using for our test bed, there are a couple of variables - referenced that fail that test. - - So it can't work that way. -*/ -static int -ppc_record_data_in_toc_entry(abfd, info, sec, sym, toc_kind) - bfd *abfd; - struct bfd_link_info *info; - asection *sec; - int sym; - enum toc_type toc_kind; -{ - bfd_byte *t; - bfd_byte *old_contents; - asection *s; - int element_size; - int data; - int offset; - struct ppc_coff_link_hash_entry *h = 0; - struct coff_symbol_struct *target; - int ret_val; - const char *name; - - int *local_syms; - - h = (struct ppc_coff_link_hash_entry *) (obj_coff_sym_hashes (abfd)[sym]); - - if (h == 0) - { - local_syms = obj_coff_local_toc_table(abfd); - if (local_syms == 0) - { - int i; - /* allocate a table */ - local_syms = - (int *) bfd_zalloc (abfd, - obj_raw_syment_count(abfd) * sizeof(int)); - if (local_syms == 0) - return false; - obj_coff_local_toc_table(abfd) = local_syms; - for (i = 0; i < obj_raw_syment_count(abfd); ++i) - { - SET_UNALLOCATED(local_syms[i]); - } - } - - if (IS_UNALLOCATED(local_syms[sym])) - { - local_syms[sym] = global_toc_size; - ret_val = global_toc_size; - global_toc_size += 4; -#ifdef TOC_DEBUG - fprintf(stderr, - "Setting data_in_toc_offset for local sym %d to %d\n", - sym, ret_val); -#endif - } - else - { - ret_val = local_syms[sym]; -#ifdef TOC_DEBUG - fprintf(stderr, - "data_in_toc_offset already set for local sym %d to %d\n", - sym, ret_val); -#endif - } - } - else - { - CHECK_EYE(h->eye_catcher); - - name = h->root.root.root.string; - - /* check to see if there's a toc slot allocated. If not, do it - here. It will be used in relocate_section */ - if (IS_UNALLOCATED(h->toc_offset)) - { -#if 0 - h->toc_offset = global_toc_size; -#endif - ret_val = global_toc_size; - /* We're allocating a chunk of the toc, as opposed to a slot */ - /* FIXME: alignment? */ - - global_toc_size += 4; -#ifdef TOC_DEBUG - fprintf(stderr, - "Setting data_in_toc_offset for sym %d (%s) [h=%p] to %d\n", - sym, name, h, ret_val); -#endif - } - else - { - ret_val = h->toc_offset; -#ifdef TOC_DEBUG - fprintf(stderr, - "data_in_toc_offset already set for sym %d (%s) [h=%p] to %d\n", - sym, name, h, ret_val); -#endif - } - } - - return ret_val; -} - -/* record a toc offset against a symbol */ -static void -ppc_mark_symbol_as_glue(abfd, sym, rel) - bfd *abfd; - int sym; - struct internal_reloc *rel; -{ - struct ppc_coff_link_hash_entry *h; - - h = (struct ppc_coff_link_hash_entry *) (obj_coff_sym_hashes (abfd)[sym]); - - CHECK_EYE(h->eye_catcher); - - h->symbol_is_glue = 1; - h->glue_insn = bfd_get_32 (abfd, (bfd_byte *) &rel->r_vaddr); - - return; -} - - -/* Provided the symbol, returns the value reffed */ -static long get_symbol_value PARAMS ((asymbol *)); - -static long -get_symbol_value (symbol) - asymbol *symbol; -{ - long relocation = 0; - - if (bfd_is_com_section (symbol->section)) - { - relocation = 0; - } - else - { - relocation = symbol->value + - symbol->section->output_section->vma + - symbol->section->output_offset; - } - - return(relocation); -} - -/* Return true if this relocation should - appear in the output .reloc section. */ - -static boolean in_reloc_p(abfd, howto) - bfd * abfd; - reloc_howto_type *howto; -{ - return - (! howto->pc_relative) - && (howto->type != IMAGE_REL_PPC_ADDR32NB) - && (howto->type != IMAGE_REL_PPC_TOCREL16) - && (howto->type != IMAGE_REL_PPC_IMGLUE) - && (howto->type != IMAGE_REL_PPC_IFGLUE) - && (howto->type != IMAGE_REL_PPC_SECREL) - && (howto->type != IMAGE_REL_PPC_SECTION) - && (howto->type != IMAGE_REL_PPC_SECREL16) - && (howto->type != IMAGE_REL_PPC_REFHI) - && (howto->type != IMAGE_REL_PPC_REFLO) - && (howto->type != IMAGE_REL_PPC_PAIR) - && (howto->type != IMAGE_REL_PPC_TOCREL16_DEFN) ; -} - -/* this function is in charge of performing all the ppc PE relocations */ -/* Don't yet know if we want to do this this particular way ... (krk) */ -/* FIXME: (it is not yet enabled) */ - -static bfd_reloc_status_type -pe_ppc_reloc (abfd, reloc_entry, symbol_in, data, input_section, output_bfd, - error_message) - bfd *abfd; - arelent *reloc_entry; - asymbol *symbol_in; - PTR data; - asection *input_section; - bfd *output_bfd; - char **error_message; -{ - /* the consth relocation comes in two parts, we have to remember - the state between calls, in these variables */ - static boolean part1_consth_active = false; - static unsigned long part1_consth_value; - - unsigned long insn; - unsigned long sym_value; - unsigned long unsigned_value; - unsigned short r_type; - long signed_value; - - unsigned long addr = reloc_entry->address ; /*+ input_section->vma*/ - bfd_byte *hit_data =addr + (bfd_byte *)(data); - - fprintf(stderr, "pe_ppc_reloc (%s)\n", TARGET_LITTLE_NAME); - - r_type = reloc_entry->howto->type; - - if (output_bfd) - { - /* Partial linking - do nothing */ - reloc_entry->address += input_section->output_offset; - return bfd_reloc_ok; - } - - if (symbol_in != NULL - && bfd_is_und_section (symbol_in->section)) - { - /* Keep the state machine happy in case we're called again */ - if (r_type == IMAGE_REL_PPC_REFHI) - { - part1_consth_active = true; - part1_consth_value = 0; - } - return(bfd_reloc_undefined); - } - - if ((part1_consth_active) && (r_type != IMAGE_REL_PPC_PAIR)) - { - part1_consth_active = false; - *error_message = (char *) "Missing PAIR"; - return(bfd_reloc_dangerous); - } - - - sym_value = get_symbol_value(symbol_in); - - return(bfd_reloc_ok); -} - -/* The reloc processing routine for the optimized COFF linker. */ - -static boolean -coff_ppc_relocate_section (output_bfd, info, input_bfd, input_section, - contents, relocs, syms, sections) - bfd *output_bfd; - struct bfd_link_info *info; - bfd *input_bfd; - asection *input_section; - bfd_byte *contents; - struct internal_reloc *relocs; - struct internal_syment *syms; - asection **sections; -{ - struct internal_reloc *rel; - struct internal_reloc *relend; - boolean hihalf; - bfd_vma hihalf_val; - asection *toc_section = 0; - bfd_vma relocation; - reloc_howto_type *howto = 0; - -#ifdef DEBUG_RELOC - fprintf(stderr, - "pe_ppc_relocate_section (%s) for %s in bfd %s\n", - TARGET_LITTLE_NAME, - input_section->name, - input_bfd->filename); - -#endif - - /* If we are performing a relocateable link, we don't need to do a - thing. The caller will take care of adjusting the reloc - addresses and symbol indices. */ - if (info->relocateable) - return true; - - hihalf = false; - hihalf_val = 0; - - rel = relocs; - relend = rel + input_section->reloc_count; - for (; rel < relend; rel++) - { - long symndx; - struct ppc_coff_link_hash_entry *h; - struct internal_syment *sym; - bfd_vma val; - - asection *sec; - bfd_reloc_status_type rstat; - bfd_byte *loc; - - unsigned short r_type = EXTRACT_TYPE (rel->r_type); - unsigned short r_flags = EXTRACT_FLAGS(rel->r_type); - unsigned short junk = EXTRACT_JUNK (rel->r_type); - -#ifdef DEBUG_RELOC - /* now examine flags */ - if (r_flags != 0) - { - fprintf (stderr, "Reloc with flags found!"); - if ( r_flags & IMAGE_REL_PPC_NEG ) - fprintf (stderr, " NEG"); - if ( r_flags & IMAGE_REL_PPC_BRTAKEN ) - fprintf (stderr, " BRTAKEN"); - if ( r_flags & IMAGE_REL_PPC_BRNTAKEN ) - fprintf (stderr, " BRNTAKEN"); - if ( r_flags & IMAGE_REL_PPC_TOCDEFN ) - fprintf (stderr, " TOCDEFN"); - fprintf(stderr, "\n"); - } -#endif - - symndx = rel->r_symndx; - loc = contents + rel->r_vaddr - input_section->vma; - - /* FIXME: check bounds on r_type */ - howto = ppc_coff_howto_table + r_type; - - if (symndx == -1) - { - h = NULL; - sym = NULL; - } - else - { - h = (struct ppc_coff_link_hash_entry *) - (obj_coff_sym_hashes (input_bfd)[symndx]); - if (h != 0) - { - CHECK_EYE(h->eye_catcher); - } - - sym = syms + symndx; - } - - sec = NULL; - val = 0; - - /* FIXME: PAIR unsupported in the following code */ - if (h == NULL) - { - if (symndx == -1) - sec = bfd_abs_section_ptr; - else - { - sec = sections[symndx]; - val = (sec->output_section->vma - + sec->output_offset - + sym->n_value - - sec->vma); - } - } - else - { - CHECK_EYE(h->eye_catcher); - - if (h->root.root.type == bfd_link_hash_defined - || h->root.root.type == bfd_link_hash_defweak) - { - sec = h->root.root.u.def.section; - val = (h->root.root.u.def.value - + sec->output_section->vma - + sec->output_offset); - } - else - { -fprintf(stderr, - "missing %s\n",h->root.root.root.string); - if (! ((*info->callbacks->undefined_symbol) - (info, h->root.root.root.string, input_bfd, input_section, - rel->r_vaddr - input_section->vma))) - return false; - } - } - - rstat = bfd_reloc_ok; - - /* Each case must do its own relocation, setting rstat appropriately */ - switch (r_type) - { - default: - fprintf( stderr, - "ERROR: during reloc processing -- unsupported reloc %s\n", - howto->name); - bfd_set_error (bfd_error_bad_value); - abort(); - return false; - case IMAGE_REL_PPC_TOCREL16: - { - bfd_vma our_toc_offset; - int fixit; - - DUMP_RELOC2(howto->name, rel); - - if (toc_section == 0) - { - toc_section = bfd_get_section_by_name (bfd_of_toc_owner, - TOC_SECTION_NAME); -#ifdef TOC_DEBUG - - fprintf(stderr, - "BFD of toc owner %p (%s), section addr of %s %p\n", - bfd_of_toc_owner, bfd_of_toc_owner->filename, - TOC_SECTION_NAME, toc_section); -#endif - - if ( toc_section == NULL ) - { - fprintf(stderr, "No Toc section!\n"); - abort(); - } - } - - /* - * Amazing bit tricks present. As we may have seen earlier, we - * use the 1 bit to tell us whether or not a toc offset has been - * allocated. Now that they've all been allocated, we will use - * the 1 bit to tell us if we've written this particular toc - * entry out. - */ - fixit = false; - if (h == 0) - { /* it is a file local symbol */ - int *local_toc_table; - const char *name; - - sym = syms + symndx; - name = sym->_n._n_name; - - local_toc_table = obj_coff_local_toc_table(input_bfd); - our_toc_offset = local_toc_table[symndx]; - - if (IS_WRITTEN(our_toc_offset)) - { - /* if it has been written out, it is marked with the - 1 bit. Fix up our offset, but do not write it out - again. - */ - MAKE_ADDR_AGAIN(our_toc_offset); -#ifdef TOC_DEBUG - - fprintf(stderr, - "Not writing out toc_offset of %d for %s\n", - our_toc_offset, name); -#endif - } - else - { - /* write out the toc entry */ - record_toc(toc_section, our_toc_offset, priv, strdup(name)); -#ifdef TOC_DEBUG - fprintf(stderr, - "Writing out toc_offset " - "toc_section (%p,%p)+%d val %d for %s\n", - toc_section, - toc_section->contents, - our_toc_offset, - val, - name); -#endif - - bfd_put_32(output_bfd, - val, - toc_section->contents + our_toc_offset); - - MARK_AS_WRITTEN(local_toc_table[symndx]); - fixit = true; - } - } - else - { - const char *name = h->root.root.root.string; - our_toc_offset = h->toc_offset; - - if ((r_flags & IMAGE_REL_PPC_TOCDEFN) - == IMAGE_REL_PPC_TOCDEFN ) -#if 0 - /* This is wrong. If tocdefn is on, we must unconditionally - assume the following path */ - && IS_UNALLOCATED(our_toc_offset)) -#endif - { - /* This is unbelievable cheese. Some knowledgable asm - hacker has decided to use r2 as a base for loading - a value. He/She does this by setting the tocdefn bit, - and not supplying a toc definition. The behaviour is - then to use the difference between the value of the - symbol and the actual location of the toc as the toc - index. - - In fact, what is usually happening is, because the - Import Address Table is mapped immediately following - the toc, some trippy library code trying for speed on - dll linkage, takes advantage of that and considers - the IAT to be part of the toc, thus saving a load. - */ -#ifdef DEBUG_RELOC - fprintf(stderr, - "TOCDEFN is on, (%s) (%p) our_toc_offset = %x\n", - name, h, our_toc_offset); -#endif - - our_toc_offset = val - - (toc_section->output_section->vma + - toc_section->output_offset); - -#ifdef DEBUG_RELOC - fprintf(stderr, - " our_toc_offset set to %x\n", our_toc_offset); -#endif - - /* The size must still fit in a 16bit displacment */ - if (our_toc_offset >= 65535) - { - fprintf(stderr, - "TOCDEFN Relocation exceeded " - "displacment of 65535\n"); - abort(); - } - - record_toc(toc_section, our_toc_offset, pub, strdup(name)); - } - else if (IS_WRITTEN(our_toc_offset)) - { - /* if it has been written out, it is marked with the - 1 bit. Fix up our offset, but do not write it out - again. - */ - MAKE_ADDR_AGAIN(our_toc_offset); -#ifdef TOC_DEBUG - fprintf(stderr, - "Not writing out toc_offset of %d for %s\n", - our_toc_offset, name); -#endif - } - else - { - record_toc(toc_section, our_toc_offset, pub, strdup(name)); - -#ifdef TOC_DEBUG - /* write out the toc entry */ - fprintf(stderr, - "Writing out toc_offset " - "toc_section (%p,%p)+%d val %d for %s\n", - toc_section, - toc_section->contents, - our_toc_offset, - val, - name); -#endif - - /* write out the toc entry */ - bfd_put_32(output_bfd, - val, - toc_section->contents + our_toc_offset); - - MARK_AS_WRITTEN(h->toc_offset); - /* The tricky part is that this is the address that */ - /* needs a .reloc entry for it */ - fixit = true; - } - } - - if (fixit && info->base_file) - { - /* So if this is non pcrelative, and is referenced - to a section or a common symbol, then it needs a reloc */ - - /* relocation to a symbol in a section which - isn't absolute - we output the address here - to a file */ - - bfd_vma addr = toc_section->output_section->vma - + toc_section->output_offset + our_toc_offset; - - if (coff_data(output_bfd)->pe) - addr -= pe_data(output_bfd)->pe_opthdr.ImageBase; - -#ifdef DEBUG_RELOC - fprintf(stderr, - " Toc Section .reloc candidate addr = %x\n", addr); -#endif - fwrite (&addr, 1,4, (FILE *) info->base_file); - } - - - /* FIXME: this test is conservative */ - if ( (r_flags & IMAGE_REL_PPC_TOCDEFN) != IMAGE_REL_PPC_TOCDEFN && - our_toc_offset > toc_section->_raw_size) - { - fprintf(stderr, - "reloc offset is bigger than the toc size!\n"); - abort(); - } - - /* Now we know the relocation for this toc reference */ - relocation = our_toc_offset + TOC_LOAD_ADJUSTMENT; - rstat = _bfd_relocate_contents (howto, - input_bfd, - relocation, - loc); - } - break; - case IMAGE_REL_PPC_IFGLUE: - { - /* To solve this, we need to know whether or not the symbol */ - /* appearing on the call instruction is a glue function or not. */ - /* A glue function must announce itself via a IMGLUE reloc, and */ - /* the reloc contains the required toc restore instruction */ - - bfd_vma x; - const char *my_name; - DUMP_RELOC2(howto->name, rel); - - if (h != 0) - { - my_name = h->root.root.root.string; - if (h->symbol_is_glue == 1) - { - x = bfd_get_32(input_bfd, loc); - bfd_put_32(input_bfd, h->glue_insn, loc); - } - } - } - break; - case IMAGE_REL_PPC_SECREL: - /* Unimplemented: codeview debugging information */ - /* For fast access to the header of the section - containing the item. */ - break; - case IMAGE_REL_PPC_SECTION: - /* Unimplemented: codeview debugging information */ - /* Is used to indicate that the value should be relative - to the beginning of the section that contains the - symbol */ - break; - case IMAGE_REL_PPC_ABSOLUTE: - { - const char *my_name; - if (h == 0) - my_name = (syms+symndx)->_n._n_name; - else - { - my_name = h->root.root.root.string; - } - - fprintf(stderr, - "Warning: unsupported reloc %s <file %s, section %s>\n", - howto->name, - bfd_get_filename(input_bfd), - input_section->name); - - fprintf(stderr,"sym %d (%s), r_vaddr %d (%x)\n", - rel->r_symndx, my_name, rel->r_vaddr, rel->r_vaddr); - } - break; - case IMAGE_REL_PPC_IMGLUE: - { - /* There is nothing to do now. This reloc was noted in the first - pass over the relocs, and the glue instruction extracted */ - const char *my_name; - if (h->symbol_is_glue == 1) - break; - my_name = h->root.root.root.string; - fprintf(stderr, - "Warning: previously missed IMGLUE reloc %s <file %s, section %s>\n", - howto->name, - bfd_get_filename(input_bfd), - input_section->name); - break; - - } - break; - - case IMAGE_REL_PPC_ADDR32NB: - { - struct coff_link_hash_entry *myh = 0; - const char *name = 0; - DUMP_RELOC2(howto->name, rel); - - if (strncmp(".idata$2",input_section->name,8) == 0 && first_thunk_address == 0) - { - /* set magic values */ - int idata5offset; - struct coff_link_hash_entry *myh = 0; - myh = coff_link_hash_lookup (coff_hash_table (info), - "__idata5_magic__", - false, false, true); - first_thunk_address = myh->root.u.def.value + - sec->output_section->vma + - sec->output_offset - - pe_data(output_bfd)->pe_opthdr.ImageBase; - - idata5offset = myh->root.u.def.value; - myh = coff_link_hash_lookup (coff_hash_table (info), - "__idata6_magic__", - false, false, true); - - thunk_size = myh->root.u.def.value - idata5offset; - myh = coff_link_hash_lookup (coff_hash_table (info), - "__idata4_magic__", - false, false, true); - import_table_size = myh->root.u.def.value; -#ifdef DEBUG_RELOC - fprintf(stderr, - "first computation triggered fta %x, ts %d(%x), its %d(%x)\n", - first_thunk_address, thunk_size, thunk_size, import_table_size, - import_table_size); -#endif - } - - if (h == 0) - { /* it is a file local symbol */ - sym = syms + symndx; - name = sym->_n._n_name; - } - else - { - char *target = 0; - - name = h->root.root.root.string; - if (strcmp(".idata$2", name) == 0) - target = "__idata2_magic__"; - else if (strcmp(".idata$4", name) == 0) - target = "__idata4_magic__"; - else if (strcmp(".idata$5", name) == 0) - target = "__idata5_magic__"; - - if (target != 0) - { - myh = 0; - - myh = coff_link_hash_lookup (coff_hash_table (info), - target, - false, false, true); - if (myh == 0) - { - fprintf(stderr, "Missing idata magic cookies, " - "this cannot work anyway...\n"); - abort(); - } - - val = myh->root.u.def.value + - sec->output_section->vma + sec->output_offset; - if (first_thunk_address == 0) - { - int idata5offset; - myh = coff_link_hash_lookup (coff_hash_table (info), - "__idata5_magic__", - false, false, true); - first_thunk_address = myh->root.u.def.value + - sec->output_section->vma + - sec->output_offset - - pe_data(output_bfd)->pe_opthdr.ImageBase; - - idata5offset = myh->root.u.def.value; - myh = coff_link_hash_lookup (coff_hash_table (info), - "__idata6_magic__", - false, false, true); - - thunk_size = myh->root.u.def.value - idata5offset; - myh = coff_link_hash_lookup (coff_hash_table (info), - "__idata4_magic__", - false, false, true); - import_table_size = myh->root.u.def.value; -#ifdef DEBUG_RELOC - - fprintf(stderr, - "second computation triggered fta %x, ts %d(%x), its %d(%x)\n", - first_thunk_address, thunk_size, thunk_size, import_table_size, - import_table_size); -#endif - } - } - } - - rstat = _bfd_relocate_contents (howto, - input_bfd, - val - - pe_data(output_bfd)->pe_opthdr.ImageBase, - loc); - } - break; - - case IMAGE_REL_PPC_REL24: - DUMP_RELOC2(howto->name, rel); - val -= (input_section->output_section->vma - + input_section->output_offset); - - rstat = _bfd_relocate_contents (howto, - input_bfd, - val, - loc); - break; - case IMAGE_REL_PPC_ADDR16: - case IMAGE_REL_PPC_ADDR24: - case IMAGE_REL_PPC_ADDR32: - DUMP_RELOC2(howto->name, rel); - rstat = _bfd_relocate_contents (howto, - input_bfd, - val, - loc); - break; - } - - if ( info->base_file ) - { - /* So if this is non pcrelative, and is referenced - to a section or a common symbol, then it needs a reloc */ - if (sym && pe_data(output_bfd)->in_reloc_p(output_bfd, howto)) - { - /* relocation to a symbol in a section which - isn't absolute - we output the address here - to a file */ - bfd_vma addr = rel->r_vaddr - - input_section->vma - + input_section->output_offset - + input_section->output_section->vma; - - if (coff_data(output_bfd)->pe) - { - bfd_vma before_addr = addr; - addr -= pe_data(output_bfd)->pe_opthdr.ImageBase; -#ifdef DEBUG_RELOC - fprintf(stderr, - " adjusted down from %x to %x", before_addr, addr); -#endif - } -#ifdef DEBUG_RELOC - fprintf(stderr, "\n"); -#endif - - fwrite (&addr, 1,4, (FILE *) info->base_file); - } - } - - switch (rstat) - { - default: - abort (); - case bfd_reloc_ok: - break; - case bfd_reloc_overflow: - { - const char *name; - char buf[SYMNMLEN + 1]; - - if (symndx == -1) - name = "*ABS*"; - else if (h != NULL) - name = h->root.root.root.string; - else if (sym == NULL) - name = "*unknown*"; - else if (sym->_n._n_n._n_zeroes == 0 - && sym->_n._n_n._n_offset != 0) - name = obj_coff_strings (input_bfd) + sym->_n._n_n._n_offset; - else - { - strncpy (buf, sym->_n._n_name, SYMNMLEN); - buf[SYMNMLEN] = '\0'; - name = buf; - } -#if 0 - else - { - name = _bfd_coff_internal_syment_name (input_bfd, sym, buf); - if (name == NULL) - return false; - } -#endif - - if (! ((*info->callbacks->reloc_overflow) - (info, name, howto->name, - (bfd_vma) 0, input_bfd, - input_section, rel->r_vaddr - input_section->vma))) - { -#ifdef DEBUG_RELOC - fprintf(stderr, - "pe_ppc_relocate_section (%s) for %s in bfd %s RETURNING TRUE\n", - TARGET_LITTLE_NAME, - input_section->name, - input_bfd->filename); - -#endif - return false; - } - } - } - - } - -#ifdef DEBUG_RELOC - fprintf(stderr, - "pe_ppc_relocate_section (%s) for %s in bfd %s RETURNING TRUE\n", - TARGET_LITTLE_NAME, - input_section->name, - input_bfd->filename); - -#endif - - return true; -} - - -#ifdef COFF_IMAGE_WITH_PE - -long int global_toc_size = 4; - -bfd* bfd_of_toc_owner = 0; - -long int import_table_size; -long int first_thunk_address; -long int thunk_size; - -struct list_ele *head; -struct list_ele *tail; - -static char * -h1 = "\n\t\t\tTOC MAPPING\n\n"; -static char * -h2 = " TOC disassembly Comments Name\n"; -static char * -h3 = " Offset spelling (if present)\n"; - -void -dump_toc(vfile) - void *vfile; -{ - FILE *file = vfile; - struct list_ele *t; - - fprintf(file, h1); - fprintf(file, h2); - fprintf(file, h3); - - for(t = head; t != 0; t=t->next) - { - char *cat; - - if (t->cat == priv) - cat = "private "; - else if (t->cat == pub) - cat = "public "; - else if (t->cat == data) - cat = "data-in-toc "; - - if (t->offset > global_toc_size) - { - if (t->offset <= global_toc_size + thunk_size) - cat = "IAT reference "; - else - { - fprintf(file, - "**** global_toc_size %d(%x), thunk_size %d(%x)\n", - global_toc_size, global_toc_size, thunk_size, thunk_size); - cat = "Out of bounds!"; - } - } - - fprintf(file, - " %04lx (%d)", t->offset, t->offset - 32768); - fprintf(file, - " %s %s\n", - cat, t->name); - - } - - fprintf(file, "\n"); -} - -boolean -ppc_allocate_toc_section (info) - struct bfd_link_info *info; -{ - asection *s; - bfd_byte *foo; - static char test_char = '1'; - - if ( global_toc_size == 0 ) /* FIXME: does this get me in trouble? */ - return true; - - if (bfd_of_toc_owner == 0) - { - fprintf(stderr, - "There is no bfd that owns the toc section!\n"); - abort(); - } - - s = bfd_get_section_by_name ( bfd_of_toc_owner , TOC_SECTION_NAME); - if (s == NULL) - { - fprintf(stderr, "No Toc section!\n"); - abort(); - } - - foo = bfd_alloc(bfd_of_toc_owner, global_toc_size); - memset(foo, test_char, global_toc_size); - - s->_raw_size = s->_cooked_size = global_toc_size; - s->contents = foo; - - return true; -} - -boolean -ppc_process_before_allocation (abfd, info) - bfd *abfd; - struct bfd_link_info *info; -{ - asection *sec; - struct internal_reloc *i, *rel; - -#ifdef DEBUG_RELOC - fprintf(stderr, - "ppc_process_before_allocation: BFD %s\n", - bfd_get_filename(abfd)); -#endif - - /* here we have a bfd that is to be included on the link. We have a hook - to do reloc rummaging, before section sizes are nailed down. */ - - _bfd_coff_get_external_symbols(abfd); - - /* rummage around all the relocs and map the toc */ - sec = abfd->sections; - - if (sec == 0) - { - return true; - } - - for (; sec != 0; sec = sec->next) - { - int toc_offset; - -#ifdef DEBUG_RELOC - fprintf(stderr, - " section %s reloc count %d\n", - sec->name, - sec->reloc_count); -#endif - - if (sec->reloc_count == 0) - continue; - - /* load the relocs */ - /* FIXME: there may be a storage leak here */ - i=_bfd_coff_read_internal_relocs(abfd,sec,1,0,0,0); - - if (i == 0) - abort(); - - for (rel=i;rel<i+sec->reloc_count;++rel) - { - unsigned short r_type = EXTRACT_TYPE (rel->r_type); - unsigned short r_flags = EXTRACT_FLAGS(rel->r_type); - unsigned short junk = EXTRACT_JUNK (rel->r_type); - -#ifdef DEBUG_RELOC - /* now examine flags */ - if (r_flags != 0) - { - fprintf (stderr, "Reloc with flags found!"); - if ( r_flags & IMAGE_REL_PPC_NEG ) - fprintf (stderr, " NEG"); - if ( r_flags & IMAGE_REL_PPC_BRTAKEN ) - fprintf (stderr, " BRTAKEN"); - if ( r_flags & IMAGE_REL_PPC_BRNTAKEN ) - fprintf (stderr, " BRNTAKEN"); - if ( r_flags & IMAGE_REL_PPC_TOCDEFN ) - fprintf (stderr, " TOCDEFN"); - fprintf(stderr, "\n"); - } -#endif - - DUMP_RELOC2(ppc_coff_howto_table[r_type].name, rel); - - switch(r_type) - { - case IMAGE_REL_PPC_TOCREL16: -#if 0 - /* FIXME: - This remains unimplemented for now, as it currently adds - un-necessary elements to the toc. All we need to do today - is not do anything if TOCDEFN is on. - */ - if ( r_flags & IMAGE_REL_PPC_TOCDEFN ) - toc_offset = ppc_record_data_in_toc_entry(abfd, info, sec, - rel->r_symndx, - default_toc); - else - toc_offset = ppc_record_toc_entry(abfd, info, sec, - rel->r_symndx, default_toc); -#endif - if ( (r_flags & IMAGE_REL_PPC_TOCDEFN) != IMAGE_REL_PPC_TOCDEFN ) - toc_offset = ppc_record_toc_entry(abfd, info, sec, - rel->r_symndx, default_toc); - break; - case IMAGE_REL_PPC_IMGLUE: - ppc_mark_symbol_as_glue(abfd, rel->r_symndx, rel); - break; - default: - break; - } - } - } -} - -#endif - - -static bfd_reloc_status_type -ppc_refhi_reloc (abfd, - reloc_entry, - symbol, - data, - input_section, - output_bfd, - error_message) - bfd *abfd; - arelent *reloc_entry; - asymbol *symbol; - PTR data; - asection *input_section; - bfd *output_bfd; - char **error_message; -{ - UN_IMPL("REFHI"); - DUMP_RELOC("REFHI",reloc_entry); - - if (output_bfd == (bfd *) NULL) - return bfd_reloc_continue; - - return bfd_reloc_undefined; -} - -static bfd_reloc_status_type -ppc_reflo_reloc (abfd, - reloc_entry, - symbol, - data, - input_section, - output_bfd, - error_message) - bfd *abfd; - arelent *reloc_entry; - asymbol *symbol; - PTR data; - asection *input_section; - bfd *output_bfd; - char **error_message; -{ - UN_IMPL("REFLO"); - DUMP_RELOC("REFLO",reloc_entry); - - if (output_bfd == (bfd *) NULL) - return bfd_reloc_continue; - - return bfd_reloc_undefined; -} - -static bfd_reloc_status_type -ppc_pair_reloc (abfd, - reloc_entry, - symbol, - data, - input_section, - output_bfd, - error_message) - bfd *abfd; - arelent *reloc_entry; - asymbol *symbol; - PTR data; - asection *input_section; - bfd *output_bfd; - char **error_message; -{ - UN_IMPL("PAIR"); - DUMP_RELOC("PAIR",reloc_entry); - - if (output_bfd == (bfd *) NULL) - return bfd_reloc_continue; - - return bfd_reloc_undefined; -} - - -static bfd_reloc_status_type -ppc_toc16_reloc (abfd, - reloc_entry, - symbol, - data, - input_section, - output_bfd, - error_message) - bfd *abfd; - arelent *reloc_entry; - asymbol *symbol; - PTR data; - asection *input_section; - bfd *output_bfd; - char **error_message; -{ - UN_IMPL("TOCREL16"); - DUMP_RELOC("TOCREL16",reloc_entry); - - if (output_bfd == (bfd *) NULL) - { - return bfd_reloc_continue; - } - - return bfd_reloc_ok; -} - -/* ADDR32NB : 32 bit address relative to the virtual origin. */ -/* (On the alpha, this is always a linker generated thunk)*/ -/* (i.e. 32bit addr relative to the image base) */ -/* */ -/* */ - -static bfd_reloc_status_type -ppc_addr32nb_reloc (abfd, - reloc_entry, - symbol, - data, - input_section, - output_bfd, - error_message) - bfd *abfd; - arelent *reloc_entry; - asymbol *symbol; - PTR data; - asection *input_section; - bfd *output_bfd; - char **error_message; -{ - UN_IMPL("ADDR32NB"); - DUMP_RELOC("ADDR32NB",reloc_entry); - - return bfd_reloc_ok; -} - -static bfd_reloc_status_type -ppc_secrel_reloc (abfd, - reloc_entry, - symbol, - data, - input_section, - output_bfd, - error_message) - bfd *abfd; - arelent *reloc_entry; - asymbol *symbol; - PTR data; - asection *input_section; - bfd *output_bfd; - char **error_message; -{ - UN_IMPL("SECREL"); - DUMP_RELOC("SECREL",reloc_entry); - - if (output_bfd == (bfd *) NULL) - return bfd_reloc_continue; - - return bfd_reloc_ok; -} - -static bfd_reloc_status_type -ppc_section_reloc (abfd, - reloc_entry, - symbol, - data, - input_section, - output_bfd, - error_message) - bfd *abfd; - arelent *reloc_entry; - asymbol *symbol; - PTR data; - asection *input_section; - bfd *output_bfd; - char **error_message; -{ - UN_IMPL("SECTION"); - DUMP_RELOC("SECTION",reloc_entry); - - if (output_bfd == (bfd *) NULL) - return bfd_reloc_continue; - - return bfd_reloc_ok; -} - -static bfd_reloc_status_type -ppc_imglue_reloc (abfd, - reloc_entry, - symbol, - data, - input_section, - output_bfd, - error_message) - bfd *abfd; - arelent *reloc_entry; - asymbol *symbol; - PTR data; - asection *input_section; - bfd *output_bfd; - char **error_message; -{ - UN_IMPL("IMGLUE"); - DUMP_RELOC("IMGLUE",reloc_entry); - - if (output_bfd == (bfd *) NULL) - return bfd_reloc_continue; - - return bfd_reloc_ok; -} - - - -#define MAX_RELOC_INDEX \ - (sizeof(ppc_coff_howto_table) / sizeof(ppc_coff_howto_table[0]) - 1) - - -/* FIXME: There is a possiblity that when we read in a reloc from a file, - that there are some bits encoded in the upper portion of the - type field. Not yet implemented. -*/ -static void ppc_coff_rtype2howto PARAMS ((arelent *relent, - struct internal_reloc *internal)); - -static void -ppc_coff_rtype2howto (relent, internal) - arelent *relent; - struct internal_reloc *internal; -{ - - /* We can encode one of three things in the type field, aside from the - type: - 1. IMAGE_REL_PPC_NEG - indicates the value field is a subtraction - value, rather than an addition value - 2. IMAGE_REL_PPC_BRTAKEN, IMAGE_REL_PPC_BRNTAKEN - indicates that - the branch is expected to be taken or not. - 3. IMAGE_REL_PPC_TOCDEFN - toc slot definition in the file - For now, we just strip this stuff to find the type, and ignore it other - than that. - */ - reloc_howto_type *howto; - unsigned short r_type = EXTRACT_TYPE (internal->r_type); - unsigned short r_flags = EXTRACT_FLAGS(internal->r_type); - unsigned short junk = EXTRACT_JUNK (internal->r_type); - - /* the masking process only slices off the bottom byte for r_type. */ - if ( r_type > MAX_RELOC_INDEX ) - { - fprintf(stderr, - "ppc_coff_rtype2howto: reloc index %d out of range [%d, %d]\n", - internal->r_type, 0, MAX_RELOC_INDEX); - abort(); - } - - /* check for absolute crap */ - if ( junk != 0 ) - { - fprintf(stderr, - "ppc_coff_rtype2howto: reloc index %d contains junk %d\n", - internal->r_type, junk); - abort(); - } - -#ifdef DEBUG_RELOC - /* now examine flags */ - if (r_flags != 0) - { - fprintf (stderr, "Reloc with flags found!"); - if ( r_flags & IMAGE_REL_PPC_NEG ) - fprintf (stderr, " NEG"); - if ( r_flags & IMAGE_REL_PPC_BRTAKEN ) - fprintf (stderr, " BRTAKEN"); - if ( r_flags & IMAGE_REL_PPC_BRNTAKEN ) - fprintf (stderr, " BRNTAKEN"); - if ( r_flags & IMAGE_REL_PPC_TOCDEFN ) - fprintf (stderr, " TOCDEFN"); - fprintf(stderr, "\n"); - } -#endif - - switch(r_type) - { - case IMAGE_REL_PPC_ADDR16: - case IMAGE_REL_PPC_REL24: - case IMAGE_REL_PPC_ADDR24: - case IMAGE_REL_PPC_ADDR32: - case IMAGE_REL_PPC_IFGLUE: - case IMAGE_REL_PPC_ADDR32NB: - case IMAGE_REL_PPC_SECTION: - case IMAGE_REL_PPC_SECREL: - DUMP_RELOC2(ppc_coff_howto_table[r_type].name, internal); - howto = ppc_coff_howto_table + r_type; - break; - case IMAGE_REL_PPC_IMGLUE: - DUMP_RELOC2(ppc_coff_howto_table[r_type].name, internal); - howto = ppc_coff_howto_table + r_type; - break; - case IMAGE_REL_PPC_TOCREL16: - DUMP_RELOC2(ppc_coff_howto_table[r_type].name, internal); - if (r_flags & IMAGE_REL_PPC_TOCDEFN) - howto = ppc_coff_howto_table + IMAGE_REL_PPC_TOCREL16_DEFN; - else - howto = ppc_coff_howto_table + IMAGE_REL_PPC_TOCREL16; - break; - default: - fprintf(stderr, - "Warning: Unsupported reloc %s [%d] used -- it may not work.\n", - ppc_coff_howto_table[r_type].name, - r_type); - howto = ppc_coff_howto_table + r_type; - break; - } - - relent->howto = howto; - -} - -static reloc_howto_type * -coff_ppc_rtype_to_howto (abfd, sec, rel, h, sym, addendp) - bfd *abfd; - asection *sec; - struct internal_reloc *rel; - struct coff_link_hash_entry *h; - struct internal_syment *sym; - bfd_vma *addendp; -{ - reloc_howto_type *howto; - - /* We can encode one of three things in the type field, aside from the - type: - 1. IMAGE_REL_PPC_NEG - indicates the value field is a subtraction - value, rather than an addition value - 2. IMAGE_REL_PPC_BRTAKEN, IMAGE_REL_PPC_BRNTAKEN - indicates that - the branch is expected to be taken or not. - 3. IMAGE_REL_PPC_TOCDEFN - toc slot definition in the file - For now, we just strip this stuff to find the type, and ignore it other - than that. - */ - - unsigned short r_type = EXTRACT_TYPE (rel->r_type); - unsigned short r_flags = EXTRACT_FLAGS(rel->r_type); - unsigned short junk = EXTRACT_JUNK (rel->r_type); - - /* the masking process only slices off the bottom byte for r_type. */ - if ( r_type > MAX_RELOC_INDEX ) - { - fprintf(stderr, - "coff_ppc_rtype_to_howto: index %d out of range [%d, %d]\n", - r_type, 0, MAX_RELOC_INDEX); - abort(); - } - - /* check for absolute crap */ - if ( junk != 0 ) - { - fprintf(stderr, - "coff_ppc_rtype_to_howto: reloc index %d contains junk %d\n", - rel->r_type, junk); - abort(); - } - -#ifdef DEBUG_RELOC - /* now examine flags */ - if (r_flags != 0) - { - fprintf (stderr, "Reloc with flags found!"); - if ( r_flags & IMAGE_REL_PPC_NEG ) - fprintf (stderr, " NEG"); - if ( r_flags & IMAGE_REL_PPC_BRTAKEN ) - fprintf (stderr, " BRTAKEN"); - if ( r_flags & IMAGE_REL_PPC_BRNTAKEN ) - fprintf (stderr, " BRNTAKEN"); - if ( r_flags & IMAGE_REL_PPC_TOCDEFN ) - fprintf (stderr, " TOCDEFN"); - fprintf(stderr, "\n"); - } -#endif - - switch(r_type) - { - case IMAGE_REL_PPC_ADDR32NB: - DUMP_RELOC2(ppc_coff_howto_table[r_type].name, rel); - *addendp -= pe_data(sec->output_section->owner)->pe_opthdr.ImageBase; - howto = ppc_coff_howto_table + r_type; - break; - case IMAGE_REL_PPC_TOCREL16: - DUMP_RELOC2(ppc_coff_howto_table[r_type].name, rel); - if (r_flags & IMAGE_REL_PPC_TOCDEFN) - howto = ppc_coff_howto_table + IMAGE_REL_PPC_TOCREL16_DEFN; - else - howto = ppc_coff_howto_table + IMAGE_REL_PPC_TOCREL16; - break; - case IMAGE_REL_PPC_ADDR16: - case IMAGE_REL_PPC_REL24: - case IMAGE_REL_PPC_ADDR24: - case IMAGE_REL_PPC_ADDR32: - case IMAGE_REL_PPC_IFGLUE: - case IMAGE_REL_PPC_SECTION: - case IMAGE_REL_PPC_SECREL: - DUMP_RELOC2(ppc_coff_howto_table[r_type].name, rel); - howto = ppc_coff_howto_table + r_type; - break; - case IMAGE_REL_PPC_IMGLUE: - DUMP_RELOC2(ppc_coff_howto_table[r_type].name, rel); - howto = ppc_coff_howto_table + r_type; - break; - default: - fprintf(stderr, - "Warning: Unsupported reloc %s [%d] used -- it may not work.\n", - ppc_coff_howto_table[r_type].name, - r_type); - howto = ppc_coff_howto_table + r_type; - break; - } - - return howto; -} - - -/* a cheesy little macro to make the code a little more readable */ -#define HOW2MAP(bfd_rtype,ppc_rtype) \ - case bfd_rtype: return &ppc_coff_howto_table[ppc_rtype] - -static reloc_howto_type *ppc_coff_reloc_type_lookup -PARAMS ((bfd *, bfd_reloc_code_real_type)); - -static reloc_howto_type * -ppc_coff_reloc_type_lookup (abfd, code) - bfd *abfd; - bfd_reloc_code_real_type code; -{ - -#ifdef DEBUG_RELOC - fprintf(stderr, "ppc_coff_reloc_type_lookup for %s\n", - bfd_get_reloc_code_name(code)); -#endif - - switch (code) - { - HOW2MAP(BFD_RELOC_32_GOTOFF, IMAGE_REL_PPC_IMGLUE); - HOW2MAP(BFD_RELOC_16_GOT_PCREL, IMAGE_REL_PPC_IFGLUE); - HOW2MAP(BFD_RELOC_16, IMAGE_REL_PPC_ADDR16); - HOW2MAP(BFD_RELOC_PPC_B26, IMAGE_REL_PPC_REL24); - HOW2MAP(BFD_RELOC_PPC_BA26, IMAGE_REL_PPC_ADDR24); - HOW2MAP(BFD_RELOC_PPC_TOC16, IMAGE_REL_PPC_TOCREL16); - HOW2MAP(BFD_RELOC_16_GOTOFF, IMAGE_REL_PPC_TOCREL16_DEFN); - HOW2MAP(BFD_RELOC_32, IMAGE_REL_PPC_ADDR32); - HOW2MAP(BFD_RELOC_RVA, IMAGE_REL_PPC_ADDR32NB); - default: - return NULL; - } - - return NULL; -} - -#undef HOW2MAP - - -/* Tailor coffcode.h -- macro heaven. */ - -#define RTYPE2HOWTO(cache_ptr, dst) ppc_coff_rtype2howto (cache_ptr, dst) - -#ifndef COFF_IMAGE_WITH_PE -static void -ppc_coff_swap_sym_in_hook (); -#endif - -/* We use the special COFF backend linker, with our own special touch. */ - -#define coff_bfd_reloc_type_lookup ppc_coff_reloc_type_lookup -#define coff_rtype_to_howto coff_ppc_rtype_to_howto -#define coff_relocate_section coff_ppc_relocate_section -#define coff_bfd_final_link ppc_bfd_coff_final_link - -#ifndef COFF_IMAGE_WITH_PE -#define coff_swap_sym_in_hook ppc_coff_swap_sym_in_hook -#endif - -#define SELECT_RELOC(internal, howto) {internal.r_type=howto->type;} - -#define COFF_PAGE_SIZE 0x1000 - -#define POWERPC_LE_PE - -#include "coffcode.h" - - - -#ifndef COFF_IMAGE_WITH_PE -/* FIXME: - What we're trying to do here is allocate a toc section (early), and attach - it to the last bfd to be processed. This avoids the problem of having a toc - written out before all files have been processed. This code allocates - a toc section for every file, and records the last one seen. There are - at least two problems with this approach: - 1. We allocate whole bunches of toc sections that are ignored, but at - at least we will not allocate a toc if no .toc is present. - 2. It's not clear to me that being the last bfd read necessarily means - that you are the last bfd closed. - 3. Doing it on a "swap in" hook depends on when the "swap in" is called, - and how often, etc. It's not clear to me that there isn't a hole here. -*/ - -static void -ppc_coff_swap_sym_in_hook (abfd, ext1, in1) - bfd *abfd; - PTR ext1; - PTR in1; -{ - SYMENT *ext = (SYMENT *)ext1; - struct internal_syment *in = (struct internal_syment *)in1; - - if (bfd_of_toc_owner != 0) /* we already have a toc, so go home */ - return; - - if (strcmp(in->_n._n_name, ".toc") == 0) - { - flagword flags; - register asection *s; - char *foo; - - s = bfd_get_section_by_name ( abfd , TOC_SECTION_NAME); - if (s != NULL) - { - return; - } - - flags = SEC_ALLOC | SEC_LOAD | SEC_HAS_CONTENTS | SEC_IN_MEMORY ; - -#ifdef TOC_DEBUG - fprintf(stderr, - "ppc_coff_swap_sym_in_hook: about to create the %s section\n", - TOC_SECTION_NAME); -#endif - - s = bfd_make_section (abfd, TOC_SECTION_NAME); - - if (s == NULL - || !bfd_set_section_flags (abfd, s, flags) - || !bfd_set_section_alignment (abfd, s, 2)) - { - fprintf(stderr, - "toc section allocation failed!\n"); - abort(); - } - - /* save the bfd for later allocation */ - bfd_of_toc_owner = abfd; - } - - return; -} -#endif - -boolean -ppc_bfd_coff_final_link (); - -#ifndef COFF_IMAGE_WITH_PE - -static boolean -ppc_do_last(abfd) - bfd *abfd; -{ - if (abfd == bfd_of_toc_owner) - return true; - else - return false; -} - -static bfd * -ppc_get_last() -{ - return bfd_of_toc_owner; -} - -/* this piece of machinery exists only to guarantee that the bfd that holds - the toc section is written last. - - This does depend on bfd_make_section attaching a new section to the - end of the section list for the bfd. - - This is otherwise intended to be functionally the same as - cofflink.c:_bfd_coff_final_link(). It is specifically different only - where the POWERPC_LE_PE macro modifies the code. It is left in as a - precise form of comment. krk@cygnus.com -*/ -#define POWERPC_LE_PE - - -/* Do the final link step. */ - -boolean -ppc_bfd_coff_final_link (abfd, info) - bfd *abfd; - struct bfd_link_info *info; -{ - bfd_size_type symesz; - struct coff_final_link_info finfo; - boolean debug_merge_allocated; - asection *o; - struct bfd_link_order *p; - size_t max_sym_count; - size_t max_lineno_count; - size_t max_reloc_count; - size_t max_output_reloc_count; - size_t max_contents_size; - file_ptr rel_filepos; - unsigned int relsz; - file_ptr line_filepos; - unsigned int linesz; - bfd *sub; - bfd_byte *external_relocs = NULL; - char strbuf[STRING_SIZE_SIZE]; - - symesz = bfd_coff_symesz (abfd); - - finfo.info = info; - finfo.output_bfd = abfd; - finfo.strtab = NULL; - finfo.section_info = NULL; - finfo.last_file_index = -1; - finfo.internal_syms = NULL; - finfo.sec_ptrs = NULL; - finfo.sym_indices = NULL; - finfo.outsyms = NULL; - finfo.linenos = NULL; - finfo.contents = NULL; - finfo.external_relocs = NULL; - finfo.internal_relocs = NULL; - debug_merge_allocated = false; - - coff_data (abfd)->link_info = info; - - finfo.strtab = _bfd_stringtab_init (); - if (finfo.strtab == NULL) - goto error_return; - - if (! coff_debug_merge_hash_table_init (&finfo.debug_merge)) - goto error_return; - debug_merge_allocated = true; - - /* Compute the file positions for all the sections. */ - if (! abfd->output_has_begun) - bfd_coff_compute_section_file_positions (abfd); - - /* Count the line numbers and relocation entries required for the - output file. Set the file positions for the relocs. */ - rel_filepos = obj_relocbase (abfd); - relsz = bfd_coff_relsz (abfd); - max_contents_size = 0; - max_lineno_count = 0; - max_reloc_count = 0; - - for (o = abfd->sections; o != NULL; o = o->next) - { - o->reloc_count = 0; - o->lineno_count = 0; - for (p = o->link_order_head; p != NULL; p = p->next) - { - - if (p->type == bfd_indirect_link_order) - { - asection *sec; - - sec = p->u.indirect.section; - - if (info->strip == strip_none - || info->strip == strip_some) - o->lineno_count += sec->lineno_count; - - if (info->relocateable) - o->reloc_count += sec->reloc_count; - - if (sec->_raw_size > max_contents_size) - max_contents_size = sec->_raw_size; - if (sec->lineno_count > max_lineno_count) - max_lineno_count = sec->lineno_count; - if (sec->reloc_count > max_reloc_count) - max_reloc_count = sec->reloc_count; - } - else if (info->relocateable - && (p->type == bfd_section_reloc_link_order - || p->type == bfd_symbol_reloc_link_order)) - ++o->reloc_count; - } - if (o->reloc_count == 0) - o->rel_filepos = 0; - else - { - o->flags |= SEC_RELOC; - o->rel_filepos = rel_filepos; - rel_filepos += o->reloc_count * relsz; - } - } - - /* If doing a relocateable link, allocate space for the pointers we - need to keep. */ - if (info->relocateable) - { - unsigned int i; - - /* We use section_count + 1, rather than section_count, because - the target_index fields are 1 based. */ - finfo.section_info = - ((struct coff_link_section_info *) - bfd_malloc ((abfd->section_count + 1) - * sizeof (struct coff_link_section_info))); - if (finfo.section_info == NULL) - goto error_return; - for (i = 0; i <= abfd->section_count; i++) - { - finfo.section_info[i].relocs = NULL; - finfo.section_info[i].rel_hashes = NULL; - } - } - - /* We now know the size of the relocs, so we can determine the file - positions of the line numbers. */ - line_filepos = rel_filepos; - linesz = bfd_coff_linesz (abfd); - max_output_reloc_count = 0; - for (o = abfd->sections; o != NULL; o = o->next) - { - if (o->lineno_count == 0) - o->line_filepos = 0; - else - { - o->line_filepos = line_filepos; - line_filepos += o->lineno_count * linesz; - } - - if (o->reloc_count != 0) - { - /* We don't know the indices of global symbols until we have - written out all the local symbols. For each section in - the output file, we keep an array of pointers to hash - table entries. Each entry in the array corresponds to a - reloc. When we find a reloc against a global symbol, we - set the corresponding entry in this array so that we can - fix up the symbol index after we have written out all the - local symbols. - - Because of this problem, we also keep the relocs in - memory until the end of the link. This wastes memory, - but only when doing a relocateable link, which is not the - common case. */ - BFD_ASSERT (info->relocateable); - finfo.section_info[o->target_index].relocs = - ((struct internal_reloc *) - bfd_malloc (o->reloc_count * sizeof (struct internal_reloc))); - finfo.section_info[o->target_index].rel_hashes = - ((struct coff_link_hash_entry **) - bfd_malloc (o->reloc_count - * sizeof (struct coff_link_hash_entry *))); - if (finfo.section_info[o->target_index].relocs == NULL - || finfo.section_info[o->target_index].rel_hashes == NULL) - goto error_return; - - if (o->reloc_count > max_output_reloc_count) - max_output_reloc_count = o->reloc_count; - } - - /* Reset the reloc and lineno counts, so that we can use them to - count the number of entries we have output so far. */ - o->reloc_count = 0; - o->lineno_count = 0; - } - - obj_sym_filepos (abfd) = line_filepos; - - /* Figure out the largest number of symbols in an input BFD. Take - the opportunity to clear the output_has_begun fields of all the - input BFD's. */ - max_sym_count = 0; - for (sub = info->input_bfds; sub != NULL; sub = sub->link_next) - { - size_t sz; - - sub->output_has_begun = false; - sz = obj_raw_syment_count (sub); - if (sz > max_sym_count) - max_sym_count = sz; - } - - /* Allocate some buffers used while linking. */ - finfo.internal_syms = ((struct internal_syment *) - bfd_malloc (max_sym_count - * sizeof (struct internal_syment))); - finfo.sec_ptrs = (asection **) bfd_malloc (max_sym_count - * sizeof (asection *)); - finfo.sym_indices = (long *) bfd_malloc (max_sym_count * sizeof (long)); - finfo.outsyms = ((bfd_byte *) - bfd_malloc ((size_t) ((max_sym_count + 1) * symesz))); - finfo.linenos = (bfd_byte *) bfd_malloc (max_lineno_count - * bfd_coff_linesz (abfd)); - finfo.contents = (bfd_byte *) bfd_malloc (max_contents_size); - finfo.external_relocs = (bfd_byte *) bfd_malloc (max_reloc_count * relsz); - if (! info->relocateable) - finfo.internal_relocs = ((struct internal_reloc *) - bfd_malloc (max_reloc_count - * sizeof (struct internal_reloc))); - if ((finfo.internal_syms == NULL && max_sym_count > 0) - || (finfo.sec_ptrs == NULL && max_sym_count > 0) - || (finfo.sym_indices == NULL && max_sym_count > 0) - || finfo.outsyms == NULL - || (finfo.linenos == NULL && max_lineno_count > 0) - || (finfo.contents == NULL && max_contents_size > 0) - || (finfo.external_relocs == NULL && max_reloc_count > 0) - || (! info->relocateable - && finfo.internal_relocs == NULL - && max_reloc_count > 0)) - goto error_return; - - /* We now know the position of everything in the file, except that - we don't know the size of the symbol table and therefore we don't - know where the string table starts. We just build the string - table in memory as we go along. We process all the relocations - for a single input file at once. */ - obj_raw_syment_count (abfd) = 0; - - if (coff_backend_info (abfd)->_bfd_coff_start_final_link) - { - if (! bfd_coff_start_final_link (abfd, info)) - goto error_return; - } - - for (o = abfd->sections; o != NULL; o = o->next) - { - for (p = o->link_order_head; p != NULL; p = p->next) - { - if (p->type == bfd_indirect_link_order - && (bfd_get_flavour (p->u.indirect.section->owner) - == bfd_target_coff_flavour)) - { - sub = p->u.indirect.section->owner; -#ifdef POWERPC_LE_PE - if (! sub->output_has_begun && !ppc_do_last(sub)) -#else - if (! sub->output_has_begun) -#endif - { - if (! _bfd_coff_link_input_bfd (&finfo, sub)) - goto error_return; - sub->output_has_begun = true; - } - } - else if (p->type == bfd_section_reloc_link_order - || p->type == bfd_symbol_reloc_link_order) - { - if (! _bfd_coff_reloc_link_order (abfd, &finfo, o, p)) - goto error_return; - } - else - { - if (! _bfd_default_link_order (abfd, info, o, p)) - goto error_return; - } - } - } - -#ifdef POWERPC_LE_PE - { - extern bfd* ppc_get_last(); - bfd* last_one = ppc_get_last(); - if (last_one) - { - if (! _bfd_coff_link_input_bfd (&finfo, last_one)) - goto error_return; - } - last_one->output_has_begun = true; - } -#endif - - /* Free up the buffers used by _bfd_coff_link_input_bfd. */ - - coff_debug_merge_hash_table_free (&finfo.debug_merge); - debug_merge_allocated = false; - - if (finfo.internal_syms != NULL) - { - free (finfo.internal_syms); - finfo.internal_syms = NULL; - } - if (finfo.sec_ptrs != NULL) - { - free (finfo.sec_ptrs); - finfo.sec_ptrs = NULL; - } - if (finfo.sym_indices != NULL) - { - free (finfo.sym_indices); - finfo.sym_indices = NULL; - } - if (finfo.linenos != NULL) - { - free (finfo.linenos); - finfo.linenos = NULL; - } - if (finfo.contents != NULL) - { - free (finfo.contents); - finfo.contents = NULL; - } - if (finfo.external_relocs != NULL) - { - free (finfo.external_relocs); - finfo.external_relocs = NULL; - } - if (finfo.internal_relocs != NULL) - { - free (finfo.internal_relocs); - finfo.internal_relocs = NULL; - } - - /* The value of the last C_FILE symbol is supposed to be the symbol - index of the first external symbol. Write it out again if - necessary. */ - if (finfo.last_file_index != -1 - && (unsigned int) finfo.last_file.n_value != obj_raw_syment_count (abfd)) - { - finfo.last_file.n_value = obj_raw_syment_count (abfd); - bfd_coff_swap_sym_out (abfd, (PTR) &finfo.last_file, - (PTR) finfo.outsyms); - if (bfd_seek (abfd, - (obj_sym_filepos (abfd) - + finfo.last_file_index * symesz), - SEEK_SET) != 0 - || bfd_write (finfo.outsyms, symesz, 1, abfd) != symesz) - return false; - } - - /* Write out the global symbols. */ - finfo.failed = false; - coff_link_hash_traverse (coff_hash_table (info), _bfd_coff_write_global_sym, - (PTR) &finfo); - if (finfo.failed) - goto error_return; - - /* The outsyms buffer is used by _bfd_coff_write_global_sym. */ - if (finfo.outsyms != NULL) - { - free (finfo.outsyms); - finfo.outsyms = NULL; - } - - if (info->relocateable) - { - /* Now that we have written out all the global symbols, we know - the symbol indices to use for relocs against them, and we can - finally write out the relocs. */ - external_relocs = ((bfd_byte *) - bfd_malloc (max_output_reloc_count * relsz)); - if (external_relocs == NULL) - goto error_return; - - for (o = abfd->sections; o != NULL; o = o->next) - { - struct internal_reloc *irel; - struct internal_reloc *irelend; - struct coff_link_hash_entry **rel_hash; - bfd_byte *erel; - - if (o->reloc_count == 0) - continue; - - irel = finfo.section_info[o->target_index].relocs; - irelend = irel + o->reloc_count; - rel_hash = finfo.section_info[o->target_index].rel_hashes; - erel = external_relocs; - for (; irel < irelend; irel++, rel_hash++, erel += relsz) - { - if (*rel_hash != NULL) - { - BFD_ASSERT ((*rel_hash)->indx >= 0); - irel->r_symndx = (*rel_hash)->indx; - } - bfd_coff_swap_reloc_out (abfd, (PTR) irel, (PTR) erel); - } - - if (bfd_seek (abfd, o->rel_filepos, SEEK_SET) != 0 - || bfd_write ((PTR) external_relocs, relsz, o->reloc_count, - abfd) != relsz * o->reloc_count) - goto error_return; - } - - free (external_relocs); - external_relocs = NULL; - } - - /* Free up the section information. */ - if (finfo.section_info != NULL) - { - unsigned int i; - - for (i = 0; i < abfd->section_count; i++) - { - if (finfo.section_info[i].relocs != NULL) - free (finfo.section_info[i].relocs); - if (finfo.section_info[i].rel_hashes != NULL) - free (finfo.section_info[i].rel_hashes); - } - free (finfo.section_info); - finfo.section_info = NULL; - } - - /* Write out the string table. */ - if (obj_raw_syment_count (abfd) != 0) - { - if (bfd_seek (abfd, - (obj_sym_filepos (abfd) - + obj_raw_syment_count (abfd) * symesz), - SEEK_SET) != 0) - return false; - -#if STRING_SIZE_SIZE == 4 - bfd_h_put_32 (abfd, - _bfd_stringtab_size (finfo.strtab) + STRING_SIZE_SIZE, - (bfd_byte *) strbuf); -#else - #error Change bfd_h_put_32 -#endif - - if (bfd_write (strbuf, 1, STRING_SIZE_SIZE, abfd) != STRING_SIZE_SIZE) - return false; - - if (! _bfd_stringtab_emit (abfd, finfo.strtab)) - return false; - } - - _bfd_stringtab_free (finfo.strtab); - - /* Setting bfd_get_symcount to 0 will cause write_object_contents to - not try to write out the symbols. */ - bfd_get_symcount (abfd) = 0; - - return true; - - error_return: - if (debug_merge_allocated) - coff_debug_merge_hash_table_free (&finfo.debug_merge); - if (finfo.strtab != NULL) - _bfd_stringtab_free (finfo.strtab); - if (finfo.section_info != NULL) - { - unsigned int i; - - for (i = 0; i < abfd->section_count; i++) - { - if (finfo.section_info[i].relocs != NULL) - free (finfo.section_info[i].relocs); - if (finfo.section_info[i].rel_hashes != NULL) - free (finfo.section_info[i].rel_hashes); - } - free (finfo.section_info); - } - if (finfo.internal_syms != NULL) - free (finfo.internal_syms); - if (finfo.sec_ptrs != NULL) - free (finfo.sec_ptrs); - if (finfo.sym_indices != NULL) - free (finfo.sym_indices); - if (finfo.outsyms != NULL) - free (finfo.outsyms); - if (finfo.linenos != NULL) - free (finfo.linenos); - if (finfo.contents != NULL) - free (finfo.contents); - if (finfo.external_relocs != NULL) - free (finfo.external_relocs); - if (finfo.internal_relocs != NULL) - free (finfo.internal_relocs); - if (external_relocs != NULL) - free (external_relocs); - return false; -} -#endif - - -/* The transfer vectors that lead the outside world to all of the above. */ - -#ifdef TARGET_LITTLE_SYM -const bfd_target -TARGET_LITTLE_SYM = -{ - TARGET_LITTLE_NAME, /* name or coff-arm-little */ - bfd_target_coff_flavour, - BFD_ENDIAN_LITTLE, /* data byte order is little */ - BFD_ENDIAN_LITTLE, /* header byte order is little */ - - (HAS_RELOC | EXEC_P | /* FIXME: object flags */ - HAS_LINENO | HAS_DEBUG | - HAS_SYMS | HAS_LOCALS | WP_TEXT), - - (SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD | SEC_RELOC), /* section flags */ - 0, /* leading char */ - '/', /* ar_pad_char */ - 15, /* ar_max_namelen??? FIXMEmgo */ - - bfd_getl64, bfd_getl_signed_64, bfd_putl64, - bfd_getl32, bfd_getl_signed_32, bfd_putl32, - bfd_getl16, bfd_getl_signed_16, bfd_putl16, /* data */ - - bfd_getl64, bfd_getl_signed_64, bfd_putl64, - bfd_getl32, bfd_getl_signed_32, bfd_putl32, - bfd_getl16, bfd_getl_signed_16, bfd_putl16, /* hdrs */ - - {_bfd_dummy_target, coff_object_p, /* bfd_check_format */ - bfd_generic_archive_p, /* _bfd_dummy_target */ coff_object_p }, - {bfd_false, coff_mkobject, _bfd_generic_mkarchive, /* bfd_set_format */ - bfd_false}, - {bfd_false, coff_write_object_contents, /* bfd_write_contents */ - _bfd_write_archive_contents, bfd_false}, - - BFD_JUMP_TABLE_GENERIC (coff), - BFD_JUMP_TABLE_COPY (coff), - BFD_JUMP_TABLE_CORE (_bfd_nocore), - BFD_JUMP_TABLE_ARCHIVE (_bfd_archive_coff), - BFD_JUMP_TABLE_SYMBOLS (coff), - BFD_JUMP_TABLE_RELOCS (coff), - BFD_JUMP_TABLE_WRITE (coff), - BFD_JUMP_TABLE_LINK (coff), - BFD_JUMP_TABLE_DYNAMIC (_bfd_nodynamic), - - COFF_SWAP_TABLE, -}; -#endif - -#ifdef TARGET_BIG_SYM -const bfd_target -TARGET_BIG_SYM = -{ - TARGET_BIG_NAME, - bfd_target_coff_flavour, - BFD_ENDIAN_BIG, /* data byte order is big */ - BFD_ENDIAN_BIG, /* header byte order is big */ - - (HAS_RELOC | EXEC_P | /* FIXME: object flags */ - HAS_LINENO | HAS_DEBUG | - HAS_SYMS | HAS_LOCALS | WP_TEXT), - - (SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD | SEC_RELOC), /* section flags */ - 0, /* leading char */ - '/', /* ar_pad_char */ - 15, /* ar_max_namelen??? FIXMEmgo */ - - bfd_getb64, bfd_getb_signed_64, bfd_putb64, - bfd_getb32, bfd_getb_signed_32, bfd_putb32, - bfd_getb16, bfd_getb_signed_16, bfd_putb16, /* data */ - - bfd_getb64, bfd_getb_signed_64, bfd_putb64, - bfd_getb32, bfd_getb_signed_32, bfd_putb32, - bfd_getb16, bfd_getb_signed_16, bfd_putb16, /* hdrs */ - - {_bfd_dummy_target, coff_object_p, /* bfd_check_format */ - bfd_generic_archive_p, /* _bfd_dummy_target */ coff_object_p }, - {bfd_false, coff_mkobject, _bfd_generic_mkarchive, /* bfd_set_format */ - bfd_false}, - {bfd_false, coff_write_object_contents, /* bfd_write_contents */ - _bfd_write_archive_contents, bfd_false}, - - BFD_JUMP_TABLE_GENERIC (coff), - BFD_JUMP_TABLE_COPY (coff), - BFD_JUMP_TABLE_CORE (_bfd_nocore), - BFD_JUMP_TABLE_ARCHIVE (_bfd_archive_coff), - BFD_JUMP_TABLE_SYMBOLS (coff), - BFD_JUMP_TABLE_RELOCS (coff), - BFD_JUMP_TABLE_WRITE (coff), - BFD_JUMP_TABLE_LINK (coff), - BFD_JUMP_TABLE_DYNAMIC (_bfd_nodynamic), - - COFF_SWAP_TABLE, -}; - -#endif diff --git a/contrib/gdb/bfd/coff-rs6000.c b/contrib/gdb/bfd/coff-rs6000.c deleted file mode 100644 index c065bd4f0054e..0000000000000 --- a/contrib/gdb/bfd/coff-rs6000.c +++ /dev/null @@ -1,1403 +0,0 @@ -/* BFD back-end for IBM RS/6000 "XCOFF" files. - Copyright 1990, 91, 92, 93, 94, 95, 1996 Free Software Foundation, Inc. - FIXME: Can someone provide a transliteration of this name into ASCII? - Using the following chars caused a compiler warning on HIUX (so I replaced - them with octal escapes), and isn't useful without an understanding of what - character set it is. - Written by Metin G. Ozisik, Mimi Ph\373\364ng-Th\345o V\365, - and John Gilmore. - Archive support from Damon A. Permezel. - Contributed by IBM Corporation and Cygnus Support. - -This file is part of BFD, the Binary File Descriptor library. - -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 2 of the License, 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ - -/* Internalcoff.h and coffcode.h modify themselves based on this flag. */ -#define RS6000COFF_C 1 - -#include "bfd.h" -#include "sysdep.h" -#include "libbfd.h" -#include "obstack.h" -#include "coff/internal.h" -#include "coff/rs6000.h" -#include "libcoff.h" - -/* The main body of code is in coffcode.h. */ - -static boolean xcoff_mkobject PARAMS ((bfd *)); -static boolean xcoff_copy_private_bfd_data PARAMS ((bfd *, bfd *)); -static void xcoff_rtype2howto - PARAMS ((arelent *, struct internal_reloc *)); -static reloc_howto_type *xcoff_reloc_type_lookup - PARAMS ((bfd *, bfd_reloc_code_real_type)); -static boolean xcoff_slurp_armap PARAMS ((bfd *)); -static const bfd_target *xcoff_archive_p PARAMS ((bfd *)); -static PTR xcoff_read_ar_hdr PARAMS ((bfd *)); -static bfd *xcoff_openr_next_archived_file PARAMS ((bfd *, bfd *)); -static int xcoff_generic_stat_arch_elt PARAMS ((bfd *, struct stat *)); -static const char *normalize_filename PARAMS ((bfd *)); -static boolean xcoff_write_armap - PARAMS ((bfd *, unsigned int, struct orl *, unsigned int, int)); -static boolean xcoff_write_archive_contents PARAMS ((bfd *)); - -/* We use our own tdata type. Its first field is the COFF tdata type, - so the COFF routines are compatible. */ - -static boolean -xcoff_mkobject (abfd) - bfd *abfd; -{ - coff_data_type *coff; - - abfd->tdata.xcoff_obj_data = - ((struct xcoff_tdata *) - bfd_zalloc (abfd, sizeof (struct xcoff_tdata))); - if (abfd->tdata.xcoff_obj_data == NULL) - return false; - coff = coff_data (abfd); - coff->symbols = (coff_symbol_type *) NULL; - coff->conversion_table = (unsigned int *) NULL; - coff->raw_syments = (struct coff_ptr_struct *) NULL; - coff->relocbase = 0; - - xcoff_data (abfd)->modtype = ('1' << 8) | 'L'; - - /* We set cputype to -1 to indicate that it has not been - initialized. */ - xcoff_data (abfd)->cputype = -1; - - xcoff_data (abfd)->csects = NULL; - xcoff_data (abfd)->debug_indices = NULL; - - return true; -} - -/* Copy XCOFF data from one BFD to another. */ - -static boolean -xcoff_copy_private_bfd_data (ibfd, obfd) - bfd *ibfd; - bfd *obfd; -{ - struct xcoff_tdata *ix, *ox; - asection *sec; - - if (ibfd->xvec != obfd->xvec) - return true; - ix = xcoff_data (ibfd); - ox = xcoff_data (obfd); - ox->full_aouthdr = ix->full_aouthdr; - ox->toc = ix->toc; - if (ix->sntoc == 0) - ox->sntoc = 0; - else - { - sec = coff_section_from_bfd_index (ibfd, ix->sntoc); - if (sec == NULL) - ox->sntoc = 0; - else - ox->sntoc = sec->output_section->target_index; - } - if (ix->snentry == 0) - ox->snentry = 0; - else - { - sec = coff_section_from_bfd_index (ibfd, ix->snentry); - if (sec == NULL) - ox->snentry = 0; - else - ox->snentry = sec->output_section->target_index; - } - ox->text_align_power = ix->text_align_power; - ox->data_align_power = ix->data_align_power; - ox->modtype = ix->modtype; - ox->cputype = ix->cputype; - ox->maxdata = ix->maxdata; - ox->maxstack = ix->maxstack; - return true; -} - -/* The XCOFF reloc table. Actually, XCOFF relocations specify the - bitsize and whether they are signed or not, along with a - conventional type. This table is for the types, which are used for - different algorithms for putting in the reloc. Many of these - relocs need special_function entries, which I have not written. */ - -static reloc_howto_type xcoff_howto_table[] = -{ - /* Standard 32 bit relocation. */ - HOWTO (0, /* type */ - 0, /* rightshift */ - 2, /* size (0 = byte, 1 = short, 2 = long) */ - 32, /* bitsize */ - false, /* pc_relative */ - 0, /* bitpos */ - complain_overflow_bitfield, /* complain_on_overflow */ - 0, /* special_function */ - "R_POS", /* name */ - true, /* partial_inplace */ - 0xffffffff, /* src_mask */ - 0xffffffff, /* dst_mask */ - false), /* pcrel_offset */ - - /* 32 bit relocation, but store negative value. */ - HOWTO (1, /* type */ - 0, /* rightshift */ - -2, /* size (0 = byte, 1 = short, 2 = long) */ - 32, /* bitsize */ - false, /* pc_relative */ - 0, /* bitpos */ - complain_overflow_bitfield, /* complain_on_overflow */ - 0, /* special_function */ - "R_NEG", /* name */ - true, /* partial_inplace */ - 0xffffffff, /* src_mask */ - 0xffffffff, /* dst_mask */ - false), /* pcrel_offset */ - - /* 32 bit PC relative relocation. */ - HOWTO (2, /* type */ - 0, /* rightshift */ - 2, /* size (0 = byte, 1 = short, 2 = long) */ - 32, /* bitsize */ - true, /* pc_relative */ - 0, /* bitpos */ - complain_overflow_signed, /* complain_on_overflow */ - 0, /* special_function */ - "R_REL", /* name */ - true, /* partial_inplace */ - 0xffffffff, /* src_mask */ - 0xffffffff, /* dst_mask */ - false), /* pcrel_offset */ - - /* 16 bit TOC relative relocation. */ - HOWTO (3, /* type */ - 0, /* rightshift */ - 1, /* size (0 = byte, 1 = short, 2 = long) */ - 16, /* bitsize */ - false, /* pc_relative */ - 0, /* bitpos */ - complain_overflow_bitfield, /* complain_on_overflow */ - 0, /* special_function */ - "R_TOC", /* name */ - true, /* partial_inplace */ - 0xffff, /* src_mask */ - 0xffff, /* dst_mask */ - false), /* pcrel_offset */ - - /* I don't really know what this is. */ - HOWTO (4, /* type */ - 1, /* rightshift */ - 2, /* size (0 = byte, 1 = short, 2 = long) */ - 32, /* bitsize */ - false, /* pc_relative */ - 0, /* bitpos */ - complain_overflow_bitfield, /* complain_on_overflow */ - 0, /* special_function */ - "R_RTB", /* name */ - true, /* partial_inplace */ - 0xffffffff, /* src_mask */ - 0xffffffff, /* dst_mask */ - false), /* pcrel_offset */ - - /* External TOC relative symbol. */ - HOWTO (5, /* type */ - 0, /* rightshift */ - 2, /* size (0 = byte, 1 = short, 2 = long) */ - 16, /* bitsize */ - false, /* pc_relative */ - 0, /* bitpos */ - complain_overflow_bitfield, /* complain_on_overflow */ - 0, /* special_function */ - "R_GL", /* name */ - true, /* partial_inplace */ - 0xffff, /* src_mask */ - 0xffff, /* dst_mask */ - false), /* pcrel_offset */ - - /* Local TOC relative symbol. */ - HOWTO (6, /* type */ - 0, /* rightshift */ - 2, /* size (0 = byte, 1 = short, 2 = long) */ - 16, /* bitsize */ - false, /* pc_relative */ - 0, /* bitpos */ - complain_overflow_bitfield, /* complain_on_overflow */ - 0, /* special_function */ - "R_TCL", /* name */ - true, /* partial_inplace */ - 0xffff, /* src_mask */ - 0xffff, /* dst_mask */ - false), /* pcrel_offset */ - - { 7 }, - - /* Non modifiable absolute branch. */ - HOWTO (8, /* type */ - 0, /* rightshift */ - 2, /* size (0 = byte, 1 = short, 2 = long) */ - 26, /* bitsize */ - false, /* pc_relative */ - 0, /* bitpos */ - complain_overflow_bitfield, /* complain_on_overflow */ - 0, /* special_function */ - "R_BA", /* name */ - true, /* partial_inplace */ - 0x3fffffc, /* src_mask */ - 0x3fffffc, /* dst_mask */ - false), /* pcrel_offset */ - - { 9 }, - - /* Non modifiable relative branch. */ - HOWTO (0xa, /* type */ - 0, /* rightshift */ - 2, /* size (0 = byte, 1 = short, 2 = long) */ - 26, /* bitsize */ - true, /* pc_relative */ - 0, /* bitpos */ - complain_overflow_signed, /* complain_on_overflow */ - 0, /* special_function */ - "R_BR", /* name */ - true, /* partial_inplace */ - 0x3fffffc, /* src_mask */ - 0x3fffffc, /* dst_mask */ - false), /* pcrel_offset */ - - { 0xb }, - - /* Indirect load. */ - HOWTO (0xc, /* type */ - 0, /* rightshift */ - 2, /* size (0 = byte, 1 = short, 2 = long) */ - 16, /* bitsize */ - false, /* pc_relative */ - 0, /* bitpos */ - complain_overflow_bitfield, /* complain_on_overflow */ - 0, /* special_function */ - "R_RL", /* name */ - true, /* partial_inplace */ - 0xffff, /* src_mask */ - 0xffff, /* dst_mask */ - false), /* pcrel_offset */ - - /* Load address. */ - HOWTO (0xd, /* type */ - 0, /* rightshift */ - 2, /* size (0 = byte, 1 = short, 2 = long) */ - 16, /* bitsize */ - false, /* pc_relative */ - 0, /* bitpos */ - complain_overflow_bitfield, /* complain_on_overflow */ - 0, /* special_function */ - "R_RLA", /* name */ - true, /* partial_inplace */ - 0xffff, /* src_mask */ - 0xffff, /* dst_mask */ - false), /* pcrel_offset */ - - { 0xe }, - - /* Non-relocating reference. */ - HOWTO (0xf, /* type */ - 0, /* rightshift */ - 2, /* size (0 = byte, 1 = short, 2 = long) */ - 32, /* bitsize */ - false, /* pc_relative */ - 0, /* bitpos */ - complain_overflow_bitfield, /* complain_on_overflow */ - 0, /* special_function */ - "R_REF", /* name */ - false, /* partial_inplace */ - 0, /* src_mask */ - 0, /* dst_mask */ - false), /* pcrel_offset */ - - { 0x10 }, - { 0x11 }, - - /* TOC relative indirect load. */ - HOWTO (0x12, /* type */ - 0, /* rightshift */ - 2, /* size (0 = byte, 1 = short, 2 = long) */ - 16, /* bitsize */ - false, /* pc_relative */ - 0, /* bitpos */ - complain_overflow_bitfield, /* complain_on_overflow */ - 0, /* special_function */ - "R_TRL", /* name */ - true, /* partial_inplace */ - 0xffff, /* src_mask */ - 0xffff, /* dst_mask */ - false), /* pcrel_offset */ - - /* TOC relative load address. */ - HOWTO (0x13, /* type */ - 0, /* rightshift */ - 2, /* size (0 = byte, 1 = short, 2 = long) */ - 16, /* bitsize */ - false, /* pc_relative */ - 0, /* bitpos */ - complain_overflow_bitfield, /* complain_on_overflow */ - 0, /* special_function */ - "R_TRLA", /* name */ - true, /* partial_inplace */ - 0xffff, /* src_mask */ - 0xffff, /* dst_mask */ - false), /* pcrel_offset */ - - /* Modifiable relative branch. */ - HOWTO (0x14, /* type */ - 1, /* rightshift */ - 2, /* size (0 = byte, 1 = short, 2 = long) */ - 32, /* bitsize */ - false, /* pc_relative */ - 0, /* bitpos */ - complain_overflow_bitfield, /* complain_on_overflow */ - 0, /* special_function */ - "R_RRTBI", /* name */ - true, /* partial_inplace */ - 0xffffffff, /* src_mask */ - 0xffffffff, /* dst_mask */ - false), /* pcrel_offset */ - - /* Modifiable absolute branch. */ - HOWTO (0x15, /* type */ - 1, /* rightshift */ - 2, /* size (0 = byte, 1 = short, 2 = long) */ - 32, /* bitsize */ - false, /* pc_relative */ - 0, /* bitpos */ - complain_overflow_bitfield, /* complain_on_overflow */ - 0, /* special_function */ - "R_RRTBA", /* name */ - true, /* partial_inplace */ - 0xffffffff, /* src_mask */ - 0xffffffff, /* dst_mask */ - false), /* pcrel_offset */ - - /* Modifiable call absolute indirect. */ - HOWTO (0x16, /* type */ - 0, /* rightshift */ - 2, /* size (0 = byte, 1 = short, 2 = long) */ - 16, /* bitsize */ - false, /* pc_relative */ - 0, /* bitpos */ - complain_overflow_bitfield, /* complain_on_overflow */ - 0, /* special_function */ - "R_CAI", /* name */ - true, /* partial_inplace */ - 0xffff, /* src_mask */ - 0xffff, /* dst_mask */ - false), /* pcrel_offset */ - - /* Modifiable call relative. */ - HOWTO (0x17, /* type */ - 0, /* rightshift */ - 2, /* size (0 = byte, 1 = short, 2 = long) */ - 16, /* bitsize */ - false, /* pc_relative */ - 0, /* bitpos */ - complain_overflow_bitfield, /* complain_on_overflow */ - 0, /* special_function */ - "R_CREL", /* name */ - true, /* partial_inplace */ - 0xffff, /* src_mask */ - 0xffff, /* dst_mask */ - false), /* pcrel_offset */ - - /* Modifiable branch absolute. */ - HOWTO (0x18, /* type */ - 0, /* rightshift */ - 2, /* size (0 = byte, 1 = short, 2 = long) */ - 16, /* bitsize */ - false, /* pc_relative */ - 0, /* bitpos */ - complain_overflow_bitfield, /* complain_on_overflow */ - 0, /* special_function */ - "R_RBA", /* name */ - true, /* partial_inplace */ - 0xffff, /* src_mask */ - 0xffff, /* dst_mask */ - false), /* pcrel_offset */ - - /* Modifiable branch absolute. */ - HOWTO (0x19, /* type */ - 0, /* rightshift */ - 2, /* size (0 = byte, 1 = short, 2 = long) */ - 16, /* bitsize */ - false, /* pc_relative */ - 0, /* bitpos */ - complain_overflow_bitfield, /* complain_on_overflow */ - 0, /* special_function */ - "R_RBAC", /* name */ - true, /* partial_inplace */ - 0xffff, /* src_mask */ - 0xffff, /* dst_mask */ - false), /* pcrel_offset */ - - /* Modifiable branch relative. */ - HOWTO (0x1a, /* type */ - 0, /* rightshift */ - 2, /* size (0 = byte, 1 = short, 2 = long) */ - 26, /* bitsize */ - false, /* pc_relative */ - 0, /* bitpos */ - complain_overflow_signed, /* complain_on_overflow */ - 0, /* special_function */ - "R_RBR", /* name */ - true, /* partial_inplace */ - 0xffff, /* src_mask */ - 0xffff, /* dst_mask */ - false), /* pcrel_offset */ - - /* Modifiable branch absolute. */ - HOWTO (0x1b, /* type */ - 0, /* rightshift */ - 2, /* size (0 = byte, 1 = short, 2 = long) */ - 16, /* bitsize */ - false, /* pc_relative */ - 0, /* bitpos */ - complain_overflow_bitfield, /* complain_on_overflow */ - 0, /* special_function */ - "R_RBRC", /* name */ - true, /* partial_inplace */ - 0xffff, /* src_mask */ - 0xffff, /* dst_mask */ - false) /* pcrel_offset */ -}; - -static void -xcoff_rtype2howto (relent, internal) - arelent *relent; - struct internal_reloc *internal; -{ - relent->howto = xcoff_howto_table + internal->r_type; - - /* The r_size field of an XCOFF reloc encodes the bitsize of the - relocation, as well as indicating whether it is signed or not. - Doublecheck that the relocation information gathered from the - type matches this information. */ - if (relent->howto->bitsize != ((unsigned int) internal->r_size & 0x1f) + 1) - abort (); -#if 0 - if ((internal->r_size & 0x80) != 0 - ? (relent->howto->complain_on_overflow != complain_overflow_signed) - : (relent->howto->complain_on_overflow != complain_overflow_bitfield)) - abort (); -#endif -} - -static reloc_howto_type * -xcoff_reloc_type_lookup (abfd, code) - bfd *abfd; - bfd_reloc_code_real_type code; -{ - switch (code) - { - case BFD_RELOC_PPC_B26: - return &xcoff_howto_table[0xa]; - case BFD_RELOC_PPC_BA26: - return &xcoff_howto_table[8]; - case BFD_RELOC_PPC_TOC16: - return &xcoff_howto_table[3]; - case BFD_RELOC_32: - case BFD_RELOC_CTOR: - return &xcoff_howto_table[0]; - default: - return NULL; - } -} - -#define SELECT_RELOC(internal, howto) \ - { \ - internal.r_type = howto->type; \ - internal.r_size = \ - ((howto->complain_on_overflow == complain_overflow_signed \ - ? 0x80 \ - : 0) \ - | (howto->bitsize - 1)); \ - } - -#define COFF_DEFAULT_SECTION_ALIGNMENT_POWER (3) - -#define COFF_LONG_FILENAMES - -#define RTYPE2HOWTO(cache_ptr, dst) xcoff_rtype2howto (cache_ptr, dst) - -#define coff_mkobject xcoff_mkobject -#define coff_bfd_copy_private_bfd_data xcoff_copy_private_bfd_data -#define coff_bfd_reloc_type_lookup xcoff_reloc_type_lookup -#define coff_relocate_section _bfd_ppc_xcoff_relocate_section - -#include "coffcode.h" - -/* XCOFF archive support. The original version of this code was by - Damon A. Permezel. It was enhanced to permit cross support, and - writing archive files, by Ian Lance Taylor, Cygnus Support. - - XCOFF uses its own archive format. Everything is hooked together - with file offset links, so it is possible to rapidly update an - archive in place. Of course, we don't do that. An XCOFF archive - has a real file header, not just an ARMAG string. The structure of - the file header and of each archive header appear below. - - An XCOFF archive also has a member table, which is a list of - elements in the archive (you can get that by looking through the - linked list, but you have to read a lot more of the file). The - member table has a normal archive header with an empty name. It is - normally (and perhaps must be) the second to last entry in the - archive. The member table data is almost printable ASCII. It - starts with a 12 character decimal string which is the number of - entries in the table. For each entry it has a 12 character decimal - string which is the offset in the archive of that member. These - entries are followed by a series of null terminated strings which - are the member names for each entry. - - Finally, an XCOFF archive has a global symbol table, which is what - we call the armap. The global symbol table has a normal archive - header with an empty name. It is normally (and perhaps must be) - the last entry in the archive. The contents start with a four byte - binary number which is the number of entries. This is followed by - a that many four byte binary numbers; each is the file offset of an - entry in the archive. These numbers are followed by a series of - null terminated strings, which are symbol names. */ - -/* XCOFF archives use this as a magic string. */ - -#define XCOFFARMAG "<aiaff>\012" -#define SXCOFFARMAG 8 - -/* This terminates an XCOFF archive member name. */ - -#define XCOFFARFMAG "`\012" -#define SXCOFFARFMAG 2 - -/* XCOFF archives start with this (printable) structure. */ - -struct xcoff_ar_file_hdr -{ - /* Magic string. */ - char magic[SXCOFFARMAG]; - - /* Offset of the member table (decimal ASCII string). */ - char memoff[12]; - - /* Offset of the global symbol table (decimal ASCII string). */ - char symoff[12]; - - /* Offset of the first member in the archive (decimal ASCII string). */ - char firstmemoff[12]; - - /* Offset of the last member in the archive (decimal ASCII string). */ - char lastmemoff[12]; - - /* Offset of the first member on the free list (decimal ASCII - string). */ - char freeoff[12]; -}; - -#define SIZEOF_AR_FILE_HDR (5 * 12 + SXCOFFARMAG) - -/* Each XCOFF archive member starts with this (printable) structure. */ - -struct xcoff_ar_hdr -{ - /* File size not including the header (decimal ASCII string). */ - char size[12]; - - /* File offset of next archive member (decimal ASCII string). */ - char nextoff[12]; - - /* File offset of previous archive member (decimal ASCII string). */ - char prevoff[12]; - - /* File mtime (decimal ASCII string). */ - char date[12]; - - /* File UID (decimal ASCII string). */ - char uid[12]; - - /* File GID (decimal ASCII string). */ - char gid[12]; - - /* File mode (octal ASCII string). */ - char mode[12]; - - /* Length of file name (decimal ASCII string). */ - char namlen[4]; - - /* This structure is followed by the file name. The length of the - name is given in the namlen field. If the length of the name is - odd, the name is followed by a null byte. The name and optional - null byte are followed by XCOFFARFMAG, which is not included in - namlen. The contents of the archive member follow; the number of - bytes is given in the size field. */ -}; - -#define SIZEOF_AR_HDR (7 * 12 + 4) - -/* We store a copy of the xcoff_ar_file_hdr in the tdata field of the - artdata structure. */ -#define xcoff_ardata(abfd) \ - ((struct xcoff_ar_file_hdr *) bfd_ardata (abfd)->tdata) - -/* We store a copy of the xcoff_ar_hdr in the arelt_data field of an - archive element. */ -#define arch_eltdata(bfd) ((struct areltdata *) ((bfd)->arelt_data)) -#define arch_xhdr(bfd) \ - ((struct xcoff_ar_hdr *) arch_eltdata (bfd)->arch_header) - -/* XCOFF archives do not have anything which corresponds to an - extended name table. */ - -#define xcoff_slurp_extended_name_table bfd_false -#define xcoff_construct_extended_name_table \ - ((boolean (*) PARAMS ((bfd *, char **, bfd_size_type *, const char **))) \ - bfd_false) -#define xcoff_truncate_arname bfd_dont_truncate_arname - -/* We can use the standard get_elt_at_index routine. */ - -#define xcoff_get_elt_at_index _bfd_generic_get_elt_at_index - -/* XCOFF archives do not have a timestamp. */ - -#define xcoff_update_armap_timestamp bfd_true - -/* Read in the armap of an XCOFF archive. */ - -static boolean -xcoff_slurp_armap (abfd) - bfd *abfd; -{ - file_ptr off; - struct xcoff_ar_hdr hdr; - size_t namlen; - bfd_size_type sz; - bfd_byte *contents, *cend; - unsigned int c, i; - carsym *arsym; - bfd_byte *p; - - if (xcoff_ardata (abfd) == NULL) - { - bfd_has_map (abfd) = false; - return true; - } - - off = strtol (xcoff_ardata (abfd)->symoff, (char **) NULL, 10); - if (off == 0) - { - bfd_has_map (abfd) = false; - return true; - } - - if (bfd_seek (abfd, off, SEEK_SET) != 0) - return false; - - /* The symbol table starts with a normal archive header. */ - if (bfd_read ((PTR) &hdr, SIZEOF_AR_HDR, 1, abfd) != SIZEOF_AR_HDR) - return false; - - /* Skip the name (normally empty). */ - namlen = strtol (hdr.namlen, (char **) NULL, 10); - if (bfd_seek (abfd, ((namlen + 1) & ~1) + SXCOFFARFMAG, SEEK_CUR) != 0) - return false; - - /* Read in the entire symbol table. */ - sz = strtol (hdr.size, (char **) NULL, 10); - contents = (bfd_byte *) bfd_alloc (abfd, sz); - if (contents == NULL) - return false; - if (bfd_read ((PTR) contents, 1, sz, abfd) != sz) - return false; - - /* The symbol table starts with a four byte count. */ - c = bfd_h_get_32 (abfd, contents); - - if (c * 4 >= sz) - { - bfd_set_error (bfd_error_bad_value); - return false; - } - - bfd_ardata (abfd)->symdefs = ((carsym *) - bfd_alloc (abfd, c * sizeof (carsym))); - if (bfd_ardata (abfd)->symdefs == NULL) - return false; - - /* After the count comes a list of four byte file offsets. */ - for (i = 0, arsym = bfd_ardata (abfd)->symdefs, p = contents + 4; - i < c; - ++i, ++arsym, p += 4) - arsym->file_offset = bfd_h_get_32 (abfd, p); - - /* After the file offsets come null terminated symbol names. */ - cend = contents + sz; - for (i = 0, arsym = bfd_ardata (abfd)->symdefs; - i < c; - ++i, ++arsym, p += strlen ((char *) p) + 1) - { - if (p >= cend) - { - bfd_set_error (bfd_error_bad_value); - return false; - } - arsym->name = (char *) p; - } - - bfd_ardata (abfd)->symdef_count = c; - bfd_has_map (abfd) = true; - - return true; -} - -/* See if this is an XCOFF archive. */ - -static const bfd_target * -xcoff_archive_p (abfd) - bfd *abfd; -{ - struct xcoff_ar_file_hdr hdr; - - if (bfd_read ((PTR) &hdr, SIZEOF_AR_FILE_HDR, 1, abfd) - != SIZEOF_AR_FILE_HDR) - { - if (bfd_get_error () != bfd_error_system_call) - bfd_set_error (bfd_error_wrong_format); - return NULL; - } - - if (strncmp (hdr.magic, XCOFFARMAG, SXCOFFARMAG) != 0) - { - bfd_set_error (bfd_error_wrong_format); - return NULL; - } - - /* We are setting bfd_ardata(abfd) here, but since bfd_ardata - involves a cast, we can't do it as the left operand of - assignment. */ - abfd->tdata.aout_ar_data = - (struct artdata *) bfd_zalloc (abfd, sizeof (struct artdata)); - - if (bfd_ardata (abfd) == (struct artdata *) NULL) - return NULL; - - bfd_ardata (abfd)->first_file_filepos = strtol (hdr.firstmemoff, - (char **) NULL, 10); - bfd_ardata (abfd)->cache = NULL; - bfd_ardata (abfd)->archive_head = NULL; - bfd_ardata (abfd)->symdefs = NULL; - bfd_ardata (abfd)->extended_names = NULL; - - bfd_ardata (abfd)->tdata = bfd_zalloc (abfd, SIZEOF_AR_FILE_HDR); - if (bfd_ardata (abfd)->tdata == NULL) - return NULL; - - memcpy (bfd_ardata (abfd)->tdata, &hdr, SIZEOF_AR_FILE_HDR); - - if (! xcoff_slurp_armap (abfd)) - { - bfd_release (abfd, bfd_ardata (abfd)); - abfd->tdata.aout_ar_data = (struct artdata *) NULL; - return NULL; - } - - return abfd->xvec; -} - -/* Read the archive header in an XCOFF archive. */ - -static PTR -xcoff_read_ar_hdr (abfd) - bfd *abfd; -{ - struct xcoff_ar_hdr hdr; - size_t namlen; - struct xcoff_ar_hdr *hdrp; - struct areltdata *ret; - - if (bfd_read ((PTR) &hdr, SIZEOF_AR_HDR, 1, abfd) != SIZEOF_AR_HDR) - return NULL; - - namlen = strtol (hdr.namlen, (char **) NULL, 10); - hdrp = bfd_alloc (abfd, SIZEOF_AR_HDR + namlen + 1); - if (hdrp == NULL) - return NULL; - memcpy (hdrp, &hdr, SIZEOF_AR_HDR); - if (bfd_read ((char *) hdrp + SIZEOF_AR_HDR, 1, namlen, abfd) != namlen) - return NULL; - ((char *) hdrp)[SIZEOF_AR_HDR + namlen] = '\0'; - - ret = (struct areltdata *) bfd_alloc (abfd, sizeof (struct areltdata)); - if (ret == NULL) - return NULL; - ret->arch_header = (char *) hdrp; - ret->parsed_size = strtol (hdr.size, (char **) NULL, 10); - ret->filename = (char *) hdrp + SIZEOF_AR_HDR; - - /* Skip over the XCOFFARFMAG at the end of the file name. */ - if (bfd_seek (abfd, (namlen & 1) + SXCOFFARFMAG, SEEK_CUR) != 0) - return NULL; - - return (PTR) ret; -} - -/* Open the next element in an XCOFF archive. */ - -static bfd * -xcoff_openr_next_archived_file (archive, last_file) - bfd *archive; - bfd *last_file; -{ - file_ptr filestart; - - if (xcoff_ardata (archive) == NULL) - { - bfd_set_error (bfd_error_invalid_operation); - return NULL; - } - - if (last_file == NULL) - filestart = bfd_ardata (archive)->first_file_filepos; - else - filestart = strtol (arch_xhdr (last_file)->nextoff, (char **) NULL, 10); - - if (filestart == 0 - || filestart == strtol (xcoff_ardata (archive)->memoff, - (char **) NULL, 10) - || filestart == strtol (xcoff_ardata (archive)->symoff, - (char **) NULL, 10)) - { - bfd_set_error (bfd_error_no_more_archived_files); - return NULL; - } - - return _bfd_get_elt_at_filepos (archive, filestart); -} - -/* Stat an element in an XCOFF archive. */ - -static int -xcoff_generic_stat_arch_elt (abfd, s) - bfd *abfd; - struct stat *s; -{ - struct xcoff_ar_hdr *hdrp; - - if (abfd->arelt_data == NULL) - { - bfd_set_error (bfd_error_invalid_operation); - return -1; - } - - hdrp = arch_xhdr (abfd); - - s->st_mtime = strtol (hdrp->date, (char **) NULL, 10); - s->st_uid = strtol (hdrp->uid, (char **) NULL, 10); - s->st_gid = strtol (hdrp->gid, (char **) NULL, 10); - s->st_mode = strtol (hdrp->mode, (char **) NULL, 8); - s->st_size = arch_eltdata (abfd)->parsed_size; - - return 0; -} - -/* Normalize a file name for inclusion in an archive. */ - -static const char * -normalize_filename (abfd) - bfd *abfd; -{ - const char *file; - const char *filename; - - file = bfd_get_filename (abfd); - filename = strrchr (file, '/'); - if (filename != NULL) - filename++; - else - filename = file; - return filename; -} - -/* Write out an XCOFF armap. */ - -/*ARGSUSED*/ -static boolean -xcoff_write_armap (abfd, elength, map, orl_count, stridx) - bfd *abfd; - unsigned int elength; - struct orl *map; - unsigned int orl_count; - int stridx; -{ - struct xcoff_ar_hdr hdr; - char *p; - unsigned char buf[4]; - bfd *sub; - file_ptr fileoff; - unsigned int i; - - memset (&hdr, 0, sizeof hdr); - sprintf (hdr.size, "%ld", (long) (4 + orl_count * 4 + stridx)); - sprintf (hdr.nextoff, "%d", 0); - memcpy (hdr.prevoff, xcoff_ardata (abfd)->memoff, 12); - sprintf (hdr.date, "%d", 0); - sprintf (hdr.uid, "%d", 0); - sprintf (hdr.gid, "%d", 0); - sprintf (hdr.mode, "%d", 0); - sprintf (hdr.namlen, "%d", 0); - - /* We need spaces, not null bytes, in the header. */ - for (p = (char *) &hdr; p < (char *) &hdr + SIZEOF_AR_HDR; p++) - if (*p == '\0') - *p = ' '; - - if (bfd_write ((PTR) &hdr, SIZEOF_AR_HDR, 1, abfd) != SIZEOF_AR_HDR - || bfd_write (XCOFFARFMAG, 1, SXCOFFARFMAG, abfd) != SXCOFFARFMAG) - return false; - - bfd_h_put_32 (abfd, orl_count, buf); - if (bfd_write (buf, 1, 4, abfd) != 4) - return false; - - sub = abfd->archive_head; - fileoff = SIZEOF_AR_FILE_HDR; - i = 0; - while (sub != NULL && i < orl_count) - { - size_t namlen; - - while (((bfd *) (map[i]).pos) == sub) - { - bfd_h_put_32 (abfd, fileoff, buf); - if (bfd_write (buf, 1, 4, abfd) != 4) - return false; - ++i; - } - namlen = strlen (normalize_filename (sub)); - namlen = (namlen + 1) &~ 1; - fileoff += (SIZEOF_AR_HDR - + namlen - + SXCOFFARFMAG - + arelt_size (sub)); - fileoff = (fileoff + 1) &~ 1; - sub = sub->next; - } - - for (i = 0; i < orl_count; i++) - { - const char *name; - size_t namlen; - - name = *map[i].name; - namlen = strlen (name); - if (bfd_write (name, 1, namlen + 1, abfd) != namlen + 1) - return false; - } - - if ((stridx & 1) != 0) - { - char b; - - b = '\0'; - if (bfd_write (&b, 1, 1, abfd) != 1) - return false; - } - - return true; -} - -/* Write out an XCOFF archive. We always write an entire archive, - rather than fussing with the freelist and so forth. */ - -static boolean -xcoff_write_archive_contents (abfd) - bfd *abfd; -{ - struct xcoff_ar_file_hdr fhdr; - size_t count; - size_t total_namlen; - file_ptr *offsets; - boolean makemap; - boolean hasobjects; - file_ptr prevoff, nextoff; - bfd *sub; - unsigned int i; - struct xcoff_ar_hdr ahdr; - bfd_size_type size; - char *p; - char decbuf[13]; - - memset (&fhdr, 0, sizeof fhdr); - strncpy (fhdr.magic, XCOFFARMAG, SXCOFFARMAG); - sprintf (fhdr.firstmemoff, "%d", SIZEOF_AR_FILE_HDR); - sprintf (fhdr.freeoff, "%d", 0); - - count = 0; - total_namlen = 0; - for (sub = abfd->archive_head; sub != NULL; sub = sub->next) - { - ++count; - total_namlen += strlen (normalize_filename (sub)) + 1; - } - offsets = (file_ptr *) bfd_alloc (abfd, count * sizeof (file_ptr)); - if (offsets == NULL) - return false; - - if (bfd_seek (abfd, SIZEOF_AR_FILE_HDR, SEEK_SET) != 0) - return false; - - makemap = bfd_has_map (abfd); - hasobjects = false; - prevoff = 0; - nextoff = SIZEOF_AR_FILE_HDR; - for (sub = abfd->archive_head, i = 0; sub != NULL; sub = sub->next, i++) - { - const char *name; - size_t namlen; - struct xcoff_ar_hdr *ahdrp; - bfd_size_type remaining; - - if (makemap && ! hasobjects) - { - if (bfd_check_format (sub, bfd_object)) - hasobjects = true; - } - - name = normalize_filename (sub); - namlen = strlen (name); - - if (sub->arelt_data != NULL) - ahdrp = arch_xhdr (sub); - else - ahdrp = NULL; - - if (ahdrp == NULL) - { - struct stat s; - - memset (&ahdr, 0, sizeof ahdr); - ahdrp = &ahdr; - if (stat (bfd_get_filename (sub), &s) != 0) - { - bfd_set_error (bfd_error_system_call); - return false; - } - - sprintf (ahdrp->size, "%ld", (long) s.st_size); - sprintf (ahdrp->date, "%ld", (long) s.st_mtime); - sprintf (ahdrp->uid, "%ld", (long) s.st_uid); - sprintf (ahdrp->gid, "%ld", (long) s.st_gid); - sprintf (ahdrp->mode, "%o", (unsigned int) s.st_mode); - - if (sub->arelt_data == NULL) - { - sub->arelt_data = ((struct areltdata *) - bfd_alloc (sub, sizeof (struct areltdata))); - if (sub->arelt_data == NULL) - return false; - } - - arch_eltdata (sub)->parsed_size = s.st_size; - } - - sprintf (ahdrp->prevoff, "%ld", (long) prevoff); - sprintf (ahdrp->namlen, "%ld", (long) namlen); - - /* If the length of the name is odd, we write out the null byte - after the name as well. */ - namlen = (namlen + 1) &~ 1; - - remaining = arelt_size (sub); - size = (SIZEOF_AR_HDR - + namlen - + SXCOFFARFMAG - + remaining); - - BFD_ASSERT (nextoff == bfd_tell (abfd)); - - offsets[i] = nextoff; - - prevoff = nextoff; - nextoff += size + (size & 1); - - sprintf (ahdrp->nextoff, "%ld", (long) nextoff); - - /* We need spaces, not null bytes, in the header. */ - for (p = (char *) ahdrp; p < (char *) ahdrp + SIZEOF_AR_HDR; p++) - if (*p == '\0') - *p = ' '; - - if (bfd_write ((PTR) ahdrp, 1, SIZEOF_AR_HDR, abfd) != SIZEOF_AR_HDR - || bfd_write ((PTR) name, 1, namlen, abfd) != namlen - || (bfd_write ((PTR) XCOFFARFMAG, 1, SXCOFFARFMAG, abfd) - != SXCOFFARFMAG)) - return false; - - if (bfd_seek (sub, (file_ptr) 0, SEEK_SET) != 0) - return false; - while (remaining != 0) - { - bfd_size_type amt; - bfd_byte buffer[DEFAULT_BUFFERSIZE]; - - amt = sizeof buffer; - if (amt > remaining) - amt = remaining; - if (bfd_read (buffer, 1, amt, sub) != amt - || bfd_write (buffer, 1, amt, abfd) != amt) - return false; - remaining -= amt; - } - - if ((size & 1) != 0) - { - bfd_byte b; - - b = '\0'; - if (bfd_write (&b, 1, 1, abfd) != 1) - return false; - } - } - - sprintf (fhdr.lastmemoff, "%ld", (long) prevoff); - - /* Write out the member table. */ - - BFD_ASSERT (nextoff == bfd_tell (abfd)); - sprintf (fhdr.memoff, "%ld", (long) nextoff); - - memset (&ahdr, 0, sizeof ahdr); - sprintf (ahdr.size, "%ld", (long) (12 + count * 12 + total_namlen)); - sprintf (ahdr.prevoff, "%ld", (long) prevoff); - sprintf (ahdr.date, "%d", 0); - sprintf (ahdr.uid, "%d", 0); - sprintf (ahdr.gid, "%d", 0); - sprintf (ahdr.mode, "%d", 0); - sprintf (ahdr.namlen, "%d", 0); - - size = (SIZEOF_AR_HDR - + 12 - + count * 12 - + total_namlen - + SXCOFFARFMAG); - - prevoff = nextoff; - nextoff += size + (size & 1); - - if (makemap && hasobjects) - sprintf (ahdr.nextoff, "%ld", (long) nextoff); - else - sprintf (ahdr.nextoff, "%d", 0); - - /* We need spaces, not null bytes, in the header. */ - for (p = (char *) &ahdr; p < (char *) &ahdr + SIZEOF_AR_HDR; p++) - if (*p == '\0') - *p = ' '; - - if (bfd_write ((PTR) &ahdr, 1, SIZEOF_AR_HDR, abfd) != SIZEOF_AR_HDR - || (bfd_write ((PTR) XCOFFARFMAG, 1, SXCOFFARFMAG, abfd) - != SXCOFFARFMAG)) - return false; - - sprintf (decbuf, "%-12ld", (long) count); - if (bfd_write ((PTR) decbuf, 1, 12, abfd) != 12) - return false; - for (i = 0; i < count; i++) - { - sprintf (decbuf, "%-12ld", (long) offsets[i]); - if (bfd_write ((PTR) decbuf, 1, 12, abfd) != 12) - return false; - } - for (sub = abfd->archive_head; sub != NULL; sub = sub->next) - { - const char *name; - size_t namlen; - - name = normalize_filename (sub); - namlen = strlen (name); - if (bfd_write ((PTR) name, 1, namlen + 1, abfd) != namlen + 1) - return false; - } - if ((size & 1) != 0) - { - bfd_byte b; - - b = '\0'; - if (bfd_write ((PTR) &b, 1, 1, abfd) != 1) - return false; - } - - /* Write out the armap, if appropriate. */ - - if (! makemap || ! hasobjects) - sprintf (fhdr.symoff, "%d", 0); - else - { - BFD_ASSERT (nextoff == bfd_tell (abfd)); - sprintf (fhdr.symoff, "%ld", (long) nextoff); - bfd_ardata (abfd)->tdata = (PTR) &fhdr; - if (! _bfd_compute_and_write_armap (abfd, 0)) - return false; - } - - /* Write out the archive file header. */ - - /* We need spaces, not null bytes, in the header. */ - for (p = (char *) &fhdr; p < (char *) &fhdr + SIZEOF_AR_FILE_HDR; p++) - if (*p == '\0') - *p = ' '; - - if (bfd_seek (abfd, (file_ptr) 0, SEEK_SET) != 0 - || (bfd_write ((PTR) &fhdr, SIZEOF_AR_FILE_HDR, 1, abfd) != - SIZEOF_AR_FILE_HDR)) - return false; - - return true; -} - -/* We can't use the usual coff_sizeof_headers routine, because AIX - always uses an a.out header. */ - -/*ARGSUSED*/ -static int -_bfd_xcoff_sizeof_headers (abfd, reloc) - bfd *abfd; - boolean reloc; -{ - int size; - - size = FILHSZ; - if (xcoff_data (abfd)->full_aouthdr) - size += AOUTSZ; - else - size += SMALL_AOUTSZ; - size += abfd->section_count * SCNHSZ; - return size; -} - -#define CORE_FILE_P _bfd_dummy_target - -#define coff_core_file_failing_command _bfd_nocore_core_file_failing_command -#define coff_core_file_failing_signal _bfd_nocore_core_file_failing_signal -#define coff_core_file_matches_executable_p \ - _bfd_nocore_core_file_matches_executable_p - -#ifdef AIX_CORE -#undef CORE_FILE_P -#define CORE_FILE_P rs6000coff_core_p -extern const bfd_target * rs6000coff_core_p (); -extern boolean rs6000coff_get_section_contents (); -extern boolean rs6000coff_core_file_matches_executable_p (); - -#undef coff_core_file_matches_executable_p -#define coff_core_file_matches_executable_p \ - rs6000coff_core_file_matches_executable_p - -extern char *rs6000coff_core_file_failing_command PARAMS ((bfd *abfd)); -#undef coff_core_file_failing_command -#define coff_core_file_failing_command rs6000coff_core_file_failing_command - -extern int rs6000coff_core_file_failing_signal PARAMS ((bfd *abfd)); -#undef coff_core_file_failing_signal -#define coff_core_file_failing_signal rs6000coff_core_file_failing_signal - -#undef coff_get_section_contents -#define coff_get_section_contents rs6000coff_get_section_contents -#endif /* AIX_CORE */ - -#ifdef LYNX_CORE - -#undef CORE_FILE_P -#define CORE_FILE_P lynx_core_file_p -extern const bfd_target *lynx_core_file_p PARAMS ((bfd *abfd)); - -extern boolean lynx_core_file_matches_executable_p PARAMS ((bfd *core_bfd, - bfd *exec_bfd)); -#undef coff_core_file_matches_executable_p -#define coff_core_file_matches_executable_p lynx_core_file_matches_executable_p - -extern char *lynx_core_file_failing_command PARAMS ((bfd *abfd)); -#undef coff_core_file_failing_command -#define coff_core_file_failing_command lynx_core_file_failing_command - -extern int lynx_core_file_failing_signal PARAMS ((bfd *abfd)); -#undef coff_core_file_failing_signal -#define coff_core_file_failing_signal lynx_core_file_failing_signal - -#endif /* LYNX_CORE */ - -#define _bfd_xcoff_bfd_get_relocated_section_contents \ - coff_bfd_get_relocated_section_contents -#define _bfd_xcoff_bfd_relax_section coff_bfd_relax_section -#define _bfd_xcoff_bfd_link_split_section coff_bfd_link_split_section - -/* The transfer vector that leads the outside world to all of the above. */ - -const bfd_target -#ifdef TARGET_SYM - TARGET_SYM = -#else - rs6000coff_vec = -#endif -{ -#ifdef TARGET_NAME - TARGET_NAME, -#else - "aixcoff-rs6000", /* name */ -#endif - bfd_target_coff_flavour, - BFD_ENDIAN_BIG, /* data byte order is big */ - BFD_ENDIAN_BIG, /* header byte order is big */ - - (HAS_RELOC | EXEC_P | /* object flags */ - HAS_LINENO | HAS_DEBUG | DYNAMIC | - HAS_SYMS | HAS_LOCALS | WP_TEXT), - - (SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD | SEC_RELOC), /* section flags */ - 0, /* leading char */ - '/', /* ar_pad_char */ - 15, /* ar_max_namelen??? FIXMEmgo */ - - bfd_getb64, bfd_getb_signed_64, bfd_putb64, - bfd_getb32, bfd_getb_signed_32, bfd_putb32, - bfd_getb16, bfd_getb_signed_16, bfd_putb16, /* data */ - bfd_getb64, bfd_getb_signed_64, bfd_putb64, - bfd_getb32, bfd_getb_signed_32, bfd_putb32, - bfd_getb16, bfd_getb_signed_16, bfd_putb16, /* hdrs */ - - {_bfd_dummy_target, coff_object_p, /* bfd_check_format */ - xcoff_archive_p, CORE_FILE_P}, - {bfd_false, coff_mkobject, /* bfd_set_format */ - _bfd_generic_mkarchive, bfd_false}, - {bfd_false, coff_write_object_contents, /* bfd_write_contents */ - xcoff_write_archive_contents, bfd_false}, - - BFD_JUMP_TABLE_GENERIC (coff), - BFD_JUMP_TABLE_COPY (coff), - BFD_JUMP_TABLE_CORE (coff), - BFD_JUMP_TABLE_ARCHIVE (xcoff), - BFD_JUMP_TABLE_SYMBOLS (coff), - BFD_JUMP_TABLE_RELOCS (coff), - BFD_JUMP_TABLE_WRITE (coff), - BFD_JUMP_TABLE_LINK (_bfd_xcoff), - BFD_JUMP_TABLE_DYNAMIC (_bfd_nodynamic), - - COFF_SWAP_TABLE, -}; diff --git a/contrib/gdb/bfd/coff-sh.c b/contrib/gdb/bfd/coff-sh.c deleted file mode 100644 index 17bb4b17d817b..0000000000000 --- a/contrib/gdb/bfd/coff-sh.c +++ /dev/null @@ -1,1525 +0,0 @@ -/* BFD back-end for Hitachi Super-H COFF binaries. - Copyright 1993, 1994, 1995, 1996 Free Software Foundation, Inc. - Contributed by Cygnus Support. - Written by Steve Chamberlain, <sac@cygnus.com>. - Relaxing code written by Ian Lance Taylor, <ian@cygnus.com>. - -This file is part of BFD, the Binary File Descriptor library. - -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 2 of the License, 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ - -#include "bfd.h" -#include "sysdep.h" -#include "obstack.h" -#include "libbfd.h" -#include "bfdlink.h" -#include "coff/sh.h" -#include "coff/internal.h" -#include "libcoff.h" - -/* Internal functions. */ -static bfd_reloc_status_type sh_reloc - PARAMS ((bfd *, arelent *, asymbol *, PTR, asection *, bfd *, char **)); -static long get_symbol_value PARAMS ((asymbol *)); -static boolean sh_relax_section - PARAMS ((bfd *, asection *, struct bfd_link_info *, boolean *)); -static boolean sh_relax_delete_bytes - PARAMS ((bfd *, asection *, bfd_vma, int)); -static boolean sh_relocate_section - PARAMS ((bfd *, struct bfd_link_info *, bfd *, asection *, bfd_byte *, - struct internal_reloc *, struct internal_syment *, asection **)); -static bfd_byte *sh_coff_get_relocated_section_contents - PARAMS ((bfd *, struct bfd_link_info *, struct bfd_link_order *, - bfd_byte *, boolean, asymbol **)); - -/* Default section alignment to 2**2. */ -#define COFF_DEFAULT_SECTION_ALIGNMENT_POWER (2) - -/* Generate long file names. */ -#define COFF_LONG_FILENAMES - -/* The supported relocations. There are a lot of relocations defined - in coff/internal.h which we do not expect to ever see. */ -static reloc_howto_type sh_coff_howtos[] = -{ - { 0 }, - { 1 }, - { 2 }, - { 3 }, /* R_SH_PCREL8 */ - { 4 }, /* R_SH_PCREL16 */ - { 5 }, /* R_SH_HIGH8 */ - { 6 }, /* R_SH_IMM24 */ - { 7 }, /* R_SH_LOW16 */ - { 8 }, - { 9 }, /* R_SH_PCDISP8BY4 */ - - HOWTO (R_SH_PCDISP8BY2, /* type */ - 1, /* rightshift */ - 1, /* size (0 = byte, 1 = short, 2 = long) */ - 8, /* bitsize */ - true, /* pc_relative */ - 0, /* bitpos */ - complain_overflow_signed, /* complain_on_overflow */ - sh_reloc, /* special_function */ - "r_pcdisp8by2", /* name */ - true, /* partial_inplace */ - 0xff, /* src_mask */ - 0xff, /* dst_mask */ - true), /* pcrel_offset */ - - { 11 }, /* R_SH_PCDISP8 */ - - HOWTO (R_SH_PCDISP, /* type */ - 1, /* rightshift */ - 1, /* size (0 = byte, 1 = short, 2 = long) */ - 12, /* bitsize */ - true, /* pc_relative */ - 0, /* bitpos */ - complain_overflow_signed, /* complain_on_overflow */ - sh_reloc, /* special_function */ - "r_pcdisp12by2", /* name */ - true, /* partial_inplace */ - 0xfff, /* src_mask */ - 0xfff, /* dst_mask */ - true), /* pcrel_offset */ - - { 13 }, - - HOWTO (R_SH_IMM32, /* type */ - 0, /* rightshift */ - 2, /* size (0 = byte, 1 = short, 2 = long) */ - 32, /* bitsize */ - false, /* pc_relative */ - 0, /* bitpos */ - complain_overflow_bitfield, /* complain_on_overflow */ - sh_reloc, /* special_function */ - "r_imm32", /* name */ - true, /* partial_inplace */ - 0xffffffff, /* src_mask */ - 0xffffffff, /* dst_mask */ - false), /* pcrel_offset */ - - { 15 }, - { 16 }, /* R_SH_IMM8 */ - { 17 }, /* R_SH_IMM8BY2 */ - { 18 }, /* R_SH_IMM8BY4 */ - { 19 }, /* R_SH_IMM4 */ - { 20 }, /* R_SH_IMM4BY2 */ - { 21 }, /* R_SH_IMM4BY4 */ - - HOWTO (R_SH_PCRELIMM8BY2, /* type */ - 1, /* rightshift */ - 1, /* size (0 = byte, 1 = short, 2 = long) */ - 8, /* bitsize */ - true, /* pc_relative */ - 0, /* bitpos */ - complain_overflow_unsigned, /* complain_on_overflow */ - sh_reloc, /* special_function */ - "r_pcrelimm8by2", /* name */ - true, /* partial_inplace */ - 0xff, /* src_mask */ - 0xff, /* dst_mask */ - true), /* pcrel_offset */ - - HOWTO (R_SH_PCRELIMM8BY4, /* type */ - 2, /* rightshift */ - 1, /* size (0 = byte, 1 = short, 2 = long) */ - 8, /* bitsize */ - true, /* pc_relative */ - 0, /* bitpos */ - complain_overflow_unsigned, /* complain_on_overflow */ - sh_reloc, /* special_function */ - "r_pcrelimm8by4", /* name */ - true, /* partial_inplace */ - 0xff, /* src_mask */ - 0xff, /* dst_mask */ - true), /* pcrel_offset */ - - HOWTO (R_SH_IMM16, /* type */ - 0, /* rightshift */ - 1, /* size (0 = byte, 1 = short, 2 = long) */ - 16, /* bitsize */ - false, /* pc_relative */ - 0, /* bitpos */ - complain_overflow_bitfield, /* complain_on_overflow */ - sh_reloc, /* special_function */ - "r_imm16", /* name */ - true, /* partial_inplace */ - 0xffff, /* src_mask */ - 0xffff, /* dst_mask */ - false), /* pcrel_offset */ - - HOWTO (R_SH_SWITCH16, /* type */ - 0, /* rightshift */ - 1, /* size (0 = byte, 1 = short, 2 = long) */ - 16, /* bitsize */ - false, /* pc_relative */ - 0, /* bitpos */ - complain_overflow_bitfield, /* complain_on_overflow */ - sh_reloc, /* special_function */ - "r_switch16", /* name */ - true, /* partial_inplace */ - 0xffff, /* src_mask */ - 0xffff, /* dst_mask */ - false), /* pcrel_offset */ - - HOWTO (R_SH_SWITCH32, /* type */ - 0, /* rightshift */ - 2, /* size (0 = byte, 1 = short, 2 = long) */ - 32, /* bitsize */ - false, /* pc_relative */ - 0, /* bitpos */ - complain_overflow_bitfield, /* complain_on_overflow */ - sh_reloc, /* special_function */ - "r_switch32", /* name */ - true, /* partial_inplace */ - 0xffffffff, /* src_mask */ - 0xffffffff, /* dst_mask */ - false), /* pcrel_offset */ - - HOWTO (R_SH_USES, /* type */ - 0, /* rightshift */ - 1, /* size (0 = byte, 1 = short, 2 = long) */ - 16, /* bitsize */ - false, /* pc_relative */ - 0, /* bitpos */ - complain_overflow_bitfield, /* complain_on_overflow */ - sh_reloc, /* special_function */ - "r_uses", /* name */ - true, /* partial_inplace */ - 0xffff, /* src_mask */ - 0xffff, /* dst_mask */ - false), /* pcrel_offset */ - - HOWTO (R_SH_COUNT, /* type */ - 0, /* rightshift */ - 2, /* size (0 = byte, 1 = short, 2 = long) */ - 32, /* bitsize */ - false, /* pc_relative */ - 0, /* bitpos */ - complain_overflow_bitfield, /* complain_on_overflow */ - sh_reloc, /* special_function */ - "r_count", /* name */ - true, /* partial_inplace */ - 0xffffffff, /* src_mask */ - 0xffffffff, /* dst_mask */ - false), /* pcrel_offset */ - - HOWTO (R_SH_ALIGN, /* type */ - 0, /* rightshift */ - 2, /* size (0 = byte, 1 = short, 2 = long) */ - 32, /* bitsize */ - false, /* pc_relative */ - 0, /* bitpos */ - complain_overflow_bitfield, /* complain_on_overflow */ - sh_reloc, /* special_function */ - "r_align", /* name */ - true, /* partial_inplace */ - 0xffffffff, /* src_mask */ - 0xffffffff, /* dst_mask */ - false) /* pcrel_offset */ -}; - -#define SH_COFF_HOWTO_COUNT (sizeof sh_coff_howtos / sizeof sh_coff_howtos[0]) - -/* Check for a bad magic number. */ -#define BADMAG(x) SHBADMAG(x) - -/* Customize coffcode.h (this is not currently used). */ -#define SH 1 - -/* FIXME: This should not be set here. */ -#define __A_MAGIC_SET__ - -/* Swap the r_offset field in and out. */ -#define SWAP_IN_RELOC_OFFSET bfd_h_get_32 -#define SWAP_OUT_RELOC_OFFSET bfd_h_put_32 - -/* Swap out extra information in the reloc structure. */ -#define SWAP_OUT_RELOC_EXTRA(abfd, src, dst) \ - do \ - { \ - dst->r_stuff[0] = 'S'; \ - dst->r_stuff[1] = 'C'; \ - } \ - while (0) - -/* Get the value of a symbol, when performing a relocation. */ - -static long -get_symbol_value (symbol) - asymbol *symbol; -{ - bfd_vma relocation; - - if (bfd_is_com_section (symbol->section)) - relocation = 0; - else - relocation = (symbol->value + - symbol->section->output_section->vma + - symbol->section->output_offset); - - return relocation; -} - -/* This macro is used in coffcode.h to get the howto corresponding to - an internal reloc. */ - -#define RTYPE2HOWTO(relent, internal) \ - ((relent)->howto = \ - ((internal)->r_type < SH_COFF_HOWTO_COUNT \ - ? &sh_coff_howtos[(internal)->r_type] \ - : (reloc_howto_type *) NULL)) - -/* This is the same as the macro in coffcode.h, except that it copies - r_offset into reloc_entry->addend for some relocs. */ -#define CALC_ADDEND(abfd, ptr, reloc, cache_ptr) \ - { \ - coff_symbol_type *coffsym = (coff_symbol_type *) NULL; \ - if (ptr && bfd_asymbol_bfd (ptr) != abfd) \ - coffsym = (obj_symbols (abfd) \ - + (cache_ptr->sym_ptr_ptr - symbols)); \ - else if (ptr) \ - coffsym = coff_symbol_from (abfd, ptr); \ - if (coffsym != (coff_symbol_type *) NULL \ - && coffsym->native->u.syment.n_scnum == 0) \ - cache_ptr->addend = 0; \ - else if (ptr && bfd_asymbol_bfd (ptr) == abfd \ - && ptr->section != (asection *) NULL) \ - cache_ptr->addend = - (ptr->section->vma + ptr->value); \ - else \ - cache_ptr->addend = 0; \ - if ((reloc).r_type == R_SH_SWITCH16 \ - || (reloc).r_type == R_SH_SWITCH32 \ - || (reloc).r_type == R_SH_USES \ - || (reloc).r_type == R_SH_COUNT \ - || (reloc).r_type == R_SH_ALIGN) \ - cache_ptr->addend = (reloc).r_offset; \ - } - -/* This is the howto function for the SH relocations. */ - -static bfd_reloc_status_type -sh_reloc (abfd, reloc_entry, symbol_in, data, input_section, output_bfd, - error_message) - bfd *abfd; - arelent *reloc_entry; - asymbol *symbol_in; - PTR data; - asection *input_section; - bfd *output_bfd; - char **error_message; -{ - unsigned long insn; - bfd_vma sym_value; - unsigned short r_type; - bfd_vma addr = reloc_entry->address; - bfd_byte *hit_data = addr + (bfd_byte *) data; - - r_type = reloc_entry->howto->type; - - if (output_bfd != NULL) - { - /* Partial linking--do nothing. */ - reloc_entry->address += input_section->output_offset; - return bfd_reloc_ok; - } - - /* Almost all relocs have to do with relaxing. If any work must be - done for them, it has been done in sh_relax_section. */ - if (r_type != R_SH_IMM32 - && (r_type != R_SH_PCDISP - || (symbol_in->flags & BSF_LOCAL) != 0)) - return bfd_reloc_ok; - - if (symbol_in != NULL - && bfd_is_und_section (symbol_in->section)) - return bfd_reloc_undefined; - - sym_value = get_symbol_value (symbol_in); - - switch (r_type) - { - case R_SH_IMM32: - insn = bfd_get_32 (abfd, hit_data); - insn += sym_value + reloc_entry->addend; - bfd_put_32 (abfd, insn, hit_data); - break; - case R_SH_PCDISP: - insn = bfd_get_16 (abfd, hit_data); - sym_value += reloc_entry->addend; - sym_value -= (input_section->output_section->vma - + input_section->output_offset - + addr - + 4); - sym_value += (insn & 0xfff) << 1; - if (insn & 0x800) - sym_value -= 0x1000; - insn = (insn & 0xf000) | (sym_value & 0xfff); - bfd_put_16 (abfd, insn, hit_data); - if (sym_value < (bfd_vma) -0x1000 || sym_value >= 0x1000) - return bfd_reloc_overflow; - break; - default: - abort (); - break; - } - - return bfd_reloc_ok; -} - -/* We can do relaxing. */ -#define coff_bfd_relax_section sh_relax_section - -/* We use the special COFF backend linker. */ -#define coff_relocate_section sh_relocate_section - -/* When relaxing, we need to use special code to get the relocated - section contents. */ -#define coff_bfd_get_relocated_section_contents \ - sh_coff_get_relocated_section_contents - -#include "coffcode.h" - -/* This function handles relaxing on the SH. - - Function calls on the SH look like this: - - movl L1,r0 - ... - jsr @r0 - ... - L1: - .long function - - The compiler and assembler will cooperate to create R_SH_USES - relocs on the jsr instructions. The r_offset field of the - R_SH_USES reloc is the PC relative offset to the instruction which - loads the register (the r_offset field is computed as though it - were a jump instruction, so the offset value is actually from four - bytes past the instruction). The linker can use this reloc to - determine just which function is being called, and thus decide - whether it is possible to replace the jsr with a bsr. - - If multiple function calls are all based on a single register load - (i.e., the same function is called multiple times), the compiler - guarantees that each function call will have an R_SH_USES reloc. - Therefore, if the linker is able to convert each R_SH_USES reloc - which refers to that address, it can safely eliminate the register - load. - - When the assembler creates an R_SH_USES reloc, it examines it to - determine which address is being loaded (L1 in the above example). - It then counts the number of references to that address, and - creates an R_SH_COUNT reloc at that address. The r_offset field of - the R_SH_COUNT reloc will be the number of references. If the - linker is able to eliminate a register load, it can use the - R_SH_COUNT reloc to see whether it can also eliminate the function - address. */ - -static boolean -sh_relax_section (abfd, sec, link_info, again) - bfd *abfd; - asection *sec; - struct bfd_link_info *link_info; - boolean *again; -{ - struct internal_reloc *internal_relocs; - struct internal_reloc *free_relocs = NULL; - struct internal_reloc *irel, *irelend; - bfd_byte *contents = NULL; - bfd_byte *free_contents = NULL; - - *again = false; - - if (link_info->relocateable - || (sec->flags & SEC_RELOC) == 0 - || sec->reloc_count == 0) - return true; - - /* If this is the first time we have been called for this section, - initialize the cooked size. */ - if (sec->_cooked_size == 0) - sec->_cooked_size = sec->_raw_size; - - internal_relocs = (_bfd_coff_read_internal_relocs - (abfd, sec, link_info->keep_memory, - (bfd_byte *) NULL, false, - (struct internal_reloc *) NULL)); - if (internal_relocs == NULL) - goto error_return; - if (! link_info->keep_memory) - free_relocs = internal_relocs; - - irelend = internal_relocs + sec->reloc_count; - for (irel = internal_relocs; irel < irelend; irel++) - { - bfd_vma laddr, paddr, symval; - unsigned short insn; - struct internal_reloc *irelfn, *irelscan, *irelcount; - struct internal_syment sym; - bfd_signed_vma foff; - - if (irel->r_type != R_SH_USES) - continue; - - /* Get the section contents. */ - if (contents == NULL) - { - if (coff_section_data (abfd, sec) != NULL - && coff_section_data (abfd, sec)->contents != NULL) - contents = coff_section_data (abfd, sec)->contents; - else - { - contents = (bfd_byte *) bfd_malloc (sec->_raw_size); - if (contents == NULL) - goto error_return; - free_contents = contents; - - if (! bfd_get_section_contents (abfd, sec, contents, - (file_ptr) 0, sec->_raw_size)) - goto error_return; - } - } - - /* The r_offset field of the R_SH_USES reloc will point us to - the register load. The 4 is because the r_offset field is - computed as though it were a jump offset, which are based - from 4 bytes after the jump instruction. */ - laddr = irel->r_vaddr - sec->vma + 4 + irel->r_offset; - if (laddr >= sec->_raw_size) - { - (*_bfd_error_handler) ("%s: 0x%lx: warning: bad R_SH_USES offset", - bfd_get_filename (abfd), - (unsigned long) irel->r_vaddr); - continue; - } - insn = bfd_get_16 (abfd, contents + laddr); - - /* If the instruction is not mov.l NN,rN, we don't know what to - do. */ - if ((insn & 0xf000) != 0xd000) - { - ((*_bfd_error_handler) - ("%s: 0x%lx: warning: R_SH_USES points to unrecognized insn 0x%x", - bfd_get_filename (abfd), (unsigned long) irel->r_vaddr, insn)); - continue; - } - - /* Get the address from which the register is being loaded. The - displacement in the mov.l instruction is quadrupled. It is a - displacement from four bytes after the movl instruction, but, - before adding in the PC address, two least significant bits - of the PC are cleared. We assume that the section is aligned - on a four byte boundary. */ - paddr = insn & 0xff; - paddr *= 4; - paddr += (laddr + 4) &~ 3; - if (paddr >= sec->_raw_size) - { - ((*_bfd_error_handler) - ("%s: 0x%lx: warning: bad R_SH_USES load offset", - bfd_get_filename (abfd), (unsigned long) irel->r_vaddr)); - continue; - } - - /* Get the reloc for the address from which the register is - being loaded. This reloc will tell us which function is - actually being called. */ - paddr += sec->vma; - for (irelfn = internal_relocs; irelfn < irelend; irelfn++) - if (irelfn->r_vaddr == paddr - && irelfn->r_type == R_SH_IMM32) - break; - if (irelfn >= irelend) - { - ((*_bfd_error_handler) - ("%s: 0x%lx: warning: could not find expected reloc", - bfd_get_filename (abfd), (unsigned long) paddr)); - continue; - } - - /* Get the value of the symbol referred to by the reloc. */ - if (! _bfd_coff_get_external_symbols (abfd)) - goto error_return; - bfd_coff_swap_sym_in (abfd, - ((bfd_byte *) obj_coff_external_syms (abfd) - + (irelfn->r_symndx - * bfd_coff_symesz (abfd))), - &sym); - if (sym.n_scnum != 0 && sym.n_scnum != sec->target_index) - { - ((*_bfd_error_handler) - ("%s: 0x%lx: warning: symbol in unexpected section", - bfd_get_filename (abfd), (unsigned long) paddr)); - continue; - } - - if (sym.n_sclass != C_EXT) - { - symval = (sym.n_value - - sec->vma - + sec->output_section->vma - + sec->output_offset); - } - else - { - struct coff_link_hash_entry *h; - - h = obj_coff_sym_hashes (abfd)[irelfn->r_symndx]; - BFD_ASSERT (h != NULL); - if (h->root.type != bfd_link_hash_defined - && h->root.type != bfd_link_hash_defweak) - { - /* This appears to be a reference to an undefined - symbol. Just ignore it--it will be caught by the - regular reloc processing. */ - continue; - } - - symval = (h->root.u.def.value - + h->root.u.def.section->output_section->vma - + h->root.u.def.section->output_offset); - } - - symval += bfd_get_32 (abfd, contents + paddr - sec->vma); - - /* See if this function call can be shortened. */ - foff = (symval - - (irel->r_vaddr - - sec->vma - + sec->output_section->vma - + sec->output_offset - + 4)); - if (foff < -0x1000 || foff >= 0x1000) - { - /* After all that work, we can't shorten this function call. */ - continue; - } - - /* Shorten the function call. */ - - /* For simplicity of coding, we are going to modify the section - contents, the section relocs, and the BFD symbol table. We - must tell the rest of the code not to free up this - information. It would be possible to instead create a table - of changes which have to be made, as is done in coff-mips.c; - that would be more work, but would require less memory when - the linker is run. */ - - if (coff_section_data (abfd, sec) == NULL) - { - sec->used_by_bfd = - ((PTR) bfd_zalloc (abfd, sizeof (struct coff_section_tdata))); - if (sec->used_by_bfd == NULL) - goto error_return; - } - - coff_section_data (abfd, sec)->relocs = internal_relocs; - coff_section_data (abfd, sec)->keep_relocs = true; - free_relocs = NULL; - - coff_section_data (abfd, sec)->contents = contents; - coff_section_data (abfd, sec)->keep_contents = true; - free_contents = NULL; - - obj_coff_keep_syms (abfd) = true; - - /* Replace the jsr with a bsr. */ - - /* Change the R_SH_USES reloc into an R_SH_PCDISP reloc, and - replace the jsr with a bsr. */ - irel->r_type = R_SH_PCDISP; - irel->r_symndx = irelfn->r_symndx; - if (sym.n_sclass != C_EXT) - { - /* If this needs to be changed because of future relaxing, - it will be handled here like other internal PCDISP - relocs. */ - bfd_put_16 (abfd, - 0xb000 | ((foff >> 1) & 0xfff), - contents + irel->r_vaddr - sec->vma); - } - else - { - /* We can't fully resolve this yet, because the external - symbol value may be changed by future relaxing. We let - the final link phase handle it. */ - bfd_put_16 (abfd, 0xb000, contents + irel->r_vaddr - sec->vma); - } - - /* See if there is another R_SH_USES reloc referring to the same - register load. */ - for (irelscan = internal_relocs; irelscan < irelend; irelscan++) - if (irelscan->r_type == R_SH_USES - && laddr == irelscan->r_vaddr - sec->vma + 4 + irelscan->r_offset) - break; - if (irelscan < irelend) - { - /* Some other function call depends upon this register load, - and we have not yet converted that function call. - Indeed, we may never be able to convert it. There is - nothing else we can do at this point. */ - continue; - } - - /* Look for a R_SH_COUNT reloc on the location where the - function address is stored. Do this before deleting any - bytes, to avoid confusion about the address. */ - for (irelcount = internal_relocs; irelcount < irelend; irelcount++) - if (irelcount->r_vaddr == paddr - && irelcount->r_type == R_SH_COUNT) - break; - - /* Delete the register load. */ - if (! sh_relax_delete_bytes (abfd, sec, laddr, 2)) - goto error_return; - - /* That will change things, so, just in case it permits some - other function call to come within range, we should relax - again. Note that this is not required, and it may be slow. */ - *again = true; - - /* Now check whether we got a COUNT reloc. */ - if (irelcount >= irelend) - { - ((*_bfd_error_handler) - ("%s: 0x%lx: warning: could not find expected COUNT reloc", - bfd_get_filename (abfd), (unsigned long) paddr)); - continue; - } - - /* The number of uses is stored in the r_offset field. We've - just deleted one. */ - if (irelcount->r_offset == 0) - { - ((*_bfd_error_handler) ("%s: 0x%lx: warning: bad count", - bfd_get_filename (abfd), - (unsigned long) paddr)); - continue; - } - - --irelcount->r_offset; - - /* If there are no more uses, we can delete the address. Reload - the address from irelfn, in case it was changed by the - previous call to sh_relax_delete_bytes. */ - if (irelcount->r_offset == 0) - { - if (! sh_relax_delete_bytes (abfd, sec, - irelfn->r_vaddr - sec->vma, 4)) - goto error_return; - } - - /* We've done all we can with that function call. */ - } - - if (free_relocs != NULL) - { - free (free_relocs); - free_relocs = NULL; - } - - if (free_contents != NULL) - { - if (! link_info->keep_memory) - free (free_contents); - else - { - /* Cache the section contents for coff_link_input_bfd. */ - if (coff_section_data (abfd, sec) == NULL) - { - sec->used_by_bfd = - ((PTR) bfd_zalloc (abfd, sizeof (struct coff_section_tdata))); - if (sec->used_by_bfd == NULL) - goto error_return; - coff_section_data (abfd, sec)->relocs = NULL; - } - coff_section_data (abfd, sec)->contents = contents; - } - } - - return true; - - error_return: - if (free_relocs != NULL) - free (free_relocs); - if (free_contents != NULL) - free (free_contents); - return false; -} - -/* Delete some bytes from a section while relaxing. */ - -static boolean -sh_relax_delete_bytes (abfd, sec, addr, count) - bfd *abfd; - asection *sec; - bfd_vma addr; - int count; -{ - bfd_byte *contents; - struct internal_reloc *irel, *irelend; - struct internal_reloc *irelalign; - bfd_vma toaddr; - bfd_byte *esym, *esymend; - bfd_size_type symesz; - struct coff_link_hash_entry **sym_hash; - asection *o; - - contents = coff_section_data (abfd, sec)->contents; - - /* The deletion must stop at the next ALIGN reloc for an aligment - power larger than the number of bytes we are deleting. */ - - irelalign = NULL; - toaddr = sec->_cooked_size; - - irel = coff_section_data (abfd, sec)->relocs; - irelend = irel + sec->reloc_count; - for (; irel < irelend; irel++) - { - if (irel->r_type == R_SH_ALIGN - && irel->r_vaddr - sec->vma > addr - && count < (1 << irel->r_offset)) - { - irelalign = irel; - toaddr = irel->r_vaddr - sec->vma; - break; - } - } - - /* Actually delete the bytes. */ - memmove (contents + addr, contents + addr + count, toaddr - addr - count); - if (irelalign == NULL) - sec->_cooked_size -= count; - else - memset (contents + toaddr - count, 0, count); - - /* Adjust all the relocs. */ - for (irel = coff_section_data (abfd, sec)->relocs; irel < irelend; irel++) - { - bfd_vma nraddr, start, stop; - int insn = 0; - struct internal_syment sym; - int off, adjust, oinsn; - bfd_signed_vma voff; - boolean overflow; - - /* Get the new reloc address. */ - nraddr = irel->r_vaddr - sec->vma; - if ((irel->r_vaddr - sec->vma > addr - && irel->r_vaddr - sec->vma < toaddr) - || (irel->r_type == R_SH_ALIGN - && irel->r_vaddr - sec->vma == toaddr)) - nraddr -= count; - - /* See if this reloc was for the bytes we have deleted, in which - case we no longer care about it. */ - if (irel->r_vaddr - sec->vma >= addr - && irel->r_vaddr - sec->vma < addr + count - && irel->r_type != R_SH_ALIGN) - irel->r_type = R_SH_UNUSED; - - /* If this is a PC relative reloc, see if the range it covers - includes the bytes we have deleted. */ - switch (irel->r_type) - { - default: - break; - - case R_SH_PCDISP8BY2: - case R_SH_PCDISP: - case R_SH_PCRELIMM8BY2: - case R_SH_PCRELIMM8BY4: - start = irel->r_vaddr - sec->vma; - insn = bfd_get_16 (abfd, contents + nraddr); - break; - } - - switch (irel->r_type) - { - default: - start = stop = addr; - break; - - case R_SH_IMM32: - /* If this reloc is against a symbol defined in this - section, and the symbol will not be adjusted below, we - must check the addend to see it will put the value in - range to be adjusted, and hence must be changed. */ - bfd_coff_swap_sym_in (abfd, - ((bfd_byte *) obj_coff_external_syms (abfd) - + (irel->r_symndx - * bfd_coff_symesz (abfd))), - &sym); - if (sym.n_sclass != C_EXT - && sym.n_scnum == sec->target_index - && ((bfd_vma) sym.n_value <= addr - || (bfd_vma) sym.n_value >= toaddr)) - { - bfd_vma val; - - val = bfd_get_32 (abfd, contents + nraddr); - val += sym.n_value; - if (val >= addr && val < toaddr) - bfd_put_32 (abfd, val - count, contents + nraddr); - } - start = stop = addr; - break; - - case R_SH_PCDISP8BY2: - off = insn & 0xff; - if (off & 0x80) - off -= 0x100; - stop = (bfd_vma) ((bfd_signed_vma) start + 4 + off * 2); - break; - - case R_SH_PCDISP: - bfd_coff_swap_sym_in (abfd, - ((bfd_byte *) obj_coff_external_syms (abfd) - + (irel->r_symndx - * bfd_coff_symesz (abfd))), - &sym); - if (sym.n_sclass == C_EXT) - start = stop = addr; - else - { - off = insn & 0xfff; - if (off & 0x800) - off -= 0x1000; - stop = (bfd_vma) ((bfd_signed_vma) start + 4 + off * 2); - } - break; - - case R_SH_PCRELIMM8BY2: - off = insn & 0xff; - stop = start + 4 + off * 2; - break; - - case R_SH_PCRELIMM8BY4: - off = insn & 0xff; - stop = (start &~ (bfd_vma) 3) + 4 + off * 4; - break; - - case R_SH_SWITCH16: - case R_SH_SWITCH32: - /* These relocs types represent - .word L2-L1 - The r_offset field holds the difference between the reloc - address and L1. That is the start of the reloc, and - adding in the contents gives us the top. We must adjust - both the r_offset field and the section contents. */ - - start = irel->r_vaddr - sec->vma; - stop = (bfd_vma) ((bfd_signed_vma) start - (long) irel->r_offset); - - if (start > addr - && start < toaddr - && (stop <= addr || stop >= toaddr)) - irel->r_offset += count; - else if (stop > addr - && stop < toaddr - && (start <= addr || start >= toaddr)) - irel->r_offset -= count; - - start = stop; - - if (irel->r_type == R_SH_SWITCH16) - voff = bfd_get_signed_16 (abfd, contents + nraddr); - else - voff = bfd_get_signed_32 (abfd, contents + nraddr); - stop = (bfd_vma) ((bfd_signed_vma) start + voff); - - break; - - case R_SH_USES: - start = irel->r_vaddr - sec->vma; - stop = (bfd_vma) ((bfd_signed_vma) start - + (long) irel->r_offset - + 4); - break; - } - - if (start > addr - && start < toaddr - && (stop <= addr || stop >= toaddr)) - adjust = count; - else if (stop > addr - && stop < toaddr - && (start <= addr || start >= toaddr)) - adjust = - count; - else - adjust = 0; - - if (adjust != 0) - { - oinsn = insn; - overflow = false; - switch (irel->r_type) - { - default: - abort (); - break; - - case R_SH_PCDISP8BY2: - case R_SH_PCRELIMM8BY2: - insn += adjust / 2; - if ((oinsn & 0xff00) != (insn & 0xff00)) - overflow = true; - bfd_put_16 (abfd, insn, contents + nraddr); - break; - - case R_SH_PCDISP: - insn += adjust / 2; - if ((oinsn & 0xf000) != (insn & 0xf000)) - overflow = true; - bfd_put_16 (abfd, insn, contents + nraddr); - break; - - case R_SH_PCRELIMM8BY4: - BFD_ASSERT (adjust == count || count >= 4); - if (count >= 4) - insn += adjust / 4; - else - { - if ((irel->r_vaddr & 3) == 0) - ++insn; - } - if ((oinsn & 0xff00) != (insn & 0xff00)) - overflow = true; - bfd_put_16 (abfd, insn, contents + nraddr); - break; - - case R_SH_SWITCH16: - voff += adjust; - if (voff < - 0x8000 || voff >= 0x8000) - overflow = true; - bfd_put_signed_16 (abfd, voff, contents + nraddr); - break; - - case R_SH_SWITCH32: - voff += adjust; - bfd_put_signed_32 (abfd, voff, contents + nraddr); - break; - - case R_SH_USES: - irel->r_offset += adjust; - break; - } - - if (overflow) - { - ((*_bfd_error_handler) - ("%s: 0x%lx: fatal: reloc overflow while relaxing", - bfd_get_filename (abfd), (unsigned long) irel->r_vaddr)); - bfd_set_error (bfd_error_bad_value); - return false; - } - } - - irel->r_vaddr = nraddr + sec->vma; - } - - /* Look through all the other sections. If there contain any IMM32 - relocs against internal symbols which we are not going to adjust - below, we may need to adjust the addends. */ - for (o = abfd->sections; o != NULL; o = o->next) - { - struct internal_reloc *internal_relocs; - struct internal_reloc *irelscan, *irelscanend; - bfd_byte *ocontents; - - if (o == sec - || (o->flags & SEC_RELOC) == 0 - || o->reloc_count == 0) - continue; - - /* We always cache the relocs. Perhaps, if info->keep_memory is - false, we should free them, if we are permitted to, when we - leave sh_coff_relax_section. */ - internal_relocs = (_bfd_coff_read_internal_relocs - (abfd, o, true, (bfd_byte *) NULL, false, - (struct internal_reloc *) NULL)); - if (internal_relocs == NULL) - return false; - - ocontents = NULL; - irelscanend = internal_relocs + o->reloc_count; - for (irelscan = internal_relocs; irelscan < irelscanend; irelscan++) - { - struct internal_syment sym; - - if (irelscan->r_type != R_SH_IMM32) - continue; - - bfd_coff_swap_sym_in (abfd, - ((bfd_byte *) obj_coff_external_syms (abfd) - + (irelscan->r_symndx - * bfd_coff_symesz (abfd))), - &sym); - if (sym.n_sclass != C_EXT - && sym.n_scnum == sec->target_index - && ((bfd_vma) sym.n_value <= addr - || (bfd_vma) sym.n_value >= toaddr)) - { - bfd_vma val; - - if (ocontents == NULL) - { - if (coff_section_data (abfd, o)->contents != NULL) - ocontents = coff_section_data (abfd, o)->contents; - else - { - /* We always cache the section contents. - Perhaps, if info->keep_memory is false, we - should free them, if we are permitted to, - when we leave sh_coff_relax_section. */ - ocontents = (bfd_byte *) bfd_malloc (o->_raw_size); - if (ocontents == NULL) - return false; - if (! bfd_get_section_contents (abfd, o, ocontents, - (file_ptr) 0, - o->_raw_size)) - return false; - coff_section_data (abfd, o)->contents = ocontents; - } - } - - val = bfd_get_32 (abfd, ocontents + irelscan->r_vaddr - o->vma); - val += sym.n_value; - if (val >= addr && val < toaddr) - bfd_put_32 (abfd, val - count, - ocontents + irelscan->r_vaddr - o->vma); - - coff_section_data (abfd, o)->keep_contents = true; - } - } - } - - /* Adjusting the internal symbols will not work if something has - already retrieved the generic symbols. It would be possible to - make this work by adjusting the generic symbols at the same time. - However, this case should not arise in normal usage. */ - if (obj_symbols (abfd) != NULL - || obj_raw_syments (abfd) != NULL) - { - ((*_bfd_error_handler) - ("%s: fatal: generic symbols retrieved before relaxing", - bfd_get_filename (abfd))); - bfd_set_error (bfd_error_invalid_operation); - return false; - } - - /* Adjust all the symbols. */ - sym_hash = obj_coff_sym_hashes (abfd); - symesz = bfd_coff_symesz (abfd); - esym = (bfd_byte *) obj_coff_external_syms (abfd); - esymend = esym + obj_raw_syment_count (abfd) * symesz; - while (esym < esymend) - { - struct internal_syment isym; - - bfd_coff_swap_sym_in (abfd, (PTR) esym, (PTR) &isym); - - if (isym.n_scnum == sec->target_index - && (bfd_vma) isym.n_value > addr - && (bfd_vma) isym.n_value < toaddr) - { - isym.n_value -= count; - - bfd_coff_swap_sym_out (abfd, (PTR) &isym, (PTR) esym); - - if (*sym_hash != NULL) - { - BFD_ASSERT ((*sym_hash)->root.type == bfd_link_hash_defined - || (*sym_hash)->root.type == bfd_link_hash_defweak); - BFD_ASSERT ((*sym_hash)->root.u.def.value >= addr - && (*sym_hash)->root.u.def.value < toaddr); - (*sym_hash)->root.u.def.value -= count; - } - } - - esym += (isym.n_numaux + 1) * symesz; - sym_hash += isym.n_numaux + 1; - } - - /* See if we can move the ALIGN reloc forward. We have adjusted - r_vaddr for it already. */ - if (irelalign != NULL) - { - bfd_vma alignaddr; - - alignaddr = BFD_ALIGN (irelalign->r_vaddr - sec->vma, - 1 << irelalign->r_offset); - if (alignaddr != toaddr) - { - /* Tail recursion. */ - return sh_relax_delete_bytes (abfd, sec, - irelalign->r_vaddr - sec->vma, - 1 << irelalign->r_offset); - } - } - - return true; -} - -/* This is a modification of _bfd_coff_generic_relocate_section, which - will handle SH relaxing. */ - -static boolean -sh_relocate_section (output_bfd, info, input_bfd, input_section, contents, - relocs, syms, sections) - bfd *output_bfd; - struct bfd_link_info *info; - bfd *input_bfd; - asection *input_section; - bfd_byte *contents; - struct internal_reloc *relocs; - struct internal_syment *syms; - asection **sections; -{ - struct internal_reloc *rel; - struct internal_reloc *relend; - - rel = relocs; - relend = rel + input_section->reloc_count; - for (; rel < relend; rel++) - { - long symndx; - struct coff_link_hash_entry *h; - struct internal_syment *sym; - bfd_vma addend; - bfd_vma val; - reloc_howto_type *howto; - bfd_reloc_status_type rstat; - - /* Almost all relocs have to do with relaxing. If any work must - be done for them, it has been done in sh_relax_section. */ - if (rel->r_type != R_SH_IMM32 - && rel->r_type != R_SH_PCDISP) - continue; - - symndx = rel->r_symndx; - - if (symndx == -1) - { - h = NULL; - sym = NULL; - } - else - { - h = obj_coff_sym_hashes (input_bfd)[symndx]; - sym = syms + symndx; - } - - if (sym != NULL && sym->n_scnum != 0) - addend = - sym->n_value; - else - addend = 0; - - if (rel->r_type == R_SH_PCDISP) - addend -= 4; - - if (rel->r_type >= SH_COFF_HOWTO_COUNT) - howto = NULL; - else - howto = &sh_coff_howtos[rel->r_type]; - - if (howto == NULL) - { - bfd_set_error (bfd_error_bad_value); - return false; - } - - val = 0; - - if (h == NULL) - { - asection *sec; - - /* There is nothing to do for an internal PCDISP reloc. */ - if (rel->r_type == R_SH_PCDISP) - continue; - - if (symndx == -1) - { - sec = bfd_abs_section_ptr; - val = 0; - } - else - { - sec = sections[symndx]; - val = (sec->output_section->vma - + sec->output_offset - + sym->n_value - - sec->vma); - } - } - else - { - if (h->root.type == bfd_link_hash_defined - || h->root.type == bfd_link_hash_defweak) - { - asection *sec; - - sec = h->root.u.def.section; - val = (h->root.u.def.value - + sec->output_section->vma - + sec->output_offset); - } - else if (! info->relocateable) - { - if (! ((*info->callbacks->undefined_symbol) - (info, h->root.root.string, input_bfd, input_section, - rel->r_vaddr - input_section->vma))) - return false; - } - } - - rstat = _bfd_final_link_relocate (howto, input_bfd, input_section, - contents, - rel->r_vaddr - input_section->vma, - val, addend); - - switch (rstat) - { - default: - abort (); - case bfd_reloc_ok: - break; - case bfd_reloc_overflow: - { - const char *name; - char buf[SYMNMLEN + 1]; - - if (symndx == -1) - name = "*ABS*"; - else if (h != NULL) - name = h->root.root.string; - else if (sym->_n._n_n._n_zeroes == 0 - && sym->_n._n_n._n_offset != 0) - name = obj_coff_strings (input_bfd) + sym->_n._n_n._n_offset; - else - { - strncpy (buf, sym->_n._n_name, SYMNMLEN); - buf[SYMNMLEN] = '\0'; - name = buf; - } - - if (! ((*info->callbacks->reloc_overflow) - (info, name, howto->name, (bfd_vma) 0, input_bfd, - input_section, rel->r_vaddr - input_section->vma))) - return false; - } - } - } - - return true; -} - -/* This is a version of bfd_generic_get_relocated_section_contents - which uses sh_relocate_section. */ - -static bfd_byte * -sh_coff_get_relocated_section_contents (output_bfd, link_info, link_order, - data, relocateable, symbols) - bfd *output_bfd; - struct bfd_link_info *link_info; - struct bfd_link_order *link_order; - bfd_byte *data; - boolean relocateable; - asymbol **symbols; -{ - asection *input_section = link_order->u.indirect.section; - bfd *input_bfd = input_section->owner; - asection **sections = NULL; - struct internal_reloc *internal_relocs = NULL; - struct internal_syment *internal_syms = NULL; - - /* We only need to handle the case of relaxing, or of having a - particular set of section contents, specially. */ - if (relocateable - || coff_section_data (input_bfd, input_section) == NULL - || coff_section_data (input_bfd, input_section)->contents == NULL) - return bfd_generic_get_relocated_section_contents (output_bfd, link_info, - link_order, data, - relocateable, - symbols); - - memcpy (data, coff_section_data (input_bfd, input_section)->contents, - input_section->_raw_size); - - if ((input_section->flags & SEC_RELOC) != 0 - && input_section->reloc_count > 0) - { - bfd_size_type symesz = bfd_coff_symesz (input_bfd); - bfd_byte *esym, *esymend; - struct internal_syment *isymp; - asection **secpp; - - if (! _bfd_coff_get_external_symbols (input_bfd)) - goto error_return; - - internal_relocs = (_bfd_coff_read_internal_relocs - (input_bfd, input_section, false, (bfd_byte *) NULL, - false, (struct internal_reloc *) NULL)); - if (internal_relocs == NULL) - goto error_return; - - internal_syms = ((struct internal_syment *) - bfd_malloc (obj_raw_syment_count (input_bfd) - * sizeof (struct internal_syment))); - if (internal_syms == NULL) - goto error_return; - - sections = (asection **) bfd_malloc (obj_raw_syment_count (input_bfd) - * sizeof (asection *)); - if (sections == NULL) - goto error_return; - - isymp = internal_syms; - secpp = sections; - esym = (bfd_byte *) obj_coff_external_syms (input_bfd); - esymend = esym + obj_raw_syment_count (input_bfd) * symesz; - while (esym < esymend) - { - bfd_coff_swap_sym_in (input_bfd, (PTR) esym, (PTR) isymp); - - if (isymp->n_scnum != 0) - *secpp = coff_section_from_bfd_index (input_bfd, isymp->n_scnum); - else - { - if (isymp->n_value == 0) - *secpp = bfd_und_section_ptr; - else - *secpp = bfd_com_section_ptr; - } - - esym += (isymp->n_numaux + 1) * symesz; - secpp += isymp->n_numaux + 1; - isymp += isymp->n_numaux + 1; - } - - if (! sh_relocate_section (output_bfd, link_info, input_bfd, - input_section, data, internal_relocs, - internal_syms, sections)) - goto error_return; - - free (sections); - sections = NULL; - free (internal_syms); - internal_syms = NULL; - free (internal_relocs); - internal_relocs = NULL; - } - - return data; - - error_return: - if (internal_relocs != NULL) - free (internal_relocs); - if (internal_syms != NULL) - free (internal_syms); - if (sections != NULL) - free (sections); - return NULL; -} - -/* The target vectors. */ - -const bfd_target shcoff_vec = -{ - "coff-sh", /* name */ - bfd_target_coff_flavour, - BFD_ENDIAN_BIG, /* data byte order is big */ - BFD_ENDIAN_BIG, /* header byte order is big */ - - (HAS_RELOC | EXEC_P | /* object flags */ - HAS_LINENO | HAS_DEBUG | - HAS_SYMS | HAS_LOCALS | WP_TEXT | BFD_IS_RELAXABLE), - - (SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD | SEC_RELOC), - '_', /* leading symbol underscore */ - '/', /* ar_pad_char */ - 15, /* ar_max_namelen */ - bfd_getb64, bfd_getb_signed_64, bfd_putb64, - bfd_getb32, bfd_getb_signed_32, bfd_putb32, - bfd_getb16, bfd_getb_signed_16, bfd_putb16, /* data */ - bfd_getb64, bfd_getb_signed_64, bfd_putb64, - bfd_getb32, bfd_getb_signed_32, bfd_putb32, - bfd_getb16, bfd_getb_signed_16, bfd_putb16, /* hdrs */ - - {_bfd_dummy_target, coff_object_p, /* bfd_check_format */ - bfd_generic_archive_p, _bfd_dummy_target}, - {bfd_false, coff_mkobject, _bfd_generic_mkarchive, /* bfd_set_format */ - bfd_false}, - {bfd_false, coff_write_object_contents, /* bfd_write_contents */ - _bfd_write_archive_contents, bfd_false}, - - BFD_JUMP_TABLE_GENERIC (coff), - BFD_JUMP_TABLE_COPY (coff), - BFD_JUMP_TABLE_CORE (_bfd_nocore), - BFD_JUMP_TABLE_ARCHIVE (_bfd_archive_coff), - BFD_JUMP_TABLE_SYMBOLS (coff), - BFD_JUMP_TABLE_RELOCS (coff), - BFD_JUMP_TABLE_WRITE (coff), - BFD_JUMP_TABLE_LINK (coff), - BFD_JUMP_TABLE_DYNAMIC (_bfd_nodynamic), - - COFF_SWAP_TABLE, -}; - -const bfd_target shlcoff_vec = -{ - "coff-shl", /* name */ - bfd_target_coff_flavour, - BFD_ENDIAN_LITTLE, /* data byte order is little */ - BFD_ENDIAN_LITTLE, /* header byte order is little endian too*/ - - (HAS_RELOC | EXEC_P | /* object flags */ - HAS_LINENO | HAS_DEBUG | - HAS_SYMS | HAS_LOCALS | WP_TEXT | BFD_IS_RELAXABLE), - - (SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD | SEC_RELOC), - '_', /* leading symbol underscore */ - '/', /* ar_pad_char */ - 15, /* ar_max_namelen */ - bfd_getl64, bfd_getl_signed_64, bfd_putl64, - bfd_getl32, bfd_getl_signed_32, bfd_putl32, - bfd_getl16, bfd_getl_signed_16, bfd_putl16, /* data */ - bfd_getl64, bfd_getl_signed_64, bfd_putl64, - bfd_getl32, bfd_getl_signed_32, bfd_putl32, - bfd_getl16, bfd_getl_signed_16, bfd_putl16, /* hdrs */ - - {_bfd_dummy_target, coff_object_p, /* bfd_check_format */ - bfd_generic_archive_p, _bfd_dummy_target}, - {bfd_false, coff_mkobject, _bfd_generic_mkarchive, /* bfd_set_format */ - bfd_false}, - {bfd_false, coff_write_object_contents, /* bfd_write_contents */ - _bfd_write_archive_contents, bfd_false}, - - BFD_JUMP_TABLE_GENERIC (coff), - BFD_JUMP_TABLE_COPY (coff), - BFD_JUMP_TABLE_CORE (_bfd_nocore), - BFD_JUMP_TABLE_ARCHIVE (_bfd_archive_coff), - BFD_JUMP_TABLE_SYMBOLS (coff), - BFD_JUMP_TABLE_RELOCS (coff), - BFD_JUMP_TABLE_WRITE (coff), - BFD_JUMP_TABLE_LINK (coff), - BFD_JUMP_TABLE_DYNAMIC (_bfd_nodynamic), - - COFF_SWAP_TABLE, -}; diff --git a/contrib/gdb/bfd/coff-sparc.c b/contrib/gdb/bfd/coff-sparc.c deleted file mode 100644 index b9bc595dc5ab1..0000000000000 --- a/contrib/gdb/bfd/coff-sparc.c +++ /dev/null @@ -1,278 +0,0 @@ -/* BFD back-end for Sparc COFF files. - Copyright 1990, 1991, 1992, 1993, 1994 Free Software Foundation, Inc. - Written by Cygnus Support. - -This file is part of BFD, the Binary File Descriptor library. - -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 2 of the License, 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ - -#include "bfd.h" -#include "sysdep.h" -#include "libbfd.h" -#include "obstack.h" -#include "coff/sparc.h" -#include "coff/internal.h" -#include "libcoff.h" - -#define COFF_DEFAULT_SECTION_ALIGNMENT_POWER (3) - -#define BADMAG(x) ((x).f_magic != SPARCMAGIC && (x).f_magic != LYNXCOFFMAGIC) - -/* The page size is a guess based on ELF. */ -#define COFF_PAGE_SIZE 0x10000 - -enum reloc_type - { - R_SPARC_NONE = 0, - R_SPARC_8, R_SPARC_16, R_SPARC_32, - R_SPARC_DISP8, R_SPARC_DISP16, R_SPARC_DISP32, - R_SPARC_WDISP30, R_SPARC_WDISP22, - R_SPARC_HI22, R_SPARC_22, - R_SPARC_13, R_SPARC_LO10, - R_SPARC_GOT10, R_SPARC_GOT13, R_SPARC_GOT22, - R_SPARC_PC10, R_SPARC_PC22, - R_SPARC_WPLT30, - R_SPARC_COPY, - R_SPARC_GLOB_DAT, R_SPARC_JMP_SLOT, - R_SPARC_RELATIVE, - R_SPARC_UA32, - R_SPARC_max - }; - -#if 0 -static CONST char *CONST reloc_type_names[] = -{ - "R_SPARC_NONE", - "R_SPARC_8", "R_SPARC_16", "R_SPARC_32", - "R_SPARC_DISP8", "R_SPARC_DISP16", "R_SPARC_DISP32", - "R_SPARC_WDISP30", "R_SPARC_WDISP22", - "R_SPARC_HI22", "R_SPARC_22", - "R_SPARC_13", "R_SPARC_LO10", - "R_SPARC_GOT10", "R_SPARC_GOT13", "R_SPARC_GOT22", - "R_SPARC_PC10", "R_SPARC_PC22", - "R_SPARC_WPLT30", - "R_SPARC_COPY", - "R_SPARC_GLOB_DAT", "R_SPARC_JMP_SLOT", - "R_SPARC_RELATIVE", - "R_SPARC_UA32", -}; -#endif - -/* This is stolen pretty directly from elf.c. */ -static bfd_reloc_status_type -bfd_coff_generic_reloc PARAMS ((bfd *, arelent *, asymbol *, PTR, - asection *, bfd *, char **)); - -static bfd_reloc_status_type -bfd_coff_generic_reloc (abfd, reloc_entry, symbol, data, input_section, - output_bfd, error_message) - bfd *abfd; - arelent *reloc_entry; - asymbol *symbol; - PTR data; - asection *input_section; - bfd *output_bfd; - char **error_message; -{ - if (output_bfd != (bfd *) NULL - && (symbol->flags & BSF_SECTION_SYM) == 0 - && reloc_entry->addend == 0) - { - reloc_entry->address += input_section->output_offset; - return bfd_reloc_ok; - } - - return bfd_reloc_continue; -} - -static reloc_howto_type coff_sparc_howto_table[] = -{ - HOWTO(R_SPARC_NONE, 0,0, 0,false,0,complain_overflow_dont, bfd_coff_generic_reloc,"R_SPARC_NONE", false,0,0x00000000,true), - HOWTO(R_SPARC_8, 0,0, 8,false,0,complain_overflow_bitfield,bfd_coff_generic_reloc,"R_SPARC_8", false,0,0x000000ff,true), - HOWTO(R_SPARC_16, 0,1,16,false,0,complain_overflow_bitfield,bfd_coff_generic_reloc,"R_SPARC_16", false,0,0x0000ffff,true), - HOWTO(R_SPARC_32, 0,2,32,false,0,complain_overflow_bitfield,bfd_coff_generic_reloc,"R_SPARC_32", false,0,0xffffffff,true), - HOWTO(R_SPARC_DISP8, 0,0, 8,true, 0,complain_overflow_signed, bfd_coff_generic_reloc,"R_SPARC_DISP8", false,0,0x000000ff,true), - HOWTO(R_SPARC_DISP16, 0,1,16,true, 0,complain_overflow_signed, bfd_coff_generic_reloc,"R_SPARC_DISP16", false,0,0x0000ffff,true), - HOWTO(R_SPARC_DISP32, 0,2,32,true, 0,complain_overflow_signed, bfd_coff_generic_reloc,"R_SPARC_DISP32", false,0,0x00ffffff,true), - HOWTO(R_SPARC_WDISP30, 2,2,30,true, 0,complain_overflow_signed, bfd_coff_generic_reloc,"R_SPARC_WDISP30", false,0,0x3fffffff,true), - HOWTO(R_SPARC_WDISP22, 2,2,22,true, 0,complain_overflow_signed, bfd_coff_generic_reloc,"R_SPARC_WDISP22", false,0,0x003fffff,true), - HOWTO(R_SPARC_HI22, 10,2,22,false,0,complain_overflow_dont, bfd_coff_generic_reloc,"R_SPARC_HI22", false,0,0x003fffff,true), - HOWTO(R_SPARC_22, 0,2,22,false,0,complain_overflow_bitfield,bfd_coff_generic_reloc,"R_SPARC_22", false,0,0x003fffff,true), - HOWTO(R_SPARC_13, 0,2,13,false,0,complain_overflow_bitfield,bfd_coff_generic_reloc,"R_SPARC_13", false,0,0x00001fff,true), - HOWTO(R_SPARC_LO10, 0,2,10,false,0,complain_overflow_dont, bfd_coff_generic_reloc,"R_SPARC_LO10", false,0,0x000003ff,true), - HOWTO(R_SPARC_GOT10, 0,2,10,false,0,complain_overflow_bitfield,bfd_coff_generic_reloc,"R_SPARC_GOT10", false,0,0x000003ff,true), - HOWTO(R_SPARC_GOT13, 0,2,13,false,0,complain_overflow_bitfield,bfd_coff_generic_reloc,"R_SPARC_GOT13", false,0,0x00001fff,true), - HOWTO(R_SPARC_GOT22, 10,2,22,false,0,complain_overflow_bitfield,bfd_coff_generic_reloc,"R_SPARC_GOT22", false,0,0x003fffff,true), - HOWTO(R_SPARC_PC10, 0,2,10,false,0,complain_overflow_bitfield,bfd_coff_generic_reloc,"R_SPARC_PC10", false,0,0x000003ff,true), - HOWTO(R_SPARC_PC22, 0,2,22,false,0,complain_overflow_bitfield,bfd_coff_generic_reloc,"R_SPARC_PC22", false,0,0x003fffff,true), - HOWTO(R_SPARC_WPLT30, 0,0,00,false,0,complain_overflow_dont, bfd_coff_generic_reloc,"R_SPARC_WPLT30", false,0,0x00000000,true), - HOWTO(R_SPARC_COPY, 0,0,00,false,0,complain_overflow_dont, bfd_coff_generic_reloc,"R_SPARC_COPY", false,0,0x00000000,true), - HOWTO(R_SPARC_GLOB_DAT,0,0,00,false,0,complain_overflow_dont, bfd_coff_generic_reloc,"R_SPARC_GLOB_DAT",false,0,0x00000000,true), - HOWTO(R_SPARC_JMP_SLOT,0,0,00,false,0,complain_overflow_dont, bfd_coff_generic_reloc,"R_SPARC_JMP_SLOT",false,0,0x00000000,true), - HOWTO(R_SPARC_RELATIVE,0,0,00,false,0,complain_overflow_dont, bfd_coff_generic_reloc,"R_SPARC_RELATIVE",false,0,0x00000000,true), - HOWTO(R_SPARC_UA32, 0,0,00,false,0,complain_overflow_dont, bfd_coff_generic_reloc,"R_SPARC_UA32", false,0,0x00000000,true), -}; - -struct coff_reloc_map { - unsigned char bfd_reloc_val; - unsigned char coff_reloc_val; -}; - -static CONST struct coff_reloc_map sparc_reloc_map[] = -{ - { BFD_RELOC_NONE, R_SPARC_NONE, }, - { BFD_RELOC_16, R_SPARC_16, }, - { BFD_RELOC_8, R_SPARC_8 }, - { BFD_RELOC_8_PCREL, R_SPARC_DISP8 }, - { BFD_RELOC_CTOR, R_SPARC_32 }, /* @@ Assumes 32 bits. */ - { BFD_RELOC_32, R_SPARC_32 }, - { BFD_RELOC_32_PCREL, R_SPARC_DISP32 }, - { BFD_RELOC_HI22, R_SPARC_HI22 }, - { BFD_RELOC_LO10, R_SPARC_LO10, }, - { BFD_RELOC_32_PCREL_S2, R_SPARC_WDISP30 }, - { BFD_RELOC_SPARC22, R_SPARC_22 }, - { BFD_RELOC_SPARC13, R_SPARC_13 }, - { BFD_RELOC_SPARC_GOT10, R_SPARC_GOT10 }, - { BFD_RELOC_SPARC_GOT13, R_SPARC_GOT13 }, - { BFD_RELOC_SPARC_GOT22, R_SPARC_GOT22 }, - { BFD_RELOC_SPARC_PC10, R_SPARC_PC10 }, - { BFD_RELOC_SPARC_PC22, R_SPARC_PC22 }, - { BFD_RELOC_SPARC_WPLT30, R_SPARC_WPLT30 }, - { BFD_RELOC_SPARC_COPY, R_SPARC_COPY }, - { BFD_RELOC_SPARC_GLOB_DAT, R_SPARC_GLOB_DAT }, - { BFD_RELOC_SPARC_JMP_SLOT, R_SPARC_JMP_SLOT }, - { BFD_RELOC_SPARC_RELATIVE, R_SPARC_RELATIVE }, - { BFD_RELOC_SPARC_WDISP22, R_SPARC_WDISP22 }, - /* { BFD_RELOC_SPARC_UA32, R_SPARC_UA32 }, not used?? */ -}; - -static reloc_howto_type * -coff_sparc_reloc_type_lookup (abfd, code) - bfd *abfd; - bfd_reloc_code_real_type code; -{ - unsigned int i; - for (i = 0; i < sizeof (sparc_reloc_map) / sizeof (struct coff_reloc_map); i++) - { - if (sparc_reloc_map[i].bfd_reloc_val == code) - return &coff_sparc_howto_table[(int) sparc_reloc_map[i].coff_reloc_val]; - } - return 0; -} -#define coff_bfd_reloc_type_lookup coff_sparc_reloc_type_lookup - -static void -rtype2howto (cache_ptr, dst) - arelent *cache_ptr; - struct internal_reloc *dst; -{ - BFD_ASSERT (dst->r_type < (unsigned int) R_SPARC_max); - cache_ptr->howto = &coff_sparc_howto_table[dst->r_type]; -} - -#define RTYPE2HOWTO(internal, relocentry) rtype2howto(internal,relocentry) - -#define SWAP_IN_RELOC_OFFSET bfd_h_get_32 -#define SWAP_OUT_RELOC_OFFSET bfd_h_put_32 -/* This is just like the standard one, except that we don't set up an - addend for relocs against global symbols (otherwise linking objects - created by -r fails), and we add in the reloc offset at the end. */ -#define CALC_ADDEND(abfd, ptr, reloc, cache_ptr) \ - { \ - coff_symbol_type *coffsym = (coff_symbol_type *) NULL; \ - if (ptr && bfd_asymbol_bfd (ptr) != abfd) \ - coffsym = (obj_symbols (abfd) \ - + (cache_ptr->sym_ptr_ptr - symbols)); \ - else if (ptr) \ - coffsym = coff_symbol_from (abfd, ptr); \ - if (coffsym != (coff_symbol_type *) NULL \ - && coffsym->native->u.syment.n_scnum == 0) \ - cache_ptr->addend = 0; \ - else if (ptr && bfd_asymbol_bfd (ptr) == abfd \ - && ptr->section != (asection *) NULL \ - && (ptr->flags & BSF_GLOBAL) == 0) \ - cache_ptr->addend = - (ptr->section->vma + ptr->value); \ - else \ - cache_ptr->addend = 0; \ - cache_ptr->addend += reloc.r_offset; \ - } - -/* Clear the r_spare field in relocs. */ -#define SWAP_OUT_RELOC_EXTRA(abfd,src,dst) \ - do { \ - dst->r_spare[0] = 0; \ - dst->r_spare[1] = 0; \ - } while (0) - -#define __A_MAGIC_SET__ - -/* Enable Sparc-specific hacks in coffcode.h. */ - -#define COFF_SPARC - -#include "coffcode.h" - -const bfd_target -#ifdef TARGET_SYM - TARGET_SYM = -#else - sparccoff_vec = -#endif -{ -#ifdef TARGET_NAME - TARGET_NAME, -#else - "coff-sparc", /* name */ -#endif - bfd_target_coff_flavour, - BFD_ENDIAN_BIG, /* data byte order is big */ - BFD_ENDIAN_BIG, /* header byte order is big */ - - (HAS_RELOC | EXEC_P | /* object flags */ - HAS_LINENO | HAS_DEBUG | - HAS_SYMS | HAS_LOCALS | WP_TEXT | D_PAGED), - - (SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD | SEC_RELOC), /* section flags */ - '_', /* leading underscore */ - '/', /* ar_pad_char */ - 15, /* ar_max_namelen */ - - bfd_getb64, bfd_getb_signed_64, bfd_putb64, - bfd_getb32, bfd_getb_signed_32, bfd_putb32, - bfd_getb16, bfd_getb_signed_16, bfd_putb16, /* data */ - bfd_getb64, bfd_getb_signed_64, bfd_putb64, - bfd_getb32, bfd_getb_signed_32, bfd_putb32, - bfd_getb16, bfd_getb_signed_16, bfd_putb16, /* hdrs */ - -/* Note that we allow an object file to be treated as a core file as well. */ - {_bfd_dummy_target, coff_object_p, /* bfd_check_format */ - bfd_generic_archive_p, coff_object_p}, - {bfd_false, coff_mkobject, _bfd_generic_mkarchive, /* bfd_set_format */ - bfd_false}, - {bfd_false, coff_write_object_contents, /* bfd_write_contents */ - _bfd_write_archive_contents, bfd_false}, - - BFD_JUMP_TABLE_GENERIC (coff), - BFD_JUMP_TABLE_COPY (coff), - BFD_JUMP_TABLE_CORE (_bfd_nocore), - BFD_JUMP_TABLE_ARCHIVE (_bfd_archive_coff), - BFD_JUMP_TABLE_SYMBOLS (coff), - BFD_JUMP_TABLE_RELOCS (coff), - BFD_JUMP_TABLE_WRITE (coff), - BFD_JUMP_TABLE_LINK (coff), - BFD_JUMP_TABLE_DYNAMIC (_bfd_nodynamic), - - COFF_SWAP_TABLE, -}; diff --git a/contrib/gdb/bfd/coff-u68k.c b/contrib/gdb/bfd/coff-u68k.c deleted file mode 100644 index 97ea73fa9c62b..0000000000000 --- a/contrib/gdb/bfd/coff-u68k.c +++ /dev/null @@ -1,35 +0,0 @@ -/* BFD back-end for Motorola 68000 COFF binaries having underscore with name. - Copyright 1990, 1991, 1992 Free Software Foundation, Inc. - Written by Cygnus Support. - -This file is part of BFD, the Binary File Descriptor library. - -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 2 of the License, 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ - -#define TARGET_SYM m68kcoffun_vec -#define TARGET_NAME "coff-m68k-un" - -#define NAMES_HAVE_UNDERSCORE - -/* define this to not have multiple copy of m68k_rtype2howto - in the executable file */ -#define ONLY_DECLARE_RELOCS - -/* This magic number indicates that the names have underscores. - Other 68k magic numbers indicate that the names do not have - underscores. */ -#define BADMAG(x) ((x).f_magic != MC68KBCSMAGIC) - -#include "coff-m68k.c" diff --git a/contrib/gdb/bfd/coff-w65.c b/contrib/gdb/bfd/coff-w65.c deleted file mode 100644 index a02243f1d1b9d..0000000000000 --- a/contrib/gdb/bfd/coff-w65.c +++ /dev/null @@ -1,446 +0,0 @@ -/* BFD back-end for WDC 65816 COFF binaries. - Copyright 1995 Free Software Foundation, Inc. - Written by Steve Chamberlain, <sac@cygnus.com>. - -This file is part of BFD, the Binary File Descriptor library. - -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 2 of the License, 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ - -#include "bfd.h" -#include "sysdep.h" -#include "obstack.h" -#include "libbfd.h" -#include "bfdlink.h" -#include "coff/w65.h" -#include "coff/internal.h" -#include "libcoff.h" - -#define COFF_DEFAULT_SECTION_ALIGNMENT_POWER (1) -static reloc_howto_type howto_table[] = -{ - HOWTO (R_W65_ABS8, 0, 0, 8, false, 0, complain_overflow_bitfield, 0, "abs8", true, 0x000000ff, 0x000000ff, false), - HOWTO (R_W65_ABS16, 1, 0, 16, false, 0, complain_overflow_bitfield, 0, "abs16", true, 0x0000ffff, 0x0000ffff, false), - HOWTO (R_W65_ABS24, 0, 2, 32, false, 0, complain_overflow_bitfield, 0, "abs24", true, 0x00ffffff, 0x00ffffff, false), - HOWTO (R_W65_ABS8S8, 0, 0, 8, false, 0, complain_overflow_bitfield, 0, ">abs8", true, 0x000000ff, 0x000000ff, false), - HOWTO (R_W65_ABS8S16, 0, 0, 8, false, 0, complain_overflow_bitfield, 0, "^abs8", true, 0x000000ff, 0x000000ff, false), - HOWTO (R_W65_ABS16S8, 1, 0, 16, false, 0, complain_overflow_bitfield, 0, ">abs16", true, 0x0000ffff, 0x0000ffff, false), - HOWTO (R_W65_ABS16S16,1, 0, 16, false, 0, complain_overflow_bitfield, 0, "^abs16", true, 0x0000ffff, 0x0000ffff, false), - HOWTO (R_W65_PCR8, 0, 0, 8, false, 0, complain_overflow_bitfield, 0, "pcrel8", true, 0x000000ff, 0x000000ff, true), - HOWTO (R_W65_PCR16, 1, 0, 16, false, 0, complain_overflow_bitfield, 0, "pcrel16", true, 0x0000ffff, 0x0000ffff, true), - HOWTO (R_W65_DP, 0, 0, 8, false, 0, complain_overflow_bitfield, 0, "dp", true, 0x000000ff, 0x000000ff, false), - -}; - - -/* Turn a howto into a reloc number */ - -#define SELECT_RELOC(x,howto) \ - { x.r_type = select_reloc(howto); } - -#define BADMAG(x) (W65BADMAG(x)) -#define W65 1 /* Customize coffcode.h */ -#define __A_MAGIC_SET__ - - -/* Code to swap in the reloc */ -#define SWAP_IN_RELOC_OFFSET bfd_h_get_32 -#define SWAP_OUT_RELOC_OFFSET bfd_h_put_32 -#define SWAP_OUT_RELOC_EXTRA(abfd, src, dst) \ - dst->r_stuff[0] = 'S'; \ - dst->r_stuff[1] = 'C'; - - -static int -select_reloc (howto) - reloc_howto_type *howto; -{ - return howto->type ; -} - -/* Code to turn a r_type into a howto ptr, uses the above howto table - */ - -static void -rtype2howto (internal, dst) - arelent *internal; - struct internal_reloc *dst; -{ - internal->howto = howto_table + dst->r_type - 1; -} - -#define RTYPE2HOWTO(internal, relocentry) rtype2howto(internal,relocentry) - - -/* Perform any necessaru magic to the addend in a reloc entry */ - - -#define CALC_ADDEND(abfd, symbol, ext_reloc, cache_ptr) \ - cache_ptr->addend = ext_reloc.r_offset; - - -#define RELOC_PROCESSING(relent,reloc,symbols,abfd,section) \ - reloc_processing(relent, reloc, symbols, abfd, section) - -static void -reloc_processing (relent, reloc, symbols, abfd, section) - arelent * relent; - struct internal_reloc *reloc; - asymbol ** symbols; - bfd * abfd; - asection * section; -{ - relent->address = reloc->r_vaddr; - rtype2howto (relent, reloc); - - if (((int) reloc->r_symndx) > 0) - { - relent->sym_ptr_ptr = symbols + obj_convert (abfd)[reloc->r_symndx]; - } - else - { - relent->sym_ptr_ptr = (asymbol **)&(bfd_abs_symbol); - } - - - - relent->addend = reloc->r_offset; - - relent->address -= section->vma; - /* relent->section = 0;*/ -} - - -static int -h8300_reloc16_estimate(abfd, input_section, reloc, shrink, link_info) - bfd *abfd; - asection *input_section; - arelent *reloc; - unsigned int shrink; - struct bfd_link_info *link_info; -{ - bfd_vma value; - bfd_vma dot; - bfd_vma gap; - - /* The address of the thing to be relocated will have moved back by - the size of the shrink - but we don't change reloc->address here, - since we need it to know where the relocation lives in the source - uncooked section */ - - /* reloc->address -= shrink; conceptual */ - - bfd_vma address = reloc->address - shrink; - - - switch (reloc->howto->type) - { - case R_MOVB2: - case R_JMP2: - shrink+=2; - break; - - /* Thing is a move one byte */ - case R_MOVB1: - value = bfd_coff_reloc16_get_value(reloc, link_info, input_section); - - if (value >= 0xff00) - { - - /* Change the reloc type from 16bit, possible 8 to 8bit - possible 16 */ - reloc->howto = reloc->howto + 1; - /* The place to relc moves back by one */ - /* This will be two bytes smaller in the long run */ - shrink +=2 ; - bfd_perform_slip(abfd, 2, input_section, address); - } - - break; - /* This is the 24 bit branch which could become an 8 bitter, - the relocation points to the first byte of the insn, not the - actual data */ - - case R_JMPL1: - value = bfd_coff_reloc16_get_value(reloc, link_info, input_section); - - dot = input_section->output_section->vma + - input_section->output_offset + address; - - /* See if the address we're looking at within 127 bytes of where - we are, if so then we can use a small branch rather than the - jump we were going to */ - - gap = value - dot ; - - if (-120 < (long)gap && (long)gap < 120 ) - { - - /* Change the reloc type from 24bit, possible 8 to 8bit - possible 32 */ - reloc->howto = reloc->howto + 1; - /* This will be two bytes smaller in the long run */ - shrink +=2 ; - bfd_perform_slip(abfd, 2, input_section, address); - } - break; - - case R_JMP1: - - value = bfd_coff_reloc16_get_value(reloc, link_info, input_section); - - dot = input_section->output_section->vma + - input_section->output_offset + address; - - /* See if the address we're looking at within 127 bytes of where - we are, if so then we can use a small branch rather than the - jump we were going to */ - - gap = value - (dot - shrink); - - - if (-120 < (long)gap && (long)gap < 120 ) - { - - /* Change the reloc type from 16bit, possible 8 to 8bit - possible 16 */ - reloc->howto = reloc->howto + 1; - /* The place to relc moves back by one */ - - /* This will be two bytes smaller in the long run */ - shrink +=2 ; - bfd_perform_slip(abfd, 2, input_section, address); - } - break; - } - - - return shrink; -} - - -/* First phase of a relaxing link */ - -/* Reloc types - large small - R_MOVB1 R_MOVB2 mov.b with 16bit or 8 bit address - R_JMP1 R_JMP2 jmp or pcrel branch - R_JMPL1 R_JMPL_B8 24jmp or pcrel branch - R_MOVLB1 R_MOVLB2 24 or 8 bit reloc for mov.b - -*/ - -static void -h8300_reloc16_extra_cases (abfd, link_info, link_order, reloc, data, src_ptr, - dst_ptr) - bfd *abfd; - struct bfd_link_info *link_info; - struct bfd_link_order *link_order; - arelent *reloc; - bfd_byte *data; - unsigned int *src_ptr; - unsigned int *dst_ptr; -{ - unsigned int src_address = *src_ptr; - unsigned int dst_address = *dst_ptr; - asection *input_section = link_order->u.indirect.section; - - switch (reloc->howto->type) - { - case R_W65_ABS8: - case R_W65_DP: - { - unsigned int gap = bfd_coff_reloc16_get_value (reloc, link_info, - input_section); - bfd_put_8 (abfd, gap, data + dst_address); - dst_address += 1; - src_address += 1; - } - break; - - case R_W65_ABS8S8: - { - unsigned int gap = bfd_coff_reloc16_get_value (reloc, link_info, - input_section); - gap >>= 8; - bfd_put_8 (abfd, gap, data + dst_address); - dst_address += 1; - src_address += 1; - } - break; - - case R_W65_ABS8S16: - { - unsigned int gap = bfd_coff_reloc16_get_value (reloc, link_info, - input_section); - gap >>=16; - bfd_put_8 (abfd, gap, data + dst_address); - dst_address += 1; - src_address += 1; - } - break; - - case R_W65_ABS16: - { - unsigned int gap = bfd_coff_reloc16_get_value (reloc, link_info, - input_section); - - bfd_put_16 (abfd, gap, data + dst_address); - dst_address += 2; - src_address += 2; - } - break; - case R_W65_ABS16S8: - { - unsigned int gap = bfd_coff_reloc16_get_value (reloc, link_info, - input_section); - gap >>= 8; - bfd_put_16 (abfd, gap, data + dst_address); - dst_address += 2; - src_address += 2; - } - break; - case R_W65_ABS16S16: - { - unsigned int gap = bfd_coff_reloc16_get_value (reloc, link_info, - input_section); - gap >>= 16; - bfd_put_16 (abfd, gap, data + dst_address); - dst_address += 2; - src_address += 2; - } - break; - - case R_W65_ABS24: - { - unsigned int gap = bfd_coff_reloc16_get_value (reloc, link_info, - input_section); - bfd_put_16 (abfd, gap, data + dst_address); - bfd_put_8 (abfd, gap>>16, data+dst_address+2); - dst_address += 3; - src_address += 3; - } - break; - - case R_W65_PCR8: - { - int gap = bfd_coff_reloc16_get_value (reloc, link_info, - input_section); - bfd_vma dot = link_order->offset - + dst_address - + link_order->u.indirect.section->output_section->vma; - - gap -= dot + 1; - if (gap < -128 || gap > 127) { - if (! ((*link_info->callbacks->reloc_overflow) - (link_info, bfd_asymbol_name (*reloc->sym_ptr_ptr), - reloc->howto->name, reloc->addend, input_section->owner, - input_section, reloc->address))) - abort(); - } - bfd_put_8 (abfd, gap, data + dst_address); - dst_address += 1; - src_address += 1; - } - break; - - case R_W65_PCR16: - { - bfd_vma gap = bfd_coff_reloc16_get_value (reloc, link_info, - input_section); - bfd_vma dot = link_order->offset - + dst_address - + link_order->u.indirect.section->output_section->vma; - - - /* This wraps within the page, so ignore the relativeness, look at the - high part */ - if ((gap & 0xf0000) != (dot & 0xf0000)) { - if (! ((*link_info->callbacks->reloc_overflow) - (link_info, bfd_asymbol_name (*reloc->sym_ptr_ptr), - reloc->howto->name, reloc->addend, input_section->owner, - input_section, reloc->address))) - abort(); - } - - gap -= dot + 2; - bfd_put_16 (abfd, gap, data + dst_address); - dst_address += 2; - src_address += 2; - } - break; - default: - printf("ignoring reloc %s\n", reloc->howto->name); - break; - - } - *src_ptr = src_address; - *dst_ptr = dst_address; - -} - -#define coff_reloc16_extra_cases h8300_reloc16_extra_cases -#define coff_reloc16_estimate h8300_reloc16_estimate - -#include "coffcode.h" - - -#undef coff_bfd_get_relocated_section_contents -#undef coff_bfd_relax_section -#define coff_bfd_get_relocated_section_contents \ - bfd_coff_reloc16_get_relocated_section_contents -#define coff_bfd_relax_section bfd_coff_reloc16_relax_section - - - -bfd_target w65_vec = -{ - "coff-w65", /* name */ - bfd_target_coff_flavour, - BFD_ENDIAN_LITTLE, /* data byte order is little */ - BFD_ENDIAN_LITTLE, /* header byte order is little */ - - (HAS_RELOC | EXEC_P | /* object flags */ - HAS_LINENO | HAS_DEBUG | - HAS_SYMS | HAS_LOCALS | WP_TEXT | BFD_IS_RELAXABLE ), - (SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD | SEC_RELOC), /* section flags */ - '_', /* leading char */ - '/', /* ar_pad_char */ - 15, /* ar_max_namelen */ - bfd_getl64, bfd_getl_signed_64, bfd_putl64, - bfd_getl32, bfd_getl_signed_32, bfd_putl32, - bfd_getl16, bfd_getl_signed_16, bfd_putl16, /* data */ - bfd_getl64, bfd_getl_signed_64, bfd_putl64, - bfd_getl32, bfd_getl_signed_32, bfd_putl32, - bfd_getl16, bfd_getl_signed_16, bfd_putl16, /* hdrs */ - - {_bfd_dummy_target, coff_object_p, /* bfd_check_format */ - bfd_generic_archive_p, _bfd_dummy_target}, - {bfd_false, coff_mkobject, _bfd_generic_mkarchive, /* bfd_set_format */ - bfd_false}, - {bfd_false, coff_write_object_contents, /* bfd_write_contents */ - _bfd_write_archive_contents, bfd_false}, - - BFD_JUMP_TABLE_GENERIC (coff), - BFD_JUMP_TABLE_COPY (coff), - BFD_JUMP_TABLE_CORE (_bfd_nocore), - BFD_JUMP_TABLE_ARCHIVE (_bfd_archive_coff), - BFD_JUMP_TABLE_SYMBOLS (coff), - BFD_JUMP_TABLE_RELOCS (coff), - BFD_JUMP_TABLE_WRITE (coff), - BFD_JUMP_TABLE_LINK (coff), - BFD_JUMP_TABLE_DYNAMIC (_bfd_nodynamic), - - COFF_SWAP_TABLE, -}; diff --git a/contrib/gdb/bfd/coff-we32k.c b/contrib/gdb/bfd/coff-we32k.c deleted file mode 100644 index 36f1fa17fded2..0000000000000 --- a/contrib/gdb/bfd/coff-we32k.c +++ /dev/null @@ -1,110 +0,0 @@ -/* BFD back-end for we32k COFF files. - Copyright (C) 1992, 1993, 1994 Free Software Foundation, Inc. - Contributed by Brendan Kehoe (brendan@cs.widener.edu). - -This file is part of BFD, the Binary File Descriptor library. - -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 2 of the License, 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ - -#include "bfd.h" -#include "sysdep.h" -#include "libbfd.h" -#include "obstack.h" -#include "coff/we32k.h" -#include "coff/internal.h" -#include "libcoff.h" - -#define COFF_DEFAULT_SECTION_ALIGNMENT_POWER (3) - -static reloc_howto_type howto_table[] = -{ - {0}, - {1}, - {2}, - {3}, - {4}, - {5}, - HOWTO(R_DIR32, 0, 2, 32, false, 0,complain_overflow_bitfield, 0, "dir32", true, 0xffffffff,0xffffffff, false), - {7}, - {010}, - {011}, - {012}, - {013}, - {014}, - {015}, - {016}, - HOWTO(R_RELBYTE, 0, 0, 8, false, 0, complain_overflow_bitfield, 0, "8", true, 0x000000ff,0x000000ff, false), - HOWTO(R_RELWORD, 0, 1, 16, false, 0, complain_overflow_bitfield, 0, "16", true, 0x0000ffff,0x0000ffff, false), - HOWTO(R_RELLONG, 0, 2, 32, false, 0, complain_overflow_bitfield, 0, "32", true, 0xffffffff,0xffffffff, false), - HOWTO(R_PCRBYTE, 0, 0, 8, true, 0, complain_overflow_signed, 0, "DISP8", true, 0x000000ff,0x000000ff, false), - HOWTO(R_PCRWORD, 0, 1, 16, true, 0, complain_overflow_signed, 0, "DISP16", true, 0x0000ffff,0x0000ffff, false), - HOWTO(R_PCRLONG, 0, 2, 32, true, 0, complain_overflow_signed, 0, "DISP32", true, 0xffffffff,0xffffffff, false), -}; - -/* Turn a howto into a reloc nunmber */ - -#define SELECT_RELOC(x,howto) { x.r_type = howto->type; } -#define BADMAG(x) WE32KBADMAG(x) -#define WE32K 1 - -#define RTYPE2HOWTO(cache_ptr, dst) \ - (cache_ptr)->howto = howto_table + (dst)->r_type; - -#include "coffcode.h" - -#define coff_write_armap bsd_write_armap - -const bfd_target we32kcoff_vec = -{ - "coff-we32k", /* name */ - bfd_target_coff_flavour, - BFD_ENDIAN_BIG, /* data byte order is big */ - BFD_ENDIAN_BIG, /* header byte order is big */ - - (HAS_RELOC | EXEC_P | /* object flags */ - HAS_LINENO | HAS_DEBUG | - HAS_SYMS | HAS_LOCALS | WP_TEXT), - - (SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD | SEC_RELOC), /* section flags */ - 0, /* leading underscore */ - '/', /* ar_pad_char */ - 15, /* ar_max_namelen */ - - bfd_getb64, bfd_getb_signed_64, bfd_putb64, - bfd_getb32, bfd_getb_signed_32, bfd_putb32, - bfd_getb16, bfd_getb_signed_16, bfd_putb16, /* data */ - bfd_getb64, bfd_getb_signed_64, bfd_putb64, - bfd_getb32, bfd_getb_signed_32, bfd_putb32, - bfd_getb16, bfd_getb_signed_16, bfd_putb16, /* hdrs */ - - {_bfd_dummy_target, coff_object_p, /* bfd_check_format */ - bfd_generic_archive_p, _bfd_dummy_target}, - {bfd_false, coff_mkobject, _bfd_generic_mkarchive, /* bfd_set_format */ - bfd_false}, - {bfd_false, coff_write_object_contents, /* bfd_write_contents */ - _bfd_write_archive_contents, bfd_false}, - - BFD_JUMP_TABLE_GENERIC (coff), - BFD_JUMP_TABLE_COPY (coff), - BFD_JUMP_TABLE_CORE (_bfd_nocore), - BFD_JUMP_TABLE_ARCHIVE (_bfd_archive_coff), - BFD_JUMP_TABLE_SYMBOLS (coff), - BFD_JUMP_TABLE_RELOCS (coff), - BFD_JUMP_TABLE_WRITE (coff), - BFD_JUMP_TABLE_LINK (coff), - BFD_JUMP_TABLE_DYNAMIC (_bfd_nodynamic), - - COFF_SWAP_TABLE, -}; diff --git a/contrib/gdb/bfd/coff-z8k.c b/contrib/gdb/bfd/coff-z8k.c deleted file mode 100644 index 5609d35d0f223..0000000000000 --- a/contrib/gdb/bfd/coff-z8k.c +++ /dev/null @@ -1,281 +0,0 @@ -/* BFD back-end for Zilog Z800n COFF binaries. - Copyright 1992, 1993, 1994 Free Software Foundation, Inc. - Contributed by Cygnus Support. - Written by Steve Chamberlain, <sac@cygnus.com>. - -This file is part of BFD, the Binary File Descriptor library. - -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 2 of the License, 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ - -#include "bfd.h" -#include "sysdep.h" -#include "obstack.h" -#include "libbfd.h" -#include "bfdlink.h" -#include "coff/z8k.h" -#include "coff/internal.h" -#include "libcoff.h" - -#define COFF_DEFAULT_SECTION_ALIGNMENT_POWER (1) - -static reloc_howto_type r_imm32 = -HOWTO (R_IMM32, 0, 1, 32, false, 0, - complain_overflow_bitfield, 0, "r_imm32", true, 0xffffffff, - 0xffffffff, false); - -static reloc_howto_type r_imm4l = -HOWTO (R_IMM4L, 0, 1, 4, false, 0, - complain_overflow_bitfield, 0, "r_imm4l", true, 0xf, 0xf, false); - -static reloc_howto_type r_da = -HOWTO (R_IMM16, 0, 1, 16, false, 0, - complain_overflow_bitfield, 0, "r_da", true, 0x0000ffff, 0x0000ffff, - false); - -static reloc_howto_type r_imm8 = -HOWTO (R_IMM8, 0, 1, 8, false, 0, - complain_overflow_bitfield, 0, "r_imm8", true, 0x000000ff, 0x000000ff, - false); - -static reloc_howto_type r_jr = -HOWTO (R_JR, 0, 1, 8, true, 0, complain_overflow_signed, 0, - "r_jr", true, 0, 0, true); - -/* Turn a howto into a reloc number */ - -static int -coff_z8k_select_reloc (howto) - reloc_howto_type *howto; -{ - return howto->type; -} - -#define SELECT_RELOC(x,howto) x.r_type = coff_z8k_select_reloc(howto) - - -#define BADMAG(x) Z8KBADMAG(x) -#define Z8K 1 /* Customize coffcode.h */ -#define __A_MAGIC_SET__ - - - -/* Code to swap in the reloc */ -#define SWAP_IN_RELOC_OFFSET bfd_h_get_32 -#define SWAP_OUT_RELOC_OFFSET bfd_h_put_32 -#define SWAP_OUT_RELOC_EXTRA(abfd, src, dst) \ - dst->r_stuff[0] = 'S'; \ - dst->r_stuff[1] = 'C'; - -/* Code to turn a r_type into a howto ptr, uses the above howto table - */ - -static void -rtype2howto (internal, dst) - arelent * internal; - struct internal_reloc *dst; -{ - switch (dst->r_type) - { - default: - abort (); - break; - case R_IMM8: - internal->howto = &r_imm8; - break; - case R_IMM16: - internal->howto = &r_da; - break; - case R_JR: - internal->howto = &r_jr; - break; - case R_IMM32: - internal->howto = &r_imm32; - break; - case R_IMM4L: - internal->howto = &r_imm4l; - break; - } -} - -#define RTYPE2HOWTO(internal, relocentry) rtype2howto(internal,relocentry) - - -/* Perform any necessaru magic to the addend in a reloc entry */ - - -#define CALC_ADDEND(abfd, symbol, ext_reloc, cache_ptr) \ - cache_ptr->addend = ext_reloc.r_offset; - - -#define RELOC_PROCESSING(relent,reloc,symbols,abfd,section) \ - reloc_processing(relent, reloc, symbols, abfd, section) - -static void -reloc_processing (relent, reloc, symbols, abfd, section) - arelent * relent; - struct internal_reloc *reloc; - asymbol ** symbols; - bfd * abfd; - asection * section; -{ - relent->address = reloc->r_vaddr; - rtype2howto (relent, reloc); - - if (reloc->r_symndx > 0) - { - relent->sym_ptr_ptr = symbols + obj_convert (abfd)[reloc->r_symndx]; - } - else - { - relent->sym_ptr_ptr = bfd_abs_section_ptr->symbol_ptr_ptr; - } - - - relent->addend = reloc->r_offset; - relent->address -= section->vma; -} - -static void -extra_case (in_abfd, link_info, link_order, reloc, data, src_ptr, dst_ptr) - bfd *in_abfd; - struct bfd_link_info *link_info; - struct bfd_link_order *link_order; - arelent *reloc; - bfd_byte *data; - unsigned int *src_ptr; - unsigned int *dst_ptr; -{ - asection *input_section = link_order->u.indirect.section; - - switch (reloc->howto->type) - { - case R_IMM8: - bfd_put_8 (in_abfd, - bfd_coff_reloc16_get_value (reloc, link_info, input_section), - data + *dst_ptr); - (*dst_ptr) += 1; - (*src_ptr) += 1; - break; - - case R_IMM32: - bfd_put_32 (in_abfd, - bfd_coff_reloc16_get_value (reloc, link_info, input_section), - data + *dst_ptr); - (*dst_ptr) += 4; - (*src_ptr) += 4; - break; - - case R_IMM4L: - bfd_put_8 (in_abfd, - ((bfd_get_8 (in_abfd, data + *dst_ptr) & 0xf0) - | (0x0f - & bfd_coff_reloc16_get_value (reloc, link_info, - input_section))), - data + *dst_ptr); - (*dst_ptr) += 1; - (*src_ptr) += 1; - break; - - case R_IMM16: - bfd_put_16 (in_abfd, - bfd_coff_reloc16_get_value (reloc, link_info, input_section), - data + *dst_ptr); - (*dst_ptr) += 2; - (*src_ptr) += 2; - break; - - case R_JR: - { - bfd_vma dst = bfd_coff_reloc16_get_value (reloc, link_info, - input_section); - bfd_vma dot = (link_order->offset - + *dst_ptr - + input_section->output_section->vma); - int gap = dst - dot - 1;/* -1 since were in the odd byte of the - word and the pc's been incremented */ - - if (gap & 1) - abort (); - gap /= 2; - if (gap > 128 || gap < -128) - { - if (! ((*link_info->callbacks->reloc_overflow) - (link_info, bfd_asymbol_name (*reloc->sym_ptr_ptr), - reloc->howto->name, reloc->addend, input_section->owner, - input_section, reloc->address))) - abort (); - } - bfd_put_8 (in_abfd, gap, data + *dst_ptr); - (*dst_ptr)++; - (*src_ptr)++; - break; - } - default: - abort (); - } -} - -#define coff_reloc16_extra_cases extra_case - -#include "coffcode.h" - - -#undef coff_bfd_get_relocated_section_contents -#undef coff_bfd_relax_section -#define coff_bfd_get_relocated_section_contents \ - bfd_coff_reloc16_get_relocated_section_contents -#define coff_bfd_relax_section bfd_coff_reloc16_relax_section - -const bfd_target z8kcoff_vec = -{ - "coff-z8k", /* name */ - bfd_target_coff_flavour, - BFD_ENDIAN_BIG, /* data byte order is big */ - BFD_ENDIAN_BIG, /* header byte order is big */ - - (HAS_RELOC | EXEC_P | /* object flags */ - HAS_LINENO | HAS_DEBUG | - HAS_SYMS | HAS_LOCALS | WP_TEXT), - - (SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD | SEC_RELOC), /* section flags */ - '_', /* leading symbol underscore */ - '/', /* ar_pad_char */ - 15, /* ar_max_namelen */ - bfd_getb64, bfd_getb_signed_64, bfd_putb64, - bfd_getb32, bfd_getb_signed_32, bfd_putb32, - bfd_getb16, bfd_getb_signed_16, bfd_putb16, /* data */ - bfd_getb64, bfd_getb_signed_64, bfd_putb64, - bfd_getb32, bfd_getb_signed_32, bfd_putb32, - bfd_getb16, bfd_getb_signed_16, bfd_putb16, /* hdrs */ - - {_bfd_dummy_target, coff_object_p, /* bfd_check_format */ - bfd_generic_archive_p, _bfd_dummy_target}, - {bfd_false, coff_mkobject, _bfd_generic_mkarchive, /* bfd_set_format */ - bfd_false}, - {bfd_false, coff_write_object_contents, /* bfd_write_contents */ - _bfd_write_archive_contents, bfd_false}, - - BFD_JUMP_TABLE_GENERIC (coff), - BFD_JUMP_TABLE_COPY (coff), - BFD_JUMP_TABLE_CORE (_bfd_nocore), - BFD_JUMP_TABLE_ARCHIVE (_bfd_archive_coff), - BFD_JUMP_TABLE_SYMBOLS (coff), - BFD_JUMP_TABLE_RELOCS (coff), - BFD_JUMP_TABLE_WRITE (coff), - BFD_JUMP_TABLE_LINK (coff), - BFD_JUMP_TABLE_DYNAMIC (_bfd_nodynamic), - - COFF_SWAP_TABLE, -}; diff --git a/contrib/gdb/bfd/coffcode.h b/contrib/gdb/bfd/coffcode.h deleted file mode 100644 index 22babd0d0c7f3..0000000000000 --- a/contrib/gdb/bfd/coffcode.h +++ /dev/null @@ -1,3612 +0,0 @@ -/* Support for the generic parts of most COFF variants, for BFD. - Copyright 1990, 91, 92, 93, 94, 95, 1996 Free Software Foundation, Inc. - Written by Cygnus Support. - -This file is part of BFD, the Binary File Descriptor library. - -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 2 of the License, 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ - -/* -Most of this hacked by Steve Chamberlain, - sac@cygnus.com -*/ -/* - -SECTION - coff backends - - BFD supports a number of different flavours of coff format. - The major differences between formats are the sizes and - alignments of fields in structures on disk, and the occasional - extra field. - - Coff in all its varieties is implemented with a few common - files and a number of implementation specific files. For - example, The 88k bcs coff format is implemented in the file - @file{coff-m88k.c}. This file @code{#include}s - @file{coff/m88k.h} which defines the external structure of the - coff format for the 88k, and @file{coff/internal.h} which - defines the internal structure. @file{coff-m88k.c} also - defines the relocations used by the 88k format - @xref{Relocations}. - - The Intel i960 processor version of coff is implemented in - @file{coff-i960.c}. This file has the same structure as - @file{coff-m88k.c}, except that it includes @file{coff/i960.h} - rather than @file{coff-m88k.h}. - -SUBSECTION - Porting to a new version of coff - - The recommended method is to select from the existing - implementations the version of coff which is most like the one - you want to use. For example, we'll say that i386 coff is - the one you select, and that your coff flavour is called foo. - Copy @file{i386coff.c} to @file{foocoff.c}, copy - @file{../include/coff/i386.h} to @file{../include/coff/foo.h}, - and add the lines to @file{targets.c} and @file{Makefile.in} - so that your new back end is used. Alter the shapes of the - structures in @file{../include/coff/foo.h} so that they match - what you need. You will probably also have to add - @code{#ifdef}s to the code in @file{coff/internal.h} and - @file{coffcode.h} if your version of coff is too wild. - - You can verify that your new BFD backend works quite simply by - building @file{objdump} from the @file{binutils} directory, - and making sure that its version of what's going on and your - host system's idea (assuming it has the pretty standard coff - dump utility, usually called @code{att-dump} or just - @code{dump}) are the same. Then clean up your code, and send - what you've done to Cygnus. Then your stuff will be in the - next release, and you won't have to keep integrating it. - -SUBSECTION - How the coff backend works - -SUBSUBSECTION - File layout - - The Coff backend is split into generic routines that are - applicable to any Coff target and routines that are specific - to a particular target. The target-specific routines are - further split into ones which are basically the same for all - Coff targets except that they use the external symbol format - or use different values for certain constants. - - The generic routines are in @file{coffgen.c}. These routines - work for any Coff target. They use some hooks into the target - specific code; the hooks are in a @code{bfd_coff_backend_data} - structure, one of which exists for each target. - - The essentially similar target-specific routines are in - @file{coffcode.h}. This header file includes executable C code. - The various Coff targets first include the appropriate Coff - header file, make any special defines that are needed, and - then include @file{coffcode.h}. - - Some of the Coff targets then also have additional routines in - the target source file itself. - - For example, @file{coff-i960.c} includes - @file{coff/internal.h} and @file{coff/i960.h}. It then - defines a few constants, such as @code{I960}, and includes - @file{coffcode.h}. Since the i960 has complex relocation - types, @file{coff-i960.c} also includes some code to - manipulate the i960 relocs. This code is not in - @file{coffcode.h} because it would not be used by any other - target. - -SUBSUBSECTION - Bit twiddling - - Each flavour of coff supported in BFD has its own header file - describing the external layout of the structures. There is also - an internal description of the coff layout, in - @file{coff/internal.h}. A major function of the - coff backend is swapping the bytes and twiddling the bits to - translate the external form of the structures into the normal - internal form. This is all performed in the - @code{bfd_swap}_@i{thing}_@i{direction} routines. Some - elements are different sizes between different versions of - coff; it is the duty of the coff version specific include file - to override the definitions of various packing routines in - @file{coffcode.h}. E.g., the size of line number entry in coff is - sometimes 16 bits, and sometimes 32 bits. @code{#define}ing - @code{PUT_LNSZ_LNNO} and @code{GET_LNSZ_LNNO} will select the - correct one. No doubt, some day someone will find a version of - coff which has a varying field size not catered to at the - moment. To port BFD, that person will have to add more @code{#defines}. - Three of the bit twiddling routines are exported to - @code{gdb}; @code{coff_swap_aux_in}, @code{coff_swap_sym_in} - and @code{coff_swap_linno_in}. @code{GDB} reads the symbol - table on its own, but uses BFD to fix things up. More of the - bit twiddlers are exported for @code{gas}; - @code{coff_swap_aux_out}, @code{coff_swap_sym_out}, - @code{coff_swap_lineno_out}, @code{coff_swap_reloc_out}, - @code{coff_swap_filehdr_out}, @code{coff_swap_aouthdr_out}, - @code{coff_swap_scnhdr_out}. @code{Gas} currently keeps track - of all the symbol table and reloc drudgery itself, thereby - saving the internal BFD overhead, but uses BFD to swap things - on the way out, making cross ports much safer. Doing so also - allows BFD (and thus the linker) to use the same header files - as @code{gas}, which makes one avenue to disaster disappear. - -SUBSUBSECTION - Symbol reading - - The simple canonical form for symbols used by BFD is not rich - enough to keep all the information available in a coff symbol - table. The back end gets around this problem by keeping the original - symbol table around, "behind the scenes". - - When a symbol table is requested (through a call to - @code{bfd_canonicalize_symtab}), a request gets through to - @code{coff_get_normalized_symtab}. This reads the symbol table from - the coff file and swaps all the structures inside into the - internal form. It also fixes up all the pointers in the table - (represented in the file by offsets from the first symbol in - the table) into physical pointers to elements in the new - internal table. This involves some work since the meanings of - fields change depending upon context: a field that is a - pointer to another structure in the symbol table at one moment - may be the size in bytes of a structure at the next. Another - pass is made over the table. All symbols which mark file names - (<<C_FILE>> symbols) are modified so that the internal - string points to the value in the auxent (the real filename) - rather than the normal text associated with the symbol - (@code{".file"}). - - At this time the symbol names are moved around. Coff stores - all symbols less than nine characters long physically - within the symbol table; longer strings are kept at the end of - the file in the string table. This pass moves all strings - into memory and replaces them with pointers to the strings. - - - The symbol table is massaged once again, this time to create - the canonical table used by the BFD application. Each symbol - is inspected in turn, and a decision made (using the - @code{sclass} field) about the various flags to set in the - @code{asymbol}. @xref{Symbols}. The generated canonical table - shares strings with the hidden internal symbol table. - - Any linenumbers are read from the coff file too, and attached - to the symbols which own the functions the linenumbers belong to. - -SUBSUBSECTION - Symbol writing - - Writing a symbol to a coff file which didn't come from a coff - file will lose any debugging information. The @code{asymbol} - structure remembers the BFD from which the symbol was taken, and on - output the back end makes sure that the same destination target as - source target is present. - - When the symbols have come from a coff file then all the - debugging information is preserved. - - Symbol tables are provided for writing to the back end in a - vector of pointers to pointers. This allows applications like - the linker to accumulate and output large symbol tables - without having to do too much byte copying. - - This function runs through the provided symbol table and - patches each symbol marked as a file place holder - (@code{C_FILE}) to point to the next file place holder in the - list. It also marks each @code{offset} field in the list with - the offset from the first symbol of the current symbol. - - Another function of this procedure is to turn the canonical - value form of BFD into the form used by coff. Internally, BFD - expects symbol values to be offsets from a section base; so a - symbol physically at 0x120, but in a section starting at - 0x100, would have the value 0x20. Coff expects symbols to - contain their final value, so symbols have their values - changed at this point to reflect their sum with their owning - section. This transformation uses the - <<output_section>> field of the @code{asymbol}'s - @code{asection} @xref{Sections}. - - o <<coff_mangle_symbols>> - - This routine runs though the provided symbol table and uses - the offsets generated by the previous pass and the pointers - generated when the symbol table was read in to create the - structured hierachy required by coff. It changes each pointer - to a symbol into the index into the symbol table of the asymbol. - - o <<coff_write_symbols>> - - This routine runs through the symbol table and patches up the - symbols from their internal form into the coff way, calls the - bit twiddlers, and writes out the table to the file. - -*/ - -/* -INTERNAL_DEFINITION - coff_symbol_type - -DESCRIPTION - The hidden information for an <<asymbol>> is described in a - <<combined_entry_type>>: - -CODE_FRAGMENT -. -.typedef struct coff_ptr_struct -.{ -. -. {* Remembers the offset from the first symbol in the file for -. this symbol. Generated by coff_renumber_symbols. *} -.unsigned int offset; -. -. {* Should the value of this symbol be renumbered. Used for -. XCOFF C_BSTAT symbols. Set by coff_slurp_symbol_table. *} -.unsigned int fix_value : 1; -. -. {* Should the tag field of this symbol be renumbered. -. Created by coff_pointerize_aux. *} -.unsigned int fix_tag : 1; -. -. {* Should the endidx field of this symbol be renumbered. -. Created by coff_pointerize_aux. *} -.unsigned int fix_end : 1; -. -. {* Should the x_csect.x_scnlen field be renumbered. -. Created by coff_pointerize_aux. *} -.unsigned int fix_scnlen : 1; -. -. {* Fix up an XCOFF C_BINCL/C_EINCL symbol. The value is the -. index into the line number entries. Set by -. coff_slurp_symbol_table. *} -.unsigned int fix_line : 1; -. -. {* The container for the symbol structure as read and translated -. from the file. *} -. -.union { -. union internal_auxent auxent; -. struct internal_syment syment; -. } u; -.} combined_entry_type; -. -. -.{* Each canonical asymbol really looks like this: *} -. -.typedef struct coff_symbol_struct -.{ -. {* The actual symbol which the rest of BFD works with *} -.asymbol symbol; -. -. {* A pointer to the hidden information for this symbol *} -.combined_entry_type *native; -. -. {* A pointer to the linenumber information for this symbol *} -.struct lineno_cache_entry *lineno; -. -. {* Have the line numbers been relocated yet ? *} -.boolean done_lineno; -.} coff_symbol_type; - - -*/ - -#ifdef COFF_WITH_PE -#include "peicode.h" -#else -#include "coffswap.h" -#endif - - -/* void warning(); */ - -/* - * Return a word with STYP_* (scnhdr.s_flags) flags set to represent the - * incoming SEC_* flags. The inverse of this function is styp_to_sec_flags(). - * NOTE: If you add to/change this routine, you should mirror the changes - * in styp_to_sec_flags(). - */ -static long -sec_to_styp_flags (sec_name, sec_flags) - CONST char *sec_name; - flagword sec_flags; -{ - long styp_flags = 0; - - if (!strcmp (sec_name, _TEXT)) - { - styp_flags = STYP_TEXT; - } - else if (!strcmp (sec_name, _DATA)) - { - styp_flags = STYP_DATA; - } - else if (!strcmp (sec_name, _BSS)) - { - styp_flags = STYP_BSS; -#ifdef _COMMENT - } - else if (!strcmp (sec_name, _COMMENT)) - { - styp_flags = STYP_INFO; -#endif /* _COMMENT */ -#ifdef _LIB - } - else if (!strcmp (sec_name, _LIB)) - { - styp_flags = STYP_LIB; -#endif /* _LIB */ -#ifdef _LIT - } - else if (!strcmp (sec_name, _LIT)) - { - styp_flags = STYP_LIT; -#endif /* _LIT */ - } - else if (!strcmp (sec_name, ".debug")) - { -#ifdef STYP_DEBUG - styp_flags = STYP_DEBUG; -#else - styp_flags = STYP_INFO; -#endif - } - else if (!strncmp (sec_name, ".stab", 5)) - { - styp_flags = STYP_INFO; - } -#ifdef COFF_WITH_PE - else if (!strcmp (sec_name, ".edata")) - { - styp_flags = STYP_DATA; - } -#endif -#ifdef RS6000COFF_C - else if (!strcmp (sec_name, _PAD)) - { - styp_flags = STYP_PAD; - } - else if (!strcmp (sec_name, _LOADER)) - { - styp_flags = STYP_LOADER; - } -#endif - /* Try and figure out what it should be */ - else if (sec_flags & SEC_CODE) - { - styp_flags = STYP_TEXT; - } - else if (sec_flags & SEC_DATA) - { - styp_flags = STYP_DATA; - } - else if (sec_flags & SEC_READONLY) - { -#ifdef STYP_LIT /* 29k readonly text/data section */ - styp_flags = STYP_LIT; -#else - styp_flags = STYP_TEXT; -#endif /* STYP_LIT */ - } - else if (sec_flags & SEC_LOAD) - { - styp_flags = STYP_TEXT; - } - else if (sec_flags & SEC_ALLOC) - { - styp_flags = STYP_BSS; - } - -#ifdef STYP_NOLOAD - if ((sec_flags & (SEC_NEVER_LOAD | SEC_COFF_SHARED_LIBRARY)) != 0) - styp_flags |= STYP_NOLOAD; -#endif - - return (styp_flags); -} -/* - * Return a word with SEC_* flags set to represent the incoming - * STYP_* flags (from scnhdr.s_flags). The inverse of this - * function is sec_to_styp_flags(). - * NOTE: If you add to/change this routine, you should mirror the changes - * in sec_to_styp_flags(). - */ -static flagword -styp_to_sec_flags (abfd, hdr, name) - bfd *abfd; - PTR hdr; - const char *name; -{ - struct internal_scnhdr *internal_s = (struct internal_scnhdr *) hdr; - long styp_flags = internal_s->s_flags; - flagword sec_flags = 0; - -#ifdef STYP_NOLOAD - if (styp_flags & STYP_NOLOAD) - { - sec_flags |= SEC_NEVER_LOAD; - } -#endif /* STYP_NOLOAD */ - - /* For 386 COFF, at least, an unloadable text or data section is - actually a shared library section. */ - if (styp_flags & STYP_TEXT) - { - if (sec_flags & SEC_NEVER_LOAD) - sec_flags |= SEC_CODE | SEC_COFF_SHARED_LIBRARY; - else - sec_flags |= SEC_CODE | SEC_LOAD | SEC_ALLOC; - } - else if (styp_flags & STYP_DATA) - { - if (sec_flags & SEC_NEVER_LOAD) - sec_flags |= SEC_DATA | SEC_COFF_SHARED_LIBRARY; - else - sec_flags |= SEC_DATA | SEC_LOAD | SEC_ALLOC; - } - else if (styp_flags & STYP_BSS) - { -#ifdef BSS_NOLOAD_IS_SHARED_LIBRARY - if (sec_flags & SEC_NEVER_LOAD) - sec_flags |= SEC_ALLOC | SEC_COFF_SHARED_LIBRARY; - else -#endif - sec_flags |= SEC_ALLOC; - } - else if (styp_flags & STYP_INFO) - { - /* We mark these as SEC_DEBUGGING, but only if COFF_PAGE_SIZE is - defined. coff_compute_section_file_positions uses - COFF_PAGE_SIZE to ensure that the low order bits of the - section VMA and the file offset match. If we don't know - COFF_PAGE_SIZE, we can't ensure the correct correspondence, - and demand page loading of the file will fail. */ -#ifdef COFF_PAGE_SIZE - sec_flags |= SEC_DEBUGGING; -#endif - } - else if (styp_flags & STYP_PAD) - { - sec_flags = 0; - } - else if (strcmp (name, _TEXT) == 0) - { - if (sec_flags & SEC_NEVER_LOAD) - sec_flags |= SEC_CODE | SEC_COFF_SHARED_LIBRARY; - else - sec_flags |= SEC_CODE | SEC_LOAD | SEC_ALLOC; - } - else if (strcmp (name, _DATA) == 0) - { - if (sec_flags & SEC_NEVER_LOAD) - sec_flags |= SEC_DATA | SEC_COFF_SHARED_LIBRARY; - else - sec_flags |= SEC_DATA | SEC_LOAD | SEC_ALLOC; - } - else if (strcmp (name, _BSS) == 0) - { -#ifdef BSS_NOLOAD_IS_SHARED_LIBRARY - if (sec_flags & SEC_NEVER_LOAD) - sec_flags |= SEC_ALLOC | SEC_COFF_SHARED_LIBRARY; - else -#endif - sec_flags |= SEC_ALLOC; - } - else if (strcmp (name, ".debug") == 0 -#ifdef _COMMENT - || strcmp (name, _COMMENT) == 0 -#endif - || strncmp (name, ".stab", 5) == 0) - { -#ifdef COFF_PAGE_SIZE - sec_flags |= SEC_DEBUGGING; -#endif - } -#ifdef _LIB - else if (strcmp (name, _LIB) == 0) - ; -#endif -#ifdef _LIT - else if (strcmp (name, _LIT) == 0) - { - sec_flags = SEC_LOAD | SEC_ALLOC | SEC_READONLY; - } -#endif - else - { - sec_flags |= SEC_ALLOC | SEC_LOAD; - } - -#ifdef STYP_LIT /* A29k readonly text/data section type */ - if ((styp_flags & STYP_LIT) == STYP_LIT) - { - sec_flags = (SEC_LOAD | SEC_ALLOC | SEC_READONLY); - } -#endif /* STYP_LIT */ -#ifdef STYP_OTHER_LOAD /* Other loaded sections */ - if (styp_flags & STYP_OTHER_LOAD) - { - sec_flags = (SEC_LOAD | SEC_ALLOC); - } -#endif /* STYP_SDATA */ - - return (sec_flags); -} - -#define get_index(symbol) ((symbol)->udata.i) - -/* -INTERNAL_DEFINITION - bfd_coff_backend_data - -CODE_FRAGMENT - -Special entry points for gdb to swap in coff symbol table parts: -.typedef struct -.{ -. void (*_bfd_coff_swap_aux_in) PARAMS (( -. bfd *abfd, -. PTR ext, -. int type, -. int class, -. int indaux, -. int numaux, -. PTR in)); -. -. void (*_bfd_coff_swap_sym_in) PARAMS (( -. bfd *abfd , -. PTR ext, -. PTR in)); -. -. void (*_bfd_coff_swap_lineno_in) PARAMS (( -. bfd *abfd, -. PTR ext, -. PTR in)); -. - -Special entry points for gas to swap out coff parts: - -. unsigned int (*_bfd_coff_swap_aux_out) PARAMS (( -. bfd *abfd, -. PTR in, -. int type, -. int class, -. int indaux, -. int numaux, -. PTR ext)); -. -. unsigned int (*_bfd_coff_swap_sym_out) PARAMS (( -. bfd *abfd, -. PTR in, -. PTR ext)); -. -. unsigned int (*_bfd_coff_swap_lineno_out) PARAMS (( -. bfd *abfd, -. PTR in, -. PTR ext)); -. -. unsigned int (*_bfd_coff_swap_reloc_out) PARAMS (( -. bfd *abfd, -. PTR src, -. PTR dst)); -. -. unsigned int (*_bfd_coff_swap_filehdr_out) PARAMS (( -. bfd *abfd, -. PTR in, -. PTR out)); -. -. unsigned int (*_bfd_coff_swap_aouthdr_out) PARAMS (( -. bfd *abfd, -. PTR in, -. PTR out)); -. -. unsigned int (*_bfd_coff_swap_scnhdr_out) PARAMS (( -. bfd *abfd, -. PTR in, -. PTR out)); -. - -Special entry points for generic COFF routines to call target -dependent COFF routines: - -. unsigned int _bfd_filhsz; -. unsigned int _bfd_aoutsz; -. unsigned int _bfd_scnhsz; -. unsigned int _bfd_symesz; -. unsigned int _bfd_auxesz; -. unsigned int _bfd_relsz; -. unsigned int _bfd_linesz; -. boolean _bfd_coff_long_filenames; -. void (*_bfd_coff_swap_filehdr_in) PARAMS (( -. bfd *abfd, -. PTR ext, -. PTR in)); -. void (*_bfd_coff_swap_aouthdr_in) PARAMS (( -. bfd *abfd, -. PTR ext, -. PTR in)); -. void (*_bfd_coff_swap_scnhdr_in) PARAMS (( -. bfd *abfd, -. PTR ext, -. PTR in)); -. void (*_bfd_coff_swap_reloc_in) PARAMS (( -. bfd *abfd, -. PTR ext, -. PTR in)); -. boolean (*_bfd_coff_bad_format_hook) PARAMS (( -. bfd *abfd, -. PTR internal_filehdr)); -. boolean (*_bfd_coff_set_arch_mach_hook) PARAMS (( -. bfd *abfd, -. PTR internal_filehdr)); -. PTR (*_bfd_coff_mkobject_hook) PARAMS (( -. bfd *abfd, -. PTR internal_filehdr, -. PTR internal_aouthdr)); -. flagword (*_bfd_styp_to_sec_flags_hook) PARAMS (( -. bfd *abfd, -. PTR internal_scnhdr, -. const char *name)); -. void (*_bfd_set_alignment_hook) PARAMS (( -. bfd *abfd, -. asection *sec, -. PTR internal_scnhdr)); -. boolean (*_bfd_coff_slurp_symbol_table) PARAMS (( -. bfd *abfd)); -. boolean (*_bfd_coff_symname_in_debug) PARAMS (( -. bfd *abfd, -. struct internal_syment *sym)); -. boolean (*_bfd_coff_pointerize_aux_hook) PARAMS (( -. bfd *abfd, -. combined_entry_type *table_base, -. combined_entry_type *symbol, -. unsigned int indaux, -. combined_entry_type *aux)); -. boolean (*_bfd_coff_print_aux) PARAMS (( -. bfd *abfd, -. FILE *file, -. combined_entry_type *table_base, -. combined_entry_type *symbol, -. combined_entry_type *aux, -. unsigned int indaux)); -. void (*_bfd_coff_reloc16_extra_cases) PARAMS (( -. bfd *abfd, -. struct bfd_link_info *link_info, -. struct bfd_link_order *link_order, -. arelent *reloc, -. bfd_byte *data, -. unsigned int *src_ptr, -. unsigned int *dst_ptr)); -. int (*_bfd_coff_reloc16_estimate) PARAMS (( -. bfd *abfd, -. asection *input_section, -. arelent *r, -. unsigned int shrink, -. struct bfd_link_info *link_info)); -. boolean (*_bfd_coff_sym_is_global) PARAMS (( -. bfd *abfd, -. struct internal_syment *)); -. void (*_bfd_coff_compute_section_file_positions) PARAMS (( -. bfd *abfd)); -. boolean (*_bfd_coff_start_final_link) PARAMS (( -. bfd *output_bfd, -. struct bfd_link_info *info)); -. boolean (*_bfd_coff_relocate_section) PARAMS (( -. bfd *output_bfd, -. struct bfd_link_info *info, -. bfd *input_bfd, -. asection *input_section, -. bfd_byte *contents, -. struct internal_reloc *relocs, -. struct internal_syment *syms, -. asection **sections)); -. reloc_howto_type *(*_bfd_coff_rtype_to_howto) PARAMS (( -. bfd *abfd, -. asection *sec, -. struct internal_reloc *rel, -. struct coff_link_hash_entry *h, -. struct internal_syment *sym, -. bfd_vma *addendp)); -. boolean (*_bfd_coff_adjust_symndx) PARAMS (( -. bfd *obfd, -. struct bfd_link_info *info, -. bfd *ibfd, -. asection *sec, -. struct internal_reloc *reloc, -. boolean *adjustedp)); -. boolean (*_bfd_coff_link_add_one_symbol) PARAMS (( -. struct bfd_link_info *info, -. bfd *abfd, -. const char *name, -. flagword flags, -. asection *section, -. bfd_vma value, -. const char *string, -. boolean copy, -. boolean collect, -. struct bfd_link_hash_entry **hashp)); -. -.} bfd_coff_backend_data; -. -.#define coff_backend_info(abfd) ((bfd_coff_backend_data *) (abfd)->xvec->backend_data) -. -.#define bfd_coff_swap_aux_in(a,e,t,c,ind,num,i) \ -. ((coff_backend_info (a)->_bfd_coff_swap_aux_in) (a,e,t,c,ind,num,i)) -. -.#define bfd_coff_swap_sym_in(a,e,i) \ -. ((coff_backend_info (a)->_bfd_coff_swap_sym_in) (a,e,i)) -. -.#define bfd_coff_swap_lineno_in(a,e,i) \ -. ((coff_backend_info ( a)->_bfd_coff_swap_lineno_in) (a,e,i)) -. -.#define bfd_coff_swap_reloc_out(abfd, i, o) \ -. ((coff_backend_info (abfd)->_bfd_coff_swap_reloc_out) (abfd, i, o)) -. -.#define bfd_coff_swap_lineno_out(abfd, i, o) \ -. ((coff_backend_info (abfd)->_bfd_coff_swap_lineno_out) (abfd, i, o)) -. -.#define bfd_coff_swap_aux_out(a,i,t,c,ind,num,o) \ -. ((coff_backend_info (a)->_bfd_coff_swap_aux_out) (a,i,t,c,ind,num,o)) -. -.#define bfd_coff_swap_sym_out(abfd, i,o) \ -. ((coff_backend_info (abfd)->_bfd_coff_swap_sym_out) (abfd, i, o)) -. -.#define bfd_coff_swap_scnhdr_out(abfd, i,o) \ -. ((coff_backend_info (abfd)->_bfd_coff_swap_scnhdr_out) (abfd, i, o)) -. -.#define bfd_coff_swap_filehdr_out(abfd, i,o) \ -. ((coff_backend_info (abfd)->_bfd_coff_swap_filehdr_out) (abfd, i, o)) -. -.#define bfd_coff_swap_aouthdr_out(abfd, i,o) \ -. ((coff_backend_info (abfd)->_bfd_coff_swap_aouthdr_out) (abfd, i, o)) -. -.#define bfd_coff_filhsz(abfd) (coff_backend_info (abfd)->_bfd_filhsz) -.#define bfd_coff_aoutsz(abfd) (coff_backend_info (abfd)->_bfd_aoutsz) -.#define bfd_coff_scnhsz(abfd) (coff_backend_info (abfd)->_bfd_scnhsz) -.#define bfd_coff_symesz(abfd) (coff_backend_info (abfd)->_bfd_symesz) -.#define bfd_coff_auxesz(abfd) (coff_backend_info (abfd)->_bfd_auxesz) -.#define bfd_coff_relsz(abfd) (coff_backend_info (abfd)->_bfd_relsz) -.#define bfd_coff_linesz(abfd) (coff_backend_info (abfd)->_bfd_linesz) -.#define bfd_coff_long_filenames(abfd) (coff_backend_info (abfd)->_bfd_coff_long_filenames) -.#define bfd_coff_swap_filehdr_in(abfd, i,o) \ -. ((coff_backend_info (abfd)->_bfd_coff_swap_filehdr_in) (abfd, i, o)) -. -.#define bfd_coff_swap_aouthdr_in(abfd, i,o) \ -. ((coff_backend_info (abfd)->_bfd_coff_swap_aouthdr_in) (abfd, i, o)) -. -.#define bfd_coff_swap_scnhdr_in(abfd, i,o) \ -. ((coff_backend_info (abfd)->_bfd_coff_swap_scnhdr_in) (abfd, i, o)) -. -.#define bfd_coff_swap_reloc_in(abfd, i, o) \ -. ((coff_backend_info (abfd)->_bfd_coff_swap_reloc_in) (abfd, i, o)) -. -.#define bfd_coff_bad_format_hook(abfd, filehdr) \ -. ((coff_backend_info (abfd)->_bfd_coff_bad_format_hook) (abfd, filehdr)) -. -.#define bfd_coff_set_arch_mach_hook(abfd, filehdr)\ -. ((coff_backend_info (abfd)->_bfd_coff_set_arch_mach_hook) (abfd, filehdr)) -.#define bfd_coff_mkobject_hook(abfd, filehdr, aouthdr)\ -. ((coff_backend_info (abfd)->_bfd_coff_mkobject_hook) (abfd, filehdr, aouthdr)) -. -.#define bfd_coff_styp_to_sec_flags_hook(abfd, scnhdr, name)\ -. ((coff_backend_info (abfd)->_bfd_styp_to_sec_flags_hook) (abfd, scnhdr, name)) -. -.#define bfd_coff_set_alignment_hook(abfd, sec, scnhdr)\ -. ((coff_backend_info (abfd)->_bfd_set_alignment_hook) (abfd, sec, scnhdr)) -. -.#define bfd_coff_slurp_symbol_table(abfd)\ -. ((coff_backend_info (abfd)->_bfd_coff_slurp_symbol_table) (abfd)) -. -.#define bfd_coff_symname_in_debug(abfd, sym)\ -. ((coff_backend_info (abfd)->_bfd_coff_symname_in_debug) (abfd, sym)) -. -.#define bfd_coff_print_aux(abfd, file, base, symbol, aux, indaux)\ -. ((coff_backend_info (abfd)->_bfd_coff_print_aux)\ -. (abfd, file, base, symbol, aux, indaux)) -. -.#define bfd_coff_reloc16_extra_cases(abfd, link_info, link_order, reloc, data, src_ptr, dst_ptr)\ -. ((coff_backend_info (abfd)->_bfd_coff_reloc16_extra_cases)\ -. (abfd, link_info, link_order, reloc, data, src_ptr, dst_ptr)) -. -.#define bfd_coff_reloc16_estimate(abfd, section, reloc, shrink, link_info)\ -. ((coff_backend_info (abfd)->_bfd_coff_reloc16_estimate)\ -. (abfd, section, reloc, shrink, link_info)) -. -.#define bfd_coff_sym_is_global(abfd, sym)\ -. ((coff_backend_info (abfd)->_bfd_coff_sym_is_global)\ -. (abfd, sym)) -. -.#define bfd_coff_compute_section_file_positions(abfd)\ -. ((coff_backend_info (abfd)->_bfd_coff_compute_section_file_positions)\ -. (abfd)) -. -.#define bfd_coff_start_final_link(obfd, info)\ -. ((coff_backend_info (obfd)->_bfd_coff_start_final_link)\ -. (obfd, info)) -.#define bfd_coff_relocate_section(obfd,info,ibfd,o,con,rel,isyms,secs)\ -. ((coff_backend_info (ibfd)->_bfd_coff_relocate_section)\ -. (obfd, info, ibfd, o, con, rel, isyms, secs)) -.#define bfd_coff_rtype_to_howto(abfd, sec, rel, h, sym, addendp)\ -. ((coff_backend_info (abfd)->_bfd_coff_rtype_to_howto)\ -. (abfd, sec, rel, h, sym, addendp)) -.#define bfd_coff_adjust_symndx(obfd, info, ibfd, sec, rel, adjustedp)\ -. ((coff_backend_info (abfd)->_bfd_coff_adjust_symndx)\ -. (obfd, info, ibfd, sec, rel, adjustedp)) -.#define bfd_coff_link_add_one_symbol(info,abfd,name,flags,section,value,string,cp,coll,hashp)\ -. ((coff_backend_info (abfd)->_bfd_coff_link_add_one_symbol)\ -. (info, abfd, name, flags, section, value, string, cp, coll, hashp)) -. -*/ - -/* See whether the magic number matches. */ - -static boolean -coff_bad_format_hook (abfd, filehdr) - bfd * abfd; - PTR filehdr; -{ - struct internal_filehdr *internal_f = (struct internal_filehdr *) filehdr; - - if (BADMAG (*internal_f)) - return false; - - /* if the optional header is NULL or not the correct size then - quit; the only difference I can see between m88k dgux headers (MC88DMAGIC) - and Intel 960 readwrite headers (I960WRMAGIC) is that the - optional header is of a different size. - - But the mips keeps extra stuff in it's opthdr, so dont check - when doing that - */ - -#if defined(M88) || defined(I960) - if (internal_f->f_opthdr != 0 && AOUTSZ != internal_f->f_opthdr) - return false; -#endif - - return true; -} - -/* - initialize a section structure with information peculiar to this - particular implementation of coff -*/ - -static boolean -coff_new_section_hook (abfd, section) - bfd * abfd; - asection * section; -{ - section->alignment_power = COFF_DEFAULT_SECTION_ALIGNMENT_POWER; - -#ifdef RS6000COFF_C - if (xcoff_data (abfd)->text_align_power != 0 - && strcmp (bfd_get_section_name (abfd, section), ".text") == 0) - section->alignment_power = xcoff_data (abfd)->text_align_power; - if (xcoff_data (abfd)->data_align_power != 0 - && strcmp (bfd_get_section_name (abfd, section), ".data") == 0) - section->alignment_power = xcoff_data (abfd)->data_align_power; -#endif - - /* Allocate aux records for section symbols, to store size and - related info. - - @@ Shouldn't use constant multiplier here! */ - coffsymbol (section->symbol)->native = - (combined_entry_type *) bfd_zalloc (abfd, - sizeof (combined_entry_type) * 10); - - /* The .stab section must be aligned to 2**2 at most, because - otherwise there may be gaps in the section which gdb will not - know how to interpret. Examining the section name is a hack, but - that is also how gdb locates the section. - We need to handle the .ctors and .dtors sections similarly, to - avoid introducing null words in the tables. */ - if (COFF_DEFAULT_SECTION_ALIGNMENT_POWER > 2 - && (strncmp (section->name, ".stab", 5) == 0 - || strcmp (section->name, ".ctors") == 0 - || strcmp (section->name, ".dtors") == 0)) - section->alignment_power = 2; - - /* Similarly, the .stabstr section must be aligned to 2**0 at most. */ - if (COFF_DEFAULT_SECTION_ALIGNMENT_POWER > 0 - && strncmp (section->name, ".stabstr", 8) == 0) - section->alignment_power = 0; - - return true; -} - -#ifdef I960 - -/* Set the alignment of a BFD section. */ - -static void -coff_set_alignment_hook (abfd, section, scnhdr) - bfd * abfd; - asection * section; - PTR scnhdr; -{ - struct internal_scnhdr *hdr = (struct internal_scnhdr *) scnhdr; - unsigned int i; - - for (i = 0; i < 32; i++) - if ((1 << i) >= hdr->s_align) - break; - section->alignment_power = i; -} - -#else /* ! I960 */ -#ifdef COFF_WITH_PE - -/* a couple of macros to help setting the alignment power field */ -#define ALIGN_SET(field,x,y) \ - if (((field) & IMAGE_SCN_ALIGN_64BYTES) == x )\ - {\ - section->alignment_power = y;\ - } - -#define ELIFALIGN_SET(field,x,y) \ - else if (( (field) & IMAGE_SCN_ALIGN_64BYTES) == x ) \ - {\ - section->alignment_power = y;\ - } - -static void -coff_set_alignment_hook (abfd, section, scnhdr) - bfd * abfd; - asection * section; - PTR scnhdr; -{ - struct internal_scnhdr *hdr = (struct internal_scnhdr *) scnhdr; - - ALIGN_SET (hdr->s_flags, IMAGE_SCN_ALIGN_64BYTES, 6) - ELIFALIGN_SET (hdr->s_flags, IMAGE_SCN_ALIGN_32BYTES, 5) - ELIFALIGN_SET (hdr->s_flags, IMAGE_SCN_ALIGN_16BYTES, 4) - ELIFALIGN_SET (hdr->s_flags, IMAGE_SCN_ALIGN_8BYTES, 3) - ELIFALIGN_SET (hdr->s_flags, IMAGE_SCN_ALIGN_4BYTES, 2) - ELIFALIGN_SET (hdr->s_flags, IMAGE_SCN_ALIGN_2BYTES, 1) - ELIFALIGN_SET (hdr->s_flags, IMAGE_SCN_ALIGN_1BYTES, 0) - -#ifdef POWERPC_LE_PE - if (strcmp (section->name, ".idata$2") == 0) - { - section->alignment_power = 0; - } - else if (strcmp (section->name, ".idata$3") == 0) - { - section->alignment_power = 0; - } - else if (strcmp (section->name, ".idata$4") == 0) - { - section->alignment_power = 2; - } - else if (strcmp (section->name, ".idata$5") == 0) - { - section->alignment_power = 2; - } - else if (strcmp (section->name, ".idata$6") == 0) - { - section->alignment_power = 1; - } - else if (strcmp (section->name, ".reloc") == 0) - { - section->alignment_power = 1; - } - else if (strncmp (section->name, ".stab", 5) == 0) - { - section->alignment_power = 2; - } -#endif -} -#undef ALIGN_SET -#undef ELIFALIGN_SET - -#else /* ! COFF_WITH_PE */ -#ifdef RS6000COFF_C - -/* We grossly abuse this function to handle XCOFF overflow headers. - When we see one, we correct the reloc and line number counts in the - real header, and remove the section we just created. */ - -static void -coff_set_alignment_hook (abfd, section, scnhdr) - bfd *abfd; - asection *section; - PTR scnhdr; -{ - struct internal_scnhdr *hdr = (struct internal_scnhdr *) scnhdr; - asection *real_sec; - asection **ps; - - if ((hdr->s_flags & STYP_OVRFLO) == 0) - return; - - real_sec = coff_section_from_bfd_index (abfd, hdr->s_nreloc); - if (real_sec == NULL) - return; - - real_sec->reloc_count = hdr->s_paddr; - real_sec->lineno_count = hdr->s_vaddr; - - for (ps = &abfd->sections; *ps != NULL; ps = &(*ps)->next) - { - if (*ps == section) - { - *ps = (*ps)->next; - --abfd->section_count; - break; - } - } -} - -#else /* ! RS6000COFF_C */ - -#define coff_set_alignment_hook \ - ((void (*) PARAMS ((bfd *, asection *, PTR))) bfd_void) - -#endif /* ! RS6000COFF_C */ -#endif /* ! COFF_WITH_PE */ -#endif /* ! I960 */ - -#ifndef coff_mkobject -static boolean -coff_mkobject (abfd) - bfd * abfd; -{ - coff_data_type *coff; - - abfd->tdata.coff_obj_data = (struct coff_tdata *) bfd_zalloc (abfd, sizeof (coff_data_type)); - if (abfd->tdata.coff_obj_data == 0) - return false; - coff = coff_data (abfd); - coff->symbols = (coff_symbol_type *) NULL; - coff->conversion_table = (unsigned int *) NULL; - coff->raw_syments = (struct coff_ptr_struct *) NULL; - coff->relocbase = 0; - coff->local_toc_sym_map = 0; - -/* make_abs_section(abfd);*/ - - return true; -} -#endif - -/* Create the COFF backend specific information. */ -#ifndef coff_mkobject_hook -static PTR -coff_mkobject_hook (abfd, filehdr, aouthdr) - bfd * abfd; - PTR filehdr; - PTR aouthdr; -{ - struct internal_filehdr *internal_f = (struct internal_filehdr *) filehdr; - coff_data_type *coff; - - if (coff_mkobject (abfd) == false) - return NULL; - - coff = coff_data (abfd); - - coff->sym_filepos = internal_f->f_symptr; - - /* These members communicate important constants about the symbol - table to GDB's symbol-reading code. These `constants' - unfortunately vary among coff implementations... */ - coff->local_n_btmask = N_BTMASK; - coff->local_n_btshft = N_BTSHFT; - coff->local_n_tmask = N_TMASK; - coff->local_n_tshift = N_TSHIFT; - coff->local_symesz = SYMESZ; - coff->local_auxesz = AUXESZ; - coff->local_linesz = LINESZ; - - obj_raw_syment_count (abfd) = - obj_conv_table_size (abfd) = - internal_f->f_nsyms; - -#ifdef RS6000COFF_C - if ((internal_f->f_flags & F_SHROBJ) != 0) - abfd->flags |= DYNAMIC; - if (aouthdr != NULL && internal_f->f_opthdr >= AOUTSZ) - { - struct internal_aouthdr *internal_a = - (struct internal_aouthdr *) aouthdr; - struct xcoff_tdata *xcoff; - - xcoff = xcoff_data (abfd); - xcoff->full_aouthdr = true; - xcoff->toc = internal_a->o_toc; - xcoff->sntoc = internal_a->o_sntoc; - xcoff->snentry = internal_a->o_snentry; - xcoff->text_align_power = internal_a->o_algntext; - xcoff->data_align_power = internal_a->o_algndata; - xcoff->modtype = internal_a->o_modtype; - xcoff->cputype = internal_a->o_cputype; - xcoff->maxdata = internal_a->o_maxdata; - xcoff->maxstack = internal_a->o_maxstack; - } -#endif - - return (PTR) coff; -} -#endif - -/* Determine the machine architecture and type. FIXME: This is target - dependent because the magic numbers are defined in the target - dependent header files. But there is no particular need for this. - If the magic numbers were moved to a separate file, this function - would be target independent and would also be much more successful - at linking together COFF files for different architectures. */ - -static boolean -coff_set_arch_mach_hook (abfd, filehdr) - bfd *abfd; - PTR filehdr; -{ - long machine; - enum bfd_architecture arch; - struct internal_filehdr *internal_f = (struct internal_filehdr *) filehdr; - - machine = 0; - switch (internal_f->f_magic) - { -#ifdef PPCMAGIC - case PPCMAGIC: - arch = bfd_arch_powerpc; - machine = 0; /* what does this mean? (krk) */ - break; -#endif -#ifdef I386MAGIC - case I386MAGIC: - case I386PTXMAGIC: - case I386AIXMAGIC: /* Danbury PS/2 AIX C Compiler */ - case LYNXCOFFMAGIC: /* shadows the m68k Lynx number below, sigh */ - arch = bfd_arch_i386; - machine = 0; - break; -#endif -#ifdef A29K_MAGIC_BIG - case A29K_MAGIC_BIG: - case A29K_MAGIC_LITTLE: - arch = bfd_arch_a29k; - machine = 0; - break; -#endif -#ifdef ARMMAGIC - case ARMMAGIC: - arch = bfd_arch_arm; - machine =0; - break; -#endif -#ifdef MC68MAGIC - case MC68MAGIC: - case M68MAGIC: -#ifdef MC68KBCSMAGIC - case MC68KBCSMAGIC: -#endif -#ifdef APOLLOM68KMAGIC - case APOLLOM68KMAGIC: -#endif -#ifdef LYNXCOFFMAGIC - case LYNXCOFFMAGIC: -#endif - arch = bfd_arch_m68k; - machine = 68020; - break; -#endif -#ifdef MC88MAGIC - case MC88MAGIC: - case MC88DMAGIC: - case MC88OMAGIC: - arch = bfd_arch_m88k; - machine = 88100; - break; -#endif -#ifdef Z8KMAGIC - case Z8KMAGIC: - arch = bfd_arch_z8k; - switch (internal_f->f_flags & F_MACHMASK) - { - case F_Z8001: - machine = bfd_mach_z8001; - break; - case F_Z8002: - machine = bfd_mach_z8002; - break; - default: - return false; - } - break; -#endif -#ifdef I860 - case I860MAGIC: - arch = bfd_arch_i860; - break; -#endif -#ifdef I960 -#ifdef I960ROMAGIC - case I960ROMAGIC: - case I960RWMAGIC: - arch = bfd_arch_i960; - switch (F_I960TYPE & internal_f->f_flags) - { - default: - case F_I960CORE: - machine = bfd_mach_i960_core; - break; - case F_I960KB: - machine = bfd_mach_i960_kb_sb; - break; - case F_I960MC: - machine = bfd_mach_i960_mc; - break; - case F_I960XA: - machine = bfd_mach_i960_xa; - break; - case F_I960CA: - machine = bfd_mach_i960_ca; - break; - case F_I960KA: - machine = bfd_mach_i960_ka_sa; - break; - case F_I960JX: - machine = bfd_mach_i960_jx; - break; - case F_I960HX: - machine = bfd_mach_i960_hx; - break; - } - break; -#endif -#endif - -#ifdef RS6000COFF_C - case U802ROMAGIC: - case U802WRMAGIC: - case U802TOCMAGIC: - { - int cputype; - - if (xcoff_data (abfd)->cputype != -1) - cputype = xcoff_data (abfd)->cputype & 0xff; - else - { - /* We did not get a value from the a.out header. If the - file has not been stripped, we may be able to get the - architecture information from the first symbol, if it - is a .file symbol. */ - if (obj_raw_syment_count (abfd) == 0) - cputype = 0; - else - { - bfd_byte buf[SYMESZ]; - struct internal_syment sym; - - if (bfd_seek (abfd, obj_sym_filepos (abfd), SEEK_SET) != 0 - || bfd_read (buf, 1, SYMESZ, abfd) != SYMESZ) - return false; - coff_swap_sym_in (abfd, (PTR) buf, (PTR) &sym); - if (sym.n_sclass == C_FILE) - cputype = sym.n_type & 0xff; - else - cputype = 0; - } - } - - /* FIXME: We don't handle all cases here. */ - switch (cputype) - { - default: - case 0: -#ifdef POWERMAC - /* PowerPC Macs use the same magic numbers as RS/6000 - (because that's how they were bootstrapped originally), - but they are always PowerPC architecture. */ - arch = bfd_arch_powerpc; - machine = 0; -#else - arch = bfd_arch_rs6000; - machine = 6000; -#endif /* POWERMAC */ - break; - - case 1: - arch = bfd_arch_powerpc; - machine = 601; - break; - case 2: /* 64 bit PowerPC */ - arch = bfd_arch_powerpc; - machine = 620; - break; - case 3: - arch = bfd_arch_powerpc; - machine = 0; - break; - case 4: - arch = bfd_arch_rs6000; - machine = 6000; - break; - } - } - break; -#endif - -#ifdef WE32KMAGIC - case WE32KMAGIC: - arch = bfd_arch_we32k; - machine = 0; - break; -#endif - -#ifdef H8300MAGIC - case H8300MAGIC: - arch = bfd_arch_h8300; - machine = bfd_mach_h8300; - /* !! FIXME this probably isn't the right place for this */ - abfd->flags |= BFD_IS_RELAXABLE; - break; -#endif - -#ifdef H8300HMAGIC - case H8300HMAGIC: - arch = bfd_arch_h8300; - machine = bfd_mach_h8300h; - /* !! FIXME this probably isn't the right place for this */ - abfd->flags |= BFD_IS_RELAXABLE; - break; -#endif - -#ifdef SH_ARCH_MAGIC_BIG - case SH_ARCH_MAGIC_BIG: - case SH_ARCH_MAGIC_LITTLE: - arch = bfd_arch_sh; - machine = 0; - break; -#endif - -#ifdef H8500MAGIC - case H8500MAGIC: - arch = bfd_arch_h8500; - machine = 0; - break; -#endif - -#ifdef SPARCMAGIC - case SPARCMAGIC: -#ifdef LYNXCOFFMAGIC - case LYNXCOFFMAGIC: -#endif - arch = bfd_arch_sparc; - machine = 0; - break; -#endif - - default: /* Unreadable input file type */ - arch = bfd_arch_obscure; - break; - } - - bfd_default_set_arch_mach (abfd, arch, machine); - return true; -} - -#ifdef SYMNAME_IN_DEBUG - -static boolean -symname_in_debug_hook (abfd, sym) - bfd * abfd; - struct internal_syment *sym; -{ - return SYMNAME_IN_DEBUG (sym) ? true : false; -} - -#else - -#define symname_in_debug_hook \ - (boolean (*) PARAMS ((bfd *, struct internal_syment *))) bfd_false - -#endif - -#ifdef RS6000COFF_C - -/* Handle the csect auxent of a C_EXT or C_HIDEXT symbol. */ - -static boolean coff_pointerize_aux_hook - PARAMS ((bfd *, combined_entry_type *, combined_entry_type *, - unsigned int, combined_entry_type *)); - -/*ARGSUSED*/ -static boolean -coff_pointerize_aux_hook (abfd, table_base, symbol, indaux, aux) - bfd *abfd; - combined_entry_type *table_base; - combined_entry_type *symbol; - unsigned int indaux; - combined_entry_type *aux; -{ - int class = symbol->u.syment.n_sclass; - - if ((class == C_EXT || class == C_HIDEXT) - && indaux + 1 == symbol->u.syment.n_numaux) - { - if (SMTYP_SMTYP (aux->u.auxent.x_csect.x_smtyp) == XTY_LD) - { - aux->u.auxent.x_csect.x_scnlen.p = - table_base + aux->u.auxent.x_csect.x_scnlen.l; - aux->fix_scnlen = 1; - } - - /* Return true to indicate that the caller should not do any - further work on this auxent. */ - return true; - } - - /* Return false to indicate that this auxent should be handled by - the caller. */ - return false; -} - -#else -#ifdef I960 - -/* We don't want to pointerize bal entries. */ - -static boolean coff_pointerize_aux_hook - PARAMS ((bfd *, combined_entry_type *, combined_entry_type *, - unsigned int, combined_entry_type *)); - -/*ARGSUSED*/ -static boolean -coff_pointerize_aux_hook (abfd, table_base, symbol, indaux, aux) - bfd *abfd; - combined_entry_type *table_base; - combined_entry_type *symbol; - unsigned int indaux; - combined_entry_type *aux; -{ - /* Return true if we don't want to pointerize this aux entry, which - is the case for the lastfirst aux entry for a C_LEAFPROC symbol. */ - return (indaux == 1 - && (symbol->u.syment.n_sclass == C_LEAFPROC - || symbol->u.syment.n_sclass == C_LEAFSTAT - || symbol->u.syment.n_sclass == C_LEAFEXT)); -} - -#else /* ! I960 */ - -#define coff_pointerize_aux_hook 0 - -#endif /* ! I960 */ -#endif /* ! RS6000COFF_C */ - -/* Print an aux entry. This returns true if it has printed it. */ - -static boolean coff_print_aux - PARAMS ((bfd *, FILE *, combined_entry_type *, combined_entry_type *, - combined_entry_type *, unsigned int)); - -static boolean -coff_print_aux (abfd, file, table_base, symbol, aux, indaux) - bfd *abfd; - FILE *file; - combined_entry_type *table_base; - combined_entry_type *symbol; - combined_entry_type *aux; - unsigned int indaux; -{ -#ifdef RS6000COFF_C - if ((symbol->u.syment.n_sclass == C_EXT - || symbol->u.syment.n_sclass == C_HIDEXT) - && indaux + 1 == symbol->u.syment.n_numaux) - { - /* This is a csect entry. */ - fprintf (file, "AUX "); - if (SMTYP_SMTYP (aux->u.auxent.x_csect.x_smtyp) != XTY_LD) - { - BFD_ASSERT (! aux->fix_scnlen); - fprintf (file, "val %5ld", aux->u.auxent.x_csect.x_scnlen.l); - } - else - { - fprintf (file, "indx "); - if (! aux->fix_scnlen) - fprintf (file, "%4ld", aux->u.auxent.x_csect.x_scnlen.l); - else - fprintf (file, "%4ld", - (long) (aux->u.auxent.x_csect.x_scnlen.p - table_base)); - } - fprintf (file, - " prmhsh %ld snhsh %u typ %d algn %d clss %u stb %ld snstb %u", - aux->u.auxent.x_csect.x_parmhash, - (unsigned int) aux->u.auxent.x_csect.x_snhash, - SMTYP_SMTYP (aux->u.auxent.x_csect.x_smtyp), - SMTYP_ALIGN (aux->u.auxent.x_csect.x_smtyp), - (unsigned int) aux->u.auxent.x_csect.x_smclas, - aux->u.auxent.x_csect.x_stab, - (unsigned int) aux->u.auxent.x_csect.x_snstab); - return true; - } -#endif - - /* Return false to indicate that no special action was taken. */ - return false; -} - -/* -SUBSUBSECTION - Writing relocations - - To write relocations, the back end steps though the - canonical relocation table and create an - @code{internal_reloc}. The symbol index to use is removed from - the @code{offset} field in the symbol table supplied. The - address comes directly from the sum of the section base - address and the relocation offset; the type is dug directly - from the howto field. Then the @code{internal_reloc} is - swapped into the shape of an @code{external_reloc} and written - out to disk. - -*/ - -#ifdef TARG_AUX - -static int compare_arelent_ptr PARAMS ((const PTR, const PTR)); - -/* AUX's ld wants relocations to be sorted */ -static int -compare_arelent_ptr (x, y) - const PTR x; - const PTR y; -{ - const arelent **a = (const arelent **) x; - const arelent **b = (const arelent **) y; - bfd_size_type aadr = (*a)->address; - bfd_size_type badr = (*b)->address; - - return (aadr < badr ? -1 : badr < aadr ? 1 : 0); -} - -#endif /* TARG_AUX */ - -static boolean -coff_write_relocs (abfd, first_undef) - bfd * abfd; - int first_undef; -{ - asection *s; - - for (s = abfd->sections; s != (asection *) NULL; s = s->next) - { - unsigned int i; - struct external_reloc dst; - arelent **p; - -#ifndef TARG_AUX - p = s->orelocation; -#else - /* sort relocations before we write them out */ - p = (arelent **) bfd_malloc (s->reloc_count * sizeof (arelent *)); - if (p == NULL && s->reloc_count > 0) - return false; - memcpy (p, s->orelocation, s->reloc_count * sizeof (arelent *)); - qsort (p, s->reloc_count, sizeof (arelent *), compare_arelent_ptr); -#endif - - if (bfd_seek (abfd, s->rel_filepos, SEEK_SET) != 0) - return false; - for (i = 0; i < s->reloc_count; i++) - { - struct internal_reloc n; - arelent *q = p[i]; - memset ((PTR) & n, 0, sizeof (n)); - - /* Now we've renumbered the symbols we know where the - undefined symbols live in the table. Check the reloc - entries for symbols who's output bfd isn't the right one. - This is because the symbol was undefined (which means - that all the pointers are never made to point to the same - place). This is a bad thing,'cause the symbols attached - to the output bfd are indexed, so that the relocation - entries know which symbol index they point to. So we - have to look up the output symbol here. */ - - if (q->sym_ptr_ptr[0]->the_bfd != abfd) - { - int i; - const char *sname = q->sym_ptr_ptr[0]->name; - asymbol **outsyms = abfd->outsymbols; - for (i = first_undef; outsyms[i]; i++) - { - const char *intable = outsyms[i]->name; - if (strcmp (intable, sname) == 0) { - /* got a hit, so repoint the reloc */ - q->sym_ptr_ptr = outsyms + i; - break; - } - } - } - - n.r_vaddr = q->address + s->vma; - -#ifdef R_IHCONST - /* The 29k const/consth reloc pair is a real kludge. The consth - part doesn't have a symbol; it has an offset. So rebuilt - that here. */ - if (q->howto->type == R_IHCONST) - n.r_symndx = q->addend; - else -#endif - if (q->sym_ptr_ptr) - { - if (q->sym_ptr_ptr == bfd_abs_section_ptr->symbol_ptr_ptr) - /* This is a relocation relative to the absolute symbol. */ - n.r_symndx = -1; - else - { - n.r_symndx = get_index ((*(q->sym_ptr_ptr))); - /* Take notice if the symbol reloc points to a symbol - we don't have in our symbol table. What should we - do for this?? */ - if (n.r_symndx > obj_conv_table_size (abfd)) - abort (); - } - } - -#ifdef SWAP_OUT_RELOC_OFFSET - n.r_offset = q->addend; -#endif - -#ifdef SELECT_RELOC - /* Work out reloc type from what is required */ - SELECT_RELOC (n, q->howto); -#else - n.r_type = q->howto->type; -#endif - coff_swap_reloc_out (abfd, &n, &dst); - if (bfd_write ((PTR) & dst, 1, RELSZ, abfd) != RELSZ) - return false; - } - -#ifdef TARG_AUX - if (p != NULL) - free (p); -#endif - } - - return true; -} - -/* Set flags and magic number of a coff file from architecture and machine - type. Result is true if we can represent the arch&type, false if not. */ - -static boolean -coff_set_flags (abfd, magicp, flagsp) - bfd * abfd; - unsigned *magicp; - unsigned short *flagsp; -{ - switch (bfd_get_arch (abfd)) - { -#ifdef Z8KMAGIC - case bfd_arch_z8k: - *magicp = Z8KMAGIC; - switch (bfd_get_mach (abfd)) - { - case bfd_mach_z8001: - *flagsp = F_Z8001; - break; - case bfd_mach_z8002: - *flagsp = F_Z8002; - break; - default: - return false; - } - return true; -#endif -#ifdef I960ROMAGIC - - case bfd_arch_i960: - - { - unsigned flags; - *magicp = I960ROMAGIC; - /* - ((bfd_get_file_flags(abfd) & WP_TEXT) ? I960ROMAGIC : - I960RWMAGIC); FIXME??? - */ - switch (bfd_get_mach (abfd)) - { - case bfd_mach_i960_core: - flags = F_I960CORE; - break; - case bfd_mach_i960_kb_sb: - flags = F_I960KB; - break; - case bfd_mach_i960_mc: - flags = F_I960MC; - break; - case bfd_mach_i960_xa: - flags = F_I960XA; - break; - case bfd_mach_i960_ca: - flags = F_I960CA; - break; - case bfd_mach_i960_ka_sa: - flags = F_I960KA; - break; - case bfd_mach_i960_jx: - flags = F_I960JX; - break; - case bfd_mach_i960_hx: - flags = F_I960HX; - break; - default: - return false; - } - *flagsp = flags; - return true; - } - break; -#endif -#ifdef ARMMAGIC - case bfd_arch_arm: - *magicp = ARMMAGIC; - return true; -#endif -#ifdef PPCMAGIC - case bfd_arch_powerpc: - *magicp = PPCMAGIC; - return true; - break; -#endif -#ifdef I386MAGIC - case bfd_arch_i386: - *magicp = I386MAGIC; -#ifdef LYNXOS - /* Just overwrite the usual value if we're doing Lynx. */ - *magicp = LYNXCOFFMAGIC; -#endif - return true; - break; -#endif -#ifdef I860MAGIC - case bfd_arch_i860: - *magicp = I860MAGIC; - return true; - break; -#endif -#ifdef MC68MAGIC - case bfd_arch_m68k: -#ifdef APOLLOM68KMAGIC - *magicp = APOLLO_COFF_VERSION_NUMBER; -#else - *magicp = MC68MAGIC; -#endif -#ifdef LYNXOS - /* Just overwrite the usual value if we're doing Lynx. */ - *magicp = LYNXCOFFMAGIC; -#endif - return true; - break; -#endif - -#ifdef MC88MAGIC - case bfd_arch_m88k: - *magicp = MC88OMAGIC; - return true; - break; -#endif -#ifdef H8300MAGIC - case bfd_arch_h8300: - switch (bfd_get_mach (abfd)) - { - case bfd_mach_h8300: - *magicp = H8300MAGIC; - return true; - case bfd_mach_h8300h: - *magicp = H8300HMAGIC; - return true; - } - break; -#endif - -#ifdef SH_ARCH_MAGIC_BIG - case bfd_arch_sh: - if (bfd_big_endian (abfd)) - *magicp = SH_ARCH_MAGIC_BIG; - else - *magicp = SH_ARCH_MAGIC_LITTLE; - return true; - break; -#endif - -#ifdef SPARCMAGIC - case bfd_arch_sparc: - *magicp = SPARCMAGIC; -#ifdef LYNXOS - /* Just overwrite the usual value if we're doing Lynx. */ - *magicp = LYNXCOFFMAGIC; -#endif - return true; - break; -#endif - -#ifdef H8500MAGIC - case bfd_arch_h8500: - *magicp = H8500MAGIC; - return true; - break; -#endif -#ifdef A29K_MAGIC_BIG - case bfd_arch_a29k: - if (bfd_big_endian (abfd)) - *magicp = A29K_MAGIC_BIG; - else - *magicp = A29K_MAGIC_LITTLE; - return true; - break; -#endif - -#ifdef WE32KMAGIC - case bfd_arch_we32k: - *magicp = WE32KMAGIC; - return true; - break; -#endif - -#ifdef U802TOCMAGIC - case bfd_arch_rs6000: -#ifndef PPCMAGIC - case bfd_arch_powerpc: -#endif - *magicp = U802TOCMAGIC; - return true; - break; -#endif - - default: /* Unknown architecture */ - /* return false; -- fall through to "return false" below, to avoid - "statement never reached" errors on the one below. */ - break; - } - - return false; -} - - -static boolean -coff_set_arch_mach (abfd, arch, machine) - bfd * abfd; - enum bfd_architecture arch; - unsigned long machine; -{ - unsigned dummy1; - unsigned short dummy2; - - if (! bfd_default_set_arch_mach (abfd, arch, machine)) - return false; - - if (arch != bfd_arch_unknown && - coff_set_flags (abfd, &dummy1, &dummy2) != true) - return false; /* We can't represent this type */ - - return true; /* We're easy ... */ -} - - -/* Calculate the file position for each section. */ - -static void -coff_compute_section_file_positions (abfd) - bfd * abfd; -{ - asection *current; - asection *previous = (asection *) NULL; - file_ptr sofar = FILHSZ; - -#ifndef I960 - file_ptr old_sofar; -#endif - unsigned int count; - -#ifdef RS6000COFF_C - /* On XCOFF, if we have symbols, set up the .debug section. */ - if (bfd_get_symcount (abfd) > 0) - { - bfd_size_type sz; - bfd_size_type i, symcount; - asymbol **symp; - - sz = 0; - symcount = bfd_get_symcount (abfd); - for (symp = abfd->outsymbols, i = 0; i < symcount; symp++, i++) - { - coff_symbol_type *cf; - - cf = coff_symbol_from (abfd, *symp); - if (cf != NULL - && cf->native != NULL - && SYMNAME_IN_DEBUG (&cf->native->u.syment)) - { - size_t len; - - len = strlen (bfd_asymbol_name (*symp)); - if (len > SYMNMLEN) - sz += len + 3; - } - } - if (sz > 0) - { - asection *dsec; - - dsec = bfd_make_section_old_way (abfd, ".debug"); - if (dsec == NULL) - abort (); - dsec->_raw_size = sz; - dsec->flags |= SEC_HAS_CONTENTS; - } - } -#endif - -#ifdef COFF_IMAGE_WITH_PE - int page_size; - if (coff_data (abfd)->link_info) - { - page_size = pe_data (abfd)->pe_opthdr.FileAlignment; - } - else - page_size = PE_DEF_FILE_ALIGNMENT; -#else -#ifdef COFF_PAGE_SIZE - int page_size = COFF_PAGE_SIZE; -#endif -#endif - - if (bfd_get_start_address (abfd)) - { - /* A start address may have been added to the original file. In this - case it will need an optional header to record it. */ - abfd->flags |= EXEC_P; - } - - if (abfd->flags & EXEC_P) - sofar += AOUTSZ; -#ifdef RS6000COFF_C - else if (xcoff_data (abfd)->full_aouthdr) - sofar += AOUTSZ; - else - sofar += SMALL_AOUTSZ; -#endif - - sofar += abfd->section_count * SCNHSZ; - -#ifdef RS6000COFF_C - /* XCOFF handles overflows in the reloc and line number count fields - by allocating a new section header to hold the correct counts. */ - for (current = abfd->sections; current != NULL; current = current->next) - if (current->reloc_count >= 0xffff || current->lineno_count >= 0xffff) - sofar += SCNHSZ; -#endif - - for (current = abfd->sections, count = 1; - current != (asection *) NULL; - current = current->next, ++count) - { - current->target_index = count; - - /* Only deal with sections which have contents */ - if (!(current->flags & SEC_HAS_CONTENTS)) - continue; - -#ifdef COFF_WITH_PE - /* Do not include the .junk section. This is where we collect section - data which we don't need. This is mainly the MS .debug$ data which - stores codeview debug data. */ - if (strcmp (current->name, ".junk") == 0) - { - continue; - } -#endif - - /* Align the sections in the file to the same boundary on - which they are aligned in virtual memory. I960 doesn't - do this (FIXME) so we can stay in sync with Intel. 960 - doesn't yet page from files... */ -#ifndef I960 - if ((abfd->flags & EXEC_P) != 0) - { - /* make sure this section is aligned on the right boundary - by - padding the previous section up if necessary */ - - old_sofar = sofar; - sofar = BFD_ALIGN (sofar, 1 << current->alignment_power); - if (previous != (asection *) NULL) - { - previous->_raw_size += sofar - old_sofar; - } - } - -#endif - - /* In demand paged files the low order bits of the file offset - must match the low order bits of the virtual address. */ -#ifdef COFF_PAGE_SIZE - if ((abfd->flags & D_PAGED) != 0 - && (current->flags & SEC_ALLOC) != 0) - sofar += (current->vma - sofar) % page_size; -#endif - current->filepos = sofar; - -#ifdef COFF_IMAGE_WITH_PE - /* With PE we have to pad each section to be a multiple of its page size - too, and remember both sizes. Cooked_size becomes very useful. */ - current->_cooked_size = current->_raw_size; - current->_raw_size = (current->_raw_size + page_size -1) & -page_size; -#endif - - sofar += current->_raw_size; - -#ifndef I960 - /* make sure that this section is of the right size too */ - old_sofar = sofar; - sofar = BFD_ALIGN (sofar, 1 << current->alignment_power); - current->_raw_size += sofar - old_sofar; -#endif - -#ifdef _LIB - /* Force .lib sections to start at zero. The vma is then - incremented in coff_set_section_contents. This is right for - SVR3.2. */ - if (strcmp (current->name, _LIB) == 0) - bfd_set_section_vma (abfd, current, 0); -#endif - - previous = current; - } - - obj_relocbase (abfd) = sofar; - abfd->output_has_begun = true; - -} - -#if 0 - -/* This can never work, because it is called too late--after the - section positions have been set. I can't figure out what it is - for, so I am going to disable it--Ian Taylor 20 March 1996. */ - -/* If .file, .text, .data, .bss symbols are missing, add them. */ -/* @@ Should we only be adding missing symbols, or overriding the aux - values for existing section symbols? */ -static boolean -coff_add_missing_symbols (abfd) - bfd *abfd; -{ - unsigned int nsyms = bfd_get_symcount (abfd); - asymbol **sympp = abfd->outsymbols; - asymbol **sympp2; - unsigned int i; - int need_text = 1, need_data = 1, need_bss = 1, need_file = 1; - - for (i = 0; i < nsyms; i++) - { - coff_symbol_type *csym = coff_symbol_from (abfd, sympp[i]); - CONST char *name; - if (csym) - { - /* only do this if there is a coff representation of the input - symbol */ - if (csym->native && csym->native->u.syment.n_sclass == C_FILE) - { - need_file = 0; - continue; - } - name = csym->symbol.name; - if (!name) - continue; - if (!strcmp (name, _TEXT)) - need_text = 0; -#ifdef APOLLO_M68 - else if (!strcmp (name, ".wtext")) - need_text = 0; -#endif - else if (!strcmp (name, _DATA)) - need_data = 0; - else if (!strcmp (name, _BSS)) - need_bss = 0; - } - } - /* Now i == bfd_get_symcount (abfd). */ - /* @@ For now, don't deal with .file symbol. */ - need_file = 0; - - if (!need_text && !need_data && !need_bss && !need_file) - return true; - nsyms += need_text + need_data + need_bss + need_file; - sympp2 = (asymbol **) bfd_alloc_by_size_t (abfd, nsyms * sizeof (asymbol *)); - if (!sympp2) - return false; - memcpy (sympp2, sympp, i * sizeof (asymbol *)); - if (need_file) - { - /* @@ Generate fake .file symbol, in sympp2[i], and increment i. */ - abort (); - } - if (need_text) - sympp2[i++] = coff_section_symbol (abfd, _TEXT); - if (need_data) - sympp2[i++] = coff_section_symbol (abfd, _DATA); - if (need_bss) - sympp2[i++] = coff_section_symbol (abfd, _BSS); - BFD_ASSERT (i == nsyms); - bfd_set_symtab (abfd, sympp2, nsyms); - return true; -} - -#endif /* 0 */ - -/* SUPPRESS 558 */ -/* SUPPRESS 529 */ -static boolean -coff_write_object_contents (abfd) - bfd * abfd; -{ - asection *current; - boolean hasrelocs = false; - boolean haslinno = false; - file_ptr scn_base; - file_ptr reloc_base; - file_ptr lineno_base; - file_ptr sym_base; - unsigned long reloc_size = 0; - unsigned long lnno_size = 0; - asection *text_sec = NULL; - asection *data_sec = NULL; - asection *bss_sec = NULL; - - struct internal_filehdr internal_f; - struct internal_aouthdr internal_a; - - bfd_set_error (bfd_error_system_call); - - /* Make a pass through the symbol table to count line number entries and - put them into the correct asections */ - - lnno_size = coff_count_linenumbers (abfd) * LINESZ; - - if (abfd->output_has_begun == false) - coff_compute_section_file_positions (abfd); - - reloc_base = obj_relocbase (abfd); - - /* Work out the size of the reloc and linno areas */ - - for (current = abfd->sections; current != NULL; current = - current->next) - reloc_size += current->reloc_count * RELSZ; - - lineno_base = reloc_base + reloc_size; - sym_base = lineno_base + lnno_size; - - /* Indicate in each section->line_filepos its actual file address */ - for (current = abfd->sections; current != NULL; current = - current->next) - { - if (current->lineno_count) - { - current->line_filepos = lineno_base; - current->moving_line_filepos = lineno_base; - lineno_base += current->lineno_count * LINESZ; - } - else - { - current->line_filepos = 0; - } - if (current->reloc_count) - { - current->rel_filepos = reloc_base; - reloc_base += current->reloc_count * RELSZ; - } - else - { - current->rel_filepos = 0; - } - } - - /* Write section headers to the file. */ - internal_f.f_nscns = 0; - - if ((abfd->flags & EXEC_P) != 0) - scn_base = FILHSZ + AOUTSZ; - else - { - scn_base = FILHSZ; -#ifdef RS6000COFF_C - if (xcoff_data (abfd)->full_aouthdr) - scn_base += AOUTSZ; - else - scn_base += SMALL_AOUTSZ; -#endif - } - - if (bfd_seek (abfd, scn_base, SEEK_SET) != 0) - return false; - - for (current = abfd->sections; - current != NULL; - current = current->next) - { - struct internal_scnhdr section; - -#ifdef COFF_WITH_PE - /* Do not include the .junk section. This is where we collect section - data which we don't need. This is mainly the MS .debug$ data which - stores codeview debug data. */ - if (strcmp (current->name, ".junk") == 0) - { - continue; - } - - /* If we've got a .reloc section, remember. */ - -#ifdef COFF_IMAGE_WITH_PE - if (strcmp (current->name, ".reloc") == 0) - { - pe_data (abfd)->has_reloc_section = 1; - } -#endif - -#endif - internal_f.f_nscns++; - strncpy (&(section.s_name[0]), current->name, 8); -#ifdef _LIB - /* Always set s_vaddr of .lib to 0. This is right for SVR3.2 - Ian Taylor <ian@cygnus.com>. */ - if (strcmp (current->name, _LIB) == 0) - section.s_vaddr = 0; - else -#endif - section.s_vaddr = current->vma; - section.s_paddr = current->lma; - section.s_size = current->_raw_size; - -#ifdef COFF_WITH_PE - section.s_paddr = current->_cooked_size; -#endif - - /* - If this section has no size or is unloadable then the scnptr - will be 0 too - */ - if (current->_raw_size == 0 || - (current->flags & (SEC_LOAD | SEC_HAS_CONTENTS)) == 0) - { - section.s_scnptr = 0; - } - else - { - section.s_scnptr = current->filepos; - } - section.s_relptr = current->rel_filepos; - section.s_lnnoptr = current->line_filepos; - section.s_nreloc = current->reloc_count; - section.s_nlnno = current->lineno_count; - if (current->reloc_count != 0) - hasrelocs = true; - if (current->lineno_count != 0) - haslinno = true; - -#ifdef RS6000COFF_C - /* Indicate the use of an XCOFF overflow section header. */ - if (current->reloc_count >= 0xffff || current->lineno_count >= 0xffff) - { - section.s_nreloc = 0xffff; - section.s_nlnno = 0xffff; - } -#endif - - section.s_flags = sec_to_styp_flags (current->name, current->flags); - - if (!strcmp (current->name, _TEXT)) - { - text_sec = current; - } - else if (!strcmp (current->name, _DATA)) - { - data_sec = current; - } - else if (!strcmp (current->name, _BSS)) - { - bss_sec = current; - } - -#ifdef I960 - section.s_align = (current->alignment_power - ? 1 << current->alignment_power - : 0); - -#endif - -#ifdef COFF_IMAGE_WITH_PE - /* suppress output of the sections if they are null. ld includes - the bss and data sections even if there is no size assigned - to them. NT loader doesn't like it if these section headers are - included if the sections themselves are not needed */ - if (section.s_size == 0) - internal_f.f_nscns--; - else -#endif - { - SCNHDR buff; - if (coff_swap_scnhdr_out (abfd, §ion, &buff) == 0 - || bfd_write ((PTR) (&buff), 1, SCNHSZ, abfd) != SCNHSZ) - return false; - } - } - -#ifdef RS6000COFF_C - /* XCOFF handles overflows in the reloc and line number count fields - by creating a new section header to hold the correct values. */ - for (current = abfd->sections; current != NULL; current = current->next) - { - if (current->reloc_count >= 0xffff || current->lineno_count >= 0xffff) - { - struct internal_scnhdr scnhdr; - SCNHDR buff; - - internal_f.f_nscns++; - strncpy (&(scnhdr.s_name[0]), current->name, 8); - scnhdr.s_paddr = current->reloc_count; - scnhdr.s_vaddr = current->lineno_count; - scnhdr.s_size = 0; - scnhdr.s_scnptr = 0; - scnhdr.s_relptr = current->rel_filepos; - scnhdr.s_lnnoptr = current->line_filepos; - scnhdr.s_nreloc = current->target_index; - scnhdr.s_nlnno = current->target_index; - scnhdr.s_flags = STYP_OVRFLO; - if (coff_swap_scnhdr_out (abfd, &scnhdr, &buff) == 0 - || bfd_write ((PTR) &buff, 1, SCNHSZ, abfd) != SCNHSZ) - return false; - } - } -#endif - - /* OK, now set up the filehdr... */ - - /* Don't include the internal abs section in the section count */ - - /* - We will NOT put a fucking timestamp in the header here. Every time you - put it back, I will come in and take it out again. I'm sorry. This - field does not belong here. We fill it with a 0 so it compares the - same but is not a reasonable time. -- gnu@cygnus.com - */ - internal_f.f_timdat = 0; - - internal_f.f_flags = 0; - - if (abfd->flags & EXEC_P) - internal_f.f_opthdr = AOUTSZ; - else - { - internal_f.f_opthdr = 0; -#ifdef RS6000COFF_C - if (xcoff_data (abfd)->full_aouthdr) - internal_f.f_opthdr = AOUTSZ; - else - internal_f.f_opthdr = SMALL_AOUTSZ; -#endif - } - - if (!hasrelocs) - internal_f.f_flags |= F_RELFLG; - if (!haslinno) - internal_f.f_flags |= F_LNNO; - if (abfd->flags & EXEC_P) - internal_f.f_flags |= F_EXEC; - - /* FIXME: this is wrong for PPC_PE! */ - if (bfd_little_endian (abfd)) - internal_f.f_flags |= F_AR32WR; - else - internal_f.f_flags |= F_AR32W; - - /* - FIXME, should do something about the other byte orders and - architectures. - */ - -#ifdef RS6000COFF_C - if ((abfd->flags & DYNAMIC) != 0) - internal_f.f_flags |= F_SHROBJ; - if (bfd_get_section_by_name (abfd, _LOADER) != NULL) - internal_f.f_flags |= F_DYNLOAD; -#endif - - memset (&internal_a, 0, sizeof internal_a); - - /* Set up architecture-dependent stuff */ - - { - unsigned int magic = 0; - unsigned short flags = 0; - coff_set_flags (abfd, &magic, &flags); - internal_f.f_magic = magic; - internal_f.f_flags |= flags; - /* ...and the "opt"hdr... */ - -#ifdef A29K -#ifdef ULTRA3 /* NYU's machine */ - /* FIXME: This is a bogus check. I really want to see if there - * is a .shbss or a .shdata section, if so then set the magic - * number to indicate a shared data executable. - */ - if (internal_f.f_nscns >= 7) - internal_a.magic = SHMAGIC; /* Shared magic */ - else -#endif /* ULTRA3 */ - internal_a.magic = NMAGIC; /* Assume separate i/d */ -#define __A_MAGIC_SET__ -#endif /* A29K */ -#ifdef I860 - /* FIXME: What are the a.out magic numbers for the i860? */ - internal_a.magic = 0; -#define __A_MAGIC_SET__ -#endif /* I860 */ -#ifdef I960 - internal_a.magic = (magic == I960ROMAGIC ? NMAGIC : OMAGIC); -#define __A_MAGIC_SET__ -#endif /* I960 */ -#if M88 -#define __A_MAGIC_SET__ - internal_a.magic = PAGEMAGICBCS; -#endif /* M88 */ - -#if APOLLO_M68 -#define __A_MAGIC_SET__ - internal_a.magic = APOLLO_COFF_VERSION_NUMBER; -#endif - -#if defined(M68) || defined(WE32K) || defined(M68K) -#define __A_MAGIC_SET__ -#if defined(LYNXOS) - internal_a.magic = LYNXCOFFMAGIC; -#else -#if defined(TARG_AUX) - internal_a.magic = (abfd->flags & D_PAGED ? PAGEMAGICPEXECPAGED : - abfd->flags & WP_TEXT ? PAGEMAGICPEXECSWAPPED : - PAGEMAGICEXECSWAPPED); -#else -#if defined (PAGEMAGICPEXECPAGED) - internal_a.magic = PAGEMAGICPEXECPAGED; -#endif -#endif /* TARG_AUX */ -#endif /* LYNXOS */ -#endif /* M68 || WE32K || M68K */ - -#if defined(ARM) -#define __A_MAGIC_SET__ - internal_a.magic = ZMAGIC; -#endif -#if defined(PPC) -#define __A_MAGIC_SET__ - internal_a.magic = IMAGE_NT_OPTIONAL_HDR_MAGIC; -#endif -#if defined(I386) -#define __A_MAGIC_SET__ -#if defined(LYNXOS) - internal_a.magic = LYNXCOFFMAGIC; -#else /* LYNXOS */ - internal_a.magic = ZMAGIC; -#endif /* LYNXOS */ -#endif /* I386 */ - -#if defined(SPARC) -#define __A_MAGIC_SET__ -#if defined(LYNXOS) - internal_a.magic = LYNXCOFFMAGIC; -#endif /* LYNXOS */ -#endif /* SPARC */ - -#if RS6000COFF_C -#define __A_MAGIC_SET__ - internal_a.magic = (abfd->flags & D_PAGED) ? RS6K_AOUTHDR_ZMAGIC : - (abfd->flags & WP_TEXT) ? RS6K_AOUTHDR_NMAGIC : - RS6K_AOUTHDR_OMAGIC; -#endif - -#ifndef __A_MAGIC_SET__ -#include "Your aouthdr magic number is not being set!" -#else -#undef __A_MAGIC_SET__ -#endif - } - - /* FIXME: Does anybody ever set this to another value? */ - internal_a.vstamp = 0; - - /* Now should write relocs, strings, syms */ - obj_sym_filepos (abfd) = sym_base; - - if (bfd_get_symcount (abfd) != 0) - { - int firstundef; -#if 0 - if (!coff_add_missing_symbols (abfd)) - return false; -#endif - if (!coff_renumber_symbols (abfd, &firstundef)) - return false; - coff_mangle_symbols (abfd); - if (! coff_write_symbols (abfd)) - return false; - if (! coff_write_linenumbers (abfd)) - return false; - if (! coff_write_relocs (abfd, firstundef)) - return false; - } -#ifdef COFF_IMAGE_WITH_PE -#ifdef PPC - else if ((abfd->flags & EXEC_P) != 0) - { - bfd_byte b; - - /* PowerPC PE appears to require that all executable files be - rounded up to the page size. */ - b = 0; - if (bfd_seek (abfd, - BFD_ALIGN (sym_base, COFF_PAGE_SIZE) - 1, - SEEK_SET) != 0 - || bfd_write (&b, 1, 1, abfd) != 1) - return false; - } -#endif -#endif - - /* If bfd_get_symcount (abfd) != 0, then we are not using the COFF - backend linker, and obj_raw_syment_count is not valid until after - coff_write_symbols is called. */ - if (obj_raw_syment_count (abfd) != 0) - { - internal_f.f_symptr = sym_base; -#ifdef RS6000COFF_C - /* AIX appears to require that F_RELFLG not be set if there are - local symbols but no relocations. */ - internal_f.f_flags &=~ F_RELFLG; -#endif - } - else - { - internal_f.f_symptr = 0; - internal_f.f_flags |= F_LSYMS; - } - - if (text_sec) - { - internal_a.tsize = bfd_get_section_size_before_reloc (text_sec); - internal_a.text_start = internal_a.tsize ? text_sec->vma : 0; - } - if (data_sec) - { - internal_a.dsize = bfd_get_section_size_before_reloc (data_sec); - internal_a.data_start = internal_a.dsize ? data_sec->vma : 0; - } - if (bss_sec) - { - internal_a.bsize = bfd_get_section_size_before_reloc (bss_sec); - if (internal_a.bsize && bss_sec->vma < internal_a.data_start) - internal_a.data_start = bss_sec->vma; - } - - internal_a.entry = bfd_get_start_address (abfd); - internal_f.f_nsyms = obj_raw_syment_count (abfd); - -#ifdef RS6000COFF_C - if (xcoff_data (abfd)->full_aouthdr) - { - bfd_vma toc; - asection *loader_sec; - - internal_a.vstamp = 1; - - internal_a.o_snentry = xcoff_data (abfd)->snentry; - if (internal_a.o_snentry == 0) - internal_a.entry = (bfd_vma) -1; - - if (text_sec != NULL) - { - internal_a.o_sntext = text_sec->target_index; - internal_a.o_algntext = bfd_get_section_alignment (abfd, text_sec); - } - else - { - internal_a.o_sntext = 0; - internal_a.o_algntext = 0; - } - if (data_sec != NULL) - { - internal_a.o_sndata = data_sec->target_index; - internal_a.o_algndata = bfd_get_section_alignment (abfd, data_sec); - } - else - { - internal_a.o_sndata = 0; - internal_a.o_algndata = 0; - } - loader_sec = bfd_get_section_by_name (abfd, ".loader"); - if (loader_sec != NULL) - internal_a.o_snloader = loader_sec->target_index; - else - internal_a.o_snloader = 0; - if (bss_sec != NULL) - internal_a.o_snbss = bss_sec->target_index; - else - internal_a.o_snbss = 0; - - toc = xcoff_data (abfd)->toc; - internal_a.o_toc = toc; - internal_a.o_sntoc = xcoff_data (abfd)->sntoc; - - internal_a.o_modtype = xcoff_data (abfd)->modtype; - if (xcoff_data (abfd)->cputype != -1) - internal_a.o_cputype = xcoff_data (abfd)->cputype; - else - { - switch (bfd_get_arch (abfd)) - { - case bfd_arch_rs6000: - internal_a.o_cputype = 4; - break; - case bfd_arch_powerpc: - if (bfd_get_mach (abfd) == 0) - internal_a.o_cputype = 3; - else - internal_a.o_cputype = 1; - break; - default: - abort (); - } - } - internal_a.o_maxstack = xcoff_data (abfd)->maxstack; - internal_a.o_maxdata = xcoff_data (abfd)->maxdata; - } -#endif - - /* now write them */ - if (bfd_seek (abfd, (file_ptr) 0, SEEK_SET) != 0) - return false; - { - FILHDR buff; - coff_swap_filehdr_out (abfd, (PTR) & internal_f, (PTR) & buff); - if (bfd_write ((PTR) & buff, 1, FILHSZ, abfd) != FILHSZ) - return false; - } - if (abfd->flags & EXEC_P) - { - AOUTHDR buff; - coff_swap_aouthdr_out (abfd, (PTR) & internal_a, (PTR) & buff); - if (bfd_write ((PTR) & buff, 1, AOUTSZ, abfd) != AOUTSZ) - return false; - } -#ifdef RS6000COFF_C - else - { - AOUTHDR buff; - size_t size; - - /* XCOFF seems to always write at least a small a.out header. */ - coff_swap_aouthdr_out (abfd, (PTR) &internal_a, (PTR) &buff); - if (xcoff_data (abfd)->full_aouthdr) - size = AOUTSZ; - else - size = SMALL_AOUTSZ; - if (bfd_write ((PTR) &buff, 1, size, abfd) != size) - return false; - } -#endif - - return true; -} - -static boolean -coff_set_section_contents (abfd, section, location, offset, count) - bfd * abfd; - sec_ptr section; - PTR location; - file_ptr offset; - bfd_size_type count; -{ - if (abfd->output_has_begun == false) /* set by bfd.c handler */ - coff_compute_section_file_positions (abfd); - -#ifdef _LIB - - /* The physical address field of a .lib section is used to hold the - number of shared libraries in the section. This code counts the - number of sections being written, and increments the lma field - with the number. - - I have found no documentation on the contents of this section. - Experimentation indicates that the section contains zero or more - records, each of which has the following structure: - - - a (four byte) word holding the length of this record, in words, - - a word that always seems to be set to "2", - - the path to a shared library, null-terminated and then padded - to a whole word boundary. - - bfd_assert calls have been added to alert if an attempt is made - to write a section which doesn't follow these assumptions. The - code has been tested on ISC 4.1 by me, and on SCO by Robert Lipe - <robertl@arnet.com> (Thanks!). - - Gvran Uddeborg <gvran@uddeborg.pp.se> */ - - if (strcmp (section->name, _LIB) == 0) - { - bfd_byte *rec, *recend; - - rec = (bfd_byte *) location; - recend = rec + count; - while (rec < recend) - { - ++section->lma; - rec += bfd_get_32 (abfd, rec) * 4; - } - - BFD_ASSERT (rec == recend); - } - -#endif - - /* Don't write out bss sections - one way to do this is to - see if the filepos has not been set. */ - if (section->filepos == 0) - return true; - - if (bfd_seek (abfd, (file_ptr) (section->filepos + offset), SEEK_SET) != 0) - return false; - - if (count != 0) - { - return (bfd_write (location, 1, count, abfd) == count) ? true : false; - } - return true; -} -#if 0 -static boolean -coff_close_and_cleanup (abfd) - bfd *abfd; -{ - if (!bfd_read_p (abfd)) - switch (abfd->format) - { - case bfd_archive: - if (!_bfd_write_archive_contents (abfd)) - return false; - break; - case bfd_object: - if (!coff_write_object_contents (abfd)) - return false; - break; - default: - bfd_set_error (bfd_error_invalid_operation); - return false; - } - - /* We depend on bfd_close to free all the memory on the obstack. */ - /* FIXME if bfd_release is not using obstacks! */ - return true; -} - -#endif - -static PTR -buy_and_read (abfd, where, seek_direction, size) - bfd *abfd; - file_ptr where; - int seek_direction; - size_t size; -{ - PTR area = (PTR) bfd_alloc (abfd, size); - if (!area) - return (NULL); - if (bfd_seek (abfd, where, seek_direction) != 0 - || bfd_read (area, 1, size, abfd) != size) - return (NULL); - return (area); -} /* buy_and_read() */ - -/* -SUBSUBSECTION - Reading linenumbers - - Creating the linenumber table is done by reading in the entire - coff linenumber table, and creating another table for internal use. - - A coff linenumber table is structured so that each function - is marked as having a line number of 0. Each line within the - function is an offset from the first line in the function. The - base of the line number information for the table is stored in - the symbol associated with the function. - - The information is copied from the external to the internal - table, and each symbol which marks a function is marked by - pointing its... - - How does this work ? - -*/ - -static boolean -coff_slurp_line_table (abfd, asect) - bfd *abfd; - asection *asect; -{ - LINENO *native_lineno; - alent *lineno_cache; - - BFD_ASSERT (asect->lineno == (alent *) NULL); - - native_lineno = (LINENO *) buy_and_read (abfd, - asect->line_filepos, - SEEK_SET, - (size_t) (LINESZ * - asect->lineno_count)); - lineno_cache = - (alent *) bfd_alloc (abfd, (size_t) ((asect->lineno_count + 1) * sizeof (alent))); - if (lineno_cache == NULL) - return false; - else - { - unsigned int counter = 0; - alent *cache_ptr = lineno_cache; - LINENO *src = native_lineno; - - while (counter < asect->lineno_count) - { - struct internal_lineno dst; - coff_swap_lineno_in (abfd, src, &dst); - cache_ptr->line_number = dst.l_lnno; - - if (cache_ptr->line_number == 0) - { - coff_symbol_type *sym = - (coff_symbol_type *) (dst.l_addr.l_symndx - + obj_raw_syments (abfd))->u.syment._n._n_n._n_zeroes; - cache_ptr->u.sym = (asymbol *) sym; - if (sym->lineno != NULL) - { - (*_bfd_error_handler) - ("%s: warning: duplicate line number information for `%s'", - bfd_get_filename (abfd), - bfd_asymbol_name (&sym->symbol)); - } - sym->lineno = cache_ptr; - } - else - { - cache_ptr->u.offset = dst.l_addr.l_paddr - - bfd_section_vma (abfd, asect); - } /* If no linenumber expect a symbol index */ - - cache_ptr++; - src++; - counter++; - } - cache_ptr->line_number = 0; - - } - asect->lineno = lineno_cache; - /* FIXME, free native_lineno here, or use alloca or something. */ - return true; -} - -static boolean -coff_slurp_symbol_table (abfd) - bfd * abfd; -{ - combined_entry_type *native_symbols; - coff_symbol_type *cached_area; - unsigned int *table_ptr; - - unsigned int number_of_symbols = 0; - - if (obj_symbols (abfd)) - return true; - - /* Read in the symbol table */ - if ((native_symbols = coff_get_normalized_symtab (abfd)) == NULL) - { - return (false); - } /* on error */ - - /* Allocate enough room for all the symbols in cached form */ - cached_area = ((coff_symbol_type *) - bfd_alloc (abfd, - (obj_raw_syment_count (abfd) - * sizeof (coff_symbol_type)))); - - if (cached_area == NULL) - return false; - table_ptr = ((unsigned int *) - bfd_alloc (abfd, - (obj_raw_syment_count (abfd) - * sizeof (unsigned int)))); - - if (table_ptr == NULL) - return false; - else - { - coff_symbol_type *dst = cached_area; - unsigned int last_native_index = obj_raw_syment_count (abfd); - unsigned int this_index = 0; - while (this_index < last_native_index) - { - combined_entry_type *src = native_symbols + this_index; - table_ptr[this_index] = number_of_symbols; - dst->symbol.the_bfd = abfd; - - dst->symbol.name = (char *) (src->u.syment._n._n_n._n_offset); - /* We use the native name field to point to the cached field. */ - src->u.syment._n._n_n._n_zeroes = (long) dst; - dst->symbol.section = coff_section_from_bfd_index (abfd, - src->u.syment.n_scnum); - dst->symbol.flags = 0; - dst->done_lineno = false; - - switch (src->u.syment.n_sclass) - { -#ifdef I960 - case C_LEAFEXT: -#if 0 - dst->symbol.value = src->u.syment.n_value - dst->symbol.section->vma; - dst->symbol.flags = BSF_EXPORT | BSF_GLOBAL; - dst->symbol.flags |= BSF_NOT_AT_END | BSF_FUNCTION; -#endif - /* Fall through to next case */ - -#endif - - case C_EXT: -#ifdef RS6000COFF_C - case C_HIDEXT: -#endif -#ifdef COFF_WITH_PE - /* PE uses storage class 0x68 to denote a section symbol */ - case C_SECTION: - /* PE uses storage class 0x67 for a weak external symbol. */ - case C_NT_WEAK: -#endif - if ((src->u.syment.n_scnum) == 0) - { - if ((src->u.syment.n_value) == 0) - { - dst->symbol.section = bfd_und_section_ptr; - dst->symbol.value = 0; - } - else - { - dst->symbol.section = bfd_com_section_ptr; - dst->symbol.value = (src->u.syment.n_value); - } - } - else - { - /* Base the value as an index from the base of the - section */ - - dst->symbol.flags = BSF_EXPORT | BSF_GLOBAL; - dst->symbol.value = (src->u.syment.n_value - - dst->symbol.section->vma); - - if (ISFCN ((src->u.syment.n_type))) - { - /* A function ext does not go at the end of a - file. */ - dst->symbol.flags |= BSF_NOT_AT_END | BSF_FUNCTION; - } - } - -#ifdef RS6000COFF_C - /* A C_HIDEXT symbol is not global. */ - if (src->u.syment.n_sclass == C_HIDEXT) - dst->symbol.flags = BSF_LOCAL; - /* A symbol with a csect entry should not go at the end. */ - if (src->u.syment.n_numaux > 0) - dst->symbol.flags |= BSF_NOT_AT_END; -#endif - -#ifdef COFF_WITH_PE - if (src->u.syment.n_sclass == C_NT_WEAK) - dst->symbol.flags = BSF_WEAK; -#endif - - break; - - case C_STAT: /* static */ -#ifdef I960 - case C_LEAFSTAT: /* static leaf procedure */ -#endif - case C_LABEL: /* label */ - if (src->u.syment.n_scnum == -2) - dst->symbol.flags = BSF_DEBUGGING; - else - dst->symbol.flags = BSF_LOCAL; - /* - Base the value as an index from the base of the section, if - there is one - */ - if (dst->symbol.section) - dst->symbol.value = (src->u.syment.n_value) - - dst->symbol.section->vma; - else - dst->symbol.value = (src->u.syment.n_value); - break; - - case C_MOS: /* member of structure */ - case C_EOS: /* end of structure */ -#ifdef NOTDEF /* C_AUTOARG has the same value */ -#ifdef C_GLBLREG - case C_GLBLREG: /* A29k-specific storage class */ -#endif -#endif - case C_REGPARM: /* register parameter */ - case C_REG: /* register variable */ -#ifdef C_AUTOARG - case C_AUTOARG: /* 960-specific storage class */ -#endif - case C_TPDEF: /* type definition */ - case C_ARG: - case C_AUTO: /* automatic variable */ - case C_FIELD: /* bit field */ - case C_ENTAG: /* enumeration tag */ - case C_MOE: /* member of enumeration */ - case C_MOU: /* member of union */ - case C_UNTAG: /* union tag */ - dst->symbol.flags = BSF_DEBUGGING; - dst->symbol.value = (src->u.syment.n_value); - break; - - case C_FILE: /* file name */ - case C_STRTAG: /* structure tag */ -#ifdef RS6000COFF_C - case C_GSYM: - case C_LSYM: - case C_PSYM: - case C_RSYM: - case C_RPSYM: - case C_STSYM: - case C_BCOMM: - case C_ECOMM: - case C_DECL: - case C_ENTRY: - case C_FUN: - case C_ESTAT: -#endif - dst->symbol.flags = BSF_DEBUGGING; - dst->symbol.value = (src->u.syment.n_value); - break; - -#ifdef RS6000COFF_C - case C_BINCL: /* beginning of include file */ - case C_EINCL: /* ending of include file */ - /* The value is actually a pointer into the line numbers - of the file. We locate the line number entry, and - set the section to the section which contains it, and - the value to the index in that section. */ - { - asection *sec; - - dst->symbol.flags = BSF_DEBUGGING; - for (sec = abfd->sections; sec != NULL; sec = sec->next) - if (sec->line_filepos <= (file_ptr) src->u.syment.n_value - && ((file_ptr) (sec->line_filepos - + sec->lineno_count * LINESZ) - > (file_ptr) src->u.syment.n_value)) - break; - if (sec == NULL) - dst->symbol.value = 0; - else - { - dst->symbol.section = sec; - dst->symbol.value = ((src->u.syment.n_value - - sec->line_filepos) - / LINESZ); - src->fix_line = 1; - } - } - break; - - case C_BSTAT: - dst->symbol.flags = BSF_DEBUGGING; - - /* The value is actually a symbol index. Save a pointer - to the symbol instead of the index. FIXME: This - should use a union. */ - src->u.syment.n_value = - (long) (native_symbols + src->u.syment.n_value); - dst->symbol.value = src->u.syment.n_value; - src->fix_value = 1; - break; -#endif - - case C_BLOCK: /* ".bb" or ".eb" */ - case C_FCN: /* ".bf" or ".ef" */ - case C_EFCN: /* physical end of function */ - dst->symbol.flags = BSF_LOCAL; - /* - Base the value as an index from the base of the section - */ - dst->symbol.value = (src->u.syment.n_value) - dst->symbol.section->vma; - break; - - case C_NULL: - case C_EXTDEF: /* external definition */ - case C_ULABEL: /* undefined label */ - case C_USTATIC: /* undefined static */ -#ifndef COFF_WITH_PE - /* C_LINE in regular coff is 0x68. NT has taken over this storage - class to represent a section symbol */ - case C_LINE: /* line # reformatted as symbol table entry */ - /* NT uses 0x67 for a weak symbol, not C_ALIAS. */ - case C_ALIAS: /* duplicate tag */ -#endif - case C_HIDDEN: /* ext symbol in dmert public lib */ - default: - (*_bfd_error_handler) - ("%s: Unrecognized storage class %d for %s symbol `%s'", - bfd_get_filename (abfd), src->u.syment.n_sclass, - dst->symbol.section->name, dst->symbol.name); - dst->symbol.flags = BSF_DEBUGGING; - dst->symbol.value = (src->u.syment.n_value); - break; - } - -/* BFD_ASSERT(dst->symbol.flags != 0);*/ - - dst->native = src; - - dst->symbol.udata.i = 0; - dst->lineno = (alent *) NULL; - this_index += (src->u.syment.n_numaux) + 1; - dst++; - number_of_symbols++; - } /* walk the native symtab */ - } /* bfdize the native symtab */ - - obj_symbols (abfd) = cached_area; - obj_raw_syments (abfd) = native_symbols; - - bfd_get_symcount (abfd) = number_of_symbols; - obj_convert (abfd) = table_ptr; - /* Slurp the line tables for each section too */ - { - asection *p; - p = abfd->sections; - while (p) - { - coff_slurp_line_table (abfd, p); - p = p->next; - } - } - return true; -} /* coff_slurp_symbol_table() */ - -/* Check whether a symbol is globally visible. This is used by the - COFF backend linker code in cofflink.c, since a couple of targets - have globally visible symbols which are not class C_EXT. This - function need not handle the case of n_class == C_EXT. */ - -#undef OTHER_GLOBAL_CLASS - -#ifdef I960 -#define OTHER_GLOBAL_CLASS C_LEAFEXT -#endif - -#ifdef COFF_WITH_PE -#define OTHER_GLOBAL_CLASS C_SECTION -#endif - -#ifdef OTHER_GLOBAL_CLASS - -static boolean -coff_sym_is_global (abfd, syment) - bfd *abfd; - struct internal_syment *syment; -{ - if (syment->n_sclass == OTHER_GLOBAL_CLASS) - return true; - return false; -} - -#undef OTHER_GLOBAL_CLASS - -#else /* ! defined (OTHER_GLOBAL_CLASS) */ - -/* sym_is_global should not be defined if it has nothing to do. */ - -#define coff_sym_is_global 0 - -#endif /* ! defined (OTHER_GLOBAL_CLASS) */ - -/* -SUBSUBSECTION - Reading relocations - - Coff relocations are easily transformed into the internal BFD form - (@code{arelent}). - - Reading a coff relocation table is done in the following stages: - - o Read the entire coff relocation table into memory. - - o Process each relocation in turn; first swap it from the - external to the internal form. - - o Turn the symbol referenced in the relocation's symbol index - into a pointer into the canonical symbol table. - This table is the same as the one returned by a call to - @code{bfd_canonicalize_symtab}. The back end will call that - routine and save the result if a canonicalization hasn't been done. - - o The reloc index is turned into a pointer to a howto - structure, in a back end specific way. For instance, the 386 - and 960 use the @code{r_type} to directly produce an index - into a howto table vector; the 88k subtracts a number from the - @code{r_type} field and creates an addend field. - - -*/ - -#ifndef CALC_ADDEND -#define CALC_ADDEND(abfd, ptr, reloc, cache_ptr) \ - { \ - coff_symbol_type *coffsym = (coff_symbol_type *) NULL; \ - if (ptr && bfd_asymbol_bfd (ptr) != abfd) \ - coffsym = (obj_symbols (abfd) \ - + (cache_ptr->sym_ptr_ptr - symbols)); \ - else if (ptr) \ - coffsym = coff_symbol_from (abfd, ptr); \ - if (coffsym != (coff_symbol_type *) NULL \ - && coffsym->native->u.syment.n_scnum == 0) \ - cache_ptr->addend = 0; \ - else if (ptr && bfd_asymbol_bfd (ptr) == abfd \ - && ptr->section != (asection *) NULL) \ - cache_ptr->addend = - (ptr->section->vma + ptr->value); \ - else \ - cache_ptr->addend = 0; \ - } -#endif - -static boolean -coff_slurp_reloc_table (abfd, asect, symbols) - bfd * abfd; - sec_ptr asect; - asymbol ** symbols; -{ - RELOC *native_relocs; - arelent *reloc_cache; - arelent *cache_ptr; - - unsigned int idx; - - if (asect->relocation) - return true; - if (asect->reloc_count == 0) - return true; - if (asect->flags & SEC_CONSTRUCTOR) - return true; - if (!coff_slurp_symbol_table (abfd)) - return false; - native_relocs = - (RELOC *) buy_and_read (abfd, - asect->rel_filepos, - SEEK_SET, - (size_t) (RELSZ * - asect->reloc_count)); - reloc_cache = (arelent *) - bfd_alloc (abfd, (size_t) (asect->reloc_count * sizeof (arelent))); - - if (reloc_cache == NULL) - return false; - - - for (idx = 0; idx < asect->reloc_count; idx++) - { -#ifdef RELOC_PROCESSING - struct internal_reloc dst; - struct external_reloc *src; - - cache_ptr = reloc_cache + idx; - src = native_relocs + idx; - coff_swap_reloc_in (abfd, src, &dst); - - RELOC_PROCESSING (cache_ptr, &dst, symbols, abfd, asect); -#else - struct internal_reloc dst; - asymbol *ptr; - struct external_reloc *src; - - cache_ptr = reloc_cache + idx; - src = native_relocs + idx; - - coff_swap_reloc_in (abfd, src, &dst); - - - cache_ptr->address = dst.r_vaddr; - - if (dst.r_symndx != -1) - { - /* @@ Should never be greater than count of symbols! */ - if (dst.r_symndx >= obj_conv_table_size (abfd)) - abort (); - cache_ptr->sym_ptr_ptr = symbols + obj_convert (abfd)[dst.r_symndx]; - ptr = *(cache_ptr->sym_ptr_ptr); - } - else - { - cache_ptr->sym_ptr_ptr = bfd_abs_section_ptr->symbol_ptr_ptr; - ptr = 0; - } - - /* The symbols definitions that we have read in have been - relocated as if their sections started at 0. But the offsets - refering to the symbols in the raw data have not been - modified, so we have to have a negative addend to compensate. - - Note that symbols which used to be common must be left alone */ - - /* Calculate any reloc addend by looking at the symbol */ - CALC_ADDEND (abfd, ptr, dst, cache_ptr); - - cache_ptr->address -= asect->vma; -/* !! cache_ptr->section = (asection *) NULL;*/ - - /* Fill in the cache_ptr->howto field from dst.r_type */ - RTYPE2HOWTO (cache_ptr, &dst); -#endif - - } - - asect->relocation = reloc_cache; - return true; -} - -#ifndef coff_rtype_to_howto -#ifdef RTYPE2HOWTO - -/* Get the howto structure for a reloc. This is only used if the file - including this one defines coff_relocate_section to be - _bfd_coff_generic_relocate_section, so it is OK if it does not - always work. It is the responsibility of the including file to - make sure it is reasonable if it is needed. */ - -static reloc_howto_type *coff_rtype_to_howto - PARAMS ((bfd *, asection *, struct internal_reloc *, - struct coff_link_hash_entry *, struct internal_syment *, - bfd_vma *)); - -/*ARGSUSED*/ -static reloc_howto_type * -coff_rtype_to_howto (abfd, sec, rel, h, sym, addendp) - bfd *abfd; - asection *sec; - struct internal_reloc *rel; - struct coff_link_hash_entry *h; - struct internal_syment *sym; - bfd_vma *addendp; -{ - arelent genrel; - - RTYPE2HOWTO (&genrel, rel); - return genrel.howto; -} - -#else /* ! defined (RTYPE2HOWTO) */ - -#define coff_rtype_to_howto NULL - -#endif /* ! defined (RTYPE2HOWTO) */ -#endif /* ! defined (coff_rtype_to_howto) */ - -/* This is stupid. This function should be a boolean predicate. */ -static long -coff_canonicalize_reloc (abfd, section, relptr, symbols) - bfd * abfd; - sec_ptr section; - arelent ** relptr; - asymbol ** symbols; -{ - arelent *tblptr = section->relocation; - unsigned int count = 0; - - - if (section->flags & SEC_CONSTRUCTOR) - { - /* this section has relocs made up by us, they are not in the - file, so take them out of their chain and place them into - the data area provided */ - arelent_chain *chain = section->constructor_chain; - for (count = 0; count < section->reloc_count; count++) - { - *relptr++ = &chain->relent; - chain = chain->next; - } - - } - else - { - if (! coff_slurp_reloc_table (abfd, section, symbols)) - return -1; - - tblptr = section->relocation; - - for (; count++ < section->reloc_count;) - *relptr++ = tblptr++; - - - } - *relptr = 0; - return section->reloc_count; -} - -#ifdef GNU960 -file_ptr -coff_sym_filepos (abfd) - bfd *abfd; -{ - return obj_sym_filepos (abfd); -} -#endif - -#ifndef coff_reloc16_estimate -#define coff_reloc16_estimate dummy_reloc16_estimate - -static int -dummy_reloc16_estimate (abfd, input_section, reloc, shrink, link_info) - bfd *abfd; - asection *input_section; - arelent *reloc; - unsigned int shrink; - struct bfd_link_info *link_info; -{ - abort (); -} - -#endif - -#ifndef coff_reloc16_extra_cases -#define coff_reloc16_extra_cases dummy_reloc16_extra_cases -/* This works even if abort is not declared in any header file. */ -static void -dummy_reloc16_extra_cases (abfd, link_info, link_order, reloc, data, src_ptr, - dst_ptr) - bfd *abfd; - struct bfd_link_info *link_info; - struct bfd_link_order *link_order; - arelent *reloc; - bfd_byte *data; - unsigned int *src_ptr; - unsigned int *dst_ptr; -{ - abort (); -} -#endif - -/* If coff_relocate_section is defined, we can use the optimized COFF - backend linker. Otherwise we must continue to use the old linker. */ -#ifdef coff_relocate_section -#ifndef coff_bfd_link_hash_table_create -#define coff_bfd_link_hash_table_create _bfd_coff_link_hash_table_create -#endif -#ifndef coff_bfd_link_add_symbols -#define coff_bfd_link_add_symbols _bfd_coff_link_add_symbols -#endif -#ifndef coff_bfd_final_link -#define coff_bfd_final_link _bfd_coff_final_link -#endif -#else /* ! defined (coff_relocate_section) */ -#define coff_relocate_section NULL -#define coff_bfd_link_hash_table_create _bfd_generic_link_hash_table_create -#ifndef coff_bfd_link_add_symbols -#define coff_bfd_link_add_symbols _bfd_generic_link_add_symbols -#endif -#define coff_bfd_final_link _bfd_generic_final_link -#endif /* ! defined (coff_relocate_section) */ -#define coff_bfd_link_split_section _bfd_generic_link_split_section - -#ifndef coff_start_final_link -#define coff_start_final_link NULL -#endif - -#ifndef coff_adjust_symndx -#define coff_adjust_symndx NULL -#endif - -#ifndef coff_link_add_one_symbol -#define coff_link_add_one_symbol _bfd_generic_link_add_one_symbol -#endif - -static CONST bfd_coff_backend_data bfd_coff_std_swap_table = -{ - coff_swap_aux_in, coff_swap_sym_in, coff_swap_lineno_in, - coff_swap_aux_out, coff_swap_sym_out, - coff_swap_lineno_out, coff_swap_reloc_out, - coff_swap_filehdr_out, coff_swap_aouthdr_out, - coff_swap_scnhdr_out, - FILHSZ, AOUTSZ, SCNHSZ, SYMESZ, AUXESZ, RELSZ, LINESZ, -#ifdef COFF_LONG_FILENAMES - true, -#else - false, -#endif - coff_swap_filehdr_in, coff_swap_aouthdr_in, coff_swap_scnhdr_in, - coff_swap_reloc_in, coff_bad_format_hook, coff_set_arch_mach_hook, - coff_mkobject_hook, styp_to_sec_flags, coff_set_alignment_hook, - coff_slurp_symbol_table, symname_in_debug_hook, coff_pointerize_aux_hook, - coff_print_aux, coff_reloc16_extra_cases, coff_reloc16_estimate, - coff_sym_is_global, coff_compute_section_file_positions, - coff_start_final_link, coff_relocate_section, coff_rtype_to_howto, - coff_adjust_symndx, coff_link_add_one_symbol -}; - -#define coff_close_and_cleanup _bfd_generic_close_and_cleanup -#define coff_bfd_free_cached_info _bfd_generic_bfd_free_cached_info -#define coff_get_section_contents _bfd_generic_get_section_contents - -#ifndef coff_bfd_copy_private_symbol_data -#define coff_bfd_copy_private_symbol_data _bfd_generic_bfd_copy_private_symbol_data -#endif - -#ifndef coff_bfd_copy_private_section_data -#define coff_bfd_copy_private_section_data _bfd_generic_bfd_copy_private_section_data -#endif - -#ifndef coff_bfd_copy_private_bfd_data -#define coff_bfd_copy_private_bfd_data _bfd_generic_bfd_copy_private_bfd_data -#endif - -#define coff_bfd_merge_private_bfd_data _bfd_generic_bfd_merge_private_bfd_data -#define coff_bfd_set_private_flags _bfd_generic_bfd_set_private_flags - -#ifndef coff_bfd_print_private_bfd_data -#define coff_bfd_print_private_bfd_data _bfd_generic_bfd_print_private_bfd_data -#endif - -#ifndef coff_bfd_is_local_label -#define coff_bfd_is_local_label bfd_generic_is_local_label -#endif -#ifndef coff_read_minisymbols -#define coff_read_minisymbols _bfd_generic_read_minisymbols -#endif -#ifndef coff_minisymbol_to_symbol -#define coff_minisymbol_to_symbol _bfd_generic_minisymbol_to_symbol -#endif - -/* The reloc lookup routine must be supplied by each individual COFF - backend. */ -#ifndef coff_bfd_reloc_type_lookup -#define coff_bfd_reloc_type_lookup _bfd_norelocs_bfd_reloc_type_lookup -#endif - -#ifndef coff_bfd_get_relocated_section_contents -#define coff_bfd_get_relocated_section_contents \ - bfd_generic_get_relocated_section_contents -#endif -#ifndef coff_bfd_relax_section -#define coff_bfd_relax_section bfd_generic_relax_section -#endif diff --git a/contrib/gdb/bfd/coffgen.c b/contrib/gdb/bfd/coffgen.c deleted file mode 100644 index 285fe61ccc537..0000000000000 --- a/contrib/gdb/bfd/coffgen.c +++ /dev/null @@ -1,2121 +0,0 @@ -/* Support for the generic parts of COFF, for BFD. - Copyright 1990, 91, 92, 93, 94, 95, 1996 Free Software Foundation, Inc. - Written by Cygnus Support. - -This file is part of BFD, the Binary File Descriptor library. - -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 2 of the License, 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ - -/* Most of this hacked by Steve Chamberlain, sac@cygnus.com. - Split out of coffcode.h by Ian Taylor, ian@cygnus.com. */ - -/* This file contains COFF code that is not dependent on any - particular COFF target. There is only one version of this file in - libbfd.a, so no target specific code may be put in here. Or, to - put it another way, - - ********** DO NOT PUT TARGET SPECIFIC CODE IN THIS FILE ********** - - If you need to add some target specific behaviour, add a new hook - function to bfd_coff_backend_data. - - Some of these functions are also called by the ECOFF routines. - Those functions may not use any COFF specific information, such as - coff_data (abfd). */ - -#include "bfd.h" -#include "sysdep.h" -#include "libbfd.h" -#include "coff/internal.h" -#include "libcoff.h" - -static void coff_fix_symbol_name - PARAMS ((bfd *, asymbol *, combined_entry_type *, bfd_size_type *, - asection **, bfd_size_type *)); -static boolean coff_write_symbol - PARAMS ((bfd *, asymbol *, combined_entry_type *, unsigned int *, - bfd_size_type *, asection **, bfd_size_type *)); -static boolean coff_write_alien_symbol - PARAMS ((bfd *, asymbol *, unsigned int *, bfd_size_type *, - asection **, bfd_size_type *)); -static boolean coff_write_native_symbol - PARAMS ((bfd *, coff_symbol_type *, unsigned int *, bfd_size_type *, - asection **, bfd_size_type *)); -static void coff_pointerize_aux - PARAMS ((bfd *, combined_entry_type *, combined_entry_type *, - unsigned int, combined_entry_type *)); - -#define STRING_SIZE_SIZE (4) - -/* Take a section header read from a coff file (in HOST byte order), - and make a BFD "section" out of it. This is used by ECOFF. */ -static boolean -make_a_section_from_file (abfd, hdr, target_index) - bfd *abfd; - struct internal_scnhdr *hdr; - unsigned int target_index; -{ - asection *return_section; - char *name; - - /* Assorted wastage to null-terminate the name, thanks AT&T! */ - name = bfd_alloc (abfd, sizeof (hdr->s_name) + 1); - if (name == NULL) - return false; - strncpy (name, (char *) &hdr->s_name[0], sizeof (hdr->s_name)); - name[sizeof (hdr->s_name)] = 0; - - return_section = bfd_make_section_anyway (abfd, name); - if (return_section == NULL) - return false; - - return_section->vma = hdr->s_vaddr; - return_section->lma = hdr->s_paddr; - return_section->_raw_size = hdr->s_size; - return_section->filepos = hdr->s_scnptr; - return_section->rel_filepos = hdr->s_relptr; - return_section->reloc_count = hdr->s_nreloc; - - bfd_coff_set_alignment_hook (abfd, return_section, hdr); - - return_section->line_filepos = hdr->s_lnnoptr; - - return_section->lineno_count = hdr->s_nlnno; - return_section->userdata = NULL; - return_section->next = (asection *) NULL; - return_section->flags = bfd_coff_styp_to_sec_flags_hook (abfd, hdr, name); - - return_section->target_index = target_index; - - /* At least on i386-coff, the line number count for a shared library - section must be ignored. */ - if ((return_section->flags & SEC_COFF_SHARED_LIBRARY) != 0) - return_section->lineno_count = 0; - - if (hdr->s_nreloc != 0) - return_section->flags |= SEC_RELOC; - /* FIXME: should this check 'hdr->s_size > 0' */ - if (hdr->s_scnptr != 0) - return_section->flags |= SEC_HAS_CONTENTS; - return true; -} - -/* Read in a COFF object and make it into a BFD. This is used by - ECOFF as well. */ - -static const bfd_target * -coff_real_object_p (abfd, nscns, internal_f, internal_a) - bfd *abfd; - unsigned nscns; - struct internal_filehdr *internal_f; - struct internal_aouthdr *internal_a; -{ - flagword oflags = abfd->flags; - bfd_vma ostart = bfd_get_start_address (abfd); - PTR tdata; - size_t readsize; /* length of file_info */ - unsigned int scnhsz; - char *external_sections; - - if (!(internal_f->f_flags & F_RELFLG)) - abfd->flags |= HAS_RELOC; - if ((internal_f->f_flags & F_EXEC)) - abfd->flags |= EXEC_P; - if (!(internal_f->f_flags & F_LNNO)) - abfd->flags |= HAS_LINENO; - if (!(internal_f->f_flags & F_LSYMS)) - abfd->flags |= HAS_LOCALS; - - /* FIXME: How can we set D_PAGED correctly? */ - if ((internal_f->f_flags & F_EXEC) != 0) - abfd->flags |= D_PAGED; - - bfd_get_symcount (abfd) = internal_f->f_nsyms; - if (internal_f->f_nsyms) - abfd->flags |= HAS_SYMS; - - if (internal_a != (struct internal_aouthdr *) NULL) - bfd_get_start_address (abfd) = internal_a->entry; - else - bfd_get_start_address (abfd) = 0; - - /* Set up the tdata area. ECOFF uses its own routine, and overrides - abfd->flags. */ - tdata = bfd_coff_mkobject_hook (abfd, (PTR) internal_f, (PTR) internal_a); - if (tdata == NULL) - return 0; - - scnhsz = bfd_coff_scnhsz (abfd); - readsize = nscns * scnhsz; - external_sections = (char *) bfd_alloc (abfd, readsize); - if (!external_sections) - goto fail; - - if (bfd_read ((PTR) external_sections, 1, readsize, abfd) != readsize) - goto fail; - - /* Now copy data as required; construct all asections etc */ - if (nscns != 0) - { - unsigned int i; - for (i = 0; i < nscns; i++) - { - struct internal_scnhdr tmp; - bfd_coff_swap_scnhdr_in (abfd, - (PTR) (external_sections + i * scnhsz), - (PTR) & tmp); - make_a_section_from_file (abfd, &tmp, i + 1); - } - } - - /* make_abs_section (abfd); */ - - if (bfd_coff_set_arch_mach_hook (abfd, (PTR) internal_f) == false) - goto fail; - - return abfd->xvec; - - fail: - bfd_release (abfd, tdata); - abfd->flags = oflags; - bfd_get_start_address (abfd) = ostart; - return (const bfd_target *) NULL; -} - -/* Turn a COFF file into a BFD, but fail with bfd_error_wrong_format if it is - not a COFF file. This is also used by ECOFF. */ - -const bfd_target * -coff_object_p (abfd) - bfd *abfd; -{ - unsigned int filhsz; - unsigned int aoutsz; - int nscns; - PTR filehdr; - struct internal_filehdr internal_f; - struct internal_aouthdr internal_a; - - /* figure out how much to read */ - filhsz = bfd_coff_filhsz (abfd); - aoutsz = bfd_coff_aoutsz (abfd); - - filehdr = bfd_alloc (abfd, filhsz); - if (filehdr == NULL) - return 0; - if (bfd_read (filehdr, 1, filhsz, abfd) != filhsz) - { - if (bfd_get_error () != bfd_error_system_call) - bfd_set_error (bfd_error_wrong_format); - return 0; - } - bfd_coff_swap_filehdr_in (abfd, filehdr, &internal_f); - bfd_release (abfd, filehdr); - - if (bfd_coff_bad_format_hook (abfd, &internal_f) == false) - { - bfd_set_error (bfd_error_wrong_format); - return 0; - } - nscns = internal_f.f_nscns; - - if (internal_f.f_opthdr) - { - PTR opthdr; - - opthdr = bfd_alloc (abfd, aoutsz); - if (opthdr == NULL) - return 0;; - if (bfd_read (opthdr, 1, aoutsz, abfd) != aoutsz) - { - return 0; - } - bfd_coff_swap_aouthdr_in (abfd, opthdr, (PTR) & internal_a); - } - - /* Seek past the opt hdr stuff */ - if (bfd_seek (abfd, (file_ptr) (internal_f.f_opthdr + filhsz), SEEK_SET) - != 0) - return NULL; - - return coff_real_object_p (abfd, nscns, &internal_f, - (internal_f.f_opthdr != 0 - ? &internal_a - : (struct internal_aouthdr *) NULL)); -} - -/* Get the BFD section from a COFF symbol section number. */ - -asection * -coff_section_from_bfd_index (abfd, index) - bfd *abfd; - int index; -{ - struct sec *answer = abfd->sections; - - if (index == N_ABS) - return bfd_abs_section_ptr; - if (index == N_UNDEF) - return bfd_und_section_ptr; - if (index == N_DEBUG) - return bfd_abs_section_ptr; - - while (answer) - { - if (answer->target_index == index) - return answer; - answer = answer->next; - } - - /* We should not reach this point, but the SCO 3.2v4 /lib/libc_s.a - has a bad symbol table in biglitpow.o. */ - return bfd_und_section_ptr; -} - -/* Get the upper bound of a COFF symbol table. */ - -long -coff_get_symtab_upper_bound (abfd) - bfd *abfd; -{ - if (!bfd_coff_slurp_symbol_table (abfd)) - return -1; - - return (bfd_get_symcount (abfd) + 1) * (sizeof (coff_symbol_type *)); -} - - -/* Canonicalize a COFF symbol table. */ - -long -coff_get_symtab (abfd, alocation) - bfd *abfd; - asymbol **alocation; -{ - unsigned int counter; - coff_symbol_type *symbase; - coff_symbol_type **location = (coff_symbol_type **) alocation; - - if (!bfd_coff_slurp_symbol_table (abfd)) - return -1; - - symbase = obj_symbols (abfd); - counter = bfd_get_symcount (abfd); - while (counter-- > 0) - *location++ = symbase++; - - *location = NULL; - - return bfd_get_symcount (abfd); -} - -/* Get the name of a symbol. The caller must pass in a buffer of size - >= SYMNMLEN + 1. */ - -const char * -_bfd_coff_internal_syment_name (abfd, sym, buf) - bfd *abfd; - const struct internal_syment *sym; - char *buf; -{ - /* FIXME: It's not clear this will work correctly if sizeof - (_n_zeroes) != 4. */ - if (sym->_n._n_n._n_zeroes != 0 - || sym->_n._n_n._n_offset == 0) - { - memcpy (buf, sym->_n._n_name, SYMNMLEN); - buf[SYMNMLEN] = '\0'; - return buf; - } - else - { - const char *strings; - - BFD_ASSERT (sym->_n._n_n._n_offset >= STRING_SIZE_SIZE); - strings = obj_coff_strings (abfd); - if (strings == NULL) - { - strings = _bfd_coff_read_string_table (abfd); - if (strings == NULL) - return NULL; - } - return strings + sym->_n._n_n._n_offset; - } -} - -/* Read in and swap the relocs. This returns a buffer holding the - relocs for section SEC in file ABFD. If CACHE is true and - INTERNAL_RELOCS is NULL, the relocs read in will be saved in case - the function is called again. If EXTERNAL_RELOCS is not NULL, it - is a buffer large enough to hold the unswapped relocs. If - INTERNAL_RELOCS is not NULL, it is a buffer large enough to hold - the swapped relocs. If REQUIRE_INTERNAL is true, then the return - value must be INTERNAL_RELOCS. The function returns NULL on error. */ - -struct internal_reloc * -_bfd_coff_read_internal_relocs (abfd, sec, cache, external_relocs, - require_internal, internal_relocs) - bfd *abfd; - asection *sec; - boolean cache; - bfd_byte *external_relocs; - boolean require_internal; - struct internal_reloc *internal_relocs; -{ - bfd_size_type relsz; - bfd_byte *free_external = NULL; - struct internal_reloc *free_internal = NULL; - bfd_byte *erel; - bfd_byte *erel_end; - struct internal_reloc *irel; - - if (coff_section_data (abfd, sec) != NULL - && coff_section_data (abfd, sec)->relocs != NULL) - { - if (! require_internal) - return coff_section_data (abfd, sec)->relocs; - memcpy (internal_relocs, coff_section_data (abfd, sec)->relocs, - sec->reloc_count * sizeof (struct internal_reloc)); - return internal_relocs; - } - - relsz = bfd_coff_relsz (abfd); - - if (external_relocs == NULL) - { - free_external = (bfd_byte *) bfd_malloc (sec->reloc_count * relsz); - if (free_external == NULL && sec->reloc_count > 0) - goto error_return; - external_relocs = free_external; - } - - if (bfd_seek (abfd, sec->rel_filepos, SEEK_SET) != 0 - || (bfd_read (external_relocs, relsz, sec->reloc_count, abfd) - != relsz * sec->reloc_count)) - goto error_return; - - if (internal_relocs == NULL) - { - free_internal = ((struct internal_reloc *) - bfd_malloc (sec->reloc_count - * sizeof (struct internal_reloc))); - if (free_internal == NULL && sec->reloc_count > 0) - goto error_return; - internal_relocs = free_internal; - } - - /* Swap in the relocs. */ - erel = external_relocs; - erel_end = erel + relsz * sec->reloc_count; - irel = internal_relocs; - for (; erel < erel_end; erel += relsz, irel++) - bfd_coff_swap_reloc_in (abfd, (PTR) erel, (PTR) irel); - - if (free_external != NULL) - { - free (free_external); - free_external = NULL; - } - - if (cache && free_internal != NULL) - { - if (coff_section_data (abfd, sec) == NULL) - { - sec->used_by_bfd = - (PTR) bfd_zalloc (abfd, - sizeof (struct coff_section_tdata)); - if (sec->used_by_bfd == NULL) - goto error_return; - coff_section_data (abfd, sec)->contents = NULL; - } - coff_section_data (abfd, sec)->relocs = free_internal; - } - - return internal_relocs; - - error_return: - if (free_external != NULL) - free (free_external); - if (free_internal != NULL) - free (free_internal); - return NULL; -} - -/* Set lineno_count for the output sections of a COFF file. */ - -int -coff_count_linenumbers (abfd) - bfd *abfd; -{ - unsigned int limit = bfd_get_symcount (abfd); - unsigned int i; - int total = 0; - asymbol **p; - asection *s; - - if (limit == 0) - { - /* This may be from the backend linker, in which case the - lineno_count in the sections is correct. */ - for (s = abfd->sections; s != NULL; s = s->next) - total += s->lineno_count; - return total; - } - - for (s = abfd->sections; s != NULL; s = s->next) - BFD_ASSERT (s->lineno_count == 0); - - for (p = abfd->outsymbols, i = 0; i < limit; i++, p++) - { - asymbol *q_maybe = *p; - - if (bfd_asymbol_flavour (q_maybe) == bfd_target_coff_flavour) - { - coff_symbol_type *q = coffsymbol (q_maybe); - - /* The AIX 4.1 compiler can sometimes generate line numbers - attached to debugging symbols. We try to simply ignore - those here. */ - if (q->lineno != NULL - && q->symbol.section->owner != NULL) - { - /* This symbol has line numbers. Increment the owning - section's linenumber count. */ - alent *l = q->lineno; - - ++q->symbol.section->output_section->lineno_count; - ++total; - ++l; - while (l->line_number != 0) - { - ++total; - ++q->symbol.section->output_section->lineno_count; - ++l; - } - } - } - } - - return total; -} - -/* Takes a bfd and a symbol, returns a pointer to the coff specific - area of the symbol if there is one. */ - -/*ARGSUSED*/ -coff_symbol_type * -coff_symbol_from (ignore_abfd, symbol) - bfd *ignore_abfd; - asymbol *symbol; -{ - if (bfd_asymbol_flavour (symbol) != bfd_target_coff_flavour) - return (coff_symbol_type *) NULL; - - if (bfd_asymbol_bfd (symbol)->tdata.coff_obj_data == (coff_data_type *) NULL) - return (coff_symbol_type *) NULL; - - return (coff_symbol_type *) symbol; -} - -static void -fixup_symbol_value (coff_symbol_ptr, syment) - coff_symbol_type *coff_symbol_ptr; - struct internal_syment *syment; -{ - - /* Normalize the symbol flags */ - if (bfd_is_com_section (coff_symbol_ptr->symbol.section)) - { - /* a common symbol is undefined with a value */ - syment->n_scnum = N_UNDEF; - syment->n_value = coff_symbol_ptr->symbol.value; - } - else if (coff_symbol_ptr->symbol.flags & BSF_DEBUGGING) - { - syment->n_value = coff_symbol_ptr->symbol.value; - } - else if (bfd_is_und_section (coff_symbol_ptr->symbol.section)) - { - syment->n_scnum = N_UNDEF; - syment->n_value = 0; - } - else - { - if (coff_symbol_ptr->symbol.section) - { - syment->n_scnum = - coff_symbol_ptr->symbol.section->output_section->target_index; - - syment->n_value = - coff_symbol_ptr->symbol.value + - coff_symbol_ptr->symbol.section->output_offset + - coff_symbol_ptr->symbol.section->output_section->vma; - } - else - { - BFD_ASSERT (0); - /* This can happen, but I don't know why yet (steve@cygnus.com) */ - syment->n_scnum = N_ABS; - syment->n_value = coff_symbol_ptr->symbol.value; - } - } -} - -/* Run through all the symbols in the symbol table and work out what - their indexes into the symbol table will be when output. - - Coff requires that each C_FILE symbol points to the next one in the - chain, and that the last one points to the first external symbol. We - do that here too. */ - -boolean -coff_renumber_symbols (bfd_ptr, first_undef) - bfd *bfd_ptr; - int *first_undef; -{ - unsigned int symbol_count = bfd_get_symcount (bfd_ptr); - asymbol **symbol_ptr_ptr = bfd_ptr->outsymbols; - unsigned int native_index = 0; - struct internal_syment *last_file = (struct internal_syment *) NULL; - unsigned int symbol_index; - - /* COFF demands that undefined symbols come after all other symbols. - Since we don't need to impose this extra knowledge on all our - client programs, deal with that here. Sort the symbol table; - just move the undefined symbols to the end, leaving the rest - alone. The O'Reilly book says that defined global symbols come - at the end before the undefined symbols, so we do that here as - well. */ - /* @@ Do we have some condition we could test for, so we don't always - have to do this? I don't think relocatability is quite right, but - I'm not certain. [raeburn:19920508.1711EST] */ - { - asymbol **newsyms; - unsigned int i; - - newsyms = (asymbol **) bfd_alloc_by_size_t (bfd_ptr, - sizeof (asymbol *) - * (symbol_count + 1)); - if (!newsyms) - return false; - bfd_ptr->outsymbols = newsyms; - for (i = 0; i < symbol_count; i++) - if ((symbol_ptr_ptr[i]->flags & BSF_NOT_AT_END) != 0 - || (!bfd_is_und_section (symbol_ptr_ptr[i]->section) - && !bfd_is_com_section (symbol_ptr_ptr[i]->section) - && ((symbol_ptr_ptr[i]->flags & (BSF_GLOBAL | BSF_FUNCTION)) - != BSF_GLOBAL))) - *newsyms++ = symbol_ptr_ptr[i]; - - for (i = 0; i < symbol_count; i++) - if (!bfd_is_und_section (symbol_ptr_ptr[i]->section) - && (bfd_is_com_section (symbol_ptr_ptr[i]->section) - || ((symbol_ptr_ptr[i]->flags & (BSF_GLOBAL - | BSF_NOT_AT_END - | BSF_FUNCTION)) - == BSF_GLOBAL))) - *newsyms++ = symbol_ptr_ptr[i]; - - *first_undef = newsyms - bfd_ptr->outsymbols; - - for (i = 0; i < symbol_count; i++) - if ((symbol_ptr_ptr[i]->flags & BSF_NOT_AT_END) == 0 - && bfd_is_und_section (symbol_ptr_ptr[i]->section)) - *newsyms++ = symbol_ptr_ptr[i]; - *newsyms = (asymbol *) NULL; - symbol_ptr_ptr = bfd_ptr->outsymbols; - } - - for (symbol_index = 0; symbol_index < symbol_count; symbol_index++) - { - coff_symbol_type *coff_symbol_ptr = coff_symbol_from (bfd_ptr, symbol_ptr_ptr[symbol_index]); - symbol_ptr_ptr[symbol_index]->udata.i = symbol_index; - if (coff_symbol_ptr && coff_symbol_ptr->native) - { - combined_entry_type *s = coff_symbol_ptr->native; - int i; - - if (s->u.syment.n_sclass == C_FILE) - { - if (last_file != (struct internal_syment *) NULL) - last_file->n_value = native_index; - last_file = &(s->u.syment); - } - else - { - - /* Modify the symbol values according to their section and - type */ - - fixup_symbol_value (coff_symbol_ptr, &(s->u.syment)); - } - for (i = 0; i < s->u.syment.n_numaux + 1; i++) - s[i].offset = native_index++; - } - else - { - native_index++; - } - } - obj_conv_table_size (bfd_ptr) = native_index; - - return true; -} - -/* Run thorough the symbol table again, and fix it so that all - pointers to entries are changed to the entries' index in the output - symbol table. */ - -void -coff_mangle_symbols (bfd_ptr) - bfd *bfd_ptr; -{ - unsigned int symbol_count = bfd_get_symcount (bfd_ptr); - asymbol **symbol_ptr_ptr = bfd_ptr->outsymbols; - unsigned int symbol_index; - - for (symbol_index = 0; symbol_index < symbol_count; symbol_index++) - { - coff_symbol_type *coff_symbol_ptr = - coff_symbol_from (bfd_ptr, symbol_ptr_ptr[symbol_index]); - - if (coff_symbol_ptr && coff_symbol_ptr->native) - { - int i; - combined_entry_type *s = coff_symbol_ptr->native; - - if (s->fix_value) - { - /* FIXME: We should use a union here. */ - s->u.syment.n_value = - ((combined_entry_type *) s->u.syment.n_value)->offset; - s->fix_value = 0; - } - if (s->fix_line) - { - /* The value is the offset into the line number entries - for the symbol's section. On output, the symbol's - section should be N_DEBUG. */ - s->u.syment.n_value = - (coff_symbol_ptr->symbol.section->output_section->line_filepos - + s->u.syment.n_value * bfd_coff_linesz (bfd_ptr)); - coff_symbol_ptr->symbol.section = - coff_section_from_bfd_index (bfd_ptr, N_DEBUG); - BFD_ASSERT (coff_symbol_ptr->symbol.flags & BSF_DEBUGGING); - } - for (i = 0; i < s->u.syment.n_numaux; i++) - { - combined_entry_type *a = s + i + 1; - if (a->fix_tag) - { - a->u.auxent.x_sym.x_tagndx.l = - a->u.auxent.x_sym.x_tagndx.p->offset; - a->fix_tag = 0; - } - if (a->fix_end) - { - a->u.auxent.x_sym.x_fcnary.x_fcn.x_endndx.l = - a->u.auxent.x_sym.x_fcnary.x_fcn.x_endndx.p->offset; - a->fix_end = 0; - } - if (a->fix_scnlen) - { - a->u.auxent.x_csect.x_scnlen.l = - a->u.auxent.x_csect.x_scnlen.p->offset; - a->fix_scnlen = 0; - } - } - } - } -} - -static void -coff_fix_symbol_name (abfd, symbol, native, string_size_p, - debug_string_section_p, debug_string_size_p) - bfd *abfd; - asymbol *symbol; - combined_entry_type *native; - bfd_size_type *string_size_p; - asection **debug_string_section_p; - bfd_size_type *debug_string_size_p; -{ - unsigned int name_length; - union internal_auxent *auxent; - char *name = (char *) (symbol->name); - - if (name == (char *) NULL) - { - /* coff symbols always have names, so we'll make one up */ - symbol->name = "strange"; - name = (char *) symbol->name; - } - name_length = strlen (name); - - if (native->u.syment.n_sclass == C_FILE - && native->u.syment.n_numaux > 0) - { - strncpy (native->u.syment._n._n_name, ".file", SYMNMLEN); - auxent = &(native + 1)->u.auxent; - - if (bfd_coff_long_filenames (abfd)) - { - if (name_length <= FILNMLEN) - { - strncpy (auxent->x_file.x_fname, name, FILNMLEN); - } - else - { - auxent->x_file.x_n.x_offset = *string_size_p + STRING_SIZE_SIZE; - auxent->x_file.x_n.x_zeroes = 0; - *string_size_p += name_length + 1; - } - } - else - { - strncpy (auxent->x_file.x_fname, name, FILNMLEN); - if (name_length > FILNMLEN) - { - name[FILNMLEN] = '\0'; - } - } - } - else - { - if (name_length <= SYMNMLEN) - { - /* This name will fit into the symbol neatly */ - strncpy (native->u.syment._n._n_name, symbol->name, SYMNMLEN); - } - else if (!bfd_coff_symname_in_debug (abfd, &native->u.syment)) - { - native->u.syment._n._n_n._n_offset = (*string_size_p - + STRING_SIZE_SIZE); - native->u.syment._n._n_n._n_zeroes = 0; - *string_size_p += name_length + 1; - } - else - { - long filepos; - bfd_byte buf[2]; - - /* This name should be written into the .debug section. For - some reason each name is preceded by a two byte length - and also followed by a null byte. FIXME: We assume that - the .debug section has already been created, and that it - is large enough. */ - if (*debug_string_section_p == (asection *) NULL) - *debug_string_section_p = bfd_get_section_by_name (abfd, ".debug"); - filepos = bfd_tell (abfd); - bfd_put_16 (abfd, name_length + 1, buf); - if (!bfd_set_section_contents (abfd, - *debug_string_section_p, - (PTR) buf, - (file_ptr) *debug_string_size_p, - (bfd_size_type) 2) - || !bfd_set_section_contents (abfd, - *debug_string_section_p, - (PTR) symbol->name, - ((file_ptr) *debug_string_size_p - + 2), - (bfd_size_type) name_length + 1)) - abort (); - if (bfd_seek (abfd, filepos, SEEK_SET) != 0) - abort (); - native->u.syment._n._n_n._n_offset = *debug_string_size_p + 2; - native->u.syment._n._n_n._n_zeroes = 0; - *debug_string_size_p += name_length + 3; - } - } -} - -/* We need to keep track of the symbol index so that when we write out - the relocs we can get the index for a symbol. This method is a - hack. FIXME. */ - -#define set_index(symbol, idx) ((symbol)->udata.i = (idx)) - -/* Write a symbol out to a COFF file. */ - -static boolean -coff_write_symbol (abfd, symbol, native, written, string_size_p, - debug_string_section_p, debug_string_size_p) - bfd *abfd; - asymbol *symbol; - combined_entry_type *native; - unsigned int *written; - bfd_size_type *string_size_p; - asection **debug_string_section_p; - bfd_size_type *debug_string_size_p; -{ - unsigned int numaux = native->u.syment.n_numaux; - int type = native->u.syment.n_type; - int class = native->u.syment.n_sclass; - PTR buf; - bfd_size_type symesz; - - if (native->u.syment.n_sclass == C_FILE) - symbol->flags |= BSF_DEBUGGING; - - if (symbol->flags & BSF_DEBUGGING - && bfd_is_abs_section (symbol->section)) - { - native->u.syment.n_scnum = N_DEBUG; - } - else if (bfd_is_abs_section (symbol->section)) - { - native->u.syment.n_scnum = N_ABS; - } - else if (bfd_is_und_section (symbol->section)) - { - native->u.syment.n_scnum = N_UNDEF; - } - else - { - native->u.syment.n_scnum = - symbol->section->output_section->target_index; - } - - coff_fix_symbol_name (abfd, symbol, native, string_size_p, - debug_string_section_p, debug_string_size_p); - - symesz = bfd_coff_symesz (abfd); - buf = bfd_alloc (abfd, symesz); - if (!buf) - return false; - bfd_coff_swap_sym_out (abfd, &native->u.syment, buf); - if (bfd_write (buf, 1, symesz, abfd) != symesz) - return false; - bfd_release (abfd, buf); - - if (native->u.syment.n_numaux > 0) - { - bfd_size_type auxesz; - unsigned int j; - - auxesz = bfd_coff_auxesz (abfd); - buf = bfd_alloc (abfd, auxesz); - if (!buf) - return false; - for (j = 0; j < native->u.syment.n_numaux; j++) - { - bfd_coff_swap_aux_out (abfd, - &((native + j + 1)->u.auxent), - type, - class, - j, - native->u.syment.n_numaux, - buf); - if (bfd_write (buf, 1, auxesz, abfd) != auxesz) - return false; - } - bfd_release (abfd, buf); - } - - /* Store the index for use when we write out the relocs. */ - set_index (symbol, *written); - - *written += numaux + 1; - return true; -} - -/* Write out a symbol to a COFF file that does not come from a COFF - file originally. This symbol may have been created by the linker, - or we may be linking a non COFF file to a COFF file. */ - -static boolean -coff_write_alien_symbol (abfd, symbol, written, string_size_p, - debug_string_section_p, debug_string_size_p) - bfd *abfd; - asymbol *symbol; - unsigned int *written; - bfd_size_type *string_size_p; - asection **debug_string_section_p; - bfd_size_type *debug_string_size_p; -{ - combined_entry_type *native; - combined_entry_type dummy; - - native = &dummy; - native->u.syment.n_type = T_NULL; - native->u.syment.n_flags = 0; - if (bfd_is_und_section (symbol->section)) - { - native->u.syment.n_scnum = N_UNDEF; - native->u.syment.n_value = symbol->value; - } - else if (bfd_is_com_section (symbol->section)) - { - native->u.syment.n_scnum = N_UNDEF; - native->u.syment.n_value = symbol->value; - } - else if (symbol->flags & BSF_DEBUGGING) - { - /* There isn't much point to writing out a debugging symbol - unless we are prepared to convert it into COFF debugging - format. So, we just ignore them. We must clobber the symbol - name to keep it from being put in the string table. */ - symbol->name = ""; - return true; - } - else - { - native->u.syment.n_scnum = - symbol->section->output_section->target_index; - native->u.syment.n_value = (symbol->value - + symbol->section->output_section->vma - + symbol->section->output_offset); - - /* Copy the any flags from the the file header into the symbol. - FIXME: Why? */ - { - coff_symbol_type *c = coff_symbol_from (abfd, symbol); - if (c != (coff_symbol_type *) NULL) - native->u.syment.n_flags = bfd_asymbol_bfd (&c->symbol)->flags; - } - } - - native->u.syment.n_type = 0; - if (symbol->flags & BSF_LOCAL) - native->u.syment.n_sclass = C_STAT; - else - native->u.syment.n_sclass = C_EXT; - native->u.syment.n_numaux = 0; - - return coff_write_symbol (abfd, symbol, native, written, string_size_p, - debug_string_section_p, debug_string_size_p); -} - -/* Write a native symbol to a COFF file. */ - -static boolean -coff_write_native_symbol (abfd, symbol, written, string_size_p, - debug_string_section_p, debug_string_size_p) - bfd *abfd; - coff_symbol_type *symbol; - unsigned int *written; - bfd_size_type *string_size_p; - asection **debug_string_section_p; - bfd_size_type *debug_string_size_p; -{ - combined_entry_type *native = symbol->native; - alent *lineno = symbol->lineno; - - /* If this symbol has an associated line number, we must store the - symbol index in the line number field. We also tag the auxent to - point to the right place in the lineno table. */ - if (lineno && !symbol->done_lineno && symbol->symbol.section->owner != NULL) - { - unsigned int count = 0; - lineno[count].u.offset = *written; - if (native->u.syment.n_numaux) - { - union internal_auxent *a = &((native + 1)->u.auxent); - - a->x_sym.x_fcnary.x_fcn.x_lnnoptr = - symbol->symbol.section->output_section->moving_line_filepos; - } - - /* Count and relocate all other linenumbers. */ - count++; - while (lineno[count].line_number != 0) - { -#if 0 - /* 13 april 92. sac - I've been told this, but still need proof: - > The second bug is also in `bfd/coffcode.h'. This bug - > causes the linker to screw up the pc-relocations for - > all the line numbers in COFF code. This bug isn't only - > specific to A29K implementations, but affects all - > systems using COFF format binaries. Note that in COFF - > object files, the line number core offsets output by - > the assembler are relative to the start of each - > procedure, not to the start of the .text section. This - > patch relocates the line numbers relative to the - > `native->u.syment.n_value' instead of the section - > virtual address. - > modular!olson@cs.arizona.edu (Jon Olson) - */ - lineno[count].u.offset += native->u.syment.n_value; -#else - lineno[count].u.offset += - (symbol->symbol.section->output_section->vma - + symbol->symbol.section->output_offset); -#endif - count++; - } - symbol->done_lineno = true; - - symbol->symbol.section->output_section->moving_line_filepos += - count * bfd_coff_linesz (abfd); - } - - return coff_write_symbol (abfd, &(symbol->symbol), native, written, - string_size_p, debug_string_section_p, - debug_string_size_p); -} - -/* Write out the COFF symbols. */ - -boolean -coff_write_symbols (abfd) - bfd *abfd; -{ - bfd_size_type string_size; - asection *debug_string_section; - bfd_size_type debug_string_size; - unsigned int i; - unsigned int limit = bfd_get_symcount (abfd); - unsigned int written = 0; - asymbol **p; - - string_size = 0; - debug_string_section = NULL; - debug_string_size = 0; - - /* Seek to the right place */ - if (bfd_seek (abfd, obj_sym_filepos (abfd), SEEK_SET) != 0) - return false; - - /* Output all the symbols we have */ - - written = 0; - for (p = abfd->outsymbols, i = 0; i < limit; i++, p++) - { - asymbol *symbol = *p; - coff_symbol_type *c_symbol = coff_symbol_from (abfd, symbol); - - if (c_symbol == (coff_symbol_type *) NULL - || c_symbol->native == (combined_entry_type *) NULL) - { - if (!coff_write_alien_symbol (abfd, symbol, &written, &string_size, - &debug_string_section, - &debug_string_size)) - return false; - } - else - { - if (!coff_write_native_symbol (abfd, c_symbol, &written, - &string_size, &debug_string_section, - &debug_string_size)) - return false; - } - } - - obj_raw_syment_count (abfd) = written; - - /* Now write out strings */ - - if (string_size != 0) - { - unsigned int size = string_size + STRING_SIZE_SIZE; - bfd_byte buffer[STRING_SIZE_SIZE]; - -#if STRING_SIZE_SIZE == 4 - bfd_h_put_32 (abfd, size, buffer); -#else - #error Change bfd_h_put_32 -#endif - if (bfd_write ((PTR) buffer, 1, sizeof (buffer), abfd) != sizeof (buffer)) - return false; - for (p = abfd->outsymbols, i = 0; - i < limit; - i++, p++) - { - asymbol *q = *p; - size_t name_length = strlen (q->name); - coff_symbol_type *c_symbol = coff_symbol_from (abfd, q); - size_t maxlen; - - /* Figure out whether the symbol name should go in the string - table. Symbol names that are short enough are stored - directly in the syment structure. File names permit a - different, longer, length in the syment structure. On - XCOFF, some symbol names are stored in the .debug section - rather than in the string table. */ - - if (c_symbol == NULL - || c_symbol->native == NULL) - { - /* This is not a COFF symbol, so it certainly is not a - file name, nor does it go in the .debug section. */ - maxlen = SYMNMLEN; - } - else if (bfd_coff_symname_in_debug (abfd, - &c_symbol->native->u.syment)) - { - /* This symbol name is in the XCOFF .debug section. - Don't write it into the string table. */ - maxlen = name_length; - } - else if (c_symbol->native->u.syment.n_sclass == C_FILE - && c_symbol->native->u.syment.n_numaux > 0) - maxlen = FILNMLEN; - else - maxlen = SYMNMLEN; - - if (name_length > maxlen) - { - if (bfd_write ((PTR) (q->name), 1, name_length + 1, abfd) - != name_length + 1) - return false; - } - } - } - else - { - /* We would normally not write anything here, but we'll write - out 4 so that any stupid coff reader which tries to read the - string table even when there isn't one won't croak. */ - unsigned int size = STRING_SIZE_SIZE; - bfd_byte buffer[STRING_SIZE_SIZE]; - -#if STRING_SIZE_SIZE == 4 - bfd_h_put_32 (abfd, size, buffer); -#else - #error Change bfd_h_put_32 -#endif - if (bfd_write ((PTR) buffer, 1, STRING_SIZE_SIZE, abfd) - != STRING_SIZE_SIZE) - return false; - } - - /* Make sure the .debug section was created to be the correct size. - We should create it ourselves on the fly, but we don't because - BFD won't let us write to any section until we know how large all - the sections are. We could still do it by making another pass - over the symbols. FIXME. */ - BFD_ASSERT (debug_string_size == 0 - || (debug_string_section != (asection *) NULL - && (BFD_ALIGN (debug_string_size, - 1 << debug_string_section->alignment_power) - == bfd_section_size (abfd, debug_string_section)))); - - return true; -} - -boolean -coff_write_linenumbers (abfd) - bfd *abfd; -{ - asection *s; - bfd_size_type linesz; - PTR buff; - - linesz = bfd_coff_linesz (abfd); - buff = bfd_alloc (abfd, linesz); - if (!buff) - return false; - for (s = abfd->sections; s != (asection *) NULL; s = s->next) - { - if (s->lineno_count) - { - asymbol **q = abfd->outsymbols; - if (bfd_seek (abfd, s->line_filepos, SEEK_SET) != 0) - return false; - /* Find all the linenumbers in this section */ - while (*q) - { - asymbol *p = *q; - if (p->section->output_section == s) - { - alent *l = - BFD_SEND (bfd_asymbol_bfd (p), _get_lineno, - (bfd_asymbol_bfd (p), p)); - if (l) - { - /* Found a linenumber entry, output */ - struct internal_lineno out; - memset ((PTR) & out, 0, sizeof (out)); - out.l_lnno = 0; - out.l_addr.l_symndx = l->u.offset; - bfd_coff_swap_lineno_out (abfd, &out, buff); - if (bfd_write (buff, 1, linesz, abfd) != linesz) - return false; - l++; - while (l->line_number) - { - out.l_lnno = l->line_number; - out.l_addr.l_symndx = l->u.offset; - bfd_coff_swap_lineno_out (abfd, &out, buff); - if (bfd_write (buff, 1, linesz, abfd) != linesz) - return false; - l++; - } - } - } - q++; - } - } - } - bfd_release (abfd, buff); - return true; -} - -/*ARGSUSED */ -alent * -coff_get_lineno (ignore_abfd, symbol) - bfd *ignore_abfd; - asymbol *symbol; -{ - return coffsymbol (symbol)->lineno; -} - -#if 0 - -/* This is only called from coff_add_missing_symbols, which has been - disabled. */ - -asymbol * -coff_section_symbol (abfd, name) - bfd *abfd; - char *name; -{ - asection *sec = bfd_make_section_old_way (abfd, name); - asymbol *sym; - combined_entry_type *csym; - - sym = sec->symbol; - csym = coff_symbol_from (abfd, sym)->native; - /* Make sure back-end COFF stuff is there. */ - if (csym == 0) - { - struct foo - { - coff_symbol_type sym; - /* @@FIXME This shouldn't use a fixed size!! */ - combined_entry_type e[10]; - }; - struct foo *f; - f = (struct foo *) bfd_alloc_by_size_t (abfd, sizeof (*f)); - if (!f) - { - bfd_set_error (bfd_error_no_error); - return NULL; - } - memset ((char *) f, 0, sizeof (*f)); - coff_symbol_from (abfd, sym)->native = csym = f->e; - } - csym[0].u.syment.n_sclass = C_STAT; - csym[0].u.syment.n_numaux = 1; -/* SF_SET_STATICS (sym); @@ ??? */ - csym[1].u.auxent.x_scn.x_scnlen = sec->_raw_size; - csym[1].u.auxent.x_scn.x_nreloc = sec->reloc_count; - csym[1].u.auxent.x_scn.x_nlinno = sec->lineno_count; - - if (sec->output_section == NULL) - { - sec->output_section = sec; - sec->output_offset = 0; - } - - return sym; -} - -#endif /* 0 */ - -/* This function transforms the offsets into the symbol table into - pointers to syments. */ - -static void -coff_pointerize_aux (abfd, table_base, symbol, indaux, auxent) - bfd *abfd; - combined_entry_type *table_base; - combined_entry_type *symbol; - unsigned int indaux; - combined_entry_type *auxent; -{ - int type = symbol->u.syment.n_type; - int class = symbol->u.syment.n_sclass; - - if (coff_backend_info (abfd)->_bfd_coff_pointerize_aux_hook) - { - if ((*coff_backend_info (abfd)->_bfd_coff_pointerize_aux_hook) - (abfd, table_base, symbol, indaux, auxent)) - return; - } - - /* Don't bother if this is a file or a section */ - if (class == C_STAT && type == T_NULL) - return; - if (class == C_FILE) - return; - - /* Otherwise patch up */ -#define N_TMASK coff_data (abfd)->local_n_tmask -#define N_BTSHFT coff_data (abfd)->local_n_btshft - if ((ISFCN (type) || ISTAG (class) || class == C_BLOCK) - && auxent->u.auxent.x_sym.x_fcnary.x_fcn.x_endndx.l > 0) - { - auxent->u.auxent.x_sym.x_fcnary.x_fcn.x_endndx.p = - table_base + auxent->u.auxent.x_sym.x_fcnary.x_fcn.x_endndx.l; - auxent->fix_end = 1; - } - /* A negative tagndx is meaningless, but the SCO 3.2v4 cc can - generate one, so we must be careful to ignore it. */ - if (auxent->u.auxent.x_sym.x_tagndx.l > 0) - { - auxent->u.auxent.x_sym.x_tagndx.p = - table_base + auxent->u.auxent.x_sym.x_tagndx.l; - auxent->fix_tag = 1; - } -} - -/* Allocate space for the ".debug" section, and read it. - We did not read the debug section until now, because - we didn't want to go to the trouble until someone needed it. */ - -static char * -build_debug_section (abfd) - bfd *abfd; -{ - char *debug_section; - long position; - - asection *sect = bfd_get_section_by_name (abfd, ".debug"); - - if (!sect) - { - bfd_set_error (bfd_error_no_debug_section); - return NULL; - } - - debug_section = (PTR) bfd_alloc (abfd, - bfd_get_section_size_before_reloc (sect)); - if (debug_section == NULL) - return NULL; - - /* Seek to the beginning of the `.debug' section and read it. - Save the current position first; it is needed by our caller. - Then read debug section and reset the file pointer. */ - - position = bfd_tell (abfd); - if (bfd_seek (abfd, sect->filepos, SEEK_SET) != 0 - || (bfd_read (debug_section, - bfd_get_section_size_before_reloc (sect), 1, abfd) - != bfd_get_section_size_before_reloc (sect)) - || bfd_seek (abfd, position, SEEK_SET) != 0) - return NULL; - return debug_section; -} - - -/* Return a pointer to a malloc'd copy of 'name'. 'name' may not be - \0-terminated, but will not exceed 'maxlen' characters. The copy *will* - be \0-terminated. */ -static char * -copy_name (abfd, name, maxlen) - bfd *abfd; - char *name; - int maxlen; -{ - int len; - char *newname; - - for (len = 0; len < maxlen; ++len) - { - if (name[len] == '\0') - { - break; - } - } - - if ((newname = (PTR) bfd_alloc (abfd, len + 1)) == NULL) - return (NULL); - strncpy (newname, name, len); - newname[len] = '\0'; - return newname; -} - -/* Read in the external symbols. */ - -boolean -_bfd_coff_get_external_symbols (abfd) - bfd *abfd; -{ - bfd_size_type symesz; - size_t size; - PTR syms; - - if (obj_coff_external_syms (abfd) != NULL) - return true; - - symesz = bfd_coff_symesz (abfd); - - size = obj_raw_syment_count (abfd) * symesz; - - syms = (PTR) bfd_malloc (size); - if (syms == NULL && size != 0) - return false; - - if (bfd_seek (abfd, obj_sym_filepos (abfd), SEEK_SET) != 0 - || bfd_read (syms, size, 1, abfd) != size) - { - if (syms != NULL) - free (syms); - return false; - } - - obj_coff_external_syms (abfd) = syms; - - return true; -} - -/* Read in the external strings. The strings are not loaded until - they are needed. This is because we have no simple way of - detecting a missing string table in an archive. */ - -const char * -_bfd_coff_read_string_table (abfd) - bfd *abfd; -{ - char extstrsize[STRING_SIZE_SIZE]; - size_t strsize; - char *strings; - - if (obj_coff_strings (abfd) != NULL) - return obj_coff_strings (abfd); - - if (bfd_seek (abfd, - (obj_sym_filepos (abfd) - + obj_raw_syment_count (abfd) * bfd_coff_symesz (abfd)), - SEEK_SET) != 0) - return NULL; - - if (bfd_read (extstrsize, sizeof extstrsize, 1, abfd) != sizeof extstrsize) - { - if (bfd_get_error () != bfd_error_file_truncated) - return NULL; - - /* There is no string table. */ - strsize = STRING_SIZE_SIZE; - } - else - { -#if STRING_SIZE_SIZE == 4 - strsize = bfd_h_get_32 (abfd, (bfd_byte *) extstrsize); -#else - #error Change bfd_h_get_32 -#endif - } - - if (strsize < STRING_SIZE_SIZE) - { - (*_bfd_error_handler) - ("%s: bad string table size %lu", bfd_get_filename (abfd), - (unsigned long) strsize); - bfd_set_error (bfd_error_bad_value); - return NULL; - } - - strings = (char *) bfd_malloc (strsize); - if (strings == NULL) - return NULL; - - if (bfd_read (strings + STRING_SIZE_SIZE, - strsize - STRING_SIZE_SIZE, 1, abfd) - != strsize - STRING_SIZE_SIZE) - { - free (strings); - return NULL; - } - - obj_coff_strings (abfd) = strings; - - return strings; -} - -/* Free up the external symbols and strings read from a COFF file. */ - -boolean -_bfd_coff_free_symbols (abfd) - bfd *abfd; -{ - if (obj_coff_external_syms (abfd) != NULL - && ! obj_coff_keep_syms (abfd)) - { - free (obj_coff_external_syms (abfd)); - obj_coff_external_syms (abfd) = NULL; - } - if (obj_coff_strings (abfd) != NULL - && ! obj_coff_keep_strings (abfd)) - { - free (obj_coff_strings (abfd)); - obj_coff_strings (abfd) = NULL; - } - return true; -} - -/* Read a symbol table into freshly bfd_allocated memory, swap it, and - knit the symbol names into a normalized form. By normalized here I - mean that all symbols have an n_offset pointer that points to a null- - terminated string. */ - -combined_entry_type * -coff_get_normalized_symtab (abfd) - bfd *abfd; -{ - combined_entry_type *internal; - combined_entry_type *internal_ptr; - combined_entry_type *symbol_ptr; - combined_entry_type *internal_end; - bfd_size_type symesz; - char *raw_src; - char *raw_end; - const char *string_table = NULL; - char *debug_section = NULL; - unsigned long size; - - if (obj_raw_syments (abfd) != NULL) - return obj_raw_syments (abfd); - - size = obj_raw_syment_count (abfd) * sizeof (combined_entry_type); - internal = (combined_entry_type *) bfd_zalloc (abfd, size); - if (internal == NULL && size != 0) - return NULL; - internal_end = internal + obj_raw_syment_count (abfd); - - if (! _bfd_coff_get_external_symbols (abfd)) - return NULL; - - raw_src = (char *) obj_coff_external_syms (abfd); - - /* mark the end of the symbols */ - symesz = bfd_coff_symesz (abfd); - raw_end = (char *) raw_src + obj_raw_syment_count (abfd) * symesz; - - /* FIXME SOMEDAY. A string table size of zero is very weird, but - probably possible. If one shows up, it will probably kill us. */ - - /* Swap all the raw entries */ - for (internal_ptr = internal; - raw_src < raw_end; - raw_src += symesz, internal_ptr++) - { - - unsigned int i; - bfd_coff_swap_sym_in (abfd, (PTR) raw_src, - (PTR) & internal_ptr->u.syment); - symbol_ptr = internal_ptr; - - for (i = 0; - i < symbol_ptr->u.syment.n_numaux; - i++) - { - internal_ptr++; - raw_src += symesz; - bfd_coff_swap_aux_in (abfd, (PTR) raw_src, - symbol_ptr->u.syment.n_type, - symbol_ptr->u.syment.n_sclass, - i, symbol_ptr->u.syment.n_numaux, - &(internal_ptr->u.auxent)); - coff_pointerize_aux (abfd, internal, symbol_ptr, i, - internal_ptr); - } - } - - /* Free the raw symbols, but not the strings (if we have them). */ - obj_coff_keep_strings (abfd) = true; - if (! _bfd_coff_free_symbols (abfd)) - return NULL; - - for (internal_ptr = internal; internal_ptr < internal_end; - internal_ptr++) - { - if (internal_ptr->u.syment.n_sclass == C_FILE - && internal_ptr->u.syment.n_numaux > 0) - { - /* make a file symbol point to the name in the auxent, since - the text ".file" is redundant */ - if ((internal_ptr + 1)->u.auxent.x_file.x_n.x_zeroes == 0) - { - /* the filename is a long one, point into the string table */ - if (string_table == NULL) - { - string_table = _bfd_coff_read_string_table (abfd); - if (string_table == NULL) - return NULL; - } - - internal_ptr->u.syment._n._n_n._n_offset = - ((long) - (string_table - + (internal_ptr + 1)->u.auxent.x_file.x_n.x_offset)); - } - else - { - /* ordinary short filename, put into memory anyway */ - internal_ptr->u.syment._n._n_n._n_offset = (long) - copy_name (abfd, (internal_ptr + 1)->u.auxent.x_file.x_fname, - FILNMLEN); - } - } - else - { - if (internal_ptr->u.syment._n._n_n._n_zeroes != 0) - { - /* This is a "short" name. Make it long. */ - unsigned long i = 0; - char *newstring = NULL; - - /* find the length of this string without walking into memory - that isn't ours. */ - for (i = 0; i < 8; ++i) - { - if (internal_ptr->u.syment._n._n_name[i] == '\0') - { - break; - } /* if end of string */ - } /* possible lengths of this string. */ - - if ((newstring = (PTR) bfd_alloc (abfd, ++i)) == NULL) - return (NULL); - memset (newstring, 0, i); - strncpy (newstring, internal_ptr->u.syment._n._n_name, i - 1); - internal_ptr->u.syment._n._n_n._n_offset = (long int) newstring; - internal_ptr->u.syment._n._n_n._n_zeroes = 0; - } - else if (internal_ptr->u.syment._n._n_n._n_offset == 0) - internal_ptr->u.syment._n._n_n._n_offset = (long int) ""; - else if (!bfd_coff_symname_in_debug (abfd, &internal_ptr->u.syment)) - { - /* Long name already. Point symbol at the string in the - table. */ - if (string_table == NULL) - { - string_table = _bfd_coff_read_string_table (abfd); - if (string_table == NULL) - return NULL; - } - internal_ptr->u.syment._n._n_n._n_offset = - ((long int) - (string_table - + internal_ptr->u.syment._n._n_n._n_offset)); - } - else - { - /* Long name in debug section. Very similar. */ - if (debug_section == NULL) - debug_section = build_debug_section (abfd); - internal_ptr->u.syment._n._n_n._n_offset = (long int) - (debug_section + internal_ptr->u.syment._n._n_n._n_offset); - } - } - internal_ptr += internal_ptr->u.syment.n_numaux; - } - - obj_raw_syments (abfd) = internal; - BFD_ASSERT (obj_raw_syment_count (abfd) - == (unsigned int) (internal_ptr - internal)); - - return (internal); -} /* coff_get_normalized_symtab() */ - -long -coff_get_reloc_upper_bound (abfd, asect) - bfd *abfd; - sec_ptr asect; -{ - if (bfd_get_format (abfd) != bfd_object) - { - bfd_set_error (bfd_error_invalid_operation); - return -1; - } - return (asect->reloc_count + 1) * sizeof (arelent *); -} - -asymbol * -coff_make_empty_symbol (abfd) - bfd *abfd; -{ - coff_symbol_type *new = (coff_symbol_type *) bfd_alloc (abfd, sizeof (coff_symbol_type)); - if (new == NULL) - return (NULL); - memset (new, 0, sizeof *new); - new->symbol.section = 0; - new->native = 0; - new->lineno = (alent *) NULL; - new->done_lineno = false; - new->symbol.the_bfd = abfd; - return &new->symbol; -} - -/* Make a debugging symbol. */ - -asymbol * -coff_bfd_make_debug_symbol (abfd, ptr, sz) - bfd *abfd; - PTR ptr; - unsigned long sz; -{ - coff_symbol_type *new = (coff_symbol_type *) bfd_alloc (abfd, sizeof (coff_symbol_type)); - if (new == NULL) - return (NULL); - /* @@ This shouldn't be using a constant multiplier. */ - new->native = (combined_entry_type *) bfd_zalloc (abfd, sizeof (combined_entry_type) * 10); - if (!new->native) - return (NULL); - new->symbol.section = bfd_abs_section_ptr; - new->symbol.flags = BSF_DEBUGGING; - new->lineno = (alent *) NULL; - new->done_lineno = false; - new->symbol.the_bfd = abfd; - return &new->symbol; -} - -/*ARGSUSED */ -void -coff_get_symbol_info (abfd, symbol, ret) - bfd *abfd; - asymbol *symbol; - symbol_info *ret; -{ - bfd_symbol_info (symbol, ret); - if (coffsymbol (symbol)->native != NULL - && coffsymbol (symbol)->native->fix_value) - { - combined_entry_type *psym; - - psym = ((combined_entry_type *) - coffsymbol (symbol)->native->u.syment.n_value); - ret->value = (bfd_vma) (psym - obj_raw_syments (abfd)); - } -} - -/* Print out information about COFF symbol. */ - -void -coff_print_symbol (abfd, filep, symbol, how) - bfd *abfd; - PTR filep; - asymbol *symbol; - bfd_print_symbol_type how; -{ - FILE *file = (FILE *) filep; - - switch (how) - { - case bfd_print_symbol_name: - fprintf (file, "%s", symbol->name); - break; - - case bfd_print_symbol_more: - fprintf (file, "coff %s %s", - coffsymbol (symbol)->native ? "n" : "g", - coffsymbol (symbol)->lineno ? "l" : " "); - break; - - case bfd_print_symbol_all: - if (coffsymbol (symbol)->native) - { - unsigned long val; - unsigned int aux; - combined_entry_type *combined = coffsymbol (symbol)->native; - combined_entry_type *root = obj_raw_syments (abfd); - struct lineno_cache_entry *l = coffsymbol (symbol)->lineno; - - fprintf (file, "[%3ld]", (long) (combined - root)); - - if (! combined->fix_value) - val = (unsigned long) combined->u.syment.n_value; - else - val = ((unsigned long) - ((combined_entry_type *) combined->u.syment.n_value - - root)); - - fprintf (file, - "(sec %2d)(fl 0x%02x)(ty %3x)(scl %3d) (nx %d) 0x%08lx %s", - combined->u.syment.n_scnum, - combined->u.syment.n_flags, - combined->u.syment.n_type, - combined->u.syment.n_sclass, - combined->u.syment.n_numaux, - val, - symbol->name); - - for (aux = 0; aux < combined->u.syment.n_numaux; aux++) - { - combined_entry_type *auxp = combined + aux + 1; - long tagndx; - - if (auxp->fix_tag) - tagndx = auxp->u.auxent.x_sym.x_tagndx.p - root; - else - tagndx = auxp->u.auxent.x_sym.x_tagndx.l; - - fprintf (file, "\n"); - - if (bfd_coff_print_aux (abfd, file, root, combined, auxp, aux)) - continue; - - switch (combined->u.syment.n_sclass) - { - case C_FILE: - fprintf (file, "File "); - break; - - case C_STAT: - if (combined->u.syment.n_type == T_NULL) - /* probably a section symbol? */ - { - fprintf (file, "AUX scnlen 0x%lx nreloc %d nlnno %d", - (long) auxp->u.auxent.x_scn.x_scnlen, - auxp->u.auxent.x_scn.x_nreloc, - auxp->u.auxent.x_scn.x_nlinno); - break; - } - /* else fall through */ - - default: - fprintf (file, "AUX lnno %d size 0x%x tagndx %ld", - auxp->u.auxent.x_sym.x_misc.x_lnsz.x_lnno, - auxp->u.auxent.x_sym.x_misc.x_lnsz.x_size, - tagndx); - if (auxp->fix_end) - fprintf (file, " endndx %ld", - ((long) - (auxp->u.auxent.x_sym.x_fcnary.x_fcn.x_endndx.p - - root))); - break; - } - } - - if (l) - { - fprintf (file, "\n%s :", l->u.sym->name); - l++; - while (l->line_number) - { - fprintf (file, "\n%4d : 0x%lx", - l->line_number, - ((unsigned long) - (l->u.offset + symbol->section->vma))); - l++; - } - } - } - else - { - bfd_print_symbol_vandf ((PTR) file, symbol); - fprintf (file, " %-5s %s %s %s", - symbol->section->name, - coffsymbol (symbol)->native ? "n" : "g", - coffsymbol (symbol)->lineno ? "l" : " ", - symbol->name); - } - } -} - -/* Provided a BFD, a section and an offset into the section, calculate - and return the name of the source file and the line nearest to the - wanted location. */ - -/*ARGSUSED*/ -boolean -coff_find_nearest_line (abfd, section, symbols, offset, filename_ptr, - functionname_ptr, line_ptr) - bfd *abfd; - asection *section; - asymbol **symbols; - bfd_vma offset; - CONST char **filename_ptr; - CONST char **functionname_ptr; - unsigned int *line_ptr; -{ - boolean found; - unsigned int i; - unsigned int line_base; - coff_data_type *cof = coff_data (abfd); - /* Run through the raw syments if available */ - combined_entry_type *p; - combined_entry_type *pend; - alent *l; - struct coff_section_tdata *sec_data; - - /* Before looking through the symbol table, try to use a .stab - section to find the information. */ - if (! _bfd_stab_section_find_nearest_line (abfd, symbols, section, offset, - &found, filename_ptr, - functionname_ptr, line_ptr, - &coff_data (abfd)->line_info)) - return false; - if (found) - return true; - - *filename_ptr = 0; - *functionname_ptr = 0; - *line_ptr = 0; - - /* Don't try and find line numbers in a non coff file */ - if (abfd->xvec->flavour != bfd_target_coff_flavour) - return false; - - if (cof == NULL) - return false; - - /* Find the first C_FILE symbol. */ - p = cof->raw_syments; - pend = p + cof->raw_syment_count; - while (p < pend) - { - if (p->u.syment.n_sclass == C_FILE) - break; - p += 1 + p->u.syment.n_numaux; - } - - if (p < pend) - { - bfd_vma maxdiff; - - /* Look through the C_FILE symbols to find the best one. */ - *filename_ptr = (char *) p->u.syment._n._n_n._n_offset; - maxdiff = (bfd_vma) 0 - (bfd_vma) 1; - while (1) - { - combined_entry_type *p2; - - for (p2 = p + 1 + p->u.syment.n_numaux; - p2 < pend; - p2 += 1 + p2->u.syment.n_numaux) - { - if (p2->u.syment.n_scnum > 0 - && (section - == coff_section_from_bfd_index (abfd, - p2->u.syment.n_scnum))) - break; - if (p2->u.syment.n_sclass == C_FILE) - { - p2 = pend; - break; - } - } - - if (p2 < pend - && offset >= (bfd_vma) p2->u.syment.n_value - && offset - (bfd_vma) p2->u.syment.n_value < maxdiff) - { - *filename_ptr = (char *) p->u.syment._n._n_n._n_offset; - maxdiff = offset - p2->u.syment.n_value; - } - - /* Avoid endless loops on erroneous files by ensuring that - we always move forward in the file. */ - if (p - cof->raw_syments >= p->u.syment.n_value) - break; - - p = cof->raw_syments + p->u.syment.n_value; - if (p > pend || p->u.syment.n_sclass != C_FILE) - break; - } - } - - /* Now wander though the raw linenumbers of the section */ - /* If we have been called on this section before, and the offset we - want is further down then we can prime the lookup loop. */ - sec_data = coff_section_data (abfd, section); - if (sec_data != NULL - && sec_data->i > 0 - && offset >= sec_data->offset) - { - i = sec_data->i; - *functionname_ptr = sec_data->function; - line_base = sec_data->line_base; - } - else - { - i = 0; - line_base = 0; - } - - if (section->lineno != NULL) - { - l = §ion->lineno[i]; - - for (; i < section->lineno_count; i++) - { - if (l->line_number == 0) - { - /* Get the symbol this line number points at */ - coff_symbol_type *coff = (coff_symbol_type *) (l->u.sym); - if (coff->symbol.value > offset) - break; - *functionname_ptr = coff->symbol.name; - if (coff->native) - { - combined_entry_type *s = coff->native; - s = s + 1 + s->u.syment.n_numaux; - - /* In XCOFF a debugging symbol can follow the - function symbol. */ - if (s->u.syment.n_scnum == N_DEBUG) - s = s + 1 + s->u.syment.n_numaux; - - /* S should now point to the .bf of the function. */ - if (s->u.syment.n_numaux) - { - /* The linenumber is stored in the auxent. */ - union internal_auxent *a = &((s + 1)->u.auxent); - line_base = a->x_sym.x_misc.x_lnsz.x_lnno; - *line_ptr = line_base; - } - } - } - else - { - if (l->u.offset + bfd_get_section_vma (abfd, section) > offset) - break; - *line_ptr = l->line_number + line_base - 1; - } - l++; - } - } - - /* Cache the results for the next call. */ - if (sec_data == NULL && section->owner == abfd) - { - section->used_by_bfd = - ((PTR) bfd_zalloc (abfd, - sizeof (struct coff_section_tdata))); - sec_data = (struct coff_section_tdata *) section->used_by_bfd; - } - if (sec_data != NULL) - { - sec_data->offset = offset; - sec_data->i = i; - sec_data->function = *functionname_ptr; - sec_data->line_base = line_base; - } - - return true; -} - -int -coff_sizeof_headers (abfd, reloc) - bfd *abfd; - boolean reloc; -{ - size_t size; - - if (reloc == false) - { - size = bfd_coff_filhsz (abfd) + bfd_coff_aoutsz (abfd); - } - else - { - size = bfd_coff_filhsz (abfd); - } - - size += abfd->section_count * bfd_coff_scnhsz (abfd); - return size; -} diff --git a/contrib/gdb/bfd/cofflink.c b/contrib/gdb/bfd/cofflink.c deleted file mode 100644 index c4a42a0914782..0000000000000 --- a/contrib/gdb/bfd/cofflink.c +++ /dev/null @@ -1,2327 +0,0 @@ -/* COFF specific linker code. - Copyright 1994, 1995, 1996 Free Software Foundation, Inc. - Written by Ian Lance Taylor, Cygnus Support. - -This file is part of BFD, the Binary File Descriptor library. - -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 2 of the License, 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ - -/* This file contains the COFF backend linker code. */ - -#include "bfd.h" -#include "sysdep.h" -#include "bfdlink.h" -#include "libbfd.h" -#include "coff/internal.h" -#include "libcoff.h" - -static boolean coff_link_add_object_symbols - PARAMS ((bfd *, struct bfd_link_info *)); -static boolean coff_link_check_archive_element - PARAMS ((bfd *, struct bfd_link_info *, boolean *)); -static boolean coff_link_check_ar_symbols - PARAMS ((bfd *, struct bfd_link_info *, boolean *)); -static boolean coff_link_add_symbols PARAMS ((bfd *, struct bfd_link_info *)); - -/* Create an entry in a COFF linker hash table. */ - -struct bfd_hash_entry * -_bfd_coff_link_hash_newfunc (entry, table, string) - struct bfd_hash_entry *entry; - struct bfd_hash_table *table; - const char *string; -{ - struct coff_link_hash_entry *ret = (struct coff_link_hash_entry *) entry; - - /* Allocate the structure if it has not already been allocated by a - subclass. */ - if (ret == (struct coff_link_hash_entry *) NULL) - ret = ((struct coff_link_hash_entry *) - bfd_hash_allocate (table, sizeof (struct coff_link_hash_entry))); - if (ret == (struct coff_link_hash_entry *) NULL) - return (struct bfd_hash_entry *) ret; - - /* Call the allocation method of the superclass. */ - ret = ((struct coff_link_hash_entry *) - _bfd_link_hash_newfunc ((struct bfd_hash_entry *) ret, - table, string)); - if (ret != (struct coff_link_hash_entry *) NULL) - { - /* Set local fields. */ - ret->indx = -1; - ret->type = T_NULL; - ret->class = C_NULL; - ret->numaux = 0; - ret->auxbfd = NULL; - ret->aux = NULL; - } - - return (struct bfd_hash_entry *) ret; -} - -/* Initialize a COFF linker hash table. */ - -boolean -_bfd_coff_link_hash_table_init (table, abfd, newfunc) - struct coff_link_hash_table *table; - bfd *abfd; - struct bfd_hash_entry *(*newfunc) PARAMS ((struct bfd_hash_entry *, - struct bfd_hash_table *, - const char *)); -{ - return _bfd_link_hash_table_init (&table->root, abfd, newfunc); -} - -/* Create a COFF linker hash table. */ - -struct bfd_link_hash_table * -_bfd_coff_link_hash_table_create (abfd) - bfd *abfd; -{ - struct coff_link_hash_table *ret; - - ret = ((struct coff_link_hash_table *) - bfd_alloc (abfd, sizeof (struct coff_link_hash_table))); - if (ret == NULL) - return NULL; - if (! _bfd_coff_link_hash_table_init (ret, abfd, - _bfd_coff_link_hash_newfunc)) - { - bfd_release (abfd, ret); - return (struct bfd_link_hash_table *) NULL; - } - return &ret->root; -} - -/* Create an entry in a COFF debug merge hash table. */ - -struct bfd_hash_entry * -_bfd_coff_debug_merge_hash_newfunc (entry, table, string) - struct bfd_hash_entry *entry; - struct bfd_hash_table *table; - const char *string; -{ - struct coff_debug_merge_hash_entry *ret = - (struct coff_debug_merge_hash_entry *) entry; - - /* Allocate the structure if it has not already been allocated by a - subclass. */ - if (ret == (struct coff_debug_merge_hash_entry *) NULL) - ret = ((struct coff_debug_merge_hash_entry *) - bfd_hash_allocate (table, - sizeof (struct coff_debug_merge_hash_entry))); - if (ret == (struct coff_debug_merge_hash_entry *) NULL) - return (struct bfd_hash_entry *) ret; - - /* Call the allocation method of the superclass. */ - ret = ((struct coff_debug_merge_hash_entry *) - bfd_hash_newfunc ((struct bfd_hash_entry *) ret, table, string)); - if (ret != (struct coff_debug_merge_hash_entry *) NULL) - { - /* Set local fields. */ - ret->types = NULL; - } - - return (struct bfd_hash_entry *) ret; -} - -/* Given a COFF BFD, add symbols to the global hash table as - appropriate. */ - -boolean -_bfd_coff_link_add_symbols (abfd, info) - bfd *abfd; - struct bfd_link_info *info; -{ - switch (bfd_get_format (abfd)) - { - case bfd_object: - return coff_link_add_object_symbols (abfd, info); - case bfd_archive: - return (_bfd_generic_link_add_archive_symbols - (abfd, info, coff_link_check_archive_element)); - default: - bfd_set_error (bfd_error_wrong_format); - return false; - } -} - -/* Add symbols from a COFF object file. */ - -static boolean -coff_link_add_object_symbols (abfd, info) - bfd *abfd; - struct bfd_link_info *info; -{ - if (! _bfd_coff_get_external_symbols (abfd)) - return false; - if (! coff_link_add_symbols (abfd, info)) - return false; - - if (! info->keep_memory) - { - if (! _bfd_coff_free_symbols (abfd)) - return false; - } - return true; -} - -/* Check a single archive element to see if we need to include it in - the link. *PNEEDED is set according to whether this element is - needed in the link or not. This is called via - _bfd_generic_link_add_archive_symbols. */ - -static boolean -coff_link_check_archive_element (abfd, info, pneeded) - bfd *abfd; - struct bfd_link_info *info; - boolean *pneeded; -{ - if (! _bfd_coff_get_external_symbols (abfd)) - return false; - - if (! coff_link_check_ar_symbols (abfd, info, pneeded)) - return false; - - if (*pneeded) - { - if (! coff_link_add_symbols (abfd, info)) - return false; - } - - if (! info->keep_memory || ! *pneeded) - { - if (! _bfd_coff_free_symbols (abfd)) - return false; - } - - return true; -} - -/* Look through the symbols to see if this object file should be - included in the link. */ - -static boolean -coff_link_check_ar_symbols (abfd, info, pneeded) - bfd *abfd; - struct bfd_link_info *info; - boolean *pneeded; -{ - boolean (*sym_is_global) PARAMS ((bfd *, struct internal_syment *)); - bfd_size_type symesz; - bfd_byte *esym; - bfd_byte *esym_end; - - *pneeded = false; - - sym_is_global = coff_backend_info (abfd)->_bfd_coff_sym_is_global; - - symesz = bfd_coff_symesz (abfd); - esym = (bfd_byte *) obj_coff_external_syms (abfd); - esym_end = esym + obj_raw_syment_count (abfd) * symesz; - while (esym < esym_end) - { - struct internal_syment sym; - - bfd_coff_swap_sym_in (abfd, (PTR) esym, (PTR) &sym); - - if ((sym.n_sclass == C_EXT - || (sym_is_global && (*sym_is_global) (abfd, &sym))) - && (sym.n_scnum != 0 || sym.n_value != 0)) - { - const char *name; - char buf[SYMNMLEN + 1]; - struct bfd_link_hash_entry *h; - - /* This symbol is externally visible, and is defined by this - object file. */ - - name = _bfd_coff_internal_syment_name (abfd, &sym, buf); - if (name == NULL) - return false; - h = bfd_link_hash_lookup (info->hash, name, false, false, true); - - /* We are only interested in symbols that are currently - undefined. If a symbol is currently known to be common, - COFF linkers do not bring in an object file which defines - it. */ - if (h != (struct bfd_link_hash_entry *) NULL - && h->type == bfd_link_hash_undefined) - { - if (! (*info->callbacks->add_archive_element) (info, abfd, name)) - return false; - *pneeded = true; - return true; - } - } - - esym += (sym.n_numaux + 1) * symesz; - } - - /* We do not need this object file. */ - return true; -} - -/* Add all the symbols from an object file to the hash table. */ - -static boolean -coff_link_add_symbols (abfd, info) - bfd *abfd; - struct bfd_link_info *info; -{ - boolean (*sym_is_global) PARAMS ((bfd *, struct internal_syment *)); - boolean default_copy; - bfd_size_type symcount; - struct coff_link_hash_entry **sym_hash; - bfd_size_type symesz; - bfd_byte *esym; - bfd_byte *esym_end; - - sym_is_global = coff_backend_info (abfd)->_bfd_coff_sym_is_global; - - if (info->keep_memory) - default_copy = false; - else - default_copy = true; - - symcount = obj_raw_syment_count (abfd); - - /* We keep a list of the linker hash table entries that correspond - to particular symbols. */ - sym_hash = ((struct coff_link_hash_entry **) - bfd_alloc (abfd, - ((size_t) symcount - * sizeof (struct coff_link_hash_entry *)))); - if (sym_hash == NULL && symcount != 0) - return false; - obj_coff_sym_hashes (abfd) = sym_hash; - memset (sym_hash, 0, - (size_t) symcount * sizeof (struct coff_link_hash_entry *)); - - symesz = bfd_coff_symesz (abfd); - BFD_ASSERT (symesz == bfd_coff_auxesz (abfd)); - esym = (bfd_byte *) obj_coff_external_syms (abfd); - esym_end = esym + symcount * symesz; - while (esym < esym_end) - { - struct internal_syment sym; - boolean copy; - - bfd_coff_swap_sym_in (abfd, (PTR) esym, (PTR) &sym); - - if (sym.n_sclass == C_EXT - || (sym_is_global && (*sym_is_global) (abfd, &sym))) - { - const char *name; - char buf[SYMNMLEN + 1]; - flagword flags; - asection *section; - bfd_vma value; - - /* This symbol is externally visible. */ - - name = _bfd_coff_internal_syment_name (abfd, &sym, buf); - if (name == NULL) - return false; - - /* We must copy the name into memory if we got it from the - syment itself, rather than the string table. */ - copy = default_copy; - if (sym._n._n_n._n_zeroes != 0 - || sym._n._n_n._n_offset == 0) - copy = true; - - value = sym.n_value; - - if (sym.n_scnum == 0) - { - if (value == 0) - { - flags = 0; - section = bfd_und_section_ptr; - } - else - { - flags = BSF_GLOBAL; - section = bfd_com_section_ptr; - } - } - else - { - flags = BSF_EXPORT | BSF_GLOBAL; - section = coff_section_from_bfd_index (abfd, sym.n_scnum); - value -= section->vma; - } - - if (! (bfd_coff_link_add_one_symbol - (info, abfd, name, flags, section, value, - (const char *) NULL, copy, false, - (struct bfd_link_hash_entry **) sym_hash))) - return false; - - if (info->hash->creator->flavour == bfd_get_flavour (abfd)) - { - if (((*sym_hash)->class == C_NULL - && (*sym_hash)->type == T_NULL) - || sym.n_scnum != 0 - || (sym.n_value != 0 - && (*sym_hash)->root.type != bfd_link_hash_defined)) - { - (*sym_hash)->class = sym.n_sclass; - (*sym_hash)->type = sym.n_type; - (*sym_hash)->numaux = sym.n_numaux; - (*sym_hash)->auxbfd = abfd; - if (sym.n_numaux != 0) - { - union internal_auxent *alloc; - unsigned int i; - bfd_byte *eaux; - union internal_auxent *iaux; - - alloc = ((union internal_auxent *) - bfd_hash_allocate (&info->hash->table, - (sym.n_numaux - * sizeof (*alloc)))); - if (alloc == NULL) - return false; - for (i = 0, eaux = esym + symesz, iaux = alloc; - i < sym.n_numaux; - i++, eaux += symesz, iaux++) - bfd_coff_swap_aux_in (abfd, (PTR) eaux, sym.n_type, - sym.n_sclass, i, sym.n_numaux, - (PTR) iaux); - (*sym_hash)->aux = alloc; - } - } - } - } - - esym += (sym.n_numaux + 1) * symesz; - sym_hash += sym.n_numaux + 1; - } - - return true; -} - -/* Do the final link step. */ - -boolean -_bfd_coff_final_link (abfd, info) - bfd *abfd; - struct bfd_link_info *info; -{ - bfd_size_type symesz; - struct coff_final_link_info finfo; - boolean debug_merge_allocated; - asection *o; - struct bfd_link_order *p; - size_t max_sym_count; - size_t max_lineno_count; - size_t max_reloc_count; - size_t max_output_reloc_count; - size_t max_contents_size; - file_ptr rel_filepos; - unsigned int relsz; - file_ptr line_filepos; - unsigned int linesz; - bfd *sub; - bfd_byte *external_relocs = NULL; - char strbuf[STRING_SIZE_SIZE]; - - symesz = bfd_coff_symesz (abfd); - - finfo.info = info; - finfo.output_bfd = abfd; - finfo.strtab = NULL; - finfo.section_info = NULL; - finfo.last_file_index = -1; - finfo.internal_syms = NULL; - finfo.sec_ptrs = NULL; - finfo.sym_indices = NULL; - finfo.outsyms = NULL; - finfo.linenos = NULL; - finfo.contents = NULL; - finfo.external_relocs = NULL; - finfo.internal_relocs = NULL; - debug_merge_allocated = false; - - coff_data (abfd)->link_info = info; - - finfo.strtab = _bfd_stringtab_init (); - if (finfo.strtab == NULL) - goto error_return; - - if (! coff_debug_merge_hash_table_init (&finfo.debug_merge)) - goto error_return; - debug_merge_allocated = true; - - /* Compute the file positions for all the sections. */ - if (! abfd->output_has_begun) - bfd_coff_compute_section_file_positions (abfd); - - /* Count the line numbers and relocation entries required for the - output file. Set the file positions for the relocs. */ - rel_filepos = obj_relocbase (abfd); - relsz = bfd_coff_relsz (abfd); - max_contents_size = 0; - max_lineno_count = 0; - max_reloc_count = 0; - - for (o = abfd->sections; o != NULL; o = o->next) - { - o->reloc_count = 0; - o->lineno_count = 0; - for (p = o->link_order_head; p != NULL; p = p->next) - { - - if (p->type == bfd_indirect_link_order) - { - asection *sec; - - sec = p->u.indirect.section; - - if (info->strip == strip_none - || info->strip == strip_some) - o->lineno_count += sec->lineno_count; - - if (info->relocateable) - o->reloc_count += sec->reloc_count; - - if (sec->_raw_size > max_contents_size) - max_contents_size = sec->_raw_size; - if (sec->lineno_count > max_lineno_count) - max_lineno_count = sec->lineno_count; - if (sec->reloc_count > max_reloc_count) - max_reloc_count = sec->reloc_count; - } - else if (info->relocateable - && (p->type == bfd_section_reloc_link_order - || p->type == bfd_symbol_reloc_link_order)) - ++o->reloc_count; - } - if (o->reloc_count == 0) - o->rel_filepos = 0; - else - { - o->flags |= SEC_RELOC; - o->rel_filepos = rel_filepos; - rel_filepos += o->reloc_count * relsz; - } - } - - /* If doing a relocateable link, allocate space for the pointers we - need to keep. */ - if (info->relocateable) - { - unsigned int i; - - /* We use section_count + 1, rather than section_count, because - the target_index fields are 1 based. */ - finfo.section_info = - ((struct coff_link_section_info *) - bfd_malloc ((abfd->section_count + 1) - * sizeof (struct coff_link_section_info))); - if (finfo.section_info == NULL) - goto error_return; - for (i = 0; i <= abfd->section_count; i++) - { - finfo.section_info[i].relocs = NULL; - finfo.section_info[i].rel_hashes = NULL; - } - } - - /* We now know the size of the relocs, so we can determine the file - positions of the line numbers. */ - line_filepos = rel_filepos; - linesz = bfd_coff_linesz (abfd); - max_output_reloc_count = 0; - for (o = abfd->sections; o != NULL; o = o->next) - { - if (o->lineno_count == 0) - o->line_filepos = 0; - else - { - o->line_filepos = line_filepos; - line_filepos += o->lineno_count * linesz; - } - - if (o->reloc_count != 0) - { - /* We don't know the indices of global symbols until we have - written out all the local symbols. For each section in - the output file, we keep an array of pointers to hash - table entries. Each entry in the array corresponds to a - reloc. When we find a reloc against a global symbol, we - set the corresponding entry in this array so that we can - fix up the symbol index after we have written out all the - local symbols. - - Because of this problem, we also keep the relocs in - memory until the end of the link. This wastes memory, - but only when doing a relocateable link, which is not the - common case. */ - BFD_ASSERT (info->relocateable); - finfo.section_info[o->target_index].relocs = - ((struct internal_reloc *) - bfd_malloc (o->reloc_count * sizeof (struct internal_reloc))); - finfo.section_info[o->target_index].rel_hashes = - ((struct coff_link_hash_entry **) - bfd_malloc (o->reloc_count - * sizeof (struct coff_link_hash_entry *))); - if (finfo.section_info[o->target_index].relocs == NULL - || finfo.section_info[o->target_index].rel_hashes == NULL) - goto error_return; - - if (o->reloc_count > max_output_reloc_count) - max_output_reloc_count = o->reloc_count; - } - - /* Reset the reloc and lineno counts, so that we can use them to - count the number of entries we have output so far. */ - o->reloc_count = 0; - o->lineno_count = 0; - } - - obj_sym_filepos (abfd) = line_filepos; - - /* Figure out the largest number of symbols in an input BFD. Take - the opportunity to clear the output_has_begun fields of all the - input BFD's. */ - max_sym_count = 0; - for (sub = info->input_bfds; sub != NULL; sub = sub->link_next) - { - size_t sz; - - sub->output_has_begun = false; - sz = obj_raw_syment_count (sub); - if (sz > max_sym_count) - max_sym_count = sz; - } - - /* Allocate some buffers used while linking. */ - finfo.internal_syms = ((struct internal_syment *) - bfd_malloc (max_sym_count - * sizeof (struct internal_syment))); - finfo.sec_ptrs = (asection **) bfd_malloc (max_sym_count - * sizeof (asection *)); - finfo.sym_indices = (long *) bfd_malloc (max_sym_count * sizeof (long)); - finfo.outsyms = ((bfd_byte *) - bfd_malloc ((size_t) ((max_sym_count + 1) * symesz))); - finfo.linenos = (bfd_byte *) bfd_malloc (max_lineno_count - * bfd_coff_linesz (abfd)); - finfo.contents = (bfd_byte *) bfd_malloc (max_contents_size); - finfo.external_relocs = (bfd_byte *) bfd_malloc (max_reloc_count * relsz); - if (! info->relocateable) - finfo.internal_relocs = ((struct internal_reloc *) - bfd_malloc (max_reloc_count - * sizeof (struct internal_reloc))); - if ((finfo.internal_syms == NULL && max_sym_count > 0) - || (finfo.sec_ptrs == NULL && max_sym_count > 0) - || (finfo.sym_indices == NULL && max_sym_count > 0) - || finfo.outsyms == NULL - || (finfo.linenos == NULL && max_lineno_count > 0) - || (finfo.contents == NULL && max_contents_size > 0) - || (finfo.external_relocs == NULL && max_reloc_count > 0) - || (! info->relocateable - && finfo.internal_relocs == NULL - && max_reloc_count > 0)) - goto error_return; - - /* We now know the position of everything in the file, except that - we don't know the size of the symbol table and therefore we don't - know where the string table starts. We just build the string - table in memory as we go along. We process all the relocations - for a single input file at once. */ - obj_raw_syment_count (abfd) = 0; - - if (coff_backend_info (abfd)->_bfd_coff_start_final_link) - { - if (! bfd_coff_start_final_link (abfd, info)) - goto error_return; - } - - for (o = abfd->sections; o != NULL; o = o->next) - { - for (p = o->link_order_head; p != NULL; p = p->next) - { - if (p->type == bfd_indirect_link_order - && (bfd_get_flavour (p->u.indirect.section->owner) - == bfd_target_coff_flavour)) - { - sub = p->u.indirect.section->owner; - if (! sub->output_has_begun) - { - if (! _bfd_coff_link_input_bfd (&finfo, sub)) - goto error_return; - sub->output_has_begun = true; - } - } - else if (p->type == bfd_section_reloc_link_order - || p->type == bfd_symbol_reloc_link_order) - { - if (! _bfd_coff_reloc_link_order (abfd, &finfo, o, p)) - goto error_return; - } - else - { - if (! _bfd_default_link_order (abfd, info, o, p)) - goto error_return; - } - } - } - - /* Free up the buffers used by _bfd_coff_link_input_bfd. */ - - coff_debug_merge_hash_table_free (&finfo.debug_merge); - debug_merge_allocated = false; - - if (finfo.internal_syms != NULL) - { - free (finfo.internal_syms); - finfo.internal_syms = NULL; - } - if (finfo.sec_ptrs != NULL) - { - free (finfo.sec_ptrs); - finfo.sec_ptrs = NULL; - } - if (finfo.sym_indices != NULL) - { - free (finfo.sym_indices); - finfo.sym_indices = NULL; - } - if (finfo.linenos != NULL) - { - free (finfo.linenos); - finfo.linenos = NULL; - } - if (finfo.contents != NULL) - { - free (finfo.contents); - finfo.contents = NULL; - } - if (finfo.external_relocs != NULL) - { - free (finfo.external_relocs); - finfo.external_relocs = NULL; - } - if (finfo.internal_relocs != NULL) - { - free (finfo.internal_relocs); - finfo.internal_relocs = NULL; - } - - /* The value of the last C_FILE symbol is supposed to be the symbol - index of the first external symbol. Write it out again if - necessary. */ - if (finfo.last_file_index != -1 - && (unsigned int) finfo.last_file.n_value != obj_raw_syment_count (abfd)) - { - finfo.last_file.n_value = obj_raw_syment_count (abfd); - bfd_coff_swap_sym_out (abfd, (PTR) &finfo.last_file, - (PTR) finfo.outsyms); - if (bfd_seek (abfd, - (obj_sym_filepos (abfd) - + finfo.last_file_index * symesz), - SEEK_SET) != 0 - || bfd_write (finfo.outsyms, symesz, 1, abfd) != symesz) - return false; - } - - /* Write out the global symbols. */ - finfo.failed = false; - coff_link_hash_traverse (coff_hash_table (info), _bfd_coff_write_global_sym, - (PTR) &finfo); - if (finfo.failed) - goto error_return; - - /* The outsyms buffer is used by _bfd_coff_write_global_sym. */ - if (finfo.outsyms != NULL) - { - free (finfo.outsyms); - finfo.outsyms = NULL; - } - - if (info->relocateable) - { - /* Now that we have written out all the global symbols, we know - the symbol indices to use for relocs against them, and we can - finally write out the relocs. */ - external_relocs = ((bfd_byte *) - bfd_malloc (max_output_reloc_count * relsz)); - if (external_relocs == NULL) - goto error_return; - - for (o = abfd->sections; o != NULL; o = o->next) - { - struct internal_reloc *irel; - struct internal_reloc *irelend; - struct coff_link_hash_entry **rel_hash; - bfd_byte *erel; - - if (o->reloc_count == 0) - continue; - - irel = finfo.section_info[o->target_index].relocs; - irelend = irel + o->reloc_count; - rel_hash = finfo.section_info[o->target_index].rel_hashes; - erel = external_relocs; - for (; irel < irelend; irel++, rel_hash++, erel += relsz) - { - if (*rel_hash != NULL) - { - BFD_ASSERT ((*rel_hash)->indx >= 0); - irel->r_symndx = (*rel_hash)->indx; - } - bfd_coff_swap_reloc_out (abfd, (PTR) irel, (PTR) erel); - } - - if (bfd_seek (abfd, o->rel_filepos, SEEK_SET) != 0 - || bfd_write ((PTR) external_relocs, relsz, o->reloc_count, - abfd) != relsz * o->reloc_count) - goto error_return; - } - - free (external_relocs); - external_relocs = NULL; - } - - /* Free up the section information. */ - if (finfo.section_info != NULL) - { - unsigned int i; - - for (i = 0; i < abfd->section_count; i++) - { - if (finfo.section_info[i].relocs != NULL) - free (finfo.section_info[i].relocs); - if (finfo.section_info[i].rel_hashes != NULL) - free (finfo.section_info[i].rel_hashes); - } - free (finfo.section_info); - finfo.section_info = NULL; - } - - /* Write out the string table. */ - if (obj_raw_syment_count (abfd) != 0) - { - if (bfd_seek (abfd, - (obj_sym_filepos (abfd) - + obj_raw_syment_count (abfd) * symesz), - SEEK_SET) != 0) - return false; - -#if STRING_SIZE_SIZE == 4 - bfd_h_put_32 (abfd, - _bfd_stringtab_size (finfo.strtab) + STRING_SIZE_SIZE, - (bfd_byte *) strbuf); -#else - #error Change bfd_h_put_32 -#endif - - if (bfd_write (strbuf, 1, STRING_SIZE_SIZE, abfd) != STRING_SIZE_SIZE) - return false; - - if (! _bfd_stringtab_emit (abfd, finfo.strtab)) - return false; - } - - _bfd_stringtab_free (finfo.strtab); - - /* Setting bfd_get_symcount to 0 will cause write_object_contents to - not try to write out the symbols. */ - bfd_get_symcount (abfd) = 0; - - return true; - - error_return: - if (debug_merge_allocated) - coff_debug_merge_hash_table_free (&finfo.debug_merge); - if (finfo.strtab != NULL) - _bfd_stringtab_free (finfo.strtab); - if (finfo.section_info != NULL) - { - unsigned int i; - - for (i = 0; i < abfd->section_count; i++) - { - if (finfo.section_info[i].relocs != NULL) - free (finfo.section_info[i].relocs); - if (finfo.section_info[i].rel_hashes != NULL) - free (finfo.section_info[i].rel_hashes); - } - free (finfo.section_info); - } - if (finfo.internal_syms != NULL) - free (finfo.internal_syms); - if (finfo.sec_ptrs != NULL) - free (finfo.sec_ptrs); - if (finfo.sym_indices != NULL) - free (finfo.sym_indices); - if (finfo.outsyms != NULL) - free (finfo.outsyms); - if (finfo.linenos != NULL) - free (finfo.linenos); - if (finfo.contents != NULL) - free (finfo.contents); - if (finfo.external_relocs != NULL) - free (finfo.external_relocs); - if (finfo.internal_relocs != NULL) - free (finfo.internal_relocs); - if (external_relocs != NULL) - free (external_relocs); - return false; -} - -/* parse out a -heap <reserved>,<commit> line */ - -static char * -dores_com (ptr, output_bfd, heap) - char *ptr; - bfd *output_bfd; - int heap; -{ - if (coff_data(output_bfd)->pe) - { - int val = strtoul (ptr, &ptr, 0); - if (heap) - pe_data(output_bfd)->pe_opthdr.SizeOfHeapReserve =val; - else - pe_data(output_bfd)->pe_opthdr.SizeOfStackReserve =val; - - if (ptr[0] == ',') - { - int val = strtoul (ptr+1, &ptr, 0); - if (heap) - pe_data(output_bfd)->pe_opthdr.SizeOfHeapCommit =val; - else - pe_data(output_bfd)->pe_opthdr.SizeOfStackCommit =val; - } - } - return ptr; -} - -static char *get_name(ptr, dst) -char *ptr; -char **dst; -{ - while (*ptr == ' ') - ptr++; - *dst = ptr; - while (*ptr && *ptr != ' ') - ptr++; - *ptr = 0; - return ptr+1; -} - -/* Process any magic embedded commands in a section called .drectve */ - -static int -process_embedded_commands (output_bfd, info, abfd) - bfd *output_bfd; - struct bfd_link_info *info; - bfd *abfd; -{ - asection *sec = bfd_get_section_by_name (abfd, ".drectve"); - char *s; - char *e; - char *copy; - if (!sec) - return 1; - - copy = bfd_malloc ((size_t) sec->_raw_size); - if (!copy) - return 0; - if (! bfd_get_section_contents(abfd, sec, copy, 0, sec->_raw_size)) - { - free (copy); - return 0; - } - e = copy + sec->_raw_size; - for (s = copy; s < e ; ) - { - if (s[0]!= '-') { - s++; - continue; - } - if (strncmp (s,"-attr", 5) == 0) - { - char *name; - char *attribs; - asection *asec; - - int loop = 1; - int had_write = 0; - int had_read = 0; - int had_exec= 0; - int had_shared= 0; - s += 5; - s = get_name(s, &name); - s = get_name(s, &attribs); - while (loop) { - switch (*attribs++) - { - case 'W': - had_write = 1; - break; - case 'R': - had_read = 1; - break; - case 'S': - had_shared = 1; - break; - case 'X': - had_exec = 1; - break; - default: - loop = 0; - } - } - asec = bfd_get_section_by_name (abfd, name); - if (asec) { - if (had_exec) - asec->flags |= SEC_CODE; - if (!had_write) - asec->flags |= SEC_READONLY; - } - } - else if (strncmp (s,"-heap", 5) == 0) - { - s = dores_com (s+5, output_bfd, 1); - } - else if (strncmp (s,"-stack", 6) == 0) - { - s = dores_com (s+6, output_bfd, 0); - } - else - s++; - } - free (copy); - return 1; -} - -/* Link an input file into the linker output file. This function - handles all the sections and relocations of the input file at once. */ - -boolean -_bfd_coff_link_input_bfd (finfo, input_bfd) - struct coff_final_link_info *finfo; - bfd *input_bfd; -{ - boolean (*sym_is_global) PARAMS ((bfd *, struct internal_syment *)); - boolean (*adjust_symndx) PARAMS ((bfd *, struct bfd_link_info *, bfd *, - asection *, struct internal_reloc *, - boolean *)); - bfd *output_bfd; - const char *strings; - bfd_size_type syment_base; - unsigned int n_tmask; - unsigned int n_btshft; - boolean copy, hash; - bfd_size_type isymesz; - bfd_size_type osymesz; - bfd_size_type linesz; - bfd_byte *esym; - bfd_byte *esym_end; - struct internal_syment *isymp; - asection **secpp; - long *indexp; - unsigned long output_index; - bfd_byte *outsym; - struct coff_link_hash_entry **sym_hash; - asection *o; - - /* Move all the symbols to the output file. */ - - output_bfd = finfo->output_bfd; - sym_is_global = coff_backend_info (input_bfd)->_bfd_coff_sym_is_global; - strings = NULL; - syment_base = obj_raw_syment_count (output_bfd); - isymesz = bfd_coff_symesz (input_bfd); - osymesz = bfd_coff_symesz (output_bfd); - linesz = bfd_coff_linesz (input_bfd); - BFD_ASSERT (linesz == bfd_coff_linesz (output_bfd)); - - n_tmask = coff_data (input_bfd)->local_n_tmask; - n_btshft = coff_data (input_bfd)->local_n_btshft; - - /* Define macros so that ISFCN, et. al., macros work correctly. */ -#define N_TMASK n_tmask -#define N_BTSHFT n_btshft - - copy = false; - if (! finfo->info->keep_memory) - copy = true; - hash = true; - if ((output_bfd->flags & BFD_TRADITIONAL_FORMAT) != 0) - hash = false; - - if (! _bfd_coff_get_external_symbols (input_bfd)) - return false; - - esym = (bfd_byte *) obj_coff_external_syms (input_bfd); - esym_end = esym + obj_raw_syment_count (input_bfd) * isymesz; - isymp = finfo->internal_syms; - secpp = finfo->sec_ptrs; - indexp = finfo->sym_indices; - output_index = syment_base; - outsym = finfo->outsyms; - - if (coff_data(output_bfd)->pe) - { - if (!process_embedded_commands (output_bfd, finfo->info, input_bfd)) - return false; - } - - while (esym < esym_end) - { - struct internal_syment isym; - boolean skip; - boolean global; - int add; - - bfd_coff_swap_sym_in (input_bfd, (PTR) esym, (PTR) isymp); - - /* Make a copy of *isymp so that the relocate_section function - always sees the original values. This is more reliable than - always recomputing the symbol value even if we are stripping - the symbol. */ - isym = *isymp; - - if (isym.n_scnum != 0) - *secpp = coff_section_from_bfd_index (input_bfd, isym.n_scnum); - else - { - if (isym.n_value == 0) - *secpp = bfd_und_section_ptr; - else - *secpp = bfd_com_section_ptr; - } - - *indexp = -1; - - skip = false; - global = false; - add = 1 + isym.n_numaux; - - /* If we are stripping all symbols, we want to skip this one. */ - if (finfo->info->strip == strip_all) - skip = true; - - if (! skip) - { - if (isym.n_sclass == C_EXT - || (sym_is_global && (*sym_is_global) (input_bfd, &isym))) - { - /* This is a global symbol. Global symbols come at the - end of the symbol table, so skip them for now. - Function symbols, however, are an exception, and are - not moved to the end. */ - global = true; - if (! ISFCN (isym.n_type)) - skip = true; - } - else - { - /* This is a local symbol. Skip it if we are discarding - local symbols. */ - if (finfo->info->discard == discard_all) - skip = true; - } - } - - /* If we stripping debugging symbols, and this is a debugging - symbol, then skip it. */ - if (! skip - && finfo->info->strip == strip_debugger - && isym.n_scnum == N_DEBUG) - skip = true; - - /* If some symbols are stripped based on the name, work out the - name and decide whether to skip this symbol. */ - if (! skip - && (finfo->info->strip == strip_some - || finfo->info->discard == discard_l)) - { - const char *name; - char buf[SYMNMLEN + 1]; - - name = _bfd_coff_internal_syment_name (input_bfd, &isym, buf); - if (name == NULL) - return false; - - if ((finfo->info->strip == strip_some - && (bfd_hash_lookup (finfo->info->keep_hash, name, false, - false) == NULL)) - || (! global - && finfo->info->discard == discard_l - && strncmp (name, finfo->info->lprefix, - finfo->info->lprefix_len) == 0)) - skip = true; - } - - /* If this is an enum, struct, or union tag, see if we have - already output an identical type. */ - if (! skip - && (finfo->output_bfd->flags & BFD_TRADITIONAL_FORMAT) == 0 - && (isym.n_sclass == C_ENTAG - || isym.n_sclass == C_STRTAG - || isym.n_sclass == C_UNTAG) - && isym.n_numaux == 1) - { - const char *name; - char buf[SYMNMLEN + 1]; - struct coff_debug_merge_hash_entry *mh; - struct coff_debug_merge_type *mt; - union internal_auxent aux; - struct coff_debug_merge_element **epp; - bfd_byte *esl, *eslend; - struct internal_syment *islp; - - name = _bfd_coff_internal_syment_name (input_bfd, &isym, buf); - if (name == NULL) - return false; - - /* Ignore fake names invented by compiler; treat them all as - the same name. */ - if (*name == '~' || *name == '.' || *name == '$' - || (*name == bfd_get_symbol_leading_char (input_bfd) - && (name[1] == '~' || name[1] == '.' || name[1] == '$'))) - name = ""; - - mh = coff_debug_merge_hash_lookup (&finfo->debug_merge, name, - true, true); - if (mh == NULL) - return false; - - /* Allocate memory to hold type information. If this turns - out to be a duplicate, we pass this address to - bfd_release. */ - mt = ((struct coff_debug_merge_type *) - bfd_alloc (input_bfd, - sizeof (struct coff_debug_merge_type))); - if (mt == NULL) - return false; - mt->class = isym.n_sclass; - - /* Pick up the aux entry, which points to the end of the tag - entries. */ - bfd_coff_swap_aux_in (input_bfd, (PTR) (esym + isymesz), - isym.n_type, isym.n_sclass, 0, isym.n_numaux, - (PTR) &aux); - - /* Gather the elements. */ - epp = &mt->elements; - mt->elements = NULL; - islp = isymp + 2; - esl = esym + 2 * isymesz; - eslend = ((bfd_byte *) obj_coff_external_syms (input_bfd) - + aux.x_sym.x_fcnary.x_fcn.x_endndx.l * isymesz); - while (esl < eslend) - { - const char *elename; - char elebuf[SYMNMLEN + 1]; - char *copy; - - bfd_coff_swap_sym_in (input_bfd, (PTR) esl, (PTR) islp); - - *epp = ((struct coff_debug_merge_element *) - bfd_alloc (input_bfd, - sizeof (struct coff_debug_merge_element))); - if (*epp == NULL) - return false; - - elename = _bfd_coff_internal_syment_name (input_bfd, islp, - elebuf); - if (elename == NULL) - return false; - - copy = (char *) bfd_alloc (input_bfd, strlen (elename) + 1); - if (copy == NULL) - return false; - strcpy (copy, elename); - - (*epp)->name = copy; - (*epp)->type = islp->n_type; - (*epp)->tagndx = 0; - if (islp->n_numaux >= 1 - && islp->n_type != T_NULL - && islp->n_sclass != C_EOS) - { - union internal_auxent eleaux; - long indx; - - bfd_coff_swap_aux_in (input_bfd, (PTR) (esl + isymesz), - islp->n_type, islp->n_sclass, 0, - islp->n_numaux, (PTR) &eleaux); - indx = eleaux.x_sym.x_tagndx.l; - - /* FIXME: If this tagndx entry refers to a symbol - defined later in this file, we just ignore it. - Handling this correctly would be tedious, and may - not be required. */ - - if (indx > 0 - && (indx - < ((esym - - (bfd_byte *) obj_coff_external_syms (input_bfd)) - / (long) isymesz))) - { - (*epp)->tagndx = finfo->sym_indices[indx]; - if ((*epp)->tagndx < 0) - (*epp)->tagndx = 0; - } - } - epp = &(*epp)->next; - *epp = NULL; - - esl += (islp->n_numaux + 1) * isymesz; - islp += islp->n_numaux + 1; - } - - /* See if we already have a definition which matches this - type. We always output the type if it has no elements, - for simplicity. */ - if (mt->elements == NULL) - bfd_release (input_bfd, (PTR) mt); - else - { - struct coff_debug_merge_type *mtl; - - for (mtl = mh->types; mtl != NULL; mtl = mtl->next) - { - struct coff_debug_merge_element *me, *mel; - - if (mtl->class != mt->class) - continue; - - for (me = mt->elements, mel = mtl->elements; - me != NULL && mel != NULL; - me = me->next, mel = mel->next) - { - if (strcmp (me->name, mel->name) != 0 - || me->type != mel->type - || me->tagndx != mel->tagndx) - break; - } - - if (me == NULL && mel == NULL) - break; - } - - if (mtl == NULL || (bfd_size_type) mtl->indx >= syment_base) - { - /* This is the first definition of this type. */ - mt->indx = output_index; - mt->next = mh->types; - mh->types = mt; - } - else - { - /* This is a redefinition which can be merged. */ - bfd_release (input_bfd, (PTR) mt); - *indexp = mtl->indx; - add = (eslend - esym) / isymesz; - skip = true; - } - } - } - - /* We now know whether we are to skip this symbol or not. */ - if (! skip) - { - /* Adjust the symbol in order to output it. */ - - if (isym._n._n_n._n_zeroes == 0 - && isym._n._n_n._n_offset != 0) - { - const char *name; - bfd_size_type indx; - - /* This symbol has a long name. Enter it in the string - table we are building. Note that we do not check - bfd_coff_symname_in_debug. That is only true for - XCOFF, and XCOFF requires different linking code - anyhow. */ - name = _bfd_coff_internal_syment_name (input_bfd, &isym, - (char *) NULL); - if (name == NULL) - return false; - indx = _bfd_stringtab_add (finfo->strtab, name, hash, copy); - if (indx == (bfd_size_type) -1) - return false; - isym._n._n_n._n_offset = STRING_SIZE_SIZE + indx; - } - - if (isym.n_scnum > 0) - { - isym.n_scnum = (*secpp)->output_section->target_index; - isym.n_value += ((*secpp)->output_section->vma - + (*secpp)->output_offset - - (*secpp)->vma); - } - - /* The value of a C_FILE symbol is the symbol index of the - next C_FILE symbol. The value of the last C_FILE symbol - is the symbol index to the first external symbol - (actually, coff_renumber_symbols does not get this - right--it just sets the value of the last C_FILE symbol - to zero--and nobody has ever complained about it). We - try to get this right, below, just before we write the - symbols out, but in the general case we may have to write - the symbol out twice. */ - if (isym.n_sclass == C_FILE) - { - if (finfo->last_file_index != -1 - && finfo->last_file.n_value != (long) output_index) - { - /* We must correct the value of the last C_FILE entry. */ - finfo->last_file.n_value = output_index; - if ((bfd_size_type) finfo->last_file_index >= syment_base) - { - /* The last C_FILE symbol is in this input file. */ - bfd_coff_swap_sym_out (output_bfd, - (PTR) &finfo->last_file, - (PTR) (finfo->outsyms - + ((finfo->last_file_index - - syment_base) - * osymesz))); - } - else - { - /* We have already written out the last C_FILE - symbol. We need to write it out again. We - borrow *outsym temporarily. */ - bfd_coff_swap_sym_out (output_bfd, - (PTR) &finfo->last_file, - (PTR) outsym); - if (bfd_seek (output_bfd, - (obj_sym_filepos (output_bfd) - + finfo->last_file_index * osymesz), - SEEK_SET) != 0 - || (bfd_write (outsym, osymesz, 1, output_bfd) - != osymesz)) - return false; - } - } - - finfo->last_file_index = output_index; - finfo->last_file = isym; - } - - /* Output the symbol. */ - - bfd_coff_swap_sym_out (output_bfd, (PTR) &isym, (PTR) outsym); - - *indexp = output_index; - - if (global) - { - long indx; - struct coff_link_hash_entry *h; - - indx = ((esym - (bfd_byte *) obj_coff_external_syms (input_bfd)) - / isymesz); - h = obj_coff_sym_hashes (input_bfd)[indx]; - BFD_ASSERT (h != NULL); - h->indx = output_index; - } - - output_index += add; - outsym += add * osymesz; - } - - esym += add * isymesz; - isymp += add; - ++secpp; - ++indexp; - for (--add; add > 0; --add) - { - *secpp++ = NULL; - *indexp++ = -1; - } - } - - /* Fix up the aux entries. This must be done in a separate pass, - because we don't know the correct symbol indices until we have - already decided which symbols we are going to keep. */ - - esym = (bfd_byte *) obj_coff_external_syms (input_bfd); - esym_end = esym + obj_raw_syment_count (input_bfd) * isymesz; - isymp = finfo->internal_syms; - indexp = finfo->sym_indices; - sym_hash = obj_coff_sym_hashes (input_bfd); - outsym = finfo->outsyms; - while (esym < esym_end) - { - int add; - - add = 1 + isymp->n_numaux; - - if ((*indexp < 0 - || (bfd_size_type) *indexp < syment_base) - && (*sym_hash == NULL - || (*sym_hash)->auxbfd != input_bfd)) - esym += add * isymesz; - else - { - struct coff_link_hash_entry *h; - int i; - - h = NULL; - if (*indexp < 0) - { - h = *sym_hash; - BFD_ASSERT (h->numaux == isymp->n_numaux); - } - - esym += isymesz; - - if (h == NULL) - outsym += osymesz; - - /* Handle the aux entries. This handling is based on - coff_pointerize_aux. I don't know if it always correct. */ - for (i = 0; i < isymp->n_numaux && esym < esym_end; i++) - { - union internal_auxent aux; - union internal_auxent *auxp; - - if (h != NULL) - auxp = h->aux + i; - else - { - bfd_coff_swap_aux_in (input_bfd, (PTR) esym, isymp->n_type, - isymp->n_sclass, i, isymp->n_numaux, - (PTR) &aux); - auxp = &aux; - } - - if (isymp->n_sclass == C_FILE) - { - /* If this is a long filename, we must put it in the - string table. */ - if (auxp->x_file.x_n.x_zeroes == 0 - && auxp->x_file.x_n.x_offset != 0) - { - const char *filename; - bfd_size_type indx; - - BFD_ASSERT (auxp->x_file.x_n.x_offset - >= STRING_SIZE_SIZE); - if (strings == NULL) - { - strings = _bfd_coff_read_string_table (input_bfd); - if (strings == NULL) - return false; - } - filename = strings + auxp->x_file.x_n.x_offset; - indx = _bfd_stringtab_add (finfo->strtab, filename, - hash, copy); - if (indx == (bfd_size_type) -1) - return false; - auxp->x_file.x_n.x_offset = STRING_SIZE_SIZE + indx; - } - } - else if (isymp->n_sclass != C_STAT || isymp->n_type != T_NULL) - { - unsigned long indx; - - if (ISFCN (isymp->n_type) - || ISTAG (isymp->n_sclass) - || isymp->n_sclass == C_BLOCK) - { - indx = auxp->x_sym.x_fcnary.x_fcn.x_endndx.l; - if (indx > 0 - && indx < obj_raw_syment_count (input_bfd)) - { - /* We look forward through the symbol for - the index of the next symbol we are going - to include. I don't know if this is - entirely right. */ - while ((finfo->sym_indices[indx] < 0 - || ((bfd_size_type) finfo->sym_indices[indx] - < syment_base)) - && indx < obj_raw_syment_count (input_bfd)) - ++indx; - if (indx >= obj_raw_syment_count (input_bfd)) - indx = output_index; - else - indx = finfo->sym_indices[indx]; - auxp->x_sym.x_fcnary.x_fcn.x_endndx.l = indx; - } - } - - indx = auxp->x_sym.x_tagndx.l; - if (indx > 0 && indx < obj_raw_syment_count (input_bfd)) - { - long symindx; - - symindx = finfo->sym_indices[indx]; - if (symindx < 0) - auxp->x_sym.x_tagndx.l = 0; - else - auxp->x_sym.x_tagndx.l = symindx; - } - } - - if (h == NULL) - { - bfd_coff_swap_aux_out (output_bfd, (PTR) auxp, isymp->n_type, - isymp->n_sclass, i, isymp->n_numaux, - (PTR) outsym); - outsym += osymesz; - } - - esym += isymesz; - } - } - - indexp += add; - isymp += add; - sym_hash += add; - } - - /* Relocate the line numbers, unless we are stripping them. */ - if (finfo->info->strip == strip_none - || finfo->info->strip == strip_some) - { - for (o = input_bfd->sections; o != NULL; o = o->next) - { - bfd_vma offset; - bfd_byte *eline; - bfd_byte *elineend; - - /* FIXME: If SEC_HAS_CONTENTS is not for the section, then - build_link_order in ldwrite.c will not have created a - link order, which means that we will not have seen this - input section in _bfd_coff_final_link, which means that - we will not have allocated space for the line numbers of - this section. I don't think line numbers can be - meaningful for a section which does not have - SEC_HAS_CONTENTS set, but, if they do, this must be - changed. */ - if (o->lineno_count == 0 - || (o->output_section->flags & SEC_HAS_CONTENTS) == 0) - continue; - - if (bfd_seek (input_bfd, o->line_filepos, SEEK_SET) != 0 - || bfd_read (finfo->linenos, linesz, o->lineno_count, - input_bfd) != linesz * o->lineno_count) - return false; - - offset = o->output_section->vma + o->output_offset - o->vma; - eline = finfo->linenos; - elineend = eline + linesz * o->lineno_count; - for (; eline < elineend; eline += linesz) - { - struct internal_lineno iline; - - bfd_coff_swap_lineno_in (input_bfd, (PTR) eline, (PTR) &iline); - - if (iline.l_lnno != 0) - iline.l_addr.l_paddr += offset; - else if (iline.l_addr.l_symndx >= 0 - && ((unsigned long) iline.l_addr.l_symndx - < obj_raw_syment_count (input_bfd))) - { - long indx; - - indx = finfo->sym_indices[iline.l_addr.l_symndx]; - - if (indx < 0) - { - /* These line numbers are attached to a symbol - which we are stripping. We should really - just discard the line numbers, but that would - be a pain because we have already counted - them. */ - indx = 0; - } - else - { - struct internal_syment is; - union internal_auxent ia; - - /* Fix up the lnnoptr field in the aux entry of - the symbol. It turns out that we can't do - this when we modify the symbol aux entries, - because gas sometimes screws up the lnnoptr - field and makes it an offset from the start - of the line numbers rather than an absolute - file index. */ - bfd_coff_swap_sym_in (output_bfd, - (PTR) (finfo->outsyms - + ((indx - syment_base) - * osymesz)), - (PTR) &is); - if ((ISFCN (is.n_type) - || is.n_sclass == C_BLOCK) - && is.n_numaux >= 1) - { - PTR auxptr; - - auxptr = (PTR) (finfo->outsyms - + ((indx - syment_base + 1) - * osymesz)); - bfd_coff_swap_aux_in (output_bfd, auxptr, - is.n_type, is.n_sclass, - 0, is.n_numaux, (PTR) &ia); - ia.x_sym.x_fcnary.x_fcn.x_lnnoptr = - (o->output_section->line_filepos - + o->output_section->lineno_count * linesz - + eline - finfo->linenos); - bfd_coff_swap_aux_out (output_bfd, (PTR) &ia, - is.n_type, is.n_sclass, 0, - is.n_numaux, auxptr); - } - } - - iline.l_addr.l_symndx = indx; - } - - bfd_coff_swap_lineno_out (output_bfd, (PTR) &iline, (PTR) eline); - } - - if (bfd_seek (output_bfd, - (o->output_section->line_filepos - + o->output_section->lineno_count * linesz), - SEEK_SET) != 0 - || bfd_write (finfo->linenos, linesz, o->lineno_count, - output_bfd) != linesz * o->lineno_count) - return false; - - o->output_section->lineno_count += o->lineno_count; - } - } - - /* If we swapped out a C_FILE symbol, guess that the next C_FILE - symbol will be the first symbol in the next input file. In the - normal case, this will save us from writing out the C_FILE symbol - again. */ - if (finfo->last_file_index != -1 - && (bfd_size_type) finfo->last_file_index >= syment_base) - { - finfo->last_file.n_value = output_index; - bfd_coff_swap_sym_out (output_bfd, (PTR) &finfo->last_file, - (PTR) (finfo->outsyms - + ((finfo->last_file_index - syment_base) - * osymesz))); - } - - /* Write the modified symbols to the output file. */ - if (outsym > finfo->outsyms) - { - if (bfd_seek (output_bfd, - obj_sym_filepos (output_bfd) + syment_base * osymesz, - SEEK_SET) != 0 - || (bfd_write (finfo->outsyms, outsym - finfo->outsyms, 1, - output_bfd) - != (bfd_size_type) (outsym - finfo->outsyms))) - return false; - - BFD_ASSERT ((obj_raw_syment_count (output_bfd) - + (outsym - finfo->outsyms) / osymesz) - == output_index); - - obj_raw_syment_count (output_bfd) = output_index; - } - - /* Relocate the contents of each section. */ - adjust_symndx = coff_backend_info (input_bfd)->_bfd_coff_adjust_symndx; - for (o = input_bfd->sections; o != NULL; o = o->next) - { - bfd_byte *contents; - - if ((o->flags & SEC_HAS_CONTENTS) == 0) - { - if ((o->flags & SEC_RELOC) != 0 - && o->reloc_count != 0) - { - ((*_bfd_error_handler) - ("%s: relocs in section `%s', but it has no contents", - bfd_get_filename (input_bfd), - bfd_get_section_name (input_bfd, o))); - bfd_set_error (bfd_error_no_contents); - return false; - } - - continue; - } - - if (coff_section_data (input_bfd, o) != NULL - && coff_section_data (input_bfd, o)->contents != NULL) - contents = coff_section_data (input_bfd, o)->contents; - else - { - if (! bfd_get_section_contents (input_bfd, o, finfo->contents, - (file_ptr) 0, o->_raw_size)) - return false; - contents = finfo->contents; - } - - if ((o->flags & SEC_RELOC) != 0) - { - int target_index; - struct internal_reloc *internal_relocs; - struct internal_reloc *irel; - - /* Read in the relocs. */ - target_index = o->output_section->target_index; - internal_relocs = (_bfd_coff_read_internal_relocs - (input_bfd, o, false, finfo->external_relocs, - finfo->info->relocateable, - (finfo->info->relocateable - ? (finfo->section_info[target_index].relocs - + o->output_section->reloc_count) - : finfo->internal_relocs))); - if (internal_relocs == NULL) - return false; - - /* Call processor specific code to relocate the section - contents. */ - if (! bfd_coff_relocate_section (output_bfd, finfo->info, - input_bfd, o, - contents, - internal_relocs, - finfo->internal_syms, - finfo->sec_ptrs)) - return false; - - if (finfo->info->relocateable) - { - bfd_vma offset; - struct internal_reloc *irelend; - struct coff_link_hash_entry **rel_hash; - - offset = o->output_section->vma + o->output_offset - o->vma; - irel = internal_relocs; - irelend = irel + o->reloc_count; - rel_hash = (finfo->section_info[target_index].rel_hashes - + o->output_section->reloc_count); - for (; irel < irelend; irel++, rel_hash++) - { - struct coff_link_hash_entry *h; - boolean adjusted; - - *rel_hash = NULL; - - /* Adjust the reloc address and symbol index. */ - - irel->r_vaddr += offset; - - if (irel->r_symndx == -1) - continue; - - if (adjust_symndx) - { - if (! (*adjust_symndx) (output_bfd, finfo->info, - input_bfd, o, irel, - &adjusted)) - return false; - if (adjusted) - continue; - } - - h = obj_coff_sym_hashes (input_bfd)[irel->r_symndx]; - if (h != NULL) - { - /* This is a global symbol. */ - if (h->indx >= 0) - irel->r_symndx = h->indx; - else - { - /* This symbol is being written at the end - of the file, and we do not yet know the - symbol index. We save the pointer to the - hash table entry in the rel_hash list. - We set the indx field to -2 to indicate - that this symbol must not be stripped. */ - *rel_hash = h; - h->indx = -2; - } - } - else - { - long indx; - - indx = finfo->sym_indices[irel->r_symndx]; - if (indx != -1) - irel->r_symndx = indx; - else - { - struct internal_syment *is; - const char *name; - char buf[SYMNMLEN + 1]; - - /* This reloc is against a symbol we are - stripping. It would be possible to - handle this case, but I don't think it's - worth it. */ - is = finfo->internal_syms + irel->r_symndx; - - name = (_bfd_coff_internal_syment_name - (input_bfd, is, buf)); - if (name == NULL) - return false; - - if (! ((*finfo->info->callbacks->unattached_reloc) - (finfo->info, name, input_bfd, o, - irel->r_vaddr))) - return false; - } - } - } - - o->output_section->reloc_count += o->reloc_count; - } - } - - /* Write out the modified section contents. */ - if (! bfd_set_section_contents (output_bfd, o->output_section, - contents, o->output_offset, - (o->_cooked_size != 0 - ? o->_cooked_size - : o->_raw_size))) - return false; - } - - if (! finfo->info->keep_memory) - { - if (! _bfd_coff_free_symbols (input_bfd)) - return false; - } - - return true; -} - -/* Write out a global symbol. Called via coff_link_hash_traverse. */ - -boolean -_bfd_coff_write_global_sym (h, data) - struct coff_link_hash_entry *h; - PTR data; -{ - struct coff_final_link_info *finfo = (struct coff_final_link_info *) data; - bfd *output_bfd; - struct internal_syment isym; - bfd_size_type symesz; - unsigned int i; - - output_bfd = finfo->output_bfd; - - if (h->indx >= 0) - return true; - - if (h->indx != -2 - && (finfo->info->strip == strip_all - || (finfo->info->strip == strip_some - && (bfd_hash_lookup (finfo->info->keep_hash, - h->root.root.string, false, false) - == NULL)))) - return true; - - switch (h->root.type) - { - default: - case bfd_link_hash_new: - abort (); - return false; - - case bfd_link_hash_undefined: - case bfd_link_hash_undefweak: - isym.n_scnum = N_UNDEF; - isym.n_value = 0; - break; - - case bfd_link_hash_defined: - case bfd_link_hash_defweak: - { - asection *sec; - - sec = h->root.u.def.section->output_section; - if (bfd_is_abs_section (sec)) - isym.n_scnum = N_ABS; - else - isym.n_scnum = sec->target_index; - isym.n_value = (h->root.u.def.value - + sec->vma - + h->root.u.def.section->output_offset); - } - break; - - case bfd_link_hash_common: - isym.n_scnum = N_UNDEF; - isym.n_value = h->root.u.c.size; - break; - - case bfd_link_hash_indirect: - case bfd_link_hash_warning: - /* Just ignore these. They can't be handled anyhow. */ - return true; - } - - if (strlen (h->root.root.string) <= SYMNMLEN) - strncpy (isym._n._n_name, h->root.root.string, SYMNMLEN); - else - { - boolean hash; - bfd_size_type indx; - - hash = true; - if ((output_bfd->flags & BFD_TRADITIONAL_FORMAT) != 0) - hash = false; - indx = _bfd_stringtab_add (finfo->strtab, h->root.root.string, hash, - false); - if (indx == (bfd_size_type) -1) - { - finfo->failed = true; - return false; - } - isym._n._n_n._n_zeroes = 0; - isym._n._n_n._n_offset = STRING_SIZE_SIZE + indx; - } - - isym.n_sclass = h->class; - isym.n_type = h->type; - - if (isym.n_sclass == C_NULL) - isym.n_sclass = C_EXT; - - isym.n_numaux = h->numaux; - - bfd_coff_swap_sym_out (output_bfd, (PTR) &isym, (PTR) finfo->outsyms); - - symesz = bfd_coff_symesz (output_bfd); - - if (bfd_seek (output_bfd, - (obj_sym_filepos (output_bfd) - + obj_raw_syment_count (output_bfd) * symesz), - SEEK_SET) != 0 - || bfd_write (finfo->outsyms, symesz, 1, output_bfd) != symesz) - { - finfo->failed = true; - return false; - } - - h->indx = obj_raw_syment_count (output_bfd); - - ++obj_raw_syment_count (output_bfd); - - /* Write out any associated aux entries. There normally will be - none. If there are any, I have no idea how to modify them. */ - for (i = 0; i < isym.n_numaux; i++) - { - bfd_coff_swap_aux_out (output_bfd, (PTR) (h->aux + i), isym.n_type, - isym.n_sclass, i, isym.n_numaux, - (PTR) finfo->outsyms); - if (bfd_write (finfo->outsyms, symesz, 1, output_bfd) != symesz) - { - finfo->failed = true; - return false; - } - ++obj_raw_syment_count (output_bfd); - } - - return true; -} - -/* Handle a link order which is supposed to generate a reloc. */ - -boolean -_bfd_coff_reloc_link_order (output_bfd, finfo, output_section, link_order) - bfd *output_bfd; - struct coff_final_link_info *finfo; - asection *output_section; - struct bfd_link_order *link_order; -{ - reloc_howto_type *howto; - struct internal_reloc *irel; - struct coff_link_hash_entry **rel_hash_ptr; - - howto = bfd_reloc_type_lookup (output_bfd, link_order->u.reloc.p->reloc); - if (howto == NULL) - { - bfd_set_error (bfd_error_bad_value); - return false; - } - - if (link_order->u.reloc.p->addend != 0) - { - bfd_size_type size; - bfd_byte *buf; - bfd_reloc_status_type rstat; - boolean ok; - - size = bfd_get_reloc_size (howto); - buf = (bfd_byte *) bfd_zmalloc (size); - if (buf == NULL) - return false; - - rstat = _bfd_relocate_contents (howto, output_bfd, - link_order->u.reloc.p->addend, buf); - switch (rstat) - { - case bfd_reloc_ok: - break; - default: - case bfd_reloc_outofrange: - abort (); - case bfd_reloc_overflow: - if (! ((*finfo->info->callbacks->reloc_overflow) - (finfo->info, - (link_order->type == bfd_section_reloc_link_order - ? bfd_section_name (output_bfd, - link_order->u.reloc.p->u.section) - : link_order->u.reloc.p->u.name), - howto->name, link_order->u.reloc.p->addend, - (bfd *) NULL, (asection *) NULL, (bfd_vma) 0))) - { - free (buf); - return false; - } - break; - } - ok = bfd_set_section_contents (output_bfd, output_section, (PTR) buf, - (file_ptr) link_order->offset, size); - free (buf); - if (! ok) - return false; - } - - /* Store the reloc information in the right place. It will get - swapped and written out at the end of the final_link routine. */ - - irel = (finfo->section_info[output_section->target_index].relocs - + output_section->reloc_count); - rel_hash_ptr = (finfo->section_info[output_section->target_index].rel_hashes - + output_section->reloc_count); - - memset (irel, 0, sizeof (struct internal_reloc)); - *rel_hash_ptr = NULL; - - irel->r_vaddr = output_section->vma + link_order->offset; - - if (link_order->type == bfd_section_reloc_link_order) - { - /* We need to somehow locate a symbol in the right section. The - symbol must either have a value of zero, or we must adjust - the addend by the value of the symbol. FIXME: Write this - when we need it. The old linker couldn't handle this anyhow. */ - abort (); - *rel_hash_ptr = NULL; - irel->r_symndx = 0; - } - else - { - struct coff_link_hash_entry *h; - - h = ((struct coff_link_hash_entry *) - bfd_wrapped_link_hash_lookup (output_bfd, finfo->info, - link_order->u.reloc.p->u.name, - false, false, true)); - if (h != NULL) - { - if (h->indx >= 0) - irel->r_symndx = h->indx; - else - { - /* Set the index to -2 to force this symbol to get - written out. */ - h->indx = -2; - *rel_hash_ptr = h; - irel->r_symndx = 0; - } - } - else - { - if (! ((*finfo->info->callbacks->unattached_reloc) - (finfo->info, link_order->u.reloc.p->u.name, (bfd *) NULL, - (asection *) NULL, (bfd_vma) 0))) - return false; - irel->r_symndx = 0; - } - } - - /* FIXME: Is this always right? */ - irel->r_type = howto->type; - - /* r_size is only used on the RS/6000, which needs its own linker - routines anyhow. r_extern is only used for ECOFF. */ - - /* FIXME: What is the right value for r_offset? Is zero OK? */ - - ++output_section->reloc_count; - - return true; -} - -/* A basic reloc handling routine which may be used by processors with - simple relocs. */ - -boolean -_bfd_coff_generic_relocate_section (output_bfd, info, input_bfd, - input_section, contents, relocs, syms, - sections) - bfd *output_bfd; - struct bfd_link_info *info; - bfd *input_bfd; - asection *input_section; - bfd_byte *contents; - struct internal_reloc *relocs; - struct internal_syment *syms; - asection **sections; -{ - struct internal_reloc *rel; - struct internal_reloc *relend; - - rel = relocs; - relend = rel + input_section->reloc_count; - for (; rel < relend; rel++) - { - long symndx; - struct coff_link_hash_entry *h; - struct internal_syment *sym; - bfd_vma addend; - bfd_vma val; - reloc_howto_type *howto; - bfd_reloc_status_type rstat; - - symndx = rel->r_symndx; - - if (symndx == -1) - { - h = NULL; - sym = NULL; - } - else - { - h = obj_coff_sym_hashes (input_bfd)[symndx]; - sym = syms + symndx; - } - - /* COFF treats common symbols in one of two ways. Either the - size of the symbol is included in the section contents, or it - is not. We assume that the size is not included, and force - the rtype_to_howto function to adjust the addend as needed. */ - - if (sym != NULL && sym->n_scnum != 0) - addend = - sym->n_value; - else - addend = 0; - - - howto = bfd_coff_rtype_to_howto (input_bfd, input_section, rel, h, - sym, &addend); - if (howto == NULL) - return false; - - val = 0; - - if (h == NULL) - { - asection *sec; - - if (symndx == -1) - { - sec = bfd_abs_section_ptr; - val = 0; - } - else - { - sec = sections[symndx]; - val = (sec->output_section->vma - + sec->output_offset - + sym->n_value - - sec->vma); - } - } - else - { - if (h->root.type == bfd_link_hash_defined - || h->root.type == bfd_link_hash_defweak) - { - asection *sec; - - sec = h->root.u.def.section; - val = (h->root.u.def.value - + sec->output_section->vma - + sec->output_offset); - } - - else if (! info->relocateable) - { - if (! ((*info->callbacks->undefined_symbol) - (info, h->root.root.string, input_bfd, input_section, - rel->r_vaddr - input_section->vma))) - return false; - } - } - - if (info->base_file) - { - /* Emit a reloc if the backend thinks it needs it. */ - if (sym && pe_data(output_bfd)->in_reloc_p(output_bfd, howto)) - { - /* relocation to a symbol in a section which - isn't absolute - we output the address here - to a file */ - bfd_vma addr = rel->r_vaddr - - input_section->vma - + input_section->output_offset - + input_section->output_section->vma; - if (coff_data(output_bfd)->pe) - addr -= pe_data(output_bfd)->pe_opthdr.ImageBase; - fwrite (&addr, 1,4, (FILE *) info->base_file); - } - } - - rstat = _bfd_final_link_relocate (howto, input_bfd, input_section, - contents, - rel->r_vaddr - input_section->vma, - val, addend); - - switch (rstat) - { - default: - abort (); - case bfd_reloc_ok: - break; - case bfd_reloc_overflow: - { - const char *name; - char buf[SYMNMLEN + 1]; - - if (symndx == -1) - name = "*ABS*"; - else if (h != NULL) - name = h->root.root.string; - else - { - name = _bfd_coff_internal_syment_name (input_bfd, sym, buf); - if (name == NULL) - return false; - } - - if (! ((*info->callbacks->reloc_overflow) - (info, name, howto->name, (bfd_vma) 0, input_bfd, - input_section, rel->r_vaddr - input_section->vma))) - return false; - } - } - } - return true; -} - diff --git a/contrib/gdb/bfd/coffswap.h b/contrib/gdb/bfd/coffswap.h deleted file mode 100644 index ef1b6b3a913e9..0000000000000 --- a/contrib/gdb/bfd/coffswap.h +++ /dev/null @@ -1,807 +0,0 @@ -/* Generic COFF swapping routines, for BFD. - Copyright 1990, 1991, 1992, 1993, 1995 Free Software Foundation, Inc. - Written by Cygnus Support. - -This file is part of BFD, the Binary File Descriptor library. - -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 2 of the License, 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ - -/* This file contains routines used to swap COFF data. It is a header - file because the details of swapping depend on the details of the - structures used by each COFF implementation. This is included by - coffcode.h, as well as by the ECOFF backend. - - Any file which uses this must first include "coff/internal.h" and - "coff/CPU.h". The functions will then be correct for that CPU. */ - -#ifndef IMAGE_BASE -#define IMAGE_BASE 0 -#endif - -#define PUTWORD bfd_h_put_32 -#define PUTHALF bfd_h_put_16 -#define PUTBYTE bfd_h_put_8 - -#ifndef GET_FCN_LNNOPTR -#define GET_FCN_LNNOPTR(abfd, ext) bfd_h_get_32(abfd, (bfd_byte *) ext->x_sym.x_fcnary.x_fcn.x_lnnoptr) -#endif - -#ifndef GET_FCN_ENDNDX -#define GET_FCN_ENDNDX(abfd, ext) bfd_h_get_32(abfd, (bfd_byte *) ext->x_sym.x_fcnary.x_fcn.x_endndx) -#endif - -#ifndef PUT_FCN_LNNOPTR -#define PUT_FCN_LNNOPTR(abfd, in, ext) PUTWORD(abfd, in, (bfd_byte *) ext->x_sym.x_fcnary.x_fcn.x_lnnoptr) -#endif -#ifndef PUT_FCN_ENDNDX -#define PUT_FCN_ENDNDX(abfd, in, ext) PUTWORD(abfd, in, (bfd_byte *) ext->x_sym.x_fcnary.x_fcn.x_endndx) -#endif -#ifndef GET_LNSZ_LNNO -#define GET_LNSZ_LNNO(abfd, ext) bfd_h_get_16(abfd, (bfd_byte *) ext->x_sym.x_misc.x_lnsz.x_lnno) -#endif -#ifndef GET_LNSZ_SIZE -#define GET_LNSZ_SIZE(abfd, ext) bfd_h_get_16(abfd, (bfd_byte *) ext->x_sym.x_misc.x_lnsz.x_size) -#endif -#ifndef PUT_LNSZ_LNNO -#define PUT_LNSZ_LNNO(abfd, in, ext) bfd_h_put_16(abfd, in, (bfd_byte *)ext->x_sym.x_misc.x_lnsz.x_lnno) -#endif -#ifndef PUT_LNSZ_SIZE -#define PUT_LNSZ_SIZE(abfd, in, ext) bfd_h_put_16(abfd, in, (bfd_byte*) ext->x_sym.x_misc.x_lnsz.x_size) -#endif -#ifndef GET_SCN_SCNLEN -#define GET_SCN_SCNLEN(abfd, ext) bfd_h_get_32(abfd, (bfd_byte *) ext->x_scn.x_scnlen) -#endif -#ifndef GET_SCN_NRELOC -#define GET_SCN_NRELOC(abfd, ext) bfd_h_get_16(abfd, (bfd_byte *)ext->x_scn.x_nreloc) -#endif -#ifndef GET_SCN_NLINNO -#define GET_SCN_NLINNO(abfd, ext) bfd_h_get_16(abfd, (bfd_byte *)ext->x_scn.x_nlinno) -#endif -#ifndef PUT_SCN_SCNLEN -#define PUT_SCN_SCNLEN(abfd,in, ext) bfd_h_put_32(abfd, in, (bfd_byte *) ext->x_scn.x_scnlen) -#endif -#ifndef PUT_SCN_NRELOC -#define PUT_SCN_NRELOC(abfd,in, ext) bfd_h_put_16(abfd, in, (bfd_byte *)ext->x_scn.x_nreloc) -#endif -#ifndef PUT_SCN_NLINNO -#define PUT_SCN_NLINNO(abfd,in, ext) bfd_h_put_16(abfd,in, (bfd_byte *) ext->x_scn.x_nlinno) -#endif -#ifndef GET_LINENO_LNNO -#define GET_LINENO_LNNO(abfd, ext) bfd_h_get_16(abfd, (bfd_byte *) (ext->l_lnno)); -#endif -#ifndef PUT_LINENO_LNNO -#define PUT_LINENO_LNNO(abfd,val, ext) bfd_h_put_16(abfd,val, (bfd_byte *) (ext->l_lnno)); -#endif - -/* The f_symptr field in the filehdr is sometimes 64 bits. */ -#ifndef GET_FILEHDR_SYMPTR -#define GET_FILEHDR_SYMPTR bfd_h_get_32 -#endif -#ifndef PUT_FILEHDR_SYMPTR -#define PUT_FILEHDR_SYMPTR bfd_h_put_32 -#endif - -/* Some fields in the aouthdr are sometimes 64 bits. */ -#ifndef GET_AOUTHDR_TSIZE -#define GET_AOUTHDR_TSIZE bfd_h_get_32 -#endif -#ifndef PUT_AOUTHDR_TSIZE -#define PUT_AOUTHDR_TSIZE bfd_h_put_32 -#endif -#ifndef GET_AOUTHDR_DSIZE -#define GET_AOUTHDR_DSIZE bfd_h_get_32 -#endif -#ifndef PUT_AOUTHDR_DSIZE -#define PUT_AOUTHDR_DSIZE bfd_h_put_32 -#endif -#ifndef GET_AOUTHDR_BSIZE -#define GET_AOUTHDR_BSIZE bfd_h_get_32 -#endif -#ifndef PUT_AOUTHDR_BSIZE -#define PUT_AOUTHDR_BSIZE bfd_h_put_32 -#endif -#ifndef GET_AOUTHDR_ENTRY -#define GET_AOUTHDR_ENTRY bfd_h_get_32 -#endif -#ifndef PUT_AOUTHDR_ENTRY -#define PUT_AOUTHDR_ENTRY bfd_h_put_32 -#endif -#ifndef GET_AOUTHDR_TEXT_START -#define GET_AOUTHDR_TEXT_START bfd_h_get_32 -#endif -#ifndef PUT_AOUTHDR_TEXT_START -#define PUT_AOUTHDR_TEXT_START bfd_h_put_32 -#endif -#ifndef GET_AOUTHDR_DATA_START -#define GET_AOUTHDR_DATA_START bfd_h_get_32 -#endif -#ifndef PUT_AOUTHDR_DATA_START -#define PUT_AOUTHDR_DATA_START bfd_h_put_32 -#endif - -/* Some fields in the scnhdr are sometimes 64 bits. */ -#ifndef GET_SCNHDR_PADDR -#define GET_SCNHDR_PADDR bfd_h_get_32 -#endif -#ifndef PUT_SCNHDR_PADDR -#define PUT_SCNHDR_PADDR bfd_h_put_32 -#endif -#ifndef GET_SCNHDR_VADDR -#define GET_SCNHDR_VADDR bfd_h_get_32 -#endif -#ifndef PUT_SCNHDR_VADDR -#define PUT_SCNHDR_VADDR bfd_h_put_32 -#endif -#ifndef GET_SCNHDR_SIZE -#define GET_SCNHDR_SIZE bfd_h_get_32 -#endif -#ifndef PUT_SCNHDR_SIZE -#define PUT_SCNHDR_SIZE bfd_h_put_32 -#endif -#ifndef GET_SCNHDR_SCNPTR -#define GET_SCNHDR_SCNPTR bfd_h_get_32 -#endif -#ifndef PUT_SCNHDR_SCNPTR -#define PUT_SCNHDR_SCNPTR bfd_h_put_32 -#endif -#ifndef GET_SCNHDR_RELPTR -#define GET_SCNHDR_RELPTR bfd_h_get_32 -#endif -#ifndef PUT_SCNHDR_RELPTR -#define PUT_SCNHDR_RELPTR bfd_h_put_32 -#endif -#ifndef GET_SCNHDR_LNNOPTR -#define GET_SCNHDR_LNNOPTR bfd_h_get_32 -#endif -#ifndef PUT_SCNHDR_LNNOPTR -#define PUT_SCNHDR_LNNOPTR bfd_h_put_32 -#endif - -#ifndef NO_COFF_RELOCS - -static void -coff_swap_reloc_in (abfd, src, dst) - bfd *abfd; - PTR src; - PTR dst; -{ - RELOC *reloc_src = (RELOC *) src; - struct internal_reloc *reloc_dst = (struct internal_reloc *) dst; - - reloc_dst->r_vaddr = bfd_h_get_32(abfd, (bfd_byte *)reloc_src->r_vaddr); - reloc_dst->r_symndx = bfd_h_get_signed_32(abfd, (bfd_byte *) reloc_src->r_symndx); - -#ifdef RS6000COFF_C - reloc_dst->r_type = bfd_h_get_8(abfd, reloc_src->r_type); - reloc_dst->r_size = bfd_h_get_8(abfd, reloc_src->r_size); -#else - reloc_dst->r_type = bfd_h_get_16(abfd, (bfd_byte *) reloc_src->r_type); -#endif - -#ifdef SWAP_IN_RELOC_OFFSET - reloc_dst->r_offset = SWAP_IN_RELOC_OFFSET(abfd, - (bfd_byte *) reloc_src->r_offset); -#endif -} - - -static unsigned int -coff_swap_reloc_out (abfd, src, dst) - bfd *abfd; - PTR src; - PTR dst; -{ - struct internal_reloc *reloc_src = (struct internal_reloc *)src; - struct external_reloc *reloc_dst = (struct external_reloc *)dst; - bfd_h_put_32(abfd, reloc_src->r_vaddr, (bfd_byte *) reloc_dst->r_vaddr); - bfd_h_put_32(abfd, reloc_src->r_symndx, (bfd_byte *) reloc_dst->r_symndx); - -#ifdef RS6000COFF_C - bfd_h_put_8 (abfd, reloc_src->r_type, (bfd_byte *) reloc_dst->r_type); - bfd_h_put_8 (abfd, reloc_src->r_size, (bfd_byte *) reloc_dst->r_size); -#else - bfd_h_put_16(abfd, reloc_src->r_type, (bfd_byte *) - reloc_dst->r_type); -#endif - -#ifdef SWAP_OUT_RELOC_OFFSET - SWAP_OUT_RELOC_OFFSET(abfd, - reloc_src->r_offset, - (bfd_byte *) reloc_dst->r_offset); -#endif -#ifdef SWAP_OUT_RELOC_EXTRA - SWAP_OUT_RELOC_EXTRA(abfd,reloc_src, reloc_dst); -#endif - - return sizeof(struct external_reloc); -} - -#endif /* NO_COFF_RELOCS */ - -static void -coff_swap_filehdr_in (abfd, src, dst) - bfd *abfd; - PTR src; - PTR dst; -{ - FILHDR *filehdr_src = (FILHDR *) src; - struct internal_filehdr *filehdr_dst = (struct internal_filehdr *) dst; - filehdr_dst->f_magic = bfd_h_get_16(abfd, (bfd_byte *) filehdr_src->f_magic); - filehdr_dst->f_nscns = bfd_h_get_16(abfd, (bfd_byte *)filehdr_src-> f_nscns); - filehdr_dst->f_timdat = bfd_h_get_32(abfd, (bfd_byte *)filehdr_src-> f_timdat); - filehdr_dst->f_symptr = - GET_FILEHDR_SYMPTR (abfd, (bfd_byte *) filehdr_src->f_symptr); - filehdr_dst->f_nsyms = bfd_h_get_32(abfd, (bfd_byte *)filehdr_src-> f_nsyms); - filehdr_dst->f_opthdr = bfd_h_get_16(abfd, (bfd_byte *)filehdr_src-> f_opthdr); - filehdr_dst->f_flags = bfd_h_get_16(abfd, (bfd_byte *)filehdr_src-> f_flags); -} - -static unsigned int -coff_swap_filehdr_out (abfd, in, out) - bfd *abfd; - PTR in; - PTR out; -{ - struct internal_filehdr *filehdr_in = (struct internal_filehdr *)in; - FILHDR *filehdr_out = (FILHDR *)out; - - bfd_h_put_16(abfd, filehdr_in->f_magic, (bfd_byte *) filehdr_out->f_magic); - bfd_h_put_16(abfd, filehdr_in->f_nscns, (bfd_byte *) filehdr_out->f_nscns); - bfd_h_put_32(abfd, filehdr_in->f_timdat, (bfd_byte *) filehdr_out->f_timdat); - PUT_FILEHDR_SYMPTR (abfd, (bfd_vma) filehdr_in->f_symptr, - (bfd_byte *) filehdr_out->f_symptr); - bfd_h_put_32(abfd, filehdr_in->f_nsyms, (bfd_byte *) filehdr_out->f_nsyms); - bfd_h_put_16(abfd, filehdr_in->f_opthdr, (bfd_byte *) filehdr_out->f_opthdr); - bfd_h_put_16(abfd, filehdr_in->f_flags, (bfd_byte *) filehdr_out->f_flags); - - return sizeof(FILHDR); -} - - -#ifndef NO_COFF_SYMBOLS - -static void -coff_swap_sym_in (abfd, ext1, in1) - bfd *abfd; - PTR ext1; - PTR in1; -{ - SYMENT *ext = (SYMENT *)ext1; - struct internal_syment *in = (struct internal_syment *)in1; - - if( ext->e.e_name[0] == 0) { - in->_n._n_n._n_zeroes = 0; - in->_n._n_n._n_offset = bfd_h_get_32(abfd, (bfd_byte *) ext->e.e.e_offset); - } - else { -#if SYMNMLEN != E_SYMNMLEN - -> Error, we need to cope with truncating or extending SYMNMLEN!; -#else - memcpy(in->_n._n_name, ext->e.e_name, SYMNMLEN); -#endif - } - in->n_value = bfd_h_get_32(abfd, (bfd_byte *) ext->e_value); - in->n_scnum = bfd_h_get_16(abfd, (bfd_byte *) ext->e_scnum); - if (sizeof(ext->e_type) == 2){ - in->n_type = bfd_h_get_16(abfd, (bfd_byte *) ext->e_type); - } - else { - in->n_type = bfd_h_get_32(abfd, (bfd_byte *) ext->e_type); - } - in->n_sclass = bfd_h_get_8(abfd, ext->e_sclass); - in->n_numaux = bfd_h_get_8(abfd, ext->e_numaux); -} - -static unsigned int -coff_swap_sym_out (abfd, inp, extp) - bfd *abfd; - PTR inp; - PTR extp; -{ - struct internal_syment *in = (struct internal_syment *)inp; - SYMENT *ext =(SYMENT *)extp; - if(in->_n._n_name[0] == 0) { - bfd_h_put_32(abfd, 0, (bfd_byte *) ext->e.e.e_zeroes); - bfd_h_put_32(abfd, in->_n._n_n._n_offset, (bfd_byte *) ext->e.e.e_offset); - } - else { -#if SYMNMLEN != E_SYMNMLEN - -> Error, we need to cope with truncating or extending SYMNMLEN!; -#else - memcpy(ext->e.e_name, in->_n._n_name, SYMNMLEN); -#endif - } - bfd_h_put_32(abfd, in->n_value , (bfd_byte *) ext->e_value); - bfd_h_put_16(abfd, in->n_scnum , (bfd_byte *) ext->e_scnum); - if (sizeof(ext->e_type) == 2) - { - bfd_h_put_16(abfd, in->n_type , (bfd_byte *) ext->e_type); - } - else - { - bfd_h_put_32(abfd, in->n_type , (bfd_byte *) ext->e_type); - } - bfd_h_put_8(abfd, in->n_sclass , ext->e_sclass); - bfd_h_put_8(abfd, in->n_numaux , ext->e_numaux); - return sizeof(SYMENT); -} - -static void -coff_swap_aux_in (abfd, ext1, type, class, indx, numaux, in1) - bfd *abfd; - PTR ext1; - int type; - int class; - int indx; - int numaux; - PTR in1; -{ - AUXENT *ext = (AUXENT *)ext1; - union internal_auxent *in = (union internal_auxent *)in1; - - switch (class) { - case C_FILE: - if (ext->x_file.x_fname[0] == 0) { - in->x_file.x_n.x_zeroes = 0; - in->x_file.x_n.x_offset = - bfd_h_get_32(abfd, (bfd_byte *) ext->x_file.x_n.x_offset); - } else { -#if FILNMLEN != E_FILNMLEN - -> Error, we need to cope with truncating or extending FILNMLEN!; -#else - memcpy (in->x_file.x_fname, ext->x_file.x_fname, FILNMLEN); -#endif - } - return; - - /* RS/6000 "csect" auxents */ -#ifdef RS6000COFF_C - case C_EXT: - case C_HIDEXT: - if (indx + 1 == numaux) - { - in->x_csect.x_scnlen.l = bfd_h_get_32 (abfd, ext->x_csect.x_scnlen); - in->x_csect.x_parmhash = bfd_h_get_32 (abfd, - ext->x_csect.x_parmhash); - in->x_csect.x_snhash = bfd_h_get_16 (abfd, ext->x_csect.x_snhash); - /* We don't have to hack bitfields in x_smtyp because it's - defined by shifts-and-ands, which are equivalent on all - byte orders. */ - in->x_csect.x_smtyp = bfd_h_get_8 (abfd, ext->x_csect.x_smtyp); - in->x_csect.x_smclas = bfd_h_get_8 (abfd, ext->x_csect.x_smclas); - in->x_csect.x_stab = bfd_h_get_32 (abfd, ext->x_csect.x_stab); - in->x_csect.x_snstab = bfd_h_get_16 (abfd, ext->x_csect.x_snstab); - return; - } - break; -#endif - - case C_STAT: -#ifdef C_LEAFSTAT - case C_LEAFSTAT: -#endif - case C_HIDDEN: - if (type == T_NULL) { - in->x_scn.x_scnlen = GET_SCN_SCNLEN(abfd, ext); - in->x_scn.x_nreloc = GET_SCN_NRELOC(abfd, ext); - in->x_scn.x_nlinno = GET_SCN_NLINNO(abfd, ext); - return; - } - break; - } - - in->x_sym.x_tagndx.l = bfd_h_get_32(abfd, (bfd_byte *) ext->x_sym.x_tagndx); -#ifndef NO_TVNDX - in->x_sym.x_tvndx = bfd_h_get_16(abfd, (bfd_byte *) ext->x_sym.x_tvndx); -#endif - - if (class == C_BLOCK || ISFCN (type) || ISTAG (class)) - { - in->x_sym.x_fcnary.x_fcn.x_lnnoptr = GET_FCN_LNNOPTR (abfd, ext); - in->x_sym.x_fcnary.x_fcn.x_endndx.l = GET_FCN_ENDNDX (abfd, ext); - } - else - { -#if DIMNUM != E_DIMNUM - #error we need to cope with truncating or extending DIMNUM -#endif - in->x_sym.x_fcnary.x_ary.x_dimen[0] = - bfd_h_get_16 (abfd, (bfd_byte *) ext->x_sym.x_fcnary.x_ary.x_dimen[0]); - in->x_sym.x_fcnary.x_ary.x_dimen[1] = - bfd_h_get_16 (abfd, (bfd_byte *) ext->x_sym.x_fcnary.x_ary.x_dimen[1]); - in->x_sym.x_fcnary.x_ary.x_dimen[2] = - bfd_h_get_16 (abfd, (bfd_byte *) ext->x_sym.x_fcnary.x_ary.x_dimen[2]); - in->x_sym.x_fcnary.x_ary.x_dimen[3] = - bfd_h_get_16 (abfd, (bfd_byte *) ext->x_sym.x_fcnary.x_ary.x_dimen[3]); - } - - if (ISFCN(type)) { - in->x_sym.x_misc.x_fsize = bfd_h_get_32(abfd, (bfd_byte *) ext->x_sym.x_misc.x_fsize); - } - else { - in->x_sym.x_misc.x_lnsz.x_lnno = GET_LNSZ_LNNO(abfd, ext); - in->x_sym.x_misc.x_lnsz.x_size = GET_LNSZ_SIZE(abfd, ext); - } -} - -static unsigned int -coff_swap_aux_out (abfd, inp, type, class, indx, numaux, extp) - bfd *abfd; - PTR inp; - int type; - int class; - int indx; - int numaux; - PTR extp; -{ - union internal_auxent *in = (union internal_auxent *)inp; - AUXENT *ext = (AUXENT *)extp; - - memset((PTR)ext, 0, AUXESZ); - switch (class) { - case C_FILE: - if (in->x_file.x_fname[0] == 0) { - PUTWORD(abfd, 0, (bfd_byte *) ext->x_file.x_n.x_zeroes); - PUTWORD(abfd, - in->x_file.x_n.x_offset, - (bfd_byte *) ext->x_file.x_n.x_offset); - } - else { -#if FILNMLEN != E_FILNMLEN - -> Error, we need to cope with truncating or extending FILNMLEN!; -#else - memcpy (ext->x_file.x_fname, in->x_file.x_fname, FILNMLEN); -#endif - } - return sizeof (AUXENT); - -#ifdef RS6000COFF_C - /* RS/6000 "csect" auxents */ - case C_EXT: - case C_HIDEXT: - if (indx + 1 == numaux) - { - PUTWORD (abfd, in->x_csect.x_scnlen.l, ext->x_csect.x_scnlen); - PUTWORD (abfd, in->x_csect.x_parmhash, ext->x_csect.x_parmhash); - PUTHALF (abfd, in->x_csect.x_snhash, ext->x_csect.x_snhash); - /* We don't have to hack bitfields in x_smtyp because it's - defined by shifts-and-ands, which are equivalent on all - byte orders. */ - PUTBYTE (abfd, in->x_csect.x_smtyp, ext->x_csect.x_smtyp); - PUTBYTE (abfd, in->x_csect.x_smclas, ext->x_csect.x_smclas); - PUTWORD (abfd, in->x_csect.x_stab, ext->x_csect.x_stab); - PUTHALF (abfd, in->x_csect.x_snstab, ext->x_csect.x_snstab); - return sizeof (AUXENT); - } - break; -#endif - - case C_STAT: -#ifdef C_LEAFSTAT - case C_LEAFSTAT: -#endif - case C_HIDDEN: - if (type == T_NULL) { - PUT_SCN_SCNLEN(abfd, in->x_scn.x_scnlen, ext); - PUT_SCN_NRELOC(abfd, in->x_scn.x_nreloc, ext); - PUT_SCN_NLINNO(abfd, in->x_scn.x_nlinno, ext); - return sizeof (AUXENT); - } - break; - } - - PUTWORD(abfd, in->x_sym.x_tagndx.l, (bfd_byte *) ext->x_sym.x_tagndx); -#ifndef NO_TVNDX - bfd_h_put_16(abfd, in->x_sym.x_tvndx , (bfd_byte *) ext->x_sym.x_tvndx); -#endif - - if (class == C_BLOCK || ISFCN (type) || ISTAG (class)) - { - PUT_FCN_LNNOPTR(abfd, in->x_sym.x_fcnary.x_fcn.x_lnnoptr, ext); - PUT_FCN_ENDNDX(abfd, in->x_sym.x_fcnary.x_fcn.x_endndx.l, ext); - } - else - { -#if DIMNUM != E_DIMNUM - #error we need to cope with truncating or extending DIMNUM -#endif - bfd_h_put_16 (abfd, in->x_sym.x_fcnary.x_ary.x_dimen[0], - (bfd_byte *) ext->x_sym.x_fcnary.x_ary.x_dimen[0]); - bfd_h_put_16 (abfd, in->x_sym.x_fcnary.x_ary.x_dimen[1], - (bfd_byte *) ext->x_sym.x_fcnary.x_ary.x_dimen[1]); - bfd_h_put_16 (abfd, in->x_sym.x_fcnary.x_ary.x_dimen[2], - (bfd_byte *) ext->x_sym.x_fcnary.x_ary.x_dimen[2]); - bfd_h_put_16 (abfd, in->x_sym.x_fcnary.x_ary.x_dimen[3], - (bfd_byte *) ext->x_sym.x_fcnary.x_ary.x_dimen[3]); - } - - if (ISFCN (type)) - PUTWORD (abfd, in->x_sym.x_misc.x_fsize, - (bfd_byte *) ext->x_sym.x_misc.x_fsize); - else - { - PUT_LNSZ_LNNO (abfd, in->x_sym.x_misc.x_lnsz.x_lnno, ext); - PUT_LNSZ_SIZE (abfd, in->x_sym.x_misc.x_lnsz.x_size, ext); - } - - return sizeof(AUXENT); -} - -#endif /* NO_COFF_SYMBOLS */ - -#ifndef NO_COFF_LINENOS - -static void -coff_swap_lineno_in (abfd, ext1, in1) - bfd *abfd; - PTR ext1; - PTR in1; -{ - LINENO *ext = (LINENO *)ext1; - struct internal_lineno *in = (struct internal_lineno *)in1; - - in->l_addr.l_symndx = bfd_h_get_32(abfd, (bfd_byte *) ext->l_addr.l_symndx); - in->l_lnno = GET_LINENO_LNNO(abfd, ext); -} - -static unsigned int -coff_swap_lineno_out (abfd, inp, outp) - bfd *abfd; - PTR inp; - PTR outp; -{ - struct internal_lineno *in = (struct internal_lineno *)inp; - struct external_lineno *ext = (struct external_lineno *)outp; - PUTWORD(abfd, in->l_addr.l_symndx, (bfd_byte *) - ext->l_addr.l_symndx); - - PUT_LINENO_LNNO (abfd, in->l_lnno, ext); - return sizeof(struct external_lineno); -} - -#endif /* NO_COFF_LINENOS */ - - -static void -coff_swap_aouthdr_in (abfd, aouthdr_ext1, aouthdr_int1) - bfd *abfd; - PTR aouthdr_ext1; - PTR aouthdr_int1; -{ - AOUTHDR *aouthdr_ext = (AOUTHDR *) aouthdr_ext1; - struct internal_aouthdr *aouthdr_int = (struct internal_aouthdr *)aouthdr_int1; - - aouthdr_int->magic = bfd_h_get_16(abfd, (bfd_byte *) aouthdr_ext->magic); - aouthdr_int->vstamp = bfd_h_get_16(abfd, (bfd_byte *) aouthdr_ext->vstamp); - aouthdr_int->tsize = - GET_AOUTHDR_TSIZE (abfd, (bfd_byte *) aouthdr_ext->tsize); - aouthdr_int->dsize = - GET_AOUTHDR_DSIZE (abfd, (bfd_byte *) aouthdr_ext->dsize); - aouthdr_int->bsize = - GET_AOUTHDR_BSIZE (abfd, (bfd_byte *) aouthdr_ext->bsize); - aouthdr_int->entry = - GET_AOUTHDR_ENTRY (abfd, (bfd_byte *) aouthdr_ext->entry); - aouthdr_int->text_start = - GET_AOUTHDR_TEXT_START (abfd, (bfd_byte *) aouthdr_ext->text_start); - aouthdr_int->data_start = - GET_AOUTHDR_DATA_START (abfd, (bfd_byte *) aouthdr_ext->data_start); - -#ifdef I960 - aouthdr_int->tagentries = bfd_h_get_32(abfd, (bfd_byte *) aouthdr_ext->tagentries); -#endif - -#ifdef APOLLO_M68 - bfd_h_put_32(abfd, aouthdr_int->o_inlib, (bfd_byte *) aouthdr_ext->o_inlib); - bfd_h_put_32(abfd, aouthdr_int->o_sri, (bfd_byte *) aouthdr_ext->o_sri); - bfd_h_put_32(abfd, aouthdr_int->vid[0], (bfd_byte *) aouthdr_ext->vid); - bfd_h_put_32(abfd, aouthdr_int->vid[1], (bfd_byte *) aouthdr_ext->vid + 4); -#endif - - -#ifdef RS6000COFF_C - aouthdr_int->o_toc = bfd_h_get_32(abfd, aouthdr_ext->o_toc); - aouthdr_int->o_snentry = bfd_h_get_16(abfd, aouthdr_ext->o_snentry); - aouthdr_int->o_sntext = bfd_h_get_16(abfd, aouthdr_ext->o_sntext); - aouthdr_int->o_sndata = bfd_h_get_16(abfd, aouthdr_ext->o_sndata); - aouthdr_int->o_sntoc = bfd_h_get_16(abfd, aouthdr_ext->o_sntoc); - aouthdr_int->o_snloader = bfd_h_get_16(abfd, aouthdr_ext->o_snloader); - aouthdr_int->o_snbss = bfd_h_get_16(abfd, aouthdr_ext->o_snbss); - aouthdr_int->o_algntext = bfd_h_get_16(abfd, aouthdr_ext->o_algntext); - aouthdr_int->o_algndata = bfd_h_get_16(abfd, aouthdr_ext->o_algndata); - aouthdr_int->o_modtype = bfd_h_get_16(abfd, aouthdr_ext->o_modtype); - aouthdr_int->o_cputype = bfd_h_get_16(abfd, aouthdr_ext->o_cputype); - aouthdr_int->o_maxstack = bfd_h_get_32(abfd, aouthdr_ext->o_maxstack); - aouthdr_int->o_maxdata = bfd_h_get_32(abfd, aouthdr_ext->o_maxdata); -#endif - -#ifdef MIPSECOFF - aouthdr_int->bss_start = bfd_h_get_32(abfd, aouthdr_ext->bss_start); - aouthdr_int->gp_value = bfd_h_get_32(abfd, aouthdr_ext->gp_value); - aouthdr_int->gprmask = bfd_h_get_32(abfd, aouthdr_ext->gprmask); - aouthdr_int->cprmask[0] = bfd_h_get_32(abfd, aouthdr_ext->cprmask[0]); - aouthdr_int->cprmask[1] = bfd_h_get_32(abfd, aouthdr_ext->cprmask[1]); - aouthdr_int->cprmask[2] = bfd_h_get_32(abfd, aouthdr_ext->cprmask[2]); - aouthdr_int->cprmask[3] = bfd_h_get_32(abfd, aouthdr_ext->cprmask[3]); -#endif - -#ifdef ALPHAECOFF - aouthdr_int->bss_start = bfd_h_get_64(abfd, aouthdr_ext->bss_start); - aouthdr_int->gp_value = bfd_h_get_64(abfd, aouthdr_ext->gp_value); - aouthdr_int->gprmask = bfd_h_get_32(abfd, aouthdr_ext->gprmask); - aouthdr_int->fprmask = bfd_h_get_32(abfd, aouthdr_ext->fprmask); -#endif -} - -static unsigned int -coff_swap_aouthdr_out (abfd, in, out) - bfd *abfd; - PTR in; - PTR out; -{ - struct internal_aouthdr *aouthdr_in = (struct internal_aouthdr *)in; - AOUTHDR *aouthdr_out = (AOUTHDR *)out; - - bfd_h_put_16(abfd, aouthdr_in->magic, (bfd_byte *) aouthdr_out->magic); - bfd_h_put_16(abfd, aouthdr_in->vstamp, (bfd_byte *) aouthdr_out->vstamp); - PUT_AOUTHDR_TSIZE (abfd, aouthdr_in->tsize, (bfd_byte *) aouthdr_out->tsize); - PUT_AOUTHDR_DSIZE (abfd, aouthdr_in->dsize, (bfd_byte *) aouthdr_out->dsize); - PUT_AOUTHDR_BSIZE (abfd, aouthdr_in->bsize, (bfd_byte *) aouthdr_out->bsize); - PUT_AOUTHDR_ENTRY (abfd, aouthdr_in->entry, (bfd_byte *) aouthdr_out->entry); - PUT_AOUTHDR_TEXT_START (abfd, aouthdr_in->text_start, - (bfd_byte *) aouthdr_out->text_start); - PUT_AOUTHDR_DATA_START (abfd, aouthdr_in->data_start, - (bfd_byte *) aouthdr_out->data_start); - -#ifdef I960 - bfd_h_put_32(abfd, aouthdr_in->tagentries, (bfd_byte *) aouthdr_out->tagentries); -#endif - -#ifdef RS6000COFF_C - bfd_h_put_32 (abfd, aouthdr_in->o_toc, aouthdr_out->o_toc); - bfd_h_put_16 (abfd, aouthdr_in->o_snentry, aouthdr_out->o_snentry); - bfd_h_put_16 (abfd, aouthdr_in->o_sntext, aouthdr_out->o_sntext); - bfd_h_put_16 (abfd, aouthdr_in->o_sndata, aouthdr_out->o_sndata); - bfd_h_put_16 (abfd, aouthdr_in->o_sntoc, aouthdr_out->o_sntoc); - bfd_h_put_16 (abfd, aouthdr_in->o_snloader, aouthdr_out->o_snloader); - bfd_h_put_16 (abfd, aouthdr_in->o_snbss, aouthdr_out->o_snbss); - bfd_h_put_16 (abfd, aouthdr_in->o_algntext, aouthdr_out->o_algntext); - bfd_h_put_16 (abfd, aouthdr_in->o_algndata, aouthdr_out->o_algndata); - bfd_h_put_16 (abfd, aouthdr_in->o_modtype, aouthdr_out->o_modtype); - bfd_h_put_16 (abfd, aouthdr_in->o_cputype, aouthdr_out->o_cputype); - bfd_h_put_32 (abfd, aouthdr_in->o_maxstack, aouthdr_out->o_maxstack); - bfd_h_put_32 (abfd, aouthdr_in->o_maxdata, aouthdr_out->o_maxdata); - memset (aouthdr_out->o_resv2, 0, sizeof aouthdr_out->o_resv2); -#endif - -#ifdef MIPSECOFF - bfd_h_put_32(abfd, aouthdr_in->bss_start, (bfd_byte *) aouthdr_out->bss_start); - bfd_h_put_32(abfd, aouthdr_in->gp_value, (bfd_byte *) aouthdr_out->gp_value); - bfd_h_put_32(abfd, aouthdr_in->gprmask, (bfd_byte *) aouthdr_out->gprmask); - bfd_h_put_32(abfd, aouthdr_in->cprmask[0], (bfd_byte *) aouthdr_out->cprmask[0]); - bfd_h_put_32(abfd, aouthdr_in->cprmask[1], (bfd_byte *) aouthdr_out->cprmask[1]); - bfd_h_put_32(abfd, aouthdr_in->cprmask[2], (bfd_byte *) aouthdr_out->cprmask[2]); - bfd_h_put_32(abfd, aouthdr_in->cprmask[3], (bfd_byte *) aouthdr_out->cprmask[3]); -#endif - -#ifdef ALPHAECOFF - /* FIXME: What does bldrev mean? */ - bfd_h_put_16(abfd, (bfd_vma) 2, (bfd_byte *) aouthdr_out->bldrev); - bfd_h_put_16(abfd, (bfd_vma) 0, (bfd_byte *) aouthdr_out->padding); - bfd_h_put_64(abfd, aouthdr_in->bss_start, (bfd_byte *) aouthdr_out->bss_start); - bfd_h_put_64(abfd, aouthdr_in->gp_value, (bfd_byte *) aouthdr_out->gp_value); - bfd_h_put_32(abfd, aouthdr_in->gprmask, (bfd_byte *) aouthdr_out->gprmask); - bfd_h_put_32(abfd, aouthdr_in->fprmask, (bfd_byte *) aouthdr_out->fprmask); -#endif - - return sizeof(AOUTHDR); -} - -static void -coff_swap_scnhdr_in (abfd, ext, in) - bfd *abfd; - PTR ext; - PTR in; -{ - SCNHDR *scnhdr_ext = (SCNHDR *) ext; - struct internal_scnhdr *scnhdr_int = (struct internal_scnhdr *) in; - - memcpy(scnhdr_int->s_name, scnhdr_ext->s_name, sizeof(scnhdr_int->s_name)); - scnhdr_int->s_vaddr = - GET_SCNHDR_VADDR (abfd, (bfd_byte *) scnhdr_ext->s_vaddr); - scnhdr_int->s_paddr = - GET_SCNHDR_PADDR (abfd, (bfd_byte *) scnhdr_ext->s_paddr); - scnhdr_int->s_size = - GET_SCNHDR_SIZE (abfd, (bfd_byte *) scnhdr_ext->s_size); - - scnhdr_int->s_scnptr = - GET_SCNHDR_SCNPTR (abfd, (bfd_byte *) scnhdr_ext->s_scnptr); - scnhdr_int->s_relptr = - GET_SCNHDR_RELPTR (abfd, (bfd_byte *) scnhdr_ext->s_relptr); - scnhdr_int->s_lnnoptr = - GET_SCNHDR_LNNOPTR (abfd, (bfd_byte *) scnhdr_ext->s_lnnoptr); - scnhdr_int->s_flags = bfd_h_get_32(abfd, (bfd_byte *) scnhdr_ext->s_flags); -#if defined(M88) - scnhdr_int->s_nreloc = bfd_h_get_32(abfd, (bfd_byte *) scnhdr_ext->s_nreloc); - scnhdr_int->s_nlnno = bfd_h_get_32(abfd, (bfd_byte *) scnhdr_ext->s_nlnno); -#else - scnhdr_int->s_nreloc = bfd_h_get_16(abfd, (bfd_byte *) scnhdr_ext->s_nreloc); - scnhdr_int->s_nlnno = bfd_h_get_16(abfd, (bfd_byte *) scnhdr_ext->s_nlnno); -#endif -#ifdef I960 - scnhdr_int->s_align = bfd_h_get_32(abfd, (bfd_byte *) scnhdr_ext->s_align); -#endif -} - -static unsigned int -coff_swap_scnhdr_out (abfd, in, out) - bfd *abfd; - PTR in; - PTR out; -{ - struct internal_scnhdr *scnhdr_int = (struct internal_scnhdr *)in; - SCNHDR *scnhdr_ext = (SCNHDR *)out; - unsigned int ret = sizeof (SCNHDR); - - memcpy(scnhdr_ext->s_name, scnhdr_int->s_name, sizeof(scnhdr_int->s_name)); - - PUT_SCNHDR_VADDR (abfd, scnhdr_int->s_vaddr, - (bfd_byte *) scnhdr_ext->s_vaddr); - - - PUT_SCNHDR_PADDR (abfd, scnhdr_int->s_paddr, - (bfd_byte *) scnhdr_ext->s_paddr); - PUT_SCNHDR_SIZE (abfd, scnhdr_int->s_size, - (bfd_byte *) scnhdr_ext->s_size); - - PUT_SCNHDR_SCNPTR (abfd, scnhdr_int->s_scnptr, - (bfd_byte *) scnhdr_ext->s_scnptr); - PUT_SCNHDR_RELPTR (abfd, scnhdr_int->s_relptr, - (bfd_byte *) scnhdr_ext->s_relptr); - PUT_SCNHDR_LNNOPTR (abfd, scnhdr_int->s_lnnoptr, - (bfd_byte *) scnhdr_ext->s_lnnoptr); - PUTWORD(abfd, scnhdr_int->s_flags, (bfd_byte *) scnhdr_ext->s_flags); -#if defined(M88) - PUTWORD(abfd, scnhdr_int->s_nlnno, (bfd_byte *) scnhdr_ext->s_nlnno); - PUTWORD(abfd, scnhdr_int->s_nreloc, (bfd_byte *) scnhdr_ext->s_nreloc); -#else - if (scnhdr_int->s_nlnno <= 0xffff) - PUTHALF(abfd, scnhdr_int->s_nlnno, (bfd_byte *) scnhdr_ext->s_nlnno); - else - { - (*_bfd_error_handler) ("%s: line number overflow: 0x%lx > 0xffff", - bfd_get_filename (abfd), - scnhdr_int->s_nlnno); - bfd_set_error (bfd_error_file_truncated); - PUTHALF (abfd, 0xffff, (bfd_byte *) scnhdr_ext->s_nlnno); - ret = 0; - } - if (scnhdr_int->s_nreloc <= 0xffff) - PUTHALF(abfd, scnhdr_int->s_nreloc, (bfd_byte *) scnhdr_ext->s_nreloc); - else - { - (*_bfd_error_handler) ("%s: reloc overflow: 0x%lx > 0xffff", - bfd_get_filename (abfd), - scnhdr_int->s_nreloc); - bfd_set_error (bfd_error_file_truncated); - PUTHALF (abfd, 0xffff, (bfd_byte *) scnhdr_ext->s_nreloc); - ret = 0; - } -#endif - -#if defined(I960) - PUTWORD(abfd, scnhdr_int->s_align, (bfd_byte *) scnhdr_ext->s_align); -#endif - return ret; -} diff --git a/contrib/gdb/bfd/config.bfd b/contrib/gdb/bfd/config.bfd deleted file mode 100644 index 7757d5fec2991..0000000000000 --- a/contrib/gdb/bfd/config.bfd +++ /dev/null @@ -1,491 +0,0 @@ -# config.bfd -# Convert a canonical host type into a BFD host type. -# Set shell variable targ to canonical target name, and run -# using ``. config.bfd''. -# Sets the following shell variables: -# targ_defvec Default vector for this target -# targ_selvecs Vectors to build for this target -# targ_archs Architectures for this target -# targ_cflags $(CFLAGS) for this target (FIXME: pretty bogus) -# targ_undercore Whether underscores are used: yes or no - -# The binutils c++filt program wants to know whether underscores are -# stripped or not. That is why we set targ_underscore. c++filt uses -# this information to choose a default. This information is -# duplicated in the symbol_leading_char field of the BFD target -# vector, but c++filt does not deal with object files and is not -# linked against libbfd.a. It is not terribly important that c++filt -# get this right; it is just convenient. - -targ_defvec= -targ_selvecs= -targ_cflags= -targ_underscore=no - -targ_cpu=`echo $targ | sed 's/^\(.*\)-\(.*\)-\(.*\)$/\1/'` -case "${targ_cpu}" in -arm*) targ_archs=bfd_arm_arch ;; -hppa*) targ_archs=bfd_hppa_arch ;; -i[345]86) targ_archs=bfd_i386_arch ;; -m68*) targ_archs=bfd_m68k_arch ;; -m88*) targ_archs=bfd_m88k_arch ;; -mips*) targ_archs=bfd_mips_arch ;; -powerpc*) targ_archs="bfd_rs6000_arch bfd_powerpc_arch" ;; -rs6000) targ_archs="bfd_rs6000_arch bfd_powerpc_arch" ;; -sparc*) targ_archs=bfd_sparc_arch ;; -z8k*) targ_archs=bfd_z8k_arch ;; -*) targ_archs=bfd_${targ_cpu}_arch ;; -esac - -# WHEN ADDING ENTRIES TO THIS MATRIX: -# Make sure that the left side always has two dashes. Otherwise you -# can get spurious matches. Even for unambiguous cases, do this as a -# convention, else the table becomes a real mess to understand and maintain. - -case "${targ}" in - alpha-*-netware*) - targ_defvec=ecoffalpha_little_vec - targ_selvecs=nlm32_alpha_vec - ;; - alpha-*-*) - targ_defvec=ecoffalpha_little_vec - ;; - - - arm-*-riscix*) - targ_defvec=riscix_vec - ;; - arm-*-pe*) - targ_defvec=armpe_little_vec - targ_selvecs="armpe_little_vec armpe_big_vec armpei_little_vec armpei_big_vec" - targ_underscore=yes - ;; - arm-*-aout | armel-*-aout) - targ_defvec=aout_arm_little_vec - targ_selvecs=aout_arm_big_vec - ;; - armeb-*-aout) - targ_defvec=aout_arm_big_vec - targ_selvecs=aout_arm_little_vec - ;; - arm-*-coff) - targ_defvec=armcoff_little_vec - targ_selvecs=armcoff_big_vec - targ_underscore=yes - ;; - - a29k-*-ebmon* | a29k-*-udi* | a29k-*-coff* | a29k-*-sym1* | \ - a29k-*-vxworks* | a29k-*-sysv*) - targ_defvec=a29kcoff_big_vec - targ_selvecs=sunos_big_vec - targ_underscore=yes - ;; - a29k-*-aout* | a29k-*-bsd* | a29k-*-vsta*) - targ_defvec=sunos_big_vec - targ_underscore=yes - ;; - - h8300*-*-*) - targ_defvec=h8300coff_vec - targ_underscore=yes - ;; - - h8500-*-*) - targ_defvec=h8500coff_vec - targ_underscore=yes - ;; - - sh-*-*) - targ_defvec=shcoff_vec - targ_selvecs="shcoff_vec shlcoff_vec" - targ_underscore=yes - ;; - - hppa*-*-*elf* | hppa*-*-lites* | hppa*-*-sysv4*) - targ_defvec=bfd_elf32_hppa_vec - ;; - hppa*-*-bsd*) - targ_defvec=som_vec - targ_selvecs=bfd_elf32_hppa_vec - ;; - hppa*-*-hpux* | hppa*-*-hiux*) - targ_defvec=som_vec - ;; - hppa*-*-osf*) - targ_defvec=som_vec - targ_selvecs=bfd_elf32_hppa_vec - ;; - - i[345]86-*-sysv4* | i[345]86-*-unixware | i[345]86-*-solaris2* | \ - i[345]86-*-elf | i[345]86-*-sco*elf*) - targ_defvec=bfd_elf32_i386_vec - targ_selvecs=i386coff_vec - ;; - i[345]86-*-sysv* | i[345]86-*-isc* | i[345]86-*-sco* | i[345]86-*-coff | \ - i[345]86-*-aix* | i[345]86-*-go32*) - targ_defvec=i386coff_vec - ;; - i[345]86-sequent-bsd*) - targ_defvec=i386dynix_vec - targ_underscore=yes - ;; - i[345]86-*-bsd*) - targ_defvec=i386bsd_vec - targ_underscore=yes - ;; - i[345]86-*-freebsd*) - targ_defvec=i386freebsd_vec - targ_selvecs=i386bsd_vec - targ_underscore=yes - ;; - i[345]86-*-netbsd*) - targ_defvec=i386netbsd_vec - targ_selvecs=i386bsd_vec - targ_underscore=yes - ;; - i[345]86-*-netware*) - targ_defvec=bfd_elf32_i386_vec - targ_selvecs="nlm32_i386_vec i386coff_vec i386aout_vec" - ;; - i[345]86-*-linuxaout*) - targ_defvec=i386linux_vec - targ_selvecs=bfd_elf32_i386_vec - targ_underscore=yes - ;; - i[345]86-*-linux*) - targ_defvec=bfd_elf32_i386_vec - targ_selvecs=i386linux_vec - targ_underscore=yes - ;; - i[345]86-*-lynxos*) - targ_defvec=i386lynx_coff_vec - targ_selvecs=i386lynx_aout_vec - ;; - i[345]86-*-gnu*) - targ_defvec=bfd_elf32_i386_vec - targ_selvecs=i386mach3_vec - targ_cflags=-DSTAT_FOR_EXEC - targ_underscore=yes - ;; - i[345]86-*-mach* | i[345]86-*-osf1mk*) - targ_defvec=i386mach3_vec - targ_cflags=-DSTAT_FOR_EXEC - targ_underscore=yes - ;; - i[345]86-*-os9k) - targ_defvec=i386os9k_vec - ;; - i[345]86-*-msdos*) - targ_defvec=i386aout_vec - targ_selvecs=i386msdos_vec - ;; - i[345]86-*-moss*) - targ_defvec=bfd_elf32_i386_vec - targ_selvecs="i386msdos_vec i386aout_vec" - ;; - i[345]86-*-cygwin32 | i[345]86-*-winnt | i[345]86-*-pe) - targ_defvec=i386pe_vec - targ_selvecs="i386pe_vec i386pei_vec" - ;; - i[345]86-none-*) - targ_defvec=i386coff_vec - ;; - i[345]86-*-aout* | i[345]86*-*-vsta*) - targ_defvec=i386aout_vec - ;; - - i860-*-mach3* | i860-*-osf1* | i860-*-coff*) - targ_defvec=i860coff_vec - ;; - i860-*-sysv4* | i860-*-elf*) - targ_defvec=bfd_elf32_i860_vec - ;; - - i960-*-vxworks4* | i960-*-vxworks5.0) - targ_defvec=b_out_vec_little_host - targ_selvecs="b_out_vec_big_host icoff_little_vec icoff_big_vec" - targ_underscore=yes - ;; - i960-*-vxworks5.* | i960-*-coff* | i960-*-sysv*) - targ_defvec=icoff_little_vec - targ_selvecs="icoff_big_vec b_out_vec_little_host b_out_vec_big_host" - targ_underscore=yes - ;; - i960-*-vxworks* | i960-*-aout* | i960-*-bout* | i960-*-nindy*) - targ_defvec=b_out_vec_little_host - targ_selvecs="b_out_vec_big_host icoff_little_vec icoff_big_vec" - targ_underscore=yes - ;; - - m68*-apollo-*) - targ_defvec=apollocoff_vec - ;; - m68*-bull-sysv*) - targ_defvec=m68kcoffun_vec - targ_underscore=yes - ;; - m68*-hp-bsd*) - targ_defvec=hp300bsd_vec - targ_underscore=yes - ;; - m68*-*-aout*) - targ_defvec=aout0_big_vec - # We include this here, rather than making a separate cisco - # configuration, so that cisco-core.c gets routinely tested at - # least for compilation. - targ_selvecs=cisco_core_vec - targ_underscore=yes - ;; - m68*-*-elf* | m68*-*-sysv4*) - targ_defvec=bfd_elf32_m68k_vec - targ_selvecs=m68kcoff_vec - ;; - m68*-*-coff* | m68*-*-sysv*) - targ_defvec=m68kcoff_vec - targ_selvecs="m68kcoff_vec versados_vec" - ;; - m68*-*-hpux*) - targ_defvec=hp300hpux_vec - targ_underscore=yes - ;; - m68*-*-linuxaout*) - targ_defvec=m68klinux_vec - targ_selvecs=bfd_elf32_m68k_vec - targ_underscore=yes - ;; - m68*-*-linux*) - targ_defvec=bfd_elf32_m68k_vec - targ_selvecs=m68klinux_vec - ;; - m68*-*-lynxos*) - targ_defvec=m68klynx_coff_vec - targ_selvecs=m68klynx_aout_vec - ;; - m68*-hp*-netbsd*) - targ_defvec=m68k4knetbsd_vec - targ_selvecs="m68knetbsd_vec hp300bsd_vec sunos_big_vec" - targ_underscore=yes - ;; - m68*-*-netbsd*) - targ_defvec=m68knetbsd_vec - targ_selvecs="m68k4knetbsd_vec hp300bsd_vec sunos_big_vec" - targ_underscore=yes - ;; - m68*-*-sunos* | m68*-*-os68k* | m68*-*-vxworks* | m68*-netx-* | \ - m68*-*-bsd* | m68*-*-vsta*) - targ_defvec=sunos_big_vec - targ_underscore=yes - ;; - m68*-ericsson-*) - targ_defvec=sunos_big_vec - targ_selvecs="m68kcoff_vec tekhex_vec" - targ_underscore=yes - ;; - m68*-cbm-*) - targ_defvec=bfd_elf32_m68k_vec - targ_selvecs=m68kcoff_vec - ;; - m68*-apple-aux*) - targ_defvec=m68kaux_coff_vec - ;; - m68*-*-psos*) - targ_defvec=bfd_elf32_m68k_vec - targ_selvecs=ieee_vec - targ_underscore=yes - ;; - - m88*-harris-cxux* | m88*-*-dgux* | m88*-*-sysv4*) - targ_defvec=bfd_elf32_m88k_vec - targ_selvecs=m88kbcs_vec - ;; - m88*-*-mach3*) - targ_defvec=m88kmach3_vec - targ_cflags=-DSTAT_FOR_EXEC - ;; - m88*-*-*) - targ_defvec=m88kbcs_vec - targ_underscore=yes - ;; - - mips*-big-*) - targ_defvec=ecoff_big_vec - targ_selvecs=ecoff_little_vec - ;; - mips-dec-netbsd*) - targ_defvec=bfd_elf32_littlemips_vec - targ_selvecs=bfd_elf32_bigmips_vec - ;; - mips*-dec-bsd*) - targ_defvec=aout_mips_little_vec - targ_underscore=yes - ;; - mips*-dec-mach3*) - targ_defvec=aout_mips_little_vec - targ_cflags=-DSTAT_FOR_EXEC - ;; - mips*-dec-* | mips*el-*-ecoff*) - targ_defvec=ecoff_little_vec - targ_selvecs=ecoff_big_vec - ;; - mips*-*-ecoff*) - targ_defvec=ecoff_big_vec - targ_selvecs=ecoff_little_vec - ;; - mips*-*-irix5*) - targ_defvec=bfd_elf32_bigmips_vec - targ_selvecs="bfd_elf32_littlemips_vec ecoff_big_vec ecoff_little_vec" - ;; - mips*-sgi-* | mips*-*-bsd*) - targ_defvec=ecoff_big_vec - targ_selvecs=ecoff_little_vec - ;; - mips*-*-mach3*) - targ_defvec=aout_mips_little_vec - targ_cflags=-DSTAT_FOR_EXEC - ;; - mips*-*-sysv4*) - targ_defvec=bfd_elf32_bigmips_vec - targ_selvecs="bfd_elf32_littlemips_vec ecoff_big_vec ecoff_little_vec" - ;; - mips*-*-sysv* | mips*-*-riscos*) - targ_defvec=ecoff_big_vec - targ_selvecs=ecoff_little_vec - ;; - mips*el-*-elf*) - targ_defvec=bfd_elf32_littlemips_vec - targ_selvecs=bfd_elf32_bigmips_vec - ;; - mips*-*-elf*) - targ_defvec=bfd_elf32_bigmips_vec - targ_selvecs=bfd_elf32_littlemips_vec - ;; - - ns32k-pc532-mach* | ns32k-pc532-ux*) - targ_defvec=pc532machaout_vec - targ_underscore=yes - ;; - ns32k-*-netbsd* | ns32k-*-lites*) - targ_defvec=pc532netbsd_vec - targ_underscore=yes - ;; - - powerpc-*-aix*) - targ_defvec=rs6000coff_vec - ;; - powerpc-*-elf* | powerpc-*-sysv4* | powerpc-*-eabi* | powerpc-*-solaris2*) - targ_defvec=bfd_elf32_powerpc_vec - targ_selvecs="rs6000coff_vec bfd_elf32_powerpcle_vec bfd_powerpcle_pei_vec bfd_powerpc_pei_vec bfd_powerpcle_pe_vec bfd_powerpc_pe_vec" - ;; - powerpc-*-macos* | powerpc-*-mpw*) - targ_defvec=pmac_xcoff_vec - ;; - powerpc-*-netware*) - targ_defvec=bfd_elf32_powerpc_vec - targ_selvecs="nlm32_powerpc_vec rs6000coff_vec" - ;; - powerpcle-*-elf* | powerpcle-*-sysv4* | powerpcle-*-eabi* | \ - powerpcle-*-solaris2*) - targ_defvec=bfd_elf32_powerpcle_vec - targ_selvecs="rs6000coff_vec bfd_elf32_powerpc_vec bfd_powerpcle_pei_vec bfd_powerpc_pei_vec bfd_powerpcle_pe_vec bfd_powerpc_pe_vec" - ;; - - powerpcle-*-pe | powerpcle-*-winnt* | powerpcle-*-cygwin32) - targ_defvec=bfd_powerpcle_pe_vec - targ_selvecs="bfd_powerpcle_pei_vec bfd_powerpc_pei_vec bfd_powerpcle_pe_vec bfd_powerpc_pe_vec" - ;; - - rs6000-*-*) - targ_defvec=rs6000coff_vec - ;; - - sparc-*-lynxos*) - targ_defvec=sparclynx_coff_vec - targ_selvecs=sparclynx_aout_vec - ;; - sparc-*-netbsd*) - targ_defvec=sparcnetbsd_vec - targ_underscore=yes - ;; - sparc-*-elf* | sparc-*-sysv4* | sparc-*-solaris2*) - targ_defvec=bfd_elf32_sparc_vec - targ_selvecs=sunos_big_vec - ;; - sparc64-*-aout*) - targ_defvec=sunos_big_vec - targ_underscore=yes - ;; - sparc64-*-elf*) - targ_defvec=bfd_elf64_sparc_vec - targ_selvecs=bfd_elf32_sparc_vec - ;; - sparc64-*-solaris2* | sparc64-*-sysv4*) - targ_defvec=bfd_elf32_sparc_vec - # Adding 64 bit support by default causes things like objdump to - # print addresses as 64 bits. - #targ_selvecs=bfd_elf64_sparc_vec - ;; - sparc-*-netware*) - targ_defvec=bfd_elf32_sparc_vec - targ_selvecs="nlm32_sparc_vec sunos_big_vec" - ;; - sparc*-*-coff*) - targ_defvec=sparccoff_vec - ;; - sparc*-*-*) - targ_defvec=sunos_big_vec - targ_underscore=yes - ;; - - tahoe-*-*) - targ_defvec=host_aout_vec - targ_underscore=yes - ;; - - vax-*-vms*) - echo 1>&2 "*** BFD does not support target ${targ}." - echo 1>&2 "*** Look in bfd/config.bfd for supported targets." - exit 1 - ;; - vax-*-*) - targ_defvec=host_aout_vec - targ_underscore=yes - ;; - - we32k-*-*) - targ_defvec=we32kcoff_vec - ;; - - w65-*-*) - targ_defvec=w65_vec - ;; - - z8k*-*-*) - targ_defvec=z8kcoff_vec - targ_underscore=yes - ;; - - *-*-ieee*) - targ_defvec=ieee_vec - ;; - - *-adobe-*) - targ_defvec=a_aout_adobe_vec - targ_underscore=yes - ;; - - *-sony-*) - targ_defvec=newsos3_vec - targ_underscore=yes - ;; - - *-tandem-*) - targ_defvec=m68kcoff_vec - targ_selvecs=ieee_vec - ;; - - *) - echo 1>&2 "*** BFD does not support target ${targ}." - echo 1>&2 "*** Look in bfd/config.bfd for supported targets." - exit 1 - ;; -esac diff --git a/contrib/gdb/bfd/config.in b/contrib/gdb/bfd/config.in deleted file mode 100644 index dd4f968e79403..0000000000000 --- a/contrib/gdb/bfd/config.in +++ /dev/null @@ -1,67 +0,0 @@ -/* config.in. Generated automatically from configure.in by autoheader. */ - -/* Whether malloc must be declared even if <stdlib.h> is included. */ -#undef NEED_DECLARATION_MALLOC - -/* Whether free must be declared even if <stdlib.h> is included. */ -#undef NEED_DECLARATION_FREE - -/* Define if you have a working `mmap' system call. */ -#undef HAVE_MMAP - -/* Define if you can safely include both <sys/time.h> and <time.h>. */ -#undef TIME_WITH_SYS_TIME - -/* Do we need to use the b modifier when opening binary files? */ -#undef USE_BINARY_FOPEN - -/* Name of host specific header file to include in trad-core.c. */ -#undef TRAD_HEADER - -/* Define only if <sys/procfs.h> is available *and* it defines prstatus_t. */ -#undef HAVE_SYS_PROCFS_H - -/* Do we really want to use mmap if it's available? */ -#undef USE_MMAP - -/* Define if you have the fcntl function. */ -#undef HAVE_FCNTL - -/* Define if you have the getpagesize function. */ -#undef HAVE_GETPAGESIZE - -/* Define if you have the madvise function. */ -#undef HAVE_MADVISE - -/* Define if you have the mprotect function. */ -#undef HAVE_MPROTECT - -/* Define if you have the valloc function. */ -#undef HAVE_VALLOC - -/* Define if you have the <fcntl.h> header file. */ -#undef HAVE_FCNTL_H - -/* Define if you have the <stddef.h> header file. */ -#undef HAVE_STDDEF_H - -/* Define if you have the <stdlib.h> header file. */ -#undef HAVE_STDLIB_H - -/* Define if you have the <string.h> header file. */ -#undef HAVE_STRING_H - -/* Define if you have the <strings.h> header file. */ -#undef HAVE_STRINGS_H - -/* Define if you have the <sys/file.h> header file. */ -#undef HAVE_SYS_FILE_H - -/* Define if you have the <sys/time.h> header file. */ -#undef HAVE_SYS_TIME_H - -/* Define if you have the <time.h> header file. */ -#undef HAVE_TIME_H - -/* Define if you have the <unistd.h> header file. */ -#undef HAVE_UNISTD_H diff --git a/contrib/gdb/bfd/configure b/contrib/gdb/bfd/configure deleted file mode 100644 index 5db14db15a9e7..0000000000000 --- a/contrib/gdb/bfd/configure +++ /dev/null @@ -1,2439 +0,0 @@ -#! /bin/sh - -# Guess values for system-dependent variables and create Makefiles. -# Generated automatically using autoconf version 2.8 -# Copyright (C) 1992, 1993, 1994 Free Software Foundation, Inc. -# -# This configure script is free software; the Free Software Foundation -# gives unlimited permission to copy, distribute and modify it. - -# Defaults: -ac_help= -ac_default_prefix=/usr/local -# Any additions from configure.in: -ac_help="$ac_help - --enable-64-bit-bfd 64-bit support (on hosts with narrower word sizes)" -ac_help="$ac_help - --enable-targets alternative target configurations" -ac_help="$ac_help - --enable-shared build shared BFD library" -ac_help="$ac_help - --enable-commonbfdlib build shared BFD/opcodes/libiberty library" -ac_help="$ac_help - --with-mmap try using mmap for BFD input files if available" - -# Initialize some variables set by options. -# The variables have the same names as the options, with -# dashes changed to underlines. -build=NONE -cache_file=./config.cache -exec_prefix=NONE -host=NONE -no_create= -nonopt=NONE -no_recursion= -prefix=NONE -program_prefix=NONE -program_suffix=NONE -program_transform_name=s,x,x, -silent= -site= -srcdir= -target=NONE -verbose= -x_includes=NONE -x_libraries=NONE -bindir='${exec_prefix}/bin' -sbindir='${exec_prefix}/sbin' -libexecdir='${exec_prefix}/libexec' -datadir='${prefix}/share' -sysconfdir='${prefix}/etc' -sharedstatedir='${prefix}/com' -localstatedir='${prefix}/var' -libdir='${exec_prefix}/lib' -includedir='${prefix}/include' -oldincludedir='/usr/include' -infodir='${prefix}/info' -mandir='${prefix}/man' - -# Initialize some other variables. -subdirs= -MFLAGS= MAKEFLAGS= - -ac_prev= -for ac_option -do - - # If the previous option needs an argument, assign it. - if test -n "$ac_prev"; then - eval "$ac_prev=\$ac_option" - ac_prev= - continue - fi - - case "$ac_option" in - -*=*) ac_optarg=`echo "$ac_option" | sed 's/[-_a-zA-Z0-9]*=//'` ;; - *) ac_optarg= ;; - esac - - # Accept the important Cygnus configure options, so we can diagnose typos. - - case "$ac_option" in - - -bindir | --bindir | --bindi | --bind | --bin | --bi) - ac_prev=bindir ;; - -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*) - bindir="$ac_optarg" ;; - - -build | --build | --buil | --bui | --bu) - ac_prev=build ;; - -build=* | --build=* | --buil=* | --bui=* | --bu=*) - build="$ac_optarg" ;; - - -cache-file | --cache-file | --cache-fil | --cache-fi \ - | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c) - ac_prev=cache_file ;; - -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \ - | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*) - cache_file="$ac_optarg" ;; - - -datadir | --datadir | --datadi | --datad | --data | --dat | --da) - ac_prev=datadir ;; - -datadir=* | --datadir=* | --datadi=* | --datad=* | --data=* | --dat=* \ - | --da=*) - datadir="$ac_optarg" ;; - - -disable-* | --disable-*) - ac_feature=`echo $ac_option|sed -e 's/-*disable-//'` - # Reject names that are not valid shell variable names. - if test -n "`echo $ac_feature| sed 's/[-a-zA-Z0-9_]//g'`"; then - { echo "configure: error: $ac_feature: invalid feature name" 1>&2; exit 1; } - fi - ac_feature=`echo $ac_feature| sed 's/-/_/g'` - eval "enable_${ac_feature}=no" ;; - - -enable-* | --enable-*) - ac_feature=`echo $ac_option|sed -e 's/-*enable-//' -e 's/=.*//'` - # Reject names that are not valid shell variable names. - if test -n "`echo $ac_feature| sed 's/[-_a-zA-Z0-9]//g'`"; then - { echo "configure: error: $ac_feature: invalid feature name" 1>&2; exit 1; } - fi - ac_feature=`echo $ac_feature| sed 's/-/_/g'` - case "$ac_option" in - *=*) ;; - *) ac_optarg=yes ;; - esac - eval "enable_${ac_feature}='$ac_optarg'" ;; - - -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \ - | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \ - | --exec | --exe | --ex) - ac_prev=exec_prefix ;; - -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \ - | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \ - | --exec=* | --exe=* | --ex=*) - exec_prefix="$ac_optarg" ;; - - -gas | --gas | --ga | --g) - # Obsolete; use --with-gas. - with_gas=yes ;; - - -help | --help | --hel | --he) - # Omit some internal or obsolete options to make the list less imposing. - # This message is too long to be a string in the A/UX 3.1 sh. - cat << EOF -Usage: configure [options] [host] -Options: [defaults in brackets after descriptions] -Configuration: - --cache-file=FILE cache test results in FILE - --help print this message - --no-create do not create output files - --quiet, --silent do not print \`checking...' messages - --version print the version of autoconf that created configure -Directory and file names: - --prefix=PREFIX install architecture-independent files in PREFIX - [$ac_default_prefix] - --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX - [same as prefix] - --bindir=DIR user executables in DIR [EPREFIX/bin] - --sbindir=DIR system admin executables in DIR [EPREFIX/sbin] - --libexecdir=DIR program executables in DIR [EPREFIX/libexec] - --datadir=DIR read-only architecture-independent data in DIR - [PREFIX/share] - --sysconfdir=DIR read-only single-machine data in DIR [PREFIX/etc] - --sharedstatedir=DIR modifiable architecture-independent data in DIR - [PREFIX/com] - --localstatedir=DIR modifiable single-machine data in DIR [PREFIX/var] - --libdir=DIR object code libraries in DIR [EPREFIX/lib] - --includedir=DIR C header files in DIR [PREFIX/include] - --oldincludedir=DIR C header files for non-gcc in DIR [/usr/include] - --infodir=DIR info documentation in DIR [PREFIX/info] - --mandir=DIR man documentation in DIR [PREFIX/man] - --srcdir=DIR find the sources in DIR [configure dir or ..] - --program-prefix=PREFIX prepend PREFIX to installed program names - --program-suffix=SUFFIX append SUFFIX to installed program names - --program-transform-name=PROGRAM - run sed PROGRAM on installed program names -EOF - cat << EOF -Host type: - --build=BUILD configure for building on BUILD [BUILD=HOST] - --host=HOST configure for HOST [guessed] - --target=TARGET configure for TARGET [TARGET=HOST] -Features and packages: - --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no) - --enable-FEATURE[=ARG] include FEATURE [ARG=yes] - --with-PACKAGE[=ARG] use PACKAGE [ARG=yes] - --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no) - --x-includes=DIR X include files are in DIR - --x-libraries=DIR X library files are in DIR -EOF - if test -n "$ac_help"; then - echo "--enable and --with options recognized:$ac_help" - fi - exit 0 ;; - - -host | --host | --hos | --ho) - ac_prev=host ;; - -host=* | --host=* | --hos=* | --ho=*) - host="$ac_optarg" ;; - - -includedir | --includedir | --includedi | --included | --include \ - | --includ | --inclu | --incl | --inc) - ac_prev=includedir ;; - -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \ - | --includ=* | --inclu=* | --incl=* | --inc=*) - includedir="$ac_optarg" ;; - - -infodir | --infodir | --infodi | --infod | --info | --inf) - ac_prev=infodir ;; - -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*) - infodir="$ac_optarg" ;; - - -libdir | --libdir | --libdi | --libd) - ac_prev=libdir ;; - -libdir=* | --libdir=* | --libdi=* | --libd=*) - libdir="$ac_optarg" ;; - - -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \ - | --libexe | --libex | --libe) - ac_prev=libexecdir ;; - -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \ - | --libexe=* | --libex=* | --libe=*) - libexecdir="$ac_optarg" ;; - - -localstatedir | --localstatedir | --localstatedi | --localstated \ - | --localstate | --localstat | --localsta | --localst \ - | --locals | --local | --loca | --loc | --lo) - ac_prev=localstatedir ;; - -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \ - | --localstate=* | --localstat=* | --localsta=* | --localst=* \ - | --locals=* | --local=* | --loca=* | --loc=* | --lo=*) - localstatedir="$ac_optarg" ;; - - -mandir | --mandir | --mandi | --mand | --man | --ma | --m) - ac_prev=mandir ;; - -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*) - mandir="$ac_optarg" ;; - - -nfp | --nfp | --nf) - # Obsolete; use --without-fp. - with_fp=no ;; - - -no-create | --no-create | --no-creat | --no-crea | --no-cre \ - | --no-cr | --no-c) - no_create=yes ;; - - -no-recursion | --no-recursion | --no-recursio | --no-recursi \ - | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) - no_recursion=yes ;; - - -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \ - | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \ - | --oldin | --oldi | --old | --ol | --o) - ac_prev=oldincludedir ;; - -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \ - | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \ - | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*) - oldincludedir="$ac_optarg" ;; - - -prefix | --prefix | --prefi | --pref | --pre | --pr | --p) - ac_prev=prefix ;; - -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*) - prefix="$ac_optarg" ;; - - -program-prefix | --program-prefix | --program-prefi | --program-pref \ - | --program-pre | --program-pr | --program-p) - ac_prev=program_prefix ;; - -program-prefix=* | --program-prefix=* | --program-prefi=* \ - | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*) - program_prefix="$ac_optarg" ;; - - -program-suffix | --program-suffix | --program-suffi | --program-suff \ - | --program-suf | --program-su | --program-s) - ac_prev=program_suffix ;; - -program-suffix=* | --program-suffix=* | --program-suffi=* \ - | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*) - program_suffix="$ac_optarg" ;; - - -program-transform-name | --program-transform-name \ - | --program-transform-nam | --program-transform-na \ - | --program-transform-n | --program-transform- \ - | --program-transform | --program-transfor \ - | --program-transfo | --program-transf \ - | --program-trans | --program-tran \ - | --progr-tra | --program-tr | --program-t) - ac_prev=program_transform_name ;; - -program-transform-name=* | --program-transform-name=* \ - | --program-transform-nam=* | --program-transform-na=* \ - | --program-transform-n=* | --program-transform-=* \ - | --program-transform=* | --program-transfor=* \ - | --program-transfo=* | --program-transf=* \ - | --program-trans=* | --program-tran=* \ - | --progr-tra=* | --program-tr=* | --program-t=*) - program_transform_name="$ac_optarg" ;; - - -q | -quiet | --quiet | --quie | --qui | --qu | --q \ - | -silent | --silent | --silen | --sile | --sil) - silent=yes ;; - - -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb) - ac_prev=sbindir ;; - -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \ - | --sbi=* | --sb=*) - sbindir="$ac_optarg" ;; - - -sharedstatedir | --sharedstatedir | --sharedstatedi \ - | --sharedstated | --sharedstate | --sharedstat | --sharedsta \ - | --sharedst | --shareds | --shared | --share | --shar \ - | --sha | --sh) - ac_prev=sharedstatedir ;; - -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \ - | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \ - | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \ - | --sha=* | --sh=*) - sharedstatedir="$ac_optarg" ;; - - -site | --site | --sit) - ac_prev=site ;; - -site=* | --site=* | --sit=*) - site="$ac_optarg" ;; - - -srcdir | --srcdir | --srcdi | --srcd | --src | --sr) - ac_prev=srcdir ;; - -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*) - srcdir="$ac_optarg" ;; - - -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \ - | --syscon | --sysco | --sysc | --sys | --sy) - ac_prev=sysconfdir ;; - -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \ - | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*) - sysconfdir="$ac_optarg" ;; - - -target | --target | --targe | --targ | --tar | --ta | --t) - ac_prev=target ;; - -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*) - target="$ac_optarg" ;; - - -v | -verbose | --verbose | --verbos | --verbo | --verb) - verbose=yes ;; - - -version | --version | --versio | --versi | --vers) - echo "configure generated by autoconf version 2.8" - exit 0 ;; - - -with-* | --with-*) - ac_package=`echo $ac_option|sed -e 's/-*with-//' -e 's/=.*//'` - # Reject names that are not valid shell variable names. - if test -n "`echo $ac_package| sed 's/[-_a-zA-Z0-9]//g'`"; then - { echo "configure: error: $ac_package: invalid package name" 1>&2; exit 1; } - fi - ac_package=`echo $ac_package| sed 's/-/_/g'` - case "$ac_option" in - *=*) ;; - *) ac_optarg=yes ;; - esac - eval "with_${ac_package}='$ac_optarg'" ;; - - -without-* | --without-*) - ac_package=`echo $ac_option|sed -e 's/-*without-//'` - # Reject names that are not valid shell variable names. - if test -n "`echo $ac_package| sed 's/[-a-zA-Z0-9_]//g'`"; then - { echo "configure: error: $ac_package: invalid package name" 1>&2; exit 1; } - fi - ac_package=`echo $ac_package| sed 's/-/_/g'` - eval "with_${ac_package}=no" ;; - - --x) - # Obsolete; use --with-x. - with_x=yes ;; - - -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \ - | --x-incl | --x-inc | --x-in | --x-i) - ac_prev=x_includes ;; - -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \ - | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*) - x_includes="$ac_optarg" ;; - - -x-libraries | --x-libraries | --x-librarie | --x-librari \ - | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l) - ac_prev=x_libraries ;; - -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \ - | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*) - x_libraries="$ac_optarg" ;; - - -*) { echo "configure: error: $ac_option: invalid option; use --help to show usage" 1>&2; exit 1; } - ;; - - *) - if test -n "`echo $ac_option| sed 's/[-a-z0-9.]//g'`"; then - echo "configure: warning: $ac_option: invalid host type" 1>&2 - fi - if test "x$nonopt" != xNONE; then - { echo "configure: error: can only configure for one host and one target at a time" 1>&2; exit 1; } - fi - nonopt="$ac_option" - ;; - - esac -done - -if test -n "$ac_prev"; then - { echo "configure: error: missing argument to --`echo $ac_prev | sed 's/_/-/g'`" 1>&2; exit 1; } -fi - -trap 'rm -fr conftest* confdefs* core core.* *.core $ac_clean_files; exit 1' 1 2 15 - -# File descriptor usage: -# 0 standard input -# 1 file creation -# 2 errors and warnings -# 3 some systems may open it to /dev/tty -# 4 used on the Kubota Titan -# 6 checking for... messages and results -# 5 compiler messages saved in config.log -if test "$silent" = yes; then - exec 6>/dev/null -else - exec 6>&1 -fi -exec 5>./config.log - -echo "\ -This file contains any messages produced by compilers while -running configure, to aid debugging if configure makes a mistake. -" 1>&5 - -# Strip out --no-create and --no-recursion so they do not pile up. -# Also quote any args containing shell metacharacters. -ac_configure_args= -for ac_arg -do - case "$ac_arg" in - -no-create | --no-create | --no-creat | --no-crea | --no-cre \ - | --no-cr | --no-c) ;; - -no-recursion | --no-recursion | --no-recursio | --no-recursi \ - | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) ;; - *" "*|*" "*|*[\[\]\~\#\$\^\&\*\(\)\{\}\\\|\;\<\>\?]*) - ac_configure_args="$ac_configure_args '$ac_arg'" ;; - *) ac_configure_args="$ac_configure_args $ac_arg" ;; - esac -done - -# NLS nuisances. -# Only set LANG and LC_ALL to C if already set. -# These must not be set unconditionally because not all systems understand -# e.g. LANG=C (notably SCO). -if test "${LC_ALL+set}" = set; then LC_ALL=C; export LC_ALL; fi -if test "${LANG+set}" = set; then LANG=C; export LANG; fi - -# confdefs.h avoids OS command line length limits that DEFS can exceed. -rm -rf conftest* confdefs.h -# AIX cpp loses on an empty file, so make sure it contains at least a newline. -echo > confdefs.h - -# A filename unique to this package, relative to the directory that -# configure is in, which we can look for to find out if srcdir is correct. -ac_unique_file=libbfd.c - -# Find the source files, if location was not specified. -if test -z "$srcdir"; then - ac_srcdir_defaulted=yes - # Try the directory containing this script, then its parent. - ac_prog=$0 - ac_confdir=`echo $ac_prog|sed 's%/[^/][^/]*$%%'` - test "x$ac_confdir" = "x$ac_prog" && ac_confdir=. - srcdir=$ac_confdir - if test ! -r $srcdir/$ac_unique_file; then - srcdir=.. - fi -else - ac_srcdir_defaulted=no -fi -if test ! -r $srcdir/$ac_unique_file; then - if test "$ac_srcdir_defaulted" = yes; then - { echo "configure: error: can not find sources in $ac_confdir or .." 1>&2; exit 1; } - else - { echo "configure: error: can not find sources in $srcdir" 1>&2; exit 1; } - fi -fi -srcdir=`echo "${srcdir}" | sed 's%\([^/]\)/*$%\1%'` - -# Prefer explicitly selected file to automatically selected ones. -if test -z "$CONFIG_SITE"; then - if test "x$prefix" != xNONE; then - CONFIG_SITE="$prefix/share/config.site $prefix/etc/config.site" - else - CONFIG_SITE="$ac_default_prefix/share/config.site $ac_default_prefix/etc/config.site" - fi -fi -for ac_site_file in $CONFIG_SITE; do - if test -r "$ac_site_file"; then - echo "loading site script $ac_site_file" - . "$ac_site_file" - fi -done - -if test -r "$cache_file"; then - echo "loading cache $cache_file" - . $cache_file -else - echo "creating cache $cache_file" - > $cache_file -fi - -ac_ext=c -# CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options. -ac_cpp='$CPP $CPPFLAGS' -ac_compile='${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5' -ac_link='${CC-cc} -o conftest $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5' - -if (echo "testing\c"; echo 1,2,3) | grep c >/dev/null; then - # Stardent Vistra SVR4 grep lacks -e, says ghazi@caip.rutgers.edu. - if (echo -n testing; echo 1,2,3) | sed s/-n/xn/ | grep xn >/dev/null; then - ac_n= ac_c=' -' ac_t=' ' - else - ac_n=-n ac_c= ac_t= - fi -else - ac_n= ac_c='\c' ac_t= -fi - - - -# Check whether --enable-64-bit-bfd or --disable-64-bit-bfd was given. -if test "${enable_64_bit_bfd+set}" = set; then - enableval="$enable_64_bit_bfd" - case "${enableval}" in - yes) want64=true ;; - no) want64=false ;; - *) { echo "configure: error: bad value ${enableval} for 64-bit-bfd option" 1>&2; exit 1; } ;; -esac -else - want64=false -fi -# Check whether --enable-targets or --disable-targets was given. -if test "${enable_targets+set}" = set; then - enableval="$enable_targets" - case "${enableval}" in - yes | "") { echo "configure: error: enable-targets option must specify target names or 'all'" 1>&2; exit 1; } - ;; - no) enable_targets= ;; - *) enable_targets=$enableval ;; -esac -fi -# Check whether --enable-shared or --disable-shared was given. -if test "${enable_shared+set}" = set; then - enableval="$enable_shared" - case "${enableval}" in - yes) shared=true ;; - no) shared=false ;; - *) { echo "configure: error: bad value ${enableval} for BFD shared option" 1>&2; exit 1; } ;; -esac -fi -# Check whether --enable-commonbfdlib or --disable-commonbfdlib was given. -if test "${enable_commonbfdlib+set}" = set; then - enableval="$enable_commonbfdlib" - case "${enableval}" in - yes) commonbfdlib=true ;; - no) commonbfdlib=false ;; - *) { echo "configure: error: bad value ${enableval} for BFD commonbfdlib option" 1>&2; exit 1; } ;; -esac -fi -# Check whether --with-mmap or --without-mmap was given. -if test "${with_mmap+set}" = set; then - withval="$with_mmap" - case "${withval}" in - yes) want_mmap=true ;; - no) want_mmap=false ;; - *) { echo "configure: error: bad value ${withval} for BFD with-mmap option" 1>&2; exit 1; } ;; -esac -else - want_mmap=false -fi - - - -ac_aux_dir= -for ac_dir in `cd $srcdir/..;pwd` $srcdir/`cd $srcdir/..;pwd`; do - if test -f $ac_dir/install-sh; then - ac_aux_dir=$ac_dir - ac_install_sh="$ac_aux_dir/install-sh -c" - break - elif test -f $ac_dir/install.sh; then - ac_aux_dir=$ac_dir - ac_install_sh="$ac_aux_dir/install.sh -c" - break - fi -done -if test -z "$ac_aux_dir"; then - { echo "configure: error: can not find install-sh or install.sh in `cd $srcdir/..;pwd` $srcdir/`cd $srcdir/..;pwd`" 1>&2; exit 1; } -fi -ac_config_guess=$ac_aux_dir/config.guess -ac_config_sub=$ac_aux_dir/config.sub -ac_configure=$ac_aux_dir/configure # This should be Cygnus configure. - - -# Do some error checking and defaulting for the host and target type. -# The inputs are: -# configure --host=HOST --target=TARGET --build=BUILD NONOPT -# -# The rules are: -# 1. You are not allowed to specify --host, --target, and nonopt at the -# same time. -# 2. Host defaults to nonopt. -# 3. If nonopt is not specified, then host defaults to the current host, -# as determined by config.guess. -# 4. Target and build default to nonopt. -# 5. If nonopt is not specified, then target and build default to host. - -# The aliases save the names the user supplied, while $host etc. -# will get canonicalized. -case $host---$target---$nonopt in -NONE---*---* | *---NONE---* | *---*---NONE) ;; -*) { echo "configure: error: can only configure for one host and one target at a time" 1>&2; exit 1; } ;; -esac - - -# Make sure we can run config.sub. -if $ac_config_sub sun4 >/dev/null 2>&1; then : -else { echo "configure: error: can not run $ac_config_sub" 1>&2; exit 1; } -fi - -echo $ac_n "checking host system type""... $ac_c" 1>&6 - -host_alias=$host -case "$host_alias" in -NONE) - case $nonopt in - NONE) - if host_alias=`$ac_config_guess`; then : - else { echo "configure: error: can not guess host type; you must specify one" 1>&2; exit 1; } - fi ;; - *) host_alias=$nonopt ;; - esac ;; -esac - -host=`$ac_config_sub $host_alias` -host_cpu=`echo $host | sed 's/^\(.*\)-\(.*\)-\(.*\)$/\1/'` -host_vendor=`echo $host | sed 's/^\(.*\)-\(.*\)-\(.*\)$/\2/'` -host_os=`echo $host | sed 's/^\(.*\)-\(.*\)-\(.*\)$/\3/'` -echo "$ac_t""$host" 1>&6 - -echo $ac_n "checking target system type""... $ac_c" 1>&6 - -target_alias=$target -case "$target_alias" in -NONE) - case $nonopt in - NONE) target_alias=$host_alias ;; - *) target_alias=$nonopt ;; - esac ;; -esac - -target=`$ac_config_sub $target_alias` -target_cpu=`echo $target | sed 's/^\(.*\)-\(.*\)-\(.*\)$/\1/'` -target_vendor=`echo $target | sed 's/^\(.*\)-\(.*\)-\(.*\)$/\2/'` -target_os=`echo $target | sed 's/^\(.*\)-\(.*\)-\(.*\)$/\3/'` -echo "$ac_t""$target" 1>&6 - -echo $ac_n "checking build system type""... $ac_c" 1>&6 - -build_alias=$build -case "$build_alias" in -NONE) - case $nonopt in - NONE) build_alias=$host_alias ;; - *) build_alias=$nonopt ;; - esac ;; -esac - -build=`$ac_config_sub $build_alias` -build_cpu=`echo $build | sed 's/^\(.*\)-\(.*\)-\(.*\)$/\1/'` -build_vendor=`echo $build | sed 's/^\(.*\)-\(.*\)-\(.*\)$/\2/'` -build_os=`echo $build | sed 's/^\(.*\)-\(.*\)-\(.*\)$/\3/'` -echo "$ac_t""$build" 1>&6 - -test "$host_alias" != "$target_alias" && - test "$program_prefix$program_suffix$program_transform_name" = \ - NONENONEs,x,x, && - program_prefix=${target_alias}- - -if test -z "$target" ; then - { echo "configure: error: Unrecognized target system type; please check config.sub." 1>&2; exit 1; } -fi -if test "$program_transform_name" = s,x,x,; then - program_transform_name= -else - # Double any \ or $. echo might interpret backslashes. - cat <<\EOF_SED > conftestsed -s,\\,\\\\,g; s,\$,$$,g -EOF_SED - program_transform_name="`echo $program_transform_name|sed -f conftestsed`" - rm -f conftestsed -fi -test "$program_prefix" != NONE && - program_transform_name="s,^,${program_prefix},; $program_transform_name" -# Use a double $ so make ignores it. -test "$program_suffix" != NONE && - program_transform_name="s,\$\$,${program_suffix},; $program_transform_name" - -# sed with no file args requires a program. -test "$program_transform_name" = "" && program_transform_name="s,x,x," - - -host64=false -target64=false - -# host stuff: - -ALLLIBS='$(TARGETLIB)' -PICFLAG= -SHLIB=unused-shlib -SHLINK=unused-shlink -if test "${shared}" = "true"; then - PICFLAG=-fpic - if test "${commonbfdlib}" = "true"; then - ALLLIBS='$(TARGETLIB)' - else - ALLLIBS='$(TARGETLIB) $(SHLIB) $(SHLINK)' - SHLIB=libbfd.so.`sed -e 's/[^0-9]*\([0-9.]*\).*/\1/' ${srcdir}/VERSION` - SHLINK=libbfd.so - fi -fi - -# Extract the first word of "gcc", so it can be a program name with args. -set dummy gcc; ac_word=$2 -echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 -if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - if test -n "$CC"; then - ac_cv_prog_CC="$CC" # Let the user override the test. -else - IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:" - for ac_dir in $PATH; do - test -z "$ac_dir" && ac_dir=. - if test -f $ac_dir/$ac_word; then - ac_cv_prog_CC="gcc" - break - fi - done - IFS="$ac_save_ifs" -fi -fi -CC="$ac_cv_prog_CC" -if test -n "$CC"; then - echo "$ac_t""$CC" 1>&6 -else - echo "$ac_t""no" 1>&6 -fi - -if test -z "$CC"; then - # Extract the first word of "cc", so it can be a program name with args. -set dummy cc; ac_word=$2 -echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 -if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - if test -n "$CC"; then - ac_cv_prog_CC="$CC" # Let the user override the test. -else - IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:" - ac_prog_rejected=no - for ac_dir in $PATH; do - test -z "$ac_dir" && ac_dir=. - if test -f $ac_dir/$ac_word; then - if test "$ac_dir/$ac_word" = "/usr/ucb/cc"; then - ac_prog_rejected=yes - continue - fi - ac_cv_prog_CC="cc" - break - fi - done - IFS="$ac_save_ifs" -if test $ac_prog_rejected = yes; then - # We found a bogon in the path, so make sure we never use it. - set dummy $ac_cv_prog_CC - shift - if test $# -gt 0; then - # We chose a different compiler from the bogus one. - # However, it has the same basename, so the bogon will be chosen - # first if we set CC to just the basename; use the full file name. - shift - set dummy "$ac_dir/$ac_word" "$@" - shift - ac_cv_prog_CC="$@" - fi -fi -fi -fi -CC="$ac_cv_prog_CC" -if test -n "$CC"; then - echo "$ac_t""$CC" 1>&6 -else - echo "$ac_t""no" 1>&6 -fi - - test -z "$CC" && { echo "configure: error: no acceptable cc found in \$PATH" 1>&2; exit 1; } -fi - -echo $ac_n "checking whether we are using GNU C""... $ac_c" 1>&6 -if eval "test \"`echo '$''{'ac_cv_prog_gcc'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - cat > conftest.c <<EOF -#ifdef __GNUC__ - yes; -#endif -EOF -if { ac_try='${CC-cc} -E conftest.c'; { (eval echo configure:814: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; } | egrep yes >/dev/null 2>&1; then - ac_cv_prog_gcc=yes -else - ac_cv_prog_gcc=no -fi -fi - -echo "$ac_t""$ac_cv_prog_gcc" 1>&6 -if test $ac_cv_prog_gcc = yes; then - GCC=yes - if test "${CFLAGS+set}" != set; then - echo $ac_n "checking whether ${CC-cc} accepts -g""... $ac_c" 1>&6 -if eval "test \"`echo '$''{'ac_cv_prog_gcc_g'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - echo 'void f(){}' > conftest.c -if test -z "`${CC-cc} -g -c conftest.c 2>&1`"; then - ac_cv_prog_gcc_g=yes -else - ac_cv_prog_gcc_g=no -fi -rm -f conftest* - -fi - -echo "$ac_t""$ac_cv_prog_gcc_g" 1>&6 - if test $ac_cv_prog_gcc_g = yes; then - CFLAGS="-g -O" - else - CFLAGS="-O" - fi - fi -else - GCC= - test "${CFLAGS+set}" = set || CFLAGS="-g" -fi - - -# Permit host specific settings. -. ${srcdir}/configure.host - - -if test $host != $build; then - ac_tool_prefix=${host_alias}- -else - ac_tool_prefix= -fi - -# Extract the first word of "${ac_tool_prefix}ar", so it can be a program name with args. -set dummy ${ac_tool_prefix}ar; ac_word=$2 -echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 -if eval "test \"`echo '$''{'ac_cv_prog_AR'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - if test -n "$AR"; then - ac_cv_prog_AR="$AR" # Let the user override the test. -else - IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:" - for ac_dir in $PATH; do - test -z "$ac_dir" && ac_dir=. - if test -f $ac_dir/$ac_word; then - ac_cv_prog_AR="${ac_tool_prefix}ar" - break - fi - done - IFS="$ac_save_ifs" - test -z "$ac_cv_prog_AR" && ac_cv_prog_AR="ar" -fi -fi -AR="$ac_cv_prog_AR" -if test -n "$AR"; then - echo "$ac_t""$AR" 1>&6 -else - echo "$ac_t""no" 1>&6 -fi - - - -# Extract the first word of "${ac_tool_prefix}ranlib", so it can be a program name with args. -set dummy ${ac_tool_prefix}ranlib; ac_word=$2 -echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 -if eval "test \"`echo '$''{'ac_cv_prog_RANLIB'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - if test -n "$RANLIB"; then - ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test. -else - IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:" - for ac_dir in $PATH; do - test -z "$ac_dir" && ac_dir=. - if test -f $ac_dir/$ac_word; then - ac_cv_prog_RANLIB="${ac_tool_prefix}ranlib" - break - fi - done - IFS="$ac_save_ifs" -fi -fi -RANLIB="$ac_cv_prog_RANLIB" -if test -n "$RANLIB"; then - echo "$ac_t""$RANLIB" 1>&6 -else - echo "$ac_t""no" 1>&6 -fi - - -if test -z "$ac_cv_prog_RANLIB"; then -if test -n "$ac_tool_prefix"; then - # Extract the first word of "ranlib", so it can be a program name with args. -set dummy ranlib; ac_word=$2 -echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 -if eval "test \"`echo '$''{'ac_cv_prog_RANLIB'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - if test -n "$RANLIB"; then - ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test. -else - IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:" - for ac_dir in $PATH; do - test -z "$ac_dir" && ac_dir=. - if test -f $ac_dir/$ac_word; then - ac_cv_prog_RANLIB="ranlib" - break - fi - done - IFS="$ac_save_ifs" - test -z "$ac_cv_prog_RANLIB" && ac_cv_prog_RANLIB=":" -fi -fi -RANLIB="$ac_cv_prog_RANLIB" -if test -n "$RANLIB"; then - echo "$ac_t""$RANLIB" 1>&6 -else - echo "$ac_t""no" 1>&6 -fi - -else - RANLIB=":" -fi -fi - -# Find a good install program. We prefer a C program (faster), -# so one script is as good as another. But avoid the broken or -# incompatible versions: -# SysV /etc/install, /usr/sbin/install -# SunOS /usr/etc/install -# IRIX /sbin/install -# AIX /bin/install -# AFS /usr/afsws/bin/install, which mishandles nonexistent args -# SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff" -# ./install, which can be erroneously created by make from ./install.sh. -echo $ac_n "checking for a BSD compatible install""... $ac_c" 1>&6 -if test -z "$INSTALL"; then -if eval "test \"`echo '$''{'ac_cv_path_install'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:" - for ac_dir in $PATH; do - # Account for people who put trailing slashes in PATH elements. - case "$ac_dir/" in - /|./|.//|/etc/*|/usr/sbin/*|/usr/etc/*|/sbin/*|/usr/afsws/bin/*|/usr/ucb/*) ;; - *) - # OSF1 and SCO ODT 3.0 have their own names for install. - for ac_prog in ginstall installbsd scoinst install; do - if test -f $ac_dir/$ac_prog; then - if test $ac_prog = install && - grep dspmsg $ac_dir/$ac_prog >/dev/null 2>&1; then - # AIX install. It has an incompatible calling convention. - # OSF/1 installbsd also uses dspmsg, but is usable. - : - else - ac_cv_path_install="$ac_dir/$ac_prog -c" - break 2 - fi - fi - done - ;; - esac - done - IFS="$ac_save_ifs" - -fi - if test "${ac_cv_path_install+set}" = set; then - INSTALL="$ac_cv_path_install" - else - # As a last resort, use the slow shell script. We don't cache a - # path for INSTALL within a source directory, because that will - # break other packages using the cache if that directory is - # removed, or if the path is relative. - INSTALL="$ac_install_sh" - fi -fi -echo "$ac_t""$INSTALL" 1>&6 - -# Use test -z because SunOS4 sh mishandles braces in ${var-val}. -# It thinks the first close brace ends the variable substitution. -test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}' - -test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644' - - -if test "${shared}" = "true"; then - if test "${GCC}" != "yes" && test "${shared_non_gcc}" != "yes"; then - echo "configure: warning: BFD --enable-shared only supported when using gcc" 1>&2 - shared=false - ALLLIBS='$(TARGETLIB)' - PICFLAG= - SHLIB=unused-shlib - fi -fi - - - - - - -if test "${commonbfdlib}" = "true"; then - COMMON_SHLIB=yes - PICLIST=piclist -else - COMMON_SHLIB= - PICLIST= -fi - - - - -HOST_64BIT_LONG=0 -if test "x${HOST_64BIT_TYPE}" = "xlong"; then - HOST_64BIT_LONG=1 -fi - - -# If we cannot run a trivial program, we must be cross compiling. -echo $ac_n "checking whether cross-compiling""... $ac_c" 1>&6 -if eval "test \"`echo '$''{'ac_cv_c_cross'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - if test "$cross_compiling" = yes; then - ac_cv_c_cross=yes -else -cat > conftest.$ac_ext <<EOF -#line 1056 "configure" -#include "confdefs.h" -main(){return(0);} -EOF -{ (eval echo configure:1060: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } -if test -s conftest && (./conftest; exit) 2>/dev/null; then - ac_cv_c_cross=no -else - ac_cv_c_cross=yes -fi -fi -rm -fr conftest* -fi - -echo "$ac_t""$ac_cv_c_cross" 1>&6 -cross_compiling=$ac_cv_c_cross - -# Put a plausible default for CC_FOR_BUILD in Makefile. -if test -z "$CC_FOR_BUILD"; then - if test "x$cross_compiling" = "xno"; then - CC_FOR_BUILD='$(CC)' - else - CC_FOR_BUILD=gcc - fi -fi - - -echo $ac_n "checking how to run the C preprocessor""... $ac_c" 1>&6 -# On Suns, sometimes $CPP names a directory. -if test -n "$CPP" && test -d "$CPP"; then - CPP= -fi -if test -z "$CPP"; then -if eval "test \"`echo '$''{'ac_cv_prog_CPP'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - # This must be in double quotes, not single quotes, because CPP may get - # substituted into the Makefile and "${CC-cc}" will confuse make. - CPP="${CC-cc} -E" - # On the NeXT, cc -E runs the code through the compiler's parser, - # not just through cpp. - cat > conftest.$ac_ext <<EOF -#line 1098 "configure" -#include "confdefs.h" -#include <assert.h> -Syntax Error -EOF -ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" -{ (eval echo configure:1104: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } -ac_err=`grep -v '^ *+' conftest.out` -if test -z "$ac_err"; then - : -else - echo "$ac_err" >&5 - rm -rf conftest* - CPP="${CC-cc} -E -traditional-cpp" - cat > conftest.$ac_ext <<EOF -#line 1113 "configure" -#include "confdefs.h" -#include <assert.h> -Syntax Error -EOF -ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" -{ (eval echo configure:1119: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } -ac_err=`grep -v '^ *+' conftest.out` -if test -z "$ac_err"; then - : -else - echo "$ac_err" >&5 - rm -rf conftest* - CPP=/lib/cpp -fi -rm -f conftest* -fi -rm -f conftest* - ac_cv_prog_CPP="$CPP" -fi - CPP="$ac_cv_prog_CPP" -else - ac_cv_prog_CPP="$CPP" -fi -echo "$ac_t""$CPP" 1>&6 - -for ac_hdr in stddef.h string.h strings.h stdlib.h time.h unistd.h -do -ac_safe=`echo "$ac_hdr" | tr './\055' '___'` -echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6 -if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - cat > conftest.$ac_ext <<EOF -#line 1147 "configure" -#include "confdefs.h" -#include <$ac_hdr> -EOF -ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" -{ (eval echo configure:1152: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } -ac_err=`grep -v '^ *+' conftest.out` -if test -z "$ac_err"; then - rm -rf conftest* - eval "ac_cv_header_$ac_safe=yes" -else - echo "$ac_err" >&5 - rm -rf conftest* - eval "ac_cv_header_$ac_safe=no" -fi -rm -f conftest* -fi -if eval "test \"`echo '$ac_cv_header_'$ac_safe`\" = yes"; then - echo "$ac_t""yes" 1>&6 - ac_tr_hdr=HAVE_`echo $ac_hdr | tr 'abcdefghijklmnopqrstuvwxyz./\055' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ___'` - cat >> confdefs.h <<EOF -#define $ac_tr_hdr 1 -EOF - -else - echo "$ac_t""no" 1>&6 -fi -done - -for ac_hdr in fcntl.h sys/file.h sys/time.h -do -ac_safe=`echo "$ac_hdr" | tr './\055' '___'` -echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6 -if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - cat > conftest.$ac_ext <<EOF -#line 1184 "configure" -#include "confdefs.h" -#include <$ac_hdr> -EOF -ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" -{ (eval echo configure:1189: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } -ac_err=`grep -v '^ *+' conftest.out` -if test -z "$ac_err"; then - rm -rf conftest* - eval "ac_cv_header_$ac_safe=yes" -else - echo "$ac_err" >&5 - rm -rf conftest* - eval "ac_cv_header_$ac_safe=no" -fi -rm -f conftest* -fi -if eval "test \"`echo '$ac_cv_header_'$ac_safe`\" = yes"; then - echo "$ac_t""yes" 1>&6 - ac_tr_hdr=HAVE_`echo $ac_hdr | tr 'abcdefghijklmnopqrstuvwxyz./\055' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ___'` - cat >> confdefs.h <<EOF -#define $ac_tr_hdr 1 -EOF - -else - echo "$ac_t""no" 1>&6 -fi -done - -echo $ac_n "checking whether time.h and sys/time.h may both be included""... $ac_c" 1>&6 -if eval "test \"`echo '$''{'ac_cv_header_time'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - cat > conftest.$ac_ext <<EOF -#line 1218 "configure" -#include "confdefs.h" -#include <sys/types.h> -#include <sys/time.h> -#include <time.h> -int main() { return 0; } -int t() { -struct tm *tp; -; return 0; } -EOF -if { (eval echo configure:1228: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then - rm -rf conftest* - ac_cv_header_time=yes -else - rm -rf conftest* - ac_cv_header_time=no -fi -rm -f conftest* - -fi - -echo "$ac_t""$ac_cv_header_time" 1>&6 -if test $ac_cv_header_time = yes; then - cat >> confdefs.h <<\EOF -#define TIME_WITH_SYS_TIME 1 -EOF - -fi - -for ac_func in fcntl getpagesize -do -echo $ac_n "checking for $ac_func""... $ac_c" 1>&6 -if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - cat > conftest.$ac_ext <<EOF -#line 1254 "configure" -#include "confdefs.h" -/* System header to define __stub macros and hopefully few prototypes, - which can conflict with char $ac_func(); below. */ -#include <assert.h> -/* Override any gcc2 internal prototype to avoid an error. */ -char $ac_func(); - -int main() { return 0; } -int t() { - -/* The GNU C library defines this for functions which it implements - to always fail with ENOSYS. Some functions are actually named - something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) -choke me -#else -$ac_func(); -#endif - -; return 0; } -EOF -if { (eval echo configure:1276: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; }; then - rm -rf conftest* - eval "ac_cv_func_$ac_func=yes" -else - rm -rf conftest* - eval "ac_cv_func_$ac_func=no" -fi -rm -f conftest* - -fi -if eval "test \"`echo '$ac_cv_func_'$ac_func`\" = yes"; then - echo "$ac_t""yes" 1>&6 - ac_tr_func=HAVE_`echo $ac_func | tr 'abcdefghijklmnopqrstuvwxyz' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'` - cat >> confdefs.h <<EOF -#define $ac_tr_func 1 -EOF - -else - echo "$ac_t""no" 1>&6 -fi -done - - - -case "${host}" in -i[345]86-*-msdos* | i[345]86-*-go32* | *-*-cygwin32) - cat >> confdefs.h <<\EOF -#define USE_BINARY_FOPEN 1 -EOF - ;; -esac - -echo $ac_n "checking whether malloc must be declared""... $ac_c" 1>&6 -if eval "test \"`echo '$''{'bfd_cv_decl_needed_malloc'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - cat > conftest.$ac_ext <<EOF -#line 1313 "configure" -#include "confdefs.h" - -#include <stdio.h> -#ifdef HAVE_STDLIB_H -#include <stdlib.h> -#endif -#ifdef HAVE_UNISTD_H -#include <unistd.h> -#endif -int main() { return 0; } -int t() { -char *(*pfn) = (char *(*)) malloc -; return 0; } -EOF -if { (eval echo configure:1328: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then - rm -rf conftest* - bfd_cv_decl_needed_malloc=no -else - rm -rf conftest* - bfd_cv_decl_needed_malloc=yes -fi -rm -f conftest* - -fi - -echo "$ac_t""$bfd_cv_decl_needed_malloc" 1>&6 -if test $bfd_cv_decl_needed_malloc = yes; then - bfd_tr_decl=NEED_DECLARATION_`echo malloc | tr 'abcdefghijklmnopqrstuvwxyz' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'` - cat >> confdefs.h <<EOF -#define $bfd_tr_decl 1 -EOF - -fi - -echo $ac_n "checking whether free must be declared""... $ac_c" 1>&6 -if eval "test \"`echo '$''{'bfd_cv_decl_needed_free'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - cat > conftest.$ac_ext <<EOF -#line 1353 "configure" -#include "confdefs.h" - -#include <stdio.h> -#ifdef HAVE_STDLIB_H -#include <stdlib.h> -#endif -#ifdef HAVE_UNISTD_H -#include <unistd.h> -#endif -int main() { return 0; } -int t() { -char *(*pfn) = (char *(*)) free -; return 0; } -EOF -if { (eval echo configure:1368: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then - rm -rf conftest* - bfd_cv_decl_needed_free=no -else - rm -rf conftest* - bfd_cv_decl_needed_free=yes -fi -rm -f conftest* - -fi - -echo "$ac_t""$bfd_cv_decl_needed_free" 1>&6 -if test $bfd_cv_decl_needed_free = yes; then - bfd_tr_decl=NEED_DECLARATION_`echo free | tr 'abcdefghijklmnopqrstuvwxyz' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'` - cat >> confdefs.h <<EOF -#define $bfd_tr_decl 1 -EOF - -fi - - -# If we are configured native, pick a core file support file. -COREFILE= -COREFLAG= -if test "${target}" = "${host}"; then - case "${host}" in - alpha*-*-linux*) - COREFILE=trad-core.o - cat >> confdefs.h <<\EOF -#define TRAD_HEADER "hosts/alphalinux.h" -EOF - - ;; - alpha*-*-*) COREFILE=osf-core.o ;; - arm-*-riscix) COREFILE=trad-core.o ;; - hppa*-*-hpux*) COREFILE=hpux-core.o ;; - hppa*-*-hiux*) COREFILE=hpux-core.o ;; - hppa*-*-bsd*) COREFILE="hpux-core.o hppabsd-core.o" - COREFLAG="-DHPUX_CORE -DHPPABSD_CORE" ;; - i[345]86-sequent-bsd*) - COREFILE=trad-core.o; - cat >> confdefs.h <<\EOF -#define TRAD_HEADER "hosts/symmetry.h" -EOF - - ;; - i[345]86-sequent-sysv4*) ;; - i[345]86-sequent-sysv*) - COREFILE=trad-core.o - cat >> confdefs.h <<\EOF -#define TRAD_HEADER "hosts/symmetry.h" -EOF - - ;; - i[345]86-*-bsd* | i[345]86-*-freebsd*) - COREFILE=trad-core.o - cat >> confdefs.h <<\EOF -#define TRAD_HEADER "hosts/i386bsd.h" -EOF - - ;; - i[345]86-*-netbsd*) - COREFILE=netbsd-core.o - ;; - i[345]86-esix-sysv3*) - COREFILE=trad-core.o - cat >> confdefs.h <<\EOF -#define TRAD_HEADER "hosts/esix.h" -EOF - - ;; - i[345]86-*-sco* | i[345]86-*-isc*) - COREFILE=trad-core.o - cat >> confdefs.h <<\EOF -#define TRAD_HEADER "hosts/i386sco.h" -EOF - - ;; - i[345]86-*-mach3*) - COREFILE=trad-core.o - cat >> confdefs.h <<\EOF -#define TRAD_HEADER "hosts/i386mach3.h" -EOF - - ;; - i[345]86-*-linux*) - COREFILE=trad-core.o - cat >> confdefs.h <<\EOF -#define TRAD_HEADER "hosts/i386linux.h" -EOF - - ;; - i[345]86-*-isc*) COREFILE=trad-core.o ;; - i[345]86-*-aix*) COREFILE=aix386-core.o ;; - i860-*-mach3* | i860-*-osf1*) - COREFILE=trad-core.o - cat >> confdefs.h <<\EOF -#define TRAD_HEADER "hosts/i860mach3.h" -EOF - - ;; - mips-dec-bsd*) - COREFILE=trad-core.o - cat >> confdefs.h <<\EOF -#define TRAD_HEADER "hosts/mipsbsd.h" -EOF - - ;; - mips-dec-mach3*) - COREFILE=trad-core.o - cat >> confdefs.h <<\EOF -#define TRAD_HEADER "hosts/mipsmach3.h" -EOF - - ;; - mips-*-netbsd*) - COREFILE=netbsd-core.o - ;; - mips-dec-*) - COREFILE=trad-core.o - cat >> confdefs.h <<\EOF -#define TRAD_HEADER "hosts/decstation.h" -EOF - - ;; - mips-sgi-irix4*) COREFILE=irix-core.o ;; - mips-sgi-irix5*) COREFILE=irix-core.o ;; - mips-*-mach3*) - COREFILE=trad-core.o - cat >> confdefs.h <<\EOF -#define TRAD_HEADER "hosts/mipsmach3.h" -EOF - - ;; - mips-*-sysv4*) ;; - mips-*-sysv* | mips-*-riscos*) - COREFILE=trad-core.o - cat >> confdefs.h <<\EOF -#define TRAD_HEADER "hosts/riscos.h" -EOF - - ;; - mips-sony-bsd*) - COREFILE=trad-core.o - cat >> confdefs.h <<\EOF -#define TRAD_HEADER "hosts/news-mips.h" -EOF - - ;; - m68*-bull*-sysv*) - COREFILE=trad-core.o - cat >> confdefs.h <<\EOF -#define TRAD_HEADER "hosts/dpx2.h" -EOF - - ;; - m68*-hp-hpux*) COREFILE=hpux-core.o ;; - m68*-hp-bsd*) - COREFILE=trad-core.o - cat >> confdefs.h <<\EOF -#define TRAD_HEADER "hosts/hp300bsd.h" -EOF - - ;; - m68*-*-linux*) - COREFILE=trad-core.o - cat >> confdefs.h <<\EOF -#define TRAD_HEADER "hosts/m68klinux.h" -EOF - - ;; - m68*-motorola-sysv*) - COREFILE=trad-core.o - cat >> confdefs.h <<\EOF -#define TRAD_HEADER "hosts/delta68.h" -EOF - - ;; - m68*-sony-*) - COREFILE=trad-core.o - cat >> confdefs.h <<\EOF -#define TRAD_HEADER "hosts/news.h" -EOF - - ;; - m68*-*-netbsd*) - COREFILE=netbsd-core.o - ;; - m68*-apple-aux*) - COREFILE=trad-core.o - cat >> confdefs.h <<\EOF -#define TRAD_HEADER "hosts/m68kaux.h" -EOF - - ;; - m88*-*-sysv4*) ;; - m88*-motorola-sysv*) COREFILE=ptrace-core.o ;; - m88*-*-mach3*) - COREFILE=trad-core.o - cat >> confdefs.h <<\EOF -#define TRAD_HEADER "hosts/m88kmach3.h" -EOF - - ;; - ns32k-pc532-mach) - COREFILE=trad-core.o - cat >> confdefs.h <<\EOF -#define TRAD_HEADER "hosts/pc532mach.h" -EOF - - ;; - ns32k-*-netbsd*) - COREFILE=netbsd-core.o - ;; - rs6000-*-lynx*) COREFILE=lynx-core.o ;; - rs6000-*-aix4*) COREFILE=rs6000-core.o ;; - rs6000-*-*) COREFILE=rs6000-core.o ;; - powerpc-*-aix4*) COREFILE=rs6000-core.o ;; - powerpc-*-aix*) COREFILE=rs6000-core.o ;; - sparc-*-netbsd*) - COREFILE=netbsd-core.o - ;; - tahoe-*-*) - COREFILE=trad-core.o - cat >> confdefs.h <<\EOF -#define TRAD_HEADER "hosts/tahoe.h" -EOF - - ;; - vax-*-ultrix2*) - COREFILE=trad-core.o - cat >> confdefs.h <<\EOF -#define TRAD_HEADER "hosts/vaxult2.h" -EOF - - ;; - vax-*-ultrix*) - COREFILE=trad-core.o - cat >> confdefs.h <<\EOF -#define TRAD_HEADER "hosts/vaxult2.h" -EOF - - ;; - vax-*-*) - COREFILE=trad-core.o - cat >> confdefs.h <<\EOF -#define TRAD_HEADER "hosts/vaxbsd.h" -EOF - - ;; - esac - - case "$COREFILE" in - aix386-core.o) COREFLAG=-DAIX386_CORE ;; - hppabsd-core.o) COREFLAG=-DHPPABSD_CORE ;; - hpux-core.o) COREFLAG=-DHPUX_CORE ;; - irix-core.o) COREFLAG=-DIRIX_CORE ;; - lynx-core.o) COREFLAG=-DLYNX_CORE ;; - osf-core.o) COREFLAG=-DOSF_CORE ;; - ptrace-core.o) COREFLAG=-DPTRACE_CORE ;; - rs6000-core.o) COREFLAG="$COREFLAG -DAIX_CORE" ;; - trad-core.o) COREFLAG="$COREFLAG -DTRAD_CORE" ;; - esac - - # The ELF code uses the native <sys/procfs.h> to handle core files. - # Define HAVE_SYS_PROCFS_H if the file exists and defines - # prstatus_t. - echo $ac_n "checking for sys/procfs.h""... $ac_c" 1>&6 - if eval "test \"`echo '$''{'bfd_cv_header_sys_procfs_h'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - cat > conftest.$ac_ext <<EOF -#line 1640 "configure" -#include "confdefs.h" -#include <sys/procfs.h> -int main() { return 0; } -int t() { -prstatus_t t; -; return 0; } -EOF -if { (eval echo configure:1648: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then - rm -rf conftest* - bfd_cv_header_sys_procfs_h=yes -else - rm -rf conftest* - bfd_cv_header_sys_procfs_h=no -fi -rm -f conftest* - -fi - - echo "$ac_t""$bfd_cv_header_sys_procfs_h" 1>&6 - if test $bfd_cv_header_sys_procfs_h = yes; then - cat >> confdefs.h <<\EOF -#define HAVE_SYS_PROCFS_H 1 -EOF - - fi - -fi - - - -# target stuff: - -# Canonicalize the secondary target names. -if test -n "$enable_targets" ; then - for targ in `echo $enable_targets | sed 's/,/ /g'` - do - result=`$ac_config_sub $targ 2>/dev/null` - if test -n "$result" ; then - canon_targets="$canon_targets $result" - else - # Allow targets that config.sub doesn't recognize, like "all". - canon_targets="$canon_targets $targ" - fi - done -fi - -all_targets=false -defvec= -selvecs= -selarchs= -TDEFINES= -for targ in $target $canon_targets -do - if test "x$targ" = "xall"; then - all_targets=true - else - . $srcdir/config.bfd - if test "x$targ" = "x$target"; then - defvec=$targ_defvec - fi - selvecs="$selvecs $targ_defvec $targ_selvecs" - selarchs="$selarchs $targ_archs" - TDEFINES="$TDEFINES $targ_cflags" - fi -done - - -# This processing still needs to be done if we're to decide properly whether -# 64-bit support needs to be compiled in. Currently, it will be included if -# the default or any other explicitly requested target requires it; it -# will not be included on a 32-bit host if no 64-bit target is requested, and -# no "--with-64-bit-bfd" option is given, even if "--with-targets=all" is -# used. - -# uniq the default and selected vectors in all the configured targets. -f="" -for i in $selvecs ; do - case " $f " in - *" $i "*) ;; - *) f="$f $i" ;; - esac -done -selvecs="$f" - -# uniq the architectures in all the configured targets. -f="" -for i in $selarchs ; do - case " $f " in - *" $i "*) ;; - *) f="$f $i" ;; - esac -done -selarchs="$f" - -# Target backend .o files. -tb= - -elf="elf.o elflink.o" - -for vec in $selvecs -do - case "$vec" in - # This list is alphabetized to make it easy to compare - # with the two vector lists in targets.c. - a29kcoff_big_vec) tb="$tb coff-a29k.o cofflink.o" ;; - a_out_adobe_vec) tb="$tb aout-adobe.o aout32.o" ;; - armcoff_little_vec) tb="$tb coff-arm.o cofflink.o " ;; - armcoff_big_vec) tb="$tb coff-arm.o cofflink.o " ;; - armpe_little_vec) tb="$tb pe-arm.o cofflink.o " ;; - armpe_big_vec) tb="$tb pe-arm.o cofflink.o " ;; - armpei_little_vec) tb="$tb pei-arm.o cofflink.o " ;; - armpei_big_vec) tb="$tb pei-arm.o cofflink.o " ;; - aout0_big_vec) tb="$tb aout0.o aout32.o" ;; - aout_arm_big_vec) tb="$tb aout-arm.o aout32.o" ;; - aout_arm_little_vec) tb="$tb aout-arm.o aout32.o" ;; - aout_mips_big_vec) tb="$tb mipsbsd.o aout32.o" ;; - aout_mips_little_vec) tb="$tb mipsbsd.o aout32.o" ;; - apollocoff_vec) tb="$tb coff-apollo.o" ;; - b_out_vec_big_host) tb="$tb bout.o aout32.o" ;; - b_out_vec_little_host) tb="$tb bout.o aout32.o" ;; - bfd_elf32_big_generic_vec) tb="$tb elf32-gen.o elf32.o $elf" ;; - bfd_elf32_bigmips_vec) tb="$tb elf32-mips.o elf32.o $elf ecofflink.o" ;; - bfd_elf32_hppa_vec) tb="$tb elf32-hppa.o elf32.o $elf" ;; - bfd_elf32_i386_vec) tb="$tb elf32-i386.o elf32.o $elf" ;; - bfd_elf32_i860_vec) tb="$tb elf32-i860.o elf32.o $elf" ;; - bfd_elf32_little_generic_vec) tb="$tb elf32-gen.o elf32.o $elf" ;; - bfd_elf32_littlemips_vec) tb="$tb elf32-mips.o elf32.o $elf ecofflink.o" ;; - bfd_elf32_m68k_vec) tb="$tb elf32-m68k.o elf32.o $elf" ;; - bfd_elf32_m88k_vec) tb="$tb elf32-m88k.o elf32.o $elf" ;; - bfd_elf32_powerpc_vec) tb="$tb elf32-ppc.o elf32.o $elf" ;; - bfd_elf32_powerpcle_vec) tb="$tb elf32-ppc.o elf32.o $elf" ;; - bfd_elf32_sparc_vec) tb="$tb elf32-sparc.o elf32.o $elf" ;; - bfd_elf64_big_generic_vec) tb="$tb elf64-gen.o elf64.o $elf" - target64=true ;; - bfd_elf64_little_generic_vec) tb="$tb elf64-gen.o elf64.o $elf" - target64=true ;; - bfd_elf64_sparc_vec) tb="$tb elf64-sparc.o elf64.o $elf" - target64=true ;; - cisco_core_vec) tb="$tb cisco-core.o" ;; - demo_64_vec) tb="$tb demo64.o aout64.o" - target64=true ;; - ecoff_big_vec) tb="$tb coff-mips.o ecoff.o ecofflink.o" ;; - ecoff_little_vec) tb="$tb coff-mips.o ecoff.o ecofflink.o" ;; - ecoffalpha_little_vec) tb="$tb coff-alpha.o ecoff.o ecofflink.o" - target64=true ;; - h8300coff_vec) tb="$tb coff-h8300.o reloc16.o" ;; - h8500coff_vec) tb="$tb coff-h8500.o reloc16.o" ;; - host_aout_vec) tb="$tb host-aout.o aout32.o" ;; - hp300bsd_vec) tb="$tb hp300bsd.o aout32.o" ;; - hp300hpux_vec) tb="$tb hp300hpux.o aout32.o" ;; - i386aout_vec) tb="$tb i386aout.o aout32.o" ;; - i386bsd_vec) tb="$tb i386bsd.o aout32.o" ;; - i386coff_vec) tb="$tb coff-i386.o cofflink.o" ;; - i386dynix_vec) tb="$tb i386dynix.o aout32.o" ;; - i386freebsd_vec) tb="$tb i386freebsd.o aout32.o" ;; - i386msdos_vec) tb="$tb i386msdos.o" ;; - i386pe_vec) tb="$tb pe-i386.o cofflink.o " ;; - i386pei_vec) tb="$tb pei-i386.o cofflink.o" ;; - i386linux_vec) tb="$tb i386linux.o aout32.o" ;; - i386lynx_aout_vec) tb="$tb i386lynx.o lynx-core.o aout32.o" ;; - i386lynx_coff_vec) tb="$tb cf-i386lynx.o cofflink.o lynx-core.o" ;; - i386mach3_vec) tb="$tb i386mach3.o aout32.o" ;; - i386netbsd_vec) tb="$tb i386netbsd.o aout32.o" ;; - i386os9k_vec) tb="$tb i386os9k.o aout32.o" ;; - i860coff_vec) tb="$tb coff-i860.o cofflink.o" ;; - icoff_big_vec) tb="$tb coff-i960.o cofflink.o" ;; - icoff_little_vec) tb="$tb coff-i960.o cofflink.o" ;; - ieee_vec) tb="$tb ieee.o" ;; - m68kcoff_vec) tb="$tb coff-m68k.o cofflink.o" ;; - m68kcoffun_vec) tb="$tb coff-u68k.o coff-m68k.o cofflink.o" ;; - m68klinux_vec) tb="$tb m68klinux.o aout32.o" ;; - m68klynx_aout_vec) tb="$tb m68klynx.o lynx-core.o aout32.o" ;; - m68klynx_coff_vec) tb="$tb cf-m68klynx.o coff-m68k.o cofflink.o lynx-core.o" ;; - m68knetbsd_vec) tb="$tb m68knetbsd.o aout32.o" ;; - m68k4knetbsd_vec) tb="$tb m68k4knetbsd.o aout32.o" ;; - m68kaux_coff_vec) tb="$tb coff-aux.o coff-m68k.o cofflink.o" ;; - m88kbcs_vec) tb="$tb coff-m88k.o" ;; - newsos3_vec) tb="$tb newsos3.o aout32.o" ;; - nlm32_i386_vec) tb="$tb nlm32-i386.o nlm32.o nlm.o" ;; - nlm32_sparc_vec) tb="$tb nlm32-sparc.o nlm32.o nlm.o" ;; - nlm32_alpha_vec) tb="$tb nlm32-alpha.o nlm32.o nlm.o" - target64=true ;; - riscix_vec) tb="$tb aout32.o riscix.o" ;; - nlm32_powerpc_vec) tb="$tb nlm32-ppc.o nlm32.o nlm.o" ;; - pc532netbsd_vec) tb="$tb ns32knetbsd.o aout-ns32k.o" ;; - pc532machaout_vec) tb="$tb pc532-mach.o aout-ns32k.o" ;; - pmac_xcoff_vec) tb="$tb coff-pmac.o xcofflink.o" ;; - rs6000coff_vec) tb="$tb coff-rs6000.o xcofflink.o" ;; - bfd_powerpc_pe_vec) tb="$tb pe-ppc.o cofflink.o" ;; - bfd_powerpcle_pe_vec) tb="$tb pe-ppc.o cofflink.o" ;; - bfd_powerpc_pei_vec) tb="$tb pei-ppc.o cofflink.o" ;; - bfd_powerpcle_pei_vec) tb="$tb pei-ppc.o cofflink.o" ;; - shcoff_vec) tb="$tb coff-sh.o cofflink.o" ;; - shlcoff_vec) tb="$tb coff-sh.o cofflink.o" ;; - som_vec) tb="$tb som.o" ;; - sparclynx_aout_vec) tb="$tb sparclynx.o lynx-core.o aout32.o" ;; - sparclynx_coff_vec) tb="$tb cf-sparclynx.o lynx-core.o" ;; - sparcnetbsd_vec) tb="$tb sparcnetbsd.o aout32.o" ;; - sparccoff_vec) tb="$tb coff-sparc.o" ;; - srec_vec) tb="$tb srec.o" ;; - sunos_big_vec) tb="$tb sunos.o aout32.o" ;; - symbolsrec_vec) tb="$tb srec.o" ;; - tekhex_vec) tb="$tb tekhex.o" ;; - we32kcoff_vec) tb="$tb coff-we32k.o" ;; - z8kcoff_vec) tb="$tb coff-z8k.o reloc16.o" ;; - w65_vec) tb="$tb coff-w65.o reloc16.o" ;; - versados_vec) tb="$tb versados.o" ;; - - "") ;; - *) { echo "configure: error: *** unknown target vector $vec" 1>&2; exit 1; } ;; - esac -done - -# Target architecture .o files. -ta=`echo $selarchs | sed -e s/bfd_/cpu-/g -e s/_arch/.o/g` - -# Weed out duplicate .o files. -f="" -for i in $tb ; do - case " $f " in - *" $i "*) ;; - *) f="$f $i" ;; - esac -done -tb="$f" - -f="" -for i in $ta ; do - case " $f " in - *" $i "*) ;; - *) f="$f $i" ;; - esac -done -ta="$f" - -bfd_backends="$tb" -bfd_machines="$ta" - -if test x${all_targets} = xtrue ; then - bfd_backends="${bfd_backends}"' $(ALL_BACKENDS)' - bfd_machines="${bfd_machines}"' $(ALL_MACHINES)' - selvecs= - selarchs= -else # all_targets is true - # Only set these if they will be nonempty, for the clever echo. - test -n "$selvecs" && - selvecs=`echo $selvecs | sed -e 's/^/\&/' -e 's/ \(.\)/,\&\1/g'` - test -n "$selarchs" && - selarchs=`echo $selarchs | sed -e 's/^/\&/' -e 's/ \(.\)/,\&\1/g'` -fi # all_targets is true - -case ${host64}-${target64}-${want64} in - *true*) - wordsize=64 - all_backends='$(BFD64_BACKENDS) $(BFD32_BACKENDS)' - ;; - false-false-false) - wordsize=32 - all_backends='$(BFD32_BACKENDS)' - ;; -esac - - - - - - -tdefaults="" -test -n "${defvec}" && tdefaults="${tdefaults} -DDEFAULT_VECTOR=${defvec}" -test -n "${selvecs}" && tdefaults="${tdefaults} -DSELECT_VECS='${selvecs}'" -test -n "${selarchs}" && tdefaults="${tdefaults} -DSELECT_ARCHITECTURES='${selarchs}'" - - -for ac_func in valloc getpagesize -do -echo $ac_n "checking for $ac_func""... $ac_c" 1>&6 -if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - cat > conftest.$ac_ext <<EOF -#line 1928 "configure" -#include "confdefs.h" -/* System header to define __stub macros and hopefully few prototypes, - which can conflict with char $ac_func(); below. */ -#include <assert.h> -/* Override any gcc2 internal prototype to avoid an error. */ -char $ac_func(); - -int main() { return 0; } -int t() { - -/* The GNU C library defines this for functions which it implements - to always fail with ENOSYS. Some functions are actually named - something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) -choke me -#else -$ac_func(); -#endif - -; return 0; } -EOF -if { (eval echo configure:1950: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; }; then - rm -rf conftest* - eval "ac_cv_func_$ac_func=yes" -else - rm -rf conftest* - eval "ac_cv_func_$ac_func=no" -fi -rm -f conftest* - -fi -if eval "test \"`echo '$ac_cv_func_'$ac_func`\" = yes"; then - echo "$ac_t""yes" 1>&6 - ac_tr_func=HAVE_`echo $ac_func | tr 'abcdefghijklmnopqrstuvwxyz' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'` - cat >> confdefs.h <<EOF -#define $ac_tr_func 1 -EOF - -else - echo "$ac_t""no" 1>&6 -fi -done - -echo $ac_n "checking for working mmap""... $ac_c" 1>&6 -if eval "test \"`echo '$''{'ac_cv_func_mmap'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - if test "$cross_compiling" = yes; then - ac_cv_func_mmap=no -else -cat > conftest.$ac_ext <<EOF -#line 1980 "configure" -#include "confdefs.h" - -/* Thanks to Mike Haertel and Jim Avera for this test. */ -#include <sys/types.h> -#include <fcntl.h> -#include <sys/mman.h> - -#ifndef HAVE_GETPAGESIZE -# include <sys/param.h> -# ifdef EXEC_PAGESIZE -# define getpagesize() EXEC_PAGESIZE -# else -# ifdef NBPG -# define getpagesize() NBPG * CLSIZE -# ifndef CLSIZE -# define CLSIZE 1 -# endif -# else -# ifdef NBPC -# define getpagesize() NBPC -# else -# define getpagesize() PAGESIZE /* SVR4 */ -# endif -# endif -# endif -#endif - -#ifndef HAVE_VALLOC -# define valloc malloc -#endif - -#ifdef __cplusplus -extern "C" { void *valloc(unsigned), *malloc(unsigned); } -#else -char *valloc(), *malloc(); -#endif - -int -main() -{ - char *buf1, *buf2, *buf3; - int i = getpagesize(), j; - int i2 = i * 2; - int fd; - - buf1 = (char *)valloc(i2); - buf2 = (char *)valloc(i); - buf3 = (char *)malloc(i2); - for (j = 0; j < i2; ++j) - *(buf1 + j) = rand(); - fd = open("conftestmmap", O_CREAT | O_RDWR, 0666); - write(fd, buf1, i2); - mmap(buf2, i, PROT_READ | PROT_WRITE, MAP_FIXED | MAP_PRIVATE, fd, 0); - for (j = 0; j < i; ++j) - if (*(buf1 + j) != *(buf2 + j)) - exit(1); - lseek(fd, (long)i, 0); - read(fd, buf2, i); /* read into mapped memory -- file should not change */ - /* (it does in i386 SVR4.0 - Jim Avera, jima@netcom.com) */ - lseek(fd, (long)0, 0); - read(fd, buf3, i2); - for (j = 0; j < i2; ++j) - if (*(buf1 + j) != *(buf3 + j)) - exit(1); - exit(0); -} - -EOF -{ (eval echo configure:2049: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } -if test -s conftest && (./conftest; exit) 2>/dev/null; then - ac_cv_func_mmap=yes -else - ac_cv_func_mmap=no -fi -fi -rm -fr conftest* -fi - -echo "$ac_t""$ac_cv_func_mmap" 1>&6 -if test $ac_cv_func_mmap = yes; then - cat >> confdefs.h <<\EOF -#define HAVE_MMAP 1 -EOF - -fi - -for ac_func in madvise mprotect -do -echo $ac_n "checking for $ac_func""... $ac_c" 1>&6 -if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - cat > conftest.$ac_ext <<EOF -#line 2074 "configure" -#include "confdefs.h" -/* System header to define __stub macros and hopefully few prototypes, - which can conflict with char $ac_func(); below. */ -#include <assert.h> -/* Override any gcc2 internal prototype to avoid an error. */ -char $ac_func(); - -int main() { return 0; } -int t() { - -/* The GNU C library defines this for functions which it implements - to always fail with ENOSYS. Some functions are actually named - something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) -choke me -#else -$ac_func(); -#endif - -; return 0; } -EOF -if { (eval echo configure:2096: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; }; then - rm -rf conftest* - eval "ac_cv_func_$ac_func=yes" -else - rm -rf conftest* - eval "ac_cv_func_$ac_func=no" -fi -rm -f conftest* - -fi -if eval "test \"`echo '$ac_cv_func_'$ac_func`\" = yes"; then - echo "$ac_t""yes" 1>&6 - ac_tr_func=HAVE_`echo $ac_func | tr 'abcdefghijklmnopqrstuvwxyz' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'` - cat >> confdefs.h <<EOF -#define $ac_tr_func 1 -EOF - -else - echo "$ac_t""no" 1>&6 -fi -done - -case ${want_mmap}+${ac_cv_func_mmap} in - true+yes ) cat >> confdefs.h <<\EOF -#define USE_MMAP 1 -EOF - ;; -esac - -rm -f doc/config.status -trap '' 1 2 15 -cat > confcache <<\EOF -# This file is a shell script that caches the results of configure -# tests run on this system so they can be shared between configure -# scripts and configure runs. It is not useful on other systems. -# If it contains results you don't want to keep, you may remove or edit it. -# -# By default, configure uses ./config.cache as the cache file, -# creating it if it does not exist already. You can give configure -# the --cache-file=FILE option to use a different cache file; that is -# what configure does when it calls configure scripts in -# subdirectories, so they share the cache. -# Giving --cache-file=/dev/null disables caching, for debugging configure. -# config.status only pays attention to the cache file if you give it the -# --recheck option to rerun configure. -# -EOF -# Ultrix sh set writes to stderr and can't be redirected directly, -# and sets the high bit in the cache file unless we assign to the vars. -(set) 2>&1 | - sed -n "s/^\([a-zA-Z0-9_]*_cv_[a-zA-Z0-9_]*\)=\(.*\)/\1=\${\1='\2'}/p" \ - >> confcache -if cmp -s $cache_file confcache; then - : -else - if test -w $cache_file; then - echo "updating cache $cache_file" - cat confcache > $cache_file - else - echo "not updating unwritable cache $cache_file" - fi -fi -rm -f confcache - -trap 'rm -fr conftest* confdefs* core core.* *.core $ac_clean_files; exit 1' 1 2 15 - -test "x$prefix" = xNONE && prefix=$ac_default_prefix -# Let make expand exec_prefix. -test "x$exec_prefix" = xNONE && exec_prefix='${prefix}' - -# Any assignment to VPATH causes Sun make to only execute -# the first set of double-colon rules, so remove it if not needed. -# If there is a colon in the path, we need to keep it. -if test "x$srcdir" = x.; then - ac_vpsub='/^[ ]*VPATH[ ]*=[^:]*$/d' -fi - -trap 'rm -f $CONFIG_STATUS conftest*; exit 1' 1 2 15 - -DEFS=-DHAVE_CONFIG_H - -# Without the "./", some shells look in PATH for config.status. -: ${CONFIG_STATUS=./config.status} - -echo creating $CONFIG_STATUS -rm -f $CONFIG_STATUS -cat > $CONFIG_STATUS <<EOF -#! /bin/sh -# Generated automatically by configure. -# Run this file to recreate the current configuration. -# This directory was configured as follows, -# on host `(hostname || uname -n) 2>/dev/null | sed 1q`: -# -# $0 $ac_configure_args -# -# Compiler output produced by configure, useful for debugging -# configure, is in ./config.log if it exists. - -ac_cs_usage="Usage: $CONFIG_STATUS [--recheck] [--version] [--help]" -for ac_option -do - case "\$ac_option" in - -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) - echo "running \${CONFIG_SHELL-/bin/sh} $0 $ac_configure_args --no-create --no-recursion" - exec \${CONFIG_SHELL-/bin/sh} $0 $ac_configure_args --no-create --no-recursion ;; - -version | --version | --versio | --versi | --vers | --ver | --ve | --v) - echo "$CONFIG_STATUS generated by autoconf version 2.8" - exit 0 ;; - -help | --help | --hel | --he | --h) - echo "\$ac_cs_usage"; exit 0 ;; - *) echo "\$ac_cs_usage"; exit 1 ;; - esac -done - -ac_given_srcdir=$srcdir -ac_given_INSTALL="$INSTALL" - -trap 'rm -fr `echo "Makefile doc/Makefile config.h:config.in" | sed "s/:[^ ]*//g"` conftest*; exit 1' 1 2 15 -EOF -cat >> $CONFIG_STATUS <<EOF - -# Protect against being on the right side of a sed subst in config.status. -sed 's/%@/@@/; s/@%/@@/; s/%g\$/@g/; /@g\$/s/[\\\\&%]/\\\\&/g; - s/@@/%@/; s/@@/@%/; s/@g\$/%g/' > conftest.subs <<\\CEOF -$ac_vpsub -$extrasub -s%@CFLAGS@%$CFLAGS%g -s%@CPPFLAGS@%$CPPFLAGS%g -s%@CXXFLAGS@%$CXXFLAGS%g -s%@DEFS@%$DEFS%g -s%@LDFLAGS@%$LDFLAGS%g -s%@LIBS@%$LIBS%g -s%@exec_prefix@%$exec_prefix%g -s%@prefix@%$prefix%g -s%@program_transform_name@%$program_transform_name%g -s%@bindir@%$bindir%g -s%@sbindir@%$sbindir%g -s%@libexecdir@%$libexecdir%g -s%@datadir@%$datadir%g -s%@sysconfdir@%$sysconfdir%g -s%@sharedstatedir@%$sharedstatedir%g -s%@localstatedir@%$localstatedir%g -s%@libdir@%$libdir%g -s%@includedir@%$includedir%g -s%@oldincludedir@%$oldincludedir%g -s%@infodir@%$infodir%g -s%@mandir@%$mandir%g -s%@host@%$host%g -s%@host_alias@%$host_alias%g -s%@host_cpu@%$host_cpu%g -s%@host_vendor@%$host_vendor%g -s%@host_os@%$host_os%g -s%@target@%$target%g -s%@target_alias@%$target_alias%g -s%@target_cpu@%$target_cpu%g -s%@target_vendor@%$target_vendor%g -s%@target_os@%$target_os%g -s%@build@%$build%g -s%@build_alias@%$build_alias%g -s%@build_cpu@%$build_cpu%g -s%@build_vendor@%$build_vendor%g -s%@build_os@%$build_os%g -s%@CC@%$CC%g -s%@HDEFINES@%$HDEFINES%g -s%@AR@%$AR%g -s%@RANLIB@%$RANLIB%g -s%@INSTALL_PROGRAM@%$INSTALL_PROGRAM%g -s%@INSTALL_DATA@%$INSTALL_DATA%g -s%@ALLLIBS@%$ALLLIBS%g -s%@PICFLAG@%$PICFLAG%g -s%@SHLIB@%$SHLIB%g -s%@SHLIB_CC@%$SHLIB_CC%g -s%@SHLIB_CFLAGS@%$SHLIB_CFLAGS%g -s%@COMMON_SHLIB@%$COMMON_SHLIB%g -s%@PICLIST@%$PICLIST%g -s%@SHLINK@%$SHLINK%g -s%@HOST_64BIT_LONG@%$HOST_64BIT_LONG%g -s%@CC_FOR_BUILD@%$CC_FOR_BUILD%g -s%@CPP@%$CPP%g -s%@COREFILE@%$COREFILE%g -s%@COREFLAG@%$COREFLAG%g -s%@TDEFINES@%$TDEFINES%g -s%@wordsize@%$wordsize%g -s%@all_backends@%$all_backends%g -s%@bfd_backends@%$bfd_backends%g -s%@bfd_machines@%$bfd_machines%g -s%@tdefaults@%$tdefaults%g - -CEOF -EOF -cat >> $CONFIG_STATUS <<EOF - -CONFIG_FILES=\${CONFIG_FILES-"Makefile doc/Makefile"} -EOF -cat >> $CONFIG_STATUS <<\EOF -for ac_file in .. $CONFIG_FILES; do if test "x$ac_file" != x..; then - # Support "outfile[:infile]", defaulting infile="outfile.in". - case "$ac_file" in - *:*) ac_file_in=`echo "$ac_file"|sed 's%.*:%%'` - ac_file=`echo "$ac_file"|sed 's%:.*%%'` ;; - *) ac_file_in="${ac_file}.in" ;; - esac - - # Adjust relative srcdir, etc. for subdirectories. - - # Remove last slash and all that follows it. Not all systems have dirname. - ac_dir=`echo $ac_file|sed 's%/[^/][^/]*$%%'` - if test "$ac_dir" != "$ac_file" && test "$ac_dir" != .; then - # The file is in a subdirectory. - test ! -d "$ac_dir" && mkdir "$ac_dir" - ac_dir_suffix="/`echo $ac_dir|sed 's%^\./%%'`" - # A "../" for each directory in $ac_dir_suffix. - ac_dots=`echo $ac_dir_suffix|sed 's%/[^/]*%../%g'` - else - ac_dir_suffix= ac_dots= - fi - - case "$ac_given_srcdir" in - .) srcdir=. - if test -z "$ac_dots"; then top_srcdir=. - else top_srcdir=`echo $ac_dots|sed 's%/$%%'`; fi ;; - /*) srcdir="$ac_given_srcdir$ac_dir_suffix"; top_srcdir="$ac_given_srcdir" ;; - *) # Relative path. - srcdir="$ac_dots$ac_given_srcdir$ac_dir_suffix" - top_srcdir="$ac_dots$ac_given_srcdir" ;; - esac - - case "$ac_given_INSTALL" in - [/$]*) INSTALL="$ac_given_INSTALL" ;; - *) INSTALL="$ac_dots$ac_given_INSTALL" ;; - esac - echo creating "$ac_file" - rm -f "$ac_file" - configure_input="Generated automatically from `echo $ac_file_in|sed 's%.*/%%'` by configure." - case "$ac_file" in - *Makefile*) ac_comsub="1i\\ -# $configure_input" ;; - *) ac_comsub= ;; - esac - sed -e "$ac_comsub -s%@configure_input@%$configure_input%g -s%@srcdir@%$srcdir%g -s%@top_srcdir@%$top_srcdir%g -s%@INSTALL@%$INSTALL%g -" -f conftest.subs $ac_given_srcdir/$ac_file_in > $ac_file -fi; done -rm -f conftest.subs - -# These sed commands are passed to sed as "A NAME B NAME C VALUE D", where -# NAME is the cpp macro being defined and VALUE is the value it is being given. -# -# ac_d sets the value in "#define NAME VALUE" lines. -ac_dA='s%^\([ ]*\)#\([ ]*define[ ][ ]*\)' -ac_dB='\([ ][ ]*\)[^ ]*%\1#\2' -ac_dC='\3' -ac_dD='%g' -# ac_u turns "#undef NAME" with trailing blanks into "#define NAME VALUE". -ac_uA='s%^\([ ]*\)#\([ ]*\)undef\([ ][ ]*\)' -ac_uB='\([ ]\)%\1#\2define\3' -ac_uC=' ' -ac_uD='\4%g' -# ac_e turns "#undef NAME" without trailing blanks into "#define NAME VALUE". -ac_eA='s%^\([ ]*\)#\([ ]*\)undef\([ ][ ]*\)' -ac_eB='$%\1#\2define\3' -ac_eC=' ' -ac_eD='%g' - -CONFIG_HEADERS=${CONFIG_HEADERS-"config.h:config.in"} -for ac_file in .. $CONFIG_HEADERS; do if test "x$ac_file" != x..; then - # Support "outfile[:infile]", defaulting infile="outfile.in". - case "$ac_file" in - *:*) ac_file_in=`echo "$ac_file"|sed 's%.*:%%'` - ac_file=`echo "$ac_file"|sed 's%:.*%%'` ;; - *) ac_file_in="${ac_file}.in" ;; - esac - - echo creating $ac_file - - rm -f conftest.frag conftest.in conftest.out - cp $ac_given_srcdir/$ac_file_in conftest.in - -EOF - -# Transform confdefs.h into a sed script conftest.vals that substitutes -# the proper values into config.h.in to produce config.h. And first: -# Protect against being on the right side of a sed subst in config.status. -# Protect against being in an unquoted here document in config.status. -rm -f conftest.vals -cat > conftest.hdr <<\EOF -s/[\\&%]/\\&/g -s%[\\$`]%\\&%g -s%#define \([A-Za-z_][A-Za-z0-9_]*\) \(.*\)%${ac_dA}\1${ac_dB}\1${ac_dC}\2${ac_dD}%gp -s%ac_d%ac_u%gp -s%ac_u%ac_e%gp -EOF -sed -n -f conftest.hdr confdefs.h > conftest.vals -rm -f conftest.hdr - -# This sed command replaces #undef with comments. This is necessary, for -# example, in the case of _POSIX_SOURCE, which is predefined and required -# on some systems where configure will not decide to define it. -cat >> conftest.vals <<\EOF -s%^[ ]*#[ ]*undef[ ][ ]*[a-zA-Z_][a-zA-Z_0-9]*%/* & */% -EOF - -# Break up conftest.vals because some shells have a limit on -# the size of here documents, and old seds have small limits too. -# Maximum number of lines to put in a single here document. -ac_max_here_lines=12 - -rm -f conftest.tail -while : -do - ac_lines=`grep -c . conftest.vals` - # grep -c gives empty output for an empty file on some AIX systems. - if test -z "$ac_lines" || test "$ac_lines" -eq 0; then break; fi - # Write a limited-size here document to conftest.frag. - echo ' cat > conftest.frag <<CEOF' >> $CONFIG_STATUS - sed ${ac_max_here_lines}q conftest.vals >> $CONFIG_STATUS - echo 'CEOF - sed -f conftest.frag conftest.in > conftest.out - rm -f conftest.in - mv conftest.out conftest.in -' >> $CONFIG_STATUS - sed 1,${ac_max_here_lines}d conftest.vals > conftest.tail - rm -f conftest.vals - mv conftest.tail conftest.vals -done -rm -f conftest.vals - -cat >> $CONFIG_STATUS <<\EOF - rm -f conftest.frag conftest.h - echo "/* $ac_file. Generated automatically by configure. */" > conftest.h - cat conftest.in >> conftest.h - rm -f conftest.in - if cmp -s $ac_file conftest.h 2>/dev/null; then - echo "$ac_file is unchanged" - rm -f conftest.h - else - rm -f $ac_file - mv conftest.h $ac_file - fi -fi; done - - -case x$CONFIG_HEADERS in xconfig.h:config.in) echo > stamp-h ;; esac -exit 0 -EOF -chmod +x $CONFIG_STATUS -rm -fr confdefs* $ac_clean_files -test "$no_create" = yes || ${CONFIG_SHELL-/bin/sh} $CONFIG_STATUS || exit 1 - diff --git a/contrib/gdb/bfd/configure.bat b/contrib/gdb/bfd/configure.bat deleted file mode 100644 index 78fe79e911234..0000000000000 --- a/contrib/gdb/bfd/configure.bat +++ /dev/null @@ -1,18 +0,0 @@ -@echo off
-if "%1" == "h8/300" goto h8300
-
-echo Configuring bfd for go32
-update hosts\go32.h sysdep.h
-update Makefile.dos Makefile
-echo s/@WORDSIZE@/32/g>config.sed
-sed -e s/^/s\/@VERSION@\// -e s/$/\/g/g version >>config.sed
-sed -f config.sed < bfd-in2.h > bfd.h2
-update bfd.h2 bfd.h
-goto exit
-
-:h8300
-echo Configuring bfd for H8/300
-update hosts\h-go32.h sysdep.h
-update Makefile.dos Makefile
-
-:exit
diff --git a/contrib/gdb/bfd/configure.host b/contrib/gdb/bfd/configure.host deleted file mode 100644 index 484e5bda90ebf..0000000000000 --- a/contrib/gdb/bfd/configure.host +++ /dev/null @@ -1,128 +0,0 @@ -# This file is a shell script that overrides some of the tools and -# flags used on a host specific basis. - -# Since the "bfd/hosts" directory is shared by the bfd, opcodes, and -# binutils directories (at least), the index to it is also shared. -# This is that index. Each configure.in file should source this file -# in its per-host part. - -# This sets the following shell variables: -# HDEFINES host specific compiler options -# host64 set to true if this is a 64 bit host -# HOST_64BIT_TYPE host 64 bit type -# SHLIB_CC compiler to use when building shared library -# SHLIB_CFLAGS flags to use when building shared library -# PICFLAG may be set to flag to use to compile PIC -# SHLINK may be set to the name to link the shared library to -# ALLLIBS may be set to libraries to build -# HLDFLAGS LDFLAGS specific to the host -# RPATH_ENVVAR environment variable used to find shared libraries - -HDEFINES= -host64=false -HOST_64BIT_TYPE= - -case "${host}" in - -alpha-*-*) host64=true; HOST_64BIT_TYPE=long ;; - -hppa*-*-hpux*) HDEFINES=-DHOST_HPPAHPUX ;; -hppa*-*-hiux*) HDEFINES=-DHOST_HPPAHPUX ;; -hppa*-*-bsd*) HDEFINES=-DHOST_HPPABSD ;; -hppa*-*-osf*) HDEFINES=-DHOST_HPPAOSF ;; - -i[345]86-sequent-bsd*) HDEFINES=-Dshared=genshared ;; -i[345]86-sequent-sysv4*) ;; -i[345]86-sequent-sysv*) HDEFINES=-Dshared=genshared ;; - -mips-dec-netbsd*) ;; -mips-dec-*) HDEFINES="-G 4" ;; -mips-sgi-irix3*) HDEFINES="-G 4" ;; -mips-sgi-irix4*) HDEFINES="-G 4" ;; -mips-*-sysv4*) ;; -mips-*-sysv*) HDEFINES="-G 4" ;; -mips-*-riscos*) HDEFINES="-G 4" ;; - -m68*-hp-hpux*) HDEFINES=-DHOST_HP300HPUX ;; - -esac - -# If we are configuring with --enable-shared, adjust the shared -# library support based on the host. This support must work for both -# the BFD and the opcodes libraries. -HLDFLAGS= -RPATH_ENVVAR=LD_LIBRARY_PATH -SHLIB_CC='$(CC)' -SHLIB_CFLAGS='-shared' -if [ "${shared}" = "true" ]; then - case "${host}" in - hppa*-*-*) picfrag=../config/mh-papic ;; - i[3456]86-*-*) picfrag=../config/mh-x86pic ;; - *-*-*) picfrag=../config/mh-${host_cpu}pic ;; - esac - if [ -f "${picfrag}" ]; then - pic=`sed -n -e 's/^PICFLAG[ ]*=[ ]*\(.*\)$/\1/p' ${picfrag}` - if [ -n "${pic}" ]; then - PICFLAG=${pic} - fi - fi - - case "${host}" in - *-dec-osf*) - # -fpic is not needed on the Alpha. - PICFLAG= - ;; - *-*-hpux*) - # HP/UX uses .sl for shared libraries. - SHLINK=`echo ${SHLINK} | sed -e 's/so$/sl/'` - SHLIB_CFLAGS='-shared $(PICFLAG)' - HLDFLAGS='-Wl,+s,+b,$(libdir)' - RPATH_ENVVAR=SHLIB_PATH - ;; - *-*-irix5*) - # -fpic is not needed on Irix 5. - PICFLAG= - SHLIB_CFLAGS='-shared -Wl,-soname,$(SONAME)' - HLDFLAGS='-Wl,-rpath,$(libdir)' - ;; - *-*-linux*aout*) - ;; - *-*-linux*) - SHLIB_CFLAGS='-shared -Wl,-soname,$(SONAME)' - case "$(libdir)" in - /lib | /usr/lib) ;; - *) HLDFLAGS='-Wl,-rpath,$(libdir)' ;; - esac - ;; - *-*-sysv4* | *-*-solaris*) - SHLIB_CFLAGS='-shared -h $(SONAME)' - HLDFLAGS='-R $(libdir)' - ;; - *-*-sunos*) - # Build a libTARGET-bfd.so.VERSION symlink in the object directory. - ALLLIBS=`echo ${ALLLIBS} | sed -e 's/\$(SHLINK)/stamp-tshlink/'` - ;; - esac -fi - -# On SunOS, if the linker supports the -rpath option, use it to -# prevent ../bfd and ../opcodes from being included in the run time -# search path. -case "${host}" in - *-*-sunos*) - echo 'main () { }' > conftest.c - ${CC} -o conftest -Wl,-rpath= conftest.c >/dev/null 2>conftest.t - if grep 'unrecognized' conftest.t >/dev/null 2>&1; then - : - elif grep 'No such file' conftest.t >/dev/null 2>&1; then - : - elif grep 'do not mix' conftest.t >/dev/null 2>&1; then - : - elif [ "${shared}" = "true" ]; then - HLDFLAGS='-Wl,-rpath=$(libdir)' - else - HLDFLAGS='-Wl,-rpath=' - fi - rm -f conftest.t conftest.c conftest - ;; -esac diff --git a/contrib/gdb/bfd/configure.in b/contrib/gdb/bfd/configure.in deleted file mode 100644 index c8b8de54fe921..0000000000000 --- a/contrib/gdb/bfd/configure.in +++ /dev/null @@ -1,577 +0,0 @@ -dnl Process this file with autoconf to produce a configure script. -dnl -AC_PREREQ(2.3) -AC_INIT(libbfd.c) - -AC_ARG_ENABLE(64-bit-bfd, -[ --enable-64-bit-bfd 64-bit support (on hosts with narrower word sizes)], -[case "${enableval}" in - yes) want64=true ;; - no) want64=false ;; - *) AC_MSG_ERROR(bad value ${enableval} for 64-bit-bfd option) ;; -esac],[want64=false])dnl -AC_ARG_ENABLE(targets, -[ --enable-targets alternative target configurations], -[case "${enableval}" in - yes | "") AC_ERROR(enable-targets option must specify target names or 'all') - ;; - no) enable_targets= ;; - *) enable_targets=$enableval ;; -esac])dnl -AC_ARG_ENABLE(shared, -[ --enable-shared build shared BFD library], -[case "${enableval}" in - yes) shared=true ;; - no) shared=false ;; - *) AC_MSG_ERROR([bad value ${enableval} for BFD shared option]) ;; -esac])dnl -AC_ARG_ENABLE(commonbfdlib, -[ --enable-commonbfdlib build shared BFD/opcodes/libiberty library], -[case "${enableval}" in - yes) commonbfdlib=true ;; - no) commonbfdlib=false ;; - *) AC_MSG_ERROR([bad value ${enableval} for BFD commonbfdlib option]) ;; -esac])dnl -AC_ARG_WITH(mmap, -[ --with-mmap try using mmap for BFD input files if available], -[case "${withval}" in - yes) want_mmap=true ;; - no) want_mmap=false ;; - *) AC_MSG_ERROR(bad value ${withval} for BFD with-mmap option) ;; -esac],[want_mmap=false])dnl - -AC_CONFIG_HEADER(config.h:config.in) - -AC_CONFIG_AUX_DIR(`cd $srcdir/..;pwd`) -AC_CANONICAL_SYSTEM -if test -z "$target" ; then - AC_MSG_ERROR(Unrecognized target system type; please check config.sub.) -fi -AC_ARG_PROGRAM - -host64=false -target64=false - -# host stuff: - -ALLLIBS='$(TARGETLIB)' -PICFLAG= -SHLIB=unused-shlib -SHLINK=unused-shlink -if test "${shared}" = "true"; then - PICFLAG=-fpic - if test "${commonbfdlib}" = "true"; then - ALLLIBS='$(TARGETLIB)' - else - ALLLIBS='$(TARGETLIB) $(SHLIB) $(SHLINK)' -changequote(,)dnl - SHLIB=libbfd.so.`sed -e 's/[^0-9]*\([0-9.]*\).*/\1/' ${srcdir}/VERSION` -changequote([,])dnl - SHLINK=libbfd.so - fi -fi - -AC_PROG_CC - -# Permit host specific settings. -. ${srcdir}/configure.host - -AC_SUBST(HDEFINES) -AC_CHECK_TOOL(AR, ar) -AC_CHECK_TOOL(RANLIB, ranlib, :) -AC_PROG_INSTALL - -if test "${shared}" = "true"; then - if test "${GCC}" != "yes" && test "${shared_non_gcc}" != "yes"; then - AC_MSG_WARN([BFD --enable-shared only supported when using gcc]) - shared=false - ALLLIBS='$(TARGETLIB)' - PICFLAG= - SHLIB=unused-shlib - fi -fi - -AC_SUBST(ALLLIBS) -AC_SUBST(PICFLAG) -AC_SUBST(SHLIB) -AC_SUBST(SHLIB_CC) -AC_SUBST(SHLIB_CFLAGS) -if test "${commonbfdlib}" = "true"; then - COMMON_SHLIB=yes - PICLIST=piclist -else - COMMON_SHLIB= - PICLIST= -fi -AC_SUBST(COMMON_SHLIB) -AC_SUBST(PICLIST) -AC_SUBST(SHLINK) - -HOST_64BIT_LONG=0 -if test "x${HOST_64BIT_TYPE}" = "xlong"; then - HOST_64BIT_LONG=1 -fi -AC_SUBST(HOST_64BIT_LONG) - -BFD_CC_FOR_BUILD - -AC_CHECK_HEADERS(stddef.h string.h strings.h stdlib.h time.h unistd.h) -AC_CHECK_HEADERS(fcntl.h sys/file.h sys/time.h) -AC_HEADER_TIME -AC_CHECK_FUNCS(fcntl getpagesize) - -BFD_BINARY_FOPEN - -BFD_NEED_DECLARATION(malloc) -BFD_NEED_DECLARATION(free) - -# If we are configured native, pick a core file support file. -COREFILE= -COREFLAG= -if test "${target}" = "${host}"; then - case "${host}" in - alpha*-*-linux*) - COREFILE=trad-core.o - AC_DEFINE(TRAD_HEADER,"hosts/alphalinux.h") - ;; - alpha*-*-*) COREFILE=osf-core.o ;; - arm-*-riscix) COREFILE=trad-core.o ;; - hppa*-*-hpux*) COREFILE=hpux-core.o ;; - hppa*-*-hiux*) COREFILE=hpux-core.o ;; - hppa*-*-bsd*) COREFILE="hpux-core.o hppabsd-core.o" - COREFLAG="-DHPUX_CORE -DHPPABSD_CORE" ;; -changequote(,)dnl - i[345]86-sequent-bsd*) -changequote([,])dnl - COREFILE=trad-core.o; - AC_DEFINE(TRAD_HEADER,"hosts/symmetry.h") - ;; -changequote(,)dnl - i[345]86-sequent-sysv4*) ;; - i[345]86-sequent-sysv*) -changequote([,])dnl - COREFILE=trad-core.o - AC_DEFINE(TRAD_HEADER,"hosts/symmetry.h") - ;; -changequote(,)dnl - i[345]86-*-bsd* | i[345]86-*-freebsd*) -changequote([,])dnl - COREFILE=trad-core.o - AC_DEFINE(TRAD_HEADER,"hosts/i386bsd.h") - ;; -changequote(,)dnl - i[345]86-*-netbsd*) -changequote([,])dnl - COREFILE=netbsd-core.o - ;; -changequote(,)dnl - i[345]86-esix-sysv3*) -changequote([,])dnl - COREFILE=trad-core.o - AC_DEFINE(TRAD_HEADER,"hosts/esix.h") - ;; -changequote(,)dnl - i[345]86-*-sco* | i[345]86-*-isc*) -changequote([,])dnl - COREFILE=trad-core.o - AC_DEFINE(TRAD_HEADER,"hosts/i386sco.h") - ;; -changequote(,)dnl - i[345]86-*-mach3*) -changequote([,])dnl - COREFILE=trad-core.o - AC_DEFINE(TRAD_HEADER,"hosts/i386mach3.h") - ;; -changequote(,)dnl - i[345]86-*-linux*) -changequote([,])dnl - COREFILE=trad-core.o - AC_DEFINE(TRAD_HEADER,"hosts/i386linux.h") - ;; -changequote(,)dnl - i[345]86-*-isc*) COREFILE=trad-core.o ;; - i[345]86-*-aix*) COREFILE=aix386-core.o ;; -changequote([,])dnl - i860-*-mach3* | i860-*-osf1*) - COREFILE=trad-core.o - AC_DEFINE(TRAD_HEADER,"hosts/i860mach3.h") - ;; - mips-dec-bsd*) - COREFILE=trad-core.o - AC_DEFINE(TRAD_HEADER,"hosts/mipsbsd.h") - ;; - mips-dec-mach3*) - COREFILE=trad-core.o - AC_DEFINE(TRAD_HEADER,"hosts/mipsmach3.h") - ;; - mips-*-netbsd*) - COREFILE=netbsd-core.o - ;; - mips-dec-*) - COREFILE=trad-core.o - AC_DEFINE(TRAD_HEADER,"hosts/decstation.h") - ;; - mips-sgi-irix4*) COREFILE=irix-core.o ;; - mips-sgi-irix5*) COREFILE=irix-core.o ;; - mips-*-mach3*) - COREFILE=trad-core.o - AC_DEFINE(TRAD_HEADER,"hosts/mipsmach3.h") - ;; - mips-*-sysv4*) ;; - mips-*-sysv* | mips-*-riscos*) - COREFILE=trad-core.o - AC_DEFINE(TRAD_HEADER,"hosts/riscos.h") - ;; - mips-sony-bsd*) - COREFILE=trad-core.o - AC_DEFINE(TRAD_HEADER,"hosts/news-mips.h") - ;; - m68*-bull*-sysv*) - COREFILE=trad-core.o - AC_DEFINE(TRAD_HEADER,"hosts/dpx2.h") - ;; - m68*-hp-hpux*) COREFILE=hpux-core.o ;; - m68*-hp-bsd*) - COREFILE=trad-core.o - AC_DEFINE(TRAD_HEADER,"hosts/hp300bsd.h") - ;; - m68*-*-linux*) - COREFILE=trad-core.o - AC_DEFINE(TRAD_HEADER,"hosts/m68klinux.h") - ;; - m68*-motorola-sysv*) - COREFILE=trad-core.o - AC_DEFINE(TRAD_HEADER, "hosts/delta68.h") - ;; - m68*-sony-*) - COREFILE=trad-core.o - AC_DEFINE(TRAD_HEADER,"hosts/news.h") - ;; - m68*-*-netbsd*) - COREFILE=netbsd-core.o - ;; - m68*-apple-aux*) - COREFILE=trad-core.o - AC_DEFINE(TRAD_HEADER,"hosts/m68kaux.h") - ;; - m88*-*-sysv4*) ;; - m88*-motorola-sysv*) COREFILE=ptrace-core.o ;; - m88*-*-mach3*) - COREFILE=trad-core.o - AC_DEFINE(TRAD_HEADER,"hosts/m88kmach3.h") - ;; - ns32k-pc532-mach) - COREFILE=trad-core.o - AC_DEFINE(TRAD_HEADER,"hosts/pc532mach.h") - ;; - ns32k-*-netbsd*) - COREFILE=netbsd-core.o - ;; - rs6000-*-lynx*) COREFILE=lynx-core.o ;; - rs6000-*-aix4*) COREFILE=rs6000-core.o ;; - rs6000-*-*) COREFILE=rs6000-core.o ;; - powerpc-*-aix4*) COREFILE=rs6000-core.o ;; - powerpc-*-aix*) COREFILE=rs6000-core.o ;; - sparc-*-netbsd*) - COREFILE=netbsd-core.o - ;; - tahoe-*-*) - COREFILE=trad-core.o - AC_DEFINE(TRAD_HEADER,"hosts/tahoe.h") - ;; - vax-*-ultrix2*) - COREFILE=trad-core.o - AC_DEFINE(TRAD_HEADER,"hosts/vaxult2.h") - ;; - vax-*-ultrix*) - COREFILE=trad-core.o - AC_DEFINE(TRAD_HEADER,"hosts/vaxult2.h") - ;; - vax-*-*) - COREFILE=trad-core.o - AC_DEFINE(TRAD_HEADER,"hosts/vaxbsd.h") - ;; - esac - - case "$COREFILE" in - aix386-core.o) COREFLAG=-DAIX386_CORE ;; - hppabsd-core.o) COREFLAG=-DHPPABSD_CORE ;; - hpux-core.o) COREFLAG=-DHPUX_CORE ;; - irix-core.o) COREFLAG=-DIRIX_CORE ;; - lynx-core.o) COREFLAG=-DLYNX_CORE ;; - osf-core.o) COREFLAG=-DOSF_CORE ;; - ptrace-core.o) COREFLAG=-DPTRACE_CORE ;; - rs6000-core.o) COREFLAG="$COREFLAG -DAIX_CORE" ;; - trad-core.o) COREFLAG="$COREFLAG -DTRAD_CORE" ;; - esac - - # The ELF code uses the native <sys/procfs.h> to handle core files. - # Define HAVE_SYS_PROCFS_H if the file exists and defines - # prstatus_t. - AC_MSG_CHECKING([for sys/procfs.h]) - AC_CACHE_VAL(bfd_cv_header_sys_procfs_h, - [AC_TRY_COMPILE([#include <sys/procfs.h>], - [prstatus_t t;], - bfd_cv_header_sys_procfs_h=yes, bfd_cv_header_sys_procfs_h=no)]) - AC_MSG_RESULT($bfd_cv_header_sys_procfs_h) - if test $bfd_cv_header_sys_procfs_h = yes; then - AC_DEFINE(HAVE_SYS_PROCFS_H) - fi - -fi -AC_SUBST(COREFILE) -AC_SUBST(COREFLAG) - -# target stuff: - -# Canonicalize the secondary target names. -if test -n "$enable_targets" ; then - for targ in `echo $enable_targets | sed 's/,/ /g'` - do - result=`$ac_config_sub $targ 2>/dev/null` - if test -n "$result" ; then - canon_targets="$canon_targets $result" - else - # Allow targets that config.sub doesn't recognize, like "all". - canon_targets="$canon_targets $targ" - fi - done -fi - -all_targets=false -defvec= -selvecs= -selarchs= -TDEFINES= -for targ in $target $canon_targets -do - if test "x$targ" = "xall"; then - all_targets=true - else - . $srcdir/config.bfd - if test "x$targ" = "x$target"; then - defvec=$targ_defvec - fi - selvecs="$selvecs $targ_defvec $targ_selvecs" - selarchs="$selarchs $targ_archs" - TDEFINES="$TDEFINES $targ_cflags" - fi -done -AC_SUBST(TDEFINES) - -# This processing still needs to be done if we're to decide properly whether -# 64-bit support needs to be compiled in. Currently, it will be included if -# the default or any other explicitly requested target requires it; it -# will not be included on a 32-bit host if no 64-bit target is requested, and -# no "--with-64-bit-bfd" option is given, even if "--with-targets=all" is -# used. - -# uniq the default and selected vectors in all the configured targets. -f="" -for i in $selvecs ; do - case " $f " in - *" $i "*) ;; - *) f="$f $i" ;; - esac -done -selvecs="$f" - -# uniq the architectures in all the configured targets. -f="" -for i in $selarchs ; do - case " $f " in - *" $i "*) ;; - *) f="$f $i" ;; - esac -done -selarchs="$f" - -# Target backend .o files. -tb= - -elf="elf.o elflink.o" - -for vec in $selvecs -do - case "$vec" in - # This list is alphabetized to make it easy to compare - # with the two vector lists in targets.c. - a29kcoff_big_vec) tb="$tb coff-a29k.o cofflink.o" ;; - a_out_adobe_vec) tb="$tb aout-adobe.o aout32.o" ;; - armcoff_little_vec) tb="$tb coff-arm.o cofflink.o " ;; - armcoff_big_vec) tb="$tb coff-arm.o cofflink.o " ;; - armpe_little_vec) tb="$tb pe-arm.o cofflink.o " ;; - armpe_big_vec) tb="$tb pe-arm.o cofflink.o " ;; - armpei_little_vec) tb="$tb pei-arm.o cofflink.o " ;; - armpei_big_vec) tb="$tb pei-arm.o cofflink.o " ;; - aout0_big_vec) tb="$tb aout0.o aout32.o" ;; - aout_arm_big_vec) tb="$tb aout-arm.o aout32.o" ;; - aout_arm_little_vec) tb="$tb aout-arm.o aout32.o" ;; - aout_mips_big_vec) tb="$tb mipsbsd.o aout32.o" ;; - aout_mips_little_vec) tb="$tb mipsbsd.o aout32.o" ;; - apollocoff_vec) tb="$tb coff-apollo.o" ;; - b_out_vec_big_host) tb="$tb bout.o aout32.o" ;; - b_out_vec_little_host) tb="$tb bout.o aout32.o" ;; - bfd_elf32_big_generic_vec) tb="$tb elf32-gen.o elf32.o $elf" ;; - bfd_elf32_bigmips_vec) tb="$tb elf32-mips.o elf32.o $elf ecofflink.o" ;; - bfd_elf32_hppa_vec) tb="$tb elf32-hppa.o elf32.o $elf" ;; - bfd_elf32_i386_vec) tb="$tb elf32-i386.o elf32.o $elf" ;; - bfd_elf32_i860_vec) tb="$tb elf32-i860.o elf32.o $elf" ;; - bfd_elf32_little_generic_vec) tb="$tb elf32-gen.o elf32.o $elf" ;; - bfd_elf32_littlemips_vec) tb="$tb elf32-mips.o elf32.o $elf ecofflink.o" ;; - bfd_elf32_m68k_vec) tb="$tb elf32-m68k.o elf32.o $elf" ;; - bfd_elf32_m88k_vec) tb="$tb elf32-m88k.o elf32.o $elf" ;; - bfd_elf32_powerpc_vec) tb="$tb elf32-ppc.o elf32.o $elf" ;; - bfd_elf32_powerpcle_vec) tb="$tb elf32-ppc.o elf32.o $elf" ;; - bfd_elf32_sparc_vec) tb="$tb elf32-sparc.o elf32.o $elf" ;; - bfd_elf64_big_generic_vec) tb="$tb elf64-gen.o elf64.o $elf" - target64=true ;; - bfd_elf64_little_generic_vec) tb="$tb elf64-gen.o elf64.o $elf" - target64=true ;; - bfd_elf64_sparc_vec) tb="$tb elf64-sparc.o elf64.o $elf" - target64=true ;; - cisco_core_vec) tb="$tb cisco-core.o" ;; - demo_64_vec) tb="$tb demo64.o aout64.o" - target64=true ;; - ecoff_big_vec) tb="$tb coff-mips.o ecoff.o ecofflink.o" ;; - ecoff_little_vec) tb="$tb coff-mips.o ecoff.o ecofflink.o" ;; - ecoffalpha_little_vec) tb="$tb coff-alpha.o ecoff.o ecofflink.o" - target64=true ;; - h8300coff_vec) tb="$tb coff-h8300.o reloc16.o" ;; - h8500coff_vec) tb="$tb coff-h8500.o reloc16.o" ;; - host_aout_vec) tb="$tb host-aout.o aout32.o" ;; - hp300bsd_vec) tb="$tb hp300bsd.o aout32.o" ;; - hp300hpux_vec) tb="$tb hp300hpux.o aout32.o" ;; - i386aout_vec) tb="$tb i386aout.o aout32.o" ;; - i386bsd_vec) tb="$tb i386bsd.o aout32.o" ;; - i386coff_vec) tb="$tb coff-i386.o cofflink.o" ;; - i386dynix_vec) tb="$tb i386dynix.o aout32.o" ;; - i386freebsd_vec) tb="$tb i386freebsd.o aout32.o" ;; - i386msdos_vec) tb="$tb i386msdos.o" ;; - i386pe_vec) tb="$tb pe-i386.o cofflink.o " ;; - i386pei_vec) tb="$tb pei-i386.o cofflink.o" ;; - i386linux_vec) tb="$tb i386linux.o aout32.o" ;; - i386lynx_aout_vec) tb="$tb i386lynx.o lynx-core.o aout32.o" ;; - i386lynx_coff_vec) tb="$tb cf-i386lynx.o cofflink.o lynx-core.o" ;; - i386mach3_vec) tb="$tb i386mach3.o aout32.o" ;; - i386netbsd_vec) tb="$tb i386netbsd.o aout32.o" ;; - i386os9k_vec) tb="$tb i386os9k.o aout32.o" ;; - i860coff_vec) tb="$tb coff-i860.o cofflink.o" ;; - icoff_big_vec) tb="$tb coff-i960.o cofflink.o" ;; - icoff_little_vec) tb="$tb coff-i960.o cofflink.o" ;; - ieee_vec) tb="$tb ieee.o" ;; - m68kcoff_vec) tb="$tb coff-m68k.o cofflink.o" ;; - m68kcoffun_vec) tb="$tb coff-u68k.o coff-m68k.o cofflink.o" ;; - m68klinux_vec) tb="$tb m68klinux.o aout32.o" ;; - m68klynx_aout_vec) tb="$tb m68klynx.o lynx-core.o aout32.o" ;; - m68klynx_coff_vec) tb="$tb cf-m68klynx.o coff-m68k.o cofflink.o lynx-core.o" ;; - m68knetbsd_vec) tb="$tb m68knetbsd.o aout32.o" ;; - m68k4knetbsd_vec) tb="$tb m68k4knetbsd.o aout32.o" ;; - m68kaux_coff_vec) tb="$tb coff-aux.o coff-m68k.o cofflink.o" ;; - m88kbcs_vec) tb="$tb coff-m88k.o" ;; - newsos3_vec) tb="$tb newsos3.o aout32.o" ;; - nlm32_i386_vec) tb="$tb nlm32-i386.o nlm32.o nlm.o" ;; - nlm32_sparc_vec) tb="$tb nlm32-sparc.o nlm32.o nlm.o" ;; - nlm32_alpha_vec) tb="$tb nlm32-alpha.o nlm32.o nlm.o" - target64=true ;; - riscix_vec) tb="$tb aout32.o riscix.o" ;; - nlm32_powerpc_vec) tb="$tb nlm32-ppc.o nlm32.o nlm.o" ;; - pc532netbsd_vec) tb="$tb ns32knetbsd.o aout-ns32k.o" ;; - pc532machaout_vec) tb="$tb pc532-mach.o aout-ns32k.o" ;; - pmac_xcoff_vec) tb="$tb coff-pmac.o xcofflink.o" ;; - rs6000coff_vec) tb="$tb coff-rs6000.o xcofflink.o" ;; - bfd_powerpc_pe_vec) tb="$tb pe-ppc.o cofflink.o" ;; - bfd_powerpcle_pe_vec) tb="$tb pe-ppc.o cofflink.o" ;; - bfd_powerpc_pei_vec) tb="$tb pei-ppc.o cofflink.o" ;; - bfd_powerpcle_pei_vec) tb="$tb pei-ppc.o cofflink.o" ;; - shcoff_vec) tb="$tb coff-sh.o cofflink.o" ;; - shlcoff_vec) tb="$tb coff-sh.o cofflink.o" ;; - som_vec) tb="$tb som.o" ;; - sparclynx_aout_vec) tb="$tb sparclynx.o lynx-core.o aout32.o" ;; - sparclynx_coff_vec) tb="$tb cf-sparclynx.o lynx-core.o" ;; - sparcnetbsd_vec) tb="$tb sparcnetbsd.o aout32.o" ;; - sparccoff_vec) tb="$tb coff-sparc.o" ;; - srec_vec) tb="$tb srec.o" ;; - sunos_big_vec) tb="$tb sunos.o aout32.o" ;; - symbolsrec_vec) tb="$tb srec.o" ;; - tekhex_vec) tb="$tb tekhex.o" ;; - we32kcoff_vec) tb="$tb coff-we32k.o" ;; - z8kcoff_vec) tb="$tb coff-z8k.o reloc16.o" ;; - w65_vec) tb="$tb coff-w65.o reloc16.o" ;; - versados_vec) tb="$tb versados.o" ;; - - "") ;; - *) AC_MSG_ERROR(*** unknown target vector $vec) ;; - esac -done - -# Target architecture .o files. -ta=`echo $selarchs | sed -e s/bfd_/cpu-/g -e s/_arch/.o/g` - -# Weed out duplicate .o files. -f="" -for i in $tb ; do - case " $f " in - *" $i "*) ;; - *) f="$f $i" ;; - esac -done -tb="$f" - -f="" -for i in $ta ; do - case " $f " in - *" $i "*) ;; - *) f="$f $i" ;; - esac -done -ta="$f" - -bfd_backends="$tb" -bfd_machines="$ta" - -if test x${all_targets} = xtrue ; then - bfd_backends="${bfd_backends}"' $(ALL_BACKENDS)' - bfd_machines="${bfd_machines}"' $(ALL_MACHINES)' - selvecs= - selarchs= -else # all_targets is true - # Only set these if they will be nonempty, for the clever echo. - test -n "$selvecs" && - selvecs=`echo $selvecs | sed -e 's/^/\&/' -e 's/ \(.\)/,\&\1/g'` - test -n "$selarchs" && - selarchs=`echo $selarchs | sed -e 's/^/\&/' -e 's/ \(.\)/,\&\1/g'` -fi # all_targets is true - -case ${host64}-${target64}-${want64} in - *true*) - wordsize=64 - all_backends='$(BFD64_BACKENDS) $(BFD32_BACKENDS)' - ;; - false-false-false) - wordsize=32 - all_backends='$(BFD32_BACKENDS)' - ;; -esac - -AC_SUBST(wordsize) -AC_SUBST(all_backends) -AC_SUBST(bfd_backends) -AC_SUBST(bfd_machines) - -tdefaults="" -test -n "${defvec}" && tdefaults="${tdefaults} -DDEFAULT_VECTOR=${defvec}" -test -n "${selvecs}" && tdefaults="${tdefaults} -DSELECT_VECS='${selvecs}'" -test -n "${selarchs}" && tdefaults="${tdefaults} -DSELECT_ARCHITECTURES='${selarchs}'" -AC_SUBST(tdefaults) - -dnl AC_CHECK_HEADERS(sys/mman.h) -AC_FUNC_MMAP -AC_CHECK_FUNCS(madvise mprotect) -case ${want_mmap}+${ac_cv_func_mmap} in - true+yes ) AC_DEFINE(USE_MMAP) ;; -esac - -rm -f doc/config.status -AC_OUTPUT(Makefile doc/Makefile, -[case x$CONFIG_HEADERS in xconfig.h:config.in) echo > stamp-h ;; esac]) diff --git a/contrib/gdb/bfd/corefile.c b/contrib/gdb/bfd/corefile.c deleted file mode 100644 index 212f519ce8a58..0000000000000 --- a/contrib/gdb/bfd/corefile.c +++ /dev/null @@ -1,106 +0,0 @@ -/* Core file generic interface routines for BFD. - Copyright (C) 1990, 91, 92, 93, 94 Free Software Foundation, Inc. - Written by Cygnus Support. - -This file is part of BFD, the Binary File Descriptor library. - -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 2 of the License, 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ - -/* -SECTION - Core files - -DESCRIPTION - These are functions pertaining to core files. -*/ - -#include "bfd.h" -#include "sysdep.h" -#include "libbfd.h" - - -/* -FUNCTION - bfd_core_file_failing_command - -SYNOPSIS - CONST char *bfd_core_file_failing_command(bfd *abfd); - -DESCRIPTION - Return a read-only string explaining which program was running - when it failed and produced the core file @var{abfd}. - -*/ - -CONST char * -bfd_core_file_failing_command (abfd) - bfd *abfd; -{ - if (abfd->format != bfd_core) { - bfd_set_error (bfd_error_invalid_operation); - return NULL; - } - return BFD_SEND (abfd, _core_file_failing_command, (abfd)); -} - -/* -FUNCTION - bfd_core_file_failing_signal - -SYNOPSIS - int bfd_core_file_failing_signal(bfd *abfd); - -DESCRIPTION - Returns the signal number which caused the core dump which - generated the file the BFD @var{abfd} is attached to. -*/ - -int -bfd_core_file_failing_signal (abfd) - bfd *abfd; -{ - if (abfd->format != bfd_core) { - bfd_set_error (bfd_error_invalid_operation); - return 0; - } - return BFD_SEND (abfd, _core_file_failing_signal, (abfd)); -} - - -/* -FUNCTION - core_file_matches_executable_p - -SYNOPSIS - boolean core_file_matches_executable_p - (bfd *core_bfd, bfd *exec_bfd); - -DESCRIPTION - Return <<true>> if the core file attached to @var{core_bfd} - was generated by a run of the executable file attached to - @var{exec_bfd}, <<false>> otherwise. -*/ -boolean -core_file_matches_executable_p (core_bfd, exec_bfd) - bfd *core_bfd, *exec_bfd; -{ - if ((core_bfd->format != bfd_core) || (exec_bfd->format != bfd_object)) { - bfd_set_error (bfd_error_wrong_format); - return false; - } - - return BFD_SEND (core_bfd, _core_file_matches_executable_p, - (core_bfd, exec_bfd)); -} diff --git a/contrib/gdb/bfd/cpu-a29k.c b/contrib/gdb/bfd/cpu-a29k.c deleted file mode 100644 index 5bd25a47720bd..0000000000000 --- a/contrib/gdb/bfd/cpu-a29k.c +++ /dev/null @@ -1,39 +0,0 @@ -/* BFD support for the AMD 29000 architecture. - Copyright 1992 Free Software Foundation, Inc. - Hacked by Steve Chamberlain of Cygnus Support. - -This file is part of BFD, the Binary File Descriptor library. - -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 2 of the License, 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ - -#include "bfd.h" -#include "sysdep.h" -#include "libbfd.h" - -const bfd_arch_info_type bfd_a29k_arch = - { - 32, /* 32 bits in a word */ - 32, /* 32 bits in an address */ - 8, /* 8 bits in a byte */ - bfd_arch_a29k, - 0, /* only 1 machine */ - "a29k", - "a29k", - 4, - true, /* the one and only */ - bfd_default_compatible, - bfd_default_scan , - 0, - }; diff --git a/contrib/gdb/bfd/cpu-alpha.c b/contrib/gdb/bfd/cpu-alpha.c deleted file mode 100644 index 0d66a8b74e80a..0000000000000 --- a/contrib/gdb/bfd/cpu-alpha.c +++ /dev/null @@ -1,38 +0,0 @@ -/* BFD support for the Alpha architecture. - Copyright 1992 Free Software Foundation, Inc. - -This file is part of BFD, the Binary File Descriptor library. - -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 2 of the License, 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ - -#include "bfd.h" -#include "sysdep.h" -#include "libbfd.h" - -const bfd_arch_info_type bfd_alpha_arch = - { - 64, /* 32 bits in a word */ - 64, /* 32 bits in an address */ - 8, /* 8 bits in a byte */ - bfd_arch_alpha, - 0, /* only 1 machine */ - "alpha", - "alpha", - 3, - true, /* the one and only */ - bfd_default_compatible, - bfd_default_scan , - 0, - }; diff --git a/contrib/gdb/bfd/cpu-arm.c b/contrib/gdb/bfd/cpu-arm.c deleted file mode 100644 index 92103e632f0e6..0000000000000 --- a/contrib/gdb/bfd/cpu-arm.c +++ /dev/null @@ -1,39 +0,0 @@ -/* BFD support for the ARM processor - Copyright 1994 Free Software Foundation, Inc. - Contributed by Richard Earnshaw (rwe@pegasus.esprit.ec.org) - -This file is part of BFD, the Binary File Descriptor library. - -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 2 of the License, 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ - -#include "bfd.h" -#include "sysdep.h" -#include "libbfd.h" - -const bfd_arch_info_type bfd_arm_arch = - { - 32, /* 32 bits in a word */ - 32, /* 32 bits in an address */ - 8, /* 8 bits in a byte */ - bfd_arch_arm, - 0, /* only 1 machine */ - "arm", - "arm", - 4, - true, /* the one and only */ - bfd_default_compatible, - bfd_default_scan , - 0, - }; diff --git a/contrib/gdb/bfd/cpu-h8300.c b/contrib/gdb/bfd/cpu-h8300.c deleted file mode 100644 index 380dfb5556e96..0000000000000 --- a/contrib/gdb/bfd/cpu-h8300.c +++ /dev/null @@ -1,246 +0,0 @@ -/* BFD library support routines for the Hitachi H8/300 architecture. - Copyright (C) 1990, 91, 92, 93, 94, 1995 Free Software Foundation, Inc. - Hacked by Steve Chamberlain of Cygnus Support. - -This file is part of BFD, the Binary File Descriptor library. - -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 2 of the License, 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ - -#include "bfd.h" -#include "sysdep.h" -#include "libbfd.h" - -#if 0 /* not used currently */ -/* -Relocations for the H8 - -*/ -static bfd_reloc_status_type -howto16_callback (abfd, reloc_entry, symbol_in, data, - ignore_input_section, ignore_bfd) - bfd * abfd; - arelent * reloc_entry; - struct symbol_cache_entry *symbol_in; - PTR data; - asection * ignore_input_section; - bfd * ignore_bfd; -{ - long relocation = 0; - bfd_vma addr = reloc_entry->address; - long x = bfd_get_16 (abfd, (bfd_byte *) data + addr); - - HOWTO_PREPARE (relocation, symbol_in); - - x = (x + relocation + reloc_entry->addend); - - bfd_put_16 (abfd, x, (bfd_byte *) data + addr); - return bfd_reloc_ok; -} - - -static bfd_reloc_status_type -howto8_callback (abfd, reloc_entry, symbol_in, data, - ignore_input_section, ignore_bfd) - bfd * abfd; - arelent * reloc_entry; - struct symbol_cache_entry *symbol_in; - PTR data; - asection * ignore_input_section; - bfd * ignore_bfd; -{ - long relocation = 0; - bfd_vma addr = reloc_entry->address; - long x = bfd_get_8 (abfd, (bfd_byte *) data + addr); - - HOWTO_PREPARE (relocation, symbol_in); - - x = (x + relocation + reloc_entry->addend); - - bfd_put_8 (abfd, x, (bfd_byte *) data + addr); - return bfd_reloc_ok; -} - - -static bfd_reloc_status_type -howto8_FFnn_callback (abfd, reloc_entry, symbol_in, data, - ignore_input_section, ignore_bfd) - bfd * abfd; - arelent * reloc_entry; - struct symbol_cache_entry *symbol_in; - PTR data; - asection * ignore_input_section; - bfd * ignore_bfd; -{ - long relocation = 0; - bfd_vma addr = reloc_entry->address; - - long x = bfd_get_8 (abfd, (bfd_byte *) data + addr); - abort (); - HOWTO_PREPARE (relocation, symbol_in); - - x = (x + relocation + reloc_entry->addend); - - bfd_put_8 (abfd, x, (bfd_byte *) data + addr); - return bfd_reloc_ok; -} - -static bfd_reloc_status_type -howto8_pcrel_callback (abfd, reloc_entry, symbol_in, data, - ignore_input_section, ignore_bfd) - bfd * abfd; - arelent * reloc_entry; - struct symbol_cache_entry *symbol_in; - PTR data; - asection * ignore_input_section; - bfd * ignore_bfd; -{ - long relocation = 0; - bfd_vma addr = reloc_entry->address; - long x = bfd_get_8 (abfd, (bfd_byte *) data + addr); - abort (); - HOWTO_PREPARE (relocation, symbol_in); - - x = (x + relocation + reloc_entry->addend); - - bfd_put_8 (abfd, x, (bfd_byte *) data + addr); - return bfd_reloc_ok; -} - -static reloc_howto_type howto_16 -= NEWHOWTO (howto16_callback, "abs16", 1, false, false); -static reloc_howto_type howto_8 -= NEWHOWTO (howto8_callback, "abs8", 0, false, false); - -static reloc_howto_type howto_8_FFnn -= NEWHOWTO (howto8_FFnn_callback, "ff00+abs8", 0, false, false); - -static reloc_howto_type howto_8_pcrel -= NEWHOWTO (howto8_pcrel_callback, "pcrel8", 0, false, true); - -static reloc_howto_type * -local_bfd_reloc_type_lookup (arch, code) - const struct bfd_arch_info *arch; - bfd_reloc_code_real_type code; -{ - switch (code) - { - case BFD_RELOC_16: - return &howto_16; - case BFD_RELOC_8_FFnn: - return &howto_8_FFnn; - case BFD_RELOC_8: - return &howto_8; - case BFD_RELOC_8_PCREL: - return &howto_8_pcrel; - default: - return (reloc_howto_type *) NULL; - } - } -#endif - -int bfd_default_scan_num_mach (); - -static boolean -h8300_scan (info, string) - const struct bfd_arch_info *info; - const char *string; -{ - if (*string != 'h' && *string != 'H') - return false; - - string++; - if (*string != '8') - return false; - - string++; - if (*string == '/') - string++; - - if (*string != '3') - return false; - string++; - if (*string != '0') - return false; - string++; - if (*string != '0') - return false; - string++; - if (*string == '-') - string++; - if (*string == 'h' || *string == 'H') - { - return (info->mach == bfd_mach_h8300h); - } - else - { - return info->mach == bfd_mach_h8300; - } -} - - -/* This routine is provided two arch_infos and works out the - machine which would be compatible with both and returns a pointer - to its info structure */ - -static const bfd_arch_info_type * -compatible (in, out) - const bfd_arch_info_type * in; - const bfd_arch_info_type * out; -{ - /* If the output is non-H and the input is -H, that's bad */ - if (in->mach == bfd_mach_h8300h && - out->mach == bfd_mach_h8300) - return 0; - - /* If either is an -H, the answer is -H */ - if (in->mach == bfd_mach_h8300h) - return in; - return out; -} - -static const bfd_arch_info_type h8300_info_struct = -{ - 16, /* 16 bits in a word */ - 16, /* 16 bits in an address */ - 8, /* 8 bits in a byte */ - bfd_arch_h8300, - bfd_mach_h8300, - "h8300", /* arch_name */ - "h8300", /* printable name */ - 1, - true, /* the default machine */ - compatible, - h8300_scan, -/* local_bfd_reloc_type_lookup, */ - 0, -}; - - -const bfd_arch_info_type bfd_h8300_arch = -{ - 32, /* 32 bits in a word */ - 32, /* 32 bits in an address */ - 8, /* 8 bits in a byte */ - bfd_arch_h8300, - bfd_mach_h8300h, - "h8300h", /* arch_name */ - "h8300h", /* printable name */ - 1, - false, /* the default machine */ - compatible, - h8300_scan, -/* local_bfd_reloc_type_lookup, */ - &h8300_info_struct, -}; diff --git a/contrib/gdb/bfd/cpu-h8500.c b/contrib/gdb/bfd/cpu-h8500.c deleted file mode 100644 index e4abfd1780705..0000000000000 --- a/contrib/gdb/bfd/cpu-h8500.c +++ /dev/null @@ -1,199 +0,0 @@ -/* BFD library support routines for the H8/500 architecture. - Copyright (C) 1993 Free Software Foundation, Inc. - Hacked by Steve Chamberlain of Cygnus Support. - -This file is part of BFD, the Binary File Descriptor library. - -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 2 of the License, 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ - -#include "bfd.h" -#include "sysdep.h" -#include "libbfd.h" - -#if 0 - -/* -Relocations for the Z8K - -*/ -static bfd_reloc_status_type -howto16_callback (abfd, reloc_entry, symbol_in, data, - ignore_input_section, ignore_bfd) - bfd *abfd; - arelent *reloc_entry; - struct symbol_cache_entry *symbol_in; - PTR data; - asection *ignore_input_section; - bfd *ignore_bfd; -{ - long relocation = 0; - bfd_vma addr = reloc_entry->address; - long x = bfd_get_16(abfd, (bfd_byte *)data + addr); - - HOWTO_PREPARE(relocation, symbol_in); - - x = (x + relocation + reloc_entry->addend); - - bfd_put_16(abfd, x, (bfd_byte *)data + addr); - return bfd_reloc_ok; -} - - -static bfd_reloc_status_type -howto8_callback (abfd, reloc_entry, symbol_in, data, - ignore_input_section, ignore_bfd) - bfd *abfd; - arelent *reloc_entry; - struct symbol_cache_entry *symbol_in; - PTR data; - asection *ignore_input_section; - bfd *ignore_bfd; -{ - long relocation = 0; - bfd_vma addr = reloc_entry->address; - long x = bfd_get_8(abfd, (bfd_byte *)data + addr); - - HOWTO_PREPARE(relocation, symbol_in); - - x = (x + relocation + reloc_entry->addend); - - bfd_put_8(abfd, x, (bfd_byte *)data + addr); - return bfd_reloc_ok; -} - - -static bfd_reloc_status_type -howto8_FFnn_callback (abfd, reloc_entry, symbol_in, data, - ignore_input_section, ignore_bfd) - bfd *abfd; - arelent *reloc_entry; - struct symbol_cache_entry *symbol_in; - PTR data; - asection *ignore_input_section; - bfd *ignore_bfd; -{ - long relocation = 0; - bfd_vma addr = reloc_entry->address; - - long x = bfd_get_8(abfd, (bfd_byte *)data + addr); - abort(); - HOWTO_PREPARE(relocation, symbol_in); - - x = (x + relocation + reloc_entry->addend); - - bfd_put_8(abfd, x, (bfd_byte *)data + addr); - return bfd_reloc_ok; -} - -static bfd_reloc_status_type -howto8_pcrel_callback (abfd, reloc_entry, symbol_in, data, - ignore_input_section, ignore_bfd) - bfd *abfd; - arelent *reloc_entry; - struct symbol_cache_entry *symbol_in; - PTR data; - asection *ignore_input_section; - bfd *ignore_bfd; -{ - long relocation = 0; - bfd_vma addr = reloc_entry->address; - long x = bfd_get_8(abfd, (bfd_byte *)data + addr); - abort(); - HOWTO_PREPARE(relocation, symbol_in); - - x = (x + relocation + reloc_entry->addend); - - bfd_put_8(abfd, x, (bfd_byte *)data + addr); - return bfd_reloc_ok; -} - - - -static reloc_howto_type howto_16 - = NEWHOWTO(howto16_callback,"abs16",1,false,false); -static reloc_howto_type howto_8 - = NEWHOWTO(howto8_callback,"abs8",0,false,false); - -static reloc_howto_type howto_8_FFnn - = NEWHOWTO(howto8_FFnn_callback,"ff00+abs8",0,false,false); - -static reloc_howto_type howto_8_pcrel - = NEWHOWTO(howto8_pcrel_callback,"pcrel8",0,false,true); - - -static reloc_howto_type * -local_bfd_reloc_type_lookup (arch, code) - const struct bfd_arch_info *arch; - bfd_reloc_code_real_type code; -{ - switch (code) { - case BFD_RELOC_16: - return &howto_16; - case BFD_RELOC_8_FFnn: - return &howto_8_FFnn; - case BFD_RELOC_8: - return &howto_8; - case BFD_RELOC_8_PCREL: - return &howto_8_pcrel; - } - return (reloc_howto_type *)NULL; -} -#endif - -int bfd_default_scan_num_mach(); - -static boolean -scan_mach (info, string) - const struct bfd_arch_info *info; - const char *string; -{ - if (strcmp(string,"h8/500") == 0) return true; - if (strcmp(string,"H8/500") == 0) return true; - if (strcmp(string,"h8500") == 0) return true; - if (strcmp(string,"H8500") == 0) return true; - return false; -} - - -#if 0 /* not used currently */ -/* This routine is provided two arch_infos and returns whether - they'd be compatible */ - -static const bfd_arch_info_type * -compatible (a,b) - const bfd_arch_info_type *a; - const bfd_arch_info_type *b; -{ - if (a->arch != b->arch || a->mach != b->mach) - return NULL; - return a; -} -#endif - -const bfd_arch_info_type bfd_h8500_arch = -{ - 16, /* 16 bits in a word */ - 24, /* 24 bits in an address */ - 8, /* 8 bits in a byte */ - bfd_arch_h8500, - 0, /* only 1 machine */ - "h8500", /* arch_name */ - "h8500", /* printable name */ - 1, - true, /* the default machine */ - bfd_default_compatible, - scan_mach, - 0, -}; diff --git a/contrib/gdb/bfd/cpu-hppa.c b/contrib/gdb/bfd/cpu-hppa.c deleted file mode 100644 index 5201008dfe1c6..0000000000000 --- a/contrib/gdb/bfd/cpu-hppa.c +++ /dev/null @@ -1,54 +0,0 @@ -/* BFD support for the HP Precision Architecture architecture. - Copyright 1992 Free Software Foundation, Inc. - -This file is part of BFD, the Binary File Descriptor library. - -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 2 of the License, 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ - -#include "bfd.h" -#include "sysdep.h" -#include "libbfd.h" - -static const bfd_arch_info_type bfd_hppa10_arch = -{ - 32, /* 32 bits in a word */ - 32, /* 32 bits in an address */ - 8, /* 8 bits in a byte */ - bfd_arch_hppa, - 10, /* By convention PA1.0 = 10 */ - "hppa", - "hppa1.0", - 3, - true, /* Unless we use 1.1 specific features */ - bfd_default_compatible, - bfd_default_scan , - 0, -}; - -const bfd_arch_info_type bfd_hppa_arch = -{ - 32, /* 32 bits in a word */ - 32, /* 32 bits in an address */ - 8, /* 8 bits in a byte */ - bfd_arch_hppa, - 11, /* By convention PA1.1 = 11 */ - "hppa", - "hppa1.1", - 3, - false, /* 1.1 specific features used */ - bfd_default_compatible, - bfd_default_scan , - &bfd_hppa10_arch, -}; diff --git a/contrib/gdb/bfd/cpu-i386.c b/contrib/gdb/bfd/cpu-i386.c deleted file mode 100644 index 404109033b7f5..0000000000000 --- a/contrib/gdb/bfd/cpu-i386.c +++ /dev/null @@ -1,38 +0,0 @@ -/* BFD support for the Intel 386 architecture. - Copyright 1992 Free Software Foundation, Inc. - -This file is part of BFD, the Binary File Descriptor library. - -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 2 of the License, 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ - -#include "bfd.h" -#include "sysdep.h" -#include "libbfd.h" - -const bfd_arch_info_type bfd_i386_arch = - { - 32, /* 32 bits in a word */ - 32, /* 32 bits in an address */ - 8, /* 8 bits in a byte */ - bfd_arch_i386, - 0, /* only 1 machine */ - "i386", - "i386", - 3, - true, /* the one and only */ - bfd_default_compatible, - bfd_default_scan , - 0, - }; diff --git a/contrib/gdb/bfd/cpu-i860.c b/contrib/gdb/bfd/cpu-i860.c deleted file mode 100644 index 57c867cdb2cbd..0000000000000 --- a/contrib/gdb/bfd/cpu-i860.c +++ /dev/null @@ -1,40 +0,0 @@ -/* BFD support for the Intel 860 architecture. - Copyright 1992, 1995 Free Software Foundation, Inc. - Created mostly by substituting "860" for "386" in cpu-i386.c - Harry Dolan <dolan@ssd.intel.com>, October 1995 - -This file is part of BFD, the Binary File Descriptor library. - -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 2 of the License, 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ - -#include "bfd.h" -#include "sysdep.h" -#include "libbfd.h" - -const bfd_arch_info_type bfd_i860_arch = - { - 32, /* 32 bits in a word */ - 32, /* 32 bits in an address */ - 8, /* 8 bits in a byte */ - bfd_arch_i860, - 0, /* only 1 machine */ - "i860", - "i860", - 3, - true, /* the one and only */ - bfd_default_compatible, - bfd_default_scan , - 0, - }; diff --git a/contrib/gdb/bfd/cpu-i960.c b/contrib/gdb/bfd/cpu-i960.c deleted file mode 100644 index 6970f89fca5c9..0000000000000 --- a/contrib/gdb/bfd/cpu-i960.c +++ /dev/null @@ -1,162 +0,0 @@ -/* BFD library support routines for the i960 architecture. - Copyright (C) 1990, 91, 92, 93, 94, 95, 1996 Free Software Foundation, Inc. - Hacked by Steve Chamberlain of Cygnus Support. - -This file is part of BFD, the Binary File Descriptor library. - -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 2 of the License, 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ - - -#include "bfd.h" -#include "sysdep.h" -#include "libbfd.h" - - -/* This routine is provided a string, and tries to work out if it - could possibly refer to the i960 machine pointed at in the - info_struct pointer */ - -static boolean -scan_960_mach (ap, string) - const bfd_arch_info_type *ap; - const char *string; -{ - unsigned long machine; - - /* Look for the string i960, or somesuch at the front of the string */ - - if (strncmp("i960",string,4) == 0) { - string+=4; - } - else { - /* no match, can be us */ - return false; - } - if (string[0] == 0) { - /* i960 on it's own means core to us*/ - if (ap->mach == bfd_mach_i960_core) return true; - return false; - } - - if (string[0] != ':') { - return false; - } - string++; - if (string[0] == '\0') - return false; - if (string[0] == 'c' && string[1] == 'o' && string[2] == 'r' && - string[3] == 'e' && string[4] == '\0') - machine = bfd_mach_i960_core; - else if (string[1] == '\0' || string[2] != '\0') /* rest are 2-char */ - return false; - else if (string[0] == 'k' && string[1] == 'b') - machine = bfd_mach_i960_kb_sb; - else if (string[0] == 's' && string[1] == 'b') - machine = bfd_mach_i960_kb_sb; - else if (string[0] == 'm' && string[1] == 'c') - machine = bfd_mach_i960_mc; - else if (string[0] == 'x' && string[1] == 'a') - machine = bfd_mach_i960_xa; - else if (string[0] == 'c' && string[1] == 'a') - machine = bfd_mach_i960_ca; - else if (string[0] == 'k' && string[1] == 'a') - machine = bfd_mach_i960_ka_sa; - else if (string[0] == 's' && string[1] == 'a') - machine = bfd_mach_i960_ka_sa; - else if (string[0] == 'j' && string[1] == 'x') - machine = bfd_mach_i960_jx; - else if (string[0] == 'h' && string[1] == 'x') - machine = bfd_mach_i960_hx; - else - return false; - if (machine == ap->mach) return true; - return false; -} - - - -/* This routine is provided two arch_infos and works out the i960 - machine which would be compatible with both and returns a pointer - to its info structure */ - -static const bfd_arch_info_type * -compatible (a,b) - const bfd_arch_info_type *a; - const bfd_arch_info_type *b; -{ - - /* The i960 has distinct subspecies which may not interbreed: - CORE CA - CORE KA KB MC XA - CORE HX JX - Any architecture on the same line is compatible, the one on - the right is the least restrictive. - - We represent this information in an array, each machine to a side */ - -#define ERROR 0 -#define CORE bfd_mach_i960_core /*1*/ -#define KA bfd_mach_i960_ka_sa /*2*/ -#define KB bfd_mach_i960_kb_sb /*3*/ -#define MC bfd_mach_i960_mc /*4*/ -#define XA bfd_mach_i960_xa /*5*/ -#define CA bfd_mach_i960_ca /*6*/ -#define JX bfd_mach_i960_jx /*7*/ -#define HX bfd_mach_i960_hx /*8*/ -#define MAX_ARCH ((int)HX) - - static CONST unsigned long matrix[MAX_ARCH+1][MAX_ARCH+1] = - { - { ERROR, CORE, KA, KB, MC, XA, CA, JX, HX }, - { CORE, CORE, KA, KB, MC, XA, CA, JX, HX }, - { KA, KA, KA, KB, MC, XA, ERROR, ERROR, ERROR}, - { KB, KB, KB, KB, MC, XA, ERROR, ERROR, ERROR}, - { MC, MC, MC, MC, MC, XA, ERROR, ERROR, ERROR}, - { XA, XA, XA, XA, XA, XA, ERROR, ERROR, ERROR}, - { CA, CA, ERROR, ERROR, ERROR, ERROR, CA, ERROR, ERROR}, - { JX, JX, ERROR, ERROR, ERROR, ERROR, ERROR, JX, HX }, - { HX, HX, ERROR, ERROR, ERROR, ERROR, ERROR, HX, HX }, - }; - - - if (a->arch != b->arch || matrix[a->mach][b->mach] == ERROR) - { - return NULL; - } - else - { - return (a->mach == matrix[a->mach][b->mach]) ? a : b; - } -} - - - -int bfd_default_scan_num_mach(); -#define N(a,b,d,n) \ -{ 32, 32, 8,bfd_arch_i960,a,"i960",b,3,d,compatible,scan_960_mach,n,} - -static const bfd_arch_info_type arch_info_struct[] = -{ - N(bfd_mach_i960_ka_sa,"i960:ka_sa",false, &arch_info_struct[1]), - N(bfd_mach_i960_kb_sb,"i960:kb_sb",false, &arch_info_struct[2]), - N(bfd_mach_i960_mc, "i960:mc", false, &arch_info_struct[3]), - N(bfd_mach_i960_xa, "i960:xa", false, &arch_info_struct[4]), - N(bfd_mach_i960_ca, "i960:ca", false, &arch_info_struct[5]), - N(bfd_mach_i960_jx, "i960:jx", false, &arch_info_struct[6]), - N(bfd_mach_i960_hx, "i960:hx", false, 0), -}; - -const bfd_arch_info_type bfd_i960_arch = - N(bfd_mach_i960_core, "i960:core", true, &arch_info_struct[0]); diff --git a/contrib/gdb/bfd/cpu-m68k.c b/contrib/gdb/bfd/cpu-m68k.c deleted file mode 100644 index 17a373916756b..0000000000000 --- a/contrib/gdb/bfd/cpu-m68k.c +++ /dev/null @@ -1,42 +0,0 @@ -/* BFD library support routines for architectures. - Copyright (C) 1990, 91, 92, 93, 94 Free Software Foundation, Inc. - Hacked by Steve Chamberlain of Cygnus Support. - -This file is part of BFD, the Binary File Descriptor library. - -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 2 of the License, 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ - -#include "bfd.h" -#include "sysdep.h" -#include "libbfd.h" - -int bfd_default_scan_num_mach(); - - -#define N(name, print,d,next) \ -{ 32, 32, 8, bfd_arch_m68k, name, "m68k",print,2,d,bfd_default_compatible,bfd_default_scan, next, } - -static const bfd_arch_info_type arch_info_struct[] = -{ - N(68008,"m68k:68008",false, &arch_info_struct[1]), - N(68010,"m68k:68010",false, &arch_info_struct[2]), - N(68020,"m68k:68020",true, &arch_info_struct[3]), - N(68030,"m68k:68030",false, &arch_info_struct[4]), - N(68040,"m68k:68040",false, &arch_info_struct[5]), - N(68070,"m68k:68070",false, 0), -}; - -const bfd_arch_info_type bfd_m68k_arch = - N(68000,"m68k:68000",false, &arch_info_struct[0]); diff --git a/contrib/gdb/bfd/cpu-m88k.c b/contrib/gdb/bfd/cpu-m88k.c deleted file mode 100644 index c3716c5a394c6..0000000000000 --- a/contrib/gdb/bfd/cpu-m88k.c +++ /dev/null @@ -1,42 +0,0 @@ -/* bfd back-end for m88k support - Copyright (C) 1990, 91, 92, 93, 94 Free Software Foundation, Inc. - Written by Steve Chamberlain of Cygnus Support. - -This file is part of BFD, the Binary File Descriptor library. - -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 2 of the License, 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ - -#include "bfd.h" -#include "sysdep.h" -#include "libbfd.h" - - - - -const bfd_arch_info_type bfd_m88k_arch = - { - 32, /* 32 bits in a word */ - 32, /* 32 bits in an address */ - 8, /* 8 bits in a byte */ - bfd_arch_m88k, - 88100, /* only 1 machine */ - "m88k", - "m88k:88100", - 3, - true, /* the one and only */ - bfd_default_compatible, - bfd_default_scan , - 0, - }; diff --git a/contrib/gdb/bfd/cpu-mips.c b/contrib/gdb/bfd/cpu-mips.c deleted file mode 100644 index 5e1934210a297..0000000000000 --- a/contrib/gdb/bfd/cpu-mips.c +++ /dev/null @@ -1,85 +0,0 @@ -/* bfd back-end for mips support - Copyright (C) 1990, 91, 92, 93, 94 Free Software Foundation, Inc. - Written by Steve Chamberlain of Cygnus Support. - -This file is part of BFD, the Binary File Descriptor library. - -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 2 of the License, 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ - -#include "bfd.h" -#include "sysdep.h" -#include "libbfd.h" - -static const bfd_arch_info_type arch_info_struct[] = -{ - { - 32, /* 32 bits in a word */ - 32, /* 32 bits in an address */ - 8, /* 8 bits in a byte */ - bfd_arch_mips, - 6000, - "mips", - "mips:6000", - 3, - false, - bfd_default_compatible, - bfd_default_scan, - &arch_info_struct[1], - }, - { - 64, /* 64 bits in a word */ - 64, /* 64 bits in an address */ - 8, /* 8 bits in a byte */ - bfd_arch_mips, - 4000, - "mips", - "mips:4000", - 3, - false, - bfd_default_compatible, - bfd_default_scan , - &arch_info_struct[2], - }, - { - 64, /* 64 bits in a word */ - 64, /* 64 bits in an address */ - 8, /* 8 bits in a byte */ - bfd_arch_mips, - 8000, - "mips", - "mips:8000", - 3, - false, - bfd_default_compatible, - bfd_default_scan , - 0, - } -}; - -const bfd_arch_info_type bfd_mips_arch = -{ - 32, /* 32 bits in a word */ - 32, /* 32 bits in an address */ - 8, /* 8 bits in a byte */ - bfd_arch_mips, - 3000, - "mips", - "mips:3000", - 3, - true, - bfd_default_compatible, - bfd_default_scan, - &arch_info_struct[0], -}; diff --git a/contrib/gdb/bfd/cpu-ns32k.c b/contrib/gdb/bfd/cpu-ns32k.c deleted file mode 100644 index e18e3cfc9ba18..0000000000000 --- a/contrib/gdb/bfd/cpu-ns32k.c +++ /dev/null @@ -1,868 +0,0 @@ -/* BFD support for the ns32k architecture. - Copyright (C) 1990, 1991, 1994, 1995 Free Software Foundation, Inc. - Almost totally rewritten by Ian Dall from initial work - by Andrew Cagney. - -This file is part of BFD, the Binary File Descriptor library. - -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 2 of the License, 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ - -#include "bfd.h" -#include "sysdep.h" -#include "libbfd.h" - -long ns32k_get_displacement PARAMS ((bfd_byte *buffer, long offset, long size)); -int ns32k_put_displacement PARAMS ((long value, bfd_byte *buffer, long offset, long size)); -long ns32k_get_immediate PARAMS ((bfd_byte *buffer, long offset, long size)); -int ns32k_put_immediate PARAMS ((long value, bfd_byte *buffer, long offset, long size)); -bfd_reloc_status_type - ns32k_reloc_disp PARAMS ((bfd *abfd, arelent *reloc_entry, - struct symbol_cache_entry *symbol, - PTR data, - asection *input_section, - bfd *output_bfd, - char **error_message)); -bfd_reloc_status_type - ns32k_reloc_imm PARAMS ((bfd *abfd, - arelent *reloc_entry, - struct symbol_cache_entry *symbol, - PTR data, - asection *input_section, - bfd *output_bfd, - char **error_message)); -bfd_reloc_status_type ns32k_final_link_relocate PARAMS ((reloc_howto_type *howto, - bfd *input_bfd, - asection *input_section, - bfd_byte *contents, - bfd_vma address, - bfd_vma value, - bfd_vma addend )); -bfd_reloc_status_type ns32k_relocate_contents PARAMS ((reloc_howto_type *howto, - bfd *input_bfd, - bfd_vma relocation, - bfd_byte *location)); - -int bfd_default_scan_num_mach(); - -#define N(machine, printable, d, next) \ -{ 32, 32, 8, bfd_arch_ns32k, machine, "ns32k",printable,3,d,bfd_default_compatible,bfd_default_scan, next, } - -static const bfd_arch_info_type arch_info_struct[] = -{ - N(32532,"ns32k:32532",true, 0), /* the word ns32k will match this too */ -}; - -const bfd_arch_info_type bfd_ns32k_arch = - N(32032,"ns32k:32032",false, &arch_info_struct[0]); - -static long -ns32k_sign_extend(value, bits) - int value; - int bits; -{ - value = value & ((1 << bits) - 1); - return (value & (1 << (bits-1)) - ? value | (~((1 << bits) - 1)) - : value); -} - -long -ns32k_get_displacement(buffer, offset, size) - bfd_byte *buffer; - long offset; - long size; -{ - long value; - buffer += offset; - switch (size) - { - case 1: - value = ns32k_sign_extend (*buffer, 7); - break; - case 2: - value = ns32k_sign_extend(*buffer++, 6); - value = (value << 8) | (0xff & *buffer); - break; - case 4: - value = ns32k_sign_extend(*buffer++, 6); - value = (value << 8) | (0xff & *buffer++); - value = (value << 8) | (0xff & *buffer++); - value = (value << 8) | (0xff & *buffer); - break; - } - return value; -} - -int -ns32k_put_displacement(value, buffer, offset, size) - long value; - bfd_byte *buffer; - long offset; - long size; -{ - buffer += offset; - switch (size) - { - case 1: - if (value < -64 || value > 63) - return -1; - value&=0x7f; - *buffer++=value; - break; - case 2: - if (value < -8192 || value > 8191) - return -1; - value&=0x3fff; - value|=0x8000; - *buffer++=(value>>8); - *buffer++=value; - break; - case 4: - if (value < -0x1f000000 || value >= 0x20000000) - return -1; - value|=0xc0000000; - *buffer++=(value>>24); - *buffer++=(value>>16); - *buffer++=(value>>8); - *buffer++=value; - break; - default: - return -1; - } - return 0; -} - -long -ns32k_get_immediate(buffer, offset, size) - bfd_byte *buffer; - long offset; - long size; -{ - long value = 0; - buffer += offset; - switch (size) - { - case 4: - value = (value << 8) | (*buffer++ & 0xff); - case 3: - value = (value << 8) | (*buffer++ & 0xff); - case 2: - value = (value << 8) | (*buffer++ & 0xff); - case 1: - value = (value << 8) | (*buffer++ & 0xff); - } - return value; -} - -int -ns32k_put_immediate (value, buffer, offset, size) - long value; - bfd_byte *buffer; - long offset; - long size; -{ - buffer += offset + size - 1; - switch (size) - { - case 4: - *buffer-- = (value & 0xff); value >>= 8; - case 3: - *buffer-- = (value & 0xff); value >>= 8; - case 2: - *buffer-- = (value & 0xff); value >>= 8; - case 1: - *buffer-- = (value & 0xff); value >>= 8; - } - return 0; -} - -/* This is just like the standard perform_relocation except we - * use get_data and put_data which know about the ns32k - * storage methods. - * This is probably a lot more complicated than it needs to be! - */ -static bfd_reloc_status_type -do_ns32k_reloc (abfd, reloc_entry, symbol, data, input_section, output_bfd, - error_message, get_data, put_data) - bfd *abfd; - arelent *reloc_entry; - struct symbol_cache_entry *symbol; - PTR data; - asection *input_section; - bfd *output_bfd; - char **error_message; - long (*get_data)(); - int (*put_data)(); -{ - int overflow = 0; - bfd_vma relocation; - bfd_reloc_status_type flag = bfd_reloc_ok; - bfd_size_type addr = reloc_entry->address; - bfd_vma output_base = 0; - reloc_howto_type *howto = reloc_entry->howto; - asection *reloc_target_output_section; - - if ((symbol->section == &bfd_abs_section) - && output_bfd != (bfd *) NULL) - { - reloc_entry->address += input_section->output_offset; - return bfd_reloc_ok; - } - - /* If we are not producing relocateable output, return an error if - the symbol is not defined. An undefined weak symbol is - considered to have a value of zero (SVR4 ABI, p. 4-27). */ - if (symbol->section == &bfd_und_section - && (symbol->flags & BSF_WEAK) == 0 - && output_bfd == (bfd *) NULL) - flag = bfd_reloc_undefined; - - - /* Is the address of the relocation really within the section? */ - if (reloc_entry->address > input_section->_cooked_size) - return bfd_reloc_outofrange; - - /* Work out which section the relocation is targetted at and the - initial relocation command value. */ - - /* Get symbol value. (Common symbols are special.) */ - if (bfd_is_com_section (symbol->section)) - relocation = 0; - else - relocation = symbol->value; - - - reloc_target_output_section = symbol->section->output_section; - - /* Convert input-section-relative symbol value to absolute. */ - if (output_bfd && howto->partial_inplace == false) - output_base = 0; - else - output_base = reloc_target_output_section->vma; - - relocation += output_base + symbol->section->output_offset; - - /* Add in supplied addend. */ - relocation += reloc_entry->addend; - - /* Here the variable relocation holds the final address of the - symbol we are relocating against, plus any addend. */ - - if (howto->pc_relative == true) - { - /* This is a PC relative relocation. We want to set RELOCATION - to the distance between the address of the symbol and the - location. RELOCATION is already the address of the symbol. - - We start by subtracting the address of the section containing - the location. - - If pcrel_offset is set, we must further subtract the position - of the location within the section. Some targets arrange for - the addend to be the negative of the position of the location - within the section; for example, i386-aout does this. For - i386-aout, pcrel_offset is false. Some other targets do not - include the position of the location; for example, m88kbcs, - or ELF. For those targets, pcrel_offset is true. - - If we are producing relocateable output, then we must ensure - that this reloc will be correctly computed when the final - relocation is done. If pcrel_offset is false we want to wind - up with the negative of the location within the section, - which means we must adjust the existing addend by the change - in the location within the section. If pcrel_offset is true - we do not want to adjust the existing addend at all. - - FIXME: This seems logical to me, but for the case of - producing relocateable output it is not what the code - actually does. I don't want to change it, because it seems - far too likely that something will break. */ - - relocation -= - input_section->output_section->vma + input_section->output_offset; - - if (howto->pcrel_offset == true) - relocation -= reloc_entry->address; - } - - if (output_bfd != (bfd *) NULL) - { - if (howto->partial_inplace == false) - { - /* This is a partial relocation, and we want to apply the relocation - to the reloc entry rather than the raw data. Modify the reloc - inplace to reflect what we now know. */ - reloc_entry->addend = relocation; - reloc_entry->address += input_section->output_offset; - return flag; - } - else - { - /* This is a partial relocation, but inplace, so modify the - reloc record a bit. - - If we've relocated with a symbol with a section, change - into a ref to the section belonging to the symbol. */ - - reloc_entry->address += input_section->output_offset; - - /* WTF?? */ - if (abfd->xvec->flavour == bfd_target_coff_flavour - && strcmp (abfd->xvec->name, "aixcoff-rs6000") != 0) - { -#if 1 - /* For m68k-coff, the addend was being subtracted twice during - relocation with -r. Removing the line below this comment - fixes that problem; see PR 2953. - -However, Ian wrote the following, regarding removing the line below, -which explains why it is still enabled: --djm - -If you put a patch like that into BFD you need to check all the COFF -linkers. I am fairly certain that patch will break coff-i386 (e.g., -SCO); see coff_i386_reloc in coff-i386.c where I worked around the -problem in a different way. There may very well be a reason that the -code works as it does. - -Hmmm. The first obvious point is that bfd_perform_relocation should -not have any tests that depend upon the flavour. It's seem like -entirely the wrong place for such a thing. The second obvious point -is that the current code ignores the reloc addend when producing -relocateable output for COFF. That's peculiar. In fact, I really -have no idea what the point of the line you want to remove is. - -A typical COFF reloc subtracts the old value of the symbol and adds in -the new value to the location in the object file (if it's a pc -relative reloc it adds the difference between the symbol value and the -location). When relocating we need to preserve that property. - -BFD handles this by setting the addend to the negative of the old -value of the symbol. Unfortunately it handles common symbols in a -non-standard way (it doesn't subtract the old value) but that's a -different story (we can't change it without losing backward -compatibility with old object files) (coff-i386 does subtract the old -value, to be compatible with existing coff-i386 targets, like SCO). - -So everything works fine when not producing relocateable output. When -we are producing relocateable output, logically we should do exactly -what we do when not producing relocateable output. Therefore, your -patch is correct. In fact, it should probably always just set -reloc_entry->addend to 0 for all cases, since it is, in fact, going to -add the value into the object file. This won't hurt the COFF code, -which doesn't use the addend; I'm not sure what it will do to other -formats (the thing to check for would be whether any formats both use -the addend and set partial_inplace). - -When I wanted to make coff-i386 produce relocateable output, I ran -into the problem that you are running into: I wanted to remove that -line. Rather than risk it, I made the coff-i386 relocs use a special -function; it's coff_i386_reloc in coff-i386.c. The function -specifically adds the addend field into the object file, knowing that -bfd_perform_relocation is not going to. If you remove that line, then -coff-i386.c will wind up adding the addend field in twice. It's -trivial to fix; it just needs to be done. - -The problem with removing the line is just that it may break some -working code. With BFD it's hard to be sure of anything. The right -way to deal with this is simply to build and test at least all the -supported COFF targets. It should be straightforward if time and disk -space consuming. For each target: - 1) build the linker - 2) generate some executable, and link it using -r (I would - probably use paranoia.o and link against newlib/libc.a, which - for all the supported targets would be available in - /usr/cygnus/progressive/H-host/target/lib/libc.a). - 3) make the change to reloc.c - 4) rebuild the linker - 5) repeat step 2 - 6) if the resulting object files are the same, you have at least - made it no worse - 7) if they are different you have to figure out which version is - right -*/ - relocation -= reloc_entry->addend; -#endif - reloc_entry->addend = 0; - } - else - { - reloc_entry->addend = relocation; - } - } - } - else - { - reloc_entry->addend = 0; - } - - /* FIXME: This overflow checking is incomplete, because the value - might have overflowed before we get here. For a correct check we - need to compute the value in a size larger than bitsize, but we - can't reasonably do that for a reloc the same size as a host - machine word. - FIXME: We should also do overflow checking on the result after - adding in the value contained in the object file. */ - if (howto->complain_on_overflow != complain_overflow_dont) - { - bfd_vma check; - - /* Get the value that will be used for the relocation, but - starting at bit position zero. */ - if (howto->rightshift > howto->bitpos) - check = relocation >> (howto->rightshift - howto->bitpos); - else - check = relocation << (howto->bitpos - howto->rightshift); - switch (howto->complain_on_overflow) - { - case complain_overflow_signed: - { - /* Assumes two's complement. */ - bfd_signed_vma reloc_signed_max = (1 << (howto->bitsize - 1)) - 1; - bfd_signed_vma reloc_signed_min = ~reloc_signed_max; - - /* The above right shift is incorrect for a signed value. - Fix it up by forcing on the upper bits. */ - if (howto->rightshift > howto->bitpos - && (bfd_signed_vma) relocation < 0) - check |= ((bfd_vma) - 1 - & ~((bfd_vma) - 1 - >> (howto->rightshift - howto->bitpos))); - if ((bfd_signed_vma) check > reloc_signed_max - || (bfd_signed_vma) check < reloc_signed_min) - flag = bfd_reloc_overflow; - } - break; - case complain_overflow_unsigned: - { - /* Assumes two's complement. This expression avoids - overflow if howto->bitsize is the number of bits in - bfd_vma. */ - bfd_vma reloc_unsigned_max = - (((1 << (howto->bitsize - 1)) - 1) << 1) | 1; - - if ((bfd_vma) check > reloc_unsigned_max) - flag = bfd_reloc_overflow; - } - break; - case complain_overflow_bitfield: - { - /* Assumes two's complement. This expression avoids - overflow if howto->bitsize is the number of bits in - bfd_vma. */ - bfd_vma reloc_bits = (((1 << (howto->bitsize - 1)) - 1) << 1) | 1; - - if (((bfd_vma) check & ~reloc_bits) != 0 - && ((bfd_vma) check & ~reloc_bits) != (-1 & ~reloc_bits)) - { - /* The above right shift is incorrect for a signed - value. See if turning on the upper bits fixes the - overflow. */ - if (howto->rightshift > howto->bitpos - && (bfd_signed_vma) relocation < 0) - { - check |= ((bfd_vma) - 1 - & ~((bfd_vma) - 1 - >> (howto->rightshift - howto->bitpos))); - if (((bfd_vma) check & ~reloc_bits) != (-1 & ~reloc_bits)) - flag = bfd_reloc_overflow; - } - else - flag = bfd_reloc_overflow; - } - } - break; - default: - abort (); - } - } - - /* - Either we are relocating all the way, or we don't want to apply - the relocation to the reloc entry (probably because there isn't - any room in the output format to describe addends to relocs) - */ - - /* The cast to bfd_vma avoids a bug in the Alpha OSF/1 C compiler - (OSF version 1.3, compiler version 3.11). It miscompiles the - following program: - - struct str - { - unsigned int i0; - } s = { 0 }; - - int - main () - { - unsigned long x; - - x = 0x100000000; - x <<= (unsigned long) s.i0; - if (x == 0) - printf ("failed\n"); - else - printf ("succeeded (%lx)\n", x); - } - */ - - relocation >>= (bfd_vma) howto->rightshift; - - /* Shift everything up to where it's going to be used */ - - relocation <<= (bfd_vma) howto->bitpos; - - /* Wait for the day when all have the mask in them */ - - /* What we do: - i instruction to be left alone - o offset within instruction - r relocation offset to apply - S src mask - D dst mask - N ~dst mask - A part 1 - B part 2 - R result - - Do this: - i i i i i o o o o o from bfd_get<size> - and S S S S S to get the size offset we want - + r r r r r r r r r r to get the final value to place - and D D D D D to chop to right size - ----------------------- - A A A A A - And this: - ... i i i i i o o o o o from bfd_get<size> - and N N N N N get instruction - ----------------------- - ... B B B B B - - And then: - B B B B B - or A A A A A - ----------------------- - R R R R R R R R R R put into bfd_put<size> - */ - -#define DOIT(x) \ - x = ( (x & ~howto->dst_mask) | (((x & howto->src_mask) + relocation) & howto->dst_mask)) - - switch (howto->size) - { - case 0: - { - char x = get_data (data, addr, 1); - DOIT (x); - overflow = put_data(x, data, addr, 1); - } - break; - - case 1: - if (relocation) - { - short x = get_data (data, addr, 2); - DOIT (x); - overflow = put_data(x, (unsigned char *) data, addr, 2); - } - break; - case 2: - if (relocation) - { - long x = get_data (data, addr, 4); - DOIT (x); - overflow = put_data(x, data, addr, 4); - } - break; - case -2: - { - long x = get_data(data, addr, 4); - relocation = -relocation; - DOIT(x); - overflow = put_data(x, data , addr, 4); - } - break; - - case 3: - /* Do nothing */ - break; - - case 4: -#ifdef BFD64 - if (relocation) - { - bfd_vma x = get_data (data, addr, 8); - DOIT (x); - overflow = put_data(x, data, addr, 8); - } -#else - abort (); -#endif - break; - default: - return bfd_reloc_other; - } - if ((howto->complain_on_overflow != complain_overflow_dont) && overflow) - return bfd_reloc_overflow; - - return flag; -} - -/* Relocate a given location using a given value and howto. */ - -bfd_reloc_status_type -do_ns32k_reloc_contents ( howto, input_bfd, relocation, location, get_data, - put_data) - reloc_howto_type *howto; - bfd *input_bfd; - bfd_vma relocation; - bfd_byte *location; - long (*get_data)(); - int (*put_data)(); -{ - int size; - bfd_vma x; - boolean overflow; - - /* If the size is negative, negate RELOCATION. This isn't very - general. */ - if (howto->size < 0) - relocation = -relocation; - - /* Get the value we are going to relocate. */ - size = bfd_get_reloc_size (howto); - switch (size) - { - default: - case 0: - abort (); - case 1: - case 2: - case 4: -#ifdef BFD64 - case 8: -#endif - x = get_data (location, 0, size); - break; - } - - /* Check for overflow. FIXME: We may drop bits during the addition - which we don't check for. We must either check at every single - operation, which would be tedious, or we must do the computations - in a type larger than bfd_vma, which would be inefficient. */ - overflow = false; - if (howto->complain_on_overflow != complain_overflow_dont) - { - bfd_vma check; - bfd_signed_vma signed_check; - bfd_vma add; - bfd_signed_vma signed_add; - - if (howto->rightshift == 0) - { - check = relocation; - signed_check = (bfd_signed_vma) relocation; - } - else - { - /* Drop unwanted bits from the value we are relocating to. */ - check = relocation >> howto->rightshift; - - /* If this is a signed value, the rightshift just dropped - leading 1 bits (assuming twos complement). */ - if ((bfd_signed_vma) relocation >= 0) - signed_check = check; - else - signed_check = (check - | ((bfd_vma) - 1 - & ~((bfd_vma) - 1 >> howto->rightshift))); - } - - /* Get the value from the object file. */ - add = x & howto->src_mask; - - /* Get the value from the object file with an appropriate sign. - The expression involving howto->src_mask isolates the upper - bit of src_mask. If that bit is set in the value we are - adding, it is negative, and we subtract out that number times - two. If src_mask includes the highest possible bit, then we - can not get the upper bit, but that does not matter since - signed_add needs no adjustment to become negative in that - case. */ - signed_add = add; - if ((add & (((~howto->src_mask) >> 1) & howto->src_mask)) != 0) - signed_add -= (((~howto->src_mask) >> 1) & howto->src_mask) << 1; - - /* Add the value from the object file, shifted so that it is a - straight number. */ - if (howto->bitpos == 0) - { - check += add; - signed_check += signed_add; - } - else - { - check += add >> howto->bitpos; - - /* For the signed case we use ADD, rather than SIGNED_ADD, - to avoid warnings from SVR4 cc. This is OK since we - explictly handle the sign bits. */ - if (signed_add >= 0) - signed_check += add >> howto->bitpos; - else - signed_check += ((add >> howto->bitpos) - | ((bfd_vma) - 1 - & ~((bfd_vma) - 1 >> howto->bitpos))); - } - - switch (howto->complain_on_overflow) - { - case complain_overflow_signed: - { - /* Assumes two's complement. */ - bfd_signed_vma reloc_signed_max = (1 << (howto->bitsize - 1)) - 1; - bfd_signed_vma reloc_signed_min = ~reloc_signed_max; - - if (signed_check > reloc_signed_max - || signed_check < reloc_signed_min) - overflow = true; - } - break; - case complain_overflow_unsigned: - { - /* Assumes two's complement. This expression avoids - overflow if howto->bitsize is the number of bits in - bfd_vma. */ - bfd_vma reloc_unsigned_max = - (((1 << (howto->bitsize - 1)) - 1) << 1) | 1; - - if (check > reloc_unsigned_max) - overflow = true; - } - break; - case complain_overflow_bitfield: - { - /* Assumes two's complement. This expression avoids - overflow if howto->bitsize is the number of bits in - bfd_vma. */ - bfd_vma reloc_bits = (((1 << (howto->bitsize - 1)) - 1) << 1) | 1; - - if ((check & ~reloc_bits) != 0 - && (((bfd_vma) signed_check & ~reloc_bits) - != (-1 & ~reloc_bits))) - overflow = true; - } - break; - default: - abort (); - } - } - - /* Put RELOCATION in the right bits. */ - relocation >>= (bfd_vma) howto->rightshift; - relocation <<= (bfd_vma) howto->bitpos; - - /* Add RELOCATION to the right bits of X. */ - x = ((x & ~howto->dst_mask) - | (((x & howto->src_mask) + relocation) & howto->dst_mask)); - - /* Put the relocated value back in the object file. */ - switch (size) - { - default: - case 0: - abort (); - case 1: - case 2: - case 4: -#ifdef BFD64 - case 8: -#endif - put_data(x, location, 0, size); - break; - } - - return overflow ? bfd_reloc_overflow : bfd_reloc_ok; -} - -bfd_reloc_status_type -ns32k_reloc_disp(abfd, reloc_entry, symbol, data, input_section, output_bfd, - error_message) - bfd *abfd; - arelent *reloc_entry; - struct symbol_cache_entry *symbol; - PTR data; - asection *input_section; - bfd *output_bfd; - char **error_message; -{ - return do_ns32k_reloc(abfd, reloc_entry, symbol, data, input_section, output_bfd, error_message, ns32k_get_displacement, ns32k_put_displacement); -} - -bfd_reloc_status_type -ns32k_reloc_imm (abfd, reloc_entry, symbol, data, input_section, output_bfd, error_message) - bfd *abfd; - arelent *reloc_entry; - struct symbol_cache_entry *symbol; - PTR data; - asection *input_section; - bfd *output_bfd; - char **error_message; -{ - return do_ns32k_reloc(abfd, reloc_entry, symbol, data, input_section, output_bfd, error_message, ns32k_get_immediate, ns32k_put_immediate); -} - -bfd_reloc_status_type -ns32k_final_link_relocate (howto, input_bfd, input_section, contents, address, value, addend ) - reloc_howto_type *howto; - bfd *input_bfd; - asection *input_section; - bfd_byte *contents; - bfd_vma address; - bfd_vma value; - bfd_vma addend; -{ - bfd_vma relocation; - - /* Sanity check the address. */ - if (address > input_section->_cooked_size) - return bfd_reloc_outofrange; - - /* This function assumes that we are dealing with a basic relocation - against a symbol. We want to compute the value of the symbol to - relocate to. This is just VALUE, the value of the symbol, plus - ADDEND, any addend associated with the reloc. */ - relocation = value + addend; - - /* If the relocation is PC relative, we want to set RELOCATION to - the distance between the symbol (currently in RELOCATION) and the - location we are relocating. Some targets (e.g., i386-aout) - arrange for the contents of the section to be the negative of the - offset of the location within the section; for such targets - pcrel_offset is false. Other targets (e.g., m88kbcs or ELF) - simply leave the contents of the section as zero; for such - targets pcrel_offset is true. If pcrel_offset is false we do not - need to subtract out the offset of the location within the - section (which is just ADDRESS). */ - if (howto->pc_relative) - { - relocation -= (input_section->output_section->vma - + input_section->output_offset); - if (howto->pcrel_offset) - relocation -= address; - } - - return ns32k_relocate_contents (howto, input_bfd, relocation, - contents + address); -} diff --git a/contrib/gdb/bfd/cpu-powerpc.c b/contrib/gdb/bfd/cpu-powerpc.c deleted file mode 100644 index 11f0f80af5ab4..0000000000000 --- a/contrib/gdb/bfd/cpu-powerpc.c +++ /dev/null @@ -1,124 +0,0 @@ -/* BFD PowerPC CPU definition - Copyright (C) 1994, 1995, 1996 Free Software Foundation, Inc. - Contributed by Ian Lance Taylor, Cygnus Support. - -This file is part of BFD, the Binary File Descriptor library. - -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 2 of the License, 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ - -#include "bfd.h" -#include "sysdep.h" -#include "libbfd.h" - -/* The common PowerPC architecture is compatible with the RS/6000. */ - -static const bfd_arch_info_type *powerpc_compatible - PARAMS ((const bfd_arch_info_type *, const bfd_arch_info_type *)); - -static const bfd_arch_info_type * -powerpc_compatible (a,b) - const bfd_arch_info_type *a; - const bfd_arch_info_type *b; -{ - BFD_ASSERT (a->arch == bfd_arch_powerpc); - switch (b->arch) - { - default: - return NULL; - case bfd_arch_powerpc: - return bfd_default_compatible (a, b); - case bfd_arch_rs6000: - if (a->mach == 0) - return a; - return NULL; - } - /*NOTREACHED*/ -} - -static const bfd_arch_info_type arch_info_struct[] = -{ - { - 32, /* 32 bits in a word */ - 32, /* 32 bits in an address */ - 8, /* 8 bits in a byte */ - bfd_arch_powerpc, - 603, /* for the mpc603 */ - "powerpc", - "powerpc:603", - 3, - false, /* not the default */ - powerpc_compatible, - bfd_default_scan, - &arch_info_struct[1] - }, - { - 32, /* 32 bits in a word */ - 32, /* 32 bits in an address */ - 8, /* 8 bits in a byte */ - bfd_arch_powerpc, - 604, /* for the mpc604 */ - "powerpc", - "powerpc:604", - 3, - false, /* not the default */ - powerpc_compatible, - bfd_default_scan, - &arch_info_struct[2] - }, - { - 32, /* 32 bits in a word */ - 32, /* 32 bits in an address */ - 8, /* 8 bits in a byte */ - bfd_arch_powerpc, - 403, /* for the 403 */ - "powerpc", - "powerpc:403", - 3, - false, /* not the default */ - powerpc_compatible, - bfd_default_scan, - &arch_info_struct[3] - }, - { - 32, /* 32 bits in a word */ - 32, /* 32 bits in an address */ - 8, /* 8 bits in a byte */ - bfd_arch_powerpc, - 601, /* for the mpc601 */ - "powerpc", - "powerpc:601", - 3, - false, /* not the default */ - powerpc_compatible, - bfd_default_scan, - 0 - } -}; - -const bfd_arch_info_type bfd_powerpc_arch = - { - 32, /* 32 bits in a word */ - 32, /* 32 bits in an address */ - 8, /* 8 bits in a byte */ - bfd_arch_powerpc, - 0, /* for the POWER/PowerPC common architecture */ - "powerpc", - "powerpc:common", - 3, - true, /* the default */ - powerpc_compatible, - bfd_default_scan, - &arch_info_struct[0] - }; diff --git a/contrib/gdb/bfd/cpu-rs6000.c b/contrib/gdb/bfd/cpu-rs6000.c deleted file mode 100644 index 9852ae9a05365..0000000000000 --- a/contrib/gdb/bfd/cpu-rs6000.c +++ /dev/null @@ -1,70 +0,0 @@ -/* BFD back-end for rs6000 support - Copyright (C) 1990, 1991 Free Software Foundation, Inc. - FIXME: Can someone provide a transliteration of this name into ASCII? - Using the following chars caused a compiler warning on HIUX (so I replaced - them with octal escapes), and isn't useful without an understanding of what - character set it is. - Written by Mimi Ph\373\364ng-Th\345o V\365 of IBM - and John Gilmore of Cygnus Support. - -This file is part of BFD, the Binary File Descriptor library. - -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 2 of the License, 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ - -#include "bfd.h" -#include "sysdep.h" -#include "libbfd.h" - -/* The RS/6000 architecture is compatible with the PowerPC common - architecture. */ - -static const bfd_arch_info_type *rs6000_compatible - PARAMS ((const bfd_arch_info_type *, const bfd_arch_info_type *)); - -static const bfd_arch_info_type * -rs6000_compatible (a,b) - const bfd_arch_info_type *a; - const bfd_arch_info_type *b; -{ - BFD_ASSERT (a->arch == bfd_arch_rs6000); - switch (b->arch) - { - default: - return NULL; - case bfd_arch_rs6000: - return bfd_default_compatible (a, b); - case bfd_arch_powerpc: - if (b->mach == 0) - return b; - return NULL; - } - /*NOTREACHED*/ -} - -const bfd_arch_info_type bfd_rs6000_arch = - { - 32, /* 32 bits in a word */ - 32, /* 32 bits in an address */ - 8, /* 8 bits in a byte */ - bfd_arch_rs6000, - 6000, /* only 1 machine */ - "rs6000", - "rs6000:6000", - 3, - true, /* the one and only */ - rs6000_compatible, - bfd_default_scan, - 0, - }; diff --git a/contrib/gdb/bfd/cpu-sh.c b/contrib/gdb/bfd/cpu-sh.c deleted file mode 100644 index 7f6dd68ba04ac..0000000000000 --- a/contrib/gdb/bfd/cpu-sh.c +++ /dev/null @@ -1,68 +0,0 @@ -/* BFD library support routines for the Hitachi-SH architecture. - Copyright (C) 1993 Free Software Foundation, Inc. - Hacked by Steve Chamberlain of Cygnus Support. - -This file is part of BFD, the Binary File Descriptor library. - -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 2 of the License, 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ - -#include "bfd.h" -#include "sysdep.h" -#include "libbfd.h" - - -int bfd_default_scan_num_mach(); - -static boolean -scan_mach (info, string) - const struct bfd_arch_info *info; - const char *string; -{ - if (strcmp(string,"sh") == 0) return true; - if (strcmp(string,"SH") == 0) return true; - return false; -} - - -#if 0 -/* This routine is provided two arch_infos and returns whether - they'd be compatible */ - -static const bfd_arch_info_type * -compatible (a,b) - const bfd_arch_info_type *a; - const bfd_arch_info_type *b; -{ - if (a->arch != b->arch || a->mach != b->mach) - return NULL; - return a; -} -#endif - -const bfd_arch_info_type bfd_sh_arch = -{ - 32, /* 32 bits in a word */ - 32, /* 32 bits in an address */ - 8, /* 8 bits in a byte */ - bfd_arch_sh, - 0, /* only 1 machine */ - "sh", /* arch_name */ - "sh", /* printable name */ - 1, - true, /* the default machine */ - bfd_default_compatible, - scan_mach, - 0, -}; diff --git a/contrib/gdb/bfd/cpu-sparc.c b/contrib/gdb/bfd/cpu-sparc.c deleted file mode 100644 index e48aa5e7f2b37..0000000000000 --- a/contrib/gdb/bfd/cpu-sparc.c +++ /dev/null @@ -1,111 +0,0 @@ -/* BFD support for the SPARC architecture. - Copyright (C) 1992, 1995, 1996 Free Software Foundation, Inc. - -This file is part of BFD, the Binary File Descriptor library. - -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 2 of the License, 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ - -#include "bfd.h" -#include "sysdep.h" -#include "libbfd.h" - -/* Don't mix 32 bit and 64 bit files. */ - -static const bfd_arch_info_type * -sparc_compatible (a, b) - const bfd_arch_info_type *a; - const bfd_arch_info_type *b; -{ - if (a->bits_per_word != b->bits_per_word) - return NULL; - - return bfd_default_compatible (a, b); -} - -static const bfd_arch_info_type arch_info_struct[] = -{ - { - 32, /* bits in a word */ - 32, /* bits in an address */ - 8, /* bits in a byte */ - bfd_arch_sparc, - bfd_mach_sparc_v8plus, - "sparc", - "sparc:v8plus", - 3, - false, - sparc_compatible, - bfd_default_scan, - &arch_info_struct[1], - }, - { - 32, /* bits in a word */ - 32, /* bits in an address */ - 8, /* bits in a byte */ - bfd_arch_sparc, - bfd_mach_sparc_v8plusa, - "sparc", - "sparc:v8plusa", - 3, - false, - sparc_compatible, - bfd_default_scan, - &arch_info_struct[2], - }, - { - 64, /* bits in a word */ - 64, /* bits in an address */ - 8, /* bits in a byte */ - bfd_arch_sparc, - bfd_mach_sparc_v9, - "sparc", - "sparc:v9", - 3, - false, - sparc_compatible, - bfd_default_scan, - &arch_info_struct[3], - }, - { - 64, /* bits in a word */ - 64, /* bits in an address */ - 8, /* bits in a byte */ - bfd_arch_sparc, - bfd_mach_sparc_v9a, - "sparc", - "sparc:v9a", - 3, - false, - sparc_compatible, - bfd_default_scan, - 0, - } -}; - -const bfd_arch_info_type bfd_sparc_arch = - { - 32, /* bits in a word */ - 32, /* bits in an address */ - 8, /* bits in a byte */ - bfd_arch_sparc, - bfd_mach_sparc, - "sparc", - "sparc", - 3, - true, /* the default */ - sparc_compatible, - bfd_default_scan, - &arch_info_struct[0], - }; diff --git a/contrib/gdb/bfd/cpu-vax.c b/contrib/gdb/bfd/cpu-vax.c deleted file mode 100644 index bdc6d39e451f0..0000000000000 --- a/contrib/gdb/bfd/cpu-vax.c +++ /dev/null @@ -1,39 +0,0 @@ -/* bfd back-end for vax support - Copyright (C) 1990, 91, 92, 93, 94 Free Software Foundation, Inc. - Written by Steve Chamberlain of Cygnus Support. - -This file is part of BFD, the Binary File Descriptor library. - -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 2 of the License, 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ - -#include "bfd.h" -#include "sysdep.h" -#include "libbfd.h" - -const bfd_arch_info_type bfd_vax_arch = - { - 32, /* 32 bits in a word */ - 32, /* 32 bits in an address */ - 8, /* 8 bits in a byte */ - bfd_arch_vax, - 0, /* only 1 machine */ - "vax", - "vax", - 3, - true, /* the one and only */ - bfd_default_compatible, - bfd_default_scan , - 0, - }; diff --git a/contrib/gdb/bfd/cpu-w65.c b/contrib/gdb/bfd/cpu-w65.c deleted file mode 100644 index c0bbf045219c9..0000000000000 --- a/contrib/gdb/bfd/cpu-w65.c +++ /dev/null @@ -1,54 +0,0 @@ -/* BFD library support routines for the WDC 65816 architecture. - Copyright (C) 1995 Free Software Foundation, Inc. - Hacked by Steve Chamberlain of Cygnus Support. - -This file is part of BFD, the Binary File Descriptor library. - -This program is free software; you can redistribute it and/or modify -it under the terms of the GNU General Public License as publiw65ed by -the Free Software Foundation; either version 2 of the License, 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 w65ould have received a copy of the GNU General Public License -along with this program; if not, write to the Free Software -Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ - -#include "bfd.h" -#include "sysdep.h" -#include "libbfd.h" - - -int bfd_default_scan_num_mach(); - -static boolean -scan_mach (info, string) - const struct bfd_arch_info *info; - const char *string; -{ - if (strcmp(string,"w65") == 0) return true; - if (strcmp(string,"w65816") == 0) return true; - return false; -} - - - -const bfd_arch_info_type bfd_w65_arch = -{ - 16, /* 16 bits in a word */ - 24, /* 24 bits in an address */ - 8, /* 8 bits in a byte */ - bfd_arch_w65, - 0, /* only 1 machine */ - "w65", /* arch_name */ - "w65", /* printable name */ - 1, - true, /* the default machine */ - bfd_default_compatible, - scan_mach, - 0, -}; diff --git a/contrib/gdb/bfd/cpu-we32k.c b/contrib/gdb/bfd/cpu-we32k.c deleted file mode 100644 index a38cbc1268b4f..0000000000000 --- a/contrib/gdb/bfd/cpu-we32k.c +++ /dev/null @@ -1,39 +0,0 @@ -/* bfd back-end for we32k support - Copyright (C) 1992 Free Software Foundation, Inc. - Contributed by Brendan Kehoe (brendan@cs.widener.edu). - -This file is part of BFD, the Binary File Descriptor library. - -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 2 of the License, 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ - -#include "bfd.h" -#include "sysdep.h" -#include "libbfd.h" - -const bfd_arch_info_type bfd_we32k_arch = - { - 32, /* 32 bits in a word */ - 32, /* 32 bits in an address */ - 8, /* 8 bits in a byte */ - bfd_arch_we32k, - 32000, /* only 1 machine */ - "we32k", - "we32k:32000", - 3, - true, /* the one and only */ - bfd_default_compatible, - bfd_default_scan , - 0, - }; diff --git a/contrib/gdb/bfd/cpu-z8k.c b/contrib/gdb/bfd/cpu-z8k.c deleted file mode 100644 index 5cce8eb0689bd..0000000000000 --- a/contrib/gdb/bfd/cpu-z8k.c +++ /dev/null @@ -1,198 +0,0 @@ -/* BFD library support routines for the Z800n architecture. - Copyright (C) 1992 Free Software Foundation, Inc. - Hacked by Steve Chamberlain of Cygnus Support. - -This file is part of BFD, the Binary File Descriptor library. - -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 2 of the License, 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ - -#include "bfd.h" -#include "sysdep.h" -#include "libbfd.h" - - -#if 0 /* not used currently */ -/* -Relocations for the Z8K - -*/ -static bfd_reloc_status_type -howto16_callback (abfd, reloc_entry, symbol_in, data, - ignore_input_section, ignore_bfd) - bfd *abfd; - arelent *reloc_entry; - struct symbol_cache_entry *symbol_in; - PTR data; - asection *ignore_input_section; - bfd *ignore_bfd; -{ - long relocation = 0; - bfd_vma addr = reloc_entry->address; - long x = bfd_get_16 (abfd, (bfd_byte *) data + addr); - - HOWTO_PREPARE (relocation, symbol_in); - - x = (x + relocation + reloc_entry->addend); - - bfd_put_16 (abfd, x, (bfd_byte *) data + addr); - return bfd_reloc_ok; -} - - -static bfd_reloc_status_type -howto8_callback (abfd, reloc_entry, symbol_in, data, - ignore_input_section, ignore_bfd) - bfd *abfd; - arelent *reloc_entry; - struct symbol_cache_entry *symbol_in; - PTR data; - asection *ignore_input_section; - bfd *ignore_bfd; -{ - long relocation = 0; - bfd_vma addr = reloc_entry->address; - long x = bfd_get_8 (abfd, (bfd_byte *) data + addr); - - HOWTO_PREPARE (relocation, symbol_in); - - x = (x + relocation + reloc_entry->addend); - - bfd_put_8 (abfd, x, (bfd_byte *) data + addr); - return bfd_reloc_ok; -} - - -static bfd_reloc_status_type -howto8_FFnn_callback (abfd, reloc_entry, symbol_in, data, - ignore_input_section, ignore_bfd) - bfd *abfd; - arelent *reloc_entry; - struct symbol_cache_entry *symbol_in; - PTR data; - asection *ignore_input_section; - bfd *ignore_bfd; -{ - long relocation = 0; - bfd_vma addr = reloc_entry->address; - - long x = bfd_get_8 (abfd, (bfd_byte *) data + addr); - abort (); - HOWTO_PREPARE (relocation, symbol_in); - - x = (x + relocation + reloc_entry->addend); - - bfd_put_8 (abfd, x, (bfd_byte *) data + addr); - return bfd_reloc_ok; -} - -static bfd_reloc_status_type -howto8_pcrel_callback (abfd, reloc_entry, symbol_in, data, - ignore_input_section, ignore_bfd) - bfd *abfd; - arelent *reloc_entry; - struct symbol_cache_entry *symbol_in; - PTR data; - asection *ignore_input_section; - bfd *ignore_bfd; -{ - long relocation = 0; - bfd_vma addr = reloc_entry->address; - long x = bfd_get_8 (abfd, (bfd_byte *) data + addr); - abort (); - HOWTO_PREPARE (relocation, symbol_in); - - x = (x + relocation + reloc_entry->addend); - - bfd_put_8 (abfd, x, (bfd_byte *) data + addr); - return bfd_reloc_ok; -} - - - -static reloc_howto_type howto_16 -= NEWHOWTO (howto16_callback, "abs16", 1, false, false); -static reloc_howto_type howto_8 -= NEWHOWTO (howto8_callback, "abs8", 0, false, false); - -static reloc_howto_type howto_8_FFnn -= NEWHOWTO (howto8_FFnn_callback, "ff00+abs8", 0, false, false); - -static reloc_howto_type howto_8_pcrel -= NEWHOWTO (howto8_pcrel_callback, "pcrel8", 0, false, true); - - -static reloc_howto_type * -local_bfd_reloc_type_lookup (arch, code) - const struct bfd_arch_info *arch; - bfd_reloc_code_real_type code; -{ - switch (code) - { - case BFD_RELOC_16: - return &howto_16; - case BFD_RELOC_8_FFnn: - return &howto_8_FFnn; - case BFD_RELOC_8: - return &howto_8; - case BFD_RELOC_8_PCREL: - return &howto_8_pcrel; - default: - return (reloc_howto_type *) NULL; - } -} -#endif - -int bfd_default_scan_num_mach (); - -static boolean -scan_mach (info, string) - const struct bfd_arch_info *info; - const char *string; -{ - if (strcmp (string, "z8001") == 0 || strcmp (string, "z8k") == 0) - { - return bfd_mach_z8001 == info->mach; - } - if (strcmp (string, "z8002") == 0) - { - return bfd_mach_z8002 == info->mach; - } - return false; -} - - -/* This routine is provided two arch_infos and returns whether - they'd be compatible */ - -static const bfd_arch_info_type * -compatible (a, b) - const bfd_arch_info_type *a; - const bfd_arch_info_type *b; -{ - if (a->arch != b->arch || a->mach != b->mach) - return NULL; - return a; -} - - -static const bfd_arch_info_type arch_info_struct[] = -{ - {32, 32, 8, bfd_arch_z8k, bfd_mach_z8001, "z8k", "z8001", 1, false, compatible, scan_mach, 0,}, -}; - -const bfd_arch_info_type bfd_z8k_arch = -{ - 32, 16, 8, bfd_arch_z8k, bfd_mach_z8002, "z8k", "z8002", 1, true, compatible, scan_mach, &arch_info_struct[0], -}; diff --git a/contrib/gdb/bfd/demo64.c b/contrib/gdb/bfd/demo64.c deleted file mode 100644 index c91381d46e93d..0000000000000 --- a/contrib/gdb/bfd/demo64.c +++ /dev/null @@ -1,24 +0,0 @@ -/* BFD backend for demonstration 64-bit a.out binaries. - Copyright (C) 1990, 91, 92, 93, 94 Free Software Foundation, Inc. - Written by Cygnus Support. - -This file is part of BFD, the Binary File Descriptor library. - -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 2 of the License, 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ - -#define ARCH_SIZE 64 -#define MY(OP) CAT(demo_64_,OP) -#define TARGETNAME "demo64" -#include "aoutf1.h" diff --git a/contrib/gdb/bfd/dep-in.sed b/contrib/gdb/bfd/dep-in.sed deleted file mode 100644 index 1cbd786fb2ee6..0000000000000 --- a/contrib/gdb/bfd/dep-in.sed +++ /dev/null @@ -1,24 +0,0 @@ -:loop -/\\$/N -/\\$/b loop - -s! @BFD_H@!!g -s!@INCDIR@!$(INCDIR)!g -s!@SRCDIR@/!!g -s!hosts/[^ ]*\.h ! !g -s/ sysdep.h//g -s/ libbfd.h//g -s/ config.h//g -s! \$(INCDIR)/fopen-[^ ]*\.h!!g -s! \$(INCDIR)/ansidecl\.h!!g -s! \$(INCDIR)/obstack\.h!!g - -s/\\\n */ /g - -s/ *$// -s/ */ /g -s/ *:/:/g -/:$/d - -s/\(.\{50\}[^ ]*\) /\1 \\\ - /g diff --git a/contrib/gdb/bfd/doc/ChangeLog b/contrib/gdb/bfd/doc/ChangeLog deleted file mode 100644 index f076e3777b562..0000000000000 --- a/contrib/gdb/bfd/doc/ChangeLog +++ /dev/null @@ -1,268 +0,0 @@ -Tue Jan 30 14:10:46 1996 Ian Lance Taylor <ian@cygnus.com> - - From Ronald F. Guilmette <rfg@monkeys.com>: - * Makefile.in (libbfd.h): Depend upon proto.str. - (libcoff.h, bfd.h): Likewise. - -Fri Nov 3 14:46:48 1995 Fred Fish <fnf@cygnus.com> - - * Makefile.in (SRCDOC, SRCPROT, core.texi, bfd.h): Use corefile.c, - renamed from core.c. - -Wed Nov 1 14:28:23 1995 Manfred Hollstein KS/EF4A 60/1F/110 #40283 <manfred@lts.sel.alcatel.de> - - * chew.c: Include <ctype.h>. - -Fri Oct 6 16:23:34 1995 Ken Raeburn <raeburn@cygnus.com> - - Mon Sep 25 22:49:32 1995 Andreas Schwab <schwab@issan.informatik.uni-dortmund.de> - - * Makefile.in (Makefile): Only remake this Makefile. - -Wed Oct 4 15:51:05 1995 Ken Raeburn <raeburn@cygnus.com> - - * chew.c: Include <stdio.h>. - -Tue Sep 12 18:14:50 1995 Ian Lance Taylor <ian@cygnus.com> - - * Makefile.in (maintainer-clean): New target. - -Thu Aug 31 12:18:43 1995 Ian Lance Taylor <ian@cygnus.com> - - * Makefile.in (bfd.h): Add additional #endif at end of bfd.h if - __cplusplus is defined. - -Tue Nov 29 16:13:34 1994 Doug Evans <dje@canuck.cygnus.com> - - * chew.c (write_buffer): New argument `f', all callers changed. - (stdout, stderr, print, drop, idrop): New forth words. - * proto.str (COMMENT): New command. - * doc.str (COMMENT): Likewise. - -Mon Sep 12 11:44:17 1994 Ian Lance Taylor (ian@sanguine.cygnus.com) - - * Makefile.in (DOCFILES): Remove ctor.texi. - (IPROTOS): Remove ctor.ip. - (SRCIPROT): Remove $(srcdir)/../ctor.c. - (ctor.texi): Remove target. - (libbfd.h): Remove dependency on $(srcdir)/../ctor.c. Remove - $(MKDOC) run on $(srcdir)/../ctor.c. - * bfd.texinfo (Constructors): Remove section. - -Fri Sep 2 13:33:44 1994 Ken Raeburn (raeburn@cujo.cygnus.com) - - * chew.c: Include assert.h. Added prototypes for most functions. - Changed most uses of int to long. Do bounds checking on the - stacks. Added comment at the beginning documenting most of the - intrinsics. Lots of whitespace changes. Re-ordered some - functions. - (die, check_range, icheck_range): New functions. - (strip_trailing_newlines, print_stack_level): New functions. - (translatecomments): Don't insert tab before "/*". - (iscommand): Minimum command length is now 4. - (nextword): Handle some \-sequences. - (push_addr): Deleted. - (main): Add new intrinsics strip_trailing_newlines and - print_stack_level. Complain at end if stack contains more than - one element, or less. - (remchar): Make sure the string is not empty before chopping off a - character. - - * doc.str, proto.str: Handle new commands SENUM, ENUM, ENUMX, - ENUMEQ, ENUMEQX, ENUMDOC. - -Wed Jan 12 18:37:12 1994 Ian Lance Taylor (ian@tweedledumb.cygnus.com) - - * bfd.texinfo: Added Linker Functions node. - * doc/Makefile.in (DOCFILES): Added linker.texi. - (SRCDOC): Added linker.c. - (linker.texi): New target. - -Tue Jan 4 10:52:56 1994 Ian Lance Taylor (ian@tweedledumb.cygnus.com) - - * chew.c: Don't rely on a correct declaration of exit. - (chew_exit): New function which just calls exit. - (main): Use it. - -Mon Jan 3 11:40:40 1994 Ian Lance Taylor (ian@tweedledumb.cygnus.com) - - * bfd.texinfo: Added Hash Tables node. - * Makefile.in (DOCFILES): Added hash.texi. - (SRCDOC): Added hash.c. - (hash.texi): New target. - -Thu Dec 30 16:57:04 1993 Ken Raeburn (raeburn@cujo.cygnus.com) - - * Makefile.in: Delete all references to seclet.c, since it's just - been deleted. Don't mention hash.c, linker.c, or genlink.h yet, - since they don't contain documentation yet (hint, hint!). - -Fri Nov 5 10:58:53 1993 David J. Mackenzie (djm@thepub.cygnus.com) - - * bfd.texinfo: Small cleanups. - -Fri Nov 19 03:46:11 1993 Ken Raeburn (raeburn@cambridge.cygnus.com) - - * Makefile.in (archures.texi): Depends on $(MKDOC). - -Tue Aug 10 14:22:39 1993 Ken Raeburn (raeburn@cambridge.cygnus.com) - - * bfd.texinfo (BFD back end): Don't include elfcode.texi, since - it's empty now and that triggers a makeinfo bug. - -Mon Aug 9 16:27:30 1993 Ken Raeburn (raeburn@cambridge.cygnus.com) - - * bfd.texinfo (BFD back end): New section on ELF, includes - elf.texi and elfcode.texi. - * Makefile.in (DOCFILES): Include elf.texi, elfcode.texi. - (SRCDOC): Include elfcode.h, elf.c. - (elf.texi, elfcode.texi): New intermediate targets. - -Thu Jun 24 13:48:13 1993 David J. Mackenzie (djm@thepub.cygnus.com) - - * Makefile.in (.c.o, chew.o): Put CFLAGS last. - * bfdsumm.texi: New file, broken out of bfd.texinfo, to share - with ld.texinfo. - -Mon Jun 14 12:07:07 1993 david d `zoo' zuhn (zoo at rtl.cygnus.com) - - * Makefile.in (install-info): remove parentdir cruft, - -Wed Jun 9 16:00:32 1993 Jim Kingdon (kingdon@cygnus.com) - - * Makefile.in (mostlyclean): Remove chew.o. - -Tue May 25 14:46:58 1993 Ken Raeburn (raeburn@cambridge.cygnus.com) - - * Makefile.in (libbfd.h): Use elfcode.h, not elf32.c. - -Mon May 24 15:50:07 1993 Ken Raeburn (raeburn@cygnus.com) - - * chew.c (compile): Add a couple of missing casts. - -Wed May 12 14:45:14 1993 Ian Lance Taylor (ian@cygnus.com) - - * Makefile.in (CC_FOR_BUILD): New variable, define to be $(CC). - (chew.o, $(MKDOC)): Build using CC_FOR_BUILD rather than CC, since - it must run on the build machine. - -Tue Apr 6 22:38:10 1993 John Gilmore (gnu@cygnus.com) - - * Makefile.in (chew): Don't compile from .c to executable in a - single step; it puts a temporary .o filename into the executable, - which makes multi-stage comparisons fail. Compile chew.c to - chew.o, and link that, which makes identical executables every time. - -Wed Mar 24 17:26:29 1993 david d `zoo' zuhn (zoo at poseidon.cygnus.com) - - * Makefile.in: fix typo (bfd.texinfo not bfd.texino) - -Fri Mar 19 01:13:00 1993 Ken Raeburn (raeburn@kr-pc.cygnus.com) - - * bfd.texinfo: Since BFD version number has been bumped, do same - to "version number" on title page, and elsewhere. Should be - fixed to extract real version number. - -Tue Mar 16 12:15:13 1993 Per Bothner (bothner@rtl.cygnus.com) - - * Makefile.in: Add *clean rules. - -Mon Jan 11 18:43:56 1993 Ian Lance Taylor (ian@tweedledumb.cygnus.com) - - * Makefile.in (libbfd.h): Removed duplicate init.c and libbfd.c. - Added seclet.c. - (bfd.h): Added dependency on bfd.c and seclet.c. Added seclet.c - to build. - -Thu Dec 17 19:35:43 1992 david d `zoo' zuhn (zoo at cirdan.cygnus.com) - - * Makefile.in: added dvi target, define and use $(TEXI2DVI) - -Thu Dec 3 17:42:48 1992 Ken Raeburn (raeburn@cambridge.cygnus.com) - - * Makefile.in (TEXIDIR): New variable. - (bfd.dvi): Look for bfd.texinfo in $(srcdir). Generate index. - - * bfd.texinfo: Minor doc fixes. - -Thu Nov 5 03:13:55 1992 John Gilmore (gnu@cygnus.com) - - Cleanup: Replace all uses of EXFUN in the BFD sources, with PARAMS. - - * doc/chew.c (exfunstuff): Eliminate. - (paramstuff): Replace exfunstuff with function to generate PARAMS. - * doc/proto.str: Use paramstuff rather than exfunstuff. - -Mon Aug 17 12:40:32 1992 Steve Chamberlain (sac@thepub.cygnus.com) - - * chew.c: various patches provided by Howard Chu. - -Fri Jun 19 18:59:54 1992 John Gilmore (gnu at cygnus.com) - - * Makefile.in (libbfd.h): Add elf.c as a source of prototypes. - -Mon May 11 18:55:59 1992 John Gilmore (gnu at cygnus.com) - - * chew.c: exit() should be declared by config files, not by - portable source code. Its type could be int or void function. - -Mon May 4 13:45:57 1992 K. Richard Pixley (rich@rtl.cygnus.com) - - * Makefile.in: another CFLAGS correction. - -Tue Apr 28 10:21:32 1992 K. Richard Pixley (rich@rtl.cygnus.com) - - * Makefile.in: Do the CFLAGS thing. - -Fri Apr 10 22:34:52 1992 Fred Fish (fnf@cygnus.com) - - * Makefile.in (MINUS_G): Add macro and default to -g. - -Fri Mar 6 18:53:18 1992 Steve Chamberlain (sac@thepub.cygnus.com) - - * chew.c: now has -w switch turn on warnings - -Wed Feb 26 18:04:40 1992 K. Richard Pixley (rich@cygnus.com) - - * Makefile.in, configure.in: removed traces of namesubdir, - -subdirs, $(subdir), $(unsubdir), some rcs triggers. Forced - copyrights to '92, changed some from Cygnus to FSF. - -Tue Dec 10 22:11:05 1991 K. Richard Pixley (rich at rtl.cygnus.com) - - * Makefile.in: build chew into the current directory. Complete - the MKDOC macro transition. - -Tue Dec 10 08:26:28 1991 Steve Chamberlain (sac at rtl.cygnus.com) - - * chew.c: don't core dump when can't open file - * Makefile.in: get proto.str from the right place when built in - odd directories - -Tue Dec 10 04:07:25 1991 K. Richard Pixley (rich at rtl.cygnus.com) - - * Makefile.in: infodir belongs in datadir. - -Sat Dec 7 17:01:23 1991 Steve Chamberlain (sac at rtl.cygnus.com) - - * chew.c: Much modified - * proto.str, doc.str: New files for extracting to product - prototypes and documents respectively. - - -Fri Dec 6 22:57:12 1991 K. Richard Pixley (rich at rtl.cygnus.com) - - * Makefile.in: added standards.text support, host/site/target - inclusion hooks, install using INSTALL_DATA rather than cp, - don't echo on install. - -Thu Dec 5 22:46:17 1991 K. Richard Pixley (rich at rtl.cygnus.com) - - * Makefile.in: idestdir and ddestdir go away. Added copyrights - and shift gpl to v2. Added ChangeLog if it didn't exist. docdir - and mandir now keyed off datadir by default. - - -Local Variables: -version-control: never -End: diff --git a/contrib/gdb/bfd/doc/Makefile.in b/contrib/gdb/bfd/doc/Makefile.in deleted file mode 100644 index aa3a76c26ae5c..0000000000000 --- a/contrib/gdb/bfd/doc/Makefile.in +++ /dev/null @@ -1,311 +0,0 @@ -# -# Makefile -# Copyright (C) 1990, 1991, 1992, 1993 Free Software Foundation -# -# This file 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 2 of the License, 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ -# - -VPATH = @srcdir@ -srcdir = @srcdir@ - -prefix = @prefix@ - -exec_prefix = @exec_prefix@ -bindir = $(exec_prefix)/bin -libdir = $(exec_prefix)/lib - -datadir = $(prefix)/lib -mandir = $(prefix)/man -man1dir = $(mandir)/man1 -man2dir = $(mandir)/man2 -man3dir = $(mandir)/man3 -man4dir = $(mandir)/man4 -man5dir = $(mandir)/man5 -man6dir = $(mandir)/man6 -man7dir = $(mandir)/man7 -man8dir = $(mandir)/man8 -man9dir = $(mandir)/man9 -infodir = $(prefix)/info -includedir = $(prefix)/include -docdir = $(datadir)/doc - -MKDOC=./chew -SHELL = /bin/sh - -INSTALL = `cd $(srcdir)/../..;pwd`/install.sh -c -INSTALL_PROGRAM = $(INSTALL) -INSTALL_DATA = $(INSTALL) - -MAKEINFO = makeinfo -TEXI2DVI = texi2dvi -CFLAGS = -g - -CC_FOR_BUILD = $(CC) - -#### Host, target, and site specific Makefile fragments come in here. -### - -.c.o: - $(CC) -c -I.. -I$(srcdir)/.. -I$(srcdir)/../../include $(H_CFLAGS) $(CFLAGS) $< - -DOCFILES = aoutx.texi archive.texi archures.texi \ - bfd.texi cache.texi coffcode.texi \ - core.texi elf.texi elfcode.texi format.texi libbfd.texi \ - opncls.texi reloc.texi section.texi \ - syms.texi targets.texi init.texi hash.texi linker.texi - -PROTOS = archive.p archures.p bfd.p \ - core.p format.p \ - libbfd.p opncls.p reloc.p \ - section.p syms.p targets.p \ - format.p core.p init.p - -IPROTOS = cache.ip libbfd.ip reloc.ip init.ip archures.ip coffcode.ip - -# SRCDOC, SRCPROT, SRCIPROT only used to sidestep Sun Make bug in interaction -# between VPATH and suffix rules. If you use GNU Make, perhaps other Makes, -# you don't need these three: -SRCDOC = $(srcdir)/../aoutx.h $(srcdir)/../archive.c \ - $(srcdir)/../archures.c $(srcdir)/../bfd.c \ - $(srcdir)/../cache.c $(srcdir)/../coffcode.h \ - $(srcdir)/../corefile.c $(srcdir)/../elf.c \ - $(srcdir)/../elfcode.h $(srcdir)/../format.c \ - $(srcdir)/../libbfd.c $(srcdir)/../opncls.c \ - $(srcdir)/../reloc.c $(srcdir)/../section.c \ - $(srcdir)/../syms.c $(srcdir)/../targets.c \ - $(srcdir)/../hash.c $(srcdir)/../linker.c - -SRCPROT = $(srcdir)/../archive.c $(srcdir)/../archures.c \ - $(srcdir)/../bfd.c $(srcdir)/../coffcode.h $(srcdir)/../corefile.c \ - $(srcdir)/../format.c $(srcdir)/../libbfd.c \ - $(srcdir)/../opncls.c $(srcdir)/../reloc.c \ - $(srcdir)/../section.c $(srcdir)/../syms.c \ - $(srcdir)/../targets.c $(srcdir)/../init.c - -SRCIPROT = $(srcdir)/../cache.c $(srcdir)/../libbfd.c \ - $(srcdir)/../reloc.c $(srcdir)/../cpu-h8300.c \ - $(srcdir)/../cpu-i960.c $(srcdir)/../archures.c \ - $(srcdir)/../init.c - -STAGESTUFF = $(DOCFILES) *.info* - -TEXIDIR = $(srcdir)/../../texinfo/fsf - -all install: - -info: bfd.info - -dvi: bfd.dvi - -install-info: info - for i in *.info* ; do \ - $(INSTALL_DATA) $$i $(infodir)/$$i ; \ - done - -docs: $(MKDOC) protos bfd.info bfd.dvi bfd.ps - -$(MKDOC): chew.o - $(CC_FOR_BUILD) -o $(MKDOC) chew.o $(LOADLIBES) $(LDFLAGS) - -chew.o: chew.c - $(CC_FOR_BUILD) -c -I.. -I$(srcdir)/.. -I$(srcdir)/../../include $(H_CFLAGS) $(CFLAGS) $(srcdir)/chew.c - -protos: libbfd.h libcoff.h bfd.h - - -# We can't replace these rules with an implicit rule, because -# makes without VPATH support couldn't find the .h files in `..'. - -aoutx.texi: $(MKDOC) $(srcdir)/../aoutx.h $(srcdir)/doc.str - $(MKDOC) -f $(srcdir)/doc.str <$(srcdir)/../aoutx.h >aoutx.texi - -archive.texi: $(MKDOC) $(srcdir)/../archive.c $(srcdir)/doc.str - $(MKDOC) -f $(srcdir)/doc.str <$(srcdir)/../archive.c >archive.texi - -archures.texi: $(MKDOC) $(srcdir)/../archures.c $(srcdir)/doc.str - $(MKDOC) -f $(srcdir)/doc.str < $(srcdir)/../archures.c >archures.texi - -bfd.texi: $(MKDOC) $(srcdir)/../bfd.c $(srcdir)/doc.str - $(MKDOC) -f $(srcdir)/doc.str < $(srcdir)/../bfd.c >bfd.texi - -cache.texi: $(MKDOC) $(srcdir)/../cache.c $(srcdir)/doc.str - $(MKDOC) -f $(srcdir)/doc.str < $(srcdir)/../cache.c >cache.texi - -coffcode.texi: $(MKDOC) $(srcdir)/../coffcode.h $(srcdir)/doc.str - $(MKDOC) -f $(srcdir)/doc.str <$(srcdir)/../coffcode.h >coffcode.texi - -core.texi: $(MKDOC) $(srcdir)/../corefile.c $(srcdir)/doc.str - $(MKDOC) -f $(srcdir)/doc.str <$(srcdir)/../corefile.c >core.texi - -elf.texi: $(MKDOC) $(srcdir)/../elf.c $(srcdir)/doc.str - $(MKDOC) -f $(srcdir)/doc.str <$(srcdir)/../elf.c >elf.texi - -elfcode.texi: $(MKDOC) $(srcdir)/../elfcode.h $(srcdir)/doc.str - $(MKDOC) -f $(srcdir)/doc.str <$(srcdir)/../elfcode.h >elfcode.texi - -format.texi: $(MKDOC) $(srcdir)/../format.c $(srcdir)/doc.str - $(MKDOC) -f $(srcdir)/doc.str <$(srcdir)/../format.c >format.texi - -libbfd.texi: $(MKDOC) $(srcdir)/../libbfd.c $(srcdir)/doc.str - $(MKDOC) -f $(srcdir)/doc.str < $(srcdir)/../libbfd.c >libbfd.texi - -opncls.texi: $(MKDOC) $(srcdir)/../opncls.c $(srcdir)/doc.str - $(MKDOC) -f $(srcdir)/doc.str <$(srcdir)/../opncls.c >opncls.texi - -reloc.texi : $(MKDOC) $(srcdir)/../reloc.c - $(MKDOC) -f $(srcdir)/doc.str <$(srcdir)/../reloc.c >reloc.texi - -section.texi: $(MKDOC) $(srcdir)/../section.c $(srcdir)/doc.str - $(MKDOC) -f $(srcdir)/doc.str <$(srcdir)/../section.c >section.texi - -syms.texi : $(MKDOC) $(srcdir)/../syms.c - $(MKDOC) -f $(srcdir)/doc.str <$(srcdir)/../syms.c >syms.texi - -targets.texi: $(MKDOC) $(srcdir)/../targets.c $(srcdir)/doc.str - $(MKDOC) -f $(srcdir)/doc.str <$(srcdir)/../targets.c >targets.texi - -init.texi: $(MKDOC) $(srcdir)/../init.c $(srcdir)/doc.str - $(MKDOC) -f $(srcdir)/doc.str <$(srcdir)/../init.c >init.texi - -hash.texi: $(MKDOC) $(srcdir)/../hash.c $(srcdir)/doc.str - $(MKDOC) -f $(srcdir)/doc.str <$(srcdir)/../hash.c >hash.texi - -linker.texi: $(MKDOC) $(srcdir)/../linker.c $(srcdir)/doc.str - $(MKDOC) -f $(srcdir)/doc.str <$(srcdir)/../linker.c >linker.texi - -libbfd.h: $(srcdir)/../libbfd-in.h \ - $(srcdir)/../init.c \ - $(srcdir)/../libbfd.c \ - $(srcdir)/../cache.c \ - $(srcdir)/../reloc.c \ - $(srcdir)/../cpu-h8300.c \ - $(srcdir)/../cpu-i960.c \ - $(srcdir)/../archures.c \ - $(srcdir)/../elfcode.h \ - $(srcdir)/proto.str \ - $(MKDOC) - cat $(srcdir)/../libbfd-in.h >libbfd.h - $(MKDOC) -i -f $(srcdir)/proto.str < $(srcdir)/../init.c >>libbfd.h - $(MKDOC) -i -f $(srcdir)/proto.str < $(srcdir)/../libbfd.c >>libbfd.h - $(MKDOC) -i -f $(srcdir)/proto.str < $(srcdir)/../cache.c >>libbfd.h - $(MKDOC) -i -f $(srcdir)/proto.str < $(srcdir)/../reloc.c >>libbfd.h - $(MKDOC) -i -f $(srcdir)/proto.str < $(srcdir)/../cpu-h8300.c >>libbfd.h - $(MKDOC) -i -f $(srcdir)/proto.str < $(srcdir)/../cpu-i960.c >>libbfd.h - $(MKDOC) -i -f $(srcdir)/proto.str < $(srcdir)/../archures.c >>libbfd.h - $(MKDOC) -i -f $(srcdir)/proto.str < $(srcdir)/../elf.c >>libbfd.h - $(MKDOC) -i -f $(srcdir)/proto.str < $(srcdir)/../elfcode.h >>libbfd.h - -libcoff.h: $(srcdir)/../libcoff-in.h \ - $(srcdir)/../coffcode.h \ - $(srcdir)/proto.str \ - $(MKDOC) - cat $(srcdir)/../libcoff-in.h >libcoff.h - $(MKDOC) -i -f $(srcdir)/proto.str < $(srcdir)/../coffcode.h >>libcoff.h - -bfd.h: $(srcdir)/../bfd-in.h \ - $(srcdir)/../init.c \ - $(srcdir)/../opncls.c \ - $(srcdir)/../libbfd.c \ - $(srcdir)/../section.c \ - $(srcdir)/../archures.c \ - $(srcdir)/../reloc.c \ - $(srcdir)/../syms.c \ - $(srcdir)/../bfd.c \ - $(srcdir)/../archive.c \ - $(srcdir)/../corefile.c \ - $(srcdir)/../targets.c \ - $(srcdir)/../format.c \ - $(srcdir)/proto.str \ - $(MKDOC) - cat $(srcdir)/../bfd-in.h >bfd.h - $(MKDOC) -f $(srcdir)/proto.str<$(srcdir)/../init.c >>bfd.h - $(MKDOC) -f $(srcdir)/proto.str<$(srcdir)/../opncls.c >>bfd.h - $(MKDOC) -f $(srcdir)/proto.str<$(srcdir)/../libbfd.c >>bfd.h - $(MKDOC) -f $(srcdir)/proto.str<$(srcdir)/../section.c >>bfd.h - $(MKDOC) -f $(srcdir)/proto.str<$(srcdir)/../archures.c >>bfd.h - $(MKDOC) -f $(srcdir)/proto.str<$(srcdir)/../reloc.c >>bfd.h - $(MKDOC) -f $(srcdir)/proto.str<$(srcdir)/../syms.c >>bfd.h - $(MKDOC) -f $(srcdir)/proto.str<$(srcdir)/../bfd.c >>bfd.h - $(MKDOC) -f $(srcdir)/proto.str<$(srcdir)/../archive.c >>bfd.h - $(MKDOC) -f $(srcdir)/proto.str<$(srcdir)/../corefile.c >>bfd.h - $(MKDOC) -f $(srcdir)/proto.str<$(srcdir)/../targets.c >>bfd.h - $(MKDOC) -f $(srcdir)/proto.str<$(srcdir)/../format.c >>bfd.h - echo "#ifdef __cplusplus" >>bfd.h - echo "}" >>bfd.h - echo "#endif" >>bfd.h - echo "#endif" >>bfd.h - - -clean-info: clean - -mostlyclean: - rm -rf *.log *.ps *~* *.dvi *# $(MKDOC) *.o - -clean: mostlyclean - rm -rf $(STAGESTUFF) - rm -f *.p *.ip bfd.?? bfd.??? bfd.h libbfd.h libcoff.h texput.log - -distclean: clean - rm -f Makefile config.status - -maintainer-clean realclean: clean - rm -f Makefile config.status - -bfd.info: $(DOCFILES) bfdsumm.texi bfd.texinfo - $(MAKEINFO) -I$(srcdir) -o bfd.info $(srcdir)/bfd.texinfo - -bfd.dvi: $(DOCFILES) bfdsumm.texi bfd.texinfo - $(TEXI2DVI) $(srcdir)/bfd.texinfo - -bfd.ps: bfd.dvi - dvips bfd -o - -quickdoc: $(DOCFILES) bfdsumm.texi bfd.texinfo - TEXINPUTS=${TEXIDIR}:.:$$TEXINPUTS tex bfd.texinfo - -stage1: force - - mkdir stage1 - - mv -f $(STAGESTUFF) stage1 - -stage2: force - - mkdir stage2 - - mv -f $(STAGESTUFF) stage2 - -stage3: force - - mkdir stage3 - - mv -f $(STAGESTUFF) stage3 - -against=stage2 - -comparison: force - for i in $(STAGESTUFF) ; do cmp $$i $(against)/$$i || exit 1 ; done - -de-stage1: force - - (cd stage1 ; mv -f $(STAGESTUFF) ..) - - rmdir stage1 - -de-stage2: force - - (cd stage2 ; mv -f $(STAGESTUFF) ..) - - rmdir stage2 - -de-stage3: force - - (cd stage3 ; mv -f $(STAGESTUFF) ..) - - rmdir stage3 - -force: - -Makefile: $(srcdir)/Makefile.in - cd .. && CONFIG_FILES=doc/$@ CONFIG_HEADERS= $(SHELL) ./config.status - diff --git a/contrib/gdb/bfd/doc/bfd.texinfo b/contrib/gdb/bfd/doc/bfd.texinfo deleted file mode 100644 index af7bc10062d58..0000000000000 --- a/contrib/gdb/bfd/doc/bfd.texinfo +++ /dev/null @@ -1,348 +0,0 @@ -\input texinfo.tex -@setfilename bfd.info -@c $Id: bfd.texinfo,v 1.28 1995/11/10 20:04:12 victoria Exp $ -@tex -% NOTE LOCAL KLUGE TO AVOID TOO MUCH WHITESPACE -\global\long\def\example{% -\begingroup -\let\aboveenvbreak=\par -\let\afterenvbreak=\par -\parskip=0pt -\lisp} -\global\long\def\Eexample{% -\Elisp -\endgroup -\vskip -\parskip% to cancel out effect of following \par -} -@end tex -@synindex fn cp - -@ifinfo -@format -START-INFO-DIR-ENTRY -* Bfd: (bfd). The Binary File Descriptor library. -END-INFO-DIR-ENTRY -@end format -@end ifinfo - -@ifinfo -This file documents the BFD library. - -Copyright (C) 1991 Free Software Foundation, Inc. - -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. - -@ignore -Permission is granted to process this file through Tex and print the -results, provided the printed document carries copying permission -notice identical to this one except for the removal of this paragraph -(this paragraph not being relevant to the printed manual). - -@end ignore -Permission is granted to copy and distribute modified versions of this -manual under the conditions for verbatim copying, subject to the terms -of the GNU General Public License, which includes the provision that the -entire resulting derived work is distributed under the terms of a -permission notice identical to this one. - -Permission is granted to copy and distribute translations of this manual -into another language, under the above conditions for modified versions. -@end ifinfo -@iftex -@c@finalout -@setchapternewpage on -@c@setchapternewpage odd -@settitle LIB BFD, the Binary File Descriptor Library -@titlepage -@title{libbfd} -@subtitle{The Binary File Descriptor Library} -@sp 1 -@subtitle First Edition---BFD version < 3.0 -@subtitle April 1991 -@author {Steve Chamberlain} -@author {Cygnus Support} -@page - -@tex -\def\$#1${{#1}} % Kluge: collect RCS revision info without $...$ -\xdef\manvers{\$Revision: 1.28 $} % For use in headers, footers too -{\parskip=0pt -\hfill Cygnus Support\par -\hfill sac\@cygnus.com\par -\hfill {\it BFD}, \manvers\par -\hfill \TeX{}info \texinfoversion\par -} -\global\parindent=0pt % Steve likes it this way -@end tex - -@vskip 0pt plus 1filll -Copyright @copyright{} 1991 Free Software Foundation, Inc. - -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. - -Permission is granted to copy and distribute modified versions of this -manual under the conditions for verbatim copying, subject to the terms -of the GNU General Public License, which includes the provision that the -entire resulting derived work is distributed under the terms of a -permission notice identical to this one. - -Permission is granted to copy and distribute translations of this manual -into another language, under the above conditions for modified versions. -@end titlepage -@end iftex - -@node Top, Overview, (dir), (dir) -@ifinfo -This file documents the binary file descriptor library libbfd. -@end ifinfo - -@menu -* Overview:: Overview of BFD -* BFD front end:: BFD front end -* BFD back ends:: BFD back ends -* Index:: Index -@end menu - -@node Overview, BFD front end, Top, Top -@chapter Introduction -@cindex BFD -@cindex what is it? -BFD is a package which allows applications to use the -same routines to operate on object files whatever the object file -format. A new object file format can be supported simply by -creating a new BFD back end and adding it to the library. - -BFD is split into two parts: the front end, and the back ends (one for -each object file format). -@itemize @bullet -@item The front end of BFD provides the interface to the user. It manages -memory and various canonical data structures. The front end also -decides which back end to use and when to call back end routines. -@item The back ends provide BFD its view of the real world. Each back -end provides a set of calls which the BFD front end can use to maintain -its canonical form. The back ends also may keep around information for -their own use, for greater efficiency. -@end itemize -@menu -* History:: History -* How It Works:: How It Works -* What BFD Version 2 Can Do:: What BFD Version 2 Can Do -@end menu - -@node History, How It Works, Overview, Overview -@section History - -One spur behind BFD was the desire, on the part of the GNU 960 team at -Intel Oregon, for interoperability of applications on their COFF and -b.out file formats. Cygnus was providing GNU support for the team, and -was contracted to provide the required functionality. - -The name came from a conversation David Wallace was having with Richard -Stallman about the library: RMS said that it would be quite hard---David -said ``BFD''. Stallman was right, but the name stuck. - -At the same time, Ready Systems wanted much the same thing, but for -different object file formats: IEEE-695, Oasys, Srecords, a.out and 68k -coff. - -BFD was first implemented by members of Cygnus Support; Steve -Chamberlain (@code{sac@@cygnus.com}), John Gilmore -(@code{gnu@@cygnus.com}), K. Richard Pixley (@code{rich@@cygnus.com}) -and David Henkel-Wallace (@code{gumby@@cygnus.com}). - - - -@node How It Works, What BFD Version 2 Can Do, History, Overview -@section How To Use BFD - -To use the library, include @file{bfd.h} and link with @file{libbfd.a}. - -BFD provides a common interface to the parts of an object file -for a calling application. - -When an application sucessfully opens a target file (object, archive, or -whatever), a pointer to an internal structure is returned. This pointer -points to a structure called @code{bfd}, described in -@file{bfd.h}. Our convention is to call this pointer a BFD, and -instances of it within code @code{abfd}. All operations on -the target object file are applied as methods to the BFD. The mapping is -defined within @code{bfd.h} in a set of macros, all beginning -with @samp{bfd_} to reduce namespace pollution. - -For example, this sequence does what you would probably expect: -return the number of sections in an object file attached to a BFD -@code{abfd}. - -@lisp -@c @cartouche -#include "bfd.h" - -unsigned int number_of_sections(abfd) -bfd *abfd; -@{ - return bfd_count_sections(abfd); -@} -@c @end cartouche -@end lisp - -The abstraction used within BFD is that an object file has: - -@itemize @bullet -@item -a header, -@item -a number of sections containing raw data (@pxref{Sections}), -@item -a set of relocations (@pxref{Relocations}), and -@item -some symbol information (@pxref{Symbols}). -@end itemize -@noindent -Also, BFDs opened for archives have the additional attribute of an index -and contain subordinate BFDs. This approach is fine for a.out and coff, -but loses efficiency when applied to formats such as S-records and -IEEE-695. - -@node What BFD Version 2 Can Do, , How It Works, Overview -@section What BFD Version 2 Can Do -@include bfdsumm.texi - -@node BFD front end, BFD back ends, Overview, Top -@chapter BFD front end -@include bfd.texi - -@menu -* Memory Usage:: -* Initialization:: -* Sections:: -* Symbols:: -* Archives:: -* Formats:: -* Relocations:: -* Core Files:: -* Targets:: -* Architectures:: -* Opening and Closing:: -* Internal:: -* File Caching:: -* Linker Functions:: -* Hash Tables:: -@end menu - -@node Memory Usage, Initialization, BFD front end, BFD front end -@section Memory usage -BFD keeps all of its internal structures in obstacks. There is one obstack -per open BFD file, into which the current state is stored. When a BFD is -closed, the obstack is deleted, and so everything which has been -allocated by BFD for the closing file is thrown away. - -BFD does not free anything created by an application, but pointers into -@code{bfd} structures become invalid on a @code{bfd_close}; for example, -after a @code{bfd_close} the vector passed to -@code{bfd_canonicalize_symtab} is still around, since it has been -allocated by the application, but the data that it pointed to are -lost. - -The general rule is to not close a BFD until all operations dependent -upon data from the BFD have been completed, or all the data from within -the file has been copied. To help with the management of memory, there -is a function (@code{bfd_alloc_size}) which returns the number of bytes -in obstacks associated with the supplied BFD. This could be used to -select the greediest open BFD, close it to reclaim the memory, perform -some operation and reopen the BFD again, to get a fresh copy of the data -structures. - -@node Initialization, Sections, Memory Usage, BFD front end -@include init.texi - -@node Sections, Symbols, Initialization, BFD front end -@include section.texi - -@node Symbols, Archives, Sections, BFD front end -@include syms.texi - -@node Archives, Formats, Symbols, BFD front end -@include archive.texi - -@node Formats, Relocations, Archives, BFD front end -@include format.texi - -@node Relocations, Core Files, Formats, BFD front end -@include reloc.texi - -@node Core Files, Targets, Relocations, BFD front end -@include core.texi - -@node Targets, Architectures, Core Files, BFD front end -@include targets.texi - -@node Architectures, Opening and Closing, Targets, BFD front end -@include archures.texi - -@node Opening and Closing, Internal, Architectures, BFD front end -@include opncls.texi - -@node Internal, File Caching, Opening and Closing, BFD front end -@include libbfd.texi - -@node File Caching, Linker Functions, Internal, BFD front end -@include cache.texi - -@node Linker Functions, Hash Tables, File Caching, BFD front end -@include linker.texi - -@node Hash Tables, , Linker Functions, BFD front end -@include hash.texi - -@node BFD back ends, Index, BFD front end, Top -@chapter BFD back ends -@menu -* What to Put Where:: -* aout :: a.out backends -* coff :: coff backends -* elf :: elf backends -@ignore -* oasys :: oasys backends -* ieee :: ieee backend -* srecord :: s-record backend -@end ignore -@end menu -@node What to Put Where, aout, BFD back ends, BFD back ends -All of BFD lives in one directory. - -@node aout, coff, What to Put Where, BFD back ends -@include aoutx.texi - -@node coff, elf, aout, BFD back ends -@include coffcode.texi - -@node elf, , coff, BFD back ends -@include elf.texi -@c Leave this out until the file has some actual contents... -@c @include elfcode.texi - -@node Index, , BFD back ends , Top -@unnumbered Index -@printindex cp - -@tex -% I think something like @colophon should be in texinfo. In the -% meantime: -\long\def\colophon{\hbox to0pt{}\vfill -\centerline{The body of this manual is set in} -\centerline{\fontname\tenrm,} -\centerline{with headings in {\bf\fontname\tenbf}} -\centerline{and examples in {\tt\fontname\tentt}.} -\centerline{{\it\fontname\tenit\/} and} -\centerline{{\sl\fontname\tensl\/}} -\centerline{are used for emphasis.}\vfill} -\page\colophon -% Blame: doc@cygnus.com, 28mar91. -@end tex - -@contents -@bye diff --git a/contrib/gdb/bfd/doc/bfdsumm.texi b/contrib/gdb/bfd/doc/bfdsumm.texi deleted file mode 100644 index 844531aff8cb7..0000000000000 --- a/contrib/gdb/bfd/doc/bfdsumm.texi +++ /dev/null @@ -1,148 +0,0 @@ -@c This summary of BFD is shared by the BFD and LD docs. -When an object file is opened, BFD subroutines automatically determine -the format of the input object file. They then build a descriptor in -memory with pointers to routines that will be used to access elements of -the object file's data structures. - -As different information from the the object files is required, -BFD reads from different sections of the file and processes them. -For example, a very common operation for the linker is processing symbol -tables. Each BFD back end provides a routine for converting -between the object file's representation of symbols and an internal -canonical format. When the linker asks for the symbol table of an object -file, it calls through a memory pointer to the routine from the -relevant BFD back end which reads and converts the table into a canonical -form. The linker then operates upon the canonical form. When the link is -finished and the linker writes the output file's symbol table, -another BFD back end routine is called to take the newly -created symbol table and convert it into the chosen output format. - -@menu -* BFD information loss:: Information Loss -* Canonical format:: The BFD canonical object-file format -@end menu - -@node BFD information loss -@subsection Information Loss - -@emph{Information can be lost during output.} The output formats -supported by BFD do not provide identical facilities, and -information which can be described in one form has nowhere to go in -another format. One example of this is alignment information in -@code{b.out}. There is nowhere in an @code{a.out} format file to store -alignment information on the contained data, so when a file is linked -from @code{b.out} and an @code{a.out} image is produced, alignment -information will not propagate to the output file. (The linker will -still use the alignment information internally, so the link is performed -correctly). - -Another example is COFF section names. COFF files may contain an -unlimited number of sections, each one with a textual section name. If -the target of the link is a format which does not have many sections (e.g., -@code{a.out}) or has sections without names (e.g., the Oasys format), the -link cannot be done simply. You can circumvent this problem by -describing the desired input-to-output section mapping with the linker command -language. - -@emph{Information can be lost during canonicalization.} The BFD -internal canonical form of the external formats is not exhaustive; there -are structures in input formats for which there is no direct -representation internally. This means that the BFD back ends -cannot maintain all possible data richness through the transformation -between external to internal and back to external formats. - -This limitation is only a problem when an application reads one -format and writes another. Each BFD back end is responsible for -maintaining as much data as possible, and the internal BFD -canonical form has structures which are opaque to the BFD core, -and exported only to the back ends. When a file is read in one format, -the canonical form is generated for BFD and the application. At the -same time, the back end saves away any information which may otherwise -be lost. If the data is then written back in the same format, the back -end routine will be able to use the canonical form provided by the -BFD core as well as the information it prepared earlier. Since -there is a great deal of commonality between back ends, -there is no information lost when -linking or copying big endian COFF to little endian COFF, or @code{a.out} to -@code{b.out}. When a mixture of formats is linked, the information is -only lost from the files whose format differs from the destination. - -@node Canonical format -@subsection The BFD canonical object-file format - -The greatest potential for loss of information occurs when there is the least -overlap between the information provided by the source format, that -stored by the canonical format, and that needed by the -destination format. A brief description of the canonical form may help -you understand which kinds of data you can count on preserving across -conversions. -@cindex BFD canonical format -@cindex internal object-file format - -@table @emph -@item files -Information stored on a per-file basis includes target machine -architecture, particular implementation format type, a demand pageable -bit, and a write protected bit. Information like Unix magic numbers is -not stored here---only the magic numbers' meaning, so a @code{ZMAGIC} -file would have both the demand pageable bit and the write protected -text bit set. The byte order of the target is stored on a per-file -basis, so that big- and little-endian object files may be used with one -another. - -@item sections -Each section in the input file contains the name of the section, the -section's original address in the object file, size and alignment -information, various flags, and pointers into other BFD data -structures. - -@item symbols -Each symbol contains a pointer to the information for the object file -which originally defined it, its name, its value, and various flag -bits. When a BFD back end reads in a symbol table, it relocates all -symbols to make them relative to the base of the section where they were -defined. Doing this ensures that each symbol points to its containing -section. Each symbol also has a varying amount of hidden private data -for the BFD back end. Since the symbol points to the original file, the -private data format for that symbol is accessible. @code{ld} can -operate on a collection of symbols of wildly different formats without -problems. - -Normal global and simple local symbols are maintained on output, so an -output file (no matter its format) will retain symbols pointing to -functions and to global, static, and common variables. Some symbol -information is not worth retaining; in @code{a.out}, type information is -stored in the symbol table as long symbol names. This information would -be useless to most COFF debuggers; the linker has command line switches -to allow users to throw it away. - -There is one word of type information within the symbol, so if the -format supports symbol type information within symbols (for example, COFF, -IEEE, Oasys) and the type is simple enough to fit within one word -(nearly everything but aggregates), the information will be preserved. - -@item relocation level -Each canonical BFD relocation record contains a pointer to the symbol to -relocate to, the offset of the data to relocate, the section the data -is in, and a pointer to a relocation type descriptor. Relocation is -performed by passing messages through the relocation type -descriptor and the symbol pointer. Therefore, relocations can be performed -on output data using a relocation method that is only available in one of the -input formats. For instance, Oasys provides a byte relocation format. -A relocation record requesting this relocation type would point -indirectly to a routine to perform this, so the relocation may be -performed on a byte being written to a 68k COFF file, even though 68k COFF -has no such relocation type. - -@item line numbers -Object formats can contain, for debugging purposes, some form of mapping -between symbols, source line numbers, and addresses in the output file. -These addresses have to be relocated along with the symbol information. -Each symbol with an associated list of line number records points to the -first record of the list. The head of a line number list consists of a -pointer to the symbol, which allows finding out the address of the -function whose line number is being described. The rest of the list is -made up of pairs: offsets into the section and line numbers. Any format -which can simply derive this information can pass it successfully -between formats (COFF, IEEE and Oasys). -@end table diff --git a/contrib/gdb/bfd/doc/chew.c b/contrib/gdb/bfd/doc/chew.c deleted file mode 100644 index 5c04404f7a646..0000000000000 --- a/contrib/gdb/bfd/doc/chew.c +++ /dev/null @@ -1,1551 +0,0 @@ -/* chew - Copyright (C) 1990-1991 Free Software Foundation, Inc. - Contributed by steve chamberlain @cygnus - -This file is part of BFD, the Binary File Descriptor library. - -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 2 of the License, 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ - -/* Yet another way of extracting documentation from source. - No, I haven't finished it yet, but I hope you people like it better - than the old way - - sac - - Basically, this is a sort of string forth, maybe we should call it - struth? - - You define new words thus: - : <newword> <oldwords> ; - -*/ - -/* Primitives provided by the program: - - Two stacks are provided, a string stack and an integer stack. - - Internal state variables: - internal_wanted - indicates whether `-i' was passed - internal_mode - user-settable - - Commands: - push_text - ! - pop top of integer stack for address, pop next for value; store - @ - treat value on integer stack as the address of an integer; push - that integer on the integer stack after popping the "address" - hello - print "hello\n" to stdout - stdout - put stdout marker on TOS - stderr - put stderr marker on TOS - print - print TOS-1 on TOS (eg: "hello\n" stdout print) - skip_past_newline - catstr - fn icatstr - copy_past_newline - append input, up to and including newline into TOS - dup - fn other_dup - drop - discard TOS - idrop - ditto - remchar - delete last character from TOS - get_stuff_in_command - do_fancy_stuff - translate <<foo>> to @code{foo} in TOS - bulletize - if "o" lines found, prepend @itemize @bullet to TOS - and @item to each "o" line; append @end itemize - courierize - put @example around . and | lines, translate {* *} { } - exit - fn chew_exit - swap - outputdots - strip out lines without leading dots - paramstuff - convert full declaration into "PARAMS" form if not already - maybecatstr - do catstr if internal_mode == internal_wanted, discard - value in any case - translatecomments - turn {* and *} into comment delimiters - kill_bogus_lines - get rid of extra newlines - indent - internalmode - pop from integer stack, set `internalmode' to that value - print_stack_level - print current stack depth to stderr - strip_trailing_newlines - go ahead, guess... - [quoted string] - push string onto string stack - [word starting with digit] - push atol(str) onto integer stack - - A command must be all upper-case, and alone on a line. - - Foo. */ - - -#include <ansidecl.h> -#include "sysdep.h" -#include <assert.h> -#include <stdio.h> -#include <ctype.h> - -#define DEF_SIZE 5000 -#define STACK 50 - -int internal_wanted; -int internal_mode; - -int warning; - -/* Here is a string type ... */ - -typedef struct buffer -{ - char *ptr; - unsigned long write_idx; - unsigned long size; -} string_type; - - -#ifdef __STDC__ -static void init_string_with_size (string_type *, unsigned int); -static void init_string (string_type *); -static int find (string_type *, char *); -static void write_buffer (string_type *, FILE *); -static void delete_string (string_type *); -static char *addr (string_type *, unsigned int); -static char at (string_type *, unsigned int); -static void catchar (string_type *, int); -static void overwrite_string (string_type *, string_type *); -static void catbuf (string_type *, char *, unsigned int); -static void cattext (string_type *, char *); -static void catstr (string_type *, string_type *); -static unsigned int skip_white_and_starts (string_type *, unsigned int); -#endif - - -static void DEFUN(init_string_with_size,(buffer, size), - string_type *buffer AND - unsigned int size ) -{ - buffer->write_idx = 0; - buffer->size = size; - buffer->ptr = malloc(size); -} - -static void DEFUN(init_string,(buffer), - string_type *buffer) -{ - init_string_with_size(buffer, DEF_SIZE); - -} - -static int DEFUN(find, (str, what), - string_type *str AND - char *what) -{ - unsigned int i; - char *p; - p = what; - for (i = 0; i < str->write_idx && *p; i++) - { - if (*p == str->ptr[i]) - p++; - else - p = what; - } - return (*p == 0); - -} - -static void DEFUN(write_buffer,(buffer, f), - string_type *buffer AND - FILE *f) -{ - fwrite(buffer->ptr, buffer->write_idx, 1, f); -} - - -static void DEFUN(delete_string,(buffer), - string_type *buffer) -{ - free(buffer->ptr); -} - - -static char *DEFUN(addr, (buffer, idx), - string_type *buffer AND - unsigned int idx) -{ - return buffer->ptr + idx; -} - -static char DEFUN(at,(buffer, pos), - string_type *buffer AND - unsigned int pos) -{ - if (pos >= buffer->write_idx) - return 0; - return buffer->ptr[pos]; -} - -static void DEFUN(catchar,(buffer, ch), - string_type *buffer AND - int ch) -{ - if (buffer->write_idx == buffer->size) - { - buffer->size *=2; - buffer->ptr = realloc(buffer->ptr, buffer->size); - } - - buffer->ptr[buffer->write_idx ++ ] = ch; -} - - -static void DEFUN(overwrite_string,(dst, src), - string_type *dst AND - string_type *src) -{ - free(dst->ptr); - dst->size = src->size; - dst->write_idx = src->write_idx; - dst->ptr = src->ptr; -} - -static void DEFUN(catbuf,(buffer, buf, len), - string_type *buffer AND - char *buf AND - unsigned int len) -{ - if (buffer->write_idx + len >= buffer->size) - { - while (buffer->write_idx + len >= buffer->size) - buffer->size *= 2; - buffer->ptr = realloc (buffer->ptr, buffer->size); - } - memcpy (buffer->ptr + buffer->write_idx, buf, len); - buffer->write_idx += len; -} - -static void DEFUN(cattext,(buffer, string), - string_type *buffer AND - char *string) -{ - catbuf (buffer, string, (unsigned int) strlen (string)); -} - -static void DEFUN(catstr,(dst, src), - string_type *dst AND - string_type *src) -{ - catbuf (dst, src->ptr, src->write_idx); -} - - -static unsigned int -DEFUN(skip_white_and_stars,(src, idx), - string_type *src AND - unsigned int idx) -{ - char c; - while ((c = at(src,idx)), - isspace (c) - || (c == '*' - /* Don't skip past end-of-comment or star as first - character on its line. */ - && at(src,idx +1) != '/' - && at(src,idx -1) != '\n')) - idx++; - return idx; -} - -/***********************************************************************/ - - -string_type stack[STACK]; -string_type *tos; - -unsigned int idx = 0; /* Pos in input buffer */ -string_type *ptr; /* and the buffer */ -typedef void (*stinst_type)(); -stinst_type *pc; -stinst_type sstack[STACK]; -stinst_type *ssp = &sstack[0]; -long istack[STACK]; -long *isp = &istack[0]; - -typedef int *word_type; - - - -struct dict_struct -{ - char *word; - struct dict_struct *next; - stinst_type *code; - int code_length; - int code_end; - int var; - -}; -typedef struct dict_struct dict_type; -#define WORD(x) static void x() - -static void -die (msg) - char *msg; -{ - fprintf (stderr, "%s\n", msg); - exit (1); -} - -static void -check_range () -{ - if (tos < stack) - die ("underflow in string stack"); - if (tos >= stack + STACK) - die ("overflow in string stack"); -} - -static void -icheck_range () -{ - if (isp < istack) - die ("underflow in integer stack"); - if (isp >= istack + STACK) - die ("overflow in integer stack"); -} - -#ifdef __STDC__ -static void exec (dict_type *); -static void call (void); -static void remchar (void), strip_trailing_newlines (void), push_number (void); -static void push_text (void); -static void remove_noncomments (string_type *, string_type *); -static void print_stack_level (void); -static void paramstuff (void), translatecomments (void), manglecomments (void); -static void outputdots (void), courierize (void), bulletize (void); -static void do_fancy_stuff (void); -static int iscommand (string_type *, unsigned int); -static int copy_past_newline (string_type *, unsigned int, string_type *); -static void icopy_past_newline (void), kill_bogus_lines (void), indent (void); -static void get_stuff_in_command (void), swap (void), other_dup (void); -static void drop (void), idrop (void); -static void icatstr (void), skip_past_newline (void), internalmode (void); -static void maybecatstr (void); -static char *nextword (char *, char **); -dict_type *lookup_word (char *); -static void perform (void); -dict_type *newentry (char *); -unsigned int add_to_definition (dict_type *, stinst_type); -void add_intrinsic (char *, void (*)()); -void add_var (char *); -void compile (char *); -static void bang (void); -static void atsign (void); -static void hello (void); -static void stdout_ (void); -static void stderr_ (void); -static void print (void); -static void read_in (string_type *, FILE *); -static void usage (void); -static void chew_exit (void); -#endif - -static void DEFUN(exec,(word), - dict_type *word) -{ - pc = word->code; - while (*pc) - (*pc)(); -} -WORD(call) -{ - stinst_type *oldpc = pc; - dict_type *e; - e = (dict_type *)(pc [1]); - exec(e); - pc = oldpc + 2; - -} - -WORD(remchar) -{ - if (tos->write_idx) - tos->write_idx--; - pc++; -} - -static void -strip_trailing_newlines () -{ - while ((isspace (at (tos, tos->write_idx - 1)) - || at (tos, tos->write_idx - 1) == '\n') - && tos->write_idx > 0) - tos->write_idx--; - pc++; -} - -WORD(push_number) -{ - isp++; - icheck_range (); - pc++; - *isp = (long)(*pc); - pc++; -} - -WORD(push_text) -{ - tos++; - check_range (); - init_string(tos); - pc++; - cattext(tos,*((char **)pc)); - pc++; - -} - - -/* This function removes everything not inside comments starting on - the first char of the line from the string, also when copying - comments, removes blank space and leading *'s. - Blank lines are turned into one blank line. */ - -static void -DEFUN(remove_noncomments,(src,dst), - string_type *src AND - string_type *dst) -{ - unsigned int idx = 0; - - while (at(src,idx)) - { - /* Now see if we have a comment at the start of the line */ - if (at(src,idx) == '\n' - && at(src,idx+1) == '/' - && at(src,idx+2) == '*') - { - idx+=3; - - idx = skip_white_and_stars(src,idx); - - /* Remove leading dot */ - if (at(src, idx) == '.') - idx++; - - /* Copy to the end of the line, or till the end of the - comment */ - while (at(src, idx)) - { - if (at(src, idx) == '\n') - { - /* end of line, echo and scrape of leading blanks */ - if (at(src,idx +1) == '\n') - catchar(dst,'\n'); - catchar(dst,'\n'); - idx++; - idx = skip_white_and_stars(src, idx); - } - else if (at(src, idx) == '*' && at(src,idx+1) == '/') - { - idx +=2 ; - cattext(dst,"\nENDDD\n"); - break; - } - else - { - catchar(dst, at(src, idx)); - idx++; - } - } - } - else idx++; - } -} - -static void -print_stack_level () -{ - fprintf (stderr, "current string stack depth = %d, ", tos - stack); - fprintf (stderr, "current integer stack depth = %d\n", isp - istack); - pc++; -} - -/* turn: - foobar name(stuff); - into: - foobar - name PARAMS ((stuff)); - and a blank line. - */ - -static void -DEFUN_VOID(paramstuff) -{ - unsigned int openp; - unsigned int fname; - unsigned int idx; - string_type out; - init_string(&out); - - - /* make sure that it's not already param'd or proto'd */ - if(find(tos,"PARAMS") || find(tos,"PROTO") || !find(tos,"(")) { - catstr(&out,tos); - } - else - { - /* Find the open paren */ - for (openp = 0; at(tos, openp) != '(' && at(tos,openp); openp++) - ; - - fname = openp; - /* Step back to the fname */ - fname--; - while (fname && isspace(at(tos, fname))) - fname --; - while (fname && !isspace(at(tos,fname)) && at(tos,fname) != '*') - fname--; - - fname++; - - for (idx = 0; idx < fname; idx++) /* Output type */ - { - catchar(&out, at(tos,idx)); - } - - cattext(&out, "\n"); /* Insert a newline between type and fnname */ - - for (idx = fname; idx < openp; idx++) /* Output fnname */ - { - catchar(&out, at(tos,idx)); - } - - cattext(&out," PARAMS ("); - - while (at(tos,idx) && at(tos,idx) !=';') - { - catchar(&out, at(tos, idx)); - idx++; - } - cattext(&out,");\n\n"); - } - overwrite_string(tos, &out); - pc++; - -} - - - -/* turn {* - and *} into comments */ - -WORD(translatecomments) -{ - unsigned int idx = 0; - string_type out; - init_string(&out); - - while (at(tos, idx)) - { - if (at(tos,idx) == '{' && at(tos,idx+1) =='*') - { - cattext(&out,"/*"); - idx+=2; - } - else if (at(tos,idx) == '*' && at(tos,idx+1) =='}') - { - cattext(&out,"*/"); - idx+=2; - } - else - { - catchar(&out, at(tos, idx)); - idx++; - } - } - - - overwrite_string(tos, &out); - - pc++; - -} - -/* turn everything not starting with a . into a comment */ - -WORD(manglecomments) -{ - unsigned int idx = 0; - string_type out; - init_string(&out); - - while (at(tos, idx)) - { - if (at(tos,idx) == '\n' && at(tos,idx+1) =='*') - { - cattext(&out," /*"); - idx+=2; - } - else if (at(tos,idx) == '*' && at(tos,idx+1) =='}') - { - cattext(&out,"*/"); - idx+=2; - } - else - { - catchar(&out, at(tos, idx)); - idx++; - } - } - - - overwrite_string(tos, &out); - - pc++; - -} - -/* Mod tos so that only lines with leading dots remain */ -static void -DEFUN_VOID(outputdots) -{ - unsigned int idx = 0; - string_type out; - init_string(&out); - - while (at(tos, idx)) - { - if (at(tos, idx) == '\n' && at(tos, idx+1) == '.') - { - char c, c2; - idx += 2; - - while ((c = at(tos, idx)) && c != '\n') - { - if (c == '{' && at(tos,idx+1) =='*') - { - cattext(&out," /*"); - idx+=2; - } - else if (c == '*' && at(tos,idx+1) =='}') - { - cattext(&out,"*/"); - idx+=2; - } - else - { - catchar(&out, c); - idx++; - } - } - catchar(&out,'\n'); - } - else - { - idx++; - } - } - - overwrite_string(tos, &out); - pc++; - -} - -/* Find lines starting with . and | and put example around them on tos */ -WORD(courierize) -{ - string_type out; - unsigned int idx = 0; - int command = 0; - - init_string(&out); - - while (at(tos, idx)) - { - if (at(tos, idx) == '\n' - && (at(tos, idx +1 ) == '.' - || at(tos,idx+1) == '|')) - { - cattext(&out,"\n@example\n"); - do - { - idx += 2; - - while (at(tos, idx) && at(tos, idx)!='\n') - { - if (at(tos,idx)=='{' && at(tos,idx+1) =='*') - { - cattext(&out," /*"); - idx+=2; - } - else if (at(tos,idx)=='*' && at(tos,idx+1) =='}') - { - cattext(&out,"*/"); - idx+=2; - } - else if (at(tos,idx) == '{' && !command) - { - cattext(&out,"@{"); - idx++; - } - else if (at(tos,idx) == '}' && !command) - { - cattext(&out,"@}"); - idx++; - } - else - { - if (at(tos,idx) == '@') - command = 1; - else if (isspace(at(tos,idx)) || at(tos,idx) == '}') - command = 0; - catchar(&out, at(tos, idx)); - idx++; - } - - } - catchar(&out,'\n'); - } - while (at(tos, idx) == '\n' - && (at(tos, idx+1) == '.') - || (at(tos,idx+1) == '|')); - cattext(&out,"@end example"); - } - else - { - catchar(&out, at(tos, idx)); - idx++; - } - } - - overwrite_string(tos, &out); - pc++; - - -} - -/* Finds any lines starting with "o ", if there are any, then turns - on @itemize @bullet, and @items each of them. Then ends with @end - itemize, inplace at TOS*/ - - -WORD(bulletize) -{ - unsigned int idx = 0; - int on = 0; - string_type out; - init_string(&out); - - while (at(tos, idx)) { - if (at(tos, idx) == '@' && - at(tos, idx+1) == '*') - { - cattext(&out,"*"); - idx+=2; - } - -else - if (at(tos, idx) == '\n' && - at(tos, idx+1) == 'o' && - isspace(at(tos, idx +2))) - { - if (!on) - { - cattext(&out,"\n@itemize @bullet\n"); - on = 1; - - } - cattext(&out,"\n@item\n"); - idx+=3; - } - else - { - catchar(&out, at(tos, idx)); - if (on && at(tos, idx) == '\n' && - at(tos, idx+1) == '\n' && - at(tos, idx+2) != 'o') - { - cattext(&out, "@end itemize"); - on = 0; - } - idx++; - - } - } - if (on) - { - cattext(&out,"@end itemize\n"); - } - - delete_string(tos); - *tos = out; - pc++; - -} - -/* Turn <<foo>> into @code{foo} in place at TOS*/ - - -WORD(do_fancy_stuff) -{ - unsigned int idx = 0; - string_type out; - init_string(&out); - while (at(tos, idx)) - { - if (at(tos, idx) == '<' - && at(tos, idx+1) == '<' - && !isspace(at(tos,idx + 2))) - { - /* This qualifies as a << startup */ - idx +=2; - cattext(&out,"@code{"); - while(at(tos,idx) && - at(tos,idx) != '>' ) - { - catchar(&out, at(tos, idx)); - idx++; - - } - cattext(&out,"}"); - idx+=2; - } - else - { - catchar(&out, at(tos, idx)); - idx++; - } - } - delete_string(tos); - *tos = out; - pc++; - -} -/* A command is all upper case,and alone on a line */ -static int -DEFUN( iscommand,(ptr, idx), - string_type *ptr AND - unsigned int idx) -{ - unsigned int len = 0; - while (at(ptr,idx)) { - if (isupper(at(ptr,idx)) || at(ptr,idx) == ' ' || - at(ptr,idx) == '_') - { - len++; - idx++; - } - else if(at(ptr,idx) == '\n') - { - if (len > 3) return 1; - return 0; - } - else return 0; - } - return 0; - -} - - -DEFUN(copy_past_newline,(ptr, idx, dst), - string_type *ptr AND - unsigned int idx AND - string_type *dst) -{ - while (at(ptr, idx) && at(ptr, idx) != '\n') - { - catchar(dst, at(ptr, idx)); - idx++; - - } - catchar(dst, at(ptr, idx)); - idx++; - return idx; - -} - -WORD(icopy_past_newline) -{ - tos++; - check_range (); - init_string(tos); - idx = copy_past_newline(ptr, idx, tos); - pc++; -} - -/* indent - Take the string at the top of the stack, do some prettying */ - - -WORD(kill_bogus_lines) -{ - int sl ; - - int nl = 0; - int idx = 0; - int c; - int dot = 0 ; - - string_type out; - init_string(&out); - /* Drop leading nl */ - while (at(tos,idx) == '\n') - { - idx++; - } - c = idx; - - /* Find the last char */ - while (at(tos,idx)) - { - idx++; - } - - /* find the last non white before the nl */ - idx--; - - while (idx && isspace(at(tos,idx))) - idx--; - idx++; - - /* Copy buffer upto last char, but blank lines before and after - dots don't count */ - sl = 1; - - while (c < idx) - { - if (at(tos,c) == '\n' - && at(tos,c+1) == '\n' - && at(tos,c+2) == '.') - { - /* Ignore two newlines before a dot*/ - c++; - } - else if (at(tos,c) == '.' && sl) - { - /* remember that this line started with a dot */ - dot=2; - } - else if (at(tos,c) == '\n' - && at(tos,c+1) == '\n' - && dot) - { - c++; - /* Ignore two newlines when last line was dot */ - } - - catchar(&out, at(tos,c)); - if (at(tos,c) == '\n') - { - sl = 1; - - if (dot == 2)dot=1;else dot = 0; - } - - c++; - - } - - /* Append nl*/ - catchar(&out, '\n'); - pc++; - delete_string(tos); - *tos = out; - - -} - -WORD(indent) -{ - string_type out; - int tab = 0; - int idx = 0; - int ol =0; - init_string(&out); - while (at(tos,idx)) { - switch (at(tos,idx)) - { - case '\n': - cattext(&out,"\n"); - idx++; - if (tab) - { - cattext(&out," "); - } - ol = 0; - break; - case '(': - tab++; - if (ol == 0) - cattext(&out," "); - idx++; - cattext(&out,"("); - ol = 1; - break; - case ')': - tab--; - cattext(&out,")"); - idx++; - ol=1; - - break; - default: - catchar(&out,at(tos,idx)); - ol=1; - - idx++; - break; - } - } - - pc++; - delete_string(tos); - *tos = out; - -} - - -WORD(get_stuff_in_command) -{ - tos++; - check_range (); - init_string(tos); - - while (at(ptr, idx)) { - if (iscommand(ptr, idx)) break; - idx = copy_past_newline(ptr, idx, tos); - } - pc++; -} - -WORD(swap) -{ - string_type t; - - t = tos[0]; - tos[0] = tos[-1]; - tos[-1] =t; - pc++; - -} - -WORD(other_dup) -{ - tos++; - check_range (); - init_string(tos); - catstr(tos, tos-1); - pc++; -} - -WORD(drop) -{ - tos--; - check_range (); - pc++; -} - -WORD(idrop) -{ - isp--; - icheck_range (); - pc++; -} - -WORD(icatstr) -{ - tos--; - check_range (); - catstr(tos, tos+1); - delete_string(tos+1); - pc++; -} - -WORD(skip_past_newline) -{ - while (at(ptr,idx) - && at(ptr,idx) != '\n') - idx++; - idx++; - pc++; -} - - -WORD(internalmode) -{ - internal_mode = *(isp); - isp--; - icheck_range (); - pc++; -} - -WORD(maybecatstr) -{ - if (internal_wanted == internal_mode) - { - catstr(tos-1, tos); - } - delete_string(tos); - tos--; - check_range (); - pc++; -} - -char * -DEFUN(nextword,(string, word), - char *string AND - char **word) -{ - char *word_start; - int idx; - char *dst; - char *src; - - int length = 0; - - while (isspace(*string) || *string == '-') { - if (*string == '-') - { - while (*string && *string != '\n') - string++; - - } - else { - string++; - } - } - if (!*string) return 0; - - word_start = string; - if (*string == '"') - { - do - { - string++; - length++; - if (*string == '\\') - { - string += 2; - length += 2; - } - } - while (*string != '"'); - } - else - { - while (!isspace(*string)) - { - string++; - length++; - - } - } - - *word = malloc(length + 1); - - dst = *word; - src = word_start; - - - for (idx= 0; idx < length; idx++) - { - if (src[idx] == '\\') - switch (src[idx+1]) - { - case 'n': - *dst++ = '\n'; - idx++; - break; - case '"': - case '\\': - *dst++ = src[idx+1]; - idx++; - break; - default: - *dst++ = '\\'; - break; - } - else - *dst++ = src[idx]; - } - *dst++ = 0; - - - - - - if(*string) - return string + 1; - else - return 0; - -} -dict_type *root; -dict_type * -DEFUN(lookup_word,(word), - char *word) -{ - dict_type *ptr = root; - while (ptr) { - if (strcmp(ptr->word, word) == 0) return ptr; - ptr = ptr->next; - - } - if (warning) - fprintf(stderr,"Can't find %s\n",word); - return 0; - - -} - -static void DEFUN_VOID(perform) -{ - tos = stack; - - while (at(ptr, idx)) { - /* It's worth looking through the command list */ - if (iscommand(ptr, idx)) - { - unsigned int i; - int found = 0; - - char *next; - dict_type *word ; - - (void) nextword(addr(ptr, idx), &next); - - - word = lookup_word(next); - - - - - if (word) - { - exec(word); - } - else - { - if (warning) - fprintf(stderr,"warning, %s is not recognised\n", next); - skip_past_newline(); - } - - } - else skip_past_newline(); - - } -} - -dict_type * -DEFUN(newentry,(word), - char *word) -{ - dict_type *new = (dict_type *)malloc(sizeof(dict_type)); - new->word = word; - new->next = root; - root = new; - new->code = (stinst_type *)malloc(sizeof(stinst_type )); - new->code_length = 1; - new->code_end = 0; - return new; - -} - - -unsigned int -DEFUN(add_to_definition,(entry, word), - dict_type *entry AND - stinst_type word) -{ - if (entry->code_end == entry->code_length) - { - entry->code_length += 2; - entry->code = - (stinst_type *) realloc((char *)(entry->code), - entry->code_length *sizeof(word_type)); - } - entry->code[entry->code_end] = word; - -return entry->code_end++; -} - - - - - - - -void -DEFUN(add_intrinsic,(name, func), - char *name AND - void (*func)()) -{ - dict_type *new = newentry(name); - add_to_definition(new, func); - add_to_definition(new, 0); -} - -void -DEFUN(add_var,(name), - char *name) -{ - dict_type *new = newentry(name); - add_to_definition(new, push_number); - add_to_definition(new, (stinst_type)(&(new->var))); - add_to_definition(new,0); -} - - -void -DEFUN(compile, (string), - char *string) -{ - int jstack[STACK]; - int *jptr = jstack; - /* add words to the dictionary */ - char *word; - string = nextword(string, &word); - while (string && *string && word[0]) - { - if (strcmp(word,"var")==0) - { - string=nextword(string, &word); - - add_var(word); - string=nextword(string, &word); - } -else - - if (word[0] == ':') - { - dict_type *ptr; - /* Compile a word and add to dictionary */ - string = nextword(string, &word); - - ptr = newentry(word); - string = nextword(string, &word); - while (word[0] != ';' ) - { - switch (word[0]) - { - case '"': - /* got a string, embed magic push string - function */ - add_to_definition(ptr, push_text); - add_to_definition(ptr, (stinst_type)(word+1)); - break; - case '0': - case '1': - case '2': - case '3': - case '4': - case '5': - case '6': - case '7': - case '8': - case '9': - /* Got a number, embedd the magic push number - function */ - add_to_definition(ptr, push_number); - add_to_definition(ptr, (stinst_type)atol(word)); - break; - default: - add_to_definition(ptr, call); - add_to_definition(ptr, (stinst_type)lookup_word(word)); - } - - string = nextword(string, &word); - } - add_to_definition(ptr,0); - string = nextword(string, &word); - } - else - { - fprintf(stderr,"syntax error at %s\n",string-1); - } - } - -} - - -static void DEFUN_VOID(bang) -{ - *(long *)((isp[0])) = isp[-1]; - isp-=2; - icheck_range (); - pc++; -} - -WORD(atsign) -{ - isp[0] = *(long *)(isp[0]); - pc++; -} - -WORD(hello) -{ - printf("hello\n"); - pc++; -} - -WORD(stdout_) -{ - isp++; - icheck_range (); - *isp = 1; - pc++; -} - -WORD(stderr_) -{ - isp++; - icheck_range (); - *isp = 2; - pc++; -} - -WORD(print) -{ - if (*isp == 1) - write_buffer (tos, stdout); - else if (*isp == 2) - write_buffer (tos, stderr); - else - fprintf (stderr, "print: illegal print destination `%d'\n", *isp); - isp--; - tos--; - icheck_range (); - check_range (); - pc++; -} - - -static void DEFUN(read_in, (str, file), - string_type *str AND - FILE *file) -{ - char buff[10000]; - unsigned int r; - do - { - r = fread(buff, 1, sizeof(buff), file); - catbuf(str, buff, r); - } - while (r); - buff[0] = 0; - - catbuf(str, buff,1); -} - - -static void DEFUN_VOID(usage) -{ - fprintf(stderr,"usage: -[d|i|g] <file >file\n"); - exit(33); -} - -/* There is no reliable way to declare exit. Sometimes it returns - int, and sometimes it returns void. Sometimes it changes between - OS releases. Trying to get it declared correctly in the hosts file - is a pointless waste of time. */ - -static void -chew_exit () -{ - exit (0); -} - -int DEFUN(main,(ac,av), -int ac AND -char *av[]) -{ - unsigned int i; - string_type buffer; - string_type pptr; - - init_string(&buffer); - init_string(&pptr); - init_string(stack+0); - tos=stack+1; - ptr = &pptr; - - add_intrinsic("push_text", push_text); - add_intrinsic("!", bang); - add_intrinsic("@", atsign); - add_intrinsic("hello",hello); - add_intrinsic("stdout",stdout_); - add_intrinsic("stderr",stderr_); - add_intrinsic("print",print); - add_intrinsic("skip_past_newline", skip_past_newline ); - add_intrinsic("catstr", icatstr ); - add_intrinsic("copy_past_newline", icopy_past_newline ); - add_intrinsic("dup", other_dup ); - add_intrinsic("drop", drop); - add_intrinsic("idrop", idrop); - add_intrinsic("remchar", remchar ); - add_intrinsic("get_stuff_in_command", get_stuff_in_command ); - add_intrinsic("do_fancy_stuff", do_fancy_stuff ); - add_intrinsic("bulletize", bulletize ); - add_intrinsic("courierize", courierize ); - /* If the following line gives an error, exit() is not declared in the - ../hosts/foo.h file for this host. Fix it there, not here! */ - /* No, don't fix it anywhere; see comment on chew_exit--Ian Taylor. */ - add_intrinsic("exit", chew_exit ); - add_intrinsic("swap", swap ); - add_intrinsic("outputdots", outputdots ); - add_intrinsic("paramstuff", paramstuff ); - add_intrinsic("maybecatstr", maybecatstr ); - add_intrinsic("translatecomments", translatecomments ); - add_intrinsic("kill_bogus_lines", kill_bogus_lines); - add_intrinsic("indent", indent); - add_intrinsic("internalmode", internalmode); - add_intrinsic("print_stack_level", print_stack_level); - add_intrinsic("strip_trailing_newlines", strip_trailing_newlines); - - /* Put a nl at the start */ - catchar(&buffer,'\n'); - - read_in(&buffer, stdin); - remove_noncomments(&buffer, ptr); - for (i= 1; i < ac; i++) - { - if (av[i][0] == '-') - { - if (av[i][1] == 'f') - { - string_type b; - FILE *f; - init_string(&b); - - f = fopen(av[i+1],"r"); - if (!f) - { - fprintf(stderr,"Can't open the input file %s\n",av[i+1]); - return 33; - } - - read_in(&b, f); - compile(b.ptr); - perform(); - } - else if (av[i][1] == 'i') - { - internal_wanted = 1; - } - else if (av[i][1] == 'w') - { - warning = 1; - } - } - } - write_buffer(stack+0, stdout); - if (tos != stack) - { - fprintf (stderr, "finishing with current stack level %d\n", tos - stack); - return 1; - } - return 0; -} diff --git a/contrib/gdb/bfd/doc/doc.str b/contrib/gdb/bfd/doc/doc.str deleted file mode 100644 index 93685996e0630..0000000000000 --- a/contrib/gdb/bfd/doc/doc.str +++ /dev/null @@ -1,158 +0,0 @@ -: DOCDD - skip_past_newline - get_stuff_in_command kill_bogus_lines catstr - ; - -: ENDDD - skip_past_newline - ; - -: EXAMPLE - skip_past_newline - get_stuff_in_command kill_bogus_lines do_fancy_stuff translatecomments - courierize catstr - - ; - -: INODE - "@node " catstr skip_past_newline copy_past_newline catstr - ; - -: CODE_FRAGMENT - EXAMPLE - ; - -: COMMENT - skip_past_newline - get_stuff_in_command - drop - ; - -: SYNOPSIS - skip_past_newline - "@strong{Synopsis}\n" catstr - "@example\n" catstr - get_stuff_in_command - kill_bogus_lines - indent - catstr - "@end example\n" catstr - - ; - -: func - "@findex " - a - skip_past_newline - copy_past_newline - dup - a x x - "@subsubsection @code{" - a x x b - swap - remchar - "}\n" - a x b x c - catstr catstr catstr catstr catstr - ; - -: FUNCTION - "@findex " - a - skip_past_newline - copy_past_newline - dup - a x x - "@subsubsection @code{" - a x x b - swap - remchar - "}\n" - a x b x c - catstr catstr catstr catstr catstr - ; - -: bodytext - get_stuff_in_command - bulletize - kill_bogus_lines - do_fancy_stuff - courierize - catstr - "@*\n" catstr - ; - -: asection - skip_past_newline - catstr - copy_past_newline - do_fancy_stuff catstr - bodytext - ; - -: SECTION - "@section " asection ; - -: SUBSECTION - "@subsection " asection ; - -: SUBSUBSECTION - "@subsubsection " asection ; - -: subhead - skip_past_newline - bodytext - ; - - - - -: DESCRIPTION - "@strong{Description}@*\n" catstr subhead ; - -: RETURNS - "@strong{Returns}@*\n" catstr subhead ; - -: INTERNAL_FUNCTION - func ; - - -: INTERNAL_DEFINITION - func ; - - -: INTERNAL - func ; - -: TYPEDEF - FUNCTION ; - -: SENUM - skip_past_newline - "Here are the possible values for @code{enum " - copy_past_newline remchar catstr - "}:\n\n" catstr catstr - ; -: ENUM - skip_past_newline - "@deffn {} " - copy_past_newline catstr catstr - ; -: ENUMX - skip_past_newline - "@deffnx {} " - copy_past_newline catstr - catstr - ; -: ENUMEQ - skip_past_newline - "@deffn {} " - copy_past_newline catstr catstr - skip_past_newline - ; -: ENUMEQX - skip_past_newline - "@deffnx {} " - copy_past_newline catstr - catstr - skip_past_newline - ; -: ENUMDOC - skip_past_newline - get_stuff_in_command - strip_trailing_newlines - catstr - "\n@end deffn\n" catstr - ; diff --git a/contrib/gdb/bfd/doc/proto.str b/contrib/gdb/bfd/doc/proto.str deleted file mode 100644 index 8431c16bd57f8..0000000000000 --- a/contrib/gdb/bfd/doc/proto.str +++ /dev/null @@ -1,135 +0,0 @@ - -: SYNOPSIS - skip_past_newline - get_stuff_in_command - paramstuff - indent - maybecatstr -; - -: ignore - skip_past_newline - get_stuff_in_command - outputdots - maybecatstr - ; - -: CODE_FRAGMENT - ignore ; - -: external - 0 internalmode ignore ; - -: internal - 1 internalmode ignore ; - -- input stack { a b } output b if internal, a if external -: ifinternal - "" swap 1 internalmode maybecatstr - swap - "" swap 0 internalmode maybecatstr - catstr - ; - -- Put note in output string, regardless of internal mode. -: COMMENT - skip_past_newline - get_stuff_in_command - translatecomments - catstr - ; - -- SENUM enum-type-name -- ENUM enum-name -- ENUMX addl-enum-name -- ENUMDOC doc for preceding enums -- ENDSENUM max-enum-name - -: make_enum_header - dup - "enum " swap catstr - " {\n" catstr - swap " _dummy_first_" swap catstr catstr - ",\n" catstr - ; -: make_string_table_header - dup - "#ifdef _BFD_MAKE_TABLE_" swap catstr swap - "\n\nstatic const char *const " swap catstr catstr - "_names[] = { \"@@uninitialized@@\",\n" catstr - ; -: SENUM - skip_past_newline - copy_past_newline - remchar - dup - make_enum_header - swap - make_string_table_header - ifinternal - catstr - get_stuff_in_command catstr - translatecomments ; -: ENDSENUM - skip_past_newline - copy_past_newline strip_trailing_newlines - dup - " " swap catstr " };\n" catstr swap - " \"@@overflow: " swap catstr "@@\",\n};\n#endif\n\n" catstr - ifinternal - catstr - ; -: make_enumerator - " " swap catstr - ",\n" catstr - ; -: make_enumerator_string - " \"" swap catstr - "\",\n" catstr - ; -: ENUM - skip_past_newline - copy_past_newline - remchar - dup - make_enumerator - swap - make_enumerator_string - ifinternal - ; -: ENUMX ENUM catstr ; -: ENUMEQ - skip_past_newline - "#define " - copy_past_newline remchar - catstr - " " - catstr - copy_past_newline - catstr - "" swap 0 internalmode maybecatstr - ; -: ENUMEQX ENUMEQ catstr ; -: ENUMDOC - skip_past_newline - get_stuff_in_command - strip_trailing_newlines - "\n{* " swap catstr " *}\n" catstr - translatecomments - - discard it if we're doing internal mode - "" swap 0 internalmode maybecatstr - swap - catstr catstr - ; -: ENDDD external ; -: SECTION ignore ; -: SUBSECTION ignore ; -: SUBSUBSECTION ignore ; -: INTERNAL_DEFINITION internal ; -: DESCRIPTION ignore ; -: FUNCTION external ; -: RETURNS ignore ; -: TYPEDEF external ; -: INTERNAL_FUNCTION internal ; -: INTERNAL internal ; -: INODE ignore ; diff --git a/contrib/gdb/bfd/ecoff.c b/contrib/gdb/bfd/ecoff.c deleted file mode 100644 index e219ff77a230b..0000000000000 --- a/contrib/gdb/bfd/ecoff.c +++ /dev/null @@ -1,4740 +0,0 @@ -/* Generic ECOFF (Extended-COFF) routines. - Copyright 1990, 91, 92, 93, 94, 95, 1996 Free Software Foundation, Inc. - Original version by Per Bothner. - Full support added by Ian Lance Taylor, ian@cygnus.com. - -This file is part of BFD, the Binary File Descriptor library. - -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 2 of the License, 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ - -#include "bfd.h" -#include "sysdep.h" -#include "bfdlink.h" -#include "libbfd.h" -#include "aout/ar.h" -#include "aout/ranlib.h" -#include "aout/stab_gnu.h" - -/* FIXME: We need the definitions of N_SET[ADTB], but aout64.h defines - some other stuff which we don't want and which conflicts with stuff - we do want. */ -#include "libaout.h" -#include "aout/aout64.h" -#undef N_ABS -#undef exec_hdr -#undef obj_sym_filepos - -#include "coff/internal.h" -#include "coff/sym.h" -#include "coff/symconst.h" -#include "coff/ecoff.h" -#include "libcoff.h" -#include "libecoff.h" - -/* Prototypes for static functions. */ - -static int ecoff_get_magic PARAMS ((bfd *abfd)); -static long ecoff_sec_to_styp_flags PARAMS ((const char *name, - flagword flags)); -static boolean ecoff_slurp_symbolic_header PARAMS ((bfd *abfd)); -static boolean ecoff_set_symbol_info PARAMS ((bfd *abfd, SYMR *ecoff_sym, - asymbol *asym, int ext, int weak)); -static void ecoff_emit_aggregate PARAMS ((bfd *abfd, FDR *fdr, - char *string, - RNDXR *rndx, long isym, - const char *which)); -static char *ecoff_type_to_string PARAMS ((bfd *abfd, FDR *fdr, - unsigned int indx)); -static boolean ecoff_slurp_reloc_table PARAMS ((bfd *abfd, asection *section, - asymbol **symbols)); -static int ecoff_sort_hdrs PARAMS ((const PTR, const PTR)); -static boolean ecoff_compute_section_file_positions PARAMS ((bfd *abfd)); -static bfd_size_type ecoff_compute_reloc_file_positions PARAMS ((bfd *abfd)); -static boolean ecoff_get_extr PARAMS ((asymbol *, EXTR *)); -static void ecoff_set_index PARAMS ((asymbol *, bfd_size_type)); -static unsigned int ecoff_armap_hash PARAMS ((CONST char *s, - unsigned int *rehash, - unsigned int size, - unsigned int hlog)); - -/* This stuff is somewhat copied from coffcode.h. */ - -static asection bfd_debug_section = { "*DEBUG*" }; - -/* Create an ECOFF object. */ - -boolean -_bfd_ecoff_mkobject (abfd) - bfd *abfd; -{ - abfd->tdata.ecoff_obj_data = ((struct ecoff_tdata *) - bfd_zalloc (abfd, sizeof (ecoff_data_type))); - if (abfd->tdata.ecoff_obj_data == NULL) - return false; - - return true; -} - -/* This is a hook called by coff_real_object_p to create any backend - specific information. */ - -PTR -_bfd_ecoff_mkobject_hook (abfd, filehdr, aouthdr) - bfd *abfd; - PTR filehdr; - PTR aouthdr; -{ - struct internal_filehdr *internal_f = (struct internal_filehdr *) filehdr; - struct internal_aouthdr *internal_a = (struct internal_aouthdr *) aouthdr; - ecoff_data_type *ecoff; - - if (_bfd_ecoff_mkobject (abfd) == false) - return NULL; - - ecoff = ecoff_data (abfd); - ecoff->gp_size = 8; - ecoff->sym_filepos = internal_f->f_symptr; - - if (internal_a != (struct internal_aouthdr *) NULL) - { - int i; - - ecoff->text_start = internal_a->text_start; - ecoff->text_end = internal_a->text_start + internal_a->tsize; - ecoff->gp = internal_a->gp_value; - ecoff->gprmask = internal_a->gprmask; - for (i = 0; i < 4; i++) - ecoff->cprmask[i] = internal_a->cprmask[i]; - ecoff->fprmask = internal_a->fprmask; - if (internal_a->magic == ECOFF_AOUT_ZMAGIC) - abfd->flags |= D_PAGED; - else - abfd->flags &=~ D_PAGED; - } - - /* It turns out that no special action is required by the MIPS or - Alpha ECOFF backends. They have different information in the - a.out header, but we just copy it all (e.g., gprmask, cprmask and - fprmask) and let the swapping routines ensure that only relevant - information is written out. */ - - return (PTR) ecoff; -} - -/* Initialize a new section. */ - -boolean -_bfd_ecoff_new_section_hook (abfd, section) - bfd *abfd; - asection *section; -{ - /* For the .pdata section, which has a special meaning on the Alpha, - we set the alignment power to 3. We correct this later in - ecoff_compute_section_file_positions. We do this hackery because - we need to know the exact unaligned size of the .pdata section in - order to set the lnnoptr field correctly. For every other - section we use an alignment power of 4; this could be made target - dependent by adding a field to ecoff_backend_data, but 4 appears - to be correct for both the MIPS and the Alpha. */ - if (strcmp (section->name, _PDATA) == 0) - section->alignment_power = 3; - else - section->alignment_power = 4; - - if (strcmp (section->name, _TEXT) == 0) - section->flags |= SEC_CODE | SEC_LOAD | SEC_ALLOC; - else if (strcmp (section->name, _DATA) == 0 - || strcmp (section->name, _SDATA) == 0) - section->flags |= SEC_DATA | SEC_LOAD | SEC_ALLOC; - else if (strcmp (section->name, _RDATA) == 0 - || strcmp (section->name, _LIT8) == 0 - || strcmp (section->name, _LIT4) == 0 - || strcmp (section->name, _RCONST) == 0) - section->flags |= SEC_DATA | SEC_LOAD | SEC_ALLOC | SEC_READONLY; - else if (strcmp (section->name, _BSS) == 0 - || strcmp (section->name, _SBSS) == 0) - section->flags |= SEC_ALLOC; - else if (strcmp (section->name, _LIB) == 0) - { - /* An Irix 4 shared libary. */ - section->flags |= SEC_COFF_SHARED_LIBRARY; - } - - /* Probably any other section name is SEC_NEVER_LOAD, but I'm - uncertain about .init on some systems and I don't know how shared - libraries work. */ - - return true; -} - -/* Determine the machine architecture and type. This is called from - the generic COFF routines. It is the inverse of ecoff_get_magic, - below. This could be an ECOFF backend routine, with one version - for each target, but there aren't all that many ECOFF targets. */ - -boolean -_bfd_ecoff_set_arch_mach_hook (abfd, filehdr) - bfd *abfd; - PTR filehdr; -{ - struct internal_filehdr *internal_f = (struct internal_filehdr *) filehdr; - enum bfd_architecture arch; - unsigned long mach; - - switch (internal_f->f_magic) - { - case MIPS_MAGIC_1: - case MIPS_MAGIC_LITTLE: - case MIPS_MAGIC_BIG: - arch = bfd_arch_mips; - mach = 3000; - break; - - case MIPS_MAGIC_LITTLE2: - case MIPS_MAGIC_BIG2: - /* MIPS ISA level 2: the r6000 */ - arch = bfd_arch_mips; - mach = 6000; - break; - - case MIPS_MAGIC_LITTLE3: - case MIPS_MAGIC_BIG3: - /* MIPS ISA level 3: the r4000 */ - arch = bfd_arch_mips; - mach = 4000; - break; - - case ALPHA_MAGIC: - arch = bfd_arch_alpha; - mach = 0; - break; - - default: - arch = bfd_arch_obscure; - mach = 0; - break; - } - - return bfd_default_set_arch_mach (abfd, arch, mach); -} - -/* Get the magic number to use based on the architecture and machine. - This is the inverse of _bfd_ecoff_set_arch_mach_hook, above. */ - -static int -ecoff_get_magic (abfd) - bfd *abfd; -{ - int big, little; - - switch (bfd_get_arch (abfd)) - { - case bfd_arch_mips: - switch (bfd_get_mach (abfd)) - { - default: - case 0: - case 3000: - big = MIPS_MAGIC_BIG; - little = MIPS_MAGIC_LITTLE; - break; - - case 6000: - big = MIPS_MAGIC_BIG2; - little = MIPS_MAGIC_LITTLE2; - break; - - case 4000: - big = MIPS_MAGIC_BIG3; - little = MIPS_MAGIC_LITTLE3; - break; - } - - return bfd_big_endian (abfd) ? big : little; - - case bfd_arch_alpha: - return ALPHA_MAGIC; - - default: - abort (); - return 0; - } -} - -/* Get the section s_flags to use for a section. */ - -static long -ecoff_sec_to_styp_flags (name, flags) - const char *name; - flagword flags; -{ - long styp; - - styp = 0; - - if (strcmp (name, _TEXT) == 0) - styp = STYP_TEXT; - else if (strcmp (name, _DATA) == 0) - styp = STYP_DATA; - else if (strcmp (name, _SDATA) == 0) - styp = STYP_SDATA; - else if (strcmp (name, _RDATA) == 0) - styp = STYP_RDATA; - else if (strcmp (name, _LITA) == 0) - styp = STYP_LITA; - else if (strcmp (name, _LIT8) == 0) - styp = STYP_LIT8; - else if (strcmp (name, _LIT4) == 0) - styp = STYP_LIT4; - else if (strcmp (name, _BSS) == 0) - styp = STYP_BSS; - else if (strcmp (name, _SBSS) == 0) - styp = STYP_SBSS; - else if (strcmp (name, _INIT) == 0) - styp = STYP_ECOFF_INIT; - else if (strcmp (name, _FINI) == 0) - styp = STYP_ECOFF_FINI; - else if (strcmp (name, _PDATA) == 0) - styp = STYP_PDATA; - else if (strcmp (name, _XDATA) == 0) - styp = STYP_XDATA; - else if (strcmp (name, _LIB) == 0) - styp = STYP_ECOFF_LIB; - else if (strcmp (name, _GOT) == 0) - styp = STYP_GOT; - else if (strcmp (name, _HASH) == 0) - styp = STYP_HASH; - else if (strcmp (name, _DYNAMIC) == 0) - styp = STYP_DYNAMIC; - else if (strcmp (name, _LIBLIST) == 0) - styp = STYP_LIBLIST; - else if (strcmp (name, _RELDYN) == 0) - styp = STYP_RELDYN; - else if (strcmp (name, _CONFLIC) == 0) - styp = STYP_CONFLIC; - else if (strcmp (name, _DYNSTR) == 0) - styp = STYP_DYNSTR; - else if (strcmp (name, _DYNSYM) == 0) - styp = STYP_DYNSYM; - else if (strcmp (name, _COMMENT) == 0) - { - styp = STYP_COMMENT; - flags &=~ SEC_NEVER_LOAD; - } - else if (strcmp (name, _RCONST) == 0) - styp = STYP_RCONST; - else if (flags & SEC_CODE) - styp = STYP_TEXT; - else if (flags & SEC_DATA) - styp = STYP_DATA; - else if (flags & SEC_READONLY) - styp = STYP_RDATA; - else if (flags & SEC_LOAD) - styp = STYP_REG; - else - styp = STYP_BSS; - - if (flags & SEC_NEVER_LOAD) - styp |= STYP_NOLOAD; - - return styp; -} - -/* Get the BFD flags to use for a section. */ - -/*ARGSUSED*/ -flagword -_bfd_ecoff_styp_to_sec_flags (abfd, hdr, name) - bfd *abfd; - PTR hdr; - const char *name; -{ - struct internal_scnhdr *internal_s = (struct internal_scnhdr *) hdr; - long styp_flags = internal_s->s_flags; - flagword sec_flags=0; - - if (styp_flags & STYP_NOLOAD) - sec_flags |= SEC_NEVER_LOAD; - - /* For 386 COFF, at least, an unloadable text or data section is - actually a shared library section. */ - if ((styp_flags & STYP_TEXT) - || (styp_flags & STYP_ECOFF_INIT) - || (styp_flags & STYP_ECOFF_FINI) - || (styp_flags & STYP_DYNAMIC) - || (styp_flags & STYP_LIBLIST) - || (styp_flags & STYP_RELDYN) - || styp_flags == STYP_CONFLIC - || (styp_flags & STYP_DYNSTR) - || (styp_flags & STYP_DYNSYM) - || (styp_flags & STYP_HASH)) - { - if (sec_flags & SEC_NEVER_LOAD) - sec_flags |= SEC_CODE | SEC_COFF_SHARED_LIBRARY; - else - sec_flags |= SEC_CODE | SEC_LOAD | SEC_ALLOC; - } - else if ((styp_flags & STYP_DATA) - || (styp_flags & STYP_RDATA) - || (styp_flags & STYP_SDATA) - || styp_flags == STYP_PDATA - || styp_flags == STYP_XDATA - || (styp_flags & STYP_GOT) - || styp_flags == STYP_RCONST) - { - if (sec_flags & SEC_NEVER_LOAD) - sec_flags |= SEC_DATA | SEC_COFF_SHARED_LIBRARY; - else - sec_flags |= SEC_DATA | SEC_LOAD | SEC_ALLOC; - if ((styp_flags & STYP_RDATA) - || styp_flags == STYP_PDATA - || styp_flags == STYP_RCONST) - sec_flags |= SEC_READONLY; - } - else if ((styp_flags & STYP_BSS) - || (styp_flags & STYP_SBSS)) - { - sec_flags |= SEC_ALLOC; - } - else if ((styp_flags & STYP_INFO) || styp_flags == STYP_COMMENT) - { - sec_flags |= SEC_NEVER_LOAD; - } - else if ((styp_flags & STYP_LITA) - || (styp_flags & STYP_LIT8) - || (styp_flags & STYP_LIT4)) - { - sec_flags |= SEC_DATA | SEC_LOAD | SEC_ALLOC | SEC_READONLY; - } - else if (styp_flags & STYP_ECOFF_LIB) - { - sec_flags |= SEC_COFF_SHARED_LIBRARY; - } - else - { - sec_flags |= SEC_ALLOC | SEC_LOAD; - } - - return sec_flags; -} - -/* Read in the symbolic header for an ECOFF object file. */ - -static boolean -ecoff_slurp_symbolic_header (abfd) - bfd *abfd; -{ - const struct ecoff_backend_data * const backend = ecoff_backend (abfd); - bfd_size_type external_hdr_size; - PTR raw = NULL; - HDRR *internal_symhdr; - - /* See if we've already read it in. */ - if (ecoff_data (abfd)->debug_info.symbolic_header.magic == - backend->debug_swap.sym_magic) - return true; - - /* See whether there is a symbolic header. */ - if (ecoff_data (abfd)->sym_filepos == 0) - { - bfd_get_symcount (abfd) = 0; - return true; - } - - /* At this point bfd_get_symcount (abfd) holds the number of symbols - as read from the file header, but on ECOFF this is always the - size of the symbolic information header. It would be cleaner to - handle this when we first read the file in coffgen.c. */ - external_hdr_size = backend->debug_swap.external_hdr_size; - if (bfd_get_symcount (abfd) != external_hdr_size) - { - bfd_set_error (bfd_error_bad_value); - return false; - } - - /* Read the symbolic information header. */ - raw = (PTR) bfd_malloc ((size_t) external_hdr_size); - if (raw == NULL) - goto error_return; - - if (bfd_seek (abfd, ecoff_data (abfd)->sym_filepos, SEEK_SET) == -1 - || (bfd_read (raw, external_hdr_size, 1, abfd) - != external_hdr_size)) - goto error_return; - internal_symhdr = &ecoff_data (abfd)->debug_info.symbolic_header; - (*backend->debug_swap.swap_hdr_in) (abfd, raw, internal_symhdr); - - if (internal_symhdr->magic != backend->debug_swap.sym_magic) - { - bfd_set_error (bfd_error_bad_value); - goto error_return; - } - - /* Now we can get the correct number of symbols. */ - bfd_get_symcount (abfd) = (internal_symhdr->isymMax - + internal_symhdr->iextMax); - - if (raw != NULL) - free (raw); - return true; - error_return: - if (raw != NULL) - free (raw); - return false; -} - -/* Read in and swap the important symbolic information for an ECOFF - object file. This is called by gdb via the read_debug_info entry - point in the backend structure. */ - -/*ARGSUSED*/ -boolean -_bfd_ecoff_slurp_symbolic_info (abfd, ignore, debug) - bfd *abfd; - asection *ignore; - struct ecoff_debug_info *debug; -{ - const struct ecoff_backend_data * const backend = ecoff_backend (abfd); - HDRR *internal_symhdr; - bfd_size_type raw_base; - bfd_size_type raw_size; - PTR raw; - bfd_size_type external_fdr_size; - char *fraw_src; - char *fraw_end; - struct fdr *fdr_ptr; - bfd_size_type raw_end; - bfd_size_type cb_end; - - BFD_ASSERT (debug == &ecoff_data (abfd)->debug_info); - - /* Check whether we've already gotten it, and whether there's any to - get. */ - if (ecoff_data (abfd)->raw_syments != (PTR) NULL) - return true; - if (ecoff_data (abfd)->sym_filepos == 0) - { - bfd_get_symcount (abfd) = 0; - return true; - } - - if (! ecoff_slurp_symbolic_header (abfd)) - return false; - - internal_symhdr = &debug->symbolic_header; - - /* Read all the symbolic information at once. */ - raw_base = (ecoff_data (abfd)->sym_filepos - + backend->debug_swap.external_hdr_size); - - /* Alpha ecoff makes the determination of raw_size difficult. It has - an undocumented debug data section between the symhdr and the first - documented section. And the ordering of the sections varies between - statically and dynamically linked executables. - If bfd supports SEEK_END someday, this code could be simplified. */ - - raw_end = 0; - -#define UPDATE_RAW_END(start, count, size) \ - cb_end = internal_symhdr->start + internal_symhdr->count * (size); \ - if (cb_end > raw_end) \ - raw_end = cb_end - - UPDATE_RAW_END (cbLineOffset, cbLine, sizeof (unsigned char)); - UPDATE_RAW_END (cbDnOffset, idnMax, backend->debug_swap.external_dnr_size); - UPDATE_RAW_END (cbPdOffset, ipdMax, backend->debug_swap.external_pdr_size); - UPDATE_RAW_END (cbSymOffset, isymMax, backend->debug_swap.external_sym_size); - UPDATE_RAW_END (cbOptOffset, ioptMax, backend->debug_swap.external_opt_size); - UPDATE_RAW_END (cbAuxOffset, iauxMax, sizeof (union aux_ext)); - UPDATE_RAW_END (cbSsOffset, issMax, sizeof (char)); - UPDATE_RAW_END (cbSsExtOffset, issExtMax, sizeof (char)); - UPDATE_RAW_END (cbFdOffset, ifdMax, backend->debug_swap.external_fdr_size); - UPDATE_RAW_END (cbRfdOffset, crfd, backend->debug_swap.external_rfd_size); - UPDATE_RAW_END (cbExtOffset, iextMax, backend->debug_swap.external_ext_size); - -#undef UPDATE_RAW_END - - raw_size = raw_end - raw_base; - if (raw_size == 0) - { - ecoff_data (abfd)->sym_filepos = 0; - return true; - } - raw = (PTR) bfd_alloc (abfd, raw_size); - if (raw == NULL) - return false; - if (bfd_seek (abfd, - (ecoff_data (abfd)->sym_filepos - + backend->debug_swap.external_hdr_size), - SEEK_SET) != 0 - || bfd_read (raw, raw_size, 1, abfd) != raw_size) - { - bfd_release (abfd, raw); - return false; - } - - ecoff_data (abfd)->raw_syments = raw; - - /* Get pointers for the numeric offsets in the HDRR structure. */ -#define FIX(off1, off2, type) \ - if (internal_symhdr->off1 == 0) \ - debug->off2 = (type) NULL; \ - else \ - debug->off2 = (type) ((char *) raw \ - + (internal_symhdr->off1 \ - - raw_base)) - FIX (cbLineOffset, line, unsigned char *); - FIX (cbDnOffset, external_dnr, PTR); - FIX (cbPdOffset, external_pdr, PTR); - FIX (cbSymOffset, external_sym, PTR); - FIX (cbOptOffset, external_opt, PTR); - FIX (cbAuxOffset, external_aux, union aux_ext *); - FIX (cbSsOffset, ss, char *); - FIX (cbSsExtOffset, ssext, char *); - FIX (cbFdOffset, external_fdr, PTR); - FIX (cbRfdOffset, external_rfd, PTR); - FIX (cbExtOffset, external_ext, PTR); -#undef FIX - - /* I don't want to always swap all the data, because it will just - waste time and most programs will never look at it. The only - time the linker needs most of the debugging information swapped - is when linking big-endian and little-endian MIPS object files - together, which is not a common occurrence. - - We need to look at the fdr to deal with a lot of information in - the symbols, so we swap them here. */ - debug->fdr = (struct fdr *) bfd_alloc (abfd, - (internal_symhdr->ifdMax * - sizeof (struct fdr))); - if (debug->fdr == NULL) - return false; - external_fdr_size = backend->debug_swap.external_fdr_size; - fdr_ptr = debug->fdr; - fraw_src = (char *) debug->external_fdr; - fraw_end = fraw_src + internal_symhdr->ifdMax * external_fdr_size; - for (; fraw_src < fraw_end; fraw_src += external_fdr_size, fdr_ptr++) - (*backend->debug_swap.swap_fdr_in) (abfd, (PTR) fraw_src, fdr_ptr); - - return true; -} - -/* ECOFF symbol table routines. The ECOFF symbol table is described - in gcc/mips-tfile.c. */ - -/* ECOFF uses two common sections. One is the usual one, and the - other is for small objects. All the small objects are kept - together, and then referenced via the gp pointer, which yields - faster assembler code. This is what we use for the small common - section. */ -static asection ecoff_scom_section; -static asymbol ecoff_scom_symbol; -static asymbol *ecoff_scom_symbol_ptr; - -/* Create an empty symbol. */ - -asymbol * -_bfd_ecoff_make_empty_symbol (abfd) - bfd *abfd; -{ - ecoff_symbol_type *new; - - new = (ecoff_symbol_type *) bfd_alloc (abfd, sizeof (ecoff_symbol_type)); - if (new == (ecoff_symbol_type *) NULL) - return (asymbol *) NULL; - memset ((PTR) new, 0, sizeof *new); - new->symbol.section = (asection *) NULL; - new->fdr = (FDR *) NULL; - new->local = false; - new->native = NULL; - new->symbol.the_bfd = abfd; - return &new->symbol; -} - -/* Set the BFD flags and section for an ECOFF symbol. */ - -static boolean -ecoff_set_symbol_info (abfd, ecoff_sym, asym, ext, weak) - bfd *abfd; - SYMR *ecoff_sym; - asymbol *asym; - int ext; - int weak; -{ - asym->the_bfd = abfd; - asym->value = ecoff_sym->value; - asym->section = &bfd_debug_section; - asym->udata.i = 0; - - /* Most symbol types are just for debugging. */ - switch (ecoff_sym->st) - { - case stGlobal: - case stStatic: - case stLabel: - case stProc: - case stStaticProc: - break; - case stNil: - if (ECOFF_IS_STAB (ecoff_sym)) - { - asym->flags = BSF_DEBUGGING; - return true; - } - break; - default: - asym->flags = BSF_DEBUGGING; - return true; - } - - if (weak) - asym->flags = BSF_EXPORT | BSF_WEAK; - else if (ext) - asym->flags = BSF_EXPORT | BSF_GLOBAL; - else - { - asym->flags = BSF_LOCAL; - /* Normally, a local stProc symbol will have a corresponding - external symbol. We mark the local symbol as a debugging - symbol, in order to prevent nm from printing both out. - Similarly, we mark stLabel and stabs symbols as debugging - symbols. In both cases, we do want to set the value - correctly based on the symbol class. */ - if (ecoff_sym->st == stProc - || ecoff_sym->st == stLabel - || ECOFF_IS_STAB (ecoff_sym)) - asym->flags |= BSF_DEBUGGING; - } - switch (ecoff_sym->sc) - { - case scNil: - /* Used for compiler generated labels. Leave them in the - debugging section, and mark them as local. If BSF_DEBUGGING - is set, then nm does not display them for some reason. If no - flags are set then the linker whines about them. */ - asym->flags = BSF_LOCAL; - break; - case scText: - asym->section = bfd_make_section_old_way (abfd, ".text"); - asym->value -= asym->section->vma; - break; - case scData: - asym->section = bfd_make_section_old_way (abfd, ".data"); - asym->value -= asym->section->vma; - break; - case scBss: - asym->section = bfd_make_section_old_way (abfd, ".bss"); - asym->value -= asym->section->vma; - break; - case scRegister: - asym->flags = BSF_DEBUGGING; - break; - case scAbs: - asym->section = bfd_abs_section_ptr; - break; - case scUndefined: - asym->section = bfd_und_section_ptr; - asym->flags = 0; - asym->value = 0; - break; - case scCdbLocal: - case scBits: - case scCdbSystem: - case scRegImage: - case scInfo: - case scUserStruct: - asym->flags = BSF_DEBUGGING; - break; - case scSData: - asym->section = bfd_make_section_old_way (abfd, ".sdata"); - asym->value -= asym->section->vma; - break; - case scSBss: - asym->section = bfd_make_section_old_way (abfd, ".sbss"); - asym->value -= asym->section->vma; - break; - case scRData: - asym->section = bfd_make_section_old_way (abfd, ".rdata"); - asym->value -= asym->section->vma; - break; - case scVar: - asym->flags = BSF_DEBUGGING; - break; - case scCommon: - if (asym->value > ecoff_data (abfd)->gp_size) - { - asym->section = bfd_com_section_ptr; - asym->flags = 0; - break; - } - /* Fall through. */ - case scSCommon: - if (ecoff_scom_section.name == NULL) - { - /* Initialize the small common section. */ - ecoff_scom_section.name = SCOMMON; - ecoff_scom_section.flags = SEC_IS_COMMON; - ecoff_scom_section.output_section = &ecoff_scom_section; - ecoff_scom_section.symbol = &ecoff_scom_symbol; - ecoff_scom_section.symbol_ptr_ptr = &ecoff_scom_symbol_ptr; - ecoff_scom_symbol.name = SCOMMON; - ecoff_scom_symbol.flags = BSF_SECTION_SYM; - ecoff_scom_symbol.section = &ecoff_scom_section; - ecoff_scom_symbol_ptr = &ecoff_scom_symbol; - } - asym->section = &ecoff_scom_section; - asym->flags = 0; - break; - case scVarRegister: - case scVariant: - asym->flags = BSF_DEBUGGING; - break; - case scSUndefined: - asym->section = bfd_und_section_ptr; - asym->flags = 0; - asym->value = 0; - break; - case scInit: - asym->section = bfd_make_section_old_way (abfd, ".init"); - asym->value -= asym->section->vma; - break; - case scBasedVar: - case scXData: - case scPData: - asym->flags = BSF_DEBUGGING; - break; - case scFini: - asym->section = bfd_make_section_old_way (abfd, ".fini"); - asym->value -= asym->section->vma; - break; - case scRConst: - asym->section = bfd_make_section_old_way (abfd, ".rconst"); - asym->value -= asym->section->vma; - break; - default: - break; - } - - /* Look for special constructors symbols and make relocation entries - in a special construction section. These are produced by the - -fgnu-linker argument to g++. */ - if (ECOFF_IS_STAB (ecoff_sym)) - { - switch (ECOFF_UNMARK_STAB (ecoff_sym->index)) - { - default: - break; - - case N_SETA: - case N_SETT: - case N_SETD: - case N_SETB: - { - const char *name; - asection *section; - arelent_chain *reloc_chain; - unsigned int bitsize; - - /* Get a section with the same name as the symbol (usually - __CTOR_LIST__ or __DTOR_LIST__). FIXME: gcc uses the - name ___CTOR_LIST (three underscores). We need - __CTOR_LIST (two underscores), since ECOFF doesn't use - a leading underscore. This should be handled by gcc, - but instead we do it here. Actually, this should all - be done differently anyhow. */ - name = bfd_asymbol_name (asym); - if (name[0] == '_' && name[1] == '_' && name[2] == '_') - { - ++name; - asym->name = name; - } - section = bfd_get_section_by_name (abfd, name); - if (section == (asection *) NULL) - { - char *copy; - - copy = (char *) bfd_alloc (abfd, strlen (name) + 1); - if (!copy) - return false; - strcpy (copy, name); - section = bfd_make_section (abfd, copy); - } - - /* Build a reloc pointing to this constructor. */ - reloc_chain = - (arelent_chain *) bfd_alloc (abfd, sizeof (arelent_chain)); - if (!reloc_chain) - return false; - reloc_chain->relent.sym_ptr_ptr = - bfd_get_section (asym)->symbol_ptr_ptr; - reloc_chain->relent.address = section->_raw_size; - reloc_chain->relent.addend = asym->value; - reloc_chain->relent.howto = - ecoff_backend (abfd)->constructor_reloc; - - /* Set up the constructor section to hold the reloc. */ - section->flags = SEC_CONSTRUCTOR; - ++section->reloc_count; - - /* Constructor sections must be rounded to a boundary - based on the bitsize. These are not real sections-- - they are handled specially by the linker--so the ECOFF - 16 byte alignment restriction does not apply. */ - bitsize = ecoff_backend (abfd)->constructor_bitsize; - section->alignment_power = 1; - while ((1 << section->alignment_power) < bitsize / 8) - ++section->alignment_power; - - reloc_chain->next = section->constructor_chain; - section->constructor_chain = reloc_chain; - section->_raw_size += bitsize / 8; - - /* Mark the symbol as a constructor. */ - asym->flags |= BSF_CONSTRUCTOR; - } - break; - } - } - return true; -} - -/* Read an ECOFF symbol table. */ - -boolean -_bfd_ecoff_slurp_symbol_table (abfd) - bfd *abfd; -{ - const struct ecoff_backend_data * const backend = ecoff_backend (abfd); - const bfd_size_type external_ext_size - = backend->debug_swap.external_ext_size; - const bfd_size_type external_sym_size - = backend->debug_swap.external_sym_size; - void (* const swap_ext_in) PARAMS ((bfd *, PTR, EXTR *)) - = backend->debug_swap.swap_ext_in; - void (* const swap_sym_in) PARAMS ((bfd *, PTR, SYMR *)) - = backend->debug_swap.swap_sym_in; - bfd_size_type internal_size; - ecoff_symbol_type *internal; - ecoff_symbol_type *internal_ptr; - char *eraw_src; - char *eraw_end; - FDR *fdr_ptr; - FDR *fdr_end; - - /* If we've already read in the symbol table, do nothing. */ - if (ecoff_data (abfd)->canonical_symbols != NULL) - return true; - - /* Get the symbolic information. */ - if (! _bfd_ecoff_slurp_symbolic_info (abfd, (asection *) NULL, - &ecoff_data (abfd)->debug_info)) - return false; - if (bfd_get_symcount (abfd) == 0) - return true; - - internal_size = bfd_get_symcount (abfd) * sizeof (ecoff_symbol_type); - internal = (ecoff_symbol_type *) bfd_alloc (abfd, internal_size); - if (internal == NULL) - return false; - - internal_ptr = internal; - eraw_src = (char *) ecoff_data (abfd)->debug_info.external_ext; - eraw_end = (eraw_src - + (ecoff_data (abfd)->debug_info.symbolic_header.iextMax - * external_ext_size)); - for (; eraw_src < eraw_end; eraw_src += external_ext_size, internal_ptr++) - { - EXTR internal_esym; - - (*swap_ext_in) (abfd, (PTR) eraw_src, &internal_esym); - internal_ptr->symbol.name = (ecoff_data (abfd)->debug_info.ssext - + internal_esym.asym.iss); - if (!ecoff_set_symbol_info (abfd, &internal_esym.asym, - &internal_ptr->symbol, 1, - internal_esym.weakext)) - return false; - /* The alpha uses a negative ifd field for section symbols. */ - if (internal_esym.ifd >= 0) - internal_ptr->fdr = (ecoff_data (abfd)->debug_info.fdr - + internal_esym.ifd); - else - internal_ptr->fdr = NULL; - internal_ptr->local = false; - internal_ptr->native = (PTR) eraw_src; - } - - /* The local symbols must be accessed via the fdr's, because the - string and aux indices are relative to the fdr information. */ - fdr_ptr = ecoff_data (abfd)->debug_info.fdr; - fdr_end = fdr_ptr + ecoff_data (abfd)->debug_info.symbolic_header.ifdMax; - for (; fdr_ptr < fdr_end; fdr_ptr++) - { - char *lraw_src; - char *lraw_end; - - lraw_src = ((char *) ecoff_data (abfd)->debug_info.external_sym - + fdr_ptr->isymBase * external_sym_size); - lraw_end = lraw_src + fdr_ptr->csym * external_sym_size; - for (; - lraw_src < lraw_end; - lraw_src += external_sym_size, internal_ptr++) - { - SYMR internal_sym; - - (*swap_sym_in) (abfd, (PTR) lraw_src, &internal_sym); - internal_ptr->symbol.name = (ecoff_data (abfd)->debug_info.ss - + fdr_ptr->issBase - + internal_sym.iss); - if (!ecoff_set_symbol_info (abfd, &internal_sym, - &internal_ptr->symbol, 0, 0)) - return false; - internal_ptr->fdr = fdr_ptr; - internal_ptr->local = true; - internal_ptr->native = (PTR) lraw_src; - } - } - - ecoff_data (abfd)->canonical_symbols = internal; - - return true; -} - -/* Return the amount of space needed for the canonical symbols. */ - -long -_bfd_ecoff_get_symtab_upper_bound (abfd) - bfd *abfd; -{ - if (! _bfd_ecoff_slurp_symbolic_info (abfd, (asection *) NULL, - &ecoff_data (abfd)->debug_info)) - return -1; - - if (bfd_get_symcount (abfd) == 0) - return 0; - - return (bfd_get_symcount (abfd) + 1) * (sizeof (ecoff_symbol_type *)); -} - -/* Get the canonical symbols. */ - -long -_bfd_ecoff_get_symtab (abfd, alocation) - bfd *abfd; - asymbol **alocation; -{ - unsigned int counter = 0; - ecoff_symbol_type *symbase; - ecoff_symbol_type **location = (ecoff_symbol_type **) alocation; - - if (_bfd_ecoff_slurp_symbol_table (abfd) == false) - return -1; - if (bfd_get_symcount (abfd) == 0) - return 0; - - symbase = ecoff_data (abfd)->canonical_symbols; - while (counter < bfd_get_symcount (abfd)) - { - *(location++) = symbase++; - counter++; - } - *location++ = (ecoff_symbol_type *) NULL; - return bfd_get_symcount (abfd); -} - -/* Turn ECOFF type information into a printable string. - ecoff_emit_aggregate and ecoff_type_to_string are from - gcc/mips-tdump.c, with swapping added and used_ptr removed. */ - -/* Write aggregate information to a string. */ - -static void -ecoff_emit_aggregate (abfd, fdr, string, rndx, isym, which) - bfd *abfd; - FDR *fdr; - char *string; - RNDXR *rndx; - long isym; - const char *which; -{ - const struct ecoff_debug_swap * const debug_swap = - &ecoff_backend (abfd)->debug_swap; - struct ecoff_debug_info * const debug_info = &ecoff_data (abfd)->debug_info; - unsigned int ifd = rndx->rfd; - unsigned int indx = rndx->index; - const char *name; - - if (ifd == 0xfff) - ifd = isym; - - /* An ifd of -1 is an opaque type. An escaped index of 0 is a - struct return type of a procedure compiled without -g. */ - if (ifd == 0xffffffff - || (rndx->rfd == 0xfff && indx == 0)) - name = "<undefined>"; - else if (indx == indexNil) - name = "<no name>"; - else - { - SYMR sym; - - if (debug_info->external_rfd == NULL) - fdr = debug_info->fdr + ifd; - else - { - RFDT rfd; - - (*debug_swap->swap_rfd_in) (abfd, - ((char *) debug_info->external_rfd - + ((fdr->rfdBase + ifd) - * debug_swap->external_rfd_size)), - &rfd); - fdr = debug_info->fdr + rfd; - } - - indx += fdr->isymBase; - - (*debug_swap->swap_sym_in) (abfd, - ((char *) debug_info->external_sym - + indx * debug_swap->external_sym_size), - &sym); - - name = debug_info->ss + fdr->issBase + sym.iss; - } - - sprintf (string, - "%s %s { ifd = %u, index = %lu }", - which, name, ifd, - ((long) indx - + debug_info->symbolic_header.iextMax)); -} - -/* Convert the type information to string format. */ - -static char * -ecoff_type_to_string (abfd, fdr, indx) - bfd *abfd; - FDR *fdr; - unsigned int indx; -{ - union aux_ext *aux_ptr; - int bigendian; - AUXU u; - struct qual { - unsigned int type; - int low_bound; - int high_bound; - int stride; - } qualifiers[7]; - unsigned int basic_type; - int i; - char buffer1[1024]; - static char buffer2[1024]; - char *p1 = buffer1; - char *p2 = buffer2; - RNDXR rndx; - - aux_ptr = ecoff_data (abfd)->debug_info.external_aux + fdr->iauxBase; - bigendian = fdr->fBigendian; - - for (i = 0; i < 7; i++) - { - qualifiers[i].low_bound = 0; - qualifiers[i].high_bound = 0; - qualifiers[i].stride = 0; - } - - if (AUX_GET_ISYM (bigendian, &aux_ptr[indx]) == (bfd_vma) -1) - return "-1 (no type)"; - _bfd_ecoff_swap_tir_in (bigendian, &aux_ptr[indx++].a_ti, &u.ti); - - basic_type = u.ti.bt; - qualifiers[0].type = u.ti.tq0; - qualifiers[1].type = u.ti.tq1; - qualifiers[2].type = u.ti.tq2; - qualifiers[3].type = u.ti.tq3; - qualifiers[4].type = u.ti.tq4; - qualifiers[5].type = u.ti.tq5; - qualifiers[6].type = tqNil; - - /* - * Go get the basic type. - */ - switch (basic_type) - { - case btNil: /* undefined */ - strcpy (p1, "nil"); - break; - - case btAdr: /* address - integer same size as pointer */ - strcpy (p1, "address"); - break; - - case btChar: /* character */ - strcpy (p1, "char"); - break; - - case btUChar: /* unsigned character */ - strcpy (p1, "unsigned char"); - break; - - case btShort: /* short */ - strcpy (p1, "short"); - break; - - case btUShort: /* unsigned short */ - strcpy (p1, "unsigned short"); - break; - - case btInt: /* int */ - strcpy (p1, "int"); - break; - - case btUInt: /* unsigned int */ - strcpy (p1, "unsigned int"); - break; - - case btLong: /* long */ - strcpy (p1, "long"); - break; - - case btULong: /* unsigned long */ - strcpy (p1, "unsigned long"); - break; - - case btFloat: /* float (real) */ - strcpy (p1, "float"); - break; - - case btDouble: /* Double (real) */ - strcpy (p1, "double"); - break; - - /* Structures add 1-2 aux words: - 1st word is [ST_RFDESCAPE, offset] pointer to struct def; - 2nd word is file index if 1st word rfd is ST_RFDESCAPE. */ - - case btStruct: /* Structure (Record) */ - _bfd_ecoff_swap_rndx_in (bigendian, &aux_ptr[indx].a_rndx, &rndx); - ecoff_emit_aggregate (abfd, fdr, p1, &rndx, - (long) AUX_GET_ISYM (bigendian, &aux_ptr[indx+1]), - "struct"); - indx++; /* skip aux words */ - break; - - /* Unions add 1-2 aux words: - 1st word is [ST_RFDESCAPE, offset] pointer to union def; - 2nd word is file index if 1st word rfd is ST_RFDESCAPE. */ - - case btUnion: /* Union */ - _bfd_ecoff_swap_rndx_in (bigendian, &aux_ptr[indx].a_rndx, &rndx); - ecoff_emit_aggregate (abfd, fdr, p1, &rndx, - (long) AUX_GET_ISYM (bigendian, &aux_ptr[indx+1]), - "union"); - indx++; /* skip aux words */ - break; - - /* Enumerations add 1-2 aux words: - 1st word is [ST_RFDESCAPE, offset] pointer to enum def; - 2nd word is file index if 1st word rfd is ST_RFDESCAPE. */ - - case btEnum: /* Enumeration */ - _bfd_ecoff_swap_rndx_in (bigendian, &aux_ptr[indx].a_rndx, &rndx); - ecoff_emit_aggregate (abfd, fdr, p1, &rndx, - (long) AUX_GET_ISYM (bigendian, &aux_ptr[indx+1]), - "enum"); - indx++; /* skip aux words */ - break; - - case btTypedef: /* defined via a typedef, isymRef points */ - strcpy (p1, "typedef"); - break; - - case btRange: /* subrange of int */ - strcpy (p1, "subrange"); - break; - - case btSet: /* pascal sets */ - strcpy (p1, "set"); - break; - - case btComplex: /* fortran complex */ - strcpy (p1, "complex"); - break; - - case btDComplex: /* fortran double complex */ - strcpy (p1, "double complex"); - break; - - case btIndirect: /* forward or unnamed typedef */ - strcpy (p1, "forward/unamed typedef"); - break; - - case btFixedDec: /* Fixed Decimal */ - strcpy (p1, "fixed decimal"); - break; - - case btFloatDec: /* Float Decimal */ - strcpy (p1, "float decimal"); - break; - - case btString: /* Varying Length Character String */ - strcpy (p1, "string"); - break; - - case btBit: /* Aligned Bit String */ - strcpy (p1, "bit"); - break; - - case btPicture: /* Picture */ - strcpy (p1, "picture"); - break; - - case btVoid: /* Void */ - strcpy (p1, "void"); - break; - - default: - sprintf (p1, "Unknown basic type %d", (int) basic_type); - break; - } - - p1 += strlen (buffer1); - - /* - * If this is a bitfield, get the bitsize. - */ - if (u.ti.fBitfield) - { - int bitsize; - - bitsize = AUX_GET_WIDTH (bigendian, &aux_ptr[indx++]); - sprintf (p1, " : %d", bitsize); - p1 += strlen (buffer1); - } - - - /* - * Deal with any qualifiers. - */ - if (qualifiers[0].type != tqNil) - { - /* - * Snarf up any array bounds in the correct order. Arrays - * store 5 successive words in the aux. table: - * word 0 RNDXR to type of the bounds (ie, int) - * word 1 Current file descriptor index - * word 2 low bound - * word 3 high bound (or -1 if []) - * word 4 stride size in bits - */ - for (i = 0; i < 7; i++) - { - if (qualifiers[i].type == tqArray) - { - qualifiers[i].low_bound = - AUX_GET_DNLOW (bigendian, &aux_ptr[indx+2]); - qualifiers[i].high_bound = - AUX_GET_DNHIGH (bigendian, &aux_ptr[indx+3]); - qualifiers[i].stride = - AUX_GET_WIDTH (bigendian, &aux_ptr[indx+4]); - indx += 5; - } - } - - /* - * Now print out the qualifiers. - */ - for (i = 0; i < 6; i++) - { - switch (qualifiers[i].type) - { - case tqNil: - case tqMax: - break; - - case tqPtr: - strcpy (p2, "ptr to "); - p2 += sizeof ("ptr to ")-1; - break; - - case tqVol: - strcpy (p2, "volatile "); - p2 += sizeof ("volatile ")-1; - break; - - case tqFar: - strcpy (p2, "far "); - p2 += sizeof ("far ")-1; - break; - - case tqProc: - strcpy (p2, "func. ret. "); - p2 += sizeof ("func. ret. "); - break; - - case tqArray: - { - int first_array = i; - int j; - - /* Print array bounds reversed (ie, in the order the C - programmer writes them). C is such a fun language.... */ - - while (i < 5 && qualifiers[i+1].type == tqArray) - i++; - - for (j = i; j >= first_array; j--) - { - strcpy (p2, "array ["); - p2 += sizeof ("array [")-1; - if (qualifiers[j].low_bound != 0) - sprintf (p2, - "%ld:%ld {%ld bits}", - (long) qualifiers[j].low_bound, - (long) qualifiers[j].high_bound, - (long) qualifiers[j].stride); - - else if (qualifiers[j].high_bound != -1) - sprintf (p2, - "%ld {%ld bits}", - (long) (qualifiers[j].high_bound + 1), - (long) (qualifiers[j].stride)); - - else - sprintf (p2, " {%ld bits}", (long) (qualifiers[j].stride)); - - p2 += strlen (p2); - strcpy (p2, "] of "); - p2 += sizeof ("] of ")-1; - } - } - break; - } - } - } - - strcpy (p2, buffer1); - return buffer2; -} - -/* Return information about ECOFF symbol SYMBOL in RET. */ - -/*ARGSUSED*/ -void -_bfd_ecoff_get_symbol_info (abfd, symbol, ret) - bfd *abfd; /* Ignored. */ - asymbol *symbol; - symbol_info *ret; -{ - bfd_symbol_info (symbol, ret); -} - -/* Return whether this is a local label. */ - -/*ARGSUSED*/ -boolean -_bfd_ecoff_bfd_is_local_label (abfd, symbol) - bfd *abfd; - asymbol *symbol; -{ - return symbol->name[0] == '$'; -} - -/* Print information about an ECOFF symbol. */ - -void -_bfd_ecoff_print_symbol (abfd, filep, symbol, how) - bfd *abfd; - PTR filep; - asymbol *symbol; - bfd_print_symbol_type how; -{ - const struct ecoff_debug_swap * const debug_swap - = &ecoff_backend (abfd)->debug_swap; - FILE *file = (FILE *)filep; - - switch (how) - { - case bfd_print_symbol_name: - fprintf (file, "%s", symbol->name); - break; - case bfd_print_symbol_more: - if (ecoffsymbol (symbol)->local) - { - SYMR ecoff_sym; - - (*debug_swap->swap_sym_in) (abfd, ecoffsymbol (symbol)->native, - &ecoff_sym); - fprintf (file, "ecoff local "); - fprintf_vma (file, (bfd_vma) ecoff_sym.value); - fprintf (file, " %x %x", (unsigned) ecoff_sym.st, - (unsigned) ecoff_sym.sc); - } - else - { - EXTR ecoff_ext; - - (*debug_swap->swap_ext_in) (abfd, ecoffsymbol (symbol)->native, - &ecoff_ext); - fprintf (file, "ecoff extern "); - fprintf_vma (file, (bfd_vma) ecoff_ext.asym.value); - fprintf (file, " %x %x", (unsigned) ecoff_ext.asym.st, - (unsigned) ecoff_ext.asym.sc); - } - break; - case bfd_print_symbol_all: - /* Print out the symbols in a reasonable way */ - { - char type; - int pos; - EXTR ecoff_ext; - char jmptbl; - char cobol_main; - char weakext; - - if (ecoffsymbol (symbol)->local) - { - (*debug_swap->swap_sym_in) (abfd, ecoffsymbol (symbol)->native, - &ecoff_ext.asym); - type = 'l'; - pos = ((((char *) ecoffsymbol (symbol)->native - - (char *) ecoff_data (abfd)->debug_info.external_sym) - / debug_swap->external_sym_size) - + ecoff_data (abfd)->debug_info.symbolic_header.iextMax); - jmptbl = ' '; - cobol_main = ' '; - weakext = ' '; - } - else - { - (*debug_swap->swap_ext_in) (abfd, ecoffsymbol (symbol)->native, - &ecoff_ext); - type = 'e'; - pos = (((char *) ecoffsymbol (symbol)->native - - (char *) ecoff_data (abfd)->debug_info.external_ext) - / debug_swap->external_ext_size); - jmptbl = ecoff_ext.jmptbl ? 'j' : ' '; - cobol_main = ecoff_ext.cobol_main ? 'c' : ' '; - weakext = ecoff_ext.weakext ? 'w' : ' '; - } - - fprintf (file, "[%3d] %c ", - pos, type); - fprintf_vma (file, (bfd_vma) ecoff_ext.asym.value); - fprintf (file, " st %x sc %x indx %x %c%c%c %s", - (unsigned) ecoff_ext.asym.st, - (unsigned) ecoff_ext.asym.sc, - (unsigned) ecoff_ext.asym.index, - jmptbl, cobol_main, weakext, - symbol->name); - - if (ecoffsymbol (symbol)->fdr != NULL - && ecoff_ext.asym.index != indexNil) - { - FDR *fdr; - unsigned int indx; - int bigendian; - bfd_size_type sym_base; - union aux_ext *aux_base; - - fdr = ecoffsymbol (symbol)->fdr; - indx = ecoff_ext.asym.index; - - /* sym_base is used to map the fdr relative indices which - appear in the file to the position number which we are - using. */ - sym_base = fdr->isymBase; - if (ecoffsymbol (symbol)->local) - sym_base += - ecoff_data (abfd)->debug_info.symbolic_header.iextMax; - - /* aux_base is the start of the aux entries for this file; - asym.index is an offset from this. */ - aux_base = (ecoff_data (abfd)->debug_info.external_aux - + fdr->iauxBase); - - /* The aux entries are stored in host byte order; the - order is indicated by a bit in the fdr. */ - bigendian = fdr->fBigendian; - - /* This switch is basically from gcc/mips-tdump.c */ - switch (ecoff_ext.asym.st) - { - case stNil: - case stLabel: - break; - - case stFile: - case stBlock: - fprintf (file, "\n End+1 symbol: %ld", - (long) (indx + sym_base)); - break; - - case stEnd: - if (ecoff_ext.asym.sc == scText - || ecoff_ext.asym.sc == scInfo) - fprintf (file, "\n First symbol: %ld", - (long) (indx + sym_base)); - else - fprintf (file, "\n First symbol: %ld", - ((long) - (AUX_GET_ISYM (bigendian, - &aux_base[ecoff_ext.asym.index]) - + sym_base))); - break; - - case stProc: - case stStaticProc: - if (ECOFF_IS_STAB (&ecoff_ext.asym)) - ; - else if (ecoffsymbol (symbol)->local) - fprintf (file, "\n End+1 symbol: %-7ld Type: %s", - ((long) - (AUX_GET_ISYM (bigendian, - &aux_base[ecoff_ext.asym.index]) - + sym_base)), - ecoff_type_to_string (abfd, fdr, indx + 1)); - else - fprintf (file, "\n Local symbol: %ld", - ((long) indx - + (long) sym_base - + (ecoff_data (abfd) - ->debug_info.symbolic_header.iextMax))); - break; - - case stStruct: - fprintf (file, "\n struct; End+1 symbol: %ld", - (long) (indx + sym_base)); - break; - - case stUnion: - fprintf (file, "\n union; End+1 symbol: %ld", - (long) (indx + sym_base)); - break; - - case stEnum: - fprintf (file, "\n enum; End+1 symbol: %ld", - (long) (indx + sym_base)); - break; - - default: - if (! ECOFF_IS_STAB (&ecoff_ext.asym)) - fprintf (file, "\n Type: %s", - ecoff_type_to_string (abfd, fdr, indx)); - break; - } - } - } - break; - } -} - -/* Read in the relocs for a section. */ - -static boolean -ecoff_slurp_reloc_table (abfd, section, symbols) - bfd *abfd; - asection *section; - asymbol **symbols; -{ - const struct ecoff_backend_data * const backend = ecoff_backend (abfd); - arelent *internal_relocs; - bfd_size_type external_reloc_size; - bfd_size_type external_relocs_size; - char *external_relocs; - arelent *rptr; - unsigned int i; - - if (section->relocation != (arelent *) NULL - || section->reloc_count == 0 - || (section->flags & SEC_CONSTRUCTOR) != 0) - return true; - - if (_bfd_ecoff_slurp_symbol_table (abfd) == false) - return false; - - internal_relocs = (arelent *) bfd_alloc (abfd, - (sizeof (arelent) - * section->reloc_count)); - external_reloc_size = backend->external_reloc_size; - external_relocs_size = external_reloc_size * section->reloc_count; - external_relocs = (char *) bfd_alloc (abfd, external_relocs_size); - if (internal_relocs == (arelent *) NULL - || external_relocs == (char *) NULL) - return false; - if (bfd_seek (abfd, section->rel_filepos, SEEK_SET) != 0) - return false; - if (bfd_read (external_relocs, 1, external_relocs_size, abfd) - != external_relocs_size) - return false; - - for (i = 0, rptr = internal_relocs; i < section->reloc_count; i++, rptr++) - { - struct internal_reloc intern; - - (*backend->swap_reloc_in) (abfd, - external_relocs + i * external_reloc_size, - &intern); - - if (intern.r_extern) - { - /* r_symndx is an index into the external symbols. */ - BFD_ASSERT (intern.r_symndx >= 0 - && (intern.r_symndx - < (ecoff_data (abfd) - ->debug_info.symbolic_header.iextMax))); - rptr->sym_ptr_ptr = symbols + intern.r_symndx; - rptr->addend = 0; - } - else if (intern.r_symndx == RELOC_SECTION_NONE - || intern.r_symndx == RELOC_SECTION_ABS) - { - rptr->sym_ptr_ptr = bfd_abs_section_ptr->symbol_ptr_ptr; - rptr->addend = 0; - } - else - { - CONST char *sec_name; - asection *sec; - - /* r_symndx is a section key. */ - switch (intern.r_symndx) - { - case RELOC_SECTION_TEXT: sec_name = ".text"; break; - case RELOC_SECTION_RDATA: sec_name = ".rdata"; break; - case RELOC_SECTION_DATA: sec_name = ".data"; break; - case RELOC_SECTION_SDATA: sec_name = ".sdata"; break; - case RELOC_SECTION_SBSS: sec_name = ".sbss"; break; - case RELOC_SECTION_BSS: sec_name = ".bss"; break; - case RELOC_SECTION_INIT: sec_name = ".init"; break; - case RELOC_SECTION_LIT8: sec_name = ".lit8"; break; - case RELOC_SECTION_LIT4: sec_name = ".lit4"; break; - case RELOC_SECTION_XDATA: sec_name = ".xdata"; break; - case RELOC_SECTION_PDATA: sec_name = ".pdata"; break; - case RELOC_SECTION_FINI: sec_name = ".fini"; break; - case RELOC_SECTION_LITA: sec_name = ".lita"; break; - case RELOC_SECTION_RCONST: sec_name = ".rconst"; break; - default: abort (); - } - - sec = bfd_get_section_by_name (abfd, sec_name); - if (sec == (asection *) NULL) - abort (); - rptr->sym_ptr_ptr = sec->symbol_ptr_ptr; - - rptr->addend = - bfd_get_section_vma (abfd, sec); - } - - rptr->address = intern.r_vaddr - bfd_get_section_vma (abfd, section); - - /* Let the backend select the howto field and do any other - required processing. */ - (*backend->adjust_reloc_in) (abfd, &intern, rptr); - } - - bfd_release (abfd, external_relocs); - - section->relocation = internal_relocs; - - return true; -} - -/* Get a canonical list of relocs. */ - -long -_bfd_ecoff_canonicalize_reloc (abfd, section, relptr, symbols) - bfd *abfd; - asection *section; - arelent **relptr; - asymbol **symbols; -{ - unsigned int count; - - if (section->flags & SEC_CONSTRUCTOR) - { - arelent_chain *chain; - - /* This section has relocs made up by us, not the file, so take - them out of their chain and place them into the data area - provided. */ - for (count = 0, chain = section->constructor_chain; - count < section->reloc_count; - count++, chain = chain->next) - *relptr++ = &chain->relent; - } - else - { - arelent *tblptr; - - if (ecoff_slurp_reloc_table (abfd, section, symbols) == false) - return -1; - - tblptr = section->relocation; - - for (count = 0; count < section->reloc_count; count++) - *relptr++ = tblptr++; - } - - *relptr = (arelent *) NULL; - - return section->reloc_count; -} - -/* Provided a BFD, a section and an offset into the section, calculate - and return the name of the source file and the line nearest to the - wanted location. */ - -/*ARGSUSED*/ -boolean -_bfd_ecoff_find_nearest_line (abfd, section, ignore_symbols, offset, - filename_ptr, functionname_ptr, retline_ptr) - bfd *abfd; - asection *section; - asymbol **ignore_symbols; - bfd_vma offset; - CONST char **filename_ptr; - CONST char **functionname_ptr; - unsigned int *retline_ptr; -{ - const struct ecoff_debug_swap * const debug_swap - = &ecoff_backend (abfd)->debug_swap; - struct ecoff_debug_info * const debug_info = &ecoff_data (abfd)->debug_info; - struct ecoff_find_line *line_info; - - /* Make sure we have the FDR's. */ - if (! _bfd_ecoff_slurp_symbolic_info (abfd, (asection *) NULL, debug_info) - || bfd_get_symcount (abfd) == 0) - return false; - - if (ecoff_data (abfd)->find_line_info == NULL) - { - ecoff_data (abfd)->find_line_info = - ((struct ecoff_find_line *) - bfd_alloc (abfd, sizeof (struct ecoff_find_line))); - if (ecoff_data (abfd)->find_line_info == NULL) - return false; - ecoff_data (abfd)->find_line_info->find_buffer = NULL; - ecoff_data (abfd)->find_line_info->fdrtab_len = 0; - ecoff_data (abfd)->find_line_info->fdrtab = NULL; - } - line_info = ecoff_data (abfd)->find_line_info; - - return _bfd_ecoff_locate_line (abfd, section, offset, debug_info, - debug_swap, line_info, filename_ptr, - functionname_ptr, retline_ptr); -} - -/* Copy private BFD data. This is called by objcopy and strip. We - use it to copy the ECOFF debugging information from one BFD to the - other. It would be theoretically possible to represent the ECOFF - debugging information in the symbol table. However, it would be a - lot of work, and there would be little gain (gas, gdb, and ld - already access the ECOFF debugging information via the - ecoff_debug_info structure, and that structure would have to be - retained in order to support ECOFF debugging in MIPS ELF). - - The debugging information for the ECOFF external symbols comes from - the symbol table, so this function only handles the other debugging - information. */ - -boolean -_bfd_ecoff_bfd_copy_private_bfd_data (ibfd, obfd) - bfd *ibfd; - bfd *obfd; -{ - struct ecoff_debug_info *iinfo = &ecoff_data (ibfd)->debug_info; - struct ecoff_debug_info *oinfo = &ecoff_data (obfd)->debug_info; - register int i; - asymbol **sym_ptr_ptr; - size_t c; - boolean local; - - /* This function is selected based on the input vector. We only - want to copy information over if the output BFD also uses ECOFF - format. */ - if (bfd_get_flavour (obfd) != bfd_target_ecoff_flavour) - return true; - - /* Copy the GP value and the register masks. */ - ecoff_data (obfd)->gp = ecoff_data (ibfd)->gp; - ecoff_data (obfd)->gprmask = ecoff_data (ibfd)->gprmask; - ecoff_data (obfd)->fprmask = ecoff_data (ibfd)->fprmask; - for (i = 0; i < 3; i++) - ecoff_data (obfd)->cprmask[i] = ecoff_data (ibfd)->cprmask[i]; - - /* Copy the version stamp. */ - oinfo->symbolic_header.vstamp = iinfo->symbolic_header.vstamp; - - /* If there are no symbols, don't copy any debugging information. */ - c = bfd_get_symcount (obfd); - sym_ptr_ptr = bfd_get_outsymbols (obfd); - if (c == 0 || sym_ptr_ptr == (asymbol **) NULL) - return true; - - /* See if there are any local symbols. */ - local = false; - for (; c > 0; c--, sym_ptr_ptr++) - { - if (ecoffsymbol (*sym_ptr_ptr)->local) - { - local = true; - break; - } - } - - if (local) - { - /* There are some local symbols. We just bring over all the - debugging information. FIXME: This is not quite the right - thing to do. If the user has asked us to discard all - debugging information, then we are probably going to wind up - keeping it because there will probably be some local symbol - which objcopy did not discard. We should actually break - apart the debugging information and only keep that which - applies to the symbols we want to keep. */ - oinfo->symbolic_header.ilineMax = iinfo->symbolic_header.ilineMax; - oinfo->symbolic_header.cbLine = iinfo->symbolic_header.cbLine; - oinfo->line = iinfo->line; - - oinfo->symbolic_header.idnMax = iinfo->symbolic_header.idnMax; - oinfo->external_dnr = iinfo->external_dnr; - - oinfo->symbolic_header.ipdMax = iinfo->symbolic_header.ipdMax; - oinfo->external_pdr = iinfo->external_pdr; - - oinfo->symbolic_header.isymMax = iinfo->symbolic_header.isymMax; - oinfo->external_sym = iinfo->external_sym; - - oinfo->symbolic_header.ioptMax = iinfo->symbolic_header.ioptMax; - oinfo->external_opt = iinfo->external_opt; - - oinfo->symbolic_header.iauxMax = iinfo->symbolic_header.iauxMax; - oinfo->external_aux = iinfo->external_aux; - - oinfo->symbolic_header.issMax = iinfo->symbolic_header.issMax; - oinfo->ss = iinfo->ss; - - oinfo->symbolic_header.ifdMax = iinfo->symbolic_header.ifdMax; - oinfo->external_fdr = iinfo->external_fdr; - - oinfo->symbolic_header.crfd = iinfo->symbolic_header.crfd; - oinfo->external_rfd = iinfo->external_rfd; - } - else - { - /* We are discarding all the local symbol information. Look - through the external symbols and remove all references to FDR - or aux information. */ - c = bfd_get_symcount (obfd); - sym_ptr_ptr = bfd_get_outsymbols (obfd); - for (; c > 0; c--, sym_ptr_ptr++) - { - EXTR esym; - - (*(ecoff_backend (obfd)->debug_swap.swap_ext_in)) - (obfd, ecoffsymbol (*sym_ptr_ptr)->native, &esym); - esym.ifd = ifdNil; - esym.asym.index = indexNil; - (*(ecoff_backend (obfd)->debug_swap.swap_ext_out)) - (obfd, &esym, ecoffsymbol (*sym_ptr_ptr)->native); - } - } - - return true; -} - -/* Set the architecture. The supported architecture is stored in the - backend pointer. We always set the architecture anyhow, since many - callers ignore the return value. */ - -boolean -_bfd_ecoff_set_arch_mach (abfd, arch, machine) - bfd *abfd; - enum bfd_architecture arch; - unsigned long machine; -{ - bfd_default_set_arch_mach (abfd, arch, machine); - return arch == ecoff_backend (abfd)->arch; -} - -/* Get the size of the section headers. */ - -/*ARGSUSED*/ -int -_bfd_ecoff_sizeof_headers (abfd, reloc) - bfd *abfd; - boolean reloc; -{ - asection *current; - int c; - int ret; - - c = 0; - for (current = abfd->sections; - current != (asection *)NULL; - current = current->next) - ++c; - - ret = (bfd_coff_filhsz (abfd) - + bfd_coff_aoutsz (abfd) - + c * bfd_coff_scnhsz (abfd)); - return BFD_ALIGN (ret, 16); -} - -/* Get the contents of a section. */ - -boolean -_bfd_ecoff_get_section_contents (abfd, section, location, offset, count) - bfd *abfd; - asection *section; - PTR location; - file_ptr offset; - bfd_size_type count; -{ - return _bfd_generic_get_section_contents (abfd, section, location, - offset, count); -} - -/* Sort sections by VMA, but put SEC_ALLOC sections first. This is - called via qsort. */ - -static int -ecoff_sort_hdrs (arg1, arg2) - const PTR arg1; - const PTR arg2; -{ - const asection *hdr1 = *(const asection **) arg1; - const asection *hdr2 = *(const asection **) arg2; - - if ((hdr1->flags & SEC_ALLOC) != 0) - { - if ((hdr2->flags & SEC_ALLOC) == 0) - return -1; - } - else - { - if ((hdr2->flags & SEC_ALLOC) != 0) - return 1; - } - if (hdr1->vma < hdr2->vma) - return -1; - else if (hdr1->vma > hdr2->vma) - return 1; - else - return 0; -} - -/* Calculate the file position for each section, and set - reloc_filepos. */ - -static boolean -ecoff_compute_section_file_positions (abfd) - bfd *abfd; -{ - file_ptr sofar; - asection **sorted_hdrs; - asection *current; - unsigned int i; - file_ptr old_sofar; - boolean first_data, first_nonalloc; - const bfd_vma round = ecoff_backend (abfd)->round; - - sofar = _bfd_ecoff_sizeof_headers (abfd, false); - - /* Sort the sections by VMA. */ - sorted_hdrs = (asection **) bfd_malloc (abfd->section_count - * sizeof (asection *)); - if (sorted_hdrs == NULL) - return false; - for (current = abfd->sections, i = 0; - current != NULL; - current = current->next, i++) - sorted_hdrs[i] = current; - BFD_ASSERT (i == abfd->section_count); - - qsort (sorted_hdrs, abfd->section_count, sizeof (asection *), - ecoff_sort_hdrs); - - first_data = true; - first_nonalloc = true; - for (i = 0; i < abfd->section_count; i++) - { - unsigned int alignment_power; - - current = sorted_hdrs[i]; - - /* For the Alpha ECOFF .pdata section the lnnoptr field is - supposed to indicate the number of .pdata entries that are - really in the section. Each entry is 8 bytes. We store this - away in line_filepos before increasing the section size. */ - if (strcmp (current->name, _PDATA) != 0) - alignment_power = current->alignment_power; - else - { - current->line_filepos = current->_raw_size / 8; - alignment_power = 4; - } - - /* On Ultrix, the data sections in an executable file must be - aligned to a page boundary within the file. This does not - affect the section size, though. FIXME: Does this work for - other platforms? It requires some modification for the - Alpha, because .rdata on the Alpha goes with the text, not - the data. */ - if ((abfd->flags & EXEC_P) != 0 - && (abfd->flags & D_PAGED) != 0 - && ! first_data - && (current->flags & SEC_CODE) == 0 - && (! ecoff_backend (abfd)->rdata_in_text - || strcmp (current->name, _RDATA) != 0) - && strcmp (current->name, _PDATA) != 0 - && strcmp (current->name, _RCONST) != 0) - { - sofar = (sofar + round - 1) &~ (round - 1); - first_data = false; - } - else if (strcmp (current->name, _LIB) == 0) - { - /* On Irix 4, the location of contents of the .lib section - from a shared library section is also rounded up to a - page boundary. */ - - sofar = (sofar + round - 1) &~ (round - 1); - } - else if (first_nonalloc - && (current->flags & SEC_ALLOC) == 0 - && (abfd->flags & D_PAGED) != 0) - { - /* Skip up to the next page for an unallocated section, such - as the .comment section on the Alpha. This leaves room - for the .bss section. */ - first_nonalloc = false; - sofar = (sofar + round - 1) &~ (round - 1); - } - - /* Align the sections in the file to the same boundary on - which they are aligned in virtual memory. */ - old_sofar = sofar; - sofar = BFD_ALIGN (sofar, 1 << alignment_power); - - if ((abfd->flags & D_PAGED) != 0 - && (current->flags & SEC_ALLOC) != 0) - sofar += (current->vma - sofar) % round; - - if ((current->flags & (SEC_HAS_CONTENTS | SEC_LOAD)) != 0) - current->filepos = sofar; - - sofar += current->_raw_size; - - /* make sure that this section is of the right size too */ - old_sofar = sofar; - sofar = BFD_ALIGN (sofar, 1 << alignment_power); - current->_raw_size += sofar - old_sofar; - } - - free (sorted_hdrs); - sorted_hdrs = NULL; - - ecoff_data (abfd)->reloc_filepos = sofar; - - return true; -} - -/* Determine the location of the relocs for all the sections in the - output file, as well as the location of the symbolic debugging - information. */ - -static bfd_size_type -ecoff_compute_reloc_file_positions (abfd) - bfd *abfd; -{ - const bfd_size_type external_reloc_size = - ecoff_backend (abfd)->external_reloc_size; - file_ptr reloc_base; - bfd_size_type reloc_size; - asection *current; - file_ptr sym_base; - - if (! abfd->output_has_begun) - { - if (! ecoff_compute_section_file_positions (abfd)) - abort (); - abfd->output_has_begun = true; - } - - reloc_base = ecoff_data (abfd)->reloc_filepos; - - reloc_size = 0; - for (current = abfd->sections; - current != (asection *)NULL; - current = current->next) - { - if (current->reloc_count == 0) - current->rel_filepos = 0; - else - { - bfd_size_type relsize; - - current->rel_filepos = reloc_base; - relsize = current->reloc_count * external_reloc_size; - reloc_size += relsize; - reloc_base += relsize; - } - } - - sym_base = ecoff_data (abfd)->reloc_filepos + reloc_size; - - /* At least on Ultrix, the symbol table of an executable file must - be aligned to a page boundary. FIXME: Is this true on other - platforms? */ - if ((abfd->flags & EXEC_P) != 0 - && (abfd->flags & D_PAGED) != 0) - sym_base = ((sym_base + ecoff_backend (abfd)->round - 1) - &~ (ecoff_backend (abfd)->round - 1)); - - ecoff_data (abfd)->sym_filepos = sym_base; - - return reloc_size; -} - -/* Set the contents of a section. */ - -boolean -_bfd_ecoff_set_section_contents (abfd, section, location, offset, count) - bfd *abfd; - asection *section; - PTR location; - file_ptr offset; - bfd_size_type count; -{ - /* This must be done first, because bfd_set_section_contents is - going to set output_has_begun to true. */ - if (abfd->output_has_begun == false) - { - if (! ecoff_compute_section_file_positions (abfd)) - return false; - } - - /* If this is a .lib section, bump the vma address so that it winds - up being the number of .lib sections output. This is right for - Irix 4. Ian Taylor <ian@cygnus.com>. */ - if (strcmp (section->name, _LIB) == 0) - ++section->vma; - - if (count == 0) - return true; - - if (bfd_seek (abfd, (file_ptr) (section->filepos + offset), SEEK_SET) != 0 - || bfd_write (location, 1, count, abfd) != count) - return false; - - return true; -} - -/* Get the GP value for an ECOFF file. This is a hook used by - nlmconv. */ - -bfd_vma -bfd_ecoff_get_gp_value (abfd) - bfd *abfd; -{ - if (bfd_get_flavour (abfd) != bfd_target_ecoff_flavour - || bfd_get_format (abfd) != bfd_object) - { - bfd_set_error (bfd_error_invalid_operation); - return 0; - } - - return ecoff_data (abfd)->gp; -} - -/* Set the GP value for an ECOFF file. This is a hook used by the - assembler. */ - -boolean -bfd_ecoff_set_gp_value (abfd, gp_value) - bfd *abfd; - bfd_vma gp_value; -{ - if (bfd_get_flavour (abfd) != bfd_target_ecoff_flavour - || bfd_get_format (abfd) != bfd_object) - { - bfd_set_error (bfd_error_invalid_operation); - return false; - } - - ecoff_data (abfd)->gp = gp_value; - - return true; -} - -/* Set the register masks for an ECOFF file. This is a hook used by - the assembler. */ - -boolean -bfd_ecoff_set_regmasks (abfd, gprmask, fprmask, cprmask) - bfd *abfd; - unsigned long gprmask; - unsigned long fprmask; - unsigned long *cprmask; -{ - ecoff_data_type *tdata; - - if (bfd_get_flavour (abfd) != bfd_target_ecoff_flavour - || bfd_get_format (abfd) != bfd_object) - { - bfd_set_error (bfd_error_invalid_operation); - return false; - } - - tdata = ecoff_data (abfd); - tdata->gprmask = gprmask; - tdata->fprmask = fprmask; - if (cprmask != (unsigned long *) NULL) - { - register int i; - - for (i = 0; i < 3; i++) - tdata->cprmask[i] = cprmask[i]; - } - - return true; -} - -/* Get ECOFF EXTR information for an external symbol. This function - is passed to bfd_ecoff_debug_externals. */ - -static boolean -ecoff_get_extr (sym, esym) - asymbol *sym; - EXTR *esym; -{ - ecoff_symbol_type *ecoff_sym_ptr; - bfd *input_bfd; - - if (bfd_asymbol_flavour (sym) != bfd_target_ecoff_flavour - || ecoffsymbol (sym)->native == NULL) - { - /* Don't include debugging, local, or section symbols. */ - if ((sym->flags & BSF_DEBUGGING) != 0 - || (sym->flags & BSF_LOCAL) != 0 - || (sym->flags & BSF_SECTION_SYM) != 0) - return false; - - esym->jmptbl = 0; - esym->cobol_main = 0; - esym->weakext = (sym->flags & BSF_WEAK) != 0; - esym->reserved = 0; - esym->ifd = ifdNil; - /* FIXME: we can do better than this for st and sc. */ - esym->asym.st = stGlobal; - esym->asym.sc = scAbs; - esym->asym.reserved = 0; - esym->asym.index = indexNil; - return true; - } - - ecoff_sym_ptr = ecoffsymbol (sym); - - if (ecoff_sym_ptr->local) - return false; - - input_bfd = bfd_asymbol_bfd (sym); - (*(ecoff_backend (input_bfd)->debug_swap.swap_ext_in)) - (input_bfd, ecoff_sym_ptr->native, esym); - - /* If the symbol was defined by the linker, then esym will be - undefined but sym will not be. Get a better class for such a - symbol. */ - if ((esym->asym.sc == scUndefined - || esym->asym.sc == scSUndefined) - && ! bfd_is_und_section (bfd_get_section (sym))) - esym->asym.sc = scAbs; - - /* Adjust the FDR index for the symbol by that used for the input - BFD. */ - if (esym->ifd != -1) - { - struct ecoff_debug_info *input_debug; - - input_debug = &ecoff_data (input_bfd)->debug_info; - BFD_ASSERT (esym->ifd < input_debug->symbolic_header.ifdMax); - if (input_debug->ifdmap != (RFDT *) NULL) - esym->ifd = input_debug->ifdmap[esym->ifd]; - } - - return true; -} - -/* Set the external symbol index. This routine is passed to - bfd_ecoff_debug_externals. */ - -static void -ecoff_set_index (sym, indx) - asymbol *sym; - bfd_size_type indx; -{ - ecoff_set_sym_index (sym, indx); -} - -/* Write out an ECOFF file. */ - -boolean -_bfd_ecoff_write_object_contents (abfd) - bfd *abfd; -{ - const struct ecoff_backend_data * const backend = ecoff_backend (abfd); - const bfd_vma round = backend->round; - const bfd_size_type filhsz = bfd_coff_filhsz (abfd); - const bfd_size_type aoutsz = bfd_coff_aoutsz (abfd); - const bfd_size_type scnhsz = bfd_coff_scnhsz (abfd); - const bfd_size_type external_hdr_size - = backend->debug_swap.external_hdr_size; - const bfd_size_type external_reloc_size = backend->external_reloc_size; - void (* const adjust_reloc_out) PARAMS ((bfd *, - const arelent *, - struct internal_reloc *)) - = backend->adjust_reloc_out; - void (* const swap_reloc_out) PARAMS ((bfd *, - const struct internal_reloc *, - PTR)) - = backend->swap_reloc_out; - struct ecoff_debug_info * const debug = &ecoff_data (abfd)->debug_info; - HDRR * const symhdr = &debug->symbolic_header; - asection *current; - unsigned int count; - bfd_size_type reloc_size; - bfd_size_type text_size; - bfd_vma text_start; - boolean set_text_start; - bfd_size_type data_size; - bfd_vma data_start; - boolean set_data_start; - bfd_size_type bss_size; - PTR buff = NULL; - PTR reloc_buff = NULL; - struct internal_filehdr internal_f; - struct internal_aouthdr internal_a; - int i; - - /* Determine where the sections and relocs will go in the output - file. */ - reloc_size = ecoff_compute_reloc_file_positions (abfd); - - count = 1; - for (current = abfd->sections; - current != (asection *)NULL; - current = current->next) - { - current->target_index = count; - ++count; - } - - if ((abfd->flags & D_PAGED) != 0) - text_size = _bfd_ecoff_sizeof_headers (abfd, false); - else - text_size = 0; - text_start = 0; - set_text_start = false; - data_size = 0; - data_start = 0; - set_data_start = false; - bss_size = 0; - - /* Write section headers to the file. */ - - /* Allocate buff big enough to hold a section header, - file header, or a.out header. */ - { - bfd_size_type siz; - siz = scnhsz; - if (siz < filhsz) - siz = filhsz; - if (siz < aoutsz) - siz = aoutsz; - buff = (PTR) bfd_malloc ((size_t) siz); - if (buff == NULL) - goto error_return; - } - - internal_f.f_nscns = 0; - if (bfd_seek (abfd, (file_ptr) (filhsz + aoutsz), SEEK_SET) != 0) - goto error_return; - for (current = abfd->sections; - current != (asection *) NULL; - current = current->next) - { - struct internal_scnhdr section; - bfd_vma vma; - - ++internal_f.f_nscns; - - strncpy (section.s_name, current->name, sizeof section.s_name); - - /* This seems to be correct for Irix 4 shared libraries. */ - vma = bfd_get_section_vma (abfd, current); - if (strcmp (current->name, _LIB) == 0) - section.s_vaddr = 0; - else - section.s_vaddr = vma; - - section.s_paddr = current->lma; - section.s_size = bfd_get_section_size_before_reloc (current); - - /* If this section is unloadable then the scnptr will be 0. */ - if ((current->flags & (SEC_LOAD | SEC_HAS_CONTENTS)) == 0) - section.s_scnptr = 0; - else - section.s_scnptr = current->filepos; - section.s_relptr = current->rel_filepos; - - /* FIXME: the lnnoptr of the .sbss or .sdata section of an - object file produced by the assembler is supposed to point to - information about how much room is required by objects of - various different sizes. I think this only matters if we - want the linker to compute the best size to use, or - something. I don't know what happens if the information is - not present. */ - if (strcmp (current->name, _PDATA) != 0) - section.s_lnnoptr = 0; - else - { - /* The Alpha ECOFF .pdata section uses the lnnoptr field to - hold the number of entries in the section (each entry is - 8 bytes). We stored this in the line_filepos field in - ecoff_compute_section_file_positions. */ - section.s_lnnoptr = current->line_filepos; - } - - section.s_nreloc = current->reloc_count; - section.s_nlnno = 0; - section.s_flags = ecoff_sec_to_styp_flags (current->name, - current->flags); - - if (bfd_coff_swap_scnhdr_out (abfd, (PTR) §ion, buff) == 0 - || bfd_write (buff, 1, scnhsz, abfd) != scnhsz) - goto error_return; - - if ((section.s_flags & STYP_TEXT) != 0 - || ((section.s_flags & STYP_RDATA) != 0 - && backend->rdata_in_text) - || section.s_flags == STYP_PDATA - || (section.s_flags & STYP_DYNAMIC) != 0 - || (section.s_flags & STYP_LIBLIST) != 0 - || (section.s_flags & STYP_RELDYN) != 0 - || section.s_flags == STYP_CONFLIC - || (section.s_flags & STYP_DYNSTR) != 0 - || (section.s_flags & STYP_DYNSYM) != 0 - || (section.s_flags & STYP_HASH) != 0 - || (section.s_flags & STYP_ECOFF_INIT) != 0 - || (section.s_flags & STYP_ECOFF_FINI) != 0 - || section.s_flags == STYP_RCONST) - { - text_size += bfd_get_section_size_before_reloc (current); - if (! set_text_start || text_start > vma) - { - text_start = vma; - set_text_start = true; - } - } - else if ((section.s_flags & STYP_RDATA) != 0 - || (section.s_flags & STYP_DATA) != 0 - || (section.s_flags & STYP_LITA) != 0 - || (section.s_flags & STYP_LIT8) != 0 - || (section.s_flags & STYP_LIT4) != 0 - || (section.s_flags & STYP_SDATA) != 0 - || section.s_flags == STYP_XDATA - || (section.s_flags & STYP_GOT) != 0) - { - data_size += bfd_get_section_size_before_reloc (current); - if (! set_data_start || data_start > vma) - { - data_start = vma; - set_data_start = true; - } - } - else if ((section.s_flags & STYP_BSS) != 0 - || (section.s_flags & STYP_SBSS) != 0) - bss_size += bfd_get_section_size_before_reloc (current); - else if (section.s_flags == 0 - || (section.s_flags & STYP_ECOFF_LIB) != 0 - || section.s_flags == STYP_COMMENT) - /* Do nothing */ ; - else - abort (); - } - - /* Set up the file header. */ - - internal_f.f_magic = ecoff_get_magic (abfd); - - /* We will NOT put a fucking timestamp in the header here. Every - time you put it back, I will come in and take it out again. I'm - sorry. This field does not belong here. We fill it with a 0 so - it compares the same but is not a reasonable time. -- - gnu@cygnus.com. */ - internal_f.f_timdat = 0; - - if (bfd_get_symcount (abfd) != 0) - { - /* The ECOFF f_nsyms field is not actually the number of - symbols, it's the size of symbolic information header. */ - internal_f.f_nsyms = external_hdr_size; - internal_f.f_symptr = ecoff_data (abfd)->sym_filepos; - } - else - { - internal_f.f_nsyms = 0; - internal_f.f_symptr = 0; - } - - internal_f.f_opthdr = aoutsz; - - internal_f.f_flags = F_LNNO; - if (reloc_size == 0) - internal_f.f_flags |= F_RELFLG; - if (bfd_get_symcount (abfd) == 0) - internal_f.f_flags |= F_LSYMS; - if (abfd->flags & EXEC_P) - internal_f.f_flags |= F_EXEC; - - if (bfd_little_endian (abfd)) - internal_f.f_flags |= F_AR32WR; - else - internal_f.f_flags |= F_AR32W; - - /* Set up the ``optional'' header. */ - if ((abfd->flags & D_PAGED) != 0) - internal_a.magic = ECOFF_AOUT_ZMAGIC; - else - internal_a.magic = ECOFF_AOUT_OMAGIC; - - /* FIXME: Is this really correct? */ - internal_a.vstamp = symhdr->vstamp; - - /* At least on Ultrix, these have to be rounded to page boundaries. - FIXME: Is this true on other platforms? */ - if ((abfd->flags & D_PAGED) != 0) - { - internal_a.tsize = (text_size + round - 1) &~ (round - 1); - internal_a.text_start = text_start &~ (round - 1); - internal_a.dsize = (data_size + round - 1) &~ (round - 1); - internal_a.data_start = data_start &~ (round - 1); - } - else - { - internal_a.tsize = text_size; - internal_a.text_start = text_start; - internal_a.dsize = data_size; - internal_a.data_start = data_start; - } - - /* On Ultrix, the initial portions of the .sbss and .bss segments - are at the end of the data section. The bsize field in the - optional header records how many bss bytes are required beyond - those in the data section. The value is not rounded to a page - boundary. */ - if (bss_size < internal_a.dsize - data_size) - bss_size = 0; - else - bss_size -= internal_a.dsize - data_size; - internal_a.bsize = bss_size; - internal_a.bss_start = internal_a.data_start + internal_a.dsize; - - internal_a.entry = bfd_get_start_address (abfd); - - internal_a.gp_value = ecoff_data (abfd)->gp; - - internal_a.gprmask = ecoff_data (abfd)->gprmask; - internal_a.fprmask = ecoff_data (abfd)->fprmask; - for (i = 0; i < 4; i++) - internal_a.cprmask[i] = ecoff_data (abfd)->cprmask[i]; - - /* Let the backend adjust the headers if necessary. */ - if (backend->adjust_headers) - { - if (! (*backend->adjust_headers) (abfd, &internal_f, &internal_a)) - goto error_return; - } - - /* Write out the file header and the optional header. */ - - if (bfd_seek (abfd, (file_ptr) 0, SEEK_SET) != 0) - goto error_return; - - bfd_coff_swap_filehdr_out (abfd, (PTR) &internal_f, buff); - if (bfd_write (buff, 1, filhsz, abfd) != filhsz) - goto error_return; - - bfd_coff_swap_aouthdr_out (abfd, (PTR) &internal_a, buff); - if (bfd_write (buff, 1, aoutsz, abfd) != aoutsz) - goto error_return; - - /* Build the external symbol information. This must be done before - writing out the relocs so that we know the symbol indices. We - don't do this if this BFD was created by the backend linker, - since it will have already handled the symbols and relocs. */ - if (! ecoff_data (abfd)->linker) - { - symhdr->iextMax = 0; - symhdr->issExtMax = 0; - debug->external_ext = debug->external_ext_end = NULL; - debug->ssext = debug->ssext_end = NULL; - if (bfd_ecoff_debug_externals (abfd, debug, &backend->debug_swap, - (((abfd->flags & EXEC_P) == 0) - ? true : false), - ecoff_get_extr, ecoff_set_index) - == false) - goto error_return; - - /* Write out the relocs. */ - for (current = abfd->sections; - current != (asection *) NULL; - current = current->next) - { - arelent **reloc_ptr_ptr; - arelent **reloc_end; - char *out_ptr; - - if (current->reloc_count == 0) - continue; - - reloc_buff = - bfd_alloc (abfd, current->reloc_count * external_reloc_size); - if (reloc_buff == NULL) - goto error_return; - - reloc_ptr_ptr = current->orelocation; - reloc_end = reloc_ptr_ptr + current->reloc_count; - out_ptr = (char *) reloc_buff; - for (; - reloc_ptr_ptr < reloc_end; - reloc_ptr_ptr++, out_ptr += external_reloc_size) - { - arelent *reloc; - asymbol *sym; - struct internal_reloc in; - - memset ((PTR) &in, 0, sizeof in); - - reloc = *reloc_ptr_ptr; - sym = *reloc->sym_ptr_ptr; - - in.r_vaddr = (reloc->address - + bfd_get_section_vma (abfd, current)); - in.r_type = reloc->howto->type; - - if ((sym->flags & BSF_SECTION_SYM) == 0) - { - in.r_symndx = ecoff_get_sym_index (*reloc->sym_ptr_ptr); - in.r_extern = 1; - } - else - { - CONST char *name; - - name = bfd_get_section_name (abfd, bfd_get_section (sym)); - if (strcmp (name, ".text") == 0) - in.r_symndx = RELOC_SECTION_TEXT; - else if (strcmp (name, ".rdata") == 0) - in.r_symndx = RELOC_SECTION_RDATA; - else if (strcmp (name, ".data") == 0) - in.r_symndx = RELOC_SECTION_DATA; - else if (strcmp (name, ".sdata") == 0) - in.r_symndx = RELOC_SECTION_SDATA; - else if (strcmp (name, ".sbss") == 0) - in.r_symndx = RELOC_SECTION_SBSS; - else if (strcmp (name, ".bss") == 0) - in.r_symndx = RELOC_SECTION_BSS; - else if (strcmp (name, ".init") == 0) - in.r_symndx = RELOC_SECTION_INIT; - else if (strcmp (name, ".lit8") == 0) - in.r_symndx = RELOC_SECTION_LIT8; - else if (strcmp (name, ".lit4") == 0) - in.r_symndx = RELOC_SECTION_LIT4; - else if (strcmp (name, ".xdata") == 0) - in.r_symndx = RELOC_SECTION_XDATA; - else if (strcmp (name, ".pdata") == 0) - in.r_symndx = RELOC_SECTION_PDATA; - else if (strcmp (name, ".fini") == 0) - in.r_symndx = RELOC_SECTION_FINI; - else if (strcmp (name, ".lita") == 0) - in.r_symndx = RELOC_SECTION_LITA; - else if (strcmp (name, "*ABS*") == 0) - in.r_symndx = RELOC_SECTION_ABS; - else if (strcmp (name, ".rconst") == 0) - in.r_symndx = RELOC_SECTION_RCONST; - else - abort (); - in.r_extern = 0; - } - - (*adjust_reloc_out) (abfd, reloc, &in); - - (*swap_reloc_out) (abfd, &in, (PTR) out_ptr); - } - - if (bfd_seek (abfd, current->rel_filepos, SEEK_SET) != 0) - goto error_return; - if (bfd_write (reloc_buff, - external_reloc_size, current->reloc_count, abfd) - != external_reloc_size * current->reloc_count) - goto error_return; - bfd_release (abfd, reloc_buff); - reloc_buff = NULL; - } - - /* Write out the symbolic debugging information. */ - if (bfd_get_symcount (abfd) > 0) - { - /* Write out the debugging information. */ - if (bfd_ecoff_write_debug (abfd, debug, &backend->debug_swap, - ecoff_data (abfd)->sym_filepos) - == false) - goto error_return; - } - } - - /* The .bss section of a demand paged executable must receive an - entire page. If there are symbols, the symbols will start on the - next page. If there are no symbols, we must fill out the page by - hand. */ - if (bfd_get_symcount (abfd) == 0 - && (abfd->flags & EXEC_P) != 0 - && (abfd->flags & D_PAGED) != 0) - { - char c; - - if (bfd_seek (abfd, (file_ptr) ecoff_data (abfd)->sym_filepos - 1, - SEEK_SET) != 0) - goto error_return; - if (bfd_read (&c, 1, 1, abfd) == 0) - c = 0; - if (bfd_seek (abfd, (file_ptr) ecoff_data (abfd)->sym_filepos - 1, - SEEK_SET) != 0) - goto error_return; - if (bfd_write (&c, 1, 1, abfd) != 1) - goto error_return; - } - - if (reloc_buff != NULL) - bfd_release (abfd, reloc_buff); - if (buff != NULL) - free (buff); - return true; - error_return: - if (reloc_buff != NULL) - bfd_release (abfd, reloc_buff); - if (buff != NULL) - free (buff); - return false; -} - -/* Archive handling. ECOFF uses what appears to be a unique type of - archive header (armap). The byte ordering of the armap and the - contents are encoded in the name of the armap itself. At least for - now, we only support archives with the same byte ordering in the - armap and the contents. - - The first four bytes in the armap are the number of symbol - definitions. This is always a power of two. - - This is followed by the symbol definitions. Each symbol definition - occupies 8 bytes. The first four bytes are the offset from the - start of the armap strings to the null-terminated string naming - this symbol. The second four bytes are the file offset to the - archive member which defines this symbol. If the second four bytes - are 0, then this is not actually a symbol definition, and it should - be ignored. - - The symbols are hashed into the armap with a closed hashing scheme. - See the functions below for the details of the algorithm. - - After the symbol definitions comes four bytes holding the size of - the string table, followed by the string table itself. */ - -/* The name of an archive headers looks like this: - __________E[BL]E[BL]_ (with a trailing space). - The trailing space is changed to an X if the archive is changed to - indicate that the armap is out of date. - - The Alpha seems to use ________64E[BL]E[BL]_. */ - -#define ARMAP_BIG_ENDIAN 'B' -#define ARMAP_LITTLE_ENDIAN 'L' -#define ARMAP_MARKER 'E' -#define ARMAP_START_LENGTH 10 -#define ARMAP_HEADER_MARKER_INDEX 10 -#define ARMAP_HEADER_ENDIAN_INDEX 11 -#define ARMAP_OBJECT_MARKER_INDEX 12 -#define ARMAP_OBJECT_ENDIAN_INDEX 13 -#define ARMAP_END_INDEX 14 -#define ARMAP_END "_ " - -/* This is a magic number used in the hashing algorithm. */ -#define ARMAP_HASH_MAGIC 0x9dd68ab5 - -/* This returns the hash value to use for a string. It also sets - *REHASH to the rehash adjustment if the first slot is taken. SIZE - is the number of entries in the hash table, and HLOG is the log - base 2 of SIZE. */ - -static unsigned int -ecoff_armap_hash (s, rehash, size, hlog) - CONST char *s; - unsigned int *rehash; - unsigned int size; - unsigned int hlog; -{ - unsigned int hash; - - hash = *s++; - while (*s != '\0') - hash = ((hash >> 27) | (hash << 5)) + *s++; - hash *= ARMAP_HASH_MAGIC; - *rehash = (hash & (size - 1)) | 1; - return hash >> (32 - hlog); -} - -/* Read in the armap. */ - -boolean -_bfd_ecoff_slurp_armap (abfd) - bfd *abfd; -{ - char nextname[17]; - unsigned int i; - struct areltdata *mapdata; - bfd_size_type parsed_size; - char *raw_armap; - struct artdata *ardata; - unsigned int count; - char *raw_ptr; - struct symdef *symdef_ptr; - char *stringbase; - - /* Get the name of the first element. */ - i = bfd_read ((PTR) nextname, 1, 16, abfd); - if (i == 0) - return true; - if (i != 16) - return false; - - if (bfd_seek (abfd, (file_ptr) -16, SEEK_CUR) != 0) - return false; - - /* Irix 4.0.5F apparently can use either an ECOFF armap or a - standard COFF armap. We could move the ECOFF armap stuff into - bfd_slurp_armap, but that seems inappropriate since no other - target uses this format. Instead, we check directly for a COFF - armap. */ - if (strncmp (nextname, "/ ", 16) == 0) - return bfd_slurp_armap (abfd); - - /* See if the first element is an armap. */ - if (strncmp (nextname, ecoff_backend (abfd)->armap_start, - ARMAP_START_LENGTH) != 0 - || nextname[ARMAP_HEADER_MARKER_INDEX] != ARMAP_MARKER - || (nextname[ARMAP_HEADER_ENDIAN_INDEX] != ARMAP_BIG_ENDIAN - && nextname[ARMAP_HEADER_ENDIAN_INDEX] != ARMAP_LITTLE_ENDIAN) - || nextname[ARMAP_OBJECT_MARKER_INDEX] != ARMAP_MARKER - || (nextname[ARMAP_OBJECT_ENDIAN_INDEX] != ARMAP_BIG_ENDIAN - && nextname[ARMAP_OBJECT_ENDIAN_INDEX] != ARMAP_LITTLE_ENDIAN) - || strncmp (nextname + ARMAP_END_INDEX, - ARMAP_END, sizeof ARMAP_END - 1) != 0) - { - bfd_has_map (abfd) = false; - return true; - } - - /* Make sure we have the right byte ordering. */ - if (((nextname[ARMAP_HEADER_ENDIAN_INDEX] == ARMAP_BIG_ENDIAN) - ^ (bfd_header_big_endian (abfd))) - || ((nextname[ARMAP_OBJECT_ENDIAN_INDEX] == ARMAP_BIG_ENDIAN) - ^ (bfd_big_endian (abfd)))) - { - bfd_set_error (bfd_error_wrong_format); - return false; - } - - /* Read in the armap. */ - ardata = bfd_ardata (abfd); - mapdata = (struct areltdata *) _bfd_read_ar_hdr (abfd); - if (mapdata == (struct areltdata *) NULL) - return false; - parsed_size = mapdata->parsed_size; - bfd_release (abfd, (PTR) mapdata); - - raw_armap = (char *) bfd_alloc (abfd, parsed_size); - if (raw_armap == (char *) NULL) - return false; - - if (bfd_read ((PTR) raw_armap, 1, parsed_size, abfd) != parsed_size) - { - if (bfd_get_error () != bfd_error_system_call) - bfd_set_error (bfd_error_malformed_archive); - bfd_release (abfd, (PTR) raw_armap); - return false; - } - - ardata->tdata = (PTR) raw_armap; - - count = bfd_h_get_32 (abfd, (PTR) raw_armap); - - ardata->symdef_count = 0; - ardata->cache = (struct ar_cache *) NULL; - - /* This code used to overlay the symdefs over the raw archive data, - but that doesn't work on a 64 bit host. */ - - stringbase = raw_armap + count * 8 + 8; - -#ifdef CHECK_ARMAP_HASH - { - unsigned int hlog; - - /* Double check that I have the hashing algorithm right by making - sure that every symbol can be looked up successfully. */ - hlog = 0; - for (i = 1; i < count; i <<= 1) - hlog++; - BFD_ASSERT (i == count); - - raw_ptr = raw_armap + 4; - for (i = 0; i < count; i++, raw_ptr += 8) - { - unsigned int name_offset, file_offset; - unsigned int hash, rehash, srch; - - name_offset = bfd_h_get_32 (abfd, (PTR) raw_ptr); - file_offset = bfd_h_get_32 (abfd, (PTR) (raw_ptr + 4)); - if (file_offset == 0) - continue; - hash = ecoff_armap_hash (stringbase + name_offset, &rehash, count, - hlog); - if (hash == i) - continue; - - /* See if we can rehash to this location. */ - for (srch = (hash + rehash) & (count - 1); - srch != hash && srch != i; - srch = (srch + rehash) & (count - 1)) - BFD_ASSERT (bfd_h_get_32 (abfd, (PTR) (raw_armap + 8 + srch * 8)) - != 0); - BFD_ASSERT (srch == i); - } - } - -#endif /* CHECK_ARMAP_HASH */ - - raw_ptr = raw_armap + 4; - for (i = 0; i < count; i++, raw_ptr += 8) - if (bfd_h_get_32 (abfd, (PTR) (raw_ptr + 4)) != 0) - ++ardata->symdef_count; - - symdef_ptr = ((struct symdef *) - bfd_alloc (abfd, - ardata->symdef_count * sizeof (struct symdef))); - if (!symdef_ptr) - return false; - - ardata->symdefs = (carsym *) symdef_ptr; - - raw_ptr = raw_armap + 4; - for (i = 0; i < count; i++, raw_ptr += 8) - { - unsigned int name_offset, file_offset; - - file_offset = bfd_h_get_32 (abfd, (PTR) (raw_ptr + 4)); - if (file_offset == 0) - continue; - name_offset = bfd_h_get_32 (abfd, (PTR) raw_ptr); - symdef_ptr->s.name = stringbase + name_offset; - symdef_ptr->file_offset = file_offset; - ++symdef_ptr; - } - - ardata->first_file_filepos = bfd_tell (abfd); - /* Pad to an even boundary. */ - ardata->first_file_filepos += ardata->first_file_filepos % 2; - - bfd_has_map (abfd) = true; - - return true; -} - -/* Write out an armap. */ - -boolean -_bfd_ecoff_write_armap (abfd, elength, map, orl_count, stridx) - bfd *abfd; - unsigned int elength; - struct orl *map; - unsigned int orl_count; - int stridx; -{ - unsigned int hashsize, hashlog; - unsigned int symdefsize; - int padit; - unsigned int stringsize; - unsigned int mapsize; - file_ptr firstreal; - struct ar_hdr hdr; - struct stat statbuf; - unsigned int i; - bfd_byte temp[4]; - bfd_byte *hashtable; - bfd *current; - bfd *last_elt; - - /* Ultrix appears to use as a hash table size the least power of two - greater than twice the number of entries. */ - for (hashlog = 0; (1 << hashlog) <= 2 * orl_count; hashlog++) - ; - hashsize = 1 << hashlog; - - symdefsize = hashsize * 8; - padit = stridx % 2; - stringsize = stridx + padit; - - /* Include 8 bytes to store symdefsize and stringsize in output. */ - mapsize = symdefsize + stringsize + 8; - - firstreal = SARMAG + sizeof (struct ar_hdr) + mapsize + elength; - - memset ((PTR) &hdr, 0, sizeof hdr); - - /* Work out the ECOFF armap name. */ - strcpy (hdr.ar_name, ecoff_backend (abfd)->armap_start); - hdr.ar_name[ARMAP_HEADER_MARKER_INDEX] = ARMAP_MARKER; - hdr.ar_name[ARMAP_HEADER_ENDIAN_INDEX] = - (bfd_header_big_endian (abfd) - ? ARMAP_BIG_ENDIAN - : ARMAP_LITTLE_ENDIAN); - hdr.ar_name[ARMAP_OBJECT_MARKER_INDEX] = ARMAP_MARKER; - hdr.ar_name[ARMAP_OBJECT_ENDIAN_INDEX] = - bfd_big_endian (abfd) ? ARMAP_BIG_ENDIAN : ARMAP_LITTLE_ENDIAN; - memcpy (hdr.ar_name + ARMAP_END_INDEX, ARMAP_END, sizeof ARMAP_END - 1); - - /* Write the timestamp of the archive header to be just a little bit - later than the timestamp of the file, otherwise the linker will - complain that the index is out of date. Actually, the Ultrix - linker just checks the archive name; the GNU linker may check the - date. */ - stat (abfd->filename, &statbuf); - sprintf (hdr.ar_date, "%ld", (long) (statbuf.st_mtime + 60)); - - /* The DECstation uses zeroes for the uid, gid and mode of the - armap. */ - hdr.ar_uid[0] = '0'; - hdr.ar_gid[0] = '0'; - hdr.ar_mode[0] = '0'; - - sprintf (hdr.ar_size, "%-10d", (int) mapsize); - - hdr.ar_fmag[0] = '`'; - hdr.ar_fmag[1] = '\012'; - - /* Turn all null bytes in the header into spaces. */ - for (i = 0; i < sizeof (struct ar_hdr); i++) - if (((char *)(&hdr))[i] == '\0') - (((char *)(&hdr))[i]) = ' '; - - if (bfd_write ((PTR) &hdr, 1, sizeof (struct ar_hdr), abfd) - != sizeof (struct ar_hdr)) - return false; - - bfd_h_put_32 (abfd, (bfd_vma) hashsize, temp); - if (bfd_write ((PTR) temp, 1, 4, abfd) != 4) - return false; - - hashtable = (bfd_byte *) bfd_zalloc (abfd, symdefsize); - if (!hashtable) - return false; - - current = abfd->archive_head; - last_elt = current; - for (i = 0; i < orl_count; i++) - { - unsigned int hash, rehash; - - /* Advance firstreal to the file position of this archive - element. */ - if (((bfd *) map[i].pos) != last_elt) - { - do - { - firstreal += arelt_size (current) + sizeof (struct ar_hdr); - firstreal += firstreal % 2; - current = current->next; - } - while (current != (bfd *) map[i].pos); - } - - last_elt = current; - - hash = ecoff_armap_hash (*map[i].name, &rehash, hashsize, hashlog); - if (bfd_h_get_32 (abfd, (PTR) (hashtable + (hash * 8) + 4)) != 0) - { - unsigned int srch; - - /* The desired slot is already taken. */ - for (srch = (hash + rehash) & (hashsize - 1); - srch != hash; - srch = (srch + rehash) & (hashsize - 1)) - if (bfd_h_get_32 (abfd, (PTR) (hashtable + (srch * 8) + 4)) == 0) - break; - - BFD_ASSERT (srch != hash); - - hash = srch; - } - - bfd_h_put_32 (abfd, (bfd_vma) map[i].namidx, - (PTR) (hashtable + hash * 8)); - bfd_h_put_32 (abfd, (bfd_vma) firstreal, - (PTR) (hashtable + hash * 8 + 4)); - } - - if (bfd_write ((PTR) hashtable, 1, symdefsize, abfd) != symdefsize) - return false; - - bfd_release (abfd, hashtable); - - /* Now write the strings. */ - bfd_h_put_32 (abfd, (bfd_vma) stringsize, temp); - if (bfd_write ((PTR) temp, 1, 4, abfd) != 4) - return false; - for (i = 0; i < orl_count; i++) - { - bfd_size_type len; - - len = strlen (*map[i].name) + 1; - if (bfd_write ((PTR) (*map[i].name), 1, len, abfd) != len) - return false; - } - - /* The spec sez this should be a newline. But in order to be - bug-compatible for DECstation ar we use a null. */ - if (padit) - { - if (bfd_write ("", 1, 1, abfd) != 1) - return false; - } - - return true; -} - -/* See whether this BFD is an archive. If it is, read in the armap - and the extended name table. */ - -const bfd_target * -_bfd_ecoff_archive_p (abfd) - bfd *abfd; -{ - char armag[SARMAG + 1]; - - if (bfd_read ((PTR) armag, 1, SARMAG, abfd) != SARMAG - || strncmp (armag, ARMAG, SARMAG) != 0) - { - if (bfd_get_error () != bfd_error_system_call) - bfd_set_error (bfd_error_wrong_format); - return (const bfd_target *) NULL; - } - - /* We are setting bfd_ardata(abfd) here, but since bfd_ardata - involves a cast, we can't do it as the left operand of - assignment. */ - abfd->tdata.aout_ar_data = - (struct artdata *) bfd_zalloc (abfd, sizeof (struct artdata)); - - if (bfd_ardata (abfd) == (struct artdata *) NULL) - return (const bfd_target *) NULL; - - bfd_ardata (abfd)->first_file_filepos = SARMAG; - bfd_ardata (abfd)->cache = NULL; - bfd_ardata (abfd)->archive_head = NULL; - bfd_ardata (abfd)->symdefs = NULL; - bfd_ardata (abfd)->extended_names = NULL; - bfd_ardata (abfd)->tdata = NULL; - - if (_bfd_ecoff_slurp_armap (abfd) == false - || _bfd_ecoff_slurp_extended_name_table (abfd) == false) - { - bfd_release (abfd, bfd_ardata (abfd)); - abfd->tdata.aout_ar_data = (struct artdata *) NULL; - return (const bfd_target *) NULL; - } - - return abfd->xvec; -} - -/* ECOFF linker code. */ - -static struct bfd_hash_entry *ecoff_link_hash_newfunc - PARAMS ((struct bfd_hash_entry *entry, - struct bfd_hash_table *table, - const char *string)); -static boolean ecoff_link_add_archive_symbols - PARAMS ((bfd *, struct bfd_link_info *)); -static boolean ecoff_link_check_archive_element - PARAMS ((bfd *, struct bfd_link_info *, boolean *pneeded)); -static boolean ecoff_link_add_object_symbols - PARAMS ((bfd *, struct bfd_link_info *)); -static boolean ecoff_link_add_externals - PARAMS ((bfd *, struct bfd_link_info *, PTR, char *)); - -/* Routine to create an entry in an ECOFF link hash table. */ - -static struct bfd_hash_entry * -ecoff_link_hash_newfunc (entry, table, string) - struct bfd_hash_entry *entry; - struct bfd_hash_table *table; - const char *string; -{ - struct ecoff_link_hash_entry *ret = (struct ecoff_link_hash_entry *) entry; - - /* Allocate the structure if it has not already been allocated by a - subclass. */ - if (ret == (struct ecoff_link_hash_entry *) NULL) - ret = ((struct ecoff_link_hash_entry *) - bfd_hash_allocate (table, sizeof (struct ecoff_link_hash_entry))); - if (ret == (struct ecoff_link_hash_entry *) NULL) - return NULL; - - /* Call the allocation method of the superclass. */ - ret = ((struct ecoff_link_hash_entry *) - _bfd_link_hash_newfunc ((struct bfd_hash_entry *) ret, - table, string)); - - if (ret) - { - /* Set local fields. */ - ret->indx = -1; - ret->abfd = NULL; - ret->written = 0; - ret->small = 0; - } - memset ((PTR) &ret->esym, 0, sizeof ret->esym); - - return (struct bfd_hash_entry *) ret; -} - -/* Create an ECOFF link hash table. */ - -struct bfd_link_hash_table * -_bfd_ecoff_bfd_link_hash_table_create (abfd) - bfd *abfd; -{ - struct ecoff_link_hash_table *ret; - - ret = ((struct ecoff_link_hash_table *) - bfd_alloc (abfd, sizeof (struct ecoff_link_hash_table))); - if (ret == NULL) - return NULL; - if (! _bfd_link_hash_table_init (&ret->root, abfd, - ecoff_link_hash_newfunc)) - { - free (ret); - return (struct bfd_link_hash_table *) NULL; - } - return &ret->root; -} - -/* Look up an entry in an ECOFF link hash table. */ - -#define ecoff_link_hash_lookup(table, string, create, copy, follow) \ - ((struct ecoff_link_hash_entry *) \ - bfd_link_hash_lookup (&(table)->root, (string), (create), (copy), (follow))) - -/* Traverse an ECOFF link hash table. */ - -#define ecoff_link_hash_traverse(table, func, info) \ - (bfd_link_hash_traverse \ - (&(table)->root, \ - (boolean (*) PARAMS ((struct bfd_link_hash_entry *, PTR))) (func), \ - (info))) - -/* Get the ECOFF link hash table from the info structure. This is - just a cast. */ - -#define ecoff_hash_table(p) ((struct ecoff_link_hash_table *) ((p)->hash)) - -/* Given an ECOFF BFD, add symbols to the global hash table as - appropriate. */ - -boolean -_bfd_ecoff_bfd_link_add_symbols (abfd, info) - bfd *abfd; - struct bfd_link_info *info; -{ - switch (bfd_get_format (abfd)) - { - case bfd_object: - return ecoff_link_add_object_symbols (abfd, info); - case bfd_archive: - return ecoff_link_add_archive_symbols (abfd, info); - default: - bfd_set_error (bfd_error_wrong_format); - return false; - } -} - -/* Add the symbols from an archive file to the global hash table. - This looks through the undefined symbols, looks each one up in the - archive hash table, and adds any associated object file. We do not - use _bfd_generic_link_add_archive_symbols because ECOFF archives - already have a hash table, so there is no reason to construct - another one. */ - -static boolean -ecoff_link_add_archive_symbols (abfd, info) - bfd *abfd; - struct bfd_link_info *info; -{ - const struct ecoff_backend_data * const backend = ecoff_backend (abfd); - const bfd_byte *raw_armap; - struct bfd_link_hash_entry **pundef; - unsigned int armap_count; - unsigned int armap_log; - unsigned int i; - const bfd_byte *hashtable; - const char *stringbase; - - if (! bfd_has_map (abfd)) - { - /* An empty archive is a special case. */ - if (bfd_openr_next_archived_file (abfd, (bfd *) NULL) == NULL) - return true; - bfd_set_error (bfd_error_no_armap); - return false; - } - - /* If we don't have any raw data for this archive, as can happen on - Irix 4.0.5F, we call the generic routine. - FIXME: We should be more clever about this, since someday tdata - may get to something for a generic archive. */ - raw_armap = (const bfd_byte *) bfd_ardata (abfd)->tdata; - if (raw_armap == (bfd_byte *) NULL) - return (_bfd_generic_link_add_archive_symbols - (abfd, info, ecoff_link_check_archive_element)); - - armap_count = bfd_h_get_32 (abfd, raw_armap); - - armap_log = 0; - for (i = 1; i < armap_count; i <<= 1) - armap_log++; - BFD_ASSERT (i == armap_count); - - hashtable = raw_armap + 4; - stringbase = (const char *) raw_armap + armap_count * 8 + 8; - - /* Look through the list of undefined symbols. */ - pundef = &info->hash->undefs; - while (*pundef != (struct bfd_link_hash_entry *) NULL) - { - struct bfd_link_hash_entry *h; - unsigned int hash, rehash; - unsigned int file_offset; - const char *name; - bfd *element; - - h = *pundef; - - /* When a symbol is defined, it is not necessarily removed from - the list. */ - if (h->type != bfd_link_hash_undefined - && h->type != bfd_link_hash_common) - { - /* Remove this entry from the list, for general cleanliness - and because we are going to look through the list again - if we search any more libraries. We can't remove the - entry if it is the tail, because that would lose any - entries we add to the list later on. */ - if (*pundef != info->hash->undefs_tail) - *pundef = (*pundef)->next; - else - pundef = &(*pundef)->next; - continue; - } - - /* Native ECOFF linkers do not pull in archive elements merely - to satisfy common definitions, so neither do we. We leave - them on the list, though, in case we are linking against some - other object format. */ - if (h->type != bfd_link_hash_undefined) - { - pundef = &(*pundef)->next; - continue; - } - - /* Look for this symbol in the archive hash table. */ - hash = ecoff_armap_hash (h->root.string, &rehash, armap_count, - armap_log); - - file_offset = bfd_h_get_32 (abfd, hashtable + (hash * 8) + 4); - if (file_offset == 0) - { - /* Nothing in this slot. */ - pundef = &(*pundef)->next; - continue; - } - - name = stringbase + bfd_h_get_32 (abfd, hashtable + (hash * 8)); - if (name[0] != h->root.string[0] - || strcmp (name, h->root.string) != 0) - { - unsigned int srch; - boolean found; - - /* That was the wrong symbol. Try rehashing. */ - found = false; - for (srch = (hash + rehash) & (armap_count - 1); - srch != hash; - srch = (srch + rehash) & (armap_count - 1)) - { - file_offset = bfd_h_get_32 (abfd, hashtable + (srch * 8) + 4); - if (file_offset == 0) - break; - name = stringbase + bfd_h_get_32 (abfd, hashtable + (srch * 8)); - if (name[0] == h->root.string[0] - && strcmp (name, h->root.string) == 0) - { - found = true; - break; - } - } - - if (! found) - { - pundef = &(*pundef)->next; - continue; - } - - hash = srch; - } - - element = (*backend->get_elt_at_filepos) (abfd, file_offset); - if (element == (bfd *) NULL) - return false; - - if (! bfd_check_format (element, bfd_object)) - return false; - - /* Unlike the generic linker, we know that this element provides - a definition for an undefined symbol and we know that we want - to include it. We don't need to check anything. */ - if (! (*info->callbacks->add_archive_element) (info, element, name)) - return false; - if (! ecoff_link_add_object_symbols (element, info)) - return false; - - pundef = &(*pundef)->next; - } - - return true; -} - -/* This is called if we used _bfd_generic_link_add_archive_symbols - because we were not dealing with an ECOFF archive. */ - -static boolean -ecoff_link_check_archive_element (abfd, info, pneeded) - bfd *abfd; - struct bfd_link_info *info; - boolean *pneeded; -{ - const struct ecoff_backend_data * const backend = ecoff_backend (abfd); - void (* const swap_ext_in) PARAMS ((bfd *, PTR, EXTR *)) - = backend->debug_swap.swap_ext_in; - HDRR *symhdr; - bfd_size_type external_ext_size; - PTR external_ext = NULL; - size_t esize; - char *ssext = NULL; - char *ext_ptr; - char *ext_end; - - *pneeded = false; - - if (! ecoff_slurp_symbolic_header (abfd)) - goto error_return; - - /* If there are no symbols, we don't want it. */ - if (bfd_get_symcount (abfd) == 0) - goto successful_return; - - symhdr = &ecoff_data (abfd)->debug_info.symbolic_header; - - /* Read in the external symbols and external strings. */ - external_ext_size = backend->debug_swap.external_ext_size; - esize = symhdr->iextMax * external_ext_size; - external_ext = (PTR) bfd_malloc (esize); - if (external_ext == NULL && esize != 0) - goto error_return; - - if (bfd_seek (abfd, symhdr->cbExtOffset, SEEK_SET) != 0 - || bfd_read (external_ext, 1, esize, abfd) != esize) - goto error_return; - - ssext = (char *) bfd_malloc (symhdr->issExtMax); - if (ssext == NULL && symhdr->issExtMax != 0) - goto error_return; - - if (bfd_seek (abfd, symhdr->cbSsExtOffset, SEEK_SET) != 0 - || (bfd_read (ssext, 1, symhdr->issExtMax, abfd) != - (bfd_size_type) symhdr->issExtMax)) - goto error_return; - - /* Look through the external symbols to see if they define some - symbol that is currently undefined. */ - ext_ptr = (char *) external_ext; - ext_end = ext_ptr + esize; - for (; ext_ptr < ext_end; ext_ptr += external_ext_size) - { - EXTR esym; - boolean def; - const char *name; - struct bfd_link_hash_entry *h; - - (*swap_ext_in) (abfd, (PTR) ext_ptr, &esym); - - /* See if this symbol defines something. */ - if (esym.asym.st != stGlobal - && esym.asym.st != stLabel - && esym.asym.st != stProc) - continue; - - switch (esym.asym.sc) - { - case scText: - case scData: - case scBss: - case scAbs: - case scSData: - case scSBss: - case scRData: - case scCommon: - case scSCommon: - case scInit: - case scFini: - case scRConst: - def = true; - break; - default: - def = false; - break; - } - - if (! def) - continue; - - name = ssext + esym.asym.iss; - h = bfd_link_hash_lookup (info->hash, name, false, false, true); - - /* Unlike the generic linker, we do not pull in elements because - of common symbols. */ - if (h == (struct bfd_link_hash_entry *) NULL - || h->type != bfd_link_hash_undefined) - continue; - - /* Include this element. */ - if (! (*info->callbacks->add_archive_element) (info, abfd, name)) - goto error_return; - if (! ecoff_link_add_externals (abfd, info, external_ext, ssext)) - goto error_return; - - *pneeded = true; - goto successful_return; - } - - successful_return: - if (external_ext != NULL) - free (external_ext); - if (ssext != NULL) - free (ssext); - return true; - error_return: - if (external_ext != NULL) - free (external_ext); - if (ssext != NULL) - free (ssext); - return false; -} - -/* Add symbols from an ECOFF object file to the global linker hash - table. */ - -static boolean -ecoff_link_add_object_symbols (abfd, info) - bfd *abfd; - struct bfd_link_info *info; -{ - HDRR *symhdr; - bfd_size_type external_ext_size; - PTR external_ext = NULL; - size_t esize; - char *ssext = NULL; - boolean result; - - if (! ecoff_slurp_symbolic_header (abfd)) - return false; - - /* If there are no symbols, we don't want it. */ - if (bfd_get_symcount (abfd) == 0) - return true; - - symhdr = &ecoff_data (abfd)->debug_info.symbolic_header; - - /* Read in the external symbols and external strings. */ - external_ext_size = ecoff_backend (abfd)->debug_swap.external_ext_size; - esize = symhdr->iextMax * external_ext_size; - external_ext = (PTR) bfd_malloc (esize); - if (external_ext == NULL && esize != 0) - goto error_return; - - if (bfd_seek (abfd, symhdr->cbExtOffset, SEEK_SET) != 0 - || bfd_read (external_ext, 1, esize, abfd) != esize) - goto error_return; - - ssext = (char *) bfd_malloc (symhdr->issExtMax); - if (ssext == NULL && symhdr->issExtMax != 0) - goto error_return; - - if (bfd_seek (abfd, symhdr->cbSsExtOffset, SEEK_SET) != 0 - || (bfd_read (ssext, 1, symhdr->issExtMax, abfd) - != (bfd_size_type) symhdr->issExtMax)) - goto error_return; - - result = ecoff_link_add_externals (abfd, info, external_ext, ssext); - - if (ssext != NULL) - free (ssext); - if (external_ext != NULL) - free (external_ext); - return result; - - error_return: - if (ssext != NULL) - free (ssext); - if (external_ext != NULL) - free (external_ext); - return false; -} - -/* Add the external symbols of an object file to the global linker - hash table. The external symbols and strings we are passed are - just allocated on the stack, and will be discarded. We must - explicitly save any information we may need later on in the link. - We do not want to read the external symbol information again. */ - -static boolean -ecoff_link_add_externals (abfd, info, external_ext, ssext) - bfd *abfd; - struct bfd_link_info *info; - PTR external_ext; - char *ssext; -{ - const struct ecoff_backend_data * const backend = ecoff_backend (abfd); - void (* const swap_ext_in) PARAMS ((bfd *, PTR, EXTR *)) - = backend->debug_swap.swap_ext_in; - bfd_size_type external_ext_size = backend->debug_swap.external_ext_size; - unsigned long ext_count; - struct ecoff_link_hash_entry **sym_hash; - char *ext_ptr; - char *ext_end; - - ext_count = ecoff_data (abfd)->debug_info.symbolic_header.iextMax; - - sym_hash = ((struct ecoff_link_hash_entry **) - bfd_alloc (abfd, - ext_count * sizeof (struct bfd_link_hash_entry *))); - if (!sym_hash) - return false; - ecoff_data (abfd)->sym_hashes = sym_hash; - - ext_ptr = (char *) external_ext; - ext_end = ext_ptr + ext_count * external_ext_size; - for (; ext_ptr < ext_end; ext_ptr += external_ext_size, sym_hash++) - { - EXTR esym; - boolean skip; - bfd_vma value; - asection *section; - const char *name; - struct ecoff_link_hash_entry *h; - - *sym_hash = NULL; - - (*swap_ext_in) (abfd, (PTR) ext_ptr, &esym); - - /* Skip debugging symbols. */ - skip = false; - switch (esym.asym.st) - { - case stGlobal: - case stStatic: - case stLabel: - case stProc: - case stStaticProc: - break; - default: - skip = true; - break; - } - - if (skip) - continue; - - /* Get the information for this symbol. */ - value = esym.asym.value; - switch (esym.asym.sc) - { - default: - case scNil: - case scRegister: - case scCdbLocal: - case scBits: - case scCdbSystem: - case scRegImage: - case scInfo: - case scUserStruct: - case scVar: - case scVarRegister: - case scVariant: - case scBasedVar: - case scXData: - case scPData: - section = NULL; - break; - case scText: - section = bfd_make_section_old_way (abfd, ".text"); - value -= section->vma; - break; - case scData: - section = bfd_make_section_old_way (abfd, ".data"); - value -= section->vma; - break; - case scBss: - section = bfd_make_section_old_way (abfd, ".bss"); - value -= section->vma; - break; - case scAbs: - section = bfd_abs_section_ptr; - break; - case scUndefined: - section = bfd_und_section_ptr; - break; - case scSData: - section = bfd_make_section_old_way (abfd, ".sdata"); - value -= section->vma; - break; - case scSBss: - section = bfd_make_section_old_way (abfd, ".sbss"); - value -= section->vma; - break; - case scRData: - section = bfd_make_section_old_way (abfd, ".rdata"); - value -= section->vma; - break; - case scCommon: - if (value > ecoff_data (abfd)->gp_size) - { - section = bfd_com_section_ptr; - break; - } - /* Fall through. */ - case scSCommon: - if (ecoff_scom_section.name == NULL) - { - /* Initialize the small common section. */ - ecoff_scom_section.name = SCOMMON; - ecoff_scom_section.flags = SEC_IS_COMMON; - ecoff_scom_section.output_section = &ecoff_scom_section; - ecoff_scom_section.symbol = &ecoff_scom_symbol; - ecoff_scom_section.symbol_ptr_ptr = &ecoff_scom_symbol_ptr; - ecoff_scom_symbol.name = SCOMMON; - ecoff_scom_symbol.flags = BSF_SECTION_SYM; - ecoff_scom_symbol.section = &ecoff_scom_section; - ecoff_scom_symbol_ptr = &ecoff_scom_symbol; - } - section = &ecoff_scom_section; - break; - case scSUndefined: - section = bfd_und_section_ptr; - break; - case scInit: - section = bfd_make_section_old_way (abfd, ".init"); - value -= section->vma; - break; - case scFini: - section = bfd_make_section_old_way (abfd, ".fini"); - value -= section->vma; - break; - case scRConst: - section = bfd_make_section_old_way (abfd, ".rconst"); - value -= section->vma; - break; - } - - if (section == (asection *) NULL) - continue; - - name = ssext + esym.asym.iss; - - h = NULL; - if (! (_bfd_generic_link_add_one_symbol - (info, abfd, name, - esym.weakext ? BSF_WEAK : BSF_GLOBAL, - section, value, (const char *) NULL, true, true, - (struct bfd_link_hash_entry **) &h))) - return false; - - *sym_hash = h; - - /* If we are building an ECOFF hash table, save the external - symbol information. */ - if (info->hash->creator->flavour == bfd_get_flavour (abfd)) - { - if (h->abfd == (bfd *) NULL - || (! bfd_is_und_section (section) - && (! bfd_is_com_section (section) - || (h->root.type != bfd_link_hash_defined - && h->root.type != bfd_link_hash_defweak)))) - { - h->abfd = abfd; - h->esym = esym; - } - - /* Remember whether this symbol was small undefined. */ - if (esym.asym.sc == scSUndefined) - h->small = 1; - - /* If this symbol was ever small undefined, it needs to wind - up in a GP relative section. We can't control the - section of a defined symbol, but we can control the - section of a common symbol. This case is actually needed - on Ultrix 4.2 to handle the symbol cred in -lckrb. */ - if (h->small - && h->root.type == bfd_link_hash_common - && strcmp (h->root.u.c.p->section->name, SCOMMON) != 0) - { - h->root.u.c.p->section = bfd_make_section_old_way (abfd, - SCOMMON); - h->root.u.c.p->section->flags = SEC_ALLOC; - if (h->esym.asym.sc == scCommon) - h->esym.asym.sc = scSCommon; - } - } - } - - return true; -} - -/* ECOFF final link routines. */ - -static boolean ecoff_final_link_debug_accumulate - PARAMS ((bfd *output_bfd, bfd *input_bfd, struct bfd_link_info *, - PTR handle)); -static boolean ecoff_link_write_external - PARAMS ((struct ecoff_link_hash_entry *, PTR)); -static boolean ecoff_indirect_link_order - PARAMS ((bfd *, struct bfd_link_info *, asection *, - struct bfd_link_order *)); -static boolean ecoff_reloc_link_order - PARAMS ((bfd *, struct bfd_link_info *, asection *, - struct bfd_link_order *)); - -/* Structure used to pass information to ecoff_link_write_external. */ - -struct extsym_info -{ - bfd *abfd; - struct bfd_link_info *info; -}; - -/* ECOFF final link routine. This looks through all the input BFDs - and gathers together all the debugging information, and then - processes all the link order information. This may cause it to - close and reopen some input BFDs; I'll see how bad this is. */ - -boolean -_bfd_ecoff_bfd_final_link (abfd, info) - bfd *abfd; - struct bfd_link_info *info; -{ - const struct ecoff_backend_data * const backend = ecoff_backend (abfd); - struct ecoff_debug_info * const debug = &ecoff_data (abfd)->debug_info; - HDRR *symhdr; - PTR handle; - register bfd *input_bfd; - asection *o; - struct bfd_link_order *p; - struct extsym_info einfo; - - /* We accumulate the debugging information counts in the symbolic - header. */ - symhdr = &debug->symbolic_header; - symhdr->vstamp = 0; - symhdr->ilineMax = 0; - symhdr->cbLine = 0; - symhdr->idnMax = 0; - symhdr->ipdMax = 0; - symhdr->isymMax = 0; - symhdr->ioptMax = 0; - symhdr->iauxMax = 0; - symhdr->issMax = 0; - symhdr->issExtMax = 0; - symhdr->ifdMax = 0; - symhdr->crfd = 0; - symhdr->iextMax = 0; - - /* We accumulate the debugging information itself in the debug_info - structure. */ - debug->line = NULL; - debug->external_dnr = NULL; - debug->external_pdr = NULL; - debug->external_sym = NULL; - debug->external_opt = NULL; - debug->external_aux = NULL; - debug->ss = NULL; - debug->ssext = debug->ssext_end = NULL; - debug->external_fdr = NULL; - debug->external_rfd = NULL; - debug->external_ext = debug->external_ext_end = NULL; - - handle = bfd_ecoff_debug_init (abfd, debug, &backend->debug_swap, info); - if (handle == (PTR) NULL) - return false; - - /* Accumulate the debugging symbols from each input BFD. */ - for (input_bfd = info->input_bfds; - input_bfd != (bfd *) NULL; - input_bfd = input_bfd->link_next) - { - boolean ret; - - if (bfd_get_flavour (input_bfd) == bfd_target_ecoff_flavour) - { - /* Abitrarily set the symbolic header vstamp to the vstamp - of the first object file in the link. */ - if (symhdr->vstamp == 0) - symhdr->vstamp - = ecoff_data (input_bfd)->debug_info.symbolic_header.vstamp; - ret = ecoff_final_link_debug_accumulate (abfd, input_bfd, info, - handle); - } - else - ret = bfd_ecoff_debug_accumulate_other (handle, abfd, - debug, &backend->debug_swap, - input_bfd, info); - if (! ret) - return false; - - /* Combine the register masks. */ - ecoff_data (abfd)->gprmask |= ecoff_data (input_bfd)->gprmask; - ecoff_data (abfd)->fprmask |= ecoff_data (input_bfd)->fprmask; - ecoff_data (abfd)->cprmask[0] |= ecoff_data (input_bfd)->cprmask[0]; - ecoff_data (abfd)->cprmask[1] |= ecoff_data (input_bfd)->cprmask[1]; - ecoff_data (abfd)->cprmask[2] |= ecoff_data (input_bfd)->cprmask[2]; - ecoff_data (abfd)->cprmask[3] |= ecoff_data (input_bfd)->cprmask[3]; - } - - /* Write out the external symbols. */ - einfo.abfd = abfd; - einfo.info = info; - ecoff_link_hash_traverse (ecoff_hash_table (info), - ecoff_link_write_external, - (PTR) &einfo); - - if (info->relocateable) - { - /* We need to make a pass over the link_orders to count up the - number of relocations we will need to output, so that we know - how much space they will take up. */ - for (o = abfd->sections; o != (asection *) NULL; o = o->next) - { - o->reloc_count = 0; - for (p = o->link_order_head; - p != (struct bfd_link_order *) NULL; - p = p->next) - if (p->type == bfd_indirect_link_order) - o->reloc_count += p->u.indirect.section->reloc_count; - else if (p->type == bfd_section_reloc_link_order - || p->type == bfd_symbol_reloc_link_order) - ++o->reloc_count; - } - } - - /* Compute the reloc and symbol file positions. */ - ecoff_compute_reloc_file_positions (abfd); - - /* Write out the debugging information. */ - if (! bfd_ecoff_write_accumulated_debug (handle, abfd, debug, - &backend->debug_swap, info, - ecoff_data (abfd)->sym_filepos)) - return false; - - bfd_ecoff_debug_free (handle, abfd, debug, &backend->debug_swap, info); - - if (info->relocateable) - { - /* Now reset the reloc_count field of the sections in the output - BFD to 0, so that we can use them to keep track of how many - relocs we have output thus far. */ - for (o = abfd->sections; o != (asection *) NULL; o = o->next) - o->reloc_count = 0; - } - - /* Get a value for the GP register. */ - if (ecoff_data (abfd)->gp == 0) - { - struct bfd_link_hash_entry *h; - - h = bfd_link_hash_lookup (info->hash, "_gp", false, false, true); - if (h != (struct bfd_link_hash_entry *) NULL - && h->type == bfd_link_hash_defined) - ecoff_data (abfd)->gp = (h->u.def.value - + h->u.def.section->output_section->vma - + h->u.def.section->output_offset); - else if (info->relocateable) - { - bfd_vma lo; - - /* Make up a value. */ - lo = (bfd_vma) -1; - for (o = abfd->sections; o != (asection *) NULL; o = o->next) - { - if (o->vma < lo - && (strcmp (o->name, _SBSS) == 0 - || strcmp (o->name, _SDATA) == 0 - || strcmp (o->name, _LIT4) == 0 - || strcmp (o->name, _LIT8) == 0 - || strcmp (o->name, _LITA) == 0)) - lo = o->vma; - } - ecoff_data (abfd)->gp = lo + 0x8000; - } - else - { - /* If the relocate_section function needs to do a reloc - involving the GP value, it should make a reloc_dangerous - callback to warn that GP is not defined. */ - } - } - - for (o = abfd->sections; o != (asection *) NULL; o = o->next) - { - for (p = o->link_order_head; - p != (struct bfd_link_order *) NULL; - p = p->next) - { - if (p->type == bfd_indirect_link_order - && (bfd_get_flavour (p->u.indirect.section->owner) - == bfd_target_ecoff_flavour)) - { - if (! ecoff_indirect_link_order (abfd, info, o, p)) - return false; - } - else if (p->type == bfd_section_reloc_link_order - || p->type == bfd_symbol_reloc_link_order) - { - if (! ecoff_reloc_link_order (abfd, info, o, p)) - return false; - } - else - { - if (! _bfd_default_link_order (abfd, info, o, p)) - return false; - } - } - } - - bfd_get_symcount (abfd) = symhdr->iextMax + symhdr->isymMax; - - ecoff_data (abfd)->linker = true; - - return true; -} - -/* Accumulate the debugging information for an input BFD into the - output BFD. This must read in the symbolic information of the - input BFD. */ - -static boolean -ecoff_final_link_debug_accumulate (output_bfd, input_bfd, info, handle) - bfd *output_bfd; - bfd *input_bfd; - struct bfd_link_info *info; - PTR handle; -{ - struct ecoff_debug_info * const debug = &ecoff_data (input_bfd)->debug_info; - const struct ecoff_debug_swap * const swap = - &ecoff_backend (input_bfd)->debug_swap; - HDRR *symhdr = &debug->symbolic_header; - boolean ret; - -#define READ(ptr, offset, count, size, type) \ - if (symhdr->count == 0) \ - debug->ptr = NULL; \ - else \ - { \ - debug->ptr = (type) bfd_malloc ((size_t) (size * symhdr->count)); \ - if (debug->ptr == NULL) \ - { \ - ret = false; \ - goto return_something; \ - } \ - if ((bfd_seek (input_bfd, (file_ptr) symhdr->offset, SEEK_SET) \ - != 0) \ - || (bfd_read (debug->ptr, size, symhdr->count, \ - input_bfd) != size * symhdr->count)) \ - { \ - ret = false; \ - goto return_something; \ - } \ - } - - /* If raw_syments is not NULL, then the data was already by read by - _bfd_ecoff_slurp_symbolic_info. */ - if (ecoff_data (input_bfd)->raw_syments == NULL) - { - READ (line, cbLineOffset, cbLine, sizeof (unsigned char), - unsigned char *); - READ (external_dnr, cbDnOffset, idnMax, swap->external_dnr_size, PTR); - READ (external_pdr, cbPdOffset, ipdMax, swap->external_pdr_size, PTR); - READ (external_sym, cbSymOffset, isymMax, swap->external_sym_size, PTR); - READ (external_opt, cbOptOffset, ioptMax, swap->external_opt_size, PTR); - READ (external_aux, cbAuxOffset, iauxMax, sizeof (union aux_ext), - union aux_ext *); - READ (ss, cbSsOffset, issMax, sizeof (char), char *); - READ (external_fdr, cbFdOffset, ifdMax, swap->external_fdr_size, PTR); - READ (external_rfd, cbRfdOffset, crfd, swap->external_rfd_size, PTR); - } -#undef READ - - /* We do not read the external strings or the external symbols. */ - - ret = (bfd_ecoff_debug_accumulate - (handle, output_bfd, &ecoff_data (output_bfd)->debug_info, - &ecoff_backend (output_bfd)->debug_swap, - input_bfd, debug, swap, info)); - - return_something: - if (ecoff_data (input_bfd)->raw_syments == NULL) - { - if (debug->line != NULL) - free (debug->line); - if (debug->external_dnr != NULL) - free (debug->external_dnr); - if (debug->external_pdr != NULL) - free (debug->external_pdr); - if (debug->external_sym != NULL) - free (debug->external_sym); - if (debug->external_opt != NULL) - free (debug->external_opt); - if (debug->external_aux != NULL) - free (debug->external_aux); - if (debug->ss != NULL) - free (debug->ss); - if (debug->external_fdr != NULL) - free (debug->external_fdr); - if (debug->external_rfd != NULL) - free (debug->external_rfd); - - /* Make sure we don't accidentally follow one of these pointers - into freed memory. */ - debug->line = NULL; - debug->external_dnr = NULL; - debug->external_pdr = NULL; - debug->external_sym = NULL; - debug->external_opt = NULL; - debug->external_aux = NULL; - debug->ss = NULL; - debug->external_fdr = NULL; - debug->external_rfd = NULL; - } - - return ret; -} - -/* Put out information for an external symbol. These come only from - the hash table. */ - -static boolean -ecoff_link_write_external (h, data) - struct ecoff_link_hash_entry *h; - PTR data; -{ - struct extsym_info *einfo = (struct extsym_info *) data; - bfd *output_bfd = einfo->abfd; - boolean strip; - - /* We need to check if this symbol is being stripped. */ - if (h->root.type == bfd_link_hash_undefined - || h->root.type == bfd_link_hash_undefweak) - strip = false; - else if (einfo->info->strip == strip_all - || (einfo->info->strip == strip_some - && bfd_hash_lookup (einfo->info->keep_hash, - h->root.root.string, - false, false) == NULL)) - strip = true; - else - strip = false; - - if (strip || h->written) - return true; - - if (h->abfd == (bfd *) NULL) - { - h->esym.jmptbl = 0; - h->esym.cobol_main = 0; - h->esym.weakext = 0; - h->esym.reserved = 0; - h->esym.ifd = ifdNil; - h->esym.asym.value = 0; - h->esym.asym.st = stGlobal; - - if (h->root.type != bfd_link_hash_defined - && h->root.type != bfd_link_hash_defweak) - h->esym.asym.sc = scAbs; - else - { - asection *output_section; - const char *name; - - output_section = h->root.u.def.section->output_section; - name = bfd_section_name (output_section->owner, output_section); - - if (strcmp (name, _TEXT) == 0) - h->esym.asym.sc = scText; - else if (strcmp (name, _DATA) == 0) - h->esym.asym.sc = scData; - else if (strcmp (name, _SDATA) == 0) - h->esym.asym.sc = scSData; - else if (strcmp (name, _RDATA) == 0) - h->esym.asym.sc = scRData; - else if (strcmp (name, _BSS) == 0) - h->esym.asym.sc = scBss; - else if (strcmp (name, _SBSS) == 0) - h->esym.asym.sc = scSBss; - else if (strcmp (name, _INIT) == 0) - h->esym.asym.sc = scInit; - else if (strcmp (name, _FINI) == 0) - h->esym.asym.sc = scFini; - else if (strcmp (name, _PDATA) == 0) - h->esym.asym.sc = scPData; - else if (strcmp (name, _XDATA) == 0) - h->esym.asym.sc = scXData; - else if (strcmp (name, _RCONST) == 0) - h->esym.asym.sc = scRConst; - else - h->esym.asym.sc = scAbs; - } - - h->esym.asym.reserved = 0; - h->esym.asym.index = indexNil; - } - else if (h->esym.ifd != -1) - { - struct ecoff_debug_info *debug; - - /* Adjust the FDR index for the symbol by that used for the - input BFD. */ - debug = &ecoff_data (h->abfd)->debug_info; - BFD_ASSERT (h->esym.ifd >= 0 - && h->esym.ifd < debug->symbolic_header.ifdMax); - h->esym.ifd = debug->ifdmap[h->esym.ifd]; - } - - switch (h->root.type) - { - default: - case bfd_link_hash_new: - abort (); - case bfd_link_hash_undefined: - case bfd_link_hash_undefweak: - if (h->esym.asym.sc != scUndefined - && h->esym.asym.sc != scSUndefined) - h->esym.asym.sc = scUndefined; - break; - case bfd_link_hash_defined: - case bfd_link_hash_defweak: - if (h->esym.asym.sc == scUndefined - || h->esym.asym.sc == scSUndefined) - h->esym.asym.sc = scAbs; - else if (h->esym.asym.sc == scCommon) - h->esym.asym.sc = scBss; - else if (h->esym.asym.sc == scSCommon) - h->esym.asym.sc = scSBss; - h->esym.asym.value = (h->root.u.def.value - + h->root.u.def.section->output_section->vma - + h->root.u.def.section->output_offset); - break; - case bfd_link_hash_common: - if (h->esym.asym.sc != scCommon - && h->esym.asym.sc != scSCommon) - h->esym.asym.sc = scCommon; - h->esym.asym.value = h->root.u.c.size; - break; - case bfd_link_hash_indirect: - case bfd_link_hash_warning: - /* FIXME: Ignore these for now. The circumstances under which - they should be written out are not clear to me. */ - return true; - } - - /* bfd_ecoff_debug_one_external uses iextMax to keep track of the - symbol number. */ - h->indx = ecoff_data (output_bfd)->debug_info.symbolic_header.iextMax; - h->written = 1; - - return (bfd_ecoff_debug_one_external - (output_bfd, &ecoff_data (output_bfd)->debug_info, - &ecoff_backend (output_bfd)->debug_swap, h->root.root.string, - &h->esym)); -} - -/* Relocate and write an ECOFF section into an ECOFF output file. */ - -static boolean -ecoff_indirect_link_order (output_bfd, info, output_section, link_order) - bfd *output_bfd; - struct bfd_link_info *info; - asection *output_section; - struct bfd_link_order *link_order; -{ - asection *input_section; - bfd *input_bfd; - struct ecoff_section_tdata *section_tdata; - bfd_size_type raw_size; - bfd_size_type cooked_size; - bfd_byte *contents = NULL; - bfd_size_type external_reloc_size; - bfd_size_type external_relocs_size; - PTR external_relocs = NULL; - - BFD_ASSERT ((output_section->flags & SEC_HAS_CONTENTS) != 0); - - if (link_order->size == 0) - return true; - - input_section = link_order->u.indirect.section; - input_bfd = input_section->owner; - section_tdata = ecoff_section_data (input_bfd, input_section); - - raw_size = input_section->_raw_size; - cooked_size = input_section->_cooked_size; - if (cooked_size == 0) - cooked_size = raw_size; - - BFD_ASSERT (input_section->output_section == output_section); - BFD_ASSERT (input_section->output_offset == link_order->offset); - BFD_ASSERT (cooked_size == link_order->size); - - /* Get the section contents. We allocate memory for the larger of - the size before relocating and the size after relocating. */ - contents = (bfd_byte *) bfd_malloc (raw_size >= cooked_size - ? (size_t) raw_size - : (size_t) cooked_size); - if (contents == NULL && raw_size != 0) - goto error_return; - - /* If we are relaxing, the contents may have already been read into - memory, in which case we copy them into our new buffer. We don't - simply reuse the old buffer in case cooked_size > raw_size. */ - if (section_tdata != (struct ecoff_section_tdata *) NULL - && section_tdata->contents != (bfd_byte *) NULL) - memcpy (contents, section_tdata->contents, (size_t) raw_size); - else - { - if (! bfd_get_section_contents (input_bfd, input_section, - (PTR) contents, - (file_ptr) 0, raw_size)) - goto error_return; - } - - /* Get the relocs. If we are relaxing MIPS code, they will already - have been read in. Otherwise, we read them in now. */ - external_reloc_size = ecoff_backend (input_bfd)->external_reloc_size; - external_relocs_size = external_reloc_size * input_section->reloc_count; - - if (section_tdata != (struct ecoff_section_tdata *) NULL - && section_tdata->external_relocs != NULL) - external_relocs = section_tdata->external_relocs; - else - { - external_relocs = (PTR) bfd_malloc ((size_t) external_relocs_size); - if (external_relocs == NULL && external_relocs_size != 0) - goto error_return; - - if (bfd_seek (input_bfd, input_section->rel_filepos, SEEK_SET) != 0 - || (bfd_read (external_relocs, 1, external_relocs_size, input_bfd) - != external_relocs_size)) - goto error_return; - } - - /* Relocate the section contents. */ - if (! ((*ecoff_backend (input_bfd)->relocate_section) - (output_bfd, info, input_bfd, input_section, contents, - external_relocs))) - goto error_return; - - /* Write out the relocated section. */ - if (! bfd_set_section_contents (output_bfd, - output_section, - (PTR) contents, - input_section->output_offset, - cooked_size)) - goto error_return; - - /* If we are producing relocateable output, the relocs were - modified, and we write them out now. We use the reloc_count - field of output_section to keep track of the number of relocs we - have output so far. */ - if (info->relocateable) - { - if (bfd_seek (output_bfd, - (output_section->rel_filepos + - output_section->reloc_count * external_reloc_size), - SEEK_SET) != 0 - || (bfd_write (external_relocs, 1, external_relocs_size, output_bfd) - != external_relocs_size)) - goto error_return; - output_section->reloc_count += input_section->reloc_count; - } - - if (contents != NULL) - free (contents); - if (external_relocs != NULL && section_tdata == NULL) - free (external_relocs); - return true; - - error_return: - if (contents != NULL) - free (contents); - if (external_relocs != NULL && section_tdata == NULL) - free (external_relocs); - return false; -} - -/* Generate a reloc when linking an ECOFF file. This is a reloc - requested by the linker, and does come from any input file. This - is used to build constructor and destructor tables when linking - with -Ur. */ - -static boolean -ecoff_reloc_link_order (output_bfd, info, output_section, link_order) - bfd *output_bfd; - struct bfd_link_info *info; - asection *output_section; - struct bfd_link_order *link_order; -{ - enum bfd_link_order_type type; - asection *section; - bfd_vma addend; - arelent rel; - struct internal_reloc in; - bfd_size_type external_reloc_size; - bfd_byte *rbuf; - boolean ok; - - type = link_order->type; - section = NULL; - addend = link_order->u.reloc.p->addend; - - /* We set up an arelent to pass to the backend adjust_reloc_out - routine. */ - rel.address = link_order->offset; - - rel.howto = bfd_reloc_type_lookup (output_bfd, link_order->u.reloc.p->reloc); - if (rel.howto == 0) - { - bfd_set_error (bfd_error_bad_value); - return false; - } - - if (type == bfd_section_reloc_link_order) - { - section = link_order->u.reloc.p->u.section; - rel.sym_ptr_ptr = section->symbol_ptr_ptr; - } - else - { - struct bfd_link_hash_entry *h; - - /* Treat a reloc against a defined symbol as though it were - actually against the section. */ - h = bfd_wrapped_link_hash_lookup (output_bfd, info, - link_order->u.reloc.p->u.name, - false, false, false); - if (h != NULL - && (h->type == bfd_link_hash_defined - || h->type == bfd_link_hash_defweak)) - { - type = bfd_section_reloc_link_order; - section = h->u.def.section->output_section; - /* It seems that we ought to add the symbol value to the - addend here, but in practice it has already been added - because it was passed to constructor_callback. */ - addend += section->vma + h->u.def.section->output_offset; - } - else - { - /* We can't set up a reloc against a symbol correctly, - because we have no asymbol structure. Currently no - adjust_reloc_out routine cares. */ - rel.sym_ptr_ptr = (asymbol **) NULL; - } - } - - /* All ECOFF relocs are in-place. Put the addend into the object - file. */ - - BFD_ASSERT (rel.howto->partial_inplace); - if (addend != 0) - { - bfd_size_type size; - bfd_reloc_status_type rstat; - bfd_byte *buf; - boolean ok; - - size = bfd_get_reloc_size (rel.howto); - buf = (bfd_byte *) bfd_zmalloc (size); - if (buf == (bfd_byte *) NULL) - return false; - rstat = _bfd_relocate_contents (rel.howto, output_bfd, addend, buf); - switch (rstat) - { - case bfd_reloc_ok: - break; - default: - case bfd_reloc_outofrange: - abort (); - case bfd_reloc_overflow: - if (! ((*info->callbacks->reloc_overflow) - (info, - (link_order->type == bfd_section_reloc_link_order - ? bfd_section_name (output_bfd, section) - : link_order->u.reloc.p->u.name), - rel.howto->name, addend, (bfd *) NULL, - (asection *) NULL, (bfd_vma) 0))) - { - free (buf); - return false; - } - break; - } - ok = bfd_set_section_contents (output_bfd, output_section, (PTR) buf, - (file_ptr) link_order->offset, size); - free (buf); - if (! ok) - return false; - } - - rel.addend = 0; - - /* Move the information into a internal_reloc structure. */ - in.r_vaddr = (rel.address - + bfd_get_section_vma (output_bfd, output_section)); - in.r_type = rel.howto->type; - - if (type == bfd_symbol_reloc_link_order) - { - struct ecoff_link_hash_entry *h; - - h = ((struct ecoff_link_hash_entry *) - bfd_wrapped_link_hash_lookup (output_bfd, info, - link_order->u.reloc.p->u.name, - false, false, true)); - if (h != (struct ecoff_link_hash_entry *) NULL - && h->indx != -1) - in.r_symndx = h->indx; - else - { - if (! ((*info->callbacks->unattached_reloc) - (info, link_order->u.reloc.p->u.name, (bfd *) NULL, - (asection *) NULL, (bfd_vma) 0))) - return false; - in.r_symndx = 0; - } - in.r_extern = 1; - } - else - { - CONST char *name; - - name = bfd_get_section_name (output_bfd, section); - if (strcmp (name, ".text") == 0) - in.r_symndx = RELOC_SECTION_TEXT; - else if (strcmp (name, ".rdata") == 0) - in.r_symndx = RELOC_SECTION_RDATA; - else if (strcmp (name, ".data") == 0) - in.r_symndx = RELOC_SECTION_DATA; - else if (strcmp (name, ".sdata") == 0) - in.r_symndx = RELOC_SECTION_SDATA; - else if (strcmp (name, ".sbss") == 0) - in.r_symndx = RELOC_SECTION_SBSS; - else if (strcmp (name, ".bss") == 0) - in.r_symndx = RELOC_SECTION_BSS; - else if (strcmp (name, ".init") == 0) - in.r_symndx = RELOC_SECTION_INIT; - else if (strcmp (name, ".lit8") == 0) - in.r_symndx = RELOC_SECTION_LIT8; - else if (strcmp (name, ".lit4") == 0) - in.r_symndx = RELOC_SECTION_LIT4; - else if (strcmp (name, ".xdata") == 0) - in.r_symndx = RELOC_SECTION_XDATA; - else if (strcmp (name, ".pdata") == 0) - in.r_symndx = RELOC_SECTION_PDATA; - else if (strcmp (name, ".fini") == 0) - in.r_symndx = RELOC_SECTION_FINI; - else if (strcmp (name, ".lita") == 0) - in.r_symndx = RELOC_SECTION_LITA; - else if (strcmp (name, "*ABS*") == 0) - in.r_symndx = RELOC_SECTION_ABS; - else if (strcmp (name, ".rconst") == 0) - in.r_symndx = RELOC_SECTION_RCONST; - else - abort (); - in.r_extern = 0; - } - - /* Let the BFD backend adjust the reloc. */ - (*ecoff_backend (output_bfd)->adjust_reloc_out) (output_bfd, &rel, &in); - - /* Get some memory and swap out the reloc. */ - external_reloc_size = ecoff_backend (output_bfd)->external_reloc_size; - rbuf = (bfd_byte *) bfd_malloc ((size_t) external_reloc_size); - if (rbuf == (bfd_byte *) NULL) - return false; - - (*ecoff_backend (output_bfd)->swap_reloc_out) (output_bfd, &in, (PTR) rbuf); - - ok = (bfd_seek (output_bfd, - (output_section->rel_filepos + - output_section->reloc_count * external_reloc_size), - SEEK_SET) == 0 - && (bfd_write ((PTR) rbuf, 1, external_reloc_size, output_bfd) - == external_reloc_size)); - - if (ok) - ++output_section->reloc_count; - - free (rbuf); - - return ok; -} diff --git a/contrib/gdb/bfd/ecofflink.c b/contrib/gdb/bfd/ecofflink.c deleted file mode 100644 index 03d6e00ad188e..0000000000000 --- a/contrib/gdb/bfd/ecofflink.c +++ /dev/null @@ -1,2452 +0,0 @@ -/* Routines to link ECOFF debugging information. - Copyright 1993 Free Software Foundation, Inc. - Written by Ian Lance Taylor, Cygnus Support, <ian@cygnus.com>. - -This file is part of BFD, the Binary File Descriptor library. - -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 2 of the License, 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ - -#include "bfd.h" -#include "sysdep.h" -#include "bfdlink.h" -#include "libbfd.h" -#include "obstack.h" -#include "aout/stab_gnu.h" -#include "coff/internal.h" -#include "coff/sym.h" -#include "coff/symconst.h" -#include "coff/ecoff.h" - -static boolean ecoff_add_bytes PARAMS ((char **buf, char **bufend, - size_t need)); -static struct bfd_hash_entry *string_hash_newfunc - PARAMS ((struct bfd_hash_entry *, struct bfd_hash_table *, - const char *)); -static void ecoff_align_debug PARAMS ((bfd *abfd, - struct ecoff_debug_info *debug, - const struct ecoff_debug_swap *swap)); -static boolean ecoff_write_symhdr PARAMS ((bfd *, struct ecoff_debug_info *, - const struct ecoff_debug_swap *, - file_ptr where)); -static int cmp_fdrtab_entry PARAMS ((const PTR, const PTR)); -static boolean mk_fdrtab PARAMS ((bfd *, - struct ecoff_debug_info * const, - const struct ecoff_debug_swap * const, - struct ecoff_find_line *)); -static long fdrtab_lookup PARAMS ((struct ecoff_find_line *, bfd_vma)); - -/* Obstack allocation and deallocation routines. */ -#define obstack_chunk_alloc malloc -#define obstack_chunk_free free - -/* Routines to swap auxiliary information in and out. I am assuming - that the auxiliary information format is always going to be target - independent. */ - -/* Swap in a type information record. - BIGEND says whether AUX symbols are big-endian or little-endian; this - info comes from the file header record (fh-fBigendian). */ - -void -_bfd_ecoff_swap_tir_in (bigend, ext_copy, intern) - int bigend; - const struct tir_ext *ext_copy; - TIR *intern; -{ - struct tir_ext ext[1]; - - *ext = *ext_copy; /* Make it reasonable to do in-place. */ - - /* now the fun stuff... */ - if (bigend) { - intern->fBitfield = 0 != (ext->t_bits1[0] & TIR_BITS1_FBITFIELD_BIG); - intern->continued = 0 != (ext->t_bits1[0] & TIR_BITS1_CONTINUED_BIG); - intern->bt = (ext->t_bits1[0] & TIR_BITS1_BT_BIG) - >> TIR_BITS1_BT_SH_BIG; - intern->tq4 = (ext->t_tq45[0] & TIR_BITS_TQ4_BIG) - >> TIR_BITS_TQ4_SH_BIG; - intern->tq5 = (ext->t_tq45[0] & TIR_BITS_TQ5_BIG) - >> TIR_BITS_TQ5_SH_BIG; - intern->tq0 = (ext->t_tq01[0] & TIR_BITS_TQ0_BIG) - >> TIR_BITS_TQ0_SH_BIG; - intern->tq1 = (ext->t_tq01[0] & TIR_BITS_TQ1_BIG) - >> TIR_BITS_TQ1_SH_BIG; - intern->tq2 = (ext->t_tq23[0] & TIR_BITS_TQ2_BIG) - >> TIR_BITS_TQ2_SH_BIG; - intern->tq3 = (ext->t_tq23[0] & TIR_BITS_TQ3_BIG) - >> TIR_BITS_TQ3_SH_BIG; - } else { - intern->fBitfield = 0 != (ext->t_bits1[0] & TIR_BITS1_FBITFIELD_LITTLE); - intern->continued = 0 != (ext->t_bits1[0] & TIR_BITS1_CONTINUED_LITTLE); - intern->bt = (ext->t_bits1[0] & TIR_BITS1_BT_LITTLE) - >> TIR_BITS1_BT_SH_LITTLE; - intern->tq4 = (ext->t_tq45[0] & TIR_BITS_TQ4_LITTLE) - >> TIR_BITS_TQ4_SH_LITTLE; - intern->tq5 = (ext->t_tq45[0] & TIR_BITS_TQ5_LITTLE) - >> TIR_BITS_TQ5_SH_LITTLE; - intern->tq0 = (ext->t_tq01[0] & TIR_BITS_TQ0_LITTLE) - >> TIR_BITS_TQ0_SH_LITTLE; - intern->tq1 = (ext->t_tq01[0] & TIR_BITS_TQ1_LITTLE) - >> TIR_BITS_TQ1_SH_LITTLE; - intern->tq2 = (ext->t_tq23[0] & TIR_BITS_TQ2_LITTLE) - >> TIR_BITS_TQ2_SH_LITTLE; - intern->tq3 = (ext->t_tq23[0] & TIR_BITS_TQ3_LITTLE) - >> TIR_BITS_TQ3_SH_LITTLE; - } - -#ifdef TEST - if (memcmp ((char *)ext, (char *)intern, sizeof (*intern)) != 0) - abort(); -#endif -} - -/* Swap out a type information record. - BIGEND says whether AUX symbols are big-endian or little-endian; this - info comes from the file header record (fh-fBigendian). */ - -void -_bfd_ecoff_swap_tir_out (bigend, intern_copy, ext) - int bigend; - const TIR *intern_copy; - struct tir_ext *ext; -{ - TIR intern[1]; - - *intern = *intern_copy; /* Make it reasonable to do in-place. */ - - /* now the fun stuff... */ - if (bigend) { - ext->t_bits1[0] = ((intern->fBitfield ? TIR_BITS1_FBITFIELD_BIG : 0) - | (intern->continued ? TIR_BITS1_CONTINUED_BIG : 0) - | ((intern->bt << TIR_BITS1_BT_SH_BIG) - & TIR_BITS1_BT_BIG)); - ext->t_tq45[0] = (((intern->tq4 << TIR_BITS_TQ4_SH_BIG) - & TIR_BITS_TQ4_BIG) - | ((intern->tq5 << TIR_BITS_TQ5_SH_BIG) - & TIR_BITS_TQ5_BIG)); - ext->t_tq01[0] = (((intern->tq0 << TIR_BITS_TQ0_SH_BIG) - & TIR_BITS_TQ0_BIG) - | ((intern->tq1 << TIR_BITS_TQ1_SH_BIG) - & TIR_BITS_TQ1_BIG)); - ext->t_tq23[0] = (((intern->tq2 << TIR_BITS_TQ2_SH_BIG) - & TIR_BITS_TQ2_BIG) - | ((intern->tq3 << TIR_BITS_TQ3_SH_BIG) - & TIR_BITS_TQ3_BIG)); - } else { - ext->t_bits1[0] = ((intern->fBitfield ? TIR_BITS1_FBITFIELD_LITTLE : 0) - | (intern->continued ? TIR_BITS1_CONTINUED_LITTLE : 0) - | ((intern->bt << TIR_BITS1_BT_SH_LITTLE) - & TIR_BITS1_BT_LITTLE)); - ext->t_tq45[0] = (((intern->tq4 << TIR_BITS_TQ4_SH_LITTLE) - & TIR_BITS_TQ4_LITTLE) - | ((intern->tq5 << TIR_BITS_TQ5_SH_LITTLE) - & TIR_BITS_TQ5_LITTLE)); - ext->t_tq01[0] = (((intern->tq0 << TIR_BITS_TQ0_SH_LITTLE) - & TIR_BITS_TQ0_LITTLE) - | ((intern->tq1 << TIR_BITS_TQ1_SH_LITTLE) - & TIR_BITS_TQ1_LITTLE)); - ext->t_tq23[0] = (((intern->tq2 << TIR_BITS_TQ2_SH_LITTLE) - & TIR_BITS_TQ2_LITTLE) - | ((intern->tq3 << TIR_BITS_TQ3_SH_LITTLE) - & TIR_BITS_TQ3_LITTLE)); - } - -#ifdef TEST - if (memcmp ((char *)ext, (char *)intern, sizeof (*intern)) != 0) - abort(); -#endif -} - -/* Swap in a relative symbol record. BIGEND says whether it is in - big-endian or little-endian format.*/ - -void -_bfd_ecoff_swap_rndx_in (bigend, ext_copy, intern) - int bigend; - const struct rndx_ext *ext_copy; - RNDXR *intern; -{ - struct rndx_ext ext[1]; - - *ext = *ext_copy; /* Make it reasonable to do in-place. */ - - /* now the fun stuff... */ - if (bigend) { - intern->rfd = (ext->r_bits[0] << RNDX_BITS0_RFD_SH_LEFT_BIG) - | ((ext->r_bits[1] & RNDX_BITS1_RFD_BIG) - >> RNDX_BITS1_RFD_SH_BIG); - intern->index = ((ext->r_bits[1] & RNDX_BITS1_INDEX_BIG) - << RNDX_BITS1_INDEX_SH_LEFT_BIG) - | (ext->r_bits[2] << RNDX_BITS2_INDEX_SH_LEFT_BIG) - | (ext->r_bits[3] << RNDX_BITS3_INDEX_SH_LEFT_BIG); - } else { - intern->rfd = (ext->r_bits[0] << RNDX_BITS0_RFD_SH_LEFT_LITTLE) - | ((ext->r_bits[1] & RNDX_BITS1_RFD_LITTLE) - << RNDX_BITS1_RFD_SH_LEFT_LITTLE); - intern->index = ((ext->r_bits[1] & RNDX_BITS1_INDEX_LITTLE) - >> RNDX_BITS1_INDEX_SH_LITTLE) - | (ext->r_bits[2] << RNDX_BITS2_INDEX_SH_LEFT_LITTLE) - | ((unsigned int) ext->r_bits[3] - << RNDX_BITS3_INDEX_SH_LEFT_LITTLE); - } - -#ifdef TEST - if (memcmp ((char *)ext, (char *)intern, sizeof (*intern)) != 0) - abort(); -#endif -} - -/* Swap out a relative symbol record. BIGEND says whether it is in - big-endian or little-endian format.*/ - -void -_bfd_ecoff_swap_rndx_out (bigend, intern_copy, ext) - int bigend; - const RNDXR *intern_copy; - struct rndx_ext *ext; -{ - RNDXR intern[1]; - - *intern = *intern_copy; /* Make it reasonable to do in-place. */ - - /* now the fun stuff... */ - if (bigend) { - ext->r_bits[0] = intern->rfd >> RNDX_BITS0_RFD_SH_LEFT_BIG; - ext->r_bits[1] = (((intern->rfd << RNDX_BITS1_RFD_SH_BIG) - & RNDX_BITS1_RFD_BIG) - | ((intern->index >> RNDX_BITS1_INDEX_SH_LEFT_BIG) - & RNDX_BITS1_INDEX_BIG)); - ext->r_bits[2] = intern->index >> RNDX_BITS2_INDEX_SH_LEFT_BIG; - ext->r_bits[3] = intern->index >> RNDX_BITS3_INDEX_SH_LEFT_BIG; - } else { - ext->r_bits[0] = intern->rfd >> RNDX_BITS0_RFD_SH_LEFT_LITTLE; - ext->r_bits[1] = (((intern->rfd >> RNDX_BITS1_RFD_SH_LEFT_LITTLE) - & RNDX_BITS1_RFD_LITTLE) - | ((intern->index << RNDX_BITS1_INDEX_SH_LITTLE) - & RNDX_BITS1_INDEX_LITTLE)); - ext->r_bits[2] = intern->index >> RNDX_BITS2_INDEX_SH_LEFT_LITTLE; - ext->r_bits[3] = intern->index >> RNDX_BITS3_INDEX_SH_LEFT_LITTLE; - } - -#ifdef TEST - if (memcmp ((char *)ext, (char *)intern, sizeof (*intern)) != 0) - abort(); -#endif -} - -/* The minimum amount of data to allocate. */ -#define ALLOC_SIZE (4064) - -/* Add bytes to a buffer. Return success. */ - -static boolean -ecoff_add_bytes (buf, bufend, need) - char **buf; - char **bufend; - size_t need; -{ - size_t have; - size_t want; - char *newbuf; - - have = *bufend - *buf; - if (have > need) - want = ALLOC_SIZE; - else - { - want = need - have; - if (want < ALLOC_SIZE) - want = ALLOC_SIZE; - } - newbuf = (char *) bfd_realloc (*buf, have + want); - if (newbuf == NULL) - return false; - *buf = newbuf; - *bufend = *buf + have + want; - return true; -} - -/* We keep a hash table which maps strings to numbers. We use it to - map FDR names to indices in the output file, and to map local - strings when combining stabs debugging information. */ - -struct string_hash_entry -{ - struct bfd_hash_entry root; - /* FDR index or string table offset. */ - long val; - /* Next entry in string table. */ - struct string_hash_entry *next; -}; - -struct string_hash_table -{ - struct bfd_hash_table table; -}; - -/* Routine to create an entry in a string hash table. */ - -static struct bfd_hash_entry * -string_hash_newfunc (entry, table, string) - struct bfd_hash_entry *entry; - struct bfd_hash_table *table; - const char *string; -{ - struct string_hash_entry *ret = (struct string_hash_entry *) entry; - - /* Allocate the structure if it has not already been allocated by a - subclass. */ - if (ret == (struct string_hash_entry *) NULL) - ret = ((struct string_hash_entry *) - bfd_hash_allocate (table, sizeof (struct string_hash_entry))); - if (ret == (struct string_hash_entry *) NULL) - return NULL; - - /* Call the allocation method of the superclass. */ - ret = ((struct string_hash_entry *) - bfd_hash_newfunc ((struct bfd_hash_entry *) ret, table, string)); - - if (ret) - { - /* Initialize the local fields. */ - ret->val = -1; - ret->next = NULL; - } - - return (struct bfd_hash_entry *) ret; -} - -/* Look up an entry in an string hash table. */ - -#define string_hash_lookup(t, string, create, copy) \ - ((struct string_hash_entry *) \ - bfd_hash_lookup (&(t)->table, (string), (create), (copy))) - -/* We can't afford to read in all the debugging information when we do - a link. Instead, we build a list of these structures to show how - different parts of the input file map to the output file. */ - -struct shuffle -{ - /* The next entry in this linked list. */ - struct shuffle *next; - /* The length of the information. */ - unsigned long size; - /* Whether this information comes from a file or not. */ - boolean filep; - union - { - struct - { - /* The BFD the data comes from. */ - bfd *input_bfd; - /* The offset within input_bfd. */ - file_ptr offset; - } file; - /* The data to be written out. */ - PTR memory; - } u; -}; - -/* This structure holds information across calls to - bfd_ecoff_debug_accumulate. */ - -struct accumulate -{ - /* The FDR hash table. */ - struct string_hash_table fdr_hash; - /* The strings hash table. */ - struct string_hash_table str_hash; - /* Linked lists describing how to shuffle the input debug - information into the output file. We keep a pointer to both the - head and the tail. */ - struct shuffle *line; - struct shuffle *line_end; - struct shuffle *pdr; - struct shuffle *pdr_end; - struct shuffle *sym; - struct shuffle *sym_end; - struct shuffle *opt; - struct shuffle *opt_end; - struct shuffle *aux; - struct shuffle *aux_end; - struct shuffle *ss; - struct shuffle *ss_end; - struct string_hash_entry *ss_hash; - struct string_hash_entry *ss_hash_end; - struct shuffle *fdr; - struct shuffle *fdr_end; - struct shuffle *rfd; - struct shuffle *rfd_end; - /* The size of the largest file shuffle. */ - unsigned long largest_file_shuffle; - /* An obstack for debugging information. */ - struct obstack memory; -}; - -/* Add a file entry to a shuffle list. */ - -static boolean add_file_shuffle PARAMS ((struct accumulate *, - struct shuffle **, - struct shuffle **, bfd *, file_ptr, - unsigned long)); - -static boolean -add_file_shuffle (ainfo, head, tail, input_bfd, offset, size) - struct accumulate *ainfo; - struct shuffle **head; - struct shuffle **tail; - bfd *input_bfd; - file_ptr offset; - unsigned long size; -{ - struct shuffle *n; - - if (*tail != (struct shuffle *) NULL - && (*tail)->filep - && (*tail)->u.file.input_bfd == input_bfd - && (*tail)->u.file.offset + (*tail)->size == (unsigned long) offset) - { - /* Just merge this entry onto the existing one. */ - (*tail)->size += size; - if ((*tail)->size > ainfo->largest_file_shuffle) - ainfo->largest_file_shuffle = (*tail)->size; - return true; - } - - n = (struct shuffle *) obstack_alloc (&ainfo->memory, - sizeof (struct shuffle)); - if (!n) - { - bfd_set_error (bfd_error_no_memory); - return false; - } - n->next = NULL; - n->size = size; - n->filep = true; - n->u.file.input_bfd = input_bfd; - n->u.file.offset = offset; - if (*head == (struct shuffle *) NULL) - *head = n; - if (*tail != (struct shuffle *) NULL) - (*tail)->next = n; - *tail = n; - if (size > ainfo->largest_file_shuffle) - ainfo->largest_file_shuffle = size; - return true; -} - -/* Add a memory entry to a shuffle list. */ - -static boolean add_memory_shuffle PARAMS ((struct accumulate *, - struct shuffle **head, - struct shuffle **tail, - bfd_byte *data, unsigned long size)); - -static boolean -add_memory_shuffle (ainfo, head, tail, data, size) - struct accumulate *ainfo; - struct shuffle **head; - struct shuffle **tail; - bfd_byte *data; - unsigned long size; -{ - struct shuffle *n; - - n = (struct shuffle *) obstack_alloc (&ainfo->memory, - sizeof (struct shuffle)); - if (!n) - { - bfd_set_error (bfd_error_no_memory); - return false; - } - n->next = NULL; - n->size = size; - n->filep = false; - n->u.memory = (PTR) data; - if (*head == (struct shuffle *) NULL) - *head = n; - if (*tail != (struct shuffle *) NULL) - (*tail)->next = n; - *tail = n; - return true; -} - -/* Initialize the FDR hash table. This returns a handle which is then - passed in to bfd_ecoff_debug_accumulate, et. al. */ - -/*ARGSUSED*/ -PTR -bfd_ecoff_debug_init (output_bfd, output_debug, output_swap, info) - bfd *output_bfd; - struct ecoff_debug_info *output_debug; - const struct ecoff_debug_swap *output_swap; - struct bfd_link_info *info; -{ - struct accumulate *ainfo; - - ainfo = (struct accumulate *) bfd_malloc (sizeof (struct accumulate)); - if (!ainfo) - return NULL; - if (! bfd_hash_table_init_n (&ainfo->fdr_hash.table, string_hash_newfunc, - 1021)) - return NULL; - - ainfo->line = NULL; - ainfo->line_end = NULL; - ainfo->pdr = NULL; - ainfo->pdr_end = NULL; - ainfo->sym = NULL; - ainfo->sym_end = NULL; - ainfo->opt = NULL; - ainfo->opt_end = NULL; - ainfo->aux = NULL; - ainfo->aux_end = NULL; - ainfo->ss = NULL; - ainfo->ss_end = NULL; - ainfo->ss_hash = NULL; - ainfo->ss_hash_end = NULL; - ainfo->fdr = NULL; - ainfo->fdr_end = NULL; - ainfo->rfd = NULL; - ainfo->rfd_end = NULL; - - ainfo->largest_file_shuffle = 0; - - if (! info->relocateable) - { - if (! bfd_hash_table_init (&ainfo->str_hash.table, string_hash_newfunc)) - return NULL; - - /* The first entry in the string table is the empty string. */ - output_debug->symbolic_header.issMax = 1; - } - - if (!obstack_begin (&ainfo->memory, 4050)) - { - bfd_set_error (bfd_error_no_memory); - return NULL; - } - - return (PTR) ainfo; -} - -/* Free the accumulated debugging information. */ - -/*ARGSUSED*/ -void -bfd_ecoff_debug_free (handle, output_bfd, output_debug, output_swap, info) - PTR handle; - bfd *output_bfd; - struct ecoff_debug_info *output_debug; - const struct ecoff_debug_swap *output_swap; - struct bfd_link_info *info; -{ - struct accumulate *ainfo = (struct accumulate *) handle; - - bfd_hash_table_free (&ainfo->fdr_hash.table); - - if (! info->relocateable) - bfd_hash_table_free (&ainfo->str_hash.table); - - obstack_free (&ainfo->memory, (PTR) NULL); - - free (ainfo); -} - -/* Accumulate the debugging information from INPUT_BFD into - OUTPUT_BFD. The INPUT_DEBUG argument points to some ECOFF - debugging information which we want to link into the information - pointed to by the OUTPUT_DEBUG argument. OUTPUT_SWAP and - INPUT_SWAP point to the swapping information needed. INFO is the - linker information structure. HANDLE is returned by - bfd_ecoff_debug_init. */ - -/*ARGSUSED*/ -boolean -bfd_ecoff_debug_accumulate (handle, output_bfd, output_debug, output_swap, - input_bfd, input_debug, input_swap, - info) - PTR handle; - bfd *output_bfd; - struct ecoff_debug_info *output_debug; - const struct ecoff_debug_swap *output_swap; - bfd *input_bfd; - struct ecoff_debug_info *input_debug; - const struct ecoff_debug_swap *input_swap; - struct bfd_link_info *info; -{ - struct accumulate *ainfo = (struct accumulate *) handle; - void (* const swap_sym_in) PARAMS ((bfd *, PTR, SYMR *)) - = input_swap->swap_sym_in; - void (* const swap_rfd_in) PARAMS ((bfd *, PTR, RFDT *)) - = input_swap->swap_rfd_in; - void (* const swap_sym_out) PARAMS ((bfd *, const SYMR *, PTR)) - = output_swap->swap_sym_out; - void (* const swap_fdr_out) PARAMS ((bfd *, const FDR *, PTR)) - = output_swap->swap_fdr_out; - void (* const swap_rfd_out) PARAMS ((bfd *, const RFDT *, PTR)) - = output_swap->swap_rfd_out; - bfd_size_type external_pdr_size = output_swap->external_pdr_size; - bfd_size_type external_sym_size = output_swap->external_sym_size; - bfd_size_type external_opt_size = output_swap->external_opt_size; - bfd_size_type external_fdr_size = output_swap->external_fdr_size; - bfd_size_type external_rfd_size = output_swap->external_rfd_size; - HDRR * const output_symhdr = &output_debug->symbolic_header; - HDRR * const input_symhdr = &input_debug->symbolic_header; - bfd_vma section_adjust[scMax]; - asection *sec; - bfd_byte *fdr_start; - bfd_byte *fdr_ptr; - bfd_byte *fdr_end; - bfd_size_type fdr_add; - unsigned int copied; - RFDT i; - unsigned long sz; - bfd_byte *rfd_out; - bfd_byte *rfd_in; - bfd_byte *rfd_end; - long newrfdbase = 0; - long oldrfdbase = 0; - bfd_byte *fdr_out; - - /* Use section_adjust to hold the value to add to a symbol in a - particular section. */ - memset ((PTR) section_adjust, 0, sizeof section_adjust); - -#define SET(name, indx) \ - sec = bfd_get_section_by_name (input_bfd, name); \ - if (sec != NULL) \ - section_adjust[indx] = (sec->output_section->vma \ - + sec->output_offset \ - - sec->vma); - - SET (".text", scText); - SET (".data", scData); - SET (".bss", scBss); - SET (".sdata", scSData); - SET (".sbss", scSBss); - /* scRdata section may be either .rdata or .rodata. */ - SET (".rdata", scRData); - SET (".rodata", scRData); - SET (".init", scInit); - SET (".fini", scFini); - SET (".rconst", scRConst); - -#undef SET - - /* Find all the debugging information based on the FDR's. We need - to handle them whether they are swapped or not. */ - if (input_debug->fdr != (FDR *) NULL) - { - fdr_start = (bfd_byte *) input_debug->fdr; - fdr_add = sizeof (FDR); - } - else - { - fdr_start = (bfd_byte *) input_debug->external_fdr; - fdr_add = input_swap->external_fdr_size; - } - fdr_end = fdr_start + input_symhdr->ifdMax * fdr_add; - - input_debug->ifdmap = (RFDT *) bfd_alloc (input_bfd, - (input_symhdr->ifdMax - * sizeof (RFDT))); - - sz = (input_symhdr->crfd + input_symhdr->ifdMax) * external_rfd_size; - rfd_out = (bfd_byte *) obstack_alloc (&ainfo->memory, sz); - if (!input_debug->ifdmap || !rfd_out) - { - bfd_set_error (bfd_error_no_memory); - return false; - } - if (!add_memory_shuffle (ainfo, &ainfo->rfd, &ainfo->rfd_end, rfd_out, sz)) - return false; - - copied = 0; - - /* Look through the FDR's to see which ones we are going to include - in the final output. We do not want duplicate FDR information - for header files, because ECOFF debugging is often very large. - When we find an FDR with no line information which can be merged, - we look it up in a hash table to ensure that we only include it - once. We keep a table mapping FDR numbers to the final number - they get with the BFD, so that we can refer to it when we write - out the external symbols. */ - for (fdr_ptr = fdr_start, i = 0; - fdr_ptr < fdr_end; - fdr_ptr += fdr_add, i++, rfd_out += external_rfd_size) - { - FDR fdr; - - if (input_debug->fdr != (FDR *) NULL) - fdr = *(FDR *) fdr_ptr; - else - (*input_swap->swap_fdr_in) (input_bfd, (PTR) fdr_ptr, &fdr); - - /* See if this FDR can be merged with an existing one. */ - if (fdr.cbLine == 0 && fdr.rss != -1 && fdr.fMerge) - { - const char *name; - char *lookup; - struct string_hash_entry *fh; - - /* We look up a string formed from the file name and the - number of symbols. Sometimes an include file will - conditionally define a typedef or something based on the - order of include files. Using the number of symbols as a - hash reduces the chance that we will merge symbol - information that should not be merged. */ - name = input_debug->ss + fdr.issBase + fdr.rss; - - lookup = (char *) bfd_malloc (strlen (name) + 20); - if (lookup == NULL) - return false; - sprintf (lookup, "%s %lx", name, fdr.csym); - - fh = string_hash_lookup (&ainfo->fdr_hash, lookup, true, true); - free (lookup); - if (fh == (struct string_hash_entry *) NULL) - return false; - - if (fh->val != -1) - { - input_debug->ifdmap[i] = fh->val; - (*swap_rfd_out) (output_bfd, input_debug->ifdmap + i, - (PTR) rfd_out); - - /* Don't copy this FDR. */ - continue; - } - - fh->val = output_symhdr->ifdMax + copied; - } - - input_debug->ifdmap[i] = output_symhdr->ifdMax + copied; - (*swap_rfd_out) (output_bfd, input_debug->ifdmap + i, (PTR) rfd_out); - ++copied; - } - - newrfdbase = output_symhdr->crfd; - output_symhdr->crfd += input_symhdr->ifdMax; - - /* Copy over any existing RFD's. RFD's are only created by the - linker, so this will only happen for input files which are the - result of a partial link. */ - rfd_in = (bfd_byte *) input_debug->external_rfd; - rfd_end = rfd_in + input_symhdr->crfd * input_swap->external_rfd_size; - for (; - rfd_in < rfd_end; - rfd_in += input_swap->external_rfd_size) - { - RFDT rfd; - - (*swap_rfd_in) (input_bfd, (PTR) rfd_in, &rfd); - BFD_ASSERT (rfd >= 0 && rfd < input_symhdr->ifdMax); - rfd = input_debug->ifdmap[rfd]; - (*swap_rfd_out) (output_bfd, &rfd, (PTR) rfd_out); - rfd_out += external_rfd_size; - } - - oldrfdbase = output_symhdr->crfd; - output_symhdr->crfd += input_symhdr->crfd; - - /* Look through the FDR's and copy over all associated debugging - information. */ - sz = copied * external_fdr_size; - fdr_out = (bfd_byte *) obstack_alloc (&ainfo->memory, sz); - if (!fdr_out) - { - bfd_set_error (bfd_error_no_memory); - return false; - } - if (!add_memory_shuffle (ainfo, &ainfo->fdr, &ainfo->fdr_end, fdr_out, sz)) - return false; - for (fdr_ptr = fdr_start, i = 0; - fdr_ptr < fdr_end; - fdr_ptr += fdr_add, i++) - { - FDR fdr; - bfd_vma fdr_adr; - bfd_byte *sym_out; - bfd_byte *lraw_src; - bfd_byte *lraw_end; - boolean fgotfilename; - - if (input_debug->ifdmap[i] < output_symhdr->ifdMax) - { - /* We are not copying this FDR. */ - continue; - } - - if (input_debug->fdr != (FDR *) NULL) - fdr = *(FDR *) fdr_ptr; - else - (*input_swap->swap_fdr_in) (input_bfd, (PTR) fdr_ptr, &fdr); - - fdr_adr = fdr.adr; - - /* Adjust the FDR address for any changes that may have been - made by relaxing. */ - if (input_debug->adjust != (struct ecoff_value_adjust *) NULL) - { - struct ecoff_value_adjust *adjust; - - for (adjust = input_debug->adjust; - adjust != (struct ecoff_value_adjust *) NULL; - adjust = adjust->next) - if (fdr_adr >= adjust->start - && fdr_adr < adjust->end) - fdr.adr += adjust->adjust; - } - - /* FIXME: It is conceivable that this FDR points to the .init or - .fini section, in which case this will not do the right - thing. */ - fdr.adr += section_adjust[scText]; - - /* Swap in the local symbols, adjust their values, and swap them - out again. */ - fgotfilename = false; - sz = fdr.csym * external_sym_size; - sym_out = (bfd_byte *) obstack_alloc (&ainfo->memory, sz); - if (!sym_out) - { - bfd_set_error (bfd_error_no_memory); - return false; - } - if (!add_memory_shuffle (ainfo, &ainfo->sym, &ainfo->sym_end, sym_out, - sz)) - return false; - lraw_src = ((bfd_byte *) input_debug->external_sym - + fdr.isymBase * input_swap->external_sym_size); - lraw_end = lraw_src + fdr.csym * input_swap->external_sym_size; - for (; lraw_src < lraw_end; lraw_src += input_swap->external_sym_size) - { - SYMR internal_sym; - - (*swap_sym_in) (input_bfd, (PTR) lraw_src, &internal_sym); - - BFD_ASSERT (internal_sym.sc != scCommon - && internal_sym.sc != scSCommon); - - /* Adjust the symbol value if appropriate. */ - switch (internal_sym.st) - { - case stNil: - if (ECOFF_IS_STAB (&internal_sym)) - break; - /* Fall through. */ - case stGlobal: - case stStatic: - case stLabel: - case stProc: - case stStaticProc: - if (input_debug->adjust != (struct ecoff_value_adjust *) NULL) - { - bfd_vma value; - struct ecoff_value_adjust *adjust; - - value = internal_sym.value; - for (adjust = input_debug->adjust; - adjust != (struct ecoff_value_adjust *) NULL; - adjust = adjust->next) - if (value >= adjust->start - && value < adjust->end) - internal_sym.value += adjust->adjust; - } - internal_sym.value += section_adjust[internal_sym.sc]; - break; - - default: - break; - } - - /* If we are doing a final link, we hash all the strings in - the local symbol table together. This reduces the amount - of space required by debugging information. We don't do - this when performing a relocateable link because it would - prevent us from easily merging different FDR's. */ - if (! info->relocateable) - { - boolean ffilename; - const char *name; - - if (! fgotfilename && internal_sym.iss == fdr.rss) - ffilename = true; - else - ffilename = false; - - /* Hash the name into the string table. */ - name = input_debug->ss + fdr.issBase + internal_sym.iss; - if (*name == '\0') - internal_sym.iss = 0; - else - { - struct string_hash_entry *sh; - - sh = string_hash_lookup (&ainfo->str_hash, name, true, true); - if (sh == (struct string_hash_entry *) NULL) - return false; - if (sh->val == -1) - { - sh->val = output_symhdr->issMax; - output_symhdr->issMax += strlen (name) + 1; - if (ainfo->ss_hash == (struct string_hash_entry *) NULL) - ainfo->ss_hash = sh; - if (ainfo->ss_hash_end - != (struct string_hash_entry *) NULL) - ainfo->ss_hash_end->next = sh; - ainfo->ss_hash_end = sh; - } - internal_sym.iss = sh->val; - } - - if (ffilename) - { - fdr.rss = internal_sym.iss; - fgotfilename = true; - } - } - - (*swap_sym_out) (output_bfd, &internal_sym, sym_out); - sym_out += external_sym_size; - } - - fdr.isymBase = output_symhdr->isymMax; - output_symhdr->isymMax += fdr.csym; - - /* Copy the information that does not need swapping. */ - - /* FIXME: If we are relaxing, we need to adjust the line - numbers. Frankly, forget it. Anybody using stabs debugging - information will not use this line number information, and - stabs are adjusted correctly. */ - if (fdr.cbLine > 0) - { - if (!add_file_shuffle (ainfo, &ainfo->line, &ainfo->line_end, - input_bfd, - input_symhdr->cbLineOffset + fdr.cbLineOffset, - fdr.cbLine)) - return false; - fdr.ilineBase = output_symhdr->ilineMax; - fdr.cbLineOffset = output_symhdr->cbLine; - output_symhdr->ilineMax += fdr.cline; - output_symhdr->cbLine += fdr.cbLine; - } - if (fdr.caux > 0) - { - if (!add_file_shuffle (ainfo, &ainfo->aux, &ainfo->aux_end, - input_bfd, - (input_symhdr->cbAuxOffset - + fdr.iauxBase * sizeof (union aux_ext)), - fdr.caux * sizeof (union aux_ext))) - return false; - fdr.iauxBase = output_symhdr->iauxMax; - output_symhdr->iauxMax += fdr.caux; - } - if (! info->relocateable) - { - - /* When are are hashing strings, we lie about the number of - strings attached to each FDR. We need to set cbSs - because some versions of dbx apparently use it to decide - how much of the string table to read in. */ - fdr.issBase = 0; - fdr.cbSs = output_symhdr->issMax; - } - else if (fdr.cbSs > 0) - { - if (!add_file_shuffle (ainfo, &ainfo->ss, &ainfo->ss_end, - input_bfd, - input_symhdr->cbSsOffset + fdr.issBase, - fdr.cbSs)) - return false; - fdr.issBase = output_symhdr->issMax; - output_symhdr->issMax += fdr.cbSs; - } - - if ((output_bfd->xvec->header_byteorder - == input_bfd->xvec->header_byteorder) - && input_debug->adjust == (struct ecoff_value_adjust *) NULL) - { - /* The two BFD's have the same endianness, and we don't have - to adjust the PDR addresses, so simply copying the - information will suffice. */ - BFD_ASSERT (external_pdr_size == input_swap->external_pdr_size); - if (fdr.cpd > 0) - { - if (!add_file_shuffle (ainfo, &ainfo->pdr, &ainfo->pdr_end, - input_bfd, - (input_symhdr->cbPdOffset - + fdr.ipdFirst * external_pdr_size), - fdr.cpd * external_pdr_size)) - return false; - } - BFD_ASSERT (external_opt_size == input_swap->external_opt_size); - if (fdr.copt > 0) - { - if (!add_file_shuffle (ainfo, &ainfo->opt, &ainfo->opt_end, - input_bfd, - (input_symhdr->cbOptOffset - + fdr.ioptBase * external_opt_size), - fdr.copt * external_opt_size)) - return false; - } - } - else - { - bfd_size_type outsz, insz; - bfd_byte *in; - bfd_byte *end; - bfd_byte *out; - - /* The two BFD's have different endianness, so we must swap - everything in and out. This code would always work, but - it would be unnecessarily slow in the normal case. */ - outsz = external_pdr_size; - insz = input_swap->external_pdr_size; - in = ((bfd_byte *) input_debug->external_pdr - + fdr.ipdFirst * insz); - end = in + fdr.cpd * insz; - sz = fdr.cpd * outsz; - out = (bfd_byte *) obstack_alloc (&ainfo->memory, sz); - if (!out) - { - bfd_set_error (bfd_error_no_memory); - return false; - } - if (!add_memory_shuffle (ainfo, &ainfo->pdr, &ainfo->pdr_end, out, - sz)) - return false; - for (; in < end; in += insz, out += outsz) - { - PDR pdr; - - (*input_swap->swap_pdr_in) (input_bfd, (PTR) in, &pdr); - - /* If we have been relaxing, we may have to adjust the - address. */ - if (input_debug->adjust != (struct ecoff_value_adjust *) NULL) - { - bfd_vma adr; - struct ecoff_value_adjust *adjust; - - adr = fdr_adr + pdr.adr; - for (adjust = input_debug->adjust; - adjust != (struct ecoff_value_adjust *) NULL; - adjust = adjust->next) - if (adr >= adjust->start - && adr < adjust->end) - pdr.adr += adjust->adjust; - } - - (*output_swap->swap_pdr_out) (output_bfd, &pdr, (PTR) out); - } - - /* Swap over the optimization information. */ - outsz = external_opt_size; - insz = input_swap->external_opt_size; - in = ((bfd_byte *) input_debug->external_opt - + fdr.ioptBase * insz); - end = in + fdr.copt * insz; - sz = fdr.copt * outsz; - out = (bfd_byte *) obstack_alloc (&ainfo->memory, sz); - if (!out) - { - bfd_set_error (bfd_error_no_memory); - return false; - } - if (!add_memory_shuffle (ainfo, &ainfo->opt, &ainfo->opt_end, out, - sz)) - return false; - for (; in < end; in += insz, out += outsz) - { - OPTR opt; - - (*input_swap->swap_opt_in) (input_bfd, (PTR) in, &opt); - (*output_swap->swap_opt_out) (output_bfd, &opt, (PTR) out); - } - } - - fdr.ipdFirst = output_symhdr->ipdMax; - output_symhdr->ipdMax += fdr.cpd; - fdr.ioptBase = output_symhdr->ioptMax; - output_symhdr->ioptMax += fdr.copt; - - if (fdr.crfd <= 0) - { - /* Point this FDR at the table of RFD's we created. */ - fdr.rfdBase = newrfdbase; - fdr.crfd = input_symhdr->ifdMax; - } - else - { - /* Point this FDR at the remapped RFD's. */ - fdr.rfdBase += oldrfdbase; - } - - (*swap_fdr_out) (output_bfd, &fdr, fdr_out); - fdr_out += external_fdr_size; - ++output_symhdr->ifdMax; - } - - return true; -} - -/* Add a string to the debugging information we are accumulating. - Return the offset from the fdr string base. */ - -static long ecoff_add_string PARAMS ((struct accumulate *, - struct bfd_link_info *, - struct ecoff_debug_info *, - FDR *fdr, const char *string)); - -static long -ecoff_add_string (ainfo, info, debug, fdr, string) - struct accumulate *ainfo; - struct bfd_link_info *info; - struct ecoff_debug_info *debug; - FDR *fdr; - const char *string; -{ - HDRR *symhdr; - size_t len; - bfd_size_type ret; - - symhdr = &debug->symbolic_header; - len = strlen (string); - if (info->relocateable) - { - if (!add_memory_shuffle (ainfo, &ainfo->ss, &ainfo->ss_end, (PTR) string, - len + 1)) - return -1; - ret = symhdr->issMax; - symhdr->issMax += len + 1; - fdr->cbSs += len + 1; - } - else - { - struct string_hash_entry *sh; - - sh = string_hash_lookup (&ainfo->str_hash, string, true, true); - if (sh == (struct string_hash_entry *) NULL) - return -1; - if (sh->val == -1) - { - sh->val = symhdr->issMax; - symhdr->issMax += len + 1; - if (ainfo->ss_hash == (struct string_hash_entry *) NULL) - ainfo->ss_hash = sh; - if (ainfo->ss_hash_end - != (struct string_hash_entry *) NULL) - ainfo->ss_hash_end->next = sh; - ainfo->ss_hash_end = sh; - } - ret = sh->val; - } - - return ret; -} - -/* Add debugging information from a non-ECOFF file. */ - -boolean -bfd_ecoff_debug_accumulate_other (handle, output_bfd, output_debug, - output_swap, input_bfd, info) - PTR handle; - bfd *output_bfd; - struct ecoff_debug_info *output_debug; - const struct ecoff_debug_swap *output_swap; - bfd *input_bfd; - struct bfd_link_info *info; -{ - struct accumulate *ainfo = (struct accumulate *) handle; - void (* const swap_sym_out) PARAMS ((bfd *, const SYMR *, PTR)) - = output_swap->swap_sym_out; - HDRR *output_symhdr = &output_debug->symbolic_header; - FDR fdr; - asection *sec; - asymbol **symbols; - asymbol **sym_ptr; - asymbol **sym_end; - long symsize; - long symcount; - PTR external_fdr; - - memset ((PTR) &fdr, 0, sizeof fdr); - - sec = bfd_get_section_by_name (input_bfd, ".text"); - if (sec != NULL) - fdr.adr = sec->output_section->vma + sec->output_offset; - else - { - /* FIXME: What about .init or .fini? */ - fdr.adr = 0; - } - - fdr.issBase = output_symhdr->issMax; - fdr.cbSs = 0; - fdr.rss = ecoff_add_string (ainfo, info, output_debug, &fdr, - bfd_get_filename (input_bfd)); - if (fdr.rss == -1) - return false; - fdr.isymBase = output_symhdr->isymMax; - - /* Get the local symbols from the input BFD. */ - symsize = bfd_get_symtab_upper_bound (input_bfd); - if (symsize < 0) - return false; - symbols = (asymbol **) bfd_alloc (output_bfd, symsize); - if (symbols == (asymbol **) NULL) - return false; - symcount = bfd_canonicalize_symtab (input_bfd, symbols); - if (symcount < 0) - return false; - sym_end = symbols + symcount; - - /* Handle the local symbols. Any external symbols are handled - separately. */ - fdr.csym = 0; - for (sym_ptr = symbols; sym_ptr != sym_end; sym_ptr++) - { - SYMR internal_sym; - PTR external_sym; - - if (((*sym_ptr)->flags & BSF_EXPORT) != 0) - continue; - memset ((PTR) &internal_sym, 0, sizeof internal_sym); - internal_sym.iss = ecoff_add_string (ainfo, info, output_debug, &fdr, - (*sym_ptr)->name); - - if (internal_sym.iss == -1) - return false; - if (bfd_is_com_section ((*sym_ptr)->section) - || bfd_is_und_section ((*sym_ptr)->section)) - internal_sym.value = (*sym_ptr)->value; - else - internal_sym.value = ((*sym_ptr)->value - + (*sym_ptr)->section->output_offset - + (*sym_ptr)->section->output_section->vma); - internal_sym.st = stNil; - internal_sym.sc = scUndefined; - internal_sym.index = indexNil; - - external_sym = (PTR) obstack_alloc (&ainfo->memory, - output_swap->external_sym_size); - if (!external_sym) - { - bfd_set_error (bfd_error_no_memory); - return false; - } - (*swap_sym_out) (output_bfd, &internal_sym, external_sym); - add_memory_shuffle (ainfo, &ainfo->sym, &ainfo->sym_end, - external_sym, output_swap->external_sym_size); - ++fdr.csym; - ++output_symhdr->isymMax; - } - - bfd_release (output_bfd, (PTR) symbols); - - /* Leave everything else in the FDR zeroed out. This will cause - the lang field to be langC. The fBigendian field will - indicate little endian format, but it doesn't matter because - it only applies to aux fields and there are none. */ - external_fdr = (PTR) obstack_alloc (&ainfo->memory, - output_swap->external_fdr_size); - if (!external_fdr) - { - bfd_set_error (bfd_error_no_memory); - return false; - } - (*output_swap->swap_fdr_out) (output_bfd, &fdr, external_fdr); - add_memory_shuffle (ainfo, &ainfo->fdr, &ainfo->fdr_end, - external_fdr, output_swap->external_fdr_size); - - ++output_symhdr->ifdMax; - - return true; -} - -/* Set up ECOFF debugging information for the external symbols. - FIXME: This is done using a memory buffer, but it should be - probably be changed to use a shuffle structure. The assembler uses - this interface, so that must be changed to do something else. */ - -boolean -bfd_ecoff_debug_externals (abfd, debug, swap, relocateable, get_extr, - set_index) - bfd *abfd; - struct ecoff_debug_info *debug; - const struct ecoff_debug_swap *swap; - boolean relocateable; - boolean (*get_extr) PARAMS ((asymbol *, EXTR *)); - void (*set_index) PARAMS ((asymbol *, bfd_size_type)); -{ - HDRR * const symhdr = &debug->symbolic_header; - asymbol **sym_ptr_ptr; - size_t c; - - sym_ptr_ptr = bfd_get_outsymbols (abfd); - if (sym_ptr_ptr == NULL) - return true; - - for (c = bfd_get_symcount (abfd); c > 0; c--, sym_ptr_ptr++) - { - asymbol *sym_ptr; - EXTR esym; - - sym_ptr = *sym_ptr_ptr; - - /* Get the external symbol information. */ - if ((*get_extr) (sym_ptr, &esym) == false) - continue; - - /* If we're producing an executable, move common symbols into - bss. */ - if (relocateable == false) - { - if (esym.asym.sc == scCommon) - esym.asym.sc = scBss; - else if (esym.asym.sc == scSCommon) - esym.asym.sc = scSBss; - } - - if (bfd_is_com_section (sym_ptr->section) - || bfd_is_und_section (sym_ptr->section) - || sym_ptr->section->output_section == (asection *) NULL) - { - /* FIXME: gas does not keep the value of a small undefined - symbol in the symbol itself, because of relocation - problems. */ - if (esym.asym.sc != scSUndefined - || esym.asym.value == 0 - || sym_ptr->value != 0) - esym.asym.value = sym_ptr->value; - } - else - esym.asym.value = (sym_ptr->value - + sym_ptr->section->output_offset - + sym_ptr->section->output_section->vma); - - if (set_index) - (*set_index) (sym_ptr, (bfd_size_type) symhdr->iextMax); - - if (! bfd_ecoff_debug_one_external (abfd, debug, swap, - sym_ptr->name, &esym)) - return false; - } - - return true; -} - -/* Add a single external symbol to the debugging information. */ - -boolean -bfd_ecoff_debug_one_external (abfd, debug, swap, name, esym) - bfd *abfd; - struct ecoff_debug_info *debug; - const struct ecoff_debug_swap *swap; - const char *name; - EXTR *esym; -{ - const bfd_size_type external_ext_size = swap->external_ext_size; - void (* const swap_ext_out) PARAMS ((bfd *, const EXTR *, PTR)) - = swap->swap_ext_out; - HDRR * const symhdr = &debug->symbolic_header; - size_t namelen; - - namelen = strlen (name); - - if ((size_t) (debug->ssext_end - debug->ssext) - < symhdr->issExtMax + namelen + 1) - { - if (ecoff_add_bytes ((char **) &debug->ssext, - (char **) &debug->ssext_end, - symhdr->issExtMax + namelen + 1) - == false) - return false; - } - if ((size_t) ((char *) debug->external_ext_end - - (char *) debug->external_ext) - < (symhdr->iextMax + 1) * external_ext_size) - { - if (ecoff_add_bytes ((char **) &debug->external_ext, - (char **) &debug->external_ext_end, - (symhdr->iextMax + 1) * external_ext_size) - == false) - return false; - } - - esym->asym.iss = symhdr->issExtMax; - - (*swap_ext_out) (abfd, esym, - ((char *) debug->external_ext - + symhdr->iextMax * swap->external_ext_size)); - - ++symhdr->iextMax; - - strcpy (debug->ssext + symhdr->issExtMax, name); - symhdr->issExtMax += namelen + 1; - - return true; -} - -/* Align the ECOFF debugging information. */ - -/*ARGSUSED*/ -static void -ecoff_align_debug (abfd, debug, swap) - bfd *abfd; - struct ecoff_debug_info *debug; - const struct ecoff_debug_swap *swap; -{ - HDRR * const symhdr = &debug->symbolic_header; - bfd_size_type debug_align, aux_align, rfd_align; - size_t add; - - /* Adjust the counts so that structures are aligned. */ - debug_align = swap->debug_align; - aux_align = debug_align / sizeof (union aux_ext); - rfd_align = debug_align / swap->external_rfd_size; - - add = debug_align - (symhdr->cbLine & (debug_align - 1)); - if (add != debug_align) - { - if (debug->line != (unsigned char *) NULL) - memset ((PTR) (debug->line + symhdr->cbLine), 0, add); - symhdr->cbLine += add; - } - - add = debug_align - (symhdr->issMax & (debug_align - 1)); - if (add != debug_align) - { - if (debug->ss != (char *) NULL) - memset ((PTR) (debug->ss + symhdr->issMax), 0, add); - symhdr->issMax += add; - } - - add = debug_align - (symhdr->issExtMax & (debug_align - 1)); - if (add != debug_align) - { - if (debug->ssext != (char *) NULL) - memset ((PTR) (debug->ssext + symhdr->issExtMax), 0, add); - symhdr->issExtMax += add; - } - - add = aux_align - (symhdr->iauxMax & (aux_align - 1)); - if (add != aux_align) - { - if (debug->external_aux != (union aux_ext *) NULL) - memset ((PTR) (debug->external_aux + symhdr->iauxMax), 0, - add * sizeof (union aux_ext)); - symhdr->iauxMax += add; - } - - add = rfd_align - (symhdr->crfd & (rfd_align - 1)); - if (add != rfd_align) - { - if (debug->external_rfd != (PTR) NULL) - memset ((PTR) ((char *) debug->external_rfd - + symhdr->crfd * swap->external_rfd_size), - 0, (size_t) (add * swap->external_rfd_size)); - symhdr->crfd += add; - } -} - -/* Return the size required by the ECOFF debugging information. */ - -bfd_size_type -bfd_ecoff_debug_size (abfd, debug, swap) - bfd *abfd; - struct ecoff_debug_info *debug; - const struct ecoff_debug_swap *swap; -{ - bfd_size_type tot; - - ecoff_align_debug (abfd, debug, swap); - tot = swap->external_hdr_size; - -#define ADD(count, size) \ - tot += debug->symbolic_header.count * size - - ADD (cbLine, sizeof (unsigned char)); - ADD (idnMax, swap->external_dnr_size); - ADD (ipdMax, swap->external_pdr_size); - ADD (isymMax, swap->external_sym_size); - ADD (ioptMax, swap->external_opt_size); - ADD (iauxMax, sizeof (union aux_ext)); - ADD (issMax, sizeof (char)); - ADD (issExtMax, sizeof (char)); - ADD (ifdMax, swap->external_fdr_size); - ADD (crfd, swap->external_rfd_size); - ADD (iextMax, swap->external_ext_size); - -#undef ADD - - return tot; -} - -/* Write out the ECOFF symbolic header, given the file position it is - going to be placed at. This assumes that the counts are set - correctly. */ - -static boolean -ecoff_write_symhdr (abfd, debug, swap, where) - bfd *abfd; - struct ecoff_debug_info *debug; - const struct ecoff_debug_swap *swap; - file_ptr where; -{ - HDRR * const symhdr = &debug->symbolic_header; - char *buff = NULL; - - ecoff_align_debug (abfd, debug, swap); - - /* Go to the right location in the file. */ - if (bfd_seek (abfd, where, SEEK_SET) != 0) - return false; - - where += swap->external_hdr_size; - - symhdr->magic = swap->sym_magic; - - /* Fill in the file offsets. */ -#define SET(offset, count, size) \ - if (symhdr->count == 0) \ - symhdr->offset = 0; \ - else \ - { \ - symhdr->offset = where; \ - where += symhdr->count * size; \ - } - - SET (cbLineOffset, cbLine, sizeof (unsigned char)); - SET (cbDnOffset, idnMax, swap->external_dnr_size); - SET (cbPdOffset, ipdMax, swap->external_pdr_size); - SET (cbSymOffset, isymMax, swap->external_sym_size); - SET (cbOptOffset, ioptMax, swap->external_opt_size); - SET (cbAuxOffset, iauxMax, sizeof (union aux_ext)); - SET (cbSsOffset, issMax, sizeof (char)); - SET (cbSsExtOffset, issExtMax, sizeof (char)); - SET (cbFdOffset, ifdMax, swap->external_fdr_size); - SET (cbRfdOffset, crfd, swap->external_rfd_size); - SET (cbExtOffset, iextMax, swap->external_ext_size); -#undef SET - - buff = (PTR) bfd_malloc ((size_t) swap->external_hdr_size); - if (buff == NULL && swap->external_hdr_size != 0) - goto error_return; - - (*swap->swap_hdr_out) (abfd, symhdr, buff); - if (bfd_write (buff, 1, swap->external_hdr_size, abfd) - != swap->external_hdr_size) - goto error_return; - - if (buff != NULL) - free (buff); - return true; - error_return: - if (buff != NULL) - free (buff); - return false; -} - -/* Write out the ECOFF debugging information. This function assumes - that the information (the pointers and counts) in *DEBUG have been - set correctly. WHERE is the position in the file to write the - information to. This function fills in the file offsets in the - symbolic header. */ - -boolean -bfd_ecoff_write_debug (abfd, debug, swap, where) - bfd *abfd; - struct ecoff_debug_info *debug; - const struct ecoff_debug_swap *swap; - file_ptr where; -{ - HDRR * const symhdr = &debug->symbolic_header; - - if (! ecoff_write_symhdr (abfd, debug, swap, where)) - return false; - -#define WRITE(ptr, count, size, offset) \ - BFD_ASSERT (symhdr->offset == 0 \ - || (bfd_vma) bfd_tell (abfd) == symhdr->offset); \ - if (bfd_write ((PTR) debug->ptr, size, symhdr->count, abfd) \ - != size * symhdr->count) \ - return false; - - WRITE (line, cbLine, sizeof (unsigned char), cbLineOffset); - WRITE (external_dnr, idnMax, swap->external_dnr_size, cbDnOffset); - WRITE (external_pdr, ipdMax, swap->external_pdr_size, cbPdOffset); - WRITE (external_sym, isymMax, swap->external_sym_size, cbSymOffset); - WRITE (external_opt, ioptMax, swap->external_opt_size, cbOptOffset); - WRITE (external_aux, iauxMax, sizeof (union aux_ext), cbAuxOffset); - WRITE (ss, issMax, sizeof (char), cbSsOffset); - WRITE (ssext, issExtMax, sizeof (char), cbSsExtOffset); - WRITE (external_fdr, ifdMax, swap->external_fdr_size, cbFdOffset); - WRITE (external_rfd, crfd, swap->external_rfd_size, cbRfdOffset); - WRITE (external_ext, iextMax, swap->external_ext_size, cbExtOffset); -#undef WRITE - - return true; -} - -/* Write out a shuffle list. */ - -static boolean ecoff_write_shuffle PARAMS ((bfd *, - const struct ecoff_debug_swap *, - struct shuffle *, PTR space)); - -static boolean -ecoff_write_shuffle (abfd, swap, shuffle, space) - bfd *abfd; - const struct ecoff_debug_swap *swap; - struct shuffle *shuffle; - PTR space; -{ - register struct shuffle *l; - unsigned long total; - - total = 0; - for (l = shuffle; l != (struct shuffle *) NULL; l = l->next) - { - if (! l->filep) - { - if (bfd_write (l->u.memory, 1, l->size, abfd) != l->size) - return false; - } - else - { - if (bfd_seek (l->u.file.input_bfd, l->u.file.offset, SEEK_SET) != 0 - || bfd_read (space, 1, l->size, l->u.file.input_bfd) != l->size - || bfd_write (space, 1, l->size, abfd) != l->size) - return false; - } - total += l->size; - } - - if ((total & (swap->debug_align - 1)) != 0) - { - unsigned int i; - bfd_byte *s; - - i = swap->debug_align - (total & (swap->debug_align - 1)); - s = (bfd_byte *) bfd_malloc (i); - if (s == NULL && i != 0) - return false; - - memset ((PTR) s, 0, i); - if (bfd_write ((PTR) s, 1, i, abfd) != i) - { - free (s); - return false; - } - free (s); - } - - return true; -} - -/* Write out debugging information using accumulated linker - information. */ - -boolean -bfd_ecoff_write_accumulated_debug (handle, abfd, debug, swap, info, where) - PTR handle; - bfd *abfd; - struct ecoff_debug_info *debug; - const struct ecoff_debug_swap *swap; - struct bfd_link_info *info; - file_ptr where; -{ - struct accumulate *ainfo = (struct accumulate *) handle; - PTR space = NULL; - - if (! ecoff_write_symhdr (abfd, debug, swap, where)) - goto error_return; - - space = (PTR) bfd_malloc (ainfo->largest_file_shuffle); - if (space == NULL && ainfo->largest_file_shuffle != 0) - goto error_return; - - if (! ecoff_write_shuffle (abfd, swap, ainfo->line, space) - || ! ecoff_write_shuffle (abfd, swap, ainfo->pdr, space) - || ! ecoff_write_shuffle (abfd, swap, ainfo->sym, space) - || ! ecoff_write_shuffle (abfd, swap, ainfo->opt, space) - || ! ecoff_write_shuffle (abfd, swap, ainfo->aux, space)) - goto error_return; - - /* The string table is written out from the hash table if this is a - final link. */ - if (info->relocateable) - { - BFD_ASSERT (ainfo->ss_hash == (struct string_hash_entry *) NULL); - if (! ecoff_write_shuffle (abfd, swap, ainfo->ss, space)) - goto error_return; - } - else - { - unsigned long total; - bfd_byte null; - struct string_hash_entry *sh; - - BFD_ASSERT (ainfo->ss == (struct shuffle *) NULL); - null = 0; - if (bfd_write ((PTR) &null, 1, 1, abfd) != 1) - goto error_return; - total = 1; - BFD_ASSERT (ainfo->ss_hash == NULL || ainfo->ss_hash->val == 1); - for (sh = ainfo->ss_hash; - sh != (struct string_hash_entry *) NULL; - sh = sh->next) - { - size_t len; - - len = strlen (sh->root.string); - if (bfd_write ((PTR) sh->root.string, 1, len + 1, abfd) != len + 1) - goto error_return; - total += len + 1; - } - - if ((total & (swap->debug_align - 1)) != 0) - { - unsigned int i; - bfd_byte *s; - - i = swap->debug_align - (total & (swap->debug_align - 1)); - s = (bfd_byte *) bfd_malloc (i); - if (s == NULL && i != 0) - goto error_return; - memset ((PTR) s, 0, i); - if (bfd_write ((PTR) s, 1, i, abfd) != i) - { - free (s); - goto error_return; - } - free (s); - } - } - - /* The external strings and symbol are not converted over to using - shuffles. FIXME: They probably should be. */ - if (bfd_write (debug->ssext, 1, debug->symbolic_header.issExtMax, abfd) - != (bfd_size_type) debug->symbolic_header.issExtMax) - goto error_return; - if ((debug->symbolic_header.issExtMax & (swap->debug_align - 1)) != 0) - { - unsigned int i; - bfd_byte *s; - - i = (swap->debug_align - - (debug->symbolic_header.issExtMax & (swap->debug_align - 1))); - s = (bfd_byte *) bfd_malloc (i); - if (s == NULL && i != 0) - goto error_return; - memset ((PTR) s, 0, i); - if (bfd_write ((PTR) s, 1, i, abfd) != i) - { - free (s); - goto error_return; - } - free (s); - } - - if (! ecoff_write_shuffle (abfd, swap, ainfo->fdr, space) - || ! ecoff_write_shuffle (abfd, swap, ainfo->rfd, space)) - goto error_return; - - BFD_ASSERT (debug->symbolic_header.cbExtOffset == 0 - || (debug->symbolic_header.cbExtOffset - == (bfd_vma) bfd_tell (abfd))); - - if (bfd_write (debug->external_ext, swap->external_ext_size, - debug->symbolic_header.iextMax, abfd) - != debug->symbolic_header.iextMax * swap->external_ext_size) - goto error_return; - - if (space != NULL) - free (space); - return true; - - error_return: - if (space != NULL) - free (space); - return false; -} - -/* Handle the find_nearest_line function for both ECOFF and MIPS ELF - files. */ - -/* Compare FDR entries. This is called via qsort. */ - -static int -cmp_fdrtab_entry (leftp, rightp) - const PTR leftp; - const PTR rightp; -{ - const struct ecoff_fdrtab_entry *lp = - (const struct ecoff_fdrtab_entry *) leftp; - const struct ecoff_fdrtab_entry *rp = - (const struct ecoff_fdrtab_entry *) rightp; - - if (lp->base_addr < rp->base_addr) - return -1; - if (lp->base_addr > rp->base_addr) - return 1; - return 0; -} - -/* Each file descriptor (FDR) has a memory address, to simplify - looking up an FDR by address, we build a table covering all FDRs - that have a least one procedure descriptor in them. The final - table will be sorted by address so we can look it up via binary - search. */ - -static boolean -mk_fdrtab (abfd, debug_info, debug_swap, line_info) - bfd *abfd; - struct ecoff_debug_info * const debug_info; - const struct ecoff_debug_swap * const debug_swap; - struct ecoff_find_line *line_info; -{ - struct ecoff_fdrtab_entry *tab; - FDR *fdr_ptr; - FDR *fdr_start; - FDR *fdr_end; - boolean stabs; - long len; - - fdr_start = debug_info->fdr; - fdr_end = fdr_start + debug_info->symbolic_header.ifdMax; - - /* First, let's see how long the table needs to be: */ - for (len = 0, fdr_ptr = fdr_start; fdr_ptr < fdr_end; fdr_ptr++) - { - if (fdr_ptr->cpd == 0) /* skip FDRs that have no PDRs */ - continue; - ++len; - } - - /* Now, create and fill in the table: */ - - line_info->fdrtab = ((struct ecoff_fdrtab_entry*) - bfd_zalloc (abfd, - len * sizeof (struct ecoff_fdrtab_entry))); - if (line_info->fdrtab == NULL) - return false; - line_info->fdrtab_len = len; - - tab = line_info->fdrtab; - for (fdr_ptr = fdr_start; fdr_ptr < fdr_end; fdr_ptr++) - { - if (fdr_ptr->cpd == 0) - continue; - - /* Check whether this file has stabs debugging information. In - a file with stabs debugging information, the second local - symbol is named @stabs. */ - stabs = false; - if (fdr_ptr->csym >= 2) - { - char *sym_ptr; - SYMR sym; - - sym_ptr = ((char *) debug_info->external_sym - + (fdr_ptr->isymBase + 1)*debug_swap->external_sym_size); - (*debug_swap->swap_sym_in) (abfd, sym_ptr, &sym); - if (strcmp (debug_info->ss + fdr_ptr->issBase + sym.iss, - STABS_SYMBOL) == 0) - stabs = true; - } - - if (!stabs) - { - bfd_size_type external_pdr_size; - char *pdr_ptr; - PDR pdr; - - external_pdr_size = debug_swap->external_pdr_size; - - pdr_ptr = ((char *) debug_info->external_pdr - + fdr_ptr->ipdFirst * external_pdr_size); - (*debug_swap->swap_pdr_in) (abfd, (PTR) pdr_ptr, &pdr); - /* The address of the first PDR is the offset of that - procedure relative to the beginning of file FDR. */ - tab->base_addr = fdr_ptr->adr - pdr.adr; - } - else - { - /* XXX I don't know about stabs, so this is a guess - (davidm@cs.arizona.edu): */ - tab->base_addr = fdr_ptr->adr; - } - tab->fdr = fdr_ptr; - ++tab; - } - - /* Finally, the table is sorted in increasing memory-address order. - The table is mostly sorted already, but there are cases (e.g., - static functions in include files), where this does not hold. - Use "odump -PFv" to verify... */ - qsort ((PTR) line_info->fdrtab, len, - sizeof (struct ecoff_fdrtab_entry), cmp_fdrtab_entry); - - return true; -} - -/* Return index of first FDR that covers to OFFSET. */ - -static long -fdrtab_lookup (line_info, offset) - struct ecoff_find_line *line_info; - bfd_vma offset; -{ - long low, high, len; - long mid = -1; - struct ecoff_fdrtab_entry *tab; - - len = line_info->fdrtab_len; - if (len == 0) - return -1; - - tab = line_info->fdrtab; - for (low = 0, high = len - 1 ; low != high ;) - { - mid = (high + low) / 2; - if (offset >= tab[mid].base_addr && offset < tab[mid + 1].base_addr) - goto find_min; - - if (tab[mid].base_addr > offset) - high = mid; - else - low = mid + 1; - } - ++mid; - - /* last entry is catch-all for all higher addresses: */ - if (offset < tab[mid].base_addr) - return -1; - - find_min: - - while (mid > 0 && tab[mid - 1].base_addr == tab[mid].base_addr) - --mid; - - return mid; -} - -/* Do the work of find_nearest_line. */ - -boolean -_bfd_ecoff_locate_line (abfd, section, offset, debug_info, debug_swap, - line_info, filename_ptr, functionname_ptr, retline_ptr) - bfd *abfd; - asection *section; - bfd_vma offset; - struct ecoff_debug_info * const debug_info; - const struct ecoff_debug_swap * const debug_swap; - struct ecoff_find_line *line_info; - const char **filename_ptr; - const char **functionname_ptr; - unsigned int *retline_ptr; -{ - struct ecoff_fdrtab_entry *tab; - boolean stabs; - FDR *fdr_ptr; - int i; - - offset += section->vma; - - /* Build FDR table (sorted by object file's base-address) if we - don't have it already. */ - if (line_info->fdrtab == NULL - && !mk_fdrtab (abfd, debug_info, debug_swap, line_info)) - return false; - - tab = line_info->fdrtab; - - /* find first FDR for address OFFSET */ - i = fdrtab_lookup (line_info, offset); - if (i < 0) - return false; /* no FDR, no fun... */ - fdr_ptr = tab[i].fdr; - - /* Check whether this file has stabs debugging information. In a - file with stabs debugging information, the second local symbol is - named @stabs. */ - stabs = false; - if (fdr_ptr->csym >= 2) - { - char *sym_ptr; - SYMR sym; - - sym_ptr = ((char *) debug_info->external_sym - + (fdr_ptr->isymBase + 1) * debug_swap->external_sym_size); - (*debug_swap->swap_sym_in) (abfd, sym_ptr, &sym); - if (strcmp (debug_info->ss + fdr_ptr->issBase + sym.iss, - STABS_SYMBOL) == 0) - stabs = true; - } - - if (!stabs) - { - bfd_size_type external_pdr_size; - char *pdr_ptr; - char *best_pdr = NULL; - FDR *best_fdr; - bfd_vma best_dist = ~0; - PDR pdr; - unsigned char *line_ptr; - unsigned char *line_end; - int lineno; - /* This file uses ECOFF debugging information. Each FDR has a - list of procedure descriptors (PDR). The address in the FDR - is the absolute address of the first procedure. The address - in the first PDR gives the offset of that procedure relative - to the object file's base-address. The addresses in - subsequent PDRs specify each procedure's address relative to - the object file's base-address. To make things more juicy, - whenever the PROF bit in the PDR is set, the real entry point - of the procedure may be 16 bytes below what would normally be - the procedure's entry point. Instead, DEC came up with a - wicked scheme to create profiled libraries "on the fly": - instead of shipping a regular and a profiled version of each - library, they insert 16 bytes of unused space in front of - each procedure and set the "prof" bit in the PDR to indicate - that there is a gap there (this is done automagically by "as" - when option "-pg" is specified). Thus, normally, you link - against such a library and, except for lots of 16 byte gaps - between functions, things will behave as usual. However, - when invoking "ld" with option "-pg", it will fill those gaps - with code that calls mcount(). It then moves the function's - entry point down by 16 bytes, and out pops a binary that has - all functions profiled. - - NOTE: Neither FDRs nor PDRs are strictly sorted in memory - order. For example, when including header-files that - define functions, the FDRs follow behind the including - file, even though their code may have been generated at - a lower address. File coff-alpha.c from libbfd - illustrates this (use "odump -PFv" to look at a file's - FDR/PDR). Similarly, PDRs are sometimes out of order - as well. An example of this is OSF/1 v3.0 libc's - malloc.c. I'm not sure why this happens, but it could - be due to optimizations that reorder a function's - position within an object-file. - - Strategy: - - On the first call to this function, we build a table of FDRs - that is sorted by the base-address of the object-file the FDR - is referring to. Notice that each object-file may contain - code from multiple source files (e.g., due to code defined in - include files). Thus, for any given base-address, there may - be multiple FDRs (but this case is, fortunately, uncommon). - lookup(addr) guarantees to return the first FDR that applies - to address ADDR. Thus, after invoking lookup(), we have a - list of FDRs that may contain the PDR for ADDR. Next, we - walk through the PDRs of these FDRs and locate the one that - is closest to ADDR (i.e., for which the difference between - ADDR and the PDR's entry point is positive and minimal). - Once, the right FDR and PDR are located, we simply walk - through the line-number table to lookup the line-number that - best matches ADDR. Obviously, things could be sped up by - keeping a sorted list of PDRs instead of a sorted list of - FDRs. However, this would increase space requirements - considerably, which is undesirable. */ - external_pdr_size = debug_swap->external_pdr_size; - - /* Make offset relative to object file's start-address: */ - offset -= tab[i].base_addr; - /* Search FDR list starting at tab[i] for the PDR that best matches - OFFSET. Normally, the FDR list is only one entry long. */ - best_fdr = NULL; - do - { - bfd_vma dist, min_dist = 0; - char *pdr_hold; - char *pdr_end; - - fdr_ptr = tab[i].fdr; - - pdr_ptr = ((char *) debug_info->external_pdr - + fdr_ptr->ipdFirst * external_pdr_size); - pdr_end = pdr_ptr + fdr_ptr->cpd * external_pdr_size; - (*debug_swap->swap_pdr_in) (abfd, (PTR) pdr_ptr, &pdr); - /* Find PDR that is closest to OFFSET. If pdr.prof is set, - the procedure entry-point *may* be 0x10 below pdr.adr. We - simply pretend that pdr.prof *implies* a lower entry-point. - This is safe because it just means that may identify 4 NOPs - in front of the function as belonging to the function. */ - for (pdr_hold = NULL; - pdr_ptr < pdr_end; - (pdr_ptr += external_pdr_size, - (*debug_swap->swap_pdr_in) (abfd, (PTR) pdr_ptr, &pdr))) - { - if (offset >= (pdr.adr - 0x10 * pdr.prof)) - { - dist = offset - (pdr.adr - 0x10 * pdr.prof); - if (!pdr_hold || dist < min_dist) - { - min_dist = dist; - pdr_hold = pdr_ptr; - } - } - } - - if (!best_pdr || min_dist < best_dist) - { - best_dist = min_dist; - best_fdr = fdr_ptr; - best_pdr = pdr_hold; - } - /* continue looping until base_addr of next entry is different: */ - } - while (++i < line_info->fdrtab_len - && tab[i].base_addr == tab[i - 1].base_addr); - - if (!best_fdr || !best_pdr) - return false; /* shouldn't happen... */ - - /* phew, finally we got something that we can hold onto: */ - fdr_ptr = best_fdr; - pdr_ptr = best_pdr; - (*debug_swap->swap_pdr_in) (abfd, (PTR) pdr_ptr, &pdr); - /* Now we can look for the actual line number. The line numbers - are stored in a very funky format, which I won't try to - describe. The search is bounded by the end of the FDRs line - number entries. */ - line_end = debug_info->line + fdr_ptr->cbLineOffset + fdr_ptr->cbLine; - - /* Make offset relative to procedure entry: */ - offset -= pdr.adr - 0x10 * pdr.prof; - lineno = pdr.lnLow; - line_ptr = debug_info->line + fdr_ptr->cbLineOffset + pdr.cbLineOffset; - while (line_ptr < line_end) - { - int delta; - unsigned int count; - - delta = *line_ptr >> 4; - if (delta >= 0x8) - delta -= 0x10; - count = (*line_ptr & 0xf) + 1; - ++line_ptr; - if (delta == -8) - { - delta = (((line_ptr[0]) & 0xff) << 8) + ((line_ptr[1]) & 0xff); - if (delta >= 0x8000) - delta -= 0x10000; - line_ptr += 2; - } - lineno += delta; - if (offset < count * 4) - break; - offset -= count * 4; - } - - /* If fdr_ptr->rss is -1, then this file does not have full - symbols, at least according to gdb/mipsread.c. */ - if (fdr_ptr->rss == -1) - { - *filename_ptr = NULL; - if (pdr.isym == -1) - *functionname_ptr = NULL; - else - { - EXTR proc_ext; - - (*debug_swap->swap_ext_in) - (abfd, - ((char *) debug_info->external_ext - + pdr.isym * debug_swap->external_ext_size), - &proc_ext); - *functionname_ptr = debug_info->ssext + proc_ext.asym.iss; - } - } - else - { - SYMR proc_sym; - - *filename_ptr = debug_info->ss + fdr_ptr->issBase + fdr_ptr->rss; - (*debug_swap->swap_sym_in) - (abfd, - ((char *) debug_info->external_sym - + (fdr_ptr->isymBase + pdr.isym) * debug_swap->external_sym_size), - &proc_sym); - *functionname_ptr = debug_info->ss + fdr_ptr->issBase + proc_sym.iss; - } - if (lineno == ilineNil) - lineno = 0; - *retline_ptr = lineno; - } - else - { - bfd_size_type external_sym_size; - const char *directory_name; - const char *main_file_name; - const char *current_file_name; - const char *function_name; - const char *line_file_name; - bfd_vma low_func_vma; - bfd_vma low_line_vma; - boolean past_line; - boolean past_fn; - char *sym_ptr, *sym_ptr_end; - size_t len, funclen; - char *buffer = NULL; - - /* This file uses stabs debugging information. When gcc is not - optimizing, it will put the line number information before - the function name stabs entry. When gcc is optimizing, it - will put the stabs entry for all the function first, followed - by the line number information. (This appears to happen - because of the two output files used by the -mgpopt switch, - which is implied by -O). This means that we must keep - looking through the symbols until we find both a line number - and a function name which are beyond the address we want. */ - - *filename_ptr = NULL; - *functionname_ptr = NULL; - *retline_ptr = 0; - - directory_name = NULL; - main_file_name = NULL; - current_file_name = NULL; - function_name = NULL; - line_file_name = NULL; - low_func_vma = 0; - low_line_vma = 0; - past_line = false; - past_fn = false; - - external_sym_size = debug_swap->external_sym_size; - - sym_ptr = ((char *) debug_info->external_sym - + (fdr_ptr->isymBase + 2) * external_sym_size); - sym_ptr_end = sym_ptr + (fdr_ptr->csym - 2) * external_sym_size; - for (; - sym_ptr < sym_ptr_end && (! past_line || ! past_fn); - sym_ptr += external_sym_size) - { - SYMR sym; - - (*debug_swap->swap_sym_in) (abfd, sym_ptr, &sym); - - if (ECOFF_IS_STAB (&sym)) - { - switch (ECOFF_UNMARK_STAB (sym.index)) - { - case N_SO: - main_file_name = current_file_name = - debug_info->ss + fdr_ptr->issBase + sym.iss; - - /* Check the next symbol to see if it is also an - N_SO symbol. */ - if (sym_ptr + external_sym_size < sym_ptr_end) - { - SYMR nextsym; - - (*debug_swap->swap_sym_in) (abfd, - sym_ptr + external_sym_size, - &nextsym); - if (ECOFF_IS_STAB (&nextsym) - && ECOFF_UNMARK_STAB (nextsym.index) == N_SO) - { - directory_name = current_file_name; - main_file_name = current_file_name = - debug_info->ss + fdr_ptr->issBase + nextsym.iss; - sym_ptr += external_sym_size; - } - } - break; - - case N_SOL: - current_file_name = - debug_info->ss + fdr_ptr->issBase + sym.iss; - break; - - case N_FUN: - if (sym.value > offset) - past_fn = true; - else if (sym.value >= low_func_vma) - { - low_func_vma = sym.value; - function_name = - debug_info->ss + fdr_ptr->issBase + sym.iss; - } - break; - } - } - else if (sym.st == stLabel && sym.index != indexNil) - { - if (sym.value > offset) - past_line = true; - else if (sym.value >= low_line_vma) - { - low_line_vma = sym.value; - line_file_name = current_file_name; - *retline_ptr = sym.index; - } - } - } - - if (*retline_ptr != 0) - main_file_name = line_file_name; - - /* We need to remove the stuff after the colon in the function - name. We also need to put the directory name and the file - name together. */ - if (function_name == NULL) - len = funclen = 0; - else - len = funclen = strlen (function_name) + 1; - - if (main_file_name != NULL - && directory_name != NULL - && main_file_name[0] != '/') - len += strlen (directory_name) + strlen (main_file_name) + 1; - - if (len != 0) - { - if (line_info->find_buffer != NULL) - free (line_info->find_buffer); - buffer = (char *) bfd_malloc (len); - if (buffer == NULL) - return false; - line_info->find_buffer = buffer; - } - - if (function_name != NULL) - { - char *colon; - - strcpy (buffer, function_name); - colon = strchr (buffer, ':'); - if (colon != NULL) - *colon = '\0'; - *functionname_ptr = buffer; - } - - if (main_file_name != NULL) - { - if (directory_name == NULL || main_file_name[0] == '/') - *filename_ptr = main_file_name; - else - { - sprintf (buffer + funclen, "%s%s", directory_name, - main_file_name); - *filename_ptr = buffer + funclen; - } - } - } - - return true; -} - -/* These routines copy symbolic information into a memory buffer. - - FIXME: The whole point of the shuffle code is to avoid storing - everything in memory, since the linker is such a memory hog. This - code makes that effort useless. It is only called by the MIPS ELF - code when generating a shared library, so it is not that big a - deal, but it should be fixed eventually. */ - -/* Collect a shuffle into a memory buffer. */ - -static boolean ecoff_collect_shuffle PARAMS ((struct shuffle *, bfd_byte *)); - -static boolean -ecoff_collect_shuffle (l, buff) - struct shuffle *l; - bfd_byte *buff; -{ - unsigned long total; - - total = 0; - for (; l != (struct shuffle *) NULL; l = l->next) - { - if (! l->filep) - memcpy (buff, l->u.memory, l->size); - else - { - if (bfd_seek (l->u.file.input_bfd, l->u.file.offset, SEEK_SET) != 0 - || bfd_read (buff, 1, l->size, l->u.file.input_bfd) != l->size) - return false; - } - total += l->size; - buff += l->size; - } - - return true; -} - -/* Copy PDR information into a memory buffer. */ - -boolean -_bfd_ecoff_get_accumulated_pdr (handle, buff) - PTR handle; - bfd_byte *buff; -{ - struct accumulate *ainfo = (struct accumulate *) handle; - - return ecoff_collect_shuffle (ainfo->pdr, buff); -} - -/* Copy symbol information into a memory buffer. */ - -boolean -_bfd_ecoff_get_accumulated_sym (handle, buff) - PTR handle; - bfd_byte *buff; -{ - struct accumulate *ainfo = (struct accumulate *) handle; - - return ecoff_collect_shuffle (ainfo->sym, buff); -} - -/* Copy the string table into a memory buffer. */ - -boolean -_bfd_ecoff_get_accumulated_ss (handle, buff) - PTR handle; - bfd_byte *buff; -{ - struct accumulate *ainfo = (struct accumulate *) handle; - struct string_hash_entry *sh; - unsigned long total; - - /* The string table is written out from the hash table if this is a - final link. */ - BFD_ASSERT (ainfo->ss == (struct shuffle *) NULL); - *buff++ = '\0'; - total = 1; - BFD_ASSERT (ainfo->ss_hash == NULL || ainfo->ss_hash->val == 1); - for (sh = ainfo->ss_hash; - sh != (struct string_hash_entry *) NULL; - sh = sh->next) - { - size_t len; - - len = strlen (sh->root.string); - memcpy (buff, (PTR) sh->root.string, len + 1); - total += len + 1; - buff += len + 1; - } - - return true; -} diff --git a/contrib/gdb/bfd/ecoffswap.h b/contrib/gdb/bfd/ecoffswap.h deleted file mode 100644 index 0d28d16883e13..0000000000000 --- a/contrib/gdb/bfd/ecoffswap.h +++ /dev/null @@ -1,853 +0,0 @@ -/* Generic ECOFF swapping routines, for BFD. - Copyright 1992, 1993, 1994, 1995, 1996 Free Software Foundation, Inc. - Written by Cygnus Support. - -This file is part of BFD, the Binary File Descriptor library. - -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 2 of the License, 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ - -/* NOTE: This is a header file, but it contains executable routines. - This is done this way because these routines are substantially - similar, but are not identical, for all ECOFF targets. - - These are routines to swap the ECOFF symbolic information in and - out. The routines are defined statically. You can set breakpoints - on them in gdb by naming the including source file; e.g., - 'coff-mips.c':ecoff_swap_hdr_in. - - Before including this header file, one of ECOFF_32 or ECOFF_64 must - be defined. These are checked when swapping information that - depends upon the target size. This code works for 32 bit and 64 - bit ECOFF, but may need to be generalized in the future. - - Some header file which defines the external forms of these - structures must also be included before including this header file. - Currently this is either coff/mips.h or coff/alpha.h. - - If the symbol TEST is defined when this file is compiled, a - comparison is made to ensure that, in fact, the output is - bit-for-bit the same as the input. Of course, this symbol should - only be defined when deliberately testing the code on a machine - with the proper byte sex and such. */ - -#ifdef ECOFF_32 -#define ecoff_get_off bfd_h_get_32 -#define ecoff_put_off bfd_h_put_32 -#endif -#ifdef ECOFF_64 -#define ecoff_get_off bfd_h_get_64 -#define ecoff_put_off bfd_h_put_64 -#endif - -/* ECOFF auxiliary information swapping routines. These are the same - for all ECOFF targets, so they are defined in ecofflink.c. */ - -extern void _bfd_ecoff_swap_tir_in - PARAMS ((int, const struct tir_ext *, TIR *)); -extern void _bfd_ecoff_swap_tir_out - PARAMS ((int, const TIR *, struct tir_ext *)); -extern void _bfd_ecoff_swap_rndx_in - PARAMS ((int, const struct rndx_ext *, RNDXR *)); -extern void _bfd_ecoff_swap_rndx_out - PARAMS ((int, const RNDXR *, struct rndx_ext *)); - -/* Prototypes for functions defined in this file. */ - -static void ecoff_swap_hdr_in PARAMS ((bfd *, PTR, HDRR *)); -static void ecoff_swap_hdr_out PARAMS ((bfd *, const HDRR *, PTR)); -static void ecoff_swap_fdr_in PARAMS ((bfd *, PTR, FDR *)); -static void ecoff_swap_fdr_out PARAMS ((bfd *, const FDR *, PTR)); -static void ecoff_swap_pdr_in PARAMS ((bfd *, PTR, PDR *)); -static void ecoff_swap_pdr_out PARAMS ((bfd *, const PDR *, PTR)); -static void ecoff_swap_sym_in PARAMS ((bfd *, PTR, SYMR *)); -static void ecoff_swap_sym_out PARAMS ((bfd *, const SYMR *, PTR)); -static void ecoff_swap_ext_in PARAMS ((bfd *, PTR, EXTR *)); -static void ecoff_swap_ext_out PARAMS ((bfd *, const EXTR *, PTR)); -static void ecoff_swap_rfd_in PARAMS ((bfd *, PTR, RFDT *)); -static void ecoff_swap_rfd_out PARAMS ((bfd *, const RFDT *, PTR)); -static void ecoff_swap_opt_in PARAMS ((bfd *, PTR, OPTR *)); -static void ecoff_swap_opt_out PARAMS ((bfd *, const OPTR *, PTR)); -static void ecoff_swap_dnr_in PARAMS ((bfd *, PTR, DNR *)); -static void ecoff_swap_dnr_out PARAMS ((bfd *, const DNR *, PTR)); - -/* Swap in the symbolic header. */ - -static void -ecoff_swap_hdr_in (abfd, ext_copy, intern) - bfd *abfd; - PTR ext_copy; - HDRR *intern; -{ - struct hdr_ext ext[1]; - - *ext = *(struct hdr_ext *) ext_copy; - - intern->magic = bfd_h_get_signed_16 (abfd, (bfd_byte *)ext->h_magic); - intern->vstamp = bfd_h_get_signed_16 (abfd, (bfd_byte *)ext->h_vstamp); - intern->ilineMax = bfd_h_get_32 (abfd, (bfd_byte *)ext->h_ilineMax); - intern->cbLine = ecoff_get_off (abfd, (bfd_byte *)ext->h_cbLine); - intern->cbLineOffset = ecoff_get_off (abfd, (bfd_byte *)ext->h_cbLineOffset); - intern->idnMax = bfd_h_get_32 (abfd, (bfd_byte *)ext->h_idnMax); - intern->cbDnOffset = ecoff_get_off (abfd, (bfd_byte *)ext->h_cbDnOffset); - intern->ipdMax = bfd_h_get_32 (abfd, (bfd_byte *)ext->h_ipdMax); - intern->cbPdOffset = ecoff_get_off (abfd, (bfd_byte *)ext->h_cbPdOffset); - intern->isymMax = bfd_h_get_32 (abfd, (bfd_byte *)ext->h_isymMax); - intern->cbSymOffset = ecoff_get_off (abfd, (bfd_byte *)ext->h_cbSymOffset); - intern->ioptMax = bfd_h_get_32 (abfd, (bfd_byte *)ext->h_ioptMax); - intern->cbOptOffset = ecoff_get_off (abfd, (bfd_byte *)ext->h_cbOptOffset); - intern->iauxMax = bfd_h_get_32 (abfd, (bfd_byte *)ext->h_iauxMax); - intern->cbAuxOffset = ecoff_get_off (abfd, (bfd_byte *)ext->h_cbAuxOffset); - intern->issMax = bfd_h_get_32 (abfd, (bfd_byte *)ext->h_issMax); - intern->cbSsOffset = ecoff_get_off (abfd, (bfd_byte *)ext->h_cbSsOffset); - intern->issExtMax = bfd_h_get_32 (abfd, (bfd_byte *)ext->h_issExtMax); - intern->cbSsExtOffset = ecoff_get_off (abfd, (bfd_byte *)ext->h_cbSsExtOffset); - intern->ifdMax = bfd_h_get_32 (abfd, (bfd_byte *)ext->h_ifdMax); - intern->cbFdOffset = ecoff_get_off (abfd, (bfd_byte *)ext->h_cbFdOffset); - intern->crfd = bfd_h_get_32 (abfd, (bfd_byte *)ext->h_crfd); - intern->cbRfdOffset = ecoff_get_off (abfd, (bfd_byte *)ext->h_cbRfdOffset); - intern->iextMax = bfd_h_get_32 (abfd, (bfd_byte *)ext->h_iextMax); - intern->cbExtOffset = ecoff_get_off (abfd, (bfd_byte *)ext->h_cbExtOffset); - -#ifdef TEST - if (memcmp ((char *)ext, (char *)intern, sizeof (*intern)) != 0) - abort(); -#endif -} - -/* Swap out the symbolic header. */ - -static void -ecoff_swap_hdr_out (abfd, intern_copy, ext_ptr) - bfd *abfd; - const HDRR *intern_copy; - PTR ext_ptr; -{ - struct hdr_ext *ext = (struct hdr_ext *) ext_ptr; - HDRR intern[1]; - - *intern = *intern_copy; - - bfd_h_put_signed_16 (abfd, intern->magic, (bfd_byte *)ext->h_magic); - bfd_h_put_signed_16 (abfd, intern->vstamp, (bfd_byte *)ext->h_vstamp); - bfd_h_put_32 (abfd, intern->ilineMax, (bfd_byte *)ext->h_ilineMax); - ecoff_put_off (abfd, intern->cbLine, (bfd_byte *)ext->h_cbLine); - ecoff_put_off (abfd, intern->cbLineOffset, (bfd_byte *)ext->h_cbLineOffset); - bfd_h_put_32 (abfd, intern->idnMax, (bfd_byte *)ext->h_idnMax); - ecoff_put_off (abfd, intern->cbDnOffset, (bfd_byte *)ext->h_cbDnOffset); - bfd_h_put_32 (abfd, intern->ipdMax, (bfd_byte *)ext->h_ipdMax); - ecoff_put_off (abfd, intern->cbPdOffset, (bfd_byte *)ext->h_cbPdOffset); - bfd_h_put_32 (abfd, intern->isymMax, (bfd_byte *)ext->h_isymMax); - ecoff_put_off (abfd, intern->cbSymOffset, (bfd_byte *)ext->h_cbSymOffset); - bfd_h_put_32 (abfd, intern->ioptMax, (bfd_byte *)ext->h_ioptMax); - ecoff_put_off (abfd, intern->cbOptOffset, (bfd_byte *)ext->h_cbOptOffset); - bfd_h_put_32 (abfd, intern->iauxMax, (bfd_byte *)ext->h_iauxMax); - ecoff_put_off (abfd, intern->cbAuxOffset, (bfd_byte *)ext->h_cbAuxOffset); - bfd_h_put_32 (abfd, intern->issMax, (bfd_byte *)ext->h_issMax); - ecoff_put_off (abfd, intern->cbSsOffset, (bfd_byte *)ext->h_cbSsOffset); - bfd_h_put_32 (abfd, intern->issExtMax, (bfd_byte *)ext->h_issExtMax); - ecoff_put_off (abfd, intern->cbSsExtOffset, (bfd_byte *)ext->h_cbSsExtOffset); - bfd_h_put_32 (abfd, intern->ifdMax, (bfd_byte *)ext->h_ifdMax); - ecoff_put_off (abfd, intern->cbFdOffset, (bfd_byte *)ext->h_cbFdOffset); - bfd_h_put_32 (abfd, intern->crfd, (bfd_byte *)ext->h_crfd); - ecoff_put_off (abfd, intern->cbRfdOffset, (bfd_byte *)ext->h_cbRfdOffset); - bfd_h_put_32 (abfd, intern->iextMax, (bfd_byte *)ext->h_iextMax); - ecoff_put_off (abfd, intern->cbExtOffset, (bfd_byte *)ext->h_cbExtOffset); - -#ifdef TEST - if (memcmp ((char *)ext, (char *)intern, sizeof (*intern)) != 0) - abort(); -#endif -} - -/* Swap in the file descriptor record. */ - -static void -ecoff_swap_fdr_in (abfd, ext_copy, intern) - bfd *abfd; - PTR ext_copy; - FDR *intern; -{ - struct fdr_ext ext[1]; - - *ext = *(struct fdr_ext *) ext_copy; - - intern->adr = ecoff_get_off (abfd, (bfd_byte *)ext->f_adr); - intern->rss = bfd_h_get_32 (abfd, (bfd_byte *)ext->f_rss); -#ifdef ECOFF_64 - if (intern->rss == 0xffffffff) - intern->rss = -1; -#endif - intern->issBase = bfd_h_get_32 (abfd, (bfd_byte *)ext->f_issBase); - intern->cbSs = ecoff_get_off (abfd, (bfd_byte *)ext->f_cbSs); - intern->isymBase = bfd_h_get_32 (abfd, (bfd_byte *)ext->f_isymBase); - intern->csym = bfd_h_get_32 (abfd, (bfd_byte *)ext->f_csym); - intern->ilineBase = bfd_h_get_32 (abfd, (bfd_byte *)ext->f_ilineBase); - intern->cline = bfd_h_get_32 (abfd, (bfd_byte *)ext->f_cline); - intern->ioptBase = bfd_h_get_32 (abfd, (bfd_byte *)ext->f_ioptBase); - intern->copt = bfd_h_get_32 (abfd, (bfd_byte *)ext->f_copt); -#ifdef ECOFF_32 - intern->ipdFirst = bfd_h_get_16 (abfd, (bfd_byte *)ext->f_ipdFirst); - intern->cpd = bfd_h_get_16 (abfd, (bfd_byte *)ext->f_cpd); -#endif -#ifdef ECOFF_64 - intern->ipdFirst = bfd_h_get_32 (abfd, (bfd_byte *)ext->f_ipdFirst); - intern->cpd = bfd_h_get_32 (abfd, (bfd_byte *)ext->f_cpd); -#endif - intern->iauxBase = bfd_h_get_32 (abfd, (bfd_byte *)ext->f_iauxBase); - intern->caux = bfd_h_get_32 (abfd, (bfd_byte *)ext->f_caux); - intern->rfdBase = bfd_h_get_32 (abfd, (bfd_byte *)ext->f_rfdBase); - intern->crfd = bfd_h_get_32 (abfd, (bfd_byte *)ext->f_crfd); - - /* now the fun stuff... */ - if (bfd_header_big_endian (abfd)) { - intern->lang = (ext->f_bits1[0] & FDR_BITS1_LANG_BIG) - >> FDR_BITS1_LANG_SH_BIG; - intern->fMerge = 0 != (ext->f_bits1[0] & FDR_BITS1_FMERGE_BIG); - intern->fReadin = 0 != (ext->f_bits1[0] & FDR_BITS1_FREADIN_BIG); - intern->fBigendian = 0 != (ext->f_bits1[0] & FDR_BITS1_FBIGENDIAN_BIG); - intern->glevel = (ext->f_bits2[0] & FDR_BITS2_GLEVEL_BIG) - >> FDR_BITS2_GLEVEL_SH_BIG; - } else { - intern->lang = (ext->f_bits1[0] & FDR_BITS1_LANG_LITTLE) - >> FDR_BITS1_LANG_SH_LITTLE; - intern->fMerge = 0 != (ext->f_bits1[0] & FDR_BITS1_FMERGE_LITTLE); - intern->fReadin = 0 != (ext->f_bits1[0] & FDR_BITS1_FREADIN_LITTLE); - intern->fBigendian = 0 != (ext->f_bits1[0] & FDR_BITS1_FBIGENDIAN_LITTLE); - intern->glevel = (ext->f_bits2[0] & FDR_BITS2_GLEVEL_LITTLE) - >> FDR_BITS2_GLEVEL_SH_LITTLE; - } - intern->reserved = 0; - - intern->cbLineOffset = ecoff_get_off (abfd, (bfd_byte *)ext->f_cbLineOffset); - intern->cbLine = ecoff_get_off (abfd, (bfd_byte *)ext->f_cbLine); - -#ifdef TEST - if (memcmp ((char *)ext, (char *)intern, sizeof (*intern)) != 0) - abort(); -#endif -} - -/* Swap out the file descriptor record. */ - -static void -ecoff_swap_fdr_out (abfd, intern_copy, ext_ptr) - bfd *abfd; - const FDR *intern_copy; - PTR ext_ptr; -{ - struct fdr_ext *ext = (struct fdr_ext *) ext_ptr; - FDR intern[1]; - - *intern = *intern_copy; /* Make it reasonable to do in-place. */ - - ecoff_put_off (abfd, intern->adr, (bfd_byte *)ext->f_adr); - bfd_h_put_32 (abfd, intern->rss, (bfd_byte *)ext->f_rss); - bfd_h_put_32 (abfd, intern->issBase, (bfd_byte *)ext->f_issBase); - ecoff_put_off (abfd, intern->cbSs, (bfd_byte *)ext->f_cbSs); - bfd_h_put_32 (abfd, intern->isymBase, (bfd_byte *)ext->f_isymBase); - bfd_h_put_32 (abfd, intern->csym, (bfd_byte *)ext->f_csym); - bfd_h_put_32 (abfd, intern->ilineBase, (bfd_byte *)ext->f_ilineBase); - bfd_h_put_32 (abfd, intern->cline, (bfd_byte *)ext->f_cline); - bfd_h_put_32 (abfd, intern->ioptBase, (bfd_byte *)ext->f_ioptBase); - bfd_h_put_32 (abfd, intern->copt, (bfd_byte *)ext->f_copt); -#ifdef ECOFF_32 - bfd_h_put_16 (abfd, intern->ipdFirst, (bfd_byte *)ext->f_ipdFirst); - bfd_h_put_16 (abfd, intern->cpd, (bfd_byte *)ext->f_cpd); -#endif -#ifdef ECOFF_64 - bfd_h_put_32 (abfd, intern->ipdFirst, (bfd_byte *)ext->f_ipdFirst); - bfd_h_put_32 (abfd, intern->cpd, (bfd_byte *)ext->f_cpd); -#endif - bfd_h_put_32 (abfd, intern->iauxBase, (bfd_byte *)ext->f_iauxBase); - bfd_h_put_32 (abfd, intern->caux, (bfd_byte *)ext->f_caux); - bfd_h_put_32 (abfd, intern->rfdBase, (bfd_byte *)ext->f_rfdBase); - bfd_h_put_32 (abfd, intern->crfd, (bfd_byte *)ext->f_crfd); - - /* now the fun stuff... */ - if (bfd_header_big_endian (abfd)) { - ext->f_bits1[0] = (((intern->lang << FDR_BITS1_LANG_SH_BIG) - & FDR_BITS1_LANG_BIG) - | (intern->fMerge ? FDR_BITS1_FMERGE_BIG : 0) - | (intern->fReadin ? FDR_BITS1_FREADIN_BIG : 0) - | (intern->fBigendian ? FDR_BITS1_FBIGENDIAN_BIG : 0)); - ext->f_bits2[0] = ((intern->glevel << FDR_BITS2_GLEVEL_SH_BIG) - & FDR_BITS2_GLEVEL_BIG); - ext->f_bits2[1] = 0; - ext->f_bits2[2] = 0; - } else { - ext->f_bits1[0] = (((intern->lang << FDR_BITS1_LANG_SH_LITTLE) - & FDR_BITS1_LANG_LITTLE) - | (intern->fMerge ? FDR_BITS1_FMERGE_LITTLE : 0) - | (intern->fReadin ? FDR_BITS1_FREADIN_LITTLE : 0) - | (intern->fBigendian ? FDR_BITS1_FBIGENDIAN_LITTLE : 0)); - ext->f_bits2[0] = ((intern->glevel << FDR_BITS2_GLEVEL_SH_LITTLE) - & FDR_BITS2_GLEVEL_LITTLE); - ext->f_bits2[1] = 0; - ext->f_bits2[2] = 0; - } - - ecoff_put_off (abfd, intern->cbLineOffset, (bfd_byte *)ext->f_cbLineOffset); - ecoff_put_off (abfd, intern->cbLine, (bfd_byte *)ext->f_cbLine); - -#ifdef TEST - if (memcmp ((char *)ext, (char *)intern, sizeof (*intern)) != 0) - abort(); -#endif -} - -#ifndef MPW_C - -/* Swap in the procedure descriptor record. */ - -static void -ecoff_swap_pdr_in (abfd, ext_copy, intern) - bfd *abfd; - PTR ext_copy; - PDR *intern; -{ - struct pdr_ext ext[1]; - - *ext = *(struct pdr_ext *) ext_copy; - - memset ((PTR) intern, 0, sizeof (*intern)); - - intern->adr = ecoff_get_off (abfd, (bfd_byte *)ext->p_adr); - intern->isym = bfd_h_get_32 (abfd, (bfd_byte *)ext->p_isym); - intern->iline = bfd_h_get_32 (abfd, (bfd_byte *)ext->p_iline); - intern->regmask = bfd_h_get_32 (abfd, (bfd_byte *)ext->p_regmask); - intern->regoffset = bfd_h_get_signed_32 (abfd, - (bfd_byte *)ext->p_regoffset); - intern->iopt = bfd_h_get_signed_32 (abfd, (bfd_byte *)ext->p_iopt); - intern->fregmask = bfd_h_get_32 (abfd, (bfd_byte *)ext->p_fregmask); - intern->fregoffset = bfd_h_get_signed_32 (abfd, - (bfd_byte *)ext->p_fregoffset); - intern->frameoffset = bfd_h_get_signed_32 (abfd, - (bfd_byte *)ext->p_frameoffset); - intern->framereg = bfd_h_get_16 (abfd, (bfd_byte *)ext->p_framereg); - intern->pcreg = bfd_h_get_16 (abfd, (bfd_byte *)ext->p_pcreg); - intern->lnLow = bfd_h_get_32 (abfd, (bfd_byte *)ext->p_lnLow); - intern->lnHigh = bfd_h_get_32 (abfd, (bfd_byte *)ext->p_lnHigh); - intern->cbLineOffset = ecoff_get_off (abfd, (bfd_byte *)ext->p_cbLineOffset); - -#ifdef ECOFF_64 - intern->gp_prologue = bfd_h_get_8 (abfd, (bfd_byte *) ext->p_gp_prologue); - if (bfd_header_big_endian (abfd)) - { - intern->gp_used = 0 != (ext->p_bits1[0] & PDR_BITS1_GP_USED_BIG); - intern->reg_frame = 0 != (ext->p_bits1[0] & PDR_BITS1_REG_FRAME_BIG); - intern->prof = 0 != (ext->p_bits1[0] & PDR_BITS1_PROF_BIG); - intern->reserved = (((ext->p_bits1[0] & PDR_BITS1_RESERVED_BIG) - << PDR_BITS1_RESERVED_SH_LEFT_BIG) - | ((ext->p_bits2[0] & PDR_BITS2_RESERVED_BIG) - >> PDR_BITS2_RESERVED_SH_BIG)); - } - else - { - intern->gp_used = 0 != (ext->p_bits1[0] & PDR_BITS1_GP_USED_LITTLE); - intern->reg_frame = 0 != (ext->p_bits1[0] & PDR_BITS1_REG_FRAME_LITTLE); - intern->prof = 0 != (ext->p_bits1[0] & PDR_BITS1_PROF_LITTLE); - intern->reserved = (((ext->p_bits1[0] & PDR_BITS1_RESERVED_LITTLE) - >> PDR_BITS1_RESERVED_SH_LITTLE) - | ((ext->p_bits2[0] & PDR_BITS2_RESERVED_LITTLE) - << PDR_BITS2_RESERVED_SH_LEFT_LITTLE)); - } - intern->localoff = bfd_h_get_8 (abfd, (bfd_byte *) ext->p_localoff); -#endif - -#ifdef TEST - if (memcmp ((char *)ext, (char *)intern, sizeof (*intern)) != 0) - abort(); -#endif -} - -/* Swap out the procedure descriptor record. */ - -static void -ecoff_swap_pdr_out (abfd, intern_copy, ext_ptr) - bfd *abfd; - const PDR *intern_copy; - PTR ext_ptr; -{ - struct pdr_ext *ext = (struct pdr_ext *) ext_ptr; - PDR intern[1]; - - *intern = *intern_copy; /* Make it reasonable to do in-place. */ - - ecoff_put_off (abfd, intern->adr, (bfd_byte *)ext->p_adr); - bfd_h_put_32 (abfd, intern->isym, (bfd_byte *)ext->p_isym); - bfd_h_put_32 (abfd, intern->iline, (bfd_byte *)ext->p_iline); - bfd_h_put_32 (abfd, intern->regmask, (bfd_byte *)ext->p_regmask); - bfd_h_put_32 (abfd, intern->regoffset, (bfd_byte *)ext->p_regoffset); - bfd_h_put_32 (abfd, intern->iopt, (bfd_byte *)ext->p_iopt); - bfd_h_put_32 (abfd, intern->fregmask, (bfd_byte *)ext->p_fregmask); - bfd_h_put_32 (abfd, intern->fregoffset, (bfd_byte *)ext->p_fregoffset); - bfd_h_put_32 (abfd, intern->frameoffset, (bfd_byte *)ext->p_frameoffset); - bfd_h_put_16 (abfd, intern->framereg, (bfd_byte *)ext->p_framereg); - bfd_h_put_16 (abfd, intern->pcreg, (bfd_byte *)ext->p_pcreg); - bfd_h_put_32 (abfd, intern->lnLow, (bfd_byte *)ext->p_lnLow); - bfd_h_put_32 (abfd, intern->lnHigh, (bfd_byte *)ext->p_lnHigh); - ecoff_put_off (abfd, intern->cbLineOffset, (bfd_byte *)ext->p_cbLineOffset); - -#ifdef ECOFF_64 - bfd_h_put_8 (abfd, intern->gp_prologue, (bfd_byte *) ext->p_gp_prologue); - if (bfd_header_big_endian (abfd)) - { - ext->p_bits1[0] = ((intern->gp_used ? PDR_BITS1_GP_USED_BIG : 0) - | (intern->reg_frame ? PDR_BITS1_REG_FRAME_BIG : 0) - | (intern->prof ? PDR_BITS1_PROF_BIG : 0) - | ((intern->reserved - >> PDR_BITS1_RESERVED_SH_LEFT_BIG) - & PDR_BITS1_RESERVED_BIG)); - ext->p_bits2[0] = ((intern->reserved << PDR_BITS2_RESERVED_SH_BIG) - & PDR_BITS2_RESERVED_BIG); - } - else - { - ext->p_bits1[0] = ((intern->gp_used ? PDR_BITS1_GP_USED_LITTLE : 0) - | (intern->reg_frame ? PDR_BITS1_REG_FRAME_LITTLE : 0) - | (intern->prof ? PDR_BITS1_PROF_LITTLE : 0) - | ((intern->reserved << PDR_BITS1_RESERVED_SH_LITTLE) - & PDR_BITS1_RESERVED_LITTLE)); - ext->p_bits2[0] = ((intern->reserved >> - PDR_BITS2_RESERVED_SH_LEFT_LITTLE) - & PDR_BITS2_RESERVED_LITTLE); - } - bfd_h_put_8 (abfd, intern->localoff, (bfd_byte *) ext->p_localoff); -#endif - -#ifdef TEST - if (memcmp ((char *)ext, (char *)intern, sizeof (*intern)) != 0) - abort(); -#endif -} - -#else /* MPW_C */ -/* Same routines, but with ECOFF_64 code removed, so ^&%$#&! MPW C doesn't - corrupt itself and then freak out. */ -/* Swap in the procedure descriptor record. */ - -static void -ecoff_swap_pdr_in (abfd, ext_copy, intern) - bfd *abfd; - PTR ext_copy; - PDR *intern; -{ - struct pdr_ext ext[1]; - - *ext = *(struct pdr_ext *) ext_copy; - - intern->adr = ecoff_get_off (abfd, (bfd_byte *)ext->p_adr); - intern->isym = bfd_h_get_32 (abfd, (bfd_byte *)ext->p_isym); - intern->iline = bfd_h_get_32 (abfd, (bfd_byte *)ext->p_iline); - intern->regmask = bfd_h_get_32 (abfd, (bfd_byte *)ext->p_regmask); - intern->regoffset = bfd_h_get_signed_32 (abfd, - (bfd_byte *)ext->p_regoffset); - intern->iopt = bfd_h_get_signed_32 (abfd, (bfd_byte *)ext->p_iopt); - intern->fregmask = bfd_h_get_32 (abfd, (bfd_byte *)ext->p_fregmask); - intern->fregoffset = bfd_h_get_signed_32 (abfd, - (bfd_byte *)ext->p_fregoffset); - intern->frameoffset = bfd_h_get_signed_32 (abfd, - (bfd_byte *)ext->p_frameoffset); - intern->framereg = bfd_h_get_16 (abfd, (bfd_byte *)ext->p_framereg); - intern->pcreg = bfd_h_get_16 (abfd, (bfd_byte *)ext->p_pcreg); - intern->lnLow = bfd_h_get_32 (abfd, (bfd_byte *)ext->p_lnLow); - intern->lnHigh = bfd_h_get_32 (abfd, (bfd_byte *)ext->p_lnHigh); - intern->cbLineOffset = ecoff_get_off (abfd, (bfd_byte *)ext->p_cbLineOffset); - -#ifdef TEST - if (memcmp ((char *)ext, (char *)intern, sizeof (*intern)) != 0) - abort(); -#endif -} - -/* Swap out the procedure descriptor record. */ - -static void -ecoff_swap_pdr_out (abfd, intern_copy, ext_ptr) - bfd *abfd; - const PDR *intern_copy; - PTR ext_ptr; -{ - struct pdr_ext *ext = (struct pdr_ext *) ext_ptr; - PDR intern[1]; - - *intern = *intern_copy; /* Make it reasonable to do in-place. */ - - ecoff_put_off (abfd, intern->adr, (bfd_byte *)ext->p_adr); - bfd_h_put_32 (abfd, intern->isym, (bfd_byte *)ext->p_isym); - bfd_h_put_32 (abfd, intern->iline, (bfd_byte *)ext->p_iline); - bfd_h_put_32 (abfd, intern->regmask, (bfd_byte *)ext->p_regmask); - bfd_h_put_32 (abfd, intern->regoffset, (bfd_byte *)ext->p_regoffset); - bfd_h_put_32 (abfd, intern->iopt, (bfd_byte *)ext->p_iopt); - bfd_h_put_32 (abfd, intern->fregmask, (bfd_byte *)ext->p_fregmask); - bfd_h_put_32 (abfd, intern->fregoffset, (bfd_byte *)ext->p_fregoffset); - bfd_h_put_32 (abfd, intern->frameoffset, (bfd_byte *)ext->p_frameoffset); - bfd_h_put_16 (abfd, intern->framereg, (bfd_byte *)ext->p_framereg); - bfd_h_put_16 (abfd, intern->pcreg, (bfd_byte *)ext->p_pcreg); - bfd_h_put_32 (abfd, intern->lnLow, (bfd_byte *)ext->p_lnLow); - bfd_h_put_32 (abfd, intern->lnHigh, (bfd_byte *)ext->p_lnHigh); - ecoff_put_off (abfd, intern->cbLineOffset, (bfd_byte *)ext->p_cbLineOffset); - -#ifdef TEST - if (memcmp ((char *)ext, (char *)intern, sizeof (*intern)) != 0) - abort(); -#endif -} -#endif /* MPW_C */ - -/* Swap in a symbol record. */ - -static void -ecoff_swap_sym_in (abfd, ext_copy, intern) - bfd *abfd; - PTR ext_copy; - SYMR *intern; -{ - struct sym_ext ext[1]; - - *ext = *(struct sym_ext *) ext_copy; - - intern->iss = bfd_h_get_32 (abfd, (bfd_byte *)ext->s_iss); - intern->value = ecoff_get_off (abfd, (bfd_byte *)ext->s_value); - - /* now the fun stuff... */ - if (bfd_header_big_endian (abfd)) { - intern->st = (ext->s_bits1[0] & SYM_BITS1_ST_BIG) - >> SYM_BITS1_ST_SH_BIG; - intern->sc = ((ext->s_bits1[0] & SYM_BITS1_SC_BIG) - << SYM_BITS1_SC_SH_LEFT_BIG) - | ((ext->s_bits2[0] & SYM_BITS2_SC_BIG) - >> SYM_BITS2_SC_SH_BIG); - intern->reserved = 0 != (ext->s_bits2[0] & SYM_BITS2_RESERVED_BIG); - intern->index = ((ext->s_bits2[0] & SYM_BITS2_INDEX_BIG) - << SYM_BITS2_INDEX_SH_LEFT_BIG) - | (ext->s_bits3[0] << SYM_BITS3_INDEX_SH_LEFT_BIG) - | (ext->s_bits4[0] << SYM_BITS4_INDEX_SH_LEFT_BIG); - } else { - intern->st = (ext->s_bits1[0] & SYM_BITS1_ST_LITTLE) - >> SYM_BITS1_ST_SH_LITTLE; - intern->sc = ((ext->s_bits1[0] & SYM_BITS1_SC_LITTLE) - >> SYM_BITS1_SC_SH_LITTLE) - | ((ext->s_bits2[0] & SYM_BITS2_SC_LITTLE) - << SYM_BITS2_SC_SH_LEFT_LITTLE); - intern->reserved = 0 != (ext->s_bits2[0] & SYM_BITS2_RESERVED_LITTLE); - intern->index = ((ext->s_bits2[0] & SYM_BITS2_INDEX_LITTLE) - >> SYM_BITS2_INDEX_SH_LITTLE) - | (ext->s_bits3[0] << SYM_BITS3_INDEX_SH_LEFT_LITTLE) - | ((unsigned int) ext->s_bits4[0] - << SYM_BITS4_INDEX_SH_LEFT_LITTLE); - } - -#ifdef TEST - if (memcmp ((char *)ext, (char *)intern, sizeof (*intern)) != 0) - abort(); -#endif -} - -/* Swap out a symbol record. */ - -static void -ecoff_swap_sym_out (abfd, intern_copy, ext_ptr) - bfd *abfd; - const SYMR *intern_copy; - PTR ext_ptr; -{ - struct sym_ext *ext = (struct sym_ext *) ext_ptr; - SYMR intern[1]; - - *intern = *intern_copy; /* Make it reasonable to do in-place. */ - - bfd_h_put_32 (abfd, intern->iss, (bfd_byte *)ext->s_iss); - ecoff_put_off (abfd, intern->value, (bfd_byte *)ext->s_value); - - /* now the fun stuff... */ - if (bfd_header_big_endian (abfd)) { - ext->s_bits1[0] = (((intern->st << SYM_BITS1_ST_SH_BIG) - & SYM_BITS1_ST_BIG) - | ((intern->sc >> SYM_BITS1_SC_SH_LEFT_BIG) - & SYM_BITS1_SC_BIG)); - ext->s_bits2[0] = (((intern->sc << SYM_BITS2_SC_SH_BIG) - & SYM_BITS2_SC_BIG) - | (intern->reserved ? SYM_BITS2_RESERVED_BIG : 0) - | ((intern->index >> SYM_BITS2_INDEX_SH_LEFT_BIG) - & SYM_BITS2_INDEX_BIG)); - ext->s_bits3[0] = (intern->index >> SYM_BITS3_INDEX_SH_LEFT_BIG) & 0xff; - ext->s_bits4[0] = (intern->index >> SYM_BITS4_INDEX_SH_LEFT_BIG) & 0xff; - } else { - ext->s_bits1[0] = (((intern->st << SYM_BITS1_ST_SH_LITTLE) - & SYM_BITS1_ST_LITTLE) - | ((intern->sc << SYM_BITS1_SC_SH_LITTLE) - & SYM_BITS1_SC_LITTLE)); - ext->s_bits2[0] = (((intern->sc >> SYM_BITS2_SC_SH_LEFT_LITTLE) - & SYM_BITS2_SC_LITTLE) - | (intern->reserved ? SYM_BITS2_RESERVED_LITTLE : 0) - | ((intern->index << SYM_BITS2_INDEX_SH_LITTLE) - & SYM_BITS2_INDEX_LITTLE)); - ext->s_bits3[0] = (intern->index >> SYM_BITS3_INDEX_SH_LEFT_LITTLE) & 0xff; - ext->s_bits4[0] = (intern->index >> SYM_BITS4_INDEX_SH_LEFT_LITTLE) & 0xff; - } - -#ifdef TEST - if (memcmp ((char *)ext, (char *)intern, sizeof (*intern)) != 0) - abort(); -#endif -} - -/* Swap in an external symbol record. */ - -static void -ecoff_swap_ext_in (abfd, ext_copy, intern) - bfd *abfd; - PTR ext_copy; - EXTR *intern; -{ - struct ext_ext ext[1]; - - *ext = *(struct ext_ext *) ext_copy; - - /* now the fun stuff... */ - if (bfd_header_big_endian (abfd)) { - intern->jmptbl = 0 != (ext->es_bits1[0] & EXT_BITS1_JMPTBL_BIG); - intern->cobol_main = 0 != (ext->es_bits1[0] & EXT_BITS1_COBOL_MAIN_BIG); - intern->weakext = 0 != (ext->es_bits1[0] & EXT_BITS1_WEAKEXT_BIG); - } else { - intern->jmptbl = 0 != (ext->es_bits1[0] & EXT_BITS1_JMPTBL_LITTLE); - intern->cobol_main = 0 != (ext->es_bits1[0] & EXT_BITS1_COBOL_MAIN_LITTLE); - intern->weakext = 0 != (ext->es_bits1[0] & EXT_BITS1_WEAKEXT_LITTLE); - } - intern->reserved = 0; - -#ifdef ECOFF_32 - intern->ifd = bfd_h_get_signed_16 (abfd, (bfd_byte *)ext->es_ifd); -#endif -#ifdef ECOFF_64 - intern->ifd = bfd_h_get_signed_32 (abfd, (bfd_byte *)ext->es_ifd); -#endif - - ecoff_swap_sym_in (abfd, &ext->es_asym, &intern->asym); - -#ifdef TEST - if (memcmp ((char *)ext, (char *)intern, sizeof (*intern)) != 0) - abort(); -#endif -} - -/* Swap out an external symbol record. */ - -static void -ecoff_swap_ext_out (abfd, intern_copy, ext_ptr) - bfd *abfd; - const EXTR *intern_copy; - PTR ext_ptr; -{ - struct ext_ext *ext = (struct ext_ext *) ext_ptr; - EXTR intern[1]; - - *intern = *intern_copy; /* Make it reasonable to do in-place. */ - - /* now the fun stuff... */ - if (bfd_header_big_endian (abfd)) { - ext->es_bits1[0] = ((intern->jmptbl ? EXT_BITS1_JMPTBL_BIG : 0) - | (intern->cobol_main ? EXT_BITS1_COBOL_MAIN_BIG : 0) - | (intern->weakext ? EXT_BITS1_WEAKEXT_BIG : 0)); - ext->es_bits2[0] = 0; -#ifdef ECOFF_64 - ext->es_bits2[1] = 0; - ext->es_bits2[2] = 0; -#endif - } else { - ext->es_bits1[0] = ((intern->jmptbl ? EXT_BITS1_JMPTBL_LITTLE : 0) - | (intern->cobol_main ? EXT_BITS1_COBOL_MAIN_LITTLE : 0) - | (intern->weakext ? EXT_BITS1_WEAKEXT_LITTLE : 0)); - ext->es_bits2[0] = 0; -#ifdef ECOFF_64 - ext->es_bits2[1] = 0; - ext->es_bits2[2] = 0; -#endif - } - -#ifdef ECOFF_32 - bfd_h_put_signed_16 (abfd, intern->ifd, (bfd_byte *)ext->es_ifd); -#endif -#ifdef ECOFF_64 - bfd_h_put_signed_32 (abfd, intern->ifd, (bfd_byte *)ext->es_ifd); -#endif - - ecoff_swap_sym_out (abfd, &intern->asym, &ext->es_asym); - -#ifdef TEST - if (memcmp ((char *)ext, (char *)intern, sizeof (*intern)) != 0) - abort(); -#endif -} - -/* Swap in a relative file descriptor. */ - -static void -ecoff_swap_rfd_in (abfd, ext_ptr, intern) - bfd *abfd; - PTR ext_ptr; - RFDT *intern; -{ - struct rfd_ext *ext = (struct rfd_ext *) ext_ptr; - - *intern = bfd_h_get_32 (abfd, (bfd_byte *)ext->rfd); - -#ifdef TEST - if (memcmp ((char *)ext, (char *)intern, sizeof (*intern)) != 0) - abort(); -#endif -} - -/* Swap out a relative file descriptor. */ - -static void -ecoff_swap_rfd_out (abfd, intern, ext_ptr) - bfd *abfd; - const RFDT *intern; - PTR ext_ptr; -{ - struct rfd_ext *ext = (struct rfd_ext *) ext_ptr; - - bfd_h_put_32 (abfd, *intern, (bfd_byte *)ext->rfd); - -#ifdef TEST - if (memcmp ((char *)ext, (char *)intern, sizeof (*intern)) != 0) - abort(); -#endif -} - -/* Swap in an optimization symbol. */ - -static void -ecoff_swap_opt_in (abfd, ext_copy, intern) - bfd *abfd; - PTR ext_copy; - OPTR *intern; -{ - struct opt_ext ext[1]; - - *ext = *(struct opt_ext *) ext_copy; - - if (bfd_header_big_endian (abfd)) - { - intern->ot = ext->o_bits1[0]; - intern->value = (((unsigned int) ext->o_bits2[0] - << OPT_BITS2_VALUE_SH_LEFT_BIG) - | ((unsigned int) ext->o_bits3[0] - << OPT_BITS2_VALUE_SH_LEFT_BIG) - | ((unsigned int) ext->o_bits4[0] - << OPT_BITS2_VALUE_SH_LEFT_BIG)); - } - else - { - intern->ot = ext->o_bits1[0]; - intern->value = ((ext->o_bits2[0] << OPT_BITS2_VALUE_SH_LEFT_LITTLE) - | (ext->o_bits3[0] << OPT_BITS2_VALUE_SH_LEFT_LITTLE) - | (ext->o_bits4[0] << OPT_BITS2_VALUE_SH_LEFT_LITTLE)); - } - - _bfd_ecoff_swap_rndx_in (bfd_header_big_endian (abfd), - &ext->o_rndx, &intern->rndx); - - intern->offset = bfd_h_get_32 (abfd, (bfd_byte *) ext->o_offset); - -#ifdef TEST - if (memcmp ((char *)ext, (char *)intern, sizeof (*intern)) != 0) - abort(); -#endif -} - -/* Swap out an optimization symbol. */ - -static void -ecoff_swap_opt_out (abfd, intern_copy, ext_ptr) - bfd *abfd; - const OPTR *intern_copy; - PTR ext_ptr; -{ - struct opt_ext *ext = (struct opt_ext *) ext_ptr; - OPTR intern[1]; - - *intern = *intern_copy; /* Make it reasonable to do in-place. */ - - if (bfd_header_big_endian (abfd)) - { - ext->o_bits1[0] = intern->ot; - ext->o_bits2[0] = intern->value >> OPT_BITS2_VALUE_SH_LEFT_BIG; - ext->o_bits3[0] = intern->value >> OPT_BITS3_VALUE_SH_LEFT_BIG; - ext->o_bits4[0] = intern->value >> OPT_BITS4_VALUE_SH_LEFT_BIG; - } - else - { - ext->o_bits1[0] = intern->ot; - ext->o_bits2[0] = intern->value >> OPT_BITS2_VALUE_SH_LEFT_LITTLE; - ext->o_bits3[0] = intern->value >> OPT_BITS3_VALUE_SH_LEFT_LITTLE; - ext->o_bits4[0] = intern->value >> OPT_BITS4_VALUE_SH_LEFT_LITTLE; - } - - _bfd_ecoff_swap_rndx_out (bfd_header_big_endian (abfd), - &intern->rndx, &ext->o_rndx); - - bfd_h_put_32 (abfd, intern->value, (bfd_byte *) ext->o_offset); - -#ifdef TEST - if (memcmp ((char *)ext, (char *)intern, sizeof (*intern)) != 0) - abort(); -#endif -} - -/* Swap in a dense number. */ - -static void -ecoff_swap_dnr_in (abfd, ext_copy, intern) - bfd *abfd; - PTR ext_copy; - DNR *intern; -{ - struct dnr_ext ext[1]; - - *ext = *(struct dnr_ext *) ext_copy; - - intern->rfd = bfd_h_get_32 (abfd, (bfd_byte *) ext->d_rfd); - intern->index = bfd_h_get_32 (abfd, (bfd_byte *) ext->d_index); - -#ifdef TEST - if (memcmp ((char *)ext, (char *)intern, sizeof (*intern)) != 0) - abort(); -#endif -} - -/* Swap out a dense number. */ - -static void -ecoff_swap_dnr_out (abfd, intern_copy, ext_ptr) - bfd *abfd; - const DNR *intern_copy; - PTR ext_ptr; -{ - struct dnr_ext *ext = (struct dnr_ext *) ext_ptr; - DNR intern[1]; - - *intern = *intern_copy; /* Make it reasonable to do in-place. */ - - bfd_h_put_32 (abfd, intern->rfd, (bfd_byte *) ext->d_rfd); - bfd_h_put_32 (abfd, intern->index, (bfd_byte *) ext->d_index); - -#ifdef TEST - if (memcmp ((char *)ext, (char *)intern, sizeof (*intern)) != 0) - abort(); -#endif -} diff --git a/contrib/gdb/bfd/elf-bfd.h b/contrib/gdb/bfd/elf-bfd.h deleted file mode 100644 index ee38e5b12f4cc..0000000000000 --- a/contrib/gdb/bfd/elf-bfd.h +++ /dev/null @@ -1,858 +0,0 @@ -/* BFD back-end data structures for ELF files. - Copyright (C) 1992, 1993, 1994, 1995, 1996 Free Software Foundation, Inc. - Written by Cygnus Support. - -This file is part of BFD, the Binary File Descriptor library. - -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 2 of the License, 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ - -#ifndef _LIBELF_H_ -#define _LIBELF_H_ 1 - -#include "elf/common.h" -#include "elf/internal.h" -#include "elf/external.h" -#include "bfdlink.h" - -/* If size isn't specified as 64 or 32, NAME macro should fail. */ -#ifndef NAME -#if ARCH_SIZE==64 -#define NAME(x,y) CAT4(x,64,_,y) -#endif -#if ARCH_SIZE==32 -#define NAME(x,y) CAT4(x,32,_,y) -#endif -#endif - -#ifndef NAME -#define NAME(x,y) CAT4(x,NOSIZE,_,y) -#endif - -#define ElfNAME(X) NAME(Elf,X) -#define elfNAME(X) NAME(elf,X) - -/* Information held for an ELF symbol. The first field is the - corresponding asymbol. Every symbol is an ELF file is actually a - pointer to this structure, although it is often handled as a - pointer to an asymbol. */ - -typedef struct -{ - /* The BFD symbol. */ - asymbol symbol; - /* ELF symbol information. */ - Elf_Internal_Sym internal_elf_sym; - /* Backend specific information. */ - union - { - unsigned int hppa_arg_reloc; - PTR mips_extr; - PTR any; - } - tc_data; -} elf_symbol_type; - -/* ELF linker hash table entries. */ - -struct elf_link_hash_entry -{ - struct bfd_link_hash_entry root; - - /* Symbol index in output file. This is initialized to -1. It is - set to -2 if the symbol is used by a reloc. */ - long indx; - - /* Symbol size. */ - bfd_size_type size; - - /* Symbol index as a dynamic symbol. Initialized to -1, and remains - -1 if this is not a dynamic symbol. */ - long dynindx; - - /* String table index in .dynstr if this is a dynamic symbol. */ - unsigned long dynstr_index; - - /* If this is a weak defined symbol from a dynamic object, this - field points to a defined symbol with the same value, if there is - one. Otherwise it is NULL. */ - struct elf_link_hash_entry *weakdef; - - /* If this symbol requires an entry in the global offset table, the - processor specific backend uses this field to hold the offset - into the .got section. If this field is -1, then the symbol does - not require a global offset table entry. */ - bfd_vma got_offset; - - /* If this symbol requires an entry in the procedure linkage table, - the processor specific backend uses these two fields to hold the - offset into the procedure linkage section and the offset into the - .got section. If plt_offset is -1, then the symbol does not - require an entry in the procedure linkage table. */ - bfd_vma plt_offset; - - /* If this symbol is used in the linker created sections, the processor - specific backend uses this field to map the field into the offset - from the beginning of the section. */ - struct elf_linker_section_pointers *linker_section_pointer; - - /* Symbol type (STT_NOTYPE, STT_OBJECT, etc.). */ - char type; - - /* Some flags; legal values follow. */ - unsigned char elf_link_hash_flags; - /* Symbol is referenced by a non-shared object. */ -#define ELF_LINK_HASH_REF_REGULAR 01 - /* Symbol is defined by a non-shared object. */ -#define ELF_LINK_HASH_DEF_REGULAR 02 - /* Symbol is referenced by a shared object. */ -#define ELF_LINK_HASH_REF_DYNAMIC 04 - /* Symbol is defined by a shared object. */ -#define ELF_LINK_HASH_DEF_DYNAMIC 010 - /* Dynamic symbol has been adjustd. */ -#define ELF_LINK_HASH_DYNAMIC_ADJUSTED 020 - /* Symbol needs a copy reloc. */ -#define ELF_LINK_HASH_NEEDS_COPY 040 - /* Symbol needs a procedure linkage table entry. */ -#define ELF_LINK_HASH_NEEDS_PLT 0100 - /* Symbol appears in a non-ELF input file. */ -#define ELF_LINK_NON_ELF 0200 - /* Note: If you add more flags, you must change the type of - elf_link_hash_flags. */ -}; - -/* ELF linker hash table. */ - -struct elf_link_hash_table -{ - struct bfd_link_hash_table root; - /* Whether we have created the special dynamic sections required - when linking against or generating a shared object. */ - boolean dynamic_sections_created; - /* The BFD used to hold special sections created by the linker. - This will be the first BFD found which requires these sections to - be created. */ - bfd *dynobj; - /* The number of symbols found in the link which must be put into - the .dynsym section. */ - bfd_size_type dynsymcount; - /* The string table of dynamic symbols, which becomes the .dynstr - section. */ - struct bfd_strtab_hash *dynstr; - /* The number of buckets in the hash table in the .hash section. - This is based on the number of dynamic symbols. */ - bfd_size_type bucketcount; - /* A linked list of DT_NEEDED names found in dynamic objects - included in the link. */ - struct bfd_link_needed_list *needed; -}; - -/* Look up an entry in an ELF linker hash table. */ - -#define elf_link_hash_lookup(table, string, create, copy, follow) \ - ((struct elf_link_hash_entry *) \ - bfd_link_hash_lookup (&(table)->root, (string), (create), \ - (copy), (follow))) - -/* Traverse an ELF linker hash table. */ - -#define elf_link_hash_traverse(table, func, info) \ - (bfd_link_hash_traverse \ - (&(table)->root, \ - (boolean (*) PARAMS ((struct bfd_link_hash_entry *, PTR))) (func), \ - (info))) - -/* Get the ELF linker hash table from a link_info structure. */ - -#define elf_hash_table(p) ((struct elf_link_hash_table *) ((p)->hash)) - -/* Constant information held for an ELF backend. */ - -struct elf_size_info { - unsigned char sizeof_ehdr, sizeof_phdr, sizeof_shdr; - unsigned char sizeof_rel, sizeof_rela, sizeof_sym, sizeof_dyn, sizeof_note; - - unsigned char arch_size, file_align; - unsigned char elfclass, ev_current; - int (*write_out_phdrs) PARAMS ((bfd *, Elf_Internal_Phdr *, int)); - boolean (*write_shdrs_and_ehdr) PARAMS ((bfd *)); - void (*write_relocs) PARAMS ((bfd *, asection *, PTR)); - void (*swap_symbol_out) PARAMS ((bfd *, Elf_Internal_Sym *, PTR)); - boolean (*slurp_reloc_table) PARAMS ((bfd *, asection *, asymbol **)); - long (*slurp_symbol_table) PARAMS ((bfd *, asymbol **, boolean)); - void (*swap_dyn_in) PARAMS ((bfd *, const PTR, Elf_Internal_Dyn *)); -}; - -#define elf_symbol_from(ABFD,S) \ - (((S)->the_bfd->xvec->flavour == bfd_target_elf_flavour \ - && (S)->the_bfd->tdata.elf_obj_data != 0) \ - ? (elf_symbol_type *) (S) \ - : 0) - -struct elf_backend_data -{ - /* Whether the backend uses REL or RELA relocations. FIXME: some - ELF backends use both. When we need to support one, this whole - approach will need to be changed. */ - int use_rela_p; - - /* The architecture for this backend. */ - enum bfd_architecture arch; - - /* The ELF machine code (EM_xxxx) for this backend. */ - int elf_machine_code; - - /* The maximum page size for this backend. */ - bfd_vma maxpagesize; - - /* This is true if the linker should act like collect and gather - global constructors and destructors by name. This is true for - MIPS ELF because the Irix 5 tools can not handle the .init - section. */ - boolean collect; - - /* This is true if the linker should ignore changes to the type of a - symbol. This is true for MIPS ELF because some Irix 5 objects - record undefined functions as STT_OBJECT although the definitions - are STT_FUNC. */ - boolean type_change_ok; - - /* A function to translate an ELF RELA relocation to a BFD arelent - structure. */ - void (*elf_info_to_howto) PARAMS ((bfd *, arelent *, - Elf_Internal_Rela *)); - - /* A function to translate an ELF REL relocation to a BFD arelent - structure. */ - void (*elf_info_to_howto_rel) PARAMS ((bfd *, arelent *, - Elf_Internal_Rel *)); - - /* A function to determine whether a symbol is global when - partitioning the symbol table into local and global symbols. - This should be NULL for most targets, in which case the correct - thing will be done. MIPS ELF, at least on the Irix 5, has - special requirements. */ - boolean (*elf_backend_sym_is_global) PARAMS ((bfd *, asymbol *)); - - /* The remaining functions are hooks which are called only if they - are not NULL. */ - - /* A function to permit a backend specific check on whether a - particular BFD format is relevant for an object file, and to - permit the backend to set any global information it wishes. When - this is called elf_elfheader is set, but anything else should be - used with caution. If this returns false, the check_format - routine will return a bfd_error_wrong_format error. */ - boolean (*elf_backend_object_p) PARAMS ((bfd *)); - - /* A function to do additional symbol processing when reading the - ELF symbol table. This is where any processor-specific special - section indices are handled. */ - void (*elf_backend_symbol_processing) PARAMS ((bfd *, asymbol *)); - - /* A function to do additional symbol processing after reading the - entire ELF symbol table. */ - boolean (*elf_backend_symbol_table_processing) PARAMS ((bfd *, - elf_symbol_type *, - unsigned int)); - - /* A function to do additional processing on the ELF section header - just before writing it out. This is used to set the flags and - type fields for some sections, or to actually write out data for - unusual sections. */ - boolean (*elf_backend_section_processing) PARAMS ((bfd *, - Elf32_Internal_Shdr *)); - - /* A function to handle unusual section types when creating BFD - sections from ELF sections. */ - boolean (*elf_backend_section_from_shdr) PARAMS ((bfd *, - Elf32_Internal_Shdr *, - char *)); - - /* A function to set up the ELF section header for a BFD section in - preparation for writing it out. This is where the flags and type - fields are set for unusual sections. */ - boolean (*elf_backend_fake_sections) PARAMS ((bfd *, Elf32_Internal_Shdr *, - asection *)); - - /* A function to get the ELF section index for a BFD section. If - this returns true, the section was found. If it is a normal ELF - section, *RETVAL should be left unchanged. If it is not a normal - ELF section *RETVAL should be set to the SHN_xxxx index. */ - boolean (*elf_backend_section_from_bfd_section) - PARAMS ((bfd *, Elf32_Internal_Shdr *, asection *, int *retval)); - - /* If this field is not NULL, it is called by the add_symbols phase - of a link just before adding a symbol to the global linker hash - table. It may modify any of the fields as it wishes. If *NAME - is set to NULL, the symbol will be skipped rather than being - added to the hash table. This function is responsible for - handling all processor dependent symbol bindings and section - indices, and must set at least *FLAGS and *SEC for each processor - dependent case; failure to do so will cause a link error. */ - boolean (*elf_add_symbol_hook) - PARAMS ((bfd *abfd, struct bfd_link_info *info, - const Elf_Internal_Sym *, const char **name, - flagword *flags, asection **sec, bfd_vma *value)); - - /* If this field is not NULL, it is called by the elf_link_output_sym - phase of a link for each symbol which will appear in the object file. */ - boolean (*elf_backend_link_output_symbol_hook) - PARAMS ((bfd *, struct bfd_link_info *info, const char *, - Elf_Internal_Sym *, asection *)); - - /* The CREATE_DYNAMIC_SECTIONS function is called by the ELF backend - linker the first time it encounters a dynamic object in the link. - This function must create any sections required for dynamic - linking. The ABFD argument is a dynamic object. The .interp, - .dynamic, .dynsym, .dynstr, and .hash functions have already been - created, and this function may modify the section flags if - desired. This function will normally create the .got and .plt - sections, but different backends have different requirements. */ - boolean (*elf_backend_create_dynamic_sections) - PARAMS ((bfd *abfd, struct bfd_link_info *info)); - - /* The CHECK_RELOCS function is called by the add_symbols phase of - the ELF backend linker. It is called once for each section with - relocs of an object file, just after the symbols for the object - file have been added to the global linker hash table. The - function must look through the relocs and do any special handling - required. This generally means allocating space in the global - offset table, and perhaps allocating space for a reloc. The - relocs are always passed as Rela structures; if the section - actually uses Rel structures, the r_addend field will always be - zero. */ - boolean (*check_relocs) - PARAMS ((bfd *abfd, struct bfd_link_info *info, asection *o, - const Elf_Internal_Rela *relocs)); - - /* The ADJUST_DYNAMIC_SYMBOL function is called by the ELF backend - linker for every symbol which is defined by a dynamic object and - referenced by a regular object. This is called after all the - input files have been seen, but before the SIZE_DYNAMIC_SECTIONS - function has been called. The hash table entry should be - bfd_link_hash_defined ore bfd_link_hash_defweak, and it should be - defined in a section from a dynamic object. Dynamic object - sections are not included in the final link, and this function is - responsible for changing the value to something which the rest of - the link can deal with. This will normally involve adding an - entry to the .plt or .got or some such section, and setting the - symbol to point to that. */ - boolean (*elf_backend_adjust_dynamic_symbol) - PARAMS ((struct bfd_link_info *info, struct elf_link_hash_entry *h)); - - /* The SIZE_DYNAMIC_SECTIONS function is called by the ELF backend - linker after all the linker input files have been seen but before - the sections sizes have been set. This is called after - ADJUST_DYNAMIC_SYMBOL has been called on all appropriate symbols. - It is only called when linking against a dynamic object. It must - set the sizes of the dynamic sections, and may fill in their - contents as well. The generic ELF linker can handle the .dynsym, - .dynstr and .hash sections. This function must handle the - .interp section and any sections created by the - CREATE_DYNAMIC_SECTIONS entry point. */ - boolean (*elf_backend_size_dynamic_sections) - PARAMS ((bfd *output_bfd, struct bfd_link_info *info)); - - /* The RELOCATE_SECTION function is called by the ELF backend linker - to handle the relocations for a section. - - The relocs are always passed as Rela structures; if the section - actually uses Rel structures, the r_addend field will always be - zero. - - This function is responsible for adjust the section contents as - necessary, and (if using Rela relocs and generating a - relocateable output file) adjusting the reloc addend as - necessary. - - This function does not have to worry about setting the reloc - address or the reloc symbol index. - - LOCAL_SYMS is a pointer to the swapped in local symbols. - - LOCAL_SECTIONS is an array giving the section in the input file - corresponding to the st_shndx field of each local symbol. - - The global hash table entry for the global symbols can be found - via elf_sym_hashes (input_bfd). - - When generating relocateable output, this function must handle - STB_LOCAL/STT_SECTION symbols specially. The output symbol is - going to be the section symbol corresponding to the output - section, which means that the addend must be adjusted - accordingly. */ - boolean (*elf_backend_relocate_section) - PARAMS ((bfd *output_bfd, struct bfd_link_info *info, - bfd *input_bfd, asection *input_section, bfd_byte *contents, - Elf_Internal_Rela *relocs, Elf_Internal_Sym *local_syms, - asection **local_sections)); - - /* The FINISH_DYNAMIC_SYMBOL function is called by the ELF backend - linker just before it writes a symbol out to the .dynsym section. - The processor backend may make any required adjustment to the - symbol. It may also take the opportunity to set contents of the - dynamic sections. Note that FINISH_DYNAMIC_SYMBOL is called on - all .dynsym symbols, while ADJUST_DYNAMIC_SYMBOL is only called - on those symbols which are defined by a dynamic object. */ - boolean (*elf_backend_finish_dynamic_symbol) - PARAMS ((bfd *output_bfd, struct bfd_link_info *info, - struct elf_link_hash_entry *h, Elf_Internal_Sym *sym)); - - /* The FINISH_DYNAMIC_SECTIONS function is called by the ELF backend - linker just before it writes all the dynamic sections out to the - output file. The FINISH_DYNAMIC_SYMBOL will have been called on - all dynamic symbols. */ - boolean (*elf_backend_finish_dynamic_sections) - PARAMS ((bfd *output_bfd, struct bfd_link_info *info)); - - /* A function to do any beginning processing needed for the ELF file - before building the ELF headers and computing file positions. */ - void (*elf_backend_begin_write_processing) - PARAMS ((bfd *, struct bfd_link_info *)); - - /* A function to do any final processing needed for the ELF file - before writing it out. The LINKER argument is true if this BFD - was created by the ELF backend linker. */ - void (*elf_backend_final_write_processing) - PARAMS ((bfd *, boolean linker)); - - /* This function is called by get_program_header_size. It should - return the number of additional program segments which this BFD - will need. It should return -1 on error. */ - int (*elf_backend_additional_program_headers) PARAMS ((bfd *)); - - /* This function is called to modify an existing segment map in a - backend specific fashion. */ - boolean (*elf_backend_modify_segment_map) PARAMS ((bfd *)); - - /* The swapping table to use when dealing with ECOFF information. - Used for the MIPS ELF .mdebug section. */ - const struct ecoff_debug_swap *elf_backend_ecoff_debug_swap; - - /* Alternate EM_xxxx machine codes for this backend. */ - int elf_machine_alt1; - int elf_machine_alt2; - - const struct elf_size_info *s; - - unsigned want_got_plt : 1; - unsigned plt_readonly : 1; - unsigned want_plt_sym : 1; -}; - -/* Information stored for each BFD section in an ELF file. This - structure is allocated by elf_new_section_hook. */ - -struct bfd_elf_section_data -{ - /* The ELF header for this section. */ - Elf_Internal_Shdr this_hdr; - /* The ELF header for the reloc section associated with this - section, if any. */ - Elf_Internal_Shdr rel_hdr; - /* The ELF section number of this section. Only used for an output - file. */ - int this_idx; - /* The ELF section number of the reloc section associated with this - section, if any. Only used for an output file. */ - int rel_idx; - /* Used by the backend linker to store the symbol hash table entries - associated with relocs against global symbols. */ - struct elf_link_hash_entry **rel_hashes; - /* A pointer to the swapped relocs. If the section uses REL relocs, - rather than RELA, all the r_addend fields will be zero. This - pointer may be NULL. It is used by the backend linker. */ - Elf_Internal_Rela *relocs; - /* Used by the backend linker when generating a shared library to - record the dynamic symbol index for a section symbol - corresponding to this section. */ - long dynindx; - /* A pointer available for the processor specific ELF backend. */ - PTR tdata; -}; - -#define elf_section_data(sec) ((struct bfd_elf_section_data*)sec->used_by_bfd) - -#define get_elf_backend_data(abfd) \ - ((struct elf_backend_data *) (abfd)->xvec->backend_data) - -/* Enumeration to specify the special section. */ -typedef enum elf_linker_section_enum -{ - LINKER_SECTION_UNKNOWN, /* not used */ - LINKER_SECTION_GOT, /* .got section for global offset pointers */ - LINKER_SECTION_PLT, /* .plt section for generated procedure stubs */ - LINKER_SECTION_SDATA, /* .sdata/.sbss section for PowerPC */ - LINKER_SECTION_SDATA2, /* .sdata2/.sbss2 section for PowerPC */ - LINKER_SECTION_MAX /* # of linker sections */ -} elf_linker_section_enum_t; - -/* Sections created by the linker. */ - -typedef struct elf_linker_section -{ - char *name; /* name of the section */ - char *rel_name; /* name of the associated .rel{,a}. section */ - char *bss_name; /* name of a related .bss section */ - char *sym_name; /* name of symbol to reference this section */ - asection *section; /* pointer to the section */ - asection *bss_section; /* pointer to the bss section associated with this */ - asection *rel_section; /* pointer to the relocations needed for this section */ - struct elf_link_hash_entry *sym_hash; /* pointer to the created symbol hash value */ - bfd_vma initial_size; /* initial size before any linker generated allocations */ - bfd_vma sym_offset; /* offset of symbol from beginning of section */ - bfd_vma hole_size; /* size of reserved address hole in allocation */ - bfd_vma hole_offset; /* current offset for the hole */ - bfd_vma max_hole_offset; /* maximum offset for the hole */ - elf_linker_section_enum_t which; /* which section this is */ - boolean hole_written_p; /* whether the hole has been initialized */ - int alignment; /* alignment for the section */ - flagword flags; /* flags to use to create the section */ -} elf_linker_section_t; - -/* Linked list of allocated pointer entries. This hangs off of the symbol lists, and - provides allows us to return different pointers, based on different addend's. */ - -typedef struct elf_linker_section_pointers -{ - struct elf_linker_section_pointers *next; /* next allocated pointer for this symbol */ - bfd_vma offset; /* offset of pointer from beginning of section */ - bfd_signed_vma addend; /* addend used */ - elf_linker_section_enum_t which; /* which linker section this is */ - boolean written_address_p; /* whether address was written yet */ -} elf_linker_section_pointers_t; - -/* Some private data is stashed away for future use using the tdata pointer - in the bfd structure. */ - -struct elf_obj_tdata -{ - Elf_Internal_Ehdr elf_header[1]; /* Actual data, but ref like ptr */ - Elf_Internal_Shdr **elf_sect_ptr; - Elf_Internal_Phdr *phdr; - struct elf_segment_map *segment_map; - struct bfd_strtab_hash *strtab_ptr; - int num_locals; - int num_globals; - asymbol **section_syms; /* STT_SECTION symbols for each section */ - Elf_Internal_Shdr symtab_hdr; - Elf_Internal_Shdr shstrtab_hdr; - Elf_Internal_Shdr strtab_hdr; - Elf_Internal_Shdr dynsymtab_hdr; - Elf_Internal_Shdr dynstrtab_hdr; - unsigned int symtab_section, shstrtab_section; - unsigned int strtab_section, dynsymtab_section; - file_ptr next_file_pos; - void *prstatus; /* The raw /proc prstatus structure */ - void *prpsinfo; /* The raw /proc prpsinfo structure */ - bfd_vma gp; /* The gp value (MIPS only, for now) */ - unsigned int gp_size; /* The gp size (MIPS only, for now) */ - - /* This is set to true if the object was created by the backend - linker. */ - boolean linker; - - /* A mapping from external symbols to entries in the linker hash - table, used when linking. This is indexed by the symbol index - minus the sh_info field of the symbol table header. */ - struct elf_link_hash_entry **sym_hashes; - - /* A mapping from local symbols to offsets into the global offset - table, used when linking. This is indexed by the symbol index. */ - bfd_vma *local_got_offsets; - - /* A mapping from local symbols to offsets into the various linker - sections added. This is index by the symbol index. */ - elf_linker_section_pointers_t **linker_section_pointers; - - /* The linker ELF emulation code needs to let the backend ELF linker - know what filename should be used for a dynamic object if the - dynamic object is found using a search. The emulation code then - sometimes needs to know what name was actually used. Until the - file has been added to the linker symbol table, this field holds - the name the linker wants. After it has been added, it holds the - name actually used, which will be the DT_SONAME entry if there is - one. */ - const char *dt_name; - - /* Irix 5 often screws up the symbol table, sorting local symbols - after global symbols. This flag is set if the symbol table in - this BFD appears to be screwed up. If it is, we ignore the - sh_info field in the symbol table header, and always read all the - symbols. */ - boolean bad_symtab; - - /* Records the result of `get_program_header_size'. */ - bfd_size_type program_header_size; - - /* Used by find_nearest_line entry point. */ - PTR line_info; - - /* Used by MIPS ELF find_nearest_line entry point. The structure - could be included directly in this one, but there's no point to - wasting the memory just for the infrequently called - find_nearest_line. */ - struct mips_elf_find_line *find_line_info; - - /* Used to determine if the e_flags field has been initialized */ - boolean flags_init; - - /* Linker sections that we are interested in. */ - struct elf_linker_section *linker_section[ (int)LINKER_SECTION_MAX ]; -}; - -#define elf_tdata(bfd) ((bfd) -> tdata.elf_obj_data) -#define elf_elfheader(bfd) (elf_tdata(bfd) -> elf_header) -#define elf_elfsections(bfd) (elf_tdata(bfd) -> elf_sect_ptr) -#define elf_shstrtab(bfd) (elf_tdata(bfd) -> strtab_ptr) -#define elf_onesymtab(bfd) (elf_tdata(bfd) -> symtab_section) -#define elf_dynsymtab(bfd) (elf_tdata(bfd) -> dynsymtab_section) -#define elf_num_locals(bfd) (elf_tdata(bfd) -> num_locals) -#define elf_num_globals(bfd) (elf_tdata(bfd) -> num_globals) -#define elf_section_syms(bfd) (elf_tdata(bfd) -> section_syms) -#define core_prpsinfo(bfd) (elf_tdata(bfd) -> prpsinfo) -#define core_prstatus(bfd) (elf_tdata(bfd) -> prstatus) -#define elf_gp(bfd) (elf_tdata(bfd) -> gp) -#define elf_gp_size(bfd) (elf_tdata(bfd) -> gp_size) -#define elf_sym_hashes(bfd) (elf_tdata(bfd) -> sym_hashes) -#define elf_local_got_offsets(bfd) (elf_tdata(bfd) -> local_got_offsets) -#define elf_local_ptr_offsets(bfd) (elf_tdata(bfd) -> linker_section_pointers) -#define elf_dt_name(bfd) (elf_tdata(bfd) -> dt_name) -#define elf_bad_symtab(bfd) (elf_tdata(bfd) -> bad_symtab) -#define elf_flags_init(bfd) (elf_tdata(bfd) -> flags_init) -#define elf_linker_section(bfd,n) (elf_tdata(bfd) -> linker_section[(int)n]) - -extern int _bfd_elf_section_from_bfd_section PARAMS ((bfd *, asection *)); -extern char *bfd_elf_string_from_elf_section - PARAMS ((bfd *, unsigned, unsigned)); -extern char *bfd_elf_get_str_section PARAMS ((bfd *, unsigned)); - -extern boolean _bfd_elf_print_private_bfd_data PARAMS ((bfd *, PTR)); -extern void bfd_elf_print_symbol PARAMS ((bfd *, PTR, asymbol *, - bfd_print_symbol_type)); -#define elf_string_from_elf_strtab(abfd,strindex) \ - bfd_elf_string_from_elf_section(abfd,elf_elfheader(abfd)->e_shstrndx,strindex) - -#define bfd_elf32_print_symbol bfd_elf_print_symbol -#define bfd_elf64_print_symbol bfd_elf_print_symbol -#define bfd_elf32_mkobject bfd_elf_mkobject -#define bfd_elf64_mkobject bfd_elf_mkobject -#define elf_mkobject bfd_elf_mkobject - -extern unsigned long bfd_elf_hash PARAMS ((CONST unsigned char *)); - -extern bfd_reloc_status_type bfd_elf_generic_reloc PARAMS ((bfd *, - arelent *, - asymbol *, - PTR, - asection *, - bfd *, - char **)); -extern boolean bfd_elf_mkobject PARAMS ((bfd *)); -extern Elf_Internal_Shdr *bfd_elf_find_section PARAMS ((bfd *, char *)); -extern boolean _bfd_elf_make_section_from_shdr - PARAMS ((bfd *abfd, Elf_Internal_Shdr *hdr, const char *name)); -extern struct bfd_hash_entry *_bfd_elf_link_hash_newfunc - PARAMS ((struct bfd_hash_entry *, struct bfd_hash_table *, const char *)); -extern struct bfd_link_hash_table *_bfd_elf_link_hash_table_create - PARAMS ((bfd *)); -extern boolean _bfd_elf_link_hash_table_init - PARAMS ((struct elf_link_hash_table *, bfd *, - struct bfd_hash_entry *(*) (struct bfd_hash_entry *, - struct bfd_hash_table *, - const char *))); - -extern boolean _bfd_elf_copy_private_symbol_data - PARAMS ((bfd *, asymbol *, bfd *, asymbol *)); -extern boolean _bfd_elf_copy_private_section_data - PARAMS ((bfd *, asection *, bfd *, asection *)); -extern boolean _bfd_elf_write_object_contents PARAMS ((bfd *)); -extern boolean _bfd_elf_set_section_contents PARAMS ((bfd *, sec_ptr, PTR, - file_ptr, - bfd_size_type)); -extern long _bfd_elf_get_symtab_upper_bound PARAMS ((bfd *)); -extern long _bfd_elf_get_symtab PARAMS ((bfd *, asymbol **)); -extern long _bfd_elf_get_dynamic_symtab_upper_bound PARAMS ((bfd *)); -extern long _bfd_elf_canonicalize_dynamic_symtab PARAMS ((bfd *, asymbol **)); -extern long _bfd_elf_get_reloc_upper_bound PARAMS ((bfd *, sec_ptr)); -extern long _bfd_elf_canonicalize_reloc PARAMS ((bfd *, sec_ptr, - arelent **, asymbol **)); -extern asymbol *_bfd_elf_make_empty_symbol PARAMS ((bfd *)); -extern void _bfd_elf_get_symbol_info PARAMS ((bfd *, asymbol *, - symbol_info *)); -extern alent *_bfd_elf_get_lineno PARAMS ((bfd *, asymbol *)); -extern boolean _bfd_elf_set_arch_mach PARAMS ((bfd *, enum bfd_architecture, - unsigned long)); -extern boolean _bfd_elf_find_nearest_line PARAMS ((bfd *, asection *, - asymbol **, - bfd_vma, CONST char **, - CONST char **, - unsigned int *)); -#define _bfd_elf_read_minisymbols _bfd_generic_read_minisymbols -#define _bfd_elf_minisymbol_to_symbol _bfd_generic_minisymbol_to_symbol -extern int _bfd_elf_sizeof_headers PARAMS ((bfd *, boolean)); -extern boolean _bfd_elf_new_section_hook PARAMS ((bfd *, asection *)); - -/* If the target doesn't have reloc handling written yet: */ -extern void _bfd_elf_no_info_to_howto PARAMS ((bfd *, arelent *, - Elf_Internal_Rela *)); - -asection *bfd_section_from_elf_index PARAMS ((bfd *, unsigned int)); -boolean _bfd_elf_create_dynamic_sections PARAMS ((bfd *, - struct bfd_link_info *)); -struct bfd_strtab_hash *_bfd_elf_stringtab_init PARAMS ((void)); -boolean -_bfd_elf_link_record_dynamic_symbol PARAMS ((struct bfd_link_info *, - struct elf_link_hash_entry *)); -boolean -_bfd_elf_compute_section_file_positions PARAMS ((bfd *, - struct bfd_link_info *)); -void _bfd_elf_assign_file_positions_for_relocs PARAMS ((bfd *)); -file_ptr _bfd_elf_assign_file_position_for_section PARAMS ((Elf_Internal_Shdr *, - file_ptr, - boolean)); - -boolean _bfd_elf_create_dynamic_sections PARAMS ((bfd *, - struct bfd_link_info *)); -boolean _bfd_elf_create_got_section PARAMS ((bfd *, - struct bfd_link_info *)); - -elf_linker_section_t *_bfd_elf_create_linker_section - PARAMS ((bfd *abfd, - struct bfd_link_info *info, - enum elf_linker_section_enum, - elf_linker_section_t *defaults)); - -elf_linker_section_pointers_t *_bfd_elf_find_pointer_linker_section - PARAMS ((elf_linker_section_pointers_t *linker_pointers, - bfd_signed_vma addend, - elf_linker_section_enum_t which)); - -boolean bfd_elf32_create_pointer_linker_section - PARAMS ((bfd *abfd, - struct bfd_link_info *info, - elf_linker_section_t *lsect, - struct elf_link_hash_entry *h, - const Elf32_Internal_Rela *rel)); - -bfd_vma bfd_elf32_finish_pointer_linker_section - PARAMS ((bfd *output_abfd, - bfd *input_bfd, - struct bfd_link_info *info, - elf_linker_section_t *lsect, - struct elf_link_hash_entry *h, - bfd_vma relocation, - const Elf32_Internal_Rela *rel, - int relative_reloc)); - -boolean bfd_elf64_create_pointer_linker_section - PARAMS ((bfd *abfd, - struct bfd_link_info *info, - elf_linker_section_t *lsect, - struct elf_link_hash_entry *h, - const Elf64_Internal_Rela *rel)); - -bfd_vma bfd_elf64_finish_pointer_linker_section - PARAMS ((bfd *output_abfd, - bfd *input_bfd, - struct bfd_link_info *info, - elf_linker_section_t *lsect, - struct elf_link_hash_entry *h, - bfd_vma relocation, - const Elf64_Internal_Rela *rel, - int relative_reloc)); - -boolean _bfd_elf_make_linker_section_rela - PARAMS ((bfd *dynobj, - elf_linker_section_t *lsect, - int alignment)); - -extern const bfd_target *bfd_elf32_object_p PARAMS ((bfd *)); -extern const bfd_target *bfd_elf32_core_file_p PARAMS ((bfd *)); -extern char *bfd_elf32_core_file_failing_command PARAMS ((bfd *)); -extern int bfd_elf32_core_file_failing_signal PARAMS ((bfd *)); -extern boolean bfd_elf32_core_file_matches_executable_p PARAMS ((bfd *, - bfd *)); - -extern boolean bfd_elf32_bfd_link_add_symbols - PARAMS ((bfd *, struct bfd_link_info *)); -extern boolean bfd_elf32_bfd_final_link - PARAMS ((bfd *, struct bfd_link_info *)); - -extern void bfd_elf32_swap_symbol_in - PARAMS ((bfd *, Elf32_External_Sym *, Elf_Internal_Sym *)); -extern void bfd_elf32_swap_symbol_out - PARAMS ((bfd *, Elf_Internal_Sym *, PTR)); -extern void bfd_elf32_swap_reloc_in - PARAMS ((bfd *, Elf32_External_Rel *, Elf_Internal_Rel *)); -extern void bfd_elf32_swap_reloc_out - PARAMS ((bfd *, Elf_Internal_Rel *, Elf32_External_Rel *)); -extern void bfd_elf32_swap_reloca_in - PARAMS ((bfd *, Elf32_External_Rela *, Elf_Internal_Rela *)); -extern void bfd_elf32_swap_reloca_out - PARAMS ((bfd *, Elf_Internal_Rela *, Elf32_External_Rela *)); -extern void bfd_elf32_swap_phdr_in - PARAMS ((bfd *, Elf32_External_Phdr *, Elf_Internal_Phdr *)); -extern void bfd_elf32_swap_phdr_out - PARAMS ((bfd *, Elf_Internal_Phdr *, Elf32_External_Phdr *)); -extern void bfd_elf32_swap_dyn_in - PARAMS ((bfd *, const PTR, Elf_Internal_Dyn *)); -extern void bfd_elf32_swap_dyn_out - PARAMS ((bfd *, const Elf_Internal_Dyn *, Elf32_External_Dyn *)); -extern boolean bfd_elf32_add_dynamic_entry - PARAMS ((struct bfd_link_info *, bfd_vma, bfd_vma)); -extern boolean bfd_elf32_link_create_dynamic_sections - PARAMS ((bfd *, struct bfd_link_info *)); - -extern const bfd_target *bfd_elf64_object_p PARAMS ((bfd *)); -extern const bfd_target *bfd_elf64_core_file_p PARAMS ((bfd *)); -extern char *bfd_elf64_core_file_failing_command PARAMS ((bfd *)); -extern int bfd_elf64_core_file_failing_signal PARAMS ((bfd *)); -extern boolean bfd_elf64_core_file_matches_executable_p PARAMS ((bfd *, - bfd *)); -extern boolean bfd_elf64_bfd_link_add_symbols - PARAMS ((bfd *, struct bfd_link_info *)); -extern boolean bfd_elf64_bfd_final_link - PARAMS ((bfd *, struct bfd_link_info *)); - -extern void bfd_elf64_swap_symbol_in - PARAMS ((bfd *, Elf64_External_Sym *, Elf_Internal_Sym *)); -extern void bfd_elf64_swap_symbol_out - PARAMS ((bfd *, Elf_Internal_Sym *, PTR)); -extern void bfd_elf64_swap_reloc_in - PARAMS ((bfd *, Elf64_External_Rel *, Elf_Internal_Rel *)); -extern void bfd_elf64_swap_reloc_out - PARAMS ((bfd *, Elf_Internal_Rel *, Elf64_External_Rel *)); -extern void bfd_elf64_swap_reloca_in - PARAMS ((bfd *, Elf64_External_Rela *, Elf_Internal_Rela *)); -extern void bfd_elf64_swap_reloca_out - PARAMS ((bfd *, Elf_Internal_Rela *, Elf64_External_Rela *)); -extern void bfd_elf64_swap_phdr_in - PARAMS ((bfd *, Elf64_External_Phdr *, Elf_Internal_Phdr *)); -extern void bfd_elf64_swap_phdr_out - PARAMS ((bfd *, Elf_Internal_Phdr *, Elf64_External_Phdr *)); -extern void bfd_elf64_swap_dyn_in - PARAMS ((bfd *, const PTR, Elf_Internal_Dyn *)); -extern void bfd_elf64_swap_dyn_out - PARAMS ((bfd *, const Elf_Internal_Dyn *, Elf64_External_Dyn *)); -extern boolean bfd_elf64_add_dynamic_entry - PARAMS ((struct bfd_link_info *, bfd_vma, bfd_vma)); -extern boolean bfd_elf64_link_create_dynamic_sections - PARAMS ((bfd *, struct bfd_link_info *)); - -#define bfd_elf32_link_record_dynamic_symbol _bfd_elf_link_record_dynamic_symbol -#define bfd_elf64_link_record_dynamic_symbol _bfd_elf_link_record_dynamic_symbol - -#endif /* _LIBELF_H_ */ diff --git a/contrib/gdb/bfd/elf.c b/contrib/gdb/bfd/elf.c deleted file mode 100644 index 981d3ee230915..0000000000000 --- a/contrib/gdb/bfd/elf.c +++ /dev/null @@ -1,3318 +0,0 @@ -/* ELF executable support for BFD. - Copyright 1993, 1994, 1995, 1996 Free Software Foundation, Inc. - -This file is part of BFD, the Binary File Descriptor library. - -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 2 of the License, 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ - -/* - -SECTION - ELF backends - - BFD support for ELF formats is being worked on. - Currently, the best supported back ends are for sparc and i386 - (running svr4 or Solaris 2). - - Documentation of the internals of the support code still needs - to be written. The code is changing quickly enough that we - haven't bothered yet. - */ - -#include "bfd.h" -#include "sysdep.h" -#include "bfdlink.h" -#include "libbfd.h" -#define ARCH_SIZE 0 -#include "elf-bfd.h" - -static INLINE struct elf_segment_map *make_mapping - PARAMS ((bfd *, asection **, unsigned int, unsigned int, boolean)); -static int elf_sort_sections PARAMS ((const PTR, const PTR)); -static boolean assign_file_positions_for_segments PARAMS ((bfd *)); -static boolean assign_file_positions_except_relocs PARAMS ((bfd *)); -static boolean prep_headers PARAMS ((bfd *)); -static boolean swap_out_syms PARAMS ((bfd *, struct bfd_strtab_hash **)); -static boolean copy_private_bfd_data PARAMS ((bfd *, bfd *)); - -/* Standard ELF hash function. Do not change this function; you will - cause invalid hash tables to be generated. (Well, you would if this - were being used yet.) */ -unsigned long -bfd_elf_hash (name) - CONST unsigned char *name; -{ - unsigned long h = 0; - unsigned long g; - int ch; - - while ((ch = *name++) != '\0') - { - h = (h << 4) + ch; - if ((g = (h & 0xf0000000)) != 0) - { - h ^= g >> 24; - h &= ~g; - } - } - return h; -} - -/* Read a specified number of bytes at a specified offset in an ELF - file, into a newly allocated buffer, and return a pointer to the - buffer. */ - -static char * -elf_read (abfd, offset, size) - bfd * abfd; - long offset; - unsigned int size; -{ - char *buf; - - if ((buf = bfd_alloc (abfd, size)) == NULL) - return NULL; - if (bfd_seek (abfd, offset, SEEK_SET) == -1) - return NULL; - if (bfd_read ((PTR) buf, size, 1, abfd) != size) - { - if (bfd_get_error () != bfd_error_system_call) - bfd_set_error (bfd_error_file_truncated); - return NULL; - } - return buf; -} - -boolean -elf_mkobject (abfd) - bfd * abfd; -{ - /* this just does initialization */ - /* coff_mkobject zalloc's space for tdata.coff_obj_data ... */ - elf_tdata (abfd) = (struct elf_obj_tdata *) - bfd_zalloc (abfd, sizeof (struct elf_obj_tdata)); - if (elf_tdata (abfd) == 0) - return false; - /* since everything is done at close time, do we need any - initialization? */ - - return true; -} - -char * -bfd_elf_get_str_section (abfd, shindex) - bfd * abfd; - unsigned int shindex; -{ - Elf_Internal_Shdr **i_shdrp; - char *shstrtab = NULL; - unsigned int offset; - unsigned int shstrtabsize; - - i_shdrp = elf_elfsections (abfd); - if (i_shdrp == 0 || i_shdrp[shindex] == 0) - return 0; - - shstrtab = (char *) i_shdrp[shindex]->contents; - if (shstrtab == NULL) - { - /* No cached one, attempt to read, and cache what we read. */ - offset = i_shdrp[shindex]->sh_offset; - shstrtabsize = i_shdrp[shindex]->sh_size; - shstrtab = elf_read (abfd, offset, shstrtabsize); - i_shdrp[shindex]->contents = (PTR) shstrtab; - } - return shstrtab; -} - -char * -bfd_elf_string_from_elf_section (abfd, shindex, strindex) - bfd * abfd; - unsigned int shindex; - unsigned int strindex; -{ - Elf_Internal_Shdr *hdr; - - if (strindex == 0) - return ""; - - hdr = elf_elfsections (abfd)[shindex]; - - if (hdr->contents == NULL - && bfd_elf_get_str_section (abfd, shindex) == NULL) - return NULL; - - return ((char *) hdr->contents) + strindex; -} - -/* Make a BFD section from an ELF section. We store a pointer to the - BFD section in the bfd_section field of the header. */ - -boolean -_bfd_elf_make_section_from_shdr (abfd, hdr, name) - bfd *abfd; - Elf_Internal_Shdr *hdr; - const char *name; -{ - asection *newsect; - flagword flags; - - if (hdr->bfd_section != NULL) - { - BFD_ASSERT (strcmp (name, - bfd_get_section_name (abfd, hdr->bfd_section)) == 0); - return true; - } - - newsect = bfd_make_section_anyway (abfd, name); - if (newsect == NULL) - return false; - - newsect->filepos = hdr->sh_offset; - - if (! bfd_set_section_vma (abfd, newsect, hdr->sh_addr) - || ! bfd_set_section_size (abfd, newsect, hdr->sh_size) - || ! bfd_set_section_alignment (abfd, newsect, - bfd_log2 (hdr->sh_addralign))) - return false; - - flags = SEC_NO_FLAGS; - if (hdr->sh_type != SHT_NOBITS) - flags |= SEC_HAS_CONTENTS; - if ((hdr->sh_flags & SHF_ALLOC) != 0) - { - flags |= SEC_ALLOC; - if (hdr->sh_type != SHT_NOBITS) - flags |= SEC_LOAD; - } - if ((hdr->sh_flags & SHF_WRITE) == 0) - flags |= SEC_READONLY; - if ((hdr->sh_flags & SHF_EXECINSTR) != 0) - flags |= SEC_CODE; - else if ((flags & SEC_LOAD) != 0) - flags |= SEC_DATA; - - /* The debugging sections appear to be recognized only by name, not - any sort of flag. */ - if (strncmp (name, ".debug", sizeof ".debug" - 1) == 0 - || strncmp (name, ".line", sizeof ".line" - 1) == 0 - || strncmp (name, ".stab", sizeof ".stab" - 1) == 0) - flags |= SEC_DEBUGGING; - - if (! bfd_set_section_flags (abfd, newsect, flags)) - return false; - - if ((flags & SEC_ALLOC) != 0) - { - Elf_Internal_Phdr *phdr; - unsigned int i; - - /* Look through the phdrs to see if we need to adjust the lma. */ - phdr = elf_tdata (abfd)->phdr; - for (i = 0; i < elf_elfheader (abfd)->e_phnum; i++, phdr++) - { - if (phdr->p_type == PT_LOAD - && phdr->p_paddr != 0 - && phdr->p_vaddr != phdr->p_paddr - && phdr->p_vaddr <= hdr->sh_addr - && phdr->p_vaddr + phdr->p_memsz >= hdr->sh_addr + hdr->sh_size) - { - newsect->lma += phdr->p_paddr - phdr->p_vaddr; - break; - } - } - } - - hdr->bfd_section = newsect; - elf_section_data (newsect)->this_hdr = *hdr; - - return true; -} - -/* -INTERNAL_FUNCTION - bfd_elf_find_section - -SYNOPSIS - struct elf_internal_shdr *bfd_elf_find_section (bfd *abfd, char *name); - -DESCRIPTION - Helper functions for GDB to locate the string tables. - Since BFD hides string tables from callers, GDB needs to use an - internal hook to find them. Sun's .stabstr, in particular, - isn't even pointed to by the .stab section, so ordinary - mechanisms wouldn't work to find it, even if we had some. -*/ - -struct elf_internal_shdr * -bfd_elf_find_section (abfd, name) - bfd * abfd; - char *name; -{ - Elf_Internal_Shdr **i_shdrp; - char *shstrtab; - unsigned int max; - unsigned int i; - - i_shdrp = elf_elfsections (abfd); - if (i_shdrp != NULL) - { - shstrtab = bfd_elf_get_str_section (abfd, elf_elfheader (abfd)->e_shstrndx); - if (shstrtab != NULL) - { - max = elf_elfheader (abfd)->e_shnum; - for (i = 1; i < max; i++) - if (!strcmp (&shstrtab[i_shdrp[i]->sh_name], name)) - return i_shdrp[i]; - } - } - return 0; -} - -const char *const bfd_elf_section_type_names[] = { - "SHT_NULL", "SHT_PROGBITS", "SHT_SYMTAB", "SHT_STRTAB", - "SHT_RELA", "SHT_HASH", "SHT_DYNAMIC", "SHT_NOTE", - "SHT_NOBITS", "SHT_REL", "SHT_SHLIB", "SHT_DYNSYM", -}; - -/* ELF relocs are against symbols. If we are producing relocateable - output, and the reloc is against an external symbol, and nothing - has given us any additional addend, the resulting reloc will also - be against the same symbol. In such a case, we don't want to - change anything about the way the reloc is handled, since it will - all be done at final link time. Rather than put special case code - into bfd_perform_relocation, all the reloc types use this howto - function. It just short circuits the reloc if producing - relocateable output against an external symbol. */ - -/*ARGSUSED*/ -bfd_reloc_status_type -bfd_elf_generic_reloc (abfd, - reloc_entry, - symbol, - data, - input_section, - output_bfd, - error_message) - bfd *abfd; - arelent *reloc_entry; - asymbol *symbol; - PTR data; - asection *input_section; - bfd *output_bfd; - char **error_message; -{ - if (output_bfd != (bfd *) NULL - && (symbol->flags & BSF_SECTION_SYM) == 0 - && (! reloc_entry->howto->partial_inplace - || reloc_entry->addend == 0)) - { - reloc_entry->address += input_section->output_offset; - return bfd_reloc_ok; - } - - return bfd_reloc_continue; -} - -/* Print out the program headers. */ - -boolean -_bfd_elf_print_private_bfd_data (abfd, farg) - bfd *abfd; - PTR farg; -{ - FILE *f = (FILE *) farg; - Elf_Internal_Phdr *p; - asection *s; - bfd_byte *dynbuf = NULL; - - p = elf_tdata (abfd)->phdr; - if (p != NULL) - { - unsigned int i, c; - - fprintf (f, "\nProgram Header:\n"); - c = elf_elfheader (abfd)->e_phnum; - for (i = 0; i < c; i++, p++) - { - const char *s; - char buf[20]; - - switch (p->p_type) - { - case PT_NULL: s = "NULL"; break; - case PT_LOAD: s = "LOAD"; break; - case PT_DYNAMIC: s = "DYNAMIC"; break; - case PT_INTERP: s = "INTERP"; break; - case PT_NOTE: s = "NOTE"; break; - case PT_SHLIB: s = "SHLIB"; break; - case PT_PHDR: s = "PHDR"; break; - default: sprintf (buf, "0x%lx", p->p_type); s = buf; break; - } - fprintf (f, "%8s off 0x", s); - fprintf_vma (f, p->p_offset); - fprintf (f, " vaddr 0x"); - fprintf_vma (f, p->p_vaddr); - fprintf (f, " paddr 0x"); - fprintf_vma (f, p->p_paddr); - fprintf (f, " align 2**%u\n", bfd_log2 (p->p_align)); - fprintf (f, " filesz 0x"); - fprintf_vma (f, p->p_filesz); - fprintf (f, " memsz 0x"); - fprintf_vma (f, p->p_memsz); - fprintf (f, " flags %c%c%c", - (p->p_flags & PF_R) != 0 ? 'r' : '-', - (p->p_flags & PF_W) != 0 ? 'w' : '-', - (p->p_flags & PF_X) != 0 ? 'x' : '-'); - if ((p->p_flags &~ (PF_R | PF_W | PF_X)) != 0) - fprintf (f, " %lx", p->p_flags &~ (PF_R | PF_W | PF_X)); - fprintf (f, "\n"); - } - } - - s = bfd_get_section_by_name (abfd, ".dynamic"); - if (s != NULL) - { - int elfsec; - unsigned long link; - bfd_byte *extdyn, *extdynend; - size_t extdynsize; - void (*swap_dyn_in) PARAMS ((bfd *, const PTR, Elf_Internal_Dyn *)); - - fprintf (f, "\nDynamic Section:\n"); - - dynbuf = (bfd_byte *) bfd_malloc (s->_raw_size); - if (dynbuf == NULL) - goto error_return; - if (! bfd_get_section_contents (abfd, s, (PTR) dynbuf, (file_ptr) 0, - s->_raw_size)) - goto error_return; - - elfsec = _bfd_elf_section_from_bfd_section (abfd, s); - if (elfsec == -1) - goto error_return; - link = elf_elfsections (abfd)[elfsec]->sh_link; - - extdynsize = get_elf_backend_data (abfd)->s->sizeof_dyn; - swap_dyn_in = get_elf_backend_data (abfd)->s->swap_dyn_in; - - extdyn = dynbuf; - extdynend = extdyn + s->_raw_size; - for (; extdyn < extdynend; extdyn += extdynsize) - { - Elf_Internal_Dyn dyn; - const char *name; - char ab[20]; - boolean stringp; - - (*swap_dyn_in) (abfd, (PTR) extdyn, &dyn); - - if (dyn.d_tag == DT_NULL) - break; - - stringp = false; - switch (dyn.d_tag) - { - default: - sprintf (ab, "0x%lx", (unsigned long) dyn.d_tag); - name = ab; - break; - - case DT_NEEDED: name = "NEEDED"; stringp = true; break; - case DT_PLTRELSZ: name = "PLTRELSZ"; break; - case DT_PLTGOT: name = "PLTGOT"; break; - case DT_HASH: name = "HASH"; break; - case DT_STRTAB: name = "STRTAB"; break; - case DT_SYMTAB: name = "SYMTAB"; break; - case DT_RELA: name = "RELA"; break; - case DT_RELASZ: name = "RELASZ"; break; - case DT_RELAENT: name = "RELAENT"; break; - case DT_STRSZ: name = "STRSZ"; break; - case DT_SYMENT: name = "SYMENT"; break; - case DT_INIT: name = "INIT"; break; - case DT_FINI: name = "FINI"; break; - case DT_SONAME: name = "SONAME"; stringp = true; break; - case DT_RPATH: name = "RPATH"; stringp = true; break; - case DT_SYMBOLIC: name = "SYMBOLIC"; break; - case DT_REL: name = "REL"; break; - case DT_RELSZ: name = "RELSZ"; break; - case DT_RELENT: name = "RELENT"; break; - case DT_PLTREL: name = "PLTREL"; break; - case DT_DEBUG: name = "DEBUG"; break; - case DT_TEXTREL: name = "TEXTREL"; break; - case DT_JMPREL: name = "JMPREL"; break; - } - - fprintf (f, " %-11s ", name); - if (! stringp) - fprintf (f, "0x%lx", (unsigned long) dyn.d_un.d_val); - else - { - const char *string; - - string = bfd_elf_string_from_elf_section (abfd, link, - dyn.d_un.d_val); - if (string == NULL) - goto error_return; - fprintf (f, "%s", string); - } - fprintf (f, "\n"); - } - - free (dynbuf); - dynbuf = NULL; - } - - return true; - - error_return: - if (dynbuf != NULL) - free (dynbuf); - return false; -} - -/* Display ELF-specific fields of a symbol. */ -void -bfd_elf_print_symbol (ignore_abfd, filep, symbol, how) - bfd *ignore_abfd; - PTR filep; - asymbol *symbol; - bfd_print_symbol_type how; -{ - FILE *file = (FILE *) filep; - switch (how) - { - case bfd_print_symbol_name: - fprintf (file, "%s", symbol->name); - break; - case bfd_print_symbol_more: - fprintf (file, "elf "); - fprintf_vma (file, symbol->value); - fprintf (file, " %lx", (long) symbol->flags); - break; - case bfd_print_symbol_all: - { - CONST char *section_name; - section_name = symbol->section ? symbol->section->name : "(*none*)"; - bfd_print_symbol_vandf ((PTR) file, symbol); - fprintf (file, " %s\t", section_name); - /* Print the "other" value for a symbol. For common symbols, - we've already printed the size; now print the alignment. - For other symbols, we have no specified alignment, and - we've printed the address; now print the size. */ - fprintf_vma (file, - (bfd_is_com_section (symbol->section) - ? ((elf_symbol_type *) symbol)->internal_elf_sym.st_value - : ((elf_symbol_type *) symbol)->internal_elf_sym.st_size)); - fprintf (file, " %s", symbol->name); - } - break; - } -} - -/* Create an entry in an ELF linker hash table. */ - -struct bfd_hash_entry * -_bfd_elf_link_hash_newfunc (entry, table, string) - struct bfd_hash_entry *entry; - struct bfd_hash_table *table; - const char *string; -{ - struct elf_link_hash_entry *ret = (struct elf_link_hash_entry *) entry; - - /* Allocate the structure if it has not already been allocated by a - subclass. */ - if (ret == (struct elf_link_hash_entry *) NULL) - ret = ((struct elf_link_hash_entry *) - bfd_hash_allocate (table, sizeof (struct elf_link_hash_entry))); - if (ret == (struct elf_link_hash_entry *) NULL) - return (struct bfd_hash_entry *) ret; - - /* Call the allocation method of the superclass. */ - ret = ((struct elf_link_hash_entry *) - _bfd_link_hash_newfunc ((struct bfd_hash_entry *) ret, - table, string)); - if (ret != (struct elf_link_hash_entry *) NULL) - { - /* Set local fields. */ - ret->indx = -1; - ret->size = 0; - ret->dynindx = -1; - ret->dynstr_index = 0; - ret->weakdef = NULL; - ret->got_offset = (bfd_vma) -1; - ret->plt_offset = (bfd_vma) -1; - ret->linker_section_pointer = (elf_linker_section_pointers_t *)0; - ret->type = STT_NOTYPE; - /* Assume that we have been called by a non-ELF symbol reader. - This flag is then reset by the code which reads an ELF input - file. This ensures that a symbol created by a non-ELF symbol - reader will have the flag set correctly. */ - ret->elf_link_hash_flags = ELF_LINK_NON_ELF; - } - - return (struct bfd_hash_entry *) ret; -} - -/* Initialize an ELF linker hash table. */ - -boolean -_bfd_elf_link_hash_table_init (table, abfd, newfunc) - struct elf_link_hash_table *table; - bfd *abfd; - struct bfd_hash_entry *(*newfunc) PARAMS ((struct bfd_hash_entry *, - struct bfd_hash_table *, - const char *)); -{ - table->dynamic_sections_created = false; - table->dynobj = NULL; - /* The first dynamic symbol is a dummy. */ - table->dynsymcount = 1; - table->dynstr = NULL; - table->bucketcount = 0; - table->needed = NULL; - return _bfd_link_hash_table_init (&table->root, abfd, newfunc); -} - -/* Create an ELF linker hash table. */ - -struct bfd_link_hash_table * -_bfd_elf_link_hash_table_create (abfd) - bfd *abfd; -{ - struct elf_link_hash_table *ret; - - ret = ((struct elf_link_hash_table *) - bfd_alloc (abfd, sizeof (struct elf_link_hash_table))); - if (ret == (struct elf_link_hash_table *) NULL) - return NULL; - - if (! _bfd_elf_link_hash_table_init (ret, abfd, _bfd_elf_link_hash_newfunc)) - { - bfd_release (abfd, ret); - return NULL; - } - - return &ret->root; -} - -/* This is a hook for the ELF emulation code in the generic linker to - tell the backend linker what file name to use for the DT_NEEDED - entry for a dynamic object. The generic linker passes name as an - empty string to indicate that no DT_NEEDED entry should be made. */ - -void -bfd_elf_set_dt_needed_name (abfd, name) - bfd *abfd; - const char *name; -{ - if (bfd_get_flavour (abfd) == bfd_target_elf_flavour - && bfd_get_format (abfd) == bfd_object) - elf_dt_name (abfd) = name; -} - -/* Get the list of DT_NEEDED entries for a link. This is a hook for - the ELF emulation code. */ - -struct bfd_link_needed_list * -bfd_elf_get_needed_list (abfd, info) - bfd *abfd; - struct bfd_link_info *info; -{ - if (info->hash->creator->flavour != bfd_target_elf_flavour) - return NULL; - return elf_hash_table (info)->needed; -} - -/* Get the name actually used for a dynamic object for a link. This - is the SONAME entry if there is one. Otherwise, it is the string - passed to bfd_elf_set_dt_needed_name, or it is the filename. */ - -const char * -bfd_elf_get_dt_soname (abfd) - bfd *abfd; -{ - if (bfd_get_flavour (abfd) == bfd_target_elf_flavour - && bfd_get_format (abfd) == bfd_object) - return elf_dt_name (abfd); - return NULL; -} - -/* Allocate an ELF string table--force the first byte to be zero. */ - -struct bfd_strtab_hash * -_bfd_elf_stringtab_init () -{ - struct bfd_strtab_hash *ret; - - ret = _bfd_stringtab_init (); - if (ret != NULL) - { - bfd_size_type loc; - - loc = _bfd_stringtab_add (ret, "", true, false); - BFD_ASSERT (loc == 0 || loc == (bfd_size_type) -1); - if (loc == (bfd_size_type) -1) - { - _bfd_stringtab_free (ret); - ret = NULL; - } - } - return ret; -} - -/* ELF .o/exec file reading */ - -/* Create a new bfd section from an ELF section header. */ - -boolean -bfd_section_from_shdr (abfd, shindex) - bfd *abfd; - unsigned int shindex; -{ - Elf_Internal_Shdr *hdr = elf_elfsections (abfd)[shindex]; - Elf_Internal_Ehdr *ehdr = elf_elfheader (abfd); - struct elf_backend_data *bed = get_elf_backend_data (abfd); - char *name; - - name = elf_string_from_elf_strtab (abfd, hdr->sh_name); - - switch (hdr->sh_type) - { - case SHT_NULL: - /* Inactive section. Throw it away. */ - return true; - - case SHT_PROGBITS: /* Normal section with contents. */ - case SHT_DYNAMIC: /* Dynamic linking information. */ - case SHT_NOBITS: /* .bss section. */ - case SHT_HASH: /* .hash section. */ - case SHT_NOTE: /* .note section. */ - return _bfd_elf_make_section_from_shdr (abfd, hdr, name); - - case SHT_SYMTAB: /* A symbol table */ - if (elf_onesymtab (abfd) == shindex) - return true; - - BFD_ASSERT (hdr->sh_entsize == bed->s->sizeof_sym); - BFD_ASSERT (elf_onesymtab (abfd) == 0); - elf_onesymtab (abfd) = shindex; - elf_tdata (abfd)->symtab_hdr = *hdr; - elf_elfsections (abfd)[shindex] = hdr = &elf_tdata (abfd)->symtab_hdr; - abfd->flags |= HAS_SYMS; - - /* Sometimes a shared object will map in the symbol table. If - SHF_ALLOC is set, and this is a shared object, then we also - treat this section as a BFD section. We can not base the - decision purely on SHF_ALLOC, because that flag is sometimes - set in a relocateable object file, which would confuse the - linker. */ - if ((hdr->sh_flags & SHF_ALLOC) != 0 - && (abfd->flags & DYNAMIC) != 0 - && ! _bfd_elf_make_section_from_shdr (abfd, hdr, name)) - return false; - - return true; - - case SHT_DYNSYM: /* A dynamic symbol table */ - if (elf_dynsymtab (abfd) == shindex) - return true; - - BFD_ASSERT (hdr->sh_entsize == bed->s->sizeof_sym); - BFD_ASSERT (elf_dynsymtab (abfd) == 0); - elf_dynsymtab (abfd) = shindex; - elf_tdata (abfd)->dynsymtab_hdr = *hdr; - elf_elfsections (abfd)[shindex] = hdr = &elf_tdata (abfd)->dynsymtab_hdr; - abfd->flags |= HAS_SYMS; - - /* Besides being a symbol table, we also treat this as a regular - section, so that objcopy can handle it. */ - return _bfd_elf_make_section_from_shdr (abfd, hdr, name); - - case SHT_STRTAB: /* A string table */ - if (hdr->bfd_section != NULL) - return true; - if (ehdr->e_shstrndx == shindex) - { - elf_tdata (abfd)->shstrtab_hdr = *hdr; - elf_elfsections (abfd)[shindex] = &elf_tdata (abfd)->shstrtab_hdr; - return true; - } - { - unsigned int i; - - for (i = 1; i < ehdr->e_shnum; i++) - { - Elf_Internal_Shdr *hdr2 = elf_elfsections (abfd)[i]; - if (hdr2->sh_link == shindex) - { - if (! bfd_section_from_shdr (abfd, i)) - return false; - if (elf_onesymtab (abfd) == i) - { - elf_tdata (abfd)->strtab_hdr = *hdr; - elf_elfsections (abfd)[shindex] = - &elf_tdata (abfd)->strtab_hdr; - return true; - } - if (elf_dynsymtab (abfd) == i) - { - elf_tdata (abfd)->dynstrtab_hdr = *hdr; - elf_elfsections (abfd)[shindex] = hdr = - &elf_tdata (abfd)->dynstrtab_hdr; - /* We also treat this as a regular section, so - that objcopy can handle it. */ - break; - } -#if 0 /* Not handling other string tables specially right now. */ - hdr2 = elf_elfsections (abfd)[i]; /* in case it moved */ - /* We have a strtab for some random other section. */ - newsect = (asection *) hdr2->bfd_section; - if (!newsect) - break; - hdr->bfd_section = newsect; - hdr2 = &elf_section_data (newsect)->str_hdr; - *hdr2 = *hdr; - elf_elfsections (abfd)[shindex] = hdr2; -#endif - } - } - } - - return _bfd_elf_make_section_from_shdr (abfd, hdr, name); - - case SHT_REL: - case SHT_RELA: - /* *These* do a lot of work -- but build no sections! */ - { - asection *target_sect; - Elf_Internal_Shdr *hdr2; - int use_rela_p = get_elf_backend_data (abfd)->use_rela_p; - - /* For some incomprehensible reason Oracle distributes - libraries for Solaris in which some of the objects have - bogus sh_link fields. It would be nice if we could just - reject them, but, unfortunately, some people need to use - them. We scan through the section headers; if we find only - one suitable symbol table, we clobber the sh_link to point - to it. I hope this doesn't break anything. */ - if (elf_elfsections (abfd)[hdr->sh_link]->sh_type != SHT_SYMTAB - && elf_elfsections (abfd)[hdr->sh_link]->sh_type != SHT_DYNSYM) - { - int scan; - int found; - - found = 0; - for (scan = 1; scan < ehdr->e_shnum; scan++) - { - if (elf_elfsections (abfd)[scan]->sh_type == SHT_SYMTAB - || elf_elfsections (abfd)[scan]->sh_type == SHT_DYNSYM) - { - if (found != 0) - { - found = 0; - break; - } - found = scan; - } - } - if (found != 0) - hdr->sh_link = found; - } - - /* Get the symbol table. */ - if (elf_elfsections (abfd)[hdr->sh_link]->sh_type == SHT_SYMTAB - && ! bfd_section_from_shdr (abfd, hdr->sh_link)) - return false; - - /* If this reloc section does not use the main symbol table we - don't treat it as a reloc section. BFD can't adequately - represent such a section, so at least for now, we don't - try. We just present it as a normal section. */ - if (hdr->sh_link != elf_onesymtab (abfd)) - return _bfd_elf_make_section_from_shdr (abfd, hdr, name); - - /* Don't allow REL relocations on a machine that uses RELA and - vice versa. */ - /* @@ Actually, the generic ABI does suggest that both might be - used in one file. But the four ABI Processor Supplements I - have access to right now all specify that only one is used on - each of those architectures. It's conceivable that, e.g., a - bunch of absolute 32-bit relocs might be more compact in REL - form even on a RELA machine... */ - BFD_ASSERT (use_rela_p - ? (hdr->sh_type == SHT_RELA - && hdr->sh_entsize == bed->s->sizeof_rela) - : (hdr->sh_type == SHT_REL - && hdr->sh_entsize == bed->s->sizeof_rel)); - - if (! bfd_section_from_shdr (abfd, hdr->sh_info)) - return false; - target_sect = bfd_section_from_elf_index (abfd, hdr->sh_info); - if (target_sect == NULL) - return false; - - hdr2 = &elf_section_data (target_sect)->rel_hdr; - *hdr2 = *hdr; - elf_elfsections (abfd)[shindex] = hdr2; - target_sect->reloc_count = hdr->sh_size / hdr->sh_entsize; - target_sect->flags |= SEC_RELOC; - target_sect->relocation = NULL; - target_sect->rel_filepos = hdr->sh_offset; - abfd->flags |= HAS_RELOC; - return true; - } - break; - - case SHT_SHLIB: - return true; - - default: - /* Check for any processor-specific section types. */ - { - if (bed->elf_backend_section_from_shdr) - (*bed->elf_backend_section_from_shdr) (abfd, hdr, name); - } - break; - } - - return true; -} - -/* Given an ELF section number, retrieve the corresponding BFD - section. */ - -asection * -bfd_section_from_elf_index (abfd, index) - bfd *abfd; - unsigned int index; -{ - BFD_ASSERT (index > 0 && index < SHN_LORESERVE); - if (index >= elf_elfheader (abfd)->e_shnum) - return NULL; - return elf_elfsections (abfd)[index]->bfd_section; -} - -boolean -_bfd_elf_new_section_hook (abfd, sec) - bfd *abfd; - asection *sec; -{ - struct bfd_elf_section_data *sdata; - - sdata = (struct bfd_elf_section_data *) bfd_alloc (abfd, sizeof (*sdata)); - if (!sdata) - return false; - sec->used_by_bfd = (PTR) sdata; - memset (sdata, 0, sizeof (*sdata)); - return true; -} - -/* Create a new bfd section from an ELF program header. - - Since program segments have no names, we generate a synthetic name - of the form segment<NUM>, where NUM is generally the index in the - program header table. For segments that are split (see below) we - generate the names segment<NUM>a and segment<NUM>b. - - Note that some program segments may have a file size that is different than - (less than) the memory size. All this means is that at execution the - system must allocate the amount of memory specified by the memory size, - but only initialize it with the first "file size" bytes read from the - file. This would occur for example, with program segments consisting - of combined data+bss. - - To handle the above situation, this routine generates TWO bfd sections - for the single program segment. The first has the length specified by - the file size of the segment, and the second has the length specified - by the difference between the two sizes. In effect, the segment is split - into it's initialized and uninitialized parts. - - */ - -boolean -bfd_section_from_phdr (abfd, hdr, index) - bfd *abfd; - Elf_Internal_Phdr *hdr; - int index; -{ - asection *newsect; - char *name; - char namebuf[64]; - int split; - - split = ((hdr->p_memsz > 0) && - (hdr->p_filesz > 0) && - (hdr->p_memsz > hdr->p_filesz)); - sprintf (namebuf, split ? "segment%da" : "segment%d", index); - name = bfd_alloc (abfd, strlen (namebuf) + 1); - if (!name) - return false; - strcpy (name, namebuf); - newsect = bfd_make_section (abfd, name); - if (newsect == NULL) - return false; - newsect->vma = hdr->p_vaddr; - newsect->lma = hdr->p_paddr; - newsect->_raw_size = hdr->p_filesz; - newsect->filepos = hdr->p_offset; - newsect->flags |= SEC_HAS_CONTENTS; - if (hdr->p_type == PT_LOAD) - { - newsect->flags |= SEC_ALLOC; - newsect->flags |= SEC_LOAD; - if (hdr->p_flags & PF_X) - { - /* FIXME: all we known is that it has execute PERMISSION, - may be data. */ - newsect->flags |= SEC_CODE; - } - } - if (!(hdr->p_flags & PF_W)) - { - newsect->flags |= SEC_READONLY; - } - - if (split) - { - sprintf (namebuf, "segment%db", index); - name = bfd_alloc (abfd, strlen (namebuf) + 1); - if (!name) - return false; - strcpy (name, namebuf); - newsect = bfd_make_section (abfd, name); - if (newsect == NULL) - return false; - newsect->vma = hdr->p_vaddr + hdr->p_filesz; - newsect->lma = hdr->p_paddr + hdr->p_filesz; - newsect->_raw_size = hdr->p_memsz - hdr->p_filesz; - if (hdr->p_type == PT_LOAD) - { - newsect->flags |= SEC_ALLOC; - if (hdr->p_flags & PF_X) - newsect->flags |= SEC_CODE; - } - if (!(hdr->p_flags & PF_W)) - newsect->flags |= SEC_READONLY; - } - - return true; -} - -/* Set up an ELF internal section header for a section. */ - -/*ARGSUSED*/ -static void -elf_fake_sections (abfd, asect, failedptrarg) - bfd *abfd; - asection *asect; - PTR failedptrarg; -{ - struct elf_backend_data *bed = get_elf_backend_data (abfd); - boolean *failedptr = (boolean *) failedptrarg; - Elf_Internal_Shdr *this_hdr; - - if (*failedptr) - { - /* We already failed; just get out of the bfd_map_over_sections - loop. */ - return; - } - - this_hdr = &elf_section_data (asect)->this_hdr; - - this_hdr->sh_name = (unsigned long) _bfd_stringtab_add (elf_shstrtab (abfd), - asect->name, - true, false); - if (this_hdr->sh_name == (unsigned long) -1) - { - *failedptr = true; - return; - } - - this_hdr->sh_flags = 0; - - if ((asect->flags & SEC_ALLOC) != 0) - this_hdr->sh_addr = asect->vma; - else - this_hdr->sh_addr = 0; - - this_hdr->sh_offset = 0; - this_hdr->sh_size = asect->_raw_size; - this_hdr->sh_link = 0; - this_hdr->sh_addralign = 1 << asect->alignment_power; - /* The sh_entsize and sh_info fields may have been set already by - copy_private_section_data. */ - - this_hdr->bfd_section = asect; - this_hdr->contents = NULL; - - /* FIXME: This should not be based on section names. */ - if (strcmp (asect->name, ".dynstr") == 0) - this_hdr->sh_type = SHT_STRTAB; - else if (strcmp (asect->name, ".hash") == 0) - { - this_hdr->sh_type = SHT_HASH; - this_hdr->sh_entsize = bed->s->arch_size / 8; - } - else if (strcmp (asect->name, ".dynsym") == 0) - { - this_hdr->sh_type = SHT_DYNSYM; - this_hdr->sh_entsize = bed->s->sizeof_sym; - } - else if (strcmp (asect->name, ".dynamic") == 0) - { - this_hdr->sh_type = SHT_DYNAMIC; - this_hdr->sh_entsize = bed->s->sizeof_dyn; - } - else if (strncmp (asect->name, ".rela", 5) == 0 - && get_elf_backend_data (abfd)->use_rela_p) - { - this_hdr->sh_type = SHT_RELA; - this_hdr->sh_entsize = bed->s->sizeof_rela; - } - else if (strncmp (asect->name, ".rel", 4) == 0 - && ! get_elf_backend_data (abfd)->use_rela_p) - { - this_hdr->sh_type = SHT_REL; - this_hdr->sh_entsize = bed->s->sizeof_rel; - } - else if (strcmp (asect->name, ".note") == 0) - this_hdr->sh_type = SHT_NOTE; - else if (strncmp (asect->name, ".stab", 5) == 0 - && strcmp (asect->name + strlen (asect->name) - 3, "str") == 0) - this_hdr->sh_type = SHT_STRTAB; - else if ((asect->flags & SEC_ALLOC) != 0 - && (asect->flags & SEC_LOAD) != 0) - this_hdr->sh_type = SHT_PROGBITS; - else if ((asect->flags & SEC_ALLOC) != 0 - && ((asect->flags & SEC_LOAD) == 0)) - this_hdr->sh_type = SHT_NOBITS; - else - { - /* Who knows? */ - this_hdr->sh_type = SHT_PROGBITS; - } - - if ((asect->flags & SEC_ALLOC) != 0) - this_hdr->sh_flags |= SHF_ALLOC; - if ((asect->flags & SEC_READONLY) == 0) - this_hdr->sh_flags |= SHF_WRITE; - if ((asect->flags & SEC_CODE) != 0) - this_hdr->sh_flags |= SHF_EXECINSTR; - - /* Check for processor-specific section types. */ - { - struct elf_backend_data *bed = get_elf_backend_data (abfd); - - if (bed->elf_backend_fake_sections) - (*bed->elf_backend_fake_sections) (abfd, this_hdr, asect); - } - - /* If the section has relocs, set up a section header for the - SHT_REL[A] section. */ - if ((asect->flags & SEC_RELOC) != 0) - { - Elf_Internal_Shdr *rela_hdr; - int use_rela_p = get_elf_backend_data (abfd)->use_rela_p; - char *name; - - rela_hdr = &elf_section_data (asect)->rel_hdr; - name = bfd_alloc (abfd, sizeof ".rela" + strlen (asect->name)); - if (name == NULL) - { - *failedptr = true; - return; - } - sprintf (name, "%s%s", use_rela_p ? ".rela" : ".rel", asect->name); - rela_hdr->sh_name = - (unsigned int) _bfd_stringtab_add (elf_shstrtab (abfd), name, - true, false); - if (rela_hdr->sh_name == (unsigned int) -1) - { - *failedptr = true; - return; - } - rela_hdr->sh_type = use_rela_p ? SHT_RELA : SHT_REL; - rela_hdr->sh_entsize = (use_rela_p - ? bed->s->sizeof_rela - : bed->s->sizeof_rel); - rela_hdr->sh_addralign = bed->s->file_align; - rela_hdr->sh_flags = 0; - rela_hdr->sh_addr = 0; - rela_hdr->sh_size = 0; - rela_hdr->sh_offset = 0; - } -} - -/* Assign all ELF section numbers. The dummy first section is handled here - too. The link/info pointers for the standard section types are filled - in here too, while we're at it. */ - -static boolean -assign_section_numbers (abfd) - bfd *abfd; -{ - struct elf_obj_tdata *t = elf_tdata (abfd); - asection *sec; - unsigned int section_number; - Elf_Internal_Shdr **i_shdrp; - struct elf_backend_data *bed = get_elf_backend_data (abfd); - - section_number = 1; - - for (sec = abfd->sections; sec; sec = sec->next) - { - struct bfd_elf_section_data *d = elf_section_data (sec); - - d->this_idx = section_number++; - if ((sec->flags & SEC_RELOC) == 0) - d->rel_idx = 0; - else - d->rel_idx = section_number++; - } - - t->shstrtab_section = section_number++; - elf_elfheader (abfd)->e_shstrndx = t->shstrtab_section; - t->shstrtab_hdr.sh_size = _bfd_stringtab_size (elf_shstrtab (abfd)); - - if (abfd->symcount > 0) - { - t->symtab_section = section_number++; - t->strtab_section = section_number++; - } - - elf_elfheader (abfd)->e_shnum = section_number; - - /* Set up the list of section header pointers, in agreement with the - indices. */ - i_shdrp = ((Elf_Internal_Shdr **) - bfd_alloc (abfd, section_number * sizeof (Elf_Internal_Shdr *))); - if (i_shdrp == NULL) - return false; - - i_shdrp[0] = ((Elf_Internal_Shdr *) - bfd_alloc (abfd, sizeof (Elf_Internal_Shdr))); - if (i_shdrp[0] == NULL) - { - bfd_release (abfd, i_shdrp); - return false; - } - memset (i_shdrp[0], 0, sizeof (Elf_Internal_Shdr)); - - elf_elfsections (abfd) = i_shdrp; - - i_shdrp[t->shstrtab_section] = &t->shstrtab_hdr; - if (abfd->symcount > 0) - { - i_shdrp[t->symtab_section] = &t->symtab_hdr; - i_shdrp[t->strtab_section] = &t->strtab_hdr; - t->symtab_hdr.sh_link = t->strtab_section; - } - for (sec = abfd->sections; sec; sec = sec->next) - { - struct bfd_elf_section_data *d = elf_section_data (sec); - asection *s; - const char *name; - - i_shdrp[d->this_idx] = &d->this_hdr; - if (d->rel_idx != 0) - i_shdrp[d->rel_idx] = &d->rel_hdr; - - /* Fill in the sh_link and sh_info fields while we're at it. */ - - /* sh_link of a reloc section is the section index of the symbol - table. sh_info is the section index of the section to which - the relocation entries apply. */ - if (d->rel_idx != 0) - { - d->rel_hdr.sh_link = t->symtab_section; - d->rel_hdr.sh_info = d->this_idx; - } - - switch (d->this_hdr.sh_type) - { - case SHT_REL: - case SHT_RELA: - /* A reloc section which we are treating as a normal BFD - section. sh_link is the section index of the symbol - table. sh_info is the section index of the section to - which the relocation entries apply. We assume that an - allocated reloc section uses the dynamic symbol table. - FIXME: How can we be sure? */ - s = bfd_get_section_by_name (abfd, ".dynsym"); - if (s != NULL) - d->this_hdr.sh_link = elf_section_data (s)->this_idx; - - /* We look up the section the relocs apply to by name. */ - name = sec->name; - if (d->this_hdr.sh_type == SHT_REL) - name += 4; - else - name += 5; - s = bfd_get_section_by_name (abfd, name); - if (s != NULL) - d->this_hdr.sh_info = elf_section_data (s)->this_idx; - break; - - case SHT_STRTAB: - /* We assume that a section named .stab*str is a stabs - string section. We look for a section with the same name - but without the trailing ``str'', and set its sh_link - field to point to this section. */ - if (strncmp (sec->name, ".stab", sizeof ".stab" - 1) == 0 - && strcmp (sec->name + strlen (sec->name) - 3, "str") == 0) - { - size_t len; - char *alc; - - len = strlen (sec->name); - alc = (char *) bfd_malloc (len - 2); - if (alc == NULL) - return false; - strncpy (alc, sec->name, len - 3); - alc[len - 3] = '\0'; - s = bfd_get_section_by_name (abfd, alc); - free (alc); - if (s != NULL) - { - elf_section_data (s)->this_hdr.sh_link = d->this_idx; - - /* This is a .stab section. */ - elf_section_data (s)->this_hdr.sh_entsize = - 4 + 2 * (bed->s->arch_size / 8); - } - } - break; - - case SHT_DYNAMIC: - case SHT_DYNSYM: - /* sh_link is the section header index of the string table - used for the dynamic entries or symbol table. */ - s = bfd_get_section_by_name (abfd, ".dynstr"); - if (s != NULL) - d->this_hdr.sh_link = elf_section_data (s)->this_idx; - break; - - case SHT_HASH: - /* sh_link is the section header index of the symbol table - this hash table is for. */ - s = bfd_get_section_by_name (abfd, ".dynsym"); - if (s != NULL) - d->this_hdr.sh_link = elf_section_data (s)->this_idx; - break; - } - } - - return true; -} - -/* Map symbol from it's internal number to the external number, moving - all local symbols to be at the head of the list. */ - -static INLINE int -sym_is_global (abfd, sym) - bfd *abfd; - asymbol *sym; -{ - /* If the backend has a special mapping, use it. */ - if (get_elf_backend_data (abfd)->elf_backend_sym_is_global) - return ((*get_elf_backend_data (abfd)->elf_backend_sym_is_global) - (abfd, sym)); - - return ((sym->flags & (BSF_GLOBAL | BSF_WEAK)) != 0 - || bfd_is_und_section (bfd_get_section (sym)) - || bfd_is_com_section (bfd_get_section (sym))); -} - -static boolean -elf_map_symbols (abfd) - bfd *abfd; -{ - int symcount = bfd_get_symcount (abfd); - asymbol **syms = bfd_get_outsymbols (abfd); - asymbol **sect_syms; - int num_locals = 0; - int num_globals = 0; - int num_locals2 = 0; - int num_globals2 = 0; - int max_index = 0; - int num_sections = 0; - int idx; - asection *asect; - asymbol **new_syms; - -#ifdef DEBUG - fprintf (stderr, "elf_map_symbols\n"); - fflush (stderr); -#endif - - /* Add a section symbol for each BFD section. FIXME: Is this really - necessary? */ - for (asect = abfd->sections; asect; asect = asect->next) - { - if (max_index < asect->index) - max_index = asect->index; - } - - max_index++; - sect_syms = (asymbol **) bfd_zalloc (abfd, max_index * sizeof (asymbol *)); - if (sect_syms == NULL) - return false; - elf_section_syms (abfd) = sect_syms; - - for (idx = 0; idx < symcount; idx++) - { - if ((syms[idx]->flags & BSF_SECTION_SYM) != 0 - && (syms[idx]->value + syms[idx]->section->vma) == 0) - { - asection *sec; - - sec = syms[idx]->section; - if (sec->owner != NULL) - { - if (sec->owner != abfd) - { - if (sec->output_offset != 0) - continue; - sec = sec->output_section; - BFD_ASSERT (sec->owner == abfd); - } - sect_syms[sec->index] = syms[idx]; - } - } - } - - for (asect = abfd->sections; asect; asect = asect->next) - { - asymbol *sym; - - if (sect_syms[asect->index] != NULL) - continue; - - sym = bfd_make_empty_symbol (abfd); - if (sym == NULL) - return false; - sym->the_bfd = abfd; - sym->name = asect->name; - sym->value = 0; - /* Set the flags to 0 to indicate that this one was newly added. */ - sym->flags = 0; - sym->section = asect; - sect_syms[asect->index] = sym; - num_sections++; -#ifdef DEBUG - fprintf (stderr, - "creating section symbol, name = %s, value = 0x%.8lx, index = %d, section = 0x%.8lx\n", - asect->name, (long) asect->vma, asect->index, (long) asect); -#endif - } - - /* Classify all of the symbols. */ - for (idx = 0; idx < symcount; idx++) - { - if (!sym_is_global (abfd, syms[idx])) - num_locals++; - else - num_globals++; - } - for (asect = abfd->sections; asect; asect = asect->next) - { - if (sect_syms[asect->index] != NULL - && sect_syms[asect->index]->flags == 0) - { - sect_syms[asect->index]->flags = BSF_SECTION_SYM; - if (!sym_is_global (abfd, sect_syms[asect->index])) - num_locals++; - else - num_globals++; - sect_syms[asect->index]->flags = 0; - } - } - - /* Now sort the symbols so the local symbols are first. */ - new_syms = ((asymbol **) - bfd_alloc (abfd, - (num_locals + num_globals) * sizeof (asymbol *))); - if (new_syms == NULL) - return false; - - for (idx = 0; idx < symcount; idx++) - { - asymbol *sym = syms[idx]; - int i; - - if (!sym_is_global (abfd, sym)) - i = num_locals2++; - else - i = num_locals + num_globals2++; - new_syms[i] = sym; - sym->udata.i = i + 1; - } - for (asect = abfd->sections; asect; asect = asect->next) - { - if (sect_syms[asect->index] != NULL - && sect_syms[asect->index]->flags == 0) - { - asymbol *sym = sect_syms[asect->index]; - int i; - - sym->flags = BSF_SECTION_SYM; - if (!sym_is_global (abfd, sym)) - i = num_locals2++; - else - i = num_locals + num_globals2++; - new_syms[i] = sym; - sym->udata.i = i + 1; - } - } - - bfd_set_symtab (abfd, new_syms, num_locals + num_globals); - - elf_num_locals (abfd) = num_locals; - elf_num_globals (abfd) = num_globals; - return true; -} - -/* Align to the maximum file alignment that could be required for any - ELF data structure. */ - -static INLINE file_ptr align_file_position PARAMS ((file_ptr, int)); -static INLINE file_ptr -align_file_position (off, align) - file_ptr off; - int align; -{ - return (off + align - 1) & ~(align - 1); -} - -/* Assign a file position to a section, optionally aligning to the - required section alignment. */ - -INLINE file_ptr -_bfd_elf_assign_file_position_for_section (i_shdrp, offset, align) - Elf_Internal_Shdr *i_shdrp; - file_ptr offset; - boolean align; -{ - if (align) - { - unsigned int al; - - al = i_shdrp->sh_addralign; - if (al > 1) - offset = BFD_ALIGN (offset, al); - } - i_shdrp->sh_offset = offset; - if (i_shdrp->bfd_section != NULL) - i_shdrp->bfd_section->filepos = offset; - if (i_shdrp->sh_type != SHT_NOBITS) - offset += i_shdrp->sh_size; - return offset; -} - -/* Compute the file positions we are going to put the sections at, and - otherwise prepare to begin writing out the ELF file. If LINK_INFO - is not NULL, this is being called by the ELF backend linker. */ - -boolean -_bfd_elf_compute_section_file_positions (abfd, link_info) - bfd *abfd; - struct bfd_link_info *link_info; -{ - struct elf_backend_data *bed = get_elf_backend_data (abfd); - boolean failed; - struct bfd_strtab_hash *strtab; - Elf_Internal_Shdr *shstrtab_hdr; - - if (abfd->output_has_begun) - return true; - - /* Do any elf backend specific processing first. */ - if (bed->elf_backend_begin_write_processing) - (*bed->elf_backend_begin_write_processing) (abfd, link_info); - - if (! prep_headers (abfd)) - return false; - - failed = false; - bfd_map_over_sections (abfd, elf_fake_sections, &failed); - if (failed) - return false; - - if (!assign_section_numbers (abfd)) - return false; - - /* The backend linker builds symbol table information itself. */ - if (link_info == NULL && abfd->symcount > 0) - { - if (! swap_out_syms (abfd, &strtab)) - return false; - } - - shstrtab_hdr = &elf_tdata (abfd)->shstrtab_hdr; - /* sh_name was set in prep_headers. */ - shstrtab_hdr->sh_type = SHT_STRTAB; - shstrtab_hdr->sh_flags = 0; - shstrtab_hdr->sh_addr = 0; - shstrtab_hdr->sh_size = _bfd_stringtab_size (elf_shstrtab (abfd)); - shstrtab_hdr->sh_entsize = 0; - shstrtab_hdr->sh_link = 0; - shstrtab_hdr->sh_info = 0; - /* sh_offset is set in assign_file_positions_except_relocs. */ - shstrtab_hdr->sh_addralign = 1; - - if (!assign_file_positions_except_relocs (abfd)) - return false; - - if (link_info == NULL && abfd->symcount > 0) - { - file_ptr off; - Elf_Internal_Shdr *hdr; - - off = elf_tdata (abfd)->next_file_pos; - - hdr = &elf_tdata (abfd)->symtab_hdr; - off = _bfd_elf_assign_file_position_for_section (hdr, off, true); - - hdr = &elf_tdata (abfd)->strtab_hdr; - off = _bfd_elf_assign_file_position_for_section (hdr, off, true); - - elf_tdata (abfd)->next_file_pos = off; - - /* Now that we know where the .strtab section goes, write it - out. */ - if (bfd_seek (abfd, hdr->sh_offset, SEEK_SET) != 0 - || ! _bfd_stringtab_emit (abfd, strtab)) - return false; - _bfd_stringtab_free (strtab); - } - - abfd->output_has_begun = true; - - return true; -} - -/* Create a mapping from a set of sections to a program segment. */ - -static INLINE struct elf_segment_map * -make_mapping (abfd, sections, from, to, phdr) - bfd *abfd; - asection **sections; - unsigned int from; - unsigned int to; - boolean phdr; -{ - struct elf_segment_map *m; - unsigned int i; - asection **hdrpp; - - m = ((struct elf_segment_map *) - bfd_zalloc (abfd, - (sizeof (struct elf_segment_map) - + (to - from - 1) * sizeof (asection *)))); - if (m == NULL) - return NULL; - m->next = NULL; - m->p_type = PT_LOAD; - for (i = from, hdrpp = sections + from; i < to; i++, hdrpp++) - m->sections[i - from] = *hdrpp; - m->count = to - from; - - if (from == 0 && phdr) - { - /* Include the headers in the first PT_LOAD segment. */ - m->includes_filehdr = 1; - m->includes_phdrs = 1; - } - - return m; -} - -/* Set up a mapping from BFD sections to program segments. */ - -static boolean -map_sections_to_segments (abfd) - bfd *abfd; -{ - asection **sections = NULL; - asection *s; - unsigned int i; - unsigned int count; - struct elf_segment_map *mfirst; - struct elf_segment_map **pm; - struct elf_segment_map *m; - asection *last_hdr; - unsigned int phdr_index; - bfd_vma maxpagesize; - asection **hdrpp; - boolean phdr_in_section = true; - boolean writable; - asection *dynsec; - - if (elf_tdata (abfd)->segment_map != NULL) - return true; - - if (bfd_count_sections (abfd) == 0) - return true; - - /* Select the allocated sections, and sort them. */ - - sections = (asection **) bfd_malloc (bfd_count_sections (abfd) - * sizeof (asection *)); - if (sections == NULL) - goto error_return; - - i = 0; - for (s = abfd->sections; s != NULL; s = s->next) - { - if ((s->flags & SEC_ALLOC) != 0) - { - sections[i] = s; - ++i; - } - } - BFD_ASSERT (i <= bfd_count_sections (abfd)); - count = i; - - qsort (sections, (size_t) count, sizeof (asection *), elf_sort_sections); - - /* Build the mapping. */ - - mfirst = NULL; - pm = &mfirst; - - /* If we have a .interp section, then create a PT_PHDR segment for - the program headers and a PT_INTERP segment for the .interp - section. */ - s = bfd_get_section_by_name (abfd, ".interp"); - if (s != NULL && (s->flags & SEC_LOAD) != 0) - { - m = ((struct elf_segment_map *) - bfd_zalloc (abfd, sizeof (struct elf_segment_map))); - if (m == NULL) - goto error_return; - m->next = NULL; - m->p_type = PT_PHDR; - /* FIXME: UnixWare and Solaris set PF_X, Irix 5 does not. */ - m->p_flags = PF_R | PF_X; - m->p_flags_valid = 1; - m->includes_phdrs = 1; - - *pm = m; - pm = &m->next; - - m = ((struct elf_segment_map *) - bfd_zalloc (abfd, sizeof (struct elf_segment_map))); - if (m == NULL) - goto error_return; - m->next = NULL; - m->p_type = PT_INTERP; - m->count = 1; - m->sections[0] = s; - - *pm = m; - pm = &m->next; - } - - /* Look through the sections. We put sections in the same program - segment when the start of the second section can be placed within - a few bytes of the end of the first section. */ - last_hdr = NULL; - phdr_index = 0; - maxpagesize = get_elf_backend_data (abfd)->maxpagesize; - writable = false; - dynsec = bfd_get_section_by_name (abfd, ".dynamic"); - if (dynsec != NULL - && (dynsec->flags & SEC_LOAD) == 0) - dynsec = NULL; - - /* Deal with -Ttext or something similar such that the - first section is not adjacent to the program headers. */ - if (count - && ((sections[0]->lma % maxpagesize) < - (elf_tdata (abfd)->program_header_size % maxpagesize))) - phdr_in_section = false; - - for (i = 0, hdrpp = sections; i < count; i++, hdrpp++) - { - asection *hdr; - - hdr = *hdrpp; - - /* See if this section and the last one will fit in the same - segment. Don't put a loadable section after a non-loadable - section. If we are building a dynamic executable, don't put - a writable section in a read only segment (we don't do this - for a non-dynamic executable because some people prefer to - have only one program segment; anybody can use PHDRS in their - linker script to control what happens anyhow). */ - if (last_hdr == NULL - || ((BFD_ALIGN (last_hdr->lma + last_hdr->_raw_size, maxpagesize) - >= hdr->lma) - && ((last_hdr->flags & SEC_LOAD) != 0 - || (hdr->flags & SEC_LOAD) == 0) - && (dynsec == NULL - || writable - || (hdr->flags & SEC_READONLY) != 0))) - { - last_hdr = hdr; - continue; - } - - /* This section won't fit in the program segment. We must - create a new program header holding all the sections from - phdr_index until hdr. */ - - m = make_mapping (abfd, sections, phdr_index, i, phdr_in_section); - if (m == NULL) - goto error_return; - - *pm = m; - pm = &m->next; - - if ((hdr->flags & SEC_READONLY) == 0) - writable = true; - - last_hdr = hdr; - phdr_index = i; - phdr_in_section = false; - } - - /* Create a final PT_LOAD program segment. */ - if (last_hdr != NULL) - { - m = make_mapping (abfd, sections, phdr_index, i, phdr_in_section); - if (m == NULL) - goto error_return; - - *pm = m; - pm = &m->next; - } - - /* If there is a .dynamic section, throw in a PT_DYNAMIC segment. */ - if (dynsec != NULL) - { - m = ((struct elf_segment_map *) - bfd_zalloc (abfd, sizeof (struct elf_segment_map))); - if (m == NULL) - goto error_return; - m->next = NULL; - m->p_type = PT_DYNAMIC; - m->count = 1; - m->sections[0] = dynsec; - - *pm = m; - pm = &m->next; - } - - free (sections); - sections = NULL; - - elf_tdata (abfd)->segment_map = mfirst; - return true; - - error_return: - if (sections != NULL) - free (sections); - return false; -} - -/* Sort sections by VMA. */ - -static int -elf_sort_sections (arg1, arg2) - const PTR arg1; - const PTR arg2; -{ - const asection *sec1 = *(const asection **) arg1; - const asection *sec2 = *(const asection **) arg2; - - if (sec1->vma < sec2->vma) - return -1; - else if (sec1->vma > sec2->vma) - return 1; - - /* Put !SEC_LOAD sections after SEC_LOAD ones. */ - -#define TOEND(x) (((x)->flags & SEC_LOAD) == 0) - - if (TOEND (sec1)) - if (TOEND (sec2)) - return sec1->target_index - sec2->target_index; - else - return 1; - - if (TOEND (sec2)) - return -1; - -#undef TOEND - - /* Sort by size, to put zero sized sections before others at the - same address. */ - - if (sec1->_raw_size < sec2->_raw_size) - return -1; - if (sec1->_raw_size > sec2->_raw_size) - return 1; - - return sec1->target_index - sec2->target_index; -} - -/* Assign file positions to the sections based on the mapping from - sections to segments. This function also sets up some fields in - the file header, and writes out the program headers. */ - -static boolean -assign_file_positions_for_segments (abfd) - bfd *abfd; -{ - const struct elf_backend_data *bed = get_elf_backend_data (abfd); - unsigned int count; - struct elf_segment_map *m; - unsigned int alloc; - Elf_Internal_Phdr *phdrs; - file_ptr off; - bfd_vma filehdr_vaddr, filehdr_paddr; - bfd_vma phdrs_vaddr, phdrs_paddr; - Elf_Internal_Phdr *p; - - if (elf_tdata (abfd)->segment_map == NULL) - { - if (! map_sections_to_segments (abfd)) - return false; - } - - if (bed->elf_backend_modify_segment_map) - { - if (! (*bed->elf_backend_modify_segment_map) (abfd)) - return false; - } - - count = 0; - for (m = elf_tdata (abfd)->segment_map; m != NULL; m = m->next) - ++count; - - elf_elfheader (abfd)->e_phoff = bed->s->sizeof_ehdr; - elf_elfheader (abfd)->e_phentsize = bed->s->sizeof_phdr; - elf_elfheader (abfd)->e_phnum = count; - - if (count == 0) - return true; - - /* If we already counted the number of program segments, make sure - that we allocated enough space. This happens when SIZEOF_HEADERS - is used in a linker script. */ - alloc = elf_tdata (abfd)->program_header_size / bed->s->sizeof_phdr; - if (alloc != 0 && count > alloc) - { - ((*_bfd_error_handler) - ("%s: Not enough room for program headers (allocated %u, need %u)", - bfd_get_filename (abfd), alloc, count)); - bfd_set_error (bfd_error_bad_value); - return false; - } - - if (alloc == 0) - alloc = count; - - phdrs = ((Elf_Internal_Phdr *) - bfd_alloc (abfd, alloc * sizeof (Elf_Internal_Phdr))); - if (phdrs == NULL) - return false; - - off = bed->s->sizeof_ehdr; - off += alloc * bed->s->sizeof_phdr; - - filehdr_vaddr = 0; - filehdr_paddr = 0; - phdrs_vaddr = 0; - phdrs_paddr = 0; - for (m = elf_tdata (abfd)->segment_map, p = phdrs; - m != NULL; - m = m->next, p++) - { - unsigned int i; - asection **secpp; - - /* If elf_segment_map is not from map_sections_to_segments, the - sections may not be correctly ordered. */ - if (m->count > 0) - qsort (m->sections, (size_t) m->count, sizeof (asection *), - elf_sort_sections); - - p->p_type = m->p_type; - - if (m->p_flags_valid) - p->p_flags = m->p_flags; - else - p->p_flags = 0; - - if (p->p_type == PT_LOAD - && m->count > 0 - && (m->sections[0]->flags & SEC_LOAD) != 0) - off += (m->sections[0]->vma - off) % bed->maxpagesize; - - if (m->count == 0) - p->p_vaddr = 0; - else - p->p_vaddr = m->sections[0]->vma; - - if (m->p_paddr_valid) - p->p_paddr = m->p_paddr; - else if (m->count == 0) - p->p_paddr = 0; - else - p->p_paddr = m->sections[0]->lma; - - if (p->p_type == PT_LOAD) - p->p_align = bed->maxpagesize; - else if (m->count == 0) - p->p_align = bed->s->file_align; - else - p->p_align = 0; - - p->p_offset = 0; - p->p_filesz = 0; - p->p_memsz = 0; - - if (m->includes_filehdr) - { - if (! m->p_flags_valid) - p->p_flags |= PF_R; - p->p_offset = 0; - p->p_filesz = bed->s->sizeof_ehdr; - p->p_memsz = bed->s->sizeof_ehdr; - if (m->count > 0) - { - BFD_ASSERT (p->p_type == PT_LOAD); - p->p_vaddr -= off; - if (! m->p_paddr_valid) - p->p_paddr -= off; - } - if (p->p_type == PT_LOAD) - { - filehdr_vaddr = p->p_vaddr; - filehdr_paddr = p->p_paddr; - } - } - - if (m->includes_phdrs) - { - if (! m->p_flags_valid) - p->p_flags |= PF_R; - if (m->includes_filehdr) - { - if (p->p_type == PT_LOAD) - { - phdrs_vaddr = p->p_vaddr + bed->s->sizeof_ehdr; - phdrs_paddr = p->p_paddr + bed->s->sizeof_ehdr; - } - } - else - { - p->p_offset = bed->s->sizeof_ehdr; - if (m->count > 0) - { - BFD_ASSERT (p->p_type == PT_LOAD); - p->p_vaddr -= off - p->p_offset; - if (! m->p_paddr_valid) - p->p_paddr -= off - p->p_offset; - } - if (p->p_type == PT_LOAD) - { - phdrs_vaddr = p->p_vaddr; - phdrs_paddr = p->p_paddr; - } - } - p->p_filesz += alloc * bed->s->sizeof_phdr; - p->p_memsz += alloc * bed->s->sizeof_phdr; - } - - if (p->p_type == PT_LOAD) - { - if (! m->includes_filehdr && ! m->includes_phdrs) - p->p_offset = off; - else - { - file_ptr adjust; - - adjust = off - (p->p_offset + p->p_filesz); - p->p_filesz += adjust; - p->p_memsz += adjust; - } - } - - for (i = 0, secpp = m->sections; i < m->count; i++, secpp++) - { - asection *sec; - flagword flags; - bfd_size_type align; - - sec = *secpp; - flags = sec->flags; - - if (p->p_type == PT_LOAD) - { - bfd_vma adjust; - - /* The section VMA must equal the file position modulo - the page size. */ - if ((flags & SEC_ALLOC) != 0) - { - adjust = (sec->vma - off) % bed->maxpagesize; - if (adjust != 0) - { - if (i == 0) - abort (); - p->p_memsz += adjust; - off += adjust; - if ((flags & SEC_LOAD) != 0) - p->p_filesz += adjust; - } - } - - sec->filepos = off; - - if ((flags & SEC_LOAD) != 0) - off += sec->_raw_size; - } - - p->p_memsz += sec->_raw_size; - - if ((flags & SEC_LOAD) != 0) - p->p_filesz += sec->_raw_size; - - align = 1 << bfd_get_section_alignment (abfd, sec); - if (align > p->p_align) - p->p_align = align; - - if (! m->p_flags_valid) - { - p->p_flags |= PF_R; - if ((flags & SEC_CODE) != 0) - p->p_flags |= PF_X; - if ((flags & SEC_READONLY) == 0) - p->p_flags |= PF_W; - } - } - } - - /* Now that we have set the section file positions, we can set up - the file positions for the non PT_LOAD segments. */ - for (m = elf_tdata (abfd)->segment_map, p = phdrs; - m != NULL; - m = m->next, p++) - { - if (p->p_type != PT_LOAD && m->count > 0) - { - BFD_ASSERT (! m->includes_filehdr && ! m->includes_phdrs); - p->p_offset = m->sections[0]->filepos; - } - if (m->count == 0) - { - if (m->includes_filehdr) - { - p->p_vaddr = filehdr_vaddr; - if (! m->p_paddr_valid) - p->p_paddr = filehdr_paddr; - } - else if (m->includes_phdrs) - { - p->p_vaddr = phdrs_vaddr; - if (! m->p_paddr_valid) - p->p_paddr = phdrs_paddr; - } - } - } - - /* Clear out any program headers we allocated but did not use. */ - for (; count < alloc; count++, p++) - { - memset (p, 0, sizeof *p); - p->p_type = PT_NULL; - } - - elf_tdata (abfd)->phdr = phdrs; - - elf_tdata (abfd)->next_file_pos = off; - - /* Write out the program headers. */ - if (bfd_seek (abfd, bed->s->sizeof_ehdr, SEEK_SET) != 0 - || bed->s->write_out_phdrs (abfd, phdrs, alloc) != 0) - return false; - - return true; -} - -/* Get the size of the program header. - - If this is called by the linker before any of the section VMA's are set, it - can't calculate the correct value for a strange memory layout. This only - happens when SIZEOF_HEADERS is used in a linker script. In this case, - SORTED_HDRS is NULL and we assume the normal scenario of one text and one - data segment (exclusive of .interp and .dynamic). - - ??? User written scripts must either not use SIZEOF_HEADERS, or assume there - will be two segments. */ - -static bfd_size_type -get_program_header_size (abfd) - bfd *abfd; -{ - size_t segs; - asection *s; - struct elf_backend_data *bed = get_elf_backend_data (abfd); - - /* We can't return a different result each time we're called. */ - if (elf_tdata (abfd)->program_header_size != 0) - return elf_tdata (abfd)->program_header_size; - - if (elf_tdata (abfd)->segment_map != NULL) - { - struct elf_segment_map *m; - - segs = 0; - for (m = elf_tdata (abfd)->segment_map; m != NULL; m = m->next) - ++segs; - elf_tdata (abfd)->program_header_size = segs * bed->s->sizeof_phdr; - return elf_tdata (abfd)->program_header_size; - } - - /* Assume we will need exactly two PT_LOAD segments: one for text - and one for data. */ - segs = 2; - - s = bfd_get_section_by_name (abfd, ".interp"); - if (s != NULL && (s->flags & SEC_LOAD) != 0) - { - /* If we have a loadable interpreter section, we need a - PT_INTERP segment. In this case, assume we also need a - PT_PHDR segment, although that may not be true for all - targets. */ - segs += 2; - } - - if (bfd_get_section_by_name (abfd, ".dynamic") != NULL) - { - /* We need a PT_DYNAMIC segment. */ - ++segs; - } - - /* Let the backend count up any program headers it might need. */ - if (bed->elf_backend_additional_program_headers) - { - int a; - - a = (*bed->elf_backend_additional_program_headers) (abfd); - if (a == -1) - abort (); - segs += a; - } - - elf_tdata (abfd)->program_header_size = segs * bed->s->sizeof_phdr; - return elf_tdata (abfd)->program_header_size; -} - -/* Work out the file positions of all the sections. This is called by - _bfd_elf_compute_section_file_positions. All the section sizes and - VMAs must be known before this is called. - - We do not consider reloc sections at this point, unless they form - part of the loadable image. Reloc sections are assigned file - positions in assign_file_positions_for_relocs, which is called by - write_object_contents and final_link. - - We also don't set the positions of the .symtab and .strtab here. */ - -static boolean -assign_file_positions_except_relocs (abfd) - bfd *abfd; -{ - struct elf_obj_tdata * const tdata = elf_tdata (abfd); - Elf_Internal_Ehdr * const i_ehdrp = elf_elfheader (abfd); - Elf_Internal_Shdr ** const i_shdrpp = elf_elfsections (abfd); - file_ptr off; - struct elf_backend_data *bed = get_elf_backend_data (abfd); - - if ((abfd->flags & (EXEC_P | DYNAMIC)) == 0) - { - Elf_Internal_Shdr **hdrpp; - unsigned int i; - - /* Start after the ELF header. */ - off = i_ehdrp->e_ehsize; - - /* We are not creating an executable, which means that we are - not creating a program header, and that the actual order of - the sections in the file is unimportant. */ - for (i = 1, hdrpp = i_shdrpp + 1; i < i_ehdrp->e_shnum; i++, hdrpp++) - { - Elf_Internal_Shdr *hdr; - - hdr = *hdrpp; - if (hdr->sh_type == SHT_REL || hdr->sh_type == SHT_RELA) - { - hdr->sh_offset = -1; - continue; - } - if (i == tdata->symtab_section - || i == tdata->strtab_section) - { - hdr->sh_offset = -1; - continue; - } - - off = _bfd_elf_assign_file_position_for_section (hdr, off, true); - } - } - else - { - unsigned int i; - Elf_Internal_Shdr **hdrpp; - - /* Assign file positions for the loaded sections based on the - assignment of sections to segments. */ - if (! assign_file_positions_for_segments (abfd)) - return false; - - /* Assign file positions for the other sections. */ - - off = elf_tdata (abfd)->next_file_pos; - for (i = 1, hdrpp = i_shdrpp + 1; i < i_ehdrp->e_shnum; i++, hdrpp++) - { - Elf_Internal_Shdr *hdr; - - hdr = *hdrpp; - if (hdr->bfd_section != NULL - && hdr->bfd_section->filepos != 0) - hdr->sh_offset = hdr->bfd_section->filepos; - else if ((hdr->sh_flags & SHF_ALLOC) != 0) - { - ((*_bfd_error_handler) - ("%s: warning: allocated section `%s' not in segment", - bfd_get_filename (abfd), - (hdr->bfd_section == NULL - ? "*unknown*" - : hdr->bfd_section->name))); - off += (hdr->sh_addr - off) % bed->maxpagesize; - off = _bfd_elf_assign_file_position_for_section (hdr, off, - false); - } - else if (hdr->sh_type == SHT_REL - || hdr->sh_type == SHT_RELA - || hdr == i_shdrpp[tdata->symtab_section] - || hdr == i_shdrpp[tdata->strtab_section]) - hdr->sh_offset = -1; - else - off = _bfd_elf_assign_file_position_for_section (hdr, off, true); - } - } - - /* Place the section headers. */ - off = align_file_position (off, bed->s->file_align); - i_ehdrp->e_shoff = off; - off += i_ehdrp->e_shnum * i_ehdrp->e_shentsize; - - elf_tdata (abfd)->next_file_pos = off; - - return true; -} - -static boolean -prep_headers (abfd) - bfd *abfd; -{ - Elf_Internal_Ehdr *i_ehdrp; /* Elf file header, internal form */ - Elf_Internal_Phdr *i_phdrp = 0; /* Program header table, internal form */ - Elf_Internal_Shdr **i_shdrp; /* Section header table, internal form */ - int count; - struct bfd_strtab_hash *shstrtab; - struct elf_backend_data *bed = get_elf_backend_data (abfd); - - i_ehdrp = elf_elfheader (abfd); - i_shdrp = elf_elfsections (abfd); - - shstrtab = _bfd_elf_stringtab_init (); - if (shstrtab == NULL) - return false; - - elf_shstrtab (abfd) = shstrtab; - - i_ehdrp->e_ident[EI_MAG0] = ELFMAG0; - i_ehdrp->e_ident[EI_MAG1] = ELFMAG1; - i_ehdrp->e_ident[EI_MAG2] = ELFMAG2; - i_ehdrp->e_ident[EI_MAG3] = ELFMAG3; - - i_ehdrp->e_ident[EI_CLASS] = bed->s->elfclass; - i_ehdrp->e_ident[EI_DATA] = - bfd_big_endian (abfd) ? ELFDATA2MSB : ELFDATA2LSB; - i_ehdrp->e_ident[EI_VERSION] = bed->s->ev_current; - - for (count = EI_PAD; count < EI_NIDENT; count++) - i_ehdrp->e_ident[count] = 0; - - if ((abfd->flags & DYNAMIC) != 0) - i_ehdrp->e_type = ET_DYN; - else if ((abfd->flags & EXEC_P) != 0) - i_ehdrp->e_type = ET_EXEC; - else - i_ehdrp->e_type = ET_REL; - - switch (bfd_get_arch (abfd)) - { - case bfd_arch_unknown: - i_ehdrp->e_machine = EM_NONE; - break; - case bfd_arch_sparc: - if (bed->s->arch_size == 64) - i_ehdrp->e_machine = EM_SPARC64; - else - i_ehdrp->e_machine = EM_SPARC; - break; - case bfd_arch_i386: - i_ehdrp->e_machine = EM_386; - break; - case bfd_arch_m68k: - i_ehdrp->e_machine = EM_68K; - break; - case bfd_arch_m88k: - i_ehdrp->e_machine = EM_88K; - break; - case bfd_arch_i860: - i_ehdrp->e_machine = EM_860; - break; - case bfd_arch_mips: /* MIPS Rxxxx */ - i_ehdrp->e_machine = EM_MIPS; /* only MIPS R3000 */ - break; - case bfd_arch_hppa: - i_ehdrp->e_machine = EM_PARISC; - break; - case bfd_arch_powerpc: - i_ehdrp->e_machine = EM_PPC; - break; - /* also note that EM_M32, AT&T WE32100 is unknown to bfd */ - default: - i_ehdrp->e_machine = EM_NONE; - } - i_ehdrp->e_version = bed->s->ev_current; - i_ehdrp->e_ehsize = bed->s->sizeof_ehdr; - - /* no program header, for now. */ - i_ehdrp->e_phoff = 0; - i_ehdrp->e_phentsize = 0; - i_ehdrp->e_phnum = 0; - - /* each bfd section is section header entry */ - i_ehdrp->e_entry = bfd_get_start_address (abfd); - i_ehdrp->e_shentsize = bed->s->sizeof_shdr; - - /* if we're building an executable, we'll need a program header table */ - if (abfd->flags & EXEC_P) - { - /* it all happens later */ -#if 0 - i_ehdrp->e_phentsize = sizeof (Elf_External_Phdr); - - /* elf_build_phdrs() returns a (NULL-terminated) array of - Elf_Internal_Phdrs */ - i_phdrp = elf_build_phdrs (abfd, i_ehdrp, i_shdrp, &i_ehdrp->e_phnum); - i_ehdrp->e_phoff = outbase; - outbase += i_ehdrp->e_phentsize * i_ehdrp->e_phnum; -#endif - } - else - { - i_ehdrp->e_phentsize = 0; - i_phdrp = 0; - i_ehdrp->e_phoff = 0; - } - - elf_tdata (abfd)->symtab_hdr.sh_name = - (unsigned int) _bfd_stringtab_add (shstrtab, ".symtab", true, false); - elf_tdata (abfd)->strtab_hdr.sh_name = - (unsigned int) _bfd_stringtab_add (shstrtab, ".strtab", true, false); - elf_tdata (abfd)->shstrtab_hdr.sh_name = - (unsigned int) _bfd_stringtab_add (shstrtab, ".shstrtab", true, false); - if (elf_tdata (abfd)->symtab_hdr.sh_name == (unsigned int) -1 - || elf_tdata (abfd)->symtab_hdr.sh_name == (unsigned int) -1 - || elf_tdata (abfd)->shstrtab_hdr.sh_name == (unsigned int) -1) - return false; - - return true; -} - -/* Assign file positions for all the reloc sections which are not part - of the loadable file image. */ - -void -_bfd_elf_assign_file_positions_for_relocs (abfd) - bfd *abfd; -{ - file_ptr off; - unsigned int i; - Elf_Internal_Shdr **shdrpp; - - off = elf_tdata (abfd)->next_file_pos; - - for (i = 1, shdrpp = elf_elfsections (abfd) + 1; - i < elf_elfheader (abfd)->e_shnum; - i++, shdrpp++) - { - Elf_Internal_Shdr *shdrp; - - shdrp = *shdrpp; - if ((shdrp->sh_type == SHT_REL || shdrp->sh_type == SHT_RELA) - && shdrp->sh_offset == -1) - off = _bfd_elf_assign_file_position_for_section (shdrp, off, true); - } - - elf_tdata (abfd)->next_file_pos = off; -} - -boolean -_bfd_elf_write_object_contents (abfd) - bfd *abfd; -{ - struct elf_backend_data *bed = get_elf_backend_data (abfd); - Elf_Internal_Ehdr *i_ehdrp; - Elf_Internal_Shdr **i_shdrp; - boolean failed; - unsigned int count; - - if (! abfd->output_has_begun - && ! _bfd_elf_compute_section_file_positions (abfd, - (struct bfd_link_info *) NULL)) - return false; - - i_shdrp = elf_elfsections (abfd); - i_ehdrp = elf_elfheader (abfd); - - failed = false; - bfd_map_over_sections (abfd, bed->s->write_relocs, &failed); - if (failed) - return false; - _bfd_elf_assign_file_positions_for_relocs (abfd); - - /* After writing the headers, we need to write the sections too... */ - for (count = 1; count < i_ehdrp->e_shnum; count++) - { - if (bed->elf_backend_section_processing) - (*bed->elf_backend_section_processing) (abfd, i_shdrp[count]); - if (i_shdrp[count]->contents) - { - if (bfd_seek (abfd, i_shdrp[count]->sh_offset, SEEK_SET) != 0 - || (bfd_write (i_shdrp[count]->contents, i_shdrp[count]->sh_size, - 1, abfd) - != i_shdrp[count]->sh_size)) - return false; - } - } - - /* Write out the section header names. */ - if (bfd_seek (abfd, elf_tdata (abfd)->shstrtab_hdr.sh_offset, SEEK_SET) != 0 - || ! _bfd_stringtab_emit (abfd, elf_shstrtab (abfd))) - return false; - - if (bed->elf_backend_final_write_processing) - (*bed->elf_backend_final_write_processing) (abfd, - elf_tdata (abfd)->linker); - - return bed->s->write_shdrs_and_ehdr (abfd); -} - -/* given a section, search the header to find them... */ -int -_bfd_elf_section_from_bfd_section (abfd, asect) - bfd *abfd; - struct sec *asect; -{ - struct elf_backend_data *bed = get_elf_backend_data (abfd); - Elf_Internal_Shdr **i_shdrp = elf_elfsections (abfd); - int index; - Elf_Internal_Shdr *hdr; - int maxindex = elf_elfheader (abfd)->e_shnum; - - for (index = 0; index < maxindex; index++) - { - hdr = i_shdrp[index]; - if (hdr->bfd_section == asect) - return index; - } - - if (bed->elf_backend_section_from_bfd_section) - { - for (index = 0; index < maxindex; index++) - { - int retval; - - hdr = i_shdrp[index]; - retval = index; - if ((*bed->elf_backend_section_from_bfd_section) - (abfd, hdr, asect, &retval)) - return retval; - } - } - - if (bfd_is_abs_section (asect)) - return SHN_ABS; - if (bfd_is_com_section (asect)) - return SHN_COMMON; - if (bfd_is_und_section (asect)) - return SHN_UNDEF; - - return -1; -} - -/* Given a BFD symbol, return the index in the ELF symbol table, or -1 - on error. */ - -int -_bfd_elf_symbol_from_bfd_symbol (abfd, asym_ptr_ptr) - bfd *abfd; - struct symbol_cache_entry **asym_ptr_ptr; -{ - struct symbol_cache_entry *asym_ptr = *asym_ptr_ptr; - int idx; - flagword flags = asym_ptr->flags; - - /* When gas creates relocations against local labels, it creates its - own symbol for the section, but does put the symbol into the - symbol chain, so udata is 0. When the linker is generating - relocatable output, this section symbol may be for one of the - input sections rather than the output section. */ - if (asym_ptr->udata.i == 0 - && (flags & BSF_SECTION_SYM) - && asym_ptr->section) - { - int indx; - - if (asym_ptr->section->output_section != NULL) - indx = asym_ptr->section->output_section->index; - else - indx = asym_ptr->section->index; - if (elf_section_syms (abfd)[indx]) - asym_ptr->udata.i = elf_section_syms (abfd)[indx]->udata.i; - } - - idx = asym_ptr->udata.i; - - if (idx == 0) - { - /* This case can occur when using --strip-symbol on a symbol - which is used in a relocation entry. */ - (*_bfd_error_handler) - ("%s: symbol `%s' required but not present", - bfd_get_filename (abfd), bfd_asymbol_name (asym_ptr)); - bfd_set_error (bfd_error_no_symbols); - return -1; - } - -#if DEBUG & 4 - { - fprintf (stderr, - "elf_symbol_from_bfd_symbol 0x%.8lx, name = %s, sym num = %d, flags = 0x%.8lx%s\n", - (long) asym_ptr, asym_ptr->name, idx, flags, - elf_symbol_flags (flags)); - fflush (stderr); - } -#endif - - return idx; -} - -/* Copy private BFD data. This copies any program header information. */ - -static boolean -copy_private_bfd_data (ibfd, obfd) - bfd *ibfd; - bfd *obfd; -{ - Elf_Internal_Ehdr *iehdr; - struct elf_segment_map *mfirst; - struct elf_segment_map **pm; - Elf_Internal_Phdr *p; - unsigned int i, c; - - if (bfd_get_flavour (ibfd) != bfd_target_elf_flavour - || bfd_get_flavour (obfd) != bfd_target_elf_flavour) - return true; - - if (elf_tdata (ibfd)->phdr == NULL) - return true; - - iehdr = elf_elfheader (ibfd); - - mfirst = NULL; - pm = &mfirst; - - c = elf_elfheader (ibfd)->e_phnum; - for (i = 0, p = elf_tdata (ibfd)->phdr; i < c; i++, p++) - { - unsigned int csecs; - asection *s; - struct elf_segment_map *m; - unsigned int isec; - - csecs = 0; - - /* The complicated case when p_vaddr is 0 is to handle the - Solaris linker, which generates a PT_INTERP section with - p_vaddr and p_memsz set to 0. */ - for (s = ibfd->sections; s != NULL; s = s->next) - if (((s->vma >= p->p_vaddr - && (s->vma + s->_raw_size <= p->p_vaddr + p->p_memsz - || s->vma + s->_raw_size <= p->p_vaddr + p->p_filesz)) - || (p->p_vaddr == 0 - && p->p_filesz > 0 - && (s->flags & SEC_HAS_CONTENTS) != 0 - && (bfd_vma) s->filepos >= p->p_offset - && ((bfd_vma) s->filepos + s->_raw_size - <= p->p_offset + p->p_filesz))) - && (s->flags & SEC_ALLOC) != 0 - && s->output_section != NULL) - ++csecs; - - m = ((struct elf_segment_map *) - bfd_alloc (obfd, - (sizeof (struct elf_segment_map) - + (csecs - 1) * sizeof (asection *)))); - if (m == NULL) - return false; - - m->next = NULL; - m->p_type = p->p_type; - m->p_flags = p->p_flags; - m->p_flags_valid = 1; - m->p_paddr = p->p_paddr; - m->p_paddr_valid = 1; - - m->includes_filehdr = (p->p_offset == 0 - && p->p_filesz >= iehdr->e_ehsize); - - m->includes_phdrs = (p->p_offset <= (bfd_vma) iehdr->e_phoff - && (p->p_offset + p->p_filesz - >= ((bfd_vma) iehdr->e_phoff - + iehdr->e_phnum * iehdr->e_phentsize))); - - isec = 0; - for (s = ibfd->sections; s != NULL; s = s->next) - { - if (((s->vma >= p->p_vaddr - && (s->vma + s->_raw_size <= p->p_vaddr + p->p_memsz - || s->vma + s->_raw_size <= p->p_vaddr + p->p_filesz)) - || (p->p_vaddr == 0 - && p->p_filesz > 0 - && (s->flags & SEC_HAS_CONTENTS) != 0 - && (bfd_vma) s->filepos >= p->p_offset - && ((bfd_vma) s->filepos + s->_raw_size - <= p->p_offset + p->p_filesz))) - && (s->flags & SEC_ALLOC) != 0 - && s->output_section != NULL) - { - m->sections[isec] = s->output_section; - ++isec; - } - } - BFD_ASSERT (isec == csecs); - m->count = csecs; - - *pm = m; - pm = &m->next; - } - - elf_tdata (obfd)->segment_map = mfirst; - - return true; -} - -/* Copy private section information. This copies over the entsize - field, and sometimes the info field. */ - -boolean -_bfd_elf_copy_private_section_data (ibfd, isec, obfd, osec) - bfd *ibfd; - asection *isec; - bfd *obfd; - asection *osec; -{ - Elf_Internal_Shdr *ihdr, *ohdr; - - if (ibfd->xvec->flavour != bfd_target_elf_flavour - || obfd->xvec->flavour != bfd_target_elf_flavour) - return true; - - /* Copy over private BFD data if it has not already been copied. - This must be done here, rather than in the copy_private_bfd_data - entry point, because the latter is called after the section - contents have been set, which means that the program headers have - already been worked out. */ - if (elf_tdata (obfd)->segment_map == NULL - && elf_tdata (ibfd)->phdr != NULL) - { - asection *s; - - /* Only set up the segments when all the sections have been set - up. */ - for (s = ibfd->sections; s != NULL; s = s->next) - if (s->output_section == NULL) - break; - if (s == NULL) - { - if (! copy_private_bfd_data (ibfd, obfd)) - return false; - } - } - - ihdr = &elf_section_data (isec)->this_hdr; - ohdr = &elf_section_data (osec)->this_hdr; - - ohdr->sh_entsize = ihdr->sh_entsize; - - if (ihdr->sh_type == SHT_SYMTAB - || ihdr->sh_type == SHT_DYNSYM) - ohdr->sh_info = ihdr->sh_info; - - return true; -} - -/* Copy private symbol information. If this symbol is in a section - which we did not map into a BFD section, try to map the section - index correctly. We use special macro definitions for the mapped - section indices; these definitions are interpreted by the - swap_out_syms function. */ - -#define MAP_ONESYMTAB (SHN_LORESERVE - 1) -#define MAP_DYNSYMTAB (SHN_LORESERVE - 2) -#define MAP_STRTAB (SHN_LORESERVE - 3) -#define MAP_SHSTRTAB (SHN_LORESERVE - 4) - -boolean -_bfd_elf_copy_private_symbol_data (ibfd, isymarg, obfd, osymarg) - bfd *ibfd; - asymbol *isymarg; - bfd *obfd; - asymbol *osymarg; -{ - elf_symbol_type *isym, *osym; - - isym = elf_symbol_from (ibfd, isymarg); - osym = elf_symbol_from (obfd, osymarg); - - if (isym != NULL - && osym != NULL - && bfd_is_abs_section (isym->symbol.section)) - { - unsigned int shndx; - - shndx = isym->internal_elf_sym.st_shndx; - if (shndx == elf_onesymtab (ibfd)) - shndx = MAP_ONESYMTAB; - else if (shndx == elf_dynsymtab (ibfd)) - shndx = MAP_DYNSYMTAB; - else if (shndx == elf_tdata (ibfd)->strtab_section) - shndx = MAP_STRTAB; - else if (shndx == elf_tdata (ibfd)->shstrtab_section) - shndx = MAP_SHSTRTAB; - osym->internal_elf_sym.st_shndx = shndx; - } - - return true; -} - -/* Swap out the symbols. */ - -static boolean -swap_out_syms (abfd, sttp) - bfd *abfd; - struct bfd_strtab_hash **sttp; -{ - struct elf_backend_data *bed = get_elf_backend_data (abfd); - - if (!elf_map_symbols (abfd)) - return false; - - /* Dump out the symtabs. */ - { - int symcount = bfd_get_symcount (abfd); - asymbol **syms = bfd_get_outsymbols (abfd); - struct bfd_strtab_hash *stt; - Elf_Internal_Shdr *symtab_hdr; - Elf_Internal_Shdr *symstrtab_hdr; - char *outbound_syms; - int idx; - - stt = _bfd_elf_stringtab_init (); - if (stt == NULL) - return false; - - symtab_hdr = &elf_tdata (abfd)->symtab_hdr; - symtab_hdr->sh_type = SHT_SYMTAB; - symtab_hdr->sh_entsize = bed->s->sizeof_sym; - symtab_hdr->sh_size = symtab_hdr->sh_entsize * (symcount + 1); - symtab_hdr->sh_info = elf_num_locals (abfd) + 1; - symtab_hdr->sh_addralign = bed->s->file_align; - - symstrtab_hdr = &elf_tdata (abfd)->strtab_hdr; - symstrtab_hdr->sh_type = SHT_STRTAB; - - outbound_syms = bfd_alloc (abfd, - (1 + symcount) * bed->s->sizeof_sym); - if (outbound_syms == NULL) - return false; - symtab_hdr->contents = (PTR) outbound_syms; - - /* now generate the data (for "contents") */ - { - /* Fill in zeroth symbol and swap it out. */ - Elf_Internal_Sym sym; - sym.st_name = 0; - sym.st_value = 0; - sym.st_size = 0; - sym.st_info = 0; - sym.st_other = 0; - sym.st_shndx = SHN_UNDEF; - bed->s->swap_symbol_out (abfd, &sym, (PTR) outbound_syms); - outbound_syms += bed->s->sizeof_sym; - } - for (idx = 0; idx < symcount; idx++) - { - Elf_Internal_Sym sym; - bfd_vma value = syms[idx]->value; - elf_symbol_type *type_ptr; - flagword flags = syms[idx]->flags; - int type; - - if (flags & BSF_SECTION_SYM) - /* Section symbols have no names. */ - sym.st_name = 0; - else - { - sym.st_name = (unsigned long) _bfd_stringtab_add (stt, - syms[idx]->name, - true, false); - if (sym.st_name == (unsigned long) -1) - return false; - } - - type_ptr = elf_symbol_from (abfd, syms[idx]); - - if (bfd_is_com_section (syms[idx]->section)) - { - /* ELF common symbols put the alignment into the `value' field, - and the size into the `size' field. This is backwards from - how BFD handles it, so reverse it here. */ - sym.st_size = value; - if (type_ptr == NULL - || type_ptr->internal_elf_sym.st_value == 0) - sym.st_value = value >= 16 ? 16 : (1 << bfd_log2 (value)); - else - sym.st_value = type_ptr->internal_elf_sym.st_value; - sym.st_shndx = _bfd_elf_section_from_bfd_section (abfd, - syms[idx]->section); - } - else - { - asection *sec = syms[idx]->section; - int shndx; - - if (sec->output_section) - { - value += sec->output_offset; - sec = sec->output_section; - } - value += sec->vma; - sym.st_value = value; - sym.st_size = type_ptr ? type_ptr->internal_elf_sym.st_size : 0; - - if (bfd_is_abs_section (sec) - && type_ptr != NULL - && type_ptr->internal_elf_sym.st_shndx != 0) - { - /* This symbol is in a real ELF section which we did - not create as a BFD section. Undo the mapping done - by copy_private_symbol_data. */ - shndx = type_ptr->internal_elf_sym.st_shndx; - switch (shndx) - { - case MAP_ONESYMTAB: - shndx = elf_onesymtab (abfd); - break; - case MAP_DYNSYMTAB: - shndx = elf_dynsymtab (abfd); - break; - case MAP_STRTAB: - shndx = elf_tdata (abfd)->strtab_section; - break; - case MAP_SHSTRTAB: - shndx = elf_tdata (abfd)->shstrtab_section; - break; - default: - break; - } - } - else - { - shndx = _bfd_elf_section_from_bfd_section (abfd, sec); - - if (shndx == -1) - { - asection *sec2; - - /* Writing this would be a hell of a lot easier if - we had some decent documentation on bfd, and - knew what to expect of the library, and what to - demand of applications. For example, it - appears that `objcopy' might not set the - section of a symbol to be a section that is - actually in the output file. */ - sec2 = bfd_get_section_by_name (abfd, sec->name); - BFD_ASSERT (sec2 != 0); - shndx = _bfd_elf_section_from_bfd_section (abfd, sec2); - BFD_ASSERT (shndx != -1); - } - } - - sym.st_shndx = shndx; - } - - if ((flags & BSF_FUNCTION) != 0) - type = STT_FUNC; - else if ((flags & BSF_OBJECT) != 0) - type = STT_OBJECT; - else - type = STT_NOTYPE; - - if (bfd_is_com_section (syms[idx]->section)) - sym.st_info = ELF_ST_INFO (STB_GLOBAL, type); - else if (bfd_is_und_section (syms[idx]->section)) - sym.st_info = ELF_ST_INFO (((flags & BSF_WEAK) - ? STB_WEAK - : STB_GLOBAL), - type); - else if (flags & BSF_SECTION_SYM) - sym.st_info = ELF_ST_INFO (STB_LOCAL, STT_SECTION); - else if (flags & BSF_FILE) - sym.st_info = ELF_ST_INFO (STB_LOCAL, STT_FILE); - else - { - int bind = STB_LOCAL; - - if (flags & BSF_LOCAL) - bind = STB_LOCAL; - else if (flags & BSF_WEAK) - bind = STB_WEAK; - else if (flags & BSF_GLOBAL) - bind = STB_GLOBAL; - - sym.st_info = ELF_ST_INFO (bind, type); - } - - sym.st_other = 0; - bed->s->swap_symbol_out (abfd, &sym, (PTR) outbound_syms); - outbound_syms += bed->s->sizeof_sym; - } - - *sttp = stt; - symstrtab_hdr->sh_size = _bfd_stringtab_size (stt); - symstrtab_hdr->sh_type = SHT_STRTAB; - - symstrtab_hdr->sh_flags = 0; - symstrtab_hdr->sh_addr = 0; - symstrtab_hdr->sh_entsize = 0; - symstrtab_hdr->sh_link = 0; - symstrtab_hdr->sh_info = 0; - symstrtab_hdr->sh_addralign = 1; - } - - return true; -} - -/* Return the number of bytes required to hold the symtab vector. - - Note that we base it on the count plus 1, since we will null terminate - the vector allocated based on this size. However, the ELF symbol table - always has a dummy entry as symbol #0, so it ends up even. */ - -long -_bfd_elf_get_symtab_upper_bound (abfd) - bfd *abfd; -{ - long symcount; - long symtab_size; - Elf_Internal_Shdr *hdr = &elf_tdata (abfd)->symtab_hdr; - - symcount = hdr->sh_size / get_elf_backend_data (abfd)->s->sizeof_sym; - symtab_size = (symcount - 1 + 1) * (sizeof (asymbol *)); - - return symtab_size; -} - -long -_bfd_elf_get_dynamic_symtab_upper_bound (abfd) - bfd *abfd; -{ - long symcount; - long symtab_size; - Elf_Internal_Shdr *hdr = &elf_tdata (abfd)->dynsymtab_hdr; - - if (elf_dynsymtab (abfd) == 0) - { - bfd_set_error (bfd_error_invalid_operation); - return -1; - } - - symcount = hdr->sh_size / get_elf_backend_data (abfd)->s->sizeof_sym; - symtab_size = (symcount - 1 + 1) * (sizeof (asymbol *)); - - return symtab_size; -} - -long -_bfd_elf_get_reloc_upper_bound (abfd, asect) - bfd *abfd; - sec_ptr asect; -{ - return (asect->reloc_count + 1) * sizeof (arelent *); -} - -/* Canonicalize the relocs. */ - -long -_bfd_elf_canonicalize_reloc (abfd, section, relptr, symbols) - bfd *abfd; - sec_ptr section; - arelent **relptr; - asymbol **symbols; -{ - arelent *tblptr; - unsigned int i; - - if (! get_elf_backend_data (abfd)->s->slurp_reloc_table (abfd, section, symbols)) - return -1; - - tblptr = section->relocation; - for (i = 0; i < section->reloc_count; i++) - *relptr++ = tblptr++; - - *relptr = NULL; - - return section->reloc_count; -} - -long -_bfd_elf_get_symtab (abfd, alocation) - bfd *abfd; - asymbol **alocation; -{ - long symcount = get_elf_backend_data (abfd)->s->slurp_symbol_table (abfd, alocation, false); - - if (symcount >= 0) - bfd_get_symcount (abfd) = symcount; - return symcount; -} - -long -_bfd_elf_canonicalize_dynamic_symtab (abfd, alocation) - bfd *abfd; - asymbol **alocation; -{ - return get_elf_backend_data (abfd)->s->slurp_symbol_table (abfd, alocation, true); -} - -asymbol * -_bfd_elf_make_empty_symbol (abfd) - bfd *abfd; -{ - elf_symbol_type *newsym; - - newsym = (elf_symbol_type *) bfd_zalloc (abfd, sizeof (elf_symbol_type)); - if (!newsym) - return NULL; - else - { - newsym->symbol.the_bfd = abfd; - return &newsym->symbol; - } -} - -void -_bfd_elf_get_symbol_info (ignore_abfd, symbol, ret) - bfd *ignore_abfd; - asymbol *symbol; - symbol_info *ret; -{ - bfd_symbol_info (symbol, ret); -} - -alent * -_bfd_elf_get_lineno (ignore_abfd, symbol) - bfd *ignore_abfd; - asymbol *symbol; -{ - abort (); - return NULL; -} - -boolean -_bfd_elf_set_arch_mach (abfd, arch, machine) - bfd *abfd; - enum bfd_architecture arch; - unsigned long machine; -{ - /* If this isn't the right architecture for this backend, and this - isn't the generic backend, fail. */ - if (arch != get_elf_backend_data (abfd)->arch - && arch != bfd_arch_unknown - && get_elf_backend_data (abfd)->arch != bfd_arch_unknown) - return false; - - return bfd_default_set_arch_mach (abfd, arch, machine); -} - -/* Find the nearest line to a particular section and offset, for error - reporting. */ - -boolean -_bfd_elf_find_nearest_line (abfd, - section, - symbols, - offset, - filename_ptr, - functionname_ptr, - line_ptr) - bfd *abfd; - asection *section; - asymbol **symbols; - bfd_vma offset; - CONST char **filename_ptr; - CONST char **functionname_ptr; - unsigned int *line_ptr; -{ - boolean found; - const char *filename; - asymbol *func; - bfd_vma low_func; - asymbol **p; - - if (! _bfd_stab_section_find_nearest_line (abfd, symbols, section, offset, - &found, filename_ptr, - functionname_ptr, line_ptr, - &elf_tdata (abfd)->line_info)) - return false; - if (found) - return true; - - if (symbols == NULL) - return false; - - filename = NULL; - func = NULL; - low_func = 0; - - for (p = symbols; *p != NULL; p++) - { - elf_symbol_type *q; - - q = (elf_symbol_type *) *p; - - if (bfd_get_section (&q->symbol) != section) - continue; - - switch (ELF_ST_TYPE (q->internal_elf_sym.st_info)) - { - default: - break; - case STT_FILE: - filename = bfd_asymbol_name (&q->symbol); - break; - case STT_FUNC: - if (q->symbol.section == section - && q->symbol.value >= low_func - && q->symbol.value <= offset) - { - func = (asymbol *) q; - low_func = q->symbol.value; - } - break; - } - } - - if (func == NULL) - return false; - - *filename_ptr = filename; - *functionname_ptr = bfd_asymbol_name (func); - *line_ptr = 0; - return true; -} - -int -_bfd_elf_sizeof_headers (abfd, reloc) - bfd *abfd; - boolean reloc; -{ - int ret; - - ret = get_elf_backend_data (abfd)->s->sizeof_ehdr; - if (! reloc) - ret += get_program_header_size (abfd); - return ret; -} - -boolean -_bfd_elf_set_section_contents (abfd, section, location, offset, count) - bfd *abfd; - sec_ptr section; - PTR location; - file_ptr offset; - bfd_size_type count; -{ - Elf_Internal_Shdr *hdr; - - if (! abfd->output_has_begun - && ! _bfd_elf_compute_section_file_positions (abfd, - (struct bfd_link_info *) NULL)) - return false; - - hdr = &elf_section_data (section)->this_hdr; - - if (bfd_seek (abfd, hdr->sh_offset + offset, SEEK_SET) == -1) - return false; - if (bfd_write (location, 1, count, abfd) != count) - return false; - - return true; -} - -void -_bfd_elf_no_info_to_howto (abfd, cache_ptr, dst) - bfd *abfd; - arelent *cache_ptr; - Elf_Internal_Rela *dst; -{ - abort (); -} - -#if 0 -void -_bfd_elf_no_info_to_howto_rel (abfd, cache_ptr, dst) - bfd *abfd; - arelent *cache_ptr; - Elf_Internal_Rel *dst; -{ - abort (); -} -#endif diff --git a/contrib/gdb/bfd/elf32-gen.c b/contrib/gdb/bfd/elf32-gen.c deleted file mode 100644 index 385fda208602c..0000000000000 --- a/contrib/gdb/bfd/elf32-gen.c +++ /dev/null @@ -1,37 +0,0 @@ -/* Generic support for 32-bit ELF - Copyright 1993 Free Software Foundation, Inc. - -This file is part of BFD, the Binary File Descriptor library. - -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 2 of the License, 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ - -#include "bfd.h" -#include "sysdep.h" -#include "libbfd.h" -#include "elf-bfd.h" - -/* This does not include any relocations, but should be good enough - for GDB to read the file. */ - -#define TARGET_LITTLE_SYM bfd_elf32_little_generic_vec -#define TARGET_LITTLE_NAME "elf32-little" -#define TARGET_BIG_SYM bfd_elf32_big_generic_vec -#define TARGET_BIG_NAME "elf32-big" -#define ELF_ARCH bfd_arch_unknown -#define ELF_MACHINE_CODE EM_NONE -#define bfd_elf32_bfd_reloc_type_lookup bfd_default_reloc_type_lookup -#define elf_info_to_howto _bfd_elf_no_info_to_howto - -#include "elf32-target.h" diff --git a/contrib/gdb/bfd/elf32-hppa.c b/contrib/gdb/bfd/elf32-hppa.c deleted file mode 100644 index 2386731703228..0000000000000 --- a/contrib/gdb/bfd/elf32-hppa.c +++ /dev/null @@ -1,2984 +0,0 @@ -/* BFD back-end for HP PA-RISC ELF files. - Copyright (C) 1990, 91, 92, 93, 94, 1995 Free Software Foundation, Inc. - - Written by - - Center for Software Science - Department of Computer Science - University of Utah - -This file is part of BFD, the Binary File Descriptor library. - -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 2 of the License, 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ - -#include "bfd.h" -#include "sysdep.h" -#include "bfdlink.h" -#include "libbfd.h" -#include "obstack.h" -#include "elf-bfd.h" - -/* The internal type of a symbol table extension entry. */ -typedef unsigned long symext_entryS; - -/* The external type of a symbol table extension entry. */ -#define ELF32_PARISC_SX_SIZE (4) -#define ELF32_PARISC_SX_GET(bfd, addr) bfd_h_get_32 ((bfd), (addr)) -#define ELF32_PARISC_SX_PUT(bfd, val, addr) \ - bfd_h_put_32 ((bfd), (val), (addr)) - -/* HPPA symbol table extension entry types */ -enum elf32_hppa_symextn_types -{ - PARISC_SXT_NULL, - PARISC_SXT_SYMNDX, - PARISC_SXT_ARG_RELOC, -}; - -/* These macros compose and decompose the value of a symextn entry: - - entry_type = ELF32_PARISC_SX_TYPE(word); - entry_value = ELF32_PARISC_SX_VAL(word); - word = ELF32_PARISC_SX_WORD(type,val); */ - -#define ELF32_PARISC_SX_TYPE(p) ((p) >> 24) -#define ELF32_PARISC_SX_VAL(p) ((p) & 0xFFFFFF) -#define ELF32_PARISC_SX_WORD(type,val) (((type) << 24) + (val & 0xFFFFFF)) - -/* The following was added facilitate implementation of the .hppa_symextn - section. This section is built after the symbol table is built in the - elf_write_object_contents routine (called from bfd_close). It is built - so late because it requires information that is not known until - the symbol and string table sections have been allocated, and - the symbol table has been built. */ - -#define SYMEXTN_SECTION_NAME ".PARISC.symext" - -struct symext_chain - { - symext_entryS entry; - struct symext_chain *next; - }; - -typedef struct symext_chain symext_chainS; - -/* We use three different hash tables to hold information for - linking PA ELF objects. - - The first is the elf32_hppa_link_hash_table which is derived - from the standard ELF linker hash table. We use this as a place to - attach other hash tables and static information. - - The second is the stub hash table which is derived from the - base BFD hash table. The stub hash table holds the information - necessary to build the linker stubs during a link. - - The last hash table keeps track of argument location information needed - to build hash tables. Each function with nonzero argument location - bits will have an entry in this table. */ - -/* Hash table for linker stubs. */ - -struct elf32_hppa_stub_hash_entry -{ - /* Base hash table entry structure, we can get the name of the stub - (and thus know exactly what actions it performs) from the base - hash table entry. */ - struct bfd_hash_entry root; - - /* Offset of the beginning of this stub. */ - bfd_vma offset; - - /* Given the symbol's value and its section we can determine its final - value when building the stubs (so the stub knows where to jump. */ - symvalue target_value; - asection *target_section; -}; - -struct elf32_hppa_stub_hash_table -{ - /* The hash table itself. */ - struct bfd_hash_table root; - - /* The stub BFD. */ - bfd *stub_bfd; - - /* Where to place the next stub. */ - bfd_byte *location; - - /* Current offset in the stub section. */ - unsigned int offset; - -}; - -/* Hash table for argument location information. */ - -struct elf32_hppa_args_hash_entry -{ - /* Base hash table entry structure. */ - struct bfd_hash_entry root; - - /* The argument location bits for this entry. */ - int arg_bits; -}; - -struct elf32_hppa_args_hash_table -{ - /* The hash table itself. */ - struct bfd_hash_table root; -}; - -struct elf32_hppa_link_hash_entry -{ - struct elf_link_hash_entry root; -}; - -struct elf32_hppa_link_hash_table -{ - /* The main hash table. */ - struct elf_link_hash_table root; - - /* The stub hash table. */ - struct elf32_hppa_stub_hash_table *stub_hash_table; - - /* The argument relocation bits hash table. */ - struct elf32_hppa_args_hash_table *args_hash_table; - - /* A count of the number of output symbols. */ - unsigned int output_symbol_count; - - /* Stuff so we can handle DP relative relocations. */ - long global_value; - int global_sym_defined; -}; - -/* FIXME. */ -#define ARGUMENTS 0 -#define RETURN_VALUE 1 - -/* The various argument relocations that may be performed. */ -typedef enum -{ - /* No relocation. */ - NO, - /* Relocate 32 bits from GR to FP register. */ - GF, - /* Relocate 64 bits from a GR pair to FP pair. */ - GD, - /* Relocate 32 bits from FP to GR. */ - FG, - /* Relocate 64 bits from FP pair to GR pair. */ - DG, -} arg_reloc_type; - -/* What is being relocated (eg which argument or the return value). */ -typedef enum -{ - ARG0, ARG1, ARG2, ARG3, RET, -} arg_reloc_location; - - -/* ELF32/HPPA relocation support - - This file contains ELF32/HPPA relocation support as specified - in the Stratus FTX/Golf Object File Format (SED-1762) dated - February 1994. */ - -#include "elf32-hppa.h" -#include "hppa_stubs.h" - -static bfd_reloc_status_type hppa_elf_reloc - PARAMS ((bfd *, arelent *, asymbol *, PTR, asection *, bfd *, char **)); - -static unsigned long hppa_elf_relocate_insn - PARAMS ((bfd *, asection *, unsigned long, unsigned long, long, - long, unsigned long, unsigned long, unsigned long)); - -static bfd_reloc_status_type hppa_elf_reloc - PARAMS ((bfd *, arelent *, asymbol *, PTR, asection *, bfd*, char **)); - -static reloc_howto_type * elf_hppa_reloc_type_lookup - PARAMS ((bfd *, bfd_reloc_code_real_type)); - -static boolean elf32_hppa_set_section_contents - PARAMS ((bfd *, sec_ptr, PTR, file_ptr, bfd_size_type)); - -static void elf_info_to_howto - PARAMS ((bfd *, arelent *, Elf32_Internal_Rela *)); - -static boolean elf32_hppa_backend_symbol_table_processing - PARAMS ((bfd *, elf_symbol_type *, unsigned int)); - -static void elf32_hppa_backend_begin_write_processing - PARAMS ((bfd *, struct bfd_link_info *)); - -static void elf32_hppa_backend_final_write_processing - PARAMS ((bfd *, boolean)); - -static void add_entry_to_symext_chain - PARAMS ((bfd *, unsigned int, unsigned int, symext_chainS **, - symext_chainS **)); - -static void -elf_hppa_tc_make_sections PARAMS ((bfd *, symext_chainS *)); - -static boolean hppa_elf_is_local_label PARAMS ((bfd *, asymbol *)); - -static boolean elf32_hppa_add_symbol_hook - PARAMS ((bfd *, struct bfd_link_info *, const Elf_Internal_Sym *, - const char **, flagword *, asection **, bfd_vma *)); - -static bfd_reloc_status_type elf32_hppa_bfd_final_link_relocate - PARAMS ((reloc_howto_type *, bfd *, bfd *, asection *, - bfd_byte *, bfd_vma, bfd_vma, bfd_vma, struct bfd_link_info *, - asection *, const char *, int)); - -static struct bfd_link_hash_table *elf32_hppa_link_hash_table_create - PARAMS ((bfd *)); - -static struct bfd_hash_entry * -elf32_hppa_stub_hash_newfunc - PARAMS ((struct bfd_hash_entry *, struct bfd_hash_table *, const char *)); - -static struct bfd_hash_entry * -elf32_hppa_args_hash_newfunc - PARAMS ((struct bfd_hash_entry *, struct bfd_hash_table *, const char *)); - -static boolean -elf32_hppa_relocate_section - PARAMS ((bfd *, struct bfd_link_info *, bfd *, asection *, - bfd_byte *, Elf_Internal_Rela *, Elf_Internal_Sym *, asection **)); - -static boolean -elf32_hppa_stub_hash_table_init - PARAMS ((struct elf32_hppa_stub_hash_table *, bfd *, - struct bfd_hash_entry *(*) PARAMS ((struct bfd_hash_entry *, - struct bfd_hash_table *, - const char *)))); - -static boolean -elf32_hppa_build_one_stub PARAMS ((struct bfd_hash_entry *, PTR)); - -static boolean -elf32_hppa_read_symext_info - PARAMS ((bfd *, Elf_Internal_Shdr *, struct elf32_hppa_args_hash_table *, - Elf_Internal_Sym *)); - -static unsigned int elf32_hppa_size_of_stub - PARAMS ((unsigned int, unsigned int, bfd_vma, bfd_vma, const char *)); - -static boolean elf32_hppa_arg_reloc_needed - PARAMS ((unsigned int, unsigned int, arg_reloc_type [])); - -static void elf32_hppa_name_of_stub - PARAMS ((unsigned int, unsigned int, bfd_vma, bfd_vma, char *)); - -static boolean elf32_hppa_size_symext PARAMS ((struct bfd_hash_entry *, PTR)); - -static boolean elf32_hppa_link_output_symbol_hook - PARAMS ((bfd *, struct bfd_link_info *, const char *, - Elf_Internal_Sym *, asection *)); - -/* ELF/PA relocation howto entries. */ - -static reloc_howto_type elf_hppa_howto_table[ELF_HOWTO_TABLE_SIZE] = -{ - {R_PARISC_NONE, 0, 0, 0, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_PARISC_NONE"}, - {R_PARISC_DIR32, 0, 0, 32, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_PARISC_DIR32"}, - {R_PARISC_DIR21L, 0, 0, 21, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_PARISC_DIR21L"}, - {R_PARISC_DIR17R, 0, 0, 17, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_PARISC_DIR17R"}, - {R_PARISC_DIR17F, 0, 0, 17, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_PARISC_DIR17F"}, - {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_PARISC_UNIMPLEMENTED"}, - {R_PARISC_DIR14R, 0, 0, 14, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_PARISC_DIR14R"}, - {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_PARISC_UNIMPLEMENTED"}, - - {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_PARISC_UNIMPLEMENTED"}, - {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_PARISC_UNIMPLEMENTED"}, - {R_PARISC_PCREL21L, 0, 0, 21, true, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_PARISC_PCREL21L"}, - {R_PARISC_PCREL17R, 0, 0, 17, true, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_PARISC_PCREL17R"}, - {R_PARISC_PCREL17F, 0, 0, 17, true, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_PARISC_PCREL17F"}, - {R_PARISC_PCREL17C, 0, 0, 17, true, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_PARISC_PCREL17C"}, - {R_PARISC_PCREL14R, 0, 0, 14, true, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_PARISC_PCREL14R"}, - {R_PARISC_PCREL14F, 0, 0, 14, true, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_PARISC_PCREL14F"}, - - {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_PARISC_UNIMPLEMENTED"}, - {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_PARISC_UNIMPLEMENTED"}, - {R_PARISC_DPREL21L, 0, 0, 21, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_PARISC_DPREL21L"}, - {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_PARISC_UNIMPLEMENTED"}, - {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_PARISC_UNIMPLEMENTED"}, - {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_PARISC_UNIMPLEMENTED"}, - {R_PARISC_DPREL14R, 0, 0, 14, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_PARISC_DPREL14R"}, - {R_PARISC_DPREL14F, 0, 0, 14, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_PARISC_DPREL14F"}, - - {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_PARISC_UNIMPLEMENTED"}, - {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_PARISC_UNIMPLEMENTED"}, - {R_PARISC_DLTREL21L, 0, 0, 21, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_PARISC_DLTREL21L"}, - {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_PARISC_UNIMPLEMENTED"}, - {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_PARISC_UNIMPLEMENTED"}, - {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_PARISC_UNIMPLEMENTED"}, - {R_PARISC_DLTREL14R, 0, 0, 14, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_PARISC_DLTREL14R"}, - {R_PARISC_DLTREL14F, 0, 0, 14, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_PARISC_DLTREL14F"}, - - {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_PARISC_UNIMPLEMENTED"}, - {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_PARISC_UNIMPLEMENTED"}, - {R_PARISC_DLTIND21L, 0, 0, 21, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_PARISC_DLTIND21L"}, - {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_PARISC_UNIMPLEMENTED"}, - {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_PARISC_UNIMPLEMENTED"}, - {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_PARISC_UNIMPLEMENTED"}, - {R_PARISC_DLTIND14R, 0, 0, 14, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_PARISC_DLTIND14R"}, - {R_PARISC_DLTIND14F, 0, 0, 14, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_PARISC_DLTIND14F"}, - - {R_PARISC_SETBASE, 0, 0, 0, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_PARISC_SETBASE"}, - {R_PARISC_BASEREL32, 0, 0, 32, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_PARISC_BASEREL32"}, - {R_PARISC_BASEREL21L, 0, 0, 21, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_PARISC_BASEREL21L"}, - {R_PARISC_BASEREL17R, 0, 0, 17, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_PARISC_BASEREL17R"}, - {R_PARISC_BASEREL17F, 0, 0, 17, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_PARISC_BASEREL17F"}, - {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_PARISC_UNIMPLEMENTED"}, - {R_PARISC_BASEREL14R, 0, 0, 14, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_PARISC_BASEREL14R"}, - {R_PARISC_BASEREL14F, 0, 0, 14, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_PARISC_BASEREL14F"}, - - {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_PARISC_UNIMPLEMENTED"}, - {R_PARISC_TEXTREL32, 0, 0, 32, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_PARISC_TEXTREL32"}, - {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_PARISC_UNIMPLEMENTED"}, - {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_PARISC_UNIMPLEMENTED"}, - {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_PARISC_UNIMPLEMENTED"}, - {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_PARISC_UNIMPLEMENTED"}, - {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_PARISC_UNIMPLEMENTED"}, - {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_PARISC_UNIMPLEMENTED"}, - - {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_PARISC_UNIMPLEMENTED"}, - {R_PARISC_DATAREL32, 0, 0, 32, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_PARISC_UNIMPLEMENTED"}, - {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_PARISC_UNIMPLEMENTED"}, - {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_PARISC_UNIMPLEMENTED"}, - {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_PARISC_UNIMPLEMENTED"}, - {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_PARISC_UNIMPLEMENTED"}, - {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_PARISC_UNIMPLEMENTED"}, - {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_PARISC_UNIMPLEMENTED"}, - - - {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_PARISC_UNIMPLEMENTED"}, - {R_PARISC_PLABEL32, 0, 0, 32, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_PARISC_PLABEL32"}, - {R_PARISC_PLABEL21L, 0, 0, 21, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_PARISC_PLABEL21L"}, - {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_PARISC_UNIMPLEMENTED"}, - {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_PARISC_UNIMPLEMENTED"}, - {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_PARISC_UNIMPLEMENTED"}, - {R_PARISC_PLABEL14R, 0, 0, 14, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_PARISC_PLABEL14R"}, - {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_PARISC_UNIMPLEMENTED"}, - - {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_PARISC_UNIMPLEMENTED"}, - {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_PARISC_UNIMPLEMENTED"}, - {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_PARISC_UNIMPLEMENTED"}, - {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_PARISC_UNIMPLEMENTED"}, - {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_PARISC_UNIMPLEMENTED"}, - {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_PARISC_UNIMPLEMENTED"}, - {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_PARISC_UNIMPLEMENTED"}, - {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_PARISC_UNIMPLEMENTED"}, - - {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_PARISC_UNIMPLEMENTED"}, - {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_PARISC_UNIMPLEMENTED"}, - {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_PARISC_UNIMPLEMENTED"}, - {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_PARISC_UNIMPLEMENTED"}, - {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_PARISC_UNIMPLEMENTED"}, - {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_PARISC_UNIMPLEMENTED"}, - {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_PARISC_UNIMPLEMENTED"}, - {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_PARISC_UNIMPLEMENTED"}, - {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_PARISC_UNIMPLEMENTED"}, - {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_PARISC_UNIMPLEMENTED"}, - {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_PARISC_UNIMPLEMENTED"}, - {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_PARISC_UNIMPLEMENTED"}, - {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_PARISC_UNIMPLEMENTED"}, - {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_PARISC_UNIMPLEMENTED"}, - {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_PARISC_UNIMPLEMENTED"}, - {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_PARISC_UNIMPLEMENTED"}, - - {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_PARISC_UNIMPLEMENTED"}, - {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_PARISC_UNIMPLEMENTED"}, - {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_PARISC_UNIMPLEMENTED"}, - {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_PARISC_UNIMPLEMENTED"}, - {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_PARISC_UNIMPLEMENTED"}, - {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_PARISC_UNIMPLEMENTED"}, - {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_PARISC_UNIMPLEMENTED"}, - {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_PARISC_UNIMPLEMENTED"}, - {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_PARISC_UNIMPLEMENTED"}, - {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_PARISC_UNIMPLEMENTED"}, - {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_PARISC_UNIMPLEMENTED"}, - {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_PARISC_UNIMPLEMENTED"}, - {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_PARISC_UNIMPLEMENTED"}, - {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_PARISC_UNIMPLEMENTED"}, - {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_PARISC_UNIMPLEMENTED"}, - {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_PARISC_UNIMPLEMENTED"}, - - {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_PARISC_UNIMPLEMENTED"}, - {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_PARISC_UNIMPLEMENTED"}, - {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_PARISC_UNIMPLEMENTED"}, - {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_PARISC_UNIMPLEMENTED"}, - {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_PARISC_UNIMPLEMENTED"}, - {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_PARISC_UNIMPLEMENTED"}, - {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_PARISC_UNIMPLEMENTED"}, - {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_PARISC_UNIMPLEMENTED"}, - {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_PARISC_UNIMPLEMENTED"}, - {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_PARISC_UNIMPLEMENTED"}, - {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_PARISC_UNIMPLEMENTED"}, - {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_PARISC_UNIMPLEMENTED"}, - {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_PARISC_UNIMPLEMENTED"}, - {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_PARISC_UNIMPLEMENTED"}, - {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_PARISC_UNIMPLEMENTED"}, - {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_PARISC_UNIMPLEMENTED"}, - - - {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_PARISC_UNIMPLEMENTED"}, - {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_PARISC_UNIMPLEMENTED"}, - {R_PARISC_PLTIND21L, 0, 0, 0, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_PARISC_PLTIND21L"}, - {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_PARISC_UNIMPLEMENTED"}, - {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_PARISC_UNIMPLEMENTED"}, - {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_PARISC_UNIMPLEMENTED"}, - {R_PARISC_PLTIND14R, 0, 0, 0, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_PARISC_PLTIND14R"}, - {R_PARISC_PLTIND14F, 0, 0, 0, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_PARISC_PLTIND14F"}, - - - {R_PARISC_COPY, 0, 0, 0, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_PARISC_COPY"}, - {R_PARISC_GLOB_DAT, 0, 0, 0, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_PARISC_GLOB_DAT"}, - {R_PARISC_JMP_SLOT, 0, 0, 0, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_PARISC_JMP_SLOT"}, - {R_PARISC_RELATIVE, 0, 0, 0, false, 0, complain_overflow_bitfield, hppa_elf_reloc, "R_PARISC_RELATIVE"}, - - {R_PARISC_UNIMPLEMENTED, 0, 0, 0, false, 0, complain_overflow_dont, NULL, "R_PARISC_UNIMPLEMENTED"}, -}; - -/* Where (what register type) is an argument comming from? */ -typedef enum -{ - AR_NO, - AR_GR, - AR_FR, - AR_FU, - AR_FPDBL1, - AR_FPDBL2, -} arg_location; - -/* Horizontal represents the callee's argument location information, - vertical represents caller's argument location information. Value at a - particular X,Y location represents what (if any) argument relocation - needs to be performed to make caller and callee agree. */ - -static CONST arg_reloc_type arg_mismatches[6][6] = -{ - {NO, NO, NO, NO, NO, NO}, - {NO, NO, GF, NO, GD, NO}, - {NO, FG, NO, NO, NO, NO}, - {NO, NO, NO, NO, NO, NO}, - {NO, DG, NO, NO, NO, NO}, - {NO, DG, NO, NO, NO, NO}, -}; - -/* Likewise, but reversed for the return value. */ -static CONST arg_reloc_type ret_mismatches[6][6] = -{ - {NO, NO, NO, NO, NO, NO}, - {NO, NO, FG, NO, DG, NO}, - {NO, GF, NO, NO, NO, NO}, - {NO, NO, NO, NO, NO, NO}, - {NO, GD, NO, NO, NO, NO}, - {NO, GD, NO, NO, NO, NO}, -}; - -/* Misc static crud for symbol extension records. */ -static symext_chainS *symext_rootP; -static symext_chainS *symext_lastP; -static bfd_size_type symext_chain_size; - -/* FIXME: We should be able to try this static variable! */ -static bfd_byte *symextn_contents; - - -/* For linker stub hash tables. */ -#define elf32_hppa_stub_hash_lookup(table, string, create, copy) \ - ((struct elf32_hppa_stub_hash_entry *) \ - bfd_hash_lookup (&(table)->root, (string), (create), (copy))) - -#define elf32_hppa_stub_hash_traverse(table, func, info) \ - (bfd_hash_traverse \ - (&(table)->root, \ - (boolean (*) PARAMS ((struct bfd_hash_entry *, PTR))) (func), \ - (info))) - -/* For linker args hash tables. */ -#define elf32_hppa_args_hash_lookup(table, string, create, copy) \ - ((struct elf32_hppa_args_hash_entry *) \ - bfd_hash_lookup (&(table)->root, (string), (create), (copy))) - -#define elf32_hppa_args_hash_traverse(table, func, info) \ - (bfd_hash_traverse \ - (&(table)->root, \ - (boolean (*) PARAMS ((struct bfd_hash_entry *, PTR))) (func), \ - (info))) - -#define elf32_hppa_args_hash_table_init(table, newfunc) \ - (bfd_hash_table_init \ - (&(table)->root, \ - (struct bfd_hash_entry *(*) PARAMS ((struct bfd_hash_entry *, \ - struct bfd_hash_table *, \ - const char *))) (newfunc))) - -/* For HPPA linker hash table. */ - -#define elf32_hppa_link_hash_lookup(table, string, create, copy, follow)\ - ((struct elf32_hppa_link_hash_entry *) \ - elf_link_hash_lookup (&(table)->root, (string), (create), \ - (copy), (follow))) - -#define elf32_hppa_link_hash_traverse(table, func, info) \ - (elf_link_hash_traverse \ - (&(table)->root, \ - (boolean (*) PARAMS ((struct elf_link_hash_entry *, PTR))) (func), \ - (info))) - -/* Get the PA ELF linker hash table from a link_info structure. */ - -#define elf32_hppa_hash_table(p) \ - ((struct elf32_hppa_link_hash_table *) ((p)->hash)) - - -/* Extract specific argument location bits for WHICH from - the full argument location in AR. */ -#define EXTRACT_ARBITS(ar, which) ((ar) >> (8 - ((which) * 2))) & 3 - -/* Assorted hash table functions. */ - -/* Initialize an entry in the stub hash table. */ - -static struct bfd_hash_entry * -elf32_hppa_stub_hash_newfunc (entry, table, string) - struct bfd_hash_entry *entry; - struct bfd_hash_table *table; - const char *string; -{ - struct elf32_hppa_stub_hash_entry *ret; - - ret = (struct elf32_hppa_stub_hash_entry *) entry; - - /* Allocate the structure if it has not already been allocated by a - subclass. */ - if (ret == NULL) - ret = ((struct elf32_hppa_stub_hash_entry *) - bfd_hash_allocate (table, - sizeof (struct elf32_hppa_stub_hash_entry))); - if (ret == NULL) - return NULL; - - /* Call the allocation method of the superclass. */ - ret = ((struct elf32_hppa_stub_hash_entry *) - bfd_hash_newfunc ((struct bfd_hash_entry *) ret, table, string)); - - if (ret) - { - /* Initialize the local fields. */ - ret->offset = 0; - ret->target_value = 0; - ret->target_section = NULL; - } - - return (struct bfd_hash_entry *) ret; -} - -/* Initialize a stub hash table. */ - -static boolean -elf32_hppa_stub_hash_table_init (table, stub_bfd, newfunc) - struct elf32_hppa_stub_hash_table *table; - bfd *stub_bfd; - struct bfd_hash_entry *(*newfunc) PARAMS ((struct bfd_hash_entry *, - struct bfd_hash_table *, - const char *)); -{ - table->offset = 0; - table->location = 0; - table->stub_bfd = stub_bfd; - return (bfd_hash_table_init (&table->root, newfunc)); -} - -/* Initialize an entry in the argument location hash table. */ - -static struct bfd_hash_entry * -elf32_hppa_args_hash_newfunc (entry, table, string) - struct bfd_hash_entry *entry; - struct bfd_hash_table *table; - const char *string; -{ - struct elf32_hppa_args_hash_entry *ret; - - ret = (struct elf32_hppa_args_hash_entry *) entry; - - /* Allocate the structure if it has not already been allocated by a - subclass. */ - if (ret == NULL) - ret = ((struct elf32_hppa_args_hash_entry *) - bfd_hash_allocate (table, - sizeof (struct elf32_hppa_args_hash_entry))); - if (ret == NULL) - return NULL; - - /* Call the allocation method of the superclass. */ - ret = ((struct elf32_hppa_args_hash_entry *) - bfd_hash_newfunc ((struct bfd_hash_entry *) ret, table, string)); - - /* Initialize the local fields. */ - if (ret) - ret->arg_bits = 0; - - return (struct bfd_hash_entry *) ret; -} - -/* Create the derived linker hash table. The PA ELF port uses the derived - hash table to keep information specific to the PA ELF linker (without - using static variables). */ - -static struct bfd_link_hash_table * -elf32_hppa_link_hash_table_create (abfd) - bfd *abfd; -{ - struct elf32_hppa_link_hash_table *ret; - - ret = ((struct elf32_hppa_link_hash_table *) - bfd_alloc (abfd, sizeof (struct elf32_hppa_link_hash_table))); - if (ret == NULL) - return NULL; - if (!_bfd_elf_link_hash_table_init (&ret->root, abfd, - _bfd_elf_link_hash_newfunc)) - { - bfd_release (abfd, ret); - return NULL; - } - ret->stub_hash_table = NULL; - ret->args_hash_table = NULL; - ret->output_symbol_count = 0; - ret->global_value = 0; - ret->global_sym_defined = 0; - - return &ret->root.root; -} - -/* Relocate the given INSN given the various input parameters. - - FIXME: endianness and sizeof (long) issues abound here. */ - -static unsigned long -hppa_elf_relocate_insn (abfd, input_sect, insn, address, sym_value, - r_addend, r_format, r_field, pcrel) - bfd *abfd; - asection *input_sect; - unsigned long insn; - unsigned long address; - long sym_value; - long r_addend; - unsigned long r_format; - unsigned long r_field; - unsigned long pcrel; -{ - unsigned char opcode = get_opcode (insn); - long constant_value; - - switch (opcode) - { - case LDO: - case LDB: - case LDH: - case LDW: - case LDWM: - case STB: - case STH: - case STW: - case STWM: - case COMICLR: - case SUBI: - case ADDIT: - case ADDI: - case LDIL: - case ADDIL: - constant_value = HPPA_R_CONSTANT (r_addend); - - if (pcrel) - sym_value -= address; - - sym_value = hppa_field_adjust (sym_value, constant_value, r_field); - return hppa_rebuild_insn (abfd, insn, sym_value, r_format); - - case BL: - case BE: - case BLE: - /* XXX computing constant_value is not needed??? */ - constant_value = assemble_17 ((insn & 0x001f0000) >> 16, - (insn & 0x00001ffc) >> 2, - insn & 1); - - constant_value = (constant_value << 15) >> 15; - if (pcrel) - { - sym_value -= - address + input_sect->output_offset - + input_sect->output_section->vma; - sym_value = hppa_field_adjust (sym_value, -8, r_field); - } - else - sym_value = hppa_field_adjust (sym_value, constant_value, r_field); - - return hppa_rebuild_insn (abfd, insn, sym_value >> 2, r_format); - - default: - if (opcode == 0) - { - constant_value = HPPA_R_CONSTANT (r_addend); - - if (pcrel) - sym_value -= address; - - return hppa_field_adjust (sym_value, constant_value, r_field); - } - else - abort (); - } -} - -/* Relocate an HPPA ELF section. */ - -static boolean -elf32_hppa_relocate_section (output_bfd, info, input_bfd, input_section, - contents, relocs, local_syms, local_sections) - bfd *output_bfd; - struct bfd_link_info *info; - bfd *input_bfd; - asection *input_section; - bfd_byte *contents; - Elf_Internal_Rela *relocs; - Elf_Internal_Sym *local_syms; - asection **local_sections; -{ - Elf_Internal_Shdr *symtab_hdr; - Elf_Internal_Rela *rel; - Elf_Internal_Rela *relend; - - symtab_hdr = &elf_tdata (input_bfd)->symtab_hdr; - - rel = relocs; - relend = relocs + input_section->reloc_count; - for (; rel < relend; rel++) - { - int r_type; - reloc_howto_type *howto; - unsigned long r_symndx; - struct elf_link_hash_entry *h; - Elf_Internal_Sym *sym; - asection *sym_sec; - bfd_vma relocation; - bfd_reloc_status_type r; - const char *sym_name; - - r_type = ELF32_R_TYPE (rel->r_info); - if (r_type < 0 || r_type >= (int) R_PARISC_UNIMPLEMENTED) - { - bfd_set_error (bfd_error_bad_value); - return false; - } - howto = elf_hppa_howto_table + r_type; - - r_symndx = ELF32_R_SYM (rel->r_info); - - if (info->relocateable) - { - /* This is a relocateable link. We don't have to change - anything, unless the reloc is against a section symbol, - in which case we have to adjust according to where the - section symbol winds up in the output section. */ - if (r_symndx < symtab_hdr->sh_info) - { - sym = local_syms + r_symndx; - if (ELF_ST_TYPE (sym->st_info) == STT_SECTION) - { - sym_sec = local_sections[r_symndx]; - rel->r_addend += sym_sec->output_offset; - } - } - - continue; - } - - /* This is a final link. */ - h = NULL; - sym = NULL; - sym_sec = NULL; - if (r_symndx < symtab_hdr->sh_info) - { - sym = local_syms + r_symndx; - sym_sec = local_sections[r_symndx]; - relocation = ((ELF_ST_TYPE (sym->st_info) == STT_SECTION - ? 0 : sym->st_value) - + sym_sec->output_offset - + sym_sec->output_section->vma); - } - else - { - long indx; - - indx = r_symndx - symtab_hdr->sh_info; - h = elf_sym_hashes (input_bfd)[indx]; - while (h->root.type == bfd_link_hash_indirect - || h->root.type == bfd_link_hash_warning) - h = (struct elf_link_hash_entry *) h->root.u.i.link; - if (h->root.type == bfd_link_hash_defined - || h->root.type == bfd_link_hash_defweak) - { - sym_sec = h->root.u.def.section; - relocation = (h->root.u.def.value - + sym_sec->output_offset - + sym_sec->output_section->vma); - } - else if (h->root.type == bfd_link_hash_undefweak) - relocation = 0; - else - { - if (!((*info->callbacks->undefined_symbol) - (info, h->root.root.string, input_bfd, - input_section, rel->r_offset))) - return false; - break; - } - } - - if (h != NULL) - sym_name = h->root.root.string; - else - { - sym_name = bfd_elf_string_from_elf_section (input_bfd, - symtab_hdr->sh_link, - sym->st_name); - if (sym_name == NULL) - return false; - if (*sym_name == '\0') - sym_name = bfd_section_name (input_bfd, sym_sec); - } - - /* If args_hash_table is NULL, then we have encountered some - kind of link error (ex. undefined symbols). Do not try to - apply any relocations, continue the loop so we can notify - the user of several errors in a single attempted link. */ - if (elf32_hppa_hash_table (info)->args_hash_table == NULL) - continue; - - r = elf32_hppa_bfd_final_link_relocate (howto, input_bfd, output_bfd, - input_section, contents, - rel->r_offset, relocation, - rel->r_addend, info, sym_sec, - sym_name, h == NULL); - - if (r != bfd_reloc_ok) - { - switch (r) - { - /* This can happen for DP relative relocs if $global$ is - undefined. This is a panic situation so we don't try - to continue. */ - case bfd_reloc_undefined: - case bfd_reloc_notsupported: - if (!((*info->callbacks->undefined_symbol) - (info, "$global$", input_bfd, - input_section, rel->r_offset))) - return false; - return false; - case bfd_reloc_dangerous: - { - /* We use this return value to indicate that we performed - a "dangerous" relocation. This doesn't mean we did - the wrong thing, it just means there may be some cleanup - that needs to be done here. - - In particular we had to swap the last call insn and its - delay slot. If the delay slot insn needed a relocation, - then we'll need to adjust the next relocation entry's - offset to account for the fact that the insn moved. - - This hair wouldn't be necessary if we inserted stubs - between procedures and used a "bl" to get to the stub. */ - if (rel != relend) - { - Elf_Internal_Rela *next_rel = rel + 1; - - if (rel->r_offset + 4 == next_rel->r_offset) - next_rel->r_offset -= 4; - } - break; - } - default: - case bfd_reloc_outofrange: - case bfd_reloc_overflow: - { - if (!((*info->callbacks->reloc_overflow) - (info, sym_name, howto->name, (bfd_vma) 0, - input_bfd, input_section, rel->r_offset))) - return false; - } - break; - } - } - } - - return true; -} - -/* Return one (or more) BFD relocations which implement the base - relocation with modifications based on format and field. */ - -elf32_hppa_reloc_type ** -hppa_elf_gen_reloc_type (abfd, base_type, format, field, ignore) - bfd *abfd; - elf32_hppa_reloc_type base_type; - int format; - int field; - int ignore; -{ - elf32_hppa_reloc_type *finaltype; - elf32_hppa_reloc_type **final_types; - - /* Allocate slots for the BFD relocation. */ - final_types = (elf32_hppa_reloc_type **) - bfd_alloc_by_size_t (abfd, sizeof (elf32_hppa_reloc_type *) * 2); - if (final_types == NULL) - return NULL; - - /* Allocate space for the relocation itself. */ - finaltype = (elf32_hppa_reloc_type *) - bfd_alloc_by_size_t (abfd, sizeof (elf32_hppa_reloc_type)); - if (finaltype == NULL) - return NULL; - - /* Some reasonable defaults. */ - final_types[0] = finaltype; - final_types[1] = NULL; - -#define final_type finaltype[0] - - final_type = base_type; - - /* Just a tangle of nested switch statements to deal with the braindamage - that a different field selector means a completely different relocation - for PA ELF. */ - switch (base_type) - { - case R_HPPA: - case R_HPPA_ABS_CALL: - switch (format) - { - case 14: - switch (field) - { - case e_rsel: - case e_rrsel: - final_type = R_PARISC_DIR14R; - break; - case e_rtsel: - final_type = R_PARISC_DLTREL14R; - break; - case e_tsel: - final_type = R_PARISC_DLTREL14F; - break; - case e_rpsel: - final_type = R_PARISC_PLABEL14R; - break; - default: - return NULL; - } - break; - - case 17: - switch (field) - { - case e_fsel: - final_type = R_PARISC_DIR17F; - break; - case e_rsel: - case e_rrsel: - final_type = R_PARISC_DIR17R; - break; - default: - return NULL; - } - break; - - case 21: - switch (field) - { - case e_lsel: - case e_lrsel: - final_type = R_PARISC_DIR21L; - break; - case e_ltsel: - final_type = R_PARISC_DLTREL21L; - break; - case e_lpsel: - final_type = R_PARISC_PLABEL21L; - break; - default: - return NULL; - } - break; - - case 32: - switch (field) - { - case e_fsel: - final_type = R_PARISC_DIR32; - break; - case e_psel: - final_type = R_PARISC_PLABEL32; - break; - default: - return NULL; - } - break; - - default: - return NULL; - } - break; - - - case R_HPPA_GOTOFF: - switch (format) - { - case 14: - switch (field) - { - case e_rsel: - case e_rrsel: - final_type = R_PARISC_DPREL14R; - break; - case e_fsel: - final_type = R_PARISC_DPREL14F; - break; - default: - return NULL; - } - break; - - case 21: - switch (field) - { - case e_lrsel: - case e_lsel: - final_type = R_PARISC_DPREL21L; - break; - default: - return NULL; - } - break; - - default: - return NULL; - } - break; - - - case R_HPPA_PCREL_CALL: - switch (format) - { - case 14: - switch (field) - { - case e_rsel: - case e_rrsel: - final_type = R_PARISC_PCREL14R; - break; - case e_fsel: - final_type = R_PARISC_PCREL14F; - break; - default: - return NULL; - } - break; - - case 17: - switch (field) - { - case e_rsel: - case e_rrsel: - final_type = R_PARISC_PCREL17R; - break; - case e_fsel: - final_type = R_PARISC_PCREL17F; - break; - default: - return NULL; - } - break; - - case 21: - switch (field) - { - case e_lsel: - case e_lrsel: - final_type = R_PARISC_PCREL21L; - break; - default: - return NULL; - } - break; - - default: - return NULL; - } - break; - - default: - return NULL; - } - - return final_types; -} - -#undef final_type - -/* Set the contents of a particular section at a particular location. */ - -static boolean -elf32_hppa_set_section_contents (abfd, section, location, offset, count) - bfd *abfd; - sec_ptr section; - PTR location; - file_ptr offset; - bfd_size_type count; -{ - /* Ignore write requests for the symbol extension section until we've - had the chance to rebuild it ourselves. */ - if (!strcmp (section->name, ".PARISC.symextn") && !symext_chain_size) - return true; - else - return _bfd_elf_set_section_contents (abfd, section, location, - offset, count); -} - -/* Translate from an elf into field into a howto relocation pointer. */ - -static void -elf_info_to_howto (abfd, cache_ptr, dst) - bfd *abfd; - arelent *cache_ptr; - Elf32_Internal_Rela *dst; -{ - BFD_ASSERT (ELF32_R_TYPE(dst->r_info) < (unsigned int) R_PARISC_UNIMPLEMENTED); - cache_ptr->howto = &elf_hppa_howto_table[ELF32_R_TYPE (dst->r_info)]; -} - - -/* Actually perform a relocation. NOTE this is (mostly) superceeded - by elf32_hppa_bfd_final_link_relocate which is called by the new - fast linker. */ - -static bfd_reloc_status_type -hppa_elf_reloc (abfd, reloc_entry, symbol_in, data, input_section, output_bfd, - error_message) - bfd *abfd; - arelent *reloc_entry; - asymbol *symbol_in; - PTR data; - asection *input_section; - bfd *output_bfd; - char **error_message; -{ - /* It is no longer valid to call hppa_elf_reloc when creating - a final executable. */ - if (output_bfd) - { - reloc_entry->address += input_section->output_offset; - - /* Work around lossage in generic elf code to write relocations. - (maps different section symbols into the same symbol index). */ - if ((symbol_in->flags & BSF_SECTION_SYM) - && symbol_in->section) - reloc_entry->addend += symbol_in->section->output_offset; - return bfd_reloc_ok; - } - else - { - *error_message = (char *) "Unsupported call to hppa_elf_reloc"; - return bfd_reloc_notsupported; - } -} - -/* Actually perform a relocation as part of a final link. This can get - rather hairy when linker stubs are needed. */ - -static bfd_reloc_status_type -elf32_hppa_bfd_final_link_relocate (howto, input_bfd, output_bfd, - input_section, contents, offset, value, - addend, info, sym_sec, sym_name, is_local) - reloc_howto_type *howto; - bfd *input_bfd; - bfd *output_bfd; - asection *input_section; - bfd_byte *contents; - bfd_vma offset; - bfd_vma value; - bfd_vma addend; - struct bfd_link_info *info; - asection *sym_sec; - const char *sym_name; - int is_local; -{ - unsigned long insn; - unsigned long r_type = howto->type; - unsigned long r_format = howto->bitsize; - unsigned long r_field = e_fsel; - bfd_byte *hit_data = contents + offset; - boolean r_pcrel = howto->pc_relative; - - insn = bfd_get_32 (input_bfd, hit_data); - - /* Make sure we have a value for $global$. FIXME isn't this effectively - just like the gp pointer on MIPS? Can we use those routines for this - purpose? */ - if (!elf32_hppa_hash_table (info)->global_sym_defined) - { - struct elf_link_hash_entry *h; - asection *sec; - - h = elf_link_hash_lookup (elf_hash_table (info), "$global$", false, - false, false); - - /* If there isn't a $global$, then we're in deep trouble. */ - if (h == NULL) - return bfd_reloc_notsupported; - - /* If $global$ isn't a defined symbol, then we're still in deep - trouble. */ - if (h->root.type != bfd_link_hash_defined) - return bfd_reloc_undefined; - - sec = h->root.u.def.section; - elf32_hppa_hash_table (info)->global_value = (h->root.u.def.value - + sec->output_section->vma - + sec->output_offset); - elf32_hppa_hash_table (info)->global_sym_defined = 1; - } - - switch (r_type) - { - case R_PARISC_NONE: - break; - - case R_PARISC_DIR32: - case R_PARISC_DIR17F: - case R_PARISC_PCREL17C: - r_field = e_fsel; - goto do_basic_type_1; - case R_PARISC_DIR21L: - case R_PARISC_PCREL21L: - r_field = e_lrsel; - goto do_basic_type_1; - case R_PARISC_DIR17R: - case R_PARISC_PCREL17R: - case R_PARISC_DIR14R: - case R_PARISC_PCREL14R: - r_field = e_rrsel; - goto do_basic_type_1; - - /* For all the DP relative relocations, we need to examine the symbol's - section. If it's a code section, then "data pointer relative" makes - no sense. In that case we don't adjust the "value", and for 21 bit - addil instructions, we change the source addend register from %dp to - %r0. */ - case R_PARISC_DPREL21L: - r_field = e_lrsel; - if (sym_sec->flags & SEC_CODE) - { - if ((insn & 0xfc000000) >> 26 == 0xa - && (insn & 0x03e00000) >> 21 == 0x1b) - insn &= ~0x03e00000; - } - else - value -= elf32_hppa_hash_table (info)->global_value; - goto do_basic_type_1; - case R_PARISC_DPREL14R: - r_field = e_rrsel; - if ((sym_sec->flags & SEC_CODE) == 0) - value -= elf32_hppa_hash_table (info)->global_value; - goto do_basic_type_1; - case R_PARISC_DPREL14F: - r_field = e_fsel; - if ((sym_sec->flags & SEC_CODE) == 0) - value -= elf32_hppa_hash_table (info)->global_value; - goto do_basic_type_1; - - /* These cases are separate as they may involve a lot more work - to deal with linker stubs. */ - case R_PARISC_PLABEL32: - case R_PARISC_PLABEL21L: - case R_PARISC_PLABEL14R: - case R_PARISC_PCREL17F: - { - bfd_vma location; - unsigned int len, caller_args, callee_args; - arg_reloc_type arg_reloc_types[5]; - struct elf32_hppa_args_hash_table *args_hash_table; - struct elf32_hppa_args_hash_entry *args_hash; - char *new_name, *stub_name; - - /* Get the field selector right. We'll need it in a minute. */ - if (r_type == R_PARISC_PCREL17F - || r_type == R_PARISC_PLABEL32) - r_field = e_fsel; - else if (r_type == R_PARISC_PLABEL21L) - r_field = e_lrsel; - else if (r_type == R_PARISC_PLABEL14R) - r_field = e_rrsel; - - /* Find out where we are and where we're going. */ - location = (offset + - input_section->output_offset + - input_section->output_section->vma); - - /* Now look for the argument relocation bits associated with the - target. */ - len = strlen (sym_name) + 1; - if (is_local) - len += 9; - new_name = bfd_malloc (len); - if (!new_name) - return bfd_reloc_notsupported; - strcpy (new_name, sym_name); - - /* Local symbols have unique IDs. */ - if (is_local) - sprintf (new_name + len - 10, "_%08x", (int)sym_sec); - - args_hash_table = elf32_hppa_hash_table (info)->args_hash_table; - - args_hash = elf32_hppa_args_hash_lookup (args_hash_table, - new_name, false, false); - if (args_hash == NULL) - callee_args = 0; - else - callee_args = args_hash->arg_bits; - - /* If this is a CALL relocation, then get the caller's bits - from the addend. Else use the magic 0x155 value for PLABELS. - - Also we don't care about the destination (value) for PLABELS. */ - if (r_type == R_PARISC_PCREL17F) - caller_args = HPPA_R_ARG_RELOC (addend); - else - { - caller_args = 0x155; - location = value; - } - - /* Any kind of linker stub needed? */ - if (((int)(value - location) > 0x3ffff) - || ((int)(value - location) < (int)0xfffc0000) - || elf32_hppa_arg_reloc_needed (caller_args, callee_args, - arg_reloc_types)) - { - struct elf32_hppa_stub_hash_table *stub_hash_table; - struct elf32_hppa_stub_hash_entry *stub_hash; - asection *stub_section; - - /* Build a name for the stub. */ - - len = strlen (new_name); - len += 23; - stub_name = bfd_malloc (len); - if (!stub_name) - return bfd_reloc_notsupported; - elf32_hppa_name_of_stub (caller_args, callee_args, - location, value, stub_name); - strcat (stub_name, new_name); - free (new_name); - - stub_hash_table = elf32_hppa_hash_table (info)->stub_hash_table; - - stub_hash - = elf32_hppa_stub_hash_lookup (stub_hash_table, stub_name, - false, false); - - /* We're done with that name. */ - free (stub_name); - - /* The stub BFD only has one section. */ - stub_section = stub_hash_table->stub_bfd->sections; - - if (stub_hash != NULL) - { - - if (r_type == R_PARISC_PCREL17F) - { - unsigned long delay_insn; - unsigned int opcode, rtn_reg, ldo_target_reg, ldo_src_reg; - - /* We'll need to peek at the next insn. */ - delay_insn = bfd_get_32 (input_bfd, hit_data + 4); - opcode = get_opcode (delay_insn); - - /* We also need to know the return register for this - call. */ - rtn_reg = (insn & 0x03e00000) >> 21; - - ldo_src_reg = (delay_insn & 0x03e00000) >> 21; - ldo_target_reg = (delay_insn & 0x001f0000) >> 16; - - /* Munge up the value and other parameters for - hppa_elf_relocate_insn. */ - - value = (stub_hash->offset - + stub_section->output_offset - + stub_section->output_section->vma); - - r_format = 17; - r_field = e_fsel; - r_pcrel = 0; - addend = 0; - - /* We need to peek at the delay insn and determine if - we'll need to swap the branch and its delay insn. */ - if ((insn & 2) - || (opcode == LDO - && ldo_target_reg == rtn_reg) - || (delay_insn == 0x08000240)) - { - /* No need to swap the branch and its delay slot, but - we do need to make sure to jump past the return - pointer update in the stub. */ - value += 4; - - /* If the delay insn does a return pointer adjustment, - then we have to make sure it stays valid. */ - if (opcode == LDO - && ldo_target_reg == rtn_reg) - { - delay_insn &= 0xfc00ffff; - delay_insn |= ((31 << 21) | (31 << 16)); - bfd_put_32 (input_bfd, delay_insn, hit_data + 4); - } - /* Use a BLE to reach the stub. */ - insn = BLE_SR4_R0; - } - else - { - /* Wonderful, we have to swap the call insn and its - delay slot. */ - bfd_put_32 (input_bfd, delay_insn, hit_data); - /* Use a BLE,n to reach the stub. */ - insn = (BLE_SR4_R0 | 0x2); - bfd_put_32 (input_bfd, insn, hit_data + 4); - insn = hppa_elf_relocate_insn (input_bfd, - input_section, - insn, offset + 4, - value, addend, - r_format, r_field, - r_pcrel); - /* Update the instruction word. */ - bfd_put_32 (input_bfd, insn, hit_data + 4); - return bfd_reloc_dangerous; - } - } - else - { - /* PLABEL stuff is easy. */ - - value = (stub_hash->offset - + stub_section->output_offset - + stub_section->output_section->vma); - /* We don't need the RP adjustment for PLABELs. */ - value += 4; - if (r_type == R_PARISC_PLABEL32) - r_format = 32; - else if (r_type == R_PARISC_PLABEL21L) - r_format = 21; - else if (r_type == R_PARISC_PLABEL14R) - r_format = 14; - - r_pcrel = 0; - addend = 0; - } - } - else - return bfd_reloc_notsupported; - } - goto do_basic_type_1; - } - -do_basic_type_1: - insn = hppa_elf_relocate_insn (input_bfd, input_section, insn, - offset, value, addend, r_format, - r_field, r_pcrel); - break; - - /* Something we don't know how to handle. */ - default: - return bfd_reloc_notsupported; - } - - /* Update the instruction word. */ - bfd_put_32 (input_bfd, insn, hit_data); - return (bfd_reloc_ok); -} - -/* Return the address of the howto table entry to perform the CODE - relocation for an ARCH machine. */ - -static reloc_howto_type * -elf_hppa_reloc_type_lookup (abfd, code) - bfd *abfd; - bfd_reloc_code_real_type code; -{ - if ((int) code < (int) R_PARISC_UNIMPLEMENTED) - { - BFD_ASSERT ((int) elf_hppa_howto_table[(int) code].type == (int) code); - return &elf_hppa_howto_table[(int) code]; - } - return NULL; -} - -/* Return true if SYM represents a local label symbol. */ - -static boolean -hppa_elf_is_local_label (abfd, sym) - bfd *abfd; - asymbol *sym; -{ - return (sym->name[0] == 'L' && sym->name[1] == '$'); -} - -/* Do any backend specific processing when beginning to write an object - file. For PA ELF we need to determine the size of the symbol extension - section *before* any other output processing happens. */ - -static void -elf32_hppa_backend_begin_write_processing (abfd, info) - bfd *abfd; - struct bfd_link_info *info; -{ - unsigned int i; - asection *symextn_sec; - - /* Size up the symbol extension section. */ - if ((abfd->outsymbols == NULL - && info == NULL) - || symext_chain_size != 0) - return; - - if (info == NULL) - { - /* We were not called from the BFD ELF linker code, so we need - to examine the output BFD's outsymbols. - - Note we can not build the symbol extensions now as the symbol - map hasn't been set up. */ - for (i = 0; i < abfd->symcount; i++) - { - elf_symbol_type *symbol = (elf_symbol_type *)abfd->outsymbols[i]; - - /* Only functions ever need an entry in the symbol extension - section. */ - if (!(symbol->symbol.flags & BSF_FUNCTION)) - continue; - - /* And only if they specify the locations of their arguments. */ - if (symbol->tc_data.hppa_arg_reloc == 0) - continue; - - /* Yup. This function symbol needs an entry. */ - symext_chain_size += 2 * ELF32_PARISC_SX_SIZE; - } - } - else if (info->relocateable == true) - { - struct elf32_hppa_args_hash_table *table; - table = elf32_hppa_hash_table (info)->args_hash_table; - - /* Determine the size of the symbol extension section. */ - elf32_hppa_args_hash_traverse (table, - elf32_hppa_size_symext, - &symext_chain_size); - } - - /* Now create the section and set its size. We'll fill in the - contents later. */ - symextn_sec = bfd_get_section_by_name (abfd, SYMEXTN_SECTION_NAME); - if (symextn_sec == NULL) - symextn_sec = bfd_make_section (abfd, SYMEXTN_SECTION_NAME); - - bfd_set_section_flags (abfd, symextn_sec, - SEC_LOAD | SEC_HAS_CONTENTS | SEC_DATA); - symextn_sec->output_section = symextn_sec; - symextn_sec->output_offset = 0; - bfd_set_section_alignment (abfd, symextn_sec, 2); - bfd_set_section_size (abfd, symextn_sec, symext_chain_size); -} - -/* Called for each entry in the args location hash table. For each - entry we bump the size pointer by 2 records (16 bytes). */ - -static boolean -elf32_hppa_size_symext (gen_entry, in_args) - struct bfd_hash_entry *gen_entry; - PTR in_args; -{ - bfd_size_type *sizep = (bfd_size_type *)in_args; - - *sizep += 2 * ELF32_PARISC_SX_SIZE; - return true; -} - -/* Backend routine called by the linker for each output symbol. - - For PA ELF we use this opportunity to add an appropriate entry - to the symbol extension chain for function symbols. */ - -static boolean -elf32_hppa_link_output_symbol_hook (abfd, info, name, sym, section) - bfd *abfd; - struct bfd_link_info *info; - const char *name; - Elf_Internal_Sym *sym; - asection *section; -{ - char *new_name; - unsigned int len, index; - struct elf32_hppa_args_hash_table *args_hash_table; - struct elf32_hppa_args_hash_entry *args_hash; - - /* If the args hash table is NULL, then we've encountered an error - of some sorts (for example, an undefined symbol). In that case - we've got nothing else to do. - - NOTE: elf_link_output_symbol will abort if we return false here! */ - if (elf32_hppa_hash_table (info)->args_hash_table == NULL) - return true; - - index = elf32_hppa_hash_table (info)->output_symbol_count++; - - /* We need to look up this symbol in the args hash table to see if - it has argument relocation bits. */ - if (ELF_ST_TYPE (sym->st_info) != STT_FUNC) - return true; - - /* We know it's a function symbol of some kind. */ - len = strlen (name) + 1; - if (ELF_ST_BIND (sym->st_info) == STB_LOCAL) - len += 9; - - new_name = bfd_malloc (len); - if (new_name == NULL) - return false; - - strcpy (new_name, name); - if (ELF_ST_BIND (sym->st_info) == STB_LOCAL) - sprintf (new_name + len - 10, "_%08x", (int)section); - - /* Now that we have the unique name, we can look it up in the - args hash table. */ - args_hash_table = elf32_hppa_hash_table (info)->args_hash_table; - args_hash = elf32_hppa_args_hash_lookup (args_hash_table, new_name, - false, false); - free (new_name); - if (args_hash == NULL) - return true; - - /* We know this symbol has arg reloc bits. */ - add_entry_to_symext_chain (abfd, args_hash->arg_bits, - index, &symext_rootP, &symext_lastP); - return true; -} - -/* Perform any processing needed late in the object file writing process. - For PA ELF we build and set the contents of the symbol extension - section. */ - -static void -elf32_hppa_backend_final_write_processing (abfd, linker) - bfd *abfd; - boolean linker; -{ - asection *symextn_sec; - unsigned int i; - - /* Now build the symbol extension section. */ - if (symext_chain_size == 0) - return; - - if (! linker) - { - /* We were not called from the backend linker, so we still need - to build the symbol extension chain. - - Look at each symbol, adding the appropriate information to the - symbol extension section list as necessary. */ - for (i = 0; i < abfd->symcount; i++) - { - elf_symbol_type *symbol = (elf_symbol_type *) abfd->outsymbols[i]; - - /* Only functions ever need an entry in the symbol extension - section. */ - if (!(symbol->symbol.flags & BSF_FUNCTION)) - continue; - - /* And only if they specify the locations of their arguments. */ - if (symbol->tc_data.hppa_arg_reloc == 0) - continue; - - /* Add this symbol's information to the chain. */ - add_entry_to_symext_chain (abfd, symbol->tc_data.hppa_arg_reloc, - symbol->symbol.udata.i, &symext_rootP, - &symext_lastP); - } - } - - /* Now fill in the contents of the symbol extension section. */ - elf_hppa_tc_make_sections (abfd, symext_rootP); - - /* And attach that as the section's contents. */ - symextn_sec = bfd_get_section_by_name (abfd, SYMEXTN_SECTION_NAME); - if (symextn_sec == (asection *) 0) - abort(); - - symextn_sec->contents = (void *)symextn_contents; - - bfd_set_section_contents (abfd, symextn_sec, symextn_sec->contents, - symextn_sec->output_offset, symextn_sec->_raw_size); -} - -/* Update the symbol extention chain to include the symbol pointed to - by SYMBOLP if SYMBOLP is a function symbol. Used internally and by GAS. */ - -static void -add_entry_to_symext_chain (abfd, arg_reloc, sym_idx, symext_root, symext_last) - bfd *abfd; - unsigned int arg_reloc; - unsigned int sym_idx; - symext_chainS **symext_root; - symext_chainS **symext_last; -{ - symext_chainS *symextP; - - /* Allocate memory and initialize this entry. */ - symextP = (symext_chainS *) bfd_alloc (abfd, sizeof (symext_chainS) * 2); - if (!symextP) - abort(); /* FIXME */ - - symextP[0].entry = ELF32_PARISC_SX_WORD (PARISC_SXT_SYMNDX, sym_idx); - symextP[0].next = &symextP[1]; - - symextP[1].entry = ELF32_PARISC_SX_WORD (PARISC_SXT_ARG_RELOC, arg_reloc); - symextP[1].next = NULL; - - /* Now update the chain itself so it can be walked later to build - the symbol extension section. */ - if (*symext_root == NULL) - { - *symext_root = &symextP[0]; - *symext_last = &symextP[1]; - } - else - { - (*symext_last)->next = &symextP[0]; - *symext_last = &symextP[1]; - } -} - -/* Build the symbol extension section. */ - -static void -elf_hppa_tc_make_sections (abfd, symext_root) - bfd *abfd; - symext_chainS *symext_root; -{ - symext_chainS *symextP; - unsigned int i; - asection *symextn_sec; - - symextn_sec = bfd_get_section_by_name (abfd, SYMEXTN_SECTION_NAME); - - /* Grab some memory for the contents of the symbol extension section - itself. */ - symextn_contents = (bfd_byte *) bfd_zalloc (abfd, - symextn_sec->_raw_size); - if (!symextn_contents) - abort(); /* FIXME */ - - /* Fill in the contents of the symbol extension chain. */ - for (i = 0, symextP = symext_root; symextP; symextP = symextP->next, ++i) - ELF32_PARISC_SX_PUT (abfd, (bfd_vma) symextP->entry, - symextn_contents + i * ELF32_PARISC_SX_SIZE); - - return; -} - -/* Do some PA ELF specific work after reading in the symbol table. - In particular attach the argument relocation from the - symbol extension section to the appropriate symbols. */ - -static boolean -elf32_hppa_backend_symbol_table_processing (abfd, esyms,symcnt) - bfd *abfd; - elf_symbol_type *esyms; - unsigned int symcnt; -{ - Elf32_Internal_Shdr *symextn_hdr = - bfd_elf_find_section (abfd, SYMEXTN_SECTION_NAME); - unsigned int i, current_sym_idx = 0; - - /* If no symbol extension existed, then all symbol extension information - is assumed to be zero. */ - if (symextn_hdr == NULL) - { - for (i = 0; i < symcnt; i++) - esyms[i].tc_data.hppa_arg_reloc = 0; - return (true); - } - - /* FIXME: Why not use bfd_get_section_contents here? Also should give - memory back when we're done. */ - /* Allocate a buffer of the appropriate size for the symextn section. */ - symextn_hdr->contents = bfd_zalloc(abfd,symextn_hdr->sh_size); - if (!symextn_hdr->contents) - return false; - - /* Read in the symextn section. */ - if (bfd_seek (abfd, symextn_hdr->sh_offset, SEEK_SET) == -1) - return false; - if (bfd_read ((PTR) symextn_hdr->contents, 1, symextn_hdr->sh_size, abfd) - != symextn_hdr->sh_size) - return false; - - /* Parse entries in the symbol extension section, updating the symtab - entries as we go */ - for (i = 0; i < symextn_hdr->sh_size / ELF32_PARISC_SX_SIZE; i++) - { - symext_entryS se = - ELF32_PARISC_SX_GET (abfd, - ((unsigned char *)symextn_hdr->contents - + i * ELF32_PARISC_SX_SIZE)); - unsigned int se_value = ELF32_PARISC_SX_VAL (se); - unsigned int se_type = ELF32_PARISC_SX_TYPE (se); - - switch (se_type) - { - case PARISC_SXT_NULL: - break; - - case PARISC_SXT_SYMNDX: - if (se_value >= symcnt) - { - bfd_set_error (bfd_error_bad_value); - return (false); - } - current_sym_idx = se_value - 1; - break; - - case PARISC_SXT_ARG_RELOC: - esyms[current_sym_idx].tc_data.hppa_arg_reloc = se_value; - break; - - default: - bfd_set_error (bfd_error_bad_value); - return (false); - } - } - return (true); -} - -/* Read and attach the symbol extension information for the symbols - in INPUT_BFD to the argument location hash table. Handle locals - if DO_LOCALS is true; likewise for globals when DO_GLOBALS is true. */ - -static boolean -elf32_hppa_read_symext_info (input_bfd, symtab_hdr, args_hash_table, local_syms) - bfd *input_bfd; - Elf_Internal_Shdr *symtab_hdr; - struct elf32_hppa_args_hash_table *args_hash_table; - Elf_Internal_Sym *local_syms; -{ - asection *symextn_sec; - bfd_byte *contents; - unsigned int i, n_entries, current_index = 0; - - /* Get the symbol extension section for this BFD. If no section exists - then there's nothing to do. Likewise if the section exists, but - has no contents. */ - symextn_sec = bfd_get_section_by_name (input_bfd, SYMEXTN_SECTION_NAME); - if (symextn_sec == NULL) - return true; - - /* Done separately so we can turn off SEC_HAS_CONTENTS (see below). */ - if (symextn_sec->_raw_size == 0) - { - symextn_sec->flags &= ~SEC_HAS_CONTENTS; - return true; - } - - contents = (bfd_byte *) bfd_malloc ((size_t) symextn_sec->_raw_size); - if (contents == NULL) - return false; - - /* How gross. We turn off SEC_HAS_CONTENTS for the input symbol extension - sections to keep the generic ELF/BFD code from trying to do anything - with them. We have to undo that hack temporarily so that we can read - in the contents with the generic code. */ - symextn_sec->flags |= SEC_HAS_CONTENTS; - if (bfd_get_section_contents (input_bfd, symextn_sec, contents, - 0, symextn_sec->_raw_size) == false) - { - symextn_sec->flags &= ~SEC_HAS_CONTENTS; - free (contents); - return false; - } - - /* Gross. Turn off SEC_HAS_CONTENTS for the input symbol extension - sections (see above). */ - symextn_sec->flags &= ~SEC_HAS_CONTENTS; - - n_entries = symextn_sec->_raw_size / ELF32_PARISC_SX_SIZE; - for (i = 0; i < n_entries; i++) - { - symext_entryS entry = - ELF32_PARISC_SX_GET (input_bfd, contents + i * ELF32_PARISC_SX_SIZE); - unsigned int value = ELF32_PARISC_SX_VAL (entry); - unsigned int type = ELF32_PARISC_SX_TYPE (entry); - struct elf32_hppa_args_hash_entry *args_hash; - - switch (type) - { - case PARISC_SXT_NULL: - break; - - case PARISC_SXT_SYMNDX: - if (value >= symtab_hdr->sh_size / sizeof (Elf32_External_Sym)) - { - bfd_set_error (bfd_error_bad_value); - free (contents); - return false; - } - current_index = value; - break; - - case PARISC_SXT_ARG_RELOC: - if (current_index < symtab_hdr->sh_info) - { - Elf_Internal_Shdr *hdr; - char *new_name; - const char *sym_name; - asection *sym_sec; - unsigned int len; - - hdr = elf_elfsections (input_bfd)[local_syms[current_index].st_shndx]; - sym_sec = hdr->bfd_section; - sym_name = bfd_elf_string_from_elf_section (input_bfd, - symtab_hdr->sh_link, - local_syms[current_index].st_name); - len = strlen (sym_name) + 10; - new_name = bfd_malloc (len); - if (new_name == NULL) - { - free (contents); - return false; - } - strcpy (new_name, sym_name); - sprintf (new_name + len - 10, "_%08x", (int)sym_sec); - - /* This is a global symbol with argument location info. - We need to enter it into the hash table. */ - args_hash = elf32_hppa_args_hash_lookup (args_hash_table, - new_name, true, - true); - free (new_name); - if (args_hash == NULL) - { - free (contents); - return false; - } - args_hash->arg_bits = value; - break; - } - else if (current_index >= symtab_hdr->sh_info) - { - struct elf_link_hash_entry *h; - - current_index -= symtab_hdr->sh_info; - h = elf_sym_hashes(input_bfd)[current_index]; - /* This is a global symbol with argument location - information. We need to enter it into the hash table. */ - args_hash = elf32_hppa_args_hash_lookup (args_hash_table, - h->root.root.string, - true, true); - if (args_hash == NULL) - { - bfd_set_error (bfd_error_bad_value); - free (contents); - return false; - } - args_hash->arg_bits = value; - break; - } - else - break; - - default: - bfd_set_error (bfd_error_bad_value); - free (contents); - return false; - } - } - free (contents); - return true; -} - -/* Undo the generic ELF code's subtraction of section->vma from the - value of each external symbol. */ - -static boolean -elf32_hppa_add_symbol_hook (abfd, info, sym, namep, flagsp, secp, valp) - bfd *abfd; - struct bfd_link_info *info; - const Elf_Internal_Sym *sym; - const char **namep; - flagword *flagsp; - asection **secp; - bfd_vma *valp; -{ - *valp += (*secp)->vma; - return true; -} - -/* Determine the name of the stub needed to perform a call assuming the - argument relocation bits for caller and callee are in CALLER and CALLEE - for a call from LOCATION to DESTINATION. Copy the name into STUB_NAME. */ - -static void -elf32_hppa_name_of_stub (caller, callee, location, destination, stub_name) - unsigned int caller, callee; - bfd_vma location, destination; - char *stub_name; -{ - arg_reloc_type arg_reloc_types[5]; - - if (elf32_hppa_arg_reloc_needed (caller, callee, arg_reloc_types)) - { - arg_reloc_location i; - /* Fill in the basic template. */ - strcpy (stub_name, "__XX_XX_XX_XX_XX_stub_"); - - /* Now fix the specifics. */ - for (i = ARG0; i <= RET; i++) - switch (arg_reloc_types[i]) - { - case NO: - stub_name[3 * i + 2] = 'N'; - stub_name[3 * i + 3] = 'O'; - break; - case GF: - stub_name[3 * i + 2] = 'G'; - stub_name[3 * i + 3] = 'F'; - break; - case FG: - stub_name[3 * i + 2] = 'F'; - stub_name[3 * i + 3] = 'G'; - break; - case GD: - stub_name[3 * i + 2] = 'G'; - stub_name[3 * i + 3] = 'D'; - break; - case DG: - stub_name[3 * i + 2] = 'D'; - stub_name[3 * i + 3] = 'G'; - break; - } - } - else - strcpy (stub_name, "_____long_branch_stub_"); -} - -/* Determine if an argument relocation stub is needed to perform a - call assuming the argument relocation bits for caller and callee - are in CALLER and CALLEE. Place the type of relocations (if any) - into stub_types_p. */ - -static boolean -elf32_hppa_arg_reloc_needed (caller, callee, stub_types) - unsigned int caller, callee; - arg_reloc_type stub_types[5]; -{ - /* Special case for no relocations. */ - if (caller == 0 || callee == 0) - return 0; - else - { - arg_location caller_loc[5]; - arg_location callee_loc[5]; - - /* Extract the location information for the argument and return - value on both the caller and callee sides. */ - caller_loc[ARG0] = EXTRACT_ARBITS (caller, ARG0); - callee_loc[ARG0] = EXTRACT_ARBITS (callee, ARG0); - caller_loc[ARG1] = EXTRACT_ARBITS (caller, ARG1); - callee_loc[ARG1] = EXTRACT_ARBITS (callee, ARG1); - caller_loc[ARG2] = EXTRACT_ARBITS (caller, ARG2); - callee_loc[ARG2] = EXTRACT_ARBITS (callee, ARG2); - caller_loc[ARG3] = EXTRACT_ARBITS (caller, ARG3); - callee_loc[ARG3] = EXTRACT_ARBITS (callee, ARG3); - caller_loc[RET] = EXTRACT_ARBITS (caller, RET); - callee_loc[RET] = EXTRACT_ARBITS (callee, RET); - - /* Check some special combinations. This is necessary to - deal with double precision FP arguments. */ - if (caller_loc[ARG0] == AR_FU || caller_loc[ARG1] == AR_FU) - { - caller_loc[ARG0] = AR_FPDBL1; - caller_loc[ARG1] = AR_NO; - } - if (caller_loc[ARG2] == AR_FU || caller_loc[ARG3] == AR_FU) - { - caller_loc[ARG2] = AR_FPDBL2; - caller_loc[ARG3] = AR_NO; - } - if (callee_loc[ARG0] == AR_FU || callee_loc[ARG1] == AR_FU) - { - callee_loc[ARG0] = AR_FPDBL1; - callee_loc[ARG1] = AR_NO; - } - if (callee_loc[ARG2] == AR_FU || callee_loc[ARG3] == AR_FU) - { - callee_loc[ARG2] = AR_FPDBL2; - callee_loc[ARG3] = AR_NO; - } - - /* Now look up any relocation needed for each argument and the - return value. */ - stub_types[ARG0] = arg_mismatches[caller_loc[ARG0]][callee_loc[ARG0]]; - stub_types[ARG1] = arg_mismatches[caller_loc[ARG1]][callee_loc[ARG1]]; - stub_types[ARG2] = arg_mismatches[caller_loc[ARG2]][callee_loc[ARG2]]; - stub_types[ARG3] = arg_mismatches[caller_loc[ARG3]][callee_loc[ARG3]]; - stub_types[RET] = ret_mismatches[caller_loc[RET]][callee_loc[RET]]; - - return (stub_types[ARG0] != NO - || stub_types[ARG1] != NO - || stub_types[ARG2] != NO - || stub_types[ARG3] != NO - || stub_types[RET] != NO); - } -} - -/* Compute the size of the stub needed to call from LOCATION to DESTINATION - (a function named SYM_NAME), with argument relocation bits CALLER and - CALLEE. Return zero if no stub is needed to perform such a call. */ - -static unsigned int -elf32_hppa_size_of_stub (callee, caller, location, destination, sym_name) - unsigned int callee, caller; - bfd_vma location, destination; - const char *sym_name; -{ - arg_reloc_type arg_reloc_types[5]; - - /* Determine if a long branch or argument relocation stub is needed. - If an argument relocation stub is needed, the relocation will be - stored into arg_reloc_types. */ - if (!(((int)(location - destination) > 0x3ffff) - || ((int)(location - destination) < (int)0xfffc0000) - || elf32_hppa_arg_reloc_needed (caller, callee, arg_reloc_types))) - return 0; - - /* Some kind of stub is needed. Determine how big it needs to be. - First check for argument relocation stubs as they also handle - long calls. Then check for long calls to millicode and finally - the normal long calls. */ - if (arg_reloc_types[ARG0] != NO - || arg_reloc_types[ARG1] != NO - || arg_reloc_types[ARG2] != NO - || arg_reloc_types[ARG3] != NO - || arg_reloc_types[RET] != NO) - { - /* Some kind of argument relocation stub is needed. */ - unsigned int len = 16; - arg_reloc_location i; - - /* Each GR or FG relocation takes 2 insns, each GD or DG - relocation takes 3 insns. Plus 4 more insns for the - RP adjustment, ldil & (be | ble) and copy. */ - for (i = ARG0; i <= RET; i++) - switch (arg_reloc_types[i]) - { - case GF: - case FG: - len += 8; - break; - - case GD: - case DG: - len += 12; - break; - - default: - break; - } - - /* Extra instructions are needed if we're relocating a return value. */ - if (arg_reloc_types[RET] != NO) - len += 12; - - return len; - } - else if (!strncmp ("$$", sym_name, 2) - && strcmp ("$$dyncall", sym_name)) - return 12; - else - return 16; -} - -/* Build one linker stub as defined by the stub hash table entry GEN_ENTRY. - IN_ARGS contains the stub BFD and link info pointers. */ - -static boolean -elf32_hppa_build_one_stub (gen_entry, in_args) - struct bfd_hash_entry *gen_entry; - PTR in_args; -{ - void **args = (void **)in_args; - bfd *stub_bfd = (bfd *)args[0]; - struct bfd_link_info *info = (struct bfd_link_info *)args[1]; - struct elf32_hppa_stub_hash_entry *entry; - struct elf32_hppa_stub_hash_table *stub_hash_table; - bfd_byte *loc; - symvalue sym_value; - const char *sym_name; - - /* Initialize pointers to the stub hash table, the particular entry we - are building a stub for, and where (in memory) we should place the stub - instructions. */ - entry = (struct elf32_hppa_stub_hash_entry *)gen_entry; - stub_hash_table = elf32_hppa_hash_table(info)->stub_hash_table; - loc = stub_hash_table->location; - - /* Make a note of the offset within the stubs for this entry. */ - entry->offset = stub_hash_table->offset; - - /* The symbol's name starts at offset 22. */ - sym_name = entry->root.string + 22; - - sym_value = (entry->target_value - + entry->target_section->output_offset - + entry->target_section->output_section->vma); - - if (strncmp ("_____long_branch_stub_", entry->root.string, 22)) - { - /* This must be an argument or return value relocation stub. */ - unsigned long insn; - arg_reloc_location i; - bfd_byte *begin_loc = loc; - - /* First the return pointer adjustment. Depending on exact calling - sequence this instruction may be skipped. */ - bfd_put_32 (stub_bfd, LDO_M4_R31_R31, loc); - loc += 4; - - /* If we are relocating a return value, then we're going to have - to return into the stub. So we have to save off the user's - return pointer into the stack at RP'. */ - if (strncmp (entry->root.string + 14, "NO", 2)) - { - bfd_put_32 (stub_bfd, STW_R31_M8R30, loc); - loc += 4; - } - - /* Iterate over the argument relocations, emitting instructions - to move them around as necessary. */ - for (i = ARG0; i <= ARG3; i++) - { - if (!strncmp (entry->root.string + 3 * i + 2, "GF", 2)) - { - bfd_put_32 (stub_bfd, STW_ARG_M16R30 | ((26 - i) << 16), loc); - bfd_put_32 (stub_bfd, FLDW_M16R30_FARG | (4 + i), loc + 4); - loc += 8; - } - else if (!strncmp (entry->root.string + 3 * i + 2, "FG", 2)) - { - bfd_put_32 (stub_bfd, FSTW_FARG_M16R30 | (4 + i), loc); - bfd_put_32 (stub_bfd, LDW_M16R30_ARG | ((26 - i) << 16), loc + 4); - loc += 8; - } - else if (!strncmp (entry->root.string + 3 * i + 2, "GD", 2)) - { - bfd_put_32 (stub_bfd, STW_ARG_M12R30 | ((26 - i) << 16), loc); - bfd_put_32 (stub_bfd, STW_ARG_M16R30 | ((25 - i) << 16), loc + 4); - bfd_put_32 (stub_bfd, FLDD_M16R30_FARG | (5 + i), loc + 8); - loc += 12; - } - else if (!strncmp (entry->root.string + 3 * i + 2, "DG", 2)) - { - bfd_put_32 (stub_bfd, FSTD_FARG_M16R30 | (5 + i), loc); - bfd_put_32 (stub_bfd, LDW_M12R30_ARG | ((26 - i) << 16), loc + 4); - bfd_put_32 (stub_bfd, LDW_M16R30_ARG | ((25 - i) << 16), loc + 8); - loc += 12; - } - } - - /* Load the high bits of the target address into %r1. */ - insn = hppa_rebuild_insn (stub_bfd, LDIL_R1, - hppa_field_adjust (sym_value, 0, e_lrsel), 21); - bfd_put_32 (stub_bfd, insn, loc); - loc += 4; - - /* If we are relocating a return value, then we're going to have - to return into the stub, then perform the return value relocation. */ - if (strncmp (entry->root.string + 14, "NO", 2)) - { - /* To return to the stub we "ble" to the target and copy the return - pointer from %r31 into %r2. */ - insn = hppa_rebuild_insn (stub_bfd, - BLE_SR4_R1, - hppa_field_adjust (sym_value, 0, - e_rrsel) >> 2, - 17); - bfd_put_32 (stub_bfd, insn, loc); - bfd_put_32 (stub_bfd, COPY_R31_R2, loc + 4); - - /* Reload the return pointer for our caller from the stack. */ - bfd_put_32 (stub_bfd, LDW_M8R30_R31, loc + 8); - loc += 12; - - /* Perform the return value relocation. */ - if (!strncmp (entry->root.string + 14, "GF", 2)) - { - bfd_put_32 (stub_bfd, STW_ARG_M16R30 | (28 << 16), loc); - bfd_put_32 (stub_bfd, FLDW_M16R30_FARG | 4, loc + 4); - loc += 8; - } - else if (!strncmp (entry->root.string + 14, "FG", 2)) - { - bfd_put_32 (stub_bfd, FSTW_FARG_M16R30 | 4, loc); - bfd_put_32 (stub_bfd, LDW_M16R30_ARG | (28 << 16), loc + 4); - loc += 8; - } - else if (!strncmp (entry->root.string + 2, "GD", 2)) - { - bfd_put_32 (stub_bfd, STW_ARG_M12R30 | (28 << 16), loc); - bfd_put_32 (stub_bfd, STW_ARG_M16R30 | (29 << 16), loc + 4); - bfd_put_32 (stub_bfd, FLDD_M16R30_FARG | 4, loc + 8); - loc += 12; - } - else if (!strncmp (entry->root.string + 2, "DG", 2)) - { - bfd_put_32 (stub_bfd, FSTD_FARG_M16R30 | 4, loc); - bfd_put_32 (stub_bfd, LDW_M12R30_ARG | (28 << 16), loc + 4); - bfd_put_32 (stub_bfd, LDW_M16R30_ARG | (29 << 16), loc + 8); - loc += 12; - } - /* Branch back to the user's code now. */ - bfd_put_32 (stub_bfd, BV_N_0_R31, loc); - loc += 4; - } - else - { - /* No return value relocation, so we can simply "be" to the - target and copy out return pointer into %r2. */ - insn = hppa_rebuild_insn (stub_bfd, BE_SR4_R1, - hppa_field_adjust (sym_value, 0, - e_rrsel) >> 2, 17); - bfd_put_32 (stub_bfd, insn, loc); - bfd_put_32 (stub_bfd, COPY_R31_R2, loc + 4); - loc += 8; - } - - /* Update the location and offsets. */ - stub_hash_table->location += (loc - begin_loc); - stub_hash_table->offset += (loc - begin_loc); - } - else - { - /* Create one of two variant long branch stubs. One for $$dyncall and - normal calls, the other for calls to millicode. */ - unsigned long insn; - int millicode_call = 0; - - if (!strncmp ("$$", sym_name, 2) && strcmp ("$$dyncall", sym_name)) - millicode_call = 1; - - /* First the return pointer adjustment. Depending on exact calling - sequence this instruction may be skipped. */ - bfd_put_32 (stub_bfd, LDO_M4_R31_R31, loc); - - /* The next two instructions are the long branch itself. A long branch - is formed with "ldil" loading the upper bits of the target address - into a register, then branching with "be" which adds in the lower bits. - Long branches to millicode nullify the delay slot of the "be". */ - insn = hppa_rebuild_insn (stub_bfd, LDIL_R1, - hppa_field_adjust (sym_value, 0, e_lrsel), 21); - bfd_put_32 (stub_bfd, insn, loc + 4); - insn = hppa_rebuild_insn (stub_bfd, BE_SR4_R1 | (millicode_call ? 2 : 0), - hppa_field_adjust (sym_value, 0, e_rrsel) >> 2, - 17); - bfd_put_32 (stub_bfd, insn, loc + 8); - - if (!millicode_call) - { - /* The sequence to call this stub places the return pointer into %r31, - the final target expects the return pointer in %r2, so copy the - return pointer into the proper register. */ - bfd_put_32 (stub_bfd, COPY_R31_R2, loc + 12); - - /* Update the location and offsets. */ - stub_hash_table->location += 16; - stub_hash_table->offset += 16; - } - else - { - /* Update the location and offsets. */ - stub_hash_table->location += 12; - stub_hash_table->offset += 12; - } - - } - return true; -} - -/* External entry points for sizing and building linker stubs. */ - -/* Build all the stubs associated with the current output file. The - stubs are kept in a hash table attached to the main linker hash - table. This is called via hppaelf_finish in the linker. */ - -boolean -elf32_hppa_build_stubs (stub_bfd, info) - bfd *stub_bfd; - struct bfd_link_info *info; -{ - /* The stub BFD only has one section. */ - asection *stub_sec = stub_bfd->sections; - struct elf32_hppa_stub_hash_table *table; - unsigned int size; - void *args[2]; - - /* So we can pass both the BFD for the stubs and the link info - structure to the routine which actually builds stubs. */ - args[0] = stub_bfd; - args[1] = info; - - /* Allocate memory to hold the linker stubs. */ - size = bfd_section_size (stub_bfd, stub_sec); - stub_sec->contents = (unsigned char *) bfd_zalloc (stub_bfd, size); - if (stub_sec->contents == NULL) - return false; - table = elf32_hppa_hash_table(info)->stub_hash_table; - table->location = stub_sec->contents; - - /* Build the stubs as directed by the stub hash table. */ - elf32_hppa_stub_hash_traverse (table, elf32_hppa_build_one_stub, args); - - return true; -} - -/* Determine and set the size of the stub section for a final link. - - The basic idea here is to examine all the relocations looking for - PC-relative calls to a target that is unreachable with a "bl" - instruction or calls where the caller and callee disagree on the - location of their arguments or return value. */ - -boolean -elf32_hppa_size_stubs (stub_bfd, output_bfd, link_info) - bfd *stub_bfd; - bfd *output_bfd; - struct bfd_link_info *link_info; -{ - bfd *input_bfd; - asection *section, *stub_sec = 0; - Elf_Internal_Shdr *symtab_hdr; - Elf_Internal_Sym *local_syms, *isym, **all_local_syms; - Elf32_External_Sym *ext_syms, *esym; - unsigned int i, index, bfd_count = 0; - struct elf32_hppa_stub_hash_table *stub_hash_table = 0; - struct elf32_hppa_args_hash_table *args_hash_table = 0; - - /* Create and initialize the stub hash table. */ - stub_hash_table = ((struct elf32_hppa_stub_hash_table *) - bfd_malloc (sizeof (struct elf32_hppa_stub_hash_table))); - if (!stub_hash_table) - goto error_return; - - if (!elf32_hppa_stub_hash_table_init (stub_hash_table, stub_bfd, - elf32_hppa_stub_hash_newfunc)) - goto error_return; - - /* Likewise for the argument location hash table. */ - args_hash_table = ((struct elf32_hppa_args_hash_table *) - bfd_malloc (sizeof (struct elf32_hppa_args_hash_table))); - if (!args_hash_table) - goto error_return; - - if (!elf32_hppa_args_hash_table_init (args_hash_table, - elf32_hppa_args_hash_newfunc)) - goto error_return; - - /* Attach the hash tables to the main hash table. */ - elf32_hppa_hash_table(link_info)->stub_hash_table = stub_hash_table; - elf32_hppa_hash_table(link_info)->args_hash_table = args_hash_table; - - /* Count the number of input BFDs. */ - for (input_bfd = link_info->input_bfds; - input_bfd != NULL; - input_bfd = input_bfd->link_next) - bfd_count++; - - /* We want to read in symbol extension records only once. To do this - we need to read in the local symbols in parallel and save them for - later use; so hold pointers to the local symbols in an array. */ - all_local_syms - = (Elf_Internal_Sym **) bfd_malloc (sizeof (Elf_Internal_Sym *) - * bfd_count); - if (all_local_syms == NULL) - goto error_return; - memset (all_local_syms, 0, sizeof (Elf_Internal_Sym *) * bfd_count); - - /* Walk over all the input BFDs adding entries to the args hash table - for all the external functions. */ - for (input_bfd = link_info->input_bfds, index = 0; - input_bfd != NULL; - input_bfd = input_bfd->link_next, index++) - { - /* We'll need the symbol table in a second. */ - symtab_hdr = &elf_tdata (input_bfd)->symtab_hdr; - if (symtab_hdr->sh_info == 0) - continue; - - /* We need an array of the local symbols attached to the input bfd. - Unfortunately, we're going to have to read & swap them in. */ - local_syms - = (Elf_Internal_Sym *) bfd_malloc (symtab_hdr->sh_info - * sizeof (Elf_Internal_Sym)); - if (local_syms == NULL) - { - for (i = 0; i < bfd_count; i++) - if (all_local_syms[i]) - free (all_local_syms[i]); - free (all_local_syms); - goto error_return; - } - all_local_syms[index] = local_syms; - - ext_syms - = (Elf32_External_Sym *) bfd_malloc (symtab_hdr->sh_info - * sizeof (Elf32_External_Sym)); - if (ext_syms == NULL) - { - for (i = 0; i < bfd_count; i++) - if (all_local_syms[i]) - free (all_local_syms[i]); - free (all_local_syms); - goto error_return; - } - - if (bfd_seek (input_bfd, symtab_hdr->sh_offset, SEEK_SET) != 0 - || bfd_read (ext_syms, 1, - (symtab_hdr->sh_info - * sizeof (Elf32_External_Sym)), input_bfd) - != (symtab_hdr->sh_info * sizeof (Elf32_External_Sym))) - { - for (i = 0; i < bfd_count; i++) - if (all_local_syms[i]) - free (all_local_syms[i]); - free (all_local_syms); - free (ext_syms); - goto error_return; - } - - /* Swap the local symbols in. */ - isym = local_syms; - esym = ext_syms; - for (i = 0; i < symtab_hdr->sh_info; i++, esym++, isym++) - bfd_elf32_swap_symbol_in (input_bfd, esym, isym); - - /* Now we can free the external symbols. */ - free (ext_syms); - - if (elf32_hppa_read_symext_info (input_bfd, symtab_hdr, args_hash_table, - local_syms) == false) - { - for (i = 0; i < bfd_count; i++) - if (all_local_syms[i]) - free (all_local_syms[i]); - free (all_local_syms); - goto error_return; - } - } - - /* Magic as we know the stub bfd only has one section. */ - stub_sec = stub_bfd->sections; - - /* If generating a relocateable output file, then we don't - have to examine the relocs. */ - if (link_info->relocateable) - { - for (i = 0; i < bfd_count; i++) - if (all_local_syms[i]) - free (all_local_syms[i]); - free (all_local_syms); - return true; - } - - /* Now that we have argument location information for all the global - functions we can start looking for stubs. */ - for (input_bfd = link_info->input_bfds, index = 0; - input_bfd != NULL; - input_bfd = input_bfd->link_next, index++) - { - /* We'll need the symbol table in a second. */ - symtab_hdr = &elf_tdata (input_bfd)->symtab_hdr; - if (symtab_hdr->sh_info == 0) - continue; - - local_syms = all_local_syms[index]; - - /* Walk over each section attached to the input bfd. */ - for (section = input_bfd->sections; - section != NULL; - section = section->next) - { - Elf_Internal_Shdr *input_rel_hdr; - Elf32_External_Rela *external_relocs, *erelaend, *erela; - Elf_Internal_Rela *internal_relocs, *irelaend, *irela; - - /* If there aren't any relocs, then there's nothing to do. */ - if ((section->flags & SEC_RELOC) == 0 - || section->reloc_count == 0) - continue; - - /* Allocate space for the external relocations. */ - external_relocs - = ((Elf32_External_Rela *) - bfd_malloc (section->reloc_count - * sizeof (Elf32_External_Rela))); - if (external_relocs == NULL) - { - for (i = 0; i < bfd_count; i++) - if (all_local_syms[i]) - free (all_local_syms[i]); - free (all_local_syms); - goto error_return; - } - - /* Likewise for the internal relocations. */ - internal_relocs - = ((Elf_Internal_Rela *) - bfd_malloc (section->reloc_count * sizeof (Elf_Internal_Rela))); - if (internal_relocs == NULL) - { - free (external_relocs); - for (i = 0; i < bfd_count; i++) - if (all_local_syms[i]) - free (all_local_syms[i]); - free (all_local_syms); - goto error_return; - } - - /* Read in the external relocs. */ - input_rel_hdr = &elf_section_data (section)->rel_hdr; - if (bfd_seek (input_bfd, input_rel_hdr->sh_offset, SEEK_SET) != 0 - || bfd_read (external_relocs, 1, input_rel_hdr->sh_size, - input_bfd) != input_rel_hdr->sh_size) - { - free (external_relocs); - free (internal_relocs); - for (i = 0; i < bfd_count; i++) - if (all_local_syms[i]) - free (all_local_syms[i]); - free (all_local_syms); - goto error_return; - } - - /* Swap in the relocs. */ - erela = external_relocs; - erelaend = erela + section->reloc_count; - irela = internal_relocs; - for (; erela < erelaend; erela++, irela++) - bfd_elf32_swap_reloca_in (input_bfd, erela, irela); - - /* We're done with the external relocs, free them. */ - free (external_relocs); - - /* Now examine each relocation. */ - irela = internal_relocs; - irelaend = irela + section->reloc_count; - for (; irela < irelaend; irela++) - { - long r_type, callee_args, caller_args, size_of_stub; - unsigned long r_index; - struct elf_link_hash_entry *hash; - struct elf32_hppa_stub_hash_entry *stub_hash; - struct elf32_hppa_args_hash_entry *args_hash; - Elf_Internal_Sym *sym; - asection *sym_sec; - const char *sym_name; - symvalue sym_value; - bfd_vma location, destination; - char *new_name = NULL; - - r_type = ELF32_R_TYPE (irela->r_info); - r_index = ELF32_R_SYM (irela->r_info); - - if (r_type < 0 || r_type >= (int) R_PARISC_UNIMPLEMENTED) - { - bfd_set_error (bfd_error_bad_value); - free (internal_relocs); - for (i = 0; i < bfd_count; i++) - if (all_local_syms[i]) - free (all_local_syms[i]); - free (all_local_syms); - goto error_return; - } - - /* Only look for stubs on call instructions or plabel - references. */ - if (r_type != R_PARISC_PCREL17F - && r_type != R_PARISC_PLABEL32 - && r_type != R_PARISC_PLABEL21L - && r_type != R_PARISC_PLABEL14R) - continue; - - /* Now determine the call target, its name, value, section - and argument relocation bits. */ - hash = NULL; - sym = NULL; - sym_sec = NULL; - if (r_index < symtab_hdr->sh_info) - { - /* It's a local symbol. */ - Elf_Internal_Shdr *hdr; - - sym = local_syms + r_index; - hdr = elf_elfsections (input_bfd)[sym->st_shndx]; - sym_sec = hdr->bfd_section; - sym_name = bfd_elf_string_from_elf_section (input_bfd, - symtab_hdr->sh_link, - sym->st_name); - sym_value = (ELF_ST_TYPE (sym->st_info) == STT_SECTION - ? 0 : sym->st_value); - destination = (sym_value - + sym_sec->output_offset - + sym_sec->output_section->vma); - - /* Tack on an ID so we can uniquely identify this local - symbol in the stub or arg info hash tables. */ - new_name = bfd_malloc (strlen (sym_name) + 10); - if (new_name == 0) - { - free (internal_relocs); - for (i = 0; i < bfd_count; i++) - if (all_local_syms[i]) - free (all_local_syms[i]); - free (all_local_syms); - goto error_return; - } - sprintf (new_name, "%s_%08x", sym_name, (int)sym_sec); - sym_name = new_name; - } - else - { - /* It's an external symbol. */ - long index; - - index = r_index - symtab_hdr->sh_info; - hash = elf_sym_hashes (input_bfd)[index]; - if (hash->root.type == bfd_link_hash_defined - || hash->root.type == bfd_link_hash_defweak) - { - sym_sec = hash->root.u.def.section; - sym_name = hash->root.root.string; - sym_value = hash->root.u.def.value; - destination = (sym_value - + sym_sec->output_offset - + sym_sec->output_section->vma); - } - else - { - bfd_set_error (bfd_error_bad_value); - free (internal_relocs); - for (i = 0; i < bfd_count; i++) - if (all_local_syms[i]) - free (all_local_syms[i]); - free (all_local_syms); - goto error_return; - } - } - - args_hash = elf32_hppa_args_hash_lookup (args_hash_table, - sym_name, false, false); - - /* Get both caller and callee argument information. */ - if (args_hash == NULL) - callee_args = 0; - else - callee_args = args_hash->arg_bits; - - /* For calls get the caller's bits from the addend of - the call relocation. For PLABELS the caller's bits - are assumed to have all args & return values in general - registers (0x155). */ - if (r_type == R_PARISC_PCREL17F) - caller_args = HPPA_R_ARG_RELOC (irela->r_addend); - else - caller_args = 0x155; - - /* Now determine where the call point is. */ - location = (section->output_offset - + section->output_section->vma - + irela->r_offset); - - /* We only care about the destination for PCREL function - calls (eg. we don't care for PLABELS). */ - if (r_type != R_PARISC_PCREL17F) - location = destination; - - /* Determine what (if any) linker stub is needed and its - size (in bytes). */ - size_of_stub = elf32_hppa_size_of_stub (callee_args, - caller_args, - location, - destination, - sym_name); - if (size_of_stub != 0) - { - char *stub_name; - unsigned int len; - - /* Get the name of this stub. */ - len = strlen (sym_name); - len += 23; - - stub_name = bfd_malloc (len); - if (!stub_name) - { - /* Because sym_name was mallocd above for local - symbols. */ - if (r_index < symtab_hdr->sh_info) - free (new_name); - - free (internal_relocs); - for (i = 0; i < bfd_count; i++) - if (all_local_syms[i]) - free (all_local_syms[i]); - free (all_local_syms); - goto error_return; - } - elf32_hppa_name_of_stub (caller_args, callee_args, - location, destination, stub_name); - strcat (stub_name + 22, sym_name); - - /* Because sym_name was malloced above for local symbols. */ - if (r_index < symtab_hdr->sh_info) - free (new_name); - - stub_hash - = elf32_hppa_stub_hash_lookup (stub_hash_table, stub_name, - false, false); - if (stub_hash != NULL) - { - /* The proper stub has already been created, nothing - else to do. */ - free (stub_name); - } - else - { - bfd_set_section_size (stub_bfd, stub_sec, - (bfd_section_size (stub_bfd, - stub_sec) - + size_of_stub)); - - /* Enter this entry into the linker stub hash table. */ - stub_hash - = elf32_hppa_stub_hash_lookup (stub_hash_table, - stub_name, true, true); - if (stub_hash == NULL) - { - free (stub_name); - free (internal_relocs); - for (i = 0; i < bfd_count; i++) - if (all_local_syms[i]) - free (all_local_syms[i]); - free (all_local_syms); - goto error_return; - } - - /* We'll need these to determine the address that the - stub will branch to. */ - stub_hash->target_value = sym_value; - stub_hash->target_section = sym_sec; - } - free (stub_name); - } - } - /* We're done with the internal relocs, free them. */ - free (internal_relocs); - } - } - /* We're done with the local symbols, free them. */ - for (i = 0; i < bfd_count; i++) - if (all_local_syms[i]) - free (all_local_syms[i]); - free (all_local_syms); - return true; - -error_return: - /* Return gracefully, avoiding dangling references to the hash tables. */ - if (stub_hash_table) - { - elf32_hppa_hash_table(link_info)->stub_hash_table = NULL; - free (stub_hash_table); - } - if (args_hash_table) - { - elf32_hppa_hash_table(link_info)->args_hash_table = NULL; - free (args_hash_table); - } - /* Set the size of the stub section to zero since we're never going - to create them. Avoids losing when we try to get its contents - too. */ - bfd_set_section_size (stub_bfd, stub_sec, 0); - return false; -} - -/* Misc BFD support code. */ -#define bfd_elf32_bfd_reloc_type_lookup elf_hppa_reloc_type_lookup -#define bfd_elf32_bfd_is_local_label hppa_elf_is_local_label - -/* Symbol extension stuff. */ -#define bfd_elf32_set_section_contents elf32_hppa_set_section_contents -#define elf_backend_symbol_table_processing \ - elf32_hppa_backend_symbol_table_processing -#define elf_backend_begin_write_processing \ - elf32_hppa_backend_begin_write_processing -#define elf_backend_final_write_processing \ - elf32_hppa_backend_final_write_processing - -/* Stuff for the BFD linker. */ -#define elf_backend_relocate_section elf32_hppa_relocate_section -#define elf_backend_add_symbol_hook elf32_hppa_add_symbol_hook -#define elf_backend_link_output_symbol_hook \ - elf32_hppa_link_output_symbol_hook -#define bfd_elf32_bfd_link_hash_table_create \ - elf32_hppa_link_hash_table_create - -#define TARGET_BIG_SYM bfd_elf32_hppa_vec -#define TARGET_BIG_NAME "elf32-hppa" -#define ELF_ARCH bfd_arch_hppa -#define ELF_MACHINE_CODE EM_PARISC -#define ELF_MAXPAGESIZE 0x1000 - -#include "elf32-target.h" diff --git a/contrib/gdb/bfd/elf32-hppa.h b/contrib/gdb/bfd/elf32-hppa.h deleted file mode 100644 index 63ee52200e0dc..0000000000000 --- a/contrib/gdb/bfd/elf32-hppa.h +++ /dev/null @@ -1,152 +0,0 @@ -/* ELF32/HPPA support - - This file contains ELF32/HPPA relocation support as specified - in the Stratus FTX/Golf Object File Format (SED-1762) dated - February 1994. - - Copyright (C) 1990, 91, 92, 93, 94 Free Software Foundation, Inc. - - Written by: - - Center for Software Science - Department of Computer Science - University of Utah - - This file is part of BFD, the Binary File Descriptor library. - - 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 2 of the License, 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ - -#ifndef _ELF32_HPPA_H -#define _ELF32_HPPA_H - -#include "elf-bfd.h" -#include "libhppa.h" -#include "elf/hppa.h" - -/* ELF/HPPA relocation types */ - -typedef enum - { - /* Address relocation types - These relocation types do simple base + offset relocations. */ - - R_PARISC_NONE = 0x00, - R_PARISC_DIR32 = 0x01, - R_PARISC_DIR21L = 0x02, - R_PARISC_DIR17R = 0x03, - R_PARISC_DIR17F = 0x04, - R_PARISC_DIR14R = 0x06, - - /* PC-relative relocation types - Typically used for calls. - Note PCREL17C and PCREL17F differ only in overflow handling. - PCREL17C never reports a relocation error. - - When supporting argument relocations, function calls must be - accompanied by parameter relocation information. This information is - carried in the ten high-order bits of the addend field. The remaining - 22 bits of of the addend field are sign-extended to form the Addend. - - Note the code to build argument relocations depends on the - addend being zero. A consequence of this limitation is GAS - can not perform relocation reductions for function symbols. */ - R_PARISC_PCREL21L = 0x0a, - R_PARISC_PCREL17R = 0x0b, - R_PARISC_PCREL17F = 0x0c, - R_PARISC_PCREL17C = 0x0d, - R_PARISC_PCREL14R = 0x0e, - R_PARISC_PCREL14F = 0x0f, - - /* DP-relative relocation types. */ - R_PARISC_DPREL21L = 0x12, - R_PARISC_DPREL14R = 0x16, - R_PARISC_DPREL14F = 0x17, - - /* Data linkage table (DLT) relocation types - - SOM DLT_REL fixup requests are used to for static data references - from position-independent code within shared libraries. They are - similar to the GOT relocation types in some SVR4 implementations. */ - - R_PARISC_DLTREL21L = 0x1a, - R_PARISC_DLTREL14R = 0x1e, - R_PARISC_DLTREL14F = 0x1f, - - /* DLT indirect relocation types */ - R_PARISC_DLTIND21L = 0x22, - R_PARISC_DLTIND14R = 0x26, - R_PARISC_DLTIND14F = 0x27, - - /* Base relative relocation types. Ugh. These imply lots of state */ - R_PARISC_SETBASE = 0x28, - R_PARISC_BASEREL32 = 0x29, - R_PARISC_BASEREL21L = 0x2a, - R_PARISC_BASEREL17R = 0x2b, - R_PARISC_BASEREL17F = 0x2c, - R_PARISC_BASEREL14R = 0x2e, - R_PARISC_BASEREL14F = 0x2f, - - /* Segment relative relocation types. */ - R_PARISC_TEXTREL32 = 0x31, - R_PARISC_DATAREL32 = 0x39, - - /* Plabel relocation types. */ - R_PARISC_PLABEL32 = 0x41, - R_PARISC_PLABEL21L = 0x42, - R_PARISC_PLABEL14R = 0x46, - - /* PLT relocations. */ - R_PARISC_PLTIND21L = 0x82, - R_PARISC_PLTIND14R = 0x86, - R_PARISC_PLTIND14F = 0x87, - - /* Misc relocation types. */ - R_PARISC_COPY = 0x88, - R_PARISC_GLOB_DAT = 0x89, - R_PARISC_JMP_SLOT = 0x8a, - R_PARISC_RELATIVE = 0x8b, - R_PARISC_UNIMPLEMENTED, - } -elf32_hppa_reloc_type; - -#define ELF_HOWTO_TABLE_SIZE R_PARISC_UNIMPLEMENTED + 1 -#define N_PARISC_RELOCS R_PARISC_UNIMPLEMENTED + 1 - -/* Define groups of basic relocations. FIXME: These should - be the only basic relocations created by GAS. The rest - should be internal to the BFD backend. - - The idea is both SOM and ELF define these basic relocation - types so they map into a SOM or ELF specific relocation - as appropriate. This allows GAS to share much more code - between the two target object formats. */ - -#define R_HPPA_NONE R_PARISC_NONE -#define R_HPPA R_PARISC_DIR32 -#define R_HPPA_GOTOFF R_PARISC_DPREL21L -#define R_HPPA_PCREL_CALL R_PARISC_PCREL21L -#define R_HPPA_ABS_CALL R_PARISC_DIR17F -#define R_HPPA_COMPLEX R_PARISC_UNIMPLEMENTED - -elf32_hppa_reloc_type **hppa_elf_gen_reloc_type - PARAMS ((bfd *, elf32_hppa_reloc_type, int, int, int)); - -boolean elf32_hppa_size_stubs - PARAMS ((bfd *, bfd *, struct bfd_link_info *)); - -boolean elf32_hppa_build_stubs - PARAMS ((bfd *, struct bfd_link_info *)); - -#endif /* _ELF32_HPPA_H */ diff --git a/contrib/gdb/bfd/elf32-i386.c b/contrib/gdb/bfd/elf32-i386.c deleted file mode 100644 index 3b39aac919130..0000000000000 --- a/contrib/gdb/bfd/elf32-i386.c +++ /dev/null @@ -1,1546 +0,0 @@ -/* Intel 80386/80486-specific support for 32-bit ELF - Copyright 1993, 1994, 1995, 1996 Free Software Foundation, Inc. - -This file is part of BFD, the Binary File Descriptor library. - -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 2 of the License, 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ - -#include "bfd.h" -#include "sysdep.h" -#include "bfdlink.h" -#include "libbfd.h" -#include "elf-bfd.h" - -static reloc_howto_type *elf_i386_reloc_type_lookup - PARAMS ((bfd *, bfd_reloc_code_real_type)); -static void elf_i386_info_to_howto - PARAMS ((bfd *, arelent *, Elf32_Internal_Rela *)); -static void elf_i386_info_to_howto_rel - PARAMS ((bfd *, arelent *, Elf32_Internal_Rel *)); -static boolean elf_i386_check_relocs - PARAMS ((bfd *, struct bfd_link_info *, asection *, - const Elf_Internal_Rela *)); -static boolean elf_i386_adjust_dynamic_symbol - PARAMS ((struct bfd_link_info *, struct elf_link_hash_entry *)); -static boolean elf_i386_size_dynamic_sections - PARAMS ((bfd *, struct bfd_link_info *)); -static boolean elf_i386_relocate_section - PARAMS ((bfd *, struct bfd_link_info *, bfd *, asection *, bfd_byte *, - Elf_Internal_Rela *, Elf_Internal_Sym *, asection **)); -static boolean elf_i386_finish_dynamic_symbol - PARAMS ((bfd *, struct bfd_link_info *, struct elf_link_hash_entry *, - Elf_Internal_Sym *)); -static boolean elf_i386_finish_dynamic_sections - PARAMS ((bfd *, struct bfd_link_info *)); - -#define USE_REL 1 /* 386 uses REL relocations instead of RELA */ - -enum reloc_type - { - R_386_NONE = 0, - R_386_32, - R_386_PC32, - R_386_GOT32, - R_386_PLT32, - R_386_COPY, - R_386_GLOB_DAT, - R_386_JUMP_SLOT, - R_386_RELATIVE, - R_386_GOTOFF, - R_386_GOTPC, - R_386_max - }; - -#if 0 -static CONST char *CONST reloc_type_names[] = -{ - "R_386_NONE", - "R_386_32", - "R_386_PC32", - "R_386_GOT32", - "R_386_PLT32", - "R_386_COPY", - "R_386_GLOB_DAT", - "R_386_JUMP_SLOT", - "R_386_RELATIVE", - "R_386_GOTOFF", - "R_386_GOTPC", -}; -#endif - -static reloc_howto_type elf_howto_table[]= -{ - HOWTO(R_386_NONE, 0,0, 0,false,0,complain_overflow_bitfield, bfd_elf_generic_reloc,"R_386_NONE", true,0x00000000,0x00000000,false), - HOWTO(R_386_32, 0,2,32,false,0,complain_overflow_bitfield, bfd_elf_generic_reloc,"R_386_32", true,0xffffffff,0xffffffff,false), - HOWTO(R_386_PC32, 0,2,32,true, 0,complain_overflow_bitfield, bfd_elf_generic_reloc,"R_386_PC32", true,0xffffffff,0xffffffff,true), - HOWTO(R_386_GOT32, 0,2,32,false,0,complain_overflow_bitfield, bfd_elf_generic_reloc,"R_386_GOT32", true,0xffffffff,0xffffffff,false), - HOWTO(R_386_PLT32, 0,2,32,true,0,complain_overflow_bitfield, bfd_elf_generic_reloc,"R_386_PLT32", true,0xffffffff,0xffffffff,true), - HOWTO(R_386_COPY, 0,2,32,false,0,complain_overflow_bitfield, bfd_elf_generic_reloc,"R_386_COPY", true,0xffffffff,0xffffffff,false), - HOWTO(R_386_GLOB_DAT, 0,2,32,false,0,complain_overflow_bitfield, bfd_elf_generic_reloc,"R_386_GLOB_DAT", true,0xffffffff,0xffffffff,false), - HOWTO(R_386_JUMP_SLOT, 0,2,32,false,0,complain_overflow_bitfield, bfd_elf_generic_reloc,"R_386_JUMP_SLOT",true,0xffffffff,0xffffffff,false), - HOWTO(R_386_RELATIVE, 0,2,32,false,0,complain_overflow_bitfield, bfd_elf_generic_reloc,"R_386_RELATIVE", true,0xffffffff,0xffffffff,false), - HOWTO(R_386_GOTOFF, 0,2,32,false,0,complain_overflow_bitfield, bfd_elf_generic_reloc,"R_386_GOTOFF", true,0xffffffff,0xffffffff,false), - HOWTO(R_386_GOTPC, 0,2,32,true,0,complain_overflow_bitfield, bfd_elf_generic_reloc,"R_386_GOTPC", true,0xffffffff,0xffffffff,true), -}; - -#ifdef DEBUG_GEN_RELOC -#define TRACE(str) fprintf (stderr, "i386 bfd reloc lookup %d (%s)\n", code, str) -#else -#define TRACE(str) -#endif - -static reloc_howto_type * -elf_i386_reloc_type_lookup (abfd, code) - bfd *abfd; - bfd_reloc_code_real_type code; -{ - switch (code) - { - case BFD_RELOC_NONE: - TRACE ("BFD_RELOC_NONE"); - return &elf_howto_table[ (int)R_386_NONE ]; - - case BFD_RELOC_32: - TRACE ("BFD_RELOC_32"); - return &elf_howto_table[ (int)R_386_32 ]; - - case BFD_RELOC_32_PCREL: - TRACE ("BFD_RELOC_PC32"); - return &elf_howto_table[ (int)R_386_PC32 ]; - - case BFD_RELOC_386_GOT32: - TRACE ("BFD_RELOC_386_GOT32"); - return &elf_howto_table[ (int)R_386_GOT32 ]; - - case BFD_RELOC_386_PLT32: - TRACE ("BFD_RELOC_386_PLT32"); - return &elf_howto_table[ (int)R_386_PLT32 ]; - - case BFD_RELOC_386_COPY: - TRACE ("BFD_RELOC_386_COPY"); - return &elf_howto_table[ (int)R_386_COPY ]; - - case BFD_RELOC_386_GLOB_DAT: - TRACE ("BFD_RELOC_386_GLOB_DAT"); - return &elf_howto_table[ (int)R_386_GLOB_DAT ]; - - case BFD_RELOC_386_JUMP_SLOT: - TRACE ("BFD_RELOC_386_JUMP_SLOT"); - return &elf_howto_table[ (int)R_386_JUMP_SLOT ]; - - case BFD_RELOC_386_RELATIVE: - TRACE ("BFD_RELOC_386_RELATIVE"); - return &elf_howto_table[ (int)R_386_RELATIVE ]; - - case BFD_RELOC_386_GOTOFF: - TRACE ("BFD_RELOC_386_GOTOFF"); - return &elf_howto_table[ (int)R_386_GOTOFF ]; - - case BFD_RELOC_386_GOTPC: - TRACE ("BFD_RELOC_386_GOTPC"); - return &elf_howto_table[ (int)R_386_GOTPC ]; - - default: - break; - } - - TRACE ("Unknown"); - return 0; -} - -static void -elf_i386_info_to_howto (abfd, cache_ptr, dst) - bfd *abfd; - arelent *cache_ptr; - Elf32_Internal_Rela *dst; -{ - BFD_ASSERT (ELF32_R_TYPE(dst->r_info) < (unsigned int) R_386_max); - - cache_ptr->howto = &elf_howto_table[ELF32_R_TYPE(dst->r_info)]; -} - -static void -elf_i386_info_to_howto_rel (abfd, cache_ptr, dst) - bfd *abfd; - arelent *cache_ptr; - Elf32_Internal_Rel *dst; -{ - BFD_ASSERT (ELF32_R_TYPE(dst->r_info) < (unsigned int) R_386_max); - - cache_ptr->howto = &elf_howto_table[ELF32_R_TYPE(dst->r_info)]; -} - -/* Functions for the i386 ELF linker. */ - -/* The name of the dynamic interpreter. This is put in the .interp - section. */ - -#define ELF_DYNAMIC_INTERPRETER "/usr/lib/libc.so.1" - -/* The size in bytes of an entry in the procedure linkage table. */ - -#define PLT_ENTRY_SIZE 16 - -/* The first entry in an absolute procedure linkage table looks like - this. See the SVR4 ABI i386 supplement to see how this works. */ - -static const bfd_byte elf_i386_plt0_entry[PLT_ENTRY_SIZE] = -{ - 0xff, 0x35, /* pushl contents of address */ - 0, 0, 0, 0, /* replaced with address of .got + 4. */ - 0xff, 0x25, /* jmp indirect */ - 0, 0, 0, 0, /* replaced with address of .got + 8. */ - 0, 0, 0, 0 /* pad out to 16 bytes. */ -}; - -/* Subsequent entries in an absolute procedure linkage table look like - this. */ - -static const bfd_byte elf_i386_plt_entry[PLT_ENTRY_SIZE] = -{ - 0xff, 0x25, /* jmp indirect */ - 0, 0, 0, 0, /* replaced with address of this symbol in .got. */ - 0x68, /* pushl immediate */ - 0, 0, 0, 0, /* replaced with offset into relocation table. */ - 0xe9, /* jmp relative */ - 0, 0, 0, 0 /* replaced with offset to start of .plt. */ -}; - -/* The first entry in a PIC procedure linkage table look like this. */ - -static const bfd_byte elf_i386_pic_plt0_entry[PLT_ENTRY_SIZE] = -{ - 0xff, 0xb3, 4, 0, 0, 0, /* pushl 4(%ebx) */ - 0xff, 0xa3, 8, 0, 0, 0, /* jmp *8(%ebx) */ - 0, 0, 0, 0 /* pad out to 16 bytes. */ -}; - -/* Subsequent entries in a PIC procedure linkage table look like this. */ - -static const bfd_byte elf_i386_pic_plt_entry[PLT_ENTRY_SIZE] = -{ - 0xff, 0xa3, /* jmp *offset(%ebx) */ - 0, 0, 0, 0, /* replaced with offset of this symbol in .got. */ - 0x68, /* pushl immediate */ - 0, 0, 0, 0, /* replaced with offset into relocation table. */ - 0xe9, /* jmp relative */ - 0, 0, 0, 0 /* replaced with offset to start of .plt. */ -}; - -/* Look through the relocs for a section during the first phase, and - allocate space in the global offset table or procedure linkage - table. */ - -static boolean -elf_i386_check_relocs (abfd, info, sec, relocs) - bfd *abfd; - struct bfd_link_info *info; - asection *sec; - const Elf_Internal_Rela *relocs; -{ - bfd *dynobj; - Elf_Internal_Shdr *symtab_hdr; - struct elf_link_hash_entry **sym_hashes; - bfd_vma *local_got_offsets; - const Elf_Internal_Rela *rel; - const Elf_Internal_Rela *rel_end; - asection *sgot; - asection *srelgot; - asection *sreloc; - - if (info->relocateable) - return true; - - dynobj = elf_hash_table (info)->dynobj; - symtab_hdr = &elf_tdata (abfd)->symtab_hdr; - sym_hashes = elf_sym_hashes (abfd); - local_got_offsets = elf_local_got_offsets (abfd); - - sgot = NULL; - srelgot = NULL; - sreloc = NULL; - - rel_end = relocs + sec->reloc_count; - for (rel = relocs; rel < rel_end; rel++) - { - unsigned long r_symndx; - struct elf_link_hash_entry *h; - - r_symndx = ELF32_R_SYM (rel->r_info); - - if (r_symndx < symtab_hdr->sh_info) - h = NULL; - else - h = sym_hashes[r_symndx - symtab_hdr->sh_info]; - - /* Some relocs require a global offset table. */ - if (dynobj == NULL) - { - switch (ELF32_R_TYPE (rel->r_info)) - { - case R_386_GOT32: - case R_386_GOTOFF: - case R_386_GOTPC: - elf_hash_table (info)->dynobj = dynobj = abfd; - if (! _bfd_elf_create_got_section (dynobj, info)) - return false; - break; - - default: - break; - } - } - - switch (ELF32_R_TYPE (rel->r_info)) - { - case R_386_GOT32: - /* This symbol requires a global offset table entry. */ - - if (sgot == NULL) - { - sgot = bfd_get_section_by_name (dynobj, ".got"); - BFD_ASSERT (sgot != NULL); - } - - if (srelgot == NULL - && (h != NULL || info->shared)) - { - srelgot = bfd_get_section_by_name (dynobj, ".rel.got"); - if (srelgot == NULL) - { - srelgot = bfd_make_section (dynobj, ".rel.got"); - if (srelgot == NULL - || ! bfd_set_section_flags (dynobj, srelgot, - (SEC_ALLOC - | SEC_LOAD - | SEC_HAS_CONTENTS - | SEC_IN_MEMORY - | SEC_READONLY)) - || ! bfd_set_section_alignment (dynobj, srelgot, 2)) - return false; - } - } - - if (h != NULL) - { - if (h->got_offset != (bfd_vma) -1) - { - /* We have already allocated space in the .got. */ - break; - } - h->got_offset = sgot->_raw_size; - - /* Make sure this symbol is output as a dynamic symbol. */ - if (h->dynindx == -1) - { - if (! bfd_elf32_link_record_dynamic_symbol (info, h)) - return false; - } - - srelgot->_raw_size += sizeof (Elf32_External_Rel); - } - else - { - /* This is a global offset table entry for a local - symbol. */ - if (local_got_offsets == NULL) - { - size_t size; - register unsigned int i; - - size = symtab_hdr->sh_info * sizeof (bfd_vma); - local_got_offsets = (bfd_vma *) bfd_alloc (abfd, size); - if (local_got_offsets == NULL) - return false; - elf_local_got_offsets (abfd) = local_got_offsets; - for (i = 0; i < symtab_hdr->sh_info; i++) - local_got_offsets[i] = (bfd_vma) -1; - } - if (local_got_offsets[r_symndx] != (bfd_vma) -1) - { - /* We have already allocated space in the .got. */ - break; - } - local_got_offsets[r_symndx] = sgot->_raw_size; - - if (info->shared) - { - /* If we are generating a shared object, we need to - output a R_386_RELATIVE reloc so that the dynamic - linker can adjust this GOT entry. */ - srelgot->_raw_size += sizeof (Elf32_External_Rel); - } - } - - sgot->_raw_size += 4; - - break; - - case R_386_PLT32: - /* This symbol requires a procedure linkage table entry. We - actually build the entry in adjust_dynamic_symbol, - because this might be a case of linking PIC code which is - never referenced by a dynamic object, in which case we - don't need to generate a procedure linkage table entry - after all. */ - - /* If this is a local symbol, we resolve it directly without - creating a procedure linkage table entry. */ - if (h == NULL) - continue; - - h->elf_link_hash_flags |= ELF_LINK_HASH_NEEDS_PLT; - - break; - - case R_386_32: - case R_386_PC32: - if (info->shared - && (sec->flags & SEC_ALLOC) != 0 - && (ELF32_R_TYPE (rel->r_info) != R_386_PC32 || h != NULL)) - { - /* When creating a shared object, we must copy these - reloc types into the output file. We create a reloc - section in dynobj and make room for this reloc. */ - if (sreloc == NULL) - { - const char *name; - - name = (bfd_elf_string_from_elf_section - (abfd, - elf_elfheader (abfd)->e_shstrndx, - elf_section_data (sec)->rel_hdr.sh_name)); - if (name == NULL) - return false; - - BFD_ASSERT (strncmp (name, ".rel", 4) == 0 - && strcmp (bfd_get_section_name (abfd, sec), - name + 4) == 0); - - sreloc = bfd_get_section_by_name (dynobj, name); - if (sreloc == NULL) - { - sreloc = bfd_make_section (dynobj, name); - if (sreloc == NULL - || ! bfd_set_section_flags (dynobj, sreloc, - (SEC_ALLOC - | SEC_LOAD - | SEC_HAS_CONTENTS - | SEC_IN_MEMORY - | SEC_READONLY)) - || ! bfd_set_section_alignment (dynobj, sreloc, 2)) - return false; - } - } - - sreloc->_raw_size += sizeof (Elf32_External_Rel); - } - - break; - - default: - break; - } - } - - return true; -} - -/* Adjust a symbol defined by a dynamic object and referenced by a - regular object. The current definition is in some section of the - dynamic object, but we're not including those sections. We have to - change the definition to something the rest of the link can - understand. */ - -static boolean -elf_i386_adjust_dynamic_symbol (info, h) - struct bfd_link_info *info; - struct elf_link_hash_entry *h; -{ - bfd *dynobj; - asection *s; - unsigned int power_of_two; - - dynobj = elf_hash_table (info)->dynobj; - - /* Make sure we know what is going on here. */ - BFD_ASSERT (dynobj != NULL - && ((h->elf_link_hash_flags & ELF_LINK_HASH_NEEDS_PLT) - || h->weakdef != NULL - || ((h->elf_link_hash_flags - & ELF_LINK_HASH_DEF_DYNAMIC) != 0 - && (h->elf_link_hash_flags - & ELF_LINK_HASH_REF_REGULAR) != 0 - && (h->elf_link_hash_flags - & ELF_LINK_HASH_DEF_REGULAR) == 0))); - - /* If this is a function, put it in the procedure linkage table. We - will fill in the contents of the procedure linkage table later, - when we know the address of the .got section. */ - if (h->type == STT_FUNC - || (h->elf_link_hash_flags & ELF_LINK_HASH_NEEDS_PLT) != 0) - { - if (! info->shared - && (h->elf_link_hash_flags & ELF_LINK_HASH_DEF_DYNAMIC) == 0 - && (h->elf_link_hash_flags & ELF_LINK_HASH_REF_DYNAMIC) == 0) - { - /* This case can occur if we saw a PLT32 reloc in an input - file, but the symbol was never referred to by a dynamic - object. In such a case, we don't actually need to build - a procedure linkage table, and we can just do a PC32 - reloc instead. */ - BFD_ASSERT ((h->elf_link_hash_flags & ELF_LINK_HASH_NEEDS_PLT) != 0); - return true; - } - - /* Make sure this symbol is output as a dynamic symbol. */ - if (h->dynindx == -1) - { - if (! bfd_elf32_link_record_dynamic_symbol (info, h)) - return false; - } - - s = bfd_get_section_by_name (dynobj, ".plt"); - BFD_ASSERT (s != NULL); - - /* If this is the first .plt entry, make room for the special - first entry. */ - if (s->_raw_size == 0) - s->_raw_size += PLT_ENTRY_SIZE; - - /* If this symbol is not defined in a regular file, and we are - not generating a shared library, then set the symbol to this - location in the .plt. This is required to make function - pointers compare as equal between the normal executable and - the shared library. */ - if (! info->shared - && (h->elf_link_hash_flags & ELF_LINK_HASH_DEF_REGULAR) == 0) - { - h->root.u.def.section = s; - h->root.u.def.value = s->_raw_size; - } - - h->plt_offset = s->_raw_size; - - /* Make room for this entry. */ - s->_raw_size += PLT_ENTRY_SIZE; - - /* We also need to make an entry in the .got.plt section, which - will be placed in the .got section by the linker script. */ - - s = bfd_get_section_by_name (dynobj, ".got.plt"); - BFD_ASSERT (s != NULL); - s->_raw_size += 4; - - /* We also need to make an entry in the .rel.plt section. */ - - s = bfd_get_section_by_name (dynobj, ".rel.plt"); - BFD_ASSERT (s != NULL); - s->_raw_size += sizeof (Elf32_External_Rel); - - return true; - } - - /* If this is a weak symbol, and there is a real definition, the - processor independent code will have arranged for us to see the - real definition first, and we can just use the same value. */ - if (h->weakdef != NULL) - { - BFD_ASSERT (h->weakdef->root.type == bfd_link_hash_defined - || h->weakdef->root.type == bfd_link_hash_defweak); - h->root.u.def.section = h->weakdef->root.u.def.section; - h->root.u.def.value = h->weakdef->root.u.def.value; - return true; - } - - /* This is a reference to a symbol defined by a dynamic object which - is not a function. */ - - /* If we are creating a shared library, we must presume that the - only references to the symbol are via the global offset table. - For such cases we need not do anything here; the relocations will - be handled correctly by relocate_section. */ - if (info->shared) - return true; - - /* We must allocate the symbol in our .dynbss section, which will - become part of the .bss section of the executable. There will be - an entry for this symbol in the .dynsym section. The dynamic - object will contain position independent code, so all references - from the dynamic object to this symbol will go through the global - offset table. The dynamic linker will use the .dynsym entry to - determine the address it must put in the global offset table, so - both the dynamic object and the regular object will refer to the - same memory location for the variable. */ - - s = bfd_get_section_by_name (dynobj, ".dynbss"); - BFD_ASSERT (s != NULL); - - /* If the symbol is currently defined in the .bss section of the - dynamic object, then it is OK to simply initialize it to zero. - If the symbol is in some other section, we must generate a - R_386_COPY reloc to tell the dynamic linker to copy the initial - value out of the dynamic object and into the runtime process - image. We need to remember the offset into the .rel.bss section - we are going to use. */ - if ((h->root.u.def.section->flags & SEC_LOAD) != 0) - { - asection *srel; - - srel = bfd_get_section_by_name (dynobj, ".rel.bss"); - BFD_ASSERT (srel != NULL); - srel->_raw_size += sizeof (Elf32_External_Rel); - h->elf_link_hash_flags |= ELF_LINK_HASH_NEEDS_COPY; - } - - /* We need to figure out the alignment required for this symbol. I - have no idea how ELF linkers handle this. */ - power_of_two = bfd_log2 (h->size); - if (power_of_two > 3) - power_of_two = 3; - - /* Apply the required alignment. */ - s->_raw_size = BFD_ALIGN (s->_raw_size, - (bfd_size_type) (1 << power_of_two)); - if (power_of_two > bfd_get_section_alignment (dynobj, s)) - { - if (! bfd_set_section_alignment (dynobj, s, power_of_two)) - return false; - } - - /* Define the symbol as being at this point in the section. */ - h->root.u.def.section = s; - h->root.u.def.value = s->_raw_size; - - /* Increment the section size to make room for the symbol. */ - s->_raw_size += h->size; - - return true; -} - -/* Set the sizes of the dynamic sections. */ - -static boolean -elf_i386_size_dynamic_sections (output_bfd, info) - bfd *output_bfd; - struct bfd_link_info *info; -{ - bfd *dynobj; - asection *s; - boolean plt; - boolean relocs; - boolean reltext; - - dynobj = elf_hash_table (info)->dynobj; - BFD_ASSERT (dynobj != NULL); - - if (elf_hash_table (info)->dynamic_sections_created) - { - /* Set the contents of the .interp section to the interpreter. */ - if (! info->shared) - { - s = bfd_get_section_by_name (dynobj, ".interp"); - BFD_ASSERT (s != NULL); - s->_raw_size = sizeof ELF_DYNAMIC_INTERPRETER; - s->contents = (unsigned char *) ELF_DYNAMIC_INTERPRETER; - } - } - else - { - /* We may have created entries in the .rel.got section. - However, if we are not creating the dynamic sections, we will - not actually use these entries. Reset the size of .rel.got, - which will cause it to get stripped from the output file - below. */ - s = bfd_get_section_by_name (dynobj, ".rel.got"); - if (s != NULL) - s->_raw_size = 0; - } - - /* The check_relocs and adjust_dynamic_symbol entry points have - determined the sizes of the various dynamic sections. Allocate - memory for them. */ - plt = false; - relocs = false; - reltext = false; - for (s = dynobj->sections; s != NULL; s = s->next) - { - const char *name; - boolean strip; - - if ((s->flags & SEC_IN_MEMORY) == 0) - continue; - - /* It's OK to base decisions on the section name, because none - of the dynobj section names depend upon the input files. */ - name = bfd_get_section_name (dynobj, s); - - strip = false; - - if (strcmp (name, ".plt") == 0) - { - if (s->_raw_size == 0) - { - /* Strip this section if we don't need it; see the - comment below. */ - strip = true; - } - else - { - /* Remember whether there is a PLT. */ - plt = true; - } - } - else if (strncmp (name, ".rel", 4) == 0) - { - if (s->_raw_size == 0) - { - /* If we don't need this section, strip it from the - output file. This is mostly to handle .rel.bss and - .rel.plt. We must create both sections in - create_dynamic_sections, because they must be created - before the linker maps input sections to output - sections. The linker does that before - adjust_dynamic_symbol is called, and it is that - function which decides whether anything needs to go - into these sections. */ - strip = true; - } - else - { - asection *target; - - /* Remember whether there are any reloc sections other - than .rel.plt. */ - if (strcmp (name, ".rel.plt") != 0) - { - relocs = true; - - /* If this relocation section applies to a read only - section, then we probably need a DT_TEXTREL - entry. The entries in the .rel.plt section - really apply to the .got section, which we - created ourselves and so know is not readonly. */ - target = bfd_get_section_by_name (output_bfd, name + 4); - if (target != NULL - && (target->flags & SEC_READONLY) != 0) - reltext = true; - } - - /* We use the reloc_count field as a counter if we need - to copy relocs into the output file. */ - s->reloc_count = 0; - } - } - else if (strncmp (name, ".got", 4) != 0) - { - /* It's not one of our sections, so don't allocate space. */ - continue; - } - - if (strip) - { - asection **spp; - - for (spp = &s->output_section->owner->sections; - *spp != s->output_section; - spp = &(*spp)->next) - ; - *spp = s->output_section->next; - --s->output_section->owner->section_count; - - continue; - } - - /* Allocate memory for the section contents. */ - s->contents = (bfd_byte *) bfd_alloc (dynobj, s->_raw_size); - if (s->contents == NULL && s->_raw_size != 0) - return false; - } - - if (elf_hash_table (info)->dynamic_sections_created) - { - /* Add some entries to the .dynamic section. We fill in the - values later, in elf_i386_finish_dynamic_sections, but we - must add the entries now so that we get the correct size for - the .dynamic section. The DT_DEBUG entry is filled in by the - dynamic linker and used by the debugger. */ - if (! info->shared) - { - if (! bfd_elf32_add_dynamic_entry (info, DT_DEBUG, 0)) - return false; - } - - if (plt) - { - if (! bfd_elf32_add_dynamic_entry (info, DT_PLTGOT, 0) - || ! bfd_elf32_add_dynamic_entry (info, DT_PLTRELSZ, 0) - || ! bfd_elf32_add_dynamic_entry (info, DT_PLTREL, DT_REL) - || ! bfd_elf32_add_dynamic_entry (info, DT_JMPREL, 0)) - return false; - } - - if (relocs) - { - if (! bfd_elf32_add_dynamic_entry (info, DT_REL, 0) - || ! bfd_elf32_add_dynamic_entry (info, DT_RELSZ, 0) - || ! bfd_elf32_add_dynamic_entry (info, DT_RELENT, - sizeof (Elf32_External_Rel))) - return false; - } - - if (reltext) - { - if (! bfd_elf32_add_dynamic_entry (info, DT_TEXTREL, 0)) - return false; - } - } - - return true; -} - -/* Relocate an i386 ELF section. */ - -static boolean -elf_i386_relocate_section (output_bfd, info, input_bfd, input_section, - contents, relocs, local_syms, local_sections) - bfd *output_bfd; - struct bfd_link_info *info; - bfd *input_bfd; - asection *input_section; - bfd_byte *contents; - Elf_Internal_Rela *relocs; - Elf_Internal_Sym *local_syms; - asection **local_sections; -{ - bfd *dynobj; - Elf_Internal_Shdr *symtab_hdr; - struct elf_link_hash_entry **sym_hashes; - bfd_vma *local_got_offsets; - asection *sgot; - asection *splt; - asection *sreloc; - Elf_Internal_Rela *rel; - Elf_Internal_Rela *relend; - - dynobj = elf_hash_table (info)->dynobj; - symtab_hdr = &elf_tdata (input_bfd)->symtab_hdr; - sym_hashes = elf_sym_hashes (input_bfd); - local_got_offsets = elf_local_got_offsets (input_bfd); - - sgot = NULL; - splt = NULL; - sreloc = NULL; - - rel = relocs; - relend = relocs + input_section->reloc_count; - for (; rel < relend; rel++) - { - int r_type; - reloc_howto_type *howto; - unsigned long r_symndx; - struct elf_link_hash_entry *h; - Elf_Internal_Sym *sym; - asection *sec; - bfd_vma relocation; - bfd_reloc_status_type r; - - r_type = ELF32_R_TYPE (rel->r_info); - if (r_type < 0 || r_type >= (int) R_386_max) - { - bfd_set_error (bfd_error_bad_value); - return false; - } - howto = elf_howto_table + r_type; - - r_symndx = ELF32_R_SYM (rel->r_info); - - if (info->relocateable) - { - /* This is a relocateable link. We don't have to change - anything, unless the reloc is against a section symbol, - in which case we have to adjust according to where the - section symbol winds up in the output section. */ - if (r_symndx < symtab_hdr->sh_info) - { - sym = local_syms + r_symndx; - if (ELF_ST_TYPE (sym->st_info) == STT_SECTION) - { - bfd_vma val; - - sec = local_sections[r_symndx]; - val = bfd_get_32 (input_bfd, contents + rel->r_offset); - val += sec->output_offset + sym->st_value; - bfd_put_32 (input_bfd, val, contents + rel->r_offset); - } - } - - continue; - } - - /* This is a final link. */ - h = NULL; - sym = NULL; - sec = NULL; - if (r_symndx < symtab_hdr->sh_info) - { - sym = local_syms + r_symndx; - sec = local_sections[r_symndx]; - relocation = (sec->output_section->vma - + sec->output_offset - + sym->st_value); - } - else - { - h = sym_hashes[r_symndx - symtab_hdr->sh_info]; - while (h->root.type == bfd_link_hash_indirect - || h->root.type == bfd_link_hash_warning) - h = (struct elf_link_hash_entry *) h->root.u.i.link; - if (h->root.type == bfd_link_hash_defined - || h->root.type == bfd_link_hash_defweak) - { - sec = h->root.u.def.section; - if (r_type == R_386_GOTPC - || (r_type == R_386_PLT32 - && h->plt_offset != (bfd_vma) -1) - || (r_type == R_386_GOT32 - && elf_hash_table (info)->dynamic_sections_created - && (! info->shared - || ! info->symbolic - || (h->elf_link_hash_flags - & ELF_LINK_HASH_DEF_REGULAR) == 0)) - || (info->shared - && (! info->symbolic - || (h->elf_link_hash_flags - & ELF_LINK_HASH_DEF_REGULAR) == 0) - && (r_type == R_386_32 - || r_type == R_386_PC32) - && (input_section->flags & SEC_ALLOC) != 0)) - { - /* In these cases, we don't need the relocation - value. We check specially because in some - obscure cases sec->output_section will be NULL. */ - relocation = 0; - } - else - relocation = (h->root.u.def.value - + sec->output_section->vma - + sec->output_offset); - } - else if (h->root.type == bfd_link_hash_undefweak) - relocation = 0; - else if (info->shared && !info->symbolic) - relocation = 0; - else - { - if (! ((*info->callbacks->undefined_symbol) - (info, h->root.root.string, input_bfd, - input_section, rel->r_offset))) - return false; - relocation = 0; - } - } - - switch (r_type) - { - case R_386_GOT32: - /* Relocation is to the entry for this symbol in the global - offset table. */ - if (sgot == NULL) - { - sgot = bfd_get_section_by_name (dynobj, ".got"); - BFD_ASSERT (sgot != NULL); - } - - if (h != NULL) - { - bfd_vma off; - - off = h->got_offset; - BFD_ASSERT (off != (bfd_vma) -1); - - if (! elf_hash_table (info)->dynamic_sections_created - || (info->shared - && info->symbolic - && (h->elf_link_hash_flags & ELF_LINK_HASH_DEF_REGULAR))) - { - /* This is actually a static link, or it is a - -Bsymbolic link and the symbol is defined - locally. We must initialize this entry in the - global offset table. Since the offset must - always be a multiple of 4, we use the least - significant bit to record whether we have - initialized it already. - - When doing a dynamic link, we create a .rel.got - relocation entry to initialize the value. This - is done in the finish_dynamic_symbol routine. */ - if ((off & 1) != 0) - off &= ~1; - else - { - bfd_put_32 (output_bfd, relocation, - sgot->contents + off); - h->got_offset |= 1; - } - } - - relocation = sgot->output_offset + off; - } - else - { - bfd_vma off; - - BFD_ASSERT (local_got_offsets != NULL - && local_got_offsets[r_symndx] != (bfd_vma) -1); - - off = local_got_offsets[r_symndx]; - - /* The offset must always be a multiple of 4. We use - the least significant bit to record whether we have - already generated the necessary reloc. */ - if ((off & 1) != 0) - off &= ~1; - else - { - bfd_put_32 (output_bfd, relocation, sgot->contents + off); - - if (info->shared) - { - asection *srelgot; - Elf_Internal_Rel outrel; - - srelgot = bfd_get_section_by_name (dynobj, ".rel.got"); - BFD_ASSERT (srelgot != NULL); - - outrel.r_offset = (sgot->output_section->vma - + sgot->output_offset - + off); - outrel.r_info = ELF32_R_INFO (0, R_386_RELATIVE); - bfd_elf32_swap_reloc_out (output_bfd, &outrel, - (((Elf32_External_Rel *) - srelgot->contents) - + srelgot->reloc_count)); - ++srelgot->reloc_count; - } - - local_got_offsets[r_symndx] |= 1; - } - - relocation = sgot->output_offset + off; - } - - break; - - case R_386_GOTOFF: - /* Relocation is relative to the start of the global offset - table. */ - - if (sgot == NULL) - { - sgot = bfd_get_section_by_name (dynobj, ".got"); - BFD_ASSERT (sgot != NULL); - } - - /* Note that sgot->output_offset is not involved in this - calculation. We always want the start of .got. If we - defined _GLOBAL_OFFSET_TABLE in a different way, as is - permitted by the ABI, we might have to change this - calculation. */ - relocation -= sgot->output_section->vma; - - break; - - case R_386_GOTPC: - /* Use global offset table as symbol value. */ - - if (sgot == NULL) - { - sgot = bfd_get_section_by_name (dynobj, ".got"); - BFD_ASSERT (sgot != NULL); - } - - relocation = sgot->output_section->vma; - - break; - - case R_386_PLT32: - /* Relocation is to the entry for this symbol in the - procedure linkage table. */ - - /* Resolve a PLT32 reloc again a local symbol directly, - without using the procedure linkage table. */ - if (h == NULL) - break; - - if (h->plt_offset == (bfd_vma) -1) - { - /* We didn't make a PLT entry for this symbol. This - happens when statically linking PIC code, or when - using -Bsymbolic. */ - break; - } - - if (splt == NULL) - { - splt = bfd_get_section_by_name (dynobj, ".plt"); - BFD_ASSERT (splt != NULL); - } - - relocation = (splt->output_section->vma - + splt->output_offset - + h->plt_offset); - - break; - - case R_386_32: - case R_386_PC32: - if (info->shared - && (input_section->flags & SEC_ALLOC) != 0 - && (r_type != R_386_PC32 - || (h != NULL - && (! info->symbolic - || (h->elf_link_hash_flags - & ELF_LINK_HASH_DEF_REGULAR) == 0)))) - { - Elf_Internal_Rel outrel; - boolean relocate; - - /* When generating a shared object, these relocations - are copied into the output file to be resolved at run - time. */ - - if (sreloc == NULL) - { - const char *name; - - name = (bfd_elf_string_from_elf_section - (input_bfd, - elf_elfheader (input_bfd)->e_shstrndx, - elf_section_data (input_section)->rel_hdr.sh_name)); - if (name == NULL) - return false; - - BFD_ASSERT (strncmp (name, ".rel", 4) == 0 - && strcmp (bfd_get_section_name (input_bfd, - input_section), - name + 4) == 0); - - sreloc = bfd_get_section_by_name (dynobj, name); - BFD_ASSERT (sreloc != NULL); - } - - outrel.r_offset = (rel->r_offset - + input_section->output_section->vma - + input_section->output_offset); - if (r_type == R_386_PC32) - { - BFD_ASSERT (h != NULL && h->dynindx != -1); - relocate = false; - outrel.r_info = ELF32_R_INFO (h->dynindx, R_386_PC32); - } - else - { - if (h == NULL - || (info->symbolic - && (h->elf_link_hash_flags - & ELF_LINK_HASH_DEF_REGULAR) != 0)) - { - relocate = true; - outrel.r_info = ELF32_R_INFO (0, R_386_RELATIVE); - } - else - { - BFD_ASSERT (h->dynindx != -1); - relocate = false; - outrel.r_info = ELF32_R_INFO (h->dynindx, R_386_32); - } - } - - bfd_elf32_swap_reloc_out (output_bfd, &outrel, - (((Elf32_External_Rel *) - sreloc->contents) - + sreloc->reloc_count)); - ++sreloc->reloc_count; - - /* If this reloc is against an external symbol, we do - not want to fiddle with the addend. Otherwise, we - need to include the symbol value so that it becomes - an addend for the dynamic reloc. */ - if (! relocate) - continue; - } - - break; - - default: - break; - } - - r = _bfd_final_link_relocate (howto, input_bfd, input_section, - contents, rel->r_offset, - relocation, (bfd_vma) 0); - - if (r != bfd_reloc_ok) - { - switch (r) - { - default: - case bfd_reloc_outofrange: - abort (); - case bfd_reloc_overflow: - { - const char *name; - - if (h != NULL) - name = h->root.root.string; - else - { - name = bfd_elf_string_from_elf_section (input_bfd, - symtab_hdr->sh_link, - sym->st_name); - if (name == NULL) - return false; - if (*name == '\0') - name = bfd_section_name (input_bfd, sec); - } - if (! ((*info->callbacks->reloc_overflow) - (info, name, howto->name, (bfd_vma) 0, - input_bfd, input_section, rel->r_offset))) - return false; - } - break; - } - } - } - - return true; -} - -/* Finish up dynamic symbol handling. We set the contents of various - dynamic sections here. */ - -static boolean -elf_i386_finish_dynamic_symbol (output_bfd, info, h, sym) - bfd *output_bfd; - struct bfd_link_info *info; - struct elf_link_hash_entry *h; - Elf_Internal_Sym *sym; -{ - bfd *dynobj; - - dynobj = elf_hash_table (info)->dynobj; - - if (h->plt_offset != (bfd_vma) -1) - { - asection *splt; - asection *sgot; - asection *srel; - bfd_vma plt_index; - bfd_vma got_offset; - Elf_Internal_Rel rel; - - /* This symbol has an entry in the procedure linkage table. Set - it up. */ - - BFD_ASSERT (h->dynindx != -1); - - splt = bfd_get_section_by_name (dynobj, ".plt"); - sgot = bfd_get_section_by_name (dynobj, ".got.plt"); - srel = bfd_get_section_by_name (dynobj, ".rel.plt"); - BFD_ASSERT (splt != NULL && sgot != NULL && srel != NULL); - - /* Get the index in the procedure linkage table which - corresponds to this symbol. This is the index of this symbol - in all the symbols for which we are making plt entries. The - first entry in the procedure linkage table is reserved. */ - plt_index = h->plt_offset / PLT_ENTRY_SIZE - 1; - - /* Get the offset into the .got table of the entry that - corresponds to this function. Each .got entry is 4 bytes. - The first three are reserved. */ - got_offset = (plt_index + 3) * 4; - - /* Fill in the entry in the procedure linkage table. */ - if (! info->shared) - { - memcpy (splt->contents + h->plt_offset, elf_i386_plt_entry, - PLT_ENTRY_SIZE); - bfd_put_32 (output_bfd, - (sgot->output_section->vma - + sgot->output_offset - + got_offset), - splt->contents + h->plt_offset + 2); - } - else - { - memcpy (splt->contents + h->plt_offset, elf_i386_pic_plt_entry, - PLT_ENTRY_SIZE); - bfd_put_32 (output_bfd, got_offset, - splt->contents + h->plt_offset + 2); - } - - bfd_put_32 (output_bfd, plt_index * sizeof (Elf32_External_Rel), - splt->contents + h->plt_offset + 7); - bfd_put_32 (output_bfd, - (h->plt_offset + PLT_ENTRY_SIZE), - splt->contents + h->plt_offset + 12); - - /* Fill in the entry in the global offset table. */ - bfd_put_32 (output_bfd, - (splt->output_section->vma - + splt->output_offset - + h->plt_offset - + 6), - sgot->contents + got_offset); - - /* Fill in the entry in the .rel.plt section. */ - rel.r_offset = (sgot->output_section->vma - + sgot->output_offset - + got_offset); - rel.r_info = ELF32_R_INFO (h->dynindx, R_386_JUMP_SLOT); - bfd_elf32_swap_reloc_out (output_bfd, &rel, - ((Elf32_External_Rel *) srel->contents - + plt_index)); - - if ((h->elf_link_hash_flags & ELF_LINK_HASH_DEF_REGULAR) == 0) - { - /* Mark the symbol as undefined, rather than as defined in - the .plt section. Leave the value alone. */ - sym->st_shndx = SHN_UNDEF; - } - } - - if (h->got_offset != (bfd_vma) -1) - { - asection *sgot; - asection *srel; - Elf_Internal_Rel rel; - - /* This symbol has an entry in the global offset table. Set it - up. */ - - BFD_ASSERT (h->dynindx != -1); - - sgot = bfd_get_section_by_name (dynobj, ".got"); - srel = bfd_get_section_by_name (dynobj, ".rel.got"); - BFD_ASSERT (sgot != NULL && srel != NULL); - - rel.r_offset = (sgot->output_section->vma - + sgot->output_offset - + (h->got_offset &~ 1)); - - /* If this is a -Bsymbolic link, and the symbol is defined - locally, we just want to emit a RELATIVE reloc. The entry in - the global offset table will already have been initialized in - the relocate_section function. */ - if (info->shared - && info->symbolic - && (h->elf_link_hash_flags & ELF_LINK_HASH_DEF_REGULAR)) - rel.r_info = ELF32_R_INFO (0, R_386_RELATIVE); - else - { - bfd_put_32 (output_bfd, (bfd_vma) 0, sgot->contents + h->got_offset); - rel.r_info = ELF32_R_INFO (h->dynindx, R_386_GLOB_DAT); - } - - bfd_elf32_swap_reloc_out (output_bfd, &rel, - ((Elf32_External_Rel *) srel->contents - + srel->reloc_count)); - ++srel->reloc_count; - } - - if ((h->elf_link_hash_flags & ELF_LINK_HASH_NEEDS_COPY) != 0) - { - asection *s; - Elf_Internal_Rel rel; - - /* This symbol needs a copy reloc. Set it up. */ - - BFD_ASSERT (h->dynindx != -1 - && (h->root.type == bfd_link_hash_defined - || h->root.type == bfd_link_hash_defweak)); - - s = bfd_get_section_by_name (h->root.u.def.section->owner, - ".rel.bss"); - BFD_ASSERT (s != NULL); - - rel.r_offset = (h->root.u.def.value - + h->root.u.def.section->output_section->vma - + h->root.u.def.section->output_offset); - rel.r_info = ELF32_R_INFO (h->dynindx, R_386_COPY); - bfd_elf32_swap_reloc_out (output_bfd, &rel, - ((Elf32_External_Rel *) s->contents - + s->reloc_count)); - ++s->reloc_count; - } - - /* Mark _DYNAMIC and _GLOBAL_OFFSET_TABLE_ as absolute. */ - if (strcmp (h->root.root.string, "_DYNAMIC") == 0 - || strcmp (h->root.root.string, "_GLOBAL_OFFSET_TABLE_") == 0) - sym->st_shndx = SHN_ABS; - - return true; -} - -/* Finish up the dynamic sections. */ - -static boolean -elf_i386_finish_dynamic_sections (output_bfd, info) - bfd *output_bfd; - struct bfd_link_info *info; -{ - bfd *dynobj; - asection *sgot; - asection *sdyn; - - dynobj = elf_hash_table (info)->dynobj; - - sgot = bfd_get_section_by_name (dynobj, ".got.plt"); - BFD_ASSERT (sgot != NULL); - sdyn = bfd_get_section_by_name (dynobj, ".dynamic"); - - if (elf_hash_table (info)->dynamic_sections_created) - { - asection *splt; - Elf32_External_Dyn *dyncon, *dynconend; - - splt = bfd_get_section_by_name (dynobj, ".plt"); - BFD_ASSERT (splt != NULL && sdyn != NULL); - - dyncon = (Elf32_External_Dyn *) sdyn->contents; - dynconend = (Elf32_External_Dyn *) (sdyn->contents + sdyn->_raw_size); - for (; dyncon < dynconend; dyncon++) - { - Elf_Internal_Dyn dyn; - const char *name; - asection *s; - - bfd_elf32_swap_dyn_in (dynobj, dyncon, &dyn); - - switch (dyn.d_tag) - { - default: - break; - - case DT_PLTGOT: - name = ".got"; - goto get_vma; - case DT_JMPREL: - name = ".rel.plt"; - get_vma: - s = bfd_get_section_by_name (output_bfd, name); - BFD_ASSERT (s != NULL); - dyn.d_un.d_ptr = s->vma; - bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon); - break; - - case DT_PLTRELSZ: - s = bfd_get_section_by_name (output_bfd, ".rel.plt"); - BFD_ASSERT (s != NULL); - if (s->_cooked_size != 0) - dyn.d_un.d_val = s->_cooked_size; - else - dyn.d_un.d_val = s->_raw_size; - bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon); - break; - - case DT_RELSZ: - /* My reading of the SVR4 ABI indicates that the - procedure linkage table relocs (DT_JMPREL) should be - included in the overall relocs (DT_REL). This is - what Solaris does. However, UnixWare can not handle - that case. Therefore, we override the DT_RELSZ entry - here to make it not include the JMPREL relocs. Since - the linker script arranges for .rel.plt to follow all - other relocation sections, we don't have to worry - about changing the DT_REL entry. */ - s = bfd_get_section_by_name (output_bfd, ".rel.plt"); - if (s != NULL) - { - if (s->_cooked_size != 0) - dyn.d_un.d_val -= s->_cooked_size; - else - dyn.d_un.d_val -= s->_raw_size; - } - bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon); - break; - } - } - - /* Fill in the first entry in the procedure linkage table. */ - if (splt->_raw_size > 0) - { - if (info->shared) - memcpy (splt->contents, elf_i386_pic_plt0_entry, PLT_ENTRY_SIZE); - else - { - memcpy (splt->contents, elf_i386_plt0_entry, PLT_ENTRY_SIZE); - bfd_put_32 (output_bfd, - sgot->output_section->vma + sgot->output_offset + 4, - splt->contents + 2); - bfd_put_32 (output_bfd, - sgot->output_section->vma + sgot->output_offset + 8, - splt->contents + 8); - } - } - - /* UnixWare sets the entsize of .plt to 4, although that doesn't - really seem like the right value. */ - elf_section_data (splt->output_section)->this_hdr.sh_entsize = 4; - } - - /* Fill in the first three entries in the global offset table. */ - if (sgot->_raw_size > 0) - { - if (sdyn == NULL) - bfd_put_32 (output_bfd, (bfd_vma) 0, sgot->contents); - else - bfd_put_32 (output_bfd, - sdyn->output_section->vma + sdyn->output_offset, - sgot->contents); - bfd_put_32 (output_bfd, (bfd_vma) 0, sgot->contents + 4); - bfd_put_32 (output_bfd, (bfd_vma) 0, sgot->contents + 8); - } - - elf_section_data (sgot->output_section)->this_hdr.sh_entsize = 4; - - return true; -} - -#define TARGET_LITTLE_SYM bfd_elf32_i386_vec -#define TARGET_LITTLE_NAME "elf32-i386" -#define ELF_ARCH bfd_arch_i386 -#define ELF_MACHINE_CODE EM_386 -#define elf_info_to_howto elf_i386_info_to_howto -#define elf_info_to_howto_rel elf_i386_info_to_howto_rel -#define bfd_elf32_bfd_reloc_type_lookup elf_i386_reloc_type_lookup -#define ELF_MAXPAGESIZE 0x1000 -#define elf_backend_create_dynamic_sections \ - _bfd_elf_create_dynamic_sections -#define elf_backend_check_relocs elf_i386_check_relocs -#define elf_backend_adjust_dynamic_symbol \ - elf_i386_adjust_dynamic_symbol -#define elf_backend_size_dynamic_sections \ - elf_i386_size_dynamic_sections -#define elf_backend_relocate_section elf_i386_relocate_section -#define elf_backend_finish_dynamic_symbol \ - elf_i386_finish_dynamic_symbol -#define elf_backend_finish_dynamic_sections \ - elf_i386_finish_dynamic_sections -#define elf_backend_want_got_plt 1 -#define elf_backend_plt_readonly 1 -#define elf_backend_want_plt_sym 0 - -#include "elf32-target.h" diff --git a/contrib/gdb/bfd/elf32-i860.c b/contrib/gdb/bfd/elf32-i860.c deleted file mode 100644 index a8537a75508fa..0000000000000 --- a/contrib/gdb/bfd/elf32-i860.c +++ /dev/null @@ -1,33 +0,0 @@ -/* Intel 860 specific support for 32-bit ELF - Copyright 1993 Free Software Foundation, Inc. - -This file is part of BFD, the Binary File Descriptor library. - -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 2 of the License, 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ - -#include "bfd.h" -#include "sysdep.h" -#include "libbfd.h" -#include "elf-bfd.h" - -#define bfd_elf32_bfd_reloc_type_lookup bfd_default_reloc_type_lookup -#define elf_info_to_howto _bfd_elf_no_info_to_howto - -#define TARGET_BIG_SYM bfd_elf32_i860_vec -#define TARGET_BIG_NAME "elf32-i860" -#define ELF_ARCH bfd_arch_i860 -#define ELF_MACHINE_CODE EM_860 - -#include "elf32-target.h" diff --git a/contrib/gdb/bfd/elf32-m68k.c b/contrib/gdb/bfd/elf32-m68k.c deleted file mode 100644 index 752dfaed22705..0000000000000 --- a/contrib/gdb/bfd/elf32-m68k.c +++ /dev/null @@ -1,1600 +0,0 @@ -/* Motorola 68k series support for 32-bit ELF - Copyright 1993, 1995, 1996 Free Software Foundation, Inc. - -This file is part of BFD, the Binary File Descriptor library. - -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 2 of the License, 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ - -#include "bfd.h" -#include "sysdep.h" -#include "bfdlink.h" -#include "libbfd.h" -#include "elf-bfd.h" - -static reloc_howto_type *reloc_type_lookup - PARAMS ((bfd *, bfd_reloc_code_real_type)); -static void rtype_to_howto - PARAMS ((bfd *, arelent *, Elf32_Internal_Rela *)); -static void rtype_to_howto_rel - PARAMS ((bfd *, arelent *, Elf32_Internal_Rel *)); -static boolean elf_m68k_check_relocs - PARAMS ((bfd *, struct bfd_link_info *, asection *, - const Elf_Internal_Rela *)); -static boolean elf_m68k_adjust_dynamic_symbol - PARAMS ((struct bfd_link_info *, struct elf_link_hash_entry *)); -static boolean elf_m68k_size_dynamic_sections - PARAMS ((bfd *, struct bfd_link_info *)); -static boolean elf_m68k_relocate_section - PARAMS ((bfd *, struct bfd_link_info *, bfd *, asection *, bfd_byte *, - Elf_Internal_Rela *, Elf_Internal_Sym *, asection **)); -static boolean elf_m68k_finish_dynamic_symbol - PARAMS ((bfd *, struct bfd_link_info *, struct elf_link_hash_entry *, - Elf_Internal_Sym *)); -static boolean elf_m68k_finish_dynamic_sections - PARAMS ((bfd *, struct bfd_link_info *)); - -/* elf32 m68k code, generated by elf.el */ -enum reloc_type { - R_68K_NONE = 0, - R_68K_32 = 1, - R_68K_16 = 2, - R_68K_8 = 3, - R_68K_PC32 = 4, - R_68K_PC16 = 5, - R_68K_PC8 = 6, - R_68K_GOT32 = 7, - R_68K_GOT16 = 8, - R_68K_GOT8 = 9, - R_68K_GOT32O = 10, - R_68K_GOT16O = 11, - R_68K_GOT8O = 12, - R_68K_PLT32 = 13, - R_68K_PLT16 = 14, - R_68K_PLT8 = 15, - R_68K_PLT32O = 16, - R_68K_PLT16O = 17, - R_68K_PLT8O = 18, - R_68K_COPY = 19, - R_68K_GLOB_DAT = 20, - R_68K_JMP_SLOT = 21, - R_68K_RELATIVE = 22, - R_68K__max -}; - -static reloc_howto_type howto_table[] = { - HOWTO(R_68K_NONE, 0, 0, 0, false,0, complain_overflow_dont, bfd_elf_generic_reloc, "R_68K_NONE", false, 0, 0x00000000,false), - HOWTO(R_68K_32, 0, 2,32, false,0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_68K_32", false, 0, 0xffffffff,false), - HOWTO(R_68K_16, 0, 1,16, false,0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_68K_16", false, 0, 0x0000ffff,false), - HOWTO(R_68K_8, 0, 0, 8, false,0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_68K_8", false, 0, 0x000000ff,false), - HOWTO(R_68K_PC32, 0, 2,32, true, 0, complain_overflow_signed, bfd_elf_generic_reloc, "R_68K_PC32", false, 0, 0xffffffff,true), - HOWTO(R_68K_PC16, 0, 1,16, true, 0, complain_overflow_signed, bfd_elf_generic_reloc, "R_68K_PC16", false, 0, 0x0000ffff,true), - HOWTO(R_68K_PC8, 0, 0, 8, true, 0, complain_overflow_signed, bfd_elf_generic_reloc, "R_68K_PC8", false, 0, 0x000000ff,true), - HOWTO(R_68K_GOT32, 0, 2,32, true, 0, complain_overflow_signed, bfd_elf_generic_reloc, "R_68K_GOT32", false, 0, 0xffffffff,true), - HOWTO(R_68K_GOT16, 0, 1,16, true, 0, complain_overflow_signed, bfd_elf_generic_reloc, "R_68K_GOT16", false, 0, 0x0000ffff,true), - HOWTO(R_68K_GOT8, 0, 0, 8, true, 0, complain_overflow_signed, bfd_elf_generic_reloc, "R_68K_GOT8", false, 0, 0x000000ff,true), - HOWTO(R_68K_GOT32O, 0, 2,32, false,0, complain_overflow_signed, bfd_elf_generic_reloc, "R_68K_GOT32O", false, 0, 0xffffffff,false), - HOWTO(R_68K_GOT16O, 0, 1,16, false,0, complain_overflow_signed, bfd_elf_generic_reloc, "R_68K_GOT16O", false, 0, 0x0000ffff,false), - HOWTO(R_68K_GOT8O, 0, 0, 8, false,0, complain_overflow_signed, bfd_elf_generic_reloc, "R_68K_GOT8O", false, 0, 0x000000ff,false), - HOWTO(R_68K_PLT32, 0, 2,32, true, 0, complain_overflow_signed, bfd_elf_generic_reloc, "R_68K_PLT32", false, 0, 0xffffffff,true), - HOWTO(R_68K_PLT16, 0, 1,16, true, 0, complain_overflow_signed, bfd_elf_generic_reloc, "R_68K_PLT16", false, 0, 0x0000ffff,true), - HOWTO(R_68K_PLT8, 0, 0, 8, true, 0, complain_overflow_signed, bfd_elf_generic_reloc, "R_68K_PLT8", false, 0, 0x000000ff,true), - HOWTO(R_68K_PLT32O, 0, 2,32, false,0, complain_overflow_signed, bfd_elf_generic_reloc, "R_68K_PLT32O", false, 0, 0xffffffff,false), - HOWTO(R_68K_PLT16O, 0, 1,16, false,0, complain_overflow_signed, bfd_elf_generic_reloc, "R_68K_PLT16O", false, 0, 0x0000ffff,false), - HOWTO(R_68K_PLT8O, 0, 0, 8, false,0, complain_overflow_signed, bfd_elf_generic_reloc, "R_68K_PLT8O", false, 0, 0x000000ff,false), - HOWTO(R_68K_COPY, 0, 0, 0, false,0, complain_overflow_dont, bfd_elf_generic_reloc, "R_68K_COPY", false, 0, 0xffffffff,false), - HOWTO(R_68K_GLOB_DAT, 0, 2,32, false,0, complain_overflow_dont, bfd_elf_generic_reloc, "R_68K_GLOB_DAT", false, 0, 0xffffffff,false), - HOWTO(R_68K_JMP_SLOT, 0, 2,32, false,0, complain_overflow_dont, bfd_elf_generic_reloc, "R_68K_JMP_SLOT", false, 0, 0xffffffff,false), - HOWTO(R_68K_RELATIVE, 0, 2,32, false,0, complain_overflow_dont, bfd_elf_generic_reloc, "R_68K_RELATIVE", false, 0, 0xffffffff,false), -}; - -static void -rtype_to_howto (abfd, cache_ptr, dst) - bfd *abfd; - arelent *cache_ptr; - Elf_Internal_Rela *dst; -{ - BFD_ASSERT (ELF32_R_TYPE(dst->r_info) < (unsigned int) R_68K__max); - cache_ptr->howto = &howto_table[ELF32_R_TYPE(dst->r_info)]; -} - -static void -rtype_to_howto_rel (abfd, cache_ptr, dst) - bfd *abfd; - arelent *cache_ptr; - Elf_Internal_Rel *dst; -{ - BFD_ASSERT (ELF32_R_TYPE(dst->r_info) < (unsigned int) R_68K__max); - cache_ptr->howto = &howto_table[ELF32_R_TYPE(dst->r_info)]; -} - -#define elf_info_to_howto rtype_to_howto -#define elf_info_to_howto_rel rtype_to_howto_rel - -static const struct { unsigned char bfd_val, elf_val; } reloc_map[] = { - { BFD_RELOC_NONE, R_68K_NONE }, - { BFD_RELOC_32, R_68K_32 }, - { BFD_RELOC_16, R_68K_16 }, - { BFD_RELOC_8, R_68K_8 }, - { BFD_RELOC_32_PCREL, R_68K_PC32 }, - { BFD_RELOC_16_PCREL, R_68K_PC16 }, - { BFD_RELOC_8_PCREL, R_68K_PC8 }, - { BFD_RELOC_32_GOT_PCREL, R_68K_GOT32 }, - { BFD_RELOC_16_GOT_PCREL, R_68K_GOT16 }, - { BFD_RELOC_8_GOT_PCREL, R_68K_GOT8 }, - { BFD_RELOC_32_GOTOFF, R_68K_GOT32O }, - { BFD_RELOC_16_GOTOFF, R_68K_GOT16O }, - { BFD_RELOC_8_GOTOFF, R_68K_GOT8O }, - { BFD_RELOC_32_PLT_PCREL, R_68K_PLT32 }, - { BFD_RELOC_16_PLT_PCREL, R_68K_PLT16 }, - { BFD_RELOC_8_PLT_PCREL, R_68K_PLT8 }, - { BFD_RELOC_32_PLTOFF, R_68K_PLT32O }, - { BFD_RELOC_16_PLTOFF, R_68K_PLT16O }, - { BFD_RELOC_8_PLTOFF, R_68K_PLT8O }, - { BFD_RELOC_NONE, R_68K_COPY }, - { BFD_RELOC_68K_GLOB_DAT, R_68K_GLOB_DAT }, - { BFD_RELOC_68K_JMP_SLOT, R_68K_JMP_SLOT }, - { BFD_RELOC_68K_RELATIVE, R_68K_RELATIVE }, - { BFD_RELOC_CTOR, R_68K_32 }, -}; - -static reloc_howto_type * -reloc_type_lookup (abfd, code) - bfd *abfd; - bfd_reloc_code_real_type code; -{ - unsigned int i; - for (i = 0; i < sizeof (reloc_map) / sizeof (reloc_map[0]); i++) - { - if (reloc_map[i].bfd_val == code) - return &howto_table[(int) reloc_map[i].elf_val]; - } - return 0; -} - -#define bfd_elf32_bfd_reloc_type_lookup reloc_type_lookup -#define ELF_ARCH bfd_arch_m68k -/* end code generated by elf.el */ - -#define USE_RELA - - -/* Functions for the m68k ELF linker. */ - -/* The name of the dynamic interpreter. This is put in the .interp - section. */ - -#define ELF_DYNAMIC_INTERPRETER "/usr/lib/libc.so.1" - -/* The size in bytes of an entry in the procedure linkage table. */ - -#define PLT_ENTRY_SIZE 20 - -/* The first entry in a procedure linkage table looks like this. See - the SVR4 ABI m68k supplement to see how this works. */ - -static const bfd_byte elf_m68k_plt0_entry[PLT_ENTRY_SIZE] = -{ - 0x2f, 0x3b, 0x01, 0x70, /* move.l (%pc,addr),-(%sp) */ - 0, 0, 0, 0, /* replaced with offset to .got + 4. */ - 0x4e, 0xfb, 0x01, 0x71, /* jmp ([%pc,addr]) */ - 0, 0, 0, 0, /* replaced with offset to .got + 8. */ - 0, 0, 0, 0 /* pad out to 20 bytes. */ -}; - -/* Subsequent entries in a procedure linkage table look like this. */ - -static const bfd_byte elf_m68k_plt_entry[PLT_ENTRY_SIZE] = -{ - 0x4e, 0xfb, 0x01, 0x71, /* jmp ([%pc,symbol@GOTPC]) */ - 0, 0, 0, 0, /* replaced with offset to symbol's .got entry. */ - 0x2f, 0x3c, /* move.l #offset,-(%sp) */ - 0, 0, 0, 0, /* replaced with offset into relocation table. */ - 0x60, 0xff, /* bra.l .plt */ - 0, 0, 0, 0 /* replaced with offset to start of .plt. */ -}; - -/* Look through the relocs for a section during the first phase, and - allocate space in the global offset table or procedure linkage - table. */ - -static boolean -elf_m68k_check_relocs (abfd, info, sec, relocs) - bfd *abfd; - struct bfd_link_info *info; - asection *sec; - const Elf_Internal_Rela *relocs; -{ - bfd *dynobj; - Elf_Internal_Shdr *symtab_hdr; - struct elf_link_hash_entry **sym_hashes; - bfd_vma *local_got_offsets; - const Elf_Internal_Rela *rel; - const Elf_Internal_Rela *rel_end; - asection *sgot; - asection *srelgot; - asection *sreloc; - - if (info->relocateable) - return true; - - dynobj = elf_hash_table (info)->dynobj; - symtab_hdr = &elf_tdata (abfd)->symtab_hdr; - sym_hashes = elf_sym_hashes (abfd); - local_got_offsets = elf_local_got_offsets (abfd); - - sgot = NULL; - srelgot = NULL; - sreloc = NULL; - - rel_end = relocs + sec->reloc_count; - for (rel = relocs; rel < rel_end; rel++) - { - unsigned long r_symndx; - struct elf_link_hash_entry *h; - - r_symndx = ELF32_R_SYM (rel->r_info); - - if (r_symndx < symtab_hdr->sh_info) - h = NULL; - else - h = sym_hashes[r_symndx - symtab_hdr->sh_info]; - - switch (ELF32_R_TYPE (rel->r_info)) - { - case R_68K_GOT8: - case R_68K_GOT16: - case R_68K_GOT32: - if (h != NULL - && strcmp (h->root.root.string, "_GLOBAL_OFFSET_TABLE_") == 0) - break; - /* Fall through. */ - case R_68K_GOT8O: - case R_68K_GOT16O: - case R_68K_GOT32O: - /* This symbol requires a global offset table entry. */ - - if (dynobj == NULL) - { - /* Create the .got section. */ - elf_hash_table (info)->dynobj = dynobj = abfd; - if (!_bfd_elf_create_got_section (dynobj, info)) - return false; - } - - if (sgot == NULL) - { - sgot = bfd_get_section_by_name (dynobj, ".got"); - BFD_ASSERT (sgot != NULL); - } - - if (srelgot == NULL - && (h != NULL || info->shared)) - { - srelgot = bfd_get_section_by_name (dynobj, ".rela.got"); - if (srelgot == NULL) - { - srelgot = bfd_make_section (dynobj, ".rela.got"); - if (srelgot == NULL - || !bfd_set_section_flags (dynobj, srelgot, - (SEC_ALLOC - | SEC_LOAD - | SEC_HAS_CONTENTS - | SEC_IN_MEMORY - | SEC_READONLY)) - || !bfd_set_section_alignment (dynobj, srelgot, 2)) - return false; - } - } - - if (h != NULL) - { - if (h->got_offset != (bfd_vma) -1) - { - /* We have already allocated space in the .got. */ - break; - } - h->got_offset = sgot->_raw_size; - - /* Make sure this symbol is output as a dynamic symbol. */ - if (h->dynindx == -1) - { - if (!bfd_elf32_link_record_dynamic_symbol (info, h)) - return false; - } - - srelgot->_raw_size += sizeof (Elf32_External_Rela); - } - else - { - /* This is a global offset table entry for a local - symbol. */ - if (local_got_offsets == NULL) - { - size_t size; - register unsigned int i; - - size = symtab_hdr->sh_info * sizeof (bfd_vma); - local_got_offsets = (bfd_vma *) bfd_alloc (abfd, size); - if (local_got_offsets == NULL) - return false; - elf_local_got_offsets (abfd) = local_got_offsets; - for (i = 0; i < symtab_hdr->sh_info; i++) - local_got_offsets[i] = (bfd_vma) -1; - } - if (local_got_offsets[r_symndx] != (bfd_vma) -1) - { - /* We have already allocated space in the .got. */ - break; - } - local_got_offsets[r_symndx] = sgot->_raw_size; - - if (info->shared) - { - /* If we are generating a shared object, we need to - output a R_68K_RELATIVE reloc so that the dynamic - linker can adjust this GOT entry. */ - srelgot->_raw_size += sizeof (Elf32_External_Rela); - } - } - - sgot->_raw_size += 4; - break; - - case R_68K_PLT8: - case R_68K_PLT16: - case R_68K_PLT32: - /* This symbol requires a procedure linkage table entry. We - actually build the entry in adjust_dynamic_symbol, - because this might be a case of linking PIC code which is - never referenced by a dynamic object, in which case we - don't need to generate a procedure linkage table entry - after all. */ - - /* If this is a local symbol, we resolve it directly without - creating a procedure linkage table entry. */ - if (h == NULL) - continue; - - h->elf_link_hash_flags |= ELF_LINK_HASH_NEEDS_PLT; - break; - - case R_68K_PLT8O: - case R_68K_PLT16O: - case R_68K_PLT32O: - /* This symbol requires a procedure linkage table entry. */ - - if (h == NULL) - { - /* It does not make sense to have this relocation for a - local symbol. FIXME: does it? How to handle it if - it does make sense? */ - bfd_set_error (bfd_error_bad_value); - return false; - } - - /* Make sure this symbol is output as a dynamic symbol. */ - if (h->dynindx == -1) - { - if (!bfd_elf32_link_record_dynamic_symbol (info, h)) - return false; - } - - h->elf_link_hash_flags |= ELF_LINK_HASH_NEEDS_PLT; - break; - - case R_68K_PC8: - case R_68K_PC16: - case R_68K_PC32: - if (h == NULL) - break; - /* Fall through. */ - case R_68K_8: - case R_68K_16: - case R_68K_32: - if (info->shared - && (sec->flags & SEC_ALLOC) != 0 - && ((ELF32_R_TYPE (rel->r_info) != R_68K_PC8 - && ELF32_R_TYPE (rel->r_info) != R_68K_PC16 - && ELF32_R_TYPE (rel->r_info) != R_68K_PC32) - || (!info->symbolic - || (h->elf_link_hash_flags - & ELF_LINK_HASH_DEF_REGULAR) == 0))) - { - /* When creating a shared object, we must copy these - reloc types into the output file. We create a reloc - section in dynobj and make room for this reloc. */ - if (sreloc == NULL) - { - const char *name; - - name = (bfd_elf_string_from_elf_section - (abfd, - elf_elfheader (abfd)->e_shstrndx, - elf_section_data (sec)->rel_hdr.sh_name)); - if (name == NULL) - return false; - - BFD_ASSERT (strncmp (name, ".rela", 5) == 0 - && strcmp (bfd_get_section_name (abfd, sec), - name + 5) == 0); - - sreloc = bfd_get_section_by_name (dynobj, name); - if (sreloc == NULL) - { - sreloc = bfd_make_section (dynobj, name); - if (sreloc == NULL - || !bfd_set_section_flags (dynobj, sreloc, - (SEC_ALLOC - | SEC_LOAD - | SEC_HAS_CONTENTS - | SEC_IN_MEMORY - | SEC_READONLY)) - || !bfd_set_section_alignment (dynobj, sreloc, 2)) - return false; - } - } - - sreloc->_raw_size += sizeof (Elf32_External_Rela); - } - - break; - - default: - break; - } - } - - return true; -} - -/* Adjust a symbol defined by a dynamic object and referenced by a - regular object. The current definition is in some section of the - dynamic object, but we're not including those sections. We have to - change the definition to something the rest of the link can - understand. */ - -static boolean -elf_m68k_adjust_dynamic_symbol (info, h) - struct bfd_link_info *info; - struct elf_link_hash_entry *h; -{ - bfd *dynobj; - asection *s; - unsigned int power_of_two; - - dynobj = elf_hash_table (info)->dynobj; - - /* Make sure we know what is going on here. */ - BFD_ASSERT (dynobj != NULL - && ((h->elf_link_hash_flags & ELF_LINK_HASH_NEEDS_PLT) - || h->weakdef != NULL - || ((h->elf_link_hash_flags - & ELF_LINK_HASH_DEF_DYNAMIC) != 0 - && (h->elf_link_hash_flags - & ELF_LINK_HASH_REF_REGULAR) != 0 - && (h->elf_link_hash_flags - & ELF_LINK_HASH_DEF_REGULAR) == 0))); - - /* If this is a function, put it in the procedure linkage table. We - will fill in the contents of the procedure linkage table later, - when we know the address of the .got section. */ - if (h->type == STT_FUNC - || (h->elf_link_hash_flags & ELF_LINK_HASH_NEEDS_PLT) != 0) - { - if (! info->shared - && (h->elf_link_hash_flags & ELF_LINK_HASH_DEF_DYNAMIC) == 0 - && (h->elf_link_hash_flags & ELF_LINK_HASH_REF_DYNAMIC) == 0 - /* We must always create the plt entry if it was referenced - by a PLTxxO relocation. In this case we already recorded - it as a dynamic symbol. */ - && h->dynindx == -1) - { - /* This case can occur if we saw a PLTxx reloc in an input - file, but the symbol was never referred to by a dynamic - object. In such a case, we don't actually need to build - a procedure linkage table, and we can just do a PCxx - reloc instead. */ - BFD_ASSERT ((h->elf_link_hash_flags & ELF_LINK_HASH_NEEDS_PLT) != 0); - return true; - } - - /* Make sure this symbol is output as a dynamic symbol. */ - if (h->dynindx == -1) - { - if (! bfd_elf32_link_record_dynamic_symbol (info, h)) - return false; - } - - s = bfd_get_section_by_name (dynobj, ".plt"); - BFD_ASSERT (s != NULL); - - /* If this is the first .plt entry, make room for the special - first entry. */ - if (s->_raw_size == 0) - s->_raw_size += PLT_ENTRY_SIZE; - - /* If this symbol is not defined in a regular file, and we are - not generating a shared library, then set the symbol to this - location in the .plt. This is required to make function - pointers compare as equal between the normal executable and - the shared library. */ - if (!info->shared - && (h->elf_link_hash_flags & ELF_LINK_HASH_DEF_REGULAR) == 0) - { - h->root.u.def.section = s; - h->root.u.def.value = s->_raw_size; - } - - h->plt_offset = s->_raw_size; - - /* Make room for this entry. */ - s->_raw_size += PLT_ENTRY_SIZE; - - /* We also need to make an entry in the .got.plt section, which - will be placed in the .got section by the linker script. */ - - s = bfd_get_section_by_name (dynobj, ".got.plt"); - BFD_ASSERT (s != NULL); - s->_raw_size += 4; - - /* We also need to make an entry in the .rela.plt section. */ - - s = bfd_get_section_by_name (dynobj, ".rela.plt"); - BFD_ASSERT (s != NULL); - s->_raw_size += sizeof (Elf32_External_Rela); - - return true; - } - - /* If this is a weak symbol, and there is a real definition, the - processor independent code will have arranged for us to see the - real definition first, and we can just use the same value. */ - if (h->weakdef != NULL) - { - BFD_ASSERT (h->weakdef->root.type == bfd_link_hash_defined - || h->weakdef->root.type == bfd_link_hash_defweak); - h->root.u.def.section = h->weakdef->root.u.def.section; - h->root.u.def.value = h->weakdef->root.u.def.value; - return true; - } - - /* This is a reference to a symbol defined by a dynamic object which - is not a function. */ - - /* If we are creating a shared library, we must presume that the - only references to the symbol are via the global offset table. - For such cases we need not do anything here; the relocations will - be handled correctly by relocate_section. */ - if (info->shared) - return true; - - /* We must allocate the symbol in our .dynbss section, which will - become part of the .bss section of the executable. There will be - an entry for this symbol in the .dynsym section. The dynamic - object will contain position independent code, so all references - from the dynamic object to this symbol will go through the global - offset table. The dynamic linker will use the .dynsym entry to - determine the address it must put in the global offset table, so - both the dynamic object and the regular object will refer to the - same memory location for the variable. */ - - s = bfd_get_section_by_name (dynobj, ".dynbss"); - BFD_ASSERT (s != NULL); - - /* If the symbol is currently defined in the .bss section of the - dynamic object, then it is OK to simply initialize it to zero. - If the symbol is in some other section, we must generate a - R_68K_COPY reloc to tell the dynamic linker to copy the initial - value out of the dynamic object and into the runtime process - image. We need to remember the offset into the .rela.bss section - we are going to use. */ - if ((h->root.u.def.section->flags & SEC_LOAD) != 0) - { - asection *srel; - - srel = bfd_get_section_by_name (dynobj, ".rela.bss"); - BFD_ASSERT (srel != NULL); - srel->_raw_size += sizeof (Elf32_External_Rela); - h->elf_link_hash_flags |= ELF_LINK_HASH_NEEDS_COPY; - } - - /* We need to figure out the alignment required for this symbol. I - have no idea how ELF linkers handle this. */ - power_of_two = bfd_log2 (h->size); - if (power_of_two > 3) - power_of_two = 3; - - /* Apply the required alignment. */ - s->_raw_size = BFD_ALIGN (s->_raw_size, - (bfd_size_type) (1 << power_of_two)); - if (power_of_two > bfd_get_section_alignment (dynobj, s)) - { - if (!bfd_set_section_alignment (dynobj, s, power_of_two)) - return false; - } - - /* Define the symbol as being at this point in the section. */ - h->root.u.def.section = s; - h->root.u.def.value = s->_raw_size; - - /* Increment the section size to make room for the symbol. */ - s->_raw_size += h->size; - - return true; -} - -/* Set the sizes of the dynamic sections. */ - -static boolean -elf_m68k_size_dynamic_sections (output_bfd, info) - bfd *output_bfd; - struct bfd_link_info *info; -{ - bfd *dynobj; - asection *s; - boolean plt; - boolean relocs; - boolean reltext; - - dynobj = elf_hash_table (info)->dynobj; - BFD_ASSERT (dynobj != NULL); - - if (elf_hash_table (info)->dynamic_sections_created) - { - /* Set the contents of the .interp section to the interpreter. */ - if (!info->shared) - { - s = bfd_get_section_by_name (dynobj, ".interp"); - BFD_ASSERT (s != NULL); - s->_raw_size = sizeof ELF_DYNAMIC_INTERPRETER; - s->contents = (unsigned char *) ELF_DYNAMIC_INTERPRETER; - } - } - else - { - /* We may have created entries in the .rela.got section. - However, if we are not creating the dynamic sections, we will - not actually use these entries. Reset the size of .rela.got, - which will cause it to get stripped from the output file - below. */ - s = bfd_get_section_by_name (dynobj, ".rela.got"); - if (s != NULL) - s->_raw_size = 0; - } - - /* The check_relocs and adjust_dynamic_symbol entry points have - determined the sizes of the various dynamic sections. Allocate - memory for them. */ - plt = false; - relocs = false; - reltext = false; - for (s = dynobj->sections; s != NULL; s = s->next) - { - const char *name; - boolean strip; - - if ((s->flags & SEC_IN_MEMORY) == 0) - continue; - - /* It's OK to base decisions on the section name, because none - of the dynobj section names depend upon the input files. */ - name = bfd_get_section_name (dynobj, s); - - strip = false; - - if (strcmp (name, ".plt") == 0) - { - if (s->_raw_size == 0) - { - /* Strip this section if we don't need it; see the - comment below. */ - strip = true; - } - else - { - /* Remember whether there is a PLT. */ - plt = true; - } - } - else if (strncmp (name, ".rela", 5) == 0) - { - if (s->_raw_size == 0) - { - /* If we don't need this section, strip it from the - output file. This is mostly to handle .rela.bss and - .rela.plt. We must create both sections in - create_dynamic_sections, because they must be created - before the linker maps input sections to output - sections. The linker does that before - adjust_dynamic_symbol is called, and it is that - function which decides whether anything needs to go - into these sections. */ - strip = true; - } - else - { - asection *target; - - /* Remember whether there are any reloc sections other - than .rela.plt. */ - if (strcmp (name, ".rela.plt") != 0) - { - relocs = true; - - /* If this relocation section applies to a read only - section, then we probably need a DT_TEXTREL - entry. .rela.plt is actually associated with - .got.plt, which is never readonly. */ - target = bfd_get_section_by_name (output_bfd, name + 5); - if (target != NULL - && (target->flags & SEC_READONLY) != 0) - reltext = true; - } - - /* We use the reloc_count field as a counter if we need - to copy relocs into the output file. */ - s->reloc_count = 0; - } - } - else if (strncmp (name, ".got", 4) != 0) - { - /* It's not one of our sections, so don't allocate space. */ - continue; - } - - if (strip) - { - asection **spp; - - for (spp = &s->output_section->owner->sections; - *spp != s->output_section; - spp = &(*spp)->next) - ; - *spp = s->output_section->next; - --s->output_section->owner->section_count; - - continue; - } - - /* Allocate memory for the section contents. */ - s->contents = (bfd_byte *) bfd_alloc (dynobj, s->_raw_size); - if (s->contents == NULL && s->_raw_size != 0) - return false; - } - - if (elf_hash_table (info)->dynamic_sections_created) - { - /* Add some entries to the .dynamic section. We fill in the - values later, in elf_m68k_finish_dynamic_sections, but we - must add the entries now so that we get the correct size for - the .dynamic section. The DT_DEBUG entry is filled in by the - dynamic linker and used by the debugger. */ - if (!info->shared) - { - if (!bfd_elf32_add_dynamic_entry (info, DT_DEBUG, 0)) - return false; - } - - if (plt) - { - if (!bfd_elf32_add_dynamic_entry (info, DT_PLTGOT, 0) - || !bfd_elf32_add_dynamic_entry (info, DT_PLTRELSZ, 0) - || !bfd_elf32_add_dynamic_entry (info, DT_PLTREL, DT_RELA) - || !bfd_elf32_add_dynamic_entry (info, DT_JMPREL, 0)) - return false; - } - - if (relocs) - { - if (!bfd_elf32_add_dynamic_entry (info, DT_RELA, 0) - || !bfd_elf32_add_dynamic_entry (info, DT_RELASZ, 0) - || !bfd_elf32_add_dynamic_entry (info, DT_RELAENT, - sizeof (Elf32_External_Rela))) - return false; - } - - if (reltext) - { - if (!bfd_elf32_add_dynamic_entry (info, DT_TEXTREL, 0)) - return false; - } - } - - return true; -} - -/* Relocate an M68K ELF section. */ - -static boolean -elf_m68k_relocate_section (output_bfd, info, input_bfd, input_section, - contents, relocs, local_syms, local_sections) - bfd *output_bfd; - struct bfd_link_info *info; - bfd *input_bfd; - asection *input_section; - bfd_byte *contents; - Elf_Internal_Rela *relocs; - Elf_Internal_Sym *local_syms; - asection **local_sections; -{ - bfd *dynobj; - Elf_Internal_Shdr *symtab_hdr; - struct elf_link_hash_entry **sym_hashes; - bfd_vma *local_got_offsets; - asection *sgot; - asection *splt; - asection *sreloc; - Elf_Internal_Rela *rel; - Elf_Internal_Rela *relend; - - dynobj = elf_hash_table (info)->dynobj; - symtab_hdr = &elf_tdata (input_bfd)->symtab_hdr; - sym_hashes = elf_sym_hashes (input_bfd); - local_got_offsets = elf_local_got_offsets (input_bfd); - - sgot = NULL; - splt = NULL; - sreloc = NULL; - - rel = relocs; - relend = relocs + input_section->reloc_count; - for (; rel < relend; rel++) - { - int r_type; - reloc_howto_type *howto; - unsigned long r_symndx; - struct elf_link_hash_entry *h; - Elf_Internal_Sym *sym; - asection *sec; - bfd_vma relocation; - bfd_reloc_status_type r; - - r_type = ELF32_R_TYPE (rel->r_info); - if (r_type < 0 || r_type >= (int) R_68K__max) - { - bfd_set_error (bfd_error_bad_value); - return false; - } - howto = howto_table + r_type; - - r_symndx = ELF32_R_SYM (rel->r_info); - - if (info->relocateable) - { - /* This is a relocateable link. We don't have to change - anything, unless the reloc is against a section symbol, - in which case we have to adjust according to where the - section symbol winds up in the output section. */ - if (r_symndx < symtab_hdr->sh_info) - { - sym = local_syms + r_symndx; - if (ELF_ST_TYPE (sym->st_info) == STT_SECTION) - { - sec = local_sections[r_symndx]; - rel->r_addend += sec->output_offset + sym->st_value; - } - } - - continue; - } - - /* This is a final link. */ - h = NULL; - sym = NULL; - sec = NULL; - if (r_symndx < symtab_hdr->sh_info) - { - sym = local_syms + r_symndx; - sec = local_sections[r_symndx]; - relocation = (sec->output_section->vma - + sec->output_offset - + sym->st_value); - } - else - { - h = sym_hashes[r_symndx - symtab_hdr->sh_info]; - while (h->root.type == bfd_link_hash_indirect - || h->root.type == bfd_link_hash_warning) - h = (struct elf_link_hash_entry *) h->root.u.i.link; - if (h->root.type == bfd_link_hash_defined - || h->root.type == bfd_link_hash_defweak) - { - sec = h->root.u.def.section; - if (((r_type == R_68K_PLT8 - || r_type == R_68K_PLT16 - || r_type == R_68K_PLT32 - || r_type == R_68K_PLT8O - || r_type == R_68K_PLT16O - || r_type == R_68K_PLT32O) - && h->plt_offset != (bfd_vma) -1) - || ((r_type == R_68K_GOT8O - || r_type == R_68K_GOT16O - || r_type == R_68K_GOT32O - || ((r_type == R_68K_GOT8 - || r_type == R_68K_GOT16 - || r_type == R_68K_GOT32) - && strcmp (h->root.root.string, - "_GLOBAL_OFFSET_TABLE_") != 0)) - && elf_hash_table (info)->dynamic_sections_created - && (! info->shared - || ! info->symbolic - || (h->elf_link_hash_flags - & ELF_LINK_HASH_DEF_REGULAR) == 0)) - || (info->shared - && (! info->symbolic - || (h->elf_link_hash_flags - & ELF_LINK_HASH_DEF_REGULAR) == 0) - && (input_section->flags & SEC_ALLOC) != 0 - && (r_type == R_68K_8 - || r_type == R_68K_16 - || r_type == R_68K_32 - || r_type == R_68K_PC8 - || r_type == R_68K_PC16 - || r_type == R_68K_PC32))) - { - /* In these cases, we don't need the relocation - value. We check specially because in some - obscure cases sec->output_section will be NULL. */ - relocation = 0; - } - else - relocation = (h->root.u.def.value - + sec->output_section->vma - + sec->output_offset); - } - else if (h->root.type == bfd_link_hash_undefweak) - relocation = 0; - else if (info->shared && !info->symbolic) - relocation = 0; - else - { - if (!(info->callbacks->undefined_symbol - (info, h->root.root.string, input_bfd, - input_section, rel->r_offset))) - return false; - relocation = 0; - } - } - - switch (r_type) - { - case R_68K_GOT8: - case R_68K_GOT16: - case R_68K_GOT32: - /* Relocation is to the address of the entry for this symbol - in the global offset table. */ - if (h != NULL - && strcmp (h->root.root.string, "_GLOBAL_OFFSET_TABLE_") == 0) - break; - /* Fall through. */ - case R_68K_GOT8O: - case R_68K_GOT16O: - case R_68K_GOT32O: - /* Relocation is the offset of the entry for this symbol in - the global offset table. */ - - { - bfd_vma off; - - if (sgot == NULL) - { - sgot = bfd_get_section_by_name (dynobj, ".got"); - BFD_ASSERT (sgot != NULL); - } - - if (h != NULL) - { - off = h->got_offset; - BFD_ASSERT (off != (bfd_vma) -1); - - if (!elf_hash_table (info)->dynamic_sections_created - || (info->shared - && info->symbolic - && (h->elf_link_hash_flags & ELF_LINK_HASH_DEF_REGULAR))) - { - /* This is actually a static link, or it is a - -Bsymbolic link and the symbol is defined - locally. We must initialize this entry in the - global offset table. Since the offset must - always be a multiple of 4, we use the least - significant bit to record whether we have - initialized it already. - - When doing a dynamic link, we create a .rela.got - relocation entry to initialize the value. This - is done in the finish_dynamic_symbol routine. */ - if ((off & 1) != 0) - off &= ~1; - else - { - bfd_put_32 (output_bfd, relocation, - sgot->contents + off); - h->got_offset |= 1; - } - } - } - else - { - BFD_ASSERT (local_got_offsets != NULL - && local_got_offsets[r_symndx] != (bfd_vma) -1); - - off = local_got_offsets[r_symndx]; - - /* The offset must always be a multiple of 4. We use - the least significant bit to record whether we have - already generated the necessary reloc. */ - if ((off & 1) != 0) - off &= ~1; - else - { - bfd_put_32 (output_bfd, relocation, sgot->contents + off); - - if (info->shared) - { - asection *srelgot; - Elf_Internal_Rela outrel; - - srelgot = bfd_get_section_by_name (dynobj, ".rela.got"); - BFD_ASSERT (srelgot != NULL); - - outrel.r_offset = (sgot->output_section->vma - + sgot->output_offset - + off); - outrel.r_info = ELF32_R_INFO (0, R_68K_RELATIVE); - outrel.r_addend = relocation; - bfd_elf32_swap_reloca_out (output_bfd, &outrel, - (((Elf32_External_Rela *) - srelgot->contents) - + srelgot->reloc_count)); - ++srelgot->reloc_count; - } - - local_got_offsets[r_symndx] |= 1; - } - } - - relocation = sgot->output_offset + off; - if (r_type == R_68K_GOT8O - || r_type == R_68K_GOT16O - || r_type == R_68K_GOT32O) - { - /* This relocation does not use the addend. */ - rel->r_addend = 0; - } - else - relocation += sgot->output_section->vma; - } - break; - - case R_68K_PLT8: - case R_68K_PLT16: - case R_68K_PLT32: - /* Relocation is to the entry for this symbol in the - procedure linkage table. */ - - /* Resolve a PLTxx reloc against a local symbol directly, - without using the procedure linkage table. */ - if (h == NULL) - break; - - if (h->plt_offset == (bfd_vma) -1) - { - /* We didn't make a PLT entry for this symbol. This - happens when statically linking PIC code, or when - using -Bsymbolic. */ - break; - } - - if (splt == NULL) - { - splt = bfd_get_section_by_name (dynobj, ".plt"); - BFD_ASSERT (splt != NULL); - } - - relocation = (splt->output_section->vma - + splt->output_offset - + h->plt_offset); - break; - - case R_68K_PLT8O: - case R_68K_PLT16O: - case R_68K_PLT32O: - /* Relocation is the offset of the entry for this symbol in - the procedure linkage table. */ - BFD_ASSERT (h != NULL && h->plt_offset == (bfd_vma) -1); - - if (splt == NULL) - { - splt = bfd_get_section_by_name (dynobj, ".plt"); - BFD_ASSERT (splt != NULL); - } - - relocation = h->plt_offset; - - /* This relocation does not use the addend. */ - rel->r_addend = 0; - - break; - - case R_68K_PC8: - case R_68K_PC16: - case R_68K_PC32: - if (h == NULL) - break; - /* Fall through. */ - case R_68K_8: - case R_68K_16: - case R_68K_32: - if (info->shared - && (input_section->flags & SEC_ALLOC) != 0 - && ((r_type != R_68K_PC8 - && r_type != R_68K_PC16 - && r_type != R_68K_PC32) - || (!info->symbolic - || (h->elf_link_hash_flags - & ELF_LINK_HASH_DEF_REGULAR) == 0))) - { - Elf_Internal_Rela outrel; - int relocate; - - /* When generating a shared object, these relocations - are copied into the output file to be resolved at run - time. */ - - if (sreloc == NULL) - { - const char *name; - - name = (bfd_elf_string_from_elf_section - (input_bfd, - elf_elfheader (input_bfd)->e_shstrndx, - elf_section_data (input_section)->rel_hdr.sh_name)); - if (name == NULL) - return false; - - BFD_ASSERT (strncmp (name, ".rela", 5) == 0 - && strcmp (bfd_get_section_name (input_bfd, - input_section), - name + 5) == 0); - - sreloc = bfd_get_section_by_name (dynobj, name); - BFD_ASSERT (sreloc != NULL); - } - - outrel.r_offset = (rel->r_offset - + input_section->output_section->vma - + input_section->output_offset); - if (h != NULL - && (! info->symbolic - || (h->elf_link_hash_flags - & ELF_LINK_HASH_DEF_REGULAR) == 0)) - { - BFD_ASSERT (h->dynindx != -1); - relocate = false; - outrel.r_info = ELF32_R_INFO (h->dynindx, r_type); - outrel.r_addend = relocation + rel->r_addend; - } - else - { - if (r_type == R_68K_32) - { - relocate = true; - outrel.r_info = ELF32_R_INFO (0, R_68K_RELATIVE); - outrel.r_addend = relocation + rel->r_addend; - } - else - { - long indx; - - if (h == NULL) - sec = local_sections[r_symndx]; - else - { - BFD_ASSERT (h->root.type == bfd_link_hash_defined - || (h->root.type - == bfd_link_hash_defweak)); - sec = h->root.u.def.section; - } - if (sec != NULL && bfd_is_abs_section (sec)) - indx = 0; - else if (sec == NULL || sec->owner == NULL) - { - bfd_set_error (bfd_error_bad_value); - return false; - } - else - { - asection *osec; - - osec = sec->output_section; - indx = elf_section_data (osec)->dynindx; - if (indx == 0) - abort (); - } - - relocate = false; - outrel.r_info = ELF32_R_INFO (indx, r_type); - outrel.r_addend = relocation + rel->r_addend; - } - } - - bfd_elf32_swap_reloca_out (output_bfd, &outrel, - (((Elf32_External_Rela *) - sreloc->contents) - + sreloc->reloc_count)); - ++sreloc->reloc_count; - - /* This reloc will be computed at runtime, so there's no - need to do anything now, except for R_68K_32 - relocations that have been turned into - R_68K_RELATIVE. */ - if (!relocate) - continue; - } - - break; - - default: - break; - } - - r = _bfd_final_link_relocate (howto, input_bfd, input_section, - contents, rel->r_offset, - relocation, rel->r_addend); - - if (r != bfd_reloc_ok) - { - switch (r) - { - default: - case bfd_reloc_outofrange: - abort (); - case bfd_reloc_overflow: - { - const char *name; - - if (h != NULL) - name = h->root.root.string; - else - { - name = bfd_elf_string_from_elf_section (input_bfd, - symtab_hdr->sh_link, - sym->st_name); - if (name == NULL) - return false; - if (*name == '\0') - name = bfd_section_name (input_bfd, sec); - } - if (!(info->callbacks->reloc_overflow - (info, name, howto->name, (bfd_vma) 0, - input_bfd, input_section, rel->r_offset))) - return false; - } - break; - } - } - } - - return true; -} - -/* Finish up dynamic symbol handling. We set the contents of various - dynamic sections here. */ - -static boolean -elf_m68k_finish_dynamic_symbol (output_bfd, info, h, sym) - bfd *output_bfd; - struct bfd_link_info *info; - struct elf_link_hash_entry *h; - Elf_Internal_Sym *sym; -{ - bfd *dynobj; - - dynobj = elf_hash_table (info)->dynobj; - - if (h->plt_offset != (bfd_vma) -1) - { - asection *splt; - asection *sgot; - asection *srela; - bfd_vma plt_index; - bfd_vma got_offset; - Elf_Internal_Rela rela; - - /* This symbol has an entry in the procedure linkage table. Set - it up. */ - - BFD_ASSERT (h->dynindx != -1); - - splt = bfd_get_section_by_name (dynobj, ".plt"); - sgot = bfd_get_section_by_name (dynobj, ".got.plt"); - srela = bfd_get_section_by_name (dynobj, ".rela.plt"); - BFD_ASSERT (splt != NULL && sgot != NULL && srela != NULL); - - /* Get the index in the procedure linkage table which - corresponds to this symbol. This is the index of this symbol - in all the symbols for which we are making plt entries. The - first entry in the procedure linkage table is reserved. */ - plt_index = h->plt_offset / PLT_ENTRY_SIZE - 1; - - /* Get the offset into the .got table of the entry that - corresponds to this function. Each .got entry is 4 bytes. - The first three are reserved. */ - got_offset = (plt_index + 3) * 4; - - /* Fill in the entry in the procedure linkage table. */ - memcpy (splt->contents + h->plt_offset, elf_m68k_plt_entry, - PLT_ENTRY_SIZE); - /* The offset is relative to the first extension word. */ - bfd_put_32 (output_bfd, - (sgot->output_section->vma - + sgot->output_offset - + got_offset - - (splt->output_section->vma - + h->plt_offset + 2)), - splt->contents + h->plt_offset + 4); - - bfd_put_32 (output_bfd, plt_index * sizeof (Elf32_External_Rela), - splt->contents + h->plt_offset + 10); - bfd_put_32 (output_bfd, - (h->plt_offset + 16), - splt->contents + h->plt_offset + 16); - - /* Fill in the entry in the global offset table. */ - bfd_put_32 (output_bfd, - (splt->output_section->vma - + splt->output_offset - + h->plt_offset - + 8), - sgot->contents + got_offset); - - /* Fill in the entry in the .rela.plt section. */ - rela.r_offset = (sgot->output_section->vma - + sgot->output_offset - + got_offset); - rela.r_info = ELF32_R_INFO (h->dynindx, R_68K_JMP_SLOT); - rela.r_addend = 0; - bfd_elf32_swap_reloca_out (output_bfd, &rela, - ((Elf32_External_Rela *) srela->contents - + plt_index)); - - if ((h->elf_link_hash_flags & ELF_LINK_HASH_DEF_REGULAR) == 0) - { - /* Mark the symbol as undefined, rather than as defined in - the .plt section. Leave the value alone. */ - sym->st_shndx = SHN_UNDEF; - } - } - - if (h->got_offset != (bfd_vma) -1) - { - asection *sgot; - asection *srela; - Elf_Internal_Rela rela; - - /* This symbol has an entry in the global offset table. Set it - up. */ - - BFD_ASSERT (h->dynindx != -1); - - sgot = bfd_get_section_by_name (dynobj, ".got"); - srela = bfd_get_section_by_name (dynobj, ".rela.got"); - BFD_ASSERT (sgot != NULL && srela != NULL); - - rela.r_offset = (sgot->output_section->vma - + sgot->output_offset - + (h->got_offset &~ 1)); - - /* If this is a -Bsymbolic link, and the symbol is defined - locally, we just want to emit a RELATIVE reloc. The entry in - the global offset table will already have been initialized in - the relocate_section function. */ - if (info->shared - && info->symbolic - && (h->elf_link_hash_flags & ELF_LINK_HASH_DEF_REGULAR)) - { - rela.r_info = ELF32_R_INFO (0, R_68K_RELATIVE); - rela.r_addend = bfd_get_32 (output_bfd, - sgot->contents + (h->got_offset & ~1)); - } - else - { - bfd_put_32 (output_bfd, (bfd_vma) 0, - sgot->contents + (h->got_offset & ~1)); - rela.r_info = ELF32_R_INFO (h->dynindx, R_68K_GLOB_DAT); - rela.r_addend = 0; - } - - bfd_elf32_swap_reloca_out (output_bfd, &rela, - ((Elf32_External_Rela *) srela->contents - + srela->reloc_count)); - ++srela->reloc_count; - } - - if ((h->elf_link_hash_flags & ELF_LINK_HASH_NEEDS_COPY) != 0) - { - asection *s; - Elf_Internal_Rela rela; - - /* This symbol needs a copy reloc. Set it up. */ - - BFD_ASSERT (h->dynindx != -1 - && (h->root.type == bfd_link_hash_defined - || h->root.type == bfd_link_hash_defweak)); - - s = bfd_get_section_by_name (h->root.u.def.section->owner, - ".rela.bss"); - BFD_ASSERT (s != NULL); - - rela.r_offset = (h->root.u.def.value - + h->root.u.def.section->output_section->vma - + h->root.u.def.section->output_offset); - rela.r_info = ELF32_R_INFO (h->dynindx, R_68K_COPY); - rela.r_addend = 0; - bfd_elf32_swap_reloca_out (output_bfd, &rela, - ((Elf32_External_Rela *) s->contents - + s->reloc_count)); - ++s->reloc_count; - } - - /* Mark _DYNAMIC and _GLOBAL_OFFSET_TABLE_ as absolute. */ - if (strcmp (h->root.root.string, "_DYNAMIC") == 0 - || strcmp (h->root.root.string, "_GLOBAL_OFFSET_TABLE_") == 0) - sym->st_shndx = SHN_ABS; - - return true; -} - -/* Finish up the dynamic sections. */ - -static boolean -elf_m68k_finish_dynamic_sections (output_bfd, info) - bfd *output_bfd; - struct bfd_link_info *info; -{ - bfd *dynobj; - asection *sgot; - asection *sdyn; - - dynobj = elf_hash_table (info)->dynobj; - - sgot = bfd_get_section_by_name (dynobj, ".got.plt"); - BFD_ASSERT (sgot != NULL); - sdyn = bfd_get_section_by_name (dynobj, ".dynamic"); - - if (elf_hash_table (info)->dynamic_sections_created) - { - asection *splt; - Elf32_External_Dyn *dyncon, *dynconend; - - splt = bfd_get_section_by_name (dynobj, ".plt"); - BFD_ASSERT (splt != NULL && sdyn != NULL); - - dyncon = (Elf32_External_Dyn *) sdyn->contents; - dynconend = (Elf32_External_Dyn *) (sdyn->contents + sdyn->_raw_size); - for (; dyncon < dynconend; dyncon++) - { - Elf_Internal_Dyn dyn; - const char *name; - asection *s; - - bfd_elf32_swap_dyn_in (dynobj, dyncon, &dyn); - - switch (dyn.d_tag) - { - default: - break; - - case DT_PLTGOT: - name = ".got"; - goto get_vma; - case DT_JMPREL: - name = ".rela.plt"; - get_vma: - s = bfd_get_section_by_name (output_bfd, name); - BFD_ASSERT (s != NULL); - dyn.d_un.d_ptr = s->vma; - bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon); - break; - - case DT_PLTRELSZ: - s = bfd_get_section_by_name (output_bfd, ".rela.plt"); - BFD_ASSERT (s != NULL); - if (s->_cooked_size != 0) - dyn.d_un.d_val = s->_cooked_size; - else - dyn.d_un.d_val = s->_raw_size; - bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon); - break; - - case DT_RELASZ: - /* The procedure linkage table relocs (DT_JMPREL) should - not be included in the overall relocs (DT_RELA). - Therefore, we override the DT_RELASZ entry here to - make it not include the JMPREL relocs. Since the - linker script arranges for .rela.plt to follow all - other relocation sections, we don't have to worry - about changing the DT_RELA entry. */ - s = bfd_get_section_by_name (output_bfd, ".rela.plt"); - if (s != NULL) - { - if (s->_cooked_size != 0) - dyn.d_un.d_val -= s->_cooked_size; - else - dyn.d_un.d_val -= s->_raw_size; - } - bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon); - break; - } - } - - /* Fill in the first entry in the procedure linkage table. */ - if (splt->_raw_size > 0) - { - memcpy (splt->contents, elf_m68k_plt0_entry, PLT_ENTRY_SIZE); - bfd_put_32 (output_bfd, - (sgot->output_section->vma - + sgot->output_offset + 4 - - (splt->output_section->vma + 2)), - splt->contents + 4); - bfd_put_32 (output_bfd, - (sgot->output_section->vma - + sgot->output_offset + 8 - - (splt->output_section->vma + 10)), - splt->contents + 12); - } - - elf_section_data (splt->output_section)->this_hdr.sh_entsize - = PLT_ENTRY_SIZE; - } - - /* Fill in the first three entries in the global offset table. */ - if (sgot->_raw_size > 0) - { - if (sdyn == NULL) - bfd_put_32 (output_bfd, (bfd_vma) 0, sgot->contents); - else - bfd_put_32 (output_bfd, - sdyn->output_section->vma + sdyn->output_offset, - sgot->contents); - bfd_put_32 (output_bfd, (bfd_vma) 0, sgot->contents + 4); - bfd_put_32 (output_bfd, (bfd_vma) 0, sgot->contents + 8); - } - - elf_section_data (sgot->output_section)->this_hdr.sh_entsize = 4; - - return true; -} - -#define TARGET_BIG_SYM bfd_elf32_m68k_vec -#define TARGET_BIG_NAME "elf32-m68k" -#define ELF_MACHINE_CODE EM_68K -#define ELF_MAXPAGESIZE 0x2000 -#define elf_backend_create_dynamic_sections \ - _bfd_elf_create_dynamic_sections -#define elf_backend_check_relocs elf_m68k_check_relocs -#define elf_backend_adjust_dynamic_symbol \ - elf_m68k_adjust_dynamic_symbol -#define elf_backend_size_dynamic_sections \ - elf_m68k_size_dynamic_sections -#define elf_backend_relocate_section elf_m68k_relocate_section -#define elf_backend_finish_dynamic_symbol \ - elf_m68k_finish_dynamic_symbol -#define elf_backend_finish_dynamic_sections \ - elf_m68k_finish_dynamic_sections -#define elf_backend_want_got_plt 1 -#define elf_backend_plt_readonly 1 -#define elf_backend_want_plt_sym 0 - -#include "elf32-target.h" diff --git a/contrib/gdb/bfd/elf32-m88k.c b/contrib/gdb/bfd/elf32-m88k.c deleted file mode 100644 index f3c535e077645..0000000000000 --- a/contrib/gdb/bfd/elf32-m88k.c +++ /dev/null @@ -1,35 +0,0 @@ -/* Motorola 88k-specific support for 32-bit ELF - Copyright 1993 Free Software Foundation, Inc. - -This file is part of BFD, the Binary File Descriptor library. - -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 2 of the License, 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ - -#include "bfd.h" -#include "sysdep.h" -#include "libbfd.h" -#include "elf-bfd.h" - -/* This does not include any relocations, but should be good enough - for GDB. */ - -#define TARGET_BIG_SYM bfd_elf32_m88k_vec -#define TARGET_BIG_NAME "elf32-m88k" -#define ELF_ARCH bfd_arch_m88k -#define ELF_MACHINE_CODE EM_88K -#define bfd_elf32_bfd_reloc_type_lookup bfd_default_reloc_type_lookup -#define elf_info_to_howto _bfd_elf_no_info_to_howto - -#include "elf32-target.h" diff --git a/contrib/gdb/bfd/elf32-mips.c b/contrib/gdb/bfd/elf32-mips.c deleted file mode 100644 index ced0000e2c51b..0000000000000 --- a/contrib/gdb/bfd/elf32-mips.c +++ /dev/null @@ -1,5867 +0,0 @@ -/* MIPS-specific support for 32-bit ELF - Copyright 1993, 1994, 1995, 1996 Free Software Foundation, Inc. - - Most of the information added by Ian Lance Taylor, Cygnus Support, - <ian@cygnus.com>. - -This file is part of BFD, the Binary File Descriptor library. - -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 2 of the License, 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ - -/* This file handles MIPS ELF targets. SGI Irix 5 uses a slightly - different MIPS ELF from other targets. This matters when linking. - This file supports both, switching at runtime. */ - -#include "bfd.h" -#include "sysdep.h" -#include "libbfd.h" -#include "bfdlink.h" -#include "genlink.h" -#include "elf-bfd.h" -#include "elf/mips.h" - -/* Get the ECOFF swapping routines. */ -#include "coff/sym.h" -#include "coff/symconst.h" -#include "coff/internal.h" -#include "coff/ecoff.h" -#include "coff/mips.h" -#define ECOFF_32 -#include "ecoffswap.h" - -static bfd_reloc_status_type mips_elf_hi16_reloc PARAMS ((bfd *abfd, - arelent *reloc, - asymbol *symbol, - PTR data, - asection *section, - bfd *output_bfd, - char **error)); -static bfd_reloc_status_type mips_elf_got16_reloc PARAMS ((bfd *abfd, - arelent *reloc, - asymbol *symbol, - PTR data, - asection *section, - bfd *output_bfd, - char **error)); -static bfd_reloc_status_type mips_elf_lo16_reloc PARAMS ((bfd *abfd, - arelent *reloc, - asymbol *symbol, - PTR data, - asection *section, - bfd *output_bfd, - char **error)); -static bfd_reloc_status_type mips_elf_gprel16_reloc PARAMS ((bfd *abfd, - arelent *reloc, - asymbol *symbol, - PTR data, - asection *section, - bfd *output_bfd, - char **error)); -static bfd_reloc_status_type mips_elf_gprel32_reloc PARAMS ((bfd *abfd, - arelent *reloc, - asymbol *symbol, - PTR data, - asection *section, - bfd *output_bfd, - char **error)); -static reloc_howto_type *bfd_elf32_bfd_reloc_type_lookup - PARAMS ((bfd *, bfd_reloc_code_real_type)); -static void mips_info_to_howto_rel - PARAMS ((bfd *, arelent *, Elf32_Internal_Rel *)); -static void bfd_mips_elf32_swap_gptab_in - PARAMS ((bfd *, const Elf32_External_gptab *, Elf32_gptab *)); -static void bfd_mips_elf32_swap_gptab_out - PARAMS ((bfd *, const Elf32_gptab *, Elf32_External_gptab *)); -static boolean mips_elf_sym_is_global PARAMS ((bfd *, asymbol *)); -static boolean mips_elf_object_p PARAMS ((bfd *)); -static boolean mips_elf_create_procedure_table - PARAMS ((PTR, bfd *, struct bfd_link_info *, asection *, - struct ecoff_debug_info *)); -static int mips_elf_additional_program_headers PARAMS ((bfd *)); -static boolean mips_elf_modify_segment_map PARAMS ((bfd *)); -static void mips_elf_final_write_processing - PARAMS ((bfd *, boolean)); -static boolean mips_elf_set_private_flags PARAMS ((bfd *, flagword)); -static boolean mips_elf_copy_private_bfd_data PARAMS ((bfd *, bfd *)); -static boolean mips_elf_merge_private_bfd_data PARAMS ((bfd *, bfd *)); -static boolean mips_elf_section_from_shdr - PARAMS ((bfd *, Elf32_Internal_Shdr *, char *)); -static boolean mips_elf_fake_sections - PARAMS ((bfd *, Elf32_Internal_Shdr *, asection *)); -static boolean mips_elf_section_from_bfd_section - PARAMS ((bfd *, Elf32_Internal_Shdr *, asection *, int *)); -static boolean mips_elf_section_processing - PARAMS ((bfd *, Elf32_Internal_Shdr *)); -static void mips_elf_symbol_processing PARAMS ((bfd *, asymbol *)); -static boolean mips_elf_read_ecoff_info - PARAMS ((bfd *, asection *, struct ecoff_debug_info *)); -static boolean mips_elf_is_local_label - PARAMS ((bfd *, asymbol *)); -static boolean mips_elf_find_nearest_line - PARAMS ((bfd *, asection *, asymbol **, bfd_vma, const char **, - const char **, unsigned int *)); -static struct bfd_hash_entry *mips_elf_link_hash_newfunc - PARAMS ((struct bfd_hash_entry *, struct bfd_hash_table *, const char *)); -static struct bfd_link_hash_table *mips_elf_link_hash_table_create - PARAMS ((bfd *)); -static int gptab_compare PARAMS ((const void *, const void *)); -static boolean mips_elf_final_link - PARAMS ((bfd *, struct bfd_link_info *)); -static void mips_elf_relocate_hi16 - PARAMS ((bfd *, Elf_Internal_Rela *, Elf_Internal_Rela *, bfd_byte *, - bfd_vma)); -static void mips_elf_relocate_got_local - PARAMS ((bfd *, bfd *, asection *, Elf_Internal_Rela *, - Elf_Internal_Rela *, bfd_byte *, bfd_vma)); -static void mips_elf_relocate_global_got - PARAMS ((bfd *, Elf_Internal_Rela *, bfd_byte *, bfd_vma)); -static boolean mips_elf_adjust_dynindx - PARAMS ((struct elf_link_hash_entry *, PTR)); -static boolean mips_elf_relocate_section - PARAMS ((bfd *, struct bfd_link_info *, bfd *, asection *, bfd_byte *, - Elf_Internal_Rela *, Elf_Internal_Sym *, asection **)); -static boolean mips_elf_create_dynamic_sections - PARAMS ((bfd *, struct bfd_link_info *)); -static boolean mips_elf_create_compact_rel_section - PARAMS ((bfd *, struct bfd_link_info *)); -static boolean mips_elf_create_got_section - PARAMS ((bfd *, struct bfd_link_info *)); -static boolean mips_elf_check_relocs - PARAMS ((bfd *, struct bfd_link_info *, asection *, - const Elf_Internal_Rela *)); -static boolean mips_elf_adjust_dynamic_symbol - PARAMS ((struct bfd_link_info *, struct elf_link_hash_entry *)); -static boolean mips_elf_size_dynamic_sections - PARAMS ((bfd *, struct bfd_link_info *)); -static boolean mips_elf_finish_dynamic_symbol - PARAMS ((bfd *, struct bfd_link_info *, struct elf_link_hash_entry *, - Elf_Internal_Sym *)); -static boolean mips_elf_finish_dynamic_sections - PARAMS ((bfd *, struct bfd_link_info *)); -static boolean mips_elf_add_symbol_hook - PARAMS ((bfd *, struct bfd_link_info *, const Elf_Internal_Sym *, - const char **, flagword *, asection **, bfd_vma *)); -static bfd_reloc_status_type mips_elf_final_gp - PARAMS ((bfd *, asymbol *, boolean, char **, bfd_vma *)); -static bfd_byte *elf32_mips_get_relocated_section_contents - PARAMS ((bfd *, struct bfd_link_info *, struct bfd_link_order *, - bfd_byte *, boolean, asymbol **)); - -/* This is true for Irix 5 executables, false for normal MIPS ELF ABI - executables. FIXME: At the moment, we default to always generating - Irix 5 executables. */ - -#define SGI_COMPAT(abfd) (1) - -/* This structure is used to hold .got information when linking. It - is stored in the tdata field of the bfd_elf_section_data structure. */ - -struct mips_got_info -{ - /* The symbol index of the first global .got symbol. */ - unsigned long global_gotsym; - /* The number of local .got entries. */ - unsigned int local_gotno; -}; - -/* The number of local .got entries we reserve. */ -#define MIPS_RESERVED_GOTNO (2) - -/* Instructions which appear in a stub. For some reason the stub is - slightly different on an SGI system. */ -#define ELF_MIPS_GP_OFFSET(abfd) (SGI_COMPAT (abfd) ? 0x7ff0 : 0x8000) -#define STUB_LW(abfd) \ - (SGI_COMPAT (abfd) \ - ? 0x8f998010 /* lw t9,0x8010(gp) */ \ - : 0x8f998000) /* lw t9,0x8000(gp) */ -#define STUB_MOVE 0x03e07825 /* move t7,ra */ -#define STUB_JALR 0x0320f809 /* jal t9 */ -#define STUB_LI16 0x34180000 /* ori t8,zero,0 */ -#define MIPS_FUNCTION_STUB_SIZE (16) - -/* Names of sections which appear in the .dynsym section in an Irix 5 - executable. */ - -static const char * const mips_elf_dynsym_sec_names[] = -{ - ".text", - ".init", - ".fini", - ".data", - ".rodata", - ".sdata", - ".sbss", - ".bss", - NULL -}; - -#define SIZEOF_MIPS_DYNSYM_SECNAMES \ - (sizeof mips_elf_dynsym_sec_names / sizeof mips_elf_dynsym_sec_names[0]) - -/* The number of entries in mips_elf_dynsym_sec_names which go in the - text segment. */ - -#define MIPS_TEXT_DYNSYM_SECNO (3) - -/* The names of the runtime procedure table symbols used on Irix 5. */ - -static const char * const mips_elf_dynsym_rtproc_names[] = -{ - "_procedure_table", - "_procedure_string_table", - "_procedure_table_size", - NULL -}; - -/* These structures are used to generate the .compact_rel section on - Irix 5. */ - -typedef struct -{ - unsigned long id1; /* Always one? */ - unsigned long num; /* Number of compact relocation entries. */ - unsigned long id2; /* Always two? */ - unsigned long offset; /* The file offset of the first relocation. */ - unsigned long reserved0; /* Zero? */ - unsigned long reserved1; /* Zero? */ -} Elf32_compact_rel; - -typedef struct -{ - bfd_byte id1[4]; - bfd_byte num[4]; - bfd_byte id2[4]; - bfd_byte offset[4]; - bfd_byte reserved0[4]; - bfd_byte reserved1[4]; -} Elf32_External_compact_rel; - -typedef struct -{ - unsigned int ctype : 1; /* 1: long 0: short format. See below. */ - unsigned int rtype : 4; /* Relocation types. See below. */ - unsigned int dist2to : 8; - unsigned int relvaddr : 19; /* (VADDR - vaddr of the previous entry)/ 4 */ - unsigned long konst; /* KONST field. See below. */ - unsigned long vaddr; /* VADDR to be relocated. */ -} Elf32_crinfo; - -typedef struct -{ - unsigned int ctype : 1; /* 1: long 0: short format. See below. */ - unsigned int rtype : 4; /* Relocation types. See below. */ - unsigned int dist2to : 8; - unsigned int relvaddr : 19; /* (VADDR - vaddr of the previous entry)/ 4 */ - unsigned long konst; /* KONST field. See below. */ -} Elf32_crinfo2; - -typedef struct -{ - bfd_byte info[4]; - bfd_byte konst[4]; - bfd_byte vaddr[4]; -} Elf32_External_crinfo; - -typedef struct -{ - bfd_byte info[4]; - bfd_byte konst[4]; -} Elf32_External_crinfo2; - -/* These are the constants used to swap the bitfields in a crinfo. */ - -#define CRINFO_CTYPE (0x1) -#define CRINFO_CTYPE_SH (31) -#define CRINFO_RTYPE (0xf) -#define CRINFO_RTYPE_SH (27) -#define CRINFO_DIST2TO (0xff) -#define CRINFO_DIST2TO_SH (19) -#define CRINFO_RELVADDR (0x7ffff) -#define CRINFO_RELVADDR_SH (0) - -/* A compact relocation info has long (3 words) or short (2 words) - formats. A short format doesn't have VADDR field and relvaddr - fields contains ((VADDR - vaddr of the previous entry) >> 2). */ -#define CRF_MIPS_LONG 1 -#define CRF_MIPS_SHORT 0 - -/* There are 4 types of compact relocation at least. The value KONST - has different meaning for each type: - - (type) (konst) - CT_MIPS_REL32 Address in data - CT_MIPS_WORD Address in word (XXX) - CT_MIPS_GPHI_LO GP - vaddr - CT_MIPS_JMPAD Address to jump - */ - -#define CRT_MIPS_REL32 0xa -#define CRT_MIPS_WORD 0xb -#define CRT_MIPS_GPHI_LO 0xc -#define CRT_MIPS_JMPAD 0xd - -#define mips_elf_set_cr_format(x,format) ((x).ctype = (format)) -#define mips_elf_set_cr_type(x,type) ((x).rtype = (type)) -#define mips_elf_set_cr_dist2to(x,v) ((x).dist2to = (v)) -#define mips_elf_set_cr_relvaddr(x,d) ((x).relvaddr = (d)<<2) - -static void bfd_elf32_swap_compact_rel_out - PARAMS ((bfd *, const Elf32_compact_rel *, Elf32_External_compact_rel *)); -static void bfd_elf32_swap_crinfo_out - PARAMS ((bfd *, const Elf32_crinfo *, Elf32_External_crinfo *)); - -#define USE_REL 1 /* MIPS uses REL relocations instead of RELA */ - -enum reloc_type -{ - R_MIPS_NONE = 0, - R_MIPS_16, R_MIPS_32, - R_MIPS_REL32, R_MIPS_26, - R_MIPS_HI16, R_MIPS_LO16, - R_MIPS_GPREL16, R_MIPS_LITERAL, - R_MIPS_GOT16, R_MIPS_PC16, - R_MIPS_CALL16, R_MIPS_GPREL32, - /* The remaining relocs are defined on Irix, although they are not - in the MIPS ELF ABI. */ - R_MIPS_UNUSED1, R_MIPS_UNUSED2, - R_MIPS_UNUSED3, - R_MIPS_SHIFT5, R_MIPS_SHIFT6, - R_MIPS_64, R_MIPS_GOT_DISP, - R_MIPS_GOT_PAGE, R_MIPS_GOT_OFST, - R_MIPS_GOT_HI16, R_MIPS_GOT_LO16, - R_MIPS_SUB, R_MIPS_INSERT_A, - R_MIPS_INSERT_B, R_MIPS_DELETE, - R_MIPS_HIGHER, R_MIPS_HIGHEST, - R_MIPS_CALL_HI16, R_MIPS_CALL_LO16, - R_MIPS_max -}; - -static reloc_howto_type elf_mips_howto_table[] = -{ - /* No relocation. */ - HOWTO (R_MIPS_NONE, /* type */ - 0, /* rightshift */ - 0, /* size (0 = byte, 1 = short, 2 = long) */ - 0, /* bitsize */ - false, /* pc_relative */ - 0, /* bitpos */ - complain_overflow_dont, /* complain_on_overflow */ - bfd_elf_generic_reloc, /* special_function */ - "R_MIPS_NONE", /* name */ - false, /* partial_inplace */ - 0, /* src_mask */ - 0, /* dst_mask */ - false), /* pcrel_offset */ - - /* 16 bit relocation. */ - HOWTO (R_MIPS_16, /* type */ - 0, /* rightshift */ - 1, /* size (0 = byte, 1 = short, 2 = long) */ - 16, /* bitsize */ - false, /* pc_relative */ - 0, /* bitpos */ - complain_overflow_bitfield, /* complain_on_overflow */ - bfd_elf_generic_reloc, /* special_function */ - "R_MIPS_16", /* name */ - true, /* partial_inplace */ - 0xffff, /* src_mask */ - 0xffff, /* dst_mask */ - false), /* pcrel_offset */ - - /* 32 bit relocation. */ - HOWTO (R_MIPS_32, /* type */ - 0, /* rightshift */ - 2, /* size (0 = byte, 1 = short, 2 = long) */ - 32, /* bitsize */ - false, /* pc_relative */ - 0, /* bitpos */ - complain_overflow_bitfield, /* complain_on_overflow */ - bfd_elf_generic_reloc, /* special_function */ - "R_MIPS_32", /* name */ - true, /* partial_inplace */ - 0xffffffff, /* src_mask */ - 0xffffffff, /* dst_mask */ - false), /* pcrel_offset */ - - /* 32 bit symbol relative relocation. */ - HOWTO (R_MIPS_REL32, /* type */ - 0, /* rightshift */ - 2, /* size (0 = byte, 1 = short, 2 = long) */ - 32, /* bitsize */ - false, /* pc_relative */ - 0, /* bitpos */ - complain_overflow_bitfield, /* complain_on_overflow */ - bfd_elf_generic_reloc, /* special_function */ - "R_MIPS_REL32", /* name */ - true, /* partial_inplace */ - 0xffffffff, /* src_mask */ - 0xffffffff, /* dst_mask */ - false), /* pcrel_offset */ - - /* 26 bit branch address. */ - HOWTO (R_MIPS_26, /* type */ - 2, /* rightshift */ - 2, /* size (0 = byte, 1 = short, 2 = long) */ - 26, /* bitsize */ - false, /* pc_relative */ - 0, /* bitpos */ - complain_overflow_dont, /* complain_on_overflow */ - /* This needs complex overflow - detection, because the upper four - bits must match the PC. */ - bfd_elf_generic_reloc, /* special_function */ - "R_MIPS_26", /* name */ - true, /* partial_inplace */ - 0x3ffffff, /* src_mask */ - 0x3ffffff, /* dst_mask */ - false), /* pcrel_offset */ - - /* High 16 bits of symbol value. */ - HOWTO (R_MIPS_HI16, /* type */ - 0, /* rightshift */ - 2, /* size (0 = byte, 1 = short, 2 = long) */ - 16, /* bitsize */ - false, /* pc_relative */ - 0, /* bitpos */ - complain_overflow_dont, /* complain_on_overflow */ - mips_elf_hi16_reloc, /* special_function */ - "R_MIPS_HI16", /* name */ - true, /* partial_inplace */ - 0xffff, /* src_mask */ - 0xffff, /* dst_mask */ - false), /* pcrel_offset */ - - /* Low 16 bits of symbol value. */ - HOWTO (R_MIPS_LO16, /* type */ - 0, /* rightshift */ - 2, /* size (0 = byte, 1 = short, 2 = long) */ - 16, /* bitsize */ - false, /* pc_relative */ - 0, /* bitpos */ - complain_overflow_dont, /* complain_on_overflow */ - mips_elf_lo16_reloc, /* special_function */ - "R_MIPS_LO16", /* name */ - true, /* partial_inplace */ - 0xffff, /* src_mask */ - 0xffff, /* dst_mask */ - false), /* pcrel_offset */ - - /* GP relative reference. */ - HOWTO (R_MIPS_GPREL16, /* type */ - 0, /* rightshift */ - 2, /* size (0 = byte, 1 = short, 2 = long) */ - 16, /* bitsize */ - false, /* pc_relative */ - 0, /* bitpos */ - complain_overflow_signed, /* complain_on_overflow */ - mips_elf_gprel16_reloc, /* special_function */ - "R_MIPS_GPREL16", /* name */ - true, /* partial_inplace */ - 0xffff, /* src_mask */ - 0xffff, /* dst_mask */ - false), /* pcrel_offset */ - - /* Reference to literal section. */ - HOWTO (R_MIPS_LITERAL, /* type */ - 0, /* rightshift */ - 2, /* size (0 = byte, 1 = short, 2 = long) */ - 16, /* bitsize */ - false, /* pc_relative */ - 0, /* bitpos */ - complain_overflow_signed, /* complain_on_overflow */ - mips_elf_gprel16_reloc, /* special_function */ - "R_MIPS_LITERAL", /* name */ - true, /* partial_inplace */ - 0xffff, /* src_mask */ - 0xffff, /* dst_mask */ - false), /* pcrel_offset */ - - /* Reference to global offset table. */ - HOWTO (R_MIPS_GOT16, /* type */ - 0, /* rightshift */ - 2, /* size (0 = byte, 1 = short, 2 = long) */ - 16, /* bitsize */ - false, /* pc_relative */ - 0, /* bitpos */ - complain_overflow_signed, /* complain_on_overflow */ - mips_elf_got16_reloc, /* special_function */ - "R_MIPS_GOT16", /* name */ - false, /* partial_inplace */ - 0, /* src_mask */ - 0xffff, /* dst_mask */ - false), /* pcrel_offset */ - - /* 16 bit PC relative reference. */ - HOWTO (R_MIPS_PC16, /* type */ - 0, /* rightshift */ - 2, /* size (0 = byte, 1 = short, 2 = long) */ - 16, /* bitsize */ - true, /* pc_relative */ - 0, /* bitpos */ - complain_overflow_signed, /* complain_on_overflow */ - bfd_elf_generic_reloc, /* special_function */ - "R_MIPS_PC16", /* name */ - true, /* partial_inplace */ - 0xffff, /* src_mask */ - 0xffff, /* dst_mask */ - false), /* pcrel_offset */ - - /* 16 bit call through global offset table. */ - /* FIXME: This is not handled correctly. */ - HOWTO (R_MIPS_CALL16, /* type */ - 0, /* rightshift */ - 2, /* size (0 = byte, 1 = short, 2 = long) */ - 16, /* bitsize */ - false, /* pc_relative */ - 0, /* bitpos */ - complain_overflow_signed, /* complain_on_overflow */ - bfd_elf_generic_reloc, /* special_function */ - "R_MIPS_CALL16", /* name */ - false, /* partial_inplace */ - 0, /* src_mask */ - 0xffff, /* dst_mask */ - false), /* pcrel_offset */ - - /* 32 bit GP relative reference. */ - HOWTO (R_MIPS_GPREL32, /* type */ - 0, /* rightshift */ - 2, /* size (0 = byte, 1 = short, 2 = long) */ - 32, /* bitsize */ - false, /* pc_relative */ - 0, /* bitpos */ - complain_overflow_bitfield, /* complain_on_overflow */ - mips_elf_gprel32_reloc, /* special_function */ - "R_MIPS_GPREL32", /* name */ - true, /* partial_inplace */ - 0xffffffff, /* src_mask */ - 0xffffffff, /* dst_mask */ - false), /* pcrel_offset */ - - /* The remaining relocs are defined on Irix 5, although they are - not defined by the ABI. */ - { 13 }, - { 14 }, - { 15 }, - - /* A 5 bit shift field. */ - HOWTO (R_MIPS_SHIFT5, /* type */ - 0, /* rightshift */ - 2, /* size (0 = byte, 1 = short, 2 = long) */ - 5, /* bitsize */ - false, /* pc_relative */ - 6, /* bitpos */ - complain_overflow_bitfield, /* complain_on_overflow */ - bfd_elf_generic_reloc, /* special_function */ - "R_MIPS_SHIFT5", /* name */ - true, /* partial_inplace */ - 0x000007c0, /* src_mask */ - 0x000007c0, /* dst_mask */ - false), /* pcrel_offset */ - - /* A 6 bit shift field. */ - /* FIXME: This is not handled correctly; a special function is - needed to put the most significant bit in the right place. */ - HOWTO (R_MIPS_SHIFT6, /* type */ - 0, /* rightshift */ - 2, /* size (0 = byte, 1 = short, 2 = long) */ - 6, /* bitsize */ - false, /* pc_relative */ - 6, /* bitpos */ - complain_overflow_bitfield, /* complain_on_overflow */ - bfd_elf_generic_reloc, /* special_function */ - "R_MIPS_SHIFT6", /* name */ - true, /* partial_inplace */ - 0x000007c4, /* src_mask */ - 0x000007c4, /* dst_mask */ - false), /* pcrel_offset */ - - /* A 64 bit relocation. Presumably not used in 32 bit ELF. */ - { R_MIPS_64 }, - - /* Displacement in the global offset table. */ - /* FIXME: Not handled correctly. */ - HOWTO (R_MIPS_GOT_DISP, /* type */ - 0, /* rightshift */ - 2, /* size (0 = byte, 1 = short, 2 = long) */ - 16, /* bitsize */ - false, /* pc_relative */ - 0, /* bitpos */ - complain_overflow_bitfield, /* complain_on_overflow */ - bfd_elf_generic_reloc, /* special_function */ - "R_MIPS_GOT_DISP", /* name */ - true, /* partial_inplace */ - 0x0000ffff, /* src_mask */ - 0x0000ffff, /* dst_mask */ - false), /* pcrel_offset */ - - /* Displacement to page pointer in the global offset table. */ - /* FIXME: Not handled correctly. */ - HOWTO (R_MIPS_GOT_PAGE, /* type */ - 0, /* rightshift */ - 2, /* size (0 = byte, 1 = short, 2 = long) */ - 16, /* bitsize */ - false, /* pc_relative */ - 0, /* bitpos */ - complain_overflow_bitfield, /* complain_on_overflow */ - bfd_elf_generic_reloc, /* special_function */ - "R_MIPS_GOT_PAGE", /* name */ - true, /* partial_inplace */ - 0x0000ffff, /* src_mask */ - 0x0000ffff, /* dst_mask */ - false), /* pcrel_offset */ - - /* Offset from page pointer in the global offset table. */ - /* FIXME: Not handled correctly. */ - HOWTO (R_MIPS_GOT_OFST, /* type */ - 0, /* rightshift */ - 2, /* size (0 = byte, 1 = short, 2 = long) */ - 16, /* bitsize */ - false, /* pc_relative */ - 0, /* bitpos */ - complain_overflow_bitfield, /* complain_on_overflow */ - bfd_elf_generic_reloc, /* special_function */ - "R_MIPS_GOT_OFST", /* name */ - true, /* partial_inplace */ - 0x0000ffff, /* src_mask */ - 0x0000ffff, /* dst_mask */ - false), /* pcrel_offset */ - - /* High 16 bits of displacement in global offset table. */ - /* FIXME: Not handled correctly. */ - HOWTO (R_MIPS_GOT_HI16, /* type */ - 0, /* rightshift */ - 2, /* size (0 = byte, 1 = short, 2 = long) */ - 16, /* bitsize */ - false, /* pc_relative */ - 0, /* bitpos */ - complain_overflow_dont, /* complain_on_overflow */ - bfd_elf_generic_reloc, /* special_function */ - "R_MIPS_GOT_HI16", /* name */ - true, /* partial_inplace */ - 0x0000ffff, /* src_mask */ - 0x0000ffff, /* dst_mask */ - false), /* pcrel_offset */ - - /* Low 16 bits of displacement in global offset table. */ - /* FIXME: Not handled correctly. */ - HOWTO (R_MIPS_GOT_LO16, /* type */ - 0, /* rightshift */ - 2, /* size (0 = byte, 1 = short, 2 = long) */ - 16, /* bitsize */ - false, /* pc_relative */ - 0, /* bitpos */ - complain_overflow_dont, /* complain_on_overflow */ - bfd_elf_generic_reloc, /* special_function */ - "R_MIPS_GOT_LO16", /* name */ - true, /* partial_inplace */ - 0x0000ffff, /* src_mask */ - 0x0000ffff, /* dst_mask */ - false), /* pcrel_offset */ - - /* 64 bit subtraction. Presumably not used in 32 bit ELF. */ - { R_MIPS_SUB }, - - /* Used to cause the linker to insert and delete instructions? */ - { R_MIPS_INSERT_A }, - { R_MIPS_INSERT_B }, - { R_MIPS_DELETE }, - - /* Get the higher values of a 64 bit addend. Presumably not used in - 32 bit ELF. */ - { R_MIPS_HIGHER }, - { R_MIPS_HIGHEST }, - - /* High 16 bits of displacement in global offset table. */ - /* FIXME: Not handled correctly. */ - HOWTO (R_MIPS_CALL_HI16, /* type */ - 0, /* rightshift */ - 2, /* size (0 = byte, 1 = short, 2 = long) */ - 16, /* bitsize */ - false, /* pc_relative */ - 0, /* bitpos */ - complain_overflow_dont, /* complain_on_overflow */ - bfd_elf_generic_reloc, /* special_function */ - "R_MIPS_CALL_HI16", /* name */ - true, /* partial_inplace */ - 0x0000ffff, /* src_mask */ - 0x0000ffff, /* dst_mask */ - false), /* pcrel_offset */ - - /* Low 16 bits of displacement in global offset table. */ - /* FIXME: Not handled correctly. */ - HOWTO (R_MIPS_CALL_LO16, /* type */ - 0, /* rightshift */ - 2, /* size (0 = byte, 1 = short, 2 = long) */ - 16, /* bitsize */ - false, /* pc_relative */ - 0, /* bitpos */ - complain_overflow_dont, /* complain_on_overflow */ - bfd_elf_generic_reloc, /* special_function */ - "R_MIPS_CALL_LO16", /* name */ - true, /* partial_inplace */ - 0x0000ffff, /* src_mask */ - 0x0000ffff, /* dst_mask */ - false) /* pcrel_offset */ -}; - -/* Do a R_MIPS_HI16 relocation. This has to be done in combination - with a R_MIPS_LO16 reloc, because there is a carry from the LO16 to - the HI16. Here we just save the information we need; we do the - actual relocation when we see the LO16. MIPS ELF requires that the - LO16 immediately follow the HI16, so this ought to work. */ - -static bfd_byte *mips_hi16_addr; -static bfd_vma mips_hi16_addend; - -static bfd_reloc_status_type -mips_elf_hi16_reloc (abfd, - reloc_entry, - symbol, - data, - input_section, - output_bfd, - error_message) - bfd *abfd; - arelent *reloc_entry; - asymbol *symbol; - PTR data; - asection *input_section; - bfd *output_bfd; - char **error_message; -{ - bfd_reloc_status_type ret; - bfd_vma relocation; - - /* If we're relocating, and this an external symbol, we don't want - to change anything. */ - if (output_bfd != (bfd *) NULL - && (symbol->flags & BSF_SECTION_SYM) == 0 - && reloc_entry->addend == 0) - { - reloc_entry->address += input_section->output_offset; - return bfd_reloc_ok; - } - - ret = bfd_reloc_ok; - - if (strcmp (bfd_asymbol_name (symbol), "_gp_disp") == 0) - { - boolean relocateable; - bfd_vma gp; - - if (ret == bfd_reloc_undefined) - abort (); - - if (output_bfd != NULL) - relocateable = true; - else - { - relocateable = false; - output_bfd = symbol->section->output_section->owner; - } - - ret = mips_elf_final_gp (output_bfd, symbol, relocateable, - error_message, &gp); - if (ret != bfd_reloc_ok) - return ret; - - relocation = gp - reloc_entry->address; - } - else - { - if (bfd_is_und_section (symbol->section) - && output_bfd == (bfd *) NULL) - ret = bfd_reloc_undefined; - - if (bfd_is_com_section (symbol->section)) - relocation = 0; - else - relocation = symbol->value; - } - - relocation += symbol->section->output_section->vma; - relocation += symbol->section->output_offset; - relocation += reloc_entry->addend; - - if (reloc_entry->address > input_section->_cooked_size) - return bfd_reloc_outofrange; - - /* Save the information, and let LO16 do the actual relocation. */ - mips_hi16_addr = (bfd_byte *) data + reloc_entry->address; - mips_hi16_addend = relocation; - - if (output_bfd != (bfd *) NULL) - reloc_entry->address += input_section->output_offset; - - return ret; -} - -/* Do a R_MIPS_LO16 relocation. This is a straightforward 16 bit - inplace relocation; this function exists in order to do the - R_MIPS_HI16 relocation described above. */ - -static bfd_reloc_status_type -mips_elf_lo16_reloc (abfd, - reloc_entry, - symbol, - data, - input_section, - output_bfd, - error_message) - bfd *abfd; - arelent *reloc_entry; - asymbol *symbol; - PTR data; - asection *input_section; - bfd *output_bfd; - char **error_message; -{ - arelent gp_disp_relent; - - if (mips_hi16_addr != (bfd_byte *) NULL) - { - unsigned long insn; - unsigned long val; - unsigned long vallo; - - /* Do the HI16 relocation. Note that we actually don't need to - know anything about the LO16 itself, except where to find the - low 16 bits of the addend needed by the LO16. */ - insn = bfd_get_32 (abfd, mips_hi16_addr); - vallo = (bfd_get_32 (abfd, (bfd_byte *) data + reloc_entry->address) - & 0xffff); - val = ((insn & 0xffff) << 16) + vallo; - val += mips_hi16_addend; - - /* The low order 16 bits are always treated as a signed value. - Therefore, a negative value in the low order bits requires an - adjustment in the high order bits. We need to make this - adjustment in two ways: once for the bits we took from the - data, and once for the bits we are putting back in to the - data. */ - if ((vallo & 0x8000) != 0) - val -= 0x10000; - if ((val & 0x8000) != 0) - val += 0x10000; - - insn = (insn &~ 0xffff) | ((val >> 16) & 0xffff); - bfd_put_32 (abfd, insn, mips_hi16_addr); - - mips_hi16_addr = (bfd_byte *) NULL; - - if (strcmp (bfd_asymbol_name (symbol), "_gp_disp") == 0) - { - gp_disp_relent = *reloc_entry; - reloc_entry = &gp_disp_relent; - reloc_entry->addend = mips_hi16_addend; - } - } - else if (strcmp (bfd_asymbol_name (symbol), "_gp_disp") == 0) - { - bfd_reloc_status_type ret; - bfd_vma gp, relocation; - - /* FIXME: Does this case ever occur? */ - - ret = mips_elf_final_gp (output_bfd, symbol, true, error_message, &gp); - if (ret != bfd_reloc_ok) - return ret; - - relocation = gp - reloc_entry->address; - relocation += symbol->section->output_section->vma; - relocation += symbol->section->output_offset; - relocation += reloc_entry->addend; - - if (reloc_entry->address > input_section->_cooked_size) - return bfd_reloc_outofrange; - - gp_disp_relent = *reloc_entry; - reloc_entry = &gp_disp_relent; - reloc_entry->addend = relocation - 4; - } - - /* Now do the LO16 reloc in the usual way. */ - return bfd_elf_generic_reloc (abfd, reloc_entry, symbol, data, - input_section, output_bfd, error_message); -} - -/* Do a R_MIPS_GOT16 reloc. This is a reloc against the global offset - table used for PIC code. If the symbol is an external symbol, the - instruction is modified to contain the offset of the appropriate - entry in the global offset table. If the symbol is a section - symbol, the next reloc is a R_MIPS_LO16 reloc. The two 16 bit - addends are combined to form the real addend against the section - symbol; the GOT16 is modified to contain the offset of an entry in - the global offset table, and the LO16 is modified to offset it - appropriately. Thus an offset larger than 16 bits requires a - modified value in the global offset table. - - This implementation suffices for the assembler, but the linker does - not yet know how to create global offset tables. */ - -static bfd_reloc_status_type -mips_elf_got16_reloc (abfd, - reloc_entry, - symbol, - data, - input_section, - output_bfd, - error_message) - bfd *abfd; - arelent *reloc_entry; - asymbol *symbol; - PTR data; - asection *input_section; - bfd *output_bfd; - char **error_message; -{ - /* If we're relocating, and this an external symbol, we don't want - to change anything. */ - if (output_bfd != (bfd *) NULL - && (symbol->flags & BSF_SECTION_SYM) == 0 - && reloc_entry->addend == 0) - { - reloc_entry->address += input_section->output_offset; - return bfd_reloc_ok; - } - - /* If we're relocating, and this is a local symbol, we can handle it - just like HI16. */ - if (output_bfd != (bfd *) NULL - && (symbol->flags & BSF_SECTION_SYM) != 0) - return mips_elf_hi16_reloc (abfd, reloc_entry, symbol, data, - input_section, output_bfd, error_message); - - abort (); -} - -/* We have to figure out the gp value, so that we can adjust the - symbol value correctly. We look up the symbol _gp in the output - BFD. If we can't find it, we're stuck. We cache it in the ELF - target data. We don't need to adjust the symbol value for an - external symbol if we are producing relocateable output. */ - -static bfd_reloc_status_type -mips_elf_final_gp (output_bfd, symbol, relocateable, error_message, pgp) - bfd *output_bfd; - asymbol *symbol; - boolean relocateable; - char **error_message; - bfd_vma *pgp; -{ - if (bfd_is_und_section (symbol->section) - && ! relocateable) - { - *pgp = 0; - return bfd_reloc_undefined; - } - - *pgp = _bfd_get_gp_value (output_bfd); - if (*pgp == 0 - && (! relocateable - || (symbol->flags & BSF_SECTION_SYM) != 0)) - { - if (relocateable) - { - /* Make up a value. */ - *pgp = symbol->section->output_section->vma + 0x4000; - _bfd_set_gp_value (output_bfd, *pgp); - } - else - { - unsigned int count; - asymbol **sym; - unsigned int i; - - count = bfd_get_symcount (output_bfd); - sym = bfd_get_outsymbols (output_bfd); - - if (sym == (asymbol **) NULL) - i = count; - else - { - for (i = 0; i < count; i++, sym++) - { - register CONST char *name; - - name = bfd_asymbol_name (*sym); - if (*name == '_' && strcmp (name, "_gp") == 0) - { - *pgp = bfd_asymbol_value (*sym); - _bfd_set_gp_value (output_bfd, *pgp); - break; - } - } - } - - if (i >= count) - { - /* Only get the error once. */ - *pgp = 4; - _bfd_set_gp_value (output_bfd, *pgp); - *error_message = - (char *) "GP relative relocation when _gp not defined"; - return bfd_reloc_dangerous; - } - } - } - - return bfd_reloc_ok; -} - -/* Do a R_MIPS_GPREL16 relocation. This is a 16 bit value which must - become the offset from the gp register. This function also handles - R_MIPS_LITERAL relocations, although those can be handled more - cleverly because the entries in the .lit8 and .lit4 sections can be - merged. */ - -static bfd_reloc_status_type gprel16_with_gp PARAMS ((bfd *, asymbol *, - arelent *, asection *, - boolean, PTR, bfd_vma)); - -static bfd_reloc_status_type -mips_elf_gprel16_reloc (abfd, - reloc_entry, - symbol, - data, - input_section, - output_bfd, - error_message) - bfd *abfd; - arelent *reloc_entry; - asymbol *symbol; - PTR data; - asection *input_section; - bfd *output_bfd; - char **error_message; -{ - boolean relocateable; - bfd_reloc_status_type ret; - bfd_vma gp; - - /* If we're relocating, and this is an external symbol with no - addend, we don't want to change anything. We will only have an - addend if this is a newly created reloc, not read from an ELF - file. */ - if (output_bfd != (bfd *) NULL - && (symbol->flags & BSF_SECTION_SYM) == 0 - && reloc_entry->addend == 0) - { - reloc_entry->address += input_section->output_offset; - return bfd_reloc_ok; - } - - if (output_bfd != (bfd *) NULL) - relocateable = true; - else - { - relocateable = false; - output_bfd = symbol->section->output_section->owner; - } - - ret = mips_elf_final_gp (output_bfd, symbol, relocateable, error_message, - &gp); - if (ret != bfd_reloc_ok) - return ret; - - return gprel16_with_gp (abfd, symbol, reloc_entry, input_section, - relocateable, data, gp); -} - -static bfd_reloc_status_type -gprel16_with_gp (abfd, symbol, reloc_entry, input_section, relocateable, data, - gp) - bfd *abfd; - asymbol *symbol; - arelent *reloc_entry; - asection *input_section; - boolean relocateable; - PTR data; - bfd_vma gp; -{ - bfd_vma relocation; - unsigned long insn; - unsigned long val; - - if (bfd_is_com_section (symbol->section)) - relocation = 0; - else - relocation = symbol->value; - - relocation += symbol->section->output_section->vma; - relocation += symbol->section->output_offset; - - if (reloc_entry->address > input_section->_cooked_size) - return bfd_reloc_outofrange; - - insn = bfd_get_32 (abfd, (bfd_byte *) data + reloc_entry->address); - - /* Set val to the offset into the section or symbol. */ - val = ((insn & 0xffff) + reloc_entry->addend) & 0xffff; - if (val & 0x8000) - val -= 0x10000; - - /* Adjust val for the final section location and GP value. If we - are producing relocateable output, we don't want to do this for - an external symbol. */ - if (! relocateable - || (symbol->flags & BSF_SECTION_SYM) != 0) - val += relocation - gp; - - insn = (insn &~ 0xffff) | (val & 0xffff); - bfd_put_32 (abfd, insn, (bfd_byte *) data + reloc_entry->address); - - if (relocateable) - reloc_entry->address += input_section->output_offset; - - /* Make sure it fit in 16 bits. */ - if (val >= 0x8000 && val < 0xffff8000) - return bfd_reloc_overflow; - - return bfd_reloc_ok; -} - -/* Do a R_MIPS_GPREL32 relocation. Is this 32 bit value the offset - from the gp register? XXX */ - -static bfd_reloc_status_type gprel32_with_gp PARAMS ((bfd *, asymbol *, - arelent *, asection *, - boolean, PTR, bfd_vma)); - -static bfd_reloc_status_type -mips_elf_gprel32_reloc (abfd, - reloc_entry, - symbol, - data, - input_section, - output_bfd, - error_message) - bfd *abfd; - arelent *reloc_entry; - asymbol *symbol; - PTR data; - asection *input_section; - bfd *output_bfd; - char **error_message; -{ - boolean relocateable; - bfd_reloc_status_type ret; - bfd_vma gp; - - /* If we're relocating, and this is an external symbol with no - addend, we don't want to change anything. We will only have an - addend if this is a newly created reloc, not read from an ELF - file. */ - if (output_bfd != (bfd *) NULL - && (symbol->flags & BSF_SECTION_SYM) == 0 - && reloc_entry->addend == 0) - { - *error_message = (char *) - "32bits gp relative relocation occurs for an external symbol"; - return bfd_reloc_outofrange; - } - - if (output_bfd != (bfd *) NULL) - { - relocateable = true; - gp = _bfd_get_gp_value (output_bfd); - } - else - { - relocateable = false; - output_bfd = symbol->section->output_section->owner; - - ret = mips_elf_final_gp (output_bfd, symbol, relocateable, - error_message, &gp); - if (ret != bfd_reloc_ok) - return ret; - } - - return gprel32_with_gp (abfd, symbol, reloc_entry, input_section, - relocateable, data, gp); -} - -static bfd_reloc_status_type -gprel32_with_gp (abfd, symbol, reloc_entry, input_section, relocateable, data, - gp) - bfd *abfd; - asymbol *symbol; - arelent *reloc_entry; - asection *input_section; - boolean relocateable; - PTR data; - bfd_vma gp; -{ - bfd_vma relocation; - unsigned long val; - - if (bfd_is_com_section (symbol->section)) - relocation = 0; - else - relocation = symbol->value; - - relocation += symbol->section->output_section->vma; - relocation += symbol->section->output_offset; - - if (reloc_entry->address > input_section->_cooked_size) - return bfd_reloc_outofrange; - - val = bfd_get_32 (abfd, (bfd_byte *) data + reloc_entry->address); - - /* Set val to the offset into the section or symbol. */ - val += reloc_entry->addend; - - /* Adjust val for the final section location and GP value. If we - are producing relocateable output, we don't want to do this for - an external symbol. */ - if (! relocateable - || (symbol->flags & BSF_SECTION_SYM) != 0) - val += relocation - gp; - - bfd_put_32 (abfd, val, (bfd_byte *) data + reloc_entry->address); - - if (relocateable) - reloc_entry->address += input_section->output_offset; - - return bfd_reloc_ok; -} - -/* A mapping from BFD reloc types to MIPS ELF reloc types. */ - -struct elf_reloc_map { - bfd_reloc_code_real_type bfd_reloc_val; - enum reloc_type elf_reloc_val; -}; - -static CONST struct elf_reloc_map mips_reloc_map[] = -{ - { BFD_RELOC_NONE, R_MIPS_NONE, }, - { BFD_RELOC_16, R_MIPS_16 }, - { BFD_RELOC_32, R_MIPS_32 }, - { BFD_RELOC_CTOR, R_MIPS_32 }, - { BFD_RELOC_32_PCREL, R_MIPS_REL32 }, - { BFD_RELOC_MIPS_JMP, R_MIPS_26 }, - { BFD_RELOC_HI16_S, R_MIPS_HI16 }, - { BFD_RELOC_LO16, R_MIPS_LO16 }, - { BFD_RELOC_MIPS_GPREL, R_MIPS_GPREL16 }, - { BFD_RELOC_MIPS_LITERAL, R_MIPS_LITERAL }, - { BFD_RELOC_MIPS_GOT16, R_MIPS_GOT16 }, - { BFD_RELOC_16_PCREL, R_MIPS_PC16 }, - { BFD_RELOC_MIPS_CALL16, R_MIPS_CALL16 }, - { BFD_RELOC_MIPS_GPREL32, R_MIPS_GPREL32 }, - { BFD_RELOC_MIPS_GOT_HI16, R_MIPS_GOT_HI16 }, - { BFD_RELOC_MIPS_GOT_LO16, R_MIPS_GOT_LO16 }, - { BFD_RELOC_MIPS_CALL_HI16, R_MIPS_CALL_HI16 }, - { BFD_RELOC_MIPS_CALL_LO16, R_MIPS_CALL_LO16 } -}; - -/* Given a BFD reloc type, return a howto structure. */ - -static reloc_howto_type * -bfd_elf32_bfd_reloc_type_lookup (abfd, code) - bfd *abfd; - bfd_reloc_code_real_type code; -{ - unsigned int i; - - for (i = 0; i < sizeof (mips_reloc_map) / sizeof (struct elf_reloc_map); i++) - { - if (mips_reloc_map[i].bfd_reloc_val == code) - return &elf_mips_howto_table[(int) mips_reloc_map[i].elf_reloc_val]; - } - return NULL; -} - -/* Given a MIPS reloc type, fill in an arelent structure. */ - -static void -mips_info_to_howto_rel (abfd, cache_ptr, dst) - bfd *abfd; - arelent *cache_ptr; - Elf32_Internal_Rel *dst; -{ - unsigned int r_type; - - r_type = ELF32_R_TYPE (dst->r_info); - BFD_ASSERT (r_type < (unsigned int) R_MIPS_max); - cache_ptr->howto = &elf_mips_howto_table[r_type]; - - /* The addend for a GPREL16 or LITERAL relocation comes from the GP - value for the object file. We get the addend now, rather than - when we do the relocation, because the symbol manipulations done - by the linker may cause us to lose track of the input BFD. */ - if (((*cache_ptr->sym_ptr_ptr)->flags & BSF_SECTION_SYM) != 0 - && (r_type == (unsigned int) R_MIPS_GPREL16 - || r_type == (unsigned int) R_MIPS_LITERAL)) - cache_ptr->addend = elf_gp (abfd); -} - -/* A .reginfo section holds a single Elf32_RegInfo structure. These - routines swap this structure in and out. They are used outside of - BFD, so they are globally visible. */ - -void -bfd_mips_elf32_swap_reginfo_in (abfd, ex, in) - bfd *abfd; - const Elf32_External_RegInfo *ex; - Elf32_RegInfo *in; -{ - in->ri_gprmask = bfd_h_get_32 (abfd, (bfd_byte *) ex->ri_gprmask); - in->ri_cprmask[0] = bfd_h_get_32 (abfd, (bfd_byte *) ex->ri_cprmask[0]); - in->ri_cprmask[1] = bfd_h_get_32 (abfd, (bfd_byte *) ex->ri_cprmask[1]); - in->ri_cprmask[2] = bfd_h_get_32 (abfd, (bfd_byte *) ex->ri_cprmask[2]); - in->ri_cprmask[3] = bfd_h_get_32 (abfd, (bfd_byte *) ex->ri_cprmask[3]); - in->ri_gp_value = bfd_h_get_32 (abfd, (bfd_byte *) ex->ri_gp_value); -} - -void -bfd_mips_elf32_swap_reginfo_out (abfd, in, ex) - bfd *abfd; - const Elf32_RegInfo *in; - Elf32_External_RegInfo *ex; -{ - bfd_h_put_32 (abfd, (bfd_vma) in->ri_gprmask, - (bfd_byte *) ex->ri_gprmask); - bfd_h_put_32 (abfd, (bfd_vma) in->ri_cprmask[0], - (bfd_byte *) ex->ri_cprmask[0]); - bfd_h_put_32 (abfd, (bfd_vma) in->ri_cprmask[1], - (bfd_byte *) ex->ri_cprmask[1]); - bfd_h_put_32 (abfd, (bfd_vma) in->ri_cprmask[2], - (bfd_byte *) ex->ri_cprmask[2]); - bfd_h_put_32 (abfd, (bfd_vma) in->ri_cprmask[3], - (bfd_byte *) ex->ri_cprmask[3]); - bfd_h_put_32 (abfd, (bfd_vma) in->ri_gp_value, - (bfd_byte *) ex->ri_gp_value); -} - -/* Swap an entry in a .gptab section. Note that these routines rely - on the equivalence of the two elements of the union. */ - -static void -bfd_mips_elf32_swap_gptab_in (abfd, ex, in) - bfd *abfd; - const Elf32_External_gptab *ex; - Elf32_gptab *in; -{ - in->gt_entry.gt_g_value = bfd_h_get_32 (abfd, ex->gt_entry.gt_g_value); - in->gt_entry.gt_bytes = bfd_h_get_32 (abfd, ex->gt_entry.gt_bytes); -} - -static void -bfd_mips_elf32_swap_gptab_out (abfd, in, ex) - bfd *abfd; - const Elf32_gptab *in; - Elf32_External_gptab *ex; -{ - bfd_h_put_32 (abfd, (bfd_vma) in->gt_entry.gt_g_value, - ex->gt_entry.gt_g_value); - bfd_h_put_32 (abfd, (bfd_vma) in->gt_entry.gt_bytes, - ex->gt_entry.gt_bytes); -} - -static void -bfd_elf32_swap_compact_rel_out (abfd, in, ex) - bfd *abfd; - const Elf32_compact_rel *in; - Elf32_External_compact_rel *ex; -{ - bfd_h_put_32 (abfd, (bfd_vma) in->id1, ex->id1); - bfd_h_put_32 (abfd, (bfd_vma) in->num, ex->num); - bfd_h_put_32 (abfd, (bfd_vma) in->id2, ex->id2); - bfd_h_put_32 (abfd, (bfd_vma) in->offset, ex->offset); - bfd_h_put_32 (abfd, (bfd_vma) in->reserved0, ex->reserved0); - bfd_h_put_32 (abfd, (bfd_vma) in->reserved1, ex->reserved1); -} - -static void -bfd_elf32_swap_crinfo_out (abfd, in, ex) - bfd *abfd; - const Elf32_crinfo *in; - Elf32_External_crinfo *ex; -{ - unsigned long l; - - l = (((in->ctype & CRINFO_CTYPE) << CRINFO_CTYPE_SH) - | ((in->rtype & CRINFO_RTYPE) << CRINFO_RTYPE_SH) - | ((in->dist2to & CRINFO_DIST2TO) << CRINFO_DIST2TO_SH) - | ((in->relvaddr & CRINFO_RELVADDR) << CRINFO_RELVADDR_SH)); - bfd_h_put_32 (abfd, (bfd_vma) l, ex->info); - bfd_h_put_32 (abfd, (bfd_vma) in->konst, ex->konst); - bfd_h_put_32 (abfd, (bfd_vma) in->vaddr, ex->vaddr); -} - -/* Determine whether a symbol is global for the purposes of splitting - the symbol table into global symbols and local symbols. At least - on Irix 5, this split must be between section symbols and all other - symbols. On most ELF targets the split is between static symbols - and externally visible symbols. */ - -/*ARGSUSED*/ -static boolean -mips_elf_sym_is_global (abfd, sym) - bfd *abfd; - asymbol *sym; -{ - return (sym->flags & BSF_SECTION_SYM) == 0 ? true : false; -} - -/* Set the right machine number for a MIPS ELF file. */ - -static boolean -mips_elf_object_p (abfd) - bfd *abfd; -{ - switch (elf_elfheader (abfd)->e_flags & EF_MIPS_ARCH) - { - default: - case E_MIPS_ARCH_1: - /* Just use the default, which was set in elfcode.h. */ - break; - - case E_MIPS_ARCH_2: - (void) bfd_default_set_arch_mach (abfd, bfd_arch_mips, 6000); - break; - - case E_MIPS_ARCH_3: - (void) bfd_default_set_arch_mach (abfd, bfd_arch_mips, 4000); - break; - } - - /* Irix 5 is broken. Object file symbol tables are not always - sorted correctly such that local symbols precede global symbols, - and the sh_info field in the symbol table is not always right. */ - elf_bad_symtab (abfd) = true; - - return true; -} - -/* The final processing done just before writing out a MIPS ELF object - file. This gets the MIPS architecture right based on the machine - number. */ - -/*ARGSUSED*/ -static void -mips_elf_final_write_processing (abfd, linker) - bfd *abfd; - boolean linker; -{ - unsigned long val; - unsigned int i; - Elf_Internal_Shdr **hdrpp; - - switch (bfd_get_mach (abfd)) - { - case 3000: - val = E_MIPS_ARCH_1; - break; - - case 6000: - val = E_MIPS_ARCH_2; - break; - - case 4000: - val = E_MIPS_ARCH_3; - break; - - default: - val = 0; - break; - } - - elf_elfheader (abfd)->e_flags &=~ EF_MIPS_ARCH; - elf_elfheader (abfd)->e_flags |= val; - - /* Set the sh_info field for .gptab sections. */ - for (i = 1, hdrpp = elf_elfsections (abfd) + 1; - i < elf_elfheader (abfd)->e_shnum; - i++, hdrpp++) - { - if ((*hdrpp)->sh_type == SHT_MIPS_GPTAB) - { - const char *name; - asection *sec; - - BFD_ASSERT ((*hdrpp)->bfd_section != NULL); - name = bfd_get_section_name (abfd, (*hdrpp)->bfd_section); - BFD_ASSERT (name != NULL - && strncmp (name, ".gptab.", sizeof ".gptab." - 1) == 0); - sec = bfd_get_section_by_name (abfd, name + sizeof ".gptab" - 1); - BFD_ASSERT (sec != NULL); - (*hdrpp)->sh_info = elf_section_data (sec)->this_idx; - } - } -} - -/* Function to keep MIPS specific file flags like as EF_MIPS_PIC. */ - -static boolean -mips_elf_set_private_flags (abfd, flags) - bfd *abfd; - flagword flags; -{ - BFD_ASSERT (!elf_flags_init (abfd) - || elf_elfheader (abfd)->e_flags == flags); - - elf_elfheader (abfd)->e_flags = flags; - elf_flags_init (abfd) = true; - return true; -} - -/* Copy backend specific data from one object module to another */ - -static boolean -mips_elf_copy_private_bfd_data (ibfd, obfd) - bfd *ibfd; - bfd *obfd; -{ - /* This function is selected based on the input vector. We only - want to copy information over if the output BFD also uses Elf - format. */ - if (bfd_get_flavour (obfd) != bfd_target_elf_flavour) - return true; - - BFD_ASSERT (!elf_flags_init (obfd) - || (elf_elfheader (obfd)->e_flags - == elf_elfheader (ibfd)->e_flags)); - - elf_elfheader (obfd)->e_flags = elf_elfheader (ibfd)->e_flags; - elf_flags_init (obfd) = true; - return true; -} - -/* Merge backend specific data from an object file to the output - object file when linking. */ - -static boolean -mips_elf_merge_private_bfd_data (ibfd, obfd) - bfd *ibfd; - bfd *obfd; -{ - flagword old_flags; - flagword new_flags; - - /* Check if we have the same endianess */ - if (ibfd->xvec->byteorder != obfd->xvec->byteorder - && obfd->xvec->byteorder != BFD_ENDIAN_UNKNOWN) - { - (*_bfd_error_handler) - ("%s: compiled for a %s endian system and target is %s endian", - bfd_get_filename (ibfd), - bfd_big_endian (ibfd) ? "big" : "little", - bfd_big_endian (obfd) ? "big" : "little"); - - bfd_set_error (bfd_error_wrong_format); - return false; - } - - /* This function is selected based on the input vector. We only - want to copy information over if the output BFD also uses Elf - format. */ - if (bfd_get_flavour (obfd) != bfd_target_elf_flavour) - return true; - - new_flags = elf_elfheader (ibfd)->e_flags; - elf_elfheader (obfd)->e_flags |= new_flags & EF_MIPS_NOREORDER; - old_flags = elf_elfheader (obfd)->e_flags; - - if (!elf_flags_init (obfd)) /* First call, no flags set */ - { - elf_flags_init (obfd) = true; - elf_elfheader (obfd)->e_flags = new_flags; - } - else if (((new_flags ^ old_flags) & ~EF_MIPS_NOREORDER) - == 0) /* Compatible flags are ok */ - ; - else /* Incompatible flags */ - { - /* Warn about -fPIC mismatch */ - if ((new_flags & EF_MIPS_PIC) != (old_flags & EF_MIPS_PIC)) - { - new_flags &= ~EF_MIPS_PIC; - (*_bfd_error_handler) - ("%s: needs all files compiled with -fPIC", - bfd_get_filename (ibfd)); - } - - if ((new_flags & EF_MIPS_CPIC) != (old_flags & EF_MIPS_CPIC)) - { - new_flags &= ~EF_MIPS_CPIC; - (*_bfd_error_handler) - ("%s: needs all files compiled with -mabicalls", - bfd_get_filename (ibfd)); - } - - /* Warn about any other mismatches */ - if (new_flags != old_flags) - (*_bfd_error_handler) - ("%s: uses different e_flags (0x%lx) fields than previous modules (0x%lx)", - bfd_get_filename (ibfd), (unsigned long) new_flags, - (unsigned long) old_flags); - - bfd_set_error (bfd_error_bad_value); - return false; - } - - return true; -} - -/* Handle a MIPS specific section when reading an object file. This - is called when elfcode.h finds a section with an unknown type. - FIXME: We need to handle the SHF_MIPS_GPREL flag, but I'm not sure - how to. */ - -static boolean -mips_elf_section_from_shdr (abfd, hdr, name) - bfd *abfd; - Elf32_Internal_Shdr *hdr; - char *name; -{ - asection *newsect; - - /* There ought to be a place to keep ELF backend specific flags, but - at the moment there isn't one. We just keep track of the - sections by their name, instead. Fortunately, the ABI gives - suggested names for all the MIPS specific sections, so we will - probably get away with this. */ - switch (hdr->sh_type) - { - case SHT_MIPS_LIBLIST: - if (strcmp (name, ".liblist") != 0) - return false; - break; - case SHT_MIPS_MSYM: - if (strcmp (name, ".msym") != 0) - return false; - break; - case SHT_MIPS_CONFLICT: - if (strcmp (name, ".conflict") != 0) - return false; - break; - case SHT_MIPS_GPTAB: - if (strncmp (name, ".gptab.", sizeof ".gptab." - 1) != 0) - return false; - break; - case SHT_MIPS_UCODE: - if (strcmp (name, ".ucode") != 0) - return false; - break; - case SHT_MIPS_DEBUG: - if (strcmp (name, ".mdebug") != 0) - return false; - break; - case SHT_MIPS_REGINFO: - if (strcmp (name, ".reginfo") != 0 - || hdr->sh_size != sizeof (Elf32_External_RegInfo)) - return false; - break; - case SHT_MIPS_OPTIONS: - if (strcmp (name, ".options") != 0) - return false; - break; - case SHT_MIPS_DWARF: - if (strncmp (name, ".debug_", sizeof ".debug_" - 1) != 0) - return false; - break; - case SHT_MIPS_EVENTS: - if (strncmp (name, ".MIPS.events.", sizeof ".MIPS.events." - 1) != 0) - return false; - break; - default: - return false; - } - - if (! _bfd_elf_make_section_from_shdr (abfd, hdr, name)) - return false; - newsect = hdr->bfd_section; - - if (hdr->sh_type == SHT_MIPS_DEBUG) - { - if (! bfd_set_section_flags (abfd, newsect, - (bfd_get_section_flags (abfd, newsect) - | SEC_DEBUGGING))) - return false; - } - - /* FIXME: We should record sh_info for a .gptab section. */ - - /* For a .reginfo section, set the gp value in the tdata information - from the contents of this section. We need the gp value while - processing relocs, so we just get it now. */ - if (hdr->sh_type == SHT_MIPS_REGINFO) - { - Elf32_External_RegInfo ext; - Elf32_RegInfo s; - - if (! bfd_get_section_contents (abfd, newsect, (PTR) &ext, - (file_ptr) 0, sizeof ext)) - return false; - bfd_mips_elf32_swap_reginfo_in (abfd, &ext, &s); - elf_gp (abfd) = s.ri_gp_value; - } - - return true; -} - -/* Set the correct type for a MIPS ELF section. We do this by the - section name, which is a hack, but ought to work. */ - -static boolean -mips_elf_fake_sections (abfd, hdr, sec) - bfd *abfd; - Elf32_Internal_Shdr *hdr; - asection *sec; -{ - register const char *name; - - name = bfd_get_section_name (abfd, sec); - - if (strcmp (name, ".liblist") == 0) - { - hdr->sh_type = SHT_MIPS_LIBLIST; - hdr->sh_info = sec->_raw_size / sizeof (Elf32_Lib); - /* FIXME: Set the sh_link field. */ - } - else if (strcmp (name, ".msym") == 0) - { - hdr->sh_type = SHT_MIPS_MSYM; - hdr->sh_entsize = 8; - /* FIXME: Set the sh_info field. */ - } - else if (strcmp (name, ".conflict") == 0) - hdr->sh_type = SHT_MIPS_CONFLICT; - else if (strncmp (name, ".gptab.", sizeof ".gptab." - 1) == 0) - { - hdr->sh_type = SHT_MIPS_GPTAB; - hdr->sh_entsize = sizeof (Elf32_External_gptab); - /* The sh_info field is set in mips_elf_final_write_processing. */ - } - else if (strcmp (name, ".ucode") == 0) - hdr->sh_type = SHT_MIPS_UCODE; - else if (strcmp (name, ".mdebug") == 0) - { - hdr->sh_type = SHT_MIPS_DEBUG; - /* In a shared object on Irix 5.3, the .mdebug section has an - entsize of 0. FIXME: Does this matter? */ - if (SGI_COMPAT (abfd) && (abfd->flags & DYNAMIC) != 0) - hdr->sh_entsize = 0; - else - hdr->sh_entsize = 1; - } - else if (strcmp (name, ".reginfo") == 0) - { - hdr->sh_type = SHT_MIPS_REGINFO; - /* In a shared object on Irix 5.3, the .reginfo section has an - entsize of 0x18. FIXME: Does this matter? */ - if (SGI_COMPAT (abfd) && (abfd->flags & DYNAMIC) != 0) - hdr->sh_entsize = sizeof (Elf32_External_RegInfo); - else - hdr->sh_entsize = 1; - - /* Force the section size to the correct value, even if the - linker thinks it is larger. The link routine below will only - write out this much data for .reginfo. */ - hdr->sh_size = sec->_raw_size = sizeof (Elf32_External_RegInfo); - } - else if (SGI_COMPAT (abfd) - && (strcmp (name, ".hash") == 0 - || strcmp (name, ".dynamic") == 0 - || strcmp (name, ".dynstr") == 0)) - { - hdr->sh_entsize = 0; - hdr->sh_info = SIZEOF_MIPS_DYNSYM_SECNAMES; - } - else if (strcmp (name, ".got") == 0 - || strcmp (name, ".sdata") == 0 - || strcmp (name, ".sbss") == 0 - || strcmp (name, ".lit4") == 0 - || strcmp (name, ".lit8") == 0) - hdr->sh_flags |= SHF_MIPS_GPREL; - else if (strcmp (name, ".options") == 0) - { - hdr->sh_type = SHT_MIPS_OPTIONS; - hdr->sh_entsize = 1; - } - else if (strncmp (name, ".debug_", sizeof ".debug_" - 1) == 0) - hdr->sh_type = SHT_MIPS_DWARF; - else if (strncmp (name, ".MIPS.events.", sizeof ".MIPS.events." - 1) == 0) - hdr->sh_type = SHT_MIPS_EVENTS; - - return true; -} - -/* Given a BFD section, try to locate the corresponding ELF section - index. */ - -static boolean -mips_elf_section_from_bfd_section (abfd, hdr, sec, retval) - bfd *abfd; - Elf32_Internal_Shdr *hdr; - asection *sec; - int *retval; -{ - if (strcmp (bfd_get_section_name (abfd, sec), ".scommon") == 0) - { - *retval = SHN_MIPS_SCOMMON; - return true; - } - if (strcmp (bfd_get_section_name (abfd, sec), ".acommon") == 0) - { - *retval = SHN_MIPS_ACOMMON; - return true; - } - return false; -} - -/* Work over a section just before writing it out. We update the GP - value in the .reginfo section based on the value we are using. - FIXME: We recognize sections that need the SHF_MIPS_GPREL flag by - name; there has to be a better way. */ - -static boolean -mips_elf_section_processing (abfd, hdr) - bfd *abfd; - Elf32_Internal_Shdr *hdr; -{ - if (hdr->sh_type == SHT_MIPS_REGINFO) - { - bfd_byte buf[4]; - - BFD_ASSERT (hdr->sh_size == sizeof (Elf32_External_RegInfo)); - BFD_ASSERT (hdr->contents == NULL); - - if (bfd_seek (abfd, - hdr->sh_offset + sizeof (Elf32_External_RegInfo) - 4, - SEEK_SET) == -1) - return false; - bfd_h_put_32 (abfd, (bfd_vma) elf_gp (abfd), buf); - if (bfd_write (buf, (bfd_size_type) 1, (bfd_size_type) 4, abfd) != 4) - return false; - } - - if (hdr->bfd_section != NULL) - { - const char *name = bfd_get_section_name (abfd, hdr->bfd_section); - - if (strcmp (name, ".sdata") == 0) - { - hdr->sh_flags |= SHF_ALLOC | SHF_WRITE | SHF_MIPS_GPREL; - hdr->sh_type = SHT_PROGBITS; - } - else if (strcmp (name, ".sbss") == 0) - { - hdr->sh_flags |= SHF_ALLOC | SHF_WRITE | SHF_MIPS_GPREL; - hdr->sh_type = SHT_NOBITS; - } - else if (strcmp (name, ".lit8") == 0 - || strcmp (name, ".lit4") == 0) - { - hdr->sh_flags |= SHF_ALLOC | SHF_WRITE | SHF_MIPS_GPREL; - hdr->sh_type = SHT_PROGBITS; - } - else if (strcmp (name, ".compact_rel") == 0) - { - hdr->sh_flags = 0; - hdr->sh_type = SHT_PROGBITS; - } - else if (strcmp (name, ".rtproc") == 0) - { - if (hdr->sh_addralign != 0 && hdr->sh_entsize == 0) - { - unsigned int adjust; - - adjust = hdr->sh_size % hdr->sh_addralign; - if (adjust != 0) - hdr->sh_size += hdr->sh_addralign - adjust; - } - } - } - - return true; -} - -/* MIPS ELF uses two common sections. One is the usual one, and the - other is for small objects. All the small objects are kept - together, and then referenced via the gp pointer, which yields - faster assembler code. This is what we use for the small common - section. This approach is copied from ecoff.c. */ -static asection mips_elf_scom_section; -static asymbol mips_elf_scom_symbol; -static asymbol *mips_elf_scom_symbol_ptr; - -/* MIPS ELF also uses an acommon section, which represents an - allocated common symbol which may be overridden by a - definition in a shared library. */ -static asection mips_elf_acom_section; -static asymbol mips_elf_acom_symbol; -static asymbol *mips_elf_acom_symbol_ptr; - -/* The Irix 5 support uses two virtual sections, which represent - text/data symbols defined in dynamic objects. */ -static asection mips_elf_text_section; -static asection *mips_elf_text_section_ptr; -static asymbol mips_elf_text_symbol; -static asymbol *mips_elf_text_symbol_ptr; - -static asection mips_elf_data_section; -static asection *mips_elf_data_section_ptr; -static asymbol mips_elf_data_symbol; -static asymbol *mips_elf_data_symbol_ptr; - -/* Handle the special MIPS section numbers that a symbol may use. */ - -static void -mips_elf_symbol_processing (abfd, asym) - bfd *abfd; - asymbol *asym; -{ - elf_symbol_type *elfsym; - - elfsym = (elf_symbol_type *) asym; - switch (elfsym->internal_elf_sym.st_shndx) - { - case SHN_MIPS_ACOMMON: - /* This section is used in a dynamically linked executable file. - It is an allocated common section. The dynamic linker can - either resolve these symbols to something in a shared - library, or it can just leave them here. For our purposes, - we can consider these symbols to be in a new section. */ - if (mips_elf_acom_section.name == NULL) - { - /* Initialize the acommon section. */ - mips_elf_acom_section.name = ".acommon"; - mips_elf_acom_section.flags = SEC_ALLOC; - mips_elf_acom_section.output_section = &mips_elf_acom_section; - mips_elf_acom_section.symbol = &mips_elf_acom_symbol; - mips_elf_acom_section.symbol_ptr_ptr = &mips_elf_acom_symbol_ptr; - mips_elf_acom_symbol.name = ".acommon"; - mips_elf_acom_symbol.flags = BSF_SECTION_SYM; - mips_elf_acom_symbol.section = &mips_elf_acom_section; - mips_elf_acom_symbol_ptr = &mips_elf_acom_symbol; - } - asym->section = &mips_elf_acom_section; - break; - - case SHN_COMMON: - /* Common symbols less than the GP size are automatically - treated as SHN_MIPS_SCOMMON symbols. */ - if (asym->value > elf_gp_size (abfd)) - break; - /* Fall through. */ - case SHN_MIPS_SCOMMON: - if (mips_elf_scom_section.name == NULL) - { - /* Initialize the small common section. */ - mips_elf_scom_section.name = ".scommon"; - mips_elf_scom_section.flags = SEC_IS_COMMON; - mips_elf_scom_section.output_section = &mips_elf_scom_section; - mips_elf_scom_section.symbol = &mips_elf_scom_symbol; - mips_elf_scom_section.symbol_ptr_ptr = &mips_elf_scom_symbol_ptr; - mips_elf_scom_symbol.name = ".scommon"; - mips_elf_scom_symbol.flags = BSF_SECTION_SYM; - mips_elf_scom_symbol.section = &mips_elf_scom_section; - mips_elf_scom_symbol_ptr = &mips_elf_scom_symbol; - } - asym->section = &mips_elf_scom_section; - asym->value = elfsym->internal_elf_sym.st_size; - break; - - case SHN_MIPS_SUNDEFINED: - asym->section = bfd_und_section_ptr; - break; - -#if 0 /* for SGI_COMPAT */ - case SHN_MIPS_TEXT: - asym->section = mips_elf_text_section_ptr; - break; - - case SHN_MIPS_DATA: - asym->section = mips_elf_data_section_ptr; - break; -#endif - } -} - -/* When creating an Irix 5 executable, we need REGINFO and RTPROC - segments. */ - -static int -mips_elf_additional_program_headers (abfd) - bfd *abfd; -{ - asection *s; - int ret; - - ret = 0; - - if (! SGI_COMPAT (abfd)) - return ret; - - s = bfd_get_section_by_name (abfd, ".reginfo"); - if (s != NULL && (s->flags & SEC_LOAD) != 0) - { - /* We need a PT_MIPS_REGINFO segment. */ - ++ret; - } - - if (bfd_get_section_by_name (abfd, ".dynamic") != NULL - && bfd_get_section_by_name (abfd, ".mdebug") != NULL) - { - /* We need a PT_MIPS_RTPROC segment. */ - ++ret; - } - - return ret; -} - -/* Modify the segment map for an Irix 5 executable. */ - -static boolean -mips_elf_modify_segment_map (abfd) - bfd *abfd; -{ - asection *s; - struct elf_segment_map *m, **pm; - - if (! SGI_COMPAT (abfd)) - return true; - - /* If there is a .reginfo section, we need a PT_MIPS_REGINFO - segment. */ - s = bfd_get_section_by_name (abfd, ".reginfo"); - if (s != NULL && (s->flags & SEC_LOAD) != 0) - { - for (m = elf_tdata (abfd)->segment_map; m != NULL; m = m->next) - if (m->p_type == PT_MIPS_REGINFO) - break; - if (m == NULL) - { - m = (struct elf_segment_map *) bfd_zalloc (abfd, sizeof *m); - if (m == NULL) - return false; - - m->p_type = PT_MIPS_REGINFO; - m->count = 1; - m->sections[0] = s; - - /* We want to put it after the PHDR and INTERP segments. */ - pm = &elf_tdata (abfd)->segment_map; - while (*pm != NULL - && ((*pm)->p_type == PT_PHDR - || (*pm)->p_type == PT_INTERP)) - pm = &(*pm)->next; - - m->next = *pm; - *pm = m; - } - } - - /* If there are .dynamic and .mdebug sections, we make a room for - the RTPROC header. FIXME: Rewrite without section names. */ - if (bfd_get_section_by_name (abfd, ".interp") == NULL - && bfd_get_section_by_name (abfd, ".dynamic") != NULL - && bfd_get_section_by_name (abfd, ".mdebug") != NULL) - { - for (m = elf_tdata (abfd)->segment_map; m != NULL; m = m->next) - if (m->p_type == PT_MIPS_RTPROC) - break; - if (m == NULL) - { - m = (struct elf_segment_map *) bfd_zalloc (abfd, sizeof *m); - if (m == NULL) - return false; - - m->p_type = PT_MIPS_RTPROC; - - s = bfd_get_section_by_name (abfd, ".rtproc"); - if (s == NULL) - { - m->count = 0; - m->p_flags = 0; - m->p_flags_valid = 1; - } - else - { - m->count = 1; - m->sections[0] = s; - } - - /* We want to put it after the DYNAMIC segment. */ - pm = &elf_tdata (abfd)->segment_map; - while (*pm != NULL && (*pm)->p_type != PT_DYNAMIC) - pm = &(*pm)->next; - if (*pm != NULL) - pm = &(*pm)->next; - - m->next = *pm; - *pm = m; - } - } - - /* On Irix 5, the PT_DYNAMIC segment includes the .dynamic, .dynstr, - .dynsym, and .hash sections, and everything in between. */ - for (pm = &elf_tdata (abfd)->segment_map; *pm != NULL; pm = &(*pm)->next) - if ((*pm)->p_type == PT_DYNAMIC) - break; - m = *pm; - if (m != NULL - && m->count == 1 - && strcmp (m->sections[0]->name, ".dynamic") == 0) - { - static const char *sec_names[] = - { ".dynamic", ".dynstr", ".dynsym", ".hash" }; - bfd_vma low, high; - unsigned int i, c; - struct elf_segment_map *n; - - low = 0xffffffff; - high = 0; - for (i = 0; i < sizeof sec_names / sizeof sec_names[0]; i++) - { - s = bfd_get_section_by_name (abfd, sec_names[i]); - if (s != NULL && (s->flags & SEC_LOAD) != 0) - { - bfd_size_type sz; - - if (low > s->vma) - low = s->vma; - sz = s->_cooked_size; - if (sz == 0) - sz = s->_raw_size; - if (high < s->vma + sz) - high = s->vma + sz; - } - } - - c = 0; - for (s = abfd->sections; s != NULL; s = s->next) - if ((s->flags & SEC_LOAD) != 0 - && s->vma >= low - && ((s->vma - + (s->_cooked_size != 0 ? s->_cooked_size : s->_raw_size)) - <= high)) - ++c; - - n = ((struct elf_segment_map *) - bfd_zalloc (abfd, sizeof *n + (c - 1) * sizeof (asection *))); - if (n == NULL) - return false; - *n = *m; - n->count = c; - - i = 0; - for (s = abfd->sections; s != NULL; s = s->next) - { - if ((s->flags & SEC_LOAD) != 0 - && s->vma >= low - && ((s->vma - + (s->_cooked_size != 0 ? s->_cooked_size : s->_raw_size)) - <= high)) - { - n->sections[i] = s; - ++i; - } - } - - *pm = n; - } - - return true; -} - -/* The structure of the runtime procedure descriptor created by the - loader for use by the static exception system. */ - -typedef struct runtime_pdr { - bfd_vma adr; /* memory address of start of procedure */ - long regmask; /* save register mask */ - long regoffset; /* save register offset */ - long fregmask; /* save floating point register mask */ - long fregoffset; /* save floating point register offset */ - long frameoffset; /* frame size */ - short framereg; /* frame pointer register */ - short pcreg; /* offset or reg of return pc */ - long irpss; /* index into the runtime string table */ - long reserved; - struct exception_info *exception_info;/* pointer to exception array */ -} RPDR, *pRPDR; -#define cbRPDR sizeof(RPDR) -#define rpdNil ((pRPDR) 0) - -/* Swap RPDR (runtime procedure table entry) for output. */ - -static void ecoff_swap_rpdr_out - PARAMS ((bfd *, const RPDR *, struct rpdr_ext *)); - -static void -ecoff_swap_rpdr_out (abfd, in, ex) - bfd *abfd; - const RPDR *in; - struct rpdr_ext *ex; -{ - /* ecoff_put_off was defined in ecoffswap.h. */ - ecoff_put_off (abfd, in->adr, (bfd_byte *) ex->p_adr); - bfd_h_put_32 (abfd, in->regmask, (bfd_byte *) ex->p_regmask); - bfd_h_put_32 (abfd, in->regoffset, (bfd_byte *) ex->p_regoffset); - bfd_h_put_32 (abfd, in->fregmask, (bfd_byte *) ex->p_fregmask); - bfd_h_put_32 (abfd, in->fregoffset, (bfd_byte *) ex->p_fregoffset); - bfd_h_put_32 (abfd, in->frameoffset, (bfd_byte *) ex->p_frameoffset); - - bfd_h_put_16 (abfd, in->framereg, (bfd_byte *) ex->p_framereg); - bfd_h_put_16 (abfd, in->pcreg, (bfd_byte *) ex->p_pcreg); - - bfd_h_put_32 (abfd, in->irpss, (bfd_byte *) ex->p_irpss); -#if 0 /* FIXME */ - ecoff_put_off (abfd, in->exception_info, (bfd_byte *) ex->p_exception_info); -#endif -} - -/* Read ECOFF debugging information from a .mdebug section into a - ecoff_debug_info structure. */ - -static boolean -mips_elf_read_ecoff_info (abfd, section, debug) - bfd *abfd; - asection *section; - struct ecoff_debug_info *debug; -{ - HDRR *symhdr; - const struct ecoff_debug_swap *swap; - char *ext_hdr = NULL; - - swap = get_elf_backend_data (abfd)->elf_backend_ecoff_debug_swap; - - ext_hdr = (char *) bfd_malloc ((size_t) swap->external_hdr_size); - if (ext_hdr == NULL && swap->external_hdr_size != 0) - goto error_return; - - if (bfd_get_section_contents (abfd, section, ext_hdr, (file_ptr) 0, - swap->external_hdr_size) - == false) - goto error_return; - - symhdr = &debug->symbolic_header; - (*swap->swap_hdr_in) (abfd, ext_hdr, symhdr); - - /* The symbolic header contains absolute file offsets and sizes to - read. */ -#define READ(ptr, offset, count, size, type) \ - if (symhdr->count == 0) \ - debug->ptr = NULL; \ - else \ - { \ - debug->ptr = (type) bfd_malloc ((size_t) (size * symhdr->count)); \ - if (debug->ptr == NULL) \ - goto error_return; \ - if (bfd_seek (abfd, (file_ptr) symhdr->offset, SEEK_SET) != 0 \ - || (bfd_read (debug->ptr, size, symhdr->count, \ - abfd) != size * symhdr->count)) \ - goto error_return; \ - } - - READ (line, cbLineOffset, cbLine, sizeof (unsigned char), unsigned char *); - READ (external_dnr, cbDnOffset, idnMax, swap->external_dnr_size, PTR); - READ (external_pdr, cbPdOffset, ipdMax, swap->external_pdr_size, PTR); - READ (external_sym, cbSymOffset, isymMax, swap->external_sym_size, PTR); - READ (external_opt, cbOptOffset, ioptMax, swap->external_opt_size, PTR); - READ (external_aux, cbAuxOffset, iauxMax, sizeof (union aux_ext), - union aux_ext *); - READ (ss, cbSsOffset, issMax, sizeof (char), char *); - READ (ssext, cbSsExtOffset, issExtMax, sizeof (char), char *); - READ (external_fdr, cbFdOffset, ifdMax, swap->external_fdr_size, PTR); - READ (external_rfd, cbRfdOffset, crfd, swap->external_rfd_size, PTR); - READ (external_ext, cbExtOffset, iextMax, swap->external_ext_size, PTR); -#undef READ - - debug->fdr = NULL; - debug->adjust = NULL; - - return true; - - error_return: - if (ext_hdr != NULL) - free (ext_hdr); - if (debug->line != NULL) - free (debug->line); - if (debug->external_dnr != NULL) - free (debug->external_dnr); - if (debug->external_pdr != NULL) - free (debug->external_pdr); - if (debug->external_sym != NULL) - free (debug->external_sym); - if (debug->external_opt != NULL) - free (debug->external_opt); - if (debug->external_aux != NULL) - free (debug->external_aux); - if (debug->ss != NULL) - free (debug->ss); - if (debug->ssext != NULL) - free (debug->ssext); - if (debug->external_fdr != NULL) - free (debug->external_fdr); - if (debug->external_rfd != NULL) - free (debug->external_rfd); - if (debug->external_ext != NULL) - free (debug->external_ext); - return false; -} - -/* MIPS ELF local labels start with '$', not 'L'. */ - -/*ARGSUSED*/ -static boolean -mips_elf_is_local_label (abfd, symbol) - bfd *abfd; - asymbol *symbol; -{ - return symbol->name[0] == '$'; -} - -/* MIPS ELF uses a special find_nearest_line routine in order the - handle the ECOFF debugging information. */ - -struct mips_elf_find_line -{ - struct ecoff_debug_info d; - struct ecoff_find_line i; -}; - -static boolean -mips_elf_find_nearest_line (abfd, section, symbols, offset, filename_ptr, - functionname_ptr, line_ptr) - bfd *abfd; - asection *section; - asymbol **symbols; - bfd_vma offset; - const char **filename_ptr; - const char **functionname_ptr; - unsigned int *line_ptr; -{ - asection *msec; - - msec = bfd_get_section_by_name (abfd, ".mdebug"); - if (msec != NULL) - { - flagword origflags; - struct mips_elf_find_line *fi; - const struct ecoff_debug_swap * const swap = - get_elf_backend_data (abfd)->elf_backend_ecoff_debug_swap; - - /* If we are called during a link, mips_elf_final_link may have - cleared the SEC_HAS_CONTENTS field. We force it back on here - if appropriate (which it normally will be). */ - origflags = msec->flags; - if (elf_section_data (msec)->this_hdr.sh_type != SHT_NOBITS) - msec->flags |= SEC_HAS_CONTENTS; - - fi = elf_tdata (abfd)->find_line_info; - if (fi == NULL) - { - bfd_size_type external_fdr_size; - char *fraw_src; - char *fraw_end; - struct fdr *fdr_ptr; - - fi = ((struct mips_elf_find_line *) - bfd_alloc (abfd, sizeof (struct mips_elf_find_line))); - if (fi == NULL) - { - msec->flags = origflags; - return false; - } - - memset (fi, 0, sizeof (struct mips_elf_find_line)); - - if (! mips_elf_read_ecoff_info (abfd, msec, &fi->d)) - { - msec->flags = origflags; - return false; - } - - /* Swap in the FDR information. */ - fi->d.fdr = ((struct fdr *) - bfd_alloc (abfd, - (fi->d.symbolic_header.ifdMax * - sizeof (struct fdr)))); - if (fi->d.fdr == NULL) - { - msec->flags = origflags; - return false; - } - external_fdr_size = swap->external_fdr_size; - fdr_ptr = fi->d.fdr; - fraw_src = (char *) fi->d.external_fdr; - fraw_end = (fraw_src - + fi->d.symbolic_header.ifdMax * external_fdr_size); - for (; fraw_src < fraw_end; fraw_src += external_fdr_size, fdr_ptr++) - (*swap->swap_fdr_in) (abfd, (PTR) fraw_src, fdr_ptr); - - elf_tdata (abfd)->find_line_info = fi; - - /* Note that we don't bother to ever free this information. - find_nearest_line is either called all the time, as in - objdump -l, so the information should be saved, or it is - rarely called, as in ld error messages, so the memory - wasted is unimportant. Still, it would probably be a - good idea for free_cached_info to throw it away. */ - } - - if (_bfd_ecoff_locate_line (abfd, section, offset, &fi->d, swap, - &fi->i, filename_ptr, functionname_ptr, - line_ptr)) - { - msec->flags = origflags; - return true; - } - - msec->flags = origflags; - } - - /* Fall back on the generic ELF find_nearest_line routine. */ - - return _bfd_elf_find_nearest_line (abfd, section, symbols, offset, - filename_ptr, functionname_ptr, - line_ptr); -} - -/* The MIPS ELF linker needs additional information for each symbol in - the global hash table. */ - -struct mips_elf_link_hash_entry -{ - struct elf_link_hash_entry root; - - /* External symbol information. */ - EXTR esym; -}; - -/* MIPS ELF linker hash table. */ - -struct mips_elf_link_hash_table -{ - struct elf_link_hash_table root; - /* String section indices for the dynamic section symbols. */ - bfd_size_type dynsym_sec_strindex[SIZEOF_MIPS_DYNSYM_SECNAMES]; - /* The number of .rtproc entries. */ - bfd_size_type procedure_count; - /* The size of the .compact_rel section (if SGI_COMPAT). */ - bfd_size_type compact_rel_size; -}; - -/* Look up an entry in a MIPS ELF linker hash table. */ - -#define mips_elf_link_hash_lookup(table, string, create, copy, follow) \ - ((struct mips_elf_link_hash_entry *) \ - elf_link_hash_lookup (&(table)->root, (string), (create), \ - (copy), (follow))) - -/* Traverse a MIPS ELF linker hash table. */ - -#define mips_elf_link_hash_traverse(table, func, info) \ - (elf_link_hash_traverse \ - (&(table)->root, \ - (boolean (*) PARAMS ((struct elf_link_hash_entry *, PTR))) (func), \ - (info))) - -/* Get the MIPS ELF linker hash table from a link_info structure. */ - -#define mips_elf_hash_table(p) \ - ((struct mips_elf_link_hash_table *) ((p)->hash)) - -static boolean mips_elf_output_extsym - PARAMS ((struct mips_elf_link_hash_entry *, PTR)); - -/* Create an entry in a MIPS ELF linker hash table. */ - -static struct bfd_hash_entry * -mips_elf_link_hash_newfunc (entry, table, string) - struct bfd_hash_entry *entry; - struct bfd_hash_table *table; - const char *string; -{ - struct mips_elf_link_hash_entry *ret = - (struct mips_elf_link_hash_entry *) entry; - - /* Allocate the structure if it has not already been allocated by a - subclass. */ - if (ret == (struct mips_elf_link_hash_entry *) NULL) - ret = ((struct mips_elf_link_hash_entry *) - bfd_hash_allocate (table, - sizeof (struct mips_elf_link_hash_entry))); - if (ret == (struct mips_elf_link_hash_entry *) NULL) - return (struct bfd_hash_entry *) ret; - - /* Call the allocation method of the superclass. */ - ret = ((struct mips_elf_link_hash_entry *) - _bfd_elf_link_hash_newfunc ((struct bfd_hash_entry *) ret, - table, string)); - if (ret != (struct mips_elf_link_hash_entry *) NULL) - { - /* Set local fields. */ - memset (&ret->esym, 0, sizeof (EXTR)); - /* We use -2 as a marker to indicate that the information has - not been set. -1 means there is no associated ifd. */ - ret->esym.ifd = -2; - } - - return (struct bfd_hash_entry *) ret; -} - -/* Create a MIPS ELF linker hash table. */ - -static struct bfd_link_hash_table * -mips_elf_link_hash_table_create (abfd) - bfd *abfd; -{ - struct mips_elf_link_hash_table *ret; - unsigned int i; - - ret = ((struct mips_elf_link_hash_table *) - bfd_alloc (abfd, sizeof (struct mips_elf_link_hash_table))); - if (ret == (struct mips_elf_link_hash_table *) NULL) - return NULL; - - if (! _bfd_elf_link_hash_table_init (&ret->root, abfd, - mips_elf_link_hash_newfunc)) - { - bfd_release (abfd, ret); - return NULL; - } - - for (i = 0; i < SIZEOF_MIPS_DYNSYM_SECNAMES; i++) - ret->dynsym_sec_strindex[i] = (bfd_size_type) -1; - ret->procedure_count = 0; - ret->compact_rel_size = 0; - - return &ret->root.root; -} - -/* Hook called by the linker routine which adds symbols from an object - file. We must handle the special MIPS section numbers here. */ - -/*ARGSUSED*/ -static boolean -mips_elf_add_symbol_hook (abfd, info, sym, namep, flagsp, secp, valp) - bfd *abfd; - struct bfd_link_info *info; - const Elf_Internal_Sym *sym; - const char **namep; - flagword *flagsp; - asection **secp; - bfd_vma *valp; -{ - if (SGI_COMPAT (abfd) - && (abfd->flags & DYNAMIC) != 0 - && strcmp (*namep, "_rld_new_interface") == 0) - { - /* Skip Irix 5 rld entry name. */ - *namep = NULL; - return true; - } - - switch (sym->st_shndx) - { - case SHN_COMMON: - /* Common symbols less than the GP size are automatically - treated as SHN_MIPS_SCOMMON symbols. */ - if (sym->st_size > elf_gp_size (abfd)) - break; - /* Fall through. */ - case SHN_MIPS_SCOMMON: - *secp = bfd_make_section_old_way (abfd, ".scommon"); - (*secp)->flags |= SEC_IS_COMMON; - *valp = sym->st_size; - break; - - case SHN_MIPS_TEXT: - /* This section is used in a shared object. */ - if (mips_elf_text_section_ptr == NULL) - { - /* Initialize the section. */ - mips_elf_text_section.name = ".text"; - mips_elf_text_section.flags = SEC_NO_FLAGS; - mips_elf_text_section.output_section = NULL; - mips_elf_text_section.owner = abfd; - mips_elf_text_section.symbol = &mips_elf_text_symbol; - mips_elf_text_section.symbol_ptr_ptr = &mips_elf_text_symbol_ptr; - mips_elf_text_symbol.name = ".text"; - mips_elf_text_symbol.flags = BSF_SECTION_SYM; - mips_elf_text_symbol.section = &mips_elf_text_section; - mips_elf_text_symbol_ptr = &mips_elf_text_symbol; - mips_elf_text_section_ptr = &mips_elf_text_section; - } - if (info->shared) - *secp = bfd_und_section_ptr; - else - *secp = mips_elf_text_section_ptr; - break; - - case SHN_MIPS_ACOMMON: - /* Fall through. XXX Can we treat this as allocated data? */ - case SHN_MIPS_DATA: - /* This section is used in a shared object. */ - if (mips_elf_data_section_ptr == NULL) - { - /* Initialize the section. */ - mips_elf_data_section.name = ".data"; - mips_elf_data_section.flags = SEC_NO_FLAGS; - mips_elf_data_section.output_section = NULL; - mips_elf_data_section.owner = abfd; - mips_elf_data_section.symbol = &mips_elf_data_symbol; - mips_elf_data_section.symbol_ptr_ptr = &mips_elf_data_symbol_ptr; - mips_elf_data_symbol.name = ".data"; - mips_elf_data_symbol.flags = BSF_SECTION_SYM; - mips_elf_data_symbol.section = &mips_elf_data_section; - mips_elf_data_symbol_ptr = &mips_elf_data_symbol; - mips_elf_data_section_ptr = &mips_elf_data_section; - } - if (info->shared) - *secp = bfd_und_section_ptr; - else - *secp = mips_elf_data_section_ptr; - break; - - case SHN_MIPS_SUNDEFINED: - *secp = bfd_und_section_ptr; - break; - } - - return true; -} - -/* Structure used to pass information to mips_elf_output_extsym. */ - -struct extsym_info -{ - bfd *abfd; - struct bfd_link_info *info; - struct ecoff_debug_info *debug; - const struct ecoff_debug_swap *swap; - boolean failed; -}; - -/* This routine is used to write out ECOFF debugging external symbol - information. It is called via mips_elf_link_hash_traverse. The - ECOFF external symbol information must match the ELF external - symbol information. Unfortunately, at this point we don't know - whether a symbol is required by reloc information, so the two - tables may wind up being different. We must sort out the external - symbol information before we can set the final size of the .mdebug - section, and we must set the size of the .mdebug section before we - can relocate any sections, and we can't know which symbols are - required by relocation until we relocate the sections. - Fortunately, it is relatively unlikely that any symbol will be - stripped but required by a reloc. In particular, it can not happen - when generating a final executable. */ - -static boolean -mips_elf_output_extsym (h, data) - struct mips_elf_link_hash_entry *h; - PTR data; -{ - struct extsym_info *einfo = (struct extsym_info *) data; - boolean strip; - asection *sec, *output_section; - - if (h->root.indx == -2) - strip = false; - else if (((h->root.elf_link_hash_flags & ELF_LINK_HASH_DEF_DYNAMIC) != 0 - || (h->root.elf_link_hash_flags & ELF_LINK_HASH_REF_DYNAMIC) != 0) - && (h->root.elf_link_hash_flags & ELF_LINK_HASH_DEF_REGULAR) == 0 - && (h->root.elf_link_hash_flags & ELF_LINK_HASH_REF_REGULAR) == 0) - strip = true; - else if (einfo->info->strip == strip_all - || (einfo->info->strip == strip_some - && bfd_hash_lookup (einfo->info->keep_hash, - h->root.root.root.string, - false, false) == NULL)) - strip = true; - else - strip = false; - - if (strip) - return true; - - if (h->esym.ifd == -2) - { - h->esym.jmptbl = 0; - h->esym.cobol_main = 0; - h->esym.weakext = 0; - h->esym.reserved = 0; - h->esym.ifd = ifdNil; - h->esym.asym.value = 0; - h->esym.asym.st = stGlobal; - - if (SGI_COMPAT (einfo->abfd) - && (h->root.root.type == bfd_link_hash_undefined - || h->root.root.type == bfd_link_hash_undefweak)) - { - const char *name; - - /* Use undefined class. Also, set class and type for some - special symbols. */ - name = h->root.root.root.string; - if (strcmp (name, mips_elf_dynsym_rtproc_names[0]) == 0 - || strcmp (name, mips_elf_dynsym_rtproc_names[1]) == 0) - { - h->esym.asym.sc = scData; - h->esym.asym.st = stLabel; - h->esym.asym.value = 0; - } - else if (strcmp (name, mips_elf_dynsym_rtproc_names[2]) == 0) - { - h->esym.asym.sc = scAbs; - h->esym.asym.st = stLabel; - h->esym.asym.value = - mips_elf_hash_table (einfo->info)->procedure_count; - } - else if (strcmp (name, "_gp_disp") == 0) - { - h->esym.asym.sc = scAbs; - h->esym.asym.st = stLabel; - h->esym.asym.value = elf_gp (einfo->abfd); - } - else - h->esym.asym.sc = scUndefined; - } - else if (h->root.root.type != bfd_link_hash_defined - && h->root.root.type != bfd_link_hash_defweak) - h->esym.asym.sc = scAbs; - else - { - const char *name; - - sec = h->root.root.u.def.section; - output_section = sec->output_section; - - /* When making a shared library and symbol h is the one from - the another shared library, OUTPUT_SECTION may be null. */ - if (output_section == NULL) - h->esym.asym.sc = scUndefined; - else - { - name = bfd_section_name (output_section->owner, output_section); - - if (strcmp (name, ".text") == 0) - h->esym.asym.sc = scText; - else if (strcmp (name, ".data") == 0) - h->esym.asym.sc = scData; - else if (strcmp (name, ".sdata") == 0) - h->esym.asym.sc = scSData; - else if (strcmp (name, ".rodata") == 0 - || strcmp (name, ".rdata") == 0) - h->esym.asym.sc = scRData; - else if (strcmp (name, ".bss") == 0) - h->esym.asym.sc = scBss; - else if (strcmp (name, ".sbss") == 0) - h->esym.asym.sc = scSBss; - else if (strcmp (name, ".init") == 0) - h->esym.asym.sc = scInit; - else if (strcmp (name, ".fini") == 0) - h->esym.asym.sc = scFini; - else - h->esym.asym.sc = scAbs; - } - } - - h->esym.asym.reserved = 0; - h->esym.asym.index = indexNil; - } - - if (h->root.root.type == bfd_link_hash_common) - h->esym.asym.value = h->root.root.u.c.size; - else if (h->root.root.type == bfd_link_hash_defined - || h->root.root.type == bfd_link_hash_defweak) - { - if (h->esym.asym.sc == scCommon) - h->esym.asym.sc = scBss; - else if (h->esym.asym.sc == scSCommon) - h->esym.asym.sc = scSBss; - - sec = h->root.root.u.def.section; - output_section = sec->output_section; - if (output_section != NULL) - h->esym.asym.value = (h->root.root.u.def.value - + sec->output_offset - + output_section->vma); - else - h->esym.asym.value = 0; - } - else if ((h->root.elf_link_hash_flags & ELF_LINK_HASH_NEEDS_PLT) != 0) - { - /* Set type and value for a symbol with a function stub. */ - h->esym.asym.st = stProc; - sec = h->root.root.u.def.section; - if (sec == NULL) - h->esym.asym.value = 0; - else - { - output_section = sec->output_section; - if (output_section != NULL) - h->esym.asym.value = (h->root.plt_offset - + sec->output_offset - + output_section->vma); - else - h->esym.asym.value = 0; - } -#if 0 /* FIXME? */ - h->esym.ifd = 0; -#endif - } - - if (! bfd_ecoff_debug_one_external (einfo->abfd, einfo->debug, einfo->swap, - h->root.root.root.string, - &h->esym)) - { - einfo->failed = true; - return false; - } - - return true; -} - -/* Create a runtime procedure table from the .mdebug section. */ - -static boolean -mips_elf_create_procedure_table (handle, abfd, info, s, debug) - PTR handle; - bfd *abfd; - struct bfd_link_info *info; - asection *s; - struct ecoff_debug_info *debug; -{ - const struct ecoff_debug_swap *swap; - HDRR *hdr = &debug->symbolic_header; - RPDR *rpdr, *rp; - struct rpdr_ext *erp; - PTR rtproc; - struct pdr_ext *epdr; - struct sym_ext *esym; - char *ss, **sv; - char *str; - unsigned long size, count; - unsigned long sindex; - unsigned long i; - PDR pdr; - SYMR sym; - const char *no_name_func = "static procedure (no name)"; - - epdr = NULL; - rpdr = NULL; - esym = NULL; - ss = NULL; - sv = NULL; - - swap = get_elf_backend_data (abfd)->elf_backend_ecoff_debug_swap; - - sindex = strlen (no_name_func) + 1; - count = hdr->ipdMax; - if (count > 0) - { - size = swap->external_pdr_size; - - epdr = (struct pdr_ext *) bfd_malloc (size * count); - if (epdr == NULL) - goto error_return; - - if (! _bfd_ecoff_get_accumulated_pdr (handle, (PTR) epdr)) - goto error_return; - - size = sizeof (RPDR); - rp = rpdr = (RPDR *) bfd_malloc (size * count); - if (rpdr == NULL) - goto error_return; - - sv = (char **) bfd_malloc (sizeof (char *) * count); - if (sv == NULL) - goto error_return; - - count = hdr->isymMax; - size = swap->external_sym_size; - esym = (struct sym_ext *) bfd_malloc (size * count); - if (esym == NULL) - goto error_return; - - if (! _bfd_ecoff_get_accumulated_sym (handle, (PTR) esym)) - goto error_return; - - count = hdr->issMax; - ss = (char *) bfd_malloc (count); - if (ss == NULL) - goto error_return; - if (! _bfd_ecoff_get_accumulated_ss (handle, (PTR) ss)) - goto error_return; - - count = hdr->ipdMax; - for (i = 0; i < count; i++, rp++) - { - (*swap->swap_pdr_in) (abfd, (PTR) (epdr + i), &pdr); - (*swap->swap_sym_in) (abfd, (PTR) &esym[pdr.isym], &sym); - rp->adr = sym.value; - rp->regmask = pdr.regmask; - rp->regoffset = pdr.regoffset; - rp->fregmask = pdr.fregmask; - rp->fregoffset = pdr.fregoffset; - rp->frameoffset = pdr.frameoffset; - rp->framereg = pdr.framereg; - rp->pcreg = pdr.pcreg; - rp->irpss = sindex; - sv[i] = ss + sym.iss; - sindex += strlen (sv[i]) + 1; - } - } - - size = sizeof (struct rpdr_ext) * (count + 2) + sindex; - size = BFD_ALIGN (size, 16); - rtproc = (PTR) bfd_alloc (abfd, size); - if (rtproc == NULL) - { - mips_elf_hash_table (info)->procedure_count = 0; - goto error_return; - } - - mips_elf_hash_table (info)->procedure_count = count + 2; - - erp = (struct rpdr_ext *) rtproc; - memset (erp, 0, sizeof (struct rpdr_ext)); - erp++; - str = (char *) rtproc + sizeof (struct rpdr_ext) * (count + 2); - strcpy (str, no_name_func); - str += strlen (no_name_func) + 1; - for (i = 0; i < count; i++) - { - ecoff_swap_rpdr_out (abfd, rpdr + i, erp + i); - strcpy (str, sv[i]); - str += strlen (sv[i]) + 1; - } - ecoff_put_off (abfd, (bfd_vma) -1, (bfd_byte *) (erp + count)->p_adr); - - /* Set the size and contents of .rtproc section. */ - s->_raw_size = size; - s->contents = rtproc; - - /* Skip this section later on (I don't think this currently - matters, but someday it might). */ - s->link_order_head = (struct bfd_link_order *) NULL; - - if (epdr != NULL) - free (epdr); - if (rpdr != NULL) - free (rpdr); - if (esym != NULL) - free (esym); - if (ss != NULL) - free (ss); - if (sv != NULL) - free (sv); - - return true; - - error_return: - if (epdr != NULL) - free (epdr); - if (rpdr != NULL) - free (rpdr); - if (esym != NULL) - free (esym); - if (ss != NULL) - free (ss); - if (sv != NULL) - free (sv); - return false; -} - -/* A comparison routine used to sort .gptab entries. */ - -static int -gptab_compare (p1, p2) - const PTR p1; - const PTR p2; -{ - const Elf32_gptab *a1 = (const Elf32_gptab *) p1; - const Elf32_gptab *a2 = (const Elf32_gptab *) p2; - - return a1->gt_entry.gt_g_value - a2->gt_entry.gt_g_value; -} - -/* We need to use a special link routine to handle the .reginfo and - the .mdebug sections. We need to merge all instances of these - sections together, not write them all out sequentially. */ - -static boolean -mips_elf_final_link (abfd, info) - bfd *abfd; - struct bfd_link_info *info; -{ - asection **secpp; - asection *o; - struct bfd_link_order *p; - asection *reginfo_sec, *mdebug_sec, *gptab_data_sec, *gptab_bss_sec; - asection *rtproc_sec; - Elf32_RegInfo reginfo; - struct ecoff_debug_info debug; - const struct ecoff_debug_swap *swap - = get_elf_backend_data (abfd)->elf_backend_ecoff_debug_swap; - HDRR *symhdr = &debug.symbolic_header; - PTR mdebug_handle = NULL; - - /* Drop the .options section, since it has special semantics which I - haven't bothered to figure out. */ - for (secpp = &abfd->sections; *secpp != NULL; secpp = &(*secpp)->next) - { - if (strcmp ((*secpp)->name, ".options") == 0) - { - for (p = (*secpp)->link_order_head; p != NULL; p = p->next) - if (p->type == bfd_indirect_link_order) - p->u.indirect.section->flags &=~ SEC_HAS_CONTENTS; - (*secpp)->link_order_head = NULL; - *secpp = (*secpp)->next; - --abfd->section_count; - break; - } - } - - /* Get a value for the GP register. */ - if (elf_gp (abfd) == 0) - { - struct bfd_link_hash_entry *h; - - h = bfd_link_hash_lookup (info->hash, "_gp", false, false, true); - if (h != (struct bfd_link_hash_entry *) NULL - && h->type == bfd_link_hash_defined) - elf_gp (abfd) = (h->u.def.value - + h->u.def.section->output_section->vma - + h->u.def.section->output_offset); - else if (info->relocateable) - { - bfd_vma lo; - - /* Make up a value. */ - lo = (bfd_vma) -1; - for (o = abfd->sections; o != (asection *) NULL; o = o->next) - { - if (o->vma < lo - && (strcmp (o->name, ".sbss") == 0 - || strcmp (o->name, ".sdata") == 0 - || strcmp (o->name, ".lit4") == 0 - || strcmp (o->name, ".lit8") == 0)) - lo = o->vma; - } - elf_gp (abfd) = lo + ELF_MIPS_GP_OFFSET (abfd); - } - else - { - /* If the relocate_section function needs to do a reloc - involving the GP value, it should make a reloc_dangerous - callback to warn that GP is not defined. */ - } - } - - /* Go through the sections and collect the .reginfo and .mdebug - information. */ - reginfo_sec = NULL; - mdebug_sec = NULL; - gptab_data_sec = NULL; - gptab_bss_sec = NULL; - for (o = abfd->sections; o != (asection *) NULL; o = o->next) - { - if (strcmp (o->name, ".reginfo") == 0) - { - memset (®info, 0, sizeof reginfo); - - /* We have found the .reginfo section in the output file. - Look through all the link_orders comprising it and merge - the information together. */ - for (p = o->link_order_head; - p != (struct bfd_link_order *) NULL; - p = p->next) - { - asection *input_section; - bfd *input_bfd; - Elf32_External_RegInfo ext; - Elf32_RegInfo sub; - - if (p->type != bfd_indirect_link_order) - { - if (p->type == bfd_fill_link_order) - continue; - abort (); - } - - input_section = p->u.indirect.section; - input_bfd = input_section->owner; - - /* The linker emulation code has probably clobbered the - size to be zero bytes. */ - if (input_section->_raw_size == 0) - input_section->_raw_size = sizeof (Elf32_External_RegInfo); - - if (! bfd_get_section_contents (input_bfd, input_section, - (PTR) &ext, - (file_ptr) 0, - sizeof ext)) - return false; - - bfd_mips_elf32_swap_reginfo_in (input_bfd, &ext, &sub); - - reginfo.ri_gprmask |= sub.ri_gprmask; - reginfo.ri_cprmask[0] |= sub.ri_cprmask[0]; - reginfo.ri_cprmask[1] |= sub.ri_cprmask[1]; - reginfo.ri_cprmask[2] |= sub.ri_cprmask[2]; - reginfo.ri_cprmask[3] |= sub.ri_cprmask[3]; - - /* ri_gp_value is set by the function - mips_elf_section_processing when the section is - finally written out. */ - - /* Hack: reset the SEC_HAS_CONTENTS flag so that - elf_link_input_bfd ignores this section. */ - input_section->flags &=~ SEC_HAS_CONTENTS; - } - - /* Force the section size to the value we want. */ - o->_raw_size = sizeof (Elf32_External_RegInfo); - - /* Skip this section later on (I don't think this currently - matters, but someday it might). */ - o->link_order_head = (struct bfd_link_order *) NULL; - - reginfo_sec = o; - } - - if (strcmp (o->name, ".mdebug") == 0) - { - struct extsym_info einfo; - - /* We have found the .mdebug section in the output file. - Look through all the link_orders comprising it and merge - the information together. */ - symhdr->magic = swap->sym_magic; - /* FIXME: What should the version stamp be? */ - symhdr->vstamp = 0; - symhdr->ilineMax = 0; - symhdr->cbLine = 0; - symhdr->idnMax = 0; - symhdr->ipdMax = 0; - symhdr->isymMax = 0; - symhdr->ioptMax = 0; - symhdr->iauxMax = 0; - symhdr->issMax = 0; - symhdr->issExtMax = 0; - symhdr->ifdMax = 0; - symhdr->crfd = 0; - symhdr->iextMax = 0; - - /* We accumulate the debugging information itself in the - debug_info structure. */ - debug.line = NULL; - debug.external_dnr = NULL; - debug.external_pdr = NULL; - debug.external_sym = NULL; - debug.external_opt = NULL; - debug.external_aux = NULL; - debug.ss = NULL; - debug.ssext = debug.ssext_end = NULL; - debug.external_fdr = NULL; - debug.external_rfd = NULL; - debug.external_ext = debug.external_ext_end = NULL; - - mdebug_handle = bfd_ecoff_debug_init (abfd, &debug, swap, info); - if (mdebug_handle == (PTR) NULL) - return false; - - if (SGI_COMPAT (abfd)) - { - asection *s; - EXTR esym; - bfd_vma last; - unsigned int i; - static const char * const name[] = - { ".text", ".init", ".fini", ".data", - ".rodata", ".sdata", ".sbss", ".bss" }; - static const int sc[] = { scText, scInit, scFini, scData, - scRData, scSData, scSBss, scBss }; - - esym.jmptbl = 0; - esym.cobol_main = 0; - esym.weakext = 0; - esym.reserved = 0; - esym.ifd = ifdNil; - esym.asym.iss = issNil; - esym.asym.st = stLocal; - esym.asym.reserved = 0; - esym.asym.index = indexNil; - for (i = 0; i < 8; i++) - { - esym.asym.sc = sc[i]; - s = bfd_get_section_by_name (abfd, name[i]); - if (s != NULL) - { - esym.asym.value = s->vma; - last = s->vma + s->_raw_size; - } - else - esym.asym.value = last; - - if (! bfd_ecoff_debug_one_external (abfd, &debug, swap, - name[i], &esym)) - return false; - } - } - - for (p = o->link_order_head; - p != (struct bfd_link_order *) NULL; - p = p->next) - { - asection *input_section; - bfd *input_bfd; - const struct ecoff_debug_swap *input_swap; - struct ecoff_debug_info input_debug; - char *eraw_src; - char *eraw_end; - - if (p->type != bfd_indirect_link_order) - { - if (p->type == bfd_fill_link_order) - continue; - abort (); - } - - input_section = p->u.indirect.section; - input_bfd = input_section->owner; - - if (bfd_get_flavour (input_bfd) != bfd_target_elf_flavour - || (get_elf_backend_data (input_bfd) - ->elf_backend_ecoff_debug_swap) == NULL) - { - /* I don't know what a non MIPS ELF bfd would be - doing with a .mdebug section, but I don't really - want to deal with it. */ - continue; - } - - input_swap = (get_elf_backend_data (input_bfd) - ->elf_backend_ecoff_debug_swap); - - BFD_ASSERT (p->size == input_section->_raw_size); - - /* The ECOFF linking code expects that we have already - read in the debugging information and set up an - ecoff_debug_info structure, so we do that now. */ - if (! mips_elf_read_ecoff_info (input_bfd, input_section, - &input_debug)) - return false; - - if (! (bfd_ecoff_debug_accumulate - (mdebug_handle, abfd, &debug, swap, input_bfd, - &input_debug, input_swap, info))) - return false; - - /* Loop through the external symbols. For each one with - interesting information, try to find the symbol in - the linker global hash table and save the information - for the output external symbols. */ - eraw_src = input_debug.external_ext; - eraw_end = (eraw_src - + (input_debug.symbolic_header.iextMax - * input_swap->external_ext_size)); - for (; - eraw_src < eraw_end; - eraw_src += input_swap->external_ext_size) - { - EXTR ext; - const char *name; - struct mips_elf_link_hash_entry *h; - - (*input_swap->swap_ext_in) (input_bfd, (PTR) eraw_src, &ext); - if (ext.asym.sc == scNil - || ext.asym.sc == scUndefined - || ext.asym.sc == scSUndefined) - continue; - - name = input_debug.ssext + ext.asym.iss; - h = mips_elf_link_hash_lookup (mips_elf_hash_table (info), - name, false, false, true); - if (h == NULL || h->esym.ifd != -2) - continue; - - if (ext.ifd != -1) - { - BFD_ASSERT (ext.ifd - < input_debug.symbolic_header.ifdMax); - ext.ifd = input_debug.ifdmap[ext.ifd]; - } - - h->esym = ext; - } - - /* Free up the information we just read. */ - free (input_debug.line); - free (input_debug.external_dnr); - free (input_debug.external_pdr); - free (input_debug.external_sym); - free (input_debug.external_opt); - free (input_debug.external_aux); - free (input_debug.ss); - free (input_debug.ssext); - free (input_debug.external_fdr); - free (input_debug.external_rfd); - free (input_debug.external_ext); - - /* Hack: reset the SEC_HAS_CONTENTS flag so that - elf_link_input_bfd ignores this section. */ - input_section->flags &=~ SEC_HAS_CONTENTS; - } - - if (SGI_COMPAT (abfd) && info->shared) - { - /* Create .rtproc section. */ - rtproc_sec = bfd_get_section_by_name (abfd, ".rtproc"); - if (rtproc_sec == NULL) - { - flagword flags = (SEC_HAS_CONTENTS | SEC_IN_MEMORY - | SEC_READONLY); - - rtproc_sec = bfd_make_section (abfd, ".rtproc"); - if (rtproc_sec == NULL - || ! bfd_set_section_flags (abfd, rtproc_sec, flags) - || ! bfd_set_section_alignment (abfd, rtproc_sec, 12)) - return false; - } - - if (! mips_elf_create_procedure_table (mdebug_handle, abfd, - info, rtproc_sec, &debug)) - return false; - } - - /* Build the external symbol information. */ - einfo.abfd = abfd; - einfo.info = info; - einfo.debug = &debug; - einfo.swap = swap; - einfo.failed = false; - mips_elf_link_hash_traverse (mips_elf_hash_table (info), - mips_elf_output_extsym, - (PTR) &einfo); - if (einfo.failed) - return false; - - /* Set the size of the .mdebug section. */ - o->_raw_size = bfd_ecoff_debug_size (abfd, &debug, swap); - - /* Skip this section later on (I don't think this currently - matters, but someday it might). */ - o->link_order_head = (struct bfd_link_order *) NULL; - - mdebug_sec = o; - } - - if (strncmp (o->name, ".gptab.", sizeof ".gptab." - 1) == 0) - { - const char *subname; - unsigned int c; - Elf32_gptab *tab; - Elf32_External_gptab *ext_tab; - unsigned int i; - - /* The .gptab.sdata and .gptab.sbss sections hold - information describing how the small data area would - change depending upon the -G switch. These sections - not used in executables files. */ - if (! info->relocateable) - { - asection **secpp; - - for (p = o->link_order_head; - p != (struct bfd_link_order *) NULL; - p = p->next) - { - asection *input_section; - - if (p->type != bfd_indirect_link_order) - { - if (p->type == bfd_fill_link_order) - continue; - abort (); - } - - input_section = p->u.indirect.section; - - /* Hack: reset the SEC_HAS_CONTENTS flag so that - elf_link_input_bfd ignores this section. */ - input_section->flags &=~ SEC_HAS_CONTENTS; - } - - /* Skip this section later on (I don't think this - currently matters, but someday it might). */ - o->link_order_head = (struct bfd_link_order *) NULL; - - /* Really remove the section. */ - for (secpp = &abfd->sections; - *secpp != o; - secpp = &(*secpp)->next) - ; - *secpp = (*secpp)->next; - --abfd->section_count; - - continue; - } - - /* There is one gptab for initialized data, and one for - uninitialized data. */ - if (strcmp (o->name, ".gptab.sdata") == 0) - gptab_data_sec = o; - else if (strcmp (o->name, ".gptab.sbss") == 0) - gptab_bss_sec = o; - else - { - (*_bfd_error_handler) - ("%s: illegal section name `%s'", - bfd_get_filename (abfd), o->name); - bfd_set_error (bfd_error_nonrepresentable_section); - return false; - } - - /* The linker script always combines .gptab.data and - .gptab.sdata into .gptab.sdata, and likewise for - .gptab.bss and .gptab.sbss. It is possible that there is - no .sdata or .sbss section in the output file, in which - case we must change the name of the output section. */ - subname = o->name + sizeof ".gptab" - 1; - if (bfd_get_section_by_name (abfd, subname) == NULL) - { - if (o == gptab_data_sec) - o->name = ".gptab.data"; - else - o->name = ".gptab.bss"; - subname = o->name + sizeof ".gptab" - 1; - BFD_ASSERT (bfd_get_section_by_name (abfd, subname) != NULL); - } - - /* Set up the first entry. */ - c = 1; - tab = (Elf32_gptab *) bfd_malloc (c * sizeof (Elf32_gptab)); - if (tab == NULL) - return false; - tab[0].gt_header.gt_current_g_value = elf_gp_size (abfd); - tab[0].gt_header.gt_unused = 0; - - /* Combine the input sections. */ - for (p = o->link_order_head; - p != (struct bfd_link_order *) NULL; - p = p->next) - { - asection *input_section; - bfd *input_bfd; - bfd_size_type size; - unsigned long last; - bfd_size_type gpentry; - - if (p->type != bfd_indirect_link_order) - { - if (p->type == bfd_fill_link_order) - continue; - abort (); - } - - input_section = p->u.indirect.section; - input_bfd = input_section->owner; - - /* Combine the gptab entries for this input section one - by one. We know that the input gptab entries are - sorted by ascending -G value. */ - size = bfd_section_size (input_bfd, input_section); - last = 0; - for (gpentry = sizeof (Elf32_External_gptab); - gpentry < size; - gpentry += sizeof (Elf32_External_gptab)) - { - Elf32_External_gptab ext_gptab; - Elf32_gptab int_gptab; - unsigned long val; - unsigned long add; - boolean exact; - unsigned int look; - - if (! (bfd_get_section_contents - (input_bfd, input_section, (PTR) &ext_gptab, - gpentry, sizeof (Elf32_External_gptab)))) - { - free (tab); - return false; - } - - bfd_mips_elf32_swap_gptab_in (input_bfd, &ext_gptab, - &int_gptab); - val = int_gptab.gt_entry.gt_g_value; - add = int_gptab.gt_entry.gt_bytes - last; - - exact = false; - for (look = 1; look < c; look++) - { - if (tab[look].gt_entry.gt_g_value >= val) - tab[look].gt_entry.gt_bytes += add; - - if (tab[look].gt_entry.gt_g_value == val) - exact = true; - } - - if (! exact) - { - Elf32_gptab *new_tab; - unsigned int max; - - /* We need a new table entry. */ - new_tab = ((Elf32_gptab *) - bfd_realloc ((PTR) tab, - (c + 1) * sizeof (Elf32_gptab))); - if (new_tab == NULL) - { - free (tab); - return false; - } - tab = new_tab; - tab[c].gt_entry.gt_g_value = val; - tab[c].gt_entry.gt_bytes = add; - - /* Merge in the size for the next smallest -G - value, since that will be implied by this new - value. */ - max = 0; - for (look = 1; look < c; look++) - { - if (tab[look].gt_entry.gt_g_value < val - && (max == 0 - || (tab[look].gt_entry.gt_g_value - > tab[max].gt_entry.gt_g_value))) - max = look; - } - if (max != 0) - tab[c].gt_entry.gt_bytes += - tab[max].gt_entry.gt_bytes; - - ++c; - } - - last = int_gptab.gt_entry.gt_bytes; - } - - /* Hack: reset the SEC_HAS_CONTENTS flag so that - elf_link_input_bfd ignores this section. */ - input_section->flags &=~ SEC_HAS_CONTENTS; - } - - /* The table must be sorted by -G value. */ - if (c > 2) - qsort (tab + 1, c - 1, sizeof (tab[0]), gptab_compare); - - /* Swap out the table. */ - ext_tab = ((Elf32_External_gptab *) - bfd_alloc (abfd, c * sizeof (Elf32_External_gptab))); - if (ext_tab == NULL) - { - free (tab); - return false; - } - - for (i = 0; i < c; i++) - bfd_mips_elf32_swap_gptab_out (abfd, tab + i, ext_tab + i); - free (tab); - - o->_raw_size = c * sizeof (Elf32_External_gptab); - o->contents = (bfd_byte *) ext_tab; - - /* Skip this section later on (I don't think this currently - matters, but someday it might). */ - o->link_order_head = (struct bfd_link_order *) NULL; - } - } - - /* Invoke the regular ELF backend linker to do all the work. */ - if (! bfd_elf32_bfd_final_link (abfd, info)) - return false; - - /* Now write out the computed sections. */ - - if (reginfo_sec != (asection *) NULL) - { - Elf32_External_RegInfo ext; - - bfd_mips_elf32_swap_reginfo_out (abfd, ®info, &ext); - if (! bfd_set_section_contents (abfd, reginfo_sec, (PTR) &ext, - (file_ptr) 0, sizeof ext)) - return false; - } - - if (mdebug_sec != (asection *) NULL) - { - BFD_ASSERT (abfd->output_has_begun); - if (! bfd_ecoff_write_accumulated_debug (mdebug_handle, abfd, &debug, - swap, info, - mdebug_sec->filepos)) - return false; - - bfd_ecoff_debug_free (mdebug_handle, abfd, &debug, swap, info); - } - - if (gptab_data_sec != (asection *) NULL) - { - if (! bfd_set_section_contents (abfd, gptab_data_sec, - gptab_data_sec->contents, - (file_ptr) 0, - gptab_data_sec->_raw_size)) - return false; - } - - if (gptab_bss_sec != (asection *) NULL) - { - if (! bfd_set_section_contents (abfd, gptab_bss_sec, - gptab_bss_sec->contents, - (file_ptr) 0, - gptab_bss_sec->_raw_size)) - return false; - } - - if (SGI_COMPAT (abfd)) - { - rtproc_sec = bfd_get_section_by_name (abfd, ".rtproc"); - if (rtproc_sec != NULL) - { - if (! bfd_set_section_contents (abfd, rtproc_sec, - rtproc_sec->contents, - (file_ptr) 0, - rtproc_sec->_raw_size)) - return false; - } - } - - return true; -} - -/* Handle a MIPS ELF HI16 reloc. */ - -static void -mips_elf_relocate_hi16 (input_bfd, relhi, rello, contents, addend) - bfd *input_bfd; - Elf_Internal_Rela *relhi; - Elf_Internal_Rela *rello; - bfd_byte *contents; - bfd_vma addend; -{ - bfd_vma insn; - bfd_vma addlo; - - insn = bfd_get_32 (input_bfd, contents + relhi->r_offset); - - addlo = bfd_get_32 (input_bfd, contents + rello->r_offset); - addlo &= 0xffff; - - addend += ((insn & 0xffff) << 16) + addlo; - - if ((addlo & 0x8000) != 0) - addend -= 0x10000; - if ((addend & 0x8000) != 0) - addend += 0x10000; - - bfd_put_32 (input_bfd, - (insn & 0xffff0000) | ((addend >> 16) & 0xffff), - contents + relhi->r_offset); -} - -/* Handle a MIPS ELF local GOT16 reloc. */ - -static void -mips_elf_relocate_got_local (output_bfd, input_bfd, sgot, relhi, rello, - contents, addend) - bfd *output_bfd; - bfd *input_bfd; - asection *sgot; - Elf_Internal_Rela *relhi; - Elf_Internal_Rela *rello; - bfd_byte *contents; - bfd_vma addend; -{ - int local_gotno; - int i; - bfd_vma insn; - bfd_vma addlo; - bfd_vma address; - bfd_vma hipage; - bfd_byte *got_contents; - struct mips_got_info *g; - - insn = bfd_get_32 (input_bfd, contents + relhi->r_offset); - - addlo = bfd_get_32 (input_bfd, contents + rello->r_offset); - addlo &= 0xffff; - - addend += ((insn & 0xffff) << 16) + addlo; - - if ((addlo & 0x8000) != 0) - addend -= 0x10000; - if ((addend & 0x8000) != 0) - addend += 0x10000; - - /* Get a got entry representing requested hipage. */ - BFD_ASSERT (elf_section_data (sgot) != NULL); - g = (struct mips_got_info *) elf_section_data (sgot)->tdata; - BFD_ASSERT (g != NULL); - - local_gotno = g->local_gotno; - got_contents = sgot->contents; - hipage = addend & 0xffff0000; - - for (i = MIPS_RESERVED_GOTNO; i < local_gotno; i++) - { - address = bfd_get_32 (input_bfd, got_contents + i * 4); - if (hipage == (address & 0xffff0000)) - break; - if (address == (bfd_vma) 0) - { - bfd_put_32 (input_bfd, hipage, got_contents + i * 4); - break; - } - } - - BFD_ASSERT (i < local_gotno); -#if 1 - if (i == local_gotno) - (*_bfd_error_handler) - ("ELF MIPS linker: more got entries are needed for hipage: %x", - hipage); -#endif - - i = - ELF_MIPS_GP_OFFSET (output_bfd) + i * 4; - bfd_put_32 (input_bfd, (insn & 0xffff0000) | (i & 0xffff), - contents + relhi->r_offset); -} - -/* Handle MIPS ELF CALL16 reloc and global GOT16 reloc. */ - -static void -mips_elf_relocate_global_got (input_bfd, rel, contents, offset) - bfd *input_bfd; - Elf_Internal_Rela *rel; - bfd_byte *contents; - bfd_vma offset; -{ - bfd_vma insn; - - insn = bfd_get_32 (input_bfd, contents + rel->r_offset); - bfd_put_32 (input_bfd, - (insn & 0xffff0000) | (offset & 0xffff), - contents + rel->r_offset); -} - -/* Relocate a MIPS ELF section. */ - -static boolean -mips_elf_relocate_section (output_bfd, info, input_bfd, input_section, - contents, relocs, local_syms, local_sections) - bfd *output_bfd; - struct bfd_link_info *info; - bfd *input_bfd; - asection *input_section; - bfd_byte *contents; - Elf_Internal_Rela *relocs; - Elf_Internal_Sym *local_syms; - asection **local_sections; -{ - Elf_Internal_Shdr *symtab_hdr; - size_t locsymcount; - size_t extsymoff; - asection *sgot, *sreloc, *scpt; - bfd *dynobj; - bfd_vma gp; - Elf_Internal_Rela *rel; - Elf_Internal_Rela *relend; - struct mips_got_info *g; - - dynobj = elf_hash_table (info)->dynobj; - symtab_hdr = &elf_tdata (input_bfd)->symtab_hdr; - - sgot = NULL; - sreloc = NULL; - if (dynobj == NULL || ! SGI_COMPAT (output_bfd)) - scpt = NULL; - else - scpt = bfd_get_section_by_name (dynobj, ".compact_rel"); - g = NULL; - - if (elf_bad_symtab (input_bfd)) - { - locsymcount = symtab_hdr->sh_size / sizeof (Elf32_External_Sym); - extsymoff = 0; - } - else - { - locsymcount = symtab_hdr->sh_info; - extsymoff = symtab_hdr->sh_info; - } - - gp = _bfd_get_gp_value (output_bfd); - - rel = relocs; - relend = relocs + input_section->reloc_count; - for (; rel < relend; rel++) - { - int r_type; - reloc_howto_type *howto; - unsigned long r_symndx; - bfd_vma addend; - struct elf_link_hash_entry *h; - asection *sec; - Elf_Internal_Sym *sym; - bfd_reloc_status_type r; - - r_type = ELF32_R_TYPE (rel->r_info); - if (r_type < 0 || r_type >= (int) R_MIPS_max) - { - bfd_set_error (bfd_error_bad_value); - return false; - } - howto = elf_mips_howto_table + r_type; - - if (dynobj != NULL - && (r_type == R_MIPS_CALL16 - || r_type == R_MIPS_GOT16 - || r_type == R_MIPS_CALL_HI16 - || r_type == R_MIPS_CALL_LO16 - || r_type == R_MIPS_GOT_HI16 - || r_type == R_MIPS_GOT_LO16)) - { - /* We need the .got section. */ - if (sgot == NULL) - { - sgot = bfd_get_section_by_name (dynobj, ".got"); - BFD_ASSERT (sgot != NULL); - BFD_ASSERT (elf_section_data (sgot) != NULL); - g = (struct mips_got_info *) elf_section_data (sgot)->tdata; - BFD_ASSERT (g != NULL); - } - } - - r_symndx = ELF32_R_SYM (rel->r_info); - - /* Mix in the change in GP address for a GP relative reloc. */ - if (r_type != R_MIPS_GPREL16 - && r_type != R_MIPS_LITERAL - && r_type != R_MIPS_GPREL32) - addend = 0; - else - { - if (gp == 0) - { - if (! ((*info->callbacks->reloc_dangerous) - (info, - "GP relative relocation when GP not defined", - input_bfd, input_section, - rel->r_offset))) - return false; - /* Only give the error once per link. */ - gp = 4; - _bfd_set_gp_value (output_bfd, gp); - } - - if (r_symndx < extsymoff - || (elf_bad_symtab (input_bfd) - && local_sections[r_symndx] != NULL)) - { - /* This is a relocation against a section. The current - addend in the instruction is the difference between - INPUT_SECTION->vma and the GP value of INPUT_BFD. We - must change this to be the difference between the - final definition (which will end up in RELOCATION) - and the GP value of OUTPUT_BFD (which is in GP). */ - addend = elf_gp (input_bfd) - gp; - } - else if (! info->relocateable) - { - /* We are doing a final link. The current addend in the - instruction is simply the desired offset into the - symbol (normally zero). We want the instruction to - hold the difference between the final definition of - the symbol (which will end up in RELOCATION) and the - GP value of OUTPUT_BFD (which is in GP). */ - addend = - gp; - } - else - { - /* We are generating relocateable output, and we aren't - going to define this symbol, so we just leave the - instruction alone. */ - addend = 0; - } - } - - h = NULL; - sym = NULL; - sec = NULL; - if (info->relocateable) - { - /* This is a relocateable link. We don't have to change - anything, unless the reloc is against a section symbol, - in which case we have to adjust according to where the - section symbol winds up in the output section. */ - if (r_symndx >= locsymcount - || (elf_bad_symtab (input_bfd) - && local_sections[r_symndx] == NULL)) - r = bfd_reloc_ok; - else - { - sym = local_syms + r_symndx; - if (ELF_ST_TYPE (sym->st_info) != STT_SECTION) - r = bfd_reloc_ok; - else - { - sec = local_sections[r_symndx]; - - /* It would be logical to add sym->st_value here, - but Irix 5 sometimes generates a garbage symbol - value. */ - addend += sec->output_offset; - - /* If this is HI16 or GOT16 with an associated LO16, - adjust the addend accordingly. Otherwise, just - relocate. */ - if ((r_type != R_MIPS_HI16 && r_type != R_MIPS_GOT16) - || (rel + 1) >= relend - || ELF32_R_TYPE ((rel + 1)->r_info) != R_MIPS_LO16) - r = _bfd_relocate_contents (howto, input_bfd, - addend, - contents + rel->r_offset); - else - { - mips_elf_relocate_hi16 (input_bfd, rel, rel + 1, - contents, addend); - r = bfd_reloc_ok; - } - } - } - } - else - { - bfd_vma relocation; - boolean local; - - /* This is a final link. */ - sym = NULL; - if (r_symndx < extsymoff - || (elf_bad_symtab (input_bfd) - && local_sections[r_symndx] != NULL)) - { - local = true; - sym = local_syms + r_symndx; - sec = local_sections[r_symndx]; - relocation = (sec->output_section->vma - + sec->output_offset); - - /* It would be logical to always add sym->st_value here, - but Irix 5 sometimes generates a garbage symbol - value. */ - if (ELF_ST_TYPE (sym->st_info) != STT_SECTION) - relocation += sym->st_value; - } - else - { - long indx; - - local = false; - indx = r_symndx - extsymoff; - h = elf_sym_hashes (input_bfd)[indx]; - while (h->root.type == bfd_link_hash_indirect - || h->root.type == bfd_link_hash_warning) - h = (struct elf_link_hash_entry *) h->root.u.i.link; - if (strcmp (h->root.root.string, "_gp_disp") == 0) - { - if (gp == 0) - { - if (! ((*info->callbacks->reloc_dangerous) - (info, - "_gp_disp used when GP not defined", - input_bfd, input_section, - rel->r_offset))) - return false; - /* Only give the error once per link. */ - gp = 4; - _bfd_set_gp_value (output_bfd, gp); - relocation = 0; - } - else - { - sec = input_section; - if (sec->output_section != NULL) - relocation = (gp - - (rel->r_offset - + sec->output_section->vma - + sec->output_offset)); - else - relocation = gp - rel->r_offset; - if (r_type == R_MIPS_LO16) - relocation += 4; - } - } - else if (h->root.type == bfd_link_hash_defined - || h->root.type == bfd_link_hash_defweak) - { - sec = h->root.u.def.section; - if (sec->output_section == NULL) - relocation = 0; - else - relocation = (h->root.u.def.value - + sec->output_section->vma - + sec->output_offset); - } - else if (h->root.type == bfd_link_hash_undefweak) - relocation = 0; - else if (info->shared && ! info->symbolic) - relocation = 0; - else if (strcmp (h->root.root.string, "_DYNAMIC_LINK") == 0) - { - /* If this is a dynamic link, we should have created - a _DYNAMIC_LINK symbol in - mips_elf_create_dynamic_sections. Otherwise, we - should define the symbol with a value of 0. - FIXME: It should probably get into the symbol - table somehow as well. */ - BFD_ASSERT (! info->shared); - BFD_ASSERT (bfd_get_section_by_name (output_bfd, - ".dynamic") == NULL); - relocation = 0; - } - else - { - if (! ((*info->callbacks->undefined_symbol) - (info, h->root.root.string, input_bfd, - input_section, rel->r_offset))) - return false; - relocation = 0; - } - } - - if (r_type == R_MIPS_HI16 - && (rel + 1) < relend - && ELF32_R_TYPE ((rel + 1)->r_info) == R_MIPS_LO16) - { - mips_elf_relocate_hi16 (input_bfd, rel, rel + 1, - contents, relocation + addend); - r = bfd_reloc_ok; - } - else if (r_type == R_MIPS_GOT16 && local) - { - /* GOT16 must be also with associated LO16 in the local - case. In this case, the addend is extracted and the - section in which the referenced object is determined. - Then the final address of the object is computed and - the GOT entry for the hipage (an aligned 64kb chunk) - is added to .got section if needed. The offset field - of the GOT16-relocated instruction is replaced by the - index of this GOT entry for the hipage. */ - if ((rel + 1) < relend - && ELF32_R_TYPE ((rel + 1)->r_info) == R_MIPS_LO16) - { - mips_elf_relocate_got_local (output_bfd, input_bfd, sgot, - rel, rel + 1, - contents, - relocation + addend); - r = bfd_reloc_ok; - } - else - r = bfd_reloc_outofrange; - } - else if (r_type == R_MIPS_CALL16 - || r_type == R_MIPS_GOT16 - || r_type == R_MIPS_CALL_LO16 - || r_type == R_MIPS_GOT_LO16) - { - bfd_vma offset; - - /* This symbol must be registered as a global symbol - having the corresponding got entry. */ - BFD_ASSERT (h->got_offset != (bfd_vma) -1); - - offset = (h->dynindx - g->global_gotsym + g->local_gotno) * 4; - BFD_ASSERT (g->local_gotno <= offset - && offset < sgot->_raw_size); - bfd_put_32 (output_bfd, relocation + addend, - sgot->contents + offset); - offset = (sgot->output_section->vma + sgot->output_offset - + offset - gp); - mips_elf_relocate_global_got (input_bfd, rel, contents, - offset); - r = bfd_reloc_ok; - } - else if (r_type == R_MIPS_CALL_HI16 - || r_type == R_MIPS_GOT_HI16) - { - bfd_vma offset; - - /* This must be a global symbol with a got entry. The - next reloc must be the corresponding LO16 reloc. */ - BFD_ASSERT (h != NULL && h->got_offset != (bfd_vma) -1); - BFD_ASSERT ((rel + 1) < relend); - BFD_ASSERT (ELF32_R_TYPE ((rel + 1)->r_info) - == (r_type == R_MIPS_CALL_HI16 - ? R_MIPS_CALL_LO16 - : R_MIPS_GOT_LO16)); - - offset = (h->dynindx - g->global_gotsym + g->local_gotno) * 4; - BFD_ASSERT (g->local_gotno <= offset - && offset < sgot->_raw_size); - bfd_put_32 (output_bfd, relocation + addend, - sgot->contents + offset); - offset = (sgot->output_section->vma + sgot->output_offset - + offset - gp); - mips_elf_relocate_hi16 (input_bfd, rel, rel + 1, contents, - offset); - r = bfd_reloc_ok; - } - else if (r_type == R_MIPS_REL32 - || r_type == R_MIPS_32) - { - Elf_Internal_Rel outrel; - Elf32_crinfo cptrel; - bfd_byte *cr; - - if (info->shared - && (input_section->flags & SEC_ALLOC) != 0) - { - /* When generating a shared object, these - relocations are copied into the output file to be - resolved at run time. */ - if (sreloc == NULL) - { - sreloc = bfd_get_section_by_name (dynobj, ".rel.dyn"); - BFD_ASSERT (sreloc != NULL); - } - - outrel.r_offset = (rel->r_offset - + input_section->output_section->vma - + input_section->output_offset); - - addend = bfd_get_32 (input_bfd, contents + rel->r_offset); - - if (h != NULL - && (! info->symbolic - || (h->elf_link_hash_flags - & ELF_LINK_HASH_DEF_REGULAR) == 0)) - { - BFD_ASSERT (h->dynindx != -1); - outrel.r_info = ELF32_R_INFO (h->dynindx, R_MIPS_REL32); - sec = input_section; - } - else - { - long indx; - - if (h == NULL) - sec = local_sections[r_symndx]; - else - { - BFD_ASSERT (h->root.type == bfd_link_hash_defined - || (h->root.type - == bfd_link_hash_defweak)); - sec = h->root.u.def.section; - } - if (sec != NULL && bfd_is_abs_section (sec)) - indx = 0; - else if (sec == NULL || sec->owner == NULL) - { - bfd_set_error (bfd_error_bad_value); - return false; - } - else - { - asection *osec; - - osec = sec->output_section; - indx = elf_section_data (osec)->dynindx; - if (indx == 0) - abort (); - } - - outrel.r_info = ELF32_R_INFO (indx, R_MIPS_REL32); - addend += relocation; - } - - bfd_put_32 (output_bfd, addend, contents + rel->r_offset); - bfd_elf32_swap_reloc_out (output_bfd, &outrel, - (((Elf32_External_Rel *) - sreloc->contents) - + sreloc->reloc_count)); - ++sreloc->reloc_count; - - if (SGI_COMPAT (output_bfd)) - { - if (scpt == NULL) - continue; - - /* Make an entry of compact relocation info. */ - mips_elf_set_cr_format (cptrel, CRF_MIPS_LONG); - cptrel.vaddr = (rel->r_offset - + input_section->output_section->vma - + input_section->output_offset); - if (r_type == R_MIPS_REL32) - mips_elf_set_cr_type (cptrel, CRT_MIPS_REL32); - else - mips_elf_set_cr_type (cptrel, CRT_MIPS_WORD); - mips_elf_set_cr_dist2to (cptrel, 0); - cptrel.konst = addend; - - cr = (scpt->contents - + sizeof (Elf32_External_compact_rel)); - bfd_elf32_swap_crinfo_out (output_bfd, &cptrel, - ((Elf32_External_crinfo *) cr - + scpt->reloc_count)); - ++scpt->reloc_count; - } - - /* This reloc will be computed at runtime, so - there's no need to do anything now. */ - continue; - } - else - r = _bfd_final_link_relocate (howto, input_bfd, input_section, - contents, rel->r_offset, - relocation, addend); - } - else - r = _bfd_final_link_relocate (howto, input_bfd, input_section, - contents, rel->r_offset, - relocation, addend); - - if (SGI_COMPAT (abfd) - && scpt != NULL - && (input_section->flags & SEC_ALLOC) != 0) - { - Elf32_crinfo cptrel; - bfd_byte *cr; - - /* Make an entry of compact relocation info. */ - mips_elf_set_cr_format (cptrel, CRF_MIPS_LONG); - cptrel.vaddr = (rel->r_offset - + input_section->output_section->vma - + input_section->output_offset); - - switch (r_type) - { - case R_MIPS_26: - mips_elf_set_cr_type (cptrel, CRT_MIPS_JMPAD); - /* XXX How should we set dist2to in this case. */ - mips_elf_set_cr_dist2to (cptrel, 8); - cptrel.konst = addend + relocation; - cr = scpt->contents + sizeof (Elf32_External_compact_rel); - bfd_elf32_swap_crinfo_out (output_bfd, &cptrel, - ((Elf32_External_crinfo *) cr - + scpt->reloc_count)); - ++scpt->reloc_count; - break; - - case R_MIPS_GPREL16: - case R_MIPS_LITERAL: - case R_MIPS_GPREL32: - mips_elf_set_cr_type (cptrel, CRT_MIPS_GPHI_LO); - cptrel.konst = gp - cptrel.vaddr; - mips_elf_set_cr_dist2to (cptrel, 4); - cr = scpt->contents + sizeof (Elf32_External_compact_rel); - bfd_elf32_swap_crinfo_out (output_bfd, &cptrel, - ((Elf32_External_crinfo *) cr - + scpt->reloc_count)); - ++scpt->reloc_count; - break; - - default: - break; - } - } - } - - if (r != bfd_reloc_ok) - { - switch (r) - { - default: - case bfd_reloc_outofrange: - abort (); - case bfd_reloc_overflow: - { - const char *name; - - if (h != NULL) - name = h->root.root.string; - else - { - name = bfd_elf_string_from_elf_section (input_bfd, - symtab_hdr->sh_link, - sym->st_name); - if (name == NULL) - return false; - if (*name == '\0') - name = bfd_section_name (input_bfd, sec); - } - if (! ((*info->callbacks->reloc_overflow) - (info, name, howto->name, (bfd_vma) 0, - input_bfd, input_section, rel->r_offset))) - return false; - } - break; - } - } - } - - return true; -} - -/* Functions for the dynamic linker. */ - -/* The name of the dynamic interpreter. This is put in the .interp - section. */ - -#define ELF_DYNAMIC_INTERPRETER "/usr/lib/libc.so.1" - -/* Create dynamic sections when linking against a dynamic object. */ - -static boolean -mips_elf_create_dynamic_sections (abfd, info) - bfd *abfd; - struct bfd_link_info *info; -{ - struct elf_link_hash_entry *h; - flagword flags; - register asection *s; - const char * const *namep; - - flags = (SEC_ALLOC | SEC_LOAD | SEC_HAS_CONTENTS | SEC_IN_MEMORY - | SEC_READONLY); - - /* Mips ABI requests the .dynamic section to be read only. */ - s = bfd_get_section_by_name (abfd, ".dynamic"); - if (s != NULL) - { - if (! bfd_set_section_flags (abfd, s, flags)) - return false; - } - - /* We need to create .got section. */ - if (! mips_elf_create_got_section (abfd, info)) - return false; - - /* Create .stub section. */ - if (bfd_get_section_by_name (abfd, ".stub") == NULL) - { - s = bfd_make_section (abfd, ".stub"); - if (s == NULL - || ! bfd_set_section_flags (abfd, s, flags) - || ! bfd_set_section_alignment (abfd, s, 2)) - return false; - } - - if (SGI_COMPAT (abfd)) - { - for (namep = mips_elf_dynsym_rtproc_names; *namep != NULL; namep++) - { - h = NULL; - if (! (_bfd_generic_link_add_one_symbol - (info, abfd, *namep, BSF_GLOBAL, bfd_und_section_ptr, - (bfd_vma) 0, (const char *) NULL, false, - get_elf_backend_data (abfd)->collect, - (struct bfd_link_hash_entry **) &h))) - return false; - h->elf_link_hash_flags &=~ ELF_LINK_NON_ELF; - h->elf_link_hash_flags |= ELF_LINK_HASH_DEF_REGULAR; - h->type = STT_SECTION; - - if (! bfd_elf32_link_record_dynamic_symbol (info, h)) - return false; - } - - /* We need to create a .compact_rel section. */ - if (! mips_elf_create_compact_rel_section (abfd, info)) - return false; - - /* Change aligments of some sections. */ - s = bfd_get_section_by_name (abfd, ".hash"); - if (s != NULL) - bfd_set_section_alignment (abfd, s, 4); - s = bfd_get_section_by_name (abfd, ".dynsym"); - if (s != NULL) - bfd_set_section_alignment (abfd, s, 4); - s = bfd_get_section_by_name (abfd, ".dynstr"); - if (s != NULL) - bfd_set_section_alignment (abfd, s, 4); - s = bfd_get_section_by_name (abfd, ".reginfo"); - if (s != NULL) - bfd_set_section_alignment (abfd, s, 4); - s = bfd_get_section_by_name (abfd, ".dynamic"); - if (s != NULL) - bfd_set_section_alignment (abfd, s, 4); - } - - if (!info->shared) - { - h = NULL; - if (! (_bfd_generic_link_add_one_symbol - (info, abfd, "_DYNAMIC_LINK", BSF_GLOBAL, bfd_abs_section_ptr, - (bfd_vma) 0, (const char *) NULL, false, - get_elf_backend_data (abfd)->collect, - (struct bfd_link_hash_entry **) &h))) - return false; - h->elf_link_hash_flags ^=~ ELF_LINK_NON_ELF; - h->elf_link_hash_flags |= ELF_LINK_HASH_DEF_REGULAR; - h->type = STT_SECTION; - - if (! bfd_elf32_link_record_dynamic_symbol (info, h)) - return false; - } - - return true; -} - -/* Create the .compact_rel section. */ - -static boolean -mips_elf_create_compact_rel_section (abfd, info) - bfd *abfd; - struct bfd_link_info *info; -{ - flagword flags; - register asection *s; - - if (bfd_get_section_by_name (abfd, ".compact_rel") == NULL) - { - flags = SEC_HAS_CONTENTS | SEC_IN_MEMORY | SEC_READONLY; - - s = bfd_make_section (abfd, ".compact_rel"); - if (s == NULL - || ! bfd_set_section_flags (abfd, s, flags) - || ! bfd_set_section_alignment (abfd, s, 2)) - return false; - - s->_raw_size = sizeof (Elf32_External_compact_rel); - } - - return true; -} - -/* Create the .got section to hold the global offset table. */ - -static boolean -mips_elf_create_got_section (abfd, info) - bfd *abfd; - struct bfd_link_info *info; -{ - flagword flags; - register asection *s; - struct elf_link_hash_entry *h; - struct mips_got_info *g; - - /* This function may be called more than once. */ - if (bfd_get_section_by_name (abfd, ".got") != NULL) - return true; - - flags = SEC_ALLOC | SEC_LOAD | SEC_HAS_CONTENTS | SEC_IN_MEMORY; - - s = bfd_make_section (abfd, ".got"); - if (s == NULL - || ! bfd_set_section_flags (abfd, s, flags) - || ! bfd_set_section_alignment (abfd, s, 4)) - return false; - - /* Define the symbol _GLOBAL_OFFSET_TABLE_. We don't do this in the - linker script because we don't want to define the symbol if we - are not creating a global offset table. */ - h = NULL; - if (! (_bfd_generic_link_add_one_symbol - (info, abfd, "_GLOBAL_OFFSET_TABLE_", BSF_GLOBAL, s, - (bfd_vma) 0, (const char *) NULL, false, - get_elf_backend_data (abfd)->collect, - (struct bfd_link_hash_entry **) &h))) - return false; - h->elf_link_hash_flags &=~ ELF_LINK_NON_ELF; - h->elf_link_hash_flags |= ELF_LINK_HASH_DEF_REGULAR; - h->type = STT_OBJECT; - - if (info->shared - && ! bfd_elf32_link_record_dynamic_symbol (info, h)) - return false; - - /* The first several global offset table entries are reserved. */ - s->_raw_size = MIPS_RESERVED_GOTNO * 4; - - g = (struct mips_got_info *) bfd_alloc (abfd, - sizeof (struct mips_got_info)); - if (g == NULL) - return false; - g->global_gotsym = 0; - g->local_gotno = MIPS_RESERVED_GOTNO; - if (elf_section_data (s) == NULL) - { - s->used_by_bfd = - (PTR) bfd_zalloc (abfd, sizeof (struct bfd_elf_section_data)); - if (elf_section_data (s) == NULL) - return false; - } - elf_section_data (s)->tdata = (PTR) g; - - return true; -} - -/* Look through the relocs for a section during the first phase, and - allocate space in the global offset table. */ - -static boolean -mips_elf_check_relocs (abfd, info, sec, relocs) - bfd *abfd; - struct bfd_link_info *info; - asection *sec; - const Elf_Internal_Rela *relocs; -{ - bfd *dynobj; - Elf_Internal_Shdr *symtab_hdr; - struct elf_link_hash_entry **sym_hashes; - struct mips_got_info *g; - size_t extsymoff; - const Elf_Internal_Rela *rel; - const Elf_Internal_Rela *rel_end; - asection *sgot; - asection *sreloc; - - if (info->relocateable) - return true; - - dynobj = elf_hash_table (info)->dynobj; - symtab_hdr = &elf_tdata (abfd)->symtab_hdr; - sym_hashes = elf_sym_hashes (abfd); - extsymoff = (elf_bad_symtab (abfd)) ? 0 : symtab_hdr->sh_info; - - sgot = NULL; - sreloc = NULL; - - rel_end = relocs + sec->reloc_count; - for (rel = relocs; rel < rel_end; rel++) - { - unsigned long r_symndx; - struct elf_link_hash_entry *h; - - r_symndx = ELF32_R_SYM (rel->r_info); - - if (r_symndx < extsymoff) - h = NULL; - else - h = sym_hashes[r_symndx - extsymoff]; - - /* Some relocs require a global offset table. */ - if (dynobj == NULL) - { - switch (ELF32_R_TYPE (rel->r_info)) - { - case R_MIPS_GOT16: - case R_MIPS_CALL16: - case R_MIPS_CALL_HI16: - case R_MIPS_CALL_LO16: - case R_MIPS_GOT_HI16: - case R_MIPS_GOT_LO16: - elf_hash_table (info)->dynobj = dynobj = abfd; - if (! mips_elf_create_got_section (dynobj, info)) - return false; - break; - - default: - break; - } - } - - switch (ELF32_R_TYPE (rel->r_info)) - { - case R_MIPS_CALL16: - case R_MIPS_CALL_HI16: - case R_MIPS_CALL_LO16: - /* This symbol requires a global offset table entry. */ - if (sgot == NULL) - { - sgot = bfd_get_section_by_name (dynobj, ".got"); - BFD_ASSERT (sgot != NULL); - BFD_ASSERT (elf_section_data (sgot) != NULL); - g = (struct mips_got_info *) elf_section_data (sgot)->tdata; - BFD_ASSERT (g != NULL); - } - - BFD_ASSERT (h != NULL); - - /* Make sure this symbol is output as a dynamic symbol. */ - if (h->dynindx == -1) - { - if (! bfd_elf32_link_record_dynamic_symbol (info, h)) - return false; - } - - if (h->got_offset != (bfd_vma) -1) - { - /* We have already allocated space in the .got. */ - break; - } - - /* Note the index of the first global got symbol in .dynsym. */ - if (g->global_gotsym == 0 - || g->global_gotsym > (unsigned long) h->dynindx) - g->global_gotsym = h->dynindx; - - /* Make this symbol to have the corresponding got entry. */ - h->got_offset = 0; - - /* We need a stub, not a plt entry for the undefined - function. But we record it as if it needs plt. See - elf_adjust_dynamic_symbol in elflink.h. */ - h->elf_link_hash_flags |= ELF_LINK_HASH_NEEDS_PLT; - h->type = STT_FUNC; - - break; - - case R_MIPS_GOT16: - case R_MIPS_GOT_HI16: - case R_MIPS_GOT_LO16: - /* This symbol requires a global offset table entry. */ - if (sgot == NULL) - { - sgot = bfd_get_section_by_name (dynobj, ".got"); - BFD_ASSERT (sgot != NULL); - BFD_ASSERT (elf_section_data (sgot) != NULL); - g = (struct mips_got_info *) elf_section_data (sgot)->tdata; - BFD_ASSERT (g != NULL); - } - - if (h != NULL) - { - /* Make sure this symbol is output as a dynamic symbol. */ - if (h->dynindx == -1) - { - if (! bfd_elf32_link_record_dynamic_symbol (info, h)) - return false; - } - - if (h->got_offset != (bfd_vma) -1) - { - /* We have already allocated space in the .got. */ - break; - } - /* Note the index of the first global got symbol in - .dynsym. */ - if (g->global_gotsym == 0 - || g->global_gotsym > (unsigned long) h->dynindx) - g->global_gotsym = h->dynindx; - - /* Make this symbol to be the global got symbol. */ - h->got_offset = 0; - } - - break; - - case R_MIPS_32: - case R_MIPS_REL32: - if (info->shared - && (sec->flags & SEC_ALLOC) != 0) - { - /* When creating a shared object, we must copy these - reloc types into the output file as R_MIPS_REL32 - relocs. We create the .rel.dyn reloc section in - dynobj and make room for this reloc. */ - if (sreloc == NULL) - { - const char *name = ".rel.dyn"; - - sreloc = bfd_get_section_by_name (dynobj, name); - if (sreloc == NULL) - { - sreloc = bfd_make_section (dynobj, name); - if (sreloc == NULL - || ! bfd_set_section_flags (dynobj, sreloc, - (SEC_ALLOC - | SEC_LOAD - | SEC_HAS_CONTENTS - | SEC_IN_MEMORY - | SEC_READONLY)) - || ! bfd_set_section_alignment (dynobj, sreloc, 4)) - return false; - - /* Add a null element. */ - sreloc->_raw_size += sizeof (Elf32_External_Rel); - ++sreloc->reloc_count; - } - } - - sreloc->_raw_size += sizeof (Elf32_External_Rel); - } - - if (SGI_COMPAT (abfd)) - mips_elf_hash_table (info)->compact_rel_size += - sizeof (Elf32_External_crinfo); - - break; - - case R_MIPS_26: - case R_MIPS_GPREL16: - case R_MIPS_LITERAL: - case R_MIPS_GPREL32: - if (SGI_COMPAT (abfd)) - mips_elf_hash_table (info)->compact_rel_size += - sizeof (Elf32_External_crinfo); - break; - - default: - break; - } - } - - return true; -} - -/* Adjust a symbol defined by a dynamic object and referenced by a - regular object. The current definition is in some section of the - dynamic object, but we're not including those sections. We have to - change the definition to something the rest of the link can - understand. */ - -static boolean -mips_elf_adjust_dynamic_symbol (info, h) - struct bfd_link_info *info; - struct elf_link_hash_entry *h; -{ - bfd *dynobj; - asection *s; - - dynobj = elf_hash_table (info)->dynobj; - - /* Make sure we know what is going on here. */ - BFD_ASSERT (dynobj != NULL - && ((h->elf_link_hash_flags & ELF_LINK_HASH_NEEDS_PLT) - || h->weakdef != NULL - || ((h->elf_link_hash_flags - & ELF_LINK_HASH_DEF_DYNAMIC) != 0 - && (h->elf_link_hash_flags - & ELF_LINK_HASH_REF_REGULAR) != 0 - && (h->elf_link_hash_flags - & ELF_LINK_HASH_DEF_REGULAR) == 0))); - - /* For a function, create a stub, if needed. */ - if (h->type == STT_FUNC - || (h->elf_link_hash_flags & ELF_LINK_HASH_NEEDS_PLT) != 0) - { - if (! elf_hash_table (info)->dynamic_sections_created) - return true; - - /* If this symbol is not defined in a regular file, then set - the symbol to the stub location. This is required to make - function pointers compare as equal between the normal - executable and the shared library. */ - if ((h->elf_link_hash_flags & ELF_LINK_HASH_DEF_REGULAR) == 0) - { - /* We need .stub section. */ - s = bfd_get_section_by_name (dynobj, ".stub"); - BFD_ASSERT (s != NULL); - - h->root.u.def.section = s; - h->root.u.def.value = s->_raw_size; - - /* XXX Write this stub address somewhere. */ - h->plt_offset = s->_raw_size; - - /* Make room for this stub code. */ - s->_raw_size += MIPS_FUNCTION_STUB_SIZE; - - /* The last half word of the stub will be filled with the index - of this symbol in .dynsym section. */ - return true; - } - } - - /* If this is a weak symbol, and there is a real definition, the - processor independent code will have arranged for us to see the - real definition first, and we can just use the same value. */ - if (h->weakdef != NULL) - { - BFD_ASSERT (h->weakdef->root.type == bfd_link_hash_defined - || h->weakdef->root.type == bfd_link_hash_defweak); - h->root.u.def.section = h->weakdef->root.u.def.section; - h->root.u.def.value = h->weakdef->root.u.def.value; - return true; - } - - /* This is a reference to a symbol defined by a dynamic object which - is not a function. */ - - return true; -} - -/* Set the sizes of the dynamic sections. */ - -static boolean -mips_elf_size_dynamic_sections (output_bfd, info) - bfd *output_bfd; - struct bfd_link_info *info; -{ - bfd *dynobj; - asection *s; - boolean reltext; - asection *sgot; - struct mips_got_info *g; - - dynobj = elf_hash_table (info)->dynobj; - BFD_ASSERT (dynobj != NULL); - - if (elf_hash_table (info)->dynamic_sections_created) - { - /* Set the contents of the .interp section to the interpreter. */ - if (! info->shared) - { - s = bfd_get_section_by_name (dynobj, ".interp"); - BFD_ASSERT (s != NULL); - s->_raw_size = sizeof ELF_DYNAMIC_INTERPRETER; - s->contents = (unsigned char *) ELF_DYNAMIC_INTERPRETER; - } - } - - /* Recompute the size of .got for local entires (reserved and - hipages) if needed. To estimate it, get the upper bound of total - size of loadable sections. */ - sgot = bfd_get_section_by_name (dynobj, ".got"); - - if (sgot != NULL) - { - bfd_size_type loadable_size = 0; - bfd_size_type local_gotno; - struct _bfd *sub; - - BFD_ASSERT (elf_section_data (sgot) != NULL); - g = (struct mips_got_info *) elf_section_data (sgot)->tdata; - BFD_ASSERT (g != NULL); - - for (sub = info->input_bfds; sub; sub = sub->link_next) - for (s = sub->sections; s != NULL; s = s->next) - { - if ((s->flags & SEC_ALLOC) == 0) - continue; - loadable_size += (s->_raw_size + 0xf) & ~0xf; - } - - loadable_size += MIPS_FUNCTION_STUB_SIZE; - - /* Assume there are two loadable segments consisting of - contiguous sections. Is 5 enough? */ - local_gotno = (loadable_size >> 16) + 5 + MIPS_RESERVED_GOTNO; - g->local_gotno = local_gotno; - sgot->_raw_size += local_gotno * 4; - } - - /* The check_relocs and adjust_dynamic_symbol entry points have - determined the sizes of the various dynamic sections. Allocate - memory for them. */ - reltext = false; - for (s = dynobj->sections; s != NULL; s = s->next) - { - const char *name; - boolean strip; - - /* It's OK to base decisions on the section name, because none - of the dynobj section names depend upon the input files. */ - name = bfd_get_section_name (dynobj, s); - - if ((s->flags & SEC_IN_MEMORY) == 0) - continue; - - strip = false; - - if (strncmp (name, ".rel", 4) == 0) - { - if (s->_raw_size == 0) - strip = true; - else - { - asection *target; - - /* If this relocation section applies to a read only - section, then we probably need a DT_TEXTREL entry. - If the relocation section is .rel.dyn, we always - assert a DT_TEXTREL entry rather than testing whether - there exists a relocation to a read only section or - not. */ - target = bfd_get_section_by_name (output_bfd, name + 4); - if ((target != NULL && (target->flags & SEC_READONLY) != 0) - || strcmp (name, ".rel.dyn") == 0) - reltext = true; - - /* We use the reloc_count field as a counter if we need - to copy relocs into the output file. */ - if (strcmp (name, ".rel.dyn") != 0) - s->reloc_count = 0; - } - } - else if (strncmp (name, ".got", 4) == 0) - { - int i; - - BFD_ASSERT (elf_section_data (s) != NULL); - g = (struct mips_got_info *) elf_section_data (s)->tdata; - BFD_ASSERT (g != NULL); - - /* Fix the size of .got section for the correspondence of - global symbols and got entries. This adds some useless - got entries. Is this required by ABI really? */ - i = elf_hash_table (info)->dynsymcount - g->global_gotsym; - s->_raw_size += i * 4; - } - else if (strncmp (name, ".stub", 5) == 0) - { - /* Irix rld assumes that the function stub isn't at the end - of .text section. So put a dummy. XXX */ - s->_raw_size += MIPS_FUNCTION_STUB_SIZE; - } - else if (SGI_COMPAT (output_bfd) - && strncmp (name, ".compact_rel", 12) == 0) - s->_raw_size += mips_elf_hash_table (info)->compact_rel_size; - else if (strncmp (name, ".init", 5) != 0) - { - /* It's not one of our sections, so don't allocate space. */ - continue; - } - - if (strip) - { - asection **spp; - - for (spp = &s->output_section->owner->sections; - *spp != s->output_section; - spp = &(*spp)->next) - ; - *spp = s->output_section->next; - --s->output_section->owner->section_count; - - continue; - } - - /* Allocate memory for the section contents. */ - s->contents = (bfd_byte *) bfd_alloc (dynobj, s->_raw_size); - if (s->contents == NULL && s->_raw_size != 0) - { - bfd_set_error (bfd_error_no_memory); - return false; - } - memset (s->contents, 0, s->_raw_size); - } - - if (elf_hash_table (info)->dynamic_sections_created) - { - /* Add some entries to the .dynamic section. We fill in the - values later, in elf_mips_finish_dynamic_sections, but we - must add the entries now so that we get the correct size for - the .dynamic section. The DT_DEBUG entry is filled in by the - dynamic linker and used by the debugger. */ - if (! info->shared) - { - if (! bfd_elf32_add_dynamic_entry (info, DT_DEBUG, 0)) - return false; - } - - if (reltext) - { - if (! bfd_elf32_add_dynamic_entry (info, DT_TEXTREL, 0)) - return false; - } - - if (! bfd_elf32_add_dynamic_entry (info, DT_PLTGOT, 0)) - return false; - - if (bfd_get_section_by_name (dynobj, ".rel.dyn")) - { - if (! bfd_elf32_add_dynamic_entry (info, DT_REL, 0)) - return false; - - if (! bfd_elf32_add_dynamic_entry (info, DT_RELSZ, 0)) - return false; - - if (! bfd_elf32_add_dynamic_entry (info, DT_RELENT, 0)) - return false; - } - - if (! bfd_elf32_add_dynamic_entry (info, DT_MIPS_CONFLICTNO, 0)) - return false; - - if (! bfd_elf32_add_dynamic_entry (info, DT_MIPS_LIBLISTNO, 0)) - return false; - - if (bfd_get_section_by_name (dynobj, ".conflict") != NULL) - { - if (! bfd_elf32_add_dynamic_entry (info, DT_MIPS_CONFLICT, 0)) - return false; - - s = bfd_get_section_by_name (dynobj, ".liblist"); - BFD_ASSERT (s != NULL); - - if (! bfd_elf32_add_dynamic_entry (info, DT_MIPS_LIBLIST, 0)) - return false; - } - - if (! bfd_elf32_add_dynamic_entry (info, DT_MIPS_RLD_VERSION, 0)) - return false; - - if (! bfd_elf32_add_dynamic_entry (info, DT_MIPS_FLAGS, 0)) - return false; - -#if 0 - /* Time stamps in executable files are a bad idea. */ - if (! bfd_elf32_add_dynamic_entry (info, DT_MIPS_TIME_STAMP, 0)) - return false; -#endif - -#if 0 /* FIXME */ - if (! bfd_elf32_add_dynamic_entry (info, DT_MIPS_ICHECKSUM, 0)) - return false; -#endif - -#if 0 /* FIXME */ - if (! bfd_elf32_add_dynamic_entry (info, DT_MIPS_IVERSION, 0)) - return false; -#endif - - if (! bfd_elf32_add_dynamic_entry (info, DT_MIPS_BASE_ADDRESS, 0)) - return false; - - if (! bfd_elf32_add_dynamic_entry (info, DT_MIPS_LOCAL_GOTNO, 0)) - return false; - - if (! bfd_elf32_add_dynamic_entry (info, DT_MIPS_SYMTABNO, 0)) - return false; - - if (! bfd_elf32_add_dynamic_entry (info, DT_MIPS_UNREFEXTNO, 0)) - return false; - - if (! bfd_elf32_add_dynamic_entry (info, DT_MIPS_GOTSYM, 0)) - return false; - - if (! bfd_elf32_add_dynamic_entry (info, DT_MIPS_HIPAGENO, 0)) - return false; - -#if 0 /* (SGI_COMPAT) */ - if (! bfd_get_section_by_name (dynobj, ".init")) - if (! bfd_elf32_add_dynamic_entry (info, DT_INIT, 0)) - return false; - - if (! bfd_get_section_by_name (dynobj, ".fini")) - if (! bfd_elf32_add_dynamic_entry (info, DT_FINI, 0)) - return false; -#endif - } - - /* If we use dynamic linking, we generate a section symbol for each - output section. These are local symbols, which means that they - must come first in the dynamic symbol table. - That means we must increment the dynamic symbol index of every - other dynamic symbol. */ - { - const char * const *namep; - unsigned int c, i; - bfd_size_type strindex; - struct bfd_strtab_hash *dynstr; - struct mips_got_info *g; - - if (elf_hash_table (info)->dynamic_sections_created) - { - if (SGI_COMPAT (output_bfd)) - { - c = SIZEOF_MIPS_DYNSYM_SECNAMES - 1; - elf_link_hash_traverse (elf_hash_table (info), - mips_elf_adjust_dynindx, - (PTR) &c); - elf_hash_table (info)->dynsymcount += c; - - dynstr = elf_hash_table (info)->dynstr; - BFD_ASSERT (dynstr != NULL); - - for (i = 1, namep = mips_elf_dynsym_sec_names; - *namep != NULL; - i++, namep++) - { - s = bfd_get_section_by_name (output_bfd, *namep); - if (s != NULL) - elf_section_data (s)->dynindx = i; - - strindex = _bfd_stringtab_add (dynstr, *namep, true, false); - if (strindex == (bfd_size_type) -1) - return false; - - mips_elf_hash_table (info)->dynsym_sec_strindex[i] = strindex; - } - } - else - { - c = bfd_count_sections (output_bfd); - elf_link_hash_traverse (elf_hash_table (info), - mips_elf_adjust_dynindx, - (PTR) &c); - elf_hash_table (info)->dynsymcount += c; - - for (i = 1, s = output_bfd->sections; s != NULL; s = s->next, i++) - { - elf_section_data (s)->dynindx = i; - /* These symbols will have no names, so we don't need to - fiddle with dynstr_index. */ - } - } - } - - s = bfd_get_section_by_name (dynobj, ".got"); - BFD_ASSERT (s != NULL); - BFD_ASSERT (elf_section_data (s) != NULL); - g = (struct mips_got_info *) elf_section_data (s)->tdata; - BFD_ASSERT (g != NULL); - - /* If there are no global got symbols, fake the last symbol so for - safety. */ - if (g->global_gotsym) - g->global_gotsym += c; - else - g->global_gotsym = elf_hash_table (info)->dynsymcount - 1; - } - - return true; -} - -/* Increment the index of a dynamic symbol by a given amount. Called - via elf_link_hash_traverse. */ - -static boolean -mips_elf_adjust_dynindx (h, cparg) - struct elf_link_hash_entry *h; - PTR cparg; -{ - unsigned int *cp = (unsigned int *) cparg; - - if (h->dynindx != -1) - h->dynindx += *cp; - return true; -} - -/* Finish up dynamic symbol handling. We set the contents of various - dynamic sections here. */ - -static boolean -mips_elf_finish_dynamic_symbol (output_bfd, info, h, sym) - bfd *output_bfd; - struct bfd_link_info *info; - struct elf_link_hash_entry *h; - Elf_Internal_Sym *sym; -{ - bfd *dynobj; - bfd_vma gval; - asection *sgot; - struct mips_got_info *g; - const char *name; - - dynobj = elf_hash_table (info)->dynobj; - gval = sym->st_value; - - if (h->plt_offset != (bfd_vma) -1) - { - asection *s; - bfd_byte *p; - bfd_byte stub[MIPS_FUNCTION_STUB_SIZE]; - - /* This symbol has a stub. Set it up. */ - - BFD_ASSERT (h->dynindx != -1); - - s = bfd_get_section_by_name (dynobj, ".stub"); - BFD_ASSERT (s != NULL); - - /* Fill the stub. */ - p = stub; - bfd_put_32 (output_bfd, STUB_LW(output_bfd), p); - p += 4; - bfd_put_32 (output_bfd, STUB_MOVE, p); - p += 4; - - /* FIXME: Can h->dynindex be more than 64K? */ - if (h->dynindx & 0xffff0000) - return false; - - bfd_put_32 (output_bfd, STUB_JALR, p); - p += 4; - bfd_put_32 (output_bfd, STUB_LI16 + h->dynindx, p); - - BFD_ASSERT (h->plt_offset <= s->_raw_size); - memcpy (s->contents + h->plt_offset, stub, MIPS_FUNCTION_STUB_SIZE); - - /* Mark the symbol as undefined. plt_offset != -1 occurs - only for the referenced symbol. */ - sym->st_shndx = SHN_UNDEF; - - /* The run-time linker uses the st_value field of the symbol - to reset the global offset table entry for this external - to its stub address when unlinking a shared object. */ - gval = s->output_section->vma + s->output_offset + h->plt_offset; - sym->st_value = gval; - } - - BFD_ASSERT (h->dynindx != -1); - - sgot = bfd_get_section_by_name (dynobj, ".got"); - BFD_ASSERT (sgot != NULL); - BFD_ASSERT (elf_section_data (sgot) != NULL); - g = (struct mips_got_info *) elf_section_data (sgot)->tdata; - BFD_ASSERT (g != NULL); - - if ((unsigned long) h->dynindx >= g->global_gotsym) - { - bfd_size_type offset; - - /* This symbol has an entry in the global offset table. Set its - value to the corresponding got entry, if needed. */ - if (h->got_offset == (bfd_vma) -1) - { - offset = (h->dynindx - g->global_gotsym + g->local_gotno) * 4; - BFD_ASSERT (g->local_gotno * 4 <= offset - && offset < sgot->_raw_size); - bfd_put_32 (output_bfd, gval, sgot->contents + offset); - } - } - - /* Mark _DYNAMIC and _GLOBAL_OFFSET_TABLE_ as absolute. */ - name = h->root.root.string; - if (strcmp (name, "_DYNAMIC") == 0 - || strcmp (name, "_GLOBAL_OFFSET_TABLE_") == 0) - sym->st_shndx = SHN_ABS; - else if (strcmp (name, "_DYNAMIC_LINK") == 0) - { - sym->st_shndx = SHN_ABS; - sym->st_info = ELF_ST_INFO (STB_GLOBAL, STT_SECTION); - sym->st_value = 1; - } - else if (SGI_COMPAT (output_bfd)) - { - if (strcmp (name, "_gp_disp") == 0) - { - sym->st_shndx = SHN_ABS; - sym->st_info = ELF_ST_INFO (STB_GLOBAL, STT_SECTION); - sym->st_value = elf_gp (output_bfd); - } - else if (strcmp (name, mips_elf_dynsym_rtproc_names[0]) == 0 - || strcmp (name, mips_elf_dynsym_rtproc_names[1]) == 0) - { - sym->st_info = ELF_ST_INFO (STB_GLOBAL, STT_SECTION); - sym->st_other = STO_PROTECTED; - sym->st_value = 0; - sym->st_shndx = SHN_MIPS_DATA; - } - else if (strcmp (name, mips_elf_dynsym_rtproc_names[2]) == 0) - { - sym->st_info = ELF_ST_INFO (STB_GLOBAL, STT_SECTION); - sym->st_other = STO_PROTECTED; - sym->st_value = mips_elf_hash_table (info)->procedure_count; - sym->st_shndx = SHN_ABS; - } - else if (sym->st_shndx != SHN_UNDEF) - { - if (h->type == STT_FUNC) - sym->st_shndx = SHN_MIPS_TEXT; - else if (h->type == STT_OBJECT) - sym->st_shndx = SHN_MIPS_DATA; - } - } - - return true; -} - -/* Finish up the dynamic sections. */ - -static boolean -mips_elf_finish_dynamic_sections (output_bfd, info) - bfd *output_bfd; - struct bfd_link_info *info; -{ - bfd *dynobj; - asection *sdyn; - asection *sgot; - struct mips_got_info *g; - - dynobj = elf_hash_table (info)->dynobj; - - sdyn = bfd_get_section_by_name (dynobj, ".dynamic"); - - sgot = bfd_get_section_by_name (dynobj, ".got"); - BFD_ASSERT (sgot != NULL); - - BFD_ASSERT (elf_section_data (sgot) != NULL); - g = (struct mips_got_info *) elf_section_data (sgot)->tdata; - BFD_ASSERT (g != NULL); - - if (elf_hash_table (info)->dynamic_sections_created) - { - Elf32_External_Dyn *dyncon, *dynconend; - - BFD_ASSERT (sdyn != NULL); - - dyncon = (Elf32_External_Dyn *) sdyn->contents; - dynconend = (Elf32_External_Dyn *) (sdyn->contents + sdyn->_raw_size); - for (; dyncon < dynconend; dyncon++) - { - Elf_Internal_Dyn dyn; - const char *name; - size_t elemsize; - asection *s; - - bfd_elf32_swap_dyn_in (dynobj, dyncon, &dyn); - - switch (dyn.d_tag) - { - default: - break; - - case DT_RELENT: - s = bfd_get_section_by_name (dynobj, ".rel.dyn"); - BFD_ASSERT (s != NULL); - dyn.d_un.d_val = sizeof (Elf32_External_Rel); - bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon); - break; - - case DT_STRSZ: - /* Rewrite DT_STRSZ. */ - dyn.d_un.d_val = - _bfd_stringtab_size (elf_hash_table (info)->dynstr); - bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon); - break; - - case DT_PLTGOT: - name = ".got"; - goto get_vma; - case DT_MIPS_CONFLICT: - name = ".conflict"; - goto get_vma; - case DT_MIPS_LIBLIST: - name = ".liblist"; - get_vma: - s = bfd_get_section_by_name (output_bfd, name); - BFD_ASSERT (s != NULL); - dyn.d_un.d_ptr = s->vma; - bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon); - break; - - case DT_MIPS_RLD_VERSION: - dyn.d_un.d_val = 1; /* XXX */ - bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon); - break; - - case DT_MIPS_FLAGS: - dyn.d_un.d_val = RHF_NOTPOT; /* XXX */ - bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon); - break; - - case DT_MIPS_CONFLICTNO: - name = ".conflict"; - elemsize = sizeof (Elf32_Conflict); - goto set_elemno; - - case DT_MIPS_LIBLISTNO: - name = ".liblist"; - elemsize = sizeof (Elf32_Lib); - set_elemno: - s = bfd_get_section_by_name (output_bfd, name); - if (s != NULL) - { - if (s->_cooked_size != 0) - dyn.d_un.d_val = s->_cooked_size / elemsize; - else - dyn.d_un.d_val = s->_raw_size / elemsize; - } - else - dyn.d_un.d_val = 0; - - bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon); - break; - - case DT_MIPS_TIME_STAMP: - time ((time_t *) &dyn.d_un.d_val); - bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon); - break; - - case DT_MIPS_ICHECKSUM: - /* XXX FIXME: */ - break; - - case DT_MIPS_IVERSION: - /* XXX FIXME: */ - break; - - case DT_MIPS_BASE_ADDRESS: - s = output_bfd->sections; - BFD_ASSERT (s != NULL); - dyn.d_un.d_ptr = s->vma & ~(0xffff); - bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon); - break; - - case DT_MIPS_LOCAL_GOTNO: - dyn.d_un.d_val = g->local_gotno; - bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon); - break; - - case DT_MIPS_SYMTABNO: - name = ".dynsym"; - elemsize = sizeof (Elf32_External_Sym); - s = bfd_get_section_by_name (output_bfd, name); - BFD_ASSERT (s != NULL); - - if (s->_cooked_size != 0) - dyn.d_un.d_val = s->_cooked_size / elemsize; - else - dyn.d_un.d_val = s->_raw_size / elemsize; - bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon); - break; - - case DT_MIPS_UNREFEXTNO: - /* XXX FIXME: */ - dyn.d_un.d_val = SIZEOF_MIPS_DYNSYM_SECNAMES; - bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon); - break; - - case DT_MIPS_GOTSYM: - dyn.d_un.d_val = g->global_gotsym; - bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon); - break; - - case DT_MIPS_HIPAGENO: - dyn.d_un.d_val = g->local_gotno - MIPS_RESERVED_GOTNO; - bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon); - break; - - } - } - } - - /* The first entry of the global offset table will be filled at - runtime. The second entry will be used by some runtime loaders. - This isn't the case of Irix rld. */ - if (sgot->_raw_size > 0) - { - bfd_put_32 (output_bfd, (bfd_vma) 0, sgot->contents); - bfd_put_32 (output_bfd, (bfd_vma) 0x80000000, sgot->contents + 4); - } - - elf_section_data (sgot->output_section)->this_hdr.sh_entsize = 4; - - { - asection *sdynsym; - asection *s; - unsigned int i; - bfd_vma last; - Elf_Internal_Sym sym; - long dindx; - const char *name; - const char * const * namep = mips_elf_dynsym_sec_names; - Elf32_compact_rel cpt; - - /* Set up the section symbols for the output sections. SGI sets - the STT_NOTYPE attribute for these symbols. Should we do so? */ - - sdynsym = bfd_get_section_by_name (dynobj, ".dynsym"); - if (sdynsym != NULL) - { - if (SGI_COMPAT (output_bfd)) - { - sym.st_size = 0; - sym.st_name = 0; - sym.st_info = ELF_ST_INFO (STB_LOCAL, STT_NOTYPE); - sym.st_other = 0; - - i = 0; - while ((name = *namep++) != NULL) - { - s = bfd_get_section_by_name (output_bfd, name); - if (s != NULL) - { - sym.st_value = s->vma; - dindx = elf_section_data (s)->dynindx; - last = s->vma + s->_raw_size; - } - else - { - sym.st_value = last; - dindx++; - } - - sym.st_shndx = (i < MIPS_TEXT_DYNSYM_SECNO - ? SHN_MIPS_TEXT - : SHN_MIPS_DATA); - ++i; - sym.st_name = - mips_elf_hash_table (info)->dynsym_sec_strindex[dindx]; - - bfd_elf32_swap_symbol_out (output_bfd, &sym, - (((Elf32_External_Sym *) - sdynsym->contents) - + dindx)); - } - - /* Set the sh_info field of the output .dynsym section to - the index of the first global symbol. */ - elf_section_data (sdynsym->output_section)->this_hdr.sh_info = - SIZEOF_MIPS_DYNSYM_SECNAMES; - } - else - { - sym.st_size = 0; - sym.st_name = 0; - sym.st_info = ELF_ST_INFO (STB_LOCAL, STT_SECTION); - sym.st_other = 0; - - for (s = output_bfd->sections; s != NULL; s = s->next) - { - int indx; - - sym.st_value = s->vma; - - indx = elf_section_data (s)->this_idx; - BFD_ASSERT (indx > 0); - sym.st_shndx = indx; - - bfd_elf32_swap_symbol_out (output_bfd, &sym, - (((Elf32_External_Sym *) - sdynsym->contents) - + elf_section_data (s)->dynindx)); - } - - /* Set the sh_info field of the output .dynsym section to - the index of the first global symbol. */ - elf_section_data (sdynsym->output_section)->this_hdr.sh_info = - bfd_count_sections (output_bfd) + 1; - } - } - - if (SGI_COMPAT (output_bfd)) - { - /* Write .compact_rel section out. */ - s = bfd_get_section_by_name (dynobj, ".compact_rel"); - if (s != NULL) - { - cpt.id1 = 1; - cpt.num = s->reloc_count; - cpt.id2 = 2; - cpt.offset = (s->output_section->filepos - + sizeof (Elf32_External_compact_rel)); - cpt.reserved0 = 0; - cpt.reserved1 = 0; - bfd_elf32_swap_compact_rel_out (output_bfd, &cpt, - ((Elf32_External_compact_rel *) - s->contents)); - - /* Clean up a dummy stub function entry in .text. */ - s = bfd_get_section_by_name (dynobj, ".stub"); - if (s != NULL) - { - file_ptr dummy_offset; - - BFD_ASSERT (s->_raw_size >= MIPS_FUNCTION_STUB_SIZE); - dummy_offset = s->_raw_size - MIPS_FUNCTION_STUB_SIZE; - memset (s->contents + dummy_offset, 0, - MIPS_FUNCTION_STUB_SIZE); - } - } - } - - /* Clean up a first relocation in .rel.dyn. */ - s = bfd_get_section_by_name (dynobj, ".rel.dyn"); - if (s != NULL) - memset (s->contents, 0, sizeof (Elf32_External_Rel)); - } - - return true; -} - -/* This is almost identical to bfd_generic_get_... except that some - MIPS relocations need to be handled specially. Sigh. */ - -static bfd_byte * -elf32_mips_get_relocated_section_contents (abfd, link_info, link_order, data, - relocateable, symbols) - bfd *abfd; - struct bfd_link_info *link_info; - struct bfd_link_order *link_order; - bfd_byte *data; - boolean relocateable; - asymbol **symbols; -{ - /* Get enough memory to hold the stuff */ - bfd *input_bfd = link_order->u.indirect.section->owner; - asection *input_section = link_order->u.indirect.section; - - long reloc_size = bfd_get_reloc_upper_bound (input_bfd, input_section); - arelent **reloc_vector = NULL; - long reloc_count; - - if (reloc_size < 0) - goto error_return; - - reloc_vector = (arelent **) bfd_malloc (reloc_size); - if (reloc_vector == NULL && reloc_size != 0) - goto error_return; - - /* read in the section */ - if (!bfd_get_section_contents (input_bfd, - input_section, - (PTR) data, - 0, - input_section->_raw_size)) - goto error_return; - - /* We're not relaxing the section, so just copy the size info */ - input_section->_cooked_size = input_section->_raw_size; - input_section->reloc_done = true; - - reloc_count = bfd_canonicalize_reloc (input_bfd, - input_section, - reloc_vector, - symbols); - if (reloc_count < 0) - goto error_return; - - if (reloc_count > 0) - { - arelent **parent; - /* for mips */ - int gp_found; - bfd_vma gp = 0x12345678; /* initialize just to shut gcc up */ - - { - struct bfd_hash_entry *h; - struct bfd_link_hash_entry *lh; - /* Skip all this stuff if we aren't mixing formats. */ - if (abfd && input_bfd - && abfd->xvec == input_bfd->xvec) - lh = 0; - else - { - h = bfd_hash_lookup (&link_info->hash->table, "_gp", false, false); - lh = (struct bfd_link_hash_entry *) h; - } - lookup: - if (lh) - { - switch (lh->type) - { - case bfd_link_hash_undefined: - case bfd_link_hash_undefweak: - case bfd_link_hash_common: - gp_found = 0; - break; - case bfd_link_hash_defined: - case bfd_link_hash_defweak: - gp_found = 1; - gp = lh->u.def.value; - break; - case bfd_link_hash_indirect: - case bfd_link_hash_warning: - lh = lh->u.i.link; - /* @@FIXME ignoring warning for now */ - goto lookup; - case bfd_link_hash_new: - default: - abort (); - } - } - else - gp_found = 0; - } - /* end mips */ - for (parent = reloc_vector; *parent != (arelent *) NULL; - parent++) - { - char *error_message = (char *) NULL; - bfd_reloc_status_type r; - - /* Specific to MIPS: Deal with relocation types that require - knowing the gp of the output bfd. */ - asymbol *sym = *(*parent)->sym_ptr_ptr; - if (bfd_is_abs_section (sym->section) && abfd) - { - /* The special_function wouldn't get called anyways. */ - } - else if (!gp_found) - { - /* The gp isn't there; let the special function code - fall over on its own. */ - } - else if ((*parent)->howto->special_function - == mips_elf_gprel16_reloc) - { - /* bypass special_function call */ - r = gprel16_with_gp (input_bfd, sym, *parent, input_section, - relocateable, (PTR) data, gp); - goto skip_bfd_perform_relocation; - } - /* end mips specific stuff */ - - r = bfd_perform_relocation (input_bfd, - *parent, - (PTR) data, - input_section, - relocateable ? abfd : (bfd *) NULL, - &error_message); - skip_bfd_perform_relocation: - - if (relocateable) - { - asection *os = input_section->output_section; - - /* A partial link, so keep the relocs */ - os->orelocation[os->reloc_count] = *parent; - os->reloc_count++; - } - - if (r != bfd_reloc_ok) - { - switch (r) - { - case bfd_reloc_undefined: - if (!((*link_info->callbacks->undefined_symbol) - (link_info, bfd_asymbol_name (*(*parent)->sym_ptr_ptr), - input_bfd, input_section, (*parent)->address))) - goto error_return; - break; - case bfd_reloc_dangerous: - BFD_ASSERT (error_message != (char *) NULL); - if (!((*link_info->callbacks->reloc_dangerous) - (link_info, error_message, input_bfd, input_section, - (*parent)->address))) - goto error_return; - break; - case bfd_reloc_overflow: - if (!((*link_info->callbacks->reloc_overflow) - (link_info, bfd_asymbol_name (*(*parent)->sym_ptr_ptr), - (*parent)->howto->name, (*parent)->addend, - input_bfd, input_section, (*parent)->address))) - goto error_return; - break; - case bfd_reloc_outofrange: - default: - abort (); - break; - } - - } - } - } - if (reloc_vector != NULL) - free (reloc_vector); - return data; - -error_return: - if (reloc_vector != NULL) - free (reloc_vector); - return NULL; -} -#define bfd_elf32_bfd_get_relocated_section_contents \ - elf32_mips_get_relocated_section_contents - -/* ECOFF swapping routines. These are used when dealing with the - .mdebug section, which is in the ECOFF debugging format. */ -static const struct ecoff_debug_swap mips_elf_ecoff_debug_swap = -{ - /* Symbol table magic number. */ - magicSym, - /* Alignment of debugging information. E.g., 4. */ - 4, - /* Sizes of external symbolic information. */ - sizeof (struct hdr_ext), - sizeof (struct dnr_ext), - sizeof (struct pdr_ext), - sizeof (struct sym_ext), - sizeof (struct opt_ext), - sizeof (struct fdr_ext), - sizeof (struct rfd_ext), - sizeof (struct ext_ext), - /* Functions to swap in external symbolic data. */ - ecoff_swap_hdr_in, - ecoff_swap_dnr_in, - ecoff_swap_pdr_in, - ecoff_swap_sym_in, - ecoff_swap_opt_in, - ecoff_swap_fdr_in, - ecoff_swap_rfd_in, - ecoff_swap_ext_in, - _bfd_ecoff_swap_tir_in, - _bfd_ecoff_swap_rndx_in, - /* Functions to swap out external symbolic data. */ - ecoff_swap_hdr_out, - ecoff_swap_dnr_out, - ecoff_swap_pdr_out, - ecoff_swap_sym_out, - ecoff_swap_opt_out, - ecoff_swap_fdr_out, - ecoff_swap_rfd_out, - ecoff_swap_ext_out, - _bfd_ecoff_swap_tir_out, - _bfd_ecoff_swap_rndx_out, - /* Function to read in symbolic data. */ - mips_elf_read_ecoff_info -}; - -#define TARGET_LITTLE_SYM bfd_elf32_littlemips_vec -#define TARGET_LITTLE_NAME "elf32-littlemips" -#define TARGET_BIG_SYM bfd_elf32_bigmips_vec -#define TARGET_BIG_NAME "elf32-bigmips" -#define ELF_ARCH bfd_arch_mips -#define ELF_MACHINE_CODE EM_MIPS -#define ELF_MAXPAGESIZE 0x10000 -#define elf_backend_collect true -#define elf_backend_type_change_ok true -#define elf_info_to_howto 0 -#define elf_info_to_howto_rel mips_info_to_howto_rel -#define elf_backend_sym_is_global mips_elf_sym_is_global -#define elf_backend_object_p mips_elf_object_p -#define elf_backend_section_from_shdr mips_elf_section_from_shdr -#define elf_backend_fake_sections mips_elf_fake_sections -#define elf_backend_section_from_bfd_section \ - mips_elf_section_from_bfd_section -#define elf_backend_section_processing mips_elf_section_processing -#define elf_backend_symbol_processing mips_elf_symbol_processing -#define elf_backend_additional_program_headers \ - mips_elf_additional_program_headers -#define elf_backend_modify_segment_map mips_elf_modify_segment_map -#define elf_backend_final_write_processing \ - mips_elf_final_write_processing -#define elf_backend_ecoff_debug_swap &mips_elf_ecoff_debug_swap - -#define bfd_elf32_bfd_is_local_label mips_elf_is_local_label -#define bfd_elf32_find_nearest_line mips_elf_find_nearest_line - -#define bfd_elf32_bfd_link_hash_table_create \ - mips_elf_link_hash_table_create -#define bfd_elf32_bfd_final_link mips_elf_final_link -#define bfd_elf32_bfd_copy_private_bfd_data \ - mips_elf_copy_private_bfd_data -#define bfd_elf32_bfd_merge_private_bfd_data \ - mips_elf_merge_private_bfd_data -#define bfd_elf32_bfd_set_private_flags mips_elf_set_private_flags -#define elf_backend_add_symbol_hook mips_elf_add_symbol_hook -#define elf_backend_create_dynamic_sections \ - mips_elf_create_dynamic_sections -#define elf_backend_check_relocs mips_elf_check_relocs -#define elf_backend_adjust_dynamic_symbol \ - mips_elf_adjust_dynamic_symbol -#define elf_backend_size_dynamic_sections \ - mips_elf_size_dynamic_sections -#define elf_backend_relocate_section mips_elf_relocate_section -#define elf_backend_finish_dynamic_symbol \ - mips_elf_finish_dynamic_symbol -#define elf_backend_finish_dynamic_sections \ - mips_elf_finish_dynamic_sections - -#include "elf32-target.h" diff --git a/contrib/gdb/bfd/elf32-ppc.c b/contrib/gdb/bfd/elf32-ppc.c deleted file mode 100644 index a8e5ad3fdb19a..0000000000000 --- a/contrib/gdb/bfd/elf32-ppc.c +++ /dev/null @@ -1,2554 +0,0 @@ -/* PowerPC-specific support for 32-bit ELF - Copyright 1994, 1995, 1996 Free Software Foundation, Inc. - Written by Ian Lance Taylor, Cygnus Support. - -This file is part of BFD, the Binary File Descriptor library. - -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 2 of the License, 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ - -/* This file is based on a preliminary PowerPC ELF ABI. The - information may not match the final PowerPC ELF ABI. It includes - suggestions from the in-progress Embedded PowerPC ABI, and that - information may also not match. */ - -#include "bfd.h" -#include "sysdep.h" -#include "bfdlink.h" -#include "libbfd.h" -#include "elf-bfd.h" -#include "elf/ppc.h" - -#define USE_RELA /* we want RELA relocations, not REL */ - -/* PowerPC relocations defined by the ABIs */ -enum ppc_reloc_type -{ - R_PPC_NONE = 0, - R_PPC_ADDR32 = 1, - R_PPC_ADDR24 = 2, - R_PPC_ADDR16 = 3, - R_PPC_ADDR16_LO = 4, - R_PPC_ADDR16_HI = 5, - R_PPC_ADDR16_HA = 6, - R_PPC_ADDR14 = 7, - R_PPC_ADDR14_BRTAKEN = 8, - R_PPC_ADDR14_BRNTAKEN = 9, - R_PPC_REL24 = 10, - R_PPC_REL14 = 11, - R_PPC_REL14_BRTAKEN = 12, - R_PPC_REL14_BRNTAKEN = 13, - R_PPC_GOT16 = 14, - R_PPC_GOT16_LO = 15, - R_PPC_GOT16_HI = 16, - R_PPC_GOT16_HA = 17, - R_PPC_PLTREL24 = 18, - R_PPC_COPY = 19, - R_PPC_GLOB_DAT = 20, - R_PPC_JMP_SLOT = 21, - R_PPC_RELATIVE = 22, - R_PPC_LOCAL24PC = 23, - R_PPC_UADDR32 = 24, - R_PPC_UADDR16 = 25, - R_PPC_REL32 = 26, - R_PPC_PLT32 = 27, - R_PPC_PLTREL32 = 28, - R_PPC_PLT16_LO = 29, - R_PPC_PLT16_HI = 30, - R_PPC_PLT16_HA = 31, - R_PPC_SDAREL16 = 32, - R_PPC_SECTOFF = 33, - R_PPC_SECTOFF_LO = 34, - R_PPC_SECTOFF_HI = 35, - R_PPC_SECTOFF_HA = 36, - - /* The remaining relocs are from the Embedded ELF ABI, and are not - in the SVR4 ELF ABI. */ - R_PPC_EMB_NADDR32 = 101, - R_PPC_EMB_NADDR16 = 102, - R_PPC_EMB_NADDR16_LO = 103, - R_PPC_EMB_NADDR16_HI = 104, - R_PPC_EMB_NADDR16_HA = 105, - R_PPC_EMB_SDAI16 = 106, - R_PPC_EMB_SDA2I16 = 107, - R_PPC_EMB_SDA2REL = 108, - R_PPC_EMB_SDA21 = 109, - R_PPC_EMB_MRKREF = 110, - R_PPC_EMB_RELSEC16 = 111, - R_PPC_EMB_RELST_LO = 112, - R_PPC_EMB_RELST_HI = 113, - R_PPC_EMB_RELST_HA = 114, - R_PPC_EMB_BIT_FLD = 115, - R_PPC_EMB_RELSDA = 116, - - /* This is a phony reloc to handle any old fashioned TOC16 references - that may still be in object files. */ - R_PPC_TOC16 = 255, - - R_PPC_max -}; - -static reloc_howto_type *ppc_elf_reloc_type_lookup - PARAMS ((bfd *abfd, bfd_reloc_code_real_type code)); -static void ppc_elf_info_to_howto - PARAMS ((bfd *abfd, arelent *cache_ptr, Elf32_Internal_Rela *dst)); -static void ppc_elf_howto_init PARAMS ((void)); -static boolean ppc_elf_set_private_flags PARAMS ((bfd *, flagword)); -static boolean ppc_elf_copy_private_bfd_data PARAMS ((bfd *, bfd *)); -static boolean ppc_elf_merge_private_bfd_data PARAMS ((bfd *, bfd *)); - -static int ppc_elf_additional_program_headers PARAMS ((bfd *)); -static boolean ppc_elf_modify_segment_map PARAMS ((bfd *)); - -static boolean ppc_elf_section_from_shdr PARAMS ((bfd *, - Elf32_Internal_Shdr *, - char *)); - -static elf_linker_section_t *ppc_elf_create_linker_section - PARAMS ((bfd *abfd, - struct bfd_link_info *info, - enum elf_linker_section_enum)); - -static boolean ppc_elf_check_relocs PARAMS ((bfd *, - struct bfd_link_info *, - asection *, - const Elf_Internal_Rela *)); - -static boolean ppc_elf_adjust_dynamic_symbol PARAMS ((struct bfd_link_info *, - struct elf_link_hash_entry *)); - -static boolean ppc_elf_adjust_dynindx PARAMS ((struct elf_link_hash_entry *, PTR)); - -static boolean ppc_elf_size_dynamic_sections PARAMS ((bfd *, struct bfd_link_info *)); - -static boolean ppc_elf_relocate_section PARAMS ((bfd *, - struct bfd_link_info *info, - bfd *, - asection *, - bfd_byte *, - Elf_Internal_Rela *relocs, - Elf_Internal_Sym *local_syms, - asection **)); - -static boolean ppc_elf_add_symbol_hook PARAMS ((bfd *, - struct bfd_link_info *, - const Elf_Internal_Sym *, - const char **, - flagword *, - asection **, - bfd_vma *)); - -static boolean ppc_elf_finish_dynamic_symbol PARAMS ((bfd *, - struct bfd_link_info *, - struct elf_link_hash_entry *, - Elf_Internal_Sym *)); - -static boolean ppc_elf_finish_dynamic_sections PARAMS ((bfd *, struct bfd_link_info *)); - -#define BRANCH_PREDICT_BIT 0x200000 /* branch prediction bit for branch taken relocs */ -#define RA_REGISTER_MASK 0x001f0000 /* mask to set RA in memory instructions */ -#define RA_REGISTER_SHIFT 16 /* value to shift register by to insert RA */ - -/* The name of the dynamic interpreter. This is put in the .interp - section. */ - -#define ELF_DYNAMIC_INTERPRETER "/usr/lib/ld.so.1" - - -static reloc_howto_type *ppc_elf_howto_table[ (int)R_PPC_max ]; - -static reloc_howto_type ppc_elf_howto_raw[] = -{ - /* This reloc does nothing. */ - HOWTO (R_PPC_NONE, /* type */ - 0, /* rightshift */ - 2, /* size (0 = byte, 1 = short, 2 = long) */ - 32, /* bitsize */ - false, /* pc_relative */ - 0, /* bitpos */ - complain_overflow_bitfield, /* complain_on_overflow */ - bfd_elf_generic_reloc, /* special_function */ - "R_PPC_NONE", /* name */ - false, /* partial_inplace */ - 0, /* src_mask */ - 0, /* dst_mask */ - false), /* pcrel_offset */ - - /* A standard 32 bit relocation. */ - HOWTO (R_PPC_ADDR32, /* type */ - 0, /* rightshift */ - 2, /* size (0 = byte, 1 = short, 2 = long) */ - 32, /* bitsize */ - false, /* pc_relative */ - 0, /* bitpos */ - complain_overflow_bitfield, /* complain_on_overflow */ - bfd_elf_generic_reloc, /* special_function */ - "R_PPC_ADDR32", /* name */ - false, /* partial_inplace */ - 0, /* src_mask */ - 0xffffffff, /* dst_mask */ - false), /* pcrel_offset */ - - /* An absolute 26 bit branch; the lower two bits must be zero. - FIXME: we don't check that, we just clear them. */ - HOWTO (R_PPC_ADDR24, /* type */ - 0, /* rightshift */ - 2, /* size (0 = byte, 1 = short, 2 = long) */ - 26, /* bitsize */ - false, /* pc_relative */ - 0, /* bitpos */ - complain_overflow_bitfield, /* complain_on_overflow */ - bfd_elf_generic_reloc, /* special_function */ - "R_PPC_ADDR24", /* name */ - false, /* partial_inplace */ - 0, /* src_mask */ - 0x3fffffc, /* dst_mask */ - false), /* pcrel_offset */ - - /* A standard 16 bit relocation. */ - HOWTO (R_PPC_ADDR16, /* type */ - 0, /* rightshift */ - 1, /* size (0 = byte, 1 = short, 2 = long) */ - 16, /* bitsize */ - false, /* pc_relative */ - 0, /* bitpos */ - complain_overflow_bitfield, /* complain_on_overflow */ - bfd_elf_generic_reloc, /* special_function */ - "R_PPC_ADDR16", /* name */ - false, /* partial_inplace */ - 0, /* src_mask */ - 0xffff, /* dst_mask */ - false), /* pcrel_offset */ - - /* A 16 bit relocation without overflow. */ - HOWTO (R_PPC_ADDR16_LO, /* type */ - 0, /* rightshift */ - 1, /* size (0 = byte, 1 = short, 2 = long) */ - 16, /* bitsize */ - false, /* pc_relative */ - 0, /* bitpos */ - complain_overflow_dont,/* complain_on_overflow */ - bfd_elf_generic_reloc, /* special_function */ - "R_PPC_ADDR16_LO", /* name */ - false, /* partial_inplace */ - 0, /* src_mask */ - 0xffff, /* dst_mask */ - false), /* pcrel_offset */ - - /* The high order 16 bits of an address. */ - HOWTO (R_PPC_ADDR16_HI, /* type */ - 16, /* rightshift */ - 1, /* size (0 = byte, 1 = short, 2 = long) */ - 16, /* bitsize */ - false, /* pc_relative */ - 0, /* bitpos */ - complain_overflow_dont, /* complain_on_overflow */ - bfd_elf_generic_reloc, /* special_function */ - "R_PPC_ADDR16_HI", /* name */ - false, /* partial_inplace */ - 0, /* src_mask */ - 0xffff, /* dst_mask */ - false), /* pcrel_offset */ - - /* The high order 16 bits of an address, plus 1 if the contents of - the low 16 bits, treated as a signed number, is negative. */ - HOWTO (R_PPC_ADDR16_HA, /* type */ - 16, /* rightshift */ - 1, /* size (0 = byte, 1 = short, 2 = long) */ - 16, /* bitsize */ - false, /* pc_relative */ - 0, /* bitpos */ - complain_overflow_dont, /* complain_on_overflow */ - bfd_elf_generic_reloc, /* special_function */ - "R_PPC_ADDR16_HA", /* name */ - false, /* partial_inplace */ - 0, /* src_mask */ - 0xffff, /* dst_mask */ - false), /* pcrel_offset */ - - /* An absolute 16 bit branch; the lower two bits must be zero. - FIXME: we don't check that, we just clear them. */ - HOWTO (R_PPC_ADDR14, /* type */ - 0, /* rightshift */ - 2, /* size (0 = byte, 1 = short, 2 = long) */ - 16, /* bitsize */ - false, /* pc_relative */ - 0, /* bitpos */ - complain_overflow_bitfield, /* complain_on_overflow */ - bfd_elf_generic_reloc, /* special_function */ - "R_PPC_ADDR14", /* name */ - false, /* partial_inplace */ - 0, /* src_mask */ - 0xfffc, /* dst_mask */ - false), /* pcrel_offset */ - - /* An absolute 16 bit branch, for which bit 10 should be set to - indicate that the branch is expected to be taken. The lower two - bits must be zero. */ - HOWTO (R_PPC_ADDR14_BRTAKEN, /* type */ - 0, /* rightshift */ - 2, /* size (0 = byte, 1 = short, 2 = long) */ - 16, /* bitsize */ - false, /* pc_relative */ - 0, /* bitpos */ - complain_overflow_bitfield, /* complain_on_overflow */ - bfd_elf_generic_reloc, /* special_function */ - "R_PPC_ADDR14_BRTAKEN",/* name */ - false, /* partial_inplace */ - 0, /* src_mask */ - 0xfffc, /* dst_mask */ - false), /* pcrel_offset */ - - /* An absolute 16 bit branch, for which bit 10 should be set to - indicate that the branch is not expected to be taken. The lower - two bits must be zero. */ - HOWTO (R_PPC_ADDR14_BRNTAKEN, /* type */ - 0, /* rightshift */ - 2, /* size (0 = byte, 1 = short, 2 = long) */ - 16, /* bitsize */ - false, /* pc_relative */ - 0, /* bitpos */ - complain_overflow_bitfield, /* complain_on_overflow */ - bfd_elf_generic_reloc, /* special_function */ - "R_PPC_ADDR14_BRNTAKEN",/* name */ - false, /* partial_inplace */ - 0, /* src_mask */ - 0xfffc, /* dst_mask */ - false), /* pcrel_offset */ - - /* A relative 26 bit branch; the lower two bits must be zero. */ - HOWTO (R_PPC_REL24, /* type */ - 0, /* rightshift */ - 2, /* size (0 = byte, 1 = short, 2 = long) */ - 26, /* bitsize */ - true, /* pc_relative */ - 0, /* bitpos */ - complain_overflow_signed, /* complain_on_overflow */ - bfd_elf_generic_reloc, /* special_function */ - "R_PPC_REL24", /* name */ - false, /* partial_inplace */ - 0, /* src_mask */ - 0x3fffffc, /* dst_mask */ - true), /* pcrel_offset */ - - /* A relative 16 bit branch; the lower two bits must be zero. */ - HOWTO (R_PPC_REL14, /* type */ - 0, /* rightshift */ - 2, /* size (0 = byte, 1 = short, 2 = long) */ - 16, /* bitsize */ - true, /* pc_relative */ - 0, /* bitpos */ - complain_overflow_signed, /* complain_on_overflow */ - bfd_elf_generic_reloc, /* special_function */ - "R_PPC_REL14", /* name */ - false, /* partial_inplace */ - 0, /* src_mask */ - 0xfffc, /* dst_mask */ - true), /* pcrel_offset */ - - /* A relative 16 bit branch. Bit 10 should be set to indicate that - the branch is expected to be taken. The lower two bits must be - zero. */ - HOWTO (R_PPC_REL14_BRTAKEN, /* type */ - 0, /* rightshift */ - 2, /* size (0 = byte, 1 = short, 2 = long) */ - 16, /* bitsize */ - true, /* pc_relative */ - 0, /* bitpos */ - complain_overflow_signed, /* complain_on_overflow */ - bfd_elf_generic_reloc, /* special_function */ - "R_PPC_REL14_BRTAKEN", /* name */ - false, /* partial_inplace */ - 0, /* src_mask */ - 0xfffc, /* dst_mask */ - true), /* pcrel_offset */ - - /* A relative 16 bit branch. Bit 10 should be set to indicate that - the branch is not expected to be taken. The lower two bits must - be zero. */ - HOWTO (R_PPC_REL14_BRNTAKEN, /* type */ - 0, /* rightshift */ - 2, /* size (0 = byte, 1 = short, 2 = long) */ - 16, /* bitsize */ - true, /* pc_relative */ - 0, /* bitpos */ - complain_overflow_signed, /* complain_on_overflow */ - bfd_elf_generic_reloc, /* special_function */ - "R_PPC_REL14_BRNTAKEN",/* name */ - false, /* partial_inplace */ - 0, /* src_mask */ - 0xfffc, /* dst_mask */ - true), /* pcrel_offset */ - - /* Like R_PPC_ADDR16, but referring to the GOT table entry for the - symbol. */ - HOWTO (R_PPC_GOT16, /* type */ - 0, /* rightshift */ - 1, /* size (0 = byte, 1 = short, 2 = long) */ - 16, /* bitsize */ - false, /* pc_relative */ - 0, /* bitpos */ - complain_overflow_signed, /* complain_on_overflow */ - bfd_elf_generic_reloc, /* special_function */ - "R_PPC_GOT16", /* name */ - false, /* partial_inplace */ - 0, /* src_mask */ - 0xffff, /* dst_mask */ - false), /* pcrel_offset */ - - /* Like R_PPC_ADDR16_LO, but referring to the GOT table entry for - the symbol. */ - HOWTO (R_PPC_GOT16_LO, /* type */ - 0, /* rightshift */ - 1, /* size (0 = byte, 1 = short, 2 = long) */ - 16, /* bitsize */ - false, /* pc_relative */ - 0, /* bitpos */ - complain_overflow_bitfield, /* complain_on_overflow */ - bfd_elf_generic_reloc, /* special_function */ - "R_PPC_GOT16_LO", /* name */ - false, /* partial_inplace */ - 0, /* src_mask */ - 0xffff, /* dst_mask */ - false), /* pcrel_offset */ - - /* Like R_PPC_ADDR16_HI, but referring to the GOT table entry for - the symbol. */ - HOWTO (R_PPC_GOT16_HI, /* type */ - 16, /* rightshift */ - 1, /* size (0 = byte, 1 = short, 2 = long) */ - 16, /* bitsize */ - false, /* pc_relative */ - 0, /* bitpos */ - complain_overflow_bitfield, /* complain_on_overflow */ - bfd_elf_generic_reloc, /* special_function */ - "R_PPC_GOT16_HI", /* name */ - false, /* partial_inplace */ - 0, /* src_mask */ - 0xffff, /* dst_mask */ - false), /* pcrel_offset */ - - /* Like R_PPC_ADDR16_HA, but referring to the GOT table entry for - the symbol. */ - HOWTO (R_PPC_GOT16_HA, /* type */ - 0, /* rightshift */ - 1, /* size (0 = byte, 1 = short, 2 = long) */ - 16, /* bitsize */ - false, /* pc_relative */ - 0, /* bitpos */ - complain_overflow_bitfield, /* complain_on_overflow */ - bfd_elf_generic_reloc, /* special_function */ - "R_PPC_GOT16_HA", /* name */ - false, /* partial_inplace */ - 0, /* src_mask */ - 0xffff, /* dst_mask */ - false), /* pcrel_offset */ - - /* Like R_PPC_REL24, but referring to the procedure linkage table - entry for the symbol. FIXME: Not supported. */ - HOWTO (R_PPC_PLTREL24, /* type */ - 0, /* rightshift */ - 2, /* size (0 = byte, 1 = short, 2 = long) */ - 26, /* bitsize */ - true, /* pc_relative */ - 0, /* bitpos */ - complain_overflow_signed, /* complain_on_overflow */ - bfd_elf_generic_reloc, /* special_function */ - "R_PPC_PLTREL24", /* name */ - false, /* partial_inplace */ - 0, /* src_mask */ - 0x3fffffc, /* dst_mask */ - true), /* pcrel_offset */ - - /* This is used only by the dynamic linker. The symbol should exist - both in the object being run and in some shared library. The - dynamic linker copies the data addressed by the symbol from the - shared library into the object. I have no idea what the purpose - of this is. */ - HOWTO (R_PPC_COPY, /* type */ - 0, /* rightshift */ - 2, /* size (0 = byte, 1 = short, 2 = long) */ - 32, /* bitsize */ - false, /* pc_relative */ - 0, /* bitpos */ - complain_overflow_bitfield, /* complain_on_overflow */ - bfd_elf_generic_reloc, /* special_function */ - "R_PPC_COPY", /* name */ - false, /* partial_inplace */ - 0, /* src_mask */ - 0, /* dst_mask */ - false), /* pcrel_offset */ - - /* Like R_PPC_ADDR32, but used when setting global offset table - entries. */ - HOWTO (R_PPC_GLOB_DAT, /* type */ - 0, /* rightshift */ - 2, /* size (0 = byte, 1 = short, 2 = long) */ - 32, /* bitsize */ - false, /* pc_relative */ - 0, /* bitpos */ - complain_overflow_bitfield, /* complain_on_overflow */ - bfd_elf_generic_reloc, /* special_function */ - "R_PPC_GLOB_DAT", /* name */ - false, /* partial_inplace */ - 0, /* src_mask */ - 0xffffffff, /* dst_mask */ - false), /* pcrel_offset */ - - /* Marks a procedure linkage table entry for a symbol. */ - HOWTO (R_PPC_JMP_SLOT, /* type */ - 0, /* rightshift */ - 2, /* size (0 = byte, 1 = short, 2 = long) */ - 32, /* bitsize */ - false, /* pc_relative */ - 0, /* bitpos */ - complain_overflow_bitfield, /* complain_on_overflow */ - bfd_elf_generic_reloc, /* special_function */ - "R_PPC_JMP_SLOT", /* name */ - false, /* partial_inplace */ - 0, /* src_mask */ - 0, /* dst_mask */ - false), /* pcrel_offset */ - - /* Used only by the dynamic linker. When the object is run, this - longword is set to the load address of the object, plus the - addend. */ - HOWTO (R_PPC_RELATIVE, /* type */ - 0, /* rightshift */ - 2, /* size (0 = byte, 1 = short, 2 = long) */ - 32, /* bitsize */ - false, /* pc_relative */ - 0, /* bitpos */ - complain_overflow_bitfield, /* complain_on_overflow */ - bfd_elf_generic_reloc, /* special_function */ - "R_PPC_RELATIVE", /* name */ - false, /* partial_inplace */ - 0, /* src_mask */ - 0xffffffff, /* dst_mask */ - false), /* pcrel_offset */ - - /* Like R_PPC_REL24, but uses the value of the symbol within the - object rather than the final value. Normally used for - _GLOBAL_OFFSET_TABLE_. FIXME: Not supported. */ - HOWTO (R_PPC_LOCAL24PC, /* type */ - 0, /* rightshift */ - 2, /* size (0 = byte, 1 = short, 2 = long) */ - 26, /* bitsize */ - true, /* pc_relative */ - 0, /* bitpos */ - complain_overflow_signed, /* complain_on_overflow */ - bfd_elf_generic_reloc, /* special_function */ - "R_PPC_LOCAL24PC", /* name */ - false, /* partial_inplace */ - 0, /* src_mask */ - 0x3fffffc, /* dst_mask */ - true), /* pcrel_offset */ - - /* Like R_PPC_ADDR32, but may be unaligned. */ - HOWTO (R_PPC_UADDR32, /* type */ - 0, /* rightshift */ - 2, /* size (0 = byte, 1 = short, 2 = long) */ - 32, /* bitsize */ - false, /* pc_relative */ - 0, /* bitpos */ - complain_overflow_bitfield, /* complain_on_overflow */ - bfd_elf_generic_reloc, /* special_function */ - "R_PPC_UADDR32", /* name */ - false, /* partial_inplace */ - 0, /* src_mask */ - 0xffffffff, /* dst_mask */ - false), /* pcrel_offset */ - - /* Like R_PPC_ADDR16, but may be unaligned. */ - HOWTO (R_PPC_UADDR16, /* type */ - 0, /* rightshift */ - 1, /* size (0 = byte, 1 = short, 2 = long) */ - 16, /* bitsize */ - false, /* pc_relative */ - 0, /* bitpos */ - complain_overflow_bitfield, /* complain_on_overflow */ - bfd_elf_generic_reloc, /* special_function */ - "R_PPC_UADDR16", /* name */ - false, /* partial_inplace */ - 0, /* src_mask */ - 0xffff, /* dst_mask */ - false), /* pcrel_offset */ - - /* 32-bit PC relative */ - HOWTO (R_PPC_REL32, /* type */ - 0, /* rightshift */ - 2, /* size (0 = byte, 1 = short, 2 = long) */ - 32, /* bitsize */ - true, /* pc_relative */ - 0, /* bitpos */ - complain_overflow_bitfield, /* complain_on_overflow */ - bfd_elf_generic_reloc, /* special_function */ - "R_PPC_REL32", /* name */ - false, /* partial_inplace */ - 0, /* src_mask */ - 0xffffffff, /* dst_mask */ - true), /* pcrel_offset */ - - /* 32-bit relocation to the symbol's procedure linkage table. - FIXEME: not supported. */ - HOWTO (R_PPC_PLT32, /* type */ - 0, /* rightshift */ - 2, /* size (0 = byte, 1 = short, 2 = long) */ - 32, /* bitsize */ - false, /* pc_relative */ - 0, /* bitpos */ - complain_overflow_bitfield, /* complain_on_overflow */ - bfd_elf_generic_reloc, /* special_function */ - "R_PPC_PLT32", /* name */ - false, /* partial_inplace */ - 0, /* src_mask */ - 0, /* dst_mask */ - false), /* pcrel_offset */ - - /* 32-bit PC relative relocation to the symbol's procedure linkage table. - FIXEME: not supported. */ - HOWTO (R_PPC_PLTREL32, /* type */ - 0, /* rightshift */ - 2, /* size (0 = byte, 1 = short, 2 = long) */ - 32, /* bitsize */ - true, /* pc_relative */ - 0, /* bitpos */ - complain_overflow_bitfield, /* complain_on_overflow */ - bfd_elf_generic_reloc, /* special_function */ - "R_PPC_PLTREL32", /* name */ - false, /* partial_inplace */ - 0, /* src_mask */ - 0, /* dst_mask */ - true), /* pcrel_offset */ - - /* Like R_PPC_ADDR16_LO, but referring to the PLT table entry for - the symbol. */ - HOWTO (R_PPC_PLT16_LO, /* type */ - 0, /* rightshift */ - 1, /* size (0 = byte, 1 = short, 2 = long) */ - 16, /* bitsize */ - false, /* pc_relative */ - 0, /* bitpos */ - complain_overflow_bitfield, /* complain_on_overflow */ - bfd_elf_generic_reloc, /* special_function */ - "R_PPC_PLT16_LO", /* name */ - false, /* partial_inplace */ - 0, /* src_mask */ - 0xffff, /* dst_mask */ - false), /* pcrel_offset */ - - /* Like R_PPC_ADDR16_HI, but referring to the PLT table entry for - the symbol. */ - HOWTO (R_PPC_PLT16_HI, /* type */ - 16, /* rightshift */ - 1, /* size (0 = byte, 1 = short, 2 = long) */ - 16, /* bitsize */ - false, /* pc_relative */ - 0, /* bitpos */ - complain_overflow_bitfield, /* complain_on_overflow */ - bfd_elf_generic_reloc, /* special_function */ - "R_PPC_PLT16_HI", /* name */ - false, /* partial_inplace */ - 0, /* src_mask */ - 0xffff, /* dst_mask */ - false), /* pcrel_offset */ - - /* Like R_PPC_ADDR16_HA, but referring to the PLT table entry for - the symbol. FIXME: Not supported. */ - HOWTO (R_PPC_PLT16_HA, /* type */ - 0, /* rightshift */ - 1, /* size (0 = byte, 1 = short, 2 = long) */ - 16, /* bitsize */ - false, /* pc_relative */ - 0, /* bitpos */ - complain_overflow_bitfield, /* complain_on_overflow */ - bfd_elf_generic_reloc, /* special_function */ - "R_PPC_PLT16_HA", /* name */ - false, /* partial_inplace */ - 0, /* src_mask */ - 0xffff, /* dst_mask */ - false), /* pcrel_offset */ - - /* A sign-extended 16 bit value relative to _SDA_BASE_, for use with - small data items. */ - HOWTO (R_PPC_SDAREL16, /* type */ - 0, /* rightshift */ - 1, /* size (0 = byte, 1 = short, 2 = long) */ - 16, /* bitsize */ - false, /* pc_relative */ - 0, /* bitpos */ - complain_overflow_signed, /* complain_on_overflow */ - bfd_elf_generic_reloc, /* special_function */ - "R_PPC_SDAREL16", /* name */ - false, /* partial_inplace */ - 0, /* src_mask */ - 0xffff, /* dst_mask */ - false), /* pcrel_offset */ - - /* 32-bit section relative relocation. */ - HOWTO (R_PPC_SECTOFF, /* type */ - 0, /* rightshift */ - 2, /* size (0 = byte, 1 = short, 2 = long) */ - 32, /* bitsize */ - true, /* pc_relative */ - 0, /* bitpos */ - complain_overflow_bitfield, /* complain_on_overflow */ - bfd_elf_generic_reloc, /* special_function */ - "R_PPC_SECTOFF", /* name */ - false, /* partial_inplace */ - 0, /* src_mask */ - 0, /* dst_mask */ - true), /* pcrel_offset */ - - /* 16-bit lower half section relative relocation. */ - HOWTO (R_PPC_SECTOFF_LO, /* type */ - 0, /* rightshift */ - 1, /* size (0 = byte, 1 = short, 2 = long) */ - 16, /* bitsize */ - false, /* pc_relative */ - 0, /* bitpos */ - complain_overflow_bitfield, /* complain_on_overflow */ - bfd_elf_generic_reloc, /* special_function */ - "R_PPC_SECTOFF_LO", /* name */ - false, /* partial_inplace */ - 0, /* src_mask */ - 0xffff, /* dst_mask */ - false), /* pcrel_offset */ - - /* 16-bit upper half section relative relocation. */ - HOWTO (R_PPC_SECTOFF_HI, /* type */ - 16, /* rightshift */ - 1, /* size (0 = byte, 1 = short, 2 = long) */ - 16, /* bitsize */ - false, /* pc_relative */ - 0, /* bitpos */ - complain_overflow_bitfield, /* complain_on_overflow */ - bfd_elf_generic_reloc, /* special_function */ - "R_PPC_SECTOFF_HI", /* name */ - false, /* partial_inplace */ - 0, /* src_mask */ - 0xffff, /* dst_mask */ - false), /* pcrel_offset */ - - /* 16-bit upper half adjusted section relative relocation. */ - HOWTO (R_PPC_SECTOFF_HA, /* type */ - 0, /* rightshift */ - 1, /* size (0 = byte, 1 = short, 2 = long) */ - 16, /* bitsize */ - false, /* pc_relative */ - 0, /* bitpos */ - complain_overflow_bitfield, /* complain_on_overflow */ - bfd_elf_generic_reloc, /* special_function */ - "R_PPC_SECTOFF_HA", /* name */ - false, /* partial_inplace */ - 0, /* src_mask */ - 0xffff, /* dst_mask */ - false), /* pcrel_offset */ - - /* The remaining relocs are from the Embedded ELF ABI, and are not - in the SVR4 ELF ABI. */ - - /* 32 bit value resulting from the addend minus the symbol */ - HOWTO (R_PPC_EMB_NADDR32, /* type */ - 0, /* rightshift */ - 2, /* size (0 = byte, 1 = short, 2 = long) */ - 32, /* bitsize */ - false, /* pc_relative */ - 0, /* bitpos */ - complain_overflow_bitfield, /* complain_on_overflow */ - bfd_elf_generic_reloc, /* special_function */ - "R_PPC_EMB_NADDR32", /* name */ - false, /* partial_inplace */ - 0, /* src_mask */ - 0xffffffff, /* dst_mask */ - false), /* pcrel_offset */ - - /* 16 bit value resulting from the addend minus the symbol */ - HOWTO (R_PPC_EMB_NADDR16, /* type */ - 0, /* rightshift */ - 1, /* size (0 = byte, 1 = short, 2 = long) */ - 16, /* bitsize */ - false, /* pc_relative */ - 0, /* bitpos */ - complain_overflow_bitfield, /* complain_on_overflow */ - bfd_elf_generic_reloc, /* special_function */ - "R_PPC_EMB_NADDR16", /* name */ - false, /* partial_inplace */ - 0, /* src_mask */ - 0xffff, /* dst_mask */ - false), /* pcrel_offset */ - - /* 16 bit value resulting from the addend minus the symbol */ - HOWTO (R_PPC_EMB_NADDR16_LO, /* type */ - 0, /* rightshift */ - 1, /* size (0 = byte, 1 = short, 2 = long) */ - 16, /* bitsize */ - false, /* pc_relative */ - 0, /* bitpos */ - complain_overflow_dont,/* complain_on_overflow */ - bfd_elf_generic_reloc, /* special_function */ - "R_PPC_EMB_ADDR16_LO", /* name */ - false, /* partial_inplace */ - 0, /* src_mask */ - 0xffff, /* dst_mask */ - false), /* pcrel_offset */ - - /* The high order 16 bits of the addend minus the symbol */ - HOWTO (R_PPC_EMB_NADDR16_HI, /* type */ - 16, /* rightshift */ - 1, /* size (0 = byte, 1 = short, 2 = long) */ - 16, /* bitsize */ - false, /* pc_relative */ - 0, /* bitpos */ - complain_overflow_dont, /* complain_on_overflow */ - bfd_elf_generic_reloc, /* special_function */ - "R_PPC_EMB_NADDR16_HI", /* name */ - false, /* partial_inplace */ - 0, /* src_mask */ - 0xffff, /* dst_mask */ - false), /* pcrel_offset */ - - /* The high order 16 bits of the result of the addend minus the address, - plus 1 if the contents of the low 16 bits, treated as a signed number, - is negative. */ - HOWTO (R_PPC_EMB_NADDR16_HA, /* type */ - 16, /* rightshift */ - 1, /* size (0 = byte, 1 = short, 2 = long) */ - 16, /* bitsize */ - false, /* pc_relative */ - 0, /* bitpos */ - complain_overflow_dont, /* complain_on_overflow */ - bfd_elf_generic_reloc, /* special_function */ - "R_PPC_EMB_NADDR16_HA", /* name */ - false, /* partial_inplace */ - 0, /* src_mask */ - 0xffff, /* dst_mask */ - false), /* pcrel_offset */ - - /* 16 bit value resulting from allocating a 4 byte word to hold an - address in the .sdata section, and returning the offset from - _SDA_BASE_ for that relocation */ - HOWTO (R_PPC_EMB_SDAI16, /* type */ - 0, /* rightshift */ - 1, /* size (0 = byte, 1 = short, 2 = long) */ - 16, /* bitsize */ - false, /* pc_relative */ - 0, /* bitpos */ - complain_overflow_bitfield, /* complain_on_overflow */ - bfd_elf_generic_reloc, /* special_function */ - "R_PPC_EMB_SDAI16", /* name */ - false, /* partial_inplace */ - 0, /* src_mask */ - 0xffff, /* dst_mask */ - false), /* pcrel_offset */ - - /* 16 bit value resulting from allocating a 4 byte word to hold an - address in the .sdata2 section, and returning the offset from - _SDA2_BASE_ for that relocation */ - HOWTO (R_PPC_EMB_SDA2I16, /* type */ - 0, /* rightshift */ - 1, /* size (0 = byte, 1 = short, 2 = long) */ - 16, /* bitsize */ - false, /* pc_relative */ - 0, /* bitpos */ - complain_overflow_bitfield, /* complain_on_overflow */ - bfd_elf_generic_reloc, /* special_function */ - "R_PPC_EMB_SDA2I16", /* name */ - false, /* partial_inplace */ - 0, /* src_mask */ - 0xffff, /* dst_mask */ - false), /* pcrel_offset */ - - /* A sign-extended 16 bit value relative to _SDA2_BASE_, for use with - small data items. */ - HOWTO (R_PPC_EMB_SDA2REL, /* type */ - 0, /* rightshift */ - 1, /* size (0 = byte, 1 = short, 2 = long) */ - 16, /* bitsize */ - false, /* pc_relative */ - 0, /* bitpos */ - complain_overflow_signed, /* complain_on_overflow */ - bfd_elf_generic_reloc, /* special_function */ - "R_PPC_EMB_SDA2REL", /* name */ - false, /* partial_inplace */ - 0, /* src_mask */ - 0xffff, /* dst_mask */ - false), /* pcrel_offset */ - - /* Relocate against either _SDA_BASE_ or _SDA2_BASE_, filling in the 16 bit - signed offset from the appropriate base, and filling in the register - field with the appropriate register (0, 2, or 13). */ - HOWTO (R_PPC_EMB_SDA21, /* type */ - 0, /* rightshift */ - 2, /* size (0 = byte, 1 = short, 2 = long) */ - 16, /* bitsize */ - false, /* pc_relative */ - 0, /* bitpos */ - complain_overflow_signed, /* complain_on_overflow */ - bfd_elf_generic_reloc, /* special_function */ - "R_PPC_EMB_SDA21", /* name */ - false, /* partial_inplace */ - 0, /* src_mask */ - 0xffff, /* dst_mask */ - false), /* pcrel_offset */ - - /* Relocation not handled: R_PPC_EMB_MRKREF */ - /* Relocation not handled: R_PPC_EMB_RELSEC16 */ - /* Relocation not handled: R_PPC_EMB_RELST_LO */ - /* Relocation not handled: R_PPC_EMB_RELST_HI */ - /* Relocation not handled: R_PPC_EMB_RELST_HA */ - /* Relocation not handled: R_PPC_EMB_BIT_FLD */ - - /* PC relative relocation against either _SDA_BASE_ or _SDA2_BASE_, filling - in the 16 bit signed offset from the appropriate base, and filling in the - register field with the appropriate register (0, 2, or 13). */ - HOWTO (R_PPC_EMB_RELSDA, /* type */ - 0, /* rightshift */ - 1, /* size (0 = byte, 1 = short, 2 = long) */ - 16, /* bitsize */ - true, /* pc_relative */ - 0, /* bitpos */ - complain_overflow_signed, /* complain_on_overflow */ - bfd_elf_generic_reloc, /* special_function */ - "R_PPC_EMB_RELSDA", /* name */ - false, /* partial_inplace */ - 0, /* src_mask */ - 0xffff, /* dst_mask */ - false), /* pcrel_offset */ - - /* Phony reloc to handle AIX style TOC entries */ - HOWTO (R_PPC_TOC16, /* type */ - 0, /* rightshift */ - 1, /* size (0 = byte, 1 = short, 2 = long) */ - 16, /* bitsize */ - false, /* pc_relative */ - 0, /* bitpos */ - complain_overflow_signed, /* complain_on_overflow */ - bfd_elf_generic_reloc, /* special_function */ - "R_PPC_TOC16", /* name */ - false, /* partial_inplace */ - 0, /* src_mask */ - 0xffff, /* dst_mask */ - false), /* pcrel_offset */ -}; - - -/* Initialize the ppc_elf_howto_table, so that linear accesses can be done. */ - -static void -ppc_elf_howto_init () -{ - unsigned int i, type; - - for (i = 0; i < sizeof (ppc_elf_howto_raw) / sizeof (ppc_elf_howto_raw[0]); i++) - { - type = ppc_elf_howto_raw[i].type; - BFD_ASSERT (type < sizeof(ppc_elf_howto_table) / sizeof(ppc_elf_howto_table[0])); - ppc_elf_howto_table[type] = &ppc_elf_howto_raw[i]; - } -} - - -static reloc_howto_type * -ppc_elf_reloc_type_lookup (abfd, code) - bfd *abfd; - bfd_reloc_code_real_type code; -{ - enum ppc_reloc_type ppc_reloc = R_PPC_NONE; - - if (!ppc_elf_howto_table[ R_PPC_ADDR32 ]) /* Initialize howto table if needed */ - ppc_elf_howto_init (); - - switch ((int)code) - { - default: - return (reloc_howto_type *)NULL; - - case BFD_RELOC_NONE: ppc_reloc = R_PPC_NONE; break; - case BFD_RELOC_32: ppc_reloc = R_PPC_ADDR32; break; - case BFD_RELOC_PPC_BA26: ppc_reloc = R_PPC_ADDR24; break; - case BFD_RELOC_16: ppc_reloc = R_PPC_ADDR16; break; - case BFD_RELOC_LO16: ppc_reloc = R_PPC_ADDR16_LO; break; - case BFD_RELOC_HI16: ppc_reloc = R_PPC_ADDR16_HI; break; - case BFD_RELOC_HI16_S: ppc_reloc = R_PPC_ADDR16_HA; break; - case BFD_RELOC_PPC_BA16: ppc_reloc = R_PPC_ADDR14; break; - case BFD_RELOC_PPC_BA16_BRTAKEN: ppc_reloc = R_PPC_ADDR14_BRTAKEN; break; - case BFD_RELOC_PPC_BA16_BRNTAKEN: ppc_reloc = R_PPC_ADDR14_BRNTAKEN; break; - case BFD_RELOC_PPC_B26: ppc_reloc = R_PPC_REL24; break; - case BFD_RELOC_PPC_B16: ppc_reloc = R_PPC_REL14; break; - case BFD_RELOC_PPC_B16_BRTAKEN: ppc_reloc = R_PPC_REL14_BRTAKEN; break; - case BFD_RELOC_PPC_B16_BRNTAKEN: ppc_reloc = R_PPC_REL14_BRNTAKEN; break; - case BFD_RELOC_16_GOTOFF: ppc_reloc = R_PPC_GOT16; break; - case BFD_RELOC_LO16_GOTOFF: ppc_reloc = R_PPC_GOT16_LO; break; - case BFD_RELOC_HI16_GOTOFF: ppc_reloc = R_PPC_GOT16_HI; break; - case BFD_RELOC_HI16_S_GOTOFF: ppc_reloc = R_PPC_GOT16_HA; break; - case BFD_RELOC_24_PLT_PCREL: ppc_reloc = R_PPC_PLTREL24; break; - case BFD_RELOC_PPC_COPY: ppc_reloc = R_PPC_COPY; break; - case BFD_RELOC_PPC_GLOB_DAT: ppc_reloc = R_PPC_GLOB_DAT; break; - case BFD_RELOC_PPC_LOCAL24PC: ppc_reloc = R_PPC_LOCAL24PC; break; - case BFD_RELOC_32_PCREL: ppc_reloc = R_PPC_REL32; break; - case BFD_RELOC_32_PLTOFF: ppc_reloc = R_PPC_PLT32; break; - case BFD_RELOC_32_PLT_PCREL: ppc_reloc = R_PPC_PLTREL32; break; - case BFD_RELOC_LO16_PLTOFF: ppc_reloc = R_PPC_PLT16_LO; break; - case BFD_RELOC_HI16_PLTOFF: ppc_reloc = R_PPC_PLT16_HI; break; - case BFD_RELOC_HI16_S_PLTOFF: ppc_reloc = R_PPC_PLT16_HA; break; - case BFD_RELOC_GPREL16: ppc_reloc = R_PPC_SDAREL16; break; - case BFD_RELOC_32_BASEREL: ppc_reloc = R_PPC_SECTOFF; break; - case BFD_RELOC_LO16_BASEREL: ppc_reloc = R_PPC_SECTOFF_LO; break; - case BFD_RELOC_HI16_BASEREL: ppc_reloc = R_PPC_SECTOFF_HI; break; - case BFD_RELOC_HI16_S_BASEREL: ppc_reloc = R_PPC_SECTOFF_HA; break; - case BFD_RELOC_CTOR: ppc_reloc = R_PPC_ADDR32; break; - case BFD_RELOC_PPC_TOC16: ppc_reloc = R_PPC_TOC16; break; - case BFD_RELOC_PPC_EMB_NADDR32: ppc_reloc = R_PPC_EMB_NADDR32; break; - case BFD_RELOC_PPC_EMB_NADDR16: ppc_reloc = R_PPC_EMB_NADDR16; break; - case BFD_RELOC_PPC_EMB_NADDR16_LO: ppc_reloc = R_PPC_EMB_NADDR16_LO; break; - case BFD_RELOC_PPC_EMB_NADDR16_HI: ppc_reloc = R_PPC_EMB_NADDR16_HI; break; - case BFD_RELOC_PPC_EMB_NADDR16_HA: ppc_reloc = R_PPC_EMB_NADDR16_HA; break; - case BFD_RELOC_PPC_EMB_SDAI16: ppc_reloc = R_PPC_EMB_SDAI16; break; - case BFD_RELOC_PPC_EMB_SDA2I16: ppc_reloc = R_PPC_EMB_SDA2I16; break; - case BFD_RELOC_PPC_EMB_SDA2REL: ppc_reloc = R_PPC_EMB_SDA2REL; break; - case BFD_RELOC_PPC_EMB_SDA21: ppc_reloc = R_PPC_EMB_SDA21; break; - case BFD_RELOC_PPC_EMB_MRKREF: ppc_reloc = R_PPC_EMB_MRKREF; break; - case BFD_RELOC_PPC_EMB_RELSEC16: ppc_reloc = R_PPC_EMB_RELSEC16; break; - case BFD_RELOC_PPC_EMB_RELST_LO: ppc_reloc = R_PPC_EMB_RELST_LO; break; - case BFD_RELOC_PPC_EMB_RELST_HI: ppc_reloc = R_PPC_EMB_RELST_HI; break; - case BFD_RELOC_PPC_EMB_RELST_HA: ppc_reloc = R_PPC_EMB_RELST_HA; break; - case BFD_RELOC_PPC_EMB_BIT_FLD: ppc_reloc = R_PPC_EMB_BIT_FLD; break; - case BFD_RELOC_PPC_EMB_RELSDA: ppc_reloc = R_PPC_EMB_RELSDA; break; - } - - return ppc_elf_howto_table[ (int)ppc_reloc ]; -}; - -/* Set the howto pointer for a PowerPC ELF reloc. */ - -static void -ppc_elf_info_to_howto (abfd, cache_ptr, dst) - bfd *abfd; - arelent *cache_ptr; - Elf32_Internal_Rela *dst; -{ - if (!ppc_elf_howto_table[ R_PPC_ADDR32 ]) /* Initialize howto table if needed */ - ppc_elf_howto_init (); - - BFD_ASSERT (ELF32_R_TYPE (dst->r_info) < (unsigned int) R_PPC_max); - cache_ptr->howto = ppc_elf_howto_table[ELF32_R_TYPE (dst->r_info)]; -} - -/* Function to set whether a module needs the -mrelocatable bit set. */ - -static boolean -ppc_elf_set_private_flags (abfd, flags) - bfd *abfd; - flagword flags; -{ - BFD_ASSERT (!elf_flags_init (abfd) - || elf_elfheader (abfd)->e_flags == flags); - - elf_elfheader (abfd)->e_flags = flags; - elf_flags_init (abfd) = true; - return true; -} - -/* Copy backend specific data from one object module to another */ -static boolean -ppc_elf_copy_private_bfd_data (ibfd, obfd) - bfd *ibfd; - bfd *obfd; -{ - /* This function is selected based on the input vector. We only - want to copy information over if the output BFD also uses Elf - format. */ - if (bfd_get_flavour (obfd) != bfd_target_elf_flavour) - return true; - - BFD_ASSERT (!elf_flags_init (obfd) - || elf_elfheader (obfd)->e_flags == elf_elfheader (ibfd)->e_flags); - - elf_elfheader (obfd)->e_flags = elf_elfheader (ibfd)->e_flags; - elf_flags_init (obfd) = true; - return true; -} - -/* Merge backend specific data from an object file to the output - object file when linking */ -static boolean -ppc_elf_merge_private_bfd_data (ibfd, obfd) - bfd *ibfd; - bfd *obfd; -{ - flagword old_flags; - flagword new_flags; - boolean error; - - /* Check if we have the same endianess */ - if (ibfd->xvec->byteorder != obfd->xvec->byteorder - && obfd->xvec->byteorder != BFD_ENDIAN_UNKNOWN) - { - (*_bfd_error_handler) - ("%s: compiled for a %s endian system and target is %s endian", - bfd_get_filename (ibfd), - bfd_big_endian (ibfd) ? "big" : "little", - bfd_big_endian (obfd) ? "big" : "little"); - - bfd_set_error (bfd_error_wrong_format); - return false; - } - - /* This function is selected based on the input vector. We only - want to copy information over if the output BFD also uses Elf - format. */ - if (bfd_get_flavour (obfd) != bfd_target_elf_flavour) - return true; - - new_flags = elf_elfheader (ibfd)->e_flags; - old_flags = elf_elfheader (obfd)->e_flags; - if (!elf_flags_init (obfd)) /* First call, no flags set */ - { - elf_flags_init (obfd) = true; - elf_elfheader (obfd)->e_flags = new_flags; - } - - else if (new_flags == old_flags) /* Compatible flags are ok */ - ; - - else /* Incompatible flags */ - { - /* Warn about -mrelocatable mismatch. Allow -mrelocatable-lib to be linked - with either. */ - error = false; - if ((new_flags & EF_PPC_RELOCATABLE) != 0 - && (old_flags & (EF_PPC_RELOCATABLE | EF_PPC_RELOCATABLE_LIB)) == 0) - { - error = true; - (*_bfd_error_handler) - ("%s: compiled with -mrelocatable and linked with modules compiled normally", - bfd_get_filename (ibfd)); - } - else if ((new_flags & (EF_PPC_RELOCATABLE | EF_PPC_RELOCATABLE_LIB)) == 0 - && (old_flags & EF_PPC_RELOCATABLE) != 0) - { - error = true; - (*_bfd_error_handler) - ("%s: compiled normally and linked with modules compiled with -mrelocatable", - bfd_get_filename (ibfd)); - } - else if ((new_flags & EF_PPC_RELOCATABLE_LIB) != 0) - elf_elfheader (obfd)->e_flags |= EF_PPC_RELOCATABLE_LIB; - - - /* Do not warn about eabi vs. V.4 mismatch, just or in the bit if any module uses it */ - elf_elfheader (obfd)->e_flags |= (new_flags & EF_PPC_EMB); - - new_flags &= ~ (EF_PPC_RELOCATABLE | EF_PPC_RELOCATABLE_LIB | EF_PPC_EMB); - old_flags &= ~ (EF_PPC_RELOCATABLE | EF_PPC_RELOCATABLE_LIB | EF_PPC_EMB); - - /* Warn about any other mismatches */ - if (new_flags != old_flags) - { - error = true; - (*_bfd_error_handler) - ("%s: uses different e_flags (0x%lx) fields than previous modules (0x%lx)", - bfd_get_filename (ibfd), (long)new_flags, (long)old_flags); - } - - if (error) - { - bfd_set_error (bfd_error_bad_value); - return false; - } - } - - return true; -} - - -/* Handle a PowerPC specific section when reading an object file. This - is called when elfcode.h finds a section with an unknown type. */ - -static boolean -ppc_elf_section_from_shdr (abfd, hdr, name) - bfd *abfd; - Elf32_Internal_Shdr *hdr; - char *name; -{ - asection *newsect; - flagword flags; - - if (! _bfd_elf_make_section_from_shdr (abfd, hdr, name)) - return false; - - newsect = hdr->bfd_section; - flags = bfd_get_section_flags (abfd, newsect); - if (hdr->sh_flags & SHF_EXCLUDE) - flags |= SEC_EXCLUDE; - - if (hdr->sh_type == SHT_ORDERED) - flags |= SEC_SORT_ENTRIES; - - bfd_set_section_flags (abfd, newsect, flags); - return true; -} - - -/* Set up any other section flags and such that may be necessary. */ - -boolean -ppc_elf_fake_sections (abfd, shdr, asect) - bfd *abfd; - Elf32_Internal_Shdr *shdr; - asection *asect; -{ - if ((asect->flags & SEC_EXCLUDE) != 0) - shdr->sh_flags |= SHF_EXCLUDE; - - if ((asect->flags & SEC_SORT_ENTRIES) != 0) - shdr->sh_type = SHT_ORDERED; -} - - -/* Create a special linker section */ -static elf_linker_section_t * -ppc_elf_create_linker_section (abfd, info, which) - bfd *abfd; - struct bfd_link_info *info; - enum elf_linker_section_enum which; -{ - bfd *dynobj = elf_hash_table (info)->dynobj; - elf_linker_section_t *lsect; - - /* Record the first bfd section that needs the special section */ - if (!dynobj) - dynobj = elf_hash_table (info)->dynobj = abfd; - - /* If this is the first time, create the section */ - lsect = elf_linker_section (dynobj, which); - if (!lsect) - { - elf_linker_section_t defaults; - static elf_linker_section_t zero_section; - - defaults = zero_section; - defaults.which = which; - defaults.hole_written_p = false; - defaults.alignment = 2; - defaults.flags = SEC_ALLOC | SEC_LOAD | SEC_HAS_CONTENTS | SEC_IN_MEMORY; - - switch (which) - { - default: - (*_bfd_error_handler) ("%s: Unknown special linker type %d", - bfd_get_filename (abfd), - (int)which); - - bfd_set_error (bfd_error_bad_value); - return (elf_linker_section_t *)0; - - case LINKER_SECTION_GOT: /* .got section */ - defaults.name = ".got"; - defaults.rel_name = ".rela.got"; - defaults.sym_name = "_GLOBAL_OFFSET_TABLE_"; - defaults.max_hole_offset = 32764; - defaults.hole_size = 16; - defaults.sym_offset = 4; - break; - - case LINKER_SECTION_SDATA: /* .sdata/.sbss section */ - defaults.name = ".sdata"; - defaults.rel_name = ".rela.sdata"; - defaults.bss_name = ".sbss"; - defaults.sym_name = "_SDA_BASE_"; - defaults.sym_offset = 32768; - break; - - case LINKER_SECTION_SDATA2: /* .sdata2/.sbss2 section */ - defaults.name = ".sdata2"; - defaults.rel_name = ".rela.sdata2"; - defaults.bss_name = ".sbss2"; - defaults.sym_name = "_SDA2_BASE_"; - defaults.sym_offset = 32768; - defaults.flags |= SEC_READONLY; - break; - } - - lsect = _bfd_elf_create_linker_section (abfd, info, which, &defaults); - } - - return lsect; -} - - -/* If we have a non-zero sized .sbss2 or .PPC.EMB.sbss0 sections, we need to bump up - the number of section headers. */ - -static int -ppc_elf_additional_program_headers (abfd) - bfd *abfd; -{ - asection *s; - int ret; - - ret = 0; - - s = bfd_get_section_by_name (abfd, ".sbss2"); - if (s != NULL && (s->flags & SEC_LOAD) != 0 && s->_raw_size > 0) - ++ret; - - s = bfd_get_section_by_name (abfd, ".PPC.EMB.sbss0"); - if (s != NULL && (s->flags & SEC_LOAD) != 0 && s->_raw_size > 0) - ++ret; - - return ret; -} - -/* Modify the segment map if needed */ - -static boolean -ppc_elf_modify_segment_map (abfd) - bfd *abfd; -{ - return true; -} - -/* Adjust a symbol defined by a dynamic object and referenced by a - regular object. The current definition is in some section of the - dynamic object, but we're not including those sections. We have to - change the definition to something the rest of the link can - understand. */ - -static boolean -ppc_elf_adjust_dynamic_symbol (info, h) - struct bfd_link_info *info; - struct elf_link_hash_entry *h; -{ -#ifdef DEBUG - fprintf (stderr, "ppc_elf_adjust_dynamic_symbol called\n"); -#endif - return true; -} - - -/* Increment the index of a dynamic symbol by a given amount. Called - via elf_link_hash_traverse. */ - -static boolean -ppc_elf_adjust_dynindx (h, cparg) - struct elf_link_hash_entry *h; - PTR cparg; -{ - int *cp = (int *) cparg; - -#ifdef DEBUG - fprintf (stderr, "ppc_elf_adjust_dynindx called, h->dynindx = %d, *cp = %d\n", h->dynindx, *cp); -#endif - - if (h->dynindx != -1) - h->dynindx += *cp; - - return true; -} - - -/* Set the sizes of the dynamic sections. */ - -static boolean -ppc_elf_size_dynamic_sections (output_bfd, info) - bfd *output_bfd; - struct bfd_link_info *info; -{ - bfd *dynobj; - asection *s; - boolean reltext; - boolean relplt; - -#ifdef DEBUG - fprintf (stderr, "ppc_elf_size_dynamic_sections called\n"); -#endif - - dynobj = elf_hash_table (info)->dynobj; - BFD_ASSERT (dynobj != NULL); - - if (elf_hash_table (info)->dynamic_sections_created) - { - /* Set the contents of the .interp section to the interpreter. */ - if (! info->shared) - { - s = bfd_get_section_by_name (dynobj, ".interp"); - BFD_ASSERT (s != NULL); - s->_raw_size = sizeof ELF_DYNAMIC_INTERPRETER; - s->contents = (unsigned char *) ELF_DYNAMIC_INTERPRETER; - } - - /* Make space for the trailing nop in .plt. */ - s = bfd_get_section_by_name (dynobj, ".plt"); - BFD_ASSERT (s != NULL); - if (s->_raw_size > 0) - s->_raw_size += 4; - } - else - { - /* We may have created entries in the .rela.got, .rela.sdata, and - .rela.sdata2 section2. However, if we are not creating the - dynamic sections, we will not actually use these entries. Reset - the size of .rela.got, et al, which will cause it to get - stripped from the output file below. */ - static char *rela_sections[] = { ".rela.got", ".rela.sdata", ".rela.sdata", (char *)0 }; - char **p; - - for (p = rela_sections; *p != (char *)0; p++) - { - s = bfd_get_section_by_name (dynobj, *p); - if (s != NULL) - s->_raw_size = 0; - } - } - - /* The check_relocs and adjust_dynamic_symbol entry points have - determined the sizes of the various dynamic sections. Allocate - memory for them. */ - reltext = false; - relplt = false; - for (s = dynobj->sections; s != NULL; s = s->next) - { - const char *name; - boolean strip; - - if ((s->flags & SEC_IN_MEMORY) == 0) - continue; - - /* It's OK to base decisions on the section name, because none - of the dynobj section names depend upon the input files. */ - name = bfd_get_section_name (dynobj, s); - - strip = false; - -#if 0 - if (strncmp (name, ".rela", 5) == 0) - { - if (s->_raw_size == 0) - { - /* If we don't need this section, strip it from the - output file. This is to handle .rela.bss and - .rel.plt. We must create it in - create_dynamic_sections, because it must be created - before the linker maps input sections to output - sections. The linker does that before - adjust_dynamic_symbol is called, and it is that - function which decides whether anything needs to go - into these sections. */ - strip = true; - } - else - { - asection *target; - - /* If this relocation section applies to a read only - section, then we probably need a DT_TEXTREL entry. */ - target = bfd_get_section_by_name (output_bfd, name + 5); - if (target != NULL - && (target->flags & SEC_READONLY) != 0) - reltext = true; - - if (strcmp (name, ".rela.plt") == 0) - relplt = true; - - /* We use the reloc_count field as a counter if we need - to copy relocs into the output file. */ - s->reloc_count = 0; - } - } - else -#endif - if (strcmp (name, ".plt") != 0 - && strcmp (name, ".got") != 0 - && strcmp (name, ".sdata") != 0 - && strcmp (name, ".sdata2") != 0 - && strcmp (name, ".rela.sdata") != 0 - && strcmp (name, ".rela.sdata2") != 0) - { - /* It's not one of our sections, so don't allocate space. */ - continue; - } - - if (strip) - { - asection **spp; - - for (spp = &s->output_section->owner->sections; - *spp != s->output_section; - spp = &(*spp)->next) - ; - *spp = s->output_section->next; - --s->output_section->owner->section_count; - - continue; - } - - /* Allocate memory for the section contents. */ - s->contents = (bfd_byte *) bfd_zalloc (dynobj, s->_raw_size); - if (s->contents == NULL && s->_raw_size != 0) - return false; - } - - if (elf_hash_table (info)->dynamic_sections_created) - { - /* Add some entries to the .dynamic section. We fill in the - values later, in ppc_elf_finish_dynamic_sections, but we - must add the entries now so that we get the correct size for - the .dynamic section. The DT_DEBUG entry is filled in by the - dynamic linker and used by the debugger. */ - if (! info->shared) - { - if (! bfd_elf32_add_dynamic_entry (info, DT_DEBUG, 0)) - return false; - } - - if (! bfd_elf32_add_dynamic_entry (info, DT_PLTGOT, 0)) - return false; - - if (relplt) - { - if (! bfd_elf32_add_dynamic_entry (info, DT_PLTRELSZ, 0) - || ! bfd_elf32_add_dynamic_entry (info, DT_PLTREL, DT_RELA) - || ! bfd_elf32_add_dynamic_entry (info, DT_JMPREL, 0)) - return false; - } - - if (! bfd_elf32_add_dynamic_entry (info, DT_RELA, 0) - || ! bfd_elf32_add_dynamic_entry (info, DT_RELASZ, 0) - || ! bfd_elf32_add_dynamic_entry (info, DT_RELAENT, - sizeof (Elf32_External_Rela))) - return false; - - if (reltext) - { - if (! bfd_elf32_add_dynamic_entry (info, DT_TEXTREL, 0)) - return false; - } - } - - /* If we are generating a shared library, we generate a section - symbol for each output section. These are local symbols, which - means that they must come first in the dynamic symbol table. - That means we must increment the dynamic symbol index of every - other dynamic symbol. */ - if (info->shared) - { - int c, i; - - c = bfd_count_sections (output_bfd); - elf_link_hash_traverse (elf_hash_table (info), - ppc_elf_adjust_dynindx, - (PTR) &c); - elf_hash_table (info)->dynsymcount += c; - - for (i = 1, s = output_bfd->sections; s != NULL; s = s->next, i++) - { - elf_section_data (s)->dynindx = i; - /* These symbols will have no names, so we don't need to - fiddle with dynstr_index. */ - } - } - - return true; -} - - -/* Look through the relocs for a section during the first phase, and - allocate space in the global offset table or procedure linkage - table. */ - -static boolean -ppc_elf_check_relocs (abfd, info, sec, relocs) - bfd *abfd; - struct bfd_link_info *info; - asection *sec; - const Elf_Internal_Rela *relocs; -{ - bfd *dynobj; - Elf_Internal_Shdr *symtab_hdr; - struct elf_link_hash_entry **sym_hashes; - const Elf_Internal_Rela *rel; - const Elf_Internal_Rela *rel_end; - elf_linker_section_t *got; - elf_linker_section_t *sdata; - elf_linker_section_t *sdata2; - asection *sreloc; - - if (info->relocateable) - return true; - -#ifdef DEBUG - fprintf (stderr, "ppc_elf_check_relocs called for section %s\n", - bfd_get_section_name (abfd, sec)); -#endif - - /* Create the linker generated sections all the time so that the special - symbols are created. */ - if ((got = elf_linker_section (abfd, LINKER_SECTION_GOT)) == NULL) - { - got = ppc_elf_create_linker_section (abfd, info, LINKER_SECTION_GOT); - if (!got) - return false; - } - - if ((sdata = elf_linker_section (abfd, LINKER_SECTION_SDATA)) == NULL) - { - sdata = ppc_elf_create_linker_section (abfd, info, LINKER_SECTION_SDATA); - if (!sdata) - return false; - } - - - if ((sdata2 = elf_linker_section (abfd, LINKER_SECTION_SDATA2)) == NULL) - { - sdata2 = ppc_elf_create_linker_section (abfd, info, LINKER_SECTION_SDATA2); - if (!sdata2) - return false; - } - - dynobj = elf_hash_table (info)->dynobj; - symtab_hdr = &elf_tdata (abfd)->symtab_hdr; - sym_hashes = elf_sym_hashes (abfd); - - sreloc = NULL; - - rel_end = relocs + sec->reloc_count; - for (rel = relocs; rel < rel_end; rel++) - { - unsigned long r_symndx; - struct elf_link_hash_entry *h; - - r_symndx = ELF32_R_SYM (rel->r_info); - if (r_symndx < symtab_hdr->sh_info) - h = NULL; - else - h = sym_hashes[r_symndx - symtab_hdr->sh_info]; - - switch (ELF32_R_TYPE (rel->r_info)) - { - default: - break; - - /* GOT16 relocations */ - case R_PPC_GOT16: - case R_PPC_GOT16_LO: - case R_PPC_GOT16_HI: - case R_PPC_GOT16_HA: - if (got->rel_section == NULL - && (h != NULL || info->shared) - && !_bfd_elf_make_linker_section_rela (dynobj, got, 2)) - return false; - - if (!bfd_elf32_create_pointer_linker_section (abfd, info, got, h, rel)) - return false; - - break; - - /* Indirect .sdata relocation */ - case R_PPC_EMB_SDAI16: - if (got->rel_section == NULL - && (h != NULL || info->shared) - && !_bfd_elf_make_linker_section_rela (dynobj, got, 2)) - return false; - - if (!bfd_elf32_create_pointer_linker_section (abfd, info, sdata, h, rel)) - return false; - - break; - - /* Indirect .sdata2 relocation */ - case R_PPC_EMB_SDA2I16: - if (got->rel_section == NULL - && (h != NULL || info->shared) - && !_bfd_elf_make_linker_section_rela (dynobj, got, 2)) - return false; - - if (!bfd_elf32_create_pointer_linker_section (abfd, info, sdata2, h, rel)) - return false; - - break; - -#if 0 - case R_PPC_PLT32: - case R_PPC_PLTREL24: - case R_PPC_PLT16_LO: - case R_PPC_PLT16_HI: - case R_PPC_PLT16_HA: -#ifdef DEBUG - fprintf (stderr, "Reloc requires a PLT entry\n"); -#endif - /* This symbol requires a procedure linkage table entry. We - actually build the entry in adjust_dynamic_symbol, - because this might be a case of linking PIC code without - linking in any dynamic objects, in which case we don't - need to generate a procedure linkage table after all. */ - - if (h == NULL) - { - /* It does not make sense to have a procedure linkage - table entry for a local symbol. */ - bfd_set_error (bfd_error_bad_value); - return false; - } - - /* Make sure this symbol is output as a dynamic symbol. */ - if (h->dynindx == -1) - { - if (! bfd_elf32_link_record_dynamic_symbol (info, h)) - return false; - } - - h->elf_link_hash_flags |= ELF_LINK_HASH_NEEDS_PLT; - break; - - case R_SPARC_PC10: - case R_SPARC_PC22: - if (h != NULL - && strcmp (h->root.root.string, "_GLOBAL_OFFSET_TABLE_") == 0) - break; - /* Fall through. */ - case R_SPARC_DISP8: - case R_SPARC_DISP16: - case R_SPARC_DISP32: - case R_SPARC_WDISP30: - case R_SPARC_WDISP22: - if (h == NULL) - break; - /* Fall through. */ - case R_SPARC_8: - case R_SPARC_16: - case R_SPARC_32: - case R_SPARC_HI22: - case R_SPARC_22: - case R_SPARC_13: - case R_SPARC_LO10: - case R_SPARC_UA32: - if (info->shared - && (sec->flags & SEC_ALLOC) != 0) - { - /* When creating a shared object, we must copy these - relocs into the output file. We create a reloc - section in dynobj and make room for the reloc. */ - if (sreloc == NULL) - { - const char *name; - - name = (bfd_elf_string_from_elf_section - (abfd, - elf_elfheader (abfd)->e_shstrndx, - elf_section_data (sec)->rel_hdr.sh_name)); - if (name == NULL) - return false; - - BFD_ASSERT (strncmp (name, ".rela", 5) == 0 - && strcmp (bfd_get_section_name (abfd, sec), - name + 5) == 0); - - sreloc = bfd_get_section_by_name (dynobj, name); - if (sreloc == NULL) - { - sreloc = bfd_make_section (dynobj, name); - if (sreloc == NULL - || ! bfd_set_section_flags (dynobj, sreloc, - (SEC_ALLOC - | SEC_LOAD - | SEC_HAS_CONTENTS - | SEC_IN_MEMORY - | SEC_READONLY)) - || ! bfd_set_section_alignment (dynobj, sreloc, 2)) - return false; - } - } - - sreloc->_raw_size += sizeof (Elf32_External_Rela); - } - - break; -#endif - } - } - - return true; -} - - -/* Hook called by the linker routine which adds symbols from an object - file. We use it to put .comm items in .sbss, and not .bss. */ - -/*ARGSUSED*/ -static boolean -ppc_elf_add_symbol_hook (abfd, info, sym, namep, flagsp, secp, valp) - bfd *abfd; - struct bfd_link_info *info; - const Elf_Internal_Sym *sym; - const char **namep; - flagword *flagsp; - asection **secp; - bfd_vma *valp; -{ - if (sym->st_shndx == SHN_COMMON && sym->st_size <= bfd_get_gp_size (abfd)) - { - /* Common symbols less than or equal to -G nn bytes are automatically - put into .sdata. */ - elf_linker_section_t *sdata = ppc_elf_create_linker_section (abfd, info, LINKER_SECTION_SDATA); - if (!sdata->bss_section) - { - sdata->bss_section = bfd_make_section (elf_hash_table (info)->dynobj, sdata->bss_name); - sdata->bss_section->flags = (sdata->bss_section->flags & ~SEC_LOAD) | SEC_IS_COMMON; - } - - *secp = sdata->bss_section; - *valp = sym->st_size; - } - - return true; -} - - -/* Finish up dynamic symbol handling. We set the contents of various - dynamic sections here. */ - -static boolean -ppc_elf_finish_dynamic_symbol (output_bfd, info, h, sym) - bfd *output_bfd; - struct bfd_link_info *info; - struct elf_link_hash_entry *h; - Elf_Internal_Sym *sym; -{ - bfd *dynobj; - -#ifdef DEBUG - fprintf (stderr, "ppc_elf_finish_dynamic_symbol called for %s\n", h->root.root.string); -#endif - - dynobj = elf_hash_table (info)->dynobj; - BFD_ASSERT (dynobj != NULL); - - if (h->plt_offset != (bfd_vma) -1) - { - asection *splt; - asection *srela; - Elf_Internal_Rela rela; - - /* This symbol has an entry in the procedure linkage table. Set - it up. */ - - BFD_ASSERT (h->dynindx != -1); - - splt = bfd_get_section_by_name (dynobj, ".plt"); - srela = bfd_get_section_by_name (dynobj, ".rela.plt"); - BFD_ASSERT (splt != NULL && srela != NULL); - - /* Fill in the entry in the procedure linkage table. */ -#if 0 - bfd_put_32 (output_bfd, - PLT_ENTRY_WORD0 + h->plt_offset, - splt->contents + h->plt_offset); - bfd_put_32 (output_bfd, - (PLT_ENTRY_WORD1 - + (((- (h->plt_offset + 4)) >> 2) & 0x3fffff)), - splt->contents + h->plt_offset + 4); - bfd_put_32 (output_bfd, PLT_ENTRY_WORD2, - splt->contents + h->plt_offset + 8); - - /* Fill in the entry in the .rela.plt section. */ - rela.r_offset = (splt->output_section->vma - + splt->output_offset - + h->plt_offset); - rela.r_info = ELF32_R_INFO (h->dynindx, R_SPARC_JMP_SLOT); - rela.r_addend = 0; - bfd_elf32_swap_reloca_out (output_bfd, &rela, - ((Elf32_External_Rela *) srela->contents - + h->plt_offset / PLT_ENTRY_SIZE - 4)); -#endif - - if ((h->elf_link_hash_flags & ELF_LINK_HASH_DEF_REGULAR) == 0) - { - /* Mark the symbol as undefined, rather than as defined in - the .plt section. Leave the value alone. */ - sym->st_shndx = SHN_UNDEF; - } - } - - if ((h->elf_link_hash_flags & ELF_LINK_HASH_NEEDS_COPY) != 0) - { - asection *s; - Elf_Internal_Rela rela; - - /* This symbols needs a copy reloc. Set it up. */ - - BFD_ASSERT (h->dynindx != -1); - - s = bfd_get_section_by_name (h->root.u.def.section->owner, - ".rela.bss"); - BFD_ASSERT (s != NULL); - - rela.r_offset = (h->root.u.def.value - + h->root.u.def.section->output_section->vma - + h->root.u.def.section->output_offset); - rela.r_info = ELF32_R_INFO (h->dynindx, R_PPC_COPY); - rela.r_addend = 0; - bfd_elf32_swap_reloca_out (output_bfd, &rela, - ((Elf32_External_Rela *) s->contents - + s->reloc_count)); - ++s->reloc_count; - } - - /* Mark some specially defined symbols as absolute. */ - if (strcmp (h->root.root.string, "_DYNAMIC") == 0 - || strcmp (h->root.root.string, "_GLOBAL_OFFSET_TABLE_") == 0 - || strcmp (h->root.root.string, "_PROCEDURE_LINKAGE_TABLE_") == 0) - sym->st_shndx = SHN_ABS; - - return true; -} - - -/* Finish up the dynamic sections. */ - -static boolean -ppc_elf_finish_dynamic_sections (output_bfd, info) - bfd *output_bfd; - struct bfd_link_info *info; -{ - asection *sdyn; - bfd *dynobj = elf_hash_table (info)->dynobj; - elf_linker_section_t *got = elf_linker_section (dynobj, LINKER_SECTION_GOT); - -#ifdef DEBUG - fprintf (stderr, "ppc_elf_finish_dynamic_sections called\n"); -#endif - - sdyn = bfd_get_section_by_name (dynobj, ".dynamic"); - - if (elf_hash_table (info)->dynamic_sections_created) - { - asection *splt; - Elf32_External_Dyn *dyncon, *dynconend; - - splt = bfd_get_section_by_name (dynobj, ".plt"); - BFD_ASSERT (splt != NULL && sdyn != NULL); - - dyncon = (Elf32_External_Dyn *) sdyn->contents; - dynconend = (Elf32_External_Dyn *) (sdyn->contents + sdyn->_raw_size); - for (; dyncon < dynconend; dyncon++) - { - Elf_Internal_Dyn dyn; - const char *name; - boolean size; - - bfd_elf32_swap_dyn_in (dynobj, dyncon, &dyn); - - switch (dyn.d_tag) - { - case DT_PLTGOT: name = ".plt"; size = false; break; - case DT_PLTRELSZ: name = ".rela.plt"; size = true; break; - case DT_JMPREL: name = ".rela.plt"; size = false; break; - default: name = NULL; size = false; break; - } - - if (name != NULL) - { - asection *s; - - s = bfd_get_section_by_name (output_bfd, name); - if (s == NULL) - dyn.d_un.d_val = 0; - else - { - if (! size) - dyn.d_un.d_ptr = s->vma; - else - { - if (s->_cooked_size != 0) - dyn.d_un.d_val = s->_cooked_size; - else - dyn.d_un.d_val = s->_raw_size; - } - } - bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon); - } - } - } - - /* Add a blrl instruction at _GLOBAL_OFFSET_TABLE_-4 so that a function can - easily find the address of the _GLOBAL_OFFSET_TABLE_. */ - if (got) - { - unsigned char *contents = got->section->contents + got->hole_offset; - bfd_put_32 (output_bfd, 0x4e800021 /* blrl */, contents); - - if (sdyn == NULL) - bfd_put_32 (output_bfd, (bfd_vma) 0, contents+4); - else - bfd_put_32 (output_bfd, - sdyn->output_section->vma + sdyn->output_offset, - contents+4); - - elf_section_data (got->section->output_section)->this_hdr.sh_entsize = 4; - } - - if (info->shared) - { - asection *sdynsym; - asection *s; - Elf_Internal_Sym sym; - - /* Set up the section symbols for the output sections. */ - - sdynsym = bfd_get_section_by_name (dynobj, ".dynsym"); - BFD_ASSERT (sdynsym != NULL); - - sym.st_size = 0; - sym.st_name = 0; - sym.st_info = ELF_ST_INFO (STB_LOCAL, STT_SECTION); - sym.st_other = 0; - - for (s = output_bfd->sections; s != NULL; s = s->next) - { - int indx; - - sym.st_value = s->vma; - - indx = elf_section_data (s)->this_idx; - BFD_ASSERT (indx > 0); - sym.st_shndx = indx; - - bfd_elf32_swap_symbol_out (output_bfd, &sym, - (PTR) (((Elf32_External_Sym *) - sdynsym->contents) - + elf_section_data (s)->dynindx)); - } - - /* Set the sh_info field of the output .dynsym section to the - index of the first global symbol. */ - elf_section_data (sdynsym->output_section)->this_hdr.sh_info = - bfd_count_sections (output_bfd) + 1; - } - - return true; -} - - -/* The RELOCATE_SECTION function is called by the ELF backend linker - to handle the relocations for a section. - - The relocs are always passed as Rela structures; if the section - actually uses Rel structures, the r_addend field will always be - zero. - - This function is responsible for adjust the section contents as - necessary, and (if using Rela relocs and generating a - relocateable output file) adjusting the reloc addend as - necessary. - - This function does not have to worry about setting the reloc - address or the reloc symbol index. - - LOCAL_SYMS is a pointer to the swapped in local symbols. - - LOCAL_SECTIONS is an array giving the section in the input file - corresponding to the st_shndx field of each local symbol. - - The global hash table entry for the global symbols can be found - via elf_sym_hashes (input_bfd). - - When generating relocateable output, this function must handle - STB_LOCAL/STT_SECTION symbols specially. The output symbol is - going to be the section symbol corresponding to the output - section, which means that the addend must be adjusted - accordingly. */ - -static boolean -ppc_elf_relocate_section (output_bfd, info, input_bfd, input_section, - contents, relocs, local_syms, local_sections) - bfd *output_bfd; - struct bfd_link_info *info; - bfd *input_bfd; - asection *input_section; - bfd_byte *contents; - Elf_Internal_Rela *relocs; - Elf_Internal_Sym *local_syms; - asection **local_sections; -{ - Elf_Internal_Shdr *symtab_hdr = &elf_tdata (input_bfd)->symtab_hdr; - struct elf_link_hash_entry **sym_hashes = elf_sym_hashes (input_bfd); - bfd *dynobj = elf_hash_table (info)->dynobj; - elf_linker_section_t *got = (dynobj) ? elf_linker_section (dynobj, LINKER_SECTION_GOT) : NULL; - elf_linker_section_t *sdata = (dynobj) ? elf_linker_section (dynobj, LINKER_SECTION_SDATA) : NULL; - elf_linker_section_t *sdata2 = (dynobj) ? elf_linker_section (dynobj, LINKER_SECTION_SDATA2) : NULL; - Elf_Internal_Rela *rel = relocs; - Elf_Internal_Rela *relend = relocs + input_section->reloc_count; - boolean ret = true; - long insn; - -#ifdef DEBUG - fprintf (stderr, "ppc_elf_relocate_section called for %s section %s, %ld relocations%s\n", - bfd_get_filename (input_bfd), - bfd_section_name(input_bfd, input_section), - (long)input_section->reloc_count, - (info->relocateable) ? " (relocatable)" : ""); -#endif - - if (!ppc_elf_howto_table[ R_PPC_ADDR32 ]) /* Initialize howto table if needed */ - ppc_elf_howto_init (); - - for (; rel < relend; rel++) - { - enum ppc_reloc_type r_type = (enum ppc_reloc_type)ELF32_R_TYPE (rel->r_info); - bfd_vma offset = rel->r_offset; - bfd_vma addend = rel->r_addend; - bfd_reloc_status_type r = bfd_reloc_other; - Elf_Internal_Sym *sym = (Elf_Internal_Sym *)0; - asection *sec = (asection *)0; - struct elf_link_hash_entry *h = (struct elf_link_hash_entry *)0; - const char *sym_name = (const char *)0; - reloc_howto_type *howto; - unsigned long r_symndx; - bfd_vma relocation; - - /* Unknown relocation handling */ - if ((unsigned)r_type >= (unsigned)R_PPC_max || !ppc_elf_howto_table[(int)r_type]) - { - (*_bfd_error_handler) ("%s: unknown relocation type %d", - bfd_get_filename (input_bfd), - (int)r_type); - - bfd_set_error (bfd_error_bad_value); - ret = false; - continue; - } - - howto = ppc_elf_howto_table[(int)r_type]; - r_symndx = ELF32_R_SYM (rel->r_info); - - if (info->relocateable) - { - /* This is a relocateable link. We don't have to change - anything, unless the reloc is against a section symbol, - in which case we have to adjust according to where the - section symbol winds up in the output section. */ - if (r_symndx < symtab_hdr->sh_info) - { - sym = local_syms + r_symndx; - if ((unsigned)ELF_ST_TYPE (sym->st_info) == STT_SECTION) - { - sec = local_sections[r_symndx]; - addend = rel->r_addend += sec->output_offset + sym->st_value; - } - } - -#ifdef DEBUG - fprintf (stderr, "\ttype = %s (%d), symbol index = %ld, offset = %ld, addend = %ld\n", - howto->name, - (int)r_type, - r_symndx, - (long)offset, - (long)addend); -#endif - continue; - } - - /* This is a final link. */ - if (r_symndx < symtab_hdr->sh_info) - { - sym = local_syms + r_symndx; - sec = local_sections[r_symndx]; - sym_name = "<local symbol>"; - - relocation = (sec->output_section->vma - + sec->output_offset - + sym->st_value); - } - else - { - h = sym_hashes[r_symndx - symtab_hdr->sh_info]; - while (h->root.type == bfd_link_hash_indirect - || h->root.type == bfd_link_hash_warning) - h = (struct elf_link_hash_entry *) h->root.u.i.link; - sym_name = h->root.root.string; - if (h->root.type == bfd_link_hash_defined - || h->root.type == bfd_link_hash_defweak) - { - sec = h->root.u.def.section; - relocation = (h->root.u.def.value - + sec->output_section->vma - + sec->output_offset); - } - else if (h->root.type == bfd_link_hash_undefweak) - relocation = 0; - else if (info->shared) - relocation = 0; - else - { - (*info->callbacks->undefined_symbol)(info, - h->root.root.string, - input_bfd, - input_section, - rel->r_offset); - ret = false; - continue; - } - } - - switch ((int)r_type) - { - default: - (*_bfd_error_handler) ("%s: unknown relocation type %d for symbol %s", - bfd_get_filename (input_bfd), - (int)r_type, sym_name); - - bfd_set_error (bfd_error_bad_value); - ret = false; - continue; - - /* relocations that need no special processing */ - case (int)R_PPC_NONE: - case (int)R_PPC_ADDR32: - case (int)R_PPC_ADDR24: - case (int)R_PPC_ADDR16: - case (int)R_PPC_ADDR16_LO: - case (int)R_PPC_ADDR16_HI: - case (int)R_PPC_ADDR14: - case (int)R_PPC_REL24: - case (int)R_PPC_REL14: - case (int)R_PPC_UADDR32: - case (int)R_PPC_UADDR16: - case (int)R_PPC_REL32: - break; - - /* branch taken prediction relocations */ - case (int)R_PPC_ADDR14_BRTAKEN: - case (int)R_PPC_REL14_BRTAKEN: - insn = bfd_get_32 (output_bfd, contents + offset); - if ((relocation - offset) & 0x8000) - insn &= ~BRANCH_PREDICT_BIT; - else - insn |= BRANCH_PREDICT_BIT; - bfd_put_32 (output_bfd, insn, contents + offset); - break; - - /* branch not taken predicition relocations */ - case (int)R_PPC_ADDR14_BRNTAKEN: - case (int)R_PPC_REL14_BRNTAKEN: - insn = bfd_get_32 (output_bfd, contents + offset); - if ((relocation - offset) & 0x8000) - insn |= BRANCH_PREDICT_BIT; - else - insn &= ~BRANCH_PREDICT_BIT; - bfd_put_32 (output_bfd, insn, contents + offset); - break; - - /* GOT16 relocations */ - case (int)R_PPC_GOT16: - case (int)R_PPC_GOT16_LO: - case (int)R_PPC_GOT16_HI: - case (int)R_PPC_GOT16_HA: - relocation = bfd_elf32_finish_pointer_linker_section (output_bfd, input_bfd, info, - got, h, relocation, rel, - R_PPC_RELATIVE); - break; - - /* Indirect .sdata relocation */ - case (int)R_PPC_EMB_SDAI16: - BFD_ASSERT (sdata != NULL); - relocation = bfd_elf32_finish_pointer_linker_section (output_bfd, input_bfd, info, - sdata, h, relocation, rel, - R_PPC_RELATIVE); - break; - - /* Indirect .sdata2 relocation */ - case (int)R_PPC_EMB_SDA2I16: - BFD_ASSERT (sdata2 != NULL); - relocation = bfd_elf32_finish_pointer_linker_section (output_bfd, input_bfd, info, - sdata2, h, relocation, rel, - R_PPC_RELATIVE); - break; - - /* Handle the TOC16 reloc. We want to use the offset within the .got - section, not the actual VMA. This is appropriate when generating - an embedded ELF object, for which the .got section acts like the - AIX .toc section. */ - case (int)R_PPC_TOC16: /* phony GOT16 relocations */ - BFD_ASSERT (sec != (asection *)0); - BFD_ASSERT (bfd_is_und_section (sec) - || strcmp (bfd_get_section_name (abfd, sec), ".got") == 0 - || strcmp (bfd_get_section_name (abfd, sec), ".cgot") == 0) - - addend -= sec->output_section->vma + sec->output_offset + 0x8000; - break; - - /* arithmetic adjust relocations */ - case (int)R_PPC_ADDR16_HA: - BFD_ASSERT (sec != (asection *)0); - addend += ((relocation + addend) & 0x8000) << 1; - break; - - /* relocate against _SDA_BASE_ */ - case (int)R_PPC_SDAREL16: - BFD_ASSERT (sec != (asection *)0); - if (strcmp (bfd_get_section_name (abfd, sec), ".sdata") != 0 - && strcmp (bfd_get_section_name (abfd, sec), ".sbss") != 0) - { - (*_bfd_error_handler) ("%s: The target (%s) of a %s relocation is in the wrong section (%s)", - bfd_get_filename (input_bfd), - sym_name, - ppc_elf_howto_table[ (int)r_type ]->name, - bfd_get_section_name (abfd, sec)); - - bfd_set_error (bfd_error_bad_value); - ret = false; - continue; - } - addend -= (sdata->sym_hash->root.u.def.value - + sdata->sym_hash->root.u.def.section->output_section->vma - + sdata->sym_hash->root.u.def.section->output_offset); - break; - - - /* relocate against _SDA2_BASE_ */ - case (int)R_PPC_EMB_SDA2REL: - BFD_ASSERT (sec != (asection *)0); - if (strcmp (bfd_get_section_name (abfd, sec), ".sdata2") != 0 - && strcmp (bfd_get_section_name (abfd, sec), ".sbss2") != 0) - { - (*_bfd_error_handler) ("%s: The target (%s) of a %s relocation is in the wrong section (%s)", - bfd_get_filename (input_bfd), - sym_name, - ppc_elf_howto_table[ (int)r_type ]->name, - bfd_get_section_name (abfd, sec)); - - bfd_set_error (bfd_error_bad_value); - ret = false; - continue; - } - addend -= (sdata2->sym_hash->root.u.def.value - + sdata2->sym_hash->root.u.def.section->output_section->vma - + sdata2->sym_hash->root.u.def.section->output_offset); - break; - - - /* relocate against either _SDA_BASE_, _SDA2_BASE_, or 0 */ - case (int)R_PPC_EMB_SDA21: - case (int)R_PPC_EMB_RELSDA: - { - const char *name = bfd_get_section_name (abfd, sec); - int reg; - - BFD_ASSERT (sec != (asection *)0); - if (strcmp (name, ".sdata") == 0 || strcmp (name, ".sbss") == 0) - { - reg = 13; - addend -= (sdata->sym_hash->root.u.def.value - + sdata->sym_hash->root.u.def.section->output_section->vma - + sdata->sym_hash->root.u.def.section->output_offset); - } - - else if (strcmp (name, ".sdata2") == 0 || strcmp (name, ".sbss2") == 0) - { - reg = 2; - addend -= (sdata2->sym_hash->root.u.def.value - + sdata2->sym_hash->root.u.def.section->output_section->vma - + sdata2->sym_hash->root.u.def.section->output_offset); - } - - else if (strcmp (name, ".PPC.EMB.sdata0") == 0 || strcmp (name, ".PPC.EMB.sbss0") == 0) - { - reg = 0; - } - - else - { - (*_bfd_error_handler) ("%s: The target (%s) of a %s relocation is in the wrong section (%s)", - bfd_get_filename (input_bfd), - sym_name, - ppc_elf_howto_table[ (int)r_type ]->name, - bfd_get_section_name (abfd, sec)); - - bfd_set_error (bfd_error_bad_value); - ret = false; - continue; - } - - if (r_type == R_PPC_EMB_SDA21) - { /* fill in register field */ - insn = bfd_get_32 (output_bfd, contents + offset); - insn = (insn & ~RA_REGISTER_MASK) | (reg << RA_REGISTER_SHIFT); - bfd_put_32 (output_bfd, insn, contents + offset); - } - } - break; - - /* Relocate against the beginning of the section */ - case (int)R_PPC_SECTOFF: - case (int)R_PPC_SECTOFF_LO: - case (int)R_PPC_SECTOFF_HI: - BFD_ASSERT (sec != (asection *)0); - addend -= sec->output_section->vma; - break; - - case (int)R_PPC_SECTOFF_HA: - BFD_ASSERT (sec != (asection *)0); - addend -= sec->output_section->vma; - addend += ((relocation + addend) & 0x8000) << 1; - break; - - /* Negative relocations */ - case (int)R_PPC_EMB_NADDR32: - case (int)R_PPC_EMB_NADDR16: - case (int)R_PPC_EMB_NADDR16_LO: - case (int)R_PPC_EMB_NADDR16_HI: - addend -= 2*relocation; - break; - - case (int)R_PPC_EMB_NADDR16_HA: - addend -= 2*relocation; - addend += ((relocation + addend) & 0x8000) << 1; - break; - - /* NOP relocation that prevents garbage collecting linkers from omitting a - reference. */ - case (int)R_PPC_EMB_MRKREF: - continue; - - case (int)R_PPC_PLTREL24: - case (int)R_PPC_COPY: - case (int)R_PPC_GLOB_DAT: - case (int)R_PPC_JMP_SLOT: - case (int)R_PPC_RELATIVE: - case (int)R_PPC_LOCAL24PC: - case (int)R_PPC_PLT32: - case (int)R_PPC_PLTREL32: - case (int)R_PPC_PLT16_LO: - case (int)R_PPC_PLT16_HI: - case (int)R_PPC_PLT16_HA: - case (int)R_PPC_EMB_RELSEC16: - case (int)R_PPC_EMB_RELST_LO: - case (int)R_PPC_EMB_RELST_HI: - case (int)R_PPC_EMB_RELST_HA: - case (int)R_PPC_EMB_BIT_FLD: - (*_bfd_error_handler) ("%s: Relocation %s is not yet supported for symbol %s.", - bfd_get_filename (input_bfd), - ppc_elf_howto_table[ (int)r_type ]->name, - sym_name); - - bfd_set_error (bfd_error_invalid_operation); - ret = false; - continue; - } - - -#ifdef DEBUG - fprintf (stderr, "\ttype = %s (%d), name = %s, symbol index = %ld, offset = %ld, addend = %ld\n", - howto->name, - (int)r_type, - sym_name, - r_symndx, - (long)offset, - (long)addend); -#endif - - r = _bfd_final_link_relocate (howto, - input_bfd, - input_section, - contents, - offset, - relocation, - addend); - - if (r != bfd_reloc_ok) - { - ret = false; - switch (r) - { - default: - break; - - case bfd_reloc_overflow: - { - const char *name; - - if (h != NULL) - name = h->root.root.string; - else - { - name = bfd_elf_string_from_elf_section (input_bfd, - symtab_hdr->sh_link, - sym->st_name); - if (name == NULL) - break; - - if (*name == '\0') - name = bfd_section_name (input_bfd, sec); - } - - (*info->callbacks->reloc_overflow)(info, - name, - howto->name, - (bfd_vma) 0, - input_bfd, - input_section, - offset); - } - break; - - } - } - } - - -#ifdef DEBUG - fprintf (stderr, "\n"); -#endif - - return ret; -} - - -#define TARGET_LITTLE_SYM bfd_elf32_powerpcle_vec -#define TARGET_LITTLE_NAME "elf32-powerpcle" -#define TARGET_BIG_SYM bfd_elf32_powerpc_vec -#define TARGET_BIG_NAME "elf32-powerpc" -#define ELF_ARCH bfd_arch_powerpc -#define ELF_MACHINE_CODE EM_PPC -#define ELF_MAXPAGESIZE 0x10000 -#define elf_info_to_howto ppc_elf_info_to_howto - -#ifdef EM_CYGNUS_POWERPC -#define ELF_MACHINE_ALT1 EM_CYGNUS_POWERPC -#endif - -#ifdef EM_PPC_OLD -#define ELF_MACHINE_ALT2 EM_PPC_OLD -#endif - -#define bfd_elf32_bfd_copy_private_bfd_data ppc_elf_copy_private_bfd_data -#define bfd_elf32_bfd_merge_private_bfd_data ppc_elf_merge_private_bfd_data -#define bfd_elf32_bfd_set_private_flags ppc_elf_set_private_flags -#define bfd_elf32_bfd_reloc_type_lookup ppc_elf_reloc_type_lookup -#define elf_backend_section_from_shdr ppc_elf_section_from_shdr -#define elf_backend_relocate_section ppc_elf_relocate_section -#define elf_backend_create_dynamic_sections _bfd_elf_create_dynamic_sections -#define elf_backend_check_relocs ppc_elf_check_relocs -#define elf_backend_adjust_dynamic_symbol ppc_elf_adjust_dynamic_symbol -#define elf_backend_add_symbol_hook ppc_elf_add_symbol_hook -#define elf_backend_size_dynamic_sections ppc_elf_size_dynamic_sections -#define elf_backend_finish_dynamic_symbol ppc_elf_finish_dynamic_symbol -#define elf_backend_finish_dynamic_sections ppc_elf_finish_dynamic_sections -#define elf_backend_fake_sections ppc_elf_fake_sections -#define elf_backend_additional_program_headers ppc_elf_additional_program_headers -#define elf_backend_modify_segment_map ppc_elf_modify_segment_map - -#include "elf32-target.h" diff --git a/contrib/gdb/bfd/elf32-sparc.c b/contrib/gdb/bfd/elf32-sparc.c deleted file mode 100644 index 918eb00e2a0b4..0000000000000 --- a/contrib/gdb/bfd/elf32-sparc.c +++ /dev/null @@ -1,1795 +0,0 @@ -/* SPARC-specific support for 32-bit ELF - Copyright (C) 1993, 1994, 1995, 1996 Free Software Foundation, Inc. - -This file is part of BFD, the Binary File Descriptor library. - -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 2 of the License, 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ - -#include "bfd.h" -#include "sysdep.h" -#include "bfdlink.h" -#include "libbfd.h" -#include "elf-bfd.h" -#include "elf/sparc.h" - -static reloc_howto_type *elf32_sparc_reloc_type_lookup - PARAMS ((bfd *, bfd_reloc_code_real_type)); -static void elf_info_to_howto - PARAMS ((bfd *, arelent *, Elf_Internal_Rela *)); -static boolean elf32_sparc_check_relocs - PARAMS ((bfd *, struct bfd_link_info *, asection *, - const Elf_Internal_Rela *)); -static boolean elf32_sparc_adjust_dynamic_symbol - PARAMS ((struct bfd_link_info *, struct elf_link_hash_entry *)); -static boolean elf32_sparc_adjust_dynindx - PARAMS ((struct elf_link_hash_entry *, PTR)); -static boolean elf32_sparc_size_dynamic_sections - PARAMS ((bfd *, struct bfd_link_info *)); -static boolean elf32_sparc_relocate_section - PARAMS ((bfd *, struct bfd_link_info *, bfd *, asection *, bfd_byte *, - Elf_Internal_Rela *, Elf_Internal_Sym *, asection **)); -static boolean elf32_sparc_finish_dynamic_symbol - PARAMS ((bfd *, struct bfd_link_info *, struct elf_link_hash_entry *, - Elf_Internal_Sym *)); -static boolean elf32_sparc_finish_dynamic_sections - PARAMS ((bfd *, struct bfd_link_info *)); -static boolean elf32_sparc_merge_private_bfd_data PARAMS ((bfd *, bfd *)); -static boolean elf32_sparc_object_p - PARAMS ((bfd *)); -static void elf32_sparc_final_write_processing - PARAMS ((bfd *, boolean)); - -/* The howto table and associated functions. - ??? elf64-sparc.c has its own copy for the moment to ease transition - since some of the relocation values have changed. At some point we'll - want elf64-sparc.c to switch over and use this table. - ??? Do we want to recognize (or flag as errors) some of the 64 bit entries - if the target is elf32-sparc. -*/ - -static bfd_reloc_status_type sparc_elf_notsupported_reloc - PARAMS ((bfd *, arelent *, asymbol *, PTR, asection *, bfd *, char **)); -static bfd_reloc_status_type sparc_elf_wdisp16_reloc - PARAMS ((bfd *, arelent *, asymbol *, PTR, asection *, bfd *, char **)); - -reloc_howto_type _bfd_sparc_elf_howto_table[] = -{ - HOWTO(R_SPARC_NONE, 0,0, 0,false,0,complain_overflow_dont, bfd_elf_generic_reloc, "R_SPARC_NONE", false,0,0x00000000,true), - HOWTO(R_SPARC_8, 0,0, 8,false,0,complain_overflow_bitfield,bfd_elf_generic_reloc, "R_SPARC_8", false,0,0x000000ff,true), - HOWTO(R_SPARC_16, 0,1,16,false,0,complain_overflow_bitfield,bfd_elf_generic_reloc, "R_SPARC_16", false,0,0x0000ffff,true), - HOWTO(R_SPARC_32, 0,2,32,false,0,complain_overflow_bitfield,bfd_elf_generic_reloc, "R_SPARC_32", false,0,0xffffffff,true), - HOWTO(R_SPARC_DISP8, 0,0, 8,true, 0,complain_overflow_signed, bfd_elf_generic_reloc, "R_SPARC_DISP8", false,0,0x000000ff,true), - HOWTO(R_SPARC_DISP16, 0,1,16,true, 0,complain_overflow_signed, bfd_elf_generic_reloc, "R_SPARC_DISP16", false,0,0x0000ffff,true), - HOWTO(R_SPARC_DISP32, 0,2,32,true, 0,complain_overflow_signed, bfd_elf_generic_reloc, "R_SPARC_DISP32", false,0,0x00ffffff,true), - HOWTO(R_SPARC_WDISP30, 2,2,30,true, 0,complain_overflow_signed, bfd_elf_generic_reloc, "R_SPARC_WDISP30", false,0,0x3fffffff,true), - HOWTO(R_SPARC_WDISP22, 2,2,22,true, 0,complain_overflow_signed, bfd_elf_generic_reloc, "R_SPARC_WDISP22", false,0,0x003fffff,true), - HOWTO(R_SPARC_HI22, 10,2,22,false,0,complain_overflow_dont, bfd_elf_generic_reloc, "R_SPARC_HI22", false,0,0x003fffff,true), - HOWTO(R_SPARC_22, 0,2,22,false,0,complain_overflow_bitfield,bfd_elf_generic_reloc, "R_SPARC_22", false,0,0x003fffff,true), - HOWTO(R_SPARC_13, 0,2,13,false,0,complain_overflow_bitfield,bfd_elf_generic_reloc, "R_SPARC_13", false,0,0x00001fff,true), - HOWTO(R_SPARC_LO10, 0,2,10,false,0,complain_overflow_dont, bfd_elf_generic_reloc, "R_SPARC_LO10", false,0,0x000003ff,true), - HOWTO(R_SPARC_GOT10, 0,2,10,false,0,complain_overflow_dont, bfd_elf_generic_reloc, "R_SPARC_GOT10", false,0,0x000003ff,true), - HOWTO(R_SPARC_GOT13, 0,2,13,false,0,complain_overflow_signed, bfd_elf_generic_reloc, "R_SPARC_GOT13", false,0,0x00001fff,true), - HOWTO(R_SPARC_GOT22, 10,2,22,false,0,complain_overflow_dont, bfd_elf_generic_reloc, "R_SPARC_GOT22", false,0,0x003fffff,true), - HOWTO(R_SPARC_PC10, 0,2,10,true, 0,complain_overflow_dont, bfd_elf_generic_reloc, "R_SPARC_PC10", false,0,0x000003ff,true), - HOWTO(R_SPARC_PC22, 10,2,22,true, 0,complain_overflow_bitfield,bfd_elf_generic_reloc, "R_SPARC_PC22", false,0,0x003fffff,true), - HOWTO(R_SPARC_WPLT30, 2,2,30,true, 0,complain_overflow_signed, bfd_elf_generic_reloc, "R_SPARC_WPLT30", false,0,0x3fffffff,true), - HOWTO(R_SPARC_COPY, 0,0,00,false,0,complain_overflow_dont, bfd_elf_generic_reloc, "R_SPARC_COPY", false,0,0x00000000,true), - HOWTO(R_SPARC_GLOB_DAT, 0,0,00,false,0,complain_overflow_dont, bfd_elf_generic_reloc, "R_SPARC_GLOB_DAT",false,0,0x00000000,true), - HOWTO(R_SPARC_JMP_SLOT, 0,0,00,false,0,complain_overflow_dont, bfd_elf_generic_reloc, "R_SPARC_JMP_SLOT",false,0,0x00000000,true), - HOWTO(R_SPARC_RELATIVE, 0,0,00,false,0,complain_overflow_dont, bfd_elf_generic_reloc, "R_SPARC_RELATIVE",false,0,0x00000000,true), - HOWTO(R_SPARC_UA32, 0,0,00,false,0,complain_overflow_dont, bfd_elf_generic_reloc, "R_SPARC_UA32", false,0,0x00000000,true), - HOWTO(R_SPARC_PLT32, 0,0,00,false,0,complain_overflow_dont, sparc_elf_notsupported_reloc, "R_SPARC_PLT32", false,0,0x00000000,true), - HOWTO(R_SPARC_HIPLT22, 0,0,00,false,0,complain_overflow_dont, sparc_elf_notsupported_reloc, "R_SPARC_HIPLT22", false,0,0x00000000,true), - HOWTO(R_SPARC_LOPLT10, 0,0,00,false,0,complain_overflow_dont, sparc_elf_notsupported_reloc, "R_SPARC_LOPLT10", false,0,0x00000000,true), - HOWTO(R_SPARC_PCPLT32, 0,0,00,false,0,complain_overflow_dont, sparc_elf_notsupported_reloc, "R_SPARC_PCPLT32", false,0,0x00000000,true), - HOWTO(R_SPARC_PCPLT22, 0,0,00,false,0,complain_overflow_dont, sparc_elf_notsupported_reloc, "R_SPARC_PCPLT22", false,0,0x00000000,true), - HOWTO(R_SPARC_PCPLT10, 0,0,00,false,0,complain_overflow_dont, sparc_elf_notsupported_reloc, "R_SPARC_PCPLT10", false,0,0x00000000,true), - HOWTO(R_SPARC_10, 0,2,10,false,0,complain_overflow_bitfield,bfd_elf_generic_reloc, "R_SPARC_10", false,0,0x000003ff,true), - HOWTO(R_SPARC_11, 0,2,11,false,0,complain_overflow_bitfield,bfd_elf_generic_reloc, "R_SPARC_11", false,0,0x000007ff,true), - /* ??? If we need to handle R_SPARC_64 then we need (figuratively) - --enable-64-bit-bfd. That causes objdump to print address as 64 bits - which we really don't want on an elf32-sparc system. There may be other - consequences which we may not want (at least not until it's proven they're - necessary) so for now these are only enabled ifdef BFD64. */ -#ifdef BFD64 - HOWTO(R_SPARC_64, 0,4,00,false,0,complain_overflow_bitfield,bfd_elf_generic_reloc, "R_SPARC_64", false,0,~ (bfd_vma) 0, true), - /* ??? These don't make sense except in 64 bit systems so they're disabled - ifndef BFD64 too (for now). */ - HOWTO(R_SPARC_OLO10, 0,2,10,false,0,complain_overflow_dont, bfd_elf_generic_reloc, "R_SPARC_OLO10", false,0,0x000003ff,true), - HOWTO(R_SPARC_HH22, 42,2,22,false,0,complain_overflow_dont, bfd_elf_generic_reloc, "R_SPARC_HH22", false,0,0x003fffff,true), - HOWTO(R_SPARC_HM10, 32,2,10,false,0,complain_overflow_dont, bfd_elf_generic_reloc, "R_SPARC_HM10", false,0,0x000003ff,true), - HOWTO(R_SPARC_LM22, 10,2,22,false,0,complain_overflow_dont, bfd_elf_generic_reloc, "R_SPARC_LM22", false,0,0x003fffff,true), - HOWTO(R_SPARC_PC_HH22, 42,2,22,true, 0,complain_overflow_dont, bfd_elf_generic_reloc, "R_SPARC_HH22", false,0,0x003fffff,true), - HOWTO(R_SPARC_PC_HM10, 32,2,10,true, 0,complain_overflow_dont, bfd_elf_generic_reloc, "R_SPARC_HM10", false,0,0x000003ff,true), - HOWTO(R_SPARC_PC_LM22, 10,2,22,true, 0,complain_overflow_dont, bfd_elf_generic_reloc, "R_SPARC_LM22", false,0,0x003fffff,true), -#else - HOWTO(R_SPARC_64, 0,0,00,false,0,complain_overflow_dont, sparc_elf_notsupported_reloc, "R_SPARC_64", false,0,0x00000000,true), - HOWTO(R_SPARC_OLO10, 0,0,00,false,0,complain_overflow_dont, sparc_elf_notsupported_reloc, "R_SPARC_OLO10", false,0,0x00000000,true), - HOWTO(R_SPARC_HH22, 0,0,00,false,0,complain_overflow_dont, sparc_elf_notsupported_reloc, "R_SPARC_HH22", false,0,0x00000000,true), - HOWTO(R_SPARC_HM10, 0,0,00,false,0,complain_overflow_dont, sparc_elf_notsupported_reloc, "R_SPARC_HM10", false,0,0x00000000,true), - HOWTO(R_SPARC_LM22, 0,0,00,false,0,complain_overflow_dont, sparc_elf_notsupported_reloc, "R_SPARC_LM22", false,0,0x00000000,true), - HOWTO(R_SPARC_PC_HH22, 0,0,00,false,0,complain_overflow_dont, sparc_elf_notsupported_reloc, "R_SPARC_PC_HH22", false,0,0x00000000,true), - HOWTO(R_SPARC_PC_HM10, 0,0,00,false,0,complain_overflow_dont, sparc_elf_notsupported_reloc, "R_SPARC_PC_HM10", false,0,0x00000000,true), - HOWTO(R_SPARC_PC_LM22, 0,0,00,false,0,complain_overflow_dont, sparc_elf_notsupported_reloc, "R_SPARC_PC_LM22", false,0,0x00000000,true), -#endif - HOWTO(R_SPARC_WDISP16, 2,2,16,true, 0,complain_overflow_signed, sparc_elf_wdisp16_reloc,"R_SPARC_WDISP16", false,0,0x00000000,true), - HOWTO(R_SPARC_WDISP19, 2,2,22,true, 0,complain_overflow_signed, bfd_elf_generic_reloc, "R_SPARC_WDISP19", false,0,0x0007ffff,true), - HOWTO(R_SPARC_GLOB_JMP, 0,0,00,false,0,complain_overflow_dont, bfd_elf_generic_reloc, "R_SPARC_GLOB_DAT",false,0,0x00000000,true), - HOWTO(R_SPARC_7, 0,2, 7,false,0,complain_overflow_bitfield,bfd_elf_generic_reloc, "R_SPARC_7", false,0,0x0000007f,true), - HOWTO(R_SPARC_5, 0,2, 5,false,0,complain_overflow_bitfield,bfd_elf_generic_reloc, "R_SPARC_5", false,0,0x0000001f,true), - HOWTO(R_SPARC_6, 0,2, 6,false,0,complain_overflow_bitfield,bfd_elf_generic_reloc, "R_SPARC_6", false,0,0x0000003f,true), -}; - -struct elf_reloc_map { - unsigned char bfd_reloc_val; - unsigned char elf_reloc_val; -}; - -static CONST struct elf_reloc_map sparc_reloc_map[] = -{ - { BFD_RELOC_NONE, R_SPARC_NONE, }, - { BFD_RELOC_16, R_SPARC_16, }, - { BFD_RELOC_8, R_SPARC_8 }, - { BFD_RELOC_8_PCREL, R_SPARC_DISP8 }, - /* ??? This might cause us to need separate functions in elf{32,64}-sparc.c - (we could still have just one table), but is this reloc ever used? */ - { BFD_RELOC_CTOR, R_SPARC_32 }, /* @@ Assumes 32 bits. */ - { BFD_RELOC_32, R_SPARC_32 }, - { BFD_RELOC_32_PCREL, R_SPARC_DISP32 }, - { BFD_RELOC_HI22, R_SPARC_HI22 }, - { BFD_RELOC_LO10, R_SPARC_LO10, }, - { BFD_RELOC_32_PCREL_S2, R_SPARC_WDISP30 }, - { BFD_RELOC_SPARC22, R_SPARC_22 }, - { BFD_RELOC_SPARC13, R_SPARC_13 }, - { BFD_RELOC_SPARC_GOT10, R_SPARC_GOT10 }, - { BFD_RELOC_SPARC_GOT13, R_SPARC_GOT13 }, - { BFD_RELOC_SPARC_GOT22, R_SPARC_GOT22 }, - { BFD_RELOC_SPARC_PC10, R_SPARC_PC10 }, - { BFD_RELOC_SPARC_PC22, R_SPARC_PC22 }, - { BFD_RELOC_SPARC_WPLT30, R_SPARC_WPLT30 }, - { BFD_RELOC_SPARC_COPY, R_SPARC_COPY }, - { BFD_RELOC_SPARC_GLOB_DAT, R_SPARC_GLOB_DAT }, - { BFD_RELOC_SPARC_JMP_SLOT, R_SPARC_JMP_SLOT }, - { BFD_RELOC_SPARC_RELATIVE, R_SPARC_RELATIVE }, - { BFD_RELOC_SPARC_WDISP22, R_SPARC_WDISP22 }, - /* ??? Doesn't dwarf use this? */ -/*{ BFD_RELOC_SPARC_UA32, R_SPARC_UA32 }, not used?? */ - {BFD_RELOC_SPARC_10, R_SPARC_10}, - {BFD_RELOC_SPARC_11, R_SPARC_11}, - {BFD_RELOC_SPARC_64, R_SPARC_64}, - {BFD_RELOC_SPARC_OLO10, R_SPARC_OLO10}, - {BFD_RELOC_SPARC_HH22, R_SPARC_HH22}, - {BFD_RELOC_SPARC_HM10, R_SPARC_HM10}, - {BFD_RELOC_SPARC_LM22, R_SPARC_LM22}, - {BFD_RELOC_SPARC_PC_HH22, R_SPARC_PC_HH22}, - {BFD_RELOC_SPARC_PC_HM10, R_SPARC_PC_HM10}, - {BFD_RELOC_SPARC_PC_LM22, R_SPARC_PC_LM22}, - {BFD_RELOC_SPARC_WDISP16, R_SPARC_WDISP16}, - {BFD_RELOC_SPARC_WDISP19, R_SPARC_WDISP19}, - {BFD_RELOC_SPARC_GLOB_JMP, R_SPARC_GLOB_JMP}, - {BFD_RELOC_SPARC_7, R_SPARC_7}, - {BFD_RELOC_SPARC_5, R_SPARC_5}, - {BFD_RELOC_SPARC_6, R_SPARC_6}, -}; - -static reloc_howto_type * -elf32_sparc_reloc_type_lookup (abfd, code) - bfd *abfd; - bfd_reloc_code_real_type code; -{ - unsigned int i; - for (i = 0; i < sizeof (sparc_reloc_map) / sizeof (struct elf_reloc_map); i++) - { - if (sparc_reloc_map[i].bfd_reloc_val == code) - return &_bfd_sparc_elf_howto_table[(int) sparc_reloc_map[i].elf_reloc_val]; - } - return 0; -} - -/* We need to use ELF32_R_TYPE so we have our own copy of this function, - and elf64-sparc.c has its own copy. */ - -static void -elf_info_to_howto (abfd, cache_ptr, dst) - bfd *abfd; - arelent *cache_ptr; - Elf_Internal_Rela *dst; -{ - BFD_ASSERT (ELF32_R_TYPE(dst->r_info) < (unsigned int) R_SPARC_max); - cache_ptr->howto = &_bfd_sparc_elf_howto_table[ELF32_R_TYPE(dst->r_info)]; -} - -/* For unsupported relocs. */ - -static bfd_reloc_status_type -sparc_elf_notsupported_reloc (abfd, - reloc_entry, - symbol, - data, - input_section, - output_bfd, - error_message) - bfd *abfd; - arelent *reloc_entry; - asymbol *symbol; - PTR data; - asection *input_section; - bfd *output_bfd; - char **error_message; -{ - return bfd_reloc_notsupported; -} - -/* Handle the WDISP16 reloc. */ - -static bfd_reloc_status_type -sparc_elf_wdisp16_reloc (abfd, - reloc_entry, - symbol, - data, - input_section, - output_bfd, - error_message) - bfd *abfd; - arelent *reloc_entry; - asymbol *symbol; - PTR data; - asection *input_section; - bfd *output_bfd; - char **error_message; -{ - bfd_vma relocation; - bfd_vma x; - - if (output_bfd != (bfd *) NULL - && (symbol->flags & BSF_SECTION_SYM) == 0 - && (! reloc_entry->howto->partial_inplace - || reloc_entry->addend == 0)) - { - reloc_entry->address += input_section->output_offset; - return bfd_reloc_ok; - } - - if (output_bfd != NULL) - return bfd_reloc_continue; - - if (reloc_entry->address > input_section->_cooked_size) - return bfd_reloc_outofrange; - - relocation = (symbol->value - + symbol->section->output_section->vma - + symbol->section->output_offset); - relocation += reloc_entry->addend; - relocation -= (input_section->output_section->vma - + input_section->output_offset); - relocation -= reloc_entry->address; - - x = bfd_get_32 (abfd, (char *) data + reloc_entry->address); - x |= ((((relocation >> 2) & 0xc000) << 6) - | ((relocation >> 2) & 0x3fff)); - bfd_put_32 (abfd, x, (char *) data + reloc_entry->address); - - if ((bfd_signed_vma) relocation < - 0x40000 - || (bfd_signed_vma) relocation > 0x3ffff) - return bfd_reloc_overflow; - else - return bfd_reloc_ok; -} - -/* Functions for the SPARC ELF linker. */ - -/* The name of the dynamic interpreter. This is put in the .interp - section. */ - -#define ELF_DYNAMIC_INTERPRETER "/usr/lib/ld.so.1" - -/* The nop opcode we use. */ - -#define SPARC_NOP 0x01000000 - -/* The size in bytes of an entry in the procedure linkage table. */ - -#define PLT_ENTRY_SIZE 12 - -/* The first four entries in a procedure linkage table are reserved, - and the initial contents are unimportant (we zero them out). - Subsequent entries look like this. See the SVR4 ABI SPARC - supplement to see how this works. */ - -/* sethi %hi(.-.plt0),%g1. We fill in the address later. */ -#define PLT_ENTRY_WORD0 0x03000000 -/* b,a .plt0. We fill in the offset later. */ -#define PLT_ENTRY_WORD1 0x30800000 -/* nop. */ -#define PLT_ENTRY_WORD2 SPARC_NOP - -/* Look through the relocs for a section during the first phase, and - allocate space in the global offset table or procedure linkage - table. */ - -static boolean -elf32_sparc_check_relocs (abfd, info, sec, relocs) - bfd *abfd; - struct bfd_link_info *info; - asection *sec; - const Elf_Internal_Rela *relocs; -{ - bfd *dynobj; - Elf_Internal_Shdr *symtab_hdr; - struct elf_link_hash_entry **sym_hashes; - bfd_vma *local_got_offsets; - const Elf_Internal_Rela *rel; - const Elf_Internal_Rela *rel_end; - asection *sgot; - asection *srelgot; - asection *sreloc; - - if (info->relocateable) - return true; - - dynobj = elf_hash_table (info)->dynobj; - symtab_hdr = &elf_tdata (abfd)->symtab_hdr; - sym_hashes = elf_sym_hashes (abfd); - local_got_offsets = elf_local_got_offsets (abfd); - - sgot = NULL; - srelgot = NULL; - sreloc = NULL; - - rel_end = relocs + sec->reloc_count; - for (rel = relocs; rel < rel_end; rel++) - { - unsigned long r_symndx; - struct elf_link_hash_entry *h; - - r_symndx = ELF32_R_SYM (rel->r_info); - if (r_symndx < symtab_hdr->sh_info) - h = NULL; - else - h = sym_hashes[r_symndx - symtab_hdr->sh_info]; - - switch (ELF32_R_TYPE (rel->r_info)) - { - case R_SPARC_GOT10: - case R_SPARC_GOT13: - case R_SPARC_GOT22: - /* This symbol requires a global offset table entry. */ - - if (dynobj == NULL) - { - /* Create the .got section. */ - elf_hash_table (info)->dynobj = dynobj = abfd; - if (! _bfd_elf_create_got_section (dynobj, info)) - return false; - } - - if (sgot == NULL) - { - sgot = bfd_get_section_by_name (dynobj, ".got"); - BFD_ASSERT (sgot != NULL); - } - - if (srelgot == NULL - && (h != NULL || info->shared)) - { - srelgot = bfd_get_section_by_name (dynobj, ".rela.got"); - if (srelgot == NULL) - { - srelgot = bfd_make_section (dynobj, ".rela.got"); - if (srelgot == NULL - || ! bfd_set_section_flags (dynobj, srelgot, - (SEC_ALLOC - | SEC_LOAD - | SEC_HAS_CONTENTS - | SEC_IN_MEMORY - | SEC_READONLY)) - || ! bfd_set_section_alignment (dynobj, srelgot, 2)) - return false; - } - } - - if (h != NULL) - { - if (h->got_offset != (bfd_vma) -1) - { - /* We have already allocated space in the .got. */ - break; - } - h->got_offset = sgot->_raw_size; - - /* Make sure this symbol is output as a dynamic symbol. */ - if (h->dynindx == -1) - { - if (! bfd_elf32_link_record_dynamic_symbol (info, h)) - return false; - } - - srelgot->_raw_size += sizeof (Elf32_External_Rela); - } - else - { - /* This is a global offset table entry for a local - symbol. */ - if (local_got_offsets == NULL) - { - size_t size; - register unsigned int i; - - size = symtab_hdr->sh_info * sizeof (bfd_vma); - local_got_offsets = (bfd_vma *) bfd_alloc (abfd, size); - if (local_got_offsets == NULL) - return false; - elf_local_got_offsets (abfd) = local_got_offsets; - for (i = 0; i < symtab_hdr->sh_info; i++) - local_got_offsets[i] = (bfd_vma) -1; - } - if (local_got_offsets[r_symndx] != (bfd_vma) -1) - { - /* We have already allocated space in the .got. */ - break; - } - local_got_offsets[r_symndx] = sgot->_raw_size; - - if (info->shared) - { - /* If we are generating a shared object, we need to - output a R_SPARC_RELATIVE reloc so that the - dynamic linker can adjust this GOT entry. */ - srelgot->_raw_size += sizeof (Elf32_External_Rela); - } - } - - sgot->_raw_size += 4; - - break; - - case R_SPARC_WPLT30: - /* This symbol requires a procedure linkage table entry. We - actually build the entry in adjust_dynamic_symbol, - because this might be a case of linking PIC code without - linking in any dynamic objects, in which case we don't - need to generate a procedure linkage table after all. */ - - if (h == NULL) - { - /* It does not make sense to have a procedure linkage - table entry for a local symbol. */ - bfd_set_error (bfd_error_bad_value); - return false; - } - - /* Make sure this symbol is output as a dynamic symbol. */ - if (h->dynindx == -1) - { - if (! bfd_elf32_link_record_dynamic_symbol (info, h)) - return false; - } - - h->elf_link_hash_flags |= ELF_LINK_HASH_NEEDS_PLT; - - break; - - case R_SPARC_PC10: - case R_SPARC_PC22: - if (h != NULL - && strcmp (h->root.root.string, "_GLOBAL_OFFSET_TABLE_") == 0) - break; - /* Fall through. */ - case R_SPARC_DISP8: - case R_SPARC_DISP16: - case R_SPARC_DISP32: - case R_SPARC_WDISP30: - case R_SPARC_WDISP22: - case R_SPARC_WDISP19: - case R_SPARC_WDISP16: - if (h == NULL) - break; - /* Fall through. */ - case R_SPARC_8: - case R_SPARC_16: - case R_SPARC_32: - case R_SPARC_HI22: - case R_SPARC_22: - case R_SPARC_13: - case R_SPARC_LO10: - case R_SPARC_UA32: - if (info->shared - && (sec->flags & SEC_ALLOC) != 0) - { - /* When creating a shared object, we must copy these - relocs into the output file. We create a reloc - section in dynobj and make room for the reloc. */ - if (sreloc == NULL) - { - const char *name; - - name = (bfd_elf_string_from_elf_section - (abfd, - elf_elfheader (abfd)->e_shstrndx, - elf_section_data (sec)->rel_hdr.sh_name)); - if (name == NULL) - return false; - - BFD_ASSERT (strncmp (name, ".rela", 5) == 0 - && strcmp (bfd_get_section_name (abfd, sec), - name + 5) == 0); - - sreloc = bfd_get_section_by_name (dynobj, name); - if (sreloc == NULL) - { - sreloc = bfd_make_section (dynobj, name); - if (sreloc == NULL - || ! bfd_set_section_flags (dynobj, sreloc, - (SEC_ALLOC - | SEC_LOAD - | SEC_HAS_CONTENTS - | SEC_IN_MEMORY - | SEC_READONLY)) - || ! bfd_set_section_alignment (dynobj, sreloc, 2)) - return false; - } - } - - sreloc->_raw_size += sizeof (Elf32_External_Rela); - } - - break; - - default: - break; - } - } - - return true; -} - -/* Adjust a symbol defined by a dynamic object and referenced by a - regular object. The current definition is in some section of the - dynamic object, but we're not including those sections. We have to - change the definition to something the rest of the link can - understand. */ - -static boolean -elf32_sparc_adjust_dynamic_symbol (info, h) - struct bfd_link_info *info; - struct elf_link_hash_entry *h; -{ - bfd *dynobj; - asection *s; - unsigned int power_of_two; - - dynobj = elf_hash_table (info)->dynobj; - - /* Make sure we know what is going on here. */ - BFD_ASSERT (dynobj != NULL - && ((h->elf_link_hash_flags & ELF_LINK_HASH_NEEDS_PLT) - || h->weakdef != NULL - || ((h->elf_link_hash_flags - & ELF_LINK_HASH_DEF_DYNAMIC) != 0 - && (h->elf_link_hash_flags - & ELF_LINK_HASH_REF_REGULAR) != 0 - && (h->elf_link_hash_flags - & ELF_LINK_HASH_DEF_REGULAR) == 0))); - - /* If this is a function, put it in the procedure linkage table. We - will fill in the contents of the procedure linkage table later - (although we could actually do it here). */ - if (h->type == STT_FUNC - || (h->elf_link_hash_flags & ELF_LINK_HASH_NEEDS_PLT) != 0) - { - if (! elf_hash_table (info)->dynamic_sections_created) - { - /* This case can occur if we saw a WPLT30 reloc in an input - file, but none of the input files were dynamic objects. - In such a case, we don't actually need to build a - procedure linkage table, and we can just do a WDISP30 - reloc instead. */ - BFD_ASSERT ((h->elf_link_hash_flags & ELF_LINK_HASH_NEEDS_PLT) != 0); - return true; - } - - s = bfd_get_section_by_name (dynobj, ".plt"); - BFD_ASSERT (s != NULL); - - /* The first four entries in .plt are reserved. */ - if (s->_raw_size == 0) - s->_raw_size = 4 * PLT_ENTRY_SIZE; - - /* The procedure linkage table has a maximum size. */ - if (s->_raw_size >= 0x400000) - { - bfd_set_error (bfd_error_bad_value); - return false; - } - - /* If this symbol is not defined in a regular file, and we are - not generating a shared library, then set the symbol to this - location in the .plt. This is required to make function - pointers compare as equal between the normal executable and - the shared library. */ - if (! info->shared - && (h->elf_link_hash_flags & ELF_LINK_HASH_DEF_REGULAR) == 0) - { - h->root.u.def.section = s; - h->root.u.def.value = s->_raw_size; - } - - h->plt_offset = s->_raw_size; - - /* Make room for this entry. */ - s->_raw_size += PLT_ENTRY_SIZE; - - /* We also need to make an entry in the .rela.plt section. */ - - s = bfd_get_section_by_name (dynobj, ".rela.plt"); - BFD_ASSERT (s != NULL); - s->_raw_size += sizeof (Elf32_External_Rela); - - return true; - } - - /* If this is a weak symbol, and there is a real definition, the - processor independent code will have arranged for us to see the - real definition first, and we can just use the same value. */ - if (h->weakdef != NULL) - { - BFD_ASSERT (h->weakdef->root.type == bfd_link_hash_defined - || h->weakdef->root.type == bfd_link_hash_defweak); - h->root.u.def.section = h->weakdef->root.u.def.section; - h->root.u.def.value = h->weakdef->root.u.def.value; - return true; - } - - /* This is a reference to a symbol defined by a dynamic object which - is not a function. */ - - /* If we are creating a shared library, we must presume that the - only references to the symbol are via the global offset table. - For such cases we need not do anything here; the relocations will - be handled correctly by relocate_section. */ - if (info->shared) - return true; - - /* We must allocate the symbol in our .dynbss section, which will - become part of the .bss section of the executable. There will be - an entry for this symbol in the .dynsym section. The dynamic - object will contain position independent code, so all references - from the dynamic object to this symbol will go through the global - offset table. The dynamic linker will use the .dynsym entry to - determine the address it must put in the global offset table, so - both the dynamic object and the regular object will refer to the - same memory location for the variable. */ - - s = bfd_get_section_by_name (dynobj, ".dynbss"); - BFD_ASSERT (s != NULL); - - /* If the symbol is currently defined in the .bss section of the - dynamic object, then it is OK to simply initialize it to zero. - If the symbol is in some other section, we must generate a - R_SPARC_COPY reloc to tell the dynamic linker to copy the initial - value out of the dynamic object and into the runtime process - image. We need to remember the offset into the .rel.bss section - we are going to use. */ - if ((h->root.u.def.section->flags & SEC_LOAD) != 0) - { - asection *srel; - - srel = bfd_get_section_by_name (dynobj, ".rela.bss"); - BFD_ASSERT (srel != NULL); - srel->_raw_size += sizeof (Elf32_External_Rela); - h->elf_link_hash_flags |= ELF_LINK_HASH_NEEDS_COPY; - } - - /* We need to figure out the alignment required for this symbol. I - have no idea how ELF linkers handle this. */ - power_of_two = bfd_log2 (h->size); - if (power_of_two > 3) - power_of_two = 3; - - /* Apply the required alignment. */ - s->_raw_size = BFD_ALIGN (s->_raw_size, - (bfd_size_type) (1 << power_of_two)); - if (power_of_two > bfd_get_section_alignment (dynobj, s)) - { - if (! bfd_set_section_alignment (dynobj, s, power_of_two)) - return false; - } - - /* Define the symbol as being at this point in the section. */ - h->root.u.def.section = s; - h->root.u.def.value = s->_raw_size; - - /* Increment the section size to make room for the symbol. */ - s->_raw_size += h->size; - - return true; -} - -/* Set the sizes of the dynamic sections. */ - -static boolean -elf32_sparc_size_dynamic_sections (output_bfd, info) - bfd *output_bfd; - struct bfd_link_info *info; -{ - bfd *dynobj; - asection *s; - boolean reltext; - boolean relplt; - - dynobj = elf_hash_table (info)->dynobj; - BFD_ASSERT (dynobj != NULL); - - if (elf_hash_table (info)->dynamic_sections_created) - { - /* Set the contents of the .interp section to the interpreter. */ - if (! info->shared) - { - s = bfd_get_section_by_name (dynobj, ".interp"); - BFD_ASSERT (s != NULL); - s->_raw_size = sizeof ELF_DYNAMIC_INTERPRETER; - s->contents = (unsigned char *) ELF_DYNAMIC_INTERPRETER; - } - - /* Make space for the trailing nop in .plt. */ - s = bfd_get_section_by_name (dynobj, ".plt"); - BFD_ASSERT (s != NULL); - if (s->_raw_size > 0) - s->_raw_size += 4; - } - else - { - /* We may have created entries in the .rela.got section. - However, if we are not creating the dynamic sections, we will - not actually use these entries. Reset the size of .rela.got, - which will cause it to get stripped from the output file - below. */ - s = bfd_get_section_by_name (dynobj, ".rela.got"); - if (s != NULL) - s->_raw_size = 0; - } - - /* The check_relocs and adjust_dynamic_symbol entry points have - determined the sizes of the various dynamic sections. Allocate - memory for them. */ - reltext = false; - relplt = false; - for (s = dynobj->sections; s != NULL; s = s->next) - { - const char *name; - boolean strip; - - if ((s->flags & SEC_IN_MEMORY) == 0) - continue; - - /* It's OK to base decisions on the section name, because none - of the dynobj section names depend upon the input files. */ - name = bfd_get_section_name (dynobj, s); - - strip = false; - - if (strncmp (name, ".rela", 5) == 0) - { - if (s->_raw_size == 0) - { - /* If we don't need this section, strip it from the - output file. This is to handle .rela.bss and - .rel.plt. We must create it in - create_dynamic_sections, because it must be created - before the linker maps input sections to output - sections. The linker does that before - adjust_dynamic_symbol is called, and it is that - function which decides whether anything needs to go - into these sections. */ - strip = true; - } - else - { - asection *target; - - /* If this relocation section applies to a read only - section, then we probably need a DT_TEXTREL entry. */ - target = bfd_get_section_by_name (output_bfd, name + 5); - if (target != NULL - && (target->flags & SEC_READONLY) != 0) - reltext = true; - - if (strcmp (name, ".rela.plt") == 0) - relplt = true; - - /* We use the reloc_count field as a counter if we need - to copy relocs into the output file. */ - s->reloc_count = 0; - } - } - else if (strcmp (name, ".plt") != 0 - && strcmp (name, ".got") != 0) - { - /* It's not one of our sections, so don't allocate space. */ - continue; - } - - if (strip) - { - asection **spp; - - for (spp = &s->output_section->owner->sections; - *spp != s->output_section; - spp = &(*spp)->next) - ; - *spp = s->output_section->next; - --s->output_section->owner->section_count; - - continue; - } - - /* Allocate memory for the section contents. */ - s->contents = (bfd_byte *) bfd_alloc (dynobj, s->_raw_size); - if (s->contents == NULL && s->_raw_size != 0) - return false; - } - - if (elf_hash_table (info)->dynamic_sections_created) - { - /* Add some entries to the .dynamic section. We fill in the - values later, in elf32_sparc_finish_dynamic_sections, but we - must add the entries now so that we get the correct size for - the .dynamic section. The DT_DEBUG entry is filled in by the - dynamic linker and used by the debugger. */ - if (! info->shared) - { - if (! bfd_elf32_add_dynamic_entry (info, DT_DEBUG, 0)) - return false; - } - - if (! bfd_elf32_add_dynamic_entry (info, DT_PLTGOT, 0)) - return false; - - if (relplt) - { - if (! bfd_elf32_add_dynamic_entry (info, DT_PLTRELSZ, 0) - || ! bfd_elf32_add_dynamic_entry (info, DT_PLTREL, DT_RELA) - || ! bfd_elf32_add_dynamic_entry (info, DT_JMPREL, 0)) - return false; - } - - if (! bfd_elf32_add_dynamic_entry (info, DT_RELA, 0) - || ! bfd_elf32_add_dynamic_entry (info, DT_RELASZ, 0) - || ! bfd_elf32_add_dynamic_entry (info, DT_RELAENT, - sizeof (Elf32_External_Rela))) - return false; - - if (reltext) - { - if (! bfd_elf32_add_dynamic_entry (info, DT_TEXTREL, 0)) - return false; - } - } - - /* If we are generating a shared library, we generate a section - symbol for each output section. These are local symbols, which - means that they must come first in the dynamic symbol table. - That means we must increment the dynamic symbol index of every - other dynamic symbol. */ - if (info->shared) - { - int c, i; - - c = bfd_count_sections (output_bfd); - elf_link_hash_traverse (elf_hash_table (info), - elf32_sparc_adjust_dynindx, - (PTR) &c); - elf_hash_table (info)->dynsymcount += c; - - for (i = 1, s = output_bfd->sections; s != NULL; s = s->next, i++) - { - elf_section_data (s)->dynindx = i; - /* These symbols will have no names, so we don't need to - fiddle with dynstr_index. */ - } - } - - return true; -} - -/* Increment the index of a dynamic symbol by a given amount. Called - via elf_link_hash_traverse. */ - -static boolean -elf32_sparc_adjust_dynindx (h, cparg) - struct elf_link_hash_entry *h; - PTR cparg; -{ - int *cp = (int *) cparg; - - if (h->dynindx != -1) - h->dynindx += *cp; - return true; -} - -/* Relocate a SPARC ELF section. */ - -static boolean -elf32_sparc_relocate_section (output_bfd, info, input_bfd, input_section, - contents, relocs, local_syms, local_sections) - bfd *output_bfd; - struct bfd_link_info *info; - bfd *input_bfd; - asection *input_section; - bfd_byte *contents; - Elf_Internal_Rela *relocs; - Elf_Internal_Sym *local_syms; - asection **local_sections; -{ - bfd *dynobj; - Elf_Internal_Shdr *symtab_hdr; - struct elf_link_hash_entry **sym_hashes; - bfd_vma *local_got_offsets; - asection *sgot; - asection *splt; - asection *sreloc; - Elf_Internal_Rela *rel; - Elf_Internal_Rela *relend; - - dynobj = elf_hash_table (info)->dynobj; - symtab_hdr = &elf_tdata (input_bfd)->symtab_hdr; - sym_hashes = elf_sym_hashes (input_bfd); - local_got_offsets = elf_local_got_offsets (input_bfd); - - sgot = NULL; - splt = NULL; - sreloc = NULL; - - rel = relocs; - relend = relocs + input_section->reloc_count; - for (; rel < relend; rel++) - { - int r_type; - reloc_howto_type *howto; - unsigned long r_symndx; - struct elf_link_hash_entry *h; - Elf_Internal_Sym *sym; - asection *sec; - bfd_vma relocation; - bfd_reloc_status_type r; - - r_type = ELF32_R_TYPE (rel->r_info); - if (r_type < 0 || r_type >= (int) R_SPARC_max) - { - bfd_set_error (bfd_error_bad_value); - return false; - } - howto = _bfd_sparc_elf_howto_table + r_type; - - r_symndx = ELF32_R_SYM (rel->r_info); - - if (info->relocateable) - { - /* This is a relocateable link. We don't have to change - anything, unless the reloc is against a section symbol, - in which case we have to adjust according to where the - section symbol winds up in the output section. */ - if (r_symndx < symtab_hdr->sh_info) - { - sym = local_syms + r_symndx; - if (ELF_ST_TYPE (sym->st_info) == STT_SECTION) - { - sec = local_sections[r_symndx]; - rel->r_addend += sec->output_offset + sym->st_value; - } - } - - continue; - } - - /* This is a final link. */ - h = NULL; - sym = NULL; - sec = NULL; - if (r_symndx < symtab_hdr->sh_info) - { - sym = local_syms + r_symndx; - sec = local_sections[r_symndx]; - relocation = (sec->output_section->vma - + sec->output_offset - + sym->st_value); - } - else - { - h = sym_hashes[r_symndx - symtab_hdr->sh_info]; - while (h->root.type == bfd_link_hash_indirect - || h->root.type == bfd_link_hash_warning) - h = (struct elf_link_hash_entry *) h->root.u.i.link; - if (h->root.type == bfd_link_hash_defined - || h->root.type == bfd_link_hash_defweak) - { - sec = h->root.u.def.section; - if ((r_type == R_SPARC_WPLT30 - && h->plt_offset != (bfd_vma) -1) - || ((r_type == R_SPARC_GOT10 - || r_type == R_SPARC_GOT13 - || r_type == R_SPARC_GOT22) - && elf_hash_table (info)->dynamic_sections_created - && (! info->shared - || ! info->symbolic - || (h->elf_link_hash_flags - & ELF_LINK_HASH_DEF_REGULAR) == 0)) - || (info->shared - && (! info->symbolic - || (h->elf_link_hash_flags - & ELF_LINK_HASH_DEF_REGULAR) == 0) - && (input_section->flags & SEC_ALLOC) != 0 - && (r_type == R_SPARC_8 - || r_type == R_SPARC_16 - || r_type == R_SPARC_32 - || r_type == R_SPARC_DISP8 - || r_type == R_SPARC_DISP16 - || r_type == R_SPARC_DISP32 - || r_type == R_SPARC_WDISP30 - || r_type == R_SPARC_WDISP22 - || r_type == R_SPARC_WDISP19 - || r_type == R_SPARC_WDISP16 - || r_type == R_SPARC_HI22 - || r_type == R_SPARC_22 - || r_type == R_SPARC_13 - || r_type == R_SPARC_LO10 - || r_type == R_SPARC_UA32 - || ((r_type == R_SPARC_PC10 - || r_type == R_SPARC_PC22) - && strcmp (h->root.root.string, - "_GLOBAL_OFFSET_TABLE_") != 0)))) - { - /* In these cases, we don't need the relocation - value. We check specially because in some - obscure cases sec->output_section will be NULL. */ - relocation = 0; - } - else - relocation = (h->root.u.def.value - + sec->output_section->vma - + sec->output_offset); - } - else if (h->root.type == bfd_link_hash_undefweak) - relocation = 0; - else if (info->shared && !info->symbolic) - relocation = 0; - else - { - if (! ((*info->callbacks->undefined_symbol) - (info, h->root.root.string, input_bfd, - input_section, rel->r_offset))) - return false; - relocation = 0; - } - } - - switch (r_type) - { - case R_SPARC_GOT10: - case R_SPARC_GOT13: - case R_SPARC_GOT22: - /* Relocation is to the entry for this symbol in the global - offset table. */ - if (sgot == NULL) - { - sgot = bfd_get_section_by_name (dynobj, ".got"); - BFD_ASSERT (sgot != NULL); - } - - if (h != NULL) - { - bfd_vma off; - - off = h->got_offset; - BFD_ASSERT (off != (bfd_vma) -1); - - if (! elf_hash_table (info)->dynamic_sections_created - || (info->shared - && info->symbolic - && (h->elf_link_hash_flags & ELF_LINK_HASH_DEF_REGULAR))) - { - /* This is actually a static link, or it is a - -Bsymbolic link and the symbol is defined - locally. We must initialize this entry in the - global offset table. Since the offset must - always be a multiple of 4, we use the least - significant bit to record whether we have - initialized it already. - - When doing a dynamic link, we create a .rela.got - relocation entry to initialize the value. This - is done in the finish_dynamic_symbol routine. */ - if ((off & 1) != 0) - off &= ~1; - else - { - bfd_put_32 (output_bfd, relocation, - sgot->contents + off); - h->got_offset |= 1; - } - } - - relocation = sgot->output_offset + off; - } - else - { - bfd_vma off; - - BFD_ASSERT (local_got_offsets != NULL - && local_got_offsets[r_symndx] != (bfd_vma) -1); - - off = local_got_offsets[r_symndx]; - - /* The offset must always be a multiple of 4. We use - the least significant bit to record whether we have - already processed this entry. */ - if ((off & 1) != 0) - off &= ~1; - else - { - bfd_put_32 (output_bfd, relocation, sgot->contents + off); - - if (info->shared) - { - asection *srelgot; - Elf_Internal_Rela outrel; - - /* We need to generate a R_SPARC_RELATIVE reloc - for the dynamic linker. */ - srelgot = bfd_get_section_by_name (dynobj, ".rela.got"); - BFD_ASSERT (srelgot != NULL); - - outrel.r_offset = (sgot->output_section->vma - + sgot->output_offset - + off); - outrel.r_info = ELF32_R_INFO (0, R_SPARC_RELATIVE); - outrel.r_addend = 0; - bfd_elf32_swap_reloca_out (output_bfd, &outrel, - (((Elf32_External_Rela *) - srelgot->contents) - + srelgot->reloc_count)); - ++srelgot->reloc_count; - } - - local_got_offsets[r_symndx] |= 1; - } - - relocation = sgot->output_offset + off; - } - - break; - - case R_SPARC_WPLT30: - /* Relocation is to the entry for this symbol in the - procedure linkage table. */ - BFD_ASSERT (h != NULL); - - if (h->plt_offset == (bfd_vma) -1) - { - /* We didn't make a PLT entry for this symbol. This - happens when statically linking PIC code, or when - using -Bsymbolic. */ - break; - } - - if (splt == NULL) - { - splt = bfd_get_section_by_name (dynobj, ".plt"); - BFD_ASSERT (splt != NULL); - } - - relocation = (splt->output_section->vma - + splt->output_offset - + h->plt_offset); - break; - - case R_SPARC_PC10: - case R_SPARC_PC22: - if (h != NULL - && strcmp (h->root.root.string, "_GLOBAL_OFFSET_TABLE_") == 0) - break; - /* Fall through. */ - case R_SPARC_DISP8: - case R_SPARC_DISP16: - case R_SPARC_DISP32: - case R_SPARC_WDISP30: - case R_SPARC_WDISP22: - case R_SPARC_WDISP19: - case R_SPARC_WDISP16: - if (h == NULL) - break; - /* Fall through. */ - case R_SPARC_8: - case R_SPARC_16: - case R_SPARC_32: - case R_SPARC_HI22: - case R_SPARC_22: - case R_SPARC_13: - case R_SPARC_LO10: - case R_SPARC_UA32: - if (info->shared - && (input_section->flags & SEC_ALLOC) != 0) - { - Elf_Internal_Rela outrel; - - /* When generating a shared object, these relocations - are copied into the output file to be resolved at run - time. */ - - if (sreloc == NULL) - { - const char *name; - - name = (bfd_elf_string_from_elf_section - (input_bfd, - elf_elfheader (input_bfd)->e_shstrndx, - elf_section_data (input_section)->rel_hdr.sh_name)); - if (name == NULL) - return false; - - BFD_ASSERT (strncmp (name, ".rela", 5) == 0 - && strcmp (bfd_get_section_name (input_bfd, - input_section), - name + 5) == 0); - - sreloc = bfd_get_section_by_name (dynobj, name); - BFD_ASSERT (sreloc != NULL); - } - - outrel.r_offset = (rel->r_offset - + input_section->output_section->vma - + input_section->output_offset); - if (h != NULL - && (! info->symbolic - || (h->elf_link_hash_flags - & ELF_LINK_HASH_DEF_REGULAR) == 0)) - { - BFD_ASSERT (h->dynindx != -1); - outrel.r_info = ELF32_R_INFO (h->dynindx, r_type); - outrel.r_addend = rel->r_addend; - } - else - { - if (r_type == R_SPARC_32) - { - outrel.r_info = ELF32_R_INFO (0, R_SPARC_RELATIVE); - outrel.r_addend = relocation + rel->r_addend; - } - else - { - long indx; - - if (h == NULL) - sec = local_sections[r_symndx]; - else - { - BFD_ASSERT (h->root.type == bfd_link_hash_defined - || (h->root.type - == bfd_link_hash_defweak)); - sec = h->root.u.def.section; - } - if (sec != NULL && bfd_is_abs_section (sec)) - indx = 0; - else if (sec == NULL || sec->owner == NULL) - { - bfd_set_error (bfd_error_bad_value); - return false; - } - else - { - asection *osec; - - osec = sec->output_section; - indx = elf_section_data (osec)->dynindx; - if (indx == 0) - abort (); - } - - outrel.r_info = ELF32_R_INFO (indx, r_type); - outrel.r_addend = relocation + rel->r_addend; - } - } - - bfd_elf32_swap_reloca_out (output_bfd, &outrel, - (((Elf32_External_Rela *) - sreloc->contents) - + sreloc->reloc_count)); - ++sreloc->reloc_count; - - /* This reloc will be computed at runtime, so there's no - need to do anything now. */ - continue; - } - - default: - break; - } - - if (r_type != R_SPARC_WDISP16) - r = _bfd_final_link_relocate (howto, input_bfd, input_section, - contents, rel->r_offset, - relocation, rel->r_addend); - else - { - bfd_vma x; - - relocation += rel->r_addend; - relocation -= (input_section->output_section->vma - + input_section->output_offset); - relocation -= rel->r_offset; - - x = bfd_get_32 (input_bfd, contents + rel->r_offset); - x |= ((((relocation >> 2) & 0xc000) << 6) - | ((relocation >> 2) & 0x3fff)); - bfd_put_32 (input_bfd, x, contents + rel->r_offset); - - if ((bfd_signed_vma) relocation < - 0x40000 - || (bfd_signed_vma) relocation > 0x3ffff) - r = bfd_reloc_overflow; - else - r = bfd_reloc_ok; - } - - if (r != bfd_reloc_ok) - { - switch (r) - { - default: - case bfd_reloc_outofrange: - abort (); - case bfd_reloc_overflow: - { - const char *name; - - if (h != NULL) - name = h->root.root.string; - else - { - name = bfd_elf_string_from_elf_section (input_bfd, - symtab_hdr->sh_link, - sym->st_name); - if (name == NULL) - return false; - if (*name == '\0') - name = bfd_section_name (input_bfd, sec); - } - if (! ((*info->callbacks->reloc_overflow) - (info, name, howto->name, (bfd_vma) 0, - input_bfd, input_section, rel->r_offset))) - return false; - } - break; - } - } - } - - return true; -} - -/* Finish up dynamic symbol handling. We set the contents of various - dynamic sections here. */ - -static boolean -elf32_sparc_finish_dynamic_symbol (output_bfd, info, h, sym) - bfd *output_bfd; - struct bfd_link_info *info; - struct elf_link_hash_entry *h; - Elf_Internal_Sym *sym; -{ - bfd *dynobj; - - dynobj = elf_hash_table (info)->dynobj; - - if (h->plt_offset != (bfd_vma) -1) - { - asection *splt; - asection *srela; - Elf_Internal_Rela rela; - - /* This symbol has an entry in the procedure linkage table. Set - it up. */ - - BFD_ASSERT (h->dynindx != -1); - - splt = bfd_get_section_by_name (dynobj, ".plt"); - srela = bfd_get_section_by_name (dynobj, ".rela.plt"); - BFD_ASSERT (splt != NULL && srela != NULL); - - /* Fill in the entry in the procedure linkage table. */ - bfd_put_32 (output_bfd, - PLT_ENTRY_WORD0 + h->plt_offset, - splt->contents + h->plt_offset); - bfd_put_32 (output_bfd, - (PLT_ENTRY_WORD1 - + (((- (h->plt_offset + 4)) >> 2) & 0x3fffff)), - splt->contents + h->plt_offset + 4); - bfd_put_32 (output_bfd, PLT_ENTRY_WORD2, - splt->contents + h->plt_offset + 8); - - /* Fill in the entry in the .rela.plt section. */ - rela.r_offset = (splt->output_section->vma - + splt->output_offset - + h->plt_offset); - rela.r_info = ELF32_R_INFO (h->dynindx, R_SPARC_JMP_SLOT); - rela.r_addend = 0; - bfd_elf32_swap_reloca_out (output_bfd, &rela, - ((Elf32_External_Rela *) srela->contents - + h->plt_offset / PLT_ENTRY_SIZE - 4)); - - if ((h->elf_link_hash_flags & ELF_LINK_HASH_DEF_REGULAR) == 0) - { - /* Mark the symbol as undefined, rather than as defined in - the .plt section. Leave the value alone. */ - sym->st_shndx = SHN_UNDEF; - } - } - - if (h->got_offset != (bfd_vma) -1) - { - asection *sgot; - asection *srela; - Elf_Internal_Rela rela; - - /* This symbol has an entry in the global offset table. Set it - up. */ - - BFD_ASSERT (h->dynindx != -1); - - sgot = bfd_get_section_by_name (dynobj, ".got"); - srela = bfd_get_section_by_name (dynobj, ".rela.got"); - BFD_ASSERT (sgot != NULL && srela != NULL); - - rela.r_offset = (sgot->output_section->vma - + sgot->output_offset - + (h->got_offset &~ 1)); - - /* If this is a -Bsymbolic link, and the symbol is defined - locally, we just want to emit a RELATIVE reloc. The entry in - the global offset table will already have been initialized in - the relocate_section function. */ - if (info->shared - && info->symbolic - && (h->elf_link_hash_flags & ELF_LINK_HASH_DEF_REGULAR)) - rela.r_info = ELF32_R_INFO (0, R_SPARC_RELATIVE); - else - { - bfd_put_32 (output_bfd, (bfd_vma) 0, sgot->contents + h->got_offset); - rela.r_info = ELF32_R_INFO (h->dynindx, R_SPARC_GLOB_DAT); - } - - rela.r_addend = 0; - bfd_elf32_swap_reloca_out (output_bfd, &rela, - ((Elf32_External_Rela *) srela->contents - + srela->reloc_count)); - ++srela->reloc_count; - } - - if ((h->elf_link_hash_flags & ELF_LINK_HASH_NEEDS_COPY) != 0) - { - asection *s; - Elf_Internal_Rela rela; - - /* This symbols needs a copy reloc. Set it up. */ - - BFD_ASSERT (h->dynindx != -1); - - s = bfd_get_section_by_name (h->root.u.def.section->owner, - ".rela.bss"); - BFD_ASSERT (s != NULL); - - rela.r_offset = (h->root.u.def.value - + h->root.u.def.section->output_section->vma - + h->root.u.def.section->output_offset); - rela.r_info = ELF32_R_INFO (h->dynindx, R_SPARC_COPY); - rela.r_addend = 0; - bfd_elf32_swap_reloca_out (output_bfd, &rela, - ((Elf32_External_Rela *) s->contents - + s->reloc_count)); - ++s->reloc_count; - } - - /* Mark some specially defined symbols as absolute. */ - if (strcmp (h->root.root.string, "_DYNAMIC") == 0 - || strcmp (h->root.root.string, "_GLOBAL_OFFSET_TABLE_") == 0 - || strcmp (h->root.root.string, "_PROCEDURE_LINKAGE_TABLE_") == 0) - sym->st_shndx = SHN_ABS; - - return true; -} - -/* Finish up the dynamic sections. */ - -static boolean -elf32_sparc_finish_dynamic_sections (output_bfd, info) - bfd *output_bfd; - struct bfd_link_info *info; -{ - bfd *dynobj; - asection *sdyn; - asection *sgot; - - dynobj = elf_hash_table (info)->dynobj; - - sdyn = bfd_get_section_by_name (dynobj, ".dynamic"); - - if (elf_hash_table (info)->dynamic_sections_created) - { - asection *splt; - Elf32_External_Dyn *dyncon, *dynconend; - - splt = bfd_get_section_by_name (dynobj, ".plt"); - BFD_ASSERT (splt != NULL && sdyn != NULL); - - dyncon = (Elf32_External_Dyn *) sdyn->contents; - dynconend = (Elf32_External_Dyn *) (sdyn->contents + sdyn->_raw_size); - for (; dyncon < dynconend; dyncon++) - { - Elf_Internal_Dyn dyn; - const char *name; - boolean size; - - bfd_elf32_swap_dyn_in (dynobj, dyncon, &dyn); - - switch (dyn.d_tag) - { - case DT_PLTGOT: name = ".plt"; size = false; break; - case DT_PLTRELSZ: name = ".rela.plt"; size = true; break; - case DT_JMPREL: name = ".rela.plt"; size = false; break; - default: name = NULL; size = false; break; - } - - if (name != NULL) - { - asection *s; - - s = bfd_get_section_by_name (output_bfd, name); - if (s == NULL) - dyn.d_un.d_val = 0; - else - { - if (! size) - dyn.d_un.d_ptr = s->vma; - else - { - if (s->_cooked_size != 0) - dyn.d_un.d_val = s->_cooked_size; - else - dyn.d_un.d_val = s->_raw_size; - } - } - bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon); - } - } - - /* Clear the first four entries in the procedure linkage table, - and put a nop in the last four bytes. */ - if (splt->_raw_size > 0) - { - memset (splt->contents, 0, 4 * PLT_ENTRY_SIZE); - bfd_put_32 (output_bfd, SPARC_NOP, - splt->contents + splt->_raw_size - 4); - } - - elf_section_data (splt->output_section)->this_hdr.sh_entsize = - PLT_ENTRY_SIZE; - } - - /* Set the first entry in the global offset table to the address of - the dynamic section. */ - sgot = bfd_get_section_by_name (dynobj, ".got"); - BFD_ASSERT (sgot != NULL); - if (sgot->_raw_size > 0) - { - if (sdyn == NULL) - bfd_put_32 (output_bfd, (bfd_vma) 0, sgot->contents); - else - bfd_put_32 (output_bfd, - sdyn->output_section->vma + sdyn->output_offset, - sgot->contents); - } - - elf_section_data (sgot->output_section)->this_hdr.sh_entsize = 4; - - if (info->shared) - { - asection *sdynsym; - asection *s; - Elf_Internal_Sym sym; - - /* Set up the section symbols for the output sections. */ - - sdynsym = bfd_get_section_by_name (dynobj, ".dynsym"); - BFD_ASSERT (sdynsym != NULL); - - sym.st_size = 0; - sym.st_name = 0; - sym.st_info = ELF_ST_INFO (STB_LOCAL, STT_SECTION); - sym.st_other = 0; - - for (s = output_bfd->sections; s != NULL; s = s->next) - { - int indx; - - sym.st_value = s->vma; - - indx = elf_section_data (s)->this_idx; - BFD_ASSERT (indx > 0); - sym.st_shndx = indx; - - bfd_elf32_swap_symbol_out (output_bfd, &sym, - (PTR) (((Elf32_External_Sym *) - sdynsym->contents) - + elf_section_data (s)->dynindx)); - } - - /* Set the sh_info field of the output .dynsym section to the - index of the first global symbol. */ - elf_section_data (sdynsym->output_section)->this_hdr.sh_info = - bfd_count_sections (output_bfd) + 1; - } - - return true; -} - -/* Functions for dealing with the e_flags field. - - We don't define set_private_flags or copy_private_bfd_data because - the only currently defined values are based on the bfd mach number, - so we use the latter instead and defer setting e_flags until the - file is written out. */ - -/* Merge backend specific data from an object file to the output - object file when linking. */ - -static boolean -elf32_sparc_merge_private_bfd_data (ibfd, obfd) - bfd *ibfd; - bfd *obfd; -{ - boolean error; - - /* This function is selected based on the input vector. We only - want to copy information over if the output BFD also uses Elf - format. */ - if (bfd_get_flavour (obfd) != bfd_target_elf_flavour) - return true; - - error = false; - -#if 0 - /* ??? The native linker doesn't do this so we can't (otherwise gcc would - have to know which linker is being used). Instead, the native linker - bumps up the architecture level when it has to. However, I still think - warnings like these are good, so it would be nice to have them turned on - by some option. */ - - /* If the output machine is normal sparc, we can't allow v9 input files. */ - if (bfd_get_mach (obfd) == bfd_mach_sparc - && (bfd_get_mach (ibfd) == bfd_mach_sparc_v8plus - || bfd_get_mach (ibfd) == bfd_mach_sparc_v8plusa)) - { - error = true; - (*_bfd_error_handler) - ("%s: compiled for a v8plus system and target is v8", - bfd_get_filename (ibfd)); - } - /* If the output machine is v9, we can't allow v9+vis input files. */ - if (bfd_get_mach (obfd) == bfd_mach_sparc_v8plus - && bfd_get_mach (ibfd) == bfd_mach_sparc_v8plusa) - { - error = true; - (*_bfd_error_handler) - ("%s: compiled for a v8plusa system and target is v8plus", - bfd_get_filename (ibfd)); - } -#else - if (bfd_get_mach (ibfd) >= bfd_mach_sparc_v9) - { - error = true; - (*_bfd_error_handler) - ("%s: compiled for a 64 bit system and target is 32 bit", - bfd_get_filename (ibfd)); - } - else if (bfd_get_mach (obfd) < bfd_get_mach (ibfd)) - bfd_set_arch_mach (obfd, bfd_arch_sparc, bfd_get_mach (ibfd)); -#endif - - if (error) - { - bfd_set_error (bfd_error_bad_value); - return false; - } - - return true; -} - -/* Set the right machine number. */ - -static boolean -elf32_sparc_object_p (abfd) - bfd *abfd; -{ - if (elf_elfheader (abfd)->e_machine == EM_SPARC32PLUS) - { - if (elf_elfheader (abfd)->e_flags & EF_SPARC_SUN_US1) - return bfd_default_set_arch_mach (abfd, bfd_arch_sparc, - bfd_mach_sparc_v8plusa); - else if (elf_elfheader (abfd)->e_flags & EF_SPARC_32PLUS) - return bfd_default_set_arch_mach (abfd, bfd_arch_sparc, - bfd_mach_sparc_v8plus); - else - return false; - } - else - return bfd_default_set_arch_mach (abfd, bfd_arch_sparc, bfd_mach_sparc); -} - -/* The final processing done just before writing out the object file. - We need to set the e_machine field appropriately. */ - -static void -elf32_sparc_final_write_processing (abfd, linker) - bfd *abfd; - boolean linker; -{ - switch (bfd_get_mach (abfd)) - { - case bfd_mach_sparc : - break; /* nothing to do */ - case bfd_mach_sparc_v8plus : - elf_elfheader (abfd)->e_machine = EM_SPARC32PLUS; - elf_elfheader (abfd)->e_flags &=~ EF_SPARC_32PLUS_MASK; - elf_elfheader (abfd)->e_flags |= EF_SPARC_32PLUS; - break; - case bfd_mach_sparc_v8plusa : - elf_elfheader (abfd)->e_machine = EM_SPARC32PLUS; - elf_elfheader (abfd)->e_flags &=~ EF_SPARC_32PLUS_MASK; - elf_elfheader (abfd)->e_flags |= EF_SPARC_32PLUS | EF_SPARC_SUN_US1; - break; - default : - abort (); - } -} - -#define TARGET_BIG_SYM bfd_elf32_sparc_vec -#define TARGET_BIG_NAME "elf32-sparc" -#define ELF_ARCH bfd_arch_sparc -#define ELF_MACHINE_CODE EM_SPARC -#define ELF_MACHINE_ALT1 EM_SPARC32PLUS -#define ELF_MAXPAGESIZE 0x10000 - -#define bfd_elf32_bfd_reloc_type_lookup elf32_sparc_reloc_type_lookup -#define elf_backend_create_dynamic_sections \ - _bfd_elf_create_dynamic_sections -#define elf_backend_check_relocs elf32_sparc_check_relocs -#define elf_backend_adjust_dynamic_symbol \ - elf32_sparc_adjust_dynamic_symbol -#define elf_backend_size_dynamic_sections \ - elf32_sparc_size_dynamic_sections -#define elf_backend_relocate_section elf32_sparc_relocate_section -#define elf_backend_finish_dynamic_symbol \ - elf32_sparc_finish_dynamic_symbol -#define elf_backend_finish_dynamic_sections \ - elf32_sparc_finish_dynamic_sections -#define bfd_elf32_bfd_merge_private_bfd_data \ - elf32_sparc_merge_private_bfd_data -#define elf_backend_object_p elf32_sparc_object_p -#define elf_backend_final_write_processing \ - elf32_sparc_final_write_processing -#define elf_backend_want_got_plt 0 -#define elf_backend_plt_readonly 0 -#define elf_backend_want_plt_sym 1 - -#include "elf32-target.h" diff --git a/contrib/gdb/bfd/elf32.c b/contrib/gdb/bfd/elf32.c deleted file mode 100644 index f2229694406d4..0000000000000 --- a/contrib/gdb/bfd/elf32.c +++ /dev/null @@ -1,23 +0,0 @@ -/* ELF 32-bit executable support for BFD. - Copyright 1993 Free Software Foundation, Inc. - -This file is part of BFD, the Binary File Descriptor library. - -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 2 of the License, 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ - -#define ARCH_SIZE 32 - - -#include "elfcode.h" diff --git a/contrib/gdb/bfd/elf64-gen.c b/contrib/gdb/bfd/elf64-gen.c deleted file mode 100644 index 5daf4ee9f17de..0000000000000 --- a/contrib/gdb/bfd/elf64-gen.c +++ /dev/null @@ -1,37 +0,0 @@ -/* Generic support for 64-bit ELF - Copyright 1993 Free Software Foundation, Inc. - -This file is part of BFD, the Binary File Descriptor library. - -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 2 of the License, 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ - -#include "bfd.h" -#include "sysdep.h" -#include "libbfd.h" -#include "elf-bfd.h" - -/* This does not include any relocations, but should be good enough - for GDB to read the file. */ - -#define TARGET_LITTLE_SYM bfd_elf64_little_generic_vec -#define TARGET_LITTLE_NAME "elf64-little" -#define TARGET_BIG_SYM bfd_elf64_big_generic_vec -#define TARGET_BIG_NAME "elf64-big" -#define ELF_ARCH bfd_arch_unknown -#define ELF_MACHINE_CODE EM_NONE -#define bfd_elf64_bfd_reloc_type_lookup bfd_default_reloc_type_lookup -#define elf_info_to_howto _bfd_elf_no_info_to_howto - -#include "elf64-target.h" diff --git a/contrib/gdb/bfd/elf64-sparc.c b/contrib/gdb/bfd/elf64-sparc.c deleted file mode 100644 index 5059b803c62ef..0000000000000 --- a/contrib/gdb/bfd/elf64-sparc.c +++ /dev/null @@ -1,421 +0,0 @@ -/* SPARC-specific support for 64-bit ELF - Copyright (C) 1993, 1995, 1996 Free Software Foundation, Inc. - -This file is part of BFD, the Binary File Descriptor library. - -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 2 of the License, 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ - -/* We need a published ABI spec for this. Until one comes out, don't - assume this'll remain unchanged forever. */ - -#include "bfd.h" -#include "sysdep.h" -#include "libbfd.h" -#include "elf-bfd.h" - -#define SPARC64_OLD_RELOCS -#include "elf/sparc.h" - -static reloc_howto_type *sparc64_elf_reloc_type_lookup - PARAMS ((bfd *, bfd_reloc_code_real_type)); -static void elf_info_to_howto - PARAMS ((bfd *, arelent *, Elf_Internal_Rela *)); - -static boolean sparc64_elf_relocate_section - PARAMS ((bfd *, struct bfd_link_info *, bfd *, asection *, bfd_byte *, - Elf_Internal_Rela *, Elf_Internal_Sym *, asection **)); -static boolean sparc64_elf_object_p PARAMS ((bfd *)); - -/* The howto table and associated functions. - ??? Some of the relocation values have changed. Until we're ready - to upgrade, we have our own copy. At some point a non upward compatible - change will be made at which point this table can be deleted and we'll - use the one in elf32-sparc.c. */ - -static bfd_reloc_status_type sparc_elf_wdisp16_reloc - PARAMS ((bfd *, arelent *, asymbol *, PTR, asection *, bfd *, char **)); - -static reloc_howto_type sparc64_elf_howto_table[] = -{ - HOWTO(R_SPARC_NONE, 0,0, 0,false,0,complain_overflow_dont, bfd_elf_generic_reloc, "R_SPARC_NONE", false,0,0x00000000,true), - HOWTO(R_SPARC_8, 0,0, 8,false,0,complain_overflow_bitfield,bfd_elf_generic_reloc, "R_SPARC_8", false,0,0x000000ff,true), - HOWTO(R_SPARC_16, 0,1,16,false,0,complain_overflow_bitfield,bfd_elf_generic_reloc, "R_SPARC_16", false,0,0x0000ffff,true), - HOWTO(R_SPARC_32, 0,2,32,false,0,complain_overflow_bitfield,bfd_elf_generic_reloc, "R_SPARC_32", false,0,0xffffffff,true), - HOWTO(R_SPARC_DISP8, 0,0, 8,true, 0,complain_overflow_signed, bfd_elf_generic_reloc, "R_SPARC_DISP8", false,0,0x000000ff,true), - HOWTO(R_SPARC_DISP16, 0,1,16,true, 0,complain_overflow_signed, bfd_elf_generic_reloc, "R_SPARC_DISP16", false,0,0x0000ffff,true), - HOWTO(R_SPARC_DISP32, 0,2,32,true, 0,complain_overflow_signed, bfd_elf_generic_reloc, "R_SPARC_DISP32", false,0,0x00ffffff,true), - HOWTO(R_SPARC_WDISP30, 2,2,30,true, 0,complain_overflow_signed, bfd_elf_generic_reloc, "R_SPARC_WDISP30", false,0,0x3fffffff,true), - HOWTO(R_SPARC_WDISP22, 2,2,22,true, 0,complain_overflow_signed, bfd_elf_generic_reloc, "R_SPARC_WDISP22", false,0,0x003fffff,true), - HOWTO(R_SPARC_HI22, 10,2,22,false,0,complain_overflow_dont, bfd_elf_generic_reloc, "R_SPARC_HI22", false,0,0x003fffff,true), - HOWTO(R_SPARC_22, 0,2,22,false,0,complain_overflow_bitfield,bfd_elf_generic_reloc, "R_SPARC_22", false,0,0x003fffff,true), - HOWTO(R_SPARC_13, 0,2,13,false,0,complain_overflow_bitfield,bfd_elf_generic_reloc, "R_SPARC_13", false,0,0x00001fff,true), - HOWTO(R_SPARC_LO10, 0,2,10,false,0,complain_overflow_dont, bfd_elf_generic_reloc, "R_SPARC_LO10", false,0,0x000003ff,true), - HOWTO(R_SPARC_GOT10, 0,2,10,false,0,complain_overflow_dont, bfd_elf_generic_reloc, "R_SPARC_GOT10", false,0,0x000003ff,true), - HOWTO(R_SPARC_GOT13, 0,2,13,false,0,complain_overflow_signed, bfd_elf_generic_reloc, "R_SPARC_GOT13", false,0,0x00001fff,true), - HOWTO(R_SPARC_GOT22, 10,2,22,false,0,complain_overflow_dont, bfd_elf_generic_reloc, "R_SPARC_GOT22", false,0,0x003fffff,true), - HOWTO(R_SPARC_PC10, 0,2,10,true, 0,complain_overflow_dont, bfd_elf_generic_reloc, "R_SPARC_PC10", false,0,0x000003ff,true), - HOWTO(R_SPARC_PC22, 10,2,22,true, 0,complain_overflow_bitfield,bfd_elf_generic_reloc, "R_SPARC_PC22", false,0,0x003fffff,true), - HOWTO(R_SPARC_WPLT30, 2,2,30,true, 0,complain_overflow_signed, bfd_elf_generic_reloc, "R_SPARC_WPLT30", false,0,0x3fffffff,true), - HOWTO(R_SPARC_COPY, 0,0,00,false,0,complain_overflow_dont, bfd_elf_generic_reloc, "R_SPARC_COPY", false,0,0x00000000,true), - HOWTO(R_SPARC_GLOB_DAT, 0,0,00,false,0,complain_overflow_dont, bfd_elf_generic_reloc, "R_SPARC_GLOB_DAT",false,0,0x00000000,true), - HOWTO(R_SPARC_JMP_SLOT, 0,0,00,false,0,complain_overflow_dont, bfd_elf_generic_reloc, "R_SPARC_JMP_SLOT",false,0,0x00000000,true), - HOWTO(R_SPARC_RELATIVE, 0,0,00,false,0,complain_overflow_dont, bfd_elf_generic_reloc, "R_SPARC_RELATIVE",false,0,0x00000000,true), - HOWTO(R_SPARC_UA32, 0,0,00,false,0,complain_overflow_dont, bfd_elf_generic_reloc, "R_SPARC_UA32", false,0,0x00000000,true), -#if 0 /* not used yet */ - HOWTO(R_SPARC_PLT32, 0,0,00,false,0,complain_overflow_dont, sparc_elf_notsupported_reloc, "R_SPARC_PLT32", false,0,0x00000000,true), - HOWTO(R_SPARC_HIPLT22, 0,0,00,false,0,complain_overflow_dont, sparc_elf_notsupported_reloc, "R_SPARC_HIPLT22", false,0,0x00000000,true), - HOWTO(R_SPARC_LOPLT10, 0,0,00,false,0,complain_overflow_dont, sparc_elf_notsupported_reloc, "R_SPARC_LOPLT10", false,0,0x00000000,true), - HOWTO(R_SPARC_PCPLT32, 0,0,00,false,0,complain_overflow_dont, sparc_elf_notsupported_reloc, "R_SPARC_PCPLT32", false,0,0x00000000,true), - HOWTO(R_SPARC_PCPLT22, 0,0,00,false,0,complain_overflow_dont, sparc_elf_notsupported_reloc, "R_SPARC_PCPLT22", false,0,0x00000000,true), - HOWTO(R_SPARC_PCPLT10, 0,0,00,false,0,complain_overflow_dont, sparc_elf_notsupported_reloc, "R_SPARC_PCPLT10", false,0,0x00000000,true), -#endif - HOWTO(R_SPARC_10, 0,2,10,false,0,complain_overflow_bitfield,bfd_elf_generic_reloc, "R_SPARC_10", false,0,0x000003ff,true), - HOWTO(R_SPARC_11, 0,2,11,false,0,complain_overflow_bitfield,bfd_elf_generic_reloc, "R_SPARC_11", false,0,0x000007ff,true), - HOWTO(R_SPARC_64, 0,4,00,false,0,complain_overflow_bitfield,bfd_elf_generic_reloc, "R_SPARC_64", false,0,~ (bfd_vma) 0, true), - HOWTO(R_SPARC_OLO10, 0,2,10,false,0,complain_overflow_dont, bfd_elf_generic_reloc, "R_SPARC_OLO10", false,0,0x000003ff,true), - HOWTO(R_SPARC_HH22, 42,2,22,false,0,complain_overflow_dont, bfd_elf_generic_reloc, "R_SPARC_HH22", false,0,0x003fffff,true), - HOWTO(R_SPARC_HM10, 32,2,10,false,0,complain_overflow_dont, bfd_elf_generic_reloc, "R_SPARC_HM10", false,0,0x000003ff,true), - HOWTO(R_SPARC_LM22, 10,2,22,false,0,complain_overflow_dont, bfd_elf_generic_reloc, "R_SPARC_LM22", false,0,0x003fffff,true), - HOWTO(R_SPARC_PC_HH22, 42,2,22,true, 0,complain_overflow_dont, bfd_elf_generic_reloc, "R_SPARC_HH22", false,0,0x003fffff,true), - HOWTO(R_SPARC_PC_HM10, 32,2,10,true, 0,complain_overflow_dont, bfd_elf_generic_reloc, "R_SPARC_HM10", false,0,0x000003ff,true), - HOWTO(R_SPARC_PC_LM22, 10,2,22,true, 0,complain_overflow_dont, bfd_elf_generic_reloc, "R_SPARC_LM22", false,0,0x003fffff,true), - HOWTO(R_SPARC_WDISP16, 2,2,16,true, 0,complain_overflow_signed, sparc_elf_wdisp16_reloc,"R_SPARC_WDISP16", false,0,0x00000000,true), - HOWTO(R_SPARC_WDISP19, 2,2,22,true, 0,complain_overflow_signed, bfd_elf_generic_reloc, "R_SPARC_WDISP19", false,0,0x0007ffff,true), - HOWTO(R_SPARC_GLOB_JMP, 0,0,00,false,0,complain_overflow_dont, bfd_elf_generic_reloc, "R_SPARC_GLOB_DAT",false,0,0x00000000,true), - HOWTO(R_SPARC_7, 0,2, 7,false,0,complain_overflow_bitfield,bfd_elf_generic_reloc, "R_SPARC_7", false,0,0x0000007f,true), -#if 0 /* not used yet */ - HOWTO(R_SPARC_5, 0,2, 5,false,0,complain_overflow_bitfield,bfd_elf_generic_reloc, "R_SPARC_5", false,0,0x0000001f,true), - HOWTO(R_SPARC_6, 0,2, 6,false,0,complain_overflow_bitfield,bfd_elf_generic_reloc, "R_SPARC_6", false,0,0x0000003f,true), -#endif -}; - -struct elf_reloc_map { - unsigned char bfd_reloc_val; - unsigned char elf_reloc_val; -}; - -static CONST struct elf_reloc_map sparc_reloc_map[] = -{ - { BFD_RELOC_NONE, R_SPARC_NONE, }, - { BFD_RELOC_16, R_SPARC_16, }, - { BFD_RELOC_8, R_SPARC_8 }, - { BFD_RELOC_8_PCREL, R_SPARC_DISP8 }, - /* ??? This might cause us to need separate functions in elf{32,64}-sparc.c - (we could still have just one table), but is this reloc ever used? */ - { BFD_RELOC_CTOR, R_SPARC_32 }, /* @@ Assumes 32 bits. */ - { BFD_RELOC_32, R_SPARC_32 }, - { BFD_RELOC_32_PCREL, R_SPARC_DISP32 }, - { BFD_RELOC_HI22, R_SPARC_HI22 }, - { BFD_RELOC_LO10, R_SPARC_LO10, }, - { BFD_RELOC_32_PCREL_S2, R_SPARC_WDISP30 }, - { BFD_RELOC_SPARC22, R_SPARC_22 }, - { BFD_RELOC_SPARC13, R_SPARC_13 }, - { BFD_RELOC_SPARC_GOT10, R_SPARC_GOT10 }, - { BFD_RELOC_SPARC_GOT13, R_SPARC_GOT13 }, - { BFD_RELOC_SPARC_GOT22, R_SPARC_GOT22 }, - { BFD_RELOC_SPARC_PC10, R_SPARC_PC10 }, - { BFD_RELOC_SPARC_PC22, R_SPARC_PC22 }, - { BFD_RELOC_SPARC_WPLT30, R_SPARC_WPLT30 }, - { BFD_RELOC_SPARC_COPY, R_SPARC_COPY }, - { BFD_RELOC_SPARC_GLOB_DAT, R_SPARC_GLOB_DAT }, - { BFD_RELOC_SPARC_JMP_SLOT, R_SPARC_JMP_SLOT }, - { BFD_RELOC_SPARC_RELATIVE, R_SPARC_RELATIVE }, - { BFD_RELOC_SPARC_WDISP22, R_SPARC_WDISP22 }, - /* ??? Doesn't dwarf use this? */ -/*{ BFD_RELOC_SPARC_UA32, R_SPARC_UA32 }, not used?? */ - {BFD_RELOC_SPARC_10, R_SPARC_10}, - {BFD_RELOC_SPARC_11, R_SPARC_11}, - {BFD_RELOC_SPARC_64, R_SPARC_64}, - {BFD_RELOC_SPARC_OLO10, R_SPARC_OLO10}, - {BFD_RELOC_SPARC_HH22, R_SPARC_HH22}, - {BFD_RELOC_SPARC_HM10, R_SPARC_HM10}, - {BFD_RELOC_SPARC_LM22, R_SPARC_LM22}, - {BFD_RELOC_SPARC_PC_HH22, R_SPARC_PC_HH22}, - {BFD_RELOC_SPARC_PC_HM10, R_SPARC_PC_HM10}, - {BFD_RELOC_SPARC_PC_LM22, R_SPARC_PC_LM22}, - {BFD_RELOC_SPARC_WDISP16, R_SPARC_WDISP16}, - {BFD_RELOC_SPARC_WDISP19, R_SPARC_WDISP19}, - {BFD_RELOC_SPARC_GLOB_JMP, R_SPARC_GLOB_JMP}, - {BFD_RELOC_SPARC_7, R_SPARC_7}, -#if 0 /* unused */ - {BFD_RELOC_SPARC_5, R_SPARC_5}, - {BFD_RELOC_SPARC_6, R_SPARC_6}, -#endif -}; - -static reloc_howto_type * -sparc64_elf_reloc_type_lookup (abfd, code) - bfd *abfd; - bfd_reloc_code_real_type code; -{ - unsigned int i; - for (i = 0; i < sizeof (sparc_reloc_map) / sizeof (struct elf_reloc_map); i++) - { - if (sparc_reloc_map[i].bfd_reloc_val == code) - return &sparc64_elf_howto_table[(int) sparc_reloc_map[i].elf_reloc_val]; - } - return 0; -} - -static void -elf_info_to_howto (abfd, cache_ptr, dst) - bfd *abfd; - arelent *cache_ptr; - Elf64_Internal_Rela *dst; -{ - BFD_ASSERT (ELF64_R_TYPE (dst->r_info) < (unsigned int) R_SPARC_max); - cache_ptr->howto = &sparc64_elf_howto_table[ELF64_R_TYPE (dst->r_info)]; -} - -/* Handle the WDISP16 reloc. */ - -static bfd_reloc_status_type -sparc_elf_wdisp16_reloc (abfd, - reloc_entry, - symbol, - data, - input_section, - output_bfd, - error_message) - bfd *abfd; - arelent *reloc_entry; - asymbol *symbol; - PTR data; - asection *input_section; - bfd *output_bfd; - char **error_message; -{ - bfd_vma relocation; - bfd_vma x; - - if (output_bfd != (bfd *) NULL - && (symbol->flags & BSF_SECTION_SYM) == 0 - && (! reloc_entry->howto->partial_inplace - || reloc_entry->addend == 0)) - { - reloc_entry->address += input_section->output_offset; - return bfd_reloc_ok; - } - - if (output_bfd != NULL) - return bfd_reloc_continue; - - if (reloc_entry->address > input_section->_cooked_size) - return bfd_reloc_outofrange; - - relocation = (symbol->value - + symbol->section->output_section->vma - + symbol->section->output_offset); - relocation += reloc_entry->addend; - relocation -= (input_section->output_section->vma - + input_section->output_offset); - relocation -= reloc_entry->address; - - x = bfd_get_32 (abfd, (char *) data + reloc_entry->address); - x |= ((((relocation >> 2) & 0xc000) << 6) - | ((relocation >> 2) & 0x3fff)); - bfd_put_32 (abfd, x, (char *) data + reloc_entry->address); - - if ((bfd_signed_vma) relocation < - 0x40000 - || (bfd_signed_vma) relocation > 0x3ffff) - return bfd_reloc_overflow; - else - return bfd_reloc_ok; -} - -/* Relocate a SPARC64 ELF section. */ - -static boolean -sparc64_elf_relocate_section (output_bfd, info, input_bfd, input_section, - contents, relocs, local_syms, local_sections) - bfd *output_bfd; - struct bfd_link_info *info; - bfd *input_bfd; - asection *input_section; - bfd_byte *contents; - Elf_Internal_Rela *relocs; - Elf_Internal_Sym *local_syms; - asection **local_sections; -{ - Elf_Internal_Shdr *symtab_hdr; - struct elf_link_hash_entry **sym_hashes; - Elf_Internal_Rela *rel; - Elf_Internal_Rela *relend; - - symtab_hdr = &elf_tdata (input_bfd)->symtab_hdr; - sym_hashes = elf_sym_hashes (input_bfd); - - rel = relocs; - relend = relocs + input_section->reloc_count; - for (; rel < relend; rel++) - { - int r_type; - reloc_howto_type *howto; - long r_symndx; - struct elf_link_hash_entry *h; - Elf_Internal_Sym *sym; - asection *sec; - bfd_vma relocation; - bfd_reloc_status_type r; - - r_type = ELF64_R_TYPE (rel->r_info); - if (r_type < 0 || r_type >= (int) R_SPARC_max) - { - bfd_set_error (bfd_error_bad_value); - return false; - } - howto = sparc64_elf_howto_table + r_type; - - r_symndx = ELF64_R_SYM (rel->r_info); - - if (info->relocateable) - { - /* This is a relocateable link. We don't have to change - anything, unless the reloc is against a section symbol, - in which case we have to adjust according to where the - section symbol winds up in the output section. */ - if (r_symndx < symtab_hdr->sh_info) - { - sym = local_syms + r_symndx; - if (ELF_ST_TYPE (sym->st_info) == STT_SECTION) - { - sec = local_sections[r_symndx]; - rel->r_addend += sec->output_offset + sym->st_value; - } - } - - continue; - } - - /* This is a final link. */ - h = NULL; - sym = NULL; - sec = NULL; - if (r_symndx < symtab_hdr->sh_info) - { - sym = local_syms + r_symndx; - sec = local_sections[r_symndx]; - relocation = (sec->output_section->vma - + sec->output_offset - + sym->st_value); - } - else - { - h = sym_hashes[r_symndx - symtab_hdr->sh_info]; - while (h->root.type == bfd_link_hash_indirect - || h->root.type == bfd_link_hash_warning) - h = (struct elf_link_hash_entry *) h->root.u.i.link; - if (h->root.type == bfd_link_hash_defined - || h->root.type == bfd_link_hash_defweak) - { - sec = h->root.u.def.section; - relocation = (h->root.u.def.value - + sec->output_section->vma - + sec->output_offset); - } - else if (h->root.type == bfd_link_hash_undefweak) - relocation = 0; - else - { - if (! ((*info->callbacks->undefined_symbol) - (info, h->root.root.string, input_bfd, - input_section, rel->r_offset))) - return false; - relocation = 0; - } - } - - if (r_type != R_SPARC_WDISP16) - r = _bfd_final_link_relocate (howto, input_bfd, input_section, - contents, rel->r_offset, - relocation, rel->r_addend); - else - { - bfd_vma x; - - relocation += rel->r_addend; - relocation -= (input_section->output_section->vma - + input_section->output_offset); - relocation -= rel->r_offset; - - x = bfd_get_32 (input_bfd, contents + rel->r_offset); - x |= ((((relocation >> 2) & 0xc000) << 6) - | ((relocation >> 2) & 0x3fff)); - bfd_put_32 (input_bfd, x, contents + rel->r_offset); - - if ((bfd_signed_vma) relocation < - 0x40000 - || (bfd_signed_vma) relocation > 0x3ffff) - r = bfd_reloc_overflow; - else - r = bfd_reloc_ok; - } - - if (r != bfd_reloc_ok) - { - switch (r) - { - default: - case bfd_reloc_outofrange: - abort (); - case bfd_reloc_overflow: - { - const char *name; - - if (h != NULL) - name = h->root.root.string; - else - { - name = (bfd_elf_string_from_elf_section - (input_bfd, - symtab_hdr->sh_link, - sym->st_name)); - if (name == NULL) - return false; - if (*name == '\0') - name = bfd_section_name (input_bfd, sec); - } - if (! ((*info->callbacks->reloc_overflow) - (info, name, howto->name, (bfd_vma) 0, - input_bfd, input_section, rel->r_offset))) - return false; - } - break; - } - } - } - - return true; -} - -/* Set the right machine number for a SPARC64 ELF file. */ - -static boolean -sparc64_elf_object_p (abfd) - bfd *abfd; -{ - return bfd_default_set_arch_mach (abfd, bfd_arch_sparc, bfd_mach_sparc_v9); -} - -#define TARGET_BIG_SYM bfd_elf64_sparc_vec -#define TARGET_BIG_NAME "elf64-sparc" -#define ELF_ARCH bfd_arch_sparc -#define ELF_MACHINE_CODE EM_SPARC64 -#define ELF_MAXPAGESIZE 0x100000 - -#define bfd_elf64_bfd_reloc_type_lookup sparc64_elf_reloc_type_lookup -#define elf_backend_relocate_section sparc64_elf_relocate_section -#define elf_backend_object_p sparc64_elf_object_p - -#include "elf64-target.h" diff --git a/contrib/gdb/bfd/elf64.c b/contrib/gdb/bfd/elf64.c deleted file mode 100644 index 69fb5b5e6e1d6..0000000000000 --- a/contrib/gdb/bfd/elf64.c +++ /dev/null @@ -1,22 +0,0 @@ -/* ELF 64-bit executable support for BFD. - Copyright 1993 Free Software Foundation, Inc. - -This file is part of BFD, the Binary File Descriptor library. - -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 2 of the License, 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ - -#define ARCH_SIZE 64 - -#include "elfcode.h" diff --git a/contrib/gdb/bfd/elfcode.h b/contrib/gdb/bfd/elfcode.h deleted file mode 100644 index a6199f0b0f484..0000000000000 --- a/contrib/gdb/bfd/elfcode.h +++ /dev/null @@ -1,1406 +0,0 @@ -/* ELF executable support for BFD. - Copyright 1991, 1992, 1993, 1994, 1995, 1996 Free Software Foundation, Inc. - - Written by Fred Fish @ Cygnus Support, from information published - in "UNIX System V Release 4, Programmers Guide: ANSI C and - Programming Support Tools". Sufficient support for gdb. - - Rewritten by Mark Eichin @ Cygnus Support, from information - published in "System V Application Binary Interface", chapters 4 - and 5, as well as the various "Processor Supplement" documents - derived from it. Added support for assembler and other object file - utilities. Further work done by Ken Raeburn (Cygnus Support), Michael - Meissner (Open Software Foundation), and Peter Hoogenboom (University - of Utah) to finish and extend this. - -This file is part of BFD, the Binary File Descriptor library. - -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 2 of the License, 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ - -/* Problems and other issues to resolve. - - (1) BFD expects there to be some fixed number of "sections" in - the object file. I.E. there is a "section_count" variable in the - bfd structure which contains the number of sections. However, ELF - supports multiple "views" of a file. In particular, with current - implementations, executable files typically have two tables, a - program header table and a section header table, both of which - partition the executable. - - In ELF-speak, the "linking view" of the file uses the section header - table to access "sections" within the file, and the "execution view" - uses the program header table to access "segments" within the file. - "Segments" typically may contain all the data from one or more - "sections". - - Note that the section header table is optional in ELF executables, - but it is this information that is most useful to gdb. If the - section header table is missing, then gdb should probably try - to make do with the program header table. (FIXME) - - (2) The code in this file is compiled twice, once in 32-bit mode and - once in 64-bit mode. More of it should be made size-independent - and moved into elf.c. - - (3) ELF section symbols are handled rather sloppily now. This should - be cleaned up, and ELF section symbols reconciled with BFD section - symbols. - - (4) We need a published spec for 64-bit ELF. We've got some stuff here - that we're using for SPARC V9 64-bit chips, but don't assume that - it's cast in stone. - */ - -#include <string.h> /* For strrchr and friends */ -#include "bfd.h" -#include "sysdep.h" -#include "bfdlink.h" -#include "libbfd.h" -#include "elf-bfd.h" - -/* Renaming structures, typedefs, macros and functions to be size-specific. */ -#define Elf_External_Ehdr NAME(Elf,External_Ehdr) -#define Elf_External_Sym NAME(Elf,External_Sym) -#define Elf_External_Shdr NAME(Elf,External_Shdr) -#define Elf_External_Phdr NAME(Elf,External_Phdr) -#define Elf_External_Rel NAME(Elf,External_Rel) -#define Elf_External_Rela NAME(Elf,External_Rela) -#define Elf_External_Dyn NAME(Elf,External_Dyn) - -#define elf_core_file_failing_command NAME(bfd_elf,core_file_failing_command) -#define elf_core_file_failing_signal NAME(bfd_elf,core_file_failing_signal) -#define elf_core_file_matches_executable_p \ - NAME(bfd_elf,core_file_matches_executable_p) -#define elf_object_p NAME(bfd_elf,object_p) -#define elf_core_file_p NAME(bfd_elf,core_file_p) -#define elf_get_symtab_upper_bound NAME(bfd_elf,get_symtab_upper_bound) -#define elf_get_dynamic_symtab_upper_bound \ - NAME(bfd_elf,get_dynamic_symtab_upper_bound) -#define elf_swap_reloc_in NAME(bfd_elf,swap_reloc_in) -#define elf_swap_reloca_in NAME(bfd_elf,swap_reloca_in) -#define elf_swap_reloc_out NAME(bfd_elf,swap_reloc_out) -#define elf_swap_reloca_out NAME(bfd_elf,swap_reloca_out) -#define elf_swap_symbol_in NAME(bfd_elf,swap_symbol_in) -#define elf_swap_symbol_out NAME(bfd_elf,swap_symbol_out) -#define elf_swap_phdr_in NAME(bfd_elf,swap_phdr_in) -#define elf_swap_phdr_out NAME(bfd_elf,swap_phdr_out) -#define elf_swap_dyn_in NAME(bfd_elf,swap_dyn_in) -#define elf_swap_dyn_out NAME(bfd_elf,swap_dyn_out) -#define elf_get_reloc_upper_bound NAME(bfd_elf,get_reloc_upper_bound) -#define elf_canonicalize_reloc NAME(bfd_elf,canonicalize_reloc) -#define elf_get_symtab NAME(bfd_elf,get_symtab) -#define elf_canonicalize_dynamic_symtab \ - NAME(bfd_elf,canonicalize_dynamic_symtab) -#define elf_make_empty_symbol NAME(bfd_elf,make_empty_symbol) -#define elf_get_symbol_info NAME(bfd_elf,get_symbol_info) -#define elf_get_lineno NAME(bfd_elf,get_lineno) -#define elf_set_arch_mach NAME(bfd_elf,set_arch_mach) -#define elf_find_nearest_line NAME(bfd_elf,find_nearest_line) -#define elf_sizeof_headers NAME(bfd_elf,sizeof_headers) -#define elf_set_section_contents NAME(bfd_elf,set_section_contents) -#define elf_no_info_to_howto NAME(bfd_elf,no_info_to_howto) -#define elf_no_info_to_howto_rel NAME(bfd_elf,no_info_to_howto_rel) -#define elf_find_section NAME(bfd_elf,find_section) -#define elf_bfd_link_add_symbols NAME(bfd_elf,bfd_link_add_symbols) -#define elf_add_dynamic_entry NAME(bfd_elf,add_dynamic_entry) -#define elf_link_create_dynamic_sections \ - NAME(bfd_elf,link_create_dynamic_sections) -#define elf_link_record_dynamic_symbol _bfd_elf_link_record_dynamic_symbol -#define elf_bfd_final_link NAME(bfd_elf,bfd_final_link) -#define elf_create_pointer_linker_section NAME(bfd_elf,create_pointer_linker_section) -#define elf_finish_pointer_linker_section NAME(bfd_elf,finish_pointer_linker_section) - -#if ARCH_SIZE == 64 -#define ELF_R_INFO(X,Y) ELF64_R_INFO(X,Y) -#define ELF_R_SYM(X) ELF64_R_SYM(X) -#define ELF_R_TYPE(X) ELF64_R_TYPE(X) -#define ELFCLASS ELFCLASS64 -#define FILE_ALIGN 8 -#define LOG_FILE_ALIGN 3 -#endif -#if ARCH_SIZE == 32 -#define ELF_R_INFO(X,Y) ELF32_R_INFO(X,Y) -#define ELF_R_SYM(X) ELF32_R_SYM(X) -#define ELF_R_TYPE(X) ELF32_R_TYPE(X) -#define ELFCLASS ELFCLASS32 -#define FILE_ALIGN 4 -#define LOG_FILE_ALIGN 2 -#endif - -/* Forward declarations of static functions */ - -#define elf_stringtab_init _bfd_elf_stringtab_init - -extern struct bfd_strtab_hash *_bfd_elf_stringtab_init PARAMS ((void)); -#define section_from_elf_index bfd_section_from_elf_index -extern boolean bfd_section_from_phdr PARAMS ((bfd *, Elf_Internal_Phdr *, - int)); - -static long elf_slurp_symbol_table PARAMS ((bfd *, asymbol **, boolean)); - -static boolean elf_slurp_reloc_table PARAMS ((bfd *, asection *, asymbol **)); - - int _bfd_elf_symbol_from_bfd_symbol PARAMS ((bfd *, - struct symbol_cache_entry **)); - -static boolean validate_reloc PARAMS ((bfd *, arelent *)); -static void write_relocs PARAMS ((bfd *, asection *, PTR)); - - boolean bfd_section_from_shdr PARAMS ((bfd *, unsigned int shindex)); - -#ifdef DEBUG -static void elf_debug_section PARAMS ((int, Elf_Internal_Shdr *)); -static void elf_debug_file PARAMS ((Elf_Internal_Ehdr *)); -static char *elf_symbol_flags PARAMS ((flagword)); -#endif - -/* Structure swapping routines */ - -/* Should perhaps use put_offset, put_word, etc. For now, the two versions - can be handled by explicitly specifying 32 bits or "the long type". */ -#if ARCH_SIZE == 64 -#define put_word bfd_h_put_64 -#define get_word bfd_h_get_64 -#endif -#if ARCH_SIZE == 32 -#define put_word bfd_h_put_32 -#define get_word bfd_h_get_32 -#endif - -/* Translate an ELF symbol in external format into an ELF symbol in internal - format. */ - -void -elf_swap_symbol_in (abfd, src, dst) - bfd *abfd; - Elf_External_Sym *src; - Elf_Internal_Sym *dst; -{ - dst->st_name = bfd_h_get_32 (abfd, (bfd_byte *) src->st_name); - dst->st_value = get_word (abfd, (bfd_byte *) src->st_value); - dst->st_size = get_word (abfd, (bfd_byte *) src->st_size); - dst->st_info = bfd_h_get_8 (abfd, (bfd_byte *) src->st_info); - dst->st_other = bfd_h_get_8 (abfd, (bfd_byte *) src->st_other); - dst->st_shndx = bfd_h_get_16 (abfd, (bfd_byte *) src->st_shndx); -} - -/* Translate an ELF symbol in internal format into an ELF symbol in external - format. */ - -void -elf_swap_symbol_out (abfd, src, cdst) - bfd *abfd; - Elf_Internal_Sym *src; - PTR cdst; -{ - Elf_External_Sym *dst = (Elf_External_Sym *) cdst; - bfd_h_put_32 (abfd, src->st_name, dst->st_name); - put_word (abfd, src->st_value, dst->st_value); - put_word (abfd, src->st_size, dst->st_size); - bfd_h_put_8 (abfd, src->st_info, dst->st_info); - bfd_h_put_8 (abfd, src->st_other, dst->st_other); - bfd_h_put_16 (abfd, src->st_shndx, dst->st_shndx); -} - - -/* Translate an ELF file header in external format into an ELF file header in - internal format. */ - -static void -elf_swap_ehdr_in (abfd, src, dst) - bfd *abfd; - Elf_External_Ehdr *src; - Elf_Internal_Ehdr *dst; -{ - memcpy (dst->e_ident, src->e_ident, EI_NIDENT); - dst->e_type = bfd_h_get_16 (abfd, (bfd_byte *) src->e_type); - dst->e_machine = bfd_h_get_16 (abfd, (bfd_byte *) src->e_machine); - dst->e_version = bfd_h_get_32 (abfd, (bfd_byte *) src->e_version); - dst->e_entry = get_word (abfd, (bfd_byte *) src->e_entry); - dst->e_phoff = get_word (abfd, (bfd_byte *) src->e_phoff); - dst->e_shoff = get_word (abfd, (bfd_byte *) src->e_shoff); - dst->e_flags = bfd_h_get_32 (abfd, (bfd_byte *) src->e_flags); - dst->e_ehsize = bfd_h_get_16 (abfd, (bfd_byte *) src->e_ehsize); - dst->e_phentsize = bfd_h_get_16 (abfd, (bfd_byte *) src->e_phentsize); - dst->e_phnum = bfd_h_get_16 (abfd, (bfd_byte *) src->e_phnum); - dst->e_shentsize = bfd_h_get_16 (abfd, (bfd_byte *) src->e_shentsize); - dst->e_shnum = bfd_h_get_16 (abfd, (bfd_byte *) src->e_shnum); - dst->e_shstrndx = bfd_h_get_16 (abfd, (bfd_byte *) src->e_shstrndx); -} - -/* Translate an ELF file header in internal format into an ELF file header in - external format. */ - -static void -elf_swap_ehdr_out (abfd, src, dst) - bfd *abfd; - Elf_Internal_Ehdr *src; - Elf_External_Ehdr *dst; -{ - memcpy (dst->e_ident, src->e_ident, EI_NIDENT); - /* note that all elements of dst are *arrays of unsigned char* already... */ - bfd_h_put_16 (abfd, src->e_type, dst->e_type); - bfd_h_put_16 (abfd, src->e_machine, dst->e_machine); - bfd_h_put_32 (abfd, src->e_version, dst->e_version); - put_word (abfd, src->e_entry, dst->e_entry); - put_word (abfd, src->e_phoff, dst->e_phoff); - put_word (abfd, src->e_shoff, dst->e_shoff); - bfd_h_put_32 (abfd, src->e_flags, dst->e_flags); - bfd_h_put_16 (abfd, src->e_ehsize, dst->e_ehsize); - bfd_h_put_16 (abfd, src->e_phentsize, dst->e_phentsize); - bfd_h_put_16 (abfd, src->e_phnum, dst->e_phnum); - bfd_h_put_16 (abfd, src->e_shentsize, dst->e_shentsize); - bfd_h_put_16 (abfd, src->e_shnum, dst->e_shnum); - bfd_h_put_16 (abfd, src->e_shstrndx, dst->e_shstrndx); -} - - -/* Translate an ELF section header table entry in external format into an - ELF section header table entry in internal format. */ - -static void -elf_swap_shdr_in (abfd, src, dst) - bfd *abfd; - Elf_External_Shdr *src; - Elf_Internal_Shdr *dst; -{ - dst->sh_name = bfd_h_get_32 (abfd, (bfd_byte *) src->sh_name); - dst->sh_type = bfd_h_get_32 (abfd, (bfd_byte *) src->sh_type); - dst->sh_flags = get_word (abfd, (bfd_byte *) src->sh_flags); - dst->sh_addr = get_word (abfd, (bfd_byte *) src->sh_addr); - dst->sh_offset = get_word (abfd, (bfd_byte *) src->sh_offset); - dst->sh_size = get_word (abfd, (bfd_byte *) src->sh_size); - dst->sh_link = bfd_h_get_32 (abfd, (bfd_byte *) src->sh_link); - dst->sh_info = bfd_h_get_32 (abfd, (bfd_byte *) src->sh_info); - dst->sh_addralign = get_word (abfd, (bfd_byte *) src->sh_addralign); - dst->sh_entsize = get_word (abfd, (bfd_byte *) src->sh_entsize); - dst->bfd_section = NULL; - dst->contents = NULL; -} - -/* Translate an ELF section header table entry in internal format into an - ELF section header table entry in external format. */ - -static void -elf_swap_shdr_out (abfd, src, dst) - bfd *abfd; - Elf_Internal_Shdr *src; - Elf_External_Shdr *dst; -{ - /* note that all elements of dst are *arrays of unsigned char* already... */ - bfd_h_put_32 (abfd, src->sh_name, dst->sh_name); - bfd_h_put_32 (abfd, src->sh_type, dst->sh_type); - put_word (abfd, src->sh_flags, dst->sh_flags); - put_word (abfd, src->sh_addr, dst->sh_addr); - put_word (abfd, src->sh_offset, dst->sh_offset); - put_word (abfd, src->sh_size, dst->sh_size); - bfd_h_put_32 (abfd, src->sh_link, dst->sh_link); - bfd_h_put_32 (abfd, src->sh_info, dst->sh_info); - put_word (abfd, src->sh_addralign, dst->sh_addralign); - put_word (abfd, src->sh_entsize, dst->sh_entsize); -} - - -/* Translate an ELF program header table entry in external format into an - ELF program header table entry in internal format. */ - -void -elf_swap_phdr_in (abfd, src, dst) - bfd *abfd; - Elf_External_Phdr *src; - Elf_Internal_Phdr *dst; -{ - dst->p_type = bfd_h_get_32 (abfd, (bfd_byte *) src->p_type); - dst->p_flags = bfd_h_get_32 (abfd, (bfd_byte *) src->p_flags); - dst->p_offset = get_word (abfd, (bfd_byte *) src->p_offset); - dst->p_vaddr = get_word (abfd, (bfd_byte *) src->p_vaddr); - dst->p_paddr = get_word (abfd, (bfd_byte *) src->p_paddr); - dst->p_filesz = get_word (abfd, (bfd_byte *) src->p_filesz); - dst->p_memsz = get_word (abfd, (bfd_byte *) src->p_memsz); - dst->p_align = get_word (abfd, (bfd_byte *) src->p_align); -} - -void -elf_swap_phdr_out (abfd, src, dst) - bfd *abfd; - Elf_Internal_Phdr *src; - Elf_External_Phdr *dst; -{ - /* note that all elements of dst are *arrays of unsigned char* already... */ - bfd_h_put_32 (abfd, src->p_type, dst->p_type); - put_word (abfd, src->p_offset, dst->p_offset); - put_word (abfd, src->p_vaddr, dst->p_vaddr); - put_word (abfd, src->p_paddr, dst->p_paddr); - put_word (abfd, src->p_filesz, dst->p_filesz); - put_word (abfd, src->p_memsz, dst->p_memsz); - bfd_h_put_32 (abfd, src->p_flags, dst->p_flags); - put_word (abfd, src->p_align, dst->p_align); -} - -/* Translate an ELF reloc from external format to internal format. */ -INLINE void -elf_swap_reloc_in (abfd, src, dst) - bfd *abfd; - Elf_External_Rel *src; - Elf_Internal_Rel *dst; -{ - dst->r_offset = get_word (abfd, (bfd_byte *) src->r_offset); - dst->r_info = get_word (abfd, (bfd_byte *) src->r_info); -} - -INLINE void -elf_swap_reloca_in (abfd, src, dst) - bfd *abfd; - Elf_External_Rela *src; - Elf_Internal_Rela *dst; -{ - dst->r_offset = get_word (abfd, (bfd_byte *) src->r_offset); - dst->r_info = get_word (abfd, (bfd_byte *) src->r_info); - dst->r_addend = get_word (abfd, (bfd_byte *) src->r_addend); -} - -/* Translate an ELF reloc from internal format to external format. */ -INLINE void -elf_swap_reloc_out (abfd, src, dst) - bfd *abfd; - Elf_Internal_Rel *src; - Elf_External_Rel *dst; -{ - put_word (abfd, src->r_offset, dst->r_offset); - put_word (abfd, src->r_info, dst->r_info); -} - -INLINE void -elf_swap_reloca_out (abfd, src, dst) - bfd *abfd; - Elf_Internal_Rela *src; - Elf_External_Rela *dst; -{ - put_word (abfd, src->r_offset, dst->r_offset); - put_word (abfd, src->r_info, dst->r_info); - put_word (abfd, src->r_addend, dst->r_addend); -} - -INLINE void -elf_swap_dyn_in (abfd, p, dst) - bfd *abfd; - const PTR p; - Elf_Internal_Dyn *dst; -{ - const Elf_External_Dyn *src = (const Elf_External_Dyn *) p; - - dst->d_tag = get_word (abfd, src->d_tag); - dst->d_un.d_val = get_word (abfd, src->d_un.d_val); -} - -INLINE void -elf_swap_dyn_out (abfd, src, dst) - bfd *abfd; - const Elf_Internal_Dyn *src; - Elf_External_Dyn *dst; -{ - put_word (abfd, src->d_tag, dst->d_tag); - put_word (abfd, src->d_un.d_val, dst->d_un.d_val); -} - -/* ELF .o/exec file reading */ - - -/* Begin processing a given object. - - First we validate the file by reading in the ELF header and checking - the magic number. */ - -static INLINE boolean -elf_file_p (x_ehdrp) - Elf_External_Ehdr *x_ehdrp; -{ - return ((x_ehdrp->e_ident[EI_MAG0] == ELFMAG0) - && (x_ehdrp->e_ident[EI_MAG1] == ELFMAG1) - && (x_ehdrp->e_ident[EI_MAG2] == ELFMAG2) - && (x_ehdrp->e_ident[EI_MAG3] == ELFMAG3)); -} - -/* Check to see if the file associated with ABFD matches the target vector - that ABFD points to. - - Note that we may be called several times with the same ABFD, but different - target vectors, most of which will not match. We have to avoid leaving - any side effects in ABFD, or any data it points to (like tdata), if the - file does not match the target vector. */ - -const bfd_target * -elf_object_p (abfd) - bfd *abfd; -{ - Elf_External_Ehdr x_ehdr; /* Elf file header, external form */ - Elf_Internal_Ehdr *i_ehdrp; /* Elf file header, internal form */ - Elf_External_Shdr x_shdr; /* Section header table entry, external form */ - Elf_Internal_Shdr *i_shdrp = NULL; /* Section header table, internal form */ - unsigned int shindex; - char *shstrtab; /* Internal copy of section header stringtab */ - struct elf_backend_data *ebd; - struct elf_obj_tdata *preserved_tdata = elf_tdata (abfd); - struct elf_obj_tdata *new_tdata = NULL; - - /* Read in the ELF header in external format. */ - - if (bfd_read ((PTR) & x_ehdr, sizeof (x_ehdr), 1, abfd) != sizeof (x_ehdr)) - { - if (bfd_get_error () != bfd_error_system_call) - goto got_wrong_format_error; - else - goto got_no_match; - } - - /* Now check to see if we have a valid ELF file, and one that BFD can - make use of. The magic number must match, the address size ('class') - and byte-swapping must match our XVEC entry, and it must have a - section header table (FIXME: See comments re sections at top of this - file). */ - - if ((elf_file_p (&x_ehdr) == false) || - (x_ehdr.e_ident[EI_VERSION] != EV_CURRENT) || - (x_ehdr.e_ident[EI_CLASS] != ELFCLASS)) - goto got_wrong_format_error; - - /* Check that file's byte order matches xvec's */ - switch (x_ehdr.e_ident[EI_DATA]) - { - case ELFDATA2MSB: /* Big-endian */ - if (! bfd_header_big_endian (abfd)) - goto got_wrong_format_error; - break; - case ELFDATA2LSB: /* Little-endian */ - if (! bfd_header_little_endian (abfd)) - goto got_wrong_format_error; - break; - case ELFDATANONE: /* No data encoding specified */ - default: /* Unknown data encoding specified */ - goto got_wrong_format_error; - } - - /* Allocate an instance of the elf_obj_tdata structure and hook it up to - the tdata pointer in the bfd. */ - - new_tdata = ((struct elf_obj_tdata *) - bfd_zalloc (abfd, sizeof (struct elf_obj_tdata))); - if (new_tdata == NULL) - goto got_no_match; - elf_tdata (abfd) = new_tdata; - - /* Now that we know the byte order, swap in the rest of the header */ - i_ehdrp = elf_elfheader (abfd); - elf_swap_ehdr_in (abfd, &x_ehdr, i_ehdrp); -#if DEBUG & 1 - elf_debug_file (i_ehdrp); -#endif - - /* If there is no section header table, we're hosed. */ - if (i_ehdrp->e_shoff == 0) - goto got_wrong_format_error; - - /* As a simple sanity check, verify that the what BFD thinks is the - size of each section header table entry actually matches the size - recorded in the file. */ - if (i_ehdrp->e_shentsize != sizeof (x_shdr)) - goto got_wrong_format_error; - - ebd = get_elf_backend_data (abfd); - - /* Check that the ELF e_machine field matches what this particular - BFD format expects. */ - if (ebd->elf_machine_code != i_ehdrp->e_machine - && (ebd->elf_machine_alt1 == 0 || i_ehdrp->e_machine != ebd->elf_machine_alt1) - && (ebd->elf_machine_alt2 == 0 || i_ehdrp->e_machine != ebd->elf_machine_alt2)) - { - const bfd_target * const *target_ptr; - - if (ebd->elf_machine_code != EM_NONE) - goto got_wrong_format_error; - - /* This is the generic ELF target. Let it match any ELF target - for which we do not have a specific backend. */ - for (target_ptr = bfd_target_vector; *target_ptr != NULL; target_ptr++) - { - struct elf_backend_data *back; - - if ((*target_ptr)->flavour != bfd_target_elf_flavour) - continue; - back = (struct elf_backend_data *) (*target_ptr)->backend_data; - if (back->elf_machine_code == i_ehdrp->e_machine) - { - /* target_ptr is an ELF backend which matches this - object file, so reject the generic ELF target. */ - goto got_wrong_format_error; - } - } - } - - if (i_ehdrp->e_type == ET_EXEC) - abfd->flags |= EXEC_P; - else if (i_ehdrp->e_type == ET_DYN) - abfd->flags |= DYNAMIC; - - if (i_ehdrp->e_phnum > 0) - abfd->flags |= D_PAGED; - - if (! bfd_default_set_arch_mach (abfd, ebd->arch, 0)) - goto got_no_match; - - /* Remember the entry point specified in the ELF file header. */ - bfd_get_start_address (abfd) = i_ehdrp->e_entry; - - /* Allocate space for a copy of the section header table in - internal form, seek to the section header table in the file, - read it in, and convert it to internal form. */ - i_shdrp = ((Elf_Internal_Shdr *) - bfd_alloc (abfd, sizeof (*i_shdrp) * i_ehdrp->e_shnum)); - elf_elfsections (abfd) = ((Elf_Internal_Shdr **) - bfd_alloc (abfd, - sizeof (i_shdrp) * i_ehdrp->e_shnum)); - if (!i_shdrp || !elf_elfsections (abfd)) - goto got_no_match; - if (bfd_seek (abfd, i_ehdrp->e_shoff, SEEK_SET) != 0) - goto got_no_match; - for (shindex = 0; shindex < i_ehdrp->e_shnum; shindex++) - { - if (bfd_read ((PTR) & x_shdr, sizeof x_shdr, 1, abfd) != sizeof (x_shdr)) - goto got_no_match; - elf_swap_shdr_in (abfd, &x_shdr, i_shdrp + shindex); - elf_elfsections (abfd)[shindex] = i_shdrp + shindex; - } - if (i_ehdrp->e_shstrndx) - { - if (! bfd_section_from_shdr (abfd, i_ehdrp->e_shstrndx)) - goto got_no_match; - } - - /* Read in the program headers. */ - if (i_ehdrp->e_phnum == 0) - elf_tdata (abfd)->phdr = NULL; - else - { - Elf_Internal_Phdr *i_phdr; - unsigned int i; - - elf_tdata (abfd)->phdr = ((Elf_Internal_Phdr *) - bfd_alloc (abfd, - (i_ehdrp->e_phnum - * sizeof (Elf_Internal_Phdr)))); - if (elf_tdata (abfd)->phdr == NULL) - goto got_no_match; - if (bfd_seek (abfd, i_ehdrp->e_phoff, SEEK_SET) != 0) - goto got_no_match; - i_phdr = elf_tdata (abfd)->phdr; - for (i = 0; i < i_ehdrp->e_phnum; i++, i_phdr++) - { - Elf_External_Phdr x_phdr; - - if (bfd_read ((PTR) &x_phdr, sizeof x_phdr, 1, abfd) - != sizeof x_phdr) - goto got_no_match; - elf_swap_phdr_in (abfd, &x_phdr, i_phdr); - } - } - - /* Read in the string table containing the names of the sections. We - will need the base pointer to this table later. */ - /* We read this inline now, so that we don't have to go through - bfd_section_from_shdr with it (since this particular strtab is - used to find all of the ELF section names.) */ - - shstrtab = bfd_elf_get_str_section (abfd, i_ehdrp->e_shstrndx); - if (!shstrtab) - goto got_no_match; - - /* Once all of the section headers have been read and converted, we - can start processing them. Note that the first section header is - a dummy placeholder entry, so we ignore it. */ - - for (shindex = 1; shindex < i_ehdrp->e_shnum; shindex++) - { - if (! bfd_section_from_shdr (abfd, shindex)) - goto got_no_match; - } - - /* Let the backend double check the format and override global - information. */ - if (ebd->elf_backend_object_p) - { - if ((*ebd->elf_backend_object_p) (abfd) == false) - goto got_wrong_format_error; - } - - return (abfd->xvec); - -got_wrong_format_error: - bfd_set_error (bfd_error_wrong_format); - goto got_no_match; -got_no_match: - if (new_tdata != NULL - && new_tdata->elf_sect_ptr != NULL) - bfd_release (abfd, new_tdata->elf_sect_ptr); - if (i_shdrp != NULL) - bfd_release (abfd, i_shdrp); - if (new_tdata != NULL) - bfd_release (abfd, new_tdata); - elf_tdata (abfd) = preserved_tdata; - return (NULL); -} - -/* ELF .o/exec file writing */ - -/* Try to convert a non-ELF reloc into an ELF one. */ - -static boolean -validate_reloc (abfd, areloc) - bfd *abfd; - arelent *areloc; -{ - /* Check whether we really have an ELF howto. */ - - if ((*areloc->sym_ptr_ptr)->the_bfd->xvec != abfd->xvec) - { - bfd_reloc_code_real_type code; - reloc_howto_type *howto; - - /* Alien reloc: Try to determine its type to replace it with an - equivalent ELF reloc. */ - - if (areloc->howto->pc_relative) - { - switch (areloc->howto->bitsize) - { - case 8: - code = BFD_RELOC_8_PCREL; - break; - case 12: - code = BFD_RELOC_12_PCREL; - break; - case 16: - code = BFD_RELOC_16_PCREL; - break; - case 24: - code = BFD_RELOC_24_PCREL; - break; - case 32: - code = BFD_RELOC_32_PCREL; - break; - case 64: - code = BFD_RELOC_64_PCREL; - break; - default: - goto fail; - } - - howto = bfd_reloc_type_lookup (abfd, code); - - if (areloc->howto->pcrel_offset != howto->pcrel_offset) - { - if (howto->pcrel_offset) - areloc->addend += areloc->address; - else - areloc->addend -= areloc->address; /* addend is unsigned!! */ - } - } - else - { - switch (areloc->howto->bitsize) - { - case 8: - code = BFD_RELOC_8; - break; - case 14: - code = BFD_RELOC_14; - break; - case 16: - code = BFD_RELOC_16; - break; - case 26: - code = BFD_RELOC_26; - break; - case 32: - code = BFD_RELOC_32; - break; - case 64: - code = BFD_RELOC_64; - break; - default: - goto fail; - } - - howto = bfd_reloc_type_lookup (abfd, code); - } - - if (howto) - areloc->howto = howto; - else - goto fail; - } - - return true; - - fail: - (*_bfd_error_handler) - ("%s: unsupported relocation type %s", - bfd_get_filename (abfd), areloc->howto->name); - bfd_set_error (bfd_error_bad_value); - return false; -} - -/* Write out the relocs. */ - -static void -write_relocs (abfd, sec, data) - bfd *abfd; - asection *sec; - PTR data; -{ - boolean *failedp = (boolean *) data; - Elf_Internal_Shdr *rela_hdr; - Elf_External_Rela *outbound_relocas; - Elf_External_Rel *outbound_relocs; - unsigned int idx; - int use_rela_p = get_elf_backend_data (abfd)->use_rela_p; - asymbol *last_sym = 0; - int last_sym_idx = 0; - - /* If we have already failed, don't do anything. */ - if (*failedp) - return; - - if ((sec->flags & SEC_RELOC) == 0) - return; - - /* The linker backend writes the relocs out itself, and sets the - reloc_count field to zero to inhibit writing them here. Also, - sometimes the SEC_RELOC flag gets set even when there aren't any - relocs. */ - if (sec->reloc_count == 0) - return; - - rela_hdr = &elf_section_data (sec)->rel_hdr; - - rela_hdr->sh_size = rela_hdr->sh_entsize * sec->reloc_count; - rela_hdr->contents = (PTR) bfd_alloc (abfd, rela_hdr->sh_size); - if (rela_hdr->contents == NULL) - { - *failedp = true; - return; - } - - /* orelocation has the data, reloc_count has the count... */ - if (use_rela_p) - { - outbound_relocas = (Elf_External_Rela *) rela_hdr->contents; - - for (idx = 0; idx < sec->reloc_count; idx++) - { - Elf_Internal_Rela dst_rela; - Elf_External_Rela *src_rela; - arelent *ptr; - asymbol *sym; - int n; - - ptr = sec->orelocation[idx]; - src_rela = outbound_relocas + idx; - - /* The address of an ELF reloc is section relative for an object - file, and absolute for an executable file or shared library. - The address of a BFD reloc is always section relative. */ - if ((abfd->flags & (EXEC_P | DYNAMIC)) == 0) - dst_rela.r_offset = ptr->address; - else - dst_rela.r_offset = ptr->address + sec->vma; - - sym = *ptr->sym_ptr_ptr; - if (sym == last_sym) - n = last_sym_idx; - else - { - last_sym = sym; - n = _bfd_elf_symbol_from_bfd_symbol (abfd, &sym); - if (n < 0) - { - *failedp = true; - return; - } - last_sym_idx = n; - } - - if ((*ptr->sym_ptr_ptr)->the_bfd->xvec != abfd->xvec - && ! validate_reloc (abfd, ptr)) - { - *failedp = true; - return; - } - - dst_rela.r_info = ELF_R_INFO (n, ptr->howto->type); - - dst_rela.r_addend = ptr->addend; - elf_swap_reloca_out (abfd, &dst_rela, src_rela); - } - } - else - /* REL relocations */ - { - outbound_relocs = (Elf_External_Rel *) rela_hdr->contents; - - for (idx = 0; idx < sec->reloc_count; idx++) - { - Elf_Internal_Rel dst_rel; - Elf_External_Rel *src_rel; - arelent *ptr; - int n; - asymbol *sym; - - ptr = sec->orelocation[idx]; - sym = *ptr->sym_ptr_ptr; - src_rel = outbound_relocs + idx; - - /* The address of an ELF reloc is section relative for an object - file, and absolute for an executable file or shared library. - The address of a BFD reloc is always section relative. */ - if ((abfd->flags & (EXEC_P | DYNAMIC)) == 0) - dst_rel.r_offset = ptr->address; - else - dst_rel.r_offset = ptr->address + sec->vma; - - if (sym == last_sym) - n = last_sym_idx; - else - { - last_sym = sym; - n = _bfd_elf_symbol_from_bfd_symbol (abfd, &sym); - if (n < 0) - { - *failedp = true; - return; - } - last_sym_idx = n; - } - - if ((*ptr->sym_ptr_ptr)->the_bfd->xvec != abfd->xvec - && ! validate_reloc (abfd, ptr)) - { - *failedp = true; - return; - } - - dst_rel.r_info = ELF_R_INFO (n, ptr->howto->type); - - elf_swap_reloc_out (abfd, &dst_rel, src_rel); - } - } -} - -static int -write_out_phdrs (abfd, phdr, count) - bfd *abfd; - Elf_Internal_Phdr *phdr; - int count; -{ - while (count--) - { - Elf_External_Phdr extphdr; - elf_swap_phdr_out (abfd, phdr, &extphdr); - if (bfd_write (&extphdr, sizeof (Elf_External_Phdr), 1, abfd) - != sizeof (Elf_External_Phdr)) - return -1; - phdr++; - } - return 0; -} - -static boolean -write_shdrs_and_ehdr (abfd) - bfd *abfd; -{ - Elf_External_Ehdr x_ehdr; /* Elf file header, external form */ - Elf_Internal_Ehdr *i_ehdrp; /* Elf file header, internal form */ - Elf_External_Shdr *x_shdrp; /* Section header table, external form */ - Elf_Internal_Shdr **i_shdrp; /* Section header table, internal form */ - unsigned int count; - - i_ehdrp = elf_elfheader (abfd); - i_shdrp = elf_elfsections (abfd); - - /* swap the header before spitting it out... */ - -#if DEBUG & 1 - elf_debug_file (i_ehdrp); -#endif - elf_swap_ehdr_out (abfd, i_ehdrp, &x_ehdr); - if (bfd_seek (abfd, (file_ptr) 0, SEEK_SET) != 0 - || (bfd_write ((PTR) & x_ehdr, sizeof (x_ehdr), 1, abfd) - != sizeof (x_ehdr))) - return false; - - /* at this point we've concocted all the ELF sections... */ - x_shdrp = (Elf_External_Shdr *) - bfd_alloc (abfd, sizeof (*x_shdrp) * (i_ehdrp->e_shnum)); - if (!x_shdrp) - return false; - - for (count = 0; count < i_ehdrp->e_shnum; count++) - { -#if DEBUG & 2 - elf_debug_section (count, i_shdrp[count]); -#endif - elf_swap_shdr_out (abfd, i_shdrp[count], x_shdrp + count); - } - if (bfd_seek (abfd, (file_ptr) i_ehdrp->e_shoff, SEEK_SET) != 0 - || (bfd_write ((PTR) x_shdrp, sizeof (*x_shdrp), i_ehdrp->e_shnum, abfd) - != sizeof (*x_shdrp) * i_ehdrp->e_shnum)) - return false; - - /* need to dump the string table too... */ - - return true; -} - -static long -elf_slurp_symbol_table (abfd, symptrs, dynamic) - bfd *abfd; - asymbol **symptrs; /* Buffer for generated bfd symbols */ - boolean dynamic; -{ - Elf_Internal_Shdr *hdr; - long symcount; /* Number of external ELF symbols */ - elf_symbol_type *sym; /* Pointer to current bfd symbol */ - elf_symbol_type *symbase; /* Buffer for generated bfd symbols */ - Elf_Internal_Sym i_sym; - Elf_External_Sym *x_symp = NULL; - - /* Read each raw ELF symbol, converting from external ELF form to - internal ELF form, and then using the information to create a - canonical bfd symbol table entry. - - Note that we allocate the initial bfd canonical symbol buffer - based on a one-to-one mapping of the ELF symbols to canonical - symbols. We actually use all the ELF symbols, so there will be no - space left over at the end. When we have all the symbols, we - build the caller's pointer vector. */ - - if (dynamic) - hdr = &elf_tdata (abfd)->dynsymtab_hdr; - else - hdr = &elf_tdata (abfd)->symtab_hdr; - if (bfd_seek (abfd, hdr->sh_offset, SEEK_SET) == -1) - return -1; - - symcount = hdr->sh_size / sizeof (Elf_External_Sym); - - if (symcount == 0) - sym = symbase = NULL; - else - { - long i; - - if (bfd_seek (abfd, hdr->sh_offset, SEEK_SET) == -1) - return -1; - - symbase = ((elf_symbol_type *) - bfd_zalloc (abfd, symcount * sizeof (elf_symbol_type))); - if (symbase == (elf_symbol_type *) NULL) - return -1; - sym = symbase; - - /* Temporarily allocate room for the raw ELF symbols. */ - x_symp = ((Elf_External_Sym *) - bfd_malloc (symcount * sizeof (Elf_External_Sym))); - if (x_symp == NULL && symcount != 0) - goto error_return; - - if (bfd_read ((PTR) x_symp, sizeof (Elf_External_Sym), symcount, abfd) - != symcount * sizeof (Elf_External_Sym)) - goto error_return; - /* Skip first symbol, which is a null dummy. */ - for (i = 1; i < symcount; i++) - { - elf_swap_symbol_in (abfd, x_symp + i, &i_sym); - memcpy (&sym->internal_elf_sym, &i_sym, sizeof (Elf_Internal_Sym)); -#ifdef ELF_KEEP_EXTSYM - memcpy (&sym->native_elf_sym, x_symp + i, sizeof (Elf_External_Sym)); -#endif - sym->symbol.the_bfd = abfd; - - sym->symbol.name = bfd_elf_string_from_elf_section (abfd, - hdr->sh_link, - i_sym.st_name); - - sym->symbol.value = i_sym.st_value; - - if (i_sym.st_shndx > 0 && i_sym.st_shndx < SHN_LORESERVE) - { - sym->symbol.section = section_from_elf_index (abfd, - i_sym.st_shndx); - if (sym->symbol.section == NULL) - { - /* This symbol is in a section for which we did not - create a BFD section. Just use bfd_abs_section, - although it is wrong. FIXME. */ - sym->symbol.section = bfd_abs_section_ptr; - } - } - else if (i_sym.st_shndx == SHN_ABS) - { - sym->symbol.section = bfd_abs_section_ptr; - } - else if (i_sym.st_shndx == SHN_COMMON) - { - sym->symbol.section = bfd_com_section_ptr; - /* Elf puts the alignment into the `value' field, and - the size into the `size' field. BFD wants to see the - size in the value field, and doesn't care (at the - moment) about the alignment. */ - sym->symbol.value = i_sym.st_size; - } - else if (i_sym.st_shndx == SHN_UNDEF) - { - sym->symbol.section = bfd_und_section_ptr; - } - else - sym->symbol.section = bfd_abs_section_ptr; - - sym->symbol.value -= sym->symbol.section->vma; - - switch (ELF_ST_BIND (i_sym.st_info)) - { - case STB_LOCAL: - sym->symbol.flags |= BSF_LOCAL; - break; - case STB_GLOBAL: - if (i_sym.st_shndx != SHN_UNDEF - && i_sym.st_shndx != SHN_COMMON) - sym->symbol.flags |= BSF_GLOBAL; - break; - case STB_WEAK: - sym->symbol.flags |= BSF_WEAK; - break; - } - - switch (ELF_ST_TYPE (i_sym.st_info)) - { - case STT_SECTION: - sym->symbol.flags |= BSF_SECTION_SYM | BSF_DEBUGGING; - break; - case STT_FILE: - sym->symbol.flags |= BSF_FILE | BSF_DEBUGGING; - break; - case STT_FUNC: - sym->symbol.flags |= BSF_FUNCTION; - break; - case STT_OBJECT: - sym->symbol.flags |= BSF_OBJECT; - break; - } - - if (dynamic) - sym->symbol.flags |= BSF_DYNAMIC; - - /* Do some backend-specific processing on this symbol. */ - { - struct elf_backend_data *ebd = get_elf_backend_data (abfd); - if (ebd->elf_backend_symbol_processing) - (*ebd->elf_backend_symbol_processing) (abfd, &sym->symbol); - } - - sym++; - } - } - - /* Do some backend-specific processing on this symbol table. */ - { - struct elf_backend_data *ebd = get_elf_backend_data (abfd); - if (ebd->elf_backend_symbol_table_processing) - (*ebd->elf_backend_symbol_table_processing) (abfd, symbase, symcount); - } - - /* We rely on the zalloc to clear out the final symbol entry. */ - - symcount = sym - symbase; - - /* Fill in the user's symbol pointer vector if needed. */ - if (symptrs) - { - long l = symcount; - - sym = symbase; - while (l-- > 0) - { - *symptrs++ = &sym->symbol; - sym++; - } - *symptrs = 0; /* Final null pointer */ - } - - if (x_symp != NULL) - free (x_symp); - return symcount; -error_return: - if (x_symp != NULL) - free (x_symp); - return -1; -} - -/* Read in and swap the external relocs. */ - -static boolean -elf_slurp_reloc_table (abfd, asect, symbols) - bfd *abfd; - asection *asect; - asymbol **symbols; -{ - struct elf_backend_data * const ebd = get_elf_backend_data (abfd); - struct bfd_elf_section_data * const d = elf_section_data (asect); - PTR allocated = NULL; - bfd_byte *native_relocs; - arelent *relents; - arelent *relent; - unsigned int i; - int entsize; - - if (asect->relocation != NULL - || (asect->flags & SEC_RELOC) == 0 - || asect->reloc_count == 0) - return true; - - BFD_ASSERT (asect->rel_filepos == d->rel_hdr.sh_offset - && (asect->reloc_count - == d->rel_hdr.sh_size / d->rel_hdr.sh_entsize)); - - allocated = (PTR) bfd_malloc ((size_t) d->rel_hdr.sh_size); - if (allocated == NULL) - goto error_return; - - if (bfd_seek (abfd, asect->rel_filepos, SEEK_SET) != 0 - || (bfd_read (allocated, 1, d->rel_hdr.sh_size, abfd) - != d->rel_hdr.sh_size)) - goto error_return; - - native_relocs = (bfd_byte *) allocated; - - relents = ((arelent *) - bfd_alloc (abfd, asect->reloc_count * sizeof (arelent))); - if (relents == NULL) - goto error_return; - - entsize = d->rel_hdr.sh_entsize; - BFD_ASSERT (entsize == sizeof (Elf_External_Rel) - || entsize == sizeof (Elf_External_Rela)); - - for (i = 0, relent = relents; - i < asect->reloc_count; - i++, relent++, native_relocs += entsize) - { - Elf_Internal_Rela rela; - Elf_Internal_Rel rel; - - if (entsize == sizeof (Elf_External_Rela)) - elf_swap_reloca_in (abfd, (Elf_External_Rela *) native_relocs, &rela); - else - { - elf_swap_reloc_in (abfd, (Elf_External_Rel *) native_relocs, &rel); - rela.r_offset = rel.r_offset; - rela.r_info = rel.r_info; - rela.r_addend = 0; - } - - /* The address of an ELF reloc is section relative for an object - file, and absolute for an executable file or shared library. - The address of a BFD reloc is always section relative. */ - if ((abfd->flags & (EXEC_P | DYNAMIC)) == 0) - relent->address = rela.r_offset; - else - relent->address = rela.r_offset - asect->vma; - - if (ELF_R_SYM (rela.r_info) == 0) - relent->sym_ptr_ptr = bfd_abs_section_ptr->symbol_ptr_ptr; - else - { - asymbol **ps, *s; - - ps = symbols + ELF_R_SYM (rela.r_info) - 1; - s = *ps; - - /* Canonicalize ELF section symbols. FIXME: Why? */ - if ((s->flags & BSF_SECTION_SYM) == 0) - relent->sym_ptr_ptr = ps; - else - relent->sym_ptr_ptr = s->section->symbol_ptr_ptr; - } - - relent->addend = rela.r_addend; - - if (entsize == sizeof (Elf_External_Rela)) - (*ebd->elf_info_to_howto) (abfd, relent, &rela); - else - (*ebd->elf_info_to_howto_rel) (abfd, relent, &rel); - } - - asect->relocation = relents; - - if (allocated != NULL) - free (allocated); - - return true; - - error_return: - if (allocated != NULL) - free (allocated); - return false; -} - -#ifdef DEBUG -static void -elf_debug_section (num, hdr) - int num; - Elf_Internal_Shdr *hdr; -{ - fprintf (stderr, "\nSection#%d '%s' 0x%.8lx\n", num, - hdr->bfd_section != NULL ? hdr->bfd_section->name : "", - (long) hdr); - fprintf (stderr, - "sh_name = %ld\tsh_type = %ld\tsh_flags = %ld\n", - (long) hdr->sh_name, - (long) hdr->sh_type, - (long) hdr->sh_flags); - fprintf (stderr, - "sh_addr = %ld\tsh_offset = %ld\tsh_size = %ld\n", - (long) hdr->sh_addr, - (long) hdr->sh_offset, - (long) hdr->sh_size); - fprintf (stderr, - "sh_link = %ld\tsh_info = %ld\tsh_addralign = %ld\n", - (long) hdr->sh_link, - (long) hdr->sh_info, - (long) hdr->sh_addralign); - fprintf (stderr, "sh_entsize = %ld\n", - (long) hdr->sh_entsize); - fflush (stderr); -} - -static void -elf_debug_file (ehdrp) - Elf_Internal_Ehdr *ehdrp; -{ - fprintf (stderr, "e_entry = 0x%.8lx\n", (long) ehdrp->e_entry); - fprintf (stderr, "e_phoff = %ld\n", (long) ehdrp->e_phoff); - fprintf (stderr, "e_phnum = %ld\n", (long) ehdrp->e_phnum); - fprintf (stderr, "e_phentsize = %ld\n", (long) ehdrp->e_phentsize); - fprintf (stderr, "e_shoff = %ld\n", (long) ehdrp->e_shoff); - fprintf (stderr, "e_shnum = %ld\n", (long) ehdrp->e_shnum); - fprintf (stderr, "e_shentsize = %ld\n", (long) ehdrp->e_shentsize); -} - -static char * -elf_symbol_flags (flags) - flagword flags; -{ - static char buffer[1024]; - - buffer[0] = '\0'; - if (flags & BSF_LOCAL) - strcat (buffer, " local"); - - if (flags & BSF_GLOBAL) - strcat (buffer, " global"); - - if (flags & BSF_DEBUGGING) - strcat (buffer, " debug"); - - if (flags & BSF_FUNCTION) - strcat (buffer, " function"); - - if (flags & BSF_KEEP) - strcat (buffer, " keep"); - - if (flags & BSF_KEEP_G) - strcat (buffer, " keep_g"); - - if (flags & BSF_WEAK) - strcat (buffer, " weak"); - - if (flags & BSF_SECTION_SYM) - strcat (buffer, " section-sym"); - - if (flags & BSF_OLD_COMMON) - strcat (buffer, " old-common"); - - if (flags & BSF_NOT_AT_END) - strcat (buffer, " not-at-end"); - - if (flags & BSF_CONSTRUCTOR) - strcat (buffer, " constructor"); - - if (flags & BSF_WARNING) - strcat (buffer, " warning"); - - if (flags & BSF_INDIRECT) - strcat (buffer, " indirect"); - - if (flags & BSF_FILE) - strcat (buffer, " file"); - - if (flags & DYNAMIC) - strcat (buffer, " dynamic"); - - if (flags & ~(BSF_LOCAL - | BSF_GLOBAL - | BSF_DEBUGGING - | BSF_FUNCTION - | BSF_KEEP - | BSF_KEEP_G - | BSF_WEAK - | BSF_SECTION_SYM - | BSF_OLD_COMMON - | BSF_NOT_AT_END - | BSF_CONSTRUCTOR - | BSF_WARNING - | BSF_INDIRECT - | BSF_FILE - | BSF_DYNAMIC)) - strcat (buffer, " unknown-bits"); - - return buffer; -} -#endif - -#include "elfcore.h" -#include "elflink.h" - -/* Size-dependent data and functions. */ -const struct elf_size_info NAME(_bfd_elf,size_info) = { - sizeof (Elf_External_Ehdr), - sizeof (Elf_External_Phdr), - sizeof (Elf_External_Shdr), - sizeof (Elf_External_Rel), - sizeof (Elf_External_Rela), - sizeof (Elf_External_Sym), - sizeof (Elf_External_Dyn), - sizeof (Elf_External_Note), - - ARCH_SIZE, FILE_ALIGN, - ELFCLASS, EV_CURRENT, - write_out_phdrs, - write_shdrs_and_ehdr, - write_relocs, - elf_swap_symbol_out, - elf_slurp_reloc_table, - elf_slurp_symbol_table, - elf_swap_dyn_in -}; diff --git a/contrib/gdb/bfd/elfcore.h b/contrib/gdb/bfd/elfcore.h deleted file mode 100644 index 8100627c9ade7..0000000000000 --- a/contrib/gdb/bfd/elfcore.h +++ /dev/null @@ -1,475 +0,0 @@ -/* ELF core file support for BFD. - Copyright (C) 1995, 1996 Free Software Foundation, Inc. - -This file is part of BFD, the Binary File Descriptor library. - -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 2 of the License, 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ -/* Core file support */ - -#ifdef HAVE_SYS_PROCFS_H /* Some core file support requires host /proc files */ -#include <signal.h> -#include <sys/procfs.h> -#else -#define bfd_prstatus(abfd, descdata, descsz, filepos) true -#define bfd_fpregset(abfd, descdata, descsz, filepos) true -#define bfd_prpsinfo(abfd, descdata, descsz, filepos) true -#endif - -#ifdef HAVE_SYS_PROCFS_H - -static boolean -bfd_prstatus (abfd, descdata, descsz, filepos) - bfd *abfd; - char *descdata; - int descsz; - long filepos; -{ - asection *newsect; - prstatus_t *status = (prstatus_t *) 0; - - if (descsz == sizeof (prstatus_t)) - { - newsect = bfd_make_section (abfd, ".reg"); - if (newsect == NULL) - return false; - newsect->_raw_size = sizeof (status->pr_reg); - newsect->filepos = filepos + (long) &status->pr_reg; - newsect->flags = SEC_HAS_CONTENTS; - newsect->alignment_power = 2; - if ((core_prstatus (abfd) = bfd_alloc (abfd, descsz)) != NULL) - { - memcpy (core_prstatus (abfd), descdata, descsz); - } - } - return true; -} - -/* Stash a copy of the prpsinfo structure away for future use. */ - -static boolean -bfd_prpsinfo (abfd, descdata, descsz, filepos) - bfd *abfd; - char *descdata; - int descsz; - long filepos; -{ - if (descsz == sizeof (prpsinfo_t)) - { - if ((core_prpsinfo (abfd) = bfd_alloc (abfd, descsz)) == NULL) - return false; - memcpy (core_prpsinfo (abfd), descdata, descsz); - } - return true; -} - -static boolean -bfd_fpregset (abfd, descdata, descsz, filepos) - bfd *abfd; - char *descdata; - int descsz; - long filepos; -{ - asection *newsect; - - newsect = bfd_make_section (abfd, ".reg2"); - if (newsect == NULL) - return false; - newsect->_raw_size = descsz; - newsect->filepos = filepos; - newsect->flags = SEC_HAS_CONTENTS; - newsect->alignment_power = 2; - return true; -} - -#endif /* HAVE_SYS_PROCFS_H */ - -/* Return a pointer to the args (including the command name) that were - seen by the program that generated the core dump. Note that for - some reason, a spurious space is tacked onto the end of the args - in some (at least one anyway) implementations, so strip it off if - it exists. */ - -char * -elf_core_file_failing_command (abfd) - bfd *abfd; -{ -#ifdef HAVE_SYS_PROCFS_H - if (core_prpsinfo (abfd)) - { - prpsinfo_t *p = core_prpsinfo (abfd); - char *scan = p->pr_psargs; - while (*scan++) - {; - } - scan -= 2; - if ((scan > p->pr_psargs) && (*scan == ' ')) - { - *scan = '\000'; - } - return p->pr_psargs; - } -#endif - return NULL; -} - -/* Return the number of the signal that caused the core dump. Presumably, - since we have a core file, we got a signal of some kind, so don't bother - checking the other process status fields, just return the signal number. - */ - -int -elf_core_file_failing_signal (abfd) - bfd *abfd; -{ -#ifdef HAVE_SYS_PROCFS_H - if (core_prstatus (abfd)) - { - return ((prstatus_t *) (core_prstatus (abfd)))->pr_cursig; - } -#endif - return -1; -} - -/* Check to see if the core file could reasonably be expected to have - come for the current executable file. Note that by default we return - true unless we find something that indicates that there might be a - problem. - */ - -boolean -elf_core_file_matches_executable_p (core_bfd, exec_bfd) - bfd *core_bfd; - bfd *exec_bfd; -{ -#ifdef HAVE_SYS_PROCFS_H - char *corename; - char *execname; -#endif - - /* First, xvecs must match since both are ELF files for the same target. */ - - if (core_bfd->xvec != exec_bfd->xvec) - { - bfd_set_error (bfd_error_system_call); - return false; - } - -#ifdef HAVE_SYS_PROCFS_H - - /* If no prpsinfo, just return true. Otherwise, grab the last component - of the exec'd pathname from the prpsinfo. */ - - if (core_prpsinfo (core_bfd)) - { - corename = (((prpsinfo_t *) core_prpsinfo (core_bfd))->pr_fname); - } - else - { - return true; - } - - /* Find the last component of the executable pathname. */ - - if ((execname = strrchr (exec_bfd->filename, '/')) != NULL) - { - execname++; - } - else - { - execname = (char *) exec_bfd->filename; - } - - /* See if they match */ - - return strcmp (execname, corename) ? false : true; - -#else - - return true; - -#endif /* HAVE_SYS_PROCFS_H */ -} - -/* ELF core files contain a segment of type PT_NOTE, that holds much of - the information that would normally be available from the /proc interface - for the process, at the time the process dumped core. Currently this - includes copies of the prstatus, prpsinfo, and fpregset structures. - - Since these structures are potentially machine dependent in size and - ordering, bfd provides two levels of support for them. The first level, - available on all machines since it does not require that the host - have /proc support or the relevant include files, is to create a bfd - section for each of the prstatus, prpsinfo, and fpregset structures, - without any interpretation of their contents. With just this support, - the bfd client will have to interpret the structures itself. Even with - /proc support, it might want these full structures for it's own reasons. - - In the second level of support, where HAVE_SYS_PROCFS_H is defined, - bfd will pick apart the structures to gather some additional - information that clients may want, such as the general register - set, the name of the exec'ed file and its arguments, the signal (if - any) that caused the core dump, etc. - - */ - -static boolean -elf_corefile_note (abfd, hdr) - bfd *abfd; - Elf_Internal_Phdr *hdr; -{ - Elf_External_Note *x_note_p; /* Elf note, external form */ - Elf_Internal_Note i_note; /* Elf note, internal form */ - char *buf = NULL; /* Entire note segment contents */ - char *namedata; /* Name portion of the note */ - char *descdata; /* Descriptor portion of the note */ - char *sectname; /* Name to use for new section */ - long filepos; /* File offset to descriptor data */ - asection *newsect; - - if (hdr->p_filesz > 0 - && (buf = (char *) bfd_malloc ((size_t) hdr->p_filesz)) != NULL - && bfd_seek (abfd, hdr->p_offset, SEEK_SET) != -1 - && bfd_read ((PTR) buf, hdr->p_filesz, 1, abfd) == hdr->p_filesz) - { - x_note_p = (Elf_External_Note *) buf; - while ((char *) x_note_p < (buf + hdr->p_filesz)) - { - i_note.namesz = bfd_h_get_32 (abfd, (bfd_byte *) x_note_p->namesz); - i_note.descsz = bfd_h_get_32 (abfd, (bfd_byte *) x_note_p->descsz); - i_note.type = bfd_h_get_32 (abfd, (bfd_byte *) x_note_p->type); - namedata = x_note_p->name; - descdata = namedata + BFD_ALIGN (i_note.namesz, 4); - filepos = hdr->p_offset + (descdata - buf); - switch (i_note.type) - { - case NT_PRSTATUS: - /* process descdata as prstatus info */ - if (! bfd_prstatus (abfd, descdata, i_note.descsz, filepos)) - return false; - sectname = ".prstatus"; - break; - case NT_FPREGSET: - /* process descdata as fpregset info */ - if (! bfd_fpregset (abfd, descdata, i_note.descsz, filepos)) - return false; - sectname = ".fpregset"; - break; - case NT_PRPSINFO: - /* process descdata as prpsinfo */ - if (! bfd_prpsinfo (abfd, descdata, i_note.descsz, filepos)) - return false; - sectname = ".prpsinfo"; - break; - default: - /* Unknown descriptor, just ignore it. */ - sectname = NULL; - break; - } - if (sectname != NULL) - { - newsect = bfd_make_section (abfd, sectname); - if (newsect == NULL) - return false; - newsect->_raw_size = i_note.descsz; - newsect->filepos = filepos; - newsect->flags = SEC_ALLOC | SEC_HAS_CONTENTS; - newsect->alignment_power = 2; - } - x_note_p = (Elf_External_Note *) - (descdata + BFD_ALIGN (i_note.descsz, 4)); - } - } - if (buf != NULL) - { - free (buf); - } - else if (hdr->p_filesz > 0) - { - return false; - } - return true; - -} - -/* Core files are simply standard ELF formatted files that partition - the file using the execution view of the file (program header table) - rather than the linking view. In fact, there is no section header - table in a core file. - - The process status information (including the contents of the general - register set) and the floating point register set are stored in a - segment of type PT_NOTE. We handcraft a couple of extra bfd sections - that allow standard bfd access to the general registers (.reg) and the - floating point registers (.reg2). - - */ - -const bfd_target * -elf_core_file_p (abfd) - bfd *abfd; -{ - Elf_External_Ehdr x_ehdr; /* Elf file header, external form */ - Elf_Internal_Ehdr *i_ehdrp; /* Elf file header, internal form */ - Elf_External_Phdr x_phdr; /* Program header table entry, external form */ - Elf_Internal_Phdr *i_phdrp; /* Program header table, internal form */ - unsigned int phindex; - struct elf_backend_data *ebd; - - /* Read in the ELF header in external format. */ - - if (bfd_read ((PTR) & x_ehdr, sizeof (x_ehdr), 1, abfd) != sizeof (x_ehdr)) - { - if (bfd_get_error () != bfd_error_system_call) - bfd_set_error (bfd_error_wrong_format); - return NULL; - } - - /* Now check to see if we have a valid ELF file, and one that BFD can - make use of. The magic number must match, the address size ('class') - and byte-swapping must match our XVEC entry, and it must have a - program header table (FIXME: See comments re segments at top of this - file). */ - - if (elf_file_p (&x_ehdr) == false) - { - wrong: - bfd_set_error (bfd_error_wrong_format); - return NULL; - } - - /* FIXME, Check EI_VERSION here ! */ - - { -#if ARCH_SIZE == 32 - int desired_address_size = ELFCLASS32; -#endif -#if ARCH_SIZE == 64 - int desired_address_size = ELFCLASS64; -#endif - - if (x_ehdr.e_ident[EI_CLASS] != desired_address_size) - goto wrong; - } - - /* Switch xvec to match the specified byte order. */ - switch (x_ehdr.e_ident[EI_DATA]) - { - case ELFDATA2MSB: /* Big-endian */ - if (! bfd_big_endian (abfd)) - goto wrong; - break; - case ELFDATA2LSB: /* Little-endian */ - if (! bfd_little_endian (abfd)) - goto wrong; - break; - case ELFDATANONE: /* No data encoding specified */ - default: /* Unknown data encoding specified */ - goto wrong; - } - - /* Allocate an instance of the elf_obj_tdata structure and hook it up to - the tdata pointer in the bfd. */ - - elf_tdata (abfd) = - (struct elf_obj_tdata *) bfd_zalloc (abfd, sizeof (struct elf_obj_tdata)); - if (elf_tdata (abfd) == NULL) - return NULL; - - /* FIXME, `wrong' returns from this point onward, leak memory. */ - - /* Now that we know the byte order, swap in the rest of the header */ - i_ehdrp = elf_elfheader (abfd); - elf_swap_ehdr_in (abfd, &x_ehdr, i_ehdrp); -#if DEBUG & 1 - elf_debug_file (i_ehdrp); -#endif - - ebd = get_elf_backend_data (abfd); - - /* Check that the ELF e_machine field matches what this particular - BFD format expects. */ - if (ebd->elf_machine_code != i_ehdrp->e_machine - && (ebd->elf_machine_alt1 == 0 || i_ehdrp->e_machine != ebd->elf_machine_alt1) - && (ebd->elf_machine_alt2 == 0 || i_ehdrp->e_machine != ebd->elf_machine_alt2)) - { - const bfd_target * const *target_ptr; - - if (ebd->elf_machine_code != EM_NONE) - goto wrong; - - /* This is the generic ELF target. Let it match any ELF target - for which we do not have a specific backend. */ - for (target_ptr = bfd_target_vector; *target_ptr != NULL; target_ptr++) - { - struct elf_backend_data *back; - - if ((*target_ptr)->flavour != bfd_target_elf_flavour) - continue; - back = (struct elf_backend_data *) (*target_ptr)->backend_data; - if (back->elf_machine_code == i_ehdrp->e_machine) - { - /* target_ptr is an ELF backend which matches this - object file, so reject the generic ELF target. */ - goto wrong; - } - } - } - - /* If there is no program header, or the type is not a core file, then - we are hosed. */ - if (i_ehdrp->e_phoff == 0 || i_ehdrp->e_type != ET_CORE) - goto wrong; - - /* Allocate space for a copy of the program header table in - internal form, seek to the program header table in the file, - read it in, and convert it to internal form. As a simple sanity - check, verify that the what BFD thinks is the size of each program - header table entry actually matches the size recorded in the file. */ - - if (i_ehdrp->e_phentsize != sizeof (x_phdr)) - goto wrong; - i_phdrp = (Elf_Internal_Phdr *) - bfd_alloc (abfd, sizeof (*i_phdrp) * i_ehdrp->e_phnum); - if (!i_phdrp) - return NULL; - if (bfd_seek (abfd, i_ehdrp->e_phoff, SEEK_SET) == -1) - return NULL; - for (phindex = 0; phindex < i_ehdrp->e_phnum; phindex++) - { - if (bfd_read ((PTR) & x_phdr, sizeof (x_phdr), 1, abfd) - != sizeof (x_phdr)) - return NULL; - elf_swap_phdr_in (abfd, &x_phdr, i_phdrp + phindex); - } - - /* Once all of the program headers have been read and converted, we - can start processing them. */ - - for (phindex = 0; phindex < i_ehdrp->e_phnum; phindex++) - { - bfd_section_from_phdr (abfd, i_phdrp + phindex, phindex); - if ((i_phdrp + phindex)->p_type == PT_NOTE) - { - if (! elf_corefile_note (abfd, i_phdrp + phindex)) - return NULL; - } - } - - /* Remember the entry point specified in the ELF file header. */ - - bfd_get_start_address (abfd) = i_ehdrp->e_entry; - - return abfd->xvec; -} diff --git a/contrib/gdb/bfd/elflink.c b/contrib/gdb/bfd/elflink.c deleted file mode 100644 index 7b204f763e090..0000000000000 --- a/contrib/gdb/bfd/elflink.c +++ /dev/null @@ -1,372 +0,0 @@ -/* ELF linking support for BFD. - Copyright 1995 Free Software Foundation, Inc. - -This file is part of BFD, the Binary File Descriptor library. - -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 2 of the License, 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ - -#include "bfd.h" -#include "sysdep.h" -#include "bfdlink.h" -#include "libbfd.h" -#define ARCH_SIZE 0 -#include "elf-bfd.h" - -boolean -_bfd_elf_create_got_section (abfd, info) - bfd *abfd; - struct bfd_link_info *info; -{ - flagword flags; - register asection *s; - struct elf_link_hash_entry *h; - struct elf_backend_data *bed = get_elf_backend_data (abfd); - - /* This function may be called more than once. */ - if (bfd_get_section_by_name (abfd, ".got") != NULL) - return true; - - flags = SEC_ALLOC | SEC_LOAD | SEC_HAS_CONTENTS | SEC_IN_MEMORY; - - s = bfd_make_section (abfd, ".got"); - if (s == NULL - || !bfd_set_section_flags (abfd, s, flags) - || !bfd_set_section_alignment (abfd, s, 2)) - return false; - - if (bed->want_got_plt) - { - s = bfd_make_section (abfd, ".got.plt"); - if (s == NULL - || !bfd_set_section_flags (abfd, s, flags) - || !bfd_set_section_alignment (abfd, s, 2)) - return false; - } - - /* Define the symbol _GLOBAL_OFFSET_TABLE_ at the start of the .got - (or .got.plt) section. We don't do this in the linker script - because we don't want to define the symbol if we are not creating - a global offset table. */ - h = NULL; - if (!(_bfd_generic_link_add_one_symbol - (info, abfd, "_GLOBAL_OFFSET_TABLE_", BSF_GLOBAL, s, (bfd_vma) 0, - (const char *) NULL, false, get_elf_backend_data (abfd)->collect, - (struct bfd_link_hash_entry **) &h))) - return false; - h->elf_link_hash_flags |= ELF_LINK_HASH_DEF_REGULAR; - h->type = STT_OBJECT; - - if (info->shared - && ! _bfd_elf_link_record_dynamic_symbol (info, h)) - return false; - - /* The first three global offset table entries are reserved. */ - s->_raw_size += 3 * 4; - - return true; -} - - -/* Create dynamic sections when linking against a dynamic object. */ - -boolean -_bfd_elf_create_dynamic_sections (abfd, info) - bfd *abfd; - struct bfd_link_info *info; -{ - flagword flags; - register asection *s; - struct elf_backend_data *bed = get_elf_backend_data (abfd); - - /* We need to create .plt, .rel[a].plt, .got, .got.plt, .dynbss, and - .rel[a].bss sections. */ - - flags = SEC_ALLOC | SEC_LOAD | SEC_HAS_CONTENTS | SEC_IN_MEMORY; - - s = bfd_make_section (abfd, ".plt"); - if (s == NULL - || ! bfd_set_section_flags (abfd, s, - (flags | SEC_CODE - | (bed->plt_readonly ? SEC_READONLY : 0))) - || ! bfd_set_section_alignment (abfd, s, 2)) - return false; - - if (bed->want_plt_sym) - { - /* Define the symbol _PROCEDURE_LINKAGE_TABLE_ at the start of the - .plt section. */ - struct elf_link_hash_entry *h = NULL; - if (! (_bfd_generic_link_add_one_symbol - (info, abfd, "_PROCEDURE_LINKAGE_TABLE_", BSF_GLOBAL, s, - (bfd_vma) 0, (const char *) NULL, false, - get_elf_backend_data (abfd)->collect, - (struct bfd_link_hash_entry **) &h))) - return false; - h->elf_link_hash_flags |= ELF_LINK_HASH_DEF_REGULAR; - h->type = STT_OBJECT; - - if (info->shared - && ! _bfd_elf_link_record_dynamic_symbol (info, h)) - return false; - } - - s = bfd_make_section (abfd, bed->use_rela_p ? ".rela.plt" : ".rel.plt"); - if (s == NULL - || ! bfd_set_section_flags (abfd, s, flags | SEC_READONLY) - || ! bfd_set_section_alignment (abfd, s, 2)) - return false; - - if (! _bfd_elf_create_got_section (abfd, info)) - return false; - - /* The .dynbss section is a place to put symbols which are defined - by dynamic objects, are referenced by regular objects, and are - not functions. We must allocate space for them in the process - image and use a R_*_COPY reloc to tell the dynamic linker to - initialize them at run time. The linker script puts the .dynbss - section into the .bss section of the final image. */ - s = bfd_make_section (abfd, ".dynbss"); - if (s == NULL - || ! bfd_set_section_flags (abfd, s, SEC_ALLOC)) - return false; - - /* The .rel[a].bss section holds copy relocs. This section is not - normally needed. We need to create it here, though, so that the - linker will map it to an output section. We can't just create it - only if we need it, because we will not know whether we need it - until we have seen all the input files, and the first time the - main linker code calls BFD after examining all the input files - (size_dynamic_sections) the input sections have already been - mapped to the output sections. If the section turns out not to - be needed, we can discard it later. We will never need this - section when generating a shared object, since they do not use - copy relocs. */ - if (! info->shared) - { - s = bfd_make_section (abfd, bed->use_rela_p ? ".rela.bss" : ".rel.bss"); - if (s == NULL - || ! bfd_set_section_flags (abfd, s, flags | SEC_READONLY) - || ! bfd_set_section_alignment (abfd, s, 2)) - return false; - } - - return true; -} - - -/* Record a new dynamic symbol. We record the dynamic symbols as we - read the input files, since we need to have a list of all of them - before we can determine the final sizes of the output sections. - Note that we may actually call this function even though we are not - going to output any dynamic symbols; in some cases we know that a - symbol should be in the dynamic symbol table, but only if there is - one. */ - -boolean -_bfd_elf_link_record_dynamic_symbol (info, h) - struct bfd_link_info *info; - struct elf_link_hash_entry *h; -{ - if (h->dynindx == -1) - { - struct bfd_strtab_hash *dynstr; - - h->dynindx = elf_hash_table (info)->dynsymcount; - ++elf_hash_table (info)->dynsymcount; - - dynstr = elf_hash_table (info)->dynstr; - if (dynstr == NULL) - { - /* Create a strtab to hold the dynamic symbol names. */ - elf_hash_table (info)->dynstr = dynstr = _bfd_elf_stringtab_init (); - if (dynstr == NULL) - return false; - } - - h->dynstr_index = ((unsigned long) - _bfd_stringtab_add (dynstr, h->root.root.string, - true, false)); - if (h->dynstr_index == (unsigned long) -1) - return false; - } - - return true; -} - -/* Create a special linker section, or return a pointer to a linker section already created */ - -elf_linker_section_t * -_bfd_elf_create_linker_section (abfd, info, which, defaults) - bfd *abfd; - struct bfd_link_info *info; - enum elf_linker_section_enum which; - elf_linker_section_t *defaults; -{ - bfd *dynobj = elf_hash_table (info)->dynobj; - elf_linker_section_t *lsect; - - /* Record the first bfd section that needs the special section */ - if (!dynobj) - dynobj = elf_hash_table (info)->dynobj = abfd; - - /* If this is the first time, create the section */ - lsect = elf_linker_section (dynobj, which); - if (!lsect) - { - asection *s; - - lsect = (elf_linker_section_t *) - bfd_alloc (dynobj, sizeof (elf_linker_section_t)); - - *lsect = *defaults; - elf_linker_section (dynobj, which) = lsect; - lsect->which = which; - lsect->hole_written_p = false; - - /* See if the sections already exist */ - lsect->section = s = bfd_get_section_by_name (dynobj, lsect->name); - if (!s) - { - lsect->section = s = bfd_make_section (dynobj, lsect->name); - - if (s == NULL) - return (elf_linker_section_t *)0; - - bfd_set_section_flags (dynobj, s, defaults->flags); - bfd_set_section_alignment (dynobj, s, lsect->alignment); - } - else if (bfd_get_section_alignment (dynobj, s) < lsect->alignment) - bfd_set_section_alignment (dynobj, s, lsect->alignment); - - s->_raw_size = align_power (s->_raw_size, lsect->alignment); - - /* Is there a hole we have to provide? If so check whether the segment is - too big already */ - if (lsect->hole_size) - { - lsect->hole_offset = s->_raw_size; - s->_raw_size += lsect->hole_size; - if (lsect->hole_offset > lsect->max_hole_offset) - { - (*_bfd_error_handler) ("%s: Section %s is already to large to put hole of %ld bytes in", - bfd_get_filename (abfd), - lsect->name, - (long)lsect->hole_size); - - bfd_set_error (bfd_error_bad_value); - return (elf_linker_section_t *)0; - } - } - -#ifdef DEBUG - fprintf (stderr, "Creating section %s, current size = %ld\n", - lsect->name, (long)s->_raw_size); -#endif - - if (lsect->sym_name) - { - struct elf_link_hash_entry *h = NULL; -#ifdef DEBUG - fprintf (stderr, "Adding %s to section %s\n", - lsect->sym_name, - lsect->name); -#endif - h = (struct elf_link_hash_entry *) - bfd_link_hash_lookup (info->hash, lsect->sym_name, false, false, false); - - if ((h == NULL || h->root.type == bfd_link_hash_undefined) - && !(_bfd_generic_link_add_one_symbol (info, - abfd, - lsect->sym_name, - BSF_GLOBAL, - s, - ((lsect->hole_size) - ? s->_raw_size - lsect->hole_size + lsect->sym_offset - : lsect->sym_offset), - (const char *) NULL, - false, - get_elf_backend_data (abfd)->collect, - (struct bfd_link_hash_entry **) &h))) - return (elf_linker_section_t *)0; - - h->elf_link_hash_flags |= ELF_LINK_HASH_DEF_DYNAMIC; - h->type = STT_OBJECT; - lsect->sym_hash = h; - - if (info->shared - && ! _bfd_elf_link_record_dynamic_symbol (info, h)) - return (elf_linker_section_t *)0; - } - } - - /* Find the related sections if they have been created */ - if (lsect->bss_name && !lsect->bss_section) - lsect->bss_section = bfd_get_section_by_name (dynobj, lsect->bss_name); - - if (lsect->rel_name && !lsect->rel_section) - lsect->rel_section = bfd_get_section_by_name (dynobj, lsect->rel_name); - - return lsect; -} - - -/* Find a linker generated pointer with a given addend and type. */ - -elf_linker_section_pointers_t * -_bfd_elf_find_pointer_linker_section (linker_pointers, addend, which) - elf_linker_section_pointers_t *linker_pointers; - bfd_signed_vma addend; - elf_linker_section_enum_t which; -{ - for ( ; linker_pointers != NULL; linker_pointers = linker_pointers->next) - { - if (which == linker_pointers->which && addend == linker_pointers->addend) - return linker_pointers; - } - - return (elf_linker_section_pointers_t *)0; -} - - -/* Make the .rela section corresponding to the generated linker section. */ - -boolean -_bfd_elf_make_linker_section_rela (dynobj, lsect, alignment) - bfd *dynobj; - elf_linker_section_t *lsect; - int alignment; -{ - if (lsect->rel_section) - return true; - - lsect->rel_section = bfd_get_section_by_name (dynobj, lsect->rel_name); - if (lsect->rel_section == NULL) - { - lsect->rel_section = bfd_make_section (dynobj, lsect->rel_name); - if (lsect->rel_section == NULL - || ! bfd_set_section_flags (dynobj, - lsect->rel_section, - (SEC_ALLOC - | SEC_LOAD - | SEC_HAS_CONTENTS - | SEC_IN_MEMORY - | SEC_READONLY)) - || ! bfd_set_section_alignment (dynobj, lsect->rel_section, alignment)) - return false; - } - - return true; -} - diff --git a/contrib/gdb/bfd/elflink.h b/contrib/gdb/bfd/elflink.h deleted file mode 100644 index 4ef3c8b3c49b8..0000000000000 --- a/contrib/gdb/bfd/elflink.h +++ /dev/null @@ -1,3424 +0,0 @@ -/* ELF linker support. - Copyright 1995, 1996 Free Software Foundation, Inc. - -This file is part of BFD, the Binary File Descriptor library. - -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 2 of the License, 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ - -/* ELF linker code. */ - -static boolean elf_link_add_object_symbols - PARAMS ((bfd *, struct bfd_link_info *)); -static boolean elf_link_add_archive_symbols - PARAMS ((bfd *, struct bfd_link_info *)); -static Elf_Internal_Rela *elf_link_read_relocs - PARAMS ((bfd *, asection *, PTR, Elf_Internal_Rela *, boolean)); -static boolean elf_export_symbol - PARAMS ((struct elf_link_hash_entry *, PTR)); -static boolean elf_adjust_dynamic_symbol - PARAMS ((struct elf_link_hash_entry *, PTR)); - -/* This struct is used to pass information to routines called via - elf_link_hash_traverse which must return failure. */ - -struct elf_info_failed -{ - boolean failed; - struct bfd_link_info *info; -}; - -/* Given an ELF BFD, add symbols to the global hash table as - appropriate. */ - -boolean -elf_bfd_link_add_symbols (abfd, info) - bfd *abfd; - struct bfd_link_info *info; -{ - switch (bfd_get_format (abfd)) - { - case bfd_object: - return elf_link_add_object_symbols (abfd, info); - case bfd_archive: - return elf_link_add_archive_symbols (abfd, info); - default: - bfd_set_error (bfd_error_wrong_format); - return false; - } -} - - -/* Add symbols from an ELF archive file to the linker hash table. We - don't use _bfd_generic_link_add_archive_symbols because of a - problem which arises on UnixWare. The UnixWare libc.so is an - archive which includes an entry libc.so.1 which defines a bunch of - symbols. The libc.so archive also includes a number of other - object files, which also define symbols, some of which are the same - as those defined in libc.so.1. Correct linking requires that we - consider each object file in turn, and include it if it defines any - symbols we need. _bfd_generic_link_add_archive_symbols does not do - this; it looks through the list of undefined symbols, and includes - any object file which defines them. When this algorithm is used on - UnixWare, it winds up pulling in libc.so.1 early and defining a - bunch of symbols. This means that some of the other objects in the - archive are not included in the link, which is incorrect since they - precede libc.so.1 in the archive. - - Fortunately, ELF archive handling is simpler than that done by - _bfd_generic_link_add_archive_symbols, which has to allow for a.out - oddities. In ELF, if we find a symbol in the archive map, and the - symbol is currently undefined, we know that we must pull in that - object file. - - Unfortunately, we do have to make multiple passes over the symbol - table until nothing further is resolved. */ - -static boolean -elf_link_add_archive_symbols (abfd, info) - bfd *abfd; - struct bfd_link_info *info; -{ - symindex c; - boolean *defined = NULL; - boolean *included = NULL; - carsym *symdefs; - boolean loop; - - if (! bfd_has_map (abfd)) - { - /* An empty archive is a special case. */ - if (bfd_openr_next_archived_file (abfd, (bfd *) NULL) == NULL) - return true; - bfd_set_error (bfd_error_no_armap); - return false; - } - - /* Keep track of all symbols we know to be already defined, and all - files we know to be already included. This is to speed up the - second and subsequent passes. */ - c = bfd_ardata (abfd)->symdef_count; - if (c == 0) - return true; - defined = (boolean *) bfd_malloc (c * sizeof (boolean)); - included = (boolean *) bfd_malloc (c * sizeof (boolean)); - if (defined == (boolean *) NULL || included == (boolean *) NULL) - goto error_return; - memset (defined, 0, c * sizeof (boolean)); - memset (included, 0, c * sizeof (boolean)); - - symdefs = bfd_ardata (abfd)->symdefs; - - do - { - file_ptr last; - symindex i; - carsym *symdef; - carsym *symdefend; - - loop = false; - last = -1; - - symdef = symdefs; - symdefend = symdef + c; - for (i = 0; symdef < symdefend; symdef++, i++) - { - struct elf_link_hash_entry *h; - bfd *element; - struct bfd_link_hash_entry *undefs_tail; - symindex mark; - - if (defined[i] || included[i]) - continue; - if (symdef->file_offset == last) - { - included[i] = true; - continue; - } - - h = elf_link_hash_lookup (elf_hash_table (info), symdef->name, - false, false, false); - if (h == (struct elf_link_hash_entry *) NULL) - continue; - if (h->root.type != bfd_link_hash_undefined) - { - if (h->root.type != bfd_link_hash_undefweak) - defined[i] = true; - continue; - } - - /* We need to include this archive member. */ - - element = _bfd_get_elt_at_filepos (abfd, symdef->file_offset); - if (element == (bfd *) NULL) - goto error_return; - - if (! bfd_check_format (element, bfd_object)) - goto error_return; - - /* Doublecheck that we have not included this object - already--it should be impossible, but there may be - something wrong with the archive. */ - if (element->archive_pass != 0) - { - bfd_set_error (bfd_error_bad_value); - goto error_return; - } - element->archive_pass = 1; - - undefs_tail = info->hash->undefs_tail; - - if (! (*info->callbacks->add_archive_element) (info, element, - symdef->name)) - goto error_return; - if (! elf_link_add_object_symbols (element, info)) - goto error_return; - - /* If there are any new undefined symbols, we need to make - another pass through the archive in order to see whether - they can be defined. FIXME: This isn't perfect, because - common symbols wind up on undefs_tail and because an - undefined symbol which is defined later on in this pass - does not require another pass. This isn't a bug, but it - does make the code less efficient than it could be. */ - if (undefs_tail != info->hash->undefs_tail) - loop = true; - - /* Look backward to mark all symbols from this object file - which we have already seen in this pass. */ - mark = i; - do - { - included[mark] = true; - if (mark == 0) - break; - --mark; - } - while (symdefs[mark].file_offset == symdef->file_offset); - - /* We mark subsequent symbols from this object file as we go - on through the loop. */ - last = symdef->file_offset; - } - } - while (loop); - - free (defined); - free (included); - - return true; - - error_return: - if (defined != (boolean *) NULL) - free (defined); - if (included != (boolean *) NULL) - free (included); - return false; -} - -/* Add symbols from an ELF object file to the linker hash table. */ - -static boolean -elf_link_add_object_symbols (abfd, info) - bfd *abfd; - struct bfd_link_info *info; -{ - boolean (*add_symbol_hook) PARAMS ((bfd *, struct bfd_link_info *, - const Elf_Internal_Sym *, - const char **, flagword *, - asection **, bfd_vma *)); - boolean (*check_relocs) PARAMS ((bfd *, struct bfd_link_info *, - asection *, const Elf_Internal_Rela *)); - boolean collect; - Elf_Internal_Shdr *hdr; - size_t symcount; - size_t extsymcount; - size_t extsymoff; - Elf_External_Sym *buf = NULL; - struct elf_link_hash_entry **sym_hash; - boolean dynamic; - Elf_External_Dyn *dynbuf = NULL; - struct elf_link_hash_entry *weaks; - Elf_External_Sym *esym; - Elf_External_Sym *esymend; - - add_symbol_hook = get_elf_backend_data (abfd)->elf_add_symbol_hook; - collect = get_elf_backend_data (abfd)->collect; - - /* As a GNU extension, any input sections which are named - .gnu.warning.SYMBOL are treated as warning symbols for the given - symbol. This differs from .gnu.warning sections, which generate - warnings when they are included in an output file. */ - if (! info->shared) - { - asection *s; - - for (s = abfd->sections; s != NULL; s = s->next) - { - const char *name; - - name = bfd_get_section_name (abfd, s); - if (strncmp (name, ".gnu.warning.", sizeof ".gnu.warning." - 1) == 0) - { - char *msg; - bfd_size_type sz; - - sz = bfd_section_size (abfd, s); - msg = (char *) bfd_alloc (abfd, sz); - if (msg == NULL) - goto error_return; - - if (! bfd_get_section_contents (abfd, s, msg, (file_ptr) 0, sz)) - goto error_return; - - if (! (_bfd_generic_link_add_one_symbol - (info, abfd, - name + sizeof ".gnu.warning." - 1, - BSF_WARNING, s, (bfd_vma) 0, msg, false, collect, - (struct bfd_link_hash_entry **) NULL))) - goto error_return; - - if (! info->relocateable) - { - /* Clobber the section size so that the warning does - not get copied into the output file. */ - s->_raw_size = 0; - } - } - } - } - - /* A stripped shared library might only have a dynamic symbol table, - not a regular symbol table. In that case we can still go ahead - and link using the dynamic symbol table. */ - if (elf_onesymtab (abfd) == 0 - && elf_dynsymtab (abfd) != 0) - { - elf_onesymtab (abfd) = elf_dynsymtab (abfd); - elf_tdata (abfd)->symtab_hdr = elf_tdata (abfd)->dynsymtab_hdr; - } - - hdr = &elf_tdata (abfd)->symtab_hdr; - symcount = hdr->sh_size / sizeof (Elf_External_Sym); - - /* The sh_info field of the symtab header tells us where the - external symbols start. We don't care about the local symbols at - this point. */ - if (elf_bad_symtab (abfd)) - { - extsymcount = symcount; - extsymoff = 0; - } - else - { - extsymcount = symcount - hdr->sh_info; - extsymoff = hdr->sh_info; - } - - buf = ((Elf_External_Sym *) - bfd_malloc (extsymcount * sizeof (Elf_External_Sym))); - if (buf == NULL && extsymcount != 0) - goto error_return; - - /* We store a pointer to the hash table entry for each external - symbol. */ - sym_hash = ((struct elf_link_hash_entry **) - bfd_alloc (abfd, - extsymcount * sizeof (struct elf_link_hash_entry *))); - if (sym_hash == NULL) - goto error_return; - elf_sym_hashes (abfd) = sym_hash; - - if (elf_elfheader (abfd)->e_type != ET_DYN) - { - dynamic = false; - - /* If we are creating a shared library, create all the dynamic - sections immediately. We need to attach them to something, - so we attach them to this BFD, provided it is the right - format. FIXME: If there are no input BFD's of the same - format as the output, we can't make a shared library. */ - if (info->shared - && ! elf_hash_table (info)->dynamic_sections_created - && abfd->xvec == info->hash->creator) - { - if (! elf_link_create_dynamic_sections (abfd, info)) - goto error_return; - } - } - else - { - asection *s; - boolean add_needed; - const char *name; - bfd_size_type oldsize; - bfd_size_type strindex; - - dynamic = true; - - /* You can't use -r against a dynamic object. Also, there's no - hope of using a dynamic object which does not exactly match - the format of the output file. */ - if (info->relocateable - || info->hash->creator != abfd->xvec) - { - bfd_set_error (bfd_error_invalid_operation); - goto error_return; - } - - /* Find the name to use in a DT_NEEDED entry that refers to this - object. If the object has a DT_SONAME entry, we use it. - Otherwise, if the generic linker stuck something in - elf_dt_name, we use that. Otherwise, we just use the file - name. If the generic linker put a null string into - elf_dt_name, we don't make a DT_NEEDED entry at all, even if - there is a DT_SONAME entry. */ - add_needed = true; - name = bfd_get_filename (abfd); - if (elf_dt_name (abfd) != NULL) - { - name = elf_dt_name (abfd); - if (*name == '\0') - add_needed = false; - } - s = bfd_get_section_by_name (abfd, ".dynamic"); - if (s != NULL) - { - Elf_External_Dyn *extdyn; - Elf_External_Dyn *extdynend; - int elfsec; - unsigned long link; - - dynbuf = (Elf_External_Dyn *) bfd_malloc ((size_t) s->_raw_size); - if (dynbuf == NULL) - goto error_return; - - if (! bfd_get_section_contents (abfd, s, (PTR) dynbuf, - (file_ptr) 0, s->_raw_size)) - goto error_return; - - elfsec = _bfd_elf_section_from_bfd_section (abfd, s); - if (elfsec == -1) - goto error_return; - link = elf_elfsections (abfd)[elfsec]->sh_link; - - extdyn = dynbuf; - extdynend = extdyn + s->_raw_size / sizeof (Elf_External_Dyn); - for (; extdyn < extdynend; extdyn++) - { - Elf_Internal_Dyn dyn; - - elf_swap_dyn_in (abfd, extdyn, &dyn); - if (dyn.d_tag == DT_SONAME) - { - name = bfd_elf_string_from_elf_section (abfd, link, - dyn.d_un.d_val); - if (name == NULL) - goto error_return; - } - if (dyn.d_tag == DT_NEEDED) - { - struct bfd_link_needed_list *n, **pn; - char *fnm, *anm; - - n = ((struct bfd_link_needed_list *) - bfd_alloc (abfd, sizeof (struct bfd_link_needed_list))); - fnm = bfd_elf_string_from_elf_section (abfd, link, - dyn.d_un.d_val); - if (n == NULL || fnm == NULL) - goto error_return; - anm = bfd_alloc (abfd, strlen (fnm) + 1); - if (anm == NULL) - goto error_return; - strcpy (anm, fnm); - n->name = anm; - n->by = abfd; - n->next = NULL; - for (pn = &elf_hash_table (info)->needed; - *pn != NULL; - pn = &(*pn)->next) - ; - *pn = n; - } - } - - free (dynbuf); - dynbuf = NULL; - } - - /* We do not want to include any of the sections in a dynamic - object in the output file. We hack by simply clobbering the - list of sections in the BFD. This could be handled more - cleanly by, say, a new section flag; the existing - SEC_NEVER_LOAD flag is not the one we want, because that one - still implies that the section takes up space in the output - file. */ - abfd->sections = NULL; - abfd->section_count = 0; - - /* If this is the first dynamic object found in the link, create - the special sections required for dynamic linking. */ - if (! elf_hash_table (info)->dynamic_sections_created) - { - if (! elf_link_create_dynamic_sections (abfd, info)) - goto error_return; - } - - if (add_needed) - { - /* Add a DT_NEEDED entry for this dynamic object. */ - oldsize = _bfd_stringtab_size (elf_hash_table (info)->dynstr); - strindex = _bfd_stringtab_add (elf_hash_table (info)->dynstr, name, - true, false); - if (strindex == (bfd_size_type) -1) - goto error_return; - - if (oldsize == _bfd_stringtab_size (elf_hash_table (info)->dynstr)) - { - asection *sdyn; - Elf_External_Dyn *dyncon, *dynconend; - - /* The hash table size did not change, which means that - the dynamic object name was already entered. If we - have already included this dynamic object in the - link, just ignore it. There is no reason to include - a particular dynamic object more than once. */ - sdyn = bfd_get_section_by_name (elf_hash_table (info)->dynobj, - ".dynamic"); - BFD_ASSERT (sdyn != NULL); - - dyncon = (Elf_External_Dyn *) sdyn->contents; - dynconend = (Elf_External_Dyn *) (sdyn->contents + - sdyn->_raw_size); - for (; dyncon < dynconend; dyncon++) - { - Elf_Internal_Dyn dyn; - - elf_swap_dyn_in (elf_hash_table (info)->dynobj, dyncon, - &dyn); - if (dyn.d_tag == DT_NEEDED - && dyn.d_un.d_val == strindex) - { - if (buf != NULL) - free (buf); - return true; - } - } - } - - if (! elf_add_dynamic_entry (info, DT_NEEDED, strindex)) - goto error_return; - } - - /* Save the SONAME, if there is one, because sometimes the - linker emulation code will need to know it. */ - if (*name == '\0') - name = bfd_get_filename (abfd); - elf_dt_name (abfd) = name; - } - - if (bfd_seek (abfd, - hdr->sh_offset + extsymoff * sizeof (Elf_External_Sym), - SEEK_SET) != 0 - || (bfd_read ((PTR) buf, sizeof (Elf_External_Sym), extsymcount, abfd) - != extsymcount * sizeof (Elf_External_Sym))) - goto error_return; - - weaks = NULL; - - esymend = buf + extsymcount; - for (esym = buf; esym < esymend; esym++, sym_hash++) - { - Elf_Internal_Sym sym; - int bind; - bfd_vma value; - asection *sec; - flagword flags; - const char *name; - struct elf_link_hash_entry *h; - boolean definition; - boolean size_change_ok, type_change_ok; - boolean new_weakdef; - - elf_swap_symbol_in (abfd, esym, &sym); - - flags = BSF_NO_FLAGS; - sec = NULL; - value = sym.st_value; - *sym_hash = NULL; - - bind = ELF_ST_BIND (sym.st_info); - if (bind == STB_LOCAL) - { - /* This should be impossible, since ELF requires that all - global symbols follow all local symbols, and that sh_info - point to the first global symbol. Unfortunatealy, Irix 5 - screws this up. */ - continue; - } - else if (bind == STB_GLOBAL) - { - if (sym.st_shndx != SHN_UNDEF - && sym.st_shndx != SHN_COMMON) - flags = BSF_GLOBAL; - else - flags = 0; - } - else if (bind == STB_WEAK) - flags = BSF_WEAK; - else - { - /* Leave it up to the processor backend. */ - } - - if (sym.st_shndx == SHN_UNDEF) - sec = bfd_und_section_ptr; - else if (sym.st_shndx > 0 && sym.st_shndx < SHN_LORESERVE) - { - sec = section_from_elf_index (abfd, sym.st_shndx); - if (sec != NULL) - value -= sec->vma; - else - sec = bfd_abs_section_ptr; - } - else if (sym.st_shndx == SHN_ABS) - sec = bfd_abs_section_ptr; - else if (sym.st_shndx == SHN_COMMON) - { - sec = bfd_com_section_ptr; - /* What ELF calls the size we call the value. What ELF - calls the value we call the alignment. */ - value = sym.st_size; - } - else - { - /* Leave it up to the processor backend. */ - } - - name = bfd_elf_string_from_elf_section (abfd, hdr->sh_link, sym.st_name); - if (name == (const char *) NULL) - goto error_return; - - if (add_symbol_hook) - { - if (! (*add_symbol_hook) (abfd, info, &sym, &name, &flags, &sec, - &value)) - goto error_return; - - /* The hook function sets the name to NULL if this symbol - should be skipped for some reason. */ - if (name == (const char *) NULL) - continue; - } - - /* Sanity check that all possibilities were handled. */ - if (sec == (asection *) NULL) - { - bfd_set_error (bfd_error_bad_value); - goto error_return; - } - - if (bfd_is_und_section (sec) - || bfd_is_com_section (sec)) - definition = false; - else - definition = true; - - size_change_ok = false; - type_change_ok = get_elf_backend_data (abfd)->type_change_ok; - if (info->hash->creator->flavour == bfd_target_elf_flavour) - { - /* We need to look up the symbol now in order to get some of - the dynamic object handling right. We pass the hash - table entry in to _bfd_generic_link_add_one_symbol so - that it does not have to look it up again. */ - if (! bfd_is_und_section (sec)) - h = elf_link_hash_lookup (elf_hash_table (info), name, - true, false, false); - else - h = ((struct elf_link_hash_entry *) - bfd_wrapped_link_hash_lookup (abfd, info, name, true, - false, false)); - if (h == NULL) - goto error_return; - *sym_hash = h; - - if (h->root.type == bfd_link_hash_new) - h->elf_link_hash_flags &=~ ELF_LINK_NON_ELF; - - while (h->root.type == bfd_link_hash_indirect - || h->root.type == bfd_link_hash_warning) - h = (struct elf_link_hash_entry *) h->root.u.i.link; - - /* It's OK to change the type if it used to be a weak - definition. */ - if (h->root.type == bfd_link_hash_defweak - || h->root.type == bfd_link_hash_undefweak) - type_change_ok = true; - - /* It's OK to change the size if it used to be a weak - definition, or if it used to be undefined, or if we will - be overriding an old definition. */ - if (type_change_ok - || h->root.type == bfd_link_hash_undefined) - size_change_ok = true; - - /* If we are looking at a dynamic object, and this is a - definition, we need to see if it has already been defined - by some other object. If it has, we want to use the - existing definition, and we do not want to report a - multiple symbol definition error; we do this by - clobbering sec to be bfd_und_section_ptr. */ - if (dynamic && definition) - { - if (h->root.type == bfd_link_hash_defined - || h->root.type == bfd_link_hash_defweak - || (h->root.type == bfd_link_hash_common - && bind == STB_WEAK)) - { - sec = bfd_und_section_ptr; - definition = false; - size_change_ok = true; - } - } - - /* Similarly, if we are not looking at a dynamic object, and - we have a definition, we want to override any definition - we may have from a dynamic object. Symbols from regular - files always take precedence over symbols from dynamic - objects, even if they are defined after the dynamic - object in the link. */ - if (! dynamic - && definition - && (h->root.type == bfd_link_hash_defined - || h->root.type == bfd_link_hash_defweak) - && (h->elf_link_hash_flags & ELF_LINK_HASH_DEF_DYNAMIC) != 0 - && (bfd_get_flavour (h->root.u.def.section->owner) - == bfd_target_elf_flavour) - && (elf_elfheader (h->root.u.def.section->owner)->e_type - == ET_DYN)) - { - /* Change the hash table entry to undefined, and let - _bfd_generic_link_add_one_symbol do the right thing - with the new definition. */ - h->root.type = bfd_link_hash_undefined; - h->root.u.undef.abfd = h->root.u.def.section->owner; - size_change_ok = true; - } - } - - if (! (_bfd_generic_link_add_one_symbol - (info, abfd, name, flags, sec, value, (const char *) NULL, - false, collect, (struct bfd_link_hash_entry **) sym_hash))) - goto error_return; - - h = *sym_hash; - while (h->root.type == bfd_link_hash_indirect - || h->root.type == bfd_link_hash_warning) - h = (struct elf_link_hash_entry *) h->root.u.i.link; - *sym_hash = h; - - new_weakdef = false; - if (dynamic - && definition - && (flags & BSF_WEAK) != 0 - && ELF_ST_TYPE (sym.st_info) != STT_FUNC - && info->hash->creator->flavour == bfd_target_elf_flavour - && h->weakdef == NULL) - { - /* Keep a list of all weak defined non function symbols from - a dynamic object, using the weakdef field. Later in this - function we will set the weakdef field to the correct - value. We only put non-function symbols from dynamic - objects on this list, because that happens to be the only - time we need to know the normal symbol corresponding to a - weak symbol, and the information is time consuming to - figure out. If the weakdef field is not already NULL, - then this symbol was already defined by some previous - dynamic object, and we will be using that previous - definition anyhow. */ - - h->weakdef = weaks; - weaks = h; - new_weakdef = true; - } - - /* Get the alignment of a common symbol. */ - if (sym.st_shndx == SHN_COMMON - && h->root.type == bfd_link_hash_common) - h->root.u.c.p->alignment_power = bfd_log2 (sym.st_value); - - if (info->hash->creator->flavour == bfd_target_elf_flavour) - { - int old_flags; - boolean dynsym; - int new_flag; - - /* Remember the symbol size and type. */ - if (sym.st_size != 0 - && (definition || h->size == 0)) - { - if (h->size != 0 && h->size != sym.st_size && ! size_change_ok) - (*_bfd_error_handler) - ("Warning: size of symbol `%s' changed from %lu to %lu in %s", - name, (unsigned long) h->size, (unsigned long) sym.st_size, - bfd_get_filename (abfd)); - - h->size = sym.st_size; - } - if (ELF_ST_TYPE (sym.st_info) != STT_NOTYPE - && (definition || h->type == STT_NOTYPE)) - { - if (h->type != STT_NOTYPE - && h->type != ELF_ST_TYPE (sym.st_info) - && ! type_change_ok) - (*_bfd_error_handler) - ("Warning: type of symbol `%s' changed from %d to %d in %s", - name, h->type, ELF_ST_TYPE (sym.st_info), - bfd_get_filename (abfd)); - - h->type = ELF_ST_TYPE (sym.st_info); - } - - /* Set a flag in the hash table entry indicating the type of - reference or definition we just found. Keep a count of - the number of dynamic symbols we find. A dynamic symbol - is one which is referenced or defined by both a regular - object and a shared object, or one which is referenced or - defined by more than one shared object. */ - old_flags = h->elf_link_hash_flags; - dynsym = false; - if (! dynamic) - { - if (! definition) - new_flag = ELF_LINK_HASH_REF_REGULAR; - else - new_flag = ELF_LINK_HASH_DEF_REGULAR; - if (info->shared - || (old_flags & (ELF_LINK_HASH_DEF_DYNAMIC - | ELF_LINK_HASH_REF_DYNAMIC)) != 0) - dynsym = true; - } - else - { - if (! definition) - new_flag = ELF_LINK_HASH_REF_DYNAMIC; - else - new_flag = ELF_LINK_HASH_DEF_DYNAMIC; - if ((old_flags & new_flag) != 0 - || (old_flags & (ELF_LINK_HASH_DEF_REGULAR - | ELF_LINK_HASH_REF_REGULAR)) != 0 - || (h->weakdef != NULL - && (old_flags & (ELF_LINK_HASH_DEF_DYNAMIC - | ELF_LINK_HASH_REF_DYNAMIC)) != 0)) - dynsym = true; - } - - h->elf_link_hash_flags |= new_flag; - if (dynsym && h->dynindx == -1) - { - if (! _bfd_elf_link_record_dynamic_symbol (info, h)) - goto error_return; - if (h->weakdef != NULL - && ! new_weakdef - && h->weakdef->dynindx == -1) - { - if (! _bfd_elf_link_record_dynamic_symbol (info, - h->weakdef)) - goto error_return; - } - } - } - } - - /* Now set the weakdefs field correctly for all the weak defined - symbols we found. The only way to do this is to search all the - symbols. Since we only need the information for non functions in - dynamic objects, that's the only time we actually put anything on - the list WEAKS. We need this information so that if a regular - object refers to a symbol defined weakly in a dynamic object, the - real symbol in the dynamic object is also put in the dynamic - symbols; we also must arrange for both symbols to point to the - same memory location. We could handle the general case of symbol - aliasing, but a general symbol alias can only be generated in - assembler code, handling it correctly would be very time - consuming, and other ELF linkers don't handle general aliasing - either. */ - while (weaks != NULL) - { - struct elf_link_hash_entry *hlook; - asection *slook; - bfd_vma vlook; - struct elf_link_hash_entry **hpp; - struct elf_link_hash_entry **hppend; - - hlook = weaks; - weaks = hlook->weakdef; - hlook->weakdef = NULL; - - BFD_ASSERT (hlook->root.type == bfd_link_hash_defined - || hlook->root.type == bfd_link_hash_defweak - || hlook->root.type == bfd_link_hash_common - || hlook->root.type == bfd_link_hash_indirect); - slook = hlook->root.u.def.section; - vlook = hlook->root.u.def.value; - - hpp = elf_sym_hashes (abfd); - hppend = hpp + extsymcount; - for (; hpp < hppend; hpp++) - { - struct elf_link_hash_entry *h; - - h = *hpp; - if (h != NULL && h != hlook - && h->root.type == bfd_link_hash_defined - && h->root.u.def.section == slook - && h->root.u.def.value == vlook) - { - hlook->weakdef = h; - - /* If the weak definition is in the list of dynamic - symbols, make sure the real definition is put there - as well. */ - if (hlook->dynindx != -1 - && h->dynindx == -1) - { - if (! _bfd_elf_link_record_dynamic_symbol (info, h)) - goto error_return; - } - - break; - } - } - } - - if (buf != NULL) - { - free (buf); - buf = NULL; - } - - /* If this object is the same format as the output object, and it is - not a shared library, then let the backend look through the - relocs. - - This is required to build global offset table entries and to - arrange for dynamic relocs. It is not required for the - particular common case of linking non PIC code, even when linking - against shared libraries, but unfortunately there is no way of - knowing whether an object file has been compiled PIC or not. - Looking through the relocs is not particularly time consuming. - The problem is that we must either (1) keep the relocs in memory, - which causes the linker to require additional runtime memory or - (2) read the relocs twice from the input file, which wastes time. - This would be a good case for using mmap. - - I have no idea how to handle linking PIC code into a file of a - different format. It probably can't be done. */ - check_relocs = get_elf_backend_data (abfd)->check_relocs; - if (! dynamic - && abfd->xvec == info->hash->creator - && check_relocs != NULL) - { - asection *o; - - for (o = abfd->sections; o != NULL; o = o->next) - { - Elf_Internal_Rela *internal_relocs; - boolean ok; - - if ((o->flags & SEC_RELOC) == 0 - || o->reloc_count == 0) - continue; - - /* I believe we can ignore the relocs for any section which - does not form part of the final process image, such as a - debugging section. */ - if ((o->flags & SEC_ALLOC) == 0) - continue; - - internal_relocs = elf_link_read_relocs (abfd, o, (PTR) NULL, - (Elf_Internal_Rela *) NULL, - info->keep_memory); - if (internal_relocs == NULL) - goto error_return; - - ok = (*check_relocs) (abfd, info, o, internal_relocs); - - if (! info->keep_memory) - free (internal_relocs); - - if (! ok) - goto error_return; - } - } - - return true; - - error_return: - if (buf != NULL) - free (buf); - if (dynbuf != NULL) - free (dynbuf); - return false; -} - -/* Create some sections which will be filled in with dynamic linking - information. ABFD is an input file which requires dynamic sections - to be created. The dynamic sections take up virtual memory space - when the final executable is run, so we need to create them before - addresses are assigned to the output sections. We work out the - actual contents and size of these sections later. */ - -boolean -elf_link_create_dynamic_sections (abfd, info) - bfd *abfd; - struct bfd_link_info *info; -{ - flagword flags; - register asection *s; - struct elf_link_hash_entry *h; - struct elf_backend_data *bed; - - if (elf_hash_table (info)->dynamic_sections_created) - return true; - - /* Make sure that all dynamic sections use the same input BFD. */ - if (elf_hash_table (info)->dynobj == NULL) - elf_hash_table (info)->dynobj = abfd; - else - abfd = elf_hash_table (info)->dynobj; - - /* Note that we set the SEC_IN_MEMORY flag for all of these - sections. */ - flags = SEC_ALLOC | SEC_LOAD | SEC_HAS_CONTENTS | SEC_IN_MEMORY; - - /* A dynamically linked executable has a .interp section, but a - shared library does not. */ - if (! info->shared) - { - s = bfd_make_section (abfd, ".interp"); - if (s == NULL - || ! bfd_set_section_flags (abfd, s, flags | SEC_READONLY)) - return false; - } - - s = bfd_make_section (abfd, ".dynsym"); - if (s == NULL - || ! bfd_set_section_flags (abfd, s, flags | SEC_READONLY) - || ! bfd_set_section_alignment (abfd, s, LOG_FILE_ALIGN)) - return false; - - s = bfd_make_section (abfd, ".dynstr"); - if (s == NULL - || ! bfd_set_section_flags (abfd, s, flags | SEC_READONLY)) - return false; - - /* Create a strtab to hold the dynamic symbol names. */ - if (elf_hash_table (info)->dynstr == NULL) - { - elf_hash_table (info)->dynstr = elf_stringtab_init (); - if (elf_hash_table (info)->dynstr == NULL) - return false; - } - - s = bfd_make_section (abfd, ".dynamic"); - if (s == NULL - || ! bfd_set_section_flags (abfd, s, flags) - || ! bfd_set_section_alignment (abfd, s, LOG_FILE_ALIGN)) - return false; - - /* The special symbol _DYNAMIC is always set to the start of the - .dynamic section. This call occurs before we have processed the - symbols for any dynamic object, so we don't have to worry about - overriding a dynamic definition. We could set _DYNAMIC in a - linker script, but we only want to define it if we are, in fact, - creating a .dynamic section. We don't want to define it if there - is no .dynamic section, since on some ELF platforms the start up - code examines it to decide how to initialize the process. */ - h = NULL; - if (! (_bfd_generic_link_add_one_symbol - (info, abfd, "_DYNAMIC", BSF_GLOBAL, s, (bfd_vma) 0, - (const char *) NULL, false, get_elf_backend_data (abfd)->collect, - (struct bfd_link_hash_entry **) &h))) - return false; - h->elf_link_hash_flags |= ELF_LINK_HASH_DEF_REGULAR; - h->type = STT_OBJECT; - - if (info->shared - && ! _bfd_elf_link_record_dynamic_symbol (info, h)) - return false; - - s = bfd_make_section (abfd, ".hash"); - if (s == NULL - || ! bfd_set_section_flags (abfd, s, flags | SEC_READONLY) - || ! bfd_set_section_alignment (abfd, s, LOG_FILE_ALIGN)) - return false; - - /* Let the backend create the rest of the sections. This lets the - backend set the right flags. The backend will normally create - the .got and .plt sections. */ - bed = get_elf_backend_data (abfd); - if (! (*bed->elf_backend_create_dynamic_sections) (abfd, info)) - return false; - - elf_hash_table (info)->dynamic_sections_created = true; - - return true; -} - -/* Add an entry to the .dynamic table. */ - -boolean -elf_add_dynamic_entry (info, tag, val) - struct bfd_link_info *info; - bfd_vma tag; - bfd_vma val; -{ - Elf_Internal_Dyn dyn; - bfd *dynobj; - asection *s; - size_t newsize; - bfd_byte *newcontents; - - dynobj = elf_hash_table (info)->dynobj; - - s = bfd_get_section_by_name (dynobj, ".dynamic"); - BFD_ASSERT (s != NULL); - - newsize = s->_raw_size + sizeof (Elf_External_Dyn); - newcontents = (bfd_byte *) bfd_realloc (s->contents, newsize); - if (newcontents == NULL) - return false; - - dyn.d_tag = tag; - dyn.d_un.d_val = val; - elf_swap_dyn_out (dynobj, &dyn, - (Elf_External_Dyn *) (newcontents + s->_raw_size)); - - s->_raw_size = newsize; - s->contents = newcontents; - - return true; -} - - -/* Read and swap the relocs for a section. They may have been cached. - If the EXTERNAL_RELOCS and INTERNAL_RELOCS arguments are not NULL, - they are used as buffers to read into. They are known to be large - enough. If the INTERNAL_RELOCS relocs argument is NULL, the return - value is allocated using either malloc or bfd_alloc, according to - the KEEP_MEMORY argument. */ - -static Elf_Internal_Rela * -elf_link_read_relocs (abfd, o, external_relocs, internal_relocs, keep_memory) - bfd *abfd; - asection *o; - PTR external_relocs; - Elf_Internal_Rela *internal_relocs; - boolean keep_memory; -{ - Elf_Internal_Shdr *rel_hdr; - PTR alloc1 = NULL; - Elf_Internal_Rela *alloc2 = NULL; - - if (elf_section_data (o)->relocs != NULL) - return elf_section_data (o)->relocs; - - if (o->reloc_count == 0) - return NULL; - - rel_hdr = &elf_section_data (o)->rel_hdr; - - if (internal_relocs == NULL) - { - size_t size; - - size = o->reloc_count * sizeof (Elf_Internal_Rela); - if (keep_memory) - internal_relocs = (Elf_Internal_Rela *) bfd_alloc (abfd, size); - else - internal_relocs = alloc2 = (Elf_Internal_Rela *) bfd_malloc (size); - if (internal_relocs == NULL) - goto error_return; - } - - if (external_relocs == NULL) - { - alloc1 = (PTR) bfd_malloc ((size_t) rel_hdr->sh_size); - if (alloc1 == NULL) - goto error_return; - external_relocs = alloc1; - } - - if ((bfd_seek (abfd, rel_hdr->sh_offset, SEEK_SET) != 0) - || (bfd_read (external_relocs, 1, rel_hdr->sh_size, abfd) - != rel_hdr->sh_size)) - goto error_return; - - /* Swap in the relocs. For convenience, we always produce an - Elf_Internal_Rela array; if the relocs are Rel, we set the addend - to 0. */ - if (rel_hdr->sh_entsize == sizeof (Elf_External_Rel)) - { - Elf_External_Rel *erel; - Elf_External_Rel *erelend; - Elf_Internal_Rela *irela; - - erel = (Elf_External_Rel *) external_relocs; - erelend = erel + o->reloc_count; - irela = internal_relocs; - for (; erel < erelend; erel++, irela++) - { - Elf_Internal_Rel irel; - - elf_swap_reloc_in (abfd, erel, &irel); - irela->r_offset = irel.r_offset; - irela->r_info = irel.r_info; - irela->r_addend = 0; - } - } - else - { - Elf_External_Rela *erela; - Elf_External_Rela *erelaend; - Elf_Internal_Rela *irela; - - BFD_ASSERT (rel_hdr->sh_entsize == sizeof (Elf_External_Rela)); - - erela = (Elf_External_Rela *) external_relocs; - erelaend = erela + o->reloc_count; - irela = internal_relocs; - for (; erela < erelaend; erela++, irela++) - elf_swap_reloca_in (abfd, erela, irela); - } - - /* Cache the results for next time, if we can. */ - if (keep_memory) - elf_section_data (o)->relocs = internal_relocs; - - if (alloc1 != NULL) - free (alloc1); - - /* Don't free alloc2, since if it was allocated we are passing it - back (under the name of internal_relocs). */ - - return internal_relocs; - - error_return: - if (alloc1 != NULL) - free (alloc1); - if (alloc2 != NULL) - free (alloc2); - return NULL; -} - - -/* Record an assignment to a symbol made by a linker script. We need - this in case some dynamic object refers to this symbol. */ - -/*ARGSUSED*/ -boolean -NAME(bfd_elf,record_link_assignment) (output_bfd, info, name, provide) - bfd *output_bfd; - struct bfd_link_info *info; - const char *name; - boolean provide; -{ - struct elf_link_hash_entry *h; - - if (info->hash->creator->flavour != bfd_target_elf_flavour) - return true; - - h = elf_link_hash_lookup (elf_hash_table (info), name, true, true, false); - if (h == NULL) - return false; - - if (h->root.type == bfd_link_hash_new) - h->elf_link_hash_flags &=~ ELF_LINK_NON_ELF; - - /* If this symbol is being provided by the linker script, and it is - currently defined by a dynamic object, but not by a regular - object, then mark it as undefined so that the generic linker will - force the correct value. */ - if (provide - && (h->elf_link_hash_flags & ELF_LINK_HASH_DEF_DYNAMIC) != 0 - && (h->elf_link_hash_flags & ELF_LINK_HASH_DEF_REGULAR) == 0) - h->root.type = bfd_link_hash_undefined; - - h->elf_link_hash_flags |= ELF_LINK_HASH_DEF_REGULAR; - h->type = STT_OBJECT; - - if (((h->elf_link_hash_flags & (ELF_LINK_HASH_DEF_DYNAMIC - | ELF_LINK_HASH_REF_DYNAMIC)) != 0 - || info->shared) - && h->dynindx == -1) - { - if (! _bfd_elf_link_record_dynamic_symbol (info, h)) - return false; - - /* If this is a weak defined symbol, and we know a corresponding - real symbol from the same dynamic object, make sure the real - symbol is also made into a dynamic symbol. */ - if (h->weakdef != NULL - && h->weakdef->dynindx == -1) - { - if (! _bfd_elf_link_record_dynamic_symbol (info, h->weakdef)) - return false; - } - } - - return true; -} - - -/* Array used to determine the number of hash table buckets to use - based on the number of symbols there are. If there are fewer than - 3 symbols we use 1 bucket, fewer than 17 symbols we use 3 buckets, - fewer than 37 we use 17 buckets, and so forth. We never use more - than 521 buckets. */ - -static const size_t elf_buckets[] = -{ - 1, 3, 17, 37, 67, 97, 131, 197, 263, 521, 0 -}; - -/* Set up the sizes and contents of the ELF dynamic sections. This is - called by the ELF linker emulation before_allocation routine. We - must set the sizes of the sections before the linker sets the - addresses of the various sections. */ - -boolean -NAME(bfd_elf,size_dynamic_sections) (output_bfd, soname, rpath, - export_dynamic, info, sinterpptr) - bfd *output_bfd; - const char *soname; - const char *rpath; - boolean export_dynamic; - struct bfd_link_info *info; - asection **sinterpptr; -{ - bfd *dynobj; - struct elf_backend_data *bed; - - *sinterpptr = NULL; - - if (info->hash->creator->flavour != bfd_target_elf_flavour) - return true; - - dynobj = elf_hash_table (info)->dynobj; - - /* If there were no dynamic objects in the link, there is nothing to - do here. */ - if (dynobj == NULL) - return true; - - /* If we are supposed to export all symbols into the dynamic symbol - table (this is not the normal case), then do so. */ - if (export_dynamic) - { - struct elf_info_failed eif; - - eif.failed = false; - eif.info = info; - elf_link_hash_traverse (elf_hash_table (info), elf_export_symbol, - (PTR) &eif); - if (eif.failed) - return false; - } - - if (elf_hash_table (info)->dynamic_sections_created) - { - struct elf_info_failed eif; - struct elf_link_hash_entry *h; - bfd_size_type strsize; - - *sinterpptr = bfd_get_section_by_name (dynobj, ".interp"); - BFD_ASSERT (*sinterpptr != NULL || info->shared); - - if (soname != NULL) - { - bfd_size_type indx; - - indx = _bfd_stringtab_add (elf_hash_table (info)->dynstr, soname, - true, true); - if (indx == (bfd_size_type) -1 - || ! elf_add_dynamic_entry (info, DT_SONAME, indx)) - return false; - } - - if (info->symbolic) - { - if (! elf_add_dynamic_entry (info, DT_SYMBOLIC, 0)) - return false; - } - - if (rpath != NULL) - { - bfd_size_type indx; - - indx = _bfd_stringtab_add (elf_hash_table (info)->dynstr, rpath, - true, true); - if (indx == (bfd_size_type) -1 - || ! elf_add_dynamic_entry (info, DT_RPATH, indx)) - return false; - } - - /* Find all symbols which were defined in a dynamic object and make - the backend pick a reasonable value for them. */ - eif.failed = false; - eif.info = info; - elf_link_hash_traverse (elf_hash_table (info), - elf_adjust_dynamic_symbol, - (PTR) &eif); - if (eif.failed) - return false; - - /* Add some entries to the .dynamic section. We fill in some of the - values later, in elf_bfd_final_link, but we must add the entries - now so that we know the final size of the .dynamic section. */ - h = elf_link_hash_lookup (elf_hash_table (info), "_init", false, - false, false); - if (h != NULL - && (h->elf_link_hash_flags & (ELF_LINK_HASH_REF_REGULAR - | ELF_LINK_HASH_DEF_REGULAR)) != 0) - { - if (! elf_add_dynamic_entry (info, DT_INIT, 0)) - return false; - } - h = elf_link_hash_lookup (elf_hash_table (info), "_fini", false, - false, false); - if (h != NULL - && (h->elf_link_hash_flags & (ELF_LINK_HASH_REF_REGULAR - | ELF_LINK_HASH_DEF_REGULAR)) != 0) - { - if (! elf_add_dynamic_entry (info, DT_FINI, 0)) - return false; - } - strsize = _bfd_stringtab_size (elf_hash_table (info)->dynstr); - if (! elf_add_dynamic_entry (info, DT_HASH, 0) - || ! elf_add_dynamic_entry (info, DT_STRTAB, 0) - || ! elf_add_dynamic_entry (info, DT_SYMTAB, 0) - || ! elf_add_dynamic_entry (info, DT_STRSZ, strsize) - || ! elf_add_dynamic_entry (info, DT_SYMENT, - sizeof (Elf_External_Sym))) - return false; - } - - /* The backend must work out the sizes of all the other dynamic - sections. */ - bed = get_elf_backend_data (output_bfd); - if (! (*bed->elf_backend_size_dynamic_sections) (output_bfd, info)) - return false; - - if (elf_hash_table (info)->dynamic_sections_created) - { - size_t dynsymcount; - asection *s; - size_t i; - size_t bucketcount = 0; - Elf_Internal_Sym isym; - - /* Set the size of the .dynsym and .hash sections. We counted - the number of dynamic symbols in elf_link_add_object_symbols. - We will build the contents of .dynsym and .hash when we build - the final symbol table, because until then we do not know the - correct value to give the symbols. We built the .dynstr - section as we went along in elf_link_add_object_symbols. */ - dynsymcount = elf_hash_table (info)->dynsymcount; - s = bfd_get_section_by_name (dynobj, ".dynsym"); - BFD_ASSERT (s != NULL); - s->_raw_size = dynsymcount * sizeof (Elf_External_Sym); - s->contents = (bfd_byte *) bfd_alloc (output_bfd, s->_raw_size); - if (s->contents == NULL && s->_raw_size != 0) - return false; - - /* The first entry in .dynsym is a dummy symbol. */ - isym.st_value = 0; - isym.st_size = 0; - isym.st_name = 0; - isym.st_info = 0; - isym.st_other = 0; - isym.st_shndx = 0; - elf_swap_symbol_out (output_bfd, &isym, - (PTR) (Elf_External_Sym *) s->contents); - - for (i = 0; elf_buckets[i] != 0; i++) - { - bucketcount = elf_buckets[i]; - if (dynsymcount < elf_buckets[i + 1]) - break; - } - - s = bfd_get_section_by_name (dynobj, ".hash"); - BFD_ASSERT (s != NULL); - s->_raw_size = (2 + bucketcount + dynsymcount) * (ARCH_SIZE / 8); - s->contents = (bfd_byte *) bfd_alloc (output_bfd, s->_raw_size); - if (s->contents == NULL) - return false; - memset (s->contents, 0, (size_t) s->_raw_size); - - put_word (output_bfd, bucketcount, s->contents); - put_word (output_bfd, dynsymcount, s->contents + (ARCH_SIZE / 8)); - - elf_hash_table (info)->bucketcount = bucketcount; - - s = bfd_get_section_by_name (dynobj, ".dynstr"); - BFD_ASSERT (s != NULL); - s->_raw_size = _bfd_stringtab_size (elf_hash_table (info)->dynstr); - - if (! elf_add_dynamic_entry (info, DT_NULL, 0)) - return false; - } - - return true; -} - - -/* This routine is used to export all defined symbols into the dynamic - symbol table. It is called via elf_link_hash_traverse. */ - -static boolean -elf_export_symbol (h, data) - struct elf_link_hash_entry *h; - PTR data; -{ - struct elf_info_failed *eif = (struct elf_info_failed *) data; - - if (h->dynindx == -1 - && (h->elf_link_hash_flags - & (ELF_LINK_HASH_DEF_REGULAR | ELF_LINK_HASH_REF_REGULAR)) != 0) - { - if (! _bfd_elf_link_record_dynamic_symbol (eif->info, h)) - { - eif->failed = true; - return false; - } - } - - return true; -} - - -/* Make the backend pick a good value for a dynamic symbol. This is - called via elf_link_hash_traverse, and also calls itself - recursively. */ - -static boolean -elf_adjust_dynamic_symbol (h, data) - struct elf_link_hash_entry *h; - PTR data; -{ - struct elf_info_failed *eif = (struct elf_info_failed *) data; - bfd *dynobj; - struct elf_backend_data *bed; - - /* If this symbol was mentioned in a non-ELF file, try to set - DEF_REGULAR and REF_REGULAR correctly. This is the only way to - permit a non-ELF file to correctly refer to a symbol defined in - an ELF dynamic object. */ - if ((h->elf_link_hash_flags & ELF_LINK_NON_ELF) != 0) - { - if (h->root.type != bfd_link_hash_defined - && h->root.type != bfd_link_hash_defweak) - h->elf_link_hash_flags |= ELF_LINK_HASH_REF_REGULAR; - else - { - if (h->root.u.def.section->owner != NULL - && (bfd_get_flavour (h->root.u.def.section->owner) - == bfd_target_elf_flavour)) - h->elf_link_hash_flags |= ELF_LINK_HASH_REF_REGULAR; - else - h->elf_link_hash_flags |= ELF_LINK_HASH_DEF_REGULAR; - } - - if ((h->elf_link_hash_flags & ELF_LINK_HASH_DEF_DYNAMIC) != 0 - || (h->elf_link_hash_flags & ELF_LINK_HASH_REF_DYNAMIC) != 0) - { - if (! _bfd_elf_link_record_dynamic_symbol (eif->info, h)) - { - eif->failed = true; - return false; - } - } - } - - /* If -Bsymbolic was used (which means to bind references to global - symbols to the definition within the shared object), and this - symbol was defined in a regular object, then it actually doesn't - need a PLT entry. */ - if ((h->elf_link_hash_flags & ELF_LINK_HASH_NEEDS_PLT) != 0 - && eif->info->shared - && eif->info->symbolic - && (h->elf_link_hash_flags & ELF_LINK_HASH_DEF_REGULAR) != 0) - h->elf_link_hash_flags &=~ ELF_LINK_HASH_NEEDS_PLT; - - /* If this symbol does not require a PLT entry, and it is not - defined by a dynamic object, or is not referenced by a regular - object, ignore it. We do have to handle a weak defined symbol, - even if no regular object refers to it, if we decided to add it - to the dynamic symbol table. FIXME: Do we normally need to worry - about symbols which are defined by one dynamic object and - referenced by another one? */ - if ((h->elf_link_hash_flags & ELF_LINK_HASH_NEEDS_PLT) == 0 - && ((h->elf_link_hash_flags & ELF_LINK_HASH_DEF_REGULAR) != 0 - || (h->elf_link_hash_flags & ELF_LINK_HASH_DEF_DYNAMIC) == 0 - || ((h->elf_link_hash_flags & ELF_LINK_HASH_REF_REGULAR) == 0 - && (h->weakdef == NULL || h->weakdef->dynindx == -1)))) - return true; - - /* If we've already adjusted this symbol, don't do it again. This - can happen via a recursive call. */ - if ((h->elf_link_hash_flags & ELF_LINK_HASH_DYNAMIC_ADJUSTED) != 0) - return true; - - /* Don't look at this symbol again. Note that we must set this - after checking the above conditions, because we may look at a - symbol once, decide not to do anything, and then get called - recursively later after REF_REGULAR is set below. */ - h->elf_link_hash_flags |= ELF_LINK_HASH_DYNAMIC_ADJUSTED; - - /* If this is a weak definition, and we know a real definition, and - the real symbol is not itself defined by a regular object file, - then get a good value for the real definition. We handle the - real symbol first, for the convenience of the backend routine. - - Note that there is a confusing case here. If the real definition - is defined by a regular object file, we don't get the real symbol - from the dynamic object, but we do get the weak symbol. If the - processor backend uses a COPY reloc, then if some routine in the - dynamic object changes the real symbol, we will not see that - change in the corresponding weak symbol. This is the way other - ELF linkers work as well, and seems to be a result of the shared - library model. - - I will clarify this issue. Most SVR4 shared libraries define the - variable _timezone and define timezone as a weak synonym. The - tzset call changes _timezone. If you write - extern int timezone; - int _timezone = 5; - int main () { tzset (); printf ("%d %d\n", timezone, _timezone); } - you might expect that, since timezone is a synonym for _timezone, - the same number will print both times. However, if the processor - backend uses a COPY reloc, then actually timezone will be copied - into your process image, and, since you define _timezone - yourself, _timezone will not. Thus timezone and _timezone will - wind up at different memory locations. The tzset call will set - _timezone, leaving timezone unchanged. */ - - if (h->weakdef != NULL) - { - struct elf_link_hash_entry *weakdef; - - BFD_ASSERT (h->root.type == bfd_link_hash_defined - || h->root.type == bfd_link_hash_defweak); - weakdef = h->weakdef; - BFD_ASSERT (weakdef->root.type == bfd_link_hash_defined - || weakdef->root.type == bfd_link_hash_defweak); - BFD_ASSERT (weakdef->elf_link_hash_flags & ELF_LINK_HASH_DEF_DYNAMIC); - if ((weakdef->elf_link_hash_flags & ELF_LINK_HASH_DEF_REGULAR) != 0) - { - /* This symbol is defined by a regular object file, so we - will not do anything special. Clear weakdef for the - convenience of the processor backend. */ - h->weakdef = NULL; - } - else - { - /* There is an implicit reference by a regular object file - via the weak symbol. */ - weakdef->elf_link_hash_flags |= ELF_LINK_HASH_REF_REGULAR; - if (! elf_adjust_dynamic_symbol (weakdef, (PTR) eif)) - return false; - } - } - - dynobj = elf_hash_table (eif->info)->dynobj; - bed = get_elf_backend_data (dynobj); - if (! (*bed->elf_backend_adjust_dynamic_symbol) (eif->info, h)) - { - eif->failed = true; - return false; - } - - return true; -} - -/* Final phase of ELF linker. */ - -/* A structure we use to avoid passing large numbers of arguments. */ - -struct elf_final_link_info -{ - /* General link information. */ - struct bfd_link_info *info; - /* Output BFD. */ - bfd *output_bfd; - /* Symbol string table. */ - struct bfd_strtab_hash *symstrtab; - /* .dynsym section. */ - asection *dynsym_sec; - /* .hash section. */ - asection *hash_sec; - /* Buffer large enough to hold contents of any section. */ - bfd_byte *contents; - /* Buffer large enough to hold external relocs of any section. */ - PTR external_relocs; - /* Buffer large enough to hold internal relocs of any section. */ - Elf_Internal_Rela *internal_relocs; - /* Buffer large enough to hold external local symbols of any input - BFD. */ - Elf_External_Sym *external_syms; - /* Buffer large enough to hold internal local symbols of any input - BFD. */ - Elf_Internal_Sym *internal_syms; - /* Array large enough to hold a symbol index for each local symbol - of any input BFD. */ - long *indices; - /* Array large enough to hold a section pointer for each local - symbol of any input BFD. */ - asection **sections; - /* Buffer to hold swapped out symbols. */ - Elf_External_Sym *symbuf; - /* Number of swapped out symbols in buffer. */ - size_t symbuf_count; - /* Number of symbols which fit in symbuf. */ - size_t symbuf_size; -}; - -static boolean elf_link_output_sym - PARAMS ((struct elf_final_link_info *, const char *, - Elf_Internal_Sym *, asection *)); -static boolean elf_link_flush_output_syms - PARAMS ((struct elf_final_link_info *)); -static boolean elf_link_output_extsym - PARAMS ((struct elf_link_hash_entry *, PTR)); -static boolean elf_link_input_bfd - PARAMS ((struct elf_final_link_info *, bfd *)); -static boolean elf_reloc_link_order - PARAMS ((bfd *, struct bfd_link_info *, asection *, - struct bfd_link_order *)); - -/* This struct is used to pass information to routines called via - elf_link_hash_traverse which must return failure. */ - -struct elf_finfo_failed -{ - boolean failed; - struct elf_final_link_info *finfo; -}; - -/* Do the final step of an ELF link. */ - -boolean -elf_bfd_final_link (abfd, info) - bfd *abfd; - struct bfd_link_info *info; -{ - boolean dynamic; - bfd *dynobj; - struct elf_final_link_info finfo; - register asection *o; - register struct bfd_link_order *p; - register bfd *sub; - size_t max_contents_size; - size_t max_external_reloc_size; - size_t max_internal_reloc_count; - size_t max_sym_count; - file_ptr off; - Elf_Internal_Sym elfsym; - unsigned int i; - Elf_Internal_Shdr *symtab_hdr; - Elf_Internal_Shdr *symstrtab_hdr; - struct elf_backend_data *bed = get_elf_backend_data (abfd); - struct elf_finfo_failed eif; - - if (info->shared) - abfd->flags |= DYNAMIC; - - dynamic = elf_hash_table (info)->dynamic_sections_created; - dynobj = elf_hash_table (info)->dynobj; - - finfo.info = info; - finfo.output_bfd = abfd; - finfo.symstrtab = elf_stringtab_init (); - if (finfo.symstrtab == NULL) - return false; - if (! dynamic) - { - finfo.dynsym_sec = NULL; - finfo.hash_sec = NULL; - } - else - { - finfo.dynsym_sec = bfd_get_section_by_name (dynobj, ".dynsym"); - finfo.hash_sec = bfd_get_section_by_name (dynobj, ".hash"); - BFD_ASSERT (finfo.dynsym_sec != NULL && finfo.hash_sec != NULL); - } - finfo.contents = NULL; - finfo.external_relocs = NULL; - finfo.internal_relocs = NULL; - finfo.external_syms = NULL; - finfo.internal_syms = NULL; - finfo.indices = NULL; - finfo.sections = NULL; - finfo.symbuf = NULL; - finfo.symbuf_count = 0; - - /* Count up the number of relocations we will output for each output - section, so that we know the sizes of the reloc sections. We - also figure out some maximum sizes. */ - max_contents_size = 0; - max_external_reloc_size = 0; - max_internal_reloc_count = 0; - max_sym_count = 0; - for (o = abfd->sections; o != (asection *) NULL; o = o->next) - { - o->reloc_count = 0; - - for (p = o->link_order_head; p != NULL; p = p->next) - { - if (p->type == bfd_section_reloc_link_order - || p->type == bfd_symbol_reloc_link_order) - ++o->reloc_count; - else if (p->type == bfd_indirect_link_order) - { - asection *sec; - - sec = p->u.indirect.section; - - if (info->relocateable) - o->reloc_count += sec->reloc_count; - - if (sec->_raw_size > max_contents_size) - max_contents_size = sec->_raw_size; - if (sec->_cooked_size > max_contents_size) - max_contents_size = sec->_cooked_size; - - /* We are interested in just local symbols, not all - symbols. */ - if (bfd_get_flavour (sec->owner) == bfd_target_elf_flavour) - { - size_t sym_count; - - if (elf_bad_symtab (sec->owner)) - sym_count = (elf_tdata (sec->owner)->symtab_hdr.sh_size - / sizeof (Elf_External_Sym)); - else - sym_count = elf_tdata (sec->owner)->symtab_hdr.sh_info; - - if (sym_count > max_sym_count) - max_sym_count = sym_count; - - if ((sec->flags & SEC_RELOC) != 0) - { - size_t ext_size; - - ext_size = elf_section_data (sec)->rel_hdr.sh_size; - if (ext_size > max_external_reloc_size) - max_external_reloc_size = ext_size; - if (sec->reloc_count > max_internal_reloc_count) - max_internal_reloc_count = sec->reloc_count; - } - } - } - } - - if (o->reloc_count > 0) - o->flags |= SEC_RELOC; - else - { - /* Explicitly clear the SEC_RELOC flag. The linker tends to - set it (this is probably a bug) and if it is set - assign_section_numbers will create a reloc section. */ - o->flags &=~ SEC_RELOC; - } - - /* If the SEC_ALLOC flag is not set, force the section VMA to - zero. This is done in elf_fake_sections as well, but forcing - the VMA to 0 here will ensure that relocs against these - sections are handled correctly. */ - if ((o->flags & SEC_ALLOC) == 0) - o->vma = 0; - } - - /* Figure out the file positions for everything but the symbol table - and the relocs. We set symcount to force assign_section_numbers - to create a symbol table. */ - abfd->symcount = info->strip == strip_all ? 0 : 1; - BFD_ASSERT (! abfd->output_has_begun); - if (! _bfd_elf_compute_section_file_positions (abfd, info)) - goto error_return; - - /* That created the reloc sections. Set their sizes, and assign - them file positions, and allocate some buffers. */ - for (o = abfd->sections; o != NULL; o = o->next) - { - if ((o->flags & SEC_RELOC) != 0) - { - Elf_Internal_Shdr *rel_hdr; - register struct elf_link_hash_entry **p, **pend; - - rel_hdr = &elf_section_data (o)->rel_hdr; - - rel_hdr->sh_size = rel_hdr->sh_entsize * o->reloc_count; - - /* The contents field must last into write_object_contents, - so we allocate it with bfd_alloc rather than malloc. */ - rel_hdr->contents = (PTR) bfd_alloc (abfd, rel_hdr->sh_size); - if (rel_hdr->contents == NULL && rel_hdr->sh_size != 0) - goto error_return; - - p = ((struct elf_link_hash_entry **) - bfd_malloc (o->reloc_count - * sizeof (struct elf_link_hash_entry *))); - if (p == NULL && o->reloc_count != 0) - goto error_return; - elf_section_data (o)->rel_hashes = p; - pend = p + o->reloc_count; - for (; p < pend; p++) - *p = NULL; - - /* Use the reloc_count field as an index when outputting the - relocs. */ - o->reloc_count = 0; - } - } - - _bfd_elf_assign_file_positions_for_relocs (abfd); - - /* We have now assigned file positions for all the sections except - .symtab and .strtab. We start the .symtab section at the current - file position, and write directly to it. We build the .strtab - section in memory. */ - abfd->symcount = 0; - symtab_hdr = &elf_tdata (abfd)->symtab_hdr; - /* sh_name is set in prep_headers. */ - symtab_hdr->sh_type = SHT_SYMTAB; - symtab_hdr->sh_flags = 0; - symtab_hdr->sh_addr = 0; - symtab_hdr->sh_size = 0; - symtab_hdr->sh_entsize = sizeof (Elf_External_Sym); - /* sh_link is set in assign_section_numbers. */ - /* sh_info is set below. */ - /* sh_offset is set just below. */ - symtab_hdr->sh_addralign = 4; /* FIXME: system dependent? */ - - off = elf_tdata (abfd)->next_file_pos; - off = _bfd_elf_assign_file_position_for_section (symtab_hdr, off, true); - - /* Note that at this point elf_tdata (abfd)->next_file_pos is - incorrect. We do not yet know the size of the .symtab section. - We correct next_file_pos below, after we do know the size. */ - - /* Allocate a buffer to hold swapped out symbols. This is to avoid - continuously seeking to the right position in the file. */ - if (! info->keep_memory || max_sym_count < 20) - finfo.symbuf_size = 20; - else - finfo.symbuf_size = max_sym_count; - finfo.symbuf = ((Elf_External_Sym *) - bfd_malloc (finfo.symbuf_size * sizeof (Elf_External_Sym))); - if (finfo.symbuf == NULL) - goto error_return; - - /* Start writing out the symbol table. The first symbol is always a - dummy symbol. */ - if (info->strip != strip_all || info->relocateable) - { - elfsym.st_value = 0; - elfsym.st_size = 0; - elfsym.st_info = 0; - elfsym.st_other = 0; - elfsym.st_shndx = SHN_UNDEF; - if (! elf_link_output_sym (&finfo, (const char *) NULL, - &elfsym, bfd_und_section_ptr)) - goto error_return; - } - -#if 0 - /* Some standard ELF linkers do this, but we don't because it causes - bootstrap comparison failures. */ - /* Output a file symbol for the output file as the second symbol. - We output this even if we are discarding local symbols, although - I'm not sure if this is correct. */ - elfsym.st_value = 0; - elfsym.st_size = 0; - elfsym.st_info = ELF_ST_INFO (STB_LOCAL, STT_FILE); - elfsym.st_other = 0; - elfsym.st_shndx = SHN_ABS; - if (! elf_link_output_sym (&finfo, bfd_get_filename (abfd), - &elfsym, bfd_abs_section_ptr)) - goto error_return; -#endif - - /* Output a symbol for each section. We output these even if we are - discarding local symbols, since they are used for relocs. These - symbols have no names. We store the index of each one in the - index field of the section, so that we can find it again when - outputting relocs. */ - if (info->strip != strip_all || info->relocateable) - { - elfsym.st_value = 0; - elfsym.st_size = 0; - elfsym.st_info = ELF_ST_INFO (STB_LOCAL, STT_SECTION); - elfsym.st_other = 0; - for (i = 1; i < elf_elfheader (abfd)->e_shnum; i++) - { - o = section_from_elf_index (abfd, i); - if (o != NULL) - o->target_index = abfd->symcount; - elfsym.st_shndx = i; - if (! elf_link_output_sym (&finfo, (const char *) NULL, - &elfsym, o)) - goto error_return; - } - } - - /* Allocate some memory to hold information read in from the input - files. */ - finfo.contents = (bfd_byte *) bfd_malloc (max_contents_size); - finfo.external_relocs = (PTR) bfd_malloc (max_external_reloc_size); - finfo.internal_relocs = ((Elf_Internal_Rela *) - bfd_malloc (max_internal_reloc_count - * sizeof (Elf_Internal_Rela))); - finfo.external_syms = ((Elf_External_Sym *) - bfd_malloc (max_sym_count - * sizeof (Elf_External_Sym))); - finfo.internal_syms = ((Elf_Internal_Sym *) - bfd_malloc (max_sym_count - * sizeof (Elf_Internal_Sym))); - finfo.indices = (long *) bfd_malloc (max_sym_count * sizeof (long)); - finfo.sections = ((asection **) - bfd_malloc (max_sym_count * sizeof (asection *))); - if ((finfo.contents == NULL && max_contents_size != 0) - || (finfo.external_relocs == NULL && max_external_reloc_size != 0) - || (finfo.internal_relocs == NULL && max_internal_reloc_count != 0) - || (finfo.external_syms == NULL && max_sym_count != 0) - || (finfo.internal_syms == NULL && max_sym_count != 0) - || (finfo.indices == NULL && max_sym_count != 0) - || (finfo.sections == NULL && max_sym_count != 0)) - goto error_return; - - /* Since ELF permits relocations to be against local symbols, we - must have the local symbols available when we do the relocations. - Since we would rather only read the local symbols once, and we - would rather not keep them in memory, we handle all the - relocations for a single input file at the same time. - - Unfortunately, there is no way to know the total number of local - symbols until we have seen all of them, and the local symbol - indices precede the global symbol indices. This means that when - we are generating relocateable output, and we see a reloc against - a global symbol, we can not know the symbol index until we have - finished examining all the local symbols to see which ones we are - going to output. To deal with this, we keep the relocations in - memory, and don't output them until the end of the link. This is - an unfortunate waste of memory, but I don't see a good way around - it. Fortunately, it only happens when performing a relocateable - link, which is not the common case. FIXME: If keep_memory is set - we could write the relocs out and then read them again; I don't - know how bad the memory loss will be. */ - - for (sub = info->input_bfds; sub != NULL; sub = sub->next) - sub->output_has_begun = false; - for (o = abfd->sections; o != NULL; o = o->next) - { - for (p = o->link_order_head; p != NULL; p = p->next) - { - if (p->type == bfd_indirect_link_order - && (bfd_get_flavour (p->u.indirect.section->owner) - == bfd_target_elf_flavour)) - { - sub = p->u.indirect.section->owner; - if (! sub->output_has_begun) - { - if (! elf_link_input_bfd (&finfo, sub)) - goto error_return; - sub->output_has_begun = true; - } - } - else if (p->type == bfd_section_reloc_link_order - || p->type == bfd_symbol_reloc_link_order) - { - if (! elf_reloc_link_order (abfd, info, o, p)) - goto error_return; - } - else - { - if (! _bfd_default_link_order (abfd, info, o, p)) - goto error_return; - } - } - } - - /* That wrote out all the local symbols. Finish up the symbol table - with the global symbols. */ - - /* The sh_info field records the index of the first non local - symbol. */ - symtab_hdr->sh_info = abfd->symcount; - if (dynamic) - elf_section_data (finfo.dynsym_sec->output_section)->this_hdr.sh_info = 1; - - /* We get the global symbols from the hash table. */ - eif.failed = false; - eif.finfo = &finfo; - elf_link_hash_traverse (elf_hash_table (info), elf_link_output_extsym, - (PTR) &eif); - if (eif.failed) - return false; - - /* Flush all symbols to the file. */ - if (! elf_link_flush_output_syms (&finfo)) - return false; - - /* Now we know the size of the symtab section. */ - off += symtab_hdr->sh_size; - - /* Finish up and write out the symbol string table (.strtab) - section. */ - symstrtab_hdr = &elf_tdata (abfd)->strtab_hdr; - /* sh_name was set in prep_headers. */ - symstrtab_hdr->sh_type = SHT_STRTAB; - symstrtab_hdr->sh_flags = 0; - symstrtab_hdr->sh_addr = 0; - symstrtab_hdr->sh_size = _bfd_stringtab_size (finfo.symstrtab); - symstrtab_hdr->sh_entsize = 0; - symstrtab_hdr->sh_link = 0; - symstrtab_hdr->sh_info = 0; - /* sh_offset is set just below. */ - symstrtab_hdr->sh_addralign = 1; - - off = _bfd_elf_assign_file_position_for_section (symstrtab_hdr, off, true); - elf_tdata (abfd)->next_file_pos = off; - - if (abfd->symcount > 0) - { - if (bfd_seek (abfd, symstrtab_hdr->sh_offset, SEEK_SET) != 0 - || ! _bfd_stringtab_emit (abfd, finfo.symstrtab)) - return false; - } - - /* Adjust the relocs to have the correct symbol indices. */ - for (o = abfd->sections; o != NULL; o = o->next) - { - struct elf_link_hash_entry **rel_hash; - Elf_Internal_Shdr *rel_hdr; - - if ((o->flags & SEC_RELOC) == 0) - continue; - - rel_hash = elf_section_data (o)->rel_hashes; - rel_hdr = &elf_section_data (o)->rel_hdr; - for (i = 0; i < o->reloc_count; i++, rel_hash++) - { - if (*rel_hash == NULL) - continue; - - BFD_ASSERT ((*rel_hash)->indx >= 0); - - if (rel_hdr->sh_entsize == sizeof (Elf_External_Rel)) - { - Elf_External_Rel *erel; - Elf_Internal_Rel irel; - - erel = (Elf_External_Rel *) rel_hdr->contents + i; - elf_swap_reloc_in (abfd, erel, &irel); - irel.r_info = ELF_R_INFO ((*rel_hash)->indx, - ELF_R_TYPE (irel.r_info)); - elf_swap_reloc_out (abfd, &irel, erel); - } - else - { - Elf_External_Rela *erela; - Elf_Internal_Rela irela; - - BFD_ASSERT (rel_hdr->sh_entsize - == sizeof (Elf_External_Rela)); - - erela = (Elf_External_Rela *) rel_hdr->contents + i; - elf_swap_reloca_in (abfd, erela, &irela); - irela.r_info = ELF_R_INFO ((*rel_hash)->indx, - ELF_R_TYPE (irela.r_info)); - elf_swap_reloca_out (abfd, &irela, erela); - } - } - - /* Set the reloc_count field to 0 to prevent write_relocs from - trying to swap the relocs out itself. */ - o->reloc_count = 0; - } - - /* If we are linking against a dynamic object, or generating a - shared library, finish up the dynamic linking information. */ - if (dynamic) - { - Elf_External_Dyn *dyncon, *dynconend; - - /* Fix up .dynamic entries. */ - o = bfd_get_section_by_name (dynobj, ".dynamic"); - BFD_ASSERT (o != NULL); - - dyncon = (Elf_External_Dyn *) o->contents; - dynconend = (Elf_External_Dyn *) (o->contents + o->_raw_size); - for (; dyncon < dynconend; dyncon++) - { - Elf_Internal_Dyn dyn; - const char *name; - unsigned int type; - - elf_swap_dyn_in (dynobj, dyncon, &dyn); - - switch (dyn.d_tag) - { - default: - break; - - /* SVR4 linkers seem to set DT_INIT and DT_FINI based on - magic _init and _fini symbols. This is pretty ugly, - but we are compatible. */ - case DT_INIT: - name = "_init"; - goto get_sym; - case DT_FINI: - name = "_fini"; - get_sym: - { - struct elf_link_hash_entry *h; - - h = elf_link_hash_lookup (elf_hash_table (info), name, - false, false, true); - if (h != NULL - && (h->root.type == bfd_link_hash_defined - || h->root.type == bfd_link_hash_defweak)) - { - dyn.d_un.d_val = h->root.u.def.value; - o = h->root.u.def.section; - if (o->output_section != NULL) - dyn.d_un.d_val += (o->output_section->vma - + o->output_offset); - else - { - /* The symbol is imported from another shared - library and does not apply to this one. */ - dyn.d_un.d_val = 0; - } - - elf_swap_dyn_out (dynobj, &dyn, dyncon); - } - } - break; - - case DT_HASH: - name = ".hash"; - goto get_vma; - case DT_STRTAB: - name = ".dynstr"; - goto get_vma; - case DT_SYMTAB: - name = ".dynsym"; - get_vma: - o = bfd_get_section_by_name (abfd, name); - BFD_ASSERT (o != NULL); - dyn.d_un.d_ptr = o->vma; - elf_swap_dyn_out (dynobj, &dyn, dyncon); - break; - - case DT_REL: - case DT_RELA: - case DT_RELSZ: - case DT_RELASZ: - if (dyn.d_tag == DT_REL || dyn.d_tag == DT_RELSZ) - type = SHT_REL; - else - type = SHT_RELA; - dyn.d_un.d_val = 0; - for (i = 1; i < elf_elfheader (abfd)->e_shnum; i++) - { - Elf_Internal_Shdr *hdr; - - hdr = elf_elfsections (abfd)[i]; - if (hdr->sh_type == type - && (hdr->sh_flags & SHF_ALLOC) != 0) - { - if (dyn.d_tag == DT_RELSZ || dyn.d_tag == DT_RELASZ) - dyn.d_un.d_val += hdr->sh_size; - else - { - if (dyn.d_un.d_val == 0 - || hdr->sh_addr < dyn.d_un.d_val) - dyn.d_un.d_val = hdr->sh_addr; - } - } - } - elf_swap_dyn_out (dynobj, &dyn, dyncon); - break; - } - } - } - - /* If we have created any dynamic sections, then output them. */ - if (dynobj != NULL) - { - if (! (*bed->elf_backend_finish_dynamic_sections) (abfd, info)) - goto error_return; - - for (o = dynobj->sections; o != NULL; o = o->next) - { - if ((o->flags & SEC_HAS_CONTENTS) == 0 - || o->_raw_size == 0) - continue; - if ((o->flags & SEC_IN_MEMORY) == 0) - { - /* At this point, we are only interested in sections - created by elf_link_create_dynamic_sections. FIXME: - This test is fragile. */ - continue; - } - if ((elf_section_data (o->output_section)->this_hdr.sh_type - != SHT_STRTAB) - || strcmp (bfd_get_section_name (abfd, o), ".dynstr") != 0) - { - if (! bfd_set_section_contents (abfd, o->output_section, - o->contents, o->output_offset, - o->_raw_size)) - goto error_return; - } - else - { - file_ptr off; - - /* The contents of the .dynstr section are actually in a - stringtab. */ - off = elf_section_data (o->output_section)->this_hdr.sh_offset; - if (bfd_seek (abfd, off, SEEK_SET) != 0 - || ! _bfd_stringtab_emit (abfd, - elf_hash_table (info)->dynstr)) - goto error_return; - } - } - } - - if (finfo.symstrtab != NULL) - _bfd_stringtab_free (finfo.symstrtab); - if (finfo.contents != NULL) - free (finfo.contents); - if (finfo.external_relocs != NULL) - free (finfo.external_relocs); - if (finfo.internal_relocs != NULL) - free (finfo.internal_relocs); - if (finfo.external_syms != NULL) - free (finfo.external_syms); - if (finfo.internal_syms != NULL) - free (finfo.internal_syms); - if (finfo.indices != NULL) - free (finfo.indices); - if (finfo.sections != NULL) - free (finfo.sections); - if (finfo.symbuf != NULL) - free (finfo.symbuf); - for (o = abfd->sections; o != NULL; o = o->next) - { - if ((o->flags & SEC_RELOC) != 0 - && elf_section_data (o)->rel_hashes != NULL) - free (elf_section_data (o)->rel_hashes); - } - - elf_tdata (abfd)->linker = true; - - return true; - - error_return: - if (finfo.symstrtab != NULL) - _bfd_stringtab_free (finfo.symstrtab); - if (finfo.contents != NULL) - free (finfo.contents); - if (finfo.external_relocs != NULL) - free (finfo.external_relocs); - if (finfo.internal_relocs != NULL) - free (finfo.internal_relocs); - if (finfo.external_syms != NULL) - free (finfo.external_syms); - if (finfo.internal_syms != NULL) - free (finfo.internal_syms); - if (finfo.indices != NULL) - free (finfo.indices); - if (finfo.sections != NULL) - free (finfo.sections); - if (finfo.symbuf != NULL) - free (finfo.symbuf); - for (o = abfd->sections; o != NULL; o = o->next) - { - if ((o->flags & SEC_RELOC) != 0 - && elf_section_data (o)->rel_hashes != NULL) - free (elf_section_data (o)->rel_hashes); - } - - return false; -} - -/* Add a symbol to the output symbol table. */ - -static boolean -elf_link_output_sym (finfo, name, elfsym, input_sec) - struct elf_final_link_info *finfo; - const char *name; - Elf_Internal_Sym *elfsym; - asection *input_sec; -{ - boolean (*output_symbol_hook) PARAMS ((bfd *, - struct bfd_link_info *info, - const char *, - Elf_Internal_Sym *, - asection *)); - - output_symbol_hook = get_elf_backend_data (finfo->output_bfd)-> - elf_backend_link_output_symbol_hook; - if (output_symbol_hook != NULL) - { - if (! ((*output_symbol_hook) - (finfo->output_bfd, finfo->info, name, elfsym, input_sec))) - return false; - } - - if (name == (const char *) NULL || *name == '\0') - elfsym->st_name = 0; - else - { - elfsym->st_name = (unsigned long) _bfd_stringtab_add (finfo->symstrtab, - name, true, - false); - if (elfsym->st_name == (unsigned long) -1) - return false; - } - - if (finfo->symbuf_count >= finfo->symbuf_size) - { - if (! elf_link_flush_output_syms (finfo)) - return false; - } - - elf_swap_symbol_out (finfo->output_bfd, elfsym, - (PTR) (finfo->symbuf + finfo->symbuf_count)); - ++finfo->symbuf_count; - - ++finfo->output_bfd->symcount; - - return true; -} - -/* Flush the output symbols to the file. */ - -static boolean -elf_link_flush_output_syms (finfo) - struct elf_final_link_info *finfo; -{ - if (finfo->symbuf_count > 0) - { - Elf_Internal_Shdr *symtab; - - symtab = &elf_tdata (finfo->output_bfd)->symtab_hdr; - - if (bfd_seek (finfo->output_bfd, symtab->sh_offset + symtab->sh_size, - SEEK_SET) != 0 - || (bfd_write ((PTR) finfo->symbuf, finfo->symbuf_count, - sizeof (Elf_External_Sym), finfo->output_bfd) - != finfo->symbuf_count * sizeof (Elf_External_Sym))) - return false; - - symtab->sh_size += finfo->symbuf_count * sizeof (Elf_External_Sym); - - finfo->symbuf_count = 0; - } - - return true; -} - -/* Add an external symbol to the symbol table. This is called from - the hash table traversal routine. */ - -static boolean -elf_link_output_extsym (h, data) - struct elf_link_hash_entry *h; - PTR data; -{ - struct elf_finfo_failed *eif = (struct elf_finfo_failed *) data; - struct elf_final_link_info *finfo = eif->finfo; - boolean strip; - Elf_Internal_Sym sym; - asection *input_sec; - - /* If we are not creating a shared library, and this symbol is - referenced by a shared library but is not defined anywhere, then - warn that it is undefined. If we do not do this, the runtime - linker will complain that the symbol is undefined when the - program is run. We don't have to worry about symbols that are - referenced by regular files, because we will already have issued - warnings for them. */ - if (! finfo->info->relocateable - && ! finfo->info->shared - && h->root.type == bfd_link_hash_undefined - && (h->elf_link_hash_flags & ELF_LINK_HASH_REF_DYNAMIC) != 0 - && (h->elf_link_hash_flags & ELF_LINK_HASH_REF_REGULAR) == 0) - { - if (! ((*finfo->info->callbacks->undefined_symbol) - (finfo->info, h->root.root.string, h->root.u.undef.abfd, - (asection *) NULL, 0))) - { - eif->failed = true; - return false; - } - } - - /* We don't want to output symbols that have never been mentioned by - a regular file, or that we have been told to strip. However, if - h->indx is set to -2, the symbol is used by a reloc and we must - output it. */ - if (h->indx == -2) - strip = false; - else if (((h->elf_link_hash_flags & ELF_LINK_HASH_DEF_DYNAMIC) != 0 - || (h->elf_link_hash_flags & ELF_LINK_HASH_REF_DYNAMIC) != 0) - && (h->elf_link_hash_flags & ELF_LINK_HASH_DEF_REGULAR) == 0 - && (h->elf_link_hash_flags & ELF_LINK_HASH_REF_REGULAR) == 0) - strip = true; - else if (finfo->info->strip == strip_all - || (finfo->info->strip == strip_some - && bfd_hash_lookup (finfo->info->keep_hash, - h->root.root.string, - false, false) == NULL)) - strip = true; - else - strip = false; - - /* If we're stripping it, and it's not a dynamic symbol, there's - nothing else to do. */ - if (strip && h->dynindx == -1) - return true; - - sym.st_value = 0; - sym.st_size = h->size; - sym.st_other = 0; - if (h->root.type == bfd_link_hash_undefweak - || h->root.type == bfd_link_hash_defweak) - sym.st_info = ELF_ST_INFO (STB_WEAK, h->type); - else - sym.st_info = ELF_ST_INFO (STB_GLOBAL, h->type); - - switch (h->root.type) - { - default: - case bfd_link_hash_new: - abort (); - return false; - - case bfd_link_hash_undefined: - input_sec = bfd_und_section_ptr; - sym.st_shndx = SHN_UNDEF; - break; - - case bfd_link_hash_undefweak: - input_sec = bfd_und_section_ptr; - sym.st_shndx = SHN_UNDEF; - break; - - case bfd_link_hash_defined: - case bfd_link_hash_defweak: - { - input_sec = h->root.u.def.section; - if (input_sec->output_section != NULL) - { - sym.st_shndx = - _bfd_elf_section_from_bfd_section (finfo->output_bfd, - input_sec->output_section); - if (sym.st_shndx == (unsigned short) -1) - { - eif->failed = true; - return false; - } - - /* ELF symbols in relocateable files are section relative, - but in nonrelocateable files they are virtual - addresses. */ - sym.st_value = h->root.u.def.value + input_sec->output_offset; - if (! finfo->info->relocateable) - sym.st_value += input_sec->output_section->vma; - } - else - { - BFD_ASSERT ((bfd_get_flavour (input_sec->owner) - == bfd_target_elf_flavour) - && elf_elfheader (input_sec->owner)->e_type == ET_DYN); - sym.st_shndx = SHN_UNDEF; - input_sec = bfd_und_section_ptr; - } - } - break; - - case bfd_link_hash_common: - input_sec = bfd_com_section_ptr; - sym.st_shndx = SHN_COMMON; - sym.st_value = 1 << h->root.u.c.p->alignment_power; - break; - - case bfd_link_hash_indirect: - case bfd_link_hash_warning: - /* We can't represent these symbols in ELF. A warning symbol - may have come from a .gnu.warning.SYMBOL section anyhow. We - just put the target symbol in the hash table. If the target - symbol does not really exist, don't do anything. */ - if (h->root.u.i.link->type == bfd_link_hash_new) - return true; - return (elf_link_output_extsym - ((struct elf_link_hash_entry *) h->root.u.i.link, data)); - } - - /* If this symbol should be put in the .dynsym section, then put it - there now. We have already know the symbol index. We also fill - in the entry in the .hash section. */ - if (h->dynindx != -1 - && elf_hash_table (finfo->info)->dynamic_sections_created) - { - struct elf_backend_data *bed; - size_t bucketcount; - size_t bucket; - bfd_byte *bucketpos; - bfd_vma chain; - - sym.st_name = h->dynstr_index; - - /* Give the processor backend a chance to tweak the symbol - value, and also to finish up anything that needs to be done - for this symbol. */ - bed = get_elf_backend_data (finfo->output_bfd); - if (! ((*bed->elf_backend_finish_dynamic_symbol) - (finfo->output_bfd, finfo->info, h, &sym))) - { - eif->failed = true; - return false; - } - - elf_swap_symbol_out (finfo->output_bfd, &sym, - (PTR) (((Elf_External_Sym *) - finfo->dynsym_sec->contents) - + h->dynindx)); - - bucketcount = elf_hash_table (finfo->info)->bucketcount; - bucket = (bfd_elf_hash ((const unsigned char *) h->root.root.string) - % bucketcount); - bucketpos = ((bfd_byte *) finfo->hash_sec->contents - + (bucket + 2) * (ARCH_SIZE / 8)); - chain = get_word (finfo->output_bfd, bucketpos); - put_word (finfo->output_bfd, h->dynindx, bucketpos); - put_word (finfo->output_bfd, chain, - ((bfd_byte *) finfo->hash_sec->contents - + (bucketcount + 2 + h->dynindx) * (ARCH_SIZE / 8))); - } - - /* If we're stripping it, then it was just a dynamic symbol, and - there's nothing else to do. */ - if (strip) - return true; - - h->indx = finfo->output_bfd->symcount; - - if (! elf_link_output_sym (finfo, h->root.root.string, &sym, input_sec)) - { - eif->failed = true; - return false; - } - - return true; -} - -/* Link an input file into the linker output file. This function - handles all the sections and relocations of the input file at once. - This is so that we only have to read the local symbols once, and - don't have to keep them in memory. */ - -static boolean -elf_link_input_bfd (finfo, input_bfd) - struct elf_final_link_info *finfo; - bfd *input_bfd; -{ - boolean (*relocate_section) PARAMS ((bfd *, struct bfd_link_info *, - bfd *, asection *, bfd_byte *, - Elf_Internal_Rela *, - Elf_Internal_Sym *, asection **)); - bfd *output_bfd; - Elf_Internal_Shdr *symtab_hdr; - size_t locsymcount; - size_t extsymoff; - Elf_External_Sym *esym; - Elf_External_Sym *esymend; - Elf_Internal_Sym *isym; - long *pindex; - asection **ppsection; - asection *o; - - output_bfd = finfo->output_bfd; - relocate_section = - get_elf_backend_data (output_bfd)->elf_backend_relocate_section; - - /* If this is a dynamic object, we don't want to do anything here: - we don't want the local symbols, and we don't want the section - contents. */ - if (elf_elfheader (input_bfd)->e_type == ET_DYN) - return true; - - symtab_hdr = &elf_tdata (input_bfd)->symtab_hdr; - if (elf_bad_symtab (input_bfd)) - { - locsymcount = symtab_hdr->sh_size / sizeof (Elf_External_Sym); - extsymoff = 0; - } - else - { - locsymcount = symtab_hdr->sh_info; - extsymoff = symtab_hdr->sh_info; - } - - /* Read the local symbols. */ - if (locsymcount > 0 - && (bfd_seek (input_bfd, symtab_hdr->sh_offset, SEEK_SET) != 0 - || (bfd_read (finfo->external_syms, sizeof (Elf_External_Sym), - locsymcount, input_bfd) - != locsymcount * sizeof (Elf_External_Sym)))) - return false; - - /* Swap in the local symbols and write out the ones which we know - are going into the output file. */ - esym = finfo->external_syms; - esymend = esym + locsymcount; - isym = finfo->internal_syms; - pindex = finfo->indices; - ppsection = finfo->sections; - for (; esym < esymend; esym++, isym++, pindex++, ppsection++) - { - asection *isec; - const char *name; - Elf_Internal_Sym osym; - - elf_swap_symbol_in (input_bfd, esym, isym); - *pindex = -1; - - if (elf_bad_symtab (input_bfd)) - { - if (ELF_ST_BIND (isym->st_info) != STB_LOCAL) - { - *ppsection = NULL; - continue; - } - } - - if (isym->st_shndx == SHN_UNDEF) - isec = bfd_und_section_ptr; - else if (isym->st_shndx > 0 && isym->st_shndx < SHN_LORESERVE) - isec = section_from_elf_index (input_bfd, isym->st_shndx); - else if (isym->st_shndx == SHN_ABS) - isec = bfd_abs_section_ptr; - else if (isym->st_shndx == SHN_COMMON) - isec = bfd_com_section_ptr; - else - { - /* Who knows? */ - isec = NULL; - } - - *ppsection = isec; - - /* Don't output the first, undefined, symbol. */ - if (esym == finfo->external_syms) - continue; - - /* If we are stripping all symbols, we don't want to output this - one. */ - if (finfo->info->strip == strip_all) - continue; - - /* We never output section symbols. Instead, we use the section - symbol of the corresponding section in the output file. */ - if (ELF_ST_TYPE (isym->st_info) == STT_SECTION) - continue; - - /* If we are discarding all local symbols, we don't want to - output this one. If we are generating a relocateable output - file, then some of the local symbols may be required by - relocs; we output them below as we discover that they are - needed. */ - if (finfo->info->discard == discard_all) - continue; - - /* Get the name of the symbol. */ - name = bfd_elf_string_from_elf_section (input_bfd, symtab_hdr->sh_link, - isym->st_name); - if (name == NULL) - return false; - - /* See if we are discarding symbols with this name. */ - if ((finfo->info->strip == strip_some - && (bfd_hash_lookup (finfo->info->keep_hash, name, false, false) - == NULL)) - || (finfo->info->discard == discard_l - && strncmp (name, finfo->info->lprefix, - finfo->info->lprefix_len) == 0)) - continue; - - /* If we get here, we are going to output this symbol. */ - - osym = *isym; - - /* Adjust the section index for the output file. */ - osym.st_shndx = _bfd_elf_section_from_bfd_section (output_bfd, - isec->output_section); - if (osym.st_shndx == (unsigned short) -1) - return false; - - *pindex = output_bfd->symcount; - - /* ELF symbols in relocateable files are section relative, but - in executable files they are virtual addresses. Note that - this code assumes that all ELF sections have an associated - BFD section with a reasonable value for output_offset; below - we assume that they also have a reasonable value for - output_section. Any special sections must be set up to meet - these requirements. */ - osym.st_value += isec->output_offset; - if (! finfo->info->relocateable) - osym.st_value += isec->output_section->vma; - - if (! elf_link_output_sym (finfo, name, &osym, isec)) - return false; - } - - /* Relocate the contents of each section. */ - for (o = input_bfd->sections; o != NULL; o = o->next) - { - if ((o->flags & SEC_HAS_CONTENTS) == 0) - continue; - - if ((o->flags & SEC_IN_MEMORY) != 0 - && input_bfd == elf_hash_table (finfo->info)->dynobj) - { - /* Section was created by elf_link_create_dynamic_sections. - FIXME: This test is fragile. */ - continue; - } - - /* Read the contents of the section. */ - if (! bfd_get_section_contents (input_bfd, o, finfo->contents, - (file_ptr) 0, o->_raw_size)) - return false; - - if ((o->flags & SEC_RELOC) != 0) - { - Elf_Internal_Rela *internal_relocs; - - /* Get the swapped relocs. */ - internal_relocs = elf_link_read_relocs (input_bfd, o, - finfo->external_relocs, - finfo->internal_relocs, - false); - if (internal_relocs == NULL - && o->reloc_count > 0) - return false; - - /* Relocate the section by invoking a back end routine. - - The back end routine is responsible for adjusting the - section contents as necessary, and (if using Rela relocs - and generating a relocateable output file) adjusting the - reloc addend as necessary. - - The back end routine does not have to worry about setting - the reloc address or the reloc symbol index. - - The back end routine is given a pointer to the swapped in - internal symbols, and can access the hash table entries - for the external symbols via elf_sym_hashes (input_bfd). - - When generating relocateable output, the back end routine - must handle STB_LOCAL/STT_SECTION symbols specially. The - output symbol is going to be a section symbol - corresponding to the output section, which will require - the addend to be adjusted. */ - - if (! (*relocate_section) (output_bfd, finfo->info, - input_bfd, o, - finfo->contents, - internal_relocs, - finfo->internal_syms, - finfo->sections)) - return false; - - if (finfo->info->relocateable) - { - Elf_Internal_Rela *irela; - Elf_Internal_Rela *irelaend; - struct elf_link_hash_entry **rel_hash; - Elf_Internal_Shdr *input_rel_hdr; - Elf_Internal_Shdr *output_rel_hdr; - - /* Adjust the reloc addresses and symbol indices. */ - - irela = internal_relocs; - irelaend = irela + o->reloc_count; - rel_hash = (elf_section_data (o->output_section)->rel_hashes - + o->output_section->reloc_count); - for (; irela < irelaend; irela++, rel_hash++) - { - unsigned long r_symndx; - Elf_Internal_Sym *isym; - asection *sec; - - irela->r_offset += o->output_offset; - - r_symndx = ELF_R_SYM (irela->r_info); - - if (r_symndx == 0) - continue; - - if (r_symndx >= locsymcount - || (elf_bad_symtab (input_bfd) - && finfo->sections[r_symndx] == NULL)) - { - long indx; - - /* This is a reloc against a global symbol. We - have not yet output all the local symbols, so - we do not know the symbol index of any global - symbol. We set the rel_hash entry for this - reloc to point to the global hash table entry - for this symbol. The symbol index is then - set at the end of elf_bfd_final_link. */ - indx = r_symndx - extsymoff; - *rel_hash = elf_sym_hashes (input_bfd)[indx]; - - /* Setting the index to -2 tells - elf_link_output_extsym that this symbol is - used by a reloc. */ - BFD_ASSERT ((*rel_hash)->indx < 0); - (*rel_hash)->indx = -2; - - continue; - } - - /* This is a reloc against a local symbol. */ - - *rel_hash = NULL; - isym = finfo->internal_syms + r_symndx; - sec = finfo->sections[r_symndx]; - if (ELF_ST_TYPE (isym->st_info) == STT_SECTION) - { - /* I suppose the backend ought to fill in the - section of any STT_SECTION symbol against a - processor specific section. */ - if (sec != NULL && bfd_is_abs_section (sec)) - r_symndx = 0; - else if (sec == NULL || sec->owner == NULL) - { - bfd_set_error (bfd_error_bad_value); - return false; - } - else - { - r_symndx = sec->output_section->target_index; - BFD_ASSERT (r_symndx != 0); - } - } - else - { - if (finfo->indices[r_symndx] == -1) - { - unsigned long link; - const char *name; - asection *osec; - - if (finfo->info->strip == strip_all) - { - /* You can't do ld -r -s. */ - bfd_set_error (bfd_error_invalid_operation); - return false; - } - - /* This symbol was skipped earlier, but - since it is needed by a reloc, we - must output it now. */ - link = symtab_hdr->sh_link; - name = bfd_elf_string_from_elf_section (input_bfd, - link, - isym->st_name); - if (name == NULL) - return false; - - osec = sec->output_section; - isym->st_shndx = - _bfd_elf_section_from_bfd_section (output_bfd, - osec); - if (isym->st_shndx == (unsigned short) -1) - return false; - - isym->st_value += sec->output_offset; - if (! finfo->info->relocateable) - isym->st_value += osec->vma; - - finfo->indices[r_symndx] = output_bfd->symcount; - - if (! elf_link_output_sym (finfo, name, isym, sec)) - return false; - } - - r_symndx = finfo->indices[r_symndx]; - } - - irela->r_info = ELF_R_INFO (r_symndx, - ELF_R_TYPE (irela->r_info)); - } - - /* Swap out the relocs. */ - input_rel_hdr = &elf_section_data (o)->rel_hdr; - output_rel_hdr = &elf_section_data (o->output_section)->rel_hdr; - BFD_ASSERT (output_rel_hdr->sh_entsize - == input_rel_hdr->sh_entsize); - irela = internal_relocs; - irelaend = irela + o->reloc_count; - if (input_rel_hdr->sh_entsize == sizeof (Elf_External_Rel)) - { - Elf_External_Rel *erel; - - erel = ((Elf_External_Rel *) output_rel_hdr->contents - + o->output_section->reloc_count); - for (; irela < irelaend; irela++, erel++) - { - Elf_Internal_Rel irel; - - irel.r_offset = irela->r_offset; - irel.r_info = irela->r_info; - BFD_ASSERT (irela->r_addend == 0); - elf_swap_reloc_out (output_bfd, &irel, erel); - } - } - else - { - Elf_External_Rela *erela; - - BFD_ASSERT (input_rel_hdr->sh_entsize - == sizeof (Elf_External_Rela)); - erela = ((Elf_External_Rela *) output_rel_hdr->contents - + o->output_section->reloc_count); - for (; irela < irelaend; irela++, erela++) - elf_swap_reloca_out (output_bfd, irela, erela); - } - - o->output_section->reloc_count += o->reloc_count; - } - } - - /* Write out the modified section contents. */ - if (! bfd_set_section_contents (output_bfd, o->output_section, - finfo->contents, o->output_offset, - (o->_cooked_size != 0 - ? o->_cooked_size - : o->_raw_size))) - return false; - } - - return true; -} - -/* Generate a reloc when linking an ELF file. This is a reloc - requested by the linker, and does come from any input file. This - is used to build constructor and destructor tables when linking - with -Ur. */ - -static boolean -elf_reloc_link_order (output_bfd, info, output_section, link_order) - bfd *output_bfd; - struct bfd_link_info *info; - asection *output_section; - struct bfd_link_order *link_order; -{ - reloc_howto_type *howto; - long indx; - bfd_vma offset; - bfd_vma addend; - struct elf_link_hash_entry **rel_hash_ptr; - Elf_Internal_Shdr *rel_hdr; - - howto = bfd_reloc_type_lookup (output_bfd, link_order->u.reloc.p->reloc); - if (howto == NULL) - { - bfd_set_error (bfd_error_bad_value); - return false; - } - - addend = link_order->u.reloc.p->addend; - - /* Figure out the symbol index. */ - rel_hash_ptr = (elf_section_data (output_section)->rel_hashes - + output_section->reloc_count); - if (link_order->type == bfd_section_reloc_link_order) - { - indx = link_order->u.reloc.p->u.section->target_index; - BFD_ASSERT (indx != 0); - *rel_hash_ptr = NULL; - } - else - { - struct elf_link_hash_entry *h; - - /* Treat a reloc against a defined symbol as though it were - actually against the section. */ - h = ((struct elf_link_hash_entry *) - bfd_wrapped_link_hash_lookup (output_bfd, info, - link_order->u.reloc.p->u.name, - false, false, true)); - if (h != NULL - && (h->root.type == bfd_link_hash_defined - || h->root.type == bfd_link_hash_defweak)) - { - asection *section; - - section = h->root.u.def.section; - indx = section->output_section->target_index; - *rel_hash_ptr = NULL; - /* It seems that we ought to add the symbol value to the - addend here, but in practice it has already been added - because it was passed to constructor_callback. */ - addend += section->output_section->vma + section->output_offset; - } - else if (h != NULL) - { - /* Setting the index to -2 tells elf_link_output_extsym that - this symbol is used by a reloc. */ - h->indx = -2; - *rel_hash_ptr = h; - indx = 0; - } - else - { - if (! ((*info->callbacks->unattached_reloc) - (info, link_order->u.reloc.p->u.name, (bfd *) NULL, - (asection *) NULL, (bfd_vma) 0))) - return false; - indx = 0; - } - } - - /* If this is an inplace reloc, we must write the addend into the - object file. */ - if (howto->partial_inplace && addend != 0) - { - bfd_size_type size; - bfd_reloc_status_type rstat; - bfd_byte *buf; - boolean ok; - - size = bfd_get_reloc_size (howto); - buf = (bfd_byte *) bfd_zmalloc (size); - if (buf == (bfd_byte *) NULL) - return false; - rstat = _bfd_relocate_contents (howto, output_bfd, addend, buf); - switch (rstat) - { - case bfd_reloc_ok: - break; - default: - case bfd_reloc_outofrange: - abort (); - case bfd_reloc_overflow: - if (! ((*info->callbacks->reloc_overflow) - (info, - (link_order->type == bfd_section_reloc_link_order - ? bfd_section_name (output_bfd, - link_order->u.reloc.p->u.section) - : link_order->u.reloc.p->u.name), - howto->name, addend, (bfd *) NULL, (asection *) NULL, - (bfd_vma) 0))) - { - free (buf); - return false; - } - break; - } - ok = bfd_set_section_contents (output_bfd, output_section, (PTR) buf, - (file_ptr) link_order->offset, size); - free (buf); - if (! ok) - return false; - } - - /* The address of a reloc is relative to the section in a - relocateable file, and is a virtual address in an executable - file. */ - offset = link_order->offset; - if (! info->relocateable) - offset += output_section->vma; - - rel_hdr = &elf_section_data (output_section)->rel_hdr; - - if (rel_hdr->sh_type == SHT_REL) - { - Elf_Internal_Rel irel; - Elf_External_Rel *erel; - - irel.r_offset = offset; - irel.r_info = ELF_R_INFO (indx, howto->type); - erel = ((Elf_External_Rel *) rel_hdr->contents - + output_section->reloc_count); - elf_swap_reloc_out (output_bfd, &irel, erel); - } - else - { - Elf_Internal_Rela irela; - Elf_External_Rela *erela; - - irela.r_offset = offset; - irela.r_info = ELF_R_INFO (indx, howto->type); - irela.r_addend = addend; - erela = ((Elf_External_Rela *) rel_hdr->contents - + output_section->reloc_count); - elf_swap_reloca_out (output_bfd, &irela, erela); - } - - ++output_section->reloc_count; - - return true; -} - - -/* Allocate a pointer to live in a linker created section. */ - -boolean -elf_create_pointer_linker_section (abfd, info, lsect, h, rel) - bfd *abfd; - struct bfd_link_info *info; - elf_linker_section_t *lsect; - struct elf_link_hash_entry *h; - const Elf_Internal_Rela *rel; -{ - elf_linker_section_pointers_t **ptr_linker_section_ptr = NULL; - elf_linker_section_pointers_t *linker_section_ptr; - unsigned long r_symndx = ELF_R_SYM (rel->r_info);; - - BFD_ASSERT (lsect != NULL); - - /* Is this a global symbol? */ - if (h != NULL) - { - /* Has this symbol already been allocated, if so, our work is done */ - if (_bfd_elf_find_pointer_linker_section (h->linker_section_pointer, - rel->r_addend, - lsect->which)) - return true; - - ptr_linker_section_ptr = &h->linker_section_pointer; - /* Make sure this symbol is output as a dynamic symbol. */ - if (h->dynindx == -1) - { - if (! elf_link_record_dynamic_symbol (info, h)) - return false; - } - - if (lsect->rel_section) - lsect->rel_section->_raw_size += sizeof (Elf_External_Rela); - } - - else /* Allocation of a pointer to a local symbol */ - { - elf_linker_section_pointers_t **ptr = elf_local_ptr_offsets (abfd); - - /* Allocate a table to hold the local symbols if first time */ - if (!ptr) - { - int num_symbols = elf_tdata (abfd)->symtab_hdr.sh_info; - register unsigned int i; - - ptr = (elf_linker_section_pointers_t **) - bfd_alloc (abfd, num_symbols * sizeof (elf_linker_section_pointers_t *)); - - if (!ptr) - return false; - - elf_local_ptr_offsets (abfd) = ptr; - for (i = 0; i < num_symbols; i++) - ptr[i] = (elf_linker_section_pointers_t *)0; - } - - /* Has this symbol already been allocated, if so, our work is done */ - if (_bfd_elf_find_pointer_linker_section (ptr[r_symndx], - rel->r_addend, - lsect->which)) - return true; - - ptr_linker_section_ptr = &ptr[r_symndx]; - - if (info->shared) - { - /* If we are generating a shared object, we need to - output a R_<xxx>_RELATIVE reloc so that the - dynamic linker can adjust this GOT entry. */ - BFD_ASSERT (lsect->rel_section != NULL); - lsect->rel_section->_raw_size += sizeof (Elf_External_Rela); - } - } - - /* Allocate space for a pointer in the linker section, and allocate a new pointer record - from internal memory. */ - BFD_ASSERT (ptr_linker_section_ptr != NULL); - linker_section_ptr = (elf_linker_section_pointers_t *) - bfd_alloc (abfd, sizeof (elf_linker_section_pointers_t)); - - if (!linker_section_ptr) - return false; - - linker_section_ptr->next = *ptr_linker_section_ptr; - linker_section_ptr->addend = rel->r_addend; - linker_section_ptr->which = lsect->which; - linker_section_ptr->written_address_p = false; - *ptr_linker_section_ptr = linker_section_ptr; - - if (lsect->hole_size && lsect->hole_offset < lsect->max_hole_offset) - { - linker_section_ptr->offset = lsect->section->_raw_size - lsect->hole_size; - lsect->hole_offset += ARCH_SIZE / 8; - lsect->sym_offset += ARCH_SIZE / 8; - if (lsect->sym_hash) /* Bump up symbol value if needed */ - lsect->sym_hash->root.u.def.value += ARCH_SIZE / 8; - } - else - linker_section_ptr->offset = lsect->section->_raw_size; - - lsect->section->_raw_size += ARCH_SIZE / 8; - -#ifdef DEBUG - fprintf (stderr, "Create pointer in linker section %s, offset = %ld, section size = %ld\n", - lsect->name, (long)linker_section_ptr->offset, (long)lsect->section->_raw_size); -#endif - - return true; -} - - -#if ARCH_SIZE==64 -#define bfd_put_ptr(BFD,VAL,ADDR) bfd_put_64 (BFD, VAL, ADDR) -#endif -#if ARCH_SIZE==32 -#define bfd_put_ptr(BFD,VAL,ADDR) bfd_put_32 (BFD, VAL, ADDR) -#endif - -/* Fill in the address for a pointer generated in alinker section. */ - -bfd_vma -elf_finish_pointer_linker_section (output_bfd, input_bfd, info, lsect, h, relocation, rel, relative_reloc) - bfd *output_bfd; - bfd *input_bfd; - struct bfd_link_info *info; - elf_linker_section_t *lsect; - struct elf_link_hash_entry *h; - bfd_vma relocation; - const Elf_Internal_Rela *rel; - int relative_reloc; -{ - elf_linker_section_pointers_t *linker_section_ptr; - - BFD_ASSERT (lsect != NULL); - - if (h != NULL) /* global symbol */ - { - linker_section_ptr = _bfd_elf_find_pointer_linker_section (h->linker_section_pointer, - rel->r_addend, - lsect->which); - - BFD_ASSERT (linker_section_ptr != NULL); - - if (! elf_hash_table (info)->dynamic_sections_created - || (info->shared - && info->symbolic - && (h->elf_link_hash_flags & ELF_LINK_HASH_DEF_REGULAR))) - { - /* This is actually a static link, or it is a - -Bsymbolic link and the symbol is defined - locally. We must initialize this entry in the - global section. - - When doing a dynamic link, we create a .rela.<xxx> - relocation entry to initialize the value. This - is done in the finish_dynamic_symbol routine. */ - if (!linker_section_ptr->written_address_p) - { - linker_section_ptr->written_address_p = true; - bfd_put_ptr (output_bfd, relocation + linker_section_ptr->addend, - lsect->section->contents + linker_section_ptr->offset); - } - } - } - else /* local symbol */ - { - unsigned long r_symndx = ELF_R_SYM (rel->r_info); - BFD_ASSERT (elf_local_ptr_offsets (input_bfd) != NULL); - BFD_ASSERT (elf_local_ptr_offsets (input_bfd)[r_symndx] != NULL); - linker_section_ptr = _bfd_elf_find_pointer_linker_section (elf_local_ptr_offsets (input_bfd)[r_symndx], - rel->r_addend, - lsect->which); - - BFD_ASSERT (linker_section_ptr != NULL); - - /* Write out pointer if it hasn't been rewritten out before */ - if (!linker_section_ptr->written_address_p) - { - linker_section_ptr->written_address_p = true; - bfd_put_ptr (output_bfd, relocation + linker_section_ptr->addend, - lsect->section->contents + linker_section_ptr->offset); - - if (info->shared) - { - asection *srel = lsect->rel_section; - Elf_Internal_Rela outrel; - - /* We need to generate a relative reloc for the dynamic linker. */ - if (!srel) - lsect->rel_section = srel = bfd_get_section_by_name (elf_hash_table (info)->dynobj, - lsect->rel_name); - - BFD_ASSERT (srel != NULL); - - outrel.r_offset = (lsect->section->output_section->vma - + lsect->section->output_offset - + linker_section_ptr->offset); - outrel.r_info = ELF_R_INFO (0, relative_reloc); - outrel.r_addend = 0; - elf_swap_reloca_out (output_bfd, &outrel, - (((Elf_External_Rela *) - lsect->section->contents) - + lsect->section->reloc_count)); - ++lsect->section->reloc_count; - } - } - } - - relocation = (lsect->section->output_offset - + linker_section_ptr->offset - - lsect->hole_offset - - lsect->sym_offset); - -#ifdef DEBUG - fprintf (stderr, "Finish pointer in linker section %s, offset = %ld (0x%lx)\n", - lsect->name, (long)relocation, (long)relocation); -#endif - - /* Subtract out the addend, because it will get added back in by the normal - processing. */ - return relocation - linker_section_ptr->addend; -} diff --git a/contrib/gdb/bfd/elfxx-target.h b/contrib/gdb/bfd/elfxx-target.h deleted file mode 100644 index f2c0c32cf62e1..0000000000000 --- a/contrib/gdb/bfd/elfxx-target.h +++ /dev/null @@ -1,450 +0,0 @@ -/* Target definitions for NN-bit ELF - Copyright 1993, 1994, 1995, 1996 Free Software Foundation, Inc. - -This file is part of BFD, the Binary File Descriptor library. - -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 2 of the License, 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ - -/* This structure contains everything that BFD knows about a target. - It includes things like its byte order, name, what routines to call - to do various operations, etc. Every BFD points to a target structure - with its "xvec" member. - - There are two such structures here: one for big-endian machines and - one for little-endian machines. */ - -#define bfd_elfNN_close_and_cleanup _bfd_generic_close_and_cleanup -#define bfd_elfNN_bfd_free_cached_info _bfd_generic_bfd_free_cached_info -#ifndef bfd_elfNN_get_section_contents -#define bfd_elfNN_get_section_contents _bfd_generic_get_section_contents -#endif - -#define bfd_elfNN_canonicalize_dynamic_symtab _bfd_elf_canonicalize_dynamic_symtab -#define bfd_elfNN_canonicalize_reloc _bfd_elf_canonicalize_reloc -#ifndef bfd_elfNN_find_nearest_line -#define bfd_elfNN_find_nearest_line _bfd_elf_find_nearest_line -#endif -#define bfd_elfNN_read_minisymbols _bfd_elf_read_minisymbols -#define bfd_elfNN_minisymbol_to_symbol _bfd_elf_minisymbol_to_symbol -#define bfd_elfNN_get_dynamic_symtab_upper_bound _bfd_elf_get_dynamic_symtab_upper_bound -#define bfd_elfNN_get_lineno _bfd_elf_get_lineno -#define bfd_elfNN_get_reloc_upper_bound _bfd_elf_get_reloc_upper_bound -#define bfd_elfNN_get_symbol_info _bfd_elf_get_symbol_info -#define bfd_elfNN_get_symtab _bfd_elf_get_symtab -#define bfd_elfNN_get_symtab_upper_bound _bfd_elf_get_symtab_upper_bound -#if 0 /* done in elf-bfd.h */ -#define bfd_elfNN_link_record_dynamic_symbol _bfd_elf_link_record_dynamic_symbol -#endif -#define bfd_elfNN_make_empty_symbol _bfd_elf_make_empty_symbol -#define bfd_elfNN_new_section_hook _bfd_elf_new_section_hook -#define bfd_elfNN_set_arch_mach _bfd_elf_set_arch_mach -#ifndef bfd_elfNN_set_section_contents -#define bfd_elfNN_set_section_contents _bfd_elf_set_section_contents -#endif -#define bfd_elfNN_sizeof_headers _bfd_elf_sizeof_headers -#define bfd_elfNN_write_object_contents _bfd_elf_write_object_contents - -#define bfd_elfNN_get_section_contents_in_window \ - _bfd_generic_get_section_contents_in_window - -#ifndef elf_backend_want_got_plt -#define elf_backend_want_got_plt 0 -#endif -#ifndef elf_backend_plt_readonly -#define elf_backend_plt_readonly 0 -#endif -#ifndef elf_backend_want_plt_sym -#define elf_backend_want_plt_sym 0 -#endif - -#define bfd_elfNN_bfd_debug_info_start bfd_void -#define bfd_elfNN_bfd_debug_info_end bfd_void -#define bfd_elfNN_bfd_debug_info_accumulate (PROTO(void,(*),(bfd*, struct sec *))) bfd_void - -#ifndef bfd_elfNN_bfd_get_relocated_section_contents -#define bfd_elfNN_bfd_get_relocated_section_contents \ - bfd_generic_get_relocated_section_contents -#endif - -#define bfd_elfNN_bfd_relax_section bfd_generic_relax_section -#define bfd_elfNN_bfd_make_debug_symbol \ - ((asymbol *(*) PARAMS ((bfd *, void *, unsigned long))) bfd_nullvoidptr) - -#ifndef bfd_elfNN_bfd_copy_private_symbol_data -#define bfd_elfNN_bfd_copy_private_symbol_data \ - _bfd_elf_copy_private_symbol_data -#endif - -#ifndef bfd_elfNN_bfd_copy_private_section_data -#define bfd_elfNN_bfd_copy_private_section_data \ - _bfd_elf_copy_private_section_data -#endif -#ifndef bfd_elfNN_bfd_copy_private_bfd_data -#define bfd_elfNN_bfd_copy_private_bfd_data \ - ((boolean (*) PARAMS ((bfd *, bfd *))) bfd_true) -#endif -#ifndef bfd_elfNN_bfd_print_private_bfd_data -#define bfd_elfNN_bfd_print_private_bfd_data \ - _bfd_elf_print_private_bfd_data -#endif -#ifndef bfd_elfNN_bfd_merge_private_bfd_data -#define bfd_elfNN_bfd_merge_private_bfd_data \ - ((boolean (*) PARAMS ((bfd *, bfd *))) bfd_true) -#endif -#ifndef bfd_elfNN_bfd_set_private_flags -#define bfd_elfNN_bfd_set_private_flags \ - ((boolean (*) PARAMS ((bfd *, flagword))) bfd_true) -#endif -#ifndef bfd_elfNN_bfd_is_local_label -#define bfd_elfNN_bfd_is_local_label bfd_generic_is_local_label -#endif - -#ifndef bfd_elfNN_get_dynamic_reloc_upper_bound -#define bfd_elfNN_get_dynamic_reloc_upper_bound \ - _bfd_nodynamic_get_dynamic_reloc_upper_bound -#endif -#ifndef bfd_elfNN_canonicalize_dynamic_reloc -#define bfd_elfNN_canonicalize_dynamic_reloc \ - _bfd_nodynamic_canonicalize_dynamic_reloc -#endif - -#ifdef elf_backend_relocate_section -#ifndef bfd_elfNN_bfd_link_hash_table_create -#define bfd_elfNN_bfd_link_hash_table_create _bfd_elf_link_hash_table_create -#endif -#else /* ! defined (elf_backend_relocate_section) */ -/* If no backend relocate_section routine, use the generic linker. */ -#ifndef bfd_elfNN_bfd_link_hash_table_create -#define bfd_elfNN_bfd_link_hash_table_create \ - _bfd_generic_link_hash_table_create -#endif -#ifndef bfd_elfNN_bfd_link_add_symbols -#define bfd_elfNN_bfd_link_add_symbols _bfd_generic_link_add_symbols -#endif -#ifndef bfd_elfNN_bfd_final_link -#define bfd_elfNN_bfd_final_link _bfd_generic_final_link -#endif -#endif /* ! defined (elf_backend_relocate_section) */ -#ifndef bfd_elfNN_bfd_link_split_section -#define bfd_elfNN_bfd_link_split_section _bfd_generic_link_split_section -#endif - -#ifndef elf_symbol_leading_char -#define elf_symbol_leading_char 0 -#endif - -#ifndef elf_info_to_howto_rel -#define elf_info_to_howto_rel 0 -#endif - -#ifndef ELF_MAXPAGESIZE -#define ELF_MAXPAGESIZE 1 -#endif - -#ifndef elf_backend_collect -#define elf_backend_collect false -#endif -#ifndef elf_backend_type_change_ok -#define elf_backend_type_change_ok false -#endif - -#ifndef elf_backend_sym_is_global -#define elf_backend_sym_is_global 0 -#endif -#ifndef elf_backend_object_p -#define elf_backend_object_p 0 -#endif -#ifndef elf_backend_symbol_processing -#define elf_backend_symbol_processing 0 -#endif -#ifndef elf_backend_symbol_table_processing -#define elf_backend_symbol_table_processing 0 -#endif -#ifndef elf_backend_section_processing -#define elf_backend_section_processing 0 -#endif -#ifndef elf_backend_section_from_shdr -#define elf_backend_section_from_shdr 0 -#endif -#ifndef elf_backend_fake_sections -#define elf_backend_fake_sections 0 -#endif -#ifndef elf_backend_section_from_bfd_section -#define elf_backend_section_from_bfd_section 0 -#endif -#ifndef elf_backend_add_symbol_hook -#define elf_backend_add_symbol_hook 0 -#endif -#ifndef elf_backend_link_output_symbol_hook -#define elf_backend_link_output_symbol_hook 0 -#endif -#ifndef elf_backend_create_dynamic_sections -#define elf_backend_create_dynamic_sections 0 -#endif -#ifndef elf_backend_check_relocs -#define elf_backend_check_relocs 0 -#endif -#ifndef elf_backend_adjust_dynamic_symbol -#define elf_backend_adjust_dynamic_symbol 0 -#endif -#ifndef elf_backend_size_dynamic_sections -#define elf_backend_size_dynamic_sections 0 -#endif -#ifndef elf_backend_relocate_section -#define elf_backend_relocate_section 0 -#endif -#ifndef elf_backend_finish_dynamic_symbol -#define elf_backend_finish_dynamic_symbol 0 -#endif -#ifndef elf_backend_finish_dynamic_sections -#define elf_backend_finish_dynamic_sections 0 -#endif -#ifndef elf_backend_begin_write_processing -#define elf_backend_begin_write_processing 0 -#endif -#ifndef elf_backend_final_write_processing -#define elf_backend_final_write_processing 0 -#endif -#ifndef elf_backend_additional_program_headers -#define elf_backend_additional_program_headers 0 -#endif -#ifndef elf_backend_modify_segment_map -#define elf_backend_modify_segment_map 0 -#endif -#ifndef elf_backend_ecoff_debug_swap -#define elf_backend_ecoff_debug_swap 0 -#endif - -#ifndef ELF_MACHINE_ALT1 -#define ELF_MACHINE_ALT1 0 -#endif - -#ifndef ELF_MACHINE_ALT2 -#define ELF_MACHINE_ALT2 0 -#endif - -extern const struct elf_size_info _bfd_elfNN_size_info; - -static CONST struct elf_backend_data elfNN_bed = -{ -#ifdef USE_REL - 0, /* use_rela_p */ -#else - 1, /* use_rela_p */ -#endif - ELF_ARCH, /* arch */ - ELF_MACHINE_CODE, /* elf_machine_code */ - ELF_MAXPAGESIZE, /* maxpagesize */ - elf_backend_collect, - elf_backend_type_change_ok, - elf_info_to_howto, - elf_info_to_howto_rel, - elf_backend_sym_is_global, - elf_backend_object_p, - elf_backend_symbol_processing, - elf_backend_symbol_table_processing, - elf_backend_section_processing, - elf_backend_section_from_shdr, - elf_backend_fake_sections, - elf_backend_section_from_bfd_section, - elf_backend_add_symbol_hook, - elf_backend_link_output_symbol_hook, - elf_backend_create_dynamic_sections, - elf_backend_check_relocs, - elf_backend_adjust_dynamic_symbol, - elf_backend_size_dynamic_sections, - elf_backend_relocate_section, - elf_backend_finish_dynamic_symbol, - elf_backend_finish_dynamic_sections, - elf_backend_begin_write_processing, - elf_backend_final_write_processing, - elf_backend_additional_program_headers, - elf_backend_modify_segment_map, - elf_backend_ecoff_debug_swap, - ELF_MACHINE_ALT1, - ELF_MACHINE_ALT2, - &_bfd_elfNN_size_info, - elf_backend_want_got_plt, - elf_backend_plt_readonly, - elf_backend_want_plt_sym -}; - -#ifdef TARGET_BIG_SYM -const bfd_target TARGET_BIG_SYM = -{ - /* name: identify kind of target */ - TARGET_BIG_NAME, - - /* flavour: general indication about file */ - bfd_target_elf_flavour, - - /* byteorder: data is big endian */ - BFD_ENDIAN_BIG, - - /* header_byteorder: header is also big endian */ - BFD_ENDIAN_BIG, - - /* object_flags: mask of all file flags */ - (HAS_RELOC | EXEC_P | HAS_LINENO | HAS_DEBUG | HAS_SYMS | HAS_LOCALS | - DYNAMIC | WP_TEXT | D_PAGED), - - /* section_flags: mask of all section flags */ - (SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD | SEC_RELOC | SEC_READONLY | - SEC_CODE | SEC_DATA | SEC_DEBUGGING | SEC_EXCLUDE | SEC_SORT_ENTRIES), - - /* leading_symbol_char: is the first char of a user symbol - predictable, and if so what is it */ - elf_symbol_leading_char, - - /* ar_pad_char: pad character for filenames within an archive header - FIXME: this really has nothing to do with ELF, this is a characteristic - of the archiver and/or os and should be independently tunable */ - '/', - - /* ar_max_namelen: maximum number of characters in an archive header - FIXME: this really has nothing to do with ELF, this is a characteristic - of the archiver and should be independently tunable. This value is - a WAG (wild a** guess) */ - 14, - - /* Routines to byte-swap various sized integers from the data sections */ - bfd_getb64, bfd_getb_signed_64, bfd_putb64, - bfd_getb32, bfd_getb_signed_32, bfd_putb32, - bfd_getb16, bfd_getb_signed_16, bfd_putb16, - - /* Routines to byte-swap various sized integers from the file headers */ - bfd_getb64, bfd_getb_signed_64, bfd_putb64, - bfd_getb32, bfd_getb_signed_32, bfd_putb32, - bfd_getb16, bfd_getb_signed_16, bfd_putb16, - - /* bfd_check_format: check the format of a file being read */ - { _bfd_dummy_target, /* unknown format */ - bfd_elfNN_object_p, /* assembler/linker output (object file) */ - bfd_generic_archive_p, /* an archive */ - bfd_elfNN_core_file_p /* a core file */ - }, - - /* bfd_set_format: set the format of a file being written */ - { bfd_false, - bfd_elf_mkobject, - _bfd_generic_mkarchive, - bfd_false - }, - - /* bfd_write_contents: write cached information into a file being written */ - { bfd_false, - bfd_elfNN_write_object_contents, - _bfd_write_archive_contents, - bfd_false - }, - - BFD_JUMP_TABLE_GENERIC (bfd_elfNN), - BFD_JUMP_TABLE_COPY (bfd_elfNN), - BFD_JUMP_TABLE_CORE (bfd_elfNN), - BFD_JUMP_TABLE_ARCHIVE (_bfd_archive_coff), - BFD_JUMP_TABLE_SYMBOLS (bfd_elfNN), - BFD_JUMP_TABLE_RELOCS (bfd_elfNN), - BFD_JUMP_TABLE_WRITE (bfd_elfNN), - BFD_JUMP_TABLE_LINK (bfd_elfNN), - BFD_JUMP_TABLE_DYNAMIC (bfd_elfNN), - - /* backend_data: */ - (PTR) &elfNN_bed, -}; -#endif - -#ifdef TARGET_LITTLE_SYM -const bfd_target TARGET_LITTLE_SYM = -{ - /* name: identify kind of target */ - TARGET_LITTLE_NAME, - - /* flavour: general indication about file */ - bfd_target_elf_flavour, - - /* byteorder: data is little endian */ - BFD_ENDIAN_LITTLE, - - /* header_byteorder: header is also little endian */ - BFD_ENDIAN_LITTLE, - - /* object_flags: mask of all file flags */ - (HAS_RELOC | EXEC_P | HAS_LINENO | HAS_DEBUG | HAS_SYMS | HAS_LOCALS | - DYNAMIC | WP_TEXT | D_PAGED), - - /* section_flags: mask of all section flags */ - (SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD | SEC_RELOC | SEC_READONLY | - SEC_CODE | SEC_DATA | SEC_DEBUGGING | SEC_EXCLUDE | SEC_SORT_ENTRIES), - - /* leading_symbol_char: is the first char of a user symbol - predictable, and if so what is it */ - elf_symbol_leading_char, - - /* ar_pad_char: pad character for filenames within an archive header - FIXME: this really has nothing to do with ELF, this is a characteristic - of the archiver and/or os and should be independently tunable */ - '/', - - /* ar_max_namelen: maximum number of characters in an archive header - FIXME: this really has nothing to do with ELF, this is a characteristic - of the archiver and should be independently tunable. This value is - a WAG (wild a** guess) */ - 14, - - /* Routines to byte-swap various sized integers from the data sections */ - bfd_getl64, bfd_getl_signed_64, bfd_putl64, - bfd_getl32, bfd_getl_signed_32, bfd_putl32, - bfd_getl16, bfd_getl_signed_16, bfd_putl16, - - /* Routines to byte-swap various sized integers from the file headers */ - bfd_getl64, bfd_getl_signed_64, bfd_putl64, - bfd_getl32, bfd_getl_signed_32, bfd_putl32, - bfd_getl16, bfd_getl_signed_16, bfd_putl16, - - /* bfd_check_format: check the format of a file being read */ - { _bfd_dummy_target, /* unknown format */ - bfd_elfNN_object_p, /* assembler/linker output (object file) */ - bfd_generic_archive_p, /* an archive */ - bfd_elfNN_core_file_p /* a core file */ - }, - - /* bfd_set_format: set the format of a file being written */ - { bfd_false, - bfd_elf_mkobject, - _bfd_generic_mkarchive, - bfd_false - }, - - /* bfd_write_contents: write cached information into a file being written */ - { bfd_false, - bfd_elfNN_write_object_contents, - _bfd_write_archive_contents, - bfd_false - }, - - BFD_JUMP_TABLE_GENERIC (bfd_elfNN), - BFD_JUMP_TABLE_COPY (bfd_elfNN), - BFD_JUMP_TABLE_CORE (bfd_elfNN), - BFD_JUMP_TABLE_ARCHIVE (_bfd_archive_coff), - BFD_JUMP_TABLE_SYMBOLS (bfd_elfNN), - BFD_JUMP_TABLE_RELOCS (bfd_elfNN), - BFD_JUMP_TABLE_WRITE (bfd_elfNN), - BFD_JUMP_TABLE_LINK (bfd_elfNN), - BFD_JUMP_TABLE_DYNAMIC (bfd_elfNN), - - /* backend_data: */ - (PTR) &elfNN_bed, -}; -#endif diff --git a/contrib/gdb/bfd/filemode.c b/contrib/gdb/bfd/filemode.c deleted file mode 100644 index fd790b3678671..0000000000000 --- a/contrib/gdb/bfd/filemode.c +++ /dev/null @@ -1,193 +0,0 @@ -/* filemode.c -- make a string describing file modes - Copyright (C) 1985, 1990 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 2 of the License, 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ - -#include <sys/types.h> -#include <sys/stat.h> - -void mode_string (); -static char ftypelet (); -static void rwx (); -static void setst (); - -/* filemodestring - fill in string STR with an ls-style ASCII - representation of the st_mode field of file stats block STATP. - 10 characters are stored in STR; no terminating null is added. - The characters stored in STR are: - - 0 File type. 'd' for directory, 'c' for character - special, 'b' for block special, 'm' for multiplex, - 'l' for symbolic link, 's' for socket, 'p' for fifo, - '-' for any other file type - - 1 'r' if the owner may read, '-' otherwise. - - 2 'w' if the owner may write, '-' otherwise. - - 3 'x' if the owner may execute, 's' if the file is - set-user-id, '-' otherwise. - 'S' if the file is set-user-id, but the execute - bit isn't set. - - 4 'r' if group members may read, '-' otherwise. - - 5 'w' if group members may write, '-' otherwise. - - 6 'x' if group members may execute, 's' if the file is - set-group-id, '-' otherwise. - 'S' if it is set-group-id but not executable. - - 7 'r' if any user may read, '-' otherwise. - - 8 'w' if any user may write, '-' otherwise. - - 9 'x' if any user may execute, 't' if the file is "sticky" - (will be retained in swap space after execution), '-' - otherwise. - 'T' if the file is sticky but not executable. */ - -void -filemodestring (statp, str) - struct stat *statp; - char *str; -{ - mode_string (statp->st_mode, str); -} - -/* Like filemodestring, but only the relevant part of the `struct stat' - is given as an argument. */ - -void -mode_string (mode, str) - unsigned short mode; - char *str; -{ - str[0] = ftypelet (mode); - rwx ((mode & 0700) << 0, &str[1]); - rwx ((mode & 0070) << 3, &str[4]); - rwx ((mode & 0007) << 6, &str[7]); - setst (mode, str); -} - -/* Return a character indicating the type of file described by - file mode BITS: - 'd' for directories - 'b' for block special files - 'c' for character special files - 'm' for multiplexor files - 'l' for symbolic links - 's' for sockets - 'p' for fifos - '-' for any other file type. */ - -static char -ftypelet (bits) - unsigned short bits; -{ - switch (bits & S_IFMT) - { - default: - return '-'; - case S_IFDIR: - return 'd'; -#ifdef S_IFLNK - case S_IFLNK: - return 'l'; -#endif -#ifdef S_IFCHR - case S_IFCHR: - return 'c'; -#endif -#ifdef S_IFBLK - case S_IFBLK: - return 'b'; -#endif -#ifdef S_IFMPC - case S_IFMPC: - case S_IFMPB: - return 'm'; -#endif -#ifdef S_IFSOCK - case S_IFSOCK: - return 's'; -#endif -#ifdef S_IFIFO -#if S_IFIFO != S_IFSOCK - case S_IFIFO: - return 'p'; -#endif -#endif -#ifdef S_IFNWK /* HP-UX */ - case S_IFNWK: - return 'n'; -#endif - } -} - -/* Look at read, write, and execute bits in BITS and set - flags in CHARS accordingly. */ - -static void -rwx (bits, chars) - unsigned short bits; - char *chars; -{ - chars[0] = (bits & S_IREAD) ? 'r' : '-'; - chars[1] = (bits & S_IWRITE) ? 'w' : '-'; - chars[2] = (bits & S_IEXEC) ? 'x' : '-'; -} - -/* Set the 's' and 't' flags in file attributes string CHARS, - according to the file mode BITS. */ - -static void -setst (bits, chars) - unsigned short bits; - char *chars; -{ -#ifdef S_ISUID - if (bits & S_ISUID) - { - if (chars[3] != 'x') - /* Set-uid, but not executable by owner. */ - chars[3] = 'S'; - else - chars[3] = 's'; - } -#endif -#ifdef S_ISGID - if (bits & S_ISGID) - { - if (chars[6] != 'x') - /* Set-gid, but not executable by group. */ - chars[6] = 'S'; - else - chars[6] = 's'; - } -#endif -#ifdef S_ISVTX - if (bits & S_ISVTX) - { - if (chars[9] != 'x') - /* Sticky, but not executable by others. */ - chars[9] = 'T'; - else - chars[9] = 't'; - } -#endif -} - - diff --git a/contrib/gdb/bfd/format.c b/contrib/gdb/bfd/format.c deleted file mode 100644 index 7a303424df65b..0000000000000 --- a/contrib/gdb/bfd/format.c +++ /dev/null @@ -1,319 +0,0 @@ -/* Generic BFD support for file formats. - Copyright (C) 1990, 91, 92, 93, 94 Free Software Foundation, Inc. - Written by Cygnus Support. - -This file is part of BFD, the Binary File Descriptor library. - -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 2 of the License, 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ - -/* -SECTION - File formats - - A format is a BFD concept of high level file contents type. The - formats supported by BFD are: - - o <<bfd_object>> - - The BFD may contain data, symbols, relocations and debug info. - - o <<bfd_archive>> - - The BFD contains other BFDs and an optional index. - - o <<bfd_core>> - - The BFD contains the result of an executable core dump. - - -*/ - -#include "bfd.h" -#include "sysdep.h" -#include "libbfd.h" - -/* IMPORT from targets.c. */ -extern const size_t _bfd_target_vector_entries; - -/* -FUNCTION - bfd_check_format - -SYNOPSIS - boolean bfd_check_format(bfd *abfd, bfd_format format); - -DESCRIPTION - Verify if the file attached to the BFD @var{abfd} is compatible - with the format @var{format} (i.e., one of <<bfd_object>>, - <<bfd_archive>> or <<bfd_core>>). - - If the BFD has been set to a specific target before the - call, only the named target and format combination is - checked. If the target has not been set, or has been set to - <<default>>, then all the known target backends is - interrogated to determine a match. If the default target - matches, it is used. If not, exactly one target must recognize - the file, or an error results. - - The function returns <<true>> on success, otherwise <<false>> - with one of the following error codes: - - o <<bfd_error_invalid_operation>> - - if <<format>> is not one of <<bfd_object>>, <<bfd_archive>> or - <<bfd_core>>. - - o <<bfd_error_system_call>> - - if an error occured during a read - even some file mismatches - can cause bfd_error_system_calls. - - o <<file_not_recognised>> - - none of the backends recognised the file format. - - o <<bfd_error_file_ambiguously_recognized>> - - more than one backend recognised the file format. -*/ - -boolean -bfd_check_format (abfd, format) - bfd *abfd; - bfd_format format; -{ - return bfd_check_format_matches (abfd, format, NULL); -} - -/* -FUNCTION - bfd_check_format_matches - -SYNOPSIS - boolean bfd_check_format_matches(bfd *abfd, bfd_format format, char ***matching); - -DESCRIPTION - Like <<bfd_check_format>>, except when it returns false with - <<bfd_errno>> set to <<bfd_error_file_ambiguously_recognized>>. In that - case, if @var{matching} is not NULL, it will be filled in with - a NULL-terminated list of the names of the formats that matched, - allocated with <<malloc>>. - Then the user may choose a format and try again. - - When done with the list that @var{matching} points to, the caller - should free it. -*/ - -boolean -bfd_check_format_matches (abfd, format, matching) - bfd *abfd; - bfd_format format; - char ***matching; -{ - const bfd_target * const *target, *save_targ, *right_targ; - char **matching_vector = NULL; - int match_count; - - if (!bfd_read_p (abfd) || - ((int)(abfd->format) < (int)bfd_unknown) || - ((int)(abfd->format) >= (int)bfd_type_end)) { - bfd_set_error (bfd_error_invalid_operation); - return false; - } - - if (abfd->format != bfd_unknown) - return (abfd->format == format)? true: false; - - - /* Since the target type was defaulted, check them - all in the hope that one will be uniquely recognized. */ - - save_targ = abfd->xvec; - match_count = 0; - if (matching) - { - matching_vector = - (char **) bfd_malloc (sizeof (char *) * - (_bfd_target_vector_entries + 1)); - if (!matching_vector) - return false; - matching_vector[0] = NULL; - *matching = matching_vector; - } - right_targ = 0; - - - /* presume the answer is yes */ - abfd->format = format; - - /* If the target type was explicitly specified, just check that target. */ - - if (!abfd->target_defaulted) { - if (bfd_seek (abfd, (file_ptr)0, SEEK_SET) != 0) /* rewind! */ - return false; - right_targ = BFD_SEND_FMT (abfd, _bfd_check_format, (abfd)); - if (right_targ) { - abfd->xvec = right_targ; /* Set the target as returned */ - if (matching) - free (matching_vector); - return true; /* File position has moved, BTW */ - } - } - - for (target = bfd_target_vector; *target != NULL; target++) { - extern const bfd_target binary_vec; - const bfd_target *temp; - - if (*target == &binary_vec) - continue; - - abfd->xvec = *target; /* Change BFD's target temporarily */ - if (bfd_seek (abfd, (file_ptr)0, SEEK_SET) != 0) - return false; - /* If _bfd_check_format neglects to set bfd_error, assume bfd_error_wrong_format. - We didn't used to even pay any attention to bfd_error, so I suspect - that some _bfd_check_format might have this problem. */ - bfd_set_error (bfd_error_wrong_format); - temp = BFD_SEND_FMT (abfd, _bfd_check_format, (abfd)); - if (temp) { /* This format checks out as ok! */ - right_targ = temp; - if (matching) - { - matching_vector[match_count] = temp->name; - matching_vector[match_count + 1] = NULL; - } - match_count++; - /* If this is the default target, accept it, even if other targets - might match. People who want those other targets have to set - the GNUTARGET variable. */ - if (temp == bfd_default_vector[0]) - { - if (matching) - { - matching_vector[0] = temp->name; - matching_vector[1] = NULL; - } - match_count = 1; - break; - } -#ifdef GNU960 - /* Big- and little-endian b.out archives look the same, but it doesn't - * matter: there is no difference in their headers, and member file byte - * orders will (I hope) be handled appropriately by bfd. Ditto for big - * and little coff archives. And the 4 coff/b.out object formats are - * unambiguous. So accept the first match we find. - */ - break; -#endif - } else if (bfd_get_error () != bfd_error_wrong_format) { - abfd->xvec = save_targ; - abfd->format = bfd_unknown; - if (matching && bfd_get_error () != bfd_error_file_ambiguously_recognized) - free (matching_vector); - return false; - } - } - - if (match_count == 1) { - abfd->xvec = right_targ; /* Change BFD's target permanently */ - if (matching) - free (matching_vector); - return true; /* File position has moved, BTW */ - } - - abfd->xvec = save_targ; /* Restore original target type */ - abfd->format = bfd_unknown; /* Restore original format */ - if (match_count == 0) - { - bfd_set_error (bfd_error_file_not_recognized); - if (matching) - free (matching_vector); - } - else - bfd_set_error (bfd_error_file_ambiguously_recognized); - return false; -} - -/* -FUNCTION - bfd_set_format - -SYNOPSIS - boolean bfd_set_format(bfd *abfd, bfd_format format); - -DESCRIPTION - This function sets the file format of the BFD @var{abfd} to the - format @var{format}. If the target set in the BFD does not - support the format requested, the format is invalid, or the BFD - is not open for writing, then an error occurs. - -*/ - -boolean -bfd_set_format (abfd, format) - bfd *abfd; - bfd_format format; -{ - - if (bfd_read_p (abfd) || - ((int)abfd->format < (int)bfd_unknown) || - ((int)abfd->format >= (int)bfd_type_end)) { - bfd_set_error (bfd_error_invalid_operation); - return false; - } - - if (abfd->format != bfd_unknown) - return (abfd->format == format) ? true:false; - - /* presume the answer is yes */ - abfd->format = format; - - if (!BFD_SEND_FMT (abfd, _bfd_set_format, (abfd))) { - abfd->format = bfd_unknown; - return false; - } - - return true; -} - - -/* -FUNCTION - bfd_format_string - -SYNOPSIS - CONST char *bfd_format_string(bfd_format format); - -DESCRIPTION - Return a pointer to a const string - <<invalid>>, <<object>>, <<archive>>, <<core>>, or <<unknown>>, - depending upon the value of @var{format}. -*/ - -CONST char * -bfd_format_string (format) - bfd_format format; -{ - if (((int)format <(int) bfd_unknown) - || ((int)format >=(int) bfd_type_end)) - return "invalid"; - - switch (format) { - case bfd_object: - return "object"; /* linker/assember/compiler output */ - case bfd_archive: - return "archive"; /* object archive file */ - case bfd_core: - return "core"; /* core dump */ - default: - return "unknown"; - } -} diff --git a/contrib/gdb/bfd/freebsd.h b/contrib/gdb/bfd/freebsd.h deleted file mode 100644 index 7e1d69d0df747..0000000000000 --- a/contrib/gdb/bfd/freebsd.h +++ /dev/null @@ -1,109 +0,0 @@ -/* BFD back-end definitions used by all FreeBSD targets. - Copyright (C) 1990, 1991, 1992, 1996 Free Software Foundation, Inc. - -This file is part of BFD, the Binary File Descriptor library. - -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 2 of the License, 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -*/ - -/* FreeBSD ZMAGIC files never have the header in the text. */ -#define N_HEADER_IN_TEXT(x) 0 - -/* ZMAGIC files start at offset 0. Does not apply to QMAGIC files. */ -#define TEXT_START_ADDR 0 - -#define N_GETMAGIC_NET(exec) \ - (ntohl ((exec).a_info) & 0xffff) -#define N_GETMID_NET(exec) \ - ((ntohl ((exec).a_info) >> 16) & 0x3ff) -#define N_GETFLAG_NET(ex) \ - ((ntohl ((exec).a_info) >> 26) & 0x3f) - -#define N_MACHTYPE(exec) \ - ((enum machine_type) \ - ((N_GETMAGIC_NET (exec) == ZMAGIC) ? N_GETMID_NET (exec) : \ - ((exec).a_info >> 16) & 0x3ff)) -#define N_FLAGS(exec) \ - ((N_GETMAGIC_NET (exec) == ZMAGIC) ? N_GETFLAG_NET (exec) : \ - ((exec).a_info >> 26) & 0x3f) - -#define N_SET_INFO(exec, magic, type, flags) \ - ((exec).a_info = ((magic) & 0xffff) \ - | (((int)(type) & 0x3ff) << 16) \ - | (((flags) & 0x3f) << 26)) -#define N_SET_MACHTYPE(exec, machtype) \ - ((exec).a_info = \ - ((exec).a_info & 0xfb00ffff) | ((((int)(machtype))&0x3ff) << 16)) -#define N_SET_FLAGS(exec, flags) \ - ((exec).a_info = \ - ((exec).a_info & 0x03ffffff) | ((flags & 0x03f) << 26)) - -#include "bfd.h" -#include "sysdep.h" -#include "libbfd.h" -#include "libaout.h" - -/* On FreeBSD, the magic number is always in correct endian format */ -#define NO_SWAP_MAGIC - - -#define MY_write_object_contents MY(write_object_contents) -static boolean MY(write_object_contents) PARAMS ((bfd *abfd)); - -#include "aout-target.h" - -/* Write an object file. - Section contents have already been written. We write the - file header, symbols, and relocation. */ - -static boolean -MY(write_object_contents) (abfd) - bfd *abfd; -{ - struct external_exec exec_bytes; - struct internal_exec *execp = exec_hdr (abfd); - -#if CHOOSE_RELOC_SIZE - CHOOSE_RELOC_SIZE(abfd); -#else - obj_reloc_entry_size (abfd) = RELOC_STD_SIZE; -#endif - - /* Magic number, maestro, please! */ - switch (bfd_get_arch(abfd)) { - case bfd_arch_m68k: - if (strcmp (abfd->xvec->name, "a.out-m68k4k-netbsd") == 0) - N_SET_MACHTYPE(*execp, M_68K4K_NETBSD); - else - N_SET_MACHTYPE(*execp, M_68K_NETBSD); - break; - case bfd_arch_sparc: - N_SET_MACHTYPE(*execp, M_SPARC_NETBSD); - break; - case bfd_arch_i386: - N_SET_MACHTYPE(*execp, M_386_NETBSD); - break; - case bfd_arch_ns32k: - N_SET_MACHTYPE(*execp, M_532_NETBSD); - break; - default: - N_SET_MACHTYPE(*execp, M_UNKNOWN); - break; - } - - WRITE_HEADERS(abfd, execp); - - return true; -} diff --git a/contrib/gdb/bfd/gen-aout.c b/contrib/gdb/bfd/gen-aout.c deleted file mode 100644 index d2224f762d350..0000000000000 --- a/contrib/gdb/bfd/gen-aout.c +++ /dev/null @@ -1,101 +0,0 @@ -/* Generate parameters for an a.out system. - Copyright (C) 1990, 91, 92, 93, 94 Free Software Foundation, Inc. - -This file is part of BFD, the Binary File Descriptor library. - -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 2 of the License, 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ - -#include "/usr/include/a.out.h" -#include <stdio.h> - -int -main (argc, argv) - int argc; char** argv; -{ - struct exec my_exec; - int page_size; - char *target = "unknown", *arch = "unknown"; - FILE *file = fopen("gen-aout", "r"); - - if (file == NULL) { - fprintf(stderr, "Cannot open gen-aout!\n"); - return -1; - } - if (fread(&my_exec, sizeof(struct exec), 1, file) != 1) { - fprintf(stderr, "Cannot read gen-aout!\n"); - return -1; - } - - target = argv[1]; - if (target == NULL) { - fprintf(stderr, "Usage: gen-aout target_name\n"); - exit (1); - } - -#ifdef N_TXTOFF - page_size = N_TXTOFF(my_exec); - if (page_size == 0) - printf("#define N_HEADER_IN_TEXT(x) 1\n"); - else - printf("#define N_HEADER_IN_TEXT(x) 0\n"); -#endif - - printf("#define BYTES_IN_WORD %d\n", sizeof (int)); - if (my_exec.a_entry == 0) { - printf("#define ENTRY_CAN_BE_ZERO\n"); - printf("#define N_SHARED_LIB(x) 0 /* Avoids warning */\n"); - } - else { - printf("/*#define ENTRY_CAN_BE_ZERO*/\n"); - printf("/*#define N_SHARED_LIB(x) 0*/\n"); - } - - printf("#define TEXT_START_ADDR %d\n", my_exec.a_entry); - -#ifdef PAGSIZ - if (page_size == 0) - page_size = PAGSIZ; -#endif - if (page_size != 0) - printf("#define TARGET_PAGE_SIZE %d\n", page_size); - else - printf("/* #define TARGET_PAGE_SIZE ??? */\n"); - printf("#define SEGMENT_SIZE TARGET_PAGE_SIZE\n"); - -#ifdef vax - arch = "vax"; -#endif -#ifdef m68k - arch = "m68k"; -#endif - if (arch[0] == '1') - { - fprintf (stderr, "warning: preprocessor substituted architecture name inside string;"); - fprintf (stderr, " fix DEFAULT_ARCH in the output file yourself\n"); - arch = "unknown"; - } - printf("#define DEFAULT_ARCH bfd_arch_%s\n", arch); - - printf("\n#define MY(OP) CAT(%s_,OP)\n", target); - printf("#define TARGETNAME \"a.out-%s\"\n\n", target); - - printf("#include \"bfd.h\"\n"); - printf("#include \"sysdep.h\"\n"); - printf("#include \"libbfd.h\"\n"); - printf("#include \"libaout.h\"\n"); - printf("\n#include \"aout-target.h\"\n"); - - return 0; -} diff --git a/contrib/gdb/bfd/genlink.h b/contrib/gdb/bfd/genlink.h deleted file mode 100644 index 5f08094857475..0000000000000 --- a/contrib/gdb/bfd/genlink.h +++ /dev/null @@ -1,106 +0,0 @@ -/* genlink.h -- interface to the BFD generic linker - Copyright 1993, 1994 Free Software Foundation, Inc. - Written by Ian Lance Taylor, Cygnus Support. - -This file is part of BFD, the Binary File Descriptor library. - -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 2 of the License, 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ - -#ifndef GENLINK_H -#define GENLINK_H - -/* This header file is internal to BFD. It describes the internal - structures and functions used by the BFD generic linker, in case - any of the more specific linkers want to use or call them. Note - that some functions, such as _bfd_generic_link_hash_table_create, - are declared in libbfd.h, because they are expected to be widely - used. The functions and structures in this file will probably only - be used by a few files besides linker.c itself. In fact, this file - is not particularly complete; I have only put in the interfaces I - actually needed. */ - -/* The generic linker uses a hash table which is a derived class of - the standard linker hash table, just as the other backend specific - linkers do. Do not confuse the generic linker hash table with the - standard BFD linker hash table it is built upon. */ - -/* Generic linker hash table entries. */ - -struct generic_link_hash_entry -{ - struct bfd_link_hash_entry root; - /* Whether this symbol has been written out. */ - boolean written; - /* Symbol from input BFD. */ - asymbol *sym; -}; - -/* Generic linker hash table. */ - -struct generic_link_hash_table -{ - struct bfd_link_hash_table root; -}; - -/* Look up an entry in an generic link hash table. */ - -#define _bfd_generic_link_hash_lookup(table, string, create, copy, follow) \ - ((struct generic_link_hash_entry *) \ - bfd_link_hash_lookup (&(table)->root, (string), (create), (copy), (follow))) - -/* Traverse an generic link hash table. */ - -#define _bfd_generic_link_hash_traverse(table, func, info) \ - (bfd_link_hash_traverse \ - (&(table)->root, \ - (boolean (*) PARAMS ((struct bfd_link_hash_entry *, PTR))) (func), \ - (info))) - -/* Get the generic link hash table from the info structure. This is - just a cast. */ - -#define _bfd_generic_hash_table(p) \ - ((struct generic_link_hash_table *) ((p)->hash)) - -/* The generic linker reads in the asymbol structures for an input BFD - and keeps them in the outsymbol and symcount fields. */ - -#define _bfd_generic_link_get_symbols(abfd) ((abfd)->outsymbols) -#define _bfd_generic_link_get_symcount(abfd) ((abfd)->symcount) - -/* Add the symbols of input_bfd to the symbols being built for - output_bfd. */ -extern boolean _bfd_generic_link_output_symbols - PARAMS ((bfd *output_bfd, bfd *input_bfd, struct bfd_link_info *, - size_t *psymalloc)); - -/* This structure is used to pass information to - _bfd_generic_link_write_global_symbol, which may be called via - _bfd_generic_link_hash_traverse. */ - -struct generic_write_global_symbol_info -{ - struct bfd_link_info *info; - bfd *output_bfd; - size_t *psymalloc; -}; - -/* Write out a single global symbol. This is expected to be called - via _bfd_generic_link_hash_traverse. The second argument must - actually be a struct generic_write_global_symbol_info *. */ -extern boolean _bfd_generic_link_write_global_symbol - PARAMS ((struct generic_link_hash_entry *, PTR)); - -#endif diff --git a/contrib/gdb/bfd/hash.c b/contrib/gdb/bfd/hash.c deleted file mode 100644 index 35913fcfccc94..0000000000000 --- a/contrib/gdb/bfd/hash.c +++ /dev/null @@ -1,734 +0,0 @@ -/* hash.c -- hash table routines for BFD - Copyright (C) 1993, 94 Free Software Foundation, Inc. - Written by Steve Chamberlain <sac@cygnus.com> - -This file is part of BFD, the Binary File Descriptor library. - -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 2 of the License, 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ - -#include "bfd.h" -#include "sysdep.h" -#include "libbfd.h" -#include "obstack.h" - -/* -SECTION - Hash Tables - -@cindex Hash tables - BFD provides a simple set of hash table functions. Routines - are provided to initialize a hash table, to free a hash table, - to look up a string in a hash table and optionally create an - entry for it, and to traverse a hash table. There is - currently no routine to delete an string from a hash table. - - The basic hash table does not permit any data to be stored - with a string. However, a hash table is designed to present a - base class from which other types of hash tables may be - derived. These derived types may store additional information - with the string. Hash tables were implemented in this way, - rather than simply providing a data pointer in a hash table - entry, because they were designed for use by the linker back - ends. The linker may create thousands of hash table entries, - and the overhead of allocating private data and storing and - following pointers becomes noticeable. - - The basic hash table code is in <<hash.c>>. - -@menu -@* Creating and Freeing a Hash Table:: -@* Looking Up or Entering a String:: -@* Traversing a Hash Table:: -@* Deriving a New Hash Table Type:: -@end menu - -INODE -Creating and Freeing a Hash Table, Looking Up or Entering a String, Hash Tables, Hash Tables -SUBSECTION - Creating and freeing a hash table - -@findex bfd_hash_table_init -@findex bfd_hash_table_init_n - To create a hash table, create an instance of a <<struct - bfd_hash_table>> (defined in <<bfd.h>>) and call - <<bfd_hash_table_init>> (if you know approximately how many - entries you will need, the function <<bfd_hash_table_init_n>>, - which takes a @var{size} argument, may be used). - <<bfd_hash_table_init>> returns <<false>> if some sort of - error occurs. - -@findex bfd_hash_newfunc - The function <<bfd_hash_table_init>> take as an argument a - function to use to create new entries. For a basic hash - table, use the function <<bfd_hash_newfunc>>. @xref{Deriving - a New Hash Table Type} for why you would want to use a - different value for this argument. - -@findex bfd_hash_allocate - <<bfd_hash_table_init>> will create an obstack which will be - used to allocate new entries. You may allocate memory on this - obstack using <<bfd_hash_allocate>>. - -@findex bfd_hash_table_free - Use <<bfd_hash_table_free>> to free up all the memory that has - been allocated for a hash table. This will not free up the - <<struct bfd_hash_table>> itself, which you must provide. - -INODE -Looking Up or Entering a String, Traversing a Hash Table, Creating and Freeing a Hash Table, Hash Tables -SUBSECTION - Looking up or entering a string - -@findex bfd_hash_lookup - The function <<bfd_hash_lookup>> is used both to look up a - string in the hash table and to create a new entry. - - If the @var{create} argument is <<false>>, <<bfd_hash_lookup>> - will look up a string. If the string is found, it will - returns a pointer to a <<struct bfd_hash_entry>>. If the - string is not found in the table <<bfd_hash_lookup>> will - return <<NULL>>. You should not modify any of the fields in - the returns <<struct bfd_hash_entry>>. - - If the @var{create} argument is <<true>>, the string will be - entered into the hash table if it is not already there. - Either way a pointer to a <<struct bfd_hash_entry>> will be - returned, either to the existing structure or to a newly - created one. In this case, a <<NULL>> return means that an - error occurred. - - If the @var{create} argument is <<true>>, and a new entry is - created, the @var{copy} argument is used to decide whether to - copy the string onto the hash table obstack or not. If - @var{copy} is passed as <<false>>, you must be careful not to - deallocate or modify the string as long as the hash table - exists. - -INODE -Traversing a Hash Table, Deriving a New Hash Table Type, Looking Up or Entering a String, Hash Tables -SUBSECTION - Traversing a hash table - -@findex bfd_hash_traverse - The function <<bfd_hash_traverse>> may be used to traverse a - hash table, calling a function on each element. The traversal - is done in a random order. - - <<bfd_hash_traverse>> takes as arguments a function and a - generic <<void *>> pointer. The function is called with a - hash table entry (a <<struct bfd_hash_entry *>>) and the - generic pointer passed to <<bfd_hash_traverse>>. The function - must return a <<boolean>> value, which indicates whether to - continue traversing the hash table. If the function returns - <<false>>, <<bfd_hash_traverse>> will stop the traversal and - return immediately. - -INODE -Deriving a New Hash Table Type, , Traversing a Hash Table, Hash Tables -SUBSECTION - Deriving a new hash table type - - Many uses of hash tables want to store additional information - which each entry in the hash table. Some also find it - convenient to store additional information with the hash table - itself. This may be done using a derived hash table. - - Since C is not an object oriented language, creating a derived - hash table requires sticking together some boilerplate - routines with a few differences specific to the type of hash - table you want to create. - - An example of a derived hash table is the linker hash table. - The structures for this are defined in <<bfdlink.h>>. The - functions are in <<linker.c>>. - - You may also derive a hash table from an already derived hash - table. For example, the a.out linker backend code uses a hash - table derived from the linker hash table. - -@menu -@* Define the Derived Structures:: -@* Write the Derived Creation Routine:: -@* Write Other Derived Routines:: -@end menu - -INODE -Define the Derived Structures, Write the Derived Creation Routine, Deriving a New Hash Table Type, Deriving a New Hash Table Type -SUBSUBSECTION - Define the derived structures - - You must define a structure for an entry in the hash table, - and a structure for the hash table itself. - - The first field in the structure for an entry in the hash - table must be of the type used for an entry in the hash table - you are deriving from. If you are deriving from a basic hash - table this is <<struct bfd_hash_entry>>, which is defined in - <<bfd.h>>. The first field in the structure for the hash - table itself must be of the type of the hash table you are - deriving from itself. If you are deriving from a basic hash - table, this is <<struct bfd_hash_table>>. - - For example, the linker hash table defines <<struct - bfd_link_hash_entry>> (in <<bfdlink.h>>). The first field, - <<root>>, is of type <<struct bfd_hash_entry>>. Similarly, - the first field in <<struct bfd_link_hash_table>>, <<table>>, - is of type <<struct bfd_hash_table>>. - -INODE -Write the Derived Creation Routine, Write Other Derived Routines, Define the Derived Structures, Deriving a New Hash Table Type -SUBSUBSECTION - Write the derived creation routine - - You must write a routine which will create and initialize an - entry in the hash table. This routine is passed as the - function argument to <<bfd_hash_table_init>>. - - In order to permit other hash tables to be derived from the - hash table you are creating, this routine must be written in a - standard way. - - The first argument to the creation routine is a pointer to a - hash table entry. This may be <<NULL>>, in which case the - routine should allocate the right amount of space. Otherwise - the space has already been allocated by a hash table type - derived from this one. - - After allocating space, the creation routine must call the - creation routine of the hash table type it is derived from, - passing in a pointer to the space it just allocated. This - will initialize any fields used by the base hash table. - - Finally the creation routine must initialize any local fields - for the new hash table type. - - Here is a boilerplate example of a creation routine. - @var{function_name} is the name of the routine. - @var{entry_type} is the type of an entry in the hash table you - are creating. @var{base_newfunc} is the name of the creation - routine of the hash table type your hash table is derived - from. - -EXAMPLE - -.struct bfd_hash_entry * -.@var{function_name} (entry, table, string) -. struct bfd_hash_entry *entry; -. struct bfd_hash_table *table; -. const char *string; -.{ -. struct @var{entry_type} *ret = (@var{entry_type} *) entry; -. -. {* Allocate the structure if it has not already been allocated by a -. derived class. *} -. if (ret == (@var{entry_type} *) NULL) -. { -. ret = ((@var{entry_type} *) -. bfd_hash_allocate (table, sizeof (@var{entry_type}))); -. if (ret == (@var{entry_type} *) NULL) -. return NULL; -. } -. -. {* Call the allocation method of the base class. *} -. ret = ((@var{entry_type} *) -. @var{base_newfunc} ((struct bfd_hash_entry *) ret, table, string)); -. -. {* Initialize the local fields here. *} -. -. return (struct bfd_hash_entry *) ret; -.} - -DESCRIPTION - The creation routine for the linker hash table, which is in - <<linker.c>>, looks just like this example. - @var{function_name} is <<_bfd_link_hash_newfunc>>. - @var{entry_type} is <<struct bfd_link_hash_entry>>. - @var{base_newfunc} is <<bfd_hash_newfunc>>, the creation - routine for a basic hash table. - - <<_bfd_link_hash_newfunc>> also initializes the local fields - in a linker hash table entry: <<type>>, <<written>> and - <<next>>. - -INODE -Write Other Derived Routines, , Write the Derived Creation Routine, Deriving a New Hash Table Type -SUBSUBSECTION - Write other derived routines - - You will want to write other routines for your new hash table, - as well. - - You will want an initialization routine which calls the - initialization routine of the hash table you are deriving from - and initializes any other local fields. For the linker hash - table, this is <<_bfd_link_hash_table_init>> in <<linker.c>>. - - You will want a lookup routine which calls the lookup routine - of the hash table you are deriving from and casts the result. - The linker hash table uses <<bfd_link_hash_lookup>> in - <<linker.c>> (this actually takes an additional argument which - it uses to decide how to return the looked up value). - - You may want a traversal routine. This should just call the - traversal routine of the hash table you are deriving from with - appropriate casts. The linker hash table uses - <<bfd_link_hash_traverse>> in <<linker.c>>. - - These routines may simply be defined as macros. For example, - the a.out backend linker hash table, which is derived from the - linker hash table, uses macros for the lookup and traversal - routines. These are <<aout_link_hash_lookup>> and - <<aout_link_hash_traverse>> in aoutx.h. -*/ - -/* Obstack allocation and deallocation routines. */ -#define obstack_chunk_alloc malloc -#define obstack_chunk_free free - -/* The default number of entries to use when creating a hash table. */ -#define DEFAULT_SIZE (4051) - -/* Create a new hash table, given a number of entries. */ - -boolean -bfd_hash_table_init_n (table, newfunc, size) - struct bfd_hash_table *table; - struct bfd_hash_entry *(*newfunc) PARAMS ((struct bfd_hash_entry *, - struct bfd_hash_table *, - const char *)); - unsigned int size; -{ - unsigned int alloc; - - alloc = size * sizeof (struct bfd_hash_entry *); - if (!obstack_begin (&table->memory, alloc)) - { - bfd_set_error (bfd_error_no_memory); - return false; - } - table->table = ((struct bfd_hash_entry **) - obstack_alloc (&table->memory, alloc)); - if (!table->table) - { - bfd_set_error (bfd_error_no_memory); - return false; - } - memset ((PTR) table->table, 0, alloc); - table->size = size; - table->newfunc = newfunc; - return true; -} - -/* Create a new hash table with the default number of entries. */ - -boolean -bfd_hash_table_init (table, newfunc) - struct bfd_hash_table *table; - struct bfd_hash_entry *(*newfunc) PARAMS ((struct bfd_hash_entry *, - struct bfd_hash_table *, - const char *)); -{ - return bfd_hash_table_init_n (table, newfunc, DEFAULT_SIZE); -} - -/* Free a hash table. */ - -void -bfd_hash_table_free (table) - struct bfd_hash_table *table; -{ - obstack_free (&table->memory, (PTR) NULL); -} - -/* Look up a string in a hash table. */ - -struct bfd_hash_entry * -bfd_hash_lookup (table, string, create, copy) - struct bfd_hash_table *table; - const char *string; - boolean create; - boolean copy; -{ - register const unsigned char *s; - register unsigned long hash; - register unsigned int c; - struct bfd_hash_entry *hashp; - unsigned int len; - unsigned int index; - - hash = 0; - len = 0; - s = (const unsigned char *) string; - while ((c = *s++) != '\0') - { - hash += c + (c << 17); - hash ^= hash >> 2; - ++len; - } - hash += len + (len << 17); - hash ^= hash >> 2; - - index = hash % table->size; - for (hashp = table->table[index]; - hashp != (struct bfd_hash_entry *) NULL; - hashp = hashp->next) - { - if (hashp->hash == hash - && strcmp (hashp->string, string) == 0) - return hashp; - } - - if (! create) - return (struct bfd_hash_entry *) NULL; - - hashp = (*table->newfunc) ((struct bfd_hash_entry *) NULL, table, string); - if (hashp == (struct bfd_hash_entry *) NULL) - return (struct bfd_hash_entry *) NULL; - if (copy) - { - char *new; - - new = (char *) obstack_alloc (&table->memory, len + 1); - if (!new) - { - bfd_set_error (bfd_error_no_memory); - return (struct bfd_hash_entry *) NULL; - } - strcpy (new, string); - string = new; - } - hashp->string = string; - hashp->hash = hash; - hashp->next = table->table[index]; - table->table[index] = hashp; - - return hashp; -} - -/* Replace an entry in a hash table. */ - -void -bfd_hash_replace (table, old, nw) - struct bfd_hash_table *table; - struct bfd_hash_entry *old; - struct bfd_hash_entry *nw; -{ - unsigned int index; - struct bfd_hash_entry **pph; - - index = old->hash % table->size; - for (pph = &table->table[index]; - (*pph) != (struct bfd_hash_entry *) NULL; - pph = &(*pph)->next) - { - if (*pph == old) - { - *pph = nw; - return; - } - } - - abort (); -} - -/* Base method for creating a new hash table entry. */ - -/*ARGSUSED*/ -struct bfd_hash_entry * -bfd_hash_newfunc (entry, table, string) - struct bfd_hash_entry *entry; - struct bfd_hash_table *table; - const char *string; -{ - if (entry == (struct bfd_hash_entry *) NULL) - entry = ((struct bfd_hash_entry *) - bfd_hash_allocate (table, sizeof (struct bfd_hash_entry))); - return entry; -} - -/* Allocate space in a hash table. */ - -PTR -bfd_hash_allocate (table, size) - struct bfd_hash_table *table; - unsigned int size; -{ - PTR ret; - - ret = obstack_alloc (&table->memory, size); - if (ret == NULL && size != 0) - bfd_set_error (bfd_error_no_memory); - return ret; -} - -/* Traverse a hash table. */ - -void -bfd_hash_traverse (table, func, info) - struct bfd_hash_table *table; - boolean (*func) PARAMS ((struct bfd_hash_entry *, PTR)); - PTR info; -{ - unsigned int i; - - for (i = 0; i < table->size; i++) - { - struct bfd_hash_entry *p; - - for (p = table->table[i]; p != NULL; p = p->next) - { - if (! (*func) (p, info)) - return; - } - } -} - -/* A few different object file formats (a.out, COFF, ELF) use a string - table. These functions support adding strings to a string table, - returning the byte offset, and writing out the table. - - Possible improvements: - + look for strings matching trailing substrings of other strings - + better data structures? balanced trees? - + look at reducing memory use elsewhere -- maybe if we didn't have - to construct the entire symbol table at once, we could get by - with smaller amounts of VM? (What effect does that have on the - string table reductions?) */ - -/* An entry in the strtab hash table. */ - -struct strtab_hash_entry -{ - struct bfd_hash_entry root; - /* Index in string table. */ - bfd_size_type index; - /* Next string in strtab. */ - struct strtab_hash_entry *next; -}; - -/* The strtab hash table. */ - -struct bfd_strtab_hash -{ - struct bfd_hash_table table; - /* Size of strtab--also next available index. */ - bfd_size_type size; - /* First string in strtab. */ - struct strtab_hash_entry *first; - /* Last string in strtab. */ - struct strtab_hash_entry *last; - /* Whether to precede strings with a two byte length, as in the - XCOFF .debug section. */ - boolean xcoff; -}; - -static struct bfd_hash_entry *strtab_hash_newfunc - PARAMS ((struct bfd_hash_entry *, struct bfd_hash_table *, const char *)); - -/* Routine to create an entry in a strtab. */ - -static struct bfd_hash_entry * -strtab_hash_newfunc (entry, table, string) - struct bfd_hash_entry *entry; - struct bfd_hash_table *table; - const char *string; -{ - struct strtab_hash_entry *ret = (struct strtab_hash_entry *) entry; - - /* Allocate the structure if it has not already been allocated by a - subclass. */ - if (ret == (struct strtab_hash_entry *) NULL) - ret = ((struct strtab_hash_entry *) - bfd_hash_allocate (table, sizeof (struct strtab_hash_entry))); - if (ret == (struct strtab_hash_entry *) NULL) - return NULL; - - /* Call the allocation method of the superclass. */ - ret = ((struct strtab_hash_entry *) - bfd_hash_newfunc ((struct bfd_hash_entry *) ret, table, string)); - - if (ret) - { - /* Initialize the local fields. */ - ret->index = (bfd_size_type) -1; - ret->next = NULL; - } - - return (struct bfd_hash_entry *) ret; -} - -/* Look up an entry in an strtab. */ - -#define strtab_hash_lookup(t, string, create, copy) \ - ((struct strtab_hash_entry *) \ - bfd_hash_lookup (&(t)->table, (string), (create), (copy))) - -/* Create a new strtab. */ - -struct bfd_strtab_hash * -_bfd_stringtab_init () -{ - struct bfd_strtab_hash *table; - - table = ((struct bfd_strtab_hash *) - bfd_malloc (sizeof (struct bfd_strtab_hash))); - if (table == NULL) - return NULL; - - if (! bfd_hash_table_init (&table->table, strtab_hash_newfunc)) - { - free (table); - return NULL; - } - - table->size = 0; - table->first = NULL; - table->last = NULL; - table->xcoff = false; - - return table; -} - -/* Create a new strtab in which the strings are output in the format - used in the XCOFF .debug section: a two byte length precedes each - string. */ - -struct bfd_strtab_hash * -_bfd_xcoff_stringtab_init () -{ - struct bfd_strtab_hash *ret; - - ret = _bfd_stringtab_init (); - if (ret != NULL) - ret->xcoff = true; - return ret; -} - -/* Free a strtab. */ - -void -_bfd_stringtab_free (table) - struct bfd_strtab_hash *table; -{ - bfd_hash_table_free (&table->table); - free (table); -} - -/* Get the index of a string in a strtab, adding it if it is not - already present. If HASH is false, we don't really use the hash - table, and we don't eliminate duplicate strings. */ - -bfd_size_type -_bfd_stringtab_add (tab, str, hash, copy) - struct bfd_strtab_hash *tab; - const char *str; - boolean hash; - boolean copy; -{ - register struct strtab_hash_entry *entry; - - if (hash) - { - entry = strtab_hash_lookup (tab, str, true, copy); - if (entry == NULL) - return (bfd_size_type) -1; - } - else - { - entry = ((struct strtab_hash_entry *) - bfd_hash_allocate (&tab->table, - sizeof (struct strtab_hash_entry))); - if (entry == NULL) - return (bfd_size_type) -1; - if (! copy) - entry->root.string = str; - else - { - char *n; - - n = (char *) bfd_hash_allocate (&tab->table, strlen (str) + 1); - if (n == NULL) - return (bfd_size_type) -1; - entry->root.string = n; - } - entry->index = (bfd_size_type) -1; - entry->next = NULL; - } - - if (entry->index == (bfd_size_type) -1) - { - entry->index = tab->size; - tab->size += strlen (str) + 1; - if (tab->xcoff) - { - entry->index += 2; - tab->size += 2; - } - if (tab->first == NULL) - tab->first = entry; - else - tab->last->next = entry; - tab->last = entry; - } - - return entry->index; -} - -/* Get the number of bytes in a strtab. */ - -bfd_size_type -_bfd_stringtab_size (tab) - struct bfd_strtab_hash *tab; -{ - return tab->size; -} - -/* Write out a strtab. ABFD must already be at the right location in - the file. */ - -boolean -_bfd_stringtab_emit (abfd, tab) - register bfd *abfd; - struct bfd_strtab_hash *tab; -{ - register boolean xcoff; - register struct strtab_hash_entry *entry; - - xcoff = tab->xcoff; - - for (entry = tab->first; entry != NULL; entry = entry->next) - { - register const char *str; - register size_t len; - - str = entry->root.string; - len = strlen (str) + 1; - - if (xcoff) - { - bfd_byte buf[2]; - - /* The output length includes the null byte. */ - bfd_put_16 (abfd, len, buf); - if (bfd_write ((PTR) buf, 1, 2, abfd) != 2) - return false; - } - - if (bfd_write ((PTR) str, 1, len, abfd) != len) - return false; - } - - return true; -} diff --git a/contrib/gdb/bfd/host-aout.c b/contrib/gdb/bfd/host-aout.c deleted file mode 100644 index 99643dcc24ef2..0000000000000 --- a/contrib/gdb/bfd/host-aout.c +++ /dev/null @@ -1,83 +0,0 @@ -/* BFD backend for local host's a.out binaries - Copyright (C) 1990, 91, 92, 93, 94 Free Software Foundation, Inc. - Written by Cygnus Support. Probably John Gilmore's fault. - -This file is part of BFD, the Binary File Descriptor library. - -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 2 of the License, 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ - -#include "bfd.h" -#include "sysdep.h" -#include "libbfd.h" - -#define ARCH_SIZE 32 - -/* When porting to a new system, you must supply: - - HOST_PAGE_SIZE (optional) - HOST_SEGMENT_SIZE (optional -- defaults to page size) - HOST_MACHINE_ARCH (optional) - HOST_MACHINE_MACHINE (optional) - HOST_TEXT_START_ADDR (optional) - HOST_STACK_END_ADDR (not used, except by trad-core ???) - HOST_BIG_ENDIAN_P (required -- define if big-endian) - - in the ./hosts/h-systemname.h file. */ - -#ifdef TRAD_HEADER -#include TRAD_HEADER -#endif - -#ifdef HOST_PAGE_SIZE -#define TARGET_PAGE_SIZE HOST_PAGE_SIZE -#endif - -#ifdef HOST_SEGMENT_SIZE -#define SEGMENT_SIZE HOST_SEGMENT_SIZE -#else -#define SEGMENT_SIZE TARGET_PAGE_SIZE -#endif - -#ifdef HOST_TEXT_START_ADDR -#define TEXT_START_ADDR HOST_TEXT_START_ADDR -#endif - -#ifdef HOST_STACK_END_ADDR -#define STACK_END_ADDR HOST_STACK_END_ADDR -#endif - -#ifdef HOST_BIG_ENDIAN_P -#define TARGET_IS_BIG_ENDIAN_P -#else -#undef TARGET_IS_BIG_ENDIAN_P -#endif - -#include "libaout.h" /* BFD a.out internal data structures */ -#include "aout/aout64.h" - -#ifdef HOST_MACHINE_ARCH -#ifdef HOST_MACHINE_MACHINE -#define SET_ARCH_MACH(abfd, execp) \ - bfd_default_set_arch_mach(abfd, HOST_MACHINE_ARCH, HOST_MACHINE_MACHINE) -#else -#define SET_ARCH_MACH(abfd, execp) \ - bfd_default_set_arch_mach(abfd, HOST_MACHINE_ARCH, 0) -#endif -#endif /* HOST_MACHINE_ARCH */ - -#define MY(OP) CAT(host_aout_,OP) -#define TARGETNAME "a.out" - -#include "aout-target.h" diff --git a/contrib/gdb/bfd/hosts/alphalinux.h b/contrib/gdb/bfd/hosts/alphalinux.h deleted file mode 100644 index d9ba1b7ec6bed..0000000000000 --- a/contrib/gdb/bfd/hosts/alphalinux.h +++ /dev/null @@ -1,6 +0,0 @@ -/* Linux dumps "struct task_struct" at the end of the core-file. This - structure is currently 920 bytes long, but we allow up to 1024 - bytes to allow for some future growth. */ -#define TRAD_CORE_EXTRA_SIZE_ALLOWED 1024 -#define TRAD_UNIX_CORE_FILE_FAILING_SIGNAL(abfd) \ - ((abfd)->tdata.trad_core_data->u.signal) diff --git a/contrib/gdb/bfd/hosts/decstation.h b/contrib/gdb/bfd/hosts/decstation.h deleted file mode 100644 index a80c143d525e0..0000000000000 --- a/contrib/gdb/bfd/hosts/decstation.h +++ /dev/null @@ -1,17 +0,0 @@ -/* Hopefully this should include either machine/param.h (Ultrix) or - machine/machparam.h (Mach), whichever is its name on this system. */ -#include <sys/param.h> - -#include <machine/vmparam.h> - -#define HOST_PAGE_SIZE NBPG -/* #define HOST_SEGMENT_SIZE NBPG -- we use HOST_DATA_START_ADDR */ -#define HOST_MACHINE_ARCH bfd_arch_mips -/* #define HOST_MACHINE_MACHINE */ - -#define HOST_TEXT_START_ADDR USRTEXT -#define HOST_DATA_START_ADDR USRDATA -#define HOST_STACK_END_ADDR USRSTACK - -#define TRAD_UNIX_CORE_FILE_FAILING_SIGNAL(core_bfd) \ - ((core_bfd)->tdata.trad_core_data->u.u_arg[0]) diff --git a/contrib/gdb/bfd/hosts/delta68.h b/contrib/gdb/bfd/hosts/delta68.h deleted file mode 100644 index 1a6a6e6f197e1..0000000000000 --- a/contrib/gdb/bfd/hosts/delta68.h +++ /dev/null @@ -1,18 +0,0 @@ -/* Definitions for a Motorola Delta 3300 box running System V R3.0. - Contributed by manfred@lts.sel.alcatel.de. */ - -#include <sys/param.h> - -/* Definitions used by trad-core.c. */ -#define NBPG NBPC -#define HOST_DATA_START_ADDR u.u_exdata.ux_datorg -#define HOST_TEXT_START_ADDR u.u_exdata.ux_txtorg -#if 0 -#define HOST_STACK_END_ADDR 0x40000000 -#else -/* User's stack, copied from sys/param.h */ -#define HOST_STACK_END_ADDR USRSTACK -#endif -#define UPAGES USIZE -#define TRAD_UNIX_CORE_FILE_FAILING_SIGNAL(abfd) \ - abfd->tdata.trad_core_data->u.u_abort diff --git a/contrib/gdb/bfd/hosts/dpx2.h b/contrib/gdb/bfd/hosts/dpx2.h deleted file mode 100644 index ea6395f2e5d73..0000000000000 --- a/contrib/gdb/bfd/hosts/dpx2.h +++ /dev/null @@ -1,8 +0,0 @@ -/* Definitions that are needed for core files. Core section sizes for - the DPX2 are in bytes. */ - -#include <sys/param.h> -#define NBPG 1 -#define UPAGES (USIZE * NBPP) -#define HOST_DATA_START_ADDR (u.u_exdata.ux_datorg) -#define HOST_STACK_END_ADDR (USERSTACK) diff --git a/contrib/gdb/bfd/hosts/hp300bsd.h b/contrib/gdb/bfd/hosts/hp300bsd.h deleted file mode 100644 index 9828717820735..0000000000000 --- a/contrib/gdb/bfd/hosts/hp300bsd.h +++ /dev/null @@ -1,13 +0,0 @@ -#include <sys/param.h> -#ifdef BSD4_4 -#define NO_CORE_COMMAND -#endif - -#define HOST_PAGE_SIZE NBPG -#define HOST_SEGMENT_SIZE NBPG /* Data seg start addr rounds to NBPG */ -#define HOST_MACHINE_ARCH bfd_arch_m68k -/* #define HOST_MACHINE_MACHINE */ - -#define HOST_TEXT_START_ADDR 0 -#define HOST_STACK_END_ADDR 0xfff00000 -#define HOST_BIG_ENDIAN_P diff --git a/contrib/gdb/bfd/hosts/i386bsd.h b/contrib/gdb/bfd/hosts/i386bsd.h deleted file mode 100644 index ac0d8402edbfd..0000000000000 --- a/contrib/gdb/bfd/hosts/i386bsd.h +++ /dev/null @@ -1,25 +0,0 @@ -/* Intel 386 running any BSD Unix */ - -#include <machine/param.h> -#include <machine/vmparam.h> - -#define HOST_PAGE_SIZE NBPG -#define HOST_MACHINE_ARCH bfd_arch_i386 -#define HOST_TEXT_START_ADDR USRTEXT - -/* Jolitz suggested defining HOST_STACK_END_ADDR to - (u.u_kproc.kp_eproc.e_vm.vm_maxsaddr + MAXSSIZ), which should work on - both BSDI and 386BSD, but that is believed not to work for BSD 4.4. */ - -#ifdef __bsdi__ -/* This seems to be the right thing for BSDI. */ -#define HOST_STACK_END_ADDR USRSTACK -#define HOST_DATA_START_ADDR ((bfd_vma)u.u_kproc.kp_eproc.e_vm.vm_daddr) -#else -/* This seems to be the right thing for 386BSD release 0.1. */ -#define HOST_STACK_END_ADDR (USRSTACK - MAXSSIZ) -#endif - -#define TRAD_UNIX_CORE_FILE_FAILING_SIGNAL(core_bfd) \ - ((core_bfd)->tdata.trad_core_data->u.u_sig) -#define u_comm u_kproc.kp_proc.p_comm diff --git a/contrib/gdb/bfd/hosts/i386linux.h b/contrib/gdb/bfd/hosts/i386linux.h deleted file mode 100644 index 13a51f1bd14cf..0000000000000 --- a/contrib/gdb/bfd/hosts/i386linux.h +++ /dev/null @@ -1,8 +0,0 @@ -/* Linux writes the task structure at the end of the core file. Currently it - is 2912 bytes. It is possible that this should be a pickier check, but - we should probably not be too picky (the size of the task structure might - vary, and if it's not the length we expect it to be, it doesn't affect - our ability to process the core file). So allow 0-4096 extra bytes at - the end. */ - -#define TRAD_CORE_EXTRA_SIZE_ALLOWED 4096 diff --git a/contrib/gdb/bfd/hosts/i386mach3.h b/contrib/gdb/bfd/hosts/i386mach3.h deleted file mode 100644 index dcc61e3c8e898..0000000000000 --- a/contrib/gdb/bfd/hosts/i386mach3.h +++ /dev/null @@ -1,25 +0,0 @@ -#include <machine/vmparam.h> -#include <sys/param.h> - -/* This is an ugly way to hack around the incorrect - * definition of UPAGES in i386/machparam.h. - * - * The definition should specify the size reserved - * for "struct user" in core files in PAGES, - * but instead it gives it in 512-byte core-clicks - * for i386 and i860. UPAGES is used only in trad-core.c. - */ -#if UPAGES == 16 -#undef UPAGES -#define UPAGES 2 -#endif - -#if UPAGES != 2 -FIXME!! UPAGES is neither 2 nor 16 -#endif - -#define HOST_PAGE_SIZE 1 -#define HOST_SEGMENT_SIZE NBPG -#define HOST_MACHINE_ARCH bfd_arch_i386 -#define HOST_TEXT_START_ADDR USRTEXT -#define HOST_STACK_END_ADDR USRSTACK diff --git a/contrib/gdb/bfd/hosts/i386sco.h b/contrib/gdb/bfd/hosts/i386sco.h deleted file mode 100644 index ec8608c61dd5a..0000000000000 --- a/contrib/gdb/bfd/hosts/i386sco.h +++ /dev/null @@ -1,19 +0,0 @@ -/* Core file stuff. At least some, perhaps all, of the following - defines work on many more systems than just SCO. */ - -#define NBPG NBPC -#define UPAGES USIZE -#define HOST_DATA_START_ADDR u.u_exdata.ux_datorg -#define HOST_STACK_START_ADDR u.u_sub -#define TRAD_UNIX_CORE_FILE_FAILING_SIGNAL(abfd) \ - ((core_upage(abfd)->u_sysabort != 0) \ - ? core_upage(abfd)->u_sysabort \ - : -1) - -/* According to the manpage, a version 2 SCO corefile can contain - various additional sections (it is cleverly arranged so the u area, - data, and stack are first where we can find them). So without - writing lots of code to parse all their headers and stuff, we can't - know whether a corefile is bigger than it should be. */ - -#define TRAD_CORE_ALLOW_ANY_EXTRA_SIZE 1 diff --git a/contrib/gdb/bfd/hosts/i860mach3.h b/contrib/gdb/bfd/hosts/i860mach3.h deleted file mode 100644 index edd2aa10a7bb5..0000000000000 --- a/contrib/gdb/bfd/hosts/i860mach3.h +++ /dev/null @@ -1,27 +0,0 @@ -/* This file was hacked from i386mach3.h [dolan@ssd.intel.com] */ - -#include <machine/vmparam.h> -#include <sys/param.h> - -/* This is an ugly way to hack around the incorrect - * definition of UPAGES in i386/machparam.h. - * - * The definition should specify the size reserved - * for "struct user" in core files in PAGES, - * but instead it gives it in 512-byte core-clicks - * for i386 and i860. UPAGES is used only in trad-core.c. - */ -#if UPAGES == 16 -#undef UPAGES -#define UPAGES 2 -#endif - -#if UPAGES != 2 -FIXME!! UPAGES is neither 2 nor 16 -#endif - -#define HOST_PAGE_SIZE 1 -#define HOST_SEGMENT_SIZE NBPG -#define HOST_MACHINE_ARCH bfd_arch_i860 -#define HOST_TEXT_START_ADDR USRTEXT -#define HOST_STACK_END_ADDR USRSTACK diff --git a/contrib/gdb/bfd/hosts/m68kaux.h b/contrib/gdb/bfd/hosts/m68kaux.h deleted file mode 100644 index 6237755dba553..0000000000000 --- a/contrib/gdb/bfd/hosts/m68kaux.h +++ /dev/null @@ -1,16 +0,0 @@ -/* Definitions for an Apple Macintosh running A/UX 3.x. */ - -#include <sys/param.h> -#include <sys/page.h> - -/* Definitions used by trad-core.c. */ -#define NBPG NBPP - -#define HOST_DATA_START_ADDR u.u_exdata.ux_datorg -#define HOST_TEXT_START_ADDR u.u_exdata.ux_txtorg -#define HOST_STACK_END_ADDR 0x100000000 - -#define UPAGES USIZE - -#define TRAD_UNIX_CORE_FILE_FAILING_SIGNAL(abfd) \ - (abfd->tdata.trad_core_data->u.u_arg[0]) diff --git a/contrib/gdb/bfd/hosts/m68klinux.h b/contrib/gdb/bfd/hosts/m68klinux.h deleted file mode 100644 index 0067dfa6fda31..0000000000000 --- a/contrib/gdb/bfd/hosts/m68klinux.h +++ /dev/null @@ -1,6 +0,0 @@ -/* Linux dumps "struct task_struct" at the end of the core-file. This - structure is currently 2512 bytes long, but we allow up to 4096 - bytes to allow for some future growth. */ -#define TRAD_CORE_EXTRA_SIZE_ALLOWED 4096 -#define TRAD_UNIX_CORE_FILE_FAILING_SIGNAL(abfd) \ - ((abfd)->tdata.trad_core_data->u.signal) diff --git a/contrib/gdb/bfd/hosts/m88kmach3.h b/contrib/gdb/bfd/hosts/m88kmach3.h deleted file mode 100644 index 421553893ec93..0000000000000 --- a/contrib/gdb/bfd/hosts/m88kmach3.h +++ /dev/null @@ -1,11 +0,0 @@ -#include <machine/vmparam.h> -#include <sys/param.h> - -#undef UPAGES -#define UPAGES 3 - -#define HOST_PAGE_SIZE NBPG -#define HOST_SEGMENT_SIZE NBPG -#define HOST_MACHINE_ARCH bfd_arch_m88k -#define HOST_TEXT_START_ADDR USRTEXT -#define HOST_STACK_END_ADDR USRSTACK diff --git a/contrib/gdb/bfd/hosts/mipsbsd.h b/contrib/gdb/bfd/hosts/mipsbsd.h deleted file mode 100644 index a2fad21fcf7a1..0000000000000 --- a/contrib/gdb/bfd/hosts/mipsbsd.h +++ /dev/null @@ -1,12 +0,0 @@ -#include <machine/param.h> -#include <machine/vmparam.h> -#undef ALIGN - -#define HOST_PAGE_SIZE NBPG -/* #define HOST_SEGMENT_SIZE NBPG -- we use HOST_DATA_START_ADDR */ -#define HOST_MACHINE_ARCH bfd_arch_mips -/* #define HOST_MACHINE_MACHINE */ - -#define HOST_TEXT_START_ADDR USRTEXT -#define HOST_STACK_END_ADDR USRSTACK -#define NO_CORE_COMMAND diff --git a/contrib/gdb/bfd/hosts/mipsmach3.h b/contrib/gdb/bfd/hosts/mipsmach3.h deleted file mode 100644 index c5c468d374265..0000000000000 --- a/contrib/gdb/bfd/hosts/mipsmach3.h +++ /dev/null @@ -1,10 +0,0 @@ -#include <machine/vmparam.h> -#include <machine/machparam.h> -#include <sys/param.h> - -#define HOST_PAGE_SIZE NBPG -/* #define HOST_SEGMENT_SIZE NBPG */ -#define HOST_MACHINE_ARCH bfd_arch_mips -#define HOST_TEXT_START_ADDR USRTEXT -#define HOST_DATA_START_ADDR USRDATA -#define HOST_STACK_END_ADDR USRSTACK diff --git a/contrib/gdb/bfd/hosts/news-mips.h b/contrib/gdb/bfd/hosts/news-mips.h deleted file mode 100644 index 9e799bed9047c..0000000000000 --- a/contrib/gdb/bfd/hosts/news-mips.h +++ /dev/null @@ -1,12 +0,0 @@ -/* Sony News running NewsOS 3.2. */ - -#include <sys/param.h> -#include <machine/vmparam.h> - -#define HOST_PAGE_SIZE NBPG - -#define HOST_MACHINE_ARCH bfd_arch_mips - -#define HOST_TEXT_START_ADDR USRTEXT -#define HOST_DATA_START_ADDR USRDATA -#define HOST_STACK_END_ADDR USRSTACK diff --git a/contrib/gdb/bfd/hosts/news.h b/contrib/gdb/bfd/hosts/news.h deleted file mode 100644 index bf7946cdb999f..0000000000000 --- a/contrib/gdb/bfd/hosts/news.h +++ /dev/null @@ -1,9 +0,0 @@ -/* Sony News running NewsOS 3.2. */ - -#include <machine/vmparam.h> - -#define HOST_PAGE_SIZE NBPG -#define HOST_SEGMENT_SIZE NBPG -#define HOST_MACHINE_ARCH bfd_arch_m68k -#define HOST_TEXT_START_ADDR 0 -#define HOST_STACK_END_ADDR (KERNBASE - (UPAGES * NBPG)) diff --git a/contrib/gdb/bfd/hosts/pc532mach.h b/contrib/gdb/bfd/hosts/pc532mach.h deleted file mode 100644 index ab96f597edd2d..0000000000000 --- a/contrib/gdb/bfd/hosts/pc532mach.h +++ /dev/null @@ -1,24 +0,0 @@ -#include <machine/vmparam.h> -#include <sys/param.h> - -/* This is an ugly way to hack around the incorrect - * definition of UPAGES in ns532/machparam.h. - * - * The definition should specify the size reserved - * for "struct user" in core files in PAGES, - * but instead it gives it in 512-byte core-clicks - * for ns532, i386 and i860. UPAGES is used only in trad-core.c. - */ -#if UPAGES == 16 -#undef UPAGES -#define UPAGES 2 -#endif - -#if UPAGES != 2 -#error UPAGES is neither 2 nor 16 -#endif - -#define HOST_PAGE_SIZE 1 -#define HOST_SEGMENT_SIZE NBPG -#define HOST_TEXT_START_ADDR USRTEXT -#define HOST_STACK_END_ADDR USRSTACK diff --git a/contrib/gdb/bfd/hosts/riscos.h b/contrib/gdb/bfd/hosts/riscos.h deleted file mode 100644 index 8ffa826bdcf5c..0000000000000 --- a/contrib/gdb/bfd/hosts/riscos.h +++ /dev/null @@ -1,10 +0,0 @@ -/* RISC/os 4.52C, and presumably other versions. */ - -#include <bsd43/machine/machparam.h> -#include <bsd43/machine/vmparam.h> - -#define NBPG BSD43_NBPG -#define UPAGES BSD43_UPAGES -#define HOST_TEXT_START_ADDR BSD43_USRTEXT -#define HOST_DATA_START_ADDR BSD43_USRDATA -#define HOST_STACK_END_ADDR BSD43_USRSTACK diff --git a/contrib/gdb/bfd/hosts/symmetry.h b/contrib/gdb/bfd/hosts/symmetry.h deleted file mode 100644 index 75717b31eb22b..0000000000000 --- a/contrib/gdb/bfd/hosts/symmetry.h +++ /dev/null @@ -1,20 +0,0 @@ -/* Symmetry running either dynix 3.1 (bsd) or ptx (sysv). */ - -#define NBPG 4096 -#define UPAGES 1 - -#ifdef _SEQUENT_ -/* ptx */ -#define HOST_TEXT_START_ADDR 0 -#define HOST_STACK_END_ADDR 0x3fffe000 -#define TRAD_CORE_USER_OFFSET ((UPAGES * NBPG) - sizeof (struct user)) -#else -/* dynix */ -#define HOST_TEXT_START_ADDR 0x1000 -#define HOST_DATA_START_ADDR (NBPG * u.u_tsize) -#define HOST_STACK_END_ADDR 0x3ffff000 -#define TRAD_UNIX_CORE_FILE_FAILING_SIGNAL(core_bfd) \ - ((core_bfd)->tdata.trad_core_data->u.u_arg[0]) -#endif - -#define TRAD_CORE_DSIZE_INCLUDES_TSIZE diff --git a/contrib/gdb/bfd/hosts/tahoe.h b/contrib/gdb/bfd/hosts/tahoe.h deleted file mode 100644 index 716cee2a171da..0000000000000 --- a/contrib/gdb/bfd/hosts/tahoe.h +++ /dev/null @@ -1,12 +0,0 @@ -#define NO_CORE_COMMAND - -#undef ALIGN /* They use it, we use it too */ -#include <machine/param.h> -#undef ALIGN /* They use it, we use it too */ - -#define HOST_PAGE_SIZE NBPG -#define HOST_MACHINE_ARCH bfd_arch_tahoe - -#define HOST_TEXT_START_ADDR 0 -#define HOST_STACK_END_ADDR (KERNBASE - (UPAGES * NBPG)) -#define HOST_BIG_ENDIAN_P diff --git a/contrib/gdb/bfd/hosts/vaxbsd.h b/contrib/gdb/bfd/hosts/vaxbsd.h deleted file mode 100644 index ceb9ccedfaf13..0000000000000 --- a/contrib/gdb/bfd/hosts/vaxbsd.h +++ /dev/null @@ -1,19 +0,0 @@ -#define NO_CORE_COMMAND /* No command name in core file */ - -#if 0 -#undef ALIGN /* They use it, we use it too */ -/* Does not exist on BSD 4.3, it uses machine/machparam.h. - Whatever it is, it's included by <sys/param.h>, which trad-core.c, - the only place that uses this (I think), already includes. */ -#include <machine/param.h> -#endif -#undef ALIGN /* They use it, we use it too */ - -/* Note that HOST_PAGE_SIZE -- the page size as far as executable files - are concerned -- is not the same as NBPG, because of page clustering. */ -#define HOST_PAGE_SIZE 1024 -#define HOST_MACHINE_ARCH bfd_arch_vax - -#define HOST_TEXT_START_ADDR 0 -#define HOST_STACK_END_ADDR (0x80000000 - (UPAGES * NBPG)) -#undef HOST_BIG_ENDIAN_P diff --git a/contrib/gdb/bfd/hosts/vaxult.h b/contrib/gdb/bfd/hosts/vaxult.h deleted file mode 100644 index 13731b7479f6d..0000000000000 --- a/contrib/gdb/bfd/hosts/vaxult.h +++ /dev/null @@ -1,8 +0,0 @@ -#include <machine/param.h> -#include <machine/vmparam.h> -#define HOST_PAGE_SIZE (NBPG*CLSIZE) -#define HOST_MACHINE_ARCH bfd_arch_vax - -#define HOST_TEXT_START_ADDR USRTEXT -#define HOST_STACK_END_ADDR USRSTACK -#undef HOST_BIG_ENDIAN_P diff --git a/contrib/gdb/bfd/hosts/vaxult2.h b/contrib/gdb/bfd/hosts/vaxult2.h deleted file mode 100644 index 13731b7479f6d..0000000000000 --- a/contrib/gdb/bfd/hosts/vaxult2.h +++ /dev/null @@ -1,8 +0,0 @@ -#include <machine/param.h> -#include <machine/vmparam.h> -#define HOST_PAGE_SIZE (NBPG*CLSIZE) -#define HOST_MACHINE_ARCH bfd_arch_vax - -#define HOST_TEXT_START_ADDR USRTEXT -#define HOST_STACK_END_ADDR USRSTACK -#undef HOST_BIG_ENDIAN_P diff --git a/contrib/gdb/bfd/hp300bsd.c b/contrib/gdb/bfd/hp300bsd.c deleted file mode 100644 index 5767b18c179a6..0000000000000 --- a/contrib/gdb/bfd/hp300bsd.c +++ /dev/null @@ -1,38 +0,0 @@ -/* BFD back-end for HP 9000/300 (68000-based) machines running BSD Unix. - Copyright 1992 Free Software Foundation, Inc. - -This file is part of BFD, the Binary File Descriptor library. - -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 2 of the License, 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ - -#define TARGET_IS_BIG_ENDIAN_P -#define N_HEADER_IN_TEXT(x) 0 -#define BYTES_IN_WORD 4 -#define ENTRY_CAN_BE_ZERO -#define N_SHARED_LIB(x) 0 /* Avoids warning */ -#define TEXT_START_ADDR 0 -#define TARGET_PAGE_SIZE 4096 -#define SEGMENT_SIZE TARGET_PAGE_SIZE -#define DEFAULT_ARCH bfd_arch_m68k - -#define MY(OP) CAT(hp300bsd_,OP) -#define TARGETNAME "a.out-hp300bsd" - -#include "bfd.h" -#include "sysdep.h" -#include "libbfd.h" -#include "libaout.h" - -#include "aout-target.h" diff --git a/contrib/gdb/bfd/hp300hpux.c b/contrib/gdb/bfd/hp300hpux.c deleted file mode 100644 index 1d1acab8ae4e0..0000000000000 --- a/contrib/gdb/bfd/hp300hpux.c +++ /dev/null @@ -1,865 +0,0 @@ -/* BFD backend for hp-ux 9000/300 - Copyright (C) 1990, 1991, 1994, 1995 Free Software Foundation, Inc. - Written by Glenn Engel. - -This file is part of BFD, the Binary File Descriptor library. - -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 2 of the License, 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ - -/* - - hpux native ------------> | | - | hp300hpux bfd | ----------> hpux w/gnu ext - hpux w/gnu extension ----> | | - - - Support for the 9000/[34]00 has several limitations. - 1. Shared libraries are not supported. - 2. The output format from this bfd is not usable by native tools. - - The primary motivation for writing this bfd was to allow use of - gdb and gcc for host based debugging and not to mimic the hp-ux tools - in every detail. This leads to a significant simplification of the - code and a leap in performance. The decision to not output hp native - compatible objects was further strengthened by the fact that the richness - of the gcc compiled objects could not be represented without loss of - information. For example, while the hp format supports the concept of - secondary symbols, it does not support indirect symbols. Another - reason is to maintain backwards compatibility with older implementations - of gcc on hpux which used 'hpxt' to translate .a and .o files into a - format which could be readily understood by the gnu linker and gdb. - This allows reading hp secondary symbols and converting them into - indirect symbols but the reverse it not always possible. - - Another example of differences is that the hp format stores symbol offsets - in the object code while the gnu utilities use a field in the - relocation record for this. To support the hp native format, the object - code would need to be patched with the offsets when producing .o files. - - The basic technique taken in this implementation is to #include the code - from aoutx.h and aout-target.h with appropriate #defines to override - code where a unique implementation is needed: - - { - #define a bunch of stuff - #include <aoutx.h> - - implement a bunch of functions - - #include "aout-target.h" - } - - The hp symbol table is a bit different than other a.out targets. Instead - of having an array of nlist items and an array of strings, hp's format - has them mixed together in one structure. In addition, the strings are - not null terminated. It looks something like this: - - nlist element 1 - string1 - nlist element 2 - string2 - ... - - The whole symbol table is read as one chunk and then we march thru it - and convert it to canonical form. As we march thru the table, we copy - the nlist data into the internal form and we compact the strings and null - terminate them, using storage from the already allocated symbol table: - - string1 - null - string2 - null - */ - -/* @@ Is this really so different from normal a.out that it needs to include - aoutx.h? We should go through this file sometime and see what can be made - more dependent on aout32.o and what might need to be broken off and accessed - through the backend_data field. Or, maybe we really do need such a - completely separate implementation. I don't have time to investigate this - much further right now. [raeburn:19930428.2124EST] */ -/* @@ Also, note that there wind up being two versions of some routines, with - different names, only one of which actually gets used. For example: - slurp_symbol_table - swap_std_reloc_in - slurp_reloc_table - get_symtab - get_symtab_upper_bound - canonicalize_reloc - mkobject - This should also be fixed. */ - -#define TARGETNAME "a.out-hp300hpux" -#define MY(OP) CAT(hp300hpux_,OP) - -#define external_exec hp300hpux_exec_bytes -#define external_nlist hp300hpux_nlist_bytes - -#include "aout/hp300hpux.h" - -/* define these so we can compile unused routines in aoutx.h */ -#define e_strx e_shlib -#define e_other e_length -#define e_desc e_almod - -#define AR_PAD_CHAR '/' -#define TARGET_IS_BIG_ENDIAN_P -#define DEFAULT_ARCH bfd_arch_m68k - -#define MY_get_section_contents aout_32_get_section_contents -#define MY_slurp_armap bfd_slurp_bsd_armap_f2 - -/***********************************************/ -/* provide overrides for routines in this file */ -/***********************************************/ -/* these don't use MY because that causes problems within JUMP_TABLE - (CAT winds up being expanded recursively, which ANSI C compilers - will not do). */ -#define MY_get_symtab hp300hpux_get_symtab -#define MY_get_symtab_upper_bound hp300hpux_get_symtab_upper_bound -#define MY_canonicalize_reloc hp300hpux_canonicalize_reloc -#define MY_write_object_contents hp300hpux_write_object_contents - -#define MY_read_minisymbols _bfd_generic_read_minisymbols -#define MY_minisymbol_to_symbol _bfd_generic_minisymbol_to_symbol - -#define MY_bfd_link_hash_table_create _bfd_generic_link_hash_table_create -#define MY_bfd_link_add_symbols _bfd_generic_link_add_symbols -#define MY_final_link_callback unused -#define MY_bfd_final_link _bfd_generic_final_link - -/* Until and unless we convert the slurp_reloc and slurp_symtab - routines in this file, we can not use the default aout - free_cached_info routine which assumes that the relocs and symtabs - were allocated using malloc. */ -#define MY_bfd_free_cached_info bfd_true - -#define hp300hpux_write_syms aout_32_write_syms - -#define MY_callback MY(callback) - -#define MY_exec_hdr_flags 0x2 - -#define NAME_swap_exec_header_in NAME(hp300hpux_32_,swap_exec_header_in) - -#define HP_SYMTYPE_UNDEFINED 0x00 -#define HP_SYMTYPE_ABSOLUTE 0x01 -#define HP_SYMTYPE_TEXT 0x02 -#define HP_SYMTYPE_DATA 0x03 -#define HP_SYMTYPE_BSS 0x04 -#define HP_SYMTYPE_COMMON 0x05 - -#define HP_SYMTYPE_TYPE 0x0F -#define HP_SYMTYPE_FILENAME 0x1F - -#define HP_SYMTYPE_ALIGN 0x10 -#define HP_SYMTYPE_EXTERNAL 0x20 -#define HP_SECONDARY_SYMBOL 0x40 - -/* RELOCATION DEFINITIONS */ -#define HP_RSEGMENT_TEXT 0x00 -#define HP_RSEGMENT_DATA 0x01 -#define HP_RSEGMENT_BSS 0x02 -#define HP_RSEGMENT_EXTERNAL 0x03 -#define HP_RSEGMENT_PCREL 0x04 -#define HP_RSEGMENT_RDLT 0x05 -#define HP_RSEGMENT_RPLT 0x06 -#define HP_RSEGMENT_NOOP 0x3F - -#define HP_RLENGTH_BYTE 0x00 -#define HP_RLENGTH_WORD 0x01 -#define HP_RLENGTH_LONG 0x02 -#define HP_RLENGTH_ALIGN 0x03 - -#define NAME(x,y) CAT3(hp300hpux,_32_,y) -#define ARCH_SIZE 32 - -/* aoutx.h requires definitions for BMAGIC and QMAGIC. */ -#define BMAGIC HPUX_DOT_O_MAGIC -#define QMAGIC 0314 - -#include "aoutx.h" - -/* Since the hpux symbol table has nlist elements interspersed with - strings and we need to insert som strings for secondary symbols, we - give ourselves a little extra padding up front to account for - this. Note that for each non-secondary symbol we process, we gain - 9 bytes of space for the discarded nlist element (one byte used for - null). SYM_EXTRA_BYTES is the extra space. */ -#define SYM_EXTRA_BYTES 1024 - -/* Set parameters about this a.out file that are machine-dependent. - This routine is called from some_aout_object_p just before it returns. */ -static const bfd_target * -MY (callback) (abfd) - bfd *abfd; -{ - struct internal_exec *execp = exec_hdr (abfd); - - /* Calculate the file positions of the parts of a newly read aout header */ - obj_textsec (abfd)->_raw_size = N_TXTSIZE (*execp); - - /* The virtual memory addresses of the sections */ - obj_textsec (abfd)->vma = N_TXTADDR (*execp); - obj_datasec (abfd)->vma = N_DATADDR (*execp); - obj_bsssec (abfd)->vma = N_BSSADDR (*execp); - - obj_textsec (abfd)->lma = obj_textsec (abfd)->vma; - obj_datasec (abfd)->lma = obj_datasec (abfd)->vma; - obj_bsssec (abfd)->lma = obj_bsssec (abfd)->vma; - - /* The file offsets of the sections */ - obj_textsec (abfd)->filepos = N_TXTOFF (*execp); - obj_datasec (abfd)->filepos = N_DATOFF (*execp); - - /* The file offsets of the relocation info */ - obj_textsec (abfd)->rel_filepos = N_TRELOFF (*execp); - obj_datasec (abfd)->rel_filepos = N_DRELOFF (*execp); - - /* The file offsets of the string table and symbol table. */ - obj_sym_filepos (abfd) = N_SYMOFF (*execp); - obj_str_filepos (abfd) = N_STROFF (*execp); - - /* Determine the architecture and machine type of the object file. */ -#ifdef SET_ARCH_MACH - SET_ARCH_MACH (abfd, *execp); -#else - bfd_default_set_arch_mach (abfd, DEFAULT_ARCH, 0); -#endif - - - if (obj_aout_subformat (abfd) == gnu_encap_format) - { - /* The file offsets of the relocation info */ - obj_textsec (abfd)->rel_filepos = N_GNU_TRELOFF (*execp); - obj_datasec (abfd)->rel_filepos = N_GNU_DRELOFF (*execp); - - /* The file offsets of the string table and symbol table. */ - obj_sym_filepos (abfd) = N_GNU_SYMOFF (*execp); - obj_str_filepos (abfd) = (obj_sym_filepos (abfd) + execp->a_syms); - - abfd->flags |= HAS_LINENO | HAS_DEBUG | HAS_SYMS | HAS_LOCALS; - bfd_get_symcount (abfd) = execp->a_syms / 12; - obj_symbol_entry_size (abfd) = 12; - obj_reloc_entry_size (abfd) = RELOC_STD_SIZE; - } - - return abfd->xvec; -} - -extern boolean aout_32_write_syms PARAMS ((bfd * abfd)); - -static boolean -MY (write_object_contents) (abfd) - bfd *abfd; -{ - struct external_exec exec_bytes; - struct internal_exec *execp = exec_hdr (abfd); - bfd_size_type text_size; /* dummy vars */ - file_ptr text_end; - - memset (&exec_bytes, 0, sizeof (exec_bytes)); -#if CHOOSE_RELOC_SIZE - CHOOSE_RELOC_SIZE (abfd); -#else - obj_reloc_entry_size (abfd) = RELOC_STD_SIZE; -#endif - - if (adata (abfd).magic == undecided_magic) - NAME (aout,adjust_sizes_and_vmas) (abfd, &text_size, &text_end); - execp->a_syms = 0; - - execp->a_entry = bfd_get_start_address (abfd); - - execp->a_trsize = ((obj_textsec (abfd)->reloc_count) * - obj_reloc_entry_size (abfd)); - execp->a_drsize = ((obj_datasec (abfd)->reloc_count) * - obj_reloc_entry_size (abfd)); - - N_SET_MACHTYPE (*execp, 0xc); - N_SET_FLAGS (*execp, aout_backend_info (abfd)->exec_hdr_flags); - - NAME (aout,swap_exec_header_out) (abfd, execp, &exec_bytes); - - /* update fields not covered by default swap_exec_header_out */ - - /* this is really the sym table size but we store it in drelocs */ - bfd_h_put_32 (abfd, bfd_get_symcount (abfd) * 12, exec_bytes.e_drelocs); - - if (bfd_seek (abfd, 0L, false) != 0 - || (bfd_write ((PTR) & exec_bytes, 1, EXEC_BYTES_SIZE, abfd) - != EXEC_BYTES_SIZE)) - return false; - - /* Write out the symbols, and then the relocs. We must write out - the symbols first so that we know the symbol indices. */ - - if (bfd_get_symcount (abfd) != 0) - { - /* Skip the relocs to where we want to put the symbols. */ - if (bfd_seek (abfd, (file_ptr) N_DRELOFF (*execp) + execp->a_drsize, - SEEK_SET) != 0) - return false; - } - - if (!MY (write_syms) (abfd)) - return false; - - if (bfd_get_symcount (abfd) != 0) - { - if (bfd_seek (abfd, (long) (N_TRELOFF (*execp)), false) != 0) - return false; - if (!NAME (aout,squirt_out_relocs) (abfd, obj_textsec (abfd))) - return false; - if (bfd_seek (abfd, (long) (N_DRELOFF (*execp)), false) != 0) - return false; - if (!NAME (aout,squirt_out_relocs) (abfd, obj_datasec (abfd))) - return false; - } - - return true; -} - -/* convert the hp symbol type to be the same as aout64.h usage so we */ -/* can piggyback routines in aoutx.h. */ - -static void -convert_sym_type (sym_pointer, cache_ptr, abfd) - struct external_nlist *sym_pointer; - aout_symbol_type *cache_ptr; - bfd *abfd; -{ - int name_type; - int new_type; - - name_type = (cache_ptr->type); - new_type = 0; - - if ((name_type & HP_SYMTYPE_ALIGN) != 0) - { - /* iou_error ("aligned symbol encountered: %s", name);*/ - name_type = 0; - } - - if (name_type == HP_SYMTYPE_FILENAME) - new_type = N_FN; - else - { - switch (name_type & HP_SYMTYPE_TYPE) - { - case HP_SYMTYPE_UNDEFINED: - new_type = N_UNDF; - break; - - case HP_SYMTYPE_ABSOLUTE: - new_type = N_ABS; - break; - - case HP_SYMTYPE_TEXT: - new_type = N_TEXT; - break; - - case HP_SYMTYPE_DATA: - new_type = N_DATA; - break; - - case HP_SYMTYPE_BSS: - new_type = N_BSS; - break; - - case HP_SYMTYPE_COMMON: - new_type = N_COMM; - break; - - default: - abort (); - break; - } - if (name_type & HP_SYMTYPE_EXTERNAL) - new_type |= N_EXT; - - if (name_type & HP_SECONDARY_SYMBOL) - { - switch (new_type) - { - default: - abort (); - case N_UNDF | N_EXT: - new_type = N_WEAKU; - break; - case N_ABS | N_EXT: - new_type = N_WEAKA; - break; - case N_TEXT | N_EXT: - new_type = N_WEAKT; - break; - case N_DATA | N_EXT: - new_type = N_WEAKD; - break; - case N_BSS | N_EXT: - new_type = N_WEAKB; - break; - } - } - } - cache_ptr->type = new_type; - -} - - -/* -DESCRIPTION - Swaps the information in an executable header taken from a raw - byte stream memory image, into the internal exec_header - structure. -*/ - -void -NAME (aout,swap_exec_header_in) (abfd, raw_bytes, execp) - bfd *abfd; - struct external_exec *raw_bytes; - struct internal_exec *execp; -{ - struct external_exec *bytes = (struct external_exec *) raw_bytes; - - /* The internal_exec structure has some fields that are unused in this - configuration (IE for i960), so ensure that all such uninitialized - fields are zero'd out. There are places where two of these structs - are memcmp'd, and thus the contents do matter. */ - memset (execp, 0, sizeof (struct internal_exec)); - /* Now fill in fields in the execp, from the bytes in the raw data. */ - execp->a_info = bfd_h_get_32 (abfd, bytes->e_info); - execp->a_text = GET_WORD (abfd, bytes->e_text); - execp->a_data = GET_WORD (abfd, bytes->e_data); - execp->a_bss = GET_WORD (abfd, bytes->e_bss); - execp->a_syms = GET_WORD (abfd, bytes->e_syms); - execp->a_entry = GET_WORD (abfd, bytes->e_entry); - execp->a_trsize = GET_WORD (abfd, bytes->e_trsize); - execp->a_drsize = GET_WORD (abfd, bytes->e_drsize); - - /***************************************************************/ - /* check the header to see if it was generated by a bfd output */ - /* this is detected rather bizarely by requiring a bunch of */ - /* header fields to be zero and an old unused field (now used) */ - /* to be set. */ - /***************************************************************/ - do - { - long syms; - struct aout_data_struct *rawptr; - if (bfd_h_get_32 (abfd, bytes->e_passize) != 0) - break; - if (bfd_h_get_32 (abfd, bytes->e_syms) != 0) - break; - if (bfd_h_get_32 (abfd, bytes->e_supsize) != 0) - break; - - syms = bfd_h_get_32 (abfd, bytes->e_drelocs); - if (syms == 0) - break; - - /* OK, we've passed the test as best as we can determine */ - execp->a_syms = syms; - - /* allocate storage for where we will store this result */ - rawptr = (struct aout_data_struct *) bfd_zalloc (abfd, sizeof (*rawptr)); - - if (rawptr == NULL) - return; - abfd->tdata.aout_data = rawptr; - obj_aout_subformat (abfd) = gnu_encap_format; - } - while (0); -} - - -/* The hp symbol table is a bit different than other a.out targets. Instead - of having an array of nlist items and an array of strings, hp's format - has them mixed together in one structure. In addition, the strings are - not null terminated. It looks something like this: - - nlist element 1 - string1 - nlist element 2 - string2 - ... - - The whole symbol table is read as one chunk and then we march thru it - and convert it to canonical form. As we march thru the table, we copy - the nlist data into the internal form and we compact the strings and null - terminate them, using storage from the already allocated symbol table: - - string1 - null - string2 - null - ... -*/ - -boolean -MY (slurp_symbol_table) (abfd) - bfd *abfd; -{ - bfd_size_type symbol_bytes; - struct external_nlist *syms; - struct external_nlist *sym_pointer; - struct external_nlist *sym_end; - char *strings; - aout_symbol_type *cached; - unsigned num_syms = 0; - - /* If there's no work to be done, don't do any */ - if (obj_aout_symbols (abfd) != (aout_symbol_type *) NULL) - return true; - symbol_bytes = exec_hdr (abfd)->a_syms; - - strings = (char *) bfd_alloc (abfd, - symbol_bytes + SYM_EXTRA_BYTES); - if (!strings) - return false; - syms = (struct external_nlist *) (strings + SYM_EXTRA_BYTES); - if (bfd_seek (abfd, obj_sym_filepos (abfd), SEEK_SET) != 0 - || bfd_read ((PTR) syms, symbol_bytes, 1, abfd) != symbol_bytes) - { - bfd_release (abfd, syms); - return false; - } - - - sym_end = (struct external_nlist *) (((char *) syms) + symbol_bytes); - - /* first, march thru the table and figure out how many symbols there are */ - for (sym_pointer = syms; sym_pointer < sym_end; sym_pointer++, num_syms++) - { - /* skip over the embedded symbol. */ - sym_pointer = (struct external_nlist *) (((char *) sym_pointer) + - sym_pointer->e_length[0]); - } - - /* now that we know the symbol count, update the bfd header */ - bfd_get_symcount (abfd) = num_syms; - - cached = ((aout_symbol_type *) - bfd_zalloc (abfd, - bfd_get_symcount (abfd) * sizeof (aout_symbol_type))); - if (cached == NULL && bfd_get_symcount (abfd) != 0) - return false; - - /* as we march thru the hp symbol table, convert it into a list of - null terminated strings to hold the symbol names. Make sure any - assignment to the strings pointer is done after we're thru using - the nlist so we don't overwrite anything important. */ - - /* OK, now walk the new symtable, cacheing symbol properties */ - { - aout_symbol_type *cache_ptr = cached; - aout_symbol_type cache_save; - /* Run through table and copy values */ - for (sym_pointer = syms, cache_ptr = cached; - sym_pointer < sym_end; sym_pointer++, cache_ptr++) - { - unsigned int length; - cache_ptr->symbol.the_bfd = abfd; - cache_ptr->symbol.value = GET_SWORD (abfd, sym_pointer->e_value); - cache_ptr->desc = bfd_get_16 (abfd, sym_pointer->e_almod); - cache_ptr->type = bfd_get_8 (abfd, sym_pointer->e_type); - cache_ptr->symbol.udata.p = NULL; - length = bfd_get_8 (abfd, sym_pointer->e_length); - cache_ptr->other = length; /* other not used, save length here */ - - cache_save = *cache_ptr; - convert_sym_type (sym_pointer, cache_ptr, abfd); - if (!translate_from_native_sym_flags (abfd, cache_ptr)) - return false; - - /********************************************************/ - /* for hpux, the 'lenght' value indicates the length of */ - /* the symbol name which follows the nlist entry. */ - /********************************************************/ - if (length) - { - /**************************************************************/ - /* the hp string is not null terminated so we create a new one*/ - /* by copying the string to overlap the just vacated nlist */ - /* structure before it in memory. */ - /**************************************************************/ - cache_ptr->symbol.name = strings; - memcpy (strings, sym_pointer + 1, length); - strings[length] = '\0'; - strings += length + 1; - } - else - cache_ptr->symbol.name = (char *) NULL; - - /* skip over the embedded symbol. */ - sym_pointer = (struct external_nlist *) (((char *) sym_pointer) + - length); - } - } - - obj_aout_symbols (abfd) = cached; - - return true; -} - - - -void -MY (swap_std_reloc_in) (abfd, bytes, cache_ptr, symbols, symcount) - bfd *abfd; - struct hp300hpux_reloc *bytes; - arelent *cache_ptr; - asymbol **symbols; - bfd_size_type symcount; -{ - int r_index; - int r_extern = 0; - unsigned int r_length; - int r_pcrel = 0; - struct aoutdata *su = &(abfd->tdata.aout_data->a); - - cache_ptr->address = bfd_h_get_32 (abfd, bytes->r_address); - r_index = bfd_h_get_16 (abfd, bytes->r_index); - - switch (bytes->r_type[0]) - { - case HP_RSEGMENT_TEXT: - r_index = N_TEXT; - break; - case HP_RSEGMENT_DATA: - r_index = N_DATA; - break; - case HP_RSEGMENT_BSS: - r_index = N_BSS; - break; - case HP_RSEGMENT_EXTERNAL: - r_extern = 1; - break; - case HP_RSEGMENT_PCREL: - r_extern = 1; - r_pcrel = 1; - break; - case HP_RSEGMENT_RDLT: - break; - case HP_RSEGMENT_RPLT: - break; - case HP_RSEGMENT_NOOP: - break; - default: - abort (); - break; - } - - switch (bytes->r_length[0]) - { - case HP_RLENGTH_BYTE: - r_length = 0; - break; - case HP_RLENGTH_WORD: - r_length = 1; - break; - case HP_RLENGTH_LONG: - r_length = 2; - break; - default: - abort (); - break; - } - - cache_ptr->howto = howto_table_std + r_length + 4 * r_pcrel; - /* FIXME-soon: Roll baserel, jmptable, relative bits into howto setting */ - - /* This macro uses the r_index value computed above */ - if (r_pcrel && r_extern) - { - /* The GNU linker assumes any offset from beginning of section */ - /* is already incorporated into the image while the HP linker */ - /* adds this in later. Add it in now... */ - MOVE_ADDRESS (-cache_ptr->address); - } - else - { - MOVE_ADDRESS (0); - } -} - -boolean -MY (slurp_reloc_table) (abfd, asect, symbols) - bfd *abfd; - sec_ptr asect; - asymbol **symbols; -{ - unsigned int count; - bfd_size_type reloc_size; - PTR relocs; - arelent *reloc_cache; - size_t each_size; - struct hp300hpux_reloc *rptr; - unsigned int counter; - arelent *cache_ptr; - - if (asect->relocation) - return true; - - if (asect->flags & SEC_CONSTRUCTOR) - return true; - - if (asect == obj_datasec (abfd)) - { - reloc_size = exec_hdr (abfd)->a_drsize; - goto doit; - } - - if (asect == obj_textsec (abfd)) - { - reloc_size = exec_hdr (abfd)->a_trsize; - goto doit; - } - - bfd_set_error (bfd_error_invalid_operation); - return false; - -doit: - if (bfd_seek (abfd, asect->rel_filepos, SEEK_SET) != 0) - return false; - each_size = obj_reloc_entry_size (abfd); - - count = reloc_size / each_size; - - - reloc_cache = (arelent *) bfd_zalloc (abfd, (size_t) (count * sizeof - (arelent))); - if (!reloc_cache && count != 0) - return false; - - relocs = (PTR) bfd_alloc (abfd, reloc_size); - if (!relocs && reloc_size != 0) - { - bfd_release (abfd, reloc_cache); - return false; - } - - if (bfd_read (relocs, 1, reloc_size, abfd) != reloc_size) - { - bfd_release (abfd, relocs); - bfd_release (abfd, reloc_cache); - return false; - } - - rptr = (struct hp300hpux_reloc *) relocs; - counter = 0; - cache_ptr = reloc_cache; - - for (; counter < count; counter++, rptr++, cache_ptr++) - { - MY (swap_std_reloc_in) (abfd, rptr, cache_ptr, symbols, - bfd_get_symcount (abfd)); - } - - - bfd_release (abfd, relocs); - asect->relocation = reloc_cache; - asect->reloc_count = count; - return true; -} - - -/************************************************************************/ -/* The following functions are identical to functions in aoutx.h except */ -/* they refer to MY(func) rather than NAME(aout,func) and they also */ -/* call aout_32 versions if the input file was generated by gcc */ -/************************************************************************/ - -long aout_32_get_symtab PARAMS ((bfd * abfd, asymbol ** location)); -long aout_32_get_symtab_upper_bound PARAMS ((bfd * abfd)); - -long aout_32_canonicalize_reloc PARAMS ((bfd * abfd, sec_ptr section, - arelent ** relptr, - asymbol ** symbols)); - -long -MY (get_symtab) (abfd, location) - bfd *abfd; - asymbol **location; -{ - unsigned int counter = 0; - aout_symbol_type *symbase; - - if (obj_aout_subformat (abfd) == gnu_encap_format) - return aout_32_get_symtab (abfd, location); - - if (!MY (slurp_symbol_table) (abfd)) - return -1; - - for (symbase = obj_aout_symbols (abfd); counter++ < bfd_get_symcount (abfd);) - *(location++) = (asymbol *) (symbase++); - *location++ = 0; - return bfd_get_symcount (abfd); -} - -long -MY (get_symtab_upper_bound) (abfd) - bfd *abfd; -{ - if (obj_aout_subformat (abfd) == gnu_encap_format) - return aout_32_get_symtab_upper_bound (abfd); - if (!MY (slurp_symbol_table) (abfd)) - return -1; - - return (bfd_get_symcount (abfd) + 1) * (sizeof (aout_symbol_type *)); -} - - - - -long -MY (canonicalize_reloc) (abfd, section, relptr, symbols) - bfd *abfd; - sec_ptr section; - arelent **relptr; - asymbol **symbols; -{ - arelent *tblptr = section->relocation; - unsigned int count; - if (obj_aout_subformat (abfd) == gnu_encap_format) - return aout_32_canonicalize_reloc (abfd, section, relptr, symbols); - - if (!(tblptr || MY (slurp_reloc_table) (abfd, section, symbols))) - return -1; - - if (section->flags & SEC_CONSTRUCTOR) - { - arelent_chain *chain = section->constructor_chain; - for (count = 0; count < section->reloc_count; count++) - { - *relptr++ = &chain->relent; - chain = chain->next; - } - } - else - { - tblptr = section->relocation; - - for (count = 0; count++ < section->reloc_count;) - { - *relptr++ = tblptr++; - } - } - *relptr = 0; - - return section->reloc_count; -} - - -#include "aout-target.h" diff --git a/contrib/gdb/bfd/hppa_stubs.h b/contrib/gdb/bfd/hppa_stubs.h deleted file mode 100644 index ee893e8a57bb5..0000000000000 --- a/contrib/gdb/bfd/hppa_stubs.h +++ /dev/null @@ -1,23 +0,0 @@ -/* HPPA linker stub instructions */ - -/* These are the instructions which the linker may insert into the - code stream when building final executables to handle out-of-range - calls and argument relocations. */ - -#define LDO_M4_R31_R31 0x37ff3ff9 /* ldo -4(%r31),%r31 */ -#define LDIL_R1 0x20200000 /* ldil XXX,%r1 */ -#define BE_SR4_R1 0xe0202000 /* be XXX(%sr4,%r1) */ -#define COPY_R31_R2 0x081f0242 /* copy %r31,%r2 */ -#define BLE_SR4_R0 0xe4002000 /* ble XXX(%sr4,%r0) */ -#define BLE_SR4_R1 0xe4202000 /* ble XXX(%sr4,%r1) */ -#define BV_N_0_R31 0xebe0c002 /* bv,n 0(%r31) */ -#define STW_R31_M8R30 0x6bdf3ff1 /* stw %r31,-8(%r30) */ -#define LDW_M8R30_R31 0x4bdf3ff1 /* ldw -8(%r30),%r31 */ -#define STW_ARG_M16R30 0x6bc03fe1 /* stw %argX,-16(%r30) */ -#define LDW_M16R30_ARG 0x4bc03fe1 /* ldw -12(%r30),%argX */ -#define STW_ARG_M12R30 0x6bc03fe9 /* stw %argX,-16(%r30) */ -#define LDW_M12R30_ARG 0x4bc03fe9 /* ldw -12(%r30),%argX */ -#define FSTW_FARG_M16R30 0x27c11200 /* fstws %fargX,-16(%r30) */ -#define FLDW_M16R30_FARG 0x27c11000 /* fldws -16(%r30),%fargX */ -#define FSTD_FARG_M16R30 0x2fc11200 /* fstds %fargX,-16(%r30) */ -#define FLDD_M16R30_FARG 0x2fc11000 /* fldds -16(%r30),%fargX */ diff --git a/contrib/gdb/bfd/hppabsd-core.c b/contrib/gdb/bfd/hppabsd-core.c deleted file mode 100644 index a76ecc5aad154..0000000000000 --- a/contrib/gdb/bfd/hppabsd-core.c +++ /dev/null @@ -1,305 +0,0 @@ -/* BFD back-end for HPPA BSD core files. - Copyright 1993, 1994 Free Software Foundation, Inc. - - This file is part of BFD, the Binary File Descriptor library. - - 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 2 of the License, 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - - Written by the Center for Software Science at the University of Utah - and by Cygnus Support. - - The core file structure for the Utah 4.3BSD and OSF1 ports on the - PA is a mix between traditional cores and hpux cores -- just - different enough that supporting this format would tend to add - gross hacks to trad-core.c or hpux-core.c. So instead we keep any - gross hacks isolated to this file. */ - - -/* This file can only be compiled on systems which use HPPA-BSD style - core files. - - I would not expect this to be of use to any other host/target, but - you never know. */ - -#include "bfd.h" -#include "sysdep.h" -#include "libbfd.h" - -#if defined (HOST_HPPABSD) - -#include "machine/vmparam.h" - -#include <stdio.h> -#include <sys/types.h> -#include <sys/param.h> -#include <sys/dir.h> -#include <signal.h> -#include <machine/reg.h> -#include <sys/user.h> /* After a.out.h */ -#include <sys/file.h> -#include <errno.h> - -static asection *make_bfd_asection PARAMS ((bfd *, CONST char *, - flagword, bfd_size_type, - file_ptr, unsigned int)); -static asymbol *hppabsd_core_make_empty_symbol PARAMS ((bfd *)); -static const bfd_target *hppabsd_core_core_file_p PARAMS ((bfd *)); -static char *hppabsd_core_core_file_failing_command PARAMS ((bfd *)); -static int hppabsd_core_core_file_failing_signal PARAMS ((bfd *)); -static boolean hppabsd_core_core_file_matches_executable_p - PARAMS ((bfd *, bfd *)); -static void swap_abort PARAMS ((void)); - -/* These are stored in the bfd's tdata. */ - -struct hppabsd_core_struct - { - int sig; - char cmd[MAXCOMLEN + 1]; - asection *data_section; - asection *stack_section; - asection *reg_section; - }; - -#define core_hdr(bfd) ((bfd)->tdata.hppabsd_core_data) -#define core_signal(bfd) (core_hdr(bfd)->sig) -#define core_command(bfd) (core_hdr(bfd)->cmd) -#define core_datasec(bfd) (core_hdr(bfd)->data_section) -#define core_stacksec(bfd) (core_hdr(bfd)->stack_section) -#define core_regsec(bfd) (core_hdr(bfd)->reg_section) - -static asection * -make_bfd_asection (abfd, name, flags, _raw_size, offset, alignment_power) - bfd *abfd; - CONST char *name; - flagword flags; - bfd_size_type _raw_size; - file_ptr offset; - unsigned int alignment_power; -{ - asection *asect; - - asect = bfd_make_section (abfd, name); - if (!asect) - return NULL; - - asect->flags = flags; - asect->_raw_size = _raw_size; - asect->filepos = offset; - asect->alignment_power = alignment_power; - - return asect; -} - -static asymbol * -hppabsd_core_make_empty_symbol (abfd) - bfd *abfd; -{ - asymbol *new = (asymbol *) bfd_zalloc (abfd, sizeof (asymbol)); - if (new) - new->the_bfd = abfd; - return new; -} - -static const bfd_target * -hppabsd_core_core_file_p (abfd) - bfd *abfd; -{ - int val; - struct user u; - struct hppabsd_core_struct *coredata; - int clicksz; - - /* Try to read in the u-area. We will need information from this - to know how to grok the rest of the core structures. */ - val = bfd_read ((void *) &u, 1, sizeof u, abfd); - if (val != sizeof u) - { - if (bfd_get_error () != bfd_error_system_call) - bfd_set_error (bfd_error_wrong_format); - return NULL; - } - - /* Get the page size out of the u structure. This will be different - for PA 1.0 machines and PA 1.1 machines. Yuk! */ - clicksz = u.u_pcb.pcb_pgsz; - - /* clicksz must be a power of two >= 2k. */ - if (clicksz < 0x800 - || clicksz != (clicksz & -clicksz)) - { - bfd_set_error (bfd_error_wrong_format); - return NULL; - } - - - /* Sanity checks. Make sure the size of the core file matches the - the size computed from information within the core itself. */ - { - FILE *stream = bfd_cache_lookup (abfd); - struct stat statbuf; - if (stream == NULL || fstat (fileno (stream), &statbuf) < 0) - { - bfd_set_error (bfd_error_system_call); - return NULL; - } - if (NBPG * (UPAGES + u.u_dsize + u.u_ssize) > statbuf.st_size) - { - bfd_set_error (bfd_error_file_truncated); - return NULL; - } - if (clicksz * (UPAGES + u.u_dsize + u.u_ssize) < statbuf.st_size) - { - /* The file is too big. Maybe it's not a core file - or we otherwise have bad values for u_dsize and u_ssize). */ - bfd_set_error (bfd_error_wrong_format); - return NULL; - } - } - - /* OK, we believe you. You're a core file (sure, sure). */ - - coredata = (struct hppabsd_core_struct *) - bfd_zalloc (abfd, sizeof (struct hppabsd_core_struct)); - if (!coredata) - return NULL; - - /* Make the core data and available via the tdata part of the BFD. */ - abfd->tdata.hppabsd_core_data = coredata; - - /* Create the sections. */ - core_stacksec (abfd) = make_bfd_asection (abfd, ".stack", - SEC_ALLOC + SEC_HAS_CONTENTS, - clicksz * u.u_ssize, - NBPG * (USIZE + KSTAKSIZE) - + clicksz * u.u_dsize, 2); - core_stacksec (abfd)->vma = USRSTACK; - - core_datasec (abfd) = make_bfd_asection (abfd, ".data", - SEC_ALLOC + SEC_LOAD - + SEC_HAS_CONTENTS, - clicksz * u.u_dsize, - NBPG * (USIZE + KSTAKSIZE), 2); - core_datasec (abfd)->vma = UDATASEG; - - core_regsec (abfd) = make_bfd_asection (abfd, ".reg", - SEC_HAS_CONTENTS, - KSTAKSIZE * NBPG, - NBPG * USIZE, 2); - core_regsec (abfd)->vma = 0; - - strncpy (core_command (abfd), u.u_comm, MAXCOMLEN + 1); - core_signal (abfd) = u.u_code; - return abfd->xvec; -} - -static char * -hppabsd_core_core_file_failing_command (abfd) - bfd *abfd; -{ - return core_command (abfd); -} - -/* ARGSUSED */ -static int -hppabsd_core_core_file_failing_signal (abfd) - bfd *abfd; -{ - return core_signal (abfd); -} - -/* ARGSUSED */ -static boolean -hppabsd_core_core_file_matches_executable_p (core_bfd, exec_bfd) - bfd *core_bfd, *exec_bfd; -{ - /* There's no way to know this... */ - return true; -} - - -#define hppabsd_core_get_symtab_upper_bound \ - _bfd_nosymbols_get_symtab_upper_bound -#define hppabsd_core_get_symtab _bfd_nosymbols_get_symtab -#define hppabsd_core_print_symbol _bfd_nosymbols_print_symbol -#define hppabsd_core_get_symbol_info _bfd_nosymbols_get_symbol_info -#define hppabsd_core_bfd_is_local_label _bfd_nosymbols_bfd_is_local_label -#define hppabsd_core_get_lineno _bfd_nosymbols_get_lineno -#define hppabsd_core_find_nearest_line _bfd_nosymbols_find_nearest_line -#define hppabsd_core_bfd_make_debug_symbol _bfd_nosymbols_bfd_make_debug_symbol -#define hppabsd_core_read_minisymbols _bfd_nosymbols_read_minisymbols -#define hppabsd_core_minisymbol_to_symbol _bfd_nosymbols_minisymbol_to_symbol - -/* If somebody calls any byte-swapping routines, shoot them. */ -static void -swap_abort () -{ - /* This way doesn't require any declaration for ANSI to fuck up. */ - abort (); -} - -#define NO_GET ((bfd_vma (*) PARAMS (( const bfd_byte *))) swap_abort ) -#define NO_PUT ((void (*) PARAMS ((bfd_vma, bfd_byte *))) swap_abort ) -#define NO_SIGNED_GET \ - ((bfd_signed_vma (*) PARAMS ((const bfd_byte *))) swap_abort ) - -const bfd_target hppabsd_core_vec = - { - "hppabsd-core", - bfd_target_unknown_flavour, - BFD_ENDIAN_BIG, /* target byte order */ - BFD_ENDIAN_BIG, /* target headers byte order */ - (HAS_RELOC | EXEC_P | /* object flags */ - HAS_LINENO | HAS_DEBUG | - HAS_SYMS | HAS_LOCALS | WP_TEXT | D_PAGED), - (SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD | SEC_RELOC), /* section flags */ - 0, /* symbol prefix */ - ' ', /* ar_pad_char */ - 16, /* ar_max_namelen */ - NO_GET, NO_SIGNED_GET, NO_PUT, /* 64 bit data */ - NO_GET, NO_SIGNED_GET, NO_PUT, /* 32 bit data */ - NO_GET, NO_SIGNED_GET, NO_PUT, /* 16 bit data */ - NO_GET, NO_SIGNED_GET, NO_PUT, /* 64 bit hdrs */ - NO_GET, NO_SIGNED_GET, NO_PUT, /* 32 bit hdrs */ - NO_GET, NO_SIGNED_GET, NO_PUT, /* 16 bit hdrs */ - - { /* bfd_check_format */ - _bfd_dummy_target, /* unknown format */ - _bfd_dummy_target, /* object file */ - _bfd_dummy_target, /* archive */ - hppabsd_core_core_file_p /* a core file */ - }, - { /* bfd_set_format */ - bfd_false, bfd_false, - bfd_false, bfd_false - }, - { /* bfd_write_contents */ - bfd_false, bfd_false, - bfd_false, bfd_false - }, - - BFD_JUMP_TABLE_GENERIC (_bfd_generic), - BFD_JUMP_TABLE_COPY (_bfd_generic), - BFD_JUMP_TABLE_CORE (hppabsd_core), - BFD_JUMP_TABLE_ARCHIVE (_bfd_noarchive), - BFD_JUMP_TABLE_SYMBOLS (hppabsd_core), - BFD_JUMP_TABLE_RELOCS (_bfd_norelocs), - BFD_JUMP_TABLE_WRITE (_bfd_generic), - BFD_JUMP_TABLE_LINK (_bfd_nolink), - BFD_JUMP_TABLE_DYNAMIC (_bfd_nodynamic), - - (PTR) 0 /* backend_data */ -}; -#endif diff --git a/contrib/gdb/bfd/hpux-core.c b/contrib/gdb/bfd/hpux-core.c deleted file mode 100644 index 675a5f8d0bd21..0000000000000 --- a/contrib/gdb/bfd/hpux-core.c +++ /dev/null @@ -1,270 +0,0 @@ -/* BFD back-end for HP/UX core files. - Copyright 1993, 1994 Free Software Foundation, Inc. - Written by Stu Grossman, Cygnus Support. - Converted to back-end form by Ian Lance Taylor, Cygnus SUpport - -This file is part of BFD, the Binary File Descriptor library. - -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 2 of the License, 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ - -/* This file can only be compiled on systems which use HP/UX style - core files. */ - -#include "bfd.h" -#include "sysdep.h" -#include "libbfd.h" - -#if defined (HOST_HPPAHPUX) || defined (HOST_HP300HPUX) - -/* FIXME: sys/core.h doesn't exist for HPUX version 7. HPUX version - 5, 6, and 7 core files seem to be standard trad-core.c type core - files; can we just use trad-core.c in addition to this file? */ - -#include <sys/core.h> -#include <sys/utsname.h> - -#endif /* HOST_HPPAHPUX */ - -#ifdef HOST_HPPABSD - -/* Not a very swift place to put it, but that's where the BSD port - puts them. */ -#include "/hpux/usr/include/sys/core.h" - -#endif /* HOST_HPPABSD */ - -#include <stdio.h> -#include <sys/types.h> -#include <sys/param.h> -#include <sys/dir.h> -#include <signal.h> -#include <machine/reg.h> -#include <sys/user.h> /* After a.out.h */ -#include <sys/file.h> -#include <errno.h> - -/* These are stored in the bfd's tdata */ - -struct hpux_core_struct -{ - int sig; - char cmd[MAXCOMLEN + 1]; -}; - -#define core_hdr(bfd) ((bfd)->tdata.hpux_core_data) -#define core_signal(bfd) (core_hdr(bfd)->sig) -#define core_command(bfd) (core_hdr(bfd)->cmd) - -static asection * -make_bfd_asection (abfd, name, flags, _raw_size, vma, alignment_power) - bfd *abfd; - CONST char *name; - flagword flags; - bfd_size_type _raw_size; - bfd_vma vma; - unsigned int alignment_power; -{ - asection *asect; - - asect = bfd_make_section_anyway (abfd, name); - if (!asect) - return NULL; - - asect->flags = flags; - asect->_raw_size = _raw_size; - asect->vma = vma; - asect->filepos = bfd_tell (abfd); - asect->alignment_power = alignment_power; - - return asect; -} - -static asymbol * -hpux_core_make_empty_symbol (abfd) - bfd *abfd; -{ - asymbol *new = (asymbol *) bfd_zalloc (abfd, sizeof (asymbol)); - if (new) - new->the_bfd = abfd; - return new; -} - -static const bfd_target * -hpux_core_core_file_p (abfd) - bfd *abfd; -{ - core_hdr (abfd) = (struct hpux_core_struct *) - bfd_zalloc (abfd, sizeof (struct hpux_core_struct)); - if (!core_hdr (abfd)) - return NULL; - - while (1) - { - int val; - struct corehead core_header; - - val = bfd_read ((void *) &core_header, 1, sizeof core_header, abfd); - if (val <= 0) - break; - switch (core_header.type) - { - case CORE_KERNEL: - case CORE_FORMAT: - bfd_seek (abfd, core_header.len, SEEK_CUR); /* Just skip this */ - break; - case CORE_EXEC: - { - struct proc_exec proc_exec; - if (bfd_read ((void *) &proc_exec, 1, core_header.len, abfd) - != core_header.len) - break; - strncpy (core_command (abfd), proc_exec.cmd, MAXCOMLEN + 1); - } - break; - case CORE_PROC: - { - struct proc_info proc_info; - if (!make_bfd_asection (abfd, ".reg", - SEC_HAS_CONTENTS, - core_header.len, - (int) &proc_info - (int) & proc_info.hw_regs, - 2)) - return NULL; - - if (bfd_read (&proc_info, 1, core_header.len, abfd) - != core_header.len) - break; - core_signal (abfd) = proc_info.sig; - } - break; - - case CORE_DATA: - case CORE_STACK: - case CORE_TEXT: - case CORE_MMF: - case CORE_SHM: - if (!make_bfd_asection (abfd, ".data", - SEC_ALLOC + SEC_LOAD + SEC_HAS_CONTENTS, - core_header.len, core_header.addr, 2)) - return NULL; - - bfd_seek (abfd, core_header.len, SEEK_CUR); - break; - - default: - /* Falling into here is an error and should prevent this - target from matching. That way systems which use hpux - cores along with other formats can still work. */ - return 0; - } - } - - /* OK, we believe you. You're a core file (sure, sure). */ - - return abfd->xvec; -} - -static char * -hpux_core_core_file_failing_command (abfd) - bfd *abfd; -{ - return core_command (abfd); -} - -/* ARGSUSED */ -static int -hpux_core_core_file_failing_signal (abfd) - bfd *abfd; -{ - return core_signal (abfd); -} - -/* ARGSUSED */ -static boolean -hpux_core_core_file_matches_executable_p (core_bfd, exec_bfd) - bfd *core_bfd, *exec_bfd; -{ - return true; /* FIXME, We have no way of telling at this point */ -} - -#define hpux_core_get_symtab_upper_bound _bfd_nosymbols_get_symtab_upper_bound -#define hpux_core_get_symtab _bfd_nosymbols_get_symtab -#define hpux_core_print_symbol _bfd_nosymbols_print_symbol -#define hpux_core_get_symbol_info _bfd_nosymbols_get_symbol_info -#define hpux_core_bfd_is_local_label _bfd_nosymbols_bfd_is_local_label -#define hpux_core_get_lineno _bfd_nosymbols_get_lineno -#define hpux_core_find_nearest_line _bfd_nosymbols_find_nearest_line -#define hpux_core_bfd_make_debug_symbol _bfd_nosymbols_bfd_make_debug_symbol -#define hpux_core_read_minisymbols _bfd_nosymbols_read_minisymbols -#define hpux_core_minisymbol_to_symbol _bfd_nosymbols_minisymbol_to_symbol - -/* If somebody calls any byte-swapping routines, shoot them. */ -void -swap_abort() -{ - abort(); /* This way doesn't require any declaration for ANSI to fuck up */ -} -#define NO_GET ((bfd_vma (*) PARAMS (( const bfd_byte *))) swap_abort ) -#define NO_PUT ((void (*) PARAMS ((bfd_vma, bfd_byte *))) swap_abort ) -#define NO_SIGNED_GET \ - ((bfd_signed_vma (*) PARAMS ((const bfd_byte *))) swap_abort ) - -const bfd_target hpux_core_vec = - { - "hpux-core", - bfd_target_unknown_flavour, - BFD_ENDIAN_BIG, /* target byte order */ - BFD_ENDIAN_BIG, /* target headers byte order */ - (HAS_RELOC | EXEC_P | /* object flags */ - HAS_LINENO | HAS_DEBUG | - HAS_SYMS | HAS_LOCALS | WP_TEXT | D_PAGED), - (SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD | SEC_RELOC), /* section flags */ - 0, /* symbol prefix */ - ' ', /* ar_pad_char */ - 16, /* ar_max_namelen */ - NO_GET, NO_SIGNED_GET, NO_PUT, /* 64 bit data */ - NO_GET, NO_SIGNED_GET, NO_PUT, /* 32 bit data */ - NO_GET, NO_SIGNED_GET, NO_PUT, /* 16 bit data */ - NO_GET, NO_SIGNED_GET, NO_PUT, /* 64 bit hdrs */ - NO_GET, NO_SIGNED_GET, NO_PUT, /* 32 bit hdrs */ - NO_GET, NO_SIGNED_GET, NO_PUT, /* 16 bit hdrs */ - - { /* bfd_check_format */ - _bfd_dummy_target, /* unknown format */ - _bfd_dummy_target, /* object file */ - _bfd_dummy_target, /* archive */ - hpux_core_core_file_p /* a core file */ - }, - { /* bfd_set_format */ - bfd_false, bfd_false, - bfd_false, bfd_false - }, - { /* bfd_write_contents */ - bfd_false, bfd_false, - bfd_false, bfd_false - }, - - BFD_JUMP_TABLE_GENERIC (_bfd_generic), - BFD_JUMP_TABLE_COPY (_bfd_generic), - BFD_JUMP_TABLE_CORE (hpux_core), - BFD_JUMP_TABLE_ARCHIVE (_bfd_noarchive), - BFD_JUMP_TABLE_SYMBOLS (hpux_core), - BFD_JUMP_TABLE_RELOCS (_bfd_norelocs), - BFD_JUMP_TABLE_WRITE (_bfd_generic), - BFD_JUMP_TABLE_LINK (_bfd_nolink), - BFD_JUMP_TABLE_DYNAMIC (_bfd_nodynamic), - - (PTR) 0 /* backend_data */ -}; diff --git a/contrib/gdb/bfd/i386aout.c b/contrib/gdb/bfd/i386aout.c deleted file mode 100644 index 0801832d16d7b..0000000000000 --- a/contrib/gdb/bfd/i386aout.c +++ /dev/null @@ -1,68 +0,0 @@ -/* BFD back-end for i386 a.out binaries. - Copyright 1990, 1991, 1992 Free Software Foundation, Inc. - -This file is part of BFD, the Binary File Descriptor library. - -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 2 of the License, 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ - - -/* The only 386 aout system we have here is GO32 from DJ. - These numbers make BFD work with that. If your aout 386 system - doesn't work with these, we'll have to split them into different - files. Send me (sac@cygnus.com) the runes to make it work on your - system, and I'll stick it in for the next release. */ - -#define N_HEADER_IN_TEXT(x) 0 -#define BYTES_IN_WORD 4 - -#define N_TXTOFF(x) 0x20 -#define N_TXTADDR(x) (N_MAGIC(x)==ZMAGIC ? 0x1020 : 0) - -#define N_TXTSIZE(x) ((x).a_text) -#if 0 -#define N_DATADDR(x) (N_MAGIC(x)==OMAGIC? (N_TXTADDR(x)+(x).a_text) : (SEGMENT_SIZE + ((0x1020+(x).a_text-1) & ~(SEGMENT_SIZE-1)))) -#define NOSUBEXECB - -#endif -#define TARGET_PAGE_SIZE 4096 -#define SEGMENT_SIZE 0x400000 -#define DEFAULT_ARCH bfd_arch_i386 - -#define MY(OP) CAT(i386aout_,OP) -#define TARGETNAME "a.out-i386" -#define NO_WRITE_HEADER_KLUDGE 1 - -#include "bfd.h" -#include "sysdep.h" -#include "libbfd.h" -#include "libaout.h" -static boolean MY(set_sizes)(); -#define MY_backend_data &MY(backend_data) -static CONST struct aout_backend_data MY(backend_data) = { - 0, /* zmagic contiguous */ - 1, /* text incl header */ - 0, /* exec_hdr_flags */ - 0, /* text vma? */ - MY(set_sizes), - 1, /* exec header not counted */ - 0, /* add_dynamic_symbols */ - 0, /* add_one_symbol */ - 0, /* link_dynamic_object */ - 0, /* write_dynamic_symbol */ - 0, /* check_dynamic_reloc */ - 0 /* finish_dynamic_link */ -}; - -#include "aout-target.h" diff --git a/contrib/gdb/bfd/i386bsd.c b/contrib/gdb/bfd/i386bsd.c deleted file mode 100644 index 2328fe3e9e8cf..0000000000000 --- a/contrib/gdb/bfd/i386bsd.c +++ /dev/null @@ -1,46 +0,0 @@ -/* BFD back-end for i386 a.out binaries under BSD. - Copyright (C) 1990, 1991, 1992 Free Software Foundation, Inc. - -This file is part of BFD, the Binary File Descriptor library. - -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 2 of the License, 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ - -/* This data should be correct for the format used under all the various - BSD ports for 386 machines. */ - -#define BYTES_IN_WORD 4 - -/* ZMAGIC files never have the header in the text. */ -#define N_HEADER_IN_TEXT(x) 0 - -/* ZMAGIC files start at address 0. This does not apply to QMAGIC. */ -#define TEXT_START_ADDR 0 -#define N_SHARED_LIB(x) 0 - -#define TARGET_PAGE_SIZE 4096 -#define SEGMENT_SIZE TARGET_PAGE_SIZE - -#define DEFAULT_ARCH bfd_arch_i386 -#define MACHTYPE_OK(mtype) ((mtype) == M_386 || (mtype) == M_UNKNOWN) - -#define MY(OP) CAT(i386bsd_,OP) -#define TARGETNAME "a.out-i386-bsd" - -#include "bfd.h" -#include "sysdep.h" -#include "libbfd.h" -#include "libaout.h" - -#include "aout-target.h" diff --git a/contrib/gdb/bfd/i386dynix.c b/contrib/gdb/bfd/i386dynix.c deleted file mode 100644 index ff50a1450a1cf..0000000000000 --- a/contrib/gdb/bfd/i386dynix.c +++ /dev/null @@ -1,80 +0,0 @@ -/* BFD back-end for i386 a.out binaries under dynix. - Copyright (C) 1994, 1995 Free Software Foundation, Inc. - -This file is part of BFD, the Binary File Descriptor library. - -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 2 of the License, 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ - -/* This BFD is currently only tested with gdb, writing object files - may not work. */ - -#define BYTES_IN_WORD 4 - -#define TEXT_START_ADDR 4096 -#define TARGET_PAGE_SIZE 4096 -#define SEGMENT_SIZE TARGET_PAGE_SIZE - -#include "aout/dynix3.h" - -#define DEFAULT_ARCH bfd_arch_i386 -#define MACHTYPE_OK(mtype) ((mtype) == M_386 || (mtype) == M_UNKNOWN) - -#define MY(OP) CAT(i386dynix_,OP) -#define TARGETNAME "a.out-i386-dynix" -#define NAME(x,y) CAT3(i386dynix,_32_,y) -#define ARCH_SIZE 32 -#define NAME_swap_exec_header_in NAME(i386dynix_32_,swap_exec_header_in) -#define MY_get_section_contents aout_32_get_section_contents - -/* aoutx.h requires definitions for NMAGIC, BMAGIC and QMAGIC. */ -#define NMAGIC 0 -#define BMAGIC OMAGIC -#define QMAGIC XMAGIC - -#include "aoutx.h" - -/* (Ab)use some fields in the internal exec header to be able to read - executables that contain shared data. */ - -#define a_shdata a_tload -#define a_shdrsize a_dload - -void -i386dynix_32_swap_exec_header_in (abfd, raw_bytes, execp) - bfd *abfd; - struct external_exec *raw_bytes; - struct internal_exec *execp; -{ - struct external_exec *bytes = (struct external_exec *)raw_bytes; - - /* The internal_exec structure has some fields that are unused in this - configuration (IE for i960), so ensure that all such uninitialized - fields are zero'd out. There are places where two of these structs - are memcmp'd, and thus the contents do matter. */ - memset ((PTR) execp, 0, sizeof (struct internal_exec)); - /* Now fill in fields in the execp, from the bytes in the raw data. */ - execp->a_info = bfd_h_get_32 (abfd, bytes->e_info); - execp->a_text = GET_WORD (abfd, bytes->e_text); - execp->a_data = GET_WORD (abfd, bytes->e_data); - execp->a_bss = GET_WORD (abfd, bytes->e_bss); - execp->a_syms = GET_WORD (abfd, bytes->e_syms); - execp->a_entry = GET_WORD (abfd, bytes->e_entry); - execp->a_trsize = GET_WORD (abfd, bytes->e_trsize); - execp->a_drsize = GET_WORD (abfd, bytes->e_drsize); - execp->a_shdata = GET_WORD (abfd, bytes->e_shdata); - execp->a_shdrsize = GET_WORD (abfd, bytes->e_shdrsize); -} - -#include "aout-target.h" diff --git a/contrib/gdb/bfd/i386freebsd.c b/contrib/gdb/bfd/i386freebsd.c deleted file mode 100644 index 7a6371b5df69a..0000000000000 --- a/contrib/gdb/bfd/i386freebsd.c +++ /dev/null @@ -1,33 +0,0 @@ -/* BFD back-end for FreeBSD/386 a.out-ish binaries. - Copyright (C) 1990, 1991, 1992, 1996 Free Software Foundation, Inc. - -This file is part of BFD, the Binary File Descriptor library. - -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 2 of the License, 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ - -#define BYTES_IN_WORD 4 -#undef TARGET_IS_BIG_ENDIAN_P - -#define TARGET_PAGE_SIZE 4096 -#define SEGMENT_SIZE TARGET_PAGE_SIZE - -#define DEFAULT_ARCH bfd_arch_i386 -#define MACHTYPE_OK(mtype) ((mtype) == M_386_NETBSD || (mtype) == M_UNKNOWN) - -#define MY(OP) CAT(i386freebsd_,OP) -/* This needs to start with a.out so GDB knows it is an a.out variant. */ -#define TARGETNAME "a.out-i386-freebsd" - -#include "freebsd.h" diff --git a/contrib/gdb/bfd/i386linux.c b/contrib/gdb/bfd/i386linux.c deleted file mode 100644 index a45f97c42f80f..0000000000000 --- a/contrib/gdb/bfd/i386linux.c +++ /dev/null @@ -1,762 +0,0 @@ -/* BFD back-end for linux flavored i386 a.out binaries. - Copyright (C) 1992, 93, 94, 95, 1996 Free Software Foundation, Inc. - -This file is part of BFD, the Binary File Descriptor library. - -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 2 of the License, 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ - -#define TARGET_PAGE_SIZE 4096 -#define ZMAGIC_DISK_BLOCK_SIZE 1024 -#define SEGMENT_SIZE TARGET_PAGE_SIZE -#define TEXT_START_ADDR 0x0 -#define N_SHARED_LIB(x) 0 -#define BYTES_IN_WORD 4 - -#include "bfd.h" -#include "sysdep.h" -#include "libbfd.h" -#include "aout/aout64.h" -#include "aout/stab_gnu.h" -#include "aout/ar.h" -#include "libaout.h" /* BFD a.out internal data structures */ - -#define DEFAULT_ARCH bfd_arch_i386 -#define MY(OP) CAT(i386linux_,OP) -#define TARGETNAME "a.out-i386-linux" - -extern const bfd_target MY(vec); - -/* We always generate QMAGIC files in preference to ZMAGIC files. It - would be possible to make this a linker option, if that ever - becomes important. */ - -static void MY_final_link_callback - PARAMS ((bfd *, file_ptr *, file_ptr *, file_ptr *)); - -static boolean -i386linux_bfd_final_link (abfd, info) - bfd *abfd; - struct bfd_link_info *info; -{ - obj_aout_subformat (abfd) = q_magic_format; - return NAME(aout,final_link) (abfd, info, MY_final_link_callback); -} - -#define MY_bfd_final_link i386linux_bfd_final_link - -/* Set the machine type correctly. */ - -static boolean -i386linux_write_object_contents (abfd) - bfd *abfd; -{ - struct external_exec exec_bytes; - struct internal_exec *execp = exec_hdr (abfd); - - N_SET_MACHTYPE (*execp, M_386); - - obj_reloc_entry_size (abfd) = RELOC_STD_SIZE; - - WRITE_HEADERS(abfd, execp); - - return true; -} - -#define MY_write_object_contents i386linux_write_object_contents - -/* Code to link against Linux a.out shared libraries. */ - -/* See if a symbol name is a reference to the global offset table. */ - -#ifndef GOT_REF_PREFIX -#define GOT_REF_PREFIX "__GOT_" -#endif - -#define IS_GOT_SYM(name) \ - (strncmp (name, GOT_REF_PREFIX, sizeof GOT_REF_PREFIX - 1) == 0) - -/* See if a symbol name is a reference to the procedure linkage table. */ - -#ifndef PLT_REF_PREFIX -#define PLT_REF_PREFIX "__PLT_" -#endif - -#define IS_PLT_SYM(name) \ - (strncmp (name, PLT_REF_PREFIX, sizeof PLT_REF_PREFIX - 1) == 0) - -/* This string is used to generate specialized error messages. */ - -#ifndef NEEDS_SHRLIB -#define NEEDS_SHRLIB "__NEEDS_SHRLIB_" -#endif - -/* This special symbol is a set vector that contains a list of - pointers to fixup tables. It will be present in any dynamicly - linked file. The linker generated fixup table should also be added - to the list, and it should always appear in the second slot (the - first one is a dummy with a magic number that is defined in - crt0.o). */ - -#ifndef SHARABLE_CONFLICTS -#define SHARABLE_CONFLICTS "__SHARABLE_CONFLICTS__" -#endif - -/* We keep a list of fixups. The terminology is a bit strange, but - each fixup contains two 32 bit numbers. A regular fixup contains - an address and a pointer, and at runtime we should store the - address at the location pointed to by the pointer. A builtin fixup - contains two pointers, and we should read the address using one - pointer and store it at the location pointed to by the other - pointer. Builtin fixups come into play when we have duplicate - __GOT__ symbols for the same variable. The builtin fixup will copy - the GOT pointer from one over into the other. */ - -struct fixup -{ - struct fixup *next; - struct linux_link_hash_entry *h; - bfd_vma value; - - /* Nonzero if this is a jump instruction that needs to be fixed, - zero if this is just a pointer */ - char jump; - - char builtin; -}; - -/* We don't need a special hash table entry structure, but we do need - to keep some information between linker passes, so we use a special - hash table. */ - -struct linux_link_hash_entry -{ - struct aout_link_hash_entry root; -}; - -struct linux_link_hash_table -{ - struct aout_link_hash_table root; - - /* First dynamic object found in link. */ - bfd *dynobj; - - /* Number of fixups. */ - size_t fixup_count; - - /* Number of builtin fixups. */ - size_t local_builtins; - - /* List of fixups. */ - struct fixup *fixup_list; -}; - -static struct bfd_hash_entry *linux_link_hash_newfunc - PARAMS ((struct bfd_hash_entry *, struct bfd_hash_table *, const char *)); -static struct bfd_link_hash_table *linux_link_hash_table_create - PARAMS ((bfd *)); -static struct fixup *new_fixup - PARAMS ((struct bfd_link_info *, struct linux_link_hash_entry *, - bfd_vma, int)); -static boolean linux_link_create_dynamic_sections - PARAMS ((bfd *, struct bfd_link_info *)); -static boolean linux_add_one_symbol - PARAMS ((struct bfd_link_info *, bfd *, const char *, flagword, asection *, - bfd_vma, const char *, boolean, boolean, - struct bfd_link_hash_entry **)); -static boolean linux_tally_symbols - PARAMS ((struct linux_link_hash_entry *, PTR)); -static boolean linux_finish_dynamic_link - PARAMS ((bfd *, struct bfd_link_info *)); - -/* Routine to create an entry in an Linux link hash table. */ - -static struct bfd_hash_entry * -linux_link_hash_newfunc (entry, table, string) - struct bfd_hash_entry *entry; - struct bfd_hash_table *table; - const char *string; -{ - struct linux_link_hash_entry *ret = (struct linux_link_hash_entry *) entry; - - /* Allocate the structure if it has not already been allocated by a - subclass. */ - if (ret == (struct linux_link_hash_entry *) NULL) - ret = ((struct linux_link_hash_entry *) - bfd_hash_allocate (table, sizeof (struct linux_link_hash_entry))); - if (ret == NULL) - return (struct bfd_hash_entry *) ret; - - /* Call the allocation method of the superclass. */ - ret = ((struct linux_link_hash_entry *) - NAME(aout,link_hash_newfunc) ((struct bfd_hash_entry *) ret, - table, string)); - if (ret != NULL) - { - /* Set local fields; there aren't any. */ - } - - return (struct bfd_hash_entry *) ret; -} - -/* Create a Linux link hash table. */ - -static struct bfd_link_hash_table * -linux_link_hash_table_create (abfd) - bfd *abfd; -{ - struct linux_link_hash_table *ret; - - ret = ((struct linux_link_hash_table *) - bfd_alloc (abfd, sizeof (struct linux_link_hash_table))); - if (ret == (struct linux_link_hash_table *) NULL) - return (struct bfd_link_hash_table *) NULL; - if (! NAME(aout,link_hash_table_init) (&ret->root, abfd, - linux_link_hash_newfunc)) - { - free (ret); - return (struct bfd_link_hash_table *) NULL; - } - - ret->dynobj = NULL; - ret->fixup_count = 0; - ret->local_builtins = 0; - ret->fixup_list = NULL; - - return &ret->root.root; -} - -/* Look up an entry in a Linux link hash table. */ - -#define linux_link_hash_lookup(table, string, create, copy, follow) \ - ((struct linux_link_hash_entry *) \ - aout_link_hash_lookup (&(table)->root, (string), (create), (copy),\ - (follow))) - -/* Traverse a Linux link hash table. */ - -#define linux_link_hash_traverse(table, func, info) \ - (aout_link_hash_traverse \ - (&(table)->root, \ - (boolean (*) PARAMS ((struct aout_link_hash_entry *, PTR))) (func), \ - (info))) - -/* Get the Linux link hash table from the info structure. This is - just a cast. */ - -#define linux_hash_table(p) ((struct linux_link_hash_table *) ((p)->hash)) - -/* Store the information for a new fixup. */ - -static struct fixup * -new_fixup (info, h, value, builtin) - struct bfd_link_info *info; - struct linux_link_hash_entry *h; - bfd_vma value; - int builtin; -{ - struct fixup *f; - - f = (struct fixup *) bfd_hash_allocate (&info->hash->table, - sizeof (struct fixup)); - if (f == NULL) - return f; - f->next = linux_hash_table (info)->fixup_list; - linux_hash_table (info)->fixup_list = f; - f->h = h; - f->value = value; - f->builtin = builtin; - f->jump = 0; - ++linux_hash_table (info)->fixup_count; - return f; -} - -/* We come here once we realize that we are going to link to a shared - library. We need to create a special section that contains the - fixup table, and we ultimately need to add a pointer to this into - the set vector for SHARABLE_CONFLICTS. At this point we do not - know the size of the section, but that's OK - we just need to - create it for now. */ - -static boolean -linux_link_create_dynamic_sections (abfd, info) - bfd *abfd; - struct bfd_link_info *info; -{ - flagword flags; - register asection *s; - - /* Note that we set the SEC_IN_MEMORY flag. */ - flags = SEC_ALLOC | SEC_LOAD | SEC_HAS_CONTENTS | SEC_IN_MEMORY; - - /* We choose to use the name ".linux-dynamic" for the fixup table. - Why not? */ - s = bfd_make_section (abfd, ".linux-dynamic"); - if (s == NULL - || ! bfd_set_section_flags (abfd, s, flags) - || ! bfd_set_section_alignment (abfd, s, 2)) - return false; - s->_raw_size = 0; - s->contents = 0; - - return true; -} - -/* Function to add a single symbol to the linker hash table. This is - a wrapper around _bfd_generic_link_add_one_symbol which handles the - tweaking needed for dynamic linking support. */ - -static boolean -linux_add_one_symbol (info, abfd, name, flags, section, value, string, - copy, collect, hashp) - struct bfd_link_info *info; - bfd *abfd; - const char *name; - flagword flags; - asection *section; - bfd_vma value; - const char *string; - boolean copy; - boolean collect; - struct bfd_link_hash_entry **hashp; -{ - struct linux_link_hash_entry *h; - boolean insert; - - /* Look up and see if we already have this symbol in the hash table. - If we do, and the defining entry is from a shared library, we - need to create the dynamic sections. - - FIXME: What if abfd->xvec != info->hash->creator? We may want to - be able to link Linux a.out and ELF objects together, but serious - confusion is possible. */ - - insert = false; - - if (! info->relocateable - && linux_hash_table (info)->dynobj == NULL - && strcmp (name, SHARABLE_CONFLICTS) == 0 - && (flags & BSF_CONSTRUCTOR) != 0 - && abfd->xvec == info->hash->creator) - { - if (! linux_link_create_dynamic_sections (abfd, info)) - return false; - linux_hash_table (info)->dynobj = abfd; - insert = true; - } - - if (bfd_is_abs_section (section) - && abfd->xvec == info->hash->creator) - { - h = linux_link_hash_lookup (linux_hash_table (info), name, false, - false, false); - if (h != NULL - && (h->root.root.type == bfd_link_hash_defined - || h->root.root.type == bfd_link_hash_defweak)) - { - struct fixup *f; - - if (hashp != NULL) - *hashp = (struct bfd_link_hash_entry *) h; - - f = new_fixup (info, h, value, ! IS_PLT_SYM (name)); - if (f == NULL) - return false; - f->jump = IS_PLT_SYM (name); - - return true; - } - } - - /* Do the usual procedure for adding a symbol. */ - if (! _bfd_generic_link_add_one_symbol (info, abfd, name, flags, section, - value, string, copy, collect, - hashp)) - return false; - - /* Insert a pointer to our table in the set vector. The dynamic - linker requires this information */ - if (insert) - { - asection *s; - - /* Here we do our special thing to add the pointer to the - dynamic section in the SHARABLE_CONFLICTS set vector. */ - s = bfd_get_section_by_name (linux_hash_table (info)->dynobj, - ".linux-dynamic"); - BFD_ASSERT (s != NULL); - - if (! (_bfd_generic_link_add_one_symbol - (info, linux_hash_table (info)->dynobj, SHARABLE_CONFLICTS, - BSF_GLOBAL | BSF_CONSTRUCTOR, s, 0, NULL, false, false, NULL))) - return false; - } - - return true; -} - -/* We will crawl the hash table and come here for every global symbol. - We will examine each entry and see if there are indications that we - need to add a fixup. There are two possible cases - one is where - you have duplicate definitions of PLT or GOT symbols - these will - have already been caught and added as "builtin" fixups. If we find - that the corresponding non PLT/GOT symbol is also present, we - convert it to a regular fixup instead. - - This function is called via linux_link_hash_traverse. */ - -static boolean -linux_tally_symbols (h, data) - struct linux_link_hash_entry *h; - PTR data; -{ - struct bfd_link_info *info = (struct bfd_link_info *) data; - struct fixup *f, *f1; - int is_plt; - struct linux_link_hash_entry *h1, *h2; - boolean exists; - - if (h->root.root.type == bfd_link_hash_undefined - && strncmp (h->root.root.root.string, NEEDS_SHRLIB, - sizeof NEEDS_SHRLIB - 1) == 0) - { - const char *name; - char *p; - char *alloc = NULL; - - name = h->root.root.root.string + sizeof NEEDS_SHRLIB - 1; - p = strrchr (name, '_'); - if (p != NULL) - alloc = (char *) bfd_malloc (strlen (name) + 1); - - if (p == NULL || alloc == NULL) - (*_bfd_error_handler) ("Output file requires shared library `%s'\n", - name); - else - { - strcpy (alloc, name); - p = strrchr (alloc, '_'); - *p++ = '\0'; - (*_bfd_error_handler) - ("Output file requires shared library `%s.so.%s'\n", - alloc, p); - free (alloc); - } - - abort (); - } - - /* If this symbol is not a PLT/GOT, we do not even need to look at it */ - is_plt = IS_PLT_SYM (h->root.root.root.string); - - if (is_plt || IS_GOT_SYM (h->root.root.root.string)) - { - /* Look up this symbol twice. Once just as a regular lookup, - and then again following all of the indirect links until we - reach a real symbol. */ - h1 = linux_link_hash_lookup (linux_hash_table (info), - (h->root.root.root.string - + sizeof PLT_REF_PREFIX - 1), - false, false, true); - /* h2 does not follow indirect symbols. */ - h2 = linux_link_hash_lookup (linux_hash_table (info), - (h->root.root.root.string - + sizeof PLT_REF_PREFIX - 1), - false, false, false); - - /* The real symbol must exist but if it is also an ABS symbol, - there is no need to have a fixup. This is because they both - came from the same library. If on the other hand, we had to - use an indirect symbol to get to the real symbol, we add the - fixup anyway, since there are cases where these symbols come - from different shared libraries */ - if (h1 != NULL - && (((h1->root.root.type == bfd_link_hash_defined - || h1->root.root.type == bfd_link_hash_defweak) - && ! bfd_is_abs_section (h1->root.root.u.def.section)) - || h2->root.root.type == bfd_link_hash_indirect)) - { - /* See if there is a "builtin" fixup already present - involving this symbol. If so, convert it to a regular - fixup. In the end, this relaxes some of the requirements - about the order of performing fixups. */ - exists = false; - for (f1 = linux_hash_table (info)->fixup_list; - f1 != NULL; - f1 = f1->next) - { - if ((f1->h != h && f1->h != h1) - || (! f1->builtin && ! f1->jump)) - continue; - if (f1->h == h1) - exists = true; - if (! exists - && bfd_is_abs_section (h->root.root.u.def.section)) - { - f = new_fixup (info, h1, f1->h->root.root.u.def.value, 0); - f->jump = is_plt; - } - f1->h = h1; - f1->jump = is_plt; - f1->builtin = 0; - exists = true; - } - if (! exists - && bfd_is_abs_section (h->root.root.u.def.section)) - { - f = new_fixup (info, h1, h->root.root.u.def.value, 0); - if (f == NULL) - { - /* FIXME: No way to return error. */ - abort (); - } - f->jump = is_plt; - } - } - - /* Quick and dirty way of stripping these symbols from the - symtab. */ - if (bfd_is_abs_section (h->root.root.u.def.section)) - h->root.written = true; - } - - return true; -} - -/* This is called to set the size of the .linux-dynamic section is. - It is called by the Linux linker emulation before_allocation - routine. We have finished reading all of the input files, and now - we just scan the hash tables to find out how many additional fixups - are required. */ - -boolean -bfd_i386linux_size_dynamic_sections (output_bfd, info) - bfd *output_bfd; - struct bfd_link_info *info; -{ - struct fixup *f; - asection *s; - - if (output_bfd->xvec != &MY(vec)) - return true; - - /* First find the fixups... */ - linux_link_hash_traverse (linux_hash_table (info), - linux_tally_symbols, - (PTR) info); - - /* If there are builtin fixups, leave room for a marker. This is - used by the dynamic linker so that it knows that all that follow - are builtin fixups instead of regular fixups. */ - for (f = linux_hash_table (info)->fixup_list; f != NULL; f = f->next) - { - if (f->builtin) - { - ++linux_hash_table (info)->fixup_count; - ++linux_hash_table (info)->local_builtins; - break; - } - } - - if (linux_hash_table (info)->dynobj == NULL) - { - if (linux_hash_table (info)->fixup_count > 0) - abort (); - return true; - } - - /* Allocate memory for our fixup table. We will fill it in later. */ - s = bfd_get_section_by_name (linux_hash_table (info)->dynobj, - ".linux-dynamic"); - if (s != NULL) - { - s->_raw_size = 8 + linux_hash_table (info)->fixup_count * 8; - s->contents = (bfd_byte *) bfd_alloc (output_bfd, s->_raw_size); - if (s->contents == NULL) - return false; - memset (s->contents, 0, (size_t) s->_raw_size); - } - - return true; -} - -/* We come here once we are ready to actually write the fixup table to - the output file. Scan the fixup tables and so forth and generate - the stuff we need. */ - -static boolean -linux_finish_dynamic_link (output_bfd, info) - bfd *output_bfd; - struct bfd_link_info *info; -{ - asection *s, *os, *is; - bfd_byte *fixup_table; - struct linux_link_hash_entry *h; - struct fixup *f; - unsigned int new_addr; - int section_offset; - unsigned int fixups_written; - - if (linux_hash_table (info)->dynobj == NULL) - return true; - - s = bfd_get_section_by_name (linux_hash_table (info)->dynobj, - ".linux-dynamic"); - BFD_ASSERT (s != NULL); - os = s->output_section; - fixups_written = 0; - -#ifdef LINUX_LINK_DEBUG - printf ("Fixup table file offset: %x VMA: %x\n", - os->filepos + s->output_offset, - os->vma + s->output_offset); -#endif - - fixup_table = s->contents; - bfd_put_32 (output_bfd, linux_hash_table (info)->fixup_count, fixup_table); - fixup_table += 4; - - /* Fill in fixup table. */ - for (f = linux_hash_table (info)->fixup_list; f != NULL; f = f->next) - { - if (f->builtin) - continue; - - if (f->h->root.root.type != bfd_link_hash_defined - && f->h->root.root.type != bfd_link_hash_defweak) - { - (*_bfd_error_handler) - ("Symbol %s not defined for fixups\n", - f->h->root.root.root.string); - continue; - } - - is = f->h->root.root.u.def.section; - section_offset = is->output_section->vma + is->output_offset; - new_addr = f->h->root.root.u.def.value + section_offset; - -#ifdef LINUX_LINK_DEBUG - printf ("Fixup(%d) %s: %x %x\n",f->jump, f->h->root.root.string, - new_addr, f->value); -#endif - - if (f->jump) - { - /* Relative address */ - new_addr = new_addr - (f->value + 5); - bfd_put_32 (output_bfd, new_addr, fixup_table); - fixup_table += 4; - bfd_put_32 (output_bfd, f->value + 1, fixup_table); - fixup_table += 4; - } - else - { - bfd_put_32 (output_bfd, new_addr, fixup_table); - fixup_table += 4; - bfd_put_32 (output_bfd, f->value, fixup_table); - fixup_table += 4; - } - ++fixups_written; - } - - if (linux_hash_table (info)->local_builtins != 0) - { - /* Special marker so we know to switch to the other type of fixup */ - bfd_put_32 (output_bfd, 0, fixup_table); - fixup_table += 4; - bfd_put_32 (output_bfd, 0, fixup_table); - fixup_table += 4; - ++fixups_written; - for (f = linux_hash_table (info)->fixup_list; f != NULL; f = f->next) - { - if (! f->builtin) - continue; - - if (f->h->root.root.type != bfd_link_hash_defined - && f->h->root.root.type != bfd_link_hash_defweak) - { - (*_bfd_error_handler) - ("Symbol %s not defined for fixups\n", - f->h->root.root.root.string); - continue; - } - - is = f->h->root.root.u.def.section; - section_offset = is->output_section->vma + is->output_offset; - new_addr = f->h->root.root.u.def.value + section_offset; - -#ifdef LINUX_LINK_DEBUG - printf ("Fixup(B) %s: %x %x\n", f->h->root.root.string, - new_addr, f->value); -#endif - - bfd_put_32 (output_bfd, new_addr, fixup_table); - fixup_table += 4; - bfd_put_32 (output_bfd, f->value, fixup_table); - fixup_table += 4; - ++fixups_written; - } - } - - if (linux_hash_table (info)->fixup_count != fixups_written) - { - (*_bfd_error_handler) ("Warning: fixup count mismatch\n"); - while (linux_hash_table (info)->fixup_count > fixups_written) - { - bfd_put_32 (output_bfd, 0, fixup_table); - fixup_table += 4; - bfd_put_32 (output_bfd, 0, fixup_table); - fixup_table += 4; - ++fixups_written; - } - } - - h = linux_link_hash_lookup (linux_hash_table (info), - "__BUILTIN_FIXUPS__", - false, false, false); - - if (h != NULL - && (h->root.root.type == bfd_link_hash_defined - || h->root.root.type == bfd_link_hash_defweak)) - { - is = h->root.root.u.def.section; - section_offset = is->output_section->vma + is->output_offset; - new_addr = h->root.root.u.def.value + section_offset; - -#ifdef LINUX_LINK_DEBUG - printf ("Builtin fixup table at %x\n", new_addr); -#endif - - bfd_put_32 (output_bfd, new_addr, fixup_table); - } - else - bfd_put_32 (output_bfd, 0, fixup_table); - - if (bfd_seek (output_bfd, os->filepos + s->output_offset, SEEK_SET) != 0) - return false; - - if (bfd_write ((PTR) s->contents, 1, s->_raw_size, output_bfd) - != s->_raw_size) - return false; - - return true; -} - -#define MY_bfd_link_hash_table_create linux_link_hash_table_create -#define MY_add_one_symbol linux_add_one_symbol -#define MY_finish_dynamic_link linux_finish_dynamic_link - -#define MY_zmagic_contiguous 1 - -#include "aout-target.h" diff --git a/contrib/gdb/bfd/i386lynx.c b/contrib/gdb/bfd/i386lynx.c deleted file mode 100644 index 2381cff02b1ad..0000000000000 --- a/contrib/gdb/bfd/i386lynx.c +++ /dev/null @@ -1,563 +0,0 @@ -/* BFD back-end for i386 a.out binaries under LynxOS. - Copyright (C) 1990, 1991, 1992 Free Software Foundation, Inc. - -This file is part of BFD, the Binary File Descriptor library. - -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 2 of the License, 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ - -#define BYTES_IN_WORD 4 -#define N_SHARED_LIB(x) 0 - -#define TEXT_START_ADDR 0 -#define TARGET_PAGE_SIZE 4096 -#define SEGMENT_SIZE TARGET_PAGE_SIZE -#define DEFAULT_ARCH bfd_arch_i386 - -#define MY(OP) CAT(i386lynx_aout_,OP) -#define TARGETNAME "a.out-i386-lynx" - -#include "bfd.h" -#include "sysdep.h" -#include "libbfd.h" - -#ifndef WRITE_HEADERS -#define WRITE_HEADERS(abfd, execp) \ - { \ - bfd_size_type text_size; /* dummy vars */ \ - file_ptr text_end; \ - if (adata(abfd).magic == undecided_magic) \ - NAME(aout,adjust_sizes_and_vmas) (abfd, &text_size, &text_end); \ - \ - execp->a_syms = bfd_get_symcount (abfd) * EXTERNAL_NLIST_SIZE; \ - execp->a_entry = bfd_get_start_address (abfd); \ - \ - execp->a_trsize = ((obj_textsec (abfd)->reloc_count) * \ - obj_reloc_entry_size (abfd)); \ - execp->a_drsize = ((obj_datasec (abfd)->reloc_count) * \ - obj_reloc_entry_size (abfd)); \ - NAME(aout,swap_exec_header_out) (abfd, execp, &exec_bytes); \ - \ - if (bfd_seek (abfd, (file_ptr) 0, SEEK_SET) != 0) return false; \ - if (bfd_write ((PTR) &exec_bytes, 1, EXEC_BYTES_SIZE, abfd) \ - != EXEC_BYTES_SIZE) \ - return false; \ - /* Now write out reloc info, followed by syms and strings */ \ - \ - if (bfd_get_symcount (abfd) != 0) \ - { \ - if (bfd_seek (abfd, (file_ptr)(N_SYMOFF(*execp)), SEEK_SET) \ - != 0) \ - return false; \ - \ - if (! NAME(aout,write_syms)(abfd)) return false; \ - \ - if (bfd_seek (abfd, (file_ptr)(N_TRELOFF(*execp)), SEEK_SET) \ - != 0) \ - return false; \ - \ - if (!NAME(lynx,squirt_out_relocs) (abfd, obj_textsec (abfd))) \ - return false; \ - if (bfd_seek (abfd, (file_ptr)(N_DRELOFF(*execp)), SEEK_SET) \ - != 0) \ - return 0; \ - \ - if (!NAME(lynx,squirt_out_relocs)(abfd, obj_datasec (abfd))) \ - return false; \ - } \ - } -#endif - -#include "libaout.h" -#include "aout/aout64.h" - -#ifdef LYNX_CORE - -char *lynx_core_file_failing_command (); -int lynx_core_file_failing_signal (); -boolean lynx_core_file_matches_executable_p (); -const bfd_target *lynx_core_file_p (); - -#define MY_core_file_failing_command lynx_core_file_failing_command -#define MY_core_file_failing_signal lynx_core_file_failing_signal -#define MY_core_file_matches_executable_p lynx_core_file_matches_executable_p -#define MY_core_file_p lynx_core_file_p - -#endif /* LYNX_CORE */ - - -#define KEEPIT flags - -extern reloc_howto_type aout_32_ext_howto_table[]; -extern reloc_howto_type aout_32_std_howto_table[]; - -/* Standard reloc stuff */ -/* Output standard relocation information to a file in target byte order. */ - -void -NAME(lynx,swap_std_reloc_out) (abfd, g, natptr) - bfd *abfd; - arelent *g; - struct reloc_std_external *natptr; -{ - int r_index; - asymbol *sym = *(g->sym_ptr_ptr); - int r_extern; - unsigned int r_length; - int r_pcrel; - int r_baserel, r_jmptable, r_relative; - unsigned int r_addend; - asection *output_section = sym->section->output_section; - - PUT_WORD (abfd, g->address, natptr->r_address); - - r_length = g->howto->size; /* Size as a power of two */ - r_pcrel = (int) g->howto->pc_relative; /* Relative to PC? */ - /* r_baserel, r_jmptable, r_relative??? FIXME-soon */ - r_baserel = 0; - r_jmptable = 0; - r_relative = 0; - - r_addend = g->addend + (*(g->sym_ptr_ptr))->section->output_section->vma; - - /* name was clobbered by aout_write_syms to be symbol index */ - - /* If this relocation is relative to a symbol then set the - r_index to the symbols index, and the r_extern bit. - - Absolute symbols can come in in two ways, either as an offset - from the abs section, or as a symbol which has an abs value. - check for that here - */ - - - if (bfd_is_com_section (output_section) - || bfd_is_abs_section (output_section) - || bfd_is_und_section (output_section)) - { - if (bfd_abs_section_ptr->symbol == sym) - { - /* Whoops, looked like an abs symbol, but is really an offset - from the abs section */ - r_index = 0; - r_extern = 0; - } - else - { - /* Fill in symbol */ - r_extern = 1; - r_index = stoi ((*(g->sym_ptr_ptr))->KEEPIT); - - } - } - else - { - /* Just an ordinary section */ - r_extern = 0; - r_index = output_section->target_index; - } - - /* now the fun stuff */ - if (bfd_header_big_endian (abfd)) - { - natptr->r_index[0] = r_index >> 16; - natptr->r_index[1] = r_index >> 8; - natptr->r_index[2] = r_index; - natptr->r_type[0] = - (r_extern ? RELOC_STD_BITS_EXTERN_BIG : 0) - | (r_pcrel ? RELOC_STD_BITS_PCREL_BIG : 0) - | (r_baserel ? RELOC_STD_BITS_BASEREL_BIG : 0) - | (r_jmptable ? RELOC_STD_BITS_JMPTABLE_BIG : 0) - | (r_relative ? RELOC_STD_BITS_RELATIVE_BIG : 0) - | (r_length << RELOC_STD_BITS_LENGTH_SH_BIG); - } - else - { - natptr->r_index[2] = r_index >> 16; - natptr->r_index[1] = r_index >> 8; - natptr->r_index[0] = r_index; - natptr->r_type[0] = - (r_extern ? RELOC_STD_BITS_EXTERN_LITTLE : 0) - | (r_pcrel ? RELOC_STD_BITS_PCREL_LITTLE : 0) - | (r_baserel ? RELOC_STD_BITS_BASEREL_LITTLE : 0) - | (r_jmptable ? RELOC_STD_BITS_JMPTABLE_LITTLE : 0) - | (r_relative ? RELOC_STD_BITS_RELATIVE_LITTLE : 0) - | (r_length << RELOC_STD_BITS_LENGTH_SH_LITTLE); - } -} - - -/* Extended stuff */ -/* Output extended relocation information to a file in target byte order. */ - -void -NAME(lynx,swap_ext_reloc_out) (abfd, g, natptr) - bfd *abfd; - arelent *g; - register struct reloc_ext_external *natptr; -{ - int r_index; - int r_extern; - unsigned int r_type; - unsigned int r_addend; - asymbol *sym = *(g->sym_ptr_ptr); - asection *output_section = sym->section->output_section; - - PUT_WORD (abfd, g->address, natptr->r_address); - - r_type = (unsigned int) g->howto->type; - - r_addend = g->addend + (*(g->sym_ptr_ptr))->section->output_section->vma; - - - /* If this relocation is relative to a symbol then set the - r_index to the symbols index, and the r_extern bit. - - Absolute symbols can come in in two ways, either as an offset - from the abs section, or as a symbol which has an abs value. - check for that here - */ - - if (bfd_is_com_section (output_section) - || bfd_is_abs_section (output_section) - || bfd_is_und_section (output_section)) - { - if (bfd_abs_section_ptr->symbol == sym) - { - /* Whoops, looked like an abs symbol, but is really an offset - from the abs section */ - r_index = 0; - r_extern = 0; - } - else - { - r_extern = 1; - r_index = stoi ((*(g->sym_ptr_ptr))->KEEPIT); - } - } - else - { - /* Just an ordinary section */ - r_extern = 0; - r_index = output_section->target_index; - } - - - /* now the fun stuff */ - if (bfd_header_big_endian (abfd)) - { - natptr->r_index[0] = r_index >> 16; - natptr->r_index[1] = r_index >> 8; - natptr->r_index[2] = r_index; - natptr->r_type[0] = - (r_extern ? RELOC_EXT_BITS_EXTERN_BIG : 0) - | (r_type << RELOC_EXT_BITS_TYPE_SH_BIG); - } - else - { - natptr->r_index[2] = r_index >> 16; - natptr->r_index[1] = r_index >> 8; - natptr->r_index[0] = r_index; - natptr->r_type[0] = - (r_extern ? RELOC_EXT_BITS_EXTERN_LITTLE : 0) - | (r_type << RELOC_EXT_BITS_TYPE_SH_LITTLE); - } - - PUT_WORD (abfd, r_addend, natptr->r_addend); -} - -/* BFD deals internally with all things based from the section they're - in. so, something in 10 bytes into a text section with a base of - 50 would have a symbol (.text+10) and know .text vma was 50. - - Aout keeps all it's symbols based from zero, so the symbol would - contain 60. This macro subs the base of each section from the value - to give the true offset from the section */ - - -#define MOVE_ADDRESS(ad) \ - if (r_extern) { \ - /* undefined symbol */ \ - cache_ptr->sym_ptr_ptr = symbols + r_index; \ - cache_ptr->addend = ad; \ - } else { \ - /* defined, section relative. replace symbol with pointer to \ - symbol which points to section */ \ - switch (r_index) { \ - case N_TEXT: \ - case N_TEXT | N_EXT: \ - cache_ptr->sym_ptr_ptr = obj_textsec(abfd)->symbol_ptr_ptr; \ - cache_ptr->addend = ad - su->textsec->vma; \ - break; \ - case N_DATA: \ - case N_DATA | N_EXT: \ - cache_ptr->sym_ptr_ptr = obj_datasec(abfd)->symbol_ptr_ptr; \ - cache_ptr->addend = ad - su->datasec->vma; \ - break; \ - case N_BSS: \ - case N_BSS | N_EXT: \ - cache_ptr->sym_ptr_ptr = obj_bsssec(abfd)->symbol_ptr_ptr; \ - cache_ptr->addend = ad - su->bsssec->vma; \ - break; \ - default: \ - case N_ABS: \ - case N_ABS | N_EXT: \ - cache_ptr->sym_ptr_ptr = bfd_abs_section_ptr->symbol_ptr_ptr; \ - cache_ptr->addend = ad; \ - break; \ - } \ - } \ - -void -NAME(lynx,swap_ext_reloc_in) (abfd, bytes, cache_ptr, symbols, symcount) - bfd *abfd; - struct reloc_ext_external *bytes; - arelent *cache_ptr; - asymbol **symbols; - bfd_size_type symcount; -{ - int r_index; - int r_extern; - unsigned int r_type; - struct aoutdata *su = &(abfd->tdata.aout_data->a); - - cache_ptr->address = (GET_SWORD (abfd, bytes->r_address)); - - r_index = bytes->r_index[1]; - r_extern = (0 != (bytes->r_index[0] & RELOC_EXT_BITS_EXTERN_BIG)); - r_type = (bytes->r_index[0] & RELOC_EXT_BITS_TYPE_BIG) - >> RELOC_EXT_BITS_TYPE_SH_BIG; - - cache_ptr->howto = aout_32_ext_howto_table + r_type; - MOVE_ADDRESS (GET_SWORD (abfd, bytes->r_addend)); -} - -void -NAME(lynx,swap_std_reloc_in) (abfd, bytes, cache_ptr, symbols, symcount) - bfd *abfd; - struct reloc_std_external *bytes; - arelent *cache_ptr; - asymbol **symbols; - bfd_size_type symcount; -{ - int r_index; - int r_extern; - unsigned int r_length; - int r_pcrel; - int r_baserel, r_jmptable, r_relative; - struct aoutdata *su = &(abfd->tdata.aout_data->a); - - cache_ptr->address = bfd_h_get_32 (abfd, bytes->r_address); - - r_index = bytes->r_index[1]; - r_extern = (0 != (bytes->r_index[0] & RELOC_STD_BITS_EXTERN_BIG)); - r_pcrel = (0 != (bytes->r_index[0] & RELOC_STD_BITS_PCREL_BIG)); - r_baserel = (0 != (bytes->r_index[0] & RELOC_STD_BITS_BASEREL_BIG)); - r_jmptable = (0 != (bytes->r_index[0] & RELOC_STD_BITS_JMPTABLE_BIG)); - r_relative = (0 != (bytes->r_index[0] & RELOC_STD_BITS_RELATIVE_BIG)); - r_length = (bytes->r_index[0] & RELOC_STD_BITS_LENGTH_BIG) - >> RELOC_STD_BITS_LENGTH_SH_BIG; - - cache_ptr->howto = aout_32_std_howto_table + r_length + 4 * r_pcrel; - /* FIXME-soon: Roll baserel, jmptable, relative bits into howto setting */ - - MOVE_ADDRESS (0); -} - -/* Reloc hackery */ - -boolean -NAME(lynx,slurp_reloc_table) (abfd, asect, symbols) - bfd *abfd; - sec_ptr asect; - asymbol **symbols; -{ - unsigned int count; - bfd_size_type reloc_size; - PTR relocs; - arelent *reloc_cache; - size_t each_size; - - if (asect->relocation) - return true; - - if (asect->flags & SEC_CONSTRUCTOR) - return true; - - if (asect == obj_datasec (abfd)) - { - reloc_size = exec_hdr (abfd)->a_drsize; - goto doit; - } - - if (asect == obj_textsec (abfd)) - { - reloc_size = exec_hdr (abfd)->a_trsize; - goto doit; - } - - bfd_set_error (bfd_error_invalid_operation); - return false; - -doit: - if (bfd_seek (abfd, asect->rel_filepos, SEEK_SET) != 0) - return false; - each_size = obj_reloc_entry_size (abfd); - - count = reloc_size / each_size; - - - reloc_cache = (arelent *) bfd_malloc (count * sizeof (arelent)); - if (!reloc_cache && count != 0) - return false; - memset (reloc_cache, 0, count * sizeof (arelent)); - - relocs = (PTR) bfd_alloc (abfd, reloc_size); - if (!relocs && reloc_size != 0) - { - free (reloc_cache); - return false; - } - - if (bfd_read (relocs, 1, reloc_size, abfd) != reloc_size) - { - bfd_release (abfd, relocs); - free (reloc_cache); - return false; - } - - if (each_size == RELOC_EXT_SIZE) - { - register struct reloc_ext_external *rptr = (struct reloc_ext_external *) relocs; - unsigned int counter = 0; - arelent *cache_ptr = reloc_cache; - - for (; counter < count; counter++, rptr++, cache_ptr++) - { - NAME(lynx,swap_ext_reloc_in) (abfd, rptr, cache_ptr, symbols, - bfd_get_symcount (abfd)); - } - } - else - { - register struct reloc_std_external *rptr = (struct reloc_std_external *) relocs; - unsigned int counter = 0; - arelent *cache_ptr = reloc_cache; - - for (; counter < count; counter++, rptr++, cache_ptr++) - { - NAME(lynx,swap_std_reloc_in) (abfd, rptr, cache_ptr, symbols, - bfd_get_symcount (abfd)); - } - - } - - bfd_release (abfd, relocs); - asect->relocation = reloc_cache; - asect->reloc_count = count; - return true; -} - - - -/* Write out a relocation section into an object file. */ - -boolean -NAME(lynx,squirt_out_relocs) (abfd, section) - bfd *abfd; - asection *section; -{ - arelent **generic; - unsigned char *native, *natptr; - size_t each_size; - - unsigned int count = section->reloc_count; - size_t natsize; - - if (count == 0) - return true; - - each_size = obj_reloc_entry_size (abfd); - natsize = each_size * count; - native = (unsigned char *) bfd_zalloc (abfd, natsize); - if (!native) - return false; - - generic = section->orelocation; - - if (each_size == RELOC_EXT_SIZE) - { - for (natptr = native; - count != 0; - --count, natptr += each_size, ++generic) - NAME(lynx,swap_ext_reloc_out) (abfd, *generic, (struct reloc_ext_external *) natptr); - } - else - { - for (natptr = native; - count != 0; - --count, natptr += each_size, ++generic) - NAME(lynx,swap_std_reloc_out) (abfd, *generic, (struct reloc_std_external *) natptr); - } - - if (bfd_write ((PTR) native, 1, natsize, abfd) != natsize) - { - bfd_release (abfd, native); - return false; - } - bfd_release (abfd, native); - - return true; -} - -/* This is stupid. This function should be a boolean predicate */ -long -NAME(lynx,canonicalize_reloc) (abfd, section, relptr, symbols) - bfd *abfd; - sec_ptr section; - arelent **relptr; - asymbol **symbols; -{ - arelent *tblptr = section->relocation; - unsigned int count; - - if (!(tblptr || NAME(lynx,slurp_reloc_table) (abfd, section, symbols))) - return -1; - - if (section->flags & SEC_CONSTRUCTOR) - { - arelent_chain *chain = section->constructor_chain; - for (count = 0; count < section->reloc_count; count++) - { - *relptr++ = &chain->relent; - chain = chain->next; - } - } - else - { - tblptr = section->relocation; - - for (count = 0; count++ < section->reloc_count;) - { - *relptr++ = tblptr++; - } - } - *relptr = 0; - - return section->reloc_count; -} - -#define MY_canonicalize_reloc NAME(lynx,canonicalize_reloc) - -#include "aout-target.h" diff --git a/contrib/gdb/bfd/i386mach3.c b/contrib/gdb/bfd/i386mach3.c deleted file mode 100644 index 72a28f33bf0d9..0000000000000 --- a/contrib/gdb/bfd/i386mach3.c +++ /dev/null @@ -1,65 +0,0 @@ -/* BFD back-end for i386 a.out binaries. - Copyright (C) 1990, 1991 Free Software Foundation, Inc. - -This file is part of BFD, the Binary File Descriptor library. - -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 2 of the License, 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ - -/* This is for Mach 3, which uses a.out, not Mach-O. */ - -/* There is no magic number or anything which lets us distinguish this target - from i386aout or i386bsd. So this target is only useful if it is the - default target. */ - -#define TARGET_PAGE_SIZE 1 -#define SEGMENT_SIZE 0x1000 -#define TEXT_START_ADDR 0x10000 -#define ARCH 32 -#define BYTES_IN_WORD 4 -/* This macro is only relevant when N_MAGIC(x) == ZMAGIC. */ -#define N_HEADER_IN_TEXT(x) 1 - -#define N_TXTSIZE(x) ((x).a_text) - -#include "bfd.h" -#include "sysdep.h" -#include "libbfd.h" -#include "aout/aout64.h" -#include "aout/stab_gnu.h" -#include "aout/ar.h" -#include "libaout.h" /* BFD a.out internal data structures */ - -#define DEFAULT_ARCH bfd_arch_i386 -#define MY(OP) CAT(i386mach3_,OP) -#define TARGETNAME "a.out-mach3" - -static boolean MY(set_sizes)(); -#define MY_backend_data &MY(backend_data) -static CONST struct aout_backend_data MY(backend_data) = { - 0, /* zmagic contiguous */ - 1, /* text incl header */ - 0, /* exec_hdr_flags */ - 0, /* text vma? */ - MY(set_sizes), - 1, /* exec header not counted */ - 0, /* add_dynamic_symbols */ - 0, /* add_one_symbol */ - 0, /* link_dynamic_object */ - 0, /* write_dynamic_symbol */ - 0, /* check_dynamic_reloc */ - 0 /* finish_dynamic_link */ -}; - -#include "aout-target.h" diff --git a/contrib/gdb/bfd/i386msdos.c b/contrib/gdb/bfd/i386msdos.c deleted file mode 100644 index 24a456bea23d1..0000000000000 --- a/contrib/gdb/bfd/i386msdos.c +++ /dev/null @@ -1,243 +0,0 @@ -/* BFD back-end for MS-DOS executables. - Copyright 1990, 1991, 1992, 1993, 1994 Free Software Foundation, Inc. - Written by Bryan Ford of the University of Utah. - - Contributed by the Center for Software Science at the - University of Utah (pa-gdb-bugs@cs.utah.edu). - - This file is part of BFD, the Binary File Descriptor library. - - 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 2 of the License, 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ - - -#include "bfd.h" -#include "sysdep.h" -#include "libbfd.h" -#include "libaout.h" - -#if 0 -struct exe_header -{ - unsigned short magic; - unsigned short bytes_in_last_page; - unsigned short npages; /* number of 512-byte "pages" including this header */ - unsigned short nrelocs; - unsigned short header_paras; /* number of 16-byte paragraphs in header */ - unsigned short reserved; - unsigned short load_switch; - unsigned short ss_ofs; - unsigned short sp; - unsigned short checksum; - unsigned short ip; - unsigned short cs_ofs; - unsigned short reloc_ofs; - unsigned short reserved2; - unsigned short something1; - unsigned short something2; - unsigned short something3; -}; -#endif - -#define EXE_MAGIC 0x5a4d -#define EXE_LOAD_HIGH 0x0000 -#define EXE_LOAD_LOW 0xffff -#define EXE_PAGE_SIZE 512 - - -static int -msdos_sizeof_headers (abfd, exec) - bfd *abfd; - boolean exec; -{ - return 0; -} - -static boolean -msdos_write_object_contents (abfd) - bfd *abfd; -{ - static char hdr[EXE_PAGE_SIZE]; - file_ptr outfile_size = sizeof(hdr); - bfd_vma high_vma = 0; - asection *sec; - - /* Find the total size of the program on disk and in memory. */ - for (sec = abfd->sections; sec != (asection *) NULL; sec = sec->next) - { - if (bfd_get_section_size_before_reloc (sec) == 0) - continue; - if (bfd_get_section_flags (abfd, sec) & SEC_ALLOC) - { - bfd_vma sec_vma = bfd_get_section_vma (abfd, sec) - + bfd_get_section_size_before_reloc (sec); - if (sec_vma > high_vma) - high_vma = sec_vma; - } - if (bfd_get_section_flags (abfd, sec) & SEC_LOAD) - { - file_ptr sec_end = sizeof(hdr) - + bfd_get_section_vma (abfd, sec) - + bfd_get_section_size_before_reloc (sec); - if (sec_end > outfile_size) - outfile_size = sec_end; - } - } - - /* Make sure the program isn't too big. */ - if (high_vma > (bfd_vma)0xffff) - { - bfd_set_error(bfd_error_file_too_big); - return false; - } - - /* constants */ - bfd_h_put_16(abfd, EXE_MAGIC, &hdr[0]); - bfd_h_put_16(abfd, EXE_PAGE_SIZE / 16, &hdr[8]); - bfd_h_put_16(abfd, EXE_LOAD_LOW, &hdr[12]); - bfd_h_put_16(abfd, 0x3e, &hdr[24]); - bfd_h_put_16(abfd, 0x0001, &hdr[28]); /* XXX??? */ - bfd_h_put_16(abfd, 0x30fb, &hdr[30]); /* XXX??? */ - bfd_h_put_16(abfd, 0x726a, &hdr[32]); /* XXX??? */ - - /* bytes in last page (0 = full page) */ - bfd_h_put_16(abfd, outfile_size & (EXE_PAGE_SIZE - 1), &hdr[2]); - - /* number of pages */ - bfd_h_put_16(abfd, (outfile_size + EXE_PAGE_SIZE - 1) / EXE_PAGE_SIZE, - &hdr[4]); - - /* Set the initial stack pointer to the end of the bss. - The program's crt0 code must relocate it to a real stack. */ - bfd_h_put_16(abfd, high_vma, &hdr[16]); - - if (bfd_seek (abfd, (file_ptr) 0, SEEK_SET) != 0 - || bfd_write (hdr, 1, sizeof(hdr), abfd) != sizeof(hdr)) - return false; - - return true; -} - -static boolean -msdos_set_section_contents (abfd, section, location, offset, count) - bfd *abfd; - sec_ptr section; - PTR location; - file_ptr offset; - bfd_size_type count; -{ - - if (count == 0) - return true; - - section->filepos = EXE_PAGE_SIZE + bfd_get_section_vma (abfd, section); - - if (bfd_get_section_flags (abfd, section) & SEC_LOAD) - { - if (bfd_seek (abfd, (file_ptr) (section->filepos + offset), SEEK_SET) != 0 - || bfd_write (location, 1, count, abfd) != count) - return false; - } - - return true; -} - - - -#define msdos_mkobject aout_32_mkobject -#define msdos_make_empty_symbol aout_32_make_empty_symbol -#define msdos_bfd_reloc_type_lookup aout_32_reloc_type_lookup - -#define msdos_close_and_cleanup _bfd_generic_close_and_cleanup -#define msdos_bfd_free_cached_info _bfd_generic_bfd_free_cached_info -#define msdos_new_section_hook _bfd_generic_new_section_hook -#define msdos_get_section_contents _bfd_generic_get_section_contents -#define msdos_get_section_contents_in_window \ - _bfd_generic_get_section_contents_in_window -#define msdos_bfd_get_relocated_section_contents \ - bfd_generic_get_relocated_section_contents -#define msdos_bfd_relax_section bfd_generic_relax_section -#define msdos_bfd_link_hash_table_create _bfd_generic_link_hash_table_create -#define msdos_bfd_link_add_symbols _bfd_generic_link_add_symbols -#define msdos_bfd_final_link _bfd_generic_final_link -#define msdos_bfd_link_split_section _bfd_generic_link_split_section -#define msdos_set_arch_mach _bfd_generic_set_arch_mach - -#define msdos_get_symtab_upper_bound _bfd_nosymbols_get_symtab_upper_bound -#define msdos_get_symtab _bfd_nosymbols_get_symtab -#define msdos_print_symbol _bfd_nosymbols_print_symbol -#define msdos_get_symbol_info _bfd_nosymbols_get_symbol_info -#define msdos_find_nearest_line _bfd_nosymbols_find_nearest_line -#define msdos_get_lineno _bfd_nosymbols_get_lineno -#define msdos_bfd_is_local_label _bfd_nosymbols_bfd_is_local_label -#define msdos_bfd_make_debug_symbol _bfd_nosymbols_bfd_make_debug_symbol -#define msdos_read_minisymbols _bfd_nosymbols_read_minisymbols -#define msdos_minisymbol_to_symbol _bfd_nosymbols_minisymbol_to_symbol - -#define msdos_canonicalize_reloc _bfd_norelocs_canonicalize_reloc -#define msdos_get_reloc_upper_bound _bfd_norelocs_get_reloc_upper_bound -#define msdos_32_bfd_link_split_section _bfd_generic_link_split_section - -const bfd_target i386msdos_vec = -{ - "msdos", /* name */ - bfd_target_msdos_flavour, - BFD_ENDIAN_LITTLE, /* target byte order */ - BFD_ENDIAN_LITTLE, /* target headers byte order */ - (EXEC_P), /* object flags */ - (SEC_CODE | SEC_DATA | SEC_HAS_CONTENTS - | SEC_ALLOC | SEC_LOAD), /* section flags */ - 0, /* leading underscore */ - ' ', /* ar_pad_char */ - 16, /* ar_max_namelen */ - bfd_getl64, bfd_getl_signed_64, bfd_putl64, - bfd_getl32, bfd_getl_signed_32, bfd_putl32, - bfd_getl16, bfd_getl_signed_16, bfd_putl16, /* data */ - bfd_getl64, bfd_getl_signed_64, bfd_putl64, - bfd_getl32, bfd_getl_signed_32, bfd_putl32, - bfd_getl16, bfd_getl_signed_16, bfd_putl16, /* hdrs */ - - { - _bfd_dummy_target, - _bfd_dummy_target, /* bfd_check_format */ - _bfd_dummy_target, - _bfd_dummy_target, - }, - { - bfd_false, - msdos_mkobject, - _bfd_generic_mkarchive, - bfd_false, - }, - { /* bfd_write_contents */ - bfd_false, - msdos_write_object_contents, - _bfd_write_archive_contents, - bfd_false, - }, - - BFD_JUMP_TABLE_GENERIC (msdos), - BFD_JUMP_TABLE_COPY (_bfd_generic), - BFD_JUMP_TABLE_CORE (_bfd_nocore), - BFD_JUMP_TABLE_ARCHIVE (_bfd_noarchive), - BFD_JUMP_TABLE_SYMBOLS (msdos), - BFD_JUMP_TABLE_RELOCS (msdos), - BFD_JUMP_TABLE_WRITE (msdos), - BFD_JUMP_TABLE_LINK (msdos), - BFD_JUMP_TABLE_DYNAMIC (_bfd_nodynamic), - - (PTR) 0 -}; - - diff --git a/contrib/gdb/bfd/i386netbsd.c b/contrib/gdb/bfd/i386netbsd.c deleted file mode 100644 index 32feaa70c94e1..0000000000000 --- a/contrib/gdb/bfd/i386netbsd.c +++ /dev/null @@ -1,33 +0,0 @@ -/* BFD back-end for NetBSD/386 a.out-ish binaries. - Copyright (C) 1990, 1991, 1992 Free Software Foundation, Inc. - -This file is part of BFD, the Binary File Descriptor library. - -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 2 of the License, 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ - -#define BYTES_IN_WORD 4 -#undef TARGET_IS_BIG_ENDIAN_P - -#define TARGET_PAGE_SIZE 4096 -#define SEGMENT_SIZE TARGET_PAGE_SIZE - -#define DEFAULT_ARCH bfd_arch_i386 -#define MACHTYPE_OK(mtype) ((mtype) == M_386_NETBSD || (mtype) == M_UNKNOWN) - -#define MY(OP) CAT(i386netbsd_,OP) -/* This needs to start with a.out so GDB knows it is an a.out variant. */ -#define TARGETNAME "a.out-i386-netbsd" - -#include "netbsd.h" diff --git a/contrib/gdb/bfd/i386os9k.c b/contrib/gdb/bfd/i386os9k.c deleted file mode 100644 index fe1a021691bcb..0000000000000 --- a/contrib/gdb/bfd/i386os9k.c +++ /dev/null @@ -1,370 +0,0 @@ -/* BFD back-end for os9000 i386 binaries. - Copyright 1990, 1991, 1992, 1993, 1994 Free Software Foundation, Inc. - Written by Cygnus Support. - -This file is part of BFD, the Binary File Descriptor library. - -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 2 of the License, 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ - - -#include "bfd.h" -#include "sysdep.h" -#include "libbfd.h" -#include "bfdlink.h" -#include "libaout.h" /* BFD a.out internal data structures */ -#include "os9k.h" - -static const bfd_target *os9k_callback PARAMS ((bfd *)); - -/* Swaps the information in an executable header taken from a raw byte - stream memory image, into the internal exec_header structure. */ -boolean -os9k_swap_exec_header_in (abfd, raw_bytes, execp) - bfd *abfd; - mh_com *raw_bytes; - struct internal_exec *execp; -{ - mh_com *bytes = (mh_com *) raw_bytes; - unsigned int dload, dmemsize, dmemstart; - - /* Now fill in fields in the execp, from the bytes in the raw data. */ - execp->a_info = bfd_h_get_16 (abfd, bytes->m_sync); - execp->a_syms = 0; - execp->a_entry = bfd_h_get_32 (abfd, bytes->m_exec); - execp->a_talign = 2; - execp->a_dalign = 2; - execp->a_balign = 2; - - dload = bfd_h_get_32 (abfd, bytes->m_idata); - execp->a_data = dload + 8; - - if (bfd_seek (abfd, (file_ptr) dload, SEEK_SET) != 0 - || (bfd_read (&dmemstart, sizeof (dmemstart), 1, abfd) - != sizeof (dmemstart)) - || (bfd_read (&dmemsize, sizeof (dmemsize), 1, abfd) - != sizeof (dmemsize))) - return false; - - execp->a_tload = 0; - execp->a_dload = bfd_h_get_32 (abfd, (unsigned char *) &dmemstart); - execp->a_text = dload - execp->a_tload; - execp->a_data = bfd_h_get_32 (abfd, (unsigned char *) &dmemsize); - execp->a_bss = bfd_h_get_32 (abfd, bytes->m_data) - execp->a_data; - - execp->a_trsize = 0; - execp->a_drsize = 0; - - return true; -} - -#if 0 -/* Swaps the information in an internal exec header structure into the - supplied buffer ready for writing to disk. */ - -PROTO (void, os9k_swap_exec_header_out, - (bfd * abfd, - struct internal_exec * execp, - struct mh_com * raw_bytes)); -void -os9k_swap_exec_header_out (abfd, execp, raw_bytes) - bfd *abfd; - struct internal_exec *execp; - mh_com *raw_bytes; -{ - mh_com *bytes = (mh_com *) raw_bytes; - - /* Now fill in fields in the raw data, from the fields in the exec struct. */ - bfd_h_put_32 (abfd, execp->a_info, bytes->e_info); - bfd_h_put_32 (abfd, execp->a_text, bytes->e_text); - bfd_h_put_32 (abfd, execp->a_data, bytes->e_data); - bfd_h_put_32 (abfd, execp->a_bss, bytes->e_bss); - bfd_h_put_32 (abfd, execp->a_syms, bytes->e_syms); - bfd_h_put_32 (abfd, execp->a_entry, bytes->e_entry); - bfd_h_put_32 (abfd, execp->a_trsize, bytes->e_trsize); - bfd_h_put_32 (abfd, execp->a_drsize, bytes->e_drsize); - bfd_h_put_32 (abfd, execp->a_tload, bytes->e_tload); - bfd_h_put_32 (abfd, execp->a_dload, bytes->e_dload); - bytes->e_talign[0] = execp->a_talign; - bytes->e_dalign[0] = execp->a_dalign; - bytes->e_balign[0] = execp->a_balign; - bytes->e_relaxable[0] = execp->a_relaxable; -} - -#endif /* 0 */ - -static const bfd_target * -os9k_object_p (abfd) - bfd *abfd; -{ - struct internal_exec anexec; - mh_com exec_bytes; - - if (bfd_read ((PTR) & exec_bytes, MHCOM_BYTES_SIZE, 1, abfd) - != MHCOM_BYTES_SIZE) - { - if (bfd_get_error () != bfd_error_system_call) - bfd_set_error (bfd_error_wrong_format); - return 0; - } - - anexec.a_info = bfd_h_get_16 (abfd, exec_bytes.m_sync); - if (N_BADMAG (anexec)) - { - bfd_set_error (bfd_error_wrong_format); - return 0; - } - - if (! os9k_swap_exec_header_in (abfd, &exec_bytes, &anexec)) - { - if (bfd_get_error () != bfd_error_system_call) - bfd_set_error (bfd_error_wrong_format); - return NULL; - } - return aout_32_some_aout_object_p (abfd, &anexec, os9k_callback); -} - - -/* Finish up the opening of a b.out file for reading. Fill in all the - fields that are not handled by common code. */ - -static const bfd_target * -os9k_callback (abfd) - bfd *abfd; -{ - struct internal_exec *execp = exec_hdr (abfd); - unsigned long bss_start; - - /* Architecture and machine type */ - bfd_set_arch_mach (abfd, bfd_arch_i386, 0); - - /* The positions of the string table and symbol table. */ - obj_str_filepos (abfd) = 0; - obj_sym_filepos (abfd) = 0; - - /* The alignments of the sections */ - obj_textsec (abfd)->alignment_power = execp->a_talign; - obj_datasec (abfd)->alignment_power = execp->a_dalign; - obj_bsssec (abfd)->alignment_power = execp->a_balign; - - /* The starting addresses of the sections. */ - obj_textsec (abfd)->vma = execp->a_tload; - obj_datasec (abfd)->vma = execp->a_dload; - - /* And reload the sizes, since the aout module zaps them */ - obj_textsec (abfd)->_raw_size = execp->a_text; - - bss_start = execp->a_dload + execp->a_data; /* BSS = end of data section */ - obj_bsssec (abfd)->vma = align_power (bss_start, execp->a_balign); - - /* The file positions of the sections */ - obj_textsec (abfd)->filepos = execp->a_entry; - obj_datasec (abfd)->filepos = execp->a_dload; - - /* The file positions of the relocation info *** - obj_textsec (abfd)->rel_filepos = N_TROFF(*execp); - obj_datasec (abfd)->rel_filepos = N_DROFF(*execp); - */ - - adata (abfd).page_size = 1; /* Not applicable. */ - adata (abfd).segment_size = 1;/* Not applicable. */ - adata (abfd).exec_bytes_size = MHCOM_BYTES_SIZE; - - return abfd->xvec; -} - -#if 0 -struct bout_data_struct -{ - struct aoutdata a; - struct internal_exec e; -}; - -static boolean -os9k_mkobject (abfd) - bfd *abfd; -{ - struct bout_data_struct *rawptr; - - rawptr = (struct bout_data_struct *) bfd_zalloc (abfd, sizeof (struct bout_data_struct)); - if (rawptr == NULL) - return false; - - abfd->tdata.bout_data = rawptr; - exec_hdr (abfd) = &rawptr->e; - - obj_textsec (abfd) = (asection *) NULL; - obj_datasec (abfd) = (asection *) NULL; - obj_bsssec (abfd) = (asection *) NULL; - - return true; -} - -static boolean -os9k_write_object_contents (abfd) - bfd *abfd; -{ - struct external_exec swapped_hdr; - - if (! aout_32_make_sections (abfd)) - return false; - - exec_hdr (abfd)->a_info = BMAGIC; - - exec_hdr (abfd)->a_text = obj_textsec (abfd)->_raw_size; - exec_hdr (abfd)->a_data = obj_datasec (abfd)->_raw_size; - exec_hdr (abfd)->a_bss = obj_bsssec (abfd)->_raw_size; - exec_hdr (abfd)->a_syms = bfd_get_symcount (abfd) * sizeof (struct nlist); - exec_hdr (abfd)->a_entry = bfd_get_start_address (abfd); - exec_hdr (abfd)->a_trsize = ((obj_textsec (abfd)->reloc_count) * - sizeof (struct relocation_info)); - exec_hdr (abfd)->a_drsize = ((obj_datasec (abfd)->reloc_count) * - sizeof (struct relocation_info)); - - exec_hdr (abfd)->a_talign = obj_textsec (abfd)->alignment_power; - exec_hdr (abfd)->a_dalign = obj_datasec (abfd)->alignment_power; - exec_hdr (abfd)->a_balign = obj_bsssec (abfd)->alignment_power; - - exec_hdr (abfd)->a_tload = obj_textsec (abfd)->vma; - exec_hdr (abfd)->a_dload = obj_datasec (abfd)->vma; - - bout_swap_exec_header_out (abfd, exec_hdr (abfd), &swapped_hdr); - - if (bfd_seek (abfd, (file_ptr) 0, SEEK_SET) != 0 - || (bfd_write ((PTR) & swapped_hdr, 1, EXEC_BYTES_SIZE, abfd) - != EXEC_BYTES_SIZE)) - return false; - - /* Now write out reloc info, followed by syms and strings */ - if (bfd_get_symcount (abfd) != 0) - { - if (bfd_seek (abfd, (file_ptr) (N_SYMOFF (*exec_hdr (abfd))), SEEK_SET) - != 0) - return false; - - if (!aout_32_write_syms (abfd)) - return false; - - if (bfd_seek (abfd, (file_ptr) (N_TROFF (*exec_hdr (abfd))), SEEK_SET) - != 0) - return false; - - if (!b_out_squirt_out_relocs (abfd, obj_textsec (abfd))) - return false; - if (bfd_seek (abfd, (file_ptr) (N_DROFF (*exec_hdr (abfd))), SEEK_SET) - != 0) - return false; - - if (!b_out_squirt_out_relocs (abfd, obj_datasec (abfd))) - return false; - } - return true; -} - -static boolean -os9k_set_section_contents (abfd, section, location, offset, count) - bfd *abfd; - sec_ptr section; - unsigned char *location; - file_ptr offset; - int count; -{ - - if (abfd->output_has_begun == false) - { /* set by bfd.c handler */ - if (! aout_32_make_sections (abfd)) - return false; - - obj_textsec (abfd)->filepos = sizeof (struct internal_exec); - obj_datasec (abfd)->filepos = obj_textsec (abfd)->filepos - + obj_textsec (abfd)->_raw_size; - - } - /* regardless, once we know what we're doing, we might as well get going */ - if (bfd_seek (abfd, section->filepos + offset, SEEK_SET) != 0) - return false; - - if (count != 0) - { - return (bfd_write ((PTR) location, 1, count, abfd) == count) ? true : false; - } - return true; -} -#endif /* 0 */ - -static int -os9k_sizeof_headers (ignore_abfd, ignore) - bfd *ignore_abfd; - boolean ignore; -{ - return sizeof (struct internal_exec); -} - - -/***********************************************************************/ - -#define aout_32_close_and_cleanup aout_32_bfd_free_cached_info - -#define aout_32_bfd_make_debug_symbol _bfd_nosymbols_bfd_make_debug_symbol - -#define aout_32_bfd_reloc_type_lookup _bfd_norelocs_bfd_reloc_type_lookup - -#define aout_32_get_section_contents_in_window \ - _bfd_generic_get_section_contents_in_window - -#define os9k_bfd_get_relocated_section_contents \ - bfd_generic_get_relocated_section_contents -#define os9k_bfd_relax_section bfd_generic_relax_section -#define os9k_bfd_link_hash_table_create _bfd_generic_link_hash_table_create -#define os9k_bfd_link_add_symbols _bfd_generic_link_add_symbols -#define os9k_bfd_final_link _bfd_generic_final_link -#define os9k_bfd_link_split_section _bfd_generic_link_split_section - -const bfd_target i386os9k_vec = -{ - "i386os9k", /* name */ - bfd_target_os9k_flavour, - BFD_ENDIAN_LITTLE, /* data byte order is little */ - BFD_ENDIAN_LITTLE, /* hdr byte order is little */ - (HAS_RELOC | EXEC_P | WP_TEXT), /* object flags */ - (SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD), /* section flags */ - 0, /* symbol leading char */ - ' ', /* ar_pad_char */ - 16, /* ar_max_namelen */ - - bfd_getl64, bfd_getl_signed_64, bfd_putl64, - bfd_getl32, bfd_getl_signed_32, bfd_putl32, - bfd_getl16, bfd_getl_signed_16, bfd_putl16, /* data */ - bfd_getl64, bfd_getl_signed_64, bfd_putl64, - bfd_getl32, bfd_getl_signed_32, bfd_putl32, - bfd_getl16, bfd_getl_signed_16, bfd_putl16, /* hdrs */ - {_bfd_dummy_target, os9k_object_p, /* bfd_check_format */ - bfd_generic_archive_p, _bfd_dummy_target}, - {bfd_false, bfd_false, /* bfd_set_format */ - _bfd_generic_mkarchive, bfd_false}, - {bfd_false, bfd_false, /* bfd_write_contents */ - _bfd_write_archive_contents, bfd_false}, - - BFD_JUMP_TABLE_GENERIC (aout_32), - BFD_JUMP_TABLE_COPY (_bfd_generic), - BFD_JUMP_TABLE_CORE (_bfd_nocore), - BFD_JUMP_TABLE_ARCHIVE (_bfd_archive_bsd), - BFD_JUMP_TABLE_SYMBOLS (aout_32), - BFD_JUMP_TABLE_RELOCS (aout_32), - BFD_JUMP_TABLE_WRITE (aout_32), - BFD_JUMP_TABLE_LINK (os9k), - BFD_JUMP_TABLE_DYNAMIC (_bfd_nodynamic), - - (PTR) 0, -}; diff --git a/contrib/gdb/bfd/ieee.c b/contrib/gdb/bfd/ieee.c deleted file mode 100644 index 201f22515b3f8..0000000000000 --- a/contrib/gdb/bfd/ieee.c +++ /dev/null @@ -1,3738 +0,0 @@ -/* BFD back-end for ieee-695 objects. - Copyright (C) 1990, 91, 92, 93, 94, 95, 1996 Free Software Foundation, Inc. - Written by Steve Chamberlain of Cygnus Support. - -This file is part of BFD, the Binary File Descriptor library. - -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 2 of the License, 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ - -#define KEEPMINUSPCININST 0 - -/* IEEE 695 format is a stream of records, which we parse using a simple one- - token (which is one byte in this lexicon) lookahead recursive decent - parser. */ - -#include "bfd.h" -#include "sysdep.h" -#include "libbfd.h" -#include "ieee.h" -#include "libieee.h" - -static boolean ieee_write_byte PARAMS ((bfd *, bfd_byte)); -static boolean ieee_write_2bytes PARAMS ((bfd *, int)); -static boolean ieee_write_int PARAMS ((bfd *, bfd_vma)); -static boolean ieee_write_id PARAMS ((bfd *, const char *)); -static boolean ieee_write_expression - PARAMS ((bfd *, bfd_vma, asymbol *, boolean, unsigned int)); -static void ieee_write_int5 PARAMS ((bfd_byte *, bfd_vma)); -static boolean ieee_write_int5_out PARAMS ((bfd *, bfd_vma)); -static boolean ieee_write_section_part PARAMS ((bfd *)); -static boolean do_with_relocs PARAMS ((bfd *, asection *)); -static boolean do_as_repeat PARAMS ((bfd *, asection *)); -static boolean do_without_relocs PARAMS ((bfd *, asection *)); -static boolean ieee_write_external_part PARAMS ((bfd *)); -static boolean ieee_write_data_part PARAMS ((bfd *)); -static boolean ieee_write_debug_part PARAMS ((bfd *)); -static boolean ieee_write_me_part PARAMS ((bfd *)); -static boolean ieee_write_processor PARAMS ((bfd *)); - -static boolean ieee_slurp_debug PARAMS ((bfd *)); -static boolean ieee_slurp_section_data PARAMS ((bfd *)); - -/* Functions for writing to ieee files in the strange way that the - standard requires. */ - -static boolean -ieee_write_byte (abfd, byte) - bfd *abfd; - bfd_byte byte; -{ - if (bfd_write ((PTR) &byte, 1, 1, abfd) != 1) - return false; - return true; -} - -static boolean -ieee_write_2bytes (abfd, bytes) - bfd *abfd; - int bytes; -{ - bfd_byte buffer[2]; - - buffer[0] = bytes >> 8; - buffer[1] = bytes & 0xff; - if (bfd_write ((PTR) buffer, 1, 2, abfd) != 2) - return false; - return true; -} - -static boolean -ieee_write_int (abfd, value) - bfd *abfd; - bfd_vma value; -{ - if (value <= 127) - { - if (! ieee_write_byte (abfd, (bfd_byte) value)) - return false; - } - else - { - unsigned int length; - - /* How many significant bytes ? */ - /* FIXME FOR LONGER INTS */ - if (value & 0xff000000) - length = 4; - else if (value & 0x00ff0000) - length = 3; - else if (value & 0x0000ff00) - length = 2; - else - length = 1; - - if (! ieee_write_byte (abfd, - (bfd_byte) ((int) ieee_number_repeat_start_enum - + length))) - return false; - switch (length) - { - case 4: - if (! ieee_write_byte (abfd, (bfd_byte) (value >> 24))) - return false; - /* Fall through. */ - case 3: - if (! ieee_write_byte (abfd, (bfd_byte) (value >> 16))) - return false; - /* Fall through. */ - case 2: - if (! ieee_write_byte (abfd, (bfd_byte) (value >> 8))) - return false; - /* Fall through. */ - case 1: - if (! ieee_write_byte (abfd, (bfd_byte) (value))) - return false; - } - } - - return true; -} - -static boolean -ieee_write_id (abfd, id) - bfd *abfd; - const char *id; -{ - size_t length = strlen (id); - - if (length <= 127) - { - if (! ieee_write_byte (abfd, (bfd_byte) length)) - return false; - } - else if (length < 255) - { - if (! ieee_write_byte (abfd, ieee_extension_length_1_enum) - || ! ieee_write_byte (abfd, (bfd_byte) length)) - return false; - } - else if (length < 65535) - { - if (! ieee_write_byte (abfd, ieee_extension_length_2_enum) - || ! ieee_write_2bytes (abfd, (int) length)) - return false; - } - else - { - (*_bfd_error_handler) - ("%s: string too long (%d chars, max 65535)", - bfd_get_filename (abfd), length); - bfd_set_error (bfd_error_invalid_operation); - return false; - } - - if (bfd_write ((PTR) id, 1, length, abfd) != length) - return false; - return true; -} - -/*************************************************************************** -Functions for reading from ieee files in the strange way that the -standard requires: -*/ - -#define this_byte(ieee) *((ieee)->input_p) -#define next_byte(ieee) ((ieee)->input_p++) -#define this_byte_and_next(ieee) (*((ieee)->input_p++)) - -static unsigned short -read_2bytes (ieee) - common_header_type *ieee; -{ - unsigned char c1 = this_byte_and_next (ieee); - unsigned char c2 = this_byte_and_next (ieee); - return (c1 << 8) | c2; -} - -static void -bfd_get_string (ieee, string, length) - common_header_type *ieee; - char *string; - size_t length; -{ - size_t i; - for (i = 0; i < length; i++) - { - string[i] = this_byte_and_next (ieee); - } -} - -static char * -read_id (ieee) - common_header_type *ieee; -{ - size_t length; - char *string; - length = this_byte_and_next (ieee); - if (length <= 0x7f) - { - /* Simple string of length 0 to 127 */ - } - else if (length == 0xde) - { - /* Length is next byte, allowing 0..255 */ - length = this_byte_and_next (ieee); - } - else if (length == 0xdf) - { - /* Length is next two bytes, allowing 0..65535 */ - length = this_byte_and_next (ieee); - length = (length * 256) + this_byte_and_next (ieee); - } - /* Buy memory and read string */ - string = bfd_alloc (ieee->abfd, length + 1); - if (!string) - return NULL; - bfd_get_string (ieee, string, length); - string[length] = 0; - return string; -} - -static boolean -ieee_write_expression (abfd, value, symbol, pcrel, index) - bfd *abfd; - bfd_vma value; - asymbol *symbol; - boolean pcrel; - unsigned int index; -{ - unsigned int term_count = 0; - - if (value != 0) - { - if (! ieee_write_int (abfd, value)) - return false; - term_count++; - } - - if (bfd_is_com_section (symbol->section) - || bfd_is_und_section (symbol->section)) - { - /* Def of a common symbol */ - if (! ieee_write_byte (abfd, ieee_variable_X_enum) - || ! ieee_write_int (abfd, symbol->value)) - return false; - term_count++; - } - else if (! bfd_is_abs_section (symbol->section)) - { - /* Ref to defined symbol - */ - - if (symbol->flags & BSF_GLOBAL) - { - if (! ieee_write_byte (abfd, ieee_variable_I_enum) - || ! ieee_write_int (abfd, symbol->value)) - return false; - term_count++; - } - else if (symbol->flags & (BSF_LOCAL | BSF_SECTION_SYM)) - { - /* This is a reference to a defined local symbol. We can - easily do a local as a section+offset. */ - if (! ieee_write_byte (abfd, ieee_variable_R_enum) - || ! ieee_write_byte (abfd, - (bfd_byte) (symbol->section->index - + IEEE_SECTION_NUMBER_BASE))) - return false; - term_count++; - if (symbol->value != 0) - { - if (! ieee_write_int (abfd, symbol->value)) - return false; - term_count++; - } - } - else - { - (*_bfd_error_handler) - ("%s: unrecognized symbol `%s' flags 0x%x", - bfd_get_filename (abfd), bfd_asymbol_name (symbol), - symbol->flags); - bfd_set_error (bfd_error_invalid_operation); - return false; - } - } - - if (pcrel) - { - /* subtract the pc from here by asking for PC of this section*/ - if (! ieee_write_byte (abfd, ieee_variable_P_enum) - || ! ieee_write_byte (abfd, - (bfd_byte) (index + IEEE_SECTION_NUMBER_BASE)) - || ! ieee_write_byte (abfd, ieee_function_minus_enum)) - return false; - } - - /* Handle the degenerate case of a 0 address. */ - if (term_count == 0) - { - if (! ieee_write_int (abfd, 0)) - return false; - } - - while (term_count > 1) - { - if (! ieee_write_byte (abfd, ieee_function_plus_enum)) - return false; - term_count--; - } - - return true; -} - -/*****************************************************************************/ - -/* -writes any integer into the buffer supplied and always takes 5 bytes -*/ -static void -ieee_write_int5 (buffer, value) - bfd_byte *buffer; - bfd_vma value; -{ - buffer[0] = (bfd_byte) ieee_number_repeat_4_enum; - buffer[1] = (value >> 24) & 0xff; - buffer[2] = (value >> 16) & 0xff; - buffer[3] = (value >> 8) & 0xff; - buffer[4] = (value >> 0) & 0xff; -} - -static boolean -ieee_write_int5_out (abfd, value) - bfd *abfd; - bfd_vma value; -{ - bfd_byte b[5]; - - ieee_write_int5 (b, value); - if (bfd_write ((PTR) b, 1, 5, abfd) != 5) - return false; - return true; -} - -static boolean -parse_int (ieee, value_ptr) - common_header_type *ieee; - bfd_vma *value_ptr; -{ - int value = this_byte (ieee); - int result; - if (value >= 0 && value <= 127) - { - *value_ptr = value; - next_byte (ieee); - return true; - } - else if (value >= 0x80 && value <= 0x88) - { - unsigned int count = value & 0xf; - result = 0; - next_byte (ieee); - while (count) - { - result = (result << 8) | this_byte_and_next (ieee); - count--; - } - *value_ptr = result; - return true; - } - return false; -} - -static int -parse_i (ieee, ok) - common_header_type *ieee; - boolean *ok; -{ - bfd_vma x; - *ok = parse_int (ieee, &x); - return x; -} - -static bfd_vma -must_parse_int (ieee) - common_header_type *ieee; -{ - bfd_vma result; - BFD_ASSERT (parse_int (ieee, &result) == true); - return result; -} - -typedef struct -{ - bfd_vma value; - asection *section; - ieee_symbol_index_type symbol; -} ieee_value_type; - - -#ifdef KEEPMINUSPCININST - -#define SRC_MASK(arg) arg -#define PCREL_OFFSET false - -#else - -#define SRC_MASK(arg) 0 -#define PCREL_OFFSET true - -#endif - -static reloc_howto_type abs32_howto = - HOWTO (1, - 0, - 2, - 32, - false, - 0, - complain_overflow_bitfield, - 0, - "abs32", - true, - 0xffffffff, - 0xffffffff, - false); - -static reloc_howto_type abs16_howto = - HOWTO (1, - 0, - 1, - 16, - false, - 0, - complain_overflow_bitfield, - 0, - "abs16", - true, - 0x0000ffff, - 0x0000ffff, - false); - -static reloc_howto_type abs8_howto = - HOWTO (1, - 0, - 0, - 8, - false, - 0, - complain_overflow_bitfield, - 0, - "abs8", - true, - 0x000000ff, - 0x000000ff, - false); - -static reloc_howto_type rel32_howto = - HOWTO (1, - 0, - 2, - 32, - true, - 0, - complain_overflow_signed, - 0, - "rel32", - true, - SRC_MASK (0xffffffff), - 0xffffffff, - PCREL_OFFSET); - -static reloc_howto_type rel16_howto = - HOWTO (1, - 0, - 1, - 16, - true, - 0, - complain_overflow_signed, - 0, - "rel16", - true, - SRC_MASK (0x0000ffff), - 0x0000ffff, - PCREL_OFFSET); - -static reloc_howto_type rel8_howto = - HOWTO (1, - 0, - 0, - 8, - true, - 0, - complain_overflow_signed, - 0, - "rel8", - true, - SRC_MASK (0x000000ff), - 0x000000ff, - PCREL_OFFSET); - -static ieee_symbol_index_type NOSYMBOL = {0, 0}; - -static void -parse_expression (ieee, value, symbol, pcrel, extra, section) - ieee_data_type *ieee; - bfd_vma *value; - ieee_symbol_index_type *symbol; - boolean *pcrel; - unsigned int *extra; - asection **section; - -{ -#define POS sp[1] -#define TOS sp[0] -#define NOS sp[-1] -#define INC sp++; -#define DEC sp--; - - boolean loop = true; - ieee_value_type stack[10]; - - /* The stack pointer always points to the next unused location */ -#define PUSH(x,y,z) TOS.symbol=x;TOS.section=y;TOS.value=z;INC; -#define POP(x,y,z) DEC;x=TOS.symbol;y=TOS.section;z=TOS.value; - ieee_value_type *sp = stack; - - while (loop) - { - switch (this_byte (&(ieee->h))) - { - case ieee_variable_P_enum: - /* P variable, current program counter for section n */ - { - int section_n; - next_byte (&(ieee->h)); - *pcrel = true; - section_n = must_parse_int (&(ieee->h)); - PUSH (NOSYMBOL, bfd_abs_section_ptr, 0); - break; - } - case ieee_variable_L_enum: - /* L variable address of section N */ - next_byte (&(ieee->h)); - PUSH (NOSYMBOL, ieee->section_table[must_parse_int (&(ieee->h))], 0); - break; - case ieee_variable_R_enum: - /* R variable, logical address of section module */ - /* FIXME, this should be different to L */ - next_byte (&(ieee->h)); - PUSH (NOSYMBOL, ieee->section_table[must_parse_int (&(ieee->h))], 0); - break; - case ieee_variable_S_enum: - /* S variable, size in MAUS of section module */ - next_byte (&(ieee->h)); - PUSH (NOSYMBOL, - 0, - ieee->section_table[must_parse_int (&(ieee->h))]->_raw_size); - break; - case ieee_variable_I_enum: - /* Push the address of variable n */ - { - ieee_symbol_index_type sy; - next_byte (&(ieee->h)); - sy.index = (int) must_parse_int (&(ieee->h)); - sy.letter = 'I'; - - PUSH (sy, bfd_abs_section_ptr, 0); - } - break; - case ieee_variable_X_enum: - /* Push the address of external variable n */ - { - ieee_symbol_index_type sy; - next_byte (&(ieee->h)); - sy.index = (int) (must_parse_int (&(ieee->h))); - sy.letter = 'X'; - - PUSH (sy, bfd_und_section_ptr, 0); - } - break; - case ieee_function_minus_enum: - { - bfd_vma value1, value2; - asection *section1, *section_dummy; - ieee_symbol_index_type sy; - next_byte (&(ieee->h)); - - POP (sy, section1, value1); - POP (sy, section_dummy, value2); - PUSH (sy, section1 ? section1 : section_dummy, value2 - value1); - } - break; - case ieee_function_plus_enum: - { - bfd_vma value1, value2; - asection *section1; - asection *section2; - ieee_symbol_index_type sy1; - ieee_symbol_index_type sy2; - next_byte (&(ieee->h)); - - POP (sy1, section1, value1); - POP (sy2, section2, value2); - PUSH (sy1.letter ? sy1 : sy2, - bfd_is_abs_section (section1) ? section2 : section1, - value1 + value2); - } - break; - default: - { - bfd_vma va; - BFD_ASSERT (this_byte (&(ieee->h)) < (int) ieee_variable_A_enum - || this_byte (&(ieee->h)) > (int) ieee_variable_Z_enum); - if (parse_int (&(ieee->h), &va)) - { - PUSH (NOSYMBOL, bfd_abs_section_ptr, va); - } - else - { - /* - Thats all that we can understand. As far as I can see - there is a bug in the Microtec IEEE output which I'm - using to scan, whereby the comma operator is omitted - sometimes in an expression, giving expressions with too - many terms. We can tell if that's the case by ensuring - that sp == stack here. If not, then we've pushed - something too far, so we keep adding. */ - - while (sp != stack + 1) - { - asection *section1; - ieee_symbol_index_type sy1; - POP (sy1, section1, *extra); - } - { - asection *dummy; - - POP (*symbol, dummy, *value); - if (section) - *section = dummy; - } - - loop = false; - } - } - } - } -} - - -#define ieee_seek(abfd, offset) \ - IEEE_DATA(abfd)->h.input_p = IEEE_DATA(abfd)->h.first_byte + offset - -#define ieee_pos(abfd) \ - (IEEE_DATA(abfd)->h.input_p - IEEE_DATA(abfd)->h.first_byte) - -static unsigned int last_index; -static char last_type; /* is the index for an X or a D */ - -static ieee_symbol_type * -get_symbol (abfd, - ieee, - last_symbol, - symbol_count, - pptr, - max_index, - this_type -) - bfd *abfd; - ieee_data_type *ieee; - ieee_symbol_type *last_symbol; - unsigned int *symbol_count; - ieee_symbol_type ***pptr; - unsigned int *max_index; - char this_type - ; -{ - /* Need a new symbol */ - unsigned int new_index = must_parse_int (&(ieee->h)); - if (new_index != last_index || this_type != last_type) - { - ieee_symbol_type *new_symbol = (ieee_symbol_type *) bfd_alloc (ieee->h.abfd, - sizeof (ieee_symbol_type)); - if (!new_symbol) - return NULL; - - new_symbol->index = new_index; - last_index = new_index; - (*symbol_count)++; - **pptr = new_symbol; - *pptr = &new_symbol->next; - if (new_index > *max_index) - { - *max_index = new_index; - } - last_type = this_type; - new_symbol->symbol.section = bfd_abs_section_ptr; - return new_symbol; - } - return last_symbol; -} - -static boolean -ieee_slurp_external_symbols (abfd) - bfd *abfd; -{ - ieee_data_type *ieee = IEEE_DATA (abfd); - file_ptr offset = ieee->w.r.external_part; - - ieee_symbol_type **prev_symbols_ptr = &ieee->external_symbols; - ieee_symbol_type **prev_reference_ptr = &ieee->external_reference; - ieee_symbol_type *symbol = (ieee_symbol_type *) NULL; - unsigned int symbol_count = 0; - boolean loop = true; - last_index = 0xffffff; - ieee->symbol_table_full = true; - - ieee_seek (abfd, offset); - - while (loop) - { - switch (this_byte (&(ieee->h))) - { - case ieee_nn_record: - next_byte (&(ieee->h)); - - symbol = get_symbol (abfd, ieee, symbol, &symbol_count, - &prev_symbols_ptr, - &ieee->external_symbol_max_index, 'I'); - if (symbol == NULL) - return false; - - symbol->symbol.the_bfd = abfd; - symbol->symbol.name = read_id (&(ieee->h)); - symbol->symbol.udata.p = (PTR) NULL; - symbol->symbol.flags = BSF_NO_FLAGS; - break; - case ieee_external_symbol_enum: - next_byte (&(ieee->h)); - - symbol = get_symbol (abfd, ieee, symbol, &symbol_count, - &prev_symbols_ptr, - &ieee->external_symbol_max_index, 'D'); - if (symbol == NULL) - return false; - - BFD_ASSERT (symbol->index >= ieee->external_symbol_min_index); - - symbol->symbol.the_bfd = abfd; - symbol->symbol.name = read_id (&(ieee->h)); - symbol->symbol.udata.p = (PTR) NULL; - symbol->symbol.flags = BSF_NO_FLAGS; - break; - case ieee_attribute_record_enum >> 8: - { - unsigned int symbol_name_index; - unsigned int symbol_type_index; - unsigned int symbol_attribute_def; - bfd_vma value; - switch (read_2bytes (ieee)) - { - case ieee_attribute_record_enum: - symbol_name_index = must_parse_int (&(ieee->h)); - symbol_type_index = must_parse_int (&(ieee->h)); - symbol_attribute_def = must_parse_int (&(ieee->h)); - switch (symbol_attribute_def) - { - case 8: - case 19: - parse_int (&ieee->h, &value); - break; - default: - (*_bfd_error_handler) - ("%s: unimplemented ATI record %u for symbol %u", - bfd_get_filename (abfd), symbol_attribute_def, - symbol_name_index); - bfd_set_error (bfd_error_bad_value); - return false; - break; - } - break; - case ieee_external_reference_info_record_enum: - /* Skip over ATX record. */ - parse_int (&(ieee->h), &value); - parse_int (&(ieee->h), &value); - parse_int (&(ieee->h), &value); - parse_int (&(ieee->h), &value); - break; - } - } - break; - case ieee_value_record_enum >> 8: - { - unsigned int symbol_name_index; - ieee_symbol_index_type symbol_ignore; - boolean pcrel_ignore; - unsigned int extra; - next_byte (&(ieee->h)); - next_byte (&(ieee->h)); - - symbol_name_index = must_parse_int (&(ieee->h)); - parse_expression (ieee, - &symbol->symbol.value, - &symbol_ignore, - &pcrel_ignore, - &extra, - &symbol->symbol.section); - - symbol->symbol.flags = BSF_GLOBAL | BSF_EXPORT; - - } - break; - case ieee_weak_external_reference_enum: - { - bfd_vma size; - bfd_vma value; - next_byte (&(ieee->h)); - /* Throw away the external reference index */ - (void) must_parse_int (&(ieee->h)); - /* Fetch the default size if not resolved */ - size = must_parse_int (&(ieee->h)); - /* Fetch the defautlt value if available */ - if (parse_int (&(ieee->h), &value) == false) - { - value = 0; - } - /* This turns into a common */ - symbol->symbol.section = bfd_com_section_ptr; - symbol->symbol.value = size; - } - break; - - case ieee_external_reference_enum: - next_byte (&(ieee->h)); - - symbol = get_symbol (abfd, ieee, symbol, &symbol_count, - &prev_reference_ptr, - &ieee->external_reference_max_index, 'X'); - if (symbol == NULL) - return false; - - symbol->symbol.the_bfd = abfd; - symbol->symbol.name = read_id (&(ieee->h)); - symbol->symbol.udata.p = (PTR) NULL; - symbol->symbol.section = bfd_und_section_ptr; - symbol->symbol.value = (bfd_vma) 0; - symbol->symbol.flags = 0; - - BFD_ASSERT (symbol->index >= ieee->external_reference_min_index); - break; - - default: - loop = false; - } - } - - if (ieee->external_symbol_max_index != 0) - { - ieee->external_symbol_count = - ieee->external_symbol_max_index - - ieee->external_symbol_min_index + 1; - } - else - { - ieee->external_symbol_count = 0; - } - - if (ieee->external_reference_max_index != 0) - { - ieee->external_reference_count = - ieee->external_reference_max_index - - ieee->external_reference_min_index + 1; - } - else - { - ieee->external_reference_count = 0; - } - - abfd->symcount = - ieee->external_reference_count + ieee->external_symbol_count; - - if (symbol_count != abfd->symcount) - { - /* There are gaps in the table -- */ - ieee->symbol_table_full = false; - } - - *prev_symbols_ptr = (ieee_symbol_type *) NULL; - *prev_reference_ptr = (ieee_symbol_type *) NULL; - - return true; -} - -static boolean -ieee_slurp_symbol_table (abfd) - bfd *abfd; -{ - if (IEEE_DATA (abfd)->read_symbols == false) - { - if (! ieee_slurp_external_symbols (abfd)) - return false; - IEEE_DATA (abfd)->read_symbols = true; - } - return true; -} - -long -ieee_get_symtab_upper_bound (abfd) - bfd *abfd; -{ - if (! ieee_slurp_symbol_table (abfd)) - return -1; - - return (abfd->symcount != 0) ? - (abfd->symcount + 1) * (sizeof (ieee_symbol_type *)) : 0; -} - -/* -Move from our internal lists to the canon table, and insert in -symbol index order -*/ - -extern const bfd_target ieee_vec; - -long -ieee_get_symtab (abfd, location) - bfd *abfd; - asymbol **location; -{ - ieee_symbol_type *symp; - static bfd dummy_bfd; - static asymbol empty_symbol = - /* the_bfd, name, value, attr, section */ - {&dummy_bfd, " ieee empty", (symvalue) 0, BSF_DEBUGGING, bfd_abs_section_ptr}; - - if (abfd->symcount) - { - ieee_data_type *ieee = IEEE_DATA (abfd); - dummy_bfd.xvec = &ieee_vec; - if (! ieee_slurp_symbol_table (abfd)) - return -1; - - if (ieee->symbol_table_full == false) - { - /* Arrgh - there are gaps in the table, run through and fill them */ - /* up with pointers to a null place */ - unsigned int i; - for (i = 0; i < abfd->symcount; i++) - { - location[i] = &empty_symbol; - } - } - - ieee->external_symbol_base_offset = -ieee->external_symbol_min_index; - for (symp = IEEE_DATA (abfd)->external_symbols; - symp != (ieee_symbol_type *) NULL; - symp = symp->next) - { - /* Place into table at correct index locations */ - location[symp->index + ieee->external_symbol_base_offset] = &symp->symbol; - } - - /* The external refs are indexed in a bit */ - ieee->external_reference_base_offset = - -ieee->external_reference_min_index + ieee->external_symbol_count; - - for (symp = IEEE_DATA (abfd)->external_reference; - symp != (ieee_symbol_type *) NULL; - symp = symp->next) - { - location[symp->index + ieee->external_reference_base_offset] = - &symp->symbol; - - } - } - if (abfd->symcount) - { - location[abfd->symcount] = (asymbol *) NULL; - } - return abfd->symcount; -} - -static asection * -get_section_entry (abfd, ieee, index) - bfd *abfd; - ieee_data_type *ieee; - unsigned int index; -{ - if (ieee->section_table[index] == (asection *) NULL) - { - char *tmp = bfd_alloc (abfd, 11); - asection *section; - - if (!tmp) - return NULL; - sprintf (tmp, " fsec%4d", index); - section = bfd_make_section (abfd, tmp); - ieee->section_table[index] = section; - section->flags = SEC_NO_FLAGS; - section->target_index = index; - ieee->section_table[index] = section; - } - return ieee->section_table[index]; -} - -static void -ieee_slurp_sections (abfd) - bfd *abfd; -{ - ieee_data_type *ieee = IEEE_DATA (abfd); - file_ptr offset = ieee->w.r.section_part; - asection *section = (asection *) NULL; - char *name; - - if (offset != 0) - { - bfd_byte section_type[3]; - ieee_seek (abfd, offset); - while (true) - { - switch (this_byte (&(ieee->h))) - { - case ieee_section_type_enum: - { - unsigned int section_index; - next_byte (&(ieee->h)); - section_index = must_parse_int (&(ieee->h)); - /* Fixme to be nice about a silly number of sections */ - BFD_ASSERT (section_index < NSECTIONS); - - section = get_section_entry (abfd, ieee, section_index); - - section_type[0] = this_byte_and_next (&(ieee->h)); - - /* Set minimal section attributes. Attributes are - extended later, based on section contents. */ - - switch (section_type[0]) - { - case 0xC1: - /* Normal attributes for absolute sections */ - section_type[1] = this_byte (&(ieee->h)); - section->flags = SEC_ALLOC; - switch (section_type[1]) - { - case 0xD3: /* AS Absolute section attributes */ - next_byte (&(ieee->h)); - section_type[2] = this_byte (&(ieee->h)); - switch (section_type[2]) - { - case 0xD0: - /* Normal code */ - next_byte (&(ieee->h)); - section->flags |= SEC_CODE; - break; - case 0xC4: - /* Normal data */ - next_byte (&(ieee->h)); - section->flags |= SEC_DATA; - break; - case 0xD2: - next_byte (&(ieee->h)); - /* Normal rom data */ - section->flags |= SEC_ROM | SEC_DATA; - break; - default: - break; - } - } - break; - case 0xC3: /* Named relocatable sections (type C) */ - section_type[1] = this_byte (&(ieee->h)); - section->flags = SEC_ALLOC; - switch (section_type[1]) - { - case 0xD0: /* Normal code (CP) */ - next_byte (&(ieee->h)); - section->flags |= SEC_CODE; - break; - case 0xC4: /* Normal data (CD) */ - next_byte (&(ieee->h)); - section->flags |= SEC_DATA; - break; - case 0xD2: /* Normal rom data (CR) */ - next_byte (&(ieee->h)); - section->flags |= SEC_ROM | SEC_DATA; - break; - default: - break; - } - } - - /* Read section name, use it if non empty. */ - name = read_id (&ieee->h); - if (name[0]) - section->name = name; - - /* Skip these fields, which we don't care about */ - { - bfd_vma parent, brother, context; - parse_int (&(ieee->h), &parent); - parse_int (&(ieee->h), &brother); - parse_int (&(ieee->h), &context); - } - } - break; - case ieee_section_alignment_enum: - { - unsigned int section_index; - bfd_vma value; - asection *section; - next_byte (&(ieee->h)); - section_index = must_parse_int (&ieee->h); - section = get_section_entry (abfd, ieee, section_index); - if (section_index > ieee->section_count) - { - ieee->section_count = section_index; - } - section->alignment_power = - bfd_log2 (must_parse_int (&ieee->h)); - (void) parse_int (&(ieee->h), &value); - } - break; - case ieee_e2_first_byte_enum: - { - ieee_record_enum_type t = (ieee_record_enum_type) (read_2bytes (&(ieee->h))); - - switch (t) - { - case ieee_section_size_enum: - section = ieee->section_table[must_parse_int (&(ieee->h))]; - section->_raw_size = must_parse_int (&(ieee->h)); - break; - case ieee_physical_region_size_enum: - section = ieee->section_table[must_parse_int (&(ieee->h))]; - section->_raw_size = must_parse_int (&(ieee->h)); - break; - case ieee_region_base_address_enum: - section = ieee->section_table[must_parse_int (&(ieee->h))]; - section->vma = must_parse_int (&(ieee->h)); - section->lma = section->vma; - break; - case ieee_mau_size_enum: - must_parse_int (&(ieee->h)); - must_parse_int (&(ieee->h)); - break; - case ieee_m_value_enum: - must_parse_int (&(ieee->h)); - must_parse_int (&(ieee->h)); - break; - case ieee_section_base_address_enum: - section = ieee->section_table[must_parse_int (&(ieee->h))]; - section->vma = must_parse_int (&(ieee->h)); - section->lma = section->vma; - break; - case ieee_section_offset_enum: - (void) must_parse_int (&(ieee->h)); - (void) must_parse_int (&(ieee->h)); - break; - default: - return; - } - } - break; - default: - return; - } - } - } -} - -/* Make a section for the debugging information, if any. We don't try - to interpret the debugging information; we just point the section - at the area in the file so that program which understand can dig it - out. */ - -static boolean -ieee_slurp_debug (abfd) - bfd *abfd; -{ - ieee_data_type *ieee = IEEE_DATA (abfd); - asection *sec; - - if (ieee->w.r.debug_information_part == 0) - return true; - - sec = bfd_make_section (abfd, ".debug"); - if (sec == NULL) - return false; - sec->flags |= SEC_DEBUGGING | SEC_HAS_CONTENTS; - sec->filepos = ieee->w.r.debug_information_part; - sec->_raw_size = ieee->w.r.data_part - ieee->w.r.debug_information_part; - - return true; -} - -/*********************************************************************** -* archive stuff -*/ - -const bfd_target * -ieee_archive_p (abfd) - bfd *abfd; -{ - char *library; - boolean loop; - unsigned int i; - unsigned char buffer[512]; - file_ptr buffer_offset = 0; - ieee_ar_data_type *save = abfd->tdata.ieee_ar_data; - ieee_ar_data_type *ieee; - abfd->tdata.ieee_ar_data = (ieee_ar_data_type *) bfd_alloc (abfd, sizeof (ieee_ar_data_type)); - if (!abfd->tdata.ieee_ar_data) - return NULL; - ieee = IEEE_AR_DATA (abfd); - - /* FIXME: Check return value. I'm not sure whether it needs to read - the entire buffer or not. */ - bfd_read ((PTR) buffer, 1, sizeof (buffer), abfd); - - ieee->h.first_byte = buffer; - ieee->h.input_p = buffer; - - ieee->h.abfd = abfd; - - if (this_byte (&(ieee->h)) != Module_Beginning) - { - abfd->tdata.ieee_ar_data = save; - return (const bfd_target *) NULL; - } - - next_byte (&(ieee->h)); - library = read_id (&(ieee->h)); - if (strcmp (library, "LIBRARY") != 0) - { - bfd_release (abfd, ieee); - abfd->tdata.ieee_ar_data = save; - return (const bfd_target *) NULL; - } - /* Throw away the filename */ - read_id (&(ieee->h)); - - ieee->element_count = 0; - ieee->element_index = 0; - - next_byte (&(ieee->h)); /* Drop the ad part */ - must_parse_int (&(ieee->h)); /* And the two dummy numbers */ - must_parse_int (&(ieee->h)); - - loop = true; - /* Read the index of the BB table */ - while (loop) - { - ieee_ar_obstack_type t; - int rec = read_2bytes (&(ieee->h)); - if (rec == (int) ieee_assign_value_to_variable_enum) - { - must_parse_int (&(ieee->h)); - t.file_offset = must_parse_int (&(ieee->h)); - t.abfd = (bfd *) NULL; - ieee->element_count++; - - bfd_alloc_grow (abfd, (PTR) &t, sizeof t); - - /* Make sure that we don't go over the end of the buffer */ - - if ((size_t) ieee_pos (abfd) > sizeof (buffer) / 2) - { - /* Past half way, reseek and reprime */ - buffer_offset += ieee_pos (abfd); - if (bfd_seek (abfd, buffer_offset, SEEK_SET) != 0) - return NULL; - /* FIXME: Check return value. I'm not sure whether it - needs to read the entire buffer or not. */ - bfd_read ((PTR) buffer, 1, sizeof (buffer), abfd); - ieee->h.first_byte = buffer; - ieee->h.input_p = buffer; - } - } - else - loop = false; - } - - ieee->elements = (ieee_ar_obstack_type *) bfd_alloc_finish (abfd); - if (!ieee->elements) - return (const bfd_target *) NULL; - - /* Now scan the area again, and replace BB offsets with file */ - /* offsets */ - - for (i = 2; i < ieee->element_count; i++) - { - if (bfd_seek (abfd, ieee->elements[i].file_offset, SEEK_SET) != 0) - return NULL; - /* FIXME: Check return value. I'm not sure whether it needs to - read the entire buffer or not. */ - bfd_read ((PTR) buffer, 1, sizeof (buffer), abfd); - ieee->h.first_byte = buffer; - ieee->h.input_p = buffer; - - next_byte (&(ieee->h)); /* Drop F8 */ - next_byte (&(ieee->h)); /* Drop 14 */ - must_parse_int (&(ieee->h)); /* Drop size of block */ - if (must_parse_int (&(ieee->h)) != 0) - { - /* This object has been deleted */ - ieee->elements[i].file_offset = 0; - } - else - { - ieee->elements[i].file_offset = must_parse_int (&(ieee->h)); - } - } - -/* abfd->has_armap = ;*/ - return abfd->xvec; -} - -static boolean -ieee_mkobject (abfd) - bfd *abfd; -{ - abfd->tdata.ieee_data = (ieee_data_type *) bfd_zalloc (abfd, sizeof (ieee_data_type)); - return abfd->tdata.ieee_data ? true : false; -} - -const bfd_target * -ieee_object_p (abfd) - bfd *abfd; -{ - char *processor; - unsigned int part; - ieee_data_type *ieee; - unsigned char buffer[300]; - ieee_data_type *save = IEEE_DATA (abfd); - - abfd->tdata.ieee_data = 0; - ieee_mkobject (abfd); - - ieee = IEEE_DATA (abfd); - if (bfd_seek (abfd, (file_ptr) 0, SEEK_SET) != 0) - goto fail; - /* Read the first few bytes in to see if it makes sense */ - /* FIXME: Check return value. I'm not sure whether it needs to read - the entire buffer or not. */ - bfd_read ((PTR) buffer, 1, sizeof (buffer), abfd); - - ieee->h.input_p = buffer; - if (this_byte_and_next (&(ieee->h)) != Module_Beginning) - goto got_wrong_format; - - ieee->read_symbols = false; - ieee->read_data = false; - ieee->section_count = 0; - ieee->external_symbol_max_index = 0; - ieee->external_symbol_min_index = IEEE_PUBLIC_BASE; - ieee->external_reference_min_index = IEEE_REFERENCE_BASE; - ieee->external_reference_max_index = 0; - ieee->h.abfd = abfd; - memset ((PTR) ieee->section_table, 0, sizeof (ieee->section_table)); - - processor = ieee->mb.processor = read_id (&(ieee->h)); - if (strcmp (processor, "LIBRARY") == 0) - goto got_wrong_format; - ieee->mb.module_name = read_id (&(ieee->h)); - if (abfd->filename == (CONST char *) NULL) - { - abfd->filename = ieee->mb.module_name; - } - /* Determine the architecture and machine type of the object file. - */ - { - const bfd_arch_info_type *arch = bfd_scan_arch (processor); - if (arch == 0) - goto got_wrong_format; - abfd->arch_info = arch; - } - - if (this_byte (&(ieee->h)) != (int) ieee_address_descriptor_enum) - { - goto fail; - } - next_byte (&(ieee->h)); - - if (parse_int (&(ieee->h), &ieee->ad.number_of_bits_mau) == false) - { - goto fail; - } - if (parse_int (&(ieee->h), &ieee->ad.number_of_maus_in_address) == false) - { - goto fail; - } - - /* If there is a byte order info, take it */ - if (this_byte (&(ieee->h)) == (int) ieee_variable_L_enum || - this_byte (&(ieee->h)) == (int) ieee_variable_M_enum) - next_byte (&(ieee->h)); - - for (part = 0; part < N_W_VARIABLES; part++) - { - boolean ok; - if (read_2bytes (&(ieee->h)) != (int) ieee_assign_value_to_variable_enum) - { - goto fail; - } - if (this_byte_and_next (&(ieee->h)) != part) - { - goto fail; - } - - ieee->w.offset[part] = parse_i (&(ieee->h), &ok); - if (ok == false) - { - goto fail; - } - - } - - if (ieee->w.r.external_part != 0) - abfd->flags = HAS_SYMS; - - /* By now we know that this is a real IEEE file, we're going to read - the whole thing into memory so that we can run up and down it - quickly. We can work out how big the file is from the trailer - record */ - - IEEE_DATA (abfd)->h.first_byte = - (unsigned char *) bfd_alloc (ieee->h.abfd, ieee->w.r.me_record + 1); - if (!IEEE_DATA (abfd)->h.first_byte) - goto fail; - if (bfd_seek (abfd, (file_ptr) 0, SEEK_SET) != 0) - goto fail; - /* FIXME: Check return value. I'm not sure whether it needs to read - the entire buffer or not. */ - bfd_read ((PTR) (IEEE_DATA (abfd)->h.first_byte), 1, - ieee->w.r.me_record + 1, abfd); - - ieee_slurp_sections (abfd); - - if (! ieee_slurp_debug (abfd)) - goto fail; - - /* Parse section data to activate file and section flags implied by - section contents. */ - - if (! ieee_slurp_section_data (abfd)) - goto fail; - - return abfd->xvec; -got_wrong_format: - bfd_set_error (bfd_error_wrong_format); -fail: - (void) bfd_release (abfd, ieee); - abfd->tdata.ieee_data = save; - return (const bfd_target *) NULL; -} - -void -ieee_get_symbol_info (ignore_abfd, symbol, ret) - bfd *ignore_abfd; - asymbol *symbol; - symbol_info *ret; -{ - bfd_symbol_info (symbol, ret); - if (symbol->name[0] == ' ') - ret->name = "* empty table entry "; - if (!symbol->section) - ret->type = (symbol->flags & BSF_LOCAL) ? 'a' : 'A'; -} - -void -ieee_print_symbol (ignore_abfd, afile, symbol, how) - bfd *ignore_abfd; - PTR afile; - asymbol *symbol; - bfd_print_symbol_type how; -{ - FILE *file = (FILE *) afile; - - switch (how) - { - case bfd_print_symbol_name: - fprintf (file, "%s", symbol->name); - break; - case bfd_print_symbol_more: -#if 0 - fprintf (file, "%4x %2x", aout_symbol (symbol)->desc & 0xffff, - aout_symbol (symbol)->other & 0xff); -#endif - BFD_FAIL (); - break; - case bfd_print_symbol_all: - { - const char *section_name = - (symbol->section == (asection *) NULL - ? "*abs" - : symbol->section->name); - if (symbol->name[0] == ' ') - { - fprintf (file, "* empty table entry "); - } - else - { - bfd_print_symbol_vandf ((PTR) file, symbol); - - fprintf (file, " %-5s %04x %02x %s", - section_name, - (unsigned) ieee_symbol (symbol)->index, - (unsigned) 0, - symbol->name); - } - } - break; - } -} - -static boolean -do_one (ieee, current_map, location_ptr, s, iterations) - ieee_data_type *ieee; - ieee_per_section_type *current_map; - unsigned char *location_ptr; - asection *s; - int iterations; -{ - switch (this_byte (&(ieee->h))) - { - case ieee_load_constant_bytes_enum: - { - unsigned int number_of_maus; - unsigned int i; - next_byte (&(ieee->h)); - number_of_maus = must_parse_int (&(ieee->h)); - - for (i = 0; i < number_of_maus; i++) - { - location_ptr[current_map->pc++] = this_byte (&(ieee->h)); - next_byte (&(ieee->h)); - } - } - break; - - case ieee_load_with_relocation_enum: - { - boolean loop = true; - next_byte (&(ieee->h)); - while (loop) - { - switch (this_byte (&(ieee->h))) - { - case ieee_variable_R_enum: - - case ieee_function_signed_open_b_enum: - case ieee_function_unsigned_open_b_enum: - case ieee_function_either_open_b_enum: - { - unsigned int extra = 4; - boolean pcrel = false; - asection *section; - ieee_reloc_type *r = - (ieee_reloc_type *) bfd_alloc (ieee->h.abfd, - sizeof (ieee_reloc_type)); - if (!r) - return false; - - *(current_map->reloc_tail_ptr) = r; - current_map->reloc_tail_ptr = &r->next; - r->next = (ieee_reloc_type *) NULL; - next_byte (&(ieee->h)); -/* abort();*/ - r->relent.sym_ptr_ptr = 0; - parse_expression (ieee, - &r->relent.addend, - &r->symbol, - &pcrel, &extra, §ion); - r->relent.address = current_map->pc; - s->flags |= SEC_RELOC; - s->owner->flags |= HAS_RELOC; - s->reloc_count++; - if (r->relent.sym_ptr_ptr == 0) - { - r->relent.sym_ptr_ptr = section->symbol_ptr_ptr; - } - - if (this_byte (&(ieee->h)) == (int) ieee_comma) - { - next_byte (&(ieee->h)); - /* Fetch number of bytes to pad */ - extra = must_parse_int (&(ieee->h)); - }; - - switch (this_byte (&(ieee->h))) - { - case ieee_function_signed_close_b_enum: - next_byte (&(ieee->h)); - break; - case ieee_function_unsigned_close_b_enum: - next_byte (&(ieee->h)); - break; - case ieee_function_either_close_b_enum: - next_byte (&(ieee->h)); - break; - default: - break; - } - /* Build a relocation entry for this type */ - /* If pc rel then stick -ve pc into instruction - and take out of reloc .. - - I've changed this. It's all too complicated. I - keep 0 in the instruction now. */ - - switch (extra) - { - case 0: - case 4: - - if (pcrel == true) - { -#if KEEPMINUSPCININST - bfd_put_32 (ieee->h.abfd, -current_map->pc, location_ptr + - current_map->pc); - r->relent.howto = &rel32_howto; - r->relent.addend -= - current_map->pc; -#else - bfd_put_32 (ieee->h.abfd, 0, location_ptr + - current_map->pc); - r->relent.howto = &rel32_howto; -#endif - } - else - { - bfd_put_32 (ieee->h.abfd, 0, location_ptr + - current_map->pc); - r->relent.howto = &abs32_howto; - } - current_map->pc += 4; - break; - case 2: - if (pcrel == true) - { -#if KEEPMINUSPCININST - bfd_put_16 (ieee->h.abfd, (int) (-current_map->pc), location_ptr + current_map->pc); - r->relent.addend -= current_map->pc; - r->relent.howto = &rel16_howto; -#else - - bfd_put_16 (ieee->h.abfd, 0, location_ptr + current_map->pc); - r->relent.howto = &rel16_howto; -#endif - } - - else - { - bfd_put_16 (ieee->h.abfd, 0, location_ptr + current_map->pc); - r->relent.howto = &abs16_howto; - } - current_map->pc += 2; - break; - case 1: - if (pcrel == true) - { -#if KEEPMINUSPCININST - bfd_put_8 (ieee->h.abfd, (int) (-current_map->pc), location_ptr + current_map->pc); - r->relent.addend -= current_map->pc; - r->relent.howto = &rel8_howto; -#else - bfd_put_8 (ieee->h.abfd, 0, location_ptr + current_map->pc); - r->relent.howto = &rel8_howto; -#endif - } - else - { - bfd_put_8 (ieee->h.abfd, 0, location_ptr + current_map->pc); - r->relent.howto = &abs8_howto; - } - current_map->pc += 1; - break; - - default: - BFD_FAIL (); - return false; - } - } - break; - default: - { - bfd_vma this_size; - if (parse_int (&(ieee->h), &this_size) == true) - { - unsigned int i; - for (i = 0; i < this_size; i++) - { - location_ptr[current_map->pc++] = this_byte (&(ieee->h)); - next_byte (&(ieee->h)); - } - } - else - { - loop = false; - } - } - } - - /* Prevent more than the first load-item of an LR record - from being repeated (MRI convention). */ - if (iterations != 1) - loop = false; - } - } - } - return true; -} - -/* Read in all the section data and relocation stuff too */ -static boolean -ieee_slurp_section_data (abfd) - bfd *abfd; -{ - bfd_byte *location_ptr = (bfd_byte *) NULL; - ieee_data_type *ieee = IEEE_DATA (abfd); - unsigned int section_number; - - ieee_per_section_type *current_map = (ieee_per_section_type *) NULL; - asection *s; - /* Seek to the start of the data area */ - if (ieee->read_data == true) - return true; - ieee->read_data = true; - ieee_seek (abfd, ieee->w.r.data_part); - - /* Allocate enough space for all the section contents */ - - for (s = abfd->sections; s != (asection *) NULL; s = s->next) - { - ieee_per_section_type *per = (ieee_per_section_type *) s->used_by_bfd; - if ((s->flags & SEC_DEBUGGING) != 0) - continue; - per->data = (bfd_byte *) bfd_alloc (ieee->h.abfd, s->_raw_size); - if (!per->data) - return false; - /*SUPPRESS 68*/ - per->reloc_tail_ptr = - (ieee_reloc_type **) & (s->relocation); - } - - while (true) - { - switch (this_byte (&(ieee->h))) - { - /* IF we see anything strange then quit */ - default: - return true; - - case ieee_set_current_section_enum: - next_byte (&(ieee->h)); - section_number = must_parse_int (&(ieee->h)); - s = ieee->section_table[section_number]; - s->flags |= SEC_LOAD | SEC_HAS_CONTENTS; - current_map = (ieee_per_section_type *) s->used_by_bfd; - location_ptr = current_map->data - s->vma; - /* The document I have says that Microtec's compilers reset */ - /* this after a sec section, even though the standard says not */ - /* to. SO .. */ - current_map->pc = s->vma; - break; - - case ieee_e2_first_byte_enum: - next_byte (&(ieee->h)); - switch (this_byte (&(ieee->h))) - { - case ieee_set_current_pc_enum & 0xff: - { - bfd_vma value; - ieee_symbol_index_type symbol; - unsigned int extra; - boolean pcrel; - next_byte (&(ieee->h)); - must_parse_int (&(ieee->h)); /* Thow away section #*/ - parse_expression (ieee, &value, - &symbol, - &pcrel, &extra, - 0); - current_map->pc = value; - BFD_ASSERT ((unsigned) (value - s->vma) <= s->_raw_size); - } - break; - - case ieee_value_starting_address_enum & 0xff: - /* We've got to the end of the data now - */ - return true; - default: - BFD_FAIL (); - return false; - } - break; - case ieee_repeat_data_enum: - { - /* Repeat the following LD or LR n times - we do this by - remembering the stream pointer before running it and - resetting it and running it n times. We special case - the repetition of a repeat_data/load_constant - */ - - unsigned int iterations; - unsigned char *start; - next_byte (&(ieee->h)); - iterations = must_parse_int (&(ieee->h)); - start = ieee->h.input_p; - if (start[0] == (int) ieee_load_constant_bytes_enum && - start[1] == 1) - { - while (iterations != 0) - { - location_ptr[current_map->pc++] = start[2]; - iterations--; - } - next_byte (&(ieee->h)); - next_byte (&(ieee->h)); - next_byte (&(ieee->h)); - } - else - { - while (iterations != 0) - { - ieee->h.input_p = start; - if (!do_one (ieee, current_map, location_ptr, s, - iterations)) - return false; - iterations--; - } - } - } - break; - case ieee_load_constant_bytes_enum: - case ieee_load_with_relocation_enum: - { - if (!do_one (ieee, current_map, location_ptr, s, 1)) - return false; - } - } - } -} - -boolean -ieee_new_section_hook (abfd, newsect) - bfd *abfd; - asection *newsect; -{ - newsect->used_by_bfd = (PTR) - bfd_alloc (abfd, sizeof (ieee_per_section_type)); - if (!newsect->used_by_bfd) - return false; - ieee_per_section (newsect)->data = (bfd_byte *) NULL; - ieee_per_section (newsect)->section = newsect; - return true; -} - -long -ieee_get_reloc_upper_bound (abfd, asect) - bfd *abfd; - sec_ptr asect; -{ - if ((asect->flags & SEC_DEBUGGING) != 0) - return 0; - if (! ieee_slurp_section_data (abfd)) - return -1; - return (asect->reloc_count + 1) * sizeof (arelent *); -} - -static boolean -ieee_get_section_contents (abfd, section, location, offset, count) - bfd *abfd; - sec_ptr section; - PTR location; - file_ptr offset; - bfd_size_type count; -{ - ieee_per_section_type *p = (ieee_per_section_type *) section->used_by_bfd; - if ((section->flags & SEC_DEBUGGING) != 0) - return _bfd_generic_get_section_contents (abfd, section, location, - offset, count); - ieee_slurp_section_data (abfd); - (void) memcpy ((PTR) location, (PTR) (p->data + offset), (unsigned) count); - return true; -} - -long -ieee_canonicalize_reloc (abfd, section, relptr, symbols) - bfd *abfd; - sec_ptr section; - arelent **relptr; - asymbol **symbols; -{ -/* ieee_per_section_type *p = (ieee_per_section_type *) section->used_by_bfd;*/ - ieee_reloc_type *src = (ieee_reloc_type *) (section->relocation); - ieee_data_type *ieee = IEEE_DATA (abfd); - - if ((section->flags & SEC_DEBUGGING) != 0) - return 0; - - while (src != (ieee_reloc_type *) NULL) - { - /* Work out which symbol to attach it this reloc to */ - switch (src->symbol.letter) - { - case 'I': - src->relent.sym_ptr_ptr = - symbols + src->symbol.index + ieee->external_symbol_base_offset; - break; - case 'X': - src->relent.sym_ptr_ptr = - symbols + src->symbol.index + ieee->external_reference_base_offset; - break; - case 0: - src->relent.sym_ptr_ptr = - src->relent.sym_ptr_ptr[0]->section->symbol_ptr_ptr; - break; - default: - - BFD_FAIL (); - } - *relptr++ = &src->relent; - src = src->next; - } - *relptr = (arelent *) NULL; - return section->reloc_count; -} - -static int -comp (ap, bp) - CONST PTR ap; - CONST PTR bp; -{ - arelent *a = *((arelent **) ap); - arelent *b = *((arelent **) bp); - return a->address - b->address; -} - -/* Write the section headers. */ - -static boolean -ieee_write_section_part (abfd) - bfd *abfd; -{ - ieee_data_type *ieee = IEEE_DATA (abfd); - asection *s; - ieee->w.r.section_part = bfd_tell (abfd); - for (s = abfd->sections; s != (asection *) NULL; s = s->next) - { - if (! bfd_is_abs_section (s) - && (s->flags & SEC_DEBUGGING) == 0) - { - if (! ieee_write_byte (abfd, ieee_section_type_enum) - || ! ieee_write_byte (abfd, - (bfd_byte) (s->index - + IEEE_SECTION_NUMBER_BASE))) - return false; - - if (abfd->flags & EXEC_P) - { - /* This image is executable, so output absolute sections */ - if (! ieee_write_byte (abfd, ieee_variable_A_enum) - || ! ieee_write_byte (abfd, ieee_variable_S_enum)) - return false; - } - else - { - if (! ieee_write_byte (abfd, ieee_variable_C_enum)) - return false; - } - - switch (s->flags & (SEC_CODE | SEC_DATA | SEC_ROM)) - { - case SEC_CODE | SEC_LOAD: - case SEC_CODE: - if (! ieee_write_byte (abfd, ieee_variable_P_enum)) - return false; - break; - case SEC_DATA: - default: - if (! ieee_write_byte (abfd, ieee_variable_D_enum)) - return false; - break; - case SEC_ROM: - case SEC_ROM | SEC_DATA: - case SEC_ROM | SEC_LOAD: - case SEC_ROM | SEC_DATA | SEC_LOAD: - if (! ieee_write_byte (abfd, ieee_variable_R_enum)) - return false; - } - - - if (! ieee_write_id (abfd, s->name)) - return false; -#if 0 - ieee_write_int (abfd, 0); /* Parent */ - ieee_write_int (abfd, 0); /* Brother */ - ieee_write_int (abfd, 0); /* Context */ -#endif - /* Alignment */ - if (! ieee_write_byte (abfd, ieee_section_alignment_enum) - || ! ieee_write_byte (abfd, - (bfd_byte) (s->index - + IEEE_SECTION_NUMBER_BASE)) - || ! ieee_write_int (abfd, 1 << s->alignment_power)) - return false; - - /* Size */ - if (! ieee_write_2bytes (abfd, ieee_section_size_enum) - || ! ieee_write_byte (abfd, - (bfd_byte) (s->index - + IEEE_SECTION_NUMBER_BASE)) - || ! ieee_write_int (abfd, s->_raw_size)) - return false; - if (abfd->flags & EXEC_P) - { - /* Relocateable sections don't have asl records */ - /* Vma */ - if (! ieee_write_2bytes (abfd, ieee_section_base_address_enum) - || ! ieee_write_byte (abfd, - ((bfd_byte) - (s->index - + IEEE_SECTION_NUMBER_BASE))) - || ! ieee_write_int (abfd, s->vma)) - return false; - } - } - } - - return true; -} - - -static boolean -do_with_relocs (abfd, s) - bfd *abfd; - asection *s; -{ - unsigned int number_of_maus_in_address = - bfd_arch_bits_per_address (abfd) / bfd_arch_bits_per_byte (abfd); - unsigned int relocs_to_go = s->reloc_count; - bfd_byte *stream = ieee_per_section (s)->data; - arelent **p = s->orelocation; - bfd_size_type current_byte_index = 0; - - qsort (s->orelocation, - relocs_to_go, - sizeof (arelent **), - comp); - - /* Output the section preheader */ - if (! ieee_write_byte (abfd, ieee_set_current_section_enum) - || ! ieee_write_byte (abfd, - (bfd_byte) (s->index + IEEE_SECTION_NUMBER_BASE)) - || ! ieee_write_2bytes (abfd, ieee_set_current_pc_enum) - || ! ieee_write_byte (abfd, - (bfd_byte) (s->index + IEEE_SECTION_NUMBER_BASE))) - return false; - if ((abfd->flags & EXEC_P) != 0 && relocs_to_go == 0) - { - if (! ieee_write_int (abfd, s->vma)) - return false; - } - else - { - if (! ieee_write_expression (abfd, 0, s->symbol, 0, 0)) - return false; - } - - if (relocs_to_go == 0) - { - /* If there aren't any relocations then output the load constant - byte opcode rather than the load with relocation opcode */ - - while (current_byte_index < s->_raw_size) - { - bfd_size_type run; - unsigned int MAXRUN = 127; - run = MAXRUN; - if (run > s->_raw_size - current_byte_index) - { - run = s->_raw_size - current_byte_index; - } - - if (run != 0) - { - if (! ieee_write_byte (abfd, ieee_load_constant_bytes_enum)) - return false; - /* Output a stream of bytes */ - if (! ieee_write_int (abfd, run)) - return false; - if (bfd_write ((PTR) (stream + current_byte_index), - 1, - run, - abfd) - != run) - return false; - current_byte_index += run; - } - } - } - else - { - if (! ieee_write_byte (abfd, ieee_load_with_relocation_enum)) - return false; - - /* Output the data stream as the longest sequence of bytes - possible, allowing for the a reasonable packet size and - relocation stuffs. */ - - if ((PTR) stream == (PTR) NULL) - { - /* Outputting a section without data, fill it up */ - stream = (unsigned char *) (bfd_alloc (abfd, s->_raw_size)); - if (!stream) - return false; - memset ((PTR) stream, 0, (size_t) s->_raw_size); - } - while (current_byte_index < s->_raw_size) - { - bfd_size_type run; - unsigned int MAXRUN = 127; - if (relocs_to_go) - { - run = (*p)->address - current_byte_index; - if (run > MAXRUN) - run = MAXRUN; - } - else - { - run = MAXRUN; - } - if (run > s->_raw_size - current_byte_index) - { - run = s->_raw_size - current_byte_index; - } - - if (run != 0) - { - /* Output a stream of bytes */ - if (! ieee_write_int (abfd, run)) - return false; - if (bfd_write ((PTR) (stream + current_byte_index), - 1, - run, - abfd) - != run) - return false; - current_byte_index += run; - } - /* Output any relocations here */ - if (relocs_to_go && (*p) && (*p)->address == current_byte_index) - { - while (relocs_to_go - && (*p) && (*p)->address == current_byte_index) - { - arelent *r = *p; - bfd_signed_vma ov; - -#if 0 - if (r->howto->pc_relative) - { - r->addend += current_byte_index; - } -#endif - - switch (r->howto->size) - { - case 2: - - ov = bfd_get_signed_32 (abfd, - stream + current_byte_index); - current_byte_index += 4; - break; - case 1: - ov = bfd_get_signed_16 (abfd, - stream + current_byte_index); - current_byte_index += 2; - break; - case 0: - ov = bfd_get_signed_8 (abfd, - stream + current_byte_index); - current_byte_index++; - break; - default: - ov = 0; - BFD_FAIL (); - return false; - } - - ov &= r->howto->src_mask; - - if (r->howto->pc_relative - && ! r->howto->pcrel_offset) - ov += r->address; - - if (! ieee_write_byte (abfd, - ieee_function_either_open_b_enum)) - return false; - -/* abort();*/ - - if (r->sym_ptr_ptr != (asymbol **) NULL) - { - if (! ieee_write_expression (abfd, r->addend + ov, - *(r->sym_ptr_ptr), - r->howto->pc_relative, - s->index)) - return false; - } - else - { - if (! ieee_write_expression (abfd, r->addend + ov, - (asymbol *) NULL, - r->howto->pc_relative, - s->index)) - return false; - } - - if (number_of_maus_in_address - != bfd_get_reloc_size (r->howto)) - { - if (! ieee_write_int (abfd, - bfd_get_reloc_size (r->howto))) - return false; - } - if (! ieee_write_byte (abfd, - ieee_function_either_close_b_enum)) - return false; - - relocs_to_go--; - p++; - } - - } - } - } - - return true; -} - -/* If there are no relocations in the output section then we can be - clever about how we write. We block items up into a max of 127 - bytes. */ - -static boolean -do_as_repeat (abfd, s) - bfd *abfd; - asection *s; -{ - if (s->_raw_size) - { - if (! ieee_write_byte (abfd, ieee_set_current_section_enum) - || ! ieee_write_byte (abfd, - (bfd_byte) (s->index - + IEEE_SECTION_NUMBER_BASE)) - || ! ieee_write_byte (abfd, ieee_set_current_pc_enum >> 8) - || ! ieee_write_byte (abfd, ieee_set_current_pc_enum & 0xff) - || ! ieee_write_byte (abfd, - (bfd_byte) (s->index - + IEEE_SECTION_NUMBER_BASE)) - || ! ieee_write_int (abfd, s->vma) - || ! ieee_write_byte (abfd, ieee_repeat_data_enum) - || ! ieee_write_int (abfd, s->_raw_size) - || ! ieee_write_byte (abfd, ieee_load_constant_bytes_enum) - || ! ieee_write_byte (abfd, 1) - || ! ieee_write_byte (abfd, 0)) - return false; - } - - return true; -} - -static boolean -do_without_relocs (abfd, s) - bfd *abfd; - asection *s; -{ - bfd_byte *stream = ieee_per_section (s)->data; - - if (stream == 0 || ((s->flags & SEC_LOAD) == 0)) - { - if (! do_as_repeat (abfd, s)) - return false; - } - else - { - unsigned int i; - for (i = 0; i < s->_raw_size; i++) - { - if (stream[i] != 0) - { - if (! do_with_relocs (abfd, s)) - return false; - return true; - } - } - if (! do_as_repeat (abfd, s)) - return false; - } - - return true; -} - - -static unsigned char *output_ptr_start; -static unsigned char *output_ptr; -static unsigned char *output_ptr_end; -static unsigned char *input_ptr_start; -static unsigned char *input_ptr; -static unsigned char *input_ptr_end; -static bfd *input_bfd; -static bfd *output_bfd; -static int output_buffer; - -static void -fill () -{ - /* FIXME: Check return value. I'm not sure whether it needs to read - the entire buffer or not. */ - bfd_read ((PTR) input_ptr_start, 1, input_ptr_end - input_ptr_start, input_bfd); - input_ptr = input_ptr_start; -} -static void -flush () -{ - if (bfd_write ((PTR) (output_ptr_start), 1, output_ptr - output_ptr_start, - output_bfd) - != (bfd_size_type) (output_ptr - output_ptr_start)) - abort (); - output_ptr = output_ptr_start; - output_buffer++; -} - -#define THIS() ( *input_ptr ) -#define NEXT() { input_ptr++; if (input_ptr == input_ptr_end) fill(); } -#define OUT(x) { *output_ptr++ = (x); if(output_ptr == output_ptr_end) flush(); } - -static void -write_int (value) - int value; -{ - if (value >= 0 && value <= 127) - { - OUT (value); - } - else - { - unsigned int length; - /* How many significant bytes ? */ - /* FIXME FOR LONGER INTS */ - if (value & 0xff000000) - { - length = 4; - } - else if (value & 0x00ff0000) - { - length = 3; - } - else if (value & 0x0000ff00) - { - length = 2; - } - else - length = 1; - - OUT ((int) ieee_number_repeat_start_enum + length); - switch (length) - { - case 4: - OUT (value >> 24); - case 3: - OUT (value >> 16); - case 2: - OUT (value >> 8); - case 1: - OUT (value); - } - - } -} - -static void -copy_id () -{ - int length = THIS (); - char ch; - OUT (length); - NEXT (); - while (length--) - { - ch = THIS (); - OUT (ch); - NEXT (); - } -} - -#define VAR(x) ((x | 0x80)) -static void -copy_expression () -{ - int stack[10]; - int *tos = stack; - int value = 0; - while (1) - { - switch (THIS ()) - { - case 0x84: - NEXT (); - value = THIS (); - NEXT (); - value = (value << 8) | THIS (); - NEXT (); - value = (value << 8) | THIS (); - NEXT (); - value = (value << 8) | THIS (); - NEXT (); - *tos++ = value; - break; - case 0x83: - NEXT (); - value = THIS (); - NEXT (); - value = (value << 8) | THIS (); - NEXT (); - value = (value << 8) | THIS (); - NEXT (); - *tos++ = value; - break; - case 0x82: - NEXT (); - value = THIS (); - NEXT (); - value = (value << 8) | THIS (); - NEXT (); - *tos++ = value; - break; - case 0x81: - NEXT (); - value = THIS (); - NEXT (); - *tos++ = value; - break; - case 0x80: - NEXT (); - *tos++ = 0; - break; - default: - if (THIS () > 0x84) - { - /* Not a number, just bug out with the answer */ - write_int (*(--tos)); - return; - } - *tos++ = THIS (); - NEXT (); - value = 0; - break; - case 0xa5: - /* PLUS anything */ - { - int value = *(--tos); - value += *(--tos); - *tos++ = value; - NEXT (); - } - break; - case VAR ('R'): - { - int section_number; - ieee_data_type *ieee; - asection *s; - NEXT (); - section_number = THIS (); - - NEXT (); - ieee = IEEE_DATA (input_bfd); - s = ieee->section_table[section_number]; - if (s->output_section) - { - value = s->output_section->vma; - } - else - { - value = 0; - } - value += s->output_offset; - *tos++ = value; - value = 0; - } - break; - case 0x90: - { - NEXT (); - write_int (*(--tos)); - OUT (0x90); - return; - - } - } - } - -} - -/* Drop the int in the buffer, and copy a null into the gap, which we - will overwrite later */ - -struct output_buffer_struct -{ - unsigned char *ptrp; - int buffer; -}; - -static void -fill_int (buf) - struct output_buffer_struct *buf; -{ - if (buf->buffer == output_buffer) - { - /* Still a chance to output the size */ - int value = output_ptr - buf->ptrp + 3; - buf->ptrp[0] = value >> 24; - buf->ptrp[1] = value >> 16; - buf->ptrp[2] = value >> 8; - buf->ptrp[3] = value >> 0; - } -} - -static void -drop_int (buf) - struct output_buffer_struct *buf; -{ - int type = THIS (); - int ch; - if (type <= 0x84) - { - NEXT (); - switch (type) - { - case 0x84: - ch = THIS (); - NEXT (); - case 0x83: - ch = THIS (); - NEXT (); - case 0x82: - ch = THIS (); - NEXT (); - case 0x81: - ch = THIS (); - NEXT (); - case 0x80: - break; - } - } - OUT (0x84); - buf->ptrp = output_ptr; - buf->buffer = output_buffer; - OUT (0); - OUT (0); - OUT (0); - OUT (0); -} - -static void -copy_int () -{ - int type = THIS (); - int ch; - if (type <= 0x84) - { - OUT (type); - NEXT (); - switch (type) - { - case 0x84: - ch = THIS (); - NEXT (); - OUT (ch); - case 0x83: - ch = THIS (); - NEXT (); - OUT (ch); - case 0x82: - ch = THIS (); - NEXT (); - OUT (ch); - case 0x81: - ch = THIS (); - NEXT (); - OUT (ch); - case 0x80: - break; - } - } -} - -#define ID copy_id() -#define INT copy_int() -#define EXP copy_expression() -static void copy_till_end (); -#define INTn(q) copy_int() -#define EXPn(q) copy_expression() - -static void -f1_record () -{ - int ch; - /* ATN record */ - NEXT (); - ch = THIS (); - switch (ch) - { - default: - OUT (0xf1); - OUT (ch); - break; - case 0xc9: - NEXT (); - OUT (0xf1); - OUT (0xc9); - INT; - INT; - ch = THIS (); - switch (ch) - { - case 0x16: - NEXT (); - break; - case 0x01: - NEXT (); - break; - case 0x00: - NEXT (); - INT; - break; - case 0x03: - NEXT (); - INT; - break; - case 0x13: - EXPn (instruction address); - break; - default: - break; - } - break; - case 0xd8: - /* EXternal ref */ - NEXT (); - OUT (0xf1); - OUT (0xd8); - EXP; - EXP; - EXP; - EXP; - break; - case 0xce: - NEXT (); - OUT (0xf1); - OUT (0xce); - INT; - INT; - ch = THIS (); - INT; - switch (ch) - { - case 0x01: - INT; - INT; - break; - case 0x02: - INT; - break; - case 0x04: - EXPn (external function); - break; - case 0x05: - break; - case 0x07: - INTn (line number); - INT; - case 0x08: - break; - case 0x0a: - INTn (locked register); - INT; - break; - case 0x3f: - copy_till_end (); - break; - case 0x3e: - copy_till_end (); - break; - case 0x40: - copy_till_end (); - break; - case 0x41: - ID; - break; - } - } - -} - -static void -f0_record () -{ - /* Attribute record */ - NEXT (); - OUT (0xf0); - INTn (Symbol name); - ID; -} - -static void -copy_till_end () -{ - int ch = THIS (); - while (1) - { - while (ch <= 0x80) - { - OUT (ch); - NEXT (); - ch = THIS (); - } - switch (ch) - { - case 0x84: - OUT (THIS ()); - NEXT (); - case 0x83: - OUT (THIS ()); - NEXT (); - case 0x82: - OUT (THIS ()); - NEXT (); - case 0x81: - OUT (THIS ()); - NEXT (); - OUT (THIS ()); - NEXT (); - - ch = THIS (); - break; - default: - return; - } - } - -} - -static void -f2_record () -{ - NEXT (); - OUT (0xf2); - INT; - NEXT (); - OUT (0xce); - INT; - copy_till_end (); -} - - -static void block (); -static void -f8_record () -{ - int ch; - NEXT (); - ch = THIS (); - switch (ch) - { - case 0x01: - case 0x02: - case 0x03: - /* Unique typedefs for module */ - /* GLobal typedefs */ - /* High level module scope beginning */ - { - struct output_buffer_struct ob; - NEXT (); - OUT (0xf8); - OUT (ch); - drop_int (&ob); - ID; - - block (); - - NEXT (); - fill_int (&ob); - OUT (0xf9); - } - break; - case 0x04: - /* Global function */ - { - struct output_buffer_struct ob; - NEXT (); - OUT (0xf8); - OUT (0x04); - drop_int (&ob); - ID; - INTn (stack size); - INTn (ret val); - EXPn (offset); - - block (); - - NEXT (); - OUT (0xf9); - EXPn (size of block); - fill_int (&ob); - } - break; - - case 0x05: - /* File name for source line numbers */ - { - struct output_buffer_struct ob; - NEXT (); - OUT (0xf8); - OUT (0x05); - drop_int (&ob); - ID; - INTn (year); - INTn (month); - INTn (day); - INTn (hour); - INTn (monute); - INTn (second); - block (); - NEXT (); - OUT (0xf9); - fill_int (&ob); - } - break; - - case 0x06: - /* Local function */ - { - struct output_buffer_struct ob; - NEXT (); - OUT (0xf8); - OUT (0x06); - drop_int (&ob); - ID; - INTn (stack size); - INTn (type return); - EXPn (offset); - block (); - NEXT (); - OUT (0xf9); - EXPn (size); - fill_int (&ob); - } - break; - - case 0x0a: - /* Assembler module scope beginning -*/ - { - struct output_buffer_struct ob; - - NEXT (); - OUT (0xf8); - OUT (0x0a); - drop_int (&ob); - ID; - ID; - INT; - ID; - INT; - INT; - INT; - INT; - INT; - INT; - - block (); - - NEXT (); - OUT (0xf9); - fill_int (&ob); - } - break; - case 0x0b: - { - struct output_buffer_struct ob; - NEXT (); - OUT (0xf8); - OUT (0x0b); - drop_int (&ob); - ID; - INT; - INTn (section index); - EXPn (offset); - INTn (stuff); - - block (); - - OUT (0xf9); - NEXT (); - EXPn (Size in Maus); - fill_int (&ob); - } - break; - } -} - -static void -e2_record () -{ - OUT (0xe2); - NEXT (); - OUT (0xce); - NEXT (); - INT; - EXP; -} - -static void -block () -{ - int ch; - while (1) - { - ch = THIS (); - switch (ch) - { - case 0xe1: - case 0xe5: - return; - case 0xf9: - return; - case 0xf0: - f0_record (); - break; - case 0xf1: - f1_record (); - break; - case 0xf2: - f2_record (); - break; - case 0xf8: - f8_record (); - break; - case 0xe2: - e2_record (); - break; - - } - } -} - - - -/* relocate_debug, - moves all the debug information from the source bfd to the output - bfd, and relocates any expressions it finds -*/ - -static void -relocate_debug (output, input) - bfd *output; - bfd *input; -{ -#define IBS 400 -#define OBS 400 - unsigned char input_buffer[IBS]; - - input_ptr_start = input_ptr = input_buffer; - input_ptr_end = input_buffer + IBS; - input_bfd = input; - /* FIXME: Check return value. I'm not sure whether it needs to read - the entire buffer or not. */ - bfd_read ((PTR) input_ptr_start, 1, IBS, input); - block (); -} - -/* - During linking, we we told about the bfds which made up our - contents, we have a list of them. They will still be open, so go to - the debug info in each, and copy it out, relocating it as we go. -*/ - -static boolean -ieee_write_debug_part (abfd) - bfd *abfd; -{ - ieee_data_type *ieee = IEEE_DATA (abfd); - bfd_chain_type *chain = ieee->chain_root; - unsigned char output_buffer[OBS]; - boolean some_debug = false; - file_ptr here = bfd_tell (abfd); - - output_ptr_start = output_ptr = output_buffer; - output_ptr_end = output_buffer + OBS; - output_ptr = output_buffer; - output_bfd = abfd; - - if (chain == (bfd_chain_type *) NULL) - { - asection *s; - - for (s = abfd->sections; s != NULL; s = s->next) - if ((s->flags & SEC_DEBUGGING) != 0) - break; - if (s == NULL) - { - ieee->w.r.debug_information_part = 0; - return true; - } - - ieee->w.r.debug_information_part = here; - if (bfd_write (s->contents, 1, s->_raw_size, abfd) != s->_raw_size) - return false; - } - else - { - while (chain != (bfd_chain_type *) NULL) - { - bfd *entry = chain->this; - ieee_data_type *entry_ieee = IEEE_DATA (entry); - if (entry_ieee->w.r.debug_information_part) - { - if (bfd_seek (entry, entry_ieee->w.r.debug_information_part, - SEEK_SET) - != 0) - return false; - relocate_debug (abfd, entry); - } - - chain = chain->next; - } - if (some_debug) - { - ieee->w.r.debug_information_part = here; - } - else - { - ieee->w.r.debug_information_part = 0; - } - - flush (); - } - - return true; -} - -/* Write the data in an ieee way. */ - -static boolean -ieee_write_data_part (abfd) - bfd *abfd; -{ - asection *s; - ieee_data_type *ieee = IEEE_DATA (abfd); - ieee->w.r.data_part = bfd_tell (abfd); - for (s = abfd->sections; s != (asection *) NULL; s = s->next) - { - /* Skip sections that have no loadable contents (.bss, - debugging, etc.) */ - if ((s->flags & SEC_LOAD) == 0) - continue; - - /* Sort the reloc records so we can insert them in the correct - places */ - if (s->reloc_count != 0) - { - if (! do_with_relocs (abfd, s)) - return false; - } - else - { - if (! do_without_relocs (abfd, s)) - return false; - } - } - - return true; -} - - -static boolean -init_for_output (abfd) - bfd *abfd; -{ - asection *s; - for (s = abfd->sections; s != (asection *) NULL; s = s->next) - { - if ((s->flags & SEC_DEBUGGING) != 0) - continue; - if (s->_raw_size != 0) - { - ieee_per_section (s)->data = (bfd_byte *) (bfd_alloc (abfd, s->_raw_size)); - if (!ieee_per_section (s)->data) - return false; - } - } - return true; -} - -/** exec and core file sections */ - -/* set section contents is complicated with IEEE since the format is -* not a byte image, but a record stream. -*/ -boolean -ieee_set_section_contents (abfd, section, location, offset, count) - bfd *abfd; - sec_ptr section; - PTR location; - file_ptr offset; - bfd_size_type count; -{ - if ((section->flags & SEC_DEBUGGING) != 0) - { - if (section->contents == NULL) - { - section->contents = bfd_alloc (abfd, section->_raw_size); - if (section->contents == NULL) - return false; - } - /* bfd_set_section_contents has already checked that everything - is within range. */ - memcpy (section->contents + offset, location, count); - return true; - } - - if (ieee_per_section (section)->data == (bfd_byte *) NULL) - { - if (!init_for_output (abfd)) - return false; - } - memcpy ((PTR) (ieee_per_section (section)->data + offset), - (PTR) location, - (unsigned int) count); - return true; -} - -/* Write the external symbols of a file. IEEE considers two sorts of - external symbols, public, and referenced. It uses to internal - forms to index them as well. When we write them out we turn their - symbol values into indexes from the right base. */ - -static boolean -ieee_write_external_part (abfd) - bfd *abfd; -{ - asymbol **q; - ieee_data_type *ieee = IEEE_DATA (abfd); - - unsigned int reference_index = IEEE_REFERENCE_BASE; - unsigned int public_index = IEEE_PUBLIC_BASE + 2; - file_ptr here = bfd_tell (abfd); - boolean hadone = false; - if (abfd->outsymbols != (asymbol **) NULL) - { - - for (q = abfd->outsymbols; *q != (asymbol *) NULL; q++) - { - asymbol *p = *q; - hadone = true; - if (bfd_is_und_section (p->section)) - { - /* This must be a symbol reference .. */ - if (! ieee_write_byte (abfd, ieee_external_reference_enum) - || ! ieee_write_int (abfd, reference_index) - || ! ieee_write_id (abfd, p->name)) - return false; - p->value = reference_index; - reference_index++; - } - else if (bfd_is_com_section (p->section)) - { - /* This is a weak reference */ - if (! ieee_write_byte (abfd, ieee_external_reference_enum) - || ! ieee_write_int (abfd, reference_index) - || ! ieee_write_id (abfd, p->name) - || ! ieee_write_byte (abfd, - ieee_weak_external_reference_enum) - || ! ieee_write_int (abfd, reference_index) - || ! ieee_write_int (abfd, p->value)) - return false; - p->value = reference_index; - reference_index++; - } - else if (p->flags & BSF_GLOBAL) - { - /* This must be a symbol definition */ - - if (! ieee_write_byte (abfd, ieee_external_symbol_enum) - || ! ieee_write_int (abfd, public_index) - || ! ieee_write_id (abfd, p->name) - || ! ieee_write_2bytes (abfd, ieee_attribute_record_enum) - || ! ieee_write_int (abfd, public_index) - || ! ieee_write_byte (abfd, 15) /* instruction address */ - || ! ieee_write_byte (abfd, 19) /* static symbol */ - || ! ieee_write_byte (abfd, 1)) /* one of them */ - return false; - - /* Write out the value */ - if (! ieee_write_2bytes (abfd, ieee_value_record_enum) - || ! ieee_write_int (abfd, public_index)) - return false; - if (! bfd_is_abs_section (p->section)) - { - if (abfd->flags & EXEC_P) - { - /* If fully linked, then output all symbols - relocated */ - if (! (ieee_write_int - (abfd, - (p->value - + p->section->output_offset - + p->section->output_section->vma)))) - return false; - } - else - { - if (! (ieee_write_expression - (abfd, - p->value + p->section->output_offset, - p->section->output_section->symbol, - false, 0))) - return false; - } - } - else - { - if (! ieee_write_expression (abfd, - p->value, - bfd_abs_section_ptr->symbol, - false, 0)) - return false; - } - p->value = public_index; - public_index++; - } - else - { - /* This can happen - when there are gaps in the symbols read */ - /* from an input ieee file */ - } - } - } - if (hadone) - ieee->w.r.external_part = here; - - return true; -} - - -static CONST unsigned char exten[] = -{ - 0xf0, 0x20, 0x00, - 0xf1, 0xce, 0x20, 0x00, 37, 3, 3, /* Set version 3 rev 3 */ - 0xf1, 0xce, 0x20, 0x00, 39, 2,/* keep symbol in original case */ - 0xf1, 0xce, 0x20, 0x00, 38 /* set object type relocateable to x */ -}; - -static CONST unsigned char envi[] = -{ - 0xf0, 0x21, 0x00, - -/* 0xf1, 0xce, 0x21, 00, 50, 0x82, 0x07, 0xc7, 0x09, 0x11, 0x11, - 0x19, 0x2c, -*/ - 0xf1, 0xce, 0x21, 00, 52, 0x00, /* exec ok */ - - 0xf1, 0xce, 0x21, 0, 53, 0x03,/* host unix */ -/* 0xf1, 0xce, 0x21, 0, 54, 2,1,1 tool & version # */ -}; - -static boolean -ieee_write_me_part (abfd) - bfd *abfd; -{ - ieee_data_type *ieee = IEEE_DATA (abfd); - ieee->w.r.trailer_part = bfd_tell (abfd); - if (abfd->start_address) - { - if (! ieee_write_2bytes (abfd, ieee_value_starting_address_enum) - || ! ieee_write_byte (abfd, ieee_function_either_open_b_enum) - || ! ieee_write_int (abfd, abfd->start_address) - || ! ieee_write_byte (abfd, ieee_function_either_close_b_enum)) - return false; - } - ieee->w.r.me_record = bfd_tell (abfd); - if (! ieee_write_byte (abfd, ieee_module_end_enum)) - return false; - return true; -} - -/* Write out the IEEE processor ID. */ - -static boolean -ieee_write_processor (abfd) - bfd *abfd; -{ - const bfd_arch_info_type *arch; - - arch = bfd_get_arch_info (abfd); - switch (arch->arch) - { - default: - if (! ieee_write_id (abfd, bfd_printable_name (abfd))) - return false; - break; - - case bfd_arch_a29k: - if (! ieee_write_id (abfd, "29000")) - return false; - break; - - case bfd_arch_h8300: - if (! ieee_write_id (abfd, "H8/300")) - return false; - break; - - case bfd_arch_h8500: - if (! ieee_write_id (abfd, "H8/500")) - return false; - break; - - case bfd_arch_i960: - switch (arch->mach) - { - default: - case bfd_mach_i960_core: - case bfd_mach_i960_ka_sa: - if (! ieee_write_id (abfd, "80960KA")) - return false; - break; - - case bfd_mach_i960_kb_sb: - if (! ieee_write_id (abfd, "80960KB")) - return false; - break; - - case bfd_mach_i960_ca: - if (! ieee_write_id (abfd, "80960CA")) - return false; - break; - - case bfd_mach_i960_mc: - case bfd_mach_i960_xa: - if (! ieee_write_id (abfd, "80960MC")) - return false; - break; - } - break; - - case bfd_arch_m68k: - { - char ab[20]; - - sprintf (ab, "%lu", arch->mach); - if (! ieee_write_id (abfd, ab)) - return false; - } - break; - } - - return true; -} - -boolean -ieee_write_object_contents (abfd) - bfd *abfd; -{ - ieee_data_type *ieee = IEEE_DATA (abfd); - unsigned int i; - file_ptr old; - - /* Fast forward over the header area */ - if (bfd_seek (abfd, (file_ptr) 0, SEEK_SET) != 0) - return false; - - if (! ieee_write_byte (abfd, ieee_module_beginning_enum) - || ! ieee_write_processor (abfd) - || ! ieee_write_id (abfd, abfd->filename)) - return false; - - /* Fast forward over the variable bits */ - if (! ieee_write_byte (abfd, ieee_address_descriptor_enum)) - return false; - - /* Bits per MAU */ - if (! ieee_write_byte (abfd, (bfd_byte) (bfd_arch_bits_per_byte (abfd)))) - return false; - /* MAU's per address */ - if (! ieee_write_byte (abfd, - (bfd_byte) (bfd_arch_bits_per_address (abfd) - / bfd_arch_bits_per_byte (abfd)))) - return false; - - old = bfd_tell (abfd); - if (bfd_seek (abfd, (file_ptr) (8 * N_W_VARIABLES), SEEK_CUR) != 0) - return false; - - ieee->w.r.extension_record = bfd_tell (abfd); - if (bfd_write ((char *) exten, 1, sizeof (exten), abfd) != sizeof (exten)) - return false; - if (abfd->flags & EXEC_P) - { - if (! ieee_write_byte (abfd, 0x1)) /* Absolute */ - return false; - } - else - { - if (! ieee_write_byte (abfd, 0x2)) /* Relocateable */ - return false; - } - - ieee->w.r.environmental_record = bfd_tell (abfd); - if (bfd_write ((char *) envi, 1, sizeof (envi), abfd) != sizeof (envi)) - return false; - output_bfd = abfd; - - flush (); - - if (! ieee_write_section_part (abfd)) - return false; - /* First write the symbols. This changes their values into table - indeces so we cant use it after this point. */ - if (! ieee_write_external_part (abfd)) - return false; - - /* ieee_write_byte(abfd, ieee_record_seperator_enum);*/ - - /* ieee_write_byte(abfd, ieee_record_seperator_enum);*/ - - - /* Write any debugs we have been told about. */ - if (! ieee_write_debug_part (abfd)) - return false; - - /* Can only write the data once the symbols have been written, since - the data contains relocation information which points to the - symbols. */ - if (! ieee_write_data_part (abfd)) - return false; - - /* At the end we put the end! */ - if (! ieee_write_me_part (abfd)) - return false; - - /* Generate the header */ - if (bfd_seek (abfd, old, SEEK_SET) != 0) - return false; - - for (i = 0; i < N_W_VARIABLES; i++) - { - if (! ieee_write_2bytes (abfd, ieee_assign_value_to_variable_enum) - || ! ieee_write_byte (abfd, (bfd_byte) i) - || ! ieee_write_int5_out (abfd, ieee->w.offset[i])) - return false; - } - - return true; -} - -/* Native-level interface to symbols. */ - -/* We read the symbols into a buffer, which is discarded when this - function exits. We read the strings into a buffer large enough to - hold them all plus all the cached symbol entries. */ - -asymbol * -ieee_make_empty_symbol (abfd) - bfd *abfd; -{ - ieee_symbol_type *new = - (ieee_symbol_type *) bfd_zmalloc (sizeof (ieee_symbol_type)); - if (!new) - return NULL; - new->symbol.the_bfd = abfd; - return &new->symbol; -} - -static bfd * -ieee_openr_next_archived_file (arch, prev) - bfd *arch; - bfd *prev; -{ - ieee_ar_data_type *ar = IEEE_AR_DATA (arch); - /* take the next one from the arch state, or reset */ - if (prev == (bfd *) NULL) - { - /* Reset the index - the first two entries are bogus*/ - ar->element_index = 2; - } - while (true) - { - ieee_ar_obstack_type *p = ar->elements + ar->element_index; - ar->element_index++; - if (ar->element_index <= ar->element_count) - { - if (p->file_offset != (file_ptr) 0) - { - if (p->abfd == (bfd *) NULL) - { - p->abfd = _bfd_create_empty_archive_element_shell (arch); - p->abfd->origin = p->file_offset; - } - return p->abfd; - } - } - else - { - bfd_set_error (bfd_error_no_more_archived_files); - return (bfd *) NULL; - } - - } -} - -static boolean -ieee_find_nearest_line (abfd, - section, - symbols, - offset, - filename_ptr, - functionname_ptr, - line_ptr) - bfd *abfd; - asection *section; - asymbol **symbols; - bfd_vma offset; - char **filename_ptr; - char **functionname_ptr; - int *line_ptr; -{ - return false; -} - -static int -ieee_generic_stat_arch_elt (abfd, buf) - bfd *abfd; - struct stat *buf; -{ - ieee_ar_data_type *ar = abfd->my_archive->tdata.ieee_ar_data; - if (ar == (ieee_ar_data_type *) NULL) - { - bfd_set_error (bfd_error_invalid_operation); - return -1; - } - else if (ieee_object_p (abfd)) - { - ieee_data_type *ieee = IEEE_DATA (abfd); - - buf->st_size = ieee->w.r.me_record + 1; - buf->st_mode = 0644; - return 0; - } - else - return -1; -} - -static int -ieee_sizeof_headers (abfd, x) - bfd *abfd; - boolean x; -{ - return 0; -} - - -/* The debug info routines are never used. */ -#if 0 - -static void -ieee_bfd_debug_info_start (abfd) - bfd *abfd; -{ - -} - -static void -ieee_bfd_debug_info_end (abfd) - bfd *abfd; -{ - -} - - -/* Add this section to the list of sections we have debug info for, to - be ready to output it at close time - */ -static void -ieee_bfd_debug_info_accumulate (abfd, section) - bfd *abfd; - asection *section; -{ - ieee_data_type *ieee = IEEE_DATA (section->owner); - ieee_data_type *output_ieee = IEEE_DATA (abfd); - /* can only accumulate data from other ieee bfds */ - if (section->owner->xvec != abfd->xvec) - return; - /* Only bother once per bfd */ - if (ieee->done_debug == true) - return; - ieee->done_debug = true; - - /* Don't bother if there is no debug info */ - if (ieee->w.r.debug_information_part == 0) - return; - - - /* Add to chain */ - { - bfd_chain_type *n = (bfd_chain_type *) bfd_alloc (abfd, sizeof (bfd_chain_type)); - if (!n) - abort (); /* FIXME */ - n->this = section->owner; - n->next = (bfd_chain_type *) NULL; - - if (output_ieee->chain_head) - { - output_ieee->chain_head->next = n; - } - else - { - output_ieee->chain_root = n; - - } - output_ieee->chain_head = n; - } -} - -#endif - -#define ieee_close_and_cleanup _bfd_generic_close_and_cleanup -#define ieee_bfd_free_cached_info _bfd_generic_bfd_free_cached_info - -#define ieee_slurp_armap bfd_true -#define ieee_slurp_extended_name_table bfd_true -#define ieee_construct_extended_name_table \ - ((boolean (*) PARAMS ((bfd *, char **, bfd_size_type *, const char **))) \ - bfd_true) -#define ieee_truncate_arname bfd_dont_truncate_arname -#define ieee_write_armap \ - ((boolean (*) \ - PARAMS ((bfd *, unsigned int, struct orl *, unsigned int, int))) \ - bfd_true) -#define ieee_read_ar_hdr bfd_nullvoidptr -#define ieee_update_armap_timestamp bfd_true -#define ieee_get_elt_at_index _bfd_generic_get_elt_at_index - -#define ieee_bfd_is_local_label bfd_generic_is_local_label -#define ieee_get_lineno _bfd_nosymbols_get_lineno -#define ieee_bfd_make_debug_symbol _bfd_nosymbols_bfd_make_debug_symbol -#define ieee_read_minisymbols _bfd_generic_read_minisymbols -#define ieee_minisymbol_to_symbol _bfd_generic_minisymbol_to_symbol - -#define ieee_bfd_reloc_type_lookup _bfd_norelocs_bfd_reloc_type_lookup - -#define ieee_set_arch_mach _bfd_generic_set_arch_mach - -#define ieee_get_section_contents_in_window \ - _bfd_generic_get_section_contents_in_window -#define ieee_bfd_get_relocated_section_contents \ - bfd_generic_get_relocated_section_contents -#define ieee_bfd_relax_section bfd_generic_relax_section -#define ieee_bfd_link_hash_table_create _bfd_generic_link_hash_table_create -#define ieee_bfd_link_add_symbols _bfd_generic_link_add_symbols -#define ieee_bfd_final_link _bfd_generic_final_link -#define ieee_bfd_link_split_section _bfd_generic_link_split_section - -/*SUPPRESS 460 */ -const bfd_target ieee_vec = -{ - "ieee", /* name */ - bfd_target_ieee_flavour, - BFD_ENDIAN_UNKNOWN, /* target byte order */ - BFD_ENDIAN_UNKNOWN, /* target headers byte order */ - (HAS_RELOC | EXEC_P | /* object flags */ - HAS_LINENO | HAS_DEBUG | - HAS_SYMS | HAS_LOCALS | WP_TEXT | D_PAGED), - (SEC_CODE | SEC_DATA | SEC_ROM | SEC_HAS_CONTENTS - | SEC_ALLOC | SEC_LOAD | SEC_RELOC), /* section flags */ - 0, /* leading underscore */ - ' ', /* ar_pad_char */ - 16, /* ar_max_namelen */ - bfd_getb64, bfd_getb_signed_64, bfd_putb64, - bfd_getb32, bfd_getb_signed_32, bfd_putb32, - bfd_getb16, bfd_getb_signed_16, bfd_putb16, /* data */ - bfd_getb64, bfd_getb_signed_64, bfd_putb64, - bfd_getb32, bfd_getb_signed_32, bfd_putb32, - bfd_getb16, bfd_getb_signed_16, bfd_putb16, /* hdrs */ - - {_bfd_dummy_target, - ieee_object_p, /* bfd_check_format */ - ieee_archive_p, - _bfd_dummy_target, - }, - { - bfd_false, - ieee_mkobject, - _bfd_generic_mkarchive, - bfd_false - }, - { - bfd_false, - ieee_write_object_contents, - _bfd_write_archive_contents, - bfd_false, - }, - - BFD_JUMP_TABLE_GENERIC (ieee), - BFD_JUMP_TABLE_COPY (_bfd_generic), - BFD_JUMP_TABLE_CORE (_bfd_nocore), - BFD_JUMP_TABLE_ARCHIVE (ieee), - BFD_JUMP_TABLE_SYMBOLS (ieee), - BFD_JUMP_TABLE_RELOCS (ieee), - BFD_JUMP_TABLE_WRITE (ieee), - BFD_JUMP_TABLE_LINK (ieee), - BFD_JUMP_TABLE_DYNAMIC (_bfd_nodynamic), - - (PTR) 0 -}; diff --git a/contrib/gdb/bfd/ihex.c b/contrib/gdb/bfd/ihex.c deleted file mode 100644 index 80140da5976bf..0000000000000 --- a/contrib/gdb/bfd/ihex.c +++ /dev/null @@ -1,1005 +0,0 @@ -/* BFD back-end for Intel Hex objects. - Copyright 1995 Free Software Foundation, Inc. - Written by Ian Lance Taylor of Cygnus Support <ian@cygnus.com>. - -This file is part of BFD, the Binary File Descriptor library. - -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 2 of the License, 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ - -/* This is what Intel Hex files look like: - -1. INTEL FORMATS - -A. Intel 1 - - 16-bit address-field format, for files 64k bytes in length or less. - - DATA RECORD - Byte 1 Header = colon(:) - 2..3 The number of data bytes in hex notation - 4..5 High byte of the record load address - 6..7 Low byte of the record load address - 8..9 Record type, must be "00" - 10..x Data bytes in hex notation: - x = (number of bytes - 1) * 2 + 11 - x+1..x+2 Checksum in hex notation - x+3..x+4 Carriage return, line feed - - END RECORD - Byte 1 Header = colon (:) - 2..3 The byte count, must be "00" - 4..7 Transfer-address (usually "0000") - the jump-to address, execution start address - 8..9 Record type, must be "01" - 10..11 Checksum, in hex notation - 12..13 Carriage return, line feed - -B. INTEL 2 - - MCS-86 format, using a 20-bit address for files larger than 64K bytes. - - DATA RECORD - Byte 1 Header = colon (:) - 2..3 The byte count of this record, hex notation - 4..5 High byte of the record load address - 6..7 Low byte of the record load address - 8..9 Record type, must be "00" - 10..x The data bytes in hex notation: - x = (number of data bytes - 1) * 2 + 11 - x+1..x+2 Checksum in hex notation - x+3..x+4 Carriage return, line feed - - EXTENDED ADDRESS RECORD - Byte 1 Header = colon(:) - 2..3 The byte count, must be "02" - 4..7 Load address, must be "0000" - 8..9 Record type, must be "02" - 10..11 High byte of the offset address - 12..13 Low byte of the offset address - 14..15 Checksum in hex notation - 16..17 Carriage return, line feed - - The checksums are the two's complement of the 8-bit sum - without carry of the byte count, offset address, and the - record type. - - START ADDRESS RECORD - Byte 1 Header = colon (:) - 2..3 The byte count, must be "04" - 4..7 Load address, must be "0000" - 8..9 Record type, must be "03" - 10..13 8086 CS value - 14..17 8086 IP value - 18..19 Checksum in hex notation - 20..21 Carriage return, line feed - -Another document reports these additional types: - - EXTENDED LINEAR ADDRESS RECORD - Byte 1 Header = colon (:) - 2..3 The byte count, must be "02" - 4..7 Load address, must be "0000" - 8..9 Record type, must be "04" - 10..13 Upper 16 bits of address of subsequent records - 14..15 Checksum in hex notation - 16..17 Carriage return, line feed - - START LINEAR ADDRESS RECORD - Byte 1 Header = colon (:) - 2..3 The byte count, must be "02" - 4..7 Load address, must be "0000" - 8..9 Record type, must be "05" - 10..13 Upper 16 bits of start address - 14..15 Checksum in hex notation - 16..17 Carriage return, line feed -*/ - -#include "bfd.h" -#include "sysdep.h" -#include "libbfd.h" -#include "libiberty.h" - -#include <ctype.h> - -static void ihex_init PARAMS ((void)); -static boolean ihex_mkobject PARAMS ((bfd *)); -static INLINE int ihex_get_byte PARAMS ((bfd *, boolean *)); -static void ihex_bad_byte PARAMS ((bfd *, unsigned int, int, boolean)); -static boolean ihex_scan PARAMS ((bfd *)); -static const bfd_target *ihex_object_p PARAMS ((bfd *)); -static boolean ihex_read_section PARAMS ((bfd *, asection *, bfd_byte *)); -static boolean ihex_get_section_contents - PARAMS ((bfd *, asection *, PTR, file_ptr, bfd_size_type)); -static boolean ihex_set_section_contents - PARAMS ((bfd *, asection *, PTR, file_ptr, bfd_size_type)); -static boolean ihex_write_record - PARAMS ((bfd *, bfd_size_type, bfd_vma, unsigned int, bfd_byte *)); -static boolean ihex_write_object_contents PARAMS ((bfd *)); -static asymbol *ihex_make_empty_symbol PARAMS ((bfd *)); -static boolean ihex_set_arch_mach - PARAMS ((bfd *, enum bfd_architecture, unsigned long)); - -/* The number of bytes we put on one line during output. */ - -#define CHUNK (21) - -/* Macros for converting between hex and binary. */ - -#define NIBBLE(x) (hex_value (x)) -#define HEX2(buffer) ((NIBBLE ((buffer)[0]) << 4) + NIBBLE ((buffer)[1])) -#define HEX4(buffer) ((HEX2 (buffer) << 8) + HEX2 ((buffer) + 2)) -#define ISHEX(x) (hex_p (x)) - -/* When we write out an ihex value, the values can not be output as - they are seen. Instead, we hold them in memory in this structure. */ - -struct ihex_data_list -{ - struct ihex_data_list *next; - bfd_byte *data; - bfd_vma where; - bfd_size_type size; -}; - -/* The ihex tdata information. */ - -struct ihex_data_struct -{ - struct ihex_data_list *head; - struct ihex_data_list *tail; -}; - -/* Initialize by filling in the hex conversion array. */ - -static void -ihex_init () -{ - static boolean inited; - - if (! inited) - { - inited = true; - hex_init (); - } -} - -/* Create an ihex object. */ - -static boolean -ihex_mkobject (abfd) - bfd *abfd; -{ - if (abfd->tdata.ihex_data == NULL) - { - struct ihex_data_struct *tdata; - - tdata = ((struct ihex_data_struct *) - bfd_alloc (abfd, sizeof (struct ihex_data_struct))); - if (tdata == NULL) - return false; - abfd->tdata.ihex_data = tdata; - tdata->head = NULL; - tdata->tail = NULL; - } - - return true; -} - -/* Read a byte from a BFD. Set *ERRORPTR if an error occurred. - Return EOF on error or end of file. */ - -static INLINE int -ihex_get_byte (abfd, errorptr) - bfd *abfd; - boolean *errorptr; -{ - bfd_byte c; - - if (bfd_read (&c, 1, 1, abfd) != 1) - { - if (bfd_get_error () != bfd_error_file_truncated) - *errorptr = true; - return EOF; - } - - return (int) (c & 0xff); -} - -/* Report a problem in an Intel Hex file. */ - -static void -ihex_bad_byte (abfd, lineno, c, error) - bfd *abfd; - unsigned int lineno; - int c; - boolean error; -{ - if (c == EOF) - { - if (! error) - bfd_set_error (bfd_error_file_truncated); - } - else - { - char buf[10]; - - if (! isprint (c)) - sprintf (buf, "\\%03o", (unsigned int) c); - else - { - buf[0] = c; - buf[1] = '\0'; - } - (*_bfd_error_handler) - ("%s:%d: unexpected character `%s' in Intel Hex file\n", - bfd_get_filename (abfd), lineno, buf); - bfd_set_error (bfd_error_bad_value); - } -} - -/* Read an Intel hex file and turn it into sections. We create a new - section for each contiguous set of bytes. */ - -static boolean -ihex_scan (abfd) - bfd *abfd; -{ - bfd_vma segbase; - bfd_vma extbase; - asection *sec; - int lineno; - boolean error; - bfd_byte *buf; - size_t bufsize; - int c; - - if (bfd_seek (abfd, (file_ptr) 0, SEEK_SET) != 0) - goto error_return; - - abfd->start_address = 0; - - extbase = 0; - segbase = 0; - sec = NULL; - lineno = 1; - error = false; - buf = NULL; - bufsize = 0; - while ((c = ihex_get_byte (abfd, &error)) != EOF) - { - if (c == '\r') - continue; - else if (c == '\n') - { - ++lineno; - continue; - } - else if (c != ':') - { - ihex_bad_byte (abfd, lineno, c, error); - goto error_return; - } - else - { - file_ptr pos; - char hdr[8]; - unsigned int i; - unsigned int len; - bfd_vma addr; - unsigned int type; - unsigned int chars; - unsigned int chksum; - - /* This is a data record. */ - - pos = bfd_tell (abfd) - 1; - - /* Read the header bytes. */ - - if (bfd_read (hdr, 1, 8, abfd) != 8) - goto error_return; - - for (i = 0; i < 8; i++) - { - if (! ISHEX (hdr[i])) - { - ihex_bad_byte (abfd, lineno, hdr[i], error); - goto error_return; - } - } - - len = HEX2 (hdr); - addr = HEX4 (hdr + 2); - type = HEX2 (hdr + 6); - - /* Read the data bytes. */ - - chars = len * 2 + 2; - if (chars >= bufsize) - { - buf = (bfd_byte *) bfd_realloc (buf, chars); - if (buf == NULL) - goto error_return; - bufsize = chars; - } - - if (bfd_read (buf, 1, chars, abfd) != chars) - goto error_return; - - for (i = 0; i < chars; i++) - { - if (! ISHEX (buf[i])) - { - ihex_bad_byte (abfd, lineno, hdr[i], error); - goto error_return; - } - } - - /* Check the checksum. */ - chksum = len + addr + (addr >> 8) + type; - for (i = 0; i < len; i++) - chksum += HEX2 (buf + 2 * i); - if (((- chksum) & 0xff) != (unsigned int) HEX2 (buf + 2 * i)) - { - (*_bfd_error_handler) - ("%s:%d: bad checksum in Intel Hex file (expected %u, found %u)", - bfd_get_filename (abfd), lineno, - (- chksum) & 0xff, (unsigned int) HEX2 (buf + 2 * i)); - bfd_set_error (bfd_error_bad_value); - goto error_return; - } - - switch (type) - { - case 0: - /* This is a data record. */ - if (sec != NULL - && sec->vma + sec->_raw_size == extbase + segbase + addr) - { - /* This data goes at the end of the section we are - currently building. */ - sec->_raw_size += len; - } - else if (len > 0) - { - char secbuf[20]; - char *secname; - - sprintf (secbuf, ".sec%d", bfd_count_sections (abfd) + 1); - secname = (char *) bfd_alloc (abfd, strlen (secbuf) + 1); - if (secname == NULL) - goto error_return; - strcpy (secname, secbuf); - sec = bfd_make_section (abfd, secname); - if (sec == NULL) - goto error_return; - sec->flags = SEC_HAS_CONTENTS | SEC_LOAD | SEC_ALLOC; - sec->vma = extbase + segbase + addr; - sec->lma = extbase + segbase + addr; - sec->_raw_size = len; - sec->filepos = pos; - } - break; - - case 1: - /* An end record. */ - if (abfd->start_address == 0) - abfd->start_address = addr; - if (buf != NULL) - free (buf); - return true; - - case 2: - /* An extended address record. */ - if (len != 2) - { - (*_bfd_error_handler) - ("%s:%d: bad extended address record length in Intel Hex file", - bfd_get_filename (abfd), lineno); - bfd_set_error (bfd_error_bad_value); - goto error_return; - } - - segbase = HEX4 (buf) << 4; - - sec = NULL; - - break; - - case 3: - /* An extended start address record. */ - if (len != 4) - { - (*_bfd_error_handler) - ("%s:%d: bad extended start address length in Intel Hex file", - bfd_get_filename (abfd), lineno); - bfd_set_error (bfd_error_bad_value); - goto error_return; - } - - abfd->start_address += (HEX4 (buf) << 4) + HEX4 (buf + 4); - - sec = NULL; - - break; - - case 4: - /* An extended linear address record. */ - if (len != 2) - { - (*_bfd_error_handler) - ("%s:%d: bad extended linear address record length in Intel Hex file", - bfd_get_filename (abfd), lineno); - bfd_set_error (bfd_error_bad_value); - goto error_return; - } - - segbase = HEX4 (buf) << 16; - - sec = NULL; - - break; - - case 5: - /* An extended linear start address record. */ - if (len != 2) - { - (*_bfd_error_handler) - ("%s:%d: bad extended linear start address length in Intel Hex file", - bfd_get_filename (abfd), lineno); - bfd_set_error (bfd_error_bad_value); - goto error_return; - } - - abfd->start_address += HEX4 (buf) << 16; - - sec = NULL; - - break; - - default: - (*_bfd_error_handler) - ("%s:%d: unrecognized ihex type %u in Intel Hex file\n", - bfd_get_filename (abfd), lineno, type); - bfd_set_error (bfd_error_bad_value); - goto error_return; - } - } - } - - if (error) - goto error_return; - - if (buf != NULL) - free (buf); - - return true; - - error_return: - if (buf != NULL) - free (buf); - return false; -} - -/* Try to recognize an Intel Hex file. */ - -static const bfd_target * -ihex_object_p (abfd) - bfd *abfd; -{ - bfd_byte b[9]; - unsigned int i; - unsigned int type; - - ihex_init (); - - if (bfd_seek (abfd, (file_ptr) 0, SEEK_SET) != 0) - return NULL; - if (bfd_read (b, 1, 9, abfd) != 9) - { - if (bfd_get_error () == bfd_error_file_truncated) - bfd_set_error (bfd_error_wrong_format); - return NULL; - } - - if (b[0] != ':') - { - bfd_set_error (bfd_error_wrong_format); - return NULL; - } - - for (i = 1; i < 9; i++) - { - if (! ISHEX (b[i])) - { - bfd_set_error (bfd_error_wrong_format); - return NULL; - } - } - - type = HEX2 (b + 7); - if (type > 5) - { - bfd_set_error (bfd_error_wrong_format); - return NULL; - } - - /* OK, it looks like it really is an Intel Hex file. */ - - if (! ihex_mkobject (abfd) - || ! ihex_scan (abfd)) - return NULL; - - return abfd->xvec; -} - -/* Read the contents of a section in an Intel Hex file. */ - -static boolean -ihex_read_section (abfd, section, contents) - bfd *abfd; - asection *section; - bfd_byte *contents; -{ - int c; - bfd_byte *p; - bfd_byte *buf; - size_t bufsize; - boolean error; - - if (bfd_seek (abfd, section->filepos, SEEK_SET) != 0) - goto error_return; - - p = contents; - buf = NULL; - bufsize = 0; - error = false; - while ((c = ihex_get_byte (abfd, &error)) != EOF) - { - char hdr[8]; - unsigned int len; - bfd_vma addr; - unsigned int type; - unsigned int i; - - if (c == '\r' || c == '\n') - continue; - - /* This is called after ihex_scan has succeeded, so we ought to - know the exact format. */ - BFD_ASSERT (c == ':'); - - if (bfd_read (hdr, 1, 8, abfd) != 8) - goto error_return; - - len = HEX2 (hdr); - addr = HEX4 (hdr + 2); - type = HEX2 (hdr + 6); - - /* We should only see type 0 records here. */ - if (type != 0) - { - (*_bfd_error_handler) - ("%s: internal error in ihex_read_section", - bfd_get_filename (abfd)); - bfd_set_error (bfd_error_bad_value); - goto error_return; - } - - if (len * 2 > bufsize) - { - buf = (bfd_byte *) bfd_realloc (buf, len * 2); - if (buf == NULL) - goto error_return; - bufsize = len * 2; - } - - if (bfd_read (buf, 1, len * 2, abfd) != len * 2) - goto error_return; - - for (i = 0; i < len; i++) - *p++ = HEX2 (buf + 2 * i); - if ((bfd_size_type) (p - contents) >= section->_raw_size) - { - /* We've read everything in the section. */ - if (buf != NULL) - free (buf); - return true; - } - - /* Skip the checksum. */ - if (bfd_read (buf, 1, 2, abfd) != 2) - goto error_return; - } - - if ((bfd_size_type) (p - contents) < section->_raw_size) - { - (*_bfd_error_handler) - ("%s: bad section length in ihex_read_section", - bfd_get_filename (abfd)); - bfd_set_error (bfd_error_bad_value); - goto error_return; - } - - if (buf != NULL) - free (buf); - - return true; - - error_return: - if (buf != NULL) - free (buf); - return false; -} - -/* Get the contents of a section in an Intel Hex file. */ - -static boolean -ihex_get_section_contents (abfd, section, location, offset, count) - bfd *abfd; - asection *section; - PTR location; - file_ptr offset; - bfd_size_type count; -{ - if (section->used_by_bfd == NULL) - { - section->used_by_bfd = bfd_alloc (abfd, section->_raw_size); - if (section->used_by_bfd == NULL) - return false; - if (! ihex_read_section (abfd, section, section->used_by_bfd)) - return false; - } - - memcpy (location, (bfd_byte *) section->used_by_bfd + offset, - (size_t) count); - - return true; -} - -/* Set the contents of a section in an Intel Hex file. */ - -static boolean -ihex_set_section_contents (abfd, section, location, offset, count) - bfd *abfd; - asection *section; - PTR location; - file_ptr offset; - bfd_size_type count; -{ - struct ihex_data_list *n; - bfd_byte *data; - struct ihex_data_struct *tdata; - - if (count == 0 - || (section->flags & SEC_ALLOC) == 0 - || (section->flags & SEC_LOAD) == 0) - return true; - - n = ((struct ihex_data_list *) - bfd_alloc (abfd, sizeof (struct ihex_data_list))); - if (n == NULL) - return false; - - data = (bfd_byte *) bfd_alloc (abfd, count); - if (data == NULL) - return false; - memcpy (data, location, (size_t) count); - - n->data = data; - n->where = section->lma + offset; - n->size = count; - - /* Sort the records by address. Optimize for the common case of - adding a record to the end of the list. */ - tdata = abfd->tdata.ihex_data; - if (tdata->tail != NULL - && n->where >= tdata->tail->where) - { - tdata->tail->next = n; - n->next = NULL; - tdata->tail = n; - } - else - { - register struct ihex_data_list **pp; - - for (pp = &tdata->head; - *pp != NULL && (*pp)->where < n->where; - pp = &(*pp)->next) - ; - n->next = *pp; - *pp = n; - if (n->next == NULL) - tdata->tail = n; - } - - return true; -} - -/* Write a record out to an Intel Hex file. */ - -static boolean -ihex_write_record (abfd, count, addr, type, data) - bfd *abfd; - bfd_size_type count; - bfd_vma addr; - unsigned int type; - bfd_byte *data; -{ - static const char digs[] = "0123456789ABCDEF"; - char buf[9 + CHUNK * 2 + 4]; - char *p; - unsigned int chksum; - unsigned int i; - -#define TOHEX(buf, v) \ - ((buf)[0] = digs[((v) >> 4) & 0xf], (buf)[1] = digs[(v) & 0xf]) - - buf[0] = ':'; - TOHEX (buf + 1, count); - TOHEX (buf + 3, (addr >> 8) & 0xff); - TOHEX (buf + 5, addr & 0xff); - TOHEX (buf + 7, type); - - chksum = count + addr + (addr >> 8) + type; - - for (i = 0, p = buf + 9; i < count; i++, p += 2, data++) - { - TOHEX (p, *data); - chksum += *data; - } - - TOHEX (p, (- chksum) & 0xff); - p[2] = '\r'; - p[3] = '\n'; - - if (bfd_write (buf, 1, 9 + count * 2 + 4, abfd) != 9 + count * 2 + 4) - return false; - - return true; -} - -/* Write out an Intel Hex file. */ - -static boolean -ihex_write_object_contents (abfd) - bfd *abfd; -{ - bfd_vma extbase; - bfd_vma segbase; - struct ihex_data_list *l; - - extbase = 0; - segbase = 0; - for (l = abfd->tdata.ihex_data->head; l != NULL; l = l->next) - { - bfd_vma where; - bfd_byte *p; - bfd_size_type count; - - where = l->where; - p = l->data; - count = l->size; - while (count > 0) - { - bfd_size_type now; - - now = count; - if (now > CHUNK) - now = CHUNK; - - if (where > extbase + segbase + 0xffff) - { - bfd_byte addr[2]; - - /* We need a new base address. */ - if (where <= 0xfffff) - { - segbase = where & 0xf0000; - addr[0] = (segbase >> 12) & 0xff; - addr[1] = (segbase >> 4) & 0xff; - if (! ihex_write_record (abfd, 2, 0, 2, addr)) - return false; - } - else - { - extbase = where & 0xffff0000; - if (where > extbase + 0xffff) - { - char buf[20]; - - sprintf_vma (buf, where); - (*_bfd_error_handler) - ("%s: address 0x%s out of range for Intex Hex file", - bfd_get_filename (abfd), buf); - bfd_set_error (bfd_error_bad_value); - return false; - } - addr[0] = (extbase >> 24) & 0xff; - addr[1] = (extbase >> 16) & 0xff; - if (! ihex_write_record (abfd, 2, 0, 4, addr)) - return false; - } - } - - if (! ihex_write_record (abfd, now, where - (extbase + segbase), - 0, p)) - return false; - - where += now; - p += now; - count -= now; - } - } - - if (abfd->start_address != 0) - { - bfd_vma start; - bfd_byte startbuf[4]; - - start = abfd->start_address; - - if (start > 0xfffff) - { - startbuf[0] = (start >> 24) & 0xff; - startbuf[1] = (start >> 16) & 0xff; - if (! ihex_write_record (abfd, 2, 0, 5, startbuf)) - return false; - start &= 0xffff; - } - - startbuf[0] = ((start & 0xf0000) >> 12) & 0xff; - startbuf[1] = 0; - startbuf[2] = (start >> 8) & 0xff; - startbuf[3] = start & 0xff; - if (! ihex_write_record (abfd, 4, 0, 3, startbuf)) - return false; - } - - if (! ihex_write_record (abfd, 0, 0, 1, NULL)) - return false; - - return true; -} - -/* Make an empty symbol. This is required only because - bfd_make_section_anyway wants to create a symbol for the section. */ - -static asymbol * -ihex_make_empty_symbol (abfd) - bfd *abfd; -{ - asymbol *new; - - new = (asymbol *) bfd_zalloc (abfd, sizeof (asymbol)); - if (new != NULL) - new->the_bfd = abfd; - return new; -} - -/* Set the architecture for the output file. The architecture is - irrelevant, so we ignore errors about unknown architectures. */ - -static boolean -ihex_set_arch_mach (abfd, arch, mach) - bfd *abfd; - enum bfd_architecture arch; - unsigned long mach; -{ - if (! bfd_default_set_arch_mach (abfd, arch, mach)) - { - if (arch != bfd_arch_unknown) - return false; - } - return true; -} - -/* Get the size of the headers, for the linker. */ - -/*ARGSUSED*/ -static int -ihex_sizeof_headers (abfd, exec) - bfd *abfd; - boolean exec; -{ - return 0; -} - -/* Some random definitions for the target vector. */ - -#define ihex_close_and_cleanup _bfd_generic_close_and_cleanup -#define ihex_bfd_free_cached_info _bfd_generic_bfd_free_cached_info -#define ihex_new_section_hook _bfd_generic_new_section_hook -#define ihex_get_section_contents_in_window \ - _bfd_generic_get_section_contents_in_window - -#define ihex_get_symtab_upper_bound bfd_0l -#define ihex_get_symtab \ - ((long (*) PARAMS ((bfd *, asymbol **))) bfd_0l) -#define ihex_print_symbol _bfd_nosymbols_print_symbol -#define ihex_get_symbol_info _bfd_nosymbols_get_symbol_info -#define ihex_bfd_is_local_label _bfd_nosymbols_bfd_is_local_label -#define ihex_get_lineno _bfd_nosymbols_get_lineno -#define ihex_find_nearest_line _bfd_nosymbols_find_nearest_line -#define ihex_bfd_make_debug_symbol _bfd_nosymbols_bfd_make_debug_symbol -#define ihex_read_minisymbols _bfd_nosymbols_read_minisymbols -#define ihex_minisymbol_to_symbol _bfd_nosymbols_minisymbol_to_symbol - -#define ihex_get_reloc_upper_bound \ - ((long (*) PARAMS ((bfd *, asection *))) bfd_0l) -#define ihex_canonicalize_reloc \ - ((long (*) PARAMS ((bfd *, asection *, arelent **, asymbol **))) bfd_0l) -#define ihex_bfd_reloc_type_lookup _bfd_norelocs_bfd_reloc_type_lookup - -#define ihex_bfd_get_relocated_section_contents \ - bfd_generic_get_relocated_section_contents -#define ihex_bfd_relax_section bfd_generic_relax_section -#define ihex_bfd_link_hash_table_create _bfd_generic_link_hash_table_create -#define ihex_bfd_link_add_symbols _bfd_generic_link_add_symbols -#define ihex_bfd_final_link _bfd_generic_final_link -#define ihex_bfd_link_split_section _bfd_generic_link_split_section - -/* The Intel Hex target vector. */ - -const bfd_target ihex_vec = -{ - "ihex", /* name */ - bfd_target_ihex_flavour, - BFD_ENDIAN_UNKNOWN, /* target byte order */ - BFD_ENDIAN_UNKNOWN, /* target headers byte order */ - 0, /* object flags */ - (SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD), /* section flags */ - 0, /* leading underscore */ - ' ', /* ar_pad_char */ - 16, /* ar_max_namelen */ - bfd_getb64, bfd_getb_signed_64, bfd_putb64, - bfd_getb32, bfd_getb_signed_32, bfd_putb32, - bfd_getb16, bfd_getb_signed_16, bfd_putb16, /* data */ - bfd_getb64, bfd_getb_signed_64, bfd_putb64, - bfd_getb32, bfd_getb_signed_32, bfd_putb32, - bfd_getb16, bfd_getb_signed_16, bfd_putb16, /* hdrs */ - - { - _bfd_dummy_target, - ihex_object_p, /* bfd_check_format */ - _bfd_dummy_target, - _bfd_dummy_target, - }, - { - bfd_false, - ihex_mkobject, - _bfd_generic_mkarchive, - bfd_false, - }, - { /* bfd_write_contents */ - bfd_false, - ihex_write_object_contents, - _bfd_write_archive_contents, - bfd_false, - }, - - BFD_JUMP_TABLE_GENERIC (ihex), - BFD_JUMP_TABLE_COPY (_bfd_generic), - BFD_JUMP_TABLE_CORE (_bfd_nocore), - BFD_JUMP_TABLE_ARCHIVE (_bfd_noarchive), - BFD_JUMP_TABLE_SYMBOLS (ihex), - BFD_JUMP_TABLE_RELOCS (ihex), - BFD_JUMP_TABLE_WRITE (ihex), - BFD_JUMP_TABLE_LINK (ihex), - BFD_JUMP_TABLE_DYNAMIC (_bfd_nodynamic), - - (PTR) 0 -}; diff --git a/contrib/gdb/bfd/init.c b/contrib/gdb/bfd/init.c deleted file mode 100644 index 1fa1d505bee68..0000000000000 --- a/contrib/gdb/bfd/init.c +++ /dev/null @@ -1,50 +0,0 @@ -/* bfd initialization stuff - Copyright (C) 1990, 91, 92, 93, 94, 1995 Free Software Foundation, Inc. - Written by Steve Chamberlain of Cygnus Support. - -This file is part of BFD, the Binary File Descriptor library. - -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 2 of the License, 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ - -#include "bfd.h" -#include "sysdep.h" -#include "libbfd.h" - -/* -SECTION - Initialization - - These are the functions that handle initializing a BFD. -*/ - -/* -FUNCTION - bfd_init - -SYNOPSIS - void bfd_init(void); - -DESCRIPTION - This routine must be called before any other BFD function to - initialize magical internal data structures. -*/ - -/* Actually, there is currently nothing for this function to do. - However, someday it may be needed, so keep it around. */ - -void -bfd_init () -{ -} diff --git a/contrib/gdb/bfd/irix-core.c b/contrib/gdb/bfd/irix-core.c deleted file mode 100644 index 3fd39772ce842..0000000000000 --- a/contrib/gdb/bfd/irix-core.c +++ /dev/null @@ -1,263 +0,0 @@ -/* BFD back-end for Irix core files. - Copyright 1993, 1994 Free Software Foundation, Inc. - Written by Stu Grossman, Cygnus Support. - Converted to back-end form by Ian Lance Taylor, Cygnus Support - -This file is part of BFD, the Binary File Descriptor library. - -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 2 of the License, 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ - -/* This file can only be compiled on systems which use Irix style core - files (namely, Irix 4 and Irix 5, so far). */ - -#include "bfd.h" -#include "sysdep.h" -#include "libbfd.h" - -#ifdef IRIX_CORE - -#include <core.out.h> - -struct sgi_core_struct -{ - int sig; - char cmd[CORE_NAMESIZE]; -}; - -#define core_hdr(bfd) ((bfd)->tdata.sgi_core_data) -#define core_signal(bfd) (core_hdr(bfd)->sig) -#define core_command(bfd) (core_hdr(bfd)->cmd) - -static asection * -make_bfd_asection (abfd, name, flags, _raw_size, vma, filepos) - bfd *abfd; - CONST char *name; - flagword flags; - bfd_size_type _raw_size; - bfd_vma vma; - file_ptr filepos; -{ - asection *asect; - - asect = bfd_make_section_anyway (abfd, name); - if (!asect) - return NULL; - - asect->flags = flags; - asect->_raw_size = _raw_size; - asect->vma = vma; - asect->filepos = filepos; - asect->alignment_power = 4; - - return asect; -} - -static const bfd_target * -irix_core_core_file_p (abfd) - bfd *abfd; -{ - int val; - int i; - char *secname; - struct coreout coreout; - struct idesc *idg, *idf, *ids; - - val = bfd_read ((PTR)&coreout, 1, sizeof coreout, abfd); - if (val != sizeof coreout) - { - if (bfd_get_error () != bfd_error_system_call) - bfd_set_error (bfd_error_wrong_format); - return 0; - } - - if (coreout.c_magic != CORE_MAGIC - || coreout.c_version != CORE_VERSION1) - return 0; - - core_hdr (abfd) = (struct sgi_core_struct *) bfd_zalloc (abfd, sizeof (struct sgi_core_struct)); - if (!core_hdr (abfd)) - return NULL; - - strncpy (core_command (abfd), coreout.c_name, CORE_NAMESIZE); - core_signal (abfd) = coreout.c_sigcause; - - if (bfd_seek (abfd, coreout.c_vmapoffset, SEEK_SET) != 0) - return NULL; - - for (i = 0; i < coreout.c_nvmap; i++) - { - struct vmap vmap; - - val = bfd_read ((PTR)&vmap, 1, sizeof vmap, abfd); - if (val != sizeof vmap) - break; - - switch (vmap.v_type) - { - case VDATA: - secname = ".data"; - break; - case VSTACK: - secname = ".stack"; - break; -#ifdef VMAPFILE - case VMAPFILE: - secname = ".mapfile"; - break; -#endif - default: - continue; - } - - /* A file offset of zero means that the section is not contained - in the corefile. */ - if (vmap.v_offset == 0) - continue; - - if (!make_bfd_asection (abfd, secname, - SEC_ALLOC+SEC_LOAD+SEC_HAS_CONTENTS, - vmap.v_len, - vmap.v_vaddr, - vmap.v_offset, - 2)) - return NULL; - } - - /* Make sure that the regs are contiguous within the core file. */ - - idg = &coreout.c_idesc[I_GPREGS]; - idf = &coreout.c_idesc[I_FPREGS]; - ids = &coreout.c_idesc[I_SPECREGS]; - - if (idg->i_offset + idg->i_len != idf->i_offset - || idf->i_offset + idf->i_len != ids->i_offset) - return 0; /* Can't deal with non-contig regs */ - - if (bfd_seek (abfd, idg->i_offset, SEEK_SET) != 0) - return NULL; - - make_bfd_asection (abfd, ".reg", - SEC_HAS_CONTENTS, - idg->i_len + idf->i_len + ids->i_len, - 0, - idg->i_offset); - - /* OK, we believe you. You're a core file (sure, sure). */ - - return abfd->xvec; -} - -static char * -irix_core_core_file_failing_command (abfd) - bfd *abfd; -{ - return core_command (abfd); -} - -static int -irix_core_core_file_failing_signal (abfd) - bfd *abfd; -{ - return core_signal (abfd); -} - -static boolean -irix_core_core_file_matches_executable_p (core_bfd, exec_bfd) - bfd *core_bfd, *exec_bfd; -{ - return true; /* XXX - FIXME */ -} - -static asymbol * -irix_core_make_empty_symbol (abfd) - bfd *abfd; -{ - asymbol *new = (asymbol *) bfd_zalloc (abfd, sizeof (asymbol)); - if (new) - new->the_bfd = abfd; - return new; -} - -#define irix_core_get_symtab_upper_bound _bfd_nosymbols_get_symtab_upper_bound -#define irix_core_get_symtab _bfd_nosymbols_get_symtab -#define irix_core_print_symbol _bfd_nosymbols_print_symbol -#define irix_core_get_symbol_info _bfd_nosymbols_get_symbol_info -#define irix_core_bfd_is_local_label _bfd_nosymbols_bfd_is_local_label -#define irix_core_get_lineno _bfd_nosymbols_get_lineno -#define irix_core_find_nearest_line _bfd_nosymbols_find_nearest_line -#define irix_core_bfd_make_debug_symbol _bfd_nosymbols_bfd_make_debug_symbol -#define irix_core_read_minisymbols _bfd_nosymbols_read_minisymbols -#define irix_core_minisymbol_to_symbol _bfd_nosymbols_minisymbol_to_symbol - -/* If somebody calls any byte-swapping routines, shoot them. */ -void -swap_abort() -{ - abort(); /* This way doesn't require any declaration for ANSI to fuck up */ -} -#define NO_GET ((bfd_vma (*) PARAMS (( const bfd_byte *))) swap_abort ) -#define NO_PUT ((void (*) PARAMS ((bfd_vma, bfd_byte *))) swap_abort ) -#define NO_SIGNED_GET \ - ((bfd_signed_vma (*) PARAMS ((const bfd_byte *))) swap_abort ) - -const bfd_target irix_core_vec = - { - "irix-core", - bfd_target_unknown_flavour, - BFD_ENDIAN_BIG, /* target byte order */ - BFD_ENDIAN_BIG, /* target headers byte order */ - (HAS_RELOC | EXEC_P | /* object flags */ - HAS_LINENO | HAS_DEBUG | - HAS_SYMS | HAS_LOCALS | WP_TEXT | D_PAGED), - (SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD | SEC_RELOC), /* section flags */ - 0, /* symbol prefix */ - ' ', /* ar_pad_char */ - 16, /* ar_max_namelen */ - NO_GET, NO_SIGNED_GET, NO_PUT, /* 64 bit data */ - NO_GET, NO_SIGNED_GET, NO_PUT, /* 32 bit data */ - NO_GET, NO_SIGNED_GET, NO_PUT, /* 16 bit data */ - NO_GET, NO_SIGNED_GET, NO_PUT, /* 64 bit hdrs */ - NO_GET, NO_SIGNED_GET, NO_PUT, /* 32 bit hdrs */ - NO_GET, NO_SIGNED_GET, NO_PUT, /* 16 bit hdrs */ - - { /* bfd_check_format */ - _bfd_dummy_target, /* unknown format */ - _bfd_dummy_target, /* object file */ - _bfd_dummy_target, /* archive */ - irix_core_core_file_p /* a core file */ - }, - { /* bfd_set_format */ - bfd_false, bfd_false, - bfd_false, bfd_false - }, - { /* bfd_write_contents */ - bfd_false, bfd_false, - bfd_false, bfd_false - }, - - BFD_JUMP_TABLE_GENERIC (_bfd_generic), - BFD_JUMP_TABLE_COPY (_bfd_generic), - BFD_JUMP_TABLE_CORE (irix_core), - BFD_JUMP_TABLE_ARCHIVE (_bfd_noarchive), - BFD_JUMP_TABLE_SYMBOLS (irix_core), - BFD_JUMP_TABLE_RELOCS (_bfd_norelocs), - BFD_JUMP_TABLE_WRITE (_bfd_generic), - BFD_JUMP_TABLE_LINK (_bfd_nolink), - BFD_JUMP_TABLE_DYNAMIC (_bfd_nodynamic), - - (PTR) 0 /* backend_data */ -}; - -#endif /* IRIX_CORE */ diff --git a/contrib/gdb/bfd/libaout.h b/contrib/gdb/bfd/libaout.h deleted file mode 100644 index 76c1dff7cdbd6..0000000000000 --- a/contrib/gdb/bfd/libaout.h +++ /dev/null @@ -1,608 +0,0 @@ -/* BFD back-end data structures for a.out (and similar) files. - Copyright 1990, 1991, 1992 Free Software Foundation, Inc. - Written by Cygnus Support. - -This file is part of BFD, the Binary File Descriptor library. - -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 2 of the License, 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ - -#ifndef LIBAOUT_H -#define LIBAOUT_H - -/* We try to encapsulate the differences in the various a.out file - variants in a few routines, and otherwise share large masses of code. - This means we only have to fix bugs in one place, most of the time. */ - -#include "bfdlink.h" - -/* Parameterize the a.out code based on whether it is being built - for a 32-bit architecture or a 64-bit architecture. */ -#if ARCH_SIZE==64 -#define GET_WORD bfd_h_get_64 -#define GET_SWORD bfd_h_get_signed_64 -#define PUT_WORD bfd_h_put_64 -#ifndef NAME -#define NAME(x,y) CAT3(x,_64_,y) -#endif -#define JNAME(x) CAT(x,_64) -#define BYTES_IN_WORD 8 -#else /* ARCH_SIZE == 32 */ -#define GET_WORD bfd_h_get_32 -#define GET_SWORD bfd_h_get_signed_32 -#define PUT_WORD bfd_h_put_32 -#ifndef NAME -#define NAME(x,y) CAT3(x,_32_,y) -#endif -#define JNAME(x) CAT(x,_32) -#define BYTES_IN_WORD 4 -#endif /* ARCH_SIZE==32 */ - -/* Declare at file level, since used in parameter lists, which have - weird scope. */ -struct external_exec; -struct external_nlist; -struct reloc_ext_external; -struct reloc_std_external; - -/* a.out backend linker hash table entries. */ - -struct aout_link_hash_entry -{ - struct bfd_link_hash_entry root; - /* Whether this symbol has been written out. */ - boolean written; - /* Symbol index in output file. */ - int indx; -}; - -/* a.out backend linker hash table. */ - -struct aout_link_hash_table -{ - struct bfd_link_hash_table root; -}; - -/* Look up an entry in an a.out link hash table. */ - -#define aout_link_hash_lookup(table, string, create, copy, follow) \ - ((struct aout_link_hash_entry *) \ - bfd_link_hash_lookup (&(table)->root, (string), (create), (copy), (follow))) - -/* Traverse an a.out link hash table. */ - -#define aout_link_hash_traverse(table, func, info) \ - (bfd_link_hash_traverse \ - (&(table)->root, \ - (boolean (*) PARAMS ((struct bfd_link_hash_entry *, PTR))) (func), \ - (info))) - -/* Get the a.out link hash table from the info structure. This is - just a cast. */ - -#define aout_hash_table(p) ((struct aout_link_hash_table *) ((p)->hash)) - -/* Back-end information for various a.out targets. */ -struct aout_backend_data -{ - /* Are ZMAGIC files mapped contiguously? If so, the text section may - need more padding, if the segment size (granularity for memory access - control) is larger than the page size. */ - unsigned char zmagic_mapped_contiguous; - /* If this flag is set, ZMAGIC/NMAGIC file headers get mapped in with the - text section, which starts immediately after the file header. - If not, the text section starts on the next page. */ - unsigned char text_includes_header; - - /* The value to pass to N_SET_FLAGS. */ - unsigned char exec_hdr_flags; - - /* If the text section VMA isn't specified, and we need an absolute - address, use this as the default. If we're producing a relocatable - file, zero is always used. */ - /* ?? Perhaps a callback would be a better choice? Will this do anything - reasonable for a format that handles multiple CPUs with different - load addresses for each? */ - bfd_vma default_text_vma; - - /* Callback for setting the page and segment sizes, if they can't be - trivially determined from the architecture. */ - boolean (*set_sizes) PARAMS ((bfd *)); - - /* zmagic files only. For go32, the length of the exec header contributes - to the size of the text section in the file for alignment purposes but - does *not* get counted in the length of the text section. */ - unsigned char exec_header_not_counted; - - /* Callback from the add symbols phase of the linker code to handle - a dynamic object. */ - boolean (*add_dynamic_symbols) PARAMS ((bfd *, struct bfd_link_info *, - struct external_nlist **, - bfd_size_type *, char **)); - - /* Callback from the add symbols phase of the linker code to handle - adding a single symbol to the global linker hash table. */ - boolean (*add_one_symbol) PARAMS ((struct bfd_link_info *, bfd *, - const char *, flagword, asection *, - bfd_vma, const char *, boolean, - boolean, - struct bfd_link_hash_entry **)); - - /* Called to handle linking a dynamic object. */ - boolean (*link_dynamic_object) PARAMS ((struct bfd_link_info *, bfd *)); - - /* Called for each global symbol being written out by the linker. - This should write out the dynamic symbol information. */ - boolean (*write_dynamic_symbol) PARAMS ((bfd *, struct bfd_link_info *, - struct aout_link_hash_entry *)); - - /* If this callback is not NULL, the linker calls it for each reloc. - RELOC is a pointer to the unswapped reloc. If *SKIP is set to - true, the reloc will be skipped. *RELOCATION may be changed to - change the effects of the relocation. */ - boolean (*check_dynamic_reloc) PARAMS ((struct bfd_link_info *info, - bfd *input_bfd, - asection *input_section, - struct aout_link_hash_entry *h, - PTR reloc, bfd_byte *contents, - boolean *skip, - bfd_vma *relocation)); - - /* Called at the end of a link to finish up any dynamic linking - information. */ - boolean (*finish_dynamic_link) PARAMS ((bfd *, struct bfd_link_info *)); -}; -#define aout_backend_info(abfd) \ - ((CONST struct aout_backend_data *)((abfd)->xvec->backend_data)) - -/* This is the layout in memory of a "struct exec" while we process it. - All 'lengths' are given as a number of bytes. - All 'alignments' are for relinkable files only; an alignment of - 'n' indicates the corresponding segment must begin at an - address that is a multiple of (2**n). */ - -struct internal_exec -{ - long a_info; /* Magic number and flags, packed */ - bfd_vma a_text; /* length of text, in bytes */ - bfd_vma a_data; /* length of data, in bytes */ - bfd_vma a_bss; /* length of uninitialized data area in mem */ - bfd_vma a_syms; /* length of symbol table data in file */ - bfd_vma a_entry; /* start address */ - bfd_vma a_trsize; /* length of text's relocation info, in bytes */ - bfd_vma a_drsize; /* length of data's relocation info, in bytes */ - /* Added for i960 */ - bfd_vma a_tload; /* Text runtime load address */ - bfd_vma a_dload; /* Data runtime load address */ - unsigned char a_talign; /* Alignment of text segment */ - unsigned char a_dalign; /* Alignment of data segment */ - unsigned char a_balign; /* Alignment of bss segment */ - char a_relaxable; /* Enough info for linker relax */ -}; - -/* Magic number is written -< MSB > -3130292827262524232221201918171615141312111009080706050403020100 -< FLAGS >< MACHINE TYPE >< MAGIC NUMBER > -*/ -/* Magic number for NetBSD is -<MSB > -3130292827262524232221201918171615141312111009080706050403020100 -< FLAGS >< >< MAGIC NUMBER > -*/ - -enum machine_type { - M_UNKNOWN = 0, - M_68010 = 1, - M_68020 = 2, - M_SPARC = 3, - /* skip a bunch so we don't run into any of suns numbers */ - /* make these up for the ns32k*/ - M_NS32032 = (64), /* ns32032 running ? */ - M_NS32532 = (64 + 5), /* ns32532 running mach */ - - M_386 = 100, - M_29K = 101, /* AMD 29000 */ - M_386_DYNIX = 102, /* Sequent running dynix */ - M_ARM = 103, /* Advanced Risc Machines ARM */ - M_386_NETBSD = 134, /* NetBSD/i386 binary */ - M_68K_NETBSD = 135, /* NetBSD/m68k binary */ - M_68K4K_NETBSD = 136, /* NetBSD/m68k4k binary */ - M_532_NETBSD = 137, /* NetBSD/ns32k binary */ - M_SPARC_NETBSD = 138, /* NetBSD/sparc binary */ - M_MIPS1 = 151, /* MIPS R2000/R3000 binary */ - M_MIPS2 = 152, /* MIPS R4000/R6000 binary */ - M_HP200 = 200, /* HP 200 (68010) BSD binary */ - M_HP300 = (300 % 256), /* HP 300 (68020+68881) BSD binary */ - M_HPUX = (0x20c % 256)/* HP 200/300 HPUX binary */ -}; - -#define N_DYNAMIC(exec) ((exec).a_info & 0x80000000) - -#ifndef N_MAGIC -# define N_MAGIC(exec) ((exec).a_info & 0xffff) -#endif - -#ifndef N_MACHTYPE -# define N_MACHTYPE(exec) ((enum machine_type)(((exec).a_info >> 16) & 0xff)) -#endif - -#ifndef N_FLAGS -# define N_FLAGS(exec) (((exec).a_info >> 24) & 0xff) -#endif - -#ifndef N_SET_INFO -# define N_SET_INFO(exec, magic, type, flags) \ -((exec).a_info = ((magic) & 0xffff) \ - | (((int)(type) & 0xff) << 16) \ - | (((flags) & 0xff) << 24)) -#endif - -#ifndef N_SET_DYNAMIC -# define N_SET_DYNAMIC(exec, dynamic) \ -((exec).a_info = (dynamic) ? ((exec).a_info | 0x80000000) : \ -((exec).a_info & 0x7fffffff)) -#endif - -#ifndef N_SET_MAGIC -# define N_SET_MAGIC(exec, magic) \ -((exec).a_info = (((exec).a_info & 0xffff0000) | ((magic) & 0xffff))) -#endif - -#ifndef N_SET_MACHTYPE -# define N_SET_MACHTYPE(exec, machtype) \ -((exec).a_info = \ - ((exec).a_info&0xff00ffff) | ((((int)(machtype))&0xff) << 16)) -#endif - -#ifndef N_SET_FLAGS -# define N_SET_FLAGS(exec, flags) \ -((exec).a_info = \ - ((exec).a_info&0x00ffffff) | (((flags) & 0xff) << 24)) -#endif - -typedef struct aout_symbol { - asymbol symbol; - short desc; - char other; - unsigned char type; -} aout_symbol_type; - -/* The `tdata' struct for all a.out-like object file formats. - Various things depend on this struct being around any time an a.out - file is being handled. An example is dbxread.c in GDB. */ - -struct aoutdata { - struct internal_exec *hdr; /* exec file header */ - aout_symbol_type *symbols; /* symtab for input bfd */ - - /* For ease, we do this */ - asection *textsec; - asection *datasec; - asection *bsssec; - - /* We remember these offsets so that after check_file_format, we have - no dependencies on the particular format of the exec_hdr. */ - file_ptr sym_filepos; - file_ptr str_filepos; - - /* Size of a relocation entry in external form */ - unsigned reloc_entry_size; - - /* Size of a symbol table entry in external form */ - unsigned symbol_entry_size; - - /* Page size - needed for alignment of demand paged files. */ - unsigned long page_size; - - /* Segment size - needed for alignment of demand paged files. */ - unsigned long segment_size; - - /* Zmagic disk block size - need to align the start of the text - section in ZMAGIC binaries. Normally the same as page_size. */ - unsigned long zmagic_disk_block_size; - - unsigned exec_bytes_size; - unsigned vma_adjusted : 1; - - /* used when a bfd supports several highly similar formats */ - enum - { - default_format = 0, - /* Used on HP 9000/300 running HP/UX. See hp300hpux.c. */ - gnu_encap_format, - /* Used on Linux, 386BSD, etc. See include/aout/aout64.h. */ - q_magic_format - } subformat; - - enum - { - undecided_magic = 0, - z_magic, - o_magic, - n_magic - } magic; - - /* A buffer for find_nearest_line. */ - char *line_buf; - - /* The external symbol information. */ - struct external_nlist *external_syms; - bfd_size_type external_sym_count; - bfd_window sym_window; - char *external_strings; - bfd_size_type external_string_size; - bfd_window string_window; - struct aout_link_hash_entry **sym_hashes; - - /* A pointer for shared library information. */ - PTR dynamic_info; - - /* A mapping from local symbols to offsets into the global offset - table, used when linking on SunOS. This is indexed by the symbol - index. */ - bfd_vma *local_got_offsets; -}; - -struct aout_data_struct { - struct aoutdata a; - struct internal_exec e; -}; - -#define adata(bfd) ((bfd)->tdata.aout_data->a) -#define exec_hdr(bfd) (adata(bfd).hdr) -#define obj_aout_symbols(bfd) (adata(bfd).symbols) -#define obj_textsec(bfd) (adata(bfd).textsec) -#define obj_datasec(bfd) (adata(bfd).datasec) -#define obj_bsssec(bfd) (adata(bfd).bsssec) -#define obj_sym_filepos(bfd) (adata(bfd).sym_filepos) -#define obj_str_filepos(bfd) (adata(bfd).str_filepos) -#define obj_reloc_entry_size(bfd) (adata(bfd).reloc_entry_size) -#define obj_symbol_entry_size(bfd) (adata(bfd).symbol_entry_size) -#define obj_aout_subformat(bfd) (adata(bfd).subformat) -#define obj_aout_external_syms(bfd) (adata(bfd).external_syms) -#define obj_aout_external_sym_count(bfd) (adata(bfd).external_sym_count) -#define obj_aout_sym_window(bfd) (adata(bfd).sym_window) -#define obj_aout_external_strings(bfd) (adata(bfd).external_strings) -#define obj_aout_external_string_size(bfd) (adata(bfd).external_string_size) -#define obj_aout_string_window(bfd) (adata(bfd).string_window) -#define obj_aout_sym_hashes(bfd) (adata(bfd).sym_hashes) -#define obj_aout_dynamic_info(bfd) (adata(bfd).dynamic_info) - -/* We take the address of the first element of an asymbol to ensure that the - macro is only ever applied to an asymbol */ -#define aout_symbol(asymbol) ((aout_symbol_type *)(&(asymbol)->the_bfd)) - -/* Information we keep for each a.out section. This is currently only - used by the a.out backend linker. */ - -struct aout_section_data_struct -{ - /* The unswapped relocation entries for this section. */ - PTR relocs; -}; - -#define aout_section_data(s) \ - ((struct aout_section_data_struct *) (s)->used_by_bfd) - -#define set_aout_section_data(s,v) \ - ((s)->used_by_bfd = (PTR)&(v)->relocs) - -/* Prototype declarations for functions defined in aoutx.h */ - -boolean -NAME(aout,squirt_out_relocs) PARAMS ((bfd *abfd, asection *section)); - -boolean -NAME(aout,make_sections) PARAMS ((bfd *)); - -const bfd_target * -NAME(aout,some_aout_object_p) PARAMS ((bfd *abfd, - struct internal_exec *execp, - const bfd_target *(*callback)(bfd *))); - -boolean -NAME(aout,mkobject) PARAMS ((bfd *abfd)); - -enum machine_type -NAME(aout,machine_type) PARAMS ((enum bfd_architecture arch, - unsigned long machine, - boolean *unknown)); - -boolean -NAME(aout,set_arch_mach) PARAMS ((bfd *abfd, enum bfd_architecture arch, - unsigned long machine)); - -boolean -NAME(aout,new_section_hook) PARAMS ((bfd *abfd, asection *newsect)); - -boolean -NAME(aout,set_section_contents) PARAMS ((bfd *abfd, sec_ptr section, - PTR location, file_ptr offset, bfd_size_type count)); - -asymbol * -NAME(aout,make_empty_symbol) PARAMS ((bfd *abfd)); - -boolean -NAME(aout,translate_symbol_table) PARAMS ((bfd *, aout_symbol_type *, - struct external_nlist *, - bfd_size_type, char *, - bfd_size_type, - boolean dynamic)); - -boolean -NAME(aout,slurp_symbol_table) PARAMS ((bfd *abfd)); - -boolean -NAME(aout,write_syms) PARAMS ((bfd *abfd)); - -void -NAME(aout,reclaim_symbol_table) PARAMS ((bfd *abfd)); - -long -NAME(aout,get_symtab_upper_bound) PARAMS ((bfd *abfd)); - -long -NAME(aout,get_symtab) PARAMS ((bfd *abfd, asymbol **location)); - -void -NAME(aout,swap_ext_reloc_in) PARAMS ((bfd *, struct reloc_ext_external *, - arelent *, asymbol **, bfd_size_type)); -void -NAME(aout,swap_std_reloc_in) PARAMS ((bfd *, struct reloc_std_external *, - arelent *, asymbol **, bfd_size_type)); - -reloc_howto_type * -NAME(aout,reloc_type_lookup) PARAMS ((bfd *abfd, - bfd_reloc_code_real_type code)); - -boolean -NAME(aout,slurp_reloc_table) PARAMS ((bfd *abfd, sec_ptr asect, - asymbol **symbols)); - -long -NAME(aout,canonicalize_reloc) PARAMS ((bfd *abfd, sec_ptr section, - arelent **relptr, asymbol **symbols)); - -long -NAME(aout,get_reloc_upper_bound) PARAMS ((bfd *abfd, sec_ptr asect)); - -void -NAME(aout,reclaim_reloc) PARAMS ((bfd *ignore_abfd, sec_ptr ignore)); - -alent * -NAME(aout,get_lineno) PARAMS ((bfd *ignore_abfd, asymbol *ignore_symbol)); - -void -NAME(aout,print_symbol) PARAMS ((bfd *ignore_abfd, PTR file, - asymbol *symbol, bfd_print_symbol_type how)); - -void -NAME(aout,get_symbol_info) PARAMS ((bfd *ignore_abfd, - asymbol *symbol, symbol_info *ret)); - -boolean -NAME(aout,find_nearest_line) PARAMS ((bfd *abfd, asection *section, - asymbol **symbols, bfd_vma offset, CONST char **filename_ptr, - CONST char **functionname_ptr, unsigned int *line_ptr)); - -long -NAME(aout,read_minisymbols) PARAMS ((bfd *, boolean, PTR *, unsigned int *)); - -asymbol * -NAME(aout,minisymbol_to_symbol) PARAMS ((bfd *, boolean, const PTR, - asymbol *)); - -int -NAME(aout,sizeof_headers) PARAMS ((bfd *abfd, boolean exec)); - -boolean -NAME(aout,adjust_sizes_and_vmas) PARAMS ((bfd *abfd, - bfd_size_type *text_size, file_ptr *text_end)); - -void -NAME(aout,swap_exec_header_in) PARAMS ((bfd *abfd, - struct external_exec *raw_bytes, struct internal_exec *execp)); - -void -NAME(aout,swap_exec_header_out) PARAMS ((bfd *abfd, - struct internal_exec *execp, struct external_exec *raw_bytes)); - -struct bfd_hash_entry * -NAME(aout,link_hash_newfunc) - PARAMS ((struct bfd_hash_entry *, struct bfd_hash_table *, const char *)); - -boolean -NAME(aout,link_hash_table_init) - PARAMS ((struct aout_link_hash_table *, bfd *, - struct bfd_hash_entry *(*) (struct bfd_hash_entry *, - struct bfd_hash_table *, - const char *))); - -struct bfd_link_hash_table * -NAME(aout,link_hash_table_create) PARAMS ((bfd *)); - -boolean -NAME(aout,link_add_symbols) PARAMS ((bfd *, struct bfd_link_info *)); - -boolean -NAME(aout,final_link) PARAMS ((bfd *, struct bfd_link_info *, - void (*) (bfd *, file_ptr *, file_ptr *, - file_ptr *))); - -boolean -NAME(aout,bfd_free_cached_info) PARAMS ((bfd *)); - -/* A.out uses the generic versions of these routines... */ - -#define aout_32_get_section_contents _bfd_generic_get_section_contents - -#define aout_64_get_section_contents _bfd_generic_get_section_contents -#ifndef NO_WRITE_HEADER_KLUDGE -#define NO_WRITE_HEADER_KLUDGE 0 -#endif - -#ifndef aout_32_bfd_is_local_label -#define aout_32_bfd_is_local_label bfd_generic_is_local_label -#endif - -#ifndef WRITE_HEADERS -#define WRITE_HEADERS(abfd, execp) \ - { \ - bfd_size_type text_size; /* dummy vars */ \ - file_ptr text_end; \ - if (adata(abfd).magic == undecided_magic) \ - NAME(aout,adjust_sizes_and_vmas) (abfd, &text_size, &text_end); \ - \ - execp->a_syms = bfd_get_symcount (abfd) * EXTERNAL_NLIST_SIZE; \ - execp->a_entry = bfd_get_start_address (abfd); \ - \ - execp->a_trsize = ((obj_textsec (abfd)->reloc_count) * \ - obj_reloc_entry_size (abfd)); \ - execp->a_drsize = ((obj_datasec (abfd)->reloc_count) * \ - obj_reloc_entry_size (abfd)); \ - NAME(aout,swap_exec_header_out) (abfd, execp, &exec_bytes); \ - \ - if (bfd_seek (abfd, (file_ptr) 0, SEEK_SET) != 0) return false; \ - if (bfd_write ((PTR) &exec_bytes, 1, EXEC_BYTES_SIZE, abfd) \ - != EXEC_BYTES_SIZE) \ - return false; \ - /* Now write out reloc info, followed by syms and strings */ \ - \ - if (bfd_get_outsymbols (abfd) != (asymbol **) NULL \ - && bfd_get_symcount (abfd) != 0) \ - { \ - if (bfd_seek (abfd, (file_ptr)(N_SYMOFF(*execp)), SEEK_SET) \ - != 0) \ - return false; \ - \ - if (! NAME(aout,write_syms)(abfd)) return false; \ - \ - if (bfd_seek (abfd, (file_ptr)(N_TRELOFF(*execp)), SEEK_SET) \ - != 0) \ - return false; \ - \ - if (!NAME(aout,squirt_out_relocs) (abfd, obj_textsec (abfd))) \ - return false; \ - if (bfd_seek (abfd, (file_ptr)(N_DRELOFF(*execp)), SEEK_SET) \ - != 0) \ - return false; \ - \ - if (!NAME(aout,squirt_out_relocs)(abfd, obj_datasec (abfd))) \ - return false; \ - } \ - } -#endif - -#endif /* ! defined (LIBAOUT_H) */ diff --git a/contrib/gdb/bfd/libbfd-in.h b/contrib/gdb/bfd/libbfd-in.h deleted file mode 100644 index 14935ebbeabc4..0000000000000 --- a/contrib/gdb/bfd/libbfd-in.h +++ /dev/null @@ -1,503 +0,0 @@ -/* libbfd.h -- Declarations used by bfd library *implementation*. - (This include file is not for users of the library.) - Copyright 1990, 91, 92, 93, 94, 95, 1996 Free Software Foundation, Inc. - Written by Cygnus Support. - -** NOTE: libbfd.h is a GENERATED file. Don't change it; instead, -** change libbfd-in.h or the other BFD source files processed to -** generate this file. - -This file is part of BFD, the Binary File Descriptor library. - -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 2 of the License, 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ - -/* Align an address upward to a boundary, expressed as a number of bytes. - E.g. align to an 8-byte boundary with argument of 8. */ -#define BFD_ALIGN(this, boundary) \ - ((( (this) + ((boundary) -1)) & (~((boundary)-1)))) - -/* If you want to read and write large blocks, you might want to do it - in quanta of this amount */ -#define DEFAULT_BUFFERSIZE 8192 - -/* Set a tdata field. Can't use the other macros for this, since they - do casts, and casting to the left of assignment isn't portable. */ -#define set_tdata(bfd, v) ((bfd)->tdata.any = (PTR) (v)) - -/* If BFD_IN_MEMORY is set for a BFD, then the iostream fields points - to an instance of this structure. */ - -struct bfd_in_memory -{ - /* Size of buffer. */ - bfd_size_type size; - /* Buffer holding contents of BFD. */ - bfd_byte *buffer; -}; - -/* tdata for an archive. For an input archive, cache - needs to be free()'d. For an output archive, symdefs do. */ - -struct artdata { - file_ptr first_file_filepos; - /* Speed up searching the armap */ - struct ar_cache *cache; - bfd *archive_head; /* Only interesting in output routines */ - carsym *symdefs; /* the symdef entries */ - symindex symdef_count; /* how many there are */ - char *extended_names; /* clever intel extension */ - /* when more compilers are standard C, this can be a time_t */ - long armap_timestamp; /* Timestamp value written into armap. - This is used for BSD archives to check - that the timestamp is recent enough - for the BSD linker to not complain, - just before we finish writing an - archive. */ - file_ptr armap_datepos; /* Position within archive to seek to - rewrite the date field. */ - PTR tdata; /* Backend specific information. */ -}; - -#define bfd_ardata(bfd) ((bfd)->tdata.aout_ar_data) - -/* Goes in bfd's arelt_data slot */ -struct areltdata { - char * arch_header; /* it's actually a string */ - unsigned int parsed_size; /* octets of filesize not including ar_hdr */ - char *filename; /* null-terminated */ -}; - -#define arelt_size(bfd) (((struct areltdata *)((bfd)->arelt_data))->parsed_size) - -extern PTR bfd_malloc PARAMS ((size_t)); -extern PTR bfd_realloc PARAMS ((PTR, size_t)); -extern PTR bfd_zmalloc PARAMS ((size_t)); - -extern bfd_error_handler_type _bfd_error_handler; - -/* These routines allocate and free things on the BFD's obstack. */ - -PTR bfd_alloc PARAMS ((bfd *abfd, size_t size)); -PTR bfd_zalloc PARAMS ((bfd *abfd, size_t size)); -void bfd_alloc_grow PARAMS ((bfd *abfd, PTR thing, size_t size)); -PTR bfd_alloc_finish PARAMS ((bfd *abfd)); -PTR bfd_alloc_by_size_t PARAMS ((bfd *abfd, size_t wanted)); - -#define bfd_release(x,y) (void) obstack_free(&(x->memory),y) - -bfd * _bfd_create_empty_archive_element_shell PARAMS ((bfd *obfd)); -bfd * _bfd_look_for_bfd_in_cache PARAMS ((bfd *arch_bfd, file_ptr index)); -boolean _bfd_add_bfd_to_archive_cache PARAMS ((bfd *, file_ptr, bfd *)); -boolean _bfd_generic_mkarchive PARAMS ((bfd *abfd)); -const bfd_target *bfd_generic_archive_p PARAMS ((bfd *abfd)); -boolean bfd_slurp_armap PARAMS ((bfd *abfd)); -boolean bfd_slurp_bsd_armap_f2 PARAMS ((bfd *abfd)); -#define bfd_slurp_bsd_armap bfd_slurp_armap -#define bfd_slurp_coff_armap bfd_slurp_armap -boolean _bfd_slurp_extended_name_table PARAMS ((bfd *abfd)); -extern boolean _bfd_construct_extended_name_table - PARAMS ((bfd *, boolean, char **, bfd_size_type *)); -boolean _bfd_write_archive_contents PARAMS ((bfd *abfd)); -boolean _bfd_compute_and_write_armap PARAMS ((bfd *, unsigned int elength)); -bfd *_bfd_get_elt_at_filepos PARAMS ((bfd *archive, file_ptr filepos)); -extern bfd *_bfd_generic_get_elt_at_index PARAMS ((bfd *, symindex)); -bfd * _bfd_new_bfd PARAMS ((void)); - -boolean bfd_false PARAMS ((bfd *ignore)); -boolean bfd_true PARAMS ((bfd *ignore)); -PTR bfd_nullvoidptr PARAMS ((bfd *ignore)); -int bfd_0 PARAMS ((bfd *ignore)); -unsigned int bfd_0u PARAMS ((bfd *ignore)); -long bfd_0l PARAMS ((bfd *ignore)); -long _bfd_n1 PARAMS ((bfd *ignore)); -void bfd_void PARAMS ((bfd *ignore)); - -bfd *_bfd_new_bfd_contained_in PARAMS ((bfd *)); -const bfd_target *_bfd_dummy_target PARAMS ((bfd *abfd)); - -void bfd_dont_truncate_arname PARAMS ((bfd *abfd, CONST char *filename, - char *hdr)); -void bfd_bsd_truncate_arname PARAMS ((bfd *abfd, CONST char *filename, - char *hdr)); -void bfd_gnu_truncate_arname PARAMS ((bfd *abfd, CONST char *filename, - char *hdr)); - -boolean bsd_write_armap PARAMS ((bfd *arch, unsigned int elength, - struct orl *map, unsigned int orl_count, int stridx)); - -boolean coff_write_armap PARAMS ((bfd *arch, unsigned int elength, - struct orl *map, unsigned int orl_count, int stridx)); - -extern PTR _bfd_generic_read_ar_hdr PARAMS ((bfd *)); - -extern PTR _bfd_generic_read_ar_hdr_mag PARAMS ((bfd *, const char *)); - -bfd * bfd_generic_openr_next_archived_file PARAMS ((bfd *archive, - bfd *last_file)); - -int bfd_generic_stat_arch_elt PARAMS ((bfd *, struct stat *)); - -#define _bfd_read_ar_hdr(abfd) \ - BFD_SEND (abfd, _bfd_read_ar_hdr_fn, (abfd)) - -/* Generic routines to use for BFD_JUMP_TABLE_GENERIC. Use - BFD_JUMP_TABLE_GENERIC (_bfd_generic). */ - -#define _bfd_generic_close_and_cleanup bfd_true -#define _bfd_generic_bfd_free_cached_info bfd_true -#define _bfd_generic_new_section_hook \ - ((boolean (*) PARAMS ((bfd *, asection *))) bfd_true) -extern boolean _bfd_generic_get_section_contents - PARAMS ((bfd *, asection *, PTR location, file_ptr offset, - bfd_size_type count)); -extern boolean _bfd_generic_get_section_contents_in_window - PARAMS ((bfd *, asection *, bfd_window *, file_ptr, bfd_size_type)); - -/* Generic routines to use for BFD_JUMP_TABLE_COPY. Use - BFD_JUMP_TABLE_COPY (_bfd_generic). */ - -#define _bfd_generic_bfd_copy_private_bfd_data \ - ((boolean (*) PARAMS ((bfd *, bfd *))) bfd_true) -#define _bfd_generic_bfd_merge_private_bfd_data \ - ((boolean (*) PARAMS ((bfd *, bfd *))) bfd_true) -#define _bfd_generic_bfd_set_private_flags \ - ((boolean (*) PARAMS ((bfd *, flagword))) bfd_true) -#define _bfd_generic_bfd_copy_private_section_data \ - ((boolean (*) PARAMS ((bfd *, asection *, bfd *, asection *))) bfd_true) -#define _bfd_generic_bfd_copy_private_symbol_data \ - ((boolean (*) PARAMS ((bfd *, asymbol *, bfd *, asymbol *))) bfd_true) -#define _bfd_generic_bfd_print_private_bfd_data \ - ((boolean (*) PARAMS ((bfd *, PTR))) bfd_true) - -/* Routines to use for BFD_JUMP_TABLE_CORE when there is no core file - support. Use BFD_JUMP_TABLE_CORE (_bfd_nocore). */ - -extern char *_bfd_nocore_core_file_failing_command PARAMS ((bfd *)); -extern int _bfd_nocore_core_file_failing_signal PARAMS ((bfd *)); -extern boolean _bfd_nocore_core_file_matches_executable_p - PARAMS ((bfd *, bfd *)); - -/* Routines to use for BFD_JUMP_TABLE_ARCHIVE when there is no archive - file support. Use BFD_JUMP_TABLE_ARCHIVE (_bfd_noarchive). */ - -#define _bfd_noarchive_slurp_armap bfd_false -#define _bfd_noarchive_slurp_extended_name_table bfd_false -#define _bfd_noarchive_construct_extended_name_table \ - ((boolean (*) PARAMS ((bfd *, char **, bfd_size_type *, const char **))) \ - bfd_false) -#define _bfd_noarchive_truncate_arname \ - ((void (*) PARAMS ((bfd *, const char *, char *))) bfd_void) -#define _bfd_noarchive_write_armap \ - ((boolean (*) \ - PARAMS ((bfd *, unsigned int, struct orl *, unsigned int, int))) \ - bfd_false) -#define _bfd_noarchive_read_ar_hdr bfd_nullvoidptr -#define _bfd_noarchive_openr_next_archived_file \ - ((bfd *(*) PARAMS ((bfd *, bfd *))) bfd_nullvoidptr) -#define _bfd_noarchive_get_elt_at_index \ - ((bfd *(*) PARAMS ((bfd *, symindex))) bfd_nullvoidptr) -#define _bfd_noarchive_generic_stat_arch_elt bfd_generic_stat_arch_elt -#define _bfd_noarchive_update_armap_timestamp bfd_false - -/* Routines to use for BFD_JUMP_TABLE_ARCHIVE to get BSD style - archives. Use BFD_JUMP_TABLE_ARCHIVE (_bfd_archive_bsd). */ - -#define _bfd_archive_bsd_slurp_armap bfd_slurp_bsd_armap -#define _bfd_archive_bsd_slurp_extended_name_table \ - _bfd_slurp_extended_name_table -extern boolean _bfd_archive_bsd_construct_extended_name_table - PARAMS ((bfd *, char **, bfd_size_type *, const char **)); -#define _bfd_archive_bsd_truncate_arname bfd_bsd_truncate_arname -#define _bfd_archive_bsd_write_armap bsd_write_armap -#define _bfd_archive_bsd_read_ar_hdr _bfd_generic_read_ar_hdr -#define _bfd_archive_bsd_openr_next_archived_file \ - bfd_generic_openr_next_archived_file -#define _bfd_archive_bsd_get_elt_at_index _bfd_generic_get_elt_at_index -#define _bfd_archive_bsd_generic_stat_arch_elt \ - bfd_generic_stat_arch_elt -extern boolean _bfd_archive_bsd_update_armap_timestamp PARAMS ((bfd *)); - -/* Routines to use for BFD_JUMP_TABLE_ARCHIVE to get COFF style - archives. Use BFD_JUMP_TABLE_ARCHIVE (_bfd_archive_coff). */ - -#define _bfd_archive_coff_slurp_armap bfd_slurp_coff_armap -#define _bfd_archive_coff_slurp_extended_name_table \ - _bfd_slurp_extended_name_table -extern boolean _bfd_archive_coff_construct_extended_name_table - PARAMS ((bfd *, char **, bfd_size_type *, const char **)); -#define _bfd_archive_coff_truncate_arname bfd_dont_truncate_arname -#define _bfd_archive_coff_write_armap coff_write_armap -#define _bfd_archive_coff_read_ar_hdr _bfd_generic_read_ar_hdr -#define _bfd_archive_coff_openr_next_archived_file \ - bfd_generic_openr_next_archived_file -#define _bfd_archive_coff_get_elt_at_index _bfd_generic_get_elt_at_index -#define _bfd_archive_coff_generic_stat_arch_elt \ - bfd_generic_stat_arch_elt -#define _bfd_archive_coff_update_armap_timestamp bfd_true - -/* Routines to use for BFD_JUMP_TABLE_SYMBOLS where there is no symbol - support. Use BFD_JUMP_TABLE_SYMBOLS (_bfd_nosymbols). */ - -#define _bfd_nosymbols_get_symtab_upper_bound _bfd_n1 -#define _bfd_nosymbols_get_symtab \ - ((long (*) PARAMS ((bfd *, asymbol **))) _bfd_n1) -#define _bfd_nosymbols_make_empty_symbol \ - ((asymbol *(*) PARAMS ((bfd *))) bfd_nullvoidptr) -#define _bfd_nosymbols_print_symbol \ - ((void (*) PARAMS ((bfd *, PTR, asymbol *, bfd_print_symbol_type))) bfd_void) -#define _bfd_nosymbols_get_symbol_info \ - ((void (*) PARAMS ((bfd *, asymbol *, symbol_info *))) bfd_void) -#define _bfd_nosymbols_bfd_is_local_label \ - ((boolean (*) PARAMS ((bfd *, asymbol *))) bfd_false) -#define _bfd_nosymbols_get_lineno \ - ((alent *(*) PARAMS ((bfd *, asymbol *))) bfd_nullvoidptr) -#define _bfd_nosymbols_find_nearest_line \ - ((boolean (*) \ - PARAMS ((bfd *, asection *, asymbol **, bfd_vma, const char **, \ - const char **, unsigned int *))) \ - bfd_false) -#define _bfd_nosymbols_bfd_make_debug_symbol \ - ((asymbol *(*) PARAMS ((bfd *, PTR, unsigned long))) bfd_nullvoidptr) -#define _bfd_nosymbols_read_minisymbols \ - ((long (*) PARAMS ((bfd *, boolean, PTR *, unsigned int *))) _bfd_n1) -#define _bfd_nosymbols_minisymbol_to_symbol \ - ((asymbol *(*) PARAMS ((bfd *, boolean, const PTR, asymbol *))) \ - bfd_nullvoidptr) - -/* Routines to use for BFD_JUMP_TABLE_RELOCS when there is no reloc - support. Use BFD_JUMP_TABLE_RELOCS (_bfd_norelocs). */ - -#define _bfd_norelocs_get_reloc_upper_bound \ - ((long (*) PARAMS ((bfd *, asection *))) _bfd_n1) -#define _bfd_norelocs_canonicalize_reloc \ - ((long (*) PARAMS ((bfd *, asection *, arelent **, asymbol **))) _bfd_n1) -#define _bfd_norelocs_bfd_reloc_type_lookup \ - ((reloc_howto_type *(*) PARAMS ((bfd *, bfd_reloc_code_real_type))) \ - bfd_nullvoidptr) - -/* Routines to use for BFD_JUMP_TABLE_WRITE for targets which may not - be written. Use BFD_JUMP_TABLE_WRITE (_bfd_nowrite). */ - -#define _bfd_nowrite_set_arch_mach \ - ((boolean (*) PARAMS ((bfd *, enum bfd_architecture, unsigned long))) \ - bfd_false) -#define _bfd_nowrite_set_section_contents \ - ((boolean (*) PARAMS ((bfd *, asection *, PTR, file_ptr, bfd_size_type))) \ - bfd_false) - -/* Generic routines to use for BFD_JUMP_TABLE_WRITE. Use - BFD_JUMP_TABLE_WRITE (_bfd_generic). */ - -#define _bfd_generic_set_arch_mach bfd_default_set_arch_mach -extern boolean _bfd_generic_set_section_contents - PARAMS ((bfd *, asection *, PTR, file_ptr, bfd_size_type)); - -/* Routines to use for BFD_JUMP_TABLE_LINK for targets which do not - support linking. Use BFD_JUMP_TABLE_LINK (_bfd_nolink). */ - -#define _bfd_nolink_sizeof_headers ((int (*) PARAMS ((bfd *, boolean))) bfd_0) -#define _bfd_nolink_bfd_get_relocated_section_contents \ - ((bfd_byte *(*) \ - PARAMS ((bfd *, struct bfd_link_info *, struct bfd_link_order *, \ - bfd_byte *, boolean, asymbol **))) \ - bfd_nullvoidptr) -#define _bfd_nolink_bfd_relax_section \ - ((boolean (*) \ - PARAMS ((bfd *, asection *, struct bfd_link_info *, boolean *))) \ - bfd_false) -#define _bfd_nolink_bfd_link_hash_table_create \ - ((struct bfd_link_hash_table *(*) PARAMS ((bfd *))) bfd_nullvoidptr) -#define _bfd_nolink_bfd_link_add_symbols \ - ((boolean (*) PARAMS ((bfd *, struct bfd_link_info *))) bfd_false) -#define _bfd_nolink_bfd_final_link \ - ((boolean (*) PARAMS ((bfd *, struct bfd_link_info *))) bfd_false) -#define _bfd_nolink_bfd_link_split_section \ - ((boolean (*) PARAMS ((bfd *, struct sec *))) bfd_false) - -/* Routines to use for BFD_JUMP_TABLE_DYNAMIC for targets which do not - have dynamic symbols or relocs. Use BFD_JUMP_TABLE_DYNAMIC - (_bfd_nodynamic). */ - -#define _bfd_nodynamic_get_dynamic_symtab_upper_bound _bfd_n1 -#define _bfd_nodynamic_canonicalize_dynamic_symtab \ - ((long (*) PARAMS ((bfd *, asymbol **))) _bfd_n1) -#define _bfd_nodynamic_get_dynamic_reloc_upper_bound _bfd_n1 -#define _bfd_nodynamic_canonicalize_dynamic_reloc \ - ((long (*) PARAMS ((bfd *, arelent **, asymbol **))) _bfd_n1) - -/* Generic routine to determine of the given symbol is a local - label. */ -extern boolean bfd_generic_is_local_label PARAMS ((bfd *, asymbol *)); - -/* Generic minisymbol routines. */ -extern long _bfd_generic_read_minisymbols - PARAMS ((bfd *, boolean, PTR *, unsigned int *)); -extern asymbol *_bfd_generic_minisymbol_to_symbol - PARAMS ((bfd *, boolean, const PTR, asymbol *)); - -/* Find the nearest line using .stab/.stabstr sections. */ -extern boolean _bfd_stab_section_find_nearest_line - PARAMS ((bfd *, asymbol **, asection *, bfd_vma, boolean *, const char **, - const char **, unsigned int *, PTR *)); - -/* A routine to create entries for a bfd_link_hash_table. */ -extern struct bfd_hash_entry *_bfd_link_hash_newfunc - PARAMS ((struct bfd_hash_entry *entry, - struct bfd_hash_table *table, - const char *string)); - -/* Initialize a bfd_link_hash_table. */ -extern boolean _bfd_link_hash_table_init - PARAMS ((struct bfd_link_hash_table *, bfd *, - struct bfd_hash_entry *(*) (struct bfd_hash_entry *, - struct bfd_hash_table *, - const char *))); - -/* Generic link hash table creation routine. */ -extern struct bfd_link_hash_table *_bfd_generic_link_hash_table_create - PARAMS ((bfd *)); - -/* Generic add symbol routine. */ -extern boolean _bfd_generic_link_add_symbols - PARAMS ((bfd *, struct bfd_link_info *)); - -/* Generic add symbol routine. This version is used by targets for - which the linker must collect constructors and destructors by name, - as the collect2 program does. */ -extern boolean _bfd_generic_link_add_symbols_collect - PARAMS ((bfd *, struct bfd_link_info *)); - -/* Generic archive add symbol routine. */ -extern boolean _bfd_generic_link_add_archive_symbols - PARAMS ((bfd *, struct bfd_link_info *, - boolean (*checkfn) (bfd *, struct bfd_link_info *, boolean *))); - -/* Forward declaration to avoid prototype errors. */ -typedef struct bfd_link_hash_entry _bfd_link_hash_entry; - -/* Generic routine to add a single symbol. */ -extern boolean _bfd_generic_link_add_one_symbol - PARAMS ((struct bfd_link_info *, bfd *, const char *name, flagword, - asection *, bfd_vma, const char *, boolean copy, - boolean constructor, struct bfd_link_hash_entry **)); - -/* Generic link routine. */ -extern boolean _bfd_generic_final_link - PARAMS ((bfd *, struct bfd_link_info *)); - -extern boolean _bfd_generic_link_split_section - PARAMS ((bfd *, struct sec *)); - -/* Generic reloc_link_order processing routine. */ -extern boolean _bfd_generic_reloc_link_order - PARAMS ((bfd *, struct bfd_link_info *, asection *, - struct bfd_link_order *)); - -/* Default link order processing routine. */ -extern boolean _bfd_default_link_order - PARAMS ((bfd *, struct bfd_link_info *, asection *, - struct bfd_link_order *)); - -/* Count the number of reloc entries in a link order list. */ -extern unsigned int _bfd_count_link_order_relocs - PARAMS ((struct bfd_link_order *)); - -/* Final link relocation routine. */ -extern bfd_reloc_status_type _bfd_final_link_relocate - PARAMS ((reloc_howto_type *, bfd *, asection *, bfd_byte *, - bfd_vma address, bfd_vma value, bfd_vma addend)); - -/* Relocate a particular location by a howto and a value. */ -extern bfd_reloc_status_type _bfd_relocate_contents - PARAMS ((reloc_howto_type *, bfd *, bfd_vma, bfd_byte *)); - -/* Create a string table. */ -extern struct bfd_strtab_hash *_bfd_stringtab_init PARAMS ((void)); - -/* Create an XCOFF .debug section style string table. */ -extern struct bfd_strtab_hash *_bfd_xcoff_stringtab_init PARAMS ((void)); - -/* Free a string table. */ -extern void _bfd_stringtab_free PARAMS ((struct bfd_strtab_hash *)); - -/* Get the size of a string table. */ -extern bfd_size_type _bfd_stringtab_size PARAMS ((struct bfd_strtab_hash *)); - -/* Add a string to a string table. */ -extern bfd_size_type _bfd_stringtab_add - PARAMS ((struct bfd_strtab_hash *, const char *, boolean hash, - boolean copy)); - -/* Write out a string table. */ -extern boolean _bfd_stringtab_emit PARAMS ((bfd *, struct bfd_strtab_hash *)); - -/* Macros to tell if bfds are read or write enabled. - - Note that bfds open for read may be scribbled into if the fd passed - to bfd_fdopenr is actually open both for read and write - simultaneously. However an output bfd will never be open for - read. Therefore sometimes you want to check bfd_read_p or - !bfd_read_p, and only sometimes bfd_write_p. -*/ - -#define bfd_read_p(abfd) ((abfd)->direction == read_direction || (abfd)->direction == both_direction) -#define bfd_write_p(abfd) ((abfd)->direction == write_direction || (abfd)->direction == both_direction) - -void bfd_assert PARAMS ((const char*,int)); - -#define BFD_ASSERT(x) \ -{ if (!(x)) bfd_assert(__FILE__,__LINE__); } - -#define BFD_FAIL() \ -{ bfd_assert(__FILE__,__LINE__); } - -FILE * bfd_cache_lookup_worker PARAMS ((bfd *)); - -extern bfd *bfd_last_cache; - -/* Now Steve, what's the story here? */ -#ifdef lint -#define itos(x) "l" -#define stoi(x) 1 -#else -#define itos(x) ((char*)(x)) -#define stoi(x) ((int)(x)) -#endif - -/* List of supported target vectors, and the default vector (if - bfd_default_vector[0] is NULL, there is no default). */ -extern const bfd_target * const bfd_target_vector[]; -extern const bfd_target * const bfd_default_vector[]; - -/* Functions shared by the ECOFF and MIPS ELF backends, which have no - other common header files. */ - -#if defined(__STDC__) || defined(ALMOST_STDC) -struct ecoff_find_line; -#endif - -extern boolean _bfd_ecoff_locate_line - PARAMS ((bfd *, asection *, bfd_vma, struct ecoff_debug_info * const, - const struct ecoff_debug_swap * const, struct ecoff_find_line *, - const char **, const char **, unsigned int *)); -extern boolean _bfd_ecoff_get_accumulated_pdr PARAMS ((PTR, bfd_byte *)); -extern boolean _bfd_ecoff_get_accumulated_sym PARAMS ((PTR, bfd_byte *)); -extern boolean _bfd_ecoff_get_accumulated_ss PARAMS ((PTR, bfd_byte *)); - -extern bfd_vma _bfd_get_gp_value PARAMS ((bfd *)); -extern void _bfd_set_gp_value PARAMS ((bfd *, bfd_vma)); - -/* And more follows */ - diff --git a/contrib/gdb/bfd/libbfd.c b/contrib/gdb/bfd/libbfd.c deleted file mode 100644 index 1052a3a17be5b..0000000000000 --- a/contrib/gdb/bfd/libbfd.c +++ /dev/null @@ -1,1197 +0,0 @@ -/* Assorted BFD support routines, only used internally. - Copyright 1990, 91, 92, 93, 94, 95, 1996 Free Software Foundation, Inc. - Written by Cygnus Support. - -This file is part of BFD, the Binary File Descriptor library. - -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 2 of the License, 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ - -#include "bfd.h" -#include "sysdep.h" -#include "libbfd.h" - -static int real_read PARAMS ((PTR, size_t, size_t, FILE *)); - -/* -SECTION - Internal functions - -DESCRIPTION - These routines are used within BFD. - They are not intended for export, but are documented here for - completeness. -*/ - -/* A routine which is used in target vectors for unsupported - operations. */ - -/*ARGSUSED*/ -boolean -bfd_false (ignore) - bfd *ignore; -{ - bfd_set_error (bfd_error_invalid_operation); - return false; -} - -/* A routine which is used in target vectors for supported operations - which do not actually do anything. */ - -/*ARGSUSED*/ -boolean -bfd_true (ignore) - bfd *ignore; -{ - return true; -} - -/* A routine which is used in target vectors for unsupported - operations which return a pointer value. */ - -/*ARGSUSED*/ -PTR -bfd_nullvoidptr (ignore) - bfd *ignore; -{ - bfd_set_error (bfd_error_invalid_operation); - return NULL; -} - -/*ARGSUSED*/ -int -bfd_0 (ignore) - bfd *ignore; -{ - return 0; -} - -/*ARGSUSED*/ -unsigned int -bfd_0u (ignore) - bfd *ignore; -{ - return 0; -} - -/*ARGUSED*/ -long -bfd_0l (ignore) - bfd *ignore; -{ - return 0; -} - -/* A routine which is used in target vectors for unsupported - operations which return -1 on error. */ - -/*ARGSUSED*/ -long -_bfd_n1 (ignore_abfd) - bfd *ignore_abfd; -{ - bfd_set_error (bfd_error_invalid_operation); - return -1; -} - -/*ARGSUSED*/ -void -bfd_void (ignore) - bfd *ignore; -{ -} - -/*ARGSUSED*/ -boolean -_bfd_nocore_core_file_matches_executable_p (ignore_core_bfd, ignore_exec_bfd) - bfd *ignore_core_bfd; - bfd *ignore_exec_bfd; -{ - bfd_set_error (bfd_error_invalid_operation); - return false; -} - -/* Routine to handle core_file_failing_command entry point for targets - without core file support. */ - -/*ARGSUSED*/ -char * -_bfd_nocore_core_file_failing_command (ignore_abfd) - bfd *ignore_abfd; -{ - bfd_set_error (bfd_error_invalid_operation); - return (char *)NULL; -} - -/* Routine to handle core_file_failing_signal entry point for targets - without core file support. */ - -/*ARGSUSED*/ -int -_bfd_nocore_core_file_failing_signal (ignore_abfd) - bfd *ignore_abfd; -{ - bfd_set_error (bfd_error_invalid_operation); - return 0; -} - -/*ARGSUSED*/ -const bfd_target * -_bfd_dummy_target (ignore_abfd) - bfd *ignore_abfd; -{ - bfd_set_error (bfd_error_wrong_format); - return 0; -} - -/* Allocate memory using malloc. */ - -PTR -bfd_malloc (size) - size_t size; -{ - PTR ptr; - - ptr = (PTR) malloc (size); - if (ptr == NULL && size != 0) - bfd_set_error (bfd_error_no_memory); - return ptr; -} - -/* Reallocate memory using realloc. */ - -PTR -bfd_realloc (ptr, size) - PTR ptr; - size_t size; -{ - PTR ret; - - if (ptr == NULL) - ret = malloc (size); - else - ret = realloc (ptr, size); - - if (ret == NULL) - bfd_set_error (bfd_error_no_memory); - - return ret; -} - -/* Allocate memory using malloc and clear it. */ - -PTR -bfd_zmalloc (size) - size_t size; -{ - PTR ptr; - - ptr = (PTR) malloc (size); - - if (size != 0) - { - if (ptr == NULL) - bfd_set_error (bfd_error_no_memory); - else - memset (ptr, 0, size); - } - - return ptr; -} - -/* Some IO code */ - - -/* Note that archive entries don't have streams; they share their parent's. - This allows someone to play with the iostream behind BFD's back. - - Also, note that the origin pointer points to the beginning of a file's - contents (0 for non-archive elements). For archive entries this is the - first octet in the file, NOT the beginning of the archive header. */ - -static int -real_read (where, a,b, file) - PTR where; - size_t a; - size_t b; - FILE *file; -{ - return fread (where, a, b, file); -} - -/* Return value is amount read (FIXME: how are errors and end of file dealt - with? We never call bfd_set_error, which is probably a mistake). */ - -bfd_size_type -bfd_read (ptr, size, nitems, abfd) - PTR ptr; - bfd_size_type size; - bfd_size_type nitems; - bfd *abfd; -{ - int nread; - - if ((abfd->flags & BFD_IN_MEMORY) != 0) - { - struct bfd_in_memory *bim; - bfd_size_type get; - - bim = (struct bfd_in_memory *) abfd->iostream; - get = size * nitems; - if (abfd->where + get > bim->size) - { - get = bim->size - abfd->where; - bfd_set_error (bfd_error_file_truncated); - } - memcpy (ptr, bim->buffer + abfd->where, get); - abfd->where += get; - return get; - } - - nread = real_read (ptr, 1, (size_t)(size*nitems), bfd_cache_lookup(abfd)); -#ifdef FILE_OFFSET_IS_CHAR_INDEX - if (nread > 0) - abfd->where += nread; -#endif - - /* Set bfd_error if we did not read as much data as we expected. - - If the read failed due to an error set the bfd_error_system_call, - else set bfd_error_file_truncated. - - A BFD backend may wish to override bfd_error_file_truncated to - provide something more useful (eg. no_symbols or wrong_format). */ - if (nread < (int)(size * nitems)) - { - if (ferror (bfd_cache_lookup (abfd))) - bfd_set_error (bfd_error_system_call); - else - bfd_set_error (bfd_error_file_truncated); - } - - return nread; -} - -/* The window support stuff should probably be broken out into - another file.... */ -/* The idea behind the next and refcount fields is that one mapped - region can suffice for multiple read-only windows or multiple - non-overlapping read-write windows. It's not implemented yet - though. */ -struct _bfd_window_internal { - struct _bfd_window_internal *next; - PTR data; - bfd_size_type size; - int refcount : 31; /* should be enough... */ - unsigned mapped : 1; /* 1 = mmap, 0 = malloc */ -}; - -void -bfd_init_window (windowp) - bfd_window *windowp; -{ - windowp->data = 0; - windowp->i = 0; - windowp->size = 0; -} - -#undef HAVE_MPROTECT /* code's not tested yet */ - -#if HAVE_MMAP || HAVE_MPROTECT || HAVE_MADVISE -#include <sys/types.h> -#include <sys/mman.h> -#endif - -#ifndef MAP_FILE -#define MAP_FILE 0 -#endif - -static int debug_windows; - -/* Currently, if USE_MMAP is undefined, none if the window stuff is - used. Okay, so it's mis-named. At least the command-line option - "--without-mmap" is more obvious than "--without-windows" or some - such. */ -#ifdef USE_MMAP - -void -bfd_free_window (windowp) - bfd_window *windowp; -{ - bfd_window_internal *i = windowp->i; - windowp->i = 0; - windowp->data = 0; - if (i == 0) - return; - i->refcount--; - if (debug_windows) - fprintf (stderr, "freeing window @%p<%p,%lx,%p>\n", - windowp, windowp->data, windowp->size, windowp->i); - if (i->refcount != 0) - return; - - if (i->mapped) - { -#ifdef HAVE_MMAP - munmap (i->data, i->size); - goto no_free; -#else - abort (); -#endif - } -#ifdef HAVE_MPROTECT - mprotect (i->data, i->size, PROT_READ | PROT_WRITE); -#endif - free (i->data); -#ifdef HAVE_MMAP - no_free: -#endif - i->data = 0; - /* There should be no more references to i at this point. */ - free (i); -} -#endif - -static int ok_to_map = 1; - -boolean -bfd_get_file_window (abfd, offset, size, windowp, writable) - bfd *abfd; - file_ptr offset; - bfd_size_type size; - bfd_window *windowp; - boolean writable; -{ - static size_t pagesize; - bfd_window_internal *i = windowp->i; - size_t size_to_alloc = size; - -#ifndef USE_MMAP - abort (); -#endif - - if (debug_windows) - fprintf (stderr, "bfd_get_file_window (%p, %6ld, %6ld, %p<%p,%lx,%p>, %d)", - abfd, (long) offset, (long) size, - windowp, windowp->data, windowp->size, windowp->i, - writable); - - /* Make sure we know the page size, so we can be friendly to mmap. */ - if (pagesize == 0) - pagesize = getpagesize (); - if (pagesize == 0) - abort (); - - if (i == 0) - { - windowp->i = i = (bfd_window_internal *) bfd_zmalloc (sizeof (bfd_window_internal)); - if (i == 0) - return false; - i->data = 0; - } -#ifdef HAVE_MMAP - if (ok_to_map - && (i->data == 0 || i->mapped == 1) - && (abfd->flags & BFD_IN_MEMORY) == 0) - { - file_ptr file_offset, offset2; - size_t real_size; - int fd; - FILE *f; - - /* Find the real file and the real offset into it. */ - while (abfd->my_archive != NULL) - { - offset += abfd->origin; - abfd = abfd->my_archive; - } - f = bfd_cache_lookup (abfd); - fd = fileno (f); - - /* Compute offsets and size for mmap and for the user's data. */ - offset2 = offset % pagesize; - if (offset2 < 0) - abort (); - file_offset = offset - offset2; - real_size = offset + size - file_offset; - real_size = real_size + pagesize - 1; - real_size -= real_size % pagesize; - - /* If we're re-using a memory region, make sure it's big enough. */ - if (i->data && i->size < size) - { - munmap (i->data, i->size); - i->data = 0; - } - i->data = mmap (i->data, real_size, - writable ? PROT_WRITE | PROT_READ : PROT_READ, - (writable - ? MAP_FILE | MAP_PRIVATE - : MAP_FILE | MAP_SHARED), - fd, file_offset); - if (i->data == (PTR) -1) - { - /* An error happened. Report it, or try using malloc, or - something. */ - bfd_set_error (bfd_error_system_call); - i->data = 0; - windowp->data = 0; - if (debug_windows) - fprintf (stderr, "\t\tmmap failed!\n"); - return false; - } - if (debug_windows) - fprintf (stderr, "\n\tmapped %ld at %p, offset is %ld\n", - (long) real_size, i->data, (long) offset2); - i->size = real_size; - windowp->data = (PTR) ((bfd_byte *) i->data + offset2); - windowp->size = size; - i->mapped = 1; - return true; - } - else if (debug_windows) - { - if (ok_to_map) - fprintf (stderr, "not mapping: data=%lx mapped=%d\n", - (unsigned long) i->data, (int) i->mapped); - else - fprintf (stderr, "not mapping: env var not set\n"); - } -#else - ok_to_map = 0; -#endif - -#ifdef HAVE_MPROTECT - if (!writable) - { - size_to_alloc += pagesize - 1; - size_to_alloc -= size_to_alloc % pagesize; - } -#endif - if (debug_windows) - fprintf (stderr, "\n\t%s(%6ld)", - i->data ? "realloc" : " malloc", (long) size_to_alloc); - i->data = (PTR) bfd_realloc (i->data, size_to_alloc); - if (debug_windows) - fprintf (stderr, "\t-> %p\n", i->data); - i->refcount = 1; - if (i->data == NULL) - { - if (size_to_alloc == 0) - return true; - bfd_set_error (bfd_error_no_memory); - return false; - } - if (bfd_seek (abfd, offset, SEEK_SET) != 0) - return false; - i->size = bfd_read (i->data, size, 1, abfd); - if (i->size != size) - return false; - i->mapped = 0; -#ifdef HAVE_MPROTECT - if (!writable) - { - if (debug_windows) - fprintf (stderr, "\tmprotect (%p, %ld, PROT_READ)\n", i->data, - (long) i->size); - mprotect (i->data, i->size, PROT_READ); - } -#endif - windowp->data = i->data; - windowp->size = i->size; - return true; -} - -bfd_size_type -bfd_write (ptr, size, nitems, abfd) - CONST PTR ptr; - bfd_size_type size; - bfd_size_type nitems; - bfd *abfd; -{ - long nwrote; - - if ((abfd->flags & BFD_IN_MEMORY) != 0) - abort (); - - nwrote = fwrite (ptr, 1, (size_t) (size * nitems), - bfd_cache_lookup (abfd)); -#ifdef FILE_OFFSET_IS_CHAR_INDEX - if (nwrote > 0) - abfd->where += nwrote; -#endif - if ((bfd_size_type) nwrote != size * nitems) - { -#ifdef ENOSPC - if (nwrote >= 0) - errno = ENOSPC; -#endif - bfd_set_error (bfd_error_system_call); - } - return nwrote; -} - -/* -INTERNAL_FUNCTION - bfd_write_bigendian_4byte_int - -SYNOPSIS - void bfd_write_bigendian_4byte_int(bfd *abfd, int i); - -DESCRIPTION - Write a 4 byte integer @var{i} to the output BFD @var{abfd}, in big - endian order regardless of what else is going on. This is useful in - archives. - -*/ -void -bfd_write_bigendian_4byte_int (abfd, i) - bfd *abfd; - int i; -{ - bfd_byte buffer[4]; - bfd_putb32(i, buffer); - if (bfd_write((PTR)buffer, 4, 1, abfd) != 4) - abort (); -} - -long -bfd_tell (abfd) - bfd *abfd; -{ - file_ptr ptr; - - if ((abfd->flags & BFD_IN_MEMORY) != 0) - return abfd->where; - - ptr = ftell (bfd_cache_lookup(abfd)); - - if (abfd->my_archive) - ptr -= abfd->origin; - abfd->where = ptr; - return ptr; -} - -int -bfd_flush (abfd) - bfd *abfd; -{ - if ((abfd->flags & BFD_IN_MEMORY) != 0) - return 0; - return fflush (bfd_cache_lookup(abfd)); -} - -/* Returns 0 for success, negative value for failure (in which case - bfd_get_error can retrieve the error code). */ -int -bfd_stat (abfd, statbuf) - bfd *abfd; - struct stat *statbuf; -{ - FILE *f; - int result; - - if ((abfd->flags & BFD_IN_MEMORY) != 0) - abort (); - - f = bfd_cache_lookup (abfd); - if (f == NULL) - { - bfd_set_error (bfd_error_system_call); - return -1; - } - result = fstat (fileno (f), statbuf); - if (result < 0) - bfd_set_error (bfd_error_system_call); - return result; -} - -/* Returns 0 for success, nonzero for failure (in which case bfd_get_error - can retrieve the error code). */ - -int -bfd_seek (abfd, position, direction) - bfd *abfd; - file_ptr position; - int direction; -{ - int result; - FILE *f; - file_ptr file_position; - /* For the time being, a BFD may not seek to it's end. The problem - is that we don't easily have a way to recognize the end of an - element in an archive. */ - - BFD_ASSERT (direction == SEEK_SET || direction == SEEK_CUR); - - if (direction == SEEK_CUR && position == 0) - return 0; - - if ((abfd->flags & BFD_IN_MEMORY) != 0) - { - if (direction == SEEK_SET) - abfd->where = position; - else - abfd->where += position; - return 0; - } - -#ifdef FILE_OFFSET_IS_CHAR_INDEX - if (abfd->format != bfd_archive && abfd->my_archive == 0) - { -#if 0 - /* Explanation for this code: I'm only about 95+% sure that the above - conditions are sufficient and that all i/o calls are properly - adjusting the `where' field. So this is sort of an `assert' - that the `where' field is correct. If we can go a while without - tripping the abort, we can probably safely disable this code, - so that the real optimizations happen. */ - file_ptr where_am_i_now; - where_am_i_now = ftell (bfd_cache_lookup (abfd)); - if (abfd->my_archive) - where_am_i_now -= abfd->origin; - if (where_am_i_now != abfd->where) - abort (); -#endif - if (direction == SEEK_SET && position == abfd->where) - return 0; - } - else - { - /* We need something smarter to optimize access to archives. - Currently, anything inside an archive is read via the file - handle for the archive. Which means that a bfd_seek on one - component affects the `current position' in the archive, as - well as in any other component. - - It might be sufficient to put a spike through the cache - abstraction, and look to the archive for the file position, - but I think we should try for something cleaner. - - In the meantime, no optimization for archives. */ - } -#endif - - f = bfd_cache_lookup (abfd); - file_position = position; - if (direction == SEEK_SET && abfd->my_archive != NULL) - file_position += abfd->origin; - - result = fseek (f, file_position, direction); - - if (result != 0) - { - /* Force redetermination of `where' field. */ - bfd_tell (abfd); - bfd_set_error (bfd_error_system_call); - } - else - { -#ifdef FILE_OFFSET_IS_CHAR_INDEX - /* Adjust `where' field. */ - if (direction == SEEK_SET) - abfd->where = position; - else - abfd->where += position; -#endif - } - return result; -} - -/** The do-it-yourself (byte) sex-change kit */ - -/* The middle letter e.g. get<b>short indicates Big or Little endian - target machine. It doesn't matter what the byte order of the host - machine is; these routines work for either. */ - -/* FIXME: Should these take a count argument? - Answer (gnu@cygnus.com): No, but perhaps they should be inline - functions in swap.h #ifdef __GNUC__. - Gprof them later and find out. */ - -/* -FUNCTION - bfd_put_size -FUNCTION - bfd_get_size - -DESCRIPTION - These macros as used for reading and writing raw data in - sections; each access (except for bytes) is vectored through - the target format of the BFD and mangled accordingly. The - mangling performs any necessary endian translations and - removes alignment restrictions. Note that types accepted and - returned by these macros are identical so they can be swapped - around in macros---for example, @file{libaout.h} defines <<GET_WORD>> - to either <<bfd_get_32>> or <<bfd_get_64>>. - - In the put routines, @var{val} must be a <<bfd_vma>>. If we are on a - system without prototypes, the caller is responsible for making - sure that is true, with a cast if necessary. We don't cast - them in the macro definitions because that would prevent <<lint>> - or <<gcc -Wall>> from detecting sins such as passing a pointer. - To detect calling these with less than a <<bfd_vma>>, use - <<gcc -Wconversion>> on a host with 64 bit <<bfd_vma>>'s. - -. -.{* Byte swapping macros for user section data. *} -. -.#define bfd_put_8(abfd, val, ptr) \ -. (*((unsigned char *)(ptr)) = (unsigned char)(val)) -.#define bfd_put_signed_8 \ -. bfd_put_8 -.#define bfd_get_8(abfd, ptr) \ -. (*(unsigned char *)(ptr)) -.#define bfd_get_signed_8(abfd, ptr) \ -. ((*(unsigned char *)(ptr) ^ 0x80) - 0x80) -. -.#define bfd_put_16(abfd, val, ptr) \ -. BFD_SEND(abfd, bfd_putx16, ((val),(ptr))) -.#define bfd_put_signed_16 \ -. bfd_put_16 -.#define bfd_get_16(abfd, ptr) \ -. BFD_SEND(abfd, bfd_getx16, (ptr)) -.#define bfd_get_signed_16(abfd, ptr) \ -. BFD_SEND (abfd, bfd_getx_signed_16, (ptr)) -. -.#define bfd_put_32(abfd, val, ptr) \ -. BFD_SEND(abfd, bfd_putx32, ((val),(ptr))) -.#define bfd_put_signed_32 \ -. bfd_put_32 -.#define bfd_get_32(abfd, ptr) \ -. BFD_SEND(abfd, bfd_getx32, (ptr)) -.#define bfd_get_signed_32(abfd, ptr) \ -. BFD_SEND(abfd, bfd_getx_signed_32, (ptr)) -. -.#define bfd_put_64(abfd, val, ptr) \ -. BFD_SEND(abfd, bfd_putx64, ((val), (ptr))) -.#define bfd_put_signed_64 \ -. bfd_put_64 -.#define bfd_get_64(abfd, ptr) \ -. BFD_SEND(abfd, bfd_getx64, (ptr)) -.#define bfd_get_signed_64(abfd, ptr) \ -. BFD_SEND(abfd, bfd_getx_signed_64, (ptr)) -. -*/ - -/* -FUNCTION - bfd_h_put_size - bfd_h_get_size - -DESCRIPTION - These macros have the same function as their <<bfd_get_x>> - bretheren, except that they are used for removing information - for the header records of object files. Believe it or not, - some object files keep their header records in big endian - order and their data in little endian order. -. -.{* Byte swapping macros for file header data. *} -. -.#define bfd_h_put_8(abfd, val, ptr) \ -. bfd_put_8 (abfd, val, ptr) -.#define bfd_h_put_signed_8(abfd, val, ptr) \ -. bfd_put_8 (abfd, val, ptr) -.#define bfd_h_get_8(abfd, ptr) \ -. bfd_get_8 (abfd, ptr) -.#define bfd_h_get_signed_8(abfd, ptr) \ -. bfd_get_signed_8 (abfd, ptr) -. -.#define bfd_h_put_16(abfd, val, ptr) \ -. BFD_SEND(abfd, bfd_h_putx16,(val,ptr)) -.#define bfd_h_put_signed_16 \ -. bfd_h_put_16 -.#define bfd_h_get_16(abfd, ptr) \ -. BFD_SEND(abfd, bfd_h_getx16,(ptr)) -.#define bfd_h_get_signed_16(abfd, ptr) \ -. BFD_SEND(abfd, bfd_h_getx_signed_16, (ptr)) -. -.#define bfd_h_put_32(abfd, val, ptr) \ -. BFD_SEND(abfd, bfd_h_putx32,(val,ptr)) -.#define bfd_h_put_signed_32 \ -. bfd_h_put_32 -.#define bfd_h_get_32(abfd, ptr) \ -. BFD_SEND(abfd, bfd_h_getx32,(ptr)) -.#define bfd_h_get_signed_32(abfd, ptr) \ -. BFD_SEND(abfd, bfd_h_getx_signed_32, (ptr)) -. -.#define bfd_h_put_64(abfd, val, ptr) \ -. BFD_SEND(abfd, bfd_h_putx64,(val, ptr)) -.#define bfd_h_put_signed_64 \ -. bfd_h_put_64 -.#define bfd_h_get_64(abfd, ptr) \ -. BFD_SEND(abfd, bfd_h_getx64,(ptr)) -.#define bfd_h_get_signed_64(abfd, ptr) \ -. BFD_SEND(abfd, bfd_h_getx_signed_64, (ptr)) -. -*/ - -/* Sign extension to bfd_signed_vma. */ -#define COERCE16(x) (((bfd_signed_vma) (x) ^ 0x8000) - 0x8000) -#define COERCE32(x) (((bfd_signed_vma) (x) ^ 0x80000000) - 0x80000000) -#define EIGHT_GAZILLION (((BFD_HOST_64_BIT)0x80000000) << 32) -#define COERCE64(x) \ - (((bfd_signed_vma) (x) ^ EIGHT_GAZILLION) - EIGHT_GAZILLION) - -bfd_vma -bfd_getb16 (addr) - register const bfd_byte *addr; -{ - return (addr[0] << 8) | addr[1]; -} - -bfd_vma -bfd_getl16 (addr) - register const bfd_byte *addr; -{ - return (addr[1] << 8) | addr[0]; -} - -bfd_signed_vma -bfd_getb_signed_16 (addr) - register const bfd_byte *addr; -{ - return COERCE16((addr[0] << 8) | addr[1]); -} - -bfd_signed_vma -bfd_getl_signed_16 (addr) - register const bfd_byte *addr; -{ - return COERCE16((addr[1] << 8) | addr[0]); -} - -void -bfd_putb16 (data, addr) - bfd_vma data; - register bfd_byte *addr; -{ - addr[0] = (bfd_byte)(data >> 8); - addr[1] = (bfd_byte )data; -} - -void -bfd_putl16 (data, addr) - bfd_vma data; - register bfd_byte *addr; -{ - addr[0] = (bfd_byte )data; - addr[1] = (bfd_byte)(data >> 8); -} - -bfd_vma -bfd_getb32 (addr) - register const bfd_byte *addr; -{ - return (((((bfd_vma)addr[0] << 8) | addr[1]) << 8) - | addr[2]) << 8 | addr[3]; -} - -bfd_vma -bfd_getl32 (addr) - register const bfd_byte *addr; -{ - return (((((bfd_vma)addr[3] << 8) | addr[2]) << 8) - | addr[1]) << 8 | addr[0]; -} - -bfd_signed_vma -bfd_getb_signed_32 (addr) - register const bfd_byte *addr; -{ - return COERCE32((((((bfd_vma)addr[0] << 8) | addr[1]) << 8) - | addr[2]) << 8 | addr[3]); -} - -bfd_signed_vma -bfd_getl_signed_32 (addr) - register const bfd_byte *addr; -{ - return COERCE32((((((bfd_vma)addr[3] << 8) | addr[2]) << 8) - | addr[1]) << 8 | addr[0]); -} - -bfd_vma -bfd_getb64 (addr) - register const bfd_byte *addr; -{ -#ifdef BFD64 - bfd_vma low, high; - - high= ((((((((addr[0]) << 8) | - addr[1]) << 8) | - addr[2]) << 8) | - addr[3]) ); - - low = (((((((((bfd_vma)addr[4]) << 8) | - addr[5]) << 8) | - addr[6]) << 8) | - addr[7])); - - return high << 32 | low; -#else - BFD_FAIL(); - return 0; -#endif -} - -bfd_vma -bfd_getl64 (addr) - register const bfd_byte *addr; -{ -#ifdef BFD64 - bfd_vma low, high; - high= (((((((addr[7] << 8) | - addr[6]) << 8) | - addr[5]) << 8) | - addr[4])); - - low = ((((((((bfd_vma)addr[3] << 8) | - addr[2]) << 8) | - addr[1]) << 8) | - addr[0]) ); - - return high << 32 | low; -#else - BFD_FAIL(); - return 0; -#endif - -} - -bfd_signed_vma -bfd_getb_signed_64 (addr) - register const bfd_byte *addr; -{ -#ifdef BFD64 - bfd_vma low, high; - - high= ((((((((addr[0]) << 8) | - addr[1]) << 8) | - addr[2]) << 8) | - addr[3]) ); - - low = (((((((((bfd_vma)addr[4]) << 8) | - addr[5]) << 8) | - addr[6]) << 8) | - addr[7])); - - return COERCE64(high << 32 | low); -#else - BFD_FAIL(); - return 0; -#endif -} - -bfd_signed_vma -bfd_getl_signed_64 (addr) - register const bfd_byte *addr; -{ -#ifdef BFD64 - bfd_vma low, high; - high= (((((((addr[7] << 8) | - addr[6]) << 8) | - addr[5]) << 8) | - addr[4])); - - low = ((((((((bfd_vma)addr[3] << 8) | - addr[2]) << 8) | - addr[1]) << 8) | - addr[0]) ); - - return COERCE64(high << 32 | low); -#else - BFD_FAIL(); - return 0; -#endif -} - -void -bfd_putb32 (data, addr) - bfd_vma data; - register bfd_byte *addr; -{ - addr[0] = (bfd_byte)(data >> 24); - addr[1] = (bfd_byte)(data >> 16); - addr[2] = (bfd_byte)(data >> 8); - addr[3] = (bfd_byte)data; -} - -void -bfd_putl32 (data, addr) - bfd_vma data; - register bfd_byte *addr; -{ - addr[0] = (bfd_byte)data; - addr[1] = (bfd_byte)(data >> 8); - addr[2] = (bfd_byte)(data >> 16); - addr[3] = (bfd_byte)(data >> 24); -} - -void -bfd_putb64 (data, addr) - bfd_vma data; - register bfd_byte *addr; -{ -#ifdef BFD64 - addr[0] = (bfd_byte)(data >> (7*8)); - addr[1] = (bfd_byte)(data >> (6*8)); - addr[2] = (bfd_byte)(data >> (5*8)); - addr[3] = (bfd_byte)(data >> (4*8)); - addr[4] = (bfd_byte)(data >> (3*8)); - addr[5] = (bfd_byte)(data >> (2*8)); - addr[6] = (bfd_byte)(data >> (1*8)); - addr[7] = (bfd_byte)(data >> (0*8)); -#else - BFD_FAIL(); -#endif -} - -void -bfd_putl64 (data, addr) - bfd_vma data; - register bfd_byte *addr; -{ -#ifdef BFD64 - addr[7] = (bfd_byte)(data >> (7*8)); - addr[6] = (bfd_byte)(data >> (6*8)); - addr[5] = (bfd_byte)(data >> (5*8)); - addr[4] = (bfd_byte)(data >> (4*8)); - addr[3] = (bfd_byte)(data >> (3*8)); - addr[2] = (bfd_byte)(data >> (2*8)); - addr[1] = (bfd_byte)(data >> (1*8)); - addr[0] = (bfd_byte)(data >> (0*8)); -#else - BFD_FAIL(); -#endif -} - -/* Default implementation */ - -boolean -_bfd_generic_get_section_contents (abfd, section, location, offset, count) - bfd *abfd; - sec_ptr section; - PTR location; - file_ptr offset; - bfd_size_type count; -{ - if (count == 0) - return true; - if ((bfd_size_type)(offset+count) > section->_raw_size - || bfd_seek(abfd, (file_ptr)(section->filepos + offset), SEEK_SET) == -1 - || bfd_read(location, (bfd_size_type)1, count, abfd) != count) - return (false); /* on error */ - return (true); -} - -boolean -_bfd_generic_get_section_contents_in_window (abfd, section, w, offset, count) - bfd *abfd; - sec_ptr section; - bfd_window *w; - file_ptr offset; - bfd_size_type count; -{ -#ifdef USE_MMAP - if (count == 0) - return true; - if (abfd->xvec->_bfd_get_section_contents != _bfd_generic_get_section_contents) - { - /* We don't know what changes the bfd's get_section_contents - method may have to make. So punt trying to map the file - window, and let get_section_contents do its thing. */ - /* @@ FIXME : If the internal window has a refcount of 1 and was - allocated with malloc instead of mmap, just reuse it. */ - bfd_free_window (w); - w->i = (bfd_window_internal *) bfd_zmalloc (sizeof (bfd_window_internal)); - if (w->i == NULL) - return false; - w->i->data = (PTR) bfd_malloc ((size_t) count); - if (w->i->data == NULL) - { - free (w->i); - w->i = NULL; - return false; - } - w->i->mapped = 0; - w->i->refcount = 1; - w->size = w->i->size = count; - w->data = w->i->data; - return bfd_get_section_contents (abfd, section, w->data, offset, count); - } - if ((bfd_size_type) (offset+count) > section->_raw_size - || (bfd_get_file_window (abfd, section->filepos + offset, count, w, true) - == false)) - return false; - return true; -#else - abort (); -#endif -} - -/* This generic function can only be used in implementations where creating - NEW sections is disallowed. It is useful in patching existing sections - in read-write files, though. See other set_section_contents functions - to see why it doesn't work for new sections. */ -boolean -_bfd_generic_set_section_contents (abfd, section, location, offset, count) - bfd *abfd; - sec_ptr section; - PTR location; - file_ptr offset; - bfd_size_type count; -{ - if (count == 0) - return true; - - if (bfd_seek (abfd, (file_ptr) (section->filepos + offset), SEEK_SET) == -1 - || bfd_write (location, (bfd_size_type) 1, count, abfd) != count) - return false; - - return true; -} - -/* -INTERNAL_FUNCTION - bfd_log2 - -SYNOPSIS - unsigned int bfd_log2(bfd_vma x); - -DESCRIPTION - Return the log base 2 of the value supplied, rounded up. E.g., an - @var{x} of 1025 returns 11. -*/ - -unsigned -bfd_log2(x) - bfd_vma x; -{ - unsigned result = 0; - while ( (bfd_vma)(1<< result) < x) - result++; - return result; -} - -boolean -bfd_generic_is_local_label (abfd, sym) - bfd *abfd; - asymbol *sym; -{ - char locals_prefix = (bfd_get_symbol_leading_char (abfd) == '_') ? 'L' : '.'; - - return (sym->name[0] == locals_prefix); -} - diff --git a/contrib/gdb/bfd/libbfd.h b/contrib/gdb/bfd/libbfd.h deleted file mode 100644 index 5cf504cdc7517..0000000000000 --- a/contrib/gdb/bfd/libbfd.h +++ /dev/null @@ -1,735 +0,0 @@ -/* libbfd.h -- Declarations used by bfd library *implementation*. - (This include file is not for users of the library.) - Copyright 1990, 91, 92, 93, 94, 95, 1996 Free Software Foundation, Inc. - Written by Cygnus Support. - -** NOTE: libbfd.h is a GENERATED file. Don't change it; instead, -** change libbfd-in.h or the other BFD source files processed to -** generate this file. - -This file is part of BFD, the Binary File Descriptor library. - -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 2 of the License, 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ - -/* Align an address upward to a boundary, expressed as a number of bytes. - E.g. align to an 8-byte boundary with argument of 8. */ -#define BFD_ALIGN(this, boundary) \ - ((( (this) + ((boundary) -1)) & (~((boundary)-1)))) - -/* If you want to read and write large blocks, you might want to do it - in quanta of this amount */ -#define DEFAULT_BUFFERSIZE 8192 - -/* Set a tdata field. Can't use the other macros for this, since they - do casts, and casting to the left of assignment isn't portable. */ -#define set_tdata(bfd, v) ((bfd)->tdata.any = (PTR) (v)) - -/* If BFD_IN_MEMORY is set for a BFD, then the iostream fields points - to an instance of this structure. */ - -struct bfd_in_memory -{ - /* Size of buffer. */ - bfd_size_type size; - /* Buffer holding contents of BFD. */ - bfd_byte *buffer; -}; - -/* tdata for an archive. For an input archive, cache - needs to be free()'d. For an output archive, symdefs do. */ - -struct artdata { - file_ptr first_file_filepos; - /* Speed up searching the armap */ - struct ar_cache *cache; - bfd *archive_head; /* Only interesting in output routines */ - carsym *symdefs; /* the symdef entries */ - symindex symdef_count; /* how many there are */ - char *extended_names; /* clever intel extension */ - /* when more compilers are standard C, this can be a time_t */ - long armap_timestamp; /* Timestamp value written into armap. - This is used for BSD archives to check - that the timestamp is recent enough - for the BSD linker to not complain, - just before we finish writing an - archive. */ - file_ptr armap_datepos; /* Position within archive to seek to - rewrite the date field. */ - PTR tdata; /* Backend specific information. */ -}; - -#define bfd_ardata(bfd) ((bfd)->tdata.aout_ar_data) - -/* Goes in bfd's arelt_data slot */ -struct areltdata { - char * arch_header; /* it's actually a string */ - unsigned int parsed_size; /* octets of filesize not including ar_hdr */ - char *filename; /* null-terminated */ -}; - -#define arelt_size(bfd) (((struct areltdata *)((bfd)->arelt_data))->parsed_size) - -extern PTR bfd_malloc PARAMS ((size_t)); -extern PTR bfd_realloc PARAMS ((PTR, size_t)); -extern PTR bfd_zmalloc PARAMS ((size_t)); - -extern bfd_error_handler_type _bfd_error_handler; - -/* These routines allocate and free things on the BFD's obstack. */ - -PTR bfd_alloc PARAMS ((bfd *abfd, size_t size)); -PTR bfd_zalloc PARAMS ((bfd *abfd, size_t size)); -void bfd_alloc_grow PARAMS ((bfd *abfd, PTR thing, size_t size)); -PTR bfd_alloc_finish PARAMS ((bfd *abfd)); -PTR bfd_alloc_by_size_t PARAMS ((bfd *abfd, size_t wanted)); - -#define bfd_release(x,y) (void) obstack_free(&(x->memory),y) - -bfd * _bfd_create_empty_archive_element_shell PARAMS ((bfd *obfd)); -bfd * _bfd_look_for_bfd_in_cache PARAMS ((bfd *arch_bfd, file_ptr index)); -boolean _bfd_add_bfd_to_archive_cache PARAMS ((bfd *, file_ptr, bfd *)); -boolean _bfd_generic_mkarchive PARAMS ((bfd *abfd)); -const bfd_target *bfd_generic_archive_p PARAMS ((bfd *abfd)); -boolean bfd_slurp_armap PARAMS ((bfd *abfd)); -boolean bfd_slurp_bsd_armap_f2 PARAMS ((bfd *abfd)); -#define bfd_slurp_bsd_armap bfd_slurp_armap -#define bfd_slurp_coff_armap bfd_slurp_armap -boolean _bfd_slurp_extended_name_table PARAMS ((bfd *abfd)); -extern boolean _bfd_construct_extended_name_table - PARAMS ((bfd *, boolean, char **, bfd_size_type *)); -boolean _bfd_write_archive_contents PARAMS ((bfd *abfd)); -boolean _bfd_compute_and_write_armap PARAMS ((bfd *, unsigned int elength)); -bfd *_bfd_get_elt_at_filepos PARAMS ((bfd *archive, file_ptr filepos)); -extern bfd *_bfd_generic_get_elt_at_index PARAMS ((bfd *, symindex)); -bfd * _bfd_new_bfd PARAMS ((void)); - -boolean bfd_false PARAMS ((bfd *ignore)); -boolean bfd_true PARAMS ((bfd *ignore)); -PTR bfd_nullvoidptr PARAMS ((bfd *ignore)); -int bfd_0 PARAMS ((bfd *ignore)); -unsigned int bfd_0u PARAMS ((bfd *ignore)); -long bfd_0l PARAMS ((bfd *ignore)); -long _bfd_n1 PARAMS ((bfd *ignore)); -void bfd_void PARAMS ((bfd *ignore)); - -bfd *_bfd_new_bfd_contained_in PARAMS ((bfd *)); -const bfd_target *_bfd_dummy_target PARAMS ((bfd *abfd)); - -void bfd_dont_truncate_arname PARAMS ((bfd *abfd, CONST char *filename, - char *hdr)); -void bfd_bsd_truncate_arname PARAMS ((bfd *abfd, CONST char *filename, - char *hdr)); -void bfd_gnu_truncate_arname PARAMS ((bfd *abfd, CONST char *filename, - char *hdr)); - -boolean bsd_write_armap PARAMS ((bfd *arch, unsigned int elength, - struct orl *map, unsigned int orl_count, int stridx)); - -boolean coff_write_armap PARAMS ((bfd *arch, unsigned int elength, - struct orl *map, unsigned int orl_count, int stridx)); - -extern PTR _bfd_generic_read_ar_hdr PARAMS ((bfd *)); - -extern PTR _bfd_generic_read_ar_hdr_mag PARAMS ((bfd *, const char *)); - -bfd * bfd_generic_openr_next_archived_file PARAMS ((bfd *archive, - bfd *last_file)); - -int bfd_generic_stat_arch_elt PARAMS ((bfd *, struct stat *)); - -#define _bfd_read_ar_hdr(abfd) \ - BFD_SEND (abfd, _bfd_read_ar_hdr_fn, (abfd)) - -/* Generic routines to use for BFD_JUMP_TABLE_GENERIC. Use - BFD_JUMP_TABLE_GENERIC (_bfd_generic). */ - -#define _bfd_generic_close_and_cleanup bfd_true -#define _bfd_generic_bfd_free_cached_info bfd_true -#define _bfd_generic_new_section_hook \ - ((boolean (*) PARAMS ((bfd *, asection *))) bfd_true) -extern boolean _bfd_generic_get_section_contents - PARAMS ((bfd *, asection *, PTR location, file_ptr offset, - bfd_size_type count)); -extern boolean _bfd_generic_get_section_contents_in_window - PARAMS ((bfd *, asection *, bfd_window *, file_ptr, bfd_size_type)); - -/* Generic routines to use for BFD_JUMP_TABLE_COPY. Use - BFD_JUMP_TABLE_COPY (_bfd_generic). */ - -#define _bfd_generic_bfd_copy_private_bfd_data \ - ((boolean (*) PARAMS ((bfd *, bfd *))) bfd_true) -#define _bfd_generic_bfd_merge_private_bfd_data \ - ((boolean (*) PARAMS ((bfd *, bfd *))) bfd_true) -#define _bfd_generic_bfd_set_private_flags \ - ((boolean (*) PARAMS ((bfd *, flagword))) bfd_true) -#define _bfd_generic_bfd_copy_private_section_data \ - ((boolean (*) PARAMS ((bfd *, asection *, bfd *, asection *))) bfd_true) -#define _bfd_generic_bfd_copy_private_symbol_data \ - ((boolean (*) PARAMS ((bfd *, asymbol *, bfd *, asymbol *))) bfd_true) -#define _bfd_generic_bfd_print_private_bfd_data \ - ((boolean (*) PARAMS ((bfd *, PTR))) bfd_true) - -/* Routines to use for BFD_JUMP_TABLE_CORE when there is no core file - support. Use BFD_JUMP_TABLE_CORE (_bfd_nocore). */ - -extern char *_bfd_nocore_core_file_failing_command PARAMS ((bfd *)); -extern int _bfd_nocore_core_file_failing_signal PARAMS ((bfd *)); -extern boolean _bfd_nocore_core_file_matches_executable_p - PARAMS ((bfd *, bfd *)); - -/* Routines to use for BFD_JUMP_TABLE_ARCHIVE when there is no archive - file support. Use BFD_JUMP_TABLE_ARCHIVE (_bfd_noarchive). */ - -#define _bfd_noarchive_slurp_armap bfd_false -#define _bfd_noarchive_slurp_extended_name_table bfd_false -#define _bfd_noarchive_construct_extended_name_table \ - ((boolean (*) PARAMS ((bfd *, char **, bfd_size_type *, const char **))) \ - bfd_false) -#define _bfd_noarchive_truncate_arname \ - ((void (*) PARAMS ((bfd *, const char *, char *))) bfd_void) -#define _bfd_noarchive_write_armap \ - ((boolean (*) \ - PARAMS ((bfd *, unsigned int, struct orl *, unsigned int, int))) \ - bfd_false) -#define _bfd_noarchive_read_ar_hdr bfd_nullvoidptr -#define _bfd_noarchive_openr_next_archived_file \ - ((bfd *(*) PARAMS ((bfd *, bfd *))) bfd_nullvoidptr) -#define _bfd_noarchive_get_elt_at_index \ - ((bfd *(*) PARAMS ((bfd *, symindex))) bfd_nullvoidptr) -#define _bfd_noarchive_generic_stat_arch_elt bfd_generic_stat_arch_elt -#define _bfd_noarchive_update_armap_timestamp bfd_false - -/* Routines to use for BFD_JUMP_TABLE_ARCHIVE to get BSD style - archives. Use BFD_JUMP_TABLE_ARCHIVE (_bfd_archive_bsd). */ - -#define _bfd_archive_bsd_slurp_armap bfd_slurp_bsd_armap -#define _bfd_archive_bsd_slurp_extended_name_table \ - _bfd_slurp_extended_name_table -extern boolean _bfd_archive_bsd_construct_extended_name_table - PARAMS ((bfd *, char **, bfd_size_type *, const char **)); -#define _bfd_archive_bsd_truncate_arname bfd_bsd_truncate_arname -#define _bfd_archive_bsd_write_armap bsd_write_armap -#define _bfd_archive_bsd_read_ar_hdr _bfd_generic_read_ar_hdr -#define _bfd_archive_bsd_openr_next_archived_file \ - bfd_generic_openr_next_archived_file -#define _bfd_archive_bsd_get_elt_at_index _bfd_generic_get_elt_at_index -#define _bfd_archive_bsd_generic_stat_arch_elt \ - bfd_generic_stat_arch_elt -extern boolean _bfd_archive_bsd_update_armap_timestamp PARAMS ((bfd *)); - -/* Routines to use for BFD_JUMP_TABLE_ARCHIVE to get COFF style - archives. Use BFD_JUMP_TABLE_ARCHIVE (_bfd_archive_coff). */ - -#define _bfd_archive_coff_slurp_armap bfd_slurp_coff_armap -#define _bfd_archive_coff_slurp_extended_name_table \ - _bfd_slurp_extended_name_table -extern boolean _bfd_archive_coff_construct_extended_name_table - PARAMS ((bfd *, char **, bfd_size_type *, const char **)); -#define _bfd_archive_coff_truncate_arname bfd_dont_truncate_arname -#define _bfd_archive_coff_write_armap coff_write_armap -#define _bfd_archive_coff_read_ar_hdr _bfd_generic_read_ar_hdr -#define _bfd_archive_coff_openr_next_archived_file \ - bfd_generic_openr_next_archived_file -#define _bfd_archive_coff_get_elt_at_index _bfd_generic_get_elt_at_index -#define _bfd_archive_coff_generic_stat_arch_elt \ - bfd_generic_stat_arch_elt -#define _bfd_archive_coff_update_armap_timestamp bfd_true - -/* Routines to use for BFD_JUMP_TABLE_SYMBOLS where there is no symbol - support. Use BFD_JUMP_TABLE_SYMBOLS (_bfd_nosymbols). */ - -#define _bfd_nosymbols_get_symtab_upper_bound _bfd_n1 -#define _bfd_nosymbols_get_symtab \ - ((long (*) PARAMS ((bfd *, asymbol **))) _bfd_n1) -#define _bfd_nosymbols_make_empty_symbol \ - ((asymbol *(*) PARAMS ((bfd *))) bfd_nullvoidptr) -#define _bfd_nosymbols_print_symbol \ - ((void (*) PARAMS ((bfd *, PTR, asymbol *, bfd_print_symbol_type))) bfd_void) -#define _bfd_nosymbols_get_symbol_info \ - ((void (*) PARAMS ((bfd *, asymbol *, symbol_info *))) bfd_void) -#define _bfd_nosymbols_bfd_is_local_label \ - ((boolean (*) PARAMS ((bfd *, asymbol *))) bfd_false) -#define _bfd_nosymbols_get_lineno \ - ((alent *(*) PARAMS ((bfd *, asymbol *))) bfd_nullvoidptr) -#define _bfd_nosymbols_find_nearest_line \ - ((boolean (*) \ - PARAMS ((bfd *, asection *, asymbol **, bfd_vma, const char **, \ - const char **, unsigned int *))) \ - bfd_false) -#define _bfd_nosymbols_bfd_make_debug_symbol \ - ((asymbol *(*) PARAMS ((bfd *, PTR, unsigned long))) bfd_nullvoidptr) -#define _bfd_nosymbols_read_minisymbols \ - ((long (*) PARAMS ((bfd *, boolean, PTR *, unsigned int *))) _bfd_n1) -#define _bfd_nosymbols_minisymbol_to_symbol \ - ((asymbol *(*) PARAMS ((bfd *, boolean, const PTR, asymbol *))) \ - bfd_nullvoidptr) - -/* Routines to use for BFD_JUMP_TABLE_RELOCS when there is no reloc - support. Use BFD_JUMP_TABLE_RELOCS (_bfd_norelocs). */ - -#define _bfd_norelocs_get_reloc_upper_bound \ - ((long (*) PARAMS ((bfd *, asection *))) _bfd_n1) -#define _bfd_norelocs_canonicalize_reloc \ - ((long (*) PARAMS ((bfd *, asection *, arelent **, asymbol **))) _bfd_n1) -#define _bfd_norelocs_bfd_reloc_type_lookup \ - ((reloc_howto_type *(*) PARAMS ((bfd *, bfd_reloc_code_real_type))) \ - bfd_nullvoidptr) - -/* Routines to use for BFD_JUMP_TABLE_WRITE for targets which may not - be written. Use BFD_JUMP_TABLE_WRITE (_bfd_nowrite). */ - -#define _bfd_nowrite_set_arch_mach \ - ((boolean (*) PARAMS ((bfd *, enum bfd_architecture, unsigned long))) \ - bfd_false) -#define _bfd_nowrite_set_section_contents \ - ((boolean (*) PARAMS ((bfd *, asection *, PTR, file_ptr, bfd_size_type))) \ - bfd_false) - -/* Generic routines to use for BFD_JUMP_TABLE_WRITE. Use - BFD_JUMP_TABLE_WRITE (_bfd_generic). */ - -#define _bfd_generic_set_arch_mach bfd_default_set_arch_mach -extern boolean _bfd_generic_set_section_contents - PARAMS ((bfd *, asection *, PTR, file_ptr, bfd_size_type)); - -/* Routines to use for BFD_JUMP_TABLE_LINK for targets which do not - support linking. Use BFD_JUMP_TABLE_LINK (_bfd_nolink). */ - -#define _bfd_nolink_sizeof_headers ((int (*) PARAMS ((bfd *, boolean))) bfd_0) -#define _bfd_nolink_bfd_get_relocated_section_contents \ - ((bfd_byte *(*) \ - PARAMS ((bfd *, struct bfd_link_info *, struct bfd_link_order *, \ - bfd_byte *, boolean, asymbol **))) \ - bfd_nullvoidptr) -#define _bfd_nolink_bfd_relax_section \ - ((boolean (*) \ - PARAMS ((bfd *, asection *, struct bfd_link_info *, boolean *))) \ - bfd_false) -#define _bfd_nolink_bfd_link_hash_table_create \ - ((struct bfd_link_hash_table *(*) PARAMS ((bfd *))) bfd_nullvoidptr) -#define _bfd_nolink_bfd_link_add_symbols \ - ((boolean (*) PARAMS ((bfd *, struct bfd_link_info *))) bfd_false) -#define _bfd_nolink_bfd_final_link \ - ((boolean (*) PARAMS ((bfd *, struct bfd_link_info *))) bfd_false) -#define _bfd_nolink_bfd_link_split_section \ - ((boolean (*) PARAMS ((bfd *, struct sec *))) bfd_false) - -/* Routines to use for BFD_JUMP_TABLE_DYNAMIC for targets which do not - have dynamic symbols or relocs. Use BFD_JUMP_TABLE_DYNAMIC - (_bfd_nodynamic). */ - -#define _bfd_nodynamic_get_dynamic_symtab_upper_bound _bfd_n1 -#define _bfd_nodynamic_canonicalize_dynamic_symtab \ - ((long (*) PARAMS ((bfd *, asymbol **))) _bfd_n1) -#define _bfd_nodynamic_get_dynamic_reloc_upper_bound _bfd_n1 -#define _bfd_nodynamic_canonicalize_dynamic_reloc \ - ((long (*) PARAMS ((bfd *, arelent **, asymbol **))) _bfd_n1) - -/* Generic routine to determine of the given symbol is a local - label. */ -extern boolean bfd_generic_is_local_label PARAMS ((bfd *, asymbol *)); - -/* Generic minisymbol routines. */ -extern long _bfd_generic_read_minisymbols - PARAMS ((bfd *, boolean, PTR *, unsigned int *)); -extern asymbol *_bfd_generic_minisymbol_to_symbol - PARAMS ((bfd *, boolean, const PTR, asymbol *)); - -/* Find the nearest line using .stab/.stabstr sections. */ -extern boolean _bfd_stab_section_find_nearest_line - PARAMS ((bfd *, asymbol **, asection *, bfd_vma, boolean *, const char **, - const char **, unsigned int *, PTR *)); - -/* A routine to create entries for a bfd_link_hash_table. */ -extern struct bfd_hash_entry *_bfd_link_hash_newfunc - PARAMS ((struct bfd_hash_entry *entry, - struct bfd_hash_table *table, - const char *string)); - -/* Initialize a bfd_link_hash_table. */ -extern boolean _bfd_link_hash_table_init - PARAMS ((struct bfd_link_hash_table *, bfd *, - struct bfd_hash_entry *(*) (struct bfd_hash_entry *, - struct bfd_hash_table *, - const char *))); - -/* Generic link hash table creation routine. */ -extern struct bfd_link_hash_table *_bfd_generic_link_hash_table_create - PARAMS ((bfd *)); - -/* Generic add symbol routine. */ -extern boolean _bfd_generic_link_add_symbols - PARAMS ((bfd *, struct bfd_link_info *)); - -/* Generic add symbol routine. This version is used by targets for - which the linker must collect constructors and destructors by name, - as the collect2 program does. */ -extern boolean _bfd_generic_link_add_symbols_collect - PARAMS ((bfd *, struct bfd_link_info *)); - -/* Generic archive add symbol routine. */ -extern boolean _bfd_generic_link_add_archive_symbols - PARAMS ((bfd *, struct bfd_link_info *, - boolean (*checkfn) (bfd *, struct bfd_link_info *, boolean *))); - -/* Forward declaration to avoid prototype errors. */ -typedef struct bfd_link_hash_entry _bfd_link_hash_entry; - -/* Generic routine to add a single symbol. */ -extern boolean _bfd_generic_link_add_one_symbol - PARAMS ((struct bfd_link_info *, bfd *, const char *name, flagword, - asection *, bfd_vma, const char *, boolean copy, - boolean constructor, struct bfd_link_hash_entry **)); - -/* Generic link routine. */ -extern boolean _bfd_generic_final_link - PARAMS ((bfd *, struct bfd_link_info *)); - -extern boolean _bfd_generic_link_split_section - PARAMS ((bfd *, struct sec *)); - -/* Generic reloc_link_order processing routine. */ -extern boolean _bfd_generic_reloc_link_order - PARAMS ((bfd *, struct bfd_link_info *, asection *, - struct bfd_link_order *)); - -/* Default link order processing routine. */ -extern boolean _bfd_default_link_order - PARAMS ((bfd *, struct bfd_link_info *, asection *, - struct bfd_link_order *)); - -/* Count the number of reloc entries in a link order list. */ -extern unsigned int _bfd_count_link_order_relocs - PARAMS ((struct bfd_link_order *)); - -/* Final link relocation routine. */ -extern bfd_reloc_status_type _bfd_final_link_relocate - PARAMS ((reloc_howto_type *, bfd *, asection *, bfd_byte *, - bfd_vma address, bfd_vma value, bfd_vma addend)); - -/* Relocate a particular location by a howto and a value. */ -extern bfd_reloc_status_type _bfd_relocate_contents - PARAMS ((reloc_howto_type *, bfd *, bfd_vma, bfd_byte *)); - -/* Create a string table. */ -extern struct bfd_strtab_hash *_bfd_stringtab_init PARAMS ((void)); - -/* Create an XCOFF .debug section style string table. */ -extern struct bfd_strtab_hash *_bfd_xcoff_stringtab_init PARAMS ((void)); - -/* Free a string table. */ -extern void _bfd_stringtab_free PARAMS ((struct bfd_strtab_hash *)); - -/* Get the size of a string table. */ -extern bfd_size_type _bfd_stringtab_size PARAMS ((struct bfd_strtab_hash *)); - -/* Add a string to a string table. */ -extern bfd_size_type _bfd_stringtab_add - PARAMS ((struct bfd_strtab_hash *, const char *, boolean hash, - boolean copy)); - -/* Write out a string table. */ -extern boolean _bfd_stringtab_emit PARAMS ((bfd *, struct bfd_strtab_hash *)); - -/* Macros to tell if bfds are read or write enabled. - - Note that bfds open for read may be scribbled into if the fd passed - to bfd_fdopenr is actually open both for read and write - simultaneously. However an output bfd will never be open for - read. Therefore sometimes you want to check bfd_read_p or - !bfd_read_p, and only sometimes bfd_write_p. -*/ - -#define bfd_read_p(abfd) ((abfd)->direction == read_direction || (abfd)->direction == both_direction) -#define bfd_write_p(abfd) ((abfd)->direction == write_direction || (abfd)->direction == both_direction) - -void bfd_assert PARAMS ((const char*,int)); - -#define BFD_ASSERT(x) \ -{ if (!(x)) bfd_assert(__FILE__,__LINE__); } - -#define BFD_FAIL() \ -{ bfd_assert(__FILE__,__LINE__); } - -FILE * bfd_cache_lookup_worker PARAMS ((bfd *)); - -extern bfd *bfd_last_cache; - -/* Now Steve, what's the story here? */ -#ifdef lint -#define itos(x) "l" -#define stoi(x) 1 -#else -#define itos(x) ((char*)(x)) -#define stoi(x) ((int)(x)) -#endif - -/* List of supported target vectors, and the default vector (if - bfd_default_vector[0] is NULL, there is no default). */ -extern const bfd_target * const bfd_target_vector[]; -extern const bfd_target * const bfd_default_vector[]; - -/* Functions shared by the ECOFF and MIPS ELF backends, which have no - other common header files. */ - -#if defined(__STDC__) || defined(ALMOST_STDC) -struct ecoff_find_line; -#endif - -extern boolean _bfd_ecoff_locate_line - PARAMS ((bfd *, asection *, bfd_vma, struct ecoff_debug_info * const, - const struct ecoff_debug_swap * const, struct ecoff_find_line *, - const char **, const char **, unsigned int *)); -extern boolean _bfd_ecoff_get_accumulated_pdr PARAMS ((PTR, bfd_byte *)); -extern boolean _bfd_ecoff_get_accumulated_sym PARAMS ((PTR, bfd_byte *)); -extern boolean _bfd_ecoff_get_accumulated_ss PARAMS ((PTR, bfd_byte *)); - -extern bfd_vma _bfd_get_gp_value PARAMS ((bfd *)); -extern void _bfd_set_gp_value PARAMS ((bfd *, bfd_vma)); - -/* And more follows */ - -void -bfd_write_bigendian_4byte_int PARAMS ((bfd *abfd, int i)); - -unsigned int -bfd_log2 PARAMS ((bfd_vma x)); - -#define BFD_CACHE_MAX_OPEN 10 -extern bfd *bfd_last_cache; - -#define bfd_cache_lookup(x) \ - ((x)==bfd_last_cache? \ - (FILE*)(bfd_last_cache->iostream): \ - bfd_cache_lookup_worker(x)) -boolean -bfd_cache_init PARAMS ((bfd *abfd)); - -boolean -bfd_cache_close PARAMS ((bfd *abfd)); - -FILE* -bfd_open_file PARAMS ((bfd *abfd)); - -FILE * -bfd_cache_lookup_worker PARAMS ((bfd *abfd)); - -#ifdef _BFD_MAKE_TABLE_bfd_reloc_code_real - -static const char *const bfd_reloc_code_real_names[] = { "@@uninitialized@@", - - "BFD_RELOC_64", - "BFD_RELOC_32", - "BFD_RELOC_26", - "BFD_RELOC_16", - "BFD_RELOC_14", - "BFD_RELOC_8", - "BFD_RELOC_64_PCREL", - "BFD_RELOC_32_PCREL", - "BFD_RELOC_24_PCREL", - "BFD_RELOC_16_PCREL", - "BFD_RELOC_12_PCREL", - "BFD_RELOC_8_PCREL", - "BFD_RELOC_32_GOT_PCREL", - "BFD_RELOC_16_GOT_PCREL", - "BFD_RELOC_8_GOT_PCREL", - "BFD_RELOC_32_GOTOFF", - "BFD_RELOC_16_GOTOFF", - "BFD_RELOC_LO16_GOTOFF", - "BFD_RELOC_HI16_GOTOFF", - "BFD_RELOC_HI16_S_GOTOFF", - "BFD_RELOC_8_GOTOFF", - "BFD_RELOC_32_PLT_PCREL", - "BFD_RELOC_24_PLT_PCREL", - "BFD_RELOC_16_PLT_PCREL", - "BFD_RELOC_8_PLT_PCREL", - "BFD_RELOC_32_PLTOFF", - "BFD_RELOC_16_PLTOFF", - "BFD_RELOC_LO16_PLTOFF", - "BFD_RELOC_HI16_PLTOFF", - "BFD_RELOC_HI16_S_PLTOFF", - "BFD_RELOC_8_PLTOFF", - "BFD_RELOC_68K_GLOB_DAT", - "BFD_RELOC_68K_JMP_SLOT", - "BFD_RELOC_68K_RELATIVE", - "BFD_RELOC_32_BASEREL", - "BFD_RELOC_16_BASEREL", - "BFD_RELOC_LO16_BASEREL", - "BFD_RELOC_HI16_BASEREL", - "BFD_RELOC_HI16_S_BASEREL", - "BFD_RELOC_8_BASEREL", - "BFD_RELOC_RVA", - "BFD_RELOC_8_FFnn", - "BFD_RELOC_32_PCREL_S2", - "BFD_RELOC_16_PCREL_S2", - "BFD_RELOC_23_PCREL_S2", - "BFD_RELOC_HI22", - "BFD_RELOC_LO10", - "BFD_RELOC_GPREL16", - "BFD_RELOC_GPREL32", - "BFD_RELOC_I960_CALLJ", - "BFD_RELOC_NONE", - "BFD_RELOC_SPARC_WDISP22", - "BFD_RELOC_SPARC22", - "BFD_RELOC_SPARC13", - "BFD_RELOC_SPARC_GOT10", - "BFD_RELOC_SPARC_GOT13", - "BFD_RELOC_SPARC_GOT22", - "BFD_RELOC_SPARC_PC10", - "BFD_RELOC_SPARC_PC22", - "BFD_RELOC_SPARC_WPLT30", - "BFD_RELOC_SPARC_COPY", - "BFD_RELOC_SPARC_GLOB_DAT", - "BFD_RELOC_SPARC_JMP_SLOT", - "BFD_RELOC_SPARC_RELATIVE", - "BFD_RELOC_SPARC_UA32", - "BFD_RELOC_SPARC_BASE13", - "BFD_RELOC_SPARC_BASE22", - "BFD_RELOC_SPARC_10", - "BFD_RELOC_SPARC_11", - "BFD_RELOC_SPARC_OLO10", - "BFD_RELOC_SPARC_HH22", - "BFD_RELOC_SPARC_HM10", - "BFD_RELOC_SPARC_LM22", - "BFD_RELOC_SPARC_PC_HH22", - "BFD_RELOC_SPARC_PC_HM10", - "BFD_RELOC_SPARC_PC_LM22", - "BFD_RELOC_SPARC_WDISP16", - "BFD_RELOC_SPARC_WDISP19", - "BFD_RELOC_SPARC_GLOB_JMP", - "BFD_RELOC_SPARC_7", - "BFD_RELOC_SPARC_6", - "BFD_RELOC_SPARC_5", - "BFD_RELOC_ALPHA_GPDISP_HI16", - "BFD_RELOC_ALPHA_GPDISP_LO16", - "BFD_RELOC_ALPHA_LITERAL", - "BFD_RELOC_ALPHA_LITUSE", - "BFD_RELOC_ALPHA_HINT", - "BFD_RELOC_MIPS_JMP", - "BFD_RELOC_HI16", - "BFD_RELOC_HI16_S", - "BFD_RELOC_LO16", - "BFD_RELOC_PCREL_HI16_S", - "BFD_RELOC_PCREL_LO16", - "BFD_RELOC_MIPS_LITERAL", - "BFD_RELOC_MIPS_GOT16", - "BFD_RELOC_MIPS_CALL16", - "BFD_RELOC_MIPS_GOT_HI16", - "BFD_RELOC_MIPS_GOT_LO16", - "BFD_RELOC_MIPS_CALL_HI16", - "BFD_RELOC_MIPS_CALL_LO16", - "BFD_RELOC_386_GOT32", - "BFD_RELOC_386_PLT32", - "BFD_RELOC_386_COPY", - "BFD_RELOC_386_GLOB_DAT", - "BFD_RELOC_386_JUMP_SLOT", - "BFD_RELOC_386_RELATIVE", - "BFD_RELOC_386_GOTOFF", - "BFD_RELOC_386_GOTPC", - "BFD_RELOC_NS32K_IMM_8", - "BFD_RELOC_NS32K_IMM_16", - "BFD_RELOC_NS32K_IMM_32", - "BFD_RELOC_NS32K_IMM_8_PCREL", - "BFD_RELOC_NS32K_IMM_16_PCREL", - "BFD_RELOC_NS32K_IMM_32_PCREL", - "BFD_RELOC_NS32K_DISP_8", - "BFD_RELOC_NS32K_DISP_16", - "BFD_RELOC_NS32K_DISP_32", - "BFD_RELOC_NS32K_DISP_8_PCREL", - "BFD_RELOC_NS32K_DISP_16_PCREL", - "BFD_RELOC_NS32K_DISP_32_PCREL", - "BFD_RELOC_PPC_B26", - "BFD_RELOC_PPC_BA26", - "BFD_RELOC_PPC_TOC16", - "BFD_RELOC_PPC_B16", - "BFD_RELOC_PPC_B16_BRTAKEN", - "BFD_RELOC_PPC_B16_BRNTAKEN", - "BFD_RELOC_PPC_BA16", - "BFD_RELOC_PPC_BA16_BRTAKEN", - "BFD_RELOC_PPC_BA16_BRNTAKEN", - "BFD_RELOC_PPC_COPY", - "BFD_RELOC_PPC_GLOB_DAT", - "BFD_RELOC_PPC_JMP_SLOT", - "BFD_RELOC_PPC_RELATIVE", - "BFD_RELOC_PPC_LOCAL24PC", - "BFD_RELOC_PPC_EMB_NADDR32", - "BFD_RELOC_PPC_EMB_NADDR16", - "BFD_RELOC_PPC_EMB_NADDR16_LO", - "BFD_RELOC_PPC_EMB_NADDR16_HI", - "BFD_RELOC_PPC_EMB_NADDR16_HA", - "BFD_RELOC_PPC_EMB_SDAI16", - "BFD_RELOC_PPC_EMB_SDA2I16", - "BFD_RELOC_PPC_EMB_SDA2REL", - "BFD_RELOC_PPC_EMB_SDA21", - "BFD_RELOC_PPC_EMB_MRKREF", - "BFD_RELOC_PPC_EMB_RELSEC16", - "BFD_RELOC_PPC_EMB_RELST_LO", - "BFD_RELOC_PPC_EMB_RELST_HI", - "BFD_RELOC_PPC_EMB_RELST_HA", - "BFD_RELOC_PPC_EMB_BIT_FLD", - "BFD_RELOC_PPC_EMB_RELSDA", - "BFD_RELOC_CTOR", - "BFD_RELOC_ARM_PCREL_BRANCH", - "BFD_RELOC_ARM_IMMEDIATE", - "BFD_RELOC_ARM_OFFSET_IMM", - "BFD_RELOC_ARM_SHIFT_IMM", - "BFD_RELOC_ARM_SWI", - "BFD_RELOC_ARM_MULTI", - "BFD_RELOC_ARM_CP_OFF_IMM", - "BFD_RELOC_ARM_ADR_IMM", - "BFD_RELOC_ARM_LDR_IMM", - "BFD_RELOC_ARM_LITERAL", - "BFD_RELOC_ARM_IN_POOL", - "@@overflow: BFD_RELOC_UNUSED@@", -}; -#endif - -reloc_howto_type * -bfd_default_reloc_type_lookup - PARAMS ((bfd *abfd, bfd_reloc_code_real_type code)); - -boolean -bfd_generic_relax_section - PARAMS ((bfd *abfd, - asection *section, - struct bfd_link_info *, - boolean *)); - -bfd_byte * - -bfd_generic_get_relocated_section_contents PARAMS ((bfd *abfd, - struct bfd_link_info *link_info, - struct bfd_link_order *link_order, - bfd_byte *data, - boolean relocateable, - asymbol **symbols)); - -extern const bfd_arch_info_type bfd_default_arch_struct; -boolean -bfd_default_set_arch_mach PARAMS ((bfd *abfd, - enum bfd_architecture arch, - unsigned long mach)); - -const bfd_arch_info_type * -bfd_default_compatible - PARAMS ((const bfd_arch_info_type *a, - const bfd_arch_info_type *b)); - -boolean -bfd_default_scan PARAMS ((const struct bfd_arch_info *info, const char *string)); - -struct elf_internal_shdr * -bfd_elf_find_section PARAMS ((bfd *abfd, char *name)); - diff --git a/contrib/gdb/bfd/libcoff-in.h b/contrib/gdb/bfd/libcoff-in.h deleted file mode 100644 index 648ed80663863..0000000000000 --- a/contrib/gdb/bfd/libcoff-in.h +++ /dev/null @@ -1,482 +0,0 @@ -/* BFD COFF object file private structure. - Copyright (C) 1990, 91, 92, 93, 94, 95, 1996 Free Software Foundation, Inc. - Written by Cygnus Support. - -** NOTE: libcoff.h is a GENERATED file. Don't change it; instead, -** change libcoff-in.h or coffcode.h. - -This file is part of BFD, the Binary File Descriptor library. - -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 2 of the License, 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ - -#include "bfdlink.h" - -/* Object file tdata; access macros */ - -#define coff_data(bfd) ((bfd)->tdata.coff_obj_data) -#define exec_hdr(bfd) (coff_data(bfd)->hdr) -#define obj_pe(bfd) (coff_data(bfd)->pe) -#define obj_symbols(bfd) (coff_data(bfd)->symbols) -#define obj_sym_filepos(bfd) (coff_data(bfd)->sym_filepos) - -#define obj_relocbase(bfd) (coff_data(bfd)->relocbase) -#define obj_raw_syments(bfd) (coff_data(bfd)->raw_syments) -#define obj_raw_syment_count(bfd) (coff_data(bfd)->raw_syment_count) -#define obj_convert(bfd) (coff_data(bfd)->conversion_table) -#define obj_conv_table_size(bfd) (coff_data(bfd)->conv_table_size) - -#define obj_coff_external_syms(bfd) (coff_data (bfd)->external_syms) -#define obj_coff_keep_syms(bfd) (coff_data (bfd)->keep_syms) -#define obj_coff_strings(bfd) (coff_data (bfd)->strings) -#define obj_coff_keep_strings(bfd) (coff_data (bfd)->keep_strings) -#define obj_coff_sym_hashes(bfd) (coff_data (bfd)->sym_hashes) - -#define obj_coff_local_toc_table(bfd) (coff_data(bfd)->local_toc_sym_map) - -/* `Tdata' information kept for COFF files. */ - -typedef struct coff_tdata -{ - struct coff_symbol_struct *symbols; /* symtab for input bfd */ - unsigned int *conversion_table; - int conv_table_size; - file_ptr sym_filepos; - - struct coff_ptr_struct *raw_syments; - unsigned int raw_syment_count; - - /* These are only valid once writing has begun */ - long int relocbase; - - /* These members communicate important constants about the symbol table - to GDB's symbol-reading code. These `constants' unfortunately vary - from coff implementation to implementation... */ - unsigned local_n_btmask; - unsigned local_n_btshft; - unsigned local_n_tmask; - unsigned local_n_tshift; - unsigned local_symesz; - unsigned local_auxesz; - unsigned local_linesz; - - /* The unswapped external symbols. May be NULL. Read by - _bfd_coff_get_external_symbols. */ - PTR external_syms; - /* If this is true, the external_syms may not be freed. */ - boolean keep_syms; - - /* The string table. May be NULL. Read by - _bfd_coff_read_string_table. */ - char *strings; - /* If this is true, the strings may not be freed. */ - boolean keep_strings; - - /* is this a PE format coff file */ - int pe; - /* Used by the COFF backend linker. */ - struct coff_link_hash_entry **sym_hashes; - - /* used by the pe linker for PowerPC */ - int *local_toc_sym_map; - - struct bfd_link_info *link_info; - - /* Used by coff_find_nearest_line. */ - PTR line_info; -} coff_data_type; - -/* Tdata for pe image files. */ -typedef struct pe_tdata -{ - coff_data_type coff; - struct internal_extra_pe_aouthdr pe_opthdr; - int dll; - int has_reloc_section; - boolean (*in_reloc_p) PARAMS((bfd *, reloc_howto_type *)); - flagword real_flags; -} pe_data_type; - -#define pe_data(bfd) ((bfd)->tdata.pe_obj_data) - -/* Tdata for XCOFF files. */ - -struct xcoff_tdata -{ - /* Basic COFF information. */ - coff_data_type coff; - - /* True if a large a.out header should be generated. */ - boolean full_aouthdr; - - /* TOC value. */ - bfd_vma toc; - - /* Index of section holding TOC. */ - int sntoc; - - /* Index of section holding entry point. */ - int snentry; - - /* .text alignment from optional header. */ - int text_align_power; - - /* .data alignment from optional header. */ - int data_align_power; - - /* modtype from optional header. */ - short modtype; - - /* cputype from optional header. */ - short cputype; - - /* maxdata from optional header. */ - bfd_size_type maxdata; - - /* maxstack from optional header. */ - bfd_size_type maxstack; - - /* Used by the XCOFF backend linker. */ - asection **csects; - unsigned long *debug_indices; - unsigned int import_file_id; -}; - -#define xcoff_data(abfd) ((abfd)->tdata.xcoff_obj_data) - -/* We take the address of the first element of a asymbol to ensure that the - * macro is only ever applied to an asymbol. */ -#define coffsymbol(asymbol) ((coff_symbol_type *)(&((asymbol)->the_bfd))) - -/* The used_by_bfd field of a section may be set to a pointer to this - structure. */ - -struct coff_section_tdata -{ - /* The relocs, swapped into COFF internal form. This may be NULL. */ - struct internal_reloc *relocs; - /* If this is true, the relocs entry may not be freed. */ - boolean keep_relocs; - /* The section contents. This may be NULL. */ - bfd_byte *contents; - /* If this is true, the contents entry may not be freed. */ - boolean keep_contents; - /* Information cached by coff_find_nearest_line. */ - bfd_vma offset; - unsigned int i; - const char *function; - int line_base; - /* Available for individual backends. */ - PTR tdata; -}; - -/* An accessor macro for the coff_section_tdata structure. */ -#define coff_section_data(abfd, sec) \ - ((struct coff_section_tdata *) (sec)->used_by_bfd) - -/* Tdata for sections in XCOFF files. This is used by the linker. */ - -struct xcoff_section_tdata -{ - /* Used for XCOFF csects created by the linker; points to the real - XCOFF section which contains this csect. */ - asection *enclosing; - /* The lineno_count field for the enclosing section, because we are - going to clobber it there. */ - unsigned int lineno_count; - /* The first and one past the last symbol indices for symbols used - by this csect. */ - unsigned long first_symndx; - unsigned long last_symndx; -}; - -/* An accessor macro the xcoff_section_tdata structure. */ -#define xcoff_section_data(abfd, sec) \ - ((struct xcoff_section_tdata *) coff_section_data ((abfd), (sec))->tdata) - -/* COFF linker hash table entries. */ - -struct coff_link_hash_entry -{ - struct bfd_link_hash_entry root; - - /* Symbol index in output file. Set to -1 initially. Set to -2 if - there is a reloc against this symbol. */ - long indx; - - /* Symbol type. */ - unsigned short type; - - /* Symbol class. */ - unsigned char class; - - /* Number of auxiliary entries. */ - char numaux; - - /* BFD to take auxiliary entries from. */ - bfd *auxbfd; - - /* Pointer to array of auxiliary entries, if any. */ - union internal_auxent *aux; -}; - -/* COFF linker hash table. */ - -struct coff_link_hash_table -{ - struct bfd_link_hash_table root; -}; - -/* Look up an entry in a COFF linker hash table. */ - -#define coff_link_hash_lookup(table, string, create, copy, follow) \ - ((struct coff_link_hash_entry *) \ - bfd_link_hash_lookup (&(table)->root, (string), (create), \ - (copy), (follow))) - -/* Traverse a COFF linker hash table. */ - -#define coff_link_hash_traverse(table, func, info) \ - (bfd_link_hash_traverse \ - (&(table)->root, \ - (boolean (*) PARAMS ((struct bfd_link_hash_entry *, PTR))) (func), \ - (info))) - -/* Get the COFF linker hash table from a link_info structure. */ - -#define coff_hash_table(p) ((struct coff_link_hash_table *) ((p)->hash)) - -/* Functions in coffgen.c. */ -extern const bfd_target *coff_object_p PARAMS ((bfd *)); -extern struct sec *coff_section_from_bfd_index PARAMS ((bfd *, int)); -extern long coff_get_symtab_upper_bound PARAMS ((bfd *)); -extern long coff_get_symtab PARAMS ((bfd *, asymbol **)); -extern int coff_count_linenumbers PARAMS ((bfd *)); -extern struct coff_symbol_struct *coff_symbol_from PARAMS ((bfd *, asymbol *)); -extern boolean coff_renumber_symbols PARAMS ((bfd *, int *)); -extern void coff_mangle_symbols PARAMS ((bfd *)); -extern boolean coff_write_symbols PARAMS ((bfd *)); -extern boolean coff_write_linenumbers PARAMS ((bfd *)); -extern alent *coff_get_lineno PARAMS ((bfd *, asymbol *)); -extern asymbol *coff_section_symbol PARAMS ((bfd *, char *)); -extern boolean _bfd_coff_get_external_symbols PARAMS ((bfd *)); -extern const char *_bfd_coff_read_string_table PARAMS ((bfd *)); -extern boolean _bfd_coff_free_symbols PARAMS ((bfd *)); -extern struct coff_ptr_struct *coff_get_normalized_symtab PARAMS ((bfd *)); -extern long coff_get_reloc_upper_bound PARAMS ((bfd *, sec_ptr)); -extern asymbol *coff_make_empty_symbol PARAMS ((bfd *)); -extern void coff_print_symbol PARAMS ((bfd *, PTR filep, asymbol *, - bfd_print_symbol_type how)); -extern void coff_get_symbol_info PARAMS ((bfd *, asymbol *, - symbol_info *ret)); -extern asymbol *coff_bfd_make_debug_symbol PARAMS ((bfd *, PTR, - unsigned long)); -extern boolean coff_find_nearest_line PARAMS ((bfd *, - asection *, - asymbol **, - bfd_vma offset, - CONST char **filename_ptr, - CONST char **functionname_ptr, - unsigned int *line_ptr)); -extern int coff_sizeof_headers PARAMS ((bfd *, boolean reloc)); -extern boolean bfd_coff_reloc16_relax_section - PARAMS ((bfd *, asection *, struct bfd_link_info *, boolean *)); -extern bfd_byte *bfd_coff_reloc16_get_relocated_section_contents - PARAMS ((bfd *, struct bfd_link_info *, struct bfd_link_order *, - bfd_byte *, boolean relocateable, asymbol **)); -extern bfd_vma bfd_coff_reloc16_get_value PARAMS ((arelent *, - struct bfd_link_info *, - asection *)); -extern void bfd_perform_slip PARAMS ((bfd *abfd, unsigned int slip, - asection *input_section, - bfd_vma val)); - -/* Functions and types in cofflink.c. */ - -#define STRING_SIZE_SIZE (4) - -/* We use a hash table to merge identical enum, struct, and union - definitions in the linker. */ - -/* Information we keep for a single element (an enum value, a - structure or union field) in the debug merge hash table. */ - -struct coff_debug_merge_element -{ - /* Next element. */ - struct coff_debug_merge_element *next; - - /* Name. */ - const char *name; - - /* Type. */ - unsigned int type; - - /* Symbol index for complex type. */ - long tagndx; -}; - -/* A linked list of debug merge entries for a given name. */ - -struct coff_debug_merge_type -{ - /* Next type with the same name. */ - struct coff_debug_merge_type *next; - - /* Class of type. */ - int class; - - /* Symbol index where this type is defined. */ - long indx; - - /* List of elements. */ - struct coff_debug_merge_element *elements; -}; - -/* Information we store in the debug merge hash table. */ - -struct coff_debug_merge_hash_entry -{ - struct bfd_hash_entry root; - - /* A list of types with this name. */ - struct coff_debug_merge_type *types; -}; - -/* The debug merge hash table. */ - -struct coff_debug_merge_hash_table -{ - struct bfd_hash_table root; -}; - -/* Initialize a COFF debug merge hash table. */ - -#define coff_debug_merge_hash_table_init(table) \ - (bfd_hash_table_init (&(table)->root, _bfd_coff_debug_merge_hash_newfunc)) - -/* Free a COFF debug merge hash table. */ - -#define coff_debug_merge_hash_table_free(table) \ - (bfd_hash_table_free (&(table)->root)) - -/* Look up an entry in a COFF debug merge hash table. */ - -#define coff_debug_merge_hash_lookup(table, string, create, copy) \ - ((struct coff_debug_merge_hash_entry *) \ - bfd_hash_lookup (&(table)->root, (string), (create), (copy))) - -/* Information we keep for each section in the output file when doing - a relocateable link. */ - -struct coff_link_section_info -{ - /* The relocs to be output. */ - struct internal_reloc *relocs; - /* For each reloc against a global symbol whose index was not known - when the reloc was handled, the global hash table entry. */ - struct coff_link_hash_entry **rel_hashes; -}; - -/* Information that we pass around while doing the final link step. */ - -struct coff_final_link_info -{ - /* General link information. */ - struct bfd_link_info *info; - /* Output BFD. */ - bfd *output_bfd; - /* Used to indicate failure in traversal routine. */ - boolean failed; - /* Hash table for long symbol names. */ - struct bfd_strtab_hash *strtab; - /* When doing a relocateable link, an array of information kept for - each output section, indexed by the target_index field. */ - struct coff_link_section_info *section_info; - /* Symbol index of last C_FILE symbol (-1 if none). */ - long last_file_index; - /* Contents of last C_FILE symbol. */ - struct internal_syment last_file; - /* Hash table used to merge debug information. */ - struct coff_debug_merge_hash_table debug_merge; - /* Buffer large enough to hold swapped symbols of any input file. */ - struct internal_syment *internal_syms; - /* Buffer large enough to hold sections of symbols of any input file. */ - asection **sec_ptrs; - /* Buffer large enough to hold output indices of symbols of any - input file. */ - long *sym_indices; - /* Buffer large enough to hold output symbols for any input file. */ - bfd_byte *outsyms; - /* Buffer large enough to hold external line numbers for any input - section. */ - bfd_byte *linenos; - /* Buffer large enough to hold any input section. */ - bfd_byte *contents; - /* Buffer large enough to hold external relocs of any input section. */ - bfd_byte *external_relocs; - /* Buffer large enough to hold swapped relocs of any input section. */ - struct internal_reloc *internal_relocs; -}; - -extern struct bfd_hash_entry *_bfd_coff_link_hash_newfunc - PARAMS ((struct bfd_hash_entry *, struct bfd_hash_table *, const char *)); -extern boolean _bfd_coff_link_hash_table_init - PARAMS ((struct coff_link_hash_table *, bfd *, - struct bfd_hash_entry *(*) (struct bfd_hash_entry *, - struct bfd_hash_table *, - const char *))); -extern struct bfd_link_hash_table *_bfd_coff_link_hash_table_create - PARAMS ((bfd *)); -extern const char *_bfd_coff_internal_syment_name - PARAMS ((bfd *, const struct internal_syment *, char *)); -extern boolean _bfd_coff_link_add_symbols - PARAMS ((bfd *, struct bfd_link_info *)); -extern boolean _bfd_coff_final_link - PARAMS ((bfd *, struct bfd_link_info *)); -extern struct internal_reloc *_bfd_coff_read_internal_relocs - PARAMS ((bfd *, asection *, boolean, bfd_byte *, boolean, - struct internal_reloc *)); -extern boolean _bfd_coff_generic_relocate_section - PARAMS ((bfd *, struct bfd_link_info *, bfd *, asection *, bfd_byte *, - struct internal_reloc *, struct internal_syment *, asection **)); - -extern struct bfd_hash_entry *_bfd_coff_debug_merge_hash_newfunc - PARAMS ((struct bfd_hash_entry *, struct bfd_hash_table *, const char *)); -extern boolean _bfd_coff_write_global_sym - PARAMS ((struct coff_link_hash_entry *, PTR)); -extern boolean _bfd_coff_link_input_bfd - PARAMS ((struct coff_final_link_info *, bfd *)); -extern boolean _bfd_coff_reloc_link_order - PARAMS ((bfd *, struct coff_final_link_info *, asection *, - struct bfd_link_order *)); - - -#define coff_get_section_contents_in_window \ - _bfd_generic_get_section_contents_in_window - -/* Functions in xcofflink.c. */ - -extern struct bfd_link_hash_table *_bfd_xcoff_bfd_link_hash_table_create - PARAMS ((bfd *)); -extern boolean _bfd_xcoff_bfd_link_add_symbols - PARAMS ((bfd *, struct bfd_link_info *)); -extern boolean _bfd_xcoff_bfd_final_link - PARAMS ((bfd *, struct bfd_link_info *)); -extern boolean _bfd_ppc_xcoff_relocate_section - PARAMS ((bfd *, struct bfd_link_info *, bfd *, asection *, bfd_byte *, - struct internal_reloc *, struct internal_syment *, asection **)); - -/* And more taken from the source .. */ - diff --git a/contrib/gdb/bfd/libcoff.h b/contrib/gdb/bfd/libcoff.h deleted file mode 100644 index daa39b52bd4ea..0000000000000 --- a/contrib/gdb/bfd/libcoff.h +++ /dev/null @@ -1,823 +0,0 @@ -/* BFD COFF object file private structure. - Copyright (C) 1990, 91, 92, 93, 94, 95, 1996 Free Software Foundation, Inc. - Written by Cygnus Support. - -** NOTE: libcoff.h is a GENERATED file. Don't change it; instead, -** change libcoff-in.h or coffcode.h. - -This file is part of BFD, the Binary File Descriptor library. - -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 2 of the License, 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ - -#include "bfdlink.h" - -/* Object file tdata; access macros */ - -#define coff_data(bfd) ((bfd)->tdata.coff_obj_data) -#define exec_hdr(bfd) (coff_data(bfd)->hdr) -#define obj_pe(bfd) (coff_data(bfd)->pe) -#define obj_symbols(bfd) (coff_data(bfd)->symbols) -#define obj_sym_filepos(bfd) (coff_data(bfd)->sym_filepos) - -#define obj_relocbase(bfd) (coff_data(bfd)->relocbase) -#define obj_raw_syments(bfd) (coff_data(bfd)->raw_syments) -#define obj_raw_syment_count(bfd) (coff_data(bfd)->raw_syment_count) -#define obj_convert(bfd) (coff_data(bfd)->conversion_table) -#define obj_conv_table_size(bfd) (coff_data(bfd)->conv_table_size) - -#define obj_coff_external_syms(bfd) (coff_data (bfd)->external_syms) -#define obj_coff_keep_syms(bfd) (coff_data (bfd)->keep_syms) -#define obj_coff_strings(bfd) (coff_data (bfd)->strings) -#define obj_coff_keep_strings(bfd) (coff_data (bfd)->keep_strings) -#define obj_coff_sym_hashes(bfd) (coff_data (bfd)->sym_hashes) - -#define obj_coff_local_toc_table(bfd) (coff_data(bfd)->local_toc_sym_map) - -/* `Tdata' information kept for COFF files. */ - -typedef struct coff_tdata -{ - struct coff_symbol_struct *symbols; /* symtab for input bfd */ - unsigned int *conversion_table; - int conv_table_size; - file_ptr sym_filepos; - - struct coff_ptr_struct *raw_syments; - unsigned int raw_syment_count; - - /* These are only valid once writing has begun */ - long int relocbase; - - /* These members communicate important constants about the symbol table - to GDB's symbol-reading code. These `constants' unfortunately vary - from coff implementation to implementation... */ - unsigned local_n_btmask; - unsigned local_n_btshft; - unsigned local_n_tmask; - unsigned local_n_tshift; - unsigned local_symesz; - unsigned local_auxesz; - unsigned local_linesz; - - /* The unswapped external symbols. May be NULL. Read by - _bfd_coff_get_external_symbols. */ - PTR external_syms; - /* If this is true, the external_syms may not be freed. */ - boolean keep_syms; - - /* The string table. May be NULL. Read by - _bfd_coff_read_string_table. */ - char *strings; - /* If this is true, the strings may not be freed. */ - boolean keep_strings; - - /* is this a PE format coff file */ - int pe; - /* Used by the COFF backend linker. */ - struct coff_link_hash_entry **sym_hashes; - - /* used by the pe linker for PowerPC */ - int *local_toc_sym_map; - - struct bfd_link_info *link_info; - - /* Used by coff_find_nearest_line. */ - PTR line_info; -} coff_data_type; - -/* Tdata for pe image files. */ -typedef struct pe_tdata -{ - coff_data_type coff; - struct internal_extra_pe_aouthdr pe_opthdr; - int dll; - int has_reloc_section; - boolean (*in_reloc_p) PARAMS((bfd *, reloc_howto_type *)); - flagword real_flags; -} pe_data_type; - -#define pe_data(bfd) ((bfd)->tdata.pe_obj_data) - -/* Tdata for XCOFF files. */ - -struct xcoff_tdata -{ - /* Basic COFF information. */ - coff_data_type coff; - - /* True if a large a.out header should be generated. */ - boolean full_aouthdr; - - /* TOC value. */ - bfd_vma toc; - - /* Index of section holding TOC. */ - int sntoc; - - /* Index of section holding entry point. */ - int snentry; - - /* .text alignment from optional header. */ - int text_align_power; - - /* .data alignment from optional header. */ - int data_align_power; - - /* modtype from optional header. */ - short modtype; - - /* cputype from optional header. */ - short cputype; - - /* maxdata from optional header. */ - bfd_size_type maxdata; - - /* maxstack from optional header. */ - bfd_size_type maxstack; - - /* Used by the XCOFF backend linker. */ - asection **csects; - unsigned long *debug_indices; - unsigned int import_file_id; -}; - -#define xcoff_data(abfd) ((abfd)->tdata.xcoff_obj_data) - -/* We take the address of the first element of a asymbol to ensure that the - * macro is only ever applied to an asymbol. */ -#define coffsymbol(asymbol) ((coff_symbol_type *)(&((asymbol)->the_bfd))) - -/* The used_by_bfd field of a section may be set to a pointer to this - structure. */ - -struct coff_section_tdata -{ - /* The relocs, swapped into COFF internal form. This may be NULL. */ - struct internal_reloc *relocs; - /* If this is true, the relocs entry may not be freed. */ - boolean keep_relocs; - /* The section contents. This may be NULL. */ - bfd_byte *contents; - /* If this is true, the contents entry may not be freed. */ - boolean keep_contents; - /* Information cached by coff_find_nearest_line. */ - bfd_vma offset; - unsigned int i; - const char *function; - int line_base; - /* Available for individual backends. */ - PTR tdata; -}; - -/* An accessor macro for the coff_section_tdata structure. */ -#define coff_section_data(abfd, sec) \ - ((struct coff_section_tdata *) (sec)->used_by_bfd) - -/* Tdata for sections in XCOFF files. This is used by the linker. */ - -struct xcoff_section_tdata -{ - /* Used for XCOFF csects created by the linker; points to the real - XCOFF section which contains this csect. */ - asection *enclosing; - /* The lineno_count field for the enclosing section, because we are - going to clobber it there. */ - unsigned int lineno_count; - /* The first and one past the last symbol indices for symbols used - by this csect. */ - unsigned long first_symndx; - unsigned long last_symndx; -}; - -/* An accessor macro the xcoff_section_tdata structure. */ -#define xcoff_section_data(abfd, sec) \ - ((struct xcoff_section_tdata *) coff_section_data ((abfd), (sec))->tdata) - -/* COFF linker hash table entries. */ - -struct coff_link_hash_entry -{ - struct bfd_link_hash_entry root; - - /* Symbol index in output file. Set to -1 initially. Set to -2 if - there is a reloc against this symbol. */ - long indx; - - /* Symbol type. */ - unsigned short type; - - /* Symbol class. */ - unsigned char class; - - /* Number of auxiliary entries. */ - char numaux; - - /* BFD to take auxiliary entries from. */ - bfd *auxbfd; - - /* Pointer to array of auxiliary entries, if any. */ - union internal_auxent *aux; -}; - -/* COFF linker hash table. */ - -struct coff_link_hash_table -{ - struct bfd_link_hash_table root; -}; - -/* Look up an entry in a COFF linker hash table. */ - -#define coff_link_hash_lookup(table, string, create, copy, follow) \ - ((struct coff_link_hash_entry *) \ - bfd_link_hash_lookup (&(table)->root, (string), (create), \ - (copy), (follow))) - -/* Traverse a COFF linker hash table. */ - -#define coff_link_hash_traverse(table, func, info) \ - (bfd_link_hash_traverse \ - (&(table)->root, \ - (boolean (*) PARAMS ((struct bfd_link_hash_entry *, PTR))) (func), \ - (info))) - -/* Get the COFF linker hash table from a link_info structure. */ - -#define coff_hash_table(p) ((struct coff_link_hash_table *) ((p)->hash)) - -/* Functions in coffgen.c. */ -extern const bfd_target *coff_object_p PARAMS ((bfd *)); -extern struct sec *coff_section_from_bfd_index PARAMS ((bfd *, int)); -extern long coff_get_symtab_upper_bound PARAMS ((bfd *)); -extern long coff_get_symtab PARAMS ((bfd *, asymbol **)); -extern int coff_count_linenumbers PARAMS ((bfd *)); -extern struct coff_symbol_struct *coff_symbol_from PARAMS ((bfd *, asymbol *)); -extern boolean coff_renumber_symbols PARAMS ((bfd *, int *)); -extern void coff_mangle_symbols PARAMS ((bfd *)); -extern boolean coff_write_symbols PARAMS ((bfd *)); -extern boolean coff_write_linenumbers PARAMS ((bfd *)); -extern alent *coff_get_lineno PARAMS ((bfd *, asymbol *)); -extern asymbol *coff_section_symbol PARAMS ((bfd *, char *)); -extern boolean _bfd_coff_get_external_symbols PARAMS ((bfd *)); -extern const char *_bfd_coff_read_string_table PARAMS ((bfd *)); -extern boolean _bfd_coff_free_symbols PARAMS ((bfd *)); -extern struct coff_ptr_struct *coff_get_normalized_symtab PARAMS ((bfd *)); -extern long coff_get_reloc_upper_bound PARAMS ((bfd *, sec_ptr)); -extern asymbol *coff_make_empty_symbol PARAMS ((bfd *)); -extern void coff_print_symbol PARAMS ((bfd *, PTR filep, asymbol *, - bfd_print_symbol_type how)); -extern void coff_get_symbol_info PARAMS ((bfd *, asymbol *, - symbol_info *ret)); -extern asymbol *coff_bfd_make_debug_symbol PARAMS ((bfd *, PTR, - unsigned long)); -extern boolean coff_find_nearest_line PARAMS ((bfd *, - asection *, - asymbol **, - bfd_vma offset, - CONST char **filename_ptr, - CONST char **functionname_ptr, - unsigned int *line_ptr)); -extern int coff_sizeof_headers PARAMS ((bfd *, boolean reloc)); -extern boolean bfd_coff_reloc16_relax_section - PARAMS ((bfd *, asection *, struct bfd_link_info *, boolean *)); -extern bfd_byte *bfd_coff_reloc16_get_relocated_section_contents - PARAMS ((bfd *, struct bfd_link_info *, struct bfd_link_order *, - bfd_byte *, boolean relocateable, asymbol **)); -extern bfd_vma bfd_coff_reloc16_get_value PARAMS ((arelent *, - struct bfd_link_info *, - asection *)); -extern void bfd_perform_slip PARAMS ((bfd *abfd, unsigned int slip, - asection *input_section, - bfd_vma val)); - -/* Functions and types in cofflink.c. */ - -#define STRING_SIZE_SIZE (4) - -/* We use a hash table to merge identical enum, struct, and union - definitions in the linker. */ - -/* Information we keep for a single element (an enum value, a - structure or union field) in the debug merge hash table. */ - -struct coff_debug_merge_element -{ - /* Next element. */ - struct coff_debug_merge_element *next; - - /* Name. */ - const char *name; - - /* Type. */ - unsigned int type; - - /* Symbol index for complex type. */ - long tagndx; -}; - -/* A linked list of debug merge entries for a given name. */ - -struct coff_debug_merge_type -{ - /* Next type with the same name. */ - struct coff_debug_merge_type *next; - - /* Class of type. */ - int class; - - /* Symbol index where this type is defined. */ - long indx; - - /* List of elements. */ - struct coff_debug_merge_element *elements; -}; - -/* Information we store in the debug merge hash table. */ - -struct coff_debug_merge_hash_entry -{ - struct bfd_hash_entry root; - - /* A list of types with this name. */ - struct coff_debug_merge_type *types; -}; - -/* The debug merge hash table. */ - -struct coff_debug_merge_hash_table -{ - struct bfd_hash_table root; -}; - -/* Initialize a COFF debug merge hash table. */ - -#define coff_debug_merge_hash_table_init(table) \ - (bfd_hash_table_init (&(table)->root, _bfd_coff_debug_merge_hash_newfunc)) - -/* Free a COFF debug merge hash table. */ - -#define coff_debug_merge_hash_table_free(table) \ - (bfd_hash_table_free (&(table)->root)) - -/* Look up an entry in a COFF debug merge hash table. */ - -#define coff_debug_merge_hash_lookup(table, string, create, copy) \ - ((struct coff_debug_merge_hash_entry *) \ - bfd_hash_lookup (&(table)->root, (string), (create), (copy))) - -/* Information we keep for each section in the output file when doing - a relocateable link. */ - -struct coff_link_section_info -{ - /* The relocs to be output. */ - struct internal_reloc *relocs; - /* For each reloc against a global symbol whose index was not known - when the reloc was handled, the global hash table entry. */ - struct coff_link_hash_entry **rel_hashes; -}; - -/* Information that we pass around while doing the final link step. */ - -struct coff_final_link_info -{ - /* General link information. */ - struct bfd_link_info *info; - /* Output BFD. */ - bfd *output_bfd; - /* Used to indicate failure in traversal routine. */ - boolean failed; - /* Hash table for long symbol names. */ - struct bfd_strtab_hash *strtab; - /* When doing a relocateable link, an array of information kept for - each output section, indexed by the target_index field. */ - struct coff_link_section_info *section_info; - /* Symbol index of last C_FILE symbol (-1 if none). */ - long last_file_index; - /* Contents of last C_FILE symbol. */ - struct internal_syment last_file; - /* Hash table used to merge debug information. */ - struct coff_debug_merge_hash_table debug_merge; - /* Buffer large enough to hold swapped symbols of any input file. */ - struct internal_syment *internal_syms; - /* Buffer large enough to hold sections of symbols of any input file. */ - asection **sec_ptrs; - /* Buffer large enough to hold output indices of symbols of any - input file. */ - long *sym_indices; - /* Buffer large enough to hold output symbols for any input file. */ - bfd_byte *outsyms; - /* Buffer large enough to hold external line numbers for any input - section. */ - bfd_byte *linenos; - /* Buffer large enough to hold any input section. */ - bfd_byte *contents; - /* Buffer large enough to hold external relocs of any input section. */ - bfd_byte *external_relocs; - /* Buffer large enough to hold swapped relocs of any input section. */ - struct internal_reloc *internal_relocs; -}; - -extern struct bfd_hash_entry *_bfd_coff_link_hash_newfunc - PARAMS ((struct bfd_hash_entry *, struct bfd_hash_table *, const char *)); -extern boolean _bfd_coff_link_hash_table_init - PARAMS ((struct coff_link_hash_table *, bfd *, - struct bfd_hash_entry *(*) (struct bfd_hash_entry *, - struct bfd_hash_table *, - const char *))); -extern struct bfd_link_hash_table *_bfd_coff_link_hash_table_create - PARAMS ((bfd *)); -extern const char *_bfd_coff_internal_syment_name - PARAMS ((bfd *, const struct internal_syment *, char *)); -extern boolean _bfd_coff_link_add_symbols - PARAMS ((bfd *, struct bfd_link_info *)); -extern boolean _bfd_coff_final_link - PARAMS ((bfd *, struct bfd_link_info *)); -extern struct internal_reloc *_bfd_coff_read_internal_relocs - PARAMS ((bfd *, asection *, boolean, bfd_byte *, boolean, - struct internal_reloc *)); -extern boolean _bfd_coff_generic_relocate_section - PARAMS ((bfd *, struct bfd_link_info *, bfd *, asection *, bfd_byte *, - struct internal_reloc *, struct internal_syment *, asection **)); - -extern struct bfd_hash_entry *_bfd_coff_debug_merge_hash_newfunc - PARAMS ((struct bfd_hash_entry *, struct bfd_hash_table *, const char *)); -extern boolean _bfd_coff_write_global_sym - PARAMS ((struct coff_link_hash_entry *, PTR)); -extern boolean _bfd_coff_link_input_bfd - PARAMS ((struct coff_final_link_info *, bfd *)); -extern boolean _bfd_coff_reloc_link_order - PARAMS ((bfd *, struct coff_final_link_info *, asection *, - struct bfd_link_order *)); - - -#define coff_get_section_contents_in_window \ - _bfd_generic_get_section_contents_in_window - -/* Functions in xcofflink.c. */ - -extern struct bfd_link_hash_table *_bfd_xcoff_bfd_link_hash_table_create - PARAMS ((bfd *)); -extern boolean _bfd_xcoff_bfd_link_add_symbols - PARAMS ((bfd *, struct bfd_link_info *)); -extern boolean _bfd_xcoff_bfd_final_link - PARAMS ((bfd *, struct bfd_link_info *)); -extern boolean _bfd_ppc_xcoff_relocate_section - PARAMS ((bfd *, struct bfd_link_info *, bfd *, asection *, bfd_byte *, - struct internal_reloc *, struct internal_syment *, asection **)); - -/* And more taken from the source .. */ - -typedef struct coff_ptr_struct -{ - - /* Remembers the offset from the first symbol in the file for - this symbol. Generated by coff_renumber_symbols. */ -unsigned int offset; - - /* Should the value of this symbol be renumbered. Used for - XCOFF C_BSTAT symbols. Set by coff_slurp_symbol_table. */ -unsigned int fix_value : 1; - - /* Should the tag field of this symbol be renumbered. - Created by coff_pointerize_aux. */ -unsigned int fix_tag : 1; - - /* Should the endidx field of this symbol be renumbered. - Created by coff_pointerize_aux. */ -unsigned int fix_end : 1; - - /* Should the x_csect.x_scnlen field be renumbered. - Created by coff_pointerize_aux. */ -unsigned int fix_scnlen : 1; - - /* Fix up an XCOFF C_BINCL/C_EINCL symbol. The value is the - index into the line number entries. Set by - coff_slurp_symbol_table. */ -unsigned int fix_line : 1; - - /* The container for the symbol structure as read and translated - from the file. */ - -union { - union internal_auxent auxent; - struct internal_syment syment; - } u; -} combined_entry_type; - - - /* Each canonical asymbol really looks like this: */ - -typedef struct coff_symbol_struct -{ - /* The actual symbol which the rest of BFD works with */ -asymbol symbol; - - /* A pointer to the hidden information for this symbol */ -combined_entry_type *native; - - /* A pointer to the linenumber information for this symbol */ -struct lineno_cache_entry *lineno; - - /* Have the line numbers been relocated yet ? */ -boolean done_lineno; -} coff_symbol_type; -typedef struct -{ - void (*_bfd_coff_swap_aux_in) PARAMS (( - bfd *abfd, - PTR ext, - int type, - int class, - int indaux, - int numaux, - PTR in)); - - void (*_bfd_coff_swap_sym_in) PARAMS (( - bfd *abfd , - PTR ext, - PTR in)); - - void (*_bfd_coff_swap_lineno_in) PARAMS (( - bfd *abfd, - PTR ext, - PTR in)); - - unsigned int (*_bfd_coff_swap_aux_out) PARAMS (( - bfd *abfd, - PTR in, - int type, - int class, - int indaux, - int numaux, - PTR ext)); - - unsigned int (*_bfd_coff_swap_sym_out) PARAMS (( - bfd *abfd, - PTR in, - PTR ext)); - - unsigned int (*_bfd_coff_swap_lineno_out) PARAMS (( - bfd *abfd, - PTR in, - PTR ext)); - - unsigned int (*_bfd_coff_swap_reloc_out) PARAMS (( - bfd *abfd, - PTR src, - PTR dst)); - - unsigned int (*_bfd_coff_swap_filehdr_out) PARAMS (( - bfd *abfd, - PTR in, - PTR out)); - - unsigned int (*_bfd_coff_swap_aouthdr_out) PARAMS (( - bfd *abfd, - PTR in, - PTR out)); - - unsigned int (*_bfd_coff_swap_scnhdr_out) PARAMS (( - bfd *abfd, - PTR in, - PTR out)); - - unsigned int _bfd_filhsz; - unsigned int _bfd_aoutsz; - unsigned int _bfd_scnhsz; - unsigned int _bfd_symesz; - unsigned int _bfd_auxesz; - unsigned int _bfd_relsz; - unsigned int _bfd_linesz; - boolean _bfd_coff_long_filenames; - void (*_bfd_coff_swap_filehdr_in) PARAMS (( - bfd *abfd, - PTR ext, - PTR in)); - void (*_bfd_coff_swap_aouthdr_in) PARAMS (( - bfd *abfd, - PTR ext, - PTR in)); - void (*_bfd_coff_swap_scnhdr_in) PARAMS (( - bfd *abfd, - PTR ext, - PTR in)); - void (*_bfd_coff_swap_reloc_in) PARAMS (( - bfd *abfd, - PTR ext, - PTR in)); - boolean (*_bfd_coff_bad_format_hook) PARAMS (( - bfd *abfd, - PTR internal_filehdr)); - boolean (*_bfd_coff_set_arch_mach_hook) PARAMS (( - bfd *abfd, - PTR internal_filehdr)); - PTR (*_bfd_coff_mkobject_hook) PARAMS (( - bfd *abfd, - PTR internal_filehdr, - PTR internal_aouthdr)); - flagword (*_bfd_styp_to_sec_flags_hook) PARAMS (( - bfd *abfd, - PTR internal_scnhdr, - const char *name)); - void (*_bfd_set_alignment_hook) PARAMS (( - bfd *abfd, - asection *sec, - PTR internal_scnhdr)); - boolean (*_bfd_coff_slurp_symbol_table) PARAMS (( - bfd *abfd)); - boolean (*_bfd_coff_symname_in_debug) PARAMS (( - bfd *abfd, - struct internal_syment *sym)); - boolean (*_bfd_coff_pointerize_aux_hook) PARAMS (( - bfd *abfd, - combined_entry_type *table_base, - combined_entry_type *symbol, - unsigned int indaux, - combined_entry_type *aux)); - boolean (*_bfd_coff_print_aux) PARAMS (( - bfd *abfd, - FILE *file, - combined_entry_type *table_base, - combined_entry_type *symbol, - combined_entry_type *aux, - unsigned int indaux)); - void (*_bfd_coff_reloc16_extra_cases) PARAMS (( - bfd *abfd, - struct bfd_link_info *link_info, - struct bfd_link_order *link_order, - arelent *reloc, - bfd_byte *data, - unsigned int *src_ptr, - unsigned int *dst_ptr)); - int (*_bfd_coff_reloc16_estimate) PARAMS (( - bfd *abfd, - asection *input_section, - arelent *r, - unsigned int shrink, - struct bfd_link_info *link_info)); - boolean (*_bfd_coff_sym_is_global) PARAMS (( - bfd *abfd, - struct internal_syment *)); - void (*_bfd_coff_compute_section_file_positions) PARAMS (( - bfd *abfd)); - boolean (*_bfd_coff_start_final_link) PARAMS (( - bfd *output_bfd, - struct bfd_link_info *info)); - boolean (*_bfd_coff_relocate_section) PARAMS (( - bfd *output_bfd, - struct bfd_link_info *info, - bfd *input_bfd, - asection *input_section, - bfd_byte *contents, - struct internal_reloc *relocs, - struct internal_syment *syms, - asection **sections)); - reloc_howto_type *(*_bfd_coff_rtype_to_howto) PARAMS (( - bfd *abfd, - asection *sec, - struct internal_reloc *rel, - struct coff_link_hash_entry *h, - struct internal_syment *sym, - bfd_vma *addendp)); - boolean (*_bfd_coff_adjust_symndx) PARAMS (( - bfd *obfd, - struct bfd_link_info *info, - bfd *ibfd, - asection *sec, - struct internal_reloc *reloc, - boolean *adjustedp)); - boolean (*_bfd_coff_link_add_one_symbol) PARAMS (( - struct bfd_link_info *info, - bfd *abfd, - const char *name, - flagword flags, - asection *section, - bfd_vma value, - const char *string, - boolean copy, - boolean collect, - struct bfd_link_hash_entry **hashp)); - -} bfd_coff_backend_data; - -#define coff_backend_info(abfd) ((bfd_coff_backend_data *) (abfd)->xvec->backend_data) - -#define bfd_coff_swap_aux_in(a,e,t,c,ind,num,i) \ - ((coff_backend_info (a)->_bfd_coff_swap_aux_in) (a,e,t,c,ind,num,i)) - -#define bfd_coff_swap_sym_in(a,e,i) \ - ((coff_backend_info (a)->_bfd_coff_swap_sym_in) (a,e,i)) - -#define bfd_coff_swap_lineno_in(a,e,i) \ - ((coff_backend_info ( a)->_bfd_coff_swap_lineno_in) (a,e,i)) - -#define bfd_coff_swap_reloc_out(abfd, i, o) \ - ((coff_backend_info (abfd)->_bfd_coff_swap_reloc_out) (abfd, i, o)) - -#define bfd_coff_swap_lineno_out(abfd, i, o) \ - ((coff_backend_info (abfd)->_bfd_coff_swap_lineno_out) (abfd, i, o)) - -#define bfd_coff_swap_aux_out(a,i,t,c,ind,num,o) \ - ((coff_backend_info (a)->_bfd_coff_swap_aux_out) (a,i,t,c,ind,num,o)) - -#define bfd_coff_swap_sym_out(abfd, i,o) \ - ((coff_backend_info (abfd)->_bfd_coff_swap_sym_out) (abfd, i, o)) - -#define bfd_coff_swap_scnhdr_out(abfd, i,o) \ - ((coff_backend_info (abfd)->_bfd_coff_swap_scnhdr_out) (abfd, i, o)) - -#define bfd_coff_swap_filehdr_out(abfd, i,o) \ - ((coff_backend_info (abfd)->_bfd_coff_swap_filehdr_out) (abfd, i, o)) - -#define bfd_coff_swap_aouthdr_out(abfd, i,o) \ - ((coff_backend_info (abfd)->_bfd_coff_swap_aouthdr_out) (abfd, i, o)) - -#define bfd_coff_filhsz(abfd) (coff_backend_info (abfd)->_bfd_filhsz) -#define bfd_coff_aoutsz(abfd) (coff_backend_info (abfd)->_bfd_aoutsz) -#define bfd_coff_scnhsz(abfd) (coff_backend_info (abfd)->_bfd_scnhsz) -#define bfd_coff_symesz(abfd) (coff_backend_info (abfd)->_bfd_symesz) -#define bfd_coff_auxesz(abfd) (coff_backend_info (abfd)->_bfd_auxesz) -#define bfd_coff_relsz(abfd) (coff_backend_info (abfd)->_bfd_relsz) -#define bfd_coff_linesz(abfd) (coff_backend_info (abfd)->_bfd_linesz) -#define bfd_coff_long_filenames(abfd) (coff_backend_info (abfd)->_bfd_coff_long_filenames) -#define bfd_coff_swap_filehdr_in(abfd, i,o) \ - ((coff_backend_info (abfd)->_bfd_coff_swap_filehdr_in) (abfd, i, o)) - -#define bfd_coff_swap_aouthdr_in(abfd, i,o) \ - ((coff_backend_info (abfd)->_bfd_coff_swap_aouthdr_in) (abfd, i, o)) - -#define bfd_coff_swap_scnhdr_in(abfd, i,o) \ - ((coff_backend_info (abfd)->_bfd_coff_swap_scnhdr_in) (abfd, i, o)) - -#define bfd_coff_swap_reloc_in(abfd, i, o) \ - ((coff_backend_info (abfd)->_bfd_coff_swap_reloc_in) (abfd, i, o)) - -#define bfd_coff_bad_format_hook(abfd, filehdr) \ - ((coff_backend_info (abfd)->_bfd_coff_bad_format_hook) (abfd, filehdr)) - -#define bfd_coff_set_arch_mach_hook(abfd, filehdr)\ - ((coff_backend_info (abfd)->_bfd_coff_set_arch_mach_hook) (abfd, filehdr)) -#define bfd_coff_mkobject_hook(abfd, filehdr, aouthdr)\ - ((coff_backend_info (abfd)->_bfd_coff_mkobject_hook) (abfd, filehdr, aouthdr)) - -#define bfd_coff_styp_to_sec_flags_hook(abfd, scnhdr, name)\ - ((coff_backend_info (abfd)->_bfd_styp_to_sec_flags_hook) (abfd, scnhdr, name)) - -#define bfd_coff_set_alignment_hook(abfd, sec, scnhdr)\ - ((coff_backend_info (abfd)->_bfd_set_alignment_hook) (abfd, sec, scnhdr)) - -#define bfd_coff_slurp_symbol_table(abfd)\ - ((coff_backend_info (abfd)->_bfd_coff_slurp_symbol_table) (abfd)) - -#define bfd_coff_symname_in_debug(abfd, sym)\ - ((coff_backend_info (abfd)->_bfd_coff_symname_in_debug) (abfd, sym)) - -#define bfd_coff_print_aux(abfd, file, base, symbol, aux, indaux)\ - ((coff_backend_info (abfd)->_bfd_coff_print_aux)\ - (abfd, file, base, symbol, aux, indaux)) - -#define bfd_coff_reloc16_extra_cases(abfd, link_info, link_order, reloc, data, src_ptr, dst_ptr)\ - ((coff_backend_info (abfd)->_bfd_coff_reloc16_extra_cases)\ - (abfd, link_info, link_order, reloc, data, src_ptr, dst_ptr)) - -#define bfd_coff_reloc16_estimate(abfd, section, reloc, shrink, link_info)\ - ((coff_backend_info (abfd)->_bfd_coff_reloc16_estimate)\ - (abfd, section, reloc, shrink, link_info)) - -#define bfd_coff_sym_is_global(abfd, sym)\ - ((coff_backend_info (abfd)->_bfd_coff_sym_is_global)\ - (abfd, sym)) - -#define bfd_coff_compute_section_file_positions(abfd)\ - ((coff_backend_info (abfd)->_bfd_coff_compute_section_file_positions)\ - (abfd)) - -#define bfd_coff_start_final_link(obfd, info)\ - ((coff_backend_info (obfd)->_bfd_coff_start_final_link)\ - (obfd, info)) -#define bfd_coff_relocate_section(obfd,info,ibfd,o,con,rel,isyms,secs)\ - ((coff_backend_info (ibfd)->_bfd_coff_relocate_section)\ - (obfd, info, ibfd, o, con, rel, isyms, secs)) -#define bfd_coff_rtype_to_howto(abfd, sec, rel, h, sym, addendp)\ - ((coff_backend_info (abfd)->_bfd_coff_rtype_to_howto)\ - (abfd, sec, rel, h, sym, addendp)) -#define bfd_coff_adjust_symndx(obfd, info, ibfd, sec, rel, adjustedp)\ - ((coff_backend_info (abfd)->_bfd_coff_adjust_symndx)\ - (obfd, info, ibfd, sec, rel, adjustedp)) -#define bfd_coff_link_add_one_symbol(info,abfd,name,flags,section,value,string,cp,coll,hashp)\ - ((coff_backend_info (abfd)->_bfd_coff_link_add_one_symbol)\ - (info, abfd, name, flags, section, value, string, cp, coll, hashp)) - diff --git a/contrib/gdb/bfd/libecoff.h b/contrib/gdb/bfd/libecoff.h deleted file mode 100644 index 169610d005096..0000000000000 --- a/contrib/gdb/bfd/libecoff.h +++ /dev/null @@ -1,352 +0,0 @@ -/* BFD ECOFF object file private structure. - Copyright (C) 1993, 1994, 1995, 1996 Free Software Foundation, Inc. - Written by Ian Lance Taylor, Cygnus Support. - -This file is part of BFD, the Binary File Descriptor library. - -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 2 of the License, 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ - -#include "bfdlink.h" - -#ifndef ECOFF_H -#include "coff/ecoff.h" -#endif - -/* This is the backend information kept for ECOFF files. This - structure is constant for a particular backend. The first element - is the COFF backend data structure, so that ECOFF targets can use - the generic COFF code. */ - -#define ecoff_backend(abfd) \ - ((struct ecoff_backend_data *) (abfd)->xvec->backend_data) - -struct ecoff_backend_data -{ - /* COFF backend information. This must be the first field. */ - bfd_coff_backend_data coff; - /* Supported architecture. */ - enum bfd_architecture arch; - /* Initial portion of armap string. */ - const char *armap_start; - /* The page boundary used to align sections in a demand-paged - executable file. E.g., 0x1000. */ - bfd_vma round; - /* True if the .rdata section is part of the text segment, as on the - Alpha. False if .rdata is part of the data segment, as on the - MIPS. */ - boolean rdata_in_text; - /* Bitsize of constructor entries. */ - unsigned int constructor_bitsize; - /* Reloc to use for constructor entries. */ - reloc_howto_type *constructor_reloc; - /* How to swap debugging information. */ - struct ecoff_debug_swap debug_swap; - /* External reloc size. */ - bfd_size_type external_reloc_size; - /* Reloc swapping functions. */ - void (*swap_reloc_in) PARAMS ((bfd *, PTR, struct internal_reloc *)); - void (*swap_reloc_out) PARAMS ((bfd *, const struct internal_reloc *, PTR)); - /* Backend reloc tweaking. */ - void (*adjust_reloc_in) PARAMS ((bfd *, const struct internal_reloc *, - arelent *)); - void (*adjust_reloc_out) PARAMS ((bfd *, const arelent *, - struct internal_reloc *)); - /* Relocate section contents while linking. */ - boolean (*relocate_section) PARAMS ((bfd *output_bfd, struct bfd_link_info *, - bfd *input_bfd, asection *input_section, - bfd_byte *contents, - PTR external_relocs)); - /* Do final adjustments to filehdr and aouthdr. */ - boolean (*adjust_headers) PARAMS ((bfd *, struct internal_filehdr *, - struct internal_aouthdr *)); - /* Read an element from an archive at a given file position. This - is needed because OSF/1 3.2 uses a weird archive format. */ - bfd *(*get_elt_at_filepos) PARAMS ((bfd *, file_ptr)); -}; - -/* This is the target specific information kept for ECOFF files. */ - -#define ecoff_data(abfd) ((abfd)->tdata.ecoff_obj_data) - -typedef struct ecoff_tdata -{ - /* The reloc file position, set by - ecoff_compute_section_file_positions. */ - file_ptr reloc_filepos; - - /* The symbol table file position, set by _bfd_ecoff_mkobject_hook. */ - file_ptr sym_filepos; - - /* The start and end of the text segment. Only valid for an - existing file, not for one we are creating. */ - unsigned long text_start; - unsigned long text_end; - - /* The cached gp value. This is used when relocating. */ - bfd_vma gp; - - /* The maximum size of objects to optimize using gp. This is - typically set by the -G option to the compiler, assembler or - linker. */ - unsigned int gp_size; - - /* The register masks. When linking, all the masks found in the - input files are combined into the masks of the output file. - These are not all used for all targets, but that's OK, because - the relevant ones are the only ones swapped in and out. */ - unsigned long gprmask; - unsigned long fprmask; - unsigned long cprmask[4]; - - /* The ECOFF symbolic debugging information. */ - struct ecoff_debug_info debug_info; - - /* The unswapped ECOFF symbolic information. */ - PTR raw_syments; - - /* The canonical BFD symbols. */ - struct ecoff_symbol_struct *canonical_symbols; - - /* A mapping from external symbol numbers to entries in the linker - hash table, used when linking. */ - struct ecoff_link_hash_entry **sym_hashes; - - /* A mapping from reloc symbol indices to sections, used when - linking. */ - asection **symndx_to_section; - - /* True if this BFD was written by the backend linker. */ - boolean linker; - - /* True if a warning that multiple global pointer values are - needed in the output binary was issued already. */ - boolean issued_multiple_gp_warning; - - /* Used by find_nearest_line entry point. The structure could be - included directly in this one, but there's no point to wasting - the memory just for the infrequently called find_nearest_line. */ - struct ecoff_find_line *find_line_info; - -} ecoff_data_type; - -/* Each canonical asymbol really looks like this. */ - -typedef struct ecoff_symbol_struct -{ - /* The actual symbol which the rest of BFD works with */ - asymbol symbol; - - /* The fdr for this symbol. */ - FDR *fdr; - - /* true if this is a local symbol rather than an external one. */ - boolean local; - - /* A pointer to the unswapped hidden information for this symbol. - This is either a struct sym_ext or a struct ext_ext, depending on - the value of the local field above. */ - PTR native; -} ecoff_symbol_type; - -/* We take the address of the first element of a asymbol to ensure that the - macro is only ever applied to an asymbol. */ -#define ecoffsymbol(asymbol) ((ecoff_symbol_type *) (&((asymbol)->the_bfd))) - -/* We need to save the index of an external symbol when we write it - out so that can set the symbol index correctly when we write out - the relocs. */ -#define ecoff_get_sym_index(symbol) ((symbol)->udata.i) -#define ecoff_set_sym_index(symbol, idx) ((symbol)->udata.i = (idx)) - -/* When generating MIPS embedded PIC code, the linker relaxes the code - to turn PC relative branches into longer code sequences when the PC - relative branch is out of range. This involves reading the relocs - in bfd_relax_section as well as in bfd_final_link, and requires the - code to keep track of which relocs have been expanded. A pointer - to this structure is put in the used_by_bfd pointer of a section to - keep track of this information. The user_by_bfd pointer will be - NULL if the information was not needed. */ - -struct ecoff_section_tdata -{ - /* The unswapped relocs for this section. These are stored in - memory so the input file does not have to be read twice. */ - PTR external_relocs; - - /* The contents of the section. These bytes may or may not be saved - in memory, but if it is this is a pointer to them. */ - bfd_byte *contents; - - /* Offset adjustments for PC relative branches. A number other than - 1 is an addend for a PC relative branch, or a switch table entry - which is the difference of two .text locations; this addend - arises because the branch or difference crosses one or more - branches which were expanded into a larger code sequence. A 1 - means that this branch was itself expanded into a larger code - sequence. 1 is not a possible offset, since all offsets must be - multiples of the instruction size, which is 4; also, the only - relocs with non-zero offsets will be PC relative branches or - switch table entries within the same object file. If this field - is NULL, no branches were expanded and no offsets are required. - Otherwise there are as many entries as there are relocs in the - section, and the entry for any reloc that is not PC relative is - zero. */ - long *offsets; - - /* When producing an executable (i.e., final, non-relocatable link) - on the Alpha, we may need to use multiple global pointer values - to span the entire .lita section. In essence, we allow each - input .lita section to have its own gp value. To support this, - we need to keep track of the gp values that we picked for each - input .lita section . */ - bfd_vma gp; -}; - -/* An accessor macro for the ecoff_section_tdata structure. */ -#define ecoff_section_data(abfd, sec) \ - ((struct ecoff_section_tdata *) (sec)->used_by_bfd) - -/* ECOFF linker hash table entries. */ - -struct ecoff_link_hash_entry -{ - struct bfd_link_hash_entry root; - /* Symbol index in output file. */ - long indx; - /* BFD that ext field value came from. */ - bfd *abfd; - /* ECOFF external symbol information. */ - EXTR esym; - /* Nonzero if this symbol has been written out. */ - char written; - /* Nonzero if this symbol was referred to as small undefined. */ - char small; -}; - -/* ECOFF linker hash table. */ - -struct ecoff_link_hash_table -{ - struct bfd_link_hash_table root; -}; - -/* Make an ECOFF object. */ -extern boolean _bfd_ecoff_mkobject PARAMS ((bfd *)); - -/* Read in the ECOFF symbolic debugging information. */ -extern boolean _bfd_ecoff_slurp_symbolic_info - PARAMS ((bfd *, asection *, struct ecoff_debug_info *)); - -/* Generic ECOFF BFD backend vectors. */ - -extern boolean _bfd_ecoff_write_object_contents PARAMS ((bfd *abfd)); -extern const bfd_target *_bfd_ecoff_archive_p PARAMS ((bfd *abfd)); - -#define _bfd_ecoff_close_and_cleanup _bfd_generic_close_and_cleanup -#define _bfd_ecoff_bfd_free_cached_info _bfd_generic_bfd_free_cached_info -extern boolean _bfd_ecoff_new_section_hook - PARAMS ((bfd *, asection *)); -extern boolean _bfd_ecoff_get_section_contents - PARAMS ((bfd *, asection *, PTR location, file_ptr, bfd_size_type)); - -#define _bfd_ecoff_bfd_link_split_section _bfd_generic_link_split_section - -extern boolean _bfd_ecoff_bfd_copy_private_bfd_data PARAMS ((bfd *, bfd *)); -#define _bfd_ecoff_bfd_copy_private_section_data \ - _bfd_generic_bfd_copy_private_section_data - -#define _bfd_ecoff_bfd_copy_private_symbol_data \ - _bfd_generic_bfd_copy_private_symbol_data - -#define _bfd_ecoff_bfd_print_private_bfd_data \ - _bfd_generic_bfd_print_private_bfd_data - -#define _bfd_ecoff_bfd_merge_private_bfd_data \ - _bfd_generic_bfd_merge_private_bfd_data - -#define _bfd_ecoff_bfd_set_private_flags _bfd_generic_bfd_set_private_flags -extern boolean _bfd_ecoff_slurp_armap PARAMS ((bfd *abfd)); -#define _bfd_ecoff_slurp_extended_name_table _bfd_slurp_extended_name_table -#define _bfd_ecoff_construct_extended_name_table \ - _bfd_archive_bsd_construct_extended_name_table -#define _bfd_ecoff_truncate_arname bfd_dont_truncate_arname -extern boolean _bfd_ecoff_write_armap - PARAMS ((bfd *, unsigned int, struct orl *, unsigned int, int)); -#define _bfd_ecoff_read_ar_hdr _bfd_generic_read_ar_hdr -#define _bfd_ecoff_openr_next_archived_file \ - bfd_generic_openr_next_archived_file -#define _bfd_ecoff_get_elt_at_index _bfd_generic_get_elt_at_index -#define _bfd_ecoff_generic_stat_arch_elt bfd_generic_stat_arch_elt -#define _bfd_ecoff_update_armap_timestamp bfd_true - -extern long _bfd_ecoff_get_symtab_upper_bound PARAMS ((bfd *abfd)); -extern long _bfd_ecoff_get_symtab PARAMS ((bfd *abfd, asymbol **alocation)); -extern asymbol *_bfd_ecoff_make_empty_symbol PARAMS ((bfd *abfd)); -extern void _bfd_ecoff_print_symbol - PARAMS ((bfd *, PTR filep, asymbol *, bfd_print_symbol_type)); -extern void _bfd_ecoff_get_symbol_info - PARAMS ((bfd *, asymbol *, symbol_info *)); -extern boolean _bfd_ecoff_bfd_is_local_label - PARAMS ((bfd *, asymbol *)); -#define _bfd_ecoff_get_lineno _bfd_nosymbols_get_lineno -extern boolean _bfd_ecoff_find_nearest_line - PARAMS ((bfd *, asection *, asymbol **, bfd_vma offset, - const char **filename_ptr, const char **fnname_ptr, - unsigned int *retline_ptr)); -#define _bfd_ecoff_bfd_make_debug_symbol _bfd_nosymbols_bfd_make_debug_symbol -#define _bfd_ecoff_read_minisymbols _bfd_generic_read_minisymbols -#define _bfd_ecoff_minisymbol_to_symbol _bfd_generic_minisymbol_to_symbol - -#define _bfd_ecoff_get_reloc_upper_bound coff_get_reloc_upper_bound -extern long _bfd_ecoff_canonicalize_reloc - PARAMS ((bfd *, asection *, arelent **, asymbol **symbols)); -/* ecoff_bfd_reloc_type_lookup defined by backend. */ - -extern boolean _bfd_ecoff_set_arch_mach - PARAMS ((bfd *, enum bfd_architecture, unsigned long machine)); -extern boolean _bfd_ecoff_set_section_contents - PARAMS ((bfd *, asection *, PTR location, file_ptr, bfd_size_type)); - -extern int _bfd_ecoff_sizeof_headers PARAMS ((bfd *abfd, boolean reloc)); -/* ecoff_bfd_get_relocated_section_contents defined by backend. */ -/* ecoff_bfd_relax_section defined by backend. */ -extern struct bfd_link_hash_table *_bfd_ecoff_bfd_link_hash_table_create - PARAMS ((bfd *)); -extern boolean _bfd_ecoff_bfd_link_add_symbols - PARAMS ((bfd *, struct bfd_link_info *)); -extern boolean _bfd_ecoff_bfd_final_link - PARAMS ((bfd *, struct bfd_link_info *)); - -/* Hook functions for the generic COFF section reading code. */ - -extern PTR _bfd_ecoff_mkobject_hook PARAMS ((bfd *, PTR filehdr, PTR aouthdr)); -#define _bfd_ecoff_set_alignment_hook \ - ((void (*) PARAMS ((bfd *, asection *, PTR))) bfd_void) -extern boolean _bfd_ecoff_set_arch_mach_hook PARAMS ((bfd *abfd, PTR filehdr)); -extern flagword _bfd_ecoff_styp_to_sec_flags - PARAMS ((bfd *abfd, PTR hdr, const char *name)); -extern boolean _bfd_ecoff_slurp_symbol_table PARAMS ((bfd *abfd)); - -/* ECOFF auxiliary information swapping routines. These are the same - for all ECOFF targets, so they are defined in ecofflink.c. */ - -extern void _bfd_ecoff_swap_tir_in - PARAMS ((int, const struct tir_ext *, TIR *)); -extern void _bfd_ecoff_swap_tir_out - PARAMS ((int, const TIR *, struct tir_ext *)); -extern void _bfd_ecoff_swap_rndx_in - PARAMS ((int, const struct rndx_ext *, RNDXR *)); -extern void _bfd_ecoff_swap_rndx_out - PARAMS ((int, const RNDXR *, struct rndx_ext *)); diff --git a/contrib/gdb/bfd/libhppa.h b/contrib/gdb/bfd/libhppa.h deleted file mode 100644 index fa97b68821fdc..0000000000000 --- a/contrib/gdb/bfd/libhppa.h +++ /dev/null @@ -1,549 +0,0 @@ -/* HP PA-RISC SOM object file format: definitions internal to BFD. - Copyright (C) 1990, 91, 92, 93, 94 Free Software Foundation, Inc. - - Contributed by the Center for Software Science at the - University of Utah (pa-gdb-bugs@cs.utah.edu). - - This file is part of BFD, the Binary File Descriptor library. - - 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 2 of the License, 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ - -#ifndef _HPPA_H -#define _HPPA_H - -#define BYTES_IN_WORD 4 -#define PA_PAGESIZE 0x1000 - -#ifndef INLINE -#ifdef __GNUC__ -#define INLINE inline -#else -#define INLINE -#endif /* GNU C? */ -#endif /* INLINE */ - -/* The PA instruction set variants. */ -enum pa_arch {pa10 = 10, pa11 = 11, pa20 = 20}; - -/* HP PA-RISC relocation types */ - -enum hppa_reloc_field_selector_type - { - R_HPPA_FSEL = 0x0, - R_HPPA_LSSEL = 0x1, - R_HPPA_RSSEL = 0x2, - R_HPPA_LSEL = 0x3, - R_HPPA_RSEL = 0x4, - R_HPPA_LDSEL = 0x5, - R_HPPA_RDSEL = 0x6, - R_HPPA_LRSEL = 0x7, - R_HPPA_RRSEL = 0x8, - R_HPPA_NSEL = 0x9, - R_HPPA_NLSEL = 0xa, - R_HPPA_NLRSEL = 0xb, - R_HPPA_PSEL = 0xc, - R_HPPA_LPSEL = 0xd, - R_HPPA_RPSEL = 0xe, - R_HPPA_TSEL = 0xf, - R_HPPA_LTSEL = 0x10, - R_HPPA_RTSEL = 0x11 - }; - -/* /usr/include/reloc.h defines these to constants. We want to use - them in enums, so #undef them before we start using them. We might - be able to fix this another way by simply managing not to include - /usr/include/reloc.h, but currently GDB picks up these defines - somewhere. */ -#undef e_fsel -#undef e_lssel -#undef e_rssel -#undef e_lsel -#undef e_rsel -#undef e_ldsel -#undef e_rdsel -#undef e_lrsel -#undef e_rrsel -#undef e_nsel -#undef e_nlsel -#undef e_nlrsel -#undef e_psel -#undef e_lpsel -#undef e_rpsel -#undef e_tsel -#undef e_ltsel -#undef e_rtsel -#undef e_one -#undef e_two -#undef e_pcrel -#undef e_con -#undef e_plabel -#undef e_abs - -/* for compatibility */ -enum hppa_reloc_field_selector_type_alt - { - e_fsel = R_HPPA_FSEL, - e_lssel = R_HPPA_LSSEL, - e_rssel = R_HPPA_RSSEL, - e_lsel = R_HPPA_LSEL, - e_rsel = R_HPPA_RSEL, - e_ldsel = R_HPPA_LDSEL, - e_rdsel = R_HPPA_RDSEL, - e_lrsel = R_HPPA_LRSEL, - e_rrsel = R_HPPA_RRSEL, - e_nsel = R_HPPA_NSEL, - e_nlsel = R_HPPA_NLSEL, - e_nlrsel = R_HPPA_NLRSEL, - e_psel = R_HPPA_PSEL, - e_lpsel = R_HPPA_LPSEL, - e_rpsel = R_HPPA_RPSEL, - e_tsel = R_HPPA_TSEL, - e_ltsel = R_HPPA_LTSEL, - e_rtsel = R_HPPA_RTSEL - }; - -enum hppa_reloc_expr_type - { - R_HPPA_E_ONE = 0, - R_HPPA_E_TWO = 1, - R_HPPA_E_PCREL = 2, - R_HPPA_E_CON = 3, - R_HPPA_E_PLABEL = 7, - R_HPPA_E_ABS = 18 - }; - -/* for compatibility */ -enum hppa_reloc_expr_type_alt - { - e_one = R_HPPA_E_ONE, - e_two = R_HPPA_E_TWO, - e_pcrel = R_HPPA_E_PCREL, - e_con = R_HPPA_E_CON, - e_plabel = R_HPPA_E_PLABEL, - e_abs = R_HPPA_E_ABS - }; - - -/* Relocations for function calls must be accompanied by parameter - relocation bits. These bits describe exactly where the caller has - placed the function's arguments and where it expects to find a return - value. - - Both ELF and SOM encode this information within the addend field - of the call relocation. (Note this could break very badly if one - was to make a call like bl foo + 0x12345678). - - The high order 10 bits contain parameter relocation information, - the low order 22 bits contain the constant offset. */ - -#define HPPA_R_ARG_RELOC(a) (((a) >> 22) & 0x3FF) -#define HPPA_R_CONSTANT(a) ((((int)(a)) << 10) >> 10) -#define HPPA_R_ADDEND(r,c) (((r) << 22) + ((c) & 0x3FFFFF)) - -/* Some functions to manipulate PA instructions. */ -static INLINE unsigned int -assemble_3 (x) - unsigned int x; -{ - return (((x & 1) << 2) | ((x & 6) >> 1)) & 7; -} - -static INLINE void -dis_assemble_3 (x, r) - unsigned int x; - unsigned int *r; -{ - *r = (((x & 4) >> 2) | ((x & 3) << 1)) & 7; -} - -static INLINE unsigned int -assemble_12 (x, y) - unsigned int x, y; -{ - return (((y & 1) << 11) | ((x & 1) << 10) | ((x & 0x7fe) >> 1)) & 0xfff; -} - -static INLINE void -dis_assemble_12 (as12, x, y) - unsigned int as12; - unsigned int *x, *y; -{ - *y = (as12 & 0x800) >> 11; - *x = ((as12 & 0x3ff) << 1) | ((as12 & 0x400) >> 10); -} - -static INLINE unsigned long -assemble_17 (x, y, z) - unsigned int x, y, z; -{ - unsigned long temp; - - temp = ((z & 1) << 16) | - ((x & 0x1f) << 11) | - ((y & 1) << 10) | - ((y & 0x7fe) >> 1); - return temp & 0x1ffff; -} - -static INLINE void -dis_assemble_17 (as17, x, y, z) - unsigned int as17; - unsigned int *x, *y, *z; -{ - - *z = (as17 & 0x10000) >> 16; - *x = (as17 & 0x0f800) >> 11; - *y = (((as17 & 0x00400) >> 10) | ((as17 & 0x3ff) << 1)) & 0x7ff; -} - -static INLINE unsigned long -assemble_21 (x) - unsigned int x; -{ - unsigned long temp; - - temp = ((x & 1) << 20) | - ((x & 0xffe) << 8) | - ((x & 0xc000) >> 7) | - ((x & 0x1f0000) >> 14) | - ((x & 0x003000) >> 12); - return temp & 0x1fffff; -} - -static INLINE void -dis_assemble_21 (as21, x) - unsigned int as21, *x; -{ - unsigned long temp; - - - temp = (as21 & 0x100000) >> 20; - temp |= (as21 & 0x0ffe00) >> 8; - temp |= (as21 & 0x000180) << 7; - temp |= (as21 & 0x00007c) << 14; - temp |= (as21 & 0x000003) << 12; - *x = temp; -} - -static INLINE unsigned long -sign_extend (x, len) - unsigned int x, len; -{ - return (int)(x >> (len - 1) ? (-1 << len) | x : x); -} - -static INLINE unsigned int -ones (n) - int n; -{ - unsigned int len_ones; - int i; - - i = 0; - len_ones = 0; - while (i < n) - { - len_ones = (len_ones << 1) | 1; - i++; - } - - return len_ones; -} - -static INLINE void -sign_unext (x, len, result) - unsigned int x, len; - unsigned int *result; -{ - unsigned int len_ones; - - len_ones = ones (len); - - *result = x & len_ones; -} - -static INLINE unsigned long -low_sign_extend (x, len) - unsigned int x, len; -{ - return (int)((x & 0x1 ? (-1 << (len - 1)) : 0) | x >> 1); -} - -static INLINE void -low_sign_unext (x, len, result) - unsigned int x, len; - unsigned int *result; -{ - unsigned int temp; - unsigned int sign; - unsigned int rest; - unsigned int one_bit_at_len; - unsigned int len_ones; - - len_ones = ones (len); - one_bit_at_len = 1 << (len - 1); - - sign_unext (x, len, &temp); - sign = temp & one_bit_at_len; - sign >>= (len - 1); - - rest = temp & (len_ones ^ one_bit_at_len); - rest <<= 1; - - *result = rest | sign; -} - -/* Handle field selectors for PA instructions. */ - -static INLINE unsigned long -hppa_field_adjust (value, constant_value, r_field) - unsigned long value; - unsigned long constant_value; - unsigned short r_field; -{ - switch (r_field) - { - case e_fsel: /* F : no change */ - case e_nsel: /* N : no change */ - value += constant_value; - break; - - case e_lssel: /* LS : if (bit 21) then add 0x800 - arithmetic shift right 11 bits */ - value += constant_value; - if (value & 0x00000400) - value += 0x800; - value = (value & 0xfffff800) >> 11; - break; - - case e_rssel: /* RS : Sign extend from bit 21 */ - value += constant_value; - if (value & 0x00000400) - value |= 0xfffff800; - else - value &= 0x7ff; - break; - - case e_lsel: /* L : Arithmetic shift right 11 bits */ - case e_nlsel: /* NL : Arithmetic shift right 11 bits */ - value += constant_value; - value = (value & 0xfffff800) >> 11; - break; - - case e_rsel: /* R : Set bits 0-20 to zero */ - value += constant_value; - value = value & 0x7ff; - break; - - case e_ldsel: /* LD : Add 0x800, arithmetic shift - right 11 bits */ - value += constant_value; - value += 0x800; - value = (value & 0xfffff800) >> 11; - break; - - case e_rdsel: /* RD : Set bits 0-20 to one */ - value += constant_value; - value |= 0xfffff800; - break; - - case e_lrsel: /* LR : L with "rounded" constant */ - case e_nlrsel: /* NLR : NL with "rounded" constant */ - value = value + ((constant_value + 0x1000) & 0xffffe000); - value = (value & 0xfffff800) >> 11; - break; - - case e_rrsel: /* RR : R with "rounded" constant */ - value = value + ((constant_value + 0x1000) & 0xffffe000); - value = (value & 0x7ff) + constant_value - ((constant_value + 0x1000) & 0xffffe000); - break; - - default: - abort (); - } - return value; - -} - -/* PA-RISC OPCODES */ -#define get_opcode(insn) ((insn) & 0xfc000000) >> 26 - -/* FIXME: this list is incomplete. It should also be an enumerated - type rather than #defines. */ - -#define LDO 0x0d -#define LDB 0x10 -#define LDH 0x11 -#define LDW 0x12 -#define LDWM 0x13 -#define STB 0x18 -#define STH 0x19 -#define STW 0x1a -#define STWM 0x1b -#define COMICLR 0x24 -#define SUBI 0x25 -#define SUBIO 0x25 -#define ADDIT 0x2c -#define ADDITO 0x2c -#define ADDI 0x2d -#define ADDIO 0x2d -#define LDIL 0x08 -#define ADDIL 0x0a - -#define MOVB 0x32 -#define MOVIB 0x33 -#define COMBT 0x20 -#define COMBF 0x22 -#define COMIBT 0x21 -#define COMIBF 0x23 -#define ADDBT 0x28 -#define ADDBF 0x2a -#define ADDIBT 0x29 -#define ADDIBF 0x2b -#define BVB 0x30 -#define BB 0x31 - -#define BL 0x3a -#define BLE 0x39 -#define BE 0x38 - - -/* Given a machine instruction, return its format. - - FIXME: opcodes which do not map to a known format - should return an error of some sort. */ - -static INLINE char -bfd_hppa_insn2fmt (insn) - unsigned long insn; -{ - char fmt = -1; - unsigned char op = get_opcode (insn); - - switch (op) - { - case ADDI: - case ADDIT: - case SUBI: - fmt = 11; - break; - case MOVB: - case MOVIB: - case COMBT: - case COMBF: - case COMIBT: - case COMIBF: - case ADDBT: - case ADDBF: - case ADDIBT: - case ADDIBF: - case BVB: - case BB: - fmt = 12; - break; - case LDO: - case LDB: - case LDH: - case LDW: - case LDWM: - case STB: - case STH: - case STW: - case STWM: - fmt = 14; - break; - case BL: - case BE: - case BLE: - fmt = 17; - break; - case LDIL: - case ADDIL: - fmt = 21; - break; - default: - fmt = 32; - break; - } - return fmt; -} - - -/* Insert VALUE into INSN using R_FORMAT to determine exactly what - bits to change. */ - -static INLINE unsigned long -hppa_rebuild_insn (abfd, insn, value, r_format) - bfd *abfd; - unsigned long insn; - unsigned long value; - unsigned long r_format; -{ - unsigned long const_part; - unsigned long rebuilt_part; - - switch (r_format) - { - case 11: - { - unsigned w1, w; - - const_part = insn & 0xffffe002; - dis_assemble_12 (value, &w1, &w); - rebuilt_part = (w1 << 2) | w; - return const_part | rebuilt_part; - } - - case 12: - { - unsigned w1, w; - - const_part = insn & 0xffffe002; - dis_assemble_12 (value, &w1, &w); - rebuilt_part = (w1 << 2) | w; - return const_part | rebuilt_part; - } - - case 14: - const_part = insn & 0xffffc000; - low_sign_unext (value, 14, &rebuilt_part); - return const_part | rebuilt_part; - - case 17: - { - unsigned w1, w2, w; - - const_part = insn & 0xffe0e002; - dis_assemble_17 (value, &w1, &w2, &w); - rebuilt_part = (w2 << 2) | (w1 << 16) | w; - return const_part | rebuilt_part; - } - - case 21: - const_part = insn & 0xffe00000; - dis_assemble_21 (value, &rebuilt_part); - return const_part | rebuilt_part; - - case 32: - const_part = 0; - return value; - - default: - abort (); - } - return insn; -} - -#endif /* _HPPA_H */ diff --git a/contrib/gdb/bfd/libieee.h b/contrib/gdb/bfd/libieee.h deleted file mode 100644 index c3729cbf51770..0000000000000 --- a/contrib/gdb/bfd/libieee.h +++ /dev/null @@ -1,135 +0,0 @@ -/* IEEE-695 object file formats: definitions internal to BFD. - Copyright (C) 1990, 91, 92, 93, 94 Free Software Foundation, Inc. - Written by Cygnus Support. Mostly Steve Chamberlain's fault. - -This file is part of BFD, the Binary File Descriptor library. - -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 2 of the License, 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ - -typedef struct { - unsigned int index:24; - char letter; -} ieee_symbol_index_type; - -typedef struct ct { - bfd *this; - struct ct *next; -} bfd_chain_type; - -typedef struct ieee_symbol -{ - asymbol symbol; - struct ieee_symbol *next; - - unsigned int index; -} ieee_symbol_type; - - -typedef struct ieee_reloc { - arelent relent; - struct ieee_reloc *next; - ieee_symbol_index_type symbol; - -} ieee_reloc_type; - -#define ieee_symbol(x) ((ieee_symbol_type *)(x)) - -typedef struct ieee_per_section -{ - asection *section; - bfd_byte *data; - bfd_vma offset; - bfd_vma pc; - /* For output */ - file_ptr current_pos; - unsigned int current_byte; - boolean initialized; - ieee_reloc_type **reloc_tail_ptr; -} ieee_per_section_type; - -#define ieee_per_section(x) ((ieee_per_section_type *)((x)->used_by_bfd)) -/* FIXME! There should be no limit to the number of sections! */ -#define NSECTIONS 20 - - -typedef struct { - unsigned char *input_p; - unsigned char *first_byte; - bfd *abfd; -} common_header_type ; - -typedef struct ieee_data_struct -{ - common_header_type h; - boolean read_symbols; - boolean read_data; - file_ptr output_cursor; - /* Map of section indexes to section ptrs */ - asection * section_table[NSECTIONS]; - ieee_address_descriptor_type ad; - ieee_module_begin_type mb; - ieee_w_variable_type w; - - unsigned int section_count; - - unsigned int map_idx; - /* List of GLOBAL EXPORT symbols */ - ieee_symbol_type *external_symbols; - /* List of UNDEFINED symbols */ - ieee_symbol_type *external_reference; - - /* When the symbols have been canonicalized, they are in a - * special order, we remember various bases here.. */ - unsigned int external_symbol_max_index; - unsigned int external_symbol_min_index; - unsigned int external_symbol_count; - int external_symbol_base_offset; - - unsigned int external_reference_max_index; - unsigned int external_reference_min_index; - unsigned int external_reference_count; - int external_reference_base_offset; - - - boolean symbol_table_full; - - -boolean done_debug; - - -bfd_chain_type *chain_head; -bfd_chain_type *chain_root; - -} ieee_data_type; - -typedef struct { - file_ptr file_offset; - bfd *abfd; -} ieee_ar_obstack_type; - -typedef struct ieee_ar_data_struct -{ - common_header_type h; - ieee_ar_obstack_type *elements; - - unsigned int element_index ; - unsigned int element_count; - -} ieee_ar_data_type; - -#define IEEE_DATA(abfd) ((abfd)->tdata.ieee_data) -#define IEEE_AR_DATA(abfd) ((abfd)->tdata.ieee_ar_data) - -#define ptr(abfd) (ieee_data(abfd)->input_p) diff --git a/contrib/gdb/bfd/libnlm.h b/contrib/gdb/bfd/libnlm.h deleted file mode 100644 index 12d2e4e0cf8a0..0000000000000 --- a/contrib/gdb/bfd/libnlm.h +++ /dev/null @@ -1,264 +0,0 @@ -/* BFD back-end data structures for NLM (NetWare Loadable Modules) files. - Copyright (C) 1993 Free Software Foundation, Inc. - Written by Cygnus Support. - -This file is part of BFD, the Binary File Descriptor library. - -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 2 of the License, 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ - -#ifndef _LIBNLM_H_ -#define _LIBNLM_H_ 1 - -#ifdef ARCH_SIZE -# define NLM_ARCH_SIZE ARCH_SIZE -#endif -#include "nlm/common.h" -#include "nlm/internal.h" -#include "nlm/external.h" - -/* A reloc for an imported NLM symbol. Normal relocs are associated - with sections, and include a symbol. These relocs are associated - with (undefined) symbols, and include a section. */ - -struct nlm_relent -{ - /* Section of reloc. */ - asection *section; - /* Reloc info (sym_ptr_ptr field set only when canonicalized). */ - arelent reloc; -}; - -/* Information we keep for an NLM symbol. */ - -typedef struct -{ - /* BFD symbol. */ - asymbol symbol; - /* Number of reloc entries for imported symbol. */ - bfd_size_type rcnt; - /* Array of reloc information for imported symbol. */ - struct nlm_relent *relocs; -} nlmNAME(symbol_type); - -extern boolean nlm_mkobject PARAMS ((bfd *)); -extern boolean nlm_set_arch_mach PARAMS ((bfd *, enum bfd_architecture, - unsigned long)); - -extern void nlmNAME(get_symbol_info) - PARAMS ((bfd *, asymbol *, symbol_info *)); -extern long nlmNAME(get_symtab_upper_bound) - PARAMS ((bfd *)); -extern long nlmNAME(get_symtab) - PARAMS ((bfd *, asymbol **)); -extern asymbol *nlmNAME(make_empty_symbol) - PARAMS ((bfd *)); -extern void nlmNAME(print_symbol) - PARAMS ((bfd *, PTR, asymbol *, bfd_print_symbol_type)); -extern long nlmNAME(get_reloc_upper_bound) - PARAMS ((bfd *, asection *)); -extern long nlmNAME(canonicalize_reloc) - PARAMS ((bfd *, asection *, arelent **, asymbol **)); -extern const bfd_target *nlmNAME(object_p) - PARAMS ((bfd *)); -extern boolean nlmNAME(set_arch_mach) - PARAMS ((bfd *, enum bfd_architecture, unsigned long)); -extern boolean nlmNAME(set_section_contents) - PARAMS ((bfd *, asection *, PTR, file_ptr, bfd_size_type)); -extern boolean nlmNAME(write_object_contents) - PARAMS ((bfd *)); - -/* Some private data is stashed away for future use using the tdata pointer - in the bfd structure. */ - -struct nlm_obj_tdata -{ - /* Actual data, but ref like ptr */ - Nlm_Internal_Fixed_Header nlm_fixed_hdr[1]; - Nlm_Internal_Variable_Header nlm_variable_hdr[1]; - Nlm_Internal_Version_Header nlm_version_hdr[1]; - Nlm_Internal_Copyright_Header nlm_copyright_hdr[1]; - Nlm_Internal_Extended_Header nlm_extended_hdr[1]; - Nlm_Internal_Custom_Header nlm_custom_hdr[1]; - Nlm_Internal_Cygnus_Ext_Header nlm_cygnus_ext_hdr[1]; - /* BFD NLM symbols. */ - nlmNAME(symbol_type) *nlm_symbols; - /* Lowest text and data VMA values. */ - bfd_vma nlm_text_low; - bfd_vma nlm_data_low; - /* Caches for data read from object file. */ - arelent * nlm_reloc_fixups; - asection ** nlm_reloc_fixup_secs; - /* Backend specific information. This should probably be a pointer, - but that would require yet another entry point to initialize the - structure. */ - union - { - struct /* Alpha backend information. */ - { - bfd_vma gp; /* GP value. */ - bfd_vma lita_address; /* .lita section address. */ - bfd_size_type lita_size; /* .lita section size. */ - } - alpha_backend_data; - } - backend_data; -}; - -#define nlm_tdata(bfd) ((bfd) -> tdata.nlm_obj_data) -#define nlm_fixed_header(bfd) (nlm_tdata(bfd) -> nlm_fixed_hdr) -#define nlm_variable_header(bfd) (nlm_tdata(bfd) -> nlm_variable_hdr) -#define nlm_version_header(bfd) (nlm_tdata(bfd) -> nlm_version_hdr) -#define nlm_copyright_header(bfd) (nlm_tdata(bfd) -> nlm_copyright_hdr) -#define nlm_extended_header(bfd) (nlm_tdata(bfd) -> nlm_extended_hdr) -#define nlm_custom_header(bfd) (nlm_tdata(bfd) -> nlm_custom_hdr) -#define nlm_cygnus_ext_header(bfd) (nlm_tdata(bfd) -> nlm_cygnus_ext_hdr) -#define nlm_get_symbols(bfd) (nlm_tdata(bfd) -> nlm_symbols) -#define nlm_set_symbols(bfd, p) (nlm_tdata(bfd) -> nlm_symbols = (p)) -#define nlm_set_text_low(bfd, i) (nlm_tdata(bfd) -> nlm_text_low = (i)) -#define nlm_get_text_low(bfd) (nlm_tdata(bfd) -> nlm_text_low) -#define nlm_set_data_low(bfd, i) (nlm_tdata(bfd) -> nlm_data_low = (i)) -#define nlm_get_data_low(bfd) (nlm_tdata(bfd) -> nlm_data_low) -#define nlm_relocation_fixups(bfd) (nlm_tdata(bfd) -> nlm_reloc_fixups) -#define nlm_relocation_fixup_secs(bfd) (nlm_tdata(bfd)->nlm_reloc_fixup_secs) - -#define nlm_alpha_backend_data(bfd) \ - (&nlm_tdata (bfd)->backend_data.alpha_backend_data) - -/* This is used when writing out the external relocs. */ - -struct reloc_and_sec -{ - arelent *rel; - asection *sec; -}; - -/* We store some function pointer in the backend structure. This lets - different NLM targets share most of the same code, while providing - slightly different code where necessary. */ - -struct nlm_backend_data -{ - /* Signature for this backend. */ - char signature[NLM_SIGNATURE_SIZE]; - /* Size of the fixed header. */ - bfd_size_type fixed_header_size; - /* Size of optional prefix for this backend. Some backend may - require this to be a function, but so far a constant is OK. This - is for a prefix which precedes the standard NLM fixed header. */ - bfd_size_type optional_prefix_size; - /* Architecture. */ - enum bfd_architecture arch; - /* Machine. */ - long mach; - /* Some NLM formats do not use the uninitialized data section, so - all uninitialized data must be put into the regular data section - instead. */ - boolean no_uninitialized_data; - /* Some NLM formats have a prefix on the file. If this function is - not NULL, it will be called by nlm_object_p. It should return - true if this file could match this format, and it should leave - the BFD such that a bfd_read will pick up the fixed header. */ - boolean (*nlm_backend_object_p) PARAMS ((bfd *)); - /* Write out the prefix. This function may be NULL. This must - write out the same number of bytes as is in the field - optional_prefix_size. */ - boolean (*nlm_write_prefix) PARAMS ((bfd *)); - /* Read a relocation fixup from abfd. The reloc information is - machine specific. The second argument is the symbol if this is - an import, or NULL if this is a reloc fixup. This function - should set the third argument to the section which the reloc - belongs in, and the fourth argument to the reloc itself; it does - not need to fill in the sym_ptr_ptr field for a reloc against an - import symbol. */ - boolean (*nlm_read_reloc) PARAMS ((bfd *, nlmNAME(symbol_type) *, - asection **, arelent *)); - /* To make objcopy to an i386 NLM work, the i386 backend needs a - chance to work over the relocs. This is a bit icky. */ - boolean (*nlm_mangle_relocs) PARAMS ((bfd *, asection *, PTR data, - bfd_vma offset, - bfd_size_type count)); - /* Read an import record from abfd. It would be nice if this - were in a machine-dependent format, but it doesn't seem to be. */ - boolean (*nlm_read_import) PARAMS ((bfd *, nlmNAME(symbol_type) *)); - /* Write an import record to abfd. */ - boolean (*nlm_write_import) PARAMS ((bfd *, asection *, arelent *)); - /* Set the section for a public symbol. This may be NULL, in which - case a default method will be used. */ - boolean (*nlm_set_public_section) PARAMS ((bfd *, nlmNAME(symbol_type) *)); - /* Get the offset to write out for a public symbol. This may be - NULL, in which case a default method will be used. */ - bfd_vma (*nlm_get_public_offset) PARAMS ((bfd *, asymbol *)); - /* Swap the fixed header in and out */ - void (*nlm_swap_fhdr_in) PARAMS ((bfd *, - PTR, - Nlm_Internal_Fixed_Header *)); - void (*nlm_swap_fhdr_out) PARAMS ((bfd *, - struct nlm_internal_fixed_header *, - PTR)); - /* Write out an external reference. */ - boolean (*nlm_write_external) PARAMS ((bfd *, bfd_size_type, - asymbol *, - struct reloc_and_sec *)); - boolean (*nlm_write_export) PARAMS ((bfd *, asymbol *, bfd_vma)); -}; - -#define nlm_backend(bfd) \ - ((struct nlm_backend_data *)((bfd) -> xvec -> backend_data)) -#define nlm_signature(bfd) \ - (nlm_backend(bfd) -> signature) -#define nlm_fixed_header_size(bfd) \ - (nlm_backend(bfd) -> fixed_header_size) -#define nlm_optional_prefix_size(bfd) \ - (nlm_backend(bfd) -> optional_prefix_size) -#define nlm_architecture(bfd) \ - (nlm_backend(bfd) -> arch) -#define nlm_machine(bfd) \ - (nlm_backend(bfd) -> mach) -#define nlm_no_uninitialized_data(bfd) \ - (nlm_backend(bfd) -> no_uninitialized_data) -#define nlm_backend_object_p_func(bfd) \ - (nlm_backend(bfd) -> nlm_backend_object_p) -#define nlm_write_prefix_func(bfd) \ - (nlm_backend(bfd) -> nlm_write_prefix) -#define nlm_read_reloc_func(bfd) \ - (nlm_backend(bfd) -> nlm_read_reloc) -#define nlm_mangle_relocs_func(bfd) \ - (nlm_backend(bfd) -> nlm_mangle_relocs) -#define nlm_read_import_func(bfd) \ - (nlm_backend(bfd) -> nlm_read_import) -#define nlm_write_import_func(bfd) \ - (nlm_backend(bfd) -> nlm_write_import) -#define nlm_set_public_section_func(bfd) \ - (nlm_backend(bfd) -> nlm_set_public_section) -#define nlm_get_public_offset_func(bfd) \ - (nlm_backend(bfd) -> nlm_get_public_offset) -#define nlm_swap_fixed_header_in_func(bfd) \ - (nlm_backend(bfd) -> nlm_swap_fhdr_in) -#define nlm_swap_fixed_header_out_func(bfd) \ - (nlm_backend(bfd) -> nlm_swap_fhdr_out) -#define nlm_write_external_func(bfd) \ - (nlm_backend(bfd) -> nlm_write_external) -#define nlm_write_export_func(bfd) \ - (nlm_backend(bfd) -> nlm_write_export) - -/* The NLM code, data, and uninitialized sections have no names defined - in the NLM, but bfd wants to give them names, so use the traditional - UNIX names. */ - -#define NLM_CODE_NAME ".text" -#define NLM_INITIALIZED_DATA_NAME ".data" -#define NLM_UNINITIALIZED_DATA_NAME ".bss" - -#endif /* _LIBNLM_H_ */ diff --git a/contrib/gdb/bfd/liboasys.h b/contrib/gdb/bfd/liboasys.h deleted file mode 100644 index 2d15813765655..0000000000000 --- a/contrib/gdb/bfd/liboasys.h +++ /dev/null @@ -1,83 +0,0 @@ -/* BFD internal declarations for Oasys file format handling. - Copyright (C) 1990, 91, 92, 93, 94 Free Software Foundation, Inc. - Scrawled by Steve Chamberlain of Cygnus Support. - -This file is part of BFD, the Binary File Descriptor library. - -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 2 of the License, 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ - -typedef struct _oasys_symbol -{ - asymbol symbol; -} oasys_symbol_type; - -typedef struct _oasys_reloc { - arelent relent; - struct _oasys_reloc *next; - unsigned int symbol; -} oasys_reloc_type; - - -#define oasys_symbol(x) ((oasys_symbol_type *)(x)) -#define oasys_per_section(x) ((oasys_per_section_type *)(x->used_by_bfd)) - -typedef struct _oasys_per_section -{ - asection *section; - bfd_byte *data; - bfd_vma offset; - boolean had_vma; - oasys_reloc_type **reloc_tail_ptr; - bfd_vma pc; - - - file_ptr current_pos; - unsigned int current_byte; - boolean initialized; -} oasys_per_section_type; - -#define NSECTIONS 10 - -typedef struct _oasys_ar_obstack { - file_ptr file_offset; - bfd *abfd; -} oasys_ar_obstack_type; - - -typedef struct _oasys_module_info { - file_ptr pos; - unsigned int size; - bfd *abfd; - char *name; -} oasys_module_info_type; - -typedef struct _oasys_ar_data { - oasys_module_info_type *module; - unsigned int module_count; - unsigned int module_index; -} oasys_ar_data_type; - -typedef struct _oasys_data { - struct obstack oasys_obstack; - char *strings; - asymbol *symbols; - unsigned int symbol_string_length; - asection *sections[OASYS_MAX_SEC_COUNT]; - file_ptr first_data_record; -} oasys_data_type; - -#define OASYS_DATA(abfd) ((abfd)->tdata.oasys_obj_data) -#define OASYS_AR_DATA(abfd) ((abfd)->tdata.oasys_ar_data) - diff --git a/contrib/gdb/bfd/linker.c b/contrib/gdb/bfd/linker.c deleted file mode 100644 index 4decc88cafae2..0000000000000 --- a/contrib/gdb/bfd/linker.c +++ /dev/null @@ -1,2781 +0,0 @@ -/* linker.c -- BFD linker routines - Copyright (C) 1993, 1994, 1995 Free Software Foundation, Inc. - Written by Steve Chamberlain and Ian Lance Taylor, Cygnus Support - -This file is part of BFD, the Binary File Descriptor library. - -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 2 of the License, 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ - -#include "bfd.h" -#include "sysdep.h" -#include "libbfd.h" -#include "bfdlink.h" -#include "genlink.h" - -/* -SECTION - Linker Functions - -@cindex Linker - The linker uses three special entry points in the BFD target - vector. It is not necessary to write special routines for - these entry points when creating a new BFD back end, since - generic versions are provided. However, writing them can - speed up linking and make it use significantly less runtime - memory. - - The first routine creates a hash table used by the other - routines. The second routine adds the symbols from an object - file to the hash table. The third routine takes all the - object files and links them together to create the output - file. These routines are designed so that the linker proper - does not need to know anything about the symbols in the object - files that it is linking. The linker merely arranges the - sections as directed by the linker script and lets BFD handle - the details of symbols and relocs. - - The second routine and third routines are passed a pointer to - a <<struct bfd_link_info>> structure (defined in - <<bfdlink.h>>) which holds information relevant to the link, - including the linker hash table (which was created by the - first routine) and a set of callback functions to the linker - proper. - - The generic linker routines are in <<linker.c>>, and use the - header file <<genlink.h>>. As of this writing, the only back - ends which have implemented versions of these routines are - a.out (in <<aoutx.h>>) and ECOFF (in <<ecoff.c>>). The a.out - routines are used as examples throughout this section. - -@menu -@* Creating a Linker Hash Table:: -@* Adding Symbols to the Hash Table:: -@* Performing the Final Link:: -@end menu - -INODE -Creating a Linker Hash Table, Adding Symbols to the Hash Table, Linker Functions, Linker Functions -SUBSECTION - Creating a linker hash table - -@cindex _bfd_link_hash_table_create in target vector -@cindex target vector (_bfd_link_hash_table_create) - The linker routines must create a hash table, which must be - derived from <<struct bfd_link_hash_table>> described in - <<bfdlink.c>>. @xref{Hash Tables} for information on how to - create a derived hash table. This entry point is called using - the target vector of the linker output file. - - The <<_bfd_link_hash_table_create>> entry point must allocate - and initialize an instance of the desired hash table. If the - back end does not require any additional information to be - stored with the entries in the hash table, the entry point may - simply create a <<struct bfd_link_hash_table>>. Most likely, - however, some additional information will be needed. - - For example, with each entry in the hash table the a.out - linker keeps the index the symbol has in the final output file - (this index number is used so that when doing a relocateable - link the symbol index used in the output file can be quickly - filled in when copying over a reloc). The a.out linker code - defines the required structures and functions for a hash table - derived from <<struct bfd_link_hash_table>>. The a.out linker - hash table is created by the function - <<NAME(aout,link_hash_table_create)>>; it simply allocates - space for the hash table, initializes it, and returns a - pointer to it. - - When writing the linker routines for a new back end, you will - generally not know exactly which fields will be required until - you have finished. You should simply create a new hash table - which defines no additional fields, and then simply add fields - as they become necessary. - -INODE -Adding Symbols to the Hash Table, Performing the Final Link, Creating a Linker Hash Table, Linker Functions -SUBSECTION - Adding symbols to the hash table - -@cindex _bfd_link_add_symbols in target vector -@cindex target vector (_bfd_link_add_symbols) - The linker proper will call the <<_bfd_link_add_symbols>> - entry point for each object file or archive which is to be - linked (typically these are the files named on the command - line, but some may also come from the linker script). The - entry point is responsible for examining the file. For an - object file, BFD must add any relevant symbol information to - the hash table. For an archive, BFD must determine which - elements of the archive should be used and adding them to the - link. - - The a.out version of this entry point is - <<NAME(aout,link_add_symbols)>>. - -@menu -@* Differing file formats:: -@* Adding symbols from an object file:: -@* Adding symbols from an archive:: -@end menu - -INODE -Differing file formats, Adding symbols from an object file, Adding Symbols to the Hash Table, Adding Symbols to the Hash Table -SUBSUBSECTION - Differing file formats - - Normally all the files involved in a link will be of the same - format, but it is also possible to link together different - format object files, and the back end must support that. The - <<_bfd_link_add_symbols>> entry point is called via the target - vector of the file to be added. This has an important - consequence: the function may not assume that the hash table - is the type created by the corresponding - <<_bfd_link_hash_table_create>> vector. All the - <<_bfd_link_add_symbols>> function can assume about the hash - table is that it is derived from <<struct - bfd_link_hash_table>>. - - Sometimes the <<_bfd_link_add_symbols>> function must store - some information in the hash table entry to be used by the - <<_bfd_final_link>> function. In such a case the <<creator>> - field of the hash table must be checked to make sure that the - hash table was created by an object file of the same format. - - The <<_bfd_final_link>> routine must be prepared to handle a - hash entry without any extra information added by the - <<_bfd_link_add_symbols>> function. A hash entry without - extra information will also occur when the linker script - directs the linker to create a symbol. Note that, regardless - of how a hash table entry is added, all the fields will be - initialized to some sort of null value by the hash table entry - initialization function. - - See <<ecoff_link_add_externals>> for an example of how to - check the <<creator>> field before saving information (in this - case, the ECOFF external symbol debugging information) in a - hash table entry. - -INODE -Adding symbols from an object file, Adding symbols from an archive, Differing file formats, Adding Symbols to the Hash Table -SUBSUBSECTION - Adding symbols from an object file - - When the <<_bfd_link_add_symbols>> routine is passed an object - file, it must add all externally visible symbols in that - object file to the hash table. The actual work of adding the - symbol to the hash table is normally handled by the function - <<_bfd_generic_link_add_one_symbol>>. The - <<_bfd_link_add_symbols>> routine is responsible for reading - all the symbols from the object file and passing the correct - information to <<_bfd_generic_link_add_one_symbol>>. - - The <<_bfd_link_add_symbols>> routine should not use - <<bfd_canonicalize_symtab>> to read the symbols. The point of - providing this routine is to avoid the overhead of converting - the symbols into generic <<asymbol>> structures. - -@findex _bfd_generic_link_add_one_symbol - <<_bfd_generic_link_add_one_symbol>> handles the details of - combining common symbols, warning about multiple definitions, - and so forth. It takes arguments which describe the symbol to - add, notably symbol flags, a section, and an offset. The - symbol flags include such things as <<BSF_WEAK>> or - <<BSF_INDIRECT>>. The section is a section in the object - file, or something like <<bfd_und_section_ptr>> for an undefined - symbol or <<bfd_com_section_ptr>> for a common symbol. - - If the <<_bfd_final_link>> routine is also going to need to - read the symbol information, the <<_bfd_link_add_symbols>> - routine should save it somewhere attached to the object file - BFD. However, the information should only be saved if the - <<keep_memory>> field of the <<info>> argument is true, so - that the <<-no-keep-memory>> linker switch is effective. - - The a.out function which adds symbols from an object file is - <<aout_link_add_object_symbols>>, and most of the interesting - work is in <<aout_link_add_symbols>>. The latter saves - pointers to the hash tables entries created by - <<_bfd_generic_link_add_one_symbol>> indexed by symbol number, - so that the <<_bfd_final_link>> routine does not have to call - the hash table lookup routine to locate the entry. - -INODE -Adding symbols from an archive, , Adding symbols from an object file, Adding Symbols to the Hash Table -SUBSUBSECTION - Adding symbols from an archive - - When the <<_bfd_link_add_symbols>> routine is passed an - archive, it must look through the symbols defined by the - archive and decide which elements of the archive should be - included in the link. For each such element it must call the - <<add_archive_element>> linker callback, and it must add the - symbols from the object file to the linker hash table. - -@findex _bfd_generic_link_add_archive_symbols - In most cases the work of looking through the symbols in the - archive should be done by the - <<_bfd_generic_link_add_archive_symbols>> function. This - function builds a hash table from the archive symbol table and - looks through the list of undefined symbols to see which - elements should be included. - <<_bfd_generic_link_add_archive_symbols>> is passed a function - to call to make the final decision about adding an archive - element to the link and to do the actual work of adding the - symbols to the linker hash table. - - The function passed to - <<_bfd_generic_link_add_archive_symbols>> must read the - symbols of the archive element and decide whether the archive - element should be included in the link. If the element is to - be included, the <<add_archive_element>> linker callback - routine must be called with the element as an argument, and - the elements symbols must be added to the linker hash table - just as though the element had itself been passed to the - <<_bfd_link_add_symbols>> function. - - When the a.out <<_bfd_link_add_symbols>> function receives an - archive, it calls <<_bfd_generic_link_add_archive_symbols>> - passing <<aout_link_check_archive_element>> as the function - argument. <<aout_link_check_archive_element>> calls - <<aout_link_check_ar_symbols>>. If the latter decides to add - the element (an element is only added if it provides a real, - non-common, definition for a previously undefined or common - symbol) it calls the <<add_archive_element>> callback and then - <<aout_link_check_archive_element>> calls - <<aout_link_add_symbols>> to actually add the symbols to the - linker hash table. - - The ECOFF back end is unusual in that it does not normally - call <<_bfd_generic_link_add_archive_symbols>>, because ECOFF - archives already contain a hash table of symbols. The ECOFF - back end searches the archive itself to avoid the overhead of - creating a new hash table. - -INODE -Performing the Final Link, , Adding Symbols to the Hash Table, Linker Functions -SUBSECTION - Performing the final link - -@cindex _bfd_link_final_link in target vector -@cindex target vector (_bfd_final_link) - When all the input files have been processed, the linker calls - the <<_bfd_final_link>> entry point of the output BFD. This - routine is responsible for producing the final output file, - which has several aspects. It must relocate the contents of - the input sections and copy the data into the output sections. - It must build an output symbol table including any local - symbols from the input files and the global symbols from the - hash table. When producing relocateable output, it must - modify the input relocs and write them into the output file. - There may also be object format dependent work to be done. - - The linker will also call the <<write_object_contents>> entry - point when the BFD is closed. The two entry points must work - together in order to produce the correct output file. - - The details of how this works are inevitably dependent upon - the specific object file format. The a.out - <<_bfd_final_link>> routine is <<NAME(aout,final_link)>>. - -@menu -@* Information provided by the linker:: -@* Relocating the section contents:: -@* Writing the symbol table:: -@end menu - -INODE -Information provided by the linker, Relocating the section contents, Performing the Final Link, Performing the Final Link -SUBSUBSECTION - Information provided by the linker - - Before the linker calls the <<_bfd_final_link>> entry point, - it sets up some data structures for the function to use. - - The <<input_bfds>> field of the <<bfd_link_info>> structure - will point to a list of all the input files included in the - link. These files are linked through the <<link_next>> field - of the <<bfd>> structure. - - Each section in the output file will have a list of - <<link_order>> structures attached to the <<link_order_head>> - field (the <<link_order>> structure is defined in - <<bfdlink.h>>). These structures describe how to create the - contents of the output section in terms of the contents of - various input sections, fill constants, and, eventually, other - types of information. They also describe relocs that must be - created by the BFD backend, but do not correspond to any input - file; this is used to support -Ur, which builds constructors - while generating a relocateable object file. - -INODE -Relocating the section contents, Writing the symbol table, Information provided by the linker, Performing the Final Link -SUBSUBSECTION - Relocating the section contents - - The <<_bfd_final_link>> function should look through the - <<link_order>> structures attached to each section of the - output file. Each <<link_order>> structure should either be - handled specially, or it should be passed to the function - <<_bfd_default_link_order>> which will do the right thing - (<<_bfd_default_link_order>> is defined in <<linker.c>>). - - For efficiency, a <<link_order>> of type - <<bfd_indirect_link_order>> whose associated section belongs - to a BFD of the same format as the output BFD must be handled - specially. This type of <<link_order>> describes part of an - output section in terms of a section belonging to one of the - input files. The <<_bfd_final_link>> function should read the - contents of the section and any associated relocs, apply the - relocs to the section contents, and write out the modified - section contents. If performing a relocateable link, the - relocs themselves must also be modified and written out. - -@findex _bfd_relocate_contents -@findex _bfd_final_link_relocate - The functions <<_bfd_relocate_contents>> and - <<_bfd_final_link_relocate>> provide some general support for - performing the actual relocations, notably overflow checking. - Their arguments include information about the symbol the - relocation is against and a <<reloc_howto_type>> argument - which describes the relocation to perform. These functions - are defined in <<reloc.c>>. - - The a.out function which handles reading, relocating, and - writing section contents is <<aout_link_input_section>>. The - actual relocation is done in <<aout_link_input_section_std>> - and <<aout_link_input_section_ext>>. - -INODE -Writing the symbol table, , Relocating the section contents, Performing the Final Link -SUBSUBSECTION - Writing the symbol table - - The <<_bfd_final_link>> function must gather all the symbols - in the input files and write them out. It must also write out - all the symbols in the global hash table. This must be - controlled by the <<strip>> and <<discard>> fields of the - <<bfd_link_info>> structure. - - The local symbols of the input files will not have been - entered into the linker hash table. The <<_bfd_final_link>> - routine must consider each input file and include the symbols - in the output file. It may be convenient to do this when - looking through the <<link_order>> structures, or it may be - done by stepping through the <<input_bfds>> list. - - The <<_bfd_final_link>> routine must also traverse the global - hash table to gather all the externally visible symbols. It - is possible that most of the externally visible symbols may be - written out when considering the symbols of each input file, - but it is still necessary to traverse the hash table since the - linker script may have defined some symbols that are not in - any of the input files. - - The <<strip>> field of the <<bfd_link_info>> structure - controls which symbols are written out. The possible values - are listed in <<bfdlink.h>>. If the value is <<strip_some>>, - then the <<keep_hash>> field of the <<bfd_link_info>> - structure is a hash table of symbols to keep; each symbol - should be looked up in this hash table, and only symbols which - are present should be included in the output file. - - If the <<strip>> field of the <<bfd_link_info>> structure - permits local symbols to be written out, the <<discard>> field - is used to further controls which local symbols are included - in the output file. If the value is <<discard_l>>, then all - local symbols which begin with a certain prefix are discarded; - this prefix is described by the <<lprefix>> and - <<lprefix_len>> fields of the <<bfd_link_info>> structure. - - The a.out backend handles symbols by calling - <<aout_link_write_symbols>> on each input BFD and then - traversing the global hash table with the function - <<aout_link_write_other_symbol>>. It builds a string table - while writing out the symbols, which is written to the output - file at the end of <<NAME(aout,final_link)>>. -*/ - -static struct bfd_hash_entry *generic_link_hash_newfunc - PARAMS ((struct bfd_hash_entry *, struct bfd_hash_table *, - const char *)); -static boolean generic_link_read_symbols - PARAMS ((bfd *)); -static boolean generic_link_add_symbols - PARAMS ((bfd *, struct bfd_link_info *, boolean collect)); -static boolean generic_link_add_object_symbols - PARAMS ((bfd *, struct bfd_link_info *, boolean collect)); -static boolean generic_link_check_archive_element_no_collect - PARAMS ((bfd *, struct bfd_link_info *, boolean *pneeded)); -static boolean generic_link_check_archive_element_collect - PARAMS ((bfd *, struct bfd_link_info *, boolean *pneeded)); -static boolean generic_link_check_archive_element - PARAMS ((bfd *, struct bfd_link_info *, boolean *pneeded, boolean collect)); -static boolean generic_link_add_symbol_list - PARAMS ((bfd *, struct bfd_link_info *, bfd_size_type count, asymbol **, - boolean collect)); -static bfd *hash_entry_bfd PARAMS ((struct bfd_link_hash_entry *)); -static void set_symbol_from_hash - PARAMS ((asymbol *, struct bfd_link_hash_entry *)); -static boolean generic_add_output_symbol - PARAMS ((bfd *, size_t *psymalloc, asymbol *)); -static boolean default_fill_link_order - PARAMS ((bfd *, struct bfd_link_info *, asection *, - struct bfd_link_order *)); -static boolean default_indirect_link_order - PARAMS ((bfd *, struct bfd_link_info *, asection *, - struct bfd_link_order *, boolean)); - -/* The link hash table structure is defined in bfdlink.h. It provides - a base hash table which the backend specific hash tables are built - upon. */ - -/* Routine to create an entry in the link hash table. */ - -struct bfd_hash_entry * -_bfd_link_hash_newfunc (entry, table, string) - struct bfd_hash_entry *entry; - struct bfd_hash_table *table; - const char *string; -{ - struct bfd_link_hash_entry *ret = (struct bfd_link_hash_entry *) entry; - - /* Allocate the structure if it has not already been allocated by a - subclass. */ - if (ret == (struct bfd_link_hash_entry *) NULL) - ret = ((struct bfd_link_hash_entry *) - bfd_hash_allocate (table, sizeof (struct bfd_link_hash_entry))); - if (ret == (struct bfd_link_hash_entry *) NULL) - return NULL; - - /* Call the allocation method of the superclass. */ - ret = ((struct bfd_link_hash_entry *) - bfd_hash_newfunc ((struct bfd_hash_entry *) ret, table, string)); - - if (ret) - { - /* Initialize the local fields. */ - ret->type = bfd_link_hash_new; - ret->next = NULL; - } - - return (struct bfd_hash_entry *) ret; -} - -/* Initialize a link hash table. The BFD argument is the one - responsible for creating this table. */ - -boolean -_bfd_link_hash_table_init (table, abfd, newfunc) - struct bfd_link_hash_table *table; - bfd *abfd; - struct bfd_hash_entry *(*newfunc) PARAMS ((struct bfd_hash_entry *, - struct bfd_hash_table *, - const char *)); -{ - table->creator = abfd->xvec; - table->undefs = NULL; - table->undefs_tail = NULL; - return bfd_hash_table_init (&table->table, newfunc); -} - -/* Look up a symbol in a link hash table. If follow is true, we - follow bfd_link_hash_indirect and bfd_link_hash_warning links to - the real symbol. */ - -struct bfd_link_hash_entry * -bfd_link_hash_lookup (table, string, create, copy, follow) - struct bfd_link_hash_table *table; - const char *string; - boolean create; - boolean copy; - boolean follow; -{ - struct bfd_link_hash_entry *ret; - - ret = ((struct bfd_link_hash_entry *) - bfd_hash_lookup (&table->table, string, create, copy)); - - if (follow && ret != (struct bfd_link_hash_entry *) NULL) - { - while (ret->type == bfd_link_hash_indirect - || ret->type == bfd_link_hash_warning) - ret = ret->u.i.link; - } - - return ret; -} - -/* Look up a symbol in the main linker hash table if the symbol might - be wrapped. This should only be used for references to an - undefined symbol, not for definitions of a symbol. */ - -struct bfd_link_hash_entry * -bfd_wrapped_link_hash_lookup (abfd, info, string, create, copy, follow) - bfd *abfd; - struct bfd_link_info *info; - const char *string; - boolean create; - boolean copy; - boolean follow; -{ - if (info->wrap_hash != NULL) - { - const char *l; - - l = string; - if (*l == bfd_get_symbol_leading_char (abfd)) - ++l; - -#undef WRAP -#define WRAP "__wrap_" - - if (bfd_hash_lookup (info->wrap_hash, l, false, false) != NULL) - { - char *n; - struct bfd_link_hash_entry *h; - - /* This symbol is being wrapped. We want to replace all - references to SYM with references to __wrap_SYM. */ - - n = (char *) bfd_malloc (strlen (l) + sizeof WRAP + 1); - if (n == NULL) - return NULL; - - /* Note that symbol_leading_char may be '\0'. */ - n[0] = bfd_get_symbol_leading_char (abfd); - n[1] = '\0'; - strcat (n, WRAP); - strcat (n, l); - h = bfd_link_hash_lookup (info->hash, n, create, true, follow); - free (n); - return h; - } - -#undef WRAP - -#undef REAL -#define REAL "__real_" - - if (*l == '_' - && strncmp (l, REAL, sizeof REAL - 1) == 0 - && bfd_hash_lookup (info->wrap_hash, l + sizeof REAL - 1, - false, false) != NULL) - { - char *n; - struct bfd_link_hash_entry *h; - - /* This is a reference to __real_SYM, where SYM is being - wrapped. We want to replace all references to __real_SYM - with references to SYM. */ - - n = (char *) bfd_malloc (strlen (l + sizeof REAL - 1) + 2); - if (n == NULL) - return NULL; - - /* Note that symbol_leading_char may be '\0'. */ - n[0] = bfd_get_symbol_leading_char (abfd); - n[1] = '\0'; - strcat (n, l + sizeof REAL - 1); - h = bfd_link_hash_lookup (info->hash, n, create, true, follow); - free (n); - return h; - } - -#undef REAL - } - - return bfd_link_hash_lookup (info->hash, string, create, copy, follow); -} - -/* Traverse a generic link hash table. The only reason this is not a - macro is to do better type checking. This code presumes that an - argument passed as a struct bfd_hash_entry * may be caught as a - struct bfd_link_hash_entry * with no explicit cast required on the - call. */ - -void -bfd_link_hash_traverse (table, func, info) - struct bfd_link_hash_table *table; - boolean (*func) PARAMS ((struct bfd_link_hash_entry *, PTR)); - PTR info; -{ - bfd_hash_traverse (&table->table, - ((boolean (*) PARAMS ((struct bfd_hash_entry *, PTR))) - func), - info); -} - -/* Add a symbol to the linker hash table undefs list. */ - -INLINE void -bfd_link_add_undef (table, h) - struct bfd_link_hash_table *table; - struct bfd_link_hash_entry *h; -{ - BFD_ASSERT (h->next == NULL); - if (table->undefs_tail != (struct bfd_link_hash_entry *) NULL) - table->undefs_tail->next = h; - if (table->undefs == (struct bfd_link_hash_entry *) NULL) - table->undefs = h; - table->undefs_tail = h; -} - -/* Routine to create an entry in an generic link hash table. */ - -static struct bfd_hash_entry * -generic_link_hash_newfunc (entry, table, string) - struct bfd_hash_entry *entry; - struct bfd_hash_table *table; - const char *string; -{ - struct generic_link_hash_entry *ret = - (struct generic_link_hash_entry *) entry; - - /* Allocate the structure if it has not already been allocated by a - subclass. */ - if (ret == (struct generic_link_hash_entry *) NULL) - ret = ((struct generic_link_hash_entry *) - bfd_hash_allocate (table, sizeof (struct generic_link_hash_entry))); - if (ret == (struct generic_link_hash_entry *) NULL) - return NULL; - - /* Call the allocation method of the superclass. */ - ret = ((struct generic_link_hash_entry *) - _bfd_link_hash_newfunc ((struct bfd_hash_entry *) ret, - table, string)); - - if (ret) - { - /* Set local fields. */ - ret->written = false; - ret->sym = NULL; - } - - return (struct bfd_hash_entry *) ret; -} - -/* Create an generic link hash table. */ - -struct bfd_link_hash_table * -_bfd_generic_link_hash_table_create (abfd) - bfd *abfd; -{ - struct generic_link_hash_table *ret; - - ret = ((struct generic_link_hash_table *) - bfd_alloc (abfd, sizeof (struct generic_link_hash_table))); - if (ret == NULL) - return (struct bfd_link_hash_table *) NULL; - if (! _bfd_link_hash_table_init (&ret->root, abfd, - generic_link_hash_newfunc)) - { - free (ret); - return (struct bfd_link_hash_table *) NULL; - } - return &ret->root; -} - -/* Grab the symbols for an object file when doing a generic link. We - store the symbols in the outsymbols field. We need to keep them - around for the entire link to ensure that we only read them once. - If we read them multiple times, we might wind up with relocs and - the hash table pointing to different instances of the symbol - structure. */ - -static boolean -generic_link_read_symbols (abfd) - bfd *abfd; -{ - if (abfd->outsymbols == (asymbol **) NULL) - { - long symsize; - long symcount; - - symsize = bfd_get_symtab_upper_bound (abfd); - if (symsize < 0) - return false; - abfd->outsymbols = (asymbol **) bfd_alloc (abfd, symsize); - if (abfd->outsymbols == NULL && symsize != 0) - return false; - symcount = bfd_canonicalize_symtab (abfd, abfd->outsymbols); - if (symcount < 0) - return false; - abfd->symcount = symcount; - } - - return true; -} - -/* Generic function to add symbols to from an object file to the - global hash table. This version does not automatically collect - constructors by name. */ - -boolean -_bfd_generic_link_add_symbols (abfd, info) - bfd *abfd; - struct bfd_link_info *info; -{ - return generic_link_add_symbols (abfd, info, false); -} - -/* Generic function to add symbols from an object file to the global - hash table. This version automatically collects constructors by - name, as the collect2 program does. It should be used for any - target which does not provide some other mechanism for setting up - constructors and destructors; these are approximately those targets - for which gcc uses collect2 and do not support stabs. */ - -boolean -_bfd_generic_link_add_symbols_collect (abfd, info) - bfd *abfd; - struct bfd_link_info *info; -{ - return generic_link_add_symbols (abfd, info, true); -} - -/* Add symbols from an object file to the global hash table. */ - -static boolean -generic_link_add_symbols (abfd, info, collect) - bfd *abfd; - struct bfd_link_info *info; - boolean collect; -{ - boolean ret; - - switch (bfd_get_format (abfd)) - { - case bfd_object: - ret = generic_link_add_object_symbols (abfd, info, collect); - break; - case bfd_archive: - ret = (_bfd_generic_link_add_archive_symbols - (abfd, info, - (collect - ? generic_link_check_archive_element_collect - : generic_link_check_archive_element_no_collect))); - break; - default: - bfd_set_error (bfd_error_wrong_format); - ret = false; - } - - return ret; -} - -/* Add symbols from an object file to the global hash table. */ - -static boolean -generic_link_add_object_symbols (abfd, info, collect) - bfd *abfd; - struct bfd_link_info *info; - boolean collect; -{ - if (! generic_link_read_symbols (abfd)) - return false; - return generic_link_add_symbol_list (abfd, info, - _bfd_generic_link_get_symcount (abfd), - _bfd_generic_link_get_symbols (abfd), - collect); -} - -/* We build a hash table of all symbols defined in an archive. */ - -/* An archive symbol may be defined by multiple archive elements. - This linked list is used to hold the elements. */ - -struct archive_list -{ - struct archive_list *next; - int indx; -}; - -/* An entry in an archive hash table. */ - -struct archive_hash_entry -{ - struct bfd_hash_entry root; - /* Where the symbol is defined. */ - struct archive_list *defs; -}; - -/* An archive hash table itself. */ - -struct archive_hash_table -{ - struct bfd_hash_table table; -}; - -static struct bfd_hash_entry *archive_hash_newfunc - PARAMS ((struct bfd_hash_entry *, struct bfd_hash_table *, const char *)); -static boolean archive_hash_table_init - PARAMS ((struct archive_hash_table *, - struct bfd_hash_entry *(*) (struct bfd_hash_entry *, - struct bfd_hash_table *, - const char *))); - -/* Create a new entry for an archive hash table. */ - -static struct bfd_hash_entry * -archive_hash_newfunc (entry, table, string) - struct bfd_hash_entry *entry; - struct bfd_hash_table *table; - const char *string; -{ - struct archive_hash_entry *ret = (struct archive_hash_entry *) entry; - - /* Allocate the structure if it has not already been allocated by a - subclass. */ - if (ret == (struct archive_hash_entry *) NULL) - ret = ((struct archive_hash_entry *) - bfd_hash_allocate (table, sizeof (struct archive_hash_entry))); - if (ret == (struct archive_hash_entry *) NULL) - return NULL; - - /* Call the allocation method of the superclass. */ - ret = ((struct archive_hash_entry *) - bfd_hash_newfunc ((struct bfd_hash_entry *) ret, table, string)); - - if (ret) - { - /* Initialize the local fields. */ - ret->defs = (struct archive_list *) NULL; - } - - return (struct bfd_hash_entry *) ret; -} - -/* Initialize an archive hash table. */ - -static boolean -archive_hash_table_init (table, newfunc) - struct archive_hash_table *table; - struct bfd_hash_entry *(*newfunc) PARAMS ((struct bfd_hash_entry *, - struct bfd_hash_table *, - const char *)); -{ - return bfd_hash_table_init (&table->table, newfunc); -} - -/* Look up an entry in an archive hash table. */ - -#define archive_hash_lookup(t, string, create, copy) \ - ((struct archive_hash_entry *) \ - bfd_hash_lookup (&(t)->table, (string), (create), (copy))) - -/* Allocate space in an archive hash table. */ - -#define archive_hash_allocate(t, size) bfd_hash_allocate (&(t)->table, (size)) - -/* Free an archive hash table. */ - -#define archive_hash_table_free(t) bfd_hash_table_free (&(t)->table) - -/* Generic function to add symbols from an archive file to the global - hash file. This function presumes that the archive symbol table - has already been read in (this is normally done by the - bfd_check_format entry point). It looks through the undefined and - common symbols and searches the archive symbol table for them. If - it finds an entry, it includes the associated object file in the - link. - - The old linker looked through the archive symbol table for - undefined symbols. We do it the other way around, looking through - undefined symbols for symbols defined in the archive. The - advantage of the newer scheme is that we only have to look through - the list of undefined symbols once, whereas the old method had to - re-search the symbol table each time a new object file was added. - - The CHECKFN argument is used to see if an object file should be - included. CHECKFN should set *PNEEDED to true if the object file - should be included, and must also call the bfd_link_info - add_archive_element callback function and handle adding the symbols - to the global hash table. CHECKFN should only return false if some - sort of error occurs. - - For some formats, such as a.out, it is possible to look through an - object file but not actually include it in the link. The - archive_pass field in a BFD is used to avoid checking the symbols - of an object files too many times. When an object is included in - the link, archive_pass is set to -1. If an object is scanned but - not included, archive_pass is set to the pass number. The pass - number is incremented each time a new object file is included. The - pass number is used because when a new object file is included it - may create new undefined symbols which cause a previously examined - object file to be included. */ - -boolean -_bfd_generic_link_add_archive_symbols (abfd, info, checkfn) - bfd *abfd; - struct bfd_link_info *info; - boolean (*checkfn) PARAMS ((bfd *, struct bfd_link_info *, - boolean *pneeded)); -{ - carsym *arsyms; - carsym *arsym_end; - register carsym *arsym; - int pass; - struct archive_hash_table arsym_hash; - int indx; - struct bfd_link_hash_entry **pundef; - - if (! bfd_has_map (abfd)) - { - /* An empty archive is a special case. */ - if (bfd_openr_next_archived_file (abfd, (bfd *) NULL) == NULL) - return true; - bfd_set_error (bfd_error_no_armap); - return false; - } - - arsyms = bfd_ardata (abfd)->symdefs; - arsym_end = arsyms + bfd_ardata (abfd)->symdef_count; - - /* In order to quickly determine whether an symbol is defined in - this archive, we build a hash table of the symbols. */ - if (! archive_hash_table_init (&arsym_hash, archive_hash_newfunc)) - return false; - for (arsym = arsyms, indx = 0; arsym < arsym_end; arsym++, indx++) - { - struct archive_hash_entry *arh; - struct archive_list *l, **pp; - - arh = archive_hash_lookup (&arsym_hash, arsym->name, true, false); - if (arh == (struct archive_hash_entry *) NULL) - goto error_return; - l = ((struct archive_list *) - archive_hash_allocate (&arsym_hash, sizeof (struct archive_list))); - if (l == NULL) - goto error_return; - l->indx = indx; - for (pp = &arh->defs; - *pp != (struct archive_list *) NULL; - pp = &(*pp)->next) - ; - *pp = l; - l->next = NULL; - } - - /* The archive_pass field in the archive itself is used to - initialize PASS, sine we may search the same archive multiple - times. */ - pass = abfd->archive_pass + 1; - - /* New undefined symbols are added to the end of the list, so we - only need to look through it once. */ - pundef = &info->hash->undefs; - while (*pundef != (struct bfd_link_hash_entry *) NULL) - { - struct bfd_link_hash_entry *h; - struct archive_hash_entry *arh; - struct archive_list *l; - - h = *pundef; - - /* When a symbol is defined, it is not necessarily removed from - the list. */ - if (h->type != bfd_link_hash_undefined - && h->type != bfd_link_hash_common) - { - /* Remove this entry from the list, for general cleanliness - and because we are going to look through the list again - if we search any more libraries. We can't remove the - entry if it is the tail, because that would lose any - entries we add to the list later on (it would also cause - us to lose track of whether the symbol has been - referenced). */ - if (*pundef != info->hash->undefs_tail) - *pundef = (*pundef)->next; - else - pundef = &(*pundef)->next; - continue; - } - - /* Look for this symbol in the archive symbol map. */ - arh = archive_hash_lookup (&arsym_hash, h->root.string, false, false); - if (arh == (struct archive_hash_entry *) NULL) - { - pundef = &(*pundef)->next; - continue; - } - - /* Look at all the objects which define this symbol. */ - for (l = arh->defs; l != (struct archive_list *) NULL; l = l->next) - { - bfd *element; - boolean needed; - - /* If the symbol has gotten defined along the way, quit. */ - if (h->type != bfd_link_hash_undefined - && h->type != bfd_link_hash_common) - break; - - element = bfd_get_elt_at_index (abfd, l->indx); - if (element == (bfd *) NULL) - goto error_return; - - /* If we've already included this element, or if we've - already checked it on this pass, continue. */ - if (element->archive_pass == -1 - || element->archive_pass == pass) - continue; - - /* If we can't figure this element out, just ignore it. */ - if (! bfd_check_format (element, bfd_object)) - { - element->archive_pass = -1; - continue; - } - - /* CHECKFN will see if this element should be included, and - go ahead and include it if appropriate. */ - if (! (*checkfn) (element, info, &needed)) - goto error_return; - - if (! needed) - element->archive_pass = pass; - else - { - element->archive_pass = -1; - - /* Increment the pass count to show that we may need to - recheck object files which were already checked. */ - ++pass; - } - } - - pundef = &(*pundef)->next; - } - - archive_hash_table_free (&arsym_hash); - - /* Save PASS in case we are called again. */ - abfd->archive_pass = pass; - - return true; - - error_return: - archive_hash_table_free (&arsym_hash); - return false; -} - -/* See if we should include an archive element. This version is used - when we do not want to automatically collect constructors based on - the symbol name, presumably because we have some other mechanism - for finding them. */ - -static boolean -generic_link_check_archive_element_no_collect (abfd, info, pneeded) - bfd *abfd; - struct bfd_link_info *info; - boolean *pneeded; -{ - return generic_link_check_archive_element (abfd, info, pneeded, false); -} - -/* See if we should include an archive element. This version is used - when we want to automatically collect constructors based on the - symbol name, as collect2 does. */ - -static boolean -generic_link_check_archive_element_collect (abfd, info, pneeded) - bfd *abfd; - struct bfd_link_info *info; - boolean *pneeded; -{ - return generic_link_check_archive_element (abfd, info, pneeded, true); -} - -/* See if we should include an archive element. Optionally collect - constructors. */ - -static boolean -generic_link_check_archive_element (abfd, info, pneeded, collect) - bfd *abfd; - struct bfd_link_info *info; - boolean *pneeded; - boolean collect; -{ - asymbol **pp, **ppend; - - *pneeded = false; - - if (! generic_link_read_symbols (abfd)) - return false; - - pp = _bfd_generic_link_get_symbols (abfd); - ppend = pp + _bfd_generic_link_get_symcount (abfd); - for (; pp < ppend; pp++) - { - asymbol *p; - struct bfd_link_hash_entry *h; - - p = *pp; - - /* We are only interested in globally visible symbols. */ - if (! bfd_is_com_section (p->section) - && (p->flags & (BSF_GLOBAL | BSF_INDIRECT | BSF_WEAK)) == 0) - continue; - - /* We are only interested if we know something about this - symbol, and it is undefined or common. An undefined weak - symbol (type bfd_link_hash_undefweak) is not considered to be - a reference when pulling files out of an archive. See the - SVR4 ABI, p. 4-27. */ - h = bfd_link_hash_lookup (info->hash, bfd_asymbol_name (p), false, - false, true); - if (h == (struct bfd_link_hash_entry *) NULL - || (h->type != bfd_link_hash_undefined - && h->type != bfd_link_hash_common)) - continue; - - /* P is a symbol we are looking for. */ - - if (! bfd_is_com_section (p->section)) - { - bfd_size_type symcount; - asymbol **symbols; - - /* This object file defines this symbol, so pull it in. */ - if (! (*info->callbacks->add_archive_element) (info, abfd, - bfd_asymbol_name (p))) - return false; - symcount = _bfd_generic_link_get_symcount (abfd); - symbols = _bfd_generic_link_get_symbols (abfd); - if (! generic_link_add_symbol_list (abfd, info, symcount, - symbols, collect)) - return false; - *pneeded = true; - return true; - } - - /* P is a common symbol. */ - - if (h->type == bfd_link_hash_undefined) - { - bfd *symbfd; - bfd_vma size; - unsigned int power; - - symbfd = h->u.undef.abfd; - if (symbfd == (bfd *) NULL) - { - /* This symbol was created as undefined from outside - BFD. We assume that we should link in the object - file. This is for the -u option in the linker. */ - if (! (*info->callbacks->add_archive_element) - (info, abfd, bfd_asymbol_name (p))) - return false; - *pneeded = true; - return true; - } - - /* Turn the symbol into a common symbol but do not link in - the object file. This is how a.out works. Object - formats that require different semantics must implement - this function differently. This symbol is already on the - undefs list. We add the section to a common section - attached to symbfd to ensure that it is in a BFD which - will be linked in. */ - h->type = bfd_link_hash_common; - h->u.c.p = - ((struct bfd_link_hash_common_entry *) - bfd_hash_allocate (&info->hash->table, - sizeof (struct bfd_link_hash_common_entry))); - if (h->u.c.p == NULL) - return false; - - size = bfd_asymbol_value (p); - h->u.c.size = size; - - power = bfd_log2 (size); - if (power > 4) - power = 4; - h->u.c.p->alignment_power = power; - - if (p->section == bfd_com_section_ptr) - h->u.c.p->section = bfd_make_section_old_way (symbfd, "COMMON"); - else - h->u.c.p->section = bfd_make_section_old_way (symbfd, - p->section->name); - h->u.c.p->section->flags = SEC_ALLOC; - } - else - { - /* Adjust the size of the common symbol if necessary. This - is how a.out works. Object formats that require - different semantics must implement this function - differently. */ - if (bfd_asymbol_value (p) > h->u.c.size) - h->u.c.size = bfd_asymbol_value (p); - } - } - - /* This archive element is not needed. */ - return true; -} - -/* Add the symbols from an object file to the global hash table. ABFD - is the object file. INFO is the linker information. SYMBOL_COUNT - is the number of symbols. SYMBOLS is the list of symbols. COLLECT - is true if constructors should be automatically collected by name - as is done by collect2. */ - -static boolean -generic_link_add_symbol_list (abfd, info, symbol_count, symbols, collect) - bfd *abfd; - struct bfd_link_info *info; - bfd_size_type symbol_count; - asymbol **symbols; - boolean collect; -{ - asymbol **pp, **ppend; - - pp = symbols; - ppend = symbols + symbol_count; - for (; pp < ppend; pp++) - { - asymbol *p; - - p = *pp; - - if ((p->flags & (BSF_INDIRECT - | BSF_WARNING - | BSF_GLOBAL - | BSF_CONSTRUCTOR - | BSF_WEAK)) != 0 - || bfd_is_und_section (bfd_get_section (p)) - || bfd_is_com_section (bfd_get_section (p)) - || bfd_is_ind_section (bfd_get_section (p))) - { - const char *name; - const char *string; - struct generic_link_hash_entry *h; - - name = bfd_asymbol_name (p); - if (((p->flags & BSF_INDIRECT) != 0 - || bfd_is_ind_section (p->section)) - && pp + 1 < ppend) - { - pp++; - string = bfd_asymbol_name (*pp); - } - else if ((p->flags & BSF_WARNING) != 0 - && pp + 1 < ppend) - { - /* The name of P is actually the warning string, and the - next symbol is the one to warn about. */ - string = name; - pp++; - name = bfd_asymbol_name (*pp); - } - else - string = NULL; - - h = NULL; - if (! (_bfd_generic_link_add_one_symbol - (info, abfd, name, p->flags, bfd_get_section (p), - p->value, string, false, collect, - (struct bfd_link_hash_entry **) &h))) - return false; - - /* If this is a constructor symbol, and the linker didn't do - anything with it, then we want to just pass the symbol - through to the output file. This will happen when - linking with -r. */ - if ((p->flags & BSF_CONSTRUCTOR) != 0 - && (h == NULL || h->root.type == bfd_link_hash_new)) - { - p->udata.p = NULL; - continue; - } - - /* Save the BFD symbol so that we don't lose any backend - specific information that may be attached to it. We only - want this one if it gives more information than the - existing one; we don't want to replace a defined symbol - with an undefined one. This routine may be called with a - hash table other than the generic hash table, so we only - do this if we are certain that the hash table is a - generic one. */ - if (info->hash->creator == abfd->xvec) - { - if (h->sym == (asymbol *) NULL - || (! bfd_is_und_section (bfd_get_section (p)) - && (! bfd_is_com_section (bfd_get_section (p)) - || bfd_is_und_section (bfd_get_section (h->sym))))) - { - h->sym = p; - /* BSF_OLD_COMMON is a hack to support COFF reloc - reading, and it should go away when the COFF - linker is switched to the new version. */ - if (bfd_is_com_section (bfd_get_section (p))) - p->flags |= BSF_OLD_COMMON; - } - - /* Store a back pointer from the symbol to the hash - table entry for the benefit of relaxation code until - it gets rewritten to not use asymbol structures. - Setting this is also used to check whether these - symbols were set up by the generic linker. */ - p->udata.p = (PTR) h; - } - } - } - - return true; -} - -/* We use a state table to deal with adding symbols from an object - file. The first index into the state table describes the symbol - from the object file. The second index into the state table is the - type of the symbol in the hash table. */ - -/* The symbol from the object file is turned into one of these row - values. */ - -enum link_row -{ - UNDEF_ROW, /* Undefined. */ - UNDEFW_ROW, /* Weak undefined. */ - DEF_ROW, /* Defined. */ - DEFW_ROW, /* Weak defined. */ - COMMON_ROW, /* Common. */ - INDR_ROW, /* Indirect. */ - WARN_ROW, /* Warning. */ - SET_ROW /* Member of set. */ -}; - -/* apparently needed for Hitachi 3050R(HI-UX/WE2)? */ -#undef FAIL - -/* The actions to take in the state table. */ - -enum link_action -{ - FAIL, /* Abort. */ - UND, /* Mark symbol undefined. */ - WEAK, /* Mark symbol weak undefined. */ - DEF, /* Mark symbol defined. */ - DEFW, /* Mark symbol weak defined. */ - COM, /* Mark symbol common. */ - REF, /* Mark defined symbol referenced. */ - CREF, /* Possibly warn about common reference to defined symbol. */ - CDEF, /* Define existing common symbol. */ - NOACT, /* No action. */ - BIG, /* Mark symbol common using largest size. */ - MDEF, /* Multiple definition error. */ - MIND, /* Multiple indirect symbols. */ - IND, /* Make indirect symbol. */ - CIND, /* Make indirect symbol from existing common symbol. */ - SET, /* Add value to set. */ - MWARN, /* Make warning symbol. */ - WARN, /* Issue warning. */ - CWARN, /* Warn if referenced, else MWARN. */ - CYCLE, /* Repeat with symbol pointed to. */ - REFC, /* Mark indirect symbol referenced and then CYCLE. */ - WARNC /* Issue warning and then CYCLE. */ -}; - -/* The state table itself. The first index is a link_row and the - second index is a bfd_link_hash_type. */ - -static const enum link_action link_action[8][8] = -{ - /* current\prev new undef undefw def defw com indr warn */ - /* UNDEF_ROW */ {UND, NOACT, UND, REF, REF, NOACT, REFC, WARNC }, - /* UNDEFW_ROW */ {WEAK, NOACT, NOACT, REF, REF, NOACT, REFC, WARNC }, - /* DEF_ROW */ {DEF, DEF, DEF, MDEF, DEF, CDEF, MDEF, CYCLE }, - /* DEFW_ROW */ {DEFW, DEFW, DEFW, NOACT, NOACT, NOACT, NOACT, CYCLE }, - /* COMMON_ROW */ {COM, COM, COM, CREF, CREF, BIG, CREF, WARNC }, - /* INDR_ROW */ {IND, IND, IND, MDEF, IND, CIND, MIND, CYCLE }, - /* WARN_ROW */ {MWARN, WARN, WARN, CWARN, CWARN, WARN, CWARN, CYCLE }, - /* SET_ROW */ {SET, SET, SET, SET, SET, SET, CYCLE, CYCLE } -}; - -/* Most of the entries in the LINK_ACTION table are straightforward, - but a few are somewhat subtle. - - A reference to an indirect symbol (UNDEF_ROW/indr or - UNDEFW_ROW/indr) is counted as a reference both to the indirect - symbol and to the symbol the indirect symbol points to. - - A reference to a warning symbol (UNDEF_ROW/warn or UNDEFW_ROW/warn) - causes the warning to be issued. - - A common definition of an indirect symbol (COMMON_ROW/indr) is - treated as a multiple definition error. Likewise for an indirect - definition of a common symbol (INDR_ROW/com). - - An indirect definition of a warning (INDR_ROW/warn) does not cause - the warning to be issued. - - If a warning is created for an indirect symbol (WARN_ROW/indr) no - warning is created for the symbol the indirect symbol points to. - - Adding an entry to a set does not count as a reference to a set, - and no warning is issued (SET_ROW/warn). */ - -/* Return the BFD in which a hash entry has been defined, if known. */ - -static bfd * -hash_entry_bfd (h) - struct bfd_link_hash_entry *h; -{ - while (h->type == bfd_link_hash_warning) - h = h->u.i.link; - switch (h->type) - { - default: - return NULL; - case bfd_link_hash_undefined: - case bfd_link_hash_undefweak: - return h->u.undef.abfd; - case bfd_link_hash_defined: - case bfd_link_hash_defweak: - return h->u.def.section->owner; - case bfd_link_hash_common: - return h->u.c.p->section->owner; - } - /*NOTREACHED*/ -} - -/* Add a symbol to the global hash table. - ABFD is the BFD the symbol comes from. - NAME is the name of the symbol. - FLAGS is the BSF_* bits associated with the symbol. - SECTION is the section in which the symbol is defined; this may be - bfd_und_section_ptr or bfd_com_section_ptr. - VALUE is the value of the symbol, relative to the section. - STRING is used for either an indirect symbol, in which case it is - the name of the symbol to indirect to, or a warning symbol, in - which case it is the warning string. - COPY is true if NAME or STRING must be copied into locally - allocated memory if they need to be saved. - COLLECT is true if we should automatically collect gcc constructor - or destructor names as collect2 does. - HASHP, if not NULL, is a place to store the created hash table - entry; if *HASHP is not NULL, the caller has already looked up - the hash table entry, and stored it in *HASHP. */ - -boolean -_bfd_generic_link_add_one_symbol (info, abfd, name, flags, section, value, - string, copy, collect, hashp) - struct bfd_link_info *info; - bfd *abfd; - const char *name; - flagword flags; - asection *section; - bfd_vma value; - const char *string; - boolean copy; - boolean collect; - struct bfd_link_hash_entry **hashp; -{ - enum link_row row; - struct bfd_link_hash_entry *h; - boolean cycle; - - if (bfd_is_ind_section (section) - || (flags & BSF_INDIRECT) != 0) - row = INDR_ROW; - else if ((flags & BSF_WARNING) != 0) - row = WARN_ROW; - else if ((flags & BSF_CONSTRUCTOR) != 0) - row = SET_ROW; - else if (bfd_is_und_section (section)) - { - if ((flags & BSF_WEAK) != 0) - row = UNDEFW_ROW; - else - row = UNDEF_ROW; - } - else if ((flags & BSF_WEAK) != 0) - row = DEFW_ROW; - else if (bfd_is_com_section (section)) - row = COMMON_ROW; - else - row = DEF_ROW; - - if (hashp != NULL && *hashp != NULL) - h = *hashp; - else - { - if (row == UNDEF_ROW || row == UNDEFW_ROW) - h = bfd_wrapped_link_hash_lookup (abfd, info, name, true, copy, false); - else - h = bfd_link_hash_lookup (info->hash, name, true, copy, false); - if (h == NULL) - { - if (hashp != NULL) - *hashp = NULL; - return false; - } - } - - if (info->notice_hash != (struct bfd_hash_table *) NULL - && (bfd_hash_lookup (info->notice_hash, name, false, false) - != (struct bfd_hash_entry *) NULL)) - { - if (! (*info->callbacks->notice) (info, name, abfd, section, value)) - return false; - } - - if (hashp != (struct bfd_link_hash_entry **) NULL) - *hashp = h; - - do - { - enum link_action action; - - cycle = false; - action = link_action[(int) row][(int) h->type]; - switch (action) - { - case FAIL: - abort (); - - case NOACT: - /* Do nothing. */ - break; - - case UND: - /* Make a new undefined symbol. */ - h->type = bfd_link_hash_undefined; - h->u.undef.abfd = abfd; - bfd_link_add_undef (info->hash, h); - break; - - case WEAK: - /* Make a new weak undefined symbol. */ - h->type = bfd_link_hash_undefweak; - h->u.undef.abfd = abfd; - break; - - case CDEF: - /* We have found a definition for a symbol which was - previously common. */ - BFD_ASSERT (h->type == bfd_link_hash_common); - if (! ((*info->callbacks->multiple_common) - (info, name, - h->u.c.p->section->owner, bfd_link_hash_common, h->u.c.size, - abfd, bfd_link_hash_defined, (bfd_vma) 0))) - return false; - /* Fall through. */ - case DEF: - case DEFW: - { - enum bfd_link_hash_type oldtype; - - /* Define a symbol. */ - oldtype = h->type; - if (action == DEFW) - h->type = bfd_link_hash_defweak; - else - h->type = bfd_link_hash_defined; - h->u.def.section = section; - h->u.def.value = value; - - /* If we have been asked to, we act like collect2 and - identify all functions that might be global - constructors and destructors and pass them up in a - callback. We only do this for certain object file - types, since many object file types can handle this - automatically. */ - if (collect && name[0] == '_') - { - const char *s; - - /* A constructor or destructor name starts like this: - _+GLOBAL_[_.$][ID][_.$] where the first [_.$] and - the second are the same character (we accept any - character there, in case a new object file format - comes along with even worse naming restrictions). */ - -#define CONS_PREFIX "GLOBAL_" -#define CONS_PREFIX_LEN (sizeof CONS_PREFIX - 1) - - s = name + 1; - while (*s == '_') - ++s; - if (s[0] == 'G' - && strncmp (s, CONS_PREFIX, CONS_PREFIX_LEN - 1) == 0) - { - char c; - - c = s[CONS_PREFIX_LEN + 1]; - if ((c == 'I' || c == 'D') - && s[CONS_PREFIX_LEN] == s[CONS_PREFIX_LEN + 2]) - { - /* If this is a definition of a symbol which - was previously weakly defined, we are in - trouble. We have already added a - constructor entry for the weak defined - symbol, and now we are trying to add one - for the new symbol. Fortunately, this case - should never arise in practice. */ - if (oldtype == bfd_link_hash_defweak) - abort (); - - if (! ((*info->callbacks->constructor) - (info, - c == 'I' ? true : false, - name, abfd, section, value))) - return false; - } - } - } - } - - break; - - case COM: - /* We have found a common definition for a symbol. */ - if (h->type == bfd_link_hash_new) - bfd_link_add_undef (info->hash, h); - h->type = bfd_link_hash_common; - h->u.c.p = - ((struct bfd_link_hash_common_entry *) - bfd_hash_allocate (&info->hash->table, - sizeof (struct bfd_link_hash_common_entry))); - if (h->u.c.p == NULL) - return false; - - h->u.c.size = value; - - /* Select a default alignment based on the size. This may - be overridden by the caller. */ - { - unsigned int power; - - power = bfd_log2 (value); - if (power > 4) - power = 4; - h->u.c.p->alignment_power = power; - } - - /* The section of a common symbol is only used if the common - symbol is actually allocated. It basically provides a - hook for the linker script to decide which output section - the common symbols should be put in. In most cases, the - section of a common symbol will be bfd_com_section_ptr, - the code here will choose a common symbol section named - "COMMON", and the linker script will contain *(COMMON) in - the appropriate place. A few targets use separate common - sections for small symbols, and they require special - handling. */ - if (section == bfd_com_section_ptr) - { - h->u.c.p->section = bfd_make_section_old_way (abfd, "COMMON"); - h->u.c.p->section->flags = SEC_ALLOC; - } - else if (section->owner != abfd) - { - h->u.c.p->section = bfd_make_section_old_way (abfd, - section->name); - h->u.c.p->section->flags = SEC_ALLOC; - } - else - h->u.c.p->section = section; - break; - - case REF: - /* A reference to a defined symbol. */ - if (h->next == NULL && info->hash->undefs_tail != h) - h->next = h; - break; - - case BIG: - /* We have found a common definition for a symbol which - already had a common definition. Use the maximum of the - two sizes. */ - BFD_ASSERT (h->type == bfd_link_hash_common); - if (! ((*info->callbacks->multiple_common) - (info, name, - h->u.c.p->section->owner, bfd_link_hash_common, h->u.c.size, - abfd, bfd_link_hash_common, value))) - return false; - if (value > h->u.c.size) - { - unsigned int power; - - h->u.c.size = value; - - /* Select a default alignment based on the size. This may - be overridden by the caller. */ - power = bfd_log2 (value); - if (power > 4) - power = 4; - h->u.c.p->alignment_power = power; - } - break; - - case CREF: - { - bfd *obfd; - - /* We have found a common definition for a symbol which - was already defined. FIXME: It would nice if we could - report the BFD which defined an indirect symbol, but we - don't have anywhere to store the information. */ - if (h->type == bfd_link_hash_defined - || h->type == bfd_link_hash_defweak) - obfd = h->u.def.section->owner; - else - obfd = NULL; - if (! ((*info->callbacks->multiple_common) - (info, name, obfd, h->type, (bfd_vma) 0, - abfd, bfd_link_hash_common, value))) - return false; - } - break; - - case MIND: - /* Multiple indirect symbols. This is OK if they both point - to the same symbol. */ - if (strcmp (h->u.i.link->root.string, string) == 0) - break; - /* Fall through. */ - case MDEF: - /* Handle a multiple definition. */ - { - asection *msec; - bfd_vma mval; - - switch (h->type) - { - case bfd_link_hash_defined: - msec = h->u.def.section; - mval = h->u.def.value; - break; - case bfd_link_hash_indirect: - msec = bfd_ind_section_ptr; - mval = 0; - break; - default: - abort (); - } - - /* Ignore a redefinition of an absolute symbol to the same - value; it's harmless. */ - if (h->type == bfd_link_hash_defined - && bfd_is_abs_section (msec) - && bfd_is_abs_section (section) - && value == mval) - break; - - if (! ((*info->callbacks->multiple_definition) - (info, name, msec->owner, msec, mval, abfd, section, - value))) - return false; - } - break; - - case CIND: - /* Create an indirect symbol from an existing common symbol. */ - BFD_ASSERT (h->type == bfd_link_hash_common); - if (! ((*info->callbacks->multiple_common) - (info, name, - h->u.c.p->section->owner, bfd_link_hash_common, h->u.c.size, - abfd, bfd_link_hash_indirect, (bfd_vma) 0))) - return false; - /* Fall through. */ - case IND: - /* Create an indirect symbol. */ - { - struct bfd_link_hash_entry *inh; - - /* STRING is the name of the symbol we want to indirect - to. */ - inh = bfd_wrapped_link_hash_lookup (abfd, info, string, true, - copy, false); - if (inh == (struct bfd_link_hash_entry *) NULL) - return false; - if (inh->type == bfd_link_hash_new) - { - inh->type = bfd_link_hash_undefined; - inh->u.undef.abfd = abfd; - bfd_link_add_undef (info->hash, inh); - } - - /* If the indirect symbol has been referenced, we need to - push the reference down to the symbol we are - referencing. */ - if (h->type != bfd_link_hash_new) - { - row = UNDEF_ROW; - cycle = true; - } - - h->type = bfd_link_hash_indirect; - h->u.i.link = inh; - } - break; - - case SET: - /* Add an entry to a set. */ - if (! (*info->callbacks->add_to_set) (info, h, BFD_RELOC_CTOR, - abfd, section, value)) - return false; - break; - - case WARNC: - /* Issue a warning and cycle. */ - if (h->u.i.warning != NULL) - { - if (! (*info->callbacks->warning) (info, h->u.i.warning, name, - abfd, (asection *) NULL, - (bfd_vma) 0)) - return false; - /* Only issue a warning once. */ - h->u.i.warning = NULL; - } - /* Fall through. */ - case CYCLE: - /* Try again with the referenced symbol. */ - h = h->u.i.link; - cycle = true; - break; - - case REFC: - /* A reference to an indirect symbol. */ - if (h->next == NULL && info->hash->undefs_tail != h) - h->next = h; - h = h->u.i.link; - cycle = true; - break; - - case WARN: - /* Issue a warning. */ - if (! (*info->callbacks->warning) (info, string, name, - hash_entry_bfd (h), - (asection *) NULL, (bfd_vma) 0)) - return false; - break; - - case CWARN: - /* Warn if this symbol has been referenced already, - otherwise add a warning. A symbol has been referenced if - the next field is not NULL, or it is the tail of the - undefined symbol list. The REF case above helps to - ensure this. */ - if (h->next != NULL || info->hash->undefs_tail == h) - { - if (! (*info->callbacks->warning) (info, string, name, - hash_entry_bfd (h), - (asection *) NULL, - (bfd_vma) 0)) - return false; - break; - } - /* Fall through. */ - case MWARN: - /* Make a warning symbol. */ - { - struct bfd_link_hash_entry *sub; - - /* STRING is the warning to give. */ - sub = ((struct bfd_link_hash_entry *) - ((*info->hash->table.newfunc) - ((struct bfd_hash_entry *) NULL, &info->hash->table, - h->root.string))); - if (sub == NULL) - return false; - *sub = *h; - sub->type = bfd_link_hash_warning; - sub->u.i.link = h; - if (! copy) - sub->u.i.warning = string; - else - { - char *w; - - w = bfd_hash_allocate (&info->hash->table, - strlen (string) + 1); - if (w == NULL) - return false; - strcpy (w, string); - sub->u.i.warning = w; - } - - bfd_hash_replace (&info->hash->table, - (struct bfd_hash_entry *) h, - (struct bfd_hash_entry *) sub); - if (hashp != NULL) - *hashp = sub; - } - break; - } - } - while (cycle); - - return true; -} - -/* Generic final link routine. */ - -boolean -_bfd_generic_final_link (abfd, info) - bfd *abfd; - struct bfd_link_info *info; -{ - bfd *sub; - asection *o; - struct bfd_link_order *p; - size_t outsymalloc; - struct generic_write_global_symbol_info wginfo; - - abfd->outsymbols = (asymbol **) NULL; - abfd->symcount = 0; - outsymalloc = 0; - - /* Build the output symbol table. */ - for (sub = info->input_bfds; sub != (bfd *) NULL; sub = sub->link_next) - if (! _bfd_generic_link_output_symbols (abfd, sub, info, &outsymalloc)) - return false; - - /* Accumulate the global symbols. */ - wginfo.info = info; - wginfo.output_bfd = abfd; - wginfo.psymalloc = &outsymalloc; - _bfd_generic_link_hash_traverse (_bfd_generic_hash_table (info), - _bfd_generic_link_write_global_symbol, - (PTR) &wginfo); - - if (info->relocateable) - { - /* Allocate space for the output relocs for each section. */ - for (o = abfd->sections; - o != (asection *) NULL; - o = o->next) - { - o->reloc_count = 0; - for (p = o->link_order_head; - p != (struct bfd_link_order *) NULL; - p = p->next) - { - if (p->type == bfd_section_reloc_link_order - || p->type == bfd_symbol_reloc_link_order) - ++o->reloc_count; - else if (p->type == bfd_indirect_link_order) - { - asection *input_section; - bfd *input_bfd; - long relsize; - arelent **relocs; - asymbol **symbols; - long reloc_count; - - input_section = p->u.indirect.section; - input_bfd = input_section->owner; - relsize = bfd_get_reloc_upper_bound (input_bfd, - input_section); - if (relsize < 0) - return false; - relocs = (arelent **) bfd_malloc ((size_t) relsize); - if (!relocs && relsize != 0) - return false; - symbols = _bfd_generic_link_get_symbols (input_bfd); - reloc_count = bfd_canonicalize_reloc (input_bfd, - input_section, - relocs, - symbols); - if (reloc_count < 0) - return false; - BFD_ASSERT ((unsigned long) reloc_count - == input_section->reloc_count); - o->reloc_count += reloc_count; - free (relocs); - } - } - if (o->reloc_count > 0) - { - o->orelocation = ((arelent **) - bfd_alloc (abfd, - (o->reloc_count - * sizeof (arelent *)))); - if (!o->orelocation) - return false; - o->flags |= SEC_RELOC; - /* Reset the count so that it can be used as an index - when putting in the output relocs. */ - o->reloc_count = 0; - } - } - } - - /* Handle all the link order information for the sections. */ - for (o = abfd->sections; - o != (asection *) NULL; - o = o->next) - { - for (p = o->link_order_head; - p != (struct bfd_link_order *) NULL; - p = p->next) - { - switch (p->type) - { - case bfd_section_reloc_link_order: - case bfd_symbol_reloc_link_order: - if (! _bfd_generic_reloc_link_order (abfd, info, o, p)) - return false; - break; - case bfd_indirect_link_order: - if (! default_indirect_link_order (abfd, info, o, p, true)) - return false; - break; - default: - if (! _bfd_default_link_order (abfd, info, o, p)) - return false; - break; - } - } - } - - return true; -} - -/* Add an output symbol to the output BFD. */ - -static boolean -generic_add_output_symbol (output_bfd, psymalloc, sym) - bfd *output_bfd; - size_t *psymalloc; - asymbol *sym; -{ - if (output_bfd->symcount >= *psymalloc) - { - asymbol **newsyms; - - if (*psymalloc == 0) - *psymalloc = 124; - else - *psymalloc *= 2; - newsyms = (asymbol **) bfd_realloc (output_bfd->outsymbols, - *psymalloc * sizeof (asymbol *)); - if (newsyms == (asymbol **) NULL) - return false; - output_bfd->outsymbols = newsyms; - } - - output_bfd->outsymbols[output_bfd->symcount] = sym; - ++output_bfd->symcount; - - return true; -} - -/* Handle the symbols for an input BFD. */ - -boolean -_bfd_generic_link_output_symbols (output_bfd, input_bfd, info, psymalloc) - bfd *output_bfd; - bfd *input_bfd; - struct bfd_link_info *info; - size_t *psymalloc; -{ - asymbol **sym_ptr; - asymbol **sym_end; - - if (! generic_link_read_symbols (input_bfd)) - return false; - - /* Create a filename symbol if we are supposed to. */ - if (info->create_object_symbols_section != (asection *) NULL) - { - asection *sec; - - for (sec = input_bfd->sections; - sec != (asection *) NULL; - sec = sec->next) - { - if (sec->output_section == info->create_object_symbols_section) - { - asymbol *newsym; - - newsym = bfd_make_empty_symbol (input_bfd); - if (!newsym) - return false; - newsym->name = input_bfd->filename; - newsym->value = 0; - newsym->flags = BSF_LOCAL | BSF_FILE; - newsym->section = sec; - - if (! generic_add_output_symbol (output_bfd, psymalloc, - newsym)) - return false; - - break; - } - } - } - - /* Adjust the values of the globally visible symbols, and write out - local symbols. */ - sym_ptr = _bfd_generic_link_get_symbols (input_bfd); - sym_end = sym_ptr + _bfd_generic_link_get_symcount (input_bfd); - for (; sym_ptr < sym_end; sym_ptr++) - { - asymbol *sym; - struct generic_link_hash_entry *h; - boolean output; - - h = (struct generic_link_hash_entry *) NULL; - sym = *sym_ptr; - if ((sym->flags & (BSF_INDIRECT - | BSF_WARNING - | BSF_GLOBAL - | BSF_CONSTRUCTOR - | BSF_WEAK)) != 0 - || bfd_is_und_section (bfd_get_section (sym)) - || bfd_is_com_section (bfd_get_section (sym)) - || bfd_is_ind_section (bfd_get_section (sym))) - { - if (sym->udata.p != NULL) - h = (struct generic_link_hash_entry *) sym->udata.p; - else if ((sym->flags & BSF_CONSTRUCTOR) != 0) - { - /* This case normally means that the main linker code - deliberately ignored this constructor symbol. We - should just pass it through. This will screw up if - the constructor symbol is from a different, - non-generic, object file format, but the case will - only arise when linking with -r, which will probably - fail anyhow, since there will be no way to represent - the relocs in the output format being used. */ - h = NULL; - } - else if (bfd_is_und_section (bfd_get_section (sym))) - h = ((struct generic_link_hash_entry *) - bfd_wrapped_link_hash_lookup (output_bfd, info, - bfd_asymbol_name (sym), - false, false, true)); - else - h = _bfd_generic_link_hash_lookup (_bfd_generic_hash_table (info), - bfd_asymbol_name (sym), - false, false, true); - - if (h != (struct generic_link_hash_entry *) NULL) - { - /* Force all references to this symbol to point to - the same area in memory. It is possible that - this routine will be called with a hash table - other than a generic hash table, so we double - check that. */ - if (info->hash->creator == input_bfd->xvec) - { - if (h->sym != (asymbol *) NULL) - *sym_ptr = sym = h->sym; - } - - switch (h->root.type) - { - default: - case bfd_link_hash_new: - abort (); - case bfd_link_hash_undefined: - break; - case bfd_link_hash_undefweak: - sym->flags |= BSF_WEAK; - break; - case bfd_link_hash_indirect: - h = (struct generic_link_hash_entry *) h->root.u.i.link; - /* fall through */ - case bfd_link_hash_defined: - sym->flags |= BSF_GLOBAL; - sym->flags &=~ BSF_CONSTRUCTOR; - sym->value = h->root.u.def.value; - sym->section = h->root.u.def.section; - break; - case bfd_link_hash_defweak: - sym->flags |= BSF_WEAK; - sym->flags &=~ BSF_CONSTRUCTOR; - sym->value = h->root.u.def.value; - sym->section = h->root.u.def.section; - break; - case bfd_link_hash_common: - sym->value = h->root.u.c.size; - sym->flags |= BSF_GLOBAL; - if (! bfd_is_com_section (sym->section)) - { - BFD_ASSERT (bfd_is_und_section (sym->section)); - sym->section = bfd_com_section_ptr; - } - /* We do not set the section of the symbol to - h->root.u.c.p->section. That value was saved so - that we would know where to allocate the symbol - if it was defined. In this case the type is - still bfd_link_hash_common, so we did not define - it, so we do not want to use that section. */ - break; - } - } - } - - /* This switch is straight from the old code in - write_file_locals in ldsym.c. */ - if (info->strip == strip_some - && (bfd_hash_lookup (info->keep_hash, bfd_asymbol_name (sym), - false, false) - == (struct bfd_hash_entry *) NULL)) - output = false; - else if ((sym->flags & (BSF_GLOBAL | BSF_WEAK)) != 0) - { - /* If this symbol is marked as occurring now, rather - than at the end, output it now. This is used for - COFF C_EXT FCN symbols. FIXME: There must be a - better way. */ - if (bfd_asymbol_bfd (sym) == input_bfd - && (sym->flags & BSF_NOT_AT_END) != 0) - output = true; - else - output = false; - } - else if (bfd_is_ind_section (sym->section)) - output = false; - else if ((sym->flags & BSF_DEBUGGING) != 0) - { - if (info->strip == strip_none) - output = true; - else - output = false; - } - else if (bfd_is_und_section (sym->section) - || bfd_is_com_section (sym->section)) - output = false; - else if ((sym->flags & BSF_LOCAL) != 0) - { - if ((sym->flags & BSF_WARNING) != 0) - output = false; - else - { - switch (info->discard) - { - default: - case discard_all: - output = false; - break; - case discard_l: - if (bfd_asymbol_name (sym)[0] == info->lprefix[0] - && (info->lprefix_len == 1 - || strncmp (bfd_asymbol_name (sym), info->lprefix, - info->lprefix_len) == 0)) - output = false; - else - output = true; - break; - case discard_none: - output = true; - break; - } - } - } - else if ((sym->flags & BSF_CONSTRUCTOR)) - { - if (info->strip != strip_all) - output = true; - else - output = false; - } - else - abort (); - - if (output) - { - if (! generic_add_output_symbol (output_bfd, psymalloc, sym)) - return false; - if (h != (struct generic_link_hash_entry *) NULL) - h->written = true; - } - } - - return true; -} - -/* Set the section and value of a generic BFD symbol based on a linker - hash table entry. */ - -static void -set_symbol_from_hash (sym, h) - asymbol *sym; - struct bfd_link_hash_entry *h; -{ - switch (h->type) - { - default: - abort (); - break; - case bfd_link_hash_new: - /* This can happen when a constructor symbol is seen but we are - not building constructors. */ - if (sym->section != NULL) - { - BFD_ASSERT ((sym->flags & BSF_CONSTRUCTOR) != 0); - } - else - { - sym->flags |= BSF_CONSTRUCTOR; - sym->section = bfd_abs_section_ptr; - sym->value = 0; - } - break; - case bfd_link_hash_undefined: - sym->section = bfd_und_section_ptr; - sym->value = 0; - break; - case bfd_link_hash_undefweak: - sym->section = bfd_und_section_ptr; - sym->value = 0; - sym->flags |= BSF_WEAK; - break; - case bfd_link_hash_defined: - sym->section = h->u.def.section; - sym->value = h->u.def.value; - break; - case bfd_link_hash_defweak: - sym->flags |= BSF_WEAK; - sym->section = h->u.def.section; - sym->value = h->u.def.value; - break; - case bfd_link_hash_common: - sym->value = h->u.c.size; - if (sym->section == NULL) - sym->section = bfd_com_section_ptr; - else if (! bfd_is_com_section (sym->section)) - { - BFD_ASSERT (bfd_is_und_section (sym->section)); - sym->section = bfd_com_section_ptr; - } - /* Do not set the section; see _bfd_generic_link_output_symbols. */ - break; - case bfd_link_hash_indirect: - case bfd_link_hash_warning: - /* FIXME: What should we do here? */ - break; - } -} - -/* Write out a global symbol, if it hasn't already been written out. - This is called for each symbol in the hash table. */ - -boolean -_bfd_generic_link_write_global_symbol (h, data) - struct generic_link_hash_entry *h; - PTR data; -{ - struct generic_write_global_symbol_info *wginfo = - (struct generic_write_global_symbol_info *) data; - asymbol *sym; - - if (h->written) - return true; - - h->written = true; - - if (wginfo->info->strip == strip_all - || (wginfo->info->strip == strip_some - && bfd_hash_lookup (wginfo->info->keep_hash, h->root.root.string, - false, false) == NULL)) - return true; - - if (h->sym != (asymbol *) NULL) - sym = h->sym; - else - { - sym = bfd_make_empty_symbol (wginfo->output_bfd); - if (!sym) - return false; - sym->name = h->root.root.string; - sym->flags = 0; - } - - set_symbol_from_hash (sym, &h->root); - - sym->flags |= BSF_GLOBAL; - - if (! generic_add_output_symbol (wginfo->output_bfd, wginfo->psymalloc, - sym)) - { - /* FIXME: No way to return failure. */ - abort (); - } - - return true; -} - -/* Create a relocation. */ - -boolean -_bfd_generic_reloc_link_order (abfd, info, sec, link_order) - bfd *abfd; - struct bfd_link_info *info; - asection *sec; - struct bfd_link_order *link_order; -{ - arelent *r; - - if (! info->relocateable) - abort (); - if (sec->orelocation == (arelent **) NULL) - abort (); - - r = (arelent *) bfd_alloc (abfd, sizeof (arelent)); - if (r == (arelent *) NULL) - return false; - - r->address = link_order->offset; - r->howto = bfd_reloc_type_lookup (abfd, link_order->u.reloc.p->reloc); - if (r->howto == 0) - { - bfd_set_error (bfd_error_bad_value); - return false; - } - - /* Get the symbol to use for the relocation. */ - if (link_order->type == bfd_section_reloc_link_order) - r->sym_ptr_ptr = link_order->u.reloc.p->u.section->symbol_ptr_ptr; - else - { - struct generic_link_hash_entry *h; - - h = ((struct generic_link_hash_entry *) - bfd_wrapped_link_hash_lookup (abfd, info, - link_order->u.reloc.p->u.name, - false, false, true)); - if (h == (struct generic_link_hash_entry *) NULL - || ! h->written) - { - if (! ((*info->callbacks->unattached_reloc) - (info, link_order->u.reloc.p->u.name, - (bfd *) NULL, (asection *) NULL, (bfd_vma) 0))) - return false; - bfd_set_error (bfd_error_bad_value); - return false; - } - r->sym_ptr_ptr = &h->sym; - } - - /* If this is an inplace reloc, write the addend to the object file. - Otherwise, store it in the reloc addend. */ - if (! r->howto->partial_inplace) - r->addend = link_order->u.reloc.p->addend; - else - { - bfd_size_type size; - bfd_reloc_status_type rstat; - bfd_byte *buf; - boolean ok; - - size = bfd_get_reloc_size (r->howto); - buf = (bfd_byte *) bfd_zmalloc (size); - if (buf == (bfd_byte *) NULL) - return false; - rstat = _bfd_relocate_contents (r->howto, abfd, - link_order->u.reloc.p->addend, buf); - switch (rstat) - { - case bfd_reloc_ok: - break; - default: - case bfd_reloc_outofrange: - abort (); - case bfd_reloc_overflow: - if (! ((*info->callbacks->reloc_overflow) - (info, - (link_order->type == bfd_section_reloc_link_order - ? bfd_section_name (abfd, link_order->u.reloc.p->u.section) - : link_order->u.reloc.p->u.name), - r->howto->name, link_order->u.reloc.p->addend, - (bfd *) NULL, (asection *) NULL, (bfd_vma) 0))) - { - free (buf); - return false; - } - break; - } - ok = bfd_set_section_contents (abfd, sec, (PTR) buf, - (file_ptr) link_order->offset, size); - free (buf); - if (! ok) - return false; - - r->addend = 0; - } - - sec->orelocation[sec->reloc_count] = r; - ++sec->reloc_count; - - return true; -} - -/* Allocate a new link_order for a section. */ - -struct bfd_link_order * -bfd_new_link_order (abfd, section) - bfd *abfd; - asection *section; -{ - struct bfd_link_order *new; - - new = ((struct bfd_link_order *) - bfd_alloc_by_size_t (abfd, sizeof (struct bfd_link_order))); - if (!new) - return NULL; - - new->type = bfd_undefined_link_order; - new->offset = 0; - new->size = 0; - new->next = (struct bfd_link_order *) NULL; - - if (section->link_order_tail != (struct bfd_link_order *) NULL) - section->link_order_tail->next = new; - else - section->link_order_head = new; - section->link_order_tail = new; - - return new; -} - -/* Default link order processing routine. Note that we can not handle - the reloc_link_order types here, since they depend upon the details - of how the particular backends generates relocs. */ - -boolean -_bfd_default_link_order (abfd, info, sec, link_order) - bfd *abfd; - struct bfd_link_info *info; - asection *sec; - struct bfd_link_order *link_order; -{ - switch (link_order->type) - { - case bfd_undefined_link_order: - case bfd_section_reloc_link_order: - case bfd_symbol_reloc_link_order: - default: - abort (); - case bfd_indirect_link_order: - return default_indirect_link_order (abfd, info, sec, link_order, - false); - case bfd_fill_link_order: - return default_fill_link_order (abfd, info, sec, link_order); - case bfd_data_link_order: - return bfd_set_section_contents (abfd, sec, - (PTR) link_order->u.data.contents, - (file_ptr) link_order->offset, - link_order->size); - } -} - -/* Default routine to handle a bfd_fill_link_order. */ - -/*ARGSUSED*/ -static boolean -default_fill_link_order (abfd, info, sec, link_order) - bfd *abfd; - struct bfd_link_info *info; - asection *sec; - struct bfd_link_order *link_order; -{ - size_t size; - char *space; - size_t i; - int fill; - boolean result; - - BFD_ASSERT ((sec->flags & SEC_HAS_CONTENTS) != 0); - - size = (size_t) link_order->size; - space = (char *) bfd_malloc (size); - if (space == NULL && size != 0) - return false; - - fill = link_order->u.fill.value; - for (i = 0; i < size; i += 2) - space[i] = fill >> 8; - for (i = 1; i < size; i += 2) - space[i] = fill; - result = bfd_set_section_contents (abfd, sec, space, - (file_ptr) link_order->offset, - link_order->size); - free (space); - return result; -} - -/* Default routine to handle a bfd_indirect_link_order. */ - -static boolean -default_indirect_link_order (output_bfd, info, output_section, link_order, - generic_linker) - bfd *output_bfd; - struct bfd_link_info *info; - asection *output_section; - struct bfd_link_order *link_order; - boolean generic_linker; -{ - asection *input_section; - bfd *input_bfd; - bfd_byte *contents = NULL; - bfd_byte *new_contents; - - BFD_ASSERT ((output_section->flags & SEC_HAS_CONTENTS) != 0); - - if (link_order->size == 0) - return true; - - input_section = link_order->u.indirect.section; - input_bfd = input_section->owner; - - BFD_ASSERT (input_section->output_section == output_section); - BFD_ASSERT (input_section->output_offset == link_order->offset); - BFD_ASSERT (input_section->_cooked_size == link_order->size); - - if (info->relocateable - && input_section->reloc_count > 0 - && output_section->orelocation == (arelent **) NULL) - { - /* Space has not been allocated for the output relocations. - This can happen when we are called by a specific backend - because somebody is attempting to link together different - types of object files. Handling this case correctly is - difficult, and sometimes impossible. */ - abort (); - } - - if (! generic_linker) - { - asymbol **sympp; - asymbol **symppend; - - /* Get the canonical symbols. The generic linker will always - have retrieved them by this point, but we are being called by - a specific linker, presumably because we are linking - different types of object files together. */ - if (! generic_link_read_symbols (input_bfd)) - return false; - - /* Since we have been called by a specific linker, rather than - the generic linker, the values of the symbols will not be - right. They will be the values as seen in the input file, - not the values of the final link. We need to fix them up - before we can relocate the section. */ - sympp = _bfd_generic_link_get_symbols (input_bfd); - symppend = sympp + _bfd_generic_link_get_symcount (input_bfd); - for (; sympp < symppend; sympp++) - { - asymbol *sym; - struct bfd_link_hash_entry *h; - - sym = *sympp; - - if ((sym->flags & (BSF_INDIRECT - | BSF_WARNING - | BSF_GLOBAL - | BSF_CONSTRUCTOR - | BSF_WEAK)) != 0 - || bfd_is_und_section (bfd_get_section (sym)) - || bfd_is_com_section (bfd_get_section (sym)) - || bfd_is_ind_section (bfd_get_section (sym))) - { - /* sym->udata may have been set by - generic_link_add_symbol_list. */ - if (sym->udata.p != NULL) - h = (struct bfd_link_hash_entry *) sym->udata.p; - else if (bfd_is_und_section (bfd_get_section (sym))) - h = bfd_wrapped_link_hash_lookup (output_bfd, info, - bfd_asymbol_name (sym), - false, false, true); - else - h = bfd_link_hash_lookup (info->hash, - bfd_asymbol_name (sym), - false, false, true); - if (h != NULL) - set_symbol_from_hash (sym, h); - } - } - } - - /* Get and relocate the section contents. */ - contents = ((bfd_byte *) - bfd_malloc (bfd_section_size (input_bfd, input_section))); - if (contents == NULL && bfd_section_size (input_bfd, input_section) != 0) - goto error_return; - new_contents = (bfd_get_relocated_section_contents - (output_bfd, info, link_order, contents, info->relocateable, - _bfd_generic_link_get_symbols (input_bfd))); - if (!new_contents) - goto error_return; - - /* Output the section contents. */ - if (! bfd_set_section_contents (output_bfd, output_section, - (PTR) new_contents, - link_order->offset, link_order->size)) - goto error_return; - - if (contents != NULL) - free (contents); - return true; - - error_return: - if (contents != NULL) - free (contents); - return false; -} - -/* A little routine to count the number of relocs in a link_order - list. */ - -unsigned int -_bfd_count_link_order_relocs (link_order) - struct bfd_link_order *link_order; -{ - register unsigned int c; - register struct bfd_link_order *l; - - c = 0; - for (l = link_order; l != (struct bfd_link_order *) NULL; l = l->next) - { - if (l->type == bfd_section_reloc_link_order - || l->type == bfd_symbol_reloc_link_order) - ++c; - } - - return c; -} - -/* -FUNCTION - bfd_link_split_section - -SYNOPSIS - boolean bfd_link_split_section(bfd *abfd, asection *sec); - -DESCRIPTION - Return nonzero if @var{sec} should be split during a - reloceatable or final link. - -.#define bfd_link_split_section(abfd, sec) \ -. BFD_SEND (abfd, _bfd_link_split_section, (abfd, sec)) -. - -*/ - - - -boolean -_bfd_generic_link_split_section (abfd, sec) - bfd *abfd; - asection *sec; -{ - return false; -} diff --git a/contrib/gdb/bfd/lynx-core.c b/contrib/gdb/bfd/lynx-core.c deleted file mode 100644 index 2358177dbc62c..0000000000000 --- a/contrib/gdb/bfd/lynx-core.c +++ /dev/null @@ -1,233 +0,0 @@ -/* BFD back end for Lynx core files - Copyright 1993 Free Software Foundation, Inc. - Written by Stu Grossman of Cygnus Support. - -This file is part of BFD, the Binary File Descriptor library. - -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 2 of the License, 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ - -#include "bfd.h" -#include "sysdep.h" -#include "libbfd.h" - -#ifdef LYNX_CORE - -#include <sys/conf.h> -#include <sys/kernel.h> -/* sys/kernel.h should define this, but doesn't always, sigh. */ -#ifndef __LYNXOS -#define __LYNXOS -#endif -#include <sys/mem.h> -#include <sys/signal.h> -#include <sys/time.h> -#include <sys/resource.h> -#include <sys/itimer.h> -#include <sys/file.h> -#include <sys/proc.h> - -/* These are stored in the bfd's tdata */ - -struct lynx_core_struct -{ - int sig; - char cmd[PNMLEN + 1]; -}; - -#define core_hdr(bfd) ((bfd)->tdata.lynx_core_data) -#define core_signal(bfd) (core_hdr(bfd)->sig) -#define core_command(bfd) (core_hdr(bfd)->cmd) - -/* Handle Lynx core dump file. */ - -static asection * -make_bfd_asection (abfd, name, flags, _raw_size, vma, filepos) - bfd *abfd; - CONST char *name; - flagword flags; - bfd_size_type _raw_size; - bfd_vma vma; - file_ptr filepos; -{ - asection *asect; - char *newname; - - newname = bfd_alloc (abfd, strlen (name) + 1); - if (!newname) - return NULL; - - strcpy (newname, name); - - asect = bfd_make_section (abfd, newname); - if (!asect) - return NULL; - - asect->flags = flags; - asect->_raw_size = _raw_size; - asect->vma = vma; - asect->filepos = filepos; - asect->alignment_power = 2; - - return asect; -} - -/* ARGSUSED */ -const bfd_target * -lynx_core_file_p (abfd) - bfd *abfd; -{ - int val; - int secnum; - struct pssentry pss; - size_t tcontext_size; - core_st_t *threadp; - int pagesize; - asection *newsect; - - pagesize = getpagesize (); /* Serious cross-target issue here... This - really needs to come from a system-specific - header file. */ - - /* Get the pss entry from the core file */ - - if (bfd_seek (abfd, 0, SEEK_SET) != 0) - return NULL; - - val = bfd_read ((void *)&pss, 1, sizeof pss, abfd); - if (val != sizeof pss) - { - /* Too small to be a core file */ - if (bfd_get_error () != bfd_error_system_call) - bfd_set_error (bfd_error_wrong_format); - return NULL; - } - - core_hdr (abfd) = (struct lynx_core_struct *) - bfd_zalloc (abfd, sizeof (struct lynx_core_struct)); - - if (!core_hdr (abfd)) - return NULL; - - strncpy (core_command (abfd), pss.pname, PNMLEN + 1); - - /* Compute the size of the thread contexts */ - - tcontext_size = pss.threadcnt * sizeof (core_st_t); - - /* Allocate space for the thread contexts */ - - threadp = (core_st_t *)bfd_alloc (abfd, tcontext_size); - if (!threadp) - return NULL; - - /* Save thread contexts */ - - if (bfd_seek (abfd, pagesize, SEEK_SET) != 0) - return NULL; - - val = bfd_read ((void *)threadp, pss.threadcnt, sizeof (core_st_t), abfd); - - if (val != tcontext_size) - { - /* Probably too small to be a core file */ - if (bfd_get_error () != bfd_error_system_call) - bfd_set_error (bfd_error_wrong_format); - return NULL; - } - - core_signal (abfd) = threadp->currsig; - - newsect = make_bfd_asection (abfd, ".stack", - SEC_ALLOC + SEC_LOAD + SEC_HAS_CONTENTS, - pss.ssize, - pss.slimit, - pagesize + tcontext_size); - if (!newsect) - return NULL; - - newsect = make_bfd_asection (abfd, ".data", - SEC_ALLOC + SEC_LOAD + SEC_HAS_CONTENTS, - pss.data_len + pss.bss_len, - pss.data_start, - pagesize + tcontext_size + pss.ssize -#if defined (SPARC) || defined (__SPARC__) - /* SPARC Lynx seems to start dumping - the .data section at a page - boundary. It's OK to check a - #define like SPARC here because this - file can only be compiled on a Lynx - host. */ - + pss.data_start % pagesize -#endif - ); - if (!newsect) - return NULL; - -/* And, now for the .reg/XXX pseudo sections. Each thread has it's own - .reg/XXX section, where XXX is the thread id (without leading zeros). The - currently running thread (at the time of the core dump) also has an alias - called `.reg' (just to keep GDB happy). Note that we use `.reg/XXX' as - opposed to `.regXXX' because GDB expects that .reg2 will be the floating- - point registers. */ - - newsect = make_bfd_asection (abfd, ".reg", - SEC_HAS_CONTENTS, - sizeof (core_st_t), - 0, - pagesize); - if (!newsect) - return NULL; - - for (secnum = 0; secnum < pss.threadcnt; secnum++) - { - char secname[100]; - - sprintf (secname, ".reg/%d", BUILDPID (0, threadp[secnum].tid)); - newsect = make_bfd_asection (abfd, secname, - SEC_HAS_CONTENTS, - sizeof (core_st_t), - 0, - pagesize + secnum * sizeof (core_st_t)); - if (!newsect) - return NULL; - } - - return abfd->xvec; -} - -char * -lynx_core_file_failing_command (abfd) - bfd *abfd; -{ - return core_command (abfd); -} - -/* ARGSUSED */ -int -lynx_core_file_failing_signal (abfd) - bfd *abfd; -{ - return core_signal (abfd); -} - -/* ARGSUSED */ -boolean -lynx_core_file_matches_executable_p (core_bfd, exec_bfd) - bfd *core_bfd, *exec_bfd; -{ - return true; /* FIXME, We have no way of telling at this point */ -} - -#endif /* LYNX_CORE */ diff --git a/contrib/gdb/bfd/m68k4knetbsd.c b/contrib/gdb/bfd/m68k4knetbsd.c deleted file mode 100644 index c1ecb434425bd..0000000000000 --- a/contrib/gdb/bfd/m68k4knetbsd.c +++ /dev/null @@ -1,35 +0,0 @@ -/* BFD back-end for NetBSD/m68k a.out-ish binaries. - Copyright (C) 1990, 1991, 1992 Free Software Foundation, Inc. - -This file is part of BFD, the Binary File Descriptor library. - -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 2 of the License, 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ - -#define BYTES_IN_WORD 4 -#define TARGET_IS_BIG_ENDIAN_P - -#define TARGET_PAGE_SIZE 4096 -#define SEGMENT_SIZE 4096 - -#define DEFAULT_ARCH bfd_arch_m68k -#define MACHTYPE_OK(mtype) \ - ((mtype) == M_68020 || (mtype) == M_68K_NETBSD || (mtype) == M_68K4K_NETBSD \ - || (mtype) == M_UNKNOWN) - -#define MY(OP) CAT(m68k4knetbsd_,OP) -/* This needs to start with a.out so GDB knows it is an a.out variant. */ -#define TARGETNAME "a.out-m68k4k-netbsd" - -#include "netbsd.h" diff --git a/contrib/gdb/bfd/m68klinux.c b/contrib/gdb/bfd/m68klinux.c deleted file mode 100644 index 062165b399b8d..0000000000000 --- a/contrib/gdb/bfd/m68klinux.c +++ /dev/null @@ -1,767 +0,0 @@ -/* BFD back-end for linux flavored m68k a.out binaries. - Copyright (C) 1992, 93, 94, 95, 1996 Free Software Foundation, Inc. - -This file is part of BFD, the Binary File Descriptor library. - -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 2 of the License, 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ - -#define TARGET_PAGE_SIZE 4096 -#define ZMAGIC_DISK_BLOCK_SIZE 1024 -#define SEGMENT_SIZE TARGET_PAGE_SIZE -#define TEXT_START_ADDR 0x0 -#define N_SHARED_LIB(x) 0 -#define BYTES_IN_WORD 4 - -#include "bfd.h" -#include "sysdep.h" -#include "libbfd.h" -#include "aout/aout64.h" -#include "aout/stab_gnu.h" -#include "aout/ar.h" -#include "libaout.h" /* BFD a.out internal data structures */ - -#define TARGET_IS_BIG_ENDIAN_P -#define DEFAULT_ARCH bfd_arch_m68k -#define MY(OP) CAT(m68klinux_,OP) -#define TARGETNAME "a.out-m68k-linux" - -extern const bfd_target MY(vec); - -/* We always generate QMAGIC files in preference to ZMAGIC files. It - would be possible to make this a linker option, if that ever - becomes important. */ - -static void MY_final_link_callback - PARAMS ((bfd *, file_ptr *, file_ptr *, file_ptr *)); - -static boolean -m68klinux_bfd_final_link (abfd, info) - bfd *abfd; - struct bfd_link_info *info; -{ - obj_aout_subformat (abfd) = q_magic_format; - return NAME(aout,final_link) (abfd, info, MY_final_link_callback); -} - -#define MY_bfd_final_link m68klinux_bfd_final_link - -/* Set the machine type correctly. */ - -static boolean -m68klinux_write_object_contents (abfd) - bfd *abfd; -{ - struct external_exec exec_bytes; - struct internal_exec *execp = exec_hdr (abfd); - - N_SET_MACHTYPE (*execp, M_68020); - - obj_reloc_entry_size (abfd) = RELOC_STD_SIZE; - - WRITE_HEADERS(abfd, execp); - - return true; -} - -#define MY_write_object_contents m68klinux_write_object_contents - -/* Code to link against Linux a.out shared libraries. */ - -/* See if a symbol name is a reference to the global offset table. */ - -#ifndef GOT_REF_PREFIX -#define GOT_REF_PREFIX "__GOT_" -#endif - -#define IS_GOT_SYM(name) \ - (strncmp (name, GOT_REF_PREFIX, sizeof GOT_REF_PREFIX - 1) == 0) - -/* See if a symbol name is a reference to the procedure linkage table. */ - -#ifndef PLT_REF_PREFIX -#define PLT_REF_PREFIX "__PLT_" -#endif - -#define IS_PLT_SYM(name) \ - (strncmp (name, PLT_REF_PREFIX, sizeof PLT_REF_PREFIX - 1) == 0) - -/* This string is used to generate specialized error messages. */ - -#ifndef NEEDS_SHRLIB -#define NEEDS_SHRLIB "__NEEDS_SHRLIB_" -#endif - -/* This special symbol is a set vector that contains a list of - pointers to fixup tables. It will be present in any dynamicly - linked file. The linker generated fixup table should also be added - to the list, and it should always appear in the second slot (the - first one is a dummy with a magic number that is defined in - crt0.o). */ - -#ifndef SHARABLE_CONFLICTS -#define SHARABLE_CONFLICTS "__SHARABLE_CONFLICTS__" -#endif - -/* We keep a list of fixups. The terminology is a bit strange, but - each fixup contains two 32 bit numbers. A regular fixup contains - an address and a pointer, and at runtime we should store the - address at the location pointed to by the pointer. A builtin fixup - contains two pointers, and we should read the address using one - pointer and store it at the location pointed to by the other - pointer. Builtin fixups come into play when we have duplicate - __GOT__ symbols for the same variable. The builtin fixup will copy - the GOT pointer from one over into the other. */ - -struct fixup -{ - struct fixup *next; - struct linux_link_hash_entry *h; - bfd_vma value; - - /* Nonzero if this is a jump instruction that needs to be fixed, - zero if this is just a pointer */ - char jump; - - char builtin; -}; - -/* We don't need a special hash table entry structure, but we do need - to keep some information between linker passes, so we use a special - hash table. */ - -struct linux_link_hash_entry -{ - struct aout_link_hash_entry root; -}; - -struct linux_link_hash_table -{ - struct aout_link_hash_table root; - - /* First dynamic object found in link. */ - bfd *dynobj; - - /* Number of fixups. */ - size_t fixup_count; - - /* Number of builtin fixups. */ - size_t local_builtins; - - /* List of fixups. */ - struct fixup *fixup_list; -}; - -static struct bfd_hash_entry *linux_link_hash_newfunc - PARAMS ((struct bfd_hash_entry *, struct bfd_hash_table *, const char *)); -static struct bfd_link_hash_table *linux_link_hash_table_create - PARAMS ((bfd *)); -static struct fixup *new_fixup - PARAMS ((struct bfd_link_info *, struct linux_link_hash_entry *, - bfd_vma, int)); -static boolean linux_link_create_dynamic_sections - PARAMS ((bfd *, struct bfd_link_info *)); -static boolean linux_add_one_symbol - PARAMS ((struct bfd_link_info *, bfd *, const char *, flagword, asection *, - bfd_vma, const char *, boolean, boolean, - struct bfd_link_hash_entry **)); -static boolean linux_tally_symbols - PARAMS ((struct linux_link_hash_entry *, PTR)); -static boolean linux_finish_dynamic_link - PARAMS ((bfd *, struct bfd_link_info *)); - -/* Routine to create an entry in an Linux link hash table. */ - -static struct bfd_hash_entry * -linux_link_hash_newfunc (entry, table, string) - struct bfd_hash_entry *entry; - struct bfd_hash_table *table; - const char *string; -{ - struct linux_link_hash_entry *ret = (struct linux_link_hash_entry *) entry; - - /* Allocate the structure if it has not already been allocated by a - subclass. */ - if (ret == (struct linux_link_hash_entry *) NULL) - ret = ((struct linux_link_hash_entry *) - bfd_hash_allocate (table, sizeof (struct linux_link_hash_entry))); - if (ret == NULL) - return (struct bfd_hash_entry *) ret; - - /* Call the allocation method of the superclass. */ - ret = ((struct linux_link_hash_entry *) - NAME(aout,link_hash_newfunc) ((struct bfd_hash_entry *) ret, - table, string)); - if (ret != NULL) - { - /* Set local fields; there aren't any. */ - } - - return (struct bfd_hash_entry *) ret; -} - -/* Create a Linux link hash table. */ - -static struct bfd_link_hash_table * -linux_link_hash_table_create (abfd) - bfd *abfd; -{ - struct linux_link_hash_table *ret; - - ret = ((struct linux_link_hash_table *) - bfd_alloc (abfd, sizeof (struct linux_link_hash_table))); - if (ret == (struct linux_link_hash_table *) NULL) - { - bfd_set_error (bfd_error_no_memory); - return (struct bfd_link_hash_table *) NULL; - } - if (! NAME(aout,link_hash_table_init) (&ret->root, abfd, - linux_link_hash_newfunc)) - { - free (ret); - return (struct bfd_link_hash_table *) NULL; - } - - ret->dynobj = NULL; - ret->fixup_count = 0; - ret->local_builtins = 0; - ret->fixup_list = NULL; - - return &ret->root.root; -} - -/* Look up an entry in a Linux link hash table. */ - -#define linux_link_hash_lookup(table, string, create, copy, follow) \ - ((struct linux_link_hash_entry *) \ - aout_link_hash_lookup (&(table)->root, (string), (create), (copy),\ - (follow))) - -/* Traverse a Linux link hash table. */ - -#define linux_link_hash_traverse(table, func, info) \ - (aout_link_hash_traverse \ - (&(table)->root, \ - (boolean (*) PARAMS ((struct aout_link_hash_entry *, PTR))) (func), \ - (info))) - -/* Get the Linux link hash table from the info structure. This is - just a cast. */ - -#define linux_hash_table(p) ((struct linux_link_hash_table *) ((p)->hash)) - -/* Store the information for a new fixup. */ - -static struct fixup * -new_fixup (info, h, value, builtin) - struct bfd_link_info *info; - struct linux_link_hash_entry *h; - bfd_vma value; - int builtin; -{ - struct fixup *f; - - f = (struct fixup *) bfd_hash_allocate (&info->hash->table, - sizeof (struct fixup)); - if (f == NULL) - return f; - f->next = linux_hash_table (info)->fixup_list; - linux_hash_table (info)->fixup_list = f; - f->h = h; - f->value = value; - f->builtin = builtin; - f->jump = 0; - ++linux_hash_table (info)->fixup_count; - return f; -} - -/* We come here once we realize that we are going to link to a shared - library. We need to create a special section that contains the - fixup table, and we ultimately need to add a pointer to this into - the set vector for SHARABLE_CONFLICTS. At this point we do not - know the size of the section, but that's OK - we just need to - create it for now. */ - -static boolean -linux_link_create_dynamic_sections (abfd, info) - bfd *abfd; - struct bfd_link_info *info; -{ - flagword flags; - register asection *s; - - /* Note that we set the SEC_IN_MEMORY flag. */ - flags = SEC_ALLOC | SEC_LOAD | SEC_HAS_CONTENTS | SEC_IN_MEMORY; - - /* We choose to use the name ".linux-dynamic" for the fixup table. - Why not? */ - s = bfd_make_section (abfd, ".linux-dynamic"); - if (s == NULL - || ! bfd_set_section_flags (abfd, s, flags) - || ! bfd_set_section_alignment (abfd, s, 2)) - return false; - s->_raw_size = 0; - s->contents = 0; - - return true; -} - -/* Function to add a single symbol to the linker hash table. This is - a wrapper around _bfd_generic_link_add_one_symbol which handles the - tweaking needed for dynamic linking support. */ - -static boolean -linux_add_one_symbol (info, abfd, name, flags, section, value, string, - copy, collect, hashp) - struct bfd_link_info *info; - bfd *abfd; - const char *name; - flagword flags; - asection *section; - bfd_vma value; - const char *string; - boolean copy; - boolean collect; - struct bfd_link_hash_entry **hashp; -{ - struct linux_link_hash_entry *h; - boolean insert; - - /* Look up and see if we already have this symbol in the hash table. - If we do, and the defining entry is from a shared library, we - need to create the dynamic sections. - - FIXME: What if abfd->xvec != info->hash->creator? We may want to - be able to link Linux a.out and ELF objects together, but serious - confusion is possible. */ - - insert = false; - - if (! info->relocateable - && linux_hash_table (info)->dynobj == NULL - && strcmp (name, SHARABLE_CONFLICTS) == 0 - && (flags & BSF_CONSTRUCTOR) != 0 - && abfd->xvec == info->hash->creator) - { - if (! linux_link_create_dynamic_sections (abfd, info)) - return false; - linux_hash_table (info)->dynobj = abfd; - insert = true; - } - - if (bfd_is_abs_section (section) - && abfd->xvec == info->hash->creator) - { - h = linux_link_hash_lookup (linux_hash_table (info), name, false, - false, false); - if (h != NULL - && (h->root.root.type == bfd_link_hash_defined - || h->root.root.type == bfd_link_hash_defweak)) - { - struct fixup *f; - - if (hashp != NULL) - *hashp = (struct bfd_link_hash_entry *) h; - - f = new_fixup (info, h, value, ! IS_PLT_SYM (name)); - if (f == NULL) - return false; - f->jump = IS_PLT_SYM (name); - - return true; - } - } - - /* Do the usual procedure for adding a symbol. */ - if (! _bfd_generic_link_add_one_symbol (info, abfd, name, flags, section, - value, string, copy, collect, - hashp)) - return false; - - /* Insert a pointer to our table in the set vector. The dynamic - linker requires this information */ - if (insert) - { - asection *s; - - /* Here we do our special thing to add the pointer to the - dynamic section in the SHARABLE_CONFLICTS set vector. */ - s = bfd_get_section_by_name (linux_hash_table (info)->dynobj, - ".linux-dynamic"); - BFD_ASSERT (s != NULL); - - if (! (_bfd_generic_link_add_one_symbol - (info, linux_hash_table (info)->dynobj, SHARABLE_CONFLICTS, - BSF_GLOBAL | BSF_CONSTRUCTOR, s, 0, NULL, false, false, NULL))) - return false; - } - - return true; -} - -/* We will crawl the hash table and come here for every global symbol. - We will examine each entry and see if there are indications that we - need to add a fixup. There are two possible cases - one is where - you have duplicate definitions of PLT or GOT symbols - these will - have already been caught and added as "builtin" fixups. If we find - that the corresponding non PLT/GOT symbol is also present, we - convert it to a regular fixup instead. - - This function is called via linux_link_hash_traverse. */ - -static boolean -linux_tally_symbols (h, data) - struct linux_link_hash_entry *h; - PTR data; -{ - struct bfd_link_info *info = (struct bfd_link_info *) data; - struct fixup *f, *f1; - int is_plt; - struct linux_link_hash_entry *h1, *h2; - boolean exists; - - if (h->root.root.type == bfd_link_hash_undefined - && strncmp (h->root.root.root.string, NEEDS_SHRLIB, - sizeof NEEDS_SHRLIB - 1) == 0) - { - const char *name; - char *p; - char *alloc = NULL; - - name = h->root.root.root.string + sizeof NEEDS_SHRLIB - 1; - p = strrchr (name, '_'); - if (p != NULL) - alloc = (char *) bfd_malloc (strlen (name) + 1); - - if (p == NULL || alloc == NULL) - (*_bfd_error_handler) ("Output file requires shared library `%s'\n", - name); - else - { - strcpy (alloc, name); - p = strrchr (alloc, '_'); - *p++ = '\0'; - (*_bfd_error_handler) - ("Output file requires shared library `%s.so.%s'\n", - alloc, p); - free (alloc); - } - - abort (); - } - - /* If this symbol is not a PLT/GOT, we do not even need to look at it */ - is_plt = IS_PLT_SYM (h->root.root.root.string); - - if (is_plt || IS_GOT_SYM (h->root.root.root.string)) - { - /* Look up this symbol twice. Once just as a regular lookup, - and then again following all of the indirect links until we - reach a real symbol. */ - h1 = linux_link_hash_lookup (linux_hash_table (info), - (h->root.root.root.string - + sizeof PLT_REF_PREFIX - 1), - false, false, true); - /* h2 does not follow indirect symbols. */ - h2 = linux_link_hash_lookup (linux_hash_table (info), - (h->root.root.root.string - + sizeof PLT_REF_PREFIX - 1), - false, false, false); - - /* The real symbol must exist but if it is also an ABS symbol, - there is no need to have a fixup. This is because they both - came from the same library. If on the other hand, we had to - use an indirect symbol to get to the real symbol, we add the - fixup anyway, since there are cases where these symbols come - from different shared libraries */ - if (h1 != NULL - && (((h1->root.root.type == bfd_link_hash_defined - || h1->root.root.type == bfd_link_hash_defweak) - && ! bfd_is_abs_section (h1->root.root.u.def.section)) - || h2->root.root.type == bfd_link_hash_indirect)) - { - /* See if there is a "builtin" fixup already present - involving this symbol. If so, convert it to a regular - fixup. In the end, this relaxes some of the requirements - about the order of performing fixups. */ - exists = false; - for (f1 = linux_hash_table (info)->fixup_list; - f1 != NULL; - f1 = f1->next) - { - if ((f1->h != h && f1->h != h1) - || (! f1->builtin && ! f1->jump)) - continue; - if (f1->h == h1) - exists = true; - if (! exists - && bfd_is_abs_section (h->root.root.u.def.section)) - { - f = new_fixup (info, h1, f1->h->root.root.u.def.value, 0); - f->jump = is_plt; - } - f1->h = h1; - f1->jump = is_plt; - f1->builtin = 0; - exists = true; - } - if (! exists - && bfd_is_abs_section (h->root.root.u.def.section)) - { - f = new_fixup (info, h1, h->root.root.u.def.value, 0); - if (f == NULL) - { - /* FIXME: No way to return error. */ - abort (); - } - f->jump = is_plt; - } - } - - /* Quick and dirty way of stripping these symbols from the - symtab. */ - if (bfd_is_abs_section (h->root.root.u.def.section)) - h->root.written = true; - } - - return true; -} - -/* This is called to set the size of the .linux-dynamic section is. - It is called by the Linux linker emulation before_allocation - routine. We have finished reading all of the input files, and now - we just scan the hash tables to find out how many additional fixups - are required. */ - -boolean -bfd_m68klinux_size_dynamic_sections (output_bfd, info) - bfd *output_bfd; - struct bfd_link_info *info; -{ - struct fixup *f; - asection *s; - - if (output_bfd->xvec != &MY(vec)) - return true; - - /* First find the fixups... */ - linux_link_hash_traverse (linux_hash_table (info), - linux_tally_symbols, - (PTR) info); - - /* If there are builtin fixups, leave room for a marker. This is - used by the dynamic linker so that it knows that all that follow - are builtin fixups instead of regular fixups. */ - for (f = linux_hash_table (info)->fixup_list; f != NULL; f = f->next) - { - if (f->builtin) - { - ++linux_hash_table (info)->fixup_count; - ++linux_hash_table (info)->local_builtins; - break; - } - } - - if (linux_hash_table (info)->dynobj == NULL) - { - if (linux_hash_table (info)->fixup_count > 0) - abort (); - return true; - } - - /* Allocate memory for our fixup table. We will fill it in later. */ - s = bfd_get_section_by_name (linux_hash_table (info)->dynobj, - ".linux-dynamic"); - if (s != NULL) - { - s->_raw_size = 8 + linux_hash_table (info)->fixup_count * 8; - s->contents = (bfd_byte *) bfd_alloc (output_bfd, s->_raw_size); - if (s->contents == NULL) - { - bfd_set_error (bfd_error_no_memory); - return false; - } - memset (s->contents, 0, (size_t) s->_raw_size); - } - - return true; -} - -/* We come here once we are ready to actually write the fixup table to - the output file. Scan the fixup tables and so forth and generate - the stuff we need. */ - -static boolean -linux_finish_dynamic_link (output_bfd, info) - bfd *output_bfd; - struct bfd_link_info *info; -{ - asection *s, *os, *is; - bfd_byte *fixup_table; - struct linux_link_hash_entry *h; - struct fixup *f; - unsigned int new_addr; - int section_offset; - unsigned int fixups_written; - - if (linux_hash_table (info)->dynobj == NULL) - return true; - - s = bfd_get_section_by_name (linux_hash_table (info)->dynobj, - ".linux-dynamic"); - BFD_ASSERT (s != NULL); - os = s->output_section; - fixups_written = 0; - -#ifdef LINUX_LINK_DEBUG - printf ("Fixup table file offset: %x VMA: %x\n", - os->filepos + s->output_offset, - os->vma + s->output_offset); -#endif - - fixup_table = s->contents; - bfd_put_32 (output_bfd, linux_hash_table (info)->fixup_count, fixup_table); - fixup_table += 4; - - /* Fill in fixup table. */ - for (f = linux_hash_table (info)->fixup_list; f != NULL; f = f->next) - { - if (f->builtin) - continue; - - if (f->h->root.root.type != bfd_link_hash_defined - && f->h->root.root.type != bfd_link_hash_defweak) - { - (*_bfd_error_handler) - ("Symbol %s not defined for fixups\n", - f->h->root.root.root.string); - continue; - } - - is = f->h->root.root.u.def.section; - section_offset = is->output_section->vma + is->output_offset; - new_addr = f->h->root.root.u.def.value + section_offset; - -#ifdef LINUX_LINK_DEBUG - printf ("Fixup(%d) %s: %x %x\n",f->jump, f->h->root.root.string, - new_addr, f->value); -#endif - - if (f->jump) - { - bfd_put_32 (output_bfd, new_addr, fixup_table); - fixup_table += 4; - bfd_put_32 (output_bfd, f->value + 2, fixup_table); - fixup_table += 4; - } - else - { - bfd_put_32 (output_bfd, new_addr, fixup_table); - fixup_table += 4; - bfd_put_32 (output_bfd, f->value, fixup_table); - fixup_table += 4; - } - ++fixups_written; - } - - if (linux_hash_table (info)->local_builtins != 0) - { - /* Special marker so we know to switch to the other type of fixup */ - bfd_put_32 (output_bfd, 0, fixup_table); - fixup_table += 4; - bfd_put_32 (output_bfd, 0, fixup_table); - fixup_table += 4; - ++fixups_written; - for (f = linux_hash_table (info)->fixup_list; f != NULL; f = f->next) - { - if (! f->builtin) - continue; - - if (f->h->root.root.type != bfd_link_hash_defined - && f->h->root.root.type != bfd_link_hash_defweak) - { - (*_bfd_error_handler) - ("Symbol %s not defined for fixups\n", - f->h->root.root.root.string); - continue; - } - - is = f->h->root.root.u.def.section; - section_offset = is->output_section->vma + is->output_offset; - new_addr = f->h->root.root.u.def.value + section_offset; - -#ifdef LINUX_LINK_DEBUG - printf ("Fixup(B) %s: %x %x\n", f->h->root.root.string, - new_addr, f->value); -#endif - - bfd_put_32 (output_bfd, new_addr, fixup_table); - fixup_table += 4; - bfd_put_32 (output_bfd, f->value, fixup_table); - fixup_table += 4; - ++fixups_written; - } - } - - if (linux_hash_table (info)->fixup_count != fixups_written) - { - (*_bfd_error_handler) ("Warning: fixup count mismatch\n"); - while (linux_hash_table (info)->fixup_count > fixups_written) - { - bfd_put_32 (output_bfd, 0, fixup_table); - fixup_table += 4; - bfd_put_32 (output_bfd, 0, fixup_table); - fixup_table += 4; - ++fixups_written; - } - } - - h = linux_link_hash_lookup (linux_hash_table (info), - "__BUILTIN_FIXUPS__", - false, false, false); - - if (h != NULL - && (h->root.root.type == bfd_link_hash_defined - || h->root.root.type == bfd_link_hash_defweak)) - { - is = h->root.root.u.def.section; - section_offset = is->output_section->vma + is->output_offset; - new_addr = h->root.root.u.def.value + section_offset; - -#ifdef LINUX_LINK_DEBUG - printf ("Builtin fixup table at %x\n", new_addr); -#endif - - bfd_put_32 (output_bfd, new_addr, fixup_table); - } - else - bfd_put_32 (output_bfd, 0, fixup_table); - - if (bfd_seek (output_bfd, os->filepos + s->output_offset, SEEK_SET) != 0) - return false; - - if (bfd_write ((PTR) s->contents, 1, s->_raw_size, output_bfd) - != s->_raw_size) - return false; - - return true; -} - -#define MY_bfd_link_hash_table_create linux_link_hash_table_create -#define MY_add_one_symbol linux_add_one_symbol -#define MY_finish_dynamic_link linux_finish_dynamic_link - -#define MY_zmagic_contiguous 1 - -#include "aout-target.h" diff --git a/contrib/gdb/bfd/m68klynx.c b/contrib/gdb/bfd/m68klynx.c deleted file mode 100644 index 7acdfbcad21d1..0000000000000 --- a/contrib/gdb/bfd/m68klynx.c +++ /dev/null @@ -1,54 +0,0 @@ -/* BFD back-end for m68k binaries under LynxOS. - Copyright (C) 1990, 1991, 1992 Free Software Foundation, Inc. - -This file is part of BFD, the Binary File Descriptor library. - -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 2 of the License, 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ - -#define BYTES_IN_WORD 4 -#define N_SHARED_LIB(x) 0 - -#define TEXT_START_ADDR 0 -#define TARGET_PAGE_SIZE 4096 -#define SEGMENT_SIZE TARGET_PAGE_SIZE -#define DEFAULT_ARCH bfd_arch_m68k - -#define MY(OP) CAT(m68klynx_aout_,OP) -#define TARGETNAME "a.out-m68k-lynx" - -#include "bfd.h" -#include "sysdep.h" -#include "libbfd.h" - -#include "libaout.h" -#include "aout/aout64.h" - -#define TARGET_IS_BIG_ENDIAN_P - -#ifdef LYNX_CORE - -char *lynx_core_file_failing_command(); -int lynx_core_file_failing_signal(); -boolean lynx_core_file_matches_executable_p(); -const bfd_target *lynx_core_file_p(); - -#define MY_core_file_failing_command lynx_core_file_failing_command -#define MY_core_file_failing_signal lynx_core_file_failing_signal -#define MY_core_file_matches_executable_p lynx_core_file_matches_executable_p -#define MY_core_file_p lynx_core_file_p - -#endif /* LYNX_CORE */ - -#include "aout-target.h" diff --git a/contrib/gdb/bfd/m68knetbsd.c b/contrib/gdb/bfd/m68knetbsd.c deleted file mode 100644 index 3bff530fbc723..0000000000000 --- a/contrib/gdb/bfd/m68knetbsd.c +++ /dev/null @@ -1,35 +0,0 @@ -/* BFD back-end for NetBSD/m68k a.out-ish binaries. - Copyright (C) 1990, 1991, 1992 Free Software Foundation, Inc. - -This file is part of BFD, the Binary File Descriptor library. - -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 2 of the License, 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ - -#define BYTES_IN_WORD 4 -#define TARGET_IS_BIG_ENDIAN_P - -#define TARGET_PAGE_SIZE 8192 -#define SEGMENT_SIZE 8192 - -#define DEFAULT_ARCH bfd_arch_m68k -#define MACHTYPE_OK(mtype) \ - ((mtype) == M_68020 || (mtype) == M_68K_NETBSD || (mtype) == M_68K4K_NETBSD \ - || (mtype) == M_UNKNOWN) - -#define MY(OP) CAT(m68knetbsd_,OP) -/* This needs to start with a.out so GDB knows it is an a.out variant. */ -#define TARGETNAME "a.out-m68k-netbsd" - -#include "netbsd.h" diff --git a/contrib/gdb/bfd/m88kmach3.c b/contrib/gdb/bfd/m88kmach3.c deleted file mode 100644 index 7a56408730080..0000000000000 --- a/contrib/gdb/bfd/m88kmach3.c +++ /dev/null @@ -1,38 +0,0 @@ -/* BFD back-end for Motorola m88k a.out (Mach 3) binaries. - Copyright (C) 1990, 1991, 1993, 1994 Free Software Foundation, Inc. - -This file is part of BFD, the Binary File Descriptor library. - -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 2 of the License, 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ - -#define TARGET_PAGE_SIZE (4096*2) -#define SEGMENT_SIZE 0x20000 -#define TEXT_START_ADDR 0 -#define BYTES_IN_WORD 4 -#define N_HEADER_IN_TEXT(x) 1 /* (N_MAGIG(x) == ZMAGIC) */ -#define N_SHARED_LIB(x) 0 - -#define N_TXTSIZE(x) ((x).a_text) - -#include "bfd.h" -#include "sysdep.h" -#include "libbfd.h" -#include "libaout.h" - -#define DEFAULT_ARCH bfd_arch_m88k -#define MY(OP) CAT(m88kmach3_,OP) -#define TARGETNAME "a.out-m88k-mach3" - -#include "aout-target.h" diff --git a/contrib/gdb/bfd/makefile.dos b/contrib/gdb/bfd/makefile.dos deleted file mode 100644 index 8a22c6af201f9..0000000000000 --- a/contrib/gdb/bfd/makefile.dos +++ /dev/null @@ -1,49 +0,0 @@ -CFLAGS=-O2 - -.c.o : - gcc $(CFLAGS) -I. -I../include -c $< - -all : libbfd.a - -targets.o : targets.c - gcc $(CFLAGS) -I. -I../include -DSELECT_VECS=&go32coff_vec,&i386aout_vec -DDEFAULT_VECTOR=go32coff_vec -c $*.c - -archures.o : archures.c - gcc $(CFLAGS) -I. -I../include -DSELECT_ARCHITECTURES=bfd_i386_arch -c $*.c - -OBJS = \ - libbfd.o \ - opncls.o \ - bfd.o \ - archive.o \ - targets.o \ - cache.o \ - archures.o \ - corefile.o \ - section.o \ - format.o \ - syms.o \ - reloc.o \ - init.o \ - coffgen.o \ - srec.o \ - hash.o \ - linker.o \ - ecoff.o \ - ecofflink.o \ - elf.o \ - aout32.o \ - stab-sym.o \ - i386aout.o \ - cpu-i386.o \ - coff-go32.o \ - cofflink.o \ - elf32.o \ - binary.o \ - tekhex.o \ - $E - -libbfd.a : $(OBJS) - -rm libbfd.a - ar rvs libbfd.a $(OBJS) - ranlib libbfd.a diff --git a/contrib/gdb/bfd/mipsbsd.c b/contrib/gdb/bfd/mipsbsd.c deleted file mode 100644 index 801f3604338e2..0000000000000 --- a/contrib/gdb/bfd/mipsbsd.c +++ /dev/null @@ -1,467 +0,0 @@ -/* BFD backend for MIPS BSD (a.out) binaries. - Copyright (C) 1993, 1994, 1995 Free Software Foundation, Inc. - Written by Ralph Campbell. - -This file is part of BFD, the Binary File Descriptor library. - -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 2 of the License, 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ - -#define BYTES_IN_WORD 4 -/* #define ENTRY_CAN_BE_ZERO */ -#define N_HEADER_IN_TEXT(x) 1 -#define N_SHARED_LIB(x) 0 -#define N_TXTADDR(x) \ - (N_MAGIC(x) != ZMAGIC ? (x).a_entry : /* object file or NMAGIC */\ - TEXT_START_ADDR + EXEC_BYTES_SIZE /* no padding */\ - ) -#define N_DATADDR(x) (N_TXTADDR(x)+N_TXTSIZE(x)) -#define TEXT_START_ADDR 4096 -#define TARGET_PAGE_SIZE 4096 -#define SEGMENT_SIZE TARGET_PAGE_SIZE -#define DEFAULT_ARCH bfd_arch_mips -#define MACHTYPE_OK(mtype) ((mtype) == M_UNKNOWN \ - || (mtype) == M_MIPS1 || (mtype) == M_MIPS2) -#define MY_symbol_leading_char '\0' - -#define MY(OP) CAT(mipsbsd_,OP) - -#include "bfd.h" -#include "sysdep.h" -#include "libbfd.h" -#include "libaout.h" - -#define SET_ARCH_MACH(ABFD, EXEC) \ - MY(set_arch_mach)(ABFD, N_MACHTYPE (EXEC)); \ - MY(choose_reloc_size)(ABFD); -void MY(set_arch_mach) PARAMS ((bfd *abfd, int machtype)); -static void MY(choose_reloc_size) PARAMS ((bfd *abfd)); - -#define MY_write_object_contents MY(write_object_contents) -static boolean MY(write_object_contents) PARAMS ((bfd *abfd)); - -/* We can't use MY(x) here because it leads to a recursive call to CAT - when expanded inside JUMP_TABLE. */ -#define MY_bfd_reloc_type_lookup mipsbsd_reloc_howto_type_lookup -#define MY_canonicalize_reloc mipsbsd_canonicalize_reloc - -#define MY_bfd_link_hash_table_create _bfd_generic_link_hash_table_create -#define MY_bfd_link_add_symbols _bfd_generic_link_add_symbols -#define MY_final_link_callback unused -#define MY_bfd_final_link _bfd_generic_final_link - -#define MY_backend_data &MY(backend_data) -#define MY_BFD_TARGET - -#include "aout-target.h" - -void -MY(set_arch_mach) (abfd, machtype) - bfd *abfd; - int machtype; -{ - enum bfd_architecture arch; - long machine; - - /* Determine the architecture and machine type of the object file. */ - switch (machtype) { - - case M_MIPS1: - arch = bfd_arch_mips; - machine = 3000; - break; - - case M_MIPS2: - arch = bfd_arch_mips; - machine = 4000; - break; - - default: - arch = bfd_arch_obscure; - machine = 0; - break; - } - bfd_set_arch_mach(abfd, arch, machine); -} - -/* Determine the size of a relocation entry, based on the architecture */ -static void -MY(choose_reloc_size) (abfd) - bfd *abfd; -{ - switch (bfd_get_arch(abfd)) { - case bfd_arch_sparc: - case bfd_arch_a29k: - case bfd_arch_mips: - obj_reloc_entry_size (abfd) = RELOC_EXT_SIZE; - break; - default: - obj_reloc_entry_size (abfd) = RELOC_STD_SIZE; - break; - } -} - -/* Write an object file in BSD a.out format. - Section contents have already been written. We write the - file header, symbols, and relocation. */ - -static boolean -MY(write_object_contents) (abfd) - bfd *abfd; -{ - struct external_exec exec_bytes; - struct internal_exec *execp = exec_hdr (abfd); - - /* Magic number, maestro, please! */ - switch (bfd_get_arch(abfd)) { - case bfd_arch_m68k: - switch (bfd_get_mach(abfd)) { - case 68010: - N_SET_MACHTYPE(*execp, M_68010); - break; - default: - case 68020: - N_SET_MACHTYPE(*execp, M_68020); - break; - } - break; - case bfd_arch_sparc: - N_SET_MACHTYPE(*execp, M_SPARC); - break; - case bfd_arch_i386: - N_SET_MACHTYPE(*execp, M_386); - break; - case bfd_arch_a29k: - N_SET_MACHTYPE(*execp, M_29K); - break; - case bfd_arch_mips: - switch (bfd_get_mach(abfd)) { - case 4000: - case 6000: - N_SET_MACHTYPE(*execp, M_MIPS2); - break; - default: - N_SET_MACHTYPE(*execp, M_MIPS1); - break; - } - break; - default: - N_SET_MACHTYPE(*execp, M_UNKNOWN); - } - - MY(choose_reloc_size)(abfd); - - WRITE_HEADERS(abfd, execp); - - return true; -} - -/* - * MIPS relocation types. - */ -#define MIPS_RELOC_32 0 -#define MIPS_RELOC_JMP 1 -#define MIPS_RELOC_WDISP16 2 -#define MIPS_RELOC_HI16 3 -#define MIPS_RELOC_HI16_S 4 -#define MIPS_RELOC_LO16 5 - -/* - * This is only called when performing a BFD_RELOC_MIPS_JMP relocation. - * The jump destination address is formed from the upper 4 bits of the - * "current" program counter concatenated with the jump instruction's - * 26 bit field and two trailing zeros. - * If the destination address is not in the same segment as the "current" - * program counter, then we need to signal an error. - */ -static bfd_reloc_status_type -mips_fix_jmp_addr (abfd,reloc_entry,symbol,data,input_section,output_bfd) - bfd *abfd; - arelent *reloc_entry; - struct symbol_cache_entry *symbol; - PTR data; - asection *input_section; - bfd *output_bfd; -{ - bfd_vma relocation, pc; - - /* If this is a partial relocation, just continue. */ - if (output_bfd != (bfd *)NULL) - return bfd_reloc_continue; - - /* If this is an undefined symbol, return error */ - if (bfd_is_und_section (symbol->section) - && (symbol->flags & BSF_WEAK) == 0) - return bfd_reloc_undefined; - - /* - * Work out which section the relocation is targetted at and the - * initial relocation command value. - */ - if (bfd_is_com_section (symbol->section)) - relocation = 0; - else - relocation = symbol->value; - - relocation += symbol->section->output_section->vma; - relocation += symbol->section->output_offset; - relocation += reloc_entry->addend; - - pc = input_section->output_section->vma + input_section->output_offset + - reloc_entry->address + 4; - - if ((relocation & 0xF0000000) != (pc & 0xF0000000)) - return bfd_reloc_overflow; - - return bfd_reloc_continue; -} - -/* - * This is only called when performing a BFD_RELOC_HI16_S relocation. - * We need to see if bit 15 is set in the result. If it is, we add - * 0x10000 and continue normally. This will compensate for the sign extension - * when the low bits are added at run time. - */ -static bfd_reloc_status_type -mips_fix_hi16_s PARAMS ((bfd *, arelent *, asymbol *, PTR, - asection *, bfd *, char **)); - -static bfd_reloc_status_type -mips_fix_hi16_s (abfd, reloc_entry, symbol, data, input_section, - output_bfd, error_message) - bfd *abfd; - arelent *reloc_entry; - asymbol *symbol; - PTR data; - asection *input_section; - bfd *output_bfd; - char **error_message; -{ - bfd_vma relocation; - - /* If this is a partial relocation, just continue. */ - if (output_bfd != (bfd *)NULL) - return bfd_reloc_continue; - - /* If this is an undefined symbol, return error */ - if (bfd_is_und_section (symbol->section) - && (symbol->flags & BSF_WEAK) == 0) - return bfd_reloc_undefined; - - /* - * Work out which section the relocation is targetted at and the - * initial relocation command value. - */ - if (bfd_is_com_section (symbol->section)) - relocation = 0; - else - relocation = symbol->value; - - relocation += symbol->section->output_section->vma; - relocation += symbol->section->output_offset; - relocation += reloc_entry->addend; - - if (relocation & 0x8000) - reloc_entry->addend += 0x10000; - - return bfd_reloc_continue; -} - -static reloc_howto_type mips_howto_table_ext[] = { - {MIPS_RELOC_32, 0, 2, 32, false, 0, complain_overflow_bitfield, 0, - "32", false, 0, 0xffffffff, false}, - {MIPS_RELOC_JMP, 2, 2, 26, false, 0, complain_overflow_dont, - mips_fix_jmp_addr, - "MIPS_JMP", false, 0, 0x03ffffff, false}, - {MIPS_RELOC_WDISP16, 2, 2, 16, true, 0, complain_overflow_signed, 0, - "WDISP16", false, 0, 0x0000ffff, false}, - {MIPS_RELOC_HI16, 16, 2, 16, false, 0, complain_overflow_bitfield, 0, - "HI16", false, 0, 0x0000ffff, false}, - {MIPS_RELOC_HI16_S, 16, 2, 16, false, 0, complain_overflow_bitfield, - mips_fix_hi16_s, - "HI16_S", false, 0, 0x0000ffff, false}, - {MIPS_RELOC_LO16, 0, 2, 16, false, 0, complain_overflow_dont, 0, - "LO16", false, 0, 0x0000ffff, false}, -}; - -static reloc_howto_type * -MY(reloc_howto_type_lookup) (abfd, code) - bfd *abfd; - bfd_reloc_code_real_type code; -{ - - if (bfd_get_arch (abfd) != bfd_arch_mips) - return 0; - - switch (code) - { - case BFD_RELOC_CTOR: - case BFD_RELOC_32: - return (&mips_howto_table_ext[MIPS_RELOC_32]); - case BFD_RELOC_MIPS_JMP: - return (&mips_howto_table_ext[MIPS_RELOC_JMP]); - case BFD_RELOC_16_PCREL_S2: - return (&mips_howto_table_ext[MIPS_RELOC_WDISP16]); - case BFD_RELOC_HI16: - return (&mips_howto_table_ext[MIPS_RELOC_HI16]); - case BFD_RELOC_HI16_S: - return (&mips_howto_table_ext[MIPS_RELOC_HI16_S]); - case BFD_RELOC_LO16: - return (&mips_howto_table_ext[MIPS_RELOC_LO16]); - default: - return 0; - } -} - -/* - * This is just like the standard aoutx.h version but we need to do our - * own mapping of external reloc type values to howto entries. - */ -long -MY(canonicalize_reloc)(abfd, section, relptr, symbols) - bfd *abfd; - sec_ptr section; - arelent **relptr; - asymbol **symbols; -{ - arelent *tblptr = section->relocation; - unsigned int count, c; - extern reloc_howto_type NAME(aout,ext_howto_table)[]; - - /* If we have already read in the relocation table, return the values. */ - if (section->flags & SEC_CONSTRUCTOR) { - arelent_chain *chain = section->constructor_chain; - - for (count = 0; count < section->reloc_count; count++) { - *relptr++ = &chain->relent; - chain = chain->next; - } - *relptr = 0; - return section->reloc_count; - } - if (tblptr && section->reloc_count) { - for (count = 0; count++ < section->reloc_count;) - *relptr++ = tblptr++; - *relptr = 0; - return section->reloc_count; - } - - if (!NAME(aout,slurp_reloc_table)(abfd, section, symbols)) - return -1; - tblptr = section->relocation; - - /* fix up howto entries */ - for (count = 0; count++ < section->reloc_count;) - { - c = tblptr->howto - NAME(aout,ext_howto_table); - tblptr->howto = &mips_howto_table_ext[c]; - - *relptr++ = tblptr++; - } - *relptr = 0; - return section->reloc_count; -} - -static CONST struct aout_backend_data MY(backend_data) = { - 0, /* zmagic contiguous */ - 1, /* text incl header */ - 0, /* exec_hdr_flags */ - TARGET_PAGE_SIZE, /* text vma */ - MY_set_sizes, - 0, /* text size includes exec header */ - 0, /* add_dynamic_symbols */ - 0, /* add_one_symbol */ - 0, /* link_dynamic_object */ - 0, /* write_dynamic_symbol */ - 0, /* check_dynamic_reloc */ - 0 /* finish_dynamic_link */ -}; - -const bfd_target aout_mips_little_vec = -{ - "a.out-mips-little", /* name */ - bfd_target_aout_flavour, - BFD_ENDIAN_LITTLE, /* target byte order (little) */ - BFD_ENDIAN_LITTLE, /* target headers byte order (little) */ - (HAS_RELOC | EXEC_P | /* object flags */ - HAS_LINENO | HAS_DEBUG | - HAS_SYMS | HAS_LOCALS | WP_TEXT | D_PAGED), - (SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD | SEC_RELOC), /* section flags */ - MY_symbol_leading_char, - ' ', /* ar_pad_char */ - 15, /* ar_max_namelen */ - bfd_getl64, bfd_getl_signed_64, bfd_putl64, - bfd_getl32, bfd_getl_signed_32, bfd_putl32, - bfd_getl16, bfd_getl_signed_16, bfd_putl16, /* data */ - bfd_getl64, bfd_getl_signed_64, bfd_putl64, - bfd_getl32, bfd_getl_signed_32, bfd_putl32, - bfd_getl16, bfd_getl_signed_16, bfd_putl16, /* hdrs */ - {_bfd_dummy_target, MY_object_p, /* bfd_check_format */ - bfd_generic_archive_p, MY_core_file_p}, - {bfd_false, MY_mkobject, /* bfd_set_format */ - _bfd_generic_mkarchive, bfd_false}, - {bfd_false, MY_write_object_contents, /* bfd_write_contents */ - _bfd_write_archive_contents, bfd_false}, - - BFD_JUMP_TABLE_GENERIC (MY), - BFD_JUMP_TABLE_COPY (MY), - BFD_JUMP_TABLE_CORE (MY), - BFD_JUMP_TABLE_ARCHIVE (MY), - BFD_JUMP_TABLE_SYMBOLS (MY), - BFD_JUMP_TABLE_RELOCS (MY), - BFD_JUMP_TABLE_WRITE (MY), - BFD_JUMP_TABLE_LINK (MY), - BFD_JUMP_TABLE_DYNAMIC (_bfd_nodynamic), - - (PTR) MY_backend_data, -}; - -const bfd_target aout_mips_big_vec = -{ - "a.out-mips-big", /* name */ - bfd_target_aout_flavour, - BFD_ENDIAN_BIG, /* target byte order (big) */ - BFD_ENDIAN_BIG, /* target headers byte order (big) */ - (HAS_RELOC | EXEC_P | /* object flags */ - HAS_LINENO | HAS_DEBUG | - HAS_SYMS | HAS_LOCALS | WP_TEXT | D_PAGED), - (SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD | SEC_RELOC), /* section flags */ - MY_symbol_leading_char, - ' ', /* ar_pad_char */ - 15, /* ar_max_namelen */ - bfd_getb64, bfd_getb_signed_64, bfd_putb64, - bfd_getb32, bfd_getb_signed_32, bfd_putb32, - bfd_getb16, bfd_getb_signed_16, bfd_putb16, /* data */ - bfd_getb64, bfd_getb_signed_64, bfd_putb64, - bfd_getb32, bfd_getb_signed_32, bfd_putb32, - bfd_getb16, bfd_getb_signed_16, bfd_putb16, /* hdrs */ - {_bfd_dummy_target, MY_object_p, /* bfd_check_format */ - bfd_generic_archive_p, MY_core_file_p}, - {bfd_false, MY_mkobject, /* bfd_set_format */ - _bfd_generic_mkarchive, bfd_false}, - {bfd_false, MY_write_object_contents, /* bfd_write_contents */ - _bfd_write_archive_contents, bfd_false}, - - BFD_JUMP_TABLE_GENERIC (MY), - BFD_JUMP_TABLE_COPY (MY), - BFD_JUMP_TABLE_CORE (MY), - BFD_JUMP_TABLE_ARCHIVE (MY), - BFD_JUMP_TABLE_SYMBOLS (MY), - BFD_JUMP_TABLE_RELOCS (MY), - BFD_JUMP_TABLE_WRITE (MY), - BFD_JUMP_TABLE_LINK (MY), - BFD_JUMP_TABLE_DYNAMIC (_bfd_nodynamic), - - (PTR) MY_backend_data, -}; diff --git a/contrib/gdb/bfd/mpw-config.in b/contrib/gdb/bfd/mpw-config.in deleted file mode 100644 index 9195d0e645474..0000000000000 --- a/contrib/gdb/bfd/mpw-config.in +++ /dev/null @@ -1,73 +0,0 @@ -# Configuration fragment for BFD. - -# This is almost always correct. - -Set selarchs "&bfd_{target_cpu}_arch" -Set defvec "" -Set selvecs "" - -If "{target_canonical}" =~ /m68k-apple-macos/ - Set BFD_BACKENDS '"{o}"coff-m68k.c.o "{o}"cofflink.c.o' - Set defvec m68kcoff_vec - Set selvecs '&m68kcoff_vec' - -Else If "{target_canonical}" =~ /powerpc-apple-macos/ - Set BFD_BACKENDS '"{o}"coff-pmac.c.o "{o}"xcofflink.c.o' - Set defvec pmac_xcoff_vec - Set selvecs '&pmac_xcoff_vec' - Set selarchs "&bfd_powerpc_arch" - -Else If "{target_canonical}" =~ /i386-unknown-go32/ - Set BFD_BACKENDS '"{o}"coff-i386.c.o' - Set defvec i386coff_vec - Set selvecs '&i386coff_vec' - -Else If "{target_canonical}" =~ /mips-\Option-x-\Option-x/ - Set BFD_BACKENDS '"{o}"coff-mips.c.o "{o}"ecoff.c.o "{o}"ecofflink.c.o' - Set defvec ecoff_big_vec - Set selvecs '&ecoff_big_vec,&ecoff_little_vec' - -Else If "{target_canonical}" =~ /sh-hitachi-hms/ - Set BFD_BACKENDS '"{o}"coff-sh.c.o "{o}"cofflink.c.o' - Set defvec shcoff_vec - Set selvecs '&shcoff_vec,&shlcoff_vec' -End If - -Set ta `echo {selarchs} | sed -e 's/&bfd_/{o}cpu-/g' -e 's/_arch/.c.o/g'` - -Set tdefaults "-d DEFAULT_VECTOR={defvec} -d SELECT_VECS={selvecs} -d SELECT_ARCHITECTURES={selarchs}" - -Echo '# From mpw-config.in' > "{o}"mk.tmp -Echo 'WORDSIZE = 32' >> "{o}"mk.tmp -Echo 'BFD_MACHINES = ' {ta} >> "{o}"mk.tmp -Echo 'BFD_BACKENDS = ' {BFD_BACKENDS} >> "{o}"mk.tmp -Echo 'TDEFAULTS = ' {tdefaults} >> "{o}"mk.tmp -Echo 'HDEPFILES = ' >> "{o}"mk.tmp -Echo 'TDEPFILES = ' >> "{o}"mk.tmp -Echo '# End from mpw-config.in' >> "{o}"mk.tmp - -Echo '/* config.h. Generated by mpw-configure. */' > "{o}"config.new -Echo '#include "mpw.h"' >> "{o}"config.new - -MoveIfChange "{o}"config.new "{o}"config.h - -# We can only handle 32-bit targets right now. - -sed -e 's/@WORDSIZE@/32/' \Option-d - -e "s/@VERSION@/`Catenate {srcdir}VERSION`/" \Option-d - -e 's/@BFD_HOST_64BIT_LONG@/0/' \Option-d - "{srcdir}"bfd-in2.h >"{o}"bfd.h-new - -MoveIfChange "{o}"bfd.h-new "{o}"bfd.h - -# Pre-expand some macros in coffswap.h, so MPW C doesn't choke. - -sed -e 's/^ PUT_AOUTHDR_TSIZE (/ bfd_h_put_32 (/' \Option-d - -e 's/^ PUT_AOUTHDR_DSIZE (/ bfd_h_put_32 (/' \Option-d - -e 's/^ PUT_AOUTHDR_BSIZE (/ bfd_h_put_32 (/' \Option-d - -e 's/^ PUT_AOUTHDR_ENTRY (/ bfd_h_put_32 (/' \Option-d - -e 's/^ PUT_AOUTHDR_TEXT_START (/ bfd_h_put_32 (/' \Option-d - -e 's/^ PUT_AOUTHDR_DATA_START (/ bfd_h_put_32 (/' \Option-d - "{srcdir}"coffswap.h >"{o}"coffswap.h-new - -MoveIfChange "{o}"coffswap.h-new "{o}"coffswap.h diff --git a/contrib/gdb/bfd/mpw-make.sed b/contrib/gdb/bfd/mpw-make.sed deleted file mode 100644 index a989ef005ff2c..0000000000000 --- a/contrib/gdb/bfd/mpw-make.sed +++ /dev/null @@ -1,70 +0,0 @@ -# Sed commands to finish translating the Unix BFD Makefile into MPW syntax. - -# Whack out unused host and target define bits. -/HDEFINES/s/@HDEFINES@// -/TDEFINES/s/@TDEFINES@// - -/INCDIR=/s/"{srcdir}":/"{topsrcdir}"/ -/^CSEARCH = .*$/s/$/ -i "{INCDIR}":mpw: -i ::extra-include:/ - -/WORDSIZE/s/^WORDSIZE = /#WORDSIZE = / -/BFD_MACHINES/s/^BFD_MACHINES = /#BFD_MACHINES = / -/BFD_BACKENDS/s/^BFD_BACKENDS = /#BFD_BACKENDS = / -/TDEFAULTS/s/^TDEFAULTS = /#TDEFAULTS = / - -# Remove extra, useless, "all". -/^all \\Option-f _oldest/,/^$/d - -# Remove the Makefile rebuild rule. -/^Makefile /,/--recheck/d - -# Don't do any recursive subdir stuff. -/ subdir_do/s/{MAKE}/null-command/ - -/BFD_H/s/^{BFD_H}/#{BFD_H}/ - -# Point at include files that are always in the objdir. -/bfd/s/"{s}"bfd\.h/"{o}"bfd.h/g -/config/s/"{s}"config\.h/"{o}"config.h/g -/elf32-target/s/"{s}"elf32-target\.h/"{o}"elf32-target.h/g -/elf64-target/s/"{s}"elf64-target\.h/"{o}"elf64-target.h/g - -/"{s}"{INCDIR}/s/"{s}"{INCDIR}/"{INCDIR}"/g - -/dep/s/\.dep/__dep/g - -# Removing duplicates is cool but presently unnecessary, -# so whack this out. -/^ofiles \\Option-f/,/^$/d -/ofiles/s/{OFILES} ofiles/{OFILES}/ -/echo ofiles = /d -/cat ofiles/s/`cat ofiles`/{OFILES}/ - -# No corefile support. -/COREFILE/s/@COREFILE@// -/COREFLAG/s/@COREFLAG@// - -# No PIC foolery in this environment. -/@ALLLIBS@/s/@ALLLIBS@/{TARGETLIB}/ -/@PICLIST@/s/@PICLIST@// -/@PICFLAG@/s/@PICFLAG@// -/^{OFILES} \\Option-f stamp-picdir/,/^$/d - -# Remove the pic trickery from the default build rule. -/^\.c\.o \\Option-f /,/End If/c\ -.c.o \\Option-f .c - -# MPW Make doesn't know about $<. -/"{o}"targets.c.o \\Option-f "{s}"targets.c Makefile/,/^$/c\ -"{o}"targets.c.o \\Option-f "{s}"targets.c Makefile\ - {CC} {ALL_CFLAGS} {TDEFAULTS} "{s}"targets.c -o "{o}"targets.c.o - -/"{o}"archures.c.o \\Option-f "{s}"archures.c Makefile/,/^$/c\ -"{o}"archures.c.o \\Option-f "{s}"archures.c Makefile\ - {CC} {ALL_CFLAGS} {TDEFAULTS} "{s}"archures.c -o "{o}"archures.c.o - -# Remove the .h rebuilding rules, we don't currently have a doc subdir, -# or a way to build the prototype-hacking tool that's in it. -/^"{srcdir}"bfd-in2.h \\Option-f /,/^$/d -/^"{srcdir}"libbfd.h \\Option-f /,/^$/d -/^"{srcdir}"libcoff.h \\Option-f /,/^$/d diff --git a/contrib/gdb/bfd/netbsd-core.c b/contrib/gdb/bfd/netbsd-core.c deleted file mode 100644 index 4e8286797963f..0000000000000 --- a/contrib/gdb/bfd/netbsd-core.c +++ /dev/null @@ -1,310 +0,0 @@ -/* BFD back end for NetBSD style core files - Copyright 1988, 1989, 1991, 1992, 1993, 1996 Free Software Foundation, Inc. - Written by Paul Kranenburg, EUR - -This file is part of BFD, the Binary File Descriptor library. - -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 2 of the License, 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ - -#include "bfd.h" -#include "sysdep.h" -#include "libbfd.h" -#include "libaout.h" /* BFD a.out internal data structures */ - -#include <stdio.h> -#include <sys/types.h> -#include <sys/param.h> -#include <sys/dir.h> -#include <signal.h> -#include <sys/core.h> -#include <errno.h> - -/* - * FIXME: On NetBSD/sparc CORE_FPU_OFFSET should be (sizeof(struct trapframe)) - */ - -struct netbsd_core_struct { - struct core core; -} *rawptr; - -/* forward declarations */ - -static const bfd_target * netbsd_core_core_file_p PARAMS ((bfd *abfd)); -static char * netbsd_core_core_file_failing_command PARAMS ((bfd *abfd)); -static int netbsd_core_core_file_failing_signal PARAMS ((bfd *abfd)); -static boolean netbsd_core_core_file_matches_executable_p - PARAMS ((bfd *core_bfd, bfd *exec_bfd)); - -/* Handle NetBSD-style core dump file. */ - -/* ARGSUSED */ -static const bfd_target * -netbsd_core_core_file_p (abfd) - bfd *abfd; - -{ - int i, val, offset; - asection *asect, *asect2; - struct core core; - struct coreseg coreseg; - - val = bfd_read ((void *)&core, 1, sizeof core, abfd); - if (val != sizeof core) { - /* Too small to be a core file */ - bfd_set_error(bfd_error_wrong_format); - return 0; - } - - if (CORE_GETMAGIC(core) != COREMAGIC) { - bfd_set_error(bfd_error_wrong_format); - return 0; - } - - rawptr = (struct netbsd_core_struct *) - bfd_zalloc (abfd, sizeof (struct netbsd_core_struct)); - if (rawptr == NULL) { - bfd_set_error(bfd_error_no_memory); - return 0; - } - - rawptr->core = core; - abfd->tdata.netbsd_core_data = rawptr; - - offset = core.c_hdrsize; - for (i = 0; i < core.c_nseg; i++) { - - if (bfd_seek (abfd, offset, SEEK_SET) != 0) - goto punt; - - val = bfd_read ((void *)&coreseg, 1, sizeof coreseg, abfd); - if (val != sizeof coreseg) { - bfd_set_error(bfd_error_file_truncated); - goto punt; - } - if (CORE_GETMAGIC(coreseg) != CORESEGMAGIC) { - bfd_set_error(bfd_error_wrong_format); - goto punt; - } - - offset += core.c_seghdrsize; - - asect = (asection *) bfd_zalloc (abfd, sizeof(asection)); - if (asect == NULL) { - bfd_set_error(bfd_error_no_memory); - } - - asect->_raw_size = coreseg.c_size; - asect->vma = coreseg.c_addr; - asect->filepos = offset; - asect->alignment_power = 2; - asect->next = abfd->sections; - abfd->sections = asect; - abfd->section_count++; - offset += coreseg.c_size; - - switch (CORE_GETFLAG(coreseg)) { - case CORE_CPU: - asect->name = ".reg"; - asect->flags = SEC_ALLOC + SEC_HAS_CONTENTS; -#ifdef CORE_FPU_OFFSET - /* Hackish... */ - asect->_raw_size = CORE_FPU_OFFSET; - asect2 = (asection *)bfd_zalloc (abfd, - sizeof (asection)); - if (asect2 == NULL) { - bfd_set_error(bfd_error_no_memory); - goto punt; - } - asect2->_raw_size = coreseg.c_size - CORE_FPU_OFFSET; - asect2->vma = 0; - asect2->filepos = asect->filepos + CORE_FPU_OFFSET; - asect2->alignment_power = 2; - asect2->next = abfd->sections; - asect2->name = ".reg2"; - asect2->flags = SEC_ALLOC + SEC_HAS_CONTENTS; - abfd->sections = asect2; - abfd->section_count++; -#endif - - break; - case CORE_DATA: - asect->name = ".data"; - asect->flags = SEC_ALLOC+SEC_LOAD+SEC_HAS_CONTENTS; - break; - case CORE_STACK: - asect->name = ".stack"; - asect->flags = SEC_ALLOC+SEC_LOAD+SEC_HAS_CONTENTS; - break; - } - } - - /* OK, we believe you. You're a core file (sure, sure). */ - return abfd->xvec; - -punt: { - asection *anext; - for (asect = abfd->sections; asect; asect = anext) { - anext = asect->next; - free((void *)asect); - } - } - free ((void *)rawptr); - abfd->tdata.netbsd_core_data = NULL; - abfd->sections = NULL; - abfd->section_count = 0; - return 0; -} - -static char* -netbsd_core_core_file_failing_command (abfd) - bfd *abfd; -{ - /*return core_command (abfd);*/ - return abfd->tdata.netbsd_core_data->core.c_name; -} - -/* ARGSUSED */ -static int -netbsd_core_core_file_failing_signal (abfd) - bfd *abfd; -{ - /*return core_signal (abfd);*/ - return abfd->tdata.netbsd_core_data->core.c_signo; -} - -/* ARGSUSED */ -static boolean -netbsd_core_core_file_matches_executable_p (core_bfd, exec_bfd) - bfd *core_bfd, *exec_bfd; -{ - return true; /* FIXME, We have no way of telling at this point */ -} - -/* No archive file support via this BFD */ -#define netbsd_openr_next_archived_file bfd_generic_openr_next_archived_file -#define netbsd_generic_stat_arch_elt bfd_generic_stat_arch_elt -#define netbsd_slurp_armap bfd_false -#define netbsd_slurp_extended_name_table bfd_true -#define netbsd_write_armap (boolean (*) PARAMS \ - ((bfd *arch, unsigned int elength, struct orl *map, \ - unsigned int orl_count, int stridx))) bfd_false -#define netbsd_truncate_arname bfd_dont_truncate_arname -#define aout_32_openr_next_archived_file bfd_generic_openr_next_archived_file - -#define netbsd_close_and_cleanup bfd_generic_close_and_cleanup -#define netbsd_set_section_contents (boolean (*) PARAMS \ - ((bfd *abfd, asection *section, PTR data, file_ptr offset, \ - bfd_size_type count))) bfd_false -#define netbsd_get_section_contents bfd_generic_get_section_contents -#define netbsd_new_section_hook (boolean (*) PARAMS \ - ((bfd *, sec_ptr))) bfd_true -#define netbsd_get_symtab_upper_bound bfd_0u -#define netbsd_get_symtab (unsigned int (*) PARAMS \ - ((bfd *, struct symbol_cache_entry **))) bfd_0u -#define netbsd_get_reloc_upper_bound (unsigned int (*) PARAMS \ - ((bfd *, sec_ptr))) bfd_0u -#define netbsd_canonicalize_reloc (unsigned int (*) PARAMS \ - ((bfd *, sec_ptr, arelent **, struct symbol_cache_entry**))) bfd_0u -#define netbsd_make_empty_symbol (struct symbol_cache_entry * \ - (*) PARAMS ((bfd *))) bfd_false -#define netbsd_print_symbol (void (*) PARAMS \ - ((bfd *, PTR, struct symbol_cache_entry *, \ - bfd_print_symbol_type))) bfd_false -#define netbsd_get_symbol_info (void (*) PARAMS \ - ((bfd *, struct symbol_cache_entry *, \ - symbol_info *))) bfd_false -#define netbsd_get_lineno (alent * (*) PARAMS \ - ((bfd *, struct symbol_cache_entry *))) bfd_nullvoidptr -#define netbsd_set_arch_mach (boolean (*) PARAMS \ - ((bfd *, enum bfd_architecture, unsigned long))) bfd_false -#define netbsd_find_nearest_line (boolean (*) PARAMS \ - ((bfd *abfd, struct sec *section, \ - struct symbol_cache_entry **symbols,bfd_vma offset, \ - CONST char **file, CONST char **func, unsigned int *line))) bfd_false -#define netbsd_sizeof_headers (int (*) PARAMS \ - ((bfd *, boolean))) bfd_0 - -#define netbsd_bfd_debug_info_start bfd_void -#define netbsd_bfd_debug_info_end bfd_void -#define netbsd_bfd_debug_info_accumulate (void (*) PARAMS \ - ((bfd *, struct sec *))) bfd_void -#define netbsd_bfd_get_relocated_section_contents bfd_generic_get_relocated_section_contents -#define netbsd_bfd_relax_section bfd_generic_relax_section -#define netbsd_bfd_seclet_link \ - ((boolean (*) PARAMS ((bfd *, PTR, boolean))) bfd_false) -#define netbsd_bfd_reloc_type_lookup \ - ((CONST struct reloc_howto_struct *(*) PARAMS ((bfd *, bfd_reloc_code_real_type))) bfd_nullvoidptr) -#define netbsd_bfd_make_debug_symbol \ - ((asymbol *(*) PARAMS ((bfd *, void *, unsigned long))) bfd_nullvoidptr) - -/* If somebody calls any byte-swapping routines, shoot them. */ -static void -swap_abort() -{ - abort(); /* This way doesn't require any declaration for ANSI to fuck up */ -} -#define NO_GET ((bfd_vma (*) PARAMS (( const bfd_byte *))) swap_abort ) -#define NO_PUT ((void (*) PARAMS ((bfd_vma, bfd_byte *))) swap_abort ) -#define NO_SIGNED_GET \ - ((bfd_signed_vma (*) PARAMS (( const bfd_byte *))) swap_abort ) - -const bfd_target netbsd_core_vec = - { - "netbsd-core", - bfd_target_unknown_flavour, - true, /* target byte order */ - true, /* target headers byte order */ - (HAS_RELOC | EXEC_P | /* object flags */ - HAS_LINENO | HAS_DEBUG | - HAS_SYMS | HAS_LOCALS | DYNAMIC | WP_TEXT | D_PAGED), - (SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD | SEC_RELOC), /* section flags */ - 0, /* symbol prefix */ - ' ', /* ar_pad_char */ - 16, /* ar_max_namelen */ - 3, /* minimum alignment power */ - NO_GET, NO_SIGNED_GET, NO_PUT, /* 64 bit data */ - NO_GET, NO_SIGNED_GET, NO_PUT, /* 32 bit data */ - NO_GET, NO_SIGNED_GET, NO_PUT, /* 16 bit data */ - NO_GET, NO_SIGNED_GET, NO_PUT, /* 64 bit hdrs */ - NO_GET, NO_SIGNED_GET, NO_PUT, /* 32 bit hdrs */ - NO_GET, NO_SIGNED_GET, NO_PUT, /* 16 bit hdrs */ - - { /* bfd_check_format */ - _bfd_dummy_target, /* unknown format */ - _bfd_dummy_target, /* object file */ - _bfd_dummy_target, /* archive */ - netbsd_core_core_file_p /* a core file */ - }, - { /* bfd_set_format */ - bfd_false, bfd_false, - bfd_false, bfd_false - }, - { /* bfd_write_contents */ - bfd_false, bfd_false, - bfd_false, bfd_false - }, - - BFD_JUMP_TABLE_GENERIC (_bfd_generic), - BFD_JUMP_TABLE_COPY (_bfd_generic), - BFD_JUMP_TABLE_CORE (netbsd_core), - BFD_JUMP_TABLE_ARCHIVE (_bfd_noarchive), - BFD_JUMP_TABLE_SYMBOLS (_bfd_nosymbols), - BFD_JUMP_TABLE_RELOCS (_bfd_norelocs), - BFD_JUMP_TABLE_WRITE (_bfd_generic), - BFD_JUMP_TABLE_LINK (_bfd_nolink), - BFD_JUMP_TABLE_DYNAMIC (_bfd_nodynamic), - - (PTR) 0 /* backend_data */ -}; diff --git a/contrib/gdb/bfd/netbsd.h b/contrib/gdb/bfd/netbsd.h deleted file mode 100644 index dd73d37e789be..0000000000000 --- a/contrib/gdb/bfd/netbsd.h +++ /dev/null @@ -1,108 +0,0 @@ -/* BFD back-end definitions used by all NetBSD targets. - Copyright (C) 1990, 1991, 1992 Free Software Foundation, Inc. - -This file is part of BFD, the Binary File Descriptor library. - -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 2 of the License, 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -*/ - -/* NetBSD fits its header into the start of its text segment */ -#define N_HEADER_IN_TEXT(x) 1 -#define TEXT_START_ADDR TARGET_PAGE_SIZE - -#define N_MACHTYPE(exec) \ - ((enum machine_type)(((exec).a_info >> 16) & 0x03ff)) -#define N_FLAGS(exec) \ - (((exec).a_info >> 26) & 0x3f) - -#define N_SET_INFO(exec, magic, type, flags) \ - ((exec).a_info = ((magic) & 0xffff) \ - | (((int)(type) & 0x3ff) << 16) \ - | (((flags) & 0x3f) << 24)) -#define N_SET_MACHTYPE(exec, machtype) \ - ((exec).a_info = \ - ((exec).a_info & 0xfb00ffff) | ((((int)(machtype))&0x3ff) << 16)) -#define N_SET_FLAGS(exec, flags) \ - ((exec).a_info = \ - ((exec).a_info & 0x03ffffff) | ((flags & 0x03f) << 26)) - -#include "bfd.h" -#include "sysdep.h" -#include "libbfd.h" -#include "libaout.h" - -/* On NetBSD, the magic number is always in ntohl's "network" (big-endian) - format. */ -#define SWAP_MAGIC(ext) bfd_getb32 (ext) - - -#define MY_write_object_contents MY(write_object_contents) -static boolean MY(write_object_contents) PARAMS ((bfd *abfd)); -#define MY_text_includes_header 1 - -#include "aout-target.h" - -/* Write an object file. - Section contents have already been written. We write the - file header, symbols, and relocation. */ - -static boolean -MY(write_object_contents) (abfd) - bfd *abfd; -{ - struct external_exec exec_bytes; - struct internal_exec *execp = exec_hdr (abfd); - -#if CHOOSE_RELOC_SIZE - CHOOSE_RELOC_SIZE(abfd); -#else - obj_reloc_entry_size (abfd) = RELOC_STD_SIZE; -#endif - - /* Magic number, maestro, please! */ - switch (bfd_get_arch(abfd)) { - case bfd_arch_m68k: - if (strcmp (abfd->xvec->name, "a.out-m68k4k-netbsd") == 0) - N_SET_MACHTYPE(*execp, M_68K4K_NETBSD); - else - N_SET_MACHTYPE(*execp, M_68K_NETBSD); - break; - case bfd_arch_sparc: - N_SET_MACHTYPE(*execp, M_SPARC_NETBSD); - break; - case bfd_arch_i386: - N_SET_MACHTYPE(*execp, M_386_NETBSD); - break; - case bfd_arch_ns32k: - N_SET_MACHTYPE(*execp, M_532_NETBSD); - break; - default: - N_SET_MACHTYPE(*execp, M_UNKNOWN); - break; - } - - /* The NetBSD magic number is always big-endian */ -#ifndef TARGET_IS_BIG_ENDIAN_P - /* XXX aren't there any macro to change byteorder of a word independent of - the host's or target's endianesses? */ - execp->a_info - = (execp->a_info & 0xff) << 24 | (execp->a_info & 0xff00) << 8 - | (execp->a_info & 0xff0000) >> 8 | (execp->a_info & 0xff000000) >> 24; -#endif - - WRITE_HEADERS(abfd, execp); - - return true; -} diff --git a/contrib/gdb/bfd/newsos3.c b/contrib/gdb/bfd/newsos3.c deleted file mode 100644 index 7ec7a75a87c0f..0000000000000 --- a/contrib/gdb/bfd/newsos3.c +++ /dev/null @@ -1,40 +0,0 @@ -/* BFD back-end for NewsOS3 (Sony, 68k) binaries. - Copyright (C) 1990, 91, 92, 93, 94 Free Software Foundation, Inc. - -This file is part of BFD, the Binary File Descriptor library. - -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 2 of the License, 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ - -#define TARGET_PAGE_SIZE 4096 -#define SEGMENT_SIZE TARGET_PAGE_SIZE -#define TEXT_START_ADDR 0 -#define BYTES_IN_WORD 4 -#define MY(OP) CAT(newsos3_,OP) -#define TARGETNAME "a.out-newsos3" -#define ENTRY_CAN_BE_ZERO -#define N_SHARED_LIB(x) 0 /* Avoids warning when compiled with -Wall. */ -#define DEFAULT_ARCH bfd_arch_m68k -#define TARGET_IS_BIG_ENDIAN_P -#define N_HEADER_IN_TEXT(x) 0 - -#include "bfd.h" -#include "sysdep.h" -#include "libbfd.h" -#include "aout/aout64.h" -#include "aout/stab_gnu.h" -#include "aout/ar.h" -#include "libaout.h" /* BFD a.out internal data structures */ - -#include "aout-target.h" diff --git a/contrib/gdb/bfd/nlm-target.h b/contrib/gdb/bfd/nlm-target.h deleted file mode 100644 index cdd3fa8b22e60..0000000000000 --- a/contrib/gdb/bfd/nlm-target.h +++ /dev/null @@ -1,228 +0,0 @@ -/* Target definitions for 32/64-bit NLM (NetWare Loadable Module) - Copyright (C) 1993, 1994 Free Software Foundation, Inc. - -This file is part of BFD, the Binary File Descriptor library. - -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 2 of the License, 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ - -#define nlm_core_file_p _bfd_dummy_target - -#define nlm_get_symtab_upper_bound nlmNAME(get_symtab_upper_bound) -#define nlm_get_symtab nlmNAME(get_symtab) -#define nlm_make_empty_symbol nlmNAME(make_empty_symbol) -#define nlm_print_symbol nlmNAME(print_symbol) -#define nlm_get_symbol_info nlmNAME(get_symbol_info) -#define nlm_bfd_is_local_label bfd_generic_is_local_label -#define nlm_get_lineno _bfd_nosymbols_get_lineno -#define nlm_find_nearest_line _bfd_nosymbols_find_nearest_line -#define nlm_bfd_make_debug_symbol _bfd_nosymbols_bfd_make_debug_symbol -#define nlm_read_minisymbols _bfd_generic_read_minisymbols -#define nlm_minisymbol_to_symbol _bfd_generic_minisymbol_to_symbol - -#define nlm_get_reloc_upper_bound nlmNAME(get_reloc_upper_bound) -#define nlm_canonicalize_reloc nlmNAME(canonicalize_reloc) -#define nlm_bfd_reloc_type_lookup bfd_default_reloc_type_lookup - -#define nlm_set_section_contents nlmNAME(set_section_contents) - -#define nlm_sizeof_headers _bfd_nolink_sizeof_headers -#define nlm_bfd_get_relocated_section_contents \ - bfd_generic_get_relocated_section_contents -#define nlm_bfd_relax_section bfd_generic_relax_section -#define nlm_bfd_link_hash_table_create _bfd_generic_link_hash_table_create -#define nlm_bfd_link_add_symbols _bfd_generic_link_add_symbols -#define nlm_bfd_final_link _bfd_generic_final_link -#define nlm_bfd_link_split_section _bfd_generic_link_split_section - -/* This structure contains everything that BFD knows about a target. - It includes things like its byte order, name, what routines to call - to do various operations, etc. Every BFD points to a target structure - with its "xvec" member. - - There are two such structures here: one for big-endian machines and - one for little-endian machines. */ - - -#ifdef TARGET_BIG_SYM -const bfd_target TARGET_BIG_SYM = -{ - /* name: identify kind of target */ - TARGET_BIG_NAME, - - /* flavour: general indication about file */ - bfd_target_nlm_flavour, - - /* byteorder: data is big endian */ - BFD_ENDIAN_BIG, - - /* header_byteorder: header is also big endian */ - BFD_ENDIAN_BIG, - - /* object_flags: mask of all file flags */ - (HAS_RELOC | EXEC_P | HAS_LINENO | HAS_DEBUG | HAS_SYMS | HAS_LOCALS - | WP_TEXT), - - /* section_flags: mask of all section flags */ - (SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD | SEC_RELOC | SEC_READONLY | - SEC_CODE | SEC_DATA), - - /* leading_symbol_char: is the first char of a user symbol - predictable, and if so what is it */ - 0, - - /* ar_pad_char: pad character for filenames within an archive header - FIXME: this really has nothing to do with NLM, this is a characteristic - of the archiver and/or os and should be independently tunable */ - '/', - - /* ar_max_namelen: maximum number of characters in an archive header - FIXME: this really has nothing to do with NLM, this is a characteristic - of the archiver and should be independently tunable. This value is - a WAG (wild a** guess) */ - 15, - - /* Routines to byte-swap various sized integers from the data sections */ - bfd_getb64, bfd_getb_signed_64, bfd_putb64, - bfd_getb32, bfd_getb_signed_32, bfd_putb32, - bfd_getb16, bfd_getb_signed_16, bfd_putb16, - - /* Routines to byte-swap various sized integers from the file headers */ - bfd_getb64, bfd_getb_signed_64, bfd_putb64, - bfd_getb32, bfd_getb_signed_32, bfd_putb32, - bfd_getb16, bfd_getb_signed_16, bfd_putb16, - - /* bfd_check_format: check the format of a file being read */ - { _bfd_dummy_target, /* unknown format */ - nlmNAME(object_p), /* assembler/linker output (object file) */ - bfd_generic_archive_p, /* an archive */ - nlm_core_file_p /* a core file */ - }, - - /* bfd_set_format: set the format of a file being written */ - { bfd_false, - nlm_mkobject, - _bfd_generic_mkarchive, - bfd_false - }, - - /* bfd_write_contents: write cached information into a file being written */ - { bfd_false, - nlmNAME(write_object_contents), - _bfd_write_archive_contents, - bfd_false - }, - - /* Initialize a jump table with the standard macro. All names start with - "nlm" */ - BFD_JUMP_TABLE_GENERIC (_bfd_generic), - BFD_JUMP_TABLE_COPY (_bfd_generic), - BFD_JUMP_TABLE_CORE (_bfd_nocore), - BFD_JUMP_TABLE_ARCHIVE (_bfd_noarchive), - BFD_JUMP_TABLE_SYMBOLS (nlm), - BFD_JUMP_TABLE_RELOCS (nlm), - BFD_JUMP_TABLE_WRITE (nlm), - BFD_JUMP_TABLE_LINK (nlm), - BFD_JUMP_TABLE_DYNAMIC (_bfd_nodynamic), - - /* backend_data: */ - (PTR) TARGET_BACKEND_DATA -}; -#endif - -#ifdef TARGET_LITTLE_SYM -const bfd_target TARGET_LITTLE_SYM = -{ - /* name: identify kind of target */ - TARGET_LITTLE_NAME, - - /* flavour: general indication about file */ - bfd_target_nlm_flavour, - - /* byteorder: data is little endian */ - BFD_ENDIAN_LITTLE, - - /* header_byteorder: header is also little endian */ - BFD_ENDIAN_LITTLE, - - /* object_flags: mask of all file flags */ - (HAS_RELOC | EXEC_P | HAS_LINENO | HAS_DEBUG | HAS_SYMS | HAS_LOCALS - | WP_TEXT), - - /* section_flags: mask of all section flags */ - (SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD | SEC_RELOC | SEC_READONLY | - SEC_DATA), - - /* leading_symbol_char: is the first char of a user symbol - predictable, and if so what is it */ - 0, - - /* ar_pad_char: pad character for filenames within an archive header - FIXME: this really has nothing to do with NLM, this is a characteristic - of the archiver and/or os and should be independently tunable */ - '/', - - /* ar_max_namelen: maximum number of characters in an archive header - FIXME: this really has nothing to do with NLM, this is a characteristic - of the archiver and should be independently tunable. This value is - a WAG (wild a** guess) */ - 15, - - /* Routines to byte-swap various sized integers from the data sections */ - bfd_getl64, bfd_getl_signed_64, bfd_putl64, - bfd_getl32, bfd_getl_signed_32, bfd_putl32, - bfd_getl16, bfd_getl_signed_16, bfd_putl16, - - /* Routines to byte-swap various sized integers from the file headers */ - bfd_getl64, bfd_getl_signed_64, bfd_putl64, - bfd_getl32, bfd_getl_signed_32, bfd_putl32, - bfd_getl16, bfd_getl_signed_16, bfd_putl16, - - /* bfd_check_format: check the format of a file being read */ - { _bfd_dummy_target, /* unknown format */ - nlmNAME(object_p), /* assembler/linker output (object file) */ - bfd_generic_archive_p, /* an archive */ - nlm_core_file_p /* a core file */ - }, - - /* bfd_set_format: set the format of a file being written */ - { bfd_false, - nlm_mkobject, - _bfd_generic_mkarchive, - bfd_false - }, - - /* bfd_write_contents: write cached information into a file being written */ - { bfd_false, - nlmNAME(write_object_contents), - _bfd_write_archive_contents, - bfd_false - }, - - /* Initialize a jump table with the standard macro. All names start with - "nlm" */ - BFD_JUMP_TABLE_GENERIC (_bfd_generic), - BFD_JUMP_TABLE_COPY (_bfd_generic), - BFD_JUMP_TABLE_CORE (_bfd_nocore), - BFD_JUMP_TABLE_ARCHIVE (_bfd_noarchive), - BFD_JUMP_TABLE_SYMBOLS (nlm), - BFD_JUMP_TABLE_RELOCS (nlm), - BFD_JUMP_TABLE_WRITE (nlm), - BFD_JUMP_TABLE_LINK (nlm), - BFD_JUMP_TABLE_DYNAMIC (_bfd_nodynamic), - - /* backend_data: */ - (PTR) TARGET_BACKEND_DATA -}; -#endif diff --git a/contrib/gdb/bfd/nlm.c b/contrib/gdb/bfd/nlm.c deleted file mode 100644 index 89c6baa64ef72..0000000000000 --- a/contrib/gdb/bfd/nlm.c +++ /dev/null @@ -1,55 +0,0 @@ -/* NLM (NetWare Loadable Module) executable support for BFD. - Copyright (C) 1993 Free Software Foundation, Inc. - -This file is part of BFD, the Binary File Descriptor library. - -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 2 of the License, 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ - -#include "bfd.h" -#include "sysdep.h" -#include "libbfd.h" -#include "libnlm.h" - -/* Make an NLM object. We just need to allocate the backend - information. */ - -boolean -nlm_mkobject (abfd) - bfd * abfd; -{ - nlm_tdata (abfd) = - (struct nlm_obj_tdata *) bfd_zalloc (abfd, sizeof (struct nlm_obj_tdata)); - if (nlm_tdata (abfd) == NULL) - return (false); - - if (nlm_architecture (abfd) != bfd_arch_unknown) - bfd_default_set_arch_mach (abfd, nlm_architecture (abfd), - nlm_machine (abfd)); - - /* since everything is done at close time, do we need any initialization? */ - return (true); -} - -/* Set the architecture and machine for an NLM object. */ - -boolean -nlm_set_arch_mach (abfd, arch, machine) - bfd * abfd; - enum bfd_architecture arch; - unsigned long machine; -{ - bfd_default_set_arch_mach (abfd, arch, machine); - return arch == nlm_architecture (abfd); -} diff --git a/contrib/gdb/bfd/nlm32-alpha.c b/contrib/gdb/bfd/nlm32-alpha.c deleted file mode 100644 index 24c8e51676284..0000000000000 --- a/contrib/gdb/bfd/nlm32-alpha.c +++ /dev/null @@ -1,892 +0,0 @@ -/* Support for 32-bit Alpha NLM (NetWare Loadable Module) - Copyright (C) 1993 Free Software Foundation, Inc. - Written by Ian Lance Taylor, Cygnus Support. - -This file is part of BFD, the Binary File Descriptor library. - -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 2 of the License, 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ - -/* This file describes the 32 bit Alpha NLM format. You might think - that an Alpha chip would use a 64 bit format, but, for some reason, - it doesn't. */ - -#include "bfd.h" -#include "sysdep.h" -#include "libbfd.h" - -#define ARCH_SIZE 32 - -#include "nlm/alpha-ext.h" -#define Nlm_External_Fixed_Header Nlm32_alpha_External_Fixed_Header - -#include "libnlm.h" - -static boolean nlm_alpha_backend_object_p - PARAMS ((bfd *)); -static boolean nlm_alpha_write_prefix - PARAMS ((bfd *)); -static boolean nlm_alpha_read_reloc - PARAMS ((bfd *, nlmNAME(symbol_type) *, asection **, arelent *)); -static boolean nlm_alpha_mangle_relocs - PARAMS ((bfd *, asection *, PTR, bfd_vma, bfd_size_type)); -static boolean nlm_alpha_read_import - PARAMS ((bfd *, nlmNAME(symbol_type) *)); -static boolean nlm_alpha_write_import - PARAMS ((bfd *, asection *, arelent *)); -static boolean nlm_alpha_set_public_section - PARAMS ((bfd *, nlmNAME(symbol_type) *)); -static bfd_vma nlm_alpha_get_public_offset - PARAMS ((bfd *, asymbol *)); -static boolean nlm_alpha_write_external - PARAMS ((bfd *, bfd_size_type, asymbol *, struct reloc_and_sec *)); - -/* Alpha NLM's have a prefix header before the standard NLM. This - function reads it in, verifies the version, and seeks the bfd to - the location before the regular NLM header. */ - -static boolean -nlm_alpha_backend_object_p (abfd) - bfd *abfd; -{ - struct nlm32_alpha_external_prefix_header s; - bfd_size_type size; - - if (bfd_read ((PTR) &s, sizeof s, 1, abfd) != sizeof s) - return false; - - if (bfd_h_get_32 (abfd, s.magic) != NLM32_ALPHA_MAGIC) - return false; - - /* FIXME: Should we check the format number? */ - - /* Skip to the end of the header. */ - size = bfd_h_get_32 (abfd, s.size); - if (bfd_seek (abfd, size, SEEK_SET) != 0) - return false; - - return true; -} - -/* Write out the prefix. */ - -static boolean -nlm_alpha_write_prefix (abfd) - bfd *abfd; -{ - struct nlm32_alpha_external_prefix_header s; - - memset (&s, 0, sizeof s); - bfd_h_put_32 (abfd, (bfd_vma) NLM32_ALPHA_MAGIC, s.magic); - bfd_h_put_32 (abfd, (bfd_vma) 2, s.format); - bfd_h_put_32 (abfd, (bfd_vma) sizeof s, s.size); - if (bfd_write ((PTR) &s, sizeof s, 1, abfd) != sizeof s) - return false; - return true; -} - -/* How to process the various reloc types. */ - -static reloc_howto_type nlm32_alpha_howto_table[] = -{ - /* Reloc type 0 is ignored by itself. However, it appears after a - GPDISP reloc to identify the location where the low order 16 bits - of the gp register are loaded. */ - HOWTO (ALPHA_R_IGNORE, /* type */ - 0, /* rightshift */ - 0, /* size (0 = byte, 1 = short, 2 = long) */ - 8, /* bitsize */ - false, /* pc_relative */ - 0, /* bitpos */ - complain_overflow_dont, /* complain_on_overflow */ - 0, /* special_function */ - "IGNORE", /* name */ - false, /* partial_inplace */ - 0, /* src_mask */ - 0, /* dst_mask */ - false), /* pcrel_offset */ - - /* A 32 bit reference to a symbol. */ - HOWTO (ALPHA_R_REFLONG, /* type */ - 0, /* rightshift */ - 2, /* size (0 = byte, 1 = short, 2 = long) */ - 32, /* bitsize */ - false, /* pc_relative */ - 0, /* bitpos */ - complain_overflow_bitfield, /* complain_on_overflow */ - 0, /* special_function */ - "REFLONG", /* name */ - true, /* partial_inplace */ - 0xffffffff, /* src_mask */ - 0xffffffff, /* dst_mask */ - false), /* pcrel_offset */ - - /* A 64 bit reference to a symbol. */ - HOWTO (ALPHA_R_REFQUAD, /* type */ - 0, /* rightshift */ - 4, /* size (0 = byte, 1 = short, 2 = long) */ - 64, /* bitsize */ - false, /* pc_relative */ - 0, /* bitpos */ - complain_overflow_bitfield, /* complain_on_overflow */ - 0, /* special_function */ - "REFQUAD", /* name */ - true, /* partial_inplace */ - 0xffffffffffffffff, /* src_mask */ - 0xffffffffffffffff, /* dst_mask */ - false), /* pcrel_offset */ - - /* A 32 bit GP relative offset. This is just like REFLONG except - that when the value is used the value of the gp register will be - added in. */ - HOWTO (ALPHA_R_GPREL32, /* type */ - 0, /* rightshift */ - 2, /* size (0 = byte, 1 = short, 2 = long) */ - 32, /* bitsize */ - false, /* pc_relative */ - 0, /* bitpos */ - complain_overflow_bitfield, /* complain_on_overflow */ - 0, /* special_function */ - "GPREL32", /* name */ - true, /* partial_inplace */ - 0xffffffff, /* src_mask */ - 0xffffffff, /* dst_mask */ - false), /* pcrel_offset */ - - /* Used for an instruction that refers to memory off the GP - register. The offset is 16 bits of the 32 bit instruction. This - reloc always seems to be against the .lita section. */ - HOWTO (ALPHA_R_LITERAL, /* type */ - 0, /* rightshift */ - 2, /* size (0 = byte, 1 = short, 2 = long) */ - 16, /* bitsize */ - false, /* pc_relative */ - 0, /* bitpos */ - complain_overflow_signed, /* complain_on_overflow */ - 0, /* special_function */ - "LITERAL", /* name */ - true, /* partial_inplace */ - 0xffff, /* src_mask */ - 0xffff, /* dst_mask */ - false), /* pcrel_offset */ - - /* This reloc only appears immediately following a LITERAL reloc. - It identifies a use of the literal. It seems that the linker can - use this to eliminate a portion of the .lita section. The symbol - index is special: 1 means the literal address is in the base - register of a memory format instruction; 2 means the literal - address is in the byte offset register of a byte-manipulation - instruction; 3 means the literal address is in the target - register of a jsr instruction. This does not actually do any - relocation. */ - HOWTO (ALPHA_R_LITUSE, /* type */ - 0, /* rightshift */ - 2, /* size (0 = byte, 1 = short, 2 = long) */ - 32, /* bitsize */ - false, /* pc_relative */ - 0, /* bitpos */ - complain_overflow_dont, /* complain_on_overflow */ - 0, /* special_function */ - "LITUSE", /* name */ - false, /* partial_inplace */ - 0, /* src_mask */ - 0, /* dst_mask */ - false), /* pcrel_offset */ - - /* Load the gp register. This is always used for a ldah instruction - which loads the upper 16 bits of the gp register. The next reloc - will be an IGNORE reloc which identifies the location of the lda - instruction which loads the lower 16 bits. The symbol index of - the GPDISP instruction appears to actually be the number of bytes - between the ldah and lda instructions. This gives two different - ways to determine where the lda instruction is; I don't know why - both are used. The value to use for the relocation is the - difference between the GP value and the current location; the - load will always be done against a register holding the current - address. */ - HOWTO (ALPHA_R_GPDISP, /* type */ - 16, /* rightshift */ - 2, /* size (0 = byte, 1 = short, 2 = long) */ - 16, /* bitsize */ - true, /* pc_relative */ - 0, /* bitpos */ - complain_overflow_dont, /* complain_on_overflow */ - 0, /* special_function */ - "GPDISP", /* name */ - true, /* partial_inplace */ - 0xffff, /* src_mask */ - 0xffff, /* dst_mask */ - true), /* pcrel_offset */ - - /* A 21 bit branch. The native assembler generates these for - branches within the text segment, and also fills in the PC - relative offset in the instruction. It seems to me that this - reloc, unlike the others, is not partial_inplace. */ - HOWTO (ALPHA_R_BRADDR, /* type */ - 2, /* rightshift */ - 2, /* size (0 = byte, 1 = short, 2 = long) */ - 21, /* bitsize */ - true, /* pc_relative */ - 0, /* bitpos */ - complain_overflow_signed, /* complain_on_overflow */ - 0, /* special_function */ - "BRADDR", /* name */ - false, /* partial_inplace */ - 0, /* src_mask */ - 0x1fffff, /* dst_mask */ - false), /* pcrel_offset */ - - /* A hint for a jump to a register. */ - HOWTO (ALPHA_R_HINT, /* type */ - 2, /* rightshift */ - 2, /* size (0 = byte, 1 = short, 2 = long) */ - 14, /* bitsize */ - false, /* pc_relative */ - 0, /* bitpos */ - complain_overflow_dont, /* complain_on_overflow */ - 0, /* special_function */ - "HINT", /* name */ - true, /* partial_inplace */ - 0x3fff, /* src_mask */ - 0x3fff, /* dst_mask */ - false), /* pcrel_offset */ - - /* 16 bit PC relative offset. */ - HOWTO (ALPHA_R_SREL16, /* type */ - 0, /* rightshift */ - 1, /* size (0 = byte, 1 = short, 2 = long) */ - 16, /* bitsize */ - true, /* pc_relative */ - 0, /* bitpos */ - complain_overflow_signed, /* complain_on_overflow */ - 0, /* special_function */ - "SREL16", /* name */ - true, /* partial_inplace */ - 0xffff, /* src_mask */ - 0xffff, /* dst_mask */ - false), /* pcrel_offset */ - - /* 32 bit PC relative offset. */ - HOWTO (ALPHA_R_SREL32, /* type */ - 0, /* rightshift */ - 2, /* size (0 = byte, 1 = short, 2 = long) */ - 32, /* bitsize */ - true, /* pc_relative */ - 0, /* bitpos */ - complain_overflow_signed, /* complain_on_overflow */ - 0, /* special_function */ - "SREL32", /* name */ - true, /* partial_inplace */ - 0xffffffff, /* src_mask */ - 0xffffffff, /* dst_mask */ - false), /* pcrel_offset */ - - /* A 64 bit PC relative offset. */ - HOWTO (ALPHA_R_SREL64, /* type */ - 0, /* rightshift */ - 4, /* size (0 = byte, 1 = short, 2 = long) */ - 64, /* bitsize */ - true, /* pc_relative */ - 0, /* bitpos */ - complain_overflow_signed, /* complain_on_overflow */ - 0, /* special_function */ - "SREL64", /* name */ - true, /* partial_inplace */ - 0xffffffffffffffff, /* src_mask */ - 0xffffffffffffffff, /* dst_mask */ - false), /* pcrel_offset */ - - /* Push a value on the reloc evaluation stack. */ - HOWTO (ALPHA_R_OP_PUSH, /* type */ - 0, /* rightshift */ - 0, /* size (0 = byte, 1 = short, 2 = long) */ - 0, /* bitsize */ - false, /* pc_relative */ - 0, /* bitpos */ - complain_overflow_dont, /* complain_on_overflow */ - 0, /* special_function */ - "OP_PUSH", /* name */ - false, /* partial_inplace */ - 0, /* src_mask */ - 0, /* dst_mask */ - false), /* pcrel_offset */ - - /* Store the value from the stack at the given address. Store it in - a bitfield of size r_size starting at bit position r_offset. */ - HOWTO (ALPHA_R_OP_STORE, /* type */ - 0, /* rightshift */ - 4, /* size (0 = byte, 1 = short, 2 = long) */ - 64, /* bitsize */ - false, /* pc_relative */ - 0, /* bitpos */ - complain_overflow_dont, /* complain_on_overflow */ - 0, /* special_function */ - "OP_STORE", /* name */ - false, /* partial_inplace */ - 0, /* src_mask */ - 0xffffffffffffffff, /* dst_mask */ - false), /* pcrel_offset */ - - /* Subtract the reloc address from the value on the top of the - relocation stack. */ - HOWTO (ALPHA_R_OP_PSUB, /* type */ - 0, /* rightshift */ - 0, /* size (0 = byte, 1 = short, 2 = long) */ - 0, /* bitsize */ - false, /* pc_relative */ - 0, /* bitpos */ - complain_overflow_dont, /* complain_on_overflow */ - 0, /* special_function */ - "OP_PSUB", /* name */ - false, /* partial_inplace */ - 0, /* src_mask */ - 0, /* dst_mask */ - false), /* pcrel_offset */ - - /* Shift the value on the top of the relocation stack right by the - given value. */ - HOWTO (ALPHA_R_OP_PRSHIFT, /* type */ - 0, /* rightshift */ - 0, /* size (0 = byte, 1 = short, 2 = long) */ - 0, /* bitsize */ - false, /* pc_relative */ - 0, /* bitpos */ - complain_overflow_dont, /* complain_on_overflow */ - 0, /* special_function */ - "OP_PRSHIFT", /* name */ - false, /* partial_inplace */ - 0, /* src_mask */ - 0, /* dst_mask */ - false), /* pcrel_offset */ - - /* Adjust the GP value for a new range in the object file. */ - HOWTO (ALPHA_R_GPVALUE, /* type */ - 0, /* rightshift */ - 0, /* size (0 = byte, 1 = short, 2 = long) */ - 0, /* bitsize */ - false, /* pc_relative */ - 0, /* bitpos */ - complain_overflow_dont, /* complain_on_overflow */ - 0, /* special_function */ - "GPVALUE", /* name */ - false, /* partial_inplace */ - 0, /* src_mask */ - 0, /* dst_mask */ - false) /* pcrel_offset */ -}; - -static reloc_howto_type nlm32_alpha_nw_howto = - HOWTO (ALPHA_R_NW_RELOC, /* type */ - 0, /* rightshift */ - 0, /* size (0 = byte, 1 = short, 2 = long) */ - 0, /* bitsize */ - false, /* pc_relative */ - 0, /* bitpos */ - complain_overflow_dont, /* complain_on_overflow */ - 0, /* special_function */ - "NW_RELOC", /* name */ - false, /* partial_inplace */ - 0, /* src_mask */ - 0, /* dst_mask */ - false); /* pcrel_offset */ - -/* Read an Alpha NLM reloc. This routine keeps some static data which - it uses when handling local relocs. This only works correctly - because all the local relocs are read at once. */ - -static boolean -nlm_alpha_read_reloc (abfd, sym, secp, rel) - bfd *abfd; - nlmNAME(symbol_type) *sym; - asection **secp; - arelent *rel; -{ - static bfd_vma gp_value; - static bfd_vma lita_address; - struct nlm32_alpha_external_reloc ext; - bfd_vma r_vaddr; - long r_symndx; - int r_type, r_extern, r_offset, r_size; - asection *code_sec, *data_sec; - - /* Read the reloc from the file. */ - if (bfd_read (&ext, sizeof ext, 1, abfd) != sizeof ext) - return false; - - /* Swap in the reloc information. */ - r_vaddr = bfd_h_get_64 (abfd, (bfd_byte *) ext.r_vaddr); - r_symndx = bfd_h_get_32 (abfd, (bfd_byte *) ext.r_symndx); - - BFD_ASSERT (bfd_little_endian (abfd)); - - r_type = ((ext.r_bits[0] & RELOC_BITS0_TYPE_LITTLE) - >> RELOC_BITS0_TYPE_SH_LITTLE); - r_extern = (ext.r_bits[1] & RELOC_BITS1_EXTERN_LITTLE) != 0; - r_offset = ((ext.r_bits[1] & RELOC_BITS1_OFFSET_LITTLE) - >> RELOC_BITS1_OFFSET_SH_LITTLE); - /* Ignore the reserved bits. */ - r_size = ((ext.r_bits[3] & RELOC_BITS3_SIZE_LITTLE) - >> RELOC_BITS3_SIZE_SH_LITTLE); - - /* Fill in the BFD arelent structure. */ - code_sec = bfd_get_section_by_name (abfd, NLM_CODE_NAME); - data_sec = bfd_get_section_by_name (abfd, NLM_INITIALIZED_DATA_NAME); - if (r_extern) - { - /* External relocations are only used for imports. */ - BFD_ASSERT (sym != NULL); - /* We don't need to set sym_ptr_ptr for this case. It is set in - nlm_canonicalize_reloc. */ - rel->sym_ptr_ptr = NULL; - rel->addend = 0; - } - else - { - /* Internal relocations are only used for local relocation - fixups. If they are not NW_RELOC or GPDISP or IGNORE, they - must be against .text or .data. */ - BFD_ASSERT (r_type == ALPHA_R_NW_RELOC || sym == NULL); - if (r_type == ALPHA_R_NW_RELOC - || r_type == ALPHA_R_GPDISP - || r_type == ALPHA_R_IGNORE) - { - rel->sym_ptr_ptr = bfd_abs_section_ptr->symbol_ptr_ptr; - rel->addend = 0; - } - else if (r_symndx == ALPHA_RELOC_SECTION_TEXT) - { - rel->sym_ptr_ptr = code_sec->symbol_ptr_ptr; - BFD_ASSERT (bfd_get_section_vma (abfd, code_sec) == 0); - rel->addend = 0; - } - else if (r_symndx == ALPHA_RELOC_SECTION_DATA) - { - rel->sym_ptr_ptr = data_sec->symbol_ptr_ptr; - rel->addend = - bfd_get_section_vma (abfd, data_sec); - } - else - { - BFD_ASSERT (0); - rel->sym_ptr_ptr = bfd_abs_section_ptr->symbol_ptr_ptr; - rel->addend = 0; - } - } - - /* We use the address to determine whether the reloc is in the .text - or .data section. R_NW_RELOC relocs don't really have a section, - so we put them in .text. */ - if (r_type == ALPHA_R_NW_RELOC - || r_vaddr < bfd_section_size (abfd, code_sec)) - { - *secp = code_sec; - rel->address = r_vaddr; - } - else - { - *secp = data_sec; - rel->address = r_vaddr - bfd_section_size (abfd, code_sec); - } - - /* We must adjust the addend based on the type. */ - BFD_ASSERT ((r_type >= 0 && r_type <= ALPHA_R_GPVALUE) - || r_type == ALPHA_R_NW_RELOC); - - switch (r_type) - { - case ALPHA_R_BRADDR: - case ALPHA_R_SREL16: - case ALPHA_R_SREL32: - case ALPHA_R_SREL64: - /* The PC relative relocs do not seem to use the section VMA as - a negative addend. */ - rel->addend = 0; - break; - - case ALPHA_R_GPREL32: - /* Copy the gp value for this object file into the addend, to - ensure that we are not confused by the linker. */ - if (! r_extern) - rel->addend += gp_value; - break; - - case ALPHA_R_LITERAL: - BFD_ASSERT (! r_extern); - rel->addend += lita_address; - break; - - case ALPHA_R_LITUSE: - case ALPHA_R_GPDISP: - /* The LITUSE and GPDISP relocs do not use a symbol, or an - addend, but they do use a special code. Put this code in the - addend field. */ - rel->addend = r_symndx; - rel->sym_ptr_ptr = bfd_abs_section_ptr->symbol_ptr_ptr; - break; - - case ALPHA_R_OP_STORE: - /* The STORE reloc needs the size and offset fields. We store - them in the addend. */ - BFD_ASSERT (r_offset < 256 && r_size < 256); - rel->addend = (r_offset << 8) + r_size; - break; - - case ALPHA_R_OP_PUSH: - case ALPHA_R_OP_PSUB: - case ALPHA_R_OP_PRSHIFT: - /* The PUSH, PSUB and PRSHIFT relocs do not actually use an - address. I believe that the address supplied is really an - addend. */ - rel->addend = r_vaddr; - break; - - case ALPHA_R_GPVALUE: - /* Record the new gp value. */ - gp_value += r_symndx; - rel->addend = gp_value; - break; - - case ALPHA_R_IGNORE: - /* If the type is ALPHA_R_IGNORE, make sure this is a reference - to the absolute section so that the reloc is ignored. For - some reason the address of this reloc type is not adjusted by - the section vma. We record the gp value for this object file - here, for convenience when doing the GPDISP relocation. */ - rel->sym_ptr_ptr = bfd_abs_section_ptr->symbol_ptr_ptr; - rel->address = r_vaddr; - rel->addend = gp_value; - break; - - case ALPHA_R_NW_RELOC: - /* If this is SETGP, we set the addend to 0. Otherwise we set - the addend to the size of the .lita section (this is - r_symndx) plus 1. We have already set the address of the - reloc to r_vaddr. */ - if (r_size == ALPHA_R_NW_RELOC_SETGP) - { - gp_value = r_vaddr; - rel->addend = 0; - } - else if (r_size == ALPHA_R_NW_RELOC_LITA) - { - lita_address = r_vaddr; - rel->addend = r_symndx + 1; - } - else - BFD_ASSERT (0); - rel->sym_ptr_ptr = bfd_abs_section_ptr->symbol_ptr_ptr; - break; - - default: - break; - } - - if (r_type == ALPHA_R_NW_RELOC) - rel->howto = &nlm32_alpha_nw_howto; - else - rel->howto = &nlm32_alpha_howto_table[r_type]; - - return true; -} - -/* Mangle Alpha NLM relocs for output. */ - -static boolean -nlm_alpha_mangle_relocs (abfd, sec, data, offset, count) - bfd *abfd; - asection *sec; - PTR data; - bfd_vma offset; - bfd_size_type count; -{ - return true; -} - -/* Read an ALPHA NLM import record */ - -static boolean -nlm_alpha_read_import (abfd, sym) - bfd *abfd; - nlmNAME(symbol_type) *sym; -{ - struct nlm_relent *nlm_relocs; /* relocation records for symbol */ - bfd_size_type rcount; /* number of relocs */ - bfd_byte temp[NLM_TARGET_LONG_SIZE]; /* temporary 32-bit value */ - unsigned char symlength; /* length of symbol name */ - char *name; - - if (bfd_read ((PTR) &symlength, sizeof (symlength), 1, abfd) - != sizeof (symlength)) - return false; - sym -> symbol.the_bfd = abfd; - name = bfd_alloc (abfd, symlength + 1); - if (name == NULL) - return false; - if (bfd_read (name, symlength, 1, abfd) != symlength) - return false; - name[symlength] = '\0'; - sym -> symbol.name = name; - sym -> symbol.flags = 0; - sym -> symbol.value = 0; - sym -> symbol.section = bfd_und_section_ptr; - if (bfd_read ((PTR) temp, sizeof (temp), 1, abfd) != sizeof (temp)) - return false; - rcount = bfd_h_get_32 (abfd, temp); - nlm_relocs = ((struct nlm_relent *) - bfd_alloc (abfd, rcount * sizeof (struct nlm_relent))); - if (!nlm_relocs) - return false; - sym -> relocs = nlm_relocs; - sym -> rcnt = 0; - while (sym -> rcnt < rcount) - { - asection *section; - - if (nlm_alpha_read_reloc (abfd, sym, §ion, - &nlm_relocs -> reloc) - == false) - return false; - nlm_relocs -> section = section; - nlm_relocs++; - sym -> rcnt++; - } - - return true; -} - -/* Write an Alpha NLM reloc. */ - -static boolean -nlm_alpha_write_import (abfd, sec, rel) - bfd *abfd; - asection *sec; - arelent *rel; -{ - asymbol *sym; - bfd_vma r_vaddr; - long r_symndx; - int r_type, r_extern, r_offset, r_size; - struct nlm32_alpha_external_reloc ext; - - sym = *rel->sym_ptr_ptr; - - /* Get values for the relocation fields. */ - r_type = rel->howto->type; - if (r_type != ALPHA_R_NW_RELOC) - { - r_vaddr = bfd_get_section_vma (abfd, sec) + rel->address; - if ((sec->flags & SEC_CODE) == 0) - r_vaddr += bfd_section_size (abfd, - bfd_get_section_by_name (abfd, - NLM_CODE_NAME)); - if (bfd_is_und_section (bfd_get_section (sym))) - { - r_extern = 1; - r_symndx = 0; - } - else - { - r_extern = 0; - if (bfd_get_section_flags (abfd, bfd_get_section (sym)) & SEC_CODE) - r_symndx = ALPHA_RELOC_SECTION_TEXT; - else - r_symndx = ALPHA_RELOC_SECTION_DATA; - } - r_offset = 0; - r_size = 0; - - switch (r_type) - { - case ALPHA_R_LITUSE: - case ALPHA_R_GPDISP: - r_symndx = rel->addend; - break; - - case ALPHA_R_OP_STORE: - r_size = rel->addend & 0xff; - r_offset = (rel->addend >> 8) & 0xff; - break; - - case ALPHA_R_OP_PUSH: - case ALPHA_R_OP_PSUB: - case ALPHA_R_OP_PRSHIFT: - r_vaddr = rel->addend; - break; - - case ALPHA_R_IGNORE: - r_vaddr = rel->address; - break; - - default: - break; - } - } - else - { - /* r_type == ALPHA_R_NW_RELOC */ - r_vaddr = rel->address; - if (rel->addend == 0) - { - r_symndx = 0; - r_size = ALPHA_R_NW_RELOC_SETGP; - } - else - { - r_symndx = rel->addend - 1; - r_size = ALPHA_R_NW_RELOC_LITA; - } - r_extern = 0; - r_offset = 0; - } - - /* Swap out the relocation fields. */ - bfd_h_put_64 (abfd, r_vaddr, (bfd_byte *) ext.r_vaddr); - bfd_h_put_32 (abfd, r_symndx, (bfd_byte *) ext.r_symndx); - - BFD_ASSERT (bfd_little_endian (abfd)); - - ext.r_bits[0] = ((r_type << RELOC_BITS0_TYPE_SH_LITTLE) - & RELOC_BITS0_TYPE_LITTLE); - ext.r_bits[1] = ((r_extern ? RELOC_BITS1_EXTERN_LITTLE : 0) - | ((r_offset << RELOC_BITS1_OFFSET_SH_LITTLE) - & RELOC_BITS1_OFFSET_LITTLE)); - ext.r_bits[2] = 0; - ext.r_bits[3] = ((r_size << RELOC_BITS3_SIZE_SH_LITTLE) - & RELOC_BITS3_SIZE_LITTLE); - - /* Write out the relocation. */ - if (bfd_write (&ext, sizeof ext, 1, abfd) != sizeof ext) - return false; - - return true; -} - -/* Alpha NetWare does not use the high bit to determine whether a - public symbol is in the code segment or the data segment. Instead, - it just uses the address. The set_public_section and - get_public_offset routines override the default code which uses the - high bit. */ - -/* Set the section for a public symbol. */ - -static boolean -nlm_alpha_set_public_section (abfd, sym) - bfd *abfd; - nlmNAME(symbol_type) *sym; -{ - asection *code_sec, *data_sec; - - code_sec = bfd_get_section_by_name (abfd, NLM_CODE_NAME); - data_sec = bfd_get_section_by_name (abfd, NLM_INITIALIZED_DATA_NAME); - if (sym->symbol.value < bfd_section_size (abfd, code_sec)) - { - sym->symbol.section = code_sec; - sym->symbol.flags |= BSF_FUNCTION; - } - else - { - sym->symbol.section = data_sec; - sym->symbol.value -= bfd_section_size (abfd, code_sec); - /* The data segment had better be aligned. */ - BFD_ASSERT ((bfd_section_size (abfd, code_sec) & 0xf) == 0); - } - return true; -} - -/* Get the offset to write out for a public symbol. */ - -static bfd_vma -nlm_alpha_get_public_offset (abfd, sym) - bfd *abfd; - asymbol *sym; -{ - return bfd_asymbol_value (sym); -} - -/* Write an Alpha NLM external symbol. */ - -static boolean -nlm_alpha_write_external (abfd, count, sym, relocs) - bfd *abfd; - bfd_size_type count; - asymbol *sym; - struct reloc_and_sec *relocs; -{ - int i; - bfd_byte len; - unsigned char temp[NLM_TARGET_LONG_SIZE]; - arelent r; - - len = strlen (sym->name); - if ((bfd_write (&len, sizeof (bfd_byte), 1, abfd) != sizeof(bfd_byte)) - || bfd_write (sym->name, len, 1, abfd) != len) - return false; - - bfd_put_32 (abfd, count + 2, temp); - if (bfd_write (temp, sizeof (temp), 1, abfd) != sizeof (temp)) - return false; - - /* The first two relocs for each external symbol are the .lita - address and the GP value. */ - r.sym_ptr_ptr = bfd_abs_section_ptr->symbol_ptr_ptr; - r.howto = &nlm32_alpha_nw_howto; - - r.address = nlm_alpha_backend_data (abfd)->lita_address; - r.addend = nlm_alpha_backend_data (abfd)->lita_size + 1; - if (nlm_alpha_write_import (abfd, (asection *) NULL, &r) == false) - return false; - - r.address = nlm_alpha_backend_data (abfd)->gp; - r.addend = 0; - if (nlm_alpha_write_import (abfd, (asection *) NULL, &r) == false) - return false; - - for (i = 0; i < count; i++) - { - if (nlm_alpha_write_import (abfd, relocs[i].sec, - relocs[i].rel) == false) - return false; - } - - return true; -} - -#include "nlmswap.h" - -static const struct nlm_backend_data nlm32_alpha_backend = -{ - "NetWare Alpha Module \032", - sizeof (Nlm32_alpha_External_Fixed_Header), - sizeof (struct nlm32_alpha_external_prefix_header), - bfd_arch_alpha, - 0, - true, /* no uninitialized data permitted by Alpha NetWare. */ - nlm_alpha_backend_object_p, - nlm_alpha_write_prefix, - nlm_alpha_read_reloc, - nlm_alpha_mangle_relocs, - nlm_alpha_read_import, - nlm_alpha_write_import, - nlm_alpha_set_public_section, - nlm_alpha_get_public_offset, - nlm_swap_fixed_header_in, - nlm_swap_fixed_header_out, - nlm_alpha_write_external, - 0, /* write_export */ -}; - -#define TARGET_LITTLE_NAME "nlm32-alpha" -#define TARGET_LITTLE_SYM nlmNAME(alpha_vec) -#define TARGET_BACKEND_DATA &nlm32_alpha_backend - -#include "nlm-target.h" diff --git a/contrib/gdb/bfd/nlm32-i386.c b/contrib/gdb/bfd/nlm32-i386.c deleted file mode 100644 index f16c74d985eb7..0000000000000 --- a/contrib/gdb/bfd/nlm32-i386.c +++ /dev/null @@ -1,451 +0,0 @@ -/* Support for 32-bit i386 NLM (NetWare Loadable Module) - Copyright (C) 1993 Free Software Foundation, Inc. - -This file is part of BFD, the Binary File Descriptor library. - -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 2 of the License, 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ - -#include "bfd.h" -#include "sysdep.h" -#include "libbfd.h" - -#define ARCH_SIZE 32 - -#include "nlm/i386-ext.h" -#define Nlm_External_Fixed_Header Nlm32_i386_External_Fixed_Header - -#include "libnlm.h" - -static boolean nlm_i386_read_reloc - PARAMS ((bfd *, nlmNAME(symbol_type) *, asection **, arelent *)); -static boolean nlm_i386_write_import - PARAMS ((bfd *, asection *, arelent *)); -static boolean nlm_i386_mangle_relocs - PARAMS ((bfd *, asection *, PTR, bfd_vma, bfd_size_type)); -static boolean nlm_i386_read_import - PARAMS ((bfd *, nlmNAME(symbol_type) *)); -static boolean nlm_i386_write_external - PARAMS ((bfd *, bfd_size_type, asymbol *, struct reloc_and_sec *)); - -/* Adjust the reloc location by an absolute value. */ - -static reloc_howto_type nlm_i386_abs_howto = - HOWTO (0, /* type */ - 0, /* rightshift */ - 2, /* size (0 = byte, 1 = short, 2 = long) */ - 32, /* bitsize */ - false, /* pc_relative */ - 0, /* bitpos */ - complain_overflow_bitfield, /* complain_on_overflow */ - 0, /* special_function */ - "32", /* name */ - true, /* partial_inplace */ - 0xffffffff, /* src_mask */ - 0xffffffff, /* dst_mask */ - false); /* pcrel_offset */ - -/* Adjust the reloc location by a PC relative displacement. */ - -static reloc_howto_type nlm_i386_pcrel_howto = - HOWTO (1, /* type */ - 0, /* rightshift */ - 2, /* size (0 = byte, 1 = short, 2 = long) */ - 32, /* bitsize */ - true, /* pc_relative */ - 0, /* bitpos */ - complain_overflow_signed, /* complain_on_overflow */ - 0, /* special_function */ - "DISP32", /* name */ - true, /* partial_inplace */ - 0xffffffff, /* src_mask */ - 0xffffffff, /* dst_mask */ - true); /* pcrel_offset */ - -/* Read a NetWare i386 reloc. */ - -static boolean -nlm_i386_read_reloc (abfd, sym, secp, rel) - bfd *abfd; - nlmNAME(symbol_type) *sym; - asection **secp; - arelent *rel; -{ - bfd_byte temp[4]; - bfd_vma val; - const char *name; - - if (bfd_read (temp, sizeof (temp), 1, abfd) != sizeof (temp)) - return false; - - val = bfd_get_32 (abfd, temp); - - /* The value is an offset into either the code or data segment. - This is the location which needs to be adjusted. - - If this is a relocation fixup rather than an imported symbol (the - sym argument is NULL) then the high bit is 0 if the location - needs to be adjusted by the address of the data segment, or 1 if - the location needs to be adjusted by the address of the code - segment. If this is an imported symbol, then the high bit is 0 - if the location is 0 if the location should be adjusted by the - offset to the symbol, or 1 if the location should adjusted by the - absolute value of the symbol. - - The second most significant bit is 0 if the value is an offset - into the data segment, or 1 if the value is an offset into the - code segment. - - All this translates fairly easily into a BFD reloc. */ - - if (sym == NULL) - { - if ((val & NLM_HIBIT) == 0) - name = NLM_INITIALIZED_DATA_NAME; - else - { - name = NLM_CODE_NAME; - val &=~ NLM_HIBIT; - } - rel->sym_ptr_ptr = bfd_get_section_by_name (abfd, name)->symbol_ptr_ptr; - rel->howto = &nlm_i386_abs_howto; - } - else - { - /* In this case we do not need to set the sym_ptr_ptr field. */ - rel->sym_ptr_ptr = NULL; - if ((val & NLM_HIBIT) == 0) - rel->howto = &nlm_i386_pcrel_howto; - else - { - rel->howto = &nlm_i386_abs_howto; - val &=~ NLM_HIBIT; - } - } - - if ((val & (NLM_HIBIT >> 1)) == 0) - *secp = bfd_get_section_by_name (abfd, NLM_INITIALIZED_DATA_NAME); - else - { - *secp = bfd_get_section_by_name (abfd, NLM_CODE_NAME); - val &=~ (NLM_HIBIT >> 1); - } - - rel->address = val; - rel->addend = 0; - - return true; -} - -/* Write a NetWare i386 reloc. */ - -static boolean -nlm_i386_write_import (abfd, sec, rel) - bfd *abfd; - asection *sec; - arelent *rel; -{ - asymbol *sym; - bfd_vma val; - bfd_byte temp[4]; - - /* NetWare only supports two kinds of relocs. We should check - special_function here, as well, but at the moment coff-i386 - relocs uses a special_function which does not affect what we do - here. */ - if (rel->addend != 0 - || rel->howto == NULL - || rel->howto->rightshift != 0 - || rel->howto->size != 2 - || rel->howto->bitsize != 32 - || rel->howto->bitpos != 0 - || rel->howto->src_mask != 0xffffffff - || rel->howto->dst_mask != 0xffffffff) - { - bfd_set_error (bfd_error_invalid_operation); - return false; - } - - sym = *rel->sym_ptr_ptr; - - /* The value we write out is the offset into the appropriate - segment. This offset is the section vma, adjusted by the vma of - the lowest section in that segment, plus the address of the - relocation. */ - val = bfd_get_section_vma (abfd, sec) + rel->address; - - /* The second most significant bit is 0 if the value is an offset - into the data segment, or 1 if the value is an offset into the - code segment. */ - if (bfd_get_section_flags (abfd, sec) & SEC_CODE) - { - val -= nlm_get_text_low (abfd); - val |= NLM_HIBIT >> 1; - } - else - val -= nlm_get_data_low (abfd); - - if (! bfd_is_und_section (bfd_get_section (sym))) - { - /* NetWare only supports absolute internal relocs. */ - if (rel->howto->pc_relative) - { - bfd_set_error (bfd_error_invalid_operation); - return false; - } - - /* The high bit is 1 if the reloc is against the code section, 0 - if against the data section. */ - if (bfd_get_section_flags (abfd, bfd_get_section (sym)) & SEC_CODE) - val |= NLM_HIBIT; - } - else - { - /* The high bit is 1 if this is an absolute reloc, 0 if it is PC - relative. */ - if (! rel->howto->pc_relative) - val |= NLM_HIBIT; - else - { - /* PC relative relocs on NetWare must be pcrel_offset. */ - if (! rel->howto->pcrel_offset) - { - bfd_set_error (bfd_error_invalid_operation); - return false; - } - } - } - - bfd_put_32 (abfd, val, temp); - if (bfd_write (temp, sizeof (temp), 1, abfd) != sizeof (temp)) - return false; - - return true; -} - -/* I want to be able to use objcopy to turn a i386 a.out or COFF file - into a NetWare i386 module. That means that the relocs from the - source file have to be mapped into relocs that apply to the target - file. This function is called by nlm_set_section_contents to give - it a chance to rework the relocs. - - This is actually a fairly general concept. However, this is not a - general implementation. */ - -static boolean -nlm_i386_mangle_relocs (abfd, sec, data, offset, count) - bfd *abfd; - asection *sec; - PTR data; - bfd_vma offset; - bfd_size_type count; -{ - arelent **rel_ptr_ptr, **rel_end; - - rel_ptr_ptr = sec->orelocation; - rel_end = rel_ptr_ptr + sec->reloc_count; - for (; rel_ptr_ptr < rel_end; rel_ptr_ptr++) - { - arelent *rel; - asymbol *sym; - bfd_vma addend; - - rel = *rel_ptr_ptr; - sym = *rel->sym_ptr_ptr; - - /* Note that no serious harm will ensue if we fail to change a - reloc. We will wind up failing in nlm_i386_write_import. */ - - /* Make sure this reloc is within the data we have. We only 4 - byte relocs here, so we insist on having 4 bytes. */ - if (rel->address < offset - || rel->address + 4 > offset + count) - continue; - - /* NetWare doesn't support reloc addends, so we get rid of them - here by simply adding them into the object data. We handle - the symbol value, if any, the same way. */ - addend = rel->addend + sym->value; - - /* The value of a symbol is the offset into the section. If the - symbol is in the .bss segment, we need to include the size of - the data segment in the offset as well. Fortunately, we know - that at this point the size of the data section is in the NLM - header. */ - if (((bfd_get_section_flags (abfd, bfd_get_section (sym)) - & SEC_LOAD) == 0) - && ((bfd_get_section_flags (abfd, bfd_get_section (sym)) - & SEC_ALLOC) != 0)) - addend += nlm_fixed_header (abfd)->dataImageSize; - - if (addend != 0 - && rel->howto != NULL - && rel->howto->rightshift == 0 - && rel->howto->size == 2 - && rel->howto->bitsize == 32 - && rel->howto->bitpos == 0 - && rel->howto->src_mask == 0xffffffff - && rel->howto->dst_mask == 0xffffffff) - { - bfd_vma val; - - val = bfd_get_32 (abfd, (bfd_byte *) data + rel->address - offset); - val += addend; - bfd_put_32 (abfd, val, (bfd_byte *) data + rel->address - offset); - rel->addend = 0; - } - - /* NetWare uses a reloc with pcrel_offset set. We adjust - pc_relative relocs accordingly. We are going to change the - howto field, so we can only do this if the current one is - compatible. We should check special_function here, but at - the moment coff-i386 uses a special_function which does not - affect what we are doing here. */ - if (rel->howto != NULL - && rel->howto->pc_relative - && ! rel->howto->pcrel_offset - && rel->howto->rightshift == 0 - && rel->howto->size == 2 - && rel->howto->bitsize == 32 - && rel->howto->bitpos == 0 - && rel->howto->src_mask == 0xffffffff - && rel->howto->dst_mask == 0xffffffff) - { - bfd_vma val; - - /* When pcrel_offset is not set, it means that the negative - of the address of the memory location is stored in the - memory location. We must add it back in. */ - val = bfd_get_32 (abfd, (bfd_byte *) data + rel->address - offset); - val += rel->address; - bfd_put_32 (abfd, val, (bfd_byte *) data + rel->address - offset); - - rel->howto = &nlm_i386_pcrel_howto; - } - } - - return true; -} - -/* Read a NetWare i386 import record */ -static boolean -nlm_i386_read_import (abfd, sym) - bfd *abfd; - nlmNAME(symbol_type) *sym; -{ - struct nlm_relent *nlm_relocs; /* relocation records for symbol */ - bfd_size_type rcount; /* number of relocs */ - bfd_byte temp[NLM_TARGET_LONG_SIZE]; /* temporary 32-bit value */ - unsigned char symlength; /* length of symbol name */ - char *name; - - if (bfd_read ((PTR) &symlength, sizeof (symlength), 1, abfd) - != sizeof (symlength)) - return false; - sym -> symbol.the_bfd = abfd; - name = bfd_alloc (abfd, symlength + 1); - if (name == NULL) - return false; - if (bfd_read (name, symlength, 1, abfd) != symlength) - return false; - name[symlength] = '\0'; - sym -> symbol.name = name; - sym -> symbol.flags = 0; - sym -> symbol.value = 0; - sym -> symbol.section = bfd_und_section_ptr; - if (bfd_read ((PTR) temp, sizeof (temp), 1, abfd) != sizeof (temp)) - return false; - rcount = bfd_h_get_32 (abfd, temp); - nlm_relocs = ((struct nlm_relent *) - bfd_alloc (abfd, rcount * sizeof (struct nlm_relent))); - if (!nlm_relocs) - return false; - sym -> relocs = nlm_relocs; - sym -> rcnt = 0; - while (sym -> rcnt < rcount) - { - asection *section; - - if (nlm_i386_read_reloc (abfd, sym, §ion, - &nlm_relocs -> reloc) - == false) - return false; - nlm_relocs -> section = section; - nlm_relocs++; - sym -> rcnt++; - } - return true; -} - -/* Write out an external reference. */ - -static boolean -nlm_i386_write_external (abfd, count, sym, relocs) - bfd *abfd; - bfd_size_type count; - asymbol *sym; - struct reloc_and_sec *relocs; -{ - unsigned int i; - bfd_byte len; - unsigned char temp[NLM_TARGET_LONG_SIZE]; - - len = strlen (sym->name); - if ((bfd_write (&len, sizeof (bfd_byte), 1, abfd) != sizeof(bfd_byte)) - || bfd_write (sym->name, len, 1, abfd) != len) - return false; - - bfd_put_32 (abfd, count, temp); - if (bfd_write (temp, sizeof(temp), 1, abfd) != sizeof (temp)) - return false; - - for (i = 0; i < count; i++) - { - if (nlm_i386_write_import (abfd, relocs[i].sec, - relocs[i].rel) == false) - return false; - } - - return true; -} - -#include "nlmswap.h" - -static const struct nlm_backend_data nlm32_i386_backend = -{ - "NetWare Loadable Module\032", - sizeof (Nlm32_i386_External_Fixed_Header), - 0, /* optional_prefix_size */ - bfd_arch_i386, - 0, - false, - 0, /* backend_object_p */ - 0, /* write_prefix_func */ - nlm_i386_read_reloc, - nlm_i386_mangle_relocs, - nlm_i386_read_import, - nlm_i386_write_import, - 0, /* set_public_section */ - 0, /* get_public_offset */ - nlm_swap_fixed_header_in, - nlm_swap_fixed_header_out, - nlm_i386_write_external, - 0, /* write_export */ -}; - -#define TARGET_LITTLE_NAME "nlm32-i386" -#define TARGET_LITTLE_SYM nlmNAME(i386_vec) -#define TARGET_BACKEND_DATA &nlm32_i386_backend - -#include "nlm-target.h" diff --git a/contrib/gdb/bfd/nlm32-ppc.c b/contrib/gdb/bfd/nlm32-ppc.c deleted file mode 100644 index ecf2de8f10bf6..0000000000000 --- a/contrib/gdb/bfd/nlm32-ppc.c +++ /dev/null @@ -1,1045 +0,0 @@ -/* Support for 32-bit PowerPC NLM (NetWare Loadable Module) - Copyright (C) 1994, 1995 Free Software Foundation, Inc. - -This file is part of BFD, the Binary File Descriptor library. - -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 2 of the License, 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ - -#include "bfd.h" -#include "sysdep.h" -#include "libbfd.h" - -/* The format of a PowerPC NLM changed. Define OLDFORMAT to get the - old format. */ - -#define ARCH_SIZE 32 - -#include "nlm/ppc-ext.h" -#define Nlm_External_Fixed_Header Nlm32_powerpc_External_Fixed_Header - -#include "libnlm.h" - -#ifdef OLDFORMAT -static boolean nlm_powerpc_backend_object_p - PARAMS ((bfd *)); -static boolean nlm_powerpc_write_prefix - PARAMS ((bfd *)); -#endif - -static boolean nlm_powerpc_read_reloc - PARAMS ((bfd *, nlmNAME(symbol_type) *, asection **, arelent *)); -static boolean nlm_powerpc_mangle_relocs - PARAMS ((bfd *, asection *, PTR, bfd_vma, bfd_size_type)); -static boolean nlm_powerpc_read_import - PARAMS ((bfd *, nlmNAME(symbol_type) *)); - -#ifdef OLDFORMAT -static boolean nlm_powerpc_write_reloc - PARAMS ((bfd *, asection *, arelent *, int)); -#endif - -static boolean nlm_powerpc_write_import - PARAMS ((bfd *, asection *, arelent *)); -static boolean nlm_powerpc_write_external - PARAMS ((bfd *, bfd_size_type, asymbol *, struct reloc_and_sec *)); - -#ifndef OLDFORMAT -static boolean nlm_powerpc_set_public_section - PARAMS ((bfd *, nlmNAME(symbol_type) *)); -static bfd_vma nlm_powerpc_get_public_offset - PARAMS ((bfd *, asymbol *)); -#endif - -#ifdef OLDFORMAT - -/* The prefix header is only used in the old format. */ - -/* PowerPC NLM's have a prefix header before the standard NLM. This - function reads it in, verifies the version, and seeks the bfd to - the location before the regular NLM header. */ - -static boolean -nlm_powerpc_backend_object_p (abfd) - bfd *abfd; -{ - struct nlm32_powerpc_external_prefix_header s; - - if (bfd_read ((PTR) &s, sizeof s, 1, abfd) != sizeof s) - return false; - - if (memcmp (s.signature, NLM32_POWERPC_SIGNATURE, sizeof s.signature) != 0 - || bfd_h_get_32 (abfd, s.headerVersion) != NLM32_POWERPC_HEADER_VERSION) - return false; - - return true; -} - -/* Write out the prefix. */ - -static boolean -nlm_powerpc_write_prefix (abfd) - bfd *abfd; -{ - struct nlm32_powerpc_external_prefix_header s; - - memset (&s, 0, sizeof s); - memcpy (s.signature, NLM32_POWERPC_SIGNATURE, sizeof s.signature); - bfd_h_put_32 (abfd, (bfd_vma) NLM32_POWERPC_HEADER_VERSION, s.headerVersion); - bfd_h_put_32 (abfd, (bfd_vma) 0, s.origins); - - /* FIXME: What should we do about the date? */ - - if (bfd_write ((PTR) &s, sizeof s, 1, abfd) != sizeof s) - return false; - - return true; -} - -#endif /* OLDFORMAT */ - -#ifndef OLDFORMAT - -/* There is only one type of reloc in a PowerPC NLM. */ - -static reloc_howto_type nlm_powerpc_howto = - HOWTO (0, /* type */ - 0, /* rightshift */ - 2, /* size (0 = byte, 1 = short, 2 = long) */ - 32, /* bitsize */ - false, /* pc_relative */ - 0, /* bitpos */ - complain_overflow_bitfield, /* complain_on_overflow */ - 0, /* special_function */ - "32", /* name */ - true, /* partial_inplace */ - 0xffffffff, /* src_mask */ - 0xffffffff, /* dst_mask */ - false); /* pcrel_offset */ - -/* Read a PowerPC NLM reloc. */ - -static boolean -nlm_powerpc_read_reloc (abfd, sym, secp, rel) - bfd *abfd; - nlmNAME(symbol_type) *sym; - asection **secp; - arelent *rel; -{ - bfd_byte temp[4]; - bfd_vma val; - const char *name; - - if (bfd_read (temp, sizeof (temp), 1, abfd) != sizeof (temp)) - return false; - - val = bfd_get_32 (abfd, temp); - - /* The value is a word offset into either the code or data segment. - This is the location which needs to be adjusted. - - The high bit is 0 if the value is an offset into the data - segment, or 1 if the value is an offset into the text segment. - - If this is a relocation fixup rather than an imported symbol (the - sym argument is NULL), then the second most significant bit is 0 - if the address of the data segment should be added to the - location addressed by the value, or 1 if the address of the text - segment should be added. - - If this is an imported symbol, the second most significant bit is - not used and must be 0. */ - - if ((val & NLM_HIBIT) == 0) - name = NLM_INITIALIZED_DATA_NAME; - else - { - name = NLM_CODE_NAME; - val &=~ NLM_HIBIT; - } - *secp = bfd_get_section_by_name (abfd, name); - - if (sym == NULL) - { - if ((val & (NLM_HIBIT >> 1)) == 0) - name = NLM_INITIALIZED_DATA_NAME; - else - { - name = NLM_CODE_NAME; - val &=~ (NLM_HIBIT >> 1); - } - rel->sym_ptr_ptr = bfd_get_section_by_name (abfd, name)->symbol_ptr_ptr; - } - - rel->howto = &nlm_powerpc_howto; - - rel->address = val << 2; - rel->addend = 0; - - return true; -} - -#else /* OLDFORMAT */ - -/* This reloc handling is only applicable to the old format. */ - -/* How to process the various reloc types. PowerPC NLMs use XCOFF - reloc types, and I have just copied the XCOFF reloc table here. */ - -static reloc_howto_type nlm_powerpc_howto_table[] = -{ - /* Standard 32 bit relocation. */ - HOWTO (0, /* type */ - 0, /* rightshift */ - 2, /* size (0 = byte, 1 = short, 2 = long) */ - 32, /* bitsize */ - false, /* pc_relative */ - 0, /* bitpos */ - complain_overflow_bitfield, /* complain_on_overflow */ - 0, /* special_function */ - "R_POS", /* name */ - true, /* partial_inplace */ - 0xffffffff, /* src_mask */ - 0xffffffff, /* dst_mask */ - false), /* pcrel_offset */ - - /* 32 bit relocation, but store negative value. */ - HOWTO (1, /* type */ - 0, /* rightshift */ - -2, /* size (0 = byte, 1 = short, 2 = long) */ - 32, /* bitsize */ - false, /* pc_relative */ - 0, /* bitpos */ - complain_overflow_bitfield, /* complain_on_overflow */ - 0, /* special_function */ - "R_NEG", /* name */ - true, /* partial_inplace */ - 0xffffffff, /* src_mask */ - 0xffffffff, /* dst_mask */ - false), /* pcrel_offset */ - - /* 32 bit PC relative relocation. */ - HOWTO (2, /* type */ - 0, /* rightshift */ - 2, /* size (0 = byte, 1 = short, 2 = long) */ - 32, /* bitsize */ - true, /* pc_relative */ - 0, /* bitpos */ - complain_overflow_signed, /* complain_on_overflow */ - 0, /* special_function */ - "R_REL", /* name */ - true, /* partial_inplace */ - 0xffffffff, /* src_mask */ - 0xffffffff, /* dst_mask */ - false), /* pcrel_offset */ - - /* 16 bit TOC relative relocation. */ - HOWTO (3, /* type */ - 0, /* rightshift */ - 1, /* size (0 = byte, 1 = short, 2 = long) */ - 16, /* bitsize */ - false, /* pc_relative */ - 0, /* bitpos */ - complain_overflow_signed, /* complain_on_overflow */ - 0, /* special_function */ - "R_TOC", /* name */ - true, /* partial_inplace */ - 0xffff, /* src_mask */ - 0xffff, /* dst_mask */ - false), /* pcrel_offset */ - - /* I don't really know what this is. */ - HOWTO (4, /* type */ - 1, /* rightshift */ - 2, /* size (0 = byte, 1 = short, 2 = long) */ - 32, /* bitsize */ - false, /* pc_relative */ - 0, /* bitpos */ - complain_overflow_bitfield, /* complain_on_overflow */ - 0, /* special_function */ - "R_RTB", /* name */ - true, /* partial_inplace */ - 0xffffffff, /* src_mask */ - 0xffffffff, /* dst_mask */ - false), /* pcrel_offset */ - - /* External TOC relative symbol. */ - HOWTO (5, /* type */ - 0, /* rightshift */ - 2, /* size (0 = byte, 1 = short, 2 = long) */ - 16, /* bitsize */ - false, /* pc_relative */ - 0, /* bitpos */ - complain_overflow_bitfield, /* complain_on_overflow */ - 0, /* special_function */ - "R_GL", /* name */ - true, /* partial_inplace */ - 0xffff, /* src_mask */ - 0xffff, /* dst_mask */ - false), /* pcrel_offset */ - - /* Local TOC relative symbol. */ - HOWTO (6, /* type */ - 0, /* rightshift */ - 2, /* size (0 = byte, 1 = short, 2 = long) */ - 16, /* bitsize */ - false, /* pc_relative */ - 0, /* bitpos */ - complain_overflow_bitfield, /* complain_on_overflow */ - 0, /* special_function */ - "R_TCL", /* name */ - true, /* partial_inplace */ - 0xffff, /* src_mask */ - 0xffff, /* dst_mask */ - false), /* pcrel_offset */ - - { 7 }, - - /* Non modifiable absolute branch. */ - HOWTO (8, /* type */ - 0, /* rightshift */ - 2, /* size (0 = byte, 1 = short, 2 = long) */ - 26, /* bitsize */ - false, /* pc_relative */ - 0, /* bitpos */ - complain_overflow_bitfield, /* complain_on_overflow */ - 0, /* special_function */ - "R_BA", /* name */ - true, /* partial_inplace */ - 0x3fffffc, /* src_mask */ - 0x3fffffc, /* dst_mask */ - false), /* pcrel_offset */ - - { 9 }, - - /* Non modifiable relative branch. */ - HOWTO (0xa, /* type */ - 0, /* rightshift */ - 2, /* size (0 = byte, 1 = short, 2 = long) */ - 26, /* bitsize */ - true, /* pc_relative */ - 0, /* bitpos */ - complain_overflow_signed, /* complain_on_overflow */ - 0, /* special_function */ - "R_BR", /* name */ - true, /* partial_inplace */ - 0x3fffffc, /* src_mask */ - 0x3fffffc, /* dst_mask */ - false), /* pcrel_offset */ - - { 0xb }, - - /* Indirect load. */ - HOWTO (0xc, /* type */ - 0, /* rightshift */ - 2, /* size (0 = byte, 1 = short, 2 = long) */ - 16, /* bitsize */ - false, /* pc_relative */ - 0, /* bitpos */ - complain_overflow_bitfield, /* complain_on_overflow */ - 0, /* special_function */ - "R_RL", /* name */ - true, /* partial_inplace */ - 0xffff, /* src_mask */ - 0xffff, /* dst_mask */ - false), /* pcrel_offset */ - - /* Load address. */ - HOWTO (0xd, /* type */ - 0, /* rightshift */ - 2, /* size (0 = byte, 1 = short, 2 = long) */ - 16, /* bitsize */ - false, /* pc_relative */ - 0, /* bitpos */ - complain_overflow_bitfield, /* complain_on_overflow */ - 0, /* special_function */ - "R_RLA", /* name */ - true, /* partial_inplace */ - 0xffff, /* src_mask */ - 0xffff, /* dst_mask */ - false), /* pcrel_offset */ - - { 0xe }, - - /* Non-relocating reference. */ - HOWTO (0xf, /* type */ - 0, /* rightshift */ - 2, /* size (0 = byte, 1 = short, 2 = long) */ - 32, /* bitsize */ - false, /* pc_relative */ - 0, /* bitpos */ - complain_overflow_bitfield, /* complain_on_overflow */ - 0, /* special_function */ - "R_REF", /* name */ - false, /* partial_inplace */ - 0, /* src_mask */ - 0, /* dst_mask */ - false), /* pcrel_offset */ - - { 0x10 }, - { 0x11 }, - - /* TOC relative indirect load. */ - HOWTO (0x12, /* type */ - 0, /* rightshift */ - 2, /* size (0 = byte, 1 = short, 2 = long) */ - 16, /* bitsize */ - false, /* pc_relative */ - 0, /* bitpos */ - complain_overflow_bitfield, /* complain_on_overflow */ - 0, /* special_function */ - "R_TRL", /* name */ - true, /* partial_inplace */ - 0xffff, /* src_mask */ - 0xffff, /* dst_mask */ - false), /* pcrel_offset */ - - /* TOC relative load address. */ - HOWTO (0x13, /* type */ - 0, /* rightshift */ - 2, /* size (0 = byte, 1 = short, 2 = long) */ - 16, /* bitsize */ - false, /* pc_relative */ - 0, /* bitpos */ - complain_overflow_bitfield, /* complain_on_overflow */ - 0, /* special_function */ - "R_TRLA", /* name */ - true, /* partial_inplace */ - 0xffff, /* src_mask */ - 0xffff, /* dst_mask */ - false), /* pcrel_offset */ - - /* Modifiable relative branch. */ - HOWTO (0x14, /* type */ - 1, /* rightshift */ - 2, /* size (0 = byte, 1 = short, 2 = long) */ - 32, /* bitsize */ - false, /* pc_relative */ - 0, /* bitpos */ - complain_overflow_bitfield, /* complain_on_overflow */ - 0, /* special_function */ - "R_RRTBI", /* name */ - true, /* partial_inplace */ - 0xffffffff, /* src_mask */ - 0xffffffff, /* dst_mask */ - false), /* pcrel_offset */ - - /* Modifiable absolute branch. */ - HOWTO (0x15, /* type */ - 1, /* rightshift */ - 2, /* size (0 = byte, 1 = short, 2 = long) */ - 32, /* bitsize */ - false, /* pc_relative */ - 0, /* bitpos */ - complain_overflow_bitfield, /* complain_on_overflow */ - 0, /* special_function */ - "R_RRTBA", /* name */ - true, /* partial_inplace */ - 0xffffffff, /* src_mask */ - 0xffffffff, /* dst_mask */ - false), /* pcrel_offset */ - - /* Modifiable call absolute indirect. */ - HOWTO (0x16, /* type */ - 0, /* rightshift */ - 2, /* size (0 = byte, 1 = short, 2 = long) */ - 16, /* bitsize */ - false, /* pc_relative */ - 0, /* bitpos */ - complain_overflow_bitfield, /* complain_on_overflow */ - 0, /* special_function */ - "R_CAI", /* name */ - true, /* partial_inplace */ - 0xffff, /* src_mask */ - 0xffff, /* dst_mask */ - false), /* pcrel_offset */ - - /* Modifiable call relative. */ - HOWTO (0x17, /* type */ - 0, /* rightshift */ - 2, /* size (0 = byte, 1 = short, 2 = long) */ - 16, /* bitsize */ - false, /* pc_relative */ - 0, /* bitpos */ - complain_overflow_bitfield, /* complain_on_overflow */ - 0, /* special_function */ - "R_REL", /* name */ - true, /* partial_inplace */ - 0xffff, /* src_mask */ - 0xffff, /* dst_mask */ - false), /* pcrel_offset */ - - /* Modifiable branch absolute. */ - HOWTO (0x18, /* type */ - 0, /* rightshift */ - 2, /* size (0 = byte, 1 = short, 2 = long) */ - 16, /* bitsize */ - false, /* pc_relative */ - 0, /* bitpos */ - complain_overflow_bitfield, /* complain_on_overflow */ - 0, /* special_function */ - "R_RBA", /* name */ - true, /* partial_inplace */ - 0xffff, /* src_mask */ - 0xffff, /* dst_mask */ - false), /* pcrel_offset */ - - /* Modifiable branch absolute. */ - HOWTO (0x19, /* type */ - 0, /* rightshift */ - 2, /* size (0 = byte, 1 = short, 2 = long) */ - 16, /* bitsize */ - false, /* pc_relative */ - 0, /* bitpos */ - complain_overflow_bitfield, /* complain_on_overflow */ - 0, /* special_function */ - "R_RBAC", /* name */ - true, /* partial_inplace */ - 0xffff, /* src_mask */ - 0xffff, /* dst_mask */ - false), /* pcrel_offset */ - - /* Modifiable branch relative. */ - HOWTO (0x1a, /* type */ - 0, /* rightshift */ - 2, /* size (0 = byte, 1 = short, 2 = long) */ - 26, /* bitsize */ - false, /* pc_relative */ - 0, /* bitpos */ - complain_overflow_signed, /* complain_on_overflow */ - 0, /* special_function */ - "R_REL", /* name */ - true, /* partial_inplace */ - 0xffff, /* src_mask */ - 0xffff, /* dst_mask */ - false), /* pcrel_offset */ - - /* Modifiable branch absolute. */ - HOWTO (0x1b, /* type */ - 0, /* rightshift */ - 2, /* size (0 = byte, 1 = short, 2 = long) */ - 16, /* bitsize */ - false, /* pc_relative */ - 0, /* bitpos */ - complain_overflow_bitfield, /* complain_on_overflow */ - 0, /* special_function */ - "R_REL", /* name */ - true, /* partial_inplace */ - 0xffff, /* src_mask */ - 0xffff, /* dst_mask */ - false) /* pcrel_offset */ -}; - -#define HOWTO_COUNT (sizeof nlm_powerpc_howto_table \ - / sizeof nlm_powerpc_howto_table[0]) - -/* Read a PowerPC NLM reloc. */ - -static boolean -nlm_powerpc_read_reloc (abfd, sym, secp, rel) - bfd *abfd; - nlmNAME(symbol_type) *sym; - asection **secp; - arelent *rel; -{ - struct nlm32_powerpc_external_reloc ext; - bfd_vma l_vaddr; - unsigned long l_symndx; - int l_rtype; - int l_rsecnm; - asection *code_sec, *data_sec, *bss_sec; - - /* Read the reloc from the file. */ - if (bfd_read (&ext, sizeof ext, 1, abfd) != sizeof ext) - return false; - - /* Swap in the fields. */ - l_vaddr = bfd_h_get_32 (abfd, ext.l_vaddr); - l_symndx = bfd_h_get_32 (abfd, ext.l_symndx); - l_rtype = bfd_h_get_16 (abfd, ext.l_rtype); - l_rsecnm = bfd_h_get_16 (abfd, ext.l_rsecnm); - - /* Get the sections now, for convenience. */ - code_sec = bfd_get_section_by_name (abfd, NLM_CODE_NAME); - data_sec = bfd_get_section_by_name (abfd, NLM_INITIALIZED_DATA_NAME); - bss_sec = bfd_get_section_by_name (abfd, NLM_UNINITIALIZED_DATA_NAME); - - /* Work out the arelent fields. */ - if (sym != NULL) - { - /* This is an import. sym_ptr_ptr is filled in by - nlm_canonicalize_reloc. */ - rel->sym_ptr_ptr = NULL; - } - else - { - asection *sec; - - if (l_symndx == 0) - sec = code_sec; - else if (l_symndx == 1) - sec = data_sec; - else if (l_symndx == 2) - sec = bss_sec; - else - { - bfd_set_error (bfd_error_bad_value); - return false; - } - - rel->sym_ptr_ptr = sec->symbol_ptr_ptr; - } - - rel->addend = 0; - - BFD_ASSERT ((l_rtype & 0xff) < HOWTO_COUNT); - - rel->howto = nlm_powerpc_howto_table + (l_rtype & 0xff); - - BFD_ASSERT (rel->howto->name != NULL - && ((l_rtype & 0x8000) != 0 - ? (rel->howto->complain_on_overflow - == complain_overflow_signed) - : (rel->howto->complain_on_overflow - == complain_overflow_bitfield)) - && ((l_rtype >> 8) & 0x1f) == rel->howto->bitsize - 1); - - if (l_rsecnm == 0) - *secp = code_sec; - else if (l_rsecnm == 1) - { - *secp = data_sec; - l_vaddr -= bfd_section_size (abfd, code_sec); - } - else - { - bfd_set_error (bfd_error_bad_value); - return false; - } - - rel->address = l_vaddr; - - return true; -} - -#endif /* OLDFORMAT */ - -/* Mangle PowerPC NLM relocs for output. */ - -static boolean -nlm_powerpc_mangle_relocs (abfd, sec, data, offset, count) - bfd *abfd; - asection *sec; - PTR data; - bfd_vma offset; - bfd_size_type count; -{ - return true; -} - -/* Read a PowerPC NLM import record */ - -static boolean -nlm_powerpc_read_import (abfd, sym) - bfd *abfd; - nlmNAME(symbol_type) *sym; -{ - struct nlm_relent *nlm_relocs; /* relocation records for symbol */ - bfd_size_type rcount; /* number of relocs */ - bfd_byte temp[NLM_TARGET_LONG_SIZE]; /* temporary 32-bit value */ - unsigned char symlength; /* length of symbol name */ - char *name; - - if (bfd_read ((PTR) &symlength, sizeof (symlength), 1, abfd) - != sizeof (symlength)) - return (false); - sym -> symbol.the_bfd = abfd; - name = bfd_alloc (abfd, symlength + 1); - if (name == NULL) - return false; - if (bfd_read (name, symlength, 1, abfd) != symlength) - return (false); - name[symlength] = '\0'; - sym -> symbol.name = name; - sym -> symbol.flags = 0; - sym -> symbol.value = 0; - sym -> symbol.section = bfd_und_section_ptr; - if (bfd_read ((PTR) temp, sizeof (temp), 1, abfd) != sizeof (temp)) - return (false); - rcount = bfd_h_get_32 (abfd, temp); - nlm_relocs = ((struct nlm_relent *) - bfd_alloc (abfd, rcount * sizeof (struct nlm_relent))); - if (nlm_relocs == (struct nlm_relent *) NULL) - return false; - sym -> relocs = nlm_relocs; - sym -> rcnt = 0; - while (sym -> rcnt < rcount) - { - asection *section; - - if (nlm_powerpc_read_reloc (abfd, sym, §ion, - &nlm_relocs -> reloc) - == false) - return false; - nlm_relocs -> section = section; - nlm_relocs++; - sym -> rcnt++; - } - return true; -} - -#ifndef OLDFORMAT - -/* Write a PowerPC NLM reloc. */ - -static boolean -nlm_powerpc_write_import (abfd, sec, rel) - bfd *abfd; - asection *sec; - arelent *rel; -{ - asymbol *sym; - bfd_vma val; - bfd_byte temp[4]; - - /* PowerPC NetWare only supports one kind of reloc. */ - if (rel->addend != 0 - || rel->howto == NULL - || rel->howto->rightshift != 0 - || rel->howto->size != 2 - || rel->howto->bitsize != 32 - || rel->howto->bitpos != 0 - || rel->howto->pc_relative - || (rel->howto->src_mask != 0xffffffff && rel->addend != 0) - || rel->howto->dst_mask != 0xffffffff) - { - bfd_set_error (bfd_error_invalid_operation); - return false; - } - - sym = *rel->sym_ptr_ptr; - - /* The value we write out is the offset into the appropriate - segment, rightshifted by two. This offset is the section vma, - adjusted by the vma of the lowest section in that segment, plus - the address of the relocation. */ - val = bfd_get_section_vma (abfd, sec) + rel->address; - if ((val & 3) != 0) - { - bfd_set_error (bfd_error_bad_value); - return false; - } - val >>= 2; - - /* The high bit is 0 if the reloc is in the data section, or 1 if - the reloc is in the code section. */ - if (bfd_get_section_flags (abfd, sec) & SEC_DATA) - val -= nlm_get_data_low (abfd); - else - { - val -= nlm_get_text_low (abfd); - val |= NLM_HIBIT; - } - - if (! bfd_is_und_section (bfd_get_section (sym))) - { - /* This is an internal relocation fixup. The second most - significant bit is 0 if this is a reloc against the data - segment, or 1 if it is a reloc against the text segment. */ - if (bfd_get_section_flags (abfd, bfd_get_section (sym)) & SEC_CODE) - val |= NLM_HIBIT >> 1; - } - - bfd_put_32 (abfd, val, temp); - if (bfd_write (temp, sizeof (temp), 1, abfd) != sizeof (temp)) - return false; - - return true; -} - -#else /* OLDFORMAT */ - -/* This is used for the reloc handling in the old format. */ - -/* Write a PowerPC NLM reloc. */ - -static boolean -nlm_powerpc_write_reloc (abfd, sec, rel, indx) - bfd *abfd; - asection *sec; - arelent *rel; - int indx; -{ - struct nlm32_powerpc_external_reloc ext; - asection *code_sec, *data_sec, *bss_sec; - asymbol *sym; - asection *symsec; - unsigned long l_symndx; - int l_rtype; - int l_rsecnm; - reloc_howto_type *howto; - bfd_size_type address; - - /* Get the sections now, for convenience. */ - code_sec = bfd_get_section_by_name (abfd, NLM_CODE_NAME); - data_sec = bfd_get_section_by_name (abfd, NLM_INITIALIZED_DATA_NAME); - bss_sec = bfd_get_section_by_name (abfd, NLM_UNINITIALIZED_DATA_NAME); - - sym = *rel->sym_ptr_ptr; - symsec = bfd_get_section (sym); - if (indx != -1) - { - BFD_ASSERT (bfd_is_und_section (symsec)); - l_symndx = indx + 3; - } - else - { - if (symsec == code_sec) - l_symndx = 0; - else if (symsec == data_sec) - l_symndx = 1; - else if (symsec == bss_sec) - l_symndx = 2; - else - { - bfd_set_error (bfd_error_bad_value); - return false; - } - } - - bfd_h_put_32 (abfd, (bfd_vma) l_symndx, ext.l_symndx); - - for (howto = nlm_powerpc_howto_table; - howto < nlm_powerpc_howto_table + HOWTO_COUNT; - howto++) - { - if (howto->rightshift == rel->howto->rightshift - && howto->size == rel->howto->size - && howto->bitsize == rel->howto->bitsize - && howto->pc_relative == rel->howto->pc_relative - && howto->bitpos == rel->howto->bitpos - && (howto->partial_inplace == rel->howto->partial_inplace - || (! rel->howto->partial_inplace - && rel->addend == 0)) - && (howto->src_mask == rel->howto->src_mask - || (rel->howto->src_mask == 0 - && rel->addend == 0)) - && howto->dst_mask == rel->howto->dst_mask - && howto->pcrel_offset == rel->howto->pcrel_offset) - break; - } - if (howto >= nlm_powerpc_howto_table + HOWTO_COUNT) - { - bfd_set_error (bfd_error_bad_value); - return false; - } - - l_rtype = howto->type; - if (howto->complain_on_overflow == complain_overflow_signed) - l_rtype |= 0x8000; - l_rtype |= (howto->bitsize - 1) << 8; - bfd_h_put_16 (abfd, (bfd_vma) l_rtype, ext.l_rtype); - - address = rel->address; - - if (sec == code_sec) - l_rsecnm = 0; - else if (sec == data_sec) - { - l_rsecnm = 1; - address += bfd_section_size (abfd, code_sec); - } - else - { - bfd_set_error (bfd_error_bad_value); - return false; - } - - bfd_h_put_16 (abfd, (bfd_vma) l_rsecnm, ext.l_rsecnm); - bfd_h_put_32 (abfd, (bfd_vma) address, ext.l_vaddr); - - if (bfd_write (&ext, sizeof ext, 1, abfd) != sizeof ext) - return false; - - return true; -} - -/* Write a PowerPC NLM import. */ - -static boolean -nlm_powerpc_write_import (abfd, sec, rel) - bfd *abfd; - asection *sec; - arelent *rel; -{ - return nlm_powerpc_write_reloc (abfd, sec, rel, -1); -} - -#endif /* OLDFORMAT */ - -/* Write a PowerPC NLM external symbol. This routine keeps a static - count of the symbol index. FIXME: I don't know if this is - necessary, and the index never gets reset. */ - -static boolean -nlm_powerpc_write_external (abfd, count, sym, relocs) - bfd *abfd; - bfd_size_type count; - asymbol *sym; - struct reloc_and_sec *relocs; -{ - unsigned int i; - bfd_byte len; - unsigned char temp[NLM_TARGET_LONG_SIZE]; -#ifdef OLDFORMAT - static int indx; -#endif - - len = strlen (sym->name); - if ((bfd_write (&len, sizeof (bfd_byte), 1, abfd) != sizeof(bfd_byte)) - || bfd_write (sym->name, len, 1, abfd) != len) - return false; - - bfd_put_32 (abfd, count, temp); - if (bfd_write (temp, sizeof(temp), 1, abfd) != sizeof (temp)) - return false; - - for (i = 0; i < count; i++) - { -#ifndef OLDFORMAT - if (! nlm_powerpc_write_import (abfd, relocs[i].sec, relocs[i].rel)) - return false; -#else - if (! nlm_powerpc_write_reloc (abfd, relocs[i].sec, - relocs[i].rel, indx)) - return false; -#endif - } - -#ifdef OLDFORMAT - ++indx; -#endif - - return true; -} - -#ifndef OLDFORMAT - -/* PowerPC Netware uses a word offset, not a byte offset, for public - symbols. */ - -/* Set the section for a public symbol. */ - -static boolean -nlm_powerpc_set_public_section (abfd, sym) - bfd *abfd; - nlmNAME(symbol_type) *sym; -{ - if (sym->symbol.value & NLM_HIBIT) - { - sym->symbol.value &= ~NLM_HIBIT; - sym->symbol.flags |= BSF_FUNCTION; - sym->symbol.section = - bfd_get_section_by_name (abfd, NLM_CODE_NAME); - } - else - { - sym->symbol.section = - bfd_get_section_by_name (abfd, NLM_INITIALIZED_DATA_NAME); - } - - sym->symbol.value <<= 2; - - return true; -} - -/* Get the offset to write out for a public symbol. */ - -static bfd_vma -nlm_powerpc_get_public_offset (abfd, sym) - bfd *abfd; - asymbol *sym; -{ - bfd_vma offset; - asection *sec; - - offset = bfd_asymbol_value (sym); - sec = bfd_get_section (sym); - if (sec->flags & SEC_CODE) - { - offset -= nlm_get_text_low (abfd); - offset |= NLM_HIBIT; - } - else if (sec->flags & (SEC_DATA | SEC_ALLOC)) - { - /* SEC_ALLOC is for the .bss section. */ - offset -= nlm_get_data_low (abfd); - } - else - { - /* We can't handle an exported symbol that is not in the code or - data segment. */ - bfd_set_error (bfd_error_invalid_operation); - /* FIXME: No way to return error. */ - abort (); - } - - return offset; -} - -#endif /* ! defined (OLDFORMAT) */ - -#include "nlmswap.h" - -static const struct nlm_backend_data nlm32_powerpc_backend = -{ - "NetWare PowerPC Module \032", - sizeof (Nlm32_powerpc_External_Fixed_Header), -#ifndef OLDFORMAT - 0, /* optional_prefix_size */ -#else - sizeof (struct nlm32_powerpc_external_prefix_header), -#endif - bfd_arch_powerpc, - 0, - false, -#ifndef OLDFORMAT - 0, /* backend_object_p */ - 0, /* write_prefix */ -#else - nlm_powerpc_backend_object_p, - nlm_powerpc_write_prefix, -#endif - nlm_powerpc_read_reloc, - nlm_powerpc_mangle_relocs, - nlm_powerpc_read_import, - nlm_powerpc_write_import, -#ifndef OLDFORMAT - nlm_powerpc_set_public_section, - nlm_powerpc_get_public_offset, -#else - 0, /* set_public_section */ - 0, /* get_public_offset */ -#endif - nlm_swap_fixed_header_in, - nlm_swap_fixed_header_out, - nlm_powerpc_write_external, - 0, /* write_export */ -}; - -#define TARGET_BIG_NAME "nlm32-powerpc" -#define TARGET_BIG_SYM nlmNAME(powerpc_vec) -#define TARGET_BACKEND_DATA &nlm32_powerpc_backend - -#include "nlm-target.h" diff --git a/contrib/gdb/bfd/nlm32-sparc.c b/contrib/gdb/bfd/nlm32-sparc.c deleted file mode 100644 index 5963adbc70bf0..0000000000000 --- a/contrib/gdb/bfd/nlm32-sparc.c +++ /dev/null @@ -1,440 +0,0 @@ -/* Support for 32-bit SPARC NLM (NetWare Loadable Module) - Copyright (C) 1993 Free Software Foundation, Inc. - -This file is part of BFD, the Binary File Descriptor library. - -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 2 of the License, 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ - -#include "bfd.h" -#include "sysdep.h" -#include "libbfd.h" - -#define ARCH_SIZE 32 - -#include "nlm/sparc32-ext.h" -#define Nlm_External_Fixed_Header Nlm32_sparc_External_Fixed_Header - -#include "libnlm.h" - -static boolean nlm_sparc_read_reloc - PARAMS ((bfd *, nlmNAME(symbol_type) *, asection **, arelent *)); -static boolean nlm_sparc_write_reloc - PARAMS ((bfd *, asection *, arelent *)); -static boolean nlm_sparc_mangle_relocs - PARAMS ((bfd *, asection *, PTR, bfd_vma, bfd_size_type)); -static boolean nlm_sparc_read_import - PARAMS ((bfd *, nlmNAME(symbol_type) *)); -static boolean nlm_sparc_write_import - PARAMS ((bfd *, asection *, arelent *)); -static boolean nlm_sparc_write_external - PARAMS ((bfd *, bfd_size_type, asymbol *, struct reloc_and_sec *)); - -enum reloc_type - { - R_SPARC_NONE = 0, - R_SPARC_8, R_SPARC_16, R_SPARC_32, - R_SPARC_DISP8, R_SPARC_DISP16, R_SPARC_DISP32, - R_SPARC_WDISP30, R_SPARC_WDISP22, - R_SPARC_HI22, R_SPARC_22, - R_SPARC_13, R_SPARC_LO10, - R_SPARC_GOT10, R_SPARC_GOT13, R_SPARC_GOT22, - R_SPARC_PC10, R_SPARC_PC22, - R_SPARC_WPLT30, - R_SPARC_COPY, - R_SPARC_GLOB_DAT, R_SPARC_JMP_SLOT, - R_SPARC_RELATIVE, - R_SPARC_UA32, - R_SPARC_max - }; - -#if 0 -static CONST char *CONST reloc_type_names[] = -{ - "R_SPARC_NONE", - "R_SPARC_8", "R_SPARC_16", "R_SPARC_32", - "R_SPARC_DISP8", "R_SPARC_DISP16", "R_SPARC_DISP32", - "R_SPARC_WDISP30", "R_SPARC_WDISP22", - "R_SPARC_HI22", "R_SPARC_22", - "R_SPARC_13", "R_SPARC_LO10", - "R_SPARC_GOT10", "R_SPARC_GOT13", "R_SPARC_GOT22", - "R_SPARC_PC10", "R_SPARC_PC22", - "R_SPARC_WPLT30", - "R_SPARC_COPY", - "R_SPARC_GLOB_DAT", "R_SPARC_JMP_SLOT", - "R_SPARC_RELATIVE", - "R_SPARC_UA32", -}; -#endif - -static reloc_howto_type nlm32_sparc_howto_table[] = -{ - HOWTO(R_SPARC_NONE, 0,0, 0,false,0,complain_overflow_dont, 0,"R_SPARC_NONE", false,0,0x00000000,true), - HOWTO(R_SPARC_8, 0,0, 8,false,0,complain_overflow_bitfield,0,"R_SPARC_8", false,0,0x000000ff,true), - HOWTO(R_SPARC_16, 0,1,16,false,0,complain_overflow_bitfield,0,"R_SPARC_16", false,0,0x0000ffff,true), - HOWTO(R_SPARC_32, 0,2,32,false,0,complain_overflow_bitfield,0,"R_SPARC_32", false,0,0xffffffff,true), - HOWTO(R_SPARC_DISP8, 0,0, 8,true, 0,complain_overflow_signed, 0,"R_SPARC_DISP8", false,0,0x000000ff,true), - HOWTO(R_SPARC_DISP16, 0,1,16,true, 0,complain_overflow_signed, 0,"R_SPARC_DISP16", false,0,0x0000ffff,true), - HOWTO(R_SPARC_DISP32, 0,2,32,true, 0,complain_overflow_signed, 0,"R_SPARC_DISP32", false,0,0x00ffffff,true), - HOWTO(R_SPARC_WDISP30, 2,2,30,true, 0,complain_overflow_signed, 0,"R_SPARC_WDISP30", false,0,0x3fffffff,true), - HOWTO(R_SPARC_WDISP22, 2,2,22,true, 0,complain_overflow_signed, 0,"R_SPARC_WDISP22", false,0,0x003fffff,true), - HOWTO(R_SPARC_HI22, 10,2,22,false,0,complain_overflow_dont, 0,"R_SPARC_HI22", false,0,0x003fffff,true), - HOWTO(R_SPARC_22, 0,2,22,false,0,complain_overflow_bitfield,0,"R_SPARC_22", false,0,0x003fffff,true), - HOWTO(R_SPARC_13, 0,2,13,false,0,complain_overflow_bitfield,0,"R_SPARC_13", false,0,0x00001fff,true), - HOWTO(R_SPARC_LO10, 0,2,10,false,0,complain_overflow_dont, 0,"R_SPARC_LO10", false,0,0x000003ff,true), - HOWTO(R_SPARC_GOT10, 0,2,10,false,0,complain_overflow_bitfield,0,"R_SPARC_GOT10", false,0,0x000003ff,true), - HOWTO(R_SPARC_GOT13, 0,2,13,false,0,complain_overflow_bitfield,0,"R_SPARC_GOT13", false,0,0x00001fff,true), - HOWTO(R_SPARC_GOT22, 10,2,22,false,0,complain_overflow_bitfield,0,"R_SPARC_GOT22", false,0,0x003fffff,true), - HOWTO(R_SPARC_PC10, 0,2,10,false,0,complain_overflow_bitfield,0,"R_SPARC_PC10", false,0,0x000003ff,true), - HOWTO(R_SPARC_PC22, 0,2,22,false,0,complain_overflow_bitfield,0,"R_SPARC_PC22", false,0,0x003fffff,true), - HOWTO(R_SPARC_WPLT30, 0,0,00,false,0,complain_overflow_dont, 0,"R_SPARC_WPLT30", false,0,0x00000000,true), - HOWTO(R_SPARC_COPY, 0,0,00,false,0,complain_overflow_dont, 0,"R_SPARC_COPY", false,0,0x00000000,true), - HOWTO(R_SPARC_GLOB_DAT,0,0,00,false,0,complain_overflow_dont, 0,"R_SPARC_GLOB_DAT",false,0,0x00000000,true), - HOWTO(R_SPARC_JMP_SLOT,0,0,00,false,0,complain_overflow_dont, 0,"R_SPARC_JMP_SLOT",false,0,0x00000000,true), - HOWTO(R_SPARC_RELATIVE,0,0,00,false,0,complain_overflow_dont, 0,"R_SPARC_RELATIVE",false,0,0x00000000,true), - HOWTO(R_SPARC_UA32, 0,0,00,false,0,complain_overflow_dont, 0,"R_SPARC_UA32", false,0,0x00000000,true), -}; - -/* Read a NetWare sparc reloc. */ - -struct nlm32_sparc_reloc_ext { - unsigned char offset[4]; - unsigned char addend[4]; - unsigned char type[1]; - unsigned char pad1[3]; -}; - -static boolean -nlm_sparc_read_reloc (abfd, sym, secp, rel) - bfd *abfd; - nlmNAME(symbol_type) *sym; - asection **secp; - arelent *rel; -{ - bfd_vma val, addend; - unsigned int index; - unsigned int type; - struct nlm32_sparc_reloc_ext tmp_reloc; - asection *code_sec, *data_sec; - - if (bfd_read (&tmp_reloc, 12, 1, abfd) != 12) - return false; - - code_sec = bfd_get_section_by_name (abfd, NLM_CODE_NAME); - data_sec = bfd_get_section_by_name (abfd, NLM_INITIALIZED_DATA_NAME); - - *secp = code_sec; - - val = bfd_get_32 (abfd, tmp_reloc.offset); - addend = bfd_get_32 (abfd, tmp_reloc.addend); - type = bfd_get_8 (abfd, tmp_reloc.type); - - rel->address = val; - rel->addend = addend; - rel->howto = NULL; - - for (index = 0; - index < sizeof(nlm32_sparc_howto_table) / sizeof(reloc_howto_type); - index++) - if (nlm32_sparc_howto_table[index].type == type) { - rel->howto = &nlm32_sparc_howto_table[index]; - break; - } - -#ifdef DEBUG - fprintf (stderr, "%s: address = %08lx, addend = %08lx, type = %d, howto = %08lx\n", - __FUNCTION__, rel->address, rel->addend, type, rel->howto); -#endif - return true; - -} - -/* Write a NetWare sparc reloc. */ - -static boolean -nlm_sparc_write_reloc (abfd, sec, rel) - bfd *abfd; - asection *sec; - arelent *rel; -{ - bfd_vma val; - struct nlm32_sparc_reloc_ext tmp_reloc; - unsigned int index; - int type = -1; - reloc_howto_type *tmp; - - - for (index = 0; - index < sizeof (nlm32_sparc_howto_table) / sizeof(reloc_howto_type); - index++) { - tmp = &nlm32_sparc_howto_table[index]; - - if (tmp->rightshift == rel->howto->rightshift - && tmp->size == rel->howto->size - && tmp->bitsize == rel->howto->bitsize - && tmp->pc_relative == rel->howto->pc_relative - && tmp->bitpos == rel->howto->bitpos - && tmp->src_mask == rel->howto->src_mask - && tmp->dst_mask == rel->howto->dst_mask) { - type = tmp->type; - break; - } - } - if (type == -1) - abort(); - - /* - * Netware wants a list of relocs for each address. - * Format is: - * long offset - * long addend - * char type - * That should be it. - */ - - /* The value we write out is the offset into the appropriate - segment. This offset is the section vma, adjusted by the vma of - the lowest section in that segment, plus the address of the - relocation. */ -#if 0 - val = bfd_get_section_vma (abfd, (*rel->sym_ptr_ptr)->section) + rel->address; -#else - val = bfd_get_section_vma (abfd, sec) + rel->address; -#endif - -#ifdef DEBUG - fprintf (stderr, "%s: val = %08lx, addend = %08lx, type = %d\n", - __FUNCTION__, val, rel->addend, rel->howto->type); -#endif - bfd_put_32 (abfd, val, tmp_reloc.offset); - bfd_put_32 (abfd, rel->addend, tmp_reloc.addend); - bfd_put_8 (abfd, (short)(rel->howto->type), tmp_reloc.type); - - if (bfd_write (&tmp_reloc, 12, 1, abfd) != 12) - return false; - - return true; -} - -/* Mangle relocs for SPARC NetWare. We can just use the standard - SPARC relocs. */ - -static boolean -nlm_sparc_mangle_relocs (abfd, sec, data, offset, count) - bfd *abfd; - asection *sec; - PTR data; - bfd_vma offset; - bfd_size_type count; -{ - return true; -} - -/* Read a NetWare sparc import record */ -static boolean -nlm_sparc_read_import (abfd, sym) - bfd *abfd; - nlmNAME(symbol_type) *sym; -{ - struct nlm_relent *nlm_relocs; /* relocation records for symbol */ - bfd_size_type rcount; /* number of relocs */ - bfd_byte temp[NLM_TARGET_LONG_SIZE]; /* temporary 32-bit value */ - unsigned char symlength; /* length of symbol name */ - char *name; - - /* - * First, read in the number of relocation - * entries for this symbol - */ - if (bfd_read ((PTR) temp, 4, 1, abfd) != 4) - return false; - - rcount = bfd_get_32 (abfd, temp); - - /* - * Next, read in the length of the symbol - */ - - if (bfd_read ((PTR) &symlength, sizeof (symlength), 1, abfd) - != sizeof (symlength)) - return false; - sym -> symbol.the_bfd = abfd; - name = bfd_alloc (abfd, symlength + 1); - if (name == NULL) - return false; - - /* - * Then read in the symbol - */ - - if (bfd_read (name, symlength, 1, abfd) != symlength) - return false; - name[symlength] = '\0'; - sym -> symbol.name = name; - sym -> symbol.flags = 0; - sym -> symbol.value = 0; - sym -> symbol.section = bfd_und_section_ptr; - - /* - * Next, start reading in the relocs. - */ - - nlm_relocs = ((struct nlm_relent *) - bfd_alloc (abfd, rcount * sizeof (struct nlm_relent))); - if (!nlm_relocs) - return false; - sym -> relocs = nlm_relocs; - sym -> rcnt = 0; - while (sym -> rcnt < rcount) - { - asection *section; - - if (nlm_sparc_read_reloc (abfd, sym, §ion, - &nlm_relocs -> reloc) - == false) - return false; - nlm_relocs -> section = section; - nlm_relocs++; - sym -> rcnt++; - } - return true; -} - -static boolean -nlm_sparc_write_import (abfd, sec, rel) - bfd *abfd; - asection *sec; - arelent *rel; -{ - char temp[4]; - asection *code, *data, *bss, *symsec; - bfd_vma base; - - code = bfd_get_section_by_name (abfd, NLM_CODE_NAME); - data = bfd_get_section_by_name (abfd, NLM_INITIALIZED_DATA_NAME); - bss = bfd_get_section_by_name (abfd, NLM_UNINITIALIZED_DATA_NAME); - symsec = (*rel->sym_ptr_ptr)->section; - - if (symsec == code) { - base = 0; - } else if (symsec == data) { - base = bfd_section_size (abfd, code); - } else if (symsec == bss) { - base = bfd_section_size (abfd, code) + bfd_section_size (abfd, data); - } else - base = 0; - -#ifdef DEBUG - fprintf (stderr, "%s: <%x, 1>\n\t", - __FUNCTION__, base + (*rel->sym_ptr_ptr)->value); -#endif - bfd_put_32 (abfd, base + (*rel->sym_ptr_ptr)->value, temp); - if (bfd_write ((PTR)temp, 4, 1, abfd) != 4) - return false; - bfd_put_32 (abfd, 1, temp); - if (bfd_write ((PTR)temp, 4, 1, abfd) != 4) - return false; - if (nlm_sparc_write_reloc (abfd, sec, rel) == false) - return false; - return true; -} - -/* Write out an external reference. */ - -static boolean -nlm_sparc_write_external (abfd, count, sym, relocs) - bfd *abfd; - bfd_size_type count; - asymbol *sym; - struct reloc_and_sec *relocs; -{ - unsigned int i; - bfd_byte len; - unsigned char temp[NLM_TARGET_LONG_SIZE]; - - bfd_put_32 (abfd, count, temp); - if (bfd_write (temp, sizeof(temp), 1, abfd) != sizeof (temp)) - return false; - - len = strlen (sym->name); - if ((bfd_write (&len, sizeof (bfd_byte), 1, abfd) != sizeof(bfd_byte)) - || bfd_write (sym->name, len, 1, abfd) != len) - return false; - - for (i = 0; i < count; i++) - { - if (nlm_sparc_write_reloc (abfd, relocs[i].sec, - relocs[i].rel) == false) - return false; - } - - return true; -} - -static boolean -nlm_sparc_write_export (abfd, sym, value) - bfd *abfd; - asymbol *sym; - bfd_vma value; -{ - bfd_byte len; - bfd_byte temp[4]; - -#ifdef DEBUG - fprintf (stderr, "%s: <%x, %d, %s>\n", - __FUNCTION__, value, strlen (sym->name), sym->name); -#endif - bfd_put_32 (abfd, value, temp); - len = strlen (sym->name); - - if (bfd_write (temp, 4, 1, abfd) != 4 - || bfd_write (&len, 1, 1, abfd) != 1 - || bfd_write (sym->name, len, 1, abfd) != len) - return false; - - return true; -} - -#undef nlm_swap_fixed_header_in -#undef nlm_swap_fixed_header_out - -#include "nlmswap.h" - -static const struct nlm_backend_data nlm32_sparc_backend = -{ - "NetWare SPARC Module \032", - sizeof (Nlm32_sparc_External_Fixed_Header), - 0, /* optional_prefix_size */ - bfd_arch_sparc, - 0, - false, - 0, /* backend_object_p */ - 0, /* write_prefix_func */ - nlm_sparc_read_reloc, - nlm_sparc_mangle_relocs, - nlm_sparc_read_import, - nlm_sparc_write_import, - 0, /* set_public_section */ - 0, /* get_public_offset */ - nlm_swap_fixed_header_in, - nlm_swap_fixed_header_out, - nlm_sparc_write_external, - nlm_sparc_write_export -}; - -#define TARGET_BIG_NAME "nlm32-sparc" -#define TARGET_BIG_SYM nlmNAME(sparc_vec) -#define TARGET_BACKEND_DATA &nlm32_sparc_backend - -#include "nlm-target.h" diff --git a/contrib/gdb/bfd/nlm32.c b/contrib/gdb/bfd/nlm32.c deleted file mode 100644 index 4730e4fd34995..0000000000000 --- a/contrib/gdb/bfd/nlm32.c +++ /dev/null @@ -1,21 +0,0 @@ -/* NLM (NetWare Loadable Module) 32-bit executable support for BFD. - Copyright (C) 1993 Free Software Foundation, Inc. - -This file is part of BFD, the Binary File Descriptor library. - -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 2 of the License, 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ - -#define ARCH_SIZE 32 -#include "nlmcode.h" diff --git a/contrib/gdb/bfd/nlm64.c b/contrib/gdb/bfd/nlm64.c deleted file mode 100644 index 5dcd96a2b3c63..0000000000000 --- a/contrib/gdb/bfd/nlm64.c +++ /dev/null @@ -1,21 +0,0 @@ -/* NLM (NetWare Loadable Module) 64-bit executable support for BFD. - Copyright (C) 1993 Free Software Foundation, Inc. - -This file is part of BFD, the Binary File Descriptor library. - -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 2 of the License, 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ - -#define ARCH_SIZE 64 -#include "nlmcode.h" diff --git a/contrib/gdb/bfd/nlmcode.h b/contrib/gdb/bfd/nlmcode.h deleted file mode 100644 index 7f828b46b60fb..0000000000000 --- a/contrib/gdb/bfd/nlmcode.h +++ /dev/null @@ -1,2057 +0,0 @@ -/* NLM (NetWare Loadable Module) executable support for BFD. - Copyright (C) 1993 Free Software Foundation, Inc. - - Written by Fred Fish @ Cygnus Support, using ELF support as the - template. - -This file is part of BFD, the Binary File Descriptor library. - -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 2 of the License, 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ - -#include <string.h> /* For strrchr and friends */ -#include "bfd.h" -#include "sysdep.h" -#include "libbfd.h" -#include "libnlm.h" - -/* The functions in this file do not use the names they appear to use. - This file is actually compiled multiple times, once for each size - of NLM target we are using. At each size we use a different name, - constructed by the macro nlmNAME. For example, the function which - is named nlm_symbol_type below is actually named nlm32_symbol_type - in the final executable. */ - -#define Nlm_External_Fixed_Header NlmNAME(External_Fixed_Header) -#define Nlm_External_Version_Header NlmNAME(External_Version_Header) -#define Nlm_External_Copyright_Header NlmNAME(External_Copyright_Header) -#define Nlm_External_Extended_Header NlmNAME(External_Extended_Header) -#define Nlm_External_Custom_Header NlmNAME(External_Custom_Header) -#define Nlm_External_Cygnus_Ext_Header NlmNAME(External_Cygnus_Ext_Header) - -#define nlm_symbol_type nlmNAME(symbol_type) -#define nlm_get_symtab_upper_bound nlmNAME(get_symtab_upper_bound) -#define nlm_get_symtab nlmNAME(get_symtab) -#define nlm_make_empty_symbol nlmNAME(make_empty_symbol) -#define nlm_print_symbol nlmNAME(print_symbol) -#define nlm_get_symbol_info nlmNAME(get_symbol_info) -#define nlm_get_reloc_upper_bound nlmNAME(get_reloc_upper_bound) -#define nlm_canonicalize_reloc nlmNAME(canonicalize_reloc) -#define nlm_object_p nlmNAME(object_p) -#define nlm_set_section_contents nlmNAME(set_section_contents) -#define nlm_write_object_contents nlmNAME(write_object_contents) - -#define nlm_swap_fixed_header_in(abfd,src,dst) \ - (nlm_swap_fixed_header_in_func(abfd))(abfd,src,dst) -#define nlm_swap_fixed_header_out(abfd,src,dst) \ - (nlm_swap_fixed_header_out_func(abfd))(abfd,src,dst) - -/* Forward declarations of static functions */ - -static boolean add_bfd_section - PARAMS ((bfd *, char *, file_ptr, bfd_size_type, flagword)); -static boolean nlm_swap_variable_header_in - PARAMS ((bfd *)); -static boolean nlm_swap_variable_header_out - PARAMS ((bfd *)); -static boolean find_nonzero - PARAMS ((PTR, size_t)); -static boolean nlm_swap_auxiliary_headers_in - PARAMS ((bfd *)); -static boolean nlm_swap_auxiliary_headers_out - PARAMS ((bfd *)); -static boolean nlm_slurp_symbol_table - PARAMS ((bfd *)); -static boolean nlm_slurp_reloc_fixups - PARAMS ((bfd *)); -static boolean nlm_compute_section_file_positions - PARAMS ((bfd *)); -static int nlm_external_reloc_compare - PARAMS ((const void *, const void *)); - -/* Should perhaps use put_offset, put_word, etc. For now, the two versions - can be handled by explicitly specifying 32 bits or "the long type". */ -#if ARCH_SIZE == 64 -#define put_word bfd_h_put_64 -#define get_word bfd_h_get_64 -#endif -#if ARCH_SIZE == 32 -#define put_word bfd_h_put_32 -#define get_word bfd_h_get_32 -#endif - -const bfd_target * -nlm_object_p (abfd) - bfd *abfd; -{ - struct nlm_obj_tdata *preserved_tdata = nlm_tdata (abfd); - boolean (*backend_object_p) PARAMS ((bfd *)); - PTR x_fxdhdr = NULL; - Nlm_Internal_Fixed_Header *i_fxdhdrp; - struct nlm_obj_tdata *new_tdata = NULL; - const char *signature; - enum bfd_architecture arch; - - /* Some NLM formats have a prefix before the standard NLM fixed - header. */ - backend_object_p = nlm_backend_object_p_func (abfd); - if (backend_object_p) - { - if (!(*backend_object_p) (abfd)) - goto got_wrong_format_error; - } - - /* Read in the fixed length portion of the NLM header in external format. */ - - x_fxdhdr = (PTR) bfd_malloc ((size_t) nlm_fixed_header_size (abfd)); - if (x_fxdhdr == NULL) - goto got_no_match; - - if (bfd_read ((PTR) x_fxdhdr, nlm_fixed_header_size (abfd), 1, abfd) != - nlm_fixed_header_size (abfd)) - { - if (bfd_get_error () != bfd_error_system_call) - goto got_wrong_format_error; - else - goto got_no_match; - } - - /* Allocate an instance of the nlm_obj_tdata structure and hook it up to - the tdata pointer in the bfd. */ - - new_tdata = ((struct nlm_obj_tdata *) - bfd_zalloc (abfd, sizeof (struct nlm_obj_tdata))); - if (new_tdata == NULL) - goto got_no_match; - - nlm_tdata (abfd) = new_tdata; - - i_fxdhdrp = nlm_fixed_header (abfd); - nlm_swap_fixed_header_in (abfd, x_fxdhdr, i_fxdhdrp); - free (x_fxdhdr); - x_fxdhdr = NULL; - - /* Check to see if we have an NLM file for this backend by matching - the NLM signature. */ - - signature = nlm_signature (abfd); - if (signature != NULL - && *signature != '\0' - && strncmp ((char *) i_fxdhdrp->signature, signature, - NLM_SIGNATURE_SIZE) != 0) - goto got_wrong_format_error; - - /* There's no supported way to discover the endianess of an NLM, so test for - a sane version number after doing byte swapping appropriate for this - XVEC. (Hack alert!) */ - - if (i_fxdhdrp->version > 0xFFFF) - goto got_wrong_format_error; - - /* There's no supported way to check for 32 bit versus 64 bit addresses, - so ignore this distinction for now. (FIXME) */ - - /* Swap in the rest of the required header. */ - if (!nlm_swap_variable_header_in (abfd)) - { - if (bfd_get_error () != bfd_error_system_call) - goto got_wrong_format_error; - else - goto got_no_match; - } - - /* Add the sections supplied by all NLM's, and then read in the - auxiliary headers. Reading the auxiliary headers may create - additional sections described in the cygnus_ext header. - From this point on we assume that we have an NLM, and do not - treat errors as indicating the wrong format. */ - - if (!add_bfd_section (abfd, NLM_CODE_NAME, - i_fxdhdrp->codeImageOffset, - i_fxdhdrp->codeImageSize, - (SEC_CODE | SEC_ALLOC | SEC_LOAD | SEC_HAS_CONTENTS - | SEC_RELOC)) - || !add_bfd_section (abfd, NLM_INITIALIZED_DATA_NAME, - i_fxdhdrp->dataImageOffset, - i_fxdhdrp->dataImageSize, - (SEC_DATA | SEC_ALLOC | SEC_LOAD | SEC_HAS_CONTENTS - | SEC_RELOC)) - || !add_bfd_section (abfd, NLM_UNINITIALIZED_DATA_NAME, - (file_ptr) 0, - i_fxdhdrp->uninitializedDataSize, - SEC_ALLOC)) - goto got_no_match; - - if (!nlm_swap_auxiliary_headers_in (abfd)) - goto got_no_match; - - if (nlm_fixed_header (abfd)->numberOfRelocationFixups != 0 - || nlm_fixed_header (abfd)->numberOfExternalReferences != 0) - abfd->flags |= HAS_RELOC; - if (nlm_fixed_header (abfd)->numberOfPublics != 0 - || nlm_fixed_header (abfd)->numberOfDebugRecords != 0 - || nlm_fixed_header (abfd)->numberOfExternalReferences != 0) - abfd->flags |= HAS_SYMS; - - arch = nlm_architecture (abfd); - if (arch != bfd_arch_unknown) - bfd_default_set_arch_mach (abfd, arch, (unsigned long) 0); - - abfd->flags |= EXEC_P; - bfd_get_start_address (abfd) = nlm_fixed_header (abfd)->codeStartOffset; - - return (abfd->xvec); - -got_wrong_format_error: - bfd_set_error (bfd_error_wrong_format); -got_no_match: - nlm_tdata (abfd) = preserved_tdata; - if (new_tdata != NULL) - bfd_release (abfd, new_tdata); - if (x_fxdhdr != NULL) - free (x_fxdhdr); - return (NULL); -} - -/* Add a section to the bfd. */ - -static boolean -add_bfd_section (abfd, name, offset, size, flags) - bfd *abfd; - char *name; - file_ptr offset; - bfd_size_type size; - flagword flags; -{ - asection *newsect; - - newsect = bfd_make_section (abfd, name); - if (newsect == NULL) - { - return (false); - } - newsect->vma = 0; /* NLM's are relocatable. */ - newsect->_raw_size = size; - newsect->filepos = offset; - newsect->flags = flags; - newsect->alignment_power = bfd_log2 (0); /* FIXME */ - return (true); -} - -/* Read and swap in the variable length header. All the fields must - exist in the NLM, and must exist in the order they are read here. */ - -static boolean -nlm_swap_variable_header_in (abfd) - bfd *abfd; -{ - unsigned char temp[NLM_TARGET_LONG_SIZE]; - - /* Read the description length and text members. */ - - if (bfd_read ((PTR) & nlm_variable_header (abfd)->descriptionLength, - sizeof (nlm_variable_header (abfd)->descriptionLength), - 1, abfd) != - sizeof (nlm_variable_header (abfd)->descriptionLength)) - return (false); - if (bfd_read ((PTR) nlm_variable_header (abfd)->descriptionText, - nlm_variable_header (abfd)->descriptionLength + 1, - 1, abfd) != - (bfd_size_type) nlm_variable_header (abfd)->descriptionLength + 1) - return (false); - - /* Read and convert the stackSize field. */ - - if (bfd_read ((PTR) temp, sizeof (temp), 1, abfd) != sizeof (temp)) - return (false); - nlm_variable_header (abfd)->stackSize = get_word (abfd, (bfd_byte *) temp); - - /* Read and convert the reserved field. */ - - if (bfd_read ((PTR) temp, sizeof (temp), 1, abfd) != sizeof (temp)) - return (false); - nlm_variable_header (abfd)->reserved = get_word (abfd, (bfd_byte *) temp); - - /* Read the oldThreadName field. This field is a fixed length string. */ - - if (bfd_read ((PTR) nlm_variable_header (abfd)->oldThreadName, - sizeof (nlm_variable_header (abfd)->oldThreadName), - 1, abfd) != - sizeof (nlm_variable_header (abfd)->oldThreadName)) - return (false); - - /* Read the screen name length and text members. */ - - if (bfd_read ((PTR) & nlm_variable_header (abfd)->screenNameLength, - sizeof (nlm_variable_header (abfd)->screenNameLength), - 1, abfd) != - sizeof (nlm_variable_header (abfd)->screenNameLength)) - return (false); - if (bfd_read ((PTR) nlm_variable_header (abfd)->screenName, - nlm_variable_header (abfd)->screenNameLength + 1, - 1, abfd) != - (bfd_size_type) nlm_variable_header (abfd)->screenNameLength + 1) - return (false); - - /* Read the thread name length and text members. */ - - if (bfd_read ((PTR) & nlm_variable_header (abfd)->threadNameLength, - sizeof (nlm_variable_header (abfd)->threadNameLength), - 1, abfd) != - sizeof (nlm_variable_header (abfd)->threadNameLength)) - return (false); - if (bfd_read ((PTR) nlm_variable_header (abfd)->threadName, - nlm_variable_header (abfd)->threadNameLength + 1, - 1, abfd) != - (bfd_size_type) nlm_variable_header (abfd)->threadNameLength + 1) - return (false); - return (true); -} - -/* Swap and write out the variable length header. All the fields must - exist in the NLM, and must exist in this order. */ - -static boolean -nlm_swap_variable_header_out (abfd) - bfd *abfd; -{ - unsigned char temp[NLM_TARGET_LONG_SIZE]; - - /* Write the description length and text members. */ - - if (bfd_write ((PTR) & nlm_variable_header (abfd)->descriptionLength, - sizeof (nlm_variable_header (abfd)->descriptionLength), - 1, abfd) != - sizeof (nlm_variable_header (abfd)->descriptionLength)) - return (false); - if (bfd_write ((PTR) nlm_variable_header (abfd)->descriptionText, - nlm_variable_header (abfd)->descriptionLength + 1, - 1, abfd) != - (bfd_size_type) nlm_variable_header (abfd)->descriptionLength + 1) - return (false); - - /* Convert and write the stackSize field. */ - - put_word (abfd, (bfd_vma) nlm_variable_header (abfd)->stackSize, - (bfd_byte *) temp); - if (bfd_write ((PTR) temp, sizeof (temp), 1, abfd) != sizeof (temp)) - return (false); - - /* Convert and write the reserved field. */ - - put_word (abfd, (bfd_vma) nlm_variable_header (abfd)->reserved, - (bfd_byte *) temp); - if (bfd_write ((PTR) temp, sizeof (temp), 1, abfd) != sizeof (temp)) - return (false); - - /* Write the oldThreadName field. This field is a fixed length string. */ - - if (bfd_write ((PTR) nlm_variable_header (abfd)->oldThreadName, - sizeof (nlm_variable_header (abfd)->oldThreadName), - 1, abfd) != - sizeof (nlm_variable_header (abfd)->oldThreadName)) - return (false); - - /* Write the screen name length and text members. */ - - if (bfd_write ((PTR) & nlm_variable_header (abfd)->screenNameLength, - sizeof (nlm_variable_header (abfd)->screenNameLength), - 1, abfd) != - sizeof (nlm_variable_header (abfd)->screenNameLength)) - return (false); - if (bfd_write ((PTR) nlm_variable_header (abfd)->screenName, - nlm_variable_header (abfd)->screenNameLength + 1, - 1, abfd) != - (bfd_size_type) nlm_variable_header (abfd)->screenNameLength + 1) - return (false); - - /* Write the thread name length and text members. */ - - if (bfd_write ((PTR) & nlm_variable_header (abfd)->threadNameLength, - sizeof (nlm_variable_header (abfd)->threadNameLength), - 1, abfd) != - sizeof (nlm_variable_header (abfd)->threadNameLength)) - return (false); - if (bfd_write ((PTR) nlm_variable_header (abfd)->threadName, - nlm_variable_header (abfd)->threadNameLength + 1, - 1, abfd) != - (bfd_size_type) nlm_variable_header (abfd)->threadNameLength + 1) - return (false); - return (true); -} - -/* Read and swap in the contents of all the auxiliary headers. Because of - the braindead design, we have to do strcmps on strings of indeterminate - length to figure out what each auxiliary header is. Even worse, we have - no way of knowing how many auxiliary headers there are or where the end - of the auxiliary headers are, except by finding something that doesn't - look like a known auxiliary header. This means that the first new type - of auxiliary header added will break all existing tools that don't - recognize it. */ - -static boolean -nlm_swap_auxiliary_headers_in (abfd) - bfd *abfd; -{ - char tempstr[16]; - long position; - - for (;;) - { - position = bfd_tell (abfd); - if (bfd_read ((PTR) tempstr, sizeof (tempstr), 1, abfd) != - sizeof (tempstr)) - return (false); - if (bfd_seek (abfd, position, SEEK_SET) == -1) - return (false); - if (strncmp (tempstr, "VeRsIoN#", 8) == 0) - { - Nlm_External_Version_Header thdr; - if (bfd_read ((PTR) & thdr, sizeof (thdr), 1, abfd) != sizeof (thdr)) - return (false); - memcpy (nlm_version_header (abfd)->stamp, thdr.stamp, - sizeof (thdr.stamp)); - nlm_version_header (abfd)->majorVersion = - get_word (abfd, (bfd_byte *) thdr.majorVersion); - nlm_version_header (abfd)->minorVersion = - get_word (abfd, (bfd_byte *) thdr.minorVersion); - nlm_version_header (abfd)->revision = - get_word (abfd, (bfd_byte *) thdr.revision); - nlm_version_header (abfd)->year = - get_word (abfd, (bfd_byte *) thdr.year); - nlm_version_header (abfd)->month = - get_word (abfd, (bfd_byte *) thdr.month); - nlm_version_header (abfd)->day = - get_word (abfd, (bfd_byte *) thdr.day); - } - else if (strncmp (tempstr, "MeSsAgEs", 8) == 0) - { - Nlm_External_Extended_Header thdr; - if (bfd_read ((PTR) & thdr, sizeof (thdr), 1, abfd) != sizeof (thdr)) - return (false); - memcpy (nlm_extended_header (abfd)->stamp, thdr.stamp, - sizeof (thdr.stamp)); - nlm_extended_header (abfd)->languageID = - get_word (abfd, (bfd_byte *) thdr.languageID); - nlm_extended_header (abfd)->messageFileOffset = - get_word (abfd, (bfd_byte *) thdr.messageFileOffset); - nlm_extended_header (abfd)->messageFileLength = - get_word (abfd, (bfd_byte *) thdr.messageFileLength); - nlm_extended_header (abfd)->messageCount = - get_word (abfd, (bfd_byte *) thdr.messageCount); - nlm_extended_header (abfd)->helpFileOffset = - get_word (abfd, (bfd_byte *) thdr.helpFileOffset); - nlm_extended_header (abfd)->helpFileLength = - get_word (abfd, (bfd_byte *) thdr.helpFileLength); - nlm_extended_header (abfd)->RPCDataOffset = - get_word (abfd, (bfd_byte *) thdr.RPCDataOffset); - nlm_extended_header (abfd)->RPCDataLength = - get_word (abfd, (bfd_byte *) thdr.RPCDataLength); - nlm_extended_header (abfd)->sharedCodeOffset = - get_word (abfd, (bfd_byte *) thdr.sharedCodeOffset); - nlm_extended_header (abfd)->sharedCodeLength = - get_word (abfd, (bfd_byte *) thdr.sharedCodeLength); - nlm_extended_header (abfd)->sharedDataOffset = - get_word (abfd, (bfd_byte *) thdr.sharedDataOffset); - nlm_extended_header (abfd)->sharedDataLength = - get_word (abfd, (bfd_byte *) thdr.sharedDataLength); - nlm_extended_header (abfd)->sharedRelocationFixupOffset = - get_word (abfd, (bfd_byte *) thdr.sharedRelocationFixupOffset); - nlm_extended_header (abfd)->sharedRelocationFixupCount = - get_word (abfd, (bfd_byte *) thdr.sharedRelocationFixupCount); - nlm_extended_header (abfd)->sharedExternalReferenceOffset = - get_word (abfd, (bfd_byte *) thdr.sharedExternalReferenceOffset); - nlm_extended_header (abfd)->sharedExternalReferenceCount = - get_word (abfd, (bfd_byte *) thdr.sharedExternalReferenceCount); - nlm_extended_header (abfd)->sharedPublicsOffset = - get_word (abfd, (bfd_byte *) thdr.sharedPublicsOffset); - nlm_extended_header (abfd)->sharedPublicsCount = - get_word (abfd, (bfd_byte *) thdr.sharedPublicsCount); - nlm_extended_header (abfd)->sharedDebugRecordOffset = - get_word (abfd, (bfd_byte *) thdr.sharedDebugRecordOffset); - nlm_extended_header (abfd)->sharedDebugRecordCount = - get_word (abfd, (bfd_byte *) thdr.sharedDebugRecordCount); - nlm_extended_header (abfd)->SharedInitializationOffset = - get_word (abfd, (bfd_byte *) thdr.sharedInitializationOffset); - nlm_extended_header (abfd)->SharedExitProcedureOffset = - get_word (abfd, (bfd_byte *) thdr.SharedExitProcedureOffset); - nlm_extended_header (abfd)->productID = - get_word (abfd, (bfd_byte *) thdr.productID); - nlm_extended_header (abfd)->reserved0 = - get_word (abfd, (bfd_byte *) thdr.reserved0); - nlm_extended_header (abfd)->reserved1 = - get_word (abfd, (bfd_byte *) thdr.reserved1); - nlm_extended_header (abfd)->reserved2 = - get_word (abfd, (bfd_byte *) thdr.reserved2); - nlm_extended_header (abfd)->reserved3 = - get_word (abfd, (bfd_byte *) thdr.reserved3); - nlm_extended_header (abfd)->reserved4 = - get_word (abfd, (bfd_byte *) thdr.reserved4); - nlm_extended_header (abfd)->reserved5 = - get_word (abfd, (bfd_byte *) thdr.reserved5); - } - else if (strncmp (tempstr, "CoPyRiGhT=", 10) == 0) - { - if (bfd_read ((PTR) nlm_copyright_header (abfd)->stamp, - sizeof (nlm_copyright_header (abfd)->stamp), - 1, abfd) - != sizeof (nlm_copyright_header (abfd)->stamp)) - return (false); - if (bfd_read ((PTR) & (nlm_copyright_header (abfd) - ->copyrightMessageLength), - 1, 1, abfd) != 1) - return (false); - /* The copyright message is a variable length string. */ - if (bfd_read ((PTR) nlm_copyright_header (abfd)->copyrightMessage, - nlm_copyright_header (abfd)->copyrightMessageLength + 1, - 1, abfd) != - ((bfd_size_type) - nlm_copyright_header (abfd)->copyrightMessageLength + 1)) - return (false); - } - else if (strncmp (tempstr, "CuStHeAd", 8) == 0) - { - Nlm_External_Custom_Header thdr; - bfd_size_type hdrLength; - file_ptr dataOffset; - bfd_size_type dataLength; - char dataStamp[8]; - PTR hdr; - - /* Read the stamp ("CuStHeAd"). */ - if (bfd_read ((PTR) thdr.stamp, 1, sizeof (thdr.stamp), abfd) - != sizeof (thdr.stamp)) - return false; - /* Read the length of this custom header. */ - if (bfd_read ((PTR) thdr.length, 1, sizeof (thdr.length), abfd) - != sizeof (thdr.length)) - return false; - hdrLength = get_word (abfd, (bfd_byte *) thdr.length); - /* Read further fields if we have them. */ - if (hdrLength < NLM_TARGET_LONG_SIZE) - dataOffset = 0; - else - { - if (bfd_read ((PTR) thdr.dataOffset, 1, - sizeof (thdr.dataOffset), abfd) - != sizeof (thdr.dataOffset)) - return false; - dataOffset = get_word (abfd, (bfd_byte *) thdr.dataOffset); - } - if (hdrLength < 2 * NLM_TARGET_LONG_SIZE) - dataLength = 0; - else - { - if (bfd_read ((PTR) thdr.dataLength, 1, - sizeof (thdr.dataLength), abfd) - != sizeof (thdr.dataLength)) - return false; - dataLength = get_word (abfd, (bfd_byte *) thdr.dataLength); - } - if (hdrLength < 2 * NLM_TARGET_LONG_SIZE + 8) - memset (dataStamp, 0, sizeof (dataStamp)); - else - { - if (bfd_read ((PTR) dataStamp, 1, sizeof (dataStamp), abfd) - != sizeof (dataStamp)) - return false; - } - - /* Read the rest of the header, if any. */ - if (hdrLength <= 2 * NLM_TARGET_LONG_SIZE + 8) - { - hdr = NULL; - hdrLength = 0; - } - else - { - hdrLength -= 2 * NLM_TARGET_LONG_SIZE + 8; - hdr = bfd_alloc (abfd, hdrLength); - if (hdr == NULL) - return false; - if (bfd_read (hdr, 1, hdrLength, abfd) != hdrLength) - return false; - } - - /* If we have found a Cygnus header, process it. Otherwise, - just save the associated data without trying to interpret - it. */ - if (strncmp (dataStamp, "CyGnUsEx", 8) == 0) - { - file_ptr pos; - bfd_byte *contents; - bfd_byte *p, *pend; - - BFD_ASSERT (hdrLength == 0 && hdr == NULL); - - pos = bfd_tell (abfd); - if (bfd_seek (abfd, dataOffset, SEEK_SET) != 0) - return false; - contents = (bfd_byte *) bfd_alloc (abfd, dataLength); - if (contents == NULL) - return false; - if (bfd_read (contents, 1, dataLength, abfd) != dataLength) - return false; - if (bfd_seek (abfd, pos, SEEK_SET) != 0) - return false; - - memcpy (nlm_cygnus_ext_header (abfd), "CyGnUsEx", 8); - nlm_cygnus_ext_header (abfd)->offset = dataOffset; - nlm_cygnus_ext_header (abfd)->length = dataLength; - - /* This data this header points to provides a list of - the sections which were in the original object file - which was converted to become an NLM. We locate - those sections and add them to the BFD. Note that - this is likely to create a second .text, .data and - .bss section; retrieving the sections by name will - get the actual NLM sections, which is what we want to - happen. The sections from the original file, which - may be subsets of the NLM section, can only be found - using bfd_map_over_sections. */ - p = contents; - pend = p + dataLength; - while (p < pend) - { - char *name; - size_t l; - file_ptr filepos; - bfd_size_type size; - asection *newsec; - - /* The format of this information is - null terminated section name - zeroes to adjust to 4 byte boundary - 4 byte section data file pointer - 4 byte section size - */ - - name = (char *) p; - l = strlen (name) + 1; - l = (l + 3) &~ 3; - p += l; - filepos = bfd_h_get_32 (abfd, p); - p += 4; - size = bfd_h_get_32 (abfd, p); - p += 4; - - newsec = bfd_make_section_anyway (abfd, name); - if (newsec == (asection *) NULL) - return false; - newsec->_raw_size = size; - if (filepos != 0) - { - newsec->filepos = filepos; - newsec->flags |= SEC_HAS_CONTENTS; - } - } - } - else - { - memcpy (nlm_custom_header (abfd)->stamp, thdr.stamp, - sizeof (thdr.stamp)); - nlm_custom_header (abfd)->hdrLength = hdrLength; - nlm_custom_header (abfd)->dataOffset = dataOffset; - nlm_custom_header (abfd)->dataLength = dataLength; - memcpy (nlm_custom_header (abfd)->dataStamp, dataStamp, - sizeof (dataStamp)); - nlm_custom_header (abfd)->hdr = hdr; - } - } - else - { - break; - } - } - return (true); -} - -/* Return whether there is a non-zero byte in a memory block. */ - -static boolean -find_nonzero (buf, size) - PTR buf; - size_t size; -{ - char *p = (char *) buf; - - while (size-- != 0) - if (*p++ != 0) - return true; - return false; -} - -/* Swap out the contents of the auxiliary headers. We create those - auxiliary headers which have been set non-zero. We do not require - the caller to set up the stamp fields. */ - -static boolean -nlm_swap_auxiliary_headers_out (abfd) - bfd *abfd; -{ - /* Write out the version header if there is one. */ - if (find_nonzero ((PTR) nlm_version_header (abfd), - sizeof (Nlm_Internal_Version_Header))) - { - Nlm_External_Version_Header thdr; - - memcpy (thdr.stamp, "VeRsIoN#", 8); - put_word (abfd, (bfd_vma) nlm_version_header (abfd)->majorVersion, - (bfd_byte *) thdr.majorVersion); - put_word (abfd, (bfd_vma) nlm_version_header (abfd)->minorVersion, - (bfd_byte *) thdr.minorVersion); - put_word (abfd, (bfd_vma) nlm_version_header (abfd)->revision, - (bfd_byte *) thdr.revision); - put_word (abfd, (bfd_vma) nlm_version_header (abfd)->year, - (bfd_byte *) thdr.year); - put_word (abfd, (bfd_vma) nlm_version_header (abfd)->month, - (bfd_byte *) thdr.month); - put_word (abfd, (bfd_vma) nlm_version_header (abfd)->day, - (bfd_byte *) thdr.day); - if (bfd_write ((PTR) & thdr, sizeof (thdr), 1, abfd) != sizeof (thdr)) - return false; - } - - /* Write out the extended header if there is one. */ - if (find_nonzero ((PTR) nlm_extended_header (abfd), - sizeof (Nlm_Internal_Extended_Header))) - { - Nlm_External_Extended_Header thdr; - - memcpy (thdr.stamp, "MeSsAgEs", 8); - put_word (abfd, - (bfd_vma) nlm_extended_header (abfd)->languageID, - (bfd_byte *) thdr.languageID); - put_word (abfd, - (bfd_vma) nlm_extended_header (abfd)->messageFileOffset, - (bfd_byte *) thdr.messageFileOffset); - put_word (abfd, - (bfd_vma) nlm_extended_header (abfd)->messageFileLength, - (bfd_byte *) thdr.messageFileLength); - put_word (abfd, - (bfd_vma) nlm_extended_header (abfd)->messageCount, - (bfd_byte *) thdr.messageCount); - put_word (abfd, - (bfd_vma) nlm_extended_header (abfd)->helpFileOffset, - (bfd_byte *) thdr.helpFileOffset); - put_word (abfd, - (bfd_vma) nlm_extended_header (abfd)->helpFileLength, - (bfd_byte *) thdr.helpFileLength); - put_word (abfd, - (bfd_vma) nlm_extended_header (abfd)->RPCDataOffset, - (bfd_byte *) thdr.RPCDataOffset); - put_word (abfd, - (bfd_vma) nlm_extended_header (abfd)->RPCDataLength, - (bfd_byte *) thdr.RPCDataLength); - put_word (abfd, - (bfd_vma) nlm_extended_header (abfd)->sharedCodeOffset, - (bfd_byte *) thdr.sharedCodeOffset); - put_word (abfd, - (bfd_vma) nlm_extended_header (abfd)->sharedCodeLength, - (bfd_byte *) thdr.sharedCodeLength); - put_word (abfd, - (bfd_vma) nlm_extended_header (abfd)->sharedDataOffset, - (bfd_byte *) thdr.sharedDataOffset); - put_word (abfd, - (bfd_vma) nlm_extended_header (abfd)->sharedDataLength, - (bfd_byte *) thdr.sharedDataLength); - put_word (abfd, - (bfd_vma) nlm_extended_header (abfd)->sharedRelocationFixupOffset, - (bfd_byte *) thdr.sharedRelocationFixupOffset); - put_word (abfd, - (bfd_vma) nlm_extended_header (abfd)->sharedRelocationFixupCount, - (bfd_byte *) thdr.sharedRelocationFixupCount); - put_word (abfd, - (bfd_vma) nlm_extended_header (abfd)->sharedExternalReferenceOffset, - (bfd_byte *) thdr.sharedExternalReferenceOffset); - put_word (abfd, - (bfd_vma) nlm_extended_header (abfd)->sharedExternalReferenceCount, - (bfd_byte *) thdr.sharedExternalReferenceCount); - put_word (abfd, - (bfd_vma) nlm_extended_header (abfd)->sharedPublicsOffset, - (bfd_byte *) thdr.sharedPublicsOffset); - put_word (abfd, - (bfd_vma) nlm_extended_header (abfd)->sharedPublicsCount, - (bfd_byte *) thdr.sharedPublicsCount); - put_word (abfd, - (bfd_vma) nlm_extended_header (abfd)->sharedDebugRecordOffset, - (bfd_byte *) thdr.sharedDebugRecordOffset); - put_word (abfd, - (bfd_vma) nlm_extended_header (abfd)->sharedDebugRecordCount, - (bfd_byte *) thdr.sharedDebugRecordCount); - put_word (abfd, - (bfd_vma) nlm_extended_header (abfd)->SharedInitializationOffset, - (bfd_byte *) thdr.sharedInitializationOffset); - put_word (abfd, - (bfd_vma) nlm_extended_header (abfd)->SharedExitProcedureOffset, - (bfd_byte *) thdr.SharedExitProcedureOffset); - put_word (abfd, - (bfd_vma) nlm_extended_header (abfd)->productID, - (bfd_byte *) thdr.productID); - put_word (abfd, - (bfd_vma) nlm_extended_header (abfd)->reserved0, - (bfd_byte *) thdr.reserved0); - put_word (abfd, - (bfd_vma) nlm_extended_header (abfd)->reserved1, - (bfd_byte *) thdr.reserved1); - put_word (abfd, - (bfd_vma) nlm_extended_header (abfd)->reserved2, - (bfd_byte *) thdr.reserved2); - put_word (abfd, - (bfd_vma) nlm_extended_header (abfd)->reserved3, - (bfd_byte *) thdr.reserved3); - put_word (abfd, - (bfd_vma) nlm_extended_header (abfd)->reserved4, - (bfd_byte *) thdr.reserved4); - put_word (abfd, - (bfd_vma) nlm_extended_header (abfd)->reserved5, - (bfd_byte *) thdr.reserved5); - if (bfd_write ((PTR) & thdr, sizeof (thdr), 1, abfd) != sizeof (thdr)) - return false; - } - - - /* Write out the copyright header if there is one. */ - if (find_nonzero ((PTR) nlm_copyright_header (abfd), - sizeof (Nlm_Internal_Copyright_Header))) - { - Nlm_External_Copyright_Header thdr; - - memcpy (thdr.stamp, "CoPyRiGhT=", 10); - if (bfd_write ((PTR) thdr.stamp, sizeof (thdr.stamp), 1, abfd) - != sizeof (thdr.stamp)) - return false; - thdr.copyrightMessageLength[0] = - nlm_copyright_header (abfd)->copyrightMessageLength; - if (bfd_write ((PTR) thdr.copyrightMessageLength, 1, 1, abfd) != 1) - return false; - /* The copyright message is a variable length string. */ - if (bfd_write ((PTR) nlm_copyright_header (abfd)->copyrightMessage, - nlm_copyright_header (abfd)->copyrightMessageLength + 1, - 1, abfd) != - ((bfd_size_type) - nlm_copyright_header (abfd)->copyrightMessageLength + 1)) - return false; - } - - /* Write out the custom header if there is one. */ - if (find_nonzero ((PTR) nlm_custom_header (abfd), - sizeof (Nlm_Internal_Custom_Header))) - { - Nlm_External_Custom_Header thdr; - boolean ds; - bfd_size_type hdrLength; - - ds = find_nonzero ((PTR) nlm_custom_header (abfd)->dataStamp, - sizeof (nlm_custom_header (abfd)->dataStamp)); - memcpy (thdr.stamp, "CuStHeAd", 8); - hdrLength = (2 * NLM_TARGET_LONG_SIZE + (ds ? 8 : 0) - + nlm_custom_header (abfd)->hdrLength); - put_word (abfd, hdrLength, thdr.length); - put_word (abfd, (bfd_vma) nlm_custom_header (abfd)->dataOffset, - thdr.dataOffset); - put_word (abfd, (bfd_vma) nlm_custom_header (abfd)->dataLength, - thdr.dataLength); - if (! ds) - { - BFD_ASSERT (nlm_custom_header (abfd)->hdrLength == 0); - if (bfd_write ((PTR) &thdr, 1, - sizeof (thdr) - sizeof (thdr.dataStamp), abfd) - != sizeof (thdr) - sizeof (thdr.dataStamp)) - return false; - } - else - { - memcpy (thdr.dataStamp, nlm_custom_header (abfd)->dataStamp, - sizeof (thdr.dataStamp)); - if (bfd_write ((PTR) &thdr, sizeof (thdr), 1, abfd) != sizeof (thdr)) - return false; - if (bfd_write (nlm_custom_header (abfd)->hdr, 1, - nlm_custom_header (abfd)->hdrLength, abfd) - != nlm_custom_header (abfd)->hdrLength) - return false; - } - } - - /* Write out the Cygnus debugging header if there is one. */ - if (find_nonzero ((PTR) nlm_cygnus_ext_header (abfd), - sizeof (Nlm_Internal_Cygnus_Ext_Header))) - { - Nlm_External_Custom_Header thdr; - - memcpy (thdr.stamp, "CuStHeAd", 8); - put_word (abfd, (bfd_vma) 2 * NLM_TARGET_LONG_SIZE + 8, - (bfd_byte *) thdr.length); - put_word (abfd, (bfd_vma) nlm_cygnus_ext_header (abfd)->offset, - (bfd_byte *) thdr.dataOffset); - put_word (abfd, (bfd_vma) nlm_cygnus_ext_header (abfd)->length, - (bfd_byte *) thdr.dataLength); - memcpy (thdr.dataStamp, "CyGnUsEx", 8); - if (bfd_write ((PTR) &thdr, sizeof (thdr), 1, abfd) != sizeof (thdr)) - return false; - } - - return true; -} - -/* We read the NLM's public symbols and use it to generate a bfd symbol - table (hey, it's better than nothing) on a one-for-one basis. Thus - use the number of public symbols as the number of bfd symbols we will - have once we actually get around to reading them in. - - Return the number of bytes required to hold the symtab vector, based on - the count plus 1, since we will NULL terminate the vector allocated based - on this size. */ - -long -nlm_get_symtab_upper_bound (abfd) - bfd *abfd; -{ - Nlm_Internal_Fixed_Header *i_fxdhdrp; /* Nlm file header, internal form */ - long symcount; - long symtab_size = 0; - - i_fxdhdrp = nlm_fixed_header (abfd); - symcount = (i_fxdhdrp->numberOfPublics - + i_fxdhdrp->numberOfDebugRecords - + i_fxdhdrp->numberOfExternalReferences); - symtab_size = (symcount + 1) * (sizeof (asymbol)); - return (symtab_size); -} - -/* Note that bfd_get_symcount is guaranteed to be zero if slurping the - symbol table fails. */ - -long -nlm_get_symtab (abfd, alocation) - bfd *abfd; - asymbol **alocation; -{ - nlm_symbol_type *symbase; - bfd_size_type counter = 0; - - if (nlm_slurp_symbol_table (abfd) == false) - return -1; - symbase = nlm_get_symbols (abfd); - while (counter < bfd_get_symcount (abfd)) - { - *alocation++ = &symbase->symbol; - symbase++; - counter++; - } - *alocation = (asymbol *) NULL; - return bfd_get_symcount (abfd); -} - -/* Make an NLM symbol. There is nothing special to do here. */ - -asymbol * -nlm_make_empty_symbol (abfd) - bfd *abfd; -{ - nlm_symbol_type *new; - - new = (nlm_symbol_type *) bfd_zalloc (abfd, sizeof (nlm_symbol_type)); - if (new) - new->symbol.the_bfd = abfd; - return &new->symbol; -} - -/* Get symbol information. */ - -void -nlm_get_symbol_info (ignore_abfd, symbol, ret) - bfd *ignore_abfd; - asymbol *symbol; - symbol_info *ret; -{ - bfd_symbol_info (symbol, ret); -} - -/* Print symbol information. */ - -void -nlm_print_symbol (abfd, afile, symbol, how) - bfd *abfd; - PTR afile; - asymbol *symbol; - bfd_print_symbol_type how; -{ - FILE *file = (FILE *) afile; - - switch (how) - { - case bfd_print_symbol_name: - case bfd_print_symbol_more: - if (symbol->name) - fprintf (file, "%s", symbol->name); - break; - case bfd_print_symbol_all: - bfd_print_symbol_vandf ((PTR) file, symbol); - fprintf (file, " %-5s", symbol->section->name); - if (symbol->name) - fprintf (file, " %s", symbol->name); - break; - } -} - -/* Slurp in nlm symbol table. - - In the external (in-file) form, NLM export records are variable length, - with the following form: - - 1 byte length of the symbol name (N) - N bytes the symbol name - 4 bytes the symbol offset from start of it's section - - We also read in the debugging symbols and import records. Import - records are treated as undefined symbols. As we read the import - records we also read in the associated reloc information, which is - attached to the symbol. - - The bfd symbols are copied to SYMPTRS. - - When we return, the bfd symcount is either zero or contains the correct - number of symbols. -*/ - -static boolean -nlm_slurp_symbol_table (abfd) - bfd *abfd; -{ - Nlm_Internal_Fixed_Header *i_fxdhdrp; /* Nlm file header, internal form */ - bfd_size_type totsymcount; /* Number of NLM symbols */ - bfd_size_type symcount; /* Counter of NLM symbols */ - nlm_symbol_type *sym; /* Pointer to current bfd symbol */ - unsigned char symlength; /* Symbol length read into here */ - unsigned char symtype; /* Type of debugging symbol */ - bfd_byte temp[NLM_TARGET_LONG_SIZE]; /* Symbol offsets read into here */ - boolean (*read_import_func) PARAMS ((bfd *, nlm_symbol_type *)); - boolean (*set_public_section_func) PARAMS ((bfd *, nlm_symbol_type *)); - - if (nlm_get_symbols (abfd) != NULL) - return (true); - - /* Read each raw NLM symbol, using the information to create a canonical bfd - symbol table entry. - - Note that we allocate the initial bfd canonical symbol buffer based on a - one-to-one mapping of the NLM symbols to canonical symbols. We actually - use all the NLM symbols, so there will be no space left over at the end. - When we have all the symbols, we build the caller's pointer vector. */ - - abfd->symcount = 0; - i_fxdhdrp = nlm_fixed_header (abfd); - totsymcount = (i_fxdhdrp->numberOfPublics - + i_fxdhdrp->numberOfDebugRecords - + i_fxdhdrp->numberOfExternalReferences); - if (totsymcount == 0) - { - return (true); - } - - if (bfd_seek (abfd, i_fxdhdrp->publicsOffset, SEEK_SET) == -1) - return (false); - - sym = ((nlm_symbol_type *) - bfd_zalloc (abfd, totsymcount * sizeof (nlm_symbol_type))); - if (!sym) - return false; - nlm_set_symbols (abfd, sym); - - /* We use the bfd's symcount directly as the control count, so that early - termination of the loop leaves the symcount correct for the symbols that - were read. */ - - set_public_section_func = nlm_set_public_section_func (abfd); - symcount = i_fxdhdrp->numberOfPublics; - while (abfd->symcount < symcount) - { - if (bfd_read ((PTR) & symlength, sizeof (symlength), 1, abfd) - != sizeof (symlength)) - return (false); - sym->symbol.the_bfd = abfd; - sym->symbol.name = bfd_alloc (abfd, symlength + 1); - if (!sym->symbol.name) - return false; - if (bfd_read ((PTR) sym->symbol.name, symlength, 1, abfd) - != symlength) - return (false); - /* Cast away const. */ - ((char *) (sym->symbol.name))[symlength] = '\0'; - if (bfd_read ((PTR) temp, sizeof (temp), 1, abfd) != sizeof (temp)) - return (false); - sym->symbol.flags = BSF_GLOBAL | BSF_EXPORT; - sym->symbol.value = get_word (abfd, temp); - if (set_public_section_func) - { - /* Most backends can use the code below, but unfortunately - some use a different scheme. */ - if ((*set_public_section_func) (abfd, sym) == false) - return false; - } - else - { - if (sym->symbol.value & NLM_HIBIT) - { - sym->symbol.value &= ~NLM_HIBIT; - sym->symbol.flags |= BSF_FUNCTION; - sym->symbol.section = - bfd_get_section_by_name (abfd, NLM_CODE_NAME); - } - else - { - sym->symbol.section = - bfd_get_section_by_name (abfd, NLM_INITIALIZED_DATA_NAME); - } - } - sym->rcnt = 0; - abfd->symcount++; - sym++; - } - - /* Read the debugging records. */ - - if (i_fxdhdrp->numberOfDebugRecords > 0) - { - if (bfd_seek (abfd, i_fxdhdrp->debugInfoOffset, SEEK_SET) == -1) - return (false); - - symcount += i_fxdhdrp->numberOfDebugRecords; - while (abfd->symcount < symcount) - { - if ((bfd_read ((PTR) & symtype, sizeof (symtype), 1, abfd) - != sizeof (symtype)) - || bfd_read ((PTR) temp, sizeof (temp), 1, abfd) != sizeof (temp) - || (bfd_read ((PTR) & symlength, sizeof (symlength), 1, abfd) - != sizeof (symlength))) - return false; - sym->symbol.the_bfd = abfd; - sym->symbol.name = bfd_alloc (abfd, symlength + 1); - if (!sym->symbol.name) - return false; - if (bfd_read ((PTR) sym->symbol.name, symlength, 1, abfd) - != symlength) - return (false); - /* Cast away const. */ - ((char *) (sym->symbol.name))[symlength] = '\0'; - sym->symbol.flags = BSF_LOCAL; - sym->symbol.value = get_word (abfd, temp); - if (symtype == 0) - { - sym->symbol.section = - bfd_get_section_by_name (abfd, NLM_INITIALIZED_DATA_NAME); - } - else if (symtype == 1) - { - sym->symbol.flags |= BSF_FUNCTION; - sym->symbol.section = - bfd_get_section_by_name (abfd, NLM_CODE_NAME); - } - else - { - sym->symbol.section = bfd_abs_section_ptr; - } - sym->rcnt = 0; - abfd->symcount++; - sym++; - } - } - - /* Read in the import records. We can only do this if we know how - to read relocs for this target. */ - - read_import_func = nlm_read_import_func (abfd); - if (read_import_func != NULL) - { - if (bfd_seek (abfd, i_fxdhdrp->externalReferencesOffset, SEEK_SET) - == -1) - return (false); - - symcount += i_fxdhdrp->numberOfExternalReferences; - while (abfd->symcount < symcount) - { - if ((*read_import_func) (abfd, sym) == false) - return false; - sym++; - abfd->symcount++; - } - } - - return (true); -} - -/* Get the relocs for an NLM file. There are two types of relocs. - Imports are relocs against symbols defined in other NLM files. We - treat these as relocs against global symbols. Relocation fixups - are internal relocs. - - The actual format used to store the relocs is machine specific. */ - -/* Read in the relocation fixup information. This is stored in - nlm_relocation_fixups, an array of arelent structures, and - nlm_relocation_fixup_secs, an array of section pointers. The - section pointers are needed because the relocs are not sorted by - section. */ - -static boolean -nlm_slurp_reloc_fixups (abfd) - bfd *abfd; -{ - boolean (*read_func) PARAMS ((bfd *, nlm_symbol_type *, asection **, - arelent *)); - bfd_size_type count; - arelent *rels; - asection **secs; - - if (nlm_relocation_fixups (abfd) != NULL) - return true; - read_func = nlm_read_reloc_func (abfd); - if (read_func == NULL) - return true; - - if (bfd_seek (abfd, nlm_fixed_header (abfd)->relocationFixupOffset, - SEEK_SET) != 0) - return false; - - count = nlm_fixed_header (abfd)->numberOfRelocationFixups; - rels = (arelent *) bfd_alloc (abfd, count * sizeof (arelent)); - secs = (asection **) bfd_alloc (abfd, count * sizeof (asection *)); - if ((rels == NULL || secs == NULL) && count != 0) - return false; - nlm_relocation_fixups (abfd) = rels; - nlm_relocation_fixup_secs (abfd) = secs; - - /* We have to read piece by piece, because we don't know how large - the machine specific reloc information is. */ - while (count-- != 0) - { - if ((*read_func) (abfd, (nlm_symbol_type *) NULL, secs, rels) == false) - { - nlm_relocation_fixups (abfd) = NULL; - nlm_relocation_fixup_secs (abfd) = NULL; - return false; - } - ++secs; - ++rels; - } - - return true; -} - -/* Get the number of relocs. This really just returns an upper bound, - since it does not attempt to distinguish them based on the section. - That will be handled when they are actually read. */ - -long -nlm_get_reloc_upper_bound (abfd, sec) - bfd *abfd; - asection *sec; -{ - nlm_symbol_type *syms; - bfd_size_type count; - unsigned int ret; - - /* If we don't know how to read relocs, just return 0. */ - if (nlm_read_reloc_func (abfd) == NULL) - return -1; - /* Make sure we have either the code or the data section. */ - if ((bfd_get_section_flags (abfd, sec) & (SEC_CODE | SEC_DATA)) == 0) - return 0; - - syms = nlm_get_symbols (abfd); - if (syms == NULL) - { - if (nlm_slurp_symbol_table (abfd) == false) - return -1; - syms = nlm_get_symbols (abfd); - } - - ret = nlm_fixed_header (abfd)->numberOfRelocationFixups; - - count = bfd_get_symcount (abfd); - while (count-- != 0) - { - ret += syms->rcnt; - ++syms; - } - - return (ret + 1) * sizeof (arelent *); -} - -/* Get the relocs themselves. */ - -long -nlm_canonicalize_reloc (abfd, sec, relptr, symbols) - bfd *abfd; - asection *sec; - arelent **relptr; - asymbol **symbols; -{ - arelent *rels; - asection **secs; - bfd_size_type count, i; - unsigned int ret; - - /* Get the relocation fixups. */ - rels = nlm_relocation_fixups (abfd); - if (rels == NULL) - { - if (nlm_slurp_reloc_fixups (abfd) == false) - return -1; - rels = nlm_relocation_fixups (abfd); - } - secs = nlm_relocation_fixup_secs (abfd); - - ret = 0; - count = nlm_fixed_header (abfd)->numberOfRelocationFixups; - for (i = 0; i < count; i++, rels++, secs++) - { - if (*secs == sec) - { - *relptr++ = rels; - ++ret; - } - } - - /* Get the import symbols. */ - count = bfd_get_symcount (abfd); - for (i = 0; i < count; i++, symbols++) - { - asymbol *sym; - - sym = *symbols; - if (bfd_asymbol_flavour (sym) == bfd_target_nlm_flavour) - { - nlm_symbol_type *nlm_sym; - bfd_size_type j; - - nlm_sym = (nlm_symbol_type *) sym; - for (j = 0; j < nlm_sym->rcnt; j++) - { - if (nlm_sym->relocs[j].section == sec) - { - *relptr = &nlm_sym->relocs[j].reloc; - (*relptr)->sym_ptr_ptr = symbols; - ++relptr; - ++ret; - } - } - } - } - - *relptr = NULL; - - return ret; -} - -/* Compute the section file positions for an NLM file. All variable - length data in the file headers must be set before this function is - called. If the variable length data is changed later, the - resulting object file will be incorrect. Unfortunately, there is - no way to check this. - - This routine also sets the Size and Offset fields in the fixed - header. - - It also looks over the symbols and moves any common symbols into - the .bss section; NLM has no way to represent a common symbol. - This approach means that either the symbols must already have been - set at this point, or there must be no common symbols. We need to - move the symbols at this point so that mangle_relocs can see the - final values. */ - -static boolean -nlm_compute_section_file_positions (abfd) - bfd *abfd; -{ - file_ptr sofar; - asection *sec; - bfd_vma text, data, bss; - bfd_vma text_low, data_low; - unsigned int text_align, data_align, other_align; - file_ptr text_ptr, data_ptr, other_ptr; - asection *bss_sec; - asymbol **sym_ptr_ptr; - - if (abfd->output_has_begun == true) - return true; - - /* Make sure we have a section to hold uninitialized data. */ - bss_sec = bfd_get_section_by_name (abfd, NLM_UNINITIALIZED_DATA_NAME); - if (bss_sec == NULL) - { - if (!add_bfd_section (abfd, NLM_UNINITIALIZED_DATA_NAME, - (file_ptr) 0, (bfd_size_type) 0, - SEC_ALLOC)) - return false; - bss_sec = bfd_get_section_by_name (abfd, NLM_UNINITIALIZED_DATA_NAME); - } - - abfd->output_has_begun = true; - - /* The fixed header. */ - sofar = nlm_optional_prefix_size (abfd) + nlm_fixed_header_size (abfd); - - /* The variable header. */ - sofar += (sizeof (nlm_variable_header (abfd)->descriptionLength) - + nlm_variable_header (abfd)->descriptionLength + 1 - + NLM_TARGET_LONG_SIZE /* stackSize */ - + NLM_TARGET_LONG_SIZE /* reserved */ - + sizeof (nlm_variable_header (abfd)->oldThreadName) - + sizeof (nlm_variable_header (abfd)->screenNameLength) - + nlm_variable_header (abfd)->screenNameLength + 1 - + sizeof (nlm_variable_header (abfd)->threadNameLength) - + nlm_variable_header (abfd)->threadNameLength + 1); - - /* The auxiliary headers. */ - if (find_nonzero ((PTR) nlm_version_header (abfd), - sizeof (Nlm_Internal_Version_Header))) - sofar += sizeof (Nlm_External_Version_Header); - if (find_nonzero ((PTR) nlm_extended_header (abfd), - sizeof (Nlm_Internal_Extended_Header))) - sofar += sizeof (Nlm_External_Extended_Header); - if (find_nonzero ((PTR) nlm_copyright_header (abfd), - sizeof (Nlm_Internal_Copyright_Header))) - sofar += (sizeof (Nlm_External_Copyright_Header) - + nlm_copyright_header (abfd)->copyrightMessageLength + 1); - if (find_nonzero ((PTR) nlm_custom_header (abfd), - sizeof (Nlm_Internal_Custom_Header))) - sofar += (sizeof (Nlm_External_Custom_Header) - + nlm_custom_header (abfd)->hdrLength); - if (find_nonzero ((PTR) nlm_cygnus_ext_header (abfd), - sizeof (Nlm_Internal_Cygnus_Ext_Header))) - sofar += sizeof (Nlm_External_Custom_Header); - - /* Compute the section file positions in two passes. First get the - sizes of the text and data sections, and then set the file - positions. This code aligns the sections in the file using the - same alignment restrictions that apply to the sections in memory; - this may not be necessary. */ - text = 0; - text_low = (bfd_vma) - 1; - text_align = 0; - data = 0; - data_low = (bfd_vma) - 1; - data_align = 0; - bss = 0; - other_align = 0; - for (sec = abfd->sections; sec != (asection *) NULL; sec = sec->next) - { - flagword f; - - sec->_raw_size = BFD_ALIGN (sec->_raw_size, 1 << sec->alignment_power); - - f = bfd_get_section_flags (abfd, sec); - if (f & SEC_CODE) - { - text += sec->_raw_size; - if (bfd_get_section_vma (abfd, sec) < text_low) - text_low = bfd_get_section_vma (abfd, sec); - if (sec->alignment_power > text_align) - text_align = sec->alignment_power; - } - else if (f & SEC_DATA) - { - data += sec->_raw_size; - if (bfd_get_section_vma (abfd, sec) < data_low) - data_low = bfd_get_section_vma (abfd, sec); - if (sec->alignment_power > data_align) - data_align = sec->alignment_power; - } - else if (f & SEC_HAS_CONTENTS) - { - if (sec->alignment_power > other_align) - other_align = sec->alignment_power; - } - else if (f & SEC_ALLOC) - bss += sec->_raw_size; - } - - nlm_set_text_low (abfd, text_low); - nlm_set_data_low (abfd, data_low); - - if (nlm_no_uninitialized_data (abfd)) - { - /* This NetWare format does not use uninitialized data. We must - increase the size of the data section. We will never wind up - writing those file locations, so they will remain zero. */ - data += bss; - bss = 0; - } - - text_ptr = BFD_ALIGN (sofar, 1 << text_align); - data_ptr = BFD_ALIGN (text_ptr + text, 1 << data_align); - other_ptr = BFD_ALIGN (data_ptr + data, 1 << other_align); - - /* Fill in some fields in the header for which we now have the - information. */ - nlm_fixed_header (abfd)->codeImageOffset = text_ptr; - nlm_fixed_header (abfd)->codeImageSize = text; - nlm_fixed_header (abfd)->dataImageOffset = data_ptr; - nlm_fixed_header (abfd)->dataImageSize = data; - nlm_fixed_header (abfd)->uninitializedDataSize = bss; - - for (sec = abfd->sections; sec != (asection *) NULL; sec = sec->next) - { - flagword f; - - f = bfd_get_section_flags (abfd, sec); - - if (f & SEC_CODE) - { - sec->filepos = text_ptr; - text_ptr += sec->_raw_size; - } - else if (f & SEC_DATA) - { - sec->filepos = data_ptr; - data_ptr += sec->_raw_size; - } - else if (f & SEC_HAS_CONTENTS) - { - sec->filepos = other_ptr; - other_ptr += sec->_raw_size; - } - } - - nlm_fixed_header (abfd)->relocationFixupOffset = other_ptr; - - /* Move all common symbols into the .bss section. */ - - sym_ptr_ptr = bfd_get_outsymbols (abfd); - if (sym_ptr_ptr != NULL) - { - asymbol **sym_end; - bfd_vma add; - - sym_end = sym_ptr_ptr + bfd_get_symcount (abfd); - add = 0; - for (; sym_ptr_ptr < sym_end; sym_ptr_ptr++) - { - asymbol *sym; - bfd_vma size; - - sym = *sym_ptr_ptr; - - if (!bfd_is_com_section (bfd_get_section (sym))) - continue; - - /* Put the common symbol in the .bss section, and increase - the size of the .bss section by the size of the common - symbol (which is the old value of the symbol). */ - sym->section = bss_sec; - size = sym->value; - sym->value = bss_sec->_raw_size + add; - add += size; - add = BFD_ALIGN (add, 1 << bss_sec->alignment_power); - } - if (add != 0) - { - if (nlm_no_uninitialized_data (abfd)) - { - /* We could handle this case, but so far it hasn't been - necessary. */ - abort (); - } - nlm_fixed_header (abfd)->uninitializedDataSize += add; - bss_sec->_raw_size += add; - } - } - - return true; -} - -/* Set the contents of a section. To do this we need to know where - the section is going to be located in the output file. That means - that the sizes of all the sections must be set, and all the - variable size header information must be known. */ - -boolean -nlm_set_section_contents (abfd, section, location, offset, count) - bfd *abfd; - asection *section; - PTR location; - file_ptr offset; - bfd_size_type count; -{ - if (abfd->output_has_begun == false - && nlm_compute_section_file_positions (abfd) == false) - return false; - - if (count == 0) - return true; - - /* i386 NetWare has a very restricted set of relocs. In order for - objcopy to work, the NLM i386 backend needs a chance to rework - the section contents so that its set of relocs will work. If all - the relocs are already acceptable, this will not do anything. */ - if (section->reloc_count != 0) - { - boolean (*mangle_relocs_func) PARAMS ((bfd *, asection *, PTR, - bfd_vma, bfd_size_type)); - - mangle_relocs_func = nlm_mangle_relocs_func (abfd); - if (mangle_relocs_func != NULL) - { - if (!(*mangle_relocs_func) (abfd, section, location, - (bfd_vma) offset, count)) - return false; - } - } - - if (bfd_seek (abfd, (file_ptr) (section->filepos + offset), SEEK_SET) != 0 - || bfd_write (location, 1, count, abfd) != count) - return false; - - return true; -} - -/* We need to sort a list of relocs associated with sections when we - write out the external relocs. */ - -static int -nlm_external_reloc_compare (p1, p2) - const void *p1; - const void *p2; -{ - const struct reloc_and_sec *r1 = (const struct reloc_and_sec *) p1; - const struct reloc_and_sec *r2 = (const struct reloc_and_sec *) p2; - int cmp; - - cmp = strcmp ((*r1->rel->sym_ptr_ptr)->name, - (*r2->rel->sym_ptr_ptr)->name); - if (cmp != 0) - return cmp; - - /* We sort by address within symbol to make the sort more stable and - increase the chances that different hosts will generate bit for - bit equivalent results. */ - return (int) (r1->rel->address - r2->rel->address); -} - -/* Write out an NLM file. We write out the information in this order: - fixed header - variable header - auxiliary headers - code sections - data sections - other sections (custom data, messages, help, shared NLM, RPC, - module dependencies) - relocation fixups - external references (imports) - public symbols (exports) - debugging records - This is similar to the order used by the NetWare tools; the - difference is that NetWare puts the sections other than code, data - and custom data at the end of the NLM. It is convenient for us to - know where the sections are going to be before worrying about the - size of the other information. - - By the time this function is called, all the section data should - have been output using set_section_contents. Note that custom - data, the message file, the help file, the shared NLM file, the RPC - data, and the module dependencies are all considered to be - sections; the caller is responsible for filling in the offset and - length fields in the NLM headers. The relocation fixups and - imports are both obtained from the list of relocs attached to each - section. The exports and debugging records are obtained from the - list of outsymbols. */ - -boolean -nlm_write_object_contents (abfd) - bfd *abfd; -{ - asection *sec; - boolean (*write_import_func) PARAMS ((bfd *, asection *, arelent *)); - bfd_size_type external_reloc_count, internal_reloc_count, i, c; - struct reloc_and_sec *external_relocs; - asymbol **sym_ptr_ptr; - file_ptr last; - boolean (*write_prefix_func) PARAMS ((bfd *)); - unsigned char *fixed_header = NULL; - - fixed_header = ((unsigned char *) - bfd_malloc ((size_t) nlm_fixed_header_size (abfd))); - if (fixed_header == NULL) - goto error_return; - - if (abfd->output_has_begun == false - && nlm_compute_section_file_positions (abfd) == false) - goto error_return; - - /* Write out the variable length headers. */ - if (bfd_seek (abfd, - nlm_optional_prefix_size (abfd) + nlm_fixed_header_size (abfd), - SEEK_SET) != 0) - goto error_return; - if (nlm_swap_variable_header_out (abfd) == false - || nlm_swap_auxiliary_headers_out (abfd) == false) - { - bfd_set_error (bfd_error_system_call); - goto error_return; - } - - /* A weak check on whether the section file positions were - reasonable. */ - if (bfd_tell (abfd) > nlm_fixed_header (abfd)->codeImageOffset) - { - bfd_set_error (bfd_error_invalid_operation); - goto error_return; - } - - /* Advance to the relocs. */ - if (bfd_seek (abfd, nlm_fixed_header (abfd)->relocationFixupOffset, - SEEK_SET) != 0) - goto error_return; - - /* The format of the relocation entries is dependent upon the - particular target. We use an external routine to write the reloc - out. */ - write_import_func = nlm_write_import_func (abfd); - - /* Write out the internal relocation fixups. While we're looping - over the relocs, we also count the external relocs, which is - needed when they are written out below. */ - internal_reloc_count = 0; - external_reloc_count = 0; - for (sec = abfd->sections; sec != (asection *) NULL; sec = sec->next) - { - arelent **rel_ptr_ptr, **rel_end; - - if (sec->reloc_count == 0) - continue; - - /* We can only represent relocs within a code or data - section. We ignore them for a debugging section. */ - if ((bfd_get_section_flags (abfd, sec) & (SEC_CODE | SEC_DATA)) == 0) - continue; - - /* We need to know how to write out imports */ - if (write_import_func == NULL) - { - bfd_set_error (bfd_error_invalid_operation); - goto error_return; - } - - rel_ptr_ptr = sec->orelocation; - rel_end = rel_ptr_ptr + sec->reloc_count; - for (; rel_ptr_ptr < rel_end; rel_ptr_ptr++) - { - arelent *rel; - asymbol *sym; - - rel = *rel_ptr_ptr; - sym = *rel->sym_ptr_ptr; - - if (! bfd_is_und_section (bfd_get_section (sym))) - { - ++internal_reloc_count; - if ((*write_import_func) (abfd, sec, rel) == false) - goto error_return; - } - else - ++external_reloc_count; - } - } - nlm_fixed_header (abfd)->numberOfRelocationFixups = internal_reloc_count; - - /* Write out the imports (relocs against external symbols). These - are output as a symbol name followed by all the relocs for that - symbol, so we must first gather together all the relocs against - external symbols and sort them. */ - external_relocs = - (struct reloc_and_sec *) bfd_alloc (abfd, - (external_reloc_count - * sizeof (struct reloc_and_sec))); - if (external_relocs == (struct reloc_and_sec *) NULL) - goto error_return; - i = 0; - for (sec = abfd->sections; sec != (asection *) NULL; sec = sec->next) - { - arelent **rel_ptr_ptr, **rel_end; - - if (sec->reloc_count == 0) - continue; - - rel_ptr_ptr = sec->orelocation; - rel_end = rel_ptr_ptr + sec->reloc_count; - for (; rel_ptr_ptr < rel_end; rel_ptr_ptr++) - { - arelent *rel; - asymbol *sym; - - rel = *rel_ptr_ptr; - sym = *rel->sym_ptr_ptr; - - if (! bfd_is_und_section (bfd_get_section (sym))) - continue; - - external_relocs[i].rel = rel; - external_relocs[i].sec = sec; - ++i; - } - } - - BFD_ASSERT (i == external_reloc_count); - - /* Sort the external relocs by name. */ - qsort ((PTR) external_relocs, (size_t) external_reloc_count, - sizeof (struct reloc_and_sec), nlm_external_reloc_compare); - - /* Write out the external relocs. */ - nlm_fixed_header (abfd)->externalReferencesOffset = bfd_tell (abfd); - c = 0; - i = 0; - while (i < external_reloc_count) - { - arelent *rel; - asymbol *sym; - bfd_size_type j, cnt; - - ++c; - - rel = external_relocs[i].rel; - sym = *rel->sym_ptr_ptr; - - cnt = 0; - for (j = i; - (j < external_reloc_count - && *external_relocs[j].rel->sym_ptr_ptr == sym); - j++) - ++cnt; - - if ((*nlm_write_external_func (abfd)) (abfd, cnt, sym, - &external_relocs[i]) - == false) - goto error_return; - - i += cnt; - } - - nlm_fixed_header (abfd)->numberOfExternalReferences = c; - - /* Write out the public symbols (exports). */ - sym_ptr_ptr = bfd_get_outsymbols (abfd); - if (sym_ptr_ptr != (asymbol **) NULL) - { - bfd_vma (*get_public_offset_func) PARAMS ((bfd *, asymbol *)); - boolean (*write_export_func) PARAMS ((bfd *, asymbol *, bfd_vma)); - - asymbol **sym_end; - - nlm_fixed_header (abfd)->publicsOffset = bfd_tell (abfd); - get_public_offset_func = nlm_get_public_offset_func (abfd); - write_export_func = nlm_write_export_func (abfd); - c = 0; - sym_end = sym_ptr_ptr + bfd_get_symcount (abfd); - for (; sym_ptr_ptr < sym_end; sym_ptr_ptr++) - { - asymbol *sym; - bfd_byte len; - bfd_vma offset; - bfd_byte temp[NLM_TARGET_LONG_SIZE]; - - sym = *sym_ptr_ptr; - - if ((sym->flags & (BSF_EXPORT | BSF_GLOBAL)) == 0 - || bfd_is_und_section (bfd_get_section (sym))) - continue; - - ++c; - - if (get_public_offset_func) - { - /* Most backends can use the code below, but - unfortunately some use a different scheme. */ - offset = (*get_public_offset_func) (abfd, sym); - } - else - { - offset = bfd_asymbol_value (sym); - sec = sym->section; - if (sec->flags & SEC_CODE) - { - offset -= nlm_get_text_low (abfd); - offset |= NLM_HIBIT; - } - else if (sec->flags & (SEC_DATA | SEC_ALLOC)) - { - /* SEC_ALLOC is for the .bss section. */ - offset -= nlm_get_data_low (abfd); - } - else - { - /* We can't handle an exported symbol that is not in - the code or data segment. */ - bfd_set_error (bfd_error_invalid_operation); - goto error_return; - } - } - - if (write_export_func) - { - if ((*write_export_func) (abfd, sym, offset) == false) - goto error_return; - } - else - { - len = strlen (sym->name); - if ((bfd_write (&len, sizeof (bfd_byte), 1, abfd) - != sizeof (bfd_byte)) - || bfd_write (sym->name, len, 1, abfd) != len) - goto error_return; - - put_word (abfd, offset, temp); - if (bfd_write (temp, sizeof (temp), 1, abfd) != sizeof (temp)) - goto error_return; - } - } - nlm_fixed_header (abfd)->numberOfPublics = c; - - /* Write out the debugging records. The NLM conversion program - wants to be able to inhibit this, so as a special hack if - debugInfoOffset is set to -1 we don't write any debugging - information. This can not be handled by fiddling with the - symbol table, because exported symbols appear in both the - exported symbol list and the debugging information. */ - if (nlm_fixed_header (abfd)->debugInfoOffset == (file_ptr) - 1) - { - nlm_fixed_header (abfd)->debugInfoOffset = 0; - nlm_fixed_header (abfd)->numberOfDebugRecords = 0; - } - else - { - nlm_fixed_header (abfd)->debugInfoOffset = bfd_tell (abfd); - c = 0; - sym_ptr_ptr = bfd_get_outsymbols (abfd); - sym_end = sym_ptr_ptr + bfd_get_symcount (abfd); - for (; sym_ptr_ptr < sym_end; sym_ptr_ptr++) - { - asymbol *sym; - bfd_byte type, len; - bfd_vma offset; - bfd_byte temp[NLM_TARGET_LONG_SIZE]; - - sym = *sym_ptr_ptr; - - /* The NLM notion of a debugging symbol is actually what - BFD calls a local or global symbol. What BFD calls a - debugging symbol NLM does not understand at all. */ - if ((sym->flags & (BSF_LOCAL | BSF_GLOBAL | BSF_EXPORT)) == 0 - || (sym->flags & BSF_DEBUGGING) != 0 - || bfd_is_und_section (bfd_get_section (sym))) - continue; - - ++c; - - offset = bfd_asymbol_value (sym); - sec = sym->section; - if (sec->flags & SEC_CODE) - { - offset -= nlm_get_text_low (abfd); - type = 1; - } - else if (sec->flags & (SEC_DATA | SEC_ALLOC)) - { - /* SEC_ALLOC is for the .bss section. */ - offset -= nlm_get_data_low (abfd); - type = 0; - } - else - type = 2; - - /* The type is 0 for data, 1 for code, 2 for absolute. */ - if (bfd_write (&type, sizeof (bfd_byte), 1, abfd) - != sizeof (bfd_byte)) - goto error_return; - - put_word (abfd, offset, temp); - if (bfd_write (temp, sizeof (temp), 1, abfd) != sizeof (temp)) - goto error_return; - - len = strlen (sym->name); - if ((bfd_write (&len, sizeof (bfd_byte), 1, abfd) - != sizeof (bfd_byte)) - || bfd_write (sym->name, len, 1, abfd) != len) - goto error_return; - } - nlm_fixed_header (abfd)->numberOfDebugRecords = c; - } - } - - /* NLMLINK fills in offset values even if there is no data, so we do - the same. */ - last = bfd_tell (abfd); - if (nlm_fixed_header (abfd)->codeImageOffset == 0) - nlm_fixed_header (abfd)->codeImageOffset = last; - if (nlm_fixed_header (abfd)->dataImageOffset == 0) - nlm_fixed_header (abfd)->dataImageOffset = last; - if (nlm_fixed_header (abfd)->customDataOffset == 0) - nlm_fixed_header (abfd)->customDataOffset = last; - if (nlm_fixed_header (abfd)->moduleDependencyOffset == 0) - nlm_fixed_header (abfd)->moduleDependencyOffset = last; - if (nlm_fixed_header (abfd)->relocationFixupOffset == 0) - nlm_fixed_header (abfd)->relocationFixupOffset = last; - if (nlm_fixed_header (abfd)->externalReferencesOffset == 0) - nlm_fixed_header (abfd)->externalReferencesOffset = last; - if (nlm_fixed_header (abfd)->publicsOffset == 0) - nlm_fixed_header (abfd)->publicsOffset = last; - if (nlm_fixed_header (abfd)->debugInfoOffset == 0) - nlm_fixed_header (abfd)->debugInfoOffset = last; - - /* At this point everything has been written out except the fixed - header. */ - memcpy (nlm_fixed_header (abfd)->signature, nlm_signature (abfd), - NLM_SIGNATURE_SIZE); - nlm_fixed_header (abfd)->version = NLM_HEADER_VERSION; - nlm_fixed_header (abfd)->codeStartOffset = - (bfd_get_start_address (abfd) - - nlm_get_text_low (abfd)); - - /* We have no convenient way for the caller to pass in the exit - procedure or the check unload procedure, so the caller must set - the values in the header to the values of the symbols. */ - nlm_fixed_header (abfd)->exitProcedureOffset -= nlm_get_text_low (abfd); - if (nlm_fixed_header (abfd)->checkUnloadProcedureOffset != 0) - nlm_fixed_header (abfd)->checkUnloadProcedureOffset -= - nlm_get_text_low (abfd); - - if (bfd_seek (abfd, 0, SEEK_SET) != 0) - goto error_return; - - write_prefix_func = nlm_write_prefix_func (abfd); - if (write_prefix_func) - { - if ((*write_prefix_func) (abfd) == false) - goto error_return; - } - - BFD_ASSERT ((bfd_size_type) bfd_tell (abfd) - == nlm_optional_prefix_size (abfd)); - - nlm_swap_fixed_header_out (abfd, nlm_fixed_header (abfd), fixed_header); - if (bfd_write (fixed_header, nlm_fixed_header_size (abfd), 1, abfd) - != nlm_fixed_header_size (abfd)) - goto error_return; - - if (fixed_header != NULL) - free (fixed_header); - return true; - -error_return: - if (fixed_header != NULL) - free (fixed_header); - return false; -} diff --git a/contrib/gdb/bfd/nlmswap.h b/contrib/gdb/bfd/nlmswap.h deleted file mode 100644 index 5a9ce7268d003..0000000000000 --- a/contrib/gdb/bfd/nlmswap.h +++ /dev/null @@ -1,157 +0,0 @@ -/* NLM (NetWare Loadable Module) swapping routines for BFD. - Copyright (C) 1993 Free Software Foundation, Inc. - - Written by Fred Fish @ Cygnus Support, using ELF support as the - template. - -This file is part of BFD, the Binary File Descriptor library. - -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 2 of the License, 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ - -/* Although this is a header file, it defines functions. It is - included by NLM backends to define swapping functions that vary - from one NLM to another. The backend code must arrange for - Nlm_External_xxxx to be defined appropriately, and can then include - this file to get the swapping routines. - - At the moment this is only needed for one structure, the fixed NLM - file header. */ - -static void nlm_swap_fixed_header_in PARAMS ((bfd *, PTR, - Nlm_Internal_Fixed_Header *)); -static void nlm_swap_fixed_header_out PARAMS ((bfd *, - Nlm_Internal_Fixed_Header *, - PTR)); - -/* Translate an NLM fixed length file header in external format into an NLM - file header in internal format. */ - -static void -nlm_swap_fixed_header_in (abfd, realsrc, dst) - bfd *abfd; - PTR realsrc; - Nlm_Internal_Fixed_Header *dst; -{ - Nlm_External_Fixed_Header *src = (Nlm_External_Fixed_Header *) realsrc; - memcpy (dst->signature, src->signature, NLM_SIGNATURE_SIZE); - memcpy (dst->moduleName, src->moduleName, NLM_MODULE_NAME_SIZE); - dst->version = - bfd_h_get_32 (abfd, (bfd_byte *) src->version); - dst->codeImageOffset = - bfd_h_get_32 (abfd, (bfd_byte *) src->codeImageOffset); - dst->codeImageSize = - bfd_h_get_32 (abfd, (bfd_byte *) src->codeImageSize); - dst->dataImageOffset = - bfd_h_get_32 (abfd, (bfd_byte *) src->dataImageOffset); - dst->dataImageSize = - bfd_h_get_32 (abfd, (bfd_byte *) src->dataImageSize); - dst->uninitializedDataSize = - bfd_h_get_32 (abfd, (bfd_byte *) src->uninitializedDataSize); - dst->customDataOffset = - bfd_h_get_32 (abfd, (bfd_byte *) src->customDataOffset); - dst->customDataSize = - bfd_h_get_32 (abfd, (bfd_byte *) src->customDataSize); - dst->moduleDependencyOffset = - bfd_h_get_32 (abfd, (bfd_byte *) src->moduleDependencyOffset); - dst->numberOfModuleDependencies = - bfd_h_get_32 (abfd, (bfd_byte *) src->numberOfModuleDependencies); - dst->relocationFixupOffset = - bfd_h_get_32 (abfd, (bfd_byte *) src->relocationFixupOffset); - dst->numberOfRelocationFixups = - bfd_h_get_32 (abfd, (bfd_byte *) src->numberOfRelocationFixups); - dst->externalReferencesOffset = - bfd_h_get_32 (abfd, (bfd_byte *) src->externalReferencesOffset); - dst->numberOfExternalReferences = - bfd_h_get_32 (abfd, (bfd_byte *) src->numberOfExternalReferences); - dst->publicsOffset = - bfd_h_get_32 (abfd, (bfd_byte *) src->publicsOffset); - dst->numberOfPublics = - bfd_h_get_32 (abfd, (bfd_byte *) src->numberOfPublics); - dst->debugInfoOffset = - bfd_h_get_32 (abfd, (bfd_byte *) src->debugInfoOffset); - dst->numberOfDebugRecords = - bfd_h_get_32 (abfd, (bfd_byte *) src->numberOfDebugRecords); - dst->codeStartOffset = - bfd_h_get_32 (abfd, (bfd_byte *) src->codeStartOffset); - dst->exitProcedureOffset = - bfd_h_get_32 (abfd, (bfd_byte *) src->exitProcedureOffset); - dst->checkUnloadProcedureOffset = - bfd_h_get_32 (abfd, (bfd_byte *) src->checkUnloadProcedureOffset); - dst->moduleType = - bfd_h_get_32 (abfd, (bfd_byte *) src->moduleType); - dst->flags = - bfd_h_get_32 (abfd, (bfd_byte *) src->flags); -} - -/* Translate an NLM fixed length file header in internal format into - an NLM file header in external format. */ - -static void -nlm_swap_fixed_header_out (abfd, src, realdst) - bfd *abfd; - Nlm_Internal_Fixed_Header *src; - PTR realdst; -{ - Nlm_External_Fixed_Header *dst = (Nlm_External_Fixed_Header *) realdst; - memset (dst, 0, sizeof *dst); - memcpy (dst->signature, src->signature, NLM_SIGNATURE_SIZE); - memcpy (dst->moduleName, src->moduleName, NLM_MODULE_NAME_SIZE); - bfd_h_put_32 (abfd, (bfd_vma) src->version, - (bfd_byte *) dst->version); - bfd_h_put_32 (abfd, (bfd_vma) src->codeImageOffset, - (bfd_byte *) dst->codeImageOffset); - bfd_h_put_32 (abfd, (bfd_vma) src->codeImageSize, - (bfd_byte *) dst->codeImageSize); - bfd_h_put_32 (abfd, (bfd_vma) src->dataImageOffset, - (bfd_byte *) dst->dataImageOffset); - bfd_h_put_32 (abfd, (bfd_vma) src->dataImageSize, - (bfd_byte *) dst->dataImageSize); - bfd_h_put_32 (abfd, (bfd_vma) src->uninitializedDataSize, - (bfd_byte *) dst->uninitializedDataSize); - bfd_h_put_32 (abfd, (bfd_vma) src->customDataOffset, - (bfd_byte *) dst->customDataOffset); - bfd_h_put_32 (abfd, (bfd_vma) src->customDataSize, - (bfd_byte *) dst->customDataSize); - bfd_h_put_32 (abfd, (bfd_vma) src->moduleDependencyOffset, - (bfd_byte *) dst->moduleDependencyOffset); - bfd_h_put_32 (abfd, (bfd_vma) src->numberOfModuleDependencies, - (bfd_byte *) dst->numberOfModuleDependencies); - bfd_h_put_32 (abfd, (bfd_vma) src->relocationFixupOffset, - (bfd_byte *) dst->relocationFixupOffset); - bfd_h_put_32 (abfd, (bfd_vma) src->numberOfRelocationFixups, - (bfd_byte *) dst->numberOfRelocationFixups); - bfd_h_put_32 (abfd, (bfd_vma) src->externalReferencesOffset, - (bfd_byte *) dst->externalReferencesOffset); - bfd_h_put_32 (abfd, (bfd_vma) src->numberOfExternalReferences, - (bfd_byte *) dst->numberOfExternalReferences); - bfd_h_put_32 (abfd, (bfd_vma) src->publicsOffset, - (bfd_byte *) dst->publicsOffset); - bfd_h_put_32 (abfd, (bfd_vma) src->numberOfPublics, - (bfd_byte *) dst->numberOfPublics); - bfd_h_put_32 (abfd, (bfd_vma) src->debugInfoOffset, - (bfd_byte *) dst->debugInfoOffset); - bfd_h_put_32 (abfd, (bfd_vma) src->numberOfDebugRecords, - (bfd_byte *) dst->numberOfDebugRecords); - bfd_h_put_32 (abfd, (bfd_vma) src->codeStartOffset, - (bfd_byte *) dst->codeStartOffset); - bfd_h_put_32 (abfd, (bfd_vma) src->exitProcedureOffset, - (bfd_byte *) dst->exitProcedureOffset); - bfd_h_put_32 (abfd, (bfd_vma) src->checkUnloadProcedureOffset, - (bfd_byte *) dst->checkUnloadProcedureOffset); - bfd_h_put_32 (abfd, (bfd_vma) src->moduleType, - (bfd_byte *) dst->moduleType); - bfd_h_put_32 (abfd, (bfd_vma) src->flags, - (bfd_byte *) dst->flags); -} diff --git a/contrib/gdb/bfd/ns32knetbsd.c b/contrib/gdb/bfd/ns32knetbsd.c deleted file mode 100644 index 3e3f08a9e58dd..0000000000000 --- a/contrib/gdb/bfd/ns32knetbsd.c +++ /dev/null @@ -1,53 +0,0 @@ -/* BFD back-end for NetBSD/ns32k a.out-ish binaries. - Copyright (C) 1990, 1991, 1992 Free Software Foundation, Inc. - -This file is part of BFD, the Binary File Descriptor library. - -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 2 of the License, 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ - -#define BYTES_IN_WORD 4 -#undef TARGET_IS_BIG_ENDIAN_P - -#define TARGET_PAGE_SIZE 4096 -#define SEGMENT_SIZE 4096 - -#define DEFAULT_ARCH bfd_arch_ns32k -#define MACHTYPE_OK(mtype) ((mtype) == M_532_NETBSD || (mtype) == M_UNKNOWN) - -#define MY(OP) CAT(pc532netbsd_,OP) - -#define NAME(x,y) CAT3(ns32kaout,_32_,y) - -/* This needs to start with a.out so GDB knows it is an a.out variant. */ -#define TARGETNAME "a.out-ns32k-netbsd" - -#define ns32kaout_32_get_section_contents aout_32_get_section_contents - -#define MY_text_includes_header 1 - -/* We can`t use the MYNS macro here for cpp reasons too subtle - * for me -- IWD - */ -#define MY_bfd_reloc_type_lookup ns32kaout_bfd_reloc_type_lookup - -#include "bfd.h" /* To ensure following declaration is OK */ - -CONST struct reloc_howto_struct * -MY_bfd_reloc_type_lookup - PARAMS((bfd *abfd AND - bfd_reloc_code_real_type code)); - - -#include "netbsd.h" diff --git a/contrib/gdb/bfd/oasys.c b/contrib/gdb/bfd/oasys.c deleted file mode 100644 index c72147288af5a..0000000000000 --- a/contrib/gdb/bfd/oasys.c +++ /dev/null @@ -1,1533 +0,0 @@ -/* BFD back-end for oasys objects. - Copyright 1990, 91, 92, 93, 94, 95, 1996 Free Software Foundation, Inc. - Written by Steve Chamberlain of Cygnus Support, <sac@cygnus.com>. - -This file is part of BFD, the Binary File Descriptor library. - -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 2 of the License, 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ - -#define UNDERSCORE_HACK 1 -#include "bfd.h" -#include "sysdep.h" -#include <ctype.h> -#include "libbfd.h" -#include "oasys.h" -#include "liboasys.h" - -/* XXX - FIXME. offsetof belongs in the system-specific files in - ../include/sys. */ -/* Define offsetof for those systems which lack it */ - -#ifndef offsetof -#define offsetof(type, identifier) (size_t) &(((type *) 0)->identifier) -#endif - -static boolean oasys_read_record PARAMS ((bfd *, - oasys_record_union_type *)); -static boolean oasys_write_sections PARAMS ((bfd *)); -static boolean oasys_write_record PARAMS ((bfd *, - oasys_record_enum_type, - oasys_record_union_type *, - size_t)); -static boolean oasys_write_syms PARAMS ((bfd *)); -static boolean oasys_write_header PARAMS ((bfd *)); -static boolean oasys_write_end PARAMS ((bfd *)); -static boolean oasys_write_data PARAMS ((bfd *)); - -/* Read in all the section data and relocation stuff too */ -PROTO (static boolean, oasys_slurp_section_data, (bfd * CONST abfd)); - -static boolean -oasys_read_record (abfd, record) - bfd *abfd; - oasys_record_union_type *record; -{ - if (bfd_read ((PTR) record, 1, sizeof (record->header), abfd) - != sizeof (record->header)) - return false; - - if ((size_t) record->header.length <= (size_t) sizeof (record->header)) - return true; - if (bfd_read ((PTR) (((char *) record) + sizeof (record->header)), - 1, record->header.length - sizeof (record->header), - abfd) - != record->header.length - sizeof (record->header)) - return false; - return true; -} -static size_t -oasys_string_length (record) - oasys_record_union_type *record; -{ - return record->header.length - - ((char *) record->symbol.name - (char *) record); -} - -/*****************************************************************************/ - -/* - -Slurp the symbol table by reading in all the records at the start file -till we get to the first section record. - -We'll sort the symbolss into two lists, defined and undefined. The -undefined symbols will be placed into the table according to their -refno. - -We do this by placing all undefined symbols at the front of the table -moving in, and the defined symbols at the end of the table moving back. - -*/ - -static boolean -oasys_slurp_symbol_table (abfd) - bfd *CONST abfd; -{ - oasys_record_union_type record; - oasys_data_type *data = OASYS_DATA (abfd); - boolean loop = true; - asymbol *dest_defined; - asymbol *dest; - char *string_ptr; - - - if (data->symbols != (asymbol *) NULL) - { - return true; - } - /* Buy enough memory for all the symbols and all the names */ - data->symbols = - (asymbol *) bfd_alloc (abfd, sizeof (asymbol) * abfd->symcount); -#ifdef UNDERSCORE_HACK - /* buy 1 more char for each symbol to keep the underscore in*/ - data->strings = bfd_alloc (abfd, data->symbol_string_length + - abfd->symcount); -#else - data->strings = bfd_alloc (abfd, data->symbol_string_length); -#endif - if (!data->symbols || !data->strings) - return false; - - dest_defined = data->symbols + abfd->symcount - 1; - - string_ptr = data->strings; - if (bfd_seek (abfd, (file_ptr) 0, SEEK_SET) != 0) - return false; - while (loop) - { - - if (! oasys_read_record (abfd, &record)) - return false; - switch (record.header.type) - { - case oasys_record_is_header_enum: - break; - case oasys_record_is_local_enum: - case oasys_record_is_symbol_enum: - { - int flag = record.header.type == (int) oasys_record_is_local_enum ? - (BSF_LOCAL) : (BSF_GLOBAL | BSF_EXPORT); - - - size_t length = oasys_string_length (&record); - switch (record.symbol.relb & RELOCATION_TYPE_BITS) - { - case RELOCATION_TYPE_ABS: - dest = dest_defined--; - dest->section = bfd_abs_section_ptr; - dest->flags = 0; - - break; - case RELOCATION_TYPE_REL: - dest = dest_defined--; - dest->section = - OASYS_DATA (abfd)->sections[record.symbol.relb & - RELOCATION_SECT_BITS]; - if (record.header.type == (int) oasys_record_is_local_enum) - { - dest->flags = BSF_LOCAL; - if (dest->section == (asection *) (~0)) - { - /* It seems that sometimes internal symbols are tied up, but - still get output, even though there is no - section */ - dest->section = 0; - } - } - else - { - - dest->flags = flag; - } - break; - case RELOCATION_TYPE_UND: - dest = data->symbols + bfd_h_get_16 (abfd, record.symbol.refno); - dest->section = bfd_und_section_ptr; - break; - case RELOCATION_TYPE_COM: - dest = dest_defined--; - dest->name = string_ptr; - dest->the_bfd = abfd; - - dest->section = bfd_com_section_ptr; - - break; - default: - dest = dest_defined--; - BFD_ASSERT (0); - break; - } - dest->name = string_ptr; - dest->the_bfd = abfd; - dest->udata.p = (PTR) NULL; - dest->value = bfd_h_get_32 (abfd, record.symbol.value); - -#ifdef UNDERSCORE_HACK - if (record.symbol.name[0] != '_') - { - string_ptr[0] = '_'; - string_ptr++; - } -#endif - memcpy (string_ptr, record.symbol.name, length); - - - string_ptr[length] = 0; - string_ptr += length + 1; - } - break; - default: - loop = false; - } - } - return true; -} - -static long -oasys_get_symtab_upper_bound (abfd) - bfd *CONST abfd; -{ - if (! oasys_slurp_symbol_table (abfd)) - return -1; - - return (abfd->symcount + 1) * (sizeof (oasys_symbol_type *)); -} - -/* -*/ - -extern const bfd_target oasys_vec; - -long -oasys_get_symtab (abfd, location) - bfd *abfd; - asymbol **location; -{ - asymbol *symbase; - unsigned int counter; - if (oasys_slurp_symbol_table (abfd) == false) - { - return -1; - } - symbase = OASYS_DATA (abfd)->symbols; - for (counter = 0; counter < abfd->symcount; counter++) - { - *(location++) = symbase++; - } - *location = 0; - return abfd->symcount; -} - -/*********************************************************************** -* archive stuff -*/ - -static const bfd_target * -oasys_archive_p (abfd) - bfd *abfd; -{ - oasys_archive_header_type header; - oasys_extarchive_header_type header_ext; - unsigned int i; - file_ptr filepos; - - if (bfd_seek (abfd, (file_ptr) 0, false) != 0 - || (bfd_read ((PTR) & header_ext, 1, sizeof (header_ext), abfd) - != sizeof (header_ext))) - { - if (bfd_get_error () != bfd_error_system_call) - bfd_set_error (bfd_error_wrong_format); - return NULL; - } - - header.version = bfd_h_get_32 (abfd, header_ext.version); - header.mod_count = bfd_h_get_32 (abfd, header_ext.mod_count); - header.mod_tbl_offset = bfd_h_get_32 (abfd, header_ext.mod_tbl_offset); - header.sym_tbl_size = bfd_h_get_32 (abfd, header_ext.sym_tbl_size); - header.sym_count = bfd_h_get_32 (abfd, header_ext.sym_count); - header.sym_tbl_offset = bfd_h_get_32 (abfd, header_ext.sym_tbl_offset); - header.xref_count = bfd_h_get_32 (abfd, header_ext.xref_count); - header.xref_lst_offset = bfd_h_get_32 (abfd, header_ext.xref_lst_offset); - - /* - There isn't a magic number in an Oasys archive, so the best we - can do to verify reasnableness is to make sure that the values in - the header are too weird - */ - - if (header.version > 10000 || - header.mod_count > 10000 || - header.sym_count > 100000 || - header.xref_count > 100000) - return (const bfd_target *) NULL; - - /* - That all worked, let's buy the space for the header and read in - the headers. - */ - { - oasys_ar_data_type *ar = - (oasys_ar_data_type *) bfd_alloc (abfd, sizeof (oasys_ar_data_type)); - - oasys_module_info_type *module = - (oasys_module_info_type *) - bfd_alloc (abfd, sizeof (oasys_module_info_type) * header.mod_count); - oasys_module_table_type record; - - if (!ar || !module) - return NULL; - - abfd->tdata.oasys_ar_data = ar; - ar->module = module; - ar->module_count = header.mod_count; - - filepos = header.mod_tbl_offset; - for (i = 0; i < header.mod_count; i++) - { - if (bfd_seek (abfd, filepos, SEEK_SET) != 0) - return NULL; - - /* There are two ways of specifying the archive header */ - - if (0) - { - oasys_extmodule_table_type_a_type record_ext; - if (bfd_read ((PTR) & record_ext, 1, sizeof (record_ext), abfd) - != sizeof (record_ext)) - return NULL; - - record.mod_size = bfd_h_get_32 (abfd, record_ext.mod_size); - record.file_offset = bfd_h_get_32 (abfd, record_ext.file_offset); - - record.dep_count = bfd_h_get_32 (abfd, record_ext.dep_count); - record.depee_count = bfd_h_get_32 (abfd, record_ext.depee_count); - record.sect_count = bfd_h_get_32 (abfd, record_ext.sect_count); - - module[i].name = bfd_alloc (abfd, 33); - if (!module[i].name) - return NULL; - - memcpy (module[i].name, record_ext.mod_name, 33); - filepos += - sizeof (record_ext) + - record.dep_count * 4 + - record.depee_count * 4 + - record.sect_count * 8 + 187; - } - else - { - oasys_extmodule_table_type_b_type record_ext; - if (bfd_read ((PTR) & record_ext, 1, sizeof (record_ext), abfd) - != sizeof (record_ext)) - return NULL; - - record.mod_size = bfd_h_get_32 (abfd, record_ext.mod_size); - record.file_offset = bfd_h_get_32 (abfd, record_ext.file_offset); - - record.dep_count = bfd_h_get_32 (abfd, record_ext.dep_count); - record.depee_count = bfd_h_get_32 (abfd, record_ext.depee_count); - record.sect_count = bfd_h_get_32 (abfd, record_ext.sect_count); - record.module_name_size = bfd_h_get_32 (abfd, record_ext.mod_name_length); - - module[i].name = bfd_alloc (abfd, record.module_name_size + 1); - if (!module[i].name) - return NULL; - if (bfd_read ((PTR) module[i].name, 1, record.module_name_size, - abfd) - != record.module_name_size) - return NULL; - module[i].name[record.module_name_size] = 0; - filepos += - sizeof (record_ext) + - record.dep_count * 4 + - record.module_name_size + 1; - - } - - - module[i].size = record.mod_size; - module[i].pos = record.file_offset; - module[i].abfd = 0; - } - - } - return abfd->xvec; -} - -static boolean -oasys_mkobject (abfd) - bfd *abfd; -{ - - abfd->tdata.oasys_obj_data = (oasys_data_type *) bfd_alloc (abfd, sizeof (oasys_data_type)); - return abfd->tdata.oasys_obj_data ? true : false; -} - -#define MAX_SECS 16 -static const bfd_target * -oasys_object_p (abfd) - bfd *abfd; -{ - oasys_data_type *oasys; - oasys_data_type *save = OASYS_DATA (abfd); - boolean loop = true; - boolean had_usefull = false; - - abfd->tdata.oasys_obj_data = 0; - oasys_mkobject (abfd); - oasys = OASYS_DATA (abfd); - memset ((PTR) oasys->sections, 0xff, sizeof (oasys->sections)); - - /* Point to the start of the file */ - if (bfd_seek (abfd, (file_ptr) 0, SEEK_SET) != 0) - goto fail; - oasys->symbol_string_length = 0; - /* Inspect the records, but only keep the section info - - remember the size of the symbols - */ - oasys->first_data_record = 0; - while (loop) - { - oasys_record_union_type record; - if (! oasys_read_record (abfd, &record)) - goto fail; - if ((size_t) record.header.length < (size_t) sizeof (record.header)) - goto fail; - - - switch ((oasys_record_enum_type) (record.header.type)) - { - case oasys_record_is_header_enum: - had_usefull = true; - break; - case oasys_record_is_symbol_enum: - case oasys_record_is_local_enum: - /* Count symbols and remember their size for a future malloc */ - abfd->symcount++; - oasys->symbol_string_length += 1 + oasys_string_length (&record); - had_usefull = true; - break; - case oasys_record_is_section_enum: - { - asection *s; - char *buffer; - unsigned int section_number; - if (record.section.header.length != sizeof (record.section)) - { - goto fail; - } - buffer = bfd_alloc (abfd, 3); - if (!buffer) - goto fail; - section_number = record.section.relb & RELOCATION_SECT_BITS; - sprintf (buffer, "%u", section_number); - s = bfd_make_section (abfd, buffer); - oasys->sections[section_number] = s; - switch (record.section.relb & RELOCATION_TYPE_BITS) - { - case RELOCATION_TYPE_ABS: - case RELOCATION_TYPE_REL: - break; - case RELOCATION_TYPE_UND: - case RELOCATION_TYPE_COM: - BFD_FAIL (); - } - - s->_raw_size = bfd_h_get_32 (abfd, record.section.value); - s->vma = bfd_h_get_32 (abfd, record.section.vma); - s->flags = 0; - had_usefull = true; - } - break; - case oasys_record_is_data_enum: - oasys->first_data_record = bfd_tell (abfd) - record.header.length; - case oasys_record_is_debug_enum: - case oasys_record_is_module_enum: - case oasys_record_is_named_section_enum: - case oasys_record_is_end_enum: - if (had_usefull == false) - goto fail; - loop = false; - break; - default: - goto fail; - } - } - oasys->symbols = (asymbol *) NULL; - /* - Oasys support several architectures, but I can't see a simple way - to discover which one is in a particular file - we'll guess - */ - bfd_default_set_arch_mach (abfd, bfd_arch_m68k, 0); - if (abfd->symcount != 0) - { - abfd->flags |= HAS_SYMS; - } - - /* - We don't know if a section has data until we've read it.. - */ - - oasys_slurp_section_data (abfd); - - - return abfd->xvec; - -fail: - (void) bfd_release (abfd, oasys); - abfd->tdata.oasys_obj_data = save; - return (const bfd_target *) NULL; -} - - -static void -oasys_get_symbol_info (ignore_abfd, symbol, ret) - bfd *ignore_abfd; - asymbol *symbol; - symbol_info *ret; -{ - bfd_symbol_info (symbol, ret); - if (!symbol->section) - ret->type = (symbol->flags & BSF_LOCAL) ? 'a' : 'A'; -} - -static void -oasys_print_symbol (ignore_abfd, afile, symbol, how) - bfd *ignore_abfd; - PTR afile; - asymbol *symbol; - bfd_print_symbol_type how; -{ - FILE *file = (FILE *) afile; - - switch (how) - { - case bfd_print_symbol_name: - case bfd_print_symbol_more: - fprintf (file, "%s", symbol->name); - break; - case bfd_print_symbol_all: - { - CONST char *section_name = symbol->section == (asection *) NULL ? - (CONST char *) "*abs" : symbol->section->name; - - bfd_print_symbol_vandf ((PTR) file, symbol); - - fprintf (file, " %-5s %s", - section_name, - symbol->name); - } - break; - } -} -/* - The howto table is build using the top two bits of a reloc byte to - index into it. The bits are PCREL,WORD/LONG -*/ -static reloc_howto_type howto_table[] = -{ - - HOWTO (0, 0, 1, 16, false, 0, complain_overflow_bitfield, 0, "abs16", true, 0x0000ffff, 0x0000ffff, false), - HOWTO (0, 0, 2, 32, false, 0, complain_overflow_bitfield, 0, "abs32", true, 0xffffffff, 0xffffffff, false), - HOWTO (0, 0, 1, 16, true, 0, complain_overflow_signed, 0, "pcrel16", true, 0x0000ffff, 0x0000ffff, false), - HOWTO (0, 0, 2, 32, true, 0, complain_overflow_signed, 0, "pcrel32", true, 0xffffffff, 0xffffffff, false) -}; - -/* Read in all the section data and relocation stuff too */ -static boolean -oasys_slurp_section_data (abfd) - bfd *CONST abfd; -{ - oasys_record_union_type record; - oasys_data_type *data = OASYS_DATA (abfd); - boolean loop = true; - - oasys_per_section_type *per; - - asection *s; - - /* See if the data has been slurped already .. */ - for (s = abfd->sections; s != (asection *) NULL; s = s->next) - { - per = oasys_per_section (s); - if (per->initialized == true) - return true; - } - - if (data->first_data_record == 0) - return true; - - if (bfd_seek (abfd, data->first_data_record, SEEK_SET) != 0) - return false; - while (loop) - { - if (! oasys_read_record (abfd, &record)) - return false; - switch (record.header.type) - { - case oasys_record_is_header_enum: - break; - case oasys_record_is_data_enum: - { - - bfd_byte *src = record.data.data; - bfd_byte *end_src = ((bfd_byte *) & record) + record.header.length; - bfd_byte *dst_ptr; - bfd_byte *dst_base_ptr; - unsigned int relbit; - unsigned int count; - asection *section = - data->sections[record.data.relb & RELOCATION_SECT_BITS]; - bfd_vma dst_offset; - - per = oasys_per_section (section); - - if (per->initialized == false) - { - per->data = (bfd_byte *) bfd_zalloc (abfd, section->_raw_size); - if (!per->data) - return false; - per->reloc_tail_ptr = (oasys_reloc_type **) & (section->relocation); - per->had_vma = false; - per->initialized = true; - section->reloc_count = 0; - section->flags = SEC_ALLOC; - } - - dst_offset = bfd_h_get_32 (abfd, record.data.addr); - if (per->had_vma == false) - { - /* Take the first vma we see as the base */ - section->vma = dst_offset; - per->had_vma = true; - } - - dst_offset -= section->vma; - - dst_base_ptr = oasys_per_section (section)->data; - dst_ptr = oasys_per_section (section)->data + - dst_offset; - - if (src < end_src) - { - section->flags |= SEC_LOAD | SEC_HAS_CONTENTS; - } - while (src < end_src) - { - unsigned char mod_byte = *src++; - size_t gap = end_src - src; - - count = 8; - if (mod_byte == 0 && gap >= 8) - { - dst_ptr[0] = src[0]; - dst_ptr[1] = src[1]; - dst_ptr[2] = src[2]; - dst_ptr[3] = src[3]; - dst_ptr[4] = src[4]; - dst_ptr[5] = src[5]; - dst_ptr[6] = src[6]; - dst_ptr[7] = src[7]; - dst_ptr += 8; - src += 8; - } - else - { - for (relbit = 1; count-- != 0 && src < end_src; relbit <<= 1) - { - if (relbit & mod_byte) - { - unsigned char reloc = *src; - /* This item needs to be relocated */ - switch (reloc & RELOCATION_TYPE_BITS) - { - case RELOCATION_TYPE_ABS: - - break; - - case RELOCATION_TYPE_REL: - { - /* Relocate the item relative to the section */ - oasys_reloc_type *r = - (oasys_reloc_type *) - bfd_alloc (abfd, - sizeof (oasys_reloc_type)); - if (!r) - return false; - *(per->reloc_tail_ptr) = r; - per->reloc_tail_ptr = &r->next; - r->next = (oasys_reloc_type *) NULL; - /* Reference to undefined symbol */ - src++; - /* There is no symbol */ - r->symbol = 0; - /* Work out the howto */ - abort (); -#if 0 - r->relent.section = - data->sections[reloc & - RELOCATION_SECT_BITS]; - - r->relent.addend = - - r->relent.section->vma; -#endif - r->relent.address = dst_ptr - dst_base_ptr; - r->relent.howto = &howto_table[reloc >> 6]; - r->relent.sym_ptr_ptr = (asymbol **) NULL; - section->reloc_count++; - - /* Fake up the data to look like it's got the -ve pc in it, this makes - it much easier to convert into other formats. This is done by - hitting the addend. - */ - if (r->relent.howto->pc_relative == true) - { - r->relent.addend -= dst_ptr - dst_base_ptr; - } - - - } - break; - - - case RELOCATION_TYPE_UND: - { - oasys_reloc_type *r = - (oasys_reloc_type *) - bfd_alloc (abfd, - sizeof (oasys_reloc_type)); - if (!r) - return false; - *(per->reloc_tail_ptr) = r; - per->reloc_tail_ptr = &r->next; - r->next = (oasys_reloc_type *) NULL; - /* Reference to undefined symbol */ - src++; - /* Get symbol number */ - r->symbol = (src[0] << 8) | src[1]; - /* Work out the howto */ - abort (); - -#if 0 - r->relent.section = (asection - *) NULL; -#endif - r->relent.addend = 0; - r->relent.address = dst_ptr - dst_base_ptr; - r->relent.howto = &howto_table[reloc >> 6]; - r->relent.sym_ptr_ptr = (asymbol **) NULL; - section->reloc_count++; - - src += 2; - /* Fake up the data to look like it's got the -ve pc in it, this makes - it much easier to convert into other formats. This is done by - hitting the addend. - */ - if (r->relent.howto->pc_relative == true) - { - r->relent.addend -= dst_ptr - dst_base_ptr; - } - - - - } - break; - case RELOCATION_TYPE_COM: - BFD_FAIL (); - } - } - *dst_ptr++ = *src++; - } - } - } - } - break; - case oasys_record_is_local_enum: - case oasys_record_is_symbol_enum: - case oasys_record_is_section_enum: - break; - default: - loop = false; - } - } - - return true; - -} - -static boolean -oasys_new_section_hook (abfd, newsect) - bfd *abfd; - asection *newsect; -{ - newsect->used_by_bfd = (PTR) - bfd_alloc (abfd, sizeof (oasys_per_section_type)); - if (!newsect->used_by_bfd) - return false; - oasys_per_section (newsect)->data = (bfd_byte *) NULL; - oasys_per_section (newsect)->section = newsect; - oasys_per_section (newsect)->offset = 0; - oasys_per_section (newsect)->initialized = false; - newsect->alignment_power = 1; - /* Turn the section string into an index */ - - sscanf (newsect->name, "%u", &newsect->target_index); - - return true; -} - - -static long -oasys_get_reloc_upper_bound (abfd, asect) - bfd *abfd; - sec_ptr asect; -{ - if (! oasys_slurp_section_data (abfd)) - return -1; - return (asect->reloc_count + 1) * sizeof (arelent *); -} - -static boolean -oasys_get_section_contents (abfd, section, location, offset, count) - bfd *abfd; - sec_ptr section; - PTR location; - file_ptr offset; - bfd_size_type count; -{ - oasys_per_section_type *p = (oasys_per_section_type *) section->used_by_bfd; - oasys_slurp_section_data (abfd); - if (p->initialized == false) - { - (void) memset (location, 0, (int) count); - } - else - { - (void) memcpy (location, (PTR) (p->data + offset), (int) count); - } - return true; -} - - -long -oasys_canonicalize_reloc (ignore_abfd, section, relptr, symbols) - bfd *ignore_abfd; - sec_ptr section; - arelent **relptr; - asymbol **symbols; -{ - unsigned int reloc_count = 0; - oasys_reloc_type *src = (oasys_reloc_type *) (section->relocation); - while (src != (oasys_reloc_type *) NULL) - { - abort (); - -#if 0 - if (src->relent.section == (asection *) NULL) - { - src->relent.sym_ptr_ptr = symbols + src->symbol; - } -#endif - - *relptr++ = &src->relent; - src = src->next; - reloc_count++; - } - *relptr = (arelent *) NULL; - return section->reloc_count = reloc_count; -} - - - - -/* Writing */ - - -/* Calculate the checksum and write one record */ -static boolean -oasys_write_record (abfd, type, record, size) - bfd *abfd; - oasys_record_enum_type type; - oasys_record_union_type *record; - size_t size; -{ - int checksum; - size_t i; - unsigned char *ptr; - - record->header.length = size; - record->header.type = (int) type; - record->header.check_sum = 0; - record->header.fill = 0; - ptr = (unsigned char *) &record->pad[0]; - checksum = 0; - for (i = 0; i < size; i++) - { - checksum += *ptr++; - } - record->header.check_sum = 0xff & (-checksum); - if (bfd_write ((PTR) record, 1, size, abfd) != size) - return false; - return true; -} - - -/* Write out all the symbols */ -static boolean -oasys_write_syms (abfd) - bfd *abfd; -{ - unsigned int count; - asymbol **generic = bfd_get_outsymbols (abfd); - unsigned int index = 0; - for (count = 0; count < bfd_get_symcount (abfd); count++) - { - - oasys_symbol_record_type symbol; - asymbol *CONST g = generic[count]; - - CONST char *src = g->name; - char *dst = symbol.name; - unsigned int l = 0; - - if (bfd_is_com_section (g->section)) - { - symbol.relb = RELOCATION_TYPE_COM; - bfd_h_put_16 (abfd, index, symbol.refno); - index++; - } - else if (bfd_is_abs_section (g->section)) - { - symbol.relb = RELOCATION_TYPE_ABS; - bfd_h_put_16 (abfd, 0, symbol.refno); - - } - else if (bfd_is_und_section (g->section)) - { - symbol.relb = RELOCATION_TYPE_UND; - bfd_h_put_16 (abfd, index, symbol.refno); - /* Overload the value field with the output index number */ - index++; - } - else if (g->flags & BSF_DEBUGGING) - { - /* throw it away */ - continue; - } - else - { - if (g->section == (asection *) NULL) - { - /* Sometime, the oasys tools give out a symbol with illegal - bits in it, we'll output it in the same broken way */ - - symbol.relb = RELOCATION_TYPE_REL | 0; - } - else - { - symbol.relb = RELOCATION_TYPE_REL | g->section->output_section->target_index; - } - bfd_h_put_16 (abfd, 0, symbol.refno); - } -#ifdef UNDERSCORE_HACK - if (src[l] == '_') - dst[l++] = '.'; -#endif - while (src[l]) - { - dst[l] = src[l]; - l++; - } - - bfd_h_put_32 (abfd, g->value, symbol.value); - - - if (g->flags & BSF_LOCAL) - { - if (! oasys_write_record (abfd, - oasys_record_is_local_enum, - (oasys_record_union_type *) & symbol, - offsetof (oasys_symbol_record_type, - name[0]) + l)) - return false; - } - else - { - if (! oasys_write_record (abfd, - oasys_record_is_symbol_enum, - (oasys_record_union_type *) & symbol, - offsetof (oasys_symbol_record_type, - name[0]) + l)) - return false; - } - g->value = index - 1; - } - - return true; -} - - - /* Write a section header for each section */ -static boolean -oasys_write_sections (abfd) - bfd *abfd; -{ - asection *s; - static oasys_section_record_type out; - - for (s = abfd->sections; s != (asection *) NULL; s = s->next) - { - if (!isdigit (s->name[0])) - { - (*_bfd_error_handler) - ("%s: can not represent section `%s' in oasys", - bfd_get_filename (abfd), s->name); - bfd_set_error (bfd_error_nonrepresentable_section); - return false; - } - out.relb = RELOCATION_TYPE_REL | s->target_index; - bfd_h_put_32 (abfd, s->_cooked_size, out.value); - bfd_h_put_32 (abfd, s->vma, out.vma); - - if (! oasys_write_record (abfd, - oasys_record_is_section_enum, - (oasys_record_union_type *) & out, - sizeof (out))) - return false; - } - return true; -} - -static boolean -oasys_write_header (abfd) - bfd *abfd; -{ - /* Create and write the header */ - oasys_header_record_type r; - size_t length = strlen (abfd->filename); - if (length > (size_t) sizeof (r.module_name)) - { - length = sizeof (r.module_name); - } - - (void) memcpy (r.module_name, - abfd->filename, - length); - (void) memset (r.module_name + length, - ' ', - sizeof (r.module_name) - length); - - r.version_number = OASYS_VERSION_NUMBER; - r.rev_number = OASYS_REV_NUMBER; - if (! oasys_write_record (abfd, - oasys_record_is_header_enum, - (oasys_record_union_type *) & r, - offsetof (oasys_header_record_type, - description[0]))) - return false; - - return true; -} - -static boolean -oasys_write_end (abfd) - bfd *abfd; -{ - oasys_end_record_type end; - unsigned char null = 0; - end.relb = RELOCATION_TYPE_ABS; - bfd_h_put_32 (abfd, abfd->start_address, end.entry); - bfd_h_put_16 (abfd, 0, end.fill); - end.zero = 0; - if (! oasys_write_record (abfd, - oasys_record_is_end_enum, - (oasys_record_union_type *) & end, - sizeof (end))) - return false; - if (bfd_write ((PTR) & null, 1, 1, abfd) != 1) - return false; - return true; -} - -static int -comp (ap, bp) - CONST PTR ap; - CONST PTR bp; -{ - arelent *a = *((arelent **) ap); - arelent *b = *((arelent **) bp); - return a->address - b->address; -} - -/* - Writing data.. - -*/ -static boolean -oasys_write_data (abfd) - bfd *abfd; -{ - asection *s; - for (s = abfd->sections; s != (asection *) NULL; s = s->next) - { - if (s->flags & SEC_LOAD) - { - bfd_byte *raw_data = oasys_per_section (s)->data; - oasys_data_record_type processed_data; - bfd_size_type current_byte_index = 0; - unsigned int relocs_to_go = s->reloc_count; - arelent **p = s->orelocation; - if (s->reloc_count != 0) - { -/* Sort the reloc records so it's easy to insert the relocs into the - data */ - - qsort (s->orelocation, - s->reloc_count, - sizeof (arelent **), - comp); - } - current_byte_index = 0; - processed_data.relb = s->target_index | RELOCATION_TYPE_REL; - - while (current_byte_index < s->_cooked_size) - { - /* Scan forwards by eight bytes or however much is left and see if - there are any relocations going on */ - bfd_byte *mod = &processed_data.data[0]; - bfd_byte *dst = &processed_data.data[1]; - - unsigned int i = 0; - *mod = 0; - - - bfd_h_put_32 (abfd, s->vma + current_byte_index, - processed_data.addr); - - /* Don't start a relocation unless you're sure you can finish it - within the same data record. The worst case relocation is a - 4-byte relocatable value which is split across two modification - bytes (1 relocation byte + 2 symbol reference bytes + 2 data + - 1 modification byte + 2 data = 8 bytes total). That's where - the magic number 8 comes from. - */ - while (current_byte_index < s->_raw_size && dst <= - &processed_data.data[sizeof (processed_data.data) - 8]) - { - - - if (relocs_to_go != 0) - { - arelent *r = *p; - reloc_howto_type *const how = r->howto; - /* There is a relocation, is it for this byte ? */ - if (r->address == current_byte_index) - { - unsigned char rel_byte; - - p++; - relocs_to_go--; - - *mod |= (1 << i); - if (how->pc_relative) - { - rel_byte = RELOCATION_PCREL_BIT; - - /* Also patch the raw data so that it doesn't have - the -ve stuff any more */ - if (how->size != 2) - { - bfd_put_16 (abfd, - bfd_get_16 (abfd, raw_data) + - current_byte_index, raw_data); - } - - else - { - bfd_put_32 (abfd, - bfd_get_32 (abfd, raw_data) + - current_byte_index, raw_data); - } - } - else - { - rel_byte = 0; - } - if (how->size == 2) - { - rel_byte |= RELOCATION_32BIT_BIT; - } - - /* Is this a section relative relocation, or a symbol - relative relocation ? */ - abort (); - -#if 0 - if (r->section != (asection *) NULL) - { - /* The relent has a section attached, so it must be section - relative */ - rel_byte |= RELOCATION_TYPE_REL; - rel_byte |= r->section->output_section->target_index; - *dst++ = rel_byte; - } - else -#endif - { - asymbol *p = *(r->sym_ptr_ptr); - - /* If this symbol has a section attached, then it - has already been resolved. Change from a symbol - ref to a section ref */ - if (p->section != (asection *) NULL) - { - rel_byte |= RELOCATION_TYPE_REL; - rel_byte |= - p->section->output_section->target_index; - *dst++ = rel_byte; - } - else - { - rel_byte |= RELOCATION_TYPE_UND; - *dst++ = rel_byte; - /* Next two bytes are a symbol index - we can get - this from the symbol value which has been zapped - into the symbol index in the table when the - symbol table was written - */ - *dst++ = p->value >> 8; - *dst++ = p->value; - } - } -#define ADVANCE { if (++i >= 8) { i = 0; mod = dst++; *mod = 0; } current_byte_index++; } - /* relocations never occur from an unloadable section, - so we can assume that raw_data is not NULL - */ - *dst++ = *raw_data++; - ADVANCE - * dst++ = *raw_data++; - ADVANCE - if (how->size == 2) - { - *dst++ = *raw_data++; - ADVANCE - * dst++ = *raw_data++; - ADVANCE - } - continue; - } - } - /* If this is coming from an unloadable section then copy - zeros */ - if (raw_data == NULL) - { - *dst++ = 0; - } - else - { - *dst++ = *raw_data++; - } - ADVANCE - } - - /* Don't write a useless null modification byte */ - if (dst == mod + 1) - { - --dst; - } - - if (! oasys_write_record (abfd, - oasys_record_is_data_enum, - ((oasys_record_union_type *) - & processed_data), - dst - (bfd_byte *) & processed_data)) - return false; - } - } - } - - return true; -} - -static boolean -oasys_write_object_contents (abfd) - bfd *abfd; -{ - if (! oasys_write_header (abfd)) - return false; - if (! oasys_write_syms (abfd)) - return false; - if (! oasys_write_sections (abfd)) - return false; - if (! oasys_write_data (abfd)) - return false; - if (! oasys_write_end (abfd)) - return false; - return true; -} - - - - -/** exec and core file sections */ - -/* set section contents is complicated with OASYS since the format is -* not a byte image, but a record stream. -*/ -static boolean -oasys_set_section_contents (abfd, section, location, offset, count) - bfd *abfd; - sec_ptr section; - PTR location; - file_ptr offset; - bfd_size_type count; -{ - if (count != 0) - { - if (oasys_per_section (section)->data == (bfd_byte *) NULL) - { - oasys_per_section (section)->data = - (bfd_byte *) (bfd_alloc (abfd, section->_cooked_size)); - if (!oasys_per_section (section)->data) - return false; - } - (void) memcpy ((PTR) (oasys_per_section (section)->data + offset), - location, - (size_t) count); - } - return true; -} - - - -/* Native-level interface to symbols. */ - -/* We read the symbols into a buffer, which is discarded when this -function exits. We read the strings into a buffer large enough to -hold them all plus all the cached symbol entries. */ - -static asymbol * -oasys_make_empty_symbol (abfd) - bfd *abfd; -{ - - oasys_symbol_type *new = - (oasys_symbol_type *) bfd_zalloc (abfd, sizeof (oasys_symbol_type)); - if (!new) - return NULL; - new->symbol.the_bfd = abfd; - return &new->symbol; -} - - - - -/* User should have checked the file flags; perhaps we should return -BFD_NO_MORE_SYMBOLS if there are none? */ - -static bfd * -oasys_openr_next_archived_file (arch, prev) - bfd *arch; - bfd *prev; -{ - oasys_ar_data_type *ar = OASYS_AR_DATA (arch); - oasys_module_info_type *p; - /* take the next one from the arch state, or reset */ - if (prev == (bfd *) NULL) - { - /* Reset the index - the first two entries are bogus*/ - ar->module_index = 0; - } - - p = ar->module + ar->module_index; - ar->module_index++; - - if (ar->module_index <= ar->module_count) - { - if (p->abfd == (bfd *) NULL) - { - p->abfd = _bfd_create_empty_archive_element_shell (arch); - p->abfd->origin = p->pos; - p->abfd->filename = p->name; - - /* Fixup a pointer to this element for the member */ - p->abfd->arelt_data = (PTR) p; - } - return p->abfd; - } - else - { - bfd_set_error (bfd_error_no_more_archived_files); - return (bfd *) NULL; - } -} - -static boolean -oasys_find_nearest_line (abfd, - section, - symbols, - offset, - filename_ptr, - functionname_ptr, - line_ptr) - bfd *abfd; - asection *section; - asymbol **symbols; - bfd_vma offset; - char **filename_ptr; - char **functionname_ptr; - unsigned int *line_ptr; -{ - return false; - -} - -static int -oasys_generic_stat_arch_elt (abfd, buf) - bfd *abfd; - struct stat *buf; -{ - oasys_module_info_type *mod = (oasys_module_info_type *) abfd->arelt_data; - if (mod == (oasys_module_info_type *) NULL) - { - bfd_set_error (bfd_error_invalid_operation); - return -1; - } - else - { - buf->st_size = mod->size; - buf->st_mode = 0666; - return 0; - } -} - -static int -oasys_sizeof_headers (abfd, exec) - bfd *abfd; - boolean exec; -{ - return 0; -} - -#define oasys_close_and_cleanup _bfd_generic_close_and_cleanup -#define oasys_bfd_free_cached_info _bfd_generic_bfd_free_cached_info - -#define oasys_slurp_armap bfd_true -#define oasys_slurp_extended_name_table bfd_true -#define oasys_construct_extended_name_table \ - ((boolean (*) PARAMS ((bfd *, char **, bfd_size_type *, const char **))) \ - bfd_true) -#define oasys_truncate_arname bfd_dont_truncate_arname -#define oasys_write_armap \ - ((boolean (*) \ - PARAMS ((bfd *, unsigned int, struct orl *, unsigned int, int))) \ - bfd_true) -#define oasys_read_ar_hdr bfd_nullvoidptr -#define oasys_get_elt_at_index _bfd_generic_get_elt_at_index -#define oasys_update_armap_timestamp bfd_true - -#define oasys_bfd_is_local_label bfd_generic_is_local_label -#define oasys_get_lineno _bfd_nosymbols_get_lineno -#define oasys_bfd_make_debug_symbol _bfd_nosymbols_bfd_make_debug_symbol -#define oasys_read_minisymbols _bfd_generic_read_minisymbols -#define oasys_minisymbol_to_symbol _bfd_generic_minisymbol_to_symbol - -#define oasys_bfd_reloc_type_lookup _bfd_norelocs_bfd_reloc_type_lookup - -#define oasys_set_arch_mach bfd_default_set_arch_mach - -#define oasys_get_section_contents_in_window \ - _bfd_generic_get_section_contents_in_window - -#define oasys_bfd_get_relocated_section_contents \ - bfd_generic_get_relocated_section_contents -#define oasys_bfd_relax_section bfd_generic_relax_section -#define oasys_bfd_link_hash_table_create _bfd_generic_link_hash_table_create -#define oasys_bfd_link_add_symbols _bfd_generic_link_add_symbols -#define oasys_bfd_final_link _bfd_generic_final_link -#define oasys_bfd_link_split_section _bfd_generic_link_split_section - -/*SUPPRESS 460 */ -const bfd_target oasys_vec = -{ - "oasys", /* name */ - bfd_target_oasys_flavour, - BFD_ENDIAN_BIG, /* target byte order */ - BFD_ENDIAN_BIG, /* target headers byte order */ - (HAS_RELOC | EXEC_P | /* object flags */ - HAS_LINENO | HAS_DEBUG | - HAS_SYMS | HAS_LOCALS | WP_TEXT | D_PAGED), - (SEC_CODE | SEC_DATA | SEC_ROM | SEC_HAS_CONTENTS - | SEC_ALLOC | SEC_LOAD | SEC_RELOC), /* section flags */ - 0, /* leading underscore */ - ' ', /* ar_pad_char */ - 16, /* ar_max_namelen */ - bfd_getb64, bfd_getb_signed_64, bfd_putb64, - bfd_getb32, bfd_getb_signed_32, bfd_putb32, - bfd_getb16, bfd_getb_signed_16, bfd_putb16, /* data */ - bfd_getb64, bfd_getb_signed_64, bfd_putb64, - bfd_getb32, bfd_getb_signed_32, bfd_putb32, - bfd_getb16, bfd_getb_signed_16, bfd_putb16, /* hdrs */ - - {_bfd_dummy_target, - oasys_object_p, /* bfd_check_format */ - oasys_archive_p, - _bfd_dummy_target, - }, - { /* bfd_set_format */ - bfd_false, - oasys_mkobject, - _bfd_generic_mkarchive, - bfd_false - }, - { /* bfd_write_contents */ - bfd_false, - oasys_write_object_contents, - _bfd_write_archive_contents, - bfd_false, - }, - - BFD_JUMP_TABLE_GENERIC (oasys), - BFD_JUMP_TABLE_COPY (_bfd_generic), - BFD_JUMP_TABLE_CORE (_bfd_nocore), - BFD_JUMP_TABLE_ARCHIVE (oasys), - BFD_JUMP_TABLE_SYMBOLS (oasys), - BFD_JUMP_TABLE_RELOCS (oasys), - BFD_JUMP_TABLE_WRITE (oasys), - BFD_JUMP_TABLE_LINK (oasys), - BFD_JUMP_TABLE_DYNAMIC (_bfd_nodynamic), - - (PTR) 0 -}; diff --git a/contrib/gdb/bfd/opncls.c b/contrib/gdb/bfd/opncls.c deleted file mode 100644 index 54528dbf48f63..0000000000000 --- a/contrib/gdb/bfd/opncls.c +++ /dev/null @@ -1,604 +0,0 @@ -/* opncls.c -- open and close a BFD. - Copyright (C) 1990 91, 92, 93, 94, 95, 1996 Free Software Foundation, Inc. - Written by Cygnus Support. - -This file is part of BFD, the Binary File Descriptor library. - -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 2 of the License, 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ - -#include "bfd.h" -#include "sysdep.h" -#include "libbfd.h" -#include "obstack.h" - -#ifndef S_IXUSR -#define S_IXUSR 0100 /* Execute by owner. */ -#endif -#ifndef S_IXGRP -#define S_IXGRP 0010 /* Execute by group. */ -#endif -#ifndef S_IXOTH -#define S_IXOTH 0001 /* Execute by others. */ -#endif - -/* fdopen is a loser -- we should use stdio exclusively. Unfortunately - if we do that we can't use fcntl. */ - - -#define obstack_chunk_alloc malloc -#define obstack_chunk_free free - -#ifndef HAVE_GETPAGESIZE -#define getpagesize() 2048 -#endif - -long _bfd_chunksize = -1; - -/* Return a new BFD. All BFD's are allocated through this routine. */ - -bfd * -_bfd_new_bfd () -{ - bfd *nbfd; - - nbfd = (bfd *)bfd_zmalloc (sizeof (bfd)); - if (!nbfd) - return 0; - - if (_bfd_chunksize <= 0) - { - _bfd_chunksize = getpagesize (); - if (_bfd_chunksize <= 0) - _bfd_chunksize = 2048; - /* Leave some slush space, since many malloc implementations - prepend a header, and may wind up wasting another page - because of it. */ - _bfd_chunksize -= 32; - } - - if (!obstack_begin(&nbfd->memory, _bfd_chunksize)) - { - bfd_set_error (bfd_error_no_memory); - return 0; - } - - nbfd->arch_info = &bfd_default_arch_struct; - - nbfd->direction = no_direction; - nbfd->iostream = NULL; - nbfd->where = 0; - nbfd->sections = (asection *)NULL; - nbfd->format = bfd_unknown; - nbfd->my_archive = (bfd *)NULL; - nbfd->origin = 0; - nbfd->opened_once = false; - nbfd->output_has_begun = false; - nbfd->section_count = 0; - nbfd->usrdata = (PTR)NULL; - nbfd->cacheable = false; - nbfd->flags = NO_FLAGS; - nbfd->mtime_set = false; - - return nbfd; -} - -/* Allocate a new BFD as a member of archive OBFD. */ - -bfd * -_bfd_new_bfd_contained_in (obfd) - bfd *obfd; -{ - bfd *nbfd; - - nbfd = _bfd_new_bfd(); - nbfd->xvec = obfd->xvec; - nbfd->my_archive = obfd; - nbfd->direction = read_direction; - nbfd->target_defaulted = obfd->target_defaulted; - return nbfd; -} - -/* -SECTION - Opening and closing BFDs - -*/ - -/* -FUNCTION - bfd_openr - -SYNOPSIS - bfd *bfd_openr(CONST char *filename, CONST char *target); - -DESCRIPTION - Open the file @var{filename} (using <<fopen>>) with the target - @var{target}. Return a pointer to the created BFD. - - Calls <<bfd_find_target>>, so @var{target} is interpreted as by - that function. - - If <<NULL>> is returned then an error has occured. Possible errors - are <<bfd_error_no_memory>>, <<bfd_error_invalid_target>> or <<system_call>> error. -*/ - -bfd * -bfd_openr (filename, target) - CONST char *filename; - CONST char *target; -{ - bfd *nbfd; - const bfd_target *target_vec; - - nbfd = _bfd_new_bfd(); - if (nbfd == NULL) - return NULL; - - target_vec = bfd_find_target (target, nbfd); - if (target_vec == NULL) { - bfd_set_error (bfd_error_invalid_target); - return NULL; - } - - nbfd->filename = filename; - nbfd->direction = read_direction; - - if (bfd_open_file (nbfd) == NULL) { - bfd_set_error (bfd_error_system_call); /* File didn't exist, or some such */ - bfd_release(nbfd,0); - return NULL; - } - return nbfd; -} - - -/* Don't try to `optimize' this function: - - o - We lock using stack space so that interrupting the locking - won't cause a storage leak. - o - We open the file stream last, since we don't want to have to - close it if anything goes wrong. Closing the stream means closing - the file descriptor too, even though we didn't open it. - */ -/* -FUNCTION - bfd_fdopenr - -SYNOPSIS - bfd *bfd_fdopenr(CONST char *filename, CONST char *target, int fd); - -DESCRIPTION - <<bfd_fdopenr>> is to <<bfd_fopenr>> much like <<fdopen>> is to <<fopen>>. - It opens a BFD on a file already described by the @var{fd} - supplied. - - When the file is later <<bfd_close>>d, the file descriptor will be closed. - - If the caller desires that this file descriptor be cached by BFD - (opened as needed, closed as needed to free descriptors for - other opens), with the supplied @var{fd} used as an initial - file descriptor (but subject to closure at any time), call - bfd_set_cacheable(bfd, 1) on the returned BFD. The default is to - assume no cacheing; the file descriptor will remain open until - <<bfd_close>>, and will not be affected by BFD operations on other - files. - - Possible errors are <<bfd_error_no_memory>>, <<bfd_error_invalid_target>> and <<bfd_error_system_call>>. -*/ - -bfd * -bfd_fdopenr (filename, target, fd) - CONST char *filename; - CONST char *target; - int fd; -{ - bfd *nbfd; - const bfd_target *target_vec; - int fdflags; - - bfd_set_error (bfd_error_system_call); -#if ! defined(HAVE_FCNTL) || ! defined(F_GETFL) - fdflags = O_RDWR; /* Assume full access */ -#else - fdflags = fcntl (fd, F_GETFL, NULL); -#endif - if (fdflags == -1) return NULL; - - nbfd = _bfd_new_bfd(); - - if (nbfd == NULL) - return NULL; - - target_vec = bfd_find_target (target, nbfd); - if (target_vec == NULL) { - bfd_set_error (bfd_error_invalid_target); - return NULL; - } -#if defined(VMS) || defined(__GO32__) || defined (WINGDB) - nbfd->iostream = (PTR)fopen(filename, FOPEN_RB); -#else - /* (O_ACCMODE) parens are to avoid Ultrix header file bug */ - switch (fdflags & (O_ACCMODE)) { - case O_RDONLY: nbfd->iostream = (PTR) fdopen (fd, FOPEN_RB); break; - case O_WRONLY: nbfd->iostream = (PTR) fdopen (fd, FOPEN_RUB); break; - case O_RDWR: nbfd->iostream = (PTR) fdopen (fd, FOPEN_RUB); break; - default: abort (); - } -#endif - if (nbfd->iostream == NULL) { - (void) obstack_free (&nbfd->memory, (PTR)0); - return NULL; - } - - /* OK, put everything where it belongs */ - - nbfd->filename = filename; - - /* As a special case we allow a FD open for read/write to - be written through, although doing so requires that we end - the previous clause with a preposition. */ - /* (O_ACCMODE) parens are to avoid Ultrix header file bug */ - switch (fdflags & (O_ACCMODE)) { - case O_RDONLY: nbfd->direction = read_direction; break; - case O_WRONLY: nbfd->direction = write_direction; break; - case O_RDWR: nbfd->direction = both_direction; break; - default: abort (); - } - - if (! bfd_cache_init (nbfd)) - return NULL; - - return nbfd; -} - -/* -FUNCTION - bfd_openstreamr - -SYNOPSIS - bfd *bfd_openstreamr(); - -DESCRIPTION - - Open a BFD for read access on an existing stdio stream. When - the BFD is passed to <<bfd_close>>, the stream will be closed. -*/ - -bfd * -bfd_openstreamr (filename, target, stream) - const char *filename; - const char *target; - FILE *stream; -{ - bfd *nbfd; - const bfd_target *target_vec; - - nbfd = _bfd_new_bfd (); - if (nbfd == NULL) - return NULL; - - target_vec = bfd_find_target (target, nbfd); - if (target_vec == NULL) - { - bfd_set_error (bfd_error_invalid_target); - return NULL; - } - - nbfd->iostream = (PTR) stream; - nbfd->filename = filename; - nbfd->direction = read_direction; - - if (! bfd_cache_init (nbfd)) - return NULL; - - return nbfd; -} - -/** bfd_openw -- open for writing. - Returns a pointer to a freshly-allocated BFD on success, or NULL. - - See comment by bfd_fdopenr before you try to modify this function. */ - -/* -FUNCTION - bfd_openw - -SYNOPSIS - bfd *bfd_openw(CONST char *filename, CONST char *target); - -DESCRIPTION - Create a BFD, associated with file @var{filename}, using the - file format @var{target}, and return a pointer to it. - - Possible errors are <<bfd_error_system_call>>, <<bfd_error_no_memory>>, - <<bfd_error_invalid_target>>. -*/ - -bfd * -bfd_openw (filename, target) - CONST char *filename; - CONST char *target; -{ - bfd *nbfd; - const bfd_target *target_vec; - - bfd_set_error (bfd_error_system_call); - - /* nbfd has to point to head of malloc'ed block so that bfd_close may - reclaim it correctly. */ - - nbfd = _bfd_new_bfd(); - if (nbfd == NULL) - return NULL; - - target_vec = bfd_find_target (target, nbfd); - if (target_vec == NULL) return NULL; - - nbfd->filename = filename; - nbfd->direction = write_direction; - - if (bfd_open_file (nbfd) == NULL) { - bfd_set_error (bfd_error_system_call); /* File not writeable, etc */ - (void) obstack_free (&nbfd->memory, (PTR)0); - return NULL; - } - return nbfd; -} - -/* - -FUNCTION - bfd_close - -SYNOPSIS - boolean bfd_close(bfd *abfd); - -DESCRIPTION - - Close a BFD. If the BFD was open for writing, - then pending operations are completed and the file written out - and closed. If the created file is executable, then - <<chmod>> is called to mark it as such. - - All memory attached to the BFD's obstacks is released. - - The file descriptor associated with the BFD is closed (even - if it was passed in to BFD by <<bfd_fdopenr>>). - -RETURNS - <<true>> is returned if all is ok, otherwise <<false>>. -*/ - - -boolean -bfd_close (abfd) - bfd *abfd; -{ - boolean ret; - - if (!bfd_read_p (abfd)) - { - if (! BFD_SEND_FMT (abfd, _bfd_write_contents, (abfd))) - return false; - } - - if (! BFD_SEND (abfd, _close_and_cleanup, (abfd))) - return false; - - ret = bfd_cache_close (abfd); - - /* If the file was open for writing and is now executable, - make it so */ - if (ret - && abfd->direction == write_direction - && abfd->flags & EXEC_P) - { - struct stat buf; - - if (stat (abfd->filename, &buf) == 0) - { - int mask = umask (0); - umask (mask); - chmod (abfd->filename, - (0777 - & (buf.st_mode | ((S_IXUSR | S_IXGRP | S_IXOTH) &~ mask)))); - } - } - - (void) obstack_free (&abfd->memory, (PTR)0); - (void) free (abfd); - - return ret; -} - -/* -FUNCTION - bfd_close_all_done - -SYNOPSIS - boolean bfd_close_all_done(bfd *); - -DESCRIPTION - Close a BFD. Differs from <<bfd_close>> - since it does not complete any pending operations. This - routine would be used if the application had just used BFD for - swapping and didn't want to use any of the writing code. - - If the created file is executable, then <<chmod>> is called - to mark it as such. - - All memory attached to the BFD's obstacks is released. - -RETURNS - <<true>> is returned if all is ok, otherwise <<false>>. - -*/ - -boolean -bfd_close_all_done (abfd) - bfd *abfd; -{ - boolean ret; - - ret = bfd_cache_close (abfd); - - /* If the file was open for writing and is now executable, - make it so */ - if (ret - && abfd->direction == write_direction - && abfd->flags & EXEC_P) - { - struct stat buf; - - if (stat (abfd->filename, &buf) == 0) - { - int mask = umask (0); - umask (mask); - chmod (abfd->filename, - (0x777 - & (buf.st_mode | ((S_IXUSR | S_IXGRP | S_IXOTH) &~ mask)))); - } - } - (void) obstack_free (&abfd->memory, (PTR)0); - (void) free(abfd); - return ret; -} - - -/* -FUNCTION - bfd_alloc_size - -SYNOPSIS - bfd_size_type bfd_alloc_size(bfd *abfd); - -DESCRIPTION - Return the number of bytes in the obstacks connected to @var{abfd}. - -*/ - -bfd_size_type -bfd_alloc_size (abfd) - bfd *abfd; -{ - struct _obstack_chunk *chunk = abfd->memory.chunk; - size_t size = 0; - while (chunk) { - size += chunk->limit - &(chunk->contents[0]); - chunk = chunk->prev; - } - return size; -} - - - -/* -FUNCTION - bfd_create - -SYNOPSIS - bfd *bfd_create(CONST char *filename, bfd *templ); - -DESCRIPTION - Create a new BFD in the manner of - <<bfd_openw>>, but without opening a file. The new BFD - takes the target from the target used by @var{template}. The - format is always set to <<bfd_object>>. - -*/ - -bfd * -bfd_create (filename, templ) - CONST char *filename; - bfd *templ; -{ - bfd *nbfd = _bfd_new_bfd(); - if (nbfd == (bfd *)NULL) - return (bfd *)NULL; - nbfd->filename = filename; - if(templ) { - nbfd->xvec = templ->xvec; - } - nbfd->direction = no_direction; - bfd_set_format(nbfd, bfd_object); - return nbfd; -} - -/* -INTERNAL_FUNCTION - bfd_alloc_by_size_t - -SYNOPSIS - PTR bfd_alloc_by_size_t(bfd *abfd, size_t wanted); - -DESCRIPTION - Allocate a block of @var{wanted} bytes of memory in the obstack - attatched to <<abfd>> and return a pointer to it. -*/ - - -PTR -bfd_alloc_by_size_t (abfd, size) - bfd *abfd; - size_t size; -{ - PTR ret; - - ret = obstack_alloc (&(abfd->memory), size); - if (ret == NULL) - bfd_set_error (bfd_error_no_memory); - return ret; -} - -void -bfd_alloc_grow (abfd, ptr, size) - bfd *abfd; - PTR ptr; - size_t size; -{ - (void) obstack_grow(&(abfd->memory), ptr, size); -} - -PTR -bfd_alloc_finish (abfd) - bfd *abfd; -{ - PTR ret; - - ret = obstack_finish (&(abfd->memory)); - if (ret == NULL) - bfd_set_error (bfd_error_no_memory); - return ret; -} - -PTR -bfd_alloc (abfd, size) - bfd *abfd; - size_t size; -{ - return bfd_alloc_by_size_t(abfd, (size_t)size); -} - -PTR -bfd_zalloc (abfd, size) - bfd *abfd; - size_t size; -{ - PTR res; - res = bfd_alloc(abfd, size); - if (res) - memset(res, 0, (size_t)size); - return res; -} diff --git a/contrib/gdb/bfd/osf-core.c b/contrib/gdb/bfd/osf-core.c deleted file mode 100644 index 6d1df9b37094b..0000000000000 --- a/contrib/gdb/bfd/osf-core.c +++ /dev/null @@ -1,256 +0,0 @@ -/* BFD back-end for OSF/1 core files. - Copyright 1993, 1994 Free Software Foundation, Inc. - -This file is part of BFD, the Binary File Descriptor library. - -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 2 of the License, 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ - -/* This file can only be compiled on systems which use OSF/1 style - core files. */ - -#include "bfd.h" -#include "sysdep.h" -#include "libbfd.h" - -#include <stdio.h> -#include <string.h> -#include <sys/user.h> -#include <sys/core.h> - -/* forward declarations */ - -static asection * -make_bfd_asection PARAMS ((bfd *, CONST char *, flagword, bfd_size_type, - bfd_vma, file_ptr)); -static asymbol * -osf_core_make_empty_symbol PARAMS ((bfd *)); -static const bfd_target * -osf_core_core_file_p PARAMS ((bfd *)); -static char * -osf_core_core_file_failing_command PARAMS ((bfd *)); -static int -osf_core_core_file_failing_signal PARAMS ((bfd *)); -static boolean -osf_core_core_file_matches_executable_p PARAMS ((bfd *, bfd *)); -static void -swap_abort PARAMS ((void)); - -/* These are stored in the bfd's tdata */ - -struct osf_core_struct -{ - int sig; - char cmd[MAXCOMLEN + 1]; -}; - -#define core_hdr(bfd) ((bfd)->tdata.osf_core_data) -#define core_signal(bfd) (core_hdr(bfd)->sig) -#define core_command(bfd) (core_hdr(bfd)->cmd) - -static asection * -make_bfd_asection (abfd, name, flags, _raw_size, vma, filepos) - bfd *abfd; - CONST char *name; - flagword flags; - bfd_size_type _raw_size; - bfd_vma vma; - file_ptr filepos; -{ - asection *asect; - - asect = bfd_make_section_anyway (abfd, name); - if (!asect) - return NULL; - - asect->flags = flags; - asect->_raw_size = _raw_size; - asect->vma = vma; - asect->filepos = filepos; - asect->alignment_power = 8; - - return asect; -} - -static asymbol * -osf_core_make_empty_symbol (abfd) - bfd *abfd; -{ - asymbol *new = (asymbol *) bfd_zalloc (abfd, sizeof (asymbol)); - if (new) - new->the_bfd = abfd; - return new; -} - -static const bfd_target * -osf_core_core_file_p (abfd) - bfd *abfd; -{ - int val; - int i; - char *secname; - struct core_filehdr core_header; - - val = bfd_read ((PTR)&core_header, 1, sizeof core_header, abfd); - if (val != sizeof core_header) - return NULL; - - if (strncmp (core_header.magic, "Core", 4) != 0) - return NULL; - - core_hdr (abfd) = (struct osf_core_struct *) - bfd_zalloc (abfd, sizeof (struct osf_core_struct)); - if (!core_hdr (abfd)) - return NULL; - - strncpy (core_command (abfd), core_header.name, MAXCOMLEN + 1); - core_signal (abfd) = core_header.signo; - - for (i = 0; i < core_header.nscns; i++) - { - struct core_scnhdr core_scnhdr; - flagword flags; - - val = bfd_read ((PTR)&core_scnhdr, 1, sizeof core_scnhdr, abfd); - if (val != sizeof core_scnhdr) - break; - - /* Skip empty sections. */ - if (core_scnhdr.size == 0 || core_scnhdr.scnptr == 0) - continue; - - switch (core_scnhdr.scntype) - { - case SCNRGN: - secname = ".data"; - flags = SEC_ALLOC + SEC_LOAD + SEC_HAS_CONTENTS; - break; - case SCNSTACK: - secname = ".stack"; - flags = SEC_ALLOC + SEC_LOAD + SEC_HAS_CONTENTS; - break; - case SCNREGS: - secname = ".reg"; - flags = SEC_HAS_CONTENTS; - break; - default: - (*_bfd_error_handler) ("Unhandled OSF/1 core file section type %d\n", - core_scnhdr.scntype); - continue; - } - - if (!make_bfd_asection (abfd, secname, flags, - (bfd_size_type) core_scnhdr.size, - (bfd_vma) core_scnhdr.vaddr, - (file_ptr) core_scnhdr.scnptr)) - return NULL; - } - - /* OK, we believe you. You're a core file (sure, sure). */ - - return abfd->xvec; -} - -static char * -osf_core_core_file_failing_command (abfd) - bfd *abfd; -{ - return core_command (abfd); -} - -/* ARGSUSED */ -static int -osf_core_core_file_failing_signal (abfd) - bfd *abfd; -{ - return core_signal (abfd); -} - -/* ARGSUSED */ -static boolean -osf_core_core_file_matches_executable_p (core_bfd, exec_bfd) - bfd *core_bfd, *exec_bfd; -{ - return true; /* FIXME, We have no way of telling at this point */ -} - -#define osf_core_get_symtab_upper_bound _bfd_nosymbols_get_symtab_upper_bound -#define osf_core_get_symtab _bfd_nosymbols_get_symtab -#define osf_core_print_symbol _bfd_nosymbols_print_symbol -#define osf_core_get_symbol_info _bfd_nosymbols_get_symbol_info -#define osf_core_bfd_is_local_label _bfd_nosymbols_bfd_is_local_label -#define osf_core_get_lineno _bfd_nosymbols_get_lineno -#define osf_core_find_nearest_line _bfd_nosymbols_find_nearest_line -#define osf_core_bfd_make_debug_symbol _bfd_nosymbols_bfd_make_debug_symbol -#define osf_core_read_minisymbols _bfd_nosymbols_read_minisymbols -#define osf_core_minisymbol_to_symbol _bfd_nosymbols_minisymbol_to_symbol - -/* If somebody calls any byte-swapping routines, shoot them. */ -static void -swap_abort() -{ - abort(); /* This way doesn't require any declaration for ANSI to fuck up */ -} -#define NO_GET ((bfd_vma (*) PARAMS (( const bfd_byte *))) swap_abort ) -#define NO_PUT ((void (*) PARAMS ((bfd_vma, bfd_byte *))) swap_abort ) -#define NO_SIGNED_GET \ - ((bfd_signed_vma (*) PARAMS ((const bfd_byte *))) swap_abort ) - -const bfd_target osf_core_vec = - { - "osf-core", - bfd_target_unknown_flavour, - BFD_ENDIAN_BIG, /* target byte order */ - BFD_ENDIAN_BIG, /* target headers byte order */ - (HAS_RELOC | EXEC_P | /* object flags */ - HAS_LINENO | HAS_DEBUG | - HAS_SYMS | HAS_LOCALS | WP_TEXT | D_PAGED), - (SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD | SEC_RELOC), /* section flags */ - 0, /* symbol prefix */ - ' ', /* ar_pad_char */ - 16, /* ar_max_namelen */ - NO_GET, NO_SIGNED_GET, NO_PUT, /* 64 bit data */ - NO_GET, NO_SIGNED_GET, NO_PUT, /* 32 bit data */ - NO_GET, NO_SIGNED_GET, NO_PUT, /* 16 bit data */ - NO_GET, NO_SIGNED_GET, NO_PUT, /* 64 bit hdrs */ - NO_GET, NO_SIGNED_GET, NO_PUT, /* 32 bit hdrs */ - NO_GET, NO_SIGNED_GET, NO_PUT, /* 16 bit hdrs */ - - { /* bfd_check_format */ - _bfd_dummy_target, /* unknown format */ - _bfd_dummy_target, /* object file */ - _bfd_dummy_target, /* archive */ - osf_core_core_file_p /* a core file */ - }, - { /* bfd_set_format */ - bfd_false, bfd_false, - bfd_false, bfd_false - }, - { /* bfd_write_contents */ - bfd_false, bfd_false, - bfd_false, bfd_false - }, - - BFD_JUMP_TABLE_GENERIC (_bfd_generic), - BFD_JUMP_TABLE_COPY (_bfd_generic), - BFD_JUMP_TABLE_CORE (osf_core), - BFD_JUMP_TABLE_ARCHIVE (_bfd_noarchive), - BFD_JUMP_TABLE_SYMBOLS (osf_core), - BFD_JUMP_TABLE_RELOCS (_bfd_norelocs), - BFD_JUMP_TABLE_WRITE (_bfd_generic), - BFD_JUMP_TABLE_LINK (_bfd_nolink), - BFD_JUMP_TABLE_DYNAMIC (_bfd_nodynamic), - - (PTR) 0 /* backend_data */ -}; diff --git a/contrib/gdb/bfd/pc532-mach.c b/contrib/gdb/bfd/pc532-mach.c deleted file mode 100644 index 73f4ac49e8272..0000000000000 --- a/contrib/gdb/bfd/pc532-mach.c +++ /dev/null @@ -1,121 +0,0 @@ -/* BFD back-end for Mach3/532 a.out-ish binaries. - Copyright (C) 1990, 1991, 1992, 1994 Free Software Foundation, Inc. - -This file is part of BFD, the Binary File Descriptor library. - -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 2 of the License, 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ - -/* Written by Ian Dall - * 19-Apr-94 - * - * Formerly part of aout-pc532-mach.c. Split out to allow more - * flexibility with multiple formats. - * - */ -/* This architecture has N_TXTOFF and N_TXTADDR defined as if - * N_HEADER_IN_TEXT, but the a_text entry (text size) does not include the - * space for the header. So we have N_HEADER_IN_TEXT defined to - * 1 and specially define our own N_TXTSIZE - */ - -#define N_HEADER_IN_TEXT(x) 1 -#define N_TXTSIZE(x) ((x).a_text) - - -#define TEXT_START_ADDR 0x10000 /* from old ld */ -#define TARGET_PAGE_SIZE 0x1000 /* from old ld, 032 & 532 are really 512/4k */ - -/* Use a_entry of 0 to distinguish object files from OMAGIC executables */ -#define N_TXTADDR(x) \ - (N_MAGIC(x) == OMAGIC ? \ - ((x).a_entry < TEXT_START_ADDR? 0: TEXT_START_ADDR): \ - (N_MAGIC(x) == NMAGIC? TEXT_START_ADDR: \ - TEXT_START_ADDR + EXEC_BYTES_SIZE)) - -#define SEGMENT_SIZE TARGET_PAGE_SIZE - -#define N_SHARED_LIB(x) 0 -#define SEGMENT_SIZE TARGET_PAGE_SIZE -#define DEFAULT_ARCH bfd_arch_ns32k - -#define MY(OP) CAT(pc532machaout_,OP) - -/* Must be the same as aout-ns32k.c */ -#define NAME(x,y) CAT3(ns32kaout,_32_,y) - -#define TARGETNAME "a.out-pc532-mach" - -#include "bfd.h" -#include "sysdep.h" -#include "libaout.h" -#include "libbfd.h" -#include "aout/aout64.h" - -/* We can`t use the MYNS macro here for cpp reasons too subtle for me -- IWD */ - -#define MY_bfd_reloc_type_lookup ns32kaout_bfd_reloc_type_lookup - -/* libaout doesn't use NAME for these ... */ - -#define MY_get_section_contents aout_32_get_section_contents - -#define MY_text_includes_header 1 - -#define MY_exec_header_not_counted 1 - -#define MYNSX(OP) CAT(ns32kaout_,OP) -reloc_howto_type * -MYNSX(bfd_reloc_type_lookup) - PARAMS((bfd *abfd AND - bfd_reloc_code_real_type code)); - -boolean -MYNSX(write_object_contents) - PARAMS((bfd *abfd)); - -static boolean -MY(write_object_contents) (abfd) -bfd *abfd; -{ - struct external_exec exec_bytes; - struct internal_exec *execp = exec_hdr (abfd); - -#if CHOOSE_RELOC_SIZE - CHOOSE_RELOC_SIZE(abfd); -#else - obj_reloc_entry_size (abfd) = RELOC_STD_SIZE; -#endif - - BFD_ASSERT (bfd_get_arch (abfd) == bfd_arch_ns32k); - switch (bfd_get_mach (abfd)) - { - case 32032: - N_SET_MACHTYPE (*execp, M_NS32032); - break; - case 32532: - default: - N_SET_MACHTYPE (*execp, M_NS32532); - break; - } - N_SET_FLAGS (*execp, aout_backend_info (abfd)->exec_hdr_flags); - - WRITE_HEADERS(abfd, execp); - - return true; -} - -#define MY_write_object_contents MY(write_object_contents) - -#include "aout-target.h" diff --git a/contrib/gdb/bfd/pe-arm.c b/contrib/gdb/bfd/pe-arm.c deleted file mode 100644 index fa97e2e8413d0..0000000000000 --- a/contrib/gdb/bfd/pe-arm.c +++ /dev/null @@ -1,32 +0,0 @@ -/* BFD back-end for ARM PECOFF files. - Copyright 1995 Free Software Foundation, Inc. - -This file is part of BFD, the Binary File Descriptor library. - -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 2 of the License, 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ - -#include "bfd.h" -#include "sysdep.h" - -#define TARGET_LITTLE_SYM armpe_little_vec -#define TARGET_LITTLE_NAME "pe-arm-little" -#define TARGET_BIG_SYM armpe_big_vec -#define TARGET_BIG_NAME "pe-arm-big" - -#define COFF_OBJ_WITH_PE -#define COFF_WITH_PE -#define PCRELOFFSET true - -#include "coff-arm.c" diff --git a/contrib/gdb/bfd/pe-i386.c b/contrib/gdb/bfd/pe-i386.c deleted file mode 100644 index 878993e510ccb..0000000000000 --- a/contrib/gdb/bfd/pe-i386.c +++ /dev/null @@ -1,30 +0,0 @@ -/* BFD back-end for Intel 386 PECOFF files. - Copyright 1995 Free Software Foundation, Inc. - -This file is part of BFD, the Binary File Descriptor library. - -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 2 of the License, 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ - -#include "bfd.h" -#include "sysdep.h" - - -#define TARGET_SYM i386pe_vec -#define TARGET_NAME "pe-i386" -#define COFF_OBJ_WITH_PE -#define COFF_WITH_PE -#define PCRELOFFSET true -#define TARGET_UNDERSCORE '_' -#include "coff-i386.c" diff --git a/contrib/gdb/bfd/pe-ppc.c b/contrib/gdb/bfd/pe-ppc.c deleted file mode 100644 index 67fdda04e6c87..0000000000000 --- a/contrib/gdb/bfd/pe-ppc.c +++ /dev/null @@ -1,39 +0,0 @@ -/* BFD back-end for Intel 386 PECOFF files. - Copyright 1995 Free Software Foundation, Inc. - -This file is part of BFD, the Binary File Descriptor library. - -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 2 of the License, 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. */ - -#include "bfd.h" -#include "sysdep.h" - - -#define E_FILENMLEN 18 - -#define PPC - -#define TARGET_LITTLE_SYM bfd_powerpcle_pe_vec -#define TARGET_LITTLE_NAME "pe-powerpcle" - -#define TARGET_BIG_SYM bfd_powerpc_pe_vec -#define TARGET_BIG_NAME "pe-powerpc" - -#define COFF_OBJ_WITH_PE -#define COFF_WITH_PE - -/* FIXME: verify PCRELOFFSET is always false */ - -#include "coff-ppc.c" diff --git a/contrib/gdb/bfd/pei-arm.c b/contrib/gdb/bfd/pei-arm.c deleted file mode 100644 index fd9d398432d08..0000000000000 --- a/contrib/gdb/bfd/pei-arm.c +++ /dev/null @@ -1,33 +0,0 @@ -/* BFD back-end for arm PE IMAGE COFF files. - Copyright 1995 Free Software Foundation, Inc. - -This file is part of BFD, the Binary File Descriptor library. - -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 2 of the License, 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ - -#include "bfd.h" -#include "sysdep.h" - -#define TARGET_LITTLE_SYM armpei_little_vec -#define TARGET_LITTLE_NAME "pei-arm-little" -#define TARGET_BIG_SYM armpei_big_vec -#define TARGET_BIG_NAME "pei-arm-big" - -#define IMAGE_BASE NT_IMAGE_BASE -#define COFF_IMAGE_WITH_PE -#define COFF_WITH_PE -#define PCRELOFFSET true - -#include "coff-arm.c" diff --git a/contrib/gdb/bfd/pei-i386.c b/contrib/gdb/bfd/pei-i386.c deleted file mode 100644 index 8754e7c55e36b..0000000000000 --- a/contrib/gdb/bfd/pei-i386.c +++ /dev/null @@ -1,33 +0,0 @@ -/* BFD back-end for Intel 386 PE IMAGE COFF files. - Copyright 1995 Free Software Foundation, Inc. - -This file is part of BFD, the Binary File Descriptor library. - -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 2 of the License, 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ - -#include "bfd.h" -#include "sysdep.h" - -#define TARGET_SYM i386pei_vec -#define TARGET_NAME "pei-i386" -#define IMAGE_BASE NT_IMAGE_BASE -#define COFF_IMAGE_WITH_PE -#define COFF_WITH_PE -#define PCRELOFFSET true -#define TARGET_UNDERSCORE '_' -#include "coff-i386.c" - - - diff --git a/contrib/gdb/bfd/pei-ppc.c b/contrib/gdb/bfd/pei-ppc.c deleted file mode 100644 index fc8f89fddb6de..0000000000000 --- a/contrib/gdb/bfd/pei-ppc.c +++ /dev/null @@ -1,44 +0,0 @@ -/* BFD back-end for Intel 386 PE IMAGE COFF files. - Copyright 1995 Free Software Foundation, Inc. - -This file is part of BFD, the Binary File Descriptor library. - -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 2 of the License, 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. */ - -#include "bfd.h" -#include "sysdep.h" - -/* setting up for a PE environment stolen directly from the i386 structure */ -#define E_FILNMLEN 18 /* # characters in a file name */ - -#define PPC - -#define TARGET_LITTLE_SYM bfd_powerpcle_pei_vec -#define TARGET_LITTLE_NAME "pei-powerpcle" - -#define TARGET_BIG_SYM bfd_powerpc_pei_vec -#define TARGET_BIG_NAME "pei-powerpc" - -#define IMAGE_BASE NT_IMAGE_BASE - -#define COFF_IMAGE_WITH_PE -#define COFF_WITH_PE - -/* FIXME: Verify PCRELOFFSET is always false */ - -#include "coff-ppc.c" - - - diff --git a/contrib/gdb/bfd/peicode.h b/contrib/gdb/bfd/peicode.h deleted file mode 100644 index a7a47469e3d09..0000000000000 --- a/contrib/gdb/bfd/peicode.h +++ /dev/null @@ -1,1861 +0,0 @@ -/* Support for the generic parts of most COFF variants, for BFD. - Copyright 1995 Free Software Foundation, Inc. - Written by Cygnus Support. - -This file is part of BFD, the Binary File Descriptor library. - -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 2 of the License, 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ - -/* -Most of this hacked by Steve Chamberlain, - sac@cygnus.com -*/ - - - -#define coff_bfd_print_private_bfd_data pe_print_private_bfd_data -#define coff_mkobject pe_mkobject -#define coff_mkobject_hook pe_mkobject_hook - -#ifndef GET_FCN_LNNOPTR -#define GET_FCN_LNNOPTR(abfd, ext) \ - bfd_h_get_32(abfd, (bfd_byte *) ext->x_sym.x_fcnary.x_fcn.x_lnnoptr) -#endif - -#ifndef GET_FCN_ENDNDX -#define GET_FCN_ENDNDX(abfd, ext) \ - bfd_h_get_32(abfd, (bfd_byte *) ext->x_sym.x_fcnary.x_fcn.x_endndx) -#endif - -#ifndef PUT_FCN_LNNOPTR -#define PUT_FCN_LNNOPTR(abfd, in, ext) bfd_h_put_32(abfd, in, (bfd_byte *) ext->x_sym.x_fcnary.x_fcn.x_lnnoptr) -#endif -#ifndef PUT_FCN_ENDNDX -#define PUT_FCN_ENDNDX(abfd, in, ext) bfd_h_put_32(abfd, in, (bfd_byte *) ext->x_sym.x_fcnary.x_fcn.x_endndx) -#endif -#ifndef GET_LNSZ_LNNO -#define GET_LNSZ_LNNO(abfd, ext) bfd_h_get_16(abfd, (bfd_byte *) ext->x_sym.x_misc.x_lnsz.x_lnno) -#endif -#ifndef GET_LNSZ_SIZE -#define GET_LNSZ_SIZE(abfd, ext) bfd_h_get_16(abfd, (bfd_byte *) ext->x_sym.x_misc.x_lnsz.x_size) -#endif -#ifndef PUT_LNSZ_LNNO -#define PUT_LNSZ_LNNO(abfd, in, ext) bfd_h_put_16(abfd, in, (bfd_byte *)ext->x_sym.x_misc.x_lnsz.x_lnno) -#endif -#ifndef PUT_LNSZ_SIZE -#define PUT_LNSZ_SIZE(abfd, in, ext) bfd_h_put_16(abfd, in, (bfd_byte*) ext->x_sym.x_misc.x_lnsz.x_size) -#endif -#ifndef GET_SCN_SCNLEN -#define GET_SCN_SCNLEN(abfd, ext) bfd_h_get_32(abfd, (bfd_byte *) ext->x_scn.x_scnlen) -#endif -#ifndef GET_SCN_NRELOC -#define GET_SCN_NRELOC(abfd, ext) bfd_h_get_16(abfd, (bfd_byte *)ext->x_scn.x_nreloc) -#endif -#ifndef GET_SCN_NLINNO -#define GET_SCN_NLINNO(abfd, ext) bfd_h_get_16(abfd, (bfd_byte *)ext->x_scn.x_nlinno) -#endif -#ifndef PUT_SCN_SCNLEN -#define PUT_SCN_SCNLEN(abfd,in, ext) bfd_h_put_32(abfd, in, (bfd_byte *) ext->x_scn.x_scnlen) -#endif -#ifndef PUT_SCN_NRELOC -#define PUT_SCN_NRELOC(abfd,in, ext) bfd_h_put_16(abfd, in, (bfd_byte *)ext->x_scn.x_nreloc) -#endif -#ifndef PUT_SCN_NLINNO -#define PUT_SCN_NLINNO(abfd,in, ext) bfd_h_put_16(abfd,in, (bfd_byte *) ext->x_scn.x_nlinno) -#endif -#ifndef GET_LINENO_LNNO -#define GET_LINENO_LNNO(abfd, ext) bfd_h_get_16(abfd, (bfd_byte *) (ext->l_lnno)); -#endif -#ifndef PUT_LINENO_LNNO -#define PUT_LINENO_LNNO(abfd,val, ext) bfd_h_put_16(abfd,val, (bfd_byte *) (ext->l_lnno)); -#endif - -/* The f_symptr field in the filehdr is sometimes 64 bits. */ -#ifndef GET_FILEHDR_SYMPTR -#define GET_FILEHDR_SYMPTR bfd_h_get_32 -#endif -#ifndef PUT_FILEHDR_SYMPTR -#define PUT_FILEHDR_SYMPTR bfd_h_put_32 -#endif - -/* Some fields in the aouthdr are sometimes 64 bits. */ -#ifndef GET_AOUTHDR_TSIZE -#define GET_AOUTHDR_TSIZE bfd_h_get_32 -#endif -#ifndef PUT_AOUTHDR_TSIZE -#define PUT_AOUTHDR_TSIZE bfd_h_put_32 -#endif -#ifndef GET_AOUTHDR_DSIZE -#define GET_AOUTHDR_DSIZE bfd_h_get_32 -#endif -#ifndef PUT_AOUTHDR_DSIZE -#define PUT_AOUTHDR_DSIZE bfd_h_put_32 -#endif -#ifndef GET_AOUTHDR_BSIZE -#define GET_AOUTHDR_BSIZE bfd_h_get_32 -#endif -#ifndef PUT_AOUTHDR_BSIZE -#define PUT_AOUTHDR_BSIZE bfd_h_put_32 -#endif -#ifndef GET_AOUTHDR_ENTRY -#define GET_AOUTHDR_ENTRY bfd_h_get_32 -#endif -#ifndef PUT_AOUTHDR_ENTRY -#define PUT_AOUTHDR_ENTRY bfd_h_put_32 -#endif -#ifndef GET_AOUTHDR_TEXT_START -#define GET_AOUTHDR_TEXT_START bfd_h_get_32 -#endif -#ifndef PUT_AOUTHDR_TEXT_START -#define PUT_AOUTHDR_TEXT_START bfd_h_put_32 -#endif -#ifndef GET_AOUTHDR_DATA_START -#define GET_AOUTHDR_DATA_START bfd_h_get_32 -#endif -#ifndef PUT_AOUTHDR_DATA_START -#define PUT_AOUTHDR_DATA_START bfd_h_put_32 -#endif - -/* Some fields in the scnhdr are sometimes 64 bits. */ -#ifndef GET_SCNHDR_PADDR -#define GET_SCNHDR_PADDR bfd_h_get_32 -#endif -#ifndef PUT_SCNHDR_PADDR -#define PUT_SCNHDR_PADDR bfd_h_put_32 -#endif -#ifndef GET_SCNHDR_VADDR -#define GET_SCNHDR_VADDR bfd_h_get_32 -#endif -#ifndef PUT_SCNHDR_VADDR -#define PUT_SCNHDR_VADDR bfd_h_put_32 -#endif -#ifndef GET_SCNHDR_SIZE -#define GET_SCNHDR_SIZE bfd_h_get_32 -#endif -#ifndef PUT_SCNHDR_SIZE -#define PUT_SCNHDR_SIZE bfd_h_put_32 -#endif -#ifndef GET_SCNHDR_SCNPTR -#define GET_SCNHDR_SCNPTR bfd_h_get_32 -#endif -#ifndef PUT_SCNHDR_SCNPTR -#define PUT_SCNHDR_SCNPTR bfd_h_put_32 -#endif -#ifndef GET_SCNHDR_RELPTR -#define GET_SCNHDR_RELPTR bfd_h_get_32 -#endif -#ifndef PUT_SCNHDR_RELPTR -#define PUT_SCNHDR_RELPTR bfd_h_put_32 -#endif -#ifndef GET_SCNHDR_LNNOPTR -#define GET_SCNHDR_LNNOPTR bfd_h_get_32 -#endif -#ifndef PUT_SCNHDR_LNNOPTR -#define PUT_SCNHDR_LNNOPTR bfd_h_put_32 -#endif - - - -/**********************************************************************/ - -static void -coff_swap_reloc_in (abfd, src, dst) - bfd *abfd; - PTR src; - PTR dst; -{ - RELOC *reloc_src = (RELOC *) src; - struct internal_reloc *reloc_dst = (struct internal_reloc *) dst; - - reloc_dst->r_vaddr = bfd_h_get_32(abfd, (bfd_byte *)reloc_src->r_vaddr); - reloc_dst->r_symndx = bfd_h_get_signed_32(abfd, (bfd_byte *) reloc_src->r_symndx); - - reloc_dst->r_type = bfd_h_get_16(abfd, (bfd_byte *) reloc_src->r_type); - -#ifdef SWAP_IN_RELOC_OFFSET - reloc_dst->r_offset = SWAP_IN_RELOC_OFFSET(abfd, - (bfd_byte *) reloc_src->r_offset); -#endif -} - - -static unsigned int -coff_swap_reloc_out (abfd, src, dst) - bfd *abfd; - PTR src; - PTR dst; -{ - struct internal_reloc *reloc_src = (struct internal_reloc *)src; - struct external_reloc *reloc_dst = (struct external_reloc *)dst; - bfd_h_put_32(abfd, reloc_src->r_vaddr, (bfd_byte *) reloc_dst->r_vaddr); - bfd_h_put_32(abfd, reloc_src->r_symndx, (bfd_byte *) reloc_dst->r_symndx); - - bfd_h_put_16(abfd, reloc_src->r_type, (bfd_byte *) - reloc_dst->r_type); - -#ifdef SWAP_OUT_RELOC_OFFSET - SWAP_OUT_RELOC_OFFSET(abfd, - reloc_src->r_offset, - (bfd_byte *) reloc_dst->r_offset); -#endif -#ifdef SWAP_OUT_RELOC_EXTRA - SWAP_OUT_RELOC_EXTRA(abfd,reloc_src, reloc_dst); -#endif - return sizeof(struct external_reloc); -} - - -static void -coff_swap_filehdr_in (abfd, src, dst) - bfd *abfd; - PTR src; - PTR dst; -{ - FILHDR *filehdr_src = (FILHDR *) src; - struct internal_filehdr *filehdr_dst = (struct internal_filehdr *) dst; - filehdr_dst->f_magic = bfd_h_get_16(abfd, (bfd_byte *) filehdr_src->f_magic); - filehdr_dst->f_nscns = bfd_h_get_16(abfd, (bfd_byte *)filehdr_src-> f_nscns); - filehdr_dst->f_timdat = bfd_h_get_32(abfd, (bfd_byte *)filehdr_src-> f_timdat); - - filehdr_dst->f_nsyms = bfd_h_get_32(abfd, (bfd_byte *)filehdr_src-> f_nsyms); - filehdr_dst->f_flags = bfd_h_get_16(abfd, (bfd_byte *)filehdr_src-> f_flags); - filehdr_dst->f_symptr = bfd_h_get_32 (abfd, (bfd_byte *) filehdr_src->f_symptr); - - /* Other people's tools sometimes generate headers - with an nsyms but a zero symptr. */ - if (filehdr_dst->f_nsyms && filehdr_dst->f_symptr) - { - filehdr_dst->f_flags |= HAS_SYMS; - } - else - { - filehdr_dst->f_symptr = 0; - filehdr_dst->f_nsyms = 0; - filehdr_dst->f_flags &= ~HAS_SYMS; - } - - filehdr_dst->f_opthdr = bfd_h_get_16(abfd, - (bfd_byte *)filehdr_src-> f_opthdr); -} - -#ifdef COFF_IMAGE_WITH_PE - -static unsigned int -coff_swap_filehdr_out (abfd, in, out) - bfd *abfd; - PTR in; - PTR out; -{ - int idx; - struct internal_filehdr *filehdr_in = (struct internal_filehdr *)in; - FILHDR *filehdr_out = (FILHDR *)out; - - if (pe_data (abfd)->has_reloc_section) - filehdr_in->f_flags &= ~F_RELFLG; - - if (pe_data (abfd)->dll) - filehdr_in->f_flags |= F_DLL; - - filehdr_in->pe.e_magic = DOSMAGIC; - filehdr_in->pe.e_cblp = 0x90; - filehdr_in->pe.e_cp = 0x3; - filehdr_in->pe.e_crlc = 0x0; - filehdr_in->pe.e_cparhdr = 0x4; - filehdr_in->pe.e_minalloc = 0x0; - filehdr_in->pe.e_maxalloc = 0xffff; - filehdr_in->pe.e_ss = 0x0; - filehdr_in->pe.e_sp = 0xb8; - filehdr_in->pe.e_csum = 0x0; - filehdr_in->pe.e_ip = 0x0; - filehdr_in->pe.e_cs = 0x0; - filehdr_in->pe.e_lfarlc = 0x40; - filehdr_in->pe.e_ovno = 0x0; - - for (idx=0; idx < 4; idx++) - filehdr_in->pe.e_res[idx] = 0x0; - - filehdr_in->pe.e_oemid = 0x0; - filehdr_in->pe.e_oeminfo = 0x0; - - for (idx=0; idx < 10; idx++) - filehdr_in->pe.e_res2[idx] = 0x0; - - filehdr_in->pe.e_lfanew = 0x80; - - /* this next collection of data are mostly just characters. It appears - to be constant within the headers put on NT exes */ - filehdr_in->pe.dos_message[0] = 0x0eba1f0e; - filehdr_in->pe.dos_message[1] = 0xcd09b400; - filehdr_in->pe.dos_message[2] = 0x4c01b821; - filehdr_in->pe.dos_message[3] = 0x685421cd; - filehdr_in->pe.dos_message[4] = 0x70207369; - filehdr_in->pe.dos_message[5] = 0x72676f72; - filehdr_in->pe.dos_message[6] = 0x63206d61; - filehdr_in->pe.dos_message[7] = 0x6f6e6e61; - filehdr_in->pe.dos_message[8] = 0x65622074; - filehdr_in->pe.dos_message[9] = 0x6e757220; - filehdr_in->pe.dos_message[10] = 0x206e6920; - filehdr_in->pe.dos_message[11] = 0x20534f44; - filehdr_in->pe.dos_message[12] = 0x65646f6d; - filehdr_in->pe.dos_message[13] = 0x0a0d0d2e; - filehdr_in->pe.dos_message[14] = 0x24; - filehdr_in->pe.dos_message[15] = 0x0; - filehdr_in->pe.nt_signature = NT_SIGNATURE; - - - - bfd_h_put_16(abfd, filehdr_in->f_magic, (bfd_byte *) filehdr_out->f_magic); - bfd_h_put_16(abfd, filehdr_in->f_nscns, (bfd_byte *) filehdr_out->f_nscns); - - bfd_h_put_32(abfd, time (0), (bfd_byte *) filehdr_out->f_timdat); - PUT_FILEHDR_SYMPTR (abfd, (bfd_vma) filehdr_in->f_symptr, - (bfd_byte *) filehdr_out->f_symptr); - bfd_h_put_32(abfd, filehdr_in->f_nsyms, (bfd_byte *) filehdr_out->f_nsyms); - bfd_h_put_16(abfd, filehdr_in->f_opthdr, (bfd_byte *) filehdr_out->f_opthdr); - bfd_h_put_16(abfd, filehdr_in->f_flags, (bfd_byte *) filehdr_out->f_flags); - - /* put in extra dos header stuff. This data remains essentially - constant, it just has to be tacked on to the beginning of all exes - for NT */ - bfd_h_put_16(abfd, filehdr_in->pe.e_magic, (bfd_byte *) filehdr_out->e_magic); - bfd_h_put_16(abfd, filehdr_in->pe.e_cblp, (bfd_byte *) filehdr_out->e_cblp); - bfd_h_put_16(abfd, filehdr_in->pe.e_cp, (bfd_byte *) filehdr_out->e_cp); - bfd_h_put_16(abfd, filehdr_in->pe.e_crlc, (bfd_byte *) filehdr_out->e_crlc); - bfd_h_put_16(abfd, filehdr_in->pe.e_cparhdr, - (bfd_byte *) filehdr_out->e_cparhdr); - bfd_h_put_16(abfd, filehdr_in->pe.e_minalloc, - (bfd_byte *) filehdr_out->e_minalloc); - bfd_h_put_16(abfd, filehdr_in->pe.e_maxalloc, - (bfd_byte *) filehdr_out->e_maxalloc); - bfd_h_put_16(abfd, filehdr_in->pe.e_ss, (bfd_byte *) filehdr_out->e_ss); - bfd_h_put_16(abfd, filehdr_in->pe.e_sp, (bfd_byte *) filehdr_out->e_sp); - bfd_h_put_16(abfd, filehdr_in->pe.e_csum, (bfd_byte *) filehdr_out->e_csum); - bfd_h_put_16(abfd, filehdr_in->pe.e_ip, (bfd_byte *) filehdr_out->e_ip); - bfd_h_put_16(abfd, filehdr_in->pe.e_cs, (bfd_byte *) filehdr_out->e_cs); - bfd_h_put_16(abfd, filehdr_in->pe.e_lfarlc, (bfd_byte *) filehdr_out->e_lfarlc); - bfd_h_put_16(abfd, filehdr_in->pe.e_ovno, (bfd_byte *) filehdr_out->e_ovno); - { - int idx; - for (idx=0; idx < 4; idx++) - bfd_h_put_16(abfd, filehdr_in->pe.e_res[idx], - (bfd_byte *) filehdr_out->e_res[idx]); - } - bfd_h_put_16(abfd, filehdr_in->pe.e_oemid, (bfd_byte *) filehdr_out->e_oemid); - bfd_h_put_16(abfd, filehdr_in->pe.e_oeminfo, - (bfd_byte *) filehdr_out->e_oeminfo); - { - int idx; - for (idx=0; idx < 10; idx++) - bfd_h_put_16(abfd, filehdr_in->pe.e_res2[idx], - (bfd_byte *) filehdr_out->e_res2[idx]); - } - bfd_h_put_32(abfd, filehdr_in->pe.e_lfanew, (bfd_byte *) filehdr_out->e_lfanew); - - { - int idx; - for (idx=0; idx < 16; idx++) - bfd_h_put_32(abfd, filehdr_in->pe.dos_message[idx], - (bfd_byte *) filehdr_out->dos_message[idx]); - } - - /* also put in the NT signature */ - bfd_h_put_32(abfd, filehdr_in->pe.nt_signature, - (bfd_byte *) filehdr_out->nt_signature); - - - - - return sizeof(FILHDR); -} -#else - -static unsigned int -coff_swap_filehdr_out (abfd, in, out) - bfd *abfd; - PTR in; - PTR out; -{ - struct internal_filehdr *filehdr_in = (struct internal_filehdr *)in; - FILHDR *filehdr_out = (FILHDR *)out; - - bfd_h_put_16(abfd, filehdr_in->f_magic, (bfd_byte *) filehdr_out->f_magic); - bfd_h_put_16(abfd, filehdr_in->f_nscns, (bfd_byte *) filehdr_out->f_nscns); - bfd_h_put_32(abfd, filehdr_in->f_timdat, (bfd_byte *) filehdr_out->f_timdat); - PUT_FILEHDR_SYMPTR (abfd, (bfd_vma) filehdr_in->f_symptr, - (bfd_byte *) filehdr_out->f_symptr); - bfd_h_put_32(abfd, filehdr_in->f_nsyms, (bfd_byte *) filehdr_out->f_nsyms); - bfd_h_put_16(abfd, filehdr_in->f_opthdr, (bfd_byte *) filehdr_out->f_opthdr); - bfd_h_put_16(abfd, filehdr_in->f_flags, (bfd_byte *) filehdr_out->f_flags); - - return sizeof(FILHDR); -} - -#endif - - -static void -coff_swap_sym_in (abfd, ext1, in1) - bfd *abfd; - PTR ext1; - PTR in1; -{ - SYMENT *ext = (SYMENT *)ext1; - struct internal_syment *in = (struct internal_syment *)in1; - - if( ext->e.e_name[0] == 0) { - in->_n._n_n._n_zeroes = 0; - in->_n._n_n._n_offset = bfd_h_get_32(abfd, (bfd_byte *) ext->e.e.e_offset); - } - else { -#if SYMNMLEN != E_SYMNMLEN - -> Error, we need to cope with truncating or extending SYMNMLEN!; -#else - memcpy(in->_n._n_name, ext->e.e_name, SYMNMLEN); -#endif - } - - in->n_value = bfd_h_get_32(abfd, (bfd_byte *) ext->e_value); - in->n_scnum = bfd_h_get_16(abfd, (bfd_byte *) ext->e_scnum); - if (sizeof(ext->e_type) == 2){ - in->n_type = bfd_h_get_16(abfd, (bfd_byte *) ext->e_type); - } - else { - in->n_type = bfd_h_get_32(abfd, (bfd_byte *) ext->e_type); - } - in->n_sclass = bfd_h_get_8(abfd, ext->e_sclass); - in->n_numaux = bfd_h_get_8(abfd, ext->e_numaux); - - /* The section symbols for the .idata$ sections have class 68, which MS - documentation indicates is a section symbol. The problem is that the - value field in the symbol is simply a copy of the .idata section's flags - rather than something useful. When these symbols are encountered, change - the value to 0 and the section number to 1 so that they will be handled - somewhat correctly in the bfd code. */ - if (in->n_sclass == 0x68) { - in->n_value = 0x0; - in->n_scnum = 1; - /* I have tried setting the class to 3 and using the following to set - the section number. This will put the address of the pointer to the - string kernel32.dll at addresses 0 and 0x10 off start of idata section - which is not correct */ - /* if (strcmp (in->_n._n_name, ".idata$4") == 0) */ - /* in->n_scnum = 3; */ - /* else */ - /* in->n_scnum = 2; */ - } - -#ifdef coff_swap_sym_in_hook - coff_swap_sym_in_hook(abfd, ext1, in1); -#endif -} - -static unsigned int -coff_swap_sym_out (abfd, inp, extp) - bfd *abfd; - PTR inp; - PTR extp; -{ - struct internal_syment *in = (struct internal_syment *)inp; - SYMENT *ext =(SYMENT *)extp; - if(in->_n._n_name[0] == 0) { - bfd_h_put_32(abfd, 0, (bfd_byte *) ext->e.e.e_zeroes); - bfd_h_put_32(abfd, in->_n._n_n._n_offset, (bfd_byte *) ext->e.e.e_offset); - } - else { -#if SYMNMLEN != E_SYMNMLEN - -> Error, we need to cope with truncating or extending SYMNMLEN!; -#else - memcpy(ext->e.e_name, in->_n._n_name, SYMNMLEN); -#endif - } - - bfd_h_put_32(abfd, in->n_value , (bfd_byte *) ext->e_value); - bfd_h_put_16(abfd, in->n_scnum , (bfd_byte *) ext->e_scnum); - if (sizeof(ext->e_type) == 2) - { - bfd_h_put_16(abfd, in->n_type , (bfd_byte *) ext->e_type); - } - else - { - bfd_h_put_32(abfd, in->n_type , (bfd_byte *) ext->e_type); - } - bfd_h_put_8(abfd, in->n_sclass , ext->e_sclass); - bfd_h_put_8(abfd, in->n_numaux , ext->e_numaux); - - return sizeof(SYMENT); -} - -static void -coff_swap_aux_in (abfd, ext1, type, class, indx, numaux, in1) - bfd *abfd; - PTR ext1; - int type; - int class; - int indx; - int numaux; - PTR in1; -{ - AUXENT *ext = (AUXENT *)ext1; - union internal_auxent *in = (union internal_auxent *)in1; - - switch (class) { - case C_FILE: - if (ext->x_file.x_fname[0] == 0) { - in->x_file.x_n.x_zeroes = 0; - in->x_file.x_n.x_offset = - bfd_h_get_32(abfd, (bfd_byte *) ext->x_file.x_n.x_offset); - } else { -#if FILNMLEN != E_FILNMLEN - -> Error, we need to cope with truncating or extending FILNMLEN!; -#else - memcpy (in->x_file.x_fname, ext->x_file.x_fname, FILNMLEN); -#endif - } - return; - - - case C_STAT: -#ifdef C_LEAFSTAT - case C_LEAFSTAT: -#endif - case C_HIDDEN: - if (type == T_NULL) { - in->x_scn.x_scnlen = GET_SCN_SCNLEN(abfd, ext); - in->x_scn.x_nreloc = GET_SCN_NRELOC(abfd, ext); - in->x_scn.x_nlinno = GET_SCN_NLINNO(abfd, ext); - return; - } - break; - } - - in->x_sym.x_tagndx.l = bfd_h_get_32(abfd, (bfd_byte *) ext->x_sym.x_tagndx); -#ifndef NO_TVNDX - in->x_sym.x_tvndx = bfd_h_get_16(abfd, (bfd_byte *) ext->x_sym.x_tvndx); -#endif - - if (class == C_BLOCK || ISFCN (type) || ISTAG (class)) - { - in->x_sym.x_fcnary.x_fcn.x_lnnoptr = GET_FCN_LNNOPTR (abfd, ext); - in->x_sym.x_fcnary.x_fcn.x_endndx.l = GET_FCN_ENDNDX (abfd, ext); - } - else - { -#if DIMNUM != E_DIMNUM - #error we need to cope with truncating or extending DIMNUM -#endif - in->x_sym.x_fcnary.x_ary.x_dimen[0] = - bfd_h_get_16 (abfd, (bfd_byte *) ext->x_sym.x_fcnary.x_ary.x_dimen[0]); - in->x_sym.x_fcnary.x_ary.x_dimen[1] = - bfd_h_get_16 (abfd, (bfd_byte *) ext->x_sym.x_fcnary.x_ary.x_dimen[1]); - in->x_sym.x_fcnary.x_ary.x_dimen[2] = - bfd_h_get_16 (abfd, (bfd_byte *) ext->x_sym.x_fcnary.x_ary.x_dimen[2]); - in->x_sym.x_fcnary.x_ary.x_dimen[3] = - bfd_h_get_16 (abfd, (bfd_byte *) ext->x_sym.x_fcnary.x_ary.x_dimen[3]); - } - - if (ISFCN(type)) { - in->x_sym.x_misc.x_fsize = bfd_h_get_32(abfd, (bfd_byte *) ext->x_sym.x_misc.x_fsize); - } - else { - in->x_sym.x_misc.x_lnsz.x_lnno = GET_LNSZ_LNNO(abfd, ext); - in->x_sym.x_misc.x_lnsz.x_size = GET_LNSZ_SIZE(abfd, ext); - } -} - -static unsigned int -coff_swap_aux_out (abfd, inp, type, class, indx, numaux, extp) - bfd *abfd; - PTR inp; - int type; - int class; - int indx; - int numaux; - PTR extp; -{ - union internal_auxent *in = (union internal_auxent *)inp; - AUXENT *ext = (AUXENT *)extp; - - memset((PTR)ext, 0, AUXESZ); - switch (class) { - case C_FILE: - if (in->x_file.x_fname[0] == 0) { - bfd_h_put_32(abfd, 0, (bfd_byte *) ext->x_file.x_n.x_zeroes); - bfd_h_put_32(abfd, - in->x_file.x_n.x_offset, - (bfd_byte *) ext->x_file.x_n.x_offset); - } - else { -#if FILNMLEN != E_FILNMLEN - -> Error, we need to cope with truncating or extending FILNMLEN!; -#else - memcpy (ext->x_file.x_fname, in->x_file.x_fname, FILNMLEN); -#endif - } - return sizeof (AUXENT); - - - case C_STAT: -#ifdef C_LEAFSTAT - case C_LEAFSTAT: -#endif - case C_HIDDEN: - if (type == T_NULL) { - PUT_SCN_SCNLEN(abfd, in->x_scn.x_scnlen, ext); - PUT_SCN_NRELOC(abfd, in->x_scn.x_nreloc, ext); - PUT_SCN_NLINNO(abfd, in->x_scn.x_nlinno, ext); - return sizeof (AUXENT); - } - break; - } - - bfd_h_put_32(abfd, in->x_sym.x_tagndx.l, (bfd_byte *) ext->x_sym.x_tagndx); -#ifndef NO_TVNDX - bfd_h_put_16(abfd, in->x_sym.x_tvndx , (bfd_byte *) ext->x_sym.x_tvndx); -#endif - - if (class == C_BLOCK || ISFCN (type) || ISTAG (class)) - { - PUT_FCN_LNNOPTR(abfd, in->x_sym.x_fcnary.x_fcn.x_lnnoptr, ext); - PUT_FCN_ENDNDX(abfd, in->x_sym.x_fcnary.x_fcn.x_endndx.l, ext); - } - else - { -#if DIMNUM != E_DIMNUM - #error we need to cope with truncating or extending DIMNUM -#endif - bfd_h_put_16 (abfd, in->x_sym.x_fcnary.x_ary.x_dimen[0], - (bfd_byte *) ext->x_sym.x_fcnary.x_ary.x_dimen[0]); - bfd_h_put_16 (abfd, in->x_sym.x_fcnary.x_ary.x_dimen[1], - (bfd_byte *) ext->x_sym.x_fcnary.x_ary.x_dimen[1]); - bfd_h_put_16 (abfd, in->x_sym.x_fcnary.x_ary.x_dimen[2], - (bfd_byte *) ext->x_sym.x_fcnary.x_ary.x_dimen[2]); - bfd_h_put_16 (abfd, in->x_sym.x_fcnary.x_ary.x_dimen[3], - (bfd_byte *) ext->x_sym.x_fcnary.x_ary.x_dimen[3]); - } - - if (ISFCN (type)) - bfd_h_put_32 (abfd, in->x_sym.x_misc.x_fsize, - (bfd_byte *) ext->x_sym.x_misc.x_fsize); - else - { - PUT_LNSZ_LNNO (abfd, in->x_sym.x_misc.x_lnsz.x_lnno, ext); - PUT_LNSZ_SIZE (abfd, in->x_sym.x_misc.x_lnsz.x_size, ext); - } - - return sizeof(AUXENT); -} - - -static void -coff_swap_lineno_in (abfd, ext1, in1) - bfd *abfd; - PTR ext1; - PTR in1; -{ - LINENO *ext = (LINENO *)ext1; - struct internal_lineno *in = (struct internal_lineno *)in1; - - in->l_addr.l_symndx = bfd_h_get_32(abfd, (bfd_byte *) ext->l_addr.l_symndx); - in->l_lnno = GET_LINENO_LNNO(abfd, ext); -} - -static unsigned int -coff_swap_lineno_out (abfd, inp, outp) - bfd *abfd; - PTR inp; - PTR outp; -{ - struct internal_lineno *in = (struct internal_lineno *)inp; - struct external_lineno *ext = (struct external_lineno *)outp; - bfd_h_put_32(abfd, in->l_addr.l_symndx, (bfd_byte *) - ext->l_addr.l_symndx); - - PUT_LINENO_LNNO (abfd, in->l_lnno, ext); - return sizeof(struct external_lineno); -} - - - -static void -coff_swap_aouthdr_in (abfd, aouthdr_ext1, aouthdr_int1) - bfd *abfd; - PTR aouthdr_ext1; - PTR aouthdr_int1; -{ - struct internal_extra_pe_aouthdr *a; - PEAOUTHDR *src = (PEAOUTHDR *)(aouthdr_ext1); - AOUTHDR *aouthdr_ext = (AOUTHDR *) aouthdr_ext1; - struct internal_aouthdr *aouthdr_int = (struct internal_aouthdr *)aouthdr_int1; - - aouthdr_int->magic = bfd_h_get_16(abfd, (bfd_byte *) aouthdr_ext->magic); - aouthdr_int->vstamp = bfd_h_get_16(abfd, (bfd_byte *) aouthdr_ext->vstamp); - aouthdr_int->tsize = - GET_AOUTHDR_TSIZE (abfd, (bfd_byte *) aouthdr_ext->tsize); - aouthdr_int->dsize = - GET_AOUTHDR_DSIZE (abfd, (bfd_byte *) aouthdr_ext->dsize); - aouthdr_int->bsize = - GET_AOUTHDR_BSIZE (abfd, (bfd_byte *) aouthdr_ext->bsize); - aouthdr_int->entry = - GET_AOUTHDR_ENTRY (abfd, (bfd_byte *) aouthdr_ext->entry); - aouthdr_int->text_start = - GET_AOUTHDR_TEXT_START (abfd, (bfd_byte *) aouthdr_ext->text_start); - aouthdr_int->data_start = - GET_AOUTHDR_DATA_START (abfd, (bfd_byte *) aouthdr_ext->data_start); - - a = &aouthdr_int->pe; - a->ImageBase = bfd_h_get_32 (abfd, src->ImageBase); - a->SectionAlignment = bfd_h_get_32 (abfd, src->SectionAlignment); - a->FileAlignment = bfd_h_get_32 (abfd, src->FileAlignment); - a->MajorOperatingSystemVersion = - bfd_h_get_16 (abfd, src->MajorOperatingSystemVersion); - a->MinorOperatingSystemVersion = - bfd_h_get_16 (abfd, src->MinorOperatingSystemVersion); - a->MajorImageVersion = bfd_h_get_16 (abfd, src->MajorImageVersion); - a->MinorImageVersion = bfd_h_get_16 (abfd, src->MinorImageVersion); - a->MajorSubsystemVersion = bfd_h_get_16 (abfd, src->MajorSubsystemVersion); - a->MinorSubsystemVersion = bfd_h_get_16 (abfd, src->MinorSubsystemVersion); - a->Reserved1 = bfd_h_get_32 (abfd, src->Reserved1); - a->SizeOfImage = bfd_h_get_32 (abfd, src->SizeOfImage); - a->SizeOfHeaders = bfd_h_get_32 (abfd, src->SizeOfHeaders); - a->CheckSum = bfd_h_get_32 (abfd, src->CheckSum); - a->Subsystem = bfd_h_get_16 (abfd, src->Subsystem); - a->DllCharacteristics = bfd_h_get_16 (abfd, src->DllCharacteristics); - a->SizeOfStackReserve = bfd_h_get_32 (abfd, src->SizeOfStackReserve); - a->SizeOfStackCommit = bfd_h_get_32 (abfd, src->SizeOfStackCommit); - a->SizeOfHeapReserve = bfd_h_get_32 (abfd, src->SizeOfHeapReserve); - a->SizeOfHeapCommit = bfd_h_get_32 (abfd, src->SizeOfHeapCommit); - a->LoaderFlags = bfd_h_get_32 (abfd, src->LoaderFlags); - a->NumberOfRvaAndSizes = bfd_h_get_32 (abfd, src->NumberOfRvaAndSizes); - - { - int idx; - for (idx=0; idx < 16; idx++) - { - a->DataDirectory[idx].VirtualAddress = - bfd_h_get_32 (abfd, src->DataDirectory[idx][0]); - a->DataDirectory[idx].Size = - bfd_h_get_32 (abfd, src->DataDirectory[idx][1]); - } - } - - if (aouthdr_int->entry) - aouthdr_int->entry += a->ImageBase; - if (aouthdr_int->tsize) - aouthdr_int->text_start += a->ImageBase; - if (aouthdr_int->dsize) - aouthdr_int->data_start += a->ImageBase; -} - - -static void add_data_entry (abfd, aout, idx, name, base) - bfd *abfd; - struct internal_extra_pe_aouthdr *aout; - int idx; - char *name; - bfd_vma base; -{ - asection *sec = bfd_get_section_by_name (abfd, name); - - /* add import directory information if it exists */ - if (sec != NULL) - { - aout->DataDirectory[idx].VirtualAddress = sec->vma - base; - aout->DataDirectory[idx].Size = sec->_cooked_size; - sec->flags |= SEC_DATA; - } -} - -static unsigned int -coff_swap_aouthdr_out (abfd, in, out) - bfd *abfd; - PTR in; - PTR out; -{ - struct internal_aouthdr *aouthdr_in = (struct internal_aouthdr *)in; - struct internal_extra_pe_aouthdr *extra = &pe_data (abfd)->pe_opthdr; - PEAOUTHDR *aouthdr_out = (PEAOUTHDR *)out; - - bfd_vma sa = extra->SectionAlignment; - bfd_vma fa = extra->FileAlignment; - bfd_vma ib = extra->ImageBase ; - - if (aouthdr_in->tsize) - aouthdr_in->text_start -= ib; - if (aouthdr_in->dsize) - aouthdr_in->data_start -= ib; - if (aouthdr_in->entry) - aouthdr_in->entry -= ib; - -#define FA(x) (((x) + fa -1 ) & (- fa)) -#define SA(x) (((x) + sa -1 ) & (- sa)) - - /* We like to have the sizes aligned */ - - aouthdr_in->bsize = FA (aouthdr_in->bsize); - - - extra->NumberOfRvaAndSizes = IMAGE_NUMBEROF_DIRECTORY_ENTRIES; - - /* first null out all data directory entries .. */ - memset (extra->DataDirectory, sizeof (extra->DataDirectory), 0); - - add_data_entry (abfd, extra, 0, ".edata", ib); - add_data_entry (abfd, extra, 1, ".idata", ib); - add_data_entry (abfd, extra, 2, ".rsrc" ,ib); - -#ifdef POWERPC_LE_PE - /* FIXME: do other PE platforms use this? */ - add_data_entry (abfd, extra, 3, ".pdata" ,ib); -#endif - - add_data_entry (abfd, extra, 5, ".reloc", ib); - -#ifdef POWERPC_LE_PE - /* On the PPC NT system, this field is set up as follows. It is - not an "officially" reserved field, so it currently has no title. - first_thunk_address is idata$5, and the thunk_size is the size - of the idata$5 chunk of the idata section. - */ - extra->DataDirectory[12].VirtualAddress = first_thunk_address; - extra->DataDirectory[12].Size = thunk_size; - - /* On the PPC NT system, the size of the directory entry is not the - size of the entire section. It's actually offset to the end of - the idata$3 component of the idata section. This is the size of - the entire import table. (also known as the start of idata$4) - */ - extra->DataDirectory[1].Size = import_table_size; -#endif - - { - asection *sec; - bfd_vma dsize= 0; - bfd_vma isize = SA(abfd->sections->filepos); - bfd_vma tsize= 0; - - for (sec = abfd->sections; sec; sec = sec->next) - { - int rounded = FA(sec->_raw_size); - - if (strcmp(sec->name,".junk") == 0) - { - continue; - } - - if (sec->flags & SEC_DATA) - dsize += rounded; - if (sec->flags & SEC_CODE) - tsize += rounded; - isize += SA(rounded); - } - - aouthdr_in->dsize = dsize; - aouthdr_in->tsize = tsize; - extra->SizeOfImage = isize; - } - - extra->SizeOfHeaders = abfd->sections->filepos; - bfd_h_put_16(abfd, aouthdr_in->magic, (bfd_byte *) aouthdr_out->standard.magic); - -#ifdef POWERPC_LE_PE - /* this little piece of magic sets the "linker version" field to 2.60 */ - bfd_h_put_16(abfd, 2 + 60 * 256, (bfd_byte *) aouthdr_out->standard.vstamp); -#else - /* this little piece of magic sets the "linker version" field to 2.55 */ - bfd_h_put_16(abfd, 2 + 55 * 256, (bfd_byte *) aouthdr_out->standard.vstamp); -#endif - - PUT_AOUTHDR_TSIZE (abfd, aouthdr_in->tsize, (bfd_byte *) aouthdr_out->standard.tsize); - PUT_AOUTHDR_DSIZE (abfd, aouthdr_in->dsize, (bfd_byte *) aouthdr_out->standard.dsize); - PUT_AOUTHDR_BSIZE (abfd, aouthdr_in->bsize, (bfd_byte *) aouthdr_out->standard.bsize); - PUT_AOUTHDR_ENTRY (abfd, aouthdr_in->entry, (bfd_byte *) aouthdr_out->standard.entry); - PUT_AOUTHDR_TEXT_START (abfd, aouthdr_in->text_start, - (bfd_byte *) aouthdr_out->standard.text_start); - - PUT_AOUTHDR_DATA_START (abfd, aouthdr_in->data_start, - (bfd_byte *) aouthdr_out->standard.data_start); - - - bfd_h_put_32 (abfd, extra->ImageBase, - (bfd_byte *) aouthdr_out->ImageBase); - bfd_h_put_32 (abfd, extra->SectionAlignment, - (bfd_byte *) aouthdr_out->SectionAlignment); - bfd_h_put_32 (abfd, extra->FileAlignment, - (bfd_byte *) aouthdr_out->FileAlignment); - bfd_h_put_16 (abfd, extra->MajorOperatingSystemVersion, - (bfd_byte *) aouthdr_out->MajorOperatingSystemVersion); - bfd_h_put_16 (abfd, extra->MinorOperatingSystemVersion, - (bfd_byte *) aouthdr_out->MinorOperatingSystemVersion); - bfd_h_put_16 (abfd, extra->MajorImageVersion, - (bfd_byte *) aouthdr_out->MajorImageVersion); - bfd_h_put_16 (abfd, extra->MinorImageVersion, - (bfd_byte *) aouthdr_out->MinorImageVersion); - bfd_h_put_16 (abfd, extra->MajorSubsystemVersion, - (bfd_byte *) aouthdr_out->MajorSubsystemVersion); - bfd_h_put_16 (abfd, extra->MinorSubsystemVersion, - (bfd_byte *) aouthdr_out->MinorSubsystemVersion); - bfd_h_put_32 (abfd, extra->Reserved1, - (bfd_byte *) aouthdr_out->Reserved1); - bfd_h_put_32 (abfd, extra->SizeOfImage, - (bfd_byte *) aouthdr_out->SizeOfImage); - bfd_h_put_32 (abfd, extra->SizeOfHeaders, - (bfd_byte *) aouthdr_out->SizeOfHeaders); - bfd_h_put_32 (abfd, extra->CheckSum, - (bfd_byte *) aouthdr_out->CheckSum); - bfd_h_put_16 (abfd, extra->Subsystem, - (bfd_byte *) aouthdr_out->Subsystem); - bfd_h_put_16 (abfd, extra->DllCharacteristics, - (bfd_byte *) aouthdr_out->DllCharacteristics); - bfd_h_put_32 (abfd, extra->SizeOfStackReserve, - (bfd_byte *) aouthdr_out->SizeOfStackReserve); - bfd_h_put_32 (abfd, extra->SizeOfStackCommit, - (bfd_byte *) aouthdr_out->SizeOfStackCommit); - bfd_h_put_32 (abfd, extra->SizeOfHeapReserve, - (bfd_byte *) aouthdr_out->SizeOfHeapReserve); - bfd_h_put_32 (abfd, extra->SizeOfHeapCommit, - (bfd_byte *) aouthdr_out->SizeOfHeapCommit); - bfd_h_put_32 (abfd, extra->LoaderFlags, - (bfd_byte *) aouthdr_out->LoaderFlags); - bfd_h_put_32 (abfd, extra->NumberOfRvaAndSizes, - (bfd_byte *) aouthdr_out->NumberOfRvaAndSizes); - { - int idx; - for (idx=0; idx < 16; idx++) - { - bfd_h_put_32 (abfd, extra->DataDirectory[idx].VirtualAddress, - (bfd_byte *) aouthdr_out->DataDirectory[idx][0]); - bfd_h_put_32 (abfd, extra->DataDirectory[idx].Size, - (bfd_byte *) aouthdr_out->DataDirectory[idx][1]); - } - } - - return sizeof(AOUTHDR); -} - -static void - coff_swap_scnhdr_in (abfd, ext, in) - bfd *abfd; - PTR ext; - PTR in; -{ - SCNHDR *scnhdr_ext = (SCNHDR *) ext; - struct internal_scnhdr *scnhdr_int = (struct internal_scnhdr *) in; - - memcpy(scnhdr_int->s_name, scnhdr_ext->s_name, sizeof(scnhdr_int->s_name)); - scnhdr_int->s_vaddr = - GET_SCNHDR_VADDR (abfd, (bfd_byte *) scnhdr_ext->s_vaddr); - scnhdr_int->s_paddr = - GET_SCNHDR_PADDR (abfd, (bfd_byte *) scnhdr_ext->s_paddr); - scnhdr_int->s_size = - GET_SCNHDR_SIZE (abfd, (bfd_byte *) scnhdr_ext->s_size); - scnhdr_int->s_scnptr = - GET_SCNHDR_SCNPTR (abfd, (bfd_byte *) scnhdr_ext->s_scnptr); - scnhdr_int->s_relptr = - GET_SCNHDR_RELPTR (abfd, (bfd_byte *) scnhdr_ext->s_relptr); - scnhdr_int->s_lnnoptr = - GET_SCNHDR_LNNOPTR (abfd, (bfd_byte *) scnhdr_ext->s_lnnoptr); - scnhdr_int->s_flags = bfd_h_get_32(abfd, (bfd_byte *) scnhdr_ext->s_flags); - - scnhdr_int->s_nreloc = bfd_h_get_16(abfd, (bfd_byte *) scnhdr_ext->s_nreloc); - scnhdr_int->s_nlnno = bfd_h_get_16(abfd, (bfd_byte *) scnhdr_ext->s_nlnno); - - if (scnhdr_int->s_vaddr != 0) - { - scnhdr_int->s_vaddr += pe_data (abfd)->pe_opthdr.ImageBase; - } - if (strcmp (scnhdr_int->s_name, _BSS) == 0) - { - scnhdr_int->s_size = scnhdr_int->s_paddr; - scnhdr_int->s_paddr = 0; - } -} - -static unsigned int -coff_swap_scnhdr_out (abfd, in, out) - bfd *abfd; - PTR in; - PTR out; -{ - struct internal_scnhdr *scnhdr_int = (struct internal_scnhdr *)in; - SCNHDR *scnhdr_ext = (SCNHDR *)out; - unsigned int ret = sizeof (SCNHDR); - bfd_vma ps; - bfd_vma ss; - - memcpy(scnhdr_ext->s_name, scnhdr_int->s_name, sizeof(scnhdr_int->s_name)); - - PUT_SCNHDR_VADDR (abfd, - (scnhdr_int->s_vaddr - - pe_data(abfd)->pe_opthdr.ImageBase), - (bfd_byte *) scnhdr_ext->s_vaddr); - - /* NT wants the size data to be rounded up to the next NT_FILE_ALIGNMENT - value except for the BSS section, its s_size should be 0 */ - - - if (strcmp (scnhdr_int->s_name, _BSS) == 0) - { - ps = scnhdr_int->s_size; - ss = 0; - } - else - { - ps = scnhdr_int->s_paddr; - ss = scnhdr_int->s_size; - } - - PUT_SCNHDR_SIZE (abfd, ss, - (bfd_byte *) scnhdr_ext->s_size); - - - PUT_SCNHDR_PADDR (abfd, ps, (bfd_byte *) scnhdr_ext->s_paddr); - - PUT_SCNHDR_SCNPTR (abfd, scnhdr_int->s_scnptr, - (bfd_byte *) scnhdr_ext->s_scnptr); - PUT_SCNHDR_RELPTR (abfd, scnhdr_int->s_relptr, - (bfd_byte *) scnhdr_ext->s_relptr); - PUT_SCNHDR_LNNOPTR (abfd, scnhdr_int->s_lnnoptr, - (bfd_byte *) scnhdr_ext->s_lnnoptr); - - /* Extra flags must be set when dealing with NT. All sections should also - have the IMAGE_SCN_MEM_READ (0x40000000) flag set. In addition, the - .text section must have IMAGE_SCN_MEM_EXECUTE (0x20000000) and the data - sections (.idata, .data, .bss, .CRT) must have IMAGE_SCN_MEM_WRITE set - (this is especially important when dealing with the .idata section since - the addresses for routines from .dlls must be overwritten). If .reloc - section data is ever generated, we must add IMAGE_SCN_MEM_DISCARDABLE - (0x02000000). Also, the resource data should also be read and - writable. */ - - /* FIXME: alignment is also encoded in this field, at least on ppc (krk) */ - /* FIXME: even worse, I don't see how to get the original alignment field*/ - /* back... */ - - { - int flags = scnhdr_int->s_flags; - if (strcmp (scnhdr_int->s_name, ".data") == 0 || - strcmp (scnhdr_int->s_name, ".CRT") == 0 || - strcmp (scnhdr_int->s_name, ".rsrc") == 0 || - strcmp (scnhdr_int->s_name, ".bss") == 0) - flags |= IMAGE_SCN_MEM_READ | IMAGE_SCN_MEM_WRITE; - else if (strcmp (scnhdr_int->s_name, ".text") == 0) - flags |= IMAGE_SCN_MEM_READ | IMAGE_SCN_MEM_EXECUTE; - else if (strcmp (scnhdr_int->s_name, ".reloc") == 0) - flags = SEC_DATA| IMAGE_SCN_MEM_READ | IMAGE_SCN_MEM_DISCARDABLE; - else if (strcmp (scnhdr_int->s_name, ".idata") == 0) - flags = IMAGE_SCN_MEM_READ | IMAGE_SCN_MEM_WRITE | SEC_DATA; - else if (strcmp (scnhdr_int->s_name, ".rdata") == 0 - || strcmp (scnhdr_int->s_name, ".edata") == 0) - flags = IMAGE_SCN_MEM_READ | SEC_DATA; - /* ppc-nt additions */ - else if (strcmp (scnhdr_int->s_name, ".pdata") == 0) - flags = IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_ALIGN_4BYTES | - IMAGE_SCN_MEM_READ ; - /* Remember this field is a max of 8 chars, so the null is _not_ there - for an 8 character name like ".reldata". (yep. Stupid bug) */ - else if (strncmp (scnhdr_int->s_name, ".reldata", strlen(".reldata")) == 0) - flags = IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_ALIGN_8BYTES | - IMAGE_SCN_MEM_READ | IMAGE_SCN_MEM_WRITE ; - else if (strcmp (scnhdr_int->s_name, ".ydata") == 0) - flags = IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_ALIGN_8BYTES | - IMAGE_SCN_MEM_READ | IMAGE_SCN_MEM_WRITE ; - else if (strcmp (scnhdr_int->s_name, ".drectve") == 0) - flags = IMAGE_SCN_LNK_INFO | IMAGE_SCN_LNK_REMOVE ; - /* end of ppc-nt additions */ -#ifdef POWERPC_LE_PE - else if (strncmp (scnhdr_int->s_name, ".stabstr", strlen(".stabstr")) == 0) - { - flags = IMAGE_SCN_LNK_INFO; - } - else if (strcmp (scnhdr_int->s_name, ".stab") == 0) - { - flags = IMAGE_SCN_LNK_INFO; - } -#endif - - bfd_h_put_32(abfd, flags, (bfd_byte *) scnhdr_ext->s_flags); - } - - if (scnhdr_int->s_nlnno <= 0xffff) - bfd_h_put_16(abfd, scnhdr_int->s_nlnno, (bfd_byte *) scnhdr_ext->s_nlnno); - else - { - (*_bfd_error_handler) ("%s: line number overflow: 0x%lx > 0xffff", - bfd_get_filename (abfd), - scnhdr_int->s_nlnno); - bfd_set_error (bfd_error_file_truncated); - bfd_h_put_16 (abfd, 0xffff, (bfd_byte *) scnhdr_ext->s_nlnno); - ret = 0; - } - if (scnhdr_int->s_nreloc <= 0xffff) - bfd_h_put_16(abfd, scnhdr_int->s_nreloc, (bfd_byte *) scnhdr_ext->s_nreloc); - else - { - (*_bfd_error_handler) ("%s: reloc overflow: 0x%lx > 0xffff", - bfd_get_filename (abfd), - scnhdr_int->s_nreloc); - bfd_set_error (bfd_error_file_truncated); - bfd_h_put_16 (abfd, 0xffff, (bfd_byte *) scnhdr_ext->s_nreloc); - ret = 0; - } - return ret; -} - -static char * dir_names[IMAGE_NUMBEROF_DIRECTORY_ENTRIES] = -{ - "Export Directory [.edata]", - "Import Directory [parts of .idata]", - "Resource Directory [.rsrc]", - "Exception Directory [.pdata]", - "Security Directory", - "Base Relocation Directory [.reloc]", - "Debug Directory", - "Description Directory", - "Special Directory", - "Thread Storage Directory [.tls]", - "Load Configuration Directory", - "Bound Import Directory", - "Import Address Table Directory", - "Reserved", - "Reserved", - "Reserved" -}; - -/**********************************************************************/ -static boolean -pe_print_idata(abfd, vfile) - bfd*abfd; - void *vfile; -{ - FILE *file = vfile; - bfd_byte *data = 0; - asection *section = bfd_get_section_by_name (abfd, ".idata"); - -#ifdef POWERPC_LE_PE - asection *rel_section = bfd_get_section_by_name (abfd, ".reldata"); -#endif - - bfd_size_type datasize = 0; - bfd_size_type i; - bfd_size_type start, stop; - int onaline = 20; - bfd_vma addr_value; - bfd_vma loadable_toc_address; - bfd_vma toc_address; - bfd_vma start_address; - - pe_data_type *pe = pe_data (abfd); - struct internal_extra_pe_aouthdr *extra = &pe->pe_opthdr; - - if (section == 0) - return true; - -#ifdef POWERPC_LE_PE - if (rel_section != 0 && bfd_section_size (abfd, rel_section) != 0) - { - /* The toc address can be found by taking the starting address, - which on the PPC locates a function descriptor. The descriptor - consists of the function code starting address followed by the - address of the toc. The starting address we get from the bfd, - and the descriptor is supposed to be in the .reldata section. - */ - - bfd_byte *data = 0; - int offset; - data = (bfd_byte *) bfd_malloc ((size_t) bfd_section_size (abfd, - rel_section)); - if (data == NULL && bfd_section_size (abfd, rel_section) != 0) - return false; - - datasize = bfd_section_size (abfd, rel_section); - - bfd_get_section_contents (abfd, - rel_section, - (PTR) data, 0, - bfd_section_size (abfd, rel_section)); - - offset = abfd->start_address - rel_section->vma; - - start_address = bfd_get_32(abfd, data+offset); - loadable_toc_address = bfd_get_32(abfd, data+offset+4); - toc_address = loadable_toc_address - 32768; - - fprintf(file, - "\nFunction descriptor located at the start address: %04lx\n", - (unsigned long int) (abfd->start_address)); - fprintf (file, - "\tcode-base %08lx toc (loadable/actual) %08lx/%08lx\n", - start_address, loadable_toc_address, toc_address); - } - else - { - loadable_toc_address = 0; - toc_address = 0; - start_address = 0; - } -#endif - - fprintf(file, - "\nThe Import Tables (interpreted .idata section contents)\n"); - fprintf(file, - " vma: Hint Time Forward DLL First\n"); - fprintf(file, - " Table Stamp Chain Name Thunk\n"); - - if (bfd_section_size (abfd, section) == 0) - return true; - - data = (bfd_byte *) bfd_malloc ((size_t) bfd_section_size (abfd, section)); - datasize = bfd_section_size (abfd, section); - if (data == NULL && datasize != 0) - return false; - - bfd_get_section_contents (abfd, - section, - (PTR) data, 0, - bfd_section_size (abfd, section)); - - start = 0; - - stop = bfd_section_size (abfd, section); - - for (i = start; i < stop; i += onaline) - { - bfd_vma hint_addr; - bfd_vma time_stamp; - bfd_vma forward_chain; - bfd_vma dll_name; - bfd_vma first_thunk; - int idx; - int j; - char *dll; - int adj = extra->ImageBase - section->vma; - - fprintf (file, - " %04lx\t", - (unsigned long int) (i + section->vma)); - - if (i+20 > stop) - { - /* check stuff */ - ; - } - - hint_addr = bfd_get_32(abfd, data+i); - time_stamp = bfd_get_32(abfd, data+i+4); - forward_chain = bfd_get_32(abfd, data+i+8); - dll_name = bfd_get_32(abfd, data+i+12); - first_thunk = bfd_get_32(abfd, data+i+16); - - fprintf(file, "%08lx %08lx %08lx %08lx %08lx\n", - hint_addr, - time_stamp, - forward_chain, - dll_name, - first_thunk); - - if (hint_addr ==0) - { - break; - } - - /* the image base is present in the section->vma */ - dll = data + dll_name + adj; - fprintf(file, "\n\tDLL Name: %s\n", dll); - fprintf(file, "\tvma: Ordinal Member-Name\n"); - - idx = hint_addr + adj; - - for (j=0;j<stop;j+=4) - { - int ordinal; - char *member_name; - bfd_vma member = bfd_get_32(abfd, data + idx + j); - if (member == 0) - break; - ordinal = bfd_get_16(abfd, - data + member + adj); - member_name = data + member + adj + 2; - fprintf(file, "\t%04lx\t %4d %s\n", - member, ordinal, member_name); - } - - if (hint_addr != first_thunk) - { - int differ = 0; - int idx2; - - idx2 = first_thunk + adj; - - for (j=0;j<stop;j+=4) - { - int ordinal; - char *member_name; - bfd_vma hint_member = bfd_get_32(abfd, data + idx + j); - bfd_vma iat_member = bfd_get_32(abfd, data + idx2 + j); - if (hint_member != iat_member) - { - if (differ == 0) - { - fprintf(file, - "\tThe Import Address Table (difference found)\n"); - fprintf(file, "\tvma: Ordinal Member-Name\n"); - differ = 1; - } - if (iat_member == 0) - { - fprintf(file, - "\t>>> Ran out of IAT members!\n"); - } - else - { - ordinal = bfd_get_16(abfd, - data + iat_member + adj); - member_name = data + iat_member + adj + 2; - fprintf(file, "\t%04lx\t %4d %s\n", - iat_member, ordinal, member_name); - } - break; - } - if (hint_member == 0) - break; - } - if (differ == 0) - { - fprintf(file, - "\tThe Import Address Table is identical\n"); - } - } - - fprintf(file, "\n"); - - } - - free (data); -} - -static boolean -pe_print_edata(abfd, vfile) - bfd*abfd; - void *vfile; -{ - FILE *file = vfile; - bfd_byte *data = 0; - asection *section = bfd_get_section_by_name (abfd, ".edata"); - - bfd_size_type datasize = 0; - bfd_size_type i; - - int adj; - struct EDT_type - { - long export_flags; /* reserved - should be zero */ - long time_stamp; - short major_ver; - short minor_ver; - bfd_vma name; /* rva - relative to image base */ - long base; /* ordinal base */ - long num_functions; /* Number in the export address table */ - long num_names; /* Number in the name pointer table */ - bfd_vma eat_addr; /* rva to the export address table */ - bfd_vma npt_addr; /* rva to the Export Name Pointer Table */ - bfd_vma ot_addr; /* rva to the Ordinal Table */ - } edt; - - pe_data_type *pe = pe_data (abfd); - struct internal_extra_pe_aouthdr *extra = &pe->pe_opthdr; - - if (section == 0) - return true; - - data = (bfd_byte *) bfd_malloc ((size_t) bfd_section_size (abfd, - section)); - datasize = bfd_section_size (abfd, section); - - if (data == NULL && datasize != 0) - return false; - - bfd_get_section_contents (abfd, - section, - (PTR) data, 0, - bfd_section_size (abfd, section)); - - /* Go get Export Directory Table */ - edt.export_flags = bfd_get_32(abfd, data+0); - edt.time_stamp = bfd_get_32(abfd, data+4); - edt.major_ver = bfd_get_16(abfd, data+8); - edt.minor_ver = bfd_get_16(abfd, data+10); - edt.name = bfd_get_32(abfd, data+12); - edt.base = bfd_get_32(abfd, data+16); - edt.num_functions = bfd_get_32(abfd, data+20); - edt.num_names = bfd_get_32(abfd, data+24); - edt.eat_addr = bfd_get_32(abfd, data+28); - edt.npt_addr = bfd_get_32(abfd, data+32); - edt.ot_addr = bfd_get_32(abfd, data+36); - - adj = extra->ImageBase - section->vma; - - - /* Dump the EDT first first */ - fprintf(file, - "\nThe Export Tables (interpreted .edata section contents)\n\n"); - - fprintf(file, - "Export Flags \t\t\t%x\n",edt.export_flags); - - fprintf(file, - "Time/Date stamp \t\t%x\n",edt.time_stamp); - - fprintf(file, - "Major/Minor \t\t\t%d/%d\n", edt.major_ver, edt.minor_ver); - - fprintf(file, - "Name \t\t\t\t%x %s\n", edt.name, data + edt.name + adj); - - fprintf(file, - "Ordinal Base \t\t\t%d\n", edt.base); - - fprintf(file, - "Number in:\n"); - - fprintf(file, - "\tExport Address Table \t\t%x\n", edt.num_functions); - - fprintf(file, - "\t[Name Pointer/Ordinal] Table\t%d\n", edt.num_names); - - fprintf(file, - "Table Addresses\n"); - - fprintf(file, - "\tExport Address Table \t\t%x\n", - edt.eat_addr); - - fprintf(file, - "\tName Pointer Table \t\t%x\n", - edt.npt_addr); - - fprintf(file, - "\tOrdinal Table \t\t\t%x\n", - edt.ot_addr); - - - /* The next table to find si the Export Address Table. It's basically - a list of pointers that either locate a function in this dll, or - forward the call to another dll. Something like: - typedef union - { - long export_rva; - long forwarder_rva; - } export_address_table_entry; - */ - - fprintf(file, - "\nExport Address Table -- Ordinal Base %d\n", - edt.base); - - for (i = 0; i < edt.num_functions; ++i) - { - bfd_vma eat_member = bfd_get_32(abfd, - data + edt.eat_addr + (i*4) + adj); - bfd_vma eat_actual = extra->ImageBase + eat_member; - bfd_vma edata_start = bfd_get_section_vma(abfd,section); - bfd_vma edata_end = edata_start + bfd_section_size (abfd, section); - - - if (eat_member == 0) - continue; - - if (edata_start < eat_actual && eat_actual < edata_end) - { - /* this rva is to a name (forwarding function) in our section */ - /* Should locate a function descriptor */ - fprintf(file, - "\t[%4d] +base[%4d] %04lx %s -- %s\n", - i, i+edt.base, eat_member, "Forwarder RVA", - data + eat_member + adj); - } - else - { - /* Should locate a function descriptor in the reldata section */ - fprintf(file, - "\t[%4d] +base[%4d] %04lx %s\n", - i, i+edt.base, eat_member, "Export RVA"); - } - } - - /* The Export Name Pointer Table is paired with the Export Ordinal Table */ - /* Dump them in parallel for clarity */ - fprintf(file, - "\n[Ordinal/Name Pointer] Table\n"); - - for (i = 0; i < edt.num_names; ++i) - { - bfd_vma name_ptr = bfd_get_32(abfd, - data + - edt.npt_addr - + (i*4) + adj); - - char *name = data + name_ptr + adj; - - bfd_vma ord = bfd_get_16(abfd, - data + - edt.ot_addr - + (i*2) + adj); - fprintf(file, - "\t[%4d] %s\n", ord, name); - - } - - free (data); -} - -static boolean -pe_print_pdata(abfd, vfile) - bfd*abfd; - void *vfile; -{ - FILE *file = vfile; - bfd_byte *data = 0; - asection *section = bfd_get_section_by_name (abfd, ".pdata"); - bfd_size_type datasize = 0; - bfd_size_type i; - bfd_size_type start, stop; - int onaline = 20; - bfd_vma addr_value; - - if (section == 0) - return true; - - fprintf(file, - "\nThe Function Table (interpreted .pdata section contents)\n"); - fprintf(file, - " vma:\t\tBegin End EH EH PrologEnd\n"); - fprintf(file, - " \t\tAddress Address Handler Data Address\n"); - - if (bfd_section_size (abfd, section) == 0) - return true; - - data = (bfd_byte *) bfd_malloc ((size_t) bfd_section_size (abfd, section)); - datasize = bfd_section_size (abfd, section); - if (data == NULL && datasize != 0) - return false; - - bfd_get_section_contents (abfd, - section, - (PTR) data, 0, - bfd_section_size (abfd, section)); - - start = 0; - - stop = bfd_section_size (abfd, section); - - for (i = start; i < stop; i += onaline) - { - bfd_vma begin_addr; - bfd_vma end_addr; - bfd_vma eh_handler; - bfd_vma eh_data; - bfd_vma prolog_end_addr; - - if (i+20 > stop) - break; - - begin_addr = bfd_get_32(abfd, data+i); - end_addr = bfd_get_32(abfd, data+i+4); - eh_handler = bfd_get_32(abfd, data+i+8); - eh_data = bfd_get_32(abfd, data+i+12); - prolog_end_addr = bfd_get_32(abfd, data+i+16); - - if (begin_addr == 0 && end_addr == 0 && eh_handler == 0 - && eh_data == 0 && prolog_end_addr == 0) - { - /* We are probably into the padding of the - section now */ - break; - } - - fprintf (file, - " %08lx\t", - (unsigned long int) (i + section->vma)); - - fprintf(file, "%08lx %08lx %08lx %08lx %08lx", - begin_addr, - end_addr, - eh_handler, - eh_data, - prolog_end_addr); - -#ifdef POWERPC_LE_PE - if (eh_handler == 0 && eh_data != 0) - { - /* Special bits here, although the meaning may */ - /* be a little mysterious. The only one I know */ - /* for sure is 0x03. */ - /* Code Significance */ - /* 0x00 None */ - /* 0x01 Register Save Millicode */ - /* 0x02 Register Restore Millicode */ - /* 0x03 Glue Code Sequence */ - switch (eh_data) - { - case 0x01: - fprintf(file, " Register save millicode"); - break; - case 0x02: - fprintf(file, " Register restore millicode"); - break; - case 0x03: - fprintf(file, " Glue code sequence"); - break; - default: - break; - } - } -#endif - fprintf(file, "\n"); - } - - free (data); -} - -static const char *tbl[6] = -{ -"ABSOLUTE", -"HIGH", -"LOW", -"HIGHLOW", -"HIGHADJ", -"unknown" -}; - -static boolean -pe_print_reloc(abfd, vfile) - bfd*abfd; - void *vfile; -{ - FILE *file = vfile; - bfd_byte *data = 0; - asection *section = bfd_get_section_by_name (abfd, ".reloc"); - bfd_size_type datasize = 0; - bfd_size_type i; - bfd_size_type start, stop; - int onaline = 20; - bfd_vma addr_value; - - if (section == 0) - return true; - - if (bfd_section_size (abfd, section) == 0) - return true; - - fprintf(file, - "\n\nPE File Base Relocations (interpreted .reloc" - " section contents)\n"); - - data = (bfd_byte *) bfd_malloc ((size_t) bfd_section_size (abfd, section)); - datasize = bfd_section_size (abfd, section); - if (data == NULL && datasize != 0) - return false; - - bfd_get_section_contents (abfd, - section, - (PTR) data, 0, - bfd_section_size (abfd, section)); - - start = 0; - - stop = bfd_section_size (abfd, section); - - for (i = start; i < stop;) - { - int j; - bfd_vma virtual_address; - long number, size; - - /* The .reloc section is a sequence of blocks, with a header consisting - of two 32 bit quantities, followed by a number of 16 bit entries */ - - virtual_address = bfd_get_32(abfd, data+i); - size = bfd_get_32(abfd, data+i+4); - number = (size - 8) / 2; - - if (size == 0) - { - break; - } - - fprintf (file, - "\nVirtual Address: %08lx Chunk size %d (0x%x) " - "Number of fixups %d\n", - virtual_address, size, size, number); - - for (j = 0; j < number; ++j) - { - unsigned short e = bfd_get_16(abfd, data + i + 8 + j*2); - int t = (e & 0xF000) >> 12; - int off = e & 0x0FFF; - - if (t > 5) - abort(); - - fprintf(file, - "\treloc %4d offset %4x [%4x] %s\n", - j, off, off+virtual_address, tbl[t]); - - } - i += size; - } - - free (data); -} - -static boolean -pe_print_private_bfd_data (abfd, vfile) - bfd *abfd; - PTR vfile; -{ - FILE *file = (FILE *) vfile; - int j; - pe_data_type *pe = pe_data (abfd); - struct internal_extra_pe_aouthdr *i = &pe->pe_opthdr; - - fprintf (file,"\nImageBase\t\t"); - fprintf_vma (file, i->ImageBase); - fprintf (file,"\nSectionAlignment\t"); - fprintf_vma (file, i->SectionAlignment); - fprintf (file,"\nFileAlignment\t\t"); - fprintf_vma (file, i->FileAlignment); - fprintf (file,"\nMajorOSystemVersion\t%d\n", i->MajorOperatingSystemVersion); - fprintf (file,"MinorOSystemVersion\t%d\n", i->MinorOperatingSystemVersion); - fprintf (file,"MajorImageVersion\t%d\n", i->MajorImageVersion); - fprintf (file,"MinorImageVersion\t%d\n", i->MinorImageVersion); - fprintf (file,"MajorSubsystemVersion\t%d\n", i->MajorSubsystemVersion); - fprintf (file,"MinorSubsystemVersion\t%d\n", i->MinorSubsystemVersion); - fprintf (file,"Reserved1\t\t%08lx\n", i->Reserved1); - fprintf (file,"SizeOfImage\t\t%08lx\n", i->SizeOfImage); - fprintf (file,"SizeOfHeaders\t\t%08lx\n", i->SizeOfHeaders); - fprintf (file,"CheckSum\t\t%08lx\n", i->CheckSum); - fprintf (file,"Subsystem\t\t%08x\n", i->Subsystem); - fprintf (file,"DllCharacteristics\t%08x\n", i->DllCharacteristics); - fprintf (file,"SizeOfStackReserve\t"); - fprintf_vma (file, i->SizeOfStackReserve); - fprintf (file,"\nSizeOfStackCommit\t"); - fprintf_vma (file, i->SizeOfStackCommit); - fprintf (file,"\nSizeOfHeapReserve\t"); - fprintf_vma (file, i->SizeOfHeapReserve); - fprintf (file,"\nSizeOfHeapCommit\t"); - fprintf_vma (file, i->SizeOfHeapCommit); - fprintf (file,"\nLoaderFlags\t\t%08lx\n", i->LoaderFlags); - fprintf (file,"NumberOfRvaAndSizes\t%08lx\n", i->NumberOfRvaAndSizes); - - fprintf (file,"\nThe Data Directory\n"); - for (j = 0; j < IMAGE_NUMBEROF_DIRECTORY_ENTRIES; j++) - { - fprintf (file, "Entry %1x ", j); - fprintf_vma (file, i->DataDirectory[j].VirtualAddress); - fprintf (file, " %08lx ", i->DataDirectory[j].Size); - fprintf (file, "%s\n", dir_names[j]); - } - - pe_print_idata(abfd, vfile); - pe_print_edata(abfd, vfile); - pe_print_pdata(abfd, vfile); - pe_print_reloc(abfd, vfile); - - return true; -} - -static boolean -pe_mkobject (abfd) - bfd * abfd; -{ - pe_data_type *pe; - abfd->tdata.pe_obj_data = - (struct pe_tdata *) bfd_zalloc (abfd, sizeof (pe_data_type)); - - if (abfd->tdata.pe_obj_data == 0) - return false; - - pe = pe_data (abfd); - - pe->coff.pe = 1; - pe->in_reloc_p = in_reloc_p; - return true; -} - -/* Create the COFF backend specific information. */ -static PTR -pe_mkobject_hook (abfd, filehdr, aouthdr) - bfd * abfd; - PTR filehdr; - PTR aouthdr; -{ - struct internal_filehdr *internal_f = (struct internal_filehdr *) filehdr; - pe_data_type *pe; - - if (pe_mkobject (abfd) == false) - return NULL; - - pe = pe_data (abfd); - pe->coff.sym_filepos = internal_f->f_symptr; - /* These members communicate important constants about the symbol - table to GDB's symbol-reading code. These `constants' - unfortunately vary among coff implementations... */ - pe->coff.local_n_btmask = N_BTMASK; - pe->coff.local_n_btshft = N_BTSHFT; - pe->coff.local_n_tmask = N_TMASK; - pe->coff.local_n_tshift = N_TSHIFT; - pe->coff.local_symesz = SYMESZ; - pe->coff.local_auxesz = AUXESZ; - pe->coff.local_linesz = LINESZ; - - obj_raw_syment_count (abfd) = - obj_conv_table_size (abfd) = - internal_f->f_nsyms; - - pe->real_flags = internal_f->f_flags; - -#ifdef COFF_IMAGE_WITH_PE - if (aouthdr) - { - pe->pe_opthdr = ((struct internal_aouthdr *)aouthdr)->pe; - } -#endif - - return (PTR) pe; -} - - - -/* Copy any private info we understand from the input bfd - to the output bfd. */ - -#define coff_bfd_copy_private_bfd_data pe_bfd_copy_private_bfd_data - -static boolean -pe_bfd_copy_private_bfd_data (ibfd, obfd) - bfd *ibfd, *obfd; -{ - /* One day we may try to grok other private data. */ - if (ibfd->xvec->flavour != bfd_target_coff_flavour - || obfd->xvec->flavour != bfd_target_coff_flavour) - return true; - - pe_data(obfd)->pe_opthdr = pe_data (ibfd)->pe_opthdr; - - return true; -} diff --git a/contrib/gdb/bfd/ptrace-core.c b/contrib/gdb/bfd/ptrace-core.c deleted file mode 100644 index e356457e8fbc6..0000000000000 --- a/contrib/gdb/bfd/ptrace-core.c +++ /dev/null @@ -1,233 +0,0 @@ -/* BFD backend for core files which use the ptrace_user structure - Copyright 1993, 1994 Free Software Foundation, Inc. - The structure of this file is based on trad-core.c written by John Gilmore - of Cygnus Support. - Modified to work with the ptrace_user structure by Kevin A. Buettner. - (Longterm it may be better to merge this file with trad-core.c) - -This file is part of BFD, the Binary File Descriptor library. - -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 2 of the License, 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ - -#ifdef PTRACE_CORE - -#include "bfd.h" -#include "sysdep.h" -#include "libbfd.h" - -#include <stdio.h> -#include <sys/types.h> -#include <sys/param.h> -#include <sys/dir.h> -#include <signal.h> -#include <errno.h> -#include <unistd.h> -#include <sys/ptrace.h> - - -struct trad_core_struct - { - asection *data_section; - asection *stack_section; - asection *reg_section; - struct ptrace_user u; - }; - -#define core_upage(bfd) (&((bfd)->tdata.trad_core_data->u)) -#define core_datasec(bfd) ((bfd)->tdata.trad_core_data->data_section) -#define core_stacksec(bfd) ((bfd)->tdata.trad_core_data->stack_section) -#define core_regsec(bfd) ((bfd)->tdata.trad_core_data->reg_section) - -/* forward declarations */ - -const bfd_target *ptrace_unix_core_file_p PARAMS ((bfd *abfd)); -char * ptrace_unix_core_file_failing_command PARAMS ((bfd *abfd)); -int ptrace_unix_core_file_failing_signal PARAMS ((bfd *abfd)); -boolean ptrace_unix_core_file_matches_executable_p - PARAMS ((bfd *core_bfd, bfd *exec_bfd)); - -/* ARGSUSED */ -const bfd_target * -ptrace_unix_core_file_p (abfd) - bfd *abfd; - -{ - int val; - struct ptrace_user u; - struct trad_core_struct *rawptr; - - val = bfd_read ((void *)&u, 1, sizeof u, abfd); - if (val != sizeof u || u.pt_magic != _BCS_PTRACE_MAGIC - || u.pt_rev != _BCS_PTRACE_REV) - { - /* Too small to be a core file */ - bfd_set_error (bfd_error_wrong_format); - return 0; - } - - /* OK, we believe you. You're a core file (sure, sure). */ - - /* Allocate both the upage and the struct core_data at once, so - a single free() will free them both. */ - rawptr = (struct trad_core_struct *) - bfd_zalloc (abfd, sizeof (struct trad_core_struct)); - - if (rawptr == NULL) - return 0; - - abfd->tdata.trad_core_data = rawptr; - - rawptr->u = u; /*Copy the uarea into the tdata part of the bfd */ - - /* Create the sections. This is raunchy, but bfd_close wants to free - them separately. */ - - core_stacksec (abfd) = (asection *) bfd_zalloc (abfd, sizeof (asection)); - if (core_stacksec (abfd) == NULL) - return NULL; - core_datasec (abfd) = (asection *) bfd_zalloc (abfd, sizeof (asection)); - if (core_datasec (abfd) == NULL) - return NULL; - core_regsec (abfd) = (asection *) bfd_zalloc (abfd, sizeof (asection)); - if (core_regsec (abfd) == NULL) - return NULL; - - core_stacksec (abfd)->name = ".stack"; - core_datasec (abfd)->name = ".data"; - core_regsec (abfd)->name = ".reg"; - - /* FIXME: Need to worry about shared memory, library data, and library - text. I don't think that any of these things are supported on the - system on which I am developing this for though. */ - - - core_stacksec (abfd)->flags = SEC_ALLOC + SEC_LOAD + SEC_HAS_CONTENTS; - core_datasec (abfd)->flags = SEC_ALLOC + SEC_LOAD + SEC_HAS_CONTENTS; - core_regsec (abfd)->flags = SEC_HAS_CONTENTS; - - core_datasec (abfd)->_raw_size = u.pt_dsize; - core_stacksec (abfd)->_raw_size = u.pt_ssize; - core_regsec (abfd)->_raw_size = sizeof(u); - - core_datasec (abfd)->vma = u.pt_o_data_start; - core_stacksec (abfd)->vma = USRSTACK - u.pt_ssize; - core_regsec (abfd)->vma = 0 - sizeof(u); /* see trad-core.c */ - - core_datasec (abfd)->filepos = (int) u.pt_dataptr; - core_stacksec (abfd)->filepos = (int) (u.pt_dataptr + u.pt_dsize); - core_regsec (abfd)->filepos = 0; /* Register segment is ptrace_user */ - - /* Align to word at least */ - core_stacksec (abfd)->alignment_power = 2; - core_datasec (abfd)->alignment_power = 2; - core_regsec (abfd)->alignment_power = 2; - - abfd->sections = core_stacksec (abfd); - core_stacksec (abfd)->next = core_datasec (abfd); - core_datasec (abfd)->next = core_regsec (abfd); - abfd->section_count = 3; - - return abfd->xvec; -} - -char * -ptrace_unix_core_file_failing_command (abfd) - bfd *abfd; -{ - char *com = abfd->tdata.trad_core_data->u.pt_comm; - if (*com) - return com; - else - return 0; -} - -/* ARGSUSED */ -int -ptrace_unix_core_file_failing_signal (abfd) - bfd *abfd; -{ - return abfd->tdata.trad_core_data->u.pt_sigframe.sig_num; -} - -/* ARGSUSED */ -boolean -ptrace_unix_core_file_matches_executable_p (core_bfd, exec_bfd) - bfd *core_bfd, *exec_bfd; -{ - /* FIXME: Use pt_timdat field of the ptrace_user structure to match - the date of the executable */ - return true; -} - -/* If somebody calls any byte-swapping routines, shoot them. */ -void -swap_abort() -{ - abort(); /* This way doesn't require any declaration for ANSI to fuck up */ -} -#define NO_GET ((bfd_vma (*) PARAMS (( const bfd_byte *))) swap_abort ) -#define NO_PUT ((void (*) PARAMS ((bfd_vma, bfd_byte *))) swap_abort ) -#define NO_SIGNED_GET \ - ((bfd_signed_vma (*) PARAMS ((const bfd_byte *))) swap_abort ) - -const bfd_target ptrace_core_vec = - { - "trad-core", - bfd_target_unknown_flavour, - BFD_ENDIAN_UNKNOWN, /* target byte order */ - BFD_ENDIAN_UNKNOWN, /* target headers byte order */ - (HAS_RELOC | EXEC_P | /* object flags */ - HAS_LINENO | HAS_DEBUG | - HAS_SYMS | HAS_LOCALS | WP_TEXT | D_PAGED), - (SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD | SEC_RELOC), /* section flags */ - 0, /* symbol prefix */ - ' ', /* ar_pad_char */ - 16, /* ar_max_namelen */ - NO_GET, NO_SIGNED_GET, NO_PUT, /* 64 bit data */ - NO_GET, NO_SIGNED_GET, NO_PUT, /* 32 bit data */ - NO_GET, NO_SIGNED_GET, NO_PUT, /* 16 bit data */ - NO_GET, NO_SIGNED_GET, NO_PUT, /* 64 bit hdrs */ - NO_GET, NO_SIGNED_GET, NO_PUT, /* 32 bit hdrs */ - NO_GET, NO_SIGNED_GET, NO_PUT, /* 16 bit hdrs */ - - { /* bfd_check_format */ - _bfd_dummy_target, /* unknown format */ - _bfd_dummy_target, /* object file */ - _bfd_dummy_target, /* archive */ - ptrace_unix_core_file_p /* a core file */ - }, - { /* bfd_set_format */ - bfd_false, bfd_false, - bfd_false, bfd_false - }, - { /* bfd_write_contents */ - bfd_false, bfd_false, - bfd_false, bfd_false - }, - - BFD_JUMP_TABLE_GENERIC (_bfd_generic), - BFD_JUMP_TABLE_COPY (_bfd_generic), - BFD_JUMP_TABLE_CORE (ptrace_unix), - BFD_JUMP_TABLE_ARCHIVE (_bfd_noarchive), - BFD_JUMP_TABLE_SYMBOLS (_bfd_nosymbols), - BFD_JUMP_TABLE_RELOCS (_bfd_norelocs), - BFD_JUMP_TABLE_WRITE (_bfd_generic), - BFD_JUMP_TABLE_LINK (_bfd_nolink), - BFD_JUMP_TABLE_DYNAMIC (_bfd_nodynamic), - - (PTR) 0 /* backend_data */ -}; - -#endif /* PTRACE_CORE */ diff --git a/contrib/gdb/bfd/reloc.c b/contrib/gdb/bfd/reloc.c deleted file mode 100644 index 46ed5c2d9228c..0000000000000 --- a/contrib/gdb/bfd/reloc.c +++ /dev/null @@ -1,2391 +0,0 @@ -/* BFD support for handling relocation entries. - Copyright (C) 1990, 91, 92, 93, 94, 1995 Free Software Foundation, Inc. - Written by Cygnus Support. - -This file is part of BFD, the Binary File Descriptor library. - -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 2 of the License, 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ - -/* -SECTION - Relocations - - BFD maintains relocations in much the same way it maintains - symbols: they are left alone until required, then read in - en-mass and translated into an internal form. A common - routine <<bfd_perform_relocation>> acts upon the - canonical form to do the fixup. - - Relocations are maintained on a per section basis, - while symbols are maintained on a per BFD basis. - - All that a back end has to do to fit the BFD interface is to create - a <<struct reloc_cache_entry>> for each relocation - in a particular section, and fill in the right bits of the structures. - -@menu -@* typedef arelent:: -@* howto manager:: -@end menu - -*/ - -/* DO compile in the reloc_code name table from libbfd.h. */ -#define _BFD_MAKE_TABLE_bfd_reloc_code_real - -#include "bfd.h" -#include "sysdep.h" -#include "bfdlink.h" -#include "libbfd.h" -/* -DOCDD -INODE - typedef arelent, howto manager, Relocations, Relocations - -SUBSECTION - typedef arelent - - This is the structure of a relocation entry: - -CODE_FRAGMENT -. -.typedef enum bfd_reloc_status -.{ -. {* No errors detected *} -. bfd_reloc_ok, -. -. {* The relocation was performed, but there was an overflow. *} -. bfd_reloc_overflow, -. -. {* The address to relocate was not within the section supplied. *} -. bfd_reloc_outofrange, -. -. {* Used by special functions *} -. bfd_reloc_continue, -. -. {* Unsupported relocation size requested. *} -. bfd_reloc_notsupported, -. -. {* Unused *} -. bfd_reloc_other, -. -. {* The symbol to relocate against was undefined. *} -. bfd_reloc_undefined, -. -. {* The relocation was performed, but may not be ok - presently -. generated only when linking i960 coff files with i960 b.out -. symbols. If this type is returned, the error_message argument -. to bfd_perform_relocation will be set. *} -. bfd_reloc_dangerous -. } -. bfd_reloc_status_type; -. -. -.typedef struct reloc_cache_entry -.{ -. {* A pointer into the canonical table of pointers *} -. struct symbol_cache_entry **sym_ptr_ptr; -. -. {* offset in section *} -. bfd_size_type address; -. -. {* addend for relocation value *} -. bfd_vma addend; -. -. {* Pointer to how to perform the required relocation *} -. reloc_howto_type *howto; -. -.} arelent; - -*/ - -/* -DESCRIPTION - - Here is a description of each of the fields within an <<arelent>>: - - o <<sym_ptr_ptr>> - - The symbol table pointer points to a pointer to the symbol - associated with the relocation request. It is - the pointer into the table returned by the back end's - <<get_symtab>> action. @xref{Symbols}. The symbol is referenced - through a pointer to a pointer so that tools like the linker - can fix up all the symbols of the same name by modifying only - one pointer. The relocation routine looks in the symbol and - uses the base of the section the symbol is attached to and the - value of the symbol as the initial relocation offset. If the - symbol pointer is zero, then the section provided is looked up. - - o <<address>> - - The <<address>> field gives the offset in bytes from the base of - the section data which owns the relocation record to the first - byte of relocatable information. The actual data relocated - will be relative to this point; for example, a relocation - type which modifies the bottom two bytes of a four byte word - would not touch the first byte pointed to in a big endian - world. - - o <<addend>> - - The <<addend>> is a value provided by the back end to be added (!) - to the relocation offset. Its interpretation is dependent upon - the howto. For example, on the 68k the code: - - -| char foo[]; -| main() -| { -| return foo[0x12345678]; -| } - - Could be compiled into: - -| linkw fp,#-4 -| moveb @@#12345678,d0 -| extbl d0 -| unlk fp -| rts - - - This could create a reloc pointing to <<foo>>, but leave the - offset in the data, something like: - - -|RELOCATION RECORDS FOR [.text]: -|offset type value -|00000006 32 _foo -| -|00000000 4e56 fffc ; linkw fp,#-4 -|00000004 1039 1234 5678 ; moveb @@#12345678,d0 -|0000000a 49c0 ; extbl d0 -|0000000c 4e5e ; unlk fp -|0000000e 4e75 ; rts - - - Using coff and an 88k, some instructions don't have enough - space in them to represent the full address range, and - pointers have to be loaded in two parts. So you'd get something like: - - -| or.u r13,r0,hi16(_foo+0x12345678) -| ld.b r2,r13,lo16(_foo+0x12345678) -| jmp r1 - - - This should create two relocs, both pointing to <<_foo>>, and with - 0x12340000 in their addend field. The data would consist of: - - -|RELOCATION RECORDS FOR [.text]: -|offset type value -|00000002 HVRT16 _foo+0x12340000 -|00000006 LVRT16 _foo+0x12340000 -| -|00000000 5da05678 ; or.u r13,r0,0x5678 -|00000004 1c4d5678 ; ld.b r2,r13,0x5678 -|00000008 f400c001 ; jmp r1 - - - The relocation routine digs out the value from the data, adds - it to the addend to get the original offset, and then adds the - value of <<_foo>>. Note that all 32 bits have to be kept around - somewhere, to cope with carry from bit 15 to bit 16. - - One further example is the sparc and the a.out format. The - sparc has a similar problem to the 88k, in that some - instructions don't have room for an entire offset, but on the - sparc the parts are created in odd sized lumps. The designers of - the a.out format chose to not use the data within the section - for storing part of the offset; all the offset is kept within - the reloc. Anything in the data should be ignored. - -| save %sp,-112,%sp -| sethi %hi(_foo+0x12345678),%g2 -| ldsb [%g2+%lo(_foo+0x12345678)],%i0 -| ret -| restore - - Both relocs contain a pointer to <<foo>>, and the offsets - contain junk. - - -|RELOCATION RECORDS FOR [.text]: -|offset type value -|00000004 HI22 _foo+0x12345678 -|00000008 LO10 _foo+0x12345678 -| -|00000000 9de3bf90 ; save %sp,-112,%sp -|00000004 05000000 ; sethi %hi(_foo+0),%g2 -|00000008 f048a000 ; ldsb [%g2+%lo(_foo+0)],%i0 -|0000000c 81c7e008 ; ret -|00000010 81e80000 ; restore - - - o <<howto>> - - The <<howto>> field can be imagined as a - relocation instruction. It is a pointer to a structure which - contains information on what to do with all of the other - information in the reloc record and data section. A back end - would normally have a relocation instruction set and turn - relocations into pointers to the correct structure on input - - but it would be possible to create each howto field on demand. - -*/ - -/* -SUBSUBSECTION - <<enum complain_overflow>> - - Indicates what sort of overflow checking should be done when - performing a relocation. - -CODE_FRAGMENT -. -.enum complain_overflow -.{ -. {* Do not complain on overflow. *} -. complain_overflow_dont, -. -. {* Complain if the bitfield overflows, whether it is considered -. as signed or unsigned. *} -. complain_overflow_bitfield, -. -. {* Complain if the value overflows when considered as signed -. number. *} -. complain_overflow_signed, -. -. {* Complain if the value overflows when considered as an -. unsigned number. *} -. complain_overflow_unsigned -.}; - -*/ - -/* -SUBSUBSECTION - <<reloc_howto_type>> - - The <<reloc_howto_type>> is a structure which contains all the - information that libbfd needs to know to tie up a back end's data. - -CODE_FRAGMENT -.struct symbol_cache_entry; {* Forward declaration *} -. -.struct reloc_howto_struct -.{ -. {* The type field has mainly a documetary use - the back end can -. do what it wants with it, though normally the back end's -. external idea of what a reloc number is stored -. in this field. For example, a PC relative word relocation -. in a coff environment has the type 023 - because that's -. what the outside world calls a R_PCRWORD reloc. *} -. unsigned int type; -. -. {* The value the final relocation is shifted right by. This drops -. unwanted data from the relocation. *} -. unsigned int rightshift; -. -. {* The size of the item to be relocated. This is *not* a -. power-of-two measure. To get the number of bytes operated -. on by a type of relocation, use bfd_get_reloc_size. *} -. int size; -. -. {* The number of bits in the item to be relocated. This is used -. when doing overflow checking. *} -. unsigned int bitsize; -. -. {* Notes that the relocation is relative to the location in the -. data section of the addend. The relocation function will -. subtract from the relocation value the address of the location -. being relocated. *} -. boolean pc_relative; -. -. {* The bit position of the reloc value in the destination. -. The relocated value is left shifted by this amount. *} -. unsigned int bitpos; -. -. {* What type of overflow error should be checked for when -. relocating. *} -. enum complain_overflow complain_on_overflow; -. -. {* If this field is non null, then the supplied function is -. called rather than the normal function. This allows really -. strange relocation methods to be accomodated (e.g., i960 callj -. instructions). *} -. bfd_reloc_status_type (*special_function) -. PARAMS ((bfd *abfd, -. arelent *reloc_entry, -. struct symbol_cache_entry *symbol, -. PTR data, -. asection *input_section, -. bfd *output_bfd, -. char **error_message)); -. -. {* The textual name of the relocation type. *} -. char *name; -. -. {* When performing a partial link, some formats must modify the -. relocations rather than the data - this flag signals this.*} -. boolean partial_inplace; -. -. {* The src_mask selects which parts of the read in data -. are to be used in the relocation sum. E.g., if this was an 8 bit -. bit of data which we read and relocated, this would be -. 0x000000ff. When we have relocs which have an addend, such as -. sun4 extended relocs, the value in the offset part of a -. relocating field is garbage so we never use it. In this case -. the mask would be 0x00000000. *} -. bfd_vma src_mask; -. -. {* The dst_mask selects which parts of the instruction are replaced -. into the instruction. In most cases src_mask == dst_mask, -. except in the above special case, where dst_mask would be -. 0x000000ff, and src_mask would be 0x00000000. *} -. bfd_vma dst_mask; -. -. {* When some formats create PC relative instructions, they leave -. the value of the pc of the place being relocated in the offset -. slot of the instruction, so that a PC relative relocation can -. be made just by adding in an ordinary offset (e.g., sun3 a.out). -. Some formats leave the displacement part of an instruction -. empty (e.g., m88k bcs); this flag signals the fact.*} -. boolean pcrel_offset; -. -.}; - -*/ - -/* -FUNCTION - The HOWTO Macro - -DESCRIPTION - The HOWTO define is horrible and will go away. - - -.#define HOWTO(C, R,S,B, P, BI, O, SF, NAME, INPLACE, MASKSRC, MASKDST, PC) \ -. {(unsigned)C,R,S,B, P, BI, O,SF,NAME,INPLACE,MASKSRC,MASKDST,PC} - -DESCRIPTION - And will be replaced with the totally magic way. But for the - moment, we are compatible, so do it this way. - - -.#define NEWHOWTO( FUNCTION, NAME,SIZE,REL,IN) HOWTO(0,0,SIZE,0,REL,0,complain_overflow_dont,FUNCTION, NAME,false,0,0,IN) -. -DESCRIPTION - Helper routine to turn a symbol into a relocation value. - -.#define HOWTO_PREPARE(relocation, symbol) \ -. { \ -. if (symbol != (asymbol *)NULL) { \ -. if (bfd_is_com_section (symbol->section)) { \ -. relocation = 0; \ -. } \ -. else { \ -. relocation = symbol->value; \ -. } \ -. } \ -.} - -*/ - -/* -FUNCTION - bfd_get_reloc_size - -SYNOPSIS - int bfd_get_reloc_size (reloc_howto_type *); - -DESCRIPTION - For a reloc_howto_type that operates on a fixed number of bytes, - this returns the number of bytes operated on. - */ - -int -bfd_get_reloc_size (howto) - reloc_howto_type *howto; -{ - switch (howto->size) - { - case 0: return 1; - case 1: return 2; - case 2: return 4; - case 3: return 0; - case 4: return 8; - case -2: return 4; - default: abort (); - } -} - -/* -TYPEDEF - arelent_chain - -DESCRIPTION - - How relocs are tied together in an <<asection>>: - -.typedef struct relent_chain { -. arelent relent; -. struct relent_chain *next; -.} arelent_chain; - -*/ - - - -/* -FUNCTION - bfd_perform_relocation - -SYNOPSIS - bfd_reloc_status_type - bfd_perform_relocation - (bfd *abfd, - arelent *reloc_entry, - PTR data, - asection *input_section, - bfd *output_bfd, - char **error_message); - -DESCRIPTION - If @var{output_bfd} is supplied to this function, the - generated image will be relocatable; the relocations are - copied to the output file after they have been changed to - reflect the new state of the world. There are two ways of - reflecting the results of partial linkage in an output file: - by modifying the output data in place, and by modifying the - relocation record. Some native formats (e.g., basic a.out and - basic coff) have no way of specifying an addend in the - relocation type, so the addend has to go in the output data. - This is no big deal since in these formats the output data - slot will always be big enough for the addend. Complex reloc - types with addends were invented to solve just this problem. - The @var{error_message} argument is set to an error message if - this return @code{bfd_reloc_dangerous}. - -*/ - - -bfd_reloc_status_type -bfd_perform_relocation (abfd, reloc_entry, data, input_section, output_bfd, - error_message) - bfd *abfd; - arelent *reloc_entry; - PTR data; - asection *input_section; - bfd *output_bfd; - char **error_message; -{ - bfd_vma relocation; - bfd_reloc_status_type flag = bfd_reloc_ok; - bfd_size_type addr = reloc_entry->address; - bfd_vma output_base = 0; - reloc_howto_type *howto = reloc_entry->howto; - asection *reloc_target_output_section; - asymbol *symbol; - - symbol = *(reloc_entry->sym_ptr_ptr); - if (bfd_is_abs_section (symbol->section) - && output_bfd != (bfd *) NULL) - { - reloc_entry->address += input_section->output_offset; - return bfd_reloc_ok; - } - - /* If we are not producing relocateable output, return an error if - the symbol is not defined. An undefined weak symbol is - considered to have a value of zero (SVR4 ABI, p. 4-27). */ - if (bfd_is_und_section (symbol->section) - && (symbol->flags & BSF_WEAK) == 0 - && output_bfd == (bfd *) NULL) - flag = bfd_reloc_undefined; - - /* If there is a function supplied to handle this relocation type, - call it. It'll return `bfd_reloc_continue' if further processing - can be done. */ - if (howto->special_function) - { - bfd_reloc_status_type cont; - cont = howto->special_function (abfd, reloc_entry, symbol, data, - input_section, output_bfd, - error_message); - if (cont != bfd_reloc_continue) - return cont; - } - - /* Is the address of the relocation really within the section? */ - if (reloc_entry->address > input_section->_cooked_size) - return bfd_reloc_outofrange; - - /* Work out which section the relocation is targetted at and the - initial relocation command value. */ - - /* Get symbol value. (Common symbols are special.) */ - if (bfd_is_com_section (symbol->section)) - relocation = 0; - else - relocation = symbol->value; - - - reloc_target_output_section = symbol->section->output_section; - - /* Convert input-section-relative symbol value to absolute. */ - if (output_bfd && howto->partial_inplace == false) - output_base = 0; - else - output_base = reloc_target_output_section->vma; - - relocation += output_base + symbol->section->output_offset; - - /* Add in supplied addend. */ - relocation += reloc_entry->addend; - - /* Here the variable relocation holds the final address of the - symbol we are relocating against, plus any addend. */ - - if (howto->pc_relative == true) - { - /* This is a PC relative relocation. We want to set RELOCATION - to the distance between the address of the symbol and the - location. RELOCATION is already the address of the symbol. - - We start by subtracting the address of the section containing - the location. - - If pcrel_offset is set, we must further subtract the position - of the location within the section. Some targets arrange for - the addend to be the negative of the position of the location - within the section; for example, i386-aout does this. For - i386-aout, pcrel_offset is false. Some other targets do not - include the position of the location; for example, m88kbcs, - or ELF. For those targets, pcrel_offset is true. - - If we are producing relocateable output, then we must ensure - that this reloc will be correctly computed when the final - relocation is done. If pcrel_offset is false we want to wind - up with the negative of the location within the section, - which means we must adjust the existing addend by the change - in the location within the section. If pcrel_offset is true - we do not want to adjust the existing addend at all. - - FIXME: This seems logical to me, but for the case of - producing relocateable output it is not what the code - actually does. I don't want to change it, because it seems - far too likely that something will break. */ - - relocation -= - input_section->output_section->vma + input_section->output_offset; - - if (howto->pcrel_offset == true) - relocation -= reloc_entry->address; - } - - if (output_bfd != (bfd *) NULL) - { - if (howto->partial_inplace == false) - { - /* This is a partial relocation, and we want to apply the relocation - to the reloc entry rather than the raw data. Modify the reloc - inplace to reflect what we now know. */ - reloc_entry->addend = relocation; - reloc_entry->address += input_section->output_offset; - return flag; - } - else - { - /* This is a partial relocation, but inplace, so modify the - reloc record a bit. - - If we've relocated with a symbol with a section, change - into a ref to the section belonging to the symbol. */ - - reloc_entry->address += input_section->output_offset; - - /* WTF?? */ - if (abfd->xvec->flavour == bfd_target_coff_flavour - && strcmp (abfd->xvec->name, "aixcoff-rs6000") != 0 - && strcmp (abfd->xvec->name, "coff-Intel-little") != 0 - && strcmp (abfd->xvec->name, "coff-Intel-big") != 0) - { -#if 1 - /* For m68k-coff, the addend was being subtracted twice during - relocation with -r. Removing the line below this comment - fixes that problem; see PR 2953. - -However, Ian wrote the following, regarding removing the line below, -which explains why it is still enabled: --djm - -If you put a patch like that into BFD you need to check all the COFF -linkers. I am fairly certain that patch will break coff-i386 (e.g., -SCO); see coff_i386_reloc in coff-i386.c where I worked around the -problem in a different way. There may very well be a reason that the -code works as it does. - -Hmmm. The first obvious point is that bfd_perform_relocation should -not have any tests that depend upon the flavour. It's seem like -entirely the wrong place for such a thing. The second obvious point -is that the current code ignores the reloc addend when producing -relocateable output for COFF. That's peculiar. In fact, I really -have no idea what the point of the line you want to remove is. - -A typical COFF reloc subtracts the old value of the symbol and adds in -the new value to the location in the object file (if it's a pc -relative reloc it adds the difference between the symbol value and the -location). When relocating we need to preserve that property. - -BFD handles this by setting the addend to the negative of the old -value of the symbol. Unfortunately it handles common symbols in a -non-standard way (it doesn't subtract the old value) but that's a -different story (we can't change it without losing backward -compatibility with old object files) (coff-i386 does subtract the old -value, to be compatible with existing coff-i386 targets, like SCO). - -So everything works fine when not producing relocateable output. When -we are producing relocateable output, logically we should do exactly -what we do when not producing relocateable output. Therefore, your -patch is correct. In fact, it should probably always just set -reloc_entry->addend to 0 for all cases, since it is, in fact, going to -add the value into the object file. This won't hurt the COFF code, -which doesn't use the addend; I'm not sure what it will do to other -formats (the thing to check for would be whether any formats both use -the addend and set partial_inplace). - -When I wanted to make coff-i386 produce relocateable output, I ran -into the problem that you are running into: I wanted to remove that -line. Rather than risk it, I made the coff-i386 relocs use a special -function; it's coff_i386_reloc in coff-i386.c. The function -specifically adds the addend field into the object file, knowing that -bfd_perform_relocation is not going to. If you remove that line, then -coff-i386.c will wind up adding the addend field in twice. It's -trivial to fix; it just needs to be done. - -The problem with removing the line is just that it may break some -working code. With BFD it's hard to be sure of anything. The right -way to deal with this is simply to build and test at least all the -supported COFF targets. It should be straightforward if time and disk -space consuming. For each target: - 1) build the linker - 2) generate some executable, and link it using -r (I would - probably use paranoia.o and link against newlib/libc.a, which - for all the supported targets would be available in - /usr/cygnus/progressive/H-host/target/lib/libc.a). - 3) make the change to reloc.c - 4) rebuild the linker - 5) repeat step 2 - 6) if the resulting object files are the same, you have at least - made it no worse - 7) if they are different you have to figure out which version is - right -*/ - relocation -= reloc_entry->addend; -#endif - reloc_entry->addend = 0; - } - else - { - reloc_entry->addend = relocation; - } - } - } - else - { - reloc_entry->addend = 0; - } - - /* FIXME: This overflow checking is incomplete, because the value - might have overflowed before we get here. For a correct check we - need to compute the value in a size larger than bitsize, but we - can't reasonably do that for a reloc the same size as a host - machine word. - FIXME: We should also do overflow checking on the result after - adding in the value contained in the object file. */ - if (howto->complain_on_overflow != complain_overflow_dont - && flag == bfd_reloc_ok) - { - bfd_vma check; - - /* Get the value that will be used for the relocation, but - starting at bit position zero. */ - check = relocation >> howto->rightshift; - switch (howto->complain_on_overflow) - { - case complain_overflow_signed: - { - /* Assumes two's complement. */ - bfd_signed_vma reloc_signed_max = (1 << (howto->bitsize - 1)) - 1; - bfd_signed_vma reloc_signed_min = ~reloc_signed_max; - - /* The above right shift is incorrect for a signed value. - Fix it up by forcing on the upper bits. */ - if (howto->rightshift > 0 - && (bfd_signed_vma) relocation < 0) - check |= ((bfd_vma) - 1 - & ~((bfd_vma) - 1 - >> howto->rightshift)); - if ((bfd_signed_vma) check > reloc_signed_max - || (bfd_signed_vma) check < reloc_signed_min) - flag = bfd_reloc_overflow; - } - break; - case complain_overflow_unsigned: - { - /* Assumes two's complement. This expression avoids - overflow if howto->bitsize is the number of bits in - bfd_vma. */ - bfd_vma reloc_unsigned_max = - (((1 << (howto->bitsize - 1)) - 1) << 1) | 1; - - if ((bfd_vma) check > reloc_unsigned_max) - flag = bfd_reloc_overflow; - } - break; - case complain_overflow_bitfield: - { - /* Assumes two's complement. This expression avoids - overflow if howto->bitsize is the number of bits in - bfd_vma. */ - bfd_vma reloc_bits = (((1 << (howto->bitsize - 1)) - 1) << 1) | 1; - - if (((bfd_vma) check & ~reloc_bits) != 0 - && ((bfd_vma) check & ~reloc_bits) != (-1 & ~reloc_bits)) - { - /* The above right shift is incorrect for a signed - value. See if turning on the upper bits fixes the - overflow. */ - if (howto->rightshift > 0 - && (bfd_signed_vma) relocation < 0) - { - check |= ((bfd_vma) - 1 - & ~((bfd_vma) - 1 - >> howto->rightshift)); - if (((bfd_vma) check & ~reloc_bits) != (-1 & ~reloc_bits)) - flag = bfd_reloc_overflow; - } - else - flag = bfd_reloc_overflow; - } - } - break; - default: - abort (); - } - } - - /* - Either we are relocating all the way, or we don't want to apply - the relocation to the reloc entry (probably because there isn't - any room in the output format to describe addends to relocs) - */ - - /* The cast to bfd_vma avoids a bug in the Alpha OSF/1 C compiler - (OSF version 1.3, compiler version 3.11). It miscompiles the - following program: - - struct str - { - unsigned int i0; - } s = { 0 }; - - int - main () - { - unsigned long x; - - x = 0x100000000; - x <<= (unsigned long) s.i0; - if (x == 0) - printf ("failed\n"); - else - printf ("succeeded (%lx)\n", x); - } - */ - - relocation >>= (bfd_vma) howto->rightshift; - - /* Shift everything up to where it's going to be used */ - - relocation <<= (bfd_vma) howto->bitpos; - - /* Wait for the day when all have the mask in them */ - - /* What we do: - i instruction to be left alone - o offset within instruction - r relocation offset to apply - S src mask - D dst mask - N ~dst mask - A part 1 - B part 2 - R result - - Do this: - i i i i i o o o o o from bfd_get<size> - and S S S S S to get the size offset we want - + r r r r r r r r r r to get the final value to place - and D D D D D to chop to right size - ----------------------- - A A A A A - And this: - ... i i i i i o o o o o from bfd_get<size> - and N N N N N get instruction - ----------------------- - ... B B B B B - - And then: - B B B B B - or A A A A A - ----------------------- - R R R R R R R R R R put into bfd_put<size> - */ - -#define DOIT(x) \ - x = ( (x & ~howto->dst_mask) | (((x & howto->src_mask) + relocation) & howto->dst_mask)) - - switch (howto->size) - { - case 0: - { - char x = bfd_get_8 (abfd, (char *) data + addr); - DOIT (x); - bfd_put_8 (abfd, x, (unsigned char *) data + addr); - } - break; - - case 1: - if (relocation) - { - short x = bfd_get_16 (abfd, (bfd_byte *) data + addr); - DOIT (x); - bfd_put_16 (abfd, x, (unsigned char *) data + addr); - } - break; - case 2: - if (relocation) - { - long x = bfd_get_32 (abfd, (bfd_byte *) data + addr); - DOIT (x); - bfd_put_32 (abfd, x, (bfd_byte *) data + addr); - } - break; - case -2: - { - long x = bfd_get_32 (abfd, (bfd_byte *) data + addr); - relocation = -relocation; - DOIT (x); - bfd_put_32 (abfd, x, (bfd_byte *) data + addr); - } - break; - - case -1: - { - long x = bfd_get_16 (abfd, (bfd_byte *) data + addr); - relocation = -relocation; - DOIT (x); - bfd_put_16 (abfd, x, (bfd_byte *) data + addr); - } - break; - - case 3: - /* Do nothing */ - break; - - case 4: -#ifdef BFD64 - if (relocation) - { - bfd_vma x = bfd_get_64 (abfd, (bfd_byte *) data + addr); - DOIT (x); - bfd_put_64 (abfd, x, (bfd_byte *) data + addr); - } -#else - abort (); -#endif - break; - default: - return bfd_reloc_other; - } - - return flag; -} - -/* -FUNCTION - bfd_install_relocation - -SYNOPSIS - bfd_reloc_status_type - bfd_install_relocation - (bfd *abfd, - arelent *reloc_entry, - PTR data, bfd_vma data_start, - asection *input_section, - char **error_message); - -DESCRIPTION - This looks remarkably like <<bfd_perform_relocation>>, except it - does not expect that the section contents have been filled in. - I.e., it's suitable for use when creating, rather than applying - a relocation. - - For now, this function should be considered reserved for the - assembler. - -*/ - - -bfd_reloc_status_type -bfd_install_relocation (abfd, reloc_entry, data_start, data_start_offset, - input_section, error_message) - bfd *abfd; - arelent *reloc_entry; - PTR data_start; - bfd_vma data_start_offset; - asection *input_section; - char **error_message; -{ - bfd_vma relocation; - bfd_reloc_status_type flag = bfd_reloc_ok; - bfd_size_type addr = reloc_entry->address; - bfd_vma output_base = 0; - reloc_howto_type *howto = reloc_entry->howto; - asection *reloc_target_output_section; - asymbol *symbol; - bfd_byte *data; - - symbol = *(reloc_entry->sym_ptr_ptr); - if (bfd_is_abs_section (symbol->section)) - { - reloc_entry->address += input_section->output_offset; - return bfd_reloc_ok; - } - - /* If there is a function supplied to handle this relocation type, - call it. It'll return `bfd_reloc_continue' if further processing - can be done. */ - if (howto->special_function) - { - bfd_reloc_status_type cont; - /* XXX - The special_function calls haven't been fixed up to deal - with creating new relocations and section contents. */ - cont = howto->special_function (abfd, reloc_entry, symbol, - /* XXX - Non-portable! */ - ((bfd_byte *) data_start - - data_start_offset), - input_section, abfd, error_message); - if (cont != bfd_reloc_continue) - return cont; - } - - /* Is the address of the relocation really within the section? */ - if (reloc_entry->address > input_section->_cooked_size) - return bfd_reloc_outofrange; - - /* Work out which section the relocation is targetted at and the - initial relocation command value. */ - - /* Get symbol value. (Common symbols are special.) */ - if (bfd_is_com_section (symbol->section)) - relocation = 0; - else - relocation = symbol->value; - - - reloc_target_output_section = symbol->section->output_section; - - /* Convert input-section-relative symbol value to absolute. */ - if (howto->partial_inplace == false) - output_base = 0; - else - output_base = reloc_target_output_section->vma; - - relocation += output_base + symbol->section->output_offset; - - /* Add in supplied addend. */ - relocation += reloc_entry->addend; - - /* Here the variable relocation holds the final address of the - symbol we are relocating against, plus any addend. */ - - if (howto->pc_relative == true) - { - /* This is a PC relative relocation. We want to set RELOCATION - to the distance between the address of the symbol and the - location. RELOCATION is already the address of the symbol. - - We start by subtracting the address of the section containing - the location. - - If pcrel_offset is set, we must further subtract the position - of the location within the section. Some targets arrange for - the addend to be the negative of the position of the location - within the section; for example, i386-aout does this. For - i386-aout, pcrel_offset is false. Some other targets do not - include the position of the location; for example, m88kbcs, - or ELF. For those targets, pcrel_offset is true. - - If we are producing relocateable output, then we must ensure - that this reloc will be correctly computed when the final - relocation is done. If pcrel_offset is false we want to wind - up with the negative of the location within the section, - which means we must adjust the existing addend by the change - in the location within the section. If pcrel_offset is true - we do not want to adjust the existing addend at all. - - FIXME: This seems logical to me, but for the case of - producing relocateable output it is not what the code - actually does. I don't want to change it, because it seems - far too likely that something will break. */ - - relocation -= - input_section->output_section->vma + input_section->output_offset; - - if (howto->pcrel_offset == true && howto->partial_inplace == true) - relocation -= reloc_entry->address; - } - - if (howto->partial_inplace == false) - { - /* This is a partial relocation, and we want to apply the relocation - to the reloc entry rather than the raw data. Modify the reloc - inplace to reflect what we now know. */ - reloc_entry->addend = relocation; - reloc_entry->address += input_section->output_offset; - return flag; - } - else - { - /* This is a partial relocation, but inplace, so modify the - reloc record a bit. - - If we've relocated with a symbol with a section, change - into a ref to the section belonging to the symbol. */ - - reloc_entry->address += input_section->output_offset; - - /* WTF?? */ - if (abfd->xvec->flavour == bfd_target_coff_flavour - && strcmp (abfd->xvec->name, "aixcoff-rs6000") != 0 - && strcmp (abfd->xvec->name, "coff-Intel-little") != 0 - && strcmp (abfd->xvec->name, "coff-Intel-big") != 0) - { -#if 1 -/* For m68k-coff, the addend was being subtracted twice during - relocation with -r. Removing the line below this comment - fixes that problem; see PR 2953. - -However, Ian wrote the following, regarding removing the line below, -which explains why it is still enabled: --djm - -If you put a patch like that into BFD you need to check all the COFF -linkers. I am fairly certain that patch will break coff-i386 (e.g., -SCO); see coff_i386_reloc in coff-i386.c where I worked around the -problem in a different way. There may very well be a reason that the -code works as it does. - -Hmmm. The first obvious point is that bfd_install_relocation should -not have any tests that depend upon the flavour. It's seem like -entirely the wrong place for such a thing. The second obvious point -is that the current code ignores the reloc addend when producing -relocateable output for COFF. That's peculiar. In fact, I really -have no idea what the point of the line you want to remove is. - -A typical COFF reloc subtracts the old value of the symbol and adds in -the new value to the location in the object file (if it's a pc -relative reloc it adds the difference between the symbol value and the -location). When relocating we need to preserve that property. - -BFD handles this by setting the addend to the negative of the old -value of the symbol. Unfortunately it handles common symbols in a -non-standard way (it doesn't subtract the old value) but that's a -different story (we can't change it without losing backward -compatibility with old object files) (coff-i386 does subtract the old -value, to be compatible with existing coff-i386 targets, like SCO). - -So everything works fine when not producing relocateable output. When -we are producing relocateable output, logically we should do exactly -what we do when not producing relocateable output. Therefore, your -patch is correct. In fact, it should probably always just set -reloc_entry->addend to 0 for all cases, since it is, in fact, going to -add the value into the object file. This won't hurt the COFF code, -which doesn't use the addend; I'm not sure what it will do to other -formats (the thing to check for would be whether any formats both use -the addend and set partial_inplace). - -When I wanted to make coff-i386 produce relocateable output, I ran -into the problem that you are running into: I wanted to remove that -line. Rather than risk it, I made the coff-i386 relocs use a special -function; it's coff_i386_reloc in coff-i386.c. The function -specifically adds the addend field into the object file, knowing that -bfd_install_relocation is not going to. If you remove that line, then -coff-i386.c will wind up adding the addend field in twice. It's -trivial to fix; it just needs to be done. - -The problem with removing the line is just that it may break some -working code. With BFD it's hard to be sure of anything. The right -way to deal with this is simply to build and test at least all the -supported COFF targets. It should be straightforward if time and disk -space consuming. For each target: - 1) build the linker - 2) generate some executable, and link it using -r (I would - probably use paranoia.o and link against newlib/libc.a, which - for all the supported targets would be available in - /usr/cygnus/progressive/H-host/target/lib/libc.a). - 3) make the change to reloc.c - 4) rebuild the linker - 5) repeat step 2 - 6) if the resulting object files are the same, you have at least - made it no worse - 7) if they are different you have to figure out which version is - right -*/ - relocation -= reloc_entry->addend; -#endif - reloc_entry->addend = 0; - } - else - { - reloc_entry->addend = relocation; - } - } - - /* FIXME: This overflow checking is incomplete, because the value - might have overflowed before we get here. For a correct check we - need to compute the value in a size larger than bitsize, but we - can't reasonably do that for a reloc the same size as a host - machine word. - - FIXME: We should also do overflow checking on the result after - adding in the value contained in the object file. */ - if (howto->complain_on_overflow != complain_overflow_dont) - { - bfd_vma check; - - /* Get the value that will be used for the relocation, but - starting at bit position zero. */ - check = relocation >> howto->rightshift; - switch (howto->complain_on_overflow) - { - case complain_overflow_signed: - { - /* Assumes two's complement. */ - bfd_signed_vma reloc_signed_max = (1 << (howto->bitsize - 1)) - 1; - bfd_signed_vma reloc_signed_min = ~reloc_signed_max; - - /* The above right shift is incorrect for a signed value. - Fix it up by forcing on the upper bits. */ - if (howto->rightshift > 0 - && (bfd_signed_vma) relocation < 0) - check |= ((bfd_vma) - 1 - & ~((bfd_vma) - 1 - >> howto->rightshift)); - if ((bfd_signed_vma) check > reloc_signed_max - || (bfd_signed_vma) check < reloc_signed_min) - flag = bfd_reloc_overflow; - } - break; - case complain_overflow_unsigned: - { - /* Assumes two's complement. This expression avoids - overflow if howto->bitsize is the number of bits in - bfd_vma. */ - bfd_vma reloc_unsigned_max = - (((1 << (howto->bitsize - 1)) - 1) << 1) | 1; - - if ((bfd_vma) check > reloc_unsigned_max) - flag = bfd_reloc_overflow; - } - break; - case complain_overflow_bitfield: - { - /* Assumes two's complement. This expression avoids - overflow if howto->bitsize is the number of bits in - bfd_vma. */ - bfd_vma reloc_bits = (((1 << (howto->bitsize - 1)) - 1) << 1) | 1; - - if (((bfd_vma) check & ~reloc_bits) != 0 - && ((bfd_vma) check & ~reloc_bits) != (-1 & ~reloc_bits)) - { - /* The above right shift is incorrect for a signed - value. See if turning on the upper bits fixes the - overflow. */ - if (howto->rightshift > 0 - && (bfd_signed_vma) relocation < 0) - { - check |= ((bfd_vma) - 1 - & ~((bfd_vma) - 1 - >> howto->rightshift)); - if (((bfd_vma) check & ~reloc_bits) != (-1 & ~reloc_bits)) - flag = bfd_reloc_overflow; - } - else - flag = bfd_reloc_overflow; - } - } - break; - default: - abort (); - } - } - - /* - Either we are relocating all the way, or we don't want to apply - the relocation to the reloc entry (probably because there isn't - any room in the output format to describe addends to relocs) - */ - - /* The cast to bfd_vma avoids a bug in the Alpha OSF/1 C compiler - (OSF version 1.3, compiler version 3.11). It miscompiles the - following program: - - struct str - { - unsigned int i0; - } s = { 0 }; - - int - main () - { - unsigned long x; - - x = 0x100000000; - x <<= (unsigned long) s.i0; - if (x == 0) - printf ("failed\n"); - else - printf ("succeeded (%lx)\n", x); - } - */ - - relocation >>= (bfd_vma) howto->rightshift; - - /* Shift everything up to where it's going to be used */ - - relocation <<= (bfd_vma) howto->bitpos; - - /* Wait for the day when all have the mask in them */ - - /* What we do: - i instruction to be left alone - o offset within instruction - r relocation offset to apply - S src mask - D dst mask - N ~dst mask - A part 1 - B part 2 - R result - - Do this: - i i i i i o o o o o from bfd_get<size> - and S S S S S to get the size offset we want - + r r r r r r r r r r to get the final value to place - and D D D D D to chop to right size - ----------------------- - A A A A A - And this: - ... i i i i i o o o o o from bfd_get<size> - and N N N N N get instruction - ----------------------- - ... B B B B B - - And then: - B B B B B - or A A A A A - ----------------------- - R R R R R R R R R R put into bfd_put<size> - */ - -#define DOIT(x) \ - x = ( (x & ~howto->dst_mask) | (((x & howto->src_mask) + relocation) & howto->dst_mask)) - - data = (bfd_byte *) data_start + (addr - data_start_offset); - - switch (howto->size) - { - case 0: - { - char x = bfd_get_8 (abfd, (char *) data); - DOIT (x); - bfd_put_8 (abfd, x, (unsigned char *) data); - } - break; - - case 1: - if (relocation) - { - short x = bfd_get_16 (abfd, (bfd_byte *) data); - DOIT (x); - bfd_put_16 (abfd, x, (unsigned char *) data); - } - break; - case 2: - if (relocation) - { - long x = bfd_get_32 (abfd, (bfd_byte *) data); - DOIT (x); - bfd_put_32 (abfd, x, (bfd_byte *) data); - } - break; - case -2: - { - long x = bfd_get_32 (abfd, (bfd_byte *) data); - relocation = -relocation; - DOIT (x); - bfd_put_32 (abfd, x, (bfd_byte *) data); - } - break; - - case 3: - /* Do nothing */ - break; - - case 4: - if (relocation) - { - bfd_vma x = bfd_get_64 (abfd, (bfd_byte *) data); - DOIT (x); - bfd_put_64 (abfd, x, (bfd_byte *) data); - } - break; - default: - return bfd_reloc_other; - } - - return flag; -} - -/* This relocation routine is used by some of the backend linkers. - They do not construct asymbol or arelent structures, so there is no - reason for them to use bfd_perform_relocation. Also, - bfd_perform_relocation is so hacked up it is easier to write a new - function than to try to deal with it. - - This routine does a final relocation. It should not be used when - generating relocateable output. - - FIXME: This routine ignores any special_function in the HOWTO, - since the existing special_function values have been written for - bfd_perform_relocation. - - HOWTO is the reloc howto information. - INPUT_BFD is the BFD which the reloc applies to. - INPUT_SECTION is the section which the reloc applies to. - CONTENTS is the contents of the section. - ADDRESS is the address of the reloc within INPUT_SECTION. - VALUE is the value of the symbol the reloc refers to. - ADDEND is the addend of the reloc. */ - -bfd_reloc_status_type -_bfd_final_link_relocate (howto, input_bfd, input_section, contents, address, - value, addend) - reloc_howto_type *howto; - bfd *input_bfd; - asection *input_section; - bfd_byte *contents; - bfd_vma address; - bfd_vma value; - bfd_vma addend; -{ - bfd_vma relocation; - - /* Sanity check the address. */ - if (address > input_section->_cooked_size) - return bfd_reloc_outofrange; - - /* This function assumes that we are dealing with a basic relocation - against a symbol. We want to compute the value of the symbol to - relocate to. This is just VALUE, the value of the symbol, plus - ADDEND, any addend associated with the reloc. */ - relocation = value + addend; - - /* If the relocation is PC relative, we want to set RELOCATION to - the distance between the symbol (currently in RELOCATION) and the - location we are relocating. Some targets (e.g., i386-aout) - arrange for the contents of the section to be the negative of the - offset of the location within the section; for such targets - pcrel_offset is false. Other targets (e.g., m88kbcs or ELF) - simply leave the contents of the section as zero; for such - targets pcrel_offset is true. If pcrel_offset is false we do not - need to subtract out the offset of the location within the - section (which is just ADDRESS). */ - if (howto->pc_relative) - { - relocation -= (input_section->output_section->vma - + input_section->output_offset); - if (howto->pcrel_offset) - relocation -= address; - } - - return _bfd_relocate_contents (howto, input_bfd, relocation, - contents + address); -} - -/* Relocate a given location using a given value and howto. */ - -bfd_reloc_status_type -_bfd_relocate_contents (howto, input_bfd, relocation, location) - reloc_howto_type *howto; - bfd *input_bfd; - bfd_vma relocation; - bfd_byte *location; -{ - int size; - bfd_vma x; - boolean overflow; - - /* If the size is negative, negate RELOCATION. This isn't very - general. */ - if (howto->size < 0) - relocation = -relocation; - - /* Get the value we are going to relocate. */ - size = bfd_get_reloc_size (howto); - switch (size) - { - default: - case 0: - abort (); - case 1: - x = bfd_get_8 (input_bfd, location); - break; - case 2: - x = bfd_get_16 (input_bfd, location); - break; - case 4: - x = bfd_get_32 (input_bfd, location); - break; - case 8: -#ifdef BFD64 - x = bfd_get_64 (input_bfd, location); -#else - abort (); -#endif - break; - } - - /* Check for overflow. FIXME: We may drop bits during the addition - which we don't check for. We must either check at every single - operation, which would be tedious, or we must do the computations - in a type larger than bfd_vma, which would be inefficient. */ - overflow = false; - if (howto->complain_on_overflow != complain_overflow_dont) - { - bfd_vma check; - bfd_signed_vma signed_check; - bfd_vma add; - bfd_signed_vma signed_add; - - if (howto->rightshift == 0) - { - check = relocation; - signed_check = (bfd_signed_vma) relocation; - } - else - { - /* Drop unwanted bits from the value we are relocating to. */ - check = relocation >> howto->rightshift; - - /* If this is a signed value, the rightshift just dropped - leading 1 bits (assuming twos complement). */ - if ((bfd_signed_vma) relocation >= 0) - signed_check = check; - else - signed_check = (check - | ((bfd_vma) - 1 - & ~((bfd_vma) - 1 >> howto->rightshift))); - } - - /* Get the value from the object file. */ - add = x & howto->src_mask; - - /* Get the value from the object file with an appropriate sign. - The expression involving howto->src_mask isolates the upper - bit of src_mask. If that bit is set in the value we are - adding, it is negative, and we subtract out that number times - two. If src_mask includes the highest possible bit, then we - can not get the upper bit, but that does not matter since - signed_add needs no adjustment to become negative in that - case. */ - signed_add = add; - if ((add & (((~howto->src_mask) >> 1) & howto->src_mask)) != 0) - signed_add -= (((~howto->src_mask) >> 1) & howto->src_mask) << 1; - - /* Add the value from the object file, shifted so that it is a - straight number. */ - if (howto->bitpos == 0) - { - check += add; - signed_check += signed_add; - } - else - { - check += add >> howto->bitpos; - - /* For the signed case we use ADD, rather than SIGNED_ADD, - to avoid warnings from SVR4 cc. This is OK since we - explictly handle the sign bits. */ - if (signed_add >= 0) - signed_check += add >> howto->bitpos; - else - signed_check += ((add >> howto->bitpos) - | ((bfd_vma) - 1 - & ~((bfd_vma) - 1 >> howto->bitpos))); - } - - switch (howto->complain_on_overflow) - { - case complain_overflow_signed: - { - /* Assumes two's complement. */ - bfd_signed_vma reloc_signed_max = (1 << (howto->bitsize - 1)) - 1; - bfd_signed_vma reloc_signed_min = ~reloc_signed_max; - - if (signed_check > reloc_signed_max - || signed_check < reloc_signed_min) - overflow = true; - } - break; - case complain_overflow_unsigned: - { - /* Assumes two's complement. This expression avoids - overflow if howto->bitsize is the number of bits in - bfd_vma. */ - bfd_vma reloc_unsigned_max = - (((1 << (howto->bitsize - 1)) - 1) << 1) | 1; - - if (check > reloc_unsigned_max) - overflow = true; - } - break; - case complain_overflow_bitfield: - { - /* Assumes two's complement. This expression avoids - overflow if howto->bitsize is the number of bits in - bfd_vma. */ - bfd_vma reloc_bits = (((1 << (howto->bitsize - 1)) - 1) << 1) | 1; - - if ((check & ~reloc_bits) != 0 - && (((bfd_vma) signed_check & ~reloc_bits) - != (-1 & ~reloc_bits))) - overflow = true; - } - break; - default: - abort (); - } - } - - /* Put RELOCATION in the right bits. */ - relocation >>= (bfd_vma) howto->rightshift; - relocation <<= (bfd_vma) howto->bitpos; - - /* Add RELOCATION to the right bits of X. */ - x = ((x & ~howto->dst_mask) - | (((x & howto->src_mask) + relocation) & howto->dst_mask)); - - /* Put the relocated value back in the object file. */ - switch (size) - { - default: - case 0: - abort (); - case 1: - bfd_put_8 (input_bfd, x, location); - break; - case 2: - bfd_put_16 (input_bfd, x, location); - break; - case 4: - bfd_put_32 (input_bfd, x, location); - break; - case 8: -#ifdef BFD64 - bfd_put_64 (input_bfd, x, location); -#else - abort (); -#endif - break; - } - - return overflow ? bfd_reloc_overflow : bfd_reloc_ok; -} - -/* -DOCDD -INODE - howto manager, , typedef arelent, Relocations - -SECTION - The howto manager - - When an application wants to create a relocation, but doesn't - know what the target machine might call it, it can find out by - using this bit of code. - -*/ - -/* -TYPEDEF - bfd_reloc_code_type - -DESCRIPTION - The insides of a reloc code. The idea is that, eventually, there - will be one enumerator for every type of relocation we ever do. - Pass one of these values to <<bfd_reloc_type_lookup>>, and it'll - return a howto pointer. - - This does mean that the application must determine the correct - enumerator value; you can't get a howto pointer from a random set - of attributes. - -SENUM - bfd_reloc_code_real - -ENUM - BFD_RELOC_64 -ENUMX - BFD_RELOC_32 -ENUMX - BFD_RELOC_26 -ENUMX - BFD_RELOC_16 -ENUMX - BFD_RELOC_14 -ENUMX - BFD_RELOC_8 -ENUMDOC - Basic absolute relocations of N bits. - -ENUM - BFD_RELOC_64_PCREL -ENUMX - BFD_RELOC_32_PCREL -ENUMX - BFD_RELOC_24_PCREL -ENUMX - BFD_RELOC_16_PCREL -ENUMX - BFD_RELOC_12_PCREL -ENUMX - BFD_RELOC_8_PCREL -ENUMDOC - PC-relative relocations. Sometimes these are relative to the address -of the relocation itself; sometimes they are relative to the start of -the section containing the relocation. It depends on the specific target. - -The 24-bit relocation is used in some Intel 960 configurations. - -ENUM - BFD_RELOC_32_GOT_PCREL -ENUMX - BFD_RELOC_16_GOT_PCREL -ENUMX - BFD_RELOC_8_GOT_PCREL -ENUMX - BFD_RELOC_32_GOTOFF -ENUMX - BFD_RELOC_16_GOTOFF -ENUMX - BFD_RELOC_LO16_GOTOFF -ENUMX - BFD_RELOC_HI16_GOTOFF -ENUMX - BFD_RELOC_HI16_S_GOTOFF -ENUMX - BFD_RELOC_8_GOTOFF -ENUMX - BFD_RELOC_32_PLT_PCREL -ENUMX - BFD_RELOC_24_PLT_PCREL -ENUMX - BFD_RELOC_16_PLT_PCREL -ENUMX - BFD_RELOC_8_PLT_PCREL -ENUMX - BFD_RELOC_32_PLTOFF -ENUMX - BFD_RELOC_16_PLTOFF -ENUMX - BFD_RELOC_LO16_PLTOFF -ENUMX - BFD_RELOC_HI16_PLTOFF -ENUMX - BFD_RELOC_HI16_S_PLTOFF -ENUMX - BFD_RELOC_8_PLTOFF -ENUMDOC - For ELF. - -ENUM - BFD_RELOC_68K_GLOB_DAT -ENUMX - BFD_RELOC_68K_JMP_SLOT -ENUMX - BFD_RELOC_68K_RELATIVE -ENUMDOC - Relocations used by 68K ELF. - -ENUM - BFD_RELOC_32_BASEREL -ENUMX - BFD_RELOC_16_BASEREL -ENUMX - BFD_RELOC_LO16_BASEREL -ENUMX - BFD_RELOC_HI16_BASEREL -ENUMX - BFD_RELOC_HI16_S_BASEREL -ENUMX - BFD_RELOC_8_BASEREL -ENUMX - BFD_RELOC_RVA -ENUMDOC - Linkage-table relative. - -ENUM - BFD_RELOC_8_FFnn -ENUMDOC - Absolute 8-bit relocation, but used to form an address like 0xFFnn. - -ENUM - BFD_RELOC_32_PCREL_S2 -ENUMX - BFD_RELOC_16_PCREL_S2 -ENUMX - BFD_RELOC_23_PCREL_S2 -ENUMDOC - These PC-relative relocations are stored as word displacements -- -i.e., byte displacements shifted right two bits. The 30-bit word -displacement (<<32_PCREL_S2>> -- 32 bits, shifted 2) is used on the -SPARC. (SPARC tools generally refer to this as <<WDISP30>>.) The -signed 16-bit displacement is used on the MIPS, and the 23-bit -displacement is used on the Alpha. - -ENUM - BFD_RELOC_HI22 -ENUMX - BFD_RELOC_LO10 -ENUMDOC - High 22 bits and low 10 bits of 32-bit value, placed into lower bits of -the target word. These are used on the SPARC. - -ENUM - BFD_RELOC_GPREL16 -ENUMX - BFD_RELOC_GPREL32 -ENUMDOC - For systems that allocate a Global Pointer register, these are -displacements off that register. These relocation types are -handled specially, because the value the register will have is -decided relatively late. - - -ENUM - BFD_RELOC_I960_CALLJ -ENUMDOC - Reloc types used for i960/b.out. - -ENUM - BFD_RELOC_NONE -ENUMX - BFD_RELOC_SPARC_WDISP22 -ENUMX - BFD_RELOC_SPARC22 -ENUMX - BFD_RELOC_SPARC13 -ENUMX - BFD_RELOC_SPARC_GOT10 -ENUMX - BFD_RELOC_SPARC_GOT13 -ENUMX - BFD_RELOC_SPARC_GOT22 -ENUMX - BFD_RELOC_SPARC_PC10 -ENUMX - BFD_RELOC_SPARC_PC22 -ENUMX - BFD_RELOC_SPARC_WPLT30 -ENUMX - BFD_RELOC_SPARC_COPY -ENUMX - BFD_RELOC_SPARC_GLOB_DAT -ENUMX - BFD_RELOC_SPARC_JMP_SLOT -ENUMX - BFD_RELOC_SPARC_RELATIVE -ENUMX - BFD_RELOC_SPARC_UA32 -ENUMDOC - SPARC ELF relocations. There is probably some overlap with other - relocation types already defined. - -ENUM - BFD_RELOC_SPARC_BASE13 -ENUMX - BFD_RELOC_SPARC_BASE22 -ENUMDOC - I think these are specific to SPARC a.out (e.g., Sun 4). - -ENUMEQ - BFD_RELOC_SPARC_64 - BFD_RELOC_64 -ENUMX - BFD_RELOC_SPARC_10 -ENUMX - BFD_RELOC_SPARC_11 -ENUMX - BFD_RELOC_SPARC_OLO10 -ENUMX - BFD_RELOC_SPARC_HH22 -ENUMX - BFD_RELOC_SPARC_HM10 -ENUMX - BFD_RELOC_SPARC_LM22 -ENUMX - BFD_RELOC_SPARC_PC_HH22 -ENUMX - BFD_RELOC_SPARC_PC_HM10 -ENUMX - BFD_RELOC_SPARC_PC_LM22 -ENUMX - BFD_RELOC_SPARC_WDISP16 -ENUMX - BFD_RELOC_SPARC_WDISP19 -ENUMX - BFD_RELOC_SPARC_GLOB_JMP -ENUMX - BFD_RELOC_SPARC_7 -ENUMX - BFD_RELOC_SPARC_6 -ENUMX - BFD_RELOC_SPARC_5 -ENUMDOC - Some relocations we're using for SPARC V9 -- subject to change. - -ENUM - BFD_RELOC_ALPHA_GPDISP_HI16 -ENUMDOC - Alpha ECOFF relocations. Some of these treat the symbol or "addend" - in some special way. - For GPDISP_HI16 ("gpdisp") relocations, the symbol is ignored when - writing; when reading, it will be the absolute section symbol. The - addend is the displacement in bytes of the "lda" instruction from - the "ldah" instruction (which is at the address of this reloc). -ENUM - BFD_RELOC_ALPHA_GPDISP_LO16 -ENUMDOC - For GPDISP_LO16 ("ignore") relocations, the symbol is handled as - with GPDISP_HI16 relocs. The addend is ignored when writing the - relocations out, and is filled in with the file's GP value on - reading, for convenience. - -ENUM - BFD_RELOC_ALPHA_LITERAL -ENUMX - BFD_RELOC_ALPHA_LITUSE -ENUMDOC - The Alpha LITERAL/LITUSE relocs are produced by a symbol reference; - the assembler turns it into a LDQ instruction to load the address of - the symbol, and then fills in a register in the real instruction. - - The LITERAL reloc, at the LDQ instruction, refers to the .lita - section symbol. The addend is ignored when writing, but is filled - in with the file's GP value on reading, for convenience, as with the - GPDISP_LO16 reloc. - - The LITUSE reloc, on the instruction using the loaded address, gives - information to the linker that it might be able to use to optimize - away some literal section references. The symbol is ignored (read - as the absolute section symbol), and the "addend" indicates the type - of instruction using the register: - 1 - "memory" fmt insn - 2 - byte-manipulation (byte offset reg) - 3 - jsr (target of branch) - - The GNU linker currently doesn't do any of this optimizing. - -ENUM - BFD_RELOC_ALPHA_HINT -ENUMDOC - The HINT relocation indicates a value that should be filled into the - "hint" field of a jmp/jsr/ret instruction, for possible branch- - prediction logic which may be provided on some processors. - -ENUM - BFD_RELOC_MIPS_JMP -ENUMDOC - Bits 27..2 of the relocation address shifted right 2 bits; - simple reloc otherwise. - -ENUM - BFD_RELOC_HI16 -ENUMDOC - High 16 bits of 32-bit value; simple reloc. -ENUM - BFD_RELOC_HI16_S -ENUMDOC - High 16 bits of 32-bit value but the low 16 bits will be sign - extended and added to form the final result. If the low 16 - bits form a negative number, we need to add one to the high value - to compensate for the borrow when the low bits are added. -ENUM - BFD_RELOC_LO16 -ENUMDOC - Low 16 bits. -ENUM - BFD_RELOC_PCREL_HI16_S -ENUMDOC - Like BFD_RELOC_HI16_S, but PC relative. -ENUM - BFD_RELOC_PCREL_LO16 -ENUMDOC - Like BFD_RELOC_LO16, but PC relative. - -ENUMEQ - BFD_RELOC_MIPS_GPREL - BFD_RELOC_GPREL16 -ENUMDOC - Relocation relative to the global pointer. - -ENUM - BFD_RELOC_MIPS_LITERAL -ENUMDOC - Relocation against a MIPS literal section. - -ENUM - BFD_RELOC_MIPS_GOT16 -ENUMX - BFD_RELOC_MIPS_CALL16 -ENUMEQX - BFD_RELOC_MIPS_GPREL32 - BFD_RELOC_GPREL32 -ENUMX - BFD_RELOC_MIPS_GOT_HI16 -ENUMX - BFD_RELOC_MIPS_GOT_LO16 -ENUMX - BFD_RELOC_MIPS_CALL_HI16 -ENUMX - BFD_RELOC_MIPS_CALL_LO16 -ENUMDOC - MIPS ELF relocations. - -ENUM - BFD_RELOC_386_GOT32 -ENUMX - BFD_RELOC_386_PLT32 -ENUMX - BFD_RELOC_386_COPY -ENUMX - BFD_RELOC_386_GLOB_DAT -ENUMX - BFD_RELOC_386_JUMP_SLOT -ENUMX - BFD_RELOC_386_RELATIVE -ENUMX - BFD_RELOC_386_GOTOFF -ENUMX - BFD_RELOC_386_GOTPC -ENUMDOC - i386/elf relocations - -ENUM - BFD_RELOC_NS32K_IMM_8 -ENUMX - BFD_RELOC_NS32K_IMM_16 -ENUMX - BFD_RELOC_NS32K_IMM_32 -ENUMX - BFD_RELOC_NS32K_IMM_8_PCREL -ENUMX - BFD_RELOC_NS32K_IMM_16_PCREL -ENUMX - BFD_RELOC_NS32K_IMM_32_PCREL -ENUMX - BFD_RELOC_NS32K_DISP_8 -ENUMX - BFD_RELOC_NS32K_DISP_16 -ENUMX - BFD_RELOC_NS32K_DISP_32 -ENUMX - BFD_RELOC_NS32K_DISP_8_PCREL -ENUMX - BFD_RELOC_NS32K_DISP_16_PCREL -ENUMX - BFD_RELOC_NS32K_DISP_32_PCREL -ENUMDOC - ns32k relocations - -ENUM - BFD_RELOC_PPC_B26 -ENUMX - BFD_RELOC_PPC_BA26 -ENUMX - BFD_RELOC_PPC_TOC16 -ENUMX - BFD_RELOC_PPC_B16 -ENUMX - BFD_RELOC_PPC_B16_BRTAKEN -ENUMX - BFD_RELOC_PPC_B16_BRNTAKEN -ENUMX - BFD_RELOC_PPC_BA16 -ENUMX - BFD_RELOC_PPC_BA16_BRTAKEN -ENUMX - BFD_RELOC_PPC_BA16_BRNTAKEN -ENUMX - BFD_RELOC_PPC_COPY -ENUMX - BFD_RELOC_PPC_GLOB_DAT -ENUMX - BFD_RELOC_PPC_JMP_SLOT -ENUMX - BFD_RELOC_PPC_RELATIVE -ENUMX - BFD_RELOC_PPC_LOCAL24PC -ENUMX - BFD_RELOC_PPC_EMB_NADDR32 -ENUMX - BFD_RELOC_PPC_EMB_NADDR16 -ENUMX - BFD_RELOC_PPC_EMB_NADDR16_LO -ENUMX - BFD_RELOC_PPC_EMB_NADDR16_HI -ENUMX - BFD_RELOC_PPC_EMB_NADDR16_HA -ENUMX - BFD_RELOC_PPC_EMB_SDAI16 -ENUMX - BFD_RELOC_PPC_EMB_SDA2I16 -ENUMX - BFD_RELOC_PPC_EMB_SDA2REL -ENUMX - BFD_RELOC_PPC_EMB_SDA21 -ENUMX - BFD_RELOC_PPC_EMB_MRKREF -ENUMX - BFD_RELOC_PPC_EMB_RELSEC16 -ENUMX - BFD_RELOC_PPC_EMB_RELST_LO -ENUMX - BFD_RELOC_PPC_EMB_RELST_HI -ENUMX - BFD_RELOC_PPC_EMB_RELST_HA -ENUMX - BFD_RELOC_PPC_EMB_BIT_FLD -ENUMX - BFD_RELOC_PPC_EMB_RELSDA -ENUMDOC - Power(rs6000) and PowerPC relocations. - -ENUM - BFD_RELOC_CTOR -ENUMDOC - The type of reloc used to build a contructor table - at the moment - probably a 32 bit wide absolute relocation, but the target can choose. - It generally does map to one of the other relocation types. - -ENUM - BFD_RELOC_ARM_PCREL_BRANCH -ENUMDOC - ARM 26 bit pc-relative branch. The lowest two bits must be zero and are - not stored in the instruction. -ENUM - BFD_RELOC_ARM_IMMEDIATE -ENUMX - BFD_RELOC_ARM_OFFSET_IMM -ENUMX - BFD_RELOC_ARM_SHIFT_IMM -ENUMX - BFD_RELOC_ARM_SWI -ENUMX - BFD_RELOC_ARM_MULTI -ENUMX - BFD_RELOC_ARM_CP_OFF_IMM -ENUMX - BFD_RELOC_ARM_ADR_IMM -ENUMX - BFD_RELOC_ARM_LDR_IMM -ENUMX - BFD_RELOC_ARM_LITERAL -ENUMX - BFD_RELOC_ARM_IN_POOL -ENUMDOC - These relocs are only used within the ARM assembler. They are not - (at present) written to any object files. - -COMMENT -ENDSENUM - BFD_RELOC_UNUSED -CODE_FRAGMENT -. -.typedef enum bfd_reloc_code_real bfd_reloc_code_real_type; -*/ - - -/* -FUNCTION - bfd_reloc_type_lookup - -SYNOPSIS - reloc_howto_type * - bfd_reloc_type_lookup (bfd *abfd, bfd_reloc_code_real_type code); - -DESCRIPTION - Return a pointer to a howto structure which, when - invoked, will perform the relocation @var{code} on data from the - architecture noted. - -*/ - - -reloc_howto_type * -bfd_reloc_type_lookup (abfd, code) - bfd *abfd; - bfd_reloc_code_real_type code; -{ - return BFD_SEND (abfd, reloc_type_lookup, (abfd, code)); -} - -static reloc_howto_type bfd_howto_32 = -HOWTO (0, 00, 2, 32, false, 0, complain_overflow_bitfield, 0, "VRT32", false, 0xffffffff, 0xffffffff, true); - - -/* -INTERNAL_FUNCTION - bfd_default_reloc_type_lookup - -SYNOPSIS - reloc_howto_type *bfd_default_reloc_type_lookup - (bfd *abfd, bfd_reloc_code_real_type code); - -DESCRIPTION - Provides a default relocation lookup routine for any architecture. - - -*/ - -reloc_howto_type * -bfd_default_reloc_type_lookup (abfd, code) - bfd *abfd; - bfd_reloc_code_real_type code; -{ - switch (code) - { - case BFD_RELOC_CTOR: - /* The type of reloc used in a ctor, which will be as wide as the - address - so either a 64, 32, or 16 bitter. */ - switch (bfd_get_arch_info (abfd)->bits_per_address) - { - case 64: - BFD_FAIL (); - case 32: - return &bfd_howto_32; - case 16: - BFD_FAIL (); - default: - BFD_FAIL (); - } - default: - BFD_FAIL (); - } - return (reloc_howto_type *) NULL; -} - -/* -FUNCTION - bfd_get_reloc_code_name - -SYNOPSIS - const char *bfd_get_reloc_code_name (bfd_reloc_code_real_type code); - -DESCRIPTION - Provides a printable name for the supplied relocation code. - Useful mainly for printing error messages. -*/ - -const char * -bfd_get_reloc_code_name (code) - bfd_reloc_code_real_type code; -{ - if (code > BFD_RELOC_UNUSED) - return 0; - return bfd_reloc_code_real_names[(int)code]; -} - -/* -INTERNAL_FUNCTION - bfd_generic_relax_section - -SYNOPSIS - boolean bfd_generic_relax_section - (bfd *abfd, - asection *section, - struct bfd_link_info *, - boolean *); - -DESCRIPTION - Provides default handling for relaxing for back ends which - don't do relaxing -- i.e., does nothing. -*/ - -/*ARGSUSED*/ -boolean -bfd_generic_relax_section (abfd, section, link_info, again) - bfd *abfd; - asection *section; - struct bfd_link_info *link_info; - boolean *again; -{ - *again = false; - return true; -} - -/* -INTERNAL_FUNCTION - bfd_generic_get_relocated_section_contents - -SYNOPSIS - bfd_byte * - bfd_generic_get_relocated_section_contents (bfd *abfd, - struct bfd_link_info *link_info, - struct bfd_link_order *link_order, - bfd_byte *data, - boolean relocateable, - asymbol **symbols); - -DESCRIPTION - Provides default handling of relocation effort for back ends - which can't be bothered to do it efficiently. - -*/ - -bfd_byte * -bfd_generic_get_relocated_section_contents (abfd, link_info, link_order, data, - relocateable, symbols) - bfd *abfd; - struct bfd_link_info *link_info; - struct bfd_link_order *link_order; - bfd_byte *data; - boolean relocateable; - asymbol **symbols; -{ - /* Get enough memory to hold the stuff */ - bfd *input_bfd = link_order->u.indirect.section->owner; - asection *input_section = link_order->u.indirect.section; - - long reloc_size = bfd_get_reloc_upper_bound (input_bfd, input_section); - arelent **reloc_vector = NULL; - long reloc_count; - - if (reloc_size < 0) - goto error_return; - - reloc_vector = (arelent **) bfd_malloc ((size_t) reloc_size); - if (reloc_vector == NULL && reloc_size != 0) - goto error_return; - - /* read in the section */ - if (!bfd_get_section_contents (input_bfd, - input_section, - (PTR) data, - 0, - input_section->_raw_size)) - goto error_return; - - /* We're not relaxing the section, so just copy the size info */ - input_section->_cooked_size = input_section->_raw_size; - input_section->reloc_done = true; - - reloc_count = bfd_canonicalize_reloc (input_bfd, - input_section, - reloc_vector, - symbols); - if (reloc_count < 0) - goto error_return; - - if (reloc_count > 0) - { - arelent **parent; - for (parent = reloc_vector; *parent != (arelent *) NULL; - parent++) - { - char *error_message = (char *) NULL; - bfd_reloc_status_type r = - bfd_perform_relocation (input_bfd, - *parent, - (PTR) data, - input_section, - relocateable ? abfd : (bfd *) NULL, - &error_message); - - if (relocateable) - { - asection *os = input_section->output_section; - - /* A partial link, so keep the relocs */ - os->orelocation[os->reloc_count] = *parent; - os->reloc_count++; - } - - if (r != bfd_reloc_ok) - { - switch (r) - { - case bfd_reloc_undefined: - if (!((*link_info->callbacks->undefined_symbol) - (link_info, bfd_asymbol_name (*(*parent)->sym_ptr_ptr), - input_bfd, input_section, (*parent)->address))) - goto error_return; - break; - case bfd_reloc_dangerous: - BFD_ASSERT (error_message != (char *) NULL); - if (!((*link_info->callbacks->reloc_dangerous) - (link_info, error_message, input_bfd, input_section, - (*parent)->address))) - goto error_return; - break; - case bfd_reloc_overflow: - if (!((*link_info->callbacks->reloc_overflow) - (link_info, bfd_asymbol_name (*(*parent)->sym_ptr_ptr), - (*parent)->howto->name, (*parent)->addend, - input_bfd, input_section, (*parent)->address))) - goto error_return; - break; - case bfd_reloc_outofrange: - default: - abort (); - break; - } - - } - } - } - if (reloc_vector != NULL) - free (reloc_vector); - return data; - -error_return: - if (reloc_vector != NULL) - free (reloc_vector); - return NULL; -} diff --git a/contrib/gdb/bfd/reloc16.c b/contrib/gdb/bfd/reloc16.c deleted file mode 100644 index e88d50fb90352..0000000000000 --- a/contrib/gdb/bfd/reloc16.c +++ /dev/null @@ -1,289 +0,0 @@ -/* 8 and 16 bit COFF relocation functions, for BFD. - Copyright 1990, 1991, 1992, 1993 Free Software Foundation, Inc. - Written by Cygnus Support. - -This file is part of BFD, the Binary File Descriptor library. - -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 2 of the License, 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ - -/* -Most of this hacked by Steve Chamberlain, - sac@cygnus.com -*/ - -/* These routines are used by coff-h8300 and coff-z8k to do - relocation. - - FIXME: This code should be rewritten to support the new COFF - linker. Basically, they need to deal with COFF relocs rather than - BFD generic relocs. They should store the relocs in some location - where coff_link_input_bfd can find them (and coff_link_input_bfd - should be changed to use this location rather than rereading the - file) (unless info->keep_memory is false, in which case they should - free up the relocs after dealing with them). */ - -#include "bfd.h" -#include "sysdep.h" -#include "obstack.h" -#include "libbfd.h" -#include "bfdlink.h" -#include "genlink.h" -#include "coff/internal.h" -#include "libcoff.h" - -bfd_vma -bfd_coff_reloc16_get_value (reloc, link_info, input_section) - arelent *reloc; - struct bfd_link_info *link_info; - asection *input_section; -{ - bfd_vma value; - asymbol *symbol = *(reloc->sym_ptr_ptr); - /* A symbol holds a pointer to a section, and an offset from the - base of the section. To relocate, we find where the section will - live in the output and add that in */ - - if (bfd_is_und_section (symbol->section)) - { - struct bfd_link_hash_entry *h; - - /* The symbol is undefined in this BFD. Look it up in the - global linker hash table. FIXME: This should be changed when - we convert this stuff to use a specific final_link function - and change the interface to bfd_relax_section to not require - the generic symbols. */ - h = bfd_wrapped_link_hash_lookup (input_section->owner, link_info, - bfd_asymbol_name (symbol), - false, false, true); - if (h != (struct bfd_link_hash_entry *) NULL - && (h->type == bfd_link_hash_defined - || h->type == bfd_link_hash_defweak)) - value = (h->u.def.value - + h->u.def.section->output_section->vma - + h->u.def.section->output_offset); - else if (h != (struct bfd_link_hash_entry *) NULL - && h->type == bfd_link_hash_common) - value = h->u.c.size; - else - { - if (! ((*link_info->callbacks->undefined_symbol) - (link_info, bfd_asymbol_name (symbol), - input_section->owner, input_section, reloc->address))) - abort (); - value = 0; - } - } - else - { - value = symbol->value + - symbol->section->output_offset + - symbol->section->output_section->vma; - } - - /* Add the value contained in the relocation */ - value += reloc->addend; - - return value; -} - -void -bfd_perform_slip(abfd, slip, input_section, value) - bfd *abfd; - unsigned int slip; - asection *input_section; - bfd_vma value; -{ - asymbol **s; - - s = _bfd_generic_link_get_symbols (abfd); - BFD_ASSERT (s != (asymbol **) NULL); - - /* Find all symbols past this point, and make them know - what's happened */ - while (*s) - { - asymbol *p = *s; - if (p->section == input_section) - { - /* This was pointing into this section, so mangle it */ - if (p->value > value) - { - p->value -= slip; - if (p->udata.p != NULL) - { - struct generic_link_hash_entry *h; - - h = (struct generic_link_hash_entry *) p->udata.p; - BFD_ASSERT (h->root.type == bfd_link_hash_defined - || h->root.type == bfd_link_hash_defweak); - h->root.u.def.value -= slip; - BFD_ASSERT (h->root.u.def.value == p->value); - } - } - } - s++; - } -} - -boolean -bfd_coff_reloc16_relax_section (abfd, i, link_info, again) - bfd *abfd; - asection *i; - struct bfd_link_info *link_info; - boolean *again; -{ - /* Get enough memory to hold the stuff */ - bfd *input_bfd = i->owner; - asection *input_section = i; - int shrink = 0 ; - long reloc_size = bfd_get_reloc_upper_bound (input_bfd, input_section); - arelent **reloc_vector = NULL; - long reloc_count; - - /* We only run this relaxation once. It might work to run it more - often, but it hasn't been tested. */ - *again = false; - - if (reloc_size < 0) - return false; - - reloc_vector = (arelent **) bfd_malloc (reloc_size); - if (!reloc_vector && reloc_size > 0) - return false; - - /* Get the relocs and think about them */ - reloc_count = - bfd_canonicalize_reloc (input_bfd, input_section, reloc_vector, - _bfd_generic_link_get_symbols (input_bfd)); - if (reloc_count < 0) - { - free (reloc_vector); - return false; - } - - if (reloc_count > 0) - { - arelent **parent; - for (parent = reloc_vector; *parent; parent++) - { - shrink = bfd_coff_reloc16_estimate (abfd, input_section, - *parent, shrink, link_info); - } - } - - input_section->_cooked_size -= shrink; - free((char *)reloc_vector); - return true; -} - -bfd_byte * -bfd_coff_reloc16_get_relocated_section_contents(in_abfd, - link_info, - link_order, - data, - relocateable, - symbols) - bfd *in_abfd; - struct bfd_link_info *link_info; - struct bfd_link_order *link_order; - bfd_byte *data; - boolean relocateable; - asymbol **symbols; -{ - /* Get enough memory to hold the stuff */ - bfd *input_bfd = link_order->u.indirect.section->owner; - asection *input_section = link_order->u.indirect.section; - long reloc_size = bfd_get_reloc_upper_bound (input_bfd, input_section); - arelent **reloc_vector; - long reloc_count; - - if (reloc_size < 0) - return NULL; - - /* If producing relocateable output, don't bother to relax. */ - if (relocateable) - return bfd_generic_get_relocated_section_contents (in_abfd, link_info, - link_order, - data, relocateable, - symbols); - - /* read in the section */ - if (! bfd_get_section_contents(input_bfd, - input_section, - data, - 0, - input_section->_raw_size)) - return NULL; - - - reloc_vector = (arelent **) bfd_malloc((size_t) reloc_size); - if (!reloc_vector && reloc_size != 0) - return NULL; - - reloc_count = bfd_canonicalize_reloc (input_bfd, - input_section, - reloc_vector, - symbols); - if (reloc_count < 0) - { - free (reloc_vector); - return NULL; - } - - if (reloc_count > 0) - { - arelent **parent = reloc_vector; - arelent *reloc ; - unsigned int dst_address = 0; - unsigned int src_address = 0; - unsigned int run; - unsigned int idx; - - /* Find how long a run we can do */ - while (dst_address < link_order->size) - { - reloc = *parent; - if (reloc) - { - /* Note that the relaxing didn't tie up the addresses in the - relocation, so we use the original address to work out the - run of non-relocated data */ - run = reloc->address - src_address; - parent++; - } - else - { - run = link_order->size - dst_address; - } - /* Copy the bytes */ - for (idx = 0; idx < run; idx++) - { - data[dst_address++] = data[src_address++]; - } - - /* Now do the relocation */ - - if (reloc) - { - bfd_coff_reloc16_extra_cases (input_bfd, link_info, link_order, - reloc, data, &src_address, - &dst_address); - } - } - } - free((char *)reloc_vector); - return data; -} - diff --git a/contrib/gdb/bfd/riscix.c b/contrib/gdb/bfd/riscix.c deleted file mode 100644 index 21a86d5e1024c..0000000000000 --- a/contrib/gdb/bfd/riscix.c +++ /dev/null @@ -1,644 +0,0 @@ -/* BFD back-end for RISC iX (Acorn, arm) binaries. - Copyright (C) 1994, 1995, 1996 Free Software Foundation, Inc. - Contributed by Richard Earnshaw (rwe@pegasus.esprit.ec.org) - -This file is part of BFD, the Binary File Descriptor library. - -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 2 of the License, 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ - - -/* RISC iX overloads the MAGIC field to indicate more than just the usual - [ZNO]MAGIC values. Also included are squeezing information and - shared library usage. */ - -/* The following come from the man page. */ -#define SHLIBLEN 60 - -#define MF_IMPURE 00200 -#define MF_SQUEEZED 01000 -#define MF_USES_SL 02000 -#define MF_IS_SL 04000 - -/* Common combinations. */ -#define IMAGIC (MF_IMPURE|ZMAGIC) /* Demand load (impure text) */ -#define SPOMAGIC (MF_USES_SL|OMAGIC) /* OMAGIC with large header */ - /* -- may contain a ref to a */ - /* shared lib required by the */ - /* object. */ -#define SLOMAGIC (MF_IS_SL|OMAGIC) /* A reference to a shared library */ - /* The text portion of the object */ - /* contains "overflow text" from */ - /* the shared library to be linked */ - /* in with an object */ -#define QMAGIC (MF_SQUEEZED|ZMAGIC) /* Sqeezed demand paged. */ - /* NOTE: This interpretation of */ - /* QMAGIC seems to be at variance */ - /* With that used on other */ - /* architectures. */ -#define SPZMAGIC (MF_USES_SL|ZMAGIC) /* program which uses sl */ -#define SPQMAGIC (MF_USES_SL|QMAGIC) /* sqeezed ditto */ -#define SLZMAGIC (MF_IS_SL|ZMAGIC) /* shared lib part of prog */ -#define SLPZMAGIC (MF_USES_SL|SLZMAGIC) /* sl which uses another */ - -#define N_SHARED_LIB(x) ((x).a_info & MF_USES_SL) - -/* Only a pure OMAGIC file has the minimal header */ -#define N_TXTOFF(x) \ - ((x).a_info == OMAGIC ? 32 \ - : (N_MAGIC(x) == ZMAGIC) ? TARGET_PAGE_SIZE \ - : 999) - -#define N_TXTADDR(x) \ - (N_MAGIC(x) != ZMAGIC ? 0 /* object file or NMAGIC */ \ - /* Programs with shared libs are loaded at the first page after all the \ - text segments of the shared library programs. Without looking this \ - up we can't know exactly what the address will be. A reasonable guess \ - is that a_entry will be in the first page of the executable. */ \ - : N_SHARED_LIB(x) ? ((x).a_entry & ~(TARGET_PAGE_SIZE - 1)) \ - : TEXT_START_ADDR) - -#define N_SYMOFF(x) \ - (N_TXTOFF (x) + (x).a_text + (x).a_data + (x).a_trsize + (x).a_drsize) - -#define N_STROFF(x) (N_SYMOFF (x) + (x).a_syms) - -#define TEXT_START_ADDR 32768 -#define TARGET_PAGE_SIZE 32768 -#define SEGMENT_SIZE TARGET_PAGE_SIZE -#define DEFAULT_ARCH bfd_arch_arm - -#define MY(OP) CAT(riscix_,OP) -#define TARGETNAME "a.out-riscix" -#define N_BADMAG(x) ((((x).a_info & ~007200) != ZMAGIC) && \ - (((x).a_info & ~006000) != OMAGIC) && \ - ((x).a_info != NMAGIC)) -#define N_MAGIC(x) ((x).a_info & ~07200) - -#include "bfd.h" -#include "sysdep.h" -#include "libbfd.h" -#include "assert.h" - -#define WRITE_HEADERS(abfd, execp) \ - { \ - bfd_size_type text_size; /* dummy vars */ \ - file_ptr text_end; \ - if (adata(abfd).magic == undecided_magic) \ - NAME(aout,adjust_sizes_and_vmas) (abfd, &text_size, &text_end); \ - \ - execp->a_syms = bfd_get_symcount (abfd) * EXTERNAL_NLIST_SIZE; \ - execp->a_entry = bfd_get_start_address (abfd); \ - \ - execp->a_trsize = ((obj_textsec (abfd)->reloc_count) * \ - obj_reloc_entry_size (abfd)); \ - execp->a_drsize = ((obj_datasec (abfd)->reloc_count) * \ - obj_reloc_entry_size (abfd)); \ - NAME(aout,swap_exec_header_out) (abfd, execp, &exec_bytes); \ - \ - if (bfd_seek (abfd, (file_ptr) 0, SEEK_SET) != 0) return false; \ - if (bfd_write ((PTR) &exec_bytes, 1, EXEC_BYTES_SIZE, abfd) \ - != EXEC_BYTES_SIZE) \ - return false; \ - /* Now write out reloc info, followed by syms and strings */ \ - \ - if (bfd_get_outsymbols (abfd) != (asymbol **) NULL \ - && bfd_get_symcount (abfd) != 0) \ - { \ - if (bfd_seek (abfd, (file_ptr)(N_SYMOFF(*execp)), SEEK_SET) != 0) \ - return false; \ - \ - if (! NAME(aout,write_syms)(abfd)) return false; \ - \ - if (bfd_seek (abfd, (file_ptr)(N_TRELOFF(*execp)), SEEK_SET) != 0) \ - return false; \ - \ - if (! riscix_squirt_out_relocs (abfd, obj_textsec (abfd))) \ - return false; \ - if (bfd_seek (abfd, (file_ptr)(N_DRELOFF(*execp)), SEEK_SET) != 0) \ - return false; \ - \ - if (!NAME(aout,squirt_out_relocs)(abfd, obj_datasec (abfd))) \ - return false; \ - } \ - } - -#include "libaout.h" -#include "aout/aout64.h" - -static bfd_reloc_status_type -riscix_fix_pcrel_26_done PARAMS ((bfd *, arelent *, asymbol *, PTR, - asection *, bfd *, char **)); - -static bfd_reloc_status_type -riscix_fix_pcrel_26 PARAMS ((bfd *, arelent *, asymbol *, PTR, - asection *, bfd *, char **)); - -static reloc_howto_type riscix_std_reloc_howto[] = { - /* type rs size bsz pcrel bitpos ovrf sf name part_inpl readmask setmask pcdone */ - HOWTO( 0, 0, 0, 8, false, 0, complain_overflow_bitfield,0,"8", true, 0x000000ff,0x000000ff, false), - HOWTO( 1, 0, 1, 16, false, 0, complain_overflow_bitfield,0,"16", true, 0x0000ffff,0x0000ffff, false), - HOWTO( 2, 0, 2, 32, false, 0, complain_overflow_bitfield,0,"32", true, 0xffffffff,0xffffffff, false), - HOWTO( 3, 2, 3, 26, true, 0, complain_overflow_signed, riscix_fix_pcrel_26 , "ARM26", true, 0x00ffffff,0x00ffffff, false), - HOWTO( 4, 0, 0, 8, true, 0, complain_overflow_signed, 0,"DISP8", true, 0x000000ff,0x000000ff, true), - HOWTO( 5, 0, 1, 16, true, 0, complain_overflow_signed, 0,"DISP16", true, 0x0000ffff,0x0000ffff, true), - HOWTO( 6, 0, 2, 32, true, 0, complain_overflow_signed, 0,"DISP32", true, 0xffffffff,0xffffffff, true), - HOWTO( 7, 2, 3, 26, false, 0, complain_overflow_signed, riscix_fix_pcrel_26_done, "ARM26D",true,0x00ffffff,0x00ffffff, false), - {-1}, - HOWTO( 9, 0, -1, 16, false, 0, complain_overflow_bitfield,0,"NEG16", true, 0x0000ffff,0x0000ffff, false), - HOWTO( 10, 0, -2, 32, false, 0, complain_overflow_bitfield,0,"NEG32", true, 0xffffffff,0xffffffff, false) -}; - -#define RISCIX_TABLE_SIZE \ - (sizeof (riscix_std_reloc_howto) / sizeof (reloc_howto_type)) - - -static bfd_reloc_status_type -riscix_fix_pcrel_26_done (abfd, reloc_entry, symbol, data, input_section, - output_bfd, error_message) - bfd *abfd; - arelent *reloc_entry; - asymbol *symbol; - PTR data; - asection *input_section; - bfd *output_bfd; - char **error_message; -{ - /* This is dead simple at present. */ - return bfd_reloc_ok; -} - -static bfd_reloc_status_type -riscix_fix_pcrel_26 (abfd, reloc_entry, symbol, data, input_section, - output_bfd, error_message) - bfd *abfd; - arelent *reloc_entry; - asymbol *symbol; - PTR data; - asection *input_section; - bfd *output_bfd; - char **error_message; -{ - bfd_vma relocation; - bfd_size_type addr = reloc_entry->address; - long target = bfd_get_32 (abfd, (bfd_byte *) data + addr); - bfd_reloc_status_type flag = bfd_reloc_ok; - - /* If this is an undefined symbol, return error */ - if (symbol->section == &bfd_und_section - && (symbol->flags & BSF_WEAK) == 0) - return output_bfd ? bfd_reloc_continue : bfd_reloc_undefined; - - /* If the sections are different, and we are doing a partial relocation, - just ignore it for now. */ - if (symbol->section->name != input_section->name - && output_bfd != (bfd *)NULL) - return bfd_reloc_continue; - - relocation = (target & 0x00ffffff) << 2; - relocation = (relocation ^ 0x02000000) - 0x02000000; /* Sign extend */ - relocation += symbol->value; - relocation += symbol->section->output_section->vma; - relocation += symbol->section->output_offset; - relocation += reloc_entry->addend; - relocation -= input_section->output_section->vma; - relocation -= input_section->output_offset; - relocation -= addr; - if (relocation & 3) - return bfd_reloc_overflow; - - /* Check for overflow */ - if (relocation & 0x02000000) - { - if ((relocation & ~0x03ffffff) != ~0x03ffffff) - flag = bfd_reloc_overflow; - } - else if (relocation & ~0x03ffffff) - flag = bfd_reloc_overflow; - - target &= ~0x00ffffff; - target |= (relocation >> 2) & 0x00ffffff; - bfd_put_32 (abfd, target, (bfd_byte *) data + addr); - - /* Now the ARM magic... Change the reloc type so that it is marked as done. - Strictly this is only necessary if we are doing a partial relocation. */ - reloc_entry->howto = &riscix_std_reloc_howto[7]; - - return flag; -} - -reloc_howto_type * -DEFUN(riscix_reloc_type_lookup,(abfd,code), - bfd *abfd AND - bfd_reloc_code_real_type code) -{ -#define ASTD(i,j) case i: return &riscix_std_reloc_howto[j] - if (code == BFD_RELOC_CTOR) - switch (bfd_get_arch_info (abfd)->bits_per_address) - { - case 32: - code = BFD_RELOC_32; - break; - default: return (reloc_howto_type *) NULL; - } - - switch (code) - { - ASTD (BFD_RELOC_16, 1); - ASTD (BFD_RELOC_32, 2); - ASTD (BFD_RELOC_ARM_PCREL_BRANCH, 3); - ASTD (BFD_RELOC_8_PCREL, 4); - ASTD (BFD_RELOC_16_PCREL, 5); - ASTD (BFD_RELOC_32_PCREL, 6); - default: return (reloc_howto_type *) NULL; - } -} - -#define MY_bfd_link_hash_table_create _bfd_generic_link_hash_table_create -#define MY_bfd_link_add_symbols _bfd_generic_link_add_symbols -#define MY_bfd_final_link _bfd_generic_final_link - -#define MY_bfd_reloc_type_lookup riscix_reloc_type_lookup -#define MY_canonicalize_reloc riscix_canonicalize_reloc -#define MY_object_p riscix_object_p - -static const bfd_target *riscix_callback PARAMS ((bfd *)); - -void -riscix_swap_std_reloc_out (abfd, g, natptr) - bfd *abfd; - arelent *g; - struct reloc_std_external *natptr; -{ - int r_index; - asymbol *sym = *(g->sym_ptr_ptr); - int r_extern; - int r_length; - int r_pcrel; - int r_neg = 0; /* Negative relocs use the BASEREL bit. */ - asection *output_section = sym->section->output_section; - - PUT_WORD(abfd, g->address, natptr->r_address); - - r_length = g->howto->size ; /* Size as a power of two */ - if (r_length < 0) - { - r_length = -r_length; - r_neg = 1; - } - - r_pcrel = (int) g->howto->pc_relative; /* Relative to PC? */ - - /* For RISC iX, in pc-relative relocs the r_pcrel bit means that the - relocation has been done already (Only for the 26-bit one I think)???!!! - */ - - if (r_length == 3) - r_pcrel = r_pcrel ? 0 : 1; - - -#if 0 - /* For a standard reloc, the addend is in the object file. */ - r_addend = g->addend + (*(g->sym_ptr_ptr))->section->output_section->vma; -#endif - - /* name was clobbered by aout_write_syms to be symbol index */ - - /* If this relocation is relative to a symbol then set the - r_index to the symbols index, and the r_extern bit. - - Absolute symbols can come in in two ways, either as an offset - from the abs section, or as a symbol which has an abs value. - check for that here - */ - - if (bfd_is_com_section (output_section) - || output_section == &bfd_abs_section - || output_section == &bfd_und_section) - { - if (bfd_abs_section.symbol == sym) - { - /* Whoops, looked like an abs symbol, but is really an offset - from the abs section */ - r_index = 0; - r_extern = 0; - } - else - { - /* Fill in symbol */ - r_extern = 1; - r_index = stoi((*(g->sym_ptr_ptr))->flags); - } - } - else - { - /* Just an ordinary section */ - r_extern = 0; - r_index = output_section->target_index; - } - - /* now the fun stuff */ - if (bfd_header_big_endian (abfd)) - { - natptr->r_index[0] = r_index >> 16; - natptr->r_index[1] = r_index >> 8; - natptr->r_index[2] = r_index; - natptr->r_type[0] = - ( (r_extern ? RELOC_STD_BITS_EXTERN_BIG: 0) - | (r_pcrel ? RELOC_STD_BITS_PCREL_BIG: 0) - | (r_neg ? RELOC_STD_BITS_BASEREL_BIG: 0) - | (r_length << RELOC_STD_BITS_LENGTH_SH_BIG)); - } - else - { - natptr->r_index[2] = r_index >> 16; - natptr->r_index[1] = r_index >> 8; - natptr->r_index[0] = r_index; - natptr->r_type[0] = - ( (r_extern ? RELOC_STD_BITS_EXTERN_LITTLE: 0) - | (r_pcrel ? RELOC_STD_BITS_PCREL_LITTLE: 0) - | (r_neg ? RELOC_STD_BITS_BASEREL_LITTLE: 0) - | (r_length << RELOC_STD_BITS_LENGTH_SH_LITTLE)); - } -} - -boolean -riscix_squirt_out_relocs (abfd, section) - bfd *abfd; - asection *section; -{ - arelent **generic; - unsigned char *native, *natptr; - size_t each_size; - - unsigned int count = section->reloc_count; - size_t natsize; - - if (count == 0) return true; - - each_size = obj_reloc_entry_size (abfd); - natsize = each_size * count; - native = (unsigned char *) bfd_zalloc (abfd, natsize); - if (!native) - return false; - - generic = section->orelocation; - - for (natptr = native; - count != 0; - --count, natptr += each_size, ++generic) - riscix_swap_std_reloc_out (abfd, *generic, - (struct reloc_std_external *) natptr); - - if ( bfd_write ((PTR) native, 1, natsize, abfd) != natsize) - { - bfd_release(abfd, native); - return false; - } - - bfd_release (abfd, native); - return true; -} - - -/* - * This is just like the standard aoutx.h version but we need to do our - * own mapping of external reloc type values to howto entries. - */ -long -MY(canonicalize_reloc)(abfd, section, relptr, symbols) - bfd *abfd; - sec_ptr section; - arelent **relptr; - asymbol **symbols; -{ - arelent *tblptr = section->relocation; - unsigned int count, c; - extern reloc_howto_type NAME(aout,std_howto_table)[]; - - /* If we have already read in the relocation table, return the values. */ - if (section->flags & SEC_CONSTRUCTOR) { - arelent_chain *chain = section->constructor_chain; - - for (count = 0; count < section->reloc_count; count++) { - *relptr++ = &chain->relent; - chain = chain->next; - } - *relptr = 0; - return section->reloc_count; - } - if (tblptr && section->reloc_count) { - for (count = 0; count++ < section->reloc_count;) - *relptr++ = tblptr++; - *relptr = 0; - return section->reloc_count; - } - - if (!NAME(aout,slurp_reloc_table)(abfd, section, symbols)) - return -1; - tblptr = section->relocation; - - /* fix up howto entries */ - for (count = 0; count++ < section->reloc_count;) - { - c = tblptr->howto - NAME(aout,std_howto_table); - assert (c < RISCIX_TABLE_SIZE); - tblptr->howto = &riscix_std_reloc_howto[c]; - - *relptr++ = tblptr++; - } - *relptr = 0; - return section->reloc_count; -} - -/* This is the same as NAME(aout,some_aout_object_p), but has different - expansions of the macro definitions. */ - -const bfd_target * -riscix_some_aout_object_p (abfd, execp, callback_to_real_object_p) - bfd *abfd; - struct internal_exec *execp; - const bfd_target *(*callback_to_real_object_p) PARAMS ((bfd *)); -{ - struct aout_data_struct *rawptr, *oldrawptr; - const bfd_target *result; - - rawptr = ((struct aout_data_struct *) - bfd_zalloc (abfd, sizeof (struct aout_data_struct ))); - - if (rawptr == NULL) - return 0; - - oldrawptr = abfd->tdata.aout_data; - abfd->tdata.aout_data = rawptr; - - /* Copy the contents of the old tdata struct. - In particular, we want the subformat, since for hpux it was set in - hp300hpux.c:swap_exec_header_in and will be used in - hp300hpux.c:callback. */ - if (oldrawptr != NULL) - *abfd->tdata.aout_data = *oldrawptr; - - abfd->tdata.aout_data->a.hdr = &rawptr->e; - *(abfd->tdata.aout_data->a.hdr) = *execp; /* Copy in the internal_exec - struct */ - execp = abfd->tdata.aout_data->a.hdr; - - /* Set the file flags */ - abfd->flags = NO_FLAGS; - if (execp->a_drsize || execp->a_trsize) - abfd->flags |= HAS_RELOC; - /* Setting of EXEC_P has been deferred to the bottom of this function */ - if (execp->a_syms) - abfd->flags |= HAS_LINENO | HAS_DEBUG | HAS_SYMS | HAS_LOCALS; - if (N_DYNAMIC(*execp)) - abfd->flags |= DYNAMIC; - - - if ((execp->a_info & MF_SQUEEZED) != 0) /* Squeezed files aren't supported - (yet)! */ - { - bfd_set_error (bfd_error_wrong_format); - return NULL; - } - else if ((execp->a_info & MF_IS_SL) != 0) /* Nor are shared libraries */ - { - bfd_set_error (bfd_error_wrong_format); - return NULL; - } - else if (N_MAGIC (*execp) == ZMAGIC) - { - abfd->flags |= D_PAGED | WP_TEXT; - adata (abfd).magic = z_magic; - } - else if (N_MAGIC (*execp) == NMAGIC) - { - abfd->flags |= WP_TEXT; - adata (abfd).magic = n_magic; - } - else if (N_MAGIC (*execp) == OMAGIC) - adata (abfd).magic = o_magic; - else - { - /* Should have been checked with N_BADMAG before this routine - was called. */ - abort (); - } - - bfd_get_start_address (abfd) = execp->a_entry; - - obj_aout_symbols (abfd) = (aout_symbol_type *)NULL; - bfd_get_symcount (abfd) = execp->a_syms / sizeof (struct external_nlist); - - /* The default relocation entry size is that of traditional V7 Unix. */ - obj_reloc_entry_size (abfd) = RELOC_STD_SIZE; - - /* The default symbol entry size is that of traditional Unix. */ - obj_symbol_entry_size (abfd) = EXTERNAL_NLIST_SIZE; - - obj_aout_external_syms (abfd) = NULL; - obj_aout_external_strings (abfd) = NULL; - obj_aout_sym_hashes (abfd) = NULL; - - if (! NAME(aout,make_sections) (abfd)) - return NULL; - - obj_datasec (abfd)->_raw_size = execp->a_data; - obj_bsssec (abfd)->_raw_size = execp->a_bss; - - obj_textsec (abfd)->flags = - (execp->a_trsize != 0 - ? (SEC_ALLOC | SEC_LOAD | SEC_CODE | SEC_HAS_CONTENTS | SEC_RELOC) - : (SEC_ALLOC | SEC_LOAD | SEC_CODE | SEC_HAS_CONTENTS)); - obj_datasec (abfd)->flags = - (execp->a_drsize != 0 - ? (SEC_ALLOC | SEC_LOAD | SEC_DATA | SEC_HAS_CONTENTS | SEC_RELOC) - : (SEC_ALLOC | SEC_LOAD | SEC_DATA | SEC_HAS_CONTENTS)); - obj_bsssec (abfd)->flags = SEC_ALLOC; - - result = (*callback_to_real_object_p)(abfd); - -#if defined(MACH) || defined(STAT_FOR_EXEC) - /* The original heuristic doesn't work in some important cases. The - * a.out file has no information about the text start address. For - * files (like kernels) linked to non-standard addresses (ld -Ttext - * nnn) the entry point may not be between the default text start - * (obj_textsec(abfd)->vma) and (obj_textsec(abfd)->vma) + text size - * This is not just a mach issue. Many kernels are loaded at non - * standard addresses. - */ - { - struct stat stat_buf; - if (abfd->iostream != NULL - && (abfd->flags & BFD_IN_MEMORY) == 0 - && (fstat(fileno((FILE *) (abfd->iostream)), &stat_buf) == 0) - && ((stat_buf.st_mode & 0111) != 0)) - abfd->flags |= EXEC_P; - } -#else /* ! MACH */ - /* Now that the segment addresses have been worked out, take a better - guess at whether the file is executable. If the entry point - is within the text segment, assume it is. (This makes files - executable even if their entry point address is 0, as long as - their text starts at zero.) - - At some point we should probably break down and stat the file and - declare it executable if (one of) its 'x' bits are on... */ - if ((execp->a_entry >= obj_textsec(abfd)->vma) && - (execp->a_entry < obj_textsec(abfd)->vma + obj_textsec(abfd)->_raw_size)) - abfd->flags |= EXEC_P; -#endif /* MACH */ - if (result) - { - } - else - { - free (rawptr); - abfd->tdata.aout_data = oldrawptr; - } - return result; -} - - -static const bfd_target * -MY(object_p) (abfd) - bfd *abfd; -{ - struct external_exec exec_bytes; /* Raw exec header from file */ - struct internal_exec exec; /* Cleaned-up exec header */ - const bfd_target *target; - - if (bfd_read ((PTR) &exec_bytes, 1, EXEC_BYTES_SIZE, abfd) - != EXEC_BYTES_SIZE) { - if (bfd_get_error () != bfd_error_system_call) - bfd_set_error (bfd_error_wrong_format); - return 0; - } - - exec.a_info = bfd_h_get_32 (abfd, exec_bytes.e_info); - - if (N_BADMAG (exec)) return 0; -#ifdef MACHTYPE_OK - if (!(MACHTYPE_OK (N_MACHTYPE (exec)))) return 0; -#endif - - NAME(aout,swap_exec_header_in)(abfd, &exec_bytes, &exec); - - target = riscix_some_aout_object_p (abfd, &exec, MY(callback)); - - return target; -} - - -#include "aout-target.h" diff --git a/contrib/gdb/bfd/rs6000-core.c b/contrib/gdb/bfd/rs6000-core.c deleted file mode 100644 index 4889f72f6ddab..0000000000000 --- a/contrib/gdb/bfd/rs6000-core.c +++ /dev/null @@ -1,396 +0,0 @@ -/* IBM RS/6000 "XCOFF" back-end for BFD. - Copyright (C) 1990, 1991, 1995 Free Software Foundation, Inc. - FIXME: Can someone provide a transliteration of this name into ASCII? - Using the following chars caused a compiler warning on HIUX (so I replaced - them with octal escapes), and isn't useful without an understanding of what - character set it is. - Written by Metin G. Ozisik, Mimi Ph\373\364ng-Th\345o V\365, - and John Gilmore. - Archive support from Damon A. Permezel. - Contributed by IBM Corporation and Cygnus Support. - -This file is part of BFD, the Binary File Descriptor library. - -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 2 of the License, 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ - -/* This port currently only handles reading object files, except when - compiled on an RS/6000 host. -- no archive support, no core files. - In all cases, it does not support writing. - - FIXMEmgo comments are left from Metin Ozisik's original port. - - This is in a separate file from coff-rs6000.c, because it includes - system include files that conflict with coff/rs6000.h. - */ - -/* Internalcoff.h and coffcode.h modify themselves based on this flag. */ -#define RS6000COFF_C 1 - -#include "bfd.h" -#include "sysdep.h" -#include "libbfd.h" - -#ifdef AIX_CORE - -/* AOUTHDR is defined by the above. We need another defn of it, from the - system include files. Punt the old one and get us a new name for the - typedef in the system include files. */ -#ifdef AOUTHDR -#undef AOUTHDR -#endif -#define AOUTHDR second_AOUTHDR - -#undef SCNHDR - - -/* ------------------------------------------------------------------------ */ -/* Support for core file stuff.. */ -/* ------------------------------------------------------------------------ */ - -#include <sys/user.h> -#include <sys/ldr.h> -#include <sys/core.h> - - -/* Number of special purpose registers supported by gdb. This value - should match `tm.h' in gdb directory. Clean this mess up and use - the macros in sys/reg.h. FIXMEmgo. */ - -#define NUM_OF_SPEC_REGS 7 - -#define core_hdr(bfd) (((Rs6kCorData*)(bfd->tdata.any))->hdr) -#define core_datasec(bfd) (((Rs6kCorData*)(bfd->tdata.any))->data_section) -#define core_stacksec(bfd) (((Rs6kCorData*)(bfd->tdata.any))->stack_section) -#define core_regsec(bfd) (((Rs6kCorData*)(bfd->tdata.any))->reg_section) -#define core_reg2sec(bfd) (((Rs6kCorData*)(bfd->tdata.any))->reg2_section) - -/* AIX 4.1 Changed the names and locations of a few items in the core file, - this seems to be the quickest easiet way to deal with it. - - Note however that encoding magic addresses (STACK_END_ADDR) is going - to be _very_ fragile. But I don't see any easy way to get that info - right now. */ -#ifdef CORE_VERSION_1 -#define CORE_DATA_SIZE_FIELD c_u.U_dsize -#define CORE_COMM_FIELD c_u.U_comm -#define SAVE_FIELD c_mst -#define STACK_END_ADDR 0x2ff23000 -#else -#define CORE_DATA_SIZE_FIELD c_u.u_dsize -#define CORE_COMM_FIELD c_u.u_comm -#define SAVE_FIELD c_u.u_save -#define STACK_END_ADDR 0x2ff80000 -#endif - -/* These are stored in the bfd's tdata */ -typedef struct { - struct core_dump hdr; /* core file header */ - asection *data_section, - *stack_section, - *reg_section, /* section for GPRs and special registers. */ - *reg2_section; /* section for FPRs. */ - - /* This tells us where everything is mapped (shared libraries and so on). - GDB needs it. */ - asection *ldinfo_section; -#define core_ldinfosec(bfd) (((Rs6kCorData *)(bfd->tdata.any))->ldinfo_section) -} Rs6kCorData; - - -/* Decide if a given bfd represents a `core' file or not. There really is no - magic number or anything like, in rs6000coff. */ - -const bfd_target * -rs6000coff_core_p (abfd) - bfd *abfd; -{ - int fd; - struct core_dump coredata; - struct stat statbuf; - char *tmpptr; - - /* Use bfd_xxx routines, rather than O/S primitives to read coredata. FIXMEmgo */ - fd = open (abfd->filename, O_RDONLY); - if (fd < 0) - { - bfd_set_error (bfd_error_system_call); - return NULL; - } - - if (fstat (fd, &statbuf) < 0) - { - bfd_set_error (bfd_error_system_call); - close (fd); - return NULL; - } - if (read (fd, &coredata, sizeof (struct core_dump)) - != sizeof (struct core_dump)) - { - bfd_set_error (bfd_error_wrong_format); - close (fd); - return NULL; - } - - if (close (fd) < 0) - { - bfd_set_error (bfd_error_system_call); - return NULL; - } - - /* If the core file ulimit is too small, the system will first - omit the data segment, then omit the stack, then decline to - dump core altogether (as far as I know UBLOCK_VALID and LE_VALID - are always set) (this is based on experimentation on AIX 3.2). - Now, the thing is that GDB users will be surprised - if segments just silently don't appear (well, maybe they would - think to check "info files", I don't know), but we have no way of - returning warnings (as opposed to errors). - - For the data segment, we have no choice but to keep going if it's - not there, since the default behavior is not to dump it (regardless - of the ulimit, it's based on SA_FULLDUMP). But for the stack segment, - if it's not there, we refuse to have anything to do with this core - file. The usefulness of a core dump without a stack segment is pretty - limited anyway. */ - - if (!(coredata.c_flag & UBLOCK_VALID) - || !(coredata.c_flag & LE_VALID)) - { - bfd_set_error (bfd_error_wrong_format); - return NULL; - } - - if ((coredata.c_flag & CORE_TRUNC) - || !(coredata.c_flag & USTACK_VALID)) - { - bfd_set_error (bfd_error_file_truncated); - return NULL; - } - - /* Don't check the core file size for a full core, AIX 4.1 includes - additional shared library sections in a full core. */ - if (!(coredata.c_flag & FULL_CORE) - && ((bfd_vma)coredata.c_stack + coredata.c_size) != statbuf.st_size) - { - /* If the size is wrong, it means we're misinterpreting something. */ - bfd_set_error (bfd_error_wrong_format); - return NULL; - } - - /* Sanity check on the c_tab field. */ - if ((u_long) coredata.c_tab < sizeof coredata || - (u_long) coredata.c_tab >= statbuf.st_size || - (long) coredata.c_tab >= (long)coredata.c_stack) - { - bfd_set_error (bfd_error_wrong_format); - return NULL; - } - - /* maybe you should alloc space for the whole core chunk over here!! FIXMEmgo */ - tmpptr = (char*)bfd_zalloc (abfd, sizeof (Rs6kCorData)); - if (!tmpptr) - return NULL; - - set_tdata (abfd, tmpptr); - - /* Copy core file header. */ - core_hdr (abfd) = coredata; - - /* .stack section. */ - if ((core_stacksec (abfd) = (asection*) bfd_zalloc (abfd, sizeof (asection))) - == NULL) - return NULL; - core_stacksec (abfd)->name = ".stack"; - core_stacksec (abfd)->flags = SEC_ALLOC + SEC_LOAD + SEC_HAS_CONTENTS; - core_stacksec (abfd)->_raw_size = coredata.c_size; - core_stacksec (abfd)->vma = STACK_END_ADDR - coredata.c_size; - core_stacksec (abfd)->filepos = (int)coredata.c_stack; /*???? */ - - /* .reg section for GPRs and special registers. */ - if ((core_regsec (abfd) = (asection*) bfd_zalloc (abfd, sizeof (asection))) - == NULL) - return NULL; - core_regsec (abfd)->name = ".reg"; - core_regsec (abfd)->flags = SEC_HAS_CONTENTS; - core_regsec (abfd)->_raw_size = (32 + NUM_OF_SPEC_REGS) * 4; - core_regsec (abfd)->vma = 0; /* not used?? */ - core_regsec (abfd)->filepos = - (char*)&coredata.SAVE_FIELD - (char*)&coredata; - - /* .reg2 section for FPRs (floating point registers). */ - if ((core_reg2sec (abfd) = (asection*) bfd_zalloc (abfd, sizeof (asection))) - == NULL) - return NULL; - core_reg2sec (abfd)->name = ".reg2"; - core_reg2sec (abfd)->flags = SEC_HAS_CONTENTS; - core_reg2sec (abfd)->_raw_size = 8 * 32; /* 32 FPRs. */ - core_reg2sec (abfd)->vma = 0; /* not used?? */ - core_reg2sec (abfd)->filepos = - (char*)&coredata.SAVE_FIELD.fpr[0] - (char*)&coredata; - - if ((core_ldinfosec (abfd) = (asection*) bfd_zalloc (abfd, sizeof (asection))) - == NULL) - return NULL; - core_ldinfosec (abfd)->name = ".ldinfo"; - core_ldinfosec (abfd)->flags = SEC_HAS_CONTENTS; - /* To actually find out how long this section is in this particular - core dump would require going down the whole list of struct ld_info's. - See if we can just fake it. */ - core_ldinfosec (abfd)->_raw_size = 0x7fffffff; - /* Not relevant for ldinfo section. */ - core_ldinfosec (abfd)->vma = 0; - core_ldinfosec (abfd)->filepos = (file_ptr) coredata.c_tab; - - /* set up section chain here. */ - abfd->section_count = 4; - abfd->sections = core_stacksec (abfd); - core_stacksec (abfd)->next = core_regsec(abfd); - core_regsec (abfd)->next = core_reg2sec (abfd); - core_reg2sec (abfd)->next = core_ldinfosec (abfd); - core_ldinfosec (abfd)->next = NULL; - - if (coredata.c_flag & FULL_CORE) - { - asection *sec = (asection *) bfd_zalloc (abfd, sizeof (asection)); - if (sec == NULL) - return NULL; - sec->name = ".data"; - sec->flags = SEC_ALLOC | SEC_LOAD | SEC_HAS_CONTENTS; - sec->_raw_size = coredata.CORE_DATA_SIZE_FIELD; - sec->vma = CDATA_ADDR (coredata.CORE_DATA_SIZE_FIELD); - sec->filepos = (int)coredata.c_stack + coredata.c_size; - - sec->next = abfd->sections; - abfd->sections = sec; - ++abfd->section_count; - } - - return abfd->xvec; /* this is garbage for now. */ -} - - - -/* return `true' if given core is from the given executable.. */ -boolean -rs6000coff_core_file_matches_executable_p (core_bfd, exec_bfd) - bfd *core_bfd; - bfd *exec_bfd; -{ - FILE *fd; - struct core_dump coredata; - struct ld_info ldinfo; - char pathname [1024]; - const char *str1, *str2; - - /* Use bfd_xxx routines, rather than O/S primitives, do error checking!! - FIXMEmgo */ - /* Actually should be able to use bfd_get_section_contents now that - we have a .ldinfo section. */ - fd = fopen (core_bfd->filename, FOPEN_RB); - - fread (&coredata, sizeof (struct core_dump), 1, fd); - fseek (fd, (long)coredata.c_tab, 0); - fread (&ldinfo, (char*)&ldinfo.ldinfo_filename[0] - (char*)&ldinfo.ldinfo_next, - 1, fd); - fscanf (fd, "%s", pathname); - - str1 = strrchr (pathname, '/'); - str2 = strrchr (exec_bfd->filename, '/'); - - /* step over character '/' */ - str1 = str1 ? str1+1 : &pathname[0]; - str2 = str2 ? str2+1 : exec_bfd->filename; - - fclose (fd); - return strcmp (str1, str2) == 0; -} - -char * -rs6000coff_core_file_failing_command (abfd) - bfd *abfd; -{ - char *com = core_hdr (abfd).CORE_COMM_FIELD; - if (*com) - return com; - else - return 0; -} - -int -rs6000coff_core_file_failing_signal (abfd) - bfd *abfd; -{ - return core_hdr (abfd).c_signo; -} - - -boolean -rs6000coff_get_section_contents (abfd, section, location, offset, count) - bfd *abfd; - sec_ptr section; - PTR location; - file_ptr offset; - int count; -{ - if (count == 0) - return true; - - /* Reading a core file's sections will be slightly different. For the - rest of them we can use bfd_generic_get_section_contents () I suppose. */ - /* Make sure this routine works for any bfd and any section. FIXMEmgo. */ - - if (abfd->format == bfd_core && strcmp (section->name, ".reg") == 0) { - - struct mstsave mstatus; - int regoffset = (char*)&mstatus.gpr[0] - (char*)&mstatus; - - /* Assert that the only way this code will be executed is reading the - whole section. */ - if (offset || count != (sizeof(mstatus.gpr) + (4 * NUM_OF_SPEC_REGS))) - (*_bfd_error_handler) - ("ERROR! in rs6000coff_get_section_contents()\n"); - - /* for `.reg' section, `filepos' is a pointer to the `mstsave' structure - in the core file. */ - - /* read GPR's into the location. */ - if ( bfd_seek(abfd, section->filepos + regoffset, SEEK_SET) == -1 - || bfd_read(location, sizeof (mstatus.gpr), 1, abfd) != sizeof (mstatus.gpr)) - return (false); /* on error */ - - /* increment location to the beginning of special registers in the section, - reset register offset value to the beginning of first special register - in mstsave structure, and read special registers. */ - - location = (PTR) ((char*)location + sizeof (mstatus.gpr)); - regoffset = (char*)&mstatus.iar - (char*)&mstatus; - - if ( bfd_seek(abfd, section->filepos + regoffset, SEEK_SET) == -1 - || bfd_read(location, 4 * NUM_OF_SPEC_REGS, 1, abfd) != - 4 * NUM_OF_SPEC_REGS) - return (false); /* on error */ - - /* increment location address, and read the special registers.. */ - /* FIXMEmgo */ - return (true); - } - - /* else, use default bfd section content transfer. */ - else - return _bfd_generic_get_section_contents - (abfd, section, location, offset, count); -} - -#endif /* AIX_CORE */ diff --git a/contrib/gdb/bfd/section.c b/contrib/gdb/bfd/section.c deleted file mode 100644 index ac9a44912100d..0000000000000 --- a/contrib/gdb/bfd/section.c +++ /dev/null @@ -1,976 +0,0 @@ -/* Object file "section" support for the BFD library. - Copyright (C) 1990, 91, 92, 93, 94, 95, 1996 Free Software Foundation, Inc. - Written by Cygnus Support. - -This file is part of BFD, the Binary File Descriptor library. - -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 2 of the License, 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ - -/* -SECTION - Sections - - The raw data contained within a BFD is maintained through the - section abstraction. A single BFD may have any number of - sections. It keeps hold of them by pointing to the first; - each one points to the next in the list. - - Sections are supported in BFD in <<section.c>>. - -@menu -@* Section Input:: -@* Section Output:: -@* typedef asection:: -@* section prototypes:: -@end menu - -INODE -Section Input, Section Output, Sections, Sections -SUBSECTION - Section input - - When a BFD is opened for reading, the section structures are - created and attached to the BFD. - - Each section has a name which describes the section in the - outside world---for example, <<a.out>> would contain at least - three sections, called <<.text>>, <<.data>> and <<.bss>>. - - Names need not be unique; for example a COFF file may have several - sections named <<.data>>. - - Sometimes a BFD will contain more than the ``natural'' number of - sections. A back end may attach other sections containing - constructor data, or an application may add a section (using - <<bfd_make_section>>) to the sections attached to an already open - BFD. For example, the linker creates an extra section - <<COMMON>> for each input file's BFD to hold information about - common storage. - - The raw data is not necessarily read in when - the section descriptor is created. Some targets may leave the - data in place until a <<bfd_get_section_contents>> call is - made. Other back ends may read in all the data at once. For - example, an S-record file has to be read once to determine the - size of the data. An IEEE-695 file doesn't contain raw data in - sections, but data and relocation expressions intermixed, so - the data area has to be parsed to get out the data and - relocations. - -INODE -Section Output, typedef asection, Section Input, Sections - -SUBSECTION - Section output - - To write a new object style BFD, the various sections to be - written have to be created. They are attached to the BFD in - the same way as input sections; data is written to the - sections using <<bfd_set_section_contents>>. - - Any program that creates or combines sections (e.g., the assembler - and linker) must use the <<asection>> fields <<output_section>> and - <<output_offset>> to indicate the file sections to which each - section must be written. (If the section is being created from - scratch, <<output_section>> should probably point to the section - itself and <<output_offset>> should probably be zero.) - - The data to be written comes from input sections attached - (via <<output_section>> pointers) to - the output sections. The output section structure can be - considered a filter for the input section: the output section - determines the vma of the output data and the name, but the - input section determines the offset into the output section of - the data to be written. - - E.g., to create a section "O", starting at 0x100, 0x123 long, - containing two subsections, "A" at offset 0x0 (i.e., at vma - 0x100) and "B" at offset 0x20 (i.e., at vma 0x120) the <<asection>> - structures would look like: - -| section name "A" -| output_offset 0x00 -| size 0x20 -| output_section -----------> section name "O" -| | vma 0x100 -| section name "B" | size 0x123 -| output_offset 0x20 | -| size 0x103 | -| output_section --------| - - -SUBSECTION - Link orders - - The data within a section is stored in a @dfn{link_order}. - These are much like the fixups in <<gas>>. The link_order - abstraction allows a section to grow and shrink within itself. - - A link_order knows how big it is, and which is the next - link_order and where the raw data for it is; it also points to - a list of relocations which apply to it. - - The link_order is used by the linker to perform relaxing on - final code. The compiler creates code which is as big as - necessary to make it work without relaxing, and the user can - select whether to relax. Sometimes relaxing takes a lot of - time. The linker runs around the relocations to see if any - are attached to data which can be shrunk, if so it does it on - a link_order by link_order basis. - -*/ - - -#include "bfd.h" -#include "sysdep.h" -#include "libbfd.h" - - -/* -DOCDD -INODE -typedef asection, section prototypes, Section Output, Sections -SUBSECTION - typedef asection - - Here is the section structure: - -CODE_FRAGMENT -. -.typedef struct sec -.{ -. {* The name of the section; the name isn't a copy, the pointer is -. the same as that passed to bfd_make_section. *} -. -. CONST char *name; -. -. {* Which section is it; 0..nth. *} -. -. int index; -. -. {* The next section in the list belonging to the BFD, or NULL. *} -. -. struct sec *next; -. -. {* The field flags contains attributes of the section. Some -. flags are read in from the object file, and some are -. synthesized from other information. *} -. -. flagword flags; -. -.#define SEC_NO_FLAGS 0x000 -. -. {* Tells the OS to allocate space for this section when loading. -. This is clear for a section containing debug information -. only. *} -.#define SEC_ALLOC 0x001 -. -. {* Tells the OS to load the section from the file when loading. -. This is clear for a .bss section. *} -.#define SEC_LOAD 0x002 -. -. {* The section contains data still to be relocated, so there is -. some relocation information too. *} -.#define SEC_RELOC 0x004 -. -.#if 0 {* Obsolete ? *} -.#define SEC_BALIGN 0x008 -.#endif -. -. {* A signal to the OS that the section contains read only -. data. *} -.#define SEC_READONLY 0x010 -. -. {* The section contains code only. *} -.#define SEC_CODE 0x020 -. -. {* The section contains data only. *} -.#define SEC_DATA 0x040 -. -. {* The section will reside in ROM. *} -.#define SEC_ROM 0x080 -. -. {* The section contains constructor information. This section -. type is used by the linker to create lists of constructors and -. destructors used by <<g++>>. When a back end sees a symbol -. which should be used in a constructor list, it creates a new -. section for the type of name (e.g., <<__CTOR_LIST__>>), attaches -. the symbol to it, and builds a relocation. To build the lists -. of constructors, all the linker has to do is catenate all the -. sections called <<__CTOR_LIST__>> and relocate the data -. contained within - exactly the operations it would peform on -. standard data. *} -.#define SEC_CONSTRUCTOR 0x100 -. -. {* The section is a constuctor, and should be placed at the -. end of the text, data, or bss section(?). *} -.#define SEC_CONSTRUCTOR_TEXT 0x1100 -.#define SEC_CONSTRUCTOR_DATA 0x2100 -.#define SEC_CONSTRUCTOR_BSS 0x3100 -. -. {* The section has contents - a data section could be -. <<SEC_ALLOC>> | <<SEC_HAS_CONTENTS>>; a debug section could be -. <<SEC_HAS_CONTENTS>> *} -.#define SEC_HAS_CONTENTS 0x200 -. -. {* An instruction to the linker to not output the section -. even if it has information which would normally be written. *} -.#define SEC_NEVER_LOAD 0x400 -. -. {* The section is a COFF shared library section. This flag is -. only for the linker. If this type of section appears in -. the input file, the linker must copy it to the output file -. without changing the vma or size. FIXME: Although this -. was originally intended to be general, it really is COFF -. specific (and the flag was renamed to indicate this). It -. might be cleaner to have some more general mechanism to -. allow the back end to control what the linker does with -. sections. *} -.#define SEC_COFF_SHARED_LIBRARY 0x800 -. -. {* The section is a common section (symbols may be defined -. multiple times, the value of a symbol is the amount of -. space it requires, and the largest symbol value is the one -. used). Most targets have exactly one of these (which we -. translate to bfd_com_section_ptr), but ECOFF has two. *} -.#define SEC_IS_COMMON 0x8000 -. -. {* The section contains only debugging information. For -. example, this is set for ELF .debug and .stab sections. -. strip tests this flag to see if a section can be -. discarded. *} -.#define SEC_DEBUGGING 0x10000 -. -. {* The contents of this section are held in memory pointed to -. by the contents field. This is checked by -. bfd_get_section_contents, and the data is retrieved from -. memory if appropriate. *} -.#define SEC_IN_MEMORY 0x20000 -. -. {* The contents of this section are to be excluded by the -. linker for executable and shared objects unless those -. objects are to be further relocated. *} -.#define SEC_EXCLUDE 0x40000 -. -. {* The contents of this section are to be sorted by the -. based on the address specified in the associated symbol -. table. *} -.#define SEC_SORT_ENTRIES 0x80000 -. -. {* End of section flags. *} -. -. {* The virtual memory address of the section - where it will be -. at run time. The symbols are relocated against this. The -. user_set_vma flag is maintained by bfd; if it's not set, the -. backend can assign addresses (for example, in <<a.out>>, where -. the default address for <<.data>> is dependent on the specific -. target and various flags). *} -. -. bfd_vma vma; -. boolean user_set_vma; -. -. {* The load address of the section - where it would be in a -. rom image; really only used for writing section header -. information. *} -. -. bfd_vma lma; -. -. {* The size of the section in bytes, as it will be output. -. contains a value even if the section has no contents (e.g., the -. size of <<.bss>>). This will be filled in after relocation *} -. -. bfd_size_type _cooked_size; -. -. {* The original size on disk of the section, in bytes. Normally this -. value is the same as the size, but if some relaxing has -. been done, then this value will be bigger. *} -. -. bfd_size_type _raw_size; -. -. {* If this section is going to be output, then this value is the -. offset into the output section of the first byte in the input -. section. E.g., if this was going to start at the 100th byte in -. the output section, this value would be 100. *} -. -. bfd_vma output_offset; -. -. {* The output section through which to map on output. *} -. -. struct sec *output_section; -. -. {* The alignment requirement of the section, as an exponent of 2 - -. e.g., 3 aligns to 2^3 (or 8). *} -. -. unsigned int alignment_power; -. -. {* If an input section, a pointer to a vector of relocation -. records for the data in this section. *} -. -. struct reloc_cache_entry *relocation; -. -. {* If an output section, a pointer to a vector of pointers to -. relocation records for the data in this section. *} -. -. struct reloc_cache_entry **orelocation; -. -. {* The number of relocation records in one of the above *} -. -. unsigned reloc_count; -. -. {* Information below is back end specific - and not always used -. or updated. *} -. -. {* File position of section data *} -. -. file_ptr filepos; -. -. {* File position of relocation info *} -. -. file_ptr rel_filepos; -. -. {* File position of line data *} -. -. file_ptr line_filepos; -. -. {* Pointer to data for applications *} -. -. PTR userdata; -. -. {* If the SEC_IN_MEMORY flag is set, this points to the actual -. contents. *} -. unsigned char *contents; -. -. {* Attached line number information *} -. -. alent *lineno; -. -. {* Number of line number records *} -. -. unsigned int lineno_count; -. -. {* When a section is being output, this value changes as more -. linenumbers are written out *} -. -. file_ptr moving_line_filepos; -. -. {* What the section number is in the target world *} -. -. int target_index; -. -. PTR used_by_bfd; -. -. {* If this is a constructor section then here is a list of the -. relocations created to relocate items within it. *} -. -. struct relent_chain *constructor_chain; -. -. {* The BFD which owns the section. *} -. -. bfd *owner; -. -. boolean reloc_done; -. {* A symbol which points at this section only *} -. struct symbol_cache_entry *symbol; -. struct symbol_cache_entry **symbol_ptr_ptr; -. -. struct bfd_link_order *link_order_head; -. struct bfd_link_order *link_order_tail; -.} asection ; -. -. {* These sections are global, and are managed by BFD. The application -. and target back end are not permitted to change the values in -. these sections. New code should use the section_ptr macros rather -. than referring directly to the const sections. The const sections -. may eventually vanish. *} -.#define BFD_ABS_SECTION_NAME "*ABS*" -.#define BFD_UND_SECTION_NAME "*UND*" -.#define BFD_COM_SECTION_NAME "*COM*" -.#define BFD_IND_SECTION_NAME "*IND*" -. -. {* the absolute section *} -.extern const asection bfd_abs_section; -.#define bfd_abs_section_ptr ((asection *) &bfd_abs_section) -.#define bfd_is_abs_section(sec) ((sec) == bfd_abs_section_ptr) -. {* Pointer to the undefined section *} -.extern const asection bfd_und_section; -.#define bfd_und_section_ptr ((asection *) &bfd_und_section) -.#define bfd_is_und_section(sec) ((sec) == bfd_und_section_ptr) -. {* Pointer to the common section *} -.extern const asection bfd_com_section; -.#define bfd_com_section_ptr ((asection *) &bfd_com_section) -. {* Pointer to the indirect section *} -.extern const asection bfd_ind_section; -.#define bfd_ind_section_ptr ((asection *) &bfd_ind_section) -.#define bfd_is_ind_section(sec) ((sec) == bfd_ind_section_ptr) -. -.extern const struct symbol_cache_entry * const bfd_abs_symbol; -.extern const struct symbol_cache_entry * const bfd_com_symbol; -.extern const struct symbol_cache_entry * const bfd_und_symbol; -.extern const struct symbol_cache_entry * const bfd_ind_symbol; -.#define bfd_get_section_size_before_reloc(section) \ -. (section->reloc_done ? (abort(),1): (section)->_raw_size) -.#define bfd_get_section_size_after_reloc(section) \ -. ((section->reloc_done) ? (section)->_cooked_size: (abort(),1)) -*/ - -/* These symbols are global, not specific to any BFD. Therefore, anything - that tries to change them is broken, and should be repaired. */ -static const asymbol global_syms[] = -{ - /* the_bfd, name, value, attr, section [, udata] */ - {0, BFD_COM_SECTION_NAME, 0, BSF_SECTION_SYM, (asection *) &bfd_com_section}, - {0, BFD_UND_SECTION_NAME, 0, BSF_SECTION_SYM, (asection *) &bfd_und_section}, - {0, BFD_ABS_SECTION_NAME, 0, BSF_SECTION_SYM, (asection *) &bfd_abs_section}, - {0, BFD_IND_SECTION_NAME, 0, BSF_SECTION_SYM, (asection *) &bfd_ind_section}, -}; - -#define STD_SECTION(SEC, FLAGS, SYM, NAME, IDX) \ - const asymbol * const SYM = (asymbol *) &global_syms[IDX]; \ - const asection SEC = \ - { NAME, 0, 0, FLAGS, 0, false, 0, 0, 0, 0, (asection *) &SEC, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, (boolean) 0, \ - (asymbol *) &global_syms[IDX], (asymbol **) &SYM, } - -STD_SECTION (bfd_com_section, SEC_IS_COMMON, bfd_com_symbol, - BFD_COM_SECTION_NAME, 0); -STD_SECTION (bfd_und_section, 0, bfd_und_symbol, BFD_UND_SECTION_NAME, 1); -STD_SECTION (bfd_abs_section, 0, bfd_abs_symbol, BFD_ABS_SECTION_NAME, 2); -STD_SECTION (bfd_ind_section, 0, bfd_ind_symbol, BFD_IND_SECTION_NAME, 3); -#undef STD_SECTION - -/* -DOCDD -INODE -section prototypes, , typedef asection, Sections -SUBSECTION - Section prototypes - -These are the functions exported by the section handling part of BFD. -*/ - -/* -FUNCTION - bfd_get_section_by_name - -SYNOPSIS - asection *bfd_get_section_by_name(bfd *abfd, CONST char *name); - -DESCRIPTION - Run through @var{abfd} and return the one of the - <<asection>>s whose name matches @var{name}, otherwise <<NULL>>. - @xref{Sections}, for more information. - - This should only be used in special cases; the normal way to process - all sections of a given name is to use <<bfd_map_over_sections>> and - <<strcmp>> on the name (or better yet, base it on the section flags - or something else) for each section. -*/ - -asection * -bfd_get_section_by_name (abfd, name) - bfd *abfd; - CONST char *name; -{ - asection *sect; - - for (sect = abfd->sections; sect != NULL; sect = sect->next) - if (!strcmp (sect->name, name)) - return sect; - return NULL; -} - - -/* -FUNCTION - bfd_make_section_old_way - -SYNOPSIS - asection *bfd_make_section_old_way(bfd *abfd, CONST char *name); - -DESCRIPTION - Create a new empty section called @var{name} - and attach it to the end of the chain of sections for the - BFD @var{abfd}. An attempt to create a section with a name which - is already in use returns its pointer without changing the - section chain. - - It has the funny name since this is the way it used to be - before it was rewritten.... - - Possible errors are: - o <<bfd_error_invalid_operation>> - - If output has already started for this BFD. - o <<bfd_error_no_memory>> - - If obstack alloc fails. - -*/ - - -asection * -bfd_make_section_old_way (abfd, name) - bfd *abfd; - CONST char *name; -{ - asection *sec = bfd_get_section_by_name (abfd, name); - if (sec == (asection *) NULL) - { - sec = bfd_make_section (abfd, name); - } - return sec; -} - -/* -FUNCTION - bfd_make_section_anyway - -SYNOPSIS - asection *bfd_make_section_anyway(bfd *abfd, CONST char *name); - -DESCRIPTION - Create a new empty section called @var{name} and attach it to the end of - the chain of sections for @var{abfd}. Create a new section even if there - is already a section with that name. - - Return <<NULL>> and set <<bfd_error>> on error; possible errors are: - o <<bfd_error_invalid_operation>> - If output has already started for @var{abfd}. - o <<bfd_error_no_memory>> - If obstack alloc fails. -*/ - -sec_ptr -bfd_make_section_anyway (abfd, name) - bfd *abfd; - CONST char *name; -{ - asection *newsect; - asection **prev = &abfd->sections; - asection *sect = abfd->sections; - - if (abfd->output_has_begun) - { - bfd_set_error (bfd_error_invalid_operation); - return NULL; - } - - while (sect) - { - prev = §->next; - sect = sect->next; - } - - newsect = (asection *) bfd_zalloc (abfd, sizeof (asection)); - if (newsect == NULL) - return NULL; - - newsect->name = name; - newsect->index = abfd->section_count++; - newsect->flags = SEC_NO_FLAGS; - - newsect->userdata = NULL; - newsect->contents = NULL; - newsect->next = (asection *) NULL; - newsect->relocation = (arelent *) NULL; - newsect->reloc_count = 0; - newsect->line_filepos = 0; - newsect->owner = abfd; - - /* Create a symbol whos only job is to point to this section. This is - useful for things like relocs which are relative to the base of a - section. */ - newsect->symbol = bfd_make_empty_symbol (abfd); - if (newsect->symbol == NULL) - return NULL; - newsect->symbol->name = name; - newsect->symbol->value = 0; - newsect->symbol->section = newsect; - newsect->symbol->flags = BSF_SECTION_SYM; - - newsect->symbol_ptr_ptr = &newsect->symbol; - - if (BFD_SEND (abfd, _new_section_hook, (abfd, newsect)) != true) - { - free (newsect); - return NULL; - } - - *prev = newsect; - return newsect; -} - -/* -FUNCTION - bfd_make_section - -SYNOPSIS - asection *bfd_make_section(bfd *, CONST char *name); - -DESCRIPTION - Like <<bfd_make_section_anyway>>, but return <<NULL>> (without calling - bfd_set_error ()) without changing the section chain if there is already a - section named @var{name}. If there is an error, return <<NULL>> and set - <<bfd_error>>. -*/ - -asection * -bfd_make_section (abfd, name) - bfd *abfd; - CONST char *name; -{ - asection *sect = abfd->sections; - - if (strcmp (name, BFD_ABS_SECTION_NAME) == 0) - { - return bfd_abs_section_ptr; - } - if (strcmp (name, BFD_COM_SECTION_NAME) == 0) - { - return bfd_com_section_ptr; - } - if (strcmp (name, BFD_UND_SECTION_NAME) == 0) - { - return bfd_und_section_ptr; - } - - if (strcmp (name, BFD_IND_SECTION_NAME) == 0) - { - return bfd_ind_section_ptr; - } - - while (sect) - { - if (!strcmp (sect->name, name)) - return NULL; - sect = sect->next; - } - - /* The name is not already used; go ahead and make a new section. */ - return bfd_make_section_anyway (abfd, name); -} - - -/* -FUNCTION - bfd_set_section_flags - -SYNOPSIS - boolean bfd_set_section_flags(bfd *abfd, asection *sec, flagword flags); - -DESCRIPTION - Set the attributes of the section @var{sec} in the BFD - @var{abfd} to the value @var{flags}. Return <<true>> on success, - <<false>> on error. Possible error returns are: - - o <<bfd_error_invalid_operation>> - - The section cannot have one or more of the attributes - requested. For example, a .bss section in <<a.out>> may not - have the <<SEC_HAS_CONTENTS>> field set. - -*/ - -/*ARGSUSED*/ -boolean -bfd_set_section_flags (abfd, section, flags) - bfd *abfd; - sec_ptr section; - flagword flags; -{ -#if 0 - /* If you try to copy a text section from an input file (where it - has the SEC_CODE flag set) to an output file, this loses big if - the bfd_applicable_section_flags (abfd) doesn't have the SEC_CODE - set - which it doesn't, at least not for a.out. FIXME */ - - if ((flags & bfd_applicable_section_flags (abfd)) != flags) - { - bfd_set_error (bfd_error_invalid_operation); - return false; - } -#endif - - section->flags = flags; - return true; -} - - -/* -FUNCTION - bfd_map_over_sections - -SYNOPSIS - void bfd_map_over_sections(bfd *abfd, - void (*func)(bfd *abfd, - asection *sect, - PTR obj), - PTR obj); - -DESCRIPTION - Call the provided function @var{func} for each section - attached to the BFD @var{abfd}, passing @var{obj} as an - argument. The function will be called as if by - -| func(abfd, the_section, obj); - - This is the prefered method for iterating over sections; an - alternative would be to use a loop: - -| section *p; -| for (p = abfd->sections; p != NULL; p = p->next) -| func(abfd, p, ...) - - -*/ - -/*VARARGS2*/ -void -bfd_map_over_sections (abfd, operation, user_storage) - bfd *abfd; - void (*operation) PARAMS ((bfd * abfd, asection * sect, PTR obj)); - PTR user_storage; -{ - asection *sect; - unsigned int i = 0; - - for (sect = abfd->sections; sect != NULL; i++, sect = sect->next) - (*operation) (abfd, sect, user_storage); - - if (i != abfd->section_count) /* Debugging */ - abort (); -} - - -/* -FUNCTION - bfd_set_section_size - -SYNOPSIS - boolean bfd_set_section_size(bfd *abfd, asection *sec, bfd_size_type val); - -DESCRIPTION - Set @var{sec} to the size @var{val}. If the operation is - ok, then <<true>> is returned, else <<false>>. - - Possible error returns: - o <<bfd_error_invalid_operation>> - - Writing has started to the BFD, so setting the size is invalid. - -*/ - -boolean -bfd_set_section_size (abfd, ptr, val) - bfd *abfd; - sec_ptr ptr; - bfd_size_type val; -{ - /* Once you've started writing to any section you cannot create or change - the size of any others. */ - - if (abfd->output_has_begun) - { - bfd_set_error (bfd_error_invalid_operation); - return false; - } - - ptr->_cooked_size = val; - ptr->_raw_size = val; - - return true; -} - -/* -FUNCTION - bfd_set_section_contents - -SYNOPSIS - boolean bfd_set_section_contents - (bfd *abfd, - asection *section, - PTR data, - file_ptr offset, - bfd_size_type count); - - -DESCRIPTION - Sets the contents of the section @var{section} in BFD - @var{abfd} to the data starting in memory at @var{data}. The - data is written to the output section starting at offset - @var{offset} for @var{count} bytes. - - - - Normally <<true>> is returned, else <<false>>. Possible error - returns are: - o <<bfd_error_no_contents>> - - The output section does not have the <<SEC_HAS_CONTENTS>> - attribute, so nothing can be written to it. - o and some more too - - This routine is front end to the back end function - <<_bfd_set_section_contents>>. - - -*/ - -#define bfd_get_section_size_now(abfd,sec) \ -(sec->reloc_done \ - ? bfd_get_section_size_after_reloc (sec) \ - : bfd_get_section_size_before_reloc (sec)) - -boolean -bfd_set_section_contents (abfd, section, location, offset, count) - bfd *abfd; - sec_ptr section; - PTR location; - file_ptr offset; - bfd_size_type count; -{ - bfd_size_type sz; - - if (!(bfd_get_section_flags (abfd, section) & SEC_HAS_CONTENTS)) - { - bfd_set_error (bfd_error_no_contents); - return (false); - } - - if (offset < 0) - { - bad_val: - bfd_set_error (bfd_error_bad_value); - return false; - } - sz = bfd_get_section_size_now (abfd, section); - if ((bfd_size_type) offset > sz - || count > sz - || offset + count > sz) - goto bad_val; - - switch (abfd->direction) - { - case read_direction: - case no_direction: - bfd_set_error (bfd_error_invalid_operation); - return false; - - case write_direction: - break; - - case both_direction: - /* File is opened for update. `output_has_begun' some time ago when - the file was created. Do not recompute sections sizes or alignments - in _bfd_set_section_content. */ - abfd->output_has_begun = true; - break; - } - - if (BFD_SEND (abfd, _bfd_set_section_contents, - (abfd, section, location, offset, count))) - { - abfd->output_has_begun = true; - return true; - } - - return false; -} - -/* -FUNCTION - bfd_get_section_contents - -SYNOPSIS - boolean bfd_get_section_contents - (bfd *abfd, asection *section, PTR location, - file_ptr offset, bfd_size_type count); - -DESCRIPTION - Read data from @var{section} in BFD @var{abfd} - into memory starting at @var{location}. The data is read at an - offset of @var{offset} from the start of the input section, - and is read for @var{count} bytes. - - If the contents of a constructor with the <<SEC_CONSTRUCTOR>> - flag set are requested or if the section does not have the - <<SEC_HAS_CONTENTS>> flag set, then the @var{location} is filled - with zeroes. If no errors occur, <<true>> is returned, else - <<false>>. - - - -*/ -boolean -bfd_get_section_contents (abfd, section, location, offset, count) - bfd *abfd; - sec_ptr section; - PTR location; - file_ptr offset; - bfd_size_type count; -{ - bfd_size_type sz; - - if (section->flags & SEC_CONSTRUCTOR) - { - memset (location, 0, (unsigned) count); - return true; - } - - if (offset < 0) - { - bad_val: - bfd_set_error (bfd_error_bad_value); - return false; - } - /* Even if reloc_done is true, this function reads unrelocated - contents, so we want the raw size. */ - sz = section->_raw_size; - if ((bfd_size_type) offset > sz || count > sz || offset + count > sz) - goto bad_val; - - if (count == 0) - /* Don't bother. */ - return true; - - if ((section->flags & SEC_HAS_CONTENTS) == 0) - { - memset (location, 0, (unsigned) count); - return true; - } - - if ((section->flags & SEC_IN_MEMORY) != 0) - { - memcpy (location, section->contents + offset, (size_t) count); - return true; - } - - return BFD_SEND (abfd, _bfd_get_section_contents, - (abfd, section, location, offset, count)); -} - -/* -FUNCTION - bfd_copy_private_section_data - -SYNOPSIS - boolean bfd_copy_private_section_data(bfd *ibfd, asection *isec, bfd *obfd, asection *osec); - -DESCRIPTION - Copy private section information from @var{isec} in the BFD - @var{ibfd} to the section @var{osec} in the BFD @var{obfd}. - Return <<true>> on success, <<false>> on error. Possible error - returns are: - - o <<bfd_error_no_memory>> - - Not enough memory exists to create private data for @var{osec}. - -.#define bfd_copy_private_section_data(ibfd, isection, obfd, osection) \ -. BFD_SEND (ibfd, _bfd_copy_private_section_data, \ -. (ibfd, isection, obfd, osection)) -*/ diff --git a/contrib/gdb/bfd/som.c b/contrib/gdb/bfd/som.c deleted file mode 100644 index dd03d99ee1999..0000000000000 --- a/contrib/gdb/bfd/som.c +++ /dev/null @@ -1,5999 +0,0 @@ -/* bfd back-end for HP PA-RISC SOM objects. - Copyright (C) 1990, 1991, 1992, 1993, 1994, 1995, 1996 - Free Software Foundation, Inc. - - Contributed by the Center for Software Science at the - University of Utah (pa-gdb-bugs@cs.utah.edu). - - This file is part of BFD, the Binary File Descriptor library. - - 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 2 of the License, 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ - -#include "bfd.h" -#include "sysdep.h" - -#if defined (HOST_HPPAHPUX) || defined (HOST_HPPABSD) || defined (HOST_HPPAOSF) - -#include "libbfd.h" -#include "som.h" - -#include <stdio.h> -#include <sys/types.h> -#include <sys/param.h> -#include <signal.h> -#include <machine/reg.h> -#include <sys/file.h> -#include <errno.h> - -/* Magic not defined in standard HP-UX header files until 8.0 */ - -#ifndef CPU_PA_RISC1_0 -#define CPU_PA_RISC1_0 0x20B -#endif /* CPU_PA_RISC1_0 */ - -#ifndef CPU_PA_RISC1_1 -#define CPU_PA_RISC1_1 0x210 -#endif /* CPU_PA_RISC1_1 */ - -#ifndef _PA_RISC1_0_ID -#define _PA_RISC1_0_ID CPU_PA_RISC1_0 -#endif /* _PA_RISC1_0_ID */ - -#ifndef _PA_RISC1_1_ID -#define _PA_RISC1_1_ID CPU_PA_RISC1_1 -#endif /* _PA_RISC1_1_ID */ - -#ifndef _PA_RISC_MAXID -#define _PA_RISC_MAXID 0x2FF -#endif /* _PA_RISC_MAXID */ - -#ifndef _PA_RISC_ID -#define _PA_RISC_ID(__m_num) \ - (((__m_num) == _PA_RISC1_0_ID) || \ - ((__m_num) >= _PA_RISC1_1_ID && (__m_num) <= _PA_RISC_MAXID)) -#endif /* _PA_RISC_ID */ - - -/* HIUX in it's infinite stupidity changed the names for several "well - known" constants. Work around such braindamage. Try the HPUX version - first, then the HIUX version, and finally provide a default. */ -#ifdef HPUX_AUX_ID -#define EXEC_AUX_ID HPUX_AUX_ID -#endif - -#if !defined (EXEC_AUX_ID) && defined (HIUX_AUX_ID) -#define EXEC_AUX_ID HIUX_AUX_ID -#endif - -#ifndef EXEC_AUX_ID -#define EXEC_AUX_ID 0 -#endif - -/* Size (in chars) of the temporary buffers used during fixup and string - table writes. */ - -#define SOM_TMP_BUFSIZE 8192 - -/* Size of the hash table in archives. */ -#define SOM_LST_HASH_SIZE 31 - -/* Max number of SOMs to be found in an archive. */ -#define SOM_LST_MODULE_LIMIT 1024 - -/* Generic alignment macro. */ -#define SOM_ALIGN(val, alignment) \ - (((val) + (alignment) - 1) & ~((alignment) - 1)) - -/* SOM allows any one of the four previous relocations to be reused - with a "R_PREV_FIXUP" relocation entry. Since R_PREV_FIXUP - relocations are always a single byte, using a R_PREV_FIXUP instead - of some multi-byte relocation makes object files smaller. - - Note one side effect of using a R_PREV_FIXUP is the relocation that - is being repeated moves to the front of the queue. */ -struct reloc_queue - { - unsigned char *reloc; - unsigned int size; - } reloc_queue[4]; - -/* This fully describes the symbol types which may be attached to - an EXPORT or IMPORT directive. Only SOM uses this formation - (ELF has no need for it). */ -typedef enum -{ - SYMBOL_TYPE_UNKNOWN, - SYMBOL_TYPE_ABSOLUTE, - SYMBOL_TYPE_CODE, - SYMBOL_TYPE_DATA, - SYMBOL_TYPE_ENTRY, - SYMBOL_TYPE_MILLICODE, - SYMBOL_TYPE_PLABEL, - SYMBOL_TYPE_PRI_PROG, - SYMBOL_TYPE_SEC_PROG, -} pa_symbol_type; - -struct section_to_type -{ - char *section; - char type; -}; - -/* Assorted symbol information that needs to be derived from the BFD symbol - and/or the BFD backend private symbol data. */ -struct som_misc_symbol_info -{ - unsigned int symbol_type; - unsigned int symbol_scope; - unsigned int arg_reloc; - unsigned int symbol_info; - unsigned int symbol_value; -}; - -/* Forward declarations */ - -static boolean som_mkobject PARAMS ((bfd *)); -static const bfd_target * som_object_setup PARAMS ((bfd *, - struct header *, - struct som_exec_auxhdr *)); -static boolean setup_sections PARAMS ((bfd *, struct header *)); -static const bfd_target * som_object_p PARAMS ((bfd *)); -static boolean som_write_object_contents PARAMS ((bfd *)); -static boolean som_slurp_string_table PARAMS ((bfd *)); -static unsigned int som_slurp_symbol_table PARAMS ((bfd *)); -static long som_get_symtab_upper_bound PARAMS ((bfd *)); -static long som_canonicalize_reloc PARAMS ((bfd *, sec_ptr, - arelent **, asymbol **)); -static long som_get_reloc_upper_bound PARAMS ((bfd *, sec_ptr)); -static unsigned int som_set_reloc_info PARAMS ((unsigned char *, unsigned int, - arelent *, asection *, - asymbol **, boolean)); -static boolean som_slurp_reloc_table PARAMS ((bfd *, asection *, - asymbol **, boolean)); -static long som_get_symtab PARAMS ((bfd *, asymbol **)); -static asymbol * som_make_empty_symbol PARAMS ((bfd *)); -static void som_print_symbol PARAMS ((bfd *, PTR, - asymbol *, bfd_print_symbol_type)); -static boolean som_new_section_hook PARAMS ((bfd *, asection *)); -static boolean som_bfd_copy_private_symbol_data PARAMS ((bfd *, asymbol *, - bfd *, asymbol *)); -static boolean som_bfd_copy_private_section_data PARAMS ((bfd *, asection *, - bfd *, asection *)); -static boolean som_bfd_copy_private_bfd_data PARAMS ((bfd *, bfd *)); -#define som_bfd_merge_private_bfd_data _bfd_generic_bfd_merge_private_bfd_data -#define som_bfd_set_private_flags _bfd_generic_bfd_set_private_flags -static boolean som_bfd_is_local_label PARAMS ((bfd *, asymbol *)); -static boolean som_set_section_contents PARAMS ((bfd *, sec_ptr, PTR, - file_ptr, bfd_size_type)); -static boolean som_get_section_contents PARAMS ((bfd *, sec_ptr, PTR, - file_ptr, bfd_size_type)); -static boolean som_set_arch_mach PARAMS ((bfd *, enum bfd_architecture, - unsigned long)); -static boolean som_find_nearest_line PARAMS ((bfd *, asection *, - asymbol **, bfd_vma, - CONST char **, - CONST char **, - unsigned int *)); -static void som_get_symbol_info PARAMS ((bfd *, asymbol *, symbol_info *)); -static asection * bfd_section_from_som_symbol PARAMS ((bfd *, - struct symbol_dictionary_record *)); -static int log2 PARAMS ((unsigned int)); -static bfd_reloc_status_type hppa_som_reloc PARAMS ((bfd *, arelent *, - asymbol *, PTR, - asection *, bfd *, - char **)); -static void som_initialize_reloc_queue PARAMS ((struct reloc_queue *)); -static void som_reloc_queue_insert PARAMS ((unsigned char *, unsigned int, - struct reloc_queue *)); -static void som_reloc_queue_fix PARAMS ((struct reloc_queue *, unsigned int)); -static int som_reloc_queue_find PARAMS ((unsigned char *, unsigned int, - struct reloc_queue *)); -static unsigned char * try_prev_fixup PARAMS ((bfd *, int *, unsigned char *, - unsigned int, - struct reloc_queue *)); - -static unsigned char * som_reloc_skip PARAMS ((bfd *, unsigned int, - unsigned char *, unsigned int *, - struct reloc_queue *)); -static unsigned char * som_reloc_addend PARAMS ((bfd *, int, unsigned char *, - unsigned int *, - struct reloc_queue *)); -static unsigned char * som_reloc_call PARAMS ((bfd *, unsigned char *, - unsigned int *, - arelent *, int, - struct reloc_queue *)); -static unsigned long som_count_spaces PARAMS ((bfd *)); -static unsigned long som_count_subspaces PARAMS ((bfd *)); -static int compare_syms PARAMS ((const void *, const void *)); -static int compare_subspaces PARAMS ((const void *, const void *)); -static unsigned long som_compute_checksum PARAMS ((bfd *)); -static boolean som_prep_headers PARAMS ((bfd *)); -static int som_sizeof_headers PARAMS ((bfd *, boolean)); -static boolean som_finish_writing PARAMS ((bfd *)); -static boolean som_build_and_write_symbol_table PARAMS ((bfd *)); -static void som_prep_for_fixups PARAMS ((bfd *, asymbol **, unsigned long)); -static boolean som_write_fixups PARAMS ((bfd *, unsigned long, unsigned int *)); -static boolean som_write_space_strings PARAMS ((bfd *, unsigned long, - unsigned int *)); -static boolean som_write_symbol_strings PARAMS ((bfd *, unsigned long, - asymbol **, unsigned int, - unsigned *)); -static boolean som_begin_writing PARAMS ((bfd *)); -static reloc_howto_type * som_bfd_reloc_type_lookup - PARAMS ((bfd *, bfd_reloc_code_real_type)); -static char som_section_type PARAMS ((const char *)); -static int som_decode_symclass PARAMS ((asymbol *)); -static boolean som_bfd_count_ar_symbols PARAMS ((bfd *, struct lst_header *, - symindex *)); - -static boolean som_bfd_fill_in_ar_symbols PARAMS ((bfd *, struct lst_header *, - carsym **syms)); -static boolean som_slurp_armap PARAMS ((bfd *)); -static boolean som_write_armap PARAMS ((bfd *, unsigned int, struct orl *, - unsigned int, int)); -static void som_bfd_derive_misc_symbol_info PARAMS ((bfd *, asymbol *, - struct som_misc_symbol_info *)); -static boolean som_bfd_prep_for_ar_write PARAMS ((bfd *, unsigned int *, - unsigned int *)); -static unsigned int som_bfd_ar_symbol_hash PARAMS ((asymbol *)); -static boolean som_bfd_ar_write_symbol_stuff PARAMS ((bfd *, unsigned int, - unsigned int, - struct lst_header)); -static CONST char *normalize PARAMS ((CONST char *file)); -static boolean som_is_space PARAMS ((asection *)); -static boolean som_is_subspace PARAMS ((asection *)); -static boolean som_is_container PARAMS ((asection *, asection *)); -static boolean som_bfd_free_cached_info PARAMS ((bfd *)); -static boolean som_bfd_link_split_section PARAMS ((bfd *, asection *)); - -/* Map SOM section names to POSIX/BSD single-character symbol types. - - This table includes all the standard subspaces as defined in the - current "PRO ABI for PA-RISC Systems", $UNWIND$ which for - some reason was left out, and sections specific to embedded stabs. */ - -static const struct section_to_type stt[] = { - {"$TEXT$", 't'}, - {"$SHLIB_INFO$", 't'}, - {"$MILLICODE$", 't'}, - {"$LIT$", 't'}, - {"$CODE$", 't'}, - {"$UNWIND_START$", 't'}, - {"$UNWIND$", 't'}, - {"$PRIVATE$", 'd'}, - {"$PLT$", 'd'}, - {"$SHLIB_DATA$", 'd'}, - {"$DATA$", 'd'}, - {"$SHORTDATA$", 'g'}, - {"$DLT$", 'd'}, - {"$GLOBAL$", 'g'}, - {"$SHORTBSS$", 's'}, - {"$BSS$", 'b'}, - {"$GDB_STRINGS$", 'N'}, - {"$GDB_SYMBOLS$", 'N'}, - {0, 0} -}; - -/* About the relocation formatting table... - - There are 256 entries in the table, one for each possible - relocation opcode available in SOM. We index the table by - the relocation opcode. The names and operations are those - defined by a.out_800 (4). - - Right now this table is only used to count and perform minimal - processing on relocation streams so that they can be internalized - into BFD and symbolically printed by utilities. To make actual use - of them would be much more difficult, BFD's concept of relocations - is far too simple to handle SOM relocations. The basic assumption - that a relocation can be completely processed independent of other - relocations before an object file is written is invalid for SOM. - - The SOM relocations are meant to be processed as a stream, they - specify copying of data from the input section to the output section - while possibly modifying the data in some manner. They also can - specify that a variable number of zeros or uninitialized data be - inserted on in the output segment at the current offset. Some - relocations specify that some previous relocation be re-applied at - the current location in the input/output sections. And finally a number - of relocations have effects on other sections (R_ENTRY, R_EXIT, - R_UNWIND_AUX and a variety of others). There isn't even enough room - in the BFD relocation data structure to store enough information to - perform all the relocations. - - Each entry in the table has three fields. - - The first entry is an index into this "class" of relocations. This - index can then be used as a variable within the relocation itself. - - The second field is a format string which actually controls processing - of the relocation. It uses a simple postfix machine to do calculations - based on variables/constants found in the string and the relocation - stream. - - The third field specifys whether or not this relocation may use - a constant (V) from the previous R_DATA_OVERRIDE rather than a constant - stored in the instruction. - - Variables: - - L = input space byte count - D = index into class of relocations - M = output space byte count - N = statement number (unused?) - O = stack operation - R = parameter relocation bits - S = symbol index - T = first 32 bits of stack unwind information - U = second 32 bits of stack unwind information - V = a literal constant (usually used in the next relocation) - P = a previous relocation - - Lower case letters (starting with 'b') refer to following - bytes in the relocation stream. 'b' is the next 1 byte, - c is the next 2 bytes, d is the next 3 bytes, etc... - This is the variable part of the relocation entries that - makes our life a living hell. - - numerical constants are also used in the format string. Note - the constants are represented in decimal. - - '+', "*" and "=" represents the obvious postfix operators. - '<' represents a left shift. - - Stack Operations: - - Parameter Relocation Bits: - - Unwind Entries: - - Previous Relocations: The index field represents which in the queue - of 4 previous fixups should be re-applied. - - Literal Constants: These are generally used to represent addend - parts of relocations when these constants are not stored in the - fields of the instructions themselves. For example the instruction - addil foo-$global$-0x1234 would use an override for "0x1234" rather - than storing it into the addil itself. */ - -struct fixup_format -{ - int D; - char *format; -}; - -static const struct fixup_format som_fixup_formats[256] = -{ - /* R_NO_RELOCATION */ - 0, "LD1+4*=", /* 0x00 */ - 1, "LD1+4*=", /* 0x01 */ - 2, "LD1+4*=", /* 0x02 */ - 3, "LD1+4*=", /* 0x03 */ - 4, "LD1+4*=", /* 0x04 */ - 5, "LD1+4*=", /* 0x05 */ - 6, "LD1+4*=", /* 0x06 */ - 7, "LD1+4*=", /* 0x07 */ - 8, "LD1+4*=", /* 0x08 */ - 9, "LD1+4*=", /* 0x09 */ - 10, "LD1+4*=", /* 0x0a */ - 11, "LD1+4*=", /* 0x0b */ - 12, "LD1+4*=", /* 0x0c */ - 13, "LD1+4*=", /* 0x0d */ - 14, "LD1+4*=", /* 0x0e */ - 15, "LD1+4*=", /* 0x0f */ - 16, "LD1+4*=", /* 0x10 */ - 17, "LD1+4*=", /* 0x11 */ - 18, "LD1+4*=", /* 0x12 */ - 19, "LD1+4*=", /* 0x13 */ - 20, "LD1+4*=", /* 0x14 */ - 21, "LD1+4*=", /* 0x15 */ - 22, "LD1+4*=", /* 0x16 */ - 23, "LD1+4*=", /* 0x17 */ - 0, "LD8<b+1+4*=", /* 0x18 */ - 1, "LD8<b+1+4*=", /* 0x19 */ - 2, "LD8<b+1+4*=", /* 0x1a */ - 3, "LD8<b+1+4*=", /* 0x1b */ - 0, "LD16<c+1+4*=", /* 0x1c */ - 1, "LD16<c+1+4*=", /* 0x1d */ - 2, "LD16<c+1+4*=", /* 0x1e */ - 0, "Ld1+=", /* 0x1f */ - /* R_ZEROES */ - 0, "Lb1+4*=", /* 0x20 */ - 1, "Ld1+=", /* 0x21 */ - /* R_UNINIT */ - 0, "Lb1+4*=", /* 0x22 */ - 1, "Ld1+=", /* 0x23 */ - /* R_RELOCATION */ - 0, "L4=", /* 0x24 */ - /* R_DATA_ONE_SYMBOL */ - 0, "L4=Sb=", /* 0x25 */ - 1, "L4=Sd=", /* 0x26 */ - /* R_DATA_PLEBEL */ - 0, "L4=Sb=", /* 0x27 */ - 1, "L4=Sd=", /* 0x28 */ - /* R_SPACE_REF */ - 0, "L4=", /* 0x29 */ - /* R_REPEATED_INIT */ - 0, "L4=Mb1+4*=", /* 0x2a */ - 1, "Lb4*=Mb1+L*=", /* 0x2b */ - 2, "Lb4*=Md1+4*=", /* 0x2c */ - 3, "Ld1+=Me1+=", /* 0x2d */ - /* R_SHORT_PCREL_MODE */ - 0, "", /* 0x2e */ - /* R_LONG_PCREL_MODE */ - 0, "", /* 0x2f */ - /* R_PCREL_CALL */ - 0, "L4=RD=Sb=", /* 0x30 */ - 1, "L4=RD=Sb=", /* 0x31 */ - 2, "L4=RD=Sb=", /* 0x32 */ - 3, "L4=RD=Sb=", /* 0x33 */ - 4, "L4=RD=Sb=", /* 0x34 */ - 5, "L4=RD=Sb=", /* 0x35 */ - 6, "L4=RD=Sb=", /* 0x36 */ - 7, "L4=RD=Sb=", /* 0x37 */ - 8, "L4=RD=Sb=", /* 0x38 */ - 9, "L4=RD=Sb=", /* 0x39 */ - 0, "L4=RD8<b+=Sb=",/* 0x3a */ - 1, "L4=RD8<b+=Sb=",/* 0x3b */ - 0, "L4=RD8<b+=Sd=",/* 0x3c */ - 1, "L4=RD8<b+=Sd=",/* 0x3d */ - /* R_RESERVED */ - 0, "", /* 0x3e */ - 0, "", /* 0x3f */ - /* R_ABS_CALL */ - 0, "L4=RD=Sb=", /* 0x40 */ - 1, "L4=RD=Sb=", /* 0x41 */ - 2, "L4=RD=Sb=", /* 0x42 */ - 3, "L4=RD=Sb=", /* 0x43 */ - 4, "L4=RD=Sb=", /* 0x44 */ - 5, "L4=RD=Sb=", /* 0x45 */ - 6, "L4=RD=Sb=", /* 0x46 */ - 7, "L4=RD=Sb=", /* 0x47 */ - 8, "L4=RD=Sb=", /* 0x48 */ - 9, "L4=RD=Sb=", /* 0x49 */ - 0, "L4=RD8<b+=Sb=",/* 0x4a */ - 1, "L4=RD8<b+=Sb=",/* 0x4b */ - 0, "L4=RD8<b+=Sd=",/* 0x4c */ - 1, "L4=RD8<b+=Sd=",/* 0x4d */ - /* R_RESERVED */ - 0, "", /* 0x4e */ - 0, "", /* 0x4f */ - /* R_DP_RELATIVE */ - 0, "L4=SD=", /* 0x50 */ - 1, "L4=SD=", /* 0x51 */ - 2, "L4=SD=", /* 0x52 */ - 3, "L4=SD=", /* 0x53 */ - 4, "L4=SD=", /* 0x54 */ - 5, "L4=SD=", /* 0x55 */ - 6, "L4=SD=", /* 0x56 */ - 7, "L4=SD=", /* 0x57 */ - 8, "L4=SD=", /* 0x58 */ - 9, "L4=SD=", /* 0x59 */ - 10, "L4=SD=", /* 0x5a */ - 11, "L4=SD=", /* 0x5b */ - 12, "L4=SD=", /* 0x5c */ - 13, "L4=SD=", /* 0x5d */ - 14, "L4=SD=", /* 0x5e */ - 15, "L4=SD=", /* 0x5f */ - 16, "L4=SD=", /* 0x60 */ - 17, "L4=SD=", /* 0x61 */ - 18, "L4=SD=", /* 0x62 */ - 19, "L4=SD=", /* 0x63 */ - 20, "L4=SD=", /* 0x64 */ - 21, "L4=SD=", /* 0x65 */ - 22, "L4=SD=", /* 0x66 */ - 23, "L4=SD=", /* 0x67 */ - 24, "L4=SD=", /* 0x68 */ - 25, "L4=SD=", /* 0x69 */ - 26, "L4=SD=", /* 0x6a */ - 27, "L4=SD=", /* 0x6b */ - 28, "L4=SD=", /* 0x6c */ - 29, "L4=SD=", /* 0x6d */ - 30, "L4=SD=", /* 0x6e */ - 31, "L4=SD=", /* 0x6f */ - 32, "L4=Sb=", /* 0x70 */ - 33, "L4=Sd=", /* 0x71 */ - /* R_RESERVED */ - 0, "", /* 0x72 */ - 0, "", /* 0x73 */ - 0, "", /* 0x74 */ - 0, "", /* 0x75 */ - 0, "", /* 0x76 */ - 0, "", /* 0x77 */ - /* R_DLT_REL */ - 0, "L4=Sb=", /* 0x78 */ - 1, "L4=Sd=", /* 0x79 */ - /* R_RESERVED */ - 0, "", /* 0x7a */ - 0, "", /* 0x7b */ - 0, "", /* 0x7c */ - 0, "", /* 0x7d */ - 0, "", /* 0x7e */ - 0, "", /* 0x7f */ - /* R_CODE_ONE_SYMBOL */ - 0, "L4=SD=", /* 0x80 */ - 1, "L4=SD=", /* 0x81 */ - 2, "L4=SD=", /* 0x82 */ - 3, "L4=SD=", /* 0x83 */ - 4, "L4=SD=", /* 0x84 */ - 5, "L4=SD=", /* 0x85 */ - 6, "L4=SD=", /* 0x86 */ - 7, "L4=SD=", /* 0x87 */ - 8, "L4=SD=", /* 0x88 */ - 9, "L4=SD=", /* 0x89 */ - 10, "L4=SD=", /* 0x8q */ - 11, "L4=SD=", /* 0x8b */ - 12, "L4=SD=", /* 0x8c */ - 13, "L4=SD=", /* 0x8d */ - 14, "L4=SD=", /* 0x8e */ - 15, "L4=SD=", /* 0x8f */ - 16, "L4=SD=", /* 0x90 */ - 17, "L4=SD=", /* 0x91 */ - 18, "L4=SD=", /* 0x92 */ - 19, "L4=SD=", /* 0x93 */ - 20, "L4=SD=", /* 0x94 */ - 21, "L4=SD=", /* 0x95 */ - 22, "L4=SD=", /* 0x96 */ - 23, "L4=SD=", /* 0x97 */ - 24, "L4=SD=", /* 0x98 */ - 25, "L4=SD=", /* 0x99 */ - 26, "L4=SD=", /* 0x9a */ - 27, "L4=SD=", /* 0x9b */ - 28, "L4=SD=", /* 0x9c */ - 29, "L4=SD=", /* 0x9d */ - 30, "L4=SD=", /* 0x9e */ - 31, "L4=SD=", /* 0x9f */ - 32, "L4=Sb=", /* 0xa0 */ - 33, "L4=Sd=", /* 0xa1 */ - /* R_RESERVED */ - 0, "", /* 0xa2 */ - 0, "", /* 0xa3 */ - 0, "", /* 0xa4 */ - 0, "", /* 0xa5 */ - 0, "", /* 0xa6 */ - 0, "", /* 0xa7 */ - 0, "", /* 0xa8 */ - 0, "", /* 0xa9 */ - 0, "", /* 0xaa */ - 0, "", /* 0xab */ - 0, "", /* 0xac */ - 0, "", /* 0xad */ - /* R_MILLI_REL */ - 0, "L4=Sb=", /* 0xae */ - 1, "L4=Sd=", /* 0xaf */ - /* R_CODE_PLABEL */ - 0, "L4=Sb=", /* 0xb0 */ - 1, "L4=Sd=", /* 0xb1 */ - /* R_BREAKPOINT */ - 0, "L4=", /* 0xb2 */ - /* R_ENTRY */ - 0, "Te=Ue=", /* 0xb3 */ - 1, "Uf=", /* 0xb4 */ - /* R_ALT_ENTRY */ - 0, "", /* 0xb5 */ - /* R_EXIT */ - 0, "", /* 0xb6 */ - /* R_BEGIN_TRY */ - 0, "", /* 0xb7 */ - /* R_END_TRY */ - 0, "R0=", /* 0xb8 */ - 1, "Rb4*=", /* 0xb9 */ - 2, "Rd4*=", /* 0xba */ - /* R_BEGIN_BRTAB */ - 0, "", /* 0xbb */ - /* R_END_BRTAB */ - 0, "", /* 0xbc */ - /* R_STATEMENT */ - 0, "Nb=", /* 0xbd */ - 1, "Nc=", /* 0xbe */ - 2, "Nd=", /* 0xbf */ - /* R_DATA_EXPR */ - 0, "L4=", /* 0xc0 */ - /* R_CODE_EXPR */ - 0, "L4=", /* 0xc1 */ - /* R_FSEL */ - 0, "", /* 0xc2 */ - /* R_LSEL */ - 0, "", /* 0xc3 */ - /* R_RSEL */ - 0, "", /* 0xc4 */ - /* R_N_MODE */ - 0, "", /* 0xc5 */ - /* R_S_MODE */ - 0, "", /* 0xc6 */ - /* R_D_MODE */ - 0, "", /* 0xc7 */ - /* R_R_MODE */ - 0, "", /* 0xc8 */ - /* R_DATA_OVERRIDE */ - 0, "V0=", /* 0xc9 */ - 1, "Vb=", /* 0xca */ - 2, "Vc=", /* 0xcb */ - 3, "Vd=", /* 0xcc */ - 4, "Ve=", /* 0xcd */ - /* R_TRANSLATED */ - 0, "", /* 0xce */ - /* R_RESERVED */ - 0, "", /* 0xcf */ - /* R_COMP1 */ - 0, "Ob=", /* 0xd0 */ - /* R_COMP2 */ - 0, "Ob=Sd=", /* 0xd1 */ - /* R_COMP3 */ - 0, "Ob=Ve=", /* 0xd2 */ - /* R_PREV_FIXUP */ - 0, "P", /* 0xd3 */ - 1, "P", /* 0xd4 */ - 2, "P", /* 0xd5 */ - 3, "P", /* 0xd6 */ - /* R_SEC_STMT */ - 0, "", /* 0xd7 */ - /* R_N0SEL */ - 0, "", /* 0xd8 */ - /* R_N1SEL */ - 0, "", /* 0xd9 */ - /* R_LINETAB */ - 0, "", /* 0xda */ - /* R_LINETAB_ESC */ - 0, "", /* 0xdb */ - /* R_LTP_OVERRIDE */ - 0, "", /* 0xdc */ - /* R_COMMENT */ - 0, "", /* 0xdd */ - /* R_RESERVED */ - 0, "", /* 0xde */ - 0, "", /* 0xdf */ - 0, "", /* 0xe0 */ - 0, "", /* 0xe1 */ - 0, "", /* 0xe2 */ - 0, "", /* 0xe3 */ - 0, "", /* 0xe4 */ - 0, "", /* 0xe5 */ - 0, "", /* 0xe6 */ - 0, "", /* 0xe7 */ - 0, "", /* 0xe8 */ - 0, "", /* 0xe9 */ - 0, "", /* 0xea */ - 0, "", /* 0xeb */ - 0, "", /* 0xec */ - 0, "", /* 0xed */ - 0, "", /* 0xee */ - 0, "", /* 0xef */ - 0, "", /* 0xf0 */ - 0, "", /* 0xf1 */ - 0, "", /* 0xf2 */ - 0, "", /* 0xf3 */ - 0, "", /* 0xf4 */ - 0, "", /* 0xf5 */ - 0, "", /* 0xf6 */ - 0, "", /* 0xf7 */ - 0, "", /* 0xf8 */ - 0, "", /* 0xf9 */ - 0, "", /* 0xfa */ - 0, "", /* 0xfb */ - 0, "", /* 0xfc */ - 0, "", /* 0xfd */ - 0, "", /* 0xfe */ - 0, "", /* 0xff */ -}; - -static const int comp1_opcodes[] = -{ - 0x00, - 0x40, - 0x41, - 0x42, - 0x43, - 0x44, - 0x45, - 0x46, - 0x47, - 0x48, - 0x49, - 0x4a, - 0x4b, - 0x60, - 0x80, - 0xa0, - 0xc0, - -1 -}; - -static const int comp2_opcodes[] = -{ - 0x00, - 0x80, - 0x82, - 0xc0, - -1 -}; - -static const int comp3_opcodes[] = -{ - 0x00, - 0x02, - -1 -}; - -/* These apparently are not in older versions of hpux reloc.h (hpux7). */ -#ifndef R_DLT_REL -#define R_DLT_REL 0x78 -#endif - -#ifndef R_AUX_UNWIND -#define R_AUX_UNWIND 0xcf -#endif - -#ifndef R_SEC_STMT -#define R_SEC_STMT 0xd7 -#endif - -/* And these first appeared in hpux10. */ -#ifndef R_SHORT_PCREL_MODE -#define R_SHORT_PCREL_MODE 0x3e -#endif - -#ifndef R_LONG_PCREL_MODE -#define R_LONG_PCREL_MODE 0x3f -#endif - -#ifndef R_N0SEL -#define R_N0SEL 0xd8 -#endif - -#ifndef R_N1SEL -#define R_N1SEL 0xd9 -#endif - -#ifndef R_LINETAB -#define R_LINETAB 0xda -#endif - -#ifndef R_LINETAB_ESC -#define R_LINETAB_ESC 0xdb -#endif - -#ifndef R_LTP_OVERRIDE -#define R_LTP_OVERRIDE 0xdc -#endif - -#ifndef R_COMMENT -#define R_COMMENT 0xdd -#endif - -static reloc_howto_type som_hppa_howto_table[] = -{ - {R_NO_RELOCATION, 0, 0, 32, false, 0, 0, hppa_som_reloc, "R_NO_RELOCATION"}, - {R_NO_RELOCATION, 0, 0, 32, false, 0, 0, hppa_som_reloc, "R_NO_RELOCATION"}, - {R_NO_RELOCATION, 0, 0, 32, false, 0, 0, hppa_som_reloc, "R_NO_RELOCATION"}, - {R_NO_RELOCATION, 0, 0, 32, false, 0, 0, hppa_som_reloc, "R_NO_RELOCATION"}, - {R_NO_RELOCATION, 0, 0, 32, false, 0, 0, hppa_som_reloc, "R_NO_RELOCATION"}, - {R_NO_RELOCATION, 0, 0, 32, false, 0, 0, hppa_som_reloc, "R_NO_RELOCATION"}, - {R_NO_RELOCATION, 0, 0, 32, false, 0, 0, hppa_som_reloc, "R_NO_RELOCATION"}, - {R_NO_RELOCATION, 0, 0, 32, false, 0, 0, hppa_som_reloc, "R_NO_RELOCATION"}, - {R_NO_RELOCATION, 0, 0, 32, false, 0, 0, hppa_som_reloc, "R_NO_RELOCATION"}, - {R_NO_RELOCATION, 0, 0, 32, false, 0, 0, hppa_som_reloc, "R_NO_RELOCATION"}, - {R_NO_RELOCATION, 0, 0, 32, false, 0, 0, hppa_som_reloc, "R_NO_RELOCATION"}, - {R_NO_RELOCATION, 0, 0, 32, false, 0, 0, hppa_som_reloc, "R_NO_RELOCATION"}, - {R_NO_RELOCATION, 0, 0, 32, false, 0, 0, hppa_som_reloc, "R_NO_RELOCATION"}, - {R_NO_RELOCATION, 0, 0, 32, false, 0, 0, hppa_som_reloc, "R_NO_RELOCATION"}, - {R_NO_RELOCATION, 0, 0, 32, false, 0, 0, hppa_som_reloc, "R_NO_RELOCATION"}, - {R_NO_RELOCATION, 0, 0, 32, false, 0, 0, hppa_som_reloc, "R_NO_RELOCATION"}, - {R_NO_RELOCATION, 0, 0, 32, false, 0, 0, hppa_som_reloc, "R_NO_RELOCATION"}, - {R_NO_RELOCATION, 0, 0, 32, false, 0, 0, hppa_som_reloc, "R_NO_RELOCATION"}, - {R_NO_RELOCATION, 0, 0, 32, false, 0, 0, hppa_som_reloc, "R_NO_RELOCATION"}, - {R_NO_RELOCATION, 0, 0, 32, false, 0, 0, hppa_som_reloc, "R_NO_RELOCATION"}, - {R_NO_RELOCATION, 0, 0, 32, false, 0, 0, hppa_som_reloc, "R_NO_RELOCATION"}, - {R_NO_RELOCATION, 0, 0, 32, false, 0, 0, hppa_som_reloc, "R_NO_RELOCATION"}, - {R_NO_RELOCATION, 0, 0, 32, false, 0, 0, hppa_som_reloc, "R_NO_RELOCATION"}, - {R_NO_RELOCATION, 0, 0, 32, false, 0, 0, hppa_som_reloc, "R_NO_RELOCATION"}, - {R_NO_RELOCATION, 0, 0, 32, false, 0, 0, hppa_som_reloc, "R_NO_RELOCATION"}, - {R_NO_RELOCATION, 0, 0, 32, false, 0, 0, hppa_som_reloc, "R_NO_RELOCATION"}, - {R_NO_RELOCATION, 0, 0, 32, false, 0, 0, hppa_som_reloc, "R_NO_RELOCATION"}, - {R_NO_RELOCATION, 0, 0, 32, false, 0, 0, hppa_som_reloc, "R_NO_RELOCATION"}, - {R_NO_RELOCATION, 0, 0, 32, false, 0, 0, hppa_som_reloc, "R_NO_RELOCATION"}, - {R_NO_RELOCATION, 0, 0, 32, false, 0, 0, hppa_som_reloc, "R_NO_RELOCATION"}, - {R_NO_RELOCATION, 0, 0, 32, false, 0, 0, hppa_som_reloc, "R_NO_RELOCATION"}, - {R_NO_RELOCATION, 0, 0, 32, false, 0, 0, hppa_som_reloc, "R_NO_RELOCATION"}, - {R_ZEROES, 0, 0, 32, false, 0, 0, hppa_som_reloc, "R_ZEROES"}, - {R_ZEROES, 0, 0, 32, false, 0, 0, hppa_som_reloc, "R_ZEROES"}, - {R_UNINIT, 0, 0, 32, false, 0, 0, hppa_som_reloc, "R_UNINIT"}, - {R_UNINIT, 0, 0, 32, false, 0, 0, hppa_som_reloc, "R_UNINIT"}, - {R_RELOCATION, 0, 0, 32, false, 0, 0, hppa_som_reloc, "R_RELOCATION"}, - {R_DATA_ONE_SYMBOL, 0, 0, 32, false, 0, 0, hppa_som_reloc, "R_DATA_ONE_SYMBOL"}, - {R_DATA_ONE_SYMBOL, 0, 0, 32, false, 0, 0, hppa_som_reloc, "R_DATA_ONE_SYMBOL"}, - {R_DATA_PLABEL, 0, 0, 32, false, 0, 0, hppa_som_reloc, "R_DATA_PLABEL"}, - {R_DATA_PLABEL, 0, 0, 32, false, 0, 0, hppa_som_reloc, "R_DATA_PLABEL"}, - {R_SPACE_REF, 0, 0, 32, false, 0, 0, hppa_som_reloc, "R_SPACE_REF"}, - {R_REPEATED_INIT, 0, 0, 32, false, 0, 0, hppa_som_reloc, "REPEATED_INIT"}, - {R_REPEATED_INIT, 0, 0, 32, false, 0, 0, hppa_som_reloc, "REPEATED_INIT"}, - {R_REPEATED_INIT, 0, 0, 32, false, 0, 0, hppa_som_reloc, "REPEATED_INIT"}, - {R_REPEATED_INIT, 0, 0, 32, false, 0, 0, hppa_som_reloc, "REPEATED_INIT"}, - {R_RESERVED, 0, 0, 32, false, 0, 0, hppa_som_reloc, "R_RESERVED"}, - {R_RESERVED, 0, 0, 32, false, 0, 0, hppa_som_reloc, "R_RESERVED"}, - {R_PCREL_CALL, 0, 0, 32, false, 0, 0, hppa_som_reloc, "R_PCREL_CALL"}, - {R_PCREL_CALL, 0, 0, 32, false, 0, 0, hppa_som_reloc, "R_PCREL_CALL"}, - {R_PCREL_CALL, 0, 0, 32, false, 0, 0, hppa_som_reloc, "R_PCREL_CALL"}, - {R_PCREL_CALL, 0, 0, 32, false, 0, 0, hppa_som_reloc, "R_PCREL_CALL"}, - {R_PCREL_CALL, 0, 0, 32, false, 0, 0, hppa_som_reloc, "R_PCREL_CALL"}, - {R_PCREL_CALL, 0, 0, 32, false, 0, 0, hppa_som_reloc, "R_PCREL_CALL"}, - {R_PCREL_CALL, 0, 0, 32, false, 0, 0, hppa_som_reloc, "R_PCREL_CALL"}, - {R_PCREL_CALL, 0, 0, 32, false, 0, 0, hppa_som_reloc, "R_PCREL_CALL"}, - {R_PCREL_CALL, 0, 0, 32, false, 0, 0, hppa_som_reloc, "R_PCREL_CALL"}, - {R_PCREL_CALL, 0, 0, 32, false, 0, 0, hppa_som_reloc, "R_PCREL_CALL"}, - {R_PCREL_CALL, 0, 0, 32, false, 0, 0, hppa_som_reloc, "R_PCREL_CALL"}, - {R_PCREL_CALL, 0, 0, 32, false, 0, 0, hppa_som_reloc, "R_PCREL_CALL"}, - {R_PCREL_CALL, 0, 0, 32, false, 0, 0, hppa_som_reloc, "R_PCREL_CALL"}, - {R_PCREL_CALL, 0, 0, 32, false, 0, 0, hppa_som_reloc, "R_PCREL_CALL"}, - {R_SHORT_PCREL_MODE, 0, 0, 32, false, 0, 0, hppa_som_reloc, "R_SHORT_PCREL_MODE"}, - {R_LONG_PCREL_MODE, 0, 0, 32, false, 0, 0, hppa_som_reloc, "R_LONG_PCREL_MODE"}, - {R_ABS_CALL, 0, 0, 32, false, 0, 0, hppa_som_reloc, "R_ABS_CALL"}, - {R_ABS_CALL, 0, 0, 32, false, 0, 0, hppa_som_reloc, "R_ABS_CALL"}, - {R_ABS_CALL, 0, 0, 32, false, 0, 0, hppa_som_reloc, "R_ABS_CALL"}, - {R_ABS_CALL, 0, 0, 32, false, 0, 0, hppa_som_reloc, "R_ABS_CALL"}, - {R_ABS_CALL, 0, 0, 32, false, 0, 0, hppa_som_reloc, "R_ABS_CALL"}, - {R_ABS_CALL, 0, 0, 32, false, 0, 0, hppa_som_reloc, "R_ABS_CALL"}, - {R_ABS_CALL, 0, 0, 32, false, 0, 0, hppa_som_reloc, "R_ABS_CALL"}, - {R_ABS_CALL, 0, 0, 32, false, 0, 0, hppa_som_reloc, "R_ABS_CALL"}, - {R_ABS_CALL, 0, 0, 32, false, 0, 0, hppa_som_reloc, "R_ABS_CALL"}, - {R_ABS_CALL, 0, 0, 32, false, 0, 0, hppa_som_reloc, "R_ABS_CALL"}, - {R_ABS_CALL, 0, 0, 32, false, 0, 0, hppa_som_reloc, "R_ABS_CALL"}, - {R_ABS_CALL, 0, 0, 32, false, 0, 0, hppa_som_reloc, "R_ABS_CALL"}, - {R_ABS_CALL, 0, 0, 32, false, 0, 0, hppa_som_reloc, "R_ABS_CALL"}, - {R_ABS_CALL, 0, 0, 32, false, 0, 0, hppa_som_reloc, "R_ABS_CALL"}, - {R_RESERVED, 0, 0, 32, false, 0, 0, hppa_som_reloc, "R_RESERVED"}, - {R_RESERVED, 0, 0, 32, false, 0, 0, hppa_som_reloc, "R_RESERVED"}, - {R_DP_RELATIVE, 0, 0, 32, false, 0, 0, hppa_som_reloc, "R_DP_RELATIVE"}, - {R_DP_RELATIVE, 0, 0, 32, false, 0, 0, hppa_som_reloc, "R_DP_RELATIVE"}, - {R_DP_RELATIVE, 0, 0, 32, false, 0, 0, hppa_som_reloc, "R_DP_RELATIVE"}, - {R_DP_RELATIVE, 0, 0, 32, false, 0, 0, hppa_som_reloc, "R_DP_RELATIVE"}, - {R_DP_RELATIVE, 0, 0, 32, false, 0, 0, hppa_som_reloc, "R_DP_RELATIVE"}, - {R_DP_RELATIVE, 0, 0, 32, false, 0, 0, hppa_som_reloc, "R_DP_RELATIVE"}, - {R_DP_RELATIVE, 0, 0, 32, false, 0, 0, hppa_som_reloc, "R_DP_RELATIVE"}, - {R_DP_RELATIVE, 0, 0, 32, false, 0, 0, hppa_som_reloc, "R_DP_RELATIVE"}, - {R_DP_RELATIVE, 0, 0, 32, false, 0, 0, hppa_som_reloc, "R_DP_RELATIVE"}, - {R_DP_RELATIVE, 0, 0, 32, false, 0, 0, hppa_som_reloc, "R_DP_RELATIVE"}, - {R_DP_RELATIVE, 0, 0, 32, false, 0, 0, hppa_som_reloc, "R_DP_RELATIVE"}, - {R_DP_RELATIVE, 0, 0, 32, false, 0, 0, hppa_som_reloc, "R_DP_RELATIVE"}, - {R_DP_RELATIVE, 0, 0, 32, false, 0, 0, hppa_som_reloc, "R_DP_RELATIVE"}, - {R_DP_RELATIVE, 0, 0, 32, false, 0, 0, hppa_som_reloc, "R_DP_RELATIVE"}, - {R_DP_RELATIVE, 0, 0, 32, false, 0, 0, hppa_som_reloc, "R_DP_RELATIVE"}, - {R_DP_RELATIVE, 0, 0, 32, false, 0, 0, hppa_som_reloc, "R_DP_RELATIVE"}, - {R_DP_RELATIVE, 0, 0, 32, false, 0, 0, hppa_som_reloc, "R_DP_RELATIVE"}, - {R_DP_RELATIVE, 0, 0, 32, false, 0, 0, hppa_som_reloc, "R_DP_RELATIVE"}, - {R_DP_RELATIVE, 0, 0, 32, false, 0, 0, hppa_som_reloc, "R_DP_RELATIVE"}, - {R_DP_RELATIVE, 0, 0, 32, false, 0, 0, hppa_som_reloc, "R_DP_RELATIVE"}, - {R_DP_RELATIVE, 0, 0, 32, false, 0, 0, hppa_som_reloc, "R_DP_RELATIVE"}, - {R_DP_RELATIVE, 0, 0, 32, false, 0, 0, hppa_som_reloc, "R_DP_RELATIVE"}, - {R_DP_RELATIVE, 0, 0, 32, false, 0, 0, hppa_som_reloc, "R_DP_RELATIVE"}, - {R_DP_RELATIVE, 0, 0, 32, false, 0, 0, hppa_som_reloc, "R_DP_RELATIVE"}, - {R_DP_RELATIVE, 0, 0, 32, false, 0, 0, hppa_som_reloc, "R_DP_RELATIVE"}, - {R_DP_RELATIVE, 0, 0, 32, false, 0, 0, hppa_som_reloc, "R_DP_RELATIVE"}, - {R_DP_RELATIVE, 0, 0, 32, false, 0, 0, hppa_som_reloc, "R_DP_RELATIVE"}, - {R_DP_RELATIVE, 0, 0, 32, false, 0, 0, hppa_som_reloc, "R_DP_RELATIVE"}, - {R_DP_RELATIVE, 0, 0, 32, false, 0, 0, hppa_som_reloc, "R_DP_RELATIVE"}, - {R_DP_RELATIVE, 0, 0, 32, false, 0, 0, hppa_som_reloc, "R_DP_RELATIVE"}, - {R_DP_RELATIVE, 0, 0, 32, false, 0, 0, hppa_som_reloc, "R_DP_RELATIVE"}, - {R_DP_RELATIVE, 0, 0, 32, false, 0, 0, hppa_som_reloc, "R_DP_RELATIVE"}, - {R_DP_RELATIVE, 0, 0, 32, false, 0, 0, hppa_som_reloc, "R_DP_RELATIVE"}, - {R_DP_RELATIVE, 0, 0, 32, false, 0, 0, hppa_som_reloc, "R_DP_RELATIVE"}, - {R_DP_RELATIVE, 0, 0, 32, false, 0, 0, hppa_som_reloc, "R_DP_RELATIVE"}, - {R_RESERVED, 0, 0, 32, false, 0, 0, hppa_som_reloc, "R_RESERVED"}, - {R_RESERVED, 0, 0, 32, false, 0, 0, hppa_som_reloc, "R_RESERVED"}, - {R_RESERVED, 0, 0, 32, false, 0, 0, hppa_som_reloc, "R_RESERVED"}, - {R_RESERVED, 0, 0, 32, false, 0, 0, hppa_som_reloc, "R_RESERVED"}, - {R_RESERVED, 0, 0, 32, false, 0, 0, hppa_som_reloc, "R_RESERVED"}, - {R_DLT_REL, 0, 0, 32, false, 0, 0, hppa_som_reloc, "R_DLT_REL"}, - {R_DLT_REL, 0, 0, 32, false, 0, 0, hppa_som_reloc, "R_DLT_REL"}, - {R_RESERVED, 0, 0, 32, false, 0, 0, hppa_som_reloc, "R_RESERVED"}, - {R_RESERVED, 0, 0, 32, false, 0, 0, hppa_som_reloc, "R_RESERVED"}, - {R_RESERVED, 0, 0, 32, false, 0, 0, hppa_som_reloc, "R_RESERVED"}, - {R_RESERVED, 0, 0, 32, false, 0, 0, hppa_som_reloc, "R_RESERVED"}, - {R_RESERVED, 0, 0, 32, false, 0, 0, hppa_som_reloc, "R_RESERVED"}, - {R_RESERVED, 0, 0, 32, false, 0, 0, hppa_som_reloc, "R_RESERVED"}, - {R_CODE_ONE_SYMBOL, 0, 0, 32, false, 0, 0, hppa_som_reloc, "R_CODE_ONE_SYMBOL"}, - {R_CODE_ONE_SYMBOL, 0, 0, 32, false, 0, 0, hppa_som_reloc, "R_CODE_ONE_SYMBOL"}, - {R_CODE_ONE_SYMBOL, 0, 0, 32, false, 0, 0, hppa_som_reloc, "R_CODE_ONE_SYMBOL"}, - {R_CODE_ONE_SYMBOL, 0, 0, 32, false, 0, 0, hppa_som_reloc, "R_CODE_ONE_SYMBOL"}, - {R_CODE_ONE_SYMBOL, 0, 0, 32, false, 0, 0, hppa_som_reloc, "R_CODE_ONE_SYMBOL"}, - {R_CODE_ONE_SYMBOL, 0, 0, 32, false, 0, 0, hppa_som_reloc, "R_CODE_ONE_SYMBOL"}, - {R_CODE_ONE_SYMBOL, 0, 0, 32, false, 0, 0, hppa_som_reloc, "R_CODE_ONE_SYMBOL"}, - {R_CODE_ONE_SYMBOL, 0, 0, 32, false, 0, 0, hppa_som_reloc, "R_CODE_ONE_SYMBOL"}, - {R_CODE_ONE_SYMBOL, 0, 0, 32, false, 0, 0, hppa_som_reloc, "R_CODE_ONE_SYMBOL"}, - {R_CODE_ONE_SYMBOL, 0, 0, 32, false, 0, 0, hppa_som_reloc, "R_CODE_ONE_SYMBOL"}, - {R_CODE_ONE_SYMBOL, 0, 0, 32, false, 0, 0, hppa_som_reloc, "R_CODE_ONE_SYMBOL"}, - {R_CODE_ONE_SYMBOL, 0, 0, 32, false, 0, 0, hppa_som_reloc, "R_CODE_ONE_SYMBOL"}, - {R_CODE_ONE_SYMBOL, 0, 0, 32, false, 0, 0, hppa_som_reloc, "R_CODE_ONE_SYMBOL"}, - {R_CODE_ONE_SYMBOL, 0, 0, 32, false, 0, 0, hppa_som_reloc, "R_CODE_ONE_SYMBOL"}, - {R_CODE_ONE_SYMBOL, 0, 0, 32, false, 0, 0, hppa_som_reloc, "R_CODE_ONE_SYMBOL"}, - {R_CODE_ONE_SYMBOL, 0, 0, 32, false, 0, 0, hppa_som_reloc, "R_CODE_ONE_SYMBOL"}, - {R_CODE_ONE_SYMBOL, 0, 0, 32, false, 0, 0, hppa_som_reloc, "R_CODE_ONE_SYMBOL"}, - {R_CODE_ONE_SYMBOL, 0, 0, 32, false, 0, 0, hppa_som_reloc, "R_CODE_ONE_SYMBOL"}, - {R_CODE_ONE_SYMBOL, 0, 0, 32, false, 0, 0, hppa_som_reloc, "R_CODE_ONE_SYMBOL"}, - {R_CODE_ONE_SYMBOL, 0, 0, 32, false, 0, 0, hppa_som_reloc, "R_CODE_ONE_SYMBOL"}, - {R_CODE_ONE_SYMBOL, 0, 0, 32, false, 0, 0, hppa_som_reloc, "R_CODE_ONE_SYMBOL"}, - {R_CODE_ONE_SYMBOL, 0, 0, 32, false, 0, 0, hppa_som_reloc, "R_CODE_ONE_SYMBOL"}, - {R_CODE_ONE_SYMBOL, 0, 0, 32, false, 0, 0, hppa_som_reloc, "R_CODE_ONE_SYMBOL"}, - {R_CODE_ONE_SYMBOL, 0, 0, 32, false, 0, 0, hppa_som_reloc, "R_CODE_ONE_SYMBOL"}, - {R_CODE_ONE_SYMBOL, 0, 0, 32, false, 0, 0, hppa_som_reloc, "R_CODE_ONE_SYMBOL"}, - {R_CODE_ONE_SYMBOL, 0, 0, 32, false, 0, 0, hppa_som_reloc, "R_CODE_ONE_SYMBOL"}, - {R_CODE_ONE_SYMBOL, 0, 0, 32, false, 0, 0, hppa_som_reloc, "R_CODE_ONE_SYMBOL"}, - {R_CODE_ONE_SYMBOL, 0, 0, 32, false, 0, 0, hppa_som_reloc, "R_CODE_ONE_SYMBOL"}, - {R_CODE_ONE_SYMBOL, 0, 0, 32, false, 0, 0, hppa_som_reloc, "R_CODE_ONE_SYMBOL"}, - {R_CODE_ONE_SYMBOL, 0, 0, 32, false, 0, 0, hppa_som_reloc, "R_CODE_ONE_SYMBOL"}, - {R_CODE_ONE_SYMBOL, 0, 0, 32, false, 0, 0, hppa_som_reloc, "R_CODE_ONE_SYMBOL"}, - {R_CODE_ONE_SYMBOL, 0, 0, 32, false, 0, 0, hppa_som_reloc, "R_CODE_ONE_SYMBOL"}, - {R_CODE_ONE_SYMBOL, 0, 0, 32, false, 0, 0, hppa_som_reloc, "R_CODE_ONE_SYMBOL"}, - {R_CODE_ONE_SYMBOL, 0, 0, 32, false, 0, 0, hppa_som_reloc, "R_CODE_ONE_SYMBOL"}, - {R_CODE_ONE_SYMBOL, 0, 0, 32, false, 0, 0, hppa_som_reloc, "R_CODE_ONE_SYMBOL"}, - {R_RESERVED, 0, 0, 32, false, 0, 0, hppa_som_reloc, "R_RESERVED"}, - {R_RESERVED, 0, 0, 32, false, 0, 0, hppa_som_reloc, "R_RESERVED"}, - {R_RESERVED, 0, 0, 32, false, 0, 0, hppa_som_reloc, "R_RESERVED"}, - {R_RESERVED, 0, 0, 32, false, 0, 0, hppa_som_reloc, "R_RESERVED"}, - {R_RESERVED, 0, 0, 32, false, 0, 0, hppa_som_reloc, "R_RESERVED"}, - {R_RESERVED, 0, 0, 32, false, 0, 0, hppa_som_reloc, "R_RESERVED"}, - {R_RESERVED, 0, 0, 32, false, 0, 0, hppa_som_reloc, "R_RESERVED"}, - {R_RESERVED, 0, 0, 32, false, 0, 0, hppa_som_reloc, "R_RESERVED"}, - {R_RESERVED, 0, 0, 32, false, 0, 0, hppa_som_reloc, "R_RESERVED"}, - {R_RESERVED, 0, 0, 32, false, 0, 0, hppa_som_reloc, "R_RESERVED"}, - {R_RESERVED, 0, 0, 32, false, 0, 0, hppa_som_reloc, "R_RESERVED"}, - {R_MILLI_REL, 0, 0, 32, false, 0, 0, hppa_som_reloc, "R_MILLI_REL"}, - {R_MILLI_REL, 0, 0, 32, false, 0, 0, hppa_som_reloc, "R_MILLI_REL"}, - {R_CODE_PLABEL, 0, 0, 32, false, 0, 0, hppa_som_reloc, "R_CODE_PLABEL"}, - {R_CODE_PLABEL, 0, 0, 32, false, 0, 0, hppa_som_reloc, "R_CODE_PLABEL"}, - {R_BREAKPOINT, 0, 0, 32, false, 0, 0, hppa_som_reloc, "R_BREAKPOINT"}, - {R_ENTRY, 0, 0, 32, false, 0, 0, hppa_som_reloc, "R_ENTRY"}, - {R_ENTRY, 0, 0, 32, false, 0, 0, hppa_som_reloc, "R_ENTRY"}, - {R_ALT_ENTRY, 0, 0, 32, false, 0, 0, hppa_som_reloc, "R_ALT_ENTRY"}, - {R_EXIT, 0, 0, 32, false, 0, 0, hppa_som_reloc, "R_EXIT"}, - {R_BEGIN_TRY, 0, 0, 32, false, 0, 0, hppa_som_reloc, "R_BEGIN_TRY"}, - {R_END_TRY, 0, 0, 32, false, 0, 0, hppa_som_reloc, "R_END_TRY"}, - {R_END_TRY, 0, 0, 32, false, 0, 0, hppa_som_reloc, "R_END_TRY"}, - {R_END_TRY, 0, 0, 32, false, 0, 0, hppa_som_reloc, "R_END_TRY"}, - {R_BEGIN_BRTAB, 0, 0, 32, false, 0, 0, hppa_som_reloc, "R_BEGIN_BRTAB"}, - {R_END_BRTAB, 0, 0, 32, false, 0, 0, hppa_som_reloc, "R_END_BRTAB"}, - {R_STATEMENT, 0, 0, 32, false, 0, 0, hppa_som_reloc, "R_STATEMENT"}, - {R_STATEMENT, 0, 0, 32, false, 0, 0, hppa_som_reloc, "R_STATEMENT"}, - {R_STATEMENT, 0, 0, 32, false, 0, 0, hppa_som_reloc, "R_STATEMENT"}, - {R_DATA_EXPR, 0, 0, 32, false, 0, 0, hppa_som_reloc, "R_DATA_EXPR"}, - {R_CODE_EXPR, 0, 0, 32, false, 0, 0, hppa_som_reloc, "R_CODE_EXPR"}, - {R_FSEL, 0, 0, 32, false, 0, 0, hppa_som_reloc, "R_FSEL"}, - {R_LSEL, 0, 0, 32, false, 0, 0, hppa_som_reloc, "R_LSEL"}, - {R_RSEL, 0, 0, 32, false, 0, 0, hppa_som_reloc, "R_RSEL"}, - {R_N_MODE, 0, 0, 32, false, 0, 0, hppa_som_reloc, "R_N_MODE"}, - {R_S_MODE, 0, 0, 32, false, 0, 0, hppa_som_reloc, "R_S_MODE"}, - {R_D_MODE, 0, 0, 32, false, 0, 0, hppa_som_reloc, "R_D_MODE"}, - {R_R_MODE, 0, 0, 32, false, 0, 0, hppa_som_reloc, "R_R_MODE"}, - {R_DATA_OVERRIDE, 0, 0, 32, false, 0, 0, hppa_som_reloc, "R_DATA_OVERRIDE"}, - {R_DATA_OVERRIDE, 0, 0, 32, false, 0, 0, hppa_som_reloc, "R_DATA_OVERRIDE"}, - {R_DATA_OVERRIDE, 0, 0, 32, false, 0, 0, hppa_som_reloc, "R_DATA_OVERRIDE"}, - {R_DATA_OVERRIDE, 0, 0, 32, false, 0, 0, hppa_som_reloc, "R_DATA_OVERRIDE"}, - {R_DATA_OVERRIDE, 0, 0, 32, false, 0, 0, hppa_som_reloc, "R_DATA_OVERRIDE"}, - {R_TRANSLATED, 0, 0, 32, false, 0, 0, hppa_som_reloc, "R_TRANSLATED"}, - {R_AUX_UNWIND, 0, 0, 32, false, 0, 0, hppa_som_reloc, "R_AUX_UNWIND"}, - {R_COMP1, 0, 0, 32, false, 0, 0, hppa_som_reloc, "R_COMP1"}, - {R_COMP2, 0, 0, 32, false, 0, 0, hppa_som_reloc, "R_COMP2"}, - {R_COMP3, 0, 0, 32, false, 0, 0, hppa_som_reloc, "R_COMP3"}, - {R_PREV_FIXUP, 0, 0, 32, false, 0, 0, hppa_som_reloc, "R_PREV_FIXUP"}, - {R_PREV_FIXUP, 0, 0, 32, false, 0, 0, hppa_som_reloc, "R_PREV_FIXUP"}, - {R_PREV_FIXUP, 0, 0, 32, false, 0, 0, hppa_som_reloc, "R_PREV_FIXUP"}, - {R_PREV_FIXUP, 0, 0, 32, false, 0, 0, hppa_som_reloc, "R_PREV_FIXUP"}, - {R_SEC_STMT, 0, 0, 32, false, 0, 0, hppa_som_reloc, "R_SEC_STMT"}, - {R_N0SEL, 0, 0, 32, false, 0, 0, hppa_som_reloc, "R_N0SEL"}, - {R_N1SEL, 0, 0, 32, false, 0, 0, hppa_som_reloc, "R_N1SEL"}, - {R_LINETAB, 0, 0, 32, false, 0, 0, hppa_som_reloc, "R_LINETAB"}, - {R_LINETAB_ESC, 0, 0, 32, false, 0, 0, hppa_som_reloc, "R_LINETAB_ESC"}, - {R_LTP_OVERRIDE, 0, 0, 32, false, 0, 0, hppa_som_reloc, "R_LTP_OVERRIDE"}, - {R_COMMENT, 0, 0, 32, false, 0, 0, hppa_som_reloc, "R_COMMENT"}, - {R_RESERVED, 0, 0, 32, false, 0, 0, hppa_som_reloc, "R_RESERVED"}, - {R_RESERVED, 0, 0, 32, false, 0, 0, hppa_som_reloc, "R_RESERVED"}, - {R_RESERVED, 0, 0, 32, false, 0, 0, hppa_som_reloc, "R_RESERVED"}, - {R_RESERVED, 0, 0, 32, false, 0, 0, hppa_som_reloc, "R_RESERVED"}, - {R_RESERVED, 0, 0, 32, false, 0, 0, hppa_som_reloc, "R_RESERVED"}, - {R_RESERVED, 0, 0, 32, false, 0, 0, hppa_som_reloc, "R_RESERVED"}, - {R_RESERVED, 0, 0, 32, false, 0, 0, hppa_som_reloc, "R_RESERVED"}, - {R_RESERVED, 0, 0, 32, false, 0, 0, hppa_som_reloc, "R_RESERVED"}, - {R_RESERVED, 0, 0, 32, false, 0, 0, hppa_som_reloc, "R_RESERVED"}, - {R_RESERVED, 0, 0, 32, false, 0, 0, hppa_som_reloc, "R_RESERVED"}, - {R_RESERVED, 0, 0, 32, false, 0, 0, hppa_som_reloc, "R_RESERVED"}, - {R_RESERVED, 0, 0, 32, false, 0, 0, hppa_som_reloc, "R_RESERVED"}, - {R_RESERVED, 0, 0, 32, false, 0, 0, hppa_som_reloc, "R_RESERVED"}, - {R_RESERVED, 0, 0, 32, false, 0, 0, hppa_som_reloc, "R_RESERVED"}, - {R_RESERVED, 0, 0, 32, false, 0, 0, hppa_som_reloc, "R_RESERVED"}, - {R_RESERVED, 0, 0, 32, false, 0, 0, hppa_som_reloc, "R_RESERVED"}, - {R_RESERVED, 0, 0, 32, false, 0, 0, hppa_som_reloc, "R_RESERVED"}, - {R_RESERVED, 0, 0, 32, false, 0, 0, hppa_som_reloc, "R_RESERVED"}, - {R_RESERVED, 0, 0, 32, false, 0, 0, hppa_som_reloc, "R_RESERVED"}, - {R_RESERVED, 0, 0, 32, false, 0, 0, hppa_som_reloc, "R_RESERVED"}, - {R_RESERVED, 0, 0, 32, false, 0, 0, hppa_som_reloc, "R_RESERVED"}, - {R_RESERVED, 0, 0, 32, false, 0, 0, hppa_som_reloc, "R_RESERVED"}, - {R_RESERVED, 0, 0, 32, false, 0, 0, hppa_som_reloc, "R_RESERVED"}, - {R_RESERVED, 0, 0, 32, false, 0, 0, hppa_som_reloc, "R_RESERVED"}, - {R_RESERVED, 0, 0, 32, false, 0, 0, hppa_som_reloc, "R_RESERVED"}, - {R_RESERVED, 0, 0, 32, false, 0, 0, hppa_som_reloc, "R_RESERVED"}, - {R_RESERVED, 0, 0, 32, false, 0, 0, hppa_som_reloc, "R_RESERVED"}, - {R_RESERVED, 0, 0, 32, false, 0, 0, hppa_som_reloc, "R_RESERVED"}, - {R_RESERVED, 0, 0, 32, false, 0, 0, hppa_som_reloc, "R_RESERVED"}, - {R_RESERVED, 0, 0, 32, false, 0, 0, hppa_som_reloc, "R_RESERVED"}, - {R_RESERVED, 0, 0, 32, false, 0, 0, hppa_som_reloc, "R_RESERVED"}, - {R_RESERVED, 0, 0, 32, false, 0, 0, hppa_som_reloc, "R_RESERVED"}, - {R_RESERVED, 0, 0, 32, false, 0, 0, hppa_som_reloc, "R_RESERVED"}, - {R_RESERVED, 0, 0, 32, false, 0, 0, hppa_som_reloc, "R_RESERVED"}}; - -/* Initialize the SOM relocation queue. By definition the queue holds - the last four multibyte fixups. */ - -static void -som_initialize_reloc_queue (queue) - struct reloc_queue *queue; -{ - queue[0].reloc = NULL; - queue[0].size = 0; - queue[1].reloc = NULL; - queue[1].size = 0; - queue[2].reloc = NULL; - queue[2].size = 0; - queue[3].reloc = NULL; - queue[3].size = 0; -} - -/* Insert a new relocation into the relocation queue. */ - -static void -som_reloc_queue_insert (p, size, queue) - unsigned char *p; - unsigned int size; - struct reloc_queue *queue; -{ - queue[3].reloc = queue[2].reloc; - queue[3].size = queue[2].size; - queue[2].reloc = queue[1].reloc; - queue[2].size = queue[1].size; - queue[1].reloc = queue[0].reloc; - queue[1].size = queue[0].size; - queue[0].reloc = p; - queue[0].size = size; -} - -/* When an entry in the relocation queue is reused, the entry moves - to the front of the queue. */ - -static void -som_reloc_queue_fix (queue, index) - struct reloc_queue *queue; - unsigned int index; -{ - if (index == 0) - return; - - if (index == 1) - { - unsigned char *tmp1 = queue[0].reloc; - unsigned int tmp2 = queue[0].size; - queue[0].reloc = queue[1].reloc; - queue[0].size = queue[1].size; - queue[1].reloc = tmp1; - queue[1].size = tmp2; - return; - } - - if (index == 2) - { - unsigned char *tmp1 = queue[0].reloc; - unsigned int tmp2 = queue[0].size; - queue[0].reloc = queue[2].reloc; - queue[0].size = queue[2].size; - queue[2].reloc = queue[1].reloc; - queue[2].size = queue[1].size; - queue[1].reloc = tmp1; - queue[1].size = tmp2; - return; - } - - if (index == 3) - { - unsigned char *tmp1 = queue[0].reloc; - unsigned int tmp2 = queue[0].size; - queue[0].reloc = queue[3].reloc; - queue[0].size = queue[3].size; - queue[3].reloc = queue[2].reloc; - queue[3].size = queue[2].size; - queue[2].reloc = queue[1].reloc; - queue[2].size = queue[1].size; - queue[1].reloc = tmp1; - queue[1].size = tmp2; - return; - } - abort(); -} - -/* Search for a particular relocation in the relocation queue. */ - -static int -som_reloc_queue_find (p, size, queue) - unsigned char *p; - unsigned int size; - struct reloc_queue *queue; -{ - if (queue[0].reloc && !memcmp (p, queue[0].reloc, size) - && size == queue[0].size) - return 0; - if (queue[1].reloc && !memcmp (p, queue[1].reloc, size) - && size == queue[1].size) - return 1; - if (queue[2].reloc && !memcmp (p, queue[2].reloc, size) - && size == queue[2].size) - return 2; - if (queue[3].reloc && !memcmp (p, queue[3].reloc, size) - && size == queue[3].size) - return 3; - return -1; -} - -static unsigned char * -try_prev_fixup (abfd, subspace_reloc_sizep, p, size, queue) - bfd *abfd; - int *subspace_reloc_sizep; - unsigned char *p; - unsigned int size; - struct reloc_queue *queue; -{ - int queue_index = som_reloc_queue_find (p, size, queue); - - if (queue_index != -1) - { - /* Found this in a previous fixup. Undo the fixup we - just built and use R_PREV_FIXUP instead. We saved - a total of size - 1 bytes in the fixup stream. */ - bfd_put_8 (abfd, R_PREV_FIXUP + queue_index, p); - p += 1; - *subspace_reloc_sizep += 1; - som_reloc_queue_fix (queue, queue_index); - } - else - { - som_reloc_queue_insert (p, size, queue); - *subspace_reloc_sizep += size; - p += size; - } - return p; -} - -/* Emit the proper R_NO_RELOCATION fixups to map the next SKIP - bytes without any relocation. Update the size of the subspace - relocation stream via SUBSPACE_RELOC_SIZE_P; also return the - current pointer into the relocation stream. */ - -static unsigned char * -som_reloc_skip (abfd, skip, p, subspace_reloc_sizep, queue) - bfd *abfd; - unsigned int skip; - unsigned char *p; - unsigned int *subspace_reloc_sizep; - struct reloc_queue *queue; -{ - /* Use a 4 byte R_NO_RELOCATION entry with a maximal value - then R_PREV_FIXUPs to get the difference down to a - reasonable size. */ - if (skip >= 0x1000000) - { - skip -= 0x1000000; - bfd_put_8 (abfd, R_NO_RELOCATION + 31, p); - bfd_put_8 (abfd, 0xff, p + 1); - bfd_put_16 (abfd, 0xffff, p + 2); - p = try_prev_fixup (abfd, subspace_reloc_sizep, p, 4, queue); - while (skip >= 0x1000000) - { - skip -= 0x1000000; - bfd_put_8 (abfd, R_PREV_FIXUP, p); - p++; - *subspace_reloc_sizep += 1; - /* No need to adjust queue here since we are repeating the - most recent fixup. */ - } - } - - /* The difference must be less than 0x1000000. Use one - more R_NO_RELOCATION entry to get to the right difference. */ - if ((skip & 3) == 0 && skip <= 0xc0000 && skip > 0) - { - /* Difference can be handled in a simple single-byte - R_NO_RELOCATION entry. */ - if (skip <= 0x60) - { - bfd_put_8 (abfd, R_NO_RELOCATION + (skip >> 2) - 1, p); - *subspace_reloc_sizep += 1; - p++; - } - /* Handle it with a two byte R_NO_RELOCATION entry. */ - else if (skip <= 0x1000) - { - bfd_put_8 (abfd, R_NO_RELOCATION + 24 + (((skip >> 2) - 1) >> 8), p); - bfd_put_8 (abfd, (skip >> 2) - 1, p + 1); - p = try_prev_fixup (abfd, subspace_reloc_sizep, p, 2, queue); - } - /* Handle it with a three byte R_NO_RELOCATION entry. */ - else - { - bfd_put_8 (abfd, R_NO_RELOCATION + 28 + (((skip >> 2) - 1) >> 16), p); - bfd_put_16 (abfd, (skip >> 2) - 1, p + 1); - p = try_prev_fixup (abfd, subspace_reloc_sizep, p, 3, queue); - } - } - /* Ugh. Punt and use a 4 byte entry. */ - else if (skip > 0) - { - bfd_put_8 (abfd, R_NO_RELOCATION + 31, p); - bfd_put_8 (abfd, (skip - 1) >> 16, p + 1); - bfd_put_16 (abfd, skip - 1, p + 2); - p = try_prev_fixup (abfd, subspace_reloc_sizep, p, 4, queue); - } - return p; -} - -/* Emit the proper R_DATA_OVERRIDE fixups to handle a nonzero addend - from a BFD relocation. Update the size of the subspace relocation - stream via SUBSPACE_RELOC_SIZE_P; also return the current pointer - into the relocation stream. */ - -static unsigned char * -som_reloc_addend (abfd, addend, p, subspace_reloc_sizep, queue) - bfd *abfd; - int addend; - unsigned char *p; - unsigned int *subspace_reloc_sizep; - struct reloc_queue *queue; -{ - if ((unsigned)(addend) + 0x80 < 0x100) - { - bfd_put_8 (abfd, R_DATA_OVERRIDE + 1, p); - bfd_put_8 (abfd, addend, p + 1); - p = try_prev_fixup (abfd, subspace_reloc_sizep, p, 2, queue); - } - else if ((unsigned) (addend) + 0x8000 < 0x10000) - { - bfd_put_8 (abfd, R_DATA_OVERRIDE + 2, p); - bfd_put_16 (abfd, addend, p + 1); - p = try_prev_fixup (abfd, subspace_reloc_sizep, p, 3, queue); - } - else if ((unsigned) (addend) + 0x800000 < 0x1000000) - { - bfd_put_8 (abfd, R_DATA_OVERRIDE + 3, p); - bfd_put_8 (abfd, addend >> 16, p + 1); - bfd_put_16 (abfd, addend, p + 2); - p = try_prev_fixup (abfd, subspace_reloc_sizep, p, 4, queue); - } - else - { - bfd_put_8 (abfd, R_DATA_OVERRIDE + 4, p); - bfd_put_32 (abfd, addend, p + 1); - p = try_prev_fixup (abfd, subspace_reloc_sizep, p, 5, queue); - } - return p; -} - -/* Handle a single function call relocation. */ - -static unsigned char * -som_reloc_call (abfd, p, subspace_reloc_sizep, bfd_reloc, sym_num, queue) - bfd *abfd; - unsigned char *p; - unsigned int *subspace_reloc_sizep; - arelent *bfd_reloc; - int sym_num; - struct reloc_queue *queue; -{ - int arg_bits = HPPA_R_ARG_RELOC (bfd_reloc->addend); - int rtn_bits = arg_bits & 0x3; - int type, done = 0; - - /* You'll never believe all this is necessary to handle relocations - for function calls. Having to compute and pack the argument - relocation bits is the real nightmare. - - If you're interested in how this works, just forget it. You really - do not want to know about this braindamage. */ - - /* First see if this can be done with a "simple" relocation. Simple - relocations have a symbol number < 0x100 and have simple encodings - of argument relocations. */ - - if (sym_num < 0x100) - { - switch (arg_bits) - { - case 0: - case 1: - type = 0; - break; - case 1 << 8: - case 1 << 8 | 1: - type = 1; - break; - case 1 << 8 | 1 << 6: - case 1 << 8 | 1 << 6 | 1: - type = 2; - break; - case 1 << 8 | 1 << 6 | 1 << 4: - case 1 << 8 | 1 << 6 | 1 << 4 | 1: - type = 3; - break; - case 1 << 8 | 1 << 6 | 1 << 4 | 1 << 2: - case 1 << 8 | 1 << 6 | 1 << 4 | 1 << 2 | 1: - type = 4; - break; - default: - /* Not one of the easy encodings. This will have to be - handled by the more complex code below. */ - type = -1; - break; - } - if (type != -1) - { - /* Account for the return value too. */ - if (rtn_bits) - type += 5; - - /* Emit a 2 byte relocation. Then see if it can be handled - with a relocation which is already in the relocation queue. */ - bfd_put_8 (abfd, bfd_reloc->howto->type + type, p); - bfd_put_8 (abfd, sym_num, p + 1); - p = try_prev_fixup (abfd, subspace_reloc_sizep, p, 2, queue); - done = 1; - } - } - - /* If this could not be handled with a simple relocation, then do a hard - one. Hard relocations occur if the symbol number was too high or if - the encoding of argument relocation bits is too complex. */ - if (! done) - { - /* Don't ask about these magic sequences. I took them straight - from gas-1.36 which took them from the a.out man page. */ - type = rtn_bits; - if ((arg_bits >> 6 & 0xf) == 0xe) - type += 9 * 40; - else - type += (3 * (arg_bits >> 8 & 3) + (arg_bits >> 6 & 3)) * 40; - if ((arg_bits >> 2 & 0xf) == 0xe) - type += 9 * 4; - else - type += (3 * (arg_bits >> 4 & 3) + (arg_bits >> 2 & 3)) * 4; - - /* Output the first two bytes of the relocation. These describe - the length of the relocation and encoding style. */ - bfd_put_8 (abfd, bfd_reloc->howto->type + 10 - + 2 * (sym_num >= 0x100) + (type >= 0x100), - p); - bfd_put_8 (abfd, type, p + 1); - - /* Now output the symbol index and see if this bizarre relocation - just happened to be in the relocation queue. */ - if (sym_num < 0x100) - { - bfd_put_8 (abfd, sym_num, p + 2); - p = try_prev_fixup (abfd, subspace_reloc_sizep, p, 3, queue); - } - else - { - bfd_put_8 (abfd, sym_num >> 16, p + 2); - bfd_put_16 (abfd, sym_num, p + 3); - p = try_prev_fixup (abfd, subspace_reloc_sizep, p, 5, queue); - } - } - return p; -} - - -/* Return the logarithm of X, base 2, considering X unsigned. - Abort -1 if X is not a power or two or is zero. */ - -static int -log2 (x) - unsigned int x; -{ - int log = 0; - - /* Test for 0 or a power of 2. */ - if (x == 0 || x != (x & -x)) - return -1; - - while ((x >>= 1) != 0) - log++; - return log; -} - -static bfd_reloc_status_type -hppa_som_reloc (abfd, reloc_entry, symbol_in, data, - input_section, output_bfd, error_message) - bfd *abfd; - arelent *reloc_entry; - asymbol *symbol_in; - PTR data; - asection *input_section; - bfd *output_bfd; - char **error_message; -{ - if (output_bfd) - { - reloc_entry->address += input_section->output_offset; - return bfd_reloc_ok; - } - return bfd_reloc_ok; -} - -/* Given a generic HPPA relocation type, the instruction format, - and a field selector, return one or more appropriate SOM relocations. */ - -int ** -hppa_som_gen_reloc_type (abfd, base_type, format, field, sym_diff) - bfd *abfd; - int base_type; - int format; - enum hppa_reloc_field_selector_type_alt field; - int sym_diff; -{ - int *final_type, **final_types; - - final_types = (int **) bfd_alloc_by_size_t (abfd, sizeof (int *) * 6); - final_type = (int *) bfd_alloc_by_size_t (abfd, sizeof (int)); - if (!final_types || !final_type) - return NULL; - - /* The field selector may require additional relocations to be - generated. It's impossible to know at this moment if additional - relocations will be needed, so we make them. The code to actually - write the relocation/fixup stream is responsible for removing - any redundant relocations. */ - switch (field) - { - case e_fsel: - case e_psel: - case e_lpsel: - case e_rpsel: - final_types[0] = final_type; - final_types[1] = NULL; - final_types[2] = NULL; - *final_type = base_type; - break; - - case e_tsel: - case e_ltsel: - case e_rtsel: - final_types[0] = (int *) bfd_alloc_by_size_t (abfd, sizeof (int)); - if (!final_types[0]) - return NULL; - if (field == e_tsel) - *final_types[0] = R_FSEL; - else if (field == e_ltsel) - *final_types[0] = R_LSEL; - else - *final_types[0] = R_RSEL; - final_types[1] = final_type; - final_types[2] = NULL; - *final_type = base_type; - break; - - case e_lssel: - case e_rssel: - final_types[0] = (int *) bfd_alloc_by_size_t (abfd, sizeof (int)); - if (!final_types[0]) - return NULL; - *final_types[0] = R_S_MODE; - final_types[1] = final_type; - final_types[2] = NULL; - *final_type = base_type; - break; - - case e_lsel: - case e_rsel: - final_types[0] = (int *) bfd_alloc_by_size_t (abfd, sizeof (int)); - if (!final_types[0]) - return NULL; - *final_types[0] = R_N_MODE; - final_types[1] = final_type; - final_types[2] = NULL; - *final_type = base_type; - break; - - case e_ldsel: - case e_rdsel: - final_types[0] = (int *) bfd_alloc_by_size_t (abfd, sizeof (int)); - if (!final_types[0]) - return NULL; - *final_types[0] = R_D_MODE; - final_types[1] = final_type; - final_types[2] = NULL; - *final_type = base_type; - break; - - case e_lrsel: - case e_rrsel: - final_types[0] = (int *) bfd_alloc_by_size_t (abfd, sizeof (int)); - if (!final_types[0]) - return NULL; - *final_types[0] = R_R_MODE; - final_types[1] = final_type; - final_types[2] = NULL; - *final_type = base_type; - break; - - case e_nsel: - final_types[0] = (int *) bfd_alloc_by_size_t (abfd, sizeof (int)); - if (!final_types[0]) - return NULL; - *final_types[0] = R_N1SEL; - final_types[1] = final_type; - final_types[2] = NULL; - *final_type = base_type; - break; - - case e_nlsel: - case e_nlrsel: - final_types[0] = (int *) bfd_alloc_by_size_t (abfd, sizeof (int)); - if (!final_types[0]) - return NULL; - *final_types[0] = R_N0SEL; - final_types[1] = (int *) bfd_alloc_by_size_t (abfd, sizeof (int)); - if (!final_types[1]) - return NULL; - if (field == e_nlsel) - *final_types[1] = R_N_MODE; - else - *final_types[1] = R_R_MODE; - final_types[2] = final_type; - final_types[3] = NULL; - *final_type = base_type; - break; - } - - switch (base_type) - { - case R_HPPA: - /* The difference of two symbols needs *very* special handling. */ - if (sym_diff) - { - final_types[0] = (int *)bfd_alloc_by_size_t (abfd, sizeof (int)); - final_types[1] = (int *)bfd_alloc_by_size_t (abfd, sizeof (int)); - final_types[2] = (int *)bfd_alloc_by_size_t (abfd, sizeof (int)); - final_types[3] = (int *)bfd_alloc_by_size_t (abfd, sizeof (int)); - if (!final_types[0] || !final_types[1] || !final_types[2]) - return NULL; - if (field == e_fsel) - *final_types[0] = R_FSEL; - else if (field == e_rsel) - *final_types[0] = R_RSEL; - else if (field == e_lsel) - *final_types[0] = R_LSEL; - *final_types[1] = R_COMP2; - *final_types[2] = R_COMP2; - *final_types[3] = R_COMP1; - final_types[4] = final_type; - *final_types[4] = R_CODE_EXPR; - final_types[5] = NULL; - break; - } - /* PLABELs get their own relocation type. */ - else if (field == e_psel - || field == e_lpsel - || field == e_rpsel) - { - /* A PLABEL relocation that has a size of 32 bits must - be a R_DATA_PLABEL. All others are R_CODE_PLABELs. */ - if (format == 32) - *final_type = R_DATA_PLABEL; - else - *final_type = R_CODE_PLABEL; - } - /* PIC stuff. */ - else if (field == e_tsel - || field == e_ltsel - || field == e_rtsel) - *final_type = R_DLT_REL; - /* A relocation in the data space is always a full 32bits. */ - else if (format == 32) - *final_type = R_DATA_ONE_SYMBOL; - - break; - - case R_HPPA_GOTOFF: - /* More PLABEL special cases. */ - if (field == e_psel - || field == e_lpsel - || field == e_rpsel) - *final_type = R_DATA_PLABEL; - break; - - case R_HPPA_COMPLEX: - /* The difference of two symbols needs *very* special handling. */ - if (sym_diff) - { - final_types[0] = (int *)bfd_alloc_by_size_t (abfd, sizeof (int)); - final_types[1] = (int *)bfd_alloc_by_size_t (abfd, sizeof (int)); - final_types[2] = (int *)bfd_alloc_by_size_t (abfd, sizeof (int)); - final_types[3] = (int *)bfd_alloc_by_size_t (abfd, sizeof (int)); - if (!final_types[0] || !final_types[1] || !final_types[2]) - return NULL; - if (field == e_fsel) - *final_types[0] = R_FSEL; - else if (field == e_rsel) - *final_types[0] = R_RSEL; - else if (field == e_lsel) - *final_types[0] = R_LSEL; - *final_types[1] = R_COMP2; - *final_types[2] = R_COMP2; - *final_types[3] = R_COMP1; - final_types[4] = final_type; - *final_types[4] = R_CODE_EXPR; - final_types[5] = NULL; - break; - } - else - break; - - case R_HPPA_NONE: - case R_HPPA_ABS_CALL: - case R_HPPA_PCREL_CALL: - /* Right now we can default all these. */ - break; - } - return final_types; -} - -/* Return the address of the correct entry in the PA SOM relocation - howto table. */ - -/*ARGSUSED*/ -static reloc_howto_type * -som_bfd_reloc_type_lookup (abfd, code) - bfd *abfd; - bfd_reloc_code_real_type code; -{ - if ((int) code < (int) R_NO_RELOCATION + 255) - { - BFD_ASSERT ((int) som_hppa_howto_table[(int) code].type == (int) code); - return &som_hppa_howto_table[(int) code]; - } - - return (reloc_howto_type *) 0; -} - -/* Perform some initialization for an object. Save results of this - initialization in the BFD. */ - -static const bfd_target * -som_object_setup (abfd, file_hdrp, aux_hdrp) - bfd *abfd; - struct header *file_hdrp; - struct som_exec_auxhdr *aux_hdrp; -{ - asection *section; - int found; - - /* som_mkobject will set bfd_error if som_mkobject fails. */ - if (som_mkobject (abfd) != true) - return 0; - - /* Set BFD flags based on what information is available in the SOM. */ - abfd->flags = NO_FLAGS; - if (file_hdrp->symbol_total) - abfd->flags |= HAS_LINENO | HAS_DEBUG | HAS_SYMS | HAS_LOCALS; - - switch (file_hdrp->a_magic) - { - case DEMAND_MAGIC: - abfd->flags |= (D_PAGED | WP_TEXT | EXEC_P); - break; - case SHARE_MAGIC: - abfd->flags |= (WP_TEXT | EXEC_P); - break; - case EXEC_MAGIC: - abfd->flags |= (EXEC_P); - break; - case RELOC_MAGIC: - abfd->flags |= HAS_RELOC; - break; -#ifdef SHL_MAGIC - case SHL_MAGIC: -#endif -#ifdef DL_MAGIC - case DL_MAGIC: -#endif - abfd->flags |= DYNAMIC; - break; - - default: - break; - } - - /* Allocate space to hold the saved exec header information. */ - obj_som_exec_data (abfd) = (struct som_exec_data *) - bfd_zalloc (abfd, sizeof (struct som_exec_data )); - if (obj_som_exec_data (abfd) == NULL) - return NULL; - - /* The braindamaged OSF1 linker switched exec_flags and exec_entry! - - We used to identify OSF1 binaries based on NEW_VERSION_ID, but - apparently the latest HPUX linker is using NEW_VERSION_ID now. - - It's about time, OSF has used the new id since at least 1992; - HPUX didn't start till nearly 1995!. - - The new approach examines the entry field. If it's zero or not 4 - byte aligned then it's not a proper code address and we guess it's - really the executable flags. */ - found = 0; - for (section = abfd->sections; section; section = section->next) - { - if ((section->flags & SEC_CODE) == 0) - continue; - if (aux_hdrp->exec_entry >= section->vma - && aux_hdrp->exec_entry < section->vma + section->_cooked_size) - found = 1; - } - if (aux_hdrp->exec_entry == 0 - || (aux_hdrp->exec_entry & 0x3) != 0 - || ! found) - { - bfd_get_start_address (abfd) = aux_hdrp->exec_flags; - obj_som_exec_data (abfd)->exec_flags = aux_hdrp->exec_entry; - } - else - { - bfd_get_start_address (abfd) = aux_hdrp->exec_entry; - obj_som_exec_data (abfd)->exec_flags = aux_hdrp->exec_flags; - } - - bfd_default_set_arch_mach (abfd, bfd_arch_hppa, pa10); - bfd_get_symcount (abfd) = file_hdrp->symbol_total; - - /* Initialize the saved symbol table and string table to NULL. - Save important offsets and sizes from the SOM header into - the BFD. */ - obj_som_stringtab (abfd) = (char *) NULL; - obj_som_symtab (abfd) = (som_symbol_type *) NULL; - obj_som_sorted_syms (abfd) = NULL; - obj_som_stringtab_size (abfd) = file_hdrp->symbol_strings_size; - obj_som_sym_filepos (abfd) = file_hdrp->symbol_location; - obj_som_str_filepos (abfd) = file_hdrp->symbol_strings_location; - obj_som_reloc_filepos (abfd) = file_hdrp->fixup_request_location; - obj_som_exec_data (abfd)->system_id = file_hdrp->system_id; - - return abfd->xvec; -} - -/* Convert all of the space and subspace info into BFD sections. Each space - contains a number of subspaces, which in turn describe the mapping between - regions of the exec file, and the address space that the program runs in. - BFD sections which correspond to spaces will overlap the sections for the - associated subspaces. */ - -static boolean -setup_sections (abfd, file_hdr) - bfd *abfd; - struct header *file_hdr; -{ - char *space_strings; - unsigned int space_index, i; - unsigned int total_subspaces = 0; - asection **subspace_sections, *section; - - /* First, read in space names */ - - space_strings = bfd_malloc (file_hdr->space_strings_size); - if (!space_strings && file_hdr->space_strings_size != 0) - goto error_return; - - if (bfd_seek (abfd, file_hdr->space_strings_location, SEEK_SET) < 0) - goto error_return; - if (bfd_read (space_strings, 1, file_hdr->space_strings_size, abfd) - != file_hdr->space_strings_size) - goto error_return; - - /* Loop over all of the space dictionaries, building up sections */ - for (space_index = 0; space_index < file_hdr->space_total; space_index++) - { - struct space_dictionary_record space; - struct subspace_dictionary_record subspace, save_subspace; - int subspace_index; - asection *space_asect; - char *newname; - - /* Read the space dictionary element */ - if (bfd_seek (abfd, file_hdr->space_location - + space_index * sizeof space, SEEK_SET) < 0) - goto error_return; - if (bfd_read (&space, 1, sizeof space, abfd) != sizeof space) - goto error_return; - - /* Setup the space name string */ - space.name.n_name = space.name.n_strx + space_strings; - - /* Make a section out of it */ - newname = bfd_alloc (abfd, strlen (space.name.n_name) + 1); - if (!newname) - goto error_return; - strcpy (newname, space.name.n_name); - - space_asect = bfd_make_section_anyway (abfd, newname); - if (!space_asect) - goto error_return; - - if (space.is_loadable == 0) - space_asect->flags |= SEC_DEBUGGING; - - /* Set up all the attributes for the space. */ - if (bfd_som_set_section_attributes (space_asect, space.is_defined, - space.is_private, space.sort_key, - space.space_number) == false) - goto error_return; - - /* If the space has no subspaces, then we're done. */ - if (space.subspace_quantity == 0) - continue; - - /* Now, read in the first subspace for this space */ - if (bfd_seek (abfd, file_hdr->subspace_location - + space.subspace_index * sizeof subspace, - SEEK_SET) < 0) - goto error_return; - if (bfd_read (&subspace, 1, sizeof subspace, abfd) != sizeof subspace) - goto error_return; - /* Seek back to the start of the subspaces for loop below */ - if (bfd_seek (abfd, file_hdr->subspace_location - + space.subspace_index * sizeof subspace, - SEEK_SET) < 0) - goto error_return; - - /* Setup the start address and file loc from the first subspace record */ - space_asect->vma = subspace.subspace_start; - space_asect->filepos = subspace.file_loc_init_value; - space_asect->alignment_power = log2 (subspace.alignment); - if (space_asect->alignment_power == -1) - goto error_return; - - /* Initialize save_subspace so we can reliably determine if this - loop placed any useful values into it. */ - memset (&save_subspace, 0, sizeof (struct subspace_dictionary_record)); - - /* Loop over the rest of the subspaces, building up more sections */ - for (subspace_index = 0; subspace_index < space.subspace_quantity; - subspace_index++) - { - asection *subspace_asect; - - /* Read in the next subspace */ - if (bfd_read (&subspace, 1, sizeof subspace, abfd) - != sizeof subspace) - goto error_return; - - /* Setup the subspace name string */ - subspace.name.n_name = subspace.name.n_strx + space_strings; - - newname = bfd_alloc (abfd, strlen (subspace.name.n_name) + 1); - if (!newname) - goto error_return; - strcpy (newname, subspace.name.n_name); - - /* Make a section out of this subspace */ - subspace_asect = bfd_make_section_anyway (abfd, newname); - if (!subspace_asect) - goto error_return; - - /* Store private information about the section. */ - if (bfd_som_set_subsection_attributes (subspace_asect, space_asect, - subspace.access_control_bits, - subspace.sort_key, - subspace.quadrant) == false) - goto error_return; - - /* Keep an easy mapping between subspaces and sections. - Note we do not necessarily read the subspaces in the - same order in which they appear in the object file. - - So to make the target index come out correctly, we - store the location of the subspace header in target - index, then sort using the location of the subspace - header as the key. Then we can assign correct - subspace indices. */ - total_subspaces++; - subspace_asect->target_index = bfd_tell (abfd) - sizeof (subspace); - - /* Set SEC_READONLY and SEC_CODE/SEC_DATA as specified - by the access_control_bits in the subspace header. */ - switch (subspace.access_control_bits >> 4) - { - /* Readonly data. */ - case 0x0: - subspace_asect->flags |= SEC_DATA | SEC_READONLY; - break; - - /* Normal data. */ - case 0x1: - subspace_asect->flags |= SEC_DATA; - break; - - /* Readonly code and the gateways. - Gateways have other attributes which do not map - into anything BFD knows about. */ - case 0x2: - case 0x4: - case 0x5: - case 0x6: - case 0x7: - subspace_asect->flags |= SEC_CODE | SEC_READONLY; - break; - - /* dynamic (writable) code. */ - case 0x3: - subspace_asect->flags |= SEC_CODE; - break; - } - - if (subspace.dup_common || subspace.is_common) - subspace_asect->flags |= SEC_IS_COMMON; - else if (subspace.subspace_length > 0) - subspace_asect->flags |= SEC_HAS_CONTENTS; - - if (subspace.is_loadable) - subspace_asect->flags |= SEC_ALLOC | SEC_LOAD; - else - subspace_asect->flags |= SEC_DEBUGGING; - - if (subspace.code_only) - subspace_asect->flags |= SEC_CODE; - - /* Both file_loc_init_value and initialization_length will - be zero for a BSS like subspace. */ - if (subspace.file_loc_init_value == 0 - && subspace.initialization_length == 0) - subspace_asect->flags &= ~(SEC_DATA | SEC_LOAD | SEC_HAS_CONTENTS); - - /* This subspace has relocations. - The fixup_request_quantity is a byte count for the number of - entries in the relocation stream; it is not the actual number - of relocations in the subspace. */ - if (subspace.fixup_request_quantity != 0) - { - subspace_asect->flags |= SEC_RELOC; - subspace_asect->rel_filepos = subspace.fixup_request_index; - som_section_data (subspace_asect)->reloc_size - = subspace.fixup_request_quantity; - /* We can not determine this yet. When we read in the - relocation table the correct value will be filled in. */ - subspace_asect->reloc_count = -1; - } - - /* Update save_subspace if appropriate. */ - if (subspace.file_loc_init_value > save_subspace.file_loc_init_value) - save_subspace = subspace; - - subspace_asect->vma = subspace.subspace_start; - subspace_asect->_cooked_size = subspace.subspace_length; - subspace_asect->_raw_size = subspace.subspace_length; - subspace_asect->filepos = subspace.file_loc_init_value; - subspace_asect->alignment_power = log2 (subspace.alignment); - if (subspace_asect->alignment_power == -1) - goto error_return; - } - - /* Yow! there is no subspace within the space which actually - has initialized information in it; this should never happen - as far as I know. */ - if (!save_subspace.file_loc_init_value) - goto error_return; - - /* Setup the sizes for the space section based upon the info in the - last subspace of the space. */ - space_asect->_cooked_size = save_subspace.subspace_start - - space_asect->vma + save_subspace.subspace_length; - space_asect->_raw_size = save_subspace.file_loc_init_value - - space_asect->filepos + save_subspace.initialization_length; - } - /* Now that we've read in all the subspace records, we need to assign - a target index to each subspace. */ - subspace_sections = (asection **) bfd_malloc (total_subspaces - * sizeof (asection *)); - if (subspace_sections == NULL) - goto error_return; - - for (i = 0, section = abfd->sections; section; section = section->next) - { - if (!som_is_subspace (section)) - continue; - - subspace_sections[i] = section; - i++; - } - qsort (subspace_sections, total_subspaces, - sizeof (asection *), compare_subspaces); - - /* subspace_sections is now sorted in the order in which the subspaces - appear in the object file. Assign an index to each one now. */ - for (i = 0; i < total_subspaces; i++) - subspace_sections[i]->target_index = i; - - if (space_strings != NULL) - free (space_strings); - - if (subspace_sections != NULL) - free (subspace_sections); - - return true; - - error_return: - if (space_strings != NULL) - free (space_strings); - - if (subspace_sections != NULL) - free (subspace_sections); - return false; -} - -/* Read in a SOM object and make it into a BFD. */ - -static const bfd_target * -som_object_p (abfd) - bfd *abfd; -{ - struct header file_hdr; - struct som_exec_auxhdr aux_hdr; - - if (bfd_read ((PTR) & file_hdr, 1, FILE_HDR_SIZE, abfd) != FILE_HDR_SIZE) - { - if (bfd_get_error () != bfd_error_system_call) - bfd_set_error (bfd_error_wrong_format); - return 0; - } - - if (!_PA_RISC_ID (file_hdr.system_id)) - { - bfd_set_error (bfd_error_wrong_format); - return 0; - } - - switch (file_hdr.a_magic) - { - case RELOC_MAGIC: - case EXEC_MAGIC: - case SHARE_MAGIC: - case DEMAND_MAGIC: -#ifdef DL_MAGIC - case DL_MAGIC: -#endif -#ifdef SHL_MAGIC - case SHL_MAGIC: -#endif -#ifdef EXECLIBMAGIC - case EXECLIBMAGIC: -#endif -#ifdef SHARED_MAGIC_CNX - case SHARED_MAGIC_CNX: -#endif - break; - default: - bfd_set_error (bfd_error_wrong_format); - return 0; - } - - if (file_hdr.version_id != VERSION_ID - && file_hdr.version_id != NEW_VERSION_ID) - { - bfd_set_error (bfd_error_wrong_format); - return 0; - } - - /* If the aux_header_size field in the file header is zero, then this - object is an incomplete executable (a .o file). Do not try to read - a non-existant auxiliary header. */ - memset (&aux_hdr, 0, sizeof (struct som_exec_auxhdr)); - if (file_hdr.aux_header_size != 0) - { - if (bfd_read ((PTR) & aux_hdr, 1, AUX_HDR_SIZE, abfd) != AUX_HDR_SIZE) - { - if (bfd_get_error () != bfd_error_system_call) - bfd_set_error (bfd_error_wrong_format); - return 0; - } - } - - if (!setup_sections (abfd, &file_hdr)) - { - /* setup_sections does not bubble up a bfd error code. */ - bfd_set_error (bfd_error_bad_value); - return 0; - } - - /* This appears to be a valid SOM object. Do some initialization. */ - return som_object_setup (abfd, &file_hdr, &aux_hdr); -} - -/* Create a SOM object. */ - -static boolean -som_mkobject (abfd) - bfd *abfd; -{ - /* Allocate memory to hold backend information. */ - abfd->tdata.som_data = (struct som_data_struct *) - bfd_zalloc (abfd, sizeof (struct som_data_struct)); - if (abfd->tdata.som_data == NULL) - return false; - return true; -} - -/* Initialize some information in the file header. This routine makes - not attempt at doing the right thing for a full executable; it - is only meant to handle relocatable objects. */ - -static boolean -som_prep_headers (abfd) - bfd *abfd; -{ - struct header *file_hdr; - asection *section; - - /* Make and attach a file header to the BFD. */ - file_hdr = (struct header *) bfd_zalloc (abfd, sizeof (struct header)); - if (file_hdr == NULL) - return false; - obj_som_file_hdr (abfd) = file_hdr; - - if (abfd->flags & (EXEC_P | DYNAMIC)) - { - - /* Make and attach an exec header to the BFD. */ - obj_som_exec_hdr (abfd) = (struct som_exec_auxhdr *) - bfd_zalloc (abfd, sizeof (struct som_exec_auxhdr)); - if (obj_som_exec_hdr (abfd) == NULL) - return false; - - if (abfd->flags & D_PAGED) - file_hdr->a_magic = DEMAND_MAGIC; - else if (abfd->flags & WP_TEXT) - file_hdr->a_magic = SHARE_MAGIC; -#ifdef SHL_MAGIC - else if (abfd->flags & DYNAMIC) - file_hdr->a_magic = SHL_MAGIC; -#endif - else - file_hdr->a_magic = EXEC_MAGIC; - } - else - file_hdr->a_magic = RELOC_MAGIC; - - /* Only new format SOM is supported. */ - file_hdr->version_id = NEW_VERSION_ID; - - /* These fields are optional, and embedding timestamps is not always - a wise thing to do, it makes comparing objects during a multi-stage - bootstrap difficult. */ - file_hdr->file_time.secs = 0; - file_hdr->file_time.nanosecs = 0; - - file_hdr->entry_space = 0; - file_hdr->entry_subspace = 0; - file_hdr->entry_offset = 0; - file_hdr->presumed_dp = 0; - - /* Now iterate over the sections translating information from - BFD sections to SOM spaces/subspaces. */ - - for (section = abfd->sections; section != NULL; section = section->next) - { - /* Ignore anything which has not been marked as a space or - subspace. */ - if (!som_is_space (section) && !som_is_subspace (section)) - continue; - - if (som_is_space (section)) - { - /* Allocate space for the space dictionary. */ - som_section_data (section)->space_dict - = (struct space_dictionary_record *) - bfd_zalloc (abfd, sizeof (struct space_dictionary_record)); - if (som_section_data (section)->space_dict == NULL) - return false; - /* Set space attributes. Note most attributes of SOM spaces - are set based on the subspaces it contains. */ - som_section_data (section)->space_dict->loader_fix_index = -1; - som_section_data (section)->space_dict->init_pointer_index = -1; - - /* Set more attributes that were stuffed away in private data. */ - som_section_data (section)->space_dict->sort_key = - som_section_data (section)->copy_data->sort_key; - som_section_data (section)->space_dict->is_defined = - som_section_data (section)->copy_data->is_defined; - som_section_data (section)->space_dict->is_private = - som_section_data (section)->copy_data->is_private; - som_section_data (section)->space_dict->space_number = - som_section_data (section)->copy_data->space_number; - } - else - { - /* Allocate space for the subspace dictionary. */ - som_section_data (section)->subspace_dict - = (struct subspace_dictionary_record *) - bfd_zalloc (abfd, sizeof (struct subspace_dictionary_record)); - if (som_section_data (section)->subspace_dict == NULL) - return false; - - /* Set subspace attributes. Basic stuff is done here, additional - attributes are filled in later as more information becomes - available. */ - if (section->flags & SEC_IS_COMMON) - { - som_section_data (section)->subspace_dict->dup_common = 1; - som_section_data (section)->subspace_dict->is_common = 1; - } - - if (section->flags & SEC_ALLOC) - som_section_data (section)->subspace_dict->is_loadable = 1; - - if (section->flags & SEC_CODE) - som_section_data (section)->subspace_dict->code_only = 1; - - som_section_data (section)->subspace_dict->subspace_start = - section->vma; - som_section_data (section)->subspace_dict->subspace_length = - bfd_section_size (abfd, section); - som_section_data (section)->subspace_dict->initialization_length = - bfd_section_size (abfd, section); - som_section_data (section)->subspace_dict->alignment = - 1 << section->alignment_power; - - /* Set more attributes that were stuffed away in private data. */ - som_section_data (section)->subspace_dict->sort_key = - som_section_data (section)->copy_data->sort_key; - som_section_data (section)->subspace_dict->access_control_bits = - som_section_data (section)->copy_data->access_control_bits; - som_section_data (section)->subspace_dict->quadrant = - som_section_data (section)->copy_data->quadrant; - } - } - return true; -} - -/* Return true if the given section is a SOM space, false otherwise. */ - -static boolean -som_is_space (section) - asection *section; -{ - /* If no copy data is available, then it's neither a space nor a - subspace. */ - if (som_section_data (section)->copy_data == NULL) - return false; - - /* If the containing space isn't the same as the given section, - then this isn't a space. */ - if (som_section_data (section)->copy_data->container != section - && (som_section_data (section)->copy_data->container->output_section - != section)) - return false; - - /* OK. Must be a space. */ - return true; -} - -/* Return true if the given section is a SOM subspace, false otherwise. */ - -static boolean -som_is_subspace (section) - asection *section; -{ - /* If no copy data is available, then it's neither a space nor a - subspace. */ - if (som_section_data (section)->copy_data == NULL) - return false; - - /* If the containing space is the same as the given section, - then this isn't a subspace. */ - if (som_section_data (section)->copy_data->container == section - || (som_section_data (section)->copy_data->container->output_section - == section)) - return false; - - /* OK. Must be a subspace. */ - return true; -} - -/* Return true if the given space containins the given subspace. It - is safe to assume space really is a space, and subspace really - is a subspace. */ - -static boolean -som_is_container (space, subspace) - asection *space, *subspace; -{ - return (som_section_data (subspace)->copy_data->container == space - || (som_section_data (subspace)->copy_data->container->output_section - == space)); -} - -/* Count and return the number of spaces attached to the given BFD. */ - -static unsigned long -som_count_spaces (abfd) - bfd *abfd; -{ - int count = 0; - asection *section; - - for (section = abfd->sections; section != NULL; section = section->next) - count += som_is_space (section); - - return count; -} - -/* Count the number of subspaces attached to the given BFD. */ - -static unsigned long -som_count_subspaces (abfd) - bfd *abfd; -{ - int count = 0; - asection *section; - - for (section = abfd->sections; section != NULL; section = section->next) - count += som_is_subspace (section); - - return count; -} - -/* Return -1, 0, 1 indicating the relative ordering of sym1 and sym2. - - We desire symbols to be ordered starting with the symbol with the - highest relocation count down to the symbol with the lowest relocation - count. Doing so compacts the relocation stream. */ - -static int -compare_syms (arg1, arg2) - const PTR arg1; - const PTR arg2; - -{ - asymbol **sym1 = (asymbol **) arg1; - asymbol **sym2 = (asymbol **) arg2; - unsigned int count1, count2; - - /* Get relocation count for each symbol. Note that the count - is stored in the udata pointer for section symbols! */ - if ((*sym1)->flags & BSF_SECTION_SYM) - count1 = (*sym1)->udata.i; - else - count1 = som_symbol_data (*sym1)->reloc_count; - - if ((*sym2)->flags & BSF_SECTION_SYM) - count2 = (*sym2)->udata.i; - else - count2 = som_symbol_data (*sym2)->reloc_count; - - /* Return the appropriate value. */ - if (count1 < count2) - return 1; - else if (count1 > count2) - return -1; - return 0; -} - -/* Return -1, 0, 1 indicating the relative ordering of subspace1 - and subspace. */ - -static int -compare_subspaces (arg1, arg2) - const PTR arg1; - const PTR arg2; - -{ - asection **subspace1 = (asection **) arg1; - asection **subspace2 = (asection **) arg2; - unsigned int count1, count2; - - if ((*subspace1)->target_index < (*subspace2)->target_index) - return -1; - else if ((*subspace2)->target_index < (*subspace1)->target_index) - return 1; - else - return 0; -} - -/* Perform various work in preparation for emitting the fixup stream. */ - -static void -som_prep_for_fixups (abfd, syms, num_syms) - bfd *abfd; - asymbol **syms; - unsigned long num_syms; -{ - int i; - asection *section; - asymbol **sorted_syms; - - /* Most SOM relocations involving a symbol have a length which is - dependent on the index of the symbol. So symbols which are - used often in relocations should have a small index. */ - - /* First initialize the counters for each symbol. */ - for (i = 0; i < num_syms; i++) - { - /* Handle a section symbol; these have no pointers back to the - SOM symbol info. So we just use the udata field to hold the - relocation count. */ - if (som_symbol_data (syms[i]) == NULL - || syms[i]->flags & BSF_SECTION_SYM) - { - syms[i]->flags |= BSF_SECTION_SYM; - syms[i]->udata.i = 0; - } - else - som_symbol_data (syms[i])->reloc_count = 0; - } - - /* Now that the counters are initialized, make a weighted count - of how often a given symbol is used in a relocation. */ - for (section = abfd->sections; section != NULL; section = section->next) - { - int i; - - /* Does this section have any relocations? */ - if (section->reloc_count <= 0) - continue; - - /* Walk through each relocation for this section. */ - for (i = 1; i < section->reloc_count; i++) - { - arelent *reloc = section->orelocation[i]; - int scale; - - /* A relocation against a symbol in the *ABS* section really - does not have a symbol. Likewise if the symbol isn't associated - with any section. */ - if (reloc->sym_ptr_ptr == NULL - || bfd_is_abs_section ((*reloc->sym_ptr_ptr)->section)) - continue; - - /* Scaling to encourage symbols involved in R_DP_RELATIVE - and R_CODE_ONE_SYMBOL relocations to come first. These - two relocations have single byte versions if the symbol - index is very small. */ - if (reloc->howto->type == R_DP_RELATIVE - || reloc->howto->type == R_CODE_ONE_SYMBOL) - scale = 2; - else - scale = 1; - - /* Handle section symbols by storing the count in the udata - field. It will not be used and the count is very important - for these symbols. */ - if ((*reloc->sym_ptr_ptr)->flags & BSF_SECTION_SYM) - { - (*reloc->sym_ptr_ptr)->udata.i = - (*reloc->sym_ptr_ptr)->udata.i + scale; - continue; - } - - /* A normal symbol. Increment the count. */ - som_symbol_data (*reloc->sym_ptr_ptr)->reloc_count += scale; - } - } - - /* Sort a copy of the symbol table, rather than the canonical - output symbol table. */ - sorted_syms = (asymbol **) bfd_zalloc (abfd, num_syms * sizeof (asymbol *)); - memcpy (sorted_syms, syms, num_syms * sizeof (asymbol *)); - qsort (sorted_syms, num_syms, sizeof (asymbol *), compare_syms); - obj_som_sorted_syms (abfd) = sorted_syms; - - /* Compute the symbol indexes, they will be needed by the relocation - code. */ - for (i = 0; i < num_syms; i++) - { - /* A section symbol. Again, there is no pointer to backend symbol - information, so we reuse the udata field again. */ - if (sorted_syms[i]->flags & BSF_SECTION_SYM) - sorted_syms[i]->udata.i = i; - else - som_symbol_data (sorted_syms[i])->index = i; - } -} - -static boolean -som_write_fixups (abfd, current_offset, total_reloc_sizep) - bfd *abfd; - unsigned long current_offset; - unsigned int *total_reloc_sizep; -{ - unsigned int i, j; - /* Chunk of memory that we can use as buffer space, then throw - away. */ - unsigned char tmp_space[SOM_TMP_BUFSIZE]; - unsigned char *p; - unsigned int total_reloc_size = 0; - unsigned int subspace_reloc_size = 0; - unsigned int num_spaces = obj_som_file_hdr (abfd)->space_total; - asection *section = abfd->sections; - - memset (tmp_space, 0, SOM_TMP_BUFSIZE); - p = tmp_space; - - /* All the fixups for a particular subspace are emitted in a single - stream. All the subspaces for a particular space are emitted - as a single stream. - - So, to get all the locations correct one must iterate through all the - spaces, for each space iterate through its subspaces and output a - fixups stream. */ - for (i = 0; i < num_spaces; i++) - { - asection *subsection; - - /* Find a space. */ - while (!som_is_space (section)) - section = section->next; - - /* Now iterate through each of its subspaces. */ - for (subsection = abfd->sections; - subsection != NULL; - subsection = subsection->next) - { - int reloc_offset, current_rounding_mode; - - /* Find a subspace of this space. */ - if (!som_is_subspace (subsection) - || !som_is_container (section, subsection)) - continue; - - /* If this subspace does not have real data, then we are - finised with it. */ - if ((subsection->flags & SEC_HAS_CONTENTS) == 0) - { - som_section_data (subsection)->subspace_dict->fixup_request_index - = -1; - continue; - } - - /* This subspace has some relocations. Put the relocation stream - index into the subspace record. */ - som_section_data (subsection)->subspace_dict->fixup_request_index - = total_reloc_size; - - /* To make life easier start over with a clean slate for - each subspace. Seek to the start of the relocation stream - for this subspace in preparation for writing out its fixup - stream. */ - if (bfd_seek (abfd, current_offset + total_reloc_size, SEEK_SET) < 0) - return false; - - /* Buffer space has already been allocated. Just perform some - initialization here. */ - p = tmp_space; - subspace_reloc_size = 0; - reloc_offset = 0; - som_initialize_reloc_queue (reloc_queue); - current_rounding_mode = R_N_MODE; - - /* Translate each BFD relocation into one or more SOM - relocations. */ - for (j = 0; j < subsection->reloc_count; j++) - { - arelent *bfd_reloc = subsection->orelocation[j]; - unsigned int skip; - int sym_num; - - /* Get the symbol number. Remember it's stored in a - special place for section symbols. */ - if ((*bfd_reloc->sym_ptr_ptr)->flags & BSF_SECTION_SYM) - sym_num = (*bfd_reloc->sym_ptr_ptr)->udata.i; - else - sym_num = som_symbol_data (*bfd_reloc->sym_ptr_ptr)->index; - - /* If there is not enough room for the next couple relocations, - then dump the current buffer contents now. Also reinitialize - the relocation queue. - - No single BFD relocation could ever translate into more - than 100 bytes of SOM relocations (20bytes is probably the - upper limit, but leave lots of space for growth). */ - if (p - tmp_space + 100 > SOM_TMP_BUFSIZE) - { - if (bfd_write ((PTR) tmp_space, p - tmp_space, 1, abfd) - != p - tmp_space) - return false; - - p = tmp_space; - som_initialize_reloc_queue (reloc_queue); - } - - /* Emit R_NO_RELOCATION fixups to map any bytes which were - skipped. */ - skip = bfd_reloc->address - reloc_offset; - p = som_reloc_skip (abfd, skip, p, - &subspace_reloc_size, reloc_queue); - - /* Update reloc_offset for the next iteration. - - Many relocations do not consume input bytes. They - are markers, or set state necessary to perform some - later relocation. */ - switch (bfd_reloc->howto->type) - { - /* This only needs to handle relocations that may be - made by hppa_som_gen_reloc. */ - case R_ENTRY: - case R_ALT_ENTRY: - case R_EXIT: - case R_N_MODE: - case R_S_MODE: - case R_D_MODE: - case R_R_MODE: - case R_FSEL: - case R_LSEL: - case R_RSEL: - case R_COMP1: - case R_COMP2: - case R_BEGIN_BRTAB: - case R_END_BRTAB: - case R_N0SEL: - case R_N1SEL: - reloc_offset = bfd_reloc->address; - break; - - default: - reloc_offset = bfd_reloc->address + 4; - break; - } - - /* Now the actual relocation we care about. */ - switch (bfd_reloc->howto->type) - { - case R_PCREL_CALL: - case R_ABS_CALL: - p = som_reloc_call (abfd, p, &subspace_reloc_size, - bfd_reloc, sym_num, reloc_queue); - break; - - case R_CODE_ONE_SYMBOL: - case R_DP_RELATIVE: - /* Account for any addend. */ - if (bfd_reloc->addend) - p = som_reloc_addend (abfd, bfd_reloc->addend, p, - &subspace_reloc_size, reloc_queue); - - if (sym_num < 0x20) - { - bfd_put_8 (abfd, bfd_reloc->howto->type + sym_num, p); - subspace_reloc_size += 1; - p += 1; - } - else if (sym_num < 0x100) - { - bfd_put_8 (abfd, bfd_reloc->howto->type + 32, p); - bfd_put_8 (abfd, sym_num, p + 1); - p = try_prev_fixup (abfd, &subspace_reloc_size, p, - 2, reloc_queue); - } - else if (sym_num < 0x10000000) - { - bfd_put_8 (abfd, bfd_reloc->howto->type + 33, p); - bfd_put_8 (abfd, sym_num >> 16, p + 1); - bfd_put_16 (abfd, sym_num, p + 2); - p = try_prev_fixup (abfd, &subspace_reloc_size, - p, 4, reloc_queue); - } - else - abort (); - break; - - case R_DATA_ONE_SYMBOL: - case R_DATA_PLABEL: - case R_CODE_PLABEL: - case R_DLT_REL: - /* Account for any addend using R_DATA_OVERRIDE. */ - if (bfd_reloc->howto->type != R_DATA_ONE_SYMBOL - && bfd_reloc->addend) - p = som_reloc_addend (abfd, bfd_reloc->addend, p, - &subspace_reloc_size, reloc_queue); - - if (sym_num < 0x100) - { - bfd_put_8 (abfd, bfd_reloc->howto->type, p); - bfd_put_8 (abfd, sym_num, p + 1); - p = try_prev_fixup (abfd, &subspace_reloc_size, p, - 2, reloc_queue); - } - else if (sym_num < 0x10000000) - { - bfd_put_8 (abfd, bfd_reloc->howto->type + 1, p); - bfd_put_8 (abfd, sym_num >> 16, p + 1); - bfd_put_16 (abfd, sym_num, p + 2); - p = try_prev_fixup (abfd, &subspace_reloc_size, - p, 4, reloc_queue); - } - else - abort (); - break; - - case R_ENTRY: - { - int tmp; - arelent *tmp_reloc = NULL; - bfd_put_8 (abfd, R_ENTRY, p); - - /* R_ENTRY relocations have 64 bits of associated - data. Unfortunately the addend field of a bfd - relocation is only 32 bits. So, we split up - the 64bit unwind information and store part in - the R_ENTRY relocation, and the rest in the R_EXIT - relocation. */ - bfd_put_32 (abfd, bfd_reloc->addend, p + 1); - - /* Find the next R_EXIT relocation. */ - for (tmp = j; tmp < subsection->reloc_count; tmp++) - { - tmp_reloc = subsection->orelocation[tmp]; - if (tmp_reloc->howto->type == R_EXIT) - break; - } - - if (tmp == subsection->reloc_count) - abort (); - - bfd_put_32 (abfd, tmp_reloc->addend, p + 5); - p = try_prev_fixup (abfd, &subspace_reloc_size, - p, 9, reloc_queue); - break; - } - - case R_N_MODE: - case R_S_MODE: - case R_D_MODE: - case R_R_MODE: - /* If this relocation requests the current rounding - mode, then it is redundant. */ - if (bfd_reloc->howto->type != current_rounding_mode) - { - bfd_put_8 (abfd, bfd_reloc->howto->type, p); - subspace_reloc_size += 1; - p += 1; - current_rounding_mode = bfd_reloc->howto->type; - } - break; - - case R_EXIT: - case R_ALT_ENTRY: - case R_FSEL: - case R_LSEL: - case R_RSEL: - case R_BEGIN_BRTAB: - case R_END_BRTAB: - case R_N0SEL: - case R_N1SEL: - bfd_put_8 (abfd, bfd_reloc->howto->type, p); - subspace_reloc_size += 1; - p += 1; - break; - - case R_COMP1: - /* The only time we generate R_COMP1, R_COMP2 and - R_CODE_EXPR relocs is for the difference of two - symbols. Hence we can cheat here. */ - bfd_put_8 (abfd, bfd_reloc->howto->type, p); - bfd_put_8 (abfd, 0x44, p + 1); - p = try_prev_fixup (abfd, &subspace_reloc_size, - p, 2, reloc_queue); - break; - - case R_COMP2: - /* The only time we generate R_COMP1, R_COMP2 and - R_CODE_EXPR relocs is for the difference of two - symbols. Hence we can cheat here. */ - bfd_put_8 (abfd, bfd_reloc->howto->type, p); - bfd_put_8 (abfd, 0x80, p + 1); - bfd_put_8 (abfd, sym_num >> 16, p + 2); - bfd_put_16 (abfd, sym_num, p + 3); - p = try_prev_fixup (abfd, &subspace_reloc_size, - p, 5, reloc_queue); - break; - - case R_CODE_EXPR: - /* The only time we generate R_COMP1, R_COMP2 and - R_CODE_EXPR relocs is for the difference of two - symbols. Hence we can cheat here. */ - bfd_put_8 (abfd, bfd_reloc->howto->type, p); - subspace_reloc_size += 1; - p += 1; - break; - - /* Put a "R_RESERVED" relocation in the stream if - we hit something we do not understand. The linker - will complain loudly if this ever happens. */ - default: - bfd_put_8 (abfd, 0xff, p); - subspace_reloc_size += 1; - p += 1; - break; - } - } - - /* Last BFD relocation for a subspace has been processed. - Map the rest of the subspace with R_NO_RELOCATION fixups. */ - p = som_reloc_skip (abfd, bfd_section_size (abfd, subsection) - - reloc_offset, - p, &subspace_reloc_size, reloc_queue); - - /* Scribble out the relocations. */ - if (bfd_write ((PTR) tmp_space, p - tmp_space, 1, abfd) - != p - tmp_space) - return false; - p = tmp_space; - - total_reloc_size += subspace_reloc_size; - som_section_data (subsection)->subspace_dict->fixup_request_quantity - = subspace_reloc_size; - } - section = section->next; - } - *total_reloc_sizep = total_reloc_size; - return true; -} - -/* Write out the space/subspace string table. */ - -static boolean -som_write_space_strings (abfd, current_offset, string_sizep) - bfd *abfd; - unsigned long current_offset; - unsigned int *string_sizep; -{ - /* Chunk of memory that we can use as buffer space, then throw - away. */ - unsigned char tmp_space[SOM_TMP_BUFSIZE]; - unsigned char *p; - unsigned int strings_size = 0; - asection *section; - - memset (tmp_space, 0, SOM_TMP_BUFSIZE); - p = tmp_space; - - /* Seek to the start of the space strings in preparation for writing - them out. */ - if (bfd_seek (abfd, current_offset, SEEK_SET) < 0) - return false; - - /* Walk through all the spaces and subspaces (order is not important) - building up and writing string table entries for their names. */ - for (section = abfd->sections; section != NULL; section = section->next) - { - int length; - - /* Only work with space/subspaces; avoid any other sections - which might have been made (.text for example). */ - if (!som_is_space (section) && !som_is_subspace (section)) - continue; - - /* Get the length of the space/subspace name. */ - length = strlen (section->name); - - /* If there is not enough room for the next entry, then dump the - current buffer contents now. Each entry will take 4 bytes to - hold the string length + the string itself + null terminator. */ - if (p - tmp_space + 5 + length > SOM_TMP_BUFSIZE) - { - if (bfd_write ((PTR) &tmp_space[0], p - tmp_space, 1, abfd) - != p - tmp_space) - return false; - /* Reset to beginning of the buffer space. */ - p = tmp_space; - } - - /* First element in a string table entry is the length of the - string. Alignment issues are already handled. */ - bfd_put_32 (abfd, length, p); - p += 4; - strings_size += 4; - - /* Record the index in the space/subspace records. */ - if (som_is_space (section)) - som_section_data (section)->space_dict->name.n_strx = strings_size; - else - som_section_data (section)->subspace_dict->name.n_strx = strings_size; - - /* Next comes the string itself + a null terminator. */ - strcpy (p, section->name); - p += length + 1; - strings_size += length + 1; - - /* Always align up to the next word boundary. */ - while (strings_size % 4) - { - bfd_put_8 (abfd, 0, p); - p++; - strings_size++; - } - } - - /* Done with the space/subspace strings. Write out any information - contained in a partial block. */ - if (bfd_write ((PTR) &tmp_space[0], p - tmp_space, 1, abfd) != p - tmp_space) - return false; - *string_sizep = strings_size; - return true; -} - -/* Write out the symbol string table. */ - -static boolean -som_write_symbol_strings (abfd, current_offset, syms, num_syms, string_sizep) - bfd *abfd; - unsigned long current_offset; - asymbol **syms; - unsigned int num_syms; - unsigned int *string_sizep; -{ - unsigned int i; - - /* Chunk of memory that we can use as buffer space, then throw - away. */ - unsigned char tmp_space[SOM_TMP_BUFSIZE]; - unsigned char *p; - unsigned int strings_size = 0; - - memset (tmp_space, 0, SOM_TMP_BUFSIZE); - p = tmp_space; - - /* Seek to the start of the space strings in preparation for writing - them out. */ - if (bfd_seek (abfd, current_offset, SEEK_SET) < 0) - return false; - - for (i = 0; i < num_syms; i++) - { - int length = strlen (syms[i]->name); - - /* If there is not enough room for the next entry, then dump the - current buffer contents now. */ - if (p - tmp_space + 5 + length > SOM_TMP_BUFSIZE) - { - if (bfd_write ((PTR) &tmp_space[0], p - tmp_space, 1, abfd) - != p - tmp_space) - return false; - /* Reset to beginning of the buffer space. */ - p = tmp_space; - } - - /* First element in a string table entry is the length of the - string. This must always be 4 byte aligned. This is also - an appropriate time to fill in the string index field in the - symbol table entry. */ - bfd_put_32 (abfd, length, p); - strings_size += 4; - p += 4; - - /* Next comes the string itself + a null terminator. */ - strcpy (p, syms[i]->name); - - som_symbol_data(syms[i])->stringtab_offset = strings_size; - p += length + 1; - strings_size += length + 1; - - /* Always align up to the next word boundary. */ - while (strings_size % 4) - { - bfd_put_8 (abfd, 0, p); - strings_size++; - p++; - } - } - - /* Scribble out any partial block. */ - if (bfd_write ((PTR) &tmp_space[0], p - tmp_space, 1, abfd) != p - tmp_space) - return false; - - *string_sizep = strings_size; - return true; -} - -/* Compute variable information to be placed in the SOM headers, - space/subspace dictionaries, relocation streams, etc. Begin - writing parts of the object file. */ - -static boolean -som_begin_writing (abfd) - bfd *abfd; -{ - unsigned long current_offset = 0; - int strings_size = 0; - unsigned int total_reloc_size = 0; - unsigned long num_spaces, num_subspaces, i; - asection *section; - unsigned int total_subspaces = 0; - struct som_exec_auxhdr *exec_header = NULL; - - /* The file header will always be first in an object file, - everything else can be in random locations. To keep things - "simple" BFD will lay out the object file in the manner suggested - by the PRO ABI for PA-RISC Systems. */ - - /* Before any output can really begin offsets for all the major - portions of the object file must be computed. So, starting - with the initial file header compute (and sometimes write) - each portion of the object file. */ - - /* Make room for the file header, it's contents are not complete - yet, so it can not be written at this time. */ - current_offset += sizeof (struct header); - - /* Any auxiliary headers will follow the file header. Right now - we support only the copyright and version headers. */ - obj_som_file_hdr (abfd)->aux_header_location = current_offset; - obj_som_file_hdr (abfd)->aux_header_size = 0; - if (abfd->flags & (EXEC_P | DYNAMIC)) - { - /* Parts of the exec header will be filled in later, so - delay writing the header itself. Fill in the defaults, - and write it later. */ - current_offset += sizeof (struct som_exec_auxhdr); - obj_som_file_hdr (abfd)->aux_header_size - += sizeof (struct som_exec_auxhdr); - exec_header = obj_som_exec_hdr (abfd); - exec_header->som_auxhdr.type = EXEC_AUX_ID; - exec_header->som_auxhdr.length = 40; - } - if (obj_som_version_hdr (abfd) != NULL) - { - unsigned int len; - - if (bfd_seek (abfd, current_offset, SEEK_SET) < 0) - return false; - - /* Write the aux_id structure and the string length. */ - len = sizeof (struct aux_id) + sizeof (unsigned int); - obj_som_file_hdr (abfd)->aux_header_size += len; - current_offset += len; - if (bfd_write ((PTR) obj_som_version_hdr (abfd), len, 1, abfd) != len) - return false; - - /* Write the version string. */ - len = obj_som_version_hdr (abfd)->header_id.length - sizeof (int); - obj_som_file_hdr (abfd)->aux_header_size += len; - current_offset += len; - if (bfd_write ((PTR) obj_som_version_hdr (abfd)->user_string, - len, 1, abfd) != len) - return false; - } - - if (obj_som_copyright_hdr (abfd) != NULL) - { - unsigned int len; - - if (bfd_seek (abfd, current_offset, SEEK_SET) < 0) - return false; - - /* Write the aux_id structure and the string length. */ - len = sizeof (struct aux_id) + sizeof (unsigned int); - obj_som_file_hdr (abfd)->aux_header_size += len; - current_offset += len; - if (bfd_write ((PTR) obj_som_copyright_hdr (abfd), len, 1, abfd) != len) - return false; - - /* Write the copyright string. */ - len = obj_som_copyright_hdr (abfd)->header_id.length - sizeof (int); - obj_som_file_hdr (abfd)->aux_header_size += len; - current_offset += len; - if (bfd_write ((PTR) obj_som_copyright_hdr (abfd)->copyright, - len, 1, abfd) != len) - return false; - } - - /* Next comes the initialization pointers; we have no initialization - pointers, so current offset does not change. */ - obj_som_file_hdr (abfd)->init_array_location = current_offset; - obj_som_file_hdr (abfd)->init_array_total = 0; - - /* Next are the space records. These are fixed length records. - - Count the number of spaces to determine how much room is needed - in the object file for the space records. - - The names of the spaces are stored in a separate string table, - and the index for each space into the string table is computed - below. Therefore, it is not possible to write the space headers - at this time. */ - num_spaces = som_count_spaces (abfd); - obj_som_file_hdr (abfd)->space_location = current_offset; - obj_som_file_hdr (abfd)->space_total = num_spaces; - current_offset += num_spaces * sizeof (struct space_dictionary_record); - - /* Next are the subspace records. These are fixed length records. - - Count the number of subspaes to determine how much room is needed - in the object file for the subspace records. - - A variety if fields in the subspace record are still unknown at - this time (index into string table, fixup stream location/size, etc). */ - num_subspaces = som_count_subspaces (abfd); - obj_som_file_hdr (abfd)->subspace_location = current_offset; - obj_som_file_hdr (abfd)->subspace_total = num_subspaces; - current_offset += num_subspaces * sizeof (struct subspace_dictionary_record); - - /* Next is the string table for the space/subspace names. We will - build and write the string table on the fly. At the same time - we will fill in the space/subspace name index fields. */ - - /* The string table needs to be aligned on a word boundary. */ - if (current_offset % 4) - current_offset += (4 - (current_offset % 4)); - - /* Mark the offset of the space/subspace string table in the - file header. */ - obj_som_file_hdr (abfd)->space_strings_location = current_offset; - - /* Scribble out the space strings. */ - if (som_write_space_strings (abfd, current_offset, &strings_size) == false) - return false; - - /* Record total string table size in the header and update the - current offset. */ - obj_som_file_hdr (abfd)->space_strings_size = strings_size; - current_offset += strings_size; - - /* Next is the compiler records. We do not use these. */ - obj_som_file_hdr (abfd)->compiler_location = current_offset; - obj_som_file_hdr (abfd)->compiler_total = 0; - - /* Now compute the file positions for the loadable subspaces, taking - care to make sure everything stays properly aligned. */ - - section = abfd->sections; - for (i = 0; i < num_spaces; i++) - { - asection *subsection; - int first_subspace; - unsigned int subspace_offset = 0; - - /* Find a space. */ - while (!som_is_space (section)) - section = section->next; - - first_subspace = 1; - /* Now look for all its subspaces. */ - for (subsection = abfd->sections; - subsection != NULL; - subsection = subsection->next) - { - - if (!som_is_subspace (subsection) - || !som_is_container (section, subsection) - || (subsection->flags & SEC_ALLOC) == 0) - continue; - - /* If this is the first subspace in the space, and we are - building an executable, then take care to make sure all - the alignments are correct and update the exec header. */ - if (first_subspace - && (abfd->flags & (EXEC_P | DYNAMIC))) - { - /* Demand paged executables have each space aligned to a - page boundary. Sharable executables (write-protected - text) have just the private (aka data & bss) space aligned - to a page boundary. Ugh. Not true for HPUX. - - The HPUX kernel requires the text to always be page aligned - within the file regardless of the executable's type. */ - if (abfd->flags & (D_PAGED | DYNAMIC) - || (subsection->flags & SEC_CODE) - || ((abfd->flags & WP_TEXT) - && (subsection->flags & SEC_DATA))) - current_offset = SOM_ALIGN (current_offset, PA_PAGESIZE); - - /* Update the exec header. */ - if (subsection->flags & SEC_CODE && exec_header->exec_tfile == 0) - { - exec_header->exec_tmem = section->vma; - exec_header->exec_tfile = current_offset; - } - if (subsection->flags & SEC_DATA && exec_header->exec_dfile == 0) - { - exec_header->exec_dmem = section->vma; - exec_header->exec_dfile = current_offset; - } - - /* Keep track of exactly where we are within a particular - space. This is necessary as the braindamaged HPUX - loader will create holes between subspaces *and* - subspace alignments are *NOT* preserved. What a crock. */ - subspace_offset = subsection->vma; - - /* Only do this for the first subspace within each space. */ - first_subspace = 0; - } - else if (abfd->flags & (EXEC_P | DYNAMIC)) - { - /* The braindamaged HPUX loader may have created a hole - between two subspaces. It is *not* sufficient to use - the alignment specifications within the subspaces to - account for these holes -- I've run into at least one - case where the loader left one code subspace unaligned - in a final executable. - - To combat this we keep a current offset within each space, - and use the subspace vma fields to detect and preserve - holes. What a crock! - - ps. This is not necessary for unloadable space/subspaces. */ - current_offset += subsection->vma - subspace_offset; - if (subsection->flags & SEC_CODE) - exec_header->exec_tsize += subsection->vma - subspace_offset; - else - exec_header->exec_dsize += subsection->vma - subspace_offset; - subspace_offset += subsection->vma - subspace_offset; - } - - - subsection->target_index = total_subspaces++; - /* This is real data to be loaded from the file. */ - if (subsection->flags & SEC_LOAD) - { - /* Update the size of the code & data. */ - if (abfd->flags & (EXEC_P | DYNAMIC) - && subsection->flags & SEC_CODE) - exec_header->exec_tsize += subsection->_cooked_size; - else if (abfd->flags & (EXEC_P | DYNAMIC) - && subsection->flags & SEC_DATA) - exec_header->exec_dsize += subsection->_cooked_size; - som_section_data (subsection)->subspace_dict->file_loc_init_value - = current_offset; - subsection->filepos = current_offset; - current_offset += bfd_section_size (abfd, subsection); - subspace_offset += bfd_section_size (abfd, subsection); - } - /* Looks like uninitialized data. */ - else - { - /* Update the size of the bss section. */ - if (abfd->flags & (EXEC_P | DYNAMIC)) - exec_header->exec_bsize += subsection->_cooked_size; - - som_section_data (subsection)->subspace_dict->file_loc_init_value - = 0; - som_section_data (subsection)->subspace_dict-> - initialization_length = 0; - } - } - /* Goto the next section. */ - section = section->next; - } - - /* Finally compute the file positions for unloadable subspaces. - If building an executable, start the unloadable stuff on its - own page. */ - - if (abfd->flags & (EXEC_P | DYNAMIC)) - current_offset = SOM_ALIGN (current_offset, PA_PAGESIZE); - - obj_som_file_hdr (abfd)->unloadable_sp_location = current_offset; - section = abfd->sections; - for (i = 0; i < num_spaces; i++) - { - asection *subsection; - - /* Find a space. */ - while (!som_is_space (section)) - section = section->next; - - if (abfd->flags & (EXEC_P | DYNAMIC)) - current_offset = SOM_ALIGN (current_offset, PA_PAGESIZE); - - /* Now look for all its subspaces. */ - for (subsection = abfd->sections; - subsection != NULL; - subsection = subsection->next) - { - - if (!som_is_subspace (subsection) - || !som_is_container (section, subsection) - || (subsection->flags & SEC_ALLOC) != 0) - continue; - - subsection->target_index = total_subspaces++; - /* This is real data to be loaded from the file. */ - if ((subsection->flags & SEC_LOAD) == 0) - { - som_section_data (subsection)->subspace_dict->file_loc_init_value - = current_offset; - subsection->filepos = current_offset; - current_offset += bfd_section_size (abfd, subsection); - } - /* Looks like uninitialized data. */ - else - { - som_section_data (subsection)->subspace_dict->file_loc_init_value - = 0; - som_section_data (subsection)->subspace_dict-> - initialization_length = bfd_section_size (abfd, subsection); - } - } - /* Goto the next section. */ - section = section->next; - } - - /* If building an executable, then make sure to seek to and write - one byte at the end of the file to make sure any necessary - zeros are filled in. Ugh. */ - if (abfd->flags & (EXEC_P | DYNAMIC)) - current_offset = SOM_ALIGN (current_offset, PA_PAGESIZE); - if (bfd_seek (abfd, current_offset - 1, SEEK_SET) < 0) - return false; - if (bfd_write ((PTR) "", 1, 1, abfd) != 1) - return false; - - obj_som_file_hdr (abfd)->unloadable_sp_size - = current_offset - obj_som_file_hdr (abfd)->unloadable_sp_location; - - /* Loader fixups are not supported in any way shape or form. */ - obj_som_file_hdr (abfd)->loader_fixup_location = 0; - obj_som_file_hdr (abfd)->loader_fixup_total = 0; - - /* Done. Store the total size of the SOM so far. */ - obj_som_file_hdr (abfd)->som_length = current_offset; - - return true; -} - -/* Finally, scribble out the various headers to the disk. */ - -static boolean -som_finish_writing (abfd) - bfd *abfd; -{ - int num_spaces = som_count_spaces (abfd); - asymbol **syms = bfd_get_outsymbols (abfd); - int i, num_syms, strings_size; - int subspace_index = 0; - file_ptr location; - asection *section; - unsigned long current_offset; - unsigned int total_reloc_size; - - /* Next is the symbol table. These are fixed length records. - - Count the number of symbols to determine how much room is needed - in the object file for the symbol table. - - The names of the symbols are stored in a separate string table, - and the index for each symbol name into the string table is computed - below. Therefore, it is not possible to write the symbol table - at this time. - - These used to be output before the subspace contents, but they - were moved here to work around a stupid bug in the hpux linker - (fixed in hpux10). */ - current_offset = obj_som_file_hdr (abfd)->som_length; - - /* Make sure we're on a word boundary. */ - if (current_offset % 4) - current_offset += (4 - (current_offset % 4)); - - num_syms = bfd_get_symcount (abfd); - obj_som_file_hdr (abfd)->symbol_location = current_offset; - obj_som_file_hdr (abfd)->symbol_total = num_syms; - current_offset += num_syms * sizeof (struct symbol_dictionary_record); - - /* Next are the symbol strings. - Align them to a word boundary. */ - if (current_offset % 4) - current_offset += (4 - (current_offset % 4)); - obj_som_file_hdr (abfd)->symbol_strings_location = current_offset; - - /* Scribble out the symbol strings. */ - if (som_write_symbol_strings (abfd, current_offset, syms, - num_syms, &strings_size) - == false) - return false; - - /* Record total string table size in header and update the - current offset. */ - obj_som_file_hdr (abfd)->symbol_strings_size = strings_size; - current_offset += strings_size; - - /* Do prep work before handling fixups. */ - som_prep_for_fixups (abfd, - bfd_get_outsymbols (abfd), - bfd_get_symcount (abfd)); - - /* At the end of the file is the fixup stream which starts on a - word boundary. */ - if (current_offset % 4) - current_offset += (4 - (current_offset % 4)); - obj_som_file_hdr (abfd)->fixup_request_location = current_offset; - - /* Write the fixups and update fields in subspace headers which - relate to the fixup stream. */ - if (som_write_fixups (abfd, current_offset, &total_reloc_size) == false) - return false; - - /* Record the total size of the fixup stream in the file header. */ - obj_som_file_hdr (abfd)->fixup_request_total = total_reloc_size; - - /* Done. Store the total size of the SOM. */ - obj_som_file_hdr (abfd)->som_length = current_offset + total_reloc_size; - - /* Now that the symbol table information is complete, build and - write the symbol table. */ - if (som_build_and_write_symbol_table (abfd) == false) - return false; - - /* Subspaces are written first so that we can set up information - about them in their containing spaces as the subspace is written. */ - - /* Seek to the start of the subspace dictionary records. */ - location = obj_som_file_hdr (abfd)->subspace_location; - if (bfd_seek (abfd, location, SEEK_SET) < 0) - return false; - - section = abfd->sections; - /* Now for each loadable space write out records for its subspaces. */ - for (i = 0; i < num_spaces; i++) - { - asection *subsection; - - /* Find a space. */ - while (!som_is_space (section)) - section = section->next; - - /* Now look for all its subspaces. */ - for (subsection = abfd->sections; - subsection != NULL; - subsection = subsection->next) - { - - /* Skip any section which does not correspond to a space - or subspace. Or does not have SEC_ALLOC set (and therefore - has no real bits on the disk). */ - if (!som_is_subspace (subsection) - || !som_is_container (section, subsection) - || (subsection->flags & SEC_ALLOC) == 0) - continue; - - /* If this is the first subspace for this space, then save - the index of the subspace in its containing space. Also - set "is_loadable" in the containing space. */ - - if (som_section_data (section)->space_dict->subspace_quantity == 0) - { - som_section_data (section)->space_dict->is_loadable = 1; - som_section_data (section)->space_dict->subspace_index - = subspace_index; - } - - /* Increment the number of subspaces seen and the number of - subspaces contained within the current space. */ - subspace_index++; - som_section_data (section)->space_dict->subspace_quantity++; - - /* Mark the index of the current space within the subspace's - dictionary record. */ - som_section_data (subsection)->subspace_dict->space_index = i; - - /* Dump the current subspace header. */ - if (bfd_write ((PTR) som_section_data (subsection)->subspace_dict, - sizeof (struct subspace_dictionary_record), 1, abfd) - != sizeof (struct subspace_dictionary_record)) - return false; - } - /* Goto the next section. */ - section = section->next; - } - - /* Now repeat the process for unloadable subspaces. */ - section = abfd->sections; - /* Now for each space write out records for its subspaces. */ - for (i = 0; i < num_spaces; i++) - { - asection *subsection; - - /* Find a space. */ - while (!som_is_space (section)) - section = section->next; - - /* Now look for all its subspaces. */ - for (subsection = abfd->sections; - subsection != NULL; - subsection = subsection->next) - { - - /* Skip any section which does not correspond to a space or - subspace, or which SEC_ALLOC set (and therefore handled - in the loadable spaces/subspaces code above). */ - - if (!som_is_subspace (subsection) - || !som_is_container (section, subsection) - || (subsection->flags & SEC_ALLOC) != 0) - continue; - - /* If this is the first subspace for this space, then save - the index of the subspace in its containing space. Clear - "is_loadable". */ - - if (som_section_data (section)->space_dict->subspace_quantity == 0) - { - som_section_data (section)->space_dict->is_loadable = 0; - som_section_data (section)->space_dict->subspace_index - = subspace_index; - } - - /* Increment the number of subspaces seen and the number of - subspaces contained within the current space. */ - som_section_data (section)->space_dict->subspace_quantity++; - subspace_index++; - - /* Mark the index of the current space within the subspace's - dictionary record. */ - som_section_data (subsection)->subspace_dict->space_index = i; - - /* Dump this subspace header. */ - if (bfd_write ((PTR) som_section_data (subsection)->subspace_dict, - sizeof (struct subspace_dictionary_record), 1, abfd) - != sizeof (struct subspace_dictionary_record)) - return false; - } - /* Goto the next section. */ - section = section->next; - } - - /* All the subspace dictiondary records are written, and all the - fields are set up in the space dictionary records. - - Seek to the right location and start writing the space - dictionary records. */ - location = obj_som_file_hdr (abfd)->space_location; - if (bfd_seek (abfd, location, SEEK_SET) < 0) - return false; - - section = abfd->sections; - for (i = 0; i < num_spaces; i++) - { - - /* Find a space. */ - while (!som_is_space (section)) - section = section->next; - - /* Dump its header */ - if (bfd_write ((PTR) som_section_data (section)->space_dict, - sizeof (struct space_dictionary_record), 1, abfd) - != sizeof (struct space_dictionary_record)) - return false; - - /* Goto the next section. */ - section = section->next; - } - - /* Setting of the system_id has to happen very late now that copying of - BFD private data happens *after* section contents are set. */ - if (abfd->flags & (EXEC_P | DYNAMIC)) - obj_som_file_hdr(abfd)->system_id = obj_som_exec_data (abfd)->system_id; - else if (bfd_get_mach (abfd) == pa11) - obj_som_file_hdr(abfd)->system_id = CPU_PA_RISC1_1; - else - obj_som_file_hdr(abfd)->system_id = CPU_PA_RISC1_0; - - /* Compute the checksum for the file header just before writing - the header to disk. */ - obj_som_file_hdr (abfd)->checksum = som_compute_checksum (abfd); - - /* Only thing left to do is write out the file header. It is always - at location zero. Seek there and write it. */ - if (bfd_seek (abfd, (file_ptr) 0, SEEK_SET) < 0) - return false; - if (bfd_write ((PTR) obj_som_file_hdr (abfd), - sizeof (struct header), 1, abfd) - != sizeof (struct header)) - return false; - - /* Now write the exec header. */ - if (abfd->flags & (EXEC_P | DYNAMIC)) - { - long tmp; - struct som_exec_auxhdr *exec_header; - - exec_header = obj_som_exec_hdr (abfd); - exec_header->exec_entry = bfd_get_start_address (abfd); - exec_header->exec_flags = obj_som_exec_data (abfd)->exec_flags; - - /* Oh joys. Ram some of the BSS data into the DATA section - to be compatable with how the hp linker makes objects - (saves memory space). */ - tmp = exec_header->exec_dsize; - tmp = SOM_ALIGN (tmp, PA_PAGESIZE); - exec_header->exec_bsize -= (tmp - exec_header->exec_dsize); - if (exec_header->exec_bsize < 0) - exec_header->exec_bsize = 0; - exec_header->exec_dsize = tmp; - - if (bfd_seek (abfd, obj_som_file_hdr (abfd)->aux_header_location, - SEEK_SET) < 0) - return false; - - if (bfd_write ((PTR) exec_header, AUX_HDR_SIZE, 1, abfd) - != AUX_HDR_SIZE) - return false; - } - return true; -} - -/* Compute and return the checksum for a SOM file header. */ - -static unsigned long -som_compute_checksum (abfd) - bfd *abfd; -{ - unsigned long checksum, count, i; - unsigned long *buffer = (unsigned long *) obj_som_file_hdr (abfd); - - checksum = 0; - count = sizeof (struct header) / sizeof (unsigned long); - for (i = 0; i < count; i++) - checksum ^= *(buffer + i); - - return checksum; -} - -static void -som_bfd_derive_misc_symbol_info (abfd, sym, info) - bfd *abfd; - asymbol *sym; - struct som_misc_symbol_info *info; -{ - /* Initialize. */ - memset (info, 0, sizeof (struct som_misc_symbol_info)); - - /* The HP SOM linker requires detailed type information about - all symbols (including undefined symbols!). Unfortunately, - the type specified in an import/export statement does not - always match what the linker wants. Severe braindamage. */ - - /* Section symbols will not have a SOM symbol type assigned to - them yet. Assign all section symbols type ST_DATA. */ - if (sym->flags & BSF_SECTION_SYM) - info->symbol_type = ST_DATA; - else - { - /* Common symbols must have scope SS_UNSAT and type - ST_STORAGE or the linker will choke. */ - if (bfd_is_com_section (sym->section)) - { - info->symbol_scope = SS_UNSAT; - info->symbol_type = ST_STORAGE; - } - - /* It is possible to have a symbol without an associated - type. This happens if the user imported the symbol - without a type and the symbol was never defined - locally. If BSF_FUNCTION is set for this symbol, then - assign it type ST_CODE (the HP linker requires undefined - external functions to have type ST_CODE rather than ST_ENTRY). */ - else if ((som_symbol_data (sym)->som_type == SYMBOL_TYPE_UNKNOWN - || som_symbol_data (sym)->som_type == SYMBOL_TYPE_CODE) - && bfd_is_und_section (sym->section) - && sym->flags & BSF_FUNCTION) - info->symbol_type = ST_CODE; - - /* Handle function symbols which were defined in this file. - They should have type ST_ENTRY. Also retrieve the argument - relocation bits from the SOM backend information. */ - else if (som_symbol_data (sym)->som_type == SYMBOL_TYPE_ENTRY - || (som_symbol_data (sym)->som_type == SYMBOL_TYPE_CODE - && (sym->flags & BSF_FUNCTION)) - || (som_symbol_data (sym)->som_type == SYMBOL_TYPE_UNKNOWN - && (sym->flags & BSF_FUNCTION))) - { - info->symbol_type = ST_ENTRY; - info->arg_reloc = som_symbol_data (sym)->tc_data.hppa_arg_reloc; - } - - /* If the type is unknown at this point, it should be ST_DATA or - ST_CODE (function/ST_ENTRY symbols were handled as special - cases above). */ - else if (som_symbol_data (sym)->som_type == SYMBOL_TYPE_UNKNOWN) - { - if (sym->section->flags & SEC_CODE) - info->symbol_type = ST_CODE; - else - info->symbol_type = ST_DATA; - } - - /* From now on it's a very simple mapping. */ - else if (som_symbol_data (sym)->som_type == SYMBOL_TYPE_ABSOLUTE) - info->symbol_type = ST_ABSOLUTE; - else if (som_symbol_data (sym)->som_type == SYMBOL_TYPE_CODE) - info->symbol_type = ST_CODE; - else if (som_symbol_data (sym)->som_type == SYMBOL_TYPE_DATA) - info->symbol_type = ST_DATA; - else if (som_symbol_data (sym)->som_type == SYMBOL_TYPE_MILLICODE) - info->symbol_type = ST_MILLICODE; - else if (som_symbol_data (sym)->som_type == SYMBOL_TYPE_PLABEL) - info->symbol_type = ST_PLABEL; - else if (som_symbol_data (sym)->som_type == SYMBOL_TYPE_PRI_PROG) - info->symbol_type = ST_PRI_PROG; - else if (som_symbol_data (sym)->som_type == SYMBOL_TYPE_SEC_PROG) - info->symbol_type = ST_SEC_PROG; - } - - /* Now handle the symbol's scope. Exported data which is not - in the common section has scope SS_UNIVERSAL. Note scope - of common symbols was handled earlier! */ - if (bfd_is_und_section (sym->section)) - info->symbol_scope = SS_UNSAT; - else if (sym->flags & BSF_EXPORT && ! bfd_is_com_section (sym->section)) - info->symbol_scope = SS_UNIVERSAL; - /* Anything else which is not in the common section has scope - SS_LOCAL. */ - else if (! bfd_is_com_section (sym->section)) - info->symbol_scope = SS_LOCAL; - - /* Now set the symbol_info field. It has no real meaning - for undefined or common symbols, but the HP linker will - choke if it's not set to some "reasonable" value. We - use zero as a reasonable value. */ - if (bfd_is_com_section (sym->section) - || bfd_is_und_section (sym->section) - || bfd_is_abs_section (sym->section)) - info->symbol_info = 0; - /* For all other symbols, the symbol_info field contains the - subspace index of the space this symbol is contained in. */ - else - info->symbol_info = sym->section->target_index; - - /* Set the symbol's value. */ - info->symbol_value = sym->value + sym->section->vma; -} - -/* Build and write, in one big chunk, the entire symbol table for - this BFD. */ - -static boolean -som_build_and_write_symbol_table (abfd) - bfd *abfd; -{ - unsigned int num_syms = bfd_get_symcount (abfd); - file_ptr symtab_location = obj_som_file_hdr (abfd)->symbol_location; - asymbol **bfd_syms = obj_som_sorted_syms (abfd); - struct symbol_dictionary_record *som_symtab = NULL; - int i, symtab_size; - - /* Compute total symbol table size and allocate a chunk of memory - to hold the symbol table as we build it. */ - symtab_size = num_syms * sizeof (struct symbol_dictionary_record); - som_symtab = (struct symbol_dictionary_record *) bfd_malloc (symtab_size); - if (som_symtab == NULL && symtab_size != 0) - goto error_return; - memset (som_symtab, 0, symtab_size); - - /* Walk over each symbol. */ - for (i = 0; i < num_syms; i++) - { - struct som_misc_symbol_info info; - - /* This is really an index into the symbol strings table. - By the time we get here, the index has already been - computed and stored into the name field in the BFD symbol. */ - som_symtab[i].name.n_strx = som_symbol_data(bfd_syms[i])->stringtab_offset; - - /* Derive SOM information from the BFD symbol. */ - som_bfd_derive_misc_symbol_info (abfd, bfd_syms[i], &info); - - /* Now use it. */ - som_symtab[i].symbol_type = info.symbol_type; - som_symtab[i].symbol_scope = info.symbol_scope; - som_symtab[i].arg_reloc = info.arg_reloc; - som_symtab[i].symbol_info = info.symbol_info; - som_symtab[i].symbol_value = info.symbol_value; - } - - /* Everything is ready, seek to the right location and - scribble out the symbol table. */ - if (bfd_seek (abfd, symtab_location, SEEK_SET) != 0) - return false; - - if (bfd_write ((PTR) som_symtab, symtab_size, 1, abfd) != symtab_size) - goto error_return; - - if (som_symtab != NULL) - free (som_symtab); - return true; - error_return: - if (som_symtab != NULL) - free (som_symtab); - return false; -} - -/* Write an object in SOM format. */ - -static boolean -som_write_object_contents (abfd) - bfd *abfd; -{ - if (abfd->output_has_begun == false) - { - /* Set up fixed parts of the file, space, and subspace headers. - Notify the world that output has begun. */ - som_prep_headers (abfd); - abfd->output_has_begun = true; - /* Start writing the object file. This include all the string - tables, fixup streams, and other portions of the object file. */ - som_begin_writing (abfd); - } - - return (som_finish_writing (abfd)); -} - - -/* Read and save the string table associated with the given BFD. */ - -static boolean -som_slurp_string_table (abfd) - bfd *abfd; -{ - char *stringtab; - - /* Use the saved version if its available. */ - if (obj_som_stringtab (abfd) != NULL) - return true; - - /* I don't think this can currently happen, and I'm not sure it should - really be an error, but it's better than getting unpredictable results - from the host's malloc when passed a size of zero. */ - if (obj_som_stringtab_size (abfd) == 0) - { - bfd_set_error (bfd_error_no_symbols); - return false; - } - - /* Allocate and read in the string table. */ - stringtab = bfd_malloc (obj_som_stringtab_size (abfd)); - if (stringtab == NULL) - return false; - memset (stringtab, 0, obj_som_stringtab_size (abfd)); - - if (bfd_seek (abfd, obj_som_str_filepos (abfd), SEEK_SET) < 0) - return false; - - if (bfd_read (stringtab, obj_som_stringtab_size (abfd), 1, abfd) - != obj_som_stringtab_size (abfd)) - return false; - - /* Save our results and return success. */ - obj_som_stringtab (abfd) = stringtab; - return true; -} - -/* Return the amount of data (in bytes) required to hold the symbol - table for this object. */ - -static long -som_get_symtab_upper_bound (abfd) - bfd *abfd; -{ - if (!som_slurp_symbol_table (abfd)) - return -1; - - return (bfd_get_symcount (abfd) + 1) * (sizeof (asymbol *)); -} - -/* Convert from a SOM subspace index to a BFD section. */ - -static asection * -bfd_section_from_som_symbol (abfd, symbol) - bfd *abfd; - struct symbol_dictionary_record *symbol; -{ - asection *section; - - /* The meaning of the symbol_info field changes for functions - within executables. So only use the quick symbol_info mapping for - incomplete objects and non-function symbols in executables. */ - if ((abfd->flags & (EXEC_P | DYNAMIC)) == 0 - || (symbol->symbol_type != ST_ENTRY - && symbol->symbol_type != ST_PRI_PROG - && symbol->symbol_type != ST_SEC_PROG - && symbol->symbol_type != ST_MILLICODE)) - { - unsigned int index = symbol->symbol_info; - for (section = abfd->sections; section != NULL; section = section->next) - if (section->target_index == index && som_is_subspace (section)) - return section; - - /* Could be a symbol from an external library (such as an OMOS - shared library). Don't abort. */ - return bfd_abs_section_ptr; - - } - else - { - unsigned int value = symbol->symbol_value; - - /* For executables we will have to use the symbol's address and - find out what section would contain that address. Yuk. */ - for (section = abfd->sections; section; section = section->next) - { - if (value >= section->vma - && value <= section->vma + section->_cooked_size - && som_is_subspace (section)) - return section; - } - - /* Could be a symbol from an external library (such as an OMOS - shared library). Don't abort. */ - return bfd_abs_section_ptr; - - } -} - -/* Read and save the symbol table associated with the given BFD. */ - -static unsigned int -som_slurp_symbol_table (abfd) - bfd *abfd; -{ - int symbol_count = bfd_get_symcount (abfd); - int symsize = sizeof (struct symbol_dictionary_record); - char *stringtab; - struct symbol_dictionary_record *buf = NULL, *bufp, *endbufp; - som_symbol_type *sym, *symbase; - - /* Return saved value if it exists. */ - if (obj_som_symtab (abfd) != NULL) - goto successful_return; - - /* Special case. This is *not* an error. */ - if (symbol_count == 0) - goto successful_return; - - if (!som_slurp_string_table (abfd)) - goto error_return; - - stringtab = obj_som_stringtab (abfd); - - symbase = ((som_symbol_type *) - bfd_malloc (symbol_count * sizeof (som_symbol_type))); - if (symbase == NULL) - goto error_return; - memset (symbase, 0, symbol_count * sizeof (som_symbol_type)); - - /* Read in the external SOM representation. */ - buf = bfd_malloc (symbol_count * symsize); - if (buf == NULL && symbol_count * symsize != 0) - goto error_return; - if (bfd_seek (abfd, obj_som_sym_filepos (abfd), SEEK_SET) < 0) - goto error_return; - if (bfd_read (buf, symbol_count * symsize, 1, abfd) - != symbol_count * symsize) - goto error_return; - - /* Iterate over all the symbols and internalize them. */ - endbufp = buf + symbol_count; - for (bufp = buf, sym = symbase; bufp < endbufp; ++bufp) - { - - /* I don't think we care about these. */ - if (bufp->symbol_type == ST_SYM_EXT - || bufp->symbol_type == ST_ARG_EXT) - continue; - - /* Set some private data we care about. */ - if (bufp->symbol_type == ST_NULL) - som_symbol_data (sym)->som_type = SYMBOL_TYPE_UNKNOWN; - else if (bufp->symbol_type == ST_ABSOLUTE) - som_symbol_data (sym)->som_type = SYMBOL_TYPE_ABSOLUTE; - else if (bufp->symbol_type == ST_DATA) - som_symbol_data (sym)->som_type = SYMBOL_TYPE_DATA; - else if (bufp->symbol_type == ST_CODE) - som_symbol_data (sym)->som_type = SYMBOL_TYPE_CODE; - else if (bufp->symbol_type == ST_PRI_PROG) - som_symbol_data (sym)->som_type = SYMBOL_TYPE_PRI_PROG; - else if (bufp->symbol_type == ST_SEC_PROG) - som_symbol_data (sym)->som_type = SYMBOL_TYPE_SEC_PROG; - else if (bufp->symbol_type == ST_ENTRY) - som_symbol_data (sym)->som_type = SYMBOL_TYPE_ENTRY; - else if (bufp->symbol_type == ST_MILLICODE) - som_symbol_data (sym)->som_type = SYMBOL_TYPE_MILLICODE; - else if (bufp->symbol_type == ST_PLABEL) - som_symbol_data (sym)->som_type = SYMBOL_TYPE_PLABEL; - else - som_symbol_data (sym)->som_type = SYMBOL_TYPE_UNKNOWN; - som_symbol_data (sym)->tc_data.hppa_arg_reloc = bufp->arg_reloc; - - /* Some reasonable defaults. */ - sym->symbol.the_bfd = abfd; - sym->symbol.name = bufp->name.n_strx + stringtab; - sym->symbol.value = bufp->symbol_value; - sym->symbol.section = 0; - sym->symbol.flags = 0; - - switch (bufp->symbol_type) - { - case ST_ENTRY: - case ST_MILLICODE: - sym->symbol.flags |= BSF_FUNCTION; - sym->symbol.value &= ~0x3; - break; - - case ST_STUB: - case ST_CODE: - case ST_PRI_PROG: - case ST_SEC_PROG: - sym->symbol.value &= ~0x3; - /* If the symbol's scope is ST_UNSAT, then these are - undefined function symbols. */ - if (bufp->symbol_scope == SS_UNSAT) - sym->symbol.flags |= BSF_FUNCTION; - - - default: - break; - } - - /* Handle scoping and section information. */ - switch (bufp->symbol_scope) - { - /* symbol_info field is undefined for SS_EXTERNAL and SS_UNSAT symbols, - so the section associated with this symbol can't be known. */ - case SS_EXTERNAL: - if (bufp->symbol_type != ST_STORAGE) - sym->symbol.section = bfd_und_section_ptr; - else - sym->symbol.section = bfd_com_section_ptr; - sym->symbol.flags |= (BSF_EXPORT | BSF_GLOBAL); - break; - - case SS_UNSAT: - if (bufp->symbol_type != ST_STORAGE) - sym->symbol.section = bfd_und_section_ptr; - else - sym->symbol.section = bfd_com_section_ptr; - break; - - case SS_UNIVERSAL: - sym->symbol.flags |= (BSF_EXPORT | BSF_GLOBAL); - sym->symbol.section = bfd_section_from_som_symbol (abfd, bufp); - sym->symbol.value -= sym->symbol.section->vma; - break; - -#if 0 - /* SS_GLOBAL and SS_LOCAL are two names for the same thing. - Sound dumb? It is. */ - case SS_GLOBAL: -#endif - case SS_LOCAL: - sym->symbol.flags |= BSF_LOCAL; - sym->symbol.section = bfd_section_from_som_symbol (abfd, bufp); - sym->symbol.value -= sym->symbol.section->vma; - break; - } - - /* Mark section symbols and symbols used by the debugger. - Note $START$ is a magic code symbol, NOT a section symbol. */ - if (sym->symbol.name[0] == '$' - && sym->symbol.name[strlen (sym->symbol.name) - 1] == '$' - && !strcmp (sym->symbol.name, sym->symbol.section->name)) - sym->symbol.flags |= BSF_SECTION_SYM; - else if (!strncmp (sym->symbol.name, "L$0\002", 4)) - { - sym->symbol.flags |= BSF_SECTION_SYM; - sym->symbol.name = sym->symbol.section->name; - } - else if (!strncmp (sym->symbol.name, "L$0\001", 4)) - sym->symbol.flags |= BSF_DEBUGGING; - - /* Note increment at bottom of loop, since we skip some symbols - we can not include it as part of the for statement. */ - sym++; - } - - /* Save our results and return success. */ - obj_som_symtab (abfd) = symbase; - successful_return: - if (buf != NULL) - free (buf); - return (true); - - error_return: - if (buf != NULL) - free (buf); - return false; -} - -/* Canonicalize a SOM symbol table. Return the number of entries - in the symbol table. */ - -static long -som_get_symtab (abfd, location) - bfd *abfd; - asymbol **location; -{ - int i; - som_symbol_type *symbase; - - if (!som_slurp_symbol_table (abfd)) - return -1; - - i = bfd_get_symcount (abfd); - symbase = obj_som_symtab (abfd); - - for (; i > 0; i--, location++, symbase++) - *location = &symbase->symbol; - - /* Final null pointer. */ - *location = 0; - return (bfd_get_symcount (abfd)); -} - -/* Make a SOM symbol. There is nothing special to do here. */ - -static asymbol * -som_make_empty_symbol (abfd) - bfd *abfd; -{ - som_symbol_type *new = - (som_symbol_type *) bfd_zalloc (abfd, sizeof (som_symbol_type)); - if (new == NULL) - return 0; - new->symbol.the_bfd = abfd; - - return &new->symbol; -} - -/* Print symbol information. */ - -static void -som_print_symbol (ignore_abfd, afile, symbol, how) - bfd *ignore_abfd; - PTR afile; - asymbol *symbol; - bfd_print_symbol_type how; -{ - FILE *file = (FILE *) afile; - switch (how) - { - case bfd_print_symbol_name: - fprintf (file, "%s", symbol->name); - break; - case bfd_print_symbol_more: - fprintf (file, "som "); - fprintf_vma (file, symbol->value); - fprintf (file, " %lx", (long) symbol->flags); - break; - case bfd_print_symbol_all: - { - CONST char *section_name; - section_name = symbol->section ? symbol->section->name : "(*none*)"; - bfd_print_symbol_vandf ((PTR) file, symbol); - fprintf (file, " %s\t%s", section_name, symbol->name); - break; - } - } -} - -static boolean -som_bfd_is_local_label (abfd, sym) - bfd *abfd; - asymbol *sym; -{ - return (sym->name[0] == 'L' && sym->name[1] == '$'); -} - -/* Count or process variable-length SOM fixup records. - - To avoid code duplication we use this code both to compute the number - of relocations requested by a stream, and to internalize the stream. - - When computing the number of relocations requested by a stream the - variables rptr, section, and symbols have no meaning. - - Return the number of relocations requested by the fixup stream. When - not just counting - - This needs at least two or three more passes to get it cleaned up. */ - -static unsigned int -som_set_reloc_info (fixup, end, internal_relocs, section, symbols, just_count) - unsigned char *fixup; - unsigned int end; - arelent *internal_relocs; - asection *section; - asymbol **symbols; - boolean just_count; -{ - unsigned int op, varname, deallocate_contents = 0; - unsigned char *end_fixups = &fixup[end]; - const struct fixup_format *fp; - char *cp; - unsigned char *save_fixup; - int variables[26], stack[20], c, v, count, prev_fixup, *sp, saved_unwind_bits; - const int *subop; - arelent *rptr= internal_relocs; - unsigned int offset = 0; - -#define var(c) variables[(c) - 'A'] -#define push(v) (*sp++ = (v)) -#define pop() (*--sp) -#define emptystack() (sp == stack) - - som_initialize_reloc_queue (reloc_queue); - memset (variables, 0, sizeof (variables)); - memset (stack, 0, sizeof (stack)); - count = 0; - prev_fixup = 0; - saved_unwind_bits = 0; - sp = stack; - - while (fixup < end_fixups) - { - - /* Save pointer to the start of this fixup. We'll use - it later to determine if it is necessary to put this fixup - on the queue. */ - save_fixup = fixup; - - /* Get the fixup code and its associated format. */ - op = *fixup++; - fp = &som_fixup_formats[op]; - - /* Handle a request for a previous fixup. */ - if (*fp->format == 'P') - { - /* Get pointer to the beginning of the prev fixup, move - the repeated fixup to the head of the queue. */ - fixup = reloc_queue[fp->D].reloc; - som_reloc_queue_fix (reloc_queue, fp->D); - prev_fixup = 1; - - /* Get the fixup code and its associated format. */ - op = *fixup++; - fp = &som_fixup_formats[op]; - } - - /* If this fixup will be passed to BFD, set some reasonable defaults. */ - if (! just_count - && som_hppa_howto_table[op].type != R_NO_RELOCATION - && som_hppa_howto_table[op].type != R_DATA_OVERRIDE) - { - rptr->address = offset; - rptr->howto = &som_hppa_howto_table[op]; - rptr->addend = 0; - rptr->sym_ptr_ptr = bfd_abs_section_ptr->symbol_ptr_ptr; - } - - /* Set default input length to 0. Get the opcode class index - into D. */ - var ('L') = 0; - var ('D') = fp->D; - var ('U') = saved_unwind_bits; - - /* Get the opcode format. */ - cp = fp->format; - - /* Process the format string. Parsing happens in two phases, - parse RHS, then assign to LHS. Repeat until no more - characters in the format string. */ - while (*cp) - { - /* The variable this pass is going to compute a value for. */ - varname = *cp++; - - /* Start processing RHS. Continue until a NULL or '=' is found. */ - do - { - c = *cp++; - - /* If this is a variable, push it on the stack. */ - if (isupper (c)) - push (var (c)); - - /* If this is a lower case letter, then it represents - additional data from the fixup stream to be pushed onto - the stack. */ - else if (islower (c)) - { - int bits = (c - 'a') * 8; - for (v = 0; c > 'a'; --c) - v = (v << 8) | *fixup++; - if (varname == 'V') - v = sign_extend (v, bits); - push (v); - } - - /* A decimal constant. Push it on the stack. */ - else if (isdigit (c)) - { - v = c - '0'; - while (isdigit (*cp)) - v = (v * 10) + (*cp++ - '0'); - push (v); - } - else - - /* An operator. Pop two two values from the stack and - use them as operands to the given operation. Push - the result of the operation back on the stack. */ - switch (c) - { - case '+': - v = pop (); - v += pop (); - push (v); - break; - case '*': - v = pop (); - v *= pop (); - push (v); - break; - case '<': - v = pop (); - v = pop () << v; - push (v); - break; - default: - abort (); - } - } - while (*cp && *cp != '='); - - /* Move over the equal operator. */ - cp++; - - /* Pop the RHS off the stack. */ - c = pop (); - - /* Perform the assignment. */ - var (varname) = c; - - /* Handle side effects. and special 'O' stack cases. */ - switch (varname) - { - /* Consume some bytes from the input space. */ - case 'L': - offset += c; - break; - /* A symbol to use in the relocation. Make a note - of this if we are not just counting. */ - case 'S': - if (! just_count) - rptr->sym_ptr_ptr = &symbols[c]; - break; - /* Argument relocation bits for a function call. */ - case 'R': - if (! just_count) - { - unsigned int tmp = var ('R'); - rptr->addend = 0; - - if ((som_hppa_howto_table[op].type == R_PCREL_CALL - && R_PCREL_CALL + 10 > op) - || (som_hppa_howto_table[op].type == R_ABS_CALL - && R_ABS_CALL + 10 > op)) - { - /* Simple encoding. */ - if (tmp > 4) - { - tmp -= 5; - rptr->addend |= 1; - } - if (tmp == 4) - rptr->addend |= 1 << 8 | 1 << 6 | 1 << 4 | 1 << 2; - else if (tmp == 3) - rptr->addend |= 1 << 8 | 1 << 6 | 1 << 4; - else if (tmp == 2) - rptr->addend |= 1 << 8 | 1 << 6; - else if (tmp == 1) - rptr->addend |= 1 << 8; - } - else - { - unsigned int tmp1, tmp2; - - /* First part is easy -- low order two bits are - directly copied, then shifted away. */ - rptr->addend = tmp & 0x3; - tmp >>= 2; - - /* Diving the result by 10 gives us the second - part. If it is 9, then the first two words - are a double precision paramater, else it is - 3 * the first arg bits + the 2nd arg bits. */ - tmp1 = tmp / 10; - tmp -= tmp1 * 10; - if (tmp1 == 9) - rptr->addend += (0xe << 6); - else - { - /* Get the two pieces. */ - tmp2 = tmp1 / 3; - tmp1 -= tmp2 * 3; - /* Put them in the addend. */ - rptr->addend += (tmp2 << 8) + (tmp1 << 6); - } - - /* What's left is the third part. It's unpacked - just like the second. */ - if (tmp == 9) - rptr->addend += (0xe << 2); - else - { - tmp2 = tmp / 3; - tmp -= tmp2 * 3; - rptr->addend += (tmp2 << 4) + (tmp << 2); - } - } - rptr->addend = HPPA_R_ADDEND (rptr->addend, 0); - } - break; - /* Handle the linker expression stack. */ - case 'O': - switch (op) - { - case R_COMP1: - subop = comp1_opcodes; - break; - case R_COMP2: - subop = comp2_opcodes; - break; - case R_COMP3: - subop = comp3_opcodes; - break; - default: - abort (); - } - while (*subop <= (unsigned char) c) - ++subop; - --subop; - break; - /* The lower 32unwind bits must be persistent. */ - case 'U': - saved_unwind_bits = var ('U'); - break; - - default: - break; - } - } - - /* If we used a previous fixup, clean up after it. */ - if (prev_fixup) - { - fixup = save_fixup + 1; - prev_fixup = 0; - } - /* Queue it. */ - else if (fixup > save_fixup + 1) - som_reloc_queue_insert (save_fixup, fixup - save_fixup, reloc_queue); - - /* We do not pass R_DATA_OVERRIDE or R_NO_RELOCATION - fixups to BFD. */ - if (som_hppa_howto_table[op].type != R_DATA_OVERRIDE - && som_hppa_howto_table[op].type != R_NO_RELOCATION) - { - /* Done with a single reloction. Loop back to the top. */ - if (! just_count) - { - if (som_hppa_howto_table[op].type == R_ENTRY) - rptr->addend = var ('T'); - else if (som_hppa_howto_table[op].type == R_EXIT) - rptr->addend = var ('U'); - else if (som_hppa_howto_table[op].type == R_PCREL_CALL - || som_hppa_howto_table[op].type == R_ABS_CALL) - ; - else if (som_hppa_howto_table[op].type == R_DATA_ONE_SYMBOL) - { - unsigned addend = var ('V'); - - /* Try what was specified in R_DATA_OVERRIDE first - (if anything). Then the hard way using the - section contents. */ - rptr->addend = var ('V'); - - if (rptr->addend == 0 && !section->contents) - { - /* Got to read the damn contents first. We don't - bother saving the contents (yet). Add it one - day if the need arises. */ - section->contents = bfd_malloc (section->_raw_size); - if (section->contents == NULL) - return -1; - - deallocate_contents = 1; - bfd_get_section_contents (section->owner, - section, - section->contents, - 0, - section->_raw_size); - } - else if (rptr->addend == 0) - rptr->addend = bfd_get_32 (section->owner, - (section->contents - + offset - var ('L'))); - - } - else - rptr->addend = var ('V'); - rptr++; - } - count++; - /* Now that we've handled a "full" relocation, reset - some state. */ - memset (variables, 0, sizeof (variables)); - memset (stack, 0, sizeof (stack)); - } - } - if (deallocate_contents) - free (section->contents); - - return count; - -#undef var -#undef push -#undef pop -#undef emptystack -} - -/* Read in the relocs (aka fixups in SOM terms) for a section. - - som_get_reloc_upper_bound calls this routine with JUST_COUNT - set to true to indicate it only needs a count of the number - of actual relocations. */ - -static boolean -som_slurp_reloc_table (abfd, section, symbols, just_count) - bfd *abfd; - asection *section; - asymbol **symbols; - boolean just_count; -{ - char *external_relocs; - unsigned int fixup_stream_size; - arelent *internal_relocs; - unsigned int num_relocs; - - fixup_stream_size = som_section_data (section)->reloc_size; - /* If there were no relocations, then there is nothing to do. */ - if (section->reloc_count == 0) - return true; - - /* If reloc_count is -1, then the relocation stream has not been - parsed. We must do so now to know how many relocations exist. */ - if (section->reloc_count == -1) - { - external_relocs = (char *) bfd_malloc (fixup_stream_size); - if (external_relocs == (char *) NULL) - return false; - /* Read in the external forms. */ - if (bfd_seek (abfd, - obj_som_reloc_filepos (abfd) + section->rel_filepos, - SEEK_SET) - != 0) - return false; - if (bfd_read (external_relocs, 1, fixup_stream_size, abfd) - != fixup_stream_size) - return false; - - /* Let callers know how many relocations found. - also save the relocation stream as we will - need it again. */ - section->reloc_count = som_set_reloc_info (external_relocs, - fixup_stream_size, - NULL, NULL, NULL, true); - - som_section_data (section)->reloc_stream = external_relocs; - } - - /* If the caller only wanted a count, then return now. */ - if (just_count) - return true; - - num_relocs = section->reloc_count; - external_relocs = som_section_data (section)->reloc_stream; - /* Return saved information about the relocations if it is available. */ - if (section->relocation != (arelent *) NULL) - return true; - - internal_relocs = (arelent *) - bfd_zalloc (abfd, (num_relocs * sizeof (arelent))); - if (internal_relocs == (arelent *) NULL) - return false; - - /* Process and internalize the relocations. */ - som_set_reloc_info (external_relocs, fixup_stream_size, - internal_relocs, section, symbols, false); - - /* We're done with the external relocations. Free them. */ - free (external_relocs); - - /* Save our results and return success. */ - section->relocation = internal_relocs; - return (true); -} - -/* Return the number of bytes required to store the relocation - information associated with the given section. */ - -static long -som_get_reloc_upper_bound (abfd, asect) - bfd *abfd; - sec_ptr asect; -{ - /* If section has relocations, then read in the relocation stream - and parse it to determine how many relocations exist. */ - if (asect->flags & SEC_RELOC) - { - if (! som_slurp_reloc_table (abfd, asect, NULL, true)) - return -1; - return (asect->reloc_count + 1) * sizeof (arelent *); - } - /* There are no relocations. */ - return 0; -} - -/* Convert relocations from SOM (external) form into BFD internal - form. Return the number of relocations. */ - -static long -som_canonicalize_reloc (abfd, section, relptr, symbols) - bfd *abfd; - sec_ptr section; - arelent **relptr; - asymbol **symbols; -{ - arelent *tblptr; - int count; - - if (som_slurp_reloc_table (abfd, section, symbols, false) == false) - return -1; - - count = section->reloc_count; - tblptr = section->relocation; - - while (count--) - *relptr++ = tblptr++; - - *relptr = (arelent *) NULL; - return section->reloc_count; -} - -extern const bfd_target som_vec; - -/* A hook to set up object file dependent section information. */ - -static boolean -som_new_section_hook (abfd, newsect) - bfd *abfd; - asection *newsect; -{ - newsect->used_by_bfd = - (PTR) bfd_zalloc (abfd, sizeof (struct som_section_data_struct)); - if (!newsect->used_by_bfd) - return false; - newsect->alignment_power = 3; - - /* We allow more than three sections internally */ - return true; -} - -/* Copy any private info we understand from the input symbol - to the output symbol. */ - -static boolean -som_bfd_copy_private_symbol_data (ibfd, isymbol, obfd, osymbol) - bfd *ibfd; - asymbol *isymbol; - bfd *obfd; - asymbol *osymbol; -{ - struct som_symbol *input_symbol = (struct som_symbol *) isymbol; - struct som_symbol *output_symbol = (struct som_symbol *) osymbol; - - /* One day we may try to grok other private data. */ - if (ibfd->xvec->flavour != bfd_target_som_flavour - || obfd->xvec->flavour != bfd_target_som_flavour) - return false; - - /* The only private information we need to copy is the argument relocation - bits. */ - output_symbol->tc_data.hppa_arg_reloc = input_symbol->tc_data.hppa_arg_reloc; - - return true; -} - -/* Copy any private info we understand from the input section - to the output section. */ -static boolean -som_bfd_copy_private_section_data (ibfd, isection, obfd, osection) - bfd *ibfd; - asection *isection; - bfd *obfd; - asection *osection; -{ - /* One day we may try to grok other private data. */ - if (ibfd->xvec->flavour != bfd_target_som_flavour - || obfd->xvec->flavour != bfd_target_som_flavour - || (!som_is_space (isection) && !som_is_subspace (isection))) - return true; - - som_section_data (osection)->copy_data - = (struct som_copyable_section_data_struct *) - bfd_zalloc (obfd, sizeof (struct som_copyable_section_data_struct)); - if (som_section_data (osection)->copy_data == NULL) - return false; - - memcpy (som_section_data (osection)->copy_data, - som_section_data (isection)->copy_data, - sizeof (struct som_copyable_section_data_struct)); - - /* Reparent if necessary. */ - if (som_section_data (osection)->copy_data->container) - som_section_data (osection)->copy_data->container = - som_section_data (osection)->copy_data->container->output_section; - - return true; -} - -/* Copy any private info we understand from the input bfd - to the output bfd. */ - -static boolean -som_bfd_copy_private_bfd_data (ibfd, obfd) - bfd *ibfd, *obfd; -{ - /* One day we may try to grok other private data. */ - if (ibfd->xvec->flavour != bfd_target_som_flavour - || obfd->xvec->flavour != bfd_target_som_flavour) - return true; - - /* Allocate some memory to hold the data we need. */ - obj_som_exec_data (obfd) = (struct som_exec_data *) - bfd_zalloc (obfd, sizeof (struct som_exec_data)); - if (obj_som_exec_data (obfd) == NULL) - return false; - - /* Now copy the data. */ - memcpy (obj_som_exec_data (obfd), obj_som_exec_data (ibfd), - sizeof (struct som_exec_data)); - - return true; -} - -/* Set backend info for sections which can not be described - in the BFD data structures. */ - -boolean -bfd_som_set_section_attributes (section, defined, private, sort_key, spnum) - asection *section; - int defined; - int private; - unsigned int sort_key; - int spnum; -{ - /* Allocate memory to hold the magic information. */ - if (som_section_data (section)->copy_data == NULL) - { - som_section_data (section)->copy_data - = (struct som_copyable_section_data_struct *) - bfd_zalloc (section->owner, - sizeof (struct som_copyable_section_data_struct)); - if (som_section_data (section)->copy_data == NULL) - return false; - } - som_section_data (section)->copy_data->sort_key = sort_key; - som_section_data (section)->copy_data->is_defined = defined; - som_section_data (section)->copy_data->is_private = private; - som_section_data (section)->copy_data->container = section; - som_section_data (section)->copy_data->space_number = spnum; - return true; -} - -/* Set backend info for subsections which can not be described - in the BFD data structures. */ - -boolean -bfd_som_set_subsection_attributes (section, container, access, - sort_key, quadrant) - asection *section; - asection *container; - int access; - unsigned int sort_key; - int quadrant; -{ - /* Allocate memory to hold the magic information. */ - if (som_section_data (section)->copy_data == NULL) - { - som_section_data (section)->copy_data - = (struct som_copyable_section_data_struct *) - bfd_zalloc (section->owner, - sizeof (struct som_copyable_section_data_struct)); - if (som_section_data (section)->copy_data == NULL) - return false; - } - som_section_data (section)->copy_data->sort_key = sort_key; - som_section_data (section)->copy_data->access_control_bits = access; - som_section_data (section)->copy_data->quadrant = quadrant; - som_section_data (section)->copy_data->container = container; - return true; -} - -/* Set the full SOM symbol type. SOM needs far more symbol information - than any other object file format I'm aware of. It is mandatory - to be able to know if a symbol is an entry point, millicode, data, - code, absolute, storage request, or procedure label. If you get - the symbol type wrong your program will not link. */ - -void -bfd_som_set_symbol_type (symbol, type) - asymbol *symbol; - unsigned int type; -{ - som_symbol_data (symbol)->som_type = type; -} - -/* Attach an auxiliary header to the BFD backend so that it may be - written into the object file. */ -boolean -bfd_som_attach_aux_hdr (abfd, type, string) - bfd *abfd; - int type; - char *string; -{ - if (type == VERSION_AUX_ID) - { - int len = strlen (string); - int pad = 0; - - if (len % 4) - pad = (4 - (len % 4)); - obj_som_version_hdr (abfd) = (struct user_string_aux_hdr *) - bfd_zalloc (abfd, sizeof (struct aux_id) - + sizeof (unsigned int) + len + pad); - if (!obj_som_version_hdr (abfd)) - return false; - obj_som_version_hdr (abfd)->header_id.type = VERSION_AUX_ID; - obj_som_version_hdr (abfd)->header_id.length = len + pad; - obj_som_version_hdr (abfd)->header_id.length += sizeof (int); - obj_som_version_hdr (abfd)->string_length = len; - strncpy (obj_som_version_hdr (abfd)->user_string, string, len); - } - else if (type == COPYRIGHT_AUX_ID) - { - int len = strlen (string); - int pad = 0; - - if (len % 4) - pad = (4 - (len % 4)); - obj_som_copyright_hdr (abfd) = (struct copyright_aux_hdr *) - bfd_zalloc (abfd, sizeof (struct aux_id) - + sizeof (unsigned int) + len + pad); - if (!obj_som_copyright_hdr (abfd)) - return false; - obj_som_copyright_hdr (abfd)->header_id.type = COPYRIGHT_AUX_ID; - obj_som_copyright_hdr (abfd)->header_id.length = len + pad; - obj_som_copyright_hdr (abfd)->header_id.length += sizeof (int); - obj_som_copyright_hdr (abfd)->string_length = len; - strcpy (obj_som_copyright_hdr (abfd)->copyright, string); - } - return true; -} - -static boolean -som_get_section_contents (abfd, section, location, offset, count) - bfd *abfd; - sec_ptr section; - PTR location; - file_ptr offset; - bfd_size_type count; -{ - if (count == 0 || ((section->flags & SEC_HAS_CONTENTS) == 0)) - return true; - if ((bfd_size_type)(offset+count) > section->_raw_size - || bfd_seek (abfd, (file_ptr)(section->filepos + offset), SEEK_SET) == -1 - || bfd_read (location, (bfd_size_type)1, count, abfd) != count) - return (false); /* on error */ - return (true); -} - -static boolean -som_set_section_contents (abfd, section, location, offset, count) - bfd *abfd; - sec_ptr section; - PTR location; - file_ptr offset; - bfd_size_type count; -{ - if (abfd->output_has_begun == false) - { - /* Set up fixed parts of the file, space, and subspace headers. - Notify the world that output has begun. */ - som_prep_headers (abfd); - abfd->output_has_begun = true; - /* Start writing the object file. This include all the string - tables, fixup streams, and other portions of the object file. */ - som_begin_writing (abfd); - } - - /* Only write subspaces which have "real" contents (eg. the contents - are not generated at run time by the OS). */ - if (!som_is_subspace (section) - || ((section->flags & SEC_HAS_CONTENTS) == 0)) - return true; - - /* Seek to the proper offset within the object file and write the - data. */ - offset += som_section_data (section)->subspace_dict->file_loc_init_value; - if (bfd_seek (abfd, offset, SEEK_SET) == -1) - return false; - - if (bfd_write ((PTR) location, 1, count, abfd) != count) - return false; - return true; -} - -static boolean -som_set_arch_mach (abfd, arch, machine) - bfd *abfd; - enum bfd_architecture arch; - unsigned long machine; -{ - /* Allow any architecture to be supported by the SOM backend */ - return bfd_default_set_arch_mach (abfd, arch, machine); -} - -static boolean -som_find_nearest_line (abfd, section, symbols, offset, filename_ptr, - functionname_ptr, line_ptr) - bfd *abfd; - asection *section; - asymbol **symbols; - bfd_vma offset; - CONST char **filename_ptr; - CONST char **functionname_ptr; - unsigned int *line_ptr; -{ - return (false); -} - -static int -som_sizeof_headers (abfd, reloc) - bfd *abfd; - boolean reloc; -{ - (*_bfd_error_handler) ("som_sizeof_headers unimplemented"); - fflush (stderr); - abort (); - return (0); -} - -/* Return the single-character symbol type corresponding to - SOM section S, or '?' for an unknown SOM section. */ - -static char -som_section_type (s) - const char *s; -{ - const struct section_to_type *t; - - for (t = &stt[0]; t->section; t++) - if (!strcmp (s, t->section)) - return t->type; - return '?'; -} - -static int -som_decode_symclass (symbol) - asymbol *symbol; -{ - char c; - - if (bfd_is_com_section (symbol->section)) - return 'C'; - if (bfd_is_und_section (symbol->section)) - return 'U'; - if (bfd_is_ind_section (symbol->section)) - return 'I'; - if (!(symbol->flags & (BSF_GLOBAL|BSF_LOCAL))) - return '?'; - - if (bfd_is_abs_section (symbol->section) - || (som_symbol_data (symbol) != NULL - && som_symbol_data (symbol)->som_type == SYMBOL_TYPE_ABSOLUTE)) - c = 'a'; - else if (symbol->section) - c = som_section_type (symbol->section->name); - else - return '?'; - if (symbol->flags & BSF_GLOBAL) - c = toupper (c); - return c; -} - -/* Return information about SOM symbol SYMBOL in RET. */ - -static void -som_get_symbol_info (ignore_abfd, symbol, ret) - bfd *ignore_abfd; - asymbol *symbol; - symbol_info *ret; -{ - ret->type = som_decode_symclass (symbol); - if (ret->type != 'U') - ret->value = symbol->value+symbol->section->vma; - else - ret->value = 0; - ret->name = symbol->name; -} - -/* Count the number of symbols in the archive symbol table. Necessary - so that we can allocate space for all the carsyms at once. */ - -static boolean -som_bfd_count_ar_symbols (abfd, lst_header, count) - bfd *abfd; - struct lst_header *lst_header; - symindex *count; -{ - unsigned int i; - unsigned int *hash_table = NULL; - file_ptr lst_filepos = bfd_tell (abfd) - sizeof (struct lst_header); - - hash_table = - (unsigned int *) bfd_malloc (lst_header->hash_size - * sizeof (unsigned int)); - if (hash_table == NULL && lst_header->hash_size != 0) - goto error_return; - - /* Don't forget to initialize the counter! */ - *count = 0; - - /* Read in the hash table. The has table is an array of 32bit file offsets - which point to the hash chains. */ - if (bfd_read ((PTR) hash_table, lst_header->hash_size, 4, abfd) - != lst_header->hash_size * 4) - goto error_return; - - /* Walk each chain counting the number of symbols found on that particular - chain. */ - for (i = 0; i < lst_header->hash_size; i++) - { - struct lst_symbol_record lst_symbol; - - /* An empty chain has zero as it's file offset. */ - if (hash_table[i] == 0) - continue; - - /* Seek to the first symbol in this hash chain. */ - if (bfd_seek (abfd, lst_filepos + hash_table[i], SEEK_SET) < 0) - goto error_return; - - /* Read in this symbol and update the counter. */ - if (bfd_read ((PTR) & lst_symbol, 1, sizeof (lst_symbol), abfd) - != sizeof (lst_symbol)) - goto error_return; - - (*count)++; - - /* Now iterate through the rest of the symbols on this chain. */ - while (lst_symbol.next_entry) - { - - /* Seek to the next symbol. */ - if (bfd_seek (abfd, lst_filepos + lst_symbol.next_entry, SEEK_SET) - < 0) - goto error_return; - - /* Read the symbol in and update the counter. */ - if (bfd_read ((PTR) & lst_symbol, 1, sizeof (lst_symbol), abfd) - != sizeof (lst_symbol)) - goto error_return; - - (*count)++; - } - } - if (hash_table != NULL) - free (hash_table); - return true; - - error_return: - if (hash_table != NULL) - free (hash_table); - return false; -} - -/* Fill in the canonical archive symbols (SYMS) from the archive described - by ABFD and LST_HEADER. */ - -static boolean -som_bfd_fill_in_ar_symbols (abfd, lst_header, syms) - bfd *abfd; - struct lst_header *lst_header; - carsym **syms; -{ - unsigned int i, len; - carsym *set = syms[0]; - unsigned int *hash_table = NULL; - struct som_entry *som_dict = NULL; - file_ptr lst_filepos = bfd_tell (abfd) - sizeof (struct lst_header); - - hash_table = - (unsigned int *) bfd_malloc (lst_header->hash_size - * sizeof (unsigned int)); - if (hash_table == NULL && lst_header->hash_size != 0) - goto error_return; - - som_dict = - (struct som_entry *) bfd_malloc (lst_header->module_count - * sizeof (struct som_entry)); - if (som_dict == NULL && lst_header->module_count != 0) - goto error_return; - - /* Read in the hash table. The has table is an array of 32bit file offsets - which point to the hash chains. */ - if (bfd_read ((PTR) hash_table, lst_header->hash_size, 4, abfd) - != lst_header->hash_size * 4) - goto error_return; - - /* Seek to and read in the SOM dictionary. We will need this to fill - in the carsym's filepos field. */ - if (bfd_seek (abfd, lst_filepos + lst_header->dir_loc, SEEK_SET) < 0) - goto error_return; - - if (bfd_read ((PTR) som_dict, lst_header->module_count, - sizeof (struct som_entry), abfd) - != lst_header->module_count * sizeof (struct som_entry)) - goto error_return; - - /* Walk each chain filling in the carsyms as we go along. */ - for (i = 0; i < lst_header->hash_size; i++) - { - struct lst_symbol_record lst_symbol; - - /* An empty chain has zero as it's file offset. */ - if (hash_table[i] == 0) - continue; - - /* Seek to and read the first symbol on the chain. */ - if (bfd_seek (abfd, lst_filepos + hash_table[i], SEEK_SET) < 0) - goto error_return; - - if (bfd_read ((PTR) & lst_symbol, 1, sizeof (lst_symbol), abfd) - != sizeof (lst_symbol)) - goto error_return; - - /* Get the name of the symbol, first get the length which is stored - as a 32bit integer just before the symbol. - - One might ask why we don't just read in the entire string table - and index into it. Well, according to the SOM ABI the string - index can point *anywhere* in the archive to save space, so just - using the string table would not be safe. */ - if (bfd_seek (abfd, lst_filepos + lst_header->string_loc - + lst_symbol.name.n_strx - 4, SEEK_SET) < 0) - goto error_return; - - if (bfd_read (&len, 1, 4, abfd) != 4) - goto error_return; - - /* Allocate space for the name and null terminate it too. */ - set->name = bfd_zalloc (abfd, len + 1); - if (!set->name) - goto error_return; - if (bfd_read (set->name, 1, len, abfd) != len) - goto error_return; - - set->name[len] = 0; - - /* Fill in the file offset. Note that the "location" field points - to the SOM itself, not the ar_hdr in front of it. */ - set->file_offset = som_dict[lst_symbol.som_index].location - - sizeof (struct ar_hdr); - - /* Go to the next symbol. */ - set++; - - /* Iterate through the rest of the chain. */ - while (lst_symbol.next_entry) - { - /* Seek to the next symbol and read it in. */ - if (bfd_seek (abfd, lst_filepos + lst_symbol.next_entry, SEEK_SET) <0) - goto error_return; - - if (bfd_read ((PTR) & lst_symbol, 1, sizeof (lst_symbol), abfd) - != sizeof (lst_symbol)) - goto error_return; - - /* Seek to the name length & string and read them in. */ - if (bfd_seek (abfd, lst_filepos + lst_header->string_loc - + lst_symbol.name.n_strx - 4, SEEK_SET) < 0) - goto error_return; - - if (bfd_read (&len, 1, 4, abfd) != 4) - goto error_return; - - /* Allocate space for the name and null terminate it too. */ - set->name = bfd_zalloc (abfd, len + 1); - if (!set->name) - goto error_return; - - if (bfd_read (set->name, 1, len, abfd) != len) - goto error_return; - set->name[len] = 0; - - /* Fill in the file offset. Note that the "location" field points - to the SOM itself, not the ar_hdr in front of it. */ - set->file_offset = som_dict[lst_symbol.som_index].location - - sizeof (struct ar_hdr); - - /* Go on to the next symbol. */ - set++; - } - } - /* If we haven't died by now, then we successfully read the entire - archive symbol table. */ - if (hash_table != NULL) - free (hash_table); - if (som_dict != NULL) - free (som_dict); - return true; - - error_return: - if (hash_table != NULL) - free (hash_table); - if (som_dict != NULL) - free (som_dict); - return false; -} - -/* Read in the LST from the archive. */ -static boolean -som_slurp_armap (abfd) - bfd *abfd; -{ - struct lst_header lst_header; - struct ar_hdr ar_header; - unsigned int parsed_size; - struct artdata *ardata = bfd_ardata (abfd); - char nextname[17]; - int i = bfd_read ((PTR) nextname, 1, 16, abfd); - - /* Special cases. */ - if (i == 0) - return true; - if (i != 16) - return false; - - if (bfd_seek (abfd, (file_ptr) - 16, SEEK_CUR) < 0) - return false; - - /* For archives without .o files there is no symbol table. */ - if (strncmp (nextname, "/ ", 16)) - { - bfd_has_map (abfd) = false; - return true; - } - - /* Read in and sanity check the archive header. */ - if (bfd_read ((PTR) &ar_header, 1, sizeof (struct ar_hdr), abfd) - != sizeof (struct ar_hdr)) - return false; - - if (strncmp (ar_header.ar_fmag, ARFMAG, 2)) - { - bfd_set_error (bfd_error_malformed_archive); - return false; - } - - /* How big is the archive symbol table entry? */ - errno = 0; - parsed_size = strtol (ar_header.ar_size, NULL, 10); - if (errno != 0) - { - bfd_set_error (bfd_error_malformed_archive); - return false; - } - - /* Save off the file offset of the first real user data. */ - ardata->first_file_filepos = bfd_tell (abfd) + parsed_size; - - /* Read in the library symbol table. We'll make heavy use of this - in just a minute. */ - if (bfd_read ((PTR) & lst_header, 1, sizeof (struct lst_header), abfd) - != sizeof (struct lst_header)) - return false; - - /* Sanity check. */ - if (lst_header.a_magic != LIBMAGIC) - { - bfd_set_error (bfd_error_malformed_archive); - return false; - } - - /* Count the number of symbols in the library symbol table. */ - if (som_bfd_count_ar_symbols (abfd, &lst_header, &ardata->symdef_count) - == false) - return false; - - /* Get back to the start of the library symbol table. */ - if (bfd_seek (abfd, ardata->first_file_filepos - parsed_size - + sizeof (struct lst_header), SEEK_SET) < 0) - return false; - - /* Initializae the cache and allocate space for the library symbols. */ - ardata->cache = 0; - ardata->symdefs = (carsym *) bfd_alloc (abfd, - (ardata->symdef_count - * sizeof (carsym))); - if (!ardata->symdefs) - return false; - - /* Now fill in the canonical archive symbols. */ - if (som_bfd_fill_in_ar_symbols (abfd, &lst_header, &ardata->symdefs) - == false) - return false; - - /* Seek back to the "first" file in the archive. Note the "first" - file may be the extended name table. */ - if (bfd_seek (abfd, ardata->first_file_filepos, SEEK_SET) < 0) - return false; - - /* Notify the generic archive code that we have a symbol map. */ - bfd_has_map (abfd) = true; - return true; -} - -/* Begin preparing to write a SOM library symbol table. - - As part of the prep work we need to determine the number of symbols - and the size of the associated string section. */ - -static boolean -som_bfd_prep_for_ar_write (abfd, num_syms, stringsize) - bfd *abfd; - unsigned int *num_syms, *stringsize; -{ - bfd *curr_bfd = abfd->archive_head; - - /* Some initialization. */ - *num_syms = 0; - *stringsize = 0; - - /* Iterate over each BFD within this archive. */ - while (curr_bfd != NULL) - { - unsigned int curr_count, i; - som_symbol_type *sym; - - /* Don't bother for non-SOM objects. */ - if (curr_bfd->format != bfd_object - || curr_bfd->xvec->flavour != bfd_target_som_flavour) - { - curr_bfd = curr_bfd->next; - continue; - } - - /* Make sure the symbol table has been read, then snag a pointer - to it. It's a little slimey to grab the symbols via obj_som_symtab, - but doing so avoids allocating lots of extra memory. */ - if (som_slurp_symbol_table (curr_bfd) == false) - return false; - - sym = obj_som_symtab (curr_bfd); - curr_count = bfd_get_symcount (curr_bfd); - - /* Examine each symbol to determine if it belongs in the - library symbol table. */ - for (i = 0; i < curr_count; i++, sym++) - { - struct som_misc_symbol_info info; - - /* Derive SOM information from the BFD symbol. */ - som_bfd_derive_misc_symbol_info (curr_bfd, &sym->symbol, &info); - - /* Should we include this symbol? */ - if (info.symbol_type == ST_NULL - || info.symbol_type == ST_SYM_EXT - || info.symbol_type == ST_ARG_EXT) - continue; - - /* Only global symbols and unsatisfied commons. */ - if (info.symbol_scope != SS_UNIVERSAL - && info.symbol_type != ST_STORAGE) - continue; - - /* Do no include undefined symbols. */ - if (bfd_is_und_section (sym->symbol.section)) - continue; - - /* Bump the various counters, being careful to honor - alignment considerations in the string table. */ - (*num_syms)++; - *stringsize = *stringsize + strlen (sym->symbol.name) + 5; - while (*stringsize % 4) - (*stringsize)++; - } - - curr_bfd = curr_bfd->next; - } - return true; -} - -/* Hash a symbol name based on the hashing algorithm presented in the - SOM ABI. */ -static unsigned int -som_bfd_ar_symbol_hash (symbol) - asymbol *symbol; -{ - unsigned int len = strlen (symbol->name); - - /* Names with length 1 are special. */ - if (len == 1) - return 0x1000100 | (symbol->name[0] << 16) | symbol->name[0]; - - return ((len & 0x7f) << 24) | (symbol->name[1] << 16) - | (symbol->name[len-2] << 8) | symbol->name[len-1]; -} - -static CONST char * -normalize (file) - CONST char *file; -{ - CONST char *filename = strrchr (file, '/'); - - if (filename != NULL) - filename++; - else - filename = file; - return filename; -} - -/* Do the bulk of the work required to write the SOM library - symbol table. */ - -static boolean -som_bfd_ar_write_symbol_stuff (abfd, nsyms, string_size, lst) - bfd *abfd; - unsigned int nsyms, string_size; - struct lst_header lst; -{ - file_ptr lst_filepos; - char *strings = NULL, *p; - struct lst_symbol_record *lst_syms = NULL, *curr_lst_sym; - bfd *curr_bfd; - unsigned int *hash_table = NULL; - struct som_entry *som_dict = NULL; - struct lst_symbol_record **last_hash_entry = NULL; - unsigned int curr_som_offset, som_index, extended_name_length = 0; - unsigned int maxname = abfd->xvec->ar_max_namelen; - - hash_table = - (unsigned int *) bfd_malloc (lst.hash_size * sizeof (unsigned int)); - if (hash_table == NULL && lst.hash_size != 0) - goto error_return; - som_dict = - (struct som_entry *) bfd_malloc (lst.module_count - * sizeof (struct som_entry)); - if (som_dict == NULL && lst.module_count != 0) - goto error_return; - - last_hash_entry = - ((struct lst_symbol_record **) - bfd_malloc (lst.hash_size * sizeof (struct lst_symbol_record *))); - if (last_hash_entry == NULL && lst.hash_size != 0) - goto error_return; - - /* Lots of fields are file positions relative to the start - of the lst record. So save its location. */ - lst_filepos = bfd_tell (abfd) - sizeof (struct lst_header); - - /* Some initialization. */ - memset (hash_table, 0, 4 * lst.hash_size); - memset (som_dict, 0, lst.module_count * sizeof (struct som_entry)); - memset (last_hash_entry, 0, - lst.hash_size * sizeof (struct lst_symbol_record *)); - - /* Symbols have som_index fields, so we have to keep track of the - index of each SOM in the archive. - - The SOM dictionary has (among other things) the absolute file - position for the SOM which a particular dictionary entry - describes. We have to compute that information as we iterate - through the SOMs/symbols. */ - som_index = 0; - curr_som_offset = 8 + 2 * sizeof (struct ar_hdr) + lst.file_end; - - /* Yow! We have to know the size of the extended name table - too. */ - for (curr_bfd = abfd->archive_head; - curr_bfd != NULL; - curr_bfd = curr_bfd->next) - { - CONST char *normal = normalize (curr_bfd->filename); - unsigned int thislen; - - if (!normal) - return false; - thislen = strlen (normal); - if (thislen > maxname) - extended_name_length += thislen + 1; - } - - /* Make room for the archive header and the contents of the - extended string table. */ - if (extended_name_length) - curr_som_offset += extended_name_length + sizeof (struct ar_hdr); - - /* Make sure we're properly aligned. */ - curr_som_offset = (curr_som_offset + 0x1) & ~0x1; - - /* FIXME should be done with buffers just like everything else... */ - lst_syms = bfd_malloc (nsyms * sizeof (struct lst_symbol_record)); - if (lst_syms == NULL && nsyms != 0) - goto error_return; - strings = bfd_malloc (string_size); - if (strings == NULL && string_size != 0) - goto error_return; - - p = strings; - curr_lst_sym = lst_syms; - - curr_bfd = abfd->archive_head; - while (curr_bfd != NULL) - { - unsigned int curr_count, i; - som_symbol_type *sym; - - /* Don't bother for non-SOM objects. */ - if (curr_bfd->format != bfd_object - || curr_bfd->xvec->flavour != bfd_target_som_flavour) - { - curr_bfd = curr_bfd->next; - continue; - } - - /* Make sure the symbol table has been read, then snag a pointer - to it. It's a little slimey to grab the symbols via obj_som_symtab, - but doing so avoids allocating lots of extra memory. */ - if (som_slurp_symbol_table (curr_bfd) == false) - goto error_return; - - sym = obj_som_symtab (curr_bfd); - curr_count = bfd_get_symcount (curr_bfd); - - for (i = 0; i < curr_count; i++, sym++) - { - struct som_misc_symbol_info info; - - /* Derive SOM information from the BFD symbol. */ - som_bfd_derive_misc_symbol_info (curr_bfd, &sym->symbol, &info); - - /* Should we include this symbol? */ - if (info.symbol_type == ST_NULL - || info.symbol_type == ST_SYM_EXT - || info.symbol_type == ST_ARG_EXT) - continue; - - /* Only global symbols and unsatisfied commons. */ - if (info.symbol_scope != SS_UNIVERSAL - && info.symbol_type != ST_STORAGE) - continue; - - /* Do no include undefined symbols. */ - if (bfd_is_und_section (sym->symbol.section)) - continue; - - /* If this is the first symbol from this SOM, then update - the SOM dictionary too. */ - if (som_dict[som_index].location == 0) - { - som_dict[som_index].location = curr_som_offset; - som_dict[som_index].length = arelt_size (curr_bfd); - } - - /* Fill in the lst symbol record. */ - curr_lst_sym->hidden = 0; - curr_lst_sym->secondary_def = 0; - curr_lst_sym->symbol_type = info.symbol_type; - curr_lst_sym->symbol_scope = info.symbol_scope; - curr_lst_sym->check_level = 0; - curr_lst_sym->must_qualify = 0; - curr_lst_sym->initially_frozen = 0; - curr_lst_sym->memory_resident = 0; - curr_lst_sym->is_common = bfd_is_com_section (sym->symbol.section); - curr_lst_sym->dup_common = 0; - curr_lst_sym->xleast = 0; - curr_lst_sym->arg_reloc = info.arg_reloc; - curr_lst_sym->name.n_strx = p - strings + 4; - curr_lst_sym->qualifier_name.n_strx = 0; - curr_lst_sym->symbol_info = info.symbol_info; - curr_lst_sym->symbol_value = info.symbol_value; - curr_lst_sym->symbol_descriptor = 0; - curr_lst_sym->reserved = 0; - curr_lst_sym->som_index = som_index; - curr_lst_sym->symbol_key = som_bfd_ar_symbol_hash (&sym->symbol); - curr_lst_sym->next_entry = 0; - - /* Insert into the hash table. */ - if (hash_table[curr_lst_sym->symbol_key % lst.hash_size]) - { - struct lst_symbol_record *tmp; - - /* There is already something at the head of this hash chain, - so tack this symbol onto the end of the chain. */ - tmp = last_hash_entry[curr_lst_sym->symbol_key % lst.hash_size]; - tmp->next_entry - = (curr_lst_sym - lst_syms) * sizeof (struct lst_symbol_record) - + lst.hash_size * 4 - + lst.module_count * sizeof (struct som_entry) - + sizeof (struct lst_header); - } - else - { - /* First entry in this hash chain. */ - hash_table[curr_lst_sym->symbol_key % lst.hash_size] - = (curr_lst_sym - lst_syms) * sizeof (struct lst_symbol_record) - + lst.hash_size * 4 - + lst.module_count * sizeof (struct som_entry) - + sizeof (struct lst_header); - } - - /* Keep track of the last symbol we added to this chain so we can - easily update its next_entry pointer. */ - last_hash_entry[curr_lst_sym->symbol_key % lst.hash_size] - = curr_lst_sym; - - - /* Update the string table. */ - bfd_put_32 (abfd, strlen (sym->symbol.name), p); - p += 4; - strcpy (p, sym->symbol.name); - p += strlen (sym->symbol.name) + 1; - while ((int)p % 4) - { - bfd_put_8 (abfd, 0, p); - p++; - } - - /* Head to the next symbol. */ - curr_lst_sym++; - } - - /* Keep track of where each SOM will finally reside; then look - at the next BFD. */ - curr_som_offset += arelt_size (curr_bfd) + sizeof (struct ar_hdr); - - /* A particular object in the archive may have an odd length; the - linker requires objects begin on an even boundary. So round - up the current offset as necessary. */ - curr_som_offset = (curr_som_offset + 0x1) & ~0x1; - curr_bfd = curr_bfd->next; - som_index++; - } - - /* Now scribble out the hash table. */ - if (bfd_write ((PTR) hash_table, lst.hash_size, 4, abfd) - != lst.hash_size * 4) - goto error_return; - - /* Then the SOM dictionary. */ - if (bfd_write ((PTR) som_dict, lst.module_count, - sizeof (struct som_entry), abfd) - != lst.module_count * sizeof (struct som_entry)) - goto error_return; - - /* The library symbols. */ - if (bfd_write ((PTR) lst_syms, nsyms, sizeof (struct lst_symbol_record), abfd) - != nsyms * sizeof (struct lst_symbol_record)) - goto error_return; - - /* And finally the strings. */ - if (bfd_write ((PTR) strings, string_size, 1, abfd) != string_size) - goto error_return; - - if (hash_table != NULL) - free (hash_table); - if (som_dict != NULL) - free (som_dict); - if (last_hash_entry != NULL) - free (last_hash_entry); - if (lst_syms != NULL) - free (lst_syms); - if (strings != NULL) - free (strings); - return true; - - error_return: - if (hash_table != NULL) - free (hash_table); - if (som_dict != NULL) - free (som_dict); - if (last_hash_entry != NULL) - free (last_hash_entry); - if (lst_syms != NULL) - free (lst_syms); - if (strings != NULL) - free (strings); - - return false; -} - -/* SOM almost uses the SVR4 style extended name support, but not - quite. */ - -static boolean -som_construct_extended_name_table (abfd, tabloc, tablen, name) - bfd *abfd; - char **tabloc; - bfd_size_type *tablen; - const char **name; -{ - *name = "//"; - return _bfd_construct_extended_name_table (abfd, false, tabloc, tablen); -} - -/* Write out the LST for the archive. - - You'll never believe this is really how armaps are handled in SOM... */ - -/*ARGSUSED*/ -static boolean -som_write_armap (abfd, elength, map, orl_count, stridx) - bfd *abfd; - unsigned int elength; - struct orl *map; - unsigned int orl_count; - int stridx; -{ - bfd *curr_bfd; - struct stat statbuf; - unsigned int i, lst_size, nsyms, stringsize; - struct ar_hdr hdr; - struct lst_header lst; - int *p; - - /* We'll use this for the archive's date and mode later. */ - if (stat (abfd->filename, &statbuf) != 0) - { - bfd_set_error (bfd_error_system_call); - return false; - } - /* Fudge factor. */ - bfd_ardata (abfd)->armap_timestamp = statbuf.st_mtime + 60; - - /* Account for the lst header first. */ - lst_size = sizeof (struct lst_header); - - /* Start building the LST header. */ - /* FIXME: Do we need to examine each element to determine the - largest id number? */ - lst.system_id = CPU_PA_RISC1_0; - lst.a_magic = LIBMAGIC; - lst.version_id = VERSION_ID; - lst.file_time.secs = 0; - lst.file_time.nanosecs = 0; - - lst.hash_loc = lst_size; - lst.hash_size = SOM_LST_HASH_SIZE; - - /* Hash table is a SOM_LST_HASH_SIZE 32bit offsets. */ - lst_size += 4 * SOM_LST_HASH_SIZE; - - /* We need to count the number of SOMs in this archive. */ - curr_bfd = abfd->archive_head; - lst.module_count = 0; - while (curr_bfd != NULL) - { - /* Only true SOM objects count. */ - if (curr_bfd->format == bfd_object - && curr_bfd->xvec->flavour == bfd_target_som_flavour) - lst.module_count++; - curr_bfd = curr_bfd->next; - } - lst.module_limit = lst.module_count; - lst.dir_loc = lst_size; - lst_size += sizeof (struct som_entry) * lst.module_count; - - /* We don't support import/export tables, auxiliary headers, - or free lists yet. Make the linker work a little harder - to make our life easier. */ - - lst.export_loc = 0; - lst.export_count = 0; - lst.import_loc = 0; - lst.aux_loc = 0; - lst.aux_size = 0; - - /* Count how many symbols we will have on the hash chains and the - size of the associated string table. */ - if (som_bfd_prep_for_ar_write (abfd, &nsyms, &stringsize) == false) - return false; - - lst_size += sizeof (struct lst_symbol_record) * nsyms; - - /* For the string table. One day we might actually use this info - to avoid small seeks/reads when reading archives. */ - lst.string_loc = lst_size; - lst.string_size = stringsize; - lst_size += stringsize; - - /* SOM ABI says this must be zero. */ - lst.free_list = 0; - lst.file_end = lst_size; - - /* Compute the checksum. Must happen after the entire lst header - has filled in. */ - p = (int *)&lst; - lst.checksum = 0; - for (i = 0; i < sizeof (struct lst_header)/sizeof (int) - 1; i++) - lst.checksum ^= *p++; - - sprintf (hdr.ar_name, "/ "); - sprintf (hdr.ar_date, "%ld", bfd_ardata (abfd)->armap_timestamp); - sprintf (hdr.ar_uid, "%ld", (long) getuid ()); - sprintf (hdr.ar_gid, "%ld", (long) getgid ()); - sprintf (hdr.ar_mode, "%-8o", (unsigned int) statbuf.st_mode); - sprintf (hdr.ar_size, "%-10d", (int) lst_size); - hdr.ar_fmag[0] = '`'; - hdr.ar_fmag[1] = '\012'; - - /* Turn any nulls into spaces. */ - for (i = 0; i < sizeof (struct ar_hdr); i++) - if (((char *) (&hdr))[i] == '\0') - (((char *) (&hdr))[i]) = ' '; - - /* Scribble out the ar header. */ - if (bfd_write ((PTR) &hdr, 1, sizeof (struct ar_hdr), abfd) - != sizeof (struct ar_hdr)) - return false; - - /* Now scribble out the lst header. */ - if (bfd_write ((PTR) &lst, 1, sizeof (struct lst_header), abfd) - != sizeof (struct lst_header)) - return false; - - /* Build and write the armap. */ - if (som_bfd_ar_write_symbol_stuff (abfd, nsyms, stringsize, lst) == false) - return false; - - /* Done. */ - return true; -} - -/* Free all information we have cached for this BFD. We can always - read it again later if we need it. */ - -static boolean -som_bfd_free_cached_info (abfd) - bfd *abfd; -{ - asection *o; - - if (bfd_get_format (abfd) != bfd_object) - return true; - -#define FREE(x) if (x != NULL) { free (x); x = NULL; } - /* Free the native string and symbol tables. */ - FREE (obj_som_symtab (abfd)); - FREE (obj_som_stringtab (abfd)); - for (o = abfd->sections; o != (asection *) NULL; o = o->next) - { - /* Free the native relocations. */ - o->reloc_count = -1; - FREE (som_section_data (o)->reloc_stream); - /* Free the generic relocations. */ - FREE (o->relocation); - } -#undef FREE - - return true; -} - -/* End of miscellaneous support functions. */ - -/* Linker support functions. */ -static boolean -som_bfd_link_split_section (abfd, sec) - bfd *abfd; - asection *sec; -{ - return (som_is_subspace (sec) && sec->_raw_size > 240000); -} - -#define som_close_and_cleanup som_bfd_free_cached_info - -#define som_read_ar_hdr _bfd_generic_read_ar_hdr -#define som_openr_next_archived_file bfd_generic_openr_next_archived_file -#define som_get_elt_at_index _bfd_generic_get_elt_at_index -#define som_generic_stat_arch_elt bfd_generic_stat_arch_elt -#define som_truncate_arname bfd_bsd_truncate_arname -#define som_slurp_extended_name_table _bfd_slurp_extended_name_table -#define som_update_armap_timestamp bfd_true -#define som_bfd_print_private_bfd_data _bfd_generic_bfd_print_private_bfd_data - -#define som_get_lineno _bfd_nosymbols_get_lineno -#define som_bfd_make_debug_symbol _bfd_nosymbols_bfd_make_debug_symbol -#define som_read_minisymbols _bfd_generic_read_minisymbols -#define som_minisymbol_to_symbol _bfd_generic_minisymbol_to_symbol -#define som_get_section_contents_in_window \ - _bfd_generic_get_section_contents_in_window - -#define som_bfd_get_relocated_section_contents \ - bfd_generic_get_relocated_section_contents -#define som_bfd_relax_section bfd_generic_relax_section -#define som_bfd_link_hash_table_create _bfd_generic_link_hash_table_create -#define som_bfd_link_add_symbols _bfd_generic_link_add_symbols -#define som_bfd_final_link _bfd_generic_final_link - - -const bfd_target som_vec = -{ - "som", /* name */ - bfd_target_som_flavour, - BFD_ENDIAN_BIG, /* target byte order */ - BFD_ENDIAN_BIG, /* target headers byte order */ - (HAS_RELOC | EXEC_P | /* object flags */ - HAS_LINENO | HAS_DEBUG | - HAS_SYMS | HAS_LOCALS | WP_TEXT | D_PAGED | DYNAMIC), - (SEC_CODE | SEC_DATA | SEC_ROM | SEC_HAS_CONTENTS - | SEC_ALLOC | SEC_LOAD | SEC_RELOC), /* section flags */ - -/* leading_symbol_char: is the first char of a user symbol - predictable, and if so what is it */ - 0, - '/', /* ar_pad_char */ - 14, /* ar_max_namelen */ - bfd_getb64, bfd_getb_signed_64, bfd_putb64, - bfd_getb32, bfd_getb_signed_32, bfd_putb32, - bfd_getb16, bfd_getb_signed_16, bfd_putb16, /* data */ - bfd_getb64, bfd_getb_signed_64, bfd_putb64, - bfd_getb32, bfd_getb_signed_32, bfd_putb32, - bfd_getb16, bfd_getb_signed_16, bfd_putb16, /* hdrs */ - {_bfd_dummy_target, - som_object_p, /* bfd_check_format */ - bfd_generic_archive_p, - _bfd_dummy_target - }, - { - bfd_false, - som_mkobject, - _bfd_generic_mkarchive, - bfd_false - }, - { - bfd_false, - som_write_object_contents, - _bfd_write_archive_contents, - bfd_false, - }, -#undef som - - BFD_JUMP_TABLE_GENERIC (som), - BFD_JUMP_TABLE_COPY (som), - BFD_JUMP_TABLE_CORE (_bfd_nocore), - BFD_JUMP_TABLE_ARCHIVE (som), - BFD_JUMP_TABLE_SYMBOLS (som), - BFD_JUMP_TABLE_RELOCS (som), - BFD_JUMP_TABLE_WRITE (som), - BFD_JUMP_TABLE_LINK (som), - BFD_JUMP_TABLE_DYNAMIC (_bfd_nodynamic), - - (PTR) 0 -}; - -#endif /* HOST_HPPAHPUX || HOST_HPPABSD || HOST_HPPAOSF */ diff --git a/contrib/gdb/bfd/som.h b/contrib/gdb/bfd/som.h deleted file mode 100644 index 6290e88f948cb..0000000000000 --- a/contrib/gdb/bfd/som.h +++ /dev/null @@ -1,224 +0,0 @@ -/* HP PA-RISC SOM object file format: definitions internal to BFD. - Copyright (C) 1990, 91, 92, 93, 94 Free Software Foundation, Inc. - - Contributed by the Center for Software Science at the - University of Utah (pa-gdb-bugs@cs.utah.edu). - - This file is part of BFD, the Binary File Descriptor library. - - 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 2 of the License, 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ - -#ifndef _SOM_H -#define _SOM_H - -#include "../bfd/sysdep.h" -#include "libhppa.h" - -#include <a.out.h> -#include <lst.h> -#include <ar.h> - -/* The SOM BFD backend doesn't currently use anything from these - two include files, but it's likely to need them in the future. */ -#ifdef R_DLT_REL -#include <shl.h> -#include <dl.h> -#endif - -#if defined(HOST_HPPABSD) || defined (HOST_HPPAOSF) -/* BSD uses a completely different scheme for object file identification. - so for now, define _PA_RISC_ID to accept any random value for a model - number. */ -#undef _PA_RISC_ID -#define _PA_RISC_ID(__m_num) 1 -#endif /* HOST_HPPABSD */ - -#define FILE_HDR_SIZE sizeof(struct header) -#define AUX_HDR_SIZE sizeof(struct som_exec_auxhdr) - -typedef struct som_symbol - { - asymbol symbol; - unsigned int som_type; - - /* Structured like the ELF tc_data union. Allows more code sharing - in GAS this way. */ - union - { - unsigned int hppa_arg_reloc; - PTR any; - } - tc_data; - - /* Index of this symbol in the symbol table. Only used when - building relocation streams for incomplete objects. */ - int index; - - /* How many times this symbol is used in a relocation. By sorting - the symbols from most used to least used we can significantly - reduce the size of the relocation stream for incomplete objects. */ - int reloc_count; - - /* During object file writing, the offset of the name of this symbol - in the SOM string table. */ - int stringtab_offset; - } -som_symbol_type; - -/* A structure containing all the magic information stored in a BFD's - private data which needs to be copied during an objcopy/strip run. */ -struct som_exec_data - { - /* Sort-of a magic number. BSD uses it to distinguish between - native executables and hpux executables. */ - short system_id; - - /* Magic exec flags. These control things like whether or not - null pointer dereferencing is allowed and the like. */ - long exec_flags; - - /* Add more stuff here as needed. Good examples of information - we might want to pass would be presumed_dp, entry_* and maybe - others from the file header. */ - }; - -struct somdata - { - /* All the magic information about an executable which lives - in the private BFD structure and needs to be copied from - the input bfd to the output bfd during a objcopy/strip. */ - struct som_exec_data *exec_data; - - /* These three fields are only used when writing files and are - generated from scratch. They need not be copied for objcopy - or strip to work. */ - struct header *file_hdr; - struct copyright_aux_hdr *copyright_aux_hdr; - struct user_string_aux_hdr *version_aux_hdr; - struct som_exec_auxhdr *exec_hdr; - - /* Pointers to a saved copy of the symbol and string tables. These - need not be copied for objcopy or strip to work. */ - som_symbol_type *symtab; - char *stringtab; - asymbol **sorted_syms; - - /* We remember these offsets so that after check_file_format, we have - no dependencies on the particular format of the exec_hdr. - These offsets need not be copied for objcopy or strip to work. */ - - file_ptr sym_filepos; - file_ptr str_filepos; - file_ptr reloc_filepos; - unsigned stringtab_size; - }; - -struct som_data_struct - { - struct somdata a; - }; - -/* Substructure of som_section_data_struct used to hold information - which can't be represented by the generic BFD section structure, - but which must be copied during objcopy or strip. */ -struct som_copyable_section_data_struct - { - /* Various fields in space and subspace headers that we need - to pass around. */ - unsigned int sort_key : 8; - unsigned int access_control_bits : 7; - unsigned int is_defined : 1; - unsigned int is_private : 1; - unsigned int quadrant : 2; - - /* For subspaces, this points to the section which represents the - space in which the subspace is contained. For spaces it points - back to the section for this space. */ - asection *container; - - /* The user-specified space number. It is wrong to use this as - an index since duplicates and holes are allowed. */ - int space_number; - - /* Add more stuff here as needed. Good examples of information - we might want to pass would be initialization pointers, - and the many subspace flags we do not represent yet. */ - }; - -/* Used to keep extra SOM specific information for a given section. - - reloc_size holds the size of the relocation stream, note this - is very different from the number of relocations as SOM relocations - are variable length. - - reloc_stream is the actual stream of relocation entries. */ - -struct som_section_data_struct - { - struct som_copyable_section_data_struct *copy_data; - unsigned int reloc_size; - char *reloc_stream; - struct space_dictionary_record *space_dict; - struct subspace_dictionary_record *subspace_dict; - }; - -#define somdata(bfd) ((bfd)->tdata.som_data->a) -#define obj_som_exec_data(bfd) (somdata(bfd).exec_data) -#define obj_som_file_hdr(bfd) (somdata(bfd).file_hdr) -#define obj_som_exec_hdr(bfd) (somdata(bfd).exec_hdr) -#define obj_som_copyright_hdr(bfd) (somdata(bfd).copyright_aux_hdr) -#define obj_som_version_hdr(bfd) (somdata(bfd).version_aux_hdr) -#define obj_som_symtab(bfd) (somdata(bfd).symtab) -#define obj_som_stringtab(bfd) (somdata(bfd).stringtab) -#define obj_som_sym_filepos(bfd) (somdata(bfd).sym_filepos) -#define obj_som_str_filepos(bfd) (somdata(bfd).str_filepos) -#define obj_som_stringtab_size(bfd) (somdata(bfd).stringtab_size) -#define obj_som_reloc_filepos(bfd) (somdata(bfd).reloc_filepos) -#define obj_som_sorted_syms(bfd) (somdata(bfd).sorted_syms) -#define som_section_data(sec) \ - ((struct som_section_data_struct *)sec->used_by_bfd) -#define som_symbol_data(symbol) ((som_symbol_type *) symbol) - - -/* Defines groups of basic relocations. FIXME: These should - be the only basic relocations created by GAS. The rest - should be internal to the BFD backend. - - The idea is both SOM and ELF define these basic relocation - types so they map into a SOM or ELF specific reloation as - appropriate. This allows GAS to share much more code - between the two object formats. */ - -#define R_HPPA_NONE R_NO_RELOCATION -#define R_HPPA R_CODE_ONE_SYMBOL -#define R_HPPA_PCREL_CALL R_PCREL_CALL -#define R_HPPA_ABS_CALL R_ABS_CALL -#define R_HPPA_GOTOFF R_DP_RELATIVE -#define R_HPPA_ENTRY R_ENTRY -#define R_HPPA_EXIT R_EXIT -#define R_HPPA_COMPLEX R_COMP1 -#define R_HPPA_BEGIN_BRTAB R_BEGIN_BRTAB -#define R_HPPA_END_BRTAB R_END_BRTAB - -/* Exported functions, mostly for use by GAS. */ -boolean bfd_som_set_section_attributes PARAMS ((asection *, int, int, - unsigned int, int)); -boolean bfd_som_set_subsection_attributes PARAMS ((asection *, asection *, - int, unsigned int, int)); -void bfd_som_set_symbol_type PARAMS ((asymbol *, unsigned int)); -boolean bfd_som_attach_aux_hdr PARAMS ((bfd *, int, char *)); -int ** hppa_som_gen_reloc_type - PARAMS ((bfd *, int, int, enum hppa_reloc_field_selector_type_alt, int)); -#endif /* _SOM_H */ diff --git a/contrib/gdb/bfd/sparclynx.c b/contrib/gdb/bfd/sparclynx.c deleted file mode 100644 index 0885620283ec8..0000000000000 --- a/contrib/gdb/bfd/sparclynx.c +++ /dev/null @@ -1,265 +0,0 @@ -/* BFD support for Sparc binaries under LynxOS. - Copyright (C) 1990, 1991, 1992, 1993 Free Software Foundation, Inc. - -This file is part of BFD, the Binary File Descriptor library. - -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 2 of the License, 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ - -#if 0 -#define BYTES_IN_WORD 4 -#define N_SHARED_LIB(x) 0 - -#define TEXT_START_ADDR 0 -#define TARGET_PAGE_SIZE 4096 -#define SEGMENT_SIZE TARGET_PAGE_SIZE -#define DEFAULT_ARCH bfd_arch_sparc - -#endif - -#define MY(OP) CAT(sparclynx_aout_,OP) -#define TARGETNAME "a.out-sparc-lynx" - -#include "bfd.h" -#include "sysdep.h" -#include "libbfd.h" - -#include "aout/sun4.h" -#include "libaout.h" /* BFD a.out internal data structures */ - -#include "aout/aout64.h" -#include "aout/stab_gnu.h" -#include "aout/ar.h" - -/* This is needed to reject a NewsOS file, e.g. in - gdb/testsuite/gdb.t10/crossload.exp. <kingdon@cygnus.com> - I needed to add M_UNKNOWN to recognize a 68000 object, so this will - probably no longer reject a NewsOS object. <ian@cygnus.com>. */ -#define MACHTYPE_OK(mtype) ((mtype) == M_UNKNOWN \ - || (mtype) == M_68010 \ - || (mtype) == M_68020 \ - || (mtype) == M_SPARC) - -/* -The file @code{aoutf1.h} contains the code for BFD's -a.out back end. Control over the generated back end is given by these -two preprocessor names: -@table @code -@item ARCH_SIZE -This value should be either 32 or 64, depending upon the size of an -int in the target format. It changes the sizes of the structs which -perform the memory/disk mapping of structures. - -The 64 bit backend may only be used if the host compiler supports 64 -ints (eg long long with gcc), by defining the name @code{BFD_HOST_64_BIT} in @code{bfd.h}. -With this name defined, @emph{all} bfd operations are performed with 64bit -arithmetic, not just those to a 64bit target. - -@item TARGETNAME -The name put into the target vector. -@item -@end table - -*/ - -/*SUPPRESS558*/ -/*SUPPRESS529*/ - -void -NAME(lynx,set_arch_mach) (abfd, machtype) - bfd *abfd; - int machtype; -{ - /* Determine the architecture and machine type of the object file. */ - enum bfd_architecture arch; - long machine; - switch (machtype) - { - - case M_UNKNOWN: - /* Some Sun3s make magic numbers without cpu types in them, so - we'll default to the 68000. */ - arch = bfd_arch_m68k; - machine = 68000; - break; - - case M_68010: - case M_HP200: - arch = bfd_arch_m68k; - machine = 68010; - break; - - case M_68020: - case M_HP300: - arch = bfd_arch_m68k; - machine = 68020; - break; - - case M_SPARC: - arch = bfd_arch_sparc; - machine = 0; - break; - - case M_386: - case M_386_DYNIX: - arch = bfd_arch_i386; - machine = 0; - break; - - case M_29K: - arch = bfd_arch_a29k; - machine = 0; - break; - - case M_HPUX: - arch = bfd_arch_m68k; - machine = 0; - break; - - default: - arch = bfd_arch_obscure; - machine = 0; - break; - } - bfd_set_arch_mach (abfd, arch, machine); -} - -#define SET_ARCH_MACH(ABFD, EXEC) \ - NAME(lynx,set_arch_mach)(ABFD, N_MACHTYPE (EXEC)); \ - choose_reloc_size(ABFD); - -/* Determine the size of a relocation entry, based on the architecture */ -static void -choose_reloc_size (abfd) - bfd *abfd; -{ - switch (bfd_get_arch (abfd)) - { - case bfd_arch_sparc: - case bfd_arch_a29k: - obj_reloc_entry_size (abfd) = RELOC_EXT_SIZE; - break; - default: - obj_reloc_entry_size (abfd) = RELOC_STD_SIZE; - break; - } -} - -/* Write an object file in LynxOS format. - Section contents have already been written. We write the - file header, symbols, and relocation. */ - -static boolean -NAME(aout,sparclynx_write_object_contents) (abfd) - bfd *abfd; -{ - struct external_exec exec_bytes; - struct internal_exec *execp = exec_hdr (abfd); - - /* Magic number, maestro, please! */ - switch (bfd_get_arch (abfd)) - { - case bfd_arch_m68k: - switch (bfd_get_mach (abfd)) - { - case 68010: - N_SET_MACHTYPE (*execp, M_68010); - break; - default: - case 68020: - N_SET_MACHTYPE (*execp, M_68020); - break; - } - break; - case bfd_arch_sparc: - N_SET_MACHTYPE (*execp, M_SPARC); - break; - case bfd_arch_i386: - N_SET_MACHTYPE (*execp, M_386); - break; - case bfd_arch_a29k: - N_SET_MACHTYPE (*execp, M_29K); - break; - default: - N_SET_MACHTYPE (*execp, M_UNKNOWN); - } - - choose_reloc_size (abfd); - - N_SET_FLAGS (*execp, aout_backend_info (abfd)->exec_hdr_flags); - - WRITE_HEADERS (abfd, execp); - - return true; -} - -#define MY_set_sizes sparclynx_set_sizes -static boolean -sparclynx_set_sizes (abfd) - bfd *abfd; -{ - switch (bfd_get_arch (abfd)) - { - default: - return false; - case bfd_arch_sparc: - adata (abfd).page_size = 0x2000; - adata (abfd).segment_size = 0x2000; - adata (abfd).exec_bytes_size = EXEC_BYTES_SIZE; - return true; - case bfd_arch_m68k: - adata (abfd).page_size = 0x2000; - adata (abfd).segment_size = 0x20000; - adata (abfd).exec_bytes_size = EXEC_BYTES_SIZE; - return true; - } -} - -static CONST struct aout_backend_data sparclynx_aout_backend = -{ - 0, 1, 1, 0, sparclynx_set_sizes, 0, - 0, /* add_dynamic_symbols */ - 0, /* add_one_symbol */ - 0, /* link_dynamic_object */ - 0, /* write_dynamic_symbol */ - 0, /* check_dynamic_reloc */ - 0 /* finish_dynamic_link */ -}; - - -#define MY_bfd_debug_info_start bfd_void -#define MY_bfd_debug_info_end bfd_void -#define MY_bfd_debug_info_accumulate \ - (void (*) PARAMS ((bfd *, struct sec *))) bfd_void - -#define MY_write_object_contents NAME(aout,sparclynx_write_object_contents) -#define MY_backend_data &sparclynx_aout_backend - -#define TARGET_IS_BIG_ENDIAN_P - -#ifdef LYNX_CORE - -char *lynx_core_file_failing_command (); -int lynx_core_file_failing_signal (); -boolean lynx_core_file_matches_executable_p (); -const bfd_target *lynx_core_file_p (); - -#define MY_core_file_failing_command lynx_core_file_failing_command -#define MY_core_file_failing_signal lynx_core_file_failing_signal -#define MY_core_file_matches_executable_p lynx_core_file_matches_executable_p -#define MY_core_file_p lynx_core_file_p - -#endif /* LYNX_CORE */ - -#include "aout-target.h" diff --git a/contrib/gdb/bfd/sparcnetbsd.c b/contrib/gdb/bfd/sparcnetbsd.c deleted file mode 100644 index 69240f5d1587a..0000000000000 --- a/contrib/gdb/bfd/sparcnetbsd.c +++ /dev/null @@ -1,33 +0,0 @@ -/* BFD back-end for NetBSD/sparc a.out-ish binaries. - Copyright (C) 1990, 1991, 1992 Free Software Foundation, Inc. - -This file is part of BFD, the Binary File Descriptor library. - -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 2 of the License, 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ - -#define BYTES_IN_WORD 4 -#define TARGET_IS_BIG_ENDIAN_P - -#define TARGET_PAGE_SIZE 4096 -#define SEGMENT_SIZE 4096 - -#define DEFAULT_ARCH bfd_arch_sparc -#define MACHTYPE_OK(mtype) ((mtype) == M_SPARC_NETBSD || (mtype) == M_UNKNOWN) - -#define MY(OP) CAT(sparcnetbsd_,OP) -/* This needs to start with a.out so GDB knows it is an a.out variant. */ -#define TARGETNAME "a.out-sparc-netbsd" - -#include "netbsd.h" diff --git a/contrib/gdb/bfd/srec.c b/contrib/gdb/bfd/srec.c deleted file mode 100644 index 33d28d5eab811..0000000000000 --- a/contrib/gdb/bfd/srec.c +++ /dev/null @@ -1,1324 +0,0 @@ -/* BFD back-end for s-record objects. - Copyright 1990, 1991, 1992, 1993, 1994, 1995 Free Software Foundation, Inc. - Written by Steve Chamberlain of Cygnus Support <sac@cygnus.com>. - -This file is part of BFD, the Binary File Descriptor library. - -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 2 of the License, 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ - -/* -SUBSECTION - S-Record handling - -DESCRIPTION - - Ordinary S-Records cannot hold anything but addresses and - data, so that's all that we implement. - - The only interesting thing is that S-Records may come out of - order and there is no header, so an initial scan is required - to discover the minimum and maximum addresses used to create - the vma and size of the only section we create. We - arbitrarily call this section ".text". - - When bfd_get_section_contents is called the file is read - again, and this time the data is placed into a bfd_alloc'd - area. - - Any number of sections may be created for output, we save them - up and output them when it's time to close the bfd. - - An s record looks like: - -EXAMPLE - S<type><length><address><data><checksum> - -DESCRIPTION - Where - o length - is the number of bytes following upto the checksum. Note that - this is not the number of chars following, since it takes two - chars to represent a byte. - o type - is one of: - 0) header record - 1) two byte address data record - 2) three byte address data record - 3) four byte address data record - 7) four byte address termination record - 8) three byte address termination record - 9) two byte address termination record - - o address - is the start address of the data following, or in the case of - a termination record, the start address of the image - o data - is the data. - o checksum - is the sum of all the raw byte data in the record, from the length - upwards, modulo 256 and subtracted from 255. - - -SUBSECTION - Symbol S-Record handling - -DESCRIPTION - Some ICE equipment understands an addition to the standard - S-Record format; symbols and their addresses can be sent - before the data. - - The format of this is: - ($$ <modulename> - (<space> <symbol> <address>)*) - $$ - - so a short symbol table could look like: - -EXAMPLE - $$ flash.x - $$ flash.c - _port6 $0 - _delay $4 - _start $14 - _etext $8036 - _edata $8036 - _end $8036 - $$ - -DESCRIPTION - We allow symbols to be anywhere in the data stream - the module names - are always ignored. - -*/ - -#include "bfd.h" -#include "sysdep.h" -#include "libbfd.h" -#include "libiberty.h" -#include <ctype.h> - -static void srec_init PARAMS ((void)); -static boolean srec_mkobject PARAMS ((bfd *)); -static int srec_get_byte PARAMS ((bfd *, boolean *)); -static void srec_bad_byte PARAMS ((bfd *, unsigned int, int, boolean)); -static boolean srec_scan PARAMS ((bfd *)); -static const bfd_target *srec_object_p PARAMS ((bfd *)); -static const bfd_target *symbolsrec_object_p PARAMS ((bfd *)); -static boolean srec_read_section PARAMS ((bfd *, asection *, bfd_byte *)); - -static boolean srec_write_record PARAMS ((bfd *, int, bfd_vma, - const bfd_byte *, - const bfd_byte *)); -static boolean srec_write_header PARAMS ((bfd *)); -static boolean srec_write_symbols PARAMS ((bfd *)); - -/* Macros for converting between hex and binary. */ - -static CONST char digs[] = "0123456789ABCDEF"; - -#define NIBBLE(x) hex_value(x) -#define HEX(buffer) ((NIBBLE((buffer)[0])<<4) + NIBBLE((buffer)[1])) -#define TOHEX(d, x, ch) \ - d[1] = digs[(x) & 0xf]; \ - d[0] = digs[((x)>>4)&0xf]; \ - ch += ((x) & 0xff); -#define ISHEX(x) hex_p(x) - -/* Initialize by filling in the hex conversion array. */ - -static void -srec_init () -{ - static boolean inited = false; - - if (inited == false) - { - inited = true; - hex_init (); - } -} - -/* The maximum number of bytes on a line is FF */ -#define MAXCHUNK 0xff -/* The number of bytes we fit onto a line on output */ -#define CHUNK 21 - -/* When writing an S-record file, the S-records can not be output as - they are seen. This structure is used to hold them in memory. */ - -struct srec_data_list_struct -{ - struct srec_data_list_struct *next; - bfd_byte *data; - bfd_vma where; - bfd_size_type size; -}; - -typedef struct srec_data_list_struct srec_data_list_type; - -/* When scanning the S-record file, a linked list of srec_symbol - structures is built to represent the symbol table (if there is - one). */ - -struct srec_symbol -{ - struct srec_symbol *next; - const char *name; - bfd_vma val; -}; - -/* The S-record tdata information. */ - -typedef struct srec_data_struct - { - srec_data_list_type *head; - srec_data_list_type *tail; - unsigned int type; - struct srec_symbol *symbols; - struct srec_symbol *symtail; - asymbol *csymbols; - } -tdata_type; - -static boolean srec_write_section PARAMS ((bfd *, tdata_type *, - srec_data_list_type *)); -static boolean srec_write_terminator PARAMS ((bfd *, tdata_type *)); - -/* Set up the S-record tdata information. */ - -static boolean -srec_mkobject (abfd) - bfd *abfd; -{ - srec_init (); - - if (abfd->tdata.srec_data == NULL) - { - tdata_type *tdata = (tdata_type *) bfd_alloc (abfd, sizeof (tdata_type)); - if (tdata == NULL) - return false; - abfd->tdata.srec_data = tdata; - tdata->type = 1; - tdata->head = NULL; - tdata->tail = NULL; - tdata->symbols = NULL; - tdata->symtail = NULL; - tdata->csymbols = NULL; - } - - return true; -} - -/* Read a byte from an S record file. Set *ERRORPTR if an error - occurred. Return EOF on error or end of file. */ - -static int -srec_get_byte (abfd, errorptr) - bfd *abfd; - boolean *errorptr; -{ - bfd_byte c; - - if (bfd_read (&c, 1, 1, abfd) != 1) - { - if (bfd_get_error () != bfd_error_file_truncated) - *errorptr = true; - return EOF; - } - - return (int) (c & 0xff); -} - -/* Report a problem in an S record file. FIXME: This probably should - not call fprintf, but we really do need some mechanism for printing - error messages. */ - -static void -srec_bad_byte (abfd, lineno, c, error) - bfd *abfd; - unsigned int lineno; - int c; - boolean error; -{ - if (c == EOF) - { - if (! error) - bfd_set_error (bfd_error_file_truncated); - } - else - { - char buf[10]; - - if (! isprint (c)) - sprintf (buf, "\\%03o", (unsigned int) c); - else - { - buf[0] = c; - buf[1] = '\0'; - } - (*_bfd_error_handler) - ("%s:%d: Unexpected character `%s' in S-record file\n", - bfd_get_filename (abfd), lineno, buf); - bfd_set_error (bfd_error_bad_value); - } -} - -/* Add a new symbol found in an S-record file. */ - -static boolean -srec_new_symbol (abfd, name, val) - bfd *abfd; - const char *name; - bfd_vma val; -{ - struct srec_symbol *n; - - n = (struct srec_symbol *) bfd_alloc (abfd, sizeof (struct srec_symbol)); - if (n == NULL) - return false; - - n->name = name; - n->val = val; - - if (abfd->tdata.srec_data->symbols == NULL) - abfd->tdata.srec_data->symbols = n; - else - abfd->tdata.srec_data->symtail->next = n; - abfd->tdata.srec_data->symtail = n; - n->next = NULL; - - ++abfd->symcount; - - return true; -} - -/* Read the S record file and turn it into sections. We create a new - section for each contiguous set of bytes. */ - -static boolean -srec_scan (abfd) - bfd *abfd; -{ - int c; - unsigned int lineno = 1; - boolean error = false; - bfd_byte *buf = NULL; - size_t bufsize = 0; - asection *sec = NULL; - - if (bfd_seek (abfd, (file_ptr) 0, SEEK_SET) != 0) - goto error_return; - - while ((c = srec_get_byte (abfd, &error)) != EOF) - { - /* We only build sections from contiguous S-records, so if this - is not an S-record, then stop building a section. */ - if (c != 'S' && c != '\r' && c != '\n') - sec = NULL; - - switch (c) - { - default: - srec_bad_byte (abfd, lineno, c, error); - goto error_return; - - case '\n': - ++lineno; - break; - - case '\r': - break; - - case '$': - /* Starting a module name, which we ignore. */ - while ((c = srec_get_byte (abfd, &error)) != '\n' - && c != EOF) - ; - if (c == EOF) - { - srec_bad_byte (abfd, lineno, c, error); - goto error_return; - } - - ++lineno; - - break; - - case ' ': - { - char *symname; - bfd_vma symval; - - /* Starting a symbol definition. */ - while ((c = srec_get_byte (abfd, &error)) != EOF - && (c == ' ' || c == '\t')) - ; - if (c == EOF) - { - srec_bad_byte (abfd, lineno, c, error); - goto error_return; - } - - obstack_1grow (&abfd->memory, c); - while ((c = srec_get_byte (abfd, &error)) != EOF - && ! isspace (c)) - obstack_1grow (&abfd->memory, c); - if (c == EOF) - { - srec_bad_byte (abfd, lineno, c, error); - goto error_return; - } - - symname = obstack_finish (&abfd->memory); - if (symname == NULL) - { - bfd_set_error (bfd_error_no_memory); - goto error_return; - } - - while ((c = srec_get_byte (abfd, &error)) != EOF - && (c == ' ' || c == '\t')) - ; - if (c == EOF) - { - srec_bad_byte (abfd, lineno, c, error); - goto error_return; - } - - /* Skip a dollar sign before the hex value. */ - if (c == '$') - { - c = srec_get_byte (abfd, &error); - if (c == EOF) - { - srec_bad_byte (abfd, lineno, c, error); - goto error_return; - } - } - - symval = 0; - while (ISHEX (c)) - { - symval <<= 4; - symval += NIBBLE (c); - c = srec_get_byte (abfd, &error); - } - - if (c == EOF || ! isspace (c)) - { - srec_bad_byte (abfd, lineno, c, error); - goto error_return; - } - - if (! srec_new_symbol (abfd, symname, symval)) - goto error_return; - - if (c == '\n') - ++lineno; - - } - break; - - case 'S': - { - file_ptr pos; - char hdr[3]; - unsigned int bytes; - bfd_vma address; - bfd_byte *data; - - /* Starting an S-record. */ - - pos = bfd_tell (abfd) - 1; - - if (bfd_read (hdr, 1, 3, abfd) != 3) - goto error_return; - - if (! ISHEX (hdr[1]) || ! ISHEX (hdr[2])) - { - if (! ISHEX (hdr[1])) - c = hdr[1]; - else - c = hdr[2]; - srec_bad_byte (abfd, lineno, c, error); - goto error_return; - } - - bytes = HEX (hdr + 1); - if (bytes * 2 > bufsize) - { - if (buf != NULL) - free (buf); - buf = (bfd_byte *) bfd_malloc (bytes * 2); - if (buf == NULL) - goto error_return; - bufsize = bytes * 2; - } - - if (bfd_read (buf, 1, bytes * 2, abfd) != bytes * 2) - goto error_return; - - /* Ignore the checksum byte. */ - --bytes; - - address = 0; - data = buf; - switch (hdr[0]) - { - case '0': - case '5': - /* Prologue--ignore the file name, but stop building a - section at this point. */ - sec = NULL; - break; - - case '3': - address = HEX (data); - data += 2; - --bytes; - /* Fall through. */ - case '2': - address = (address << 8) | HEX (data); - data += 2; - --bytes; - /* Fall through. */ - case '1': - address = (address << 8) | HEX (data); - data += 2; - address = (address << 8) | HEX (data); - data += 2; - bytes -= 2; - - if (sec != NULL - && sec->vma + sec->_raw_size == address) - { - /* This data goes at the end of the section we are - currently building. */ - sec->_raw_size += bytes; - } - else - { - char secbuf[20]; - char *secname; - - sprintf (secbuf, ".sec%d", bfd_count_sections (abfd) + 1); - secname = (char *) bfd_alloc (abfd, strlen (secbuf) + 1); - strcpy (secname, secbuf); - sec = bfd_make_section (abfd, secname); - if (sec == NULL) - goto error_return; - sec->flags = SEC_HAS_CONTENTS | SEC_LOAD | SEC_ALLOC; - sec->vma = address; - sec->lma = address; - sec->_raw_size = bytes; - sec->filepos = pos; - } - - break; - - case '7': - address = HEX (data); - data += 2; - /* Fall through. */ - case '8': - address = (address << 8) | HEX (data); - data += 2; - /* Fall through. */ - case '9': - address = (address << 8) | HEX (data); - data += 2; - address = (address << 8) | HEX (data); - data += 2; - - /* This is a termination record. */ - abfd->start_address = address; - - if (buf != NULL) - free (buf); - - return true; - } - } - break; - } - } - - if (error) - goto error_return; - - if (buf != NULL) - free (buf); - - return true; - - error_return: - if (buf != NULL) - free (buf); - return false; -} - -/* Check whether an existing file is an S-record file. */ - -static const bfd_target * -srec_object_p (abfd) - bfd *abfd; -{ - bfd_byte b[4]; - - srec_init (); - - if (bfd_seek (abfd, (file_ptr) 0, SEEK_SET) != 0 - || bfd_read (b, 1, 4, abfd) != 4) - return NULL; - - if (b[0] != 'S' || !ISHEX (b[1]) || !ISHEX (b[2]) || !ISHEX (b[3])) - { - bfd_set_error (bfd_error_wrong_format); - return NULL; - } - - if (! srec_mkobject (abfd) - || ! srec_scan (abfd)) - return NULL; - - return abfd->xvec; -} - -/* Check whether an existing file is an S-record file with symbols. */ - -static const bfd_target * -symbolsrec_object_p (abfd) - bfd *abfd; -{ - char b[2]; - - srec_init (); - - if (bfd_seek (abfd, (file_ptr) 0, SEEK_SET) != 0 - || bfd_read (b, 1, 2, abfd) != 2) - return NULL; - - if (b[0] != '$' || b[1] != '$') - { - bfd_set_error (bfd_error_wrong_format); - return NULL; - } - - if (! srec_mkobject (abfd) - || ! srec_scan (abfd)) - return NULL; - - return abfd->xvec; -} - -/* Read in the contents of a section in an S-record file. */ - -static boolean -srec_read_section (abfd, section, contents) - bfd *abfd; - asection *section; - bfd_byte *contents; -{ - int c; - bfd_size_type sofar = 0; - boolean error = false; - bfd_byte *buf = NULL; - size_t bufsize = 0; - - if (bfd_seek (abfd, section->filepos, SEEK_SET) != 0) - goto error_return; - - while ((c = srec_get_byte (abfd, &error)) != EOF) - { - bfd_byte hdr[3]; - unsigned int bytes; - bfd_vma address; - bfd_byte *data; - - if (c == '\r' || c == '\n') - continue; - - /* This is called after srec_scan has already been called, so we - ought to know the exact format. */ - BFD_ASSERT (c == 'S'); - - if (bfd_read (hdr, 1, 3, abfd) != 3) - goto error_return; - - BFD_ASSERT (ISHEX (hdr[1]) && ISHEX (hdr[2])); - - bytes = HEX (hdr + 1); - - if (bytes * 2 > bufsize) - { - if (buf != NULL) - free (buf); - buf = (bfd_byte *) bfd_malloc (bytes * 2); - if (buf == NULL) - goto error_return; - bufsize = bytes * 2; - } - - if (bfd_read (buf, 1, bytes * 2, abfd) != bytes * 2) - goto error_return; - - address = 0; - data = buf; - switch (hdr[0]) - { - default: - BFD_ASSERT (sofar == section->_raw_size); - if (buf != NULL) - free (buf); - return true; - - case '3': - address = HEX (data); - data += 2; - --bytes; - /* Fall through. */ - case '2': - address = (address << 8) | HEX (data); - data += 2; - --bytes; - /* Fall through. */ - case '1': - address = (address << 8) | HEX (data); - data += 2; - address = (address << 8) | HEX (data); - data += 2; - bytes -= 2; - - if (address != section->vma + sofar) - { - /* We've come to the end of this section. */ - BFD_ASSERT (sofar == section->_raw_size); - if (buf != NULL) - free (buf); - return true; - } - - /* Don't consider checksum. */ - --bytes; - - while (bytes-- != 0) - { - contents[sofar] = HEX (data); - data += 2; - ++sofar; - } - - break; - } - } - - if (error) - goto error_return; - - BFD_ASSERT (sofar == section->_raw_size); - - if (buf != NULL) - free (buf); - - return true; - - error_return: - if (buf != NULL) - free (buf); - return false; -} - -/* Get the contents of a section in an S-record file. */ - -static boolean -srec_get_section_contents (abfd, section, location, offset, count) - bfd *abfd; - asection *section; - PTR location; - file_ptr offset; - bfd_size_type count; -{ - if (section->used_by_bfd == NULL) - { - section->used_by_bfd = bfd_alloc (abfd, section->_raw_size); - if (section->used_by_bfd == NULL - && section->_raw_size != 0) - return false; - - if (! srec_read_section (abfd, section, section->used_by_bfd)) - return false; - } - - memcpy (location, (bfd_byte *) section->used_by_bfd + offset, - (size_t) count); - - return true; -} - -/* we have to save up all the Srecords for a splurge before output */ - -static boolean -srec_set_section_contents (abfd, section, location, offset, bytes_to_do) - bfd *abfd; - sec_ptr section; - PTR location; - file_ptr offset; - bfd_size_type bytes_to_do; -{ - tdata_type *tdata = abfd->tdata.srec_data; - register srec_data_list_type *entry; - - entry = ((srec_data_list_type *) - bfd_alloc (abfd, sizeof (srec_data_list_type))); - if (entry == NULL) - return false; - - if (bytes_to_do - && (section->flags & SEC_ALLOC) - && (section->flags & SEC_LOAD)) - { - bfd_byte *data = (bfd_byte *) bfd_alloc (abfd, bytes_to_do); - if (data == NULL) - return false; - memcpy ((PTR) data, location, (size_t) bytes_to_do); - - if ((section->lma + offset + bytes_to_do - 1) <= 0xffff) - { - - } - else if ((section->lma + offset + bytes_to_do - 1) <= 0xffffff - && tdata->type < 2) - { - tdata->type = 2; - } - else - { - tdata->type = 3; - } - - entry->data = data; - entry->where = section->lma + offset; - entry->size = bytes_to_do; - - /* Sort the records by address. Optimize for the common case of - adding a record to the end of the list. */ - if (tdata->tail != NULL - && entry->where >= tdata->tail->where) - { - tdata->tail->next = entry; - entry->next = NULL; - tdata->tail = entry; - } - else - { - register srec_data_list_type **look; - - for (look = &tdata->head; - *look != NULL && (*look)->where < entry->where; - look = &(*look)->next) - ; - entry->next = *look; - *look = entry; - if (entry->next == NULL) - tdata->tail = entry; - } - } - return true; -} - -/* Write a record of type, of the supplied number of bytes. The - supplied bytes and length don't have a checksum. That's worked out - here -*/ -static boolean -srec_write_record (abfd, type, address, data, end) - bfd *abfd; - int type; - bfd_vma address; - const bfd_byte *data; - const bfd_byte *end; -{ - char buffer[MAXCHUNK]; - unsigned int check_sum = 0; - CONST bfd_byte *src = data; - char *dst = buffer; - char *length; - bfd_size_type wrlen; - - *dst++ = 'S'; - *dst++ = '0' + type; - - length = dst; - dst += 2; /* leave room for dst*/ - - switch (type) - { - case 3: - case 7: - TOHEX (dst, (address >> 24), check_sum); - dst += 2; - case 8: - case 2: - TOHEX (dst, (address >> 16), check_sum); - dst += 2; - case 9: - case 1: - case 0: - TOHEX (dst, (address >> 8), check_sum); - dst += 2; - TOHEX (dst, (address), check_sum); - dst += 2; - break; - - } - for (src = data; src < end; src++) - { - TOHEX (dst, *src, check_sum); - dst += 2; - } - - /* Fill in the length */ - TOHEX (length, (dst - length) / 2, check_sum); - check_sum &= 0xff; - check_sum = 255 - check_sum; - TOHEX (dst, check_sum, check_sum); - dst += 2; - - *dst++ = '\r'; - *dst++ = '\n'; - wrlen = dst - buffer; - if (bfd_write ((PTR) buffer, 1, wrlen, abfd) != wrlen) - return false; - return true; -} - - - -static boolean -srec_write_header (abfd) - bfd *abfd; -{ - bfd_byte buffer[MAXCHUNK]; - bfd_byte *dst = buffer; - unsigned int i; - - /* I'll put an arbitary 40 char limit on header size */ - for (i = 0; i < 40 && abfd->filename[i]; i++) - { - *dst++ = abfd->filename[i]; - } - return srec_write_record (abfd, 0, 0, buffer, dst); -} - -static boolean -srec_write_section (abfd, tdata, list) - bfd *abfd; - tdata_type *tdata; - srec_data_list_type *list; -{ - unsigned int bytes_written = 0; - bfd_byte *location = list->data; - - while (bytes_written < list->size) - { - bfd_vma address; - - unsigned int bytes_this_chunk = list->size - bytes_written; - - if (bytes_this_chunk > CHUNK) - { - bytes_this_chunk = CHUNK; - } - - address = list->where + bytes_written; - - if (! srec_write_record (abfd, - tdata->type, - address, - location, - location + bytes_this_chunk)) - return false; - - bytes_written += bytes_this_chunk; - location += bytes_this_chunk; - } - - return true; -} - -static boolean -srec_write_terminator (abfd, tdata) - bfd *abfd; - tdata_type *tdata; -{ - bfd_byte buffer[2]; - - return srec_write_record (abfd, 10 - tdata->type, - abfd->start_address, buffer, buffer); -} - - - -static boolean -srec_write_symbols (abfd) - bfd *abfd; -{ - char buffer[MAXCHUNK]; - /* Dump out the symbols of a bfd */ - int i; - int count = bfd_get_symcount (abfd); - - if (count) - { - size_t len; - asymbol **table = bfd_get_outsymbols (abfd); - sprintf (buffer, "$$ %s\r\n", abfd->filename); - - len = strlen (buffer); - if (bfd_write (buffer, len, 1, abfd) != len) - return false; - - for (i = 0; i < count; i++) - { - asymbol *s = table[i]; -#if 0 - int len = strlen (s->name); - - /* If this symbol has a .[ocs] in it, it's probably a file name - and we'll output that as the module name */ - - if (len > 3 && s->name[len - 2] == '.') - { - int l; - sprintf (buffer, "$$ %s\r\n", s->name); - l = strlen (buffer); - if (bfd_write (buffer, l, 1, abfd) != l) - return false; - } - else -#endif - if (s->flags & (BSF_GLOBAL | BSF_LOCAL) - && (s->flags & BSF_DEBUGGING) == 0 - && s->name[0] != '.' - && s->name[0] != 't') - { - /* Just dump out non debug symbols */ - bfd_size_type l; - char buf2[40], *p; - - sprintf_vma (buf2, - s->value + s->section->output_section->lma - + s->section->output_offset); - p = buf2; - while (p[0] == '0' && p[1] != 0) - p++; - sprintf (buffer, " %s $%s\r\n", s->name, p); - l = strlen (buffer); - if (bfd_write (buffer, l, 1, abfd) != l) - return false; - } - } - sprintf (buffer, "$$ \r\n"); - len = strlen (buffer); - if (bfd_write (buffer, len, 1, abfd) != len) - return false; - } - - return true; -} - -static boolean -internal_srec_write_object_contents (abfd, symbols) - bfd *abfd; - int symbols; -{ - tdata_type *tdata = abfd->tdata.srec_data; - srec_data_list_type *list; - - if (symbols) - { - if (! srec_write_symbols (abfd)) - return false; - } - - if (! srec_write_header (abfd)) - return false; - - /* Now wander though all the sections provided and output them */ - list = tdata->head; - - while (list != (srec_data_list_type *) NULL) - { - if (! srec_write_section (abfd, tdata, list)) - return false; - list = list->next; - } - return srec_write_terminator (abfd, tdata); -} - -static boolean -srec_write_object_contents (abfd) - bfd *abfd; -{ - return internal_srec_write_object_contents (abfd, 0); -} - -static boolean -symbolsrec_write_object_contents (abfd) - bfd *abfd; -{ - return internal_srec_write_object_contents (abfd, 1); -} - -/*ARGSUSED*/ -static int -srec_sizeof_headers (abfd, exec) - bfd *abfd; - boolean exec; -{ - return 0; -} - -static asymbol * -srec_make_empty_symbol (abfd) - bfd *abfd; -{ - asymbol *new = (asymbol *) bfd_zalloc (abfd, sizeof (asymbol)); - if (new) - new->the_bfd = abfd; - return new; -} - -/* Return the amount of memory needed to read the symbol table. */ - -static long -srec_get_symtab_upper_bound (abfd) - bfd *abfd; -{ - return (bfd_get_symcount (abfd) + 1) * sizeof (asymbol *); -} - -/* Return the symbol table. */ - -static long -srec_get_symtab (abfd, alocation) - bfd *abfd; - asymbol **alocation; -{ - unsigned int symcount = bfd_get_symcount (abfd); - asymbol *csymbols; - unsigned int i; - - csymbols = abfd->tdata.srec_data->csymbols; - if (csymbols == NULL) - { - asymbol *c; - struct srec_symbol *s; - - csymbols = (asymbol *) bfd_alloc (abfd, symcount * sizeof (asymbol)); - if (csymbols == NULL && symcount != 0) - return false; - abfd->tdata.srec_data->csymbols = csymbols; - - for (s = abfd->tdata.srec_data->symbols, c = csymbols; - s != NULL; - s = s->next, ++c) - { - c->the_bfd = abfd; - c->name = s->name; - c->value = s->val; - c->flags = BSF_GLOBAL; - c->section = bfd_abs_section_ptr; - c->udata.p = NULL; - } - } - - for (i = 0; i < symcount; i++) - *alocation++ = csymbols++; - *alocation = NULL; - - return symcount; -} - -/*ARGSUSED*/ -void -srec_get_symbol_info (ignore_abfd, symbol, ret) - bfd *ignore_abfd; - asymbol *symbol; - symbol_info *ret; -{ - bfd_symbol_info (symbol, ret); -} - -/*ARGSUSED*/ -void -srec_print_symbol (ignore_abfd, afile, symbol, how) - bfd *ignore_abfd; - PTR afile; - asymbol *symbol; - bfd_print_symbol_type how; -{ - FILE *file = (FILE *) afile; - switch (how) - { - case bfd_print_symbol_name: - fprintf (file, "%s", symbol->name); - break; - default: - bfd_print_symbol_vandf ((PTR) file, symbol); - fprintf (file, " %-5s %s", - symbol->section->name, - symbol->name); - - } -} - -#define srec_close_and_cleanup _bfd_generic_close_and_cleanup -#define srec_bfd_free_cached_info _bfd_generic_bfd_free_cached_info -#define srec_new_section_hook _bfd_generic_new_section_hook - -#define srec_bfd_is_local_label bfd_generic_is_local_label -#define srec_get_lineno _bfd_nosymbols_get_lineno -#define srec_find_nearest_line _bfd_nosymbols_find_nearest_line -#define srec_bfd_make_debug_symbol _bfd_nosymbols_bfd_make_debug_symbol -#define srec_read_minisymbols _bfd_generic_read_minisymbols -#define srec_minisymbol_to_symbol _bfd_generic_minisymbol_to_symbol - -#define srec_get_reloc_upper_bound \ - ((long (*) PARAMS ((bfd *, asection *))) bfd_0l) -#define srec_canonicalize_reloc \ - ((long (*) PARAMS ((bfd *, asection *, arelent **, asymbol **))) bfd_0l) -#define srec_bfd_reloc_type_lookup _bfd_norelocs_bfd_reloc_type_lookup - -#define srec_get_section_contents_in_window \ - _bfd_generic_get_section_contents_in_window - -#define srec_set_arch_mach bfd_default_set_arch_mach - -#define srec_bfd_get_relocated_section_contents \ - bfd_generic_get_relocated_section_contents -#define srec_bfd_relax_section bfd_generic_relax_section -#define srec_bfd_link_hash_table_create _bfd_generic_link_hash_table_create -#define srec_bfd_link_add_symbols _bfd_generic_link_add_symbols -#define srec_bfd_final_link _bfd_generic_final_link -#define srec_bfd_link_split_section _bfd_generic_link_split_section - -const bfd_target srec_vec = -{ - "srec", /* name */ - bfd_target_srec_flavour, - BFD_ENDIAN_UNKNOWN, /* target byte order */ - BFD_ENDIAN_UNKNOWN, /* target headers byte order */ - (HAS_RELOC | EXEC_P | /* object flags */ - HAS_LINENO | HAS_DEBUG | - HAS_SYMS | HAS_LOCALS | WP_TEXT | D_PAGED), - (SEC_CODE | SEC_DATA | SEC_ROM | SEC_HAS_CONTENTS - | SEC_ALLOC | SEC_LOAD | SEC_RELOC), /* section flags */ - 0, /* leading underscore */ - ' ', /* ar_pad_char */ - 16, /* ar_max_namelen */ - bfd_getb64, bfd_getb_signed_64, bfd_putb64, - bfd_getb32, bfd_getb_signed_32, bfd_putb32, - bfd_getb16, bfd_getb_signed_16, bfd_putb16, /* data */ - bfd_getb64, bfd_getb_signed_64, bfd_putb64, - bfd_getb32, bfd_getb_signed_32, bfd_putb32, - bfd_getb16, bfd_getb_signed_16, bfd_putb16, /* hdrs */ - - { - _bfd_dummy_target, - srec_object_p, /* bfd_check_format */ - _bfd_dummy_target, - _bfd_dummy_target, - }, - { - bfd_false, - srec_mkobject, - _bfd_generic_mkarchive, - bfd_false, - }, - { /* bfd_write_contents */ - bfd_false, - srec_write_object_contents, - _bfd_write_archive_contents, - bfd_false, - }, - - BFD_JUMP_TABLE_GENERIC (srec), - BFD_JUMP_TABLE_COPY (_bfd_generic), - BFD_JUMP_TABLE_CORE (_bfd_nocore), - BFD_JUMP_TABLE_ARCHIVE (_bfd_noarchive), - BFD_JUMP_TABLE_SYMBOLS (srec), - BFD_JUMP_TABLE_RELOCS (srec), - BFD_JUMP_TABLE_WRITE (srec), - BFD_JUMP_TABLE_LINK (srec), - BFD_JUMP_TABLE_DYNAMIC (_bfd_nodynamic), - - (PTR) 0 -}; - - - -const bfd_target symbolsrec_vec = -{ - "symbolsrec", /* name */ - bfd_target_srec_flavour, - BFD_ENDIAN_UNKNOWN, /* target byte order */ - BFD_ENDIAN_UNKNOWN, /* target headers byte order */ - (HAS_RELOC | EXEC_P | /* object flags */ - HAS_LINENO | HAS_DEBUG | - HAS_SYMS | HAS_LOCALS | WP_TEXT | D_PAGED), - (SEC_CODE | SEC_DATA | SEC_ROM | SEC_HAS_CONTENTS - | SEC_ALLOC | SEC_LOAD | SEC_RELOC), /* section flags */ - 0, /* leading underscore */ - ' ', /* ar_pad_char */ - 16, /* ar_max_namelen */ - bfd_getb64, bfd_getb_signed_64, bfd_putb64, - bfd_getb32, bfd_getb_signed_32, bfd_putb32, - bfd_getb16, bfd_getb_signed_16, bfd_putb16, /* data */ - bfd_getb64, bfd_getb_signed_64, bfd_putb64, - bfd_getb32, bfd_getb_signed_32, bfd_putb32, - bfd_getb16, bfd_getb_signed_16, bfd_putb16, /* hdrs */ - - { - _bfd_dummy_target, - symbolsrec_object_p, /* bfd_check_format */ - _bfd_dummy_target, - _bfd_dummy_target, - }, - { - bfd_false, - srec_mkobject, - _bfd_generic_mkarchive, - bfd_false, - }, - { /* bfd_write_contents */ - bfd_false, - symbolsrec_write_object_contents, - _bfd_write_archive_contents, - bfd_false, - }, - - BFD_JUMP_TABLE_GENERIC (srec), - BFD_JUMP_TABLE_COPY (_bfd_generic), - BFD_JUMP_TABLE_CORE (_bfd_nocore), - BFD_JUMP_TABLE_ARCHIVE (_bfd_noarchive), - BFD_JUMP_TABLE_SYMBOLS (srec), - BFD_JUMP_TABLE_RELOCS (srec), - BFD_JUMP_TABLE_WRITE (srec), - BFD_JUMP_TABLE_LINK (srec), - BFD_JUMP_TABLE_DYNAMIC (_bfd_nodynamic), - - (PTR) 0 -}; diff --git a/contrib/gdb/bfd/stab-syms.c b/contrib/gdb/bfd/stab-syms.c deleted file mode 100644 index f4fe6c8ba3cfe..0000000000000 --- a/contrib/gdb/bfd/stab-syms.c +++ /dev/null @@ -1,57 +0,0 @@ -/* Table of stab names for the BFD library. - Copyright (C) 1990, 91, 92, 93, 94, 95, 1996 Free Software Foundation, Inc. - Written by Cygnus Support. - -This file is part of BFD, the Binary File Descriptor library. - -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 2 of the License, 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ - -#include "bfd.h" - -#define ARCH_SIZE 32 /* Value doesn't matter. */ -#include "libaout.h" -#include "aout/aout64.h" - -/* Ignore duplicate stab codes; just return the string for the first - one. */ -#define __define_stab(NAME, CODE, STRING) __define_name(CODE, STRING) -#define __define_stab_duplicate(NAME, CODE, STRING) - -/* These are not really stab symbols, but it is - convenient to have them here for the sake of nm. - For completeness, we could also add N_TEXT etc, but those - are never needed, since nm treats those specially. */ -#define EXTRA_SYMBOLS \ - __define_name (N_SETA, "SETA")/* Absolute set element symbol */ \ - __define_name (N_SETT, "SETT")/* Text set element symbol */ \ - __define_name (N_SETD, "SETD")/* Data set element symbol */ \ - __define_name (N_SETB, "SETB")/* Bss set element symbol */ \ - __define_name (N_SETV, "SETV")/* Pointer to set vector in data area. */ \ - __define_name (N_INDR, "INDR") \ - __define_name (N_WARNING, "WARNING") - -const char * -bfd_get_stab_name (code) - int code; -{ - switch (code) - { -#define __define_name(val, str) case val: return str; -#include "aout/stab.def" - EXTRA_SYMBOLS - } - - return (const char *) 0; -} diff --git a/contrib/gdb/bfd/sunos.c b/contrib/gdb/bfd/sunos.c deleted file mode 100644 index 77bf319bcd60d..0000000000000 --- a/contrib/gdb/bfd/sunos.c +++ /dev/null @@ -1,2767 +0,0 @@ -/* BFD backend for SunOS binaries. - Copyright (C) 1990, 91, 92, 93, 94, 95, 1996 Free Software Foundation, Inc. - Written by Cygnus Support. - -This file is part of BFD, the Binary File Descriptor library. - -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 2 of the License, 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ - -#define TARGETNAME "a.out-sunos-big" -#define MY(OP) CAT(sunos_big_,OP) - -#include "bfd.h" -#include "bfdlink.h" -#include "libaout.h" - -/* Static routines defined in this file. */ - -static boolean sunos_read_dynamic_info PARAMS ((bfd *)); -static long sunos_get_dynamic_symtab_upper_bound PARAMS ((bfd *)); -static boolean sunos_slurp_dynamic_symtab PARAMS ((bfd *)); -static long sunos_canonicalize_dynamic_symtab PARAMS ((bfd *, asymbol **)); -static long sunos_get_dynamic_reloc_upper_bound PARAMS ((bfd *)); -static long sunos_canonicalize_dynamic_reloc - PARAMS ((bfd *, arelent **, asymbol **)); -static struct bfd_hash_entry *sunos_link_hash_newfunc - PARAMS ((struct bfd_hash_entry *, struct bfd_hash_table *, const char *)); -static struct bfd_link_hash_table *sunos_link_hash_table_create - PARAMS ((bfd *)); -static boolean sunos_create_dynamic_sections - PARAMS ((bfd *, struct bfd_link_info *, boolean)); -static boolean sunos_add_dynamic_symbols - PARAMS ((bfd *, struct bfd_link_info *, struct external_nlist **, - bfd_size_type *, char **)); -static boolean sunos_add_one_symbol - PARAMS ((struct bfd_link_info *, bfd *, const char *, flagword, asection *, - bfd_vma, const char *, boolean, boolean, - struct bfd_link_hash_entry **)); -static boolean sunos_scan_relocs - PARAMS ((struct bfd_link_info *, bfd *, asection *, bfd_size_type)); -static boolean sunos_scan_std_relocs - PARAMS ((struct bfd_link_info *, bfd *, asection *, - const struct reloc_std_external *, bfd_size_type)); -static boolean sunos_scan_ext_relocs - PARAMS ((struct bfd_link_info *, bfd *, asection *, - const struct reloc_ext_external *, bfd_size_type)); -static boolean sunos_link_dynamic_object - PARAMS ((struct bfd_link_info *, bfd *)); -static boolean sunos_write_dynamic_symbol - PARAMS ((bfd *, struct bfd_link_info *, struct aout_link_hash_entry *)); -static boolean sunos_check_dynamic_reloc - PARAMS ((struct bfd_link_info *, bfd *, asection *, - struct aout_link_hash_entry *, PTR, bfd_byte *, boolean *, - bfd_vma *)); -static boolean sunos_finish_dynamic_link - PARAMS ((bfd *, struct bfd_link_info *)); - -#define MY_get_dynamic_symtab_upper_bound sunos_get_dynamic_symtab_upper_bound -#define MY_canonicalize_dynamic_symtab sunos_canonicalize_dynamic_symtab -#define MY_get_dynamic_reloc_upper_bound sunos_get_dynamic_reloc_upper_bound -#define MY_canonicalize_dynamic_reloc sunos_canonicalize_dynamic_reloc -#define MY_bfd_link_hash_table_create sunos_link_hash_table_create -#define MY_add_dynamic_symbols sunos_add_dynamic_symbols -#define MY_add_one_symbol sunos_add_one_symbol -#define MY_link_dynamic_object sunos_link_dynamic_object -#define MY_write_dynamic_symbol sunos_write_dynamic_symbol -#define MY_check_dynamic_reloc sunos_check_dynamic_reloc -#define MY_finish_dynamic_link sunos_finish_dynamic_link - -/* Include the usual a.out support. */ -#include "aoutf1.h" - -/* SunOS shared library support. We store a pointer to this structure - in obj_aout_dynamic_info (abfd). */ - -struct sunos_dynamic_info -{ - /* Whether we found any dynamic information. */ - boolean valid; - /* Dynamic information. */ - struct internal_sun4_dynamic_link dyninfo; - /* Number of dynamic symbols. */ - unsigned long dynsym_count; - /* Read in nlists for dynamic symbols. */ - struct external_nlist *dynsym; - /* asymbol structures for dynamic symbols. */ - aout_symbol_type *canonical_dynsym; - /* Read in dynamic string table. */ - char *dynstr; - /* Number of dynamic relocs. */ - unsigned long dynrel_count; - /* Read in dynamic relocs. This may be reloc_std_external or - reloc_ext_external. */ - PTR dynrel; - /* arelent structures for dynamic relocs. */ - arelent *canonical_dynrel; -}; - -/* The hash table of dynamic symbols is composed of two word entries. - See include/aout/sun4.h for details. */ - -#define HASH_ENTRY_SIZE (2 * BYTES_IN_WORD) - -/* Read in the basic dynamic information. This locates the __DYNAMIC - structure and uses it to find the dynamic_link structure. It - creates and saves a sunos_dynamic_info structure. If it can't find - __DYNAMIC, it sets the valid field of the sunos_dynamic_info - structure to false to avoid doing this work again. */ - -static boolean -sunos_read_dynamic_info (abfd) - bfd *abfd; -{ - struct sunos_dynamic_info *info; - asection *dynsec; - bfd_vma dynoff; - struct external_sun4_dynamic dyninfo; - unsigned long dynver; - struct external_sun4_dynamic_link linkinfo; - - if (obj_aout_dynamic_info (abfd) != (PTR) NULL) - return true; - - if ((abfd->flags & DYNAMIC) == 0) - { - bfd_set_error (bfd_error_invalid_operation); - return false; - } - - info = ((struct sunos_dynamic_info *) - bfd_zalloc (abfd, sizeof (struct sunos_dynamic_info))); - if (!info) - return false; - info->valid = false; - info->dynsym = NULL; - info->dynstr = NULL; - info->canonical_dynsym = NULL; - info->dynrel = NULL; - info->canonical_dynrel = NULL; - obj_aout_dynamic_info (abfd) = (PTR) info; - - /* This code used to look for the __DYNAMIC symbol to locate the dynamic - linking information. - However this inhibits recovering the dynamic symbols from a - stripped object file, so blindly assume that the dynamic linking - information is located at the start of the data section. - We could verify this assumption later by looking through the dynamic - symbols for the __DYNAMIC symbol. */ - if ((abfd->flags & DYNAMIC) == 0) - return true; - if (! bfd_get_section_contents (abfd, obj_datasec (abfd), (PTR) &dyninfo, - (file_ptr) 0, sizeof dyninfo)) - return true; - - dynver = GET_WORD (abfd, dyninfo.ld_version); - if (dynver != 2 && dynver != 3) - return true; - - dynoff = GET_WORD (abfd, dyninfo.ld); - - /* dynoff is a virtual address. It is probably always in the .data - section, but this code should work even if it moves. */ - if (dynoff < bfd_get_section_vma (abfd, obj_datasec (abfd))) - dynsec = obj_textsec (abfd); - else - dynsec = obj_datasec (abfd); - dynoff -= bfd_get_section_vma (abfd, dynsec); - if (dynoff > bfd_section_size (abfd, dynsec)) - return true; - - /* This executable appears to be dynamically linked in a way that we - can understand. */ - if (! bfd_get_section_contents (abfd, dynsec, (PTR) &linkinfo, dynoff, - (bfd_size_type) sizeof linkinfo)) - return true; - - /* Swap in the dynamic link information. */ - info->dyninfo.ld_loaded = GET_WORD (abfd, linkinfo.ld_loaded); - info->dyninfo.ld_need = GET_WORD (abfd, linkinfo.ld_need); - info->dyninfo.ld_rules = GET_WORD (abfd, linkinfo.ld_rules); - info->dyninfo.ld_got = GET_WORD (abfd, linkinfo.ld_got); - info->dyninfo.ld_plt = GET_WORD (abfd, linkinfo.ld_plt); - info->dyninfo.ld_rel = GET_WORD (abfd, linkinfo.ld_rel); - info->dyninfo.ld_hash = GET_WORD (abfd, linkinfo.ld_hash); - info->dyninfo.ld_stab = GET_WORD (abfd, linkinfo.ld_stab); - info->dyninfo.ld_stab_hash = GET_WORD (abfd, linkinfo.ld_stab_hash); - info->dyninfo.ld_buckets = GET_WORD (abfd, linkinfo.ld_buckets); - info->dyninfo.ld_symbols = GET_WORD (abfd, linkinfo.ld_symbols); - info->dyninfo.ld_symb_size = GET_WORD (abfd, linkinfo.ld_symb_size); - info->dyninfo.ld_text = GET_WORD (abfd, linkinfo.ld_text); - info->dyninfo.ld_plt_sz = GET_WORD (abfd, linkinfo.ld_plt_sz); - - /* Reportedly the addresses need to be offset by the size of the - exec header in an NMAGIC file. */ - if (adata (abfd).magic == n_magic) - { - unsigned long exec_bytes_size = adata (abfd).exec_bytes_size; - - info->dyninfo.ld_need += exec_bytes_size; - info->dyninfo.ld_rules += exec_bytes_size; - info->dyninfo.ld_rel += exec_bytes_size; - info->dyninfo.ld_hash += exec_bytes_size; - info->dyninfo.ld_stab += exec_bytes_size; - info->dyninfo.ld_symbols += exec_bytes_size; - } - - /* The only way to get the size of the symbol information appears to - be to determine the distance between it and the string table. */ - info->dynsym_count = ((info->dyninfo.ld_symbols - info->dyninfo.ld_stab) - / EXTERNAL_NLIST_SIZE); - BFD_ASSERT (info->dynsym_count * EXTERNAL_NLIST_SIZE - == (unsigned long) (info->dyninfo.ld_symbols - - info->dyninfo.ld_stab)); - - /* Similarly, the relocs end at the hash table. */ - info->dynrel_count = ((info->dyninfo.ld_hash - info->dyninfo.ld_rel) - / obj_reloc_entry_size (abfd)); - BFD_ASSERT (info->dynrel_count * obj_reloc_entry_size (abfd) - == (unsigned long) (info->dyninfo.ld_hash - - info->dyninfo.ld_rel)); - - info->valid = true; - - return true; -} - -/* Return the amount of memory required for the dynamic symbols. */ - -static long -sunos_get_dynamic_symtab_upper_bound (abfd) - bfd *abfd; -{ - struct sunos_dynamic_info *info; - - if (! sunos_read_dynamic_info (abfd)) - return -1; - - info = (struct sunos_dynamic_info *) obj_aout_dynamic_info (abfd); - if (! info->valid) - { - bfd_set_error (bfd_error_no_symbols); - return -1; - } - - return (info->dynsym_count + 1) * sizeof (asymbol *); -} - -/* Read the external dynamic symbols. */ - -static boolean -sunos_slurp_dynamic_symtab (abfd) - bfd *abfd; -{ - struct sunos_dynamic_info *info; - - /* Get the general dynamic information. */ - if (obj_aout_dynamic_info (abfd) == NULL) - { - if (! sunos_read_dynamic_info (abfd)) - return false; - } - - info = (struct sunos_dynamic_info *) obj_aout_dynamic_info (abfd); - if (! info->valid) - { - bfd_set_error (bfd_error_no_symbols); - return false; - } - - /* Get the dynamic nlist structures. */ - if (info->dynsym == (struct external_nlist *) NULL) - { - info->dynsym = ((struct external_nlist *) - bfd_alloc (abfd, - (info->dynsym_count - * EXTERNAL_NLIST_SIZE))); - if (info->dynsym == NULL && info->dynsym_count != 0) - return false; - if (bfd_seek (abfd, info->dyninfo.ld_stab, SEEK_SET) != 0 - || (bfd_read ((PTR) info->dynsym, info->dynsym_count, - EXTERNAL_NLIST_SIZE, abfd) - != info->dynsym_count * EXTERNAL_NLIST_SIZE)) - { - if (info->dynsym != NULL) - { - bfd_release (abfd, info->dynsym); - info->dynsym = NULL; - } - return false; - } - } - - /* Get the dynamic strings. */ - if (info->dynstr == (char *) NULL) - { - info->dynstr = (char *) bfd_alloc (abfd, info->dyninfo.ld_symb_size); - if (info->dynstr == NULL && info->dyninfo.ld_symb_size != 0) - return false; - if (bfd_seek (abfd, info->dyninfo.ld_symbols, SEEK_SET) != 0 - || (bfd_read ((PTR) info->dynstr, 1, info->dyninfo.ld_symb_size, - abfd) - != info->dyninfo.ld_symb_size)) - { - if (info->dynstr != NULL) - { - bfd_release (abfd, info->dynstr); - info->dynstr = NULL; - } - return false; - } - } - - return true; -} - -/* Read in the dynamic symbols. */ - -static long -sunos_canonicalize_dynamic_symtab (abfd, storage) - bfd *abfd; - asymbol **storage; -{ - struct sunos_dynamic_info *info; - unsigned long i; - - if (! sunos_slurp_dynamic_symtab (abfd)) - return -1; - - info = (struct sunos_dynamic_info *) obj_aout_dynamic_info (abfd); - -#ifdef CHECK_DYNAMIC_HASH - /* Check my understanding of the dynamic hash table by making sure - that each symbol can be located in the hash table. */ - { - bfd_size_type table_size; - bfd_byte *table; - bfd_size_type i; - - if (info->dyninfo.ld_buckets > info->dynsym_count) - abort (); - table_size = info->dyninfo.ld_stab - info->dyninfo.ld_hash; - table = (bfd_byte *) bfd_malloc (table_size); - if (table == NULL && table_size != 0) - abort (); - if (bfd_seek (abfd, info->dyninfo.ld_hash, SEEK_SET) != 0 - || bfd_read ((PTR) table, 1, table_size, abfd) != table_size) - abort (); - for (i = 0; i < info->dynsym_count; i++) - { - unsigned char *name; - unsigned long hash; - - name = ((unsigned char *) info->dynstr - + GET_WORD (abfd, info->dynsym[i].e_strx)); - hash = 0; - while (*name != '\0') - hash = (hash << 1) + *name++; - hash &= 0x7fffffff; - hash %= info->dyninfo.ld_buckets; - while (GET_WORD (abfd, table + hash * HASH_ENTRY_SIZE) != i) - { - hash = GET_WORD (abfd, - table + hash * HASH_ENTRY_SIZE + BYTES_IN_WORD); - if (hash == 0 || hash >= table_size / HASH_ENTRY_SIZE) - abort (); - } - } - free (table); - } -#endif /* CHECK_DYNAMIC_HASH */ - - /* Get the asymbol structures corresponding to the dynamic nlist - structures. */ - if (info->canonical_dynsym == (aout_symbol_type *) NULL) - { - info->canonical_dynsym = ((aout_symbol_type *) - bfd_alloc (abfd, - (info->dynsym_count - * sizeof (aout_symbol_type)))); - if (info->canonical_dynsym == NULL && info->dynsym_count != 0) - return -1; - - if (! aout_32_translate_symbol_table (abfd, info->canonical_dynsym, - info->dynsym, info->dynsym_count, - info->dynstr, - info->dyninfo.ld_symb_size, - true)) - { - if (info->canonical_dynsym != NULL) - { - bfd_release (abfd, info->canonical_dynsym); - info->canonical_dynsym = NULL; - } - return -1; - } - } - - /* Return pointers to the dynamic asymbol structures. */ - for (i = 0; i < info->dynsym_count; i++) - *storage++ = (asymbol *) (info->canonical_dynsym + i); - *storage = NULL; - - return info->dynsym_count; -} - -/* Return the amount of memory required for the dynamic relocs. */ - -static long -sunos_get_dynamic_reloc_upper_bound (abfd) - bfd *abfd; -{ - struct sunos_dynamic_info *info; - - if (! sunos_read_dynamic_info (abfd)) - return -1; - - info = (struct sunos_dynamic_info *) obj_aout_dynamic_info (abfd); - if (! info->valid) - { - bfd_set_error (bfd_error_no_symbols); - return -1; - } - - return (info->dynrel_count + 1) * sizeof (arelent *); -} - -/* Read in the dynamic relocs. */ - -static long -sunos_canonicalize_dynamic_reloc (abfd, storage, syms) - bfd *abfd; - arelent **storage; - asymbol **syms; -{ - struct sunos_dynamic_info *info; - unsigned long i; - - /* Get the general dynamic information. */ - if (obj_aout_dynamic_info (abfd) == (PTR) NULL) - { - if (! sunos_read_dynamic_info (abfd)) - return -1; - } - - info = (struct sunos_dynamic_info *) obj_aout_dynamic_info (abfd); - if (! info->valid) - { - bfd_set_error (bfd_error_no_symbols); - return -1; - } - - /* Get the dynamic reloc information. */ - if (info->dynrel == NULL) - { - info->dynrel = (PTR) bfd_alloc (abfd, - (info->dynrel_count - * obj_reloc_entry_size (abfd))); - if (info->dynrel == NULL && info->dynrel_count != 0) - return -1; - if (bfd_seek (abfd, info->dyninfo.ld_rel, SEEK_SET) != 0 - || (bfd_read ((PTR) info->dynrel, info->dynrel_count, - obj_reloc_entry_size (abfd), abfd) - != info->dynrel_count * obj_reloc_entry_size (abfd))) - { - if (info->dynrel != NULL) - { - bfd_release (abfd, info->dynrel); - info->dynrel = NULL; - } - return -1; - } - } - - /* Get the arelent structures corresponding to the dynamic reloc - information. */ - if (info->canonical_dynrel == (arelent *) NULL) - { - arelent *to; - - info->canonical_dynrel = ((arelent *) - bfd_alloc (abfd, - (info->dynrel_count - * sizeof (arelent)))); - if (info->canonical_dynrel == NULL && info->dynrel_count != 0) - return -1; - - to = info->canonical_dynrel; - - if (obj_reloc_entry_size (abfd) == RELOC_EXT_SIZE) - { - register struct reloc_ext_external *p; - struct reloc_ext_external *pend; - - p = (struct reloc_ext_external *) info->dynrel; - pend = p + info->dynrel_count; - for (; p < pend; p++, to++) - NAME(aout,swap_ext_reloc_in) (abfd, p, to, syms, - info->dynsym_count); - } - else - { - register struct reloc_std_external *p; - struct reloc_std_external *pend; - - p = (struct reloc_std_external *) info->dynrel; - pend = p + info->dynrel_count; - for (; p < pend; p++, to++) - NAME(aout,swap_std_reloc_in) (abfd, p, to, syms, - info->dynsym_count); - } - } - - /* Return pointers to the dynamic arelent structures. */ - for (i = 0; i < info->dynrel_count; i++) - *storage++ = info->canonical_dynrel + i; - *storage = NULL; - - return info->dynrel_count; -} - -/* Code to handle linking of SunOS shared libraries. */ - -/* A SPARC procedure linkage table entry is 12 bytes. The first entry - in the table is a jump which is filled in by the runtime linker. - The remaining entries are branches back to the first entry, - followed by an index into the relocation table encoded to look like - a sethi of %g0. */ - -#define SPARC_PLT_ENTRY_SIZE (12) - -static const bfd_byte sparc_plt_first_entry[SPARC_PLT_ENTRY_SIZE] = -{ - /* sethi %hi(0),%g1; address filled in by runtime linker. */ - 0x3, 0, 0, 0, - /* jmp %g1; offset filled in by runtime linker. */ - 0x81, 0xc0, 0x60, 0, - /* nop */ - 0x1, 0, 0, 0 -}; - -/* save %sp, -96, %sp */ -#define SPARC_PLT_ENTRY_WORD0 0x9de3bfa0 -/* call; address filled in later. */ -#define SPARC_PLT_ENTRY_WORD1 0x40000000 -/* sethi; reloc index filled in later. */ -#define SPARC_PLT_ENTRY_WORD2 0x01000000 - -/* This sequence is used when for the jump table entry to a defined - symbol in a complete executable. It is used when linking PIC - compiled code which is not being put into a shared library. */ -/* sethi <address to be filled in later>, %g1 */ -#define SPARC_PLT_PIC_WORD0 0x03000000 -/* jmp %g1 + <address to be filled in later> */ -#define SPARC_PLT_PIC_WORD1 0x81c06000 -/* nop */ -#define SPARC_PLT_PIC_WORD2 0x01000000 - -/* An m68k procedure linkage table entry is 8 bytes. The first entry - in the table is a jump which is filled in the by the runtime - linker. The remaining entries are branches back to the first - entry, followed by a two byte index into the relocation table. */ - -#define M68K_PLT_ENTRY_SIZE (8) - -static const bfd_byte m68k_plt_first_entry[M68K_PLT_ENTRY_SIZE] = -{ - /* jmps @# */ - 0x4e, 0xf9, - /* Filled in by runtime linker with a magic address. */ - 0, 0, 0, 0, - /* Not used? */ - 0, 0 -}; - -/* bsrl */ -#define M68K_PLT_ENTRY_WORD0 (0x61ff) -/* Remaining words filled in later. */ - -/* An entry in the SunOS linker hash table. */ - -struct sunos_link_hash_entry -{ - struct aout_link_hash_entry root; - - /* If this is a dynamic symbol, this is its index into the dynamic - symbol table. This is initialized to -1. As the linker looks at - the input files, it changes this to -2 if it will be added to the - dynamic symbol table. After all the input files have been seen, - the linker will know whether to build a dynamic symbol table; if - it does build one, this becomes the index into the table. */ - long dynindx; - - /* If this is a dynamic symbol, this is the index of the name in the - dynamic symbol string table. */ - long dynstr_index; - - /* The offset into the global offset table used for this symbol. If - the symbol does not require a GOT entry, this is 0. */ - bfd_vma got_offset; - - /* The offset into the procedure linkage table used for this symbol. - If the symbol does not require a PLT entry, this is 0. */ - bfd_vma plt_offset; - - /* Some linker flags. */ - unsigned char flags; - /* Symbol is referenced by a regular object. */ -#define SUNOS_REF_REGULAR 01 - /* Symbol is defined by a regular object. */ -#define SUNOS_DEF_REGULAR 02 - /* Symbol is referenced by a dynamic object. */ -#define SUNOS_REF_DYNAMIC 04 - /* Symbol is defined by a dynamic object. */ -#define SUNOS_DEF_DYNAMIC 010 - /* Symbol is a constructor symbol in a regular object. */ -#define SUNOS_CONSTRUCTOR 020 -}; - -/* The SunOS linker hash table. */ - -struct sunos_link_hash_table -{ - struct aout_link_hash_table root; - - /* The object which holds the dynamic sections. */ - bfd *dynobj; - - /* Whether we have created the dynamic sections. */ - boolean dynamic_sections_created; - - /* Whether we need the dynamic sections. */ - boolean dynamic_sections_needed; - - /* The number of dynamic symbols. */ - size_t dynsymcount; - - /* The number of buckets in the hash table. */ - size_t bucketcount; - - /* The list of dynamic objects needed by dynamic objects included in - the link. */ - struct bfd_link_needed_list *needed; -}; - -/* Routine to create an entry in an SunOS link hash table. */ - -static struct bfd_hash_entry * -sunos_link_hash_newfunc (entry, table, string) - struct bfd_hash_entry *entry; - struct bfd_hash_table *table; - const char *string; -{ - struct sunos_link_hash_entry *ret = (struct sunos_link_hash_entry *) entry; - - /* Allocate the structure if it has not already been allocated by a - subclass. */ - if (ret == (struct sunos_link_hash_entry *) NULL) - ret = ((struct sunos_link_hash_entry *) - bfd_hash_allocate (table, sizeof (struct sunos_link_hash_entry))); - if (ret == (struct sunos_link_hash_entry *) NULL) - return (struct bfd_hash_entry *) ret; - - /* Call the allocation method of the superclass. */ - ret = ((struct sunos_link_hash_entry *) - NAME(aout,link_hash_newfunc) ((struct bfd_hash_entry *) ret, - table, string)); - if (ret != NULL) - { - /* Set local fields. */ - ret->dynindx = -1; - ret->dynstr_index = -1; - ret->got_offset = 0; - ret->plt_offset = 0; - ret->flags = 0; - } - - return (struct bfd_hash_entry *) ret; -} - -/* Create a SunOS link hash table. */ - -static struct bfd_link_hash_table * -sunos_link_hash_table_create (abfd) - bfd *abfd; -{ - struct sunos_link_hash_table *ret; - - ret = ((struct sunos_link_hash_table *) - bfd_alloc (abfd, sizeof (struct sunos_link_hash_table))); - if (ret == (struct sunos_link_hash_table *) NULL) - return (struct bfd_link_hash_table *) NULL; - if (! NAME(aout,link_hash_table_init) (&ret->root, abfd, - sunos_link_hash_newfunc)) - { - bfd_release (abfd, ret); - return (struct bfd_link_hash_table *) NULL; - } - - ret->dynobj = NULL; - ret->dynamic_sections_created = false; - ret->dynamic_sections_needed = false; - ret->dynsymcount = 0; - ret->bucketcount = 0; - ret->needed = NULL; - - return &ret->root.root; -} - -/* Look up an entry in an SunOS link hash table. */ - -#define sunos_link_hash_lookup(table, string, create, copy, follow) \ - ((struct sunos_link_hash_entry *) \ - aout_link_hash_lookup (&(table)->root, (string), (create), (copy),\ - (follow))) - -/* Traverse a SunOS link hash table. */ - -#define sunos_link_hash_traverse(table, func, info) \ - (aout_link_hash_traverse \ - (&(table)->root, \ - (boolean (*) PARAMS ((struct aout_link_hash_entry *, PTR))) (func), \ - (info))) - -/* Get the SunOS link hash table from the info structure. This is - just a cast. */ - -#define sunos_hash_table(p) ((struct sunos_link_hash_table *) ((p)->hash)) - -static boolean sunos_scan_dynamic_symbol - PARAMS ((struct sunos_link_hash_entry *, PTR)); - -/* Create the dynamic sections needed if we are linking against a - dynamic object, or if we are linking PIC compiled code. ABFD is a - bfd we can attach the dynamic sections to. The linker script will - look for these special sections names and put them in the right - place in the output file. See include/aout/sun4.h for more details - of the dynamic linking information. */ - -static boolean -sunos_create_dynamic_sections (abfd, info, needed) - bfd *abfd; - struct bfd_link_info *info; - boolean needed; -{ - asection *s; - - if (! sunos_hash_table (info)->dynamic_sections_created) - { - flagword flags; - - sunos_hash_table (info)->dynobj = abfd; - - flags = SEC_ALLOC | SEC_LOAD | SEC_HAS_CONTENTS | SEC_IN_MEMORY; - - /* The .dynamic section holds the basic dynamic information: the - sun4_dynamic structure, the dynamic debugger information, and - the sun4_dynamic_link structure. */ - s = bfd_make_section (abfd, ".dynamic"); - if (s == NULL - || ! bfd_set_section_flags (abfd, s, flags) - || ! bfd_set_section_alignment (abfd, s, 2)) - return false; - - /* The .got section holds the global offset table. The address - is put in the ld_got field. */ - s = bfd_make_section (abfd, ".got"); - if (s == NULL - || ! bfd_set_section_flags (abfd, s, flags) - || ! bfd_set_section_alignment (abfd, s, 2)) - return false; - - /* The .plt section holds the procedure linkage table. The - address is put in the ld_plt field. */ - s = bfd_make_section (abfd, ".plt"); - if (s == NULL - || ! bfd_set_section_flags (abfd, s, flags | SEC_CODE) - || ! bfd_set_section_alignment (abfd, s, 2)) - return false; - - /* The .dynrel section holds the dynamic relocs. The address is - put in the ld_rel field. */ - s = bfd_make_section (abfd, ".dynrel"); - if (s == NULL - || ! bfd_set_section_flags (abfd, s, flags | SEC_READONLY) - || ! bfd_set_section_alignment (abfd, s, 2)) - return false; - - /* The .hash section holds the dynamic hash table. The address - is put in the ld_hash field. */ - s = bfd_make_section (abfd, ".hash"); - if (s == NULL - || ! bfd_set_section_flags (abfd, s, flags | SEC_READONLY) - || ! bfd_set_section_alignment (abfd, s, 2)) - return false; - - /* The .dynsym section holds the dynamic symbols. The address - is put in the ld_stab field. */ - s = bfd_make_section (abfd, ".dynsym"); - if (s == NULL - || ! bfd_set_section_flags (abfd, s, flags | SEC_READONLY) - || ! bfd_set_section_alignment (abfd, s, 2)) - return false; - - /* The .dynstr section holds the dynamic symbol string table. - The address is put in the ld_symbols field. */ - s = bfd_make_section (abfd, ".dynstr"); - if (s == NULL - || ! bfd_set_section_flags (abfd, s, flags | SEC_READONLY) - || ! bfd_set_section_alignment (abfd, s, 2)) - return false; - - sunos_hash_table (info)->dynamic_sections_created = true; - } - - if (needed && ! sunos_hash_table (info)->dynamic_sections_needed) - { - bfd *dynobj; - - dynobj = sunos_hash_table (info)->dynobj; - - s = bfd_get_section_by_name (dynobj, ".got"); - s->_raw_size = BYTES_IN_WORD; - - sunos_hash_table (info)->dynamic_sections_needed = true; - } - - return true; -} - -/* Add dynamic symbols during a link. This is called by the a.out - backend linker when it encounters an object with the DYNAMIC flag - set. */ - -static boolean -sunos_add_dynamic_symbols (abfd, info, symsp, sym_countp, stringsp) - bfd *abfd; - struct bfd_link_info *info; - struct external_nlist **symsp; - bfd_size_type *sym_countp; - char **stringsp; -{ - asection *s; - bfd *dynobj; - struct sunos_dynamic_info *dinfo; - unsigned long need; - - /* We do not want to include the sections in a dynamic object in the - output file. We hack by simply clobbering the list of sections - in the BFD. This could be handled more cleanly by, say, a new - section flag; the existing SEC_NEVER_LOAD flag is not the one we - want, because that one still implies that the section takes up - space in the output file. */ - abfd->sections = NULL; - - /* The native linker seems to just ignore dynamic objects when -r is - used. */ - if (info->relocateable) - return true; - - /* There's no hope of using a dynamic object which does not exactly - match the format of the output file. */ - if (info->hash->creator != abfd->xvec) - { - bfd_set_error (bfd_error_invalid_operation); - return false; - } - - /* Make sure we have all the required information. */ - if (! sunos_create_dynamic_sections (abfd, info, true)) - return false; - - /* Make sure we have a .need and a .rules sections. These are only - needed if there really is a dynamic object in the link, so they - are not added by sunos_create_dynamic_sections. */ - dynobj = sunos_hash_table (info)->dynobj; - if (bfd_get_section_by_name (dynobj, ".need") == NULL) - { - /* The .need section holds the list of names of shared objets - which must be included at runtime. The address of this - section is put in the ld_need field. */ - s = bfd_make_section (dynobj, ".need"); - if (s == NULL - || ! bfd_set_section_flags (dynobj, s, - (SEC_ALLOC - | SEC_LOAD - | SEC_HAS_CONTENTS - | SEC_IN_MEMORY - | SEC_READONLY)) - || ! bfd_set_section_alignment (dynobj, s, 2)) - return false; - } - - if (bfd_get_section_by_name (dynobj, ".rules") == NULL) - { - /* The .rules section holds the path to search for shared - objects. The address of this section is put in the ld_rules - field. */ - s = bfd_make_section (dynobj, ".rules"); - if (s == NULL - || ! bfd_set_section_flags (dynobj, s, - (SEC_ALLOC - | SEC_LOAD - | SEC_HAS_CONTENTS - | SEC_IN_MEMORY - | SEC_READONLY)) - || ! bfd_set_section_alignment (dynobj, s, 2)) - return false; - } - - /* Pick up the dynamic symbols and return them to the caller. */ - if (! sunos_slurp_dynamic_symtab (abfd)) - return false; - - dinfo = (struct sunos_dynamic_info *) obj_aout_dynamic_info (abfd); - *symsp = dinfo->dynsym; - *sym_countp = dinfo->dynsym_count; - *stringsp = dinfo->dynstr; - - /* Record information about any other objects needed by this one. */ - need = dinfo->dyninfo.ld_need; - while (need != 0) - { - bfd_byte buf[16]; - unsigned long name, flags; - unsigned short major_vno, minor_vno; - struct bfd_link_needed_list *needed, **pp; - bfd_byte b; - - if (bfd_seek (abfd, need, SEEK_SET) != 0 - || bfd_read (buf, 1, 16, abfd) != 16) - return false; - - /* For the format of an ld_need entry, see aout/sun4.h. We - should probably define structs for this manipulation. */ - - name = bfd_get_32 (abfd, buf); - flags = bfd_get_32 (abfd, buf + 4); - major_vno = bfd_get_16 (abfd, buf + 8); - minor_vno = bfd_get_16 (abfd, buf + 10); - need = bfd_get_32 (abfd, buf + 12); - - needed = (struct bfd_link_needed_list *) bfd_alloc (abfd, sizeof (struct bfd_link_needed_list)); - if (needed == NULL) - return false; - needed->by = abfd; - - /* We return the name as [-l]name[.maj][.min]. */ - - if ((flags & 0x80000000) != 0) - bfd_alloc_grow (abfd, "-l", 2); - if (bfd_seek (abfd, name, SEEK_SET) != 0) - return false; - do - { - if (bfd_read (&b, 1, 1, abfd) != 1) - return false; - bfd_alloc_grow (abfd, &b, 1); - } - while (b != '\0'); - if (major_vno != 0) - { - char verbuf[30]; - - sprintf (verbuf, ".%d", major_vno); - bfd_alloc_grow (abfd, verbuf, strlen (verbuf)); - if (minor_vno != 0) - { - sprintf (verbuf, ".%d", minor_vno); - bfd_alloc_grow (abfd, verbuf, strlen (verbuf)); - } - } - needed->name = bfd_alloc_finish (abfd); - if (needed->name == NULL) - return false; - - needed->next = NULL; - - for (pp = &sunos_hash_table (info)->needed; - *pp != NULL; - pp = &(*pp)->next) - ; - *pp = needed; - } - - return true; -} - -/* Function to add a single symbol to the linker hash table. This is - a wrapper around _bfd_generic_link_add_one_symbol which handles the - tweaking needed for dynamic linking support. */ - -static boolean -sunos_add_one_symbol (info, abfd, name, flags, section, value, string, - copy, collect, hashp) - struct bfd_link_info *info; - bfd *abfd; - const char *name; - flagword flags; - asection *section; - bfd_vma value; - const char *string; - boolean copy; - boolean collect; - struct bfd_link_hash_entry **hashp; -{ - struct sunos_link_hash_entry *h; - int new_flag; - - if (! sunos_hash_table (info)->dynamic_sections_created) - { - /* We must create the dynamic sections while reading the input - files, even though at this point we don't know if any of the - sections will be needed. This will ensure that the dynamic - sections are mapped to the right output section. It does no - harm to create these sections if they are not needed. */ - if (! sunos_create_dynamic_sections (abfd, info, false)) - return false; - } - - if ((flags & (BSF_INDIRECT | BSF_WARNING | BSF_CONSTRUCTOR)) != 0 - || ! bfd_is_und_section (section)) - h = sunos_link_hash_lookup (sunos_hash_table (info), name, true, copy, - false); - else - h = ((struct sunos_link_hash_entry *) - bfd_wrapped_link_hash_lookup (abfd, info, name, true, copy, false)); - if (h == NULL) - return false; - - if (hashp != NULL) - *hashp = (struct bfd_link_hash_entry *) h; - - /* Treat a common symbol in a dynamic object as defined in the .bss - section of the dynamic object. We don't want to allocate space - for it in our process image. */ - if ((abfd->flags & DYNAMIC) != 0 - && bfd_is_com_section (section)) - section = obj_bsssec (abfd); - - if (! bfd_is_und_section (section) - && h->root.root.type != bfd_link_hash_new - && h->root.root.type != bfd_link_hash_undefined - && h->root.root.type != bfd_link_hash_defweak) - { - /* We are defining the symbol, and it is already defined. This - is a potential multiple definition error. */ - if ((abfd->flags & DYNAMIC) != 0) - { - /* The definition we are adding is from a dynamic object. - We do not want this new definition to override the - existing definition, so we pretend it is just a - reference. */ - section = bfd_und_section_ptr; - } - else if (h->root.root.type == bfd_link_hash_defined - && h->root.root.u.def.section->owner != NULL - && (h->root.root.u.def.section->owner->flags & DYNAMIC) != 0) - { - /* The existing definition is from a dynamic object. We - want to override it with the definition we just found. - Clobber the existing definition. */ - h->root.root.type = bfd_link_hash_new; - } - else if (h->root.root.type == bfd_link_hash_common - && (h->root.root.u.c.p->section->owner->flags & DYNAMIC) != 0) - { - /* The existing definition is from a dynamic object. We - want to override it with the definition we just found. - Clobber the existing definition. We can't set it to new, - because it is on the undefined list. */ - h->root.root.type = bfd_link_hash_undefined; - h->root.root.u.undef.abfd = h->root.root.u.c.p->section->owner; - } - } - - if ((abfd->flags & DYNAMIC) != 0 - && abfd->xvec == info->hash->creator - && (h->flags & SUNOS_CONSTRUCTOR) != 0) - { - /* The existing symbol is a constructor symbol, and this symbol - is from a dynamic object. A constructor symbol is actually a - definition, although the type will be bfd_link_hash_undefined - at this point. We want to ignore the definition from the - dynamic object. */ - section = bfd_und_section_ptr; - } - else if ((flags & BSF_CONSTRUCTOR) != 0 - && (abfd->flags & DYNAMIC) == 0 - && h->root.root.type == bfd_link_hash_defined - && h->root.root.u.def.section->owner != NULL - && (h->root.root.u.def.section->owner->flags & DYNAMIC) != 0) - { - /* The existing symbol is defined by a dynamic object, and this - is a constructor symbol. As above, we want to force the use - of the constructor symbol from the regular object. */ - h->root.root.type = bfd_link_hash_new; - } - - /* Do the usual procedure for adding a symbol. */ - if (! _bfd_generic_link_add_one_symbol (info, abfd, name, flags, section, - value, string, copy, collect, - hashp)) - return false; - - if (abfd->xvec == info->hash->creator) - { - /* Set a flag in the hash table entry indicating the type of - reference or definition we just found. Keep a count of the - number of dynamic symbols we find. A dynamic symbol is one - which is referenced or defined by both a regular object and a - shared object. */ - if ((abfd->flags & DYNAMIC) == 0) - { - if (bfd_is_und_section (section)) - new_flag = SUNOS_REF_REGULAR; - else - new_flag = SUNOS_DEF_REGULAR; - } - else - { - if (bfd_is_und_section (section)) - new_flag = SUNOS_REF_DYNAMIC; - else - new_flag = SUNOS_DEF_DYNAMIC; - } - h->flags |= new_flag; - - if (h->dynindx == -1 - && (h->flags & (SUNOS_DEF_REGULAR | SUNOS_REF_REGULAR)) != 0) - { - ++sunos_hash_table (info)->dynsymcount; - h->dynindx = -2; - } - - if ((flags & BSF_CONSTRUCTOR) != 0 - && (abfd->flags & DYNAMIC) == 0) - h->flags |= SUNOS_CONSTRUCTOR; - } - - return true; -} - -/* Return the list of objects needed by BFD. */ - -/*ARGSUSED*/ -struct bfd_link_needed_list * -bfd_sunos_get_needed_list (abfd, info) - bfd *abfd; - struct bfd_link_info *info; -{ - if (info->hash->creator != &MY(vec)) - return NULL; - return sunos_hash_table (info)->needed; -} - -/* Record an assignment made to a symbol by a linker script. We need - this in case some dynamic object refers to this symbol. */ - -boolean -bfd_sunos_record_link_assignment (output_bfd, info, name) - bfd *output_bfd; - struct bfd_link_info *info; - const char *name; -{ - struct sunos_link_hash_entry *h; - - if (output_bfd->xvec != &MY(vec)) - return true; - - /* This is called after we have examined all the input objects. If - the symbol does not exist, it merely means that no object refers - to it, and we can just ignore it at this point. */ - h = sunos_link_hash_lookup (sunos_hash_table (info), name, - false, false, false); - if (h == NULL) - return true; - - /* In a shared library, the __DYNAMIC symbol does not appear in the - dynamic symbol table. */ - if (! info->shared || strcmp (name, "__DYNAMIC") != 0) - { - h->flags |= SUNOS_DEF_REGULAR; - - if (h->dynindx == -1) - { - ++sunos_hash_table (info)->dynsymcount; - h->dynindx = -2; - } - } - - return true; -} - -/* Set up the sizes and contents of the dynamic sections created in - sunos_add_dynamic_symbols. This is called by the SunOS linker - emulation before_allocation routine. We must set the sizes of the - sections before the linker sets the addresses of the various - sections. This unfortunately requires reading all the relocs so - that we can work out which ones need to become dynamic relocs. If - info->keep_memory is true, we keep the relocs in memory; otherwise, - we discard them, and will read them again later. */ - -boolean -bfd_sunos_size_dynamic_sections (output_bfd, info, sdynptr, sneedptr, - srulesptr) - bfd *output_bfd; - struct bfd_link_info *info; - asection **sdynptr; - asection **sneedptr; - asection **srulesptr; -{ - bfd *dynobj; - size_t dynsymcount; - struct sunos_link_hash_entry *h; - asection *s; - size_t bucketcount; - size_t hashalloc; - size_t i; - bfd *sub; - - *sdynptr = NULL; - *sneedptr = NULL; - *srulesptr = NULL; - - if (output_bfd->xvec != &MY(vec)) - return true; - - /* Look through all the input BFD's and read their relocs. It would - be better if we didn't have to do this, but there is no other way - to determine the number of dynamic relocs we need, and, more - importantly, there is no other way to know which symbols should - get an entry in the procedure linkage table. */ - for (sub = info->input_bfds; sub != NULL; sub = sub->link_next) - { - if ((sub->flags & DYNAMIC) == 0 - && sub->xvec == output_bfd->xvec) - { - if (! sunos_scan_relocs (info, sub, obj_textsec (sub), - exec_hdr (sub)->a_trsize) - || ! sunos_scan_relocs (info, sub, obj_datasec (sub), - exec_hdr (sub)->a_drsize)) - return false; - } - } - - dynobj = sunos_hash_table (info)->dynobj; - dynsymcount = sunos_hash_table (info)->dynsymcount; - - /* If there were no dynamic objects in the link, and we don't need - to build a global offset table, there is nothing to do here. */ - if (! sunos_hash_table (info)->dynamic_sections_needed) - return true; - - /* If __GLOBAL_OFFSET_TABLE_ was mentioned, define it. */ - h = sunos_link_hash_lookup (sunos_hash_table (info), - "__GLOBAL_OFFSET_TABLE_", false, false, false); - if (h != NULL && (h->flags & SUNOS_REF_REGULAR) != 0) - { - h->flags |= SUNOS_DEF_REGULAR; - if (h->dynindx == -1) - { - ++sunos_hash_table (info)->dynsymcount; - h->dynindx = -2; - } - h->root.root.type = bfd_link_hash_defined; - h->root.root.u.def.section = bfd_get_section_by_name (dynobj, ".got"); - h->root.root.u.def.value = 0; - } - - /* The .dynamic section is always the same size. */ - s = bfd_get_section_by_name (dynobj, ".dynamic"); - BFD_ASSERT (s != NULL); - s->_raw_size = (sizeof (struct external_sun4_dynamic) - + EXTERNAL_SUN4_DYNAMIC_DEBUGGER_SIZE - + sizeof (struct external_sun4_dynamic_link)); - - /* Set the size of the .dynsym and .hash sections. We counted the - number of dynamic symbols as we read the input files. We will - build the dynamic symbol table (.dynsym) and the hash table - (.hash) when we build the final symbol table, because until then - we do not know the correct value to give the symbols. We build - the dynamic symbol string table (.dynstr) in a traversal of the - symbol table using sunos_scan_dynamic_symbol. */ - s = bfd_get_section_by_name (dynobj, ".dynsym"); - BFD_ASSERT (s != NULL); - s->_raw_size = dynsymcount * sizeof (struct external_nlist); - s->contents = (bfd_byte *) bfd_alloc (output_bfd, s->_raw_size); - if (s->contents == NULL && s->_raw_size != 0) - return false; - - /* The number of buckets is just the number of symbols divided by - four. To compute the final size of the hash table, we must - actually compute the hash table. Normally we need exactly as - many entries in the hash table as there are dynamic symbols, but - if some of the buckets are not used we will need additional - entries. In the worst case, every symbol will hash to the same - bucket, and we will need BUCKETCOUNT - 1 extra entries. */ - if (dynsymcount >= 4) - bucketcount = dynsymcount / 4; - else if (dynsymcount > 0) - bucketcount = dynsymcount; - else - bucketcount = 1; - s = bfd_get_section_by_name (dynobj, ".hash"); - BFD_ASSERT (s != NULL); - hashalloc = (dynsymcount + bucketcount - 1) * HASH_ENTRY_SIZE; - s->contents = (bfd_byte *) bfd_alloc (dynobj, hashalloc); - if (s->contents == NULL && dynsymcount > 0) - return false; - memset (s->contents, 0, hashalloc); - for (i = 0; i < bucketcount; i++) - PUT_WORD (output_bfd, (bfd_vma) -1, s->contents + i * HASH_ENTRY_SIZE); - s->_raw_size = bucketcount * HASH_ENTRY_SIZE; - - sunos_hash_table (info)->bucketcount = bucketcount; - - /* Scan all the symbols, place them in the dynamic symbol table, and - build the dynamic hash table. We reuse dynsymcount as a counter - for the number of symbols we have added so far. */ - sunos_hash_table (info)->dynsymcount = 0; - sunos_link_hash_traverse (sunos_hash_table (info), - sunos_scan_dynamic_symbol, - (PTR) info); - BFD_ASSERT (sunos_hash_table (info)->dynsymcount == dynsymcount); - - /* The SunOS native linker seems to align the total size of the - symbol strings to a multiple of 8. I don't know if this is - important, but it can't hurt much. */ - s = bfd_get_section_by_name (dynobj, ".dynstr"); - BFD_ASSERT (s != NULL); - if ((s->_raw_size & 7) != 0) - { - bfd_size_type add; - bfd_byte *contents; - - add = 8 - (s->_raw_size & 7); - contents = (bfd_byte *) bfd_realloc (s->contents, - (size_t) (s->_raw_size + add)); - if (contents == NULL) - return false; - memset (contents + s->_raw_size, 0, (size_t) add); - s->contents = contents; - s->_raw_size += add; - } - - /* Now that we have worked out the sizes of the procedure linkage - table and the dynamic relocs, allocate storage for them. */ - s = bfd_get_section_by_name (dynobj, ".plt"); - BFD_ASSERT (s != NULL); - if (s->_raw_size != 0) - { - s->contents = (bfd_byte *) bfd_alloc (dynobj, s->_raw_size); - if (s->contents == NULL) - return false; - - /* Fill in the first entry in the table. */ - switch (bfd_get_arch (dynobj)) - { - case bfd_arch_sparc: - memcpy (s->contents, sparc_plt_first_entry, SPARC_PLT_ENTRY_SIZE); - break; - - case bfd_arch_m68k: - memcpy (s->contents, m68k_plt_first_entry, M68K_PLT_ENTRY_SIZE); - break; - - default: - abort (); - } - } - - s = bfd_get_section_by_name (dynobj, ".dynrel"); - if (s->_raw_size != 0) - { - s->contents = (bfd_byte *) bfd_alloc (dynobj, s->_raw_size); - if (s->contents == NULL) - return false; - } - /* We use the reloc_count field to keep track of how many of the - relocs we have output so far. */ - s->reloc_count = 0; - - /* Make space for the global offset table. */ - s = bfd_get_section_by_name (dynobj, ".got"); - s->contents = (bfd_byte *) bfd_alloc (dynobj, s->_raw_size); - if (s->contents == NULL) - return false; - - *sdynptr = bfd_get_section_by_name (dynobj, ".dynamic"); - *sneedptr = bfd_get_section_by_name (dynobj, ".need"); - *srulesptr = bfd_get_section_by_name (dynobj, ".rules"); - - return true; -} - -/* Scan the relocs for an input section. */ - -static boolean -sunos_scan_relocs (info, abfd, sec, rel_size) - struct bfd_link_info *info; - bfd *abfd; - asection *sec; - bfd_size_type rel_size; -{ - PTR relocs; - PTR free_relocs = NULL; - - if (rel_size == 0) - return true; - - if (! info->keep_memory) - relocs = free_relocs = bfd_malloc ((size_t) rel_size); - else - { - struct aout_section_data_struct *n; - - n = ((struct aout_section_data_struct *) - bfd_alloc (abfd, sizeof (struct aout_section_data_struct))); - if (n == NULL) - relocs = NULL; - else - { - set_aout_section_data (sec, n); - relocs = bfd_malloc ((size_t) rel_size); - aout_section_data (sec)->relocs = relocs; - } - } - if (relocs == NULL) - return false; - - if (bfd_seek (abfd, sec->rel_filepos, SEEK_SET) != 0 - || bfd_read (relocs, 1, rel_size, abfd) != rel_size) - goto error_return; - - if (obj_reloc_entry_size (abfd) == RELOC_STD_SIZE) - { - if (! sunos_scan_std_relocs (info, abfd, sec, - (struct reloc_std_external *) relocs, - rel_size)) - goto error_return; - } - else - { - if (! sunos_scan_ext_relocs (info, abfd, sec, - (struct reloc_ext_external *) relocs, - rel_size)) - goto error_return; - } - - if (free_relocs != NULL) - free (free_relocs); - - return true; - - error_return: - if (free_relocs != NULL) - free (free_relocs); - return false; -} - -/* Scan the relocs for an input section using standard relocs. We - need to figure out what to do for each reloc against a dynamic - symbol. If the symbol is in the .text section, an entry is made in - the procedure linkage table. Note that this will do the wrong - thing if the symbol is actually data; I don't think the Sun 3 - native linker handles this case correctly either. If the symbol is - not in the .text section, we must preserve the reloc as a dynamic - reloc. FIXME: We should also handle the PIC relocs here by - building global offset table entries. */ - -static boolean -sunos_scan_std_relocs (info, abfd, sec, relocs, rel_size) - struct bfd_link_info *info; - bfd *abfd; - asection *sec; - const struct reloc_std_external *relocs; - bfd_size_type rel_size; -{ - bfd *dynobj; - asection *splt = NULL; - asection *srel = NULL; - struct sunos_link_hash_entry **sym_hashes; - const struct reloc_std_external *rel, *relend; - - /* We only know how to handle m68k plt entries. */ - if (bfd_get_arch (abfd) != bfd_arch_m68k) - { - bfd_set_error (bfd_error_invalid_target); - return false; - } - - dynobj = NULL; - - sym_hashes = (struct sunos_link_hash_entry **) obj_aout_sym_hashes (abfd); - - relend = relocs + rel_size / RELOC_STD_SIZE; - for (rel = relocs; rel < relend; rel++) - { - int r_index; - struct sunos_link_hash_entry *h; - - /* We only want relocs against external symbols. */ - if (bfd_header_big_endian (abfd)) - { - if ((rel->r_type[0] & RELOC_STD_BITS_EXTERN_BIG) == 0) - continue; - } - else - { - if ((rel->r_type[0] & RELOC_STD_BITS_EXTERN_LITTLE) == 0) - continue; - } - - /* Get the symbol index. */ - if (bfd_header_big_endian (abfd)) - r_index = ((rel->r_index[0] << 16) - | (rel->r_index[1] << 8) - | rel->r_index[2]); - else - r_index = ((rel->r_index[2] << 16) - | (rel->r_index[1] << 8) - | rel->r_index[0]); - - /* Get the hash table entry. */ - h = sym_hashes[r_index]; - if (h == NULL) - { - /* This should not normally happen, but it will in any case - be caught in the relocation phase. */ - continue; - } - - /* At this point common symbols have already been allocated, so - we don't have to worry about them. We need to consider that - we may have already seen this symbol and marked it undefined; - if the symbol is really undefined, then SUNOS_DEF_DYNAMIC - will be zero. */ - if (h->root.root.type != bfd_link_hash_defined - && h->root.root.type != bfd_link_hash_defweak - && h->root.root.type != bfd_link_hash_undefined) - continue; - - if ((h->flags & SUNOS_DEF_DYNAMIC) == 0 - || (h->flags & SUNOS_DEF_REGULAR) != 0) - continue; - - if (dynobj == NULL) - { - if (! sunos_create_dynamic_sections (abfd, info, true)) - return false; - dynobj = sunos_hash_table (info)->dynobj; - splt = bfd_get_section_by_name (dynobj, ".plt"); - srel = bfd_get_section_by_name (dynobj, ".dynrel"); - BFD_ASSERT (splt != NULL && srel != NULL); - } - - BFD_ASSERT ((h->flags & SUNOS_REF_REGULAR) != 0); - BFD_ASSERT (h->plt_offset != 0 - || ((h->root.root.type == bfd_link_hash_defined - || h->root.root.type == bfd_link_hash_defweak) - ? (h->root.root.u.def.section->owner->flags - & DYNAMIC) != 0 - : (h->root.root.u.undef.abfd->flags & DYNAMIC) != 0)); - - /* This reloc is against a symbol defined only by a dynamic - object. */ - - if (h->root.root.type == bfd_link_hash_undefined) - { - /* Presumably this symbol was marked as being undefined by - an earlier reloc. */ - srel->_raw_size += RELOC_STD_SIZE; - } - else if ((h->root.root.u.def.section->flags & SEC_CODE) == 0) - { - bfd *sub; - - /* This reloc is not in the .text section. It must be - copied into the dynamic relocs. We mark the symbol as - being undefined. */ - srel->_raw_size += RELOC_STD_SIZE; - sub = h->root.root.u.def.section->owner; - h->root.root.type = bfd_link_hash_undefined; - h->root.root.u.undef.abfd = sub; - } - else - { - /* This symbol is in the .text section. We must give it an - entry in the procedure linkage table, if we have not - already done so. We change the definition of the symbol - to the .plt section; this will cause relocs against it to - be handled correctly. */ - if (h->plt_offset == 0) - { - if (splt->_raw_size == 0) - splt->_raw_size = M68K_PLT_ENTRY_SIZE; - h->plt_offset = splt->_raw_size; - - if ((h->flags & SUNOS_DEF_REGULAR) == 0) - { - h->root.root.u.def.section = splt; - h->root.root.u.def.value = splt->_raw_size; - } - - splt->_raw_size += M68K_PLT_ENTRY_SIZE; - - /* We may also need a dynamic reloc entry. */ - if ((h->flags & SUNOS_DEF_REGULAR) == 0) - srel->_raw_size += RELOC_STD_SIZE; - } - } - } - - return true; -} - -/* Scan the relocs for an input section using extended relocs. We - need to figure out what to do for each reloc against a dynamic - symbol. If the reloc is a WDISP30, and the symbol is in the .text - section, an entry is made in the procedure linkage table. - Otherwise, we must preserve the reloc as a dynamic reloc. */ - -static boolean -sunos_scan_ext_relocs (info, abfd, sec, relocs, rel_size) - struct bfd_link_info *info; - bfd *abfd; - asection *sec; - const struct reloc_ext_external *relocs; - bfd_size_type rel_size; -{ - bfd *dynobj; - struct sunos_link_hash_entry **sym_hashes; - const struct reloc_ext_external *rel, *relend; - asection *splt = NULL; - asection *sgot = NULL; - asection *srel = NULL; - - /* We only know how to handle SPARC plt entries. */ - if (bfd_get_arch (abfd) != bfd_arch_sparc) - { - bfd_set_error (bfd_error_invalid_target); - return false; - } - - dynobj = NULL; - - sym_hashes = (struct sunos_link_hash_entry **) obj_aout_sym_hashes (abfd); - - relend = relocs + rel_size / RELOC_EXT_SIZE; - for (rel = relocs; rel < relend; rel++) - { - unsigned int r_index; - int r_extern; - int r_type; - struct sunos_link_hash_entry *h = NULL; - - /* Swap in the reloc information. */ - if (bfd_header_big_endian (abfd)) - { - r_index = ((rel->r_index[0] << 16) - | (rel->r_index[1] << 8) - | rel->r_index[2]); - r_extern = (0 != (rel->r_type[0] & RELOC_EXT_BITS_EXTERN_BIG)); - r_type = ((rel->r_type[0] & RELOC_EXT_BITS_TYPE_BIG) - >> RELOC_EXT_BITS_TYPE_SH_BIG); - } - else - { - r_index = ((rel->r_index[2] << 16) - | (rel->r_index[1] << 8) - | rel->r_index[0]); - r_extern = (0 != (rel->r_type[0] & RELOC_EXT_BITS_EXTERN_LITTLE)); - r_type = ((rel->r_type[0] & RELOC_EXT_BITS_TYPE_LITTLE) - >> RELOC_EXT_BITS_TYPE_SH_LITTLE); - } - - if (r_extern) - { - h = sym_hashes[r_index]; - if (h == NULL) - { - /* This should not normally happen, but it will in any - case be caught in the relocation phase. */ - continue; - } - } - - /* If this is a base relative reloc, we need to make an entry in - the .got section. */ - if (r_type == RELOC_BASE10 - || r_type == RELOC_BASE13 - || r_type == RELOC_BASE22) - { - if (dynobj == NULL) - { - if (! sunos_create_dynamic_sections (abfd, info, true)) - return false; - dynobj = sunos_hash_table (info)->dynobj; - splt = bfd_get_section_by_name (dynobj, ".plt"); - sgot = bfd_get_section_by_name (dynobj, ".got"); - srel = bfd_get_section_by_name (dynobj, ".dynrel"); - BFD_ASSERT (splt != NULL && sgot != NULL && srel != NULL); - } - - if (r_extern) - { - if (h->got_offset != 0) - continue; - - h->got_offset = sgot->_raw_size; - } - else - { - if (r_index >= bfd_get_symcount (abfd)) - { - /* This is abnormal, but should be caught in the - relocation phase. */ - continue; - } - - if (adata (abfd).local_got_offsets == NULL) - { - adata (abfd).local_got_offsets = - (bfd_vma *) bfd_zalloc (abfd, - (bfd_get_symcount (abfd) - * sizeof (bfd_vma))); - if (adata (abfd).local_got_offsets == NULL) - return false; - } - - if (adata (abfd).local_got_offsets[r_index] != 0) - continue; - - adata (abfd).local_got_offsets[r_index] = sgot->_raw_size; - } - - sgot->_raw_size += BYTES_IN_WORD; - - /* If we are making a shared library, or if the symbol is - defined by a dynamic object, we will need a dynamic reloc - entry. */ - if (info->shared - || (h != NULL - && (h->flags & SUNOS_DEF_DYNAMIC) != 0 - && (h->flags & SUNOS_DEF_REGULAR) == 0)) - srel->_raw_size += RELOC_EXT_SIZE; - - continue; - } - - /* Otherwise, we are only interested in relocs against symbols - defined in dynamic objects but not in regular objects. We - only need to consider relocs against external symbols. */ - if (! r_extern) - { - /* But, if we are creating a shared library, we need to - generate an absolute reloc. */ - if (info->shared) - { - if (dynobj == NULL) - { - if (! sunos_create_dynamic_sections (abfd, info, true)) - return false; - dynobj = sunos_hash_table (info)->dynobj; - splt = bfd_get_section_by_name (dynobj, ".plt"); - sgot = bfd_get_section_by_name (dynobj, ".got"); - srel = bfd_get_section_by_name (dynobj, ".dynrel"); - BFD_ASSERT (splt != NULL && sgot != NULL && srel != NULL); - } - - srel->_raw_size += RELOC_EXT_SIZE; - } - - continue; - } - - /* At this point common symbols have already been allocated, so - we don't have to worry about them. We need to consider that - we may have already seen this symbol and marked it undefined; - if the symbol is really undefined, then SUNOS_DEF_DYNAMIC - will be zero. */ - if (h->root.root.type != bfd_link_hash_defined - && h->root.root.type != bfd_link_hash_defweak - && h->root.root.type != bfd_link_hash_undefined) - continue; - - if (r_type != RELOC_JMP_TBL - && ! info->shared - && ((h->flags & SUNOS_DEF_DYNAMIC) == 0 - || (h->flags & SUNOS_DEF_REGULAR) != 0)) - continue; - - if (r_type == RELOC_JMP_TBL - && ! info->shared - && (h->flags & SUNOS_DEF_DYNAMIC) == 0 - && (h->flags & SUNOS_DEF_REGULAR) == 0) - { - /* This symbol is apparently undefined. Don't do anything - here; just let the relocation routine report an undefined - symbol. */ - continue; - } - - if (strcmp (h->root.root.root.string, "__GLOBAL_OFFSET_TABLE_") == 0) - continue; - - if (dynobj == NULL) - { - if (! sunos_create_dynamic_sections (abfd, info, true)) - return false; - dynobj = sunos_hash_table (info)->dynobj; - splt = bfd_get_section_by_name (dynobj, ".plt"); - sgot = bfd_get_section_by_name (dynobj, ".got"); - srel = bfd_get_section_by_name (dynobj, ".dynrel"); - BFD_ASSERT (splt != NULL && sgot != NULL && srel != NULL); - } - - BFD_ASSERT (r_type == RELOC_JMP_TBL - || info->shared - || (h->flags & SUNOS_REF_REGULAR) != 0); - BFD_ASSERT (r_type == RELOC_JMP_TBL - || info->shared - || h->plt_offset != 0 - || ((h->root.root.type == bfd_link_hash_defined - || h->root.root.type == bfd_link_hash_defweak) - ? (h->root.root.u.def.section->owner->flags - & DYNAMIC) != 0 - : (h->root.root.u.undef.abfd->flags & DYNAMIC) != 0)); - - /* This reloc is against a symbol defined only by a dynamic - object, or it is a jump table reloc from PIC compiled code. */ - - if (r_type != RELOC_JMP_TBL - && h->root.root.type == bfd_link_hash_undefined) - { - /* Presumably this symbol was marked as being undefined by - an earlier reloc. */ - srel->_raw_size += RELOC_EXT_SIZE; - } - else if (r_type != RELOC_JMP_TBL - && (h->root.root.u.def.section->flags & SEC_CODE) == 0) - { - bfd *sub; - - /* This reloc is not in the .text section. It must be - copied into the dynamic relocs. We mark the symbol as - being undefined. */ - srel->_raw_size += RELOC_EXT_SIZE; - if ((h->flags & SUNOS_DEF_REGULAR) == 0) - { - sub = h->root.root.u.def.section->owner; - h->root.root.type = bfd_link_hash_undefined; - h->root.root.u.undef.abfd = sub; - } - } - else - { - /* This symbol is in the .text section. We must give it an - entry in the procedure linkage table, if we have not - already done so. We change the definition of the symbol - to the .plt section; this will cause relocs against it to - be handled correctly. */ - if (h->plt_offset == 0) - { - if (splt->_raw_size == 0) - splt->_raw_size = SPARC_PLT_ENTRY_SIZE; - h->plt_offset = splt->_raw_size; - - if ((h->flags & SUNOS_DEF_REGULAR) == 0) - { - if (h->root.root.type == bfd_link_hash_undefined) - h->root.root.type = bfd_link_hash_defined; - h->root.root.u.def.section = splt; - h->root.root.u.def.value = splt->_raw_size; - } - - splt->_raw_size += SPARC_PLT_ENTRY_SIZE; - - /* We will also need a dynamic reloc entry, unless this - is a JMP_TBL reloc produced by linking PIC compiled - code, and we are not making a shared library. */ - if (info->shared || (h->flags & SUNOS_DEF_REGULAR) == 0) - srel->_raw_size += RELOC_EXT_SIZE; - } - - /* If we are creating a shared library, we need to copy over - any reloc other than a jump table reloc. */ - if (info->shared && r_type != RELOC_JMP_TBL) - srel->_raw_size += RELOC_EXT_SIZE; - } - } - - return true; -} - -/* Build the hash table of dynamic symbols, and to mark as written all - symbols from dynamic objects which we do not plan to write out. */ - -static boolean -sunos_scan_dynamic_symbol (h, data) - struct sunos_link_hash_entry *h; - PTR data; -{ - struct bfd_link_info *info = (struct bfd_link_info *) data; - - /* Set the written flag for symbols we do not want to write out as - part of the regular symbol table. This is all symbols which are - not defined in a regular object file. For some reason symbols - which are referenced by a regular object and defined by a dynamic - object do not seem to show up in the regular symbol table. It is - possible for a symbol to have only SUNOS_REF_REGULAR set here, it - is an undefined symbol which was turned into a common symbol - because it was found in an archive object which was not included - in the link. */ - if ((h->flags & SUNOS_DEF_REGULAR) == 0 - && (h->flags & SUNOS_DEF_DYNAMIC) != 0 - && strcmp (h->root.root.root.string, "__DYNAMIC") != 0) - h->root.written = true; - - /* If this symbol is defined by a dynamic object and referenced by a - regular object, see whether we gave it a reasonable value while - scanning the relocs. */ - - if ((h->flags & SUNOS_DEF_REGULAR) == 0 - && (h->flags & SUNOS_DEF_DYNAMIC) != 0 - && (h->flags & SUNOS_REF_REGULAR) != 0) - { - if ((h->root.root.type == bfd_link_hash_defined - || h->root.root.type == bfd_link_hash_defweak) - && ((h->root.root.u.def.section->owner->flags & DYNAMIC) != 0) - && h->root.root.u.def.section->output_section == NULL) - { - bfd *sub; - - /* This symbol is currently defined in a dynamic section - which is not being put into the output file. This - implies that there is no reloc against the symbol. I'm - not sure why this case would ever occur. In any case, we - change the symbol to be undefined. */ - sub = h->root.root.u.def.section->owner; - h->root.root.type = bfd_link_hash_undefined; - h->root.root.u.undef.abfd = sub; - } - } - - /* If this symbol is defined or referenced by a regular file, add it - to the dynamic symbols. */ - if ((h->flags & (SUNOS_DEF_REGULAR | SUNOS_REF_REGULAR)) != 0) - { - asection *s; - size_t len; - bfd_byte *contents; - unsigned char *name; - unsigned long hash; - bfd *dynobj; - - BFD_ASSERT (h->dynindx == -2); - - dynobj = sunos_hash_table (info)->dynobj; - - h->dynindx = sunos_hash_table (info)->dynsymcount; - ++sunos_hash_table (info)->dynsymcount; - - len = strlen (h->root.root.root.string); - - /* We don't bother to construct a BFD hash table for the strings - which are the names of the dynamic symbols. Using a hash - table for the regular symbols is beneficial, because the - regular symbols includes the debugging symbols, which have - long names and are often duplicated in several object files. - There are no debugging symbols in the dynamic symbols. */ - s = bfd_get_section_by_name (dynobj, ".dynstr"); - BFD_ASSERT (s != NULL); - contents = (bfd_byte *) bfd_realloc (s->contents, - s->_raw_size + len + 1); - if (contents == NULL) - return false; - s->contents = contents; - - h->dynstr_index = s->_raw_size; - strcpy (contents + s->_raw_size, h->root.root.root.string); - s->_raw_size += len + 1; - - /* Add it to the dynamic hash table. */ - name = (unsigned char *) h->root.root.root.string; - hash = 0; - while (*name != '\0') - hash = (hash << 1) + *name++; - hash &= 0x7fffffff; - hash %= sunos_hash_table (info)->bucketcount; - - s = bfd_get_section_by_name (dynobj, ".hash"); - BFD_ASSERT (s != NULL); - - if (GET_SWORD (dynobj, s->contents + hash * HASH_ENTRY_SIZE) == -1) - PUT_WORD (dynobj, h->dynindx, s->contents + hash * HASH_ENTRY_SIZE); - else - { - bfd_vma next; - - next = GET_WORD (dynobj, - (s->contents - + hash * HASH_ENTRY_SIZE - + BYTES_IN_WORD)); - PUT_WORD (dynobj, s->_raw_size / HASH_ENTRY_SIZE, - s->contents + hash * HASH_ENTRY_SIZE + BYTES_IN_WORD); - PUT_WORD (dynobj, h->dynindx, s->contents + s->_raw_size); - PUT_WORD (dynobj, next, s->contents + s->_raw_size + BYTES_IN_WORD); - s->_raw_size += HASH_ENTRY_SIZE; - } - } - - return true; -} - -/* Link a dynamic object. We actually don't have anything to do at - this point. This entry point exists to prevent the regular linker - code from doing anything with the object. */ - -/*ARGSUSED*/ -static boolean -sunos_link_dynamic_object (info, abfd) - struct bfd_link_info *info; - bfd *abfd; -{ - return true; -} - -/* Write out a dynamic symbol. This is called by the final traversal - over the symbol table. */ - -static boolean -sunos_write_dynamic_symbol (output_bfd, info, harg) - bfd *output_bfd; - struct bfd_link_info *info; - struct aout_link_hash_entry *harg; -{ - struct sunos_link_hash_entry *h = (struct sunos_link_hash_entry *) harg; - int type; - bfd_vma val; - asection *s; - struct external_nlist *outsym; - - if (h->dynindx < 0) - return true; - - switch (h->root.root.type) - { - default: - case bfd_link_hash_new: - abort (); - /* Avoid variable not initialized warnings. */ - return true; - case bfd_link_hash_undefined: - type = N_UNDF | N_EXT; - val = 0; - break; - case bfd_link_hash_defined: - case bfd_link_hash_defweak: - { - asection *sec; - asection *output_section; - - sec = h->root.root.u.def.section; - output_section = sec->output_section; - BFD_ASSERT (bfd_is_abs_section (output_section) - || output_section->owner == output_bfd); - if (h->plt_offset != 0 - && (h->flags & SUNOS_DEF_REGULAR) == 0) - { - type = N_UNDF | N_EXT; - val = 0; - } - else - { - if (output_section == obj_textsec (output_bfd)) - type = (h->root.root.type == bfd_link_hash_defined - ? N_TEXT - : N_WEAKT); - else if (output_section == obj_datasec (output_bfd)) - type = (h->root.root.type == bfd_link_hash_defined - ? N_DATA - : N_WEAKD); - else if (output_section == obj_bsssec (output_bfd)) - type = (h->root.root.type == bfd_link_hash_defined - ? N_BSS - : N_WEAKB); - else - type = (h->root.root.type == bfd_link_hash_defined - ? N_ABS - : N_WEAKA); - type |= N_EXT; - val = (h->root.root.u.def.value - + output_section->vma - + sec->output_offset); - } - } - break; - case bfd_link_hash_common: - type = N_UNDF | N_EXT; - val = h->root.root.u.c.size; - break; - case bfd_link_hash_undefweak: - type = N_WEAKU; - val = 0; - break; - case bfd_link_hash_indirect: - case bfd_link_hash_warning: - /* FIXME: Ignore these for now. The circumstances under which - they should be written out are not clear to me. */ - return true; - } - - s = bfd_get_section_by_name (sunos_hash_table (info)->dynobj, ".dynsym"); - BFD_ASSERT (s != NULL); - outsym = ((struct external_nlist *) - (s->contents + h->dynindx * EXTERNAL_NLIST_SIZE)); - - bfd_h_put_8 (output_bfd, type, outsym->e_type); - bfd_h_put_8 (output_bfd, 0, outsym->e_other); - - /* FIXME: The native linker doesn't use 0 for desc. It seems to use - one less than the desc value in the shared library, although that - seems unlikely. */ - bfd_h_put_16 (output_bfd, 0, outsym->e_desc); - - PUT_WORD (output_bfd, h->dynstr_index, outsym->e_strx); - PUT_WORD (output_bfd, val, outsym->e_value); - - /* If this symbol is in the procedure linkage table, fill in the - table entry. */ - if (h->plt_offset != 0) - { - bfd *dynobj; - asection *splt; - bfd_byte *p; - asection *s; - bfd_vma r_address; - - dynobj = sunos_hash_table (info)->dynobj; - splt = bfd_get_section_by_name (dynobj, ".plt"); - p = splt->contents + h->plt_offset; - - s = bfd_get_section_by_name (dynobj, ".dynrel"); - - r_address = (splt->output_section->vma - + splt->output_offset - + h->plt_offset); - - switch (bfd_get_arch (output_bfd)) - { - case bfd_arch_sparc: - if (info->shared || (h->flags & SUNOS_DEF_REGULAR) == 0) - { - bfd_put_32 (output_bfd, SPARC_PLT_ENTRY_WORD0, p); - bfd_put_32 (output_bfd, - (SPARC_PLT_ENTRY_WORD1 - + (((- (h->plt_offset + 4) >> 2) - & 0x3fffffff))), - p + 4); - bfd_put_32 (output_bfd, SPARC_PLT_ENTRY_WORD2 + s->reloc_count, - p + 8); - } - else - { - bfd_vma val; - - val = (h->root.root.u.def.section->output_section->vma - + h->root.root.u.def.section->output_offset - + h->root.root.u.def.value); - bfd_put_32 (output_bfd, - SPARC_PLT_PIC_WORD0 + ((val >> 10) & 0x3fffff), - p); - bfd_put_32 (output_bfd, - SPARC_PLT_PIC_WORD1 + (val & 0x3ff), - p + 4); - bfd_put_32 (output_bfd, SPARC_PLT_PIC_WORD2, p + 8); - } - break; - - case bfd_arch_m68k: - if (! info->shared && (h->flags & SUNOS_DEF_REGULAR) != 0) - abort (); - bfd_put_16 (output_bfd, M68K_PLT_ENTRY_WORD0, p); - bfd_put_32 (output_bfd, (- (h->plt_offset + 2)), p + 2); - bfd_put_16 (output_bfd, s->reloc_count, p + 6); - r_address += 2; - break; - - default: - abort (); - } - - /* We also need to add a jump table reloc, unless this is the - result of a JMP_TBL reloc from PIC compiled code. */ - if (info->shared || (h->flags & SUNOS_DEF_REGULAR) == 0) - { - BFD_ASSERT (s->reloc_count * obj_reloc_entry_size (dynobj) - < s->_raw_size); - p = s->contents + s->reloc_count * obj_reloc_entry_size (output_bfd); - if (obj_reloc_entry_size (output_bfd) == RELOC_STD_SIZE) - { - struct reloc_std_external *srel; - - srel = (struct reloc_std_external *) p; - PUT_WORD (output_bfd, r_address, srel->r_address); - if (bfd_header_big_endian (output_bfd)) - { - srel->r_index[0] = h->dynindx >> 16; - srel->r_index[1] = h->dynindx >> 8; - srel->r_index[2] = h->dynindx; - srel->r_type[0] = (RELOC_STD_BITS_EXTERN_BIG - | RELOC_STD_BITS_JMPTABLE_BIG); - } - else - { - srel->r_index[2] = h->dynindx >> 16; - srel->r_index[1] = h->dynindx >> 8; - srel->r_index[0] = h->dynindx; - srel->r_type[0] = (RELOC_STD_BITS_EXTERN_LITTLE - | RELOC_STD_BITS_JMPTABLE_LITTLE); - } - } - else - { - struct reloc_ext_external *erel; - - erel = (struct reloc_ext_external *) p; - PUT_WORD (output_bfd, r_address, erel->r_address); - if (bfd_header_big_endian (output_bfd)) - { - erel->r_index[0] = h->dynindx >> 16; - erel->r_index[1] = h->dynindx >> 8; - erel->r_index[2] = h->dynindx; - erel->r_type[0] = - (RELOC_EXT_BITS_EXTERN_BIG - | (RELOC_JMP_SLOT << RELOC_EXT_BITS_TYPE_SH_BIG)); - } - else - { - erel->r_index[2] = h->dynindx >> 16; - erel->r_index[1] = h->dynindx >> 8; - erel->r_index[0] = h->dynindx; - erel->r_type[0] = - (RELOC_EXT_BITS_EXTERN_LITTLE - | (RELOC_JMP_SLOT << RELOC_EXT_BITS_TYPE_SH_LITTLE)); - } - PUT_WORD (output_bfd, (bfd_vma) 0, erel->r_addend); - } - - ++s->reloc_count; - } - } - - return true; -} - -/* This is called for each reloc against an external symbol. If this - is a reloc which are are going to copy as a dynamic reloc, then - copy it over, and tell the caller to not bother processing this - reloc. */ - -/*ARGSUSED*/ -static boolean -sunos_check_dynamic_reloc (info, input_bfd, input_section, harg, reloc, - contents, skip, relocationp) - struct bfd_link_info *info; - bfd *input_bfd; - asection *input_section; - struct aout_link_hash_entry *harg; - PTR reloc; - bfd_byte *contents; - boolean *skip; - bfd_vma *relocationp; -{ - struct sunos_link_hash_entry *h = (struct sunos_link_hash_entry *) harg; - bfd *dynobj; - boolean baserel; - boolean jmptbl; - asection *s; - bfd_byte *p; - long indx; - - *skip = false; - - dynobj = sunos_hash_table (info)->dynobj; - - if (h != NULL && h->plt_offset != 0) - { - asection *splt; - - /* Redirect the relocation to the PLT entry. */ - splt = bfd_get_section_by_name (dynobj, ".plt"); - *relocationp = (splt->output_section->vma - + splt->output_offset - + h->plt_offset); - } - - if (obj_reloc_entry_size (input_bfd) == RELOC_STD_SIZE) - { - struct reloc_std_external *srel; - - srel = (struct reloc_std_external *) reloc; - if (bfd_header_big_endian (input_bfd)) - { - baserel = (0 != (srel->r_type[0] & RELOC_STD_BITS_BASEREL_BIG)); - jmptbl = (0 != (srel->r_type[0] & RELOC_STD_BITS_JMPTABLE_BIG)); - } - else - { - baserel = (0 != (srel->r_type[0] & RELOC_STD_BITS_BASEREL_LITTLE)); - jmptbl = (0 != (srel->r_type[0] & RELOC_STD_BITS_JMPTABLE_LITTLE)); - } - } - else - { - struct reloc_ext_external *erel; - int r_type; - - erel = (struct reloc_ext_external *) reloc; - if (bfd_header_big_endian (input_bfd)) - r_type = ((erel->r_type[0] & RELOC_EXT_BITS_TYPE_BIG) - >> RELOC_EXT_BITS_TYPE_SH_BIG); - else - r_type = ((erel->r_type[0] & RELOC_EXT_BITS_TYPE_LITTLE) - >> RELOC_EXT_BITS_TYPE_SH_LITTLE); - baserel = (r_type == RELOC_BASE10 - || r_type == RELOC_BASE13 - || r_type == RELOC_BASE22); - jmptbl = r_type == RELOC_JMP_TBL; - } - - if (baserel) - { - bfd_vma *got_offsetp; - asection *sgot; - - if (h != NULL) - got_offsetp = &h->got_offset; - else if (adata (input_bfd).local_got_offsets == NULL) - got_offsetp = NULL; - else - { - struct reloc_std_external *srel; - int r_index; - - srel = (struct reloc_std_external *) reloc; - if (obj_reloc_entry_size (input_bfd) == RELOC_STD_SIZE) - { - if (bfd_header_big_endian (input_bfd)) - r_index = ((srel->r_index[0] << 16) - | (srel->r_index[1] << 8) - | srel->r_index[2]); - else - r_index = ((srel->r_index[2] << 16) - | (srel->r_index[1] << 8) - | srel->r_index[0]); - } - else - { - struct reloc_ext_external *erel; - - erel = (struct reloc_ext_external *) reloc; - if (bfd_header_big_endian (input_bfd)) - r_index = ((erel->r_index[0] << 16) - | (erel->r_index[1] << 8) - | erel->r_index[2]); - else - r_index = ((erel->r_index[2] << 16) - | (erel->r_index[1] << 8) - | erel->r_index[0]); - } - - got_offsetp = adata (input_bfd).local_got_offsets + r_index; - } - - BFD_ASSERT (got_offsetp != NULL && *got_offsetp != 0); - - sgot = bfd_get_section_by_name (dynobj, ".got"); - - /* We set the least significant bit to indicate whether we have - already initialized the GOT entry. */ - if ((*got_offsetp & 1) == 0) - { - if (h == NULL - || (! info->shared - && ((h->flags & SUNOS_DEF_DYNAMIC) == 0 - || (h->flags & SUNOS_DEF_REGULAR) != 0))) - PUT_WORD (dynobj, *relocationp, sgot->contents + *got_offsetp); - else - PUT_WORD (dynobj, 0, sgot->contents + *got_offsetp); - - if (info->shared - || (h != NULL - && (h->flags & SUNOS_DEF_DYNAMIC) != 0 - && (h->flags & SUNOS_DEF_REGULAR) == 0)) - { - /* We need to create a GLOB_DAT or 32 reloc to tell the - dynamic linker to fill in this entry in the table. */ - - s = bfd_get_section_by_name (dynobj, ".dynrel"); - BFD_ASSERT (s != NULL); - BFD_ASSERT (s->reloc_count * obj_reloc_entry_size (dynobj) - < s->_raw_size); - - p = (s->contents - + s->reloc_count * obj_reloc_entry_size (dynobj)); - - if (h != NULL) - indx = h->dynindx; - else - indx = 0; - - if (obj_reloc_entry_size (dynobj) == RELOC_STD_SIZE) - { - struct reloc_std_external *srel; - - srel = (struct reloc_std_external *) p; - PUT_WORD (dynobj, - (*got_offsetp - + sgot->output_section->vma - + sgot->output_offset), - srel->r_address); - if (bfd_header_big_endian (dynobj)) - { - srel->r_index[0] = indx >> 16; - srel->r_index[1] = indx >> 8; - srel->r_index[2] = indx; - if (h == NULL) - srel->r_type[0] = 2 << RELOC_STD_BITS_LENGTH_SH_BIG; - else - srel->r_type[0] = - (RELOC_STD_BITS_EXTERN_BIG - | RELOC_STD_BITS_BASEREL_BIG - | RELOC_STD_BITS_RELATIVE_BIG - | (2 << RELOC_STD_BITS_LENGTH_SH_BIG)); - } - else - { - srel->r_index[2] = indx >> 16; - srel->r_index[1] = indx >> 8; - srel->r_index[0] = indx; - if (h == NULL) - srel->r_type[0] = 2 << RELOC_STD_BITS_LENGTH_SH_LITTLE; - else - srel->r_type[0] = - (RELOC_STD_BITS_EXTERN_LITTLE - | RELOC_STD_BITS_BASEREL_LITTLE - | RELOC_STD_BITS_RELATIVE_LITTLE - | (2 << RELOC_STD_BITS_LENGTH_SH_LITTLE)); - } - } - else - { - struct reloc_ext_external *erel; - - erel = (struct reloc_ext_external *) p; - PUT_WORD (dynobj, - (*got_offsetp - + sgot->output_section->vma - + sgot->output_offset), - erel->r_address); - if (bfd_header_big_endian (dynobj)) - { - erel->r_index[0] = indx >> 16; - erel->r_index[1] = indx >> 8; - erel->r_index[2] = indx; - if (h == NULL) - erel->r_type[0] = - RELOC_32 << RELOC_EXT_BITS_TYPE_SH_BIG; - else - erel->r_type[0] = - (RELOC_EXT_BITS_EXTERN_BIG - | (RELOC_GLOB_DAT << RELOC_EXT_BITS_TYPE_SH_BIG)); - } - else - { - erel->r_index[2] = indx >> 16; - erel->r_index[1] = indx >> 8; - erel->r_index[0] = indx; - if (h == NULL) - erel->r_type[0] = - RELOC_32 << RELOC_EXT_BITS_TYPE_SH_LITTLE; - else - erel->r_type[0] = - (RELOC_EXT_BITS_EXTERN_LITTLE - | (RELOC_GLOB_DAT - << RELOC_EXT_BITS_TYPE_SH_LITTLE)); - } - PUT_WORD (dynobj, 0, erel->r_addend); - } - - ++s->reloc_count; - } - - *got_offsetp |= 1; - } - - *relocationp = sgot->vma + (*got_offsetp &~ 1); - - /* There is nothing else to do for a base relative reloc. */ - return true; - } - - if (! sunos_hash_table (info)->dynamic_sections_needed) - return true; - if (! info->shared) - { - if (h == NULL - || h->dynindx == -1 - || h->root.root.type != bfd_link_hash_undefined - || (h->flags & SUNOS_DEF_REGULAR) != 0 - || (h->flags & SUNOS_DEF_DYNAMIC) == 0 - || (h->root.root.u.undef.abfd->flags & DYNAMIC) == 0) - return true; - } - else - { - if (h != NULL - && (h->dynindx == -1 - || jmptbl - || strcmp (h->root.root.root.string, - "__GLOBAL_OFFSET_TABLE_") == 0)) - return true; - } - - /* It looks like this is a reloc we are supposed to copy. */ - - s = bfd_get_section_by_name (dynobj, ".dynrel"); - BFD_ASSERT (s != NULL); - BFD_ASSERT (s->reloc_count * obj_reloc_entry_size (dynobj) < s->_raw_size); - - p = s->contents + s->reloc_count * obj_reloc_entry_size (dynobj); - - /* Copy the reloc over. */ - memcpy (p, reloc, obj_reloc_entry_size (dynobj)); - - if (h != NULL) - indx = h->dynindx; - else - indx = 0; - - /* Adjust the address and symbol index. */ - if (obj_reloc_entry_size (dynobj) == RELOC_STD_SIZE) - { - struct reloc_std_external *srel; - - srel = (struct reloc_std_external *) p; - PUT_WORD (dynobj, - (GET_WORD (dynobj, srel->r_address) - + input_section->output_section->vma - + input_section->output_offset), - srel->r_address); - if (bfd_header_big_endian (dynobj)) - { - srel->r_index[0] = indx >> 16; - srel->r_index[1] = indx >> 8; - srel->r_index[2] = indx; - } - else - { - srel->r_index[2] = indx >> 16; - srel->r_index[1] = indx >> 8; - srel->r_index[0] = indx; - } - } - else - { - struct reloc_ext_external *erel; - - erel = (struct reloc_ext_external *) p; - PUT_WORD (dynobj, - (GET_WORD (dynobj, erel->r_address) - + input_section->output_section->vma - + input_section->output_offset), - erel->r_address); - if (bfd_header_big_endian (dynobj)) - { - erel->r_index[0] = indx >> 16; - erel->r_index[1] = indx >> 8; - erel->r_index[2] = indx; - } - else - { - erel->r_index[2] = indx >> 16; - erel->r_index[1] = indx >> 8; - erel->r_index[0] = indx; - } - } - - ++s->reloc_count; - - if (h != NULL) - *skip = true; - - return true; -} - -/* Finish up the dynamic linking information. */ - -static boolean -sunos_finish_dynamic_link (abfd, info) - bfd *abfd; - struct bfd_link_info *info; -{ - bfd *dynobj; - asection *o; - asection *s; - asection *sdyn; - struct external_sun4_dynamic esd; - struct external_sun4_dynamic_link esdl; - - if (! sunos_hash_table (info)->dynamic_sections_needed) - return true; - - dynobj = sunos_hash_table (info)->dynobj; - - sdyn = bfd_get_section_by_name (dynobj, ".dynamic"); - BFD_ASSERT (sdyn != NULL); - - /* Finish up the .need section. The linker emulation code filled it - in, but with offsets from the start of the section instead of - real addresses. Now that we know the section location, we can - fill in the final values. */ - s = bfd_get_section_by_name (dynobj, ".need"); - if (s != NULL && s->_raw_size != 0) - { - file_ptr filepos; - bfd_byte *p; - - filepos = s->output_section->filepos + s->output_offset; - p = s->contents; - while (1) - { - bfd_vma val; - - PUT_WORD (dynobj, GET_WORD (dynobj, p) + filepos, p); - val = GET_WORD (dynobj, p + 12); - if (val == 0) - break; - PUT_WORD (dynobj, val + filepos, p + 12); - p += 16; - } - } - - /* The first entry in the .got section is the address of the - dynamic information, unless this is a shared library. */ - s = bfd_get_section_by_name (dynobj, ".got"); - BFD_ASSERT (s != NULL); - if (info->shared) - PUT_WORD (dynobj, 0, s->contents); - else - PUT_WORD (dynobj, sdyn->output_section->vma + sdyn->output_offset, - s->contents); - - for (o = dynobj->sections; o != NULL; o = o->next) - { - if ((o->flags & SEC_HAS_CONTENTS) != 0 - && o->contents != NULL) - { - BFD_ASSERT (o->output_section != NULL - && o->output_section->owner == abfd); - if (! bfd_set_section_contents (abfd, o->output_section, - o->contents, o->output_offset, - o->_raw_size)) - return false; - } - } - - /* Finish up the dynamic link information. */ - PUT_WORD (dynobj, (bfd_vma) 3, esd.ld_version); - PUT_WORD (dynobj, - sdyn->output_section->vma + sdyn->output_offset + sizeof esd, - esd.ldd); - PUT_WORD (dynobj, - (sdyn->output_section->vma - + sdyn->output_offset - + sizeof esd - + EXTERNAL_SUN4_DYNAMIC_DEBUGGER_SIZE), - esd.ld); - - if (! bfd_set_section_contents (abfd, sdyn->output_section, &esd, - sdyn->output_offset, sizeof esd)) - return false; - - - PUT_WORD (dynobj, (bfd_vma) 0, esdl.ld_loaded); - - s = bfd_get_section_by_name (dynobj, ".need"); - if (s == NULL || s->_raw_size == 0) - PUT_WORD (dynobj, (bfd_vma) 0, esdl.ld_need); - else - PUT_WORD (dynobj, s->output_section->filepos + s->output_offset, - esdl.ld_need); - - s = bfd_get_section_by_name (dynobj, ".rules"); - if (s == NULL || s->_raw_size == 0) - PUT_WORD (dynobj, (bfd_vma) 0, esdl.ld_rules); - else - PUT_WORD (dynobj, s->output_section->filepos + s->output_offset, - esdl.ld_rules); - - s = bfd_get_section_by_name (dynobj, ".got"); - BFD_ASSERT (s != NULL); - PUT_WORD (dynobj, s->output_section->vma + s->output_offset, esdl.ld_got); - - s = bfd_get_section_by_name (dynobj, ".plt"); - BFD_ASSERT (s != NULL); - PUT_WORD (dynobj, s->output_section->vma + s->output_offset, esdl.ld_plt); - PUT_WORD (dynobj, s->_raw_size, esdl.ld_plt_sz); - - s = bfd_get_section_by_name (dynobj, ".dynrel"); - BFD_ASSERT (s != NULL); - BFD_ASSERT (s->reloc_count * obj_reloc_entry_size (dynobj) == s->_raw_size); - PUT_WORD (dynobj, s->output_section->filepos + s->output_offset, - esdl.ld_rel); - - s = bfd_get_section_by_name (dynobj, ".hash"); - BFD_ASSERT (s != NULL); - PUT_WORD (dynobj, s->output_section->filepos + s->output_offset, - esdl.ld_hash); - - s = bfd_get_section_by_name (dynobj, ".dynsym"); - BFD_ASSERT (s != NULL); - PUT_WORD (dynobj, s->output_section->filepos + s->output_offset, - esdl.ld_stab); - - PUT_WORD (dynobj, (bfd_vma) 0, esdl.ld_stab_hash); - - PUT_WORD (dynobj, (bfd_vma) sunos_hash_table (info)->bucketcount, - esdl.ld_buckets); - - s = bfd_get_section_by_name (dynobj, ".dynstr"); - BFD_ASSERT (s != NULL); - PUT_WORD (dynobj, s->output_section->filepos + s->output_offset, - esdl.ld_symbols); - PUT_WORD (dynobj, s->_raw_size, esdl.ld_symb_size); - - /* The size of the text area is the size of the .text section - rounded up to a page boundary. FIXME: Should the page size be - conditional on something? */ - PUT_WORD (dynobj, - BFD_ALIGN (obj_textsec (abfd)->_raw_size, 0x2000), - esdl.ld_text); - - if (! bfd_set_section_contents (abfd, sdyn->output_section, &esdl, - (sdyn->output_offset - + sizeof esd - + EXTERNAL_SUN4_DYNAMIC_DEBUGGER_SIZE), - sizeof esdl)) - return false; - - abfd->flags |= DYNAMIC; - - return true; -} diff --git a/contrib/gdb/bfd/syms.c b/contrib/gdb/bfd/syms.c deleted file mode 100644 index e3007e4c5f011..0000000000000 --- a/contrib/gdb/bfd/syms.c +++ /dev/null @@ -1,1084 +0,0 @@ -/* Generic symbol-table support for the BFD library. - Copyright (C) 1990, 91, 92, 93, 94, 95, 1996 Free Software Foundation, Inc. - Written by Cygnus Support. - -This file is part of BFD, the Binary File Descriptor library. - -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 2 of the License, 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ - -/* -SECTION - Symbols - - BFD tries to maintain as much symbol information as it can when - it moves information from file to file. BFD passes information - to applications though the <<asymbol>> structure. When the - application requests the symbol table, BFD reads the table in - the native form and translates parts of it into the internal - format. To maintain more than the information passed to - applications, some targets keep some information ``behind the - scenes'' in a structure only the particular back end knows - about. For example, the coff back end keeps the original - symbol table structure as well as the canonical structure when - a BFD is read in. On output, the coff back end can reconstruct - the output symbol table so that no information is lost, even - information unique to coff which BFD doesn't know or - understand. If a coff symbol table were read, but were written - through an a.out back end, all the coff specific information - would be lost. The symbol table of a BFD - is not necessarily read in until a canonicalize request is - made. Then the BFD back end fills in a table provided by the - application with pointers to the canonical information. To - output symbols, the application provides BFD with a table of - pointers to pointers to <<asymbol>>s. This allows applications - like the linker to output a symbol as it was read, since the ``behind - the scenes'' information will be still available. -@menu -@* Reading Symbols:: -@* Writing Symbols:: -@* Mini Symbols:: -@* typedef asymbol:: -@* symbol handling functions:: -@end menu - -INODE -Reading Symbols, Writing Symbols, Symbols, Symbols -SUBSECTION - Reading symbols - - There are two stages to reading a symbol table from a BFD: - allocating storage, and the actual reading process. This is an - excerpt from an application which reads the symbol table: - -| long storage_needed; -| asymbol **symbol_table; -| long number_of_symbols; -| long i; -| -| storage_needed = bfd_get_symtab_upper_bound (abfd); -| -| if (storage_needed < 0) -| FAIL -| -| if (storage_needed == 0) { -| return ; -| } -| symbol_table = (asymbol **) xmalloc (storage_needed); -| ... -| number_of_symbols = -| bfd_canonicalize_symtab (abfd, symbol_table); -| -| if (number_of_symbols < 0) -| FAIL -| -| for (i = 0; i < number_of_symbols; i++) { -| process_symbol (symbol_table[i]); -| } - - All storage for the symbols themselves is in an obstack - connected to the BFD; it is freed when the BFD is closed. - - -INODE -Writing Symbols, Mini Symbols, Reading Symbols, Symbols -SUBSECTION - Writing symbols - - Writing of a symbol table is automatic when a BFD open for - writing is closed. The application attaches a vector of - pointers to pointers to symbols to the BFD being written, and - fills in the symbol count. The close and cleanup code reads - through the table provided and performs all the necessary - operations. The BFD output code must always be provided with an - ``owned'' symbol: one which has come from another BFD, or one - which has been created using <<bfd_make_empty_symbol>>. Here is an - example showing the creation of a symbol table with only one element: - -| #include "bfd.h" -| main() -| { -| bfd *abfd; -| asymbol *ptrs[2]; -| asymbol *new; -| -| abfd = bfd_openw("foo","a.out-sunos-big"); -| bfd_set_format(abfd, bfd_object); -| new = bfd_make_empty_symbol(abfd); -| new->name = "dummy_symbol"; -| new->section = bfd_make_section_old_way(abfd, ".text"); -| new->flags = BSF_GLOBAL; -| new->value = 0x12345; -| -| ptrs[0] = new; -| ptrs[1] = (asymbol *)0; -| -| bfd_set_symtab(abfd, ptrs, 1); -| bfd_close(abfd); -| } -| -| ./makesym -| nm foo -| 00012345 A dummy_symbol - - Many formats cannot represent arbitary symbol information; for - instance, the <<a.out>> object format does not allow an - arbitary number of sections. A symbol pointing to a section - which is not one of <<.text>>, <<.data>> or <<.bss>> cannot - be described. - -INODE -Mini Symbols, typedef asymbol, Writing Symbols, Symbols -SUBSECTION - Mini Symbols - - Mini symbols provide read-only access to the symbol table. - They use less memory space, but require more time to access. - They can be useful for tools like nm or objdump, which may - have to handle symbol tables of extremely large executables. - - The <<bfd_read_minisymbols>> function will read the symbols - into memory in an internal form. It will return a <<void *>> - pointer to a block of memory, a symbol count, and the size of - each symbol. The pointer is allocated using <<malloc>>, and - should be freed by the caller when it is no longer needed. - - The function <<bfd_minisymbol_to_symbol>> will take a pointer - to a minisymbol, and a pointer to a structure returned by - <<bfd_make_empty_symbol>>, and return a <<asymbol>> structure. - The return value may or may not be the same as the value from - <<bfd_make_empty_symbol>> which was passed in. - -*/ - - - -/* -DOCDD -INODE -typedef asymbol, symbol handling functions, Mini Symbols, Symbols - -*/ -/* -SUBSECTION - typedef asymbol - - An <<asymbol>> has the form: - -*/ - -/* -CODE_FRAGMENT - -. -.typedef struct symbol_cache_entry -.{ -. {* A pointer to the BFD which owns the symbol. This information -. is necessary so that a back end can work out what additional -. information (invisible to the application writer) is carried -. with the symbol. -. -. This field is *almost* redundant, since you can use section->owner -. instead, except that some symbols point to the global sections -. bfd_{abs,com,und}_section. This could be fixed by making -. these globals be per-bfd (or per-target-flavor). FIXME. *} -. -. struct _bfd *the_bfd; {* Use bfd_asymbol_bfd(sym) to access this field. *} -. -. {* The text of the symbol. The name is left alone, and not copied; the -. application may not alter it. *} -. CONST char *name; -. -. {* The value of the symbol. This really should be a union of a -. numeric value with a pointer, since some flags indicate that -. a pointer to another symbol is stored here. *} -. symvalue value; -. -. {* Attributes of a symbol: *} -. -.#define BSF_NO_FLAGS 0x00 -. -. {* The symbol has local scope; <<static>> in <<C>>. The value -. is the offset into the section of the data. *} -.#define BSF_LOCAL 0x01 -. -. {* The symbol has global scope; initialized data in <<C>>. The -. value is the offset into the section of the data. *} -.#define BSF_GLOBAL 0x02 -. -. {* The symbol has global scope and is exported. The value is -. the offset into the section of the data. *} -.#define BSF_EXPORT BSF_GLOBAL {* no real difference *} -. -. {* A normal C symbol would be one of: -. <<BSF_LOCAL>>, <<BSF_FORT_COMM>>, <<BSF_UNDEFINED>> or -. <<BSF_GLOBAL>> *} -. -. {* The symbol is a debugging record. The value has an arbitary -. meaning. *} -.#define BSF_DEBUGGING 0x08 -. -. {* The symbol denotes a function entry point. Used in ELF, -. perhaps others someday. *} -.#define BSF_FUNCTION 0x10 -. -. {* Used by the linker. *} -.#define BSF_KEEP 0x20 -.#define BSF_KEEP_G 0x40 -. -. {* A weak global symbol, overridable without warnings by -. a regular global symbol of the same name. *} -.#define BSF_WEAK 0x80 -. -. {* This symbol was created to point to a section, e.g. ELF's -. STT_SECTION symbols. *} -.#define BSF_SECTION_SYM 0x100 -. -. {* The symbol used to be a common symbol, but now it is -. allocated. *} -.#define BSF_OLD_COMMON 0x200 -. -. {* The default value for common data. *} -.#define BFD_FORT_COMM_DEFAULT_VALUE 0 -. -. {* In some files the type of a symbol sometimes alters its -. location in an output file - ie in coff a <<ISFCN>> symbol -. which is also <<C_EXT>> symbol appears where it was -. declared and not at the end of a section. This bit is set -. by the target BFD part to convey this information. *} -. -.#define BSF_NOT_AT_END 0x400 -. -. {* Signal that the symbol is the label of constructor section. *} -.#define BSF_CONSTRUCTOR 0x800 -. -. {* Signal that the symbol is a warning symbol. The name is a -. warning. The name of the next symbol is the one to warn about; -. if a reference is made to a symbol with the same name as the next -. symbol, a warning is issued by the linker. *} -.#define BSF_WARNING 0x1000 -. -. {* Signal that the symbol is indirect. This symbol is an indirect -. pointer to the symbol with the same name as the next symbol. *} -.#define BSF_INDIRECT 0x2000 -. -. {* BSF_FILE marks symbols that contain a file name. This is used -. for ELF STT_FILE symbols. *} -.#define BSF_FILE 0x4000 -. -. {* Symbol is from dynamic linking information. *} -.#define BSF_DYNAMIC 0x8000 -. -. {* The symbol denotes a data object. Used in ELF, and perhaps -. others someday. *} -.#define BSF_OBJECT 0x10000 -. -. flagword flags; -. -. {* A pointer to the section to which this symbol is -. relative. This will always be non NULL, there are special -. sections for undefined and absolute symbols. *} -. struct sec *section; -. -. {* Back end special data. *} -. union -. { -. PTR p; -. bfd_vma i; -. } udata; -. -.} asymbol; -*/ - -#include "bfd.h" -#include "sysdep.h" -#include "libbfd.h" -#include "bfdlink.h" -#include "aout/stab_gnu.h" - -/* -DOCDD -INODE -symbol handling functions, , typedef asymbol, Symbols -SUBSECTION - Symbol handling functions -*/ - -/* -FUNCTION - bfd_get_symtab_upper_bound - -DESCRIPTION - Return the number of bytes required to store a vector of pointers - to <<asymbols>> for all the symbols in the BFD @var{abfd}, - including a terminal NULL pointer. If there are no symbols in - the BFD, then return 0. If an error occurs, return -1. - -.#define bfd_get_symtab_upper_bound(abfd) \ -. BFD_SEND (abfd, _bfd_get_symtab_upper_bound, (abfd)) - -*/ - -/* -FUNCTION - bfd_is_local_label - -SYNOPSIS - boolean bfd_is_local_label(bfd *abfd, asymbol *sym); - -DESCRIPTION - Return true if the given symbol @var{sym} in the BFD @var{abfd} is - a compiler generated local label, else return false. -.#define bfd_is_local_label(abfd, sym) \ -. BFD_SEND (abfd, _bfd_is_local_label,(abfd, sym)) -*/ - -/* -FUNCTION - bfd_canonicalize_symtab - -DESCRIPTION - Read the symbols from the BFD @var{abfd}, and fills in - the vector @var{location} with pointers to the symbols and - a trailing NULL. - Return the actual number of symbol pointers, not - including the NULL. - - -.#define bfd_canonicalize_symtab(abfd, location) \ -. BFD_SEND (abfd, _bfd_canonicalize_symtab,\ -. (abfd, location)) - -*/ - - -/* -FUNCTION - bfd_set_symtab - -SYNOPSIS - boolean bfd_set_symtab (bfd *abfd, asymbol **location, unsigned int count); - -DESCRIPTION - Arrange that when the output BFD @var{abfd} is closed, - the table @var{location} of @var{count} pointers to symbols - will be written. -*/ - -boolean -bfd_set_symtab (abfd, location, symcount) - bfd *abfd; - asymbol **location; - unsigned int symcount; -{ - if ((abfd->format != bfd_object) || (bfd_read_p (abfd))) - { - bfd_set_error (bfd_error_invalid_operation); - return false; - } - - bfd_get_outsymbols (abfd) = location; - bfd_get_symcount (abfd) = symcount; - return true; -} - -/* -FUNCTION - bfd_print_symbol_vandf - -SYNOPSIS - void bfd_print_symbol_vandf(PTR file, asymbol *symbol); - -DESCRIPTION - Print the value and flags of the @var{symbol} supplied to the - stream @var{file}. -*/ -void -bfd_print_symbol_vandf (arg, symbol) - PTR arg; - asymbol *symbol; -{ - FILE *file = (FILE *) arg; - flagword type = symbol->flags; - if (symbol->section != (asection *) NULL) - { - fprintf_vma (file, symbol->value + symbol->section->vma); - } - else - { - fprintf_vma (file, symbol->value); - } - - /* This presumes that a symbol can not be both BSF_DEBUGGING and - BSF_DYNAMIC, nor more than one of BSF_FUNCTION, BSF_FILE, and - BSF_OBJECT. */ - fprintf (file, " %c%c%c%c%c%c%c", - ((type & BSF_LOCAL) - ? (type & BSF_GLOBAL) ? '!' : 'l' - : (type & BSF_GLOBAL) ? 'g' : ' '), - (type & BSF_WEAK) ? 'w' : ' ', - (type & BSF_CONSTRUCTOR) ? 'C' : ' ', - (type & BSF_WARNING) ? 'W' : ' ', - (type & BSF_INDIRECT) ? 'I' : ' ', - (type & BSF_DEBUGGING) ? 'd' : (type & BSF_DYNAMIC) ? 'D' : ' ', - ((type & BSF_FUNCTION) - ? 'F' - : ((type & BSF_FILE) - ? 'f' - : ((type & BSF_OBJECT) ? 'O' : ' ')))); -} - - -/* -FUNCTION - bfd_make_empty_symbol - -DESCRIPTION - Create a new <<asymbol>> structure for the BFD @var{abfd} - and return a pointer to it. - - This routine is necessary because each back end has private - information surrounding the <<asymbol>>. Building your own - <<asymbol>> and pointing to it will not create the private - information, and will cause problems later on. - -.#define bfd_make_empty_symbol(abfd) \ -. BFD_SEND (abfd, _bfd_make_empty_symbol, (abfd)) -*/ - -/* -FUNCTION - bfd_make_debug_symbol - -DESCRIPTION - Create a new <<asymbol>> structure for the BFD @var{abfd}, - to be used as a debugging symbol. Further details of its use have - yet to be worked out. - -.#define bfd_make_debug_symbol(abfd,ptr,size) \ -. BFD_SEND (abfd, _bfd_make_debug_symbol, (abfd, ptr, size)) -*/ - -struct section_to_type -{ - CONST char *section; - char type; -}; - -/* Map section names to POSIX/BSD single-character symbol types. - This table is probably incomplete. It is sorted for convenience of - adding entries. Since it is so short, a linear search is used. */ -static CONST struct section_to_type stt[] = -{ - {"*DEBUG*", 'N'}, - {".bss", 'b'}, - {"zerovars", 'b'}, /* MRI .bss */ - {".data", 'd'}, - {"vars", 'd'}, /* MRI .data */ - {".rdata", 'r'}, /* Read only data. */ - {".rodata", 'r'}, /* Read only data. */ - {".sbss", 's'}, /* Small BSS (uninitialized data). */ - {".scommon", 'c'}, /* Small common. */ - {".sdata", 'g'}, /* Small initialized data. */ - {".text", 't'}, - {"code", 't'}, /* MRI .text */ - {0, 0} -}; - -/* Return the single-character symbol type corresponding to - section S, or '?' for an unknown COFF section. - - Check for any leading string which matches, so .text5 returns - 't' as well as .text */ - -static char -coff_section_type (s) - char *s; -{ - CONST struct section_to_type *t; - - for (t = &stt[0]; t->section; t++) - if (!strncmp (s, t->section, strlen (t->section))) - return t->type; - - return '?'; -} - -#ifndef islower -#define islower(c) ((c) >= 'a' && (c) <= 'z') -#endif -#ifndef toupper -#define toupper(c) (islower(c) ? ((c) & ~0x20) : (c)) -#endif - -/* -FUNCTION - bfd_decode_symclass - -DESCRIPTION - Return a character corresponding to the symbol - class of @var{symbol}, or '?' for an unknown class. - -SYNOPSIS - int bfd_decode_symclass(asymbol *symbol); -*/ -int -bfd_decode_symclass (symbol) - asymbol *symbol; -{ - char c; - - if (bfd_is_com_section (symbol->section)) - return 'C'; - if (bfd_is_und_section (symbol->section)) - return 'U'; - if (bfd_is_ind_section (symbol->section)) - return 'I'; - if (symbol->flags & BSF_WEAK) - return 'W'; - if (!(symbol->flags & (BSF_GLOBAL | BSF_LOCAL))) - return '?'; - - if (bfd_is_abs_section (symbol->section)) - c = 'a'; - else if (symbol->section) - c = coff_section_type (symbol->section->name); - else - return '?'; - if (symbol->flags & BSF_GLOBAL) - c = toupper (c); - return c; - - /* We don't have to handle these cases just yet, but we will soon: - N_SETV: 'v'; - N_SETA: 'l'; - N_SETT: 'x'; - N_SETD: 'z'; - N_SETB: 's'; - N_INDR: 'i'; - */ -} - -/* -FUNCTION - bfd_symbol_info - -DESCRIPTION - Fill in the basic info about symbol that nm needs. - Additional info may be added by the back-ends after - calling this function. - -SYNOPSIS - void bfd_symbol_info(asymbol *symbol, symbol_info *ret); -*/ - -void -bfd_symbol_info (symbol, ret) - asymbol *symbol; - symbol_info *ret; -{ - ret->type = bfd_decode_symclass (symbol); - if (ret->type != 'U') - ret->value = symbol->value + symbol->section->vma; - else - ret->value = 0; - ret->name = symbol->name; -} - -void -bfd_symbol_is_absolute () -{ - abort (); -} - -/* -FUNCTION - bfd_copy_private_symbol_data - -SYNOPSIS - boolean bfd_copy_private_symbol_data(bfd *ibfd, asymbol *isym, bfd *obfd, asymbol *osym); - -DESCRIPTION - Copy private symbol information from @var{isym} in the BFD - @var{ibfd} to the symbol @var{osym} in the BFD @var{obfd}. - Return <<true>> on success, <<false>> on error. Possible error - returns are: - - o <<bfd_error_no_memory>> - - Not enough memory exists to create private data for @var{osec}. - -.#define bfd_copy_private_symbol_data(ibfd, isymbol, obfd, osymbol) \ -. BFD_SEND (ibfd, _bfd_copy_private_symbol_data, \ -. (ibfd, isymbol, obfd, osymbol)) - -*/ - -/* The generic version of the function which returns mini symbols. - This is used when the backend does not provide a more efficient - version. It just uses BFD asymbol structures as mini symbols. */ - -long -_bfd_generic_read_minisymbols (abfd, dynamic, minisymsp, sizep) - bfd *abfd; - boolean dynamic; - PTR *minisymsp; - unsigned int *sizep; -{ - long storage; - asymbol **syms = NULL; - long symcount; - - if (dynamic) - storage = bfd_get_dynamic_symtab_upper_bound (abfd); - else - storage = bfd_get_symtab_upper_bound (abfd); - if (storage < 0) - goto error_return; - - syms = (asymbol **) bfd_malloc ((size_t) storage); - if (syms == NULL) - goto error_return; - - if (dynamic) - symcount = bfd_canonicalize_dynamic_symtab (abfd, syms); - else - symcount = bfd_canonicalize_symtab (abfd, syms); - if (symcount < 0) - goto error_return; - - *minisymsp = (PTR) syms; - *sizep = sizeof (asymbol *); - return symcount; - - error_return: - if (syms != NULL) - free (syms); - return -1; -} - -/* The generic version of the function which converts a minisymbol to - an asymbol. We don't worry about the sym argument we are passed; - we just return the asymbol the minisymbol points to. */ - -/*ARGSUSED*/ -asymbol * -_bfd_generic_minisymbol_to_symbol (abfd, dynamic, minisym, sym) - bfd *abfd; - boolean dynamic; - const PTR minisym; - asymbol *sym; -{ - return *(asymbol **) minisym; -} - -/* Look through stabs debugging information in .stab and .stabstr - sections to find the source file and line closest to a desired - location. This is used by COFF and ELF targets. It sets *pfound - to true if it finds some information. The *pinfo field is used to - pass cached information in and out of this routine; this first time - the routine is called for a BFD, *pinfo should be NULL. The value - placed in *pinfo should be saved with the BFD, and passed back each - time this function is called. */ - -/* A pointer to this structure is stored in *pinfo. */ - -struct stab_find_info -{ - /* The .stab section. */ - asection *stabsec; - /* The .stabstr section. */ - asection *strsec; - /* The contents of the .stab section. */ - bfd_byte *stabs; - /* The contents of the .stabstr section. */ - bfd_byte *strs; - /* An malloc buffer to hold the file name. */ - char *filename; - /* Cached values to restart quickly. */ - bfd_vma cached_offset; - bfd_byte *cached_stab; - bfd_byte *cached_str; - bfd_size_type cached_stroff; -}; - -boolean -_bfd_stab_section_find_nearest_line (abfd, symbols, section, offset, pfound, - pfilename, pfnname, pline, pinfo) - bfd *abfd; - asymbol **symbols; - asection *section; - bfd_vma offset; - boolean *pfound; - const char **pfilename; - const char **pfnname; - unsigned int *pline; - PTR *pinfo; -{ - struct stab_find_info *info; - bfd_size_type stabsize, strsize; - bfd_byte *stab, *stabend, *str; - bfd_size_type stroff; - bfd_vma fnaddr; - char *directory_name, *main_file_name, *current_file_name, *line_file_name; - char *fnname; - bfd_vma low_func_vma, low_line_vma; - - *pfound = false; - *pfilename = bfd_get_filename (abfd); - *pfnname = NULL; - *pline = 0; - - info = (struct stab_find_info *) *pinfo; - if (info != NULL) - { - if (info->stabsec == NULL || info->strsec == NULL) - { - /* No stabs debugging information. */ - return true; - } - - stabsize = info->stabsec->_raw_size; - strsize = info->strsec->_raw_size; - } - else - { - long reloc_size, reloc_count; - arelent **reloc_vector; - - info = (struct stab_find_info *) bfd_zalloc (abfd, sizeof *info); - if (info == NULL) - return false; - - /* FIXME: When using the linker --split-by-file or - --split-by-reloc options, it is possible for the .stab and - .stabstr sections to be split. We should handle that. */ - - info->stabsec = bfd_get_section_by_name (abfd, ".stab"); - info->strsec = bfd_get_section_by_name (abfd, ".stabstr"); - - if (info->stabsec == NULL || info->strsec == NULL) - { - /* No stabs debugging information. Set *pinfo so that we - can return quickly in the info != NULL case above. */ - *pinfo = (PTR) info; - return true; - } - - stabsize = info->stabsec->_raw_size; - strsize = info->strsec->_raw_size; - - info->stabs = (bfd_byte *) bfd_alloc (abfd, stabsize); - info->strs = (bfd_byte *) bfd_alloc (abfd, strsize); - if (info->stabs == NULL || info->strs == NULL) - return false; - - if (! bfd_get_section_contents (abfd, info->stabsec, info->stabs, 0, - stabsize) - || ! bfd_get_section_contents (abfd, info->strsec, info->strs, 0, - strsize)) - return false; - - /* If this is a relocateable object file, we have to relocate - the entries in .stab. This should always be simple 32 bit - relocations against symbols defined in this object file, so - this should be no big deal. */ - reloc_size = bfd_get_reloc_upper_bound (abfd, info->stabsec); - if (reloc_size < 0) - return false; - reloc_vector = (arelent **) bfd_malloc (reloc_size); - if (reloc_vector == NULL && reloc_size != 0) - return false; - reloc_count = bfd_canonicalize_reloc (abfd, info->stabsec, reloc_vector, - symbols); - if (reloc_count < 0) - { - if (reloc_vector != NULL) - free (reloc_vector); - return false; - } - if (reloc_count > 0) - { - arelent **pr; - - for (pr = reloc_vector; *pr != NULL; pr++) - { - arelent *r; - unsigned long val; - asymbol *sym; - - r = *pr; - if (r->howto->rightshift != 0 - || r->howto->size != 2 - || r->howto->bitsize != 32 - || r->howto->pc_relative - || r->howto->bitpos != 0 - || r->howto->dst_mask != 0xffffffff) - { - (*_bfd_error_handler) - ("Unsupported .stab relocation"); - bfd_set_error (bfd_error_invalid_operation); - if (reloc_vector != NULL) - free (reloc_vector); - return false; - } - - val = bfd_get_32 (abfd, info->stabs + r->address); - val &= r->howto->src_mask; - sym = *r->sym_ptr_ptr; - val += sym->value + sym->section->vma + r->addend; - bfd_put_32 (abfd, val, info->stabs + r->address); - } - } - - if (reloc_vector != NULL) - free (reloc_vector); - - *pinfo = (PTR) info; - } - - /* We are passed a section relative offset. The offsets in the - stabs information are absolute. */ - offset += bfd_get_section_vma (abfd, section); - - /* Stabs entries use a 12 byte format: - 4 byte string table index - 1 byte stab type - 1 byte stab other field - 2 byte stab desc field - 4 byte stab value - FIXME: This will have to change for a 64 bit object format. - - The stabs symbols are divided into compilation units. For the - first entry in each unit, the type of 0, the value is the length - of the string table for this unit, and the desc field is the - number of stabs symbols for this unit. */ - -#define STRDXOFF (0) -#define TYPEOFF (4) -#define OTHEROFF (5) -#define DESCOFF (6) -#define VALOFF (8) -#define STABSIZE (12) - - /* It would be nice if we could skip ahead to the stabs symbols for - the next compilation unit to quickly scan through the compilation - units. Unfortunately, since each line number gets a separate - stabs entry, it is entirely plausible that a large source file - will overflow the 16 bit count of stabs entries. */ - fnaddr = 0; - directory_name = NULL; - main_file_name = NULL; - current_file_name = NULL; - line_file_name = NULL; - fnname = NULL; - low_func_vma = 0; - low_line_vma = 0; - - stabend = info->stabs + stabsize; - - if (info->cached_stab == NULL || offset < info->cached_offset) - { - stab = info->stabs; - str = info->strs; - stroff = 0; - } - else - { - stab = info->cached_stab; - str = info->cached_str; - stroff = info->cached_stroff; - } - - info->cached_offset = offset; - - for (; stab < stabend; stab += STABSIZE) - { - boolean done; - bfd_vma val; - char *name; - - done = false; - - switch (stab[TYPEOFF]) - { - case 0: - /* This is the first entry in a compilation unit. */ - if ((bfd_size_type) ((info->strs + strsize) - str) < stroff) - { - done = true; - break; - } - str += stroff; - stroff = bfd_get_32 (abfd, stab + VALOFF); - break; - - case N_SO: - /* The main file name. */ - - val = bfd_get_32 (abfd, stab + VALOFF); - if (val > offset) - { - done = true; - break; - } - - name = (char *) str + bfd_get_32 (abfd, stab + STRDXOFF); - - /* An empty string indicates the end of the compilation - unit. */ - if (*name == '\0') - { - /* If there are functions in different sections, they - may have addresses larger than val, but we don't want - to forget the file name. When there are functions in - different cases, there is supposed to be an N_FUN at - the end of the function indicating where it ends. */ - if (low_func_vma < val || fnname == NULL) - main_file_name = NULL; - break; - } - - /* We know that we have to get to at least this point in the - stabs entries for this offset. */ - info->cached_stab = stab; - info->cached_str = str; - info->cached_stroff = stroff; - - current_file_name = name; - - /* Look ahead to the next symbol. Two consecutive N_SO - symbols are a directory and a file name. */ - if (stab + STABSIZE >= stabend - || *(stab + STABSIZE + TYPEOFF) != N_SO) - directory_name = NULL; - else - { - stab += STABSIZE; - directory_name = current_file_name; - current_file_name = ((char *) str - + bfd_get_32 (abfd, stab + STRDXOFF)); - } - - main_file_name = current_file_name; - - break; - - case N_SOL: - /* The name of an include file. */ - current_file_name = ((char *) str - + bfd_get_32 (abfd, stab + STRDXOFF)); - break; - - case N_SLINE: - case N_DSLINE: - case N_BSLINE: - /* A line number. The value is relative to the start of the - current function. */ - val = fnaddr + bfd_get_32 (abfd, stab + VALOFF); - if (val >= low_line_vma && val <= offset) - { - *pline = bfd_get_16 (abfd, stab + DESCOFF); - low_line_vma = val; - line_file_name = current_file_name; - } - break; - - case N_FUN: - /* A function name. */ - val = bfd_get_32 (abfd, stab + VALOFF); - name = (char *) str + bfd_get_32 (abfd, stab + STRDXOFF); - - /* An empty string here indicates the end of a function, and - the value is relative to fnaddr. */ - - if (*name == '\0') - { - val += fnaddr; - if (val >= low_func_vma && val < offset) - fnname = NULL; - } - else - { - if (val >= low_func_vma && val <= offset) - { - fnname = name; - low_func_vma = val; - } - - fnaddr = val; - } - - break; - } - - if (done) - break; - } - - if (main_file_name == NULL) - { - /* No information found. */ - return true; - } - - *pfound = true; - - if (*pline != 0) - main_file_name = line_file_name; - - if (main_file_name != NULL) - { - if (main_file_name[0] == '/' || directory_name == NULL) - *pfilename = main_file_name; - else - { - size_t dirlen; - - dirlen = strlen (directory_name); - if (info->filename == NULL - || strncmp (info->filename, directory_name, dirlen) != 0 - || strcmp (info->filename + dirlen, main_file_name) != 0) - { - if (info->filename != NULL) - free (info->filename); - info->filename = (char *) bfd_malloc (dirlen + - strlen (main_file_name) - + 1); - if (info->filename == NULL) - return false; - strcpy (info->filename, directory_name); - strcpy (info->filename + dirlen, main_file_name); - } - - *pfilename = info->filename; - } - } - - if (fnname != NULL) - { - char *s; - - /* This will typically be something like main:F(0,1), so we want - to clobber the colon. It's OK to change the name, since the - string is in our own local storage anyhow. */ - - s = strchr (fnname, ':'); - if (s != NULL) - *s = '\0'; - - *pfnname = fnname; - } - - return true; -} diff --git a/contrib/gdb/bfd/sysdep.h b/contrib/gdb/bfd/sysdep.h deleted file mode 100644 index dd8146a961a8d..0000000000000 --- a/contrib/gdb/bfd/sysdep.h +++ /dev/null @@ -1,114 +0,0 @@ -/* sysdep.h -- handle host dependencies for the BFD library - Copyright 1995 Free Software Foundation, Inc. - Written by Cygnus Support. - -This file is part of BFD, the Binary File Descriptor library. - -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 2 of the License, 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ - -#ifndef BFD_SYSDEP_H -#define BFD_SYSDEP_H - -#include "ansidecl.h" - -#include "config.h" - -#ifdef HAVE_STDDEF_H -#include <stddef.h> -#endif - -#include <stdio.h> -#include <sys/types.h> -#include <sys/stat.h> - -#include <errno.h> -#ifndef errno -extern int errno; -#endif - -#ifdef HAVE_STRING_H -#include <string.h> -#else -#ifdef HAVE_STRINGS_H -#include <strings.h> -#else -extern char *strchr (); -extern char *strrchr (); -extern char *strstr (); -#endif -#endif - -#ifdef HAVE_STDLIB_H -#include <stdlib.h> -#endif - -#if TIME_WITH_SYS_TIME -#include <sys/time.h> -#include <time.h> -#else -#if HAVE_SYS_TIME_H -#include <sys/time.h> -#else -#include <time.h> -#endif -#endif - -#ifdef HAVE_UNISTD_H -#include <unistd.h> -#endif - -#ifdef USE_BINARY_FOPEN -#include "fopen-bin.h" -#else -#include "fopen-same.h" -#endif - -#ifdef HAVE_FCNTL_H -#include <fcntl.h> -#else -#ifdef HAVE_SYS_FILE_H -#include <sys/file.h> -#endif -#endif - -#ifndef O_RDONLY -#define O_RDONLY 0 -#endif -#ifndef O_WRONLY -#define O_WRONLY 1 -#endif -#ifndef O_RDWR -#define O_RDWR 2 -#endif -#ifndef O_ACCMODE -#define O_ACCMODE (O_RDONLY | O_WRONLY | O_RDWR) -#endif - -#ifndef SEEK_SET -#define SEEK_SET 0 -#endif -#ifndef SEEK_CUR -#define SEEK_CUR 1 -#endif - -#ifdef NEED_DECLARATION_MALLOC -extern PTR malloc (); -#endif - -#ifdef NEED_DECLARATION_FREE -extern void free (); -#endif - -#endif /* ! defined (BFD_SYSDEP_H) */ diff --git a/contrib/gdb/bfd/targets.c b/contrib/gdb/bfd/targets.c deleted file mode 100644 index e1e6468a18eeb..0000000000000 --- a/contrib/gdb/bfd/targets.c +++ /dev/null @@ -1,886 +0,0 @@ -/* Generic target-file-type support for the BFD library. - Copyright 1990, 91, 92, 93, 94, 95, 1996 Free Software Foundation, Inc. - Written by Cygnus Support. - -This file is part of BFD, the Binary File Descriptor library. - -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 2 of the License, 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ - -#include "bfd.h" -#include "sysdep.h" -#include "libbfd.h" - -/* -SECTION - Targets - -DESCRIPTION - Each port of BFD to a different machine requries the creation - of a target back end. All the back end provides to the root - part of BFD is a structure containing pointers to functions - which perform certain low level operations on files. BFD - translates the applications's requests through a pointer into - calls to the back end routines. - - When a file is opened with <<bfd_openr>>, its format and - target are unknown. BFD uses various mechanisms to determine - how to interpret the file. The operations performed are: - - o Create a BFD by calling the internal routine - <<_bfd_new_bfd>>, then call <<bfd_find_target>> with the - target string supplied to <<bfd_openr>> and the new BFD pointer. - - o If a null target string was provided to <<bfd_find_target>>, - look up the environment variable <<GNUTARGET>> and use - that as the target string. - - o If the target string is still <<NULL>>, or the target string is - <<default>>, then use the first item in the target vector - as the target type, and set <<target_defaulted>> in the BFD to - cause <<bfd_check_format>> to loop through all the targets. - @xref{bfd_target}. @xref{Formats}. - - o Otherwise, inspect the elements in the target vector - one by one, until a match on target name is found. When found, - use it. - - o Otherwise return the error <<bfd_error_invalid_target>> to - <<bfd_openr>>. - - o <<bfd_openr>> attempts to open the file using - <<bfd_open_file>>, and returns the BFD. - - Once the BFD has been opened and the target selected, the file - format may be determined. This is done by calling - <<bfd_check_format>> on the BFD with a suggested format. - If <<target_defaulted>> has been set, each possible target - type is tried to see if it recognizes the specified format. - <<bfd_check_format>> returns <<true>> when the caller guesses right. -@menu -@* bfd_target:: -@end menu -*/ - - -/* - -INODE - bfd_target, , Targets, Targets -DOCDD -SUBSECTION - bfd_target - -DESCRIPTION - This structure contains everything that BFD knows about a - target. It includes things like its byte order, name, and which - routines to call to do various operations. - - Every BFD points to a target structure with its <<xvec>> - member. - - The macros below are used to dispatch to functions through the - <<bfd_target>> vector. They are used in a number of macros further - down in @file{bfd.h}, and are also used when calling various - routines by hand inside the BFD implementation. The @var{arglist} - argument must be parenthesized; it contains all the arguments - to the called function. - - They make the documentation (more) unpleasant to read, so if - someone wants to fix this and not break the above, please do. - -.#define BFD_SEND(bfd, message, arglist) \ -. ((*((bfd)->xvec->message)) arglist) -. -.#ifdef DEBUG_BFD_SEND -.#undef BFD_SEND -.#define BFD_SEND(bfd, message, arglist) \ -. (((bfd) && (bfd)->xvec && (bfd)->xvec->message) ? \ -. ((*((bfd)->xvec->message)) arglist) : \ -. (bfd_assert (__FILE__,__LINE__), NULL)) -.#endif - - For operations which index on the BFD format: - -.#define BFD_SEND_FMT(bfd, message, arglist) \ -. (((bfd)->xvec->message[(int)((bfd)->format)]) arglist) -. -.#ifdef DEBUG_BFD_SEND -.#undef BFD_SEND_FMT -.#define BFD_SEND_FMT(bfd, message, arglist) \ -. (((bfd) && (bfd)->xvec && (bfd)->xvec->message) ? \ -. (((bfd)->xvec->message[(int)((bfd)->format)]) arglist) : \ -. (bfd_assert (__FILE__,__LINE__), NULL)) -.#endif - - This is the structure which defines the type of BFD this is. The - <<xvec>> member of the struct <<bfd>> itself points here. Each - module that implements access to a different target under BFD, - defines one of these. - - - FIXME, these names should be rationalised with the names of - the entry points which call them. Too bad we can't have one - macro to define them both! - -.enum bfd_flavour { -. bfd_target_unknown_flavour, -. bfd_target_aout_flavour, -. bfd_target_coff_flavour, -. bfd_target_ecoff_flavour, -. bfd_target_elf_flavour, -. bfd_target_ieee_flavour, -. bfd_target_nlm_flavour, -. bfd_target_oasys_flavour, -. bfd_target_tekhex_flavour, -. bfd_target_srec_flavour, -. bfd_target_ihex_flavour, -. bfd_target_som_flavour, -. bfd_target_os9k_flavour, -. bfd_target_versados_flavour, -. bfd_target_msdos_flavour -.}; -. -.enum bfd_endian { BFD_ENDIAN_BIG, BFD_ENDIAN_LITTLE, BFD_ENDIAN_UNKNOWN }; -. -.{* Forward declaration. *} -.typedef struct bfd_link_info _bfd_link_info; -. -.typedef struct bfd_target -.{ - -Identifies the kind of target, e.g., SunOS4, Ultrix, etc. - -. char *name; - -The "flavour" of a back end is a general indication about the contents -of a file. - -. enum bfd_flavour flavour; - -The order of bytes within the data area of a file. - -. enum bfd_endian byteorder; - -The order of bytes within the header parts of a file. - -. enum bfd_endian header_byteorder; - -A mask of all the flags which an executable may have set - -from the set <<NO_FLAGS>>, <<HAS_RELOC>>, ...<<D_PAGED>>. - -. flagword object_flags; - -A mask of all the flags which a section may have set - from -the set <<SEC_NO_FLAGS>>, <<SEC_ALLOC>>, ...<<SET_NEVER_LOAD>>. - -. flagword section_flags; - -The character normally found at the front of a symbol -(if any), perhaps `_'. - -. char symbol_leading_char; - -The pad character for file names within an archive header. - -. char ar_pad_char; - -The maximum number of characters in an archive header. - -. unsigned short ar_max_namelen; - -Entries for byte swapping for data. These are different from the other -entry points, since they don't take a BFD asthe first argument. -Certain other handlers could do the same. - -. bfd_vma (*bfd_getx64) PARAMS ((const bfd_byte *)); -. bfd_signed_vma (*bfd_getx_signed_64) PARAMS ((const bfd_byte *)); -. void (*bfd_putx64) PARAMS ((bfd_vma, bfd_byte *)); -. bfd_vma (*bfd_getx32) PARAMS ((const bfd_byte *)); -. bfd_signed_vma (*bfd_getx_signed_32) PARAMS ((const bfd_byte *)); -. void (*bfd_putx32) PARAMS ((bfd_vma, bfd_byte *)); -. bfd_vma (*bfd_getx16) PARAMS ((const bfd_byte *)); -. bfd_signed_vma (*bfd_getx_signed_16) PARAMS ((const bfd_byte *)); -. void (*bfd_putx16) PARAMS ((bfd_vma, bfd_byte *)); - -Byte swapping for the headers - -. bfd_vma (*bfd_h_getx64) PARAMS ((const bfd_byte *)); -. bfd_signed_vma (*bfd_h_getx_signed_64) PARAMS ((const bfd_byte *)); -. void (*bfd_h_putx64) PARAMS ((bfd_vma, bfd_byte *)); -. bfd_vma (*bfd_h_getx32) PARAMS ((const bfd_byte *)); -. bfd_signed_vma (*bfd_h_getx_signed_32) PARAMS ((const bfd_byte *)); -. void (*bfd_h_putx32) PARAMS ((bfd_vma, bfd_byte *)); -. bfd_vma (*bfd_h_getx16) PARAMS ((const bfd_byte *)); -. bfd_signed_vma (*bfd_h_getx_signed_16) PARAMS ((const bfd_byte *)); -. void (*bfd_h_putx16) PARAMS ((bfd_vma, bfd_byte *)); - -Format dependent routines: these are vectors of entry points -within the target vector structure, one for each format to check. - -Check the format of a file being read. Return a <<bfd_target *>> or zero. - -. const struct bfd_target *(*_bfd_check_format[bfd_type_end]) PARAMS ((bfd *)); - -Set the format of a file being written. - -. boolean (*_bfd_set_format[bfd_type_end]) PARAMS ((bfd *)); - -Write cached information into a file being written, at <<bfd_close>>. - -. boolean (*_bfd_write_contents[bfd_type_end]) PARAMS ((bfd *)); - -The general target vector. - -. -. {* Generic entry points. *} -.#define BFD_JUMP_TABLE_GENERIC(NAME)\ -.CAT(NAME,_close_and_cleanup),\ -.CAT(NAME,_bfd_free_cached_info),\ -.CAT(NAME,_new_section_hook),\ -.CAT(NAME,_get_section_contents),\ -.CAT(NAME,_get_section_contents_in_window) -. -. {* Called when the BFD is being closed to do any necessary cleanup. *} -. boolean (*_close_and_cleanup) PARAMS ((bfd *)); -. {* Ask the BFD to free all cached information. *} -. boolean (*_bfd_free_cached_info) PARAMS ((bfd *)); -. {* Called when a new section is created. *} -. boolean (*_new_section_hook) PARAMS ((bfd *, sec_ptr)); -. {* Read the contents of a section. *} -. boolean (*_bfd_get_section_contents) PARAMS ((bfd *, sec_ptr, PTR, -. file_ptr, bfd_size_type)); -. boolean (*_bfd_get_section_contents_in_window) -. PARAMS ((bfd *, sec_ptr, bfd_window *, -. file_ptr, bfd_size_type)); -. -. {* Entry points to copy private data. *} -.#define BFD_JUMP_TABLE_COPY(NAME)\ -.CAT(NAME,_bfd_copy_private_bfd_data),\ -.CAT(NAME,_bfd_merge_private_bfd_data),\ -.CAT(NAME,_bfd_copy_private_section_data),\ -.CAT(NAME,_bfd_copy_private_symbol_data),\ -.CAT(NAME,_bfd_set_private_flags),\ -.CAT(NAME,_bfd_print_private_bfd_data)\ -. {* Called to copy BFD general private data from one object file -. to another. *} -. boolean (*_bfd_copy_private_bfd_data) PARAMS ((bfd *, bfd *)); -. {* Called to merge BFD general private data from one object file -. to a common output file when linking. *} -. boolean (*_bfd_merge_private_bfd_data) PARAMS ((bfd *, bfd *)); -. {* Called to copy BFD private section data from one object file -. to another. *} -. boolean (*_bfd_copy_private_section_data) PARAMS ((bfd *, sec_ptr, -. bfd *, sec_ptr)); -. {* Called to copy BFD private symbol data from one symbol -. to another. *} -. boolean (*_bfd_copy_private_symbol_data) PARAMS ((bfd *, asymbol *, -. bfd *, asymbol *)); -. {* Called to set private backend flags *} -. boolean (*_bfd_set_private_flags) PARAMS ((bfd *, flagword)); -. -. {* Called to print private BFD data *} -. boolean (*_bfd_print_private_bfd_data) PARAMS ((bfd *, PTR)); -. -. {* Core file entry points. *} -.#define BFD_JUMP_TABLE_CORE(NAME)\ -.CAT(NAME,_core_file_failing_command),\ -.CAT(NAME,_core_file_failing_signal),\ -.CAT(NAME,_core_file_matches_executable_p) -. char * (*_core_file_failing_command) PARAMS ((bfd *)); -. int (*_core_file_failing_signal) PARAMS ((bfd *)); -. boolean (*_core_file_matches_executable_p) PARAMS ((bfd *, bfd *)); -. -. {* Archive entry points. *} -.#define BFD_JUMP_TABLE_ARCHIVE(NAME)\ -.CAT(NAME,_slurp_armap),\ -.CAT(NAME,_slurp_extended_name_table),\ -.CAT(NAME,_construct_extended_name_table),\ -.CAT(NAME,_truncate_arname),\ -.CAT(NAME,_write_armap),\ -.CAT(NAME,_read_ar_hdr),\ -.CAT(NAME,_openr_next_archived_file),\ -.CAT(NAME,_get_elt_at_index),\ -.CAT(NAME,_generic_stat_arch_elt),\ -.CAT(NAME,_update_armap_timestamp) -. boolean (*_bfd_slurp_armap) PARAMS ((bfd *)); -. boolean (*_bfd_slurp_extended_name_table) PARAMS ((bfd *)); -. boolean (*_bfd_construct_extended_name_table) -. PARAMS ((bfd *, char **, bfd_size_type *, const char **)); -. void (*_bfd_truncate_arname) PARAMS ((bfd *, CONST char *, char *)); -. boolean (*write_armap) PARAMS ((bfd *arch, -. unsigned int elength, -. struct orl *map, -. unsigned int orl_count, -. int stridx)); -. PTR (*_bfd_read_ar_hdr_fn) PARAMS ((bfd *)); -. bfd * (*openr_next_archived_file) PARAMS ((bfd *arch, bfd *prev)); -.#define bfd_get_elt_at_index(b,i) BFD_SEND(b, _bfd_get_elt_at_index, (b,i)) -. bfd * (*_bfd_get_elt_at_index) PARAMS ((bfd *, symindex)); -. int (*_bfd_stat_arch_elt) PARAMS ((bfd *, struct stat *)); -. boolean (*_bfd_update_armap_timestamp) PARAMS ((bfd *)); -. -. {* Entry points used for symbols. *} -.#define BFD_JUMP_TABLE_SYMBOLS(NAME)\ -.CAT(NAME,_get_symtab_upper_bound),\ -.CAT(NAME,_get_symtab),\ -.CAT(NAME,_make_empty_symbol),\ -.CAT(NAME,_print_symbol),\ -.CAT(NAME,_get_symbol_info),\ -.CAT(NAME,_bfd_is_local_label),\ -.CAT(NAME,_get_lineno),\ -.CAT(NAME,_find_nearest_line),\ -.CAT(NAME,_bfd_make_debug_symbol),\ -.CAT(NAME,_read_minisymbols),\ -.CAT(NAME,_minisymbol_to_symbol) -. long (*_bfd_get_symtab_upper_bound) PARAMS ((bfd *)); -. long (*_bfd_canonicalize_symtab) PARAMS ((bfd *, -. struct symbol_cache_entry **)); -. struct symbol_cache_entry * -. (*_bfd_make_empty_symbol) PARAMS ((bfd *)); -. void (*_bfd_print_symbol) PARAMS ((bfd *, PTR, -. struct symbol_cache_entry *, -. bfd_print_symbol_type)); -.#define bfd_print_symbol(b,p,s,e) BFD_SEND(b, _bfd_print_symbol, (b,p,s,e)) -. void (*_bfd_get_symbol_info) PARAMS ((bfd *, -. struct symbol_cache_entry *, -. symbol_info *)); -.#define bfd_get_symbol_info(b,p,e) BFD_SEND(b, _bfd_get_symbol_info, (b,p,e)) -. boolean (*_bfd_is_local_label) PARAMS ((bfd *, asymbol *)); -. -. alent * (*_get_lineno) PARAMS ((bfd *, struct symbol_cache_entry *)); -. boolean (*_bfd_find_nearest_line) PARAMS ((bfd *abfd, -. struct sec *section, struct symbol_cache_entry **symbols, -. bfd_vma offset, CONST char **file, CONST char **func, -. unsigned int *line)); -. {* Back-door to allow format-aware applications to create debug symbols -. while using BFD for everything else. Currently used by the assembler -. when creating COFF files. *} -. asymbol * (*_bfd_make_debug_symbol) PARAMS (( -. bfd *abfd, -. void *ptr, -. unsigned long size)); -.#define bfd_read_minisymbols(b, d, m, s) \ -. BFD_SEND (b, _read_minisymbols, (b, d, m, s)) -. long (*_read_minisymbols) PARAMS ((bfd *, boolean, PTR *, -. unsigned int *)); -.#define bfd_minisymbol_to_symbol(b, d, m, f) \ -. BFD_SEND (b, _minisymbol_to_symbol, (b, d, m, f)) -. asymbol *(*_minisymbol_to_symbol) PARAMS ((bfd *, boolean, const PTR, -. asymbol *)); -. -. {* Routines for relocs. *} -.#define BFD_JUMP_TABLE_RELOCS(NAME)\ -.CAT(NAME,_get_reloc_upper_bound),\ -.CAT(NAME,_canonicalize_reloc),\ -.CAT(NAME,_bfd_reloc_type_lookup) -. long (*_get_reloc_upper_bound) PARAMS ((bfd *, sec_ptr)); -. long (*_bfd_canonicalize_reloc) PARAMS ((bfd *, sec_ptr, arelent **, -. struct symbol_cache_entry **)); -. {* See documentation on reloc types. *} -. reloc_howto_type * -. (*reloc_type_lookup) PARAMS ((bfd *abfd, -. bfd_reloc_code_real_type code)); -. -. {* Routines used when writing an object file. *} -.#define BFD_JUMP_TABLE_WRITE(NAME)\ -.CAT(NAME,_set_arch_mach),\ -.CAT(NAME,_set_section_contents) -. boolean (*_bfd_set_arch_mach) PARAMS ((bfd *, enum bfd_architecture, -. unsigned long)); -. boolean (*_bfd_set_section_contents) PARAMS ((bfd *, sec_ptr, PTR, -. file_ptr, bfd_size_type)); -. -. {* Routines used by the linker. *} -.#define BFD_JUMP_TABLE_LINK(NAME)\ -.CAT(NAME,_sizeof_headers),\ -.CAT(NAME,_bfd_get_relocated_section_contents),\ -.CAT(NAME,_bfd_relax_section),\ -.CAT(NAME,_bfd_link_hash_table_create),\ -.CAT(NAME,_bfd_link_add_symbols),\ -.CAT(NAME,_bfd_final_link),\ -.CAT(NAME,_bfd_link_split_section) -. int (*_bfd_sizeof_headers) PARAMS ((bfd *, boolean)); -. bfd_byte * (*_bfd_get_relocated_section_contents) PARAMS ((bfd *, -. struct bfd_link_info *, struct bfd_link_order *, -. bfd_byte *data, boolean relocateable, -. struct symbol_cache_entry **)); -. -. boolean (*_bfd_relax_section) PARAMS ((bfd *, struct sec *, -. struct bfd_link_info *, boolean *again)); -. -. {* Create a hash table for the linker. Different backends store -. different information in this table. *} -. struct bfd_link_hash_table *(*_bfd_link_hash_table_create) PARAMS ((bfd *)); -. -. {* Add symbols from this object file into the hash table. *} -. boolean (*_bfd_link_add_symbols) PARAMS ((bfd *, struct bfd_link_info *)); -. -. {* Do a link based on the link_order structures attached to each -. section of the BFD. *} -. boolean (*_bfd_final_link) PARAMS ((bfd *, struct bfd_link_info *)); -. -. {* Should this section be split up into smaller pieces during linking. *} -. boolean (*_bfd_link_split_section) PARAMS ((bfd *, struct sec *)); -. -. {* Routines to handle dynamic symbols and relocs. *} -.#define BFD_JUMP_TABLE_DYNAMIC(NAME)\ -.CAT(NAME,_get_dynamic_symtab_upper_bound),\ -.CAT(NAME,_canonicalize_dynamic_symtab),\ -.CAT(NAME,_get_dynamic_reloc_upper_bound),\ -.CAT(NAME,_canonicalize_dynamic_reloc) -. {* Get the amount of memory required to hold the dynamic symbols. *} -. long (*_bfd_get_dynamic_symtab_upper_bound) PARAMS ((bfd *)); -. {* Read in the dynamic symbols. *} -. long (*_bfd_canonicalize_dynamic_symtab) -. PARAMS ((bfd *, struct symbol_cache_entry **)); -. {* Get the amount of memory required to hold the dynamic relocs. *} -. long (*_bfd_get_dynamic_reloc_upper_bound) PARAMS ((bfd *)); -. {* Read in the dynamic relocs. *} -. long (*_bfd_canonicalize_dynamic_reloc) -. PARAMS ((bfd *, arelent **, struct symbol_cache_entry **)); -. - -Data for use by back-end routines, which isn't generic enough to belong -in this structure. - -. PTR backend_data; -.} bfd_target; - -*/ - -/* All known xvecs (even those that don't compile on all systems). - Alphabetized for easy reference. - They are listed a second time below, since - we can't intermix extern's and initializers. */ -extern const bfd_target a29kcoff_big_vec; -extern const bfd_target a_out_adobe_vec; -extern const bfd_target aout_arm_big_vec; -extern const bfd_target aout_arm_little_vec; -extern const bfd_target aout_mips_big_vec; -extern const bfd_target aout_mips_little_vec; -extern const bfd_target aout0_big_vec; -extern const bfd_target apollocoff_vec; -extern const bfd_target armcoff_little_vec; -extern const bfd_target armcoff_big_vec; -extern const bfd_target armpe_little_vec; -extern const bfd_target armpe_big_vec; -extern const bfd_target armpei_little_vec; -extern const bfd_target armpei_big_vec; -extern const bfd_target b_out_vec_big_host; -extern const bfd_target b_out_vec_little_host; -extern const bfd_target bfd_elf32_big_generic_vec; -extern const bfd_target bfd_elf32_bigmips_vec; -extern const bfd_target bfd_elf32_hppa_vec; -extern const bfd_target bfd_elf32_i386_vec; -extern const bfd_target bfd_elf32_i860_vec; -extern const bfd_target bfd_elf32_little_generic_vec; -extern const bfd_target bfd_elf32_littlemips_vec; -extern const bfd_target bfd_elf32_m68k_vec; -extern const bfd_target bfd_elf32_m88k_vec; -extern const bfd_target bfd_elf32_powerpc_vec; -extern const bfd_target bfd_elf32_powerpcle_vec; -extern const bfd_target bfd_elf32_sparc_vec; -extern const bfd_target bfd_elf64_big_generic_vec; -extern const bfd_target bfd_elf64_little_generic_vec; -extern const bfd_target bfd_elf64_sparc_vec; -extern const bfd_target demo_64_vec; -extern const bfd_target ecoff_big_vec; -extern const bfd_target ecoff_little_vec; -extern const bfd_target ecoffalpha_little_vec; -extern const bfd_target h8300coff_vec; -extern const bfd_target h8500coff_vec; -extern const bfd_target host_aout_vec; -extern const bfd_target hp300bsd_vec; -extern const bfd_target hp300hpux_vec; -extern const bfd_target som_vec; -extern const bfd_target i386aout_vec; -extern const bfd_target i386bsd_vec; -extern const bfd_target i386dynix_vec; -extern const bfd_target i386freebsd_vec; -extern const bfd_target i386os9k_vec; -extern const bfd_target i386coff_vec; -extern const bfd_target bfd_powerpc_pe_vec; -extern const bfd_target bfd_powerpcle_pe_vec; -extern const bfd_target bfd_powerpc_pei_vec; -extern const bfd_target bfd_powerpcle_pei_vec; -extern const bfd_target i386pe_vec; -extern const bfd_target i386pei_vec; -extern const bfd_target go32coff_vec; -extern const bfd_target i386linux_vec; -extern const bfd_target i386lynx_aout_vec; -extern const bfd_target i386lynx_coff_vec; -extern const bfd_target i386mach3_vec; -extern const bfd_target i386msdos_vec; -extern const bfd_target i386netbsd_vec; -extern const bfd_target i860coff_vec; -extern const bfd_target icoff_big_vec; -extern const bfd_target icoff_little_vec; -extern const bfd_target ieee_vec; -extern const bfd_target m68kaux_coff_vec; -extern const bfd_target m68kcoff_vec; -extern const bfd_target m68kcoffun_vec; -extern const bfd_target m68klinux_vec; -extern const bfd_target m68klynx_aout_vec; -extern const bfd_target m68klynx_coff_vec; -extern const bfd_target m68knetbsd_vec; -extern const bfd_target m68k4knetbsd_vec; -extern const bfd_target m88kbcs_vec; -extern const bfd_target m88kmach3_vec; -extern const bfd_target newsos3_vec; -extern const bfd_target nlm32_i386_vec; -extern const bfd_target nlm32_sparc_vec; -extern const bfd_target nlm32_alpha_vec; -extern const bfd_target nlm32_powerpc_vec; -extern const bfd_target pc532netbsd_vec; -extern const bfd_target oasys_vec; -extern const bfd_target pc532machaout_vec; -extern const bfd_target riscix_vec; -extern const bfd_target pmac_xcoff_vec; -extern const bfd_target rs6000coff_vec; -extern const bfd_target shcoff_vec; -extern const bfd_target shlcoff_vec; -extern const bfd_target sparclynx_aout_vec; -extern const bfd_target sparclynx_coff_vec; -extern const bfd_target sparcnetbsd_vec; -extern const bfd_target sparccoff_vec; -extern const bfd_target sunos_big_vec; -extern const bfd_target tekhex_vec; -extern const bfd_target versados_vec; -extern const bfd_target we32kcoff_vec; -extern const bfd_target w65_vec; -extern const bfd_target z8kcoff_vec; - -/* srec is always included. */ -extern const bfd_target srec_vec; -extern const bfd_target symbolsrec_vec; - -/* binary is always included. */ -extern const bfd_target binary_vec; - -/* ihex is always included. */ -extern const bfd_target ihex_vec; - -/* All of the xvecs for core files. */ -extern const bfd_target aix386_core_vec; -extern const bfd_target cisco_core_vec; -extern const bfd_target hpux_core_vec; -extern const bfd_target hppabsd_core_vec; -extern const bfd_target irix_core_vec; -extern const bfd_target osf_core_vec; -extern const bfd_target sco_core_vec; -extern const bfd_target trad_core_vec; -extern const bfd_target ptrace_core_vec; - -const bfd_target * const bfd_target_vector[] = { - -#ifdef SELECT_VECS - - SELECT_VECS, - -#else /* not SELECT_VECS */ - -#ifdef DEFAULT_VECTOR - &DEFAULT_VECTOR, -#endif - /* This list is alphabetized to make it easy to compare - with other vector lists -- the decls above and - the case statement in configure.in. - Vectors that don't compile on all systems, or aren't finished, - should have an entry here with #if 0 around it, to show that - it wasn't omitted by mistake. */ - &a29kcoff_big_vec, - &a_out_adobe_vec, -#if 0 /* No one seems to use this. */ - &aout_mips_big_vec, -#endif - &aout_mips_little_vec, - &b_out_vec_big_host, - &b_out_vec_little_host, - - /* This, and other vectors, may not be used in any *.mt configuration. - But that does not mean they are unnecessary. If configured with - --enable-targets=all, objdump or gdb should be able to examine - the file even if we don't recognize the machine type. */ - &bfd_elf32_big_generic_vec, - &bfd_elf32_bigmips_vec, - &bfd_elf32_hppa_vec, - &bfd_elf32_i386_vec, - &bfd_elf32_i860_vec, - &bfd_elf32_little_generic_vec, - &bfd_elf32_littlemips_vec, - &bfd_elf32_m68k_vec, - &bfd_elf32_m88k_vec, - &bfd_elf32_sparc_vec, - &bfd_elf32_powerpc_vec, -#ifdef BFD64 /* No one seems to use this. */ - &bfd_elf64_big_generic_vec, - &bfd_elf64_little_generic_vec, -#endif -#if 0 - &bfd_elf64_sparc_vec, -#endif - /* We don't include cisco_core_vec. Although it has a magic number, - the magic number isn't at the beginning of the file, and thus - might spuriously match other kinds of files. */ -#ifdef BFD64 - &demo_64_vec, /* Only compiled if host has long-long support */ -#endif - &ecoff_big_vec, - &ecoff_little_vec, -#if 0 - &ecoffalpha_little_vec, -#endif - &h8300coff_vec, - &h8500coff_vec, -#if 0 - /* Since a.out files lack decent magic numbers, no way to recognize - which kind of a.out file it is. */ - &host_aout_vec, -#endif -#if 0 /* Clashes with sunos_big_vec magic no. */ - &hp300bsd_vec, -#endif - &hp300hpux_vec, -#if defined (HOST_HPPAHPUX) || defined (HOST_HPPABSD) || defined (HOST_HPPAOSF) - &som_vec, -#endif - &i386aout_vec, - &i386bsd_vec, - &i386coff_vec, - &i386freebsd_vec, - &i860coff_vec, - &bfd_powerpc_pe_vec, - &bfd_powerpcle_pe_vec, - &bfd_powerpc_pei_vec, - &bfd_powerpcle_pei_vec, - &go32coff_vec, -#if 0 - /* Since a.out files lack decent magic numbers, no way to recognize - which kind of a.out file it is. */ - &i386linux_vec, -#endif - &i386lynx_aout_vec, - &i386lynx_coff_vec, -#if 0 - /* No distinguishing features for Mach 3 executables. */ - &i386mach3_vec, -#endif - &i386msdos_vec, - &i386netbsd_vec, - &i386os9k_vec, - &i386pe_vec, - &i386pei_vec, - &armcoff_little_vec, - &armcoff_big_vec, - &armpe_little_vec, - &armpe_big_vec, - &armpei_little_vec, - &armpei_big_vec, - &icoff_big_vec, - &icoff_little_vec, - &ieee_vec, - &m68kcoff_vec, - &m68kcoffun_vec, -#if 0 - /* Since a.out files lack decent magic numbers, no way to recognize - which kind of a.out file it is. */ - &m68klinux_vec, -#endif - &m68klynx_aout_vec, - &m68klynx_coff_vec, - &m68knetbsd_vec, - &m88kbcs_vec, - &m88kmach3_vec, - &newsos3_vec, - &nlm32_i386_vec, - &nlm32_sparc_vec, -#ifdef BFD64 - &nlm32_alpha_vec, -#endif - &pc532netbsd_vec, -#if 0 - /* We have no oasys tools anymore, so we can't test any of this - anymore. If you want to test the stuff yourself, go ahead... - steve@cygnus.com - Worse, since there is no magic number for archives, there - can be annoying target mis-matches. */ - &oasys_vec, -#endif - &pc532machaout_vec, -#if 0 - /* We have no way of distinguishing these from other a.out variants */ - &aout_arm_big_vec, - &aout_arm_little_vec, - &riscix_vec, -#endif -#if 0 - /* This has the same magic number as RS/6000. */ - &pmac_xcoff_vec, -#endif - &rs6000coff_vec, - &shcoff_vec, - &shlcoff_vec, - &sparclynx_aout_vec, - &sparclynx_coff_vec, - &sparcnetbsd_vec, - &sunos_big_vec, - &aout0_big_vec, - &tekhex_vec, - &we32kcoff_vec, - &versados_vec, - &z8kcoff_vec, - -#endif /* not SELECT_VECS */ - -/* Always support S-records, for convenience. */ - &srec_vec, - &symbolsrec_vec, -/* And tekhex */ - &tekhex_vec, -/* Likewise for binary output. */ - &binary_vec, -/* Likewise for ihex. */ - &ihex_vec, - -/* Add any required traditional-core-file-handler. */ - -#ifdef AIX386_CORE - &aix386_core_vec, -#endif -#ifdef HPUX_CORE - &hpux_core_vec, -#endif -#ifdef HPPABSD_CORE - &hppabsd_core_vec, -#endif -#ifdef IRIX_CORE - &irix_core_vec, -#endif -#ifdef OSF_CORE - &osf_core_vec, -#endif -#ifdef TRAD_CORE - &trad_core_vec, -#endif - -#ifdef PTRACE_CORE - &ptrace_core_vec, -#endif - - NULL /* end of list marker */ -}; - -/* bfd_default_vector[0] contains either the address of the default vector, - if there is one, or zero if there isn't. */ - -const bfd_target * const bfd_default_vector[] = { -#ifdef DEFAULT_VECTOR - &DEFAULT_VECTOR, -#endif - NULL -}; - -/* When there is an ambiguous match, bfd_check_format_matches puts the - names of the matching targets in an array. This variable is the maximum - number of entries that the array could possibly need. */ -const size_t _bfd_target_vector_entries = sizeof(bfd_target_vector)/sizeof(*bfd_target_vector); - -/* -FUNCTION - bfd_find_target - -SYNOPSIS - const bfd_target *bfd_find_target(CONST char *target_name, bfd *abfd); - -DESCRIPTION - Return a pointer to the transfer vector for the object target - named @var{target_name}. If @var{target_name} is <<NULL>>, choose the - one in the environment variable <<GNUTARGET>>; if that is null or not - defined, then choose the first entry in the target list. - Passing in the string "default" or setting the environment - variable to "default" will cause the first entry in the target - list to be returned, and "target_defaulted" will be set in the - BFD. This causes <<bfd_check_format>> to loop over all the - targets to find the one that matches the file being read. -*/ - -const bfd_target * -bfd_find_target (target_name, abfd) - CONST char *target_name; - bfd *abfd; -{ - const bfd_target * const *target; - extern char *getenv (); - CONST char *targname = (target_name ? target_name : - (CONST char *) getenv ("GNUTARGET")); - - /* This is safe; the vector cannot be null */ - if (targname == NULL || !strcmp (targname, "default")) { - abfd->target_defaulted = true; - return abfd->xvec = bfd_target_vector[0]; - } - - abfd->target_defaulted = false; - - for (target = &bfd_target_vector[0]; *target != NULL; target++) { - if (!strcmp (targname, (*target)->name)) - return abfd->xvec = *target; - } - - bfd_set_error (bfd_error_invalid_target); - return NULL; -} - - -/* -FUNCTION - bfd_target_list - -SYNOPSIS - const char **bfd_target_list(void); - -DESCRIPTION - Return a freshly malloced NULL-terminated - vector of the names of all the valid BFD targets. Do not - modify the names. - -*/ - -const char ** -bfd_target_list () -{ - int vec_length= 0; -#if defined (HOST_HPPAHPUX) && ! defined (__STDC__) - /* The native compiler on the HP9000/700 has a bug which causes it - to loop endlessly when compiling this file. This avoids it. */ - volatile -#endif - const bfd_target * const *target; - CONST char **name_list, **name_ptr; - - for (target = &bfd_target_vector[0]; *target != NULL; target++) - vec_length++; - - name_ptr = name_list = (CONST char **) - bfd_zmalloc ((vec_length + 1) * sizeof (char **)); - - if (name_list == NULL) - return NULL; - - for (target = &bfd_target_vector[0]; *target != NULL; target++) - *(name_ptr++) = (*target)->name; - - return name_list; -} diff --git a/contrib/gdb/bfd/tekhex.c b/contrib/gdb/bfd/tekhex.c deleted file mode 100644 index bf7957e673ab1..0000000000000 --- a/contrib/gdb/bfd/tekhex.c +++ /dev/null @@ -1,1031 +0,0 @@ -/* BFD backend for Extended Tektronix Hex Format objects. - Copyright (C) 1992, 1993, 1994, 1995 Free Software Foundation, Inc. - - Written by Steve Chamberlain of Cygnus Support <sac@cygnus.com>. - -This file is part of BFD, the Binary File Descriptor library. - -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 2 of the License, 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ - -/* -SUBSECTION - Tektronix Hex Format handling - -DESCRIPTION - - Tek Hex records can hold symbols and data, but not - relocations. Their main application is communication with - devices like PROM programmers and ICE equipment. - - It seems that the sections are descibed as being really big, - the example I have says that the text section is 0..ffffffff. - BFD would barf with this, many apps would try to alloc 4GB to - read in the file. - - Tex Hex may contain many sections, but the data which comes in - has no tag saying which section it belongs to, so we create - one section for each block of data, called "blknnnn" which we - stick all the data into. - - TekHex may come out of order and there is no header, so an - initial scan is required to discover the minimum and maximum - addresses used to create the vma and size of the sections we - create. - We read in the data into pages of CHUNK_MASK+1 size and read - them out from that whenever we need to. - - Any number of sections may be created for output, we save them - up and output them when it's time to close the bfd. - - - A TekHex record looks like: -EXAMPLE - %<block length><type><checksum><stuff><cr> - -DESCRIPTION - Where - o length - is the number of bytes in the record not including the % sign. - o type - is one of: - 3) symbol record - 6) data record - 8) termination record - - -The data can come out of order, and may be discontigous. This is a -serial protocol, so big files are unlikely, so we keep a list of 8k chunks -*/ - -#include "bfd.h" -#include "sysdep.h" -#include "libbfd.h" -#include "libiberty.h" - -typedef struct - { - bfd_vma low; - bfd_vma high; - } addr_range_type; - -typedef struct tekhex_symbol_struct - { - - asymbol symbol; - struct tekhex_symbol_struct *prev; - - } tekhex_symbol_type; - -static const char digs[] = "0123456789ABCDEF"; - -static char sum_block[256]; - -#define NOT_HEX 20 -#define NIBBLE(x) hex_value(x) -#define HEX(buffer) ((NIBBLE((buffer)[0])<<4) + NIBBLE((buffer)[1])) -#define TOHEX(d,x) \ -(d)[1] = digs[(x) & 0xf]; \ -(d)[0] = digs[((x)>>4)&0xf]; -#define ISHEX(x) hex_p(x) - -/* -Here's an example -%3A6C6480004E56FFFC4E717063B0AEFFFC6D0652AEFFFC60F24E5E4E75 -%1B3709T_SEGMENT1108FFFFFFFF -%2B3AB9T_SEGMENT7Dgcc_compiled$1087hello$c10 -%373829T_SEGMENT80int$t1$r1$$214741080char$t2$r2$0$12710 -%373769T_SEGMENT80long$int$t3$r1$$1080unsigned$int$t4$10 -%373CA9T_SEGMENT80long$unsigned$in1080short$int$t6$r1$10 -%373049T_SEGMENT80long$long$int$t71080short$unsigned$i10 -%373A29T_SEGMENT80long$long$unsign1080signed$char$t10$10 -%373D69T_SEGMENT80unsigned$char$t11080float$t12$r1$4$010 -%373D19T_SEGMENT80double$t13$r1$8$1080long$double$t14$10 -%2734D9T_SEGMENT8Bvoid$t15$151035_main10 -%2F3CA9T_SEGMENT81$1081$1681$1E81$21487main$F110 -%2832F9T_SEGMENT83i$18FFFFFFFC81$1481$214 -%07 8 10 10 - -explanation: -%3A6C6480004E56FFFC4E717063B0AEFFFC6D0652AEFFFC60F24E5E4E75 - ^ ^^ ^ ^-data - | || +------ 4 char integer 0x8000 - | |+-------- checksum - | +--------- type 6 (data record) - +----------- length 3a chars - <---------------------- 3a (58 chars) -------------------> - -%1B3709T_SEGMENT1108FFFFFFFF - ^ ^^ ^- 8 character integer 0xffffffff - | |+- 1 character integer 0 - | +-- type 1 symbol (section definition) - +------------ 9 char symbol T_SEGMENT - -%2B3AB9T_SEGMENT7Dgcc_compiled$1087hello$c10 -%373829T_SEGMENT80int$t1$r1$$214741080char$t2$r2$0$12710 -%373769T_SEGMENT80long$int$t3$r1$$1080unsigned$int$t4$10 -%373CA9T_SEGMENT80long$unsigned$in1080short$int$t6$r1$10 -%373049T_SEGMENT80long$long$int$t71080short$unsigned$i10 -%373A29T_SEGMENT80long$long$unsign1080signed$char$t10$10 -%373D69T_SEGMENT80unsigned$char$t11080float$t12$r1$4$010 -%373D19T_SEGMENT80double$t13$r1$8$1080long$double$t14$10 -%2734D9T_SEGMENT8Bvoid$t15$151035_main10 -%2F3CA9T_SEGMENT81$1081$1681$1E81$21487main$F110 -%2832F9T_SEGMENT83i$18FFFFFFFC81$1481$214 -%0781010 - -Turns into -sac@thepub$ ./objdump -dx -m m68k f - -f: file format tekhex ------x--- 9/55728 -134219416 Sep 29 15:13 1995 f -architecture: UNKNOWN!, flags 0x00000010: -HAS_SYMS -start address 0x00000000 -SECTION 0 [D00000000] : size 00020000 vma 00000000 align 2**0 - ALLOC, LOAD -SECTION 1 [D00008000] : size 00002001 vma 00008000 align 2**0 - -SECTION 2 [T_SEGMENT] : size ffffffff vma 00000000 align 2**0 - -SYMBOL TABLE: -00000000 g T_SEGMENT gcc_compiled$ -00000000 g T_SEGMENT hello$c -00000000 g T_SEGMENT int$t1$r1$$21474 -00000000 g T_SEGMENT char$t2$r2$0$127 -00000000 g T_SEGMENT long$int$t3$r1$$ -00000000 g T_SEGMENT unsigned$int$t4$ -00000000 g T_SEGMENT long$unsigned$in -00000000 g T_SEGMENT short$int$t6$r1$ -00000000 g T_SEGMENT long$long$int$t7 -00000000 g T_SEGMENT short$unsigned$i -00000000 g T_SEGMENT long$long$unsign -00000000 g T_SEGMENT signed$char$t10$ -00000000 g T_SEGMENT unsigned$char$t1 -00000000 g T_SEGMENT float$t12$r1$4$0 -00000000 g T_SEGMENT double$t13$r1$8$ -00000000 g T_SEGMENT long$double$t14$ -00000000 g T_SEGMENT void$t15$15 -00000000 g T_SEGMENT _main -00000000 g T_SEGMENT $ -00000000 g T_SEGMENT $ -00000000 g T_SEGMENT $ -00000010 g T_SEGMENT $ -00000000 g T_SEGMENT main$F1 -fcffffff g T_SEGMENT i$1 -00000000 g T_SEGMENT $ -00000010 g T_SEGMENT $ - - -RELOCATION RECORDS FOR [D00000000]: (none) - -RELOCATION RECORDS FOR [D00008000]: (none) - -RELOCATION RECORDS FOR [T_SEGMENT]: (none) - -Disassembly of section D00000000: -... -00008000 ($+)7ff0 linkw fp,#-4 -00008004 ($+)7ff4 nop -00008006 ($+)7ff6 movel #99,d0 -00008008 ($+)7ff8 cmpl fp@(-4),d0 -0000800c ($+)7ffc blts 00008014 ($+)8004 -0000800e ($+)7ffe addql #1,fp@(-4) -00008012 ($+)8002 bras 00008006 ($+)7ff6 -00008014 ($+)8004 unlk fp -00008016 ($+)8006 rts -... - -*/ - -static void -tekhex_init () -{ - unsigned int i; - static boolean inited = false; - int val; - - if (inited == false) - { - inited = true; - hex_init (); - val = 0; - for (i = 0; i < 10; i++) - { - sum_block[i + '0'] = val++; - } - for (i = 'A'; i <= 'Z'; i++) - { - sum_block[i] = val++; - } - sum_block['$'] = val++; - sum_block['%'] = val++; - sum_block['.'] = val++; - sum_block['_'] = val++; - for (i = 'a'; i <= 'z'; i++) - { - sum_block[i] = val++; - } - } -} - -/* The maximum number of bytes on a line is FF */ -#define MAXCHUNK 0xff -/* The number of bytes we fit onto a line on output */ -#define CHUNK 21 - -/* We cannot output our tekhexords as we see them, we have to glue them - together, this is done in this structure : */ - -struct tekhex_data_list_struct -{ - unsigned char *data; - bfd_vma where; - bfd_size_type size; - struct tekhex_data_list_struct *next; - -}; -typedef struct tekhex_data_list_struct tekhex_data_list_type; - -#define CHUNK_MASK 0x1fff - -struct data_struct - { - char chunk_data[CHUNK_MASK + 1]; - char chunk_init[CHUNK_MASK + 1]; - bfd_vma vma; - struct data_struct *next; - }; - -typedef struct tekhex_data_struct -{ - tekhex_data_list_type *head; - unsigned int type; - struct tekhex_symbol_struct *symbols; - struct data_struct *data; -} tdata_type; - -#define enda(x) (x->vma + x->size) - -static bfd_vma -getvalue (srcp) - char **srcp; -{ - char *src = *srcp; - bfd_vma value = 0; - unsigned int len = hex_value(*src++); - - if (len == 0) - len = 16; - while (len--) - { - value = value << 4 | hex_value(*src++); - } - *srcp = src; - return value; -} - -static unsigned int -getsym (dstp, srcp) - char *dstp; - char **srcp; -{ - char *src = *srcp; - unsigned int i; - unsigned int len = hex_value(*src++); - - if (len == 0) - len = 16; - for (i = 0; i < len; i++) - dstp[i] = src[i]; - dstp[i] = 0; - *srcp = src + i; - return len; -} - -struct data_struct * -find_chunk (abfd, vma) - bfd *abfd; - bfd_vma vma; -{ - struct data_struct *d = abfd->tdata.tekhex_data->data; - - vma &= ~CHUNK_MASK; - while (d && (d->vma) != vma) - { - d = d->next; - } - if (!d) - { - char *sname = bfd_alloc (abfd, 12); - - /* No chunk for this address, so make one up */ - d = (struct data_struct *) - bfd_alloc (abfd, sizeof (struct data_struct)); - - if (!sname || !d) - return NULL; - - memset (d->chunk_init, 0, CHUNK_MASK + 1); - memset (d->chunk_data, 0, CHUNK_MASK + 1); - d->next = abfd->tdata.tekhex_data->data; - d->vma = vma; - abfd->tdata.tekhex_data->data = d; - } - return d; -} - -static void -insert_byte (abfd, value, addr) - bfd *abfd; - int value; - bfd_vma addr; -{ - /* Find the chunk that this byte needs and put it in */ - struct data_struct *d = find_chunk (abfd, addr); - - d->chunk_data[addr & CHUNK_MASK] = value; - d->chunk_init[addr & CHUNK_MASK] = 1; -} - -/* The first pass is to find the names of all the sections, and see - how big the data is */ -static void -first_phase (abfd, type, src) - bfd *abfd; - char type; - char *src; -{ - asection *section = bfd_abs_section_ptr; - int len; - char sym[17]; /* A symbol can only be 16chars long */ - - switch (type) - { - case '6': - /* Data record - read it and store it */ - { - bfd_vma addr = getvalue (&src); - - while (*src) - { - insert_byte (abfd, HEX (src), addr); - src += 2; - addr++; - } - } - - return; - case '3': - /* Symbol record, read the segment */ - len = getsym (sym, &src); - section = bfd_get_section_by_name (abfd, sym); - if (section == (asection *) NULL) - { - char *n = bfd_alloc (abfd, len + 1); - - if (!n) - abort(); /* FIXME */ - memcpy (n, sym, len + 1); - section = bfd_make_section (abfd, n); - } - while (*src) - { - switch (*src) - { - case '1': /* section range */ - src++; - section->vma = getvalue (&src); - section->_raw_size = getvalue (&src) - section->vma; - section->flags = SEC_HAS_CONTENTS | SEC_LOAD | SEC_ALLOC; - break; - case '0': - case '2': - case '3': - case '4': - case '6': - case '7': - case '8': - /* Symbols, add to section */ - { - tekhex_symbol_type *new = - (tekhex_symbol_type *) bfd_alloc (abfd, - sizeof (tekhex_symbol_type)); - char type = (*src); - - if (!new) - abort(); /* FIXME */ - new->symbol.the_bfd = abfd; - src++; - abfd->symcount++; - abfd->flags |= HAS_SYMS; - new->prev = abfd->tdata.tekhex_data->symbols; - abfd->tdata.tekhex_data->symbols = new; - len = getsym (sym, &src); - new->symbol.name = bfd_alloc (abfd, len + 1); - if (!new->symbol.name) - abort(); /* FIXME */ - memcpy ((char *) (new->symbol.name), sym, len + 1); - new->symbol.section = section; - if (type <= '4') - new->symbol.flags = (BSF_GLOBAL | BSF_EXPORT); - else - new->symbol.flags = BSF_LOCAL; - new->symbol.value = getvalue (&src) - section->vma; - } - } - } - } -} - -/* Pass over an tekhex, calling one of the above functions on each - record. */ - -static void - pass_over (abfd, func) - bfd *abfd; - void (*func) (); -{ - unsigned int chars_on_line; - boolean eof = false; - - /* To the front of the file */ - if (bfd_seek (abfd, (file_ptr) 0, SEEK_SET) != 0) - abort (); - while (eof == false) - { - char buffer[MAXCHUNK]; - char *src = buffer; - char type; - - /* Find first '%' */ - eof = (boolean) (bfd_read (src, 1, 1, abfd) != 1); - while (*src != '%' && !eof) - { - eof = (boolean) (bfd_read (src, 1, 1, abfd) != 1); - } - if (eof) - break; - src++; - - /* Fetch the type and the length and the checksum */ - if (bfd_read (src, 1, 5, abfd) != 5) - abort (); /* FIXME */ - - type = src[2]; - - if (!ISHEX (src[0]) || !ISHEX (src[1])) - break; - - chars_on_line = HEX (src) - 5; /* Already read five char */ - - if (bfd_read (src, 1, chars_on_line, abfd) != chars_on_line) - abort (); /* FIXME */ - src[chars_on_line] = 0; /* put a null at the end */ - - func (abfd, type, src); - } - -} - -long -tekhex_get_symtab (abfd, table) - bfd *abfd; - asymbol **table; - -{ - tekhex_symbol_type *p = abfd->tdata.tekhex_data->symbols; - unsigned int c = bfd_get_symcount (abfd); - - table[c] = 0; - while (p) - { - table[--c] = &(p->symbol); - p = p->prev; - } - - return bfd_get_symcount (abfd); -} - -long -tekhex_get_symtab_upper_bound (abfd) - bfd *abfd; -{ - return (abfd->symcount + 1) * (sizeof (struct tekhex_asymbol_struct *)); - -} - -static boolean -tekhex_mkobject (abfd) - bfd *abfd; -{ - tdata_type *tdata = (tdata_type *) bfd_alloc (abfd, sizeof (tdata_type)); - - if (!tdata) - return false; - abfd->tdata.tekhex_data = tdata; - tdata->type = 1; - tdata->head = (tekhex_data_list_type *) NULL; - tdata->symbols = (struct tekhex_symbol_struct *) NULL; - tdata->data = (struct data_struct *) NULL; - return true; -} - -/* - Return true if the file looks like it's in TekHex format. Just look - for a percent sign and some hex digits */ - -static const bfd_target * -tekhex_object_p (abfd) - bfd *abfd; -{ - char b[4]; - - tekhex_init (); - - if (bfd_seek (abfd, (file_ptr) 0, SEEK_SET) != 0 - || bfd_read (b, 1, 4, abfd) != 4) - return NULL; - - if (b[0] != '%' || !ISHEX (b[1]) || !ISHEX (b[2]) || !ISHEX (b[3])) - return (const bfd_target *) NULL; - - tekhex_mkobject (abfd); - - pass_over (abfd, first_phase); - return abfd->xvec; -} - -static void -move_section_contents (abfd, section, locationp, offset, count, get) - bfd *abfd; - asection *section; - PTR locationp; - file_ptr offset; - bfd_size_type count; - boolean get; -{ - bfd_vma addr; - char *location = (char *) locationp; - bfd_vma prev_number = 1; /* Nothing can have this as a high bit*/ - struct data_struct *d = (struct data_struct *) NULL; - - for (addr = section->vma; count != 0; count--, addr++) - { - - bfd_vma chunk_number = addr & ~CHUNK_MASK; /* Get high bits of address */ - bfd_vma low_bits = addr & CHUNK_MASK; - - if (chunk_number != prev_number) - { - /* Different chunk, so move pointer */ - d = find_chunk (abfd, chunk_number); - } - - if (get) - { - if (d->chunk_init[low_bits]) - { - *location = d->chunk_data[low_bits]; - } - else - { - *location = 0; - } - } - else - { - d->chunk_data[low_bits] = *location; - d->chunk_init[low_bits] = (*location != 0); - } - - location++; - - } - -} -static boolean -tekhex_get_section_contents (abfd, section, locationp, offset, count) - bfd *abfd; - asection *section; - PTR locationp; - file_ptr offset; - bfd_size_type count; -{ - if (section->flags & (SEC_LOAD | SEC_ALLOC)) - { - move_section_contents (abfd, section, locationp, offset, count, true); - return true; - } - else - return false; -} - -boolean -tekhex_set_arch_mach (abfd, arch, machine) - bfd *abfd; - enum bfd_architecture arch; - unsigned long machine; -{ - return bfd_default_set_arch_mach (abfd, arch, machine); -} - -/* we have to save up all the Tekhexords for a splurge before output, - */ - -static boolean -tekhex_set_section_contents (abfd, section, locationp, offset, bytes_to_do) - bfd *abfd; - sec_ptr section; - PTR locationp; - file_ptr offset; - bfd_size_type bytes_to_do; -{ - - if (abfd->output_has_begun == false) - { - /* The first time around, allocate enough sections to hold all the chunks */ - asection *s = abfd->sections; - bfd_vma vma; - - for (s = abfd->sections; s; s = s->next) - { - if (s->flags & SEC_LOAD) - { - for (vma = s->vma & ~CHUNK_MASK; - vma < s->vma + s->_raw_size; - vma += CHUNK_MASK) - find_chunk (abfd, vma); - } - } - - } - if (section->flags & (SEC_LOAD | SEC_ALLOC)) - { - move_section_contents (abfd, section, locationp, offset, bytes_to_do, false); - return true; - } - else - return false; - -} - -static void -writevalue (dst, value) - char **dst; - bfd_vma value; -{ - char *p = *dst; - int len; - int shift; - - for (len = 8, shift = 28; shift; shift -= 4, len--) - { - if ((value >> shift) & 0xf) - { - *p++ = len + '0'; - while (len) - { - *p++ = digs[(value >> shift) & 0xf]; - shift -= 4; - len--; - } - *dst = p; - return; - - } - } - *p++ = '1'; - *p++ = '0'; - *dst = p; -} - -static void -writesym (dst, sym) - char **dst; - CONST char *sym; -{ - char *p = *dst; - int len = (sym ? strlen (sym) : 0); - - if (len >= 16) - { - *p++ = '0'; - len = 16; - } - - else - { - if (len == 0) - { - *p++ = '1'; - sym = "$"; - len = 1; - } - else - { - *p++ = digs[len]; - } - } - - while (len--) - { - *p++ = *sym++; - } - *dst = p; -} - -static void -out (abfd, type, start, end) - bfd *abfd; - char type; - char *start; - char *end; -{ - int sum = 0; - char *s; - char front[6]; - bfd_size_type wrlen; - - front[0] = '%'; - TOHEX (front + 1, end - start + 5); - front[3] = type; - - for (s = start; s < end; s++) - { - sum += sum_block[(unsigned char) *s]; - } - - sum += sum_block[(unsigned char) front[1]]; /* length */ - sum += sum_block[(unsigned char) front[2]]; - sum += sum_block[(unsigned char) front[3]]; /* type */ - TOHEX (front + 4, sum); - if (bfd_write (front, 1, 6, abfd) != 6) - abort (); - end[0] = '\n'; - wrlen = end - start + 1; - if (bfd_write (start, 1, wrlen, abfd) != wrlen) - abort (); -} - -static boolean -tekhex_write_object_contents (abfd) - bfd *abfd; -{ - int bytes_written; - char buffer[100]; - asymbol **p; - asection *s; - struct data_struct *d; - - bytes_written = 0; - - /* And the raw data */ - for (d = abfd->tdata.tekhex_data->data; - d != (struct data_struct *) NULL; - d = d->next) - { - int low; - - CONST int span = 32; - int addr; - - /* Write it in blocks of 32 bytes */ - - for (addr = 0; addr < CHUNK_MASK + 1; addr += span) - { - int need = 0; - - /* Check to see if necessary */ - for (low = 0; !need && low < span; low++) - { - if (d->chunk_init[addr + low]) - need = 1; - } - if (need) - { - char *dst = buffer; - - writevalue (&dst, addr + d->vma); - for (low = 0; low < span; low++) - { - TOHEX (dst, d->chunk_data[addr + low]); - dst += 2; - } - out (abfd, '6', buffer, dst); - } - } - } - /* write all the section headers for the sections */ - for (s = abfd->sections; s != (asection *) NULL; s = s->next) - { - char *dst = buffer; - - writesym (&dst, s->name); - *dst++ = '1'; - writevalue (&dst, s->vma); - writevalue (&dst, s->vma + s->_raw_size); - out (abfd, '3', buffer, dst); - } - - /* And the symbols */ - for (p = abfd->outsymbols; *p; p++) - { - int section_code = bfd_decode_symclass (*p); - - if (section_code != '?') - { /* do not include debug symbols */ - asymbol *s = *p; - char *dst = buffer; - - writesym (&dst, s->section->name); - - switch (section_code) - { - case 'A': - *dst++ = '2'; - break; - case 'a': - *dst++ = '6'; - break; - case 'D': - case 'B': - case 'O': - *dst++ = '4'; - break; - case 'd': - case 'b': - case 'o': - *dst++ = '8'; - break; - case 'T': - *dst++ = '3'; - break; - case 't': - *dst++ = '7'; - break; - case 'C': - case 'U': - bfd_set_error (bfd_error_wrong_format); - return false; - } - - writesym (&dst, s->name); - writevalue (&dst, s->value + s->section->vma); - out (abfd, '3', buffer, dst); - } - } - - /* And the terminator */ - if (bfd_write ("%0781010\n", 1, 9, abfd) != 9) - abort (); - return true; -} - -static int - tekhex_sizeof_headers (abfd, exec) - bfd *abfd; - boolean exec; - -{ - return 0; -} - -static asymbol * -tekhex_make_empty_symbol (abfd) - bfd *abfd; -{ - tekhex_symbol_type *new = - (tekhex_symbol_type *) bfd_zalloc (abfd, sizeof (struct tekhex_symbol_struct)); - - if (!new) - return NULL; - new->symbol.the_bfd = abfd; - new->prev = (struct tekhex_symbol_struct *) NULL; - return &(new->symbol); -} - -static void -tekhex_get_symbol_info (ignore_abfd, symbol, ret) - bfd *ignore_abfd; - asymbol *symbol; - symbol_info *ret; -{ - bfd_symbol_info (symbol, ret); -} - -static void -tekhex_print_symbol (ignore_abfd, filep, symbol, how) - bfd *ignore_abfd; - PTR filep; - asymbol *symbol; - bfd_print_symbol_type how; -{ - FILE *file = (FILE *) filep; - - switch (how) - { - case bfd_print_symbol_name: - fprintf (file, "%s", symbol->name); - break; - case bfd_print_symbol_more: - break; - - case bfd_print_symbol_all: - { - CONST char *section_name = symbol->section->name; - - bfd_print_symbol_vandf ((PTR) file, symbol); - - fprintf (file, " %-5s %s", - section_name, - symbol->name); - } - } -} - -#define tekhex_close_and_cleanup _bfd_generic_close_and_cleanup -#define tekhex_bfd_free_cached_info _bfd_generic_bfd_free_cached_info -#define tekhex_new_section_hook _bfd_generic_new_section_hook - -#define tekhex_bfd_is_local_label bfd_generic_is_local_label -#define tekhex_get_lineno _bfd_nosymbols_get_lineno -#define tekhex_find_nearest_line _bfd_nosymbols_find_nearest_line -#define tekhex_bfd_make_debug_symbol _bfd_nosymbols_bfd_make_debug_symbol -#define tekhex_read_minisymbols _bfd_generic_read_minisymbols -#define tekhex_minisymbol_to_symbol _bfd_generic_minisymbol_to_symbol - -#define tekhex_bfd_get_relocated_section_contents \ - bfd_generic_get_relocated_section_contents -#define tekhex_bfd_relax_section bfd_generic_relax_section -#define tekhex_bfd_link_hash_table_create _bfd_generic_link_hash_table_create -#define tekhex_bfd_link_add_symbols _bfd_generic_link_add_symbols -#define tekhex_bfd_final_link _bfd_generic_final_link -#define tekhex_bfd_link_split_section _bfd_generic_link_split_section - -#define tekhex_get_section_contents_in_window \ - _bfd_generic_get_section_contents_in_window - -const bfd_target tekhex_vec = -{ - "tekhex", /* name */ - bfd_target_tekhex_flavour, - BFD_ENDIAN_UNKNOWN, /* target byte order */ - BFD_ENDIAN_UNKNOWN, /* target headers byte order */ - (EXEC_P | /* object flags */ - HAS_SYMS | HAS_LINENO | HAS_DEBUG | HAS_RELOC | HAS_LOCALS | - WP_TEXT | D_PAGED), - (SEC_CODE | SEC_DATA | SEC_ROM | SEC_HAS_CONTENTS - | SEC_ALLOC | SEC_LOAD | SEC_RELOC), /* section flags */ - 0, /* leading underscore */ - ' ', /* ar_pad_char */ - 16, /* ar_max_namelen */ - bfd_getb64, bfd_getb_signed_64, bfd_putb64, - bfd_getb32, bfd_getb_signed_32, bfd_putb32, - bfd_getb16, bfd_getb_signed_16, bfd_putb16, /* data */ - bfd_getb64, bfd_getb_signed_64, bfd_putb64, - bfd_getb32, bfd_getb_signed_32, bfd_putb32, - bfd_getb16, bfd_getb_signed_16, bfd_putb16, /* hdrs */ - - { - _bfd_dummy_target, - tekhex_object_p, /* bfd_check_format */ - _bfd_dummy_target, - _bfd_dummy_target, - }, - { - bfd_false, - tekhex_mkobject, - _bfd_generic_mkarchive, - bfd_false, - }, - { /* bfd_write_contents */ - bfd_false, - tekhex_write_object_contents, - _bfd_write_archive_contents, - bfd_false, - }, - - BFD_JUMP_TABLE_GENERIC (tekhex), - BFD_JUMP_TABLE_COPY (_bfd_generic), - BFD_JUMP_TABLE_CORE (_bfd_nocore), - BFD_JUMP_TABLE_ARCHIVE (_bfd_noarchive), - BFD_JUMP_TABLE_SYMBOLS (tekhex), - BFD_JUMP_TABLE_RELOCS (_bfd_norelocs), - BFD_JUMP_TABLE_WRITE (tekhex), - BFD_JUMP_TABLE_LINK (tekhex), - BFD_JUMP_TABLE_DYNAMIC (_bfd_nodynamic), - - (PTR) 0 -}; diff --git a/contrib/gdb/bfd/trad-core.c b/contrib/gdb/bfd/trad-core.c deleted file mode 100644 index 09c74ae481cdc..0000000000000 --- a/contrib/gdb/bfd/trad-core.c +++ /dev/null @@ -1,316 +0,0 @@ -/* BFD back end for traditional Unix core files (U-area and raw sections) - Copyright 1988, 1989, 1991, 1992, 1993, 1994 Free Software Foundation, Inc. - Written by John Gilmore of Cygnus Support. - -This file is part of BFD, the Binary File Descriptor library. - -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 2 of the License, 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ - -#include "bfd.h" -#include "sysdep.h" -#include "libbfd.h" -#include "libaout.h" /* BFD a.out internal data structures */ - -#include <stdio.h> -#include <sys/types.h> -#include <sys/param.h> -#include <sys/dir.h> -#include <signal.h> - -#include <sys/user.h> /* After a.out.h */ - -#ifdef TRAD_HEADER -#include TRAD_HEADER -#endif - - struct trad_core_struct - { - asection *data_section; - asection *stack_section; - asection *reg_section; - struct user u; - }; - -#define core_upage(bfd) (&((bfd)->tdata.trad_core_data->u)) -#define core_datasec(bfd) ((bfd)->tdata.trad_core_data->data_section) -#define core_stacksec(bfd) ((bfd)->tdata.trad_core_data->stack_section) -#define core_regsec(bfd) ((bfd)->tdata.trad_core_data->reg_section) - -/* forward declarations */ - -const bfd_target *trad_unix_core_file_p PARAMS ((bfd *abfd)); -char * trad_unix_core_file_failing_command PARAMS ((bfd *abfd)); -int trad_unix_core_file_failing_signal PARAMS ((bfd *abfd)); -boolean trad_unix_core_file_matches_executable_p - PARAMS ((bfd *core_bfd, bfd *exec_bfd)); - -/* Handle 4.2-style (and perhaps also sysV-style) core dump file. */ - -/* ARGSUSED */ -const bfd_target * -trad_unix_core_file_p (abfd) - bfd *abfd; - -{ - int val; - struct user u; - struct trad_core_struct *rawptr; - -#ifdef TRAD_CORE_USER_OFFSET - /* If defined, this macro is the file position of the user struct. */ - if (bfd_seek (abfd, TRAD_CORE_USER_OFFSET, SEEK_SET) != 0) - return 0; -#endif - - val = bfd_read ((void *)&u, 1, sizeof u, abfd); - if (val != sizeof u) - { - /* Too small to be a core file */ - bfd_set_error (bfd_error_wrong_format); - return 0; - } - - /* Sanity check perhaps??? */ - if (u.u_dsize > 0x1000000) /* Remember, it's in pages... */ - { - bfd_set_error (bfd_error_wrong_format); - return 0; - } - if (u.u_ssize > 0x1000000) - { - bfd_set_error (bfd_error_wrong_format); - return 0; - } - - /* Check that the size claimed is no greater than the file size. */ - { - FILE *stream = bfd_cache_lookup (abfd); - struct stat statbuf; - if (stream == NULL) - return 0; - if (fstat (fileno (stream), &statbuf) < 0) - { - bfd_set_error (bfd_error_system_call); - return 0; - } - if (NBPG * (UPAGES + u.u_dsize -#ifdef TRAD_CORE_DSIZE_INCLUDES_TSIZE - - u.u_tsize -#endif - + u.u_ssize) > statbuf.st_size) - { - bfd_set_error (bfd_error_file_truncated); - return 0; - } -#ifndef TRAD_CORE_ALLOW_ANY_EXTRA_SIZE - if (NBPG * (UPAGES + u.u_dsize + u.u_ssize) -#ifdef TRAD_CORE_EXTRA_SIZE_ALLOWED - /* Some systems write the file too big. */ - + TRAD_CORE_EXTRA_SIZE_ALLOWED -#endif - < statbuf.st_size) - { - /* The file is too big. Maybe it's not a core file - or we otherwise have bad values for u_dsize and u_ssize). */ - bfd_set_error (bfd_error_wrong_format); - return 0; - } -#endif - } - - /* OK, we believe you. You're a core file (sure, sure). */ - - /* Allocate both the upage and the struct core_data at once, so - a single free() will free them both. */ - rawptr = (struct trad_core_struct *) - bfd_zmalloc (sizeof (struct trad_core_struct)); - if (rawptr == NULL) - return 0; - - abfd->tdata.trad_core_data = rawptr; - - rawptr->u = u; /*Copy the uarea into the tdata part of the bfd */ - - /* Create the sections. This is raunchy, but bfd_close wants to free - them separately. */ - - core_stacksec(abfd) = (asection *) bfd_zalloc (abfd, sizeof (asection)); - if (core_stacksec (abfd) == NULL) - return NULL; - core_datasec (abfd) = (asection *) bfd_zalloc (abfd, sizeof (asection)); - if (core_datasec (abfd) == NULL) - return NULL; - core_regsec (abfd) = (asection *) bfd_zalloc (abfd, sizeof (asection)); - if (core_regsec (abfd) == NULL) - return NULL; - - core_stacksec (abfd)->name = ".stack"; - core_datasec (abfd)->name = ".data"; - core_regsec (abfd)->name = ".reg"; - - core_stacksec (abfd)->flags = SEC_ALLOC + SEC_LOAD + SEC_HAS_CONTENTS; - core_datasec (abfd)->flags = SEC_ALLOC + SEC_LOAD + SEC_HAS_CONTENTS; - core_regsec (abfd)->flags = SEC_HAS_CONTENTS; - - core_datasec (abfd)->_raw_size = NBPG * u.u_dsize -#ifdef TRAD_CORE_DSIZE_INCLUDES_TSIZE - - NBPG * u.u_tsize -#endif - ; - core_stacksec (abfd)->_raw_size = NBPG * u.u_ssize; - core_regsec (abfd)->_raw_size = NBPG * UPAGES; /* Larger than sizeof struct u */ - - /* What a hack... we'd like to steal it from the exec file, - since the upage does not seem to provide it. FIXME. */ -#ifdef HOST_DATA_START_ADDR - core_datasec (abfd)->vma = HOST_DATA_START_ADDR; -#else - core_datasec (abfd)->vma = HOST_TEXT_START_ADDR + (NBPG * u.u_tsize); -#endif - -#ifdef HOST_STACK_START_ADDR - core_stacksec (abfd)->vma = HOST_STACK_START_ADDR; -#else - core_stacksec (abfd)->vma = HOST_STACK_END_ADDR - (NBPG * u.u_ssize); -#endif - - /* This is tricky. As the "register section", we give them the entire - upage and stack. u.u_ar0 points to where "register 0" is stored. - There are two tricks with this, though. One is that the rest of the - registers might be at positive or negative (or both) displacements - from *u_ar0. The other is that u_ar0 is sometimes an absolute address - in kernel memory, and on other systems it is an offset from the beginning - of the `struct user'. - - As a practical matter, we don't know where the registers actually are, - so we have to pass the whole area to GDB. We encode the value of u_ar0 - by setting the .regs section up so that its virtual memory address - 0 is at the place pointed to by u_ar0 (by setting the vma of the start - of the section to -u_ar0). GDB uses this info to locate the regs, - using minor trickery to get around the offset-or-absolute-addr problem. */ - core_regsec (abfd)->vma = 0 - (bfd_vma) u.u_ar0; - - core_datasec (abfd)->filepos = NBPG * UPAGES; - core_stacksec (abfd)->filepos = (NBPG * UPAGES) + NBPG * u.u_dsize -#ifdef TRAD_CORE_DSIZE_INCLUDES_TSIZE - - NBPG * u.u_tsize -#endif - ; - core_regsec (abfd)->filepos = 0; /* Register segment is the upage */ - - /* Align to word at least */ - core_stacksec (abfd)->alignment_power = 2; - core_datasec (abfd)->alignment_power = 2; - core_regsec (abfd)->alignment_power = 2; - - abfd->sections = core_stacksec (abfd); - core_stacksec (abfd)->next = core_datasec (abfd); - core_datasec (abfd)->next = core_regsec (abfd); - abfd->section_count = 3; - - return abfd->xvec; -} - -char * -trad_unix_core_file_failing_command (abfd) - bfd *abfd; -{ -#ifndef NO_CORE_COMMAND - char *com = abfd->tdata.trad_core_data->u.u_comm; - if (*com) - return com; - else -#endif - return 0; -} - -/* ARGSUSED */ -int -trad_unix_core_file_failing_signal (ignore_abfd) - bfd *ignore_abfd; -{ -#ifdef TRAD_UNIX_CORE_FILE_FAILING_SIGNAL - return TRAD_UNIX_CORE_FILE_FAILING_SIGNAL(ignore_abfd); -#else - return -1; /* FIXME, where is it? */ -#endif -} - -/* ARGSUSED */ -boolean -trad_unix_core_file_matches_executable_p (core_bfd, exec_bfd) - bfd *core_bfd, *exec_bfd; -{ - return true; /* FIXME, We have no way of telling at this point */ -} - -/* If somebody calls any byte-swapping routines, shoot them. */ -void -swap_abort() -{ - abort(); /* This way doesn't require any declaration for ANSI to fuck up */ -} -#define NO_GET ((bfd_vma (*) PARAMS (( const bfd_byte *))) swap_abort ) -#define NO_PUT ((void (*) PARAMS ((bfd_vma, bfd_byte *))) swap_abort ) -#define NO_SIGNED_GET \ - ((bfd_signed_vma (*) PARAMS ((const bfd_byte *))) swap_abort ) - -const bfd_target trad_core_vec = - { - "trad-core", - bfd_target_unknown_flavour, - BFD_ENDIAN_UNKNOWN, /* target byte order */ - BFD_ENDIAN_UNKNOWN, /* target headers byte order */ - (HAS_RELOC | EXEC_P | /* object flags */ - HAS_LINENO | HAS_DEBUG | - HAS_SYMS | HAS_LOCALS | WP_TEXT | D_PAGED), - (SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD | SEC_RELOC), /* section flags */ - 0, /* symbol prefix */ - ' ', /* ar_pad_char */ - 16, /* ar_max_namelen */ - NO_GET, NO_SIGNED_GET, NO_PUT, /* 64 bit data */ - NO_GET, NO_SIGNED_GET, NO_PUT, /* 32 bit data */ - NO_GET, NO_SIGNED_GET, NO_PUT, /* 16 bit data */ - NO_GET, NO_SIGNED_GET, NO_PUT, /* 64 bit hdrs */ - NO_GET, NO_SIGNED_GET, NO_PUT, /* 32 bit hdrs */ - NO_GET, NO_SIGNED_GET, NO_PUT, /* 16 bit hdrs */ - - { /* bfd_check_format */ - _bfd_dummy_target, /* unknown format */ - _bfd_dummy_target, /* object file */ - _bfd_dummy_target, /* archive */ - trad_unix_core_file_p /* a core file */ - }, - { /* bfd_set_format */ - bfd_false, bfd_false, - bfd_false, bfd_false - }, - { /* bfd_write_contents */ - bfd_false, bfd_false, - bfd_false, bfd_false - }, - - BFD_JUMP_TABLE_GENERIC (_bfd_generic), - BFD_JUMP_TABLE_COPY (_bfd_generic), - BFD_JUMP_TABLE_CORE (trad_unix), - BFD_JUMP_TABLE_ARCHIVE (_bfd_noarchive), - BFD_JUMP_TABLE_SYMBOLS (_bfd_nosymbols), - BFD_JUMP_TABLE_RELOCS (_bfd_norelocs), - BFD_JUMP_TABLE_WRITE (_bfd_generic), - BFD_JUMP_TABLE_LINK (_bfd_nolink), - BFD_JUMP_TABLE_DYNAMIC (_bfd_nodynamic), - - (PTR) 0 /* backend_data */ -}; diff --git a/contrib/gdb/bfd/versados.c b/contrib/gdb/bfd/versados.c deleted file mode 100644 index 84ad114e90a2c..0000000000000 --- a/contrib/gdb/bfd/versados.c +++ /dev/null @@ -1,906 +0,0 @@ -/* BFD back-end for VERSAdos-E objects. - - Versados is a Motorola trademark. - - Copyright 1995 Free Software Foundation, Inc. - Written by Steve Chamberlain of Cygnus Support <sac@cygnus.com>. - - This file is part of BFD, the Binary File Descriptor library. - - 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 2 of the License, 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ - -/* - SUBSECTION - VERSAdos-E relocateable object file format - - DESCRIPTION - - This module supports reading of VERSAdos relocateable - object files. - - A VERSAdos file looks like contains - - o Indentification Record - o External Symbol Definition Record - o Object Text Recrod - o End Record - - - */ - -#include "bfd.h" -#include "sysdep.h" -#include "libbfd.h" -#include "libiberty.h" - - -static boolean versados_mkobject PARAMS ((bfd *)); -static boolean versados_scan PARAMS ((bfd *)); -static const bfd_target *versados_object_p PARAMS ((bfd *)); - - -#define VHEADER '1' -#define VESTDEF '2' -#define VOTR '3' -#define VEND '4' - - -#define ES_BASE 17 /* first symbol has esdid 17 */ - -/* Per file target dependent information */ - -/* one for each section */ -struct esdid - { - asection *section; /* ptr to bfd version */ - unsigned char *contents; /* used to build image */ - int pc; - int relocs; /* reloc count, valid end of pass 1 */ - int donerel; /* have relocs been translated */ - }; - -typedef struct versados_data_struct - { - int es_done; /* count of symbol index, starts at ES_BASE */ - asymbol *symbols; /* pointer to local symbols */ - char *strings; /* strings of all the above */ - int stringlen; /* len of string table (valid end of pass1) */ - int nsecsyms; /* number of sections */ - - int ndefs; /* number of exported symbols (they dont get esdids) */ - int nrefs; /* number of imported symbols (valid end of pass1) */ - - int ref_idx; /* current processed value of the above */ - int def_idx; - - int pass_2_done; - - struct esdid e[16]; /* per section info */ - int alert; /* to see if we're trampling */ - asymbol *rest[256 - 16]; /* per symbol info */ - - } -tdata_type; - -#define VDATA(abfd) (abfd->tdata.versados_data) -#define EDATA(abfd, n) (abfd->tdata.versados_data->e[n]) -#define RDATA(abfd, n) (abfd->tdata.versados_data->rest[n]) - -struct ext_otr - { - unsigned char size; - char type; - unsigned char map[4]; - unsigned char esdid; - unsigned char data[200]; - }; - -struct ext_vheader - { - unsigned char size; - char type; /* record type */ - char name[10]; /* module name */ - char rev; /* module rev number */ - char lang; - char vol[4]; - char user[2]; - char cat[8]; - char fname[8]; - char ext[2]; - char time[3]; - char date[3]; - char rest[211]; - }; - -struct ext_esd - { - unsigned char size; - char type; - unsigned char esd_entries[1]; - }; -#define ESD_ABS 0 -#define ESD_COMMON 1 -#define ESD_STD_REL_SEC 2 -#define ESD_SHRT_REL_SEC 3 -#define ESD_XDEF_IN_SEC 4 -#define ESD_XREF_SYM 7 -#define ESD_XREF_SEC 6 -#define ESD_XDEF_IN_ABS 5 -union ext_any - { - unsigned char size; - struct ext_vheader header; - struct ext_esd esd; - struct ext_otr otr; - }; - -/* Initialize by filling in the hex conversion array. */ - - - - - -/* Set up the tdata information. */ - -static boolean -versados_mkobject (abfd) - bfd *abfd; -{ - if (abfd->tdata.versados_data == NULL) - { - tdata_type *tdata = (tdata_type *) bfd_alloc (abfd, sizeof (tdata_type)); - if (tdata == NULL) - return false; - abfd->tdata.versados_data = tdata; - tdata->symbols = NULL; - VDATA (abfd)->alert = 0x12345678; - } - - bfd_default_set_arch_mach (abfd, bfd_arch_m68k, 0); - return true; -} - - -/* Report a problem in an S record file. FIXME: This probably should - not call fprintf, but we really do need some mechanism for printing - error messages. */ - - - -static asymbol * -versados_new_symbol (abfd, snum, name, val, sec) - bfd *abfd; - int snum; - const char *name; - bfd_vma val; - asection *sec; -{ - asymbol *n = VDATA (abfd)->symbols + snum; - n->name = name; - n->value = val; - n->section = sec; - n->the_bfd = abfd; - n->flags = 0; - return n; -} - - -static int -get_record (abfd, ptr) - bfd *abfd; - union ext_any *ptr; -{ - bfd_read (&ptr->size, 1, 1, abfd); - if (bfd_read ((char *) ptr + 1, 1, ptr->size, abfd) != ptr->size) - return 0; - return 1; -} - -int -get_4 (pp) - unsigned char **pp; -{ - unsigned char *p = *pp; - *pp += 4; - return (p[0] << 24) | (p[1] << 16) | (p[2] << 8) | (p[3] << 0); -} - -void -get_10 (pp, name) - unsigned char **pp; - char *name; -{ - char *p = (char *) *pp; - int len = 10; - *pp += len; - while (*p != ' ' - && len) - { - *name++ = *p++; - len--; - } - *name = 0; -} - -static char * -new_symbol_string (abfd, name) - bfd *abfd; - char *name; -{ - char *n = VDATA (abfd)->strings; - strcpy (VDATA (abfd)->strings, name); - VDATA (abfd)->strings += strlen (VDATA (abfd)->strings) + 1; - return n; -} - - -static void -process_esd (abfd, esd, pass) - bfd *abfd; - struct ext_esd *esd; - int pass; -{ - /* Read through the ext def for the est entries */ - int togo = esd->size - 2; - bfd_vma size; - bfd_vma start; - asection *sec; - char name[11]; - unsigned char *ptr = esd->esd_entries; - unsigned char *end = ptr + togo; - while (ptr < end) - { - int scn = *ptr & 0xf; - int typ = (*ptr >> 4) & 0xf; - - /* Declare this section */ - sprintf (name, "%d", scn); - sec = bfd_make_section_old_way (abfd, strdup (name)); - sec->target_index = scn; - EDATA (abfd, scn).section = sec; - ptr++; - switch (typ) - { - default: - abort (); - case ESD_XREF_SEC: - case ESD_XREF_SYM: - { - int snum = VDATA (abfd)->ref_idx++; - get_10 (&ptr, name); - if (pass == 1) - { - VDATA (abfd)->stringlen += strlen (name) + 1; - } - else - { - int esidx; - asymbol *s; - char *n = new_symbol_string (abfd, name); - s = versados_new_symbol (abfd, snum, n, 0, - &bfd_und_section, scn); - esidx = VDATA (abfd)->es_done++; - RDATA (abfd, esidx - ES_BASE) = s; - } - } - break; - - - case ESD_ABS: - size = get_4 (&ptr); - start = get_4 (&ptr); - break; - case ESD_STD_REL_SEC: - case ESD_SHRT_REL_SEC: - { - sec->_raw_size = get_4 (&ptr); - sec->flags |= SEC_ALLOC; - } - break; - case ESD_XDEF_IN_ABS: - sec = (asection *) & bfd_abs_section; - case ESD_XDEF_IN_SEC: - { - int snum = VDATA (abfd)->def_idx++; - long val; - get_10 (&ptr, name); - val = get_4 (&ptr); - if (pass == 1) - { - /* Just remember the symbol */ - VDATA (abfd)->stringlen += strlen (name) + 1; - } - else - { - asymbol *s; - char *n = new_symbol_string (abfd, name); - s = versados_new_symbol (abfd, snum + VDATA (abfd)->nrefs, n, val, sec, scn); - s->flags |= BSF_GLOBAL; - } - } - break; - } - } -} - -#define R_RELWORD 1 -#define R_RELLONG 2 -#define R_RELWORD_NEG 3 -#define R_RELLONG_NEG 4 - -reloc_howto_type versados_howto_table[] = -{ - HOWTO (R_RELWORD, 0, 1, 16, false, - 0, complain_overflow_dont, 0, - "+v16", true, 0x0000ffff, 0x0000ffff, false), - HOWTO (R_RELLONG, 0, 2, 32, false, - 0, complain_overflow_dont, 0, - "+v32", true, 0xffffffff, 0xffffffff, false), - - HOWTO (R_RELWORD_NEG, 0, -1, 16, false, - 0, complain_overflow_dont, 0, - "-v16", true, 0x0000ffff, 0x0000ffff, false), - HOWTO (R_RELLONG_NEG, 0, -2, 32, false, - 0, complain_overflow_dont, 0, - "-v32", true, 0xffffffff, 0xffffffff, false), -}; - - -static int -get_offset (len, ptr) - int len; - unsigned char *ptr; -{ - int val = 0; - if (len) - { - int i; - val = *ptr++; - if (val & 0x80) - val |= ~0xff; - for (i = 1; i < len; i++) - val = (val << 8) | *ptr++; - } - - return val; -} - -static void -process_otr (abfd, otr, pass) - bfd *abfd; - struct ext_otr *otr; - int pass; -{ - unsigned long shift; - unsigned char *srcp = otr->data; - unsigned char *endp = (unsigned char *) otr + otr->size; - unsigned int bits = (otr->map[0] << 24) - | (otr->map[1] << 16) - | (otr->map[2] << 8) - | (otr->map[3] << 0); - - struct esdid *esdid = &EDATA (abfd, otr->esdid - 1); - unsigned char *contents = esdid->contents; - int need_contents = 0; - unsigned int dst_idx = esdid->pc; - - for (shift = (1 << 31); shift && srcp < endp; shift >>= 1) - { - if (bits & shift) - { - int flag = *srcp++; - int esdids = (flag >> 5) & 0x7; - int sizeinwords = ((flag >> 3) & 1) ? 2 : 1; - int offsetlen = flag & 0x7; - int j; - - - if (esdids == 0) - { - /* A zero esdid means the new pc is the offset given */ - dst_idx += get_offset (offsetlen, srcp); - srcp += offsetlen; - } - else - { - int val = get_offset (offsetlen, srcp + esdids); - if (pass == 1) - need_contents = 1; - else - for (j = 0; j < sizeinwords * 2; j++) - { - contents[dst_idx + (sizeinwords * 2) - j - 1] = val; - val >>= 8; - } - - for (j = 0; j < esdids; j++) - { - int esdid = *srcp++; - - if (esdid) - { - int rn = EDATA (abfd, otr->esdid - 1).relocs++; - if (pass == 1) - { - /* this is the first pass over the data, - just remember that we need a reloc */ - } - else - { - arelent *n = - EDATA (abfd, otr->esdid - 1).section->relocation + rn; - n->address = dst_idx; - - n->sym_ptr_ptr = (asymbol **) esdid; - n->addend = 0; - n->howto = versados_howto_table + ((j & 1) * 2) + (sizeinwords - 1); - } - } - } - srcp += offsetlen; - dst_idx += sizeinwords * 2; - } - } - else - { - need_contents = 1; - if (dst_idx < esdid->section->_raw_size) - if (pass == 2) - { - /* absolute code, comes in 16 bit lumps */ - contents[dst_idx] = srcp[0]; - contents[dst_idx + 1] = srcp[1]; - } - dst_idx += 2; - srcp += 2; - } - } - EDATA (abfd, otr->esdid - 1).pc = dst_idx; - - if (!contents && need_contents) - esdid->contents = (unsigned char *) bfd_alloc (abfd, esdid->section->_raw_size); - - -} - -static boolean -versados_scan (abfd) - bfd *abfd; -{ - int loop = 1; - int i; - int j; - int nsecs = 0; - - VDATA (abfd)->nrefs = 0; - VDATA (abfd)->ndefs = 0; - VDATA (abfd)->ref_idx = 0; - VDATA (abfd)->def_idx = 0; - - while (loop) - { - union ext_any any; - if (!get_record (abfd, &any)) - return true; - switch (any.header.type) - { - case VHEADER: - break; - case VEND: - loop = 0; - break; - case VESTDEF: - process_esd (abfd, &any.esd, 1); - break; - case VOTR: - process_otr (abfd, &any.otr, 1); - break; - } - } - - /* Now allocate space for the relocs and sections */ - - VDATA (abfd)->nrefs = VDATA (abfd)->ref_idx; - VDATA (abfd)->ndefs = VDATA (abfd)->def_idx; - VDATA (abfd)->ref_idx = 0; - VDATA (abfd)->def_idx = 0; - - abfd->symcount = VDATA (abfd)->nrefs + VDATA (abfd)->ndefs; - - for (i = 0; i < 16; i++) - { - struct esdid *esdid = &EDATA (abfd, i); - if (esdid->section) - { - esdid->section->relocation - = (arelent *) bfd_alloc (abfd, sizeof (arelent) * esdid->relocs); - - esdid->pc = 0; - - if (esdid->contents) - esdid->section->flags |= SEC_HAS_CONTENTS | SEC_LOAD; - - esdid->section->reloc_count = esdid->relocs; - if (esdid->relocs) - esdid->section->flags |= SEC_RELOC; - - esdid->relocs = 0; - - /* Add an entry into the symbol table for it */ - nsecs++; - VDATA (abfd)->stringlen += strlen (esdid->section->name) + 1; - } - } - - abfd->symcount += nsecs; - - VDATA (abfd)->symbols = (asymbol *) bfd_alloc (abfd, - sizeof (asymbol) * (abfd->symcount)); - - VDATA (abfd)->strings = bfd_alloc (abfd, VDATA (abfd)->stringlen); - - - /* Actually fill in the section symbols, - we stick them at the end of the table */ - - for (j = VDATA (abfd)->nrefs + VDATA (abfd)->ndefs, i = 0; i < 16; i++) - { - struct esdid *esdid = &EDATA (abfd, i); - asection *sec = esdid->section; - if (sec) - { - asymbol *s = VDATA (abfd)->symbols + j; - s->name = new_symbol_string (abfd, sec->name); - s->section = sec; - s->flags = BSF_LOCAL; - s->value = 0; - s->the_bfd = abfd; - j++; - } - } - if (abfd->symcount) - abfd->flags |= HAS_SYMS; - - /* Set this to nsecs - since we've already planted the section - symbols */ - VDATA (abfd)->nsecsyms = nsecs; - - VDATA (abfd)->ref_idx = 0; - - return 1; -} - - - -/* Check whether an existing file is a versados file. */ - -static const bfd_target * -versados_object_p (abfd) - bfd *abfd; -{ - struct ext_vheader ext; - unsigned char len; - - if (bfd_seek (abfd, (file_ptr) 0, SEEK_SET)) - return NULL; - - - bfd_read (&len, 1, 1, abfd); - if (bfd_read (&ext.type, 1, len, abfd) != len - || ext.type != '1') - { - bfd_set_error (bfd_error_wrong_format); - return NULL; - } - - /* ok, looks like a record, build the tdata and read - in.. */ - - if (!versados_mkobject (abfd) - || !versados_scan (abfd)) - return NULL; - - return abfd->xvec; -} - - -static boolean -versados_pass_2 (abfd) - bfd *abfd; -{ - union ext_any any; - - if (VDATA (abfd)->pass_2_done) - return 1; - - if (bfd_seek (abfd, 0, SEEK_SET) != 0) - return 0; - - VDATA (abfd)->es_done = ES_BASE; - - - /* read records till we get to where we want to be */ - - while (1) - { - get_record (abfd, &any); - switch (any.header.type) - { - case VEND: - VDATA (abfd)->pass_2_done = 1; - return 1; - case VESTDEF: - process_esd (abfd, &any.esd, 2); - break; - case VOTR: - process_otr (abfd, &any.otr, 2); - break; - } - } -} - -static boolean -versados_get_section_contents (abfd, section, location, offset, count) - bfd *abfd; - asection *section; - PTR location; - file_ptr offset; - bfd_size_type count; -{ - if (!versados_pass_2 (abfd)) - return false; - - memcpy (location, - EDATA (abfd, section->target_index).contents + offset, - (size_t) count); - - return true; -} - -#define versados_get_section_contents_in_window \ - _bfd_generic_get_section_contents_in_window - -static boolean -versados_set_section_contents (abfd, section, location, offset, bytes_to_do) - bfd *abfd; - sec_ptr section; - PTR location; - file_ptr offset; - bfd_size_type bytes_to_do; -{ - return false; -} - - -/*ARGSUSED */ -static int -versados_sizeof_headers (abfd, exec) - bfd *abfd; - boolean exec; -{ - return 0; -} - -static asymbol * -versados_make_empty_symbol (abfd) - bfd *abfd; -{ - asymbol *new = (asymbol *) bfd_zalloc (abfd, sizeof (asymbol)); - if (new) - new->the_bfd = abfd; - return new; -} - -/* Return the amount of memory needed to read the symbol table. */ - -static long -versados_get_symtab_upper_bound (abfd) - bfd *abfd; -{ - return (bfd_get_symcount (abfd) + 1) * sizeof (asymbol *); -} - -/* Return the symbol table. */ - -static long -versados_get_symtab (abfd, alocation) - bfd *abfd; - asymbol **alocation; -{ - unsigned int symcount = bfd_get_symcount (abfd); - unsigned int i; - asymbol *s; - - versados_pass_2 (abfd); - - for (i = 0, s = VDATA (abfd)->symbols; - i < symcount; - s++, i++) - { - *alocation++ = s; - } - - *alocation = NULL; - - return symcount; -} - -/*ARGSUSED */ -void -versados_get_symbol_info (ignore_abfd, symbol, ret) - bfd *ignore_abfd; - asymbol *symbol; - symbol_info *ret; -{ - bfd_symbol_info (symbol, ret); -} - -/*ARGSUSED */ -void -versados_print_symbol (ignore_abfd, afile, symbol, how) - bfd *ignore_abfd; - PTR afile; - asymbol *symbol; - bfd_print_symbol_type how; -{ - FILE *file = (FILE *) afile; - switch (how) - { - case bfd_print_symbol_name: - fprintf (file, "%s", symbol->name); - break; - default: - bfd_print_symbol_vandf ((PTR) file, symbol); - fprintf (file, " %-5s %s", - symbol->section->name, - symbol->name); - - } -} - -long -versados_get_reloc_upper_bound (abfd, asect) - bfd *abfd; - sec_ptr asect; -{ - return (asect->reloc_count + 1) * sizeof (arelent *); -} - - -long -versados_canonicalize_reloc (abfd, section, relptr, symbols) - bfd *abfd; - sec_ptr section; - arelent **relptr; - asymbol **symbols; -{ - unsigned int count; - arelent *src; - - versados_pass_2 (abfd); - src = section->relocation; - if (!EDATA (abfd, section->target_index).donerel) - { - EDATA (abfd, section->target_index).donerel = 1; - /* translate from indexes to symptr ptrs */ - for (count = 0; count < section->reloc_count; count++) - { - int esdid = (int) src[count].sym_ptr_ptr; - - if (esdid == 0) - { - src[count].sym_ptr_ptr = bfd_abs_section.symbol_ptr_ptr; - } - else if (esdid < ES_BASE) /* Section relative thing */ - { - struct esdid *e = &EDATA (abfd, esdid - 1); - if (!section) - { - /** relocation relative to section which was - never declared ! */ - } - src[count].sym_ptr_ptr = e->section->symbol_ptr_ptr; - } - else - { - src[count].sym_ptr_ptr = symbols + esdid - ES_BASE; - } - - } - } - - for (count = 0; count < section->reloc_count; count++) - { - *relptr++ = src++; - } - *relptr = 0; - return section->reloc_count; -} - -#define versados_close_and_cleanup _bfd_generic_close_and_cleanup -#define versados_bfd_free_cached_info _bfd_generic_bfd_free_cached_info -#define versados_new_section_hook _bfd_generic_new_section_hook - -#define versados_bfd_is_local_label bfd_generic_is_local_label -#define versados_get_lineno _bfd_nosymbols_get_lineno -#define versados_find_nearest_line _bfd_nosymbols_find_nearest_line -#define versados_bfd_make_debug_symbol _bfd_nosymbols_bfd_make_debug_symbol -#define versados_read_minisymbols _bfd_generic_read_minisymbols -#define versados_minisymbol_to_symbol _bfd_generic_minisymbol_to_symbol - -#define versados_bfd_reloc_type_lookup _bfd_norelocs_bfd_reloc_type_lookup - -#define versados_set_arch_mach bfd_default_set_arch_mach - -#define versados_bfd_get_relocated_section_contents \ - bfd_generic_get_relocated_section_contents -#define versados_bfd_relax_section bfd_generic_relax_section -#define versados_bfd_link_hash_table_create _bfd_generic_link_hash_table_create -#define versados_bfd_link_add_symbols _bfd_generic_link_add_symbols -#define versados_bfd_final_link _bfd_generic_final_link -#define versados_bfd_link_split_section _bfd_generic_link_split_section - -const bfd_target versados_vec = -{ - "versados", /* name */ - bfd_target_versados_flavour, - BFD_ENDIAN_BIG, /* target byte order */ - BFD_ENDIAN_BIG, /* target headers byte order */ - (HAS_RELOC | EXEC_P | /* object flags */ - HAS_LINENO | HAS_DEBUG | - HAS_SYMS | HAS_LOCALS | WP_TEXT | D_PAGED), - (SEC_CODE | SEC_DATA | SEC_ROM | SEC_HAS_CONTENTS - | SEC_ALLOC | SEC_LOAD | SEC_RELOC), /* section flags */ - 0, /* leading underscore */ - ' ', /* ar_pad_char */ - 16, /* ar_max_namelen */ - bfd_getb64, bfd_getb_signed_64, bfd_putb64, - bfd_getb32, bfd_getb_signed_32, bfd_putb32, - bfd_getb16, bfd_getb_signed_16, bfd_putb16, /* data */ - bfd_getb64, bfd_getb_signed_64, bfd_putb64, - bfd_getb32, bfd_getb_signed_32, bfd_putb32, - bfd_getb16, bfd_getb_signed_16, bfd_putb16, /* hdrs */ - - { - _bfd_dummy_target, - versados_object_p, /* bfd_check_format */ - _bfd_dummy_target, - _bfd_dummy_target, - }, - { - bfd_false, - versados_mkobject, - _bfd_generic_mkarchive, - bfd_false, - }, - { /* bfd_write_contents */ - bfd_false, - bfd_false, - _bfd_write_archive_contents, - bfd_false, - }, - - BFD_JUMP_TABLE_GENERIC (versados), - BFD_JUMP_TABLE_COPY (_bfd_generic), - BFD_JUMP_TABLE_CORE (_bfd_nocore), - BFD_JUMP_TABLE_ARCHIVE (_bfd_noarchive), - BFD_JUMP_TABLE_SYMBOLS (versados), - BFD_JUMP_TABLE_RELOCS (versados), - BFD_JUMP_TABLE_WRITE (versados), - BFD_JUMP_TABLE_LINK (versados), - BFD_JUMP_TABLE_DYNAMIC (_bfd_nodynamic), - - (PTR) 0 -}; diff --git a/contrib/gdb/bfd/xcofflink.c b/contrib/gdb/bfd/xcofflink.c deleted file mode 100644 index 16a76cc7ca55e..0000000000000 --- a/contrib/gdb/bfd/xcofflink.c +++ /dev/null @@ -1,5798 +0,0 @@ -/* POWER/PowerPC XCOFF linker support. - Copyright 1995, 1996 Free Software Foundation, Inc. - Written by Ian Lance Taylor <ian@cygnus.com>, Cygnus Support. - -This file is part of BFD, the Binary File Descriptor library. - -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 2 of the License, 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ - -#include "bfd.h" -#include "sysdep.h" -#include "bfdlink.h" -#include "libbfd.h" -#include "coff/internal.h" -#include "libcoff.h" - -/* This file holds the XCOFF linker code. */ - -#define STRING_SIZE_SIZE (4) - -/* In order to support linking different object file formats into an - XCOFF format, we need to be able to determine whether a particular - bfd_target is an XCOFF vector. FIXME: We need to rethink this - whole approach. */ -#define XCOFF_XVECP(xv) \ - (strcmp ((xv)->name, "aixcoff-rs6000") == 0 \ - || strcmp ((xv)->name, "xcoff-powermac") == 0) - -/* Get the XCOFF hash table entries for a BFD. */ -#define obj_xcoff_sym_hashes(bfd) \ - ((struct xcoff_link_hash_entry **) obj_coff_sym_hashes (bfd)) - -/* XCOFF relocation types. These probably belong in a header file - somewhere. The relocations are described in the function - _bfd_ppc_xcoff_relocate_section in this file. */ - -#define R_POS (0x00) -#define R_NEG (0x01) -#define R_REL (0x02) -#define R_TOC (0x03) -#define R_RTB (0x04) -#define R_GL (0x05) -#define R_TCL (0x06) -#define R_BA (0x08) -#define R_BR (0x0a) -#define R_RL (0x0c) -#define R_RLA (0x0d) -#define R_REF (0x0f) -#define R_TRL (0x12) -#define R_TRLA (0x13) -#define R_RRTBI (0x14) -#define R_RRTBA (0x15) -#define R_CAI (0x16) -#define R_CREL (0x17) -#define R_RBA (0x18) -#define R_RBAC (0x19) -#define R_RBR (0x1a) -#define R_RBRC (0x1b) - -/* The first word of global linkage code. This must be modified by - filling in the correct TOC offset. */ - -#define XCOFF_GLINK_FIRST (0x81820000) /* lwz r12,0(r2) */ - -/* The remaining words of global linkage code. */ - -static unsigned long xcoff_glink_code[] = -{ - 0x90410014, /* stw r2,20(r1) */ - 0x800c0000, /* lwz r0,0(r12) */ - 0x804c0004, /* lwz r2,4(r12) */ - 0x7c0903a6, /* mtctr r0 */ - 0x4e800420, /* bctr */ - 0x0, /* start of traceback table */ - 0x000c8000, /* traceback table */ - 0x0 /* traceback table */ -}; - -#define XCOFF_GLINK_SIZE \ - (((sizeof xcoff_glink_code / sizeof xcoff_glink_code[0]) * 4) + 4) - -/* We reuse the SEC_ROM flag as a mark flag for garbage collection. - This flag will only be used on input sections. */ - -#define SEC_MARK (SEC_ROM) - -/* The ldhdr structure. This appears at the start of the .loader - section. */ - -struct internal_ldhdr -{ - /* The version number: currently always 1. */ - unsigned long l_version; - /* The number of symbol table entries. */ - bfd_size_type l_nsyms; - /* The number of relocation table entries. */ - bfd_size_type l_nreloc; - /* The length of the import file string table. */ - bfd_size_type l_istlen; - /* The number of import files. */ - bfd_size_type l_nimpid; - /* The offset from the start of the .loader section to the first - entry in the import file table. */ - bfd_size_type l_impoff; - /* The length of the string table. */ - bfd_size_type l_stlen; - /* The offset from the start of the .loader section to the first - entry in the string table. */ - bfd_size_type l_stoff; -}; - -struct external_ldhdr -{ - bfd_byte l_version[4]; - bfd_byte l_nsyms[4]; - bfd_byte l_nreloc[4]; - bfd_byte l_istlen[4]; - bfd_byte l_nimpid[4]; - bfd_byte l_impoff[4]; - bfd_byte l_stlen[4]; - bfd_byte l_stoff[4]; -}; - -#define LDHDRSZ (8 * 4) - -/* The ldsym structure. This is used to represent a symbol in the - .loader section. */ - -struct internal_ldsym -{ - union - { - /* The symbol name if <= SYMNMLEN characters. */ - char _l_name[SYMNMLEN]; - struct - { - /* Zero if the symbol name is more than SYMNMLEN characters. */ - long _l_zeroes; - /* The offset in the string table if the symbol name is more - than SYMNMLEN characters. */ - long _l_offset; - } _l_l; - } _l; - /* The symbol value. */ - bfd_vma l_value; - /* The symbol section number. */ - short l_scnum; - /* The symbol type and flags. */ - char l_smtype; - /* The symbol storage class. */ - char l_smclas; - /* The import file ID. */ - bfd_size_type l_ifile; - /* Offset to the parameter type check string. */ - bfd_size_type l_parm; -}; - -struct external_ldsym -{ - union - { - bfd_byte _l_name[SYMNMLEN]; - struct - { - bfd_byte _l_zeroes[4]; - bfd_byte _l_offset[4]; - } _l_l; - } _l; - bfd_byte l_value[4]; - bfd_byte l_scnum[2]; - bfd_byte l_smtype[1]; - bfd_byte l_smclas[1]; - bfd_byte l_ifile[4]; - bfd_byte l_parm[4]; -}; - -#define LDSYMSZ (8 + 3 * 4 + 2 + 2) - -/* These flags are for the l_smtype field (the lower three bits are an - XTY_* value). */ - -/* Imported symbol. */ -#define L_IMPORT (0x40) -/* Entry point. */ -#define L_ENTRY (0x20) -/* Exported symbol. */ -#define L_EXPORT (0x10) - -/* The ldrel structure. This is used to represent a reloc in the - .loader section. */ - -struct internal_ldrel -{ - /* The reloc address. */ - bfd_vma l_vaddr; - /* The symbol table index in the .loader section symbol table. */ - bfd_size_type l_symndx; - /* The relocation type and size. */ - short l_rtype; - /* The section number this relocation applies to. */ - short l_rsecnm; -}; - -struct external_ldrel -{ - bfd_byte l_vaddr[4]; - bfd_byte l_symndx[4]; - bfd_byte l_rtype[2]; - bfd_byte l_rsecnm[2]; -}; - -#define LDRELSZ (2 * 4 + 2 * 2) - -/* The list of import files. */ - -struct xcoff_import_file -{ - /* The next entry in the list. */ - struct xcoff_import_file *next; - /* The path. */ - const char *path; - /* The file name. */ - const char *file; - /* The member name. */ - const char *member; -}; - -/* An entry in the XCOFF linker hash table. */ - -struct xcoff_link_hash_entry -{ - struct bfd_link_hash_entry root; - - /* Symbol index in output file. Set to -1 initially. Set to -2 if - there is a reloc against this symbol. */ - long indx; - - /* If we have created a TOC entry for this symbol, this is the .tc - section which holds it. */ - asection *toc_section; - - union - { - /* If we have created a TOC entry (the XCOFF_SET_TOC flag is - set), this is the offset in toc_section. */ - bfd_vma toc_offset; - /* If the TOC entry comes from an input file, this is set to the - symbo lindex of the C_HIDEXT XMC_TC symbol. */ - long toc_indx; - } u; - - /* If this symbol is a function entry point which is called, this - field holds a pointer to the function descriptor. If this symbol - is a function descriptor, this field holds a pointer to the - function entry point. */ - struct xcoff_link_hash_entry *descriptor; - - /* The .loader symbol table entry, if there is one. */ - struct internal_ldsym *ldsym; - - /* The .loader symbol table index. */ - long ldindx; - - /* Some linker flags. */ - unsigned short flags; - /* Symbol is referenced by a regular object. */ -#define XCOFF_REF_REGULAR (01) - /* Symbol is defined by a regular object. */ -#define XCOFF_DEF_REGULAR (02) - /* Symbol is defined by a dynamic object. */ -#define XCOFF_DEF_DYNAMIC (04) - /* Symbol is used in a reloc being copied into the .loader section. */ -#define XCOFF_LDREL (010) - /* Symbol is the entry point. */ -#define XCOFF_ENTRY (020) - /* Symbol is called; this is, it appears in a R_BR reloc. */ -#define XCOFF_CALLED (040) - /* Symbol needs the TOC entry filled in. */ -#define XCOFF_SET_TOC (0100) - /* Symbol is explicitly imported. */ -#define XCOFF_IMPORT (0200) - /* Symbol is explicitly exported. */ -#define XCOFF_EXPORT (0400) - /* Symbol has been processed by xcoff_build_ldsyms. */ -#define XCOFF_BUILT_LDSYM (01000) - /* Symbol is mentioned by a section which was not garbage collected. */ -#define XCOFF_MARK (02000) - /* Symbol size is recorded in size_list list from hash table. */ -#define XCOFF_HAS_SIZE (04000) - /* Symbol is a function descriptor. */ -#define XCOFF_DESCRIPTOR (010000) - - /* The storage mapping class. */ - unsigned char smclas; -}; - -/* The XCOFF linker hash table. */ - -struct xcoff_link_hash_table -{ - struct bfd_link_hash_table root; - - /* The .debug string hash table. We need to compute this while - reading the input files, so that we know how large the .debug - section will be before we assign section positions. */ - struct bfd_strtab_hash *debug_strtab; - - /* The .debug section we will use for the final output. */ - asection *debug_section; - - /* The .loader section we will use for the final output. */ - asection *loader_section; - - /* A count of non TOC relative relocs which will need to be - allocated in the .loader section. */ - size_t ldrel_count; - - /* The .loader section header. */ - struct internal_ldhdr ldhdr; - - /* The .gl section we use to hold global linkage code. */ - asection *linkage_section; - - /* The .tc section we use to hold toc entries we build for global - linkage code. */ - asection *toc_section; - - /* The .ds section we use to hold function descriptors which we - create for exported symbols. */ - asection *descriptor_section; - - /* The list of import files. */ - struct xcoff_import_file *imports; - - /* Required alignment of sections within the output file. */ - unsigned long file_align; - - /* Whether the .text section must be read-only. */ - boolean textro; - - /* Whether garbage collection was done. */ - boolean gc; - - /* A linked list of symbols for which we have size information. */ - struct xcoff_link_size_list - { - struct xcoff_link_size_list *next; - struct xcoff_link_hash_entry *h; - bfd_size_type size; - } *size_list; - - /* Magic sections: _text, _etext, _data, _edata, _end, end. */ - asection *special_sections[6]; -}; - -/* Information we keep for each section in the output file during the - final link phase. */ - -struct xcoff_link_section_info -{ - /* The relocs to be output. */ - struct internal_reloc *relocs; - /* For each reloc against a global symbol whose index was not known - when the reloc was handled, the global hash table entry. */ - struct xcoff_link_hash_entry **rel_hashes; - /* If there is a TOC relative reloc against a global symbol, and the - index of the TOC symbol is not known when the reloc was handled, - an entry is added to this linked list. This is not an array, - like rel_hashes, because this case is quite uncommon. */ - struct xcoff_toc_rel_hash - { - struct xcoff_toc_rel_hash *next; - struct xcoff_link_hash_entry *h; - struct internal_reloc *rel; - } *toc_rel_hashes; -}; - -/* Information that we pass around while doing the final link step. */ - -struct xcoff_final_link_info -{ - /* General link information. */ - struct bfd_link_info *info; - /* Output BFD. */ - bfd *output_bfd; - /* Hash table for long symbol names. */ - struct bfd_strtab_hash *strtab; - /* Array of information kept for each output section, indexed by the - target_index field. */ - struct xcoff_link_section_info *section_info; - /* Symbol index of last C_FILE symbol (-1 if none). */ - long last_file_index; - /* Contents of last C_FILE symbol. */ - struct internal_syment last_file; - /* Symbol index of TOC symbol. */ - long toc_symindx; - /* Start of .loader symbols. */ - struct external_ldsym *ldsym; - /* Next .loader reloc to swap out. */ - struct external_ldrel *ldrel; - /* File position of start of line numbers. */ - file_ptr line_filepos; - /* Buffer large enough to hold swapped symbols of any input file. */ - struct internal_syment *internal_syms; - /* Buffer large enough to hold output indices of symbols of any - input file. */ - long *sym_indices; - /* Buffer large enough to hold output symbols for any input file. */ - bfd_byte *outsyms; - /* Buffer large enough to hold external line numbers for any input - section. */ - bfd_byte *linenos; - /* Buffer large enough to hold any input section. */ - bfd_byte *contents; - /* Buffer large enough to hold external relocs of any input section. */ - bfd_byte *external_relocs; -}; - -static void xcoff_swap_ldhdr_in - PARAMS ((bfd *, const struct external_ldhdr *, struct internal_ldhdr *)); -static void xcoff_swap_ldhdr_out - PARAMS ((bfd *, const struct internal_ldhdr *, struct external_ldhdr *)); -static void xcoff_swap_ldsym_in - PARAMS ((bfd *, const struct external_ldsym *, struct internal_ldsym *)); -static void xcoff_swap_ldsym_out - PARAMS ((bfd *, const struct internal_ldsym *, struct external_ldsym *)); -static void xcoff_swap_ldrel_out - PARAMS ((bfd *, const struct internal_ldrel *, struct external_ldrel *)); -static struct bfd_hash_entry *xcoff_link_hash_newfunc - PARAMS ((struct bfd_hash_entry *, struct bfd_hash_table *, const char *)); -static struct internal_reloc *xcoff_read_internal_relocs - PARAMS ((bfd *, asection *, boolean, bfd_byte *, boolean, - struct internal_reloc *)); -static boolean xcoff_link_add_object_symbols - PARAMS ((bfd *, struct bfd_link_info *)); -static boolean xcoff_link_check_archive_element - PARAMS ((bfd *, struct bfd_link_info *, boolean *)); -static boolean xcoff_link_check_ar_symbols - PARAMS ((bfd *, struct bfd_link_info *, boolean *)); -static bfd_size_type xcoff_find_reloc - PARAMS ((struct internal_reloc *, bfd_size_type, bfd_vma)); -static boolean xcoff_link_add_symbols PARAMS ((bfd *, struct bfd_link_info *)); -static boolean xcoff_link_add_dynamic_symbols - PARAMS ((bfd *, struct bfd_link_info *)); -static boolean xcoff_mark PARAMS ((struct bfd_link_info *, asection *)); -static void xcoff_sweep PARAMS ((struct bfd_link_info *)); -static boolean xcoff_build_ldsyms - PARAMS ((struct xcoff_link_hash_entry *, PTR)); -static boolean xcoff_link_input_bfd - PARAMS ((struct xcoff_final_link_info *, bfd *)); -static boolean xcoff_write_global_symbol - PARAMS ((struct xcoff_link_hash_entry *, PTR)); -static boolean xcoff_reloc_link_order - PARAMS ((bfd *, struct xcoff_final_link_info *, asection *, - struct bfd_link_order *)); -static int xcoff_sort_relocs PARAMS ((const PTR, const PTR)); - -/* Routines to swap information in the XCOFF .loader section. If we - ever need to write an XCOFF loader, this stuff will need to be - moved to another file shared by the linker (which XCOFF calls the - ``binder'') and the loader. */ - -/* Swap in the ldhdr structure. */ - -static void -xcoff_swap_ldhdr_in (abfd, src, dst) - bfd *abfd; - const struct external_ldhdr *src; - struct internal_ldhdr *dst; -{ - dst->l_version = bfd_get_32 (abfd, src->l_version); - dst->l_nsyms = bfd_get_32 (abfd, src->l_nsyms); - dst->l_nreloc = bfd_get_32 (abfd, src->l_nreloc); - dst->l_istlen = bfd_get_32 (abfd, src->l_istlen); - dst->l_nimpid = bfd_get_32 (abfd, src->l_nimpid); - dst->l_impoff = bfd_get_32 (abfd, src->l_impoff); - dst->l_stlen = bfd_get_32 (abfd, src->l_stlen); - dst->l_stoff = bfd_get_32 (abfd, src->l_stoff); -} - -/* Swap out the ldhdr structure. */ - -static void -xcoff_swap_ldhdr_out (abfd, src, dst) - bfd *abfd; - const struct internal_ldhdr *src; - struct external_ldhdr *dst; -{ - bfd_put_32 (abfd, src->l_version, dst->l_version); - bfd_put_32 (abfd, src->l_nsyms, dst->l_nsyms); - bfd_put_32 (abfd, src->l_nreloc, dst->l_nreloc); - bfd_put_32 (abfd, src->l_istlen, dst->l_istlen); - bfd_put_32 (abfd, src->l_nimpid, dst->l_nimpid); - bfd_put_32 (abfd, src->l_impoff, dst->l_impoff); - bfd_put_32 (abfd, src->l_stlen, dst->l_stlen); - bfd_put_32 (abfd, src->l_stoff, dst->l_stoff); -} - -/* Swap in the ldsym structure. */ - -static void -xcoff_swap_ldsym_in (abfd, src, dst) - bfd *abfd; - const struct external_ldsym *src; - struct internal_ldsym *dst; -{ - if (bfd_get_32 (abfd, src->_l._l_l._l_zeroes) != 0) - memcpy (dst->_l._l_name, src->_l._l_name, SYMNMLEN); - else - { - dst->_l._l_l._l_zeroes = 0; - dst->_l._l_l._l_offset = bfd_get_32 (abfd, src->_l._l_l._l_offset); - } - dst->l_value = bfd_get_32 (abfd, src->l_value); - dst->l_scnum = bfd_get_16 (abfd, src->l_scnum); - dst->l_smtype = bfd_get_8 (abfd, src->l_smtype); - dst->l_smclas = bfd_get_8 (abfd, src->l_smclas); - dst->l_ifile = bfd_get_32 (abfd, src->l_ifile); - dst->l_parm = bfd_get_32 (abfd, src->l_parm); -} - -/* Swap out the ldsym structure. */ - -static void -xcoff_swap_ldsym_out (abfd, src, dst) - bfd *abfd; - const struct internal_ldsym *src; - struct external_ldsym *dst; -{ - if (src->_l._l_l._l_zeroes != 0) - memcpy (dst->_l._l_name, src->_l._l_name, SYMNMLEN); - else - { - bfd_put_32 (abfd, 0, dst->_l._l_l._l_zeroes); - bfd_put_32 (abfd, src->_l._l_l._l_offset, dst->_l._l_l._l_offset); - } - bfd_put_32 (abfd, src->l_value, dst->l_value); - bfd_put_16 (abfd, src->l_scnum, dst->l_scnum); - bfd_put_8 (abfd, src->l_smtype, dst->l_smtype); - bfd_put_8 (abfd, src->l_smclas, dst->l_smclas); - bfd_put_32 (abfd, src->l_ifile, dst->l_ifile); - bfd_put_32 (abfd, src->l_parm, dst->l_parm); -} - -/* As it happens, we never need to swap in the ldrel structure. */ - -/* Swap out the ldrel structure. */ - -static void -xcoff_swap_ldrel_out (abfd, src, dst) - bfd *abfd; - const struct internal_ldrel *src; - struct external_ldrel *dst; -{ - bfd_put_32 (abfd, src->l_vaddr, dst->l_vaddr); - bfd_put_32 (abfd, src->l_symndx, dst->l_symndx); - bfd_put_16 (abfd, src->l_rtype, dst->l_rtype); - bfd_put_16 (abfd, src->l_rsecnm, dst->l_rsecnm); -} - -/* Routine to create an entry in an XCOFF link hash table. */ - -static struct bfd_hash_entry * -xcoff_link_hash_newfunc (entry, table, string) - struct bfd_hash_entry *entry; - struct bfd_hash_table *table; - const char *string; -{ - struct xcoff_link_hash_entry *ret = (struct xcoff_link_hash_entry *) entry; - - /* Allocate the structure if it has not already been allocated by a - subclass. */ - if (ret == (struct xcoff_link_hash_entry *) NULL) - ret = ((struct xcoff_link_hash_entry *) - bfd_hash_allocate (table, sizeof (struct xcoff_link_hash_entry))); - if (ret == (struct xcoff_link_hash_entry *) NULL) - return (struct bfd_hash_entry *) ret; - - /* Call the allocation method of the superclass. */ - ret = ((struct xcoff_link_hash_entry *) - _bfd_link_hash_newfunc ((struct bfd_hash_entry *) ret, - table, string)); - if (ret != NULL) - { - /* Set local fields. */ - ret->indx = -1; - ret->toc_section = NULL; - ret->u.toc_indx = -1; - ret->descriptor = NULL; - ret->ldsym = NULL; - ret->ldindx = -1; - ret->flags = 0; - ret->smclas = XMC_UA; - } - - return (struct bfd_hash_entry *) ret; -} - -/* Create a XCOFF link hash table. */ - -struct bfd_link_hash_table * -_bfd_xcoff_bfd_link_hash_table_create (abfd) - bfd *abfd; -{ - struct xcoff_link_hash_table *ret; - - ret = ((struct xcoff_link_hash_table *) - bfd_alloc (abfd, sizeof (struct xcoff_link_hash_table))); - if (ret == (struct xcoff_link_hash_table *) NULL) - return (struct bfd_link_hash_table *) NULL; - if (! _bfd_link_hash_table_init (&ret->root, abfd, xcoff_link_hash_newfunc)) - { - bfd_release (abfd, ret); - return (struct bfd_link_hash_table *) NULL; - } - - ret->debug_strtab = _bfd_xcoff_stringtab_init (); - ret->debug_section = NULL; - ret->loader_section = NULL; - ret->ldrel_count = 0; - memset (&ret->ldhdr, 0, sizeof (struct internal_ldhdr)); - ret->linkage_section = NULL; - ret->toc_section = NULL; - ret->descriptor_section = NULL; - ret->imports = NULL; - ret->file_align = 0; - ret->textro = false; - ret->gc = false; - memset (ret->special_sections, 0, sizeof ret->special_sections); - - /* The linker will always generate a full a.out header. We need to - record that fact now, before the sizeof_headers routine could be - called. */ - xcoff_data (abfd)->full_aouthdr = true; - - return &ret->root; -} - -/* Look up an entry in an XCOFF link hash table. */ - -#define xcoff_link_hash_lookup(table, string, create, copy, follow) \ - ((struct xcoff_link_hash_entry *) \ - bfd_link_hash_lookup (&(table)->root, (string), (create), (copy),\ - (follow))) - -/* Traverse an XCOFF link hash table. */ - -#define xcoff_link_hash_traverse(table, func, info) \ - (bfd_link_hash_traverse \ - (&(table)->root, \ - (boolean (*) PARAMS ((struct bfd_link_hash_entry *, PTR))) (func), \ - (info))) - -/* Get the XCOFF link hash table from the info structure. This is - just a cast. */ - -#define xcoff_hash_table(p) ((struct xcoff_link_hash_table *) ((p)->hash)) - -/* Read internal relocs for an XCOFF csect. This is a wrapper around - _bfd_coff_read_internal_relocs which tries to take advantage of any - relocs which may have been cached for the enclosing section. */ - -static struct internal_reloc * -xcoff_read_internal_relocs (abfd, sec, cache, external_relocs, - require_internal, internal_relocs) - bfd *abfd; - asection *sec; - boolean cache; - bfd_byte *external_relocs; - boolean require_internal; - struct internal_reloc *internal_relocs; -{ - if (coff_section_data (abfd, sec) != NULL - && coff_section_data (abfd, sec)->relocs == NULL - && xcoff_section_data (abfd, sec) != NULL) - { - asection *enclosing; - - enclosing = xcoff_section_data (abfd, sec)->enclosing; - - if (enclosing != NULL - && (coff_section_data (abfd, enclosing) == NULL - || coff_section_data (abfd, enclosing)->relocs == NULL) - && cache - && enclosing->reloc_count > 0) - { - if (_bfd_coff_read_internal_relocs (abfd, enclosing, true, - external_relocs, false, - (struct internal_reloc *) NULL) - == NULL) - return NULL; - } - - if (enclosing != NULL - && coff_section_data (abfd, enclosing) != NULL - && coff_section_data (abfd, enclosing)->relocs != NULL) - { - size_t off; - - off = ((sec->rel_filepos - enclosing->rel_filepos) - / bfd_coff_relsz (abfd)); - if (! require_internal) - return coff_section_data (abfd, enclosing)->relocs + off; - memcpy (internal_relocs, - coff_section_data (abfd, enclosing)->relocs + off, - sec->reloc_count * sizeof (struct internal_reloc)); - return internal_relocs; - } - } - - return _bfd_coff_read_internal_relocs (abfd, sec, cache, external_relocs, - require_internal, internal_relocs); -} - -/* Given an XCOFF BFD, add symbols to the global hash table as - appropriate. */ - -boolean -_bfd_xcoff_bfd_link_add_symbols (abfd, info) - bfd *abfd; - struct bfd_link_info *info; -{ - switch (bfd_get_format (abfd)) - { - case bfd_object: - return xcoff_link_add_object_symbols (abfd, info); - case bfd_archive: - return (_bfd_generic_link_add_archive_symbols - (abfd, info, xcoff_link_check_archive_element)); - default: - bfd_set_error (bfd_error_wrong_format); - return false; - } -} - -/* Add symbols from an XCOFF object file. */ - -static boolean -xcoff_link_add_object_symbols (abfd, info) - bfd *abfd; - struct bfd_link_info *info; -{ - if (! _bfd_coff_get_external_symbols (abfd)) - return false; - if (! xcoff_link_add_symbols (abfd, info)) - return false; - if (! info->keep_memory) - { - if (! _bfd_coff_free_symbols (abfd)) - return false; - } - return true; -} - -/* Check a single archive element to see if we need to include it in - the link. *PNEEDED is set according to whether this element is - needed in the link or not. This is called via - _bfd_generic_link_add_archive_symbols. */ - -static boolean -xcoff_link_check_archive_element (abfd, info, pneeded) - bfd *abfd; - struct bfd_link_info *info; - boolean *pneeded; -{ - if (! _bfd_coff_get_external_symbols (abfd)) - return false; - - if (! xcoff_link_check_ar_symbols (abfd, info, pneeded)) - return false; - - if (*pneeded) - { - if (! xcoff_link_add_symbols (abfd, info)) - return false; - } - - if (! info->keep_memory || ! *pneeded) - { - if (! _bfd_coff_free_symbols (abfd)) - return false; - } - - return true; -} - -/* Look through the symbols to see if this object file should be - included in the link. */ - -static boolean -xcoff_link_check_ar_symbols (abfd, info, pneeded) - bfd *abfd; - struct bfd_link_info *info; - boolean *pneeded; -{ - bfd_size_type symesz; - bfd_byte *esym; - bfd_byte *esym_end; - - *pneeded = false; - - symesz = bfd_coff_symesz (abfd); - esym = (bfd_byte *) obj_coff_external_syms (abfd); - esym_end = esym + obj_raw_syment_count (abfd) * symesz; - while (esym < esym_end) - { - struct internal_syment sym; - - bfd_coff_swap_sym_in (abfd, (PTR) esym, (PTR) &sym); - - if (sym.n_sclass == C_EXT && sym.n_scnum != N_UNDEF) - { - const char *name; - char buf[SYMNMLEN + 1]; - struct bfd_link_hash_entry *h; - - /* This symbol is externally visible, and is defined by this - object file. */ - - name = _bfd_coff_internal_syment_name (abfd, &sym, buf); - if (name == NULL) - return false; - h = bfd_link_hash_lookup (info->hash, name, false, false, true); - - /* We are only interested in symbols that are currently - undefined. If a symbol is currently known to be common, - XCOFF linkers do not bring in an object file which - defines it. We also don't bring in symbols to satisfy - undefined references in shared objects. */ - if (h != (struct bfd_link_hash_entry *) NULL - && h->type == bfd_link_hash_undefined) - { - if (! (*info->callbacks->add_archive_element) (info, abfd, name)) - return false; - *pneeded = true; - return true; - } - } - - esym += (sym.n_numaux + 1) * symesz; - } - - /* We do not need this object file. */ - return true; -} - -/* Returns the index of reloc in RELOCS with the least address greater - than or equal to ADDRESS. The relocs are sorted by address. */ - -static bfd_size_type -xcoff_find_reloc (relocs, count, address) - struct internal_reloc *relocs; - bfd_size_type count; - bfd_vma address; -{ - bfd_size_type min, max, this; - - if (count < 2) - { - if (count == 1 && relocs[0].r_vaddr < address) - return 1; - else - return 0; - } - - min = 0; - max = count; - - /* Do a binary search over (min,max]. */ - while (min + 1 < max) - { - bfd_vma raddr; - - this = (max + min) / 2; - raddr = relocs[this].r_vaddr; - if (raddr > address) - max = this; - else if (raddr < address) - min = this; - else - { - min = this; - break; - } - } - - if (relocs[min].r_vaddr < address) - return min + 1; - - while (min > 0 - && relocs[min - 1].r_vaddr == address) - --min; - - return min; -} - -/* Add all the symbols from an object file to the hash table. - - XCOFF is a weird format. A normal XCOFF .o files will have three - COFF sections--.text, .data, and .bss--but each COFF section will - contain many csects. These csects are described in the symbol - table. From the linker's point of view, each csect must be - considered a section in its own right. For example, a TOC entry is - handled as a small XMC_TC csect. The linker must be able to merge - different TOC entries together, which means that it must be able to - extract the XMC_TC csects from the .data section of the input .o - file. - - From the point of view of our linker, this is, of course, a hideous - nightmare. We cope by actually creating sections for each csect, - and discarding the original sections. We then have to handle the - relocation entries carefully, since the only way to tell which - csect they belong to is to examine the address. */ - -static boolean -xcoff_link_add_symbols (abfd, info) - bfd *abfd; - struct bfd_link_info *info; -{ - unsigned int n_tmask; - unsigned int n_btshft; - boolean default_copy; - bfd_size_type symcount; - struct xcoff_link_hash_entry **sym_hash; - asection **csect_cache; - bfd_size_type linesz; - asection *o; - asection *last_real; - boolean keep_syms; - asection *csect; - unsigned int csect_index; - asection *first_csect; - bfd_size_type symesz; - bfd_byte *esym; - bfd_byte *esym_end; - struct reloc_info_struct - { - struct internal_reloc *relocs; - asection **csects; - bfd_byte *linenos; - } *reloc_info = NULL; - - if ((abfd->flags & DYNAMIC) != 0 - && ! info->static_link) - { - if (! xcoff_link_add_dynamic_symbols (abfd, info)) - return false; - } - - /* We need to build a .loader section, so we do it here. This won't - work if we're producing an XCOFF output file with no XCOFF input - files. FIXME. */ - if (xcoff_hash_table (info)->loader_section == NULL) - { - asection *lsec; - - lsec = bfd_make_section_anyway (abfd, ".loader"); - if (lsec == NULL) - goto error_return; - xcoff_hash_table (info)->loader_section = lsec; - lsec->flags |= SEC_HAS_CONTENTS | SEC_IN_MEMORY; - } - /* Likewise for the linkage section. */ - if (xcoff_hash_table (info)->linkage_section == NULL) - { - asection *lsec; - - lsec = bfd_make_section_anyway (abfd, ".gl"); - if (lsec == NULL) - goto error_return; - xcoff_hash_table (info)->linkage_section = lsec; - lsec->flags |= SEC_ALLOC | SEC_LOAD | SEC_HAS_CONTENTS | SEC_IN_MEMORY; - lsec->alignment_power = 2; - } - /* Likewise for the TOC section. */ - if (xcoff_hash_table (info)->toc_section == NULL) - { - asection *tsec; - - tsec = bfd_make_section_anyway (abfd, ".tc"); - if (tsec == NULL) - goto error_return; - xcoff_hash_table (info)->toc_section = tsec; - tsec->flags |= SEC_ALLOC | SEC_LOAD | SEC_HAS_CONTENTS | SEC_IN_MEMORY; - tsec->alignment_power = 2; - } - /* Likewise for the descriptor section. */ - if (xcoff_hash_table (info)->descriptor_section == NULL) - { - asection *dsec; - - dsec = bfd_make_section_anyway (abfd, ".ds"); - if (dsec == NULL) - goto error_return; - xcoff_hash_table (info)->descriptor_section = dsec; - dsec->flags |= SEC_ALLOC | SEC_LOAD | SEC_HAS_CONTENTS | SEC_IN_MEMORY; - dsec->alignment_power = 2; - } - /* Likewise for the .debug section. */ - if (xcoff_hash_table (info)->debug_section == NULL) - { - asection *dsec; - - dsec = bfd_make_section_anyway (abfd, ".debug"); - if (dsec == NULL) - goto error_return; - xcoff_hash_table (info)->debug_section = dsec; - dsec->flags |= SEC_HAS_CONTENTS | SEC_IN_MEMORY; - } - - if ((abfd->flags & DYNAMIC) != 0 - && ! info->static_link) - return true; - - n_tmask = coff_data (abfd)->local_n_tmask; - n_btshft = coff_data (abfd)->local_n_btshft; - - /* Define macros so that ISFCN, et. al., macros work correctly. */ -#define N_TMASK n_tmask -#define N_BTSHFT n_btshft - - if (info->keep_memory) - default_copy = false; - else - default_copy = true; - - symcount = obj_raw_syment_count (abfd); - - /* We keep a list of the linker hash table entries that correspond - to each external symbol. */ - sym_hash = ((struct xcoff_link_hash_entry **) - bfd_alloc (abfd, - (symcount - * sizeof (struct xcoff_link_hash_entry *)))); - if (sym_hash == NULL && symcount != 0) - goto error_return; - coff_data (abfd)->sym_hashes = (struct coff_link_hash_entry **) sym_hash; - memset (sym_hash, 0, - (size_t) symcount * sizeof (struct xcoff_link_hash_entry *)); - - /* Because of the weird stuff we are doing with XCOFF csects, we can - not easily determine which section a symbol is in, so we store - the information in the tdata for the input file. */ - csect_cache = ((asection **) - bfd_alloc (abfd, symcount * sizeof (asection *))); - if (csect_cache == NULL && symcount != 0) - goto error_return; - xcoff_data (abfd)->csects = csect_cache; - memset (csect_cache, 0, (size_t) symcount * sizeof (asection *)); - - /* While splitting sections into csects, we need to assign the - relocs correctly. The relocs and the csects must both be in - order by VMA within a given section, so we handle this by - scanning along the relocs as we process the csects. We index - into reloc_info using the section target_index. */ - reloc_info = ((struct reloc_info_struct *) - bfd_malloc ((abfd->section_count + 1) - * sizeof (struct reloc_info_struct))); - if (reloc_info == NULL) - goto error_return; - memset ((PTR) reloc_info, 0, - (abfd->section_count + 1) * sizeof (struct reloc_info_struct)); - - /* Read in the relocs and line numbers for each section. */ - linesz = bfd_coff_linesz (abfd); - last_real = NULL; - for (o = abfd->sections; o != NULL; o = o->next) - { - last_real = o; - if ((o->flags & SEC_RELOC) != 0) - { - reloc_info[o->target_index].relocs = - xcoff_read_internal_relocs (abfd, o, true, (bfd_byte *) NULL, - false, (struct internal_reloc *) NULL); - reloc_info[o->target_index].csects = - (asection **) bfd_malloc (o->reloc_count * sizeof (asection *)); - if (reloc_info[o->target_index].csects == NULL) - goto error_return; - memset (reloc_info[o->target_index].csects, 0, - o->reloc_count * sizeof (asection *)); - } - - if ((info->strip == strip_none || info->strip == strip_some) - && o->lineno_count > 0) - { - bfd_byte *linenos; - - linenos = (bfd_byte *) bfd_malloc (o->lineno_count * linesz); - if (linenos == NULL) - goto error_return; - reloc_info[o->target_index].linenos = linenos; - if (bfd_seek (abfd, o->line_filepos, SEEK_SET) != 0 - || (bfd_read (linenos, linesz, o->lineno_count, abfd) - != linesz * o->lineno_count)) - goto error_return; - } - } - - /* Don't let the linker relocation routines discard the symbols. */ - keep_syms = obj_coff_keep_syms (abfd); - obj_coff_keep_syms (abfd) = true; - - csect = NULL; - csect_index = 0; - first_csect = NULL; - - symesz = bfd_coff_symesz (abfd); - BFD_ASSERT (symesz == bfd_coff_auxesz (abfd)); - esym = (bfd_byte *) obj_coff_external_syms (abfd); - esym_end = esym + symcount * symesz; - while (esym < esym_end) - { - struct internal_syment sym; - union internal_auxent aux; - const char *name; - char buf[SYMNMLEN + 1]; - int smtyp; - flagword flags; - asection *section; - bfd_vma value; - struct xcoff_link_hash_entry *set_toc; - - bfd_coff_swap_sym_in (abfd, (PTR) esym, (PTR) &sym); - - /* In this pass we are only interested in symbols with csect - information. */ - if (sym.n_sclass != C_EXT && sym.n_sclass != C_HIDEXT) - { - if (sym.n_sclass == C_FILE && csect != NULL) - { - xcoff_section_data (abfd, csect)->last_symndx = - ((esym - - (bfd_byte *) obj_coff_external_syms (abfd)) - / symesz); - csect = NULL; - } - - if (csect != NULL) - *csect_cache = csect; - else if (first_csect == NULL || sym.n_sclass == C_FILE) - *csect_cache = coff_section_from_bfd_index (abfd, sym.n_scnum); - else - *csect_cache = NULL; - esym += (sym.n_numaux + 1) * symesz; - sym_hash += sym.n_numaux + 1; - csect_cache += sym.n_numaux + 1; - continue; - } - - name = _bfd_coff_internal_syment_name (abfd, &sym, buf); - if (name == NULL) - goto error_return; - - /* If this symbol has line number information attached to it, - and we're not stripping it, count the number of entries and - add them to the count for this csect. In the final link pass - we are going to attach line number information by symbol, - rather than by section, in order to more easily handle - garbage collection. */ - if ((info->strip == strip_none || info->strip == strip_some) - && sym.n_numaux > 1 - && csect != NULL - && ISFCN (sym.n_type)) - { - union internal_auxent auxlin; - - bfd_coff_swap_aux_in (abfd, (PTR) (esym + symesz), - sym.n_type, sym.n_sclass, - 0, sym.n_numaux, (PTR) &auxlin); - if (auxlin.x_sym.x_fcnary.x_fcn.x_lnnoptr != 0) - { - asection *enclosing; - bfd_size_type linoff; - - enclosing = xcoff_section_data (abfd, csect)->enclosing; - if (enclosing == NULL) - { - (*_bfd_error_handler) - ("%s: `%s' has line numbers but no enclosing section", - bfd_get_filename (abfd), name); - bfd_set_error (bfd_error_bad_value); - goto error_return; - } - linoff = (auxlin.x_sym.x_fcnary.x_fcn.x_lnnoptr - - enclosing->line_filepos); - if (linoff < enclosing->lineno_count * linesz) - { - struct internal_lineno lin; - bfd_byte *linpstart; - - linpstart = (reloc_info[enclosing->target_index].linenos - + linoff); - bfd_coff_swap_lineno_in (abfd, (PTR) linpstart, (PTR) &lin); - if (lin.l_lnno == 0 - && ((bfd_size_type) lin.l_addr.l_symndx - == ((esym - - (bfd_byte *) obj_coff_external_syms (abfd)) - / symesz))) - { - bfd_byte *linpend, *linp; - - linpend = (reloc_info[enclosing->target_index].linenos - + enclosing->lineno_count * linesz); - for (linp = linpstart + linesz; - linp < linpend; - linp += linesz) - { - bfd_coff_swap_lineno_in (abfd, (PTR) linp, - (PTR) &lin); - if (lin.l_lnno == 0) - break; - } - csect->lineno_count += (linp - linpstart) / linesz; - /* The setting of line_filepos will only be - useful if all the line number entries for a - csect are contiguous; this only matters for - error reporting. */ - if (csect->line_filepos == 0) - csect->line_filepos = - auxlin.x_sym.x_fcnary.x_fcn.x_lnnoptr; - } - } - } - } - - /* Pick up the csect auxiliary information. */ - - if (sym.n_numaux == 0) - { - (*_bfd_error_handler) - ("%s: class %d symbol `%s' has no aux entries", - bfd_get_filename (abfd), sym.n_sclass, name); - bfd_set_error (bfd_error_bad_value); - goto error_return; - } - - bfd_coff_swap_aux_in (abfd, - (PTR) (esym + symesz * sym.n_numaux), - sym.n_type, sym.n_sclass, - sym.n_numaux - 1, sym.n_numaux, - (PTR) &aux); - - smtyp = SMTYP_SMTYP (aux.x_csect.x_smtyp); - - flags = BSF_GLOBAL; - section = NULL; - value = 0; - set_toc = NULL; - - switch (smtyp) - { - default: - (*_bfd_error_handler) - ("%s: symbol `%s' has unrecognized csect type %d", - bfd_get_filename (abfd), name, smtyp); - bfd_set_error (bfd_error_bad_value); - goto error_return; - - case XTY_ER: - /* This is an external reference. */ - if (sym.n_sclass == C_HIDEXT - || sym.n_scnum != N_UNDEF - || aux.x_csect.x_scnlen.l != 0) - { - (*_bfd_error_handler) - ("%s: bad XTY_ER symbol `%s': class %d scnum %d scnlen %d", - bfd_get_filename (abfd), name, sym.n_sclass, sym.n_scnum, - aux.x_csect.x_scnlen.l); - bfd_set_error (bfd_error_bad_value); - goto error_return; - } - - /* An XMC_XO external reference is actually a reference to - an absolute location. */ - if (aux.x_csect.x_smclas != XMC_XO) - section = bfd_und_section_ptr; - else - { - section = bfd_abs_section_ptr; - value = sym.n_value; - } - break; - - case XTY_SD: - /* This is a csect definition. */ - - if (csect != NULL) - { - xcoff_section_data (abfd, csect)->last_symndx = - ((esym - - (bfd_byte *) obj_coff_external_syms (abfd)) - / symesz); - } - - csect = NULL; - csect_index = -1; - - /* When we see a TOC anchor, we record the TOC value. */ - if (aux.x_csect.x_smclas == XMC_TC0) - { - if (sym.n_sclass != C_HIDEXT - || aux.x_csect.x_scnlen.l != 0) - { - (*_bfd_error_handler) - ("%s: XMC_TC0 symbol `%s' is class %d scnlen %d", - bfd_get_filename (abfd), name, sym.n_sclass, - aux.x_csect.x_scnlen.l); - bfd_set_error (bfd_error_bad_value); - goto error_return; - } - xcoff_data (abfd)->toc = sym.n_value; - } - - /* We must merge TOC entries for the same symbol. We can - merge two TOC entries if they are both C_HIDEXT, they - both have the same name, they are both 4 bytes long, and - they both have a relocation table entry for an external - symbol with the same name. Unfortunately, this means - that we must look through the relocations. Ick. */ - if (aux.x_csect.x_smclas == XMC_TC - && sym.n_sclass == C_HIDEXT - && aux.x_csect.x_scnlen.l == 4 - && info->hash->creator == abfd->xvec) - { - asection *enclosing; - struct internal_reloc *relocs; - bfd_size_type relindx; - struct internal_reloc *rel; - - enclosing = coff_section_from_bfd_index (abfd, sym.n_scnum); - if (enclosing == NULL) - goto error_return; - - relocs = reloc_info[enclosing->target_index].relocs; - relindx = xcoff_find_reloc (relocs, enclosing->reloc_count, - sym.n_value); - rel = relocs + relindx; - if (relindx < enclosing->reloc_count - && rel->r_vaddr == (bfd_vma) sym.n_value - && rel->r_size == 31 - && rel->r_type == R_POS) - { - bfd_byte *erelsym; - struct internal_syment relsym; - - erelsym = ((bfd_byte *) obj_coff_external_syms (abfd) - + rel->r_symndx * symesz); - bfd_coff_swap_sym_in (abfd, (PTR) erelsym, (PTR) &relsym); - if (relsym.n_sclass == C_EXT) - { - const char *relname; - char relbuf[SYMNMLEN + 1]; - boolean copy; - struct xcoff_link_hash_entry *h; - - /* At this point we know that the TOC entry is - for an externally visible symbol. */ - relname = _bfd_coff_internal_syment_name (abfd, &relsym, - relbuf); - if (relname == NULL) - goto error_return; - - /* We only merge TOC entries if the TC name is - the same as the symbol name. This handles - the normal case, but not common cases like - SYM.P4 which gcc generates to store SYM + 4 - in the TOC. FIXME. */ - if (strcmp (name, relname) == 0) - { - copy = (! info->keep_memory - || relsym._n._n_n._n_zeroes != 0 - || relsym._n._n_n._n_offset == 0); - h = xcoff_link_hash_lookup (xcoff_hash_table (info), - relname, true, copy, - false); - if (h == NULL) - goto error_return; - - /* At this point h->root.type could be - bfd_link_hash_new. That should be OK, - since we know for sure that we will come - across this symbol as we step through the - file. */ - - /* We store h in *sym_hash for the - convenience of the relocate_section - function. */ - *sym_hash = h; - - if (h->toc_section != NULL) - { - asection **rel_csects; - - /* We already have a TOC entry for this - symbol, so we can just ignore this - one. */ - rel_csects = - reloc_info[enclosing->target_index].csects; - rel_csects[relindx] = bfd_und_section_ptr; - break; - } - - /* We are about to create a TOC entry for - this symbol. */ - set_toc = h; - } - } - } - } - - /* We need to create a new section. We get the name from - the csect storage mapping class, so that the linker can - accumulate similar csects together. */ - { - static const char *csect_name_by_class[] = - { - ".pr", ".ro", ".db", ".tc", ".ua", ".rw", ".gl", ".xo", - ".sv", ".bs", ".ds", ".uc", ".ti", ".tb", NULL, ".tc0", - ".td" - }; - const char *csect_name; - asection *enclosing; - - if ((aux.x_csect.x_smclas >= - sizeof csect_name_by_class / sizeof csect_name_by_class[0]) - || csect_name_by_class[aux.x_csect.x_smclas] == NULL) - { - (*_bfd_error_handler) - ("%s: symbol `%s' has unrecognized smclas %d", - bfd_get_filename (abfd), name, aux.x_csect.x_smclas); - bfd_set_error (bfd_error_bad_value); - goto error_return; - } - - csect_name = csect_name_by_class[aux.x_csect.x_smclas]; - csect = bfd_make_section_anyway (abfd, csect_name); - if (csect == NULL) - goto error_return; - enclosing = coff_section_from_bfd_index (abfd, sym.n_scnum); - if (enclosing == NULL) - goto error_return; - if (! bfd_is_abs_section (enclosing) - && ((bfd_vma) sym.n_value < enclosing->vma - || ((bfd_vma) sym.n_value + aux.x_csect.x_scnlen.l - > enclosing->vma + enclosing->_raw_size))) - { - (*_bfd_error_handler) - ("%s: csect `%s' not in enclosing section", - bfd_get_filename (abfd), name); - bfd_set_error (bfd_error_bad_value); - goto error_return; - } - csect->vma = sym.n_value; - csect->filepos = (enclosing->filepos - + sym.n_value - - enclosing->vma); - csect->_raw_size = aux.x_csect.x_scnlen.l; - csect->flags |= SEC_ALLOC | SEC_LOAD | SEC_HAS_CONTENTS; - csect->alignment_power = SMTYP_ALIGN (aux.x_csect.x_smtyp); - - /* Record the enclosing section in the tdata for this new - section. */ - csect->used_by_bfd = - ((struct coff_section_tdata *) - bfd_zalloc (abfd, sizeof (struct coff_section_tdata))); - if (csect->used_by_bfd == NULL) - goto error_return; - coff_section_data (abfd, csect)->tdata = - bfd_zalloc (abfd, sizeof (struct xcoff_section_tdata)); - if (coff_section_data (abfd, csect)->tdata == NULL) - goto error_return; - xcoff_section_data (abfd, csect)->enclosing = enclosing; - xcoff_section_data (abfd, csect)->lineno_count = - enclosing->lineno_count; - - if (enclosing->owner == abfd) - { - struct internal_reloc *relocs; - bfd_size_type relindx; - struct internal_reloc *rel; - asection **rel_csect; - - relocs = reloc_info[enclosing->target_index].relocs; - relindx = xcoff_find_reloc (relocs, enclosing->reloc_count, - csect->vma); - rel = relocs + relindx; - rel_csect = (reloc_info[enclosing->target_index].csects - + relindx); - csect->rel_filepos = (enclosing->rel_filepos - + relindx * bfd_coff_relsz (abfd)); - while (relindx < enclosing->reloc_count - && *rel_csect == NULL - && rel->r_vaddr < csect->vma + csect->_raw_size) - { - *rel_csect = csect; - csect->flags |= SEC_RELOC; - ++csect->reloc_count; - ++relindx; - ++rel; - ++rel_csect; - } - } - - /* There are a number of other fields and section flags - which we do not bother to set. */ - - csect_index = ((esym - - (bfd_byte *) obj_coff_external_syms (abfd)) - / symesz); - - xcoff_section_data (abfd, csect)->first_symndx = csect_index; - - if (first_csect == NULL) - first_csect = csect; - - /* If this symbol is C_EXT, we treat it as starting at the - beginning of the newly created section. */ - if (sym.n_sclass == C_EXT) - { - section = csect; - value = 0; - } - - /* If this is a TOC section for a symbol, record it. */ - if (set_toc != NULL) - set_toc->toc_section = csect; - } - break; - - case XTY_LD: - /* This is a label definition. The x_scnlen field is the - symbol index of the csect. I believe that this must - always follow the appropriate XTY_SD symbol, so I will - insist on it. */ - { - boolean bad; - - bad = false; - if (aux.x_csect.x_scnlen.l < 0 - || (aux.x_csect.x_scnlen.l - >= esym - (bfd_byte *) obj_coff_external_syms (abfd))) - bad = true; - if (! bad) - { - section = xcoff_data (abfd)->csects[aux.x_csect.x_scnlen.l]; - if (section == NULL - || (section->flags & SEC_HAS_CONTENTS) == 0) - bad = true; - } - if (bad) - { - (*_bfd_error_handler) - ("%s: misplaced XTY_LD `%s'", - bfd_get_filename (abfd), name); - bfd_set_error (bfd_error_bad_value); - goto error_return; - } - - value = sym.n_value - csect->vma; - } - break; - - case XTY_CM: - /* This is an unitialized csect. We could base the name on - the storage mapping class, but we don't bother. If this - csect is externally visible, it is a common symbol. */ - - if (csect != NULL) - { - xcoff_section_data (abfd, csect)->last_symndx = - ((esym - - (bfd_byte *) obj_coff_external_syms (abfd)) - / symesz); - } - - csect = bfd_make_section_anyway (abfd, ".bss"); - if (csect == NULL) - goto error_return; - csect->vma = sym.n_value; - csect->_raw_size = aux.x_csect.x_scnlen.l; - csect->flags |= SEC_ALLOC; - csect->alignment_power = SMTYP_ALIGN (aux.x_csect.x_smtyp); - /* There are a number of other fields and section flags - which we do not bother to set. */ - - csect_index = ((esym - - (bfd_byte *) obj_coff_external_syms (abfd)) - / symesz); - - csect->used_by_bfd = - ((struct coff_section_tdata *) - bfd_zalloc (abfd, sizeof (struct coff_section_tdata))); - if (csect->used_by_bfd == NULL) - goto error_return; - coff_section_data (abfd, csect)->tdata = - bfd_zalloc (abfd, sizeof (struct xcoff_section_tdata)); - if (coff_section_data (abfd, csect)->tdata == NULL) - goto error_return; - xcoff_section_data (abfd, csect)->first_symndx = csect_index; - - if (first_csect == NULL) - first_csect = csect; - - if (sym.n_sclass == C_EXT) - { - csect->flags |= SEC_IS_COMMON; - csect->_raw_size = 0; - section = csect; - value = aux.x_csect.x_scnlen.l; - } - - break; - } - - /* Check for magic symbol names. */ - if ((smtyp == XTY_SD || smtyp == XTY_CM) - && aux.x_csect.x_smclas != XMC_TC) - { - int i; - - i = -1; - if (name[0] == '_') - { - if (strcmp (name, "_text") == 0) - i = 0; - else if (strcmp (name, "_etext") == 0) - i = 1; - else if (strcmp (name, "_data") == 0) - i = 2; - else if (strcmp (name, "_edata") == 0) - i = 3; - else if (strcmp (name, "_end") == 0) - i = 4; - } - else if (name[0] == 'e' && strcmp (name, "end") == 0) - i = 5; - - if (i != -1) - xcoff_hash_table (info)->special_sections[i] = csect; - } - - /* Now we have enough information to add the symbol to the - linker hash table. */ - - if (sym.n_sclass == C_EXT) - { - boolean copy; - - BFD_ASSERT (section != NULL); - - /* We must copy the name into memory if we got it from the - syment itself, rather than the string table. */ - copy = default_copy; - if (sym._n._n_n._n_zeroes != 0 - || sym._n._n_n._n_offset == 0) - copy = true; - - if (info->hash->creator == abfd->xvec) - { - /* If we are statically linking a shared object, it is - OK for symbol redefinitions to occur. I can't figure - out just what the XCOFF linker is doing, but - something like this is required for -bnso to work. */ - if (! bfd_is_und_section (section)) - *sym_hash = xcoff_link_hash_lookup (xcoff_hash_table (info), - name, true, copy, false); - else - *sym_hash = ((struct xcoff_link_hash_entry *) - bfd_wrapped_link_hash_lookup (abfd, info, name, - true, copy, false)); - if (*sym_hash == NULL) - goto error_return; - if (((*sym_hash)->root.type == bfd_link_hash_defined - || (*sym_hash)->root.type == bfd_link_hash_defweak) - && ! bfd_is_und_section (section) - && ! bfd_is_com_section (section)) - { - if ((abfd->flags & DYNAMIC) != 0) - { - section = bfd_und_section_ptr; - value = 0; - } - else if (((*sym_hash)->root.u.def.section->owner->flags - & DYNAMIC) != 0) - { - (*sym_hash)->root.type = bfd_link_hash_undefined; - (*sym_hash)->root.u.undef.abfd = - (*sym_hash)->root.u.def.section->owner; - } - } - } - - /* _bfd_generic_link_add_one_symbol may call the linker to - generate an error message, and the linker may try to read - the symbol table to give a good error. Right now, the - line numbers are in an inconsistent state, since they are - counted both in the real sections and in the new csects. - We need to leave the count in the real sections so that - the linker can report the line number of the error - correctly, so temporarily clobber the link to the csects - so that the linker will not try to read the line numbers - a second time from the csects. */ - BFD_ASSERT (last_real->next == first_csect); - last_real->next = NULL; - if (! (_bfd_generic_link_add_one_symbol - (info, abfd, name, flags, section, value, - (const char *) NULL, copy, true, - (struct bfd_link_hash_entry **) sym_hash))) - goto error_return; - last_real->next = first_csect; - - if (smtyp == XTY_CM) - { - if ((*sym_hash)->root.type != bfd_link_hash_common - || (*sym_hash)->root.u.c.p->section != csect) - { - /* We don't need the common csect we just created. */ - csect->_raw_size = 0; - } - else - { - (*sym_hash)->root.u.c.p->alignment_power - = csect->alignment_power; - } - } - - if (info->hash->creator == abfd->xvec) - { - int flag; - - if (smtyp == XTY_ER || smtyp == XTY_CM) - flag = XCOFF_REF_REGULAR; - else - flag = XCOFF_DEF_REGULAR; - (*sym_hash)->flags |= flag; - - if ((*sym_hash)->smclas == XMC_UA - || flag == XCOFF_DEF_REGULAR) - (*sym_hash)->smclas = aux.x_csect.x_smclas; - } - } - - *csect_cache = csect; - - esym += (sym.n_numaux + 1) * symesz; - sym_hash += sym.n_numaux + 1; - csect_cache += sym.n_numaux + 1; - } - - BFD_ASSERT (last_real == NULL || last_real->next == first_csect); - - /* Make sure that we have seen all the relocs. */ - for (o = abfd->sections; o != first_csect; o = o->next) - { - /* Reset the section size and the line numebr count, since the - data is now attached to the csects. Don't reset the size of - the .debug section, since we need to read it below in - bfd_xcoff_size_dynamic_sections. */ - if (strcmp (bfd_get_section_name (abfd, o), ".debug") != 0) - o->_raw_size = 0; - o->lineno_count = 0; - - if ((o->flags & SEC_RELOC) != 0) - { - bfd_size_type i; - struct internal_reloc *rel; - asection **rel_csect; - - rel = reloc_info[o->target_index].relocs; - rel_csect = reloc_info[o->target_index].csects; - for (i = 0; i < o->reloc_count; i++, rel++, rel_csect++) - { - if (*rel_csect == NULL) - { - (*_bfd_error_handler) - ("%s: reloc %s:%d not in csect", - bfd_get_filename (abfd), o->name, i); - bfd_set_error (bfd_error_bad_value); - goto error_return; - } - - /* We identify all symbols which are called, so that we - can create glue code for calls to functions imported - from dynamic objects. */ - if (info->hash->creator == abfd->xvec - && *rel_csect != bfd_und_section_ptr - && (rel->r_type == R_BR - || rel->r_type == R_RBR) - && obj_xcoff_sym_hashes (abfd)[rel->r_symndx] != NULL) - { - struct xcoff_link_hash_entry *h; - - h = obj_xcoff_sym_hashes (abfd)[rel->r_symndx]; - h->flags |= XCOFF_CALLED; - /* If the symbol name starts with a period, it is - the code of a function. If the symbol is - currently undefined, then add an undefined symbol - for the function descriptor. This should do no - harm, because any regular object that defines the - function should also define the function - descriptor. It helps, because it means that we - will identify the function descriptor with a - dynamic object if a dynamic object defines it. */ - if (h->root.root.string[0] == '.' - && h->descriptor == NULL) - { - struct xcoff_link_hash_entry *hds; - - hds = xcoff_link_hash_lookup (xcoff_hash_table (info), - h->root.root.string + 1, - true, false, true); - if (hds == NULL) - goto error_return; - if (hds->root.type == bfd_link_hash_new) - { - if (! (_bfd_generic_link_add_one_symbol - (info, abfd, hds->root.root.string, - (flagword) 0, bfd_und_section_ptr, - (bfd_vma) 0, (const char *) NULL, false, - true, - (struct bfd_link_hash_entry **) &hds))) - goto error_return; - } - hds->flags |= XCOFF_DESCRIPTOR; - BFD_ASSERT ((hds->flags & XCOFF_CALLED) == 0 - && (h->flags & XCOFF_DESCRIPTOR) == 0); - hds->descriptor = h; - h->descriptor = hds; - } - } - } - - free (reloc_info[o->target_index].csects); - reloc_info[o->target_index].csects = NULL; - - /* Reset SEC_RELOC and the reloc_count, since the reloc - information is now attached to the csects. */ - o->flags &=~ SEC_RELOC; - o->reloc_count = 0; - - /* If we are not keeping memory, free the reloc information. */ - if (! info->keep_memory - && coff_section_data (abfd, o) != NULL - && coff_section_data (abfd, o)->relocs != NULL - && ! coff_section_data (abfd, o)->keep_relocs) - { - free (coff_section_data (abfd, o)->relocs); - coff_section_data (abfd, o)->relocs = NULL; - } - } - - /* Free up the line numbers. FIXME: We could cache these - somewhere for the final link, to avoid reading them again. */ - if (reloc_info[o->target_index].linenos != NULL) - { - free (reloc_info[o->target_index].linenos); - reloc_info[o->target_index].linenos = NULL; - } - } - - free (reloc_info); - - obj_coff_keep_syms (abfd) = keep_syms; - - return true; - - error_return: - if (reloc_info != NULL) - { - for (o = abfd->sections; o != NULL; o = o->next) - { - if (reloc_info[o->target_index].csects != NULL) - free (reloc_info[o->target_index].csects); - if (reloc_info[o->target_index].linenos != NULL) - free (reloc_info[o->target_index].linenos); - } - free (reloc_info); - } - obj_coff_keep_syms (abfd) = keep_syms; - return false; -} - -#undef N_TMASK -#undef N_BTSHFT - -/* This function is used to add symbols from a dynamic object to the - global symbol table. */ - -static boolean -xcoff_link_add_dynamic_symbols (abfd, info) - bfd *abfd; - struct bfd_link_info *info; -{ - asection *lsec; - bfd_byte *buf = NULL; - struct internal_ldhdr ldhdr; - const char *strings; - struct external_ldsym *elsym, *elsymend; - struct xcoff_import_file *n; - const char *bname; - const char *mname; - const char *s; - unsigned int c; - struct xcoff_import_file **pp; - - /* We can only handle a dynamic object if we are generating an XCOFF - output file. */ - if (info->hash->creator != abfd->xvec) - { - (*_bfd_error_handler) - ("%s: XCOFF shared object when not producing XCOFF output", - bfd_get_filename (abfd)); - bfd_set_error (bfd_error_invalid_operation); - goto error_return; - } - - /* The symbols we use from a dynamic object are not the symbols in - the normal symbol table, but, rather, the symbols in the export - table. If there is a global symbol in a dynamic object which is - not in the export table, the loader will not be able to find it, - so we don't want to find it either. Also, on AIX 4.1.3, shr.o in - libc.a has symbols in the export table which are not in the - symbol table. */ - - /* Read in the .loader section. FIXME: We should really use the - o_snloader field in the a.out header, rather than grabbing the - section by name. */ - lsec = bfd_get_section_by_name (abfd, ".loader"); - if (lsec == NULL) - { - (*_bfd_error_handler) - ("%s: dynamic object with no .loader section", - bfd_get_filename (abfd)); - bfd_set_error (bfd_error_no_symbols); - goto error_return; - } - - buf = (bfd_byte *) bfd_malloc (lsec->_raw_size); - if (buf == NULL && lsec->_raw_size > 0) - goto error_return; - - if (! bfd_get_section_contents (abfd, lsec, (PTR) buf, (file_ptr) 0, - lsec->_raw_size)) - goto error_return; - - /* Remove the sections from this object, so that they do not get - included in the link. */ - abfd->sections = NULL; - - xcoff_swap_ldhdr_in (abfd, (struct external_ldhdr *) buf, &ldhdr); - - strings = (char *) buf + ldhdr.l_stoff; - - elsym = (struct external_ldsym *) (buf + LDHDRSZ); - elsymend = elsym + ldhdr.l_nsyms; - BFD_ASSERT (sizeof (struct external_ldsym) == LDSYMSZ); - for (; elsym < elsymend; elsym++) - { - struct internal_ldsym ldsym; - char nambuf[SYMNMLEN + 1]; - const char *name; - struct xcoff_link_hash_entry *h; - - xcoff_swap_ldsym_in (abfd, elsym, &ldsym); - - /* We are only interested in exported symbols. */ - if ((ldsym.l_smtype & L_EXPORT) == 0) - continue; - - if (ldsym._l._l_l._l_zeroes == 0) - name = strings + ldsym._l._l_l._l_offset; - else - { - memcpy (nambuf, ldsym._l._l_name, SYMNMLEN); - nambuf[SYMNMLEN] = '\0'; - name = nambuf; - } - - /* Normally we could not call xcoff_link_hash_lookup in an add - symbols routine, since we might not be using an XCOFF hash - table. However, we verified above that we are using an XCOFF - hash table. */ - - h = xcoff_link_hash_lookup (xcoff_hash_table (info), name, true, - true, true); - if (h == NULL) - goto error_return; - - h->flags |= XCOFF_DEF_DYNAMIC; - - /* If the symbol is undefined, and the BFD it was found in is - not a dynamic object, change the BFD to this dynamic object, - so that we can get the correct import file ID. */ - if ((h->root.type == bfd_link_hash_undefined - || h->root.type == bfd_link_hash_undefweak) - && (h->root.u.undef.abfd == NULL - || (h->root.u.undef.abfd->flags & DYNAMIC) == 0)) - h->root.u.undef.abfd = abfd; - - if (h->root.type == bfd_link_hash_new) - { - h->root.type = bfd_link_hash_undefined; - h->root.u.undef.abfd = abfd; - /* We do not want to add this to the undefined symbol list. */ - } - - if (h->smclas == XMC_UA - || h->root.type == bfd_link_hash_undefined - || h->root.type == bfd_link_hash_undefweak) - h->smclas = ldsym.l_smclas; - - /* Unless this is an XMC_XO symbol, we don't bother to actually - define it, since we don't have a section to put it in anyhow. - Instead, the relocation routines handle the DEF_DYNAMIC flag - correctly. */ - - if (h->smclas == XMC_XO - && (h->root.type == bfd_link_hash_undefined - || h->root.type == bfd_link_hash_undefweak)) - { - /* This symbol has an absolute value. */ - h->root.type = bfd_link_hash_defined; - h->root.u.def.section = bfd_abs_section_ptr; - h->root.u.def.value = ldsym.l_value; - } - } - - if (buf != NULL) - { - free (buf); - buf = NULL; - } - - /* Record this file in the import files. */ - - n = ((struct xcoff_import_file *) - bfd_alloc (abfd, sizeof (struct xcoff_import_file))); - if (n == NULL) - goto error_return; - n->next = NULL; - - /* For some reason, the path entry in the import file list for a - shared object appears to always be empty. The file name is the - base name. */ - n->path = ""; - if (abfd->my_archive == NULL) - { - bname = bfd_get_filename (abfd); - mname = ""; - } - else - { - bname = bfd_get_filename (abfd->my_archive); - mname = bfd_get_filename (abfd); - } - s = strrchr (bname, '/'); - if (s != NULL) - bname = s + 1; - n->file = bname; - n->member = mname; - - /* We start c at 1 because the first import file number is reserved - for LIBPATH. */ - for (pp = &xcoff_hash_table (info)->imports, c = 1; - *pp != NULL; - pp = &(*pp)->next, ++c) - ; - *pp = n; - - xcoff_data (abfd)->import_file_id = c; - - return true; - - error_return: - if (buf != NULL) - free (buf); - return false; -} - -/* Routines that are called after all the input files have been - handled, but before the sections are laid out in memory. */ - -/* Mark a symbol as not being garbage, including the section in which - it is defined. */ - -static INLINE boolean -xcoff_mark_symbol (info, h) - struct bfd_link_info *info; - struct xcoff_link_hash_entry *h; -{ - if ((h->flags & XCOFF_MARK) != 0) - return true; - - h->flags |= XCOFF_MARK; - if (h->root.type == bfd_link_hash_defined - || h->root.type == bfd_link_hash_defweak) - { - asection *hsec; - - hsec = h->root.u.def.section; - if ((hsec->flags & SEC_MARK) == 0) - { - if (! xcoff_mark (info, hsec)) - return false; - } - } - - if (h->toc_section != NULL - && (h->toc_section->flags & SEC_MARK) == 0) - { - if (! xcoff_mark (info, h->toc_section)) - return false; - } - - return true; -} - -/* The mark phase of garbage collection. For a given section, mark - it, and all the sections which define symbols to which it refers. - Because this function needs to look at the relocs, we also count - the number of relocs which need to be copied into the .loader - section. */ - -static boolean -xcoff_mark (info, sec) - struct bfd_link_info *info; - asection *sec; -{ - if ((sec->flags & SEC_MARK) != 0) - return true; - - sec->flags |= SEC_MARK; - - if (sec->owner->xvec == info->hash->creator - && coff_section_data (sec->owner, sec) != NULL - && xcoff_section_data (sec->owner, sec) != NULL) - { - register struct xcoff_link_hash_entry **hp, **hpend; - struct internal_reloc *rel, *relend; - - /* Mark all the symbols in this section. */ - - hp = (obj_xcoff_sym_hashes (sec->owner) - + xcoff_section_data (sec->owner, sec)->first_symndx); - hpend = (obj_xcoff_sym_hashes (sec->owner) - + xcoff_section_data (sec->owner, sec)->last_symndx); - for (; hp < hpend; hp++) - { - register struct xcoff_link_hash_entry *h; - - h = *hp; - if (h != NULL - && (h->flags & XCOFF_MARK) == 0) - { - if (! xcoff_mark_symbol (info, h)) - return false; - } - } - - /* Look through the section relocs. */ - - if ((sec->flags & SEC_RELOC) != 0 - && sec->reloc_count > 0) - { - rel = xcoff_read_internal_relocs (sec->owner, sec, true, - (bfd_byte *) NULL, false, - (struct internal_reloc *) NULL); - if (rel == NULL) - return false; - relend = rel + sec->reloc_count; - for (; rel < relend; rel++) - { - asection *rsec; - struct xcoff_link_hash_entry *h; - - if ((unsigned int) rel->r_symndx - > obj_raw_syment_count (sec->owner)) - continue; - - h = obj_xcoff_sym_hashes (sec->owner)[rel->r_symndx]; - if (h != NULL - && (h->flags & XCOFF_MARK) == 0) - { - if (! xcoff_mark_symbol (info, h)) - return false; - } - - rsec = xcoff_data (sec->owner)->csects[rel->r_symndx]; - if (rsec != NULL - && (rsec->flags & SEC_MARK) == 0) - { - if (! xcoff_mark (info, rsec)) - return false; - } - - /* See if this reloc needs to be copied into the .loader - section. */ - switch (rel->r_type) - { - default: - if (h == NULL - || h->root.type == bfd_link_hash_defined - || h->root.type == bfd_link_hash_defweak - || h->root.type == bfd_link_hash_common - || ((h->flags & XCOFF_CALLED) != 0 - && (h->root.type == bfd_link_hash_undefined - || h->root.type == bfd_link_hash_undefweak) - && h->root.root.string[0] == '.' - && h->descriptor != NULL - && ((h->descriptor->flags & XCOFF_DEF_DYNAMIC) != 0 - || info->shared - || ((h->descriptor->flags & XCOFF_IMPORT) != 0 - && (h->descriptor->flags - & XCOFF_DEF_REGULAR) == 0)))) - break; - /* Fall through. */ - case R_POS: - case R_NEG: - case R_RL: - case R_RLA: - ++xcoff_hash_table (info)->ldrel_count; - if (h != NULL) - h->flags |= XCOFF_LDREL; - break; - case R_TOC: - case R_GL: - case R_TCL: - case R_TRL: - case R_TRLA: - /* We should never need a .loader reloc for a TOC - relative reloc. */ - break; - } - } - - if (! info->keep_memory - && coff_section_data (sec->owner, sec) != NULL - && coff_section_data (sec->owner, sec)->relocs != NULL - && ! coff_section_data (sec->owner, sec)->keep_relocs) - { - free (coff_section_data (sec->owner, sec)->relocs); - coff_section_data (sec->owner, sec)->relocs = NULL; - } - } - } - - return true; -} - -/* The sweep phase of garbage collection. Remove all garbage - sections. */ - -static void -xcoff_sweep (info) - struct bfd_link_info *info; -{ - bfd *sub; - - for (sub = info->input_bfds; sub != NULL; sub = sub->link_next) - { - asection *o; - - for (o = sub->sections; o != NULL; o = o->next) - { - if ((o->flags & SEC_MARK) == 0) - { - /* Keep all sections from non-XCOFF input files. Keep - special sections. Keep .debug sections for the - moment. */ - if (sub->xvec != info->hash->creator - || o == xcoff_hash_table (info)->debug_section - || o == xcoff_hash_table (info)->loader_section - || o == xcoff_hash_table (info)->linkage_section - || o == xcoff_hash_table (info)->toc_section - || o == xcoff_hash_table (info)->descriptor_section - || strcmp (o->name, ".debug") == 0) - o->flags |= SEC_MARK; - else - { - o->_raw_size = 0; - o->reloc_count = 0; - o->lineno_count = 0; - } - } - } - } -} - -/* Record the number of elements in a set. This is used to output the - correct csect length. */ - -boolean -bfd_xcoff_link_record_set (output_bfd, info, harg, size) - bfd *output_bfd; - struct bfd_link_info *info; - struct bfd_link_hash_entry *harg; - bfd_size_type size; -{ - struct xcoff_link_hash_entry *h = (struct xcoff_link_hash_entry *) harg; - struct xcoff_link_size_list *n; - - if (! XCOFF_XVECP (output_bfd->xvec)) - return true; - - /* This will hardly ever be called. I don't want to burn four bytes - per global symbol, so instead the size is kept on a linked list - attached to the hash table. */ - - n = ((struct xcoff_link_size_list *) - bfd_alloc (output_bfd, sizeof (struct xcoff_link_size_list))); - if (n == NULL) - return false; - n->next = xcoff_hash_table (info)->size_list; - n->h = h; - n->size = size; - xcoff_hash_table (info)->size_list = n; - - h->flags |= XCOFF_HAS_SIZE; - - return true; -} - -/* Import a symbol. */ - -boolean -bfd_xcoff_import_symbol (output_bfd, info, harg, val, imppath, impfile, - impmember) - bfd *output_bfd; - struct bfd_link_info *info; - struct bfd_link_hash_entry *harg; - bfd_vma val; - const char *imppath; - const char *impfile; - const char *impmember; -{ - struct xcoff_link_hash_entry *h = (struct xcoff_link_hash_entry *) harg; - - if (! XCOFF_XVECP (output_bfd->xvec)) - return true; - - h->flags |= XCOFF_IMPORT; - - if (val != (bfd_vma) -1) - { - if (h->root.type == bfd_link_hash_defined - && (! bfd_is_abs_section (h->root.u.def.section) - || h->root.u.def.value != val)) - { - if (! ((*info->callbacks->multiple_definition) - (info, h->root.root.string, h->root.u.def.section->owner, - h->root.u.def.section, h->root.u.def.value, - output_bfd, bfd_abs_section_ptr, val))) - return false; - } - - h->root.type = bfd_link_hash_defined; - h->root.u.def.section = bfd_abs_section_ptr; - h->root.u.def.value = val; - } - - if (h->ldsym == NULL) - { - h->ldsym = ((struct internal_ldsym *) - bfd_zalloc (output_bfd, sizeof (struct internal_ldsym))); - if (h->ldsym == NULL) - return false; - } - - if (imppath == NULL) - h->ldsym->l_ifile = (bfd_size_type) -1; - else - { - unsigned int c; - struct xcoff_import_file **pp; - - /* We start c at 1 because the first entry in the import list is - reserved for the library search path. */ - for (pp = &xcoff_hash_table (info)->imports, c = 1; - *pp != NULL; - pp = &(*pp)->next, ++c) - { - if (strcmp ((*pp)->path, imppath) == 0 - && strcmp ((*pp)->file, impfile) == 0 - && strcmp ((*pp)->member, impmember) == 0) - break; - } - - if (*pp == NULL) - { - struct xcoff_import_file *n; - - n = ((struct xcoff_import_file *) - bfd_alloc (output_bfd, sizeof (struct xcoff_import_file))); - if (n == NULL) - return false; - n->next = NULL; - n->path = imppath; - n->file = impfile; - n->member = impmember; - *pp = n; - } - - h->ldsym->l_ifile = c; - } - - return true; -} - -/* Export a symbol. */ - -boolean -bfd_xcoff_export_symbol (output_bfd, info, harg, syscall) - bfd *output_bfd; - struct bfd_link_info *info; - struct bfd_link_hash_entry *harg; - boolean syscall; -{ - struct xcoff_link_hash_entry *h = (struct xcoff_link_hash_entry *) harg; - - if (! XCOFF_XVECP (output_bfd->xvec)) - return true; - - h->flags |= XCOFF_EXPORT; - - /* FIXME: I'm not at all sure what syscall is supposed to mean, so - I'm just going to ignore it until somebody explains it. */ - - /* See if this is a function descriptor. It may be one even though - it is not so marked. */ - if ((h->flags & XCOFF_DESCRIPTOR) == 0 - && h->root.root.string[0] != '.') - { - char *fnname; - struct xcoff_link_hash_entry *hfn; - - fnname = (char *) bfd_malloc (strlen (h->root.root.string) + 2); - if (fnname == NULL) - return false; - fnname[0] = '.'; - strcpy (fnname + 1, h->root.root.string); - hfn = xcoff_link_hash_lookup (xcoff_hash_table (info), - fnname, false, false, true); - free (fnname); - if (hfn != NULL - && hfn->smclas == XMC_PR - && (hfn->root.type == bfd_link_hash_defined - || hfn->root.type == bfd_link_hash_defweak)) - { - h->flags |= XCOFF_DESCRIPTOR; - h->descriptor = hfn; - hfn->descriptor = h; - } - } - - /* Make sure we don't garbage collect this symbol. */ - if (! xcoff_mark_symbol (info, h)) - return false; - - /* If this is a function descriptor, make sure we don't garbage - collect the associated function code. We normally don't have to - worry about this, because the descriptor will be attached to a - section with relocs, but if we are creating the descriptor - ourselves those relocs will not be visible to the mark code. */ - if ((h->flags & XCOFF_DESCRIPTOR) != 0) - { - if (! xcoff_mark_symbol (info, h->descriptor)) - return false; - } - - return true; -} - -/* Count a reloc against a symbol. This is called for relocs - generated by the linker script, typically for global constructors - and destructors. */ - -boolean -bfd_xcoff_link_count_reloc (output_bfd, info, name) - bfd *output_bfd; - struct bfd_link_info *info; - const char *name; -{ - struct xcoff_link_hash_entry *h; - - if (! XCOFF_XVECP (output_bfd->xvec)) - return true; - - h = ((struct xcoff_link_hash_entry *) - bfd_wrapped_link_hash_lookup (output_bfd, info, name, false, false, - false)); - if (h == NULL) - { - (*_bfd_error_handler) ("%s: no such symbol", name); - bfd_set_error (bfd_error_no_symbols); - return false; - } - - h->flags |= XCOFF_REF_REGULAR | XCOFF_LDREL; - ++xcoff_hash_table (info)->ldrel_count; - - /* Mark the symbol to avoid garbage collection. */ - if (! xcoff_mark_symbol (info, h)) - return false; - - return true; -} - -/* This function is called for each symbol to which the linker script - assigns a value. */ - -boolean -bfd_xcoff_record_link_assignment (output_bfd, info, name) - bfd *output_bfd; - struct bfd_link_info *info; - const char *name; -{ - struct xcoff_link_hash_entry *h; - - if (! XCOFF_XVECP (output_bfd->xvec)) - return true; - - h = xcoff_link_hash_lookup (xcoff_hash_table (info), name, true, true, - false); - if (h == NULL) - return false; - - h->flags |= XCOFF_DEF_REGULAR; - - return true; -} - -/* This structure is used to pass information through - xcoff_link_hash_traverse. */ - -struct xcoff_loader_info -{ - /* Set if a problem occurred. */ - boolean failed; - /* Output BFD. */ - bfd *output_bfd; - /* Link information structure. */ - struct bfd_link_info *info; - /* Whether all defined symbols should be exported. */ - boolean export_defineds; - /* Number of ldsym structures. */ - size_t ldsym_count; - /* Size of string table. */ - size_t string_size; - /* String table. */ - bfd_byte *strings; - /* Allocated size of string table. */ - size_t string_alc; -}; - -/* Build the .loader section. This is called by the XCOFF linker - emulation before_allocation routine. We must set the size of the - .loader section before the linker lays out the output file. - LIBPATH is the library path to search for shared objects; this is - normally built from the -L arguments passed to the linker. ENTRY - is the name of the entry point symbol (the -e linker option). - FILE_ALIGN is the alignment to use for sections within the file - (the -H linker option). MAXSTACK is the maximum stack size (the - -bmaxstack linker option). MAXDATA is the maximum data size (the - -bmaxdata linker option). GC is whether to do garbage collection - (the -bgc linker option). MODTYPE is the module type (the - -bmodtype linker option). TEXTRO is whether the text section must - be read only (the -btextro linker option). EXPORT_DEFINEDS is - whether all defined symbols should be exported (the -unix linker - option). SPECIAL_SECTIONS is set by this routine to csects with - magic names like _end. */ - -boolean -bfd_xcoff_size_dynamic_sections (output_bfd, info, libpath, entry, - file_align, maxstack, maxdata, gc, - modtype, textro, export_defineds, - special_sections) - bfd *output_bfd; - struct bfd_link_info *info; - const char *libpath; - const char *entry; - unsigned long file_align; - unsigned long maxstack; - unsigned long maxdata; - boolean gc; - int modtype; - boolean textro; - boolean export_defineds; - asection **special_sections; -{ - struct xcoff_link_hash_entry *hentry; - asection *lsec; - struct xcoff_loader_info ldinfo; - int i; - size_t impsize, impcount; - struct xcoff_import_file *fl; - struct internal_ldhdr *ldhdr; - bfd_size_type stoff; - register char *out; - asection *sec; - bfd *sub; - struct bfd_strtab_hash *debug_strtab; - bfd_byte *debug_contents = NULL; - - if (! XCOFF_XVECP (output_bfd->xvec)) - { - for (i = 0; i < 6; i++) - special_sections[i] = NULL; - return true; - } - - ldinfo.failed = false; - ldinfo.output_bfd = output_bfd; - ldinfo.info = info; - ldinfo.export_defineds = export_defineds; - ldinfo.ldsym_count = 0; - ldinfo.string_size = 0; - ldinfo.strings = NULL; - ldinfo.string_alc = 0; - - xcoff_data (output_bfd)->maxstack = maxstack; - xcoff_data (output_bfd)->maxdata = maxdata; - xcoff_data (output_bfd)->modtype = modtype; - - xcoff_hash_table (info)->file_align = file_align; - xcoff_hash_table (info)->textro = textro; - - hentry = xcoff_link_hash_lookup (xcoff_hash_table (info), entry, - false, false, true); - if (hentry != NULL) - hentry->flags |= XCOFF_ENTRY; - - /* Garbage collect unused sections. */ - if (info->relocateable - || ! gc - || hentry == NULL - || (hentry->root.type != bfd_link_hash_defined - && hentry->root.type != bfd_link_hash_defweak)) - { - gc = false; - xcoff_hash_table (info)->gc = false; - - /* We still need to call xcoff_mark, in order to set ldrel_count - correctly. */ - for (sub = info->input_bfds; sub != NULL; sub = sub->link_next) - { - asection *o; - - for (o = sub->sections; o != NULL; o = o->next) - { - if ((o->flags & SEC_MARK) == 0) - { - if (! xcoff_mark (info, o)) - goto error_return; - } - } - } - } - else - { - if (! xcoff_mark (info, hentry->root.u.def.section)) - goto error_return; - xcoff_sweep (info); - xcoff_hash_table (info)->gc = true; - } - - /* Return special sections to the caller. */ - for (i = 0; i < 6; i++) - { - asection *sec; - - sec = xcoff_hash_table (info)->special_sections[i]; - if (sec != NULL - && gc - && (sec->flags & SEC_MARK) == 0) - sec = NULL; - special_sections[i] = sec; - } - - if (info->input_bfds == NULL) - { - /* I'm not sure what to do in this bizarre case. */ - return true; - } - - xcoff_link_hash_traverse (xcoff_hash_table (info), xcoff_build_ldsyms, - (PTR) &ldinfo); - if (ldinfo.failed) - goto error_return; - - /* Work out the size of the import file names. Each import file ID - consists of three null terminated strings: the path, the file - name, and the archive member name. The first entry in the list - of names is the path to use to find objects, which the linker has - passed in as the libpath argument. For some reason, the path - entry in the other import file names appears to always be empty. */ - impsize = strlen (libpath) + 3; - impcount = 1; - for (fl = xcoff_hash_table (info)->imports; fl != NULL; fl = fl->next) - { - ++impcount; - impsize += (strlen (fl->path) - + strlen (fl->file) - + strlen (fl->member) - + 3); - } - - /* Set up the .loader section header. */ - ldhdr = &xcoff_hash_table (info)->ldhdr; - ldhdr->l_version = 1; - ldhdr->l_nsyms = ldinfo.ldsym_count; - ldhdr->l_nreloc = xcoff_hash_table (info)->ldrel_count; - ldhdr->l_istlen = impsize; - ldhdr->l_nimpid = impcount; - ldhdr->l_impoff = (LDHDRSZ - + ldhdr->l_nsyms * LDSYMSZ - + ldhdr->l_nreloc * LDRELSZ); - ldhdr->l_stlen = ldinfo.string_size; - stoff = ldhdr->l_impoff + impsize; - if (ldinfo.string_size == 0) - ldhdr->l_stoff = 0; - else - ldhdr->l_stoff = stoff; - - /* We now know the final size of the .loader section. Allocate - space for it. */ - lsec = xcoff_hash_table (info)->loader_section; - lsec->_raw_size = stoff + ldhdr->l_stlen; - lsec->contents = (bfd_byte *) bfd_zalloc (output_bfd, lsec->_raw_size); - if (lsec->contents == NULL) - goto error_return; - - /* Set up the header. */ - xcoff_swap_ldhdr_out (output_bfd, ldhdr, - (struct external_ldhdr *) lsec->contents); - - /* Set up the import file names. */ - out = (char *) lsec->contents + ldhdr->l_impoff; - strcpy (out, libpath); - out += strlen (libpath) + 1; - *out++ = '\0'; - *out++ = '\0'; - for (fl = xcoff_hash_table (info)->imports; fl != NULL; fl = fl->next) - { - register const char *s; - - s = fl->path; - while ((*out++ = *s++) != '\0') - ; - s = fl->file; - while ((*out++ = *s++) != '\0') - ; - s = fl->member; - while ((*out++ = *s++) != '\0') - ; - } - - BFD_ASSERT ((bfd_size_type) ((bfd_byte *) out - lsec->contents) == stoff); - - /* Set up the symbol string table. */ - if (ldinfo.string_size > 0) - { - memcpy (out, ldinfo.strings, ldinfo.string_size); - free (ldinfo.strings); - ldinfo.strings = NULL; - } - - /* We can't set up the symbol table or the relocs yet, because we - don't yet know the final position of the various sections. The - .loader symbols are written out when the corresponding normal - symbols are written out in xcoff_link_input_bfd or - xcoff_write_global_symbol. The .loader relocs are written out - when the corresponding normal relocs are handled in - xcoff_link_input_bfd. */ - - /* Allocate space for the magic sections. */ - sec = xcoff_hash_table (info)->linkage_section; - if (sec->_raw_size > 0) - { - sec->contents = (bfd_byte *) bfd_zalloc (output_bfd, sec->_raw_size); - if (sec->contents == NULL) - goto error_return; - } - sec = xcoff_hash_table (info)->toc_section; - if (sec->_raw_size > 0) - { - sec->contents = (bfd_byte *) bfd_zalloc (output_bfd, sec->_raw_size); - if (sec->contents == NULL) - goto error_return; - } - sec = xcoff_hash_table (info)->descriptor_section; - if (sec->_raw_size > 0) - { - sec->contents = (bfd_byte *) bfd_zalloc (output_bfd, sec->_raw_size); - if (sec->contents == NULL) - goto error_return; - } - - /* Now that we've done garbage collection, figure out the contents - of the .debug section. */ - debug_strtab = xcoff_hash_table (info)->debug_strtab; - - for (sub = info->input_bfds; sub != NULL; sub = sub->link_next) - { - asection *subdeb; - bfd_size_type symcount; - unsigned long *debug_index; - asection **csectpp; - bfd_byte *esym, *esymend; - bfd_size_type symesz; - - if (sub->xvec != info->hash->creator) - continue; - subdeb = bfd_get_section_by_name (sub, ".debug"); - if (subdeb == NULL || subdeb->_raw_size == 0) - continue; - - if (info->strip == strip_all - || info->strip == strip_debugger - || info->discard == discard_all) - { - subdeb->_raw_size = 0; - continue; - } - - if (! _bfd_coff_get_external_symbols (sub)) - goto error_return; - - symcount = obj_raw_syment_count (sub); - debug_index = ((unsigned long *) - bfd_zalloc (sub, symcount * sizeof (unsigned long))); - if (debug_index == NULL) - goto error_return; - xcoff_data (sub)->debug_indices = debug_index; - - /* Grab the contents of the .debug section. We use malloc and - copy the neams into the debug stringtab, rather than - bfd_alloc, because I expect that, when linking many files - together, many of the strings will be the same. Storing the - strings in the hash table should save space in this case. */ - debug_contents = (bfd_byte *) bfd_malloc (subdeb->_raw_size); - if (debug_contents == NULL) - goto error_return; - if (! bfd_get_section_contents (sub, subdeb, (PTR) debug_contents, - (file_ptr) 0, subdeb->_raw_size)) - goto error_return; - - csectpp = xcoff_data (sub)->csects; - - symesz = bfd_coff_symesz (sub); - esym = (bfd_byte *) obj_coff_external_syms (sub); - esymend = esym + symcount * symesz; - while (esym < esymend) - { - struct internal_syment sym; - - bfd_coff_swap_sym_in (sub, (PTR) esym, (PTR) &sym); - - *debug_index = (unsigned long) -1; - - if (sym._n._n_n._n_zeroes == 0 - && *csectpp != NULL - && (! gc - || ((*csectpp)->flags & SEC_MARK) != 0 - || *csectpp == bfd_abs_section_ptr) - && bfd_coff_symname_in_debug (sub, &sym)) - { - char *name; - bfd_size_type indx; - - name = (char *) debug_contents + sym._n._n_n._n_offset; - indx = _bfd_stringtab_add (debug_strtab, name, true, true); - if (indx == (bfd_size_type) -1) - goto error_return; - *debug_index = indx; - } - - esym += (sym.n_numaux + 1) * symesz; - csectpp += sym.n_numaux + 1; - debug_index += sym.n_numaux + 1; - } - - free (debug_contents); - debug_contents = NULL; - - /* Clear the size of subdeb, so that it is not included directly - in the output file. */ - subdeb->_raw_size = 0; - - if (! info->keep_memory) - { - if (! _bfd_coff_free_symbols (sub)) - goto error_return; - } - } - - xcoff_hash_table (info)->debug_section->_raw_size = - _bfd_stringtab_size (debug_strtab); - - return true; - - error_return: - if (ldinfo.strings != NULL) - free (ldinfo.strings); - if (debug_contents != NULL) - free (debug_contents); - return false; -} - -/* Add a symbol to the .loader symbols, if necessary. */ - -static boolean -xcoff_build_ldsyms (h, p) - struct xcoff_link_hash_entry *h; - PTR p; -{ - struct xcoff_loader_info *ldinfo = (struct xcoff_loader_info *) p; - size_t len; - - /* If all defined symbols should be exported, mark them now. */ - if (ldinfo->export_defineds - && (h->flags & XCOFF_DEF_REGULAR) != 0) - h->flags |= XCOFF_EXPORT; - - /* We don't want to garbage collect symbols which are not defined in - XCOFF files. This is a convenient place to mark them. */ - if (xcoff_hash_table (ldinfo->info)->gc - && (h->flags & XCOFF_MARK) == 0 - && (h->root.type == bfd_link_hash_defined - || h->root.type == bfd_link_hash_defweak) - && (h->root.u.def.section->owner == NULL - || (h->root.u.def.section->owner->xvec - != ldinfo->info->hash->creator))) - h->flags |= XCOFF_MARK; - - /* If this symbol is called and defined in a dynamic object, or not - defined at all when building a shared object, or imported, then - we need to set up global linkage code for it. (Unless we did - garbage collection and we didn't need this symbol.) */ - if ((h->flags & XCOFF_CALLED) != 0 - && (h->root.type == bfd_link_hash_undefined - || h->root.type == bfd_link_hash_undefweak) - && h->root.root.string[0] == '.' - && h->descriptor != NULL - && ((h->descriptor->flags & XCOFF_DEF_DYNAMIC) != 0 - || ldinfo->info->shared - || ((h->descriptor->flags & XCOFF_IMPORT) != 0 - && (h->descriptor->flags & XCOFF_DEF_REGULAR) == 0)) - && (! xcoff_hash_table (ldinfo->info)->gc - || (h->flags & XCOFF_MARK) != 0)) - { - asection *sec; - struct xcoff_link_hash_entry *hds; - - sec = xcoff_hash_table (ldinfo->info)->linkage_section; - h->root.type = bfd_link_hash_defined; - h->root.u.def.section = sec; - h->root.u.def.value = sec->_raw_size; - h->smclas = XMC_GL; - h->flags |= XCOFF_DEF_REGULAR; - sec->_raw_size += XCOFF_GLINK_SIZE; - - /* The global linkage code requires a TOC entry for the - descriptor. */ - hds = h->descriptor; - BFD_ASSERT ((hds->root.type == bfd_link_hash_undefined - || hds->root.type == bfd_link_hash_undefweak) - && (hds->flags & XCOFF_DEF_REGULAR) == 0); - hds->flags |= XCOFF_MARK; - if (hds->toc_section == NULL) - { - hds->toc_section = xcoff_hash_table (ldinfo->info)->toc_section; - hds->u.toc_offset = hds->toc_section->_raw_size; - hds->toc_section->_raw_size += 4; - ++xcoff_hash_table (ldinfo->info)->ldrel_count; - ++hds->toc_section->reloc_count; - hds->indx = -2; - hds->flags |= XCOFF_SET_TOC | XCOFF_LDREL; - - /* We need to call xcoff_build_ldsyms recursively here, - because we may already have passed hds on the traversal. */ - xcoff_build_ldsyms (hds, p); - } - } - - /* If this symbol is exported, but not defined, we need to try to - define it. */ - if ((h->flags & XCOFF_EXPORT) != 0 - && (h->flags & XCOFF_IMPORT) == 0 - && (h->flags & XCOFF_DEF_REGULAR) == 0 - && (h->flags & XCOFF_DEF_DYNAMIC) == 0 - && (h->root.type == bfd_link_hash_undefined - || h->root.type == bfd_link_hash_undefweak)) - { - if ((h->flags & XCOFF_DESCRIPTOR) != 0 - && (h->descriptor->root.type == bfd_link_hash_defined - || h->descriptor->root.type == bfd_link_hash_defweak)) - { - asection *sec; - - /* This is an undefined function descriptor associated with - a defined entry point. We can build up a function - descriptor ourselves. Believe it or not, the AIX linker - actually does this, and there are cases where we need to - do it as well. */ - sec = xcoff_hash_table (ldinfo->info)->descriptor_section; - h->root.type = bfd_link_hash_defined; - h->root.u.def.section = sec; - h->root.u.def.value = sec->_raw_size; - h->smclas = XMC_DS; - h->flags |= XCOFF_DEF_REGULAR; - sec->_raw_size += 12; - - /* A function descriptor uses two relocs: one for the - associated code, and one for the TOC address. */ - xcoff_hash_table (ldinfo->info)->ldrel_count += 2; - sec->reloc_count += 2; - - /* We handle writing out the contents of the descriptor in - xcoff_write_global_symbol. */ - } - else - { - (*_bfd_error_handler) - ("attempt to export undefined symbol `%s'", - h->root.root.string); - ldinfo->failed = true; - bfd_set_error (bfd_error_invalid_operation); - return false; - } - } - - /* If this is still a common symbol, and it wasn't garbage - collected, we need to actually allocate space for it in the .bss - section. */ - if (h->root.type == bfd_link_hash_common - && (! xcoff_hash_table (ldinfo->info)->gc - || (h->flags & XCOFF_MARK) != 0) - && h->root.u.c.p->section->_raw_size == 0) - { - BFD_ASSERT (bfd_is_com_section (h->root.u.c.p->section)); - h->root.u.c.p->section->_raw_size = h->root.u.c.size; - } - - /* We need to add a symbol to the .loader section if it is mentioned - in a reloc which we are copying to the .loader section and it was - not defined or common, or if it is the entry point, or if it is - being exported. */ - - if (((h->flags & XCOFF_LDREL) == 0 - || h->root.type == bfd_link_hash_defined - || h->root.type == bfd_link_hash_defweak - || h->root.type == bfd_link_hash_common) - && (h->flags & XCOFF_ENTRY) == 0 - && (h->flags & XCOFF_EXPORT) == 0) - { - h->ldsym = NULL; - return true; - } - - /* We don't need to add this symbol if we did garbage collection and - we did not mark this symbol. */ - if (xcoff_hash_table (ldinfo->info)->gc - && (h->flags & XCOFF_MARK) == 0) - { - h->ldsym = NULL; - return true; - } - - /* We may have already processed this symbol due to the recursive - call above. */ - if ((h->flags & XCOFF_BUILT_LDSYM) != 0) - return true; - - /* We need to add this symbol to the .loader symbols. */ - - /* h->ldsym will already have been allocated for an explicitly - imported symbol. */ - if (h->ldsym == NULL) - { - h->ldsym = ((struct internal_ldsym *) - bfd_zalloc (ldinfo->output_bfd, - sizeof (struct internal_ldsym))); - if (h->ldsym == NULL) - { - ldinfo->failed = true; - return false; - } - } - - /* The first 3 symbol table indices are reserved to indicate the - sections. */ - h->ldindx = ldinfo->ldsym_count + 3; - - ++ldinfo->ldsym_count; - - len = strlen (h->root.root.string); - if (len <= SYMNMLEN) - strncpy (h->ldsym->_l._l_name, h->root.root.string, SYMNMLEN); - else - { - if (ldinfo->string_size + len + 3 > ldinfo->string_alc) - { - size_t newalc; - bfd_byte *newstrings; - - newalc = ldinfo->string_alc * 2; - if (newalc == 0) - newalc = 32; - while (ldinfo->string_size + len + 3 > newalc) - newalc *= 2; - - newstrings = ((bfd_byte *) - bfd_realloc ((PTR) ldinfo->strings, newalc)); - if (newstrings == NULL) - { - ldinfo->failed = true; - return false; - } - ldinfo->string_alc = newalc; - ldinfo->strings = newstrings; - } - - bfd_put_16 (ldinfo->output_bfd, len + 1, - ldinfo->strings + ldinfo->string_size); - strcpy (ldinfo->strings + ldinfo->string_size + 2, h->root.root.string); - h->ldsym->_l._l_l._l_zeroes = 0; - h->ldsym->_l._l_l._l_offset = ldinfo->string_size + 2; - ldinfo->string_size += len + 3; - } - - h->flags |= XCOFF_BUILT_LDSYM; - - return true; -} - -/* Do the final link step. */ - -boolean -_bfd_xcoff_bfd_final_link (abfd, info) - bfd *abfd; - struct bfd_link_info *info; -{ - bfd_size_type symesz; - struct xcoff_final_link_info finfo; - asection *o; - struct bfd_link_order *p; - size_t max_contents_size; - size_t max_sym_count; - size_t max_lineno_count; - size_t max_reloc_count; - size_t max_output_reloc_count; - file_ptr rel_filepos; - unsigned int relsz; - file_ptr line_filepos; - unsigned int linesz; - bfd *sub; - bfd_byte *external_relocs = NULL; - char strbuf[STRING_SIZE_SIZE]; - - if (info->shared) - abfd->flags |= DYNAMIC; - - symesz = bfd_coff_symesz (abfd); - - finfo.info = info; - finfo.output_bfd = abfd; - finfo.strtab = NULL; - finfo.section_info = NULL; - finfo.last_file_index = -1; - finfo.toc_symindx = -1; - finfo.internal_syms = NULL; - finfo.sym_indices = NULL; - finfo.outsyms = NULL; - finfo.linenos = NULL; - finfo.contents = NULL; - finfo.external_relocs = NULL; - - finfo.ldsym = ((struct external_ldsym *) - (xcoff_hash_table (info)->loader_section->contents - + LDHDRSZ)); - finfo.ldrel = ((struct external_ldrel *) - (xcoff_hash_table (info)->loader_section->contents - + LDHDRSZ - + xcoff_hash_table (info)->ldhdr.l_nsyms * LDSYMSZ)); - - xcoff_data (abfd)->coff.link_info = info; - - finfo.strtab = _bfd_stringtab_init (); - if (finfo.strtab == NULL) - goto error_return; - - /* Count the line number and relocation entries required for the - output file. Determine a few maximum sizes. */ - max_contents_size = 0; - max_lineno_count = 0; - max_reloc_count = 0; - for (o = abfd->sections; o != NULL; o = o->next) - { - o->reloc_count = 0; - o->lineno_count = 0; - for (p = o->link_order_head; p != NULL; p = p->next) - { - if (p->type == bfd_indirect_link_order) - { - asection *sec; - - sec = p->u.indirect.section; - - if (info->strip == strip_none - || info->strip == strip_some) - o->lineno_count += sec->lineno_count; - - o->reloc_count += sec->reloc_count; - - if (sec->_raw_size > max_contents_size) - max_contents_size = sec->_raw_size; - if (sec->lineno_count > max_lineno_count) - max_lineno_count = sec->lineno_count; - if (coff_section_data (sec->owner, sec) != NULL - && xcoff_section_data (sec->owner, sec) != NULL - && (xcoff_section_data (sec->owner, sec)->lineno_count - > max_lineno_count)) - max_lineno_count = - xcoff_section_data (sec->owner, sec)->lineno_count; - if (sec->reloc_count > max_reloc_count) - max_reloc_count = sec->reloc_count; - } - else if (p->type == bfd_section_reloc_link_order - || p->type == bfd_symbol_reloc_link_order) - ++o->reloc_count; - } - } - - /* Compute the file positions for all the sections. */ - if (abfd->output_has_begun) - { - if (xcoff_hash_table (info)->file_align != 0) - abort (); - } - else - { - bfd_vma file_align; - - file_align = xcoff_hash_table (info)->file_align; - if (file_align != 0) - { - boolean saw_contents; - int indx; - asection **op; - file_ptr sofar; - - /* Insert .pad sections before every section which has - contents and is loaded, if it is preceded by some other - section which has contents and is loaded. */ - saw_contents = true; - for (op = &abfd->sections; *op != NULL; op = &(*op)->next) - { - (*op)->target_index = indx; - if (strcmp ((*op)->name, ".pad") == 0) - saw_contents = false; - else if (((*op)->flags & SEC_HAS_CONTENTS) != 0 - && ((*op)->flags & SEC_LOAD) != 0) - { - if (! saw_contents) - saw_contents = true; - else - { - asection *n, *hold; - - hold = *op; - *op = NULL; - n = bfd_make_section_anyway (abfd, ".pad"); - BFD_ASSERT (*op == n); - n->next = hold; - n->flags = SEC_HAS_CONTENTS; - n->alignment_power = 0; - saw_contents = false; - } - } - } - - /* Reset the section indices after inserting the new - sections. */ - indx = 0; - for (o = abfd->sections; o != NULL; o = o->next) - { - ++indx; - o->target_index = indx; - } - BFD_ASSERT ((unsigned int) indx == abfd->section_count); - - /* Work out appropriate sizes for the .pad sections to force - each section to land on a page boundary. This bit of - code knows what compute_section_file_positions is going - to do. */ - sofar = bfd_coff_filhsz (abfd); - sofar += bfd_coff_aoutsz (abfd); - sofar += abfd->section_count * bfd_coff_scnhsz (abfd); - for (o = abfd->sections; o != NULL; o = o->next) - if (o->reloc_count >= 0xffff || o->lineno_count >= 0xffff) - sofar += bfd_coff_scnhsz (abfd); - - for (o = abfd->sections; o != NULL; o = o->next) - { - if (strcmp (o->name, ".pad") == 0) - { - bfd_vma pageoff; - - BFD_ASSERT (o->_raw_size == 0); - pageoff = sofar & (file_align - 1); - if (pageoff != 0) - { - o->_raw_size = file_align - pageoff; - sofar += file_align - pageoff; - o->flags |= SEC_HAS_CONTENTS; - } - } - else - { - if ((o->flags & SEC_HAS_CONTENTS) != 0) - sofar += BFD_ALIGN (o->_raw_size, - 1 << o->alignment_power); - } - } - } - - bfd_coff_compute_section_file_positions (abfd); - } - - /* Allocate space for the pointers we need to keep for the relocs. */ - { - unsigned int i; - - /* We use section_count + 1, rather than section_count, because - the target_index fields are 1 based. */ - finfo.section_info = - ((struct xcoff_link_section_info *) - bfd_malloc ((abfd->section_count + 1) - * sizeof (struct xcoff_link_section_info))); - if (finfo.section_info == NULL) - goto error_return; - for (i = 0; i <= abfd->section_count; i++) - { - finfo.section_info[i].relocs = NULL; - finfo.section_info[i].rel_hashes = NULL; - finfo.section_info[i].toc_rel_hashes = NULL; - } - } - - /* Set the file positions for the relocs. */ - rel_filepos = obj_relocbase (abfd); - relsz = bfd_coff_relsz (abfd); - max_output_reloc_count = 0; - for (o = abfd->sections; o != NULL; o = o->next) - { - if (o->reloc_count == 0) - o->rel_filepos = 0; - else - { - o->flags |= SEC_RELOC; - o->rel_filepos = rel_filepos; - rel_filepos += o->reloc_count * relsz; - - /* We don't know the indices of global symbols until we have - written out all the local symbols. For each section in - the output file, we keep an array of pointers to hash - table entries. Each entry in the array corresponds to a - reloc. When we find a reloc against a global symbol, we - set the corresponding entry in this array so that we can - fix up the symbol index after we have written out all the - local symbols. - - Because of this problem, we also keep the relocs in - memory until the end of the link. This wastes memory. - We could backpatch the file later, I suppose, although it - would be slow. */ - finfo.section_info[o->target_index].relocs = - ((struct internal_reloc *) - bfd_malloc (o->reloc_count * sizeof (struct internal_reloc))); - finfo.section_info[o->target_index].rel_hashes = - ((struct xcoff_link_hash_entry **) - bfd_malloc (o->reloc_count - * sizeof (struct xcoff_link_hash_entry *))); - if (finfo.section_info[o->target_index].relocs == NULL - || finfo.section_info[o->target_index].rel_hashes == NULL) - goto error_return; - - if (o->reloc_count > max_output_reloc_count) - max_output_reloc_count = o->reloc_count; - } - } - - /* We now know the size of the relocs, so we can determine the file - positions of the line numbers. */ - line_filepos = rel_filepos; - finfo.line_filepos = line_filepos; - linesz = bfd_coff_linesz (abfd); - for (o = abfd->sections; o != NULL; o = o->next) - { - if (o->lineno_count == 0) - o->line_filepos = 0; - else - { - o->line_filepos = line_filepos; - line_filepos += o->lineno_count * linesz; - } - - /* Reset the reloc and lineno counts, so that we can use them to - count the number of entries we have output so far. */ - o->reloc_count = 0; - o->lineno_count = 0; - } - - obj_sym_filepos (abfd) = line_filepos; - - /* Figure out the largest number of symbols in an input BFD. Take - the opportunity to clear the output_has_begun fields of all the - input BFD's. We want at least 4 symbols, since that is the - number which xcoff_write_global_symbol may need. */ - max_sym_count = 4; - for (sub = info->input_bfds; sub != NULL; sub = sub->link_next) - { - size_t sz; - - sub->output_has_begun = false; - sz = obj_raw_syment_count (sub); - if (sz > max_sym_count) - max_sym_count = sz; - } - - /* Allocate some buffers used while linking. */ - finfo.internal_syms = ((struct internal_syment *) - bfd_malloc (max_sym_count - * sizeof (struct internal_syment))); - finfo.sym_indices = (long *) bfd_malloc (max_sym_count * sizeof (long)); - finfo.outsyms = ((bfd_byte *) - bfd_malloc ((size_t) ((max_sym_count + 1) * symesz))); - finfo.linenos = (bfd_byte *) bfd_malloc (max_lineno_count - * bfd_coff_linesz (abfd)); - finfo.contents = (bfd_byte *) bfd_malloc (max_contents_size); - finfo.external_relocs = (bfd_byte *) bfd_malloc (max_reloc_count * relsz); - if ((finfo.internal_syms == NULL && max_sym_count > 0) - || (finfo.sym_indices == NULL && max_sym_count > 0) - || finfo.outsyms == NULL - || (finfo.linenos == NULL && max_lineno_count > 0) - || (finfo.contents == NULL && max_contents_size > 0) - || (finfo.external_relocs == NULL && max_reloc_count > 0)) - goto error_return; - - obj_raw_syment_count (abfd) = 0; - xcoff_data (abfd)->toc = (bfd_vma) -1; - - /* We now know the position of everything in the file, except that - we don't know the size of the symbol table and therefore we don't - know where the string table starts. We just build the string - table in memory as we go along. We process all the relocations - for a single input file at once. */ - for (o = abfd->sections; o != NULL; o = o->next) - { - for (p = o->link_order_head; p != NULL; p = p->next) - { - if (p->type == bfd_indirect_link_order - && p->u.indirect.section->owner->xvec == abfd->xvec) - { - sub = p->u.indirect.section->owner; - if (! sub->output_has_begun) - { - if (! xcoff_link_input_bfd (&finfo, sub)) - goto error_return; - sub->output_has_begun = true; - } - } - else if (p->type == bfd_section_reloc_link_order - || p->type == bfd_symbol_reloc_link_order) - { - if (! xcoff_reloc_link_order (abfd, &finfo, o, p)) - goto error_return; - } - else - { - if (! _bfd_default_link_order (abfd, info, o, p)) - goto error_return; - } - } - } - - /* Free up the buffers used by xcoff_link_input_bfd. */ - - if (finfo.internal_syms != NULL) - { - free (finfo.internal_syms); - finfo.internal_syms = NULL; - } - if (finfo.sym_indices != NULL) - { - free (finfo.sym_indices); - finfo.sym_indices = NULL; - } - if (finfo.linenos != NULL) - { - free (finfo.linenos); - finfo.linenos = NULL; - } - if (finfo.contents != NULL) - { - free (finfo.contents); - finfo.contents = NULL; - } - if (finfo.external_relocs != NULL) - { - free (finfo.external_relocs); - finfo.external_relocs = NULL; - } - - /* The value of the last C_FILE symbol is supposed to be -1. Write - it out again. */ - if (finfo.last_file_index != -1) - { - finfo.last_file.n_value = -1; - bfd_coff_swap_sym_out (abfd, (PTR) &finfo.last_file, - (PTR) finfo.outsyms); - if (bfd_seek (abfd, - (obj_sym_filepos (abfd) - + finfo.last_file_index * symesz), - SEEK_SET) != 0 - || bfd_write (finfo.outsyms, symesz, 1, abfd) != symesz) - goto error_return; - } - - /* Write out all the global symbols which do not come from XCOFF - input files. */ - xcoff_link_hash_traverse (xcoff_hash_table (info), - xcoff_write_global_symbol, - (PTR) &finfo); - - if (finfo.outsyms != NULL) - { - free (finfo.outsyms); - finfo.outsyms = NULL; - } - - /* Now that we have written out all the global symbols, we know the - symbol indices to use for relocs against them, and we can finally - write out the relocs. */ - external_relocs = (bfd_byte *) malloc (max_output_reloc_count * relsz); - if (external_relocs == NULL && max_output_reloc_count != 0) - { - bfd_set_error (bfd_error_no_memory); - goto error_return; - } - - for (o = abfd->sections; o != NULL; o = o->next) - { - struct internal_reloc *irel; - struct internal_reloc *irelend; - struct xcoff_link_hash_entry **rel_hash; - struct xcoff_toc_rel_hash *toc_rel_hash; - bfd_byte *erel; - - if (o->reloc_count == 0) - continue; - - irel = finfo.section_info[o->target_index].relocs; - irelend = irel + o->reloc_count; - rel_hash = finfo.section_info[o->target_index].rel_hashes; - for (; irel < irelend; irel++, rel_hash++, erel += relsz) - { - if (*rel_hash != NULL) - { - if ((*rel_hash)->indx < 0) - { - if (! ((*info->callbacks->unattached_reloc) - (info, (*rel_hash)->root.root.string, - (bfd *) NULL, o, irel->r_vaddr))) - goto error_return; - (*rel_hash)->indx = 0; - } - irel->r_symndx = (*rel_hash)->indx; - } - } - - for (toc_rel_hash = finfo.section_info[o->target_index].toc_rel_hashes; - toc_rel_hash != NULL; - toc_rel_hash = toc_rel_hash->next) - { - if (toc_rel_hash->h->u.toc_indx < 0) - { - if (! ((*info->callbacks->unattached_reloc) - (info, toc_rel_hash->h->root.root.string, - (bfd *) NULL, o, toc_rel_hash->rel->r_vaddr))) - goto error_return; - toc_rel_hash->h->u.toc_indx = 0; - } - toc_rel_hash->rel->r_symndx = toc_rel_hash->h->u.toc_indx; - } - - /* XCOFF requires that the relocs be sorted by address. We tend - to produce them in the order in which their containing csects - appear in the symbol table, which is not necessarily by - address. So we sort them here. There may be a better way to - do this. */ - qsort ((PTR) finfo.section_info[o->target_index].relocs, - o->reloc_count, sizeof (struct internal_reloc), - xcoff_sort_relocs); - - irel = finfo.section_info[o->target_index].relocs; - irelend = irel + o->reloc_count; - erel = external_relocs; - for (; irel < irelend; irel++, rel_hash++, erel += relsz) - bfd_coff_swap_reloc_out (abfd, (PTR) irel, (PTR) erel); - - if (bfd_seek (abfd, o->rel_filepos, SEEK_SET) != 0 - || bfd_write ((PTR) external_relocs, relsz, o->reloc_count, - abfd) != relsz * o->reloc_count) - goto error_return; - } - - if (external_relocs != NULL) - { - free (external_relocs); - external_relocs = NULL; - } - - /* Free up the section information. */ - if (finfo.section_info != NULL) - { - unsigned int i; - - for (i = 0; i < abfd->section_count; i++) - { - if (finfo.section_info[i].relocs != NULL) - free (finfo.section_info[i].relocs); - if (finfo.section_info[i].rel_hashes != NULL) - free (finfo.section_info[i].rel_hashes); - } - free (finfo.section_info); - finfo.section_info = NULL; - } - - /* Write out the loader section contents. */ - BFD_ASSERT ((bfd_byte *) finfo.ldrel - == (xcoff_hash_table (info)->loader_section->contents - + xcoff_hash_table (info)->ldhdr.l_impoff)); - o = xcoff_hash_table (info)->loader_section; - if (! bfd_set_section_contents (abfd, o->output_section, - o->contents, o->output_offset, - o->_raw_size)) - goto error_return; - - /* Write out the magic sections. */ - o = xcoff_hash_table (info)->linkage_section; - if (o->_raw_size > 0 - && ! bfd_set_section_contents (abfd, o->output_section, o->contents, - o->output_offset, o->_raw_size)) - goto error_return; - o = xcoff_hash_table (info)->toc_section; - if (o->_raw_size > 0 - && ! bfd_set_section_contents (abfd, o->output_section, o->contents, - o->output_offset, o->_raw_size)) - goto error_return; - o = xcoff_hash_table (info)->descriptor_section; - if (o->_raw_size > 0 - && ! bfd_set_section_contents (abfd, o->output_section, o->contents, - o->output_offset, o->_raw_size)) - goto error_return; - - /* Write out the string table. */ - if (bfd_seek (abfd, - (obj_sym_filepos (abfd) - + obj_raw_syment_count (abfd) * symesz), - SEEK_SET) != 0) - goto error_return; - bfd_h_put_32 (abfd, - _bfd_stringtab_size (finfo.strtab) + STRING_SIZE_SIZE, - (bfd_byte *) strbuf); - if (bfd_write (strbuf, 1, STRING_SIZE_SIZE, abfd) != STRING_SIZE_SIZE) - goto error_return; - if (! _bfd_stringtab_emit (abfd, finfo.strtab)) - goto error_return; - - _bfd_stringtab_free (finfo.strtab); - - /* Write out the debugging string table. */ - o = xcoff_hash_table (info)->debug_section; - if (o != NULL) - { - struct bfd_strtab_hash *debug_strtab; - - debug_strtab = xcoff_hash_table (info)->debug_strtab; - BFD_ASSERT (o->output_section->_raw_size - o->output_offset - >= _bfd_stringtab_size (debug_strtab)); - if (bfd_seek (abfd, - o->output_section->filepos + o->output_offset, - SEEK_SET) != 0) - goto error_return; - if (! _bfd_stringtab_emit (abfd, debug_strtab)) - goto error_return; - } - - /* Setting bfd_get_symcount to 0 will cause write_object_contents to - not try to write out the symbols. */ - bfd_get_symcount (abfd) = 0; - - return true; - - error_return: - if (finfo.strtab != NULL) - _bfd_stringtab_free (finfo.strtab); - if (finfo.section_info != NULL) - { - unsigned int i; - - for (i = 0; i < abfd->section_count; i++) - { - if (finfo.section_info[i].relocs != NULL) - free (finfo.section_info[i].relocs); - if (finfo.section_info[i].rel_hashes != NULL) - free (finfo.section_info[i].rel_hashes); - } - free (finfo.section_info); - } - if (finfo.internal_syms != NULL) - free (finfo.internal_syms); - if (finfo.sym_indices != NULL) - free (finfo.sym_indices); - if (finfo.outsyms != NULL) - free (finfo.outsyms); - if (finfo.linenos != NULL) - free (finfo.linenos); - if (finfo.contents != NULL) - free (finfo.contents); - if (finfo.external_relocs != NULL) - free (finfo.external_relocs); - if (external_relocs != NULL) - free (external_relocs); - return false; -} - -/* Link an input file into the linker output file. This function - handles all the sections and relocations of the input file at once. */ - -static boolean -xcoff_link_input_bfd (finfo, input_bfd) - struct xcoff_final_link_info *finfo; - bfd *input_bfd; -{ - bfd *output_bfd; - const char *strings; - bfd_size_type syment_base; - unsigned int n_tmask; - unsigned int n_btshft; - boolean copy, hash; - bfd_size_type isymesz; - bfd_size_type osymesz; - bfd_size_type linesz; - bfd_byte *esym; - bfd_byte *esym_end; - struct xcoff_link_hash_entry **sym_hash; - struct internal_syment *isymp; - asection **csectpp; - unsigned long *debug_index; - long *indexp; - unsigned long output_index; - bfd_byte *outsym; - unsigned int incls; - asection *oline; - boolean keep_syms; - asection *o; - - /* We can just skip DYNAMIC files, unless this is a static link. */ - if ((input_bfd->flags & DYNAMIC) != 0 - && ! finfo->info->static_link) - return true; - - /* Move all the symbols to the output file. */ - - output_bfd = finfo->output_bfd; - strings = NULL; - syment_base = obj_raw_syment_count (output_bfd); - isymesz = bfd_coff_symesz (input_bfd); - osymesz = bfd_coff_symesz (output_bfd); - linesz = bfd_coff_linesz (input_bfd); - BFD_ASSERT (linesz == bfd_coff_linesz (output_bfd)); - - n_tmask = coff_data (input_bfd)->local_n_tmask; - n_btshft = coff_data (input_bfd)->local_n_btshft; - - /* Define macros so that ISFCN, et. al., macros work correctly. */ -#define N_TMASK n_tmask -#define N_BTSHFT n_btshft - - copy = false; - if (! finfo->info->keep_memory) - copy = true; - hash = true; - if ((output_bfd->flags & BFD_TRADITIONAL_FORMAT) != 0) - hash = false; - - if (! _bfd_coff_get_external_symbols (input_bfd)) - return false; - - esym = (bfd_byte *) obj_coff_external_syms (input_bfd); - esym_end = esym + obj_raw_syment_count (input_bfd) * isymesz; - sym_hash = obj_xcoff_sym_hashes (input_bfd); - csectpp = xcoff_data (input_bfd)->csects; - debug_index = xcoff_data (input_bfd)->debug_indices; - isymp = finfo->internal_syms; - indexp = finfo->sym_indices; - output_index = syment_base; - outsym = finfo->outsyms; - incls = 0; - oline = NULL; - - while (esym < esym_end) - { - struct internal_syment isym; - union internal_auxent aux; - int smtyp = 0; - boolean skip; - boolean require; - int add; - - bfd_coff_swap_sym_in (input_bfd, (PTR) esym, (PTR) isymp); - - /* If this is a C_EXT or C_HIDEXT symbol, we need the csect - information. */ - if (isymp->n_sclass == C_EXT || isymp->n_sclass == C_HIDEXT) - { - BFD_ASSERT (isymp->n_numaux > 0); - bfd_coff_swap_aux_in (input_bfd, - (PTR) (esym + isymesz * isymp->n_numaux), - isymp->n_type, isymp->n_sclass, - isymp->n_numaux - 1, isymp->n_numaux, - (PTR) &aux); - smtyp = SMTYP_SMTYP (aux.x_csect.x_smtyp); - } - - /* Make a copy of *isymp so that the relocate_section function - always sees the original values. This is more reliable than - always recomputing the symbol value even if we are stripping - the symbol. */ - isym = *isymp; - - /* If this symbol is in the .loader section, swap out the - .loader symbol information. If this is an external symbol - reference to a defined symbol, though, then wait until we get - to the definition. */ - if (isym.n_sclass == C_EXT - && *sym_hash != NULL - && (*sym_hash)->ldsym != NULL - && (smtyp != XTY_ER - || (*sym_hash)->root.type == bfd_link_hash_undefined)) - { - struct xcoff_link_hash_entry *h; - struct internal_ldsym *ldsym; - - h = *sym_hash; - ldsym = h->ldsym; - if (isym.n_scnum > 0) - { - ldsym->l_scnum = (*csectpp)->output_section->target_index; - ldsym->l_value = (isym.n_value - + (*csectpp)->output_section->vma - + (*csectpp)->output_offset - - (*csectpp)->vma); - } - else - { - ldsym->l_scnum = isym.n_scnum; - ldsym->l_value = isym.n_value; - } - - ldsym->l_smtype = smtyp; - if (((h->flags & XCOFF_DEF_REGULAR) == 0 - && (h->flags & XCOFF_DEF_DYNAMIC) != 0) - || (h->flags & XCOFF_IMPORT) != 0) - ldsym->l_smtype |= L_IMPORT; - if (((h->flags & XCOFF_DEF_REGULAR) != 0 - && (h->flags & XCOFF_DEF_DYNAMIC) != 0) - || (h->flags & XCOFF_EXPORT) != 0) - ldsym->l_smtype |= L_EXPORT; - if ((h->flags & XCOFF_ENTRY) != 0) - ldsym->l_smtype |= L_ENTRY; - - ldsym->l_smclas = aux.x_csect.x_smclas; - - if (ldsym->l_ifile == (bfd_size_type) -1) - ldsym->l_ifile = 0; - else if (ldsym->l_ifile == 0) - { - if ((ldsym->l_smtype & L_IMPORT) == 0) - ldsym->l_ifile = 0; - else - { - bfd *impbfd; - - if (h->root.type == bfd_link_hash_defined - || h->root.type == bfd_link_hash_defweak) - impbfd = h->root.u.def.section->owner; - else if (h->root.type == bfd_link_hash_undefined - || h->root.type == bfd_link_hash_undefweak) - impbfd = h->root.u.undef.abfd; - else - impbfd = NULL; - - if (impbfd == NULL) - ldsym->l_ifile = 0; - else - { - BFD_ASSERT (impbfd->xvec == finfo->output_bfd->xvec); - ldsym->l_ifile = xcoff_data (impbfd)->import_file_id; - } - } - } - - ldsym->l_parm = 0; - - BFD_ASSERT (h->ldindx >= 0); - BFD_ASSERT (LDSYMSZ == sizeof (struct external_ldsym)); - xcoff_swap_ldsym_out (finfo->output_bfd, ldsym, - finfo->ldsym + h->ldindx - 3); - h->ldsym = NULL; - - /* Fill in snentry now that we know the target_index. */ - if ((h->flags & XCOFF_ENTRY) != 0 - && (h->root.type == bfd_link_hash_defined - || h->root.type == bfd_link_hash_defweak)) - xcoff_data (output_bfd)->snentry = - h->root.u.def.section->output_section->target_index; - } - - *indexp = -1; - - skip = false; - require = false; - add = 1 + isym.n_numaux; - - /* If we are skipping this csect, we want to skip this symbol. */ - if (*csectpp == NULL) - skip = true; - - /* If we garbage collected this csect, we want to skip this - symbol. */ - if (! skip - && xcoff_hash_table (finfo->info)->gc - && ((*csectpp)->flags & SEC_MARK) == 0 - && *csectpp != bfd_abs_section_ptr) - skip = true; - - /* An XCOFF linker always skips C_STAT symbols. */ - if (! skip - && isymp->n_sclass == C_STAT) - skip = true; - - /* We skip all but the first TOC anchor. */ - if (! skip - && isymp->n_sclass == C_HIDEXT - && aux.x_csect.x_smclas == XMC_TC0) - { - if (finfo->toc_symindx != -1) - skip = true; - else - { - bfd_vma tocval, tocend; - - tocval = ((*csectpp)->output_section->vma - + (*csectpp)->output_offset - + isym.n_value - - (*csectpp)->vma); - /* We want to find out if tocval is a good value to use - as the TOC anchor--that is, whether we can access all - of the TOC using a 16 bit offset from tocval. This - test assumes that the TOC comes at the end of the - output section, as it does in the default linker - script. If the TOC anchor is too far into the .toc - section, the relocation routine will report - overflows. */ - tocend = ((*csectpp)->output_section->vma - + (*csectpp)->output_section->_raw_size); - if (tocval + 0x8000 < tocend) - { - bfd_vma tocadd; - - tocadd = tocend - (tocval + 0x8000); - tocval += tocadd; - isym.n_value += tocadd; - } - - finfo->toc_symindx = output_index; - xcoff_data (finfo->output_bfd)->toc = tocval; - xcoff_data (finfo->output_bfd)->sntoc = - (*csectpp)->output_section->target_index; - require = true; - } - } - - /* If we are stripping all symbols, we want to skip this one. */ - if (! skip - && finfo->info->strip == strip_all) - skip = true; - - /* We can skip resolved external references. */ - if (! skip - && isym.n_sclass == C_EXT - && smtyp == XTY_ER - && (*sym_hash)->root.type != bfd_link_hash_undefined) - skip = true; - - /* We can skip common symbols if they got defined somewhere - else. */ - if (! skip - && isym.n_sclass == C_EXT - && smtyp == XTY_CM - && ((*sym_hash)->root.type != bfd_link_hash_common - || (*sym_hash)->root.u.c.p->section != *csectpp) - && ((*sym_hash)->root.type != bfd_link_hash_defined - || (*sym_hash)->root.u.def.section != *csectpp)) - skip = true; - - /* Skip local symbols if we are discarding them. */ - if (! skip - && finfo->info->discard == discard_all - && isym.n_sclass != C_EXT - && (isym.n_sclass != C_HIDEXT - || smtyp != XTY_SD)) - skip = true; - - /* If we stripping debugging symbols, and this is a debugging - symbol, then skip it. */ - if (! skip - && finfo->info->strip == strip_debugger - && isym.n_scnum == N_DEBUG) - skip = true; - - /* If some symbols are stripped based on the name, work out the - name and decide whether to skip this symbol. We don't handle - this correctly for symbols whose names are in the .debug - section; to get it right we would need a new bfd_strtab_hash - function to return the string given the index. */ - if (! skip - && (finfo->info->strip == strip_some - || finfo->info->discard == discard_l) - && (debug_index == NULL || *debug_index == (unsigned long) -1)) - { - const char *name; - char buf[SYMNMLEN + 1]; - - name = _bfd_coff_internal_syment_name (input_bfd, &isym, buf); - if (name == NULL) - return false; - - if ((finfo->info->strip == strip_some - && (bfd_hash_lookup (finfo->info->keep_hash, name, false, - false) == NULL)) - || (finfo->info->discard == discard_l - && (isym.n_sclass != C_EXT - && (isym.n_sclass != C_HIDEXT - || smtyp != XTY_SD)) - && strncmp (name, finfo->info->lprefix, - finfo->info->lprefix_len) == 0)) - skip = true; - } - - /* We can not skip the first TOC anchor. */ - if (skip - && require - && finfo->info->strip != strip_all) - skip = false; - - /* We now know whether we are to skip this symbol or not. */ - if (! skip) - { - /* Adjust the symbol in order to output it. */ - - if (isym._n._n_n._n_zeroes == 0 - && isym._n._n_n._n_offset != 0) - { - /* This symbol has a long name. Enter it in the string - table we are building. If *debug_index != -1, the - name has already been entered in the .debug section. */ - if (debug_index != NULL && *debug_index != (unsigned long) -1) - isym._n._n_n._n_offset = *debug_index; - else - { - const char *name; - bfd_size_type indx; - - name = _bfd_coff_internal_syment_name (input_bfd, &isym, - (char *) NULL); - if (name == NULL) - return false; - indx = _bfd_stringtab_add (finfo->strtab, name, hash, copy); - if (indx == (bfd_size_type) -1) - return false; - isym._n._n_n._n_offset = STRING_SIZE_SIZE + indx; - } - } - - if (isym.n_sclass != C_BSTAT - && isym.n_sclass != C_ESTAT - && isym.n_sclass != C_DECL - && isym.n_scnum > 0) - { - isym.n_scnum = (*csectpp)->output_section->target_index; - isym.n_value += ((*csectpp)->output_section->vma - + (*csectpp)->output_offset - - (*csectpp)->vma); - } - - /* The value of a C_FILE symbol is the symbol index of the - next C_FILE symbol. The value of the last C_FILE symbol - is -1. We try to get this right, below, just before we - write the symbols out, but in the general case we may - have to write the symbol out twice. */ - if (isym.n_sclass == C_FILE) - { - if (finfo->last_file_index != -1 - && finfo->last_file.n_value != (long) output_index) - { - /* We must correct the value of the last C_FILE entry. */ - finfo->last_file.n_value = output_index; - if ((bfd_size_type) finfo->last_file_index >= syment_base) - { - /* The last C_FILE symbol is in this input file. */ - bfd_coff_swap_sym_out (output_bfd, - (PTR) &finfo->last_file, - (PTR) (finfo->outsyms - + ((finfo->last_file_index - - syment_base) - * osymesz))); - } - else - { - /* We have already written out the last C_FILE - symbol. We need to write it out again. We - borrow *outsym temporarily. */ - bfd_coff_swap_sym_out (output_bfd, - (PTR) &finfo->last_file, - (PTR) outsym); - if (bfd_seek (output_bfd, - (obj_sym_filepos (output_bfd) - + finfo->last_file_index * osymesz), - SEEK_SET) != 0 - || (bfd_write (outsym, osymesz, 1, output_bfd) - != osymesz)) - return false; - } - } - - finfo->last_file_index = output_index; - finfo->last_file = isym; - } - - /* The value of a C_BINCL or C_EINCL symbol is a file offset - into the line numbers. We update the symbol values when - we handle the line numbers. */ - if (isym.n_sclass == C_BINCL - || isym.n_sclass == C_EINCL) - { - isym.n_value = finfo->line_filepos; - ++incls; - } - - /* Output the symbol. */ - - bfd_coff_swap_sym_out (output_bfd, (PTR) &isym, (PTR) outsym); - - *indexp = output_index; - - if (isym.n_sclass == C_EXT) - { - long indx; - struct xcoff_link_hash_entry *h; - - indx = ((esym - (bfd_byte *) obj_coff_external_syms (input_bfd)) - / isymesz); - h = obj_xcoff_sym_hashes (input_bfd)[indx]; - BFD_ASSERT (h != NULL); - h->indx = output_index; - } - - /* If this is a symbol in the TOC which we may have merged - (class XMC_TC), remember the symbol index of the TOC - symbol. */ - if (isym.n_sclass == C_HIDEXT - && aux.x_csect.x_smclas == XMC_TC - && *sym_hash != NULL) - { - BFD_ASSERT (((*sym_hash)->flags & XCOFF_SET_TOC) == 0); - BFD_ASSERT ((*sym_hash)->toc_section != NULL); - (*sym_hash)->u.toc_indx = output_index; - } - - output_index += add; - outsym += add * osymesz; - } - - esym += add * isymesz; - isymp += add; - csectpp += add; - sym_hash += add; - if (debug_index != NULL) - debug_index += add; - ++indexp; - for (--add; add > 0; --add) - *indexp++ = -1; - } - - /* Fix up the aux entries and the C_BSTAT symbols. This must be - done in a separate pass, because we don't know the correct symbol - indices until we have already decided which symbols we are going - to keep. */ - - esym = (bfd_byte *) obj_coff_external_syms (input_bfd); - esym_end = esym + obj_raw_syment_count (input_bfd) * isymesz; - isymp = finfo->internal_syms; - indexp = finfo->sym_indices; - csectpp = xcoff_data (input_bfd)->csects; - outsym = finfo->outsyms; - while (esym < esym_end) - { - int add; - - add = 1 + isymp->n_numaux; - - if (*indexp < 0) - esym += add * isymesz; - else - { - int i; - - if (isymp->n_sclass == C_BSTAT) - { - struct internal_syment isym; - unsigned long indx; - - /* The value of a C_BSTAT symbol is the symbol table - index of the containing csect. */ - bfd_coff_swap_sym_in (output_bfd, (PTR) outsym, (PTR) &isym); - indx = isym.n_value; - if (indx < obj_raw_syment_count (input_bfd)) - { - long symindx; - - symindx = finfo->sym_indices[indx]; - if (symindx < 0) - isym.n_value = 0; - else - isym.n_value = symindx; - bfd_coff_swap_sym_out (output_bfd, (PTR) &isym, - (PTR) outsym); - } - } - - esym += isymesz; - outsym += osymesz; - - for (i = 0; i < isymp->n_numaux && esym < esym_end; i++) - { - union internal_auxent aux; - - bfd_coff_swap_aux_in (input_bfd, (PTR) esym, isymp->n_type, - isymp->n_sclass, i, isymp->n_numaux, - (PTR) &aux); - - if (isymp->n_sclass == C_FILE) - { - /* This is the file name (or some comment put in by - the compiler). If it is long, we must put it in - the string table. */ - if (aux.x_file.x_n.x_zeroes == 0 - && aux.x_file.x_n.x_offset != 0) - { - const char *filename; - bfd_size_type indx; - - BFD_ASSERT (aux.x_file.x_n.x_offset - >= STRING_SIZE_SIZE); - if (strings == NULL) - { - strings = _bfd_coff_read_string_table (input_bfd); - if (strings == NULL) - return false; - } - filename = strings + aux.x_file.x_n.x_offset; - indx = _bfd_stringtab_add (finfo->strtab, filename, - hash, copy); - if (indx == (bfd_size_type) -1) - return false; - aux.x_file.x_n.x_offset = STRING_SIZE_SIZE + indx; - } - } - else if ((isymp->n_sclass == C_EXT - || isymp->n_sclass == C_HIDEXT) - && i + 1 == isymp->n_numaux) - { - /* We don't support type checking. I don't know if - anybody does. */ - aux.x_csect.x_parmhash = 0; - /* I don't think anybody uses these fields, but we'd - better clobber them just in case. */ - aux.x_csect.x_stab = 0; - aux.x_csect.x_snstab = 0; - if (SMTYP_SMTYP (aux.x_csect.x_smtyp) == XTY_LD) - { - unsigned long indx; - - indx = aux.x_csect.x_scnlen.l; - if (indx < obj_raw_syment_count (input_bfd)) - { - long symindx; - - symindx = finfo->sym_indices[indx]; - if (symindx < 0) - aux.x_sym.x_tagndx.l = 0; - else - aux.x_sym.x_tagndx.l = symindx; - } - } - } - else if (isymp->n_sclass != C_STAT || isymp->n_type != T_NULL) - { - unsigned long indx; - - if (ISFCN (isymp->n_type) - || ISTAG (isymp->n_sclass) - || isymp->n_sclass == C_BLOCK) - { - indx = aux.x_sym.x_fcnary.x_fcn.x_endndx.l; - if (indx > 0 - && indx < obj_raw_syment_count (input_bfd)) - { - /* We look forward through the symbol for - the index of the next symbol we are going - to include. I don't know if this is - entirely right. */ - while (finfo->sym_indices[indx] < 0 - && indx < obj_raw_syment_count (input_bfd)) - ++indx; - if (indx >= obj_raw_syment_count (input_bfd)) - indx = output_index; - else - indx = finfo->sym_indices[indx]; - aux.x_sym.x_fcnary.x_fcn.x_endndx.l = indx; - } - } - - indx = aux.x_sym.x_tagndx.l; - if (indx > 0 && indx < obj_raw_syment_count (input_bfd)) - { - long symindx; - - symindx = finfo->sym_indices[indx]; - if (symindx < 0) - aux.x_sym.x_tagndx.l = 0; - else - aux.x_sym.x_tagndx.l = symindx; - } - } - - /* Copy over the line numbers, unless we are stripping - them. We do this on a symbol by symbol basis in - order to more easily handle garbage collection. */ - if ((isymp->n_sclass == C_EXT - || isymp->n_sclass == C_HIDEXT) - && i == 0 - && isymp->n_numaux > 1 - && ISFCN (isymp->n_type) - && aux.x_sym.x_fcnary.x_fcn.x_lnnoptr != 0) - { - if (finfo->info->strip != strip_none - && finfo->info->strip != strip_some) - aux.x_sym.x_fcnary.x_fcn.x_lnnoptr = 0; - else - { - asection *enclosing; - unsigned int enc_count; - bfd_size_type linoff; - struct internal_lineno lin; - - o = *csectpp; - enclosing = xcoff_section_data (abfd, o)->enclosing; - enc_count = xcoff_section_data (abfd, o)->lineno_count; - if (oline != enclosing) - { - if (bfd_seek (input_bfd, - enclosing->line_filepos, - SEEK_SET) != 0 - || (bfd_read (finfo->linenos, linesz, - enc_count, input_bfd) - != linesz * enc_count)) - return false; - oline = enclosing; - } - - linoff = (aux.x_sym.x_fcnary.x_fcn.x_lnnoptr - - enclosing->line_filepos); - - bfd_coff_swap_lineno_in (input_bfd, - (PTR) (finfo->linenos + linoff), - (PTR) &lin); - if (lin.l_lnno != 0 - || ((bfd_size_type) lin.l_addr.l_symndx - != ((esym - - isymesz - - ((bfd_byte *) - obj_coff_external_syms (input_bfd))) - / isymesz))) - aux.x_sym.x_fcnary.x_fcn.x_lnnoptr = 0; - else - { - bfd_byte *linpend, *linp; - bfd_vma offset; - bfd_size_type count; - - lin.l_addr.l_symndx = *indexp; - bfd_coff_swap_lineno_out (output_bfd, (PTR) &lin, - (PTR) (finfo->linenos - + linoff)); - - linpend = (finfo->linenos - + enc_count * linesz); - offset = (o->output_section->vma - + o->output_offset - - o->vma); - for (linp = finfo->linenos + linoff + linesz; - linp < linpend; - linp += linesz) - { - bfd_coff_swap_lineno_in (input_bfd, (PTR) linp, - (PTR) &lin); - if (lin.l_lnno == 0) - break; - lin.l_addr.l_paddr += offset; - bfd_coff_swap_lineno_out (output_bfd, - (PTR) &lin, - (PTR) linp); - } - - count = (linp - (finfo->linenos + linoff)) / linesz; - - aux.x_sym.x_fcnary.x_fcn.x_lnnoptr = - (o->output_section->line_filepos - + o->output_section->lineno_count * linesz); - - if (bfd_seek (output_bfd, - aux.x_sym.x_fcnary.x_fcn.x_lnnoptr, - SEEK_SET) != 0 - || (bfd_write (finfo->linenos + linoff, - linesz, count, output_bfd) - != linesz * count)) - return false; - - o->output_section->lineno_count += count; - - if (incls > 0) - { - struct internal_syment *iisp, *iispend; - long *iindp; - bfd_byte *oos; - - /* Update any C_BINCL or C_EINCL symbols - that refer to a line number in the - range we just output. */ - iisp = finfo->internal_syms; - iispend = (iisp - + obj_raw_syment_count (input_bfd)); - iindp = finfo->sym_indices; - oos = finfo->outsyms; - while (iisp < iispend) - { - if ((iisp->n_sclass == C_BINCL - || iisp->n_sclass == C_EINCL) - && ((bfd_size_type) iisp->n_value - >= enclosing->line_filepos + linoff) - && ((bfd_size_type) iisp->n_value - < (enclosing->line_filepos - + enc_count * linesz))) - { - struct internal_syment iis; - - bfd_coff_swap_sym_in (output_bfd, - (PTR) oos, - (PTR) &iis); - iis.n_value = - (iisp->n_value - - enclosing->line_filepos - - linoff - + aux.x_sym.x_fcnary.x_fcn.x_lnnoptr); - bfd_coff_swap_sym_out (output_bfd, - (PTR) &iis, - (PTR) oos); - --incls; - } - - iisp += iisp->n_numaux + 1; - iindp += iisp->n_numaux + 1; - oos += (iisp->n_numaux + 1) * osymesz; - } - } - } - } - } - - bfd_coff_swap_aux_out (output_bfd, (PTR) &aux, isymp->n_type, - isymp->n_sclass, i, isymp->n_numaux, - (PTR) outsym); - outsym += osymesz; - esym += isymesz; - } - } - - indexp += add; - isymp += add; - csectpp += add; - } - - /* If we swapped out a C_FILE symbol, guess that the next C_FILE - symbol will be the first symbol in the next input file. In the - normal case, this will save us from writing out the C_FILE symbol - again. */ - if (finfo->last_file_index != -1 - && (bfd_size_type) finfo->last_file_index >= syment_base) - { - finfo->last_file.n_value = output_index; - bfd_coff_swap_sym_out (output_bfd, (PTR) &finfo->last_file, - (PTR) (finfo->outsyms - + ((finfo->last_file_index - syment_base) - * osymesz))); - } - - /* Write the modified symbols to the output file. */ - if (outsym > finfo->outsyms) - { - if (bfd_seek (output_bfd, - obj_sym_filepos (output_bfd) + syment_base * osymesz, - SEEK_SET) != 0 - || (bfd_write (finfo->outsyms, outsym - finfo->outsyms, 1, - output_bfd) - != (bfd_size_type) (outsym - finfo->outsyms))) - return false; - - BFD_ASSERT ((obj_raw_syment_count (output_bfd) - + (outsym - finfo->outsyms) / osymesz) - == output_index); - - obj_raw_syment_count (output_bfd) = output_index; - } - - /* Don't let the linker relocation routines discard the symbols. */ - keep_syms = obj_coff_keep_syms (input_bfd); - obj_coff_keep_syms (input_bfd) = true; - - /* Relocate the contents of each section. */ - for (o = input_bfd->sections; o != NULL; o = o->next) - { - bfd_byte *contents; - - if ((o->flags & SEC_HAS_CONTENTS) == 0 - || o->_raw_size == 0 - || (o->flags & SEC_IN_MEMORY) != 0) - continue; - - /* We have set filepos correctly for the sections we created to - represent csects, so bfd_get_section_contents should work. */ - if (coff_section_data (input_bfd, o) != NULL - && coff_section_data (input_bfd, o)->contents != NULL) - contents = coff_section_data (input_bfd, o)->contents; - else - { - if (! bfd_get_section_contents (input_bfd, o, finfo->contents, - (file_ptr) 0, o->_raw_size)) - return false; - contents = finfo->contents; - } - - if ((o->flags & SEC_RELOC) != 0) - { - int target_index; - struct internal_reloc *internal_relocs; - struct internal_reloc *irel; - bfd_vma offset; - struct internal_reloc *irelend; - struct xcoff_link_hash_entry **rel_hash; - long r_symndx; - - /* Read in the relocs. */ - target_index = o->output_section->target_index; - internal_relocs = (xcoff_read_internal_relocs - (input_bfd, o, false, finfo->external_relocs, - true, - (finfo->section_info[target_index].relocs - + o->output_section->reloc_count))); - if (internal_relocs == NULL) - return false; - - /* Call processor specific code to relocate the section - contents. */ - if (! bfd_coff_relocate_section (output_bfd, finfo->info, - input_bfd, o, - contents, - internal_relocs, - finfo->internal_syms, - xcoff_data (input_bfd)->csects)) - return false; - - offset = o->output_section->vma + o->output_offset - o->vma; - irel = internal_relocs; - irelend = irel + o->reloc_count; - rel_hash = (finfo->section_info[target_index].rel_hashes - + o->output_section->reloc_count); - for (; irel < irelend; irel++, rel_hash++) - { - struct xcoff_link_hash_entry *h = NULL; - struct internal_ldrel ldrel; - - *rel_hash = NULL; - - /* Adjust the reloc address and symbol index. */ - - irel->r_vaddr += offset; - - r_symndx = irel->r_symndx; - - if (r_symndx != -1) - { - h = obj_xcoff_sym_hashes (input_bfd)[r_symndx]; - if (h != NULL - && (irel->r_type == R_TOC - || irel->r_type == R_GL - || irel->r_type == R_TCL - || irel->r_type == R_TRL - || irel->r_type == R_TRLA)) - { - /* This is a TOC relative reloc with a symbol - attached. The symbol should be the one which - this reloc is for. We want to make this - reloc against the TOC address of the symbol, - not the symbol itself. */ - BFD_ASSERT (h->toc_section != NULL); - BFD_ASSERT ((h->flags & XCOFF_SET_TOC) == 0); - if (h->u.toc_indx != -1) - irel->r_symndx = h->u.toc_indx; - else - { - struct xcoff_toc_rel_hash *n; - struct xcoff_link_section_info *si; - - n = ((struct xcoff_toc_rel_hash *) - bfd_alloc (finfo->output_bfd, - sizeof (struct xcoff_toc_rel_hash))); - if (n == NULL) - return false; - si = finfo->section_info + target_index; - n->next = si->toc_rel_hashes; - n->h = h; - n->rel = irel; - si->toc_rel_hashes = n; - } - } - else if (h != NULL) - { - /* This is a global symbol. */ - if (h->indx >= 0) - irel->r_symndx = h->indx; - else - { - /* This symbol is being written at the end - of the file, and we do not yet know the - symbol index. We save the pointer to the - hash table entry in the rel_hash list. - We set the indx field to -2 to indicate - that this symbol must not be stripped. */ - *rel_hash = h; - h->indx = -2; - } - } - else - { - long indx; - - indx = finfo->sym_indices[r_symndx]; - - if (indx == -1) - { - struct internal_syment *is; - - /* Relocations against a TC0 TOC anchor are - automatically transformed to be against - the TOC anchor in the output file. */ - is = finfo->internal_syms + r_symndx; - if (is->n_sclass == C_HIDEXT - && is->n_numaux > 0) - { - PTR auxptr; - union internal_auxent aux; - - auxptr = ((PTR) - (((bfd_byte *) - obj_coff_external_syms (input_bfd)) - + ((r_symndx + is->n_numaux) - * isymesz))); - bfd_coff_swap_aux_in (input_bfd, auxptr, - is->n_type, is->n_sclass, - is->n_numaux - 1, - is->n_numaux, - (PTR) &aux); - if (SMTYP_SMTYP (aux.x_csect.x_smtyp) == XTY_SD - && aux.x_csect.x_smclas == XMC_TC0) - indx = finfo->toc_symindx; - } - } - - if (indx != -1) - irel->r_symndx = indx; - else - { - struct internal_syment *is; - const char *name; - char buf[SYMNMLEN + 1]; - - /* This reloc is against a symbol we are - stripping. It would be possible to handle - this case, but I don't think it's worth it. */ - is = finfo->internal_syms + r_symndx; - - name = (_bfd_coff_internal_syment_name - (input_bfd, is, buf)); - if (name == NULL) - return false; - - if (! ((*finfo->info->callbacks->unattached_reloc) - (finfo->info, name, input_bfd, o, - irel->r_vaddr))) - return false; - } - } - } - - switch (irel->r_type) - { - default: - if (h == NULL - || h->root.type == bfd_link_hash_defined - || h->root.type == bfd_link_hash_defweak - || h->root.type == bfd_link_hash_common) - break; - /* Fall through. */ - case R_POS: - case R_NEG: - case R_RL: - case R_RLA: - /* This reloc needs to be copied into the .loader - section. */ - ldrel.l_vaddr = irel->r_vaddr; - if (r_symndx == -1) - ldrel.l_symndx = -1; - else if (h == NULL - || (h->root.type == bfd_link_hash_defined - || h->root.type == bfd_link_hash_defweak - || h->root.type == bfd_link_hash_common)) - { - asection *sec; - - if (h == NULL) - sec = xcoff_data (input_bfd)->csects[r_symndx]; - else if (h->root.type == bfd_link_hash_common) - sec = h->root.u.c.p->section; - else - sec = h->root.u.def.section; - sec = sec->output_section; - - if (strcmp (sec->name, ".text") == 0) - ldrel.l_symndx = 0; - else if (strcmp (sec->name, ".data") == 0) - ldrel.l_symndx = 1; - else if (strcmp (sec->name, ".bss") == 0) - ldrel.l_symndx = 2; - else - { - (*_bfd_error_handler) - ("%s: loader reloc in unrecognized section `%s'", - bfd_get_filename (input_bfd), - sec->name); - bfd_set_error (bfd_error_nonrepresentable_section); - return false; - } - } - else - { - if (h->ldindx < 0) - { - (*_bfd_error_handler) - ("%s: `%s' in loader reloc but not loader sym", - bfd_get_filename (input_bfd), - h->root.root.string); - bfd_set_error (bfd_error_bad_value); - return false; - } - ldrel.l_symndx = h->ldindx; - } - ldrel.l_rtype = (irel->r_size << 8) | irel->r_type; - ldrel.l_rsecnm = o->output_section->target_index; - if (xcoff_hash_table (finfo->info)->textro - && strcmp (o->output_section->name, ".text") == 0) - { - (*_bfd_error_handler) - ("%s: loader reloc in read-only section %s", - bfd_get_filename (input_bfd), - bfd_get_section_name (finfo->output_bfd, - o->output_section)); - bfd_set_error (bfd_error_invalid_operation); - return false; - } - xcoff_swap_ldrel_out (output_bfd, &ldrel, - finfo->ldrel); - BFD_ASSERT (sizeof (struct external_ldrel) == LDRELSZ); - ++finfo->ldrel; - break; - - case R_TOC: - case R_GL: - case R_TCL: - case R_TRL: - case R_TRLA: - /* We should never need a .loader reloc for a TOC - relative reloc. */ - break; - } - } - - o->output_section->reloc_count += o->reloc_count; - } - - /* Write out the modified section contents. */ - if (! bfd_set_section_contents (output_bfd, o->output_section, - contents, o->output_offset, - (o->_cooked_size != 0 - ? o->_cooked_size - : o->_raw_size))) - return false; - } - - obj_coff_keep_syms (input_bfd) = keep_syms; - - if (! finfo->info->keep_memory) - { - if (! _bfd_coff_free_symbols (input_bfd)) - return false; - } - - return true; -} - -#undef N_TMASK -#undef N_BTSHFT - -/* Write out a non-XCOFF global symbol. */ - -static boolean -xcoff_write_global_symbol (h, p) - struct xcoff_link_hash_entry *h; - PTR p; -{ - struct xcoff_final_link_info *finfo = (struct xcoff_final_link_info *) p; - bfd *output_bfd; - bfd_byte *outsym; - struct internal_syment isym; - union internal_auxent aux; - - output_bfd = finfo->output_bfd; - - /* If this symbol was garbage collected, just skip it. */ - if (xcoff_hash_table (finfo->info)->gc - && (h->flags & XCOFF_MARK) == 0) - return true; - - /* If we need a .loader section entry, write it out. */ - if (h->ldsym != NULL) - { - struct internal_ldsym *ldsym; - bfd *impbfd; - - ldsym = h->ldsym; - - if (h->root.type == bfd_link_hash_undefined - || h->root.type == bfd_link_hash_undefweak) - { - ldsym->l_value = 0; - ldsym->l_scnum = N_UNDEF; - ldsym->l_smtype = XTY_ER; - impbfd = h->root.u.undef.abfd; - } - else if (h->root.type == bfd_link_hash_defined - || h->root.type == bfd_link_hash_defweak) - { - asection *sec; - - sec = h->root.u.def.section; - ldsym->l_value = (sec->output_section->vma - + sec->output_offset - + h->root.u.def.value); - ldsym->l_scnum = sec->output_section->target_index; - ldsym->l_smtype = XTY_SD; - impbfd = sec->owner; - } - else - abort (); - - if (((h->flags & XCOFF_DEF_REGULAR) == 0 - && (h->flags & XCOFF_DEF_DYNAMIC) != 0) - || (h->flags & XCOFF_IMPORT) != 0) - ldsym->l_smtype |= L_IMPORT; - if (((h->flags & XCOFF_DEF_REGULAR) != 0 - && (h->flags & XCOFF_DEF_DYNAMIC) != 0) - || (h->flags & XCOFF_EXPORT) != 0) - ldsym->l_smtype |= L_EXPORT; - if ((h->flags & XCOFF_ENTRY) != 0) - ldsym->l_smtype |= L_ENTRY; - - ldsym->l_smclas = h->smclas; - - if (ldsym->l_ifile == (bfd_size_type) -1) - ldsym->l_ifile = 0; - else if (ldsym->l_ifile == 0) - { - if ((ldsym->l_smtype & L_IMPORT) == 0) - ldsym->l_ifile = 0; - else if (impbfd == NULL) - ldsym->l_ifile = 0; - else - { - BFD_ASSERT (impbfd->xvec == output_bfd->xvec); - ldsym->l_ifile = xcoff_data (impbfd)->import_file_id; - } - } - - ldsym->l_parm = 0; - - BFD_ASSERT (h->ldindx >= 0); - BFD_ASSERT (LDSYMSZ == sizeof (struct external_ldsym)); - xcoff_swap_ldsym_out (output_bfd, ldsym, finfo->ldsym + h->ldindx - 3); - h->ldsym = NULL; - } - - /* If this symbol needs global linkage code, write it out. */ - if (h->root.type == bfd_link_hash_defined - && (h->root.u.def.section - == xcoff_hash_table (finfo->info)->linkage_section)) - { - bfd_byte *p; - bfd_vma tocoff; - unsigned int i; - - p = h->root.u.def.section->contents + h->root.u.def.value; - - /* The first instruction in the global linkage code loads a - specific TOC element. */ - tocoff = (h->descriptor->toc_section->output_section->vma - + h->descriptor->toc_section->output_offset - - xcoff_data (output_bfd)->toc); - if ((h->descriptor->flags & XCOFF_SET_TOC) != 0) - tocoff += h->descriptor->u.toc_offset; - bfd_put_32 (output_bfd, XCOFF_GLINK_FIRST | (tocoff & 0xffff), p); - for (i = 0, p += 4; - i < sizeof xcoff_glink_code / sizeof xcoff_glink_code[0]; - i++, p += 4) - bfd_put_32 (output_bfd, xcoff_glink_code[i], p); - } - - /* If we created a TOC entry for this symbol, write out the required - relocs. */ - if ((h->flags & XCOFF_SET_TOC) != 0) - { - asection *tocsec; - asection *osec; - int oindx; - struct internal_reloc *irel; - struct internal_ldrel ldrel; - - tocsec = h->toc_section; - osec = tocsec->output_section; - oindx = osec->target_index; - irel = finfo->section_info[oindx].relocs + osec->reloc_count; - irel->r_vaddr = (osec->vma - + tocsec->output_offset - + h->u.toc_offset); - if (h->indx >= 0) - irel->r_symndx = h->indx; - else - { - h->indx = -2; - irel->r_symndx = obj_raw_syment_count (output_bfd); - } - irel->r_type = R_POS; - irel->r_size = 31; - finfo->section_info[oindx].rel_hashes[osec->reloc_count] = NULL; - ++osec->reloc_count; - - BFD_ASSERT (h->ldindx >= 0); - ldrel.l_vaddr = irel->r_vaddr; - ldrel.l_symndx = h->ldindx; - ldrel.l_rtype = (31 << 8) | R_POS; - ldrel.l_rsecnm = oindx; - xcoff_swap_ldrel_out (output_bfd, &ldrel, finfo->ldrel); - ++finfo->ldrel; - } - - /* If this symbol is a specially defined function descriptor, write - it out. The first word is the address of the function code - itself, the second word is the address of the TOC, and the third - word is zero. */ - if ((h->flags & XCOFF_DESCRIPTOR) != 0 - && h->root.type == bfd_link_hash_defined - && (h->root.u.def.section - == xcoff_hash_table (finfo->info)->descriptor_section)) - { - asection *sec; - asection *osec; - int oindx; - bfd_byte *p; - struct xcoff_link_hash_entry *hentry; - asection *esec; - struct internal_reloc *irel; - struct internal_ldrel ldrel; - asection *tsec; - - sec = h->root.u.def.section; - osec = sec->output_section; - oindx = osec->target_index; - p = sec->contents + h->root.u.def.value; - - hentry = h->descriptor; - BFD_ASSERT (hentry != NULL - && (hentry->root.type == bfd_link_hash_defined - || hentry->root.type == bfd_link_hash_defweak)); - esec = hentry->root.u.def.section; - bfd_put_32 (output_bfd, - (esec->output_section->vma - + esec->output_offset - + hentry->root.u.def.value), - p); - - irel = finfo->section_info[oindx].relocs + osec->reloc_count; - irel->r_vaddr = (osec->vma - + sec->output_offset - + h->root.u.def.value); - irel->r_symndx = esec->output_section->target_index; - irel->r_type = R_POS; - irel->r_size = 31; - finfo->section_info[oindx].rel_hashes[osec->reloc_count] = NULL; - ++osec->reloc_count; - - ldrel.l_vaddr = irel->r_vaddr; - if (strcmp (esec->output_section->name, ".text") == 0) - ldrel.l_symndx = 0; - else if (strcmp (esec->output_section->name, ".data") == 0) - ldrel.l_symndx = 1; - else if (strcmp (esec->output_section->name, ".bss") == 0) - ldrel.l_symndx = 2; - else - { - (*_bfd_error_handler) - ("%s: loader reloc in unrecognized section `%s'", - bfd_get_filename (output_bfd), - esec->output_section->name); - bfd_set_error (bfd_error_nonrepresentable_section); - return false; - } - ldrel.l_rtype = (31 << 8) | R_POS; - ldrel.l_rsecnm = oindx; - xcoff_swap_ldrel_out (output_bfd, &ldrel, finfo->ldrel); - ++finfo->ldrel; - - bfd_put_32 (output_bfd, xcoff_data (output_bfd)->toc, p + 4); - - tsec = coff_section_from_bfd_index (output_bfd, - xcoff_data (output_bfd)->sntoc); - - ++irel; - irel->r_vaddr = (osec->vma - + sec->output_offset - + h->root.u.def.value - + 4); - irel->r_symndx = tsec->output_section->target_index; - irel->r_type = R_POS; - irel->r_size = 31; - finfo->section_info[oindx].rel_hashes[osec->reloc_count] = NULL; - ++osec->reloc_count; - - ldrel.l_vaddr = irel->r_vaddr; - if (strcmp (tsec->output_section->name, ".text") == 0) - ldrel.l_symndx = 0; - else if (strcmp (tsec->output_section->name, ".data") == 0) - ldrel.l_symndx = 1; - else if (strcmp (tsec->output_section->name, ".bss") == 0) - ldrel.l_symndx = 2; - else - { - (*_bfd_error_handler) - ("%s: loader reloc in unrecognized section `%s'", - bfd_get_filename (output_bfd), - tsec->output_section->name); - bfd_set_error (bfd_error_nonrepresentable_section); - return false; - } - ldrel.l_rtype = (31 << 8) | R_POS; - ldrel.l_rsecnm = oindx; - xcoff_swap_ldrel_out (output_bfd, &ldrel, finfo->ldrel); - ++finfo->ldrel; - } - - if (h->indx >= 0) - return true; - - if (h->indx != -2 - && (finfo->info->strip == strip_all - || (finfo->info->strip == strip_some - && (bfd_hash_lookup (finfo->info->keep_hash, - h->root.root.string, false, false) - == NULL)))) - return true; - - if (h->indx != -2 - && (h->flags & (XCOFF_REF_REGULAR | XCOFF_DEF_REGULAR)) == 0) - return true; - - outsym = finfo->outsyms; - - memset (&aux, 0, sizeof aux); - - h->indx = obj_raw_syment_count (output_bfd); - - if (strlen (h->root.root.string) <= SYMNMLEN) - strncpy (isym._n._n_name, h->root.root.string, SYMNMLEN); - else - { - boolean hash; - bfd_size_type indx; - - hash = true; - if ((output_bfd->flags & BFD_TRADITIONAL_FORMAT) != 0) - hash = false; - indx = _bfd_stringtab_add (finfo->strtab, h->root.root.string, hash, - false); - if (indx == (bfd_size_type) -1) - return false; - isym._n._n_n._n_zeroes = 0; - isym._n._n_n._n_offset = STRING_SIZE_SIZE + indx; - } - - if (h->root.type == bfd_link_hash_undefined - || h->root.type == bfd_link_hash_undefweak) - { - isym.n_value = 0; - isym.n_scnum = N_UNDEF; - isym.n_sclass = C_EXT; - aux.x_csect.x_smtyp = XTY_ER; - } - else if (h->root.type == bfd_link_hash_defined - || h->root.type == bfd_link_hash_defweak) - { - struct xcoff_link_size_list *l; - - isym.n_value = (h->root.u.def.section->output_section->vma - + h->root.u.def.section->output_offset - + h->root.u.def.value); - isym.n_scnum = h->root.u.def.section->output_section->target_index; - isym.n_sclass = C_HIDEXT; - aux.x_csect.x_smtyp = XTY_SD; - - if ((h->flags & XCOFF_HAS_SIZE) != 0) - { - for (l = xcoff_hash_table (finfo->info)->size_list; - l != NULL; - l = l->next) - { - if (l->h == h) - { - aux.x_csect.x_scnlen.l = l->size; - break; - } - } - } - } - else if (h->root.type == bfd_link_hash_common) - { - isym.n_value = (h->root.u.c.p->section->output_section->vma - + h->root.u.c.p->section->output_offset); - isym.n_scnum = h->root.u.c.p->section->output_section->target_index; - isym.n_sclass = C_EXT; - aux.x_csect.x_smtyp = XTY_CM; - aux.x_csect.x_scnlen.l = h->root.u.c.size; - } - else - abort (); - - isym.n_type = T_NULL; - isym.n_numaux = 1; - - bfd_coff_swap_sym_out (output_bfd, (PTR) &isym, (PTR) outsym); - outsym += bfd_coff_symesz (output_bfd); - - aux.x_csect.x_smclas = h->smclas; - - bfd_coff_swap_aux_out (output_bfd, (PTR) &aux, T_NULL, isym.n_sclass, 0, 1, - (PTR) outsym); - outsym += bfd_coff_auxesz (output_bfd); - - if (h->root.type == bfd_link_hash_defined - || h->root.type == bfd_link_hash_defweak) - { - /* We just output an SD symbol. Now output an LD symbol. */ - - h->indx += 2; - - isym.n_sclass = C_EXT; - bfd_coff_swap_sym_out (output_bfd, (PTR) &isym, (PTR) outsym); - outsym += bfd_coff_symesz (output_bfd); - - aux.x_csect.x_smtyp = XTY_LD; - aux.x_csect.x_scnlen.l = obj_raw_syment_count (output_bfd); - - bfd_coff_swap_aux_out (output_bfd, (PTR) &aux, T_NULL, C_EXT, 0, 1, - (PTR) outsym); - outsym += bfd_coff_auxesz (output_bfd); - } - - if (bfd_seek (output_bfd, - (obj_sym_filepos (output_bfd) - + (obj_raw_syment_count (output_bfd) - * bfd_coff_symesz (output_bfd))), - SEEK_SET) != 0 - || (bfd_write (finfo->outsyms, outsym - finfo->outsyms, 1, output_bfd) - != (bfd_size_type) (outsym - finfo->outsyms))) - return false; - obj_raw_syment_count (output_bfd) += - (outsym - finfo->outsyms) / bfd_coff_symesz (output_bfd); - - return true; -} - -/* Handle a link order which is supposed to generate a reloc. */ - -static boolean -xcoff_reloc_link_order (output_bfd, finfo, output_section, link_order) - bfd *output_bfd; - struct xcoff_final_link_info *finfo; - asection *output_section; - struct bfd_link_order *link_order; -{ - reloc_howto_type *howto; - struct xcoff_link_hash_entry *h; - asection *hsec; - bfd_vma hval; - bfd_vma addend; - struct internal_reloc *irel; - struct xcoff_link_hash_entry **rel_hash_ptr; - struct internal_ldrel ldrel; - - if (link_order->type == bfd_section_reloc_link_order) - { - /* We need to somehow locate a symbol in the right section. The - symbol must either have a value of zero, or we must adjust - the addend by the value of the symbol. FIXME: Write this - when we need it. The old linker couldn't handle this anyhow. */ - abort (); - } - - howto = bfd_reloc_type_lookup (output_bfd, link_order->u.reloc.p->reloc); - if (howto == NULL) - { - bfd_set_error (bfd_error_bad_value); - return false; - } - - h = ((struct xcoff_link_hash_entry *) - bfd_wrapped_link_hash_lookup (output_bfd, finfo->info, - link_order->u.reloc.p->u.name, - false, false, true)); - if (h == NULL) - { - if (! ((*finfo->info->callbacks->unattached_reloc) - (finfo->info, link_order->u.reloc.p->u.name, (bfd *) NULL, - (asection *) NULL, (bfd_vma) 0))) - return false; - return true; - } - - if (h->root.type == bfd_link_hash_common) - { - hsec = h->root.u.c.p->section; - hval = 0; - } - else if (h->root.type == bfd_link_hash_defined - || h->root.type == bfd_link_hash_defweak) - { - hsec = h->root.u.def.section; - hval = h->root.u.def.value; - } - else - { - hsec = NULL; - hval = 0; - } - - addend = link_order->u.reloc.p->addend; - if (hsec != NULL) - addend += (hsec->output_section->vma - + hsec->output_offset - + hval); - - if (addend != 0) - { - bfd_size_type size; - bfd_byte *buf; - bfd_reloc_status_type rstat; - boolean ok; - - size = bfd_get_reloc_size (howto); - buf = (bfd_byte *) bfd_zmalloc (size); - if (buf == NULL) - return false; - - rstat = _bfd_relocate_contents (howto, output_bfd, addend, buf); - switch (rstat) - { - case bfd_reloc_ok: - break; - default: - case bfd_reloc_outofrange: - abort (); - case bfd_reloc_overflow: - if (! ((*finfo->info->callbacks->reloc_overflow) - (finfo->info, link_order->u.reloc.p->u.name, - howto->name, addend, (bfd *) NULL, (asection *) NULL, - (bfd_vma) 0))) - { - free (buf); - return false; - } - break; - } - ok = bfd_set_section_contents (output_bfd, output_section, (PTR) buf, - (file_ptr) link_order->offset, size); - free (buf); - if (! ok) - return false; - } - - /* Store the reloc information in the right place. It will get - swapped and written out at the end of the final_link routine. */ - - irel = (finfo->section_info[output_section->target_index].relocs - + output_section->reloc_count); - rel_hash_ptr = (finfo->section_info[output_section->target_index].rel_hashes - + output_section->reloc_count); - - memset (irel, 0, sizeof (struct internal_reloc)); - *rel_hash_ptr = NULL; - - irel->r_vaddr = output_section->vma + link_order->offset; - - if (h->indx >= 0) - irel->r_symndx = h->indx; - else - { - /* Set the index to -2 to force this symbol to get written out. */ - h->indx = -2; - *rel_hash_ptr = h; - irel->r_symndx = 0; - } - - irel->r_type = howto->type; - irel->r_size = howto->bitsize - 1; - if (howto->complain_on_overflow == complain_overflow_signed) - irel->r_size |= 0x80; - - ++output_section->reloc_count; - - /* Now output the reloc to the .loader section. */ - - ldrel.l_vaddr = irel->r_vaddr; - - if (hsec != NULL) - { - const char *secname; - - secname = hsec->output_section->name; - - if (strcmp (secname, ".text") == 0) - ldrel.l_symndx = 0; - else if (strcmp (secname, ".data") == 0) - ldrel.l_symndx = 1; - else if (strcmp (secname, ".bss") == 0) - ldrel.l_symndx = 2; - else - { - (*_bfd_error_handler) - ("%s: loader reloc in unrecognized section `%s'", - bfd_get_filename (output_bfd), secname); - bfd_set_error (bfd_error_nonrepresentable_section); - return false; - } - } - else - { - if (h->ldindx < 0) - { - (*_bfd_error_handler) - ("%s: `%s' in loader reloc but not loader sym", - bfd_get_filename (output_bfd), - h->root.root.string); - bfd_set_error (bfd_error_bad_value); - return false; - } - ldrel.l_symndx = h->ldindx; - } - - ldrel.l_rtype = (irel->r_size << 8) | irel->r_type; - ldrel.l_rsecnm = output_section->target_index; - xcoff_swap_ldrel_out (output_bfd, &ldrel, finfo->ldrel); - ++finfo->ldrel; - - return true; -} - -/* Sort relocs by VMA. This is called via qsort. */ - -static int -xcoff_sort_relocs (p1, p2) - const PTR p1; - const PTR p2; -{ - const struct internal_reloc *r1 = (const struct internal_reloc *) p1; - const struct internal_reloc *r2 = (const struct internal_reloc *) p2; - - if (r1->r_vaddr > r2->r_vaddr) - return 1; - else if (r1->r_vaddr < r2->r_vaddr) - return -1; - else - return 0; -} - -/* This is the relocation function for the RS/6000/POWER/PowerPC. - This is currently the only processor which uses XCOFF; I hope that - will never change. */ - -boolean -_bfd_ppc_xcoff_relocate_section (output_bfd, info, input_bfd, - input_section, contents, relocs, syms, - sections) - bfd *output_bfd; - struct bfd_link_info *info; - bfd *input_bfd; - asection *input_section; - bfd_byte *contents; - struct internal_reloc *relocs; - struct internal_syment *syms; - asection **sections; -{ - struct internal_reloc *rel; - struct internal_reloc *relend; - - rel = relocs; - relend = rel + input_section->reloc_count; - for (; rel < relend; rel++) - { - long symndx; - struct xcoff_link_hash_entry *h; - struct internal_syment *sym; - bfd_vma addend; - bfd_vma val; - struct reloc_howto_struct howto; - bfd_reloc_status_type rstat; - - /* Relocation type R_REF is a special relocation type which is - merely used to prevent garbage collection from occurring for - the csect including the symbol which it references. */ - if (rel->r_type == R_REF) - continue; - - symndx = rel->r_symndx; - - if (symndx == -1) - { - h = NULL; - sym = NULL; - addend = 0; - } - else - { - h = obj_xcoff_sym_hashes (input_bfd)[symndx]; - sym = syms + symndx; - addend = - sym->n_value; - } - - /* We build the howto information on the fly. */ - - howto.type = rel->r_type; - howto.rightshift = 0; - howto.size = 2; - howto.bitsize = (rel->r_size & 0x1f) + 1; - howto.pc_relative = false; - howto.bitpos = 0; - if ((rel->r_size & 0x80) != 0) - howto.complain_on_overflow = complain_overflow_signed; - else - howto.complain_on_overflow = complain_overflow_bitfield; - howto.special_function = NULL; - howto.name = "internal"; - howto.partial_inplace = true; - if (howto.bitsize == 32) - howto.src_mask = howto.dst_mask = 0xffffffff; - else - { - howto.src_mask = howto.dst_mask = (1 << howto.bitsize) - 1; - if (howto.bitsize == 16) - howto.size = 1; - } - howto.pcrel_offset = false; - - val = 0; - - if (h == NULL) - { - asection *sec; - - if (symndx == -1) - { - sec = bfd_abs_section_ptr; - val = 0; - } - else - { - sec = sections[symndx]; - /* Hack to make sure we use the right TOC anchor value - if this reloc is against the TOC anchor. */ - if (sec->name[3] == '0' - && strcmp (sec->name, ".tc0") == 0) - val = xcoff_data (output_bfd)->toc; - else - val = (sec->output_section->vma - + sec->output_offset - + sym->n_value - - sec->vma); - } - } - else - { - if (h->root.type == bfd_link_hash_defined - || h->root.type == bfd_link_hash_defweak) - { - asection *sec; - - sec = h->root.u.def.section; - val = (h->root.u.def.value - + sec->output_section->vma - + sec->output_offset); - } - else if (h->root.type == bfd_link_hash_common) - { - asection *sec; - - sec = h->root.u.c.p->section; - val = (sec->output_section->vma - + sec->output_offset); - } - else if ((h->flags & XCOFF_DEF_DYNAMIC) != 0 - || (h->flags & XCOFF_IMPORT) != 0) - { - /* Every symbol in a shared object is defined somewhere. */ - val = 0; - } - else if (! info->relocateable - && ! info->shared) - { - if (! ((*info->callbacks->undefined_symbol) - (info, h->root.root.string, input_bfd, input_section, - rel->r_vaddr - input_section->vma))) - return false; - } - } - - /* I took the relocation type definitions from two documents: - the PowerPC AIX Version 4 Application Binary Interface, First - Edition (April 1992), and the PowerOpen ABI, Big-Endian - 32-Bit Hardware Implementation (June 30, 1994). Differences - between the documents are noted below. */ - - switch (rel->r_type) - { - case R_RTB: - case R_RRTBI: - case R_RRTBA: - /* These relocs are defined by the PowerPC ABI to be - relative branches which use half of the difference - between the symbol and the program counter. I can't - quite figure out when this is useful. These relocs are - not defined by the PowerOpen ABI. */ - default: - (*_bfd_error_handler) - ("%s: unsupported relocation type 0x%02x", - bfd_get_filename (input_bfd), (unsigned int) rel->r_type); - bfd_set_error (bfd_error_bad_value); - return false; - case R_POS: - /* Simple positive relocation. */ - break; - case R_NEG: - /* Simple negative relocation. */ - val = - val; - break; - case R_REL: - /* Simple PC relative relocation. */ - howto.pc_relative = true; - break; - case R_TOC: - /* TOC relative relocation. The value in the instruction in - the input file is the offset from the input file TOC to - the desired location. We want the offset from the final - TOC to the desired location. We have: - isym = iTOC + in - iinsn = in + o - osym = oTOC + on - oinsn = on + o - so we must change insn by on - in. - */ - case R_GL: - /* Global linkage relocation. The value of this relocation - is the address of the entry in the TOC section. */ - case R_TCL: - /* Local object TOC address. I can't figure out the - difference between this and case R_GL. */ - case R_TRL: - /* TOC relative relocation. A TOC relative load instruction - which may be changed to a load address instruction. - FIXME: We don't currently implement this optimization. */ - case R_TRLA: - /* TOC relative relocation. This is a TOC relative load - address instruction which may be changed to a load - instruction. FIXME: I don't know if this is the correct - implementation. */ - if (h != NULL && h->toc_section == NULL) - { - (*_bfd_error_handler) - ("%s: TOC reloc at 0x%x to symbol `%s' with no TOC entry", - bfd_get_filename (input_bfd), rel->r_vaddr, - h->root.root.string); - bfd_set_error (bfd_error_bad_value); - return false; - } - if (h != NULL) - { - BFD_ASSERT ((h->flags & XCOFF_SET_TOC) == 0); - val = (h->toc_section->output_section->vma - + h->toc_section->output_offset); - } - val = ((val - xcoff_data (output_bfd)->toc) - - (sym->n_value - xcoff_data (input_bfd)->toc)); - addend = 0; - break; - case R_BA: - /* Absolute branch. We don't want to mess with the lower - two bits of the instruction. */ - case R_CAI: - /* The PowerPC ABI defines this as an absolute call which - may be modified to become a relative call. The PowerOpen - ABI does not define this relocation type. */ - case R_RBA: - /* Absolute branch which may be modified to become a - relative branch. */ - case R_RBAC: - /* The PowerPC ABI defines this as an absolute branch to a - fixed address which may be modified to an absolute branch - to a symbol. The PowerOpen ABI does not define this - relocation type. */ - case R_RBRC: - /* The PowerPC ABI defines this as an absolute branch to a - fixed address which may be modified to a relative branch. - The PowerOpen ABI does not define this relocation type. */ - howto.src_mask &= ~3; - howto.dst_mask = howto.src_mask; - break; - case R_BR: - /* Relative branch. We don't want to mess with the lower - two bits of the instruction. */ - case R_CREL: - /* The PowerPC ABI defines this as a relative call which may - be modified to become an absolute call. The PowerOpen - ABI does not define this relocation type. */ - case R_RBR: - /* A relative branch which may be modified to become an - absolute branch. FIXME: We don't implement this, - although we should for symbols of storage mapping class - XMC_XO. */ - howto.pc_relative = true; - howto.src_mask &= ~3; - howto.dst_mask = howto.src_mask; - break; - case R_RL: - /* The PowerPC AIX ABI describes this as a load which may be - changed to a load address. The PowerOpen ABI says this - is the same as case R_POS. */ - break; - case R_RLA: - /* The PowerPC AIX ABI describes this as a load address - which may be changed to a load. The PowerOpen ABI says - this is the same as R_POS. */ - break; - } - - /* If we see an R_BR or R_RBR reloc which is jumping to global - linkage code, and it is followed by an appropriate cror nop - instruction, we replace the cror with lwz r2,20(r1). This - restores the TOC after the glink code. Contrariwise, if the - call is followed by a lwz r2,20(r1), but the call is not - going to global linkage code, we can replace the load with a - cror. */ - if ((rel->r_type == R_BR || rel->r_type == R_RBR) - && h != NULL - && h->root.type == bfd_link_hash_defined - && (rel->r_vaddr - input_section->vma + 8 - <= input_section->_cooked_size)) - { - bfd_byte *pnext; - unsigned long next; - - pnext = contents + (rel->r_vaddr - input_section->vma) + 4; - next = bfd_get_32 (input_bfd, pnext); - if (h->smclas == XMC_GL) - { - if (next == 0x4def7b82 /* cror 15,15,15 */ - || next == 0x4ffffb82) /* cror 31,31,31 */ - bfd_put_32 (input_bfd, 0x80410014, pnext); /* lwz r1,20(r1) */ - } - else - { - if (next == 0x80410014) /* lwz r1,20(r1) */ - bfd_put_32 (input_bfd, 0x4ffffb82, pnext); /* cror 31,31,31 */ - } - } - - /* A PC relative reloc includes the section address. */ - if (howto.pc_relative) - addend += input_section->vma; - - rstat = _bfd_final_link_relocate (&howto, input_bfd, input_section, - contents, - rel->r_vaddr - input_section->vma, - val, addend); - - switch (rstat) - { - default: - abort (); - case bfd_reloc_ok: - break; - case bfd_reloc_overflow: - { - const char *name; - char buf[SYMNMLEN + 1]; - char howto_name[10]; - - if (symndx == -1) - name = "*ABS*"; - else if (h != NULL) - name = h->root.root.string; - else - { - name = _bfd_coff_internal_syment_name (input_bfd, sym, buf); - if (name == NULL) - return false; - } - sprintf (howto_name, "0x%02x", rel->r_type); - - if (! ((*info->callbacks->reloc_overflow) - (info, name, howto_name, (bfd_vma) 0, input_bfd, - input_section, rel->r_vaddr - input_section->vma))) - return false; - } - } - } - - return true; -} diff --git a/contrib/gdb/gdb/.gdbinit b/contrib/gdb/gdb/.gdbinit deleted file mode 100644 index f60802e500936..0000000000000 --- a/contrib/gdb/gdb/.gdbinit +++ /dev/null @@ -1,16 +0,0 @@ -echo Setting up the environment for debugging gdb.\n - -set complaints 1 - -b fatal - -b info_command -commands - silent - return -end - -dir ../mmalloc -dir ../libiberty -dir ../bfd -set prompt (top-gdb) diff --git a/contrib/gdb/gdb/ChangeLog-93 b/contrib/gdb/gdb/ChangeLog-93 deleted file mode 100644 index 463154d9ce833..0000000000000 --- a/contrib/gdb/gdb/ChangeLog-93 +++ /dev/null @@ -1,7597 +0,0 @@ -Fri Dec 31 14:33:49 1993 Jim Kingdon (kingdon@lioth.cygnus.com) - - * nindy-share/nindy.c: Fix order of arguments to store_unsigned_integer - (second and third arguments were reversed). - (say): Use varargs. - -Fri Dec 31 12:13:47 1993 Jim Kingdon (kingdon@deneb.cygnus.com) - - * remote-mips.c: Add timeout parameter to mips_request and - mips_receive_packet. - (callers): pass in mips_receive_wait except mips_initialize (where - we use it to clean up the kludge where we had been changing - mips_receive_wait temporarily) and mips_wait (where we pass in - -1 for no timeout). - -Fri Dec 31 14:33:49 1993 Jim Kingdon (kingdon@lioth.cygnus.com) - - * stack.c (print_block_frame_locals): Also print LOC_BASEREG variables. - -Fri Dec 31 06:55:38 1993 Peter Schauer (pes@regent.e-technik.tu-muenchen.de) - - * symtab.c (find_methods): Call fprintf_symbol_filtered with DMGL_ANSI. - -Thu Dec 30 10:16:54 1993 Jim Kingdon (kingdon@lioth.cygnus.com) - - * values.c (unpack_long): Fix garbled error message. - - * remote-mips.c (mips_error): New function. - * remote-mips.c: Use it instead of error() most places. - * remote-mips.c (mips_receive_packet): New arg throw_error. - (mips_initialize): Use it not catch_errors. - * defs.h: Declare error_pre_print and warning_pre_print here... - * main.c: ...not here. - - * breakpoint.c (breakpoint_chain): Make static. - * breakpoint.c, breakpoint.h (frame_in_dummy): New function. - * stack.c (print_frame_info): Use it. - -Thu Dec 30 07:41:36 1993 Peter Schauer (pes@regent.e-technik.tu-muenchen.de) - - * exec.c (add_to_section_table): Check for SEC_ALLOC instead of - SEC_LOAD to handle .bss segments properly. - -Thu Dec 30 10:16:54 1993 Jim Kingdon (kingdon@lioth.cygnus.com) - - * infrun.c (wait_for_inferior): Enable code which assumes that if - we jump into the prologue from another function, then it was a - subroutine call. #if 0 AT_FUNCTION_START; the above code should - take care of this case. - -Wed Dec 29 12:32:08 1993 Jim Kingdon (kingdon@lioth.cygnus.com) - - * valprint.c (val_print_string): Change chunksize from 200 - to 8. - - * symfile.c (generic_load): If no arguments, get file name - from get_exec_file. - - * c-exp.y: Revert Kung's change. "..." is not a type, and the - change caused "p (...)0" to dump core. - * gdbtypes.c (check_stub_method): Don't pass "..." to - parse_and_eval_type. This should fix the bug which Kung was - trying to fix. - - * stabsread.c (define_symbol): If we choose not to combine - two symbols, don't just ignore the second (LOC_REGISTER) one. - * printcmd.c (print_frame_args): If we have a LOC_ARG and a - LOC_REGISTER, use the LOC_ARG not the LOC_REGISTER. - -Tue Dec 28 15:08:00 1993 Fred Fish (fnf@deneb.cygnus.com) - - * solib.c (DEBUG_BASE): Remove macro and all references. - * solib.c (debug_base_symbols): Add array of symbols to lookup. - * solib.c (IGNORE_FIRST_LINK_MAP_ENTRY): Add macro. - * solib.c (look_for_base, locate_base): Use debug_base_symbols. - * solib.c (find_solib): Use IGNORE_FIRST_LINK_MAP_ENTRY. - -Tue Dec 28 12:06:57 1993 Kung Hsu (kung@cirdan.cygnus.com) - - * c-exp.y : fix grammar to parse ellipsis (...) - -Mon Dec 27 18:42:14 1993 Kung Hsu (kung@cirdan.cygnus.com) - - * stabsread.c (read_type): fix problem when reading static member - of a class. caused by change to allow :: inside template - instantiated name. - -Mon Dec 27 11:07:05 1993 Jim Kingdon (kingdon@lioth.cygnus.com) - - * gdbtypes.h: Expand on comments for TYPE_CODE_BITSTRING and - TYPE_CODE_STRING a bit. - - * m68k-tdep.c (m68k_skip_prologue, m68k_find_saved_regs): - Allow pea %fp; move.l %sp, %fp instead of link instruction to - set up the new frame. - - * main.c (init_main): Change "set remotedebug" back to var_zinteger - from var_boolean. - - * c-exp.y (yylex): Don't try to deal with nested types. - - * cp-valprint.c (cplus_print_value): Call check_stub_type on - TYPE_BASECLASS (type, i) before we look at its name. - - * dbxread.c: Move default definition of GCC_COMPILED_FLAG_SYMBOL - from here . . . - * symtab.h: . . . to here. - * dbxread.c (record_minimal_symbol): Move check for gcc{,2}_compiled. - and __gnu_compiled* from here . . . - * minsyms.c (prim_record_minimal_symbol_and_info): . . . to here. - * minsyms.c (prim_record_minimal_symbol): Call - prim_record_minimal_symbol_and_info rather than duplicating code. - * minsyms.c, symtab.h (prim_record_minimal_symbol{,_and_info}), - coffread.c (record_minimal_symbol), - xcoffread.c (RECORD_MINIMAL_SYMBOL), callers: Add objfile parameter. - -Sun Dec 26 20:44:02 1993 Jeffrey A. Law (law@snake.cs.utah.edu) - - * dbxread.c (process_one_symbol): Handle stabs-in-som just like - stabs-in-elf. - (pastab_build_psymtabs): Likewise. - - * hppa-tdep.c: Change all comments to reference %r3 or frame - pointer rather than %r4. - (frame_chain, skip_prologue, dig_rp_from_stack): Handle %r3 as the - frame pointer. - - * config/pa/tm-hppa.h (FP_REGNUM): Define as %r3. - (FIND_FRAME_SAVED_REGS): Handle %r3 as frame pointer. - (CALL_DUMMY): Likewise. - -Sun Dec 26 16:59:39 1993 Jim Kingdon (kingdon@lioth.cygnus.com) - - * exec.c (exec_file_command): If error occurs after we have opened - exec_bfd but before we call push_target, make sure to close exec_bfd. - - * infrun.c (wait_for_inferior): Remove confusing and inaccurate - stuff about subroutine calls, return, etc., from comment which - says "We've wandered out of the step range.". - -Sun Dec 26 09:18:10 1993 Peter Schauer (pes@regent.e-technik.tu-muenchen.de) - - * infrun.c (wait_for_inferior): When checking whether the line has - changed, check the symtab as well. - -Sun Dec 26 09:18:10 1993 Jim Kingdon (kingdon@lioth.cygnus.com) - - * gdbtypes.c (force_to_range_type): Use switch statement. - complain() not warning() if the TYPE_CODE isn't one we know how to - deal with gracefully. Use builtin_type_int not - lookup_fundamental_type (the objfile we passed to - lookup_fundamental_type was sometimes NULL). - - * valops.c (call_function_by_hand, push_word), defs.h (push_word), - convex-xdep.c, m88k-nat.c, i386m3-nat.c, mips-tdep.c, mipsm3-nat.c, - ns32km3-nat.c, remote-bug.c, m88k-tdep.c, remote-hms.c, remote-mips.c, - config/gould/tm-np1.h, hppa-tdep.c (hppa_fix_call_dummy), remote-vx.c: - Use REGISTER_SIZE, unsigned LONGEST, and - {store,extract}_unsigned_integer, instead of sizeof - (REGISTER_TYPE) and REGISTER_TYPE. - * All tm.h files: Change REGISTER_TYPE to REGISTER_SIZE. - * hppa-tdep.c (pa_print_fp_reg): Remove unused variable val. - - * Makefile.in (ALLDEPFILES): Remove i386ly-nat.c and m68kly-nat.c. - Add lynx-nat.c. - -Sat Dec 25 20:05:41 1993 Jeffrey A. Law (law@snake.cs.utah.edu) - - * hppa-tdep.c (init_extra_frame_info): Correctly adjust the base - of the current frame when "fromleaf" is true. Do not adjust the - frame base of the innermost frame if it is a leaf function. - -Sat Dec 25 13:39:21 1993 Jim Kingdon (kingdon@lioth.cygnus.com) - - * stabsread.c (define_symbol): Only combine a p/r pair into a - LOC_REGPARM if REG_STRUCT_HAS_ADDR. - -Sat Dec 25 09:50:29 1993 Peter Schauer (pes@regent.e-technik.tu-muenchen.de) - - * valops.c (value_struct_elt): Check for (value)-1 return from - search_struct_method. - -Sat Dec 25 09:50:29 1993 Jim Kingdon (kingdon@lioth.cygnus.com) - - * defs.h: Move definitions of TARGET_*_BIT after include of tm.h. - The old way (using #undef in tm.h) was ugly and asking for - trouble, because it makes it possible for some file to use the - wrong definition. Move definition of HOST_CHAR_BIT after definition - of TARGET_CHAR_BIT. - * config/alpha/tm-alpha.h, config/h8300/tm-h8300.h, - config/h8500/tm-h8500.h, config/z8k/tm-z8k.h: Don't undef TARGET_*_BIT - before defining them. - - * mdebugread.c: Change the builtin_type_* in this file to - mdebug_type_* and make them static. Use TYPE_CODE_ERROR for - complex and float decimal. - - * printcmd.c (disassemble_command): Call wrap_here between printing - address and printing instruction. - -Fri Dec 24 14:23:57 1993 Jim Kingdon (kingdon@lioth.cygnus.com) - - * stabsread.c (read_type): Don't fall through 'S' case (the case it - was falling though happened to do the right thing ("break;") but that - is hardly a good thing to assume). - -Tue Dec 21 13:32:02 1993 Per Bothner (bothner@kalessin.cygnus.com) - - * ch-exp.y (match_dollar_tokens): Fix off-by-one bug. - * ch-lang.c (chill_is_varying_struct), ch-lang.h: New function. - * ch-lang.c (chill_printstr): Use double quotes, not single quotes. - * ch-typeprint.c (chill_type_print_base): Handle TYPE_CODE_BITSTRING. - Improve printing of TYPE_CODE_STRING, TYPE_CODE_SET, and - TYPE_CODE_STRUCT (including checking chill_is_varying_struct). - Print TYPE_DUMMY_RANGE by printing its TYPE_TARGET_TYPE. - Handle TYPE_CODE_ENUM. - * ch-valprint.c (chill_val_print): Handle TYPE_CODE_BITSTRING. - For TYPE_CODE_STRING, never print address. Handle VARYING strings. - * gdbtypes.c (force_to_range_type): New. - * gdbtypes.c (create_set_type): Make work, following Chill layout. - * gdbtypes.h (TYPE_LOW_BOUND, TYPE_HIGH_BOUND, TYPE_DUMMY_RANGE): New. - * stabsread.c (read_type): Distinguish string and bitstring from - char-array and set. - * valarith.c (value_subscript), valops.c (value_coerce_array): - Handle STRINGs as well as ARRAYs. - * valarith.c (value_bit_index): Fix think. Use new macros. - - -Fri Dec 17 10:45:32 1993 Kung Hsu (kung@cirdan.cygnus.com) - - * symtab (decode_line_1): fix a bug when position char is not - set correctly. - * c-valprint (c_val_print): handle vtbl printing when vtbl is not - set up yet. - -Thu Dec 16 16:46:01 1993 Ian Lance Taylor (ian@tweedledumb.cygnus.com) - - * mips-tdep.c (read_next_frame_reg): If SIGFRAME_REG_SIZE is not - defined, define it as 4. - -Thu Dec 16 13:08:01 1993 Jeffrey A. Law (law@snake.cs.utah.edu) - - * config/m68k/nm-hp300bsd.h: Correctly identify 4.3BSD vs 4.4BSD. - - * config/m68k/tm-hp300bsd.h (REMOTE_BPT_VECTOR): Define. - - * config/m68k/tm-m68k.h (REMOTE_BPT_VECTOR): Allow targets to - override. - (REMOTE_BREAKPOINT): Likewise. - -Thu Dec 16 09:14:58 1993 Jeff Law (law@snake.cs.utah.edu) - - * hpread.c (read_hp_function_type): Correctly handle - pass-by-value structures > 64bits in size. - (process_one_debug_symbol): Likewise. - -Mon Dec 13 20:17:39 1993 Per Bothner (bothner@kalessin.cygnus.com) - - Implement support for Chill POWERSETs. - * ch-exp.y (operand_2): Implement 'Element IN PowerSet'. - * ch-typeprint.c (chill_type_print_base): Handle POWERSETs. - * ch-valprint.c (chill_val_print): Handle TYPE_CODE_SET. - * eval.c (evaluate_subexp): Implement BINOP_IN. - * expression.h (enum exp_opcode): Added BINOP_IN. - * gdbtypes.c (create_set_type), gdbtypes.h: New function. - * stabsread.c (read_type): If 'S', create a set type. - * valarith.c (value_bit_index, value_in), value.h: New functions, - for indexing in SETs. - -Mon Dec 13 06:42:37 1993 Jeffrey A. Law (law@snake.cs.utah.edu) - - * paread.c (pa_symfile_init): Check for the existance of stabs - after DBX_TEXT_SECT has been initialized. - -Tue Nov 23 17:29:28 1993 Steve Chamberlain (sac@jonny.cygnus.com) - - * config/h8300/tm-h8300.h (BREAKPOINT): Insn changed to sleep. - (DECP_PC_AFTER_BREAK): Now is 0. - * config/h8500/tm-h8500.h (REGISTER_BYTES, REGISTER_BYTE, - REGISTER_NAMES): update to new view. (INIT_EXTRA_FRAME_INFO): No - extra frame info now. - * config/sh/sh.h (NOP): Define NOP insn. - * config/z8k/tm-z8k.h (BIG): is now sim_z8001_mode. - * config/z8k/z8ksim.mt (TDEPFILES): Add remote-sim.o to list. - * ser-go32.c: Lint. (strncasecmp): Removed, now in libiberty. - (go32_readchar): Special handling for faster polling. (async - structure): Volatile. - * h8300-tdep.c (print_register_hook): Allocate and use the right - number bytes for the raw register. - * h8500-tdep.c (regoff, frame_find_saved_reg, examine_prologue): - deleted. (h8500_register_size, h8500_register_virtual_type, ): - Use new way of counting registers. - * remote-e7000.c (echo_index): deleted. (expect): Better handling - of user interrupts. (expect_prompt): Remove never used log file - support. (want, want_nopc): Add support for H8/300H. - (fetch_regs_from_dump): Treat \r and \n as whitespace. - (e7000_drain): Send an "end" command before waiting for output to - stop. (e7000_wait): Cope with H8/300H, better handling of user - interrupts. (why_stop, expect_n, sub2_from_pc): New function. - * remote-utils.c (gr_load_image): call fflush and QUIT more regularly. - * utils.c (notice_quit): New function for polling for user interrupts. - -Fri Dec 10 15:53:56 1993 Per Bothner (bothner@kalessin.cygnus.com) - - * stabsread.c (read_array_type): Allow negative array bounds, - without interpreting that to mean "adjustable." - * ch-valprint.c (chill_val_print): Handle RANGE types. - * ch-typeprint.c (chill_type_print_base): Handle BOOL. - Handle variant records. Handle RANGE types. - -Tue Dec 7 15:41:32 1993 Ian Lance Taylor (ian@cygnus.com) - - * config/mips/idt.mt: Use tm-idt.h instead of tm-bigmips.h. - * config/mips/idtl.mt: Use tm-idtl.h instead of tm-mips.h. - * config/mips/tm-idt.h, config/mips/tm-idtl.h: New files; use - different BREAKPOINT value for IDT. - - * mipsread.c: Include bfd.h and coff/sym.h. - -Mon Dec 6 16:34:10 1993 K. Richard Pixley (rich@cygnus.com) - - * ser-unix.c (set_tty_state): set the rest of the terminal state - pieces. - -Mon Dec 6 12:01:37 1993 Ian Lance Taylor (ian@tweedledumb.cygnus.com) - - * configure.in: Recognize mips* for all mips targets. - (mips*el-*-elf*, mips*-*-elf*): New targets; use idt and idtl. - - Added Irix 5 support. - * configure.in (mips-sgi-irix5*): New host and target. Use irix5 - for both. - * config/mips/irix5.mh, config/mips/irix5.mt, - config/mips/xm-irix5.h, config/mips/nm-irix5.h, - config/mips/tm-irix5.h, irix5-nat.c: New files for Irix 5 support. - * mdebugread.c: New file, split out of mipsread.c. Added - elfmdebug_build_psymtabs routine. Added some checks on external - symbols. Changed code to keep ecoff_debug_info and - ecoff_debug_swap structs in the psymtab and in global pointers - rather than retrieving them from the bfd. Also changed to keep - the pending list with the psymtab rather than the objfile (each - psymtab for a single objfile points to the same pending list). - * mipsread.c: Bulk of file moved into mdebugread.c, leaving just - the sym_fns. - * Makefile.in (SFILES): Added mdebugread.c. - (OBS): Added mdebugread.o. - (mdebugread.o): New target. - * symfile.h: Declare mdebug_build_psymtabs and - elfmdebug_build_psymtabs. - * elfread.c (struct elfinfo): Added mdebugsect field. - (elf_locate_sections): Remember location of .mdebug section. - (elf_symfile_read): Call elfmdebug_build_psymtabs on .mdebug - section. - * infrun.c (AT_FUNCTION_START): Set to 0 if not already defined. - (wait_for_inferior): Use AT_FUNCTION_START if it is defined to see - if PC is at the start of a function. - * mips-tdep.c (read_next_frame_reg): Use SIGFRAME_REG_SIZE, and - give it a default definition. - (mips_skip_prologue): Skip instructions which initialize $gp - register. - (in_sigtramp): New procedure, moved in from mipsread.c. - * config/mips/tm-mips.h: Declare in_sigtramp. - - * serial.h (serial_fdopen): Make parameter const to match - function definition. - -Fri Dec 3 14:20:43 1993 Stu Grossman (grossman at cygnus.com) - - * config/mips/irix4.mh: Enable ser-tcp.o. - -Tue Nov 30 15:24:24 1993 Ian Lance Taylor (ian@tweedledumb.cygnus.com) - - * Makefile.in (check): Do not use subdir_do, so that - TARGET_FLAGS_TO_PASS is used correctly. - -Mon Nov 29 16:10:38 1993 Stu Grossman (grossman at cygnus.com) - - * i386-nlmstub.c: Undo I/O redirection changes by Tom Lord. - These definitely won't work under Netware. - -Mon Nov 29 15:34:58 1993 Kung Hsu (kung@cirdan.cygnus.com) - - * stabsread.c(read_struct_field): Fix the check when getting to - member functions. - -Mon Nov 29 16:48:16 1993 Ian Lance Taylor (ian@tweedledumb.cygnus.com) - - gcc -Wall -O lint: - * mips-tdep.c (heuristic_proc_desc): Initialize reg30 to avoid - warning. Unnest comment. - (init_extra_frame_info): Remove unused variable mask. - (MASK): Fully parenthesize. - (mips_push_dummy_frame): Remove unused variable val. - (mips_skip_prologue): Remove unused variables f and b. - -Mon Nov 29 12:23:25 1993 Peter Schauer (pes@regent.e-technik.tu-muenchen.de) - - * mipsread.c (parse_symbol, parse_partial_symbols): Do not create - (partial) symbols for opaque struct definitions. - -Mon Nov 29 11:36:57 1993 Stu Grossman (grossman at cygnus.com) - - * i386ly-tdep.c (i386lynx_saved_pc_after_call): Change call_inst - to unsigned char to avoid domain warning for some values. - -Mon Nov 22 23:42:59 1993 Steve Chamberlain (sac@jonny.cygnus.com) - - * remote-e7000.c (e7000_wait): Cope with H8/300 register dump. - * config/h8300/h8300hms.mt: Add remote-e7000. - -Mon Nov 22 11:03:45 1993 Fred Fish (fnf@cygnus.com) - - Merged changes from kev@spuds.geg.mot.com (Kevin A. Buettner): - * gdb/config/m88k/delta88.mh (NATDEPFILES): Added corelow.o and - coredep.o to this list. - * gdb/m88k-nat.c (m88k_register_u_addr): Avoid error when passed - the number for an M88110 extended register by just returning the - address of r0. - -Sat Nov 20 09:20:51 1993 Fred Fish (fnf@rtl.cygnus.com) - - * go32-xdep.c (re_comp, re_exec): Remove stubs now that gdb - always uses it's own version of regex. - -Fri Nov 19 18:23:19 1993 Kung Hsu (kung@cirdan.cygnus.com) - - * valops.c(value_struct_elt_for_reference): enhance search operator in - c++. - * symtab.c(decode_line_1): same as above. - -Fri Nov 19 15:08:47 1993 Jim Kingdon (kingdon@lioth.cygnus.com) - - * symtab.c (decode_line_1): Add comment about use of - return_to_top_level directly instead of error. Add comment saying - that the '' should not be needed--that the completer should be fixed. - -Fri Nov 19 11:00:33 1993 Kung Hsu (kung@cirdan.cygnus.com) - - * symtab.c(decode_line_1): fix the inconsistency of setting - breakpoint with '' or without them. The '' is needed when you - want name completion. - -Thu Nov 18 08:25:50 1993 Fred Fish (fnf@cygnus.com) - - * valprint.c (val_print_string): When looking for a null - terminator compare current bufsize to fetchlimit to determine - when to stop, instead of computing buffer+fetchlimit which - may overflow for very large limits (like "unlimited"). - -Wed Nov 17 18:23:09 1993 Kung Hsu (kung@cirdan.cygnus.com) - - * eval.c(evaluate_subexp): to use unified search so type conversion - operator works in calling method. - * valarith.c(value_x_binop, value_x_unop): same as above. - * valops.c(search_struct_method): same as above. - -Wed Nov 17 18:47:34 1993 Ian Lance Taylor (ian@tweedledumb.cygnus.com) - - * mipsread.c: Change use of ECOFF information to correspond to - changes in bfd/libecoff.h. - (mipscoff_symfile_offsets): Made static. - -Wed Nov 17 09:43:31 1993 Kung Hsu (kung@cirdan.cygnus.com) - - * valops.c (typecmp): improve prototype matching when calling - a method. Make 'p (*(ostream *) &cout) << "lll" ' to work. - * eval.c(evalute_subexp): fix operator search problem when call - like p x.'operator+'(i). - -Tue Nov 16 17:15:03 1993 Stu Grossman (grossman at cygnus.com) - - * i386ly-nat.c, i386lynx-nat.c, m68kly-nat.c: Remove. Move - common code into lynx-nat.c. - * lynx-nat.c: New module. Contains portable code for Lynx native - stuff (mostly ptrace related). - * config/i386/i386lynx.mh (NATDEPFILES): i386ly-nat.o -> lynx-nat.o - * config/m68k/m68klynx.mh (NATDEPFILES): i386ly-nat.o -> lynx-nat.o - - * config/nm-lynx.h, config/tm-lynx.h: New files to contain - non-architecture specific native and target defs. - * config/i386/nm-i386lynx.h, config/i386/tm-i386lynx.h, - config/m68k/nm-m68klynx.h, config/m68k/tm-m68klynx.h: Move all - (arch) portable stuff into ../{tm nm}-lynx.h. - -Tue Nov 16 13:33:47 1993 Jim Kingdon (kingdon@lioth.cygnus.com) - - * symtab.c (gdb_mangle_name): Only assume that the physname is - the entire mangled name if it looks like the mangled name of a - constructor. Needed for testsuite to work with GCC 2.4.5. - - * a68v-nat.c: Replace with new version from Troy Rollo. The - version I am replacing appears to be an old copy of sun3-nat.c. - * dstread.c (dst_symfile_read): Replace sort_all_symtab_syms call - with loop. - - * Makefile.in (TAGS): Depend on TAGFILES_{NO,WITH}_SRCDIR. - - * Makefile.in: (HFILES,TAGFILES): Split into _WITH_SRCDIR and - _NO_SRCDIR versions. - (TAGS): Only add srcdir to TAGFILES_NO_SRCDIR. - (This is part of a long saga involving me putting srcdir on - everything (perhaps for now-obsolete reasons, I forget), Rich - removing the srcdir from everything, Stu putting it back some - places for Sun make, and me just now getting around to fixing - `make TAGS' again). - -Mon Nov 15 12:29:10 1993 Kung Hsu (kung@cirdan.cygnus.com) - - * stack.c(print_frame_info): print demangled function name - ansi style. - -Mon Nov 15 14:32:29 1993 Steve Chamberlain (sac@jonny.cygnus.com) - - * remote-e7000.c: New file to cope with the Hitachi E7000 ICE. - * remote-utils.c, remote-utils.h (gr_load_image): New function to - download to target. - * h8300-tdep.c, h8500-tdep.c, remote-z8k.c, sh-tdep.c z8k-tdep.c - (sim_load): delete. - * remote-sim.c (gdbsim_load): Use gr_load_image, rather than - sim_load. - * config/sh/sh.mt: Add remote-e7000 - -Mon Nov 15 11:38:25 1993 Jim Kingdon (kingdon@lioth.cygnus.com) - - * config/i386/linux.mh: Remove XM_CLIBS, TERMLIB, SYSV_DEFINE, and - REGEX. - * config/i386/xm-linux.h: Don't include xm-i386v.h. Define - HOST_BYTE_ORDER ourselves. Define HAVE_TERMIOS not HAVE_TERMIO. - Define NEED_POSIX_SETPGID. Include unistd.h. - -Mon Nov 15 12:29:10 1993 Kung Hsu (kung@cirdan.cygnus.com) - - * symtab.c(gdb_mangle_name): fix the problem with constructor - name mangling. - -Mon Nov 15 11:38:25 1993 Jim Kingdon (kingdon@lioth.cygnus.com) - - * gdbtypes.h: Add TYPE_FLAG_TARGET_STUB. - * gdbtypes.c (check_stub_type): On TYPE_FLAG_TARGET_STUB, do - what cleanup_undefined_types does for arrays, except we clear - TYPE_FLAG_TARGET_STUB if we fix up the type. - * stabsread.c (cleanup_undefined_types): Add comments about how - doing arrays here is no longer the clean way to do it. - (read_array_type): Set TYPE_FLAG_TARGET_STUB as well as calling - add_undefined_type. - * c-typeprint.c, ch-typeprint.c: Move call to check_stub_type - outside switch so it happens for all type codes. - * cp-valprint.c (cp_print_value_fields): Recurse to val_print, - instead of c_val_print, so that check_stub_type gets called. - - * gdbtypes.h, gdbtypes.c, m2-lang.c, ch-lang.c, c-lang.c: Remove - TYPE_FLAG_SIGNED. It was inconsistently set, never checked - (except in recursive_dump_type), and is pointless. - -Mon Nov 15 00:40:38 1993 Jeffrey A. Law (law@snake.cs.utah.edu) - - * paread.c (pa_symfile_init): Look for the $TEXT$ section rather - than the .text section. - -Sun Nov 14 00:28:13 1993 Jim Kingdon (kingdon@lioth.cygnus.com) - - * stabsread.c: Remove #if 0'd dbx_class_complaint. We now handle - this (more or less) gracefully, and complain() was never a good - way of dealing with this. - - * stabsread.c (read_type): Skip the colon when reading a - cross-reference. Only complain, not error_type, on unrecognized - cross-reference types. error_type, not dump core, if the colon is - missing. - -Fri Nov 12 16:23:08 1993 Stu Grossman (grossman at cygnus.com) - - * config/m68k/tm-sun3.h: Disable use of alternate breakpoint insn - when doing remote stuff. - -Fri Nov 12 16:22:39 1993 Jim Kingdon (kingdon@lioth.cygnus.com) - - * c-exp.y (yylex): Call lookup_symtab not lookup_partial_symtab. - - * partial-stab.h: Ignore ':' symbol descriptors. Same case as - Kung's stabsread.c change. - -Fri Nov 12 11:18:02 1993 Kung Hsu (kung@cirdan.cygnus.com) - - * stabsread.c (patch_block_stabs, define_symbol, read_type): in - g++ template instantiation, nested class can be part of the - params, and '::' can gets into symbol or type names. This is - to fix the problem. - - * gdbtypes.c (lookup_struct_elt_type): Handle type ref or pointer - to struct/union case. - -Fri Nov 12 10:39:31 1993 Stu Grossman (grossman at cygnus.com) - - * coff-solib.c (coff_solib_add): Cast result of alloca(). - * m68k-tdep.c (m68k_saved_pc_after_call): Get rid of - GDB_TARGET_IS_SUN3. Use more general SYSCALL_TRAP macro. - * config/m68k/m68klynx.mh (NATDEPFILES): Remove exec.o (it's - already in TDEPFILES). - * config/m68k/tm-m68k.h (SAVED_PC_AFTER_CALL): Use - m68k_saved_pc_after_call. - * Remove all Sun3 specific stuff. - * (FIX_CALL_DUMMY): Cast arg to bfd_putb32 to unsigned char *. - * config/m68k/tm-m68klynx.h: Define SYSCALL_TRAP as trap #10. - Disable REMOTE_BREAKPOINT mechanism. - * config/m68k/tm-sun3.h: Get rid of GDB_TARGET_IS_SUN3. - * Protect from multiple includion. - * Move Sun3 specific stuff from tm-m68k.h to here. - * Define SYSCALL_TRAP as trap #0. - * Remove def of SAVED_PC_AFTER_CALL (now in tm-m68k.h). - * gdbserver/low-lynx.c: Redo all register store/fetch stuff to - make it portable for 386 and 68k. - -Fri Nov 12 09:53:26 1993 Jim Kingdon (kingdon@lioth.cygnus.com) - - * mips-tdep.c (init_extra_frame_info): Check to see whether the - registers mentioned in the proc_desc have been saved. This - generalizes mips_in_lenient_prologue in the sense that we keep - searching until we've found saves for all the registers, not just - look for a "lenient prologue" pattern. - * mips-tdep.c: #if 0 lenient prologue code. - - * mips-tdep.c (heuristic_proc_desc): Don't assume a host short - is 16 bits. - -Thu Nov 11 19:58:05 1993 Jim Kingdon (kingdon@lioth.cygnus.com) - - * config/i386/i386sol2.mh: Comment out corelow.o. - - * printcmd.c (address_info): Use filtered, not unfiltered functions. - We should be able to deal with a QUIT here. - -Thu Nov 11 15:22:20 1993 Jeffrey A. Law (law@snake.cs.utah.edu) - - * printcmd.c (address_info): Use fprintf_symbol_filtered - to print the symbol name. - - * stabsread.c (define_symbol): Handle cfront lossage for - struct/union/enums and typedefs. - - * partial-stab.h (case N_BINCL): Update psymtab_language - as appropriate when changing subfiles. - (case N_SOL): Update psymtab_language as appropriate when - changing subfiles. Add typedef for structs, unions, and enums - when processing C++ files. - -Thu Nov 11 13:18:47 1993 Jim Kingdon (kingdon@lioth.cygnus.com) - - * README: Remove information on languages and just cite the (newly - updated) information in doc/gdb.texinfo instead. - - * delta68-nat.c: Fix typos (add missing ");" and stuct -> struct). - -Wed Nov 10 09:31:10 1993 Jim Kingdon (kingdon@lioth.cygnus.com) - - * dbxread.c (process_one_symbol, N_RBRAC): Don't clear - within_function just because local_symbols is NULL. It appears - that this bug has existed since the 10 Apr 89 change which started - clearing within_function here. - - * config/m68k/tm-m68k.h: Clean up CALL_DUMMY comment. - * config/m68k/{tm-hp300bsd.h,tm-hp300hpux.h,tm-m68k-em.h, - tm-monitor.h,tm-sun3.h,tm-vx68.h}, config/sparc/tm-sparc.h: - Define BELIEVE_PCC_PROMOTION. - * dbxread.c: Remove BELIEVE_PCC_PROMOTION define. The code which - used this was moved to stabsread.c a long time ago. - - * dstread.c (dst_sym_fns): Update for flavours. - * symfile.c (find_sym_fns): Add kludge for apollo like for rs/6000. - * dstread.c (dst_symfile_offsets): Set objfile->num_sections. - - gcc -Wall lint: - * thread.c: Include "gdbcmd.h" and <ctype.h>. - * Makefile.in: Update dependency. - * thread.c (thread_command): Remove unused variable p. - * values.c (unpack_double): Use len instead of TYPE_LENGTH (type). - * valprint.c (print_floating): Correctly check sign bit now that - we are using unsigned arithmetic. - * symtab.c (find_pc_line_range): Remove unused variables exact_match, - ind, and l. - -Tue Nov 9 17:42:25 1993 Kung Hsu (kung@cirdan.cygnus.com) - - * valarith.c (value_x_binop): fix search operator in class bug - * valarith.c (value_x_unop): fix search operator in class bug - -Tue Nov 9 19:20:17 1993 Jim Kingdon (kingdon@lioth.cygnus.com) - - * Makefile.in (init.c): Add udi2go32.o to list of files that we - should not try to search for _initialize_* functions. - - * remote-udi.c (udi_wait): Change UDIGdb_StdoutReady back to - UDIStdoutReady. It accidentally got changed on 24 Oct 93 when - stdout was changed to gdb_stdout. Likewise for UDIGetStdout, - UDIStderrReady, and UDIGetStderr. - -Tue Nov 9 12:48:06 1993 Tom Lord (lord@cygnus.com) - - * remote-hms.c (hms_wait): fixed too many arguments to putc_unfiltered. - -Tue Nov 9 12:20:46 1993 Jim Kingdon (kingdon@lioth.cygnus.com) - - * utils.c (quit): Also call gdb_flush on standard output and error. - - * .gdbinit: Remove "source /.gdbinit". It causes a spurious error - if /.gdbinit doesn't exist (and I know of no convention of putting - something in /.gdbinit). - -Mon Nov 8 18:17:11 1993 Kung Hsu (kung@cirdan.cygnus.com) - - * cp-valprint.c (cp_print_value_fields): change output from <no - value> to <optimized out or zero length> - -Mon Nov 08 17:05:30 1993 Jeffrey Wheat (cassidy@cygnus.com) - - * Makefile.in: Change RUNTEST_FLAGS back to RUNTESTFLAGS - Change RUNTEST = runtest to test for existance of - a runtest in the source tree first. - -Mon Nov 8 10:42:03 1993 Jim Kingdon (kingdon@lioth.cygnus.com) - - * Makefile.in: Remove unused variable GCC. Remove "#CC=cc" line - which doesn't really relate to anything. - - * Makefile.in (CC_FOR_TARGET): Test for existence of gcc/xgcc, not - for existence of gcc/Makefile. - - * inflow.c (terminal_init_inferior), infptrace.c (child_resume): - Add comments about use of Lynx PIDGET and how we will want to - clean it up. - - * stabsread.c: Remove long_kludge_name code (it was already #if 0). - * stabsread.c (read_one_struct_field): Clean up comments to reflect - Kung's change of 5 Nov 93. - * stabsread.c (read_one_struct_field): Don't give up on unknown - visibility character, just shove it in fip->list->visibility. - (read_baseclasses): Don't give up on unknown virtual or visibility - characters, just assume a reasonable default, complain, and keep - going. - (attach_fields_to_type): Complain on unrecognized visibility. - One result of all this is that '9' (VISIBILITY_IGNORE) can be used - in a stab as well as being something which GDB uses internally. - -Mon Nov 8 07:57:30 1993 Doug Evans (dje@canuck.cygnus.com) - - * configure.in: Remove h8300h, we have multilib now. - -Mon Nov 8 06:11:24 1993 D. V. Henkel-Wallace (gumby@cirdan.cygnus.com) - - * configure.in: Add unixware as a configuration alias for x86 - sysv4 - - * config/i386/i386nw.mt: add i387-tdep.o, exec.o to TDEPFILES - -Sun Nov 7 23:49:21 1993 Peter Schauer (pes@regent.e-technik.tu-muenchen.de) - - * symtab.c (decode_line_1, decode_line_2): Do not adjust pc by - FUNCTION_START_OFFSET if funfirstline is not set. - -Fri Nov 5 17:19:30 1993 Kung Hsu (kung@cirdan.cygnus.com) - - * gdbtypes.h : add a field 'ignore_field_bits in cplus_specific, - and macros to handle the bits. - * stabsread.c (read_one_struct_field): add VISIBILITY_IGNORE, and - for field of length 0, set this bit on. - * cp-valprint.c (cp_print_value_fields): for VISIBILITY_IGNORE - field, print <no value>. - -Fri Nov 5 14:43:46 1993 Jim Kingdon (kingdon@lioth.cygnus.com) - - * Version 4.11.2. - -Fri Nov 5 09:49:22 1993 Stu Grossman (grossman at cygnus.com) - - * inflow.c (terminal_init_inferior): Temporarily use Lynx PIDGET - macro to set process groups. - * infptrace.c (child_resume): Temporarily use Lynx PIDGET to - specify resumption of all threads. - * infrun.c (wait_for_inferior): Fix handling of thread-specific - breakpoints for systems where DECR_PC_AFTER_BREAK > 0 (ie: backup - PC by the right amount when continuing the thread). - * thread.c (thread_apply_command): Add the `thread apply' - command to apply a given GDB command to a list of threads. - -Fri Nov 5 05:58:03 1993 Jim Kingdon (kingdon@cygnus.com) - - * Makefile.in (init.c): Don't call sed if filename is empty. - -Thu Nov 4 08:27:24 1993 Jim Kingdon (kingdon@lioth.cygnus.com) - - * dbxread.c (unknown_symchar_complaint): Make message refer to - "symbol descriptor" not "symbol type character" for consistency - with stabs.texinfo terminology. - - * stabsread.c (read_struct_fields): Accept either '$' or '.' as - the character which introduces a cpp_abbrev or anonymous type. - - * c-lang.c (c_printstr): Print "" to stream (like all the other - output from this function), not gdb_stdout. - - * dbxread.c (process_one_symbol): Do relocate 'S' symbols by - the text offset (revert 12 Oct 93 change). - - * configure.in: Make hppa*-*-hiux* use hppahpux, - not non-existent hppahiux. - -Wed Nov 3 16:24:09 1993 Kung Hsu (kung@cirdan.cygnus.com) - - * values.c (value_fn_field): when physical name not found, do not - error, but return null. - * valops.c (value_struct_elt): when name and args match does not - mean it is the one, some times a typedef class can have the same - member method and args. This probably will not happen with new - version of g++, but it does happen in old g++ and cause gdb error. - -Wed Nov 3 09:20:18 1993 Jim Kingdon (kingdon@lioth.cygnus.com) - - Merge changes for dos x udi: - * Makefile.in (udi2go32.o): add rule to build this file - * 29k-share/udi/udi2go32.c: new file - * config/a29k/a29k-udi.mt: add udi2go32.o - * 29k-share/udi/{udr.c, udip2soc.c}: #ifdef out the entire file - if __GO32__ is defined. What a hack. - -Wed Nov 3 09:20:18 1993 Jim Kingdon (kingdon@lioth.cygnus.com) - - * remote.c (putpkt, getpkt): Don't call interrupt_query. - - * findvar.c (value_of_register): Rename val to reg_val to avoid - name conflict with some (e.g. tm-m68k.h) REGISTER_CONVERT_TO_VIRTUAL. - - * main.c: Add variables source_line_number, source_file_name, - source_error, source_error_allocated, and source_pre_error. - (command_line_input): If source_file_name set, increment - source_line_number and set error_pre_print with them. - (source_command): Set source_* and make a cleanup so they get - set back. - -Tue Nov 2 16:28:34 1993 Jim Kingdon (kingdon@lioth.cygnus.com) - - * stack.c (down_silently_command): Add comment about PR 1913. - - * breakpoint.c (insert_breakpoints, delete_breakpoint): Call - target_terminal_ours_for_output before attempting output. - - * fork-child.c (fork_inferior): Fix comment so that it suggests - "set shell" rather than having "set env SHELL" affect GDB's - operation. - -Tue Nov 2 15:03:08 1993 Tom Lord (lord@rtl.cygnus.com) - - * utils.c (vfprintf_unfiltered): don't use maybe_filtered - since it involves a fixed size buffer. - -Tue Nov 2 13:42:30 1993 Peter Schauer (pes@regent.e-technik.tu-muenchen.de) - - * findvar.c (value_of_register, value_from_register), - hppa-tdep.c (pa_print_fp_reg), infcmd.c (do_registers_info), - valops.c (value_assign): Use REGISTER_CONVERT_TO_* only if - REGISTER_CONVERTIBLE is defined, otherwise just copy the content. - Pass desired type to REGISTER_CONVERT_TO_*. - - * config/m68k/tm-m68k.h, config/i960/tm-i960.h (REGISTER_CONVERT_*): - Pass length of desired type to store/extract_floating. - * config/i386/tm-arm.h, config/i386/tm-i386aix.h, - config/i386/tm-sun386.h, config/i386/tm-symmetry.h, - config/m88k/tm-m88k.h config/rs6000/tm-rs6000.h (REGISTER_CONVERT_*): - Use extract_floating and store_floating with length of desired type. - * config/m68k/tm-news.h (STORE,EXTRACT_RETURN_VALUE): Add type - parameter to REGISTER_CONVERT_*. - - * config/a29k/tm-a29k.h, config/convex/tm-convex.h, - config/gould/tm-np1.h, config/gould/tm-pn.h, config/h8300/tm-h8300.h, - config/h8500/tm-h8500.h, config/i386/tm-i386v.h, - config/mips/tm-mips.h, config/ns32k/tm-merlin.h, - config/ns32k/tm-umax.h, config/pa/tm-hppa.h, config/pyr/tm-pyr.h, - config/sh/tm-sh.h, config/sparc/tm-sparc.h, config/tahoe/tm-tahoe.h, - config/vax/tm-vax.h, config/z8k/tm-z8k.h (REGISTER_CONVERTIBLE, - REGISTER_CONVERT_TO_RAW, REGISTER_CONVERT_TO_VIRTUAL): Remove - versions for which REGISTER_CONVERTIBLE is always false. - * z8k-tdep.c (register_convert_to_virtual, register_convert_to_raw): - Remove, no longer used. - - * alpha-tdep.c (alpha_register_convert_to_raw, - alpha_register_convert_to_virtual): New routines to handle - the different raw formats in alpha floating point registers. - * config/alpha/tm-alpha.h (REGISTER_CONVERTIBLE, - REGISTER_CONVERT_TO_VIRTUAL, REGISTER_CONVERT_TO_RAW): Use them. - -Tue Nov 2 12:45:23 1993 Stan Shebs (shebs@rtl.cygnus.com) - - * gdbserver/configure.in: Recognize *-*-lynxos* instead of - *-*-lynx*, recognize sparc-*-lynxos*. - * gdbserver/Makefile.in (install, install_only): Add. - * gdbserver/gdbserver.1: New file, man page for gdbserver. - -Tue Nov 2 03:01:01 1993 Jeff Law (law@snake.cs.utah.edu) - - * hpread.c: Include <time.h> and <sys/types.h>. Change include - of "libhppa.h" to "som.h". - (BYTES_IN_WORD): Define. - (hppa_sym_fns): "hppa" is 4 characters, not 5. - -Mon Nov 1 09:40:21 1993 Jim Kingdon (kingdon@lioth.cygnus.com) - - * symtab.c, symtab.h, source.c: Change find_line_pc_range to take - a struct symtab_and_line argument, rather than a symtab and a line. - Re-write it to be based on the address rather than bogusly adding - one to the line number and hoping that has something to do with the - end of the line. - - * config/m88k/m88k.mh (NATDEPFILES): Remove exec.o. - - * paread.c (pa_symtab_read): Change comments to say ignoring - labels really should be handled by the assembler/compiler. - - * Makefile.in: Add -O to CXXFLAGS. - - * TODO: Expand comments on fast watchpoints. - -Sun Oct 31 19:45:06 1993 Jeffrey A. Law (law@snake.cs.utah.edu) - - * paread.c (pa_symtab_read): Also filter out local symbols - starting with "L$". - -Sun Oct 31 09:28:46 1993 Jim Kingdon (kingdon@lioth.cygnus.com) - - * symfile.h (sym_fns), symfile.c (find_sym_fns), xcoffread.c, - coffread.c, dbxread.c, elfread.c, mipsread.c, nlmread.c, paread.c: - Change from using bfd target name to using the flavour. - - * objfiles.h, infcmd.c, symfile.c: Add comments about how various - objfiles get created and when we should blow them away. - -Sat Oct 30 08:32:53 1993 Jim Kingdon (kingdon@lioth.cygnus.com) - - * symfile.c (reread_symbols): When re-reading symbols, do all the - right operations ourself, rather than calling symbol_file_command. - If we re-read something, call clear_symtab_users not just - breakpoint_re_set. - * objfiles.h, objfiles.c (build_objfile_section_table): No longer - static. - * symfile.c (clear_symtab_users): Call clear_pc_function_cache. - * coffread.c, dbxread.c, elfread.c, mipsread.c, nlmread.c, paread.c - (*_symfile_offsets): Set objfile->num_sections. - * remote.c (remote_wait), symfile.c (syms_from_objfile): - Don't muck with objfile->num_sections now that all the symbol - readers set it. - * elfread.c: Clean up obsolete comment about handling only DWARF. - * paread.c: Remove comment about how we should use an "ordinary" - file format with an hppa suffix. There is nothing ordinary about SOM. - - * config/i386/{i386m3.mh,i386mk.mh}, config/mips/mipsm3.mh, - config/ns32k/ns32km3.mh: Change MMALLOC_LIB to MMALLOC. - * TODO: Update Mach stuff. - -Fri Oct 29 16:30:36 1993 Stan Shebs (shebs@rtl.cygnus.com) - - LynxOS support: - * configure.in: Change *-*-lynx* to *-*-lynxos*, add - sparc-*-lynxos*. - * Makefile.in (ALLDEPFILES): Add m68kly-nat.c, sparcly-nat.c. - Rename i386lynx-nat.[co] to i386ly-nat.[co]. - (ALLCONFIG): Add config/{m68k,sparc}/{m68k,sparc}lynx.m[ht]. - (m68kly-nat.o, sparcly-nat.o): Add rules. - * i386ly-tdep.c: Cosmetics. - * i386lynx-nat.c: Removed. - * i386ly-nat.c: New file, was i386lynx-nat.c. - * m68kly-nat.c: New file. - * sparcly-nat.c: New file. - * config/xm-lynx.h: New file, cpu-independent host info. - * config/i386/i386lynx.mh: Changes for consistency. - * config/i386/i386lynx.mt: Ditto. - * config/i386/tm-i386lynx.h: Ditto. - * config/i386/nm-i386lynx.h: Ditto. - * config/i386/xm-i386lynx.h: Include config/xm-lynx.h. - * config/m68k/m68klynx.mh, config/m68k/m68klynx.mt, - config/m68k/tm-m68klynx.h, config/m68k/nm-m68klynx.h, - config/m68k/xm-m68klynx.h: New files, M68K LynxOS support. - * config/sparc/sparclynx.mh, config/sparc/sparclynx.mt, - config/sparc/tm-sparclynx.h, config/sparc/nm-sparclynx.h, - config/sparc/xm-sparclynx.h: New files, Sparc LynxOS support. - -Fri Oct 29 08:11:29 1993 Jim Kingdon (kingdon@lioth.cygnus.com) - - * defs.h, findvar.c (extract_floating, store_floating): New functions. - * Move SWAP_TARGET_AND_HOST from defs.h to findvar.c because it is - now used only by extract_floating and store_floating. - * valprint.c (print_floating): Use unsigned arithmetic. Use - extract_unsigned_integer instead of SWAP_TARGET_AND_HOST. - Change sizeof (float) to 4 and sizeof (double) to 8 (those are always - the relevant sizes for this code, which is in #ifdef IEEE_FLOAT). - * values.c (unpack_long, unpack_double, value_from_double), - valarith.c (value_binop), stabsread.c (define_symbol): - Use extract_floating and store_floating instead of - SWAP_TARGET_AND_HOST. - * config/m68k/tm-m68k.h, config/i960/tm-i960.h (REGISTER_CONVERT_*): - Use extract_floating and store_floating. - * config/m88k/tm-m88k.h: Add comments (it should be doing the same). - * i386-tdep.c (i386_extract_return_value), - * remote-nindy.c (nindy_store_registers): Use store_floating. - -Fri Oct 29 09:31:38 1993 Steve Chamberlain (sac@rtl.cygnus.com) - - * remote-sim.c (gdbsim_store_register): Change var name so - it compiles with non-ANSI compilers. - -Fri Oct 29 08:11:29 1993 Jim Kingdon (kingdon@lioth.cygnus.com) - - * TODO: Add idea for "disassemble" with source. - -Fri Oct 29 00:41:01 1993 Fred Fish (fnf@cygnus.com) - - * Makefile.in (VERSION): Bump to 4.11.1 after release and cvs - tagging. - -Thu Oct 28 09:14:42 1993 Jim Kingdon (kingdon@lioth.cygnus.com) - - * TODO: Add section on Mach. Stop calling it a "bug list". - Remove John's name and email address. Remove item on "always" - ("hook-stop" takes care of this). Remove item on executables with - no symbols (this works on some machines, at least). Remove item - about calling error() during symbol reading (I think all the important - ones have been cleaned up). Revise items about signals and remote - systems. Remove section on ^Z requiring several continues to make - it go (this now works. Perhaps the item is based on confusion over - programs (like GDB itself) which catch SIGTSTP and then re-send - themselves the signal. PR 2575 might contain relevant info). - -Thu Oct 28 16:55:34 1993 Fred Fish (fnf@cygnus.com) - - * NEWS: Note improvements in C++ support, preliminary thread - implementation, and LynxOS native and target support for 386. - -Thu Oct 28 16:55:34 1993 Fred Fish (fnf@cygnus.com) - - * README: Add note from Peter Schauer about OSF/1 shared - libraries. Add note from Pace Willisson about configuring on BSDI - BSD/386 release 1.0. Update gdb references to gdb 4.11. - -Thu Oct 28 09:14:42 1993 Jim Kingdon (kingdon@lioth.cygnus.com) - - * NEWS: Add notes about Alpha and "set remotedebug" for UDI. - - * valops.c (value_assign): Change bitfield code to use a buffer of - the correct size, rather than an int. - -Wed Oct 27 13:43:07 1993 Jim Kingdon (kingdon@lioth.cygnus.com) - - * config/i386/{i386m3.mt,i386m3.mh}, - config/mips/{mipsm3.mt,mipsm3.mh}, - config/ns32k/{ns32km3.mt,ns32km3.mh}: Use correct names for TM_FILE - and XM_FILE. Replace host files *mach3-xdep.o with native - files *m3-nat.o. Replace host file os-mach3.o with native - file m3-nat.o. - - * remote-udi.c: Remove LOG_FILE stuff; superceded by "set remotedebug". - * remote-mon.c: Remove commented out "set remotedebug" command. - * remote-nindy.c: Clean up comment about wanting alternative to - options specified on the GDB command line. - - * fork-child.c (fork_inferior): Set inferior_pid before calling - init_trace_fun. Move the code which gets us through the shell - to new function startup_inferior. - * inferior.h: Declare startup_inferior. - * procfs.c (procfs_init_inferior), inftarg.c (ptrace_him): - Call startup_inferior. - * m3-nat.c (m3_trace_him): Call intercept_exec_calls. - * config/nm-m3.h: Don't define STARTUP_INFERIOR. - * config/i386/tm-i386m3.h, config/ns32k/tm-ns32k.h, - config/mips/tm-mipsm3.h: Don't define START_INFERIOR_TRAPS_EXPECTED. - - * m68k-stub.c: Change vector 13 from SIGFPE to SIGBUS. - -Tue Oct 26 22:05:03 1993 Jim Kingdon (kingdon@deneb.cygnus.com) - - * mips-tdep.c (mips_pop_frame): If proc_desc is NULL, don't dump core. - -Tue Oct 26 15:07:29 1993 Jim Kingdon (kingdon@lioth.cygnus.com) - - gcc -Wall lint: - * nlmread.c: Include stabsread.h. - * Makefile.in: Update dependencies. - - * remote.c: Change PBUFSIZ back to 400. John's 28 Feb 1992 change - to increase it broke the ability to write large chunks of memory - with m68k-stub and i386-stub. Now we only use more than 400 on - machines where we need that much to write the registers. - * remote.c (remote_write_bytes): Eliminate possible abort(). The - check for when to abort was off by a few bytes and besides which, - it is handled by MAXBUFBYTES, which the caller uses. - * m68k-stub.c: Add comments about trap #1 and trap #8 instructions. - -Tue Oct 26 08:36:07 1993 Doug Evans (dje@canuck.cygnus.com) - - * remote-sim.h (SIM_ADDR): New type (same as CORE_ADDR). - (sim_set_pc): Update prototype. - (sim_read, sim_write): Ditto, and use unsigned char *buf. - (sim_fetch_register, sim_store_register): Use unsigned char *buf. - (sim_info): Pass printf function as argument, add verbose argument. - (sim_stop_reason): Renamed from sim_stop_signal, fix prototype. - * remote-sim.c (gdbsim_wait): Update call to sim_stop_reason. - (gdbsim_files_info): Update call to sim_info. - -Tue Oct 26 10:41:29 1993 Jim Kingdon (kingdon@lioth.cygnus.com) - - * valops.c (value_assign): Call reinit_frame_cache when assigning - to a register. - -Mon Oct 25 11:08:59 1993 Stu Grossman (grossman at cygnus.com) - - * infrun.c (wait_for_inferior): Fix PC out of objfile bounds - check to just use stop_func_name == 0. - * remote-udi.c (store_register): Invalidate NPC/PC_REGNUM after - changing PC. - -Mon Oct 25 14:57:45 1993 Jim Kingdon (kingdon@lioth.cygnus.com) - - * gdbserver/{low-lynx.c,low-sparc.c,low-sun3.c}, standalone.c, - m3-nat.c, i386m3-nat.c, mipsm3-nat.c, ns32km3-nat.c: bcopy -> memcpy. - - gcc -Wall lint: - * breakpoint.c: Include thread.h. - * coffread.c: Include stabsread.h. - * Makefile.in: Update dependencies. - * breakpoint.c (mention): Add bp_call_dummy to switch. - * symmisc.c (dump_symtab): Use %d not %ld for line number. - -Sun Oct 24 18:29:32 1993 Tom Lord (lord@rtl.cygnus.com) - - * every non-obsolete file except utils.c: - Change the stream argument to _filtered to GDB_FILE *. - Change all references to stdout/stderr to gdb_stdout/gdb_stderr. - Replace all calls to stdio output functions with - calls to corresponding _unfiltered functions. - Replaced calls to fopen for output to gdb_fopen. - Added sufficient goo to utils.c and defs.h to make the above - work. - - The net effect is that stdio output functions are only directly - used in utils.c. Elsewhere, the _unfiltered and _filtered - functions and GDB_FILE type are used. - - In the near future, GDB_FILE will stop being equivalant to - FILE. - - The semantics of some commands has changed in a very subtle way: - called in the right context, they may cause new occurences of - prompt_for_continue() behavior. - - Please respect this change by not reintroducing stdio output - dependencies in the main body of gdb code. All output from - commands should go to a GDB_FILE. - -Sun Oct 24 20:16:38 1993 Peter Schauer (pes@regent.e-technik.tu-muenchen.de) - - * parse.c, parser-defs.h (write_exp_msymbol): New function to write - the appropriate expression for a minimal symbol. Taken from c-exp.y - and m2-exp.y but handles mst_file_*. - * c-exp.y, m2-exp.y: Use it. - -Sun Oct 24 09:31:05 1993 Fred Fish (fnf@lisa.cygnus.com) - - * elfread.c (elf_symtab_read): Use bfd convention that both - initialized and uninitialized data sections have the SEC_ALLOC - flag bit set, but only initialized sections have SEC_LOAD set. - SEC_DATA is ignored since it only gets set for initialized - data. - -Sat Oct 23 14:48:18 1993 Doug Evans (dje@canuck.cygnus.com) - - * remote-sim.h (sim_stop): New enum. - (sim_stop_signal): Change prototype, result is enum sim_stop. - * remote-sim.c (gdbsim_wait): Update call to sim_stop_signal. - -Fri Oct 22 07:49:54 1993 Jim Kingdon (kingdon@lioth.cygnus.com) - - * stabsread.c (define_symbol): Skip the whole thing about "pcc - promotion" on little-endian machines. - - * remote-vx.c (vx_wait): Rename pid parameter to pid_to_wait_for. - Some compilers (legitimately) don't like variables in the - function's outermost block whose name is the the same as the name of - a parameter. - - Merge Apollo patches from Troy Rollo (troy@cbme.unsw.edu.au): - * dst.h, dstread.c, config/m68k/{apollo68b.mt,tm-apollo68b.h}: - New files. - * config/m68k/nm-apollo68b.h: Add more defines. - * configure.in: Recognize apollo target, not just host. - - * configure.in: Add * to end of all OS names. - -Fri Oct 22 06:14:01 1993 Fred Fish (fnf@cygnus.com) - - * Makefile.in (ALLPARAM): Add config/m88k/xm-delta88v4.h - -Thu Oct 21 12:23:12 1993 Jim Kingdon (kingdon@lioth.cygnus.com) - - * Makefile.in (init.c): Generate using the source, not munch. This - cleans up all kinds of hassles (which nm to use in munch, etc). The - new formatting conventions (mostly already followed) are that - the name of the _initialize_* routines must start in column zero, - and must not be inside #if. - * munch: Removed. - * Makefile.in: Remove references to munch. - * serial.c, remote.c, infptrace.c, maint.c, convex-tdep.c, - alpha-tdep.c, hp300ux-nat.c, hppab-nat.c, osfsolib.c, remote-es.c, - procfs.c, remote-udi.c, ser-go32.c, ultra3-xdep.c, sh-tdep.c, - i960-tdep.c, hppa-tdep.c, h8500-tdep.c, dpx2-nat.c, delta68-nat.c, - z8k-tdep.c: Make sure the above conventions are followed. Make - sure they are all declared as returning void. Clean up - miscellaneous comments and such. - - * sh-tdep.c (sim_load): Add function. - -Thu Oct 21 15:58:48 1993 david d `zoo' zuhn (zoo@rtl.cygnus.com) - - * remote-mips.c (mips_wait): add pid argument. - -Thu Oct 21 12:23:12 1993 Jim Kingdon (kingdon@lioth.cygnus.com) - - * Makefile.in (c-exp.tab.o): Remove notice about shift/reduce conflicts - which no longer occur. - - gcc -Wall lint: - * findvar.c (symbol_read_needs_frame), corelow.c (ignore), - inflow.c (gdb_has_a_terminal): Make sure to return a value. - * regex.h: Declare re_set_syntax. - * printcmd.c: Include valprint.h. - * infcmd.c, exec.c, maint.c, core.c: Include language.h. - * maint.c: Include expression.h. - * infrun.c, fork-child.c, corelow.c, inflow.c: Include thread.h. - * inftarg.c: Include command.h. - * coredep.c: Include value.h. - * c-exp.y, m2-exp.y, ch-exp.y: Include bfd.h, symfile.h and objfiles.h. - * ch-typeprint.c: Include typeprint.h. - * ch-valprint.c: Include c-lang.h. - * nlmread.c: Include buildsym.h. - * environ.c: Include gdbcore.h. Only include defs.h once. - (set_in_environ): Cast const char * to char * when passing to - set_gnutarget. - * Makefile.in: Update dependencies to reflect all these new includes. - Remove unused variables: - * printcmd.c (printf_command): args_to_vprintf. - * coffread.c (coff_symfile_init): strsection. - Move variables to within the #ifdefs where they are used: - * symtab.c (gdb_mangle_name): opname. - * inftarg.c (child_attach): pid and exec_file. - * inftarg.c (child_detach): siggnal. - * objfiles.c (allocate_objfile): mapto, md, and fd. - * objfiles.c (free_objfile): mmfd. - * infrun.c (wait_for_inferior): Include BPSTAT_WHAT_LAST in switch. - * infrun.c (wait_for_inferior): Remove unused same_pid label. - * inferior.h: Declare set_sigint_trap and clear_sigint_trap. - * parser-defs.h: Declare write_exp_elt_block. - * stabsread.h: Declare elfstab_offset_sections and - coffstab_build_psymtabs. - -Thu Oct 21 12:05:08 1993 Ken Raeburn (raeburn@cygnus.com) - - Patch from Jeff Law: - * paread.c: Fix references to "hppa" that should now be "som". - -Thu Oct 21 12:23:12 1993 Jim Kingdon (kingdon@lioth.cygnus.com) - - * symtab.c (decode_line_1): Don't use SYMBOL_LINE for functions. - -Thu Oct 21 02:59:07 1993 Stu Grossman (grossman at cygnus.com) - - * remote-udi.c (udi_store_registers, store_register): Use - UDI29KPC address space when modifying PC. It seems that you can't - modify the PC directly (at least in the isstip simulator). - -Wed Oct 20 11:35:43 1993 Jim Kingdon (kingdon@lioth.cygnus.com) - - * target.h: Put remote_debug declaration back here. Add baud_rate. - * remote.c, remote-udi.c, remote-utils.h: Let target.h take care of - declaring these. Those random externs all over are error prone. - * Move "set remotebaud" from remote-utils.c to main.c to it applies - to remote.c as well. - - * xcoffread.c (xcoff_symfile_read), coffread.c (coff_symfile_read): - Sort symtabs for this objfile only, not for all objfiles. - * symfile.c, symfile.h (sort_all_symtab_syms): Remove; no longer used. - - * mipsread.c (parse_symbol): In third-eye, a function has a block - within it which represents the whole function. Create only one - GDB block for both. - -Wed Oct 20 17:47:42 1993 Stu Grossman (grossman at cygnus.com) - - * main.c: Make baud_rate and remote_debug be global variables, - remove #include "remote-utils.h". This makes it possible to build - GDB without remote-utils.c. Also, move setting of remote_debug - into main, so that all remote*.c files can use it (not just the - serial line ones). And, make baud_rate be an int. - * remote-udi.c: Change kiodebug to remote_debug. - * remote-utils.c: Move setting of baud rate and debug into main.c. - * remote-utils.h: Redefine sr_{get set}_debug and sr_{get set}_baud - to use baud_rate and remote_debug globals for compatibility. - * remote.c: Use remote_debug and baud_rate globals directly, - instead of sr_ functions, so that we don't need to load - remote-utils.c. - * config/a29k/a29k-udi.mt: Define REMOTE_O as null so that we don't - get the default remote* modules. - -Wed Oct 20 11:35:43 1993 Jim Kingdon (kingdon@lioth.cygnus.com) - - * stabsread.c (define_symbol): When combining a LOC_ARG and a - LOC_REGISTER, use the type from the LOC_REGISTER, not from the - LOC_ARG. - -Wed Oct 20 14:34:38 1993 K. Richard Pixley (rich@sendai.cygnus.com) - - * config/i386/xm-go32.h: define some signals if they aren't - already defined. - -Wed Oct 20 11:35:43 1993 Jim Kingdon (kingdon@lioth.cygnus.com) - - * Makefile.in (INTERNAL_LDFLAGS): New macro. The new part is - that we use CFLAGS and PROFILE_CFLAGS to link. - (gdb, rapp, kdb): Use INTERNAL_LDFLAGS instead of - LDFLAGS and/or GLOBAL_CFLAGS. - -Wed Oct 20 09:29:55 1993 Stu Grossman (grossman at cygnus.com) - - * Makefile.in: Add $(srcdir) to all refs to 29k-share - directories. - -Tue Oct 19 17:23:34 1993 Fred Fish (fnf@deneb.cygnus.com) - - * Makefile.in (ALLCONFIG): Add config/i386/{i386m3.mh, i386m3.mt, - i386/i386mk.mh i386/i386mk.mt}, config/mips/{mipsm3.mh, - mipsm3.mt}, config/ns32k/{ns32km3.mh, ns32m3.mt} - * Makefile.in (remote_utils_h): Add remote-sim.h - * Makefile.in (NONSRC): Add i386-nlmstub.c - * Makefile.in (HFILES): Add coff-solib.h - -Tue Oct 19 14:15:40 1993 Kung Hsu (kung@cirdan.cygnus.com) - - * values.c (value_virtual_fn_field): Fix the offset calculation - when calling virtual functions. (gdb.t22/virtfunc.exp). - * eval.c (evaluate_subexp): same as above. - -Tue Oct 19 10:43:16 1993 Jim Kingdon (kingdon@lioth.cygnus.com) - - * config/rs6000/rs6000.mh (TERMCAP): Define to -lcurses. - - * Makefile.in: Define CXXFLAGS. - -Tue Oct 19 09:28:52 1993 Stu Grossman (grossman@cygnus.com) - - * sparclite/Makefile.in: Fixup so that this works with Sun make - and VPATH. - -Tue Oct 19 10:43:16 1993 Jim Kingdon (kingdon@lioth.cygnus.com) - - * breakpoint.h (struct bpstat_what): Don't use bitfields. - - * typeprint.c: Add "class CLASS-NAME" to docstring for ptype. - -Tue Oct 19 06:17:10 1993 Fred Fish (fnf@cirdan.cygnus.com) - - * Makefile.in (ALLPARAM): Add config/m88k/{nm-delta88v4.h, - tm-delta88v4.h, xm-dgux.h}. - * Makefile.in (ALLCONFIG): Add config/m88k/{delta88v4.mh, - delta88v4.mt}. - - * README: Remove comment about SunOS 5.x programs leaving - coredumps. Info from Sun is that this was not in customer - releases. - -Mon Oct 18 10:28:08 1993 Jim Kingdon (kingdon@lioth.cygnus.com) - - * hppa-tdep.c (restore_pc_queue): Call target_terminal_ours after - done stepping the inferior. - - * c-exp.y: Remove never-used (because of shift/reduce conflicts) - rules for pointers to members. - * Makefile.in: Remove notice about expected shift/reduce conflicts. - - * buildsym.c (finish_block): If we pop the context stack and it is - not empty, complain () instead of abort (). - -Sun Oct 17 19:42:31 1993 Jim Kingdon (kingdon@lioth.cygnus.com) - - * parse.c, parser-defs.h (follow_types): New function. - * c-exp.y (ptype : typebase abs_decl): Use it. - * c-exp.y (ptype): Add support for type qualifiers after the - typebase. The typebase rule already has support for them before - the typebase. - * Makefile.in: Change the expected number of shift/reduce - conflicts to 6. This is OK--the 2 new conflicts are basically the - same as one of the old ones. - -Sun Oct 17 13:04:49 1993 Fred Fish (fnf@cygnus.com) - - * Makefile.in (VERSION): Bump to 4.10.3. - -Sun Oct 17 09:18:57 1993 Jim Kingdon (kingdon@lioth.cygnus.com) - - * infrun.c (wait_for_inferior): Clean up comments which were at - the top of the file, making them more concise and moving them with - the code (Sorry, Randy, but these stream-of-consciousness comments - really have to go). Switch the order of the "&&", which makes - things clearer and turns out to be an improvement with respect to - side effects and speed. - -Sun Oct 17 02:06:01 1993 Stu Grossman (grossman at cygnus.com) - - * procfs.c: Handle process exits more elegantly by trapping on - entry to _exit. Also, cleanup procinfo list when process dies of - it's own accord (as opposed to being killed). - -Sat Oct 16 20:47:30 1993 Jim Kingdon (kingdon@lioth.cygnus.com) - - * config/m88k/xm-dgux.h: Define NO_PTRACE_H. - - * corelow.c (add_to_thread_list): Need a cast to go from PTR to - asection *. - - * infrun.c: Add comment about signals. - - * fork-child.c (fork_inferior): Remove CREATE_INFERIOR_HOOK again. - Stu reinstated it (accidently I assume). - -Sat Oct 16 15:27:10 1993 Stu Grossman (grossman at cygnus.com) - - * procfs.c (procfs_wait): Losing Unixware can't do poll on /proc - files. Use PIOCWSTOP instead. - * corelow.c (add_to_thread_list): Fix arg to match prototype. - - * procfs.c (procfs_set_sproc_trap): Don't use this if sproc - isn't available. - * (procfs_notice_signals): Fix prototype. - -Fri Oct 15 22:46:07 1993 Stu Grossman (grossman at cygnus.com) - - * breakpoint.c (breakpoint_thread_match break_command_1): - Thread-specific breakpoint support. - * breakpoint.h (struct breakpoint): Add thread id field. - * fork-child.c (fork_inferior): Move call to init_thread_list() - back a bit so that init_trace_fun can do thread functions. - * hppa-tdep.c (restore_pc_queue): Add pid to call to target_wait. - * hppab-nat.c (child_resume): Handle default pid. - * hppah-nat.c (child_resume): Handle default pid. - * i386lynx-nat.c (child_wait): New arg pid. - * inflow.c (kill_command): Reset thread list. - * infptrace.c (child_resume): Handle default pid. - * infrun.c: Thread-specific breakpoint support. - * inftarg.c (child_wait): Add pid arg. - * osfsolib.c (solib_create_inferior_hook): Add pid to call to - target_resume. - * procfs.c: Multi-thread support. - * remote-bug.c (bug_wait): Add pid arg. - * remote-hms.c (hms_wait): Add pid arg. - * remote-mips.c (mips_wait): Add pid arg. - * remote-mon.c (monitor_wait): Add pid arg. - * remote-nindy.c (nindy_wait): Add pid arg. - * remote-sim.c (gdbsim_wait): Add pid arg. - * remote-udi.c (udi_wait): Add pid arg. - * remote-vx.c (vx_wait): Add pid arg. - * remote-z8k.c (sim_wait): Add pid arg. - * remote.c (remote_wait): Add pid arg. - * solib.c (solib_create_inferior_hook): Add pid to call to - target_resume. - * target.h (struct target_ops): Add pid arg to to_wait and - to_notice_signals. - * thread.c (valid_thread_id): New func to validate thread #s. - * (pid_to_thread_id): New func to do the obvious. - * thread.h: Prototypes for above. - - * coff-solib.c (coff_solib_add): Use nameoffset field to locate - filename. - -Fri Oct 15 21:29:40 1993 Jim Kingdon (kingdon@lioth.cygnus.com) - - * h8300-tdep.c, h8500-tdep.c: Define sim_load only, but not - sim_kill, sim_open, or sim_set_args. - - * stack.c (print_stack_frame): Put catch_errors around - print_frame_info so (for example) error printing source doesn't - cause auto-displays to get skipped in normal_stop. - - * findvar.c (value_from_register): When preparing to cast a value - from REGISTER_VIRTUAL_TYPE to type, copy the REGISTER_VIRTUAL_SIZE; - the old code didn't copy the whole thing. - * valops.c (value_assign): Add comment. - -Fri Oct 15 12:57:30 1993 Peter Schauer (pes@regent.e-technik.tu-muenchen.de) - - * mipsread.c (upgrade_type): Replace bitsize sanity checks and - complaint by a comment explaining why they were useless. - -Fri Oct 15 14:30:30 1993 Jim Kingdon (kingdon@lioth.cygnus.com) - - * Move comments on bypassing call dummy breakpoint from stack.c - to breakpoint.h. - -Fri Oct 15 11:52:56 1993 Peter Schauer (pes@regent.e-technik.tu-muenchen.de) - - * symtab.c (lookup_partial_symtab): If filename is not found and - contains no slashes, try again and compare without leading path - components. - * symtab.c (lookup_symtab_1): Replace open coded version of - lookup_partial_symtab with a function call. - -Thu Oct 14 20:34:15 1993 Jim Kingdon (kingdon@lioth.cygnus.com) - - * fork-child.c (fork_inferior), remote-eb.c (eb_create_inferior), - remote-mon.c (monitor_create_inferior), remote-nindy.c - (nindy_create_inferior), remote-st.c (st2000_create_inferior), - remote-vx.c (vx_create_inferior): Remove CREATE_INFERIOR_HOOK; it - is replaced by init_trace_fun. - * config/convex/xm-convex.h, convex-xdep.c: Add comments explaining - how to do without CREATE_INFERIOR_HOOK for whoever fixes the Convex - port. - - * Makefile.in: Add Mach files to ALLDEPFILES, etc. - * m3-nat.c: Clean up more hair--message(), cprocs. - * configure.in: Recognize Mach targets and hosts. - * config/ns32k/tm-umax.h: Add some #ifndef's so tm-ns32km3.h can - include this file. - * Mach headers in config/*/tm-*.h: Fix includes to match correct - locations of files. - -Thu Oct 14 21:35:55 1993 Rob Savoye (rob@darkstar.cygnus.com) - - * remote-mon.c (general_open): Set dev_name. Minor tweaking to get - it working again. - * config/m68k/tm-monitor.h: Remove floating point register names - as there aren't any on any of the monitors that use this code. - -Wed Oct 13 11:47:23 1993 Jim Kingdon (kingdon@lioth.cygnus.com) - - * inflow.c: Pass pointer to process group, not process group itself, - to TIOCSPGRP ioctl. - - * inflow.c (terminal_ours_1): Don't print warning on failure to - set process group. - - * printcmd.c (printf_command): Instead of using makeva* and - calling vprintf, just make the appropriate calls to printf. - * printcmd.c, config/pa/xm-pa.h, config/mips/xm-makeva.h, - config/alpha/xm-alpha.h, config/m88k/xm-m88k.h: Remove all - traces of makeva*. My apologies to everyone (including me!) - who spent so much time getting it to work on various machines, - but look at the bright side, at least you won't have to do it - again in the future. - - * printcmd.c (printf_command): Make a cleanup for val_args (fixes - a memory leak). - -Tue Oct 12 22:54:41 1993 Jim Kingdon (kingdon@lioth.cygnus.com) - - * config/mips/xm-mips.h: Remove comment about HAVE_SGTTY vs. usleep. - -Tue Oct 12 12:01:29 1993 david d `zoo' zuhn (zoo@rtl.cygnus.com) - - * configure.in: only configure gdbserver for native environments - -Tue Oct 12 08:59:15 1993 Jim Kingdon (kingdon@lioth.cygnus.com) - - * stabsread.c (read_type): Treat a negative type number at the start - of a type as a type reference, not as a definition of a type with - "50=" omitted. This makes things work on the RS/6000 again (the - 14 Sep 1993 change broke it). - - * inflow.c: Use 0 (standard input) not scb->fd. - (terminal_ours_1): If printing warning, don't claim it happened in - terminal_inferior. - - * blockframe.c (get_prev_frame_info): Don't error() if there are no - frames; just return NULL. - - * xcoffsolib.h, xcoffexec.c: Undo the part of Fred's bfd->abfd - change which involved structure elements. It was unnecessary and - was not consistently done. - - * stabsread.h, stabsread.c, dbxread.c (common_block*, copy_pending): - Move common block handling from dbxread.c to stabsread.c. - Use the name from the BCOMM instead of the ECOMM. - Allocate things on the symbol_obstack. - * xcoffread.c (process_xcoff_symbol): Process C_BCOMM, C_ECOMM, - and C_ECOML. On unrecognized storage classes, go ahead and call - define_symbol (after the complaint). - - * dbxread.c (process_one_symbol): Don't relocate 'S' symbols by - the text offset. - -Tue Oct 12 12:33:09 1993 Peter Schauer (pes@regent.e-technik.tu-muenchen.de) - - * osfsolib.c (solib_create_inferior_hook): Reset stop_soon_quietly - after shared library symbol reading to get rid of warning from - heuristic_proc_start. - -Tue Oct 12 12:01:29 1993 david d `zoo' zuhn (zoo@rtl.cygnus.com) - - * remote-sim.c: fix unterminated character string - -Tue Oct 12 08:59:15 1993 Jim Kingdon (kingdon@lioth.cygnus.com) - - * stabsread.c: Fix comment about gcc 2.3.3 stab for long long int. - -Mon Oct 11 14:27:25 1993 Jim Kingdon (kingdon@lioth.cygnus.com) - - * m3-nat.c, config/nm-m3.h: Add a target_ops struct and other - various things to try to get this to work. - - * symtab.h: Fix comments re headers, sharing blockvectors, etc. - -Mon Oct 11 11:46:06 1993 david d `zoo' zuhn (zoo@rtl.cygnus.com) - - * config/i960/vxworks960.mt (REMOTE_O): add dcache.o and remote-utils.o - -Mon Oct 11 02:48:57 1993 Peter Schauer (pes@regent.e-technik.tu-muenchen.de) - - * mipsread.c (parse_partial_symbols): Do not add undefined - symbols to the partial symbol table. - * alpha-tdep.c (init_extra_frame_info): Remove kludge for gcc, - gcc has to be compatible with the native tools. - * alpha-tdep.c (alpha_push_arguments): Rename NUM_ARG_REGS to - ALPHA_NUM_ARG_REGS and move its definition to tm-alpha.h. - * config/alpha/tm-alpha.h (FRAME_ARGS_ADDRESS): Change it to the - way the native tools define it, update comment. - -Fri Oct 8 15:54:06 1993 Fred Fish (fnf@deneb.cygnus.com) - - * osfsolib.c, remote-sim.c, remote.c, solib.c, xcoffexec.c, - xcoffsolib.h: Use 'abfd' for bfd variables instead of 'bfd'. - Sun cc doesn't like variable names that match their typedef'd type. - -Fri Oct 8 14:56:21 1993 Jim Kingdon (kingdon@lioth.cygnus.com) - - * inflow.c: Remove unused includes of sys/param.h and sys/types.h. - - * inflow.c, ser-unix.c, ser-go32.c, ser-tcp.c, serial.h, - terminal.h, fork-child.c, main.c, utils.c: Move all the process - group stuff back to inflow.c and terminal.h; that's a better place - for it and fixes problems with trying to get/set the process group - of a tty we're doing remote debugging on. - * terminal.h: Skip the redefines and includes if HAVE_TERMIOS. - - * findvar.c, value.h (symbol_read_needs_frame): New function. - * c-exp.y, m2-exp.y: Call it instead of having our own switch on - the symbol's class. - * valops.c (value_of_variable): Use symbol_read_needs_frame to - decide whether we care about finding a frame. - -Fri Oct 8 02:34:21 1993 Peter Schauer (pes@regent.e-technik.tu-muenchen.de) - - * blockframe.c (get_frame_block): Do not adjust pc if the frame - function was interrupted by a signal. - -Thu Oct 7 19:20:11 1993 Jim Kingdon (kingdon@lioth.cygnus.com) - - * config/h8300/tm-h8300.h: Don't define sr_get_debug. - * remote-sim.c: Include remote-utils.h. - * target.h: Add comment about target_has_execution. - -Thu Oct 7 16:14:19 1993 Steve Chamberlain (sac@phydeaux.cygnus.com) - - * h8300-tdep.c (sim_load, sim_kill, sim_open, sim_set_args): - New functions. - * infrun.c (normal_stop): Don't try and set the pc in the current - frame coredump if there isn't one. - * remote-sim.c (gdbsim_store_register): Don't - SWAP_TARGET_AND_HOST, sim_store_register takes bytes in raw order. - (gdbsim_wait): Set status with WSETSTOP. - * config/h8300/tm-h8300.h (sr_get_debug): Define - -Thu Oct 7 12:56:57 1993 Jim Kingdon (kingdon@lioth.cygnus.com) - - New Mach stuff: - * config/i386/i386mach.c: Explain this is for the old (probably - non-functional and/or obsolete) Mach stuff. - * m3-nat.c, config/nm-m3.h, - i386m3-nat.c, mipsm3-nat.c, ns32km3-nat.c, - config/i386/{i386m3.mh,i386m3.mt,tm-i386m3.h,xm-i386m3.h}, - config/i386/{i386mk.mh,i386mk.mt,tm-i386mk.h,xm-i386mk.h}, - config/mips/{mipsm3.mh,mipsm3.mt,tm-mipsm3.h,xm-mipsm3.h}, - config/ns32k/{ns32km3.mh,ns32km3.mt,tm-ns32km3.h,xm-ns32km3.h}: - New files. - - * blockframe.c (find_pc_partial_function): If we call - PSYMTAB_TO_SYMTAB, call target_terminal_ours_for_output first. - This is needed now that wait_for_inferior passes in endaddr. - * infrun.c: Move call to target_terminal_inferior from proceed - to resume. - -Thu Oct 7 09:22:04 1993 Stu Grossman (grossman at cygnus.com) - - * blockframe.c (find_pc_partial_function): Fix handling for PCs - beyond the end of the last function in an objfile. - * coff-solib.c (coff_solib_add): Use BFD to get fields from .lib - section. - * infrun.c (wait_for_inferior): Modify test for subroutine entry - to include pc out of bounds of the previous function. - * remote.c (remote_wait): Use strtoul for parsing 'N' message. - Add code to relocate symfile_objfile->sections. - -Thu Oct 7 06:22:43 1993 Jim Kingdon (kingdon@lioth.cygnus.com) - - * config/sparc/sun4os4.mh: Add comment saying why we don't use - -lresolv. - -Thu Oct 7 09:29:11 1993 Peter Schauer (pes@regent.e-technik.tu-muenchen.de) - - * breakpoint.c, breakpoint.h (breakpoint_init_inferior): New function - that clears the `inserted' flag for all breakpoints and deletes - any breakpoints which should go away between runs of programs. - * inflow.c (generic_mourn_inferior), infrun.c (init_wait_for_inferior), - remote-es.c (es1800_load), comments in exec.c and corelow.c: - Use it instead of mark_breakpoints_out. - * breakpoint.c (mark_breakpoints_out): Update comment, tm-rs6000.h - uses it in a completely different context. - * breakpoint.c (breakpoint_re_set_one): Add bp_call_dummy case. - -Thu Oct 7 09:29:11 1993 Peter Schauer (pes@regent.e-technik.tu-muenchen.de) - - * Makefile.in (REGEX, REGEX1): Always use our own version of - regex.c to be consistent across hosts. - * source.c (_initialize_source): Initialize regex to use grep - style syntax as an approximation to POSIX basic regex syntax. - -Wed Oct 6 12:43:47 1993 Jeffrey A Law (law@snake.cs.utah.edu) - Jim Kingdon (kingdon@lioth.cygnus.com) - - * hppa-tdep.c (frame_chain): Rework so that it correctly - handles boundaries where code with a frame pointer calls code - without a frame pointer. - (dig_fp_from_stack): New function. - -Wed Oct 6 12:43:47 1993 Jim Kingdon (kingdon@lioth.cygnus.com) - - * breakpoint.c (delete_breakpoint): Don't insert a disabled breakpoint. - - * README: Add Alpha notes from Schauer. - -Tue Oct 5 15:26:04 1993 Jim Kingdon (kingdon@lioth.cygnus.com) - - * Makefile.in (install, uninstall): Remove $$n.1 stuff; I don't - understand what it is trying to do, but I suspect it's not doing - it. - - * config/ns32k/merlin.mh: Add comment about M_INSTALL. - * config/m88k/{delta88.mh,delta88v4.mh}: Remove M_INSTALL and - M_UNINSTALL; it tries to install a non-existent file gdb.z. - * Makefile.in: Remove M_INSTALL stuff; the above were the only uses. - - * stabsread.c (read_range_type): Remove comment which recommends - distinguishing float from complex by the name. - -Tue Oct 5 12:17:40 1993 Peter Schauer (pes@regent.e-technik.tu-muenchen.de) - Jim Kingdon (kingdon@cygnus.com) - Stu Grossman (grossman@cygnus.com) - - Changes to support alpha OSF/1 in native mode. - * alpha-nat.c, alpha-tdep.c, config/alpha/alpha-osf1.mt, - config/alpha/nm-alpha.h, config/alpha/tm-alpha.h, osfsolib.c: - New files. - * Makefile.in: Add new files and dependencies. - * configure.in: Add alpha target. - * config/alpha/alpha-osf1.mh (NATDEPFILES): Add osfsolib.o - * config/alpha/alpha-osf1.mh (MH_CFLAGS): Remove, we can handle - shared libraries now. - * config/alpha/xm-alpha.h: Cleanup, get MAKEVA_* defines right. - - * defs.h (CORE_ADDR): Make its type overridable via CORE_ADDR_TYPE, - provide `unsigned int' default. - * breakpoint.c (breakpoint_auto_delete): Delete only if we really - stopped for the breakpoint. - * stabsread.c, stabsread.h (define_symbol): Change valu parameter - to a CORE_ADDR. - * stabsread.c (read_range_type): Handle the case where the lower - bound overflows and the upper doesn't and the range is legal. - * infrun.c (resume): Do not step a breakpoint instruction if - CANNOT_STEP_BREAKPOINT is defined. - - * inferior.h (CALL_DUMMY_LOCATION): New variant AT_ENTRY_POINT. - Now that we have the bp_call_dummy breakpoint the call dummy code - is no longer needed. PUSH_DUMMY_FRAME, PUSH_ARGUMENTS and - FIX_CALL_DUMMY can be used to set up everything for the dummy. - The breakpoint for the dummy is set at the entry point and thats it. - * blockframe.c (inside_entry_file, inside_entry_func): Do not stop - backtraces if pc is in the call dummy at the entry point. - * infcmd.c (run_stack_dummy): Handle AT_ENTRY_POINT case. Use - the expected breakpoint pc when setting up the frame for - set_momentary_breakpoint. - * symfile.c (entry_point_address): New function for AT_ENTRY_POINT - support. - * valops.c (call_function_by_hand): Handle AT_ENTRY_POINT case. - -Tue Oct 5 11:37:02 1993 Jim Kingdon (kingdon@lioth.cygnus.com) - - * configure.in: Recognize hppa*-*-hiux* (currently synonym for hpux). - Change other hppa host entries to use -*- not -hp-. - -Mon Oct 4 19:16:14 1993 Ian Lance Taylor (ian@tweedledumb.cygnus.com) - - * i386-nlmstub.c: New file; debugging stub for i386 NetWare. Must - be compiled with NetWare header files and turned into an NLM with - nlmconv. - -Mon Oct 4 11:02:11 1993 Jim Kingdon (kingdon@lioth.cygnus.com) - - * minsyms.c (lookup_minimal_symbol_by_pc): Don't use mst_abs symbols. - - * dbxread.c (process_one_symbol): Make n_opt_found static. - - * Rename i386lynx-tdep.c to i386ly-tdep.c for 14 character file names. - * Makefile.in, config/i386/i386lynx.mt: Change accordingly. - - * values.c (record_latest_value): Fetch lazy values and set VALUE_LVAL - to not_lval. - -Sun Oct 3 15:54:51 1993 Stan Shebs (shebs@rtl.cygnus.com) - - * objfiles.h (objfile): New slot sym_stab_info, use by most - stab-reading formats. - * gdb-stabs.h (DBX_SYMFILE_INFO): Access sym_stab_info instead of - sym_private. - * coffread.c (coff_symfile_init): Alloc struct for sym_stab_info. - * dbxread.c, elfread.c, paread.c: Change sym_private references to - sym_stab_info references. - -Sat Oct 2 19:28:35 1993 Jim Kingdon (kingdon@lioth.cygnus.com) - - * mipsread.c, objfiles.c, utils.c: Use PTR not void *. RISC/OS - 4.02 lacks void *. - * elfread.c: Use void * not PTR inside PARAMS. - - * config/mips/news-mips.mh: Remove coredep.o; mips-nat.o does it. - * config/mips/news-mips.mh: Define NAT_FILE not NM_FILE. - * config/mips/nm-news-mips.h: Include mips/nm-mips.h not nm-mips.h. - -Sat Oct 2 16:05:22 1993 Stu Grossman (grossman at cygnus.com) - - * Makefile.in, coff-solib.c, coff-solib.h, i386lynx.mt, - tm-i386lynx.h: Add support for SVR3 COFF shared libraries. - -Sat Oct 2 15:50:41 1993 Jim Kingdon (kingdon@lioth.cygnus.com) - - * m88k-nat.c (store_inferior_registers): When writing all registers, - don't try to write EXIP_REGNUM or ENIP_REGNUM (not needed for this - case, and they cause trouble). - - * TODO: Don't suggest doing fast watchpoints by stepping a line - at a time. That would be really hairy and still not fast enough. - Do suggest debug registers and page table diddling. - -Fri Oct 1 14:54:46 1993 Jim Kingdon (kingdon@lioth.cygnus.com) - - * printcmd.c (do_examine): Make meaning of 'h', 'w', and 'g' not - depend on builtin_type_*. Instead, it is always 2, 4, and 8 bytes - like the documentation says. - * printcmd.c (decode_format) [CC_HAS_LONG_LONG]: Remove 'l' as - synonym for 'g'. This was never documented, it shouldn't depend on - CC_HAS_LONG_LONG, and I don't see what's wrong with 'g'. - -Fri Oct 1 10:06:35 1993 Kung Hsu (kung@cirdan.cygnus.com) - - * symtab.c: fix a bug in testsuite (virtfunc.exp) - -Thu Sep 30 11:30:56 1993 Jim Kingdon (kingdon@lioth.cygnus.com) - - * m88k-nat.c (fill_gregset): Fix typo (R_SFIP -> R_FIP). - - * c-typeprint.c (c_type_print_base, TYPE_FN_FIELD_STUB code): - If demangled name lacks a colon, don't dump core. - - * blockframe.c (find_pc_partial_function): If pst->readin is - set, don't try to get symbols from pst. - - * inflow.c (generic_mourn_inferior): Call reinit_frame_cache - instead of doing it ourself. - * blockframe.c (reinit_frame_cache): Use code which was in - generic_mourn_inferior so we can use this function even when - we have switched targets. - * corelow.c (core_detach): Call reinit_frame_cache. - * target.c (target_detach): Don't call generic_mourn_inferior - (revert yesterday's change, now handled by core_detach). - * objfiles.c (free_objfile): Detach any core file if we call - SOLIB_CLEAR. #include target.h. - - * fork-child.c (fork_inferior): Don't call target_terminal_init - and target_terminal_inferior until we are sure that the inferior - has called gdb_setpgid. This fixes PR 2900 (Schauer tracked it - down and was able to reliably reproduce it by putting a sleep() - before the gdb_setpgid()). - -Thu Sep 30 12:00:49 1993 Peter Schauer (pes@regent.e-technik.tu-muenchen.de) - - * c-exp.y, m2-exp.y: Change type of address for msymbol to - builtin_type_long. - * infptrace.c (fetch_register, store_inferior_register, - child_xfer_memory): Use PTRACE_XFER_TYPE for the type of ptrace - transfers. Provide an `int' default for PTRACE_XFER_TYPE. - -Thu Sep 30 11:30:56 1993 Jim Kingdon (kingdon@lioth.cygnus.com) - - * defs.h (TARGET_*_BIT): Don't use host information (sizeof) in - picking defaults. - - * cp-valprint.c (cp_is_vtbl_ptr_type): Continue to accept old form. - -Thu Sep 30 11:25:55 1993 Kung Hsu (kung@cygnus.com) - - * cp-valprint.c (cp_is_vtbl_ptr_type): - change vtable field name to __vtbl (pr2695). - - * symtab.c (gdb_mangle_name): fix a bug, to get mangled name right. - -Wed Sep 29 18:34:22 1993 Stu Grossman (grossman at cygnus.com) - - * Makefile.in: Add deps for i386lynx-nat.o and i386lynx-tdep.o to - keep non-gnu makes happy. - -Wed Sep 29 17:20:54 1993 Jeff Law (law@snake.cs.utah.edu) - - * hpread.c (read_hpux_symtab): When a K_END is found for a - K_MODULE, clear the have_module and have_name flags. - -Wed Sep 29 10:52:19 1993 Kung Hsu (kung@cygnus.com) - - * c-valprint.c: to fix virtual table print bug (pr2695). - -Wed Sep 29 10:52:19 1993 Jim Kingdon (kingdon@lioth.cygnus.com) - - * target.c (target_detach): Call generic_mourn_inferior. - * inflow.c (generic_mourn_inferior): Call flush_cached_frames. - -Tue Sep 28 23:08:59 1993 Jim Kingdon (kingdon@lioth.cygnus.com) - - * dbxread.c, coffread.c, elfread.c: A few changes to comments. - -Tue Sep 28 18:39:37 1993 Stan Shebs (shebs@rtl.cygnus.com) - - * configure.in: Rename ...-lynx* to ...-lynxos*. - Add m68*-*-lynxos* configuration. - * dbxread.c (coffstab_build_psymtabs): New function, - interfaces coffread.c to dbxread functions. - * coffread.c (coff_symfile_info): Expand to include - dbx_symfile_info slots. - (coff_symfile_init): Init coff_symfile_info struct. - (coff_locate_sections): New functions, finds the stab and stabstr - sections. - (coff_symfile_read): Call coffstab_build_psymtabs if a stab - section is present. - (coff_section_offsets): Replace fake version with real offsets. - -Tue Sep 28 18:00:50 1993 Jim Kingdon (kingdon@lioth.cygnus.com) - - * infcmd.c (run_stack_dummy): Set the frame in the bp_call_dummy - breakpoint. - -Tue Sep 28 17:53:26 1993 Ian Lance Taylor (ian@tweedledumb.cygnus.com) - - * config/nm-sysv4.h: Include solib.h. Define SVR4_SHARED_LIBS. - * config/tm-sysv4.h: Don't include solib.h. - * config/xm-sysv4.h: Don't define SVR4_SHARED_LIBS. - * config/i386/i386v4.mt (TDEPFILES): Move solib.o from here... - * config/i386/i386v4.mh (NATDEPFILES): ...to here. - * config/i386/nm-i386v4.h: Include nm-sysv4.h. - * config/m68k/amix.mt (TDEPFILES): Move solib.o from here... - * config/m68k/amix.mh (NATDEPFILES): ...to here. - -Tue Sep 28 09:45:38 1993 Peter Schauer (pes@regent.e-technik.tu-muenchen.de) - - * symmisc.c (print_symbol): Use %02x not %2x for LOC_CONST_BYTES. - - Clean up problems with targets and hosts that have 64 bit longs - and pointers and 32 bit ints. - * breakpoint.c, buildsym.c, c-lang.c, c-valprint.c, ch-lang.c, - ch-valprint.c, core.c, cp-valprint.c, dbxread.c, exec.c, - expprint.c, gdbtypes.c, infcmd.c, language.c, language.h, - m2-lang.c, maint.c, mips-tdep.c, mipsread.c, partial-stab.h, - printcmd.c, remote-vx.c, solib.c, source.c, stack.c, symfile.c, - symmisc.c, symtab.c, valops.c, valprint.c, xcoffexec.c: - Change all printf formats from %x to %lx if outputting an address. - Change la_*_format to use long format. - local_hex_string, local_hex_string_custom now take an unsigned long - argument, change all callers. - * coffread.c (read_coff_symtab): Remove superfluous cast for - complaint output. - * dbxread.c (end_psymtab): Cast MSYMBOL_INFO to long, not int. - * findvar.c, value.h (write_register): Change val to LONGEST. - * gdbtypes.h (struct type): Change `bitsize' to long as - TYPE_FIELD_STATIC_PHYSNAME uses this field as a pointer. - * inferior.h (struct inferior_status): Change type of stop_pc to - CORE_ADDR. - * language.h (local_octal_string, local_octal_string_custom): - Remove prototype, the functions are neither defined nor used. - * mipsread.c (parse_symbol): Use temporary variable for bitsize as - f->bitsize is a long now. - * objfiles.c (add_to_objfile_sections, build_objfile_section_table): - Use unsigned long casts instead of int for abusing sections_end - pointer as integer. - * stack.c (parse_frame_specification): Change type of `args' to - CORE_ADDR for SETUP_ARBITRARY_FRAME. - - * printcmd.c (make_vasize): Allow redefinition via MAKEVA_SIZE. - * mipsread.c (parse_type): Alpha cc now supports the t->continued - bit, update algorithm to match the way the compiler uses it. - -Tue Sep 28 12:05:11 1993 Jim Kingdon (kingdon@lioth.cygnus.com) - - * utils.c (fprintfi_filtered): Fix comments. - -Mon Sep 27 18:10:08 1993 Stu Grossman (grossman at cygnus.com) - - * coffread.c (read_coff_symtab): Don't call getfilename if there - are no auxents. - -Mon Sep 27 10:22:37 1993 Jim Kingdon (kingdon@lioth.cygnus.com) - - * symtab.c (find_pc_line): Fix comments. - - * remote-udi.c (udi_mourn): Don't pop target. - -Fri Sep 24 17:25:41 1993 Stu Grossman (grossman at cygnus.com) - - * corelow.c: Add multi thread/process support for core files with - .reg/XXX pseudo-sections. - * i386lynx-nat.c thread.h thread.c: Remove unnecessary core file - support. - -Thu Sep 23 10:49:37 1993 Jim Kingdon (kingdon@lioth.cygnus.com) - - * remote-udi.c (download): Skip zero length sections. - - * valops.c (search_struct_method, value_struct_elt): - Use (value)-1, not -1, for error. - - * infcmd.c (step_1), infrun.c (wait_for_inferior): Add comments - about SHIFT_INST_REGS. - - * exec.c (exec_file_command): Set text_end based on all code readonly - sections, not just ".text". - - * defs.h, infcmd.c, config/z8k/tm-z8k.h, config/m88k/tm-m88k.h, - config/sh/tm-sh.h, config/h8300/tm-h8300.h, config/h8500/tm-h8500.h, - z8k-tdep.c: Remove all references to ADDR_BITS_SET. - * config/m88k/tm-m88k.h: Define TARGET_WRITE_PC. - - * config/m88k/tm-m88k.h, m88k-tdep.c: Add call function stuff. - -Thu Sep 23 00:13:06 1993 Peter Schauer (pes@regent.e-technik.tu-muenchen.de) - - * config/mips/tm-mips.h (STORE_STRUCT_RETURN): Define as noop as - the pushing of the struct return address is already handled in - mips_push_arguments. - * mips-tdep.c (reinit_frame_cache_sfunc): Fix typo in prototype - declaration. - * mipsread.c (parse_symbol, parse_type, upgrade_type): Add more - sanity checks for corrupt symbol entries to avoid core dumps - reported by benson@odi.com. Obviously Ultrix 4.3A cc now has - the same problems as the OSF/1 alpha cc. - * mipsread.c (parse_lines): Iterate over the range of the compressed - line number entries, the old iteration sometimes failed to stop - and wrote past the end of the LINETABLE. Add sanity check to avoid - the same problem in case the line number info is corrupt. - * mipsread.c (parse_procedure): Adjust pdr for alpha __sigtramp. - * mipsread.c (parse_external, parse_partial_symbols): Ignore stNil - symbols that are produced for statics in .o files and stLocal symbols - that are produced for every section in OSF/1 dynamically linked - executables. - * mipsread.c (psymtab_to_symtab_1): Put out `undefined symbols' - warning only under `verbose on' as there are many undefined symbols - in a dynamically linked executable. - -Wed Sep 22 10:28:06 1993 Jim Kingdon (kingdon@lioth.cygnus.com) - - * config/i960/nindy960.mt: Don't define REMOTE_O; REMOTE_O was - intended only for VxWorks. Remove dcache.o from TDEPFILES now - that we pick it up from the default REMOTE_O. - - * breakpoint.c (bpstat_what): Initialize retval.call_dummy and - retval.step_resume. - - * mips-tdep.c (mips_frame_chain): If frame size zero, return zero. - * rs6000-tdep.c: Add comment about framelessness. - - * remote-nindy.c: Declare ninMemGet and ninMemPut. - -Wed Sep 22 08:02:57 1993 Stu Grossman (grossman at cygnus.com) - - * Makefile.in: Add i386lynx-tdep to the right places. - (TARDIRS): Add gdbserver. - - * exec.c (print_section_info): Print entry point. - * i386lynx-nat.c (i386lynx_saved_pc_after_call): Move into - i386lynx-tdep.c. Add core file support. - * i386lynx-tdep.c: New module for Lynx/386 target dependant code. - * maint.c: Add `maint info sections' command to print info about all - sections that BFD knows about for exec and core files. - * sparc-tdep.c (sparc_push_dummy_frame): Update stack pointer - before putting frame on the stack. Consolidate writes to reduce - traffic for remote debugging. - * config/i386/i386lynx.mh (NATDEPFILES): Remove exec.o. - * config/i386/i386lynx.mt (TDEPFILES): Add exec.o, i386lynx-tdep.o. - * config/i386/nm-i386lynx.h: Add target_pid_to_str(). - * config/i386/tm-i386lynx.h: Remove target_pid_to_str(). - * sparclite/Makefile.in: Add deps to keep Sun make happy. - -Tue Sep 21 17:48:14 1993 Jim Kingdon (kingdon@lioth.cygnus.com) - - * breakpoint.h, breakpoint.c (bpstat_stop_status): Add new argument - not_a_breakpoint. - * infrun.c (wait_for_inferior): Pass it. Also consolidate the - test of whether we are stepping into a CURRENTLY_STEPPING macro. - -Tue Sep 21 17:22:34 1993 K. Richard Pixley (rich@sendai.cygnus.com) - - * breakpoint.c (bpstat_stop_status), - infcmd.c (step_1), - infrun.c (wait_for_inferior): collapse SHIFT_INST_REGS ifdef - and insert macro. - - * m88k-tdep.c: include ieee-float.h. new global target_is_m88110. - new const struct ext_format_m88110 for float format. - (pic_prologue_code): add braces. - (next_insn): remove unused variable buf. - (frame_find_saved_regs): remove unused variables next_addr, - saved_regs, regnum. - (frame_locals_address): remove unused variables frame, ap. - (frame_args_address): remove unused variables frame, ap. - (push_parameters): add some breaks and a default case. - - * remote-bug.c: remove redundant includes of value.h, target.h, - serial.h. - (bug_open): corrected typo, sr_multi_scan -> gr_multi_scan. - (bug_fetch_register): special case sfip register for m88110. - remove flag bit masking of pc registers. This should be handled - by the ADDR_BITS_* macros. - (bug_store_register): special case sfip register for m88110. - Corrected sprint format for extended registers. - - * config/m88k/tm-m88k.h: white space and comment changes. include - ieee-float.h. expanded to cope with m88110 extended registers. - (R0_REGNUM, XFP_REGNUM, X0_REGNUM): new macros. - (SHIFT_INST_REGS): becomes a real macro. - -Tue Sep 21 17:48:14 1993 Jim Kingdon (kingdon@lioth.cygnus.com) - - * breakpoint.c (breakpoint_1): Support bp_call_dummy. - -Tue Sep 21 17:06:19 1993 Ian Lance Taylor (ian@tweedledumb.cygnus.com) - - * elfread.c (record_minimal_symbol_and_info): Guess the section to - use from the type. - * objfiles.c: Include gdb-stabs.h for SECT_* macros. - (objfile_relocate): Relocate textlow and texthigh in psymtabs. - Relocate partial symbols. Check that minimal SYMBOL_SECTION is - nonnegative before using it. - * symtab.h: Adjust section field comment. - - * remote.c (interrupt_query): New function. - (remote_interrupt_twice): Call interrupt_query. - (putpkt, getpkt): If quit_flag is set, call interrupt_query. - (remote_wait): Don't bother with objfile_relocate if the addresses - haven't changed. - (remote_fetch_registers): If we see a packet that doesn't start - with a hex character, fetch a new one. - -Tue Sep 21 11:44:00 1993 Jim Kingdon (kingdon@lioth.cygnus.com) - - * remote.c, remote-utils.c: Use SERIAL_FLUSH_INPUT after opening it. - - * printcmd.c (print_scalar_formatted): When truncating value we are - going to print as unsigned, handle it generally for any length - less than sizeof (LONGEST), rather than special-casing sizeof (char), - sizeof (short), and sizeof (long). Clarify comment on what this - is for. - - * symfile.c (deduce_language_from_filename): Accept .cxx for C++. - * buildsym.c (start_subfile): Use deduce_language_from_filename - rather than checking for .C or .cc ourself. - -Mon Sep 20 14:53:11 1993 Jim Kingdon (kingdon@lioth.cygnus.com) - - * defs.h: Declare argument of re_comp as const char *. - - * remote.c, remote-mips.c: Use sr_get_debug not remote_debug. - - * README: Say using bfd from another release doesn't generally work. - -Sat Sep 18 10:13:18 1993 Jim Kingdon (kingdon@poseidon.cygnus.com) - - * mipsread.c (parse_type): Don't complain() if we guessed struct - and it was a union, or vice versa. - - * defs.h (make_cleanup): Change PTR to void * when inside PARAMS. - - Some of the following is in #ifdef CALL_DUMMY_BREAKPOINT_OFFSET. - * breakpoint.h (enum bptype): Add bp_call_dummy. - (struct bpstat_what): Add call_dummy field. - * infrun.c (wait_for_inferior): Deal with it. - * breakpoint.c (bpstat_what): Deal with call dummy breakpoint. - * infcmd.c (run_stack_dummy): Set the call dummy breakpoint. - * config/sparc/tm-sparc.h: Define CALL_DUMMY_BREAKPOINT_OFFSET. - - * remote-sim.h: New file. - * remote-sim.c: Add remote debug feature. Rename stuff to distinguish - interface to simulator from gdb-specific stuff. Other changes. - * remote-sp64sim.c: Renamed to remote-sim.c. - Use sr_get_debug instead of our own sim_verbose/simif_snoop. - Use gnutarget in call to bfd_openr. - Rename simif_* to gdbsim_*. - * config/sparc/sp64sim.mt: Change remote-sp64sim.c to remote-sim.c. - -Fri Sep 17 04:41:17 1993 Peter Schauer (pes@regent.e-technik.tu-muenchen.de) - - * findvar.c (extract_signed_integer): Cast *p to LONGEST before doing - the xor and subtract. Otherwise it will not sign extend if the type - of LONGEST is larger than int. - * cp-valprint.c (cp_print_class_method): Inhibit core dump if - domain is an undefined cross reference. - * valops.c (call_function_by_hand): Set real_pc to correct - value if CALL_DUMMY_LOCATION != ON_STACK. - -Thu Sep 16 20:37:06 1993 Jim Kingdon (kingdon@cirdan.cygnus.com) - - * config/a29k/tm-a29k.h (FRAME_CHAIN): If rsize is zero, return zero. - -Thu Sep 16 13:16:22 1993 Stu Grossman (grossman at cygnus.com) - - * infrun.c (wait_for_inferior): Allow user to single step within - a stack dummy. - -Thu Sep 16 12:34:01 1993 Jim Kingdon (kingdon@cirdan.cygnus.com) - - * dbxread.c (copy_pending): Deal with END NULL. - (process_one_symbol): Add comments about what common_block NULL means. - -Wed Sep 15 14:50:26 1993 Jim Kingdon (kingdon@cirdan.cygnus.com) - - * remote-udi.c, remote-adapt.c, remote-mm.c: Move processor_type - to tm-a29k.h and a29k-tdep.c and make it an enum. - * a29k-tdep.c (a29k_get_processor_type): New function. Fix many - aspects of how we detected the processor type. - * remote-udi.c, remote-adapt.c, remote-mm.c (*_open): Call it - rather than figuring out the type ourselves. - -Thu Sep 16 12:12:59 1993 Stu Grossman (grossman at cygnus.com) - - * sparc-stub.c (_trap_low): Do restore/save sequence after - setting sp to ensure that we load the previous window from the - right place on the stack. - -Thu Sep 16 00:36:32 1993 Peter Schauer (pes@regent.e-technik.tu-muenchen.de) - - * mipsread.c: Many changes for alpha ecoff format: - Correct sizeof(int) == sizeof(long) assumptions. - Replace stParsed hack by putting the parsed types on the pending chain. - Replace mips specific ecoff mapping by ECOFF_REG_TO_REGNUM macro, - provide default for cross debugging. - Swapping the symbol back is no longer needed as the symbol is not - modified anymore. - Add new alpha basic types, handle btTypedef, handle stStaticProc - external symbols . - Update and clean up cross_ref for alpha cc cross ref variations. - Allocate types on the type_obstack to inhibit storage leaks. - * config/mips/tm-mips.h (ECOFF_REG_TO_REGNUM): Define. - * gdbtypes.c (recursive_dump_type): Dump TYPE_TAG_NAME if it is set. - -Tue Sep 14 09:12:17 1993 Jim Kingdon (kingdon@cirdan.cygnus.com) - - * stabsread.c (read_type): Process "s" (size) type attribute. - If type is defined to another type, copy the type. - -Tue Sep 14 18:37:17 1993 Ian Lance Taylor (ian@tweedledumb.cygnus.com) - - * config/i386/i386v4.mh (NATDEPFILES): Move exec.o from here... - * config/i386/i386v4.mt (TDEPFILES): ...to here. - -Tue Sep 14 12:21:49 1993 K. Richard Pixley (rich@sendai.cygnus.com) - - * Makefile.in (remote_utils_h): add serial.h and target.h. - (main.o, remote-es.o, remote-nindy.o, remote.o): remove target.h - (already in remote_utils_h). - (remote-utils.o): new rule. - - * remote-utils.h: include serial.h. - - * serial.h: ifdef protect from multiple inclusion. - - * remote.c, remote-nindy.c, remote-mon.c, remote-es.c: include - remote-utils.h. - - * remote.c (remote_open), remote-nindy.c (nindy_open, - nindy_files_info), remote-mon.c (general_open), remote-es.c - (es1800_open): use remote-utils facilities for baud rate. - -Tue Sep 14 09:12:17 1993 Jim Kingdon (kingdon@cirdan.cygnus.com) - - * paread.c, coffread.c, elfread.c, dwarfread.c: - Include <time.h> and <sys/types.h> before libbfd.h. - - * paread.c: Define BYTES_IN_WORD before including aout/aout64.h. - - * Makefile.in (a29k-tdep.o): Depend on $(defs_h). - * config/a29k/tm-a29k.h (SAVED_PC_AFTER_CALL): Use gr122 not lr0 - if this is a transparent procedure. - -Mon Sep 13 16:06:43 1993 Jim Kingdon (kingdon@cirdan.cygnus.com) - - * remote.c: Define remote_debug to 0 and #if 0 baud_rate. Temporary - hack so this file compiles again. - - * remote-utils.c (gr_multi_scan): Cast return value from alloca. - (gr_multi_scan): #if 0 never-reached return(-1). - - * remote-udi.c (udi_wait): Return inferior_pid not 0. - -Mon Sep 13 14:14:35 1993 K. Richard Pixley (rich@sendai.cygnus.com) - - Collect some remote things into remote-utils. - * remote-utils.[ch]: new files of functions collected from several - different remote targets. - * Makefile.in (REMOTE_O): add remote-utils.o. - (dcache_h, remote_utils_h): new macros. - (HFILES): add $(remote_utils_h). - (ALLDEPFILES): add $(remote_utils_h). - (dcache.o): new rule. - (main.o, remote-bug.o): also depend on $(remote_utils_h). - * target.h (remote_debug): extern moved to remote-utils.h. - * target.c (find_default_run_target, find_core_target): initialize - runable. - (remote_debug): moved to remote-utils.c. - (_initialize_targets): move declaration of user variable - remotedebug to remote-utils.c. - * remote-bug.c: include remote-utils.h rather than dcache.h. - (bug_close, bug_write, bug_write_cr, desc, bug_dcache, timeout, - dev_name, check_open, is_open, readchar, readchar_nofail, - pollchar, expect, expect_prompt, get_hex_digit, get_hex_byte, - get_hex_word, bug_kill, bug_detach, bug_create_inferior, - multi-scan, bug_prepare_to_store, bug_fetch_word, - bug_store_word, bug_files_info, bug_mourn, bug_com, bug_device, - bug_speed): removed and replaced with facilities from - remote-utils.[ch]. - (bug_read_inferior_memory): renamed to bug_read_memory. - (bug_write_inferior_memory): renamed to bug_write_memory. - (bug_xfer_inferior_memory): renamed to bug_xfer_memory. - (get_word): comment out this unused function for now. - (bug_settings, cpu_check_strings): new statics. - (bug_open): rewritten to use gr_open. - (_initialize_remote_bug): remove declarations of commands bug, - device, speed. - * main.c: include remote-utils.h. - (baud_rate): removed to remote-utils.c. - (main): handle baud rate settings using new facilities from - remote-utils. - * defs.h (baud_rate): removed extern. - - m88110 support via bug-197 monitor. - * remote-bug.c (get_reg_name, bug_fetch_register, - bug_store_register): added m88110 extended register support. - (wait_strings): added bug-197 prompt. - (bug_wait): cope with bug-197 prompt. - (start_load): cope with either bug-197 or bug-187 prompt. - -Mon Sep 13 12:53:09 1993 Jim Kingdon (kingdon@cirdan.cygnus.com) - - * inferior.h, infrun.c, thread.c, infcmd.c: Remove all uses of - pc_changed. If it was ever set to a non-zero value, it was before - GDB 2.8. It doesn't seem to have any useful function. - - * defs.h: Don't define NORETURN (see comment). - -Sat Sep 11 10:46:09 1993 Jim Kingdon (kingdon@poseidon.cygnus.com) - - * m88k-nat.c (fill_gregset): Set r31 and sfip. - -Thu Sep 9 10:18:29 1993 Jim Kingdon (kingdon@lioth.cygnus.com) - - * remote-udi.c (udi_wait, case UDIStdinNeeded): Use a loop calling - getchar() (terminated only on '\n') instead of scanf. Send the - '\n' which terminates it to the remote system. - - More gcc lint: - * exec.c (ignore): Return 0. - * stack.c (return_command): Fetch lazy value directly, not via - VALUE_CONTENTS, to avoid "value computed is not used". - * inflow.c (new_tty): Move osigttou inside #if. - - * remote.c (remote_fetch_registers): If remote reply is short, just - note that fact and keep going (reading extra registers as all bits 0). - (remote_store_registers): Send number of registers that were found - by remote_fetch_registers. - * m68k-tdep.c, config/m68k/tm-m68k.h, config/m68k/tm-*.h: Remove - HAVE_68881. Define CANNOT_STORE_REGISTER if ptrace() can't write - floating registers. - * config/m68k/{tm-m68k-nofp.h,m68k-nofp.mt,tm-m68k-fp.h,m68k-fp.mt}: - Remove, replaced by {tm-m68k-em.h,m68k-em.mt}. - * Makefile.in, configure.in: Change accordingly. - -Thu Sep 9 04:59:03 1993 Peter Schauer (pes@regent.e-technik.tu-muenchen.de) - - * mipsread.c (cross_ref): Allow SGI extended symbol types as cross - reference targets. - * symmisc.c (print_symbol): Use TYPE_TAG_NAME not TYPE_NAME to avoid - printing of identities. - -Wed Sep 8 19:18:27 1993 Jim Kingdon (kingdon@lioth.cygnus.com) - - * breakpoint.c (breakpoint_1): Deal with step resume breakpoint. - -Wed Sep 8 13:01:10 1993 K. Richard Pixley (rich@cygnus.com) - - Gcc lint. - * config/m88k/tm-m88k.h (frame_find_saved_regs): prototype. - * config/h8300/tm-h8300.h (NUM_REGS): rewrite to avoid nested comment. - * blockframe.c (get_prev_frame_info): initialize address. - * breakpoint.c (bpstat_copy): initialize retval. - (bpstat_stop_status): initialize value_is_zero. - (bpstat_what): initialize bs_class. - (breakpoint_1, mention): add do-nothing case for bp_step_resume. - (break_command_1): initialize cond_end, addr_end, & - canonical_strings_chain. - (enable_breakpoint): initialize save_selected_frame. - * buildsym.c (end_symtab): initialize symtab & linetablesize. - * c-exp.y (parse_number): initialize i. - * c-typeprint.c (c_type_print_varspec_prefix): include - TYPE_CODE_BITSTRING in switch statements and do nothing. - * c-valprint.c (c_val_print): removed unused variable c. - * ch-valprint.c (chill_val_print): removed unused variable eltlen. - * cp-valprint.c (cp_print_class_method): initialize f & j. - * eval.c (evaluate_subexp): initialize pc2, arg1, arg2. - * expprint.c (print_subexp): initialize myprec, assoc, & tempstr. - * findvar.c (value_from_register): initialize first_addr. - * gdbtypes.c (lookup_struct_elt_type): localize use of temporary - variable typename. - * infcmd.c (run_stack_dummy): return zero rather than simple - return. - * infrun.c (wait_for_inferior): initialize stop_sp, prologue_pc. - remove symtab, appears unused. - (restore_selected_frame): return 1. - * mipsread.c (psymtab_to_symtab_1): initialize first_off. - (fixup_sigtramp): initialize b0. - * printcmd.c (do_examine): initialize val_type. - (print_frame_args): initialize b. - * ser-tcp.c (tcp_restore): comment out declaration. Appears - unused. - * ser-unix.c (hardwire_restore): comment out declaration. Appears - unused. - (hardwire_send_break): moved variable status into ifdef - HAVE_SGTTY. - (wait_for): moved variable numfds into ifdef HAVE_SGTTY. - * serial.h: comment change only. - * stabsread.c (rs6000_builtin_type): initialize rettype. - (read_range_type): initialize nbits. - * stack.c (print_frame_info): remove unused variable numargs. - (parse_frame_specification): remove unused variables arg1, arg2, - arg3. - (return_command): initialize return_value. - * symfile.c (cashier_psymtab): initialize pprev. - * symtab.c (find_pc_psymbol): initialize best. - (lookup_symbol): initialize s. - (make_symbol_completion_list): initialize quote_pos. - * thread.c: include command.h. - (thread_info): static declaration removed; unused. - (info_threads_command): fix == vs = typo. - * typeprint.c (whatis_exp): initialize old_chain. - * valprint.c (val_print_string): remove unused variable - first_addr_err. Initialize old_chain. - (_initialize_valprint): white space comment change. - * values.c (show_values): rewrite if statement to avoid empty - body. - (vb_match): remove unused variable fieldtype_target_type. - -Wed Sep 8 10:21:33 1993 Jim Kingdon (kingdon@lioth.cygnus.com) - - * Makefile.in (mipsread.o): Depend on $(bfd_h). - -Tue Sep 7 13:06:44 1993 Jim Kingdon (kingdon@lioth.cygnus.com) - - * gdbserver/Makefile.in (TAGS): config files are in - $(srcdir)/../config, not $(srcdir)/config. - - * config/pa/tm-hppa.h: Declare target_read_pc and target_write_pc. - (STORE_RETURN_VALUE): Pass the correct offset of the return - register to write_register_bytes. - * hppa-tdep.c: Use target_write_pc if PCOQ_TAIL_REGNUM was not saved. - -Tue Sep 7 14:30:34 1993 Ian Lance Taylor (ian@tweedledumb.cygnus.com) - - * remote.c (remote_wait): Don't call error. Instead, call warning - inside a loop. User can ^C to get out. - - * config/m68k/tm-m68k.h (FIX_CALL_DUMMY): Changed name of swapping - routine to match BFD name change. - * config/z8k/tm-z8k.h (FIX_CALL_DUMMY): Likewise. - -Mon Sep 6 15:01:57 1993 Jeffrey Wheat (cassidy@cygnus.com) - - * elfread.c: change elf32_symbol_type to elf_symbol_type - -Mon Sep 6 15:43:25 1993 Ian Lance Taylor (ian@tweedledumb.cygnus.com) - - * remote.c (remote_wait): Added 'W' and 'N' responses. - -Fri Sep 3 08:57:10 1993 Jim Kingdon (kingdon@lioth.cygnus.com) - - * main.c, utils.c: Add comments about immediate_quit. - - * elfread.c (elf_symtab_read): Don't add symbols starting with ".L" - to minimal symbols. - - * target.c (pop_target): Don't try to deal with the stack becoming - empty. Shouldn't happen and the code that tried was broken. - - * dcache.c: Cast return value from xmalloc. - - * remote.c: Move setting of immediate_quit from remote_open to - remote_start_dummy and set it back to zero when done. - -Thu Sep 2 00:07:36 1993 Jim Kingdon (kingdon@lioth.cygnus.com) - - * m88k-tdep.c: Remove a bunch of unused #includes. - - * language.h: Add comment about current_language. - - * mips-tdep.c (_initialize_mips_tdep): Change heuristic-fence-post - from var_uinteger to var_zinteger. - - * configure.in: Fix typo (delta88r4 -> delta88v4). - - * config/m88k/xm-delta88.h: Don't include sys/siginfo.h. It was - to make this work on SVR4 before SVR4 had its own configuration, - and it breaks SVR3. - - * config/m88k/tm-delta88v4.h: Define FRAME_CHAIN_VALID_ALTERNATE. - - * config/m88k/delta88v4.h (NATDEPFILES): Remove infptrace.o inftarg.o. - - * config/m88k/xm-dgux.h: Renamed from config/m88k/xm-m88k.h. - * config/m88k/m88k.mh: Use xm-dgux.h. - * config/m88k/xm-m88k.h: New file, with HOST_BYTE_ORDER, - MAKEVA_END and MAKEVA_ARG. - * config/m88k/xm-*.h: Include m88k/xm-m88k.h. - * printcmd.c: Remove __INT_VARARGS_H code; now in xm-m88k.h. - -Wed Sep 1 19:31:28 1993 Jim Kingdon (kingdon@lioth.cygnus.com) - - * remote-udi.c (udi_wait): Call `warning' not `error'. - - * symtab.c (COMPLETION_LIST_ADD_SYMBOL): If the symbol has a - demangling, don't put the mangled form in the completion list. - - * symtab.c, symfile.c, c-exp.y, ch-exp.y, m2-exp.y, buildsym.c, - symfile.h, stabsread.c, minsyms.c, solib.c, nlmread.c, dwarfread.c - partial-stab.h, symmisc.c, gdbtypes.c: Lint. Remove (or put - inside #if) unused variables and labels. Fix unclosed comment. - Deal with enumeration values unhandled in switch statements. Make - sure non-void functions return values. Include appropriate - headers. - * dbxread.c (elfstab_build_psymtabs): Don't check for unsigned - value < 0. - -Wed Sep 1 14:36:00 1993 K. Richard Pixley (rich@sendai.cygnus.com) - - * i960-tdep.c, ns32k-pinsn.c, remote-adapt.c, xcoffread.c: - index -> strchr. - -Wed Sep 1 11:35:49 1993 Jim Kingdon (kingdon@lioth.cygnus.com) - - * remote.c: Add comment explaining why dcache is disabled. - (remote_fetch_word, remote_store_word): Make static and #if 0. - They are not called from anywhere. - -Wed Sep 1 14:41:28 1993 K. Richard Pixley (rich@sendai.cygnus.com) - - * arm-tdep.c, convex-tdep.c, convex-xdep.c, dbxread.c, - h8300-tdep.c, h8500-tdep.c, i960-pinsn.c, i960-tdep.c, - infptrace.c, m88k-tdep.c, mips-tdep.c, regex.c, remote-vx.c, - rs6000-tdep.c, xcoffexec.c, xcoffread.c, z8k-tdep.c, - config/arm/tm-arm.h, config/convex/tm-convex.h, - config/gould/tm-np1.h, config/gould/tm-pn.h, - config/m68k/tm-isi.h, config/ns32k/tm-umax.h, - config/pa/tm-hppa.h, config/pyr/tm-pyr.h, - config/rs6000/tm-rs6000.h, config/tahoe/tm-tahoe.h, - config/vax/tm-vax.h: bzero -> memset. - - * regex.c: bcmp -> memcmp. - -Wed Sep 1 11:35:49 1993 Jim Kingdon (kingdon@lioth.cygnus.com) - - * symtab.c (find_pc_line, find_line_common), - symtab.h (struct linetable), xcoffread.c (arrange_linetable): - Revise comments re linetable sorting. - * buildsym.c (compare_line_numbers): Sort by pc, not by line. - * coffread.c: Tell end_symtab to sort the line table. - - * coffread.c: Re-work a lot of the coff-specific stuff to use stuff - in buildsym.c. This includes coff_finish_block, coff_context_stack, - coff_local_symbols, coff_file_symbols, coff_global_symbols, - coff_end_symtab and coff_add_symbol_to_list. - (read_enum_type): Deal with it now that we have a "struct pending" - not a "struct coff_pending". - - * buildsym.c (end_symtab): Don't realloc subfile->linetable. - -Wed Sep 1 13:12:43 1993 K. Richard Pixley (rich@sendai.cygnus.com) - - * a68v-nat.c, altos-xdep.c, convex-tdep.c, convex-xdep.c, - findvar.c, hppab-nat.c, hppah-nat.c, i386mach-nat.c, - irix4-nat.c, m68k-tdep.c, m88k-tdep.c, mipsread.c, regex.c, - remote-bug.c, remote-hms.c, rs6000-nat.c, rs6000-tdep.c, - sparc-nat.c, stabsread.c, sun3-nat.c, sun386-nat.c, symfile.c, - umax-xdep.c, xcoffread.c, 29k-share/udi/udip2soc.c, - 29k-share/udi/udr.c, config/a29k/tm-a29k.h, config/arm/tm-arm.h, - config/convex/tm-convex.h, config/gould/tm-np1.h, - config/gould/tm-pn.h, config/h8300/tm-h8300.h, - config/h8500/tm-h8500.h, config/i386/tm-i386aix.h, - config/i386/tm-sun386.h, config/i386/tm-symmetry.h, - config/i960/tm-i960.h, config/m68k/tm-news.h, - config/m88k/tm-m88k.h, config/mips/tm-mips.h, - config/ns32k/tm-merlin.h, config/ns32k/tm-umax.h, - config/pa/tm-hppa.h, config/pyr/tm-pyr.h, - config/rs6000/tm-rs6000.h, config/sh/tm-sh.h, - config/tahoe/tm-tahoe.h, config/vax/tm-vax.h, - config/z8k/tm-z8k.h, nindy-share/nindy.c: bcopy -> memcpy. - -Wed Sep 1 05:05:53 1993 Peter Schauer (pes@regent.e-technik.tu-muenchen.de) - - * mipsread.c (parse_partial_symbols): Use language from FDR if it - is unambigous. Patch from ptf@delcam.co.uk (Paul Flinders). - * mipsread.c (ecoff_symfile_info): New struct to hold the global - pending_list. - * mipsread.c (mipscoff_symfile_init, parse_partial_symbols): - Allocate the global pending list and link it to the objfile. - * mipsread.c (is_pending_symbol, add_pending): Use global pending - list from objfile. Allocate pending list entries from the - psymbol_obstack. - * mipsread.c (free_pending): Remove. The pending list is now - freed when the psymbol_obstack is freed. - * mipsread.c (psymtab_to_symtab1): Remove pending list allocation, - the global pending list is used now. - * mipsread.c (parse_partial_symbols): Skip only the first - file indirect entry when building the dependency list. - -Tue Aug 31 15:01:27 1993 K. Richard Pixley (rich@sendai.cygnus.com) - - Break dcache code out of remote.c. - * dcache.h: white space changes only. - * dcache.c: add user settable variable to set whether data caching - is in use. - * remote.c: include dcache.h. removed data caching code which is - now in dcache.c. Compile in data caching again. (data caching - is currently off by default.) - (remote_read_bytes, remote_write_bytes): change second arg to - unsigned char. - (remote_dcache): new static variable. - * Makefile.in (REMOTE_O): add dcache.o. - * config/m88k/m88k.mt (TDEPFILES): removed dcache.o. - - Break dcache code out of remote-nindy.c. - * remote-nindy.c: removed dcache code. Changed callers to use new - conventions. include dcache.h. - (nindy_dcache): new static variable. - * config/i960/nindy960.mt (TDEPFILES): added dcache.o. - - Break dcache code out of remote-bug.c into dcache.[hc]. - * Makefile.in (dcache_h): new macro. - (HFILES): added $(dcache_h). - (ALLDEPFILES): added dcache.c. - (dcache.o): new rule. - (remote-bug.o): now depends on $(dcache_h). - * remote-bug.c: include dcache.h. remove externs for insque and - remque, add extern for bcopy. Prototype bug_close, - bug_clear_breakpoints, bug_write_cr. dcache code moved to - dcache.[hc]. Changed dcache calling convention to include an - initial DCACHE argument. - (bug_dcache): new static variable. - (bug_read_inferior_memory): change second arg to - unsigned char. - * dcache.[ch]: new files. - * config/m88k/m88k.mt (TDEPFILES): add dcache.o. - -Tue Aug 31 10:33:13 1993 Jim Kingdon (kingdon@lioth.cygnus.com) - - * c-typeprint.c (c_print_type_base): Treat show = 0 just like - show < 0. The only case where we had been distinguishing is that - show = 0 used to print "struct " or "enum " instead of - "struct {...}" or "enum {...}" which seems clearly wrong. - -Mon Aug 30 17:51:32 1993 K. Richard Pixley (rich@sendai.cygnus.com) - - * configure.in: recognize m88110 as an m88k. - -Mon Aug 30 16:07:59 1993 Jim Kingdon (kingdon@lioth.cygnus.com) - - * valops.c (call_function_by_hand): If we discard cleanups, call - bpstat_clear (&inf_status.stop_bpstat). - -Mon Aug 30 12:47:46 1993 Peter Schauer (pes@regent.e-technik.tu-muenchen.de) - - * stabsread.h, dbxread.c (end_psymtab): Return NULL if the psymtab - was empty and thrown away. - * mipsread.c (parse_partial_symbols): Do not add empty psymtabs to - dependency list, skip self dependencies. - * mipsread.c (parse_fdr): Removed, obsolete. - * mipsread.c (parse_lines): Check for cbLine being zero, not - cbLineOffset. - * mipsread.c (struct symloc): Add pst_language. - * mipsread.c (parse_partial_symbols): Set up proper language for - header files, save it in pst_language for psymtab_to_symtab_1. - * mipsread.c (psymtab_to_symtab_1): Use pst_language. - -Mon Aug 30 10:48:06 1993 Jim Kingdon (kingdon@lioth.cygnus.com) - - * configure.in: Fix typo m88*-motorola-svr4* -> sysv4*. - -Fri Aug 27 17:09:19 1993 Ken Raeburn (raeburn@cambridge.cygnus.com) - - * paread.c: Include som.h instead of libhppa.h. (From Utah.) - -Fri Aug 27 09:30:40 1993 Jim Kingdon (kingdon@deneb.cygnus.com) - - * symmisc.c (dump_symtab): Use catch_errors around print_symbol. - Change calling sequence of print_symbol to fit catch_errors. - - * mips-tdep.c: Call reinit_frame_cache every time the user does - "set heuristic-fence-post". - - * gdbserver/low-sun3.c: New file. - * gdbserver/Makefile.in, config/m68k/sun3.mh: Change accordingly. - - * Rename files for 14-character limits: - gdbserver/remote-gutils.c -> gdbserver/utils.c - gdbserver/remote-inflow.c -> gdbserver/low-lynx.c - gdbserver/remote-inflow-sparc.c -> gdbserver/low-sparc.c - gdbserver/remote-server.c -> gdbserver/server.c - remote-monitor.c -> remote-mon.c - * Makefile.in, gdbserver/Makefile.in, gdbserver/configure.in, - config/m68k/monitor.mt, config/i386/i386lynx.mh, - config/sparc/sun4os4.mh: Change accordingly. - * gdbserver/Makefile.in: Remove more junk inherited from gdb Makefile. - -Thu Aug 26 14:32:51 1993 Jim Kingdon (kingdon@lioth.cygnus.com) - - * infcmd.c, inferior.h (run_stack_dummy): If we stop somewhere - besides the dummy, return 1 rather than calling error(). - Let caller print the error message. Remove name argument. - * valops.c (call_function_by_hand): Deal with changes to calling - sequence of run_stack_dummy. Discard restore_inferior_status cleanup - if run_stack_dummy returns 1. - - * Version 4.10.2. - - * config/mips/tm-mips.h (EXTRACT_STRUCT_VALUE_ADDRESS): - Get struct return address from v0, not a0. - - * infrun.c (restore_inferior_status): Use catch_errors when - restoring selected frame. - -Wed Aug 25 21:52:25 1993 Jim Kingdon (kingdon@lioth.cygnus.com) - - * infrun.c (save_inferior_status, restore_inferior_status): - Save and restore the registers too. - * inferior.h (struct inferior_status): Add "registers". - -Tue Aug 24 00:36:17 1993 Jim Kingdon (kingdon@lioth.cygnus.com) - - * dbxread.c (end_psymtab): Clean up comment. - - * frame.h, symtab.h, findvar.c (read_var_value): Change basereg - support to use LOC_BASEREG rather than SYMBOL_BASEREG_VALID. - * dwarfread.c: Use LOC_BASEREG where appropriate. - * Various: Support LOC_BASEREG and LOC_BASEREG_ARG. - - * coffread.c (init_lineno, init_stringtab): Don't check whether - xmalloc returned NULL. - - * config/vax/xm-vaxult.h: Define NO_PTRACE_H. - - * target.c, target.h: Add "set remotedebug" command. - * remote-bug.c, remote.c, remote-mips.c: Remove "set remotedebug" and - "set m88ksnoop" options and use generic "set remotedebug" instead. - * NEWS: Describe this change. - -Mon Aug 23 20:26:22 1993 Jim Kingdon (kingdon@lioth.cygnus.com) - - * buildsym.h: Remove declaration of dbxread.c functions. - * stabsread.h: Group together dbxread.c functions. - Move elfstab_build_psymtabs here from symfile.h. - Declare pastab_build_psymtabs. - * elfread.c, paread.c: Include stabsread.h (for stabsread_new_init - declaration, etc). - -Mon Aug 23 17:16:23 1993 K. Richard Pixley (rich@sendai.cygnus.com) - - * remote-bug.c: rename quiet to bug88k_snoop. - (double_scan, multi_scan): generalize double_scan into a scan - for multiple patterns. Rename to multi_scan. - (bug_wait, bug_write_inferior_memory): adapt to use the new - multi_scan in order to catch and represent target bus errors. - (bug_scan): currently unused, so comment out. - (bug_quiet): removed. Replaced with a standard user settable boolean. - - * m88k-tdep.c: remove include of sys/dir.h. Appears unnecessary - and isn't available on solaris. - -Mon Aug 23 14:56:42 1993 Jim Kingdon (kingdon@lioth.cygnus.com) - - * config/m88k/{delta88v4.mt,delta88v4.mh}: New files - * config/m88k/delta88.mh: Fix comment. - * config/m88k/tm-delta88.h: Remove unused BCS define. - * config/m88k/{tm-delta88v4.h,xm-delta88v4.h,nm-delta88v4.h}: - New files. - * configure.in: Recognize m88*-motorola-sysv4*. - * m88k-nat.c: Always include sys/types.h; don't depend on USG. - -Mon Aug 23 12:57:42 1993 Peter Schauer (pes@regent.e-technik.tu-muenchen.de) - - * mipsread.c (parse_symbol, parse_type, cross_ref): Pass name of - symbol as an argument and use it in complaints. - * symmisc.c (dump_psymtab): Dump filenames of dependencies. - -Mon Aug 23 1993 Sean Fagan (sef@cygnus.com) - and Jim Kingdon (kingdon@cygnus.com) - - Add NetBSD support: - * configure.in: Recognize netbsd. - -Sun Aug 22 22:50:32 1993 Jeff Law (law@snake.cs.utah.edu) - - * hpread.c (get_textlow): Don't go past a K_END when looking for a - K_FUNCTION. Avoids losing on source files with no functions. - -Fri Aug 20 14:01:39 1993 Jim Kingdon (kingdon@lioth.cygnus.com) - - * remote-nindy.c: Remove unused include of sys/ioctl.h. - - * frame.h, symtab.h: Revise comments regarding baseregs. - -Fri Aug 20 15:07:05 1993 Peter Schauer (pes@regent.e-technik.tu-muenchen.de) - - * mipsread.c (parse_partial_symbols, psymtab_to_symtab_1): - Set language for psymtab and symtab. - * mipsread.c (new_symbol): Set language and initialize demangled - name for symbol. - * symmisc.c (print_symbol): Use SYMBOL_SOURCE_NAME when printing - the symbol type. - * symtab.c (decode_line_1): Inhibit coredumps with cfront executables. - -Fri Aug 20 14:01:39 1993 Jim Kingdon (kingdon@lioth.cygnus.com) - - * Move KERNEL_U_ADDR from xm-hp300bsd.h to nm-hp300bsd.h and make - it conditionalized on 4.3 vs. 4.4. - * config/m68k/nm-hp300bsd.h: Move REGISTER_U_ADDR out of 4.3 and - 4.4 sections; it was identical and now works for 4.4. - - * mips-tdep.c (is_delayed): Use INSN*BRANCH* not ANY_DELAY. - - * printcmd.c (MAKEVA_END): Update this version to use "aligner". - -Thu Aug 19 22:08:09 1993 Peter Schauer (pes@regent.e-technik.tu-muenchen.de) - - * config/vax/tm-vax.h (BELIEVE_PCC_PROMOTION): Define. - * mipsread.c (parse_symbol, parse_type, cross_ref): Handle corrupt - file indirect entries with complaints instead of core dumps. Remove - complaint for stTypedef within aggregates. - -Thu Aug 19 17:58:39 1993 Jim Kingdon (kingdon@lioth.cygnus.com) - - * coffread.c (process_coff_symbol): Ignore tagnames like .0fake. - - * coffread.c (coff_read_enum_type): #if 0 out code which changes - enum {FALSE, TRUE} into boolean. - - * config/m68k/delta68.m{t,h}: Use nm-delta68.h, etc. not - non-existent files nm-delta.h, etc. - * config/m68k/tm-delta68.h: Define CANNOT_STORE_REGISTER. - * delta68-nat.c: Add "[0]" in offsetof argument. - * delta68-nat.c (_initialize_kernel_u_addr): Don't try to set up - nl with initializer, just assign to it. Check n_scnum field on - return. - -Wed Aug 18 21:42:52 1993 Jeff Law (law@snake.cs.utah.edu) - - * hpread.c (read_hpux_symtab): Call SET_NAMESTRING for K_MODULE - debug symbols. - -Wed Aug 18 12:03:00 1993 Jim Kingdon (kingdon@lioth.cygnus.com) - - * printcmd.c (print_address), values.c (value_as_pointer): Don't - use ADDR_BITS_REMOVE. - * defs.h: Try to clarify comment about ADDR_BITS_REMOVE. - - * blockframe.c (block_innermost_frame): Uncomment. - Return NULL if passed NULL. - * frame.h: Declare it. - * expression.h (union exp_element): Add field block. - * parse.c (write_exp_elt_block): New function. - * expression.h (OP_VAR_VALUE): Now takes additional struct block *. - * *-exp.y: Write block for OP_VAR_VALUE. - * eval.c, expprint.c, parse.c: Deal with block for OP_VAR_VALUE. - * valops.c, value.h (value_of_variable), callers: - Add second argument, for block. - - * main.c (gdb_readline): If we read some characters followed by EOF, - return them rather than returning NULL. - -Tue Aug 17 11:14:25 1993 Jim Kingdon (kingdon@lioth.cygnus.com) - - * mips-tdep.c: Remove unused #ifndef NUMERIC_REG_NAMES and add comment. - -Tue Aug 17 15:10:04 1993 K. Richard Pixley (rich@sendai.cygnus.com) - - * config/m88k/tm-m88k.h: Fix typo in comment. - (FP_REGNUM): define in terms of SP_REGNUM - rather than by absolute number. Also clearly comment that this - is a convenient lie in order to decrease future confusion. - (ACTUAL_FP_REGNUM): new macro for FP. - (FRAME_CHAIN_VALID): removed. Standard default works fine. - * m88k-tdep.c (frame_chain_valid): redundant, so removed. - (NEXT_PROLOGUE_INSN): removed unused fourth arg, fixed all - callers. - (read_next_frame_reg): declare static. - (examine_prologue): removed unused variabel insn2, rename insn1 - to insn, rewrote comment about finding fp, sp, etc. set frame_fp - based on ACTUAL_FP_REGNUM rather than FP_REGNUM which is - actually a scammed alias for SP_REGNUM on m88k. - - * frame.h: fixed typo in comment. - -Tue Aug 17 11:14:25 1993 Jim Kingdon (kingdon@lioth.cygnus.com) - - * 29k-share/udi/udiphcfg.h: Always include udiphunix.h not udiphdos.h. - - * complaints.c (complain): fflush (stdout) after output. - -Tue Aug 17 01:43:55 1993 Peter Schauer (pes@regent.e-technik.tu-muenchen.de) - - * blockframe.c, frame.h (sigtramp_saved_pc): New routine to fetch - the saved pc from sigcontext on the stack for BSD signal handling. - * config/i386/tm-i386bsd.h (SIGTRAMP_START, SIGTRAMP_END, FRAME_CHAIN, - FRAMELESS_FUNCTION_INVOCATION, FRAME_SAVED_PC, SIGCONTEXT_PC_OFFSET): - Define to make backtracing through sigtramp work. - * config/vax/tm-vax.h (SIGTRAMP_START, SIGTRAMP_END, TARGET_UPAGES, - FRAME_SAVED_PC, SIGCONTEXT_PC_OFFSET): Ditto. - -Mon Aug 16 13:52:14 1993 Jim Kingdon (kingdon@lioth.cygnus.com) - - * main.c (cd_command): If current_directory on entry is "/", then - don't append an extra slash. - Don't assume that /../.. means /. - - * target.c (target_xfer_memory): Clear errno before calling - to_xfer_memory. - - * stack.c (frame_info, print_frame_info): Add comment about using - the starting source line number on a line boundary if backtracing - through sigtramp. - -Mon Aug 16 09:52:33 1993 Jeff Law (law@snake.cs.utah.edu) - - * hpread.c: Add U Utah contribution notice. Add TODO list. - (hp_type_lookup): Use TYPE_NAME and TYPE_TAG_NAME. - (process_one_debug_symbol): Likewise. - -Mon Aug 16 02:56:01 1993 Peter Schauer (pes@regent.e-technik.tu-muenchen.de) - - * blockframe.c (create_new_frame, get_prev_frame_info): - Use the function name when calling IN_SIGTRAMP. - * config/m68k/tm-m68k.h (SIG_PC_FP_OFFSET, SIG_SP_FP_OFFSET): - Define for correct handling of bachtraces through _sigtramp. - * m68k-tdep.c (m68k_find_saved_regs): Adjust saved sp for fake - sigtramp frames. - * mipsread.c (parse_type): Handle corrupt TIR info with complaint - instead of core dump. - * mipsread.c (parse_partial_symbols): Put static symbols into the - mimimal symbol table, use proper mst_types for all minimal symbols. - * stack.c (frame_info, print_frame_info): Use the starting source - line number on a line boundary if backtracing through sigtramp. - -Fri Aug 13 14:37:05 1993 K. Richard Pixley (rich@sendai.cygnus.com) - - * remote-bug.c: include gdbcmd.h. - (sleep, remque, insque): forward decls added. - (bug_fetch_registers, bug_store_registers): forward decls - removed. - (bug_read_inferior_memory, bug_write_inferior_memory): forward - decls added. - (srec_frame, srec_max_retries, srec_bytes, srec_echo_pace, - srec_sleep, srec_noise): new static variables for user settable - options. Mostly these are for debugging and tuning. I don't - expect them to stay user settable options for long. - (timeout): change default to 4 seconds. - (check_open): declare funtion static, force return value. - (readchar_nofail): if timeout, then say so if not being quiet. - (pollchar, double_scan, bug_scan, bug_srec_write_cr, - start_load): new functions. - (bug_wait): rewritten to use double scan. - (expect): while (1) -> for (;;) - (get_hex_digit): rewrite if condition to avoid gcc complaints. - (bug_load, bug_create_inferior, bug_open, bug_store_register): - removed unused variables. - (bug_load): replaced DELTA macro with user settable srec_frame - variable. Other minor lint. - (find_end_of_word, is_baudrate_right, set_rate, not_bug_wait, - gethex, timed_read, translate_addr, bug_before_main_loop): - unsused and removed. - (bug_resume): add missing first arg, pid. - (get_reg_name): use ip rather than cr04. - (bug_write, bug_write_cr, but_clear_breakpoints, bug_quiet): - declare type, args, and explicitly return. - (bug_store_register): straighten out the ip vs cr04 confusion. - (bug_write_inferior_memory): rewrite to cope with errors while - downloading s-records. - (bug_read_inferior_memory): declare static. - (bug_clear_breakpoints): expect nobr before prompt. - (_initialize_remote_bug): add initializations for srec-bytes, - srec-max-retries, srec-frame, srec-noise, srec-sleep, - srec-echo-pace. - - * Makefile.in (remote-bug.o): new rule. - (ALLDEPFILES): added remote-bug.c - - * remote-hms.c (hms_wait): use -1 for timeout's which means block - forever rather than 99999. - - * ser-unix.c (get_tty_state): if a descriptor is not a tty, then - simply save encode this fact as the process group and return - success rather than an error. - (set_tty_state): if process group is -1, do not reset the - process group. - (hardwire_reachar): comment change. - - * serial.h: comment change. - - * config/m88k/tm-m88k.h: comment change to remove embedded - comment. - (SKIP_PROLOGUE): skip_prologue returns a value which is expected - to reset the pc argument. So reset it. - -Fri Aug 13 10:15:24 1993 Fred Fish (fnf@deneb.cygnus.com) - - * Makefile.in (VERSION): Bump to 4.10.1 after release and cvs - tagging. - -Thu Aug 12 20:40:14 1993 Jim Kingdon (kingdon@lioth.cygnus.com) - - * gdbserver/Makefile.in: Use GDBSERVER_LIBS and - GDBSERVER_DEPFILES. Also remove much (but not all that could be - removed) crud inherited from gdb Makefile.in. - * config/i386/i386lynx.mh, config/sparc/sun4os4.mh: Define GDBSERVER_*. - * gdbserver/README: Say it works on Sun and change configuration - instructions slightly. - -Wed Aug 11 18:56:59 1993 david d `zoo' zuhn (zoo@rtl.cygnus.com) - - * config/i386/i386v4.mh: use -lsocket and -lnsl, for remote - targets that use BSD style network connections - -Wed Aug 11 17:54:24 1993 Jim Kingdon (kingdon@lioth.cygnus.com) - - * remote-{monitor,bug}.c: Make bug_ops not static (forward declaration - of statics doesn't work with SunOS4 /bin/cc). - Rename the occurrence in remote-monitor.c to monitor_bug_ops. - -Tue Aug 10 13:07:14 1993 Jim Kingdon (kingdon@deneb.cygnus.com) - - * blockframe.c (find_pc_partial_function), - mips-tdep.c (find_proc_desc): Deal with "pathological" case. - -Tue Aug 10 14:50:30 1993 Jim Kingdon (kingdon@lioth.cygnus.com) - - * utils.c (wrap_here): Allow indent to be NULL. - (fputs_filtered): Don't check for null wrap_indent (wrap_here now - guarantees that it isn't, and anyway we were only checking one out - of the two places we dereferenced it). - - * objfiles.h (struct objfile): Clean up comments for - {obj,sym}_private to clarify what they are private to. - -Mon Aug 9 16:45:00 1993 Stan Shebs (shebs@rtl.cygnus.com) - - * stabsread.c, buildsym.c (hashname): Moved function to - buildsym.c, as suggested in the sources. - -Mon Aug 9 09:53:45 1993 Jim Kingdon (kingdon@lioth.cygnus.com) - - * remote-udi.c: Make udi_ops extern rather than trying forward - declaration of a static variable. - - * hppab-nat.c: Define ptrace to call_ptrace and pass the 5th arg - there, rather than using an ANSI C specific macro. - - * 29k-share/udi/udr.c: Include fcntl.h not sys/fcntl.h. Also put - sys/types.h near the top (just on general principles). - - * environ.c (set_in_environ): Remove G960BASE and G960BIN; they are - no longer used. - - * gdbcore.h: New variable gnutarget. - * core.c: Add commands to set and show it. - * Callers to bfd_*open*: Pass gnutarget instead of NULL as target. - * environ.c (set_in_environ): For GNUTARGET, use set_gnutarget not - putenv. - - * symtab.c (decode_line_1): Give error on unmatched single quote. - -Sun Aug 8 13:59:49 1993 Jim Kingdon (kingdon@lioth.cygnus.com) - - * ser-unix.c (hardwire_send_break) [HAVE_SGTTY]: Use select not usleep. - - * remote.c: Add comments about 'd', 'r', and unrecognized requests. - - * inflow.c (terminal_init_inferior): Don't muck with tty state if - gdb_has_a_terminal() is false. - -Sun Aug 8 10:07:47 1993 Fred Fish (fnf@cygnus.com) - - * dwarfread.c (record_minimal_symbol): Remove prototype and - function. - * dwarfread.c (add_partial_symbol): Remove code to add minimal - symbols and remove comment about limitations. Experiments show - that now that gdb handles the ELF symtab better for creating - minimal symbols, that no additional information is added by - examining the DWARF information, and in fact, given the - limitations, the DWARF code was actually making things worse. - -Sat Aug 7 10:59:03 1993 Fred Fish (fnf@deneb.cygnus.com) - - * elfread.c (elf_symtab_read): Properly sort out the bss symbols - from the data symbols and give them the correct minimal_symbol_type. - Add file static symbols to the minimal symbol table, not just - global symbols. Add absolute symbols as well (like _edata, _end). - Redo stabs-in-elf special symbol handling now that file static - symbols are entered into the into the minimal symbol table. - * dwarfread.c (add_partial_symbol): Add comment about limitations - of DWARF symbols for distinquishing data from bss when adding - minimal symbols. Add file local symbols to minimal symbols. - -Thu Aug 5 08:58:58 1993 Jim Kingdon (kingdon@lioth.cygnus.com) - - * ser-go32.c: Define job_control variable. - -Thu Aug 5 15:56:13 1993 david d `zoo' zuhn (zoo@rtl.cygnus.com) - - * configure.in: z8k-coff is the same as z8k-sim - -Thu Aug 5 08:58:58 1993 Jim Kingdon (kingdon@lioth.cygnus.com) - - * 29k-share/udi/udip2soc.c: Include sys/types.h before sys/file.h. - - * config/i386/tm-i386bsd.h (NUM_REGS): There are only 10, not 11. - - * inflow.c: Put all uses of F_GETFL and F_SETFL in #ifdef F_GETFL. - - * 29k-share/udi/udip2soc.c: Include fcntl.h not sys/fcntl.h. - -Wed Aug 4 18:32:12 1993 Fred Fish (fnf@cygnus.com) - - * inflow.c (pass_signal): Signal handlers take one int arg; - supply an unused one to make it type compatible as an arg to - signal(). - -Tue Aug 3 18:34:14 1993 Ian Lance Taylor (ian@cygnus.com) - - * config/mips/tm-mips.h: Include bfd.h before coff/sym.h. - -Tue Aug 3 15:34:57 1993 Fred Fish (fnf@cygnus.com) - - * Makefile.in (ALLCONFIG): Add config/i386/i386nw.mt, - config/m68k/delta68.mh, config/m68k/delta68.mt, - config/m68k/dpx2.mh, config/m68k/dpx2.mt, config/mips/riscos.mh, - config/mips/news-mips.mh. - * Makefile.in (ALLPARAM): Add config/i386/nm-symmetry.h, - config/i386/tm-i386nw.h, config/m68k/nm-delta68.h, - config/m68k/tm-delta68.h, config/m68k/xm-delta68.h, - config/m68k/nm-dpx2.h, config/m68k/tm-dpx2.h, - config/m68k/xm-dpx2.h, config/mips/xm-makeva.h. - * Makefile.in (ALLDEPFILES): Add dpx2-nat.c. - -Tue Aug 3 12:02:09 1993 Ian Lance Taylor (ian@cygnus.com) - - * mipsread.c: Updated for BFD ECOFF changes. Now gets the - swapping routines and external structure sizes via the - ecoff_backend information. No longer includes coff/mips.h. - -Tue Aug 3 10:58:04 1993 Fred Fish (fnf@cygnus.com) - - * Makefile.in (SFILES): Add thread.c - -Tue Aug 3 10:21:58 1993 Doug Evans (dje@canuck.cygnus.com) - - * remote-sp64sim.c (simif_create_inferior): Add FIXME regarding - sim_set_args return code. - -Mon Aug 2 16:35:31 1993 K. Richard Pixley (rich@sendai.cygnus.com) - - * Makefile.in (VERSION): bumped to 4.9.4. - - * remote-monitor.c: updated copyright. - (bug_ops, monitor_desc): now static. - (monitor_desc): in several places, check and/or set to NULL. - - * remote-hms.c (hms_files_info): Add the appropriate items where - missing in the printf call. - - * remote-bug.c: new file for m88k bug support. - - * config/m88k/m88k.mt (TDEPFILES): added remote-bug.o. - -Mon Aug 2 14:22:09 1993 Steve Chamberlain (sac@phydeaux.cygnus.com) - - * h8300-tdep.c: Use new variable h8300hmode. - -Mon Aug 2 12:06:00 1993 Jim Kingdon (kingdon@lioth.cygnus.com) - - * valops.c (typecmp): If we are passing a non-reference to a function - which takes a reference, pass the address. - (value_arg_coerce): Don't use COERCE_ENUM; we don't want to dereference - references here. - - * thread.c (thread_switch): Define as static. - (add_thread): Cast return value from xmalloc. - - * gdbtypes.c (fill_in_vptr_fieldno): Call check_stub_type. - * gdbtypes.{c,h}: Improve comments on vptr_fieldno. - -Mon Aug 2 11:58:52 1993 Fred Fish (fnf@deneb.cygnus.com) - - * README: Elaborate on gdb C++ support and cfront support. - -Mon Aug 2 11:30:57 1993 Stu Grossman (grossman at cygnus.com) - - * i386lynx-nat.c, thread.c, thread.h: Update copyrights. - -Mon Aug 2 12:06:00 1993 Jim Kingdon (kingdon@lioth.cygnus.com) - - * Makefile.in (ALLDEPFILES): Add i386lynx-nat.c. - -Mon Aug 2 08:42:50 1993 Stu Grossman (grossman at cygnus.com) - - * gdbserver/remote-inflow.c (create_inferior): Fix comments, and - error msg. Setup seperate process group for child. - * (write_inferior_memory): Sleep for 1 second and retry on ptrace - failure. - -Sun Aug 1 22:58:18 1993 Stu Grossman (grossman at cygnus.com) - - * config/i386/i386lynx.mh (NATDEPFILES): Drop coredep (for now). - * config/i386/nm-i386bsd.h: Protect from multiple inclusion. - * config/i386/nm-i386lynx.h: Lotsa new host porting stuff. - * config/i386/tm-i386lynx.h: Define SAVED_PC_AFTER_CALL and - target_pid_to_str. - - * Makefile.in (CLIBS): Reorder to make Lynx ld happy. - * (HFILES): New file thread.h. - * (OBS): New file thread.c. - * configure.in: Host config for Lynx/386. - * fork-child.c (fork_inferior): Call init_thread_list(). - * infrun.c (resume): Add pid to invocation of target_resume(). - * (wait_for_inferior): Pay attention to pid from target_wait(). - Multi-threading code now uses this to determine what to do. - * inftarg.c (child_wait): Conditionalize based on CHILD_WAIT macro. - Use target_pid_to_str() macro throughout when printing pid. - * inferior.h (child_resume): Add pid to prototype. - * hppab-nat.c hppah-nat.c infptrace.c (child_resume): Pass in pid as - argument, instead of using inferior_pid. - * procfs.c (procfs_resume): Pass in pid as argument. Ignored for - now. Use target_pid_to_str() macro throughout for printing process id. - * remote-adapt.c (adapt_resume): Pass in pid as argument. - * remote-eb.c (eb_resume): Pass in pid as argument. - * remote-es.c (es1800_resume): Pass in pid as argument. - * remote-hms.c (hms_resume): Pass in pid as argument. - * remote-mips.c (mips_resume): Pass in pid as argument. - * remote-mm.c (mm_resume): Pass in pid as argument. - * remote-monitor.c (monitor_resume): Pass in pid as argument. - * remote-nindy.c (nindy_resume): Pass in pid as argument. - * remote-sa.sparc.c (remote_resume): Pass in pid as argument. - * remote-sim.c (rem_resume): Pass in pid as argument. - * remote-sp64sim.c (simif_resume): Pass in pid as argument. - * remote-st.c (st2000_resume): Pass in pid as argument. - * remote-udi.c (udi_resume): Pass in pid as argument. - * remote-vx.c (vx_resume): Pass in pid as argument. - * remote-z8k.c (rem_resume): Pass in pid as argument. - * remote.c (remote_resume): Pass in pid as argument. - * solib.c (solid_create_inferior_hook): Pass inferior_pid to - target_resume(). - * target.c (normal_pid_to_str): New routine to print out process - ID normally. - * target.h (struct target_ops): Add pid to prototype at - to_resume(). (target_resume): Add pid argument. - * (target_pid_to_str): Default definition for normal type pids. - * thread.h, thread.c: New modules for multi thread/process control. - -Sun Aug 1 13:02:42 1993 John Gilmore (gnu@cygnus.com) - - * README: Say that bug-gdb is also the place to send requests - for help with GDB. - -Sun Aug 1 09:42:13 1993 Fred Fish (fnf@cygnus.com) - - * Makefile.in (make-proto-gdb-1): Use -f opt on rm of Makefile. - * h8500-tdep.c: Add parens around a few macro args. - -Fri Jul 30 15:43:49 1993 Jim Kingdon (kingdon@lioth.cygnus.com) - - * TODO: Remove items about unix-to-unix/rapp debugging (now we - have gdbserver), moving xm files to subdirectory, ptype yylval, - and file-local symbols. - - * gdbtypes.h: Improve comments about C++ methods. - -Fri Jul 30 14:16:32 1993 Fred Fish (fnf@deneb.cygnus.com) - - * c-exp.y: Add missing 5th arg for one call to lookup_symbol, cast - NULL in all other calls to correct pointer types. - -Fri Jul 30 15:43:49 1993 Jim Kingdon (kingdon@lioth.cygnus.com) - - From Jeffrey Law: - * tm-hppa.h (TARGET_WRITE_PC): Define. - * hppa-tdep.c (hppa_fix_call_dummy): If in a syscall, - then return the address of the dummy itself rather than - the address of $$dyncall. - (target_write_pc): New function to store a new PC. - -Fri Jul 30 12:51:27 1993 Peter Schauer (pes@regent.e-technik.tu-muenchen.de) - and Jim Kingdon (kingdon@cygnus.com) - - * breakpoint.c (breakpoint_re_set_one): Always reparse breakpoint - conditions, they might contain symbol table references. - -Fri Jul 30 12:51:27 1993 Peter Schauer (pes@regent.e-technik.tu-muenchen.de) - - * mipsread.c (parse_symbol): Handle opaque struct definitions and - type naming for stTypedef symbols. - -Fri Jul 30 14:44:21 1993 Jim Kingdon (kingdon@lioth.cygnus.com) - - * c-exp.y (yylex): Detect C++ nested types. - -Fri Jul 30 11:07:37 1993 Doug Evans (dje@canuck.cygnus.com) - - * sp64-tdep.c (sparc64_frame_chain, sparc64_frame_saved_pc): Deleted. - (dump_ccreg, sparc_print_register_hook): New fns. - * remote-sim.h: New file. - * remote-sp64sim.h (sim_*): External fns. (simif_*): Internal fns. - - * config/sparc/sp64.mt: New file. - * config/sparc/tm-sp64.h (FRAME_CHAIN, FRAME_SAVED_PC): Deleted. - (PRINT_REGISTER_HOOK): Call new fn sparc_print_register_hook. - -Fri Jul 30 10:15:01 1993 Fred Fish (fnf@deneb.cygnus.com) - - * Makefile.in (ALLCONFIG): Add config/i386/ptx.mh - -Fri Jul 30 08:58:01 1993 Jim Kingdon (kingdon@lioth.cygnus.com) - - From J. Law: - * infcmd.c (read_pc): Remove PA specific code. - * tm-hppa.h (TARGET_READ_PC): Define. - * hppa-tdep.c (target_read_pc): New function. - - * symtab.c (gdb_mangle_name): Deal with it if type lacks a name. - -Fri Jul 30 07:36:53 1993 Fred Fish (fnf@deneb.cygnus.com) - - * NEWS: Add note that DEC alpha support is host only, not native. - * README: Emphasize that C++ support works best with GNU C++ and - stabs debugging format. - * delta68-nat.c: Add missing FSF copyright. - -Fri Jul 30 08:58:01 1993 Jim Kingdon (kingdon@lioth.cygnus.com) - - * paread.c (pa_symtab_read): Put file-local symbols in minimal symbols. - * hppa-tdep.c (frame_chain_valid): Check that our function has the - same address as _start, not that it must be the same symbol. - -Fri Jul 30 00:18:40 1993 Fred Fish (fnf@deneb.cygnus.com) - - * Makefile.in (ALLDEPFILES): Add delta68-nat.c - * Makefile.in (delta68-nat.o): Add dependency. - -Thu Jul 29 12:09:46 1993 Jim Kingdon (kingdon@lioth.cygnus.com) - - * value.h (COERCE_ENUM): Use COERCE_REF to coerce refs; value_ind - was adequate in gdb 3.5 but not now. - - * valops.c (typecmp): An array in t2 matches a pointer in t1. - - * valops.c (typecmp): When comparing type1& to type2, compare - type1 and type2 as leniently as if we were comparing type1 to - type2. - - * cp-valprint.c (cplus_print_value): Don't dump core if the - baseclass doesn't have a name. - * values.c (vb_match): New function, which finds the virtual - base class pointer even if the types are nameless. - (baseclass_{addr,offset}): Use it. - - * hppa-tdep.c: Make "maintenance print unwind" command from old - "unwind" command. - - * remote-udi.c: Remove udi_timer, call to siginterrupt, and associated - obsolete junk which apparently had been copied from the - pre-serial.h remote.c, but which is no longer used. - -Thu Jul 29 12:36:20 1993 Fred Fish (fnf@deneb.cygnus.com) - - * Makefile.in (NONSRC): Need 29k-share/README, not - 29k-share/udi/README. - -Thu Jul 29 12:09:46 1993 Jim Kingdon (kingdon@lioth.cygnus.com) - - * paread.c (pa_symfile_init): If error reading string table, don't - use errno in cases where it hasn't been set. - - * ser-unix.c (gdb_setpgid): Pass our pid, not 0, to setpgid. - - * remote-monitor.c (_initialize_monitor): Comment out use of - connect_command, since connect_command itself is commented out. - - * remote-monitor.c (generic_open): Parse arguments the same way - as remote.c. - - * hppa-tdep.c (pc_in_linker_stub): Fix unclosed comments. - -Wed Jul 28 13:19:34 1993 Jim Kingdon (kingdon@lioth.cygnus.com) - - * config/mips/xm-mips.h: Define HAVE_TERMIOS. - - * dbxread.c (record_minimal_symbol): Don't put gcc_compiled or - __gnu_compiled* symbols into the minimal symbols. - -Wed Jul 28 08:26:58 1993 Ian Lance Taylor (ian@cygnus.com) - - * remote-mips.c (_initialize_remote_mips): Added "timeout" and - "retransmit-timeout" variables to set mips_receive_wait and - mips_retransmit_wait, respectively. - -Wed Jul 28 03:58:58 1993 (pes@regent.e-technik.tu-muenchen.de) - - * symmisc.c (dump_msymbols): Handle new mst_file_* types. - -Tue Jul 27 12:07:38 1993 Jim Kingdon (kingdon@lioth.cygnus.com) - - * remote-udi.c: Remove old comment about download not implemented. - - * serial.h, ser-{unix,go32,tcp}.c: Add flush_input and send_break. - * nindy-share/*, remote-nindy.c: Extensive hacking to make it - conform to GDB conventions like using memcpy not bcopy, serial.h, - etc. This is to make it host on Solaris, AIX, etc. - * Makefile.in: Reflect removed nindy-share files. - * config/i960/nindy960.mt (TDEPFILES): Remove ttybreak.o. - - * stack.c (print_frame_info): Revise comment about `pathological' - case (there was a wrong FIXME about text labels; also asm() can - trigger this as well as versions of ar which truncate .o names). - - * buildsym.c (start_subfile): If a .c file includes a .C file, set - the language of both of them to C++. - - * config/sparc/xm-sun4os4.h: Define MEM_FNS_DECLARED and include - <memory.h>. - Include <malloc.h> rather than declaring malloc functions ourself. - - * ser-unix.c (set_tty_state): Don't ignore errors setting process - group. - * inflow.c (terminal_inferior): If attach_flag set, ignore errors - from set_tty_state. - - * fork-child.c (fork_inferior): Only quote exec file if needed. - - * mipsread.c (parse_symbol): Remove 21 Jul 93 change with - stTypedef inside an stBlock. - -Tue Jul 27 12:36:49 1993 Peter Schauer (pes@regent.e-technik.tu-muenchen.de) - - * breakpoint.c (breakpoint_1): Walk the breakpoint chain to decide if - we have breakpoints or watchpoints as we might have to ignore internal - breakpoints. - - Fix gdb core dumps after `file newfile' commands. - * symtab.h, symfile.c (clear_symtab_users): New routine which - unconditionally clears symtab users. clear_symtab_users_once - commented out as it was a noop anyway. - * objfiles.c (free_objfile): Don't call clear_symtab_users_once. - * objfiles.c (free_all_objfiles), symfile.c (new_symfile_objfile), - xcoffexec.c (exec_close): Call clear_symtab_users if necessary. - * symfile.c (syms_from_objfile): Install cleanups for errors during - symbol reading. - * coffread.c, dbxread.c, mipsread.c, xcoffread.c (*_symfile_read): - Lint cleanup code, call do_cleanups explicitly. - * symfile.c (symbol_file_add): Call new_symfile_objfile and - reinit_frame_cache _after_ the new symbols are read in. - -Tue Jul 27 01:57:01 1993 Peter Schauer (pes@regent.e-technik.tu-muenchen.de) - - * mipsread.c (parse_type): Do not set tag name for compiler - generated fake tag names. - -Mon Jul 26 17:31:49 1993 K. Richard Pixley (rich@rtl.cygnus.com) - - * config/m88k/m88k.mt (TDEPFILES): add exec.o. - -Mon Jul 26 13:17:36 1993 Jim Kingdon (kingdon@lioth.cygnus.com) - - * hppa-tdep.c: Remove all uses of use_unwind and `set use_unwind' - command. Now we use unwind info by default if we can find it. - - * config/sparc: Move VARIABLES_INSIDE_BLOCK and SUN_FIXED_LBRAC_BUG - to tm-sparc.h so they are shared between Solaris and SunOS4. - * dbxread.c (process_one_symbol): Deal with SunOS4 acc N_STSYM and - N_GSYM functions. - - * config/pa/tm-hppa.h (REGISTER_NAMES): Use "fr" rather than "fp" - for floating point registers. - - * mipsread.c (parse_symbol): Put stStaticProc symbols in minimal - symbols as mst_file_text. - - * hppa-tdep.c (pc_in_linker_stub): Return 0 if can't read memory. - - * stabsread.c (rs6000_builtin_type): Make logical types be - TYPE_CODE_BOOL. - -Sun Jul 25 23:41:48 1993 Jim Kingdon (kingdon@lioth.cygnus.com) - - * breakpoint.{c,h} (struct breakpoint): Replace symtab field with - source_file field. - -Fri Jul 23 09:57:25 1993 Jim Kingdon (kingdon@deneb.cygnus.com) - - * remote.c: Don't error() on errors xferring memory. - * target.h: Clean up comments about *xfer_memory. - - * exec.c, corelow.c (target_ops struct): Don't allow - {insert,remove}_breakpoints to be defaulted to - memory_{insert_remove}_breakpoint. - - * demangle.c: Make it so `help set dem' tells you how to get the - list of demangling styles. - -Thu Jul 22 15:41:09 1993 Jim Kingdon (kingdon@deneb.cygnus.com) - - * Makefile.in: Use REMOTE_O macro not remote.o. - * config/i960/{nindy960,vxworks960}: Don't use remote.o. - -Thu Jul 22 12:43:25 1993 Ian Lance Taylor (ian@cygnus.com) - - * coredep.c: If NEED_SYS_CORE_H defined, include <sys/core.h> - (can't include it in nm-*.h file because it causes conflicts with - a.out symbol definitions). - * hp300ux-nat.c (fetch_core_registers): Commented out; obsolete. - * config/m68k/hp300hpux.mh (NATDEPFILES): Added coredep.o and - corelow.o. - * config/m68k/nm-hp300hpux.h (NEED_SYS_CORE_H): Defined. - (REGISTER_U_ADDR): Defined. - * config/m68k/xm-hp300hpux.h (HAVE_TERMIOS): Define instead of - HAVE_TERMIO. - * config/pa/xm-hppah.h: Likewise. - -Wed Jul 21 11:37:30 1993 Jim Kingdon (kingdon@deneb.cygnus.com) - - * mipsread.c (parse_symbol): when stTypedef and friends occur within - an stBlock, skip over the fields of the inner one. - - * mips-tdep.c (init_extra_frame_info): If in lenient prologue, call - heuristic_proc_desc rather than just assuming registers not saved. - - * Makefile.in (regex.o): Add dependency. - - * hppa{b,h}-nat.c: Warning, not error, if can't access registers. - - * config/pa/hppa{b,h}.h: Define ATTACH_DETACH. - -Wed Jul 21 03:07:30 1993 Peter Schauer (pes@regent.e-technik.tu-muenchen.de) - - * config/mips/xm-makeva.h: New file implements va_list alignment - restrictions for mips hosts. - * config/mips/{xm-irix3.h, xm-mips.h, xm-news-mips.h, xm-riscos.h}: - Use it. - -Wed Jul 21 00:11:05 1993 Peter Schauer (pes@regent.e-technik.tu-muenchen.de) - - * mips-tdep.c (init_extra_frame_info): Do not check for - mips_in_lenient_prologue if it is a dummy frame. - * mipsread.c (fixup_sigtramp): Initialize pdr.adr, it is used by - mips_in_lenient_prologue. - -Tue Jul 20 14:14:59 1993 Jeff Law (law@snake.cs.utah.edu) - - * hpread.c (read_hp_array_type): Handle "char foo[]". - -Tue Jul 20 12:53:47 1993 Jim Kingdon (kingdon@deneb.cygnus.com) - - * mips-tdep.c (heuristic_proc_start): First time we print the - warning, elaborate. - (_initialize_mips_tdep): Improve docstring for `set heur'. - - * config/rs6000/tm-rs6000.h: Remove call to insert_step_breakpoint. - - * symtab.c (find_line_symtab): New function, to deal with multiple - symtabs with the same name. - (find_line_pc{,_range}): Use it. - (find_pc_symtab): Add comment about overlapping symtabs. - -Mon Jul 19 21:29:14 1993 Fred Fish (fnf@deneb.cygnus.com) - - * Makefile.in (SFILES): Add nlmread.c. - * Makefile.in (OBS): Add nlmread.o. - * Makefile.in (nlmread.o): Add new target. - * configure.in (i[34]86-*-netware): New configuration. - * nlmread.c, config/i386/{i386nw.mt, tm-i386nw.h}: New files - for NLM/NetWare support. - -Mon Jul 19 11:48:57 1993 Jim Kingdon (kingdon@deneb.cygnus.com) - - * symtab.h (enum minimal_symbol_type): Add mst_file_*. - * partial-stab.h [DBXREAD_ONLY]: Record statics in miminal symbols. - * dbxread.c (record_minimal_symbol): Deal with statics. - * minsyms.c (lookup_minimal_symbol): Prefer externals to statics. - - * config/i386/xm-i386sco.h: Define HAVE_TERMIOS. - - * printcmd.c, config/pa/xm-pa.h, config/alpha/xm-alpha.h: Make it so - arg_bytes field of makeva_list is always aligned. - * config/pa/xm-pa.h: Make arglist_address a char *. - - * ser-unix.c: Don't try to use job control with termio. - -Sun Jul 18 23:11:28 1993 Peter Schauer (pes@regent.e-technik.tu-muenchen.de) - and Jim Kingdon (kingdon@cygnus.com) - - Make breakpoint_re_set_one work with overloaded member functions, - `b 123' and `b foo' if foo is a static function. - * symtab.c (decode_line_1, decode_line_2): New argument `canonical' - to return canonical line specs if requested by the caller. - * breakpoint.c, source.c, symtab.c, symtab.h: Change prototypes and - callers accordingly. - * symtab.c (build_canonical_line_spec): New helper function which - constructs the canonical line spec. - * breakpoint.c (break_command_1): Use canonical line spec instead - of command string as addr_string if necessary. - * source.c (line_info): Fix storage leak. - -Sun Jul 18 15:22:45 1993 Jim Kingdon (kingdon@rtl.cygnus.com) - - * infptrace.c: Split out define of PT_KILL; Sequent defines PT_KILL - but not the others. - * symm-tdep.c: Remove exec_file_command. - [_SEQUENT_] (ptx_coff_regno_to_gdb, register_addr): New functions. - A few miscellaneous cleanups. - * symm-nat.c: Renamed from symm-xdep.c. - * All symmetry dependent files: Many changes. - - * mips-tdep.c (mips_skip_prologue): New argument lenient. - Use read_memory_nobpt. - (is_delayed, mips_in_lenient_prologue): New functions. - (init_extra_frame_info): If in the prologue, don't use saved registers. - * config/mips/tm-mips.h: Declare mips_skip_prologue. - - * partial-stab.h (N_SO): Add the text offset to valu before, not after, - passing it to END_PSYMTAB. - -Fri Jul 16 18:48:52 1993 Jim Kingdon (kingdon@rtl.cygnus.com) - - * symtab.c (find_pc_symtab): Call warning, not printf directly. - - * solib.c (solib_add): Use x{re,m}alloc, not {re,m}alloc. - -Fri Jul 16 09:56:42 1993 Ian Lance Taylor (ian@cygnus.com) - - * mipsread.c: No longer need to undefine ZMAGIC. - -Thu Jul 15 18:03:37 1993 Ian Lance Taylor (ian@tweedledumb.cygnus.com) - - * m88k-pinsn.c: Moved code into opcodes/m88k-dis.c. - (print_insn): Now just calls print_insn_m88k. - -Thu Jul 15 14:54:05 1993 Doug Evans (dje@canuck.cygnus.com) - - * h8300-tdep.c (examine_prologue): Make prototype match definition. - -Thu Jul 15 08:34:49 1993 Jim Kingdon (kingdon@lioth.cygnus.com) - - * NEWS: Mention that remote.c now has a `load' operation. - - * hppa-tdep.c (pc_in_linker_stub): New function. - (find_proc_framesize): Return 0 for linker stubs. - (rp_saved): Tell the caller where rp is saved. - (frame_chain_valid): Return 1 for linker stubs. - (frame_saved_pc): Use return value from rp_saved. - - * stack.c (print_frame_info): When checking PC_IN_CALL_DUMMY, - pass the sp relative to the frame in question, not the sp in the - innermost frame. - -Wed Jul 14 17:37:03 1993 Jim Kingdon (kingdon@lioth.cygnus.com) - - * mipsread.c (parse_procedure): Take as argument the symtab to look - the name up in. Look it up with mylookup_symbol, not lookup_symbol. - (psymtab_to_symtab_1): For stabs, pass the symtab to parse_procedure. - - * mipsread.c (mylookup_symbol): Use strcmp, not STREQ, as we have - already checked the first characters. - - Changes from Jeffrey Law: - * printcmd.c (makeva_list): Use MAKEVA_EXTRA_INFO to define - machine dependent fields in the makeva_list structure. - (makeva_size): Allocate extra space to handle gaps made by - alignment restrictions. - * config/pa/xm-pa.h (MAKEVA_EXTRA_INFO): Define. - (MAKEVA_START): Initialize arglist_address field. - (MAKEVA_ARG): Always store arguments on natural alignment - boundaries. Set arglist_address to the address right after - the args. - (MAKEVA_END): Simply return the value stored in arglist_address. - -Wed Jul 14 13:51:54 1993 Jim Kingdon (kingdon@lioth.cygnus.com) - - * ch-valprint.c (chill_val_print, case TYPE_CODE_STRING): Print - address, not addr. - - * hppah-nat.c (store_inferior_registers): Don't print i in cases - where we aren't using it. - - * a29k-tdep.c (get_saved_register): Fix typo. - -Wed Jul 14 09:45:52 1993 Doug Evans (dje@canuck.cygnus.com) - - * configure.in: Recognize h8300h (variant of h8300). - -Wed Jul 14 09:45:52 1993 Doug Evans (dje@canuck.cygnus.com) - - * configure.in: Recognize sparc64-*-*. - -Tue Jul 13 14:03:48 1993 Jim Kingdon (kingdon@lioth.cygnus.com) - - * stabsread.c (define_symbol): Make the caddr_t hack apply to `function - returning foo' as well as `pointer to foo'. - - * remote.c [REMOTE_BREAKPOINT]: Use for breakpoint insn if defined. - * config/m68k/tm-m68k.h: Define it. - * mem-break.c, breakpoint.c: Improve comments. - -Tue Jul 13 13:35:31 1993 Frederic Pierresteguy (F.Pierresteguy@frcl.bull.fr) - - * config/m68k/tm-dpx2.h: Replace "tm-68k.h" with "m68k/tm-m68k.h". - * config/m68k/xm-dpx2.h: Define HAVE_TERMIOS not HAVE_TERMIO. - -Tue Jul 13 11:50:38 1993 Doug Evans (dje@canuck.cygnus.com) - - * gdbcore.h (read_memory_integer, read_memory_unsigned_integer): - Make prototype match definition. - -Tue Jul 13 11:15:15 1993 Fred Fish (fnf@cygnus.com) - - * elfread.c: Remove notice about file still being under - construction. - * Makefile.in (ultra3-xdep.o, umax-xdep.o): Add missing ')'. - -Mon Jul 12 17:46:35 1993 Jim Kingdon (kingdon@lioth.cygnus.com) - - * a29k-tdep.c (read_register_stack): Make val static. - -Mon Jul 12 14:10:48 1993 Doug Evans (dje@canuck.cygnus.com) - - * config/h8300/tm-h8300.h (REGISTER_CONVERTIBLE): Change value to 0. - (REGISTER_CONVERT_TO_VIRTUAL, REGISTER_CONVERT_TO_RAW): Move def'n to - usual spot. - -Mon Jul 12 11:29:44 1993 Jim Kingdon (kingdon@lioth.cygnus.com) - - * c-valprint.c (c_val_print): Fix thinko with unspecified length - arrays. - - * hppa-tdep.c (find_proc_framesize): If there is a frame pointer, - use it. - -Sun Jul 11 19:35:05 1993 Jim Kingdon (kingdon@lioth.cygnus.com) - - * symtab.c (decode_line_1): Use end of block to figure out whether - val.end is in the same function, not minimal symbols. - - * source.c (line_info): Add a few more wrap_here's. - - * i386-tdep.c (i386_follow_jump): Do byteswapping where needed and - don't make assumptions about sizes of host data types. - - * blockframe.c, symtab.h (find_pc_partial_function): New arg endaddr. - * infrun.c, breakpoint.c, printcmd.c: Change callers. - * printcmd.c (containing_function_bounds): Remove. - * printcmd.c (disassemble_command): Use find_pc_partial_function, - not containing_function_bounds. - * infcmd.c (step_1): Use find_pc_partial_function rather than - trying to roll our own. Move check for a pc between SIGTRAMP_START and - SIGTRAMP_END in find_pc_partial_function, not step_1. - - * sparc-tdep.c (sparc_frame_chain, frame_saved_pc): - Keep unswapped value in array of char, not REGISTER_TYPE. - Use REGISTER_RAW_SIZE not sizeof (REGISTER_TYPE). - (sparc_extract_struct_value_address): Use TARGET_PTR_BIT not - sizeof (CORE_ADDR). - -Thu Jul 1 15:50:05 1993 Frederic Pierresteguy (F.Pierresteguy@frcl.bull.fr) - - * configure.in (m68*-bull-sysv*): added support for Bull dpx2. - * config/m68k/{t,x,n}m-dpx2.h, dpx2-nat.c: New files. - * config/m68k/dpx2.m{h,t}: New files. - -Thu Jul 1 15:46:10 1993 Jeff Law (law@snake.cs.utah.edu) - - * hpread.c: Run through gnu-indent. - -Sun Jul 11 12:32:08 1993 Doug Evans (dje@canuck.cygnus.com) - - * config/sparc/tm-sparc.h (PRINT_REGISTER_HOOK): Fix typo, add - more parens around macro arg. - -Sat Jul 10 09:54:17 1993 Jim Kingdon (kingdon@lioth.cygnus.com) - - * infrun.c: Remove step_resume_{duplicate,shadow}. Replace - step_resume_break_address with step_resume_breakpoint (now local - to wait_for_inferior). - ({insert,remove}_step_breakpoint): Remove. - (wait_for_inferior): Set step resume break with - set_momentary_breakpoint. Test hitting it with bpstat_stop_status - and bpstat_what (stop_step_resume_break removed). - * breakpoint.{h,c}, infrun.c: Return value from bpstat_what now struct - which includes previous return value as main_action, and a step_resume - bit. - * breakpoint.c (delete_breakpoint): If breakpoint was inserted, and - there is another breakpoint there, insert it. - * infrun.c (wait_for_inferior): Rearrange the spaghetti a bit. Use - a few more gotos. - Various: Clean up and add comments. - - * infrun.c [TDESC]: Remove remaining tdesc code (see ChangeLog - for Wed Nov 13 16:45:13 1991). - -Fri Jul 9 12:36:46 1993 Jim Kingdon (kingdon@lioth.cygnus.com) - - * values.c, value.h (modify_field), callers: Make fieldval a LONGEST. - - * h8300-tdep.c (NEXT_PROLOGUE_INSN): Make pword1 an INSN_WORD * - not short *. - - * findvar.c, defs.h - ({extract,store}_{signed_integer,unsigned_integer,address}): - New routines to replace SWAP_TARGET_AND_HOST. - All over: All uses of SWAP_TARGET_AND_HOST on integers replaced. - - * config/sparc/tm-sparc.h: Add comment suggesting that removing - ins and locals from the registers array might clean things up. - - * utils.c: Clean up comments about wrap buffer and wrap_here. - * printcmd.c (printf_command): Call wrap_here before vprintf. - - * mipsread.c (cross_ref): Set the name to unknown for "struct *" case. - Patch from ptf@delcam.co.uk (Paul Flinders). - - * a29k-tdep.c, findvar.c (get_saved_register): Fix byteswapping sins. - -Fri Jul 9 09:47:02 1993 Peter Schauer (pes@regent.e-technik.tu-muenchen.de) - - * defs.h, remote-eb.c (TM_FILE_OVERRIDE): Remove it. - * mips-tdep.c (init_extra_frame_info): Set proper fci->frame if pc - is at the start of the dummy code. - -Thu Jul 8 14:48:54 1993 Jim Kingdon (kingdon@lioth.cygnus.com) - - * sparc-tdep.c (sparc_push_dummy_frame): Skip all the do_save_insn - stuff, just write the sp and fp. - (sparc_pop_frame): Skip the do_restore_insn; we already restore - the sp with the other out registers. - - * hppa-tdep.c (hppa_push_arguments): Allocate enough space for - arguments. - - * hppa-tdep.c: Change _initialize_hppab_tdep to _initialize_hppa_tdep. - -Thu Jul 8 14:47:00 1993 Doug Evans (dje@canuck.cygnus.com) - - * sparc-tdep.c (sparc_frame_chain): Handle sizeof (CORE_ADDR) - != sizeof (REGISTER_TYPE). - (frame_saved_pc): Ditto. - -Thu Jul 8 08:22:05 1993 Doug Evans (dje@canuck.cygnus.com) - - * config/h8300/tm-h8300.h: (REGISTER_TYPES): Adjust for h8/300h. - (REGISTER_RAW_SIZE): Ditto. - (REGISTER_VIRTUAL_TYPE): Use builtin_type_unsigned_long for regs - on the h8/300h (ints may still be 16 bits). - (EXTRACT_RETURN_VALUE, STORE_RETURN_VALUE, - EXTRACT_STRUCT_VALUE_ADDRESS): Add FIXME's for h8/300h. Some - thought needed here. - - * h8300-tdep.c (print_insn): Call print_insn_h8300h if h8/300h. - (examine_prologue): reg_save_depth is 4 if h8/300h. - - * findvar.c (read_register): Provide some support for 64 bit regs. - (write_register): Ditto. - -Wed Jul 7 14:30:00 1993 Jim Kingdon (kingdon@lioth.cygnus.com) - - * config/mips/nm-riscos.h: machine/machparam.h is always the right - place to look for BSD43_NBPG, not machine/vmparam.h - - * infcmd.c (run_stack_dummy): New argument name. - Change error message in (another) attempt to make it comprehensible. - * valops.c (call_function_by_hand): Pass name to run_stack_dummy. - * symtab.h: Declare demangle and asm_demangle since macros use them. - - * eval.c (evaluate_subexp): Add comment about calling a member - function of a variable in a register. - - * expression.h: Clean up comment about string in STRUCT_STRUCT etc. - - * config/{rs6000/tm-rs6000.h,sparc/tm-sparc.h,pyr/tm-pyr.h}, - inferior.h (PC_IN_CALL_DUMMY) [ON_STACK]: Add comments about stack - frame tops and bottoms. - - * frame.h, blockframe.c, stack.c, a29k-tdep.c, - config/gould/tmp-{pn,np1}.h, - config/{sparc/tm-sparc.h,pyr/tm-pyr.h,vax/tm-vax.h}: Remove field - next_frame from struct frame_info. It has no purpose beyond - ->next->frame and is an artifact from GDB 2.8. - -Tue Jul 6 11:51:18 1993 Jim Kingdon (kingdon@lioth.cygnus.com) - - * Makefile.in: Remove gdb before creating a new one. - Update init.c atomically. - - * Makefile.in (ALLPARAM): Add config/{alpha/xm-alpha.h,pa/xm-pa.h}. - (ALLCONFIG): Add config/alpha/alpha-osf1.mh. - - * infcmd.c (_initialize_infcmd): In docstring for "continue", - describe argument as setting ignore count. - -Sun Jul 4 15:04:47 1993 Doug Evans (dje@cygnus.com) - - * h8300-tdep.c (examine_prologue): Fix call to - read_memory_unsigned_integer. - -Fri Jul 2 18:22:54 1993 Jim Kingdon (kingdon@lioth.cygnus.com) - - * config/mips/{x,n}m-irix{3,4}.h: Make some definitions here - rather than including xm-bigmips.h. - - * eval.c (evaluate_subexp): Improve error messages for OP_TYPE and - default cases. - - * Makefile.in (distclean): Remove y.tab.h. - -Fri Jul 2 14:55:48 1993 Peter Schauer (pes@regent.e-technik.tu-muenchen.de) - - * exec.c (exec_file_command): Remove Mar 28 hack as BFD handles - file updates properly now. - * mipsread.c (mips_coff_new_init): Force reevaluation of sigtramp - addresses if switching to a new symbol file. - * dbxread.c (process_one_symbol): Avoid dereferencing NULL - symbols that might be returned from define_symbol. - -Fri Jul 2 13:33:12 1993 Steve Chamberlain (sac@phydeaux.cygnus.com) - - New target macros for getting at the pc, sp and fp. - * infcmd.c (read_pc, write_pc): Modify to use new macros. - (read_sp, write_sp, read_fp, write_fp): New functions. - * blockframe.c (reinit_frame_cache, get_prev_frame_info): - Use new functions. - * breakpoint.c (bpstat_alloc): ditto. - * infrun.c (wait_for_inferior): ditto. - * stack.c (print_frame_info): ditto. - * valops (call_function_by_hand): ditto. - * corelow.c (core_open): ditto. - * h8500-tdep.c: (target_read_sp, target_write_sp, target_read_pc, - target_write_pc, target_read_fp, target_write_fp): New functions. - * inferior.h (read_sp, write_sp, read_fp, write_fp): Prototypes. - - * config/alpha/xm-alpha.h: Add MAKEVA_END. - * config/h8500/tm-h8500.h: Define new macros. - -Fri Jul 2 13:51:04 1993 Ian Lance Taylor (ian@cygnus.com) - - * configure.in (mipos-*-riscos*): New host and target; use riscos. - * config/mips/nm-riscos.h: If BSD43_NBPG is not defined by - vmparam.h, include machparam.h. - (KERNEL_U_ADDR): Define to be BSD43_UADDR. - -Fri Jul 2 13:39:48 1993 Jim Kingdon (kingdon@lioth.cygnus.com) - - * c-exp.y (yylex): Give error if unmatched single quote. - - * configure.in, config/m68k/*delta68*, delta68-nat.c: New port. - - * Remove unused STACK_END_ADDR in the following files (in other - files it is used for something): tm-mips.h, tm-sun2.h, tm-news.h, - tm-a29k, tm-i386v.h, tm-hppa.h, tm-nindy960.h, tm-amix.h, - tm-hp300hpux.h, tm-isi.h. - -Thu Jul 1 09:51:27 1993 Jim Kingdon (kingdon@cygnus.com) - - * config/mips/nm-riscos.h: Define NBPG and UPAGES. - config/mips/xm-riscos.h: Include <sys/types.h>. - - * ser-unix.c (hardwire_noflush_set_tty_state): Use an assignment, - not an initializer, to copy the structure. - - * gdbtypes.h (struct type): Add field tag_name. - * gdbtypes.c (type_name_no_tag), c-typeprint.c (c_type_print_base): - Use it. - * {coff,dwarf,mips,stabs}read.c: Set it. - - * xm-sysv4.h: Undefine HAVE_TERMIO. - - * config/mips/nm-riscos.h: Remove unmatched #endif. - Define FETCH_INFERIOR_REGISTERS. - * config/mips/riscos.mh: Don't include coredep.o; mips-nat.o is enough. - Fix misspelling of NAT_FILE. - * mips-nat.c (fetch_core_registers): If KERNEL_U_ADDR is not defined, - we can still process "modern" core files. - - * ser-unix.c (hardwire_print_tty_state) [HAVE_TERMIOS]: Don't - print c_line. - (_initialize_ser_hardwire): Just check whether _POSIX_JOB_CONTROL - is defined; don't care what it is defined to. - -Wed Jun 30 20:06:46 1993 Jim Kingdon (kingdon@lioth.cygnus.com) - - * config/vax/xm-vaxult2.h: Define FD_SET and FD_ZERO. - -Tue Jun 29 11:02:58 1993 Jim Kingdon (kingdon@lioth.cygnus.com) - - * inftarg.c: Remove unused include of terminal.h. - * signals.h: Don't undefine signals anymore. - * main.c: Use job_control from serial.h. - * fork-child.c (fork_inferior): Use gdb_setpgid. - * serial.h, ser-unix.c, ser-go32.c: Provide gdb_setpgid. - * utils.c (quit): Use current_target->to_terminal_ours to figure - out whether we care about lack of job control, rather than __GO32__. - * utils.c: Include serial.h not terminal.h - (quit): Use job_control not TIOCGPGRP. - * terminal.h: Don't undefine TIOCGPGRP. - * serial.h, ser-unix.c, ser-go32.c, ser-tcp.c: Add SERIAL_FLUSH_OUTPUT. - * utils.c (quit): Use it. - * serial.h: Add SERIAL_UN_FDOPEN. - * utils.c (quit): Use it. - * ser-unix.c: Add process group to ttystate. - [HAVE_SGTTY]: Add tchars, ltchars, and lmode to ttystate. - * inflow.c: Include serial.h not terminal.h. - Use serial.h stuff to replace most of the maze of #ifdef's. - * inflow.c, main.c, inferior.h: make gdb_has_a_terminal a function. - * serial.h: Document SERIAL_SET_TTY_STATE as being immediate. - * ser-unix.c: Use TIOCSETN not TIOCSETP so it is true. - * serial.h, ser-unix.c, ser-go32.c, ser-tcp.c: - Add SERIAL_PRINT_TTY_STATE, SERIAL_NOFLUSH_SET_TTY_STATE, and - SERIAL_SET_PROCESS_GROUP. - * inflow.c: Use them. - * config/xm-svr4.h, config/rs6000/xm-rs6000.h, config/sparc/sun4os4.h: - Define HAVE_TERMIOS. - * Various: Remove all use of TIOC*_BROKEN. - -Wed Jun 30 12:20:51 1993 Peter Schauer (pes@regent.e-technik.tu-muenchen.de) - - * config/m68k/tm-sun3.h (BELIEVE_PCC_PROMOTION_TYPE): Define. - -Tue Jun 29 13:44:41 1993 Peter Schauer (pes@regent.e-technik.tu-muenchen.de) - - * target.h (target_detach): Turn macro into function. - * target.c (target_detach): Define it, do deferred register stores - before calling the real target function. - -Tue Jun 29 13:15:42 1993 Peter Schauer (pes@regent.e-technik.tu-muenchen.de) - and Jim Kingdon (kingdon@cygnus.com) - - * symtab.h (BLOCK_SHOULD_SORT): Do not sort blocks corresponding to - a function to avoid printing of function arguments in wrong order - due to sorting. - * symfile.c (compare_symbols): Remove code for sorting arguments - as blocks containing arguments are no longer sorted. - * symtab.c (lookup_block_symbol): Update comment accordingly. - -Tue Jun 29 11:02:58 1993 Jim Kingdon (kingdon@lioth.cygnus.com) - - * config/pa/tm-hppa.h: Remove unused ARGS_GROW_DOC. - (REG_STRUCT_HAS_ADDR): Add comment. - - * infrun.c (wait_for_inferior): Use find_pc_line not find_pc_symtab - to check whether there is line number information. - -Tue Jun 29 08:29:17 1993 david d `zoo' zuhn (zoo at cirdan.cygnus.com) - - * remote-udi.c: Fix docstring so that it compiles. - - * remote-mips.c, remote-nindy.c: move bfd.h before symfile.h - (for file_ptr). - -Tue Jun 29 09:11:27 1993 Jim Kingdon (kingdon@lioth.cygnus.com) - - * dbxread.c (process_one_symbol): If we find a LOC_BLOCK where we - don't expect it, change it to LOC_STATIC so at least we don't coredump. - - * c-typeprint.c (c_type_print_base): Don't error() on invalid type. - - * symtab.h: Add comments about line numbers. - * source.c (identify_source_line): Fix off by one bug with line. - -Mon Jun 28 19:00:21 1993 Jeff Law (law@snake.cs.utah.edu) - - * hpread.c: Do not include libhppax. Instead include libhppa.h - and hpux-symtab.h. Misc indention fixes. - (find_unwind_entry): Add PARAM prototype. - (read_hpux_symtab): More fixes for names and sizes of structs, - unions, enums, typedefs, and tagdefs. - (read_hp_enum_type, read_hp_struct_type): Likewise. - (read_hp_set_type, read_hp_subrange_type): Likewise. - (hp_type_lookup, process_one_debug_symbol): Likewise. - (process_one_debug_symbol): Search forward from the K_FUNCTION for - the first K_BEGIN when setting the line number associated with a - function. Avoid unnecessary calls to savestring. - (hp_alloc_type): Initialize TYPE_CPLUS_SPECIFIC here. Remove - most cases where we set it elsewhere. - (hppa_sym_fns): Use "hppa" instead of hppax since hpread.c and - paread.c use the same BFD backend now. All references changed. - (hpux_symfile_init): Allocate space to hold the debugging section - contents on the symbol obstack. - -Mon Jun 28 10:09:08 1993 Jim Kingdon (kingdon@lioth.cygnus.com) - - * printcmd.c (makeva*): New interface, for making a va_list. - (printf_command): Use it. - * config/m88k/xm-delta88.h: Remove VPRINTF define, not needed. - * config/pa/xm-pa.h: New file. - * config/pa/xm-hppa{b,h}.h: Include it. - - * xcoffread.c: Remove obsolete NO_TYPEDEFS comment. - -Sun Jun 27 08:54:55 1993 Peter Schauer (pes@regent.e-technik.tu-muenchen.de) - - * valprint.c (val_print_type_code_int): Fix off by one error with - eliminating leading zeroes for large little endian integers. - -Sun Jun 27 08:58:56 1993 Jim Kingdon (kingdon@lioth.cygnus.com) - - * config/mips/riscos.mh (CC): Use -systype sysv. - - * ser-unix.c: Move #include of <sys/time.h> to HAVE_SGTTY section. - - * Makefile.in (ALLPARAM): Add config/mips/{x,n}-{news-mips,riscos}.h. - -Fri Jun 25 11:22:28 1993 Jim Kingdon (kingdon@lioth.cygnus.com) - - * config/m68k/tm-m68k.h: Remove obsolete comment about duplicating - CALL_DUMMY between different 68k machines. - -Fri Jun 25 17:02:45 1993 Stu Grossman (grossman at cygnus.com) - - * gdbserver/Makefile.in: Add dependancies on server.h. - * gdbserver/remote-gutils.c: Remove lots of unused functions and - variables. - * gdbserver/remote-inflow.c: Remove lots of unused variables and - #includes. Also, use PTRACE_* symbols instead of constants. - (mywait): Surround calls to wait() with enable/disable_async_io() - so that we can be interrupted from GDB while waiting for the - child. Also, handle child exit more gracefully. - * gdbserver/remote-server.c: Remove lots of unused variables. - Move all extern defs into server.h. Redo main loop so that - failure from getpkt() causes communications to be re-established. - Fix 'k' command so that it restarts the child. - * gdbserver/remote-utils.c: Remove lots of unloved vars and - subrs. Move many extern decls into server.h. (remote_open): For - tcp, seperate usage of proto fd from connected fd. Close proto - fd after getting connection. (putpkt/getpkt): Pay attention to - errors when reading/writing. Report these to the caller. New - routines input_interrupt/enable_async_io/disable_async_io to make - it possible to get an I/O interrupt when data arrives from the - comm link. - * serial.h: New file to contain common defs for all remote files. - -Fri Jun 25 17:02:45 1993 Stu Grossman (grossman at cygnus.com) - - * remote.c: Add arg names to prototypes, in a modest effort at - clarification. Also add prototypes for some new functions. - * (remote_wait): Better error reporting for 'T' responses. - * ser-go32.c (strncasecmp): Make str1 & str2 be const. - * (dos_async_init): Make usage message reflect requested port #. - * ser-tcp.c (tcp_open): Terminate hostname properly to prevent - random hostname lookup failures. Add nicer message for unknown - host error. (wait_for): Wake up in case of exceptions. Also, - restart select() if we got EINTR. - * ser-unix.c (wait_for): Restart select() if we got EINTR. - * serial.c: (serial_close): Clean up code. - -Fri Jun 25 11:22:28 1993 Jim Kingdon (kingdon@lioth.cygnus.com) - - * config/m68k/tm-m68k.h: Remove obsolete comment about duplicating - CALL_DUMMY between different 68k machines. - -Fri Jun 25 11:22:28 1993 Jim Kingdon (kingdon@lioth.cygnus.com) - - * Makefile.in (*.tab.c): Use ./c-exp.tab.c not just c-exp.tab.c. - Make comment explaining this comprehensible. - (TAGFILES): Include ALLDEPFILES. - (ALLDEPFILES): udi2soc.c and udr.c are in 29k-share/udi, not - 29k-share/udi/udi. - (update-alldeps): Remove; obsolete. - - * remote.c: Move comments regarding packets to top of file with the - rest of the protocol comments. - Fix incorrect description of 'T' response. - - * README (Reporting Bugs): Refer people to the GDB manual. - - * c-valprint.c (c_val_print): Handle TYPE_CODE_BOOLEAN. - * stabsread.c: Type -16 is 4 bytes. - - * remote-udi.c: Improve docstring. - -Fri Jun 25 11:16:31 1993 Fred Fish (fnf@cygnus.com) - - * elfread.c (elf_symfile_read): Call bfd_elf_find_section, not - bfd_elf32_find_section, to track bfd changes. - -Fri Jun 25 11:22:28 1993 Jim Kingdon (kingdon@lioth.cygnus.com) - - * config/mips/riscos.mh (REGEX{,1}, MUNCH_DEFINE, MH_CFLAGS): Define. - * config/mips/xm-riscos.h: Define USG. - -Thu Jun 24 14:52:45 1993 Jim Kingdon (kingdon@lioth.cygnus.com) - - * main.c (filename_completer): Don't complete to files ending in ~. - - * NEWS: Mention filename completion and "info line" enhancements. - - * main.c (symbol_completion_function): On "info t foo", return NULL, - don't error(). - - * main.c (symbol_completion_function): Don't use readline word - breaking. Use new calling convention for c->completer and - complete_on_cmdlist. - * command.h (struct command): Change arguments; now the text passed - to completer does not have any word breaking done. New arg word. - * symtab.{c,h} (make_symbol_completion_list): Do word breaking. Take - word argument. - * {main.c,gdbcmd.h} ({filename,noop}_completer): Take word argument. - * command.{c,h} (complete_on_cmdlist): Take word argument. - - * command.c (lookup_cmd_1): Doc fix. - -Thu Jun 24 13:26:04 1993 K. Richard Pixley (rich@sendai.cygnus.com) - - * Makefile.in (OP_INCLUDE): define. - (OPCODE_CFLAGS): use OP_INCLUDE. - - * config/i386/ncr3000.mh, config/i386/i386v4.mh, - config/i386/i386sol2.mh, config/m68k/hp300hpux.mh, - config/m68k/amix.mh, config/mips/irix[34].mh, - config/m88k/delta88.mh, config/sparc/sun4sol2.mh (ALLOCA, - ALLOCA1): macros removed. - - * config/mips/decstation.mh, config/rs6000/rs6000.mh - (MMALLOC_LIB): renamed to MMALLOC. - -Wed Jun 23 00:25:58 1993 Jim Kingdon (kingdon@lioth.cygnus.com) - - * partial-stab.h: Consolidate case statements for N_LSYM and N_FUN. - * dbxread.c: Change comment regarding acc. - -Wed Jun 23 16:33:36 1993 Jeff Law (law@snake.cs.utah.edu) - - * hpread.c: Document a few functions, misc cleanups. Update - copyright to reflect the first "release" of this file. - (struct hpux_symfile_info): Delete unneeded fields. Keep pointers - to the contents of the debug sections rather than offsets within - the file itself. Corresponding changes to the accessor macros. - (sl_symbol_size, slt_symbuf): Delete unneeded global variables. - (slt_symbuf_start, slt_symbuf_end, lntt_symbuf): Likewise. - (lntt_symbuf_start, lntt_symbuf_end, gntt_symbuf): Likewise. - (gntt_symbuf_start, gntt_symbuf_end): Likewise. - (fill_slt_symbuf, fill_lntt_symbuf): Delete unneeded functions. - (fill_gntt_symbuf): Likewise. - (get_lntt, get_gntt, get_slt): Simplify. - (hpux_symfile_init): Read and store the contents of the debugging - sections. Do error checking on memory allocation and BFD calls. - (read_hpux_symtab): Delete KERNELDEBUG crud. Ignore debug symbols - which are not needed for building partial symbol tables. Handle - K_CONST, K_TYPEDEF, and K_TAGDEF just like K_SVAR and K_DVAR. - (read_ofile_symtab): Delete useless processing_gcc_compilation stuff. - (read_hp_struct_type): Initialize TYPE_CPLUS_SPECIFIC. - (read_hp_set_type, read_hp_array_type): Likewise. - (read_hp_subrange_type, hp_type_lookup): Likewise. - -Wed Jun 23 15:04:54 1993 K. Richard Pixley (rich@sendai.cygnus.com) - - Makefile overhaul dropping autodepend features. - * Makefile.in: many comment changes. forced consistent use of $() - for makefile variables references. dropped leading ./ in file - references. Drop $(srcdir)/ prefix on all dependencies. - Inserted contents of alldeps.mak and depend. - (INCLUDE_CFLAGS): defined as new macro for getting libiberty's - include directory into the compilation line. - (GDB_CFLAGS): new macro to take up the semantic previously held - by INCLUDE_CFLAGS. - (LIBIBERTY): dropped ancient subdir macro. I last removed this - macro in feb of '92. How does it keep coming back? - (MMALLOC_LIB): renamed to MMALLOC. - (BFD_SRC_DIR): renamed to BFD_SRC. - (BFD_OBJ_DIR): renamed to BFD_DIR. - (BFD_LIB): renamed to BFD. - (BFD_INCLUDES): renamed to BFD_CFLAGS. - (READLINE_DIR): now represents object directory. - (RL_LIB): renamed to READLINE. - (READLINE_SRC, READLINE_CFLAGS, OPCODES, OPCODES_CFLAGS): new - macros. - (INTERNAL_CFLAGS): added GDB_CFLAGS, OPCODES_CFLAGS, - READLINE_CFLAGS, BFD_CFLAGS. Dropped USER_CFLAGS. - (LDFLAGS): removed default assignment. - (TEXIDIR, INCLUDE_DEP, MMALLOC_DIR, MMALLOC_DEP, BFD_DEP, - READLINE_DEP, LIBIBERTY_DIR, TESTS, depend, STAGESTUFF): unused, so removed. - (ALLOCA1, ALLOCA): removed all references. alloca is now in - libiberty. - (VERSION): unilaterally and arbitrarily bumped to 4.9.3. - (SFILES, NONSRC, HFILES, ALLDEPFILES, ALLPARAM, ALLCONFIG): - removed all $(srcdir) prefixes. - (getopt_h, ieee-float_h, bfd_h, wait_h, dis-asm_h): new macros - for potential dependencies. commented out by default. - (readline_headers, udiheaders): convenient abbreviations. - (gdbcore_h, frame_h, symtab_h, gdbtypes_h, expression_h, - value_h, breakpoint_h, command_h, gdbcmd_h, defs_h, inferior_h): - new macros used for header file dependencies. - (install-info, clean-info): collapse into the info rule. - (install): now depends on all. - (install-only): new target for installing without depending on - all. - (uninstall): new target. - (config-check, config-check-hosts, config-check-targets): added - fixme comments. - (ch-exp.tab.c, m2-exp.tab.c): added artificial dependencies in - order to force parallel makes into keeping these rules separate. - * configure.in: omit cat'ing depend file onto generated Makefile. - * alldeps.mak, depend: removed. - - * inferior.h: remove redundant include of symtab.h which is - included in value.h via breakpoint.h. - - * alloca.c: removed. alloca is now in libiberty. - - * config/m88k/delta88.mh, config/ns32k/merlin.mh (M_UNINSTALL): - new macro to undo what M_INSTALL does. - -Wed Jun 23 00:25:58 1993 Jim Kingdon (kingdon@lioth.cygnus.com) - - * config/ns32k/{merlin.mh,xm-merlin.h}: Be consistent about name - of gdb-sh. - - * dbxread.c (copy_pending): Change name and function of begi argument - to endi, since that is what the caller needs. - - * Makefile.in (TAGFILES): Don't include YYFILES. - - * Makefile.in (HFILES): Include monitor.h. - - * Makefile.in: Include text that used to be in alldeps.mak. - Remove config/mips/{bigmips.mh,xm-bigmips} from it. - * Makefile.in, configure.in: Remove all traces of alldeps.mak. - - * main.c (main): Print help message on stdout not stderr - per standards.texi. - New option --version per standards.texi. - In help message, show long options with "--" not "-". - Don't try to print help message or version until after we have - called initialize_all_files. - -Tue Jun 22 11:03:13 1993 Jeff Law (law@snake.cs.utah.edu) - - * hpread.c: Delete useless #if 1 statements. - (hp_type_translate): Use T_LONG, T_UNS_LONG, and T_DOUBLE instead - of magic integers. Fix handling for T_UNS_INT. Abort if the type - passed in is not an "immediate" type. - (read_hp_enum_type): Properly compute the size of the type. - (read_hp_array_type): Likewise. - (hp_type_lookup): Prefix the names of structs, unions and enums - with "struct", "union", and "enum" as appropriate. - -Tue Jun 22 03:15:38 1993 Jim Kingdon (kingdon@lioth.cygnus.com) - - * solib.c (solib_add_common_symbols): Don't call lookup_minimal_symbol. - (solib_add): Call special_symbol_handling once, not once per library. - - * procfs.c (procfs_resume): Don't pass a SIGTSTP whose action - is SIG_DFL. - - * procfs.c (procfs_resume): Skip the unnecessary PRSVADDR on all - systems, not just Solaris. - - * stabsread.c: Include <ctype.h>. - -Mon Jun 21 16:09:46 1993 Jim Kingdon (kingdon@cygnus.com) - - * fork-child.c (fork_inferior): Quote exec_file so it can contain - funky characters. - -Mon Jun 21 16:56:47 1993 Fred Fish (fnf@cygnus.com) - - * Makefile.in (INCLUDE_CFLAGS): Add BFD_INCLUDES for now, since - bfd.h is included by target.h, which most of gdb includes. - * depend: Hand remove BFD_INCLUDES from ${CC} lines, now that - it's in INCLUDE_CFLAGS. - -Mon Jun 21 16:09:46 1993 Jim Kingdon (kingdon@cygnus.com) - - * config/i386/*aix*, i386aix-nat.c: New files. - * configure.in: Use them. - * alldeps.mak: List them. - * coffread.c (decode_base_type): Deal with anonymous enum type. - * i387-tdep.c (print_387_status_word): Add comment re "top". - * i386-tdep.c [I386_AIX_TARGET] (i386_extract_return_value): New func. - * dbxread.c: Use SEEK_SET and SEEK_CUR, not L_*. Define them if and - only if not defined by a header file. - * mipsread.c: Don't define L_SET or L_INCR. - -Mon Jun 21 15:10:07 1993 Fred Fish (fnf@cygnus.com) - - * Makefile.in (BFD_INCLUDES): Bfd.h is now back in bfd build dir. - * depend: Hand updated to match. - -Mon Jun 21 10:13:42 1993 Jeff Law (law@snake.cs.utah.edu) - - * hpread.c: Include "demangle.h". - (process_one_debug_symbol): Set the SYMBOL_LANGUAGE and - SYMBOL_INIT_DEMANGLED_NAME for the current symbol. Adjust - SYMBOL_VALUE for local variables in the stack by the size of the - current function's stack (found in unwind descriptor). Keep - better track of the current unwind descriptor. - -Sun Jun 20 13:11:11 1993 Jim Kingdon (kingdon@cygnus.com) - - * stabsread.c (read_struct_fields): Don't call read_cpp_abbrev on $_. - (read_cpp_abbrev): Don't complain specially for $_. Also return 0 if - we don't recognize the abbrev. - -Sun Jun 20 00:24:41 1993 Jim Kingdon (kingdon@lioth.cygnus.com) - - * solib.c (solib_add_common_symbols): Add comment about performance. - -Fri Jun 18 12:37:36 1993 Jim Kingdon (kingdon@lioth.cygnus.com) - - * config/mips/{{x,n}m-riscos.h,riscos.mh}: New files. - * configure.in (mips-*-sysv*): Use riscos for host, bigmips for target. - - * config/mips/{{x,n}m-news-mips.h,news-mips.mh}: New files. - * config/mips/{bigmips.mh,xm-bigmips.h}: Remove. - * configure.in (mips-sony-*): Use news-mips for host. - - * buildsym.h: Doc fix for processing_acc_compilation. - -Thu Jun 17 19:57:08 1993 Jim Kingdon (kingdon@lioth.cygnus.com) - - * printcmd.c (print_formatted): Don't use tab in wrap_here arg. - -Thu Jun 17 17:29:30 1993 Jim Kingdon (kingdon@lisa.cygnus.com) - - * Makefile.in (INTERNAL_CFLAGS): Include ../include as well as - ${srcdir}/../include. - - * config/m88k/xm-delta88.h: Comment out unused defines which conflict - with system headers. - * printcmd.c (printf_command): Cast second arg to vprintf to PTR. - Use VPRINTF macro if defined. - * config/m88k/xm-delta88.h: Define VPRINTF. Include <sys/siginfo.h>. - Define TIOC{GETC,GLTC}_BROKEN. - * m88k-nat.c: Uncomment include of <sys/ptrace.h>. - * main.c: Rename initialize_{main,cmd_lists,history} to init_* to - make things easier on munch (apparently this matters on - the delta88 with svr3). - -Thu Jun 17 16:53:56 1993 david d `zoo' zuhn (zoo@cygnus.com) - - * Makefile.in: canonicalize install.sh; for use within - this directory (and subdirs) - -Tue Jun 15 17:01:23 1993 david d `zoo' zuhn (zoo at cirdan.cygnus.com) - - * Makefile.in: remove parentdir support; use INSTALL_XFORM - -Thu Jun 17 15:08:35 1993 Steve Chamberlain (sac@phydeaux.cygnus.com) - - * configure.in (alpha-*-osf*), config/alpha/alpha-osf.mh: New - host. - * sh-tdep.c (frame_find_saved_regs): Use NUM_REGS rather than hard - wired (and wrong) constant. - * values.c (unpack_long): Add case to unpack when target object is - sizeof(int). - * config/sh/tm-sh.h (REGISTER_NAMES): Know about the news ones the - simulator defines. - -Wed Jun 16 16:08:18 1993 K. Richard Pixley (rich@sendai.cygnus.com) - - * NEWS: tracking user visible changes starting with - vxworks-timeout. - - * remote-vx.c (_initialize_vx): rename user settable option from - rpcTimeout to vxworks-timeout. - -Wed Jun 16 14:34:10 1993 Jeff Law (law@snake.cs.utah.edu) - - * hpread.c (hp_type_translate): Fix promotion bugs from - char to short and short to int. - -Wed Jun 16 12:21:49 1993 Fred Fish (fnf@cygnus.com) - - * Makefile.in (depend): More makefile diddling. - * alldeps.mak, depend: Update to latest automatically built - versions. - - * Makefile.in (depend): Bfd.h keeps moving, keep up with it. - * alldeps.mak, depend: Update to latest automatically built - versions. - -Tue Jun 15 12:26:05 1993 K. Richard Pixley (rich@sendai.cygnus.com) - - * remote-vx.c: include gdbcmd.h for setlist. - (_initialize_vx): make rpcTimeout user settable. - -Mon Jun 14 09:23:51 1993 Jim Kingdon (kingdon@cygnus.com) - - * main.c, gdbcmd.h: Add function filename_completer. - * main.c, symfile.c, source.c, exec.c, core.c: Use it for - "directory", "source", "cd", "symbol-file" "add-symbol-file", - "load", "file", "exec-file", "core-file" commands. - (But '/' is a word break, limiting usefulness; see comments). - - * source.c (mod_path): Warning not error if can't find directory. - - * isi-xdep.c: New file. - * config/m68k/isi.mh (XDEPFILES): Add isi-xdep.o - -Sun Jun 13 09:17:48 1993 Jim Kingdon (kingdon@cygnus.com) - - * config/m68k/xm-news.h: Include <sys/param.h>. - - * m88k-tdep.c (IEEE_isNAN): Remove. - config/m88k/tm-m88k.h (INVALID_FLOAT): Return 0. This was the same - broken isNAN as on the mips. - - * valprint.c (_initialize_valprint): Use c->function.sfunc not just - c->function. - - * dbxread.c (process_one_symbol): If SUN_FIXED_LBRAC_BUG is not - defined, don't worry about Sun's silly LBRAC bug. - * config/m68k/tm-sun3.h: Define SUN_FIXED_LBRAC_BUG to 0. - - * dbxread.c (process_one_symbol): If there's a symbol before an - N_SO, don't error(). - (case N_BCOMM): complain () not error (). - - * defs.h, main.c (catch_errors): Add return_mask arg. - stack.c (print_frame_info): Pass RETURN_MASK_ERROR. - other callers: Pass RETURN_MASK_ALL. - (return_to_top_level), callers: Add return_reason arg. - * utils.c (quit): - Use return_to_top_level (RETURN_QUIT) instead of error (). - * main.c (main), tm-nindy960.h (ADDITIONAL_OPTION_HANDLER): - Use SET_TOP_LEVEL not setjmp (to_top_level). - * remote-nindy.c: Use catch_errors not setjmp (to_top_level). - -Sat Jun 12 14:40:54 1993 Jim Kingdon (kingdon@cygnus.com) - - * solib.c (solib_create_inferior_hook) [SVR4_SHARED_LIBS]: - Don't try to get the debug base yet. - - * dbxread.c (process_one_symbol): Set n_opt_found based on whether - a non-gcc N_OPT symbol is found. Make SUN_FIXED_LBRAC_BUG a macro - which returns 0 or 1 to say whether to do it. - * config/sparc/sun4{sol2,os4}.h - (SUN_FIXED_LBRAC_BUG,VARIABLES_INSIDE_BLOCK): Use n_opt_found so - the right thing happens for both acc and SunOS4 /bin/cc. - - * valprint.c (print_hex_chars): Use local_hex_format_{pre,suf}fix. - * printcmd.c (print_scalar_formatted): Use val_print_type_code_int. - - * mips-tdep.c: Remove isa_NAN; it assumed sizeof(host int) == 4 and - probably contained byte-order sins too. - config/mips/tm-mips.h (INVALID_FLOAT): Define to 0 like most machines. - The IEEE_FLOAT code in print_floating takes care of it. - -Sat Jun 12 14:47:04 1993 Fred Fish (fnf@cygnus.com) - - * Makefile.in (VERSION): Bump to 4.9.2. - * c-valprint.c (c_val_print): For array of chars printed with - string syntax, don't print the address of the array. From - bothner@cygnus.com. - * c-exp.y (yylex): Recognize '.' as indicating a floating point - number regardless of the radix. From wilson@cygnus.com. - * valprint.c (set_input_radix_1, set_output_radix_1): New - prototypes and functions that do the actual radix setting work. - * valprint.c (set_radix, set_output_radix, set_input_radix): - Rewrite to use set_input_radix_1 and set_output_radix_1. - * valprint.c (initialize_valprint): Enable commands to - independently set and show input and output radices. - * valprint.c (show_radix): New prototype and function that - handles separate input and output radices. - -Fri Jun 11 18:39:38 1993 Ken Raeburn (raeburn@cygnus.com) - - Patches from Jeff Law, law@cs.utah.edu: - * hppa-pinsn.c: Now uses disassembler from opcode library, - this contains only the stub function print_insn. - -Fri Jun 11 15:19:59 1993 K. Richard Pixley (rich@cygnus.com) - - * main.c (main): back to two periods for elipse. - (print_gdb_version): revised format for configuration info. - -Fri Jun 11 10:24:35 1993 Fred Fish (fnf@cygnus.com) - - * defs.h (INT_MAX): Cast unsigned shift result to int. - -Fri Jun 11 10:17:41 1993 Jim Kingdon (kingdon@cygnus.com) - - * dbxread.c (process_one_symbol): Rather than having - BLOCK_ADDRESS_FUNCTION_RELATIVE a macro, make it a variable which - is true if we are doing stabs-in-elf, false otherwise. - config/sparc/tm-sun4sol2.h: Don't define it. - -Fri Jun 11 13:33:40 1993 Ian Lance Taylor (ian@cygnus.com) - - * remote-mips.c (mips_send_packet): Don't print garbage character - in debugging info. - (mips_request): Don't check that remote pid is 0, because - sometimes it isn't. - (mips_fetch_registers): Pass a pointer to SWAP_TARGET_AND_HOST, - not an integer. - -Fri Jun 11 10:17:41 1993 Jim Kingdon (kingdon@cygnus.com) - - * stack.c (print_frame_info): Use catch_errors around print_frame_args. - - * Makefile.in (install): Don't depend on gdb. - - * Rename remote-es1800.c to remote-es.c - and remote-st2000.c to remote-st.c for 14-char filenames. - config/m68k/{es1800,st2000}: Use the new names. - - * mips-tdep.c (isa_NAN): Don't return true on -0. - -Fri Jun 11 10:24:35 1993 Fred Fish (fnf@cygnus.com) - - * defs.h (INT_MAX): Cast unsigned shift result to int. - -Thu Jun 10 13:26:41 1993 Fred Fish (fnf@cygnus.com) - - * elfread.c (elf_symtab_read): Add bfd section address to bfd - symbols, now that they are section relative. - * solib.c (bfd_lookup_symbol): Ditto. - -Thu Jun 10 11:27:34 1993 Jeff Law (law@snake.cs.utah.edu) - - * hpread.c (read_hp_function_type): Adjust SYMBOL_VALUE for - arguments in the stack by the size of the current function's stack - (found in the unwind descriptor). - (process_one_debug_symbol): Likewise. Keep track of the current - function's unwind descriptor. - -Thu Jun 10 10:56:56 1993 Jim Kingdon (kingdon@cygnus.com) - - * Makefile.in (depend): Add bfd -I's for paread.c and xcoffexec.c - depend: Updated accordingly. - -Wed Jun 9 16:08:44 1993 Jim Kingdon (kingdon@cygnus.com) - - * Makefile.in (*.tab.c): Use mv for atomic update. - - * Makefile.in ({dist,real}clean): Also remove nm.h. - (realclean): Also remove ${TESTS}, y.output, yacc.{acts,tmp}. - (distclean): Don't rebuild *.tab.c or TAGS. - -Wed Jun 9 12:56:58 1993 K. Richard Pixley (rich@cygnus.com) - - * Makefile.in (version.c): add host and target names to version.c. - * main.c (main): print three periods for the elipse. - (print_gdb_version): also print configuration. - - * udi/udiids.h, udi/udip2soc.c, udi/udiphcfg.h, udi/udiphunix.h, - udi/udiproc.h, udi/udipt29k.h, udi/udiptcfg.h, udi/udisoc.h, - udi/udr.c: Change AMD copyrights to FSF copyleft '93. - - * remote-eb.c (get_hex_regs, eb_fetch_registers), remote-adapt.c - (get_hex_regs, adapt_fetch_registers): cast args to - supply_register to avoid gcc warning. - - * config/a29k/a29k.mt (TDEPFILES): drop minimon support. It - doesn't compile on solaris and is now obsolete. - - * config/sparc/sun4os4.mh (XM_CLIBS): remove -lresolv. This - breaks stock sunos installations. - -Wed Jun 9 06:14:33 1993 Jim Kingdon (kingdon@cygnus.com) - - * m68k-stub.c: Add comment about frame cache. - - * target.h (target_store_registers): Doc fix re error handling. - - * findvar.c (write_register): Call SWAP_TARGET_AND_HOST regardless - of register_valid[regno]. - -Tue Jun 8 14:42:10 1993 Jim Kingdon (kingdon@rtl.cygnus.com) - - * symtab.h, dwarfread.c: Doc fix re dependencies. - -Tue Jun 8 17:54:09 1993 Rob Savoye (rob@rtl.cygnus.com) - - * serial.c (serial_close): If scb is NULL, don't try to close - it. - * configure.in: Add support for rom68k and bug boot monitors. - -Tue Jun 8 17:39:12 1993 Steve Chamberlain (sac@phydeaux.cygnus.com) - - * coffread.c (init_stringtab): Fix bug where sizeof(long) != 4. - * gdbcore.h, core.c (read_memory_unsigned_integer): New function. - * findvar.c (read_register, write_register): Fix thinko where - sizeof(host long) != sizeof(target int). - * h8300-tdep.c: Use new read_memory_unsigned_integer call. - * sh-tdep.c (_initialize_sh_tdep): Add memory_size command. - -Tue Jun 8 14:42:10 1993 Jim Kingdon (kingdon@rtl.cygnus.com) - - * Move config/m68k/tm-m68k.h (FRAME_FIND_SAVED_REGS) to - m68k-tdep.c (m68k_find_saved_regs). Don't duplicate code between - 68881 and non-68881 cases. Check for a pair of movel instructions. - -Tue Jun 8 14:52:55 1993 K. Richard Pixley (rich@sendai.cygnus.com) - - First cut at sparc-vxworks targetting. - * config/sparc/tm-vxsparc.h, config/sparc/vxsparc.mt: new files. - * configure.in: sparc-vxworks gdb_target now vxsparc. - - * remote-eb.c, remote.c: symfile.h requires bfd.h so include it. - -Tue Jun 8 14:42:10 1993 Jim Kingdon (kingdon@rtl.cygnus.com) - - * config/m68k/xm-news.h: add "extern int errno". - -Tue Jun 8 13:45:07 1993 K. Richard Pixley (rich@sendai.cygnus.com) - - * remove-vx.c (vx_read_register, vx_write_register): collapse - ifdef I80960 else (assumes) m68k into parameterizable macros - VX_NUM_REGS and VX_SIZE_FPREGS. - * config/m68k/tm-vx68.h, config/i960/tm-vx960.h (VX_NUM_REGS, - VX_SIZE_FPREGS): new definitions. - -Tue Jun 8 11:08:29 1993 Jim Kingdon (kingdon@cygnus.com) - - * symfile.{c,h} (generic_load): New function. - remote{,-nindy,-eb,-mips}.c: Use it. - -Mon Jun 7 20:07:30 1993 Stu Grossman (grossman@cygnus.com) - - * Makefile.in (depend): More sed gubbish to deal with - ../bfd/bfd.h being generated during the build. - * depend: Re-done with corrected makefile. - -Mon Jun 7 16:32:05 1993 Fred Fish (fnf@cygnus.com) - - * Makefile.in (BFD_SRC_DIR): Renamed def and usages from BFD_DIR. - * Makefile.in (BFD_OBJ_DIR): New definition for the bfd build - directory to find automatically generated header files and library. - * Makefile.in (BFD_LIB): Use BFD_OBJ_DIR. - * Makefile.in (LINTFLAGS): Include BFD_OBJ_DIR. - * Makefile.in (saber_gdb): Include BFD_OBJ_DIR. - * Makefile.in (depend): Include BFD_OBJ_DIR in gcc args. - * Makefile.in (paread.o, xcoffexec.o): Remove, now in depend. - * depend, alldeps.mak: Rebuild after Makefile.in changes. - -Fri Jun 4 10:18:51 1993 david d `zoo' zuhn (zoo at cirdan.cygnus.com) - - * configure.in: change lynx support to CPU-*-lynxos* - - * Makefile.in (subdir_do): change test from existence of directory - to existence of Makefile (the directory may exist but not be configured) - -Thu Jun 3 01:18:51 1993 david d `zoo' zuhn (zoo at cirdan.cygnus.com) - - * config/sparc/xm-sun4sol2.h: define MEM_FNS_DECLARED - -Fri Jun 4 10:43:33 1993 Ian Lance Taylor (ian@cygnus.com) - - * configure.in (mips-idt-ecoffl*): New target; use idtl. - (mips-idt-ecoff*): Added trailing '*'. - * config/mips/idtl.mt: New file; like idt.mt, but little endian. - -Thu Jun 3 17:36:56 1993 Stu Grossman (grossman@cygnus.com) - - * ser-go32.c: Clean up lots of compilation nits. - -Thu Jun 3 14:44:57 1993 Stu Grossman (grossman@cygnus.com) - - * Patches from Jeffrey Law <law@cs.utah.edu>. - * hppab-nat.c: Eliminate unnecessary ifdefs for - FETCH_INFERIOR_REGISTERS, CANNOT_FETCH_REGISTER, and - CANNOT_STORE_REGISTER. - (fetch_register): Delete code to handle CANNOT_FETCH_REGISTER. - * hppa-pinsn.c: Support 'I', 'J', and 'K' in output - templates for 1.1 FP computational instructions. - -Thu Jun 3 03:34:49 1993 Stu Grossman (grossman@cygnus.com) - - * Makefile.in: Remove ser-tcp.[co]. (Use XDEPFILES instead.) - * alldeps.mak, depend: Rebuild to account for ser-tcp. - * config/sparc/sun4os4.mh: Add ser-tcp to XDEPFILES. - * gdbserver/Makefile.in (gdbserver): Use -lbsd. - * gdbserver/remote-inflow{-sparc}.c (create_inferior): Don't use a - shell when running the child, as args have been expanded by the - time we get here. Simplify calling convention. - * gdbserver/remote-server.c (main): Use new calling convention - for create_inferior, remove defunct code for coalescing argv. - Remove extra calls to mywait(), as we no longer have to wade - through a shell. - - * target.c (target_read_memory_partial): Don't deref errnoptr - when checking for null pointer. - -Wed Jun 2 19:58:46 1993 John Gilmore (gnu@cygnus.com) - - * remote-es1800.c: Fix typo. - -Tue Jun 1 21:22:39 1993 Fred Fish (fnf@cygnus.com) - - * target.c (target_read_memory_partial): Like target_read_memory, - but does partial reads, such as reads that bump into the end of - the address space. - * target.h (target_read_memory_partial): Add prototype. - * valprint.c (PRINT_MAX_DEFAULT): New define, initial value 200. - * valprint.c (val_print_string): Complete rewrite to fix bug with - bumping into end of memory, avoiding unnecessarily long reads, and - fixing bug when print_max is set to 0 (unlimited print length). - * valprint.c (_initialize_valprint): Use PRINT_MAX_DEFAULT to - initialize print_max. - -Tue Jun 1 18:11:35 1993 Rob Savoye (rob at darkstar.cygnus.com) - - * configure.in: Add support for rom68k and bug boot monitors. - -Mon May 31 10:37:04 1993 Jim Kingdon (kingdon@cygnus.com) - - * printcmd.c (print_scalar_formatted): Print integers bigger than - LONGEST in hex no matter how big, and no matter what the format - and size. - - * stabsread.c (read_type): Skip type attributes if present. - - * stabsread.c (read_huge_number): Don't accept '0' + radix as part - of number, just through '0' + radix - 1. - -Sun May 30 15:35:21 1993 Fred Fish (fnf@cygnus.com) - - * Makefile.in (SER_HARDWIRE): Temporarily comment out ser-tcp.o. - - * {dbxread.c, dwarfread.c} (read_ofile_symtab): Rewrite to take - single parameter, the pointer to the partial symtab, rather than - a bunch of args that are derived from the partial symtab. Change - prototypes and callers to match. - - * dbxread.c (read_ofile_symtab): Remove "#if 1" around code to - set demangling style automatically. - * defs.h (CPLUS_MARKER): Clarify comment that this is only for - GNU C++, not C++ in general. - * symtab.h (general_symbol_info): Simplify by eliminating one - structure level for the language dependent info. - -Sat May 29 15:59:29 1993 Fred Fish (fnf@cygnus.com) - - * c-typeprint.c (c_type_print_base): Avoid dereferencing NULL - names for TYPE_CODE_STRUCT and TYPE_CODE_UNION types. - TYPE_CODE_ENUM was already testing for this. - -Fri May 28 17:18:05 1993 Stu Grossman (grossman@cygnus.com) - - * Makefile.in: Add new file ser-tcp.c. - * defs.h (memcmp): Add decl for memcmp to #ifndef MEM_FNS_DECLARED. - * findvar.c (write_register): See if we are writing back the same - value that's already in the register. If so, don't bother. - * remote.c (putpkt, getpkt): Improve handling of communication - problems. - * ser-go32.c: Prototype it to death. Update serial_ops and add - dummy routines where appropriate. - * ser-tcp.c: New module to implement serial I/O via TCP - connections. - * ser-unix.c: Clean up getting/setting of tty state. Get rid of - SERIAL_RESTORE, add SERIAL_{GET|SET}_TTY_STATE interfaces. - * serial.c: Add start of support for connect command. - (serial_open): Distinguish between tcp and local devices. - * serial.h (struct serial_ops): Get rid of restore, add - get_tty_state and set_tty_state. Define protoypes and macros for - this mess. - * gdbserver/remote-utils.c: Add tcp support. (readchar): Do - some real buffering. Handle error conditions gracefully. - * gdbserver/remote-inflow-sparc.c: Update to remote-inflow.c - (Lynx), remove lots of cruft. - -Fri May 28 17:24:51 1993 david d `zoo' zuhn (zoo at cirdan.cygnus.com) - - * printcmd.c (print_address_symbolic): turn this into an assigment - instead of an initialization (many compilers don't accept - structure initialization). - -Thu May 27 16:56:25 1993 Jim Kingdon (kingdon@lioth.cygnus.com) - - * xcoffread.c (read_xcoff_symtab): If several program csects in one - source file, give them all the name of the source file, rather than - the 2nd and subsequent ones having NULL names. - -Thu May 27 06:16:56 1993 Peter Schauer (pes@regent.e-technik.tu-muenchen.de) - - * printcmd.c (print_address_symbolic): Append source filename and - linenumber of the symbol if print symbol-filename is on. - (initialize_printcmd): `set print symbol-filename'. - -Wed May 26 13:46:16 1993 Stu Grossman (grossman@cygnus.com) - - * configure.in: Add config for Lynx target. Configure gdbserver - only for Lynx. Re-do selective configuration of sparclite. - - * gdbserver/{remote-gutils.c remote-server.c Makefile.in - configure.in remote-inflow.c remote-utils.c}: New files to - support GDB remote server. Currently only works for Lynx. - -Wed May 26 10:28:14 1993 Jim Kingdon (kingdon@lioth.cygnus.com) - - * stabsread.c (define_symbol, case 't'): Only set the name if it - is not a pointer type. - - * stabsread.c (define_symbol): Clean up logic; move the read_type - calls to inside the switch statement (this improves the error - handling). - - * mipsread.c (parse_symbol, parse_partial_symbols): Deal with Fortran - common blocks. - -Tue May 25 20:44:24 1993 Jim Kingdon (kingdon@lioth.cygnus.com) - - * printcmd.c (print_formatted, case 'i'): Pass a tab to wrap_here. - - * source.c (line_info): Change "pc" to "address" in messages and - use print_address for addresses. - - * source.c (line_info): If we don't find a symtab, print more useful - output, including the symbolic address. - - * source.c (line_info): If --fullname, display the source. - (identify_source_line), callers: Take pc as argument, rather than - assuming innermost frame (emacs doesn't use this, so no one ever - noticed). - * symtab.h: Declare frame_file_full_name. - * main.c: Don't. - -Tue May 25 15:30:43 1993 Brendan Kehoe (brendan@lisa.cygnus.com) - - * breakpoint.c (catch_command_1): Fix typo in error msg. - -Tue May 25 16:05:55 1993 Ken Raeburn (raeburn@cambridge.cygnus.com) - - * elfread.c (elf_symfile_read): Update ELF structure and routine - names to specify 32-bit versions. - (elf_symtab_read): Retrieve size field directly from symbol, - instead of using old kludge. - - * mips-pinsn.c (print_insn): Cast address to bfd_vma before - calling opcodes library. - * z8k-tdep.c (print_insn): Likewise. - -Tue May 25 13:06:28 1993 Jim Kingdon (kingdon@lioth.cygnus.com) - - * stabsread.c: Remove all uses of error(). Make error_type and - read_type_number static. - (define_symbol): Don't try to deal with a missing symbol - descriptor which isn't followed by digit, '(', or '-'. - * stabsread.h: Don't declare read_type_number here. - * gdbtypes.h: Don't declare error_type here. - * xcoffread.c: Remove NO_TYPEDEFS code. - -Tue May 25 09:33:16 1993 Ian Lance Taylor (ian@cygnus.com) - - * mips-tdep.c: Removed #include of many header files, and #define - of MIPSMAGIC; no longer used. - -Tue May 25 09:36:13 1993 Jim Kingdon (kingdon@lioth.cygnus.com) - - * Many places: replace "the inferior" in messages with "the program" - or "the program being debugged". - * inflow.c (try_writing_regs): Remove; it's been #if 0'd forever - and I'm getting sick of maintaining it. - - * config/i386/linux.mh: Don't use \ newline; the awk scripts don't - support it. - - * config/i386/go32.mh: Define SER_HARDWIRE. - * Makefile.in: Define SER_HARDWIRE. - (DEPFILES): Use it. - (alldeps.mak): Add SER_HARDWIRE. - Remove all references to ser-hardwire.{c,o}. - * configure.in: Remove all ser_hardwire and gdb_serial_driver stuff. - -Mon May 24 23:50:05 1993 Peter Schauer (pes@regent.e-technik.tu-muenchen.de) - - * sparc-nat.c (store_inferior_registers): Fill in all members of - inferior_fp_registers by reading them from the inferior before - modifying and writing them back. - Fixes unexplainable inferior FP exceptions after calls to the inferior - or setting of floating point registers. - * mips-tdep.c (mips_skip_prologue): Skip move of argument register - to register which is generated by gcc-2.4. - -Tue May 25 00:42:39 1993 Ken Raeburn (raeburn@cygnus.com) - - * hppa-pinsn.c: Define OLD_TABLE before including opcode/hppa.h. - -Mon May 24 13:55:14 1993 Stu Grossman (grossman@cygnus.com) - - * config/i386/{i386lynx.mh i386lynx.mt nm-i386lynx.h tm-i386lynx.h - xm-i386lynx.h}: New configuration for Lynx. - -Mon May 24 10:01:10 1993 Jim Kingdon (kingdon@lioth.cygnus.com) - - * mipsread.c (parse_symbol): Deal with scVar and scVarRegister. - * symtab.h: Comment that LOC_REGPARM_ADDR can be call by reference. - - * c-typeprint.c (c_type_print_base): Don't print typedef'd names - as struct, union, or enum tags. - -Mon May 24 01:10:01 1993 Peter Schauer (pes@regent.e-technik.tu-muenchen.de) - - * symmisc.c (dump_msymbols): Avoid gdb coredump with stripped - executable. - -Sat May 22 10:03:09 1993 Jim Kingdon (kingdon@lioth.cygnus.com) - - * infrun.c (wait_for_inferior), - infcmd.c (program_info, signal_command): Use symbolic signal names. - - * inftarg.c (child_wait): Deal with EINTR and include message from - strerror if printing an error message. - - * main.c (command_line_input): Use STOP_SIGNAL not SIGTSTP. - - * stabsread.c: Remove most uses of lookup_fundamental_type. - (define_symbol): Use read_type for type of enum constant, - not just read_type_number. Also don't call error(). - (define_symbol): For unrecognized constant type, one complaint (the - one from error_type) is enough. Don't make our own in addition. - (define_symbol): Don't treat an N_FUN 'R' as a prototype. - * gdbtypes.h: Doc fixes. - -Sat May 22 03:33:07 1993 Peter Schauer (pes@regent.e-technik.tu-muenchen.de) - - Fix stack unwinding through _sigtramp on Irix. These patches are from - Paul Flinders <ptf@delcam.co.uk>. - * mipsread.c (fixup_sigtramp): Find _sigtramp on Irix even when the - executable uses sigvec. - * mips-tdep.c (read_next_frame_reg): Allow tm-file to override - sigcontext offsets. - * config/mips/tm-irix3.h: Add sigcontext offsets for Irix. - -Sat May 22 00:39:01 1993 Peter Schauer (pes@regent.e-technik.tu-muenchen.de) - - * infrun.c (wait_for_inferior): Clear stop_signal if it should not - be passed to the inferior to make "handle <signal> nopass nostop" work. - -Sat May 22 00:21:41 1993 Peter Schauer (pes@regent.e-technik.tu-muenchen.de) - - * config/mips/tm-irix3.h: Clean up, use tm-bigmips.h and redefine - the necessary bits. - * findvar.c (value_from_register): Fix uninitialized first_addr - which caused problems with assignment of doubles to register variables - on some targets. - * mipsread.c: Remove TM_FILE_OVERRIDE, include tm.h and provide the - missing mips definitions if necessary. - - Fix handling of double register variables for mips targets and big - endian hosts. These patches are from Paul Flinders <ptf@delcam.co.uk>. - * config/mips/tm-mips.h: Increase MAX_REGISTER_{RAW,VIRTUAL}_SIZE to - 8 bytes for doubles. - * config/mips/tm-mips.h (REGISTER_CONVERT_TO_TYPE): New macro for - conversion of type held in multiple registers to host format. - * config/mips/tm-mips.h (REGISTER_CONVERT_FROM_TYPE): New macro, - companion to REGISTER_CONVERT_TO_TYPE. - * config/mips/tm-mips.h (EXTRACT_RETURN_VALUE, STORE_RETURN_VALUE): - Convert to function calls. - * config/mips/tm-mips.h (FIX_CALL_DUMMY): New code for big endian - mips targets. - * mips-tdep.c (mips_print_register): Raw buffer now needs just - MAX_REGISTER_RAW_SIZE bytes. - * mips-tdep.c (mips_print_register): Use REGISTER_CONVERT_TO_TYPE - (if defined) for doubles. - * mips-tdep.c: (mips_extract_return_value, mips_store_return_value): - New functions, take care of REGISTER_CONVERT_TO/FROM_TYPE. - * valops.c (value_assign): Use REGISTER_CONVERT_TO_TYPE if - defined. - * findvar.c (value_from_register): Use REGISTER_CONVERT_TO_TYPE if - defined. - -Fri May 21 09:04:25 1993 Jim Kingdon (kingdon@lioth.cygnus.com) - - * configure.in: Add i[34]86-*-isc*. - - * stabsread.c: Make sure all complain() pass the address of the struct. - - * xcoffread.c: Make sure all struct complaints are static not auto. - - * Makefile.in: Add rule for xcoffexec.o like that for paread.o. - - * xcoffread.c (process_xcoff_symbol, case C_LSYM): Use define_symbol. - -Wed May 19 12:33:59 1993 Jim Kingdon (kingdon@lioth.cygnus.com) - - * config/i386/linux.mh: Re-enable coredumps now that they should work. - -Wed May 19 15:44:20 1993 K. Richard Pixley (rich@cygnus.com) - - * config/m68k/tm-m68k.h (FRAME_CHAIN): add missing close paren. - -Wed May 19 15:33:57 1993 Stu Grossman (grossman@cygnus.com) - - * config/pa/nm-hppab.h: Comment PTRACE_ARG3_TYPE. - -Wed May 19 12:33:59 1993 Jim Kingdon (kingdon@lioth.cygnus.com) - - * Makefile.in (INSTALLED_LIBS): New variable. - -Tue May 18 14:08:50 1993 Jim Kingdon (kingdon@lioth.cygnus.com) - - * main.c (quit_command): In the "quit anyway?" message, tell the user - whether we are planning to detach or kill the program. - - * config/vax/vaxbsd.mh: Add "NAT_FILE= nm-vax.h". - * config/vax/xm-vaxbsd.h: Use <sys/param.h> not <machine/limits.h> - - * infcmd.c (read_pc): Doc fix. - - * printcmd.c (print_address_symbolic): Use %u not %d for offset. - - * blockframe.c (get_prev_frame_info): If pc in sigtramp, set - signal_handler_caller. - * tm-68k.h (FRAME_{CHAIN,SAVED_PC}): Deal with sigtramp. - * tm-hp300bsd.h: Define SIGTRAMP_{START,END} not IN_SIGTRAMP. - * inferior.h (IN_SIGTRAMP): Definition moved from infrun.c. - Use SIGTRAMP_START if defined. - * infcmd.c (step_1): Use SIGTRAMP_{START,END} if needed. - * infrun.c (wait_for_inferior): Check IN_SIGTRAMP before SKIP_PROLOGUE. - - * infptrace.c: Remove unused KERNEL_U_ADDR_HPUX code. - - * infcmd.c (step_1): Fix poorly worded error message. - - * config/{i386/linux.mh,m68k/isi.mh} (NATDEPFILES): - Comment out corelow.c because core dumps are broken on these machines. - - * Makefile.in (depend): Put "${srcdir}" in generated dependencies - if srcdir is not ".". - Also put in -I${BFD_DIR} or -I${READLINE_DIR} for files which need it. - (INCLUDE_CFLAGS): Remove BFD_DIR and READLINE_DIR. - * depend: Update to latest automatically built version. - -Tue May 18 08:10:45 1993 Fred Fish (fnf@cygnus.com) - - * ChangeLog, ChangeLog-92: Split ChangeLog at 1993. - * Makefile.in (NONSRC): Add ChangeLog-92 - -Tue May 18 08:03:37 1993 Jim Kingdon (kingdon@lioth.cygnus.com) - - * findvar.c ({read,write}_register): Use REGISTER_RAW_SIZE - not typo RAW_REGISTER_SIZE. - - * frame.h, inferior.h: Doc fixes. - -Mon May 17 15:43:03 1993 Stu Grossman (grossman@cygnus.com) - - * findvar.c (write_register): Add sanity check for register size. - (read_register): Fixup sanity check for register size to be - consistent with write_register(). - -Mon May 17 07:36:20 1993 Ian Lance Taylor (ian@cygnus.com) - - * sparclite/Makefile.in: Add dummy info, install and install-info - targets. - -Thu May 13 07:30:22 1993 Ian Lance Taylor (ian@cygnus.com) - - * remote-nindy.c: Removed declaration of coffstrip. - * nindy-share/nindy.c: #if 0 coffstrip routine; no longer used. - -Wed May 12 00:35:19 1993 Fred Fish (fnf@cygnus.com) - - * Makefile.in (VERSION): Bump to 4.9.1 after release and cvs - tagging. - - * Makefile.in (VERSION): GDB 4.9 release. - -Tue May 11 08:04:41 1993 Fred Fish (fnf@cygnus.com) - - * README: Update known bugs to include the Solaris bug that - leaves core dumps in the current directory when restarting the - inferior with "run". Expand on the testsuite information. - - * Makefile.in (VERSION): Bump to 4.8.96 for what should hopefully - be the last 4.9 prerelease test archive. - -Mon May 10 22:13:23 1993 Jim Kingdon (kingdon@cygnus.com) - - * config/m68k/xm-hp300bsd.h: Include <sys/param.h> to avoid INT_MAX - redefined warnings. - -Mon May 10 20:00:43 1993 Fred Fish (fnf@cygnus.com) - - * README, NEWS: Update for gdb 4.9 release. - -Mon May 10 19:38:34 1993 John Gilmore (gnu@cygnus.com) - - * ch-exp.y (MAX, MIN): Rename to MAX_TOKEN, MIN_TOKEN. - * target.c (MIN): #undef before defining. - -Mon May 10 16:03:03 1993 Jim Kingdon (kingdon@cygnus.com) - - Patch from Jeffrey Law: - * gdb/config/pa/nm-hppab.h (PTRACE_ARG3_TYPE): Define as caddr_t. - -Mon May 10 15:28:27 1993 Ian Lance Taylor (ian@cygnus.com) - - * hppa-tdep.c (hppa_push_arguments): Allocate correct amount of - memory. - -Mon May 10 13:14:46 1993 Fred Fish (fnf@cygnus.com) - - * ch-exp.y (start): Apply work-around to avoid bison warning. - -Sun May 9 07:25:02 1993 Fred Fish (fnf@cygnus.com) - - * Makefile.in (BISON): Remove double quotes around BISON - definition when bison is used. - - * configure.in (hppa*-hp-bsd): Change to hppa*-hp-bsd* - * configure.in (hppa*-hp-hpux): Change to hppa*-hp-hpux* - * configure.in (m68*-hp-bsd): Change to m68*-hp-bsd* - * configure.in (m68*-hp-hpux): Change to m68*-hp-hpux* - * configure.in (hppa*-*-bsd): Change to hppa*-*-bsd* - * configure.in (hppa*-*-hpux): Change to hppa*-*-hpux* - * configure.in (m68*-hp-bsd): Change to m68*-hp-bsd* - * configure.in (m68*-hp-hpux): Change to m68*-hp-hpux* - - * Makefile.in (VERSION): Bump to 4.8.6. - -Sat May 8 12:36:03 1993 Fred Fish (fnf@cygnus.com) - - * config/pa/xm-hppah.h (MALLOC_INCOMPATIBLE): Define it, and - include declarations for malloc/realloc/free. Both malloc and - realloc return 'void *' for non-ANSI compilations. - -Sat May 8 01:39:30 1993 (pes@regent.e-technik.tu-muenchen.de) - - * coffread.c (read_coff_symtab): Don't fclose stream as it is no - longer opened twice. - -Thu May 6 21:08:55 1993 Jim Kingdon (kingdon@cygnus.com) - - * solib.c (clear_solib): Don't close bfd if it is NULL. - -Thu May 6 20:55:35 1993 Fred Fish (fnf@cygnus.com) - - * core.c (dis_asm_read_memory): Cast second arg of - target_read_memory to "char *". - * breakpoint.c (watchpoint_check): Change arg type from PTR to - "char *", to match other functions called by catch_errors(). - -Thu May 6 15:47:45 1993 Stu Grossman (grossman@cygnus.com) - - * More patches from Jeffrey Law (law@cs.utah.edu). - * gdb/config/nm-hppab.h (PTRACE_ARG3_TYPE): Define as caddr_t. - * gdb/config/pa/tm-hppah.h (millicode_start, millicode_end): - Delete unnecessary declarations. - -Thu May 6 15:15:46 1993 Stu Grossman (grossman@cygnus.com) - - * ser-unix.c (wait_for): Use VTIME to do timeouts instead of - poll() for termio{s}. - -Thu May 6 10:03:41 1993 Jim Kingdon (kingdon@cygnus.com) - - * i386-tdep.c (i386_frame_num_args): Always return -1. - -Wed May 5 15:16:33 1993 Stu Grossman (grossman@cygnus.com) - - * Patches from Jeffrey Law <law@cs.utah.edu>. - * gdb/hppa-tdep.c: Declare frame_saved_pc. - (frameless_function_invocation): New function. - (frame_saved_pc, init_extra_frame_info): Use - frameless_function_invocation. - * gdb/config/pa/tm-hppa.h (SAVED_PC_AFTER_CALL): Use saved_pc_after - call instead of just grabbing the value currently in %r2. - (FRAMELESS_FUNCTION_INVOCATION): Use frameless_function_invocation. - * gdb/config/pa/tm-hppah.h (SAVED_PC_AFTER_CALL): Delete private - definition and use the common one in tm-hppa.h. - * gdb/hppa-tdep.c (frame_chain_valid): If "use_unwind" is true, then - use unwind descriptors to determine if the frame chain is valid. - * gdb/hppa-tdep.c (find_dummy_frame_regs): Rework so that - it does not assume %r4 is the frame pointer. - * gdb/hppa-pinsn.c (print_insn): Handle 'r' and 'R' for break, rsm, - and ssm instructions. - * gdb/hppa-tdep.c (extract_5r_store, extract_5R_store): New - helper functions for print_insn. - * gdb/hppa-tdep.c (gcc_p, hpux_cc_p): Delete unused functions. - * gdb/config/pa/tm-hppa.h (ABOUT_TO_RETURN): Handle a return - which nullifies the following instruction. - -Tue May 4 12:11:38 1993 Jim Kingdon (kingdon@cygnus.com) - - * infptrace.c [FIVE_ARG_PTRACE]: Define ptrace to call_ptrace and - pass the 5th arg there, rather than using an ANSI C-specific macro. - - * Makefile.in (depend): Don't include ${CC} command for *.tab.c. - -Tue May 4 19:33:12 1993 Fred Fish (fnf@cygnus.com) - - * Makefile.in (VERSION): Bump to 4.8.5 - * Makefile.in (INCLUDE_CFLAGS): Add BFD_DIR and READLINE_DIR - directories to include search path. - * Makefile.in (CLIBS, CDEPS, ADD_FILES, ADD_DEPS): Clean up - whitespace. - * Makefile.in (depend): For gcc -MM line, use INTERNAL_CFLAGS - * Makefile.in (main.o, dbxread.o, coffread.o, mipsread.o, - elfread.o, dwarfread.o, stabsread.o, xcoffread.o, xcoffexec.o, - xdr_ld.o, xdr_rdb.o, nindy.o, Onindy.o, ttybreak.o, ttyflush.o, - udr.o, udip2soc.o): Remove explicit rules, use the ones that - are automatically generated in "depend". - * Makefile.in (paread.o): Document why a dependency doesn't get - automatically generated in "depend" and leave this explicit rule - in for now (FIXME). - * depend: Update to latest automatically generated version. - -Tue May 4 12:11:38 1993 Jim Kingdon (kingdon@cygnus.com) - - * xcoffread.c: Doc fix. - - * Makefile.in (depend): Include $(CC) command in generated output. - -Mon May 3 22:51:05 1993 Fred Fish (fnf@cygnus.com) - - * Makefile.in (NONSRC): Remove ${srcdir}/putenv.c. - * Makefile.in (SFILES): Add ${srcdir}/putenv.c. - * depend: Update to latest automatically built version. - -Mon May 3 19:20:20 1993 Stu Grossman (grossman@cygnus.com) - - * sparclite/Makefile.in: Create default target that does nothing - in order to force user to build by hand. - - * sparclite/Makefile: Remove. It's not necessary anymore. - - * ser-unix.c (wait_for): New routine to handle read timeouts, - etc. Uses poll() if HAVE_TERMIO[S] is defined, select() otherwise. - -Mon May 3 13:52:08 1993 Ian Lance Taylor (ian@cygnus.com) - - * mips-pinsn.c (print_insn): Return value. - -Sun May 2 11:43:57 1993 Fred Fish (fnf@cygnus.com) - - * Makefile.in (SFILES): Remove ser-hardwire.c; it is a link made - at configuration time and doesn't belong in the distribution archive. - - * Makefile.in (NONSRC): Add 29k-share/README. - * Makefile.in (HFILES): Add 29k-share/udi/udiids.h. - - * defs.h (UINT_MAX, LONG_MAX, INT_MAX, INT_MIN): Replace hex - constants with slightly more portable definitions (still depends - on 2's complement arithmetic though). - * config/i386/nm-linux.h: Define NO_SYS_REG_H for no <sys/reg.h>. - * i386v-nat.c (sys/reg.h): Conditionalize include on - NO_SYS_REG_H. Linux doesn't have <sys/reg.h>. - * ser-unix.c (termio.h): Include <termio.h> like other files that - include termio.h, not <sys/termio.h> which may not exist (on - linux for example). - -Sat May 1 16:05:24 1993 Fred Fish (fnf@cygnus.com) - - * valprint.c (print_longest): Change format parameter from a - 'char' to an 'int'. We can't have 'char' parameters with the - current coding style, where we mix prototypes with pre-ANSI - style declarations. - * value.h (print_longest): Change format parameter in prototype - from a 'char' to an 'int'. - -Sat May 1 02:47:20 1993 Peter Schauer (pes@regent.e-technik.tu-muenchen.de) - - * config/mips/tm-mips.h (STAB_REG_TO_REGNUM): Match it with the gcc - definition. - * config/mips/tm-irix3.h (STAB_REG_TO_REGNUM): Add. - * irix4-nat.c (fill_fpregset): Fix bug with indexing into fpregsetp. - -Fri Apr 30 17:45:32 1993 Stu Grossman (grossman@cygnus.com) - - * The following patches are from Jeffrey Law <law@cs.utah.edu>. - * config/pa/hppabsd.mh: Add more files to NATDEPFILES. - * config/pa/xm-hppa[bh].h: Define FIVE_ARG_PTRACE. - * hppab-nat.c: Delete WANT_NATIVE_TARGET ifdefs. - ptrace needs 5 arguments, #define ptrace to always - pass zero as the 5th argument. - -Fri Apr 30 15:54:13 1993 Steve Chamberlain (sac@thepub.cygnus.com) - - * configure.in: Match z8k-*-sim for z8000. - * config/h8500/tm-h8500.h, h8500-tdep.c: Lint. - * remote-hms.c: Update to use new serial protocol. - -Fri Apr 30 16:50:38 1993 K. Richard Pixley (rich@rtl.cygnus.com) - - * mips-tdep.c: remove include of sys/dir.h. Doesn't seem - necessary and Solaris doesn't have it. - - * Makefile.in (clean-info, install, install-info, info, dvi, - check, all): do not echo recursion lines. - - * 29k-share/udip2soc.c (UDIConnect): replace union wait with int. - - * config/sparc/sun4sol2.mh (XM_CLIBS): add -lsocket which is - required target ports which use sockets (like a29k-udi). - - * remote-udi.c (udi_wait): Use SIGURG, as Solaris doesn't have SIGLOST. - -Fri Apr 30 11:05:42 1993 Jim Kingdon (kingdon@cygnus.com) - - * ser-unix.c [USE_{TERMIO,ALARM}_TIMEOUT]: New code to deal with - systems lacking select(). - - * Makefile.in (TAGS): Doc fix. Deal with empty DEPFILES. - -Fri Apr 30 10:06:46 1993 Fred Fish (fnf@cygnus.com) - - * alldeps.mak, depend: Update with latest automatically built - versions. - -Thu Apr 29 12:03:23 1993 Fred Fish (fnf@cygnus.com) - - * Makefile.in (SFILES): Add ser-unix.c and ser-go32.c. - - * Makefile.in (make-proto-testsuite.dir): New target to make - prototype testsuite tree. - - * Makefile.in (VERSION): Bump to 4.8.4. - -Thu Apr 29 08:46:22 1993 Jim Kingdon (kingdon@cygnus.com) - - * stabsread.c (define_symbol): If unrecognized constant type, - complain() not error(). - -Thu Apr 29 00:03:59 1993 Fred Fish (fnf@cygnus.com) - - * infptrace.c: Add missing close paren to test for - FIVE_ARG_PTRACE defined. - - * defs.h (CC_HAS_LONG_LONG): Set up to define CC_HAS_LONG_LONG - when compiling with gcc, but disable it for now. See comment. - * defs.h (LONGEST): Define as either "long" or "long long" - based on CC_HAS_LONG_LONG. - * defs.h (longest_to_int): Use CC_HAS_LONG_LONG to control - how longest_to_int is defined. - * c-valprint.c (c_val_print): Call print_longest. - * expprint.c (dump_expression): Use PRINTF_HAS_LONG_LONG - instead of LONG_LONG. - * {printcmd.c, gdbtypes.h} (LONG_LONG): Replace usages with - CC_HAS_LONG_LONG. - * printcmd.c (print_scalar_formatted): Call print_longest - and let it figure out what to do for PRINTF_HAS_LONG_LONG. - * typeprint.c (print_type_scalar): Call print_longest and let - it figure out what to do for PRINTF_HAS_LONG_LONG. - * valprint.c (val_print_type_code_int): Call print_longest - and let it figure out what to do for PRINTF_HAS_LONG_LONG. - * stabsread.c (LONG_LONG): Replace usages with CC_HAS_LONG_LONG. - * value.h (struct value): Replace usage of LONG_LONG with - CC_HAS_LONG_LONG. - * value.h (print_longest): Add prototype. - * values.c (LONG_LONG): Replace usages with CC_HAS_LONG_LONG. - * values.c (unpack_double): Collapse code that was unnecessarily - dependent on CC_HAS_LONG_LONG. Use LONGEST instead of direct types. - * values.c (value_from_longest): Remove dependency on - CC_HAS_LONG_LONG and just use LONGEST. - * solib.c (solib_map_sections): Use bfd_get_filename - to access filename field. - * solib.c (clear_solib): Save filename and free it later, after - bfd_close, since bfd_close may reference it. Use bfd_get_filename - to access the field. - * config/convex/xm-convex.h (LONG_LONG): Replace with - CC_HAS_LONG_LONG. Add define for PRINTF_HAS_LONG_LONG. - * doc/gdbint.texinfo (LONG_LONG): Replace with CC_HAS_LONG_LONG. - Add PRINTF_HAS_LONG_LONG references. - -Wed Apr 28 06:11:38 1993 Jim Kingdon (kingdon@cygnus.com) - - * inflow.c (kill_command), infcmd.c (attach_command), - remote.c (remote_interrupt_twice): In messages for the user, call it - "the program" or "the program being debugged" not "the inferior". - - * hp300ux-nat.c: Cast second arg to supply_register calls. - (_initialize_kernel_u_addr, getpagesize): New functions. - (store_inferior_register_1): Change arg name from value to val. - (fetch_core_registers): Make arg core_reg_size unsigned. - Pass 5 args to ptrace. - * config/m68k/xm-hp300hpux.h: Define FIVE_ARG_PTRACE. - Remove KERNEL_U_ADDR stuff. - * infptrace.c [FIVE_ARG_PTRACE]: Pass 5th arg to ptrace. - * config/m68k/hp300hpux.m{t,h}: - Move exec.o from NATDEPFILES to TDEPFILES - * config/m68k/hp300hpux.mt: Mention GAS requirement. Remove - hp-include stuff. Add m68k-tdep.o to TDEPFILES. - -Wed Apr 28 13:27:54 1993 Peter Schauer (pes@regent.e-technik.tu-muenchen.de) - - * ch-exp.y (yylex): Don't STREQ with simplename if it is NULL. - -Wed Apr 28 06:11:38 1993 Jim Kingdon (kingdon@cygnus.com) - - * config/sparc/xm-sun4os4.h [__STDC__]: Don't use MALLOC_INCOMPATIBLE. - -Wed Apr 28 11:39:18 1993 Roland H. Pesch (pesch@fowanton.cygnus.com) - - * doc/gdb.texinfo: make node "Shell Commands" unconditional; - describe `set demangle-style arm' (not cfront); - mention can type `q' to discard output, when gdb pages - -Wed Apr 28 11:32:39 1993 Peter Schauer (pes@regent.e-technik.tu-muenchen.de) - - * valops.c (search_struct_field): Fix gdb core dump with incomplete - stabs info. - -Wed Apr 28 06:11:38 1993 Jim Kingdon (kingdon@cygnus.com) - - * remote.c: Change timeout to 2. - (remote_open): Use unpush_target not remote_close. - (remote_resume): If siggnal != 0, give warning not error(). - (remote_wait, remote_interrupt, remote_interrupt_twice): - If we get two interrupts, let the user get out if they want. - (remote_{kill,mourn}): New functions. - i386-stub.c (handle_exception, case 'k'): Don't BREAKPOINT. - -Wed Apr 28 09:20:55 1993 Ian Lance Taylor (ian@rtl.cygnus.com) - - * config/sparc/sun4sol2.mh (XM_CLIBS): Define to be -lnsl. - -Wed Apr 28 06:11:38 1993 Jim Kingdon (kingdon@cygnus.com) - - * Remote targets (mourn): Call unpush_target. - - * config/sparc/xm-sun4os4.h: Declare free() to return int. - Remove twisted use of PARAMS. - - * config/rs6000/xm-rs6000.h: Don't define MALLOC_INCOMPATIBLE now - that ansidecl.h assumes ANSI on AIX. - -Tue Apr 27 10:01:33 1993 Jim Kingdon (kingdon@cygnus.com) - - * README: Move most stuff about hacking GDB to doc/gdbint.texinfo. - (Known bugs): Remove AIX bugs, revise SPARC struct bug description. - -Tue Apr 27 13:44:19 1993 Peter Schauer (pes@regent.e-technik.tu-muenchen.de) - - * expprint.c (print_subexp): Fix bug with OP_SCOPE operator output. - -Tue Apr 27 10:01:33 1993 Jim Kingdon (kingdon@cygnus.com) - - * remote-vx.c (net_connect): Allow numeric IP address for host. - -Mon Apr 26 17:59:38 1993 Steve Chamberlain (sac@thepub.cygnus.com) - - * config/sh/sh.mt, config/sh/tm-sh.h, sh-tdep.c: New files. - -Mon Apr 26 07:13:32 1993 Jim Kingdon (kingdon@cygnus.com) - - * rs6000-tdep.c (branch_dest): Deal with stepping through system call. - - * symtab.h, xcoffread.c: Revise linetable sorting comments. - -Sun Apr 25 02:32:16 1993 Peter Schauer (pes@regent.e-technik.tu-muenchen.de) - - * valops.c (value_cast): A cast might also change the object - representation in C++. - * dbxread.c (end_psymtab): Copy subpst read_symtab function from pst - to get the proper read_symtab function when called from mipsread.c. - * mipsread.c (mipscoff_psymtab_to_symtab, psymtab_to_symtab_1): - Set cur_bfd in psymtab_to_symtab_1 as CURBFD(pst) is invalid - for dummy psymtabs, inhibit processing of dummy psymtabs. - -Sat Apr 24 19:59:54 1993 Jim Kingdon (kingdon@cygnus.com) - - * Changes from (or inspired by) AMD: - * remote-udi.c (udi_attach): Assignments to Space and Offset were - switched, fix it. - (udi_wait): Make error message (UDIGetStdout) match error. - (udi_wait): Handle UDIStdinNeeded. - * command.c [CANT_FORK]: Use system(). - * utils.c (prompt_for_continue): Allow quit with 'q'. - - * solib.c (solib_add): Don't call special_symbol_handling if there - were errors in symbol_add_stub. Also set so->from_tty before - calling symbol_add_stub. - -Fri Apr 23 16:17:00 1993 Stu Grossman (grossman@cygnus.com) - - * Merge in HPPA/BSD patches from Utah: - * defs.h: Add const to 2nd arg of psignal prototype. - * hppah-tdep.c: Renamed to hppa-tdep.c 'cuz it's common code with - BSD now. - * hppab-core.c: Deleted. No longer useful. - * hppab-nat.c: #include more files. Use PT_WUREGS, not - PT_WRITE_U. - * hppab-tdep.c: Deleted. Supplanted by hppa-tdep.c. - * config/pa/hppabsd.mh (NATDEPFILES): Remove hppab-core.o. - * config/pa/hppabsd.mt (TDEPFILES): hppab-tdep.o => hppa-tdep.o - * config/pa/hppahpux.mt (TDEPFILES): hppab-tdep.o => hppa-tdep.o - * config/pa/xm-hppab.h: #define SET_STACK_LIMIT_HUGE. - -Fri Apr 23 10:34:02 1993 Stu Grossman (grossman@cygnus.com) - - * Fix two bugs found by deja-gnu. One is the incorrect reporting - of the PC being in a stack dummy when looking at a core file - without symbols. The other is the incorrect passing of char - arguments during expression evaluation (ie: p foo('a','b') would - mess up the passing of it's args because it wasn't coercing the - char's to ints). - * hppah-tdep.c: Rename global functions to have consistent hppa_ - prefix. Make more functions static. Drop hp_ prefix from static - functions. (hppa_push_arguments): Call value_arg_coerce to cast - char to int args if necessary. (hppa_fix_call_dummy): Create - this routine from FIX_CALL_DUMMY macro in tm-hppa.h. - * inferior.h (PC_IN_CALL_DUMMY): Check for frame_address being - valid (ie: != 0) before doing comparison against PC. - * valops.c (call_function_by_hand): Adjust call to FIX_CALL_DUMMY - to reflect new arguments. - * config/pa/tm-hppa.h (POP_FRAME, PUSH_ARGUMENTS): Use new hppa_ - prefix for func name. (FIX_CALL_DUMMY): Move code into - hppah-tdep.c. - - * testsuite/gdb.t16/gdbme.c, testsuite/gdb.t17/gdbme.c: Add calls - to malloc() so that we can test GDB eval of dynamically created - arrays (like char strings in `print "foo"'). - -Fri Apr 23 01:28:14 1993 Peter Schauer (pes@regent.e-technik.tu-muenchen.de) - - * printcmd.c (print_address_symbolic): Search symtabs as well as the - minimal symbols for a nearby symbol. - -Thu Apr 22 19:44:21 1993 John Gilmore (gnu@cacophony.cygnus.com) - - * coffread.c: Comment changes around minimal symbol recording. - -Thu Apr 22 16:24:36 1993 K. Richard Pixley (rich@rtl.cygnus.com) - - * command.c: comment changes only. - - * mips-tdep.c (heuristic_fence_post): new static variable. - (heuristic_proc_start): use heuristic_fence_post, print better - warnings, but only if not stop_soon_quietly. - (_initialize_mips_tdep): add_set_cmd for heuristic-fence-post. - -Thu Apr 22 14:50:05 1993 Jim Kingdon (kingdon@cygnus.com) - - * symtab.h: Fix LOC_REF_ARG comment. - -Wed Apr 22 20:21:30 1993 Peter Schauer (pes@regent.e-technik.tu-muenchen.de) - and Jim Kingdon (kingdon@cygnus.com) - - * stabsread.c (define_symbol): Combine a 'p', 'r' arg pair to a - LOC_REGPARM symbol. - * config/sparc/tm-sparc.h (REG_STRUCT_HAS_ADDR): Revise comments. - symfile.c (compare_symbols): Don't check first character; STRCMP - does that. - - * stabsread.c (define_symbol): Generate a LOC_REGPARM_ADDR for - structures that are passed by address in a register. - * symtab.h (enum address_class): Add LOC_REGPARM_ADDR. - * findvar.c (read_var_value), - printcmd.c (address_info, print_frame_args), - stack.c (print_frame_arg_vars), symmisc.c (print_{,partial_}symbol), - * symtab.c (lookup_block_symbol): Deal with it. - -Thu Apr 22 09:07:24 1993 Jim Kingdon (kingdon@cygnus.com) - - * objfiles.h (obj_section), objfiles.c (build_objfile_section_table): - Add objfile field. - * objfiles.c (find_pc_section): Return a struct obj_section *. - * sparc-tdep.c (in_solib_trampoline): Deal with find_pc_section return. - * symfile.c (syms_from_objfile) [IBM6000_TARGET]: - Don't use obj_section hack. - * xcoffexec (vmap_symtab): Relocate obj_sections. - * printcmd.c (containing_function_bounds): Use find_pc_section. - - * symtab.h: Clean up SYMBOL_VALUE comments. - -Wed Apr 21 14:29:57 1993 Jim Kingdon (kingdon@cygnus.com) - - * stack.c (print_frame_arg_vars), printcmd.c (print_frame_args): - Expand comments about LOC_ARG/LOC_LOCAL pairs. - - * coffread.c (read_coff_symtab): Use rewind before fseek. - -Wed Apr 21 14:24:19 1993 Per Bothner (bothner@cygnus.com) - - * ch-exp.y: Removed unused structure_primitive_value and FIXME_23. - * Makefile.in: Add $(YFLAGS) when using $(YACC). - * Makefile.in: Remove message to expect conflicts and unused - rules in ch-exp.y, since there no longer are any such. - -Wed Apr 21 13:27:50 1993 david d `zoo' zuhn (zoo at cirdan.cygnus.com) - - * stabs.texinfo: fixed bad xrefs (un-initialized statics) - -Tue Apr 20 08:55:11 1993 Jim Kingdon (kingdon@cygnus.com) - - * xcoffexec.c (xcoff_relocate_core): If no exec file, error() - rather than dumping core. - - * Makefile.in: Add ${srcdir}/ to all source files. - (alldeps.mak): Add "${srcdir}/" to files when generating alldeps.mak. - (TAGS): Deal with srcdir and new config directory scheme. - createtags: Remove. - Makefile.in (NONSRC): Remove createtags. - alldeps.mak: Updated. - - * rs6000-tdep.c: Delete unused function print_frame. - - * frame.h (struct frame_info): Doc fix for next_frame. - New field signal_handler_caller. - blockframe.c (create_new_frame, get_prev_frame_info), - config/rs6000/tm-rs6000.h (INIT_EXTRA_FRAME_INFO): Set it (needs - INIT_FRAME_PC_FIRST). - stack.c (print_frame_info), rs6000-tdep.c (rs6000_frame_chain): - Check it. - -Mon Apr 19 22:52:33 1993 Stu Grossman (grossman@cygnus.com) - - * irix4-nat.c (fetch_core_registers): Special version of this for - Irix 4.x, which stores regs a bit differently from other /proc - based systems. - * procfs.c, core-svr4.c: Move fetch_core_registers from procfs.c - to new file core-svr4.c. - * config/i386/i386sol2.mh, config/i386/i386v4.mh, config/m68k/amix.mh, - config/i386/ncr3000.mh, config/sparc/sun4sol2.mh: Add core-svr4.o - to NATDEPFILES. - * config/mips/irix4.mh: Add corelow.o to NATDEPFILES. - -Mon Apr 19 11:13:34 1993 Jim Kingdon (kingdon@cygnus.com) - - * i387-tdep.c: Remove unused #includes. - - * configure.in: Match i[34]86-*-sysv3.2 not i[34]86-*-sysv32. - - * config/i386/nm-i386v.h: Define NO_PTRACE_H. - -Sun Apr 18 10:39:35 1993 Jim Kingdon (kingdon@cygnus.com) - - * xcoffread.c: Nuke NO_DEFINE_SYMBOL code. There is no going back. - - * stabsread.c (define_symbol): 'R' is synonym for 'P', not 'r'. - xcoffread.c (process_xcoff_symbol, case C_RPSYM): - Don't muck with SYMBOL_CLASS. - -Fri Apr 16 17:38:33 1993 Stu Grossman (grossman@cygnus.com) - - * munch: Don't use head command. It doesn't exist everywhere. - -Fri Apr 16 15:07:57 1993 Fred Fish (fnf@cygnus.com) - - * inflow.c (new_tty): Remove spurious 'o' character at end - of #endif line. - -Fri Apr 16 12:27:11 1993 Peter Schauer (pes@regent.e-technik.tu-muenchen.de) - - * mips-tdep.c (mips_skip_prologue): Always skip the typical prologue - instructions and nothing more. - * mipsread.c (add_line): Add comment why we have to combine line number - entries for the same line number. - -Fri Apr 16 09:42:03 1993 Jim Kingdon (kingdon@cygnus.com) - - * symtab.{c,h}: Doc fixes (remove symseg references, last relevant - in gdb 2.8!). - -Thu Apr 15 21:16:58 1993 Fred Fish (fnf@cygnus.com) - - * depend, alldeps.mak: Update, now that gcc -MM bug is fixed. - -Thu Apr 15 12:38:39 1993 Jim Kingdon (kingdon@cygnus.com) - - * source.c (select_source_symtab): Clean up comment. Also, if - we have a current_source_symtab, and s is NULL, return without - doing anything. - xcoffread.c (xcoff_symfile_read): Don't call select_source_symtab. - breakpoint.c (breakpoint_re_set): Don't call select_source_symtab. - -Thu Apr 15 02:37:48 1993 John Gilmore (gnu@cacophony.cygnus.com) - - * dbxread.c (unknown_symchar_complaint): Add new complaint. - * stabsread.h: Declare it. - * partial-stab.h: Use it. - - * utils.c (malloc_botch): Don't forward-declare if NO_MMALLOC. - -Wed Apr 14 17:12:51 1993 Jim Kingdon (kingdon@cygnus.com) - - * stack.c (print_frame_info): Print specially if dummy frame. - - * breakpoint.c: Add comments regarding within_scope future direction. - - * Version 4.8.3. - - * xcoffread.c (record_include_{begin,end}): Change fatal to complain. - -Wed Apr 14 14:03:18 1993 Per Bothner (bothner@cygnus.com) - - * ch-exp.y: Fix thinko that broke parsing of FALSE. - -Wed Apr 14 12:49:29 1993 Peter Schauer (pes@regent.e-technik.tu-muenchen.de) - - * stabsread.c (read_member_functions): Initialize domain for stubbed - member functions to avoid gdb core dumps when printing pointers - to member functions. - * cp-valprint.c (cp_print_class_method): Check for stubbed member - functions. - -Tue Apr 13 08:28:26 1993 Jim Kingdon (kingdon@cygnus.com) - - * expprint.c (print_subexp): If opcode not found in op_print_tab, - stop with an error(). - eval.c (evaluate_subexp): Change error message. - - * objfiles.c (build_objfile_section_table): Cast return value - from obstack_finish. - -Mon Apr 12 10:53:50 1993 Jim Kingdon (kingdon@cygnus.com) - - * config/rs6000/tm-rs6000.h, rs6000-tdep.c: Move FRAME_CHAIN - to rs6000_frame_chain and deal with it if we're in a signal handler. - (FRAME_SAVED_PC): Use rs6000_frame_chain. - - * breakpoint.c (within_scope): New function. - (enable_breakpoint, watchpoint_check): Use it. - - * source.c (openp): Handle "exec-file ./ls" correctly. - - * breakpoint.c (breakpoint_1): Use wrap_here before "at". - -Sat Apr 10 01:32:43 1993 Per Bothner (bothner@rtl.cygnus.com) - - * ch-exp.y: Clean up lexing of identifiers and - reserved words. (E.g. don't recognize FALSEXXX as the - keyword FALSE followed by the identifier XXX.) - Also, convert identifiers to lower case. - -Fri Apr 9 15:53:19 1993 Stu Grossman (grossman@cygnus.com) - - * remote-mips.c, remote-monitor.c, remote-st2000.c: Convert to - new serial interface. - -Fri Apr 9 15:01:12 1993 Stu Grossman (grossman@cygnus.com) - - * remote.c (remote_open): Use SERIAL_OPEN instead of serial_open. - (putpkt, getpkt): Use new return codes for SERIAL_READCHAR. - * ser-go32.c: Return -1 on most failures, 0 on most successes, - and use new return codes for go32_readchar(). - * ser-unix.c: Ditto. Also, move error handling up to caller for - SERIAL_SETBAUDRATE(). - * serial.c (serial_open): Internal call, not SERIAL_OPEN to get - to specific routine. - (serial_close): New routine to wrap around device close routine. - serial.h: Clean & document return values more clearly. - -Fri Apr 9 10:20:55 1993 Jim Kingdon (kingdon@cygnus.com) - - * rs6000-pinsn.c (print_operand): Deal with no operand instructions. - - * rs6000-pinsn.c (print_operand, case LI): Print condition register - operand in decimal rather than wrong textual versions. - - * printcmd.c (_initialize_printcmd): Clean up docstring for "x" - (mention 't', remove false thing about 'g' only good with 'f'). - - * breakpoint.h: move "struct breakpoint" and friends to top of - file so that bpstat_find_breakpoint prototype works. - - * solib.c (struct so_list): Add bfd field. - (solib_map_sections): Leave bfd open and scratch_pathname allocated. - Put the bfd in bfd field of the so_list. - (clear_solib): Free bfd name and close_bfd on the bfd. - -Fri Apr 9 00:45:41 1993 Per Bothner (bothner@rtl.cygnus.com) - - * valarith.c (value_subscript): Add COERCE_REF. - * ch-exp.y (operand_5): We can generalize the 2nd operand - of a string repetition ot 'literal' without ambiguity. - -Thu Apr 8 10:15:10 1993 Jim Kingdon (kingdon@lioth.cygnus.com) - - * breakpoint.h (struct bpstat): Remove momentary field. - Remove bpstat_momentary_breakpoint. This was always kludgy - and is no longer used. - - * breakpoint.h: Add enum bpstat_what. - breakpoint.h (struct bpstat), breakpoint.c (bpstat_stop_status): - stop and print fields of bpstat now per-breakpoint, not just - one for the whole chain. - breakpoint.{c,h} (bpstat_what): New function. - breakpoint.h: Remove bpstat_stop and bpstat_should_print. - infrun.c: Replace switch (stop_bpstat->breakpoint_at->type) - with call to bpstat_what. - README: Remove watchpoint/breakpoint bug from known bugs. - - * breakpoint.h: Prototype bpstat_find_breakpoint. - -Thu Apr 8 16:01:21 1993 Fred Fish (fnf@cygnus.com) - - * symtab.c (find_methods, gdb_mangle_name): Note that functions - are g++ specific. - * symtab.h (VTBL_FNADDR_OFFSET, OPNAME_PREFIX_P, VTBL_PREFIX_P, - DESTRUCTOR_PREFIX_P): Note that macros are g++ specific. - -Thu Apr 8 12:45:32 1993 Ian Lance Taylor (ian@cygnus.com) - - * i960-pinsn.c (tabent): Copied struct definition from - opcodes/i960-dis.c. - -Thu Apr 8 10:34:37 1993 Peter Schauer (pes@regent.e-technik.tu-muenchen.de) - - * symtab.h (DESTRUCTOR_PREFIX_P): New macro to check if physname - is a C++ destructor. - * symtab.c (gdb_mangle_name): Use it. - * symtab.c (find_methods): Do not add destructors to choice list - for constructors. - * symtab.c (decode_line_1): Make breakpoints on destructors work - for gcc-2.x again. - -Wed Apr 7 18:43:09 1993 Stu Grossman (grossman@cygnus.com) - - * ser-go32.c: Make it use serial port name. - * go32-xdep.c: Put in def for strlwr, needed by dir.o in go32 libc. - - * infcmd.c (read_pc): Make sure that we read PC_REGNUM when not - in a system call! - -Wed Apr 7 15:52:11 1993 Stu Grossman (grossman@cygnus.com) - - * configure.in: Only configure sparclite subdir when target_cpu - is sparclite. - -Wed Apr 7 10:11:22 1993 Jim Kingdon (kingdon@cygnus.com) - - * xcoffread.c (struct coff_symbol): Change c_sclass to unsigned char. - Remove FIXME comment regarding this. - - * symfile.h: Change NULL->'\0' in comment (that wasn't a typo). - - * xcoffread.c (read_xcoff_symtab): Use E_SYMNMLEN. - -Tue Apr 6 22:30:58 1993 K. Richard Pixley (rich@cygnus.com) - - Add section table to objfile struct. Use it for find_pc_section. - * objfiles.c (add_to_objfile_sections, - build_objfile_section_table, find_pc_section): new functions. - (allocate_objfile): build section table. - * objfiles.h (struct obj_section): new structure. - (struct objfile): add section table. - (find_pc_section): new prototype. - * solib.[ch] (find_pc_section_from_so_list): removed. - * sparc-tdep.c: include objfiles.h for find_pc_section. include - symfile.h for objfiles.h. - (in_solib_trampoline): adjusted for new find_pc_section - prototype. Removed BAD_RICH_HACK ifdefs. - * symfile.c (syms_from_objfile): offset objfile sections. - (find_pc_section): removed. Also removed BAD_RICH_HACK ifdefs. - * symfile.h (find_pc_section): prototype removed. Also fixed - comment typo NUL -> NULL. - * target.[ch] (find_pc_section_from_targets): removed. - * config/sparc/tm-sun4sol2.h (BAD_RICHH_HACK): removed. - -Tue Apr 6 21:41:13 1993 Stu Grossman (grossman@cygnus.com) - - * ser-go32.c: Format. (go32_open): Use proper return value. - - * configure.in: Undo conditional configdirs hack for sparclite. - -Tue Apr 6 17:07:37 1993 Jim Wilson (wilson@sphagnum.cygnus.com) - - * symtab.c (list_symbols): When call break_command, pass both - filename and function name not just function name. - -Tue Apr 6 15:00:09 1993 Fred Fish (fnf@cygnus.com) - - (Changes and new files to make "none" a full fledged configuration) - * config/none/{nm-none.h, tm-none.h, xm-none.h}: New files. - Currently only tm-none.h has any meaningful contents. - * config/none/none.mh (NAT_FILE): Use nm-none.h - * config/none/none.mh (XM_FILE): Use xm-none.h - * config/none/none.mt (TM_FILE): Use tm-none.h - * Makefile.in (depend): Remove comment about parse errors in - valops.c, it now parses correctly and generates a correct depend - line. Remove line that touches xm.h, tm.h, and nm.h; they are - now linked to config/none/{xm-none.h, tm-none.h, nm-none.h}. - -Tue Apr 6 09:54:29 1993 Jim Kingdon (kingdon@cygnus.com) - - * values.c (USE_STRUCT_RETURN): Only use gcc wierdness for gcc1. - - * xcoffread.c (read_xcoff_symtab): Deal correctly with symbols of - exactly 8 characters. - -Tue Apr 6 10:31:26 1993 Stu Grossman (grossman@cygnus.com) - - * configure.in: Sparclite uses sparc config dir. Also has it's - own tm- & .mt files now. Also add sparclite to configdirs. - * go32-xdep.c: Dummy routines for sigsetmask & strlwr. - * config/i386/go32.mh: Nullify def of TERMCAP. - * config/i386/xm-go32.h: Get rid of redef of EIO. - * config/sparc/{sparclite.mh tm-sparclite.h}: New sparclite - specific configs. Very similar to sun4os4, but without solib. - * sparclite/{Makefile.in configure.in}: First cut at making this - dir configgable. - -Tue Apr 6 03:10:44 1993 Stu Grossman (grossman@cygnus.com) - - * ser-go32.c: First cut at adapting to new serial interface. - -Mon Apr 5 22:29:43 1993 Stu Grossman (grossman@cygnus.com) - - * Makefile.in (SFILES OBS): Add serial.[co] & ser-hardwire.[co]. - These implement a new serial line interface for talking to remote - targets. - * configure.in: Link ser-hardwire.c to ser-unix.c for all hosts, - EXCEPT go32, which gets ser-go32.c. - * remote.c: Use new serial interface. More remote-xxx's to be - converted later. - * ser-bsd.c, ser-termios.c: Removed. - * serial.c: New. Implements common operations for all serial - types. - * ser-unix.c: New. Unix specific serial operations for various - flavors of Unix (Posix, SysV, BSD). - * serial.h: Generic serial interface defs. - * config/i386/go32.mh, config/i386/i386bsd.h, - config/m68k/apollo68b.mh, config/sparc/sun4os4.mh: Remove - ser-bsd.o from XDEPFILES. All the magic is now handled in - configure.in. - -Mon Apr 5 20:48:54 1993 Stu Grossman (grossman@cygnus.com) - - * config/h8500/tm-h8500.h: Clean up brain damage found by GCC. - -Fri Apr 2 08:23:14 1993 Jim Kingdon (kingdon@cygnus.com) - - * xcoffread.c (xcoff_symfile_offsets): Use 0 not addr for offsets. - - * rs6000-tdep.c (frameless_function_invocation): Don't even think - about framelessness except on the innermost frame. - - * xcoffexec.c: Call fatal() not abort(). - - * stabsread.c (patch_block_stabs): If stab & no symbol, make - a LOC_OPTIMIZED_OUT symbol. - symtab.h (enum address_class): Add LOC_OPTIMIZED_OUT. - findvar.c (read_var_value), printcmd.c (address_info), - symmisc.c (print_{,partial_}symbol), c-exp.y (variable), - m2-exp.y (yylex): Deal with it. - ch-exp.y (yylex): Deal with it. - -Thu Apr 1 18:43:02 1993 Stu Grossman (grossman@cygnus.com) - - * findvar.c (value_from_register): H8500 specific, check to see - if we are looking at short pointer. If so, skip crock. - * h8500-tdep.c (h8500_frame_chain): Mask down value from - read_memory_integer() to avoid getting messed up by sign extension. - -Thu Apr 1 16:44:41 1993 K. Richard Pixley (rich@rtl.cygnus.com) - - * sparc-tdep.c (in_solib_trampoline), symfile.c (find_pc_section): - ifdef protect using BAD_RICH_HACK. This should be removed soon. - * config/sparc/tm-sun4sol2.h (BAD_RICH_HACK): define. - -Thu Apr 1 09:01:38 1993 Jim Kingdon (kingdon@cygnus.com) - - * i960-pinsn.c, a29k-pinsn.c: Much abridged, just use libopcodes.a. - - * core.c (dis_asm_print_address): New function. - - * core.c (dis_asm_read_memory): Reinstate 4th arg. The prototype - has been fixed. - -Thu Apr 1 09:34:43 1993 Peter Schauer (pes@regent.e-technik.tu-muenchen.de) - - * breakpoint.c (bpstat_print, bpstat_stop_status): Change to walk the - entire breakpoint chain and print only the first entry that needs to - be printed and needs to be stopped for. Fixes problems with printing - of multiple breakpoints with different conditions. - * breakpoint.c (print_it_done): Renamed from print_it_noop as it - effectively stops printing of the breakpoint chain. - * breakpoint.c (print_it_noop): New routine to print nothing - for this breakpoint entry and dont stop printing. - * breakpoint.c (breakpoint_re_set_one): mention the reevaluated - watchpoint only if it is enabled. - * mipsread.c (parse_procedure): Correct incorrect setjmp procedure - descriptor from the library to make backtraces through setjmp work. - * mipsread.c (fixup_sigtramp): Correct pcreg and fregoffset for - sigtramp. - * mips-tdep.c (read_next_frame_reg): Provide correct values for - all registers saved within sigtramp, cleanup. - -Wed Mar 31 12:52:12 1993 Jim Kingdon (kingdon@lioth.cygnus.com) - - * sparc-pinsn.c: Much abridged, just calls version in libopcodes.a. - -Wed Mar 31 21:23:41 1993 K. Richard Pixley (rich@rtl.cygnus.com) - - * core.c (dis_asm_read_memory): drop fourth arg which conflicts - with prototype in ../include/dis-asm.h. - -Wed Mar 31 12:52:12 1993 Jim Kingdon (kingdon@lioth.cygnus.com) - - * core.c (dis_asm_{read_memory,memory_error}): New functions. - m68k-pinsn.c, h8500-tdep.c, i386-pinsn.c, mips-pinsn.c, z8k-tdep.c: - Use read_memory_func interface to disassembler. - -Tue Mar 30 15:46:14 1993 K. Richard Pixley (rich@rtl.cygnus.com) - - Teach sparc solaris to next over shared library functions. - * solib.[hc] (find_pc_section_from_so_list): new function and - prototype. - * sparc-tdep.c (in_solib_trampoline): new function. - * symfile.[hc] (find_pc_section): new function and prototypes. - * target.[hc] (find_pc_section_from_targets): new function and - prototypes. - * config/sparc/tm-sun4sol2.h (IN_SOLIB_TRAMPOLINE): redefine to - in_solib_trampoline. - -Tue Mar 30 08:06:24 1993 Jim Kingdon (kingdon@cygnus.com) - - * infrun.c (wait_for_inferior): Revise comment. - - * command.c (do_setshow_command): Use %u with var_{u,z}integer. - - * command.{c,h}: New var_type var_integer. - main.c: Use it for history_size. - - * rs6000-tdep.c, xcoffexec.c, config/rs6000/xm-rs6000.h, breakpoint.c: - Lint and byte-order fixups. - - * breakpoint.c (print_it_normal): Return 0 after hitting watchpoint. - - * breakpoint.h (bpstat): New field print_it. - breakpoint.c (bpstat_print): Use it. - (print_it_normal): New function (from old bpstat_print code). - (bpstat_{alloc,stop_status}): Set print_it field. - - * breakpoint.c (bpstat_stop_status): Use catch_errors when - evaluating watchpoint condition, via new function watchpoint_check. - Also stop if watchpoint disabled due to leaving its block. - - * findvar.c [REG_STRUCT_HAS_ADDR]: Add comment. - -Tue Mar 30 00:14:38 1993 Peter Schauer (pes@regent.e-technik.tu-muenchen.de) - - * mips-pinsn.c: Add missing include of dis-asm.h. - -Mon Mar 29 15:03:25 1993 Fred Fish (fnf@cygnus.com) - - * Makefile.in (clean, distclean, realclean): Recursively apply - to subdirs first, rather than last. This avoids, for example, - Makefile being removed in a parent directory before the recursive - make is run. - - * alldeps.mak, depend: Update for below changes. - - * config/m68k/tm-m68k.h: Renamed from config/m68k/tm-68k.h. - * m68k/{tm-3b1.h, tm-altos.h, tm-amix.h, tm-es1800.h, - tm-hp300bsd.h, tm-hp300hpux.h, tm-isi.h, tm-news.h, tm-os68k.h, - tm-st2000.h, tm-sun2.h, tm-sun3.h, tm-vx68.h}: Include tm-m68k.h - instead of tm-68k.h. - * Makefile.in (HFILES): tm-68k.h renamed to tm-m68k.h. - * README, a29k-pinsn.c, m68k-pinsn.c, m68k-stub.c, remote-vx.c, - m68k/{altos.mh, altos.mt, apollo68b.mh, nm-apollo68b.h, - nm-hp300bsd.h, config/m68k/xm-apollo68b.h}: Map '68k' to 'm68k'. - * a29k/tm-a29k.h, doc/gdbint.texinfo: Account for renaming of - tm-68k.h to tm-m68k.h. - * m68k/m68k-fp.mt (TM_FILE): tm-68k-fp.h renamed to tm-m68k-fp.h. - * m68k/m68k-nofp.mt (TM_FILE): tm-68k-nofp.h renamed to - tm-m68k-nofp.h. - - * config/a29k/tm-a29k.h: Renamed from config/a29k/tm-29k.h. - * a29k-pinsn.c: Renamed from am29k-pinsn.c. - * a29k-tdep.c: Renamed from am29k-tdep.c. - * remote-eb.c, config/a29k/tm-ultra3.h: Include renamed tm-a29k.h. - * remote-monitor.c, remote-st2000.c, config/a29k/{nm-ultra3.h, - tm-a29k.h, xm-ultra3.h}, config/romp/rtbsd.mh, doc/gdbinv-s.texi, - testsuite/gdb.t15/funcargs.exp, testsuite/gdb.t17/callfuncs.exp: - Map '29k' to 'a29k'. - * config/a29k/{a29k-kern.mt, a29k-udi.mt, a29k.mt, ultra3.mt} - (TDEPFILES): Use renamed a29k-pinsn.o and a29k-tdep.o. - * config/a29k/{a29k-udi.mt, a29k.mt} (TM_FILE): Use renamed - tm-a29k.h. - * config/a29k/a29k-udi.mt (MT_CFLAGS): Remove TARGET_AM29K - define that does not appear anywhere else in the gdb source tree. - * doc/gdbinit.texinfo: Document renaming of tm-29k.h to tm-a29k.h. - -Mon Mar 29 13:55:29 1993 Jim Kingdon (kingdon@cygnus.com) - - * breakpoint.c: Add comments regarding breakpoint_re_set. - - * xcoffread.c (sort_syms, compare_symbols): Remove. - (xcoff_symfile_read): Use sort_all_symtab_syms from symfile.c - not our own sort_syms (it is identical). - - * xcoffread.c: Nuke NAMES_HAVE_DOT define (not used). - -Sun Mar 28 11:24:37 1993 Peter Schauer (pes@regent.e-technik.tu-muenchen.de) - - * breakpoint.c (breakpoint_re_set_one): Fix storage leak. - * breakpoint.c (enable_breakpoint): Don't enable watchpoint if it - went out of scope. - * exec.c (exec_close): Fix storage leak. - * exec.c (exec_file_command): Make sure that bfd doesn't realign the - output sections when patching an executable. - * mips-nat.c (store_inferior_registers): Use REGISTER_PTRACE_ADDR - when writing all registers. - * mips-tdep.c (mips_push_dummy_frame): Save floating point registers - at the right offset in the dummy frame. - * mipsread.c (psymtab_to_symtab_1): Do not complain for stProc, - stStaticProc and stEnd symbols as they are generated by gcc-2.x. - * mipsread.c (mipscoff_new_init): Initialize stabsread and buildsym. - -Fri Mar 26 15:25:05 1993 John Gilmore (gnu@cygnus.com) - - * Makefile.in (TARFILES): Avoid trailing backslash. - -Fri Mar 26 11:29:30 1993 Jim Kingdon (kingdon@cygnus.com) - - * breakpoint.{c,h}: Add exp_string to struct breakpoint and use - it in breakpoint_re_set. - * breakpoint.c (watch_command, enable_breakpoint): Fetch lazy values. - - * rs6000-tdep.c (single_step): Misc cleanups (CORE_ADDR not int, - don't use sizeof(int) for target stuff, etc). - -Thu Mar 25 15:03:53 1993 Fred Fish (fnf@cygnus.com) - - * alldeps.mak, configure.in, i860-break.h, i860-opcode.h, - i860-pinsn.c, i860-tdep.c, config/i860/*: Remove incomplete i860 - support that can't be integrated anyway due to lack of clear - authorship. - -Thu Mar 25 12:26:50 1993 Stu Grossman (grossman@cygnus.com) - - * findvar.c (read_register, write_register): Make these capable - of reading/writing registers that are shorter than REGISTER_TYPE. - * (value_from_register): Install H8500 specific code to return - proper value when register is being used as a pointer. - * h8500-tdep.c: Remove extra defines of NUM_REGS. - (h8500_skip_prologue): Use correct lengths for LINK instructions. - (FRAME_CHAIN): Change name to h8500_frame_chain. Rewrite code to - chain frames properly by combining frame pointer with T reg. - (init_extra_frame_info): Delete. It's now a macro. - (frame_args_address): Don't add PTR_SIZE. Stack args are already - offset by the correct amount off of the frame pointer. - (register_byte): Delete. It's now a macro. - (register_raw_size, register_virtual_size): Delete. Replaced by - common routine h8500_register_size, cuz there's no difference - between the raw & virtual sizes on this machine. - (register_convert_to_raw, register_convert_to_virtual): Delete, - cuz there's no difference between the raw & virtual forms. - Replaced by memcpy in tm file. - (register_virtual_type): Rename to h8500_register_virtual_type. - Get rid of pointer pseudo-regs, use _REGNUM with all reg names. - (_initialize_h8500_tdep): Get rid of crock to ensure that GDB & - emulator have same reg offsets. This is all handled in the - simulator code now. - (h8500_trapped_internalvar): New routine to detect references to - convenience vars acting as pointer pseudo-regs. - (h8500_value_trapped_internalvar): Conjure up value of pointer - pseudo-regs. - (h8500_set_trapped_internalvar): Convert set value in real - register references. - infcmd.c (read_pc, write_pc): Add h8500 specific code to handle - code segment register. - infrun.c (proceed): Simplify. Call write_pc instead of doing it - by hand. - (wait_for_inferior): Add h8500 specific code to add stack segment - when reading SP register. - remote-sim.c (fetch_register): Spacing. - tm-h8500.h: #define GDB_TARGET_IS_H8500 to make it easier to - detect cruft. Redo all register manipulation stuff. Get rid of - pointer pseudo-regs. (INIT_EXTRA_FRAME_INFO): Adds stack segment - to frame pointer. (IS_TRAPPED_INTERNALVAL, - VALUE_OF_TRAPPED_INTERNALVAR, SET_TRAPPED_INTERNALVAR): Use these - to create internal vars for pointer pseudo-regs. - -Thu Mar 25 10:10:28 1993 Fred Fish (fnf@cygnus.com) - - * Makefile.in: Numerous small changes to macro definitions - and rules for building gdb distribution tree. Many macros - eliminated or merged, and rules simplified. - * alldeps.mak: Update. - * depend: Update. - -Wed Mar 24 13:52:29 1993 david d `zoo' zuhn (zoo at poseidon.cygnus.com) - - * Makefile.in: recurse through SUBDIRS for dvi target too - -Wed Mar 24 08:48:30 1993 Jim Kingdon (kingdon@cygnus.com) - - * Clean up xcoff relocation. - objfiles.h (struct objfiles): Add section_offsets, num_sections. - symfile.c (syms_from_objfile), xcoffread.c (xcoff_symfile_offsets): - Set them. - symtab.h (struct general_symbol_info): Add section field. - minsyms.c (prim_record_minimal_symbol{,_and_info}): Set it. - xcoffread.c: Set section for symbols and msymbols. - (struct symtab): Add block_line_section field. - buildsym.c (end_symtab): Set it. - (end_symtab and callers): Add section parameter. - objfiles.c (objfile_relocate): New funciton. - xcoffexec.c (vmap_symtab): Use it. - xcoffsolib.h (struct vmap): Remove unused fields. - config/rs6000/tm-rs6000.h, stack.c, xcoffexec.c: Remove - CORE_NEEDS_RELOCATION, symtab_relocated. - config/rs6000/tm-rs6000.h: Remove use of loadinfotext. - rs6000-tdep.c: Make loadinfotext static. - breakpoint.c (fixup_breakpoints): Doc fix. - symtab.h (struct symtab), config/rs6000/tm-rs6000.h, buildsym.c - (end_symtab): primary field replaces nonreloc. - -Tue Mar 23 00:10:53 1993 John Gilmore (gnu@cygnus.com) - - * symtab.h (struct linetable_entry): Remove confusing comment. - -Tue Mar 23 00:01:23 1993 david d `zoo' zuhn (zoo at cirdan.cygnus.com) - - * Makefile.in: add installcheck target - -Mon Mar 22 16:17:58 1993 Fred Fish (fnf@cygnus.com) - - * config/{a29k, arm, convex, gould, h8300, i386, i860, i960, m68k, - m88k, mips, none, ns32k, pa, pyr, romp, rs6000, sparc, tahoe, vax, - z8k}: New directories to hold cpu specific configuration files. - Naming follows gcc convention. - * config/{*.mt, *.mh}: All target and host makefile fragment - config files moved to an appropriate config/<cpu> subdirectory. - * nm-*, xm-*, tm-*: All native, host, and target files, which - get linked to nm.h, xm.h, and tm.h respectively by configure, - moved to appropriate config/<cpu> subdirectory. - * nm-sysv4.h, xm-sysv4.h, tm-sysv4.h, tm-sunos.h, nm-trash.h: - Native, host, and target files that are common across more than - one cpu architecture and included by one of the configured - native, host, or target files, get moved to config directory. - * Makefile.in (INCLUDE_CFLAGS): Add -I${srcdir}/config to - pick up native, host, or target include files moved to one of - the config subdirectories, and that are included by other files. - * Makefile.in (alldeps.mak): Modify to account for new config - directory structure. - * alldeps.mak, depend: Update for new config directory structure. - * config/*/[ntx]m-*.h: Modify all files that include other - [ntx]m-*.h files to use path relative to gdb/config. I.E. - "a29k/tm-ultra3.h" includes "a29k/tm-29k.h" rather than just - "tm-29k.h". - * remote-eb.c (tm-29k.h): Include a29k/tm-29k.h. - * mipsread.c (tm-mips.h): Include mips/tm-mips.h. - * i860-pinsn.c (tm-i860.h): Include i860/tm-i860.h. - * configure.in: Default gdb_host_cpu to host_cpu, and remap - the ones where the default is not unique or different than the - config subdirectory name. Similarly, handle gdb_target_cpu. - Modify configure.in as appropriate to make use of gdb_host_cpu - and gdb_target_cpu to find makefile fragments and make links. - -Mon Mar 22 12:36:24 1993 Ian Lance Taylor (ian@cygnus.com) - - * mipsread.c (compare_blocks): Sort blocks with the same start - address by decreasing ending address. - -Mon Mar 22 20:36:04 1993 Peter Schauer (pes@regent.e-technik.tu-muenchen.de) - - * mipsread.c (parse_procedure): Save cur_fdr accross call to - lookup_symbol as it might get clobbered by the call. - - * mipsread.c (parse_partial_symbols): Use ADD_PSYMBOL_ADDR_TO_LIST. - The previous code did not initialize the language field for the psymtab - entry. - -Sat Mar 20 00:33:39 1993 John Gilmore (gnu@cygnus.com) - - * c-exp.y (parse_number): Avoid shift warning. - * serial.h (struct ttystate): Declare empty one on DOS. - -Fri Mar 19 12:59:50 1993 Stu Grossman (grossman@cygnus.com) - - * xm-sun4os4.h: Return type of free() should be void, not int. - - * vx-share/vxWorks.h: Remove #def of NULL. - -Fri Mar 19 11:28:18 1993 Jim Kingdon (kingdon@cygnus.com) - - * tm-rs6000.h: Nuke no-op STAB_REG_TO_REGNUM. - -Fri Mar 19 07:40:09 1993 Steve Chamberlain (sac@cygnus.com) - - * z8k-tdep.c (print_insn): Include the new dis-asm header file. - -Thu Mar 18 14:26:57 1993 Per Bothner (bothner@rtl.cygnus.com) - - * ieee-float.c: Moved to ../libiberty. - * ieee-float.h: Moved to ../include. - * Makefile.in: Update accordingly. - * i386-pinsn.c (print_insn), m68k-pinsn.c (print_insn): - Convert to stubs that call disassemblers in ../opcodes/*-dis.c. - * m68k-tdep.c: Removed definition of ext_format ext_format_68881; - it is now in ../opcodes/m68881-ext.c. - * mips-tdep.c (mips_skip_prologue): Try to skip more of the - prologue (some callers _do_ care). - * mips-pinsn.c (print_insn), z8k-tdep.c (print_insn): Convert to - new interface of ../opcodes/*-dis.c. - * ch-exp.y: Add #include <ctype.h>. - -Thu Mar 18 11:57:49 1993 Jim Kingdon (kingdon@cygnus.com) - - * xcoffexec.c (exec_close): Don't close exec_bfd twice. - - * xcoffread.c (enter_line_range): endaddr is exclusive, not inclusive. - -Wed Mar 17 09:46:31 1993 Jim Kingdon (kingdon@cygnus.com) - - * xcoffread.c (arrange_linetable): Use x{m,re}alloc not {m,re}alloc. - -Wed Mar 17 11:28:11 1993 Steve Chamberlain (sac@thepub.cygnus.com) - - * z8k-tdep.c (extract_return_value, write_return_value, - store_struct_return): New functions from macros in tm-z8k.h. - -Wed Mar 17 11:23:06 1993 Fred Fish (fnf@cygnus.com) - - * valops.c (value_arg_coerce): Apply temporary patch to - fix problem with coercion of array and function types when - passed as arguments to C functions, pending a more complete - review of when and how coercion should be done, depending - upon context and language. - -Wed Mar 17 09:46:31 1993 Jim Kingdon (kingdon@cygnus.com) - - * xcoffread.c (MIN_TBTABSIZ): Change to 12. - - * xcoffread.c (xcoff_symfile_read): Only read stringtab and - debugsec if there are a non-zero number of symbols. - -Tue Mar 16 18:08:45 1993 John Gilmore (gnu@cygnus.com) - - * command.c (show_user): Avoid fprintf_filtered botch (AGAIN!). - -Tue Mar 16 15:18:17 1993 Jim Kingdon (kingdon@cygnus.com) - - * xcoffexec.c (add_vmap): Wrap symbol read in catch_errors. - - * xcoffread.c (read_symbol_lineno): Look to end of symbols for .bf, - not just 50 symbols. - (symtbl_num_syms): New variable. - (read_xcoff_symtab): Set it. - (read_symbol_nvalue): Check for bad symno. - (read_symbol_{lineno,nvalue}, callers): Don't pass symtable; it's - always symtbl. - -Tue Mar 16 10:09:05 1993 Stu Grossman (grossman@cygnus.com) - - * config/rs6000.mh: Get rid of -Dfd_set=int crock. - This is defined in defs.h if necessary. - * vx-share/vxWorks.h: Remove #defs of min and max. - * vx-share/xdr_ld.c, vx-share/xdr_ptrace.c, - vx-share/xdr_rdb.c: include defs.h. - -Fri Mar 12 09:33:23 1993 Jim Kingdon (kingdon@cygnus.com) - - * xcoffread.c (retrieve_tracebackinfo): Move assignment out - of while condition. - - * xcoffread.c (enter_line_range): complain() on bad endoffset. - xcoffread.c: Doc fixes. - -Tue Mar 9 09:56:12 1993 Jim Kingdon (kingdon@cygnus.com) - - * tm-rs6000.h (CORE_NEEDS_RELOCATION): Just call xcoff_relocate_core. - xcoffexec.c (xcoff_relocate_core): New function. - (text_adjustment): Removed. - (add_vmap): Return the vmap. - rs6000-tdep.c (add_text_to_loadinfo): No longer static. - -Fri Mar 5 05:22:46 1993 Jim Kingdon (kingdon@cygnus.com) - - * xcoffsolib.h: Add objfile member to struct vmap. - xcoff{exec,solib}.c: Use it, not lookup_objfile_bfd. - xcoffexec.c (add_vmap): Allocate objfiles here. - -Sun Mar 14 02:54:15 1993 John Gilmore (gnu@cygnus.com) - - Support 68000 series without floating point. - - * configure.in (m68000-*-{aout,elf,coff}): New configs. - * tm-68k-nofp.h: New file, lacks 68881 support. - * config/m68k-nofp.mt: New file. - -Sun Mar 14 02:30:08 1993 John Gilmore (gnu@cygnus.com) - - Remove a few remaining underscore/no-underscore remnants from - config files. - - * config/{m68k-un.mt, sparc-un.mt}: Remove. - * config/m68k-noun.mt: Rename to m68k-fp.mt. - * config/sparc-noun.mt: Rename to sparc-em.mt. - * tm-68k-noun.h, tm-spc-noun.h: Remove. - * tm-68k-un.h: Rename to tm-68k-fp.h. - * tm-spc-un.h: Rename to tm-spc-em.h. - * tm-sun4sol2.h: Cleanup. - * configure.in (m68k-*, sparc-* targets): Corresponding changes. - -Sat Mar 13 14:58:22 1993 John Gilmore (gnu@cygnus.com) - - * symmisc.c (std_in, std_out, std_err): Move initializations - to runtime code, in case they aren't constant. - -Fri Mar 12 16:23:54 1993 K. Richard Pixley (rich@cygnus.com) - - * symtab.c (find_pc_symtab): some object file formats, notably - mips, have holes in the address ranges of symtabs. Change - this algorithm from first hit to tightest fit. - - * mips-tdep.c (heuristic_proc_start): if we walk the pc into the - fence post without finding the enclosing function, then print a - warning. - -Thu Mar 11 09:33:01 1993 Fred Fish (fnf@cygnus.com) - - * utils.c (fputs_demangled, fprint_symbol): Remove. - * utils.c (fprintf_symbol_filtered): New function which combines - the functionality of fputs_demangled and fprint_symbol. Uses a - caller provided language parameter to select the appropriate - demangler, and caller provided args to pass to the demangler. - * defs.h (enum language): Move further up in file so enum can - be used in prototypes. - * defs.h (fputs_demangled, fprint_symbol): Remove prototypes. - * defs.h (fprintf_symbol_filtered): Add prototype. - * c-typeprint.c (cp_type_print_method_args): Replace calls to - fputs_demangled with call to fprintf_symbol_filtered. - * cp-valprint.c (demangle.h): Include - * cp-valprint.c (cp_print_value_fields): Replace calls to - fprint_symbol with calls to fprintf_symbol_filtered. - * printcmd.c (print_frame_args): Replace call to fprint_symbol - with call to fprintf_symbol_filtered. - * stack.c (print_frame_info): Remove obsolete code so we don't - have to update fputs_demangled usage in it. - * stack.c (print_frame_info, frame_info): Add language variable - to pass to fprintf_symbol_demangled and initialize it from the - symbol's language. Replace calls to fputs_demangled with calls - to fprintf_symbol_filtered. - * symtab.c (find_methods): Replace call to fputs_demangled with - call to fprintf_symbol_filtered. - * ch-valprint.c (demangle.h): Include. - * ch-valprint.c (chill_print_value_fields): Replace call to - fprint_symbol with call to new fprintf_symbol_filtered. - -Wed Mar 10 17:37:11 1993 Fred Fish (fnf@cygnus.com) - - * Makefile.in (VERSION): Bump version to 4.8.2. - - * main.c (source_command): Require an explicit pathname of file - to source, since previous behavior of defaulting to gdb init file - was troublesome and undocumented. - * printcmd.c (disassemble_command): Add missing '{}' pair to - else with two statements. Bug reported by Stephane Tsacas - <slt@isoft.fr>. - * symtab.c (find_pc_line): Don't complain about zero length or - negative length line numbers for the moment, since we may not own - the terminal when called, such as when single stepping. (FIXME) - * language.h (CAST_IS_CONVERSION): True if current language is - C++ as well as C. Fix from Peter Schauer. - * environ.c (get_in_environ, set_in_environ, unset_in_environ): - Use STREQN macro rather than bare '!strncmp()'. - * environ.c (unset_in_environ): Avoid use of memcpy on - overlapping memory regions, as suggested by Paul Eggert - <eggert@twinsun.com>. - * c-exp.y (%union struct): Remove unused ulval as suggested - by Paul Eggert <eggert@twinsun.com>. - -Mon Mar 8 19:03:06 1993 Fred Fish (fnf@cygnus.com) - - * main.c (gdbinit): Make static. - * main.c (inhibit_gdbinit): Move to file scope. - * main.c (main): Remove local inhibit_gdbinit. - * main.c (source_command): Don't source '.gdbinit' file by - default if gdb has been told to ignore it. - -Sun Mar 7 21:58:53 1993 Ian Lance Taylor (ian@cygnus.com) - - * Makefile.in (MAKEOVERRIDES): Define to be empty for GNU Make - 3.63. - -Fri Mar 5 17:39:45 1993 John Gilmore (gnu@cacophony.cygnus.com) - - * printcmd.c (print_address_symbolic): Only print if offset - is shorter than max_symbolic_offset. - (initialize_printcmd): `set print max-symbolic-offset'. - - * am29k-tdep.c (TAGWORD_ZERO_MASK): New #define. - (examine_tag): Use it. - (read_register_stack): Only look in the local registers for a - memory address if it's between rfb and rsp; go to memory otherwise. - (initialize_29k): Fix call_scratch_address doc. Remove reginv_com. - (reginv_com): Remove ancient kludge command. - -Fri Mar 5 17:16:26 1993 K. Richard Pixley (rich@rtl.cygnus.com) - - * tm-irix3.h (ZERO_REGNUM): copy this macro from tm-mips.h so that - irix4 will again compile. - - * tm-mips.h (GDB_TARGET_IS_MIPS): no longer used, now removed. - - * configure.in: accept mips-sgi-irix4* for irix4. - -Fri Mar 5 07:49:48 1993 Steve Chamberlain (sac@lisa.cygnus.com) - - * z8k-tdep.c (print_register_hook): Lint. - -Thu Mar 4 17:42:03 1993 John Gilmore (gnu@cygnus.com) - - Lint fixes from Paul Eggert (eggert@twinsun.com): - - * command.c (do_setshow_command): var_uintegers are unsigned. - * sparc-tdep.c (save_insn_opcodes, restore_insn_opcodes): - unsigned, since they use hex values with the high bit set. - -Thu Mar 4 08:22:55 1993 Fred Fish (fnf@cygnus.com) - - Fixes submitted by Karl Berry (karl@nermal.hq.ileaf.com): - * m88k-pinsn.c (sprint_address): Use SYMBOL_NAME macro to - access symbol name. - * m88k-nat-c (SXIP_OFFSET, SNIP_OFFSET, SFIP_OFFSET): Enclose - macro definitions in parenthesis. - - * dbxread.c (dbx_symfile_init): Catch the case where there is - no string table, but the only way we find out is by reading zero - bytes from EOF. - -Wed Mar 3 15:51:28 1993 Fred Fish (fnf@cygnus.com) - - * dbxread.c (dbx_symfile_init): Make size of the string table - size field a define (DBX_STRINGTAB_SIZE_SIZE). Ensure that the - offset to the string table is nonzero and handle the nonexistant - string table case, should it occur. Ensure that the string table - size read from the file is reasonable, with a minimum lower bound - of DBX_STRINGTAB_SIZE_SIZE instead of zero. - -Wed Mar 3 07:23:03 1993 Ian Lance Taylor (ian@cygnus.com) - - * Makefile.in: Changes to build testsuite correctly. - (FLAGS_TO_PASS): Added CXX and CXXFLAGS. - (CC_FOR_TARGET, CXX, CXX_FOR_TARGET): New variables. - (TARGET_FLAGS_TO_PASS): New variable. - (SUBDIRS): Added testsuite. - (all): Build testsuite using TARGET_FLAGS_TO_PASS, so that - testsuite is compiled with CC_FOR_TARGET rather than CC. - -Tue Mar 2 17:57:56 1993 Fred Fish (fnf@cygnus.com) - - * dbxread.c (dbx_symfile_init): Fix for nonexistant string table, - reported by mycroft@gnu.ai.mit.edu. - - (Ultrix 2.2 support from Michael Rendell <michael@mercury.cs.mun.ca>) - * configure.in (vax-*-ultrix2*): New triplet. - * config/vaxult2.mh: New file. - * xm-vaxult2.h: New file. - - * c-exp.y (parse_number): Change high_bit to unsigned. - * demangle.c: Change all references to cfront to ARM, since the - actual algorithm is the one specified in the Annotated Reference - Manual. This was confusing users into thinking that full cfront - support was implemented. - * dwarfread.c (CFRONT_PRODUCER): Remove, was never really used. - * eval.c (evaluate_subexp): For STRUCTOP_PTR pass the arg type - directly to lookup_struct_elt_type, which will do the - dereferencing itself. - * gdbtypes.c (lookup_struct_elt_type): Expand comments. Fix - NULL dereferencing bug for unnamed structs, comment out - questionable code. - -Mon Mar 1 17:54:41 1993 John Gilmore (gnu@cygnus.com) - - * coffread.c (process_coff_symbol): Change PCC argument correction - so that it only happens on big-endian targets; so that it only - happens if the short or char argument is aligned on an int - boundary; and so that it changes the location, rather than the - type, of the argument. These changes tend to parallel similar - (old) changes in stabsread.c. - - * coffread.c (coff_read_enum_type): Use the specified size for - enums, don't assume that they are int-sized. - - * c-valprint.c (c_val_print): Don't assume enums are the same as - ints. - - * coredep.c: Handle NO_PTRACE_H in coredep.c. Fix by Michael - Rendell, <michael@mercury.cs.mun.ca>. - -Mon Mar 1 09:25:57 1993 Fred Fish (fnf@cygnus.com) - - * language.h (local_decimal_format_custom): Add prototype. - * language.c (local_decimal_format_custom): Add function, bug - reported by Robert R. Henry (rrh@tera.com). - -Fri Feb 26 18:33:18 1993 John Gilmore (gnu@cacophony.cygnus.com) - - * xcoffexec.c (vmap_ldinfo): Fix "/" for '/' typo, reported - by Josef Leherbauer, joe@takeFive.co.at. - -Wed Feb 24 19:17:11 1993 John Gilmore (gnu@cacophony.cygnus.com) - - * symfile.c (syms_from_objfile), tm-29k.h, tm-3b1.h, tm-68k-un.h, - tm-altos.h, tm-arm.h, tm-convex.h, tm-es1800.h, tm-h8300.h, - tm-hp300bsd.h, tm-hp300hpux.h, tm-hppa.h, tm-i386bsd.h, - tm-i386v.h, tm-i960.h, tm-irix3.h, tm-isi.h, tm-linux.h, - tm-m88k.h, tm-merlin.h, tm-mips.h, tm-news.h, tm-np1.h, tm-pn.h, - tm-pyr.h, tm-rs6000.h, tm-spc-un.h, tm-sun386.h, tm-sunos.h, - tm-symmetry.h, tm-sysv4.h, tm-tahoe.h, tm-umax.h, tm-vax.h, - tm-vx68.h, tm-z8k.h: Remove remnants of NAMES_HAVE_UNDERSCORE. - -Wed Feb 24 07:41:15 1993 Fred Fish (fnf@cygnus.com) - - * symtab.h (SYMBOL_INIT_DEMANGLED_NAME): Initialize contents - of demangled name fields to NULL if no demangling exists for - a symbol. SYMBOL_INIT_LANGUAGE_SPECIFIC does this for new - symbols if their language is known at the time they are created, - but sometimes the language is not known until later. - - * ch-typeprint.c (chill_print_type_base): Name changed to - chill_type_print_base to match pattern for C and C++ names. - * ch-typeprint.c (chill_print_type): Change "char" to "CHAR" - to be consistent with other usages. - * ch-typeprint.c (chill_type_print_base): Add support for - printing Chill STRUCT types. - * ch-valprint.c: Include values.h. - * ch-valprint.c (chill_print_value_fields): New function and - prototype for printing Chill STRUCT values. - * ch-valprint.c (chill_val_print): Fix call to val_print_string - that was being called with two args instead of three. - * ch-valprint.c (chill_val_print): Call chill_print_value_fields - to print Chill STRUCT values. - -Tue Feb 23 18:58:11 1993 Mike Werner (mtw@poseidon.cygnus.com) - - * configure.in: added testsuite to configdirs. - -Tue Feb 23 11:46:11 1993 Mike Stump (mrs@cygnus.com) - - * doc/stabs.texi: The `this' pointer is now known by the name - `this' instead of `$t'. - -Tue Feb 23 11:21:33 1993 Fred Fish (fnf@cygnus.com) - - * dwarfread.c (read_tag_string_type): Rewrite to allow forward - references of TAG_string_type DIEs in user defined types. - * ch-lang.c (chill_create_fundamental_type): Track compiler - change that now emits debugging info with the type long for Chill - longs. - -Mon Feb 22 15:21:54 1993 Ian Lance Taylor (ian@cygnus.com) - - * remote-mips.c: New file; implements MIPS remote debugging - protocol. - * config/idt.mt: New file; uses remote-mips.c - * configure.in (mips-idt-ecoff): New target; uses idt.mt. - - * mips-tdep.c (mips_fpu): New variable; controls use of MIPS - floating point coprocessor. - (mips_push_dummy_frame): If not mips_fpu, don't save floating - point registers. - (mips_pop_frame): If not mips_fpu, don't restore floating point - registers. - (_initialize_mips_tdep): New function; let the user reset mips_fpu - variable. - * tm-mips.h (EXTRACT_RETURN_VALUE, STORE_RETURN_VALUE): If not - mips_fpu, don't use fp0 as floating point return register. - (FIX_CALL_DUMMY): If not mips_fpu, don't save floating point - registers. - -Mon Feb 22 07:54:03 1993 Mike Werner (mtw@poseidon.cygnus.com) - - * gdb/testsuite: made modifications to testcases, etc., to allow - them to work properly given the reorganization of deja-gnu and the - relocation of the testcases from deja-gnu to a "tool" subdirectory. - -Sun Feb 21 10:55:55 1993 Mike Werner (mtw@poseidon.cygnus.com) - - * gdb/testsuite: Initial creation of gdb/testsuite. - Migrated dejagnu testcases and support files for testing nm to - gdb/testsuite from deja-gnu. These files were moved "as is" - with no modifications. This migration is part of a major overhaul - of dejagnu. The modifications to these testcases, etc., which - will allow them to work with the new version of dejagnu will be - made in a future update. - -Fri Feb 19 18:36:55 1993 John Gilmore (gnu@cygnus.com) - - * NEWS: Add reminders for next release. - -Fri Feb 19 10:01:39 1993 Ian Lance Taylor (ian@cygnus.com) - - * mipsread.c (parse_lines): Correct check for files compiled with - -g1. - -Fri Feb 19 05:56:15 1993 John Gilmore (gnu@cygnus.com) - - * Makefile.in (VERSION): 4.8.1 to distinguish local versions. - -Fri Feb 19 01:32:58 1993 John Gilmore (gnu@cygnus.com) - - * Makefile.in (VERSION): GDB-4.8 release! - * README, NEWS: Update for release. - -Thu Feb 18 22:44:40 1993 Stu Grossman (grossman@cygnus.com) - - * am29k-pinsn.c (print_insn): Minor nits with const. - * am29k-tdep.c: More minor nits with arg types for - supply_register, NULL vs. 0, read_register_gen, & reginv_com. - -Thu Feb 18 22:38:03 1993 John Gilmore (gnu@cygnus.com) - - * gcc.patch: Update for a different GCC (G++) bug. - * main.c (print_gdb_version): Update copyright year to 1993. - * nm-hp300bsd.h: Decide whether this is BSD 4.3 or 4.4, - conditionalize this file on it. FIXME, right way is to split - these into two config files. - (ATTACH_DETACH): Define for BSD 4.4 - (PTRACE_ARG_TYPE): caddr_t for BSD 4.4, unset for 4.3. - (U_REGS_OFFSET): Revise for 4.4. - (REGISTER_U_ADDR): Separate for 4.4, but it doesn't work yet. - * xm-hp300bsd.h: Move definitions of UINT_MAX, INT_MAX, INT_MIN, - LONG_MAX into this file to avoid cpp "redefinition" warnings. - -Thu Feb 18 16:13:28 1993 K. Richard Pixley (rich@rtl.cygnus.com) - - * nm-hp300bsd.h (PTRACE_ARG3_TYPE): FSF's hp300's have int* not - caddr_t. - -Thu Feb 18 04:10:06 1993 John Gilmore (gnu@cygnus.com) - - * c-lang.c (c_printstr): Bugfix for length==0 case. - - * c-lang.c (c_printstr): If a C string ends in a null, don't - print the null. - -Thu Feb 18 02:39:21 1993 Stu Grossman (grossman at cygnus.com) - - * defs.h (STRCMP): Make it work for unsigned chars. - -Thu Feb 18 01:56:06 1993 John Gilmore (gnu@cygnus.com) - - * nm-hp300bsd.h (ATTACH_DETACH, PTRACE_ATTACH, PTRACE_DETACH): define. - * config/hp300bsd.mh (REGEX, REGEX1): Define. - * m68k-pinsn.c (BREAK_UP_BIG_DECL, AND_OTHER_PART): #if __GNUC__, - define to kludge the large opcode table into two smaller tables, - since GCC take exponential space to build the table. Lint. - (NOPCODES): Remove, use "numopcodes" from opcode/m68k.h instead. - -Wed Feb 17 19:24:40 1993 John Gilmore (gnu@cygnus.com) - - * Makefile.in (VERSION): Roll to 4.7.9. - * xm-hp300bsd.h: Define PSIGNAL_IN_SIGNAL_H and put a compatible - definition here, to handle both BSD 4.3 and 4.4 systems. - * mipsread.c (ZMAGIC): #undef to avoid duplicate define. - * remote.c (alarm): Move declaration to global level, before - first reference to it. - * tm-i386bsd.h (NUM_REGS): There are only eleven, not twelve. - * dbxread.c (process_one_symbol): Cast to unsigned char, not int. - -Wed Feb 17 13:40:29 1993 K. Richard Pixley (rich@cygnus.com) - - * remote.c (readchar): forward declare alarm which otherwise looks - like an undeclared variable to gcc. - - * dbxread.c (process_one_symbol): cast enum value N_SO into int - when comparing against an int. Avoids superfluous warning from - vax ultrix 4.2 cc. - - * inflow.c (set_sigint_trap): add cast to assignment from signal. - Avoids superfluous warnings from some systems and/or compilers - (like vax ultrix 4.2.) - - * language.c (struct op_print unk_op_print_tab): use the enum - values rather naked zeros as initializers. Avoids warnings from - ultrix type compilers. - -Tue Feb 16 00:53:20 1993 John Gilmore (gnu@cygnus.com) - - * Makefile.in (VERSION): Roll to 4.7.6. - (SFILES_SUBDIR): Add 29k-share/udi_soc. - (SFILES_SUBSUBDIR): Move 29k-share/udi files to this macro. - (alldeps.mak): Make ALLDEPFILES_SUBSUBDIR for files in sub sub dirs. - (ALLDEPFILES_SUBSUBDIR): Depend on this for deeper dep files. - (HFILES): Remove all nm-* except nm-trash.h. Add ns32k-opcode.h. - (depend): Fix bug where nm-files in config files weren't noticed. - (make-proto-gdb-1): Avoid changing directories while building new - prototype. Build SFILES_SUBSUBDIR with longer symlinks. - -Mon Feb 15 20:48:09 1993 John Gilmore (gnu@cygnus.com) - - * remote.c: Improve error recovery. Allow user to break out - of initial connection attempt with INTERRUPT. Treat a timeout - while waiting for remote packet like a retry, unless the remote - side is actively running user code. Fix a few long printf_filtered's. - - * xcoffread.c (read_xcoff_symtab): Don't use null symbol name for - trampoline symbols. - - * buildsym.c (start_subfile): Allow null file name. - -Fri Feb 12 15:46:49 1993 K. Richard Pixley (rich@cygnus.com) - - * xcoffread.c (process_xcoff_symbol, read_symbol_lineno): complain - expects a pointer to complaint rather than a complaint - structure. - (process_linenos): free the previously allocated subfile name, - then allocate the new one from the heap. - -Fri Feb 12 08:06:05 1993 Steve Chamberlain (sac@thepub.cygnus.com) - - * h8300-tdep.c, tm-h8300.h: turn off some experimental features - -Thu Feb 11 00:59:07 1993 John Gilmore (gnu@cygnus.com) - - * stabsread.c (dbx_lookup_type): Handle negative type numbers. - Previously, would bogusly index off the bottom of type_vector. - (rs6000_builtin_type): Accept type number as argument. - (read_type, case '-'): Handle negatives like any other type number. - - * symfile.c (deduce_language_from_filename): Handle null name. - - * mips-tdep.c (isa_NAN): Fix byte order dependency. - Reported by Nobuyuki Hikichi <hikichi@sra.co.jp>, - fixed by sato@sm.sony.co.jp. - - * xcoffread.c (parmsym): Don't use an initializer to set up - this struct symbol. Set it up in initialize_xcoffread. - (read_xcoff_symtab, xcoff_symfile_read): Surround code that only - works on real rs/6000 target with #ifndef FAKING_RS6000. - -Wed Feb 10 23:42:37 1993 John Gilmore (gnu@cygnus.com) - - * stabsread.c (rs6000_builtin_type): Move function from - xcoffread.c:builtin_type. - * xcoffread.c (builtin_type): Move to stabsread. Remove - IBM6000_HOST dependency. Move misplaced comments. - (various): Change printf's to complaints. - (patch_block_stabs, process_xcoff_symbol case C_DECL): Add - objfile argument to read_type calls under #if 0. - (process_xcoff_symbol case C_RSYM): Fix typo in #ifdef. - * xcoffexec.c (map_vmap): Don't allocate an objfile for the exec_file. - * Makefile.in: xcoffread.o is not built by default. - * xm-rs6000.h (IBM6000_HOST): Remove. - * config/rs6000.mh (NATDEPFILES): xcoffread.o is native only. - * doc/gdbint.texinfo: Eliminate IBM6000_HOST, document - IBM6000_TARGET. - -Wed Feb 10 18:31:20 1993 Stu Grossman (grossman at cygnus.com) - - * findvar.c (read_var_value): If REG_STRUCT_HAS_ADDR, then set - VALUE_LVAL to be lval_memory so that we don't try to modify wild - register numbers when user tries to modify elements in structs - passed as arguments. - * inflow.c (child_terminal_info): Move banner outside of system - specific #ifdefs. - * tm-hppa.h (REG_STRUCT_HAS_ADDR): Define this for HPPA, which - passes struct/union arguments by address. - -Wed Feb 10 15:34:46 1993 Ian Lance Taylor (ian@cygnus.com) - - * Based on patch from Kean Johnston <maw@netcom.com>: - * nm-i386sco4.h: New file. Like nm-i386sco.h, but define - ATTACH_DETACH, PTRACE_ATTACH and PTRACE_DETACH. - * config/i386sco4.mh (NAT_FILE): Use nm-i386sco4.h. - -Tue Feb 9 20:07:18 1993 John Gilmore (gnu@cygnus.com) - - * remote-udi.c (FREEZE_MODE): Fix && for & typo. Found and - fixed by Lynn D. Shumaker, shumaker@saifr00.cfsat.honeywell.com. - -Tue Feb 9 08:18:07 1993 Ian Lance Taylor (ian@cygnus.com) - - * config/i386sco4.mh (MUNCH_DEFINE): Pass -p to nm to avoid bug in - cc debugging output. - -Tue Feb 9 00:19:28 1993 John Gilmore (gnu@cygnus.com) - - * stabsread.c (define_symbol): Complain about unrecognized names - that begin with CPLUS_MARKER (often '$'), but don't die. Fix - suggested by gb@cs.purdue.edu (Gerald Baumgartner). - (read_cpp_abbrev): Don't use the class name as part of the - vtable pointer member name (_vptr$) in $vf abbrevs or unrecognized - abbrevs. Inspired by Mike Tiemann. - (read_tilde_fields): Comment. Remove ancient dead code. - Remove erroneous but non-dead code. Simplify. Add complaints. - (in general): Remove extraneous (parentheses) in return - statements. - -Fri Feb 5 14:01:22 1993 John Gilmore (gnu@cygnus.com) - - * coffread.c (coff_lookup_type): Fix fencepost error reported - by Art Berggreen, <arg@opal.acc.com>. - - Fix long file name bug reported on SCO Open Desktop 2.0 by Ulf Lunde - <Ulf.Lunde@kvatro.no> and Dag H. Wanvik <Dag.H.Wanvik@kvatro.no>: - - * coffread.c (getfilename): Eliminate COFF_NO_LONG_FILE_NAMES - test, which is apparently left over from when we used native - include files and couldn't depend on the member names being there. - * tm-3b1.h, tm-altos.h, tm-i386v.h: Don't set it. - -Thu Feb 4 12:23:15 1993 Ian Lance Taylor (ian@cygnus.com) - - * mipsread.c: Major overhaul to use new BFD symbol table reading - routines. Now swaps information as it is needed, rather than - swapping everything when the file is read. - -Thu Feb 4 01:52:36 1993 John Gilmore (gnu@cygnus.com) - - * Makefile.in (TARDIRS): Add sparclite demo dir. - (*.tab.c): Change dependency on Makefile to depend on - Makefile.in, otherwise it always rebuilds after configuring. - Force output *.tab.c file into current directory even in "make" - versions that rewrite dependent file names used in command lines. - - * TODO: Remove some things we did. - * am29k-opcode.h, convx-opcode: Remove; now in ../include/opcode. - * os68k-xdep.c: Remove; useless file (os68k is a target only). - * convex-pinsn.c: Use ../include/opcode/convex.h. Add CONST. - * symtab.h: Eliminate unnamed unions and structs. - -Wed Feb 3 14:48:08 1993 John Gilmore (gnu@cygnus.com) - - * Makefile.in (VERSION): Roll to 4.7.5. - -Tue Feb 2 20:47:42 1993 John Gilmore (gnu@cygnus.com) - - * breakpoint.c (breakpoint_re_set_one): Handle watchpoints when - re-evaluating symbol pointers. - -Tue Feb 2 16:10:31 1993 Fred Fish (fnf@cygnus.com) - - * c-exp.y (lcurly, rcurly): New nonterminals. - * c-exp.y (exp): Use lcurly and rcurly for arrays and UNOP_MEMVAL - constructs. - * parse.c (free_funcalls): Moved prototype from parser-defs.h, - made function static. - * parse.c (struct funcall): Moved struct def from parser-defs.h. - * parse.c (funcall_chain): Moved from parser-defs.h, made static. - * parse.c (start_arglist): - * parser-defs.h (free_funcalls): Moved prototype to parse.c. - * parser-defs.h (struct funcall): Moved struct def to parse.c. - * parser-defs.h (funcall_chain): Moved to parse.c. - * printcmd.c (print_frame_nameless_args): Fix prototype. - * tm-mips.h (setup_arbitrary_frame): Fix prototype. - * tm-sparc.h (setup_arbitrary_frame): Fix prototype. - * valops.c (typecmp): Moved prototype from values.h. - * value.h (typecmp): Moved prototype to valops.c, made static. - * ch-exp.y (yylex): Change way control sequences are disabled. - -Tue Feb 2 16:11:43 1993 John Gilmore (gnu@cygnus.com) - - * tm-mips.h, tm-sparc.h: Fix thinko in SETUP_ARBITRARY_FRAME. - -Tue Feb 2 15:30:33 1993 Ian Lance Taylor (ian@cygnus.com) - - * mipsread.c (upgrade_type): Build array types correctly, using - create_range_type and create_array_type. - -Tue Feb 2 00:19:08 1993 John Gilmore (gnu@cygnus.com) - - * remote-nindy.c: Cleanup. - - * infrun.c (wait_for_inferior): When rolling back the PC after - a breakpoint, call write_pc so that NPC gets rolled back as well - (for the 29K). - - * blockframe.c (inside_entry_file, inside_main_func, - inside_entry_func): PC of zero is always "bottom of stack". - - * printcmd.c (print_frame_args, print_frame_nameless_args): - Let print_frame_nameless_args decide whether there are any, - laying groundwork for possibly later printing 29K args for - functions where we have tag words but no symbols. - -Mon Feb 1 18:09:58 1993 Roland H. Pesch (pesch@fowanton.cygnus.com) - - * Makefile.in: fix GDB doc targets for new doc subdir structure - -Mon Feb 1 17:56:47 1993 John Gilmore (gnu@cygnus.com) - - * stack.c (parse_frame_specification): Parse as many arguments - as there are (up to MAXARGS). Pass all of them in argc, argv - format to SETUP_ARBITRARY_FRAME. Put the burden of checking how - many there were, onto SETUP_ARBITRARY_FRAME. - * tm-mips.h, tm-sparc.h: Corresponding changes. - * mips-tdep.c, sparc-tdep.c: Ditto. - -Mon Feb 1 17:19:37 1993 John Gilmore (gnu@cygnus.com) - - * hp300ux-nat.c: Update copyrights. - * mipsread.c (parse_partial_symbols): Complain about block - indexes that go backwards. Fix from Peter Schauer. - * symfile.c (syms_from_objfile, symbol_file_add): Allow a - symbol-file that has no linkage symbols to be read. - * tm-rs6000.h, xm-rs6000.h: (SIGWINCH_HANDLER and friends): Move - from tm- file to xm-file, since they're host dependent. - * valarith.c (value_binop): Typo. - -Mon Feb 1 16:16:59 1993 Stu Grossman (grossman at cygnus.com) - - * sparclite/aload.c: Add copyleft. - * sparclite/crt0.s: Add comment at beginning. - -Mon Feb 1 14:36:11 1993 Steve Chamberlain (sac@thepub.cygnus.com) - - * remote-z8k.c, z8k-tdep.c: support for the Z8001 and Z8002. - * parse.c (std_regs): Only declare if NO_STD_REGS is defined. - -Sun Jan 31 04:32:48 1993 Michael Tiemann (tiemann@rtl.cygnus.com) - - * values.c (value_headof): Fix typo in which VTBL and ARG were - being confused for one another. - - * valops.c (typecmp): Now static. - - * gdbtypes.c (fill_in_vptr_fieldno): Don't ignore the first - baseclass--we don't always inherit its virtual function table - pointer. - - * eval.c (evaluate_subexp): In OP_FUNCALL case, adjust `this' - pointer correctly in case value_struct_elt moves it around. - - * valops.c (typecmp): Now static. Also, now groks references - better. - - * gdbtypes.c (lookup_struct_elt_type): Pass NOERR instead of - zero on recursive call. If NAME is the name of TYPE, return TYPE. - -Sat Jan 30 19:55:52 1993 John Gilmore (gnu@cygnus.com) - - * hppah-nat.c: Eliminate <sys/user.h> and other unnecessary stuff, - to avoid "too much defining" error from native C compiler (!). - - * Makefile.in (HFILES): Add typeprint.h. - * typeprint.[ch]: Update copyrights. - -Thu Jan 28 19:09:02 1993 John Gilmore (gnu@cygnus.com) - - * Makefile.in: Update to match doc/ subdir changes. - - * config/hp300hpux.mh: No cross-host file needed, just native. - * config/go32.mh: Remove nonexistent "native" support. - - M88K fixes reported by Carl Greco, <cgreco@Creighton.Edu>: - * tm-m88k.h (REGISTER_CONVERT_TO_RAW): Fix typo. - * m88k-tdep.c (next_insn): Lint, cleanup. - (store_parm_word): Lint. - - * README: Fix typo (reported by karl@hq.ileaf.com). - -Wed Jan 27 21:34:21 1993 Fred Fish (fnf@cygnus.com) - - * expression.h (BINOP_CONCAT): Document use for self concatenation - an integral number of times. - * language.c (binop_type_check): Extend BINOP_CONCAT for self - concatenation case. - * valarith.c (value_concat): Rewrite to support self - concatenation an integral number of times. - * Makefile.in (ch-exp.tab.c): Change "expect" message. - * ch-exp.y (FIXME's): Make all FIXME tokens distinct, to - eliminate hundreds of spurious shift/reduce and reduce/reduce - conflicts that mask the 5 real ones. - * ch-exp.y (STRING, CONSTANT, SC): Remove unused tokens. - * ch-exp.y (integer_literal_expression): Remove production, - no longer used. - -Thu Jan 21 09:58:36 1993 Fred Fish (fnf@cygnus.com) - - * eval.c (evaluate_subexp): Fix OP_ARRAY, remove code that - implied that "no side effects" was nonfunctional. - * eval.c (evaluate_subexp): Add BINOP_CONCAT case to deal with - character string and bitstring concatenation. - * expprint.c (dump_expression): Add case for BINOP_CONCAT. - * expression.h (exp_opcode): Add BINOP_CONCAT. - * gdbtypes.h (type_code): Add TYPE_CODE_BITSTRING. - * language.c (string_type): Add function to determine if a type - is a string type. - * language.c (binop_type_check): Add case for BINOP_CONCAT. - * valarith.c (value_concat): New function to concatenate two - values, such as character strings or bitstrings. - * valops.c (value_string): Remove error stub and implement - function body. - * value.h (value_concat): Add prototype. - * ch-exp.y (operand_3): Add actions for SLASH_SLASH (//). - * ch-exp.y (yylex): Recognize SLASH_SLASH. - * ch-lang.c (chill_op_print_tab): Add SLASH_SLASH (//) as - BINOP_CONCAT. - -Tue Jan 19 14:26:15 1993 Fred Fish (fnf@cygnus.com) - - * c-exp.y (exp): Add production to support direct creation - of array constants using the obvious syntax. - * c-valprint.c (c_val_print): Set printed string length. - * dwarfread.c (read_tag_string_type): New prototype and - function that handles TAG_string_type DIEs. - * dwarfread.c (process_dies): Add case for TAG_string_type - that calls new read_tag_string_type function. - * expprint.c (print_subexp): Add support for OP_ARRAY. - * gdbtypes.c (create_range_type, create_array_type): Inherit - objfile from the index type. - * ch-typeprint.c (chill_print_type): Add case for - TYPE_CODE_STRING. - * ch-valprint.c (chill_val_print): Fix case for - TYPE_CODE_STRING. - -Mon Jan 18 11:58:45 1993 Ian Lance Taylor (ian@cygnus.com) - - * mipsread.c (CODE_MASK, MIPS_IS_STAB, MIPS_MARK_STAB, - MIPS_UNMARK_STAB, STABS_SYMBOLS): Removed; now in - include/coff/mips.h. - -Fri Jan 15 20:26:50 1993 Fred Fish (fnf@cygnus.com) - - * c-exp.y (exp:STRING): Convert C strings into array-of-char - constants with an explicit null byte terminator. OP_STRING is - now used for real string types. - * c-lang.c (builtin_type_*): Move declarations to lang.c since - they are used by all languages. - * c-lang.c (_initialize_c_language): Move initializations of - builtin_type_* to lang.c. - * c-typeprint.c (c_type_print_varspec_prefix, - c_type_print_varspec_suffix): TYPE_CODE_PASCAL_ARRAY renamed - to TYPE_CODE_STRING. - * c-valprint.c (c_val_print): Change the way character arrays - are printed as strings to be consistent with the way strings - are printed when pointer-to-char types are dereferenced. - Remove test of print_max before calling val_print_string, which - now does it's own test. - * eval.c (evaluate_subexp): Add case for OP_ARRAY. - * expprint.c (print_subexp, dump_expression): Add case for OP_ARRAY. - * expression.h (enum exp_opcode): Add OP_ARRAY and document. - * gdbtypes.c (builtin_type_*): Add declarations moved from - c-lang.c. - * gdbtypes.c (create_string_type): New function to create real - string types. - * gdbtypes.c (recursive_dump_type): TYPE_CODE_PASCAL_ARRAY - renamed to TYPE_CODE_STRING. - * gdbtypes.c (_initialize_gdbtypes): Add initializations of - builtin_type_* types moved from c-lang.c. - * gdbtypes.h (enum type_code): TYPE_CODE_PASCAL_ARRAY renamed - to TYPE_CODE_STRING. - * gdbtypes.h (builtin_type_string): Add extern declaration. - * gdbtypes.h (create_string_type): Add prototype. - * m2-lang.c (m2_create_fundamental_type): TYPE_CODE_PASCAL_ARRAY - renamed to TYPE_CODE_STRING. - * m88k-tdep.c (pushed_size): TYPE_CODE_PASCAL_ARRAY renamed to - TYPE_CODE_STRING. - * mipsread.c (_initialize_mipsread): TYPE_CODE_PASCAL_ARRAY - renamed to TYPE_CODE_STRING. - * parse.c (length_of_subexp, prefixify_subexp): Add case for - OP_ARRAY. - * printcmd.c (print_formatted): Recognize TYPE_CODE_STRING. - * typeprint.c (print_type_scalar): TYPE_CODE_PASCAL_ARRAY renamed - to TYPE_CODE_STRING. - * valops.c (allocate_space_in_inferior): New function and - prototype, using code ripped out of value_string. - * valops.c (value_string): Rewritten to use new function - allocate_space_in_inferior, but temporarily disabled until some - other support is in place. - * valops.c (value_array): New function to create array constants. - * valprint.c (val_print_string): Add comment to document use, - complete rewrite to fix several small buglets. - * value.h (value_array): Add prototype. - * value.h (val_print_string): Change prototype to match rewrite. - * ch-valprint.c (chill_val_print): Add case for TYPE_CODE_STRING. - * ch-exp.y (match_character_literal): Disable recognition of - control sequence form of character literals and document why. - -Thu Jan 14 15:48:12 1993 Stu Grossman (grossman at cygnus.com) - - * nindy-share/nindy.c: Add comments to #endif's to clarify - grouping. - - * hppa-pinsn.c (print_insn): Use read_memory_integer, instead of - read_memory to get byte order right. - * hppah-tdep.c (find_unwind_info): Don't read in unwind info - anymore. This is done in paread.c now. We expect unwind info - to hang off of objfiles, and search all of the objfiles when until - we find a match. - * (skip_trampoline_code): Cast arg to target_read_memory. - * objfiles.h (struct objfile): Add new field obj_private to hold - per object file private data (unwind info in this case). - * paread.c (read_unwind_info): New routine to read unwind info - for the objfile. This data is hung off of obj_private. - * tm-hppa.h: Define struct obj_unwind_info, to hold pointers to - the unwind info for this objfile. Also define OBJ_UNWIND_INFO to - make this easier to access. - -Wed Jan 13 20:49:59 1993 Fred Fish (fnf@cygnus.com) - - * c-valprint.c (cp_print_class_member): Add extern decl. - * c-valprint.c (c_val_print): Extract code for printing methods - and move it to cp_print_class_method in cp-valprint.c. - * c-valprint.c (c_val_print): Extract code to print strings and - move it to val_print_string in valprint.c. - * cp-valprint.c (cp_print_class_method): New function using - code extracted from c_val_print. - * valprint.c (val_print_string): New function using code - extracted from c_val_print. - * value.h (val_print_string): Add prototype. - * ch-exp.y (CHARACTER_STRING_LITERAL): Set correct token type. - * ch-exp.y (literal): Add action for CHARACTER_STRING_LITERAL. - * ch-exp.y (tempbuf, tempbufsize, tempbufindex, GROWBY_MIN_SIZE, - CHECKBUF, growbuf_by_size): New variables, macros, and support - functions for implementing a dynamically expandable temp buffer. - * ch-exp.y (match_string_literal): New lexer function. - * ch-exp.y (match_bitstring_literal): Dynamic buffer code - removed and replaced with new CHECKBUF macro. - * ch-exp.y (yylex): Call match_string_literal when appropriate. - * ch-valprint.c (ch_val_print): Add code for TYPE_CODE_PTR. - -Sat Jan 9 19:59:33 1993 Stu Grossman (grossman at cygnus.com) - - * Makefile.in: Add info for paread.o. - * config/hppahpux.mh: Add paread.o to NATDEPFILES. - - * blockframe.c (frameless_look_for_prologue): Correct the - comment. - * gdbtypes.h, gdbtypes.c: Use const in decl of - cplus_struct_default, now that pa-gas assembler has been fixed. - * hppah-nat.c: Formatting. - * hppah-tdep.c: Remove lots of useless externs for variables we - don't use. - * (find_unwind_entry): Speed up by using binary search, and a one - entry cache. - * (rp_saved): New routine to see what unwind info says about RP - being saved on the stack frame. - * (frame_saved_pc): Look for prologue to see if we need to - examine the stack for the saved RP or not. - * (init_extra_frame_info): Check for prologue, instead of - framesize to determine if we are frameless or not. - * (frame_chain_valid): Stop backtraces when we run into _start. - * (push_dummy_frame): Reformat to make more readable. - * (find_dummy_frame_regs): ditto. - * (hp_pop_frame): ditto. - * (hp_restore_pc_queue): small cleanup. - * (hp_push_arguments): ditto. - * (pa_do_registers_info): ditto. - * (skip_prologue): New routine created from SKIP_PROLOGUE macro. - * tm-hppa.h: Move contents of SKIP_PROLOGUE into hppah-tdep.c. - * Define FRAME_CHAIN_VALID. - * Turn on BELIEVE_PCC_PROMOTION so that we can access char args - passed to functions. - - * paread.c (pa_symtab_read): Use new bfd conventions for - accessing linker symbol table. - * (pa_symfile_init): Access embedded STAB info via BFD section - mechanism and related macros. - - -Sat Jan 9 19:31:43 1993 Stu Grossman (grossman at cygnus.com) - - * sparc-stub.c: Use a seperate stack for our traps. - * Handle recursive traps. - * Remove all trap init code. This needs to be done by the - environment. - * (set_mem_fault_trap): Call exceptionHandler() to setup this - trap. - * (handle_exception): See if we are at breakinst, if so, then - advance PC sp that users can just step out of breakpoint(). - * (case 'G'): Don't let GDB hack CWP. Also, copy saved regs to - new place if SP has changed. - * (case 's'): Get rid of this, we can't do it yet. - * (case 't'): New command to test any old random feature. - * (case 'r'): New command to reset the system. - * (breakpoint): Add label to breakpoint trap instruction so that - handle_exception() can detect where we are and get past the - breakpoint trivially. - -Thu Jan 7 13:33:06 1993 Ian Lance Taylor (ian@cygnus.com) - - * mips-pinsn.c: Actual work now done by opcodes/mips-dis.c. - -Thu Jan 7 09:21:51 1993 david d `zoo' zuhn (zoo at cirdan.cygnus.com) - - * configure.in: recognise all sparclite variants - -Wed Jan 6 10:14:51 1993 Steve Chamberlain (sac@thepub.cygnus.com) - - * symfile.c: If O_BINARY isn't defined, set it to 0, call openp for - binary files oring in the right bit. - - * main.c, source.c, state.c, symmisc.c: use macros defined in - fopen-{bin|both} when fopening files. - -Wed Jan 6 08:19:11 1993 Fred Fish (fnf@cygnus.com) - - * defs.h (HOST_CHAR_BIT): New macro, defaults to either CHAR_BIT - from a configuration file (typically including <limits.h>), or to - TARGET_CHAR_BIT if CHAR_BIT is not defined. - * eval.c (evaluate_subexp): Use new BYTES_TO_EXP_ELEM macro. - * eval.c (evaluate_subexp): Add case for OP_BITSTRING. - * expprint.c (print_subexp): Use new BYTES_TO_EXP_ELEM macro. - * exppritn.c (print_subexp, dump_expression): Add case for - OP_BITSTRING. - * expression.h (OP_BITSTRING): New expression element type for - packed bitstrings. - * expression.h (EXP_ELEM_TO_BYTES, BYTES_TO_EXP_ELEM): New - macros to convert between number of expression elements and bytes - to store that many elements. - * i960-tdep.c (leafproc_return): Use new macros to access - minimal symbol name and address fields. - * m88k-pinsn.c (sprint_address): Use new macros to access - minimal symbol name and address fields. - * nindy-tdep.c (nindy_frame_chain_valid): Use new macro to access - minimal symbol address field. - * parse.c (write_exp_elt, write_exp_string, prefixify_expression, - parse_exp_1): Use new EXP_ELEM_TO_BYTES macro. - * parse.c (write_exp_string, length_of_subexp, prefixify_expression): - Use new BYTES_TO_EXP_ELEM macro. - * parse.c (write_exp_bitstring): New function to write packed - bitstrings into the expression element vector. - * parse.c (length_of_subexp, prefixify_subexp): Add case for - OP_BITSTRING. - * parser-defs.h (struct stoken): Document that it is used for - OP_BITSTRING as well as OP_STRING. - * parser-defs.h (write_exp_bitstring): Add prototype. - * ch-exp.y (BIT_STRING_LITERAL): Change token type to sval. - * ch-exp.y (NUM, PRED, SUCC, ABS, CARD, MAX, MIN, SIZE, UPPER, - LOWER, LENGTH): New tokens for keywords. - * ch-exp.y (chill_value_built_in_routine_call, mode_argument, - upper_lower_argument, length_argument, array_mode_name, - string_mode_name, variant_structure_mode_name): New non-terminals - and productions. - * ch-exp.y (literal): Useful production for BIT_STRING_LITERAL. - * ch-exp.y (match_bitstring_literal): New lexer support function - to recognize bitstring literals. - * ch-exp.y (tokentab6): New token table for 6 character keywords. - * ch-exp.y (tokentab5): Add LOWER, UPPER. - * ch-exp.y (tokentab4): Add PRED, SUCC, CARD, SIZE. - * ch-exp.y (tokentab3): Add NUM, ABS, MIN, MAX. - * ch-exp.y (yylex): Check tokentab6. - * ch-exp.y (yylex): Call match_bitstring_literal. - -Mon Jan 4 16:54:18 1993 Fred Fish (fnf@cygnus.com) - - * xcoffexec.c (vmap_symtab): Use new macros to access minimal - symbol name and value fields. - - * c-exp.y (yylex): Make static, to match prototype and other - <lang>-exp.y files. - - * expression.h (exp_opcode): Add BINOP_MOD. - * eval.c (evaluate_subexp): Handle new BINOP_MOD. - * expprint.c (dump_expression): Handle new BINOP_MOD. - * language.c (binop_type_check): Handle new BINOP_MOD. - * main.c (float_handler): Re-enable float handler when hit. - * valarith.c (language.h): Include, need current_language. - * valarith.c (TRUNCATION_TOWARDS_ZERO): Define default macro - for integer divide truncates towards zero for negative results. - * valarith.c (value_x_binop): Handle BINOP_MOD if seen. - * valarith.c (value_binop): Allow arithmetic operations on - TYPE_CODE_CHAR variables. Add case to handle new BINOP_MOD. - * ch-exp.y (operand_4): Add useful actions for MOD and REM. - * ch-exp.y (tokentab3): Add MOD and REM. - * ch-exp.y (yylex): Set innermost_block for symbols found - in local scopes. Return LOCATION_NAME for local symbols. - * ch-lang.c (chill_op_print_tab): Fix MOD entry to use - BINOP_MOD instead of BINOP_REM. Add REM entry, using BINOP_REM. - -Mon Jan 4 07:35:31 1993 Steve Chamberlain (sac@wahini.cygnus.com) - - * command.c (shell_escape, make_command, _initialize_command): - don't create or use fork if CANT_FORK is defined. - * serial.h, ser-go32.c: now compiles, but "the obvious problems of - code written for the IBM PC" remain. - * xm-go32.h: define CANT_FORK - -Sun Jan 3 14:24:56 1993 Steve Chamberlain (sac@thepub.cygnus.com) - - * remote-sim.c: first attempt at general simulator interface - * remote-hms.c: whitespace - * h8300-tdep.c: (h8300_skip_prologue, examine_prologue): - understand new stack layout. (print_register_hook): print ccr - register in a fancy way. - -Sun Jan 3 14:16:10 1993 Fred Fish (fnf@cygnus.com) - - * eval.c (language.h): Include. - * eval.c (evaluate_subexp_with_coercion): Only coerce arrays - to pointer types when the current language is C. It loses for - other languages when the lower index bound is nonzero. - * valarith.c (value_subscript): Take array lower bounds into - account when performing subscripting operations. - * valops.c (value_coerce_array): Add comment describing why - arrays with nonzero lower bounds are dealt with in value_subscript, - rather than in value_coerce_array. - -Sat Jan 2 12:16:41 1993 Fred Fish (fnf@cygnus.com) - - * ch-exp.y (FLOAT_LITERAL): Add token. - * ch-exp.y (literal): Add FLOAT_LITERAL. - * ch-exp.y (match_float_literal): New lexer routine. - * ch-exp.y (convert_float): Remove. - * ch-exp.y (yylex): Call match_float_literal. - * ch-exp.y (yylex): Match single '.' after trying - to match floating point literals. - - * eval.c (evaluate_subexp): Add case MULTI_SUBSCRIPT. - * expprint.c (print_subexp): Rename BINOP_MULTI_SUBSCRIPT to - MULTI_SUBSCRIPT. - * expprint.c (dump_expression): New function for dumping - expression vectors during gdb debugging. - * expression.h (BINOP_MULTI_SUBSCRIPT): Name changed to - MULTI_SUBSCRIPT and moved out of BINOP range. - * expression.h (DUMP_EXPRESSION): New macro that calls - dump_expression if DEBUG_EXPRESSIONS is defined. - * m2-exp.y (BINOP_MULTI_SUBSCRIPT): Changed to MULTI_SUBSCRIPT. - * parse.c (length_of_subexp, prefixify_subexp): Change - BINOP_MULTI_SUBSCRIPT to MULTI_SUBSCRIPT. - * parse.c (parse_exp_1): Call DUMP_EXPRESSION before and after - prefixify'ing the expression. - * printcmd.c (print_command_1): Add comment. - * ch-exp.y (expression_list): Add useful actions. - * ch-exp.y (value_array_element): Add useful actions. - * ch-exp.y (array_primitive_value): Add production. - * ch-exp.y (yylex): Recognize ',' as a token. - -Fri Jan 1 18:22:02 1993 david d `zoo' zuhn (zoo at cirdan.cygnus.com) - - * Makefile.in: pass prefix and exec_prefix via FLAGS_TO_PASS, - POSIXize the recursive makes (make [variable assignments] target{s}) - -Fri Jan 1 11:56:23 1993 Fred Fish (fnf@cygnus.com) - - * tm-sun4sol2.h (CPLUS_MARKER): Remove, now set in tm-sysv4.h. - * tm-sysv4.h (CPLUS_MARKER): By default, g++ uses '.' as the - CPLUS_MARKER for all SVR4 systems, so follow suit. - * defs.h (strdup_demangled): Remove prototype. - * dwarfread.c (enum_type, synthesize_typedef): Use new macro - SYMBOL_INIT_LANGUAGE_SPECIFIC. - * dwarfread.c (new_symbol): Use SYMBOL_INIT_DEMANGLED_NAME. - * minsyms.c (install_minimal_symbols, prim_record_minimal_symbol, - prim_record_minimal_symbol_and_info): Use new macro - SYMBOL_INIT_LANGUAGE_SPECIFIC. - * minsyms.c (install_minimal_symbols): Use new macro - SYMBOL_INIT_DEMANGLED_NAME. - * stabsread.c (define_symbol): Use new macro - SYMBOL_INIT_DEMANGLED_NAME. - * symfile.c (add_psymbol_to_list, add_psymbol_addr_to_list): - Use new macro SYMBOL_INIT_DEMANGLED_NAME. - * symfile.h (ADD_PSYMBOL_VT_TO_LIST): Use new macro - SYMBOL_INIT_DEMANGLED_NAME. - * symmisc.c (dump_msymbols, dump_symtab, print_partial_symbol): - SYMBOL_DEMANGLED_NAME now tests language itself. - * symtab.c (COMPLETION_LIST_ADD_SYMBOL): SYMBOL_DEMANGLED_NAME - now tests language itself. - * symtab.h (SYMBOL_CPLUS_DEMANGLED_NAME): New macro that does - what SYMBOL_DEMANGLED_NAME used to do, directly access the C++ - mangled name member in the language dependent portion of a symbol. - * symtab.h (SYMBOL_DEMANGLED_NAME): New macro that returns the - mangled name member appropriate for a symbol's language. - * symtab.h (SYMBOL_SOURCE_NAME, SYMBOL_LINKAGE_NAME, - SYMBOL_MATCHES_NAME, SYMBOL_MATCHES_REGEXP): - SYMBOL_DEMANGLED_NAME now tests language itself. - * symtab.h (SYMBOL_INIT_LANGUAGE_SPECIFIC): New macro that - initializes language dependent portion of symbol. - * symtab.h (SYMBOL_INIT_DEMANGLED_NAME): New macro that - demangles and caches the demangled form of symbol names. - * utils.c (fputs_demangled, fprint_symbol): Use current language - to select an appropriate demangling algorithm. - * utils.c (strdup_demangled): Remove, no longer used. - * symtab.h (SYMBOL_CHILL_DEMANGLED_NAME): New macro that directly - access the Chill mangled name member in the language dependent - portion of a symbol. - * ch-lang.c (chill_demangle): New function, simple demangler. - * defs.h (chill_demangle): Add prototype. - * symtab.h (language_dependent_info): Add struct for Chill. - -For older changes see ChangeLog-92 - -Local Variables: -mode: indented-text -left-margin: 8 -fill-column: 74 -version-control: never -End: diff --git a/contrib/gdb/gdb/ChangeLog-94 b/contrib/gdb/gdb/ChangeLog-94 deleted file mode 100644 index a691ace100300..0000000000000 --- a/contrib/gdb/gdb/ChangeLog-94 +++ /dev/null @@ -1,5705 +0,0 @@ -Fri Dec 30 17:58:55 1994 Steve Chamberlain (sac@jonny.cygnus.com) - - * config/m68k/tm-est.h: Remove cruft. - - -Thu Dec 29 22:40:00 1994 Jeff Law (law@snake.cs.utah.edu) - - * Allow up to 10 whitespace separated arguments to user defined - commands. - * top.c (struct user_args): Structure for holding arguments to - user defined commands. - (print_command_line): Delete unused "tmp_chain" variable. Clean - up flow control by having cases exit in the same manner. - Before executing a command or evaluating an expression, substitute - the current $arg0..$arg9 values if the command/expression uses them. - (arg_cleanup): New function. - (setup_user_args, locate_arg, insert_args): Likewise. - (execute_user_command): Allow arguments to user defined commands. - - * Allow if/while commands to be used within a breakpoint command - list. - * breakpoint.c (bpstat_do_actions): Call execute_control_command - rather than execute_command (passes entire command structure rather - than just the command line text). - (breakpoint_1): Use "print_command_line" to print a breakpoint - command line (including control structures). - * gdbcmd.h (execute_control_command): Provide extern decl. - (print_command_line): Likewise. - * top.c (execute_control_command): No longer static. - (print_command_line): New function to recursively print a command - line, including control structures. - -Thu Dec 29 18:18:31 1994 Rob Savoye <rob@darkstar.cygnus.com> - - * hppa-tdep.c (pa_print_registers): Extract register values stored - in big endian format on big and little endian hosts. - - * array-rom.c: Support for Array Tech LSI33k based RAID disk - controller board. - * configure.in: Recognize "mips*-*-ecoff*" rather than - "mips*-idt-ecoff*" so it'll work for the LSI33k. - - * monitor.[ch], op50-rom.c, rom68k-rom.c, w89k-rom.c: Add support - to monitor config structure for supported baud rates for a target - and variable stop bits. - * monitor.c (monitor_fetch_register): Store register values in big - endian format on any host. - -Wed Dec 28 19:27:22 1994 Jeff Law (law@snake.cs.utah.edu) - - * hppa-tdep.c (hppa_fix_call_dummy): Prefer import stubs over - export stubs and actual shared library functions so that lazy - binding works correctly. Try both __d_plt_call and __gcc_plt_call - trampolines for calling import stubs. - -Wed Dec 28 15:29:02 1994 Stan Shebs <shebs@andros.cygnus.com> - - * a29k-tdep.c (pop_frame): Fix a variable name. - -Wed Dec 28 12:21:39 1994 Jeff Law (law@snake.cs.utah.edu) - - * hppa-tdep.c (push_dummy_frame): Refine code to determine what - space ID to place in the stack & inf_status structure. - (hppa_pop_frame): Don't walk through trampoline code if popping a - call dummy frame. - (hppa_fix_call_dummy): Call the stack dummy directly if the - current PC is in a shared library. - - * hppa-tdep.c (push_dummy_frame): Return type is void. Clear - in_syscall bit in flags. Don't depend on the PC queue registers - when in_syscall is set, they're not valid. - * config/pa/tm-hppa.h (PUSH_DUMMY_FRAME): Pass inf_status down to - push_dummy_frame. - (SR4_REGNUM): Define. - - * hppa-tdep.c: Misc. lint changes. - -Tue Dec 27 12:32:43 1994 Jeff Law (law@snake.cs.utah.edu) - - * breakpoint.c (watchpoint_check): Don't bother restoring the - "selected" frame anymore, it's not necessary. Initialize the - frame cache before trying to find the current frame in the frame - chain. - - * somsolib.c (som_solib_add): Return without loading any shared - libraries if symfile_objfile is NULL. - (som_solib_create_inferior_hook): Likewise. - -Fri Dec 23 17:03:13 1994 Steve Chamberlain (sac@jonny.cygnus.com) - - * remote-est.c: New file supports EST-300 CPU32 background - mode ICE. - * remote-utils.c (sr_com): Call registers_changed. - * configure.in (m68*-*-est*): New configuration. - * config/m68k/tm-est.h: New file. - -Fri Dec 23 16:18:50 1994 Stu Grossman (grossman@cygnus.com) - - * Makefile.in (CLIBS): Put LIBIBERTY last. - -Thu Dec 22 09:27:16 1994 Jim Kingdon <kingdon@deneb.cygnus.com> - - * ser-tcp.c (tcp_open): Cast to struct sockaddr when passing to - function which expects that. - -Thu Dec 22 13:25:33 1994 J.T. Conklin (jtc@rtl.cygnus.com) - - * nlm/gdbserve.c, nlm/ppc.c, nlm/ppc.h: Don't try to use - ALTERNATE_MEM_FUNCS. - -Wed Dec 21 14:00:26 1994 Rob Savoye <rob@darkstar.cygnus.com> - - * monitor.c: Now supports xmodem as a remoteloadprotocol. - -Tue Dec 20 23:01:17 1994 Stu Grossman (grossman@cygnus.com) - - * config/mips/xm-irix4.h, config/mips/xm-irix5.h: #define - _BSD_COMPAT to get reliable signal handling. - -Tue Dec 20 11:44:28 1994 Jim Kingdon (kingdon@lioth.cygnus.com) - - * sparc-tdep.c, a29k-tdep.c, findvar.c (get_saved_register): - if !target_has_registers, call error(). - - * value.h: Remove obsolete comments about FRAME vs struct - frame_info *. - - -Sun Dec 18 11:52:58 1994 Peter Schauer (pes@regent.e-technik.tu-muenchen.de) - - * sparc-tdep.c (sparc_pop_frame): Remove erroneous extra argument - to write_register. - -Sat Dec 17 13:23:21 1994 Jim Kingdon (kingdon@lioth.cygnus.com) - - * tm-sparc.c (EXTRA_FRAME_INFO): New field sp_offset. - * sparc-tdep.c (sparc_init_extra_frame_info): Set it. - (examine_prologue, sparc_init_extra_frame_info): Use ->frame plus - ->sp_offset to compute the address something is saved at, not - ->bottom. - - * sparc-tdep.c (get_saved_register): New function. - * tm-sparc.h: Define GET_SAVED_REGISTER; don't define - FRAME_FIND_SAVED_REGS, HAVE_REGISTER_WINDOWS or REGISTER_IN_WINDOW_P. - * stack.c (frame_info): Add comment about what to do if - FRAME_FIND_SAVED_REGS is not defined. - - * sparc-tdep.c (sparc_init_extra_frame_info): Set ->frame field - here. Get it right for flat frames. - * sparc-tdep.c (sparc_frame_chain): Instead of returning - meaningful value for ->frame field, just return dummy value. - This change is needed because the old code didn't deal with mixed - flat and non-flat frames. - - * sparc-tdep.c (sparc_pop_frame): Write SP_REGNUM from - frame->frame, don't go through saved regs for this. - - * sparc-tdep.c: Move guts of skip_prologue to new function - examine_prologue. Check for flat prologue and set is_flat. - Provide the caller with the information about what is saved where - if desired. - (skip_prologue, sparc_frame_find_saved_regs): Call examine_prologue. - - * sparc-tdep.c: Replace union sparc_insn_layout and anonymous - union in isannulled, which won't work on a little-endian host, - with X_* macros. - - * sparc-tdep.c (sparc_frame_saved_pc): If addr == 0, the saved PC - is still in %o7. - - * config/sparc/tm-sparc.h: Define INIT_FRAME_PC and - INIT_FRAME_PC_FIRST. - * blockframe.c (get_prev_frame_info): Modify comments regarding - INIT_FRAME_PC_FIRST and the sparc. - - * sparc-tdep.c (single_step): Use 4 not sizeof (long) for size of - instruction. - -Sat Dec 17 02:33:37 1994 Peter Schauer (pes@regent.e-technik.tu-muenchen.de) - - * c-typeprint.c (c_type_print_base): Use `show' of -1 to print - the return type of methods to avoid infinite loops with anonymous - types. - * valops.c (search_struct_field): Handle anonymous unions. - - * sparc-tdep.c (sunos4_skip_trampoline_code): New function - to correctly handle steps into -g compiled PIC objects in the - main executable. - * config/sparc/tm-sun4os4.h (SKIP_TRAMPOLINE_CODE): - Redefine to use sunos4_skip_trampoline_code. - - * dwarfread.c (DWARF_REG_TO_REGNUM): Provide a default mapping - from DWARF to GDB register numbering. - * dwarfread.c (locval): Use DWARF_REG_TO_REGNUM to map the - register value. - * config/mips/tm-mipsv4.h (DWARF_REG_TO_REGNUM): Define. - -Fri Dec 16 10:56:29 1994 J.T. Conklin <jtc@rtl.cygnus.com> - - * Makefile.in (uninstall): transform file names. - -Thu Dec 15 16:55:35 1994 Stan Shebs <shebs@andros.cygnus.com> - - * defs.h: Include progress.h. - (QUIT): Call PROGRESS. - * main.c (main): Call START_PROGRESS and END_PROGRESS, break - usage message into shorter strings. - * source.c: Change long command help strings into concats of - shorter ones, for picky ANSI compilers. - - * top.c (command_loop): For space usage display, show both - absolute size and the change from before command execution. - -Thu Dec 15 16:40:10 1994 Stu Grossman (grossman@cygnus.com) - - * defs.h, main.c (gdb_fputs), top.c: Add stream arg to - fputs_unfiltered_hook. - * defs.h, top.c, utils.c (error): Add error_hook. - -Tue Dec 13 15:15:33 1994 Stan Shebs <shebs@andros.cygnus.com> - - * breakpoint.c, infrun.c, printcmd.c: Change long command help - strings into concats of shorter ones, for picky ANSI compilers. - -Mon Dec 12 17:08:02 1994 Stan Shebs <shebs@andros.cygnus.com> - - Sparc flat register window support. - * sparc-tdep.c (sparc_insn_layout): New union, defines layout of - instructions symbolically (used to be local to skip_prologue). - (sparc_init_extra_frame_info): New function. - (sparc_frame_chain): Add flat cases throughout. - (skip_prologue): Add recognition of flat prologues. - (sparc_frame_find_saved_regs): Add flat cases. - (sparc_pop_frame): Ditto. - * config/sparc/tm-sparc.h (EXTRA_FRAME_INFO): New slots. - (INIT_EXTRA_FRAME_INFO): Call sparc_init_extra_frame_info. - (PRINT_EXTRA_FRAME_INFO): Define. - - -Mon Dec 12 13:06:59 1994 Jim Kingdon <kingdon@deneb.cygnus.com> - - * f-lang.c: Remove duplicate declaration of - builtin_type_f_integer, and only include it in the f_builtin_types - once. - - * somread.c (som_symfile_read): Just assign to objfile->obj_private, - not OBJ_UNWIND_INFO. Assigning to a cast is a GCC-ism which - the HP compiler doesn't like. - - -Fri Dec 9 15:50:05 1994 Stan Shebs <shebs@andros.cygnus.com> - - * remote.c (remote_wait): Pass string instead of char to strcpy. - -Fri Dec 9 04:43:17 1994 Jim Kingdon (kingdon@lioth.cygnus.com) - - * gdbserver/low-lynx.c (mywait): Remove debugging printf. - -Thu Dec 8 15:07:29 1994 Jim Kingdon <kingdon@deneb.cygnus.com> - - * frame.h: Restore pre-Nov 3 comments about FRAME_FP with minor - changes. They are correct, unlike the post-Nov 3 comment - (FRAME_FP doesn't have any machine-independent relationship with - FP_REGNUM or any other such notion of a "frame pointer"). - -Wed Dec 7 14:50:54 1994 Jim Kingdon <kingdon@deneb.cygnus.com> - - * gdbserver/remote-utils.c (write_ok): Write "OK", not "Ok", to - match stubs and protocol spec. - * gdbserver/remote-utils.c (remote_open): Cast to struct sockaddr - when passing to function which expects that. - - The following changes aren't quite enough to make things work with - LynxOS (apprently kernel problems). - * infrun.c (wait_for_inferior): When resuming new thread, pass pid - not -1 for remote case. - * thread.c (info_threads_command): Give error if !target_has_stack. - * infrun.c (start_remote): Call init_thread_list. - * thread.c (info_threads_command): Don't call kill for remote - debugging target. - * target.c (normal_pid_to_str): Print "thread" not "process" for - remote. - * remote.c, gdbserver/*: Add 'H', 'S', and 'C' requests, 'X' - response, and `thread' part of 'T' response. - * gdbserver/*: If program exits, send packet to GDB before - exiting. Handle termination with a signal the same as exiting - with an exitstatus. - * remote.c: Don't try to kill program after getting an 'X' - response. - * infrun.c (wait_for_inferior): Add comment about kill versus mourn. - -Thu Dec 8 12:37:38 1994 Rob Savoye <rob@darkstar.cygnus.com> - - * config/pa/tm-pro.h tm-hppap.h, hppapro.mt: Rename tm-hppap.h to - tm-pro.h. - -Wed Dec 7 18:22:59 1994 Stan Shebs <shebs@andros.cygnus.com> - - * source.c: Various cosmetic changes. - (forward_search_command): Handle very long source lines correctly. - -Wed Dec 7 13:21:47 1994 Rob Savoye <rob@darkstar.cygnus.com> - - * hppa-tdep.c: Use GDB_TARGET_IS_PA_ELF so SOM target support will - stop being linked in. - - * config/pa/tm-hppap.h: New file. Set GDB_TARGET_IS_PA_ELF, - otherwise it looks like BSD-ELF. - -Mon Dec 5 21:43:52 1994 Stu Grossman (grossman@cygnus.com) - - * inftarg.c: include <sys/types.h> to get def of pid_t. - -Fri Dec 2 15:03:07 1994 Stan Shebs <shebs@andros.cygnus.com> - - * solib.c (auto_solib_add_at_startup): New global. - (solib_create_inferior_hook): Call solib_add only if - auto_solib_add_at_startup is nonzero. - (_initialize_solib): New command "set auto-solib-add". - -Fri Dec 2 12:52:04 1994 Peter Schauer (pes@regent.e-technik.tu-muenchen.de) - - * parse.c (msymbol_addr_type): Replaced by - lookup_pointer_type (builtin_type_void). - - * printcmd.c (_initialize_printcmd): Give examine_*_type - a name for `ptype $_'. - -Fri Dec 2 12:52:04 1994 Jim Kingdon (kingdon@lioth.cygnus.com) - - * printcmd.c (print_formatted): Call val_print_string directly, - rather than via value_print. - -Wed Nov 30 22:27:27 1994 Jeff Law (law@snake.cs.utah.edu) - - * somsolib.c (som_solib_get_got_by_pc): New function. - * somsolib.h (som_solib_get_got_by_pc): Add extern decl. - * hppa-tdep.c (hppa_fix_call_dummy): Handle case where FUN is the - function's export stub or real address in a shared library. - -Tue Nov 29 13:40:25 1994 J.T. Conklin (jtc@rtl.cygnus.com) - - * config/i386/nbsd.mh (REGEX, REGEX1): No longer define. - - * configure.in (i[345]86-*-freebsd*): New configuration. - * config/i386/{fbsd.mh,fbsd.mt,nm-fbsd.h}: New files. - -Tue Nov 29 12:23:25 1994 Stan Shebs (shebs@andros.cygnus.com) - - * top.c (read_next_line): Pass annotation suffix "commands" - instead of "command", matches documentation. - -Mon Nov 28 14:53:21 1994 Stan Shebs (shebs@andros.cygnus.com) - - * config/a29k/tm-a29k.h (setup_arbitrary_frame): Replace - FRAME_ADDR with CORE_ADDR in prototype. - - * top.c (command_line_input): If annotation suffix is NULL, - replace it with an empty string. - (read_next_line): Pass "command" as annotation suffix to - command_line_input. - -Mon Nov 28 11:03:14 1994 J.T. Conklin (jtc@rtl.cygnus.com) - - * config/rs6000/tm-rs6000.h (setpgrp): move defn from here... - * config/rs6000/xm-rs6000.h: ...to here. - - -Fri Nov 25 21:26:02 1994 Jeff Law (law@snake.cs.utah.edu) - - * tm-hppa.h (skip_trampoline_code): Add extern decl. - * hppa-tdep.c (hppa_pop_frame): Silently restart the inferior and - allow it to execute any return path trampoline code. Stop the - inferior and give the user control when the trampoline has - finished executing. - (in_solib_call_trampoline): Handle export stubs which also perform - parameter relocations. - (in_solib_return_trampoline): Likewise. - -Fri Nov 25 13:37:10 1994 Peter Schauer (pes@regent.e-technik.tu-muenchen.de) - - * coffread.c, symfile.h (coff_getfilename): Make it static again. - * xcoffread.c (coff_getfilename): Use a static copy from - coffread.c, modified for accessing the static xcoff strtbl. - -Fri Nov 25 00:51:05 1994 Jeff Law (law@snake.cs.utah.edu) - - * hppa-tdep.c (in_solib_call_trampoline): Recognize calls through - _sr4export and $$dyncall as trampolines. Likewise for long-call - stubs and parameter relocation stubs. - (in_solib_return_trampoline): Recognize a return trampoline for - return value relocation stubs. - - * hpread.c: Include hp-symtab.h instead of hpux-symtab.h. - Various name changes to match those used by hp-symtab.h. - -Thu Nov 24 00:39:27 1994 Jeff Law (law@snake.cs.utah.edu) - - * blockframe.c (find_pc_partial_function): Inhibit mst_trampoline - symbol special handling when INHIBIT_SUNSOLIB_TRANSFER_TABLE_HACK - is defined. - * infrun.c (IN_SOLIB_CALL_TRAMPOLINE): Renamed from - IN_SOLIB_TRAMPOLINE. All callers changed. - (IN_SOLIB_RETURN_TRAMPOLINE): Provide default definition. - (wait_for_inferior): Handle single stepping through trampolines on - return paths from shared libraries. - * config/pa/tm-hppa.h (IN_SOLIB_CALL_TRAMPOLINE): Use - in_solib_call_trampoline. - (IN_SOLIB_RETURN_TRAMPOLINE): Use in_solib_return_trampoline. - (INHIBIT_SUNSOLIB_TRANSFER_TABLE_HACK): Define. - * hppa-tdep.c (in_solib_call_trampoline): New function. - (in_solib_return_trampoline): New function. - -Wed Nov 23 21:43:03 1994 Steve Chamberlain (sac@jonny.cygnus.com) - - * tm-h8300.h (REMOTE_BREAKPOINT): Define. - * h8300-tdep.c (h8300_pop_frame): Remove redundant call. - - * remote-e7000.c (HARD_BREAKPOINTS): Reenable. - (BC_BREAKPOINTS): Disable. - * sh-tdep.c (print_insn): Cope with big and little endian machines. - * sh/sh.mt: Use libsim.a - * sh/tm-sh.h (TARGET_BYTE_ORDER_SELECTABLE): New - (BREAKPOINT): Changed to be byteorder independent. - -Tue Nov 22 19:13:39 1994 Stan Shebs (shebs@andros.cygnus.com) - - Maintenance commands to report time and space usage. - * main.c (display_time, display_space): New globals. - (main): Add argument --statistics to enable reporting, display - time and space after startup is done. - * maint.c (maintenance_time_display, maintenance_space_display): - New commands. - * top.c (command_loop): Display time and space after command - execution. - - * top.c (pre_init_ui_hook): New global. - (gdb_init): If pre_init_ui_hook set, call before all other init. - -Tue Nov 22 10:25:59 1994 Kung Hsu (kung@mexican.cygnus.com) - - * a29k-tdep.c (examine_tag): Fix a bug in stack frame size. - -Sat Nov 19 03:10:51 1994 Peter Schauer (pes@regent.e-technik.tu-muenchen.de) - - * config/i386/i386sol2.mh: Reenable core file support. - - * symfile.c (deduce_language_from_filename): Treat .c++ as a - C++ extension. - - * valops.c (destructor_name_p): Do not compare the template - part for template classes. - -Fri Nov 18 14:55:59 1994 Stan Shebs (shebs@andros.cygnus.com) - - * defs.h, infcmd.c (reg_names): Don't declare as constant. - * remote-mips.c (mips_open): Read and set the processor type. - * mips-tdep.c (mips_set_processor_type): Always return an int. - -Fri Nov 18 10:38:12 1994 J.T. Conklin <jtc@rtl.cygnus.com> - - * nlm/alpha.c (strtol): Remove, it is provided by NetWare C library. - * nlm/gdbserve.def (strtol): Add to import list. - * nlm/fake_aio.c: Remove file, no longer used. - - * Makefile.in (LD_FOR_TARGET, NLMCONV_FOR_TARGET): Remove. - * nlm/Makefile.in (gdbserve.O): Link with ${CC_FOR_TARGET}. - (LD_FOR_TARGET): Remove. - -Thu Nov 17 22:09:50 1994 Rob Savoye <rob@darkstar.cygnus.com> - - * monitor.h, monitor.c, w89k-rom.c, op50n-rom.c, idp-rom.c: Add - support for two variables used to control the load protocol and - conversion type. - -Thu Nov 17 17:51:12 1994 Stan Shebs (shebs@andros.cygnus.com) - - Support for different MIPS IDT processor models. - * mips-tdep.c (mips_processor_type, tmp_mips_processor_type, - mips_generic_reg_names, mips_r3041_reg_names, - mips_r3051_reg_names, mips_r3081_reg_names, - mips_processor_type_table): New globals. - (mips_do_registers_info): Don't display register if name is empty. - (mips_set_processor_type_command): New command. - (mips_show_processor_type_command): New command. - (mips_set_processor_type): New function. - (mips_read_processor_type): New function. - * config/mips/tm-idt.h (DEFAULT_MIPS_TYPE): New macro. - * config/mips/tm-mips.h (DEFAULT_MIPS_TYPE): New macro. - (NUM_REGS): Increase to account for all CP0 registers. - (REGISTER_NAMES): Add empty names for CP0 registers. - (FIRST_EMBED_REGNUM, LAST_EMBED_REGNUM): Adjust. - (PRID_REGNUM): New macro. - -Wed Nov 16 16:41:52 1994 Stan Shebs (shebs@andros.cygnus.com) - - * README: Add warning about termcap in Ultrix and OSF/1. - -Wed Nov 16 15:28:29 1994 Rob Savoye (rob@cygnus.com) - - - * hppa-tdep.c: Remove including sys/dir.h from a target file. - -Wed Nov 16 10:31:27 1994 J.T. Conklin (jtc@cygnus.com) - - * config/powerpc/gdbserve.mt (TDEPFILES): Remove fake_aio.o. - - * nlm/gdbserve.c: Include <nwtypes.h> before other NetWare headers. - * nlm/ppc.c: Likewise. - - * nlm/ppc.c (strtol): Remove, it is provided by NetWare C Library. - (StopBell): New function (stubbed out). - -Wed Nov 16 00:12:21 1994 Jeff Law (law@snake.cs.utah.edu) - - * hppa-tdep.c (skip_trampoline_code): Handle shared library import - trampolines. - -Tue Nov 15 16:18:52 1994 Kung Hsu (kung@mexican.cygnus.com) - - * c-exp.y (yylex): Fix a bug in template scanning. - -Tue Nov 15 14:25:47 1994 Stan Shebs (shebs@andros.cygnus.com) - - * i386-stub.c, m68k-stub.c, sparc-stub.c, sparcl-stub.c: Mask out - the top bit returned by getDebugChar. - -Tue Nov 15 01:03:56 1994 Rob Savoye (rob@slipknot.cygnus.com) - - * op50-rom.c, w89k-rom.c, monitor.c: Modify to usr two variables - to set remote load type and protocol. - * rom68k-rom.c: Add to_stop in target_ops. - - -Sat Nov 12 21:55:47 1994 Jeff Law (law@snake.cs.utah.edu) - - * somsolib.c: Add TODO list. - (som_solib_add): Immediately return if $SHLIB_INFO$ sections does - not exist or has size zero. Slightly simplify error handling. - Keep an internal list of all the loaded shared libraries and - various tidbits of information about the loaded shared libraries. - Build section tables for each loaded shared library and add those - tables to the core target if necessary. - (som_solib_create_inferior_hook): Force re-reading of shared - libraries at exec time. - (som_sharedlibrary_info_command): New function for dumping - information about the currently loaded shared libraries. - (_initialize_som_solib): New function. - -Sat Nov 12 02:26:50 1994 Peter Schauer (pes@regent.e-technik.tu-muenchen.de) - - * Makefile.in (copying.o, f-exp.tab.o, dpx2-nat.o, dstread.o, - i386aix-nat.o, i386m3-nat.o, irix5-nat.o, lynx-nat.o, m3-nat.o, - mipsm3-nat.o, ns32km3-nat.o, remote-e7000.o, remote-os9k.o): - Add dependencies. - (copying.o, os9kread.o, remote.o): Update dependencies. - - * valarith.c (value_sub): When subtracting pointers, only - check for a match of the pointed to element lengths. - Cast element length to LONGEST to obtain a signed result for - pointer subtractions. - -Fri Nov 11 10:51:07 1994 Jeff Law (law@snake.cs.utah.edu) - - * ch-exp.y (yylex): Fix off-by-one error when converting string to - lowercase. Null terminate new string. - - * hppa-tdep.c (rp_saved): Handle IMPORT stubs too. - - * somsolib.c (som_solib_add): Check the value of __dld_flags, if - it indicates __dld_list is not valid return an error. If it - indicates that libraries were not mapped privately, issue a - warning. - -Thu Nov 10 23:17:45 1994 Peter Schauer (pes@regent.e-technik.tu-muenchen.de) - - * symfile.c (syms_from_objfile): Only call find_lowest_section if - no ".text" section exists. - -Thu Nov 10 15:16:21 1994 Rob Savoye <rob@rtl.cygnus.com> - - * rom68k-rom.c: New file. Replaces the old remote-mon.c and uses - the new generic ROM interface in monitor.c. - * config/m68k/monitor.mt: Use new ROM support. - * monitor.c: Add support for xmodem download protocol. - -Wed Nov 9 18:46:24 1994 Stan Shebs (shebs@andros.cygnus.com) - - * findvar.c (find_saved_register): Fix a frame variable name. - * infcmd.c (finish_command): Ditto. - -Tue Nov 8 13:20:14 1994 Jim Kingdon (kingdon@lioth.cygnus.com) - - * TODO: Remove "Watchpoints seem not entirely reliable, though - they haven't failed me recently." item--this old (4.6 at least) - item is too vague to be useful (some watchpoint bugs have been - fixed since then). - * TODO: Add explanation of "RPC interface" item. - -Mon Nov 7 22:25:21 1994 Jeff Law (law@snake.cs.utah.edu) - - * hppa-tdep.c (read_unwind_info): Use "text_offset" for linker - stub unwind descriptors too. - - * Enable backtracing from inside a SOM shared library back into - user code. - * hppa-tdep.c (internalize_unwinds): Accept and use new - "text_offset" argument for dynamic relocation of - region_{start,end} fields in the unwind descriptor. - (read_unwind_info): Pass text_offset to internalize unwinds. - -Mon Nov 7 14:34:42 1994 Jim Kingdon (kingdon@lioth.cygnus.com) - - * m3-nat.c: Remove comments about arbitrary limit in - printf_filtered; that limit is gone. - -Mon Nov 7 00:27:16 1994 Jeff Law (law@snake.cs.utah.edu) - - * Beginnings of SOM shared library support. Breakpoints and - single frame backtracing within the library only. Only works when - using the HPUX 9 dynamic linker. More functionality to be added - soon. - - * somsolib.c, somsolib.h: New files. - * Makefile.in (HFILES_NO_SRCDIR): Add somsolib.h - (ALLDEPFILES): Add somsolib.c. - (somsolib.o): Add some dependencies. - * somread.c (som_symtab_read): Accept multiple section offsets. - All callers changed. Adjust all text symbols with the first - section offset. - * symfile.c (find_lowest_section): Enable this function. Add some - tie-breaking logic when sections have the same vma. - (syms_from_objfile): Use find_lowest_section rather than looking - for ".text" by name. Relax warning to only warn if the lowest - section is not a code section. - * config/pa/{hppabsd.mh, hppahpux.mh} (NATDEPFILES): Add somsolib.o - * config/pa/{nm-hppab.h, nm-hppah.h}: Include somsolib.h. - -Sun Nov 6 12:54:54 1994 Jeff Law (law@snake.cs.utah.edu) - - * partial-stab.h (N_TEXT): Put back GDB_TARGET_IS_HPPA kludge, - it is still needed for GCC-2.6 compiled code. - * TODO (GDB_TARGET_IS_HPPA): Note this kludge can be nuked - sometime after GCC-2.7 has been released. - - * hppa-tdep.c (frame_saved_pc): Mask off low two bits when - retrieving the PC from a signal handler caller. Fix thinko - in Stan's last change ("frame", should have been "frame->next"). - If the next frame is a signal handler caller and it's a system - call which has entered the kernel ((PSW & 0x2) != 0), then the - saved pc is in %r2 instead of %r31. - -Fri Nov 4 23:47:07 1994 Jeff Law (law@snake.cs.utah.edu) - - * hppa-tdep.c (hppa_frame_find_saved_regs): Change "frame" to - "frame_info" throughout. - -Fri Nov 4 16:26:59 1994 Kung Hsu (kung@mexican.cygnus.com) - - * sparcl-stub.c: get rid of defs.h. - -Fri Nov 4 13:11:54 1994 Jim Kingdon <kingdon@deneb.cygnus.com> - - * gdbserver/Makefile.in (MMALLOC_CFLAGS): Add -I${MMALLOC_DIR}. - Correct definition of MMALLOC_DIR to reflect fact this is - gdb/gdbserver/Makefile.in, not gdb/Makefile.in. - - * gdbserver/server.c (main): After we kill the inferior in - response to a 'k' request, exit. - - * remote.c (remote_kill): Use catch_errors when calling putpkt. - (putpkt): Return int, not void, to match catch_errors calling - convention. - -Fri Nov 4 10:52:38 1994 Stan Shebs (shebs@andros.cygnus.com) - - * rs6000-tdep.c (pop_frame): Correct a variable name. - -Fri Nov 4 05:43:35 1994 Jim Kingdon (kingdon@lioth.cygnus.com) - - * TODO: Re-write item about SIGINT handling to reflect the fact - that target_stop now exists. - -Thu Nov 3 15:19:17 1994 Stan Shebs (shebs@andros.cygnus.com) - - Replace useless FRAME, FRAME_ADDR types with struct frame_info * - and CORE_ADDR, respectively. - * frame.h (FRAME, FRAME_INFO_ID, FRAME_ADDR): Remove. - * blockframe.c (get_frame_info): Remove. - * a29k-tdep.c, alpha-tdep.c, blockframe.c, breakpoint.c, - breakpoint.h, energize.c, findvar.c, gould-pinsn.c, - h8300-tdep.c, h8500-tdep.c, hppa-tdep.c, i386-tdep.c, i960-tdep.c, - infcmd.c, inferior.h, infrun.c, m68k-tdep.c, m88k-tdep.c, - mips-tdep.c, nindy-tdep.c, printcmd.c, pyr-tdep.c, rs6000-tdep.c, - sh-tdep.c, sparc-tdep.c, stack.c, valops.c, z8k-tdep.c, - config/a29k/tm-a29k.h, config/alpha/tm-alpha.h, - config/gould/tm-pn.h, config/h8300/tm-h8300.h, - config/h8500/tm-h8500.h, config/mips/tm-mips.h, - config/ns32k/tm-merlin.h, config/ns32k/tm-umax.h, - config/pyr/tm-pyr.h, config/sparc/tm-sparc.h): Replace FRAME with - struct frame_info * everywhere, replace FRAME_ADDR with CORE_ADDR, - rename variables consistently (using `frame' or `fi'), remove - calls to get_frame_info and FRAME_INFO_ID, remove comments about - FRAME and FRAME_ADDR cruftiness. - -Thu Nov 3 14:25:24 1994 Stu Grossman (grossman@cygnus.com) - - * corelow.c, exec.c, inftarg.c, m3-nat.c, op50-rom.c, procfs.c, - remote-adapt.c, remote-e7000.c, remote-eb.c, remote-es.c, - remote-hms.c, remote-mips.c, remote-mm.c, remote-mon.c, - remote-nindy.c, remote-os9k.c, remote-pa.c, remote-sim.c, - remote-st.c, remote-udi.c, remote-vx.c, remote-z8k.c, remote.c, - w89k-rom.c, target.c, target.h: Add support for target_stop(). - -Thu Nov 3 01:23:45 1994 Peter Schauer (pes@regent.e-technik.tu-muenchen.de) - - * osfsolib.c (solib_map_sections, first_link_map_member, - next_link_map_member, xfer_link_map_member): Retrieve and use - shared library relocation offset from runtime loader structures. - Use libxproc.a routines to get a working version if - USE_LDR_ROUTINES is defined. - * README: Remove item about shared library relocation for - Alpha OSF/1. - -Wed Nov 2 15:05:39 1994 Kung Hsu (kung@mexican.cygnus.com) - - * c-exp.y (yylex): scan template names, and scan nested class - names. - -Wed Nov 2 11:01:55 1994 J.T. Conklin (jtc@phishhead.cygnus.com) - - * nlm/Makefile.in: install gdbserve.nlm. - - -Tue Nov 1 13:00:46 1994 Peter Schauer (pes@regent.e-technik.tu-muenchen.de) - - * c-valprint.c (c_value_print): Check for plain literal `char' - target type when suppressing `(char *)' output for strings. - -Mon Oct 31 19:19:51 1994 Stan Shebs (shebs@andros.cygnus.com) - - * coffread.c (coff_symfile_init): Remove unused local abfd. - * utils.c [NO_MMALLOC] (mmalloc, mrealloc): Define and use size_t - instead of long, for compatibility with mmalloc.h. - -Sat Oct 29 02:40:40 1994 Peter Schauer (pes@regent.e-technik.tu-muenchen.de) - - * top.c (line_completion_function): Renamed from - symbol_completion_function, takes the line buffer and the - point in the line buffer as additional arguments. - (readline_line_completion_function): New function, interface - between readline and line_completion_function. - (init_main): Use it. - (complete_command): Use line_completion_function instead of - abusing rl_line_buffer. Free completion strings after printing - them. - * symtab.c (completion_list_add_name): Recheck for duplicates - if we intend to add a modified symbol. - - * gdbtypes.h (cplus_struct_type): nfn_fields_total no longer - includes the number of methods from the baseclasses. - * stabsread.c (attach_fn_fields_to_type): No longer add the - number of methods from the baseclasses to TYPE_NFN_FIELDS_TOTAL, - the baseclass type might not have been completely filled in yet. - * symtab.c (total_number_of_methods): New function to compute - the total number of methods for a type, including the methods - from baseclasses. - (decode_line_1): Use it instead of TYPE_NFN_FIELDS_TOTAL to - allocate the symbol array for find_methods. - - * stabsread.c (scan_file_globals): Add default case to minimal - symbol type switch, to avoid gcc -Wall warnings. - - * config/rs6000/tm-rs6000.h (INIT_EXTRA_FRAME_INFO): - Don't test for zero backchain pointer to recognize a signal - handler frame, if read() gets interrupted by a signal, the - backchain will be non zero. - (SIG_FRAME_FP_OFFSET): Move to here from rs6000-tdep.c, - improve comment. - (SIG_FRAME_PC_OFFSET): New definition. - (FRAME_SAVED_PC): Return saved pc from sigcontext if this - is a signal handler frame. - * rs6000-tdep.c (function_frame_info): Do not error out - if we can't access the instructions. - - * config/rs6000/tm-rs6000.h (CONVERT_FROM_FUNC_PTR_ADDR): - New definition to get the function address from a function pointer. - * valops.c (find_function_addr): Use it when calling a user - function through a function pointer. - -Fri Oct 28 16:16:52 1994 Stan Shebs (shebs@andros.cygnus.com) - - * Makefile.in (MMALLOC_DIR): New definition. - (MMALLOC): Use MMALLOC_DIR. - (MMALLOC_CFLAGS): Look in MMALLOC_DIR for mmalloc.h. - (OPCODES): Remove gratuitous "./". - * defs.h (mmalloc.h): Include. - (mmalloc, mrealloc, etc): Remove decls. - (cplus_demangle, cplus_demangle_opname): Remove decls. - -Wed Oct 26 15:41:07 1994 Stu Grossman (grossman@cygnus.com) - - * defs.h, main.c, top.c: Change sense and name of - no_windows variable. Now called use_windows, and defaults to off - (for compatibility). - -Wed Oct 26 12:20:53 1994 Jim Kingdon <kingdon@cygnus.com> - - * coffread.c (coff_symtab_read): If we get the address from - target_lookup_symbol, set the section to -2 not SECT_OFF_BSS. - (coff_symtab_read): Set value and section of symbol that - process_coff_symbol returns. - -Tue Oct 25 09:53:04 1994 J.T. Conklin (jtc@phishhead.cygnus.com) - - * config/i386/tm-nbsd.h: Enable longjmp support. - -Sat Oct 22 03:41:13 1994 Peter Schauer (pes@regent.e-technik.tu-muenchen.de) - - * valarith.c (value_binop): Take care of ANSI `value preserving' - rule, which was not addressed by the previous change. - - * rs6000-tdep.c (skip_prologue): Handle `mr r31,r1', which is - generated by gcc-2.6, as a synonym for `oril r31,r1,0'. - - * TODO: Remove item about RS/6000 shared libraries. - -Thu Oct 20 17:35:45 1994 Stu Grossman (grossman@cygnus.com) - - * defs.h, infrun.c (wait_for_inferior), top.c: Call - target_wait_hook to allow GUI to handle blocking for inferior. Call - call_command_hook in execute_command to provide means for wrapping - commands with GUI state change updates. - - * infrun.c (wait_for_inferior): Make sure - through_sigtramp_breakpoint is non-null before deleting. - -Thu Oct 20 10:26:43 1994 J.T. Conklin (jtc@phishhead.cygnus.com) - - * config/powerpc/ppc-nw.mt (TDEPFILES): Removed exec.o. - -Thu Oct 20 06:56:07 1994 Jim Kingdon (kingdon@lioth.cygnus.com) - - * Makefile.in (coffread.o): Depend on target.h. - (remote-vx.o): Depend on gdb-stabs.h objfiles.h symfile.h $(bfd_h). - -Wed Oct 19 22:49:31 1994 Jim Kingdon (kingdon@lioth.cygnus.com) - - * TODO: Fix typo. - -Wed Oct 19 11:32:15 1994 Jim Kingdon <kingdon@cygnus.com> - - * objfiles.c (objfile_relocate): When relocating ->sections, use - objfile not symfile_objfile. - - * symtab.h, minsyms.c (minsyms_sort): New function. - * objfiles.c (objfile_relocate): Call it. - - * remote-vx.c (vx_add_symbols): Call breakpoint_re_set. - - * objfiles.c, objfiles.h (objfile_to_front): New function. - * remote-vx.c (vx_add_symbols): Call it. - - * coffread.c (coff_symtab_read): Handle common symbols the same - way that partial-stab.h does. - -Wed Oct 19 21:06:12 1994 Rob Savoye (rob@cirdan.cygnus.com) - - * hppa-tdep.c: Remove include files a.out.h, ioctl.h, and - machine/psl.h. These are host files. - -Wed Oct 19 15:13:51 1994 Jim Kingdon (kingdon@lioth.cygnus.com) - - * objfiles.h (struct objfile): Fix comment--minimal_symbol_count - does *not* include the terminating NULL msymbol. - -Tue Oct 18 20:53:29 1994 Rob Savoye <rob@darkstar.cygnus.com> - - * monitor.c (monitor_load_srec,monitor_make_srec): Add an asrecord - loader that reads files using BFD and converts it on the fly. - -Mon Oct 17 18:52:06 1994 Rob Savoye <rob@darkstar.cygnus.com> - - * monitor.c (set_loadtype_command): Fixed so it doesn't core dump. - * monitor.c (monitor_load): check the load type and load the file - accordingly. Default to gr_load_image(). - * monitor.c (monitor_load_ascii_srec): Load an ascii file in - srecord format by downloading to the monitor. - * w89k-rom.c, op50n-rom.c: set supported load types. - -Mon Oct 17 10:29:08 1994 Jim Kingdon (kingdon@lioth.cygnus.com) - - * Makefile.in (ALLDEPFILES): Remove xcoffexec.c. - * Makefile.in: Remove xcoffexec.o rule. - - * exec.c (exec_file_command): Add comment. - - Fix data and bss relocation for VxWorks 5.1: - * remote-vx.c (vx_add_symbols): New function. - (vx_load_command, add_symbol_stub): Call it instead of - symbol_file_add. - (vx_wait): Remove comment which was wrong to useless. - * remote-vx.c: Reindent much of file. - * coffread.c (cs_to_section, find_targ_sec): New functions. - (process_coff_symbol): Set SYMBOL_SECTION to result - from cs_to_section. - (coff_symtab_read): Call cs_to_section and deal with result - rather than assuming sections are in a certain order. Deal with - BSS. - * coffread.c: Remove text_bfd_scnum variable. - -Sat Oct 15 16:55:48 1994 Stan Shebs (shebs@andros.cygnus.com) - - * corelow.c: Format to standard. - (core_close): Use name instead of bfd_filename. - -Fri Oct 14 10:29:08 1994 Jim Kingdon (kingdon@lioth.cygnus.com) - - * exec.c (map_vmap): Cast return from xmalloc to its proper type, - not to PTR. - - * symfile.c (reread_symbols): Include bfd_errmsg string in error - message if bfd_close fails. - * exec.c (exec_close), solib.c (clear_solib), corelow.c - (core_close), objfiles.c (free_objfile), irix5-nat.c - (clear_solib), osfsolib.c (clear_solib), remote-utils.c - (gr_load_image): Check for errors from bfd_close. - * solib.c (look_for_base), remote-utils.c (gr_load_image), - remote-udi.c (download), corelow.c (core_open), symfile.c - (symfile_bfd_open), symfile.c (generic_load): Add comment - regarding error from bfd_close. - * remote-udi.c (download), remote-utils.c (gr_load_image): Add - comment about bogus handling of errors from bfd_openr. - * exec.c (exec_close): Add comment regarding memory leak and - dangling reference to vp->name. - -Sat Oct 15 03:43:00 1994 Peter Schauer (pes@regent.e-technik.tu-muenchen.de) - - * eval.c (evaluate_subexp): Make fnptr a LONGEST instead - of using longest_to_int. - - * infcmd.c (run_stack_dummy): Reinstate set_current_frame call, - mips and alpha targets need the real breakpoint pc for - creating the breakpoint frame. - - * stack.c (return_command): Cast return value to the return - type of the function from which we return. - * values.c (set_return_value): Pass VALUE_CONTENTS unmodified - to STORE_RETURN_VALUE. - - * symtab.c (lookup_symbol): Remove search for `static mangled - symbols', the search for `static symbols' already looks for - mangled and demangled symbols via lookup_block_symbol. - - * valarith.c (value_binop): Use ANSI C arithmetic conversions - when performing integral evaluations, implement BINOP_EQUAL and - BINOP_LESS. - (value_equal, value_less): Use value_binop to perform the - comparison if both operands have TYPE_CODE_INT. - - * rs6000-tdep.c (pop_frame): Make sure all registers are valid, - as they are written back later. Handle sp restore for frameless - functions. Use fdata.nosavedpc instead of fdata.frameless to - determine if the pc has been saved. - (function_frame_info): Handle `mr r31,r1', which is generated by - gcc-2.6, as a synonym for `oril r31,r1,0'. - (skip_trampoline_code): Handle shared library trampolines. - * xcoffread.c (read_xcoff_symtabs): Record XMC_GL symbols with - their real name. Enables setting of breakpoints in shared libraries - before the executable is run. - -Fri Oct 14 19:39:47 1994 Rob Savoye <rob@darkstar.cygnus.com> - - * monitor.h, remote-mon.c: Hack up to so the old ROM monitor - interface code still works with the new ROM monitor - structures. Fake out a couple of fields. - -Fri Oct 14 14:54:37 1994 Stan Shebs (shebs@andros.cygnus.com) - - * h8500-tdep.c (target_read_sp, target_write_sp, target_read_pc, - target_write_pc, target_read_fp, target_write_fp): Rename to - h8500_read_sp, etc. - (h8500_read_pc, h8500_write_pc): Add pid argument. - * config/h8500/tm-h8500.h (TARGET_READ_SP, TARGET_WRITE_SP, - TARGET_READ_PC, TARGET_WRITE_PC, TARGET_READ_FP, TARGET_WRITE_FP): - Change to match functions above. - -Thu Oct 13 13:24:29 1994 Jim Kingdon (kingdon@lioth.cygnus.com) - - * NEWS: Add item about if and while. - - * .gdbinit: Restore `end'; it was not excess. Reindent - list-objfiles to make this clear. Comment out all of - list-objfiles because old gdb's choke on it. - -Wed Oct 12 23:19:08 1994 Ian Lance Taylor <ian@sanguine.cygnus.com> - - * config/mips/tm-bigmips64.h: Just define TARGET_BYTE_ORDER and - include tm-mips64.h. - -Wed Oct 12 18:02:17 1994 Stan Shebs (shebs@andros.cygnus.com) - - * Makefile.in (ANNOTATE_OBS): New definition. - (COMMON_OBS): Add exec.o. - (annotate.o): Remove extra compile rule. - * config/*/*.mh, config/*/*.mt: Remove exec.o from *DEPFILES lists - everywhere. - - * .gdbinit: Remove excess `end'. - - * exec.c: Merge in RS6000 support from xcoffexec.c. - (symfile.h, objfiles.h, xcoffsolib.h): Include. - (vmap): New global variable. - (exec_close): Close and free objects in vmap chain. - (exec_file_command) [IBM6000_TARGET]: Set up initial vmap. - (bfdsec_to_vmap, map_vmap): Moved here from xcoffexec.c. - (exec_files_info): Print vmap information. - * xcoffexec.c: Remove. - * config/rs6000/rs6000.mt, config/rs6000/rs6000lynx.mt - (TDEPFILES): Use exec.o instead of xcoffexec.o. - * TODO: Remove pertinent items. - -Wed Oct 12 10:08:19 1994 Jeff Law (law@snake.cs.utah.edu) - - * partial-stab.h (N_TEXT): Delete GDB_TARGET_IS_HPPA kludge; they - are no longer needed as of gcc-2.6.0. - -Tue Oct 11 15:51:01 1994 Ian Lance Taylor <ian@sanguine.cygnus.com> - - * lynx-nat.c (child_wait): Correct handling of byte reversed SPARC - Lynx wait status. - (fetch_core_registers): Don't try to fetch a register if - regmap maps it to -1. - * sparc-tdep.c (sparc_frame_find_saved_regs): Use FRAME_SAVED_I0 - and FRAME_SAVED_L0 when setting saved_regs_addr. SPARC Lynx - stores the registers in a weird order. - -Sat Oct 8 20:59:13 1994 Jim Kingdon (kingdon@lioth.cygnus.com) - - * blockframe.c (reinit_frame_cache): Reinstate select_frame call - if inferior_pid is nonzero. - -Sat Oct 8 04:27:21 1994 Peter Schauer (pes@regent.e-technik.tu-muenchen.de) - - Speed up GDB startup time by not demangling partial symbols. - * symfile.h (ADD_PSYMBOL_VT_TO_LIST), - symfile.c (add_psymbol_to_list, add_psymbol_addr_to_list): - No longer demangle partial symbols. - * symtab.c (lookup_symbol, list_symbols): Handle mangled - variables, e.g. C++ static members, via the minimal symbols. - - Handle reordered functions in an objfile, for Irix 5.2 shared - libraries. - * objfiles.h (OBJF_REORDERED): New bit in the objfile flags, - set if the functions in an objfile are reordered. - * mdebugread.c (parse_partial_symbols): Detect reordered - functions in an objfile. - * symtab.c (find_pc_psymtab, find_pc_symtab): Use expensive - lookup algorithm if the functions in the objfile are reordered. - - * xcoffexec.c (exec_close): If the current target has a copy - of the exec_ops sections, reflect the freeing of the sections - in current_target. - - * valops.c (call_function_by_hand): Use `sizeof dummy1', not - `sizeof dummy', for constructing the call dummy code. - - * config/sparc/tm-sparc.h: Add PARAMS declarations to all - function declarations. - * sparc-tdep.c (sparc_pop_frame): Cast result of - read_memory_integer to CORE_ADDR when passing it to PC_ADJUST. - - * irix5-nat.c (enable_break): Set breakpoint at the entry point - of the executable, to handle the case where main resides in a - shared library. - * irix5-nat.c (solib_create_inferior_hook): Reset stop_soon_quietly - after shared library symbol reading, to get rid of a warning from - heuristic_proc_start if the startup code has no symbolic debug info. - - * breakpoint.h (struct breakpoint): Add new fields language - and input_radix, to enable breakpoint resetting with the - proper language and radix. - * breakpoint.c (set_raw_breakpoint): Initialize them. - (breakpoint_re_set_one): Use them when resetting the breakpoint. - (breakpoint_re_set): Preserve current language and input_radix - across breakpoint_re_set_one calls. - - * symtab.c (decode_line_1): Do not build a canonical line - specification for `*expr' line specifications. - - * breakpoint.h (bpstat_stop_status): Fix prototype declaration. - -Fri Oct 7 08:48:18 1994 Jim Kingdon (kingdon@lioth.cygnus.com) - - The point of these changes is to avoid reading the frame pointer - and stack pointer during stepping, to speed things up. - A. Changes to not select a frame until we need a selected frame: - * blockframe.c (flush_cached_frames): Call select_frame (NULL, -1). - * infrun.c (wait_for_inferior): Move call to select_frame back to - normal_stop. This reverts a change of 13 Apr 94 (it says Jeff - Law, but the change was my idea); the only reason for that change - was so we could save and restore the selected frame in - wait_for_inferior, and now that flush_cached frames clears the - selected frame, that should work OK now. - B. Changes to not create a current_frame until we need one: - * blockframe.c (get_current_frame): If current_frame is NULL, try - to create an innermost frame. - * sparc-tdep.c (sparc_pop_frame), infcmd.c (run-stack_dummy), - infrun.c (wait_for_inferior), thread.c (thread_switch), - convex-tdep.c (set_thread_command), a29k-tdep.c (pop_frame), - alpha-tdep.c (alpha_pop_frame), convex-xdep.c (core_file_command), - h8300-tdep.c (h8300_pop_frame), h8500-tdep.c (h8300_pop_frame), - hppa-tdep.c (hppa_pop_frame), i386-tdep.c (i386_pop_frame), - i960-tdep.c (pop_frame), m68k-tdep.c - (m68k_pop_frame), mips-tdep.c (mips_pop_frame), rs6000-tdep.c - (push_dummy_frame, pop_dummy_frame, pop_frame), sh-tdep.c - (pop_frame), config/arm/tm-arm.h (POP_FRAME), - config/convex/tm-convex.h (POP_FRAME), config/gould/tm-pn.h - (POP_FRAME), config/ns32k/tm-merlin.h (POP_FRAME), - config/ns32k/tm-umax.h (POP_FRAME), config/tahoe/tm-tahoe.h - (POP_FRAME), config/vax/tm-vax.h (POP_FRAME): Don't - call create_new_frame. - * corelow.c (core_open), altos-xdep.c (core_file_command), - arm-xdep.c (core_file_command), gould-xdep.c (core_file_command), - m3-nat.c (select_thread), sun386-nat.c (core_file_command), - umax-xdep.c (core_file_command): Don't call create_new_frame; do - call flush_cached_frames. - * blockframe.c (reinit_frame_cache): Don't call create_new_frame - or select_frame. - C. Changes to get rid of stop_frame_address and instead only - fetch the frame pointer when we need it. - * breakpoint.c (bpstat_stop_status): Remove argument - frame_address; use FRAME_FP (get_current_frame ()). - * infrun.c (wait_for_inferior): Don't pass frame pointer to - bpstat_stop_status. - * infrun.c (wait_for_inferior): Use FRAME_FP (get_current_frame - ()) instead of stop_frame_address. - * infrun.c (save_inferior_status, restore_inferior_status), - inferior.h (struct inferior_status): Don't save and restore - stop_frame_address. - * inferior.h, infcmd.c, thread.c (thread_switch), m3-nat.c - (select_thread): Remove stop_frame_address and uses thereof. - D. Same thing for the stack pointer. - * infrun.c (wait_for_inferior): Remove stop_sp and replace - uses thereof with read_sp (). - E. Change to eliminate one nasty little spot where we were - wanting to know the frame pointer from before the current step - (idea from GDB 3.5, which saved my ass, because my other ideas of - how to fix it were very baroque). - * infrun.c: Remove prev_frame_address. - * infrun.c (wait_for_inferior, step_over_function): Use - step_frame_address instead of prev_frame_address. - F. Same basic idea for the stack pointer. - * inferior.h, infcmd.c: New variable step_sp. - * infcmd.c (step_1, until_next_command): Set it. - * infrun.c: Remove prev_sp and replace uses by step_sp. - * infrun.c (wait_for_inferior): If we get out of the step - range, then set step_sp to the current stack pointer before we - start going again. - -Fri Oct 7 12:17:17 1994 Ian Lance Taylor <ian@sanguine.cygnus.com> - - * top.c (target_byte_order_auto): New static variable. - (set_endian): Mention that ``auto'' is permitted. - (set_endian_auto): New static function. - (show_endian): Change message based on target_byte_order_auto. - (set_endian_from_file): New function. - (init_main): Add command ``auto'' to endianlist. - * exec.c (exec_file_command): Call set_endian_from_file. - * defs.h (set_endian_from_file): Declare. - -Thu Oct 6 18:10:41 1994 J.T. Conklin (jtc@phishhead.cygnus.com) - - * nlm/i386.c (flush_i_cache): New function, does nothing. - (frame_to_registers, registers_to_frame, set_step_traps, - clear_step_traps, do_status): Make non-static. - -Thu Oct 6 12:26:42 1994 Ian Lance Taylor <ian@sanguine.cygnus.com> - - * config/mips/tm-mips.h (GDB_TARGET_IS_MIPS64): If not already - defined, define as 0. - (FIX_CALL_DUMMY): Rewrite to remove presumption that host and - target are similar. - * config/mips/tm-idt.h (TARGET_BYTE_ORDER_SELECTABLE): Define. - * config/mips/tm-idtl.h (TARGET_BYTE_ORDER_SELECTABLE): Define. - * config/mips/tm-idt64.h (TARGET_BYTE_ORDER_SELECTABLE): Define. - (BREAKPOINT): Remove definition. - * config/mips/tm-idtl64.h (TARGET_BYTE_ORDER_SELECTABLE): Define. - (BREAKPOINT): Remove definition. - * config/mips/tm-mips64.h (GDB_TARGET_IS_MIPS64): Define with a - value of 1, rather than without a value. - * config/mips/tm-bigmips64.h (GDB_TARGET_IS_MIPS64): Likewise. - * mips-tdep.c: Rewrite uses of GDB_TARGET_IS_MIPS64 to switch at - run time rather than at compile time. - - * remote-mips.c (break_insn): Remove. - (BREAK_INSN, BREAK_INSN_SIZE): Define. - (mips_insert_breakpoint): Use BREAK_INSN, not break_insn. - (mips_remove_breakpoint): Likewise. - - * defs.h: If TARGET_BYTE_ORDER_SELECTABLE is defined by tm.h, - define TARGET_BYTE_ORDER as target_byte_order, and declare - target_byte_order as an extern int, and define BITS_BIG_ENDIAN as - a test of TARGET_BYTE_ORDER. - * top.c: Several additions if TARGET_BYTE_ORDER_SELECTABLE is - defined: - (endianlist, target_byte_order): New variables. - (set_endian, set_endian_big, set_endian_little): New functions. - (show_endian): New function. - (init_cmd_lists): Initialize endianlist. - (init_main): Add commands ``set endian big'', ``set endian - little'', and ``show endian''. - * a29k-pinsn.c: Rewrite uses of TARGET_BYTE_ORDER and - BITS_BIG_ENDIAN to switch at run time rather than at compile time. - * coffread.c, dwarfread.c, findvar.c, mips-tdep.c: Likewise. - * remote-os9k.c, stabsread.c, valarith.c, valprint.c: Likewise. - * values.c: Likewise. - -Wed Oct 5 11:41:24 1994 J.T. Conklin (jtc@phishhead.cygnus.com) - - * nlm/configure.in: ${gdb_host_cpu} defaults to ${host_cpu}. - - * nlm/Makefile.in: Get rid of NWINCLUDES. - * config/{alpha,powerpc}/gdbserve.mt: Remove NWINCLUDES. - User should now configure with --with-headers. - -Mon Oct 3 07:48:34 1994 Jim Kingdon (kingdon@lioth.cygnus.com) - - * gdbserver/server.c (main): Silently accept all unrecognized - requests and send back a zero length acknowledge. That is what - *-stub.c do and is what remote.c expects. - -Mon Oct 3 05:11:47 1994 Peter Schauer (pes@regent.e-technik.tu-muenchen.de) - - * corelow.c (core_open): Copy the modified to_sections_end - vector from current_target to core_ops too. - - * gdbserver/server.c (main): Silently accept query requests - and send back a zero length acknowledge. - -Fri Sep 30 17:17:21 1994 J.T. Conklin (jtc@phishhead.cygnus.com) - - * nlm/Makefile.in: Don't define NWINCLUDES. - * config/{alpha,powerpc}/gdbserve.mt: define NWINCLUDES. - -Fri Sep 30 15:59:55 1994 Jim Kingdon (kingdon@lioth.cygnus.com) - - * gdbserver/low-lynx.c (create_inferior): Pass all 4 args to ptrace. - -Fri Sep 30 06:42:42 1994 Ian Lance Taylor (ian@cygnus.com) - - * lynx-nat.c (child_wait): Use status.w_status, not status, in - arithmetic. status is a `union wait'. - - * config/nm-lynx.h (PTRACE_ARG3_TYPE): Define to int, not char *. - - * lynx-nat.c (child_wait): Pass fourth argument to ptrace. - -Thu Sep 29 08:22:27 1994 Jim Kingdon (kingdon@lioth.cygnus.com) - - * xcoffread.c (read_xcoff_symtab): Fix comment for yesterday's change. - -Wed Sep 28 17:48:18 1994 Jim Kingdon (kingdon@lioth.cygnus.com) - - * coffread.c (complete_symtab): If last_source_file is set upon - entry, free it. - -Wed Sep 28 08:59:14 1994 Jim Kingdon (kingdon@cygnus.com) - - * xcoffread.c (read_xcoff_symtab, case C_FILE): - Set main_aux before using it. - - * xcoffexec.c (exec_close): If quitting, don't call clear_symtab_users. - - * xcoffread.c (read_xcoff_symtab): Process XTY_LD symbols we were - ignoring before. But continue to ignore XMC_DS. - -Wed Sep 28 00:35:23 1994 Jeff Law (law@snake.cs.utah.edu) - - * hpread.c (hpread_read_array_type): Do not change the type code - to TYPE_CODE_PTR for "char foo[]". Just make it a zero length - array type. - - * hpread.c (hpread_type_translate): Handle T_UNS_LONG types with - lengths other than 32bits (HP C 9.69 represents an "unsigned char" - as an T_UNS_LONG with length 8). - - * hpread.c (struct hpread_symfile_info): Delete have_module field - and accessor macro. Minor indentation fix. - (hpread_build_psymtabs, case K_MODULE): Only start a new psymtab - and reset state variables have_name & texthigh if pst is NULL. - (hpread_build_psymtabs, case K_SRCFILE): Only reset the name of a - partial symbol table if pst is non-NULL. If pst is NULL, then - start a new psymtab. - (hpread_process_one_debug_symbol, case K_MODULE): Now empty. - (hpread_process_one_debug_symbol, case K_SRCFILE): Simplify and - correct handling of subfiles. - -Mon Sep 26 02:59:00 1994 Peter Schauer (pes@regent.e-technik.tu-muenchen.de) - - * defs.h (misc_command_type): Remove trailing comma from - enumerator list. - -Sun Sep 25 23:19:58 1994 Jeff Law (law@snake.cs.utah.edu) - - * hppa-tdep.c (frame_saved_pc): Fix thinko in code to dig saved pc - out of an interrupt frame. - -Sun Sep 25 12:50:17 1994 Stan Shebs (shebs@andros.cygnus.com) - - * infcmd.c (do_registers_info) [INVALID_FLOAT]: Only use if - defined. - * values.c (unpack_double) [INVALID_FLOAT]: Ditto. - * mips-tdep.c (mips_print_register): Don't test float validity. - * config/a29k/tm-a29k.h, config/alpha/tm-alpha.h, - config/arm/tm-arm.h, config/convex/tm-convex.h, - config/h8300/tm-h8300.h, config/h8500/tm-h8500.h, - config/i386/tm-i386v.h, config/i386/tm-sun386.h, - config/i960/tm-i960.h, config/m68k/tm-m68k.h, - config/m88k/tm-m88k.h, config/mips/tm-mips.h, - config/ns32k/tm-merlin.h, config/ns32k/tm-nbsd.h, - config/ns32k/tm-ns32km3.h, config/ns32k/tm-umax.h, - config/pa/tm-hppa.h, config/pyr/tm-pyr.h, - config/rs6000/tm-rs6000.h, config/sh/tm-sh.h, - config/sparc/tm-sparc.h, config/z8k/tm-z8k.h (INVALID_FLOAT): - Remove definition. - -Sun Sep 25 06:07:37 1994 Jim Kingdon (kingdon@lioth.cygnus.com) - - * TODO: Remove item about adding general multi-threaded stuff; - this is done. - Remove item about specifying arbitrary locations of stack frames - (this works on some machines). - Remove item about debugging functions without a frame pointer - (this works on some machines). - Remove item about re-writing macros which handle frame chaining and - frameless functions. They have been re-written at least once - since that item was written. - Remove item about gdb catching SIGINT when attached; this is done. - Remove item about having list_command not read symbols--why bother? - -Sat Sep 24 17:40:10 1994 Stan Shebs (shebs@andros.cygnus.com) - - * TODO: Append contents of Projects file. - * Projects: Remove. - -Sat Sep 24 01:47:25 1994 Peter Schauer (pes@regent.e-technik.tu-muenchen.de) - - * corelow.c (add_solib_stub): Remove copying of to_sections, - pass current_target to SOLIB_ADD. The Sep 10 change failed - if SOLIB_ADD errored out, or if SOLIB_ADD was trying to access - target memory. - * corelow.c (core_open): After reading the shared libraries, - copy the modified to_sections vector from current_target to - core_ops, so that core_close can free it later. - * config/rs6000/nm-rs6000.h, rs6000-nat.c (xcoff_relocate_core): - Pass down target parameter from SOLIB_ADD and use it instead of - directly accessing core_ops. - -Fri Sep 23 14:58:49 1994 J.T. Conklin (jtc@rtl.cygnus.com) - - * solib.c: *BSD systems need <a.out.h> to be included before - <link.h>. - - * i386b-nat.c: Add i386_float_info(), etc. - * config/i386/nm-nbsd.h: #define FLOAT_INFO. - - * config/nm-nbsd.h: New file, for generic NetBSD native support. - * config/i386/nm-nbsd.h: Use it. - * config/sparc/nm-nbsd.h: Use it. - * config/ns32k/nm-nbsd.h: Use it. - - * configure.in (i386-*-netbsd): Use config/i386/nbsd.m[ht]. - (ns32k-*-netbsd): Use config/ns32k/nbsd.m[ht]. - * config/i386/{nbsd.mh,nbsd.mt,nm-nbsd.h,tm-nbsd.h,xm-nbsd.h}: - New files, support for NetBSD/i386. - * config/ns32k/{nbsd.mh,nbsd.mh,nm-nbsd.h,tm-nbsd.h,xm-nbsd.h}: - New files, support for NetBSD/ns32k. - -Tue Sep 20 11:34:27 1994 Jim Kingdon (kingdon@lioth.cygnus.com) - - * .gdbinit: Add list-objfiles command. - - * TODO: Reword item regarding NO_STD_REGS. - - * coffread.c (record_minimal_symbol, coff_read_enum_type, - coff_read_struct_type): Allocate on symbol_obstack, not directly - via malloc/savestring. - -Tue Sep 20 15:42:02 1994 Stan Shebs (shebs@andros.cygnus.com) - - * TODO: Add more items. - * tests: Remove the directory and all of its (obsolete) contents. - -Tue Sep 20 11:34:27 1994 Jim Kingdon (kingdon@lioth.cygnus.com) - - * coffread.c (init_stringtab): When copying length to stringtab, - use target format, not host format, since that is what the rest of - the code assumes. - -Mon Sep 19 15:48:10 1994 J.T. Conklin (jtc@phishhead.cygnus.com) - - * Makefile.in: Removed prelude.o, i386-nlmstub.o, nlmstub.o, - nlmstub.nlm, and nlmstub targets. Removed NWSOURCE and - NWINCLUDES definitions. - * i386-nlmstub.c: Removed. - -Mon Sep 19 07:48:36 1994 Peter Schauer (pes@regent.e-technik.tu-muenchen.de) - - * dbxread.c (read_dbx_dynamic_symtab): Cast bfd_asymbol_name to - char * (from const char *) before assigning. Don't save string we - pass to record_minimal_symbol (it already saves it). - - -Sat Sep 17 02:26:58 1994 Peter Schauer (pes@regent.e-technik.tu-muenchen.de) - - * cp-valprint.c (static_field_print): New variable, controls - printing of static members. - (_initialize_cp_valprint): New print set subcommand - "static-members". Turn on printing of static members by default. - (cp_print_value_fields): Print static members if necessary. - - * solib.c: Remove inclusion of libelf.h and elf/mips.h. - (elf_locate_base): Use only standard BFD functions to collect - information about the .dynamic section. Check for DT_MIPS_RLD_MAP - tag only if it got defined via the inclusion of <link.h>. - - * f-exp.y: Write block for OP_VAR_VALUE. - * f-valprint.c (info_common_command): Handle `info common' - without an argument correctly. - - * c-typeprint.c (c_type_print_base): Handle template constructors. - * symtab.c (gdb_mangle_name): Handle template method mangling, - get rid of GCC_MANGLE_BUG code, which only applied to gcc-2.2.2. - -Fri Sep 16 16:06:08 1994 Per Bothner (bothner@kalessin.cygnus.com) - - * gdbtypes.h (TYPE_INDEX_TYPE): New macro. - * ch-typeprint.c, ch-valprint.c: Use TYPE_INDEX_TYPE. - * ch-valprint.c (chill_val_print): Pass index type directly - (instead of its TYPE_TARGET_TYPE) to print_type_scalar. - * stabsread.c (read_type): Don't set TYPE_FLAG_TARGET_STUB - if the index type is a stub. - -Fri Sep 16 17:18:44 1994 Stan Shebs (shebs@andros.cygnus.com) - - * config/i386/{i386aix.mh, i386bsd.mh, i386lynx.mh, i386sco.mh, - i386sco4.mh, i386sol2.mh, i386v.mh, i386v32.mh, i386v4.mh, - ncr3000.mh, ptx.mh, ptx4.mh}, config/m68k/{altos.mh, apollo68v.mh, - delta68.mh, dpx2.mh, hp300bsd.mh, hp300hpux.mh, m68klynx.mh, - m68kv4.mh}, config/m88k/{delta88.mh, delta88v4.mh}, - config/mips/riscos.mh, config/pa/hppahpux.mh, - config/rs6000/rs6000lynx.mh, config/sparc/{sparclynx.mh, - sun4sol2.mh}, config/tahoe/tahoe.mh, config/vax/{vaxbsd.mh, - vaxult.mh, vaxult2.mh} (REGEX, REGEX1, SYSV_DEFINE): No longer - define. - * config/i386/i386sco4.mh (MUNCH_DEFINE): No longer define. - -Fri Sep 16 15:40:34 1994 Stu Grossman (grossman@cygnus.com) - - * defs.h (QUIT): Call interactive_hook to allow GUI to interrupt. - Also, add decl for symtab_to_filename. - * source.c (symtab_to_filename): New. Returns the file - associated with a symtab. - * top.c: Define interactive_hook. Called during QUIT to animate - the GUI. - -Fri Sep 16 00:14:40 1994 Per Bothner (bothner@kalessin.cygnus.com) - - * stabsread.c (read_type): Handle stub types for bitstrings. - * stabsread.c (read_array_type): Check for stub domain type - using TYPE_FLAG_STUB, not its length. - * gdbtypes.c (create_set_type): Handle a stub domain type. - - * ch-exp.y: Get rid of some extra non-terminals, and move - their rules into primitive_value. - * parser-defs.h: Add comment about unary postfix operators. - * ch-lang.c (chill_op_print_tab): Add '->', postfix and prefix. - * expprint.c (print_subexp): Recognize unary postfix operator. - -Wed Sep 14 18:27:42 1994 Jason Molenda (crash@phydeaux.cygnus.com) - - * remote-hms.c: use remote_debug instead of hms_silent toggle. - Add warnings about depreciation of `snoop' cmd. - -Wed Sep 14 18:18:58 1994 Steve Chamberlain (sac@jonny.cygnus.com) - - * remote-hms.c (hms_read_inferior_memory): Cope when - target sends both \r and \n. - -Wed Sep 14 17:14:57 1994 Stan Shebs (shebs@andros.cygnus.com) - - * remote-mips.c (mips_error): Place NORETURN macro correctly. - * TODO: Add item about START_INFERIOR_TRAPS_EXPECTED. - -Wed Sep 14 14:26:21 1994 Jim Kingdon (kingdon@lioth.cygnus.com) - - * xcoffread.c (read_xcoff_symtab): Fix obsolete comment about - mst_solib_trampoline. - - * f-valprint.c (f_val_print): Change cast of valaddr from - CORE_ADDR * to char **, since that is how it is used. - - * dbxread.c (read_dbx_dynamic_symtab): Save copy of symbol names - using obsavestring, and pass that to prim_record_minimal_symbol. - Having the objfile point to bfd_asymbol_name directly doesn't work - if we save and restore a mapped symbol file. - - -Tue Sep 13 18:23:26 1994 Rob Savoye (rob@darkstar.cygnus.com) - - * w89k-rom.c, op50-rom.c, monitor.c, config/pa/hppapro.mt: New files - to add a generic ROM monitor interface, and support file for the - WinBond W89K and the Oki OP50N PA based target boards. - - -Sun Sep 11 22:34:57 1994 Jeff Law (law@snake.cs.utah.edu) - - * config/pa/tm-hppa.h (REGISTER_NAMES): Use r26-r23 for arg0-arg3. - -Sun Sep 11 04:36:47 1994 Peter Schauer (pes@regent.e-technik.tu-muenchen.de) - - * irix5-nat.c, osfsolib.c, solib.c (solib_add): Simplify last - change by replacing `symbols_added' with `so_last'. - * mdebugread.c (parse_external, parse_partial_symbols): Ignore - global common symbols, they will be resolved by the runtime loader. - * mdebugread.c (parse_symbol, parse_partial_symbols, cross_ref): - Handle scSCommon like scCommon symbols. - -Sat Sep 10 01:43:28 1994 Peter Schauer (pes@regent.e-technik.tu-muenchen.de) - - * corelow.c (add_solib_stub): Copy to_sections changes from - core_ops to current_target after adding the shared libraries. - * partial-stab.h (N_EXCL), dbxread.c (add_old_header_file, - find_corresponding_bincl_psymtab): Change `repeated header not seen' - error to a complaint, simplify complaint. - * procfs.c (signalname, errnoname): Make `name' const. - * symfile.c (reread_symbols): Use filename from old BFD to - reopen the objfile. - * values.c (record_latest_value): Don't record value in the - history chain until we are sure there won't be an error. - -Fri Sep 9 15:52:09 1994 J.T. Conklin (jtc@phishhead.cygnus.com) - - * nlm/Makefile.in: remove MMALLOC, READLINE, TERMCAP, and other - cruft. - - * config/i386/gdbserve.mt: New file, defs for i386 nlm stub. - -Thu Sep 8 17:14:43 1994 Steve Chamberlain (sac@jonny.cygnus.com) - - * remote.c (fromhex): Make error more explicit. - (read_frame): Don't print bad checksum information unless - remote_debugging. Don't use repeat count unless it's > 0. - * remote-e7000.c (expect): When echoing, ignore multiple newlines. - (e7000_insert_breakpoint, e7000_remove_breakpoint, target_ops): - Optionally cope with BC style breakpoints. - (e7000_command): After command send directly to the E7000 mark - registers as changed. - (why_stop, e7000_wait: Understand BC style stop condition. - * sh-tdep.c (sh_skip_prologue): Understand more complicated - sequences. (frame_find_saved_regs): Likewise. - * config/h8500/tm-h8500.h (target_write_pc, TARGET_WRITE_PC): - Handle extra arg. - * config/i386/xm-go32.h (GDBINIT_FILENAME): Set to gdb.ini. - (more work here to come) - * config/sh/tm-sh.h (EXTRA_FRAME_INFO): Add f_offset and leaf_function - fields. - -Thu Sep 8 16:15:34 1994 J.T. Conklin (jtc@rtl.cygnus.com) - - * sparclite/Makefile.in: Assorted stuff needed for eload. - - * sparclite/eload.c: Merge in command line argument parsing and - error message handling improvements orignally made to aload.c. - -Wed Sep 7 23:24:50 1994 Jeff Law (law@snake.cs.utah.edu) - - * defs.h (enum misc_command_type, command_control_type): Enums - for describing the command and control types. - (struct command_line): Add new fields to keep track of the command - type and body associated with the command. - * top.c: Include value.h. Delete whitespace at the end of lines. - (build_command_line, get_command_line): New functions. - (execute_control_command, while_command, if_command): Likewise. - (realloc_body_list, read_next_line): Likewise. - (recurse_read_control_structure): Likewise. - (execute_user_command): Call execute_control_command. - (read_command_lines): Simplify by calling read_next_line, call - read_control_structure for "if" and "while" commands. - (free_command_lines): Free new fields in the command structure. - (define_command): Reset control_level to zero. - (init_main): Install command handlers for "if" and "while" commands. - -Tue Sep 6 16:24:07 1994 Stan Shebs (shebs@andros.cygnus.com) - - * c-typeprint.c (c_type_print_varspec_prefix, - c_type_print_varspec_suffix): Add cases for Fortran type codes. - * eval.c (evaluate_subexp): For OP_ARRAY expressions in Fortran, - call f77_value_literal_string instead. - * f_exp.y: Include <string.h>, move include of parser-defs.h. - (parse_number): Translate 'd' floats to 'e' so atof() works. - (yylex): Remove unused variables. - * f-lang.c: Include <string.h>. - (get_bf_for_fcn): Remove unused variable. - * f-typeprint.c (f_type_print_varspec_prefix, - f_type_print_varspec_suffix): Remove unused - variables, add cases to switch statements. - (f_type_print_base): Remove unused variables. - * f-valprint.c (gdbcore.h, command.h): Include. - (f77_get_dynamic_lowerbound, f77_get_dynamic_upperbound): - Call read_memory_integer with correct number of arguments. - (f77_get_dynamic_upperbound): Call f77_get_dynamic_lowerbound - with correct argument type. - (f77_print_array): Removed unused array array_size_array. - (f_val_print): Don't use a CORE_ADDR as a char *. - * valops.c (value_cast): Handle COMPLEX and BOOL types. - (value_assign): Handle Fortran literal string and complex values. - (f77_cast_into_complex, f77_assign_from_literal_string, - f77_assign_from_literal_complex): New functions. - -Mon Sep 5 14:46:41 1994 Per Bothner (bothner@kalessin.cygnus.com) - - * ch-typeprint.c (chill_type_print_base): Make TYPE_CODE_RANGE - case more robust. - -Sun Sep 4 16:06:34 1994 Stan Shebs (shebs@andros.cygnus.com) - - * i960-tdep.c (signal.h): Don't include. - - * cxux-nat.c (target_is_m88110): Remove definition. - - * configure.in (config/nm-empty.h): If cross only, use instead - of config/nm-trash.h. - * config/nm-trash.h: Remove. - * config/nm-empty.h: New file. - * config/i386/nm-m3.h: New file, includes config/nm-m3.h. - * config/mips/nm-m3.h: New file, includes config/nm-m3.h. - * config/m68k/nm-sysv4.h: New file, includes config/nm-sysv4.h. - * config/mips/nm-sysv4.h: New file, includes config/nm-sysv4.h. - * config/sparc/nm-sysv4.h: New file, includes config/nm-sysv4.h. - - -Fri Sep 2 17:35:55 1994 J.T. Conklin (jtc@phishhead.cygnus.com) - - * configure.in: No longer look for nm, tm, and xm headers in - config/<header>; they are always in config/<cpu>/<header>. - -Fri Sep 2 16:40:03 1994 Stan Shebs (shebs@andros.cygnus.com) - - * objfiles.c (allocate_objfile): Add the newly-created objfile to - the end of the list of objfiles, instead of at the beginning. - - * xcoffread.c (allocate_include_entry): New function, abstracted - from code in record_include_begin. - (record_include_begin, record_include_end): Call it. - - * blockframe.c (reinit_frame_cache): Test inferior_pid instead of - target_has_stack to decide whether to create a real stack frame - for the cache. - - * coffread.c (process_coff_symbol) [CXUX_TARGET]: Ignore vendor - section. - * config/m88k/tm-cxux.h (CXUX_TARGET): Define. - - * h8300-tdep.c: Include "dis-asm.h" instead of <dis-asm.h>. - -Fri Sep 2 09:51:46 1994 J.T. Conklin (jtc@cygnus.com) - - * config/sparc/tm-nbsd.h: Add #defines to map NetBSD struct and - field names into what is expected by sparc-nat.c. - -Thu Sep 1 17:32:54 1994 Per Bothner (bothner@kalessin.cygnus.com) - - * c-typeprint.c (c_typedef_print): Add missing Chill support. - -Thu Sep 1 15:41:21 1994 Stu Grossman (grossman@cygnus.com) - - * rs6000-pinsn.c (print_insn): Use powerpc disassembler when - doing Power PC. - * config/powerpc/tm-ppc-nw.h: Define GDB_TARGET_POWERPC. - - * config/i386/i386lynx.mh, config/m68k/m68klynx.mh, - config/rs6000/rs6000lynx.mh, config/sparc/sparclynx.mh: Enable - ser-tcp. - - * nlm/Makefile.in: Get rid of NWSOURCE. - * nlm/alpha-io.S (inVti, outVti): Remove extraneous ldha's. - * nlm/gdbserve.o: Add dummy __main routine. - * nlm/gdbserve.def: Turn on debug. - -Thu Sep 1 12:36:39 1994 Jim Kingdon (kingdon@cygnus.com) - - * config/xm-nbsd.h: Don't define SET_STACK_LIMIT_HUGE; it is obsolete. - -Thu Sep 1 11:01:40 1994 J.T. Conklin (jtc@rtl.cygnus.com) - - * config/tm-nbsd.h: New file, support for all NetBSD targets. - * config/xm-nbsd.h: fix typo. - * config/sparc/{nm,tm,xm}-nbsd.h: New files, renamed from - {nm,tm,xm}-sparcnbsd.h to conform to prefered file naming - conventions. - * configure.in: (sparc-*-netbsd): use config/sparc/nbsd.m[ht]. - -Wed Aug 31 14:40:33 1994 Jason Molenda (crash@phydeaux.cygnus.com) - - * remote-udi.c (udi_read_inferior_memory,udi_write_inferior_memory): - change typeo in error msg (`inferrior' -> `inferior'). - -Wed Aug 31 09:17:02 1994 Jim Kingdon (kingdon@cygnus.com) - - * inflow.c (set_sigint_trap, clear_sigint_trap): Check for - attach_flag (this check was performed by the callers). Also check - inferior_thisrun_terminal. - * inftarg.c (child_wait), lynx-nat.c (child_wait), - procfs.c (wait_fd), symm-nat.c (child_wait): Don't check - attach_flag in deciding whether to call set_sigint_trap and - clear_sigint_trap. - - * value.h (struct value): Change literal_data from PTR to char *, - since that is the way it is used. - -Tue Aug 30 21:56:54 1994 Jeff Law (law@snake.cs.utah.edu) - - * somread.c (som_symfile_read): Force unwinds to be re-read after - reading in a new partial symbol table. - -Tue Aug 30 13:14:16 1994 Stan Shebs (shebs@andros.cygnus.com) - - * config/h8500/tm-8500.h (DONT_USE_REMOTE): Remove definition, - an obsolete conditional. - * config/pa/tm-hppa.h (BREAKPOINT) [KERNELDEBUG]: Remove use, - an obsolete conditional. - * config/rs6000/rs6000.mh, config/rs6000/rs6000.mt: Clean up - comments. - -Mon Aug 29 14:39:42 1994 Stan Shebs (shebs@andros.cygnus.com) - - * Makefile.in (ns32k-opcode.h): Remove reference. - (ns32k-pinsn.o): Update dependencies. - * ns32k-opcode.h: Remove file. - * ns32k-pinsn.c (print_insn): Call version in libopcodes, remove - all other code in this file. - -Mon Aug 29 12:04:07 1994 Stu Grossman (grossman@cygnus.com) - - * nlm/configure.in: Stop using cpu.c. Put it in TDEPFILES instead. - * config/alpha/gdbserve.mt (TDEPFILES): Remove alpha-patch.o. - - * nlm/Makefile.in: Add rule for .S.o. - * nlm/aio.h: Protect from multiple inclusions. - * nlm/alpha-io.S: Remove everything we don't need. - * nlm/{alpha-patch.c, alpha-patch.h, alpha-uart.c, alpha-uart.h}: - Remove, no longer needed. - * nlm/alpha.c: Merge in lots of stuff from previous files. - * nlm/alpha.h: Don't #include alpha-patch.h. Make - breakpoint_insn extern. - * Move stuff from alpha-patch.h into here. - - * config/alpha/gdbserve.mt (TDEPFILES): Get rid of alpha-uart.o. - -Mon Aug 29 11:34:34 1994 Jim Kingdon (kingdon@cygnus.com) - - * annotate.c (annotate_starting): Flush output. - -Sat Aug 27 23:32:43 1994 Peter Schauer (pes@regent.e-technik.tu-muenchen.de) - - * symfile.c (symbol_file_add): Move reinit_frame_cache call to - the callers of symbol_file_add. Gets rid of heuristic fence-post - warnings on mips and alpha targets when the PC resides in a shared - library which is not yet read in. - * coff-solib.c (coff_solib_add), cxux-nat.c (add_shared_symbol_files), - irix5-nat.c (solib_add), osfsolib.c (solib_add), - remote-vx.c (vx_open), solib.c (solib_add): - Add call to reinit_frame_cache after all shared libraries are read in. - * remote-udi.c (udi_load), remote-vx.c (vx_load_command), - symfile.c (symbol_file_command, add_symbol_file_command): - Add call to reinit_frame_cache after symbol_file_add. - -Wed Aug 24 17:45:14 1994 J.T. Conklin (jtc@cygnus.com) - - * config/xm-nbsd.h: New file, support for all NetBSD ports. - * config/sparc/{nm-sparcnbsd.h,tm-sparcnbsd.h,xm-sparcnbsd.h, - sparcnbsd.mh,sparcnbsd.mt}: New files, support for NetBSD/sparc. - * configure.in: Add sparc-*-netbsd target. - -Wed Aug 24 13:17:34 1994 Stan Shebs (shebs@andros.cygnus.com) - - * remote-vx.c (vx_attach): Interpret the command argument as an - unsigned long. - -Wed Aug 24 13:08:08 1994 Ian Lance Taylor (ian@sanguine.cygnus.com) - - * configure.in: Change i[34]86 to i[345]86. - * nlm/configure.in: Likewise. - * gdbserver/configure.in: Likewise. - -Wed Aug 24 09:41:09 1994 J.T. Conklin (jtc@cygnus.com) - - * configure.in (i386-*-netware): Automatically configure nlm - subdir. - -Tue Aug 23 17:51:13 1994 J.T. Conklin (jtc@cygnus.com) - - * nlm/gdbserve.c: conditionalize header file inclusion for either - NetWare 4.0 or PIN targets. - * nlm/i386.c: include appropriate header files. - * nlm/prelude.c: define TERMINATE_BY_UNLOAD for NetWare 4.0 - targets. - -Tue Aug 23 16:54:16 1994 Stu Grossman (grossman@cygnus.com) - - * nlm/ppc.c (set_step_traps clear_step_traps): Cleanups. - * nlm/gdbserve.def: Autoload clib. - -Tue Aug 23 12:05:19 1994 Jim Kingdon (kingdon@cygnus.com) - - * breakpoint.c (condition_command): Call breakpoints_changed. - - * gdbtypes.h: Declare f77_create_literal_string_type and - f77_create_literal_complex_type. - * valops.c (f77_value_literal_string, f77_value_substring, - f77_value_literal_complex): Use xmalloc not malloc. - * valops.c (f77_value_literal_string, f77_value_substring): - Make addr char * not CORE_ADDR. - * value.h (struct value): Add new field literal_data of aligner union. - (VALUE_LITERAL_DATA): Use it. - * f-lang.h: Declare find_common_for_function. - * value.h, valops.c: Split VALUE_SUBSTRING_START into memaddr and - myaddr fields of a union. Don't overload it with the frame field - (not sure this is necessary; I'm not sure what lval_* codes - VALUE_SUBSTRING_* can be used with). - -Mon Aug 22 11:45:01 1994 Stan Shebs (shebs@andros.cygnus.com) - - * config/a29k/{a29k-kern.mt,a29k-udi.mt,a29k.mt,ultra3.mh, - ultra3.mt}: Clean up comments, remove no-longer-used definitions. - - * rs6000-nat.c: Include libbfd.h again, needed until reference - to bfd_cache_lookup is cleaned out. - - * config/i386/linux.mh (XM_CLIBS): Add -lm. - -Mon Aug 22 10:42:15 1994 Steve Chamberlain (sac@jonny.cygnus.com) - - Work to reduce the interrupts-off duration when running in DOS. - * ser-go32.c: (dos_async_ready): See if anything is in the buffer. - (dos_async_rx): rewrite to unpack as many characters from the - asynctsr as possible into a local buffer. - -Fri Aug 19 14:55:45 1994 Stan Shebs (shebs@andros.cygnus.com) - - Initial Fortran language support, adapted from work by Farooq Butt - (fmbutt@engage.sps.mot.com). - * Makefile.in: Add Fortran-related files and dependencies. - * defs.h (language_fortran): New language enum. - * language.h (_LANG_fortran): Define. - (MAX_FORTRAN_DIMS): Define. - * expression.h: Reformat to standard. - (MULTI_F77_SUBSCRIPT, OP_F77_UNDETERMINED_ARGLIST, - OP_F77_LITERAL_COMPLEX, OP_F77_SUBSTR): New expression opcodes. - * gdbtypes.h (TYPE_CODE_COMPLEX, TYPE_CODE_LITERAL_COMPLEX, - TYPE_CODE_LITERAL_STRING): New type codes. - (type): New fields upper_bound_type and lower_bound_type. - (TYPE_ARRAY_UPPER_BOUND_TYPE, TYPE_ARRAY_LOWER_BOUND_TYPE, - TYPE_ARRAY_UPPER_BOUND_VALUE, TYPE_ARRAY_LOWER_BOUND_VALUE): New - macros. - (builtin_type_f_character, etc): Declare. - * value.h (VALUE_LITERAL_DATA, VALUE_SUBSTRING_START): Define. - * f-exp.y: New file, Fortran expression grammar. - * f-lang.c: New file, Fortran language support functions. - * f-lang.h: New file, Fortran language support declarations. - * f-typeprint.c: New file, Fortran type printing. - * f-valprint.c: New file, Fortran value printing. - * eval.c (evaluate_subexp): Add code for new expression opcodes, - fix wording of error message. - * gdbtypes.c (f77_create_literal_complex_type, - f77_create_literal_string_type): New functions. - * language.c (set_language_command): Add Fortran info. - (calc_f77_array_dims): New function. - * parse.c (length_of_subexp, prefixify_subexp): Add cases for new - expression opcodes. - * symfile.c (deduce_language_from_filename): Recognize .f and .F - as Fortran source files. - * valops.c (f77_value_literal_string, f77_value_substring, - f77_value_literal_complex): New functions. - -Fri Aug 19 13:35:01 1994 Peter Schauer (pes@regent.e-technik.tu-muenchen.de) - - * c-typeprint.c (c_print_type): Assume demangled arguments - if a '(' is found in varstring, looking for ')' at the end of - varstring did fail with demangled const member functions, which - have a trailing `const'. - * remote.c (get_offsets, putpkt): Change to `char' buffers, - to avoid errors when compiling with DEC c89. - (remote_wait): Cast to `char *' before passing buffer to - fputs_filtered, to avoid errors when compiling with DEC c89. - (remote_wait): Do not return inferior_pid by default, this - statement is never reached, which causes warnings from some - compilers. - * stabsread.c (scan_file_globals): Ignore static minimal symbols. - * symfile.c (load_command): If called with no argument, try - to get the filename from the executable file. - (generic_load): Remove check for NULL filename, it is done - in load_command now. - -Fri Aug 19 10:36:15 1994 Jeff Law (law@snake.cs.utah.edu) - - * Makefile.in (ALLDEPFILES): Add hpread.c. - (hpread.o): Add dependencies. - - * somread.c: Do not include "aout/aout64.h". SOM has nothing to - do with a.out. - (BYTES_IN_WORD): Delete. - (som_symfile_read): Call hpread_build_psymtabs to build any - minimal symbols based on the HP C native debug symbols. - (som_symfile_finish): Call hpread_symfile_finish. - (som_symfile_init): Call hpread_symfile_init. - * config/pa/tm-hppa.h (HPREAD_ADJUST_STACK_ADDRESS): Define. - * hppa-tdep.c (hpread_adjust_stack_address): New function. - - * config/pa/hppabsd.mh (NATDEPFILES): Add hpread.o - * config/pa/hppahpux.mh (NATDEPFILES): Likewise. - * hpread.c: New file. - -Fri Aug 19 00:40:55 1994 Jeff Law (law@snake.cs.utah.edu) - - * hppa-tdep.c (skip_trampoline_code): Revert incorrect change - from June 2, 1994 (what was I thinking?!?). Fix it right this - time. - -Thu Aug 18 17:01:35 1994 J.T. Conklin (jtc@rtl.cygnus.com) - - * nlm/i386.c, nlm/i386.h: New files that contain i386 specific code. - -Thu Aug 18 14:39:46 1994 Stan Shebs (shebs@andros.cygnus.com) - - * README: Grammar improvements, clarifications, updates. - -Wed Aug 17 23:08:53 1994 Stu Grossman (grossman@cygnus.com) - - * Makefile.in (TARGET_FLAGS_TO_PASS): Pass down LD_FOR_TARGET and - NLMCONV_FOR_TARGET. (SUBDIRS): Add nlm target. - * configure.in (powerpc-*-netware*): Automatically configure nlm - subdir. - * nlm/Makefile.in: Add {CC NLMCONV LD}_FOR_TARGET. Remove alpha - specific stuff. Make things more configurable. - * nlm/configure.in: Add powerpc-*-netware* target. Use - gdbserve.mt/cpu.c/cpu.h for target stuff. Get rid of tm/xm/nm.h - files. - * nlm/gdbserve.c: Move Alpha specific stuff into other files. - Remove lots of architecture-specific stuff. - * nlm/gdbserve.def: Add new imports. - * nlm/ppc.c, nlm/ppc.h: New files that contain PowerPC specific code. - * nlm/prelude.c: Don't include libhooks.h, get rid of call to - register library. - * nlm/prelude.o: What was this doing here? - * config/alpha/gdbserve.mt: Defs for alpha nlm stub. - * config/powerpc/gdbserve.mt: Defs for PowerPC nlm stub. - * config/powerpc/ppc-nw.mt: Defs for PowerPC target for GDB. - * config/powerpc/tm-ppc-nw.h: Ditto. - - * nlmstub.def: New file, contains imports for 386 nlm stub. - -Wed Aug 17 23:17:33 1994 Rob Savoye (rob@darkstar.cygnus.com) - - * remote-pa.c: New file for HPPA embedded support. Currently it's - a copy of remote.c. - * config/pa/hppabsd.mt,hppahpux.mt,hppaosf.mt: User remote-pa.c. - -Wed Aug 17 13:19:52 1994 Stan Shebs (shebs@andros.cygnus.com) - - * config/m68k/tm-delta68.h (EXTRACT_RETURN_VALUE, - STORE_RETURN_VALUE): Define to use %a0 for pointers. - -Wed Aug 17 07:43:06 1994 Jim Kingdon (kingdon@lioth.cygnus.com) - - * remote-mips.c: Remove unused declaration of mips_load. - -Tue Aug 16 16:45:34 1994 Stan Shebs (shebs@andros.cygnus.com) - - * coffread.c: General cleanup, and support for section offsets. - (time.h, sys/types.h, libbfd.h): Don't include. - (cur_src_start_addr, cur_src_end_addr): Rename to - current_source_start_addr, current_source_end_addr. - (nlist_stream_global): Remove. - (nlist_bfd_global): New global variable. - (coff_symfile_read): Remove code that gets and uses fileno() - directly. - (read_coff_symtab, enter_linenos, process_coff_symbol): Add - section_offsets parameter, add text/data section offset to - appropriate symbols' values. - (read_one_sym): Use bfd_read instead of fread. - (init_stringtab, init_lineno): Change first parameter to a bfd, - use bfd routines instead of raw I/O. - -Tue Aug 16 15:24:03 1994 Jim Kingdon (kingdon@lioth.cygnus.com) - - * symtab.c (decode_line_1): If funfirstline and we get a - non-LOC_BLOCK symbol (e.g. variable or type), then error(). - - * Makefile.in (TARFILES, NONSRC, SFILES_STAND, SFILES_KGDB): - Remove; unused. - (TAGFILES_NO_SRCDIR): Remove ALLPARAM. - (HFILES_NO_SRCDIR): Remove all files in config sub-directory. - (TAGS): Also pass result of find on config sub-directory to etags. - (ALLPARAM): Remove; now unused. - -Sun Aug 14 13:05:26 1994 Fred Fish (fnf@cygnus.com) - - * Makefile.in (VERSION): Bump to 4.13.1 - * NEWS, README: Update to match gdb 4.13 release version. - -Sat Aug 13 08:22:50 1994 Fred Fish (fnf@cygnus.com) - - Harris CX/UX support, from Bob Rusk (rrusk@mail.csd.harris.com). - * cxux-nat.c: Remove dangling #else block. - (m88k_harris_core_register_addr): New function. - - * environ.c (init_environ): If no environment, do nothing. - -Fri Aug 12 19:30:53 1994 Jeff Law (law@snake.cs.utah.edu) - - * hpread.c: Delete rest of TODO list. Do not include "libbfd.h", - <time.h>, <sys/types.h>, "demangle.h", <sys/file.h>, - "expression.h", "language.h", "gdbtypes.h", "demangleh". - Move all global variables into the private symbol table structure - and add accessor macros. Update some comments. - (hpread_build_psymtabs): Delete dbsubc_addr, we don't need it. - (hpread_end_psymtab): New function to end a partial symbol table, - all callers changed (no more bogus sharing with dbxread.c). - -Fri Aug 12 15:52:37 1994 Stu Grossman (grossman@cygnus.com) - - * remote.c (remote_wait): Return inferior_pid instead of 0 for - `W` message. - -Fri Aug 12 11:47:10 1994 J.T. Conklin (jtc@phishhead.cygnus.com) - - * sparclite/aload.c (sys_error, error): Use vfprintf for variable - argument lists. - -Thu Aug 11 04:06:42 1994 Doug Evans (dje@canuck.cygnus.com) - - * defs.h (concat, basename, buildargv, freeargv, strerrno, strsigno, - errno_max, signo_max, strtoerrno, strtosigno): Delete. - Include "libiberty.h" instead. - -Wed Aug 10 13:23:47 1994 Rick Sladkey (jrs@world.std.com) - - * i386v-nat.c (i386_insert_nonaligned_watchpoint): - add additional argument specifying raw address to permit - proper release of debug registers. - (i386_insert_watchpoint, i386_insert_aligned_watchpoint): - change all callers. - -Wed Aug 10 16:13:45 1994 Stu Grossman (grossman@cygnus.com) - - * defs.h, top.c: Use `extern' in declarations of GUI hooks, and - define them in top.c. Add comments to the hooks. - -Wed Aug 10 15:57:43 1994 Doug Evans (dje@canuck.cygnus.com) - - * remote-sim.c (gdbsim_ops): Set `to_insert_breakpoint' and - `to_remove_breakpoint' fields. - -Wed Aug 10 15:46:03 1994 Jim Kingdon (kingdon@lioth.cygnus.com) - - * infcmd.c (run_command): Remove comment suggesting using - target_has_execution instead of inferior_pid. - -Wed Aug 10 10:33:20 1994 Kung Hsu (kung@mexican.cygnus.com) - - * remote-mips.c (mips_open): add code to handle baud rate. - -Tue Aug 9 09:44:42 1994 Stu Grossman (grossman@cygnus.com) - - * infrun.c (wait_for_inferior): Call target_resume() upon - detection of new processes. - - * procfs.c (create_procinfo): Return pointer to new procinfo - structure. - * (do_detach): Spacing & formatting cleanup. - * (procfs_wait): Move wait_again label to ensure that we really - wait again. On exit from fork, release new child from gdbs' - clutches. - * (procfs_set_sproc_trap): Enable trapping of fork and vfork. - -Mon Aug 08 15:34:13 1994 Jeff Law (law@snake.cs.utah.edu) - - * hpread.c (hpread_process_one_debug_symbol): Fix block scoping - problem (losing localvars on the close-brace instead of after - the close brace). - -Mon Aug 8 15:09:32 1994 J.T. Conklin (jtc@phishhead.cygnus.com) - - * i386-nlmstub.c (handle_exception): Wait until the thread has - been started before killing the NLM by pointing the PC at - _exit(). - -Sat Aug 6 22:27:30 1994 Peter Schauer (pes@regent.e-technik.tu-muenchen.de) - - * config/mips/tm-irix5.h (IN_SIGTRAMP): Redefine for Irix 5, - Irix 5 has a standard _sigtramp signal handler. - * irix5-nat.c (solib_add): Get rid of sigtramp_address handling, - it is not needed for a standard _sigtramp signal handler. - Add shared library sections to the section table of the target - before adding the symbols. - * mips-tdep.c (mips_skip_prologue): Do not skip load immediate - instructions that do not prepare a stack adjustment. - * regex.c (SIGN_EXTEND_CHAR): Update to emacs-19.25 definition, - which does the right thing on machines where `char' is unsigned. - -Fri Aug 5 17:50:59 1994 Stu Grossman (grossman@cygnus.com) - - * remote.c (remote_open): Move setting of inferior_pid prior to - call to remote_start_remote. Also use unique value for pid to - avoid confusion with read_register_pid & friends. - * (remote_wait): Return inferior_pid instead of 0 in all cases. - -Fri Aug 5 12:23:02 1994 Stan Shebs (shebs@andros.cygnus.com) - - * dwarfread.c (bfd.h): Don't include. - -Fri Aug 5 09:08:34 1994 J.T. Conklin (jtc@phishhead.cygnus.com) - - * i386-nlmstub.c (handle_exception): Point the PC at _exit() to - kill the program being debugged. KillMe(), the undocumented - call intended for this purpose, causes the server to hang. - -Thu Aug 4 16:26:06 1994 Steve Chamberlain (sac@jonny.cygnus.com) - - * remote.c (read_frame): Calculate run length encoded checksum - correctly. - * config/sh/stub.c: New file. - -Thu Aug 4 14:34:12 1994 Stu Grossman (grossman@cygnus.com) - - * target.c (find_default_run_target): Make sure to_can_run is set - before calling it. - -Thu Aug 4 11:46:27 1994 Jim Kingdon (kingdon@lioth.cygnus.com) - - * TODO: Remove note about fast watchpoints and remove obsolete - Mach stuff. - -Thu Aug 4 11:08:03 1994 Stan Shebs (shebs@andros.cygnus.com) - - * config/i386/xm-i386v4.h, config/m68k/xm-m68kv4.h, - config/sparc/xm-sun4sol2.h (NORETURN): Don't define. - * config/m88k/tm-cxux.h (ARCH_NUM_REGS): Undefine before defining. - -Thu Aug 4 10:26:36 1994 Stu Grossman (grossman@rtl.cygnus.com) - - * target.c (add_target): Don't call clean_target on target - vectors anymore. - * (unpush_target): Test for to_close being set before calling. - * (target_xfer_memory, target_info): Check for to_has_memory - before playing with memory. - - * remote.c (remote_open): Set inferior_pid to make kill command - happy. - * inflow.c (kill_command): Revert change of Aug 2. Use - inferior_pid to determine whether to print out "The program is not - being run." message. - -Thu Aug 4 07:55:04 1994 Jim Kingdon (kingdon@lioth.cygnus.com) - - * config/i386/i386m3.mh (NAT_CLIBS): Add -lmachid and -lnetname. - * m3-nat.c, config/nm-m3.h: #if 0 REQUEST_QUIT stuff. - * m3-nat.c: Pass argument to return_to_top_level. - Declare m3_kill_inferior before use. - (port_chain_insert): In "can't happen" case, abort rather than - setting `mid' to large decimal constant (which gcc warns about). - (get_thread_name): Use cast to convert const char * to char *. - (add_mach_specific_commands): #if 0 "thread break" command. - (m3_trace_him): Call push_target. - (mach_really_wait): New argument pid; remove unused - variable pid. - (intercept_exec_calls): Call target_terminal_init and - target_terminal_inferior once the child execs. - * infrun.c (proceed): Pass argument to PREPARE_TO_PROCEED. - -Wed Aug 3 22:41:13 1994 Tom Lord (lord@x1.cygnus.com) - - * procfs.c (procfs_mourn_inferior): don't dereference the - procinfo pointer after it has been freed. - -Wed Aug 3 12:05:13 1994 Stan Shebs (shebs@andros.cygnus.com) - - * breakpoint.c (breakpoint_1): Improve pluralization in display - of breakpoint hit counts. - - * language.h (struct language_defn): Remove unused field - la_longest_float. - (longest_float): Remove, no longer used. - * language.c (unknown_language_defn, auto_language_defn, - local_language_defn): Remove init of la_longest_float field. - * c-lang.c (c_language_defn, cplus_language_defn, - asm_language_defn): Ditto. - * ch-lang.c (chill_language_defn): Ditto. - * m2-lang.c (m2_language_defn): Ditto. - -Tue Aug 2 10:58:34 1994 Stan Shebs (shebs@andros.cygnus.com) - - * defs.h (bfd_read, bfd_seek): Remove declarations. - * os9kread.c, rs6000-nat.c (libbfd.h): Don't include. - -Tue Aug 2 09:50:50 1994 J.T. Conklin (jtc@phishhead.cygnus.com) - - * inflow.c (kill_command): Fix a bug which prevented target - programs to be killed. - -Mon Aug 1 18:48:47 1994 Stan Shebs (shebs@andros.cygnus.com) - - * defs.h: Change two-line declarations to one-line form. - (NORETURN): Define as "volatile" only for older GCCs. - (ATTR_NORETURN): Define for newer GCCs. - * procfs.c (proc_init_failed): Add ATTR_NORETURN to declaration. - -Mon Aug 1 16:43:24 1994 Jim Kingdon (kingdon@lioth.cygnus.com) - - * breakpoint.c (mention), main.c (fputs_unfiltered): Add comments. - * breakpoint.c (delete_breakpoint, enable_breakpoint, - disable_breakpoint): Don't call breakpoints_changed; it is now - called via the *_breakpoint_hook functions. - * annotate.c (_initialize_annotate, breakpoint_changed): New functions. - -Mon Aug 1 13:38:04 1994 Kung Hsu (kung@mexican.cygnus.com) - - * stabsread.c (read_type): Fix a bug in enum size calculation. - -Mon Aug 1 01:36:13 1994 Jeff Law (law@snake.cs.utah.edu) - - * hppa-tdep.c (compare_unwind_entries): Add "const" to both - argument types to shut up GCC. - - * hppa-tdep.c (saved_pc_after_call): If the saved PC is in a - linker stub, then return the address the stub will return to. - (frame_saved_pc): Correctly restart the search for the saved - pc when a linker stub is encountered. - - * hppa-tdep.c (inst_saves_gr): Handle 16 and 8 bit instruction - register stores emitted by the version 9 HP compilers. - (inst_saves_fr): Relax test for a specific base register (%r1); - this avoids losing with the version 9 HP compilers. - (skip_prologue): Try to skip argument stores emitted by the HP - compilers. It's not perfect, but it's better than before. - -Fri Jul 29 23:20:30 1994 Stu Grossman (grossman@cygnus.com) - - * findvar.c (write_pc write_pc_pid): Remove casts to long when - calling write_register_pid. - * (write_register_pid): Add prototype. - -Fri Jul 29 21:56:23 1994 Steve Chamberlain (sac@jonny.cygnus.com) - - * remote.c (read_frame): Split readchar/checksum calculation into - two parts since evaluation order is undefined. - -Fri Jul 29 13:46:08 1994 Fred Fish (fnf@cygnus.com) - - From Kevin A. Buettner (kev@cujo.geg.mot.com). - * Makefile.in (coredep.o): Add inferior.h as dependency. - * inflow.c: Add F_SETOWN to list of defines to check - around code that uses F_SETOWN. - -Fri Jul 29 09:59:05 1994 J.T. Conklin (jtc@phishhead.cygnus.com) - - * Makefile.in (CC_FOR_TARGET, CXX_FOR_TARGET): If using newlib, - set the -L and -B directory prefixes so we can link with it. - -Thu Jul 28 14:37:36 1994 Stu Grossman (grossman@cygnus.com) - - * Makefile.in (INSTALLED_LIBS, CLIBS, DEPFILES): Add support for - --enable-xxx configure option by adding ENABLE_{CLIBS DEPFILES} - where appropriate. - - * General hackery to support alternate user-interface. - * breakpoint.c (mention, delete_breakpoint, enable_breakpoint, - disable_breakpoint): Call hooks for alternate user-interface. - * defs.h: Add declarations for alternate user-interface hooks. - * main.c (main): Add --nw (and --nowindows) options to disable - the GUI. - * (near call to command_loop): Call command_loop_hook if set. - * (fputs_unfiltered): Call fputs_unfiltered_hook if set. - * stack.c: Call print_frame_info_listing_hook if set. - * top.c (gdb_init): Initialize targets.c and utils.c prior to - other files to make sure that calls to error and warning will - work. Call init_ui_hook after everything else. - * utils.c (query): Call query_hook if set. - * (gdb_flush): Call flush_hook if set. - * Change _initialize_utils to initialize_utils cuz we don't use - automatic initialization of utils.c anymore. - - - * remote.c: Get rid of #ifdef DONT_USE_REMOTE. It's no longer - necessary. - -Thu Jul 28 14:52:01 1994 J.T. Conklin (jtc@phishhead.cygnus.com) - - * Makefile.in (CC_FOR_TARGET, CXX_FOR_TARGET): Use newlib if it is - there and we are using the gcc from the tree. - (LD_FOR_TARGET): Look for ld in ../ld/ld.new. - -Thu Jul 28 10:43:36 1994 Fred Fish (fnf@cygnus.com) - - * Makefile.in (annotate.o): Add dependencies. - -Wed Jul 27 14:34:42 1994 J.T. Conklin (jtc@phishhead.cygnus.com) - - * sparclite/aload.c: Added new -q (quiet) option. - return 0 exit status if file was successfully downloaded. - - * nlm/gdbserve.c: merge in command line argument parsing changes - and bug fixes made to i386-nlmstub.c. - - * i386-nlmstub.c: The returnLength field must be initialized - before portConfig is passed to AIOGetPortConfiguration. - Compare command line arguments with strnicmp(); args are - case insensitive on netware. - -Wed Jul 27 09:24:19 1994 Fred Fish (fnf@cygnus.com) - - * Makefile.in (DISTSTUFF): Add definition. - (diststuff): Add for new distribution support. - (gdb.tar.Z, make-proto-gdb.dir, setup-to-dist, - gdb-$(VERSION).tar.Z, make-proto-gdb-1, make-proto-testsuite.dir): - Remove old distribution building rules, now uses standard - distribution support in parent directory Makefile.in. - -Tue Jul 26 14:15:53 1994 Jim Kingdon (kingdon@lioth.cygnus.com) - - * target.c (push_target): Cast result from xmalloc. - -Tue Jul 26 18:20:46 1994 Paul Flinders (ptf@smee) - - * elfread.c (elf_symtab_read): Discard compiler labels generated - by the Solaris 2.1/Intel SunPro compiler. - -Mon Jul 25 18:19:24 1994 Stu Grossman (grossman@cygnus.com) - - * target.c (nomemory): Fix prototype and routine to take correct - args. - -Mon Jul 25 15:38:23 1994 Jim Kingdon (kingdon@lioth.cygnus.com) - - * Makefile.in (clean): Remove libgdb-files. - -Mon Jul 25 11:50:57 1994 Stan Shebs (shebs@andros.cygnus.com) - - * coredep.c: Include inferior.h. - -Mon Jul 25 11:36:02 1994 J.T. Conklin (jtc@phishhead.cygnus.com) - - * i386-nlmstub.c: Add support for NODE, PORT and BAUD command - line arguments. - -Sat Jul 23 14:36:09 1994 Stan Shebs (shebs@andros.cygnus.com) - - * symfile.c (deduce_language_from_filename): Recognize .S as asm, - .cp as C++, alphabetize better. - - * breakpoint.c (ignore, condition): Move usage note into body of - help text, so first line can be one-line summary. - -Sat Jul 23 00:58:15 1994 Stu Grossman (grossman@cygnus.com) - - * target.c (unpush_target): Fix handling of removal of top target. - -Fri Jul 22 17:30:39 1994 Stu Grossman (grossman@cygnus.com) - - * Makefile.in: Add stuff to build nlmstub. - * Add rule for annotate.o to keep Sun make happy. - * configure.in: Add config for powerpc/Netware. - - * partial-stab.h (near N_SO): Don't call START_PSYMTAB with null - filename. This speeds up handling of trailing N_SO stabs (they - mark the end of a .o file). - - * target.c, target.h: Change the way pushing and popping of - targets work to support target overlays and inheritance. - * corelow.c, hppa-tdep.c, inflow.c, remote-nindy.c, utils.c: - Fixup references to current_target, due to previous changes. - - * config/i386/tm-i386nw.h: Enable longjmp support. More work is - needed to get the address of longjmp out of the target. - -Tue Jul 19 13:25:06 1994 Stan Shebs (shebs@andros.cygnus.com) - - * main.c: Include <ctype.h>. - -Mon Jul 18 15:32:17 1994 Kung Hsu (kung@mexican.cygnus.com) - - * remote-mips.c (mips_readchar): Fix a bug in checking <IDT> - prompt. - -Mon Jul 18 14:26:35 1994 Stan Shebs (shebs@andros.cygnus.com) - - * solib.c (look_for_base): Don't deref exec_bfd if NULL. - -Sun Jul 17 15:38:36 1994 Fred Fish (fnf@cygnus.com) - - * Makefile.in (VERSION): Bump to 4.12.4. - -Sun Jul 17 12:20:35 1994 Stan Shebs (shebs@andros.cygnus.com) - - Harris CX/UX support, from Bob Rusk (rrusk@mail.csd.harris.com). - * configure.in (m88*-harris-cxux*): New configuration. - * cxux-nat.c, config/m88k/cxux.mh, config/m88k/cxux.mt, - config/m88k/xm-cxux.h, config/m88k/tm-cxux.h, config/m88k/nm-cxux.h: - New files. - * config/m88k/tm-m88k.h: Add comment about Harris OS. - (TARGET_WRITE_PC): Pass pid through to register writers. - - * configure.in (m68*): Put vendor-only-specified host configs - after vendor-and-os-specified configs. - (m68*-atari-sysv4*, m68*-cbm-sysv4*): Replace with m68*-*-sysv4. - - * config/m88k/delta88.mh (MUNCH_DEFINE): Remove. - * config/m88k/delta88.mt, config/m88k/delta88v4.mh: Format - consistently. - -Sat Jul 16 23:39:17 1994 Peter Schauer (pes@regent.e-technik.tu-muenchen.de) - - * elfread.c (elf_symtab_read): Handle error return from - bfd_get_dynamic_symtab_upper_bound gracefully. - -Sat Jul 16 14:43:17 1994 Stan Shebs (shebs@andros.cygnus.com) - - * inferior.h (ARCH_NUM_REGS): New macro, actual number of - registers in use by the inferior. - * coredep.c (fetch_core_registers, register_addr): Use it. - * findvar.c (registers_changed, registers_fetched, - read_register_bytes): Ditto. - * infcmd.c (do_registers_info, registers_info): Ditto. - * infptrace.c (fetch_inferior_registers, - store_inferior_registers): Ditto. - * stack.c (frame_info): Ditto. - - * coredep.c (CORE_REGISTER_ADDR): New macro. - (fetch_core_registers): Use it. - - * breakpoint.c (ignore, condition): Add usage notes to help strings. - * symfile.c (add-symbol-file): Add usage note to help string. - (add_shared_symbol_files_command): New command. - - gcc -Wall lint. - * inferior.h (read_pc_pid): Declare. - * breakpoint.c (watchpoint_check): Cache breakpoint in local - variable b, remove unused variable other_type_used. - * main.c (inferior.h, call-cmds.h): Include. - (gdb_init): Declare. - * remote.c (remote_wait): Return 0 by default. - -Fri Jul 15 16:43:33 1994 Stan Shebs (shebs@andros.cygnus.com) - - Stop printing at null char option, from Oliver Meyer - (omeyer@i3.informatik.rwth-aachen.de). - * valprint.h, valprint.c (stop_print_at_null): New global. - * valprint.c (_initialize_valprint): New print set subcommand - "null-stop". - * c-valprint.c (c_val_print): If stop_print_at_null is on, and - printing a char array, adjust the number of chars to print. - -Fri Jul 15 14:33:40 1994 Stan Shebs (shebs@andros.cygnus.com) - - From Kevin A. Buettner (kev@cujo.geg.mot.com). - * m88k-tdep.c (examine_prologue): Modified to handle prologues for - pic code in addition to prologues where an instruction from the - prologue gets moved into the delay slot of a branch instruction - immediately following the prologue. A table of potential prologue - instructions (prologue_insn_tbl) is now used for picking apart a - function prologue. - (frame_find_saved_regs): Changed the way in which limit gets set - so that the delay slot of branch instructions immediately - following the prologue gets examined. - (pushed_size, store_parm_word, store_parm, push_parameters, - collect_returned_value): Deleted. - -Fri Jul 15 01:06:00 1994 Peter Schauer (pes@regent.e-technik.tu-muenchen.de) - - * infrun.c (wait_for_inferior): Handle stepping into leaf - functions whose prologue consists of gp loading code only. - -Thu Jul 14 14:22:12 1994 Stan Shebs (shebs@andros.cygnus.com) - - * dbxread.c: Don't include libbfd.h. - * dwarfread.c, elfread.c somread.c: Don't include libbfd.h, - <time.h>, or <sys/types.h>. - * elfread.c (elf_symfile_read): Use only standard BFD functions to - collect information about the stab and stab string sections. - -Thu Jul 14 13:17:39 1994 Kung Hsu (kung@x1.cygnus.com) - - * stabsread.c (read_huge_number): handle large unsigned number - for stabs generated by os9k C compiler. - -Wed Jul 13 18:58:15 1994 Stan Shebs (shebs@andros.cygnus.com) - - Breakpoint hit counts, from Bob Rusk (rrusk@mail.csd.harris.com). - * breakpoint.h (hit_count): New breakpoint field. - * breakpoint.c (show_breakpoint_hit_counts): New variable. - (clear_breakpoint_hit_counts): New function. - (bpstat_stop_status): Increment the hit count. - (breakpoint_1): Display the hit count. - * infcmd.c (run_command): Reset breakpoint hit counts. - * target.c (generic_mourn_inferior): Don't clear ignore counts if - displaying hit counts. - -Tue Jul 12 12:23:15 1994 Peter Schauer (pes@regent.e-technik.tu-muenchen.de) - - * elfread.c (elf_symfile_read): Unconditionally add dynamic - symbols for all symbol files. Makes skipping over the - trampoline code work when stepping from a function in a shared - library into a function in a different shared library for Irix 5. - Other ELF targets do not have enough information in their - dynamic symbol tables to make this work. - (elf_symtab_read): Relocate mst_solib_trampoline address. - -Mon Jul 11 16:38:49 1994 Stan Shebs (shebs@andros.cygnus.com) - - Atari support, from Uwe Seimet (seimet@chemie.uni-kl.de). - * configure.in (m68*-atari-sysv4*): New configuration. - (m68*-cbm-sysv4*): Use m68kv4 instead of amix. - * m68k-tdep.c (R_PS): Define as R_SR if necessary. - * config/m68k/m68kv4.mh, config/m68k/m68kv4.mt, - config/m68k/tm-m68kv4.h, config/m68k/xm-m68kv4.h: New files. - * config/m68k/amix.mh, config/m68k/amix.mt, - config/m68k/tm-amix.h, config/m68k/xm-amix.h: Removed, superseded - by m68kv4 files. - -Sat Jul 9 16:28:43 1994 Peter Schauer (pes@regent.e-technik.tu-muenchen.de) - - * symtab.c (find_function_start_sal): New function to find - the start of a function from a function symbol. - (decode_line_1, decode_line_2): Use it instead of open coded - partial copies of the code. - (list_symbols): Quote symbol name before passing it to - break_command to enable proper handling of mangled symbols. - -Wed Jul 6 20:22:07 1994 Per Bothner (bothner@kalessin.cygnus.com) - - * ch-exp.y (match_simple_name_string): Don't lower-case here. - * ch-exp.y (yylex): First try name lookup using exact name - typed by user; if that fails, try lower-cased name. - -Wed Jul 06 12:39:07 1994 Jeff Law (law@snake.cs.utah.edu) - - * hpread.c: More cleanups. Delete lots of trailing whitespace. - Remove some items from the TODO list and notes throughout code - for things which need fixing. Add more comments. - Document bogus struct symloc sharing with dbxread.c. Delete more - useless variables. Add more PARAM prototypes. Fixup more - indention problems that have crept in. - (SET_NAMESTRING): Accept new namep and objfile arguments so that - it doesn't depend on the variable names on the procedures it's - used from. - (hpread_symfile_init): Delete incorrect checks for bogus sizes of - the debug sections. - -Wed Jul 6 00:48:57 1994 Peter Schauer (pes@regent.e-technik.tu-muenchen.de) - - * dbxread.c, elfread.c, mipsread.c, nlmread.c, os9kread.c: - Move "no debugging symbols found" test to symfile.c. - * symfile.c (syms_from_objfile, reread_symbols): Add - "no debugging symbols found" test. - * coffread.c (init_stringtab): Handle stripped files with a - stringtab offset of zero gracefully. - * osfsolib.c (solib_create_inferior_hook): Use DYNAMIC flag from - BFD instead of stop_pc heuristic to determine if it is a dynamically - linked object file. - * procfs.c (wait_fd): Handle ENOENT error return from PIOCWSTOP - ioctl, it indicates that the process has exited. - -Mon Jul 04 19:48:03 1994 Jeff Law (law@snake.cs.utah.edu) - - * hpread.c (hpread_symfile_init): Make sure to initialize all the - private data to zero. Not having any HP C debug symbols is not an - error. Just return. - -Mon Jul 4 19:28:56 1994 Jeff Law (law@snake.cs.utah.edu) - - * hppa-tdep.c (read_unwind_info): ELF unwind information is in the - .PARISC.unwind section now. - -Mon Jul 4 17:06:26 1994 Stan Shebs (shebs@andros.cygnus.com) - - * breakpoint.c (mention): Always show breakpoint address if no - source file. - -Sat Jul 2 01:51:33 1994 Peter Schauer (pes@regent.e-technik.tu-muenchen.de) - - * solib.c (bfd_lookup_symbol, look_for_base): Reinstate to reenable - handling of shared libraries for non-ELF executables, but only if - HANDLE_SVR4_EXEC_EMULATORS is defined. - (locate_base): Try to find debug_base in the dynamic linker - for non-ELF executables if HANDLE_SVR4_EXEC_EMULATORS is defined. - * config/sparc/tm-sun4sol2.h (HANDLE_SVR4_EXEC_EMULATORS): - Define to enable handling of shared libraries for a.out executables, - run under Solaris BCP. - -Fri Jul 01 19:50:21 1994 Jeff Law (law@snake.cs.utah.edu) - - * hpread.c: Change contribution notice to the Cygnus/Utah agreed - upon notice. Delete some stuff from the TODO list. Rework - many comments to be clearer. Major cleanups. Consistently - use "hpread_" prefix. Delete unnecessary macros, structures - variables, fiels, functions and #if 0 code. Mark code which - still needs to be cleaned up. PARAMize and make most functions - static. Fix error checking when reading in the debug section - contents. No more minimal symbol table handling in this code! - -Thu Jun 30 13:59:23 1994 Jim Kingdon (kingdon@lioth.cygnus.com) - - * infrun.c (wait_for_inferior): Print "Program exited normally" - regardless of batch_mode. - * defs.h, top.c (batch_mode): Removed. - -Wed Jun 29 18:53:36 1994 Stan Shebs (shebs@andros.cygnus.com) - - * Makefile.in (dcache_h): Remove redundant definition. - (init.c): Add a comment. - (top.c): Remove explicit compile action. - * breakpoint.c (mention): Share code indicating location of - break/watchpoints, don't print address if addressprint is off. - * breakpoint.c, c-typeprint.c, c-valprint.c, energize.c, symtab.h - (demangle): Remove redundant declarations. - * eval.c: Remove redundant function declarations. - * objfiles.h: Cosmetic and grammatical improvements. - * TODO: Various updates. - - * remote-mips.c: Replace all \r chars with \015. - (mips_receive_header): Display control characters readably. - (mips_xfer_memory): Add a simple progress display. - -Wed Jun 29 13:11:45 1994 Steve Chamberlain (sac@cirdan.cygnus.com) - - * remote-e7000.c (e7000_open): Don't try a tcp open if we're - using go32. - * remote-hms.c (flush): New function. - (expect): Get edge case right. - (hms_read_inferior_memory): Be more tolerant of line noise. - -Tue Jun 28 14:17:03 1994 Jim Kingdon (kingdon@lioth.cygnus.com) - - * configure.in: Use i386m3.mh and i386m3.mt as names of host and - target files, not non-existent mach3.mh and mach3.mt. - -Wed Jun 29 00:26:17 1994 Peter Schauer (pes@regent.e-technik.tu-muenchen.de) - - * dbxread.c (dbx_symfile_read): Unconditionally add dynamic - symbols for all symbol files. Makes skipping over the - trampoline code work when stepping from a function in a shared - library into a function in a different shared library. - (read_dbx_dynamic_symtab): Relocate mst_solib_trampoline address. - -Tue Jun 28 15:28:01 1994 Stu Grossman (grossman@cygnus.com) - - * dbxread.c, partial-stab.h (near N_SO): SO stabs with blank - names mean end of .o file. - * infrun.c (wait_for_inferior): Clean up multi-thread logic near - top of routine. Handle new thread notification cleanly. - * lynx-nat.c (child_wait): General cleanups, handle new LynxOS - thread notification scheme. - * (child_resume): General cleanups, handle resumption of all - threads properly. - -Mon Jun 27 09:57:23 1994 Steve Chamberlain (sac@cirdan.cygnus.com) - - * ser-go32.c: Rewrite to run under windows. - * ser-e7kpc.c: New file to support the E7000 with the PC ISA - bus interface. - * serial.c (serial_open): Notice device "pc". - * remote-e7000.c: Fix copyright date. - (expect): Compare \n and \r the same. - (e7000_open): Allow pc as a serial port - * sh/sh.mt: Add ser-e7kpc. - * h8300/h8300hms.mt: Add ser-e7kpc. - * main.c (proc_wait): Don't wait if using go32. - -Mon Jun 27 00:35:51 1994 Jeff Law (law@snake.cs.utah.edu) - - * somread.c: Simplify by using stabsect_build_psymtabs. - * dbxread.c (stabsect_build_psymtabs): New argument "text_name" - corresponding to the name of the text section. All references - changed. - (somstab_build_psymtabs): Delete function, no longer needed. - -Sun Jun 26 23:54:08 1994 Jeff Law (law@snake.cs.utah.edu) - - * somread.c: Renamed from paread.c. Changed function names and - comments to reflect that this file deals with SOM (an object file - format), rather than the PA (a cpu). - (Makefile.in): Chaned appropriately. - (config/pa/hppabsd.mh, config/pa/hppahpux.mh): Likewise. - * dbxread.c (somstab_build_psymtabs): Renamed from - pastab_build_psymtabs. - -Fri Jun 24 08:15:42 1994 Peter Schauer (pes@regent.e-technik.tu-muenchen.de) - - * core-sol2.c: New file to handle ELF and BCP core file flavours. - * config/sparc/sun4sol2.mh (NATDEPFILES): Use it instead of - core-svr4. - * Makefile.in: Updated for core-sol2.c. - * README: Add notes about SPARCworks cc under Solaris 2.x, - from Casper H.S. Dik (casper@fwi.uva.nl). - * config/mips/xm-makeva.h: Removed, no longer necessary. - * Makefile.in, config/mips/xm-irix3.h, config/mips/xm-irix5.h, - config/mips/xm-mips.h, config/mips/xm-news-mips.h, - config/mips/xm-riscos.h: Remove references to xm-makeva.h - -Wed Jun 22 17:48:21 1994 Jim Kingdon (kingdon@lioth.cygnus.com) - - * gdba.el: Put program input and output in a separate buffer. - -Wed Jun 22 16:54:15 1994 Fred Fish (fnf@cygnus.com) - - * energize-patches, main.c (main), top.c (gdb_init, pwd_command), - top.h: Change all occurances of dirbuf to gdb_dirbuf. Collides - with global variable of same name in libnsl.so on UnixWare. - -Wed Jun 22 14:40:52 1994 Kung Hsu (kung@mexican.cygnus.com) - - * symtab.c (decode_line_1): fix a bug in dealing with '<>' - embedded in template name. - -Tue Jun 21 14:06:46 1994 Kung Hsu (kung@mexican.cygnus.com) - - * config/i386/nm-linux.h: change calling convention of - TARGET_CAN_USE_HARDWARE_WATCHPOINT() and - target_insert_watchpoint() and - target_remove_watchpoint(). - - * config/mips/tm-mips64.h: define FORCE_LONG_LONG to force LONGEST - to be long long in gdb. - * config/mips/tm-bigmips.h: ditto. - -Mon Jun 20 23:54:37 1994 Peter Schauer (pes@regent.e-technik.tu-muenchen.de) - - * c-lang.c (asm_language_defn): New definitions for language_asm, - mostly copied from c_language_defn, to avoid warnings when - switching between c and asm stack frames. - -Mon Jun 20 13:51:55 1994 Ian Lance Taylor (ian@sanguine.cygnus.com) - - * mdebugread.c (parse_symbol): Don't call ecoff_swap_tir_in or - ecoff_swap_rndx_in directly; use the debug_swap pointer instead. - (upgrade_type, handle_psymbol_enumerators): Likewise. - (has_opaque_xref, cross_ref): Likewise. - (elfmdebug_build_psymtabs): Call swap->read_debug_info to read - debugging information, rather than doing it here. - * mipsread.c (mipscoff_symfile_read): Call read_debug_info entry - point in ecoff_debug_swap backend structure, rather than calling - ecoff_slurp_symbolic_info directly. - -Fri Jun 17 20:58:58 1994 Jim Kingdon (kingdon@lioth.cygnus.com) - - * breakpoint.c: Include annotate.h. Call annotate_field rather - than printing annotation directly. - - * main.c: Include string.h. - -Thu Jun 16 14:41:37 1994 Stan Shebs (shebs@andros.cygnus.com) - - * fork-child.c (startup_inferior) [STARTUP_INFERIOR]: If defined, - call it instead of doing normal loop. - * infcmd.c (attach_command): Don't call wait_for_inferior if - running Mach 3. - * infrun.c (proceed) [PREPARE_TO_PROCEED]: If defined, call - hook that can decide whether to step over the next breakpoint. - * utils.c (wrap_here): Abort if wrap_buffer not allocated. - (request_quit) [REQUEST_QUIT]: If defined, call it instead of - doing normal quit. - - * configure.in: Improve sorting/formatting of hosts and targets. - (i[34]86-*-mach3*, i[34]86-*-osf1mk*, mips-*-mach3*, - m88*-*-mach3*, ns32k-*-mach3*): Recognize. - * Makefile.in (stop-gdb): New target. - * stop-gdb.c: New file, utility to get attention of waiting GDBs - in Mach 3. - -Wed Jun 15 00:41:03 1994 Tom Lord (lord@rtl.cygnus.com) - - * top.c (gdb_init): Init current_directory in gdb_init. Probably - the identical initialization can be deleted from main.c, but i - haven't done so just in case. - -Tue Jun 14 17:24:41 1994 Tom Lord (lord@x1.cygnus.com) - - * gdba.el: Added menu windows and slightly improved window - handling to gdba.el. Fixed numerous minor bugs that were causing - emacs and gdb to fall out of sync. - -Tue Jun 14 16:18:44 1994 Kung Hsu (kung@mexican.cygnus.com) - - * breakpoint.c: annotate changes lost at merge, put back in. - -Mon Jun 13 17:28:50 1994 Stan Shebs (shebs@andros.cygnus.com) - - * config/i386/i386sco.mh, i386sco4.mh (XDEPFILES): Remove - i387-tdep.o. - -Sun Jun 12 03:51:52 1994 Peter Schauer (pes@regent.e-technik.tu-muenchen.de) - - * config/m68k/dpx2.mh (NATDEPFILES): Remove duplicate inclusion - of inftarg.o. - * config/m68k/tm-dpx2.h (CANNOT_STORE_REGISTER): Define to inhibit - writing of floating registers, the dpx2 kernel disallows it. - * irix5-nat.c (LM_ADDR): The loaded address of the shared library - is contained in o_praw. - * irix5-nat.c (solib_map_sections): Adjust sections by the - difference between the loaded address and the prelinked address. - * irix5-nat.c (solib_address): Use LM_ADDR for the loaded start - address. - * mdebugread.c (parse_symbol): Do not relocate stEnd/scText - symbols, their value is absolute. - * mdebugread.c (parse_partial_symbols): Handle Irix 5.2 shared - libraries fh->adr fields of zero. Relocate minimal symbol values - upon readin. Relocate non-stabs symbols upon readin. - * mdebugread.c (psymtab_to_symtab_1): Use pst->textlow for the - start address of the outermost block. - * mdebugread.c (parse_lines, parse_procedure): Pass in pst - instead of section_offsets and use relocated pst->textlow for - line number and procedure address relocations. - - From gmo@MicroUnity.com (Guillermo A. Loyola): - * mdebugread.c (parse_symbol, parse_partial_symbols, cross_ref): - Handle SGI Irix5 stIndirect symbol type. - -Fri Jun 10 14:52:56 1994 Kung Hsu (kung@mexican.cygnus.com) - - * breakpoint.c: fix a syntax error native cc does not like. - - * Makefile.in: change sparclite-tdep.c to sparcl-tdep.c. - * sparclite/Makefile.in: ditto. - * sparcl-tdpe.c: change file name because first 8 chars has to be - unique. - * sparcl-stub.c: ditto. - - * sparclite/Makefile.in: fix INCLUDE_CFLAGS to have {srcdir}/../config. - -Fri Jun 10 10:38:15 1994 Jeff Law (law@snake.cs.utah.edu) - - * hppa-tdep.c (target_read_pc, target_write_pc): Accept (and - ignore) a PID argument. - (hppa_pop_frame): Pass a PID to target_write_pc. - * config/pa/tm-hppa.h (TARGET_READ_PC, TARGET_WRITE_PC): Accept - and pass through a PID argument. - (target_read_pc, target_write_pc): Update prototypes. - -Thu Jun 9 18:10:44 1994 Kung Hsu (kung@mexican.cygnus.com) - - * Makefile.in: add new file sparclite-tdep.c. - * sparclite/Makefile.in: add new file sparclite-stub.c. - * sparclite/hw_breakpoint.note: note for SPARClite hardware breapoint - support. - * config/sparc/sparclite.mt: add sparclite-tdep.o. - * config/sparc/tm-sparclite.h: add hardware breakpoints support - defiines and code. - * sparclite-tdep.c: new file, contains hardware breakpoint support - code. - * sparclite-stub.c: new file, stub code that add support hardware - breakpoint support. - * breakpoint.c: add hardware breakpoint support. - * breakpoint.h: add new breakpoint type to support hardware - breakpoint. - * config/mips/nm-irix4.h: change interface for target dependent - code supporting watch point. - * config/pa/nm-hppab.h: change interface for target dependent - code supporting watch point. - -Thu Jun 9 14:59:58 1994 Kung Hsu (kung@mexican.cygnus.com) - - * remote-os9k.c (rombuf_command): fix a bug accepting rombug - output. - * stabsread.c (read_struct_fields): os9k nested structure does not - have terminating ';', instead it just get to ',' and bit position - and length. - -Wed Jun 8 23:20:45 1994 Stu Grossman (grossman@cygnus.com) - - * nlmread.c (nlm_symtab_read): Clean up a bit. - * (nlm_symfile_read): Record bounds of main() so that backtrace - command will know where to stop. - * objfiles.c (objfile_relocate): Relocate entry point/func info - for backtrace as well. - * objfiles.h: Define values for invalid PCs for entry point info. - * symfile.c (init_entry_point_info): Initialize invalid values - with aforementioned macros. - * config/alpha/tm-alphanw.h: Turn on FRAME_CHAIN_VALID_ALTERNATE - to cause backtrace to stop when it gets back to main(). - * config/i386/tm-i386nw.h: Ditto. - -Sat Jun 4 18:17:03 1994 Per Bothner (bothner@kalessin.cygnus.com) - - Fix value_print, which used to be ostensibly language-independent, - but would print pointers and arrays in C syntax. Instead, call - a language-specific function. - * language.h (struct language_defn): New functional field - la_value_print. - (LA_VALUE_PRINT): New macro. - * language.c (unk_lang_value_print): New stub/dummy function. - (unknown_language_defn, auto_language_defn, local_language_defn): - Use it. - * c-valprint.c (c_value_print): New function, with code moved from: - * valprint.c (value_print): ... here. Now just invoke - LA_VALUE_PRINT to do language-specific stuff. - * valprint.c (value_print_array_elements): Make non-static. - * c-lang.c (c_language_defn, cplus_language_defn): Add - c_value_print in the la_value_print field. - * m2-lang.c (m2_language_defn): Likewise. - * ch-lang.c (chill_language_defn): But here use chill_value_print. - * ch-valprint.c (chill_val_print): Print null pointer as NULL. - * ch-valprint.c (chill_value_print): New function, based on - c_value_print, but use Chill "look and feel." - * c-lang.h (c_value_print): New prototype. - * ch-lang.h (chill_value_print): New prototype. - * value.h (value_print_array_elements): New prototype. - - * ch-valprint.c (chill_val_print, case TYPE_CODE_BITSTRING - and case TYPE_CODE_SET): Check that the element type isn't a stub. - -Fri Jun 3 09:15:00 1994 Jim Kingdon (kingdon@lioth.cygnus.com) - - * main.c: Move entire file except for #ifndef MAIN_OVERRIDE code - to new file top.c. Make things extern instead of static and - similar rearrangements to deal with this. - * top.h: New file. - * utils.c: Move fputs_unfiltered to main.c. Remove - FPUTS_UNFILTERED_OVERRIDE ifndef. - * Makefile.in: Change so that gdb uses main.c, utils.c, and top.c, - and libgdb uses utils.c and top.c. - -Thu Jun 2 23:19:10 1994 Jeff Law (law@snake.cs.utah.edu) - - * hppa-tdep.c (skip_trampoline_code): Fix typo. - -Thu Jun 2 18:09:59 1994 Per Bothner (bothner@kalessin.cygnus.com) - - * ch-valprint.c (chill_val_print_array_elements): New function. - A Chill version of val_print_array_elements, it prints the - array index labels, in additions ot the array element values. - (chill_val_print): Use the new function. - -Thu Jun 2 08:50:00 1994 Stu Grossman (grossman@cygnus.com) - - * configure.in: Add nlm subdir to configdirs for alpha-*-netware - target. - * defs.h (enum language): Add language_asm. - * findvar.c (read_register_bytes read_register_gen - write_register_bytes read_register read_register_pid - write_register write_register_pid supply_register): Move multi- - thread handling down into these routines. Create XXX_pid routines - that allow register references to specify the pid. - * findvar.c infcmd.c (read_pc read_pc_pid write_pc write_pc_pid - read_sp write_sp read_fp write_fp): Move these routines from - infcmd to findvar to centralize the whole mess. - * i386-nlmstub.c: Portability fixes. - * infptrace.c (child_resume): Conditionalize to allow other natives - to override it. Remove PIDGET gubbish, it's no longer necessary. - * infrun.c (wait_for_inferior): Put registers_changed() before - target_wait() to speed up remote debugging. - * Replace code that reads registers from other threads with much - nicer looking new function calls (see changes to findvar.c). - * Don't skip prologues if debugging assembly source. - * lynx-nat.c (child_resume): Lynx now needs it's own version of - child_resume to handle multi-thread debugging properly. - * remote.c: Add O response to get console output from target. - * (readchar): Add timeout parameter. Handle SERIAL_EOF and - SERIAL_ERROR here to simplify callers. - * Change static var timeout to remote_timeout. - * (fromhex): Remove unnecessary return -1 at end of routine. - * (remote_wait): Turn this into a big switch statement. Add - support for O response. - * (putpkt): Remove unnecessary handling of SERIAL_EOF/ERROR. - * (getpkt): Split getpkt into two parts. read_frame deals with - all formatting issues, run-length encoding, and framing. getpkt - now handles error recovery, and frame detection. - * ser-tcp.c (tcp_readchar): Handle EINTR from read(). - * ser-unix.c (hardwire_raw): Set CLOCAL so that we ignore modem - control. (hardwire_readchar): Handle EINTR from read(). - * symfile.c (deduce_language_from_filename): Add support for .s - files. - * config/nm-lynx.h: Define CHILD_WAIT so that lynx-nat.c can - override infptrace's child_wait. - * config/rs6000/rs6000lynx.mh: Use xm-rs6000ly.h & nm-rs6000ly.h - instead of XXXlynx.h. - * config/rs6000/rs6000lynx.mt: Use tm-rs6000ly.h instead of - tm-rs6000lynx.h. - * nlm/gdbserve.c: Portability fixes. - -Tue May 31 20:35:44 1994 Jim Kingdon (kingdon@lioth.cygnus.com) - - * inftarg.c (child_wait): Call proc_wait, not wait. - (child_mourn_inferior): Call proc_remove_foreign. - * main.c (gdb_init): Call init_proc. - * main.c: Provide dummy versions of init_proc, proc_wait, and - proc_remove_foreign for the gdb case (the libgdb case provides its - own versions of these functions). - * Makefile.in (libgdb-files): Add libproc.a. - -Wed Jun 1 11:08:52 1994 Stan Shebs (shebs@andros.cygnus.com) - - Hardware watchpoints for Linux, from Rick Sladkey - (jrs@world.std.com). - * infrun.c (wait_for_inferior) [HAVE_CONTINUABLE_WATCHPOINT]: Add - new hardware breakpoint recovery method. - * i386v-nat.c (i386_insert_watchpoint, - i386_insert_nonaligned_watchpoint, i386_remove_watchpoint, - i386_stopped_by_watchpoint) [TARGET_CAN_USE_HARWARE_WATCHPOINT]: - New functions to support the 386 hardware debugging registers. - * config/i386/nm-linux.h (TARGET_CAN_USE_HARDWARE_WATCHPOINT, - HAVE_CONTINUABLE_WATCHPOINT, STOPPED_BY_WATCHPOINT, - target_insert_watchpoint, target_remove_watchpoint): Define these - macros to use the hardware debugging functions in i386v-nat.c. - -Wed May 25 17:06:15 1994 Jim Kingdon (kingdon@lioth.cygnus.com) - - * Makefile.in: Replace libgdb.a with libgdb-files. Make "all" - build it. - -Thu May 19 09:56:20 1994 Jim Kingdon (kingdon@lioth.cygnus.com) - - * target.c, target.h: New variables target_activity_function and - target_activity_fd. - * inflow.c, inferior.h: New functions set_sigio_trap and - clear_sigio_trap. - * inftarg.c (child_wait), procfs.c (wait_fd): Call them. - -Wed May 18 13:01:55 1994 Doug Evans (dje@canuck.cygnus.com) - - * remote-sim.h (sim_verbose): Delete. - Document callbacks needed. - (sim_*): Change result to void where there isn't one. - (sim_open): Clarify argument and error response. - (sim_close): Declare. - (sim_load): Change bfd_handle argument to file name. Clarify result. - (sim_create_inferior): Renamed from sim_set_args. - (sim_set_pc): Delete. - (sim_info): Delete printf_fn argument. - * remote-sim.c (gdbsim_kill): Add comment describing purpose. - (gdbsim_load): Try sim_load first. - (gdbsim_create_inferior): Call sim_create_inferior. - (gdbsim_open): Handle args == NULL. Update call to sim_open. - (gdbsim_close): Call sim_close. - (gdbsim_files_info): Update call to sim_info. - (gdbsim_ops): Realign comments. - - * printcmd.c (decode_format): Allow TARGET_PTR_BIT to be non-constant. - -Tue May 17 16:45:20 1994 Stan Shebs (shebs@andros.cygnus.com) - - * xcoffread.c (read_xcoff_symtab): For C_FILE symbols, only use - the auxent if the symbol's name is ".file". From David Edelsohn - <c1dje@watson.ibm.com>. - -Tue May 17 11:08:22 1994 Jim Kingdon (kingdon@lioth.cygnus.com) - - * breakpoint.c (breakpoint_1): Fix typo. - - * annotate.c (annotate_field_end): Fix typo. - - * Makefile.in: Move annotate.o from COMMON_OBS to OBS. - - * Makefile.in (TSSTART): Remove; no longer used. - - * utils.c (vfprintf_maybe_filtered, vfprintf_unfiltered): Call - fputs_unfiltered and exit directly, rather than fatal. The latter - calls vfprintf_unfiltered! - - * gdbtypes.h, gdbtypes.c (can_dereference): New function. - * value.h, printcmd.c (print_value_flags): Move from here... - * annotate.c: ...to here, and make it use can_dereference. - -Sat May 14 15:13:52 1994 Stan Shebs (shebs@andros.cygnus.com) - - * inflow.c (job_control, attach_flag, generic_mourn_inferior): - Remove, needed for both native and cross. - * target.c (attach_flag, generic_mourn_inferior): Put here. - * utils.c (job_control): Put here. - (terminal.h): Don't include anymore. - -Sat May 14 09:11:44 1994 Jim Kingdon (kingdon@lioth.cygnus.com) - - * source.c (find_source_lines): Always use code that was #ifdef - BROKEN_LARGE_ALLOCA. Do the cleanup before returning, rather than - leaving it on the chain. Reindent much of this function. - * config/sparc/{xm-sun4sol2.h,xm-sun4os4.h}, - config/i386/{xm-sun386.h,xm-i386m3.h,xm-i386mach.h}, - config/m68k/{sun3os4.h,xm-news.h,xm-hp300hpux.h}, - config/ns32k/xm-ns32km3.h: Remove all references to - BROKEN_LARGE_ALLOCA; with the above change it is no longer needed. - * main.c, fork-child.c, many config files: Remove all - SET_STACK_LIMIT_HUGE code; with the above changes it should no - longer be needed. - - * symtab.c (lookup_partial_symbol): Use if and abort, not assert. - This avoids __eprintf troubles. - -Fri May 13 08:10:21 1994 Jim Kingdon (kingdon@lioth.cygnus.com) - - * main.c (main): Surround in #ifndef MAIN_OVERRIDE. Move - initialization code which needs to be called even if we bypass the - command line stuff into gdb_init. - * utils.c (fputs_unfiltered): Surround in #ifndef - FPUTS_UNFILTERED_OVERRIDE. - * Makefile.in (libgdb.a): New target. - - * utils.c: Rearrange I/O stuff a bit so that all output goes - through fputs_unfiltered. Use vasprintf; removes arbitrary limit - which made %s not work with arbitrarily large strings. - * printcmd.c (printf_command): Use printf_filtered, not - printf_unfiltered and printf, now that arbitrary limit is gone. - - gcc -Wall lint: - * breakpoint.c (watchpoint_check): Remove unused variable b. - * stack.c (print_frame_info): Move sp and buf inside #if. - * eval.c (evaluate_subexp): Remove unused variables pp, - mangle_ptr, ptr, and mangle_tstr. - * valarith.c (value_x_binop): Remove unused variables mangle_tstr - and mangle_ptr. - * symtab.c (lookup_symtab): Put variable copy inside #if. - (decode_line_1): Put variable q1 inside #if 0. - * target.h: Declare target_link. - * infrun.c (wait_for_inferior): Remove unused variables signame. - * remote.c (remote_resume): Remove unused variable name. - * c-exp.y (parse_number): Parenthesize operand of shift. - * dbxread.c (record_minimal_symbol): Parenthesize operand of && - (this is a semantic change, the warning seems to have detected a bug). - * dbxread.c (end_psymtab): Move variable p1 inside #if. - * coffread.c: Move variable temptype inside #if. - * ch-typeprint.c (chill_type_print_base): Remove unused variable - name. - * ch-valprint.c: #include typeprint.h and ch-lang.h. - (chill_val_print): Remove unused variable in_range. - (chill_val_print): Remove statement "length > TYPE_LENGTH (type);". - (chill_val_print): Add default case for switch. - * stabsread.h: Declare stabsect_build_psymtabs. - * os9kread.c (read_minimal_symbols): Make this return void. - (os9k_symfile_read): Remove unused variables stb_exist and val. - (os9k_symfile_init): Remove unused variable val. - (fill_sym): Remove unused variable id. - (read_os9k_psymtab): Put variable back_to inside #if 0. Remove - unused variable nsl. - Remove unused variable symfile_bfd. - #if 0 unused variables lbrac_unmatched_complaint and - lbrac_mismatch_complaint. - Remove declaration for non-existent function os9k_next_symbol_text. - - * annotate.c, annotate.h: New files, containing a function for - each annotation which outputs it. - * Move breakpoints_changed from breakpoint.c to annotate.c. - * breakpoint.c, blockframe.c, infrun.c, cp-valprint.c, main.c, - printcmd.c, source.c, stack.c, utils.c, valprint.c: - Use annotate.c functions to output annotations. - * Makefile.in (OBS): Add annotate.o. - -Thu May 12 10:46:27 1994 Jeff Law (law@snake.cs.utah.edu) - - * hppa-tdep.c (read_unwind_info): Make sure elf_unwind_size and - elf_unwind_entries are always initialized. - - * hppa-tdep.c (skip_trampoline_code): Handle argument relocation - stubs which return directly to the caller rather than to the stub - itself. - -Wed May 11 20:11:51 1994 Stan Shebs (shebs@andros.cygnus.com) - - * c-exp.y (yyerror): Display a more informative error message. - * ch-exp.y (yyerror): Ditto, don't use global yychar. - * m2-exp.y (yyerror): Ditto. - -Tue May 10 11:57:53 1994 Stan Shebs (shebs@andros.cygnus.com) - - * inflow.c (job_control): Move definition to front of file. - -Tue May 10 14:42:37 1994 Ian Lance Taylor (ian@tweedledumb.cygnus.com) - - * maint.c (print_section_table): Rename SEC_SHARED_LIBRARY to - SEC_COFF_SHARED_LIBRARY to match corresponding change in bfd. - -Fri May 6 13:30:22 1994 Stan Shebs (shebs@andros.cygnus.com) - - * Makefile.in (kdb): Remove old init.c creation commands. - * configure.in (sparclite): Match on sparclite*. - * sparclite/aload.c (main): Only change section addresses for - a.out format object files. - -Fri May 6 13:24:04 1994 Steve Chamberlain (sac@cygnus.com) - - * config/i386/go32.mh: Define CC. - -Fri May 6 11:56:54 1994 Stan Shebs (shebs@andros.cygnus.com) - - * gdbserver/Makefile.in: Remove irrelevant definitions and - comments inherited from the gdb Makefile. - (BFD_DIR, BFD, BFD_SRC, BFD_CFLAGS): Add from gdb Makefile. - (VERSION): Update to 4.12.3. - (gdbserver): Remove any existing executable first. - (distclean, realclean): Remove nm.h. - * gdbserver/low-lynx.c: Add Sparc Lynx support. - * gdbserver/low-sparc.c, gdbserver/low-sun3.c (sys/wait.h): - Don't use absolute pathname. - -Thu May 5 12:00:22 1994 Stan Shebs (shebs@andros.cygnus.com) - - * rs6000-nat.c (vmap_ldinfo): Don't fail if fstat returns an - error. - -Wed May 4 06:56:03 1994 Jim Kingdon (kingdon@lioth.cygnus.com) - - * infrun.c (proceed, normal_stop, wait_for_inferior), breakpoint.c - (print_it_normal): Add annotations for the inferior starting and - stopping, and for all the various messages related to how it - stopped. - - * printcmd.c (do_one_display): Annotate. - * stack.c (print_frame_info): Annotate printing of stack frames. - -Wed May 4 18:15:51 1994 Stu Grossman (grossman@cygnus.com) - - * remote.c (get_offsets): Handle case where stub doesn't support - qOffsets message. - -Wed May 4 15:30:39 1994 Per Bothner (bothner@kalessin.cygnus.com) - - Add partial support for g++ code compiled with -fvtable-thunks. - * c-valprint.c (c_val_print): Add vtblprint support - when using thunks. - * cp-valprint.c (cp_is_vtbl_member): A vtable can be an array of - pointers (if using thunks) as well as array of structs (otherwise). - * cp-valprint.c (vtbl_ptr_name_old, vtbl_ptr_name): Move to global - level, and make the latter non-static (so define_symbol can use it). - * stabsread.c (define_symbol): If the type being defined is a - pointer type named "__vtbl_ptr_type", set the TYPE_NAME to that name. - * symtab.h (VTBL_PREFIX_P): Allow "_VT" as well as "_vt". - * values.c (value_virtual_fn_field): Handle thunks. - * values.c (value_headof): Minor efficiency hack. - * values.c (value_headof): Incomplete thunk support. FIXME. - -Wed May 4 06:56:03 1994 Jim Kingdon (kingdon@lioth.cygnus.com) - - * valprint.c (print_longest): Clarify comment about use_local. - * printcmd.c, defs.h (print_address_numeric), callers in - symmisc.c, symfile.c, stack.c, source.c, remote.c, infcmd.c, - cp-valprint.c, core.c, ch-valprint.c, c-valprint.c, breakpoint.c, - exec.c: New argument use_local. - * source.c (identify_source_line): Use filtered output. Use - print_address_numeric. - - * core.c (memory_error), symtab.c (cplusplus_hint, decode_line_1), - language.c (type_error, range_error): Use filtered output. - * utils.c (error_begin): Update comment to tell people to use - filtered output. - - * Makefile.in (HFILES_WITH_SRCDIR): List bfd.h. - (HFILES_NO_SRCDIR): List gdbcore.h not gdbcore_h, so as not to get - bfd.h. - -Tue May 3 07:41:33 1994 Jim Kingdon (kingdon@cygnus.com) - - * procfs.c (procfs_wait): Reinstate code which deduces the signal - from the fault, #ifndef FAULTED_USE_SIGINFO. - * config/sparc/tm-sun4sol2.h: Define FAULTED_USE_SIGINFO. - -Fri Apr 29 18:15:04 1994 Jim Kingdon (kingdon@lioth.cygnus.com) - - * breakpoint.c (breakpoint_1): Annotate each field of the headers. - Explicitly annotate each record. - -Fri Apr 29 15:56:18 1994 Stan Shebs (shebs@andros.cygnus.com) - - * xcoffexec.c: Reformat to standards and lint. - (language.h): Include. - (exec_close): Declare arg "quitting". - (file_command): Declare arg "from_tty". - (map_vmap): Cast xmalloc result to PTR. - * rs6000-nat.c: Reformat to standards and lint. - (exec_one_dummy_insn): Use char array for saved instruction. - (fixup_breakpoints): Declare. - (vmap_ldinfo): Be more informative in fatal error messages. - (xcoff_relocate_symtab): Define to return void. - * xcoffsolib.h: Reformat to standards, improve comments. - * config/rs6000/nm-rs6000.h (xcoff_relocate_symtab): Declare. - -Thu Apr 28 08:40:56 1994 Jim Kingdon (kingdon@lioth.cygnus.com) - - * utils.c, defs.h (error_begin): New function. - (quit): Print annotation before printing the error message. - * main.c (return_to_top_level): Print annotation before doing the - longjmp. - * symtab.c (decode_line_1): Call error not warning and then - return_to_top_level. Call error_begin and printf_unfiltered - rather calling warning (before calls to return_to_top_level). - * core.c (memory_error): Use error_begin, printf_unfiltered, - print_address_numeric and return_to_top_level instead of error. - Cleans up a FIXME-32x64. - * language.c (type_error, range_error): Call error_begin - not just target_terminal_ours. - - * dbxread.c (stabsect_build_psymtabs): Assign to sym_stab_info - directly, rather than via DBX_SYMFILE_INFO. A cast on the left - side of an assignment is non-portable. - - * utils.c (query): Change syntax of query annotations to be - consistent with other input annotations. - (prompt_for_continue): Likewise for prompt-for-continue annotation. - -Thu Apr 28 01:20:39 1994 Peter Schauer (pes@regent.e-technik.tu-muenchen.de) - - * mdebugread.c (psymtab_to_symtab_1): Do not call sort_blocks - for stabs symtabs. - * mips-tdep.c (mips_skip_prologue): Handle prologues for functions - that have a stack frame size of 32k or larger (from Paul Flinders). - Remove #if 0'd code. - -Wed Apr 27 16:33:51 1994 Stan Shebs (shebs@andros.cygnus.com) - - * lynx-nat.c (CANNOT_STORE_REGISTER): Add a fallback definition - for Lynx platforms that need it. - * config/nm-lynx.h (__LYNXOS): Define if not already defined. - -Wed Apr 27 16:01:37 1994 Jim Kingdon (kingdon@cygnus.com) - - * procfs.c (procfs_wait): Use the signal from the pr_info rather - than trying to deduce it from the fault. - -Wed Apr 27 12:22:46 1994 Steve Chamberlain (sac@cygnus.com) - - * printcmd.c (print_address_symbolic): Initialize name to empty - string to avoid core dump if lookup fails. - * remote-e7000.c (printf_e7000debug): Error if target not open. - -Tue Apr 26 22:45:24 1994 Stu Grossman (grossman at cygnus.com) - - * i386-nlmstub.c: Update to be more in line with PIN stub. - * nlm/gdbserve.c (putDebugChar): Install bug fix from i386-nlmstub. - * (hex2mem): Init ptr. - * General cleanups to use ConsolePrintf, standard prologues, etc... - -Tue Apr 26 10:23:04 1994 Stu Grossman (grossman at cygnus.com) - - * i386-nlmstub.c: More changes to be compatible with remote.c. - - * dbxread.c: Move a bunch of strncmps out of process_one_symbol - into (the far less frequently called) dbx_symfile_read. - - * i386-nlmstub.c: An interim version till we get PIN for the x86. - -Tue Apr 26 09:50:45 1994 Stu Grossman (grossman at cygnus.com) - - * dbxread.c (record_minimal_symbol): Record the section - associated with the symbol to make dynmaic relocation work. - * (dbx_symfile_read, process_one_symbol): Fixes to work around - Solaris brain-damage which don't apply to relocatable object - files. - * (stabsect_build_psymtabs): New routine to read stabs out of an - arbitrarily named section. - * nlmread.c (nlm_symtab_read): Read ALL syms from the NLM, not just - globals. - * (nlm_symfile_read): Call stabsect_build_psymtabs to read the - stabs out of the nlm. - * partial-stabs.h (cases 'f' & 'F'): Fixes to work around Solaris - brain-damage which don't apply to relocatable object files. - * remote.c (putpkt): Improve error reporting and error handling. - * (get_offsets): Temporary kludge to force data & bss sections to - have the same relocation. - * stabsread.c (define_symbol, scan_file_globals): Record section - info in sym. - -Sat Apr 23 19:05:52 1994 Jim Kingdon (kingdon@lioth.cygnus.com) - - * breakpoint.c (breakpoint_1): Annotate each field of output. Add - FIXME-32x64 comment. - -Fri Apr 22 16:43:54 1994 Jim Kingdon (kingdon@lioth.cygnus.com) - - * infrun.c (wait_for_inferior): Move call to flush_cached_frames - to after call to target_wait. This means that flush_cached_frames - can call target_terminal_ours if it wants to. - * infrun.c (wait_for_inferior) [HAVE_NONSTEPPABLE_WATCHPOINT]: Add - comment about why the code is dubious. - - * stabsread.c (read_type): Call read_type, not nonexistent - os9k_read_type. - -Fri Apr 22 14:25:36 1994 Kung Hsu (kung@mexican.cygnus.com) - - * remote-os9k.c (rombug_fetch_registers): set trace mode - correctly. - * remote-os9k.c (rombug_read_inferior_memory): cache data in - buffer. - * os9kread,c (read_os9k_psymtab): process file symbol to truncate - extra info. - * os9kread.c (os9k_read_ofile_symtab): proper casting of args - passed to process_one_symbol. - * stabsread.c (read_type): process os9k functio prototype. - -Fri Apr 22 11:27:39 1994 Jim Kingdon (kingdon@lioth.cygnus.com) - - * solib.c (symbol_add_stub): If so->textsection is NULL, don't - dump core. - -Thu Apr 21 07:45:49 1994 Jim Kingdon (kingdon@lioth.cygnus.com) - - * utils.c (prompt_for_continue): Annotate prompt. - (query): Annotate query. - * printcmd.c (print_frame_args): Change syntax of argument - annotation to make name and value part of a single group of - annotations, not two separate groups. - * cp-valprint.c (cp_print_value_fields): Likewise for fields. - * valprint.c (val_print_array_elements): Change syntax of - annotation to be more concise. - * main.c, defs.h (command_line_input): New argument tells what - string to include in the annotations. - * symtab.c (decode_line_2), main.c (read_command_lines, - command_loop): Change callers. - - * breakpoint.c (watch_command): Use (CORE_ADDR)0, not NULL, for - target null pointer. - * blockframe.c (find_frame_addr_in_frame_chain): Likewise. - - * printcmd.c (output_command): Annotate things we print here too. - * printcmd.c (print_command_1): Add "value-history-value" annotation. - * Move declaration of print_value_flags from defs.h to value.h. - * main.c (command_line_input): Call wrap_here as well as gdb_flush. - -Thu Apr 21 09:29:37 1994 Peter Schauer (pes@regent.e-technik.tu-muenchen.de) - - * dbxread.c (read_dbx_dynamic_symtab): Reinstall support for sun3, - BFD handles sun3 dynamic relocations now. - * elfread.c (elf_symtab_read, elf_symfile_read): Handle dynamic - symbol table. - -Wed Apr 20 19:41:21 1994 Jim Kingdon (kingdon@lioth.cygnus.com) - - * printcmd.c (print_command_1): Annotate the top-level expressions - that we print. - (print_frame_args): Annotate each argument. - * printcmd.c, defs.h (print_value_flags): New function. - * cp-valprint.c (cp_print_value_fields): Annotate each field. - * valprint.c (val_print_array_elements): Annotate each array element. - -Wed Apr 20 13:18:41 1994 Peter Schauer (pes@regent.e-technik.tu-muenchen.de) - - * findvar.c (read_var_value): Handle LOC_REPARM_ADDR case correctly, - the register contains a pointer to the type, not the type itself. - -Mon Apr 11 10:44:35 1994 Jim Kingdon (kingdon@deneb.cygnus.com) - - * main.c (main): Accept --annotate=N option and make --fullname - the same as --annotate=1. - (command_line_input): Print annotatation before and after prompt. - * blockframe.c (flush_cached_frames): Print annotation. - * Rename frame_file_full_name to annotation_level and move it from - symtab.h to defs.h. - * source.c (identify_source_line): If annotation_level > 1, - change output format. - * breakpoint.c: Print annotation whenever a breakpoint changes. - * main.c: New variable server_command. - (command_line_input): Parse "server " and set server_command. - (dont_repeat): Check server_command. - -Wed Apr 20 08:37:16 1994 Jim Kingdon (kingdon@lioth.cygnus.com) - - * xcoffread.c (xcoff_next_symbol_text): Don't return before - updating raw_symbol and symnum. Return a value in the case where - we complained. - - * dstread.c, coffread.c: Don't define pending_blocks; buildsym.c - takes care of it. - * parse.c: Don't define block_found; it is defined in symtab.c. - * parser-defs.h: Add comment regarding block_found. - -Tue Apr 19 09:46:05 1994 Jeffrey A. Law (law@snake.cs.utah.edu) - - * hppa-tdep.c (internalize_unwind_info): Delete unused indexp - argument. - -Mon Apr 18 13:18:56 1994 Peter Schauer (pes@regent.e-technik.tu-muenchen.de) - - * dbxread.c (read_dbx_dynamic_symtab): Relocate BFD symbols by - section vma. Do not read dynamic relocs for sun3 executables to - avoid BFD assertion message. - -Mon Apr 18 10:08:07 1994 Jeffrey A. Law (law@snake.cs.utah.edu) - - * nm-hppab.h (KERNEL_U_ADDR): Define. - (FIVE_ARG_PTRACE): Likewise. - (CANNOT_STORE_REGISTER): Likewise. - * nm-hppah.h (KERNEL_U_ADDR): Define. - (FIVE_ARG_PTRACE): Likewise. - (CANNOT_STORE_REGISTER): Likewise. - (NEED_TEXT_START_END): Likewise. - - * tm-hppah.h (NEED_TEXT_START_END): Delete definition. - * xm-hppah.h (KERNEL_U_ADDR): Delete definition. - (FIVE_ARG_PTRACE): Likewise. - * xm-hppab.h (KERNEL_U_ADDR): Delete definition. - (FIVE_ARG_PTRACE): Likewise. - - * hppa-tdep.c (read_unwind_info): Make static. - (restore_pc_queue): Indirect through the target vector to - reload the register state. - -Sat Apr 16 22:20:51 1994 Jeffrey A. Law (law@snake.cs.utah.edu) - - * paread.c (compare_unwind_entries): Delete function. It's been - moved into hppa-tdep.c. - (read_unwind_info): Likewise. - (pa_symfile_read): No longer call read_unwind_info. The unwind - tables will be read in as they are needed. - - * hppa-tdep.c (compare_unwind_entries): New function. - (read_unwind_info, internalize_unwinds): Likewise. - (find_unwind_entry): Read in unwind information on demand. - -Fri Apr 15 11:53:46 1994 Stan Shebs (shebs@andros.cygnus.com) - - * source.c (DIRNAME_SEPARATOR): New macro, replaces all references - to : in search path processing. - * defs.h (qsort): Rename argument in prototype. - * symtab.h (SAYMBOL_VALUE): Rename value field, avoids bugs in - some compilers. - * breakpoint.c, exec.c, mdebugread.c, mipsread.c, xcoffexec.c - (false): Eliminate usages. - -Fri Apr 15 11:35:19 1994 Steve Chamberlain (sac@cygnus.com) - - * h8500-tdep.c (initialize_h8500_tdep, large_command): - All references to value changed to value_ptrlage_command is now - called big_command. - All references to value changed to value_ptr. - * remote-e7000.c (e7000_wait): Use target_waitstatus and SETSTOP - * remote-hms.c (hms_wait): Timeout after five seconds. - * ser-go32.c (dosasync_read): Poll if timeout < 0. - * config/tm/tm-h8500.h (BEFORE_MAIN_LOOP_HOOK): Deleted. - * config/sh/tm-sh.h (BREAKPOINT): Is now sleep opcode. - -Thu Apr 14 07:01:56 1994 Jeffrey A. Law (law@snake.cs.utah.edu) - - * procfs.c (procfs_wait): Protect watchpoint code with appropriate - #ifdefs. - (procfs_set_watchpoint, procfs_stopped_by_watchpoint): Likewise. - -Wed Apr 13 14:52:46 1994 Jeffrey A. Law (law@snake.cs.utah.edu) - - * breakpoint.h (enum bptype): Add bp_hardware_watchpoint and - bp_watchpoint_scope breakpoints. - (struct breakpoint): Add val_chain and related_breakpoint fields - for use by watchpoints. - - * breakpoint.c (within_scope): Delete. No longer used. - (TARGET_CAN_USE_HARDWARE_WATCHPOINT): Provide default definition. - (target_{remove,insert}_watchpoint): Likewise. - (can_use_hardware_watchpoint): New function. - (remove_breakpoint): New function to remove a single breakpoint - or hardware watchpoint. - (insert_breakpoints): Handle insertion of hardware watchpoints. - Store a copy of the value chain derived from the watchpoint - expression. - (remove_breakpoints): Simplify by using remove_breakpoint. - (delete_breakpoint): Likewise. - (watchpoint_check): Delete the watchpoint and watchpoint scope - breakpoints when the watchpoint goes out of scope. Save & restore - the current frame after checking watchpoints. - (breakpoint_init_inferior): Likewise (restarting the program - makes all local watchpoints go out of scope). - (bpstat_stop_status): Handle hardware watchpoints much like normal - watchpoints. Delete the watchpoint and watchpoint scope breakpoint - when the watchpoint goes out of scope. Remove and reinsert all - breakpoints before returning if we stopped when a hardware watchpoint - fired. - (watch_command): Use a hardware watchpoint when possible. If - watching a local expression, build a scope breakpoint too. - (map_breakpoint_numbers): Also call given function for any - related breakpoints. - (disable_breakpoint): Never disable a scope breakpoint. - (enable_breakpoint): Handle hardware breakpoints much like normal - breakpoints, but recompute the watchpoint_scope breakpoint's - frame and address (if we have an associated scope breakpoint). - (read_memory_nobpt): Handle hardware watchpoints like normal - watchpoints. When necessary handle watchpoint_scope breakpoints. - (print_it_normal, bpstat_what, breakpoint_1, mention): Likewise. - (clear_command, breakpoint_re_set_one, enable_command): Likewise. - (disable_command): Likewise. - - * blockframe.c (find_frame_addr_in_frame_chain): New function. - Extern prototype added to frame.h - - * infrun.c (wait_for_inferior): Set current_frame and select - a frame before checking if we stopped due to a hardare watchpoint - firing. Handle stepping over hardware watchpoints. - (normal_stop): Remove unnecessary call to select_frame. - - * value.h (value_release_to_mark): Declare. - * values.c (value_release_to_mark): New function. - - * procfs.c (procfs_wait): Add cases for hardware watchpoints. - (procfs_set_watchpoint, procfs_stopped_by_watchpoint): New functions. - - * hppab-nat.c (hppa_set_watchpoint): New function. - - * config/pa/nm-hppab.h (STOPPED_BY_WATCHPOINT): Define. - (HAVE_STEPPABLE_WATCHPOINT): Define. - (TARGET_CAN_USE_HARDWARE_WATCHPOINT): Define. - (target_{insert,delete}_watchpoint): Define. - - * config/mips/nm-irix4.h (TARGET_CAN_USE_HARDWARE_WATCHPOINT): Define. - (STOPPED_BY_WATCHPOINT, HAVE_NONSTEPPABLE_WATCHPOINT): Likewise. - (target_{insert,remove}_watchpoint): Likewise. - -Mon Apr 11 19:21:27 1994 Stu Grossman (grossman at cygnus.com) - - * xcoffread.c (read_xcoff_symtab): Ignore symbols of class C_EXT, - smtyp XTY_LD, sclass XMC_DS (external data segment label). They - often have the same names as debug symbols for functions, and - confuse lookup_symbol(). - -Mon Apr 11 10:44:35 1994 Jim Kingdon (kingdon@deneb.cygnus.com) - - * remote.c: Around redefinition of PBUFSIZE, adjust whitespace. - * config/pa/tm-hppa.h (REGISTER_BYTES): Use 4 rather than - REGISTER_RAW_SIZE (1). - Together these changes work around a bug in HP's compiler. Both - seem to be necessary. - -Mon Apr 11 09:18:24 1994 Jeffrey A. Law (law@snake.cs.utah.edu) - - * paread.c (pa_symtab_read): Handle ST_STUB symbols and symbols - with scope SS_EXTERNAL. ST_ENTRY symbols in dynamic executables - are type mst_solib_trampoline. - -Fri Apr 8 17:14:37 1994 Jim Kingdon (kingdon@deneb.cygnus.com) - - * config/m68k/es1800.mt: Change comments. - -Fri Apr 8 17:14:37 1994 Rob Savoye (rob@darkstar.cygnus.com) - - * config/m68k/monitor.mt (TDEPFILES): Don't include remote-es.o. - -Fri Apr 8 15:35:30 1994 Stu Grossman (grossman at cygnus.com) - - * lynx-nat.c: Restore regmap structure for SPARC. It's needed - for core files. - -Fri Apr 8 14:53:35 1994 Jim Kingdon (kingdon@deneb.cygnus.com) - - * values.c (unpack_long): Remove obsolete comment about using a - switch statement. - - * symfile.c (symbol_file_command): Add comments about command syntax. - -Thu Apr 7 17:25:21 1994 Peter Schauer (pes@regent.e-technik.tu-muenchen.de) - Jim Kingdon (kingdon@cygnus.com) - - * infrun.c (IN_SOLIB_TRAMPOLINE): Correct comment, trampolines - are in the .plt section. - * minsyms.c (lookup_solib_trampoline_symbol_by_pc, - find_solib_trampoline_target): New functions for handling - stepping into -g compiled shared libraries. - * symtab.h (lookup_solib_trampoline_symbol_by_pc, - find_solib_trampoline_target): Add prototypes. - * config/tm-sunos.h (IN_SOLIB_TRAMPOLINE, SKIP_TRAMPOLINE_CODE): - Define to handle stepping into -g compiled shared libraries. - * config/tm-sysv4.h (SKIP_TRAMPOLINE_CODE): Define to handle - stepping into -g compiled shared libraries. - -Thu Apr 7 17:22:54 1994 Peter Schauer (pes@regent.e-technik.tu-muenchen.de) - - * configure.in: Add mips-*-sysv4* support. - * config/mips/mipsv4.mh, config/mips/mipsv4.mt, - config/mips/tm-mipsv4.h, config/mips/xm-mipsv4.h, mipsv4-nat.c: - New files for MIPS SVR4 support. - * Makefile.in: Update for new mipsv4 files. - * alpha-tdep.c (heuristic_proc_desc, find_proc_desc): Use - read_next_frame_reg to obtain the frame relative stack pointer. - * mips-tdep.c (heuristic_proc_desc): Use read_next_frame_reg to - obtain the frame relative stack pointer. - * mdebugread.c (parse_partial_symbols, psymtab_to_symtab1): - Handle stStatic and stStaticProc symbols in stabs-in-ecoff output - by entering them into the minimal symbol table. - * printcmd.c (print_scalar_formatted): Do not try to unpack to - a long for float formats. - * solib.c: Include "elf/mips.h" only if DT_MIPS_RLD_MAP does not - get defined in <link.h>. - * solib.c (solib_add): Add shared library sections to the section - table of the target before adding the symbols. - * partial-stab.h: Relocate static and global functions. - * dbxread.c (read_dbx_symtab): Remove unused variable - end_of_text_address. Relocate text_addr when passing it - to end_psymtab. - - For Alpha OSF/1 targets, enable gdb to set breakpoints in shared - library functions before the executable is run. Retrieve dynamic - symbols from stripped executables. - * mipsread.c (read_alphacoff_dynamic_symtab): New function. - * mipsread.c (mipscoff_symfile_read): Use it. Issue warning message - if no debugging symbols were found. - * alpha-tdep.c (alpha_skip_prologue): Silently return the unaltered - pc if memory at the pc is not accessible and GDB_TARGET_HAS_SHARED_LIBS - is defined. - * config/alpha/nm-alpha.h (GDB_TARGET_HAS_SHARED_LIBS): Define, - OSF/1 has shared libraries. - -Thu Apr 7 15:11:11 1994 Ian Lance Taylor (ian@tweedledumb.cygnus.com) - - * dbxread.c (read_dbx_dynamic_symtab): Adjust for recent changes - to BFD handling of dynamic symbols. - -Tue Apr 5 15:29:25 1994 Jeffrey A. Law (law@snake.cs.utah.edu) - - * hppa-tdep.c (hppa_fix_call_dummy): If FUN is a procedure label, - then gets its real address into FUN and its GOT/DP value into %r19. - - * tm-hppa.h (CALL_DUMMY): Use %r20, not %r19 as a temporary. - - * hppa-tdep.c (frameless_function_invocation): If no unwind - descriptor was found, then assume this was not a frameless - function invocation. - (frame_saved_pc): If the saved PC is in a linker stub, then - return the return address which the linker stub will return to. - - * xm-hppab.h: Never define USG. - * xm-hppah.h: Always define USG. - -Tue Apr 5 12:58:47 1994 Per Bothner (bothner@kalessin.cygnus.com) - - * values.c (unpack_long, value_from_longest), - valarith.c (value_binop): Allow TYPE_CODE_RANGE. - -Fri Apr 1 14:04:34 1994 Jason Merrill (jason@deneb.cygnus.com) - - * symfile.c (deduce_language_from_filename): .cpp is a C++ extension. - -Fri Apr 1 00:44:00 1994 Peter Schauer (pes@regent.e-technik.tu-muenchen.de) - - For SVR4 targets, enable gdb to set breakpoints in shared - library functions before the executable is run. - * elfread.c (elf_symtab_read): Handle symbols for shared library - functions. - * sparc-tdep.c (in_solib_trampoline): Renamed to in_plt_section - and moved to objfiles.c. - * objfiles.c (in_plt_section): Moved to here from sparc-tdep. - * config/tm-sysv4.h (IN_SOLIB_TRAMPOLINE): Use new in_plt_section. - * config/sparc/tm-sun4sol2.h (IN_SOLIB_TRAMPOLINE): Removed, - the new generic definition from tm-sysv4.h works for Solaris. - -Wed Mar 30 16:14:27 1994 Ian Lance Taylor (ian@tweedledumb.cygnus.com) - - * elfread.c (elf_symtab_read): Change storage_needed, - number_of_symbols and i to long. Rename get_symtab_upper_bound to - bfd_get_symtab_upper_bound. Check for errors from - bfd_get_symtab_upper_bound and bfd_canonicalize_symtab. - * nlmread.c (nlm_symtab_read): Same changes. - -Wed Mar 30 11:43:29 1994 Jim Kingdon (kingdon@lioth.cygnus.com) - - * xcoffread.c (xcoff_next_symbol_text): New function. - (read_xcoff_symtab): Set next_symbol_text_func to it. - Move raw_symbol outside of read_xcoff_symtab. - - * remote.c (getpkt): Remove unused "out" label. - -Wed Mar 30 09:15:42 1994 Jeffrey A. Law (law@snake.cs.utah.edu) - - * breakpoint.c (print_it_normal): Allow GDB to notify the user - about more than one watchpoint being triggered. - -Wed Mar 30 08:24:18 1994 Jim Kingdon (kingdon@lioth.cygnus.com) - - * config/m68k/tm-dpx2.h: Include tm-m68k.h not nonexistent tm-68k.h. - -Wed Mar 30 00:31:49 1994 Peter Schauer (pes@regent.e-technik.tu-muenchen.de) - - * blockframe.c (find_pc_partial_function): mst_file_text - symbols do not live in the shared library transfer table. - * ch-exp.y (decode_integer_value, match_character_literal, - match_bitstring_literal): Guard tolower calls with isupper, - tolower on old BSD systems blindly subtracts a constant. - * dbxread.c (read_ofile_symtab): Check for __gnu_compiled_* as - well when determining the producer of the object file. - * mdebugread.c (has_opaque_xref): New function to check for - cross reference to an opaque aggregate. - * mdebugread.c (parse_symbol, parse_partial_symbols): Do not - enter typedefs to opaque aggregates into the symbol tables. - * mdebugread.c (parse_external): Remove skip_procedures argument, - it has always been 1. Remove code that handled stProc symbols, - it was never executed and was wrong, as the index of a - stProc symbol points to the local symbol table and not to the - auxiliary symbol info. Update caller. - * mdebugread.c (parse_partial_symbols): Do not enter external - stProc symbols into the partial symbol table, they are already - entered into the minimal symbol table. - * config/i386/tm-symmetry.h: Clean up, it is now only used for Dynix. - Remove all conditionals and definitions for ptx. - I386_REGNO_TO_SYMMETRY moved to here from symm-tdep.c. - Fix addresses of floating point registers in REGISTER_U_ADDR. - STORE_STRUCT_RETURN now handles cc and gcc conventions. - FRAME_CHAIN, FRAMELESS_FUNCTION_INVOCATION, FRAME_SAVED_PC, - IN_SIGTRAMP, SIGCONTEXT_PC_OFFSET defined to make backtracing through - signal trampoline code work. - * config/i386/xm-symmetry.h: Clean up, it is now only used for Dynix. - Remove all conditionals and definitions for ptx. - Remove KDB definitions. - * symm-nat.c (store_inferior_registers): Fetch registers before - storing them to obtain valid floating point control registers. - Store fpu registers. - * symm-nat.c (print_1167_control_word): Dynix 3.1.1 defines - FPA_PCR_CC_C0 and FPA_PCR_CC_C1, avoid duplicate case value. - * symm-nat.c (fetch_inferior_registers, child_xfer_memory): - Fix typos. - * symm-nat.c (child_resume): Update type of `signal' parameter. - * symm-tdep.c (I386_REGNO_TO_SYMMETRY): Moved to tm-symmetry.h. - -Tue Mar 29 23:01:33 1994 Jeffrey A. Law (law@snake.cs.utah.edu) - - * hppa-tdep.c (hppa_fix_call_dummy): Use an alternate method for - calling import stubs for functions in shared libraries. - -Tue Mar 29 21:14:04 1994 Per Bothner (bothner@kalessin.cygnus.com) - - * ch-exp.y: Implement SIZE(mode_name) and SIZE(expression). - - * ch-lang.c (chill_is_varying_struct): Magic string is - was "<var_length>" is now "__var_length" (more portable). - -Tue Mar 29 19:41:34 1994 Jim Kingdon (kingdon@lioth.cygnus.com) - - * remote.c (getpkt): If we get a timeout, actually retry rather - than just giving up the first time it happens. - * remote.c: Document sequence numbers. - (remote_store_registers): Change syntax of 'P' request so that it - never looks like a sequence number. - -Tue Mar 29 16:06:01 1994 Kung Hsu (kung@mexican.cygnus.com) - - * os9kread.c (record_minimal_symbol): add section_offset to - relocate minimal symbol table. - * os9kread.c (read_minimal_symbols): ditto. - * os9kread.c (os9k_symfile_init): increase size of dbg and stb - file names. - * os9kread.c (read_os9k_psymtab): if there's no dbg file, just - return. Also if file addr is 0 leave it 0, not to relocate. - * remote-os9k.c (_initialize_remote_os9k): add 'set remotexon', - 'set remotexoff' and 'set remotelog' commands. - -Tue Mar 29 12:38:45 1994 Jim Kingdon (kingdon@lioth.cygnus.com) - - * remote.c (remote_store_registers): Add 'P' request to set an - individual register. - (remote_write_bytes, remote_read_bytes): Use %lx, not %x, to print - a target address. - -Sat Mar 26 07:05:18 1994 Jim Kingdon (kingdon@lioth.cygnus.com) - - * config/sparc/tm-sparc.h: Define USE_REGISTER_NOT_ARG. - * stabsread (define_symbol): If USE_REGISTER_NOT_ARG, go back to - combining all 'p' and 'r' pairs into a LOC_REGPARM. - - * command.c (do_setshow_command, case var_string): Never add a - space to the end of the string. - * NEWS: Document this change. - * .gdbinit: Add a space to the "set prompt" command. - -Fri Mar 25 12:40:41 1994 Jim Kingdon (kingdon@lioth.cygnus.com) - - * m3-nat.c, i386m3-nat.c, config/i386/i386m3.mh: Many minor - changes to make it compile (it doesn't link yet). - - * buildsym.c (start_subfile, patch_subfile_names), demangle.c - (set_demangling_style, set_demangling_command): Use savestring not - strdup. We were not dealing properly with a NULL return from - strdup, and were not declaring strdup (the system header may or - may not have it). - - * valprint.c (val_print): Remove inaccurate comment about what - types can be stub types. - - * config/i386/ptx.mh (XDEPFILES): Add coredep.o. Delete infptrace.o. - * symm-nat.c (child_wait, _initialize_symm_nat, kill_inferior): - Supply alternate version if ATTACH_DETACH is not defined. - * ptx4-nat.c, config/i386/{nm-ptx4.h, ptx4.mh, ptx.mt, ptx4.mt, - tm-ptx.h, tm-ptx4.h, xm-ptx.h, xm-ptx4.h}: New files. - * configure.in: Recognize i[34]86-sequent-sysv4* host. - -Fri Mar 25 10:14:03 1994 Jeffrey A. Law (law@snake.cs.utah.edu) - - * hppa-tdep.c (skip_prologue): Do nothing if not at the beginning - of a function. - (skip_trampoline_code): Rewrite and add support for argument - relocation stubs stubs, import/export stubs, calls through - "_sr4export" and cascaded trampolines. - - * hppa-tdep.c (skip_prologue): Return "pc" not zero - if no unwind descriptor is found. - - * tm-hppa.h (NUM_REGS): Bump to 128 registers. - (REGISTER_NAMES): Add entries for "right-half" of FP registers. - (REGISTER_RAW_SIZE, MAX_REGISTER_RAW_SIZE): Do not treat FP regs - differently. All registers are four bytes. - (REGISTER_BYTES, REGISTER_BYTE): Simplify now that all registers are - the same size. - (REGISTER_VIRTUAL_TYPE): Use builtin_type_float for all FP regs. - - * hppa-tdep.c (pa_print_fp_reg): Update to print even numbered FP - registers as both single and double values (fetching 2nd 32bit half - as necessary). Annotate each register printed with its precision. - - * paread.c (read_unwind_info): Fix off-by-one error. - -Fri Mar 25 08:33:28 1994 Jim Kingdon (kingdon@lioth.cygnus.com) - - * main.c (complete_command): Deal with it if arg is NULL. - -Thu Mar 24 07:12:09 1994 Jim Kingdon (kingdon@lioth.cygnus.com) - - * config/mips/tm-mips.h (SETUP_ARBITRARY_FRAME): Revise comment - regarding using the PC--using the PC is necessary and all the - FIXME comments in the world won't make it go away. - - * valops.c (value_at, value_at_lazy): Give error if we dereference - a pointer to void. - * gdbtypes.h: Fix comments regarding TYPE_CODE_VOID. - * stabsread.c: Use 1, not 0, for TYPE_LENGTH of void types. - - * stabsread.c (patch_block_stabs): Add comment about what happens - if the definition is in another compilation unit from the stab. - - * dbxread.c (end_psymtab): Add comment about empty psymtabs. - -Wed Mar 23 07:50:33 1994 Jim Kingdon (kingdon@lioth.cygnus.com) - - * main.c (complete_command): New command, from Rick Sladkey - <jrs@world.std.com>. - (symbol_completion_function): Don't declare rl_point and - rl_line_buffer; they are now declared in readline.h. - (show_commands): Don't declare history_base; it is declared in - history.h. - * command.c (lookup_cmd): Don't delete trailing whitespace. - Reverts change of 14 May 1989. - -Wed Mar 23 16:14:52 1994 Stu Grossman (grossman at cygnus.com) - - * minsyms.c (prim_record_minimal_symbol): Move section deduction - code from prim_record_minimal_symbol_and_info() to here. Callers - of the latter can legitimately supply a section number of -1. - -Wed Mar 23 07:50:33 1994 Jim Kingdon (kingdon@lioth.cygnus.com) - - * gdbtypes.h, gdbtypes.c: Add comments regarding whether static - member functions have an element in args for a (nonexistent) this - pointer. - -Tue Mar 22 20:12:53 1994 Jeffrey A. Law (law@snake.cs.utah.edu) - - * config/pa/tm-hppao.h (NO_PC_SPACE_QUEUE_RESTORE): Define. - - * hppa-tdep.c (hppa_pop_frame): Do not restore the PC space - queue if NO_PC_SPACE_QUEUE_RESTORE is defined. - - * stabsread.c (REG_STRUCT_HAS_ADDR): Accept additional argument - for the structure's type. All callers changed. - - * valops.c (call_function_by_hand): Check REG_STRUCT_HAS_ADDR - for each structure argument rather than assuming it's either - true or false for all structure arguments. - - * config/pa/tm-hppa.h (REG_STRUCT_HAS_ADDR): Depend only - on the length structure passed, not the compiler used. - - * config/sparc/tm-sparc.h (REG_STRUCT_HAS_ADDR): Accept additional - argument for the structure's type. - -Tue Mar 22 15:28:33 1994 Jim Kingdon (kingdon@lioth.cygnus.com) - - * values.c (set_internalvar): Don't set var->value until we are - sure there won't be an error(). - - * remote.c (get_offsets): Reinstate comment which was in - remote_wait about use of SECT_OFF_TEXT and so on. - -Mon Mar 21 13:11:30 1994 Peter Schauer (pes@regent.e-technik.tu-muenchen.de) - - * symmisc.c (maintenance_check_symtabs): New function to check - consistency of psymtabs and symtabs. - * symtab.h (maintenance_check_symtabs): Add prototype. - * maint.c: Add new `maint check-symtabs' command. - * config/i386/tm-i386aix.h, config/i386/tm-sun386.h, - config/i386/tm-symmetry.h (REGISTER_CONVERT_TO_RAW): Fix typo. - * config/i386/tm-symmetry.h: Make comment inside #if 0 a real - comment. - * config/i386/tm-symmetry.h (STORE_STRUCT_RETURN): Cast argument - to write_memory to avoid warnings from gcc. - * config/i386/xm-symmetry.h: Add missing #endif. - * config/i386/nm-symmetry.h (NO_PTRACE_H): Add for Dynix. - * config/i386/symmetry.mt (TDEPFILES): Add i386-tdep.o. - * config/i386/symmetry.mh (NAT_FILE, NATDEPFILES): Add. - -Mon Mar 21 11:50:28 1994 Jeffrey A. Law (law@snake.cs.utah.edu) - - * hppa-tdep.c (hppa_fix_call_dummy): Use value_ptr. - (hppa_push_arguments): Likewise. - -Mon Mar 21 11:02:51 1994 Stu Grossman (grossman at cygnus.com) - - * alpha-tdep.c: Gobs of changes (many imported from mips-tdep) to - improve remote debugging efficiency. Also fixed problems with - doing function calls for programs with no entry points. - * infcmd.c (run_stack_dummy): Use CALL_DUMMY_ADDRESS instead of - entry_point_address. - * inferior.h (PC_IN_CALL_DUMMY): ditto. - * mdebugread.c (parse_symbol, parse_procedure, parse_external, - parse_lines): Pass section_offsets info to these routines so that - we can relocate symbol table entries upon readin. - * (psymtab_to_symtab_1): Set symtab->primary to tell - objfile_relocate to do relocations for our symbols. - * (ecoff_relocate_efi): New routine to relocate adr field of PDRs - (which hang off of the symbol table). - * Use prim_record_minimal_symbols_and_info instead of - prim_record_minimal_symbols to supply section info to make minimal - symbol relocations work. - * minsyms.c (prim_record_minimal_symbols_and_info): If section is - -1, try to deduce it from ms_type. - * objfiles.c (objfile_relocate): Use ALL_OBJFILE_SYMTABS where - appropriate. Handle relocation of MIPS_EFI symbols special. Also, - add code to relocate objfile->sections data structure. - * remote.c (get_offsets): Use new protocol message to acquire - section offsets from the target. - * (remote_wait): Get rid of relocation stuff. That's all handled - by objfile_relocate now. - * config/alpha/alpha-nw.mt (TM_FILE): Use tm-alphanw.h. - * config/alpha/tm-alpha.h: Define CALL_DUMMY_ADDRESS, and - VM_MIN_ADDRESS. - * config/alpha/tm-alphanw.h: DECR_PC_AFTER_BREAK=0, VM_MIN_ADDRESS=0. - -Mon Mar 21 10:09:06 1994 Jeff Law (law@snake.cs.utah.edu) - - * hpread.c (_initialize_hpuxread): Don't call add_symtab_fns if - HPREAD is not defined. - -Sun Mar 20 15:21:57 1994 Doug Evans (dje@cygnus.com) - - * sparc-tdep.c (sparc_frame_find_save_regs): Use REGISTER_RAW_SIZE - instead of 4. - * sp64-tdep.c (target_ptr_bit, set_target_ptr_bit): Deleted, - can no longer set this at run time. - * config/sparc/sp64.mt (SIMFILES): Use remote-sim.o now. - (TM_CLIBS): Define to -lm, the simulator uses the sqrt() function. - * config/sparc/tm-sp64.h (FPS_REGNUM, CPS_REGNUM): Define (so - sparc-tdep.c compiles). - (TARGET_PTR_BIT): Must be a constant now, fix at 64. - -Sat Mar 19 08:51:12 1994 Jim Kingdon (kingdon@lioth.cygnus.com) - - * config/m68k/{cisco.mt,tm-cisco.h}: New files. - * Makefile.in (ALLPARAM, ALLCONFIG): Add them. - * configure.in: Recognize m68*-cisco*-*. - - * Makefile.in (TAGS): Use variables directly, rather than using - find, to locate TM_FILE, XM_FILE, and NAT_FILE. This is faster - and means that these filenames no longer need be unique across all - the config/* directories. - * configure.in: Put the config/*/ into TM_FILE, etc. - - * m68k-stub.c (computeSignal): Return SIGFPE, not SIGURG, for chk - and trapv exceptions. - - * target.h (struct section_table), objfiles.h (struct obj_section): - Change name of field sec_ptr to the_bfd_section. More mnemonic - and avoids the (sort of, for the ptx compiler) name clash with - the name of the typedef. - * exec.c, xcoffexec.c, sparc-tdep.c, rs6000-nat.c, osfsolib.c, - solib.c, irix5-nat.c, objfiles.c, remote.c: Change users. - - * utils.c: Include readline.h. - * Makefile.in (utils.o): Add dependency. - - * remote.c (getpkt): Add support for run-length encoding. - -Fri Mar 18 19:11:15 1994 Steve Chamberlain (sac@jonny.cygnus.com) - - * utils.c (prompt_for_continue): Call readline, not gdb_readline. - -Fri Mar 18 10:25:55 1994 Jim Kingdon (kingdon@lioth.cygnus.com) - - * dstread.c (record_minimal_symbol): New arg objfile. Pass it to - prim_record_minimal_symbol. - Callers: Pass it. - - * regex.c (EXTEND_BUFFER): Adjust pointers within buffer by - computing their offset from the start of the old buffer and adding - to the new buffer, rather than by assuming we can add the - difference between the old buffer and the new buffer (it might not - fit in an int). Merge in cosmetic differences from emacs regex.c - version of this macro. - -Wed Mar 16 15:28:54 1994 Ian Lance Taylor (ian@tweedledumb.cygnus.com) - - * Makefile.in (install-only): Fix use of program_transform_name. - -Wed Mar 16 07:18:43 1994 Jim Kingdon (kingdon@lioth.cygnus.com) - - * printcmd.c: Remove "set print fast-symbolic-addr off" command. - The bug which it worked around was fixed on 25 Feb 94 in coffread.c, - so I'm nuking the command. - * symtab.c (find_addr_symbol): Comment out, no longer used. - - * main.c (main): Don't init_source_path for the -cd argument. Now - that source_path doesn't contain the current_directory from when - GDB started up, init_source_path is no longer useful (and is - harmful because it clobbers a source_path set in $HOME/.gdbinit). - - * TODO: Remove item about line numbers being off. It is useless - and confusing without a reproducible test case (it mentions - proceed(), but I was able to step through proceed without trouble). - -Tue Mar 15 13:39:23 1994 Peter Schauer (pes@regent.e-technik.tu-muenchen.de) - - For Sunos 4.x targets, enable gdb to set breakpoints in shared - library functions before the executable is run. Retrieve dynamic - symbols from stripped executables. - * symtab.h (minimal_symbol_type): Add mst_solib_trampoline type. - * parse.c (write_exp_msymbol), symmisc.c (dump_msymbols), - symtab.c (list_symbols): Handle mst_solib_trampoline. - * minsyms.c (lookup_minimal_symbol): Handle mst_solib_trampoline - for all targets, remove IBM6000_TARGET dependencies. - * dbxread.c (read_dbx_dynamic_symtab): New function. - * dbxread.c (dbx_symfile_read): Use it. - * dbxread.c (SET_NAMESTRING): Set namestring to - "<bad string table index>" instead of "foo" if the string index is - corrupt. - * xcoffread.c (read_xcoff_symtab): Use mst_solib_trampoline instead - of mst_unknown. - * symtab.c (list_symbols): Take from_tty as parameter and pass it - to break_command. Handle mst_file_* minimal symbol types. - * config/i386/tm-i386bsd.h: Give just macro name, not args, to #undef. - -Tue Mar 15 11:40:43 1994 Kung Hsu (kung@mexican.cygnus.com) - - * c-exp.y(yylex): fix potential memory overflow. - -Tue Mar 15 10:33:28 1994 Jim Kingdon (kingdon@lioth.cygnus.com) - - * environ.c (set_in_environ): Eliminate special handling of PATH and - GNUTARGET. - * putenv.c: Removed, conflicts with system declaration of - putenv on RS/6000 running AIX 3.2.5, and above change makes it - unnecessary. - * Makefile.in: Change accordingly. - * procfs.c (procfs_create_inferior): Change comment accordingly. - -Tue Mar 15 10:05:27 1994 Jim Kingdon (kingdon@cygnus.com) - - * rs6000-tdep.c: Change value to value_ptr. - -Sun Mar 13 17:19:03 1994 Jeff Law (law@snake.cs.utah.edu) - - * hpread.c (read_hpux_symtab: Correctly determine the namespace - and address class of SVAR, DVAR, TYPEDEF, TAGDEF, CONST, and - MEMENUM symbols. Do not include function-scoped variables in - the partial symbol table. - -Sun Mar 13 09:45:51 1994 Jim Kingdon (kingdon@lioth.cygnus.com) - - * i386m3-nat.c: Include floatformat.h. - (get_i387_state): Use memset not bzero. - - * Version 4.12.3. - - * Makefile.in: Enable commented out getopt_h, bfd_h, etc. Change - ieee-float.h to floatformat.h. - - * valprint.c (val_print_string): Ignore error if the error - happened after a terminating '\0'. - - * c-valprint.c (c_val_print): Never add 1 to return value from - val_print_string; just return what it returns. - - * target.h (enum target_signal): Add TARGET_SIGNAL_FIRST, for - looping through all of the enums. - * infrun.c (signals_info): Use it. - -Fri Mar 11 08:08:50 1994 Jim Kingdon (kingdon@lioth.cygnus.com) - - * main.c (main): When printing warning about bad baud rate, don't - use warning(); it relies on current_target which isn't set up yet. - - * breakpoint.c (_initialize_breakpoint): Update docstring for - tbreak to match what the code actually does. Don't mention tbreak - in docstrings for "enable once" or "enable breakpoints once". - -Thu Mar 10 08:52:38 1994 Jim Kingdon (kingdon@lioth.cygnus.com) - - * symfile.h (ADD_PSYMBOL_VT_TO_LIST): Don't put a semicolon after - while (0). That defeats the whole purpose of using do . . . while (0). - * mdebugread.c (parse_partial_symbols): Don't use ?: expression as - list for ADD_PSYMBOL_TO_LIST; the macro takes its address and - using a ?: expression as an lvalue is not portable. - - * stabsread.c (define_symbol): If REG_STRUCT_HAS_ADDR, also - convert a LOC_ARG to a LOC_REF_ARG. Update code which combines - 'p' and 'r' symbol descriptors into a single symbol to look for a - LOC_REF_ARG. - * README, config/sparc/tm-sparc.h: Update comments. - -Wed Mar 9 21:43:24 1994 Peter Schauer (pes@regent.e-technik.tu-muenchen.de) - - * mdebugread.c (parse_type): Do not complain for types with - an `indexNil' aux index, these are simply undefined types. - Remove indexNil check from caller of parse_type. - * mdebugread.c (parse_partial_symbols): Do not enter - stGlobal, scCommon symbols into the minimal symbol table, their - value is the size of the common, not its address. - Handle scInit, scFini, scPData and scXData sections. - Use minimal symbol type mst_file_* for stLabel symbols, instead of - mst_*. - Enter stProc symbols into the global_psymbols list once, not into - the static_psymbols_list. - Get rid of dummy psymtab if it is empty, to allow proper detection - of stripped executables. - * mdebugread.c (cross_ref): Allow cross references to Fortran - common blocks. - -Wed Mar 9 15:23:19 1994 Jim Kingdon (kingdon@lioth.cygnus.com) - - * stabsread.c (common_block_end, fix_common_block): Stash the - struct pending * in the SYMBOL_TYPE, not the SYMBOL_NAMESPACE, so - as to not assume that a pointer fits in an enum. - -Wed Mar 9 18:56:36 1994 Kung Hsu (kung@mexican.cygnus.com) - - * os9kread.c (fill_sym): check compiler verion number for pre- - UltraC compiler. - * os9kread.c (os9k_process_one_symbol): address of symbol is - relative to section not module. - * stabsread.c (define_symbol): add symbol type 's' as local - symbol for os9k. - * remote-os9k.c: add command 'set monitor_log' to turn on or off - monitor logging. - * remote-os9k.c: fix bug in delete breakpoint, single step trace. - * remote-os9k.c: fix bug in 'set remotebaud' function. - * remote-os9k.c (rombug_link): minimize checking so to improve - speed. - * symfile.c (symbol_file_command): check if failed to link, also make - the command be able to accept more than one filenames. - * target.c (target_link): check if failed to link with rombug. - * config/i386/tm-i386os9k.h : add #define DECR_PC_AFTER_BREAK 0. - -Wed Mar 9 15:23:19 1994 Jim Kingdon (kingdon@lioth.cygnus.com) - - * remote-es.c (es1800_child_ops): Don't declare it static. - -Tue Mar 8 11:42:39 1994 Jim Kingdon (kingdon@cygnus.com) - - * config/i386/tm-i386v4.h: Give just macro name, not args, to #undef. - -Tue Mar 8 06:56:13 1994 Jim Kingdon (kingdon@lioth.cygnus.com) - - * dbxread.c: New variable lowest_text_address. - (record_minimal_symbol, read_dbx_symtab): Set it. - (read_dbx_symtab): Use lowest_text_address + text_size instead of - end_of_text_address. - * config/gould/tm-pn.h: Add comment regarding END_OF_TEXT_DEFAULT. - - * dbxread.c (end_psymtab): Remove old and commented out - capping_global and capping_static. Fix comments regarding - N_SO_ADDRESS_MAYBE_MISSING to match the real name of the macro. - - * parser-defs.h: Add "extern" to start of variable declarations so - we don't end up with commons. - * parse.c: Define these variables. - - * irix5-nat.c (find_solib): Cast o_path to CORE_ADDR when using it - as one. - -Mon Mar 7 13:00:50 1994 Jim Kingdon (kingdon@lioth.cygnus.com) - - * alpha-tdep.c: Change value to value_ptr. - -Sun Mar 6 17:36:53 1994 Peter Schauer (pes@regent.e-technik.tu-muenchen.de) - - * solib.c (elf_locate_base): New function to locate the address - of the dynamic linker's runtime structure in the dynamic info section. - * solib.c (locate_base): Use it instead of iterating over the list - of mapped address segments. - * solib.c (look_for_base, bfd_lookup_symbol): Removed, no longer - necessary. - -Fri Mar 4 09:50:47 1994 Jeffrey A. Law (law@snake.cs.utah.edu) - - * hppa-tdep.c (pc_in_linker_stub): Move decl to beginning of file. - (pc_in_interrupt_handler): New function. Also add PARAM decl. - (find_proc_framesize): Deal with HPUX setting SAVE_SP bit for - signal trampoline and interrupt routines. - (frame_saved_pc): Handle signal trampolines and interrupt routines. - (frame_chain, frame_chain_valid): Likewise. - (hppa_frame_find_saved_regs): Likewise. Also deal with special - saved regs convention for SP. - - * tm-hppa[bho].h: FRAME_FIND_SAVED_PC_IN_SIGTRAMP): Define. - (FRAME_BASE_BEFORE_SIGTRAMP): Define. - (FRAME_FIND_SAVED_REGS_IN_SIGTRAMP): Define. - - * tm-hppah.h (IN_SIGTRAMP): Define. - -Thu Mar 3 12:41:16 1994 Jim Kingdon (kingdon@deneb.cygnus.com) - - * ch-exp.y (match_simple_name_string): Accept '_' as well as an - alphabetic character as the start of a name. - - * sparclite/Makefile.in (all install): Build and install aload. - - * configure.in: Accept i[34]86-*-*sysv32 because that is what - config.guess and config.sub produce. - - * mips-tdep.c: Change value to value_ptr. - -Wed Mar 2 09:17:55 1994 Jim Kingdon (kingdon@deneb.cygnus.com) - - * breakpoint.c, breakpoint.h, c-valprint.c, ch-valprint.c, - cp-valprint.c, eval.c, expprint.c, findvar.c, language.c, - objfiles.h, infcmd.c, printcmd.c, stack.c, typeprint.c, - valarith.c, valops.c, valprint.c, value.h, values.c: Replace - value with value_ptr. This is for the ptx compiler. - * objfiles.h, target.h: Don't declare a "sec_ptr" field using a - "sec_ptr" typedef. - * symm-nat.c: Add a bunch of stuff for symmetry's ptrace stuff. - #if 0 i386_float_info. - * symm-tdep.c (round): Remove. Also remove sgttyb. - * symm-tdep.c: Remove lots of stuff which duplicates stuff from - i386-tdep.c. Remove register_addr and ptx_coff_regno_to_gdb. - * i386-tdep.c (i386_frame_find_saved_regs): Put in - I386_REGNO_TO_SYMMETRY check in case it is needed for Dynix - someday. - * config/i386/nm-symmetry.h: Change KERNEL_U_ADDR. Move - stuff from PTRACE_READ_REGS, PTRACE_WRITE_REGS macros to - symm-nat.c. Define CHILD_WAIT and declare child_wait(). - * config/i386/tm-symmetry.h: Remove call function stuff; stuff in - tm-i386v.h is apparently OK. - * config/i386/xm-symmetry.h [_SEQUENT_]: Define HAVE_TERMIOS not - HAVE_TERMIO. Define MEM_FNS_DECLARED, NEED_POSIX_SETPGID, and - USE_O_NOCTTY. - -Wed Mar 2 11:31:08 1994 Peter Schauer (pes@regent.e-technik.tu-muenchen.de) - - * osfsolib.c (xfer_link_map_member): Update to use new - target_read_string interface. - -Wed Mar 2 09:17:55 1994 Jim Kingdon (kingdon@deneb.cygnus.com) - - * infrun.c (wait_for_inferior): In checking - remove_breakpoints_on_following_step, check - through_sigtramp_breakpoint as well as step_resume_breakpoint. - -Tue Mar 1 16:22:56 1994 Jim Kingdon (kingdon@deneb.cygnus.com) - - * os9kread.c (os9k_process_one_symbol): Rename - VARIABLES_INSIDE_BLOCK to OS9K_VARIABLES_INSIDE_BLOCK. - * symfile.c (symbol_file_command): Check for (CORE_ADDR)-1, not - (CORE_ADDR)0, from target_link, since that is what it uses. - Process name at end, not during parsing (like we did before Kung's - change), so that -readnow and -mapped can appear anywhere. - Make text_relocation a local variable. - * config/i386/i386os9k.mt: Fix comment. - * Makefile.in (ALLDEPFILES): Add remote-os9k.c. - * os9kread.c: Put "comments" after #endif inside /* */. - * stabsread.h: Add os9k_stabs variable. - * stabsread.c (start_stabs), os9kread.c (os9k_process_one_symbol): - Set it. - * stabsread.c (define_symbol): If os9k_stabs, put a 'V' symbol - descriptor in global_symbols not local_symbols. - (read_type): If os9k_stabs, accept 'c', 'i', and 'b' type - descriptors. - (read_type): If os9k_stabs, accept function parameters after 'f' - type descriptor. - (read_array_type): If os9k_stabs, don't expect index type and - expect lower and upper to be separated by ',' not ';'. - (read_enum_type): If os9k_stabs, read a number before the first - enumeration constant. - (os9k_init_type_vector): New function. - (dbx_lookup_type): Call it when starting new type vector. - * config/i386/tm-i386os9k.h: Define BELIEVE_PCC_PROMOTION. - * (os9k_process_one_symbol): Call define_symbol not os9k_define_symbol. - * os9kstab.c: Removed. - * Makefile.in: Update accordingly. - * objfiles.c (objfile_relocate_data): Removed. - * remote-os9k.c (rombug_wait): Call objfile_relocate - not objfile_relocate_data. - * objfiles.h, objfiles.c: Remove find_pc_objfile. - * remote-os9k.c (rombug_wait): Call find_pc_section not - find_pc_objfile. - * main.c (quit_command): Check inferior_pid; revert Kung change. - * remote-os9k.c (rombug_create_inferior): Set inferior_pid. - -Tue Mar 1 14:56:14 1994 Kung Hsu (kung@mexican.cygnus.com) - - * os9kread.c: New file to read os9000 style symbo table. - * os9kstab.c: new file to read os9000 style stabs. - * remote-os9k.c: remote protocol talking to os9000 rombug monitor. - * objfiles.c (find_pc_objfile): new function to search objfile - from pc. - * objfiles.c (objfile_relocate_data): new function to relocate - data symbols in symbol table. - * objfiles.h: Add two aux fields in struct objfile to handle - multiple symbol table files situation like in os9000. - * symfile.c: Change so 'symbol-file' command can handle multiple - files. Also call target_link() to get relocation infos. - * target.c (target_link): new function to get relocation info when - a symbol file is requested to load. - * main.c (quit_command): take out 'inferior_pid != 0' condition, - because in cross mode there's no inferior pid, bit they need to - be detached. - Makefile.in: add os9kread.c os9kstab.c and .o's. - configure.in: add i386os9k target. - config/i386/i386os9k.mt: new add. - config/i386/tm-i386os9k.h: new add. - -Tue Mar 1 13:16:10 1994 Peter Schauer (pes@regent.e-technik.tu-muenchen.de) - - * config/sparc/tm-sun4sol2.h (IN_SIGTRAMP): Handle ucbsigvechandler. - * sparc-tdep.c (sparc_frame_saved_pc): Handle ucbsigvechandler. - -Tue Mar 1 11:54:11 1994 Jim Kingdon (kingdon@deneb.cygnus.com) - - * target.c, target.h (target_read_string): Provide error detection to - caller. Put string in malloc'd space, so caller need not impose - arbitrary limits. - * solib.c (find_solib): Update to use new interface. - * irix5-nat.c (find_solib): Read o_path from inferior - (clear_solib): Free storage for o_path. - * valprint.c (val_print_string): Add comments. - -Mon Feb 28 23:54:39 1994 Peter Schauer (pes@regent.e-technik.tu-muenchen.de) - - * symtab.c (decode_line_1): Handle the case when skip_quoted does not - advance `p'. - -Mon Feb 28 12:40:46 1994 Jim Kingdon (kingdon@deneb.cygnus.com) - - * value.h (struct value): Add modifiable field. - * values.c (allocate_value, record_latest_value, value_copy): Set it. - (record_latest_value): Don't mess with VALUE_LVAL of value. - * valops.c (value_assign): Check it. Reword existing error - message on not_lval. - - * mips-tdep.c (mips_step_skips_delay), config/mips/tm-mips.h - (STEP_SKIPS_DELAY): Added. - * infrun.c (proceed) [STEP_SKIPS_DELAY]: Check for a breakpoint in - the delay slot. - - * valprint.c (val_print_string): If errcode is set, always print - an error, regardless of force_ellipsis. In the non-EIO case, - just print the error message rather than calling error(). Don't - access *(bufptr-1) if bufptr points to the start of the buffer. - When looking for '\0', don't increment bufptr and addr if bufptr - started out already at limit. If an error happens on fetching the - first character, don't print the string. - -Sun Feb 27 21:05:06 1994 Jim Kingdon (kingdon@deneb.cygnus.com) - - * config/m68k/tm-apollo68b.h: Remove HAVE_68881 define; it is - obsolete. - - * i387-tdep.c, i386-tdep.c i386v-nat.c, i386aix-nat.c, - i386m3-nat.c, config/m68k/tm-m68k.h, i960-tdep.c - config/i960/tm-i960.h, remote-nindy.c, config/m88k/tm-m88k.h, - m88k-tdep.c: Use floatformat.h instead of ieee-float.h. - * sparc-tdep.c: Remove now-obsolete ieee-float.h stuff - * findvar.c: Update comment regarding ieee-float.h. - -Sun Feb 27 21:39:48 1994 Peter Schauer (pes@regent.e-technik.tu-muenchen.de) - - * config/i386/tm-i386v4.h (I386V4_SIGTRAMP_SAVED_PC, IN_SIGTRAMP, - FRAME_CHAIN, FRAMELESS_FUNCTION_INVOCATION, FRAME_SAVED_PC): - Define to make backtracing through the various sigtramp handlers - work. - * i386-tdep.c (i386v4_sigtramp_saved_pc): New routine to fetch - the saved pc from ucontext on the stack for SVR4 signal handling. - -Fri Feb 25 09:41:11 1994 Jim Kingdon (kingdon@deneb.cygnus.com) - - * remote.c, remote-mon.c, remote-utils.c, remote-utils.h, - target.h, remote-es.c, remote-nindy.c: Don't set baud rate if - baud_rate is -1. Remove sr_get_baud_rate and sr_set_baud_rate; - just use the global variable itself. When printing baud rate, - don't print a baud rate if baud_rate is -1. - - * coffread.c (read_coff_symtab): Pass mst_file_* to - record_minimal_symbol for C_STAT symbols. Put C_EXT and C_STAT - symbols in the minimal symbols regardless of SDB_TYPE. - -Thu Feb 24 08:30:33 1994 Jim Kingdon (kingdon@deneb.cygnus.com) - - * breakpoint.h (enum bptype): New type bp_through_sigtramp. - (bpstat_what_main_action): New code BPSTAT_WHAT_THROUGH_SIGTRAMP. - * breakpoint.c (bpstat_what): Return BPSTAT_WHAT_THROUGH_SIGTRAMP - if we hit a bp_through_sigtramp breakpoint. Remove kludge which - ignored bs->stop for a bp_step_resume breakpoint. - * infrun.c (wait_for_inferior): Make a through_sigtramp_breakpoint - which performs one (the check_sigtramp2 one) of the functions - which had been handled by the step_resume_breakpoint. For each - use of the step_resume_breakpoint, make it still use the - step_resume_breakpoint, use the through_sigtramp_breakpoint, or - operate on both. - Deal with BPSTAT_WHAT_THROUGH_SIGTRAMP return from bpstat_what. - When setting the frame address of the step resume breakpoint, set - it to the address for frame *before* the call instruction is - executed, not after. - - * mips-tdep.c (mips_print_register): Print integers using - print_scalar_formatted rather than duplicating all the - CC_HAS_LONG_LONG and so on. - (mips_push_dummy_frame): Use read_register_gen rather than using - read_register and then putting it back in target format with - store_unsigned_integer. If registers are more than 4 bytes, give - an error rather than have some registers overwrite other - registers. - #if 0 unused include of opcode/mips.h. - - * symfile.h: Don't declare arguments for coff_getfilename. - - * defs.h: Revert Kung change regarding FORCE_LONG_LONG. - -Thu Feb 24 08:06:52 1994 Jeffrey A. Law (law@snake.cs.utah.edu) - - * configure.in (hppa*-*-osf*): New configuration. - * config/pa/hppaosf.mt: New target makefile fragment. - * config/pa/tm-hppao.h: New target include file. - -Thu Feb 24 04:29:19 1994 Peter Schauer (pes@regent.e-technik.tu-muenchen.de) - - * exec.c (print_section_info): Print entry point for exec_bfd only. - * ser-unix.c (wait_for): Fix typo in HAVE_TERMIO case. - * dwarfread.c: Remove second inclusion of <sys/types.h>, which - causes problems if <sys/types.h> has no multiple inclusion protection. - -Wed Feb 23 16:28:55 1994 Jeffrey A. Law (law@cygnus.com) - - * tm-hppa.h (CALL_DUMMY): Add two NOP instructions to the end of - the call dummy to avoid kernel bugs in HPUX, BSD, and OSF1. - (CALL_DUMMY_LENGTH): Changed accordingly. - -Wed Feb 23 16:21:25 1994 Stu Grossman (grossman at cygnus.com) - - * sparc-stub.c (trap_low): Make trap handler work for arbitrary - numbers of register windows. - - * sparclite/hello.c: Add factorial function for testing. - * salib.c: Use macros instead of constants for I/O addresses to - make 931 support easier. - * sparclite.h: Change constraint for LOC to "rJ" to force use of - register in sta/lda instructions. - -Wed Feb 23 10:39:18 1994 Jim Kingdon (kingdon@rtl.cygnus.com) - - * dbxread.c (process_one_symbol): Set - block_address_function_relative for COFF like we do for ELF and SOM. - -Sat Feb 19 03:17:32 1994 Peter Schauer (pes@regent.e-technik.tu-muenchen.de) - - * mdebugread.c (new_psymtab): Pass in section_offsets and set - them in the pst. - * mdebugread.c (handle_psymbol_enumerators): New function to enter - the enumerators of an ecoff enum into the partial symbol table. - * mdebugread.c (parse_partial_symbols): Call it. - * symfile.c (reread_symbols): Initialize objfile->*_psymbols.next. - * symmisc.c (dump_psymtab): Fix typo, clean up output of section - offsets. Cast psymtab->read_symtab to PTR before passing it to - gdb_print_address. - * i386-tdep.c (i386_skip_prologue): Skip over instructions that - set up the global offset table pointer in pic compiled code. - * config/mips/tm-mips.h (FIX_CALL_DUMMY): For big endian targets, - error() on TYPE_CODE_FLT arguments whose size is greater than 8, - swap all other TYPE_CODE_FLT arguments as mips_push_arguments - ensures that floats are promoted to doubles before they are pushed - on the stack. - -Fri Feb 18 23:12:59 1994 Stu Grossman (grossman at cygnus.com) - - * sparclite/Makefile.in, sparclite/salib.c, sparclite/sparclite.h: - Fixup cache_on and flush_i_cache so that they work for both the - 930 and 932 processors. Rewrite most low level funcs (uart - access & cache stuff) to use new ASI access macros in sparclite.h. - Also make it easy to access second serial port. - -Fri Feb 18 22:17:33 1994 Ian Lance Taylor (ian@tweedledumb.cygnus.com) - - * hp300ux-nat.c: Don't incloude <sys/dir.h>, <sys/ioctl.h>, or - <sys/stat.h>; not needed. - -Fri Feb 18 08:26:29 1994 Jim Kingdon (kingdon@lioth.cygnus.com) - - * stack.c (print_frame_info): In "pathological" case, don't - distrust the line number information. - -Fri Feb 18 16:51:14 1994 Kung Hsu (kung@mexican.cygnus.com) - - * mips-tdep.c (mips_print_register): handle 64 bits register. - * valprint.c (print_longest): fix a bug in printing 64 bits value. - -Fri Feb 18 08:26:29 1994 Jim Kingdon (kingdon@lioth.cygnus.com) - - * Version 4.12.2. - - * Makefile.in (install): Do the sed for program_transform_name - ourselves instead of worrying about INSTALL_XFORM. This enables - users to override INSTALL_PROGRAM in the standard way. - - * Makefile.in (c-exp.tab.o, ch-exp.tab.o, m2-exp.tab.o): Don't - depend on Makefile.in. - - * defs.h, valprint.c: Make longest_to_int a function not a macro. - Only test against INT_MIN if a LONGEST is bigger than an int. - - * README: Change GhostScript to Ghostscript. - -Fri Feb 18 07:30:55 1994 Jim Kingdon (kingdon@cygnus.com) - - * config/rs6000/{tm-rs6000lynx.h,nm-rs6000lynx.h,xm-rs6000lynx.h}: - Rename to tm-rs6000ly.h, nm-rs6000ly.h, xm-rs6000ly.h for 14 - character file names. - * Makefile.in (ALLPARAM): Add these files. - - * config/mips/littlemips64.mt: Rename to mipsel64.mt for 14 - character file names. - * Makefile.in: Add Kung's new mips64 files. - -Thu Feb 17 17:25:47 1994 Kung Hsu (kung@mexican.cygnus.com) - - * configure.in: add mips64-*-elf, mips64-*-ecoff, mips64el-*-elf, - mips64el-*-ecoff and mips64-big-*. - * defs.h: get rid of FORCE_LONG_LONG. - * mips-tdep.c (mips_find_saved_regs): add sd and sdc1 instruction - parsing. Change register size to be MIPS_REGSIZE. - -Thu Feb 17 09:30:22 1994 David J. Mackenzie (djm@thepub.cygnus.com) - - * corelow.c, exec.c, irix5-nat.c, mipsread.c, objfiles.c, - osfsolib.c, rs6000-nat.c, solib.c, symfile.c, utils.c, - xcoffexec.c: Use bfd_get_error and bfd_set_error and new error names. - -Fri Feb 11 21:47:24 1994 Steve Chamberlain (sac@sphagnum.cygnus.com) - - * remote-hms.c (readchar, hms_open, hms_fetch_register): Made more robust. - (remove_commands, add_commands): Add/remove hms-drain when target - is connected. - -Fri Feb 11 16:11:38 1994 Stu Grossman (grossman at cygnus.com) - - * configure.in: Add Lynx/rs6000 support. - * lynx-nat.c: Clean up some Sparc stuff. Clean up ptrace error - messages. Add rs6000 support. Don't try to modify unwritable - registers. - * rs6000-nat.c: Move lots of native dependent stuff (like core - file support) from rs6000-tdep.c & xcoffexec.c to here. - * rs6000-tdep.c: Move native dependent stuff to nat.c. - * xcoffexec.c: Move native dependent stuff to nat.c. - * config/rs6000/nm-rs6000.h: Move defs of SOLIB_* macros to here - from tm file. - * config/rs6000/tm-rs6000.h: Remove defs of SOLIB_* funcs, cuz they're - really native. - * config/rs6000/tm-rs6000lynx.h, config/rs6000/xm-rs6000lynx.h: - New files to support Lynx/rs6000. - -Tue Feb 8 00:32:28 1994 Peter Schauer (pes@regent.e-technik.tu-muenchen.de) - - * README: Remove note about gcc warnings on alpha, these should be - gone now. - * c-exp.y, ch-exp.y, core.c, corelow.c, eval.c, fork-child.c, - m2-exp.y, minsyms.c, nlmread.c, parse.c, putenv.c, regex.c - remote-utils.c, stabsread.c: Include <string.h>. - * regex.c: Include "defs.h", change re_comp argument to const char *. - * infptrace.c (fetch_register, store_inferior_registers): Change - regaddr to type CORE_ADDR. - * config/alpha/alpha-nw.mt, config/alpha/alpha-osf1.mt (MT_CFLAGS): - Remove, no longer necessary now that we use bfd_vma for a CORE_ADDR. - -Mon Feb 7 09:21:17 1994 Jim Kingdon (kingdon@lioth.cygnus.com) - - * symtab.h: Always define BYTE_BITFIELD to nothing. - -Mon Feb 7 08:44:17 1994 Jim Kingdon (kingdon@deneb.cygnus.com) - - * config/m68k/{m68k-em.mt,tm-m68k-em.h}: Remove; no longer used. - * configure.in: Remove comment about m68k-em.mt. - * Makefile.in: Remove references. - -Mon Feb 7 08:22:42 1994 Jim Kingdon (kingdon@lioth.cygnus.com) - - * defs.h [BFD64]: Use BFD_HOST_64_BIT, not nonexistent - BFD_HOST_64_TYPE. - -Sun Feb 6 15:56:09 1994 Jeff Law (law@wild.cs.utah.edu) - - * hpread.c (hpux_symfile_init): Use obj_som_* rather than obj_* to - access BFD private data. Search for the "$TEXT$" space rather - than ".text". - (hppa_sym_fns): Add bfd target flavour to initializer. - -Sun Feb 6 06:55:15 1994 Jim Kingdon (kingdon@lioth.cygnus.com) - - * target.c (target_preopen): If target_kill doesn't remove the - target from the stack, use pop_target to do it. - - * coffread.c (process_coff_symbol, case C_TPDEF): Don't set name - of TYPE_CODE_PTR or TYPE_CODE_FUNC types. This parallels similar - changes to stabsread.c from summer 1993. - - * remote-udi.c (udi_files_info): If prog_name is NULL, just skip - printing the program, rather than passing NULL to printf. - (udi_detach): Set udi_session_id to -1 so that udi_close doesn't - try to call UDIDisconnect again. Print better message. - (udi_kill): Just call UDIDisconnect ourselves, rather than doing - it via udi_close. - (udi_create_inferior): If udi_session_id is negative, open a new - TIP rather than giving an error. - - * config/mips/mipsm3.mh, config/i386/i386m3.mh, - config/ns32k/ns32km3.mh: Define NAT_FILE. - * config/nm-m3.h: Change guard from _OS_MACH3_H_ and _OS_MACH3_H - (it was inconsistent and namespace-wrong) to NM_M3_H. - * m3-nat.c (mach_really_wait): Change parameter name to ourstatus. - (m3_open): New function. - (m3_ops): Use it. - * TODO: Update Mach section. - - * Makefile.in: Remove "rapp" stuff; it is superseded by gdbserver. - -Sun Feb 6 13:26:21 1994 Per Bothner (bothner@kalessin.cygnus.com) - - * printcmd.c (printf_command): Add missing single-letter - backslash-escape sequences, and improve error message. - -Sun Feb 6 06:55:15 1994 Jim Kingdon (kingdon@lioth.cygnus.com) - - * corelow.c (solib_add_stub, core_open): Pass address of from_tty - rather than trying to shove an int into a pointer and back out - again. This avoids compiler warnings. - - * defs.h (alloca): Declare as void *, not char *, on hpux. - Don't prototype it, just declare the return type. - -Sun Feb 6 03:25:41 1994 Peter Schauer (pes@regent.e-technik.tu-muenchen.de) - - * config/i386/tm-sun386.h, config/i386/tm-symmetry.h - (REGISTER_CONVERT_TO_RAW): Add missing backslash. - -Sat Feb 5 08:03:41 1994 Jim Kingdon (kingdon@lioth.cygnus.com) - - * remote-mips.c (mips_fetch_registers): If regno is FP_REGNUM or - ZERO_REGNUM, just read it as zero without talking to the board. - - * config/i386/tm-i386aix.h (REGISTER_CONVERT_TO_RAW): Add missing - backslash. - * i386-tdep.c (i386_extract_return_value): Pass TYPE_LENGTH (type) - to store_floating, not nonexistent variable len. - - * remote-mips.c (mips_insert_breakpoint, mips_remove_breakpoint): - New functions. - (mips_store_word): Change calling convention to return errors, and - to provide old contents if the caller wants it. - (mips_xfer_memory): Deal with errors from mips_store_word. - * config/mips/tm-idt.h, config/mips/tm-idtl.h: Remove BREAKPOINT - define now that remote-mips.c doesn't use BREAKPOINT. - - * remote-mips.c (mips_create_inferior): Call warning if arguments - specified, and then execute "set args" command. Call error, not - mips_error, if executable file not specified. - - * remote-e7000.c: Replace "snoop" command (e7000_noecho) with - remote_debug. - - * config/rs6000/tm-rs6000.h (STORE_STRUCT_RETURN): Don't cast - to unsigned int. - -Sat Feb 5 05:27:05 1994 Peter Schauer (pes@regent.e-technik.tu-muenchen.de) - - * value.h (print_longest): Rename "value" to "val" in prototype - declaration because some compilers don't like arguments whose - names are the same as types. - * remote.c (remote_xfer_memory): Cast "myaddr" to unsigned char * - before passing it to remote_*_bytes. - -Fri Feb 4 15:53:18 1994 Steve Chamberlain (sac@cygnus.com) - - * h8500-tdep.c (saved_pc_after_call): The size of the - pc is memory model dependent. (segmented_command, - unsegmented_command, _initialize_h8500_tdep): New commands to - change memory model. - * remote-e7000.c (_initialize_remote_e7000): Change name of snoop - command. - * remote-hms.c (hms_load): Remove breakpoints when loaded. - (hms_wait): Use new status structure - (hms_open): Push the target here. (hms_before_main_loop): Not - here. (supply_val, hms_fetch_register, hms_store_register): Cope - with H8/500 names too. (hms_fetch_register): Take out REGISTER_TYPE. - * sh-tdep.c (show_regs, initialize_sh_tdep): New command to print - all registers in a compact way. - -Fri Feb 4 07:41:13 1994 Jim Kingdon (kingdon@deneb.cygnus.com) - - * config/rs6000/tm-rs6000.h: Declare rs6000_struct_return_address - as CORE_ADDR to match definition in rs6000-tdep.c. - -Fri Feb 4 01:14:20 1994 Peter Schauer (pes@regent.e-technik.tu-muenchen.de) - - * dwarfread.c (process_dies): Skip nested TAG_compile_unit DIEs. - * dwarfread.c (add_partial_symbol): Do not enter opaque aggregate - definitions into the psymtab. - -Thu Feb 3 12:38:58 1994 Jim Kingdon (kingdon@lioth.cygnus.com) - - * m68k-stub.c: Treat mc68332 like mc68020 most places. Provide - a special exceptionSize for the 68332. - - * remote-udi.c (udi_attach): If no arguments, print error. - -Thu Feb 3 17:34:05 1994 Fred Fish (fnf@cygnus.com) - - * Makefile.in (VERSION): Bump to 4.12.1 - * NEWS, README: Update to match 4.12 release. - -Thu Feb 3 12:38:58 1994 Jim Kingdon (kingdon@lioth.cygnus.com) - - * command.c (empty_sfunc): New function. - (add_set_cmd): Use it instead of not_just_help_class_command. - (not_just_help_class_command): Change calling convention back to - what it was before yesterday's change. - - * stabsread.c (read_sun_builtin_type): Skip the semicolon at the end - of the type if present. - -Wed Feb 2 11:16:45 1994 Jim Kingdon (kingdon@lioth.cygnus.com) - - * printcmd.c (decode_format): Don't blithely set the size for - an address to 'w'. Make it 'g' or 'h', depending on TARGET_PTR_BIT. - - * defs.h: Just typedef CORE_ADDR to bfd_vma. Include bfd.h. - If BFD64, make a LONGEST a BFD_HOST_64_BIT. - * defs.h (longest_to_int): Don't depend on CC_HAS_LONG_LONG; instead - always just check against INT_MIN and INT_MAX (this also fixes things - if sizeof (long) > sizeof (int), e.g. Alpha). - * config/pa/tm-hppa.h, config/i386/sun386.h, config/rs6000/tm-rs6000.h: - Don't define LONGEST or BUILTIN_TYPE_LONGEST. - * gdbtypes.h: Remove BUILTIN_TYPE_LONGEST and - BUILTIN_TYPE_UNSIGNED_LONGEST. - * language.h, c-lang.c, ch-lang.c, m2-lang.c, language.c: Remove - longest_int and longest_unsigned_int. - * value.h (struct value): Just align to LONGEST, rather than worrying - about CC_HAS_LONG_LONG. - * valarith.c (value_binop): Figure out type ourself based on - sizeof (LONGEST) rather than relying on BUILTIN_TYPE_LONGEST. The - point is that we don't depend on CC_HAS_LONG_LONG anymore. - * valprint.c (val_print_type_code_int): Just call - extract_unsigned_integer directly, rather than going through - unpack_long. - * printcmd.c (decode_format): Remove code which would sometimes - change 'g' size to 'w' for integers. print_scalar_formatted handles - printing huge integers well enough, thank you. - - * command.c (add_set_cmd, not_just_help_class_command): Change - to make this the sfunc, not cfunc, since that is how we call it. - * command.h: Comment difference between sfunc and cfunc. - * demangle.c (set_demangling_command): Add third arg since that - is how it is called. - (_initialize_demangler): Use sfunc, not cfunc, for - set_demangling_command, since that is how it is called. - Remove show_demangling_command; it has no effect. - - * command.c (shell_escape): Report errors correctly (with error - message from strerror). - -Wed Feb 2 14:35:41 1994 Ian Lance Taylor (ian@tweedledumb.cygnus.com) - - * xcoffread.c (read_xcoff_symtab): Change CSECT_LEN to use - x_scnlen.l rather than x_scnlen to match corresponding change in - coff/internal.h. - -Wed Feb 2 11:16:45 1994 Jim Kingdon (kingdon@lioth.cygnus.com) - - * gdbtypes.h, ch-typeprint.c, ch-valprint.c: - Change comments regarding TYPE_CODE_BOOL. - * language.c (boolean_type): Always return 1 for TYPE_CODE_BOOL, - regardless of the language. - (value_true): Just call value_logical_not regardless of language. - * coffread.c (coff_read_enum_type), stabsread.c (read_enum_type): - Remove #if 0'd code which makes some enums TYPE_CODE_BOOL. - * language.h: Improve comment for la_builtin_type_vector. - * m2-lang.c (_initialize_m2_language): Don't add any fields to - builtin_type_m2_bool. - -Tue Feb 1 17:13:32 1994 Kevin Buettner (kev@cujo.geg.mot.com) - - * config/m88k/{tm-delta88.h,tm-delta88v4.h}, m88k-tdep.c: - Define IN_SIGTRAMP and backtrace correctly through signal handlers. - -Tue Feb 1 22:13:25 1994 Peter Schauer (pes@regent.e-technik.tu-muenchen.de) - - * procfs.c (wait_fd): Handle EINTR error return from PIOCWSTOP ioctl - by restarting the ioctl. - -Tue Feb 1 16:16:25 1994 Jim Kingdon (kingdon@lioth.cygnus.com) - - * target.h (target_wait): Add comment about calling - return_to_top_level. - -Tue Feb 1 12:21:00 1994 Ian Lance Taylor (ian@tweedledumb.cygnus.com) - - * coffread.c (read_one_sym): bfd_coff_swap_aux_in now takes - additional arguments. - * xcoffread.c (read_xcoff_symtab, read_symbol_lineno): Likewise. - -Mon Jan 31 16:10:41 1994 Stu Grossman (grossman at cygnus.com) - - * sparc-stub.c: Remove unnecessary #include of memory.h. - -Mon Jan 31 12:12:34 1994 Jim Kingdon (kingdon@lioth.cygnus.com) - - * mips-tdep.c: Remove code which sets saved_regs from - init_extra_frame_info and put it in new function mips_find_saved_regs. - (READ_FRAME_REG): Remove macro and replace uses with the expansion. - * mips-tdep.c, config/mips/tm-mips.h: When examining ->saved_regs, - check if it is NULL and call mips_find_saved_regs if so. - - * remote-mips.c: Use unfiltered, not filtered, output most places. - - * blockframe.c (get_prev_frame_info): Detect and stop an infinite - backtrace. Revise comments. - -Mon Jan 31 09:40:33 1994 Peter Schauer (pes@regent.e-technik.tu-muenchen.de) - - * mdebugread.c (parse_procedure): Remove _sigtramp kludges for - alpha and irix. The _sigtramp case has to be handled properly - in the tdep files if we have no ecoff debugging info. - * alpha-tdep.c (alpha_frame_saved_pc, alpha_frame_chain), - mips-tdep.c (mips_frame_saved_pc): Handle signal handler frames - without PC_REGNUM kludge. - * mdebugread.c (fixup_sigtramp), mips-tdep.c (read_next_frame_reg): - Clean up handling of mips sigtramp frames, improve comments. - -Sat Jan 29 23:25:57 1994 Jeffrey A. Law (law@snake.cs.utah.edu) - - * paread.c (read_unwind_info): Fix typo. - - * paread.c (pa_symtab_read): Update the "check_strange_names" - filter to match GCC's current output. Filter out section symbols - (which the HP linker sometimes puts in the wrong place). - -Sat Jan 29 07:44:59 1994 Jim Kingdon (kingdon@deneb.cygnus.com) - - * serial.h (SERIAL_SET_TTY_STATE): Comment return value. - - * Makefile.in (TAGS): Just echo one line, rather than the whole thing. - - * Makefile.in: Remove all references to sparcly-nat.c. - - * Makefile.in (HFILES_NO_SRCDIR): Include dcache.h remote-utils.h - remote-sim.h directly, rather than via $(remote_utils_h). This avoids - duplicating serial.h and target.h. - - * Makefile.in: Don't set M_INSTALL and M_UNINSTALL. These variables - are not used anywhere (a 5 Oct 1993 change removed the uses). - - * config/m68k/monitor.mt (TDEPFILE): Add remote-es.o. - * config/m68k/es1800.mt: Add comment. - * remote-es.c: Extensive changes to update to current conventions. - - * ser-unix.c (wait_for, hardwire_readchar) [HAVE_TERMIO, HAVE_TERMIOS]: - If the timeout is too big to fit in c_cc[VTIME], then do multiple reads - to achieve the desired timeout. - * serial.h (serial_t): Add field timeout_remaining. - -Fri Jan 28 08:45:02 1994 Jim Kingdon (kingdon@deneb.cygnus.com) - - * c-exp.y (yylex): Reenable nested type code. - -Fri Jan 28 15:40:33 1994 Jim Kingdon (kingdon@lioth.cygnus.com) - - * a29k-tdep.c (examine_tag): Add comment regarding argcount. - - * remote-mips.c (mips_ops): Fix docstring. - - * remote-bug.c (bug_ops): Remove spurious newline from docstring. - - * config/m68k/tm-monitor.h: Changes to bring this into accordance - with the old tm-m68k-em.h: - (GDBINIT_FILENAME, DEFAULT_PROMPT): Remove. - (HAVE_68881): Don't undefine; HAVE_68881 is obsolete. - (REGISTER_NAMES): Don't muck with it; what tm-m68k.h has is fine. - Add FIXME regarding GET_LONGJMP_TARGET. - - * remote-udi.c (udi_close, udi_detach, udi_kill): Add comments. - * infptrace.c (kill_inferior): Add comments. - * main.c (quit_command): Call target_close after we kill or - detach. - * remote-udi.c (udi_close): Don't error() if QUITTING. - -Fri Jan 28 11:55:52 1994 Rob Savoye (rob@darkstar.cygnus.com) - - * configure.in: Make m68k-coff and aout add monitor support in - addition to the standard serial support. - -Fri Jan 28 08:45:02 1994 Jim Kingdon (kingdon@deneb.cygnus.com) - - * mdebugread.c (psymtab_to_symtab_1): Don't complain on stLabel with - index indexNil. - -Fri Jan 28 10:40:34 1994 Jim Kingdon (kingdon@lioth.cygnus.com) - - * config/pa/tm-hppa.h: Define macro SMASH_TEXT_ADDRESS. - * elfread.c (record_minimal_symbol_and_info), - dwarfread.c (process_dies), paread.c (pa_symtab_read): Use it. - -Thu Jan 27 15:12:23 1994 Jim Kingdon (kingdon@lioth.cygnus.com) - - * i386-stub.c: Add ".text" right before "mem_fault:". - - * main.c (baud_rate): Add FIXME comment about printing -1 value. - - * remote-utils.c (usage): Fix message to be accurate and conform - more closely to normal conventions. - - * remote-utils.c (gr_files_info): Have the exec_bfd test control - whether to show information about exec_bfd, and not control whether - to show information about device and speed. - - * remote-utils.c (gr_open): If sr_get_device returns NULL, give - usage message, don't dump core. - - * remote-bug.c (bug_write_memory): Use alloca, not GCC extension - for variable size array. - (bug_fetch_register, bug_store_register): Rename "value" to - "fpreg_buf" because some compilers don't like variables whose - names are the same as types. - (bug_store_register): Use a cast when converting char * to - unsigned char *. - - * symmisc.c (maintenance_print_symbols): Don't refer to the name - of the command in error message (the text was referring to the old - name of the command). - - * symmisc.c (dump_symtab): Fix args to fprintf_filtered. - - * c-typeprint.c (c_type_print_base): Have SHOW == 0 mean to print - full details on structure elements without names. This partially - reverts the changes of 1 Jul 1993 and 31 Aug 1993; I think this aspect - of those changes was accidental. - - * stack.c (parse_frame_specification): If SETUP_ARBITRARY_FRAME is - defined, make it an error to specify a single argument which is not - a frame number. - - * Makefile.in (version.c), main.c (print_gdb_version): Use - host_alias and target_alias, not host_canonical and - target_canonical, to print configuration. - -Wed Jan 26 10:57:21 1994 Jim Kingdon (kingdon@lioth.cygnus.com) - - * parse.c (write_exp_msymbol): Use new type msymbol_addr_type instead - of builtin_type_long. It is necessary to get a type which is - TARGET_PTR_BIT bits in size; builtin_type_long might not be big enough. - - Fix many sins which will come up in 32 bit x 64 bit GDB, and - various miscellaneous things discovered in the process: - * printcmd.c, defs.h (print_address_numeric): New function. - * c-valprint.c (c_val_print), ch-valprint.c (chill_val_print) - breakpoint.c (describe_other_breakpoints, breakpoint_1, mention), - cp-valprint.c (cplus_print_value), infcmd.c (jump_command), - printcmd.c, stack.c, symfile.c, symmisc.c, valprint.c: - Use it. - * utils.c, defs.h (gdb_print_address): New function. - * expprint (dump_expression), gdbtypes.h: Use it. - * breakpoint.c (describe_other_breakpoints), - symmisc.c (dump_symtab, print_symbol): - Use filtered not unfiltered I/O. - (remove_breakpoints): Remove BREAKPOINT_DEBUG code. Might as well - just run gdb under a debugger for this (and it had problems with - printing addresses, how to print b->shadow, etc.). - * buildsym.c (make_blockvector), core.c (memory_error), - exec.c (print_section_info), maint.c (print_section_table), - mdebugread.c (parse_procedure), solib.c, source.c, symfile.c, - symmisc.c, symtab.c, valops.c, valprint.c, xcoffexec.c: - Add comments saying code is broken. Marked with "FIXME-32x64". - * dbxread.c (process_one_symbol), partial-stab.h (default), - remote-vx.c (vx_run_files_info): - Don't cast int being passed to local_hex_string. - * symmisc.c (print_symbol): Don't cast long being passed to %lx. - * symtab.h (general_symbol_info): Add comment about SYMBOL_VALUE - only being a long. - * symmisc.c (print_symbol): Print "offset" in message for LOC_ARG - and LOC_LOCAL. - * printcmd.c (print_address): Remove #if 0 code with ADDR_BITS_REMOVE. - * source.c: Include <sys/types.h> regardless of USG. - -Tue Jan 25 12:58:26 1994 Peter Schauer (pes@regent.e-technik.tu-muenchen.de) - - * valops.c (value_assign): Set `type' after coercing toval. - * c-valprint.c (c_val_print), ch-valprint.c (chill_val_print): - Use extract_unsigned_integer to get the address of a reference. - -Tue Jan 25 11:31:53 1994 Jim Kingdon (kingdon@lioth.cygnus.com) - - * stabsread.c (STABS_CONTINUE, error_type), partial-stab.h: - AIX can use ? instead of \ for continuation. Deal with it. - - * paread.c (read_unwind_info): Just assign to objfile->obj_private, - not OBJ_UNWIND_INFO. Assigning to a cast is a GCC-ism which - the HP compiler in ANSI mode doesn't like. - - * main.c: When defaulting HAVE_SIGSETMASK based on USG, just do it - based on USG, rather than defining HAVE_SIGSETMASK to an - expression containing defined. Having a macro used in #if expand - to an expression containing "defined" is undefined according to - ANSI, and the HP compiler in ANSI mode doesn't do what we wanted - it to. - -Mon Jan 24 20:51:29 1994 John Gilmore (gnu@cygnus.com) - - * sparc-nat.c (fetch_inferior_registers, store_inferior_registers): - Clean up the changes of 11 Jan, as recommended by Peter Schauer. - -Fri Jan 21 19:10:44 1994 Per Bothner (bothner@kalessin.cygnus.com) - - * ch-exp.y (match_string_literal): Allow a zero-length string. - * ch-lang.c (chill_printstr): Don't print zero-length string funny. - -Sat Jan 22 17:08:48 1994 Jim Kingdon (kingdon@lioth.cygnus.com) - - * i386aix-nat.c (i386_float_info): Reverse order of registers before - passing them to print_387_status. - (print_387_status): Don't subtract top from 7 before using it. - * i387-tdep.c: Remove comment about AIX wanting "top" subtracted - from 7; the above explains it. - -Sat Jan 22 20:25:11 1994 Peter Schauer (pes@regent.e-technik.tu-muenchen.de) - - * mips-tdep.c (init_extra_frame_info): Use frame relative stack - pointer value when fixing up the frame at the start of a function. - -Sat Jan 22 12:29:13 1994 Stu Grossman (grossman at cygnus.com) - - * lynx-nat.c (fetch_core_registers): Load the I & L regs for the - Sparc from the stack. - -Sat Jan 22 08:30:42 1994 Jim Kingdon (kingdon@deneb.cygnus.com) - - * remote-mips.c (mips_initialize): Clear mips_initializing via - cleanup chain, not directly. - - * ser-unix.c (wait_for) [HAVE_TERMIO, HAVE_TERMIOS]: Make a timeout - of -1 mean forever, like in the HAVE_SGTTY case. Warn if we are - munging the timeout due to the limited range of c_cc[VTIME]. - - * fork-child.c, inferior.h (fork_inferior): New argument shell_file. - * procfs.c (procfs_create_inferior), inftarg.c (child_create_inferior), - m3-nat.c (m3_create_inferior): Pass it. - * procfs.c: Remove ptrace function. It was declared in a way which - conflicted with the prototype in unistd.h on Solaris. - -Sat Jan 22 01:37:40 1994 Peter Schauer (pes@regent.e-technik.tu-muenchen.de) - - * sparc-tdep.c (frame_saved_pc): Get the pc from the saved pc - in the sigcontext if it is a signal trampoline frame. - * config/sparc/tm-sun4sol2.h (IN_SIGTRAMP, SIGCONTEXT_PC_OFFSET): - Define for Solaris2. - -Sat Jan 22 00:34:47 1994 Stu Grossman (grossman at cygnus.com) - - * sparc-tdep.c, lynx-nat.c, config/sparc/tm-sparc.h, - config/sparc/tm-sparclynx.h: Move defs of FRAME_SAVED_I0/L0 to - tm-sparc.h so they can be overridden if necessary. - -Fri Jan 21 17:49:28 1994 Stu Grossman (grossman at cygnus.com) - - * lynx-nat.c: Add Sparc support. - * sparcly-nat.c: Remove. It's useless. - * config/sparc/nm-sparclynx.h: Rewrite. - * config/sparc/sparclynx.mh (NATDEPFILES): Replace sparcly-nat.o - with lynx-nat.o - * config/sparc/tm-sparclynx.h: Rewrite. - -Fri Jan 21 19:08:48 1994 Ian Lance Taylor (ian@tweedledumb.cygnus.com) - - * rs6000-pinsn.c: Use the new disassembler in the opcodes - directory. Old code was discarded, since the new opcode table has - a different format. - -Fri Jan 21 14:28:30 1994 Fred Fish (fnf@cygnus.com) - - * Makefile.in (realclean): Remove info files per make-stds.texi. - -Fri Jan 21 12:47:53 1994 Jim Kingdon (kingdon@lioth.cygnus.com) - - * dbxread.c (end_psymtab): Only patch psymtab textlow and texthigh - if N_SO_ADDRESS_MAYBE_MISSING is defined. - * config/sparc/tm-sun4sol2.h: Define it. - -Thu Jan 20 15:04:24 1994 Peter Schauer (pes@regent.e-technik.tu-muenchen.de) - - * printcmd.c (print_address_symbolic): Unconditionally use msymbol - if we did not find a symbol. - -Fri Jan 21 08:20:18 1994 Jeffrey A. Law (law@snake.cs.utah.edu) - - * infptrace.c (child_xfer_memory): Only use if CHILD_XFER_MEMORY - is not defined. - - * hppab-nat.c (call_ptrace): Delete redundant function. - (kill_inferior, attach, detach, child_resume): Likewise. - (child_xfer_memory): Likewise. - - * hppah-nat.c (call_ptrace): Delete redundant function. - (kill_inferior, attach, detach, child_resume): Likewise. - - * config/pa/hppabsd.mh (NATDEPFILES): Add infptrace.o. - - * config/pa/hppahpux.mh (NATDEPFILES): Add infptrace.o. - - * config/pa/nm-hppab.h (FETCH_INFERIOR_REGISTERS): Define. - - * config/pa/nm-hppah.h (FETCH_INFERIOR_REGISTERS): define. - (CHILD_XFER_MEMORY): Define. - (PT_*): Define so that generic infptrace.c code can be used. - -Fri Jan 21 09:23:33 1994 Jim Kingdon (kingdon@lioth.cygnus.com) - - * xcoffread.c (xcoff_symfile_read): Make second parameter a - struct section_offsets *, not a (nonexistent) struct section_offset *. - - * xcoffread.c (read_xcoff_symtab): Make main_aux just a union - internal_xcoff_symtab, not an array of one of them. Change lots of - "main_aux" to "&main_aux" and so on. - - * coffread.c, xcoffread.c: Include <coff/internal.h> - before "symfile.h". - -Thu Jan 20 17:30:55 1994 Jim Kingdon (kingdon@lioth.cygnus.com) - - * coffread.c (coff_getfilename): Make it not static. - - * xcoffread.c (read_xcoff_symtab): complain() not abort(). - - * xcoffread.c (struct coff_symbol): Rename c_nsyms to c_naux (removes - a completely gratuitous difference between xcoffread.c and coffread.c). - -Wed Jan 19 15:09:44 1994 Jim Kingdon (kingdon@lioth.cygnus.com) - - * infrun.c (wait_for_inferior): Don't set frame for - step_resume_breakpoint for IN_SIGTRAMP cases. - - * infrun.c (wait_for_inferior), breakpoint.h (struct bpstat_what), - breakpoint.c (bpstat_what): Move step_resume from its own field of - the struct bpstat_what into the main_action. Make it override - other breakpoints. This is a conservative change in the sense - that before the step resume breakpoint was a breakpoint.c - breakpoint, hitting the step resume breakpoint overrode even - calling bpstat_stop_status. - -Wed Jan 19 12:40:25 1994 Peter Schauer (pes@regent.e-technik.tu-muenchen.de) - - * infrun.c (normal_stop): Set stop_pc after popping the dummy frame - in case execution was stopped in the called function. - * stack.c (print_frame_info, frame_info): If backtracing through - a call dummy, handle the starting source line number on a line - boundary like backtracing through sigtramp. - * sparc-tdep.c (sparc_frame_find_saved_regs): Get frame address - for call dummy frame right. Remove old test for dummy frame, - it has been unused at least since gdb-3.5. - * sparc-tdep.c (sparc_push_dummy_frame): Set return address register - of the dummy frame. - -Tue Jan 18 16:16:35 1994 Jim Kingdon (kingdon@lioth.cygnus.com) - - * infcmd.c (signal_command): Accept 0 as legitimate signal number. - -Tue Jan 18 14:09:25 1994 Peter Schauer (pes@regent.e-technik.tu-muenchen.de) - - * infrun.c (signals_info), target.c (target_signal_from_name): - Use ugly casts to avoid enumvar < enumvar or enumvar++. - -Mon Jan 17 22:00:15 1994 Jim Kingdon (kingdon@lioth.cygnus.com) - - * ser-unix.c (hardwire_noflush_set_tty_state): Don't muck with ICANON. - * inflow.c (terminal_ours_1): When discussing how to deal with the - tty state, make note of query() as well as readline. - - * infrun.c (_initialize_infrun): Add TARGET_SIGNAL_POLL to list of - signals for which stop and print are cleared by default. - -Mon Jan 17 20:00:51 1994 Jeffrey A. Law (law@snake.cs.utah.edu) - - * config/pa/tm-hppa.h (unwind_table_entry): Use one of the - reserved fields to hold a stub unwind entry type. Fix typo. - (stub_unwind_entry): New structure for raw stub unwind entries. - (stub_unwind_types): The types of stubs we may encounter. - (UNWIND_ENTRY_SIZE, STUB_UNWIND_ENTRY_SIZE): New defines. - * hppa-tdep.c (rp_saved): Use additional information provided - by linker stub unwind descriptors. - (frameless_function_invocation): Likewise. - (frame_chain_valid): Likewise. - * paread.c (compare_unwind_entries): New function for sorting - unwind table entries. - (read_unwind_info): Rewrite to remove dependency on host endianness. - Read in data from the $UNWIND_END$ subspace which contains linker - stub unwind descriptors. Merge that data into the basic unwind - table. - - * hppab-nat.c (_initialize_kernel_u_addr): Delete unwanted functions. - -Mon Jan 17 22:00:15 1994 Jim Kingdon (kingdon@lioth.cygnus.com) - - * xcoffread.c (read_xcoff_symtab, case C_FILE): Accept the name - from either the symbol name or the auxent. - * coffread.c, symfile.h (coff_getfilename): Renamed from getfilename, - no longer static. - -Mon Jan 17 13:35:01 1994 Fred Fish (fnf@cygnus.com) - - * Makefile.in (ALLPARAM): Change irix5.h to nm-irix5.h. - -Mon Jan 17 12:35:42 1994 Peter Schauer (pes@regent.e-technik.tu-muenchen.de) - - * README: Update notes for alpha port. - -Mon Jan 17 11:15:57 1994 Jim Kingdon (kingdon@lioth.cygnus.com) - - * i960-tdep.c (i960_fault_to_signal): Return TARGET_SIGNAL_ILL - for operation fault, constraint fault, and type fault. - -Sun Jan 16 12:46:01 1994 Jim Kingdon (kingdon@lioth.cygnus.com) - - * Makefile.in (init.c): Add comment explaining formatting conventions. - - * c-exp.y (parse_number): Assign to temporary between the right - shifts, to work around a bug in the SCO compiler. - - * Makefile.in (ALLCONFIG, ALLPARAM, ALLDEPFILES, HFILES_NO_SRCDIR): - Add various files which were added to GDB recently. - - * xcoffread.c (process_xcoff_symbol): Only change 'V' to 'S' if not - within_function. - - * Makefile.in: Add mostlyclean target. - -Sat Jan 15 10:20:13 1994 Jim Kingdon (kingdon@lioth.cygnus.com) - - * Version 4.11.4. - -Sat Jan 15 18:27:34 1994 Per Bothner (bothner@kalessin.cygnus.com) - - * main.c (show_commands): Make return type of extern - history_get be HIST_ENTRY, rather than struct _hist_entry. - (The latter loses with the upcoming merged readline.) - -Sat Jan 15 10:20:13 1994 Jim Kingdon (kingdon@lioth.cygnus.com) - - * minsyms.c (prim_record_minimal_symbol_and_info): Make tempstring - const char *, not char *. - - * symtab.h (struct symbol): Make section short, not unsigned short. - - * symtab.c (lookup_symbol): Add comment about QUIT here. - - * utils.c (fputs_unfiltered): Call fputs, not fputs_maybe_filtered. - - * c-exp.y (parse_number): Check for overflow regardless of range - checking. Fix overflow check to use unsigned LONGEST, not - unsigned int. - - * c-exp.y (parse_number): Make it so that integer constants are - builtin_type_long_long if builtin_type_long isn't big enough or if - an "LL" suffix is used. Properly handle "UL" or "LU" suffixes. - - * c-typeprint.c (c_type_print_varspec_suffix, case TYPE_CODE_FUNC): - Print our "()" first, then recurse for the target type. - -Fri Jan 14 21:55:39 1994 Jim Kingdon (kingdon@lioth.cygnus.com) - - * remote-udi.c (udi_create_inferior): Quote empty execfile argument. - - * gdbserver/low-lynx.c: Include <sys/wait.h> not "/usr/include/wait.h". - -Fri Jan 14 14:17:06 1994 Jim Kingdon (kingdon@lioth.cygnus.com) - - * utils.c (request_quit): Re-establish signal handler regardless - of USG. - - * config/mips/xm-irix4.h: Define HAVE_TERMIOS. - -Fri Jan 14 21:55:39 1994 Jim Kingdon (kingdon@lioth.cygnus.com) - - * i960-tdep.c: Include target.h. - -Fri Jan 14 17:12:28 1994 Stan Shebs (shebs@andros.cygnus.com) - - * lynx-nat.c (sys/wait.h): Don't use absolute pathname. - -Fri Jan 14 11:06:10 1994 Jim Kingdon (kingdon@deneb.cygnus.com) - - * lynx-nat.c (child_wait): Fix thinkos in struct target_waitstatus - changes (status -> ourstatus; declare status, etc.). - * config/nm-lynx.h: Fix child_wait prototype and include target.h. - -Fri Jan 14 14:17:06 1994 Jim Kingdon (kingdon@lioth.cygnus.com) - - * Makefile.in (ALLPARAM): Add config/nm-lynx.h. - -Fri Jan 14 11:49:44 1994 Ian Lance Taylor (ian@tweedledumb.cygnus.com) - - * remote-mips.c (mips_request, mips_wait): Correct prototypes. - -Fri Jan 14 11:37:17 1994 Jim Kingdon (kingdon@lioth.cygnus.com) - - * config/i386/xm-linux.h: Define HAVE_TERMIOS. - -Fri Jan 14 01:04:36 1994 Peter Schauer (pes@regent.e-technik.tu-muenchen.de) - - * config/alpha/tm-alpha.h (CALL_DUMMY): Improve comment. - -Thu Jan 13 10:32:38 1994 Jim Kingdon (kingdon@lioth.cygnus.com) - - * remote-vx.c (vx_wait): Only call i960_fault_to_signal if I80960 - is defined. Otherwise just report TARGET_SIGNAL_UNKNOWN. - - * mips-tdep.c (mips_push_arguments): Byteswap struct_addr before - writing it. - - Add search to target vector (#if 0'd until after 4.12): - * target.h (to_search, target_search): Add. - * gdbcore.h, core.c (generic_search): Add. - * remote.c (remote_search): Add. - * a29k-tdep.c (init_frame_info): Use target_search to find traceback - tag. - - * printcmd.c (print_address_symbolic): If set print fast-symbolic-addr - is on, call find_pc_function rather than relying just on the minimal - symbols (probably only matters for symbol readers which don't put - statics in the minimal symbols, but changing this strikes me as - not conservative enough). - Initialize name_location in all cases. - If no symbol and no msymbol, don't print anything symbolic. - - * a29k-tdep.c (push_dummy_frame): Add comment about saving lr0. - -Wed Jan 12 20:53:16 1994 John Gilmore (gnu@cygnus.com) - - * printcmd.c (print_address_symbolic): Make it search the - symtabs for variables as well as functions. Add `set print - fast-symbolic-addr' and default it to fast (the old way). - Print line numbers for data items as well as functions. - - * symtab.c (find_addr_symbol): Return the symtab and the symbol - address, if a symbol is found (take two more args pointing to - where to store these results). - - * symtab.h (find_addr_symbol): Add prototype. - -Wed Jan 12 19:32:11 1994 Jim Kingdon (kingdon@lioth.cygnus.com) - - * objfiles.h: Fix comments to reflect the fact that the phrase - "top of stack" always refers to where the pushing and popping takes - place, regardless of whether it is at the highest or lowest address. - -Wed Jan 12 13:23:37 1994 Peter Schauer (pes@regent.e-technik.tu-muenchen.de) - - * mdebugread.c (parse_symbol): Do not set TYPE_TAG_NAME for - compiler generated tag names. - * mdebugread.c (parse_type): Handle cross references to qualified - aggregate types. - * valops.c (value_struct_elt): Improve error message if the - address of a method is requested from an object instance. - * valops.c (search_struct_method): Make name_matched non-static - to get it initialized correctly. - * config/i386/nm-i386sco.h (CANNOT_STORE_REGISTER): Define to - exclude segment register which are not writable on newer SCO versions. - -Wed Jan 12 14:44:45 1994 Jim Kingdon (kingdon@lioth.cygnus.com) - - * go32-xdep.c: Remove unused function uerror. - (sigsetmask): Declare return type. Declare argument (to match the - way it is called). Explicitly return 0. - -Wed Jan 12 01:44:25 1994 John Gilmore (gnu@cygnus.com) - - * symtab.h (struct symbol, general_symbol_info, minimal_symbol, - partial_symbol): Shrink the storage sizes of symbols, by making - enums into 1-byte bitfields when compiled __GNUC__, moving all the - enums and small ints to the end of each struct to improve - alignment, and switching the section number from int to unsigned - short. - -Wed Jan 12 00:16:26 1994 John Gilmore (gnu@cygnus.com) - - * symtab.c (find_addr_symbol): New routine that will find the nearest - symbol associated with an address. It does so by exhaustive - search of the symtabs, so it's slow but complete. - -Tue Jan 11 23:57:30 1994 John Gilmore (gnu@cygnus.com) - - * coffread.c (read_coff_symtab): Set PC bounds of _globals_ symtab - to [0,0] rather than [0, end of first source file]. This avoids - problems with other parts of GDB looking for linetables in the - _globals_ symtab. Eliminate variables num_object_files and - first_object_file_end. - -Tue Jan 11 00:53:46 1994 John Gilmore (gnu@cygnus.com) - - * a29k-tdep.c (init_frame_info): Cast null arg to examine_tag. - (pop_frame): Restore PC2 and LR0 from dummy frames. - (push_dummy_frame): Save PC2 and LR0 into dummy frames. - (setup_arbitrary_frame): Handle 3 args and set up real frames. - * config/a29k/tm-a29k.h (FRAME_NUM_ARGS): Update comments. - (DUMMY_FRAME_RSIZE): Add 2 longwords for PC2 and LR0. - (SETUP_ARBITRARY_FRAME): Define. - -Tue Jan 11 06:59:10 1994 Jim Kingdon (kingdon@deneb.cygnus.com) - - * infrun.c, config/mips/tm-irix5.h: Remove #if 0'd AT_FUNCTION_START. - -Tue Jan 11 14:27:03 1994 Ian Lance Taylor (ian@tweedledumb.cygnus.com) - - * remote-udi.c (udi_resume): Correct prototype. - -Tue Jan 11 11:10:30 1994 Jeffrey A. Law (law@snake.cs.utah.edu) - - * config/pa/tm-hppa.h (FRAME_FIND_SAVED_REGS): Call - hppa_frame_find_saved_regs. - * hppa-tdep.c (dig_fp_from_stack): Delete function. - (prologue_inst_adjust_sp): New function. - (is_branch, inst_saves_gr, inst_saves_fr): New functions. - (skip_prologue): Completely rewrite to use unwind information. - (hppa_frame_find_saved_regs): Likewise. - -Tue Jan 11 06:59:10 1994 Jim Kingdon (kingdon@deneb.cygnus.com) - - * remote-mips.c (mips_wait): Use new function mips_signal_from_protocol - to convert a signal number with appropriate bounds checking. - - * remote-mips.c (mips_wait): Fix typos (0x177 -> 0177, 0x377 -> 0377). - -Tue Jan 11 00:53:46 1994 John Gilmore (gnu@cygnus.com) - - * stack.c (frame_info): If FRAME_FIND_SAVED_REGS isn't defined, - print a newline to end the display anyway. - - * sparc-tdep.c (sparc_pop_frame): Pop the fsr and csr (float and - coprocessor status regs) when popping a frame. This fixes - float exceptions that occur after calling inferior functions. - - * sparc-nat.c (fetch_inferior_registers, store_inferior_registers): - Read and write the fsr (float status register) to/from the child - process along with the float regs. Remove Peter Schauer's change - of May 24 '93, which has higher overhead and doesn't solve the - real problem (which was that FSR wasn't being set). - -Mon Jan 10 23:16:42 1994 John Gilmore (gnu@cygnus.com) - - * a29k-tdep.c (examine_prologue): Don't worry if the ASGEQ - stack overflow check isn't right after the register stack - adjustment instruction. Metaware R2.3u compiler moves other - things in front of it. This fix isn't perfect but is what's - running. - -Mon Jan 10 20:08:23 1994 Jim Kingdon (kingdon@deneb.cygnus.com) - - * c-valprint.c (c_val_print): Treat TYPE_CODE_RANGE like TYPE_CODE_INT. - - * config/alpha/alpha-netware.mt: Rename to alpha-nw.mt for 14 - character filenames. - * configure.in: Change accordingly. - -Mon Jan 10 15:48:36 1994 Tom Lord (lord@rtl.cygnus.com) - - * m68k-stub.c, sparc-stub.c: removed spurious introduction of - _filtered io routines from these two files. - -Fri Jan 7 12:42:45 1994 Peter Schauer (pes@regent.e-technik.tu-muenchen.de) - - * config/i386/tm-i386v.h, config/m68k/tm-m68k.h, config/mips/tm-mips.h, - config/vax/tm-vax.h (CALL_DUMMY_BREAKPOINT_OFFSET): Define. - * mdebugread.c (parse_symbol): Handle enum sh.type produced by - DEC c89. - * mdebugread.c (add_line): Handle zero linenos produced by DEC c89. - -Fri Jan 7 12:55:25 1994 Jim Kingdon (kingdon@lioth.cygnus.com) - - * utils.c (print_sys_errmsg): Call gdb_flush (gdb_stdout) before - printing to gdb_stderr. - - * remote-udi.c (udi_kill): Don't close the connection, just set - inferior_pid to zero. - (udi_mourn): Call remove_breakpoints. - - * remote-udi.c: Remove obsolete need_artificial_traps comment. - - * i386b-nat.c (sregmap): If sEAX, etc., not defined, use tEAX, etc. - -Thu Jan 6 07:17:53 1994 Jim Kingdon (kingdon@deneb.cygnus.com) - - * symtab.c (lookup_symbol): Don't try adding .c to the name. - - * remote-bug.c: At the start of each section, reset srec_frame - back to 160. - - * target.h: Add TARGET_WAITKIND_LOADED and TARGET_WAITKIND_SPURIOUS. - * target.c (store_waitstatus): Add CHILD_SPECIAL_WAITSTATUS hook. - * infrun.c (wait_for_inferior): Replace SIGTRAP_STOP_AFTER_LOAD with - code which looks for those two waitkinds. Use switch statement. - * config/rs6000/tm-rs6000.h: Replace SIGTRAP_STOP_AFTER_LOAD with - CHILD_SPECIAL_WAITSTATUS. - - * procfs.c (procfs_wait): Fix argument name to match 4 Jan changes. - * Move target_signal_from_host, target_signal_to_host, and - store_waitstatus from inftarg.c to target.c. procfs needs them. - * target.c: Include "wait.h" and <signal.h>. - * target.h, infrun.c (proceed), proceed callers: Pass new code - TARGET_SIGNAL_DEFAULT instead of -1. This avoids problems with - enums being treated as unsigned and is cleaner. - * infrun.c (signals_info): Don't print TARGET_SIGNAL_DEFAULT or - TARGET_SIGNAL_0. - * infcmd.c (signal_command), infrun.c (signals_info): - Don't allow user to specify numeric equivalent of - TARGET_SIGNAL_DEFAULT. - -Tue Jan 4 15:34:36 1994 Stu Grossman (grossman@cygnus.com) - - * config/alpha/alpha-netware.mt: New target support for Alpha - running Netware. - * configure.in: Add alpha-*-netware* target. - -Tue Jan 4 14:51:35 1994 Stan Shebs (shebs@andros.cygnus.com) - - * remote-mips.c (mips_wait): Fix ref to TARGET_WAITKIND_STOPPED. - -Tue Jan 4 09:47:14 1994 Jim Kingdon (kingdon@lioth.cygnus.com) - - * target.h: Add enum target_waitkind, enum target_signal, and - struct target_waitstatus. Change status argument to target_wait to - be struct target_waitstatus * instead of int *. - * target.h, infrun.c, all targets: Change type of signal arguments - to resume(), proceed(), and target_resume() from int to enum - target_signal. - * All targets (*_wait, *_resume): Change accordingly. - * infcmd.c (program_info, signal_command), throughout infrun.c, - * fork-child.c, solib.c, hppa-tdep.c, osfsolib.c: Use this stuff. - * convex-xdep.c, convex-tdep.c: Add FIXME's (getting the Convex - signal code stuff right with the new signals would be non-trivial). - * inferior.h (stop_signal): Make it enum target_signal not int. - * target.c, target.h (target_signal_to_string, target_signal_to_name, - target_signal_from_name): New functions. - * inftarg.c, target.h (target_signal_to_host, target_signal_from_host, - store_waitstatus): New functions. - * procfs.c (procfs_notice_signals): Use them. - * i960-tdep.c (i960_fault_to_signal): New function, to replace - print_fault. - * config/i960/tm-i960.h: Don't define PRINT_RANDOM_SIGNAL. - - * objfiles.c (build_objfile_section_table): Don't abort() if - objfile->sections is already set. - - * objfiles.c (add_to_objfile_sections): Check SEC_ALLOC not SEC_LOAD - to match recent change to exec.c. - - * Version 4.11.3. - - * main.c (print_gdb_version): Change year to 1994. - - * ChangeLog, ChangeLog-93: Split ChangeLog at 1994. - * Makefile.in (NONSRC): Add ChangeLog-93. - -Mon Jan 3 11:57:29 1994 Jim Kingdon (kingdon@lioth.cygnus.com) - - * stabsread.c (read_type): Allow defining several type numbers - at once (e.g. "(1,2)=(3,4)="...). - - * stabsread.c (read_enum_type): Use TARGET_INT_BIT not sizeof (int). - - * breakpoint.c (frame_in_dummy): Check PC as well as frame. - -Mon Jan 3 02:47:03 1994 Peter Schauer (pes@regent.e-technik.tu-muenchen.de) - - * mdebugread.c (psymtab_to_symtab_1): Only pass N_STAB symbols - to process_one_symbol. - * symtab.c (find_pc_psymbol): Search global_psymbols as well to - avoid caching a bad endaddr in find_pc_partial_function. - -Sun Jan 2 21:41:17 1994 Jim Kingdon (kingdon@lioth.cygnus.com) - - * config/m68k/tm-sun3.h: Don't define BELIEVE_PCC_PROMOTION. - -Sat Jan 1 04:35:23 1994 Peter Schauer (pes@regent.e-technik.tu-muenchen.de) - - * infrun.c (wait_for_inferior): Do not step or step resume past - the end of a one-line function we just stepped into. - -For older changes see ChangeLog-93 - -Local Variables: -mode: indented-text -left-margin: 8 -fill-column: 74 -version-control: never -End: diff --git a/contrib/gdb/gdb/ChangeLog-95 b/contrib/gdb/gdb/ChangeLog-95 deleted file mode 100644 index 2265be880adb0..0000000000000 --- a/contrib/gdb/gdb/ChangeLog-95 +++ /dev/null @@ -1,4915 +0,0 @@ -Fri Dec 29 16:30:58 1995 Stan Shebs <shebs@andros.cygnus.com> - - * symfile.c (find_sym_fns): Add PowerMac to xcoff file recognition - kludge. - -Fri Dec 22 11:05:59 1995 Michael Meissner <meissner@tiktok.cygnus.com> - - * configure.in (gdb_host): Add support for DG/UX running on x86 as - a host. - (all x86 targets and hosts): Add support for pentium-pro machines. - - * configure: Rebuild. - - * config/i386/i386dgux.mh: New file for DG/UX running on x86 host. - -Thu Dec 21 19:09:20 1995 Rob Savoye <rob@chinadoll.cygnus.com> - - * remote-array.c (array_wait): Poll the keyboard along with the - serial port so users can tpye at the target while their - application is running. - -Thu Dec 21 11:58:52 1995 Michael Meissner <meissner@tiktok.cygnus.com> - - * Makefile.in (ppcbug-rom.o, srec.o): Add dependencies. - - * monitor.c (monitor_debug): Take prefix, and suffix arguments. - Print trailing newline after the suffix. - (monitor_printf{,_noecho}): Change monitor_debug calls. - (monitor_printf): Call monitor_expect instead of trying to do the - expect processing locally so that if there is extra junk, it - doesn't hang things up. - (readchar): If MO_HANDLE_NL is set, handle \r\n pairs and convert - them to a single \r. Use monitor_debug to print out byte read. - - * monitor.h (MO_HANDLE_NL): Add new flag. - - * ppcbug-rom.c (ppcbug_ops{1,2}): Split into two ops, one that - uses lo 0 to load, and the other that uses lo 1. Set flag - MO_HANDLE_NL. - (ppcbug_open{0,1}): Clone and split to handle ppcbug_ops{1,2}. - (_initialize_ppcbug_rom): Set up both ppcbug_open{0,1}. - -Wed Dec 20 10:54:41 1995 Fred Fish <fnf@cygnus.com> - - * defs.h: Delete extraneous whitespace at end of file. - * symfile.h: Move #include of demangle.h outside conditional. - * objfiles.h (struct objstats, OBJSTAT, OBJSTATS): New struct and - macros to hold per-objfile statistics for internal - instrumentation. - (struct objfile): Add OBJSTATS member, which is optional. - * buildsym.h (next_symbol_text_func): Now takes objfile argument. - Also update copyright to 1995. - * dbxread.c (dbx_next_symbol_text): Now takes objfile argument. - (dbx_symfile_init, coffstab_build_psymtabs, elfstab_build_psymtabs, - stabsect_build_psymtabs): Accumulate string table size. - (dbx_next_symbol_text, read_dbx_symtab, read_ofile_symtab): - Accumulate number of stabs symbols read. - * dwarfread.c (new_symbol, symthesize_typedef): - Accumulate number of full symbols created. - * gdbtypes.c (alloc_type): Accumulate number of types. - * maint.c (maintenance_print_statistics): New function. - * mdebugread.c (mdebug_next_symbol_text): Now takes objfile - argument. - * minsyms.c (prim_record_minimal_symbol_and_info): Accumulate - number of minimal symbols read. - * os9kread.c (read_os9k_psymtab): next_symbol_text takes objfile - arg. - * partial-stab.h: next_symbol_text takes objfile arg. - * stabsread.c (error_type, STABS_CONTINUE): Now takes objfile arg - and uses it to call next_symbol_text. - * symfile.c (add_psymbol_to_list, add_psymbol_addr_to_list): - Accumulate number of partial symbols created. - * symfile.h (ADD_PSYMBOL_VT_TO_LIST): Accumulate number of partial - symbols created. - * symmisc.c (print_objfile_statistics): Print the per-objfile - internal instrumentation statistics gathered. - * xcoffread.c (xcoff_next_symbol_text): Now takes objfile argument. - -Fri Dec 15 16:15:55 1995 Ian Lance Taylor <ian@cygnus.com> - - * top.c (set_endian_from_file): Use new bfd_big_endian macro. - -Fri Dec 15 12:21:10 1995 Raymond Jou <rjou@mexican.cygnus.com> - - * mpw-make.sed: Add quotes to RIncludes reference. - -Fri Dec 15 13:18:55 1995 Rob Savoye <rob@darkstar.cygnus.com> - - * remote-array.c: Remove bogus setting of baudrate to 4800. Their - hardware has real UARTS now. - -Mon Dec 11 18:19:16 1995 Stan Shebs <shebs@andros.cygnus.com> - - * configure.in (powerpc-*-macos*): New target configuration. - * configure: Update. - * config/powerpc/macos.mh, config/powerpc/macos.mt, - config/powerpc/nm-macos.h, config/powerpc/tm-macos.h, mac-nat.c: - New files, native PowerMac debugging support. - * Makefile.in (mac-nat.o): Add build rule. - * mpw-config.in (enable_cflags): Add support. - (m68k-apple-macos, powerpc-apple-macos): Fix natdepfiles to - list object file instead of source file. - * mpw-make.sed (@ENABLE_CFLAGS@): Don't edit out, replace with - value of variable. - (install, install-only): Edit MPW-specific installation into - place of Unix shell code. - * mac-gdb.r: Fix version resources to use symbolic version strings. - (cfrg): New resource, code fragment for PowerMac. - -Mon Dec 11 14:13:03 1995 Fred Fish <fnf@amigalib.com> - - * dbxread.c (process_one_symbol): When looking at the next - minimal symbol, check for end of the minimal symbol array - (symbol with NULL pointer for name) before dereferencing it. - -Mon Dec 11 15:56:55 1995 Per Bothner <bothner@kalessin.cygnus.com> - - * eval.c (evaluate_struct_tuple): Fix thinko. - -Mon Dec 11 06:52:02 1995 Wilfried Moser <moser@rtl.cygnus.com> - - * ch-typeprint.c (chill_type_print_base): Slightly change of printing - of variant structures. - -Mon Dec 11 00:36:01 1995 Per Bothner <bothner@kalessin.cygnus.com> - - * valops.c (value_cast): Handle casts to and from TYPE_CODE_CHAR. - * ch-exp.c (match_integer_literal): Fix long long support. - * gdbtypes.c (get_discrete_bounds): Make TYPE_LENGTH (type) == - sizeof (LONGEST) case work OK. - -Fri Dec 8 21:02:24 1995 Fred Fish <fnf@cygnus.com> - - * coffread.c, dbxread.c, dstread.c, objfiles.c, os9kread.c, - symfile.c, symtab.c: Use "obstack.h" rather than <obstack.h>. - -Wed Dec 6 16:16:18 1995 Stu Grossman (grossman@cirdan.cygnus.com) - - * remote-mips.c (mips_receive_header): Allow mips_syn_garbage to be - user-settable (via set syn-garbage-limit). Setting it to -1 makes - it unlimited. - -Tue Dec 5 18:33:43 1995 Brendan Kehoe <brendan@lisa.cygnus.com> - - * gdbtypes.c (check_stub_method): Make sure we get back a function - string in the demangled name before we try to use it. - -Tue Dec 5 18:08:29 1995 Stu Grossman (grossman@cygnus.com) - - * monitor.c (monitor_expect_regexp): Make static, add prototype. - * (monitor_read_memory_single): Call monitor_expect_regexp with - pointer to getmem_resp_delim_pattern, not entire struct. - -Tue Dec 5 15:51:25 1995 Stan Shebs <shebs@andros.cygnus.com> - - * c-lang.h (c_op_print_tab): Don't declare, some compilers - consider illegal if structure not defined, and only used - in c-lang.c anyway. - -Sun Dec 3 12:31:03 1995 Per Bothner <bothner@kalessin.cygnus.com> - - * eval.c (evaluate_subexp_standard case): Fix typo. - -Sun Dec 3 11:59:21 1995 Jeffrey A. Law <law@cygnus.com> - - * ch-exp.c (parse_named_record_element): Avoid aggregrate - initializations for automatic variables. - - * hppa-tdep.c (hppa_alignof): Fix typo in last change. - -Sat Dec 2 19:32:57 1995 Fred Fish <fnf@cygnus.com> - - * symfile.c (global_psymbols, static_psymbols): Remove, unused. - -Sat Dec 2 03:02:21 1995 Peter Schauer (pes@regent.e-technik.tu-muenchen.de) - - * alpha-tdep.c (heuristic_proc_desc): Add heuristic to - determine the return address register, needed for OSF/1-3.2C. - * config/alpha/tm-alpha.h (T7_REGNUM, T9_REGNUM): Define. - -Fri Dec 1 07:23:57 1995 Michael Meissner <meissner@tiktok.cygnus.com> - - * ppcbug-rom.c (ppcbug_cmds): Turn on MO_GETMEM_READ_SINGLE - because PPCbug displays the memory as characters as well as hex. - Fix getmem/setmem commands. - - * srec.c (load_srec): Fix off by one typo in last submission. - - * rs6000-tdep.c (push_arguments): Fix typo. - -Thu Nov 30 23:54:17 1995 Per Bothner <bothner@kalessin.cygnus.com> - - * language.c (lang_bool_type), language.h: New function. - * language.h (LA_BOOL_TYPE): New macro. - * eval.c (evaluate_subexp_standard) Use LA_BOOL_TYPE instead - of builtin_type_int where appropriate, - * valarith.c (value_subscript): Likewise. - - * valops.c (value_slice): Implement (value) bitstring slices. - * valprint.c (val_print): If TYPE_LENGTH is zero, don't automatically - print "<incomplete type>" - Chill has zero-length (string) types. - - * gdbtypes.c (check_stub_type): Removed; no longes needed. - * ch-exp.c (expect, parse_call): Tweak error messages. - -Wed Nov 29 13:35:18 1995 Per Bothner <bothner@kalessin.cygnus.com> - - * scm-valprint.c (scm_isymnames): Remove "#@" prefix. - (scm_scmval_print): Do not print "#@" prefix. - - * gdbtypes.h (enum type_code): Added TYPE_CODE_TYPEDEF. - (check_typedef): New prototype. - (CHECK_TYPEDEF): New macro. - (TYPE_DUMMY_RANGE): Removed. - * gdbtypes.c (get_discrete_bounds): Fix paren error; make more robust. - (create_array_type): Don't force_to_range_type; users of the - array are responsible for handling non-range index types. - (create_set_type): Likewise. - (force_to_range_type): Removed. - (check_typedef): New function handles stub types and typedefs. - (check_stub_type): Just call check_typedef. (To be removed.) - (recursive_dump_type): Handle TYPE_CODE_TYPEDEF. - * ch-lang.c (type_lower_upper): Use get_discrete_bounds. - (evaluate_subexp_chill): Handle string repetition. - Re-arrange to handle EVAL_AVOID_SIDE_EFFECTS better. - * ch-typeprint.c (chill_type_print_base): Handle TYPE_CODE_TYPEDEF. - Pass show=0 in recursive calls various places. - (case TYPE_CODE_ARRAY): Don't require index type to have - TYPE_CODE_RANGE. - (case TYPE_CODE_RANGE): Don't need to support TYPE_DUMMY_RANGE. - * gdbtypes.c, ch-lang.c, ch-typeprint.c (numerous places): - Add check_typedef/CHECK_TYPEDEF as needed. - - * ch-exp.y: Replaced by ... - * ch-exp.c: New file. Use recursive-descent. - Recognize labelled array tuples and powerset ranges. - * Makefile.in: Update for no longer using yacc for ch-exp. - - * c-lang.c: Make various functions non-static. - * c-lang.h: Add bunches of prototypes. - * cp-valprint.c (cp_print_value_fields): Also take address. - (cp_print_value): Likewise. Use baselcass_offset. - * stabsread.c (current_symbol): New static variable. - (type_synonym_name): Remove. - (read_type): If copying, make copy be a TYPE_CODE_TYPEDEF. - (read_array_type): Don't need to handle undefined element type here. - (cleanup_undefined_types): Ditto. - (read_range_type): Look for Chill ranges. - * valops.c (value_assign): Fix case lval_internalvar - don't try - to assign into old value (which might be too small!). - (value_coerce_array): No longer need special VALUE_REPEATED handling. - (value_arg_coerce): Cleaner array->pointer decay mechanism. - (search_struct_field): Use baseclass_offset rather than - baseclass_addr. - (value_slice): Use get_discrete_bounds. - * value.h (COERCE_VARYING_ARRAY): Take type argumnt as well. - * values.c (baseclass_offset): Change parameter interface. - (baseclass_addr): Removed. - * c-typeprint.c, c-valprint.c, ch-valprint.c, values.c, valops.c: - Add check_typedef/CHECK_TYPEDEF as needed. - - * alpha-tdep.c, c-exp.y, h8500-tdep.c, f-exp.y, f-valprint.c, - findvar.c, hppa-tdep.c, infcmd.c, language.c, printcmd.c, - rs6000-tdep.c, symmisc.c, symtab.c, mdebugread.c: - Add check_typedef/CHECK_TYPEDEF as needed. - - * f-typeprint.c, valarith.c, valprint.c, typeprint.c, eval.c: - Add check_typedef/CHECK_TYPEDEF as needed. - * f-typeprint.c: Various cleaning up. - * valarith.c (value_subscript): Also subscript bitstrings (for Chill). - * typeprint.c (print_type_scalar): Also support TYPE_CODE_RANGE. - * eval.c (evaluate_subexp_standard case OP_ARRAY): Implement - support for labelled array tuples and ranges in powerset tuples. - (init_array_element): New function. - - * top.c (command_line_input): Only strip out an initial #-comment. - Looking for internal comments is language-specific (breaks Scheme). - - * expression.h (enum exp_opcode): Add BINOP_RANGE. - * expprint.c (dump_expression): Support BINOP_RANGE. - * eval.c (evaluate_subexp_standard): Handle BINOP_RANGE (as error). - (case MULTI_SUBSCRIPT): Fix broken f77 value->int ad hoc conversion. - * ch-lang.c (chill_op_print_tab): Support BINOP_RANGE. - (evaluate_subexp_chill): Error on BINOP_COMMA. - - * Makefile.in: Clean up so doc stuff stays in doc sub-dir. - -Wed Nov 29 16:39:50 1995 Michael Meissner <meissner@tiktok.cygnus.com> - - * monitor.c (monitor_debug): New function to print monitor debug - output in printable fashion. - (monitor_printf{,_noecho}): Call monitor_debug instead of - fputs_unfiltered. - - * srec.c (load_srec): When printing srec debug information, do not - print the carriage return directly, instead print \\r followed by - a newline. - -Tue Nov 28 15:25:28 1995 Doug Evans <dje@canuck.cygnus.com> - - * Makefile.in (target_subdir): Define. - (CC_FOR_TARGET, CXX_FOR_TARGET): Use it to find target libraries. - * configure.in (X_CFLAGS): Fix typo. - (target_subdir): Set to "${target_alias}/" if cross. - * configure: Regenerated. - - * dbxread.c (dbx_symfile_read): Set block_address_function_relative - for `pe' format files. - -Tue Nov 28 11:17:47 1995 Fred Fish <fnf@cygnus.com> - - * magic.h: Renamed to gmagic.h to avoid <magic.h> conflict. - * magic.c: Renamed to gmagic.c in sympathy. - * eval.c, gmagic.c, config/tm-magic.h: - Include "gmagic.h" rather than "magic.h". - -Sat Nov 25 02:56:38 1995 Peter Schauer (pes@regent.e-technik.tu-muenchen.de) - - * mdebugread.c (handle_psymbol_enumerators, parse_symbol): - Recognize enums from alpha cc -migrate. - (upgrade_type): Pass correct fd to parse_symbol when parsing - the index type of an array. - (parse_procedure, parse_lines, psymtab_to_symtab_1): Handle - unsorted procedure descriptors from Irix 5.x and Alpha OSF/1-3.x - shared libraries. Use CORE_ADDR instead of `unsigned long' in - procedure descriptor address computations. - - * symtab.c (decode_line_1): Prevent accidental strchr match - of a null character with the terminating null character of - gdb_completer_quote_characters. - (cplusplus_hint): Make sure that only a single quote is printed - in the hint message. - -Fri Nov 24 16:17:01 1995 Jeffrey A Law (law@cygnus.com) - - * top.c (recurse_read_control_structure): Don't make cleanups - here. Callers handle that correctly. - -Tue Nov 21 15:16:34 1995 Fred Fish <fnf@rtl.cygnus.com> - - * config/m68k/xm-hp300hpux.h: Define MMAP_BASE_ADDRESS and MMAP_INCREMENT. - Also force HAVE_MMAP to be defined since autoconf is currently broken - for detecting a working mmap under hpux. - * config/pa/xm-hppah.h (MMAP_BASE_ADDRESS): Tweak MMAP_BASE_ADDRESS - to a better value suggested by Jeffrey A Law (law@cygnus.com). - -Tue Nov 21 08:48:58 1995 Fred Fish <fnf@cygnus.com> - - * config/pa/xm-hppah.h: Define MMAP_BASE_ADDRESS and MMAP_INCREMENT. - Also force HAVE_MMAP to be defined since autoconf is currently broken - for detecting a working mmap under hpux. - * objfiles.c (map_to_address): Have gdb print a warning when it - is compiled with HAVE_MMAP but without both MMAP_BASE_ADDRESS and - MMAP_INCREMENT defined (thus making it appear mmap doesn't work). - -Mon Nov 20 14:13:53 1995 Stu Grossman (grossman@cygnus.com) - - * infrun.c (wait_for_inferior): Add support for dynamic function - trampolines. These are pieces of code between the caller and the - callee that figure out the address of the callee's code at run - time. Upon entry, we can't figure out the callee's address, so we - set a breakpoint within the trampoline where the address will be - known, and continue the target. Once we hit the breakpoint, we - break at the callee's address and proceed as usual. - -Mon Nov 20 11:12:34 1995 Fred Fish <fnf@cygnus.com> - - * objfiles.c (allocate_objfile): Change warning message about mapped - symbol tables so that it is obvious that they are not supported on - this particular machine rather than implying they are not supported - at all in this version of gdb. - -Sun Nov 19 05:20:53 1995 Peter Schauer (pes@regent.e-technik.tu-muenchen.de) - - * irix5-nat.c, osfsolib.c (solib_address): Return the name of the - containing solib. - * stack.c (print_frame_info): Use minimal symbol only if - fi->pc is in a known section. - -Sat Nov 18 11:19:35 1995 Roland McGrath <roland@churchy.gnu.ai.mit.edu> - - * solib.c (solib_address): Return the name of the containing solib. - * solib.h (PC_SOLIB): New macro; define using solib_address. - * stack.c (print_frame_info) [PC_SOLIB]: If no function name, try - PC_SOLIB on the PC value. - -Sat Nov 18 04:09:31 1995 Peter Schauer (pes@regent.e-technik.tu-muenchen.de) - - * annotate.c (annotate_source, annotate_frame_begin): Issue - `0x' prefix for the pc value, to remain consistent with previous - GDB versions. - - * blockframe.c (find_pc_partial_function), config/pa/tm-hppa.h: - Remove Sun shared library transfer hack and - INHIBIT_SUNSOLIB_TRANSFER_TABLE_HACK, it is obsoleted by the - mst_solib_trampoline minimal symbols. - - * blockframe.c (inside_main_func): Check main_func_*pc against - INVALID_ENTRY_*PC, not zero. - * symfile.c (init_entry_point_info): Initialize ei.*pc with - INVALID_ENTRY_*PC. - * mipsread.c (mipscoff_symfile_read): If the entry_file bounds - are still unknown after processing the partial symbols, then try - to set them from the minimal symbols. - - * infcmd.c (registers_info): Error out if selected_frame is NULL. - * stack.c (return_command): Select new current frame silently if - not interactive. - - * mipsread.c (read_alphacoff_dynamic_symtab): Ignore additional - DT_MIPS_LOCAL_GOTNO and DT_MIPS_GOTSYM entries. - - * irix5-nat.c (solib_create_inferior_hook): Call solib_add only - if auto_solib_add_at_startup is nonzero. - (_initialize_solib): Add "set auto-solib-add" command. - * osfsolib.c (solib_create_inferior_hook): Call solib_add only - if auto_solib_add_at_startup is nonzero. - (_initialize_solib): Add "set auto-solib-add" command. - -Wed Nov 15 17:12:04 1995 Stan Shebs <shebs@andros.cygnus.com> - - * utils.c: Don't include sys/ioctl.h etc if MPW is host. - -Tue Nov 14 17:16:46 1995 Doug Evans <dje@canuck.cygnus.com> - - * config/arm/tm-arm.h (ADDITIONAL_REGISTER_NAMES): Fix r5. - (FRAME_SAVED_PC): Minor clean up. - -Tue Nov 14 14:51:05 1995 Stu Grossman (grossman@cygnus.com) - - * monitor.c (monitor_load_srec monitor_make_srec): Move all - S-record download code into srec.c. - * srec.c srec.h: New files. Contain S-record loading routines - formerly in monitor.c. - * serial.c serial.h: New routine just like fprintf, but uses - serial_t instead of FILE *. - * sh-tdep.c (frame_find_saved_regs init_extra_frame_info): - Don't add four to saved pc (makes things match manual). Also, fix - bug where we didn't get pc from stack frame correctly. - * config/sh/tm-sh.h (SAVED_PC_AFTER_CALL): Don't add four to - saved pc. Real hardware does this for you. - * sh3-rom.c (sh3_load): New routine. Sets up for download then - calls generic S-record loader. - * config/h8300/h8300.mt, config/h8500/h8500.mt, - config/m68k/monitor.mt, config/pa/hppapro.mt, config/sh/sh.mt: - Add srec.o to TDEPFILES. - -Tue Nov 14 15:57:36 1995 Michael Meissner <meissner@tiktok.cygnus.com> - - * ppcbug-rom.c: New file to support the Motorola PPCBUG monitor - for PowerPC's. - - * config/powerpc/ppc{,le}-{eabi,sim}.mt (TDEPFILES): Include - ppcbug-rom.o, monitor.o, and srec.o - - * config/i386/linux.mt (XDEPFILES): Include ser-tcp.o. - -Mon Nov 13 13:12:46 1995 Jeffrey A Law (law@cygnus.com) - - * partial-stab.h: Remove GDB_TARGET_IS_HPPA kludge. - -Fri Nov 10 13:08:54 1995 Jeff Law (law@kahlua.cs.utah.edu) - - * terminal.h (HAVE_SGTTY): Fix typo. - -Thu Nov 9 17:34:01 1995 Michael Meissner <meissner@tiktok.cygnus.com> - - * configure.in (gdb_target): Build in the simulator for all - PowerPC eabi targets, not just eabisim, providing - --enable-sim-powerpc is used, or the host compiler is GCC. - -Thu Nov 9 14:04:05 1995 Raymond Jou (rjou@mexican.cygnus.com) - - * mpw-config.in: Add variable with names of SIOW libraries. - * mpw-make.sed: Add an action to build SIOWgdb. - -Wed Nov 8 19:25:22 1995 Stan Shebs <shebs@andros.cygnus.com> - - * mpw-make.sed: Edit @ENABLE_CFLAGS@ out, mpw-configure can - add back in if necessary. - -Wed Nov 8 15:59:52 1995 James G. Smith <jsmith@pasanda.cygnus.co.uk> - - * config/mips/vr4300.mt: Added simulator to default VR4300 build. - -Tue Nov 7 16:02:25 1995 Stu Grossman (grossman@cygnus.com) - - * remote-mips.c (mips_initialize): Fix brain damage found by - Jamie. Basically had case statement in the wrong place... - * (mips_load): Remove unnecessary `db tty0' command. It's all - handled by mips_initialize now. - -Tue Nov 7 12:59:14 1995 Raymond Jou <rjou@mexican.cygnus.com> - - * mac-gdb.r: Added #ifdef Macgdb. - -Tue Nov 7 14:59:51 1995 James G. Smith <jsmith@pasanda.cygnus.co.uk> - - * remote-mips.c (mips_initialize): Updated to talk to VR4300 RISQ - monitor board. - -Mon Nov 6 11:44:11 1995 James G. Smith <jsmith@pasanda.cygnus.co.uk> - - * config/mips/{tm-vr4300.h tm-vr4300el.h} (TARGET_MONITOR_PROMPT): - Change into real strings. - - * remote-sim.c (gdbsim_open): Moved sim_open() call to after - callback initialisation. - -Sun Nov 5 00:07:52 1995 Jason Molenda (crash@phydeaux.cygnus.com) - - * configure.in (AC_CHECK_HEADERS): add stddef.h. - -Fri Nov 3 12:30:43 1995 Fred Fish <fnf@cygnus.com> - - * Makefile.in (COMMON_OBS): Use corefile.o rather than core.o - * core.c: Rename to corefile.c. - * config/pyr/tm-pyr.h, umax-xdep.c, sun386-nat.c, pyr-xdep.c, - Makefile.in (SFILES), gould-xdep.c, coredep.c, armtdep.c, - arm-xdep.c, altos-xdep.c: Change core.c references to corefile.c. - - From Graham Stoney <greyham@research.canon.oz.au>. - * Makefile.in (remote-array.o): Add rule to build. - (ALLDEPFILES): Add remote-array.c - * remote-array.c (baud_rate): Remove unnecessary declaration. - (baudrate): Remove. - (array_files_info): Print global baud_rate not baudrate. - -Sat Nov 4 10:21:58 1995 Stu Grossman (grossman@cygnus.com) - - * Makefile.in (INTERNAL_CFLAGS): Add ENABLE_CFLAGS. - * fork-child.c (fork_inferior): Add call to - TARGET_CREATE_INFERIOR_HOOK to allow target specific code to get - control just before the new process executes it's first instruction. - * remote-mips.c (mips_initialize): Cleanup a bit. Don't try to - receive a packet at first. This speeds up initialization a lot. - Use TARGET_MONITOR_PROMPT instead of "<IDT>". - (common_breakpoint): Use rresponse instead of rerrflg to inspect - error code. - * symfile.c (syms_from_objfile reread_symbols): Call - TARGET_SYMFILE_POSTREAD to allow target specific code to get - control after reading new symbols. - * target.h: New macros TARGET_SYMFILE_POSTREAD, and - TARGET_CREATE_INFERIOR_HOOK. See above for descriptions. - * config/mips/{irix5.mh nm-irix5.h}: Delete nm-irix5.h. Make - NAT_FILE point directly at ../nm-sysv4.h. - * config/mips/{mipsm3.mh nm-m3.h}: Delete nm-m3.h. Make - NAT_FILE point directly at ../nm-m3.h. - * config/mips/{mipsv4.mh nm-sysv4.h}: Delete nm-sysv4.h. Make - NAT_FILE point directly at ../nm-sysv4.h. - * config/mips/nm-mips.h: Improve comment at top of file. - * config/mips/tm-mips.h (TARGET_MONITOR_PROMPT): Change - definition into a proper string. - -Wed Nov 1 20:18:08 1995 Fred Fish <fnf@cygnus.com> - - * config/i386/tm-i386.h: New file containing generic i*86 target - definitions. - (TARGET_BYTE_ORDER): Moved here from tm-i386v.h. - (IEEE_FLOAT): Moved here from tm-i386v.h. - (START_INFERIOR_TRAPS_EXPECTED): Define default as 2. - (FUNCTION_START_OFFSET): Moved here from tm-i386v.h. - (SKIP_PROLOGUE): Moved here from tm-i386v.h. - (SAVED_PC_AFTER_CALL): Moved here from tm-i386v.h. - (INNER_THAN): Moved here from tm-i386v.h. - (BREAKPOINT): Moved here from tm-i386v.h. - (DECR_PC_AFTER_BREAK): Moved here from tm-i386v.h. - (ABOUT_TO_RETURN): Moved here from tm-i386v.h. - (REGISTER_SIZE): Moved here from tm-i386v.h. - (NUM_REGS): Moved here from tm-i386v.h. - (REGISTER_NAMES): Moved here from tm-i386v.h. - (EXTRACT_STRUCT_VALUE_ADDRESS): Moved here from tm-i386v.h. - (FP_REGNUM): Moved here from tm-i386v.h. - (SP_REGNUM): Moved here from tm-i386v.h. - (PC_REGNUM): Moved here from tm-i386v.h. - (PS_REGNUM): Moved here from tm-i386v.h. - (FP0_REGNUM): Moved here from tm-i386aix.h. - (FPC_REGNUM): Moved here from tm-sun386.h. - (REGISTER_BYTES): Moved here from tm-i386aix.h. - (REGISTER_BYTE): Moved here from tm-i386aix.h. - (REGISTER_RAW_SIZE): Moved here from tm-i386aix.h. - (MAX_REGISTER_RAW_SIZE): Moved here from tm-i386aix.h. - (REGISTER_VIRTUAL_SIZE): Moved here from tm-i386aix.h. - (MAX_REGISTER_VIRTUAL_SIZE): Moved here from tm-i386aix.h. - (EXTRACT_RETURN_VALUE): Moved here from tm-i386aix.h. - (STORE_RETURN_VALUE): Moved here from tm-i386aix.h. - (REGISTER_VIRTUAL_TYPE): Moved here from tm-i386v.h. - (STORE_STRUCT_RETURN): Moved here from tm-i386v.h. - (FRAME_CHAIN): Moved here from tm-i386v4.h. - (FRAMELESS_FUNCTION_INVOCATION): Moved here from tm-i386v4.h. - (FRAME_SAVED_PC): Moved here from tm-i386os9k.h - (FRAME_ARGS_ADDRESS): Moved here from tm-i386v.h. - (FRAME_LOCALS_ADDRESS): Moved here from tm-i386v.h. - (FRAME_NUM_ARGS): Moved here from tm-i386sun.h. - (FRAME_ARGS_SKIP): Moved here from tm-i386v.h. - (FRAME_FIND_SAVED_REGS): Moved here from tm-i386v.h. - (PUSH_DUMMY_FRAME): Moved here from tm-i386v.h. - (POP_FRAME): Moved here from tm-i386v.h. - (CALL_DUMMY, CALL_DUMMY_LENGTH, CALL_DUMMY_START_OFFSET, - CALL_DUMMY_BREAKPOINT_OFFSET, FIX_CALL_DUMMY): Moved here from - tm-i386v.h - (print_387_control_word, print_387_status_word): Declare prototypes. - (struct frame_info, struct frame_saved_regs): Forward decls for - prototypes. - (SP_ARG0): Moved here from tm-i386v.h. - - * config/i386/tm-i386v.h: - (i386/tm-i386.h): Include. - (TARGET_BYTE_ORDER): Remove. - (IEEE_FLOAT): Remove. - (START_INFERIOR_TRAPS_EXPECTED): Undef before redefine to 4. - (FUNCTION_START_OFFSET): Remove. - (SKIP_PROLOGUE): Remove. - (i386_skip_prologue): Remove prototype. - (SAVED_PC_AFTER_CALL): Remove. - (INNER_THAN): Remove. - (BREAKPOINT): Remove. - (DECR_PC_AFTER_BREAK): Remove. - (ABOUT_TO_RETURN): Remove. - (REGISTER_SIZE): Remove. - (NUM_REGS): Undef before redefine to 16 (no FP support). - (REGISTER_NAMES): Undef before redefine. - (FP_REGNUM, SP_REGNUM, PC_REGNUM, PS_REGNUM): Remove. - (REGISTER_BYTES): Undef before redefine. - (REGISTER_BYTE): Undef before redefine. - (REGISTER_RAW_SIZE): Undef before redefine. - (REGISTER_VIRTUAL_SIZE): Undef before redefine. - (MAX_REGISTER_RAW_SIZE): Undef before redefine. - (MAX_REGISTER_VIRTUAL_SIZE): Undef before redefine. - (REGISTER_VIRTUAL_TYPE): Undef before redefine. - (STORE_STRUCT_RETURN): Undef before redefine. - (EXTRACT_RETURN_VALUE): Undef before redefine. - (STORE_RETURN_VALUE): Undef before redefine. - (EXTRACT_STRUCT_VALUE_ADDRESS): Remove. - (FRAME_CHAIN): Undef before redefine. - (FRAMELESS_FUNCTION_INVOCATION): Undef before redefine. - (FRAME_SAVED_PC): Undef before redefine. - (FRAME_ARGS_ADDRESS): Remove. - (FRAME_LOCALS_ADDRESS): Remove. - (FRAME_NUM_ARGS): Undef before redefine. - (FRAME_ARGS_SKIP): Remove. - (FRAME_FIND_SAVED_REGS): Remove. - (PUSH_DUMMY_FRAME): Remove. - (POP_FRAME): Remove. - (CALL_DUMMY): Remove. - (CALL_DUMMY_LENGTH): Remove. - (CALL_DUMMY_START_OFFSET): Remove. - (CALL_DUMMY_BREAKPOINT_OFFSET): Remove - (FIX_CALL_DUMMY): Remove. - (print_387_control_word): Remove. - (print_387_status_word): Remove. - (SP_ARG0): Remove. - - * config/i386/tm-symmetry.h: - (TM_SYMMETRY_H): Enclose file in test for define & define if needed. - (START_INFERIOR_TRAPS_EXPECTED): Move to after inclusion of - tm-i386v4.h or tm-i386v.h, #undef, and #define back to 2. - (DECR_PC_AFTER_BREAK): Move to after inclusion of tm-i386v4.h - or tm-i386v.h, #undef, and #define to 0. - (MAX_REGISTER_RAW_SIZE): Remove. - (FRAME_CHAIN): Remove. - (FRAMELESS_FUNCTION_INVOCATION): Remove. - (FRAME_SAVED_PC): Remove. - (print_387_control_word, print_387_status_word): Remove prototypes. - - * config/i386/tm-ptx.h: - (TM_PTX_H): Enclose file in test for define & define if needed. - (START_INFERIOR_TRAPS_EXPECTED): Move to after inclusion of - tm-i386v4.h or tm-i386v.h, #undef, and #define back to 2. - (DECR_PC_AFTER_BREAK): Move to after inclusion of tm-i386v4.h - or tm-i386v.h, #undef, and #define to 0. - (SDB_REG_TO_REGNUM): Remove obsolete commented out define. - (print_387_control_word, print_387_status_word): Remove prototypes. - - * config/i386/tm-linux.h: - (TM_LINUX_H): Enclose file in test for define & define if needed. - (i386/tm-i386.h): Include instead of tm-i386v.h. - (START_INFERIOR_TRAPS_EXPECTED): Remove. - - * config/i386/tm-i386v4.h: - (TM_I386V4_H): Enclose file in test for define & define if needed. - (i386/tm-i386.h): Include instead of tm-i386v.h. - (START_INFERIOR_TRAPS_EXPECTED): Remove. - (FRAME_CHAIN): Moved to tm-i386.h. - (FRAMELESS_FUNCTION_INVOCATION): Moved to tm-i386.h. - (FRAME_SAVED_PC): Remove. - (sigtramp_saved_pc): Define as i386v4_sigtramp_saved_pc. - (FRAME_NUM_ARGS): Remove. - - * config/i386/tm-i386os9k.h: - (TM_I386OS9K_H): Enclose file in test for define & define if needed. - (i386/tm-i386.h): Include instead of tm-i386v.h. - (START_INFERIOR_TRAPS_EXPECTED): Remove. - (NUM_REGS): Undefine before redefining. - (FRAME_CHAIN): Remove. - (FRAMELESS_FUNCTION_INVOCATION): Remove. - (FRAME_SAVED_PC): Move to tm-i386.h. - - * config/i386/tm-i386nw.h: - (TM_I386NW_H): Enclose file in test for define & define if needed. - (i386/tm-i386.h): Include instead of tm-i386v.h. - (START_INFERIOR_TRAPS_EXPECTED): Remove. - - * config/i386/tm-i386bsd.h: - (TM_I386BSD_H): Enclose file in test for define & define if needed. - (i386/tm-i386.h): Include instead of tm-i386v.h. - (START_INFERIOR_TRAPS_EXPECTED): Remove. - (FRAMELESS_FUNCTION_INVOCATION): Remove. - (FRAME_SAVED_PC): Remove. - - * config/i386/tm-i386aix.h: - (i386/tm-i386.h): Include instead of tm-i386v.h. - (START_INFERIOR_TRAPS_EXPECTED): Remove. - (FP_REGNUM): Remove. - (SP_REGNUM): Remove. - (PC_REGNUM): Remove. - (PS_REGNUM): Remove. - (FP0_REGNUM): Moved to tm-i386.h. - (NUM_REGS): Remove. - (REGISTER_NAMES): Remove. - (REGISTER_BYTES): Moved to tm-i386.h. - (REGISTER_BYTE): Moved to tm-i386.h. - (REGISTER_RAW_SIZE): Moved to tm-i386.h. - (MAX_REGISTER_RAW_SIZE): Moved to tm-i386.h. - (REGISTER_VIRTUAL_SIZE): Moved to tm-i386.h. - (REGISTER_VIRTUAL_TYPE): Removed. - (EXTRACT_RETURN_VALUE): Moved to tm-i386.h. - (STORE_RETURN_VALUE): Moved to tm-i386.h. - - * config/i386/tm-sun386.h: - (TM_SUN386_H): Enclose file in test for define & define if needed. - (i386/tm-i386.h): Include. - (TARGET_BYTE_ORDER): Remove. - (FUNCTION_START_OFFSET): Remove. - (SKIP_PROLOGUE): Remove. - (SAVED_PC_AFTER_CALL): Remove. - (INNER_THAN): Remove. - (BREAKPOINT): Remove. - (DECR_PC_AFTER_BREAK): Remove. - (ABOUT_TO_RETURN): Remove. - (REGISTER_SIZE): Remove. - (NUM_REGS): Undefine before defining. - (REGISTER_NAMES): Undefine before redefining. - (REGISTER_BYTES): Undefine before redefining. - (REGISTER_BYTE): Undefine before defining. - (FP_REGNUM): Undefine before defining. - (PC_REGNUM): Undefine before defining. - (FPC_REGNUM): Undefine before defining. - (REGISTER_RAW_SIZE): Undefine before defining. - (FRAME_CHAIN): Undefine before defining. - (FRAMELESS_FUNCTION_INVOCATION): Undefine before defining. - (FRAME_SAVED_PC): Undefine before defining. - (FRAME_NUM_ARGS): Moved to tm-i386.h. - (MAX_REGISTER_RAW_SIZE): Remove. - (MAX_REGISTER_VIRTUAL_SIZE): Remove. - (STORE_STRUCT_RETURN): Remove. - (EXTRACT_STRUCT_VALUE_ADDRESS): Remove. - (FRAME_ARGS_ADDRESS): Remove. - (FRAME_LOCALS_ADDRESS): Remove. - (FRAME_NUM_ARGS): Undefine before defining. - (FRAME_ARGS_SKIP): Remove. - (FRAME_FIND_SAVED_REGS): Remove. - (PUSH_DUMMY_FRAME): Remove. - (POP_FRAME): Remove. - (CALL_DUMMY, CALL_DUMMY_LENGTH, CALL_DUMMY_START_OFFSET): Remove. - (struct frame_info, struct frame_saved_regs): Remove forward decls - for prototypes. - - * config/i386/tm-i386lynx.h (i386/tm-i386.h): Include instead of - tm-i386v.h. - * config/i386/tm-i386m3.h (i386/tm-i386.h): Include instead of - tm-i386v.h. - - * i386-tdep.c (i386_extract_return_value): Make function visible - for all i386 targets, but only assume floating point values returned - in floating point registers for I386_AIX_TARGET. - - * i386v-nat.c (i386_register_u_addr): Enable code to locate - floating point regs in user struct. - -Wed Nov 1 15:32:57 1995 Fred Fish <fnf@cygnus.com> - - * breakpoint.c (breakpoint_re_set): Fix typo in comment. - * symtab.c (in_prologue): Document func_start and when it is zero - don't call SKIP_PROLOGUE (which typically leads unconditionally to - an error when we try to access a prologue at address 0). - -Tue Oct 31 13:01:15 1995 Fred Fish <fnf@cygnus.com> - - * elfread.c: Include elf-bfd.h rather than libelf.h. - -Tue Oct 31 10:42:42 1995 steve chamberlain <sac@slash.cygnus.com> - - * win32-nat.c (xlate_exception): Treat a stack overflow like a SEGV. - -Sun Oct 29 11:22:05 1995 Fred Fish <fnf@cygnus.com> - - * monitor.c: Include gnu-regex.h rather than system regex.h. - -Sat Oct 28 23:51:48 1995 steve chamberlain <sac@slash.cygnus.com> - - * defs.h: Test on name __WIN32__ rather than WIN32. - * inflow.c (new_tty): Likewise - * terminal.h: Likewise. - * utils.c (initialize_utils): Likewise. - * win32-nat.c (child_create_inferiror): Print error code when failing. - * config/i386/win32.mh (XM_CLIBS): Need -lkernel32. - -Sat Oct 28 04:52:36 1995 Peter Schauer (pes@regent.e-technik.tu-muenchen.de) - - * symtab.h (enum address_class): Add LOC_UNRESOLVED for - a location whose address has to be resolved via the minimal - symbol table. - * buildsym.c (finish_block), findvar.c (symbol_read_needs_frame, - read_var_value), printcmd.c (address_info), - symmisc.c (print_symbol, print_partial_symbol): Handle - LOC_UNRESOLVED. - * stabsread.c (scan_file_globals): Change unresolved LOC_STATIC - symbols to LOC_UNRESOLVED. Remove rt_common_objfile lookup - kludge, global common symbols are now handled by LOC_UNRESOLVED. - (scan_file_globals_1): Move code back to scan_file_globals, - delete. - -Fri Oct 27 09:54:07 1995 Stu Grossman (grossman@cygnus.com) - - * breakpoint.c (breakpoint_re_set): #ifdef GET_LONGJMP_TARGET - around calls to create_longjmp_breakpoint. Why install the - breakpoints if we can't find the longjmp target? - * infrun.c (wait_for_inferior): Cleanup comments near call test. - * remote-mips.c: Fixed a bunch of prototypes to avoid char/int - complaint from picky compilers. Add comment to mips_expect. - Replace all instances of sr_get_debug with remote_debug. - * (mips_readchar): Don't jam init string to monitor. - mips_initialize() handles that. - * (mips_receive_header): Print better message when we get too - much garbage. - * (mips_request): Allow caller to pass in buff to allow them to - analyze the returned message. - * (mips_initialize): Re-do initialization to try sending a BREAK, - a ^C, and then a download escape sequence. Cleanup protocol - startup. Eliminate sleeps. Clear breakpoints (if using monitor - breakpoints). Re-init frame. - * (mips_detach): Close down target. - * (mips_wait): Handle return status with registers, or breakpoint - * stuff. - * (mips_kill): Add ^C handling. - * (mips_insert_breakpoint mips_remove_breakpoint): Call new - breakpoint stuff if enabled. - * (calculate_mask remote_mips_set_watchpoint - remote_mips_remove_watchpoint remote_mips_stopped_by_watchpoint): - Hardware watchpoint/breakpoint stuff. - * (common_breakpoint): Common code for new monitor breakpoint commands. - * (mips_load): Don't use `prompt'. It's a global variable. - * top.c (dont_repeat_command): New command for use in - user-defined commands to suppress auto-repeat (by hittin return key). - * valops.c: Add start of auto function-call abandonment capability. - -Thu Oct 26 22:02:27 1995 Stan Shebs <shebs@andros.cygnus.com> - - * mpw-config.in: Add support for PowerMac host, add beginnings - of native support. - * mpw-make.sed: Disable subdir recursion, edit out useless rule. - * mac-xdep.c (Values.h): Don't include. - (GestaltEqu.h): Include Gestalt.h instead. - (do_mouse_down): Comment out control tracking, needs to be - updated to use UPP before will work on PowerMac. - * config/xm-mpw.h: New file, all-Mac host support. - * config/m68k/xm-mpw.h: Move most definitions into generic Mac - support. - * config/powerpc/xm-mpw.h: New file, PowerMac host support. - -Thu Oct 26 15:21:32 1995 Brendan Kehoe <brendan@lisa.cygnus.com> - - * regex.h: Renamed to gnu-regex.h. - * regex.c: Renamed to gnu-regex.c. - * Makefile.in (POSSLIBS): Refer to gnu-regex.h and gnu-regex.c. - (REGEX, REGEX1): Change to gnu-regex.o instead of regex.o. - (regex.o): Renamed to gnu-regex.o; refer to gnu-regex.c. - (irix5-nat.o, osfsolib.o, gnu-regex.o, solib.o, source.o, symtab.o): - Likewise. - * irix5-nat.c, osfsolib.c, gnu-regex.c, solib.c, source.c, symtab.c): - Include "gnu-regex.h" instead of "regex.h". - * alpha-tdep.c (in_prologue): Rename to alpha_in_prologue, to - avoid conflicts with symtab.h. - -Tue Oct 24 18:30:18 1995 Jason Molenda (crash@phydeaux.cygnus.com) - - * config/pa/hppahpux.mh: Remove hardcoding of X locations. - * Makefile.in: Use X11_CFLAGS, X11_LDFLAGS and X11_LIBS. - * configure.in: Link X statically on Solaris, SunOS and HPUX. - -Tue Oct 24 12:26:14 1995 Stu Grossman (grossman@cygnus.com) - - * monitor.c (monitor_expect_regexp): Same as monitor_expect, but - with the obvious extension. - (monitor_read_memory_single): Use regexp for getmem.resp_delim - because of parsing ambiguities caused by certain monitors. - (monitor_read_memory): Use new regexp stuff to parse - getmem.resp_delim. - * monitor.h (struct memrw_cmd->resp_delim): Document this as a - regexp. - * sh3-rom.c: Finish off table. Use new regexp capability for - getmem commands. - - * infrun.c (wait_for_inferior): Disable questionable code near - the step range test. Replace call detection test with much - simpler (and more efficient) test that doesn't require prologue - examination (as often). - * symtab.c symtab.h (in_prologue): New function that indicates - whether or not we are in a function prologue. This uses the - symbol table, and then falls back to prologue examination if that - fails. It's much more efficient for remote debugging because it - avoids examining memory, which is very slow. This is used in - wait_for_inferior to determine if we've made a function call that - needs to be skipped over (for next/nexti). - * mips-tdep.c (after_prologue): New function, returns the PC - after the prologue. Uses PDRs and the symbol table. - (mips_find_saved_regs): Use in_prologue() to avoid costly - prologue examination if possible. - (mips_skip_prologue): Use after_prologue() if possible to avoid - costly prologue examination. - -Mon Oct 23 16:03:33 1995 James G. Smith <jsmith@pasanda.cygnus.co.uk> - - * configure.in (configdirs): Added support for the VR4300 default - builds (mips64*vr4300*el-*-elf*, mips64*vr4300*-*-elf*). - - * configure: Regenerated. - - * remote-mips.c (mips_load): Updated the prompt spotting code to - make use of the TARGET_MONITOR_PROMPT manifest. - -Sat Oct 21 06:11:49 1995 Peter Schauer (pes@regent.e-technik.tu-muenchen.de) - - * alpha-tdep.c, mips-tdep.c (init_extra_frame_info): - Do not set saved registers from heuristics for a sigtramp frame. - - * dwarfread.c (enum_type): Determine signedness of enum type - from enumerators. - - * mips-tdep.c: Include gdb_string.h, gcc -Wall lint. - - * rs6000-nat.c (xcoff_relocate_core): Fix typo. - - * valops.c (value_repeat): Fix length of memory transfer to - match recent allocate_repeat_value change. - -Thu Oct 19 19:04:35 1995 Per Bothner <bothner@kalessin.cygnus.com> - - * gdbtypes.c (get_discrete_bounds): Fix typo. - -Thu Oct 19 12:15:37 1995 Stan Shebs <shebs@andros.cygnus.com> - - * defs.h (SEEK_SET, SEEK_CUR): Add default definitions. - * dbxread.c, mdebugread.c, os9kread.c (SEEK_SET, SEEK_CUR): - Remove default definitions. - - * Makefile.in (CC-LD): Rename to CC_LD, so MPW xform works. - (MMALLOC_SRC): Define. - (MMALLOC_CFLAGS): Use. - (ser-mac.o): Add rule. - * dwarfread.c, somread.c, ultra3-nat.c, xcoffread.c: Replace L_SET - with SEEK_SET in all calls to bfd_seek. - * scm-tags.h (scm_tags): Remove excess comma. - - * mpw-config.in: Adapt to work with autoconf'ed configury; - build config.h, add empty definitions to mk.tmp. - (powerpc-apple-macos): Make it work. - * mpw-make.sed: New file, sed commands to translate Unix makefile - into MPW syntax. - * mpw-make.in: Remove. - * mac-gdb.r: New file, was macgdb.r, renamed for consistency - with other tools, now includes cfrg resource. - * macgdb.r: Remove. - * config/m68k/xm-mpw.h: Remove most of contents, replace with - include of include/mpw/mpw.h. - -Tue Oct 17 10:38:53 1995 Jeffrey A Law (law@cygnus.com) - - * hppa-tdep.c (frame_chain): Fix more obscure problems caused - by system calls that core dump processes without saving all - the register state. - - * config/pa/hppahpux.mt (XDEPFILES): Remove bogus definition. - * config/pa/hppapro.mt (XDEPFILES): Likewise. - -Tue Oct 17 08:04:26 1995 Fred Fish <fnf@rtl.cygnus.com> - - * NEWS: Fix typo. - -Mon Oct 16 18:24:03 1995 Jim Wilson <wilson@chestnut.cygnus.com> - - * config/sh/tm-sh.h (REGISTER_VIRTUAL_TYPE): Return builtin_type_float - for FP registers. - (REGISTER_NAMES): Add FP register names. Remove ticks, stalls, cycles, - insts, plr, and tlr. - (NUM_REGS, NUM_REALREGS): Increase from 23 to 41. - (FPUL_REGNUM, FP0_REGNUM): New macros. - -Mon Oct 16 11:27:06 1995 Stu Grossman (grossman@cygnus.com) - - * remote-mips.c: Add support for speedy (about 10x faster) - downloads. - - * remote-array.c: Move baud_rate initialization from - _initialize_array to array_open. It was forcing the baud rate of - all targets to be 4800 baud! Seems like I've fixed this before... - * config/mips/idt.mt (TDEPFILES): Remove remote-array.o. This - has *nothing* to do with IDT!!! - - - * Makefile.in sh3-rom.c config/sh/sh.mt config/sh/tm-sh.h: Add - sh3 monitor support. - * monitor.c: Cleanup regexp compilation stuff to make it easier - to use several regexps. - * monitor.h: Get rid of struct rom_cmd_data. It's no longer used. - * config/m68k/tm-monitor.h: Don't redefine NUM_REGS here. It just - causes GDB to crash. - - * sparcl-tdep.c: Cleanup serial error handling. - -Sun Oct 15 16:19:27 1995 Stan Shebs <shebs@andros.cygnus.com> - - * rs6000-tdep.c: Don't include a.out.h, improve some formatting. - -Fri Oct 13 15:27:49 1995 Stu Grossman (grossman@cygnus.com) - - * dcache.c: Change default value of remotecache to off. It just - screws up too many targets. - * sparcl-stub.c: Add prototypes to many forward decls. - * Create private copies of strlen, strcpy, and memcpy to prevent - chaos when user steps into them. - * (trap_low handle_exception): Clean up DSU support code - (hardware breakpoints). Move lots of stuff from asm-land to - C-land (make it much easier to #ifdef if necessary). Also, use - trap 255 to get into break mode instead of doing a DSU register - write, which may trash the register. - * (putpacket): Don't check return value of putDebugChar. It - returns void... - -Fri Oct 13 14:16:17 1995 steve chamberlain <sac@slash.cygnus.com> - - * remote-sim.h: Always include callback.h. - (sim_set_callbacks): New declaration. - -Fri Oct 13 10:57:40 1995 Jeffrey A Law (law@cygnus.com) - - * somsolib.c (som_solib_add): Just give a warning if a file - mentioned in the dld_list can't be found. - * config/pa/tm-hppah.h (FRAME_SAVED_PC_IN_SIGTRAMP): Dig out - the PC from the PC queues rather than %r31. - -Thu Oct 12 13:36:15 1995 Jeffrey A Law (law@cygnus.com) - - * corelow.c (core_open): Don't update the to_sections and - to_sections_end fields in core_ops here. It's too late. - * irix5-nat.c (solib_add): Update the to_sections and - to_sections_end fields in core_ops here if needed. - * osfsolib.c (solib_add): Likewise. - * rs6000-nat.c (xcoff_relocate_core): Likewise. - * solib.c (solib_add): Likewise. - * somsolib.c (solib_add): Likewise. - -Wed Oct 11 17:25:59 1995 Fred Fish <fnf@rtl.cygnus.com> - - * Makefile.in (VERSION): Bump version to 4.15.1 - -Tue Oct 10 15:26:39 1995 Fred Fish <fnf@cygnus.com> - - * Makefile.in (VERSION): Version 4.15 released. - * README: Updated for version 4.15. - * NEWS: Updated for 4.15 release. - -Tue Oct 10 13:18:50 1995 Fred Fish <fnf@cygnus.com> - - * configure.in: Add AC_PROG_YACC - * configure: Regenerate - * Makefile.in (BISON): Remove macro definition. - (YACC): Set from autoconfig. - (FLAGS_TO_PASS): Remove BISON. - (TARGET_FLAGS_TO_PASS): Remove BISON. - -Tue Oct 10 12:25:11 1995 steve chamberlain <sac@slash.cygnus.com> - - * win32-nat.c (child_create_inferior): Pass argv correctly. - * Makefile.in (win32-nat.o): Add dependencies. - -Mon Oct 9 14:36:29 1995 steve chamberlain <sac@slash.cygnus.com> - - * NEWS: Add information about win32 and arm code. - * win32-nat.c: Renamed from win32.c. - * config/i386/win32.mh: Renamed from config/i386/i386win32.mh. - * config/i386/win32.mt: Renamed from config/i386/i386win32.mt. - * config/i386/tm-win32.h: Renamed from config/i386/tm-i386win32.h. - * config/i386/xm-win32.h: Renamed from config/i386/xm-i386win32.h. - * configure.in (i[345]86-*-win32): Updated to cope with filename - changes. - * configure: Regenerated. - -Sun Oct 8 18:01:04 1995 Per Bothner <bothner@kalessin.cygnus.com> - - * ch-exp.y (yylex): Also look for '$' following '$'. - -Sat Oct 7 22:52:42 1995 Michael Meissner <meissner@tiktok.cygnus.com> - - * ch-exp.y (yylex): Fix typo. - -Fri Oct 6 11:56:49 1995 Jim Wilson <wilson@chestnut.cygnus.com> - - * remote-sim.c (gdbsim_open): Put callback initializations here. - (_initalize_remote_sim): Not here. - -Fri Oct 6 17:08:49 1995 Stan Shebs <shebs@andros.cygnus.com> - - * top.c (execute_control_command): Use 0/1 instead of BFD's - true/false. - -Fri Oct 6 14:43:19 1995 Stu Grossman (grossman@cygnus.com) - - * sparcl-stub.c: Include sparclite.h to get access to register - fondling macros. - * (trap_low): Save and restore FP regs if necessary. Also, clean - up save and restore of debug unit regs. - * (hard_trap_info): Add more architecturally defined traps. - * (set_debug_traps): Only set FP disabled trap if FP is disabled. - * (get_in_break_mode): Clean up. Get rid of calls to - set_hw_breakpoint_trap(). Also, use write_asi macro. - * (handle_exception): Clean up `g' and `G' commands. Add `P' - command. - * (hw_breakpoint): Why was this here!? It's gone now... - -Fri Oct 6 11:56:49 1995 Jim Wilson <wilson@chestnut.cygnus.com> - - * callback.c (fdbad): Fix typo in comment. - (os_close, os_isatty, os_lseek, os_read, os_write): Use if - statements rather than || to get correct return value. - (os_write_stdout): Pass missing first argument to os_write. - * remote-sim.c: Include callback.h. - (_initialize_remote_sim): Call sim_set_callbacks and then - initialize the callbacks. - -Thu Oct 5 17:28:09 1995 Per Bothner <bothner@kalessin.cygnus.com> - - * values.c (allocate_repeat_value): Allocate an array type, and - a value of that type; use that instead of setting VALUE_REPEATED. - * value.h (struct value): Remove fields repetitions and repeated. - (VALUE_REPEATED, VALUE_REPETITIONS): Removed, no longer used. - * c-valprint.c, ch-valprint.c, eval.c, printcmd.c, valops.c, - value.h, values.c: Simplify, since now VALUE_REPEATED is never - used. - * valprint.c (value_print_array_elemen): Removed never-used - function. - -Thu Oct 5 15:14:36 1995 Per Bothner <bothner@kalessin.cygnus.com> - - * parse.c (write_dollar_variable): New function. - - * c-exp.y (yylex): Replace code for recognizing '$' - pseudo-variables with a call to write_dollar_variable. - Simplify grammar correspondingly. - * f-exp.y: Likewise. - * m2-exp.y: Likewise. - * ch-exp.y: Likewise. (Remove function match_dollar_tokens.) - * scm-exp.c (scm_lreadr): Call write_dollar_variable to handle '$'. - -Thu Oct 5 13:27:30 1995 steve chamberlain <sac@slash.cygnus.com> - - * win32.c: New file; support for debugging on windows NT. - * configure.in: (i[345]86-*-win32): New target. - * configure: Regnerated. - * eval.c (evaluate_subexp_standard): Remove unused name. - * serial.c (gdb_string.h): Include. - * source.c (value.h): Include. - * config/i386/i386win32.mh (XDEPFILES): Add win32.o - * config/i386/i386win32.mt: New. - * config/i386/tm-i386win32.h: New. - -Wed Oct 4 18:41:34 1995 Per Bothner <bothner@kalessin.cygnus.com> - - * expression.h (enum exp_code): Added OP_NAME. - * expprint.c (print_subexp): Add OP_NAME support. - * parse.c (length_of_subexp, prefixify_subexp): Likewise. - * scm-lang.c (scm_unpack, in_eval_c, scm_lookup_name): new function. - * scm-lang.h: Declare builtin_type_scm; other minor tweaks. - * values.c (unpack_long): If type is SCM, call scm_unpack. - * scm-valprint.c (scm_val_print): Use extract_signed_integer, - instead unpack_long - * scm-lang.c: More Scheme expression parsing from here ... - * scm-exp.c: ... to here. New file. - Also, provide for gdb to evaluate simple constants and names.. - * Makefile.in: Note new scm-exp.{c,o}. - -Wed Oct 4 17:23:03 1995 Per Bothner <bothner@kalessin.cygnus.com> - - * gdbtypes.c (get_discrete_bounds): New function. - (force_to_range_type): Use get_discrete_bounds. - * gdbtypes.h (get_discrete_bounds): Add declaration. - * valarith.c (value_bit_index): Generalize to use get_discrete_bounds. - * ch-valprint.c (chill_val_print): Make (power)sets and bitstring - support use get_discrete_bounds and generally be more robust. - -Tue Oct 3 16:54:56 1995 Stan Shebs <shebs@andros.cygnus.com> - - * remote-nrom.c (nrom_ops): Add value for to_thread_alive, - add comments naming slots. - -Mon Oct 2 21:45:44 1995 Jeff Law (law@hurl) - - * top.c (build_command_line): Demand arguments for if/while - commands. - -Mon Oct 2 13:08:01 1995 Jason Molenda (crash@phydeaux.cygnus.com) - - * Makefile.in (X11_CFLAGS): Set only to @X_INCDIR@. - -Sat Sep 30 16:13:36 1995 Per Bothner <bothner@kalessin.cygnus.com> - - * scm-lang.c: Moved Scheme value printing code to ... - * scm-valprint.c: ... this new file. - Also major improvements in support for printing SCM values. - * scm-lang.h: New file. - * scm-tags.h: New file. - * Makefile.in: Note new scm-valprint.{c,o}. - -Sat Sep 30 09:35:02 1995 Jason Molenda (crash@phydeaux.cygnus.com) - - * configure.in: X_INCDIR and X_LIBDIR added. - * Makefile.in: @X_INCDIR@ and @X_LIBDIR@ added. - * configure: Regnerated. - -Fri Sep 29 02:10:05 1995 steve chamberlain <sac@slash.cygnus.com> - - * config/arm/tm-arm.h (FRAME_CHAIN, FRAME_CHAIN_VALID): - Any pc > LOWESTPC is ok. - - * remote-rdp.c (rdp_init): Take out variable baud rate stuff. - (remote_rdp_detatch): Delete. - * breakpoint.c (ctype.h): Don't include twice. - - * Makefile.in (remote-rdp.o): Doesn't need remote-rdp.h - * callback.c (os_printf_filtered): fix protos. - * defs.h (puts_filtered, puts_unfiltered - [v|f|]printf_[un]filtered): Make format arg const. - * remote-rdp.c (rdp_init): Attept to sync at different - baudrates. - * utils.c (puts_filtered, puts_unfiltered - [v|f|]printf_[un]filtered): Define prototypes with - const in the right place. - -Thu Sep 28 17:43:39 1995 Per Bothner <bothner@kalessin.cygnus.com> - - * defs.h (enum language): Add language_scm. - * expression.h (enum exp_code): Added OP_EXPRSTRING. - * scm-lang.c: Preliminary support for Guile /SCM dialect of Scheme. - * expprint.c (print_subexp): Add OP_EXPRSTRING support. - * parse.c (length_of_subexp, prefixify_subexp): Likewise. - * valops.c (find_function_in_inferior): New function. - (value_allocate_space_in_inferior): New function. - (allocate_space_in_inferior): Redefine using previous function. - * Makefile.in (SFILES): Add scm-lang.c. - (COMMON_OBS): Add scm-lang.o - -Thu Sep 28 14:32:11 1995 steve chamberlain <sac@slash.cygnus.com> - - * callback.[ch]: New files. - * remote-rdp.c: Support for the ARM RDP monitor. - * Makefile: Update. - * arm-tdep.c (arm_othernames): New. - (_initialize_arm_tdep): install 'othernames' command. - (arm_nullified_insn, shifted_reg_val, arm_get_next_pc): New. - * configure.in: Check for termios.h, termio.h and sgtty.h. - (i[345]86-*-win32*): New host. - * configure: Regenerated. - * inflow.c: Clean up inclusions. - * main.c (main): Check for WINGDB, not WIN32. - * printcmd.c (do_examine): Put QUIT test in loop. - * remote-hms.c (e7000_load): Delete. - (hms_ops): Point to generic_load instead. - * remote-hms.c (hms_ops): Point to generic_load. - * remote-sim.c (sim_callback_write_stdout): Becomes - gdbsim_write_stdout. - (gdbsim_load): Call generic_load. - * remote-utils.c (gr_load_image): Delete. - * ser-unix.c (terminal.h): Include instead of havig - own #if tree. - (hardwire_flush_input): Reset input buffer too. - * source.c (openp): If WIN32 then open file in binary mode. - * terminal.h: Configure IO mechanism using autoconf defines if - available and not overriden. - * utils.c (quit, pollquit, notice_quit): WIN32 check becomes - WINGDB check. - - * config/arm/arm.mt (TDEPFILES): Add remote-rdp.o. - * config/arm/tm-arm.h (TARGET_BYTE_ORDER): becomes - TARGET_BYTE_ORDER_SELECTABLE. - (ADDR_BITS_REMOVE): New. - (ORIGINAL_REGISTER_NAMES, ADDITIONAL_REGISTER_NAMES): New. - (INST_xx): New. - (FRAME_FIND_SAVED_REGS): Pass the right argument. - (arm_get_next_pc): Declare. - -Wed Sep 27 10:14:36 1995 Per Bothner <bothner@kalessin.cygnus.com> - - * valops.c (search_struct_field): Also allow "else" as a variant - name. - * eval.c (evaluate_struct_tuple): New function. Used to evaluate - structure tuples. Now also handles Chill variant records. - (get_label): New function, used by evaluate_struct_tuple. - (evaluate_subexp_standard case OP_ARRAY): Use evaluate_struct_tuple. - (evaluate_labeled_field_init): Removed. - - * valops.c (search_struct_field): Generalize to work with Chill - variant records. - -Sat Sep 23 01:22:23 1995 Peter Schauer (pes@regent.e-technik.tu-muenchen.de) - - * mdebugread.c (parse_partial_symbols): Reset includes_used - and dependencies_used after finishing the partial symbol table. - - * rs6000-tdep.c (push_dummy_frame): Handle lr_offset of zero - correctly. - - * rs6000-nat.c (xcoff_relocate_core): Don't relocate data - addresses for the main objfile if DONT_RELOCATE_SYMFILE_OBJFILE - is defined. - * xcoffread.c: gcc -Wall lint. Remove traceback table reading - code. The existing code tried to add parameter information for - functions compiled without -g, which cannot be done properly - for optimized code and produced misleading parameter displays. - (ef_complaint, eb_complaint): Make a local static copy to avoid - dependency on coffread.c. - (read_xcoff_symtab, process_xcoff_symbol, scan_xcoff_symtab): - Enter C_EXT/C_HIDEXT symbols into the minimal symbol table only. - (read_xcoff_symtab): Ignore C_STAT section auxiliary entry - symbols. Complain about unmatched .ef and .eb symbols instead of - segfaulting. - (process_xcoff_symbol): Determine value of C_GSYM symbols via - the global_sym_chain mechanism in stabsread.c. - (xcoff_new_init): Call stabsread_new_init and buildsym_new_init. - (init_string_tab): Initialize length field bytes in the strtbl. - (scan_xcoff_symtab): Skip symbols that start with `$' or `.$'. - Set first_fun_line_offset for symbols with two auxents only. - -Wed Sep 20 21:06:35 1995 Jeff Law (law@snake.cs.utah.edu) - - * op50-rom.c (op50n_cmds): Send ".\r" after the interrupt - character. - -Wed Sep 20 13:12:56 1995 Ian Lance Taylor <ian@cygnus.com> - - * Makefile.in (maintainer-clean): New target, synonym for - realclean. Add GNU standard maintainer-clean echos. - * gdbserver/Makefile.in (maintainer-clean): New target, synonym - for realclean. - * nlm/Makefile.in (maintainer-clean): Likewise. - -Wed Sep 20 08:16:03 1995 steve chamberlain <sac@slash.cygnus.com> - - * defs.h (xmalloc, xrealloc): Delete, they're declared in libiberty.h. - (GETENV_PROVIDED, FCLOSE_PROVIDED): New. - * doc/gdbint.texinfo (GETENV_PROVIDED, FCLOSE_PROVIDED): Document. - * remote-sim.[ch] (sim_callback_write_stdout): New. - -Tue Sep 19 15:28:58 1995 Per Bothner <bothner@kalessin.cygnus.com> - - * gdbtypes.c (create_set_type): Set TYPE_LENGTH in bytes, not bits. - * valops.c (value_bitstring): TYPE_LENGTH is bytes, not bits. - - * gdbtypes.c (force_to_range_type): Calculate upper limit of - TYPE_CODE_CHAR depending on TYPE_LENGTH (instead of just using 255). - -Mon Sep 18 01:43:42 1995 Jeff Law (law@snake.cs.utah.edu) - - * somsolib.c (auto_solib_add_at_startup): Delete definition. No - longer needed. - -Sat Sep 16 13:23:36 1995 Peter Schauer (pes@regent.e-technik.tu-muenchen.de) - - * config/mips/tm-mips.h (UNUSED_REGNUM): Define. - * mipsv4-nat.c (supply_gregset): Fill UNUSED_REGNUM register - with zero. - -Thu Sep 14 17:35:24 1995 Stu Grossman (grossman@cygnus.com) - - * remote-sim.c (gdbsim_create_inferior): Back out change that - broke all simulator configurations except the rs6000. - -Thu Sep 14 14:44:59 1995 Jeffrey A. Law <law@rtl.cygnus.com> - - * monitor.c (monitor_expect): Discard NULL characters. - -Thu Sep 14 14:12:30 1995 Kung Hsu <kung@mexican.cygnus.com> - - * infcmd.c: Add extern declaration for auto_solib_add_at_startup. - -Wed Sep 13 13:33:58 1995 Kung Hsu <kung@mexican.cygnus.com> - - * symfile.c: Move global variable auto_solib_add_at_startup from - solib.c to symfile.c. - * solib.c: ditto. - * symfile.h: Add extern declaration of the above mentioned variable. - * infcmd.c: Take out extern declaration, since it's in symfile.h. - -Thu Sep 14 12:39:35 1995 Stu Grossman (grossman@cygnus.com) - - * coffread.c (coff_symtab_read): Complain about unmatched .ef and - .eb symbols instead of segfaulting. - -Wed Sep 13 13:33:58 1995 Kung Hsu <kung@mexican.cygnus.com> - - * stabsread.c (read_one_struct_field): Use subfile language instead of - global language. Improve efficiency. - -Wed Sep 13 08:45:02 1995 Jeff Law (law@fast.cs.utah.edu) - - * somsolib.c (auto_solib_add_at_startup): Define new global variable. - (som_solib_create_inferior_hook): Don't add libraries if - auto_solib_add_at_startup is zero. - (_initialize_som_solib): Add command to toggle - auto_solib_add_at_startup. - -Tue Sep 12 19:37:24 1995 Jeff Law (law@snake.cs.utah.edu) - - * monitor.c (monitor_make_srec): Fix thinkos in computation - of addr_size. - -Tue Sep 12 15:46:18 1995 Kung Hsu <kung@mexican.cygnus.com> - - * stabsread.c (read_one_struct_field): Add a patch to handle cfront - generated stabs that each field is in full mangled name. - - * stabsread.c: To include language.h and expression.h for the reason - above. - - * infcmd.c (attach_command): Add solibs only when - auto_solib_add_at_startup is set. - -Mon Sep 11 17:22:35 1995 Fred Fish <fnf@cygnus.com> - - * NEWS: Add information about remote target caching. - -Sun Sep 10 15:36:21 1995 Fred Fish <fnf@cygnus.com> - - * defs.h: Only include mmalloc.h if NO_MMALLOC is not - defined. - -Sun Sep 10 10:24:48 1995 Michael Tiemann <tiemann@axon.cygnus.com> - - * tm-ppc-eabi.h (PC_IN_CALL_DUMMY): Redefine this to work with the - simulator. FIXME. - - * rs6000-tdep.c (push_dummy_frame): Calculate the correct link - register offset from the current frame (don't assume it is always 8). - (push_dummy_frame): Add comment about having only 4096 bytes of - stack space in the simulator (by default). - - * remote-sim.c (gdbsim_create_inferior): Call - `add_text_to_loadinfo' so that gdb can find TOC entries when - calling functions in the inferior. - -Sun Sep 10 09:00:28 1995 Peter Schauer (pes@regent.e-technik.tu-muenchen.de) - - * sparc-tdep.c (fill_fpregset): Fix incorrect FP_MAX_REGNUM - substitution. - (supply_fpregset): Use FP_MAX_REGNUM. - -Sat Sep 9 08:21:52 1995 Peter Schauer (pes@regent.e-technik.tu-muenchen.de) - - * stabsread.c (read_enum_type): Exit loop for putting pending - enum symbols into the enum type correctly if we had no pending - symbols on entry to read_enum_type. - -Fri Sep 8 12:57:41 1995 Kung Hsu <kung@mexican.cygnus.com> - - * inferior.h: Add extern declaration of inferior_environ. - * solib.c (solib_map_sections): To get inferior's env instead of - gdb's for LD_LIBRARY_PATH, same for PATH. - - * solib.c (solib_map_sections): Copy full path name into so_list - structure so that symbol_file_add can find it. - -Tue Sep 5 17:47:53 1995 Doug Evans <dje@canuck.cygnus.com> - - * config/sparc/tm-sp64.h (REGISTER_RAW_SIZE): Lower 32 fp regs - have size 4. - (REGISTER_VIRTUAL_SIZE): Likewise. - (REGISTER_VIRTUAL_TYPE): Lower 32 fp regs have type float. - Upper 32 fp regs have type double. - * sparc-tdep.c (NUM_SPARC_FPREGS): Replace with - (FP_REGISTER_BYTES): this, and update all uses. - (FP_MAX_REGNUM): Define if not already. - (get_saved_register): Handle new sparc64 fp regs. - (sparc_frame_find_saved_regs): Likewise. - (sparc_print_register_hook): Only print fp regs < 32 as doubles. - Add code to handle long doubles when gdb does. - (_initialize_sparc_tdep): Use print_insn_sparc64 if sparc64. - -Sat Sep 2 06:41:26 1995 Peter Schauer (pes@regent.e-technik.tu-muenchen.de) - - * configure.in: Explicitly `exit 0' for broken shells. - * configure: Rebuilt. - - * symtab.c (list_symbols): Add missing blank after - `<function, no debug info>' output. - - * valops.c (value_assign): Handle truncation when assigning - to bitfields. Use value_copy to construct the return value - from toval. - * values.c (value_copy): Copy VALUE_FRAME and VALUE_OPTIMIZED_OUT. - -Fri Sep 1 08:25:50 1995 James G. Smith <jsmith@beauty.cygnus.com> - - * configure (mips64*vr4300*-*-elf): Support added. - * remote-mips.c (mips_readchar): Change to allow build-time prompt - string. - * config/mips/tm-mips.h: Added TARGET_MONITOR_PROMPT. - * config/mips/{vr4300.mt, vr4300el.mt, tm-vr4300.h, - tm-vr4300el.h}: Added. - -Thu Aug 31 12:48:04 1995 Jim Wilson <wilson@chestnut.cygnus.com> - - * config/sh/sh.mt (SIM): Add -lm. - -Wed Aug 30 18:10:57 1995 Kung Hsu <kung@mexican.cygnus.com> - - * rmote-nindy.c (non_dle, nidy_resume, nindy_wait): Changes to - conform to GNU coding standards. - - * solib.c (match_main): Modify to follow GNU coding conventions. - -Mon Aug 28 17:07:26 1995 Kung Hsu <kung@lisa.cygnus.com> - - * remote.c (remote_wait): Revert 19 July my change which should be - customer specific. - -Sat Aug 26 00:26:11 1995 Peter Schauer (pes@regent.e-technik.tu-muenchen.de) - - * mdebugread.c (parse_symbol): Handle sh.value of zero for enums. - Determine signedness of enum type from enumerators. - (parse_type): Handle btIndirect types, handle fBitfield for - some non-member types. - (upgrade_type): Use TYPE_FLAG_TARGET_STUB for arrays with - unknown length. - (cross_ref): Handle stIndirect forward reference to btTypedef. - - * stabsread.c (read_enum_type): Determine signedness of enum - type from enumerators. - - * top.c (execute_command): Remove trailing whitespace from - command arguments, except for `set' and `complete' commands. - (validate_comname): Allow underscores in user defined command - names. - - * values.c (modify_field): Change `Value does not fit in %d bits' - error to a warning. Exclude sign extension bits of negative field - values from fit check. - -Fri Aug 25 11:31:29 1995 Michael Meissner <meissner@tiktok.cygnus.com> - - * configure.in (powerpc*-*-eabisim*): Only link in the simulator - if the target is powerpc{,le}-*-eabisim*, since the simulator - needs GCC to build. - * config/powerpc/ppc{,le}-sim.mt: Cloned from ppc{,le}-eabi.mt. - * config/powerpc/ppc{,le}-eabi.mt: Remove simulator support. - * config/powerpc/tm-ppc{,le}-sim.mt: Include tm-ppc{,le}-sim.h. - -Wed Aug 23 16:55:35 1995 Michael Meissner <meissner@tiktok.cygnus.com> - - * config/powerpc/ppc{,le}-eabi.mt (SIM_OBJS, SIM): Link in the - PowerPC simulator. - -Tue Aug 22 02:00:47 1995 Jeff Law (law@snake.cs.utah.edu) - - * tm-hppa.h (EXTRACT_RETURN_VALUE): Fix for FP values. - - * tm-hppa.h (STORE_RETURN_VALUE): Fix to work with -msoft-float - calling conventions too. Use the TYPE of the return value, not - its length to determine if it should also be copied into the - floating point registers. - - * tm-hppa.h (PROLOGUE_FIRSTLINE_OVERLAP): Delete. Causes more - problems than it fixes. - * hppa-tdep.c (skip_prologue): If we exit the main loop without - finding all the register saves, retry again without looking for - the registers we could not find the first time. - -Mon Aug 21 23:39:56 1995 Jeff Law (law@snake.cs.utah.edu) - - * hppa-tdep.c (frame_chain_valid): Handle systems where "$START$" - calls "main" directly. - (skip_prologue): Always assume arguments were saved into the stack - since GCC will do so without setting the magic Args_Saved bit in - the unwind descriptor. - -Mon Aug 21 11:49:17 1995 Kung Hsu <kung@mexican.cygnus.com> - - * remote-udi.c (udi_wait): Mask off high bits of stop reason. - * remote-udi.c (fetch_register): For unfetchable regs, pretend it's - done. Fix a bug. - -Mon Aug 21 00:45:17 1995 Jeff Law (law@snake.cs.utah.edu) - - * Makefile.in (install): Remove "brokensed" hack, unnecessary now - that we're using autoconf. - (uninstall): Likewise. - - -Sat Aug 19 01:19:34 1995 Peter Schauer (pes@regent.e-technik.tu-muenchen.de) - - * gdbtypes.c (recursive_dump_type): Add dont_print_type_obstack - to inhibit infinite recursion when printing aggregate types. - -Fri Aug 18 17:48:55 1995 steve chamberlain <sac@slash.cygnus.com> - - * dcache.c (dcache_write_line): Write dirty lines right. - -Fri Aug 18 06:26:56 1995 Peter Schauer (pes@regent.e-technik.tu-muenchen.de) - - * sparc-tdep.c (isbranch): Fix typo which caused wrong - target addresses for annulled branches. - -Wed Aug 16 21:54:39 1995 Jeff Law (law@snake.cs.utah.edu) - - * config/pa/tm-hppa.h (PROLOGUE_FIRSTLINE_OVERLAP): Define. - -Tue Aug 15 07:51:21 1995 steve chamberlain <sac@slash.cygnus.com> - - * remote.c (remote_write_bytes): Chop up large transfers. - -Mon Aug 14 17:56:36 1995 Stan Shebs <shebs@andros.cygnus.com> - - * gcc.patch: Remove, relevant only to long-ago versions of GCC. - -Mon Aug 14 13:43:01 1995 Kung Hsu <kung@mexican.cygnus.com> - - * config/sparc/tm-sparclite.h: Define FRAME_CHAIN_VALID_ALTERNATE. - * blockframe.c (inside_main_func): If main func addr range not set, - try to set it now. - -Sat Aug 12 15:34:54 1995 Jeffrey A. Law <law@rtl.cygnus.com> - - * config/powerpc/xm-aix.h (FIVE_ARG_PTRACE): Define. - * config/rs6000/xm-rs6000.h (FIVE_ARG_PTRACE): Likewise. - - * configure.in: Recognize aix4 specially as some aspects - of aix4 need different handling than aix3. - * configure: Updated. - * config/powerpc/{aix4.mh,aix4.mt,tm-ppc-aix4.h}: New files - specific to aix4 support on the power pc. - * config/powerpc/tm-ppc-aix.h (DONT_RELOCATE_SYMFILE_OBJFILE): Do - not defined. The aix4 specific target files will do that. - * config/rs6000/{aix4,mh,aix4,mt,tm-rs6000-aix4.h}: New files - specific to aix4 support on the rs6000. - - * config/rs6000/tm-rs6000.h (CONVERT_FROM_FUNC_PTR_ADDR): Don't - do the conversion if the pointer is not a magic aix function - pointer. - * rs6000-tdep.c: Include objfiles.h and symtab.h. - (is_magic_function_pointer): New function. - - * rs6000-tdep.c (skip_prologue): Refine check for frameless - functions. Handle b .+4 emitted by aix4 compilers. Only - allow one load of a minimal toc pointer. Handle aix4 compiler's - code for alloca. - - * rs6000-tdep.c (find_toc_address): Report an error if no toc was - found rather than possibly core dumping. - - * partial-stab.h: Handle extra field generated by the aix4 compiler - for enumerations. - * stabsread.c (read_enum_type): Likewise. - -Sat Aug 12 03:18:04 1995 Peter Schauer (pes@regent.e-technik.tu-muenchen.de) - - * rs6000-tdep.c (extract_return_value): Fix returning of values - whose length is less than the register size for big endian targets. - -Fri Aug 11 13:04:32 1995 Kung Hsu <kung@mexican.cygnus.com> - - * symtab.c (list_symbols): if break command set breakpoint on - matched symbol. - -Wed Aug 9 18:59:05 1995 Fred Fish <fnf@cygnus.com> - - * defs.h (strchr, strrchr, strstr, strtok, strerror): Enclose in - #ifndefs to protect against previous definitions as macros. - -Wed Aug 9 14:51:36 1995 Kung Hsu <kung@mexican.cygnus.com> - - * xcoffread.c (xcoff_symfile_offset): Revert an unwanted change - that got in accidentally with Aug 1 change. - -Sat Aug 5 09:07:28 1995 steve chamberlain <sac@slash.cygnus.com> - - * remote-hms.c (hms_cmds): Get reg term right. - * monitor.c (monitor_fetch_register): If we see - a non-hex digit, just stop reading. - * remote.c (remote_wait): Change way $O is handled. - -Wed Aug 9 11:42:36 1995 Jeffrey A. Law <law@rtl.cygnus.com> - - * configure.in (powerpc-*-aix*): Recognize as a new gdb host - and target. - (powerpc-*-eabi*): Don't set configdirs. - (powerpcle-*-eabi*): Likewise. - * configure: Updated. - * rs6000-nat.c (vmap_ldinfo): Don't relocate data addresses - for the main objfile if DONT_RELOCATE_SYMFILE_OBJFILE is - defined. - * config/powerpc/{aix.mh,aix.mh}: Host and target makefile fragments - for powerpc running aix4. - * config/powerpc/{nm-aix.h, tm-ppc-aix.h, xm-aix.h}: Native, target - and host include files for powerpc running aix4. - -Wed Aug 9 08:11:45 1995 Stan Shebs <shebs@cygnus.com> - - * top.c (target_output_hook): Really make it match defs.h (char * - is not the same as unsigned char *). - -Tue Aug 8 15:13:05 1995 J.T. Conklin <jtc@rtl.cygnus.com> - - * Makefile.in (CXX_FOR_TARGET): Don't use ${rootme}/../gcc/xgcc - unless it is present. - -Tue Aug 8 10:50:15 1995 Jeffrey A. Law <law@rtl.cygnus.com> - - * top.c (target_output_hook): Make declaration match the one - in defs.h. - - * symfile.c (add_psymbol_to_list): Initialize SYMBOL_SECTION. - (add_psymbol_addr_to_list): Likewise. - * symfile.h (ADD_PSYMBOL_VT_TO_LIST): Likewise. - -Mon Aug 7 15:34:29 1995 steve chamberlain <sac@slash.cygnus.com> - - * top.c (target_output_hook): New definition. - * stack.c (gdb_string.h): Include after defs.h - * defs.h (target_output_hook): New declaration. - * source.c (mod_path): Fix Win32 \ handling. - -Sun Aug 6 22:14:25 1995 Jeff Law (law@snake.cs.utah.edu) - - * hppa-tdep.c (frame_saved_pc): Don't try to dig a return pointer - out of a long branch stub. - -Fri Aug 4 13:37:31 1995 Jeffrey A. Law <law@rtl.cygnus.com> - - * xcoffread.c (process_linenos): Fix typo in last change. - -Thu Aug 3 22:01:26 1995 Fred Fish <fnf@rtl.cygnus.com> - - * ch-exp.y (write_lower_upper_value): Add prototype so bison - generated parser will insert prototype before first func usage. - Bison and byacc order the output sections differently. Also - make function static. - -Thu Aug 3 10:45:37 1995 Fred Fish <fnf@cygnus.com> - - * Update all FSF addresses except those in COPYING* files. - -Thu Aug 3 01:38:45 1995 Peter Schauer (pes@regent.e-technik.tu-muenchen.de) - - * config/alpha/tm-alpha.h (EXTRA_FRAME_INFO): Add pc_reg field. - (SKIP_TRAMPOLINE_CODE): Define. - * alpha-tdep.c (alpha_frame_saved_pc): Use pc_reg field from - frame to find the saved pc register. - (alpha_saved_pc_after_call): Skip over shared library trampoline - before trying to find the saved pc register. - (find_proc_desc): Copy PROC_PC_REG from found proc_desc - to heuristic proc_desc. - (init_extra_frame_info): Initialize pc_reg field in frame. - -Wed Aug 2 18:00:36 1995 Stan Shebs <shebs@andros.cygnus.com> - - * configure.in (m68*-est-*): Use monitor target config. - * configure: Update. - * config/m68k/est.mt, config/m68k/tm-est.h: Delete. - * config/m68k/monitor.mt, config/m68k/tm-monitor.h: Fix comments. - -Tue Aug 1 22:52:53 1995 Fred Fish <fnf@cygnus.com> - - * Makefile.in (VERSION): Bump to 4.14.2 - -Tue Aug 1 16:04:36 1995 Kung Hsu <kung@mexican.cygnus.com> - - * xcoffread.c (process_linenos): The value in include file symbol - should point to line number table. Currently this value is not - set correctly by AIX ld. A fix to get around this bug. - -Tue Aug 1 11:44:53 1995 J.T. Conklin <jtc@rtl.cygnus.com> - - * configure.in: Check for working mmap, ansi headers, string.h, - strings.h, and memory.h. - * configure: Regenerated. - - * gdb_stat.h: New file, "portable" <sys/stat.h>. - * gdb_string.h: New file, "portable" <string.h>. - - * altos-xdep.c, arm-tdep.c, arm-xdep.c, convex-tdep.c, - convex-xdep.c, coredep.c, cxux-nat.c, dbxread.c, exec.c, - gould-xdep.c, hppa-tdep.c, i386aix-nat.c, i386b-nat.c, - i386mach-nat.c, i386v-nat.c, infptrace.c, m88k-nat.c, main.c, - mdebugread.c, objfiles.c, os9kread.c, procfs.c, pyr-xdep.c, - rs6000-nat.c, source.c, standalone.c, stuff.c, sun386-nat.c, - symfile.c, symm-nat.c, symm-tdep.c, symtab.c, top.c, ultra3-nat.c, - ultra3-xdep.c, umax-xdep.c, xcoffread.c: Include "gdb_stat.h" - instead of <sys/stat.h>. - - * alpha-tdep.c, breakpoint.c, buildsym.c, c-typeprint.c, - ch-typeprint.c, coffread.c, command.c, core-sol2.c, core-svr4.c, - core.c, corelow.c, cp-valprint.c, dbxread.c, dcache.c, demangle.c, - dpx2-nat.c, dstread.c, dwarfread.c, elfread.c, environ.c, eval.c, - exec.c, f-lang.c, f-typeprint.c, f-valprint.c, findvar.c, - fork-child.c, gdbtypes.c, hpread.c, i386-tdep.c, infcmd.c, - inflow.c, infptrace.c, infrun.c, irix5-nat.c, language.c, - m2-typeprint.c, main.c, mdebugread.c, minsyms.c, mipsread.c, - monitor.c, nlmread.c, objfiles.c, os9kread.c, osfsolib.c, parse.c, - printcmd.c, procfs.c, regex.c, remote-adapt.c, - remote-array.c, remote-bug.c, remote-e7000.c, remote-eb.c, - remote-es.c, remote-hms.c, remote-mm.c, remote-os9k.c, - remote-pa.c, remote-sim.c, remote-st.c, remote-udi.c, - remote-utils.c, remote-vx.c, remote-vx29k.c, remote-vx68.c, - remote-vx960.c, remote-vxmips.c, remote-vxsparc.c, remote.c, - solib.c, somread.c, source.c, stabsread.c, stack.c, symfile.c, - symmisc.c, symtab.c, target.c, top.c, typeprint.c, utils.c, - valarith.c, valops.c, valprint.c, values.c, xcoffread.c: Include - "gdb_string.h" instead of <string.h>. - - * config/xm-sysv4.h, i386/xm-ptx.h, m68k/xm-sun3os4.h, - sparc/xm-sun4os4.h (HAVE_MMAP): Removed. - - * config/xm-lynx.h, config/i386/xm-ptx.h, - config/m68k/nm-apollo68b.h, config/m68k/xm-hp300hpux.h, - config/mips/xm-irix3.h, config/mips/xm-mips.h, - config/mips/xm-news-mips.h, config/mips/xm-riscos.h, - config/pa/hppah.h, config/rs6000/xm-rs6000.h, - config/sparc/xm-sun4os4.h, config/sparc/xm-sun4sol2.h, - config/vax/xm-vaxbsd.h, config/vax/xm-vaxult.h, - config/vax/xm-vaxult2.h (MEM_FNS_DECLARED): Removed. - * config/mips/xm-irix3.h, config/mips/xm-mips.h, - config/pa/xm-hppah.h (memcpy, memset): Removed declarations. - -Tue Aug 1 02:08:30 1995 Peter Schauer (pes@regent.e-technik.tu-muenchen.de) - - * mips-tdep.c (mips_extract_return_value): Fix returning of - values whose length is less than the register size for big endian - targets. - * alpha-tdep.c (alpha_extract_return_value, - alpha_store_return_value): Use alpha_convert_register_to_* - to handle functions returning "float" correctly. - -Mon Jul 31 19:12:48 1995 Stan Shebs <shebs@andros.cygnus.com> - - * h8500-tdep.c: General linting and cleanup. - (opcodes/h8500-opc.h): Don't include. - (code_size, data_size): Make static. - (frame_locals_address, frame_args_address): Remove. - (h8300_pop_frame): Rename to h8500_pop_frame. - (big_command, medium_command, compact_command, small_command): - Define as regular functions rather than with macro trickery. - (tm_print_insn): Set to correct disassembler function. - * config/h8500/tm-h8500.h: Minor cleanup, add prototypes. - (ABOUT_TO_RETURN): #if 0 out. - (FRAME_ARGS_ADDRESS, FRAME_LOCALS_ADDRESS): Use usual define. - (GDB_TARGET_IS_H8500): Remove duplicate definition. - (regoff): Remove, never used. - * config/h8500/h8500.mt (TDEPFILES): Add monitor.o. - -Mon Jul 31 14:32:30 1995 J.T. Conklin <jtc@rtl.cygnus.com> - - * configure.in: Check for unistd.h. - * configure: Regenerated. - - * command.c, cp-valprint.c, fork-child.c, i386-tdep.c, - i386b-nat.c, inflow.c, main.c, maint.c, objfiles.c, solib.c, - source.c, stack.c, symfile.c, top.c, utils.c: Include strings.h - and/or unistd.h to bring prototypes into scope. - -Sun Jul 30 01:40:11 1995 Peter Schauer (pes@regent.e-technik.tu-muenchen.de) - - * rs6000-tdep.c (frame_saved_pc): Check for signal handler caller - before trying to determine the start of the function. - (skip_prologue): Skip subroutine call which might save the - floating point registers only if it is within the first three - instructions. - Reinstate setting of alloca_reg if setup of a gcc frame pointer - is found. - (frame_get_cache_fsr): Use new fields in rs6000_framedata. - -Sat Jul 29 14:43:35 1995 Stan Shebs <shebs@andros.cygnus.com> - - * sparclite: Removed subdirectory. aload and eload are now in - utils/sparclite, low-level library is in libgloss. - * configure.in (sparclite*): Don't configure sparclite subdir. - * configure: Update. - * Makefile.in (TARDIRS): Remove, no longer used. - -Sat Jul 29 01:45:56 1995 Peter Schauer (pes@regent.e-technik.tu-muenchen.de) - - * procfs.c (unconditionally_kill_inferior): Clear current signal - if PROCFS_NEED_CLEAR_CURSIG_FOR_KILL is defined. - * config/alpha/nm-osf3.h (PROCFS_NEED_CLEAR_CURSIG_FOR_KILL): Define. - - * alpha-tdep.c: Move sigtramp handling of saved registers from - read_next_frame_reg to alpha_find_saved_regs, handle saved - floating point registers. - * mips-tdep.c: Move sigtramp handling of saved registers from - read_next_frame_reg to mips_find_saved_regs, handle saved - floating point registers. - * config/mips/tm-irix3.h, config/mips/tm-irix5.h, - config/mips/tm-mipsv4.h (SIGFRAME_FPREGSAVE_OFF): Define. - - * sparc-tdep.c (sparc_pc_adjust): Fix check for `unimp' - instruction to handle functions returning structures with - large sizes properly. - -Fri Jul 28 11:50:17 1995 steve chamberlain <sac@slash.cygnus.com> - - * configure, configure.in (z8k-*-sim): deleted. - -Thu Jul 27 12:49:28 1995 Jeffrey A. Law <law@rtl.cygnus.com> - - * lynx-nat.c (child_wait): Handle threads exiting. - -Thu Jul 27 07:47:50 1995 Michael Meissner <meissner@cygnus.com> - - * rs6000-tdep.c (skip_prologue): Don't assume the update stack - instruction is the last in the prologue, since xlc stores the lr - after the stack update. Make sure offset is correct sign for - large frames. - (frame_saved_pc): Move test for signal before frameless. - - * config/rs6000/tm-rs6000.h (DEFAULT_LR_SAVE): Define. - * config/powerpc/tm-ppc-eabi.h (DEFAULT_LR_SAVE): Redefine. - -Thu Jul 27 01:22:08 1995 Jeffrey A. Law <law@rtl.cygnus.com> - - * hppa-tdep.c (hppa_fix_call_dummy): Rewrite code for calling - into shared libraries. - -Wed Jul 26 23:33:34 1995 Michael Meissner <meissner@cygnus.com> - - * config/rs6000/tm-rs6000.h (rs6000_framedata): Add offsets the - gprs, fprs, lr, and cr is stored at. - (FRAME_FIND_SAVED_REGS): Use new fields in rs6000_framedata. - (function_frame_info): Delete declaration. - (SKIP_PROLOGUE): Skip_prologue is now passed a rs6000_framedata - structure to fill in. - (FRAMELESS_FUNCTION_INVOCATION): Function now longer takes a - second argument. - (FRAME_SAVED_PC): Call frame_saved_pc. - - * rs6000-tdep.c (skip_prologue): Recognize V.4 prologues as well - as AIX style. Fill in rs6000_framedata structure. Remember where - the gprs, fprs, cr, and lr are saved. - (pop_frame): Use skip_prologue, not function_frame_info, and use - new rs6000_framedata fields. - (function_frame_info): Function deleted. - (frameless_function_invocation): Separate frame_saved_pc support - to new function. Recognize V.4 frames. - (frame_saved_pc): New function. - (frame_get_cache_fsr): Use skip_prologue, not function_frame_info. - (frame_initial_stack_address): Ditto. - -Wed Jul 26 01:00:37 1995 Jeff Law (law@snake.cs.utah.edu) - - * remote.c: Add documentation for extended protocol operations - and for thread_alive change from a couple weeks ago. - (extended_remote_ops): Declare and define a new target vector - for the extended remote protocol. - (extended_remote_restart): New function to restart the remote - server & process. - (remote_open): Just a stub routine. - (extended_remote_open): New function to start a remote session - using the extended gdb remote protocol. - (remote_open_1): New function containing code common to both - remote_open and extended_remote_open. - (remote_mourn, extended_remote_mourn, remote_mourn_1): Similarly. - (extended_remote_create_inferior): New function for the extended - remote target. - (initialize_remote): Add the extended_remote_ops target vector. - * gdbserver/server.c (main, case '!'): Set extended_protocol. - (main, case 'k'): If the extended protocol is in use, kill the - inferior then start a new one. - (main, case 'R'): New command to restart the remote server and - inferior process. Only supported when using the extended - protocol. - (main, server loop): If the inferior terminates while using the - extended protocol then start a new one. If getpkt fails when - using the extended protocol then exit. - -Tue Jul 25 11:43:44 1995 Stan Shebs <shebs@andros.cygnus.com> - - * mdebugread.c (psymtab_to_symtab_1): Relocate encoded stab - line numbers using the psymtab's section offsets. - -Tue Jul 25 10:43:27 1995 Michael Meissner <meissner@tiktok.cygnus.com> - - * config/rs6000/tm-rs6000.h (rs6000_framedata): Rename from - aix_framedata. Change all uses. - * rs6000-tdep.c: Change all aix_framedata -> rs6000_framedata. - -Sat Jul 22 23:44:18 1995 Jeff Law (law@snake.cs.utah.edu) - - * defs.h (ATTR_FORMAT): Disable if ANSI_PROTOTYPES is not defined. - -Fri Jul 21 16:50:28 1995 Jeffrey A. Law <law@rtl.cygnus.com> - - * lynx-nat.c (child_thread_alive): New function. Somehow I - forgot to check this in with all the other thread_alive changes. - -Thu Jul 20 22:22:34 1995 Jeff Law (law@snake.cs.utah.edu) - - * somread.c (som_symtab_read): Add unsatisfied common symbols to - the minimal symbol table. All common symbols are "unsatisfied" - when -E is passed to the linker. - -Thu Jul 20 15:04:57 1995 Fred Fish <fnf@cygnus.com> - - * top.c (show_endian): Cast first arg of printf_unfiltered to - correct type of "char *". - -Thu Jul 20 14:18:51 1995 Jeffrey A. Law <law@rtl.cygnus.com> - - * lynx-nat.c (child_wait): A thread_id of zero from wait apparently - means the process is single threaded, so there's no need to add - it to the thread list. Handle case where multi-threaded process - reverts back to a single-threaded process. - - * gdbserver/low-hppabsd.c: Remove error declaration. - * gdbserver/low-sparc.c: Likewise. - * gdbserver/low-sun3.c: Likewise. - * gdbserver/server.h: Remove error and fatal declaration. - * gdbserver/utils.c (error): Update to be compatable with recent - changes in defs.h. - (fatal): Likewise. - -Wed Jul 19 22:42:43 1995 Peter Schauer (pes@regent.e-technik.tu-muenchen.de) - - * config/m68k/tm-m68kv4.h (DWARF_REG_TO_REGNUM): Define to - correctly map floating point registers numbers. - - * dwarfread.c (locval, new_symbol): Handle variables that are - optimized out. - - * mdebugread.c: Replace all uses of builtin_type_* with - mdebug_type_*. Define and initialize mdebug_type_*. - - * serial.h (serial_close): Add additional argument `really_close'. - (SERIAL_CLOSE): Update serial_close call accordingly. - (SERIAL_UN_FDOPEN): Use serial_close to handle refcnt properly. - * serial.c (serial_close): Handle `really_close'. - * serial.h (scb_base): Moved to serial.c, made static. - - * valops.c (value_addr): Don't coerce arrays. - (typecmp): Coerce arrays instead of calling value_addr if necessary. - -Wed Jul 19 18:19:28 1995 Stan Shebs <shebs@andros.cygnus.com> - - From Richard Earnshaw (rearnsha@armltd.co.uk): - * infrun.c (wait_for_inferior): Set the convenience variable - $_exitcode to the termination code of the inferior. - * top.c (quit_command): Accept optional expression to use - as parameter to exit(). - -Wed Jul 19 13:15:32 1995 Kung Hsu <kung@mexican.cygnus.com> - - * remote.c (remote_wait): When getting registers, check endianess and - do conversion if necessary. - -Tue Jul 18 00:41:31 1995 Jeff Law (law@snake.cs.utah.edu) - - * gdbserver/low-hppabsd.c: New file. - * gdbserver/Makefile.in (SFILES): Add low-hppabsd.c. - * config/pa/hppabsd.mh (XDEPFILES): Add ser-tcp.o. - (GDBSERVER_DEPFILES): Add low-hppabsd.o. - * config/pa/hppaosf.mh: Likewise. - -Mon Jul 17 21:35:18 1995 Fred Fish <fnf@cygnus.com> - - * dache.c (struct dcache_block): Change data member from unsigned - char to char, since everything passed in and out of dcache is char - or casted to appropriate type anyway. - (dcache_alloc): Move assignment of db out of test and combine - separate tests into if-else. - (dcache_peek_byte): Change ptr from unsigned char* to char*. - (dcache_peek_byte): Remove now unnecessary cast in read_memory call. - (dcache_peek): Change cast of incoming data arg. - (dcache_poke): Change cast of addr of incoming data arg. - (dcache_info): Mask data passed to printf_filtered to lsbyte only. - (dcache_info): Change printf_filtered arg from "% 2x" to " %2x". - * target.c (debug_to_thread_alive): Change return type to int and - return zero, for type compatibility with other *_thread_alive - funcs. - (cleanup_target): Change cast of ignore function to match type of the - to_thread_alive member. - * defs.h (error_hook): Add ATTR_NORETURN. - * defs.h (NORETURN, ATTR_NORETURN): Switch from volatile to - __attribute__ method with gcc 2.7, to avoid gcc 2.6.3 bug. - * remote.c (remote_wait): Cast first arg to strtol, strchr, and - strncmp to "const char *" from "unsigned char *". - (remote_wait): Cast arg to putpkt and strcpy from "unsigned char *" - to "char *". - (remote_wait): Change printf format for long arg from "%d" to "%ld". - (getpkt): Remove unused variable "bp". - (remote_fetch_word, remote_store_word): Ifdef out apparently unused - functions. - * breakpoint.c (watchpoint_check): Removed unused variables - "saved_level" and "saved_frame". - * valops.c (value_arg_coerce): Add other enum TYPE_CODE_* and - default cases to switch for completeness. - * infrun.c (wait_for_inferior): Enclose "have_waited" label - in #ifdef that matches the one in which it is referenced. - * ser-unix.c (hardwire_noflush_set_tty_state): Enclose otherwise - unused variable "state" in #ifdef that matches one in which it is - referenced. - * eval.c (evaluate_subexp_standard): Remove unused variable "var". - * eval.c (evaluate_subexp_standard): Remove unused variable - "tmp_symbol". - * valarith.c (value_subscript): Remove unused variable - "lowerbound", which is redeclared in a nested scope prior to use. - * printcmd.c (print_frame_nameless_args): Use "%ld" to print long - arg, not "%d". - * {mem-break.c, remote-pa.c, remote.c, saber.suppress}: - Remove unused static var "check_break_insn_size". - * buildsym.c (finish_block): Add other enum LOC_* and default - cases to switch for completeness. - ch-lang.c (type_lower_upper): Removed unused label "retry". - Add other enum TYPE_* and default cases to switch for completeness. - * f-typeprint.c (f_type_print_args): Ifdef out unused function - that may be used someday when Fortran support is complete. - * ch-valprint.c (chill_print_type_scalar): Add other enum - TYPE_* and default cases to switch for completeness. - (chill_val_print): Remove unused local var "high_bound" that - is redeclared in a nested scope prior to use. - (chill_var_print): Use "%ld" to print long arg, not "%d". - * regex.c (re_compile_fastmap, re_match_2): Add remaining enum - types and default to switches for completeness. - * minsyms.c (lookup_minimal_symbol_text): Delete unused variable - "trampoline_symbol". - (prim_record_minimal_symbol_and_info): Return NULL rather than - trash. - * elfread.c (elf_symtab_read): Don't dereference NULL returns from - record_minimal_symbol_and_info. - * f-lang.c (saved_function_list_end): Ifdef out unused variable - that may be used someday. - * f-valprint.c (f_val_print): Remove unused local "straddr". - -Mon Jul 17 13:08:00 1995 Ian Lance Taylor <ian@cygnus.com> - - * stabsread.h (struct stab_section_list): Define. - (coffstab_build_psymtabs): Remove staboff and stabsize parameters. - Add textaddr, textsize, and stabs parameters. - * gdb-stabs.h (struct dbx_symfile_info): Remove text_sect field. - Add text_addr and text_size fields. - (DBX_TEXT_SECT): Don't define. - (DBX_TEXT_ADDR, DBX_TEXT_SIZE): Define. - * coffread.c: Include <ctype.h>. - (struct coff_symfile_info): Remove stabsect and stabindexsect - fields. Add textaddr, textsize, and stabsects fields. - (coff_locate_sections): Record the address of the .text section, - and total the sizes of all sections with names beginning with - ".text". Don't bother to record a .stab.index section (COFF - doesn't use them). Make a linked list of all sections with names - beginning with ".stab". - (coff_symfile_read): Adjust call to coffstab_build_psymtabs for - new parameters. - * dbxread.c (dbx_symfile_read): Use DBX_TEXT_ADDR and - DBX_TEXT_SIZE, rather than getting both from DBX_TEXT_SECT. - (dbx_symfile_init): Set DBX_TEXT_ADDR and DBX_TEXT_SIZE, not - DBX_TEXT_SECT. - (elfstab_build_psymtabs): Likewise. - (stabsect_build_psymtabs): Likewise. - (symbuf_sections, symbuf_left, symbuf_read): New static variables. - (fill_symbuf): If symbuf_sections is not NULL, read symbols from - multiple sections. - (coffstab_build_psymtabs): Remove staboffset and stabsize - parameters. Add textaddr, textsize, and stabsects parameters. - Set DBX_TEXT_ADDR and DBX_TEXT_SIZE, not DBX_TEXT_SECT. Handle - multiple stabs sections. - * os9kread.c (os9k_symfile_read): Use DBX_TEXT_ADDR and - DBX_TEXT_SIZE, rather than getting both from DBX_TEXT_SECT. - (os9k_symfile_init): Set DBX_TEXT_ADDR and DBX_TEXT_SIZE, not - DBX_TEXT_SECT. - - * remote-vx.c (vx_ops, vx_run_ops): Initialize new to_thread_alive - field. - -Sat Jul 15 01:02:53 1995 Peter Schauer (pes@regent.e-technik.tu-muenchen.de) - - * config/alpha/alpha-osf3.mh, config/alpha/nm-osf3.h: New files - for OSF/1-3.x procfs support. - * configure.in (alpha-dec-osf): Use them when configuring - for OSF/1-3.x. - * configure: Updated. - * target.c: Include <string.h>. - -Fri Jul 14 16:16:56 1995 J.T. Conklin <jtc@rtl.cygnus.com> - - * Makefile.in, configure.in: Use one variable, frags, to hold - pathnames of makefile fragments. - * configure: regenerated. - -Fri Jul 14 09:49:47 1995 Jeff Law (law@snake.cs.utah.edu) - - * procfs.c (procfs_ops): Fix typo in last change. - -Thu Jul 13 13:42:38 1995 Jeffrey A. Law <law@rtl.cygnus.com> - - * inftarg.c (child_thread_alive): New function to see if a - particular thread is still running. - (child_ops): Add child_thread_alive entry. - * remote.c (remote_thread_alive): New function to see if a - particular thread is still alive. - (remote_ops): Add remote_thread_alive. - * target.c (dummy_target): Add dummy entry for thread_alive. - (cleanup_target): de_fault thread_alive too. - (update_current_target): INHERIT thread_alive too. - (debug_to_thread_alive): New function. - (setup_target_debug): Add debug_to_thread_alive. - * target.h (struct target_ops): Add to_thread_alive. - (target_thread_alive): Define. - * thread.c (info_threads_command): Don't call kill; use - target_thread_alive instead. - * config/nm-lynx.h (CHILD_THREAD_ALIVE): Define. - * gdbserver/low-lynx.c (mythread_alive): New function. - (mywait): Don't restart any threads after a new thread notification, - let the generic code handle it. - * gdbserver/low-sparc.c (mythread_alive): Dummy version. - * gdbserver/low-sun3.c (mythread_alive): Likewise. - * gdbserver/server.c (main): Handle thread_alive requests. - * gdbserver/server.h (mythread_alive): Declare. - * corelow.c (core_ops): Add dummy entry for thread_alive. - * exec.c (exec_ops): Likewise. - * m3-nat.c (m3_ops): Likewise. - * monitor.c (monitor_ops): Likewise. - * procfs.c (procfs_ops): Likewise. - * remote-array.c (array_ops): Likewise. - * remote-e7000.c (e7000_ops): Likewise. - * remote-es.c (es1800_ops, es1800_child_ops): Likewise. - * remote-mips.c (mips_ops): Likewise. - * remote-pa.c (remote_hppro_ops): Likewise. - * remote-sim.c (gdbsim_ops): Likewise. - * sparcl-tdep.c (sparclite_ops): Likewise. - -Tue Jul 11 11:15:55 1995 Kung Hsu <kung@rtl.cygnus.com> - - * solib.c: Add _DYNAMIC__MGC base symbol for Mentor Graphics Inc. - * solib.c (match_main): New function for checking name of main. - * solib.c (solib_add): Not to add if solib match main. - -Fri Jul 7 14:41:56 1995 Kung Hsu <kung@rtl.cygnus.com> - - * elfread.c (elf_symtab_read): Fix a bug ignoring compiler - generated internal labels ($LM...). - -Wed Jul 5 11:38:36 1995 Kung Hsu <kung@rtl.cygnus.com> - - * defs.h: if __GO32__ or WIN32 the directory separating symbol should - be '\' not '/'. - - * remote-nindy (nindy_wait): Use infinite timeout reading after - esacpe character. - -Tue Jul 4 10:30:22 1995 Jeffrey A. Law <law@rtl.cygnus.com> - - * infrun.c (wait_for_inferior): When switching from one thread to - another, save infrun's state for the old thread and load infrun's - previous state for the new thread. - * thread.c (struct thread_info): Add new fields for thread specific - state saved/restored in infrun.c. - (add_thread): Initialize new fields. - (load_infrun_state): New function. - (save_infrun_state): New function. - * thread.h (load_infrun_state): Provide external decl. - (save_infrun_state): Likewise. - - * infrun.c (wait_for_inferior): When we hit a breakpoint for the - wrong thread, make sure to write the fixed PC value into the thread - that stopped. Restart all threads after single stepping over a - breakpoint for a different thread. - * breakpoint.c (set_momentary_breakpoint): Make momentary - breakpoints thread specific in a multi-threaded program. - * lynx-nat.c (child_resume): Add some comments. Correctly - choose between the single and multi-threaded step and continue - ptrace calls. - -Fri Jun 30 16:15:36 1995 Stan Shebs <shebs@andros.cygnus.com> - - * config/h8300/h8300.mt: Renamed from h8300hms.mt. - * config/h8500/h8500.mt: Renamed from h8500hms.mt. - * config/z8k/z8k.mt: Renamed from z8ksim.mt. - * configure, configure.in: Update to reflect renamings. - - * remote-sim.c (sim): New command, passes commands to simulator. - (simulator_command): New function. - (gdbsim_ops): Clean up. - * remote-sim.h (sim_do_command): Declare. - * sh-tdep.c (memory_size): Remove command. - - * Makefile.in (SIM, SIM_OBS): New variables. - (CLIBS, CDEPS): Add value of SIM. - (DEPFILES): Add value of SIM_OBS - - * config/arm/arm.mt, config/h8300/h8300.mt, config/h8500/h8500.mt, - config/sh/sh.mt, config/sparc/sp64sim.mt, config/w65/w65.mt, - config/z8k/z8k.mt: Remove simulator files from TDEPFILES, - define in SIM_OBS and SIM. - config/sparc/sp64sim.mt (SIMFILES): Remove. - - * remote-z8k.c: Remove, was superseded by remote-sim.c - * Makefile.in, mpw-make.in: Remove references to remote-z8k.c. - -Sun Jun 25 15:30:43 1995 Stan Shebs <shebs@cygnus.com> - - * remote.c (remote_read_bytes, remote_write_bytes): Second arg - should be char *, not unsigned char *. - * dcache.h (memxferfunc): Ditto. - * monitor.c (monitor_write_memory, monitor_read_memory_single): - Ditto. - (monitor_make_srec): Let compiler figure size of hextab. - -Sat Jun 24 19:27:37 1995 Jeffrey A. Law <law@rtl.cygnus.com> - - * lynx-nat.c (child_wait): Don't restart new threads and loop - to the top of child_wait; let the machine independent code in - wait_for_inferior deal with new thread notifications. - -Fri Jun 23 11:51:58 1995 Kung Hsu <kung@mexican.cygnus.com> - - * remote-nindy (nindy_load): Put in target specific load, it's - 20 times faster. - -Thu Jun 22 20:21:59 1995 Stan Shebs <shebs@andros.cygnus.com> - - * utils.c (error): Move local `args' outside conditional, - move local `string1' inside, declare function as void if - non-ANSI compiler, dereference error_hook when calling. - - * mac-xdep.c (stdarg.h): Don't include. - -Thu Jun 22 13:12:33 1995 Kung Hsu <kung@mexican.cygnus.com> - - * remote-nindy.c (nindy_wait): Change timeout in SERIAL_READCHAR. - -Wed Jun 21 13:24:41 1995 Jeff Law (law@snake.cs.utah.edu) - - * hppam3-nat.c: Change HP800_THREAD_STATE to TRACE_FLAVOR and - HP800_THREAD_STATE_COUNT to TRACE_FLAVOR_SIZE. - -Wed Jun 21 05:57:56 1995 Steve Chamberlain <sac@slash.cygnus.com> - - * monitor.c: Turn on caching. - (monitor_printf): If a ^C was sent, don't expect to see its - echo. - (monitor_open): Enable caching. - (monitor_resume, monitor_load): Flush cache. - (monitor_xfer_memory): Call cache routine. - (monitor_dump_regs): New. - (monitor_fetch_registers): If monitor_dump_regs available - then use it. - (monitor_load): Don't ref exec_bfd if it's NULL. - (monitor_load_srec): Use new monitor_make_srec calling convention. - (monitor_make_srec): Rewrite to cope with two, three and four byte - addresses. - * remote-hms.c (hms_cmds): Initialze end-of-command delim. - * dcache.h, dcache.h: Rewritten. - * remote.c: Reenable caching. - (getpkt): Reduce MAX_TRIES to 3. - (remote_xfer_memory): Use dcache_xfer_memory. - * defs.h (error_hook): New. - * top.c (error_hook): New definition. - * utils.c (error): Use error_hook if initialized. - * sparcl-tdep.c (HAVE_SOCKETS): Don't define if GO32 or WIN32. Use - HAVE_SOCKETS in place of #ifndef GO32. - -Tue Jun 20 22:17:44 1995 Jeff Law (law@snake.cs.utah.edu) - - * config/pa/tm-hppa.h (PSW_*): Define processor status word masks. - (INSTRUCTION_NULLIFIED): Allow specific targets to override. - * config/pa/tm-hppao.h (INSTRUCTION_NULLIFIED): Define to work - around losing mach kernel behavior. - -Tue Jun 20 12:03:36 1995 Stan Shebs <shebs@andros.cygnus.com> - - * monitor.c (monitor_wait): Don't use the watchdog timeout - if its value is 0. - * w89k-rom.c (w89k_open): Define to be static. - - -Sat Jun 17 10:17:16 1995 Jeff Law (law@snake.cs.utah.edu) - - * somsolib.c (som_solib_add): Validate regexp argument. - Don't assume the first entry on dld's library list is the main - program. Don't load the same library more than once and don't - consider the main program a shared library. - (som_solib_sharedlibrary_command): New function - (_initialize_som_solib): Add "sharedlibrary" command. - -Thu Jun 15 14:54:58 1995 Stan Shebs <shebs@andros.cygnus.com> - - * array-rom.c: Remove, no longer used. - - * remote-hms.c (hms_open): Make static. - - * mpw-config.in (MacSerial.h): Copy from version in {CIncludes}, - not {MPW}Interfaces:CIncludes. - * ser-mac.c (mac_baud_rate_table): Fix value for 38400 baud. - -Wed Jun 14 14:27:07 1995 Per Bothner <bothner@kalessin.cygnus.com> - - * ch-exp.y: Remove lots of unsupported productions and names. - Add support for IF-expressions, ORIF, ANDIF, NUM, and ADDR. - -Tue Jun 13 21:40:11 1995 Per Bothner <bothner@kalessin.cygnus.com> - - * parser-defs.h (enum precedence): Added PREC_BUILTIN_FUNCTION. - * expression.h (enum exp_opcode): Added UNOP_LOWER, UNOP_UPPER, - UNUP_LENGTH. - * expprint.c (dump_expression): Handle the new exp_opcodes. - (print_subexp): Handle PREC_BUILTIN_FUNCTION. - (print_simple_m2_func): Removed. - (print_subexp): Remove support for Modula2 builtin functions. - * m2-lang.c (m2_op_print_tab): Add support for builtin functions. - * ch-exp.y: Parse LOWER, UPPER, and LENGTH builtins. - (write_lower_upper_value): Convenience function for LOWER and UPPER. - (upper_lower_argument, length_argument): Removed non-terminals. - * ch-lang.c (chill_op_print_tab): Entries for UPPER, LOWER, LENGTH. - (type_lower_upper): New function. Calculate LOWER/UPPER of type. - (value_chill_length): New function. Calcalate LENGTH of ARRAY/STRING. - (evaluate_subexp_chill): Handle UNOP_LOWER, UNOP_UPPER, UNOP_LENGTH. - -Mon Jun 12 12:48:13 1995 Stan Shebs <shebs@andros.cygnus.com> - - Windows support bits from Steve Chamberlain <sac@slash.cygnus.com>. - * defs.h: Don't declare strchr and friends if WIN32. - (DIRNAME_SEPARATOR): Move here from source.c. - (SLASH_P, SLASH_CHAR, SLASH_STRING, ROOTED_P): New macros, - symbolic definitions for filename bits. - * top.c (cd_command): Use these. - * source.c (mod_path, openp): Ditto. - * terminal.h: Disable termio/sgtty definitions if WIN32. - * findvar.c (registers_changed): Call registers_changed_hook - if it is defined. - -Mon Jun 12 12:22:05 1995 J.T. Conklin <jtc@rtl.cygnus.com> - - * Makefile.in (distclean, realclean): Remove config.cache and - config.log. - -Mon Jun 12 00:21:59 1995 Jeff Law (law@snake.cs.utah.edu) - - * somsolib.c: Include gdb-stabs.h. - (som_solib_section_offsets): Use SECT_OFF_XXX rather than 0, 1, - etc. Initialize offsets for RODATA & BSS too. - -Sat Jun 10 17:59:11 1995 Jeff Law (law@snake.cs.utah.edu) - - * hppa-tdep.c (frame_chain): Try to compensate for incomplete - register information in core files when backtracing. - -Fri Jun 9 14:51:38 1995 Stu Grossman (grossman@cygnus.com) - - * remote-nrom.c: Remove everything but download code. More - cleanups. - -Thu Jun 8 15:06:00 1995 Stu Grossman (grossman@cygnus.com) - - * defs.h maint.c monitor.c remote-mips.c remote.c: Add support - for `watchdog' variable. This allows the user to put an upper - limit on the amount of time that GDB will wait for the target to - return from a step or continue operation. This will primarily be - used for the testsuite, where it is difficult to come up with a - reasonable timeout for things like function calls, which can take - as long as three minutes under some circumstances. If the - watchdog timer expires, GDB will generate an error that looks like - `Watchdog has expired.', and will detach from the target. - - * remote-mips.c (mips_open): Setup initial frame from target. - Print it out so that user is told where the program is stopped - when they attach. - - * remote-nrom.c: Loads of cleanups. Use serial code to open - network connections. Use expect() to wait for response to - download command. - - * ser-tcp.c (tcp_open): Retry connection if we get ECONNREFUSED. - - * serial.c serial.h (serial_open serial_fdopen serial_close): - Allow users to open the same device multiple times. They all get - to share the same serial_t. This is about the only way to have - multiple active targets use the same device (for download and - debug). - - * sparcl-tdep.c: Keep #include <unistd.h> away from GO32. - - * target.c: Add `targetdebug' variable. If this is non-zero, - then a special target is put at the top of the target stack which - will cause all calls through the target vector to have their args - and results printed out. - -Wed Jun 7 17:40:37 1995 Per Bothner <bothner@kalessin.cygnus.com> - - * ch-exp.y: Handle <primitive_value> "->" <modename>. - -Wed Jun 7 17:46:33 1995 Michael Meissner <meissner@tiktok.cygnus.com> - - * mem-break.c (LITTLE_BREAKPOINT): If BREAKPOINT and - {LITTLE,BIG}_BREAKPOINT are all defined, don't redefine. - (BIG_BREAKPOINT): Ditto. - - * config/rs6000/tm-rs6000.h (BREAKPOINT): Define as either - BIG_BREAKPOINT or LITTLE_BREAKPOINT depending on the target byte - order. - -Wed Jun 7 12:41:42 1995 Jeff Law (law@snake.cs.utah.edu) - - * somsolib.c (som_solib_section_offsets): Handle relative pathnames. - - * hppa-tdep.c (frame_saved_pc): Handle backtracing through signal - handler in dynamically linked executables. - -Tue Jun 6 10:44:25 1995 Michael Meissner <meissner@tiktok.cygnus.com> - - From Andrew Cagney <cagney@highland.com.au> - * rs6000-tdep.c (single_step): Handle both little and big endian - breakpoints. - (gdb_print_insn_powerpc): Deal with disassembling both little and - big endian PowerPC systems. - (_initialize_rs6000_tdep): Use gdb_print_insn_powerpc to handle - disassembly, rather that assuming big endian order. - - * config/rs6000/tm-rs6000.h (BREAKPOINT): Delete. - (BIG_BREAKPOINT): Define, big endian breakpoint instruction. - (LITTLE_BREAKPOINT): Define, little endian breakpoint instruction. - -Sat Jun 3 01:54:56 1995 Peter Schauer (pes@regent.e-technik.tu-muenchen.de) - - * README: Add note about Unixware 2.x. - - * dbxread.c (process_one_symbol): Check for exact symbol name - match when fixing up N_GSYM and N_STSYM symbols from Sun acc. - - * valprint.c (value_print_array_elements): Use - fprintf_filtered to put out `<repeats %u times>', - from schwab@issan.informatik.uni-dortmund.de (Andreas Schwab). - - * value.h (struct value): Change `repetitions' field from - `short' to `int' type. - -Fri Jun 2 11:17:23 1995 Doug Evans <dje@canuck.cygnus.com> - - * arc-tdep.c (arc_bfd_mach_type): New static global. - (codestream_fill): Handle byte order differences. - (setup_prologue_scan): Don't read stdarg function's "sub sp,sp,N". - (arc_get_frame_setup): Read it here. - (arc_frame_saved_pc): And here. - (arc_print_insn): New function. - (arc_set_cpu_type): Set arc_bfd_mach_type. Don't set tm_print_insn. - (_initialize_arc_tdep): Set tm_print_insn to arc_print_insn. - -Wed May 31 12:04:01 1995 J.T. Conklin <jtc@rtl.cygnus.com> - - * nlm/{configure.in, Makefile.in}: Converted to use autoconf. - * nlm/configure: New file, generated with autoconf 2.3. - - * nlm/configure.in: Use sed instead of awk to get the value of - cpufile. Awk is not a utility required by the GNU coding - standards. This change also fixes the rigid whitespace - requirements that were required for awk. - - * sparclite/aload.c: Use a file descriptor instead of a stdio - stream for i/o with target board. - Use #error if HAVE_TERMIOS is not defined. - - * sparclite/{Makefile.in, configure.in}: Converted to use - autoconf. - * sparclite/configure: New file, generated with autoconf 2.3. - -Sun May 28 23:10:07 1995 Jeff Law (law@snake.cs.utah.edu) - - * defs.h: Include either varargs.h or stdarg.h (for va_list). - Fix stupid thinko in last change ("..." -> "va_list"). - - * defs.h (vprintf_filtered declaration): Add PARAMS prototype; - gcc-2.5 chokes on format attributes for unprototyped functions. - (vfprintf_filtered declaration): Likewise. - (vprintf_unfiltered declaration): Likewise. - (vfprintf_unfiltered). Likewise. - -Sat May 27 23:54:17 1995 J.T. Conklin <jtc@rtl.cygnus.com> - - * configure.in: Use sed instead of awk to get the values of - hostfile, targetfile and nativefile. Awk is not a utility - required by the GNU coding standards. This change also - fixes the rigid whitespace requirements that were required - for awk. - * configure: regenerated. - -Sat May 27 16:24:04 1995 Angela Marie Thomas <angela@cirdan.cygnus.com> - - * sparclite/{Makefile,configure}.in: Add hooks for building with - -lsocket & -lnsl for solaris2. Don't build aload/eload for DOS. - -Thu May 25 12:46:37 1995 Jim Kingdon (kingdon@lioth.cygnus.com) - - * gdbserver/remote-utils.c (prepare_resume_reply): Add FIXME - comment regarding signal numbering. - -Wed May 24 15:49:47 1995 Steve Chamberlain <sac@slash.cygnus.com> - - * arm-tdep.c (_initialize_arm_tdep): Use print_insn_little_arm - now. - - * arm-tdep.c (convert_from_extended, convert_to_extended): - New. - * coffread.c (enter_linenos): Return if linetab 0. - * config/arm/arm.mt (TDEPFILES): Add simulator support. - * config/arm/tm-arm.h (FRAME_FIND_SAVED_REGS): Fix prototypes. - -Mon May 22 19:37:21 1995 Rob Savoye <rob@darkstar.cygnus.com> - - * config/idt.mt: replace monitor and array-rom with the new - remote-array. - -Mon May 22 15:38:25 1995 Stu Grossman (grossman@cygnus.com) - - * remote-nindy.c: Install Kung patch for PR 6820. I have no idea - what this does... - - * breakpoint.c: Move defaults of watchpoint related macros into - target.h. - * target.h: Macros from breakpoint.c. Conditionalize based on - TARGET_HAS_HARDWARE_WATCHPOINTS. - * i386v-nat.c procfs.c: Use TARGET_HAS_HARDWARE_WATCHPOINTS - instead of TARGET_CAN_USE_HARDWARE_WATCHPOINT to enable watchpoint - code. - * config/i386/nm-linux.h, config/mips/nm-irix4.h, - config/pa/nm-hppab.h, config/sparc/tm-sparclite.h: #define - TARGET_HAS_HARDWARE_WATCHPOINTS to enable watchpoint code. - -Mon May 22 06:47:30 1995 Jim Kingdon (kingdon@lioth.cygnus.com) - - * breakpoint.c, target.h: Move defaults of watchpoint related - macros back to breakpoint.c. Required to get GDB compiling - on Solaris again. - -Fri May 19 14:49:37 1995 J.T. Conklin <jtc@rtl.cygnus.com> - - * defs.h (ATTR_FORMAT): New macro, expands to gcc's format - attribute when compiled by gcc. - * defs.h, language.h, monitor.h: Changed many function - declarations to use ATTR_FORMAT. - - * breakpoint.c (delete_command); source.c (directory_command); - top.c (define_command): Changed call to query() that had too - many arguments. - * printcmd.c (address_info): Changed call to printf_filtered() - that had too many arguments. - -Fri May 19 09:52:07 1995 Jim Kingdon (kingdon@lioth.cygnus.com) - - * infrun.c (wait_for_inferior): Move assignments to stop_signal - and stop_pc, and STOPPED_BY_WATCHPOINT code, back where they - were--after the switch statement on w.kind. You can't read the - registers of an inferior which has exited. Use a goto in the - STOPPED_BY_WATCHPOINT code. - * infrun.c (wait_for_inferior): Reinstate - HAVE_STEPPABLE_WATCHPOINT and HAVE_CONTINUABLE_WATCHPOINT code. - -Fri May 19 06:15:40 1995 Jim Kingdon <kingdon@deneb.cygnus.com> - - * utils.c, complaints.c, language.c, monitor.c, remote-array.c, - remote-mips.c, remote-os9k.c, remote-st.c: Conditionalize use of - stdarg rather than varargs on ANSI_PROTOTYPES not __STDC__; it - must match the definition of PARAMS. - -Thu May 18 15:58:46 1995 J.T. Conklin <jtc@rtl.cygnus.com> - - * utils.c (fprintf_filtered, fprintf_unfiltered, fprintfi_filtered, - printf_filtered, printf_unfiltered, printfi_filtered, query, warning, - error, fatal, fatal_dump_core): Use stdarg.h macros when compiling - with an ANSI compiler. - * complaints.c (complain): Likewise. - * language.c (type_error, range_error): Likewise. - * monitor.c (monitor_printf, monitor_printf_noecho): Likewise. - * remote-array.c (printf_monitor, debuglogs): Likewise. - * remote-mips.c (mips_error): Likewise. - * remote-os9k.c (printf_monitor): Likewise. - * remote-st.c (printf_stdebug): Likewise. - - * defs.h, complaints.h, language.h, monitor.h: Add prototypes to - match above changes. - - * printcmd.c: Remove uneeded #include <varargs.h>. - * remote-e7000.c: Likewise. - - * f-typeprint.c (f_type_print_base): Fix typo found by above - changes. - -Wed May 17 11:21:32 1995 Jim Kingdon <kingdon@deneb.cygnus.com> - - * Makefile.in (xcoffread.o): Depend on partial-stab.h. - - * xcoffsolib.c (sharedlibrary_command): New command. - * xcoffsolib.c (solib_info): Call xcoff_relocate_symtab. - * xcoffsolib.c: Miscellaneous cleanups. - - * partial-stab.h: Ignore symbol descriptor '-' (for local - variables with negative type numbers) without complaint. - - * rs6000-nat.c (vmap_ldinfo): Use bfd_stat rather than our own - local emulation thereof. Remove unused variable ostart. - -Wed May 17 15:55:53 1995 J.T. Conklin <jtc@rtl.cygnus.com> - - * Makefile.in (config.status): changed target so that - config.status --recheck is executed if configure script changes. - - * monitor.c (monitor_printf): Changed format specification in - error message to work with pre-ansi compilers. - (monitor_load_srec): reduced length of s-records from 128 to 32 - bytes so download is more reliable with the rom68k monitor. - - * rom68k-rom.c: Added trailing space to prompt string. - - * config/i386/xm-i386sco.h (HAVE_STRSTR): Removed. - * config/i386/xm-go32.h, mswin/xm.h (SYS_SIGLIST_MISSING): - Removed. - * defs.h, config/{xm-lynx.h, xm-nbsd.h}, - config/i386/{xm-i386bsd.h, xm-linux.h}, - config/m68k/xm-hp300bsd.h, config/mips/xm-irix4.h, - config/ns32k/xm-ns32km3.h, doc/gdbint.texinfo - (PSIGNAL_IN_SIGNAL_H): Removed. - -Tue May 16 13:16:06 1995 J.T. Conklin <jtc@rtl.cygnus.com> - - * Makefile.in (Makefile): Added config.status to dependency list. - - * configure.in: Added INIT-CMDS argument to AC_OUTPUT which sets - gdb_host_cpu, gdb_target_cpu and nativefile. - * configure: regenerated. - -Mon May 15 23:50:51 1995 Peter Schauer (pes@regent.e-technik.tu-muenchen.de) - - * mdebugread.c (parse_symbol): Do not relocate stBlock/scText - symbols, their value is the displacement from the procedure address. - * top.c (init_main): Add missing newlines to help strings for - `if' and `while' commands, fix help string for `show commands'. - -Mon May 15 18:37:56 1995 Stu Grossman (grossman@cygnus.com) - - * breakpoint.c: Move defaults of watchpoint related macros into - target.h. Use BP_TEMPFLAG and BP_HARDWAREFLAG instead of - constants. - * infrun.c (wait_for_inferior): Enhance comment near - STOPPED_BY_WATCHPOINT. - * target.h: Macros from breakpoint.c. - -Mon May 15 17:11:38 1995 J.T. Conklin <jtc@rtl.cygnus.com> - - * config/i386/{i386sol2.mh, i386v4.mh, ncr3000.mh}, - config/m68k/m68kv4.mh, config/mips/{irix4.mh, irix5.mh, - mipsv4.mh}, config/sparc/sun4so2.mh (INSTALL): Removed, figured - out by autoconf. - * config/apollo68v.mh (RANLIB): Removed, figured out by autoconf. - - * Makefile.in, configure.in: Converted to use autoconf - * aclocal.m4: New file, local autoconf macro definitions. - * configure: New file, generated with autoconf 2.3. - -Mon May 15 14:46:41 1995 Stan Shebs <shebs@andros.cygnus.com> - - * remote.c (remote_kill): Add prototype. - * cpu32bug-rom.c (cpu32bug_open): Properly define as static. - * config/h8300/h8300hms.mt (TDEPFILES): Add monitor.o. - -Mon May 15 12:12:34 1995 Stu Grossman (grossman@cygnus.com) - - * sparclite/salib.c (win_ovf win_unf): Make window size constant - into a variable (__WINSIZE) so that it can be controlled via the - .h file. - * sparclite/sparclite.h: Add SL933 #ifdef to set __WINSIZE to 6 - for the 933 board. - - * infrun.c: Add #ifdef HP_OS_BUG to all references to - trap_expected_after_continue. - * (wait_for_inferior): Fix for remote watchpoints. Don't try to - insert breakpoints while target is running (this only works on - *some* native targets). This may also speed up native watchpoints - considerably. - -Sat May 13 13:55:04 1995 Jim Kingdon (kingdon@lioth.cygnus.com) - - * dwarfread.c (struct dwfinfo), dbxread.c (struct symloc), - mdebugread.c (struct symloc), hpread.c (struct symloc), - xcoffread.c (struct symloc): Fix inaccurate comment introduced - 20 Apr 1995. - -Sat May 13 13:34:18 1995 Jim Kingdon <kingdon@deneb.cygnus.com> - - * rs6000-tdep.c (find_toc_address): Revise comment. - * symfile.c, symfile.h (init_psymbol_list): New function; - consolidate duplicated copies from os9kread.c, dbxread.c - and dwarfread.c. - * defs.h: Declare info_verbose. - * xcoffread.c: Extensive changes to support psymtabs. - -Fri May 12 13:48:41 1995 Stu Grossman (grossman@andros.cygnus.com) - - * cpu32bug-rom.c remote-est.c rom68k-rom.c: Update line_term element. - -Fri May 12 06:39:30 1995 Jim Kingdon (kingdon@lioth.cygnus.com) - - * partial-stab.h: Expand comments. - -Thu May 11 19:01:37 1995 Jeff Law (law@snake.cs.utah.edu) - - * Support debugging using native MACH primitives on hppa*-*-osf*. - * configure.in: hppa*-*-osf* != hppa*-*-bsd* anymore. - * config/pa/hppaosf.mh: New file. - * config/pa/nm-hppao.h: Likewise. - * hppam3-nat.c: Likewise. - * config/pa/tm-hppao.h (PSW_SS): Define for single-stepping. - (MACHINE_CPROC_*_OFFSET): Define. - (TRACE_*): Define. - (START_INFERIOR_TRAPS_EXPECTED): Delete definition. - -Wed May 10 18:59:26 1995 Stu Grossman (grossman@andros.cygnus.com) - - * hppa-tdep.c (read_unwind_info): Cosmetic cleanup. - * (unwind_command): Clean it up and make it print things out - nicer. - * monitor.c: Add ^C handling capability (mostly ripped off from - remote.c). - * (monitor_printf): Make it check the command echo. - * (monitor_printf_noecho): Similar to above, but doesn't check - for echo. - * (monitor_stop): No longer waits for prompt. That is the job of - the caller. This makes things work much better for monitor_wait, - which waits for the prompt itself. - * (monitor_open): Deal with new monitor_stop semantics. Also, - flush input after sending init strings to get rid of junk that may - be output. Also, don't always send \r to remote. Use - monitor_ops->line_term cuz proper character isn't always \r. - * (monitor_fetch_register): Switch to completely different - algorithm to deal with lame-ass monitors which put spaces in the - middle of numbers, and prompt with a space!!!!! - * (monitor_read_memory_single): New routine to be used with - monitors that can only return one byte/short/long at a time. This - is selected via MO_GETMEM_READ_SINGLE. - * (monitor_load_srec): Use monitor_printf_noecho for sending S - records. Most targets don't echo them. - * (monitor.h): Get rid of cmd_delim. Add line_delim. - * op50n-rom.c (op50n_cmds): Fill it up. Make it work. - * w89k-rom.c: Change all eols from \r to \n. Change load_resp to - ^Q to prevent error message. - * config/pa/tm-hppa.h (CALL_DUMMY (for hppro)): Add special - instruction sequence at end to make restore_pc_queue happy. - -Wed May 10 15:59:00 1995 Torbjorn Granlund <tege@adder.cygnus.com> - - * remote-est.c (est_open): Make static to match prototype. - -Tue May 9 16:58:50 1995 Michael Meissner <meissner@tiktok.cygnus.com> - - * configure.in: Add little endian PowerPC support. - * config/powerpc/ppcle-eabi.mt: New file for little endian PowerPC - support. - * config/powerpc/tm-ppcle-eabi.h: ditto. - -Mon May 8 12:11:38 1995 J.T. Conklin <jtc@rtl.cygnus.com> - - * nlm/configure.in (gdb_host, gdb_host_cpu, gdb_target): Removed. - These variables not used. - - * config/m68k/monitor.mt (TDEPFILES): Added cpu32bug-rom.o. - -Wed May 3 17:54:47 1995 Stan Shebs <shebs@andros.cygnus.com> - - * monitor.c (monitor_command): Don't use PROMPT until monitor - target is known to be open. - (monitor_make_srec): Don't define size of hextab. - -Tue May 2 18:32:24 1995 Stan Shebs <shebs@andros.cygnus.com> - - * configure.in (--enable-netrom): New configuration option. - * Makefile.in (REMOTE_OBS): Rename from REMOTE_O, append - value of NETROM_OBS. - (NETROM_OBS): New variable. - * remote-nrom.c: New file, NetROM target support. - * config/a29k/a29k-udi.mt, config/i960/vxworks960.mt: Use - REMOTE_OBS instead of REMOTE_O. - * config/arc/arc.mt: Ditto. - -Fri Apr 28 23:30:00 1995 Stu Grossman (grossman@cygnus.com) - - * array-rom.c (_initialize_array array_open): Move baud_rate - initialization from _initxxx to array_open to fix bug with - overriding -b command line option. - -Thu Apr 27 20:29:34 1995 Doug Evans <dje@canuck.cygnus.com> - - * Makefile.in (RUNTEST): Fix reference of `srcdir'. - -Wed Apr 26 19:01:08 1995 Steve Chamberlain <sac@slash.cygnus.com> - - * remote-hms.c: Rewrite to use new monitor conventions. - -Tue Apr 25 11:27:14 1995 Jim Kingdon (kingdon@lioth.cygnus.com) - - * dbxread.c: Add comment explaining lowest_text_address. - Add comment regarding stringtab_global and psymtabs. - -Sat Apr 22 01:26:29 1995 Jeff Law (law@snake.cs.utah.edu) - - * config/pa/tm-hppa.h (EXTRACT_STRUCT_VALUE_ADDRESS): Fix. - - * config/pa/tm-hppa.h (EXTRACT_RETURN_VALUE): Rewrite to correctly - handle "short", "int" and small structures returned in registers. - -Fri Apr 21 12:57:53 1995 Kung Hsu <kung@mexican.cygnus.com> - - * minsyms.c: add new function lookup_minimal_symbol_text, to look - for text symbol only. - * breakpoint.c (create_longjmp_breakpoint): call - lookup_minimal_symbol_text instead of lookup_minimal_symbol. - * symtab.h: add lookup_minimal_symbol_text prototype. - -Fri Apr 21 12:03:44 1995 Stan Shebs <shebs@andros.cygnus.com> - - * sh-tdep.c (sh-opc.h): Don't include. - (gdbcore.h): Include. - (frame_find_saved_regs): Remove unused local. - -Thu Apr 20 10:12:21 1995 Jim Kingdon (kingdon@lioth.cygnus.com) - - * dwarfread.c (struct dwfinfo), dbxread.c (struct symloc), - mdebugread.c (struct symloc), hpread.c (struct symloc): Clean - up comments. - -Wed Apr 19 16:58:11 1995 Stu Grossman (grossman@andros.cygnus.com) - - * hppa-tdep.c (deposit_17): New routine to deposit 17 bit - constants into PA instructions. - * Put #ifdefs around all signal handling code. Not generally - needed for embedded boards. - * (hppa_fix_call_dummy): Parameterize offsets into call dummy to - allow different dummys to be used by this code. Use - INSTRUCTION_SIZE instead of REGISTER_SIZE for things. - Conditionalize setup of _sr4export fixup. Improve comments. - * config/pa/tm-hppa.h: Define INSTRUCTION_SIZE. Use a different - call dummy if PA_LEVEL_0 is defined. Better comments for call - dummys. Define offsets for LDIL/LDO instructions which load - function addresses. - * config/pa/tm-pro.h: Get rid of signal handling stuff. Define - PA_LEVEL_0 to disable mucking with space regs and such. - -Mon Apr 17 15:37:08 1995 Stu Grossman (grossman@andros.cygnus.com) - - * cpu32bug-rom.c monitor.h op50-rom.c remote-est.c rom68k-rom.c - w89k-rom.c: Remove loadtypes, loadprotos and baudrates. - * op50-rom.c: Fix copyrights and add load routine to op50n_cmds. - * rom68k-rom.c (_initialize_rom68k): Don't set baud rate. - * w89k-rom.c: Fix copyrights. - -Sun Apr 16 14:00:55 1995 Stu Grossman (grossman@andros.cygnus.com) - - * monitor.c: Move all xmodem stuff into xmodem.[ch]. Remove - unnecessary remoteloadprotocol and remoteloadtype support. - * (expect expect_prompt): Change names to monitor_expect and - monitor_expect_prompt. Make them global. - * (printf_monitor): Change name to monitor_printf. Make global. - * (monitor_read_memory): Flush command echo to avoid parsing - ambiguity with CPU32Bug monitor. - * (monitor_load): Remove remoteloadprotocol and remoteloadtype - support. Call target_ops->load_routine, default to - monitor_load_srec. - * (monitor_load_srec): Remove everything but S-record support. - * monitor.h (monitor_ops): Add load_routine to provide monitor - specific download capability. - * remote-est.c: Clean up copyrights and comments. - * w89k-rom.c: Use new xmodem support. - * xmodem.c xmodem.h: New files to support xmodem downloads. - * rom68k-rom.c remote-est.c: Fix copyrights, add load_routine - entry to monitor_ops. - * cpu32bug-rom.c: New file to support Moto BCC debuggers. - * config/m68k/est.mt (TDEPFILES): Add cpu32bug.o. - * config/pa/hppapro.mt (TDEPFILES): Add xmodem.o. - -Sat Apr 15 18:00:15 1995 Jim Kingdon (kingdon@lioth.cygnus.com) - - * rem-multi.shar: Removed; superceded by gdbserver. - -Fri Apr 14 12:10:24 1995 Jim Kingdon <kingdon@deneb.cygnus.com> - - * xcoffread.c (xcoff_sym_fns): Revise comment about merging this - with coffread.c. - - * breakpoint.c (fixup_breakpoints): Removed. - * rs6000-nat.c (vmap_symtab): Don't call fixup_breakpoints. - (vmap_ldinfo, xcoff_relocate_core): Call breakpoint_re_set. - - * coffread.c (coff_symfile_offsets): Allocate SECT_OFF_MAX - sections, not just SECT_OFF_MAX-1. - - * rs6000-nat.c (vmap_symtab), xcoffread.c: Re-do section offsets - to be indexed by SECT_OFF_* instead of xcoff section numbers. - * objfiles.c, remote.c: Remove comments regarding SECT_OFF_*. - * symtab.h: Revise comment about block_line_section. - * rs6000-nat.c (vmap_symtab): Don't relocate objfile->sections. - -Sat Apr 15 14:15:14 1995 Stan Shebs <shebs@andros.cygnus.com> - - * mpw-make.in (init.c): Don't try to do symbolic {o} in sed - command, not allowed by some version of MPW Make. - * ser-mac.c (mac-setbaudrate): Make it actually set baud rates. - -Sat Apr 15 14:05:09 1995 Jim Kingdon (kingdon@lioth.cygnus.com) - - * alpha-tdep.c (alpha_push_arguments): Fix typo (TYPE_VALUE -> - VALUE_TYPE). Do the cast for TYPE_CODE_BOOL, TYPE_CODE_CHAR, - TYPE_CODE_ENUM, and TYPE_CODE_RANGE as well as TYPE_CODE_INT. - -Sat Apr 15 14:04:32 1995 Per Bothner <bothner@cygnus.com> - - * alpha-tdep.c (alpha_push_arguments): Only cast to long for - TYPE_CODE_INT. - - -Thu Apr 13 16:17:04 1995 Rob Savoye <rob@darkstar.cygnus.com> - - * remote-array.c: New file for Array Tech LSI33k based controller - board. - -Thu Apr 13 12:23:31 1995 Kung Hsu <kung@rtl.cygnus.com> - - * a29k-tdep.c (get_longjmp_target): Replace SWAP_TARGET_AND_HOST with - extract_address. - * remote-vxsparc.c: New file, preliminary check in, this configuration - not supported yet. - * remote-vxmips.c: ditto. - -Thu Apr 13 12:10:14 1995 Michael Meissner <meissner@tiktok.cygnus.com> - - * rs6000-tdep.c (xcoff_add_toc_to_loadinfo): Don't use a prototype - to declare the function. - -Wed Apr 12 16:40:20 1995 Stan Shebs <shebs@andros.cygnus.com> - - * monitor.h (init_monitor_ops): Declare. - * rom68k-rom.c: Clarify some comments. - (rom68k_open): Define as static, to match decl. - -Wed Apr 12 16:36:44 1995 Jim Kingdon (kingdon@lioth.cygnus.com) - - * gdb.gdb: New file. - * .gdbinit: Move list-objfiles to gdb.gdb. - - * values.c (set_internalvar): Set modifiable flag of newval. - -Wed Apr 12 14:34:31 1995 Jim Kingdon <kingdon@deneb.cygnus.com> - - * xcoffread.c: Call complain() rather than error() or printing a - warning. - -Wed Apr 12 08:15:27 1995 Doug Evans <dje@canuck.cygnus.com> - - * arc-tdep.c: #include "gdbcmd.h". - (codestream_seek): Pass CORE_ADDR. - (arc_cpu_type, tmp_arc_cpu_type, arc_cpu_type_table): New globals. - (debug_pipeline_p): Likewise. - (X_...): Instruction field access macros. - (BUILD_INSN): Define. - (codestream_tell): Allow for stream elements > 1 byte. - (codestream_fill): Likewise. - (setup_prologue_scan): New function. - (arc_get_frame_setup): Call it. Update to current spec - regarding prologues. Use BUILD_INSN. - (skip_prologue): New argument `frameless_p'. Use BUILD_INSN. - (arc_frame_saved_pc): New function. - (frame_find_saved_regs): Use BUILD_INSN. - (get_insn_type, single_step): New functions. - (one_stepped): New global. - (arc_set_cpu_type_command, arc_show_cpu_type_command): New functions. - (arc_set_cpu_type): New function. - (_initialize_arc_tdep): Define new `set' commands `cpu', - `displaypipeline', and `debugpipeline'. - * arc/tm-arc.h (TARGET_BYTE_ORDER): Delete. - (TARGET_BYTE_ORDER_SELECTABLE): Define. - (DEFAULT_ARC_CPU_TYPE): Define. - (SKIP_PROLOGUE_FRAMELESS_P): Define. - (BREAKPOINT): Delete. - (BIG_BREAKPOINT, LITTLE_BREAKPOINT): Define. - (DECR_PC_AFTER_BREAK): Change to 8. - (NO_SINGLE_STEP): Define. - (ARC_PC_TO_REAL_ADDRESS): Define. - (SAVED_PC_AFTER_CALL): Use it. - (NUM_REGS, REGISTER_BYTES): Fix. - (FRAME_SAVED_PC): Call arc_frame_saved_pc. - (FRAME_LOCALS_ADDRESS): Fix. - -Tue Apr 11 16:42:37 1995 Jim Kingdon (kingdon@lioth.cygnus.com) - - * top.c, utils.c, defs.h: Remove error_hook. It is currently - unused and would need to hook into error_begin()/return_to_top_level(), - instead of error(), if it were to be used. - -Tue Apr 11 13:46:25 1995 Jim Kingdon <kingdon@deneb.cygnus.com> - - * utils.c, defs.h (warning_begin): Renamed from warning_setup, for - consistency with error_begin. Also print warning_pre_print. - Document it better. - * utils.c (warning): Use it. - * utils.c (error_begin): Doc fix. - * rs6000-nat.c (vmap_ldinfo): If we don't find ldinfo for the - symfile_objfile, nuke it. - -Tue Apr 11 09:35:20 1995 Jim Kingdon (kingdon@lioth.cygnus.com) - - * printcmd.c (print_address_numeric): Pass use_local to - print_longest, rather than always passing 1. - - * nlm/Makefile.in: Remove comments discussing munch. - - -Mon Apr 10 18:31:57 1995 Stan Shebs <shebs@andros.cygnus.com> - - Merge in support for Mac MPW as a host. - (Old change descriptions retained for informational value.) - - * mpw-config.in (i386-unknown-go32): Change from aout. - (sh-hitachi-hms): New target. - * mpw-make.in (BISON): Use byacc instead of bison. - (VERSION): Bump to 4.14.1. - (*-pinsn.*): Remove mentions everywhere. - (all): Don't build MacGDB. - (gdb, SiowGDB): Depend on Version.r. - (Version.r): Generate from version info. - * main.c (main): Pass program name to START_PROGRESS, END_PROGRESS. - (main) [MPW]: Remove debugging hook. - * mac-xdep.c (debug_openp): New flag. - (mac_init): Set flag if env variable defined. - * ser-mac.c (mac_open): Clarify error message. - (mac_readchar): Call PROGRESS while looping. - (mac_write): Call sleep instead of sec_sleep. - (sec_sleep): Remove. - * source.c (openp) [MPW]: Only print debugging info if debugging. - * utils.c (query) [MPW]: Clarify that behavior is a bug. - - * mpw-make.in (init.c): Use open-brace instead of mpw-open-brace. - - * main.c, source.c: Remove hacks that replace long strings - with shorter ones, now solved portably. - - * config/m68k/xm-mpw.h (spin.h): Include. - (ALMOST_STDC): Only define if MPW_C. - * config/m68k/tm-mac.h: New file, Mac target definitions. - - * mpw-config.in (m68k-apple-macos, ppc-apple-macos, - i386-unknown-aout): New targets. - (mk.tmp): Add *DEPFILES definitions. - * mpw-make.in: Remove gC rules, clean up definitions for other - include files, bump version, fix bogus \ that should be \Option-d. - (init.c): Build correctly. - - * mpw-make.in (HFILES_NO_SRCDIR): Add somsolib.h - (ALLDEPFILES): Add somsolib.c. - (somsolib.o): Add some dependencies. - - * mpw-config.in: Use nm-empty.h if host is not target. - (xdepfiles): Add mac-xdep.c.o. - (xm_file): Remove. - * mpw-make.in: Add Fortran files. - (XDEPFILES): Remove. - - * mpw-config.in (MacSerial.h): Duplicate from standard Serial.h. - * ser-mac.c (MacSerial.h): Include instead of Serial.h. - - * mpw-make.in: Use {s} instead of {srcdir} everywhere. - (bindir, libdir): Remove extra colon. - (source.c): Compile with C instead of gC. - (c-exp.tab.c, ch-exp.tab.c, m2-exp.tab.c): Add {o}. - (install-only): Don't install MacGDB. - * source.c (openp) [MPW]: Add a debugging display. - (open_source_file) [MPW]: Use MPW basename finders. - [MPW_C]: Briefer versions of help for line and list commands. - - * mpw-make.in: Change references from paread.c to somread.c - - * mpw-make.in (VERSION): Update to 4.12.3. - (SiowGDB): New target, GDB using SIOW library. - (init-new.c): New target, attempt to generate init.c from sources. - (main.c.o, top.c.o): Put each in its own segment. - * main.c (main) [MPW]: Always call mac_init. - * utils.c (query) [MPW]: Always return "yes" if in MacGDB, output - an extra newline otherwise. - * mac-xdep.c: More comments in various places, remove junk. - (mac_init): Add tests for MPW and SIOW. - (use_wne, has_color_qd): Renamed. - (use_color_qd): New variable. - (grow_window): Only do console resizing to console window, - call resize_console_window. - (zoom_window): Call resize_console_window. - (resize_console_window, scroll_text): New functions. - (adjust_console_sizes): Always align viewrect to even multiples of - text lines. - (adjust_console_text): Always scroll by whole lines. - (hacked_vfprintf, hacked_puts, hacked_fputc, hacked_putc): Force a - recalculation of scroll positions if a newline was output. - (hacked_fflush): Similarly, for flushing. - (hacked_fgetc): New function, aborts if called in MacGDB. - * ser-mac.c (mac_readchar): Rename starttime to start_time, - remove debugging printf. - (mac_write): Sleep on first 4 writes. - (sec_sleep): New function, works like standard sleep. - * macgdb.r: Adjust positioning and contents of About box. - Set minimum size to 2000K, preferred size to 5000K. - * config/m68k/xm-mpw.h (fgetc): Define as a macro. - - * mpw-make.in (.c.o, .gc.o): Prefix segment names with gdb_. - (top.c.o, annotate.c.o): Add build rules. - * macgdb.r (SysTypes.r): Include. - ('vers'): New resource, version info. - (mFile, mEdit, mDebug): Enable all menu items. - (mDebug): Add key equivalents for continue, step, next. - (wConsole): Add zoom and close boxes to window. - * mac-xdep.c (new_console_window): New function, code taken from - mac_init. - (mac_command_loop): Use GetCaretTime for wait interval, call - do_idle on null events. - (do_idle): New function. - (zoom_window): Implement zooming. - (v_scroll_proc): New function, handles vertical scrolling. - (activate_window): Do activation of console window. - (do_menu_command): Implement items of file, edit, and debug menus. - (do_keyboard_command): Fix command extraction. - (adjust_console_sizes, adjust_console_text): New functions. - (hacked_fprintf, hacked_vfprintf, hacked_fputs, hacked_fputc, - hacked_putc): Don't call draw_console. - * ser-mac.c (mac_open): Add an error message for invalid ports. - (first_mac_write): New global. - (mac_write): Use first_mac_write to sleep on first several writes. - - * mpw-make.in (INCLUDE_CFLAGS): Add readline source dir. - (READLINE_CFLAGS, READLINE_SRC, READLINE_DIR): Uncomment. - (TSOBS): Don't compile inflow.c. - (all, install): Add MacGDB. - * main.c (main): Do Mac-specific init and command loop if a - standalone app, skip full option help message if compiling - with MPW C. - (gdb_readline): If MPW, add a newline after the (gdb) prompt. - * utils.c (_initialize_utils): If MPW, don't try to use termcap to - compute the window size. - * config/m68k/xm-mpw.h (printf, fprintf, fputs, fputc, putc, - fflush): Define as macros that expand into hacked_... versions. - (StandAlone, mac_app): Declare. - * macgdb.r (SIZE): Set the default partition to 4000K. - * mac-xdep.c (readline.h, history.h): Include. - (terminal.h): Don't include. - (mac_app): Define. - (gdb_has_a_terminal): Define Mac-specific version. - (do_keyboard_command): Simplify search for command string. - (readline): Define as gdb_readline. - Add other history/readline stubs to make main gdb link. - (hacked_fprintf, hacked_printf, hacked_vfprintf, hacked_fputs, - hacked_fputc, hacked_fflush): New functions, intercept output to - stdout and stderr, send to console window. - - * mpw-make.in (MacGDB): New target, standalone Mac-hosted gdb. - (XDEPFILES): Define. - (main.c.o): Compile with gC instead of C. - * mac-defs.h: New file, menu etc definitions shared between - C and Rez files. - * macgdb.r: New file, Rez (resource compiler) resource - definitions. - * mac-xdep.c: New file, Mac host interface code. - * config/m68k/xm-mpw.h (PATHNAME_SEPARATOR): Rename to - DIRNAME_SEPARATOR. - (PATHNAME_SEPARATOR_STRING): Remove. - (SIGQUIT, SIGHUP): Define. - (fileno, R_OK): Define. - - * mpw-config.in: New file, MPW configuration fragment. - * mpw-make.in: New file, MPW makefile fragment. - * config/m68k/xm-mpw.h: New file, MPW host definitions. - * ser-mac.c: New file, Mac serial interface. - -Mon Apr 10 16:47:57 1995 Kung Hsu <kung@mexican.cygnus.com> - - * valprint.c (print_longest): Fix a syntax error in #ifdef - PRINTF_HAS_LONG_LONG. - - * config/mips/xm-irix5.h: turn on CC_HAS_LONG_LONG and - PRINTF_HAS_LONG_LONG. - * config/mips/tm-irix5.h: turn on FORCE_LONG_LONG. - -Sat Apr 8 02:47:45 1995 Peter Schauer (pes@regent.e-technik.tu-muenchen.de) - - * mdebugread.c (parse_symbol): Use new variable - nodebug_var_symbol_type as type of variables which don't have any - ecoff debug info associated with them. - (parse_symbol, parse_procedure): Use heuristics to determine if - functions were compiled without debugging info and change their - type to nodebug_function_symbol_type. - (_initialize_mdebugread): Initialize nodebug_*_symbol_type. - - * source.c (line_info): Clear sal.pc for `info line' without - arguments. - -Fri Apr 7 17:43:01 1995 Stu Grossman (grossman@andros.cygnus.com) - - * monitor.c: make_xmodem_packet and print_xmodem_packet go away. - send_xmodem_packet shows up to do the obvious. Lots of fixes to - xmodem downloads including resetting of block number at start of - new transfers, fix for buffer overrun problem, addition of CRC - generation code. - * (monitor_open): loadtype_str and loadproto_str now default to - first entry in monitor_ops->loadtypes. - * (monitor_wait): Lengthen register dump buf, because of verbose - Winbond monitor. - * (monitor_fetch_register): Report unimplemented registers as 0. - * (monitor_read_memory): Only do 16 byte aligned transfers - because of formatting weirdness with the Winbond monitor. Also, - ignore non-hex, non-whitespace formatting between bytes (same - monitor). - * (monitor_load): Clean up logic. - * (monitor_load_srec): Re-do xmodem support. Move lots of it - into send_xmodem_packet. - * (getacknak): Get rid of polls and timeouts. Handle CRC - requests from receiver. - * (monitor_make_srec): Efficiency improvements. Don't call - sprintf to output two digit hex numbers. - * (crcinit, docrc): New, CRC-16 support routines. - * (send_xmodem_packet): New routine to generate either CRC-16 or - checksummed xmodem packets. - - * remote-est.c (est_loadtypes), rom68k-rom.c (rom68k_loadtypes): - Reduce tables down to only the load types supported by each - monitor. - - * w89k-rom.c (w89k_supply_register): Parses output of Winbond - register dumps. - * (w89k_loadtypes, w89k_loadprotos): Reduce to just srec/xmodem. - * (w89k_cmds): Add clear all breakpoints, memory fill, and dump - registers commands. - - * config/pa/tm-hppa.h: Define lots register offsets needed by - w89k-rom.c. - - -Thu Apr 6 17:00:46 1995 Michael Meissner <meissner@tiktok.cygnus.com> - - * Makefile.in (X11_INCLUDES): Define as empty. - (X11_CFLAGS): Define as including $(X11_INCLUDES). - (X11_LIB_SWITCHES): Define as empty. - (X11_LIBS): Define as -lX11. - - -Wed Apr 5 19:57:38 1995 Jim Kingdon (kingdon@lioth.cygnus.com) - - * mips-tdep.c (mips_print_register): Remove unused variable - our_type and call to init_type. Fixes memory leak. Reindent function. - - * mips-tdep.c (mips_print_register), findvar.c - (write_register_bytes): Make buffer char[] instead of unsigned - char[]. - -Mon Apr 3 19:28:14 1995 Jim Kingdon (kingdon@lioth.cygnus.com) - - * top.c, utils.c, main.c, defs.h: Replace error_pre_print with two - variables: error_pre_print (for RETURN_ERROR) and quit_pre_print - (for RETURN_QUIT). Fixes a bug whereby typing ^C (e.g. in "maint - print sym") could output extraneous stuff. - * objfiles.c: Don't declare error_pre_print; defs.h does it. - -Mon Apr 3 13:48:28 1995 Stu Grossman (grossman@andros.cygnus.com) - - * monitor.h: Add MO_GETMEM_NEEDS_RANGE flag. - * monitor.c (monitor_read_memory): Use previously mentioned flag - to send proper format memory examine commands to the w89k monitor. - Also, try to handle bizarre format of memory dump... - - * op50-rom.c w89k-rom.c: Update to new monitor.[ch] conventions. - -Sat Apr 1 03:22:20 1995 Peter Schauer (pes@regent.e-technik.tu-muenchen.de) - - * dbxread.c (process_one_symbol) [SOFUN_ADDRESS_MAYBE_MISSING]: - Handle relocated symbol address. - * partial-stab.h, case N_SO, SOFUN_ADDRESS_MAYBE_MISSING: - Do not relocate a zero address. - -Thu Mar 30 19:46:36 1995 Jim Kingdon (kingdon@lioth.cygnus.com) - - * config/a29k/tm-a29k.h: Nuke obsolete define CONTROL_END_ADDR; it - is nowhere used. - - * stabsread.c (read_range_type): Remove FIXME comment about - type-id (I presume this meant a number followed by = followed by a - type) versus type number; Per fixed it. - -Wed Mar 29 09:56:04 1995 Jason Molenda (crash@phydeaux.cygnus.com) - - * configure.in: sparc-*-sunos5* is same as sparc-*-solaris2*. - -Wed Mar 29 18:30:03 1995 Stan Shebs <shebs@andros.cygnus.com> - - * remote-e7000.c (why_stop): Add new kinds of strings to expect - from the emulator. - (e7000_wait): Add interpretations for more stop reasons, - including warnings for write protect and cycle address errors. - -Wed Mar 29 17:09:29 1995 Stu Grossman (grossman@cygnus.com) - - * monitor.c monitor.h remote-est.c rom68k-rom.c: Add start of - support for interrupting target. - * monitor.c (monitor_open): Send stop command before doing - anything else. - * (monitor_load_srec): Fix record size calculation to prevent end - of segment from getting trashed. - * rom68k-rom.c: Update to latest version of struct monitor_ops. - * config/sparc/tm-sparc.h (FIX_CALL_DUMMY): Fix byte-order - problems. Makes DOS hosted function calling work. - * sparclite/crt0.s: Define _start to make COFF happy. - -Wed Mar 29 09:11:51 1995 Michael Meissner <meissner@tiktok.cygnus.com> - - * defs.h (atof): Don't provide an external declaration if atof is - a macro. - -Wed Mar 29 00:01:07 1995 Peter Schauer (pes@regent.e-technik.tu-muenchen.de) - - * rs6000-tdep.c (skip_prologue): Skip saving of LR and CR in - the stack frame, fix typos in `st rx,NUM(r1)' and `stu r1,NUM(r1)' - tests. - -Tue Mar 28 17:04:04 1995 Per Bothner <bothner@kalessin.cygnus.com> - - * gdbtypes.c (create_range_type): If indextype has TYPE_FLAG_STUB - set, set TYPE_FLAG_TARGET_STUB. - (check_stub_type): Recalculate TYPE_LENGTH for range type. - * stabsread.c (read_range_type): If index type number is followed - by '=', back up, call read_type. and assume we have a true range. - * gdbtypes.h (TYPE_FLAG_TARGET_STUB): Update comment. - -Mon Mar 27 22:51:54 1995 Peter Schauer (pes@regent.e-technik.tu-muenchen.de) - - * alpha-nat.c, irix4-nat.c, irix5-nat.c, mipsv4-nat.c, - sparc-tdep.c (supply_gregset, supply_fpregset): Fill inaccessible - registers with zero to handle recent read_register_bytes change. - * irix4-nat.c, irix5-nat.c, mipsv4-nat.c (supply_gregset, - fill_gregset): Fix handling of CAUSE_REGNUM. - * mips-nat.c (store_inferior_registers): Handle unwritable - registers when storing a single register. - * config/mips/tm-irix3.h (CAUSE_REGNUM, BADVADDR_REGNUM): - Fix definitions. - - * mdebugread.c (parse_symbol, psymtab_to_symtab_1): Clear - allocated mips_extra_func_info, if the debug info is corrupt, - the PDR to fill it in might be missing. - -Mon Mar 27 14:43:00 1995 Kung Hsu <kung@mexican.cygnus.com> - - * vx-share/regPacket.h: a new file interfacing with vxworks. - -Sun Mar 26 13:22:47 1995 Jim Kingdon (kingdon@lioth.cygnus.com) - - * breakpoint.c (bpstat_do_actions): Once we've executed the - commands, set bs->commands to NULL. - -Sat Mar 25 01:16:10 1995 Peter Schauer (pes@regent.e-technik.tu-muenchen.de) - - * buildsym.c (patch_subfile_name): Update last_source_file - with the real source file name. - * dbxread.c (end_psymtab): Handle static functions in the - SOFUN_ADDRESS_MAYBE_MISSING case by passing pst->filename - to lookup_minimal_symbol. - (process_one_symbol): Ignore extra outermost context from - SunPRO cc and acc. - * stabsread.c (define_symbol): Do not complain for SunPRO - static variable encoding if STATIC_TRANSFORM_NAME is defined. - * sparc-tdep.c, config/sparc/tm-sun4sol2.h - (sunpro_static_transform_name): Renamed from - solaris_static_transform_name. - * config/sparc/tm-sun4os4.h (STATIC_TRANSFORM_NAME): - Define to sunpro_static_transform_name for acc 3.0 compiled - executables. - * procfs.c, config/alpha/nm-osf2.h (PROCFS_DONT_TRACE_FAULTS): - Renamed from PROCFS_DONT_TRACE_IFAULT, don't trace any faults - if defined. - * procfs.c (info_proc_siginfo): Cast sip->si_addr to - `unsigned long' and use `lx' format for printing it. - -Fri Mar 24 15:45:42 1995 Stu Grossman (grossman@cygnus.com) - - * configure.in: Move test for m68*-est-* before m68*-*-coff*. - * findvar.c: Move default def of CANNOT_STORE_REGISTER closer to - the beginning of the code. - * (write_register_gen): New routine. Analogous to - read_register_gen. - * (write_register_bytes): Another rewrite! Make it smarter about - not updating regs with the same value. - * monitor.c (printf_monitor readchar): Use stderr instead of - stdout to output debug info. Also cleanup readchar a little. - * (expect): Make sure that excessive responses are null - terminated. - * (monitor_open): Check for magic number in monitor_ops struct. - Allow multiple commands as init strings. Also, clear all - breakpoints. - * (monitor_resume monitor_wait): Send a command to dump all the - regs for those targets which don't do so when waking up after a - continue command. - * (monitor_wait): Handle excessive response output better. - * (monitor_write_memory): Use block fill, word, and long word - commands (if they exist) to write memory more efficiently. - * General cleanups to use flag bits instead of individual flag - words in monitor_ops struct. - * (monitor_command): Return output from command. - * (monitor_load_srec): Allocate buffer only once. Use alloca. - Wait for load response string instead of using a timeout to start - sending S-records. Fix bug where value of srec_frame shrinks. If - hashmark is set, print `-' for retransmissions. General cleanups. - * (monitor_make_srec): Get rid of S-record default type kludge. - * monitor.h: Use seperate struct for memory and register - read/write commands. Memory commands can come in byte, word, - long, and longlong forms. - * (monitor_ops): Change lots of fields. Generalize some stuff. - Put all flags into flags word. Allow init to be a list of commands. - Add command for clearing all breakpoints, block fill, dumping all - registers. - * remote-est.c: Rewrite to use new monitor conventions. - * config/m68k/est.mt (TDEPFILES): Add monitor.o. - * config/m68k/tm-est.h: Set NUM_REGS to 18. - * testsuite/gdb.base/break.exp: Lots of cleanups. Use gdb_test - more thoroughly. - -Thu Mar 23 23:20:00 1995 Jeff Law (law@snake.cs.utah.edu) - - * somsolib.c (som_solib_add): Handle case where a shared library - referenced by a core file has sections without the SEC_ALLOC bit - set (eg stabs sections). - -Thu Mar 23 15:07:08 1995 Jim Kingdon (kingdon@lioth.cygnus.com) - - * breakpoint.c (bpstat_do_actions): For each element in the bpstat - chain, do all the commands regardless of whether they run the - inferior. - -Wed Mar 22 19:17:06 1995 Doug Evans <dje@cygnus.com> - - * mem-break.c (LITTLE_BREAKPOINT, BIG_BREAKPOINT): Define as - BREAKPOINT if mono-endian. - (break_insn): Deleted. - (big_break_insn, little_break_insn): Define. - (memory_insert_breakpoint): Handle bi-endian cpus. - (BREAKPOINT_LEN): Define. - (memory_remove_breakpoint): Use it. - (memory_breakpoint_size): Likewise. - -Tue Mar 21 17:03:17 1995 Kung Hsu <kung@mexican.cygnus.com> - - * sparc-stub.c: add nop after 'bg good_wim'. - * sparcl-stub.c: ditto. - -Tue Mar 21 13:34:12 1995 Jim Kingdon (kingdon@lioth.cygnus.com) - - * infrun.c (handle_command): Don't print TARGET_SIGNAL_0, - TARGET_SIGNAL_UNKNOWN, or TARGET_SIGNAL_DEFAULT. - -Mon Mar 20 10:09:59 1995 Jeff Law (law@snake.cs.utah.edu) - - * hppab-nat.c (store_inferior_registers): Sync with HPUX version. - -Mon Mar 20 07:34:48 1995 Stu Grossman (grossman@cygnus.com) - - * hppah-nat.c (store_inferior_registers): Move check for - CANNOT_STORE_REGISTER to a better place. Fixes ptrace I/O errors - found by test suite during function calls, which attempts to write - unwritable registers. - -Sat Mar 18 02:02:24 1995 Peter Schauer (pes@regent.e-technik.tu-muenchen.de) - - * mdebugread.c (parse_symbol): If finishing a function without - known parameter type info, set that from parameter symbols. - Remove commented-out add_param_to_type support. - -Thu Mar 16 16:38:03 1995 Jim Kingdon (kingdon@lioth.cygnus.com) - - * xcoffread.c (process_linenos): Make sure filename we pass to - start_subfile will cause deduce_language_from_filename to return - the correct thing. Reindent function to GNU standards. - -Thu Mar 16 15:54:00 1995 J.T. Conklin <jtc@rtl.cygnus.com> - - * nlm/gdbserve.c (handle_exception): #if out call to StopBell, - as it is not available on NetWare 3 or PIN. - * nlm/ppc.c (StopBell): Removed. - -Thu Mar 16 12:14:41 1995 Jim Kingdon (kingdon@lioth.cygnus.com) - - * xcoffread.c (read_xcoff_symtab): When creating a dummy parameter - inferred from the traceback tags, give its type the name - "<non-float parameter>". - - * stabsread.c (rs6000_builtin_type): Recognize types -31 to -34. - -Wed Mar 15 15:09:29 1995 Stu Grossman (grossman@cygnus.com) - - * findvar.c (read_register_bytes write_register_bytes): Make - these routines much smarter about updating registers from the - target, only doing so when absolutely necessary. This really - speeds up register modification on some remote targets. - - * monitor.c: More cleanups. Get rid of monitor_load_ascii_srec. - BFD makes this unnecessary. Lots of debugging speedups. - * (expect): NULL terminate return string. - * (monitor_open monitor_supply_register parse_register_dump - monitor_wait monitor_fetch_register): Switch to using GNU regexp - library to parse multi-register displays. - * (monitor_read_memory): Read multiple bytes (up to 16) at once. - * (monitor_create_inferior): Call clear_proceed_status to make run - command notice first breakpoint. - * (monitor_load): Clean up. Reset inferior_pid, set pc to start - address and reset symbol table stuff to make loads put things into - a fresh state. - * (monitor_load_srec): Lower sleep time to 1 second. - - * monitor.h (struct monitor_ops): Add register_pattern and - supply_register to monitor_ops. - - * rom68k-rom.c: Add new support for handling register dumps. - * config/m68k/tm-m68k.h: Define D0_REGNUM and A0_REGNUM for register - dump handling. - -Wed Mar 15 15:18:27 1995 Jim Kingdon (kingdon@lioth.cygnus.com) - - * utils.c, defs.h (putchar_unfiltered, fputc_unfiltered): Make - argument be an int, not a char. Using a prototype followed by an - old-style function definition in a case where an argument is - widened is a GCC-ism not supported by the native AIX compiler. - -Wed Mar 15 12:22:35 1995 J.T. Conklin <jtc@rtl.cygnus.com> - - * nlmstub.def: Removed, this was moved to nlm/gdbserve.def - long ago. - - * configure.in (alpha-*-netware*): Removed configuration. - * config/alpha/{alpha-nw.mt, gdbserve.mt, tm-alphanw.h}: Removed. - * nlm/{README-ALPHA-NETWARE, aio.h, alpha-io.S, alpha-regdef.h, - alpha.c, alpha.h, altdebug.h}: Removed. - - * nlm/gdbserve.c (main): Add support for processing BOARD= - argument, deprecate NODE=. - -Wed Mar 15 10:58:26 1995 Jim Kingdon (kingdon@lioth.cygnus.com) - - * c-exp.y (yylex): Make an empty character constant an error. - -Tue Mar 14 15:00:54 1995 Per Bothner <bothner@kalessin.cygnus.com> - - * valops.c (value_arg_coerce): Do possible value_coerce_array - before determining type argument to value_cast. - -Tue Mar 14 10:41:41 1995 Kung Hsu <kung@mexican.cygnus.com> - - * remote-es.c: Replace ignore with 0. - -Tue Mar 14 05:52:36 1995 Jim Kingdon (kingdon@lioth.cygnus.com) - - * valops.c (value_repeat), eval.c (evaluate_subexp_standard): - If VALUE_REPEATED is already set, just error out. - - * valops.c (value_cast, value_slice), parse.c (follow_types): Add - FIXME-type-allocation comments. - - * gdbtypes.h (struct type): Fix comment about what units the - TYPE_LENGTH is in. - -Mon Mar 13 18:27:25 1995 Stan Shebs <shebs@andros.cygnus.com> - - * ch-valprint.c (annotate.h): Include. - * eval.c (evaluate_subexp_standard): Remove unused variable. - (calc_f77_array_dims): Add parens to expression. - * f-exp.y (yylex): Add parens to expression, remove unused label. - * f-lang.h (calc_f77_array_dims): Declare. - * f-valprint.c (f_val_print): Remove unused variables. - -Mon Mar 13 15:25:47 1995 Jim Kingdon <kingdon@deneb.cygnus.com> - - * alpha-tdep.c (find_proc_desc): If pdr.framereg field is -1, don't - use the PDR, just examine prologues instead. - -Fri Mar 10 16:13:18 1995 Kung Hsu <kung@mexican.cygnus.com> - - * config/arc/tm-arc.h: Change arc register names. - -Fri Mar 10 02:49:40 1995 Peter Schauer (pes@regent.e-technik.tu-muenchen.de) - - Fix problems with infinite recursion when printing a class - that contains a static instance of the class. - * cp-valprint.c (dont_print_vb_obstack): Renamed from - dont_print_obstack, made static. - (dont_print_statmem_obstack): New obstack, controls printing - of static member classes. - (_initialize_cp_valprint): Initialize it. - (cp_print_static_field): New function, handles printing of - static members. - (cp_print_value_fields): New parameter dont_print_statmem to - handle recursive printing of static member classes, use - cp_print_static_field to handle printing of static members. - * c-valprint.c (cp_print_value_fields): Update prototype and - call to include additional dont_print_statmem parameter. - * c-valprint.c, f-valprint.c (dont_print_obstack): Remove unused - extern declaration. - - * alpha-tdep.c, findvar.c, infptrace.c: Include <string.h>. - - * config/alpha/tm-alpha.h (FRAME_FIND_SAVED_REGS): Call - alpha_find_saved_regs if fi->saved_regs is still NULL. - - * elfread.c (elf_symtab_read): Ensure that the filename field - of a minsym is nonempty. Ignore solib trampoline symbols from - the main symbol table, they might have a bogus value. - - * procfs.c (set_proc_siginfo), config/alpha/alpha-osf2.mh: - Fix typos in comments. - -Thu Mar 9 17:19:47 1995 Jim Kingdon <kingdon@deneb.cygnus.com> - - * mdebugread.c (parse_symbol, psymtab_to_symtab_1): Initialize - pdr.framereg field of MIPS_EFI_SYMBOL_NAME symbol to -1. That way - we know whether the PDR ever got set. - * mips-tdep.c (find_proc_desc): If pdr.framereg field is -1, don't - use the PDR, just examine prologues instead. - -Wed Mar 8 23:35:10 1995 Jeff Law (law@snake.cs.utah.edu) - - * somsolib.c (som_solib_section_offsets): Get offset of text - section right. - -Wed Mar 8 16:12:21 1995 Stu Grossman (grossman@cygnus.com) - - - * source.c (forward_search_command reverse_search_command): Set - convenience variable $_ to be the line # of the match. - * symtab.c (decode_line_1): Allow convenience variables to be - used in line specs (for breakpoints and such). - -Wed Mar 8 12:51:00 1995 Stan Shebs <shebs@andros.cygnus.com> - - * Makefile.in (VERSION): Bump to 4.14.1. - * NEWS, README: Update for 4.14. - * i386v-nat.c (i386_insert_aligned_watchpoint): Fix declaration. - (i386_insert_nonaligned_watchpoint): Call aligned instead of - generic watchpoint insertion. - -Tue Mar 7 19:26:10 1995 Per Bothner <bothner@kalessin.cygnus.com> - - * valops.c (value_slice): Do COERCE_VARYING_ARRAY. - -Tue Mar 7 00:23:47 1995 Stu Grossman (grossman@cygnus.com) - - * monitor.c, array-rom.c, monitor.h, rom68k-rom.c: Move target_ops - into monitor.c. - * monitor.c (monitor_create_inferior): Allow run command to start - program. - - * monitor.c (monitor_load): Set PC to start address when done - loading. - - * array-rom.c, monitor.h, rom68k-rom.c: Clean up target_ops. - Remove ref to monitor_create_inferior. - - * monitor.c: More general cleanups. Add prototypes, remove - unused routines. Fix bug with wrong number of args to error(). - - * main.c (main): Don't start up GUI when running under gdb mode - in emacs. - - * Makefile.in: Add rules for monitor.o and rom68k-rom.o to make - Sun make (with VPATH) work... - - * monitor.c, monitor.h, rom68k-rom.c: Serious cleanup to make IDP - (rom68k) target work right. - * array-rom.c, op50-rom.c, w89k-rom.c: Partial updates to new - monitor.c interface. More work needs to be done here. - * config/m68k/tm-monitor.h: Change DECR_PC_AFTER_BREAK to 0 to - match the IDP monitor. Also, set NUM_REGS to 18 cuz there's no - floating-point for this card. - - * serial.h, ser-go32.c, ser-mac.c, ser-tcp.c, ser-unix.c: Add - SERIAL_SETSTOPBITS to set the number of stopbits (needed for IDP - board?!?!?). - - * defs.h, utils.c, remote-hms.c, remote-pa.c, remote.c: Fix defs - and usage of fputc_unfiltered and putchar_unfiltered. Eliminate - putc_unfiltered (it's superfluous). - - * command.h, command.c, top.c: Add var_enum command type. It's - like var_string but allows only only one of the specified strings. - -Mon Mar 6 15:03:59 1995 Jim Kingdon (kingdon@lioth.cygnus.com) - - * valops.c (value_cast): Don't use backslash newline--pre-ANSI - compilers (such as SunOS4 /bin/cc) don't generally support it - except in some contexts. - -Fri Mar 3 17:42:48 1995 Per Bothner <bothner@kalessin.cygnus.com> - - * valops.c (value_cast): Check for cast to array type *before* - we coerce array to pointer (in case arg2 is already array). - - * valops.c (call_function_by_hand): Set using_gcc to 2 if using - gcc2. Needed for REG_STRUCT_HAS_ADDR to work on sparc. - Also check REG_STRUCT_HAS_ADDR for union, array and string types. - - * valops.c (call_function_by_hand): Re-arrange code for pushing - paramaters on the stack so we can do better STACK_ALIGN. - - * valops.c (call_function_by_hand): Call error if the number - of arguments is fewer than parameter types in function type. - -Fri Mar 3 17:13:05 1995 Doug Evans <dje@canuck.cygnus.com> - - * sparc-tdep.c (sparc_extract_struct_value_address): Move - sparc64 support to here. - (sparc64_extract_struct_value_address): Deleted. - (dump_ccreg): Add a prototype so long long arg -> int. - * sparc/tm-sp64.h (USE_STRUCT_CONVENTION): Define. - (EXTRACT_STRUCT_VALUE_ADDRESS): Delete. - -Fri Mar 3 15:12:12 1995 Jeff Law (law@snake.cs.utah.edu) - - * hpread.c (hpread_record_lines): New argument "offset". All - callers changed. Use it to handle dynamic address relocation. - (hpread_build_psymtabs): Adjust texthigh as we read each function - debug symbol. Fix computation of texthigh. - (hpread_read_subrange_type): Work around macro bugs in HP's - compilers. - (hpread_process_one_debug_symbol): Correctly map source lines. - - * somread.c (check_strange_names): Filter names emitted by the HP - compiler when generating PIC code. - - * valops.c (value_struct_elt_for_reference): Work around macro - bugs in HP's compilers. - * c-exp.y (block): Likewise. - -Fri Mar 3 12:27:28 1995 Jim Kingdon <kingdon@deneb.cygnus.com> - - * rs6000-tdep.c (push_dummy_frame): Fix order of arguments to - store_address. - - * utils.c [_AIX]: Include stddef.h instead of #defining size_t. - -Fri Mar 3 12:33:24 1995 Michael Meissner <meissner@tiktok.cygnus.com> - - * rs6000-tdep.c (skip_prologue): Skip multiple stores of the saved - registers that GCC emits on the PowerPC by default in addition to - the store multiple instruction used on the Power series. - -Fri Mar 3 00:54:58 1995 Doug Evans <dje@canuck.cygnus.com> - - * sparc-tdep.c (decode_asi): New function. - (sparc_print_register_hook): Pretty print more v9 registers. - * sparc/tm-sp64.h (REGISTER_NAMES): Fix some typos. - -Thu Mar 2 22:20:22 1995 Doug Evans <dje@canuck.cygnus.com> - - * dwarfread.c (struct dieinfo): Use CORE_ADDR for at_{low,high}_pc. - (target_to_host): Change result type to CORE_ADDR. - -Thu Mar 2 15:13:04 1995 Jim Kingdon (kingdon@lioth.cygnus.com) - - * rs6000-tdep.c: Fix byte-swapping sins. - -Thu Mar 2 16:48:45 1995 Michael Meissner <meissner@cygnus.com> - - * rs6000-tdep.c (branch_dest): Minor code cleanup, don't share - code between branch unconditional and branch conditional cases. - -Wed Mar 1 09:41:26 1995 Doug Evans <dje@canuck.cygnus.com> - - Various changes for sparc64. - * sparc-tdep.c (NUM_SPARC_FPREGS): Define. - (SPARC_INTREG_SIZE): Define. - (*): Use SPARC_INTREG_SIZE instead of REGISTER_RAW_SIZE (intreg) - where appropriate. - (enum branch_type): New value `done_retry'. - (isbranch): Renamed from isannulled. All callers changed. - Support new sparc64 branch insns. - (single_step): Handle done_retry. - (sparc_extract_struct_value_address): Don't assume 4 byte regs. - (get_saved_register): Likewise. - (sparc_push_dummy_frame): Likewise. - (sparc_frame_find_saved_regs): Likewise. - (sparc_pop_frame): Likewise. Don't refer to FPS_REGNUM, CPS_REGNUM, - or PS_REGNUM if not sparc64. sparc64 has 64 fp regs. - (sparc64_extract_struct_value_address): New function. - (dump_ccreg, sparc_print_register_hook): Likewise. - * sp64-tdep.c: Deleted. - * sparc/tm-sp64.h (GDB_TARGET_IS_SPARC64): Define. - (NUM_REGS): Reduce by 2, cle/tle are in the pstate reg. - (CC_HAS_LONG_LONG): Define. - (REGISTER_NAMES): Delete cle/tle and reorganize. - (PS_REGNUM, FPS_REGNUM, CPS_REGNUM): Delete, they're ifdef'd out of - sparc-tdep.c now. - (REGISTER_BYTES): Update. - (REGISTER_CONVERT_TO_VIRTUAL, REGISTER_CONVERT_TO_RAW): Delete. - (EXTRACT_RETURN_VALUE): Delete. Use definition in tm-sparc.h. - (NO_SINGLE_STEP): Likewise. - * sparc/tm-sparc.h (EXTRACT_VALUE_RETURN): Don't assume 4 byte regs. - * sparc/sp64.mt: Move simulator support ... - * sparc/sp64sim.mt: ... to here. - -Wed Mar 1 13:14:42 1995 Kung Hsu <kung@mexican.cygnus.com> - - * remote-vx960.c: new file for target specific register packaging. - * remote-vx68.c: ditto. - * config/i960/vxworks960.mt: add remote-vx960.o. - * config/m68k/vxworks68.mt: add remote-vx68.o. - -Wed Mar 1 13:42:49 1995 Michael Meissner <meissner@tiktok.cygnus.com> - - * remote.c (remote_wait): Make calls to strtol be type correct by - passing the address of a char * pointer instead of an unsigned - char *. - - * rs6000-tdep.c (push_dummy_frame): Cast sp to char * when calling - write_memory to make things type correct. - -Wed Mar 1 12:17:31 1995 Michael Meissner <meissner@cygnus.com> - - * ch-exp.y, c-exp.y, f-exp.y, m2-exp.y (yy defines): Support the - standard Linux yacc by adding more names to be redefined with a - prefix. - -Tue Feb 28 22:55:47 1995 Jim Kingdon (kingdon@lioth.cygnus.com) - - * hppa-tdep.c (pa_print_registers), monitor.c: Use - extract_unsigned_integer and friends, not SWAP_TARGET_AND_HOST. - * defs.h, findvar.c: Move SWAP_TARGET_AND_HOST back to findvar.c. - Rename it to SWAP_FLOATING to make it clear it is no longer for - integers. - -Tue Feb 28 14:38:39 1995 Kung Hsu <kung@mexican.cygnus.com> - - * defs.h (SWAP_TARGET_AND_HOST): check endianess at runtime not - compile time. - * arc-tdep.c (_initialize_arc_tdep): set tm_print_insn according to - processor. - - * vx-share/ptrace.h: merge in WRS new ptrace requests. - - * defs.h: fix a syntax error. - - * a29k-tdep.c (get_longjmp_target): add this function, from WRS. - * remote-vx.c: move read_register and write_register out to - target specific files. - * remote-vx29k.c (get_fp_contnets): add this function, from WRS. - - * defs.h: define SWAP_TARGET_AND_HOST macro. - * findvar.c, monitor.c, hppa-tdep.c: remove definition of - SWAP_TARGET_AND_HOST. - -Tue Feb 28 08:31:40 1995 Jim Kingdon (kingdon@lioth.cygnus.com) - - * alpha-tdep.c (find_proc_desc): Only attempt to set - PROC_LOCALOFF (found_heuristic) if found_heuristic is non-NULL. - -Mon Feb 27 11:56:32 1995 Stan Shebs <shebs@andros.cygnus.com> - - * monitor.c: General gcc -Wall lint cleanup and reformat. - (monitor_command): If no args, send an empty command. - -Thu Feb 23 21:07:25 1995 Stu Grossman (grossman@cygnus.com) - - * monitor.c (monitor_load_ascii_srec): Add a one second sleep - after send LOAD_CMD to prevent loss of first S-record. - -Tue Feb 21 20:48:42 1995 Per Bothner <bothner@kalessin.cygnus.com> - - * valops.c (call_function_by_hand): Set using_gcc to 2 if gcc-2. - Call error if too few arguments. - If REG_STRUCT_HAS_ADDR (structs passed by invisible reference), - copy and convert to reference *before* we calculate alignment. - Also, make sure structs allocated for return values and invisible - reference don't violate STACK_ALIGN. - -Tue Feb 21 23:29:59 1995 Per Bothner <bothner@rtl.cygnus.com> - - * ch-exp.y (expression_conversion): Recognize 'ARRAY () TYPE (EXPR)' - (same as C's '(TYPE[])EXPR') - -Tue Feb 21 11:47:26 1995 Stan Shebs <shebs@andros.cygnus.com> - - * top.c (print_gdb_version): Update the year. - -Sun Feb 19 14:31:57 1995 Jim Kingdon <kingdon@rtl.cygnus.com> - - * Makefile.in (CC_FOR_TARGET, CXX_FOR_TARGET): Look for newlib in - `..' not in `../..'. - -Sun Feb 19 11:05:28 1995 Peter Schauer (pes@regent.e-technik.tu-muenchen.de) - - * procfs.c (unconditionally_kill_inferior): Don't issue a PIOCKILL - in addition to a PIOCSSIG to kill the inferior. - -Thu Feb 16 15:06:12 1995 Per Bothner <bothner@kalessin.cygnus.com> - - * parse.c (follow_types): Given (TYPE[]) (i.e. with no length), - create a 0-length array type, and set BOUND_CANNOT_BE_DETERMINED. - * valops.c (value_cast): If a cast like (TYPE[])VALUE (i.e. array - of unknown length) use sizeof(VALUE)/sizeof(TYPE) as the length. - * c-typeprint.c (c_type_print_varspec_suffix): If array length - is 0, print it, but not if upper_bound is BOUND_CANNOT_BE_DETERMINED. - -Thu Feb 16 16:06:50 1995 Michael Meissner <meissner@tiktok.cygnus.com> - - * dcache.c (insque, remque): Rewrite Linux support. - -Wed Feb 15 12:33:20 1995 Michael Meissner <meissner@tiktok.cygnus.com> - - * config/powerpc/tm-ppc-eabi.h (TEXT_SEGMENT_BASE): Define as 1. - - * dcache.c (insque, remque): If compiling in standard C on Linux, - protect insque and remque with macros to cast the pointer - arguments to the proper type. - -Tue Feb 14 17:16:41 1995 Stu Grossman (grossman@cygnus.com) - - * annotate.c, breakpoint.c, defs.h, top.c: Replace - enable/disable_breakpoint_hook with modify_breakpoint_hook. - -Tue Feb 14 16:58:07 1995 Jim Kingdon (kingdon@lioth.cygnus.com) - - * expression.h: Move declaration of evaluate_subexp_with_coercion - from here... - * value.h: ...to here. - * expression.h: Don't include value.h - -Tue Feb 14 11:46:07 1995 Jim Kingdon (kingdon@lioth.cygnus.com) - - * expression.h: Move include of value.h until after declaration of - enum exp_opcode. - -Sun Feb 12 13:47:30 1995 Stan Shebs <shebs@andros.cygnus.com> - - * remote-e7000.c: Comprehensive cleanup; removal of dead code, - simplify code, declare things, format to standards. - (inferior.h, value.h, command.h, remote-utils.h): Include. - (e7000_login): Rename to e7000_login_command. - (e7000_ftp): Rename to e7000_ftp_command. - (e7000_drain): Rename to e7000_drain_command. - - * irix5-nat.c (string.h): Include near beginning of file. - -Sun Feb 12 12:36:38 1995 Jim Kingdon (kingdon@lioth.cygnus.com) - - * valops.c (value_arg_coerce): Use VALUE_TYPE not SYMBOL_TYPE on - arg, it is a value not a symbol. - - gcc -Wall lint: - * eval.c: Move declaration of evaluate_subexp_with_coercion from here.. - * expression.h: ..to here. - * expression.h: Include value.h. - * ch-lang.c (evaluate_subexp_chill): Add default case in switch. - -Sun Feb 12 11:03:47 1995 Per Bothner <bothner@kalessin.cygnus.com> - - * language.h (struct language_defn): New field evaluate_exp. - * c-lang.c (c_language_defn, cplus_language_defn, asm_langauge_defn), - f-lang.c (f_language_defn), language.c (unknown_language_defn, - auto_language_defn, local_language_defn), m2-lang.c (m2_language_defn): - Set evaluate_exp to evaluate_subexp_standard. - * ch-lang.c (evaluate_subexp_chill): New function. Chill-specific - support for MULTI_SUBSCRIPT. - (chill_language_defn): Set evaluate_exp to evaluate_subexp_chill. - * eval.c (enum noside): Move from here .... - * expression.h (enum noside): ... to here. - (evaluate_subexp_standard): New prototype. - * eval.c (evaluate_subexp): Renamed to evaluate_subexp_standard. - Removed lo-longer-needed test for chill_varying_type. - (evaluate_subexp): New. Calls exp->language_defn->evaluate_exp. - - * ch-exp.y (maybe_expression_list): New non-terminal. - (primitive_value): Allow empty parameter list. - -Sun Feb 12 10:02:16 1995 Per Bothner <bothner@cygnus.com> - - * buildsym.c (finish_block): If finishing a function without known - parameter type info, set that from parameter symbols. - * c-typeprint.c (c_type_print_varspec_suffix): For TYPE_CODE_FUNC, - print parameter types, if available. - * ch-typeprint.c (chill_type_print_base): Likewise. - - * gdbtypes.h (struct type): Remove function type field. - (TYPE_FUNCTION_TYPE): Remove macro. We can't as simply re-use - function types now that we're also storing parameter types. - And the payoff is much less. - * gdbtypes.c (make_function_type): Don't use/set TYPE_FUNCTION_TYPE. - (recursive_dump_type): Don't print TYPE_FUNCTION_TYPE. - * dwarfread.c (read_subroutine_type): Don't set TYPE_FUNCTION_TYPE. - - * valops.c (value_arg_coerce): Now takes param_type argument. - (call_function_by_hand): Convert arguments with value_arg_coerce - early, and overwrite original args with converted args. - No longer need multiple calls to value_arg_coerce. - (value_arg_push): Removed. - * hppa-tdep.c (hppa_push_arguments): No longer call value_arg_coerce. - * mips-tdep.c (mips_push_arguments): Likewise. - * alpha-tdep.c (alpha_push_arguments): Likewise. - * rs6000-tdep.c (push_arguments, ran_out_of_registers_for_arguments): - Likewise. - * value.h (value_arg_coerce): Remove declaration. (It's now static.) - - * valops.c (value_cast): Do COERCE_VARYING_ARRAY after COERCE_REF. - - * symtab.c (add_param_to_type): Remove (commented-out) function, - since that functionality has been re-written. - * coffread.c: Remove commented-out add_param_to_type support. - * mdebugread.c (parse_symbol): Likewise. - * stabsread.c (define_symbol): Likewise. - -Sun Feb 12 09:03:47 1995 Jim Kingdon (kingdon@lioth.cygnus.com) - - * buildsym.c (start_subfile): Set language for f2c like for cfront. - -Thu Feb 9 20:20:11 1995 Rob Savoye <rob@darkstar.cygnus.com> - - * op50n-rom.c: Add the control registers. - -Thu Feb 9 15:46:39 1995 Stan Shebs <shebs@andros.cygnus.com> - - * Makefile.in (CLIBS): Add $(LIBIBERTY) before, in addition to - after, any host/target/native libraries. - * dcache.c (insque, remque): Remove declarations. - * gdbtypes.h (type_code): Remove trailing comma. - - From Peter Schauer: - * xcoffread.c (read_xcoff_symtab) [C_HIDEXT]: Move #ifdef - STATIC_NODEBUG_VARS inside case. - -Thu Feb 9 07:43:41 1995 Jim Kingdon <kingdon@deneb.cygnus.com> - - * config/sparc/tm-sun4sol2.h: Define STATIC_TRANSFORM_NAME. - * partial-stab.h: Call it. - * stabsread.c (define_symbol) [STATIC_TRANSFORM_NAME]: Call - STATIC_TRANSFORM_NAME to get the name and use minimal symbols to - get the address. - * sparc-tdep.c (solaris_static_transform_name): New function. - -Thu Feb 9 12:09:09 1995 Jeff Law (law@snake.cs.utah.edu) - - * somread.c (som_symtab_read): Handle dynamic relocation for both - text and data symbols. - (som_symfile_offsets): If objfile is a shared library, then get - text and data offsets from the shared library structures. - * somsolib.c (som_solib_add): Copy the bfd pointer from the - objfile rather than reopening the file again. - (som_solib_section_offsets): New function. - * somsolib.h (som_solib_section_offsets): Declare. - -Wed Feb 8 20:32:18 1995 Jim Kingdon <kingdon@deneb.cygnus.com> - - * config/sparc/tm-sun4sol2.h, dbxread.c: Rename - N_SO_ADDRESS_MAYBE_MISSING to SOFUN_ADDRESS_MAYBE_MISSING. - * symtab.h (minimal_symbol) [SOFUN_ADDRESS_MAYBE_MISSING]: Add - filename field. - * elfread.c (record_minimal_symbol_and_info), - minsyms.c, symtab.h (prim_record_minimal_symbol_and_info): Return - newly created symbol. - * elfread.c (elf_symtab_read) [SOFUN_ADDRESS_MAYBE_MISSING]: - Set filename field of minimal symbol. - * symmisc.c (dump_msymbols) [SOFUN_ADDRESS_MAYBE_MISSING]: - Print filename field. - * minsyms.c, symtab.h (lookup_minimal_symbol): New arg sfile. - * symm-tdep.c, somsolib.c, hppa-tdep.c, c-exp.y, f-exp.y, - m2-exp.y, nindy-tdep.c, m3-nat.c, irix5-nat.c, hpread.c, - os9kread.c, breakpoint.c, alpha-tdep.c, valops.c, symtab.c, - printcmd.c, dbxread.c: Change callers to pass NULL for sfile. - * dbxread.c (process_one_symbol) [SOFUN_ADDRESS_MAYBE_MISSING]: - Find address of function from minimal symbols. - * partial-stab.h, case 'f', 'F': Call find_stab_function_addr - instead of getting pst->textlow from the stab. - * minsyms.c (find_stab_function_addr): New function. - -Wed Feb 8 19:19:56 1995 Rob Savoye <rob@darkstar.cygnus.com> - - * monitor.c: Fix so all the output shows up in the GUI command - window. - -Mon Feb 6 18:50:59 1995 Stan Shebs <shebs@andros.cygnus.com> - - * i386-tdep.c (_initialize_i386_tdep): Put void decl on separate - line, so init.c generation works correctly. - * arc-tdep.c (_initialize_arc_tdep): Ditto. - -Mon Feb 6 14:44:36 1995 Rob Savoye <rob@darkstar.cygnus.com> - - * config/mips/idt.mt: Add support for the lsi33k target. - * config/sparc/sun4sol2.mh: Add support for ser-tcp. - * array-rom.c: Finish the rest of the support commands needed by - GDB. - * mips-tdep.c: Add LSI33k register names and processor type. - -Sat Feb 4 13:29:52 1995 Stan Shebs <shebs@andros.cygnus.com> - - * config/m68k/est.mt (TDEPFILES): Remove m68k-pinsn.o. - -Fri Feb 3 11:19:20 1995 Stu Grossman (grossman@cygnus.com) - - * core.c (dis_asm_read_memory), defs.h, top.c: Get rid of - dis_asm_read_memory_hook. We can now call the disassemblers - directly and have no need for this hook anymore. - * defs.h, printcmd.c: Make print_insn be static. - - * ser-go32.c (dos_comisr): Make this 8 bit clean. - * (dos_open dos_close): Allow multiple opens to the same device. - Use a ref count to prevent unwanted deallocations. - * sparcl-tdep.c: Put #ifdefs around all socket stuff to make GO32 - happy. - * (sparclite_ops): Switch to download_stratum. - * target.h (enum strata): Move download_stratum before - process_stratum so that executable targets get pushed on top of - download targets. - -Thu Feb 2 19:02:45 1995 Rob Savoye <rob@darkstar.cygnus.com> - - * array-rom.c: Remove the non GDB remote protocol config stuff. - - * monitor.c: All reading/writing functions for memory and - registers work. - -Thu Feb 2 16:11:04 1995 Kung Hsu <kung@mexican.cygnus.com> - - * config/arc/arc.mt: new target makefile for arc processor. - * config/arc/tm-arc.h: new target header for arc processor. - * config/arc/go32.mh: new go32 host makefile for arc processor. - * config/arc/xm-go32.h: new go32 host header for arc processor. - * arc-tdep.c: new target dependent codes for arc processor. - -Thu Feb 2 13:58:40 1995 Stan Shebs <shebs@andros.cygnus.com> - - * Makefile.in (VERSION): Bump to 4.13.2. - -Thu Feb 2 07:27:56 1995 Jim Kingdon (kingdon@lioth.cygnus.com) - - Fix compiler warnings: - * remote-e7000.c (printf_e7000debug): Rename to puts_e7000debug - and have the caller do the sprintf. Saves us from varargs hell. - (normal): Define before use. - * remote-e7000.c: Reindent a few things. - -Wed Feb 1 21:16:42 1995 Per Bothner <bothner@kalessin.cygnus.com> - - * f-typeprint.c (f_type_print_varspec_suffix): Print array index - ranges in reverse order. - * f-valprint.c (f77_create_arrayprint_offset_tbl): Fix calculation. - - * eval.c (evaluate_subscript): Don't call value_subscript, since - it adjusts for lower bound and enforces ranges. - - * expression.h (exp_code): Remove MULTI_F77_SUBSCRIPT, OP_F77_SUBSTR. - * eval.c, parse.c: Removed uses of removed opcodes. - * eval.c (evaluate_subexp): Clean up handling of - OP_UNDETERMINED_ARGLIST (no backtracking, more general). - - * f-valprint.c (f_val_print): Print TYPE_CODE_STRING using - LA_PRINT_STRING, and not val_print_string (which reads from inferior). - - * ch-lang.c (chill_is_varying_struct), ch-lang.h: Remve function - duplicate function made redundant by chill_varying_type. - - Re-write of f77 string and complex number support: - - * language.h (struct language_defn): New fields string_lower_bound - and string_char_type. - * c-lang.c (c_language_defn, cplus_language_defn, asm_language_defn), - language.c (unknown_language_defn, auto_language_defn, - local_language_defn), m2-lang.c (m2_language_defn), f-lang.c - (f_language_defn), ch-lang.c (chill_language_defn): Set new fields. - * gdbtypes.c (create_string_type): Use new string_char_type field. - * valops.c (value_string): Use new string_lower_bound field. - - * defs.h (TARGET_COMPLEX_BIT, TARGET_DOUBLE_COMPLEX_BIT): Removed. - * f-lang.c (f_create_fundamental_type, _initialize_f_language), - m2-lang.c (m2_create_fundamental_type), - gdbtypes.c (_initialize_gdbtypes): Set TYPE_TARGET_TYPE of complex - types. Set their TYPE_CODEs to TYPE_CODE_COMPLEX. - * mdebugread.c (mdebug_type_complex, mdebug_type_double_complex): - Removed. Use builtin_type_complex and builtin_type_double_complex. - - * gdbtypes.h (enum type_code): Removed TYPE_CODE_LITERAL_STRING - and TYPE_CODE_LITERAL_COMPLEX. - * c-typeprint.c, f-typeprint.c, f-valprint.c, eval.c: Removed uses of - TYPE_CODE_LITERAL_STRING and TYPE_CODE_LITERAL_COMPLEX. - * gdbtypes.c, gdbtypes.h (f77_create_literal_complex_type, - f77_create_literal_string_type): Removed. - * value.h (VALUE_LITERAL_DATA, VALUE_SUBSTRING_MEMADDR, - VALUE_SUBSTRING_MYADDR): Removed. - - * expression.h (enum exp_opcode): Rename OP_F77_LITERAL_COMPLEX to - OP_COMPLEX. - * parse.c: Update accordingly. - - * f-valprint.c (f77_print_cmplx): Removed. - (f_val_print case TYPE_CODE_COMPLEX): Re-write to use print_floating. - - * f-exp.y (STRING_LITERAL): Use OP_STRING instead of OP_ARRAY. - * eval.c (evaluate_subexp): For case OP_ARRAY, don't call - f77_value_literal_string. - * valops.c, value.h (f77_value_literal_string, f77_value_substring, - f77_assign_from_literal_string, f77_assign_from_literal_complex): - Removed. - (value_assign): No longer need to handle literal types. - * valops.c (f77_value_literal_complex), value.h: Re-written and - renamed to value_literal_complex. Last arg is now a (complex) type. - * valops.c (f77_cast_into_complex): Re-written and renamed to - cast_into_complex. - * eval.c (evaluate_subexp): Update accordingly. - - * ch-valprint.c (chill_val_print): On TYPE_CODE_STRING, don't - print address for non-'s'-formats. - * ch-typeprint.c, ch-valprint.c: Use chill_varying_type instead - of chill_is_varying_struct. - -Wed Feb 1 13:27:33 1995 Stan Shebs <shebs@andros.cygnus.com> - - gcc -Wall lint. - * alpha-tdep.c (alpha_in_lenient_prologue): Comment out. - (after_prologue): Remove unused local b. - * procfs.c (thread.h): Include. - (pr_flag_table, pr_why_table, faults_table, siginfo_table): Use - nested braces in initializer. - * top.c (initialize_targets, initialize_utils): Declare. - (locate_arg, insert_args): Add parens around tested assignments. - * remote-utils.c (sr_scan_args): Remove decl of strtol. - * remote.c (thread.h): Include. - (remote_wait): Remove unused local p2. - * sparc-tdep.c (fill_gregset, fill_fpregset): Remove decls of - registers array. - - defs.h (stdlib.h): Include. - (exit, perror, atoi, qsort, memcpy, memcmp): Don't declare. - (fclose, atof, malloc, realloc, free, strchr, strrchr, strstr, - strtok, strerror): Don't specify parameter types in declaration. - -Wed Feb 1 12:23:57 1995 Per Bothner <bothner@kalessin.cygnus.com> - - * ch-exp.y (value_string_element, string_primitive_value, - start_element, left_element, right_element, slice_size, - lower_element, upper_element, first_element): Removed. - (value_string_slice, value_array_slice): Replaced by ... - (slice): New non-terminal, with working slice support. - (primitive_value_lparen, rparen): New non-terminals. - (maybe_tuple_elements): New non-terminal, to allow empty tuples. - (idtokentab): Added "up". - - * value.h (COERCE_VARYING_ARRAY): New macro. - * valarith.c (value_subscript): Use it. - * valops.c (value_cast): Likewise. Also, do nothing if already - correct type, and allow converting from/to range to/from scalar. - - * valops.c, value.h (varying_to_slice, value_slice): New functions. - * eval.c (OP_ARRAY): Add cast for array element. - * expression.h (TERNOP_SLICE, TERNOP_SLICE_COUNT): New exp_opcodes. - * valops.c (chill_varying_type): Moved function frp, here ... - * gdbtypes.c (chill_varying_type), gdbtypes.h: ... to here. - * parse.c (length_of_subexp, prefixify_subexp): Add support - for TERNOP_SLICE, TERNOP_SLICE_COUNT. - * expprint.c (print_subexp, dump_expression): Likewise. - * eval.c (evaluate_subexp): Likewise. - - * eval.c (evaluate_subexp case MULTI_SUBSCRIPT): Don't call - value_x_binop on a Chill varying string. - -Tue Jan 31 13:51:53 1995 Jim Kingdon (kingdon@lioth.cygnus.com) - - * config/m68k/monitor.mt, - config/pa/{hppabsd.mt,hppahpux.mt,hppaosf.mt,hppapro.mt}: Put - depfiles in TDEPFILES not REMOTE_O. - -Tue Jan 31 11:14:44 1995 Steve Chamberlain <sac@splat> - - From nigel@algor.co.uk. - * ser-go32.c (dos_close): Don't crash if scb null. - (dos_sendbreak): New function. - (dos_ops): Point to dos_sendbreak. - (dos_info): Calculate COM number correctly. - -Tue Jan 31 09:40:11 1995 Jim Kingdon (kingdon@lioth.cygnus.com) - - * xcoffread.c (process_xcoff_symbol): Use new variables - func_symbol_type and var_symbol_type as type of functions and - variables which don't have any stabs associated with them. - Reindent most of function. - (_initialize_xcoffread): Initialize *_symbol_type. - - * xcoffread.c (read_xcoff_symtab): Reindent most of function. - Put C_HIDEXT symbols in the minimal symbols, rather than ignoring - them (this part commented out as I didn't quite get it to work). - (cs_to_section, find_targ_sec): New functions, to support above code. - * xcoffread.c (RECORD_MINIMAL_SYMBOL): Only skip '.' if it is - actually present. - -Mon Jan 30 17:34:24 1995 Stu Grossman (grossman@cygnus.com) - * sparcl-tdep.c: Add `sparclite' target for doing serial and udp - downloads to SPARClite demo boards. - -Sun Jan 29 09:43:22 1995 Jim Kingdon (kingdon@lioth.cygnus.com) - - * remote.c, remote-pa.c: Remove #if 0'd icache code. It has had - no hope of working as is for a long time (in particular, shebs' 27 - Jan 95 change confuses the issue further--target_read_memory and - xfer_core_file do *not* do the same thing in this context). - Revise comment. - -Sat Jan 28 13:40:46 1995 Peter Schauer (pes@regent.e-technik.tu-muenchen.de) - - * elfread.c (elf_symtab_read): Do not test BSF_GLOBAL for - procedure linkage table symbols, it is no longer set due to the - Jan 6 BFD change in bfd/elfcode.h. - -Fri Jan 27 17:08:06 1995 Stan Shebs <shebs@andros.cygnus.com> - - * top.c (use_windows): Clarify comments. - - * convex-tdep.c (xfer_core_file): Comment out. - * config/convex/tm-convex.h (XFER_CORE_FILE): Remove. - * remote.c, remote-pa.c (remote_fetch_word): Change xfer_core_file - references to target_read_memory. - * gdbcore.h (xfer_core_file, core_open, core_detach): Remove - declarations. - * corelow.c (core_open, core_detach): Make static. - - * arm-tdep.c: Make it compile. - (exec_file_command, xfer_core_file): Comment out. - (arm_print_insn): Remove, now in libopcodes. - (skip_prologue): Comment out most of body. - (arm_frame_find_saved_regs): Move here from tm-arm.h. - (_initialize_arm_tdep): Set tm_print_insn. - * config/arm/tm-arm.h: Remove old refs to first_object_file_end. - (XFER_CORE_FILE): Remove. - (FRAME_FIND_SAVED_REGS): Call arm_frame_find_saved_regs. - -Fri Jan 27 08:48:28 1995 Jim Kingdon (kingdon@lioth.cygnus.com) - - * Makefile.in (CHILL_LIB): Define as in testsuite/Makefile.in. - -Thu Jan 26 18:24:41 1995 Jim Kingdon <kingdon@deneb.cygnus.com> - - * symtab.c (find_pc_line): When subtracting one to get a line - number, make sure not to end up with zero. - - * remote-vx.c: Revert all of Kung's changes of 16 Jan. The - problems with those changes were (a) the file didn't compile, (b) - they changed memset to bzero--memset is correct, (c) they took out - code to deal with boards lacking floating point, (d) who knows - what I didn't discover in a quick read. - -Thu Jan 26 17:32:54 1995 Stu Grossman (grossman@cygnus.com) - - * sparcl-tdep.c: Clean up formatting and indentation. - -Thu Jan 26 10:49:59 1995 Steve Chamberlain <sac@splat> - - * remote-hms.c (hms_ops): Change ref of hr_load_image - to gr_load_image. - (dcache_flush, dcache_hit, dcache_value, dcache_fetch, - dcache_poke, dcache_init): Deleted. - (hms_open, hms_resume, hms_fetch_word, hms_store_word): - Use dcache routines provided by remote-util.h - -Thu Jan 26 12:08:31 1995 Michael Meissner <meissner@cygnus.com> - - * configure.in: Add support for powerpc-*-eabi. - - * powerpc/tm-ppc-eabi.h, powerpc/pcc-eabi.mt: New files for - PowerPC support. - -Wed Jan 25 18:13:14 1995 Per Bothner <bothner@kalessin.cygnus.com> - - * language.h (struct language_defn): New field c_style_arrays. - * language.c (unknown_language_defn, auto_language_defn, - local_language_defn), c-lang.c (c_language_defn, cplus_language_defn, - asm_language_defn): Set c_style_arrays to true. - * m2-lang.c (m2_language_defn), ch-lang.c (chill_language_defn), - f-lang.c (f_language_defn): Set c_style_arrays to false. - * valops.c (value_string): If c_style_array is not set, - allocate string in gdb (not inferior) using allocate_value. - - * value.h (COERCE_ARRAY), valops.c (value_addr, value_arg_coerce): - Only call value_coerce_array if current_language->c_style_arrays. - * values.c: Add #include "language.h". (Needed for COERCE_ARRAY.) - - * valops.c (chill_varying_type): New predicate. - * valops.c (value_cast): Support assigning a fixed string or array - to a variable string/array structure. - - * valarith.c (value_subscripted_rvalue): Extra parameter lowerbound. - Check index>=lowerbound, and then add lowerbound to index here, - instead of in caller. Generalize to arbitrary lval_types. - (value_subscript): Use enhanced value_subscripted_rvalue if - c_style_arrays is false (and index is in range). - - -Wed Jan 25 18:13:14 1995 Per Bothner <bothner@kalessin.cygnus.com> - - * eval.c (evaluate_subexp case OP_ARRAY): Fix calls to memset: - TYPE_LENGTH is length in bytes, not bits. - -Wed Jan 25 08:19:35 1995 Jim Kingdon (kingdon@lioth.cygnus.com) - - * infrun.c (proceed): Flush stdout before resuming inferior. - * infcmd.c (step_1), annotate.c (annotate_starting): - Don't bother to flush here. - -Wed Jan 25 01:11:21 1995 Jeff Law (law@snake.cs.utah.edu) - - * hpread.c (hpread_process_one_debug_symbol): Fix lines garbled - by an ill-advised global search and replace. - -Mon Jan 23 13:11:46 1995 Per Bothner <bothner@kalessin.cygnus.com> - - Add support for Chill bitstring literals (e.h. H'FF00'). - * ch-exp.y (match_bitstring_literal): Fix for proper endianness. - * expprint.c (print_subexp): Don't call error on OP_BITSTRING, - just print B'<unimlemented>'. - * gdbtypes.c (create_set_type): Fix bug in length calculation. - * valops.c, value.h (value_bitstring): New function. - * eval.c (evaluate_subexp): Implement support for OP_BITSTRING. - - * ch-typeprint.c (chill_type_print_base): For TYPE_CODE_FUNC, - check that return type is non-void, and print in proper Chill syntax. - -Mon Jan 23 12:20:34 1995 Rob Savoye <rob@darkstar.cygnus.com> - - * Makefile.in: Remove references to remote-mon.c. - * remote-mon.c: remove. Replaced by rom68k-rom.c. - * rom68k-rom.c: Support for Rom68k monitor. - -Mon Jan 23 10:50:57 1995 Jim Kingdon (kingdon@lioth.cygnus.com) - - * Makefile.in (CHILL_FOR_TARGET): Update -L argument to point to - gcc/ch/runtime not chillrt, since that is where the chill runtime - lives now. - -Mon Jan 23 00:06:57 1995 Steve Chamberlain <sac@splat> - - * remote-hms.c (hms_load): Delete. - (target_ops): Use hr_load_image. - - * remote-e7000.c, remote-z8k.c, remote-nindy.c (target_ops): - Define memory_insert/remove_breakpoint. - * xm-go32.h: Remove redundant SIGs. - -Thu Jan 19 20:26:58 1995 Steve Chamberlain <sac@splat> - - * ser-go32.c: Rewritten by nigel@algor.co.uk. - -Fri Jan 20 15:23:55 1995 Per Bothner <bothner@kalessin.cygnus.com> - - * expression.h (OP_LABELED): New operator, for Chill - labeled structre tuples. - * ch-exp.y (tuple_element, named_record_element, tuple_elements): - New non-terminals, to handle labeled structure tuples. - (tuple): Re-define using tuple_elements. - * eval.c (evaluate_labeled_field_init): New function, to handle - initialization of structure fields, possibly using OP_LABELED. - (evaluate_subexp): Use it. - * expprint.c (print_subexp case): For OP_ARRAY, use Chill syntax - for Chill. Handled OP_LABELED. - * parse.c (length_of_subexp, prefixify_subexp): Handle OP_LABELED. - - * eval.c (evaluate_subexp): Handle Chill Powerset tuples. - * valarith.c (value_bit_index): Just treat bitstring as represented - by an array of bytes. Alignment is handled by compiler. - -Wed Jan 18 19:00:29 1995 Stan Shebs <shebs@andros.cygnus.com> - - * h8300-tdep.c (gdb_print_insn_h8300): Fix typo (&info -> info). - * sh-tdep.c (gdb_print_insn_sh): Ditto. - -Wed Jan 18 11:25:43 1995 Kung Hsu <kung@mexican.cygnus.com> - - * remote-os9k.c (rombug_open): Fix a bug in exception handling - command. - * remote-os9k.c (rombug_write_inferior_memory): reset buffer after - write. - -Tue Jan 17 09:48:38 1995 Jim Kingdon <kingdon@lioth.cygnus.com> - - * parse.c (_initialize_parse): Improve wording of names of - msym_*_symbol_type. - -Tue Jan 17 14:00:58 1995 Ian Lance Taylor <ian@sanguine.cygnus.com> - - * config/mips/tm-mips.h (enum mips_fpu_type): New enum. - (mips_fpu): Change type to enum mips_fpu_type. - (FIX_CALL_DUMMY): Handle mips_fpu == MIPS_FPU_SINGLE. - * mips-tdep.c (mips_fpu): Change type to enum mips_fpu_type. - Don't initialize. - (mips_fpu_string): New static variable. - (mips_push_dummy_frame): Handle mips_fpu == MIPS_FPU_SINGLE. - (mips_pop_frame): Likewise. - (mips_extract_return_value): Likewise. - (mips_store_return_value): Likewise. - (mips_set_fpu_command): New static function. - (mips_show_fpu_command): New static function. - (_initialize_mips_tdep): Change handling of set/show mipsfpu. - -Tue Jan 17 09:48:38 1995 Jim Kingdon <kingdon@lioth.cygnus.com> - - * a29k-tdep.c (gdb_print_insn_a29k): Fix typo (&info -> info). - - * parse.c (write_exp_msymbol): Use new variables - msym_*_symbol_type as type of msymbol expression. - (_initialize_parse): Initialize them. - -Mon Jan 16 18:11:03 1995 Stan Shebs <shebs@andros.cygnus.com> - - General cleanup and simplication of disassembler interface. - * a29k-pinsn.c, arm-pinsn.c, convex-pinsn.c, gould-pinsn.c, - hppa-pinsn.c, i386-pinsn.c, i960-pinsn.c, m68k-pinsn.c, - m88k-pinsn.c, mips-pinsn.c, ns32k-pinsn.c, pyr-pinsn.c, - rs6000-pinsn.c, sparc-pinsn.c, tahoe-pinsn.c, vax-pinsn.c: Remove. - * gould-tdep.c, ns32k-tdep.c, tahoe-tdep.c, vax-tdep.c: New files, - had been -pinsn.c files. - * Makefile.in (ALLDEPFILES): Remove removed files. - (a29k-pinsn.o, arm-pinsn.o, convex-pinsn.o, gould-pinsn.o, - hppa-pinsn.o, i386-pinsn.o, i960-pinsn.o, m68k-pinsn.o, - m88k-pinsn.o, mips-pinsn.o, ns32k-pinsn.o, pyr-pinsn.o, - rs6000-pinsn.o, sparc-pinsn.o, tahoe-pinsn.o, vax-pinsn.o): - Remove compile actions. - * arm-tdep.o, gould-tdep.o, ns32k-tdep.o, tahoe-tdep.o, - vax-tdep.o: Add compile actions. - * defs.h (tm_print_insn): New global. - * a29k-tdep.c (gdb_print_insn_a29k): New function. - (_initialize_a29k_tdep): Rename from _initialize_29k, - set tm_print_insn. - * alpha-tdep.c (print_insn): Remove. - (_initialize_alpha_tdep): Set tm_print_insn. - * arm-tdep.c (arm_print_insn): New function, was print_insn - in arm-pinsn.c. - * convex-tdep.c (convex_print_insn): New function, was print_insn - in convex-pinsn.c. - * h8300-tdep.c (print_insn): Remove. - (gdb_print_insn_h8300): New function. - (_initialize_h8300_tdep): New function. - * h8500-tdep.c (print_insn): Remove. - (_initialize_h8500_tdep): New function. - * hppa-tdep.c (_initialize_hppa_tdep): Set tm_print_insn. - * i386-tdep.c (_initialize_i386_tdep): New function. - * i960-tdep.c (mem, next_insn): New functions, were in - i960-pinsn.c. - (_initialize_i960_tdep): Set tm_print_insn. - * m68k-tdep.c (_initialize_m68k_tdep): New function. - * m88k-tdep.c (_initialize_m88k_tdep): New function. - * mips-tdep.c (gdb_print_insn_mips): New function. - (_initialize_mips_tdep): Set tm_print_insn. - * pyr-tdep.c (pyr_print_insn): New function, was print_insn - in pyr-pinsn.c. - * rs6000-tdep.c (_initialize_rs6000_tdep): New function. - * sh-tdep.c (print_insn): Remove. - (gdb_print_insn_sh): New function. - (_initialize_sh_tdep): Set tm_print_insn. - * sparc-tdep.c (_initialize_sparc_tdep): New function. - * w65-tdep.c (print_insn): Remove. - (_initialize_w65_tdep): New function. - * z8k-tdep.c (print_insn): Remove. - (gdb_print_insn_z8k): New function. - (_initialize_z8k_tdep): Set tm_print_insn. - * printcmd.c (print_insn): New function, generic disassembler. - * config/*/*.mt (TDEPFILES): Remove refs to *-pinsn.o. - -Mon Jan 16 15:43:29 1995 Kung Hsu <kung@mexican.cygnus.com> - - * Makefile.in: add new files remote-vx29k.c, config/a29k/tm-vx29k.h, - and config/a29k/vx29k.mt. - * configure.in: add new configuration a29k-*-vxworks. - * remote-vx29k.c: new file merged from WRS. - * remote-vx.c: merge changes from WRS. - * config/a29k/vx29k.mt: new file for new configuration. - * config/a29k/tm-vx29k.h: new header file for newconfiguration. - -Sun Jan 15 14:36:19 1995 Steve Chamberlain <sac@splat> - - * breakpoint.h (disable_breakpoint, enable_breakpoint): - New declarations. - (enum bpdisp): Change name of 'delete' member to 'del'. - (struct bpstat): Changed name to 'bpstats'. - * breakpoint.c (disable_breakpoint, enable_breakpoint, - breakpoint_chain): Made globally visible. - (bpstat_stop_status): Use new name for bpstat. - (break_command_1, watch_command_1, catch_command_1, - breakpoint_auto_delete, denable_delete_breakpoint): Use 'del' - instead of 'delete'. - (set_breakpoint_sal): New function. - * defs.h (registers_changed_hook): New declaration. - * infcmd.c (run_stack_dummy): 'delete' is now 'del'. - * inflow.c (new_tty): Treat WIN32 in same way as __GO32__ - * main.c (main): Don't scan options when in WIN32 and exit - without entering main loop. - * m2-exp.y (m2_elx): Member 'class' is now 'aclass'. - * symtab.h (struct symbol, struct partial_symbol): Changed name of - member 'class' to 'aclass'. - (SYMBOL_CLASS, PSYMBOL_CLASS): Reflect change. - * top.c (registers_changed_hook): New definition. - * utils.c (quit, notice_quit, initialize_utils): Treate WIN32 - in same way as __GO32__. - * value.h (c_typedef_print): Rename 'new' argument. - - * w65-tdep.c, config/tm-w65.h, config/w65.mt: New files. - * configure.in: Suppprt for w65, - - -Sat Jan 14 11:18:11 1995 Jim Kingdon <kingdon@lioth.cygnus.com> - - * infcmd.c (signal_command): For "signal 0", pass (CORE_ADDR)-1, - not stop_pc, to proceed. - - * eval.c (evaluate_subexp): Clear expect_type except for C++ and CHILL. - -Fri Jan 13 17:52:57 1995 Jim Kingdon <kingdon@lioth.cygnus.com> - - * infcmd.c (signal_command): Accept "signal 0"; the change to not - accept it was accidental. "handle 0" and "info signal 0" remain - illegal, though. - -Fri Jan 13 15:19:01 1995 Stan Shebs <shebs@andros.cygnus.com> - - * Makefile.in (all): Don't make libgdb-files. - (libgdb): New action, makes libgdb-files. - -Thu Jan 12 21:23:25 1995 Per Bothner <bothner@kalessin.cygnus.com> - - * stabsread.c (read_enum_type): When pending enum symbols are - put into the enum type, they must be inserted in "backwards - order, in case we've overflowed a struct pending buffer. - - -Thu Jan 12 09:33:24 1995 Peter Schauer (pes@regent.e-technik.tu-muenchen.de) - - * README: Add note about SPARCworks cc release 3.0 and higher. - - Add procfs support for Alpha OSF/1-2.x. - * config/alpha/nm-osf.h: Renamed from nm-alpha.h, generic - OSF/1 native support. - * config/alpha/alpha-osf1.mh (NAT_FILE): Changed accordingly. - (MUNCH_DEFINE): Removed. - * config/alpha/alpha-osf2.mh, config/alpha/nm-osf2.h: New files - for procfs support. - * configure.in (alpha-dec-osf*): Use alpha-osf2.mh for OSF/1 - release 2.x and higher, else alpha-osf1.mh, as the procfs support - in release 1.x is incomplete. - * Makefile.in (ALLCONFIG): Add config/alpha/alpha-osf2.mh. - * alpha-nat.c (supply_gregset, fill_gregset, supply_fpgregset, - fill_fpgregset): New routines for procfs support. - * inftarg.c (_initialize_inftarg): Don't add ptrace support - if we have an optional procfs and /proc is accessible. - * procfs.c: Include sys/fault.h and sys/syscall.h before - including sys/procfs.h. - (unconditionally_kill_inferior): If PROCFS_NEED_PIOCSSIG_FOR_KILL - is defined, additionally perform a PIOCSSIG to really terminate - the inferior. - (create_procinfo): Always return a result. - (create_procinfo, do_attach): Don't trace T_IFAULT faults if - PROCFS_DONT_TRACE_IFAULT is defined. - (procfs_init_inferior): Use START_INFERIOR_TRAPS_EXPECTED as - argument to startup_inferior if it is defined. - (proc_set_exec_trap): If PIOCSSPCACT is defined, use it instead - of tracing exits from exec system calls. Needed for the user level - loader under Alpha OSF/1. - (do_detach): Clear any pending signal if we want to detach from - a process without a signal. - (set_proc_siginfo): If PROCFS_DONT_PIOCSSIG_CURSIG is defined, - don't issue a PIOCSSIG if pr_cursig already contains the signal we - intend to set. - (info_proc_signals): If PROCFS_SIGPEND_OFFSET is defined, the - pending signals are numbered from 1 instead of 0. - (info_proc_mappings): Increase size of output format for addresses - if BFD_HOST_64_BIT is defined. - (procfs_stop): Renamed from child_stop. - (_initialize_procfs): Don't add procfs support if we have an - optional procfs and /proc is not accessible. - - -Wed Jan 11 17:53:26 1995 Rob Savoye <rob@darkstar.cygnus.com> - - * array-rom.c: Add support for most commands. - - * monitor.c: Add GDB remote protocol for the hybrid environment on - the Array board. - -Wed Jan 11 00:44:01 1995 Jeff Law (law@snake.cs.utah.edu) - - * command.c (show_user_1): Use print_command_line to show a user - defined command (including control structures). - - * top.c (init_main): Change documentation for user defined - commands to indicate they may accept up to ten arguments. - -Tue Jan 10 16:22:41 1995 Jim Kingdon <kingdon@lioth.cygnus.com> - - * mips-tdep.c (mips_skip_prologue): Accept or as well as addu for - `move $s8, $sp' instruction. - -Sun Jan 8 12:45:34 1995 Jim Kingdon <kingdon@deneb.cygnus.com> - - * target.c, target.h (target_signal_from_command): New function. - * infrun.c (handle_command, signals_info), infcmd.c - (signal_command): Use it. - * infrun.c, infcmd.c: Update docstrings for these commands. - - * target.h (enum target_signal), target.c (signals), target.c - (target_signal_from_host, target_signal_to_host): Add - TARGET_SIGNAL_REALTIME_* and TARGET_SIGNAL_PRIO for lynx. - * config/tm-lynx.h: Define signal numbers for realtime events. - -Sat Jan 7 07:23:53 1995 Peter Schauer (pes@regent.e-technik.tu-muenchen.de) - - * dbxread.c (process_one_symbol): Handle N_FUN symbols - for Sun acc 3.0 under SunOS4. - - Changes to improve handling of runtime common symbols - under SunOS4. - * minsyms.c (get_symbol_leading_char): New routine to determine - the leading symbol character for an objfile. - (prim_record_minimal_symbol_and_info, install_minimal_symbols): - Use it. - * objfiles.h (rt_common_objfile): New global, points to objfile - containing the runtime common minimal symbols. - * objfiles.c (free_objfile): Mark rt_common_objfile as - unallocated before freeing it. - * solib.c (allocate_rt_common_objfile): New routine to allocate - an objfile for the runtime common minimal symbols. - (solib_add_common_symbols): Allocate an objfile for the runtime - common symbols if necessary and put common symbols into it. - Clean up code and comments. - (solib_add, special_symbol_handling): Cleanup comments regarding - runtime common symbols. - * stabsread.c (scan_file_globals_1): New routine, contains - old scan_file_globals code. Checks if there are any unresolved - global symbols before starting the expensive minimal symbol table - search. - (scan_file_globals): Now calls scan_file_globals_1 for the passed - objfile and eventually for the runtime common objfile. Complains - about any unresolved global symbols and removes them from the - global symbol chain to avoid dangling pointers into the symbol - table if the symbol table is reread. - -Thu Jan 5 17:38:29 1995 Stu Grossman (grossman@cygnus.com) - - * Makefile.in (install_only uninstall): Indent for clarity. - - * core.c (dis_asm_read_memory): Add call to - dis_asm_read_memory_hook to provide alternate way for disassembler - to read memory. - - * defs.h: Protect from multiple inclusion. Add decl for - dis_asm_read_memory_hook. - - * top.c: Make window startup be the default. - * Add dis_asm_read_memory_hook. - - -Thu Jan 5 01:16:40 1995 Jeff Law (law@snake.cs.utah.edu) - - * stabsread.c (define_symbol): Handle `a' symbol type used for - reference parameter passed in a register. - - -Wed Jan 4 12:27:29 1995 Kung Hsu <kung@mexican.cygnus.com> - - * defs.h: move include tm.h up, so that the type LONGEST can - also based on the target requirement to determine. In this case - target mips64. - - * remote-os9k.c (rombug_open): catch exception e in rombug. - * remote-os9k.c (rombug_wait): print message before register display - from rombug. - -Wed Jan 4 09:18:27 1995 Jim Kingdon (kingdon@lioth.cygnus.com) - - * top.c (locate_arg): Call strchr not index. - -Tue Jan 3 16:52:03 1995 Per Bothner <bothner@kalessin.cygnus.com> - - * ch-exp.y (literal): Recognize NULL. - (tuple): Parse simple unlabelled tuples. - * eval.c (evaluate_subexp case OP_ARRAY): Use expect_type to - evaluate brace-initializer-expressions depending on context. - (evaluate_subexp case UNOP_CAST): Pass the target type as - expected type when evaluating the expression. - - * ch-typeprint.c (chill_type_print_base): Get names of PTR and - BOOL from TYPE_NAME. - * ch-valprint.c (chill_print_type_scalar): New function, to handle - TYPE_CODE_RANGE better than print_type_scalar does. - (chill_val_print_array_elements): Use above new function. - -Mon Jan 2 15:02:51 1995 Stan Shebs <shebs@andros.cygnus.com> - - * remote-udi.c (udi_load): Tell symbol_file_add that the - program being loaded is the main program. - -For older changes see ChangeLog-94 - -Local Variables: -mode: indented-text -left-margin: 8 -fill-column: 74 -version-control: never -End: diff --git a/contrib/gdb/gdb/ChangeLog-96 b/contrib/gdb/gdb/ChangeLog-96 deleted file mode 100644 index 760b425f7599c..0000000000000 --- a/contrib/gdb/gdb/ChangeLog-96 +++ /dev/null @@ -1,5116 +0,0 @@ -Tue Dec 31 15:19:32 1996 Geoffrey Noer <noer@cygnus.com> - - * config/mn10300/tm-mn10300.h: more small register fixes - -Tue Dec 31 06:51:43 1996 Mark Alexander <marka@cygnus.com> - - * config/i386/xm-windows.h: Undo previous change to SIGTRAP - and SIGQUIT values; it messed up non-MIPS targets. - * config/mips/tm-mips.h: Undefine BREAKPOINT, replace - with separate LITTLE_BREAKPOINT and BIG_BREAKPOINT definitions; - this fixes problem with setting breakpoints in little-endian - programs in the simulator. - -Mon Dec 30 00:14:06 1996 Doug Evans <dje@seba.cygnus.com> - - * remote-sim.c (gdbsim_open_p): New static local. - (gdbsim_open): Call unpush_target if sim open. Set gdbsim_open_p. - (gdbsim_close): Only call sim_close if sim open. Reset gdbsim_open_p. - -Sun Dec 29 09:15:03 1996 Mark Alexander <marka@cygnus.com> - - * config/i386/xm-windows.h: Make SIGTRAP and SIGQUIT consistent - with sim/mips/support.h. - -Fri Dec 27 14:53:40 1996 Michael Meissner <meissner@tiktok.cygnus.com> - - * v850-tdep.c (struct pifsr): Add cur_frameoffset field. - (v850_scan_prologue): Add debug code #ifdef'ed DEBUG. Support new - compiler prologues using register save functions and short store - instructions. Add support for functions with large stack frames. - - * config/v850/tm-vm850.h ({R0,R1,R12,EP}_REGNUMS): New register - number defintiions for r0, r1, r12, ep. - (SAVE{1,2,3}_{START,END}_REGNUM): Register number definitions for - the 3 sets of saved registers. - -Thu Dec 26 19:56:55 1996 Mark Alexander <marka@cygnus.com> - - * valprint.c (print_longest): Don't lose upper bits - of 64-bit values on Windows. - * config/i386/xm-windows.h: Leave CC_HAS_LONG_LONG defined, - undefine PRINTF_HAS_LONG_LONG, so that 64-bit values will - be printed without loss of upper bits. - -Thu Dec 26 15:15:21 1996 Michael Snyder <msnyder@cleaver.cygnus.com> - - * config/sparc/tm-sparclet.h: make registers ASR15, ASR19 invisible - (they're not useful, you can't change, write or even read them) - -Thu Dec 26 15:20:48 1996 Fred Fish <fnf@cygnus.com> - - * config/pa/hppahpux.mh (TERMCAP): Always link to libc before - libcurses, to avoid picking up broken select() from libcurses - on some versions of HPUX. - -Thu Dec 26 15:14:41 1996 Michael Snyder <msnyder@cleaver.cygnus.com> - - * sparclet-rom.c: Remove includes of Unix system files. - Add function "sparclet_supply_register" so that parse_register_dump - will not seg-fault by calling a null function pointer. - Remove XMODEM support (unfinished work?). - Remove flag "MO_HANDLE_NL", so monitor's output can be read by humans. - Add fill command. - Remove colon from getreg.resp_delim so PSR register will work. - Remove pointer to sparclet_load (downloading SREC's doesn't work). - Null out local register names for %g0, all %cc and all %asr regs, - since the monitor can't report them. Will return zero instead. - * sparclet-stub.c: New -- remote protocol support for sparclet CPU. - * config/sparc/tm-sparclet.h: Re-arrange REGISTER_NAMES: - Add back %g0 and %psr, add %cc coprocessor regs, add %asr regs. - Adjust NUM_REGS and REGISTER_BYTES accordingly - -Tue Dec 24 10:27:37 1996 Jeffrey A Law (law@cygnus.com) - - * remote-e7000.c (want_h8300h, want_nopc_h8300h): Renamed - from want and want_nopc. - (want_h8300s, want_nopc_h8300s): New variables for H8/S register - lists. - (e7000_fetch_registers): Use H8/300H or H8/S register list string - as needed. - (e7000_wait): Likewise. - -Mon Dec 23 02:25:58 1996 Peter Schauer (pes@regent.e-technik.tu-muenchen.de) - - * mips-tdep.c (mips_find_saved_regs): If a frame has been - interrupted by a signal, figure out whether the registers that - the proc_desc claims are saved have been saved yet. - (mips_push_dummy_frame): Write dummy frame register after all - registers have been saved in the dummy frame. Update comments - to reflect the fact that we are now using an AT_ENTRY_POINT - call dummy. - -Sun Dec 22 15:52:25 1996 Martin M. Hunt <hunt@pizza.cygnus.com> - - * d10v-tdep.c (d10v_skip_prologue): PR11287. Fix problem where - some breakpoints weren't being set. - -Sat Dec 21 12:57:59 1996 Peter Schauer (pes@regent.e-technik.tu-muenchen.de) - - * config/mips/tm-mips.h (PC_IN_CALL_DUMMY): Removed, the default - definition in inferior.h is sufficient. - * mips-tdep.c (mips_pc_in_call_dummy): Ditto. - (mips_push_arguments): Make sure that the stack is aligned to a - multiple of 8 after the arguments are pushed. - Structures are always passed by value in the old ABI. - Adjust argument register value on big endian targets when passing - a value whose length is less than the register size. - Write stack arguments with a single write_memory call. - (mips_pop_frame): Use frame_saved_regs instead of proc_desc to - decide which registers have to be restored. - - * irix5-nat.c (fill_gregset): Sign extend registers before - filling in the gregset structure. - -Fri Dec 20 11:06:03 1996 Stu Grossman (grossman@critters.cygnus.com) - - * mswin/genmakes: Don't define _DEBUG. This breaks wingdb. - -Thu Dec 19 19:42:44 1996 Michael Meissner <meissner@tiktok.cygnus.com> - - * v850-tdep.c (v850_scan_prologue): Deal with -mep shorting - register saves by using the ep register. - -Thu Dec 19 15:57:16 1996 Doug Evans <dje@canuck.cygnus.com> - - * m32r-tdep.c (m32r_frame_find_saved_regs): Fix thinko in arg def. - -Thu Dec 19 09:38:56 1996 Mark Alexander <marka@cygnus.com> - - * values.c (unpack_double): Make it compile with MSVC++ 2.x. - * remote-mips.c (S_IROTH): Define if not defined by stat.h, e.g. - when using MSVC++. - (common_open): Fix help string. - -Wed Dec 18 23:01:32 1996 Stan Shebs <shebs@andros.cygnus.com> - - * mpw-make.sed: Use NewFolderRecursive for installation. - -Sat Dec 14 20:50:01 1996 Mark Alexander <marka@cygnus.com> - - * mips-tdep.c (mips_push_arguments): Handle floating point args. - * config/mips/tm-mips.h (FIX_CALL_DUMMY): Define to set up $25 - correctly for PIC on Irix 5. - -Sat Dec 14 09:52:30 1996 Peter Schauer (pes@regent.e-technik.tu-muenchen.de) - - * i386-tdep.c (i386_frame_find_saved_regs): Handle zero return - from get_pc_function_start gracefully. - -Sat Dec 14 00:43:57 1996 Peter Schauer (pes@regent.e-technik.tu-muenchen.de) - - * c-exp.y (qualified_name): Replace explicit check for valid - destructor name with call to destructor_name_p. - - * c-lang.h, c-typeprint.c (cp_type_print_method_args): Removed, - no longer needed. - - * c-typeprint.c (c_type_print_varspec_prefix, c_type_print_base): - Replace remaining fprintf_unfiltered calls with their filtered variant. - (c_type_print_base): Do not print return type for destructors from - template classes. - Replace cp_type_print_method_args with cplus_demangle call to get - consistent type output for stubbed and unstubbed methods. - - * cp-valprint.c (cp_print_class_method): Replace - cp_type_print_method_args with cplus_demangle call to get consistent - type output for stubbed and unstubbed methods. - - * gdbtypes.c, gdbtypes.h (get_destructor_fn_field): New function - to find the destructor field indices for a type. - - * gdbtypes.h (struct type): Clarify comments for vptr_basetype - and arg_types fields. - (struct fn_field): Remove args field, no longer used. - - * symtab.c (decode_line_1), valops.c (value_struct_elt, - check_field_in): Use get_destructor_fn_field to find the destructor - field indices instead of assuming that the compiler passes the member - function fields in a specific order. - - * symtab.c (find_methods): Pass NULL instead of SYMBOL_BLOCK_VALUE - to lookup_symbol. - (list_symbol): Replace cp_type_print_method_args with cplus_demangle - call in zapped out code and explain why this code is zapped out. - -Thu Dec 12 13:29:14 1996 Michael Meissner <meissner@tiktok.cygnus.com> - - * config/powerpc/ppc{,le}-sim.mt (SIM): Add the simulator common - library ../sim/common/libcommon.a. - -Wed Dec 11 11:15:08 1996 Doug Evans <dje@canuck.cygnus.com> - - * monitor.c (monitor_load): Add support for load address argument. - * dsrec.c: #include <time.h>. - (load_srec): New argument load_offset. Print download stats. - * srec.h (load_srec): Update prototype. - * sh3-rom.c (sh3_load): Update call to load_srec. - -Mon Dec 9 17:34:05 1996 Geoffrey Noer <noer@cygnus.com> - - * config/mn10300/tm-mn10300.h: more small register fixes - * mn10300-tdep.c: filled in from another target - -Mon Dec 9 17:12:19 1996 Doug Evans <dje@canuck.cygnus.com> - - * monitor.c (monitor_insert_breakpoint): Handle bi-endian machines. - -Mon Dec 9 15:58:51 1996 Mark Alexander <marka@cygnus.com> - - * config/mips/tm-mips.h: Get rid of call-dummy code. - Minor changes to make pre-ANSI compilers happy. - * mips-tdep.c: Minor changes to make pre-ANSI compilers happy. - (mips_push_arguments): Rewrite to partially support EABI. - (mips_pc_in_call_dummy): New function. - * infcmd.c: Include symfile.h to get prototype of entry_point_address, - which fixes 64-bit sign extension bug on MIPS. - -Mon Dec 9 00:14:49 1996 Geoffrey Noer <noer@cygnus.com> - - * config/mn10300/tm-mn10300.h: fix register names - * mn10300-tdep.c: new skeleton tdep for mn10300 - -Sun Dec 8 18:02:57 1996 Doug Evans <dje@canuck.cygnus.com> - - * remote-sim.h: Update some comments. - * remote-sim.c (gdb_os_error): New function. - (init_callbacks): Fix initializing of gdb_callback. Add gdb_os_error. - (gdb_os_printf_filtered): Use gdb_stdout, not stdout. - -Sun Dec 8 00:36:31 1996 Peter Schauer (pes@regent.e-technik.tu-muenchen.de) - - * irix5-nat.c (supply_gregset, fill_gregset): Handle gregsets - from O32 and N32 ABI. - (xfer_link_map_member): Work around problem with alignments - in struct obj when compiling GDB under N32 ABI. - -Thu Dec 5 23:30:44 1996 Stan Shebs <shebs@andros.cygnus.com> - - * d10v-tdep.c: Add support for examination and interpretation - of instruction trace buffer. - (trace, untrace, info trace, tdisassemble): New commands. - -Thu Dec 5 14:06:23 1996 Doug Evans <dje@canuck.cygnus.com> - - * config/sparc/tm-sparclet.h (TARGET_BYTE_ORDER): Undef. - (TARGET_BYTE_ORDER_SELECTABLE): Define. - (BREAKPOINT): Undef. - ({BIG,LITTLE}_BREAKPOINT): Define. - (TM_PRINT_INSN_MACH): Redefine for sparclet. - -Wed Dec 4 16:34:05 1996 Geoffrey Noer <noer@cygnus.com> - - * config/mn10300/mn10300.mt, config/mn10300/tm-mn10300.h: New. - -Tue Dec 3 13:02:08 1996 Fred Fish <fnf@ninemoons.com> - - * infptrace.c (store_inferior_registers): Move some common code out - to store_register, like fetch_inferior_registers & fetch_register. - (store_register): New function, from store_inferior_registers. - (fetch_inferior_registers, fetch_register): Minor code tweaks to - make {fetch,store}_inferior_registers and {fetch,store}_register - routines as similar in structure as possible. - (fetch_inferior_registers, store_inferior_registers): Eliminate - local variable numregs and just use ARCH_NUM_REGS directly. - -Tue Dec 3 11:38:14 1996 Michael Snyder <msnyder@cleaver.cygnus.com> - - * blockframe.c: add macro USE_GENERIC_DUMMY_FRAMES to enable/disable - code for generic call_dummy frames. - * config/h8300/tm-h8300.h: turn on USE_GENERIC_DUMMY_FRAMES - * config/m32r/tm-m32r.h: Ditto. - * config/sh/tm-sh.h: Ditto. - * config/v850/tm-v850.h: Ditto. - -Sun Dec 1 00:41:47 1996 Peter Schauer (pes@regent.e-technik.tu-muenchen.de) - - * vax-tdep.c (vax_print_insn, print_insn_arg): Use info functions - for printing. From Valeriy Ushakov <uwe@ptc.spbu.ru>. - -Sun Dec 1 00:40:46 1996 Geoffrey Noer <noer@cygnus.com> - - * configure.tgt: Add new mn10300 entry. - -Sun Dec 1 00:18:59 1996 Peter Schauer (pes@regent.e-technik.tu-muenchen.de) - - Add support for Irix 6.2 native O32 and N32 ABI. - - * config.in, configure.in, configure: Check for <objlist.h>. - * configure.tgt: Handle mips*-sgi-irix6* like irix5 for now. - - * cp-valprint.c (cp_print_value_fields): Use SYMBOL_VALUE_ADDRESS - instead of SYMBOL_BLOCK_VALUE to get the address of a static member. - - * dwarf2read.c: Turn warnings and recoverable errors into complaints, - add new complaints where appropriate. - gcc -Wall cleanup. - (struct line_head): Change line_base from char to int to avoid - problems with compilers whose plain char is represented by an - unsigned char. - (struct partial_die_info): Add is_declaration field. - (dwarf2_tmp_obstack): New obstack for allocating temporary storage - used during symbol reading. - (cu_header_offset): New variable for resolving relative reference - dies. - (optimized_out, basereg, islocal, frame_base_reg, frame_base_offset): - New interface variables for decode_locdesc. - (struct dwarf2_pinfo): New structure for communication between - psymtab and symtab reading, passed via pst->read_symtab_private. - (dwarf2_has_info, dwarf2_build_psymtabs): Accept objects files - without line number sections. - (dwarf2_build_psymtabs_hard): Initialize temporary obstack - for symbol reading. - Allocate and initialize pst->read_symtab_private. - Relocate pst->textlow and pst->texthigh with baseaddr. - (scan_partial_symbols): Do not add DW_AT_declaration symbols - to the partial symbol table. - Add file scope enumerator symbols to the partial symbol table. - Fix typo in highpc computation. - If we didn't find a lowpc, set it to highpc to avoid complaints - from `maint check. - (add_partial_symbol): Relocate symbol values with baseaddr. - Add static DW_TAG_subprogram and DW_TAG_variable symbols to the - minimal symbol table. - Obtain symbol values for DW_TAG_variable symbols from the location - descriptor, skip symbols with missing location desciptors. - Skip symbols for aggregate types without children. - Handle enumerator symbols. - (dwarf2_psymtab_to_symtab): Issue symbol reading message if verbose. - (psymtab_to_symtab_1): Set local variables from - pst->read_symtab_private, set cu_header_offset and baseaddr. - Initialize temporary obstack for symbol reading, initialize - buildsym and add a cleanup to really_free_pendings. - Relocate highpc with baseaddr when calling end_symtab. - If the compilation is from a C file generated by language - preprocessors, do not set the symtab language if it was already - deduced by start_subfile. - Removed verbose sorting symbol table message. - (process_die): Handle DW_TAG_ptr_to_member_type and - DW_TAG_reference_type. - Use read_subroutine_type to get the function type for - DW_TAG_subprogram before calling read_func_scope. - (read_file_scope): Initialize file name to <unknown>, start_subfile - expects a non-NULL name. - If we didn't find a lowpc, set it to highpc to avoid complaints - from finish_symbol. - Relocate lowpc and highpc with baseaddr. - Get rid of Irix6.2 native cc compile machine prefix in comp_dir. - Zero out ftypes for each new compilation unit (may be different - language or different objfile). - Accept compilation units without line number information, pass - comp_dir to decode_lines. - (read_func_scope): Initialize function name to <unknown> to avoid - core dumps when DW_AT_name is missing. - Relocate lowpc and highpc with baseaddr. - Handle DW_AT_frame_base, keep result for DW_OP_fbreg operations. - Pass function type to new_symbol. - (read_lexical_block_scope): Relocate lowpc and highpc with baseaddr. - (read_structure_scope): Set TYPE_TAG_NAME, not TYPE_NAME. - Handle DW_TAG_class_type. - Copy fields to type_obstack, release temporary storage for fields. - Don't add symbol if die is a stub die and has no children. - Handle C++ static member fields. - (read_enumeration): Set TYPE_TAG_NAME, not TYPE_NAME. - Copy fields to type_obstack, release temporary storage for fields. - Let new_symbol handle the symbol creation for enumerators - instead of handcrafting a symbol. - Determine signedness of enum type from enumerators. - (dwarf_read_array_type): Handle variable length arrays. - Use lookup_pointer_type instead of handcrafting a type. - Create array type only if a DW_TAG_subrange_type was found. - (read_tag_pointer_type, read_tag_reference_type): - Use lookup_pointer_type and lookup_reference_type instead - of handcrafting a type. - (read_tag_ptr_to_member_type): New function to handle - DW_TAG_ptr_to_member_type. - (read_subroutine_type): Handle parameter dies. - Use lookup_function_type instead of handcrafting a type. - (read_typedef): Allocate a TYPE_CODE_TYPEDEF type for the typedef. - (read_base_type): If the type has a name, use init_type to create - a new type instead of second guessing a fundamental type. - (read_comp_unit): Reset die reference table before building - a new one. - (dwarf2_read_section): Read section contents into psymbol_obstack. - (dwarf2_read_abbrevs): Handle unterminated abbreviations - for a compile unit gracefully. - (read_partial_die): Zero partial die before reading its info. - Handle DW_AT_declaration. - Fix typo in handling of DW_FORM_block4. - (read_full_die): Fix typo in handling of DW_FORM_block4. - (read_1_signed_byte, read_2_signed_bytes, read_4_signed_bytes): - New routines to get signed values from a buffer. - (read_n_bytes, read_string): Allocate storage from the temporary - obstack. If the host char size permits it, return pointer - to buffer instead of allocating storage. - (set_cu_language): Handle DW_LANG_Mips_Assembler. - (dwarf_attr): Return NULL if reference die for DW_AT_specification - or DW_AT_abstract_origin die is not found. - (record_minimal_symbol): Removed, replaced with a direct call to - prim_record_minimal_symbol, it now handles saving the string itself. - (convert_locdesc): Removed, partial symtab reading now uses - decode_locdesc. - (dwarf_attr): Use dwarf2_get_ref_die_offset to get the absolute - offset for the die reference. - (dwarf_decode_lines): Complain if the line section info is missing. - Use read_1_signed_byte to extract lh.line_base to avoid - problems with compilers whose plain char is represented by an - unsigned char. - Add cleanups for allocated temporary storage. - Start a subfile for the first file in the state machine. - Fix off by one problem with dirs.dirs access. - Use comp_dir when directory index is 0. - Support multiple sequences (from Jason Merrill <jason@cygnus.com>). - (dwarf2_start_subfile): Try to keep line numbers from identical - absolute and relative file names in a common subfile. - (new_symbol): Allocate symbol and symbol name on the symbol_obstack. - Set SYMBOL_LINE from DW_AT_decl_line if present. - Set SYMBOL_TYPE from passed type if not NULL. - Change DW_TAG_variable symbol types with missing type entries - to a sensible type. - Handle optimized_out, offreg and islocal storage classes. - Add external symbols with type information whose address isn't - known as LOC_UNRESOLVED symbols. - Synthesize typedefs for C++ classes, structs, unions and enumerations. - Handle DW_TAG_enumerator symbols, complain for unrecognized - symbol tags. - (die_type): A missing DW_AT_type represents a void type. - Use dwarf2_get_ref_die_offset to get the absolute offset for - the die reference. - (die_containing_type): New function to build type from - DW_AT_containing_type attribut. - (read_type_die): Handle DW_TAG_ptr_to_member_type. - Treat DW_TAG_subprogram like DW_TAG_subroutine_type. - (dwarf_base_type): Fix typo with creation of FT_UNSIGNED_SHORT - fundamental type. - (create_name): Removed, symbol name allocation is now done - in new_symbol. - (dump_die): Use print_address_numeric to print a CORE_ADDR. - (dwarf2_empty_die_ref_table): New function to clear the die - reference table. - (dwarf2_get_ref_die_offset): New function to get the absolute - die offset from a die reference attribute. - (decode_locdesc): Complete rewrite using a stack, code mostly - borrowed from dwarfread.c:locval. - (dwarf_alloc_type): Removed, replaced by direct calls to alloc_type. - (dwarf_alloc_block): Allocate block on temporary obstack. - - * elfread.c (elf_symtab_read): When handling Irix dynamic symbols, - skip section name symbols and relocate all others. - (elf_symfile_read): Build dwarf2 psymtab even if offset is non-zero. - - * irix5-nat.c (fetch_core_registers): Handle core_reg_sect - from N32 executables. Call registers_fetched after extracting - the registers. - (obj_list_variant, struct link_map, LM_OFFSET, LM_ADDR): New - definitions to enable support of O32 and N32 format objlists. - (struct so_list): New members offset, so_name and lmstart to - eliminate dependencies from the objlist format used. - (solib_map_sections, symbol_add_stub, solib_add, - info_sharedlibrary_command, solib_address, clear_solib): Use - so_name and LM_OFFSET. - (first_link_map_member): Rewrite to enable support of O32 and N32 - format objlists. - (next_link_map_member, xfer_link_map_member): New functions to - support O32 and N32 format objlists. - (find_solib): Use first_link_map_member, next_link_map_member and - xfer_link_map_member. - (solib_create_inferior_hook): Use TARGET_SIGNAL_* instead of - host signal numbers. - - * mdebugread.c (parse_partial_symbols, handle_psymbol_enumerators): - Pass CORE_ADDR variant to add_psymbol_to_list. - - * mips-tdep.c (heuristic_proc_desc): Stop examining the prologue - if we encounter a positive stack adjustment. Handle `move $30,$sp'. - Handle `sd reg,offset($sp)' for 32 bit ABIs. - - * symmisc.c (dump_msymbols, print_partial_symbols): Use - print_address_numeric to print a SYMBOL_VALUE_ADDRESS. - (dump_symtab): Print compilation directory if it is not NULL. - - * valops.c (search_struct_field, value_struct_elt_for_reference): - Use SYMBOL_VALUE_ADDRESS instead of SYMBOL_BLOCK_VALUE to get the - address of a static member. - -Thu Nov 28 00:46:24 1996 Peter Schauer (pes@regent.e-technik.tu-muenchen.de) - - * vax-tdep.c (vax_print_insn): Made static, modified to take - disassemble_info as parameter. - (_initialize_vax_tdep): New function to initialize tm_print_insn - to vax_print_insn. - -Wed Nov 27 11:29:06 1996 Michael Snyder <msnyder@cleaver.cygnus.com> - - * blockframe.c: Remove old-style CALL_DUMMY code. - * h8300-tdep.c, config/h8300/tm-h8300.h: Ditto. - * m32r-tdep.c, config/m32r/tm-m32r.h: Ditto. - * sh-tdep.c, config/sh/tm-sh.h: Ditto. - * v850-tdep.c, config/v850/tm-v850.h: Ditto. - -Wed Nov 27 10:32:14 1996 Michael Snyder <msnyder@cleaver.cygnus.com> - - * breakpoint.c: DELETE command will not delete CALL_DUMMY breakpoint. - * blockframe.c: Add target-independant support for managing - CALL_DUMMY frames on the host side. - * frame.h: Declarations for generic CALL_DUMMY frame support. - * h8300-tdep.c: Add target function calls using generic frame support. - * config/h8300/tm-h8300.h: config for generic target function calls. - * m32r-tdep.c: Add target function calls using generic frame support. - * config/m32r/tm-m32r.h: config for generic target function calls. - * sh-tdep.c: Add target function calls using generic frame support. - * config/sh/tm-sh.h: config for generic target function calls. - * v850-tdep.c: Add target function calls using generic frame support. - * config/v850/tm-v850.h: config for generic target function calls. - * valops.c: ADD PUSH_RETURN_ADDRESS so that it doesn't have to be - done by PUSH_ARGUMENTS when there's no CALL_DUMMY. - -Tue Nov 26 19:21:35 1996 Mark Alexander <marka@cygnus.com> - - * config/mips/tm-mips.h (ADDR_BITS_REMOVE, TARGET_READ_SP): Define. - (mips_addr_bits_remove): Declare. - * mips-tdep.c (mips_push_dummy_frame): Fix heuristic-fence-post - errors when hitting breakpoints during inferior function calls - in 64-bit programs. - (fix_sign_extension): Make public, rename to mips_addr_bits_remove. - * utils.c (paddr_nz, preg_nz): New functions, similar to - paddr and preg but don't print leading zeroes. - * defs.h (paddr_nz, preg_nz): Declare. - * remote-mips.c: Use paddr_nz instead of paddr throughout - to reduce packet size. - (pmon_end_download): Improve timeout error handling. - -Tue Nov 26 17:21:37 1996 Ian Lance Taylor <ian@cygnus.com> - - * configure: Rebuild with autoconf 2.12. - -Mon Nov 25 13:17:16 1996 Fred Fish <fnf@ninemoons.com> - - From: Paul Eggert <eggert@twinsun.com> - * remote-bug.c (wait_strings): Avoid creating a trigraph. - -Fri Nov 22 15:55:22 1996 Martin M. Hunt <hunt@pizza.cygnus.com> - - * valops.c (value_at, value_fetch_lazy): Put in D10V call - to fix up address pointers. - * values.c (value_from_longest): Removed previous d10v changes. - * config/d10v/tm-d10v.h (TARGET_PTR_BIT): Change to 4 bytes. - -Fri Nov 22 10:06:19 1996 Peter Schauer (pes@regent.e-technik.tu-muenchen.de) - - * config/i386/nm-i386v4.h (LOSING_POLL): Define, needed for - Unixware 1.1.2. - -Thu Nov 21 19:13:58 1996 Mark Alexander <marka@cygnus.com> - - * mips-tdep.c: Replace hard-coded constants with MIPS_INSTLEN. - (common_breakpoint): Use paddr instead of %x to print 64-bit values. - (heuristic_proc_desc): Add tests for 64-bit instructions. - (init_extra_frame_info, mips_push_arguments): Recognize additional - registers for EABI. - * remote-mips.c: Extend DDB target to allow TFTP downloads. - * config/mips/tm-mips.h (MIPS_LAST_ARG_REGNUM, MIPS_NUM_ARG_REGS): - Define. - -Wed Nov 20 19:09:16 1996 Martin M. Hunt <hunt@pizza.cygnus.com> - - * infcmd.c (do_registers_info): Call val_print with the - virtual buf instead of the raw buf. Needed for REGISTER_CONVERT - to work with non-floating point regs. - - * d10v-tdep.c (d10v_skip_prologue): If we have line debugging - information, then the end of the prologue should the first - assembly instruction of the first source line. - - * values.c (value_from_longest): Put in D10V call to - fix up address pointers. - - * config/d10v/tm-d10v.h (REGISTER_VIRTUAL_SIZE): Modified. - (REGISTER_VIRTUAL_TYPE): Modified for PC_REGNUM and SP_REGNUM. - (REGISTER_CONVERTIBLE): Make PC and SP convertible. - (REGISTER_CONVERT_TO_VIRTUAL): Define. - (REGISTER_CONVERT_TO_RAW): Define. - (D10V_MAKE_DADDR): Define. - (D10V_MAKE_IADDR): Define. - -Wed Nov 20 16:15:15 1996 Geoffrey Noer <noer@cygnus.com> - - * config/i386/cygwin32.mh: add MMALLOC_CFLAGS = -I$(MMALLOC_SRC) - -DMMCHECK_FORCE=1 so memory checks are loaded for cygwin32 gdb - -Wed Nov 20 00:43:09 1996 Doug Evans <dje@canuck.cygnus.com> - - * callback.h: Delete, moved to ../include. - * callback.c: Delete, moved to ../sim/common. - * Makefile.in (SFILES,COMMON_OBJS): Delete callback.[co]. - (callback.o): Delete rule. - * remote-sim.h: No longer include callback.h. - (sim_callback_write_stdout): Delete prototype. - * remote-sim.c (init_callbacks,end_callbacks): New functions. - (gdb_os_write_stdout, gdb_os_printf_filtered): New functions. - (gdb_callback, callbacks_initialized): New static globals. - (gdbsim_open): Call init_callbacks. - (gdbsim_close): Call end_callbacks. - (simulator_command): Call init_callbacks. - - * config/h8300/h8300.mt (SIM): Change to ../sim/h8300/libsim.a. - * config/h8500/h8500.mt (SIM): Change to ../sim/h8500/libsim.a. - -Mon Nov 18 15:58:05 1996 Jim Wilson <wilson@cygnus.com> - - * config/mips/tm-mips.h (FIX_CALL_DUMMY): Change unsigned LONGEST - to ULONGEST. - -Fri Nov 15 15:34:18 1996 Fred Fish <fnf@cygnus.com> - - From Peter Schauer <Peter.Schauer@Regent.E-Technik.TU-Muenchen.DE> - * procfs.c (wait_fd): Handle EINTR error return from poll - by restarting the poll. - * defs.h (PIDGET): Define a default version that just - returns its argument unchanged. - * inflow.c (terminal_init_inferior): Eliminate #ifdef - of PIDGET and fold both alternatives into common code. - (pass_signal): Use PIDGET for pid passed to kill(). - -Thu Nov 14 15:54:20 1996 Michael Meissner <meissner@tiktok.cygnus.com> - - * utils.c (paddr,preg): Use a static variable initialized to 32 - instead of doing addr>>32 to eliminate a warning produced by GCC - on 32-bit systems. - - * config/d10v/tm-d10v.h (ULONGEST): Define. - -Tue Nov 12 12:25:27 1996 Jim Wilson <wilson@cygnus.com> - - * c-typeprint.c (cp_type_print_method_args): Pass -1 for show in - recursive call to type_print. - -Tue Nov 12 12:18:29 1996 Jim Wilson <wilson@cygnus.com> - - * defs.h (ULONGEST): New macro. - * alpha-tdep.c, breakpoint.c, c-exp.y, ch-exp.c, convex-xdep.c, - corefile.c, defs.h, f-exp.y, findvar.c, gdbcore.h, m2-exp.y, - m88k-tdep.c, printcmd.c, remote-hms.c, remote-mips.c, sparc-tdep.c, - valarith.c, valops.c, values.c, config/gould/tm-np1.h, - config/mips/tm-mips.h, mswin/prebuilt/gdb/cexptab.c, - mswin/prebuilt/gdb/fexptab.c, mswin/prebuilt/gdb/m2exptab.c: - Change all occurances of unsigned LONGEST to ULONGEST. - - * configure.host (mips-sgi-irix6): Add. - -Tue Nov 12 12:16:40 1996 Michael Snyder <msnyder@cleaver.cygnus.com> - - * sh-tdep.c: Add functionality for target function calls. - * config/sh/tm-sh.h: Add support for target function calls. - -Tue Nov 12 12:06:58 1996 Michael Snyder <msnyder@cleaver.cygnus.com> - - * m32r-tdep.c: Add functionality for target function calls. - * valops.c: Small change to support target function calls. - * config/m32r/tm-m32r.h: Add support for target function calls. - -Mon Nov 11 17:15:59 1996 Geoffrey Noer <noer@cygnus.com> - - * defs.h: Modify Nov 11 12:59:00 change so _MSC_VER is checked - instead of _WIN32. - * win32-nat.c: Fix Nov 11 12:59:00 change (windows.h should - be included instead of windefs.h for compilers other than - VC++). - * mswin/windefs.h: Remove ^Ms and change C++ style comments - to C style comments. - -Mon Nov 11 14:32:38 1996 Mark Alexander <marka@cygnus.com> - - * utils.c (get_cell): Fix off-by-one bug. - * mips-tdep.c (get_frame_pointer, fix_sign_extension): - New functions to consolidate common code. - (mips_frame_chain, init_extra_frame_info): Use new functions - to fix problems with backtrace and finish commands on ddb board. - -Mon Nov 11 12:59:00 1996 Dawn Perchik <dawn@critters.cygnus.com> - - * mips-tdep.c, remote-mips.c, values.c, mdebugread.c, - config/mips/tm-mips.h: Add/fix bugs for 64-bit mips support. - * defs.h: Cleanup; add prototypes. - * corefile.c: Change FIXME #ifdef - * win32-nat.c: Include windefs instead of windows.h. - * utils.c: Add routines for printing addresses and registers - based on type size. - -Sat Nov 9 01:05:10 1996 Peter Schauer (pes@regent.e-technik.tu-muenchen.de) - - * alpha-tdep.c (heuristic_proc_desc): Stop examining the prologue - if we encounter a positive stack adjustment. - (find_proc_desc): If heuristic_fence_post is non-zero, use - heuristic_proc_start to determine the start of a function before - calling heuristic_proc_desc. - - * coffread.c (coff_symtab_read): Change minimal symbol types - for C_LABEL symbols from mst_* to mst_file_*. - - * config/m68k/sun3os4.mh (MMALLOC_CFLAGS): Define MMCHECK_FORCE to 1. - - * configure.in: Handle error message from sun3 native ld when - configuring HLDFLAGS. - * configure: Regenerated with autoconf. - - * c-valprint.c (c_value_print): Adjust value address by VALUE_OFFSET. - * cp-valprint.c (cp_print_value): Prevent gdb crashes by making sure - that the virtual base pointer from an user object still points to - accessible memory. - - * dbxread.c (dbx_symfile_init): Initialize sym_stab_info to - clear the recently added header_files fields. - (dbx_symfile_finish): Free hfiles[i].vector to avoid storage leak. - -Fri Nov 8 14:30:23 1996 Michael Snyder <msnyder@cleaver.cygnus.com> - - * config/tm-sh.h: Added a missing comma in middle of - REGISTER_NAMES list. - -Fri Nov 8 12:29:51 1996 Stan Shebs <shebs@andros.cygnus.com> - - * monitor.c: Fix some formatting and comments. - - * remote-sim.c (simulator_command): Set up callbacks before - entering the simulator. - -Thu Nov 7 15:19:08 1996 Martin M. Hunt <hunt@pizza.cygnus.com> - - * d10v-tdep.c: Fix some problems with inferior function calls. - * config/d10v/tm-d10v.h (EXTRA_FRAME_INFO): Change dummy to be - a pointer to the dummy's stack instead of just a flag. - -Tue Nov 5 10:21:02 1996 Michael Snyder <msnyder@cleaver.cygnus.com> - - * m32r-tdep.c: Improved frame_chain and fn prologue analysis. - * config/tm-m32r.h: Add framesize and register to extra_frame_info. - -Tue Nov 5 10:08:07 1996 Stu Grossman (grossman@critters.cygnus.com) - - * mswin/gdbwin.h: Remove bogus definition of CORE_ADDR. - * mswin/srcwin.cpp (CSrcScroll1::CSrcScroll1): Initialize depth - to fix divide-by-zero problem with clicking on source window. - -Mon Nov 4 00:48:37 1996 Stu Grossman (grossman@critters.cygnus.com) - - * mswin/recordit: Fix problem with absolute paths. - * mswin/recordit: Fix problem with relative paths. - -Sun Nov 3 18:06:42 1996 Stu Grossman (grossman@critters.cygnus.com) - - * mswin/{Makefile.in configure configure.in}: New files for - configuring wingdb under Unix. - -Sat Nov 2 03:54:13 1996 Peter Schauer (pes@regent.e-technik.tu-muenchen.de) - - * irix5-nat.c, osfsolib.c, solib.c (symbol_add_stub): Handle - missing or zero-sized .text sections properly. - * mdebugread.c: Handle scRConst and scSUndefined storage classes. - * stabsread.c (scan_file_globals): Try to resolve symbols - for shared libraries from the minimal symbol table of the main - executable first. - -Fri Nov 1 13:59:28 1996 Martin M. Hunt <hunt@pizza.cygnus.com> - - * d10v-tdep.c, config/d10v/tm-d10v.h: Major fixes to support - inferior function calls and proper stack backtracing on D10V-EVA - board. - -Fri Nov 1 10:50:51 1996 Michael Meissner <meissner@tiktok.cygnus.com> - - * config/powerpc/linux.mh (NATDEPFILES): Fix up things so that it - links. - (GDBSERVER_DEPFILES,TERMCAP): Ditto. - - * monitor.c (dev_name,targ_ops): Move static variables before - first use, to avoid compiler warnings. - -Thu Oct 31 16:37:17 1996 Michael Snyder <msnyder@cleaver.cygnus.com> - - * m32r-tdep.c: Improved frame_chain and fn prologue analysis. - * configure.tgt: Add entry for m32r target. - * monitor.h: Add a flag to tell monitor_store_register to use - (val, regno) instead of (regno, val). - * monitor.c: Make monitor_store_register honor the above flag. - Make monitor_exp ignore DC1/DC3 for m32r. - Increase buf size in monitor_dump_regs. - -Wed Oct 30 18:14:14 1996 Michael Snyder <msnyder@cleaver.cygnus.com> - - * m32r-tdep.c, m32r-rom.c: New files. - * config/m32r/m32r.mt: New file. - * config/m32r/tm-m32r.h: New file. - -Tue Oct 29 16:56:01 1996 Geoffrey Noer <noer@cygnus.com> - - * config/i386/xm-cygwin32.h: - * config/powerpc/xm-cygwin32.h: - add #define LSEEK_NOT_LINEAR so source lines aren't unexpectedly - truncated. - -Tue Oct 29 18:36:43 1996 Michael Meissner <meissner@tiktok.cygnus.com> - - * config/powerpc/tm-ppc-eabi.h (TARGET_BYTE_ORDER_SELECTABLE): - Define. - -Tue Oct 29 14:59:20 1996 Stan Shebs <shebs@andros.cygnus.com> - - * TODO: Add item suggesting an "info bfd" command. - -Tue Oct 29 12:48:04 1996 Martin M. Hunt <hunt@pizza.cygnus.com> - - * d10v-tdep.c: Snapshot that supports D10V-EVA board. - - * config/d10v/tm-d10v.h (REGISTER_NAMES): Add imap0,imap1,dmap. - (TARGET_READ_FP,TARGET_WRITE_FP): Define. - -Mon Oct 28 17:34:24 1996 Stu Grossman (grossman@critters.cygnus.com) - - * mswin/genmakes mswin/recordit: New scripts to generate make - files for MSVC. - -Sun Oct 27 20:18:04 1996 Mark Alexander <marka@cygnus.com> - - * config/mips/{tm-vr5000.h,tm-vr5000el.h,vr5000.mt,vr5000el.mt}: - New files. - * configure.tgt: Modify cases for vr5000 to use new files. - -Sat Oct 26 07:15:14 1996 Peter Schauer (pes@regent.e-technik.tu-muenchen.de) - - * config/alpha/alpha-osf3.mh (XM_CLIBS): Add -lm for OSF/1-4.0. - - * procfs.c (proc_set_exec_trap): Under Alpha OSF/1-4.0, tracing - the entry to the exit system call to detect termination of the - inferior stopped working. Trace termination of the inferior via - PRFS_STOPTERM instead. - (procfs_init_inferior): Do not trace entry to exit system call - if PIOCSSPCACT is defined. - (procfs_wait): Handle PR_DEAD event, which signals the termination - of the inferior if PRFS_STOPTERM is set. - - * mdebugread.c (parse_partial_symbols): Ignore stNil section - start address symbols. - - * sparc-tdep.c (get_saved_register): Get saved PC from the - frame info if not in innermost frame. - -Thu Oct 24 10:51:45 1996 Mark Alexander <marka@cygnus.com> - - * dbxread.c (process_one_symbol): Interpret end-of-function - markers correctly; this fixes problem on Vr5000 where all - functions in a module had the same address. - * configure.in, configure.tgt, configure.host, gdbserver/configure.in: - Correct for pc-linux-gnu problem in config.guess. - * configure: Regenerate. - -Thu Oct 24 10:06:58 1996 Stu Grossman (grossman@critters.cygnus.com) - - * dbxread.c: Don't swap symbols in place, since internal and - external forms may have different sizes. Don't assume that an - internal_nlist has the same layout as an external_nlist. Create - symbol for n_strx element so to hide specifics of nlist from - partial-stab.h. - * partial-stab.h: Don't reference dbxread symbols directly. Use - CUR_SYMBOL_STRX instead. - * config/i386/xm-windows.h: Define SIGQUIT and SIGTRAP. - - * config/v850/tm-v850.h: Define PS_REGNUM and TARGET_V850 for - MSVC builds. - * mswin/gdbwin.c (reg_order): Define register order for V850. - * mswin/gui.cpp (CGuiApp::InitInstance): Define target name for - V850. - * mswin/regdoc.h: Define MAXREGS for V850. - -Tue Oct 22 16:28:20 1996 Stu Grossman (grossman@critters.cygnus.com) - - * v850-tdep.c (scan_prologue): Changes to deal with scheduled - prologues correctly. First, prologue end is now defined by - presence of a branch, jump or call insn. Second, can no longer - fix frame offsets because we may not know the offset until after a - register has been saved. - * (v850_init_extra_frame_info): Fixup frame offsets here because - we have all the info at this time. - * (v850_frame_chain): Use new calling convention for scan_prologue. - -Tue Oct 22 10:25:29 1996 Martin M. Hunt <hunt@pizza.cygnus.com> - - * d10v-tdep.c, config/d10v/tm-d10v.h: Changes to allow stack - backtraces and inferior function calls. - -Tue Oct 22 10:32:46 1996 Stan Shebs <shebs@andros.cygnus.com> - - * mpw-make.sed: Update init.c editing to work with Oct 8 change. - (@HLDFLAGS@): Always edit out. - -Mon Oct 21 18:17:08 1996 Mark Alexander <marka@cygnus.com> - - * mdebugread.c (parse_partial_symbols): Fix 64-bit - sign-extension problems in calculating psymtab addresses. - * buildsym.c (end_symtab): Use macro to pop context. - -Mon Oct 21 14:40:50 1996 Stu Grossman (grossman@critters.cygnus.com) - - * v850-tdep.c: Cleanup lots of things. Add many comments. - - * v850-tdep.c (v850_init_extra_frame_info v850_frame_chain): Fix - sign bugs with scanning prologues. Get a little smarter about - calculating the length of uninteresting instructions. - -Mon Oct 21 14:01:38 1996 Michael Snyder <msnyder@cleaver.cygnus.com> - - * top.c: Add new commands "set annotate" and "show annotate". - -Sun Oct 20 04:38:39 1996 Peter Schauer (pes@regent.e-technik.tu-muenchen.de) - - * corelow.c (core_close): Clear inferior_pid only if there is - an open core_bfd. - - * cp-valprint.c (cp_print_value_fields): Pass correct address - to val_print, not 0. - - From Andreas Schwab (schwab@issan.informatik.uni-dortmund.de): - * eval.c (evaluate_subexp_standard) [case BINOP_REPEAT]: Chase - typedefs before checking for integral type of right operand. - -Fri Oct 18 17:26:22 1996 Mark Alexander <marka@cygnus.com> - - * mdebugread.c (parse_symbol): Fix crash when malloc has - no type info and void type has no associated pointer type. - -Thu Oct 17 18:18:20 1996 Stan Shebs <shebs@andros.cygnus.com> - - * configure.host: New file, host configuration mapping. - * configure.tgt: New file, target configuration mapping. - * configure.in: Remove host and target mapping. - * configure: Rebuild. - -Wed Oct 16 17:46:03 1996 Stan Shebs <shebs@andros.cygnus.com> - - * breakpoint.c (must_shift_inst_regs): New global. - (bpstat_stop_status): Change #if uses of DECR_PC_AFTER_BREAK into - equivalent expression uses. - * infrun.c (wait_for_inferior): Ditto. - -Wed Oct 16 01:53:43 1996 Stu Grossman (grossman@critters.cygnus.com) - - * v850-tdep.c (v850_push_arguments): Use symbolic names for arg - registers. - * config/v850/tm-v850.h: Change FP to 29. Define arg regs. - -Tue Oct 15 16:30:07 1996 Stu Grossman (grossman@critters.cygnus.com) - - * Makefile.in (init.c): Don't use -s option with grep. It means - something different under Digital Unix. - - * buildsym.c (finish_block): Treat LOC_BASEREG_ARG and - LOC_LOCAL_ARG as arguments so that GDB will know about function - args declared this way. Mostly affects dwarf. - * dwarfread.c (decode_die_type): Change default type from int to - void. This allows GDB to recognize void functions. - * (new_symbol): If AT_PROTOTYPED is present, set a flag in the - type structure. - * findvar.c (extract_floating store_floating): Clean up comments - to reflect reality. - * gdbtypes.h: Add TYPE_FLAG_PROTOTYPED so that we can tell if a - function has a prototype. Currently, only dwarf supports this. - * utils.c (floatformat_from_doublest): Fix logic error with - converting from double to float. (It wasn't shifting mant_long if - it had a hidden bit.) - * v850-tdep.c: Add support for function calling. Fix some - problems with debugging code w/o debug symbols. - * config/v850/tm-v850.h: Ditto. - -Tue Oct 15 18:19:42 1996 Ian Lance Taylor <ian@cygnus.com> - - * utils.c: Always ensure that size_t is defined. Check - HAVE_STDDEF_H rather than __STDC__ - (xmalloc, xrealloc): Use size_t rather than long. - -Tue Oct 15 14:24:19 1996 Martin M. Hunt <hunt@pizza.cygnus.com> - - * config/powerpc/tm-ppc-eabi.h: Undefine NO_SINGLE_STEP so targets - can use single-step commands. - -Sun Oct 13 11:38:25 1996 Peter Schauer (pes@regent.e-technik.tu-muenchen.de) - - * stabsread.c (define_symbol): If REG_STRUCT_HAS_ADDR is non-zero, - follow typedefs before checking TYPE_CODE for structures and unions. - -Fri Oct 11 15:43:54 1996 Stu Grossman (grossman@critters.cygnus.com) - - * frame.h: Move definition of struct frame_saved_regs to before - struct frame to make it possible to use frame_saved_regs in - EXTRA_FRAME_INFO macro. - - * v850-tdep.c config/v850/tm-v850.h: Lotsa new functions and - macros to make frame operations (such as backtrace) work. - -Fri Oct 11 14:23:50 1996 Fred Fish <fnf@cygnus.com> - - * dbxread.c (process_one_symbol): Check for null string directly - rather than using strcmp against "". - * partial-stab.h: Ditto. - -Fri Oct 11 12:18:32 1996 Mark Alexander <marka@cygnus.com> - - * gdbserver/{gdbreplay.c,low-linux.c,remote-utils.c,utils.c}: - Make it compile on Linux and eliminate some warnings. - -Thu Oct 10 16:32:08 1996 Stu Grossman (grossman@critters.cygnus.com) - - * Makefile.in (init.c): Fixup final sed script to work around - Linux bug with `p' operator. - -Wed Oct 9 18:02:48 1996 Stan Shebs <shebs@andros.cygnus.com> - - * remote-mips.c: Use the correct name everywhere (DDB) for NEC's - VR4300 target. - (ddb_ops, pmon_ops): Fix the documentation strings. - -Wed Oct 9 07:42:44 1996 Stu Grossman (grossman@critters.cygnus.com) - - * Makefile.in (init.c): Retro HPUX grep lacks -h option. Strip - filenames with sed instead. - -Tue Oct 8 15:59:44 1996 Stu Grossman (grossman@critters.cygnus.com) - - * defs.h: Remove decls of xmalloc and xrealloc. There is a - conflicting definition in libiberty.h. - -Tue Oct 8 11:47:13 1996 Fred Fish <fnf@cygnus.com> - - * dbxread.c (dbx_symfile_read): Call free_pending_blocks rather - than poking global variable (which is now static). - * hpread.c (hpread_build_psymtabs): Ditto. - * os9kread.c (os9k_symfile_read): Ditto. - * xcoffread.c (xcoff_initial_scan): Ditto. - - * buildsym.h (free_pending_blocks): Declare here. - (pending_blocks): Remove declaration of global symbol. - (free_pendings): Remove declaration of global symbol. - (make_blockvector): Declare here. - (record_pending_block): Declare here. - - * dstread.c (make_blockvector): Remove static copy that was old - clone of version in buildsym.c. - (process_dst_block): Call record_pending_block rather than doing - it by hand. - (read_dst_symtab): Ditto. - - * buildsym.c (make_blockvector): Make global rather than static, - (record_pending_block): New function, code moved from finish_block. - (finish_block): Use record_pending_block. - (free_pending_blocks): New function. - (really_free_pendings): Call free_pending_blocks. - (pending_blocks): Make static instead of global. - (free_pendings): Make static instead of global. - -Tue Oct 8 09:03:22 1996 Stu Grossman (grossman@critters.cygnus.com) - - * config/i386/windows.mh config/i386/xm-windows.h:: New config - files to support building Wingdb (built under Microsoft build - environment). - - * Makefile.in: Add rule for hpux-thread.o (needs special header - files). - * (SUBDIRS): Remove mswin. - * Change procedure for creating init.c. Speeds things up quite a - bit. - * config.in configure configure.in: Check for select, poll. - * Check for OSF header files before including hpux-thread.o. - * Don't configure doc or testsuite when building under MSVC. - * findvar.c value.h (read_register_pid write_register_pid): Make - global. Needed for hppa-tdep.c. - * (supply_register): Don't set pid to inferior_pid when supplying - registers. - * hppa-tdep.c (saved_pc_after_call): frame_saved_pc -> - FRAME_SAVED_PC. - * (frame_saved_pc): Change name to hppa_frame_saved_pc. - * (hppa_pop_frame): Don't use a pid of 0 with target_write_pc. - Use write_pc instead, which uses the correct pid. - * (target_read_pc target_write_pc): Use read/write_register_pid - instead of read/write_register to preserve the pid passed in. - * inftarg.c (child_can_run): Add flag child_suppress_run to allow - hpux-threads.c to override this as a runnable target. - * config/pa/nm-hppah.h: Define target_new_objfile and - target_pid_to_str. - * config/pa/tm-hppa.h (FRAME_SAVED_PC): Use hppa_frame_saved_pc - instead of frame_saved_pc. - * config/m68k/tm-m68k.h: Define TARGET_M68K for Wingdb. - * config/m68k/tm-monitor.h: Use FRAME_CHAIN_VALID_ALTERNATE, since - we can't easily determine the start file bounds with ELF. - * config/mips/tm-mips.h: Define TARGET_MIPS for Wingdb. - * hpux-thread.c: New file for HPUX/OSF thread support. - * osf-share/{README AT386/cma_thread_io.h HP800/cma_thread_io.h - RIOS/cma_thread_io.h cma_attr.h cma_deb_core.h cma_debug_client.h - cma_errors.h cma_handle.h cma_init.h cma_list.h cma_mutex.h - cma_sched.h cma_semaphore_defs.h cma_sequence.h cma_stack.h - cma_stack_int.h cma_tcb_defs.h cma_util.h}: New files for OSF - thread support. - -Sun Oct 6 15:48:09 1996 Fred Fish <fnf@cygnus.com> - - * buildsym.c (finish_block): Change innerblock_anon_complaint to - print the addresses as part of the complaint. Add a complaint for - cases where the block end address is smaller than the block start - address, in case any such conditions slip through our fixup mechanism. - * symmisc.c (dump_symtab): Only print blockvector for primary - symtabs, to avoid massive duplication of output due to secondary - symtabs that point to same blockvector. Also do some minor - formatting tweaks. - -Mon Oct 7 10:42:32 1996 Per Bothner <bothner@deneb.cygnus.com> - - Replace header_files global by per-objfile field. - * gdb-stabs.h (struct dbx_symfile_info): Add fields header_files, - n_header_files, n_allocated_header_files. - * stabsread.h (header_files, n_header_files, n_allocated_header_files): - Replace externs by macros HEADER_FILES, N_HEADER_FILES, and - N_ALLOCATED_HEADER_FILES. - * dbxread.c (dbx_symfile_finish): Free HEADER_FILES. - (free_header_files, init_header-files): Don't free/init headerfiles. - (various functions): Use macros instead of header_files globals. - * stabsread.c (various functions): Likewise. - -Sun Oct 6 22:43:06 1996 Jason Merrill <jason@yorick.cygnus.com> - - * dwarf2read.c (read_tag_reference_type): New fn. - (read_type_die): Call it. - (dwarf_attr): Also look in the DIEs referred to by specification - or abstract_origin attributes. - -Wed Oct 2 22:07:16 1996 Fred Fish <fnf@cygnus.com> - - * inferior.h (IN_SIGTRAMP): Pass pc to SIGTRAMP_START and - SIGTRAMP_END. - * config/i386/tm-i386os9k.h (SIGTRAMP_START, SIGTRAMP_END): - Define with dummy pc arg. - * config/m68k/tm-nbsd.h: Ditto. - * doc/gdbint.texinfo: Document that SIGTRAMP_START and - SIGTRAMP_END are macros that take an single argument. - -Mon Sep 30 20:02:45 1996 Fred Fish <fnf@cygnus.com> - - * defs.h: Remove define of PRIVATE_XMALLOC. - -Mon Sep 30 15:39:28 1996 Stu Grossman (grossman@critters.cygnus.com) - - * config/v850/tm-v850.h: Use distinct register for PC, not EIPC. - -Mon Sep 30 11:16:34 1996 Jeffrey A Law (law@cygnus.com) - - * top.c (execute_control_command): Free values from while_control - and if_control conditions after evaluation to avoid storage leaks. - From Peter Schauer. - -Fri Sep 27 17:43:06 1996 Stu Grossman (grossman@critters.cygnus.com) - - * configure configure.in: Recognize v850 target. - * v850-tdep.c: New file, NEC V850 target support. - * config/v850/{v850.mt tm-v850.h}: New files for NEC V850 support. - -Fri Sep 27 14:48:15 1996 Peter Schauer (pes@regent.e-technik.tu-muenchen.de) - - * infrun.c (wait_for_inferior): Update current_line and - current_symtab when stepping continues in the middle of a new line. - -Fri Sep 27 10:25:30 1996 Fred Fish <fnf@cygnus.com> - - * top.c (print_gdb_version): Rewrote to comply with new GNU coding - standards for the --version option. - (print_gnu_advertisement): Remove, now part of print_gdb_version. - (show_version): Remove call to print_gnu_advertisement. - * top.h (print_gnu_advertisement): Remove prototype. - * main.c (print_gdb_help): Move help to static function and - add prototype. - (main): Call print_gdb_help rather than inlining it. - (main): Remove call to print_gnu_advertisement. - -Fri Sep 27 13:32:53 1996 Michael Meissner <meissner@tiktok.cygnus.com> - - * config/d10v/tm-d10v.h (TARGET_{INT,PTR}_BIT): Define. - (TARGET_{,LONG_}DOUBLE_BIT): Ditto. - -Thu Sep 26 23:10:26 1996 Mark Alexander <marka@cygnus.com> - - * configure.in, config/i386/tm-linux.h: Fix configure - problem on older Linux systems that prevented core files - from being recognized. - -Wed Sep 25 18:31:33 1996 Stan Shebs <shebs@andros.cygnus.com> - - * dbug-rom.c: New file, support for Motorola's dBUG monitor. - * config/m68k/monitor.mt (TDEPFILES): Add it. - * NEWS: Mention it. - -Mon Sep 23 16:13:50 1996 Martin M. Hunt <hunt@pizza.cygnus.com> - - * config/d10v/tm-d10v.h (SAVED_PC_AFTER_CALL): Fixed. - Now single-steps correctly. - * d10v-tdep.c (d10v_pop_frame): Fixed. - -Fri Sep 20 16:10:58 1996 Stan Shebs <shebs@andros.cygnus.com> - - * config/sh/tm-sh.h (REGISTER_NAMES): Move fp registers to - be consistent with GCC. - (FPUL_REGNUM, etc): Renumber to match list changes. - (ADDR_BITS_REMOVE): Delete. - * sh-tdep.c (sh_reg_names, sh3_reg_names, sh3e_reg_names): - Rearrange to match REGISTER_NAMES. - * sh3-rom.c (sh3_regnames, sh3e_regnames): Ditto. - -Thu Sep 19 16:19:01 1996 Martin M. Hunt <hunt@pizza.cygnus.com> - - * d10v-tdep.c: Stack chain should work now. - -Tue Sep 17 18:46:57 1996 Martin M. Hunt <hunt@pizza.cygnus.com> - - * d10v-tdep.c, config/d10v/tm-d10v.h: Snapshot. - -Tue Sep 17 12:20:50 1996 Ian Lance Taylor <ian@cygnus.com> - - * configure.in: Add cases for MIPS 5000 like MIPS 4300. - * configure: Rebuild. - -Tue Sep 17 12:09:00 1996 Dawn Perchik <dawn@critters.cygnus.com> - - * ser-e7kpc.c: Added wingdb support for target e7000pc. - -Tue Sep 17 10:56:52 1996 James G. Smith <jsmith@cygnus.co.uk> - - * remote-mips.c (pmon_wait): DDB PMON does not require forced - re-entry back into debug mode. - -Mon Sep 16 14:32:58 1996 James G. Smith <jsmith@cygnus.co.uk> - - * remote-mips.c (mips_load): Ensure that the PC is explicitly - loaded after a load to a DDB PMON system. - -Fri Sep 13 12:02:39 1996 Fred Fish <fnf@cygnus.com> - - * Makefile.in (INTERNAL_LDFLAGS): Add @HLDFLAGS@ to list. - (HLDENV): Set to @HLDENV@. - (gdb): Prefix link command line with $(HLDENV). - * configure.in: Add support to test for --enable-shared and - generate appropriate values for HLDFLAGS and HLDENV. - * configure: Regenerated with autoconf. - -Sun Sep 8 15:26:27 1996 Fred Fish <fnf@cygnus.com> - - * alpha-nat.c (fetch_core_registers): Match Sep 4 gdbcore.h prototype - change for core_read_registers in struct core_fns. - * core-regset.c (fetch_core_registers): Ditto & add prototype. - * core-sol2.c (fetch_core_registers): Ditto & add prototype. - * i386aix-nat.c (fetch_core_registers): Ditto & add prototype. - * i386b-nat.c (fetch_core_registers): Ditto. - * i386mach-nat.c (fetch_core_registers): Ditto & add prototype. - * irix4-nat.c (fetch_core_registers): Ditto. - * irix5-nat.c (fetch_core_registers): Ditto. - * lynx-nat.c (fetch_core_registers): Ditto & add prototype. - * m68knbsd-nat.c (fetch_core_registers): Ditto. - * mips-nat.c (fetch_core_registers): Ditto & add prototype. - * rs6000-nat.c (fetch_core_registers): Ditto. - * sparc-nat.c (fetch_core_registers): Ditto. - * sun3-nat.c (fetch_core_registers): Ditto & add prototype. - * ultra3-nat.c (fetch_core_registers): Ditto & add prototype. - - * alpha-nat.c (register_addr): Match Sep 4 gdbcore.h prototype change. - * delta68-nat.c (register_addr): Ditto. - * gdbserver/low-linux.c (register_addr): Ditto. - * gdbserver/low-hppabsd.c (register_addr): Ditto. - * i386m3-nat.c (register_addr): Ditto. - * mips-nat.c (register_addr): Ditto. - * ultra3-nat.c (register_addr): Ditto. - -Sun Sep 8 15:14:00 1996 Stu Grossman (grossman@critters.cygnus.com) - - * blockframe.c (inside_main_func): Cleanup slightly. Move - mainsym def into the block it's used in. - * configure.in configure: Allow NATDEPFILES to be recognized in - .mh files regardless of whitespace. - - * cpu32bug-rom.c (cpu32bug_cmds): Change load_response string to - keep downloads from hanging. - - * remote-wiggler.c: Add support for flash upgrades. - * (wiggler_error): Fix message format. Add new error code. - * (wiggler_write_byets): Error code is hex. Report errors with - proper routine name. - * (wiggler_read_byets): Report errors with proper routine name. - * (get_packet): Add support for new flash commands. - * (wiggler_load): Call clear_symtab_users() to reset things - properly after download. - * (flash_xfer_memory bdm_update_flash_command): New funxtions to - support flash upgrades for Wiggler. - * (_initialize_remote_wiggler): Add `bdm update-flash' command. - -Fri Sep 6 13:14:13 1996 Geoffrey Noer <noer@cygnus.com> - - * ser-tcp.c: don't include netinet/tcp.h if __CYGWIN32__ - -Thu Sep 5 17:05:13 1996 Geoffrey Noer <noer@cygnus.com> - - * config/i386/cygwin32.mh: - * config/powerpc/cygwin32.mh: build ser-tcp.o for both hosts - -Thu Sep 5 12:09:13 1996 Per Bothner <bothner@deneb.cygnus.com> - - * value.h (COERCE_REF): Fix previous change. - (COERCE_ENUM): Add a check_typedef (this is the real fix). - -Thu Sep 5 03:28:30 1996 Wilfried Moser <moser@rtl.cygnus.com> - - * eval.c (evaluate_subexp_standard): In case of OP_ARRAY: make a - better check of array boundaries. - -Thu Sep 5 01:29:42 1996 Stu Grossman (grossman@critters.cygnus.com) - - * configure: Update aclocal.m4 and re-run autoconf to get correct - defs for BFD stuff. - * remote-wiggler.c (wiggler_error): Error codes are hex. Also, - fix default message generation. - -Wed Sep 4 17:28:40 1996 Stu Grossman (grossman@critters.cygnus.com) - - * Makefile.in: Add mswin to SUBDIRS. Add rules for - mswin/libwingdb.a and remote-wiggler.o. - * breakpoint.c (breakpoint_here_p): Clean up bp enabled test. - * (breakpoint_inserted_here_p): New func, just like - breakpoint_here_p, except it's honest. Honestly. - * breakpoint.h: Proto for above. - * configure configure.in: Add mswin to configdirs if host is - i[3456]86-*-windows. - * core-aout.c (fetch_core_registers register_addr) gdbcore.h: - Change all vars that can contain addresses to type CORE_ADDR. - * findvar.c (supply_register): Allow val to be NULL. This means - that regno is unsupported. - * (read_pc read_pc_pid write_pc write_pc_pid): Make non-pid forms - just call pid forms with inferior_pid so that there's only once - place to hack PC's and such. - * infrun.c (proceed): Don't skip breakpoints if user changed PC. - * remote-wiggler.c: New file. Support for BDM interface from - Macraigor Systems. - * serial.c: Enhance serial logging capability. Add hex and octal - output modes (set remotelogbase {hex|octal|ascii}. Also log - breaks, timeouts, errors, and eofs. - * serial.h: Redefine SERIAL_SEND_BREAK to go through a wrapper - function so that we can log breaks. Don't export serial_logfile - or serial_logfp. - * top.c (execute_command): Don't test for serial_logfp here. - Just call serial_log_comand, and let serial.c sort it out. - * valops.c (value_of_variable): Don't attempt to establish frames - for static and global variables. This makes things work a bit - better if the stack or frame pointer is trashed. - * config/m68k/monitor.mt (TDEPFILES): Add remote-wiggler.o. - * config/m68k/tm-m68k.h: Define STACK_ALIGN. CPU32 can't hack - misaligned stacks during function calls. - -Wed Sep 4 13:06:26 1996 Ian Lance Taylor <ian@cygnus.com> - - * terminal.h: Don't use #elif. - -Wed Sep 4 06:49:35 1996 Wilfried Moser <moser@rtl.cygnus.com> - - * ch-exp.c (parse_tuple_element): Allow (*): for array tuples - if we have a type. - - * eval.c (evaluate_subexp_standard): In case of OP_ARRAY: - check number of args against bounds of array to avoid - memory corruption. - - * value.h (COERCE_REF): Do a CHECK_TYPEDEF in case we get - a TYPE_CODE_TYPEDEF. - -Fri Aug 30 15:07:14 1996 James G. Smith <jsmith@cygnus.co.uk> - - * remote-mips.c: Provide support for DDBVR4300 target board. - (ddb_open, ddb_ops): Added. - (mips_monitor_type): MON_DDB Added. - (mips_enter_debug, mips_exit_debug, mips_initialize, - mips_fetch_registers, common_breakpoint, mips_load, - _initialize_remote_mips): Updated. - -Thu Aug 29 17:00:18 1996 Michael Meissner <meissner@tiktok.cygnus.com> - - * nlm/configure.in (i[345]86-*-*): Recognize i686 for pentium pro. - * nlm/configure: Regenerate. - - * gdbserver/configure.in (i[345]86-*-*): Recognize i686 for - pentium pro. - -Wed Aug 28 13:11:15 1996 Ian Lance Taylor <ian@cygnus.com> - - * configure.in: If CY_AC_PATH_TCLCONFIG can't find TCL, don't run - CY_AC_LOAD_TCLCONFIG. - * configure: Rebuild. - -Tue Aug 27 12:40:40 1996 Fred Fish <fnf@cygnus.com> - - * infrun.c (wait_for_inferior): Initialize stop_func_end before calling - find_pc_partial_function. - -Tue Aug 27 10:17:34 1996 Michael Meissner <meissner@tiktok.cygnus.com> - - * configure: Regenerate again. - -Tue Aug 27 04:25:08 1996 Geoffrey Noer <noer@cygnus.com> - - * configure.in: work around host_alias configure bug. - AC_CANONICAL_HOST is called twice (first by AC_CHECK_TOOL - and second by AC_CANONICAL_SYSTEM). The second clobbers the - previous setting. Circumventing by moving the second check - to before the first. - * configure: regenerated - -Mon Aug 26 18:36:54 1996 Martin M. Hunt <hunt@pizza.cygnus.com> - - * config/d10v/d10v.mt: New file. - * config/d10v/tm-d10v.h: New file. - * configure.in: New target D10V. - * d10v-tdep.c: New file. - -Sun Aug 25 00:09:47 1996 Fred Fish <fnf@rtl.cygnus.com> - - * rs6000-tdep.c: Fix typo in comment. - * valops.c (call_function_by_hand): Set using_gcc to 2 - for code compiled without -g, per comment in code. - * config/a29k/tm-a29k.h (STACK_ALIGN): Add comment. - * config/sparc/tm-sparc.h (STACK_ALIGN): Add comment. - * config/sparc/tm-sp64.h (STACK_ALIGN): Add comment. - * config/pyr/tm-pyr.h (STACK_ALIGN): Add comment. - * config/m88k/tm-m88k.h (STACK_ALIGN): Add comment. - * config/pa/tm-hppa.h (PUSH_ARGUMENTS): Enclose args in ()'s. - (STACK_ALIGN): Add comment, move to be with other associated - macros, and document. - * config/mips/tm-mips.h (PUSH_ARGUMENTS): Enclose args in ()'s. - (STACK_ALIGN): Remove completely, handled by PUSH_ARGUMENTS. - * config/alpha/tm-alpha.h (PUSH_ARGUMENTS): Enclose args in ()'s. - * config/rs6000/tm-rs6000.h (STACK_ALIGN): Remove completely, - handled by PUSH_ARGUMENTS. - (PUSH_ARGUMENTS): Enclose args in ()'s. - -Fri Aug 23 13:55:05 1996 Peter Schauer (pes@regent.e-technik.tu-muenchen.de) - - * infrun.c (wait_for_inferior): Try to reenable shared library - breakpoints even if auto_solib_load is not set. - -Wed Aug 21 16:31:27 1996 Fred Fish <fnf@cygnus.com> - - * valprint.c (print_longest): Test for CC_HAS_LONG_LONG as well as - PRINTF_HAS_LONG_LONG. - * expprint.c (dump_expression): Ditto. - * configure.in: Fix check for long long support in compiler to - use a function body, not a nested function. - * configure: Rebuild with autoconf. - -Tue Aug 20 17:59:42 1996 Ian Lance Taylor <ian@cygnus.com> - - * aclocal.m4: Include ../bfd/aclocal.m4. - * configure.in: Add stdlib.h to AC_CHECK_HEADERS. Call - BFD_NEED_DECLARATION on malloc, realloc, and free. - * acconfig.h: Add NEED_DECLARATION_MALLOC, - NEED_DECLARATION_REALLOC, and NEED_DECLARATION_FREE. - * configure, config.in: Rebuild. - * defs.h: Include <stddef.h> and <stdlib.h> based on HAVE_*_H - rather than __STDC__. Only declare malloc, realloc, and free if - NEED_DECLARATION_* is defined. - -Tue Aug 20 15:37:03 1996 Fred Fish <fnf@cygnus.com> - - * solib.c (_initialize_solib): Add missing '\' chars at ends of - strings that continue on next line. - (enable_break): Replace "return 0" with setting success to zero - and letting normal return handle the return. - -Sat Aug 17 14:16:23 1996 Fred Fish <fnf@cygnus.com> - - * mips-tdep.c (mips_push_arguments): Make sure sp and struct_addr - are properly aligned. - -Fri Aug 16 17:54:26 1996 Stan Shebs <shebs@andros.cygnus.com> - - * rs6000-tdep.c (rs6000_fix_call_dummy): Add full set of arguments. - * config/rs6000/tm-rs6000.h (FIX_CALL_DUMMY): Pass all arguments - to function, declare function correctly. - -Fri Aug 16 17:24:35 1996 Dawn Perchik <dawn@critters.cygnus.com> - - * symtab.h: changed namespace to _namespace for compiling under - MFC v4.0. - -Fri Aug 16 13:52:21 1996 Stan Shebs <shebs@andros.cygnus.com> - - * mpw-make.sed: Update for various recent changes, add some - comments. - -Fri Aug 16 15:47:36 1996 Michael Meissner <meissner@tiktok.cygnus.com> - - * config/rs6000/tm-rs6000.h (FIX_CALL_DUMMY): Cast args to be an - integer for type correctness. - -Fri Aug 16 15:15:37 1996 James G. Smith <jsmith@cygnus.co.uk> - - * config/mips/{vr4300.mt, vr4300el.mt} (SIM): Add -lm when - simulator is included. - -Thu Aug 15 13:44:13 1996 Fred Fish <fnf@cygnus.com> - - * findvar.c (write_register_pid): Only needed when TARGET_WRITE_PC - is not defined. - (read_register_pid): Only needed when TARGET_READ_PC is not - defined. - * hppa-tdep.c (frame_saved_pc): Remove prototype. - * infptrace.c (udot_info): Prototype when CHILD_XFER_MEMORY is - not defined. - * config/xm-aix4.h (aix_resizewindow): Convert old style decl - to prototype. - * xcoffsolib.c (command.h): Include for needed prototypes. - -Wed Aug 14 17:54:19 1996 Stu Grossman (grossman@critters.cygnus.com) - - * config/i386/cygwin32.mh: Set NAT_FILE to nm-empty.h to make - native work. - -Wed Aug 14 02:03:42 1996 Fred Fish <fnf@cygnus.com> - - From Blair MacIntyre <bm@cs.columbia.edu>: - * hppa-tdep.c (hppa_fix_call_dummy): Use MSYMBOL_TYPE rather - than SYMBOL_TYPE on msymbols. - * somsolib.c (som_solib_create_inferior_hook): Ditto. - - * Makefile.in (init.c): Generate with prototypes. - - * config/pa/tm-hppa.h (frame_saved_pc): Add prototype. - * config/rs6000/xm-rs6000.h (aix_resizewindow): Ditto. - * config/rs6000/tm-rs6000.h (frame_initial_stack_address): Ditto. - (pc_load_segment_name): Ditto. - (pop_frame): Ditto. - (extract_return_value): Ditto. - (is_magic_function_pointer): Ditto. - (push_dummy_frame): Ditto. - (fix_call_dummy): Ditto. - (push_arguments): Ditto. - (skip_trampoline_code): Ditto. - (aix_process_linenos): Ditto. - - * config/m68k/tm-cisco.h (get_longjmp_target): Add prototype. - * config/m68k/tm-es1800.h: Ditto. - * config/m68k/tm-vx68.h: Ditto. - * config/m68k/tm-sun3.h: Ditto. - * config/m68k/tm-m68kv4.h: Ditto. - -Tue Aug 13 23:04:36 1996 Fred Fish <fnf@cygnus.com> - - * config/mips/nm-mips.h (get_longjmp_target): Add prototype. - * config/mips/nm-irix3.h (get_longjmp_target): Add prototype. - * remote-mips.c (mips_read_processor_type): Remove prototype. - * mips-tdep.c (gdb_print_insn_mips): Add prototype and make static. - * irix5-nat.c (fetch_core_registers): Add prototype. - -Mon Aug 12 21:23:44 1996 Fred Fish <fnf@cygnus.com> - - * remote-pa.c (boot_board): Add dummy params to make type compatible - for passing to add_com. - * scm-exp.c (scm_lreadr): Ensure svalue is not used uninitialized. - * buildsym.c (compare_line_numbers): Change function to match - prototype and also what qsort expects. - -Mon Aug 12 19:19:00 1996 Mark Alexander <marka@cygnus.com> - - * remote.c: Make remote_write_size public. - * sh-tdep.c (_initialize_sh_tdep): Set remote_write_size to 300 - to prevent packet errors with some versions of CMON. - -Mon Aug 12 16:20:58 1996 Stu Grossman (grossman@critters.cygnus.com) - - * defs.h: Define CONST_PTR as blank if compiling with Microsoft - C, else it's `const'. - * c-lang.c c-lang.h ch-lang.c f-lang.c language.c m2-lang.c - scm-lang.c: Microsoft C can't hack const pointers. Use CONST_PTR - macro instead. - * configure configure.in defs.h: Use AC_C_CONST to figure out if - the compiler supports const. Gets rid of some cruft in defs.h. - * dwarf2read.c: <string.h> -> "gdb_string.h" - * remote-sim.c: Add prototypes. Fix call to gdbsim_kill. - * sparcl-tdep.c (download): Add prototypes to write_routine and - start_routine args. - - * mswin/gdbwin.c: Don't include both varargs.h AND stdarg.h. Get - rid of varargs.h Include string.h. - * (gdbwin_update gdbwin_fputs regs_changed_f bpt_changed_f - update): Fix prototypes, fix calls. - * (update): Return value for catch_errors. - * (run_execute_command togdb_command_from_tty togdb_command): - Cleanup catching of errors from calls to execute_command. Also, - dup command string to avoid modifying const strings. - * (togdb_breakinfo_i_init togdb_breakinfo_i_next): Use 0 instead - of NULL when see if b->address isn't set. - * (bi_disable_bpt bi_enable_bpt bi_delete_all - bi_delete_breakpoint): Add arg to calls to update. - * (gui_command): Add prototype. - * (mswin_query): Fix prototype. - * (_initialize_gdbwin): Dup string to avoid modifying const. - * (info_path togdb_get_info_path): Remove const from decls cuz - this can't be const (it points at malloc'ed memory). - * (togdb_searchpath): Remove const from path. Dup string to - avoid modifying const strings. - * rindex -> strrchr. - * (gdbwin_list_symbols): Regexp param is const. - * Fix lots of refs to psymtabs to deref correct pointers. - * (togdb_set_breakpoint_sal): Call set_breakpoint_sal with sal, - not &sal. - * mswin/gdbwin.h (togdb_searchpath togdb_get_info_path - toget_set_info_path): Fix prototypes to match reality. - * mswin/gui.cpp: Define _beginthreadex and _endthreadex routines - with proper prototypes. - * mswin/iface.cpp (gdbwin_fputs): Define with correct number of args. - * mswin/ser-win32s.c: Fix defs of min and max. - * mswin/serdll32.c (OpenComm16): Make cbInQueue and cbOutQueue be - USHORT. - * (WriteComm16): Change lpBug from LPVOID to LPCSTR. - * mswin/serdll32.h: Fix prototypes for OpenComm16 and WriteComm16. - -Sun Aug 11 20:54:16 1996 Stu Grossman (grossman@critters.cygnus.com) - - * main.c (main): Make sure command loop is used with cygwin32. - * terminal.h: Allow cygwin32 to use termios.h. - -Fri Aug 9 12:42:49 1996 Jeffrey A Law (law@cygnus.com) - - * somread.c (som_symtab_read): Handle secondary definition - symbols (aka weak symbols). - - * config/tm-hppa.h (EXTRACT_RETURN_VALUE): Fix thinko in - last change. - -Thu Aug 8 10:12:36 1996 Stu Grossman (grossman@critters.cygnus.com) - - * symfile.c (symfile_bfd_open): Change ifdef from __WIN32__ to - _WIN32. - - * somread.c: Rearrange order of includes to fix warnings under - hpux-10.10. Also don't include sys/file.h. - -Wed Aug 7 21:45:52 1996 Stu Grossman (grossman@critters.cygnus.com) - - * dbxread.c: Don't include param.h or sys/file.h. - * (dbx_symfile_read): Determine symfile_relocatable from bfd - flags instead of file extension. Also clean up a little bit. - -Wed Aug 7 17:18:37 1996 Stu Grossman (grossman@critters.cygnus.com) - - * dwarf2read.c dwarfread.c exec.c infcmd.c infrun.c main.c - mdebugread.c os9kread.c source.c top.c utils.c: Don't - include param.h or sys/file.h (or unistd.h in some cases). - * defs.h exec.c inflow.c remote-array.c remote-e7000.c - sparcl-tdep.c terminal.h utils.c: Replace all occurances of - __WIN32__, WINGDB, WIN32, etc... with _WIN32. - * main.c: Remove #ifndef WINGDB around option processing. Fix - bug with passing argc==0 and argv==NULL to getopt. - * (main) Remove calls to access() before source_command. Let - soure_command handle access errors. - * maint.c (maintenance_dump_me): #ifdef out for _WIN32. - * symtab.c (operator_chars): Make this global for wingdb. - * top.c (disconnect): #ifdef out for _WIN32. - * (source_command): If got an error and from_tty, then call print - error, else just return quietly. - * utils.c (fatal_dump_core): Can't kill ourselves under windows. - Just exit. - * (pollquit notice_quit): #ifdef out stuff that doesn't exist - under windows. - -Wed Aug 7 09:59:19 1996 Jeffrey A Law (law@cygnus.com) - - * config/pa/tm-hppa.h (EXTRACT_RETURN_VALUE): Tweak for - structures > 4 bytes in size. - - * valops.c (call_function_by_hand): Handle aligning stacks that - grow up correctly. - * config/pa/tm-hppa.h (USE_STRUCT_CONVENTION): Define. - (STACK_ALIGN): Define. - * hppa-tdep.c (hppa_alignof): Don't demand a minumim two byte - alignment on structs/unions. - -Sun Aug 4 16:22:42 1996 Fred Fish <fnf@cygnus.com> - - * config/powerpc/nm-aix.h (PTRACE_ARG3_TYPE): Define to "int *", - which is the documented type under at least AIX 3 and AIX 4. - -Sat Aug 3 04:02:46 1996 Fred Fish <fnf@cygnus.com> - - * config/alpha/alpha-osf3.mh (XM_FILE): Change from xm-alpha.h to - xm-alphaosf.h. - (MMALLOC_CFLAGS): Define NO_MMCHECK to not install consistency - checks. - -Thu Aug 1 10:11:34 1996 Fred Fish <fnf@cygnus.com> - - * config/mips/tm-mips.h (TM_MIPS_H): Enclose file contents in - this, define when contents are included. - (mips_read_processor_type): Add prototype. - * config/mips/xm-mips.h: Remove strdup decl, now in gdb_string.h - * mdebugread.c (ecoff_relocate_efi): Add prototype. - (fixup_sigtramp): Only needed when TM_MIPS_H is defined. - -Wed Jul 31 20:21:24 1996 Fred Fish <fnf@cygnus.com> - - * rs6000-nat.c (add_vmap): Return 0 to caller rather than random value. - (vmap_ldinfo): Ensure got_exec_file is not used uninitialized. - (fetch_core_registers): Add prototype. - (vmap_symtab): Ditto. - (objfile_symbol_add): Ditto. - (add_vmap): Ditto. - (vmap_ldinfo): Ditto. - (vmap_exec): Ditto. - -Tue Jul 30 17:57:46 1996 Stan Shebs <shebs@andros.cygnus.com> - - * stabsread.c (get_substring): Declare second arg as int. - - * remote-es.c: Include gdb_string.h after defs.h. - -Mon Jul 29 21:13:20 1996 Fred Fish <fnf@cygnus.com> - - * rs6000-tdep.c (push_arguments): Remove unused variable "pc". - (branch_dest): Remove unused variable "offset". - (pop_dummy_frame): Add prototype and make static. - (push_arguments): Guard against using len uninitialized. - (push_arguments): Guard against using arg uninitialized. - (frame_saved_pc): Remove unused variable "frameless". - (free_loadinfo): Ifdef out unused function. - - * xcoffread.c (compare_lte): Change prototype and function to - be correct type for passing to qsort. - (add_stab_to_list): Ifdef out unused function and prototype. - (compare_lte): Add prototype - (arrange_linetable): Ditto. - (record_include_begin): Ditto. - (record_include_end): Ditto. - (process_linenos): Ditto. - (xcoff_next_symbol_text): Ditto. - (scan_xcoff_symtab): Ditto. - (xcoff_initial_scan): Ditto. - - * mips-tdep.c (mips_read_processor_type): Add parens around - bitwise-and operands in comparison; previous expression always - evaluated to 0 because of equality comparison of two constants. - - * rs6000-tdep.c (skip_prologue): Add missing parens around - operands of logical-or so that first operand does not bind - to previous logical-and. - - * configure.in: Expand "long long" test to include code that triggers - known problem on HPUX with native compiler. - (configure): Regenerated. - -Mon Jul 29 18:12:27 1996 Jeffrey A Law (law@cygnus.com) - - * somsolib.c (som_solib_create_inferior_hook): Don't - warn if __d_pid can't be found. - -Sun Jul 28 10:46:39 1996 Fred Fish <fnf@cygnus.com> - - * config/mips/tm-mips.h (struct frame_info): Forward decl. - (struct type): Ditto. - (struct value): Ditto. - - * config/mips/tm-mips.h (sigtramp_address): Move extern decl - from mips-tdep.c to here. - (sigtramp_end): Ditto. - (fixup_sigtramp): Ditto. - - * config/mips/tm-mips.h (init_extra_frame_info): Add prototype. - (mips_frame_chain): Ditto. - (mips_step_skips_delay): Ditto. - (mips_frame_saved_pc): Ditto. - (mips_find_saved_regs): Ditto. - (mips_frame_num_args): Ditto. - (mips_pop_frame): Ditto. - (mips_extract_return_value): Ditto. - (mips_store_return_value): Ditto. - (mips_push_dummy_frame): Ditto. - (mips_push_arguments): Ditto. - (mips_do_registers_info): Ditto. - (ecoff_relocate_efi): Ditto. - (ecoff_relocate_efi): Ditto. - * irix4-nat.c (fetch_core_registers): Add prototype. - * mips-tdep.c (read_next_frame_reg): Add prototype - (heuristic_proc_start): Ditto. - (heuristic_proc_desc): Ditto. - (mips_print_register): Ditto. - * config/mips/nm-irix5.h (procfs_set_watchpoint): Add prototype. - (procfs_stopped_by_watchpoint): Ditto. - * config/mips/nm-irix4.h (procfs_set_watchpoint): Add prototype. - (procfs_stopped_by_watchpoint): Ditto. - * config/alpha/tm-alpha.h (ecoff_relocate_efi): Add prototype. - (struct symbol): Add forward decl for prototype. - - * breakpoint.c (internal_breakpoint_number): Only needed if - GET_LONGJMP_TARGET or SOLIB_ADD is defined. - - * objfiles.c (ecoff_relocate_efi): Remove prototype. - -Sat Jul 27 17:47:35 1996 Fred Fish <fnf@cygnus.com> - - * configure.in: Add test for "long long" support. - * configure: Regenerate with autoconf. - * acconfig.h: Add CC_HAS_LONG_LONG - * config.in: Regenerate with autoheader. - * config/mips/tm-mips64.h (FORCE_LONG_LONG): Remove - * config/sparc/tm-sp64.h (CC_HAS_LONG_LONG): Remove. - * config/mips/tm-vr4300el.h (CC_HAS_LONG_LONG): Remove. - * config/mips/tm-vr4300.h (CC_HAS_LONG_LONG): Remove. - * config/mips/xm-irix5.h (CC_HAS_LONG_LONG): Remove - (PRINTF_HAS_LONG_LONG): Remove. - (FORCE_LONG_LONG): Remove. - * config/powerpc/xm-aix.h (UINT_MAX): Undef and use gdb's version. - * config/convex/xm-convex.h (CC_HAS_LONG_LONG): Remove - (PRINTF_HAS_LONG_LONG): Remove. - * config/xm-nbsd.h (CC_HAS_LONG_LONG): Remove. - (PRINTF_HAS_LONG_LONG): Remove. - * config/pa/tm-hppa.h (GET_FIELD): Put parens around - subtraction inside shift. Put parens around subtraction - in operand of bitwise and. - (struct frame_info): Forward declare - if __STDC__ defined. - (frame_saved_regs): Ditto. - (struct value): Ditto. - (struct type): Ditto. - (struct inferior_status): Ditto. - (init_extra_frame_info): Add prototype. - (skip_prologue): Ditto. - (frameless_function_invocation): Ditto. - (frame_chain): Ditto. - (frame_chain_valid): Ditto. - (saved_pc_after_call): Ditto. - (hppa_fix_call_dummy): Ditto. - (hppa_push_arguments): Ditto. - (pa_do_registers_info): Ditto. - (in_solib_call_trampoline): Ditto. - (in_solib_return_trampoline): Ditto. - (push_dummy_frame): Ditto. - * convex-tdep.c (decout): Use print_longest rather than - fprintf_filtered. - * defs.h: Remove use of FORCE_LONG_LONG and __GNUC__ to set - CC_HAS_LONG_LONG. - (INT_MIN): Fix so it works correctly when assigned to a long long. - * valprint.c (longest_to_int): Rewrite to remove dependence - on INT_MIN and INT_MAX. - (print_longest): Rewrite the code that falls back to synthesized - hex output when LONGEST value is not representable as in a long and - printf doesn't support printing long longs. - * ch-valprint.c (chill_val_print): Cast 2nd arg of - chill_print_type_scalar to LONGEST. - chill_print_type_scalar): Make static and add prototype. - * hppa-tdep.c (get_field): Ifdef out unused function. - (set_field): Ditto. - (extract_3): Ditto. - (extract_5_store): Ditto. - (extract_11): Ditto. - (extract_12): Ditto. - (deposit_17): Ditto. - (extract_14): Convert to static and add prototype. - (deposit_14): Ditto. - (extract_21): Ditto. - (deposit_21): Ditto. - (extract_17): Ditto. - (extract_5r_store): Ditto. - (extract_5R_store): Ditto. - (extract_5_load): Ditto. - (find_proc_framesize): Ditto. - (find_dummy_frame_regs): Ditto. - (sign_extend): Ditto. - (find_unwind_entry): Add prototype. - (find_return_regnum): Ditto. - (unwind_command): Ditto. - (find_dummy_frame_regs): Add parens around subtraction in operand - of bitwise-and. - (skip_prologue): Add parens around operands of logical-and inside - operand of logical-or. - (sign_extend): Add parens around operands of subtraction inside - operand of shift. - (low_sign_extend): Ditto. - * top.c (filename_completer): Convert old style decl of - filename_completion_function into prototype. - * f-lang.c (patch_common_entries): Ifdef out unused function. - * stabsread.c (read_cfront_baseclasses): Remove unused local - variable "msg_noterm". - (resolve_cfront_continuation): Remove unused local variable "fip". - (read_type): Remove unused variable xtypenums. - (read_cfront_static_fields): Remove unused variable "i". - (read_cfront_static_fields): Remove unused variable "nfields". - (read_cfront_member_functions): Add missing comment terminator. - (read_cfront_static_fields): Return 1 rather than random value. - (read_cfront_baseclasses): Ditto. - (read_cfront_baseclasses): Ditto. - (read_cfront_baseclasses): Ditto. - * somsolib.c (som_solib_create_inferior_hook): Remove unused - variable "u". - (som_solib_create_inferior_hook): Remove unused variable - shadow_contents. - (language.h): Add for needed prototypes. - (som_solib_sharedlibrary_command): Add prototype. - * hpread.c: (hpread_read_array_type): Add prototype. - * somread.c (hpread_build_pysmtabs): Add prototype. - (hpread_symfile_finish): Ditto. - (hpread_symfile_init): Ditto. - * hppah-nat.c (fetch_register): Convert old style decl - to prototype. - (gdbcore.h): Include for needed prototypes. - (fetch_register): Remove unused variable "mess". - * remote-pa.c (get_offsets): Ifdef out unused function. - (remote_start_remote): Remove unused variable "timeout". - (boot_board): Add prototype. - (reaad_frame): Add prototype. - (getpkt): Remove unused variable "bp". - (remote_kill): Add prototype. - (remote_mourn): Add prototype. - (remote_insert_breakpoint): Add prototype. - (remote_remove_breakpoint): Add prototype. - * valops.c (value_push): Only use if PUSH_ARGUMENTS is not defined. - * infcmd.c (do_registers_info): Only need prototype if - DO_REGISTERS_INFO is not defined. - (breakpoint_auto_delete_contents): Only need if - CALL_DUMMY_BREAKPOINT_OFFSET is defined. - -Sat Jul 27 08:49:49 1996 Fred Fish <fnf@cygnus.com> - - * xcoffread.c (xcoff_end_psymtab): Add textlow_not_set parameter. - (END_PSYMTAB): Ditto. - (scan_xcoff_symtab): Call xcoff_end_psymtab with textlow_not_set. - -Fri Jul 26 14:07:37 1996 Ian Lance Taylor <ian@cygnus.com> - - * printcmd.c (_initialize_printcmd): Initialize - tm_print_insn_info.flavour. - -Thu Jul 25 19:41:31 1996 Fred Fish <fnf@cygnus.com> - - * Makefile.in (scm-valprint.o): Depends upon gdbcore_h. - (arm-tdep.o): Ditto. - (dcache.o): Ditto. - (i386ly-tdep.o): Ditto. - (i960-tdep.o): Ditto. - (m68k-tdep.o): Ditto. - (nindy-tdep.o): Ditto. - (scm-lang.o): Ditto. - (w65-tdep.o): Ditto. - (z8k-tdep.o): Ditto. - (m68k-tdep.o): Depends upon value_h and gdb_string.h - (m2-valprint.o): Depends upon m2-lang.h. - (sparc-tdep.o): Depends upon gdb_string.h - (valprint.o): Depends upon valprint.h - - * remote-e7000.c (notice_quit): Remove prototype. - * top.c (initialize_targets): Remove prototype, now in target.h. - * stabsread.c (resolve_cfront_continuation): Remove prototype. - * dbxread.c (resolve_cfront_continuation): Remove prototype. - * symfile.h (set_demangling_style): Remove prototype. - * config/tm-sysv4.h (in_plt_section): Remove prototype, in objfiles.h. - * config/sparc/tm-sparc.h (single_step): Remove extern decl, now in - target.h. - * config/arc/tm-arc.h (one_stepped, single_step): Remove extern decls, - now in target.h. - * ser-unix.c (hardwire_restore): Remove obsolete prototype. - * sparc-tdep.c (single_step): Remove forward decl of isbranch. - * scm-lang.c (find_function_in_inferior): Remove prototype. - (value_allocate_space_in_inferior): Ditto. - * infrun.c (write_pc_pid): Remove prototype, now in inferior.h. - * defs.h (strchr): Remove declarations, they are declared in - gdb_string.h also. - (strrchr): Ditto. - (strstr): Ditto. - (strtok): Ditto. - (strerror): Ditto. - * f-valprint.c (f77_print_array_1): Remove extra arg that was being - passed to f77_print_array_1. - * gdbtypes.c (add_name): Remove unused variables lenstrlen and lenstr. - * scm-exp.c (scm_istr2int): Remove unused variable "j". - (scm_parse): Remove unused variable "str". - * hp300ux-nat.c (store_inferior_register): Remove unused variable - "buf". - (store_inferior_registers): Remove unnecessary decl "registers". - * m68k-tdep.c (m68k_pop_frame): Remove unused variable "fi". - * scm-lang.c (scm_get_field): Remove unused variable "val". - (scm_lookup_name): Remove unused variable "symval". - * objfiles.c (map_to_file): Remove unused local variable "tempfd". - * procfs.c (do_attach, do_detach): Remove unused variable "result". - (last_resume_pid): Remove unused static variable. - * alpha-tdep.c (alpha_linux_sigtramp_offset): Remove unused variable - "res". - * objfiles.c (map_to_address): Remove unused function. - * f-valprint.c (print_max): Remove extraneous extern decl, - in valprint.h. - (calc_f77_array_dims): Remove extraneous prototype, in f-lang.h. - * ch-exp.c (write_lower_upper_value): Remove prototype for - type_lower_upper. - - * gdbtypes.c (cfront_mangle_name): #ifdef out unused function. - * ch-exp.c (parse_mode_call): Ditto. - * f-valprint.c (there_is_a_visible_common_named): Ditto. - * f-lang.c (clear_function_list): Ditto. - (get_bf_for_fcn): Ditto. - (clear_bf_list): Ditto. - (add_common_block): Ditto. - (patch_all_commons_by_name): Ditto. - (find_first_common_named): Ditto. - (add_common_entry): Ditto. - (allocate_saved_function_node): Ditto. - (allocate_saved_bf_node): Ditto. - (allocate_common_entry_node): Ditto. - (allocate_saved_f77_common_node): Ditto. - - * arm-tdep.c (gdbcore.h): Include for necessary prototypes. - * dcache.c (gdbcore.h): Ditto. - * i386ly-tdep.c (gdbcore.h): Ditto. - * i960-tdep.c (gdbcore.h): Ditto. - * m2-valprint.c (m2-lang.h): Ditto. - * m68k-tdep.c (gdbcore.h): Ditto. - (value.h): Ditto. - (gdb_string.h): Ditto. - * nindy-tdep.c (gdbcore.h): Ditto. - * scm-lang.c (gdbcore.h): Ditto. - * scm-valprint.c (gdbcore.h): Ditto. - * w65-tdep.c (gdbcore.h): Ditto. - * z8k-tdep.c (gdbcore.h): Ditto. - * sparc-tdep.c (gdb_string.h): Include. - * valprint.c (valprint.h): Include. - - * config/xm-lynx.h: Remove part of comment about INT_MIN - redefined warnings from defs.h, since INT_MIN define in - defs.h is now protected by #ifndef INT_MIN. - * config/i386/xm-i386bsd.h: Ditto. - * config/m68k/xm-hp300bsd.h: Ditto. - * config/m68k/xm-news.h: Ditto. - - * config/pa/xm-hppah.h (INT_MIN): Remove bogus INT_MIN - definition as 0x80000000. The macro in defs.h is better. - * config/i386/xm-i386m3.h (INT_MIN): Ditto. - * config/i386/xm-i386mach.h (INT_MIN): Ditto. - * config/ns32k/xm-ns32km3.h (INT_MIN): Ditto. - * config/pa/xm-hppab.h: Ditto. - - * core-aout.c (fetch_core_registers): Add prototype. - * hp300ux-nat.c (fetch_inferior_register): Ditto. - (store_inferior_register_1): Ditto. - (store_inferior_register): Ditto. - * config/m68k/tm-m68k.h (find_saved_regs): Ditto. - *scm-valprint.c (c_val_print): Ditto. - * procfs.c (add_fd): Ditto. - (remove_fd): Ditto. - (wait_fd): Ditto. - (sigcodename): Ditto. - (sigcodedesc): Ditto. - (procfs_kill_inferior): Ditto. - (procfs_xfer_memory): Ditto. - (procfs_store_registers): Ditto. - (create_procinfo): Ditto. - (procfs_init_inferior): Ditto. - (proc_set_exec_trap): Ditto. - (procfs_attach): Ditto. - (procfs_detach): Ditto. - (procfs_prepare_to_store): Ditto. - (procfs_files_info): Ditto. - (procfs_open): Ditto. - (procfs_wait): Ditto. - (procfs_fetch_registers): Ditto. - (procfs_mourn_inferior): Ditto. - (procfs_can_run): Ditto. - (procfs_thread_alive): Ditto. - (procfs_stop): Ditto. - * alpha-nat.c (fetch_core_registers): Ditto. - * config/alpha/tm-alpha.h (alpha_osf_skip_sigtramp_frame): Ditto. - * objfiles.c (ecoff_relocate_efi): Ditto. - * inflow.c (pass_signal): Ditto. - (handle_sigio): Ditto. - * annotate.c (breakpoint_changed): Ditto. - * callback.c (wrap): Ditto. - (fdbad): Ditto. - (fdmap): Ditto. - * utils.c (malloc_botch): Ditto. - (fputs_maybe_filtered): Ditto. - (vfprintf_maybe_filtered): Ditto. - * defs.h (notice_quit): Ditto. - * defs.h (xmalloc, xrealloc): Ditto. - * top.c (stop_sig): Ditto. - (init_signals): Ditto. - (user_defined_command): Ditto. - (source_cleanup_lines): Ditto. - (dont_repeat_command): Ditto. - (serial_log_command): Ditto. - (disconnect): Ditto. - * target.h (initialize_targets): Ditto. - * os9kread.c (read_minimal_symbols): Ditto. - * mdebugread.c (mdebug_psymtab_to_symtab): Ditto. - (fdr_name): Ditto. - (push_parse_stack): Ditto. - (pop_parse_stack): Ditto. - (is_pending_symbol): Ditto. - (add_pending): Ditto. - * serial.c (serial_logchar): Ditto. - (serial_interface_lookup): Ditto. - * serial.h (serial_log_command): Ditto. - * f-valprint.c (info_common_command): Ditto. - * gdbtypes.h (print_type_scalar): Ditto. - * scm-valprint.c (scm_scmlist_print): Ditto. - (scm_ipruk): Ditto. - * scm-lang.c (scm_printstr): Ditto. - (in_eval_c): Ditto. - (evaluate_subexp_scm): Ditto. - * scm-exp.c (scm_read_token): Ditto. - (scm_skip_ws): Ditto. - (scm_lreadparen): Ditto. - * m2-lang.c (emit_char): Ditto. - (m2_printchar): Ditto. - (m2_printstr): Ditto. - (m2_create_fundamental_type): Ditto. - * f-lang.c (emit_char): Ditto. - (f_printchar): Ditto. - (f_printstr): Ditto. - (f_create_fundamental_type): Ditto. - * ch-lang.c (chill_printchar): Ditto. - (chill_printstr): Ditto. - (chill_create_fundamental_type): Ditto. - (value_chill_length): Ditto. - (value_chill_card): Ditto. - (value_chill_max_min): Ditto. - (evaluate_subexp_chill): Ditto. - * ch-exp.c (PEEK_TOKEN): Ditto. - (peek_token_): Ditto. - (forward_token_): Ditto. - (parse_case_label): Ditto. - (parse_opt_untyped_expr): Ditto. - (parse_unary_call): Ditto. - (parse_call): Ditto. - (parse_named_record_element): Ditto. - (parse_tuple_element): Ditto. - (parse_opt_element_list): Ditto. - (parse_tuple): Ditto. - (parse_primval): Ditto. - (parse_operand6): Ditto. - (parse_operand5): Ditto. - (parse_operand4): Ditto. - (parse_operand3): Ditto. - (parse_operand2): Ditto. - (parse_operand1): Ditto. - (parse_operand0): Ditto. - (parse_expr): Ditto. - (parse_then_alternative): Ditto. - (parse_else_alternative): Ditto. - (parse_if_expression): Ditto. - (parse_untyped_expr): Ditto. - (growbuf_by_size): Ditto. - (match_simple_name_string): Ditto. - (decode_integer_value): Ditto. - (decode_integer_literal): Ditto. - (match_float_literal): Ditto. - (match_float_literal): Ditto. - (match_string_literal): Ditto. - (match_character_literal): Ditto. - (match_integer_literal): Ditto. - (match_bitstring_literal): Ditto. - (write_lower_upper_value): Ditto. - * ch-lang.h (type_lower_upper): Ditto. - * c-lang.c (emit_char): Ditto. - * dwarfread.c (free_utypes): Ditto. - * stabsread.h (resolve_cfront_continuation): Ditto. - * stabsread.c (get_substring): Ditto. - (read_one_struct_field): Ditto. - * stabsread.h (process_later): Ditto. - * demangle.c (set_demangling_command): Ditto. - * defs.h (set_demangling_style): Ditto. - * maint.c (maintenance_info_command): Ditto. - (print_section_table): Ditto. - (maintenance_info_sections): Ditto. - (maintenance_print_command): Ditto. - * symtab.h (maintenance_print_statistics): Ditto. - * objfiles.h (in_plt_section): Ditto. - * objfiles.c (add_to_objfile_sections): Ditto. - * bcache.c (hash): Ditto. - (lookup_cache): Ditto. - * exec.c (bfdsec_to_vmap): Ditto. - (ignore): Ditto. - * f-exp.y (growbuf_by_size, match_string_literal): Ditto. - * language.c (unk_lang_printchar): Ditto. - (unk_lang_printstr): Ditto. - (unk_lang_create_fundamental_type): Ditto. - (unk_lang_print_type): Ditto. - (unk_lang_val_print): Ditto. - (unk_lang_value_print): Ditto. - * target.c (update_current_target): Ditto. - (debug_to_open): Ditto. - (debug_to_close): Ditto. - (debug_to_attach): Ditto. - (debug_to_detach): Ditto. - (debug_to_resume): Ditto. - (debug_to_wait): Ditto. - (debug_to_fetch_registers): Ditto. - (debug_to_store_registers): Ditto. - (debug_to_prepare_to_store): Ditto. - (debug_to_xfer_memory): Ditto. - (debug_to_files_info): Ditto. - (debug_to_insert_breakpoint): Ditto. - (debug_to_remove_breakpoint): Ditto. - (debug_to_terminal_init): Ditto. - (debug_to_terminal_inferior): Ditto. - (debug_to_terminal_ours_for_output): Ditto. - (debug_to_terminal_ours): Ditto. - (debug_to_terminal_info): Ditto. - (debug_to_kill): Ditto. - (debug_to_load): Ditto. - (debug_to_lookup_symbol): Ditto. - (debug_to_create_inferior): Ditto. - (debug_to_mourn_inferior): Ditto. - (debug_to_can_run): Ditto. - (debug_to_notice_signals): Ditto. - (debug_to_thread_alive): Ditto. - (debug_to_stop): Ditto. - * breakpoint.h (set_breakpoint_sal): Ditto. - * remote-utils.c (usage): Ditto. - * remote.c (set_thread): Ditto. - (remote_thread_alive): Ditto. - (get_offsets): Ditto. - (read_frame): Ditto. - (remote_insert_breakpoint): Ditto. - (remote_remove_breakpoint): Ditto. - * sparc-nat.c (fetch_core_registers): Ditto. - * corelow.c (add_to_thread_list): Ditto. - (ignore): Ditto. - * inftarg.c (proc_wait): Ditto. - * infptrace.c (udot_info): Ditto. - (fetch_register): Ditto. - * ser-unix.c (hardwire_noflush_set_tty_state): Ditto. - (hardwire_print_tty_state): Ditto. - (hardwire_flush_output): Ditto. - (hardwire_flush_input): Ditto. - (hardwire_send_break): Ditto. - (hardwire_setstopbits): Ditto. - * ser-tcp.c (tcp_return_0): Ditto. - (tcp_noflush_set_tty_state): Ditto. - (tcp_print_tty_state): Ditto. - * solib.c (match_main): Ditto. - * gdbtypes.c (print_bit_vector): Ditto. - (print_arg_types): Ditto. - (dump_fn_fieldlists): Ditto. - (print_cplus_stuff): Ditto. - * symfile.h (entry_point_address): Ditto. - * symfile.c (decrement_reading_symtab): Ditto. - * valops.c (value_arg_coerce): Ditto. - * value.h (find_function_in_inferior): Ditto. - (value_allocate_space_in_inferior): Ditto. - * values.c (vb_match): Ditto. - * thread.c (info_thread_command): Ditto. - (restore_current_thread): Ditto. - (thread_apply_all_command): Ditto. - (thread_apply_command): Ditto. - * inferior.h (write_pc_pid): Ditto. - * infrun.c (delete_breakpoint_current_contents): Ditto. - * breakpoint.c (print_it_normal): Ditto. - (watchpoint_check): Ditto. - (print_it_done): Ditto. - (print_it_noop): Ditto. - (maintenance_info_breakpoints): Ditto. - (create_longjmp_breakpoint): Ditto. - (hbreak_command): Ditto. - (thbreak_command): Ditto. - (watch_commnd_1): Ditto. - (rwatch_command): Ditto. - (awatch_command): Ditto. - (do_enable_breakpoint): Ditto. - * ch-valprint.c (chill_val_print_array_elements): Ditto. - * eval.c (evaluate_subexp): Ditto. - (get_label): Ditto. - (evaluate_struct_tuple): Ditto. - * eval.c (init_array_element): Ditto. - - * alpha-tdep.c (push_sigtramp_desc): Add prototype and make static. - * breakpoint.c (hw_breakpoint_used_count): Ditto. - (hw_watchpoint_used_count): Ditto. - * findvar.c (write_register_gen): Ditto. - (read_register_pid): Ditto. - * symtab.c (cplusplus_hint): Ditto. - * infcmd.c (breakpoint_auto_delete_contents): Ditto. - * ch-valprint.c (chill_print_type_scalar): Ditto. - * gdbtypes.c (add_name): Ditto. - (add_mangled_type): Ditto. - (cfront_mangle_name): Ditto. - * sparc-tdep.c (isbranch): Ditto. - * inftarg.c (child_stop): Ditto. - * win32-nat.c (child_stop): Ditto. - * mac-nat.c (child_stop): Ditto. - * remote-utils.c (sr_com): Ditto. - * dbxread.c (process_now): Ditto. - * ch-exp.c (require): Ditto. - (check_token): Ditto. - (expect): Ditto. - (parse_mode_call): Ditto. - (parse_mode_or_normal_call): Ditto. - * scm-lang.c (scm_lookup_name): Ditto - * f-lang.c (allocate_saved_bf_node): Ditto. - (allocate_saved_function_node): Ditto. - (allocate_saved_f77_common_node): Ditto. - (allocate_common_entry_node): Ditto. - (add_common_block): Ditto. - (add_common_entry): Ditto. - (find_first_common_named): Ditto. - (patch_common_entries): Ditto. - (patch_all_commons_by_name): Ditto. - (clear_bf_list): Ditto. - (get_bf_for_fcn): Ditto. - (clear_function_list): Ditto. - * scm-exp.c (scm_istr2int): Ditto. - (scm_istring2number): Ditto. - * scm-valprint.c (scm_inferior_print): Ditto. - * f-typeprint.c (print_equivalent_f77_float_type): Ditto. - * f-valprint.c (f77_get_dynamic_length_of_aggregate): Ditto. - (f77_create_arrayprint_offset_tbl): Ditto. - (f77_print_array_1): Ditto. - (f77_print_array): Ditto. - (list_all_visible_commons): Ditto. - (there_is_a_visible_common_named): Ditto. - * mdebugread.c (ecoff_relocate_efi): Ditto. - * callback.c (os_close): Ditto. - (os_get_errno): Ditto. - (os_isatty): Ditto. - (os_lseek): Ditto. - (os_open): Ditto. - (os_read): Ditto. - (os_read_stdin): Ditto. - (os_write): Ditto. - (os_write_stdout): Ditto. - (os_rename): Ditto. - (os_system): Ditto. - (os_time): Ditto. - (os_unlink): Ditto. - (os_shutdown): Ditto. - (os_init): Ditto. - (os_printf_filtered): Ditto. - - * scm-lang.h (scm_parse): Change old style decl to prototype. - * config/alpha/tm-alphalinux.h (alpha_linux_sigtramp_offset): Ditto. - * top.c (init_proc): Ditto. - (query_hook): Ditto. - (error_hook): Ditto. - * f-lang.c (c_value_print): Ditto. - * ch-exp.c (parse_expression): Ditto. - (parse_primval): Ditto. - (parse_untyped_expr): Ditto. - (parse_opt_untyped_expr): Ditto. - (ch_lex): Ditto. - * config/sparc/tm-sparc.h (sparc_init_extra_frame_info): Ditto. - (sparc_frame_saved_pc): Ditto. - (sparc_push_dummy_frame): Ditto. - (sparc_pop_frame): Ditto. - * defs.h (fclose): Ditto. - (atof): Ditto. - (error_hook): Ditto. - - * arc-tdep.c (single_step): Change arg to type "enum target_signal". - * rs6000-tdep.c (single_step): Ditto. - * sparc-tdep.c (single_step): Ditto. - - * breakpoint.c (cleanup_executing_breakpoints): Change unused arg type - to PTR which is what make_cleanup expects. - * utils.c (null_cleanup): Change arg type to PTR. - * defs.h (null_cleanup): Change prototype to match actual function. - * config/sparc/tm-sparc.h (struct frame_info): Move forward decl. - * ch-valprint.c (chill_val_print): Cast 2nd arg of - chill_print_type_scalar to LONGEST. - * infrun.c (wait_for_inferior): Have empty switch case for - BPSTAT_WHAT_CHECK_SHLIBS when SOLIB_ADD is not defined. - (stop_on_solib_events): Only needed if SOLIB_ADD is defined. - * infcmd.c (attach_command): Only need auto_solib_add if SOLIB_ADD - is defined. - * symfile.c (generic_load): Scan long int using a long int spec, - not an int spec. - * infptrace.c (udot_info): Only need local variables if KERNEL_U_SIZE - is defined. - (fetch_register): Only need function if FETCH_INFERIOR_REGISTERS is - not defined. - * inflow.c (handle_sigio): Only need prototype when the actual - function is compiled in. - * valprint.c (longest_to_int): Expand error message to be - separate messages for args larger than largest signed int - and args smaller than smallest signed int. - * valprint.c (print_longest): Fix problems with support for case - where compiler supports type "long long" but the runtime doesn't - support printing them with "%ll". - * scm-valprint.c (scm_scmlist_print, scm_scmval_print): Change - return types to void since we don't actually return anything - meaningful and callees ignore the values anyway. - * procfs.c (modify_inherit_on_fork_flag): Enclose pr_flags in PIOCSET - ifdef. - (modify_run_on_last_close_flag): Ditto. - (wait_fd): Enclose local variables "num_fds" and "i" LOSING_POLL - ifdef - * alpha-tdep.c (push_sigtramp_desc): Return proc_desc rather than - random value. - * infrun.c (wait_for_inferior): Ensure random_signal is not used - uninitialized. - * valops.c (call_function_by_hand): Ensure struct_addr is not used - uninitialized. - * breakpoint.c (watch_command_1): Ensure prev_frame is not used - uninitialized. - * utils.c (vfprintf_maybe_filtered): Change second arg from "char *" - to "const char *". - * infptrace.c (udot_info): Add two dummy args so that the type is - correct for passing to add_info. - * f-lang.c (saved_fcn): Move decl to head of file so it can be used - in prototypes. - (saved_bf_symnum): Ditto. - (SAVED_FUNCTION): Ditto. - (SAVED_FUNCTION_PTR): Ditto. - (SAVED_BF): Ditto. - (SAVED_BF_PTR): Ditto. - * ch-exp.c (parse_named_record_element): Build error message in - temporary buffer before passing it to expect, rather than passing - wrong number of args to expect. - * demangle.c (set_demangling_style): Call set_demangling_command with - correct number of arguments. - * inferior.h (terminal_init_inferior_with_pgrp): Change arg type to - int to match actual function. - (os_isatty): Call fdmap with right number of arguments, was missing - the host_callback* arg. - * target.c (cleanup_target): Prototype all functions casts. - * target.h (one_stepped, single_step): Declare here and convert - single_step to prototype. - * infrun.c (one_stepped, single_step): Don't declare externs - here, they have moved to target.h. - * eval.c (init_array_element): Declare previously undeclared - last two args as LONGEST. - * dcache.c (dcache_xfer_memory): Change xfunc decls to prototype form. - -Thu Jul 25 16:11:54 1996 Doug Evans <dje@canuck.cygnus.com> - - * dsrec.c (load_srec): Protect ANSI style function parms with PARAMS. - -Mon Jul 22 18:13:27 1996 Stu Grossman (grossman@critters.cygnus.com) - - * Makefile.in (os9kread.o): Remove dependency on partial-stab.h. - * dbxread.c (read_dbx_symtab end_psymtab), partial-stab.h: Don't - use partial_symtab->textlow==0 as a flag, as 0 is a legitimate - text address. Use a seperate flag (textlow_not_set) instead. - This makes stabs in ELF .o files work a lot better. - * mdebugread.c xcoffread.c: Define textlow_not_set for - partial-stab.h. - * stabsread.h (end_psymtab): Add textlow_not_set arg to prototype. - -Sat Jul 20 10:41:06 1996 Fred Fish <fnf@cygnus.com> - - * dwarf2read.c (struct filenames): Change internal "struct file" - to "struct fileinfo" to avoid conflict with "struct file" in - <sys/file.h> on HPUX and Solaris. - -Fri Jul 19 14:05:57 1996 Stan Shebs <shebs@andros.cygnus.com> - - * dwarf2read.c: New file, DWARF 2 reader originally contributed by - Brent Benson, with additions by Gary Funck and Jerry Kreuscher. - * Makefile.in (COMMON_OBS): Add dwarf2read.o. - (SFILES): Add dwarf2read.c. - (dwarf2read.o): Add build rule. - * symfile.h (dwarf2_has_info, dwarf2_build_psymtabs): Declare - exported functions. - * elfread.c (elf_symfile_read): Call them. - (elf_symtab_read) [HARRIS_TARGET]: Skip some special symbols. - -Thu Jul 18 01:22:01 1996 Geoffrey Noer <noer@cygnus.com> - - * symfile.c (symfile_bfd_open): - * exec.c (exec_file_command): for __GO32__ and __WIN32__ systems, - free the user from having to type the .exe extension. - -Wed Jul 17 06:54:50 1996 Mark Alexander <marka@cygnus.com> - - * mon960-rom.c: Shorten the mon960_inits string to a single - carriage return; this prevents a hang on connecting immediately - after powerup, when MON960 is attempting autobaud detection. - -Tue Jul 16 23:47:04 1996 Mark Alexander <marka@cygnus.com> - - * a29k-tdep.c (get_saved_register): Allow PC to be modified - when innermost frame is selected, but not in outer frames. - -Tue Jul 16 23:37:25 1996 Stu Grossman (grossman@critters.cygnus.com) - - * command.c (do_setshow_command): Don't segfault when showing - var_string and var_string_noescape vars that are NULL. - -Mon Jul 15 16:55:48 1996 Doug Evans <dje@canuck.cygnus.com> - - * win32-nat.c (handle_load_dll): dos_path_to_unix_path renamed to - cygwin32_conv_to_posix_path. - (child_create_inferior): unix_path_to_dos_path renamed to - cygwin32_conv_to_win32_path. Rewrite code to translate PATH. - -Mon Jul 15 16:44:05 1996 Stu Grossman (grossman@critters.cygnus.com) - - * defs.h printcmd.c: Create global disassemble_info structure - tm_print_insn_info. - * i386-tdep.c (set_assembly_language_command): set - tm_print_insn_info.mach to the appropriate value for 386 or 8086 - disassembly. - * printcmd.c (print_insn): Move init of disassembler_info to - _initialize_printcmd. Set endian for disassembler here. - * sparc-tdep.c: Set tm_print_insn_info.mach as appropriate to - select sparc/sparclite. - * config/sparc/{tm-sparc.h tm-sparclite.h}: Get rid of - TM_PRINT_INSN. Set TM_PRINT_INSN_MACH to - bfd_mach_sparc/bfd_mach_sparc_sparclite. - -Fri Jul 12 19:04:32 1996 Fred Fish <fnf@cygnus.com> - - * hpread.c (hpread_lookup_type): Use xmmalloc/xmrealloc rather - than xmalloc/xrealloc. - -Fri Jul 12 17:59:47 1996 Fred Fish <fnf@cygnus.com> - - * objfiles.c (map_to_file): Error return from mmalloc_findbase is - a NULL pointer, not a -1. - -Fri Jul 12 10:16:24 1996 Stu Grossman (grossman@critters.cygnus.com) - - * i386-tdep.c (set_assembly_language_command): New routine to - select between i386 and i8086 instruction sets for disassembly. - New command `set assembly-language {i386 i8086}'. - -Thu Jul 11 21:13:21 1996 Mark Alexander <marka@cygnus.com> - - * monitor.c (monitor_write_memory, monitor_read_memory_single): - Disable use of "long long" memory read/write commands; can't - use them because we hold the values to read/write in an int - variable, and because strtoul fails on values that exceed the - size of a long. This fixes breakpoint problems on MON960. - -Thu Jul 11 11:39:31 1996 Fred Fish <fnf@cygnus.com> - - * config/m68k/xm-hp300hpux.h (HAVE_MMAP): Remove definition. - * config/pa/xm-hppah.h (HAVE_MMAP): Ditto. - -Wed Jul 10 16:54:41 1996 Fred Fish <fnf@cygnus.com> - - * Makefile.in (MMALLOC_CFLAGS): Eliminate intermediate MMALLOC_DISABLE - and MMALLOC_CHECK macros, and add comment indicating how host dependent - makefile fragment should modify MMALLOC_CFLAGS to not use mmalloc, or - to use it but to not do heap corruption checking. - * gdbserver/Makefile.in: Ditto. - * utils.c (init_malloc): Replace warning() use with direct call of - fprintf_unfiltered, since current_target has not yet been set and thus - we cannot use warning(). If we try to use mmcheck and it fails, - suggest that this configuration needs NO_MMCHECK or MMCHECK_FORCE - defined. Other small mmalloc related cleanups. - * config/sparc/sun4os4.mh (MMALLOC_CFLAGS): Define MMCHECK_FORCE to 1. - * config/alpha/alpha-osf2.mh (MMALLOC_CFLAGS): Set to -DNO_MMCHECK. - - * config/sparc/xm-sun4os4.h (MMAP_BASE_ADDRESS, MMAP_INCREMENT): - * config/i386/xm-i386v4.h (MMAP_BASE_ADDRESS, MMAP_INCREMENT): - * config/i386/xm-linux.h (MMAP_BASE_ADDRESS, MMAP_INCREMENT): - * config/m68k/xm-hp300hpux.h (MMAP_BASE_ADDRESS, MMAP_INCREMENT): - * config/m68k/xm-m68kv4.h (MMAP_BASE_ADDRESS, MMAP_INCREMENT); - * config/m68k/xm-sun3os4.h (MMAP_BASE_ADDRESS, MMAP_INCREMENT): - * config/pa/xm-hppah.h (MMAP_BASE_ADDRESS, MMAP_INCREMENT): - * config/sparc/xm-sun4sol2.h (MMAP_BASE_ADDRESS, MMAP_INCREMENT): - Remove obsolete defines. - - * config/alpha/alpha-linux.mh (MMALLOC_DISABLE): - * config/alpha/alpha-osf1.mh (MMALLOC_DISABLE): - * config/rs6000/rs6000.mh (MMALLOC_DISABLE): - * config/rs6000/aix4.mh (MMALLOC_DISABLE): - * config/powerpc/aix4.mh (MMALLOC_DISABLE): - * config/powerpc/aix.mh (MMALLOC_DISABLE): - * config/ns32k/ns32km3.mh (MMALLOC_DISABLE): - * config/mips/mipsm3.mh (MMALLOC_DISABLE): - * config/mips/decstation.mh (MMALLOC_DISABLE): - * config/m88k/cxux.mh (MMALLOC_DISABLE): - * config/i386/i386mk.mh (MMALLOC_DISABLE): - * config/i386/i386m3.mh (MMALLOC_DISABLE): - * config/i386/i386gnu.mh (MMALLOC_DISABLE): - Use MMALLOC_CFLAGS instead. - -Tue Jul 9 22:41:12 1996 Jeffrey A Law (law@cygnus.com) - - * h8300-tdep.c: Remove some outdated comments. - (h8300_skip_prologue): Rework to be more correct for the H8/300H. - Handle stm.l insns for the H8/S. - (examine_prologue): Likewise. - -Tue Jul 9 16:48:55 1996 Raymond Jou <rjou@mexican.cygnus.com> - - * ser-mac.c (mac_close): Change a typo SetSetBuf to SerSetBuf. - -Mon Jul 08 08:50:39 1996 Mark Alexander <marka@cygnus.com> - - * mon960-rom.c (mon960_open): Add floating point detection to - prevent hang on non-FPU processors (PR 9775). - (mon960_cmds): Swap setmem.cmdw and setmem.cmdl to fix problem - setting breakpoints and improve loading speed. - -Sun Jul 7 14:57:34 1996 Fred Fish <fnf@cygnus.com> - - * coffread.c (record_minimal_symbol): Don't presave name string - on symbol_obstack before passing to prim_record_minimal_symbol. - It now handles saving the string itself. - * dbxread.c (read_dbx_dynamic_symtab): Ditto. - * mipsread.c (read_alphacoff_dynamic_symtab): Ditto. - * os9kread.c (record_minimal_symbol): Ditto. - * solib.c (solib_add_common_symbols): Ditto. - - * coffread.c (coff_symtab_read): Don't presave name string on - symbol_obstack before passing to prim_record_minimal_symbol_and_info. - It now handles saving the string itself. - * dbxread.c (record_minimal_symbol): Ditto. - * elfread.c (record_minimal_symbol_and_info): Ditto. - - * dstread.c (record_minimal_symbol): Remove static function that just - called prim_record_minimal_symbol with the same args (after change to - prim_record_minimal_symbol to do it's own name string saves). - * nlmread.c (record_minimal_symbol): Ditto. - * somread.c (record_minimal_symbol): Ditto. - - * hpread.c (hpread_read_enum_type): Save symbol name on symbol obstack. - (hpread_read_function_type): Ditto. - (hpread_process_one_debug_symbol): Ditto. - * mdebugread.c (parse_symbol): Ditto. - (new_symbol): Ditto. - * minsyms.c (prim_record_minimal_symbol_and_info): Ditto. - - * coffread.c (process_coff_symbol): Use obsavestring to save - SYMBOL_NAME, rather than obstack_copy0. - * dstread.c (create_new_symbol): Ditto - * symfile.c (obconcat): Ditto. - * stabsread.c (patch_block_stabs): Ditto. - * xcoffread.c (SYMNAME_ALLOC): Ditto. - - * symfile.c (obsavestring): Update comments - * solib.c (solib_add_common_symbols): Remove local var origname. - -Wed Jul 3 15:56:08 1996 Stu Grossman (grossman@critters.cygnus.com) - - * configure: Re-build with autoconf-2.10. - - * sparcl-tdep.c (_initialize_sparc_tdep) config/sparc/tm-sparc.h, - config/sparc/tm-sparclite.h: Initialize tm_print_insn from - TM_PRINT_INSN, which comes from the tm file. - -Tue Jul 02 21:41:20 1996 Mark Alexander <marka@cygnus.com> - - * coffread.c, dbxread.c, elfread.c, mipsread.c, nlmread.c, - os9kread.c: Replace identical sym_offsets functions with - default_symfile_offsets. - * somread.c (som_symfile_offsets): Use new SIZEOF_SECTION_OFFSETS - macro to allocate section_offsets. - * symfile.c (default_symfile_offsets): New function. - * symfile.h: Declare default_symfile_offsets. - * symtab.h: Define SIZEOF_SECTION_OFFSETS macro to - simplify allocation of section_offsets. - -Tue Jun 11 12:02:55 1996 Stu Grossman (grossman@critters.cygnus.com) - - * Makefile.in (INTERNAL_LDFLAGS): Add in flags from configure. - * configure configure.in: Only make sol-thread.o for native. - Also, switch to dlopened libthread_db.so.1. - * sol-thread.c: Switch to using dlopen to get the thread_db - library. - -Thu Jun 13 16:53:25 1996 Stu Grossman (grossman@critters.cygnus.com) - - * configure, configure.in: Change test for libthread_db to only - work for configs where build/host/target are the same. - -Tue Jul 2 15:04:20 1996 Michael Meissner <meissner@tiktok.cygnus.com> - - * config/powerpc/{linux.mh,xm-linux.h}: New files, for Linux on - PowerPC. - - * configure.in (powerpc-*-linux): Add Linux, System V, and ELF - support. - * configure: Regenerate. - -Mon Jul 1 13:00:43 1996 Stan Shebs <shebs@andros.cygnus.com> - - From Raymond Jou <rjou@mexican.cygnus.com>: - * mpw-make.sed: Add lines to whack out autoconf hook - @CONFIG_LDFLAGS@. - -Mon Jul 01 11:07:15 1996 Mark Alexander <marka@cygnus.com> - - * remote-e7000.c (e7000_stop): New function. - -Fri Jun 28 06:34:19 1996 Dawn Perchik <dawn@cygnus.com> - - * configure, configure.in: Add target sparclet. - * monitor.h, monitor.c: Added monitor flags MO_NO_ECHO_ON_SETMEM - (don't expect echo on setmem command), MO_RUN_FIRST_TIME (if - command to start process running on target is different from one - to continue execution), MO_HEX_PREFIX (if addresses from monitor - have a "0x" prefix). - * monitor.c, parse.c, sparc-tdep.c: Don't require strings in the - registers array. This is to allow NULLs to be place holders in - the tm-*.h file so that only minor changes are needed when a new - processor is introduced (eg, one without floating point). - * sparc-tdep.c: Conditionally remove dependancies on floating - point. - * sparclet-rom.c, config/sparc/sparclet.mt, - config/sparc/tm-sparclet.h: New files for target sparclet. - * symfile.c (load_command): Add option for 2nd parameter; a load - offset added to the vma of each section. - -Fri Jun 28 05:39:19 1996 Dawn Perchik <dawn@cygnus.com> - - * main.c (main): Add option "l" for setting remote_timeout. - -Fri Jun 28 05:25:18 1996 Dawn Perchik <dawn@cygnus.com> - - * remote-e7000.c, remote.c, target.h, top.c: Add set option - "remote_timeout" for setting remote_timeout. Add set option - "use_hard_breakpoints" for setting hardware .vs. memory - breakpoints. - -Fri Jun 28 04:32:18 1996 Dawn Perchik <dawn@cygnus.com> - - * remote-e7000.c (e7000_parse_device): New function. - Add option "tcp_remote" to target command if using - tcp to connect to a remote host which is then connected - via serial port to the e7000 (for exampole, a port master). - (e7000_open): Change to call e7000_parse_device. - -Fri Jun 28 03:47:17 1996 Dawn Perchik <dawn@cygnus.com> - - * monitor.c (monitor_debug): Fix remotedebug buffering. - -Thu Jun 27 18:24:17 1996 Stan Shebs <shebs@andros.cygnus.com> - - * config/i386/cygwin32.mh, config/powerpc/cygwin32.mh - (NATDEPFILES): Add a space. - -Wed Jun 26 06:05:39 1996 Wilfried Moser <moser@rtl.cygnus.com> - - * gdbtypes.c (create_array_type): If TYPE_LENGTH (result_type) - is zero, set TYPE_FLAG_TARGET_STUB to force reevaluation of the type. - - * ch-exp.c (calculate_array_length): Function removed. - -Tue Jun 25 17:41:06 1996 Martin M. Hunt <hunt@pizza.cygnus.com> - - * remote-e7000.c (e7000_read_inferior_memory_large): New function. - (e7000_xfer_inferior_memory): Call it. - -Tue Jun 25 23:14:07 1996 Jason Molenda (crash@godzilla.cygnus.co.jp) - - * gdb/gdbserver/Makefile.in (docdir): Removed. - -Tue Jun 25 22:05:38 1996 Jason Molenda (crash@godzilla.cygnus.co.jp) - - * Makefile.in (bindir, libdir, datadir, mandir, infodir, includedir): - Use autoconf set values. - (docdir): Removed. - * configure.in (AC_PREREQ): autoconf 2.5 or higher. - * nlm/Makefile.in (bindir, libdir, datadir, mandir, infodir, - includedir): Use autoconf set values. - (docdir): Removed. - * nlm/configure.in (AC_PREREQ): autoconf 2.5 or higher. - * nlm/configure: Rebuilt. - * gdb/gdbserver/Makefile.in (datadir): Set to $(prefix)/share. - -Mon Jun 24 09:56:14 1996 Angela Marie Thomas (angela@cygnus.com) - - * stabsread.c (read_cfront_member_functions): add type - -Sun Jun 23 23:40:48 1996 Doug Evans <dje@canuck.cygnus.com> - - * win32-nat.c: #include <unistd.h>. - (unix_paths_to_dos_paths, dos_paths_to_unix_paths): Delete. - (child_create_inferior): Convert only env var PATH to win32 style. - (set_pathstyle_dos): Delete. - (_initialize_inftarg): Delete dos-path-style command. - -Thu Jun 20 13:42:23 1996 Doug Evans <dje@canuck.cygnus.com> - - * configure.in: Revise sol-thread.o test. - * configure: Regenerated. - - * source.c (find_source_lines): Reassign size to result of read. - -Tue Jun 18 16:25:54 1996 Jeffrey A. Law <law@rtl.cygnus.com> - - * h8300-dep.c (gdb_print_insn_h8300): Handle the H8/S. - (h8300_command): Likewise. - (set_machine): Likewise. - (set_machine_hook): Likewise. - (_initialize_h8300m): Likewise. - - * config/h8300/tm-h8300.h (h8300smode): Declare. - -Sun Jun 16 15:21:51 1996 Jeffrey A. Law <law@rtl.cygnus.com> - - * somsolib.c (som_solib_create_inferior_hook): Handle tracking - of shl_load calls for hpux10. - -Thu Jun 13 11:16:10 1996 Tom Tromey <tromey@thepub.cygnus.com> - - * config.in: Regenerated. - * acconfig.h (HAVE_THREAD_DB_LIB): Added entry. - - * configure: Regenerated. - * aclocal.m4 (CY_AC_PATH_TCLH, CY_AC_PATH_TKH): Use odd names to - avoid name clashes with SunOS headers. - -Tue Jun 11 19:52:50 1996 Fred Fish <fnf@cygnus.com> - - From Michael Snyder <Michael_Snyder@next.com>: - * bcache.c (print_bcache_statistics): Avoid divide-by-zero - exception if one or more objfile has no symbols, such as when - a dynamic library has been stripped. - -Tue Jun 11 12:02:55 1996 Stu Grossman (grossman@critters.cygnus.com) - - * Makefile.in (INTERNAL_LDFLAGS): Add in flags from configure. - * configure configure.in: Only make sol-thread.o for native. - Also, switch to dlopened libthread_db.so.1. - * sol-thread.c: Switch to using dlopen to get the thread_db - library. - -Mon Jun 10 14:17:19 1996 Fred Fish <fnf@cygnus.com> - - * config/sparc/{xm-sun4sol2.h,xm-sun4os4.h} (MMAP_BASE_ADDRESS): - Change from 0xE0000000 to 0xC0000000. - -Thu Jun 6 17:10:32 1996 Michael Meissner <meissner@tiktok.cygnus.com> - - * config/powerpc/xm-solaris.h: Initial version of support for - Solaris on PowerPC. - -Wed Jun 5 01:52:57 1996 James G. Smith <jsmith@cygnus.co.uk> - - * configure.in (configdirs): Force 4100 builds to use 4300 GDB - target. - * configure: Rebuild. - - * config/mips/vr4300el.mt (SIM_OBS): Include simulator in - little-endian builds. - -Mon Jun 3 11:48:29 1996 Jeffrey A Law (law@cygnus.com) - - * inftarg.c (child_thread_alive): Protect declaration with - #ifndef CHILD_THREAD_ALIVE. - - * source.c (find_source_lines): Check the time on the symtab's bfd if - it exists, else check the time on the exec_bfd. - -Thu May 30 09:43:17 1996 Mark Alexander <marka@cygnus.com> - - * dsrec.c (make_srec): Fix calculation of address size - to allow addresses less than 0x100. - -Thu May 30 04:24:09 1996 Wilfried Moser <moser@rtl.cygnus.com> - - * ch-exp.c (ch_lex): In case of LOC_TYPEDEF call calculate_array_length. - -Tue May 28 16:15:47 1996 Geoffrey Noer <noer@cygnus.com> - - * remote-mips.c: cannot use EINVAL for breakpoint test since - its value varies for different hosts (e.g. go32's is 19, while - sunos is 22). Changed to hardcoded 22 since that is what the - mips boards return. - -Tue May 28 11:14:58 1996 Tom Tromey <tromey@creche.cygnus.com> - - * configure: Regenerated. - * aclocal.m4 (CY_AC_PATH_TCLH): Don't use AC_TRY_RUN. - (CY_AC_PATH_TKH): Don't use AC_TRY_RUN. - -Sun May 26 16:56:35 1996 Miles Bader <miles@gnu.ai.mit.edu> - - * solib.c (solib_absolute_prefix, solib_search_path): New variables. - (_initialize_solib): Add set/show commands for those variables. - (solib_map_sections): Implement searching using them. - -Sun May 26 14:14:49 1996 Fred Fish <fnf@cygnus.com> - - Changes from: David Mosberger-Tang <davidm@azstarnet.com> - - * NEWS: Add Alpha Linux as a new native configuration. - - * mdebugread.c (parse_symbol): When we find a malloc() symbol with - return type VOID, assume no debugging info is available for that - object file and patch the return value into VOID *. Otherwise, - operations requiring an implicit call to malloc() will fail. - - * infrun.c (wait_for_inferior): The criterion to detect entering a - sigtramp handler is now: (a) the current pc is inside a sigtramp - handler, (b) the previous pc is not in a sigtramp handler, and (c) - the current stack pointer is "inner" than the old one. Condition - (c) is new to avoid mistaking a return from a signal handler into - sigtramp as a new sigtramp invocation. - - * dcache.c (struct dcache_block): Declare addr as CORE_ADDR. An - int may not be big enough to hold an address. - (dcache_hit): Ditto. - (dcache_peek_byte): Fix indentation. - - * configure.in (alpha-*-linux*): Add target. - * configure: Rebuild - - * config/alpha/tm-alpha.h (PROC_DESC_IS_DYN_SIGTRAMP): New macro. - (SET_PROC_DESC_IS_DYN_SIGTRAMP): Ditto. - (DYNAMIC_SIGTRAMP_OFFSET): Ditto. - (SIGCONTEXT_ADDR): Ditto. - (FRAME_PAST_SIGTRAMP_FRAME): Ditto. - - * config/alpha/alpha-linux.mh: New file. - * config/alpha/alpha-linux.mt: Ditto. - * config/alpha/nm-linux.h: Ditto. - * config/alpha/tm-alphalinux.h: Ditto. - * config/alpha/xm-alphalinux.h: Ditto. - * config/alpha/xm-alphaosf.h: Renamed from xm-alpha.h. - * config/alpha/alpha-osf1.mh (XM_FILE): Change from xm-alpha.h to - xm-alphaosf.h. - * config/alpha/alpha-osf2.mh: Ditto. - - * blockframe.c (find_pc_partial_function): Pass PC to - SIGTRAMP_START and SIGTRAMP_END macros for the benefit of systems - that detect sigtramp code via designated code sequences (as is the - case for Linux/Alpha, for example). - - * config/i386/tm-i386bsd.h: Change SIGTRAMP_START and SIGTRAMP_END - to ignore new PC argument. - * config/m68k/tm-hp300bsd.h: Ditto. - * config/vax/tm-vax.h: Ditto. - - * alpha-tdep.c (alpha_linux_sigtramp_offset): New function. - (alpha_osf_skip_sigtramp_frame): Ditto. - (push_sigtramp_desc): Ditto. - (alpha_find_saved_regs): Use SIGCONTEXT_ADDR macro to extract - sigcontext address from frame. - (alpha_saved_pc_after_call): When in sigtramp, use - alpha_frame_saved_pc() instead of read-register(). - (after_prologue): When inside a dynamically generated sigtramp - function, there is no prologue, so return address of first - instruction. - (alpha_in_prologue): Fix typo in comment. - (find_proc_desc): Use macro DYNAMIC_SIGTRAMP_OFFSET to determine - whether we're inside a dynamicaly generated sigtramp function. If - so, create and push and appropriate procedure descriptor. - (alpha_frame_chain): Use macro FRAME_PAST_SIGTRAMP_FRAME to obtain - the frame past a sigtramp frame (if the current frame is indeed a - sigtramp function). - (init_extra_frame_info): Don't read next frame register off of - stack-pointer when inside a dynamiccaly generated sigtramp. - (alpha_pop_frame): Also unlink and destroy procedure descriptors - created for dynamically generated sigtramp functions. - - * alpha-nat.c: When compiling under Linux, include <asm/reg.h> and - <alpha/ptrace.h> instead of <machine/reg.h> - -Tue Jul 2 13:58:10 1996 Miles Bader <miles@gnu.ai.mit.edu> - - * gnu-nat.c (inf_validate_task_sc): - Give terminal to gdb while asking question. - (inf_resume): Don't validate the task suspend-count while execing. - -Thu Jun 13 11:04:52 1996 Miles Bader <miles@gnu.ai.mit.edu> - - * gnu-nat.c (inf_validate_task_sc): Query user before clearing any - additional suspend count. - (S_proc_wait_reply, gnu_attach): Don't call inf_validate_task_sc. - (inf_resume): Call inf_validate_task_sc here. - (gnu_resume): Call inf_update_procs to ensure noticing new threads. - -Fri Jun 7 17:00:43 1996 Miles Bader <miles@gnu.ai.mit.edu> - - * gnu-nat.c (gnu_create_inferior: attach_to_child): Return PID. - -Thu May 23 15:13:56 1996 Jeffrey A Law (law@cygnus.com) - - * h8300-tdep.c (IS_PUSH): Refine. - (IS_MOVE_FP, IS_MOV_SP_FP): Accept H8/300H varaints. - (IS_SUB4_SP, IS_SUBL_SP): New macros. - (h8300_skip_prologue): Handle H8/300H prologue code sequences. - (examine_prologue): Handle addresses from 0x010000 to 0xffffff - when in H8/300H mode. Get the return pointer's address correctly - for the H8/300H. Handle H8/300H prolouge code sequences. - - * symfile.c (generic_load): Print the starting address - of the file just loaded. - -Thu May 23 12:09:52 1996 Stan Shebs <shebs@andros.cygnus.com> - - * mpw-make.sed: Edit @THREAD_DB_OBS@ out of makefile. - -Tue May 21 11:53:56 1996 Peter Schauer (pes@regent.e-technik.tu-muenchen.de) - - * breakpoint.c (bpstat_do_actions): Avoid endless recursion - if a `source' command is contained in bs->commands. - - * infrun.c (wait_for_inferior): Update step_frame_address when - stepping into a new line. - - From schwab@issan.informatik.uni-dortmund.de (Andreas Schwab): - * breakpoint.c (breakpoint_1): Add shlib_disabled case to - bpenables array. - -Mon May 20 22:52:00 1996 Mark Alexander <marka@cygnus.com> - - * dsrec.c (load_srec): Add WAITACK parameter, for machines - like EST visionICE that send back an ACK after each S-record. - * monitor.c (monitor_wait_srec_ack): New function. - (monitor_load): Pass monitor_wait_srec_ack to load_srec - if the monitor's MO_SREC_ACK flag is set. - * monitor.h: Define MO_SREC_ACK flag. - * remote-est.c (est_cmds): Add MO_SREC_ACK flag. - * sh3-rom.c (sh3_load): Accomodate change in load_srec prototype. - * srec.h: Add WAITACK parameter to load_srec prototype. - -Sun May 19 21:22:00 1996 Rob Savoye <rob@chinadoll> - - * config/sparc/sparclite.mt: Add the sparc simulator. - -Sun May 19 16:49:37 1996 Fred Fish <fnf@cygnus.com> - - * defs.h (read_command_lines, query_hook): Update prototypes. - (readline_begin_hook, readline_hook, readline_end_hook): Declare. - * breakpoint.c (commands_command): Build message in temporary buffer - and pass that, as well as tty control flag, to read_command_lines. - * top.c (readline_begin_hook, readline_hook, readline_end_hook): - Define here. - (command_loop): Check for non-NULL instream before looping. - (command_line_input): Use readline_hook when appropriate, to get - user input from a GUI window. - (read_next_line): Also build prompt if getting user input from a GUI. - (recurse_read_control_structure): Fix typo in comment. - (read_command_lines): Use passed in prompt and tty flag to decide how - to build message. Use readline_begin_hook when appropriate, to set - up a GUI interaction window. Just return head, whether NULL or not, - after using readline_end_hook to complete GUI interaction. - (define_command, document_command): Build message in a temporary - buffer and pass it to read_command_lines, along with tty flag. - - -Sat May 18 02:43:58 1996 Peter Schauer (pes@regent.e-technik.tu-muenchen.de) - - * blockframe.c (frameless_look_for_prologue): - Add FUNCTION_START_OFFSET only if func_start is non-zero. - * minsyms.c (lookup_minimal_symbol_by_pc): Return NULL if - pc is not in a known section. - * stack.c (print_frame_info): Remove check for fi->pc in known - section, now handled by lookup_minimal_symbol_by_pc. - - -Fri May 17 13:31:04 1996 Stan Shebs <shebs@andros.cygnus.com> - - * sh-stub.c: New file, was config/sh/stub.c. - - -Wed May 15 08:25:12 1996 Jeffrey A Law (law@cygnus.com) - - * top.c (read_next_line): Fix thinkos. From Donn Seeley. - - * coffread.c (coff_symtab_read): Handle C_LABEL symbols like - C_STAT symbols. - * h8300-tdep.c (h8300_pop_frame): Reset $sp and $pc correctly. - Flush cached frames just before exiting. - * remote-sim.c (gdbsim_resume): Complain if the program isn't - being run. - * config/h8300/tm-h8300.h (BELIEVE_PCC_PROMOTION): Define. - -Tue May 14 18:05:16 1996 Stu Grossman (grossman@critters.cygnus.com) - - * procfs.c (procfs_thread_alive procfs_stop): Make static. - (procfs_pid_to_str): New routine to print out thread id's in an - intelligible manner. - * sol-thread.c (sol_thread_fetch_registers): Re-order manner in - which supply_register is called to fix bug with writing - individual regs. - * config/sparc/tm-sun4sol2.h: Define default for - target_pid_to_str in case host lacks libthread_db. - -Mon May 13 23:53:30 1996 Stu Grossman (grossman@critters.cygnus.com) - - * Makefile.in config.in configure configure.in - config/sparc/nm-sun4sol2.h config/sparc/sun4sol2.mh - config/sparc/tm-sun4sol2.h: Use autoconf to config Solaris thread - and pthread support, since pre-2.5 systems don't come with - libthread_db.so.1. - - * procfs.c (info_proc): Use int instead of id_t. Old versions of - Irix don't seem to define this. - -Mon May 13 17:40:58 1996 Jeffrey A Law (law@cygnus.com) - - * top.c (execute_control_command, case while_control): Allow - a while command to be interrupted. - -Mon May 13 16:17:36 1996 Stu Grossman (grossman@critters.cygnus.com) - - * sol-thread.c: More cleanup, add comments. - (sol_thread_resume): Prevent people from trying to step - inactive threads. - (sol_thread_wait sol_thread_fetch_registers - sol_thread_store_registers): Remove unnecessary check for - sol_thread_active. These routines won't get called unless threads - are active. - -Mon May 13 11:29:37 1996 Stan Shebs <shebs@andros.cygnus.com> - - SH3-E support from Allan Tajii <atajii@hmsi.com>: - * sh-tdep.c (sh_reg_names, sh3_reg_names): Add empty names for - float registers. - (sh3e_reg_names): New register name array. - (sh_processor_type_table): Add sh3e processor type. - * config/sh/tm-sh.h (REGISTER_VIRTUAL_TYPE): Fix test. - (REGISTER_NAMES, NUM_REGS, NUM_REALREGS, etc): Adjust for - full set of registers. - * remote-e7000.c (want_sh3, want_sh3_nopc): New globals. - (e7000_fetch_registers, e7000_wait): Use them. - * sh3-rom.c (sh3_regnames): Add float registers. - (sh3e_cmds, sh3e_ops): New globals. - (sh3e_open): New function. - (_initialize_sh3_rom): Rename from _initialize_sh3, set up - sh3e target vector. - -Fri May 10 15:53:38 1996 Stu Grossman (grossman@lisa.cygnus.com) - - * sol-thread.c: Cleanup. gcc -Wall fixes. Add prototypes. - Print out messages instead of codes for thread_db errors. Make - access macros for thread and lwp manipulation. Make cleanups to - fixup inferior_pid in case of errors. - -Thu May 9 19:06:02 1996 Fred Fish <fnf@cygnus.com> - - * aclocal.m4: Remove unused definition of AC_C_CROSS. - * configure.in: Add powerpcle-*-solaris* host and target config - so April 30th change does not get lost next time configure is - rebuilt. - -Thu May 9 14:13:08 1996 Stu Grossman (grossman@critters.cygnus.com) - - * Makefile.in, breakpoint.c, corelow.c, fork-child.c, inflow.c, - infrun.c, mac-nat.c, procfs.c, remote.c, sol-thread.c, thread.c, - win32-nat.c, config/nm-lynx.h: Rename thread.h to gdbthread.h to - avoid conflict with Solaris /usr/include/thread.h. - -Thu May 9 12:33:32 1996 Rob Savoye <rob@chinadoll.cygnus.com> - - * abug-rom.c: Config file for the older style ABug monitor that - runs on the mvme13x boards. - * config/m68k/monitor.mt: Add abug support for m68k cross - debugging. - -Wed May 8 20:33:24 1996 Fred Fish <fnf@cygnus.com> - - * infcmd.c (do_registers_info): Always print the raw floating - point value's bytes in big endian order, so the the leftmost bit - is the most significant. - * breakpoint.c (clear_momentary_breakpoints): Remove dead code - that is referenced nowhere else. - (set_breakpoint): Ditto. - (do_enable_breakpoint): Created from enable_once_breakpoint - with a couple of changes. - (enable_breakpoint): Call do_enable_breakpoint with an appropriate - bpdisp enum value to set disposition of breakpoint. - (enable_once_breakpoint): Ditto. - (enable_delete_breakpoint): Ditto. - * breakpoint.h (clear_momentary_breakpoints): Remove prototype. - * symtab.c (find_pc_line): Improve comments. - * xcoffread.c: Ditto. - -Tue May 7 18:37:06 1996 Stan Shebs <shebs@andros.cygnus.com> - - * target.c (debug_to_xfer_memory): Insert line breaks when - dumping the memory block. - -Mon May 6 13:52:52 1996 Stu Grossman (grossman@critters.cygnus.com) - - * fork-child.c (fork_inferior), inferior.h: init_trace_fun now - returns a possibly modified pid. - * inftarg.c (ptrace_him): Now returns pid; - * m3-nat.c (m3_trace_him): Now returns pid; - * infcmd.c (run_command): Minor cleanup. - * infrun.c (wait_for_inferior): Add another check for one_stepped - near where we read the pc to avoid erroneously setting - random_signal for multi-threaded support. - * procfs.c: Add support for Solaris LWPs. Remove def of - LOSING_POLL. Many cleanups... Several workarounds for Solaris - lossage. System call entry and exit are now handled by - dynamically registered handlers. - * (syscallname): Don't barf when handed an unknown syscall - number. - * (info_proc_syscalls): Ditto. - * sol-thread.c: New file. Implements Solaris thread support. - * symfile.c (symbol_file_add): Add call to target_new_objfile to - notify target-dependent code about new symbol tables. - * (clear_symtab_users): Call target_new_objfile to notify it of - the removal of all symbol tables. - * target.c (push_target): Make sure that to_close is non-zero - before calling it. - * target.h (target_new_objfile): Provide default. - * config/alpha/nm-osf2.h: Define LOSING_POLL because this version - of OSF can't hack using poll with /proc. - * config/sparc/nm-sun4sol2.h (target_new_objfile): Define to be - sol-thread-new-objfile. - * config/sparc/sun4sol2.mh: Add sol-thread.o to NATDEFFILES, and - add libthread_db.so.1 to NAT_CLIBS. - * config/sparc/tm-sun4sol2.h: Define PIDGET, TIDGET, and - target_pid_to_str. - -Sat May 4 02:13:34 1996 N Srin Kumar <nsrin@wipinfo.soft.net> - - * procfs.c (remove_fd): Fix copy of fds to fill hole left after - removal of the requested fd. - -Mon May 6 07:52:48 1996 Michael Meissner <meissner@tiktok.cygnus.com> - - * rs6000-tdep.c (_initialize_rs6000_tdep): Don't do XCOFF specific - hooks under ELF. - - * config/powerpc/tm-ppc-eabi.h: Define ELF_OBJECT_FORMAT. - -Thu May 2 12:46:14 1996 Jeffrey A Law (law@cygnus.com) - - From Peter Schauer: - * breakpoint.h (enum bpdisp): Add del_at_next_stop. - * breakpoint.c (insert_breakpoints, watchpoint_check, - bpstat_stop_status): Avoid bad references to memory freed via - delete_breakpoint on watchpoints going out of scope. - Do not delete these watchpoints, disable them and change their - disposition to del_at_next_stop instead. - (breakpoint_auto_delete): Delete all breakpoints whose disposition - is del_at_next_stop. - (breakpoint_init_inferior): Use switch to avoid reference to - already deleted breakpoint. - -Wed May 1 17:29:18 1996 Fred Fish <fnf@cygnus.com> - - * Makefile.in (rs6000-nat.o): Depend on xcoffsolib.h. - * config/rs6000/rs6000.mh (NATDEPFILES): Move xcoffread.o ... - * config/rs6000/rs6000.mt (TDEPFILES): ... to here. - * xcoffsolib.c (xcoff_relocate_symtab_hook): Define and initialize. - (solib_info): Call xcoff_relocate_symtab via the hook. - (sharedlibrary_command): Ditto. - * xcoffread.c: Remove all FAKING_RS6000 comments and defines. - (xcoff_add_toc_to_loadinfo_hook): Define and initialize here. - (xcoff_init_loadinfo_hook): Define and initialize here. - (scan_xcoff_symtab): Call xcoff_add_toc_to_loadinfo via the hook. - (xcoff_initial_scan): Call xcoff_init_loadinfo via the hook. - * xcoffsolib.h (xcoff_relocate_symtab_hook): Declare extern func. - * rs6000-tdep.c (_initialize_rs6000_tdep): Add initializations - of xcoff_add_toc_to_loadinfo_hook and xcoff_init_loadinfo_hook. - * rs6000-nat.c (_initialize_core_rs6000): Add initialization - of xcoff_relocate_symtab_hook. - -Tue Apr 30 13:22:02 1996 Michael Meissner <meissner@tiktok.cygnus.com> - - * configure (powerpcle-*-solaris*): Add Solaris support. - - * config/powerpc/{solaris.m[ht],tm-solaris.h}: New files for - Solaris support. - -Mon Apr 29 16:17:31 1996 Dawn Perchik <dawn@cygnus.com> - - * c-valprint.c (c_val_print): Fix printing for arrays defined - with 0 length. - -Sun Apr 28 15:08:05 1996 Stan Shebs <shebs@andros.cygnus.com> - - Support for bi-endian remote breakpoints. - * remote.c (big_break_insn, little_break_insn): New globals. - (break_insn): Remove. - (remote_insert_breakpoint, remote_remove_breakpoint): Use own - code if REMOTE_BREAKPOINT defined, otherwise call memory - breakpoint functions. - * config/sh/tm-sh.h (REMOTE_BREAKPOINT): Remove. - (BIG_REMOTE_BREAKPOINT, LITTLE_REMOTE_BREAKPOINT): Define. - - * mon960-rom.c (mon960_cmds): Remove forward decl. - (mon960_load): Use current_monitor instead of mon960_cmds. - (mon960_regnames): Remove backslashes from line ends. - (_initialize_mon960): Fix documentation string. - -Sun Apr 28 12:10:35 1996 Fred Fish <fnf@cygnus.com> - - * symfile.h (psymbol_allocation_list): Expand comments which - describe the psymbol allocation list and how each field is - used. - -Sun Apr 28 03:44:30 1996 Peter Schauer (pes@regent.e-technik.tu-muenchen.de) - - * breakpoint.c (delete_breakpoint): Fix bpt->val, bpt->exp - storage leaks. - (breakpoint_re_set_one): Fix b->exp, b->val, b->cond storage leaks. - - * infcmd.c (run_command), solib.c (locate_base): Check for - target_has_execution in addition to inferior_pid, a core file - from a threaded program is yielding a non-zero inferior_pid. - - * sparc-tdep.c (get_saved_register): Handle window registers - in a dummy frame correctly. - -Sat Apr 27 20:38:32 1996 Fred Fish <fnf@cygnus.com> - - * Makefile.in (CLIBS): Move $(MMALLOC) past all other libs, - so that anything that wants an allocation function not yet pulled - in, will get it from mmalloc rather than a system library. - * Makefile.in (INSTALLED_LIBS): Reorder to match order of CLIBS, - to avoid surprising results when used. - -Sat Apr 27 00:12:05 1996 Dawn Perchik (dawn@cygnus.com) - - * stabsread.c: Changes and bug fixes for cfront support. - Fix bug for class data members. - Fix parsing bug when no base classes exist. - Fix memory bug - allocate space for cplusplus specific info. - Add support for static data. - Add prototypes for static functions. - Enhance comments to show what each function expects to parse. - Cleanup code. - * stabsread.c(resolve_cont),dbxread.c(resolve_cont): Rename - function to resolve_cfront_continuation. - -Fri Apr 26 23:58:26 1996 Jeffrey A Law (law@cygnus.com) - - * infrun.c (wait_for_inferior): Call registers_changed when - restarting the inferior to get over a nullified instruction. - -Tue Apr 24 12:12:55 1996 Dawn Perchik (dawn@cygnus.com) - - * dbxread.c,stabsread.c,gdbtypes.c,partial-stab.h,valops.c: - Add new support for parsing cfront stabs. - -Wed Apr 24 00:32:55 1996 Jeffrey A Law (law@cygnus.com) - - * infrun.c (wait_for_inferior): Move "have_waited" label - outside of #ifdef conditionals. Don't trash the wait status - if we get a signal and the current instruction is nullified. - -Mon Apr 22 20:17:01 1996 Fred Fish <fnf@cygnus.com> - - * Makefile.in (VERSION): Bump version number to 4.16.1. - * NEWS: Update for 4.16 release. - -Mon Apr 22 16:32:29 1996 Stan Shebs <shebs@andros.cygnus.com> - - * monitor.h: Clean up comment formatting. - (current_monitor): Remove decl. - (LOADTYPES, LOADPROTOS, INIT_CMD, etc): Remove definitions. - (push_monitor, SREC_SIZE): Remove. - * monitor.c: Expand old macro into current_monitor derefs - everywhere. - * remote-os9k.c (current_monitor): Remove definition. - -Mon Apr 22 14:54:45 1996 Mark Alexander <marka@superball.cygnus.com> - - * corefile.c (specify_exec_file_hook): Allow arbitrary number of - hooks. - (call_extra_exec_file_hooks): New function. - * h8300-tdep.c: Lint; add .h files to provide missing declarations, - remove unused variables. - (set_machine_hook): New function. - (_initialize_h8300m): Initialize it. - -Fri Apr 19 15:03:49 1996 Ian Lance Taylor <ian@cygnus.com> - - * remote-mips.c (encoding): Don't specify size, to avoid bug in - SunOS native compiler. - -Thu Apr 18 18:46:57 1996 Stan Shebs <shebs@andros.cygnus.com> - - * monitor.c: Use int rather than LONGEST for values, since - the formatting strings are not prepared to accept long longs. - -Wed Apr 17 20:17:27 1996 Doug Evans <dje@canuck.cygnus.com> - - * arm-tdep.c (initialize_arm_tdep): Make apcs32 a `zinteger'. - -Tue Apr 16 17:38:23 1996 Stu Grossman (grossman@critters.cygnus.com) - - * corelow.c (add_to_thread_list): Make sure reg_sect is non-null - before de-referencing it. Prevents deref of NULL pointer if core - file lacks .reg section. - * defs.h: Rename floatformat_{to from}_long_double to - floatformat_{to from}_doublest. Get rid of FLOATFORMAT_{TO - FROM}... macros. - * findvar.c (extract_floating store_floating): Change all refs to - FLOATFORMAT_{FROM TO}... to floatformat_{from to}_doublest. - * utils.c: Change floatformat_{to from}_long_double to - floatformat_{to from}_doublest cuz the new routines will use - whatever size (double or long double) is appropriate. - * config/i960/tm-i960.h (REGISTER_CONVERT_TO_VIRTUAL - REGISTER_CONVERT_TO_RAW): Change FLOATFORMAT... macros to - floatformat... routine calls. - -Mon Apr 15 16:34:11 1996 Per Bothner <bothner@kalessin.cygnus.com> - - * stabsread.c (read_type): Move handling of '@' from type - number handling to handling of types proper (as emitted by gcc!). - For typedefs, allocate the typedef type before reading its - definition, to properly handling recursive types. - -Mon Apr 15 11:19:26 1996 Jeffrey A Law (law@cygnus.com) - - * ch-exp.c (calculate_array_length): Fix prototype. - -Sat Apr 13 14:21:16 1996 Stu Grossman (grossman@critters.cygnus.com) - - * remote-nindy.c (nindy_open): Acquire more target state so that - user can attach to a previously running program. - * (nindy_fetch_registers nindy_store_registers): Get rid of fp - conversion code. That's all handled in {extract store}_floating - now. - * utils.c (floatformat_to_double): Don't bias exponent when - handling zero's, denorms or NaNs. - * config/i960/tm-i960.h (REGISTER_CONVERT_TO_VIRTUAL - REGISTER_CONVERT_TO_RAW): Change to using DOUBLST and - FLOATFORMAT_TO/FROM_DOUBLEST macros. - * config/i960/tm-nindy960.h: Undefine - REGISTER_CONVERT_TO_VIRTUAL, REGISTER_CONVERT_TO_RAW, and - REGISTER_CONVERTIBLE. These are no longer necessary now that all - the magic happens in extract/store_floating. - -Sat Apr 13 02:58:02 1996 Peter Schauer (pes@regent.e-technik.tu-muenchen.de) - - * eval.c (evaluate_subexp_standard): Report error when attempting to - evaluate subscripts for types which cannot be subscripted. - - * valarith.c (value_x_binop, value_x_unop): Add noside parameter. - Return a zero value with the return type of the member function - if noside is EVAL_AVOID_SIDE_EFFECTS instead of calling the member - function. - * values.h (value_x_binop, value_x_unop): Update prototypes - accordingly. - * eval.c (evaluate_subexp_standard): Update all callers of - value_x_binop, value_x_unop accordingly. - - * valarith.c (value_neg, value_complement): Perform ANSI C/C++ - integral promotion on operands. - -Fri Apr 12 13:19:27 1996 Fred Fish <fnf@cygnus.com> - - * README: Update for 4.16 release. - * configure.in (AC_CHECK_FUNCS): Also check for sbrk. - * configure: Regenerate with autoconf. - * config.in: Regenerate with autoheader. - * main.c (main): Only use sbrk() when HAVE_SBRK is defined. - * top.c (command_loop): Ditto. - -Fri Apr 12 09:45:29 1996 Stu Grossman (grossman@critters.cygnus.com) - - * defs.h: Define TARGET_{FLOAT DOUBLE LONG_DOUBLE}_FORMAT - defaults for bi-endian targets. Replace function pointers for - floatformat routines with macros. No need for these to be runtime - selectable. - * findvar.c: Get rid of floatformat function pointers. Use - macros in extract_floating and store_floating. - * remote-nindy.c (nindy_fetch_registers nindy_store_registers): - Use floatformat macros. - -Thu Apr 11 21:28:02 1996 Fred Fish <fnf@cygnus.com> - - From: Miles Bader <miles@gnu.ai.mit.edu> - * configure.in (AC_CHECK_HEADERS): check for endian.h. - Use AC_CHECK_TOOL to find AR & RANLIB. Add AC_PROG_AWK. - Add host & target cases for i[345]86-*-gnu*. - * config.in: Regenerate with autoheader. - * configure: Regenerate with autoconf. - * Makefile.in (AR, AWK): Set from corresponding autoconf substs. - (init.c): Don't scan mig-generated files. - * defs.h (endian.h): Include if HAVE_ENDIAN_H defined. - * config/nm-m3.h (ATTACH_NO_WAIT): Define. - * infcmd.c (attach_command): Use "#ifndef ATTACH_NO_WAIT" - rather than "#ifndef MACH". - -Thu Apr 11 18:49:42 1996 Stan Shebs <shebs@andros.cygnus.com> - - * remote.c (remotewritesize): New GDB variable, controls size - of memory packets sent to the target. - -Thu Apr 11 13:47:52 1996 Stu Grossman (grossman@critters.cygnus.com) - - * dcache.c: Add prototypes. Make many functions static. - * (dcache_peek dcache_fetch dcache_poke): Make dcache_fetch and - dcache_poke call dcache_xfer_memory directly in order to fix - problems with turning off dcache. dcache_peek is now unnecessary, - so it goes away. - - * defs.h: Define new macros HOST_{FLOAT DOUBLE LONG_DOUBLE}_FORMAT - and TARGET_{FLOAT DOUBLE LONG_DOUBLE}_FORMAT to specify a pointer - to a struct floatformat. This allows for better handling of - targets whose floating point formats differ from the host by more - than just byte order. - * (floatformat_to_long_double floatformat_from_long_double): - Prototypes for new functions in utils.c. - * (floatformat_to_doublest floatformat_from_doublest): Prototypes - for pointers to floating point conversion functions. The actual - function uses either double or long double if the host supports it. - * findvar.c (floatformat_to_doublest floatformat_from_doublest): - Initialize to point at correct function depending on HAVE_LONG_DOUBLE. - * (extract_floating store_floating): Rewrite. Now, if host fp - format is the same as the target, we just do a copy. Otherwise, - we call floatformat_{to from}_doublest. - * remote-nindy.c (nindy_xfer_inferior_memory): Change param - `write' to `should_write'. - * utils.c (floatformat_to_long_double - floatformat_from_long_double): New routines that implement long - double versions of functions in libiberty/floatformat.c. - * config/i960/tm-i960.h (TARGET_LONG_DOUBLE_FORMAT): Define this for - i960 extended real (80 bit) numbers. - * nindy-share/nindy.c (ninMemGet ninMemPut): Return number of bytes - actually read or written. - -Wed Apr 10 02:56:06 1996 Wilfried Moser <moser@rtl.cygnus.com> - - * ch-valprint.c (chill_val_print): Remove call to calculate_array_length. - (calculate_array_length): Move function from here ... - - * ch-exp.c (calculate_array_length): ... to here. - (parse_primval): If we have a symbol with an array type - and the length is 0, call calculate_array_length. - -Tue Apr 9 01:23:05 1996 Wilfried Moser <moser@rtl.cygnus.com> - - * eval.c (evaluate_subexp_standard): In case of TYPE_CODE_SET: - Add some checks for powerset compatibility. - - * valops.c (value_slice): Use lowbound instead of lowerbound for - call to slice_range_type to get correct bounds. - -Mon Apr 8 12:53:56 1996 Fred Fish <fnf@cygnus.com> - - * Makefile.in (scm-exp.o, scm-lang.o, scm-valprint.o): Add targets and - dependencies. - * scm-lang.c (gdb_string.h): Include. - * objfiles.c (add_to_objfile_sections): Cast second arg of obstack_grow - call to correct type (char *). - * cp-valprint.c (cp_print_static_field): Ditto. - * somsolib.c (som_solib_create_inferior_hook): Add a declaration - for external find_unwind_entry function (from hppa-tdep.c). - * remote-pa.c (remote_write_bytes, remote_read_bytes): Change - type of second arg to "char *" to be type compatible with - dcache. - (remote_wait): Cast second arg to strtol to correct type. - * hppa-tdep.c (compare_unwind_entries): Change argument types to - "const void *" to be type compatible with qsort, and then - assign to local args prior to use. - -Mon Apr 8 15:35:52 1996 Jeffrey A Law (law@cygnus.com) - - * infptrace.c (kill_inferior): Remove call to "kill"; update - comments. - -Mon Apr 8 14:05:07 1996 Geoffrey Noer <noer@cygnus.com> - - * remote-e7000.c: don't append :23 to target port if __WIN32__ - is defined (it's WinGDB). - -Sun Apr 7 22:34:29 1996 Fred Fish <fnf@cygnus.com> - - From: Miles Bader <miles@gnu.ai.mit.edu> - * gnu-nat.c, gnu-nat.h, msg.defs, exc_request.defs, i386gnu-nat.c, - msg_reply.defs, notify.defs, process_reply.defs, reply_mig_hack.awk, - config/nm-gnu.h, config/i386/{i386gnu.mh, i386gnu.mt, nm-gnu.h, - m-i386gnu.h, xm-i386gnu.h}: New files for GNU hurd. - -Sun Apr 7 13:32:41 1996 Fred Fish <fnf@cygnus.com> - - * configure.in (case host): Add i386sco5 host. - * configure: Regenerate. - - From: Robert Lipe <robertl@dgii.com> - Add support for SCO OpenServer 5 (a.k.a. 3.2v5*) This - target is an SVR3.2 with COFF, ELF, and shared libes, but - no /proc. - * config/i386/i386sco5.mh: New file. - * config/i386/nm-i386sco5.h: New file. - -Sat Apr 6 08:55:22 1996 Fred Fish <fnf@cygnus.com> - - * bcache.c (bcache): When size of chunk to cache is exactly equal to - BCACHE_MAXLENGTH, stash chunk as unique copy. - -Sat Apr 6 00:46:26 1996 Fred Fish <fnf@cygnus.com> - - * symfile.c (INLINE_ADD_PSYMBOL): Remove ifdef. - (add_psymbol_to_list): Add an arg for passing CORE_ADDR values and - use it, rather than calling add_psymbol_addr_to_list. - (add_psymbol_addr_to_list): Delete. - (add_psymbol_to_list): Make psymbol static to avoid random data in - gaps due to alignment of structure members. - * symfile.h (INLINE_ADD_PSYMBOL, ADD_PSYMBOL_TO_LIST, - ADD_PSYMBOL_ADDR_TO_LIST): Remove. Real world tests show no - performance improvements by inlining via complicated macros and - they just make gdb larger and harder to maintain. - * dwarfread.c (add_enum_psymbol): Replace ADD_PSYMBOL_TO_LIST - and/or ADD_PSYMBOL_ADDR_TO_LIST macro(s) with call to - add_psymbol_to_list with appropriate long or CORE_ADDR args. - (add_partial_symbol): Ditto. - * partial-stab.h: Ditto. - * os9kread.c (read_os9k_psymtab): Ditto - * mdebugread.c (parse_partial_symbols): Ditto. - (handle_psymbol_enumerators): Ditto. - (demangle.h): Include. - * hpread.c (hpread_build_psymtabs): Ditto. - (hpread_build_psymtabs): Ditto. - (demangle.h): Include - -Thu Apr 4 20:16:55 1996 Fred Fish <fnf@cygnus.com> - - * configure.in: Check for setpgid function. - * config.in: Regenerate with autoheader. - * configure: Regenerate with autoconf. - * inflow.c (_initialize_inflow): Only try to use _SC_JOB_CONTROL - if it is actually defined. - (gdb_setpgid): Use HAVE_SETPGID. - * ch-exp.c: Change include of <string.h> to "gdb_string.h". - * c-exp.y, f-exp.y, m2-exp.y: Ditto. - * c-exp.y, serial.c: Include <ctype.h>. - * config/m68k/nm-news.h: Add typedef for pid_t which is - apparently missing from <sys/types.h>. Enclose entire - file in NM_NEWS_H ifndef and define when included. - * config/mips/nm-news-mips.h: Ditto. - * config/m68k/tm-m68k.h (REGISTER_CONVERT_TO_VIRTUAL, - REGISTER_CONVERT_TO_RAW): Change name of temporary variable. - -Thu Apr 4 19:04:18 1996 Stan Shebs <shebs@andros.cygnus.com> - - * arm-xdep.c: Move native-specific code to here from arm-tdep.c. - * arm-tdep.c (arm_apcs_32): New global. - (arm_addr_bits_remove, arm_saved_pc_after_call, - arm_push_dummy_frame, arm_pop_frame): New functions. - (arm_skip_prologue): Updated version from Richard Earnshaw. - (_initialize_arm_tdep): Add set/show "apcs32". - * config/arm/tm-arm.h (ADDR_BITS_REMOVE): Call - arm_addr_bits_remove. - (SAVED_PC_AFTER_CALL): Call arm_saved_pc_after_call. - (frame_find_saved_regs): Declare properly. - (PUSH_DUMMY_FRAME): Call arm_push_dummy_frame. - (POP_FRAME): Call arm_pop_frame, use ADDR_BITS_REMOVE instead of - explicit mask. - * config/arm/nm-arm.h: New file. - * config/arm/xm-arm.h (KERNEL_U_ADDR, FETCH_INFERIOR_REGISTERS): - Move definitions to nm-arm.h. - * config/arm/arm.mh (NAT_FILE): Define. - - * symfile.c (generic_load): Initialize data_count properly. - -Thu Apr 4 17:17:53 1996 Fred Fish <fnf@cygnus.com> - - * symmisc.c (print_objfile_statistics): Print memory used by - psymbol cache obstack. - -Thu Apr 4 15:43:07 1996 Stan Shebs <shebs@andros.cygnus.com> - - * symfile.c (report_transfer_performance): New function. - (generic_load): Call it to report transfer rate. - * remote-e7000.c (e7000_load): Ditto. - -Mon Apr 1 16:31:00 1996 Stan Shebs <shebs@andros.cygnus.com> - - * mpw-make.sed: Change references to config.h to be in objdir, - edit out rules to rebuild config.h. - -Mon Apr 1 08:32:23 1996 Fred Fish <fnf@cygnus.com> - - * hppa-tdep.c (hppa_pop_frame): Call clear_proceed_status before - proceeding. - -Sun Mar 31 16:15:43 1996 Fred Fish <fnf@cygnus.com> - - * hppah-nat.c (store_inferior_registers, store_inferior_registers, - fetch_register, child_xfer_memory): Use call_ptrace function supplied - by infptrace.c rather than calling ptrace directly. - -Sun Mar 31 15:39:00 1996 Stan Shebs <shebs@andros.cygnus.com> - - * mon960-rom.c: Cleanups and elimination of unused code, - clarify documentation string. - (mon960_serial, mon960_ttyname): Remove. - * config/i960/tm-mon960.h (ADDITIONAL_OPTIONS, - ADDITIONAL_OPTION_CASES, ADDITIONAL_OPTION_HELP): Remove. - -Sat Mar 30 11:00:22 1996 Fred Fish <fnf@cygnus.com> - - * configure.in: Check whether printf family supports printing - long doubles or not and define PRINTF_HAS_LONG_DOUBLE if so. - * acconfig.h: Provide default undef for PRINTF_HAS_LONG_DOUBLE. - * configure: Regenerate. - * valprint.c (print_floating): Use PRINTF_HAS_LONG_DOUBLE. - * c-exp.y (parse_number): Use PRINTF_HAS_LONG_DOUBLE. - * configure.in: Fix have_gregset and have_fpregset autoconf - variable names so that they match the pattern required to - cache them. - -Fri Mar 29 21:39:56 1996 Fred Fish <fnf@cygnus.com> - - * core-aout.c (fetch_core_registers): Cast core_reg_size to int - before testing against reg_ptr. - * eval.c (evaluate_subexp_standard): Cast type of - TYPE_FN_FIELD_VOFFSET to int. - * findvar.c (extract_signed_integer, extract_unsigned_integer, - extract_long_unsigned_integer): Cast type of sizeof to int. - * values.c (unpack_field_as_long, modify_field): Ditto. - * valops.c (value_assign, call_function_by_hand): Ditto. - * infcmd.c (do_registers_info): Ditto. - * ser-tcp.c (tcp_open): Ditto. - * remote.c (putpkt): Ditto. - * dcache.c (dcache_peek): Ditto. - * dcache.c (dcache_poke): Ditto. - * m2-exp.y (yylex): Ditto. - * gnu-regex.c (re_match_2): Ditto. - * f-lang.c (ADD_BF_SYMNUM, saved_bf_list_end, tmp_bf_ptr): Ifdef - out unused macro definition and variables. - * inftarg.c (proc_wait): Move from main.c to here, and make static. - * valprint.c (val_print_string): Change bufsize from int to unsigned. - * main.c (wait.h): Include. - * top.c (command_line_input): Remove unused variable "c". - * f-typeprint.c (f_type_print_varspec_prefix): Add missing enum - value TYPE_CODE_TYPEDEF to switch statement. - (f_type_print_varspec_suffix): Add missing enum value - TYPE_CODE_TYPEDEF to switch statement. - * ch-exp.c (parse_primval): Add remaining enumeration values to - switch statement, with no specific action. - (ch_lex): Add LOC_UNRESOLVED in switch statement. - (pushback_token): Ifdef out, since code using it is ifdef'd out. - * stabsread.c (cleanup_undefined_types): Remove unused label - "badtype". - * objfiles.h (print_symbol_bcache_statistics): Add prototype. - * maint.c (objfiles.h): Include. - (maintenance_print_statistics): Remove unused variable "temp". - * minsyms.c (lookup_minimal_symbol_solib_trampoline): Remove - unused variable "found_file_symbol". - * m2-exp.y (yylex): Add LOC_UNRESOLVED case to switch. - * language.c (lang_bool_type): Use existing function local type - variable rather than create block local variables. - * solib.c (disable_break): Enclose in ifndef SVR4_SHARED_LIBS. - * infptrace.c (wait.h, command.h): Include. - * ser-tcp.c (gdb_string.h): Include - * i386-tdep.c (codestream_seek): Change "place" to CORE_ADDR. - (i386_get_frame_setup): Change "pc" from int to CORE_ADDR. - * command.c (complete_on_enum): Make assignment used as truth value - explictly check against NULL. - (wait.h): Include. - * infrun.c (wait_for_inferior): Ifdef out prologue_pc since code - that uses it is ifdef'd out. - * parser-defs.h: Add prototype for write_dollar_variable. - * infrun.c: Add prototype for write_pc_pid. - * breakpoint.h: Add prototype for re_enable_breakpoints_in_shlibs. - * symmisc.c (bcache.h): Include. - * bcache.h: Add prototype for print_bcache_statistics. - * symfile.c: Include <time.h>. - * printcmd.c (print_scalar_formatted): Change len to unsigned int. - * valarith.c (value_equal): Cast result of TYPE_LENGTH to int. - * valarith.c (value_binop): Change result_len, promoted_len1, - and promoted_len2 to unsigned int. - * valarith.c (value_subscripted_rvalue): Change elt_offs and - elt_size to unsigned int. - * valops.c (value_array): Change typelength to unsigned int. - (destructor_name_p): Change len to unsigned int. - * scm-lang.h (scm_parse): Add prototype for scm_unpack. - * symfile.c (decrement_reading_symtab): Change return type to void. - * valarith.c (value_subscript): Remove unused variable "word". - (value_subscript): Remove unused variable "tint". - * valops.c (auto_abandon): Ifdef out, since code using it is also - ifdef'd out. - * eval.c (init_array_element): Remove unused variable "val". - * Makefile.in (values.o): Depends on scm-lang.h. - (command.o): Depends upon wait_h. - (ser-tcp.o): Depends upon gdb_string.h. - (infptrace.o): Depends upon wait_h and command_h. - (maint.o): Depends on objfiles.h and symfile.h. - * values.c (allocate_repeat_value): Remove unused variable - "element_type". - (scm-lang.h): Include. - * breakpoint.c (create_longjmp_breakpoint): Enclose in - GET_LONGJMP_TARGET define, unused otherwise. - * config/i386/nm-linux.h: Add prototypes for i386_insert_watchpoint, - i386_remove_watchpoint and i386_stopped_by_watchpoint. - -Thu Mar 28 12:53:19 1996 Doug Evans <dje@canuck.cygnus.com> - - * configure.in (sparc64-*-solaris2*): Delete. - Stick with sparc-*-solaris2*. - * configure: Regenerated. - -Thu Mar 28 06:51:26 1996 Fred Fish <fnf@cygnus.com> - - * valops.c (value_assign): Make copy of internal variable value - before returning it as a new value, since it is owned by the - internal variable and will be freed along with it. - -Wed Mar 27 08:36:17 1996 Jeffrey A Law (law@cygnus.com) - - * From Peter Schauer. - * breakpoint.c (breakpoint_re_set_one): Keep temporary - breakpoints bp_until, bp_finish, bp_watchpoint_cope, bp_call_dummy - and bp_step_resume in case breakpoint_re_set_one is called due - to a step over a dlopen call. - * infrun.c (wait_for_inferior): Always remove breakpoints from - inferior in BPSTAT_WHAT_CHECK_SHLIBS case. - -Tue Mar 26 13:15:32 1996 Fred Fish <fnf@cygnus.com> - - * config/mips/tm-mips.h (COERCE_FLOAT_TO_DOUBLE): Only prefer - non-prototyped case over prototyped case for C. - * config/pa/tm-hppa.h (COERCE_FLOAT_TO_DOUBLE): Ditto. - -Sat Mar 23 17:24:28 1996 Fred Fish <fnf@cygnus.com> - - * os9kread.c (os9k_process_one_symbol): Note nonportable - assumption that an int can hold a char *. - - * bcache.h (struct hashlink): Wrap data[] inside union with - double to force longest alignment. - (BCACHE_DATA): New macro to access data[]. - (BCACHE_ALIGNMENT): New macro to get offset to data[]. - * bcache.c (lookup_cache, bcache): Use BCACHE_DATA to get - address of cached data. Use BCACHE_ALIGNMENT to compute - amount of space to allocate for each hashlink struct. - -Sat Mar 23 12:14:02 1996 Fred Fish <fnf@cygnus.com> - - * ch-lang.c (evaluate_subexp_chill): Fix typo. - -Thu Mar 21 08:27:19 1996 Fred Fish <fnf@cygnus.com> - - * Makefile.in (VERSION): Bump version to 4.15.3 - -Thu Mar 21 10:56:41 1996 Ian Lance Taylor <ian@cygnus.com> - - * config.in: Rename from config.h.in. - * configure.in: Call AC_CONFIG_HEADER with config.h:config.in. - Change CONFIG_HEADERS test in AC_OUTPUT accordingly. - * configure: Rebuild. - * Makefile.in (stamp-h): Depend upon config.in, not config.h.in. - Set CONFIG_HEADERS to config.h:config.in. - -Tue Mar 19 12:47:51 1996 Peter Schauer (pes@regent.e-technik.tu-muenchen.de) - - * partial-stab.h (case N_ENDM): Finish current partial symbol - table for Solaris 2 cc. - -Tue Mar 19 10:39:15 1996 Jeffrey A Law (law@cygnus.com) - - * rs6000-nat.c (exec_one_dummy_insn): Don't clobber the - PC in the registers array. From Peter Schauer. - -Mon Mar 18 13:47:09 1996 Fred Fish <fnf@cygnus.com> - - * symfile.c (reread_symbols): Reinitialize bcache struct - members to zero using memset. Also use memset to reinit - global_psymbols and static_psymbols, rather than explicitly - resetting each structure member. - -Sat Mar 16 19:47:36 1996 Fred Fish <fnf@cygnus.com> - - * configure.in: Add fragment to create stamp-h. - - From Peter Schauer <Peter.Schauer@Regent.E-Technik.TU-Muenchen.DE> - * configure.in (AC_CHECK_HEADERS): Check for link.h. - * configure: Regenerate with autoconf. - * config.h.in: Regenerate with autoheader. - * config/i386/nm-linux.h: Include solib.h only if HAVE_LINK_H - is defined. - * solib.c: Exclude most of the code if HAVE_LINK_H is not defined. - * config/i386/linux.mh: Reinstate XM_CLIBS, it is needed for - older a.out based systems. - -Sat Mar 16 16:45:43 1996 Fred Fish <fnf@cygnus.com> - - * config.h.in: New file. - * acconfig.h: New file, for autoheader. - * configure.in (AC_CONFIG_HEADER): Add, generate config.h. - * configure: Regenerate. - * Makefile.in (defs_h): Add config.h - (distclean): Remove config.h and stamp-h during distclean. - (config.h, stamp-h): New targets to remake config.h when necessary. - * defs.h (config.h): Include before any other includes or defines. - * i386-tdep.c (gdb_string.h): Move include after include of defs.h. - * i386v4-nat.c (defs.h): Include before testing HAVE_SYS_PROCFS_H. - -Sat Mar 16 14:55:27 1996 Fred Fish <fnf@cygnus.com> - - From Peter Schauer <Peter.Schauer@Regent.E-Technik.TU-Muenchen.DE> - * Makefile.in (INSTALLED_LIBS): Make sure that @LIBS@ will not - result in an empty line, to work around a bug in native Ultrix 4.4 - and OSF/1-3.2C make. - -Sat Mar 16 13:33:17 1996 Fred Fish <fnf@cygnus.com> - - * configure.in: Add gdbserver to configdirs under linux. - * configure: Regenerate. - -Fri Mar 15 12:06:58 1996 J.T. Conklin <jtc@rtl.cygnus.com> - - * config/i386/nm-nbsd.h (FLOAT_INFO): Comment out. - * config/i386/tm-nbsd.h (NUM_REGS): Define. - -Thu Mar 14 10:31:18 1996 Jeffrey A Law (law@cygnus.com) - - * solib.c (solib_break_names): Add _r_debug_state for - vanilla SVR4 implementations. From Peter Schauer. - -Mon Mar 11 14:24:57 1996 Dawn Perchik <dawn@critters.cygnus.com> - - * mon960-rom.c: New file; support mon960 rom monitor on i960. - * monitor.c (monitor_debug): Change remotedebug to buffer strings. - * monitor.c (monitor_open): Add test for flag MO_NO_ECHO_ON_OPEN before - epecting prompt and echo during open. - * monitor.c (monitor_stop): Add test for flag MO_SEND_BREAK_ON_OPEN to - determine if break should be sent as stop command. - * monitor.h: Add flags MO_NO_ECHO_ON_OPEN and MO_SEND_BREAK_ON_OPEN. - * i960-tdep.c (mon960_frame_chain_valid): New function for getting - stack frame on mon960. - * Makefile.in: Add mon960 files. - * configure.in: Changed i960-*-coff* and i960-*-elf* to target mon960; - added i960-nindy-coff* and i960-nindy-elf* for target nindy. - * configure: Regenerated. - * config/i960/mon960.mt, config/i960/tm-mon960.h: New files; - support mon960 rom monitor on i960. - -Mon Mar 11 11:02:47 1996 Steve Chamberlain <sac@slash.cygnus.com> - - With Michael Snyder: - * i386-tdep.c (skip_trampoline_code): Fix strncmp length. - * win32-nat.c (CHECK, DEBUG*, debug_*): New. - (handle_load_dll): Don't reload symbols. - (handle_exception): Use the DEBUG_* names. - (child_wait): Add DEBUG_* code. - (_initialize_inftarg): Add new commands to set debug_ names. - -Mon Mar 11 09:19:58 1996 Jeffrey A Law (law@cygnus.com) - - * From Peter Schauer: - * breakpoint.c (insert_breakpoints): Use ALL_BREAKPOINTS_SAFE. - (bpstat_stop_status): Likewise. - (remove_solib_event_breakpoints): Likewise. - (clear_momentary_breakpoints): Likewise. - (re_enable_breakpoints_in_shlibs): Don't reenable a breakpoint - if we still can't read the memory for that breakpoint. - (mention): Add bp_shlib_event case to keep gcc quiet. - -Fri Mar 8 12:08:12 1996 Jeffrey A Law (law@cygnus.com) - - * breakpoint.h (enum enable): New enum shlib_disabled for - shared library breakpoints that have been temporarily disabled. - * breakpoint.c: Handle temporarily disabled shared library - breakpoints like disabled breakpoints in most places. - (insert_breakpoints): Use shlib_disabled to indicate - that an unsettable breakpoint is only temporarily disabled. - (re_enable_breakpoints_in_shlibs): New function. - * corelow.c (solib_add_stub): After adding shared libraries, - try to reenable any temporarily disabled breakpoints. - * infcmd.c (attach_command): Likewise. - * infrun.c (wait_for_inferior): Likewise. - -Fri Mar 8 11:41:25 1996 Ian Lance Taylor <ian@cygnus.com> - - * defs.h (extract_long_unsigned_integer): Declare. - * findvar.c (extract_long_unsigned_integer): New function. - * printcmd.c (print_scalar_formatted): Use it. - * valprint.c (val_print_type_code_int): Likewise. - -Thu Mar 7 17:40:50 1996 Stan Shebs <shebs@andros.cygnus.com> - - * infcmd.c (do_registers_info): Ignore anonymous registers. - * sh-tdep.c (set processor): New command to set specific - processor type. - (sh_reg_names, sh3_reg_names): Arrays of register names for - SH and SH3 processors. - (sh_set_processor_type): New function. - * sh3-rom.c (sh3_open): Call it. - (sh3_regname): Add names of all the bank registers. - (sh3_supply_register): Clean up formatting. - * config/sh/tm-sh.h (NUM_REGS, NUM_REALREGS): Increase to include - bank registers. - (REGISTER_NAMES): Add names of bank registers. - (FP15_REGNUM): Define. - (REGISTER_VIRTUAL_TYPE): Use it. - * monitor.c: Clean up some comments. - -Thu Mar 7 12:09:51 1996 J.T. Conklin <jtc@rtl.cygnus.com> - - * i386b-nat.c: Revert part of Mar 5 change. FreeBSD collapsed the - s* and t* symbols too. - -Thu Mar 7 15:18:51 1996 James G. Smith <jsmith@cygnus.co.uk> - - * symfile.c (generic_load): Avoid division by zero. - -Wed Mar 6 17:57:59 1996 Jeffrey A Law (law@cygnus.com) - - * breakpoint.c (bfd_lookup_symbol): Provide for all SVR4 systems, - not just those with HANDLE_SVR4_EXEC_EMULATORS. - - From Peter Schauer: - * breakpoint.c (internal_breakpoint_number): Move to file scope. - (create_solib_event_breakpoint): Use an internal breakpoint number. - -Wed Mar 6 00:32:44 1996 Wilfried Moser <moser@rtl.cygnus.com> - - * valarith.c (value_in): Change builtin_type_chill_bool to - LA_BOOL_TYPE. - -Tue Mar 5 23:48:36 1996 Wilfried Moser <moser@rtl.cygnus.com> - - * ch-exp.c (parse_primval): Handle CARD, MAX, MIN. - (match_string_literal): Handle control sequence. - (match_character_literal): Deto. - - * ch-lang.c (chill_printchar): Change formating of nonprintable - characters from C'xx' to ^(num). - (chill_printstr): Deto. - (value_chill_card, value_chill_max_min): New functions to process - Chill's CARD, MAX, MIN. - (evaluate_subexp_chill): Process UNOP_CARD, UNOP_CHMAX, UNOP_CHMIN. - - * expression.h (exp_opcode): Add UNOP_CARD, UNOP_CHMAX, UNOP_CHMIN - for Chill's CARD, MAX, MIN. - - * valarith.c (value_in): Add processing of TYPE_CODE_RANGE - and change return type from builtin_type_int to - builtin_type_chill_bool. - -Tue Mar 5 18:54:04 1996 Stan Shebs <shebs@andros.cygnus.com> - - * config/nm-nbsd.h (link_object, lo_name, etc): Move to here - from config/nm-nbsd.h. - * config/sparc/nm-nbsd.h (regs, fp_status, etc): Move to here - from config/sparc/tm-nbsd.h. - - * config/m68k/nm-hp300hpux.h (FIVE_ARG_PTRACE): Define here - instead of in config/m68k/xm-hp300hpux.h. - -Tue Mar 5 12:05:35 1996 J.T. Conklin <jtc@rtl.cygnus.com> - - * i386b-nat.c, m68knbsd-nat.c (fetch_core_registers): Provide - implementation for NetBSD systems. - -Mon Mar 4 23:44:16 1996 Per Bothner <bothner@kalessin.cygnus.com> - - * valarith.c (binop_user_defined_p): Return 0 for BINOP_CONCAT. - (value_concat): Handle varying strings (add COERCE_VARYING_ARRAY). - - * ch-lang.c (evaluate_subexp_chill case MULTI_SUBSCRIPT): Error - if "function" is pointer to non-function. - -Mon Mar 4 17:47:03 1996 Stan Shebs <shebs@andros.cygnus.com> - - * top.c (print_gdb_version): Update copyright year. - -Mon Mar 4 14:44:54 1996 Jeffrey A Law (law@cygnus.com) - - From Peter Schauer: - * infrun.c (wait_for_inferior): Remove breakpoints and - switch terminal settings before calling SOLIB_ADD. - * solib.c (enable_break, SVR4 variant): Don't map in symbols - for the dynamic linker, the namespace pollution causes real - problems. - -Sun Mar 3 17:18:57 1996 James G. Smith <jsmith@cygnus.co.uk> - - * remote-mips.c (common_breakpoint): Explicitly terminate the - returned buffer. - -Wed Feb 28 22:32:18 1996 Stan Shebs <shebs@andros.cygnus.com> - - From Wilfried Moser <wilfried.moser@aut.alcatel.at>: - * remote.c (remote_detach): Send a command 'D' to the target - when detaching, update the function's comments. - -Thu Jun 6 16:11:38 1996 Miles Bader <miles@gnu.ai.mit.edu> - - * gnu-nat.c (thread_cmd_list): New declaration. - (parse_int_arg): New function. - -Wed Jun 5 17:28:04 1996 Miles Bader <miles@gnu.ai.mit.edu> - - * gnu-nat.h (struct proc): Add DETACH_SC field. - * gnu-nat.c (make_proc): Set DETACH_SC. - (struct inf): Add DETACH_SC & DEFAULT_THREAD_DETACH_SC fields. - (make_inf): Set DETACH_SC & DEFAULT_THREAD_DETACH_SC fields. - (add_thread_commands): Add set/show for detach-suspend-count. - Add takeover-suspend-count cmd. - (inf_detach): Set suspend counts to the detach SC, not 0. - (set_thread_detach_sc_cmd, show_thread_detach_sc_cmd, - set_task_detach_sc_cmd, show_task_detach_sc_cmd, - set_thread_default_thread_detach_sc_cmd, - show_thread_default_thread_detach_sc_cmd): New functions. - (show_task_cmd): Also show detach-suspend-count values. - (thread_takeover_sc_cmd): New function. - -Fri May 31 16:49:24 1996 Miles Bader <miles@gnu.ai.mit.edu> - - * gnu-nat.c (show_thread_run_cmd): Actually print state. - -Thu May 30 10:47:56 1996 Miles Bader <miles@gnu.ai.mit.edu> - - * gnu-nat.c (inf_signal): Make unforwardable exceptions an error. - -Tue May 28 17:06:36 1996 Miles Bader <miles@gnu.ai.mit.edu> - - * gnu-nat.c (inf_validate_stopped): proc_getprocinfo takes a - pointer to the flags now, not the flags themselves. - -Mon May 27 13:31:17 1996 Miles Bader <miles@gnu.ai.mit.edu> - - * gnu-nat.c (gnu_wait): Print debugging msgs for pending execs. - (gnu_create_inferior): Check return from ptrace. - -Sun May 26 16:56:35 1996 Miles Bader <miles@gnu.ai.mit.edu> - - * gnu-nat.h (struct proc): Add DEAD field. - * gnu-nat.c (make_proc): Initialize DEAD. - (inf_set_traced, inf_validate_task_sc, inf_validate_procs: Frob it. - (gnu_wait): Only abort for 0 threads if the task isn't dead. - -Sat May 25 17:06:05 1996 Miles Bader <miles@gnu.ai.mit.edu> - - * gnu-nat.c (inf_signal): Pass SIGCODE when posting a signal. - -Wed May 22 18:44:28 1996 Miles Bader <miles@gnu.ai.mit.edu> - - * gnu-nat.c (S_proc_wait_reply): Add SIGCODE argument. - (inf_set_traced): Only give no-signal-thread error message if - turning *on* tracing. - -Wed May 15 13:03:16 1996 Miles Bader <miles@gnu.ai.mit.edu> - - * gnu-nat.c (inf_validate_procs): If INF has no threads, always - set inf->threads_up_to_date to 0. - (inf_signal): Pass in new SIGCODE argument to msg_sig_post_untraced. - (gnu_wait): Pass in new TIMEOUT arg to interrupt_operation. - (proc_update_sc): Cast thread state arg to thread_set_state. - (proc_get_state): Cast thread state arg to thread_get_state. - (inf_validate_task_sc): Cast task_basic_info arg to task_info. - * i386gnu-nat.c (gnu_fetch_registers, gnu_store_registers): Call - inf_update_procs before we lookup the thread. - * config/i386/i386gnu.mh (MH_CFLAGS): New variable. - -Tue May 7 17:52:33 1996 Miles Bader <miles@gnu.ai.mit.edu> - - * gnu-nat.c (gnu_kill_inferior): Use inf_set_task to clear the task. - -Mon May 6 19:06:49 1996 Miles Bader <miles@gnu.ai.mit.edu> - - * gnu-nat.c (inf_set_traced): Use msg_set_init_int with - INIT_TRACEMASK instead of setting the exec flags. - -Fri May 3 19:10:57 1996 Miles Bader <miles@gnu.ai.mit.edu> - - * gnu-nat.c (inf_validate_procs): Don't clear INF->task if we find - the task's died, so others have a chance at it. - (gnu_resume): When single-stepping a single thread, given an error - if there is no such thread. When single-stepping one but running - the others, just given a warning and still run all the threads. - (gnu_wait): If there seem to be no threads, look harder, and - signal an error if there really aren't any. - (gnu_attach): Reset thread numbering to 0. - - * i386gnu-nat.c (gnu_fetch_registers, gnu_store_registers): Give - thread name in warning messages. - - * gnu-nat.c (active_inf): New function. - (show_sig_thread_cmd, show_stopped_cmd): Use it. - (info_port_rights, info_send_rights_cmd, info_port_sets_cmd, - info_recv_rights_cmd, info_port_rights_cmd, info_port_rights_cmd): - New functions. - (add_task_commands): Add new port-right info commands. - -Fri Apr 26 20:42:16 1996 Miles Bader <miles@gnu.ai.mit.edu> - - * gnu-nat.c (gnu_wait): Instead of _hurd_intr_rpc_mach_msg, just - use mach_msg with MACH_RCV_INTERRUPT. - (set_noninvasive_cmd): New function. - (add_task_commands): Add command entry for `set noninvasive'. - -Mon Mar 4 14:12:02 1996 Miles Bader <miles@gnu.ai.mit.edu> - - * gnu-nat.c (gnu_read_inferior): Use hurd_safe_memmove, not safe_bcopy. - (safe_bcopy): Function removed. - -Mon Dec 4 14:18:26 1995 Miles Bader <miles@gnu.ai.mit.edu> - - * gnu-nat.c (proc_update_sc): Assert only threads can have state. - (make_proc): Initialize state_valid & state_changed fields. - -Tue Nov 28 17:51:21 1995 Miles Bader <miles@gnu.ai.mit.edu> - - * reply_mig_hack.awk: New file. - -Tue Nov 14 14:31:03 1995 Miles Bader <miles@gnu.ai.mit.edu> - - * breakpoint.c (breakpoint_1): Print breakpoint thread field. - - * lynx-nat.c (child_wait): Return TARGET_WAITKIND_SPURIOUS for new - threads. - -Mon Nov 13 18:30:53 1995 Miles Bader <miles@gnu.ai.mit.edu> - - * target.c (debug_to_check_threads): New function. - - * inflow.c (terminal_init_inferior_with_pgrp): New function. - (terminal_init_inferior): Call terminal_init_inferior_with_pgrp. - * inferior.h (terminal_init_inferior_with_pgrp): New declaration, - but only if PROCESS_GROUP_TYPE is defined. - -Mon Nov 6 16:42:09 1995 Miles Bader <miles@gnu.ai.mit.edu> - - * target.c (debug_to_thread_alive): Pass through the return value. - -Thu Nov 2 18:05:00 1995 Miles Bader <miles@gnu.ai.mit.edu> - - * target.c (signals, target_signal_from_host, target_signal_to_host): - Add mach exceptions. - * target.h (enum target_signal): Add mach exceptions. - -Mon Oct 30 16:41:04 1995 Miles Bader <miles@gnu.ai.mit.edu> - - * gnu-nat.c: New file: gnu native backend. - * i386gnu-nat.c: New file: i386-specific part of gnu native backend. - * gnu-nat.h: New file. - * config/nm-gnu.h: New file. - * config/tm-i386gnu.h: New file. - * config/xm-i386gnu.h: New file. - * config/i386/i386gnu.mh: New file. - * config/i386/i386gnu.mt: New file. - -Wed Feb 28 15:50:12 1996 Fred Fish <fnf@cygnus.com> - - * Makefile.in (VERSION): Bump version to 4.15.2 to establish - baseline for gdb 4.16 rerelease testing. - -Wed Feb 28 13:32:05 1996 Jeffrey A Law (law@cygnus.com) - - * somsolib.c (som_solib_create_inferior_hook): Before returning - call clear_symtab_users. - -Tue Feb 27 00:04:46 1996 Stu Grossman (grossman@critters.cygnus.com) - - * remote-e7000.c (e7000_open): Delete all breakpoints when - connecting to e7000. Change connect message to allow use of - monitor.exp in test suite. - * (e7000_load): Print transfer rate of download. - * symfile.c (generic_load): Print transfer rate of download. - -Sun Feb 25 13:58:33 1996 Stan Shebs <shebs@andros.cygnus.com> - - * configure.in (mips*-*-vxworks*): New config. - * configure: Regenerated. - - * config/mips/vxmips.mt, config/mips/tm-vxmips.h: New files. - * remote-vxmips.c (vx_convert_to_virtual, vx_convert_from_virtual): - Remove, never used. - -Sat Feb 24 12:30:28 1996 Peter Schauer (pes@regent.e-technik.tu-muenchen.de) - - * partial-stab.h (case N_FUN): Function symbols generated - by SPARCworks cc have a meaningless zero value, do not update - pst->textlow if the function symbol value is zero. - - * stabsread.c (define_symbol): Initialize SYMBOL_TYPE field - for function prototype declaration symbols. - -Fri Feb 23 22:33:04 1996 Stu Grossman (grossman@critters.cygnus.com) - - * remote-e7000.c (e7000_load): New routine to download via the - network. - * (e7000_wait): Don't backup PC when we hit a breakpoint. - Apparantly new sh2 pods get this right... - * (e7000_ops): Add call to e7000_load. - -Thu Feb 22 00:52:42 1996 J.T. Conklin <jtc@rtl.cygnus.com> - - * config/m68k/{nbsd.mh,nbsd.mt,nm-nbsd.h,tm-nbsd.h,xm-nbsd.h}, - m68knbsd-nat.c: New files, support for NetBSD/m68k. - - * configure.in (m68k-*-netbsd*): New config. - * configure: Regenerated. - -Wed Feb 21 19:00:21 1996 Fred Fish <fnf@cygnus.com> - - * standalone.c (open, _initialize_standalone): Fix obvious typos - reported by Martin Pool <martin@citr.uq.oz.au>. - -Wed Feb 21 14:24:04 1996 Jeffrey A Law (law@cygnus.com) - - * solib.c (solib_create_inferior_hook): Fix thinko. - -Tue Feb 20 23:59:19 1996 Jeffrey A Law (law@cygnus.com) - - * solib.c (solib_break_names): Define for Solaris and Linux. - (enable_break): For SVR4 systems, first try to use the debugger - interfaces in the dynamic linker to track shared library events - as they happen, then fall back to BKPT_AT_SYMBOL code. Convert - BKPT_AT_SYMBOL code to use shared library event breakpoints. - (solib_create_inferior_hook): Simplify BKPT_AT_SYMBOL code, - it no longer needs to restart/wait on the inferior. - * symfile.c (find_lowest_section): No longer static. - * symfile.h (find_lowest_section): Corresponding changes. - -Tue Feb 20 18:54:08 1996 Fred Fish <fnf@cygnus.com> - - * valops.c (COERCE_FLOAT_TO_DOUBLE): Define default value. - (value_arg_coerce): Use COERCE_FLOAT_TO_DOUBLE. - * config/alpha/tm-alpha.h (COERCE_FLOAT_TO_DOUBLE): Define to 1. - * config/mips/tm-mips.h: Ditto. - * config/pa/tm-hppa.h: Ditto. - * config/rs6000/tm-rs6000.h: Ditto. - * config/sparc/tm-sparc.h: Ditto. - -Tue Feb 20 17:32:05 1996 J.T. Conklin <jtc@rtl.cygnus.com> - - * config/{i386,ns32k}/nbsd.mh (NATDEPFILES): Remove core-aout.o. - - * config/nm-nbsd.h (FETCH_INFERIOR_REGISTERS): Defined. - * config/xm-nbsd.h (CC_HAS_LONG_LONG, PRINTF_HAS_LONG_LONG): - #ifdef'd out definitions --- Causes serious gdb failures on - the i386. Need to investigate further before enabling. - - * i386b-nat.c (fetch_inferior_registers, store_inferior_registers, - fetch_core_registers): New functions. These functions are defined - if FETCH_INFERIOR_REGISTERS is set. Registers are fetched/stored - with ptrace PT_GETREGS/PT_SETREGS. - -Tue Feb 20 16:55:06 1996 Stu Grossman (grossman@critters.cygnus.com) - - * findvar.c (extract_floating store_floating): Replace `long - double' with `DOUBLEST'. - -Mon Feb 19 15:25:51 1996 J.T. Conklin <jtc@rtl.cygnus.com> - - * config/xm-nbsd.h (CC_HAS_LONG_LONG, PRINTF_HAS_LONG_LONG): - Define. - -Mon Feb 19 10:32:05 1996 Jeffrey A Law (law@cygnus.com) - - * symtab.h (looup_minimal_symbol_solib_trampoline): Declare. - - * breakpoint.h (remove_solib_event_breakpoints): Declare. - * breakpoint.c (remove_solib_event_breakpoints): New function. - * somsolib.c (solib_create_inferior_hook): Remove all solib event - breakpoints before inserting any new ones. Use a solib event - breakpoint for the breakpoint at "_start". - Remove extraneous "\n" from calls to warning. - - * breakpoint.c (breakpoint_1): Add missing "sigtramp" to bptypes - name array. - -Mon Feb 19 01:09:32 1996 Doug Evans <dje@cygnus.com> - - * dwarfread.c (add_partial_symbol): Use ADD_PSYMBOL_ADDR_TO_LIST - for CORE_ADDR values. - (new_symbol): Use SYMBOL_VALUE_ADDRESS for CORE_ADDR values. - * symfile.h (add_psymbol_{,addr}to_list): Add prototypes. - -Sun Feb 18 14:37:13 1996 Peter Schauer (pes@regent.e-technik.tu-muenchen.de) - - * mipsread.c (mipscoff_symfile_read): Unconditionally add - alpha coff dynamic symbols for all symbol files. Makes skipping - over the trampoline code work when stepping from a function in a - shared library into a function in a different shared library. - -Sun Feb 18 09:27:10 1996 Stu Grossman (grossman@cygnus.com) - - * config/sparc/tm-sparc.h: Define PS_FLAG_CARRY. Define - RETURN_VALUE_ON_STACK to return long doubles on the stack. - -Sat Feb 17 16:33:11 1996 Fred Fish <fnf@cygnus.com> - - * Makefile.in (ch-exp.o): Add dependencies. - (various): Add gdb_string.h to dependencies that need it. - -Sat Feb 17 08:57:50 1996 Fred Fish <fnf@cygnus.com> - - * symmisc.c (print_symbol_bcache_statistics): Update description for - printing byte cache statistics. - -Thu Feb 16 16:02:03 1996 Stu Grossman (grossman@cygnus.com) - - * Add native support for long double data type. - * c-exp.y (%union): Change dval to typed_val_float. Use DOUBLEST - to store actual data. Change types of INT and FLOAT tokens to - typed_val_int and typed_val_float respectively. Create new token - DOUBLE_KEYWORD to specify the string `double'. Make production - for FLOAT use type determined by parse_number. Add production for - "long double" data type. - * (parse_number): Use sscanf to parse numbers as float, double or - long double depending upon the type of typed_val_float.dval. Also - allow user to specify `f' or `l' suffix to explicitly specify - float or long double constants. Change typed_val to - typed_val_int. - * (yylex): Change typed_val to typed_val_int. Also, scan for - "double" keyword. - * coffread.c (decode_base_type): Add support for T_LNGDBL basic - type. - * configure, configure.in: Add check for long double support in - the host compiler. - * defs.h: Define DOUBLEST appropriatly depending on whether - HAVE_LONG_DOUBLE (from autoconf) is defined. Also, fix prototypes - for functions that handle this type. - * expression.h (union exp_element): doubleconst is now type - DOUBLEST. - * m2-exp.y f-exp.y (%union): dval becomes type DOUBLEST. - * findvar.c (extract_floating): Make return value be DOUBLEST. - Also, add support for numbers with size of long double. - * (store_floating): Arg `val' is now type DOUBLEST. Handle all - floating types. - * parser-defs.h parse.c (write_exp_elt_dblcst): Arg expelt is now - DOUBLEST. - * valarith.c (value_binop): Change temp variables v1, v2 and v to - type DOUBLEST. Coerce type of result to long double if either op - was of that type. - * valops.c (value_arg_coerce): If argument type is bigger than - double, coerce to long double. - * (call_function_by_hand): If REG_STRUCT_HAS_ADDR is defined, and - arg type is float and > 8 bytes, then use pointer-to-object - calling conventions. - * valprint.c (print_floating): Arg doub is now type DOUBLEST. - Use appropriate format and precision to print out floating point - values. - * value.h: Fixup prototypes for value_as_double, - value_from_double, and unpack_double to use DOUBLEST. - * values.c (record_latest_value): Remove check for invalid - floats. Allow history to store them so that people may examine - them in hex if they want. - * (value_as_double unpack_double): Change return value to DOUBLEST. - * (value_from_double): Arg `num' is now DOUBLEST. - * (using_struct_return): Use RETURN_VALUE_ON_STACK macro (target - specific) to expect certain types to always be returned on the stack. - -Fri Feb 16 14:00:54 1996 Fred Fish <fnf@cygnus.com> - - * bcache.c, bcache.h: New files to implement a byte cache. - * Makefile.in (SFILES): Add bcache.c. - (symtab_h): Add bcache.h. - (HFILES_NO_SRCDIR): add bcache.h - (COMMON_OBJS): Add bcache.o - (bcache.o): New target. - * dbxread.c (start_psymtab): Make global_syms & static_syms - type "partial_symbol **". - * hpread.c (hpread_start_symtab): Ditto. - * os9kread.c (os9k_start_psymtab): Ditto. - * stabsread.h (start_psymtab): Ditto. - * {symfile.c, symfile.h} (start_psymtab_common): Ditto. - * maint.c (maintenance_print_statistics): Call - print_symbol_bcache_statistics. - * objfiles.c (allocate_objfile): Initialize psymbol bcache malloc - and free pointers. - * solib.c (allocate_rt_common_objfile): Ditto. - * symfile.c (reread_symbols): Ditto. - (free_objfile): Free psymbol bcache when objfile is freed. - (objfile_relocate): Use new indirect psymbol pointers. - * objfiles.h (struct objfile): Add psymbol cache. - * symfile.c (compare_psymbols): Now passed pointers to pointers to - psymbols. - (reread_symbols): Free psymbol bcache when freeing other objfile - resources. - (add_psymbol_to_list, add_psymbol_addr_to_list): Initialize new - psymbol using the psymbol bcache. - (init_psymbol_list): Psymbol lists now contain pointers rather than - the actual psymbols. - * symfile.h (psymbol_allocation_list): Psymbol lists now dynamically - grown arrays of pointers. - (ADD_PSYMBOL_VT_TO_LIST): Initialize new symbol using the psymbol - bcache. - * symmisc.c (print_partial_symbols): Now takes pointer to pointer - to partial symbol. - (print_symbol_bcache_statistics): New function to print per objfile - bcache statistics. - (print_partial_symbol, print_partial_symbols, - maintenance_check_symtabs, extend_psymbol_list): - Account for change to pointer to pointer to partial symbol. - * symtab.c (find_pc_psymbol, lookup_partial_symbol, decode_line_2, - make_symbol_completion_list): - Account for change to pointer to pointer to partial symbol. - * symtab.h (bcache.h): Include. - * xcoffread.c (xcoff_start_psymtab): Make global_syms & static_syms - type "partial_symbol **". - -Fri Feb 16 10:02:34 1996 Fred Fish <fnf@cygnus.com> - - * dwarfread.c (free_utypes): New function. - (read_file_scope): Call free_utypes as cleanup, rather than just - freeing the utypes pointer. - -Thu Feb 15 21:40:52 1996 Peter Schauer (pes@regent.e-technik.tu-muenchen.de) - - * demangle.c (is_cplus_marker): New function, checks if a - character is one of the commonly used C++ marker characters. - * defs.h (is_cplus_marker): Add prototype. - * c-typeprint.c (c_type_print_base), ch-lang.c (chill_demangle), - cp-valprint.c (cp_print_class_method), mdebugread.c (parse_symbol), - stabsread.c (define_symbol, read_member_functions, read_struct_fields), - symtab.h (OPNAME_PREFIX_P, VTBL_PREFIX_P, DESTRUCTOR_PREFIX_P), - values.c (vb_match): Use is_cplus_marker instead of comparison - with CPLUS_MARKER. - -Thu Feb 15 18:08:13 1996 Fred Fish <fnf@cygnus.com> - - * symfile.h (INLINE_ADD_PSYMBOL): Default this to 0 and possibly - delete entirely someday. - -Thu Feb 15 15:25:34 1996 Stan Shebs <shebs@andros.cygnus.com> - - * mpw-make.sed: Edit out makefile rebuild rule. - (host_alias, target_alias): Comment out instead of deleting. - (@LIBS@): Edit out references. - -Tue Feb 13 22:56:46 1996 Fred Fish <fnf@cygnus.com> - - * symfile.c (add_psymbol_to_list, add_psymbol_addr_to_list): - Use n_psyms in OBJSTAT, not psyms. - -Mon Feb 12 15:59:31 1996 Doug Evans <dje@charmed.cygnus.com> - - * configure.in (sparclet-*-aout*): New config. - * configure: Regenerated. - -Mon Feb 12 14:17:52 1996 Fred Fish <fnf@cygnus.com> - - * somsolib.c (som_solib_add): Use xmalloc rather than bare - unchecked call to malloc. - * remote-mips.c (pmon_load_fast): ditto. - * remote-mm.c (mm_open): ditto. - * hpread.c (hpread_lookup_type): ditto. - * remote-adapt.c (adapt_open): ditto. - -Mon Feb 12 13:11:32 1996 Fred Fish <fnf@cygnus.com> - - * f-lang.c (allocate_saved_bf_node, allocate_saved_function_node, - allocate_saved_f77_common_node, allocate_common_entry_node, - add_common_block): Use xmalloc rather than malloc, some of which - were unchecked. - * gnu-regex.c: At same point as other gdb specific changes - #undef malloc and then #define it to xmalloc. - * ch-exp.c (growbuf_by_size): Use xmalloc/xrealloc rather than - bare unchecked calls to malloc/realloc. - * stabsread.c (dbx_lookup_type): Use xmalloc rather than bare - unchecked call to malloc. - -Wed Feb 7 11:31:26 1996 Stu Grossman (grossman@cygnus.com) - - * symtab.c (gdb_mangle_name): Change opname var to be const to - match return val of cplus_mangle_name. - * i960-tdep.c: Change arg types of next_insn to match callers. - -Wed Feb 7 07:34:24 1996 Fred Fish <fnf@cygnus.com> - - * config/i386/linux.mh (XM_CLIBS, GDBSERVER_LIBS): Remove. These - apparently aren't needed in any reasonably recent version of - linux. - -Tue Feb 6 21:37:03 1996 Per Bothner <bothner@kalessin.cygnus.com> - - * stabsread.c (read_range_type): If !self-subrange and language - is Chill, assume a true range. If a true_range is a sub_subrange, - use builtin_type_int for index_type. - -Tue Feb 6 18:38:51 1996 J.T. Conklin <jtc@slave.cygnus.com> - - * nindy-share/nindy.c (say): Use stdarg.h macros when compiling - with an ANSI compiler. - -Mon Feb 5 18:24:28 1996 Steve Chamberlain <sac@slash.cygnus.com> - - From Michael_Snyder@NeXT.COM (Michael Snyder): - * valops.c (value_arg_coerce): Coerce float to double, unless the - function prototype specifies float. - -Mon Feb 5 09:51:55 1996 Tom Tromey <tromey@creche.cygnus.com> - - * language.c (set_language_command): Use languages table when - printing available languages. - -Sat Feb 3 12:22:05 1996 Fred Fish <fnf@cygnus.com> - - Fix problems reported by Hans Verkuil (hans@wyst.hobby.nl): - * command.c (add_cmd): Add missing initialization for enums member. - Reorder members to match structure declaration to make it easier to - tell when one is missing. - * exec.c (exec_file_command): Fix problem where filename in malloc'd - memory is referenced after being freed. - -Sat Feb 3 03:26:21 1996 Peter Schauer (pes@regent.e-technik.tu-muenchen.de) - - * dwarfread.c (read_func_scope): Avoid GDB core dumps if - AT_name tag is missing. - - * procfs.c (procfs_stopped_by_watchpoint): Fix logic when - FLTWATCH and FLTKWATCH are defined. - - * remote.c (remote_read_bytes): Advance memaddr for transfers, - return number of bytes transferred for partial reads. - - * top.c (init_signals): Reset SIGTRAP to SIG_DFL. - -Fri Feb 2 13:40:50 1996 Steve Chamberlain <sac@slash.cygnus.com> - - * win32-nat.c (mappings): Add ppc registers. - (child_resume): Turn off step for ppc. - -Thu Feb 1 10:29:31 1996 Steve Chamberlain <sac@slash.cygnus.com> - - * config/powerpc/(cygwin32.mh, cygwin32.mt, tm-cygwin32.h, - xm-cygwin32.h): New. - * config/i386/(*win32*): Becomes *cygwin32*. - * configure.in (i[3456]86-*-win32*): Becomes i[3456]86-*-cygwin32. - (powerpcle-*-cygwin32): New. - * configure: Regenerate. - * win32-nat.c (child_create_inferior): Call CreateProcess - with the right program arg. - -Thu Feb 1 11:01:10 1996 Jeffrey A Law (law@cygnus.com) - - * config/pa/tm-hppa.h (SOFT_FLOAT): Provide a default definition. - -Wed Jan 31 19:01:28 1996 Fred Fish <fnf@cygnus.com> - - * serial.c: Change fputc/fputs/fprintf to _unfiltered forms. - -Wed Jan 31 18:36:27 1996 Stan Shebs <shebs@andros.cygnus.com> - - * config/sparc/xm-sun4os4.h (HAVE_TERMIOS): Remove. - - * config/sparc/xm-sparc.h (HAVE_WAIT_STRUCT): Remove, never used. - - * config/i386/nm-i386mach.h (CHILD_PREPARE_TO_STORE): Move to - here from config/i386/xm-i386mach.h, fix name. - * config/i386/nm-sun386.h: Ditto, from config/i386/xm-sun386.h. - * config/i386/nm-ptx4.h (CHILD_PREPARE_TO_STORE): Move to - here from config/i386/xm-ptx4.h. - * config/i386/nm-ptx4.h: Ditto, from config/i386/xm-ptx.h. - * config/i386/nm-symmetry.h: Ditto, from config/i386/xm-symmetry.h. - * config/m68k/nm-sun3.h: Ditto, from config/m68k/xm-sun3.h. - * config/sparc/nm-nbsd.h: Ditto, from config/sparc/xm-nbsd.h. - * config/sparc/nm-sun4os4: Ditto, from config/sparc/xm-sparc.h. - - * config/sparc/nm-sun4sol2.h: New file, renamed from nm-sysv4.h. - (PRSVADDR_BROKEN): Move here from xm-sun4sol2.h. - * config/sparc/sun4sol2.mh (NAT_FILE): Update. - -Wed Jan 31 17:20:26 1996 Jeffrey A Law (law@cygnus.com) - - * config/pa/tm-hppa.h (EXTRACT_RETURN_VALUE): Handle software - floating point correctly. - (STORE_RETURN_VALUE): Likewise. - * config/pa/tm-pro.h (SOFT_FLOAT): define. - -Wed Jan 31 13:34:52 1996 Fred Fish <fnf@cygnus.com> - - * config/i386/xm-linux.h (MMAP_BASE_ADDRESS, MMAP_INCREMENT): - Define to what should be reasonable values. However, apparently - a bug in linux mmap prevents mapped symbol tables from working. - -Tue Jan 30 18:26:19 1996 Fred Fish <fnf@cygnus.com> - - * defs.h (errno.h>: Move #include closer to head of file to solve - obscure problem with systems that declare perror with const arg, in - both errno.h and stdio.h, and const is defined away by intervening - local include. - -Tue Jan 30 15:41:10 1996 Fred Fish <fnf@cygnus.com> - - From Jon Reeves <reeves@zk3.dec.com>: - * i386-stub.c (getpacket): Change fprintf stream from "gdb" to stderr. - (mem_fault_routine): Fix misplaced volatile type qualifier in decl. - -Mon Jan 29 19:05:58 1996 Fred Fish <fnf@cygnus.com> - - * Makefile.in (diststuff): Make all-doc; diststuff target does not - exist in doc/Makefile.in. - -Mon Jan 29 18:44:57 1996 Stan Shebs <shebs@andros.cygnus.com> - - * config/m88k/xm-cxux.h (BP_HIT_COUNT): Remove, never used. - -Mon Jan 29 00:10:35 1996 Wilfried Moser <moser@rtl.cygnus.com> - - * ch-valprint.c (calculate_array_length): New function to - determine the length of an array type. - (chill_val_print (case TYPE_CODE_ARRAY)): If the length of an - array type is zero, call calculate_array_length. - - * gdbtypes.c (get_discrete_bounds (case TYPE_CODE_ENUM)): The - values may not be sorted. Scan all entries and set the real lower - and upper bound. - -Sun Jan 28 15:50:42 1996 Fred Fish <fnf@cygnus.com> - - * config/xm-linux.h: Move include of solib.h and #define of - SVR4_SHARED_LIBS from here ... - * config/nm-linux.h: ...to here. - -Sat Jan 27 10:34:05 1996 Fred Fish <fnf@cygnus.com> - - * configure.in (AC_CHECK_HEADERS): Check for sys/procfs.h. - Also check for gregset_t and fpregset_t types. - * configure: Regenerate. - * core-regset.c (sys/procfs.h): Only include if HAVE_SYS_PROCFS_H - is defined. - (fetch_core_registers): Turn into stub unless both HAVE_GREGSET_T - and HAVE_FPREGSET_T are defined. These changes allow systems - like linux that are migrating to /proc support to use a single - configuration for both new and old versions. - - * config/i386/linux.mt: Note that this is now for both a.out and - ELF systems. - * config/i386/linux.mh (NATDEPFILES): Add solib.o, core-regset.o, - i386v4-nat.o - * config/i386/tm-linux.h (tm-sysv4.h): Include. - * config/i386/xm-linux.h (solib.h): Include - (SVR4_SHARED_LIBS): Define. - * i386v4-nat.c: Only compile if HAVE_SYS_PROCFS_H is defined. - (supply_gregset, fill_gregset): Compile if HAVE_GREGSET_T defined. - (supply_fpregset, fill_fpregset): Compile if HAVE_FPREGSET_T - defined. - -Fri Jan 26 13:48:14 1996 Stan Shebs <shebs@andros.cygnus.com> - - * config/sparc/xm-sparc.h (NEW_SUN_CORE): Remove, never used. - * config/i386/xm-sun386.h: Ditto. - * config/m68k/xm-sun2.h, config/m68k/xm-sun3.h: Ditto. - -Thu Jan 25 16:05:53 1996 Tom Tromey <tromey@creche.cygnus.com> - - * Makefile.in (INSTALLED_LIBS, CLIBS): Include @LIBS@. - -Thu Jan 25 09:22:15 1996 Steve Chamberlain <sac@slash.cygnus.com> - - From Greg McGary <gkm@gnu.ai.mit.edu>: - * dcache.c (dcache_peek, dcache_poke): Advance addr for - multi-byte I/O. - -Thu Jan 25 13:08:51 1996 Doug Evans (dje@cygnus.com) - - * infrun.c (normal_stop): Fix test for shared library event. - -Thu Jan 25 03:26:38 1996 Doug Evans <dje@charmed.cygnus.com> - - * configure.in (sparc64-*-*): Add default host configuration. - (sparc64-*-solaris2*): Add target configuration. - (sparc64-*-solaris2* host): Link statically if GCC used. - * configure: Regenerated. - * sparc/sp64sol2.mt: New file. - -Wed Jan 24 22:31:37 1996 Doug Evans <dje@charmed.cygnus.com> - - * Makefile.in (RUNTEST): srcdir renamed to rootsrc. - -Wed Jan 24 15:42:24 1996 Tom Tromey <tromey@creche.cygnus.com> - - * Makefile.in (lint): Close backquotes. - -Wed Jan 24 13:19:10 1996 Fred Fish <fnf@cygnus.com> - - * NEWS: Make note of new record and replay feature for - remote debug sessions. - * serial.c (gdbcmd.h): Include. - (serial_logfile, serial_logfp, serial_reading, serial_writing): - Define here, for remote debug session logging. - (serial_log_command, serial_logchar, serial_write, serial_readchar): - New functions for remote debug session logging. - (serial_open): Open remote debug session log file when needed. - (serial_close): Close remote debug session log file when needed. - (_initialize_serial): Add set/show commands for name of remote - debug session log file. - * serial.h (serial_readchar): Declare - (SERIAL_READCHAR): Call serial_readchar(). - (SERIAL_WRITE): Call serial_write(). - (serial_close): Declare as extern. - (serial_logfile, serial_logfp): Declare. - * top.c (execute_command): Declare serial_logfp. Log user command - in remote debug session log if log file is open. - * remote-array.c (array_wait): #ifdef out echo to gdb_stdout. - (array_read_inferior_memory): Rewrite to fix memory overwrite bug. - * remote-array.c (SREC_SIZE): Remove, duplicates define in - monitor.h. - * remote-array.c (hexchars, hex2mem): Remove, unused. - * gdbserver/low-linux.c (store_inferior_registers): Remove - unnecessary extern declaration of registers[]. - * gdbserver/Makefile.in (all): Add gdbreplay. - * gdbserver/gdbreplay.c: New file. - * gdbserver/README: Give example of recording a remote - debug session with gdb and then replaying it with gdbreplay. - -Tue Jan 23 18:02:35 1996 Per Bothner <bothner@kalessin.cygnus.com> - - * stabsread.c (rs6000_builtin_type): Make bool type unsigned. - (read_one_struct_field): Support boolean bitfields. - * c-valprint.c (c_val_print): Print booleans properly. - -Tue Jan 23 18:54:09 1996 Stan Shebs <shebs@andros.cygnus.com> - - * remote-vxsparc.c (vx_convert_to_virtual, vx_convert_from_virtual): - Remove, never used. - * config/sparc/vxsparc.mt (TDEPFILES): Add remote-vxsparc.o. - -Tue Jan 23 14:36:05 1996 Per Bothner <bothner@kalessin.cygnus.com> - - * ch-exp.c (parse_tuple): Error if invalid mode. - - * value.h (COERCE_ARRAY): Don't coerce enums. - (COERCE_ENUM): Don't COERCE_REF. - (COERCE_NUMBER): New macro (same as COERCE_ARRAY then COERCE_ENUM). - * valops.c (value_assign): Only do COERCE_ARRAY if internalvar (let - value_cast handle it otherwise); do *not* COERCE_ENUM either way. - * valarith.c: Use COERCE_NUMBER instead od COEREC_ARRAY. - Add COERCE_REF before COERCE_ENUM. - * values.c (value_as_long): Simplify. - - * valops.c (value_array): Create internalvar if !c_style_arrays. - - * language.c (lang_bool_type): Add Fortran support. - * eval.c (OP_BOOL): Use LA_BOOL_TYPE. - -Tue Jan 23 13:08:26 1996 Jeffrey A Law (law@cygnus.com) - - * symfile.c (auto_solib_add): Renamed from auto_solib_add_at_startup. - All references changed. - * breakpoint.c (bpstat_what): Add shlib_event to the class types. - Update state table. Reformat so that it's still readable. - When we hit the shlib_event breakpoint, set the calss of shlib_event. - (breakpoint_1): Add "shlib events" as a breakpoint type. - Print the shlib_event breakpoint like other breakpoints. - (create_solib_event_breakpoint): New function. - (breakpoint_re_set_one): Handle solib_event breakpoints. - * breakpoint.h (enum bytype): Add bp_shlib_event breakpoint type. - (enum bpstat_what_main_action): Add BPSTAT_WHAT_CHECK_SHLIBS - action. - (create_solib_event_breakpoint): Declare. - * infrun.c (wait_for_inferior): Handle CHECK_SHLIBS bpstat. - (normal_stop): Inform the user when the inferior stoped due - to a shared library event. - (_initialize_infrun): Add new set/show variable "stop-on-solib-events" - to control whether or not gdb continues the inferior or stops it when - a shared library event occurs. - * minsyms.c (lookup_minimal_symbol_solib_trampoline): New function. - * somsolib.c (TODO list): Update. - (som_solib_create_inferior_hook): Arrange for gdb to be notified - when significant shared library events occur. - * hppa-tdep.c (find_unwind_entry): No longer static. - -Tue Jan 23 09:00:48 1996 Doug Evans <dje@charmed.cygnus.com> - - * printcmd.c (print_insn): Pass fprintf_unfiltered to - INIT_DISASSEMBLE_INFO. - -Mon Jan 22 16:59:40 1996 Stan Shebs <shebs@andros.cygnus.com> - - * remote.c (remotebreak): New GDB variable. - (remote_break): New global. - (remote_interrupt): Send a break instead of ^C if remote_break. - * NEWS: Describe the new variable. - -Mon Jan 22 16:24:11 1996 Doug Evans <dje@charmed.cygnus.com> - - * sparc-tdep.c (_initialize_sparc_tdep): Always use print_insn_sparc. - -Fri Jan 19 07:19:38 1996 Fred Fish <fnf@cygnus.com> - - * hp300ux-nat.c (getpagesize): Remove unused function - fetch_core_registers. - (hp300ux_core_fns): Remove, is unused. - (_initialize_core_hp300ux): Remove, is unused. - (gdbcore.h): Remove #include, no longer needed. - -Fri Jan 19 00:59:53 1996 Jeffrey A Law (law@cygnus.com) - - * rs6000-nat.c (exec_one_dummy_insn): Rework to avoid - ptrace bug in aix4.1.3 on the rs6000. - -Wed Jan 17 13:22:27 1996 Stan Shebs <shebs@andros.cygnus.com> - - * remote-hms.c (hms_ops): Add value for to_thread_alive. - * remote-nindy.c (nindy_ops): Ditto. - * remote-udi.c (udi_ops): Ditto. - -Tue Jan 16 18:00:35 1996 James G. Smith <jsmith@cygnus.co.uk> - - * remote-mips.c (pmon_opn, pmon_wait, pmon_makeb64, pmon_zeroset, - pmon_checkset, pmon_make_fastrec, pmon_check_ack, - pmon_load_fast): New functions. Support for the PMON monitor world. - (common_open): New function to merge support for different monitors. - (mips_open): Use common_open(). - (mips_send_command): New function. - (mips_send_packet): Scan out-of-sequence packets. - (mips_enter_debug, mips_exit_debug): New functions. - (pmon_ops): New target definition structure. - -Tue Jan 16 11:22:58 1996 Stu Grossman (grossman@cygnus.com) - - * Makefile.in (CLIBS): Add LIBS to allow libraries to be - specified on the make command line (via make LIBS=xxx). - - -Fri Jan 12 21:41:58 1996 Jeffrey A Law (law@cygnus.com) - - * symtab.c (find_pc_symtab): Don't lose if OBJF_REORDERED - is set but there are no psymtabs. - -Fri Jan 12 15:56:12 1996 Steve Chamberlain <sac@slash.cygnus.com> - - * dsrec.c (load_srec): Remove unused variable. - * monitor.c (monitor_expect): Don't expect a ^C to echo. - * serial.c (serial_open): Add parallel interface. - * sh3-rom.c (parallel, parallel_in_use): New. - (sh3_load): If parallel_in_use, download though the - parallel port. - (sh3_open): Open parallel port if specified. - (sh3_close): New function. - (_inititalize_sh3): Add sh3_close hook and documentation. - * monitor.c (monitor_close): Export. - * monitor.h (monitor_close): Add prototype. - -Fri Jan 12 13:11:42 1996 Stan Shebs <shebs@andros.cygnus.com> - - From Wilfried Moser <wilfried.moser@aut.alcatel.at>: - * remote.c (remotetimeout): New GDB variable, use to set the - remote timeout for reading. - -Fri Jan 12 07:14:27 1996 Fred Fish <fnf@cygnus.com> - - * lynx-nat.c, irix4-nat.c, sparc-nat.c: Include gdbcore.h - to get "struct core_fns" defined. - * Makefile.in (lynx-nat.o, irix4-nat.o, sparc-nat.o): - Are dependent upon gdbcore_h. - -Thu Jan 11 23:13:24 1996 Per Bothner <bothner@cygnus.com> - - * symfile.c (decrement_reading_symtab): New function. - * symfile.c, symtab.h (currently_reading_symtab): New variable. - * symfile.c (psymtab_to_symtab): Adjust currently_reading_symtab. - * gdbtypes.c (check_typedef): Don't call lookup_symbol if - currently_reading_symtab (since that could infinitely recurse). - -Thu Jan 11 17:21:25 1996 Per Bothner <bothner@kalessin.cygnus.com> - - * stabsread.c (read_struct_type): Trivial simplification. - - * stabsread.c (define-symbol): Use invisible references - for TYPE_CODE_SET and TYPE_CODE_BITSTRING too. - * valops.c (call_function_by_hand): Likewise. - * eval.c (evaluate_subexp_standard): When known, use the formal - parameter type as the expected type when evaluating arg expressions. - * ch-lang.c (evaluate_subexp_chill): Likewise (for MULTI_SUBSCRIPT). - -Thu Jan 11 10:08:14 1996 Tom Tromey <tromey@creche.cygnus.com> - - * main.c (main): Disable window interface if --help or --version - specified. - -Wed Jan 10 16:08:49 1996 Brendan Kehoe <brendan@lisa.cygnus.com> - - * configure.in, configure: Recognize rs6000-*-aix4*. - * config/powerpc/xm-aix.h: Reduce to include "xm-aix4.h". - * config/rs6000/aix4.mh (XM_FILE): Point to xm-aix4.h. - * config/rs6000/xm-aix4.h: New file. - * config/xm-aix4.h: New file. - -Wed Jan 10 11:25:37 1996 Fred Fish <fnf@cygnus.com> - - From Wilfried Moser <wilfried.moser@aut.alcatel.at>: - * gdbserver/low-linux.c: New file. - * remote.c (remote_read_bytes): Fix aborts on larger packets. - - * config/i386/linux.mh (GDBSERVER_DEPFILES, GDBSERVER_LIBS): - Define. - * stabsread.c (define_symbol): If register value is too large, - tell what it is and what max is. - -Tue Jan 9 09:33:53 1996 Jeffrey A Law (law@cygnus.com) - - * hpread.c (hpread_build_psymtabs): Finish Jan 4th - enum namespace -> enum_namespace change. - -Tue Jan 9 04:44:47 1996 Wilfried Moser <moser@rtl.cygnus.com> - - * ch-exp.c (parse_primval): In case ARRAY, add missing - FORWARD_TOKEN (). - -Mon Jan 8 13:29:34 1996 Stan Shebs <shebs@andros.cygnus.com> - - * remote-mips.c (mips_receive_header): Recognize \012 instead - of \n, but write \n when program sends a \012. - * ser-mac.c (mac_input_buffer): Increase size of buffer. - -Mon Jan 8 12:00:40 1996 Jeffrey A Law (law@cygnus.com) - - * infptrace.c (initialize_infptrace): Move function out of - #ifdef conditional; put code within the function inside an - #ifdef conditional. - - * buildsym.c (end_symtab): Remove sort_pending and sort_linevec - arguments. Sorting is now dependent on OBJF_REORDERED. All - callers/references changed. - * dbxread.c (read_ofile_symtab): Correctly determine value for - last_source_start_addr for reordered executables. - (process_one_symbol): Handle N_FUN with no name as an end of - function marker. - * partial-stab.h (case N_FN, N_TEXT): Don't assume CUR_SYMBOL_VALUE - is the high text address for a psymtab. - (case N_SO): Likewise. - (case N_FUN): Handle N_FUN with no name as an end of function - marker. - * minsyms.c (lookup_minimal_symbol_by_pc): Examine all symbols - at the same address rather than a random subset of them. - * coffread.c (coff_symfile_init): Set OBJF_REORDERED. - * elfread.c (elf_symfile_init): Similarly. - * somread.c (som_symfile_init): Similarly. - * xcoffread.c (xcoff_symfile_init): Similarly. - -Fri Jan 5 17:46:01 1996 Stu Grossman (grossman@cygnus.com) - - * stack.c (print_stack_frame print_frame_info) symmisc.c - (dump_symtab): Change RETURN_MASK_ERROR to RETURN_MASK_ALL so - that catch_errors doesn't get blindsided by QUIT and lose the - cleanup chain. This fixes a problem where ^C while in a - user-defined command sometimes leaves instream NULL and causes a - segfault in command_loop. - -Fri Jan 5 13:59:16 1996 Brendan Kehoe <brendan@lisa.cygnus.com> - - * configure.in, configure: Add `-ldl -lw' for Solaris linking. - -Fri Jan 5 12:02:00 1996 Steve Chamberlain <sac@slash.cygnus.com> - - * config/sh/sh.mt, config/powerpc/*.mt, config/pa/hppapro.mt, - config/m68k/monitor.mt, config/h8500/h8500.mt, config/h8300/h8300.mt: - srec.o renamed to dsrec.o. - -Thu Jan 4 16:04:54 1996 Stu Grossman (grossman@cygnus.com) - - * breakpoint.c (remove_breakpoint): Change error to warning so - that hardware watchpoint removal problems won't leave breakpoint - traps in the target. - * remote-e7000.c (e7000_insert_breakpoint, - e7000_remove_breakpoint): Use e7000 based breakpoints, not memory - breakpoints. - * (e7000_wait): Adjust PC back by two when we see a breakpoint to - compensate for e7000 maladjustment. - * sparcl-tdep.c (sparclite_check_watch_resources): Fix logic bug - which prevented hardware watchpoints from working. - -Thu Jan 4 10:44:17 1996 Fred Fish <fnf@cygnus.com> - - * infptrace.c (udot_info): New function. - (PT_*): Define each individually if that one is not defined. - * rs6000-nat.c (kernel_u_size): New function - Include <sys/user.h> for "struct user" - * alpha-nat.c (kernel_u_size): New function. - Include <sys/user.h> for "struct user" - * sparc-nat.c (kernel_u_size): New function. - Include <sys/user.h> for "struct user" - * i386b-nat.c (kernel_u_size): New function. - * i386v-nat.c (kernel_u_size): New function. - * config/i386/nm-fbsd.h (KERNEL_U_SIZE): Define. - (kernel_u_size): Declare. - * config/i386/nm-linux.h (KERNEL_U_SIZE): Define. - (kernel_u_size): Declare. - * config/sparc/nm-sun4os4.h (KERNEL_U_SIZE): Define. - (kernel_u_size): Declare. - * config/alpha/nm-osf2.h (KERNEL_U_SIZE): Define. - (kernel_u_size): Declare. - * config/rs6000/nm-rs6000.h (KERNEL_U_SIZE): Define. - (kernel_u_size): Declare. - -Thu Jan 4 11:00:01 1996 steve chamberlain <sac@slash.cygnus.com> - - * mdebugread.c (mylookup_symbol): enum namespace becomes - enum_namespace type. - * symfile.c (add_psymbol_to_list) - (add_psymbol_addr_to_list): Ditto. - * symtab.c (lookup_partial_symbol): Ditto. - (lookup_symbol): Ditto. - (lookup_block_symbol): Ditto. - * win32-nat.c (handle_load_dll): Use incoming dll base. - (child_wait): Catch DLL load errors. - (create_child_inferior): Translated between paths correctly. - -Wed Jan 3 23:13:53 1996 Fred Fish <fnf@cygnus.com> - - * i386v4-nat.c (supply_gregset, fill_gregset): Subtract NUM_FREGS - from NUM_REGS to get number of general registers that we care about. - * config/i386/tm-i386.h (REGISTER_BYTES): Define in terms - of number of general regs and number of floating point regs. - -Wed Jan 3 19:49:54 1996 steve chamberlain <sac@slash.cygnus.com> - - * config/i386/tm-win32.h (IN_SOLIB_CALL_TRAMPOLINE): New. - (SKIP_TRAMPOLINE_CODE): New. - * config/i386/xm-win32.h (CANT_FORK): Deleted. - (SLASH*) Changed to use unix style slash. - * symtab.h (namespace enum): becomes typedef to avoid namespace - collision in C++. - * infcmd.c (path_command): Use empty string if PATH name not set. - * i386-tdep.c (skip_trampoline_code): New function. - * srec.c: Renamed dsrec.c to avoid filename collision. - * Makefile.in: Cope with renaming. - -Wed Jan 3 13:09:04 1996 Fred Fish <fnf@cygnus.com> - - * symmisc.c (print_objfile_statistics): Print memory use statistics - for objfile psymbol, symbol, and type obstacks. - -Tue Jan 2 13:41:14 1996 Stan Shebs <shebs@andros.cygnus.com> - - * config/mips/nm-irix5.h: Restore. - (TARGET_HAS_HARDWARE_WATCHPOINTS, etc): Define as for Irix 4; - from Lee Iverson <leei@ai.sri.com>. - * config/mips/irix5.mh (NAT_FILE): Use nm-irix5.h. - * config/mips/irix[345].mh (MUNCH_DEFINE): Remove. - -For older changes see ChangeLog-95 - -Local Variables: -mode: change-log -left-margin: 8 -fill-column: 74 -version-control: never -End: diff --git a/contrib/gdb/gdb/ChangeLog-97 b/contrib/gdb/gdb/ChangeLog-97 deleted file mode 100644 index 4f9a949c0481b..0000000000000 --- a/contrib/gdb/gdb/ChangeLog-97 +++ /dev/null @@ -1,2855 +0,0 @@ -Wed Dec 31 11:43:53 1997 Mark Alexander <marka@cygnus.com> - - * dsrec.c (load_srec): Check remotedebug flag when printing - debug info. - -Wed Dec 31 10:33:15 1997 David Taylor <taylor@texas.cygnus.com> - - * breakpoint.c (breakpoint_re_set): add _siglongjmp to list of - longjmp breakpoints. - -Mon Dec 29 21:25:34 1997 Mark Alexander <marka@cygnus.com> - - * dve3900-rom.c: New file to support Densan DVE-R3900/20 board. - * monitor.c (monitor_debug): Move to utils.c, rename to puts_debug. - (monitor_write_memory, monitor_read_memory, monitor_insert_breakpoint, - monitor_remove_breakpoint): Remove useless address bits if current - monitor has MO_ADDR_BITS_REMOVE flag. - * monitor.h (MO_ADDR_BITS_REMOVE): Define. - * utils.c (puts_debug): Formerly monitor_debug from monitor.c; - move here and make public. Add better support for carriage returns. - * defs.h (puts_debug): Declare. - * dsrec.c (load_srec): Use puts_debug to print remotedebug information. - Output header record correctly. - (make_srec): Output a header record instead of a termination record - if sect is non-NULL (value is ignored), but abfd is NULL. - * config/mips/tm-tx39.h (DEFAULT_MIPS_TYPE): Remove definition. - (REGISTER_NAMES): Define to add R3900-specific registers. - * config/mips/tm-tx39l.h: Ditto. - * config/mips/tx39.mt (TDEPFILES): Add dve3900-rom.o and support files. - * config/mips/tx39l.mt: Ditto. - -Wed Dec 24 12:48:48 1997 Stan Shebs <shebs@andros.cygnus.com> - - * dsrec.c: Cosmetic improvements. - (make-srec): Change indexing of format and code tables to - remove confusing empty entries. - -Mon Dec 22 21:51:53 1997 Mark Alexander <marka@cygnus.com> - - * remote-mips.c (_initialize_remote_mips): Fix DDB doc string. - -Sun Dec 21 17:00:06 1997 David Taylor <taylor@texas.cygnus.com> - - * d30v-tdep.c (d30v_frame_find_saved_regs): split most of - function off into d30v_frame_find_saved_regs_offsets; - (d30v_frame_find_saved_regs_offsets): new function. Got - backtrace working when calling from framefull (unoptimized) - routines (.e.g, main) into frameless (optimized) routines - (e.g., printf). - -Fri Dec 19 09:49:49 1997 David Taylor <taylor@texas.cygnus.com> - - * d30v-tdep.c (d30v_frame_chain): test end_of_stack - (d30v_frame_find_saved_regs): set it. - * config/d30v/tm-d30v.h: improved FRAME_CHAIN_VALID - -Thu Dec 18 12:34:28 1997 Andrew Cagney <cagney@b1.cygnus.com> - - From Gavin Koch <gavin@cygnus.com>: mips-tdep.c - * (mips_push_arguments): For big-endian shorts and char's store at - * the correct location. - -Thu Dec 18 00:26:46 1997 Andrew Cagney <cagney@b1.cygnus.com> - - * mdebugread.c (parse_partial_symbols): Delete check that symbols - for file not already loaded. Did not work when an include file - was involved. - -Wed Dec 17 10:43:04 1997 Andrew Cagney <cagney@b1.cygnus.com> - - * elfread.c (elf_symfile_read): Since the partial symbol table is - searched last in first, insert mdebug or XCOFF info into the - partial symbol table before any DWARF2 info. - -Thu Dec 18 00:00:48 1997 Andrew Cagney <cagney@b1.cygnus.com> - - * symfile.c (init_psymbol_list): Handle init with zero elements. - - * elfread.c (elf_symfile_read): If `mainline', clear psymbol table - using init_psymbol_list 0. For build_psymtabs functions, pass - mainline==0 so that psymbol_list isn't re-initialized. - - * symfile.c (discard_psymtab): New function, correctly unlink an - empty psymtab from an object file. - * dbxread.c (end_psymtab): Call discard_psymtab. - * xcoffread.c (xcoff_end_psymtab): Ditto. - * hpread.c (hpread_end_psymtab): Ditto. - * os9kread.c (os9k_end_psymtab): Ditto. - -Wed Dec 17 10:47:05 1997 Michael Snyder (msnyder@cleaver.cygnus.com) - - * tracepoint.c (set_raw_tracepoint): initialize addr_string - to NULL; (trace_actions_command): call readline_begin_hook only - if from_tty is true. - -Tue Dec 16 20:05:48 1997 Mark Alexander <marka@cygnus.com> - - * configure.tgt: Change little-endian tx39 target name to tx39l. - -Tue Dec 16 11:24:30 1997 Jeffrey A Law (law@cygnus.com) - - * remote-sim.c (gdbsim_open): Use "--architecture" instead of - ambigious short form. - -Tue Dec 16 10:29:16 1997 David Taylor <taylor@texas.cygnus.com> - - * d30v-tdep.c (d30v_frame_chain): don't or in DMEM_START to - FP_REGNUM value before return; (prologue_find_regs): two sets - of offsets -- frame pointer and stack pointer, not just one that - tries to do double duty; (d30v_frame_find_saved_regs): stop once - we hit pc (in case we're stopped in the middle of the prologue) - and improve handling of frameless prologues; (d30v_push_arguments): - *ALL* arguments go on the stack until we run out of args registers, - force sp to be 8 byte aligned. - - * config/tm-d30v.h (EXTRACT_STRUCT_VALUE_ADDRESS): fix, it's r2, - not r0; (FRAME_CHAIN_VALID): handle use of external memory; - (STACK_ALIGN): define. - -Mon Dec 15 15:13:57 1997 Andrew Cagney <cagney@b1.cygnus.com> - - * remote-sim.c (gdbsim_wait): When HAVE_SIGACTION and SA_RESTART - intall cntrl-c handler with SA_RESTART clear. On BSD systems this - stops read syscalls's being restarted. - - * configure.in (configdirs): Check for sigaction. - * configure: Re-generate. - -Mon Dec 15 11:38:52 1997 Andrew Cagney <cagney@b1.cygnus.com> - - * dwarf2read.c: From change proposed by Gavin Koch. - (address_significant_size): New static variable. - (dwarf2_build_psymtabs_hard): Check consistency between - `address_size' and `address_significant_size'. - (read_address): MASK out all but the significant bits, as - determined by `address_significant_size', of any addresses. - (elf-bfd.h): Include. - (dwarf2_build_psymtabs_hard): Set `address_significant_size' - according to the arch_size of the elf object file. - -Thu Dec 11 13:40:46 1997 Andrew Cagney <cagney@b1.cygnus.com> - - * dwarf2read.c (dwarf_decode_lines): Change type of address to - CORE_ADDR. - -Thu Dec 11 14:28:01 1997 Michael Snyder (msnyder@cleaver.cygnus.com) - - * tracepoint.c (trace_find_command): don't error if going - backwards thru the trace buffer in a loop. - * (struct tracepoint): delete unused field. - -Wed Dec 10 17:57:00 1997 David Taylor <taylor@texas.cygnus.com> - - * d30v-tdep.c : don't bury lots of magic numbers in the code - instead use defines for the opcodes and opcode masks; update - to use actual d30v patterns; fix register sizes to be 4 bytes - not 2 bytes; improve prologue testing now that we have a C - compiler; fix stack frame handling enough to get backtraces - working; initial changes to push and pop frames (so that gdb - can call functions in the inferior). - - * config/d30v/tm-d30v.h: update DMEM_START, IMEM_START, and - STACK_START; change FR_REGNUM to 61 (was 11). Reformat comment - about DUMMY FRAMES so that it is readable. Fix SAVED_PC_AFTER_FRAME - macro. - -Wed Dec 10 17:41:07 1997 Jim Blandy <jimb@zwingli.cygnus.com> - - * ch-valprint.c (chill_val_print): To avoid segfaults, don't print - a string whose dynamic length is longer than its static length. - -Wed Dec 10 15:54:00 1997 Andrew Cagney <cagney@b1.cygnus.com> - - * dwarf2read.c (dwarf2_build_psymtabs_hard): Check - cu_header.length is within dwarf_info_buffer not - dwarf_abbrev_buffer. - -Mon Dec 8 14:28:49 1997 Michael Snyder (msnyder@cleaver.cygnus.com) - - * tracepoint.c (memrange_sortmerge): allow for memranges - that overlap. (collect_pseudocommand etc.) cleanup decls. - -Fri Dec 5 09:22:35 1997 Nick Clifton <nickc@cygnus.com> - - * config/v850/tm-v850.h (BREAKPOINT): Reverted back to old value... - -Thu Dec 4 09:30:22 1997 Nick Clifton <nickc@cygnus.com> - - * config/v850/tm-v850.h (BREAKPOINT): Changed to match new value. - -Wed Dec 3 12:44:15 1997 Keith Seitz <keiths@onions.cygnus.com> - - * tracepoint.c: Add declaration for x_command. - - * printcmd.c (x_command): Remove static declaration. - -Wed Dec 3 12:00:42 1997 Michael Snyder (msnyder@cleaver.cygnus.com) - - * tracepoint.c (finish_tfind_command): call do_display so that - auto-displays are updated by tfind. Also, keep track of frame - and current-function so that tfind behaves like stepping (only - show the stack frame if we step into a new function or return). - -Wed Dec 3 14:14:58 1997 David Taylor <taylor@texas.cygnus.com> - - * sol-thread.c: additional support for debugging threaded core - files on solaris; previously only kernel threads were found -- - user threads generated errors. - * corelow.c: don't register core_ops as a target if - coreops_suppress_target is true (set by sol-thread.c). - -Tue Dec 2 14:53:09 1997 Michael Snyder (msnyder@cleaver.cygnus.com) - - * tracepoint.c: make "tdump" command handle literal memranges. - -Tue Dec 2 11:34:48 1997 Michael Snyder (msnyder@cleaver.cygnus.com) - - * tracepoint.c: use "lookup_cmd" to parse actions commands - (thus allowing unambiguous prefixes and aliases). - -Tue Dec 2 10:15:57 1997 Nick Clifton <nickc@cygnus.com> - - * configure.tgt: Add support for Thumb target. - -Tue Dec 2 10:14:15 1997 Michael Snyder (msnyder@cleaver.cygnus.com) - - * tracepoint.c: move prototype of validate_actionline(), and - make it consistent with the function declaration. - -Thu Nov 27 09:07:18 1997 Michael Meissner <meissner@cygnus.com> - - * Makefile.in (tracepoint_h): New macro for tracepoint.h - includes. - (tracepoint.o): Add rule to build. - -Wed Nov 26 22:59:04 1997 Jeffrey A Law (law@cygnus.com) - - * remote-sim.c (gdbsim_cntrl_c): Lose ANSI prototype. - - * tracepoint.c (set_raw_tracepoint): fix typo - -Wed Nov 26 11:33:09 1997 Keith Seitz <keiths@onions.cygnus.com> - - * tracepoint.c (set_raw_tracepoint): Make sure there's a trailing - slash on the directory name. - - * top.c (get_prompt): New function. - * top.h: Declare it. - -Wed Nov 26 09:59:47 1997 Andrew Cagney <cagney@b1.cygnus.com> - - * dwarf2read.c (struct comp_unit_head): Change length and - abbrev_offset fields to unsigned int. - (dwarf2_build_psymtabs_hard): Verify length and offset read from - .debug_info section. - -Mon Nov 24 19:36:34 1997 Michael Snyder (msnyder@cleaver.cygnus.com) - - * tracepoint.c, tracepoint.h: new module, implements tracing, - which is a new functionality somewhat like breakpoints except - that a tracepoint stops the inferior only long enough to collect - and cache selected buffers and memory locations, then allows - the inferior to continue; the cached trace data can then be - examined later. - -Mon Nov 24 14:17:02 1997 Michael Snyder (msnyder@cleaver.cygnus.com) - - * infcmd.c: export registers_info, for use by other modules. - * printcmd.c: export output_command, for use by other modules. - * stack.c: export locals_info and args_info, for use by other modules. - * remote.c: export getpkt, putpkt, and fromhex for external use. - Make fromhex case-insensative. New function "remote_console_output" - abstracts the acceptance of "O" packets from target. - Make all "remotedebug" output go to stdout, not stderr. - -Mon Nov 24 08:59:28 1997 Andrew Cagney <cagney@b1.cygnus.com> - - * valprint.c (print_longest): When CC has long long but printf - doesn't, print decimal value as three parts. - - * config/i386/tm-fbsd.h: New file. - * config/i386/fbsd.mt (TM_FILE): Change to tm-fbsd.h. - - * config/i386/nm-fbsd.h (FLOAT_INFO): Move definition from here. - * config/i386/tm-fbsd.h (FLOAT_INFO): To here. - - * configure.in (PRINTF_HAS_LONG_LONG): Check full functionality of - %ll format specifier. - (SCANF_HAS_LONG_DOUBLE): Check the scanf family for support of - long double using %Lg. - * acconfig.h: Provide default undef for SCANF_HAS_LONG_DOUBLE. - * configure: Re-generate. - - * c-exp.y (parse_number): Use sscanf %Lg when host has - SCANF_HAS_LONG_DOUBLE not PRINTF_HAS_LONG_DOUBLE - -Sun Nov 23 17:12:58 1997 Andrew Cagney <cagney@b1.cygnus.com> - - * printcmd.c (print_insn): Set the machine type if known. - - * i386-tdep.c (_initialize_i386_tdep): Delete "set - assembly-language" command. Replaced by generic "set - architecture". Set initial machine using bfd_lookup_arch. - -Fri Nov 21 19:43:23 1997 Jim Blandy <jimb@zwingli.cygnus.com> - - * valops.c (call_function_by_hand): If the function has a - prototype, convert its arguments as if by assignment. Otherwise, - do the usual promotions. - * stabsread.c (define_symbol): Set the TYPE_FLAG_PROTOTYPED flag - on functions' types when we can; all C++ functions should get it, - and if the Sun-style prototype notation is in the stabs, we can - notice that. - -Fri Nov 21 12:20:16 1997 Ian Lance Taylor <ian@cygnus.com> - - * aclocal.m4 (AM_CYGWIN32, AM_EXEEXT): Remove. They are already - defined by the inclusion of ../bfd/aclocal.m4. - * configure: Rebuild. - -Fri Nov 21 10:52:39 1997 Michael Meissner <meissner@cygnus.com> - - * Makefile.in (SHELL): Really do the change. - -Fri Nov 21 02:19:57 1997 Geoffrey Noer <noer@cygnus.com> - - * Makefile.in: also revert SHELL change until configury - changes work - -Thu Nov 20 16:35:13 1997 Doug Evans <devans@canuck.cygnus.com> - - * sparc-tdep.c (sparc_pc_adjust): Don't assume sizeof (long) == 4. - -Thu Nov 20 04:11:27 1997 Geoffrey Noer <noer@cygnus.com> - - * aclocal.m4: add EXEEXT setting rule - * configure.in: call it - * configure: regenerate - * Makefile.in: pepper with EXEEXTs in appropriate places, - set SHELL = @SHELL@ for those lame hosts that don't have a /bin/sh - For some reason, EXEEXT isn't getting substututed in correctly - so for now, set EXEEXT to empty string - -Mon Nov 17 15:35:06 1997 Doug Evans <devans@canuck.cygnus.com> - - * Makefile.in (remote-sim.o): Depend on $(INCLUDE_DIR)/callback.h. - -Fri Nov 14 13:04:34 1997 Jeffrey A Law (law@cygnus.com) - - * jv-exp.y (copy_exp, insert_exp): Avoid ANSI prototypes. - -Thu Nov 13 09:47:35 1997 Michael Meissner <meissner@cygnus.com> - - * d30v-tdep.c (d30v_print_flags): Function to print the d30v flags - in a human readable format. - (print_flags_command): Command wrapper to call d30v_print_flags. - (d30v_do_registers_info): When printing out all of the registers, - print out the flag values in a human readable fashion. - (_initialize_d30v_tdep): Add info flags command to print the - flags. - - * config/d30v/tm-d30v.h (PSW_*): Add macros for each of the PSW - bits that are defined. - -Wed Nov 12 14:58:39 1997 Jeff Holcomb <jeffh@cygnus.com> - - * symfile.c (generic_load): Handle cancel from the - ui_load_progress_hook routine. - * dsrec.c (load_srec): Handle cancel from the - ui_load_progress_hook routine. - -Mon Nov 10 15:13:13 1997 Ian Lance Taylor <ian@cygnus.com> - - * valprint.c (print_longest): The b, h, w, and g format specifiers - print unsigned values. - -Mon Nov 10 02:02:49 1997 Martin M. Hunt <hunt@cygnus.com> - - * top.c (quit_confirm): Change exit message. - -Tue Nov 4 16:52:50 1997 Geoffrey Noer <noer@cygnus.com> - - * config/i386/cygwin32.mh: because cygwin.dll calls malloc/realloc - to allocate memory for environ space, gdb cannot use memory - checks -- set -DNO_MMCHECK - -Tue Nov 4 13:50:59 1997 Jim Blandy <jimb@sendai.cygnus.com> - - * jv-exp.y (ArrayAccess): Implement Name [ Expression ]; check the - code to see why this is not trivial. - (copy_exp, insert_exp): New functions. - -Fri Oct 24 17:24:00 1997 Dawn Perchik <dawn@cygnus.com> - - * dwarf2read.c (dwarf2_build_psymtabs_hard): Handle the case - where a compilation unit die has no children (DW_TAG_compile_unit - has DW_children_no). - (scan_partial_symbols): Add comment for nesting_level. - -Wed Oct 29 15:53:24 1997 David Taylor <taylor@texas.cygnus.com> - - * solib.c (solib_break_names): add entry for Solaris 2.6 run - time linker. From Casper Dik via Peter Schauer. - -Tue Oct 28 17:31:47 1997 Martin M. Hunt <hunt@cygnus.com> - - * configure.in (configdir): Add -lcomdlg32 and -ladvapi32 - to WIN32LIBS. - - * configure: Rebuild - -Fri Oct 24 16:48:21 1997 David Taylor <taylor@texas.cygnus.com> - - * sol-thread.c (sol_find_new_threads_callback, - sol_find_new_threads): New functions. - * config/sparc/nm-sun4sol2.h (FIND_NEW_THREADS): New macro, invoke - sol_find_new_threads. - * thread.c (info_threads_command): invoke FIND_NEW_THREADS if it - is defined. - -Thu Oct 23 16:16:04 1997 Jeff Law (law@fast.cs.utah.edu) - - * dbxread.c (process_one_symbol): Put back initialization - of a variable lost during last change. Don't perform - assignment inside conditionals. - * stabsread.c (symbol_reference_defined): Return -1 for error/not - found. All callers changed appropriately. - (define_symbol): Don't perform assignment inside conditionals. - -Wed Oct 22 13:04:52 1997 Jeffrey A Law (law@cygnus.com) - - * mdebugread.c (psymtab_to_symtab_1): Handle new live range stabs - entries. - - * dbxread.c: More comment cleanups. - * stabsread.c: Fix various violations of the GNU coding and - formatting standards. Update/add comments to make code clearer. - (resolve_reference): Delete unused function. - (ref_search_val): Remove function. It didn't belong in stabsread.c - (resolve_live_range): No longer returns a value. Do not add it - to the live range list until the entire range stab has been parsed. - (get_substring): Remove duplicate declaration. - (resolve_symbol_reference): Now static. Remove unnecessary code - to deal with cleanups. - (ref_add): Use xrealloc instea of realloc. - (process_reference): Reorganize slightly to make clearer. - * stabsread.h (resolve_symbol_reference): Remove declaration. - (resolve_reference): Likewise. - * symtab.c (find_active_alias): New function. - (lookup_block_symbol): Use find_active_alias. - * symtab.h (struct range_list): Fix dangling struct live_range - reference. - (ref_search_val): Remove decl. - - * symtab.h (struct range_list): Renamed from struct live_range. - (struct symbol): Remove struct live_range_info substruct. - Bring the alias list and range list fields up to the toplevel - as "aliases" and "ranges". - (SYMBOL_ALIASES, SYMBOL_RANGES): Corresponding changes. - (SYMBOL_RANGE_START, SYMBOL_RANGE_END, SYMBOL_RANGE_NEXT): Delete. - * stabsread.c: Corresponding changes. - - * dbxread.c: Fix various violations of the GNU coding and - formatting standards. Update/add comments to make code - clearer. - (process_later): Use xrealloc instead of realloc. - - * symtab.c: Include inferior.h. - -Tue Oct 21 14:15:26 1997 Per Bothner <bothner@cygnus.com> - - * ch-exp.c: Rename FIELD_NAME to DOT_FIELD_NAME (to avoid conflict). - -Fri Oct 17 13:22:02 1997 Stan Shebs <shebs@andros.cygnus.com> - - * infcmd.c: Improve grammar of "set args" help. - -Thu Oct 16 15:03:58 1997 Michael Meissner <meissner@cygnus.com> - - * remote-sds.c (sds_load): Properly declare as static. - -Wed Oct 15 10:27:14 1997 Doug Evans <dje@canuck.cygnus.com> - - * config/sparc/tm-sparc.h (FIX_CALL_DUMMY): Mask off displacement - to 30 bits in call insn to handle --enable-64-bit-bfd. - (STORE_STRUCT_RETURN): Change to handle --enable-64-bit-bfd. - -Tue Oct 14 22:13:27 1997 Dawn Perchik <dawn@cygnus.com> - - * stabsread.c: Make ref_map entries dynamically allocated. - -Thu Oct 9 12:37:57 1997 Frank Ch. Eigler <fche@cygnus.com> - - * printcmd.c (print_address_symbolic, address_info): Mask - target-specific flag bits from PC, for more aesthetic disassembly. - * config/mips/tm-mips.h: Added PC masking for MIPS family - (especially the MIPS16). - -Sat Oct 4 18:45:44 1997 Mark Alexander <marka@cygnus.com> - - * remote-mips.c (mips-initialize): Work around flakiness in - some versions of PMON after loading a program. - -Fri Oct 3 15:49:18 1997 Per Bothner <bothner@cygnus.com> - - * c-lang.h, cp-valprint.c (static_field_print): Make non-static. - * parse.c, parser-defs.h (length_of_subexp): Make non-static. - * jv-exp.y (FieldAccess): Handle dollar-VARIABLE as primary. - (ArrayAccess): Likewise. Also remove warnings. - (CastExpression): Implement (typename) UnaryExpression. - (push_qualified_expression_name): Fix small bug. - * jv-lang.c: Use TYPE_TAG_NAME, not TYPE_NAME for class names. - (_initialize_jave_language): Fix typo (jave -> java). - (java_language): Java does *not* have C-style arrays. - (java_class_from_object): Make more general (and complicated). - (java_link_class_type): Fix typo "super" -> "class". Handle arrays. - (java_emit_char, java_printchar): New function. - (evaluate_subexp_java case BINOP_SUBSCRIPT): Handle Java arrays. - * jv-valprint.c (java_value_print): Implement printing of Java arrays. - (java_print_value_fields): New function. - (java_val_print): Better printing of TYPE_CODE_CHAR, TYPE_CODE_STRUCT. - -Fri Oct 3 09:52:26 1997 Mark Alexander <marka@cygnus.com> - - * config/mips/tm-mips.h (MAKE_MSYMBOL_SPECIAL): Force MIPS16 - addresses to be odd. - (MIPS_FPU_SINGLE_REGSIZE, MIPS_FPU_DOUBLE_REGSIZE): Define. - * mips-tdep.c (mips_extract_return_value): Doubles aren't - returned in FP0 if FP registers are single-precision only. - -Mon Sep 29 23:03:03 1997 Mark Alexander <marka@cygnus.com> - - * mips-tdep.c (set_reg_offset): New function. - (mips16_heuristic_proc_desc): Calculate offsets of registers - saved by entry pseudo-op after rest of prologue has been read. - Use set_reg_offset to ignore all but the first save of a given - register. - (mips32_heuristic_proc_desc): Initialize frame adjustment value. - * remote-sim.c (gdbsim_store_register): Don't update registers - that have a null or empty name. - * findvar.c (read_register_bytes): Don't fetch registers - that have a null or empty name. - -Tue Sep 30 13:35:54 1997 Andrew Cagney <cagney@b1.cygnus.com> - - * config/mips/tm-mips.h (NUM_REGS): Define conditionally. - (REGISTER_NAMES): Ditto. - -Fri Sep 26 21:08:22 1997 Keith Seitz <keiths@pizza.cygnus.com> - - * dsrec.c (load_srec): add ui_load_progress_hook to - display some feedback to user - - * symfile.c (generic_load): add ui_load_progress_hook to - display some feedback to user - -Fri Sep 26 17:32:22 1997 Jason Molenda (crash@pern.cygnus.com) - - * command.c (add_cmd, add_show_from_set): Insert new commands in - alphabetical order. - -Fri Sep 26 12:22:00 1997 Mark Alexander <marka@cygnus.com> - - * config/mips-tm-mips.h (mips_extra_func_info): New frame_adjust - member for storing offset of MIPS16 frame pointer from SP. - * mips-tdep.c: Use RA_REGNUM instead of hardcoded 31 throughout. - (PROC_FRAME_ADJUST): Define. - (mips16_heuristic_proc_desc): Store frame pointer adjustment value. - (get_frame_pointer): Use frame pointer adjustment value when - calculating frame address. - * remote-sim.c (gdbsim_fetch_register): Don't fetch registers - that have a null or empty name. - -Fri Sep 26 12:40:51 1997 Jeffrey A Law (law@cygnus.com) - - * mips-tdep.c (_initialize_mips_tdep): Allow target files to - override default FPU type. - -Fri Sep 26 10:33:54 1997 Felix Lee <flee@cygnus.com> - - * configure.tgt (v850-*-*): necmsg.lib instead of v850.lib. - -Wed Sep 24 14:02:09 1997 Andrew Cagney <cagney@b1.cygnus.com> - - * config/v850/tm-v850.h (BREAKPOINT): Use 1 word DIVH insn with - RRRRR=0 for simulator breakpoint. Previous breakpoint insn was two - words. - -Thu Sep 18 15:07:46 1997 Andrew Cagney <cagney@b1.cygnus.com> - - * ser-e7kpc.c (get_ds_base): Only use under Windows. - (windows.h): Include when any _WIN32 host. - -Wed Sep 24 18:12:47 1997 Stu Grossman <grossman@babylon-5.cygnus.com> - - * The following block of changes add support for debugging assembly - source files. - * breakpoint.c (resolve_sal_pc): Prevent crash when pc isn't - associated with a function. - * buildsym.c (record_line start_symtab end_symtab): Don't delete - symtabs which only have line numbers (but no other debug symbols). - * dbxread.c (read_dbx_symtab end_psymtab): Ditto. - - * remote-sim.c: New functions gdbsim_insert/remove_breakpoint. Use - intrinsic simulator breakpoints if available, otherwise do it the - hard way. - - * configure.tgt: Add d30v. - * d30v-tdep.c: New file. - * config/d30v/d30v.mt, config/d30v/tm-d30v.h: New files. - -Tue Sep 23 11:24:13 1997 Stan Shebs <shebs@andros.cygnus.com> - - * Makefile.in (ALLCONFIG): Remove, inaccurate and never used. - -Tue Sep 23 00:08:18 1997 Peter Schauer (pes@regent.e-technik.tu-muenchen.de) - - * mips-tdep.c (mips_push_arguments): Tweak alignment of register - value if the remaining length of a non-integral argument is smaller - than the register size for big-endian non-EABI mode. - - * rs6000-tdep.c (branch_dest): Handle return from signal - handler function via sigreturn kernel call. - -Mon Sep 22 15:32:06 1997 Dawn Perchik <dawn@cygnus.com> - - * stabsread.h, symtab.h, dbxread.c, symtab.c, stabsread.c: - Fix prototypes. Remove function scoped function declarations. - -Fri Sep 19 18:51:26 1997 Felix Lee <flee@cygnus.com> - - * config/i386/windows.mh (XDEPFILES): need to list some files - explicitly, for odd reasons. - -Tue Sep 16 20:00:05 1997 Per Bothner <bothner@cygnus.com> - - * jv-exp.y (push_fieldnames): New, to handle EXP.FIELD1....FIELDN. - (push_expression_name): New, to handle expression names. - (push_qualified_expression_name): New, for qualified expression names. - (parse_number): Fix bugs in parsing of non-decimal integers. - * jv-lang.h, jv-lang.c (java_demangle_type_signature): New. - * jv-lang.c (type_from_class): Just use name with java_lookup_class. - (java_link_class_type): Add dummy "class" field. - (java_lookup_type): New. - (evaluate_subexp_java case STRUCTOP_STRUCT): Force to address. - * jv-typeprint.c (java_type_print_base): Don't print "class" field. - Use java_demangle_type_signature to print array class types. - * jv-valprint.c (java_value_print): Preliminary array support. - Print pointer as TYPE@HEXADDR, instead of (TYPE)0xHEXADDR. - (java_val_print): Move check for object type to java_value_print. - Check for null. Print pointer as @HEXADDR, not 0xHEXADDR. - - * valops.c (search_struct_field): Search basesclasses in - ascending, not descending order. Hack to avoid virtual baseclass - botch for Java interfaces. - -Tue Sep 16 19:56:23 1997 Per Bothner <bothner@cygnus.com> - - * util.c (run_cleanup_chain, make_run_cleanup, do_run_cleanups): - New cleanup clean for cleanups to be run when at each 'run' command. - * infcmd.c (run_command): Call do_run_cleanups. - - * solib.c (find_solib): Register cleanup to call clear_solib - on a new 'run' command. - (symbol_add_stub): First look for existing objfile with same name. - -Tue Sep 16 16:00:01 1997 Stan Shebs <shebs@andros.cygnus.com> - - * remote-sds.c (sds_load): New function. - (sds_ops): Use it. - (sds_open): Don't set inferior_pid yet. - (sds_kill): Remove contents. - (sds_create_inferior): Rewrite to work more like monitor - interfaces. - (sds_restart): Remove, no longer used. - - * monitor.h (MO_SREC_ACK_PLUS, MO_SREC_ACK_ROTATE): New flags. - * monitor.c (monitor_wait_srec_ack): Add DINK32-specific ack code. - * dsrec.c (load_srec): Always write a header S-record. - * dink32-rom.c (dink32_regnames): Fix the names of float registers. - (dink32_cmds): Set to use S-record downloading with acks. - * remote-est.c (est_cmds): Add MO_SREC_ACK_PLUS flag. - -Tue Sep 16 10:08:27 1997 Andrew Cagney <cagney@b1.cygnus.com> - - * config/v850/tm-v850.h (BREAKPOINT): Set to a truely illegal - instruction. - - * exec.c (exec_file_command): Call set_architecture_from_file. - -Mon Sep 15 13:01:22 1997 Mark Alexander <marka@cygnus.com> - - * dbxread.c (MSYMBOL_SIZE): New macro. - (end_psymtab): Use MSYMBOL_SIZE to extract size from minimal symbol. - * elfread.c (elf_symtab_read): If ELF symbol is "special", - such as a MIPS16 function, mark minimal symbol as special too. - * mips-tdep.c (pc_is_mips16): New function to check whether - a function is MIPS16 by looking at the minimal symbol. Use - pc_is_mips16 throughout instead of IS_MIPS16_ADDR macro. - * config/mips/tm-mips.h (SYMBOL_IS_SPECIAL, MAKE_MSYMBOL_SPECIAL, - MSYMBOL_IS_SPECIAL, MSYMBOL_SIZE): New functions for setting/testing - "special" MIPS16 bit in ELF and minimal symbols. - * mdebugread.c (parse_partial_symbols): Don't construct a partial - symbol table for a file that already has one. - -Sat Sep 13 08:32:13 1997 Peter Schauer (pes@regent.e-technik.tu-muenchen.de) - - * mdebugread.c (parse_symbol, handle_psymbol_enumerators): Handle - yet another variant of enumerator debugging info, used by DU 4.0 - native cc. - -Tue Sep 9 20:47:23 1997 Felix Lee <flee@cygnus.com> - - * config/i386/windows.mh (XDEPFILES): reduce to libwingdb.a. - otherwise link command line is too long. - -Tue Sep 9 17:41:41 1997 Jeffrey A Law (law@cygnus.com) - - * symtab.c, dbxread.c, stabsread.c: Fix up ANSI-C isms. Fix - some formatting problems. - -Mon Sep 8 16:45:51 1997 Stu Grossman <grossman@cygnus.com> - - * ser-e7kpc.c: Don't include w32sut.h. We no longer use the UT - mechanism. Remove prototypes for dos_async_* functions. They don't - exist anymore. - -Mon Sep 8 12:48:50 1997 Ian Lance Taylor <ian@cygnus.com> - - * top.c (quit_confirm, quit_force): New functions, broken out of - quit_command. - (quit_command): Just call quit_confirm and quit_force. - * top.h (quit_confirm, quit_force): Declare. - -Sun Sep 7 17:26:30 1997 Dawn Perchik <dawn@cygnus.com> - - * dbxread.c, buildsym.c, symtab.c, stabsread.c: Add support for - reading stabs extensions for live range information. - * stabsread.h, partial-stab.h: Add prototypes for new functions. - * symtab.h: Add structure for storing live range information. - -Wed Sep 3 16:39:39 1997 Andrew Cagney <cagney@b1.cygnus.com> - - * top.c (set_arch): New function, update target_architecture. - - * defs.h, top.c (set_architecture_from_arch_mach): Replace - set_architecture, takes the arch and machine as arguments. - - * sh3-rom.c (sh3e_open): Update. - (sh3_open): Ditto. - -Tue Sep 2 12:00:46 1997 Andrew Cagney <cagney@b1.cygnus.com> - - * remote-e7000.c (e7000_fetch_registers): Fix typo, stray paren. - (e7000_wait): Ditto. - -Mon Sep 1 11:21:03 1997 Andrew Cagney <cagney@b1.cygnus.com> - - * top.c (init_main): Add ``set processor'' as an alias for ``set - architecture''. - -Sat Aug 30 13:44:48 1997 Bob Manson <manson@charmed.cygnus.com> - - * config/sparc/sparclite.mt: Removed simulator references (erc32 - has been disabled). - -Thu Aug 28 10:20:04 1997 Andrew Cagney <cagney@b1.cygnus.com> - - * remote-e7000.c (e7000_fetch_registers): Check - target_architecture instead of sh_processor_type. - (e7000_wait): Ditto. - - * config/sh/tm-sh.h (sh_set_processor_type): Delete prototype. - - * sh3-rom.c (sh3_open): Call set_architecture not - sh_set_processor_type. - (sh3e_open): Ditto. - - * sh-tdep.c (sh_show_processor_type_command): Delete. - (sh_set_processor_type_command): Delete. - (sh_target_architecture_hook): Rename from sh_set_processor_type, - use AP to determine architecture. - (sh_show_regs): Use bfd_mach_sh* types. - - * remote-sim.c (gdbsim_open): Pass --arch=XXX to simulator when - architecture was specified explicitly. - - * defs.h (target_architecture, target_architecture_auto, - set_architecture, set_architecture_from_file): Declare. - (target_architecture_hook): Allow targets to be notified of set - arch commands. - - * top.c (init_main): Add set/show/info architecture commands. - (set_architecture, show_architecture, info_architecture): New - functions, parse same. - (set_architecture_from_file): New function, determine arch from - BFD. - -Tue Aug 26 17:13:43 1997 Andrew Cagney <cagney@b1.cygnus.com> - - * remote-sim.c (gdbsim_open): Only pass endianness to sim_open - when set explicitly. Prepend endianness arg so that it can be - overridden. - - * defs.h, top.c (target_byte_order_auto): Make global when - byteorder is selectable. - -Tue Aug 26 15:19:56 1997 Andrew Cagney <cagney@b1.cygnus.com> - - * remote-sim.c (gdbsim_create_inferior): Pass exec_bfd into - sim_create_inferior. - (gdbsim_create_inferior): Pass -1 to proceed, sim_create_inferior - has already set the PC. - (gdbsim_create_inferior): Allow exec_file to be NULL, make "No - exec file" a warning. Ditto for "No program loaded". - -Mon Aug 25 17:08:01 1997 Geoffrey Noer <noer@cygnus.com> - - * ocd.c: revert Sun change -- enable log file handling - -Mon Aug 25 12:21:46 1997 Andrew Cagney <cagney@b1.cygnus.com> - - * remote-sim.c (gdbsim_open): Pass exec_bfd to sim_open call. - -Sun Aug 24 21:16:59 1997 Geoffrey Noer <noer@cygnus.com> - - * ocd.c: comment out sections that create and flush wigglers.log - log file when using the wiggler. - -Thu Aug 21 16:18:08 1997 Geoffrey Noer <noer@cygnus.com> - - * config/powerpc/ppc-eabi.mt: - * config/powerpc/ppc-sim.mt: - * config/powerpc/ppcle-eabi.mt: - * config/powerpc/ppcle-sim.mt: ser-ocd.c needs to be before - other ocd-related files in TDEPFILES - -Thu Aug 21 14:56:04 1997 Geoffrey Noer <noer@cygnus.com> - - * ppc-bdm.c (bdm_ppc_wait): stop printfing ecr, der - * ocd.c: initialize remote_timeout - (ocd_wait): while looping, call ocd_do_command with OCD_AYT - (ocd_get_packet): remove find_packet goto. If there isn't - an 0x55 at the start, something is quite wrong so error out - instead of advancing in the packet and trying again. If checksum - is invalid, print error message instead of trying again. - * ser-ocd.c (ocd_readchar): error if we attempt to read past - the end of the from_wiggler_buffer. - - -Wed Aug 20 14:08:39 1997 Stan Shebs <shebs@andros.cygnus.com> - - * dink32-rom.c: Don't use "mf" command to fill, is too picky - about alignment. - - -Tue Aug 19 08:41:36 1997 Fred Fish <fnf@cygnus.com> - - * objfiles.c (objfile_relocate): Add call to breakpoint_re_set - after relocations are complete. - * remote-vx.c (vx_add_symbols): Remove call to breakpoint_re_set, - this is now done in objfile_relocate. - -Mon Aug 18 17:29:54 1997 Ian Lance Taylor <ian@cygnus.com> - - * win32-nat.c (handle_exception): Return a value indicating - whether the exception was handled. Don't handle random exceptions - the first time around, so that structured exception handling - works. - (child_wait): Check the return value of handle_exception. Set the - continue_status argument to ContinueDebugEvent accordingly. - -Mon Aug 18 11:14:15 1997 Nick Clifton <nickc@cygnus.com> - - * configure.tgt: Add support for v850ea target. - -Sun Aug 17 20:31:57 1997 Michael Snyder (msnyder@cleaver.cygnus.com) - - * m32r-stub.c: fix typo - -Sun Aug 17 17:33:34 1997 Stan Shebs <shebs@andros.cygnus.com> - - * remote-sds.c: Remove unused remnants of remote.c. - (tob64): Return the result length. - (sds_interrupt): Send a stop message. - (sds_wait): Add debug output for signal interpretation, flag - that signal was due to a trap. - (sds_fetch_registers): Fill the registers array correctly for - PowerPC. - (sds_store_registers): Get the right values from registers array. - (putmessage): Tweak length handling so checksum comes out right. - (sds_insert_breakpoint, sds_remove_breakpoint): Do correctly. - -Fri Aug 15 20:53:13 1997 Ian Lance Taylor <ian@cygnus.com> - - * Makefile.in (init.c): Don't use xargs. - -Fri Aug 15 13:59:37 1997 Peter Schauer (pes@regent.e-technik.tu-muenchen.de) - - * infrun.c (wait_for_inferior): Add the symbols for any - newly loaded objects upon a TARGET_WAITKIND_LOADED event. - - Rewrite code which determines the TOC address for calling functions - in the inferior under AIX. - * rs6000-nat.c (find_toc_address): New function to determine - the required TOC address from a function address. - (_initialize_core_rs6000): Set up find_toc_address_hook to point - to find_toc_address. - (xcoff_relocate_symtab, xcoff_relocate_core): Remove - add_text_to_loadinfo calls. - (exec_one_dummy_insn): Change pid and status to int to get rid of - compiler warnings. - (xcoff_relocate_symtab): Cast ldi to `int *' when passing it to - ptrace to get rid of compiler warnings. - * rs6000-tdep.c: Add definition for find_toc_address_hook. - (rs6000_fix_call_dummy): If find_toc_address_hook is non zero, - patch TOC address load code in the call dummy with the value - returned from find_toc_address_hook. - (struct loadinfo, loadinfo, loadinfolen, - loadinfotextindex, xcoff_init_loadinfo, free_loadinfo, - xcoff_add_toc_to_loadinfo, add_text_to_loadinfo, find_toc_address): - Remove. - (_initialize_rs6000_tdep): Remove initialization of - coff_add_toc_to_loadinfo_hook and xcoff_init_loadinfo_hook. - * xcoffread.c (coff_add_toc_to_loadinfo_hook, - xcoff_init_loadinfo_hook): Remove. - (struct coff_symfile_info): Add toc_offset field. - (scan_xcoff_symtab): Record toc_offset value in toc_offset field - instead of calling xcoff_add_toc_to_loadinfo_hook. - (get_toc_offset): New function to return the value of the - toc_offset field for an object file. - (xcoff_initial_scan): Remove call of xcoff_init_loadinfo_hook. - * xcoffsolib.h (add_text_to_loadinfo): Remove declaration. - * config/rs6000/tm-rs6000.h: Add declarations for - find_toc_address_hook and get_toc_offset. - -Wed Aug 13 19:31:28 1997 Stan Shebs <shebs@andros.cygnus.com> - - * remote-sds.c: New file, interface to SDS-compatible monitors. - * Makefile.in (remote-sds.o): Add build rule. - * config/powerpc/ppc-eabi.mt, config/powerpc/ppc-sim.mt - (TDEPFILES): Add remote-sds.o. - -Tue Aug 12 14:37:18 1997 Geoffrey Noer <noer@cygnus.com> - - * ocd.c (ocd_wait): loop until we're in BDM mode instead of - assuming control has returned to GDB. - -Mon Aug 11 19:16:04 1997 Stan Shebs <shebs@andros.cygnus.com> - - * dink32-rom.c: New file, support for DINK32 monitor. - * Makefile.in (dink32-rom.o): Add build rule. - * config/powerpc/ppc-eabi.mt, config/powerpc/ppc-sim.mt - (TDEPFILES): Add dink32-rom.o. - * monitor.h (MO_32_REGS_PAIRED, MO_SETREG_INTERACTIVE, - MO_SETMEM_INTERACTIVE, MO_GETMEM_16_BOUNDARY, - MO_CLR_BREAK_1_BASED): New monitor interface flags. - * monitor.c: Use them. - (monitor_store_register): Use setreg.term if defined. - (monitor_insert_breakpoint, monitor_remove_breakpoint): Notice - if set_break and clr_break fields are empty. - -Mon Aug 11 16:22:36 1997 Geoffrey Noer <noer@cygnus.com> - - * ocd.c (ocd_insert_breakpoint, ocd_remove_breakpoint): Macro - BDM_BREAKPOINT already has braces around it, remove erroneous ones. - * ser-ocd.c (ocd_write): Conditionalize on _WIN32 instead of - __CYGWIN32__. - * config/powerpc/tm-ppc-eabi.h: Remove BDM_NUM_REGS, BDM_REGMAP - * ppc-bdm.c: move BDM_NUM_REGS, BDM_REGMAP here from tm.h file, - fill in doc fields of bdm_ppc_ops. - (bdm_ppc_fetch_registers): Don't ask for invalid registers such - as the MQ or floating point regs not present on ppc 8xx boards. - (bdm_ppc_store_registers): Don't write those same invalid registers. - * config/i386/cygwin32.mh: Stop including ocd.o ser-ocd.o. - * config/powerpc/ppc-eabi.mt: - * config/powerpc/ppcle-eabi.mt: - * config/powerpc/ppc-sim.mt: - * config/powerpc/ppcle-sim.mt: Include ser-ocd.o. - -Mon Aug 11 16:08:52 1997 Fred Fish <fnf@cygnus.com> - - * frame.h (enum lval_type): Conditionalize on __GNUC__ - instead of __STDC__. - -Sun Aug 10 19:08:26 1997 Jeffrey A Law (law@cygnus.com) - - * utils.c (error): Fix return type for !ANSI_PROTOTYPES. - -Sun Aug 10 16:49:09 1997 Geoffrey Noer <noer@cygnus.com> - - * ocd.c: move ocd_write_bytes proto to ocd.h since it is used - by ppc-bdm.c, use OCD_LOG_FILE to help debugging, define - BDM_BREAKPOINT if not defined in tm.h - (ocd_error): add new error cases - (ocd_start_remote): send the OCD_INIT command before - OCD_AYT and OCD_GET_VERSION calls, 80 was correct speed after all - (ocd_write_bytes): no longer static - (ocd_insert_breakpoint): no longer static - (ocd_remove_breakpoint): new - * ocd.h: add protos for ocd_write_bytes, ocd_insert_breakpoint, - and ocd_remove_breakpoint - * ppc-bdm.c: change bdm_ppc_ops so we call ocd_insert_breakpoint - and ocd_remove_breakpoint instead of memory_insert_breakpoint - and memory_remove_breakpoint. - (bdm_ppc_open): after calling ocd_open, modify DER - register so interrupts will drop us into debugging mode, finally - disable the watchdog timer on the board so we don't leave BDM - mode unexpectedly. - -Sat Aug 9 01:50:14 1997 Peter Schauer (pes@regent.e-technik.tu-muenchen.de) - - * values.c (value_primitive_field): Account for offset when - extracting the value of a bitfield. - From Paul Hilfinger <hilfingr@CS.Berkeley.EDU>. - -Fri Aug 8 21:35:44 1997 Mark Alexander <marka@cygnus.com> - - * gdbserver/utils.c (error): Change prototype to match defs.h. - * gdbserver/low-sim.c: Change simulator calls to use new interface. - * remote.c (remote_write_bytes): Include '$' at start of packet - and checksum at end of packet in overhead calculation. - -Fri Aug 8 15:59:24 1997 Ian Lance Taylor <ian@cygnus.com> - - * ser-ocd.c: If _WIN32, include <windows.h>. - (dll_do_command): New static variable if _WIN32. - (ocd_open): Set dll_do_command if _WIN32. - (ocd_write): Use dll_do_command rather than do_command. - * config/i386/cygwin32.mh (XDEPFILES): Remove libwigglers.a. - (BDM_DLLNAME, BDM_LIBNAME, BDM_DEFFILE): Don't define. - ($(BDM_LIBNAME)): Remove target. - * wigglers.def: Remove. - - * config/i386/cygwin32.mh ($(BDM_LIBNAME)): Rename target from - libwigglers.def. - (libwigglers.a): Remove target. - -Fri Aug 8 13:11:01 1997 Mike Meissner <meissner@cygnus.com> - - * config/powerpc/ppc{,le}-{eabi,sim}.mt (TDEPFILES): Make sure - ppc-bdm.o and ocd.o are used for all powerpc-eabi targets. - -Thu Aug 7 19:40:52 1997 Geoffrey Noer <noer@cygnus.com> - - Changes to OCD support to support wiggler box as well as - target boxes: - * ocd.c: change speed in init command to 0 from 80, - add (temporary) logging commands to help debugging, - (ocd_open): if "target ocd wiggler lpt" then use special - ser-ocd.c serial interface which communicates with Wigglers.dll, - otherwise ("target ocd <foo>") do as we did before - (ocd_get_packet): add OCD_LOG_FILE and OCD_SET_CONNECTION to - switch of known commands of len 0 - * ocd.h: add OCD_LOG_FILE - * serial.c (serial_open): do serial_interface_lookup on ocd - in the case of ocd - * ser-ocd.c: add buffer to contain responses from sending a - command to the Wigglers.dll. - (ocd_readchar): return curr char from buffer and increment ptr - (ocd_write): send buffer to Wigglers.dll, storing response in - return buffer and initializing curr location ptr to start of - buffer. - -Thu Aug 7 13:39:31 1997 Geoffrey Noer <noer@cygnus.com> - - * ocd.h: add OCD_SET_CONNECTION - * ocd.c: rename "do_command" to "ocd_do_command" - -Thu Aug 7 13:09:17 1997 Geoffrey Noer <noer@cygnus.com> - - Nomenclature change. BDM is a specific type of OCD - (On Chip Debugging). Wiggler is the parallel port box controlled - by Wigglers.dll. The faster target box from Macraigor Systems - is not a wiggler. - * ocd.c: - * ocd.h: - * ppc-bdm.c: - * ser-ocd.c: - Replace all instances of "wiggler_" with "ocd_" and change most other - instances of "wiggler" to "ocd" or "ocd device" depending on context. - * config/m68k/monitor.mt: remove remote-wiggler.o from TDEPFILES - until OCD with that target is supported again. - -Wed Aug 6 16:15:31 1997 Geoffrey Noer <noer@cygnus.com> - - * Makefile.in: add DLLTOOL = @DLLTOOL@, pass on DLLTOOL to - sub makes, change clean rule to also remove *.a to remove - libwigglers.a, in dependencies: add ppc-bdm.o ocd.o ser-ocd.o and - remove remote-wiggler.o - * configure.in: add DLLTOOL support - * configure: regenerate - * wigglers.def: new file for imports for wigglers.dll - * ser-ocd.c: new file which is layer between ocd.c and either the - wigglers.dll or the target box, only stub so far - * config/powerpc/ppc-eabi.mt: add ppc-bdm.o to TDEPFILES - * config/powerpc/ppc-sim.mt: add ppc-bdm.o to TDEPFILES - * config/i386/cygwin32.mh: add ocd.o ser-ocd.o libwigglers.a - to XDEPFILES, add rules to build libwigglers.a - - checking in changes of Stu Grossman <grossman@cygnus.com>: - * remote-wiggler.c: delete - * ocd.c: new, was remote-wiggler.c - always include sys/types.h, include ocd.h, move WIGGLER - commands and many wiggler prototypes to ocd.h, make wiggler_desc - static, stop making local wiggler functions static, - define write_mem_command for wiggler_write_bytes - (wiggler_start_remote): stop hardcoding the target type, - instead set and use a target_type variable. - (wiggler_open): add new target_type and ops args - (wiggler_wait): now no longer takes pid and target_status as args, - stop trying to set target_status struct, remove BGND insn - checks - (read_bdm_registers): renamed to wiggler_read_bdm_registers - (wiggler_read_bdm_registers): numregs arg changed to reglen arg, - remove pktlen check, set reglen instead of numregs - (dump_all_bdm_regs): delete - (wiggler_fetch_registers): delete - (wiggler_prepare_to_store): now just an empty function - (wiggler_store_registers): delete - (wiggler_read_bdm_register): new - (wiggler_write_bdm_registers): new - (wiggler_write_bdm_register): new - (wiggler_write_bytes): use write_mem_command variable instead of - WIGGLER_WRITE_MEM - (get_packet): renamed to wiggler_get_packet, change refs throughout - (put_packet): renamed to wiggler_put_packet, change refs throughout - (wiggler_get_packet): add break to default case of switch, - change length of WIGGLER_GET_VERSION len to 10 from 4 to match - specs - (wiggler_mourn): unpush_target with current_ops, not &wiggler_ops - (flash_xfer_memory): delete - (noop_store_registers): new placeholder replacement for - target_store_registers() which prevents generic_load from trying to - set up the PC. - (bdm_update_flash_command): add store_registers_tmp variable, - make handling of wiggler_ops more generic -- define wiggler_ops - in a target-specific file instead (such as ppc-bdm.c in the case - of the ppc), use current_target to deal with registers again - making this file less target-specific. - (bdm_read_register_command): new - (_initialize_remote_wiggler): stop doing add_target (&wiggler_ops), - comment out add_cmd ("read-register", ...) - * ocd.h: new, contains common wiggler prototypes, command definitions - * ppc-bdm.c: file for ppc-specific OCD code, including target_ops - structure for ppc bdm - (bdm_ppc_open): new - (bdm_ppc_wait): new - (bdm_ppc_fetch_registers): new - (bdm_ppc_store_registers_: new - (_initialize_bdm_ppc): new - * config/powerpc/tm-ppc-eabi.h: add necessary CPU32 BDM defines - -Wed Aug 6 00:24:08 1997 Jeffrey A Law (law@cygnus.com) - - * hpread.c (hpread_read_struct_type): Use accessor macros rather - than directly mucking around with data structures. - -Tue Aug 5 13:37:14 1997 Per Bothner <bothner@cygnus.com> - - * gdbtypes.h: Re-interpret struct field. Suppport address of static. - Add a bunch of macros. - * coffread.c, dwarf2read.c, dwarfread.c, mdebugread.c, stabsread.c: - Update to use new macros. - * coffread.c, hpread.c, stabsread.c: Remove bugus TYPE_FIELD_VALUE. - * value.h, values.c (value_static_field): New function. - * cp-valprint.c, valops.c: Modify to use value_static_field. - - * jv-lang.c (get_java_utf8_name): Re-write so it works with - implied (missing) data field, as defined by cc1java. - (java_link_class_type): Type length and field offset (in interior) - now includes object header. Get static fields working. - * jv-lang.h (JAVA_OBJECT_SIZE): Update for change in Kaffe. - * jv-typeprint.c (java_type_print_derivation_info, - java_type_print_base): New functions, for better Java output. - * jv-valprint.c: Start to support Java-specific output. - -Sun Aug 3 08:18:09 1997 Peter Schauer (pes@regent.e-technik.tu-muenchen.de) - - * c-valprint.c (c_val_print): Use extract_address to retrieve - the address of the virtual function. - From Peter Bloecher (Peter.Bloecher@eedn.ericsson.se). - - * eval.c (evaluate_subexp_standard), valarith.c (value_x_unop): - Handle C++ operator *. - -Fri Aug 1 15:21:44 1997 Ian Lance Taylor <ian@cygnus.com> - - * configure.in: Check for cygwin32 environment. Define and - substitute WIN32LIBS and WIN32LDAPP. Always set configdir to - unix; setting it to win was for an old Tcl/Tk configuration - scheme. - * Makefile.in (TK_CFLAGS): Add @TK_BUILD_INCLUDES@. - (WIN32LDAPP, WIN32LIBS): Define. - (CLIBS): Add $(WIN32LIBS). - (gdb): Use $(WIN32LDAPP). - * configure: Rebuild. - -Thu Jul 31 15:40:19 1997 Per Bothner <bothner@cygnus.com> - - * symtab.h (SYMBOL_INIT_LANGUAGE_SPECIFIC, SYMBOL_INIT_DEMANGLED_NAME, - SYMBOL_DEMANGLED_NAME): Add demangling support for Java. - * utils.c (fprintf_symbol_filtered): Handle language_java. - - * symtab.c (decode_line_1): Handle Java-style package.class.method. - -Wed Jul 30 14:04:18 1997 Per Bothner <bothner@cygnus.com> - - * java-*: Renamed to jv-*, to make fit within 14 characters. - * jv-lang.h (java_type_print): Added declaration. - * jv-typeprint.c: New file. Provides java_print_type. - * jv-lang.c (java_link_class_type): New function. - (java_language_defn): Replace c_print_type by java_print_type. - * Makefile.in: Update accordingly. - -Tue Jul 29 10:12:44 1997 Felix Lee <flee@cygnus.com> - - * Makefile.in (init.c): except some mswin files do need to be - scanned. oh well. - -Mon Jul 28 14:04:39 1997 Felix Lee <flee@cygnus.com> - - * Makefile.in (init.c): don't try to scan mswin for _initialize - funcs. (generates misleading error message because files have - .cpp suffix, not .c suffix) - -Mon Jul 28 13:27:21 1997 Felix Lee <flee@cygnus.com> - - * ser-e7kpc.c: <w32sut.h> -> "mswin/w32sut.h" - -Mon Jul 28 02:54:31 1997 Peter Schauer (pes@regent.e-technik.tu-muenchen.de) - - * xcoffread.c (coff_getfilename): Do not strip directory component - of filename. - -Fri Jul 25 15:16:15 1997 Felix Lee <flee@cygnus.com> - - * mon960-rom.c: removed unused #includes; no ioctl.h in Windows. - * nindy-share/ttyflush.c: find sleep() for _MSC_VER. - * remote-array.c: #include <ctype.h> for isascii(). - * utils.c (notice_quit,pollquit): cleanup. _WIN32 -> _MSC_VER. - -Fri Jul 25 16:48:18 1997 Jeffrey A Law (law@cygnus.com) - - * top.c (execute_command): Force cleanup of alloca areas. - * findvar.c (registers_changed): Likewise. - -Fri Jul 25 15:37:15 1997 Stu Grossman <grossman@cygnus.com> - - * v850ice.c: Include <windows.h>. Support new v850 DLL interface. - * Add defs for target status. - -Tue Jul 22 12:11:48 1997 Michael Snyder (msnyder@cleaver.cygnus.com) - - * config/mips/tm-mips64.h: longs, long longs, and pointers - are all 64 bits on EABI mips targets. - -Thu Jul 17 11:38:46 1997 Michael Snyder (msnyder@cleaver.cygnus.com) - - * partial-stab.h (case N_BINCL): detect missing partial symtab. - * dbxread.c: Add a complaint for N_BINCL without a corresponding - partial symtab. Remove earlier change of 5/27/97. - -Wed Jul 16 10:38:03 1997 Michael Snyder (msnyder@cleaver.cygnus.com) - - * sol-thread.c (sol_thread_[store, fetch]_registers): if - inferior_pid is an LWP rather than a Solaris thread, let - procfs handle the request. - (rw_common, sol_thread_xfer_memory): procfs_xfer_memory will - only work if inferior_pid points to an LWP (rather than a - Solaris thread). Use procfs_first_available to find a good LWP. - (info_solthreads): added a maintenance command to list all - known Solaris threads and their attributes. - * mips-tdep.c (mips_do_registers_info): Completely changed the - output format to be neat and columnar. Added the helper funcs - do_fp_register_row and do_gp_register_row. Also small mods to - mips_print_register, which is still used to print a single reg. - -Mon Jul 14 18:02:53 1997 Michael Snyder (msnyder@cleaver.cygnus.com) - - * procfs.c (wait_fd): Handle an fd that has "hung up" or - otherwise terminated (Solaris threads). - -Thu Jul 10 00:02:41 1997 Martin M. Hunt <hunt@cygnus.com> - - * defs.h (init_ui_hook): Change prototype to accept one arg. - * main.c (gdb_init): Change prototype to accept one arg. - * top.c (gdb_init): Accepts one argument which it uses to - call (*init_ui_hook). - -Fri Jul 4 14:49:33 1997 Ian Lance Taylor <ian@cygnus.com> - - * source.c (OPEN_MODE, FDOPEN_MODE): Define; value depends upon - whether CRLF_SOURCE_FILES is defined. - (open_source_file): Use OPEN_MODE with open and openp. - (print_source_lines): Use FDOPEN_MODE with fdopen. If - CRLF_SOURCE_FILES is defined, ignore \r characters. - (forward_search_command): Use FDOPEN_MODE with fdopen. - (reverse_search_command): Likewise. - * config/i386/xm-cygwin32.h (CRLF_SOURCE_FILES): Define. - (LSEEK_NOT_LINEAR): Don't define. - -Thu Jul 3 17:41:46 1997 Michael Snyder (msnyder@cleaver.cygnus.com) - - * mips-tdep.c (mips_extract_return_value): align 4-byte float - return values within the 8-byte FP register. - -Thu Jul 3 13:48:11 1997 Michael Snyder (msnyder@cleaver.cygnus.com) - - * mips-tdep.c (mips_push_arguments): don't left-adjust 32-bit - integers in 64-bit register parameters before function calls. - -Mon Jun 30 17:54:51 1997 Michael Snyder (msnyder@cleaver.cygnus.com) - - * mips-tdep.c (mips_push_arguments): special-case handling for - odd-sized struct parameters passed in registers / on stack. - -Mon Jun 30 15:30:38 1997 Michael Snyder (msnyder@cleaver.cygnus.com) - - * mips-tdep.c (mips_push_arguments): tweak alignment of small - structs passed in registers for little-endian non-EABI mode. - -Mon Jun 30 13:05:39 1997 Michael Snyder (msnyder@cleaver.cygnus.com) - - * breakpoint.c (frame_in_dummy): use generic dummy if available. - (check_duplicates, clear_command): compare sections only if - doing overlay debugging. - -Fri Jun 27 23:03:53 1997 Fred Fish <fnf@ninemoons.com> - - * buildsym.h (struct subfile): Add debugformat member. - (record_debugformat): Declare global function. - * buildsym.c (start_subfile): Initialize debugformat member - to NULL. - (record_debugformat): New function to record the format. - (end_symtab): Copy format into symtab debugformat member. - (end_symtab): Free subfile debugformat member. - * symmisc.c (free_symtab): Free debugformat when freeing - symtab. - * symfile.c (allocate_symtab): Initialize the new debugformat - member for new symtabs. - * symtab.h (struct symtab): Add debugformat member. - * source.c (source_info): Print the debug format. - - * os9kread.c (os9k_process_one_symbol): Call record_debugformat - with "OS9". - * hpread.c (hpread_expand_symtab): Call record_debugformat - with "HP". - (hpread_process_one_debug_symbol): Ditto. - * dbxread.c (process_one_symbol): Call record_debugformat - with "stabs". - * coffread.c (coff_start_symtab): Call record_debugformat - with "COFF". - * xcoffread.c (read_xcoff_symtab): Call record_debugformat - with "XCOFF". - * dwarfread.c (read_file_scope): Call record_debugformat - with "DWARF 1". - * dwarf2read.c (read_file_scope): Call record_debugformat - with "DWARF 2". - * dstread.c (dst_end_symtab): Set debugformat to be - "Apollo DST". - * mdebugread.c (new_symtab): Set debugformat to be "ECOFF". - -Fri Jun 27 21:05:45 1997 Michael Snyder (msnyder@cleaver.cygnus.com) - - * mips-tdep.c (mips_push_arguments): handle alignment of - integer and struct args on stack for mips64 big-endian. - -Fri Jun 27 19:19:12 1997 Michael Snyder (msnyder@cleaver.cygnus.com) - - * config/mips/tm-mips.h (USE_STRUCT_CONVENTION): MIPS_EABI returns - structs in a register wherever possible. - * mips-tdep.c (mips_extract_return_value): handle structs. - (mips_store_return_value): handle values smaller than MIPS_REGSIZE - (including structs, if gdb ever allows it). - -Fri Jun 20 17:58:34 1997 Fred Fish <fnf@cygnus.com> - - * sh-tdep.c (sh_skip_prologue): Also recognize fmov insns. - (sh_frame_find_saved_regs): Recognize fmov insns and adjust - stack push count accordingly. - * sh-tdep.c (IS_FMOV, FPSCR_SZ): New defines - -Thu Jun 19 08:18:48 1997 Mark Alexander <marka@cygnus.com> - - * utils.c (floatformat_from_doublest): Improve test for infinity. - -Wed Jun 18 13:47:52 1997 Fred Fish <fnf@cygnus.com> - - * dwarfread.c (isreg, optimized_out, offreg, basereg): Move - global variables into the struct dieinfo structure. - (locval): Pass pointer to a dieinfo struct rather than a - pointer to the raw location information. Change prototype. - Set isreg, optimized_out, offreg and basereg as appropriate. - (struct_type): Call locval with dieinfo struct pointer. - (new_symbol): Ditto. - (new_symbol): Call locval and save location before testing - the values of the new dieinfo struct flags, set by locval. - -Tue Jun 17 13:30:12 1997 Peter Schauer (pes@regent.e-technik.tu-muenchen.de) - - * procfs.c (proc_set_exec_trap, procfs_init_inferior, procfs_wait, - unconditionally_kill_inferior): Undo Oct 26 1996 and Apr 26 1997 - changes to trace PRFS_STOPTERM and handle PR_DEAD. - These changes tried to work around a problem with an early DU 4.0 - release, but they trigger subtle timing dependent kernel bugs - in older OSF/1 releases. - -Tue Jun 17 06:52:47 1997 Fred Fish <fnf@cygnus.com> - - * dwarfread.c (new_symbol): Use SYMBOL_VALUE_ADDRESS, instead of - SYMBOL_VALUE, to set the value of LOC_STATIC symbols. - -Mon Jun 16 18:38:28 1997 Mark Alexander <marka@cygnus.com> - - * infrun.c (wait_for_inferior): Mark registers as invalid when - stepping over an instruction that triggered a watchpoint. - * remote-mips.c: Numerous changes to support hardware breakpoints - and watchpoints on LSI MiniRISC and TinyRISC boards. - * mips-tdep.c: Move MIPS16-related macros to config/mips/tm-mips.h. - (mips_breakpoint_from_pc): Account for different breakpoint - instructions used by PMON and IDT monitor. - * config/mips/tm-embed.h: Enable hardware breakpoints on embedded - MIPS targets. - * config/mips/tm-mips.h: Define breakpoint instructions for - PMON and IDT monitor. Move MIPS16-related macros here from - mips-tdep.c. - -Fri Jun 13 13:44:47 1997 Michael Snyder (msnyder@cleaver.cygnus.com) - - * config/mips/tm-tx39[l].h, tx39[l].mt: change r3900 target to tx39. - -Fri Jun 13 14:14:10 1997 Jeffrey A Law (law@cygnus.com) - - * mn10300-tdep.c (mn10300_analyze_prologue): Fix some comments. - Add missing return statements after finding an "add imm{16,32},sp" - instruction. - (mn10300_frame_chain): Add in size of our register save area to find - our caller's frame if our caller does not have a frame pointer. - -Fri Jun 13 12:55:49 1997 Doug Evans <dje@canuck.cygnus.com> - - * symfile.c (generic_load): Check return code of target_write_memory. - -Fri Jun 13 10:28:09 1997 Fred Fish <fnf@cygnus.com> - - * config/i386/nm-linux.h: Enable prototypes that were #ifdef out. - * config/tm-sysv4.h (in_plt_section): Add prototype. - - * maint.c (maintenance_translate_address): Avoid assignment - inside if, per GNU coding standards. - * symfile.c (simple_read_overlay_table): Avoid assignments inside if, - per GNU coding standards. - - * monitor.c (parse_register_dump): Is really a void function. - Add prototype. - (monitor_read_memory): Remove unused variable "name". - (monitor_read_memory): Remove unused variable "regbuf". - (monitor_open): Remove unused variable "i". - (get_hex_word): Apparently unused, #if away for now. - (from_hex): Ditto. - - * i386v4-nat.c (supply_fpregset): Remove unused variable "regi". - (fill_fpregset): Remove unused variables "regi", "to", "from" and - "registers". - - * remote-e7000.c (ctype.h): Include. - (e7000_insert_breakpoint): #if away unused arg used by unused expr. - * frame.h (generic_get_saved_register): Add prototype. - (enum lval_type): Add partial forward decl. - * dsrec.c (make_srec): Remove unused variable "type_code". - * remote-sim.c (gdbsim_wait): Handle sim_running and sim_polling - cases by just ignoring them. - (command.h): Include. - - * java-exp.y (parse_number): Remove unused variable "unsigned_p". - * java-lang.c (gdbcore.h): Include for prototypes. - (type_from_class): Remove unused variable "ftype". - (type_from_class): Remove unused variable "name_length". - (evaluate_subexp_java): Add default case to handle remaining - enumerations. - * java-valprint.c (c-lang.h): Include for prototypes. - - * symfile.c (simple_read_overlay_region_table): #if away - unused function. - (simple_free_overlay_region_table): Ditto. - (overlay_is_mapped): Add default case to switch. - (simple_read_overlay_region_table): Ditto. - (simple_read_overlay_region_table): Add prototype. - - * symtab.c (fixup_symbol_section): Remove unused msym variable. - (fixup_psymbol_section): Ditto. - (find_pc_sect_symtab): Make distance a CORE_ADDR. - - * utils.c: Add comment about t_addr being either unsigned long or - unsigned long long. - (paddr): Change formats to match actual types args are cast to. - (preg): Ditto. - (paddr_nz): Ditto. - (preg_nz): Ditto. - - * defs.h (perror_with_name): Is a NORETURN function. - * utils.c (perror_with_name): Is a NORETURN function. - (error): Is NORETURN independently of ANSI_PROTOTYPES. - - * symtab.c (fixup_symbol_section): Remove prototype. - * symtab.h: (fixup_symbol_section): Add prototype. - * m32r-rom.c (report_transfer_performance): Add prototype. - * sparclet-rom.c: Ditto. - * dsrec.c: Ditto. - - * c-exp.y (parse_number): Cast args to float* or double* as - appropriate for conversion format. - * java-exp.y (parse_number): Ditto. - - * Makefile.in (c-exp.tab.c): Remove #line lines that refer - to nonexistant y.tab.c file. - (java-exp.tab.c): Ditto. - (f-exp.tab.c): Ditto. - (m2-exp.tab.c): Ditto. - - * sh-tdep.c (symfile.h): Include. - (gdb_string.h): Include. - (sh_fix_call_dummy): Ifdef away, currently unused. - * config/sh/tm-sh.h (pop_frame): Add prototype. - * config/sh/tm-sh.h (sh_set_processor_type): Add prototype. - -Sat Jun 7 02:34:19 1997 Peter Schauer (pes@regent.e-technik.tu-muenchen.de) - - * eval.c (evaluate_subexp_for_sizeof): Handle dereferencing - of non-pointer values. - - * symtab.c (gdb_mangle_name): Improve mangling of nested types, - their physical names already include the class name. - - * valops.c (value_cast): Handle upcast of a class pointer. - - From Andreas Schwab (schwab@issan.informatik.uni-dortmund.de): - * corelow.c (get_core_registers): Make secname big enough. - -Fri Jun 6 14:43:23 1997 Keith Seitz <keiths@pizza.cygnus.com> - - * config/sh/tm-sh.h: add define for FPSCR_REGNUM - * sh-tdep.c (sh_show_regs): print out all registers for - the current processor - -Fri Jun 6 13:01:55 1997 Andrew Cagney <cagney@b1.cygnus.com> - - * remote-sim.c (gdbsim_kill): Remove call to depreciated function - sim_kill. - -Thu Jun 5 11:39:03 1997 Ian Lance Taylor <ian@cygnus.com> - - Fixes for recent correction to PE format: - * coffread.c (pe_file): New static variable. - (struct find_targ_sec_arg): Change resultp from pointer to int to - pointer to pointer to asection. - (find_targ_sec): Just store the section in args->resultp, not the - section offset value. - (cs_to_section): Compute the section offset value from the - section. - (cs_section_address): New static function. - (coff_symfile_read): Set pe_file. - (read_one_sym): When reading a PE file, adjust the symbol value to - include the section address if the symbol has an appropriate - storage class. - -Tue Jun 3 16:24:46 1997 Michael Snyder (msnyder@cleaver.cygnus.com) - - * configure.tgt: add mipsr3900-elf target - * config/mips/r3900.mt r3900l.mt tm-r3900.h tm-r3900l.h: ditto - -Tue May 27 10:34:11 1997 Michael Snyder <msnyder@cleaver.cygnus.com> - - * dbxread.c: Check malloc's return for null, prevent segv. - -Fri May 23 14:45:02 1997 Bob Manson <manson@charmed.cygnus.com> - - * infcmd.c (jump_command): Don't try to dereference sfn if it's - NULL. - -Fri May 23 13:51:57 1997 Andrew Cagney <cagney@b1.cygnus.com> - - * top.c (init_cmd_lists): Always initialize endianlist. - (init_main): Always define endian commands. - (set_endian_big): Issue warning if endian not selectable. - (set_endian_little): Ditto. - (set_endian_auto): Ditto. - -Thu May 22 11:53:21 1997 Andrew Cagney <cagney@b1.cygnus.com> - - * remote-sim.c (simulator_command): Restrict access to the - simulator to periods when the simulator is open. - -Wed May 21 16:03:25 1997 Michael Snyder <msnyder@cleaver.cygnus.com> - - * procfs.c (init_procinfo): new function, abstracts some code - shared by create_procinfo and do_attach; - (procfs_set_inferior_syscall_traps): new function, abstracts - some code needed by procfs_init_inferior, do_attach, and - procfs_lwp_creation_handler; (procfs_first_available): new - function, find any LWP that's runnable; (procfs_thread_alive): - replace stub function with real implementation; - (procfs_lwp_creation_handler): fix bug starting new child - threads; (info_proc): bug fixes and enhancements for the - "INFO PROCESSES" command; (close_procinfo_file): call new - function "delete_thread" to cleanup GDB's thread database; - (proc_init_failed): add new argument "kill", to control whether - process is killed (so this function can be shared by - create_procinfo and do_attach); (procfs_exit_handler): handle - exit from an attached process, and cleanup procinfo handles - when the process exits; (procfs_resume, procfs_wait): cleanup - after a thread when it exits; (do_attach, do_detach): handle - attached processes with multiple threads; plus some general - improvements in the diagnostic output. - * sol-thread.c (sol_thread_alive): replace stub with real - implementation; (thread_to_lwp, lwp_to_thread): enhance to - handle threads that may have exited; (sol_thread_attach): add - startup setup stuff; (sol_thread_detach): add unpush_target - call; (sol_thread_mourn_inferior): add unpush_target call; - (sol_thread_wait, sol_thread_resume): enhance to deal with - thread exit cleanly; (sol_thread_new_objfile, - sol_thread_pid_to_str): detect unsuccessful startup and - don't crash; plus some general cleanup. - * thread.c (delete_thread): new function, allows targets to - notify gdb when a thread is no longer valid. - * infrun.c (wait_for_inferior): don't try to detect a new - thread on receiving a TARGET_EXITED event. - -Tue May 20 09:32:02 1997 Andrew Cagney <cagney@b1.cygnus.com> - - * remote-sim.c (gdbsim_open): Pass callback struct. - (init_callbacks): Remove call to sim_set_callbacks. - -Thu May 15 07:56:50 1997 Peter Schauer (pes@regent.e-technik.tu-muenchen.de) - - * config/rs6000/tm-rs6000.h (SIG_FRAME_LR_OFFSET): Define. - * rs6000-tdep.c (frameless_function_invocation): Mark frames - with a zero PC as frameless to improve backtraces from core dumps - caused by dereferencing a NULL function pointer. - (frameless_function_invocation, frame_saved_pc, rs6000_frame_chain): - Handle frameless functions interrupted by a signal. - - * sparc-tdep.c (sparc_init_extra_frame_info, sparc_frame_saved_pc): - Handle frameless functions interrupted by a signal. - -Wed May 14 08:58:55 1997 Jeffrey A Law (law@cygnus.com) - - * mn10200-tdep.c (mn10200_analyze_prologue): Update prologue comments - to reflect current reality. Gross attempt at handling out of - line prologues. - - * mn10200-tdep.c (mn10200_skip_prologue): Don't look at the debug - symbols to find the end of the prologue. - * mn10300-tdep.c (mn10300_skip_prologue): Likewise. - -Thu May 8 08:42:47 1997 Andrew Cagney <cagney@b1.cygnus.com> - - * configure.in (AC_TYPE_SIGNAL): Add - * configure: Re-generate. - * remote-sim.c: Signal returns RETSIGTYPE. - -Wed May 7 20:05:07 1997 Andrew Cagney <cagney@b1.cygnus.com> - - * target.h (target_stop): Drop argument so it can be tested for - NULL. - -Sat May 3 20:51:48 1997 Mark Alexander <marka@cygnus.com> - - * utils.c (floatformat_from_doublest): Handle infinity properly. - -Thu May 1 11:44:46 1997 Michael Snyder <msnyder@cleaver.cygnus.com> - - * Finalize merge from Hurd folk. - Mon Oct 30 16:41:04 1995 Miles Bader <miles@gnu.ai.mit.edu> - * thread.c (thread_apply_command, thread_apply_all_command, - thread_command): Make sure TP is alive. - (thread_alive): New function. - Tue Nov 14 14:31:03 1995 Miles Bader <miles@gnu.ai.mit.edu> - * infrun.c (sig_print_info): Deal better with long signal names. - Wed Nov 22 15:23:35 1995 Miles Bader <miles@gnu.ai.mit.edu> - * thread.c (thread_id_to_pid): New function. - Fri Dec 1 13:25:25 1995 Miles Bader <miles@gnu.ai.mit.edu> - * gnu-nat.c: (set_thread_cmd_list, show_thread_cmd_list, - set_thread_default_cmd_list, show_thread_default_cmd_list): - New variables. (set_thread_cmd, show_thread_cmd, - set_thread_default_cmd, show_thread_default_cmd): New functions. - Fri Apr 18 15:20:16 1997 Miles Bader <miles@gnu.ai.mit.edu> - * gnu-nat.c (inf_startup): remove TASK parameter. - (inf_set_task): replace with new function (inf_set_pid). - * gdbthread.h: Add extern decl for thread_cmd_list. - -Thu May 1 02:28:21 1997 Peter Schauer (pes@regent.e-technik.tu-muenchen.de) - - * printcmd.c (disassemble_command): Adjust low function bound - by FUNCTION_START_OFFSET. - -Mon Apr 28 21:25:32 1997 Michael Snyder <msnyder@cleaver.cygnus.com> - - * Makefile.in: Add rule for gnu-nat.o and i386gnu-nat.o (Gnu Hurd) - * config/i386/i386gnu.mh: remove rules for [i386]gnu-nat.o, now - in Makefile.in (as for other targets); add NATDEPFILE corelow.o to - satisfy symbol dependancy in solib.c (core_ops). - * target.[ch] conditionalize Mach-specific signals so that they - won't show up in non-Mach gdb's! - * thread.c: change name of static function "thread_switch" to - "switch_to_thread", to avoid conflict with Mach global symbol; - move thread_cmd_list to global scope so targets can add their - own thread commands. - * infrun.c: sig_print_info: allow for long signal names. - * gnu-nat.[ch]: tidying up comments. - * gnu-nat.c: remove calls to prune_threads and renumber_threads; - gnu_wait must not return -1 when inferior exits; - attach_to_child will modify inferior_pid in a way that allows - fork_inferior to remain unchanged; remove extra arg from - startup_inferior; move Mach thread commands here from thread.c. - -Mon Apr 28 18:21:20 1997 Michael Snyder <msnyder@cleaver.cygnus.com> - - * symtab.c: decode_line_1, replace the assignment to - values.sals[0].pc which I accidentally left out on 4/3/97. - -Mon Apr 28 17:27:40 1997 Michael Snyder <msnyder@cleaver.cygnus.com> - - * c-exp.y: make parse_number reject "123DEADBEEF". - (fix by Bob Manson). - * java-exp.y: Ditto. - * top.c: change "to enable to enable" to "to enable" in a couple - of help strings. - -Mon Apr 28 09:01:59 1997 Mark Alexander <marka@cygnus.com> - - * breakpoint.c (remove_breakpoint): Pass correct type to - target_remove_watchpoint. - * target.h: Improve comment for target_{remove,insert}_breakpoint. - -Sat Apr 26 03:38:02 1997 Peter Schauer (pes@regent.e-technik.tu-muenchen.de) - - * alpha-tdep.c (heuristic_proc_desc): Increase search limit - for return address register, handle `ret' instruction. - - * corelow.c (get_core_registers): Initialize cf. - - * procfs.c: Minor changes to make pre-ANSI compilers happy. - (procfs_notice_signals): Copy traced signal set back to - pi->prrun.pr_trace. - (unconditionally_kill_inferior): If PR_DEAD is defined, - rerun inferior after killing it. - -Fri Apr 25 00:10:18 1997 Jeffrey A Law (law@cygnus.com) - - * config/mn10300/tm-mn10300.h (EXTRACT_STRUCT_VALUE_ADDRESS): The - structure value address is found in $a0 now. - * config/mn10200/tm-mn10200.h (EXTRACT_STRUCT_VALUE_ADDRESS): Likewise. - -Thu Apr 24 13:31:10 1997 Jeffrey A Law (law@cygnus.com) - - * config/mn10300/tm-mn10300.h (STORE_RETURN_VALUE): Pointers are - returned in $a0. - (EXTRACT_RETURN_VALUE): Likewise. - - * mn10300-tdep.c (mn10300_analyze_prologue): Check for a return - insn at "pc", not "fi->pc". - -Wed Apr 23 11:18:45 1997 Jeffrey A Law (law@cygnus.com) - - * config/mn10200/tm-mn10200.h (STORE_RETURN_VALUE): Pointers are - returned in $a0. - (EXTRACT_RETURN_VALUE): Likewise. - -Tue Apr 22 11:58:15 1997 Fred Fish <fnf@cygnus.com> - - * config/arm/tm-arm.h (TARGET_DOUBLE_FORMAT): Define to use - floatformat_ieee_double_littlebyte_bigword for little endian - target byte order. - * utils.c (floatformat_to_doublest): Create local preswapped - copy of input for floatformat_littlebyte_bigword formats. - (get_field, put_field): Treat floatformat_littlebyte_bigword - the same as floatformat_little. - (floatformat_from_doublest): Postswap output words for - the floatformat_littlebyte_bigwords format. - -Tue Apr 22 09:02:10 1997 Stu Grossman (grossman@critters.cygnus.com) - - * config/alpha/alpha-osf3.mh config/i386/{i386gnu linux}.mh - config/mips/{embed embed64 embedl embedl64 vr4300 vr4300el vr5000 - vr5000el}.mt config/powerpc/{aix aix4}.mh config/rs6000/{aix - aix4}.mh config/sh/sh.mt config/sparc/sp64sim.mt: - config/v850/v850.mt: - Remove -lm. That's now handled by configure. - - * Makefile.in (maintainer-clean): Add distclean to dependencies. - Remove duplicate rm's of files. - -Mon Apr 21 09:49:25 1997 Stu Grossman (grossman@critters.cygnus.com) - - * remote-pa.c: Remove. It's broken and no longer necessary. - - Sat Apr 19 11:56:10 1997 Per Bothner <bothner@deneb.cygnus.com> - - * java-exp.y: Combine TRUE and FALSE into BOOLEAN_LITERAL. - (Avoids name clash with broken AIX header files.) - -Sat Apr 19 01:49:37 1997 Peter Schauer (pes@regent.e-technik.tu-muenchen.de) - - * serial.c (serial_log_command): Fix fputs_unfiltered calls. - - * config/powerpc/tm-ppc-aix4.h, config/rs6000/tm-rs6000-aix4.h - (DONT_RELOCATE_SYMFILE_OBJFILE): Removed. - * xcoffsolib.h (struct vmap): Add new members tvma, toffs and dvma, - remove tadj. - * exec.c (bfdsec_to_vmap): Initialize new vmap members, initialize - tstart and dstart with section VMA. - * rs6000-nat.c (vmap_symtab): Relocate relative to the VMA in the - object file. - (vmap_ldinfo, xcoff_relocate_core): Adjust tstart by section offset - of the text section, remove DONT_RELOCATE_SYMFILE_OBJFILE hack. - (vmap_exec): Relocate relative to the VMA in the object file, - relocate .bss section as well. - (xcoff_relocate_core): No longer adjust section addresses by VMA. - * rs6000-tdep.c (find_toc_address): Change type of tocbase - to CORE_ADDR. - * xcoffread.c (secnum_to_bfd_section): New routine to get - BFD section from CS section number. - (scan_xcoff_symtab): Make toc_offset section relative. - - * symtab.c (total_number_of_methods): Avoid core dump if - baseclass type is still undefined. - -Fri Apr 18 17:25:10 1997 Stu Grossman (grossman@critters.cygnus.com) - - * Makefile.in (SUBDIRS): Add mswin so that make cleanup cleans up - that directory. - * defs.h utils.c (error warning): Make message be const. - * main.c (fputs_unfiltered): Only send gdb_stdout and gdb_stderr - to hook. Otherwise send it to fputs. - * monitor.c monitor.h (monitor_get_dev_name): New function. Does - the obvious. - * remote-e7000.c: Remove debugify stuff. Change printf, fprintf - to _filtered forms to make output appear in GUIs. Replace all - uses of SERIAL_READCHAR with readchar, which has better error - checking. - * (e7000_parse_device): Add prototype. - (readchar): Improve doc. Handle random serial errors. - (expect): Disable notice_quit code. It's busted. Remove - serial error handling (it's now handled in readchar). Remove - remote_debug echoing. That's handled in readchar as well. - (e7000_parse_device): Remove serial_flag arg. It's not - necessary. - (e7000_open): Split into two pieces. Second part is - e7000_start_remote, and is error protected. Now, when we connect - to the target, we setup the initial frame and registers so that - the user gets an immediate indication of where the target is. - (gch): Remove debug output. That's handled by readchar. - (e7000_read_inferior_memory): Handle errors better. - (_initialize_remote_e7000): Get rid of `<xxx>' things from - command names. They show up when doing completion and confuse - things horribly. - * ser-e7kpc.c: Get rid of the DLL's since we can access the device - directly from Win32s and Win95. Get rid of debugify crud. - * serial.c: Remove debugify cruft. - * (serial_logchar serial_log_command serial_write serial_readchar - serial_send_break serial_close): Merge common functionality into - serial_logchar. Clean up rest of routines. - * sparclet-rom.c: Disembowel. Leave only download routine. - Download routine now switches to remote target automatically. - * top.c (disconnect): Only define if SIGHUP is defined. Cleans - up MSVC/Win32 problem. - * utils.c (gdb_flush): Don't call hook unless it's for gdb_stdout - or gdb_stderr. - * config/sh/tm-sh.h: Define TARGET_SH for WinGDB. - * config/sparc/tm-sparclet.h: Remove override for prompt. - -Fri Apr 18 13:38:19 1997 Doug Evans <dje@canuck.cygnus.com> - - * remote-sim.c (gdbsim_open): Only pass -E to sim_open if - TARGET_BYTE ORDER_SELECTABLE. - -Fri Apr 18 16:52:41 1997 Andrew Cagney <cagney@b1.cygnus.com> - - * remote-sim.c (init_callbacks): Initialize poll_quit and magic - fields of gdb_callback. - (gdbsim_stop): Add gdbsim_stop to list of supported client - operations. - (gdbsim_wait, gdbsim_resume): Move call to sim_resume into - sim_wait where gdb is in a position to handle a long running - function. - (gdbsim_cntrl_c): New function. Wrap the sim_resume call in a - SIGINT handler. - (gdb_os_poll_quit): New function. Check for a quit pending on the - console. - -Thu Apr 17 14:30:04 1997 Per Bothner <bothner@deneb.cygnus.com> - - * objfiles.c (allocate_objfile): Allow NULL bfd argument. - * defs.h (enum language): Add language_java. - * java-exp.y, java-lang.c, java-lang.h, java-valprint.c: New files. - * Makefile.in: Update for new files. - * symfile.c (deduce_language_from_filename): Recognize .java. - -Thu Apr 17 02:20:23 1997 Doug Evans <dje@canuck.cygnus.com> - - * m32r-stub.c (stash_registers): Rewrite. - (restore_registers): Renamed to restore_and_return. - (cleanup_stash): New function. - (process_exception): New function. - (_catchException*): Rewrite. - - * remote-sim.c (gdbsim_load): Update call to sim_load. - (gdbsim_create_inferior): No longer pass start_address to - sim_create_inferior. - (gdbsim_open): Pass endian indicator as arg. - -Tue Apr 15 15:31:09 1997 Stan Shebs <shebs@andros.cygnus.com> - - * remote.c (get_offsets): Don't use scanf for interpreting - response to qOffsets. - -Tue Apr 15 14:51:04 1997 Ian Lance Taylor <ian@cygnus.com> - - * gdbserver/Makefile.in (INSTALL_XFORM): Remove. - (INSTALL_XFORM1): Remove. - (install-only): Use $(program_transform_name) directly, rather - than using $(INSTALL_XFORM) and $(INSTALL_XFORM1). - (uninstall): Transform name. - -Mon Apr 14 17:06:27 1997 Mark Alexander <marka@cygnus.com> - - * remote-mips.c (mips_load): Ensure that PC gets updated - after a load on LSI target. - -Mon Apr 14 15:54:51 1997 Geoffrey Noer <noer@pizza.cygnus.com> - - * procfs.c (notice_signals): fix typo - -Mon Apr 14 16:25:10 1997 Ian Lance Taylor <ian@cygnus.com> - - * gdbserver/Makefile.in (INSTALL): Change install.sh to - install-sh. - -Mon Apr 14 11:55:27 1997 Geoffrey Noer <noer@pizza.cygnus.com> - - * config/i386/cygwin32.mh: remove -lkernel32 from XM_CLIBS - since gcc automatically includes it - -Thu Apr 10 13:20:53 1997 Geoffrey Noer <noer@cygnus.com> - - * procfs.c: Substantial (but incomplete) changes to support - sysv4.2mp procfs as implemented in UnixWare 2.1. The procinfo - struct now has substructs like struct flt_ctl instead of - just a fltset_t and has a ctl_fd, status_fd, as_fd, and - map_fd instead of a single fd. Non-sysv4.2mp procfs models - still have the structs and multiple fds, but don't use the - entire struct and the four fds all point to the same thing. - We use PROCFS_USE_READ_WRITE to decide whether to talk to - procfs with reads/writes or use ioctl instead. We use - HAVE_MULTIPLE_PROC_FDS to determine whether procfs really has - multiple fds or not. PROC_NAME_FMT is split out into - CTL_PROC_NAME_FMT, AS_PROC_NAME_FMT, MAP_PROC_NAME_FMT, - STATUS_PROC_NAME_FMT. - - (procfs_notice_signals): now a necessary wrapper around - (notice_signals): which are the new guts for noticing signals - (open_proc_file): gets a new flag arg used in sysv4.2mp to - determine whether or not to attempt to open the ctl_fd. - (procfs_read_status): new local function, reads procfs status - (procfs_write_pcwstop): new local function, writes a PCWSTOP - (procfs_write_pckill): new local function, writes a PCKILL - (unconditionally_kill_inferior): remove signo since we now - just call procfs_write_pckill(). - (procfs_xfer_memory): call lseek with SEEK_SET rather than 0 - (proc_iterate_over_mappings): the whole function is ifdefed - on UNIXWARE to keep things readable. - - Expanded the syscall_table to include new potential sysv4.2mp - members. Note that all ifdefs of UNIXWARE should be eliminated - if possible or renamed to describe what's being selected for a - bit better. Sysv4.2mp and IRIX both have SYS_sproc so the - IRIX specific code now also checks it's not UNIXWARE. - - * config/i386/tm-i386v42mp.h: also define HAVE_PSTATUS_T, - HAVE_NO_PRRUN_T, PROCFS_USE_READ_WRITE, and UNIXWARE - * config/mips/nm-irix4.h: set CTL_PROC_NAME_FMT et al to - "/debug/%d" as PROC_NAME_FMT used to be - -Wed Apr 9 11:36:14 1997 Jeffrey A Law (law@cygnus.com) - - * mn10300-tdep.c: Almost completely rewritten based on mn10200 - port. - * config/mn10300/tm-mn10300.h: Likewise. - -Tue Apr 8 10:45:24 1997 Stu Grossman (grossman@critters.cygnus.com) - - * config/pa/{hppabsd.mt hppahpux.mt hppaosf.mt}: Remove - remote-pa.o from TDEPFILES. Nobody uses it, and besides, it's a - lousy out-of-date clone of remote.c. - -Fri Apr 4 08:21:21 1997 Stu Grossman (grossman@critters.cygnus.com) - - * remote.c: Fix problems realized while showering. - * (hexnumlen): Add prototype. Use max, not min. - * (remote_write_bytes remote_read_bytes): Fix max packet size - calculations to properly account for packet overhead. Also handle - (probably rare) case where remote_register_buf_size isn't set. - - * remote.c: Fix doc for `C' and `S' commands to indicate full - address. - * (remote_ops extended_remote_ops remote_desc remote_write_size): - Make static. - * (remote_fetch_registers remote_write_bytes remote_read_bytes): - Record size of response to fetch registers command, use this to - limit size of memory read and write commands. - * (push_remote_target): New function to make it possible to have - another target switch to the remote target. - * target.h: Add prototype for push_remote_target. - * sh-tdep.c (sh_frame_find_saved_regs): Fix sign extension bugs - for hosts which default to unsigned chars (such as SGI's). - * (_initialize_sh_tdep): Don't set remote_write_size. It's now - handled automatically in remote.c. - -Thu Apr 3 15:10:30 1997 Michael Snyder <msnyder@cleaver.cygnus.com> - - * blockframe.c: blockvector_for_pc_sect(), block_for_pc_sect(), - find_pc_sect_function(), find_pc_sect_partial_function(): new - functions for debugging overlays; pc without section is ambiguous. - * breakpoint.[ch]: add section pointer to breakpoint struct; - add section argument to check_duplicates(); check section as well - as pc in [breakpoint_here_p(), breakpoint_inserted_here_p(), - breakpoint_thread_match(), bpstat_stop_status()]; - add section argument to describe_other_breakpoints(); - use INIT_SAL() macro to zero-out new sal structures; - make resolve_sal_pc() fix up the sal's section as well as its pc; - match on section + pc in clear_command() and delete_breakpoint(); - account for overlay sections in insert_breakpoints(), - remove_breakpoint() and breakpoint_re_set_one(); - all this to support overlays where a PC is not unique. - * exec.c: change xfer_memory() to handle overlay sections. - * findvar.c: change read_var_value() to handle overlay sections. - * frame.h: declaration for block_for_pc_sect() [blockframe.c]. - * infcmd.c: jump_command() warns against jumping into an overlay - that's not in memory. Also use INIT_SAL() to initialize sals. - * infrun.c: wait_for_inferior() sets a flag to invalidate cached - overlay state information; Also use INIT_SAL() to init sals. - * m32r-rom.c: modify load routines to use LMA instead of VMA. - * m32r-stub.c: mask exit value down to 8 bits; screen out any - memory read/writes in the range 600000 to a00000, and ff680000 - to ff800000 (hangs because nothing is mapped there); fix strcpy(). - * maint.c: maintenance command "translate-address" supports overlays. - * minsyms.c: lookup_minimal_symbol_by_pc_sect() supports overlays. - * objfiles.[ch]: add ovly_mapped field to the obj_section struct; - this constitutes gdb's internal overlay mapping table. Add macro - ALL_OBJSECTIONS() to loop thru the obj_structs and look at overlays. - Add function find_pc_sect_section(). - * printcmd.c: modify print_address_symbolic() with overlay smarts; - modify address_info() with overlay smarts; add function sym_info() - to support the INFO SYMBOL command (translate address to symbol(s)); - modify disassemble_command() to work on unmapped overlays. - * source.c: use INIT_SAL() to initialize sals. - * symfile.[ch]: change generic_load() to use section's LMA address - instead of VMA address, for overlay sections. - Add numerous functions for finding a PC's section / overlay, - translating between VMA and LMA address ranges, determining if an - overlay section is mapped, etc. Add several user commands for - overlay debugging. Add support for a "generic" form of automatically - reading overlay mapping info from the inferior (based on the default - (simple) overlay manager which Cygnus provides as an example). - * symtab.[ch]: add functions find_pc_sect_symtab(), - find_pc_sect_psymtab(), find_pc_sect_psymbol(), find_pc_sect_line() - for lookup; modify lookup_symbol and decode_line_1() to use them; - modify find_function_start_sal() to account for overlay sections; - add macro INIT_SAL() for initializing struct symtab_and_line. - * target.c: fix a comment in the declaration of target_ops. - -Thu Apr 3 10:31:12 1997 Mark Alexander <marka@cygnus.com> - - * mips-tdep.c (mips_in_call_stub, mips_in_return_stub, - mips_skip_stub, mips_ignore_helper): New functions for dealing - with MIPS16 call/return thunks. - (mips_init_frame_pc_first): New function to implement - INIT_FRAME_PC_FIRST macro; includes code from old macro plus - new code to skip over MIPS16 thunks. - (mips_frame_chain): Skip over MIPS16 thunks. - * config/mips/tm-mips.h (mips_in_call_stub, mips_in_return_stub, - mips_skip_stub, mips_ignore_helper): Declare. - (IN_SOLIB_CALL_TRAMPOLINE, IN_SOLIB_RETURN_TRAMPOLINE, - SKIP_TRAMPOLINE_CODE, IGNORE_HELPER_CALL): New macros that invoke - the above functions. - (INIT_FRAME_PC_FIRST): Change to invoke mips_init_frame_pc. - (mips_init_frame_pc): Declare. - * infrun.c (wait_for_inferior): Use new IGNORE_HELPER_CALL macro - to decide if certain library function calls should be ignored. - -Wed Apr 2 14:16:51 1997 Doug Evans <dje@canuck.cygnus.com> - - * remote-sim.c (gdbsim_open): Check return code from sim_open. - Update call to sim_open (new arg SIM_OPEN_DEBUG). - -Mon Mar 31 14:55:53 1997 Ian Lance Taylor <ian@cygnus.com> - - * gdbinit.in: New file. - * .gdbinit: Remove. - * configure.in: Generate .gdbinit from gdbinit.in. - * configure: Rebuild. - -Sat Mar 29 13:57:20 1997 Fred Fish <fnf@cygnus.com> - - * COPYING: Install new version of file from FSF. - * copying.c (show_copying_command): Update FSF address. - -Fri Mar 28 18:33:41 1997 Ian Lance Taylor <ian@cygnus.com> - - * Makefile.in (distclean): Remove .gdbinit. - -Fri Mar 28 15:38:04 1997 Mike Meissner <meissner@cygnus.com> - - * remote-sim.c (gdb_os_{,e}vprintf_filtered): Change stdarg type - to va_list from void *, since va_list might not be a pointer - type. - -Thu Mar 27 14:21:46 1997 Mark Alexander <marka@cygnus.com> - - * remote-mips.c: Clean up comment and extraneous semicolon - for mips_monitor_prompt variable. - -Thu Mar 27 12:46:58 1997 Mark Alexander <marka@cygnus.com> - - * remote-mips.c: Add `set monitor-prompt' command. - -Wed Mar 26 06:47:44 1997 Mark Alexander <marka@cygnus.com> - - Fix from Peter Schauer: - * mdebugread.c (parse_procedure): Set address of procedure to - block start; this fixes problems with shared libraries introduced - by change of Mar 21. - -Mon Mar 24 19:43:16 1997 Geoffrey Noer <noer@cygnus.com> - - * symtab.c (find_pc_symtab): change to support the case - where the objfile is reordered and contains both coff and - stabs debugging info (continue on if a psymtab isn't found). - -Sun Mar 23 16:19:20 1997 Mark Alexander <marka@cygnus.com> - - Fixes from Peter Schauer: - * config/mips/tm-mips.h (REGISTER_CONVERT_TO_TYPE, - REGISTER_CONVERT_FROM_TYPE): Swap words if target, not host, - is big-endian and if registers are 32 bits. - * mips-tdep.c (mips_print_register, mips_extract_return_value, - mips_store_return_value): Fix floating-point word-order problems on - little-endian targets introduced by changes of Mar 21. - -Sun Mar 23 15:43:27 1997 Stan Shebs <shebs@andros.cygnus.com> - - * remote.c (target_resume_hook, target_wait_loop_hook): New - globals. - (remote_resume, remote_wait): Use them. - * d10v-tdep.c: Set the above hooks. - (tracesource): New GDB variable, controls source display in - traces. - (display_trace): Find and display source line if requested. - (trace_info): Mention empty trace buffer if appropriate. - (tdisassemble_command): Robustify argument handling. - - * configure.host: Remove extra bogus Linux case. - -Sat Mar 22 16:41:35 1997 Fred Fish <fnf@cygnus.com> - - * remote-sim.c (simulator_command): Add comment about dealing with - NULL or empty args. - -Sat Mar 22 02:48:11 1997 Peter Schauer (pes@regent.e-technik.tu-muenchen.de) - - * c-exp.y (yylex): Handle nested template parameter lists. - * symtab.c (decode_line_2): Fix test for valid choice number. - -Fri Mar 21 19:10:05 1997 Mark Alexander <marka@cygnus.com> - - * mips-tdep.c (mips_push_arguments): On non-EABI architectures, - copy first two floating point arguments to general registers, so that - MIPS16 functions will receive the arguments correctly. - (mips_print_register): Print double registers correctly on - little-endian hosts. - (mips_extract_return_value): Return double values correctly - on little-endian hosts. - - * mdebugread.c (parse_procedure): Adjust address of procedure relative - to address in file descriptor record; this accounts for constant - strings that may precede functions in the text section. Remove - now-useless lowest_pdr_addr from argument list and all calls. - -Fri Mar 21 15:36:25 1997 Michael Meissner <meissner@cygnus.com> - - * configure.tgt (powerpc*-{eabi,linux,sysv,elf}*): Determine - whether the simulator will be built by whether the Makefile in the - simulator directory was built. - - * configure.in (--enable-sim-powerpc): Delete switch. - * configure: Regenerate. - -Thu Mar 20 20:52:04 1997 Jeffrey A Law (law@cygnus.com) - - * mn10200-tdep.c (mn10200_analyze_prologue): Look for save of "a1" - in the prologue too. - - * remote-sim.c (gdb_os_vprintf_filtered): Fix to work with non-ANSI - compilers. - (gdb_os_evprintf_filtered): Similarly. - -Wed Mar 19 16:13:22 1997 Geoffrey Noer <noer@pizza.cygnus.com> - - New UnixWare 2.1 configuration - * config/i386/i386v42mp.mt: new - * config/i386/i386v42mp.mh: new - * config/i386/tm-i386v42mp.h: new - * config/i386/nm-i386v42mp.h: new - * configure.tgt: added new entries - * configure.host: added new entries - -Mon Mar 17 17:52:00 1997 J.T. Conklin <jtc@cygnus.com> - - * dsrec.c (load_srec): Print leading zeroes when printing section - addresses. - -Mon Mar 17 15:00:16 1997 Andrew Cagney <cagney@kremvax.cygnus.com> - - * remote-sim.h: Delete - moved to ../include/remote-sim.h. - - * Makefile.in (remote_utils_h): Update path to remote-sim.h. - -Fri Mar 7 20:55:28 1997 Andrew Cagney <cagney@kremvax.cygnus.com> - - * remote-sim.c (flush_stdout, write_stderr, flush_stderr, - vprintf_filtered, evprintf_filtered): Callbacks that accept - varargs. - -Sat Mar 15 00:50:46 1997 Peter Schauer (pes@regent.e-technik.tu-muenchen.de) - - * breakpoint.c (insert_breakpoints, watchpoint_check, - bpstat_stop_status): Do not disable watchpoints going out of scope. - (insert_breakpoints): Make sure that the current frame is valid - before calling find_frame_addr_in_frame_chain. - - * top.c (setup_user_args): Handle quotes and backslashes. - (print_gdb_version): Update copyright year. - -Fri Mar 14 15:44:03 1997 Ian Lance Taylor <ian@cygnus.com> - - * Makefile.in (elfread.o): Depend upon elf-bfd.h and elf/mips.h. - -Thu Mar 13 22:51:00 1997 Dawn Perchik <dawn@cygnus.com> - - * utils.c (pollquit, notice_quit): If _WIN32, limit test for - cntl-C to wingdb. - (initialize_utils): If _WIN32, don't call ScreenRows and ScreenCols - except under wingdb. (Contributed by Martin Hunt). - -Thu Mar 13 12:40:49 1997 Tom Tromey <tromey@cygnus.com> - - * configure: Regenerated. - * configure.in: Run AC_CONFIG_AUX_DIR before AC_CANONICAL_SYSTEM. - -Thu Mar 13 11:00:22 1997 Doug Evans <dje@canuck.cygnus.com> - - * remote-sim.h (sim_state, SIM_DESC): New types. - (sim_open): Return a `descriptor' as result. - (*): New argument of descriptor result from sim_open. - * remote-sim.c (gdbsim_desc): Renamed from gdbsim_open_p. - (gdbsim_open): Record result of sim_open in gdbsim_desc. - Pass argv list to sim_open, argv[0] = pseudo program name. - (*): Pass gdbsim_desc to sim_foo fns. - -Wed Mar 12 14:40:06 1997 Tom Tromey <tromey@cygnus.com> - - * config.in: Regenerated. - - * acconfig.h (START_INFERIOR_TRAPS_EXPECTED, sys_quotactl, - HAVE_HPUX_THREAD_SUPPORT): Define. - -Tue Mar 11 07:25:27 1997 Mark Alexander <marka@cygnus.com> - - First cut at supporting simulators in gdbserver: - - * configure, configure.in: Allow gdbserver to be configured - for cross-target environments. - * gdbserver/Makefile.in: Add simulator support. - * gdbserver/configure.in: Eliminate assumption that host == target. - Simplify using gdb/configure.tgt and gdb/configure.host. - Fix other minor configuration errors. - * gdbserver/low-sparc.c: Fix compile error. - * gdbserver/remote-utils.c: Eliminate assumption that registers - and addresses are four bytes. Fix minor compile errors and warnings. - * gdbserver/server.c: Rewrite numerous instances of identical code - for starting inferior processes to call new function start_inferior. - Eliminate assumption that registers and addresses are four bytes. - * gdbserver/server.h: Add missing prototypes to eliminate compiler - warnings. - * gdbserver/low-sim.c: New file to mate gdbserver with simulators. - * config/mips/vr5000.mt: Add Vr5000 simulator support to gdbserver. - * config/i386/linux.mh: Eliminate gdbserver support as a first step - in moving such support from host to target makefile fragments. - * config/i386/linux.mt: Move gdbserver support here from linux.mh. - -Mon Mar 10 12:27:47 1997 Michael Snyder <msnyder@cleaver.cygnus.com> - - * symtab.h (INIT_SAL): New macro to initialize symtab_and_line, - to insure consistant initialization of unused fields to zero. - * symtab.c: replace initializations of sals with new macro INIT_SAL. - * breakpoint.c: ditto. - * infrun.c: ditto. - * infcmd.c: ditto. - * source.c: add call to INIT_SAL macro. - -Sat Mar 8 00:16:37 1997 Peter Schauer (pes@regent.e-technik.tu-muenchen.de) - - * sparc-tdep.c (isbranch): Always handle v9 branch instructions, - they might get used on 32 bit targets as well. - -Wed Mar 5 19:34:09 1997 Bob Manson <manson@charmed.cygnus.com> - - * remote-mips.c (mips_exit_debug): Some IDT boards don't - send the full exit string. - -Wed Mar 5 12:59:27 1997 Jeffrey A Law (law@cygnus.com) - - * mn10200-tdep.c (mn10200_push_arguments): Handle new calling - conventions. - (mn10200_store_struct_return): Likewise. - -Tue Mar 4 10:31:02 1997 Mark Alexander <marka@cygnus.com> - - * mips-tdep.c (mips_fetch_instruction): New function; replace - common code throughout with calls to it. - (mips_find_saved_regs): Examine MIPS16 entry instruction to determine - correct saved addresses of $s0 and $s1. - (mips_find_saved_regs, mips16_heuristic_proc_desc): Use MIPS_REGSIZE - instead of hardcoded 4. - (mips16_skip_prologue): Handle extended instructions correctly. - -Mon Mar 3 12:29:20 1997 Doug Evans <dje@canuck.cygnus.com> - - * defs.h (LONGEST): Move #ifndef LONGEST to outside. - Try BFD_HOST_64_BIT if ! CC_HAS_LONG_LONG. - -Thu Feb 27 18:54:11 1997 Mark Alexander <marka@cygnus.com> - - * mips-tdep.c (IS_MIPS16_ADDR, MAKE_MIPS16_ADDR, UNMAKE_MIPS16_ADDR): - New macros for testing, setting, and clearing bit 0 of addresses. - Change numerous bits of code where bit 0 was being manipulated - to use these macros. - -Thu Feb 27 14:12:41 1997 Mark Alexander <marka@cygnus.com> - - * remote-mips.c: Put back the form feeds. - -Thu Feb 27 12:04:24 1997 Mark Alexander <marka@cygnus.com> - - * remote-mips.c: Remove form feeds (^L) from source. - (mips_initialize): LSI PMON doesn't support 'set regsize' command. - (pmon_wait): Don't need to exit and re-enter debug mode on LSI - PMON after a continue; it causes target program misbehavior. - (mips_fetch_register): Don't fetch unsupported registers; this - cuts down on wasted serial traffic. - -Thu Feb 27 09:38:16 1997 Stu Grossman (grossman@critters.cygnus.com) - - * configure.in configure (HPUX/OSF thread support): Enable this - only when running GCC, since HP's thread header files use ANSI C - which is not supported by their default compiler. - - * configure.host (i[3456]86-*-windows): Disable long long - support for WinGDB. Add mswin to configdirs. - * configure.in configure: Move calls to configure.host and - configure.tgt to the top of configure.in to allow them to set - config variables before they are referenced. - -Tue Feb 25 20:21:52 1997 Stan Shebs <shebs@andros.cygnus.com> - - * configure.tgt (mips*-*-lnews*): New target. - -Mon Feb 24 16:35:00 1997 Jeffrey A Law (law@cygnus.com) - - * mn10200-tdep.c (mn10200_analyze_prologue): Don't fix fi->frame - if we're not the innermost frame. Fix minor typos. - -Sat Feb 22 03:39:50 1997 Peter Schauer (pes@regent.e-technik.tu-muenchen.de) - - * stabsread.c (read_type): Fix handling of template names - with template parameters containing `::'. - - * valops.c (search_struct_field, search_struct_method): - Pass correct valaddr parameter to baseclass_offset. - Prevent gdb crashes by making sure that the virtual base pointer - from an user object still points to accessible memory. - -Tue Feb 18 13:36:34 1997 Mark Alexander <marka@cygnus.com> - - * maint.c: Eliminate -Wall warnings by including some header files. - -Tue Feb 18 13:06:30 1997 Mark Alexander <marka@cygnus.com> - - * remote-sim.c (init_callbacks): Undo previous change. - -Tue Feb 18 11:13:00 1997 Dawn Perchik <dawn@cygnus.com> - - * maint.c: Fix dereference of pointer. - * remote-sim.c: Fix reference of structure member "last_error". - * debugify.c: Include config.h to get ANSI definitions. - -Sat Feb 15 17:43:46 1997 Stu Grossman (grossman@critters.cygnus.com) - - * remote-vx.c (vx_attach): Remove code added by kung. It made no - sense. - -Fri Feb 14 13:00:07 1997 Ian Lance Taylor <ian@cygnus.com> - - * main.c (print_gdb_help): Make static to match declaration. - -Thu Feb 13 18:18:18 1997 Dawn Perchik <dawn@cygnus.com> - - * remote-e7000.c, ser-e7kpc.c, serial.c: Remove // comments. - -Wed Feb 12 15:58:00 1997 Dawn Perchik <dawn@cygnus.com> - - * debugify.c, debugify.h: Make safe for non-ansi compilers. - -Wed Feb 12 15:30:00 1997 Dawn Perchik <dawn@cygnus.com> - - * defs.h: Fix prototypes for new cleanup functions. - -Wed Feb 12 15:08:47 1997 Dawn Perchik <dawn@cygnus.com> - - * debugify.c, debugify.h: Fix for general gnu use. Remove C++ - comment, add PARAMS, add license info and fix indentation. - -Wed Feb 12 14:42:47 1997 Dawn Perchik <dawn@cygnus.com> - - * debugify.c, debugify.h: New files. Provide common macros - for writing debug info to a log file or stdio. - -Wed Feb 12 02:44:39 1997 Dawn Perchik <dawn@cygnus.com> - - * c-valprint.c (c_val_print): Fix printing for arrays defined - with 0 length. - -Tue Feb 11 22:24:39 1997 Dawn Perchik <dawn@cygnus.com> - - * defs.h: Fix cntl-C to read from the Windows message queue. - Add prototypes for make_final_cleanup (and the other cleanup - routines. - * remote-e7000.c: Fix sync code to timeout if unable to sync. - Change sync code to report status while trying to sync-up - with hardware. Add debugging output and document. - * ser-e7kpc.c: Swap order of len & offset to match implementation. - Add debugging output and document. - * serial.c: Add debugging output. - * top.c: Add call to do_final_cleanups. - Remove conditionals preventing Win32 from getting SIGQUIT. - * utils.c: (*_cleanup): Modify cleanup routines to accept a cleanup - chain as a parameter. Extract this generic code from the cleanup - routines into separate funtions (*_my_cleanup). Keep old - functionality by passing "cleanup_chain" to the new funtions. - Define the cleanup chain "final_cleanup_chain" to be a cleanup - chain which will be executed only when gdb exits. Add functions - (*_final_cleanup) to match the original (*_cleanup) functions. - (pollquit, quit, notice_quit): Fix to read cntl-C from the - Windows message queue. - -Tue Feb 11 15:36:31 1997 Doug Evans <dje@canuck.cygnus.com> - - * m32r-rom.c: #include <sys/types.h>. - #ifdef out new load support if wingdb. - * m32r/tm-m32r.h (TARGET_M32R): Define, for wingdb. - -Tue Feb 11 12:28:09 1997 Jeffrey A Law (law@cygnus.com) - - - * config/mn10200/tm-mn10200.h (STORE_STRUCT_RETURN): Fix. - * mn10200-tdep.c (mn10200_store_struct_return): New function. - - * config/mn10200/tm-mn10200.h (EXTRACT_RETURN_VALUE): Fix case when - extracting a return value from a register pair. - - * mn10200-tdep.c (mn10200_push_arguments): Stack only needs to - be two byte aligned. Round argument sizes up to two byte boundary. - Write out args in two byte hunks. - (mn10200_push_return_address): Implement. - * config/mn10200/tm-mn10200.h (EXTRACT_RETURN_VALUE): Abort for - structures > 8 bytes (temporary). - (STORE_RETURN_VALUE): Likewise. - (CALL_DUMMY): No longer undefine. - (USE_STRUCT_CONVENTION): Use for args > 8 bytes. - (REG_STRUCT_HAS_ADDR): Define. - -Mon Feb 10 18:35:55 1997 Mark Alexander <marka@cygnus.com> - - * mips-tdep.c (non_heuristic_proc_desc): New function. - (find_proc_desc): Move non-heuristic proc search code into separate - function. - (gdb_print_insn_mips): Use non-heuristic method to find procedure - descriptor, to avoid prologue examination when disassembling. - * remote-mips.c: Add support for new "lsi" target (LSI MiniRISC - aka MicroMeteor board). - (mips_exit_debug): Prevent protocol reinitialization if an error - occurs while exiting debug mode. - -Mon Feb 10 16:11:57 1997 Jeffrey A Law (law@cygnus.com) - - * mn10200-tdep.c: Remove lots of debugging printfs, update/improve - comments, formatting, etc. Plus other minor fixes for problems - I found during my first pass over the mn10200 port. - (mn10200_analyze_prologue): New function. - (mn10200_frame_chain, mn10200_init_extra_frame_info): Use it. - * config/mn10200/tm-mn10200.h: Lots of updates/improvements to - comments, formatting, etc. Minor fixes for problems I found during - my first pass over the mn10200 port. - (TARGET_*_BIT): Define appropriately for ints, long longs, doubles and - pointers. - (REGISTER_VIRTUAL_TYPE): Define as a long. - (EXTRACT_RETURN_VALUE): Rework to deal with long ints living - in register pairs. - (STORE_RETURN_VALUE): Similarly. - - * blockframe.c (generic_get_saved_regs): Remove unused variable - "addr". - * breakpoint.c (frame_in_dummy): Move struct breakpoint *b decl - inside #ifdef CALL_DUMMY. - (watch_command_1): Initialize target_resources_ok. - * command.c (do_setshow_command): Provide dummy initialization - for "match". - * valops.c (find_function_addr): Move function & prototype inside - #ifdef CALL_DUMMY. - (value_arg_coerce): Similarly. - (value_of_variable): Provide dummy initialization of "frame". - -Mon Feb 10 07:54:26 1997 Fred Fish <fnf@cygnus.com> - - * xcoffread.c (RECORD_MINIMAL_SYMBOL): Add NULL asection* parameter - to prim_record_minimal_symbol_and_info call that was missed in Jan 3 - change. - (scan_xcoff_symtab): Ditto. - -Sun Feb 09 09:23:26 1997 Mark Alexander <marka@cygnus.com> - - * remote-mips.c (common_breakpoint): Prevent 64-bit addresses - from being sent to 32-bit targets by masking off upper bits. - * mips-tdep.c (heuristic_proc_start): Mask off upper 32 bits - of PC on 32-bit targets. - (mips16_heuristic_proc_desc): Recognize 'addiu s1,sp,n' as a - frame setup instruction. - (mips32_heuristic_proc_desc): Fix warning found by gcc -Wall. - (mips16_skip_prologue): Recognize 'addiu s1,sp,n' as a valid - prologue instruction. Fix warnings and bugs found by gcc -Wall. - * buildsym.c (finish_block): Improve handling of overlapping blocks; - fixes problem on MIPS16 printing function arguments. - -Sat Feb 8 01:14:43 1997 Peter Schauer (pes@regent.e-technik.tu-muenchen.de) - - * dwarf2read.c (dwarf2_linkage_name): New function to get - the linkage name of a die from DW_AT_MIPS_linkage_name or - DW_AT_name. - (read_func_scope, dwarf2_add_field, dwarf2_add_member_fn, - new_symbol): Use it instead of accessing DW_AT_name. - (read_partial_die): Use DW_AT_MIPS_linkage name as name of the - partial die if present. - (dwarf2_add_member_fn): Make a copy of physname on the type obstack. - -Fri Feb 7 10:06:22 1997 Jeffrey A Law (law@cygnus.com) - - * blockframe.c (generic_frame_chain_valid): If the new frame - is not INNER_THAN the old frame, then it's not valid. - -Tue Feb 04 09:04:37 1997 Mark Alexander <marka@cygnus.com> - - * mips-tdep.c (mips16_get_imm): Fix calculation of extended immediate. - (mips16_heuristic_proc_desc): Recognize jal(x) instruction. - -Mon Feb 03 17:57:58 1997 Mark Alexander <marka@cygnus.com> - - * mips-tdep.c (mips16_decode_reg_save): Distinguish between - sd and sw instructions correctly. - (heuristic_proc_start): Add support for MIPS16. - (mips16_get_imm, mips16_heuristic_proc_desc, - mips32_heuristic_proc_desc): New helper functions for - heuristic_proc_desc. - (heuristic_proc_desc): Rewrite and reorganize to support MIPS16. - (mips_push_arguments): Don't align small arguments in EABI. - (mips32_skip_prologue): Attempt to shrink code size a little. - -Mon Feb 3 11:06:05 1997 Michael Snyder <msnyder@cleaver.cygnus.com> - - * m32r-stub.c: New -- remote protocol support for M32R cpu. - * m32r-rom.c: Several experiments with improved download time. - -Fri Jan 31 08:26:39 1997 Mark Alexander <marka@cygnus.com> - - * mips-tdep.c (MIPS16_INSTLEN): Define. - (mips_find_saved_regs): Replace hardcoded 2's with MIPS16_INSTLEN. - (heuristic_proc_start): Recognize 'entry' pseudo-op as a start - of function on MIPS16. - (mips32_skip_prologue, mips16_skip_prologue): New helper functions - for mips_skip_prologue. - (mips_skip_prologue): Recognize both 16- and 32-bit prologues. - -Wed Jan 29 12:45:54 1997 Michael Meissner <meissner@tiktok.cygnus.com> - - * config/powerpc/ppc{,le}-sim.mt (SIM): Remove the library - ../sim/common/libcommon.a. - -Tue Jan 28 15:54:13 1997 Michael Snyder <msnyder@cleaver.cygnus.com> - - * blockframe.c: fix a null pointer ref in generic_get_saved_register - -Tue Jan 28 15:39:50 1997 Geoffrey Noer <noer@cygnus.com> - - * mn10200-tdep.c (mn10200_frame_chain): Get basic backtracing - working. - -Mon Jan 27 14:31:52 1997 Mark Alexander <marka@cygnus.com> - -First set of changes for mips16: - * config/mips/tm-mips.h (MIPS16_BIG_BREAKPOINT, - MIPS16_LITTLE_BREAKPOINT, BREAKPOINT_FROM_PC): Define. - (ABOUT_TO_RETURN): Call new function mips_about_to_return. - (mips_breakpoint_from_pc, mips_about_to_return): Declare. - * mem-break.c (memory_breakpoint_from_pc): New function. - (memory_insert_breakpoint, memory_remove_breakpoint): Use - memory_breakpoint_from_pc to determine breakpoint contents and size. - * target.h (memory_breakpoint_from_pc): Declare. - * monitor.c (monitor_insert_breakpoint): Use memory_breakpoint_from_pc - to determine size of breakpoint instruction. - * mips-tdep.c (mips32_decode_reg_save, mips16_decode_reg_save): - New helper functions for mips_find_saved_regs. - (mips_find_saved_regs): Recognize mips16 prologues. - (mips_addr_bits_remove): Strip off upper 32 bits of address - when target CPU is 32 bits but CORE_ADDR is 64 bits. - (mips_step_skips_delay): No branch delay slot on mips16. - (gdb_print_insn_mips): Disassemble mips16 code. - (mips_breakpoint_from_pc, mips_about_to_return): New functions. - -Mon Jan 27 10:34:03 1997 Jeffrey A Law (law@cygnus.com) - - * tm-mn10200.h (NUM_REGS): Decrease to 12. - (REGISTER_NAMES): Elimination registers not found on the mn10200. - (PC_REGNUM, MDR_REGNUM, PSW_REGNUM): Corresponding changes. - (LIR_REGNUM, LAR_REGNUM): Delete. They don't exist on the mn10200. - -Sat Jan 25 00:07:59 1997 Peter Schauer (pes@regent.e-technik.tu-muenchen.de) - - * dwarf2read.c: Replace integral tag, name and form fields in - internal structure definitions with the corresponding enumeration - types from dwarf2.h. Add default cases to switches on enumerations - where appropriate. - Make quoting of string arguments in complaint messages consistent. - Check for NULL returns from DW_STRING. - (struct partial_die_info): Add sibling and has_type fields, remove - unused value field. - (DW_*): Move access macro definitions near the definition of the - attribute structure. - (struct field_info): New structure to pass information about fields - and member functions between die processing routines. - (dwarf2_build_psymtabs_hard): Set cu_header_offset. - (scan_partial_symbols): Do not enter DW_TAG_subprogram dies into - the partial symbol table if the DW_AT_*_pc attributes are missing. - Add file scope base type definitions to the partial symbol table. - Skip over child dies if the die has a sibling attribute. - (add_partial_symbol): Enter global variables with type attributes - and without location descriptors into the partial symbol table. - Store value of DW_TAG_variable dies in the partial symbol table. - Do not enter global variables into the minimal symbol table. - Add base type definitions to the partial symbol table. - (psymtab_to_symtab_1): Use dwarf2_get_pc_bounds to determine highpc. - (process_die): Move check for DW_AT_low_pc to read_func_scope. - Add a typedef symbol for base type definitions to the symbol table. - Ignore DW_TAG_inlined_subroutine tags for now. - (read_file_scope): Use dwarf2_get_pc_bounds to determine pc bounds. - (read_func_scope, read_lexical_block_scope): Use dwarf2_get_pc_bounds - to determine pc bounds, ignore dies with invalid bounds. - (dwarf2_get_pc_bounds): New routine to extract and validate the - DW_AT_*_pc attributes of a die. - (dwarf2_add_field, dwarf2_attach_fields_to_type, skip_member_fn_name, - dwarf2_add_member_fn, dwarf2_attach_fn_fields_to_type): - New functions to handle fields and member functions. - (read_structure_scope): Rewritten to use them. - (read_array_type): Renamed from dwarf_read_array_type. - Default upper array bound to describe an array with unspecified - length. - Create array types in backwards order, as dwarf2 puts out the array - dimensions from left to right. - (read_subroutine_type): Handle DW_TAG_unspecified_parameters, - DW_AT_artificial and DW_AT_prototyped. - (read_base_type): Make an unsigned type for DW_ATE_boolean. - Pass objfile to dwarf_base_type. - (read_partial_die): Use read_attribute to read in the attributes. - Handle DW_AT_sibling and DW_AT_type. - Follow references when determining DW_AT_name and DW_AT_external - attributes of the die. - Validate DW_AT_*_pc attributes. - (read_full_die): Use read_attribute to read in the attributes. - (read_attribute): New function to read an attribute described - by an abbreviated attribute. - (new_symbol): Relocate symbol value for DW_TAG_label with baseaddr. - Do not set SYMBOL_VALUE_ADDRESS for DW_TAG_subprogram, - SYMBOL_BLOCK_VALUE for the symbol will be set later by finish_block. - Change symbol class for global variables with a zero valued location - descriptor to LOC_UNRESOLVED. - Handle DW_AT_const_value attributes for DW_TAG_variable, - DW_TAG_formal_parameter and DW_TAG_enumerator. - Build a typedef symbol for DW_TAG_base_type. - (dwarf2_const_value): New routine to copy a constant value from an - attribute to a symbol. - (dwarf_base_type): Use passed in objfile, not current_objfile - when calling dwarf2_fundamental_type. - (dump_die): Use DW_* accessor macros to access values of attributes. - (decode_locdesc): Handle DW_OP_plus_uconst. - -Wed Jan 22 01:31:16 1997 Geoffrey Noer <noer@cygnus.com> - - * mn10200-tdep.c: New file. - * config/mn10200/tm-mn10200.h: New, REGISTER_SIZE is 24 bits not 32, - SP_REGNUM and FP_REGNUM are different, also no lar or lir. - * config/mn10200/mn10200.mt: New file. - * configure.tgt: add mn10200 entry. - -Tue Jan 21 18:32:23 1997 Stu Grossman (grossman@lisa.cygnus.com) - - * configure.in configure: Check if host has libdl if doing - Solaris threads. - -Tue Jan 21 17:03:26 1997 Geoffrey Noer <noer@cygnus.com> - - * mn10300-tdep.c: Wrote/fixed implementations of - mn10300_frame_chain, mn10300_init_extra_frame_info, - mn10300_frame_saved_pc - * config/mn10300/tm-mn10300.h: Redefine INIT_EXTRA_FRAME_INFO - and INIT_FRAME_PC macros. - -Tue Jan 21 17:01:20 1997 Stu Grossman (grossman@lisa.cygnus.com) - - * configure.in configure: Check if host has libm. Make sure we - are using gcc when using the -export-dynamic option. Fixes a - problem with building under Solaris/SunPro cc. - -Mon Jan 20 13:52:13 1997 Mark Alexander <marka@cygnus.com> - - * config/mips/{embed,embed64,embedl,embedl64}.mt: - Link in simulator on MIPS embedded targets. - -Sat Jan 18 02:31:29 1997 Peter Schauer (pes@regent.e-technik.tu-muenchen.de) - - * blockframe.c (frameless_look_for_prologue): Mark frames - with a zero PC as frameless to improve backtraces from core dumps - caused by dereferencing a NULL function pointer. - -Thu Jan 16 14:10:41 1997 Geoffrey Noer <noer@cygnus.com> - - * config/mn10300/tm-mn10300.h: fix BREAKPOINT definition. - -Tue Jan 14 16:01:06 1997 Geoffrey Noer <noer@cygnus.com> - - * mn10300-tdep.c: made a lot more generic, ripping out code - from copied target (no more mn10300_scan_prologue, - init_extra_frame_info, and mn10300_fix_call_dummy calls) - * config/mn10300/tm-mn10300.h: undefine INIT_EXTRA_FRAME_INFO - and INIT_FRAME_PC macros - -Thu Jan 9 11:44:40 1997 Michael Snyder <msnyder@cleaver.cygnus.com> - - * sparc-tdep.c (sparc_frame_find_saved_regs): Don't use - FP_REGISTER_BYTES to compute offsets into the saved frame, - since it fails for SPARC targets configured without any - FP regs. Instead, use DUMMY_STACK_REG_BUF_SIZE. - -Mon Jan 6 11:15:14 1997 Stu Grossman (grossman@critters.cygnus.com) - - * symtab.c (fixup_symbol_section): Handle NULL symbols without - crashing. - -Fri Jan 3 12:08:16 1997 Stu Grossman (grossman@critters.cygnus.com) - - * Makefile.in configure configure.in: Remove ENABLE_CLIBS, - ENABLE_OBS, and THREAD_DB_OBS. These are consolidated into LIBS - and CONFIG_OBS. - * configure configure.in: Clean up test cases around thread support. - * configure.tgt (v850-*-*): Include v850ice.o and v850.lib if - host is Windows. - * c-valprint.c ch-valprint.c cp-valprint.c eval.c expprint.c - printcmd.c valops.c value.h values.c: Add bfd_section arg to - value_at and value_at_lazy. - * coffread.c dbxread.c elfread.c mdebugread.c minsyms.c symtab.h: - Add bfd_section arg to prim_record_minimal_symbol_and_info. - * corefile.c gdbcore.h printcmd.c valops.c: Use read_memory_section - instead of read_memory. It takes a bfd_section arg. - * coffread.c dbxread.c elfread.c gdb-stabs.h objfiles.h: Remove - unnecessary cast for assignment of struct dbx_symfile_info. - Struct objfile now uses a real pointer instead of PTR for this - element. - * dbxread.c (dbx_symfile_init): Stash bfd section pointers for - text, data and bss into dbx_symfile_info. - * exec.c (xfer_memory): Handle transfers for user-specified - sections. - * findvar.c (read_var_value locate_var_value): Copy bfd section - from the symbol to the value. - * gdb-stabs.h: Add section pointers for text, data and bss - sections. - * maint.c (translate address command): Add test code for overlay - address translation. - * printcmd.c (do_examine do_one_display): Now takes a bfd section - arg. - * (print_formatted x_command): Record current section along with - current address for repeated commands. - * sparc-nat.c (fetch_inferior_registers): Change - target_xfer_memory to target_{read write}_memory to allow changes - to target_xfer_memory interface for section info. - * symmisc.c (dump_msymbols print_symbol): Print section - assocaited with symbol. - * symtab.c (fixup_symbol_section): New routine to - add section info to symbols returned by lookup_symbol. - * symtab.h (struct general_symbol_info): Add bfd section to - symbols. - * target.c target.h (target_xfer_memory): Add bfd section to - args. - * (target_read_memory_section): New routine to read data from a - specific section. - * (target_memory_bfd_section): New global variable to pass bfd - section in to targets. - * valarith.c (value_add value_addr value_array): Preserve bfd - section when computing new value. - * value.h (struct value): Add bfd section to values. - * values.c (allocate_value value_copy): Initialize/preserve bfd - section. - * (unpack_double): Clean up _MSC_VER conditionals to remove - duplicate code. - * v850ice.c: New module to support communication with NEC's - PC-based ICE. - * config/v850/tm-v850.h (REGISTER_NAMES): Replace sp, gp, fp, and - ep names with rxx names. sp and fp are renamed via a different - mechanism. - -Fri Jan 3 14:20:05 1997 Geoffrey Noer <noer@cygnus.com> - - * mn10300-tdep.c (mn10300_push_arguments): rewrote, - also removed code elsewhere that made use of RP_REGNUM. - * config/mn10300/tm-mn10300.h: ripped out RP_REGNUM, V0_REGNUM, - ARG0_REGNUM, ARGLAST_REGNUM (all not appropriate for mn10300 - arch.), redefined SAVED_PC_AFTER_CALL, EXTRACT_RETURN_VALUE, - EXTRACT_STRUCT_VALUE_ADDRESS, STORE_RETURN_VALUE. - -For older changes see ChangeLog-96 - -Local Variables: -mode: indented-text -left-margin: 8 -fill-column: 74 -version-control: never -End: diff --git a/contrib/gdb/gdb/ChangeLog-98 b/contrib/gdb/gdb/ChangeLog-98 deleted file mode 100644 index bd19b49066a51..0000000000000 --- a/contrib/gdb/gdb/ChangeLog-98 +++ /dev/null @@ -1,7122 +0,0 @@ -Thu Dec 31 15:26:13 1998 Stan Shebs <shebs@andros.cygnus.com> - - * corelow.c (core_ops): Don't initialize statically. - (init_core_ops): New function, fills in core_ops. - (_initialize_corelow): Use it. - -Thu Dec 31 16:54:30 1998 David Taylor <taylor@texas.cygnus.com> - - The following changes were made by - Elena Zannoni <ezannoni@kwikemart.cygnus.com> - Edith Epstein <eepstein@sophia.cygnus.com> - David Taylor <taylor@texas.cygnus.com> - - * config/pa/tm-hppa.h (INSTRUCTION_NULLIFIED): Change to read - nullify instruction bit from IPSW only when we are not in a system - call. - (STRCAT_REGISTER, pa_do_strcat_registers_info): Additional - parameter -- precision. - - * Makefile.in (BUILD_TUI): To build the tui, only when configured - with --enable-tui. - (YLWRAP): Use ylwrap to avoid problems on systems w/o bison. - (gdb$(EXEEXT)): Make it dependent on BUILD_TUI. - (all-tui): Remove dependency from phony target. - (c-exp.tab.c): Use ylwrap instead of bison. - (jv-exp.tab.c): Ditto. - (f-exp.tab.c): Ditto. - (m2-exp.tab.c): Ditto. - - * configure.in (ENABLE_CFLAGS): Define and export BUILD_TUI. - - * configure: Regenerated. - - * c-typeprint.c (c_type_print_base): Get to the method name by - skipping over all the namespaces, classes and '::'. - - * infcmd.c (run_command): Only call SOLIB_RESTART if it's - defined. - (detach_command): Ditto. - - * infptrace.c (call_ptrace): Add some debugging code. - - * infrun.c (follow_inferior_fork): Only define on HP. - (wait_for_inferior): Only call SOLIB_IN_DYNAMIC_LINKER if we have - shared libraries; restore test of IN_SOLIB_DYNSYM_RESOLVE_CODE - removed by HP. - - * Makefile.in (ALLDEPFILES): Add somread.c, hp-psymtab-read.c, - hp-symtab-read.c. - (SFILES): Remove the above files - (COMMON_OBS): Remove somread.o - (SFILES): Add the tui files to this, so they get - included in etags tables. - (all-tui): New rule, which does a recursive make in the tui - subdir. - (gdb$(EXEEXT)): Add tui-all to the list of - dependencies, and add tui/libtui.a to the link list. - (tui/libtui.a): When recursing, pass down - ${FLAGS_TO_PASS}. And don't echo the make command. This is - closer to what the other recursions do. - (HFILES_NO_SRCDIR) add hpread.h. - (COMMON_OBS): Add hp-psymtab-read.o, hp-symtab-read.o - Allow the TUI code to be conditionally enabled. - (TUI_TARGET, TUI_LIBRARY): New variables, whose values are set by - the configuration script. They're set to the empty string when - the TUI isn't enabled. - (gdb$(GDBEXT)): Use those, instead of referring to tui-all and - tui/libtui.a directly. - - * Makefile.in: Avoid spurious relinking. - (gdb$(EXEEXT)): Depend on the actual tui library, not on a - fictitious target. Since the fictitious target never existed, make - would always relink. - (tui/libtui.a): Renamed from all-tui. Always recurse to make sure - the library is up to date. - (TUI_TARGET): Variable removed; there's no need for it any more. - - * Makefile.in: Look for tui include files in the tui source dir. - - * Use automake's `aclocal' program to generate aclocal.m4, to allow - us to use automake macros in configure.in with impunity. - - * acconfig.h: Add an entry for the `TUI' symbol. - - * acinclude.m4: New file, containing the code from the old - aclocal.m4. Incorporate (by reference) ../bfd/acinclude.m4, not - ../bfd/aclocal.m4, since we only want bfd's local macros. - - * aclocal.m4: Now automagically generated. Just run aclocal! - - * annotate.c (annotate_catchpoint): New function. - - * annotate.h: Taking the new includes (symtab.h and gdbtypes.h). - not taking the ansic C build fix. - (annotate_catchpoint): Declare. - - * blockframe.c (blockvector_for_pc_sect): Check that the end of - the block is >= to the pc, not just >. - - * breakpoint.c (create_temp_exception_breakpoint): #If it out -- - nothing calls it. - (bpstat_stop_status): Don't call SOLIB_HAVE_LOAD_EVENT if it's not - defined; don't call SOLIB_HAVE_UNLOAD_EVENT if it's not defined. - (bpstat_get_triggered_catchpoints): If we don't have shared - library support, then don't call SOLIB_LOADED_LIBRARY_PATHNAME nor - SOLIB_UNLOADED_LIBRARY_PATHNAME. - (watch_command_1): Don't require a run before a watch command - unless we're on HP [it's an HP OS bug, not a generic limitation] - (catch_load_command_1): Don't define if no shared libraries. - (catch_command_1): Don't claim to support fork catchpoints unless - CHILD_INSERT_FORK_CATCHPOINT is defined, don't claim to support - vfork catchpoints unless CHILD_INSERT_VFORK_CATCHPOINT is defined, - don't clain to support shared library load catchpoints if shared - libraries aren't supported, and don't claim to support exec - catchpoints unless CHILD_INSERT_EXEC_CATCHPOINT is defined - - (bpstat_do_actions): If we just set cmd to NULL, don't then try to - set it to cmd->next as we'll SEGV. - (bpstat_do_actions): Simplify significantly. It's - now almost as simple as before the merge and it no longer has the - HP bug that breakpoint commands are executed repeatedly. - - (break_at_finish_command_1): Rewrite and make sure - selected_frame points to a frame before using it. Fix string - termination error. - (break_at_finish_at_depth_command_1): Ditto. - - (can_use_hw_watchpoints): New static variable. - (read_memory_nobpt): Test for breakpoint type bp_none. - (insert_breakpoints): Test for breakpoint type bp_catch_exec; - insure have a current frame before getting the frame address. - (remove_breakpoints): Check for breakpoints of types bp_none, - bp_catch_fork, bp_catch_vfork, and bp_catch_exec. - (bpstat_stop_status): Fix updates of b->hit_count. - (bpstat_have_active_hw_watchpoints): New function. - (create_exec_event_watchpoint): New function. - (watch_command_1): Use can_use_hw_watchpoints. - (catch_fork_command_1): Change name of function to call from - target_create_catch_(v)fork_hook to create_(v)fork_even_catchpoint. - (delete_breakpoint): Test for already deleted breakpoints; add - support for bp_catch_fork, bp_catch_vfork, and bp_catch_exec - breakpoints. - (_initialize_breakpoint): Add can-use-hw-watchpoints to list of - user settable debugger variables. - - (clear_command): When there is no argument - to the clear command, delete all breakpoints that are hit at - default line. This will include a breakpoint whose line number - does not correspond to the default line, but has been set at - the default address. - - (delete_breakpoint): Don't call bpstat_clear_actions, instead - clear things explicitly; if clearing breakpoint_at, then also - clear any associated actions so that bpstat_do_actions won't try - to execute them. - (_initialize_breakpoint): Fix function name for bx command. - - (tbreak_command): Remove static from declaration. - (maintenance_info_breakpoints): Ditto. - - (reattach_breakpoints): New funct definition, used with with - hardware watchpoints - (breakpoint_1): Change format and add entries to bptypes[] - (maintenance_info_breakpoints): Function is no longer static - - (_initialize_breakpoint): Removed a comment. - (exception_catchpoints_are_fragile, - exception_support_initialized): Define. - (breakpoint_here_p): Fixed syntax error in conditional - (disable_watchpoints_before_interactive_call_start): Fixed call to - check_duplicates. Need a section parameter. - (enable_watchpoints_after_interactive_call_stop): Fixed call to - check_duplicates. Need a section parameter. - (breakpoint_re_set_one): Fixed call to check_duplicates. Need a - section parameter. - (delete_command): Fixed syntax error in conditional - (breakpoint_re_set): Fixed some typos. - - (args_for_catchpoint_enable): New type for handling exceptions. - (current_exception_event): New variable for handling exceptions. - (insert_breakpoints): Check for additional breakpoint types -- - bp_catch_throw, bp_catch_catch, call_disabled. Also, do some - additional work to handle an exception catchpoint. - (remove_breakpoint): There are additional breakpoint types to - check for: Bp_catch_throw, bp_catch_catch, call_disabled. Also do - some additional work to remove the exception catchpoints - (breakpoint_init_inferior): New input parameter. If there are - exception catchpoints delete them. - (breakpoint_here_p): There are additional breakpoint enable - settings to check for: Shlib_disabled, call_disabled - (breakpoint_thread_match): There are additional breakpoint enable - settings to check for: Call_disabled - (ep_is_catchpoint): There are additional breakpoint types to check - for: Bp_catch_throw, bp_catch_catch - (ep_is_exception_catchpoint): New function - (bpstat_find_step_resume_breakpoint): New function - (bpstat_do_actions): Introduce a local copy of the bpstat - structure. - (print_it_normal): There are additional breakpoint types to check - for: Bp_catch_throw, bp_catch_catch Changeing the control - structure a bit (adding else ifs) Add code to print out info about - exceptions. - (bpstat_stop_status): There are additional breakpoint enable - settings to check for: Call_disabled. there are additional - breakpoint types to chack for: Bp_catch_catch and bp_catch_throw. - Check to see if stopped due to an exception. Minor fixes to the - catch_errors calls. Make sure to count all encountered - breakpoints. There was something funky going on previously with - the counting. - (bpstat_what): Add cases for new breakpoint types: - bp_catch_catch, bp_catch_throw. - (bpstat_get_triggered_catchpoints): Check for new breakpoint types - : Bp_catch_catch, bp _catch_throw. - (breakpoint_1): Account for new breakpoint types. - (describe_other_breakpoints): Account for new breakpoint enable - setting (call_disabled) - (check_duplicates): Account for new breakpoint enable setting - (call_disabled) - (disable_breakpoints_in_shlibs): New function - (disable_watchpoints_before_interactive_call_start): New function - (mention): Account for new breakpoint types. - (break_command_1): Some additional checking for a valid PC. - (watch_command_1): Some dditional checking to prevent a watch - before a run command. - (ep_parse_optional_filename): Simplified for loop. - (create_exception_catchpoint): New function - (cover_target_enable_exception_callback): New function - (handle_gnu_4_16_catch_command): This used to be thcatch_command_1 - function.e - (create_temp_exception_breakpoint): New function - (catch_command_1): Differs from gdb 4.16 and gdb 4.17. Is now - calling catch_exception_command_1 using the EX_EVENT_CATCH and - EX_EVENT_THROW values as parameters. - (clear_command): Additional comments - (delete_breakpoint): Handle exceptions. Check for additional - breakpoint enable settings: Shlib_disabled, call_disabled. - (delete_command): Hp folks are claiming that we should not delete - shlib_event breakpoints - (breakpoint_re_set_one): Moved call to check_duplicates. Add new - breakpoint types to switch statement. - (breakpoint_re_set_thread): New function - (enable_command): Account for new breakpoint types. - - (insertion_state_t): New enumerated type. - (remove_breakpoint): New param in funct prototype. - (insert_breakpoints): Check for bp_catch_fork and bp_catch_vfork. - (remove_breakpoints): Changed call to remove_breakpoint. - (detach_breakpoints): New function. - (remove_breakpoint): New parameter, is. Also changed the - way b->inserted is set. - (ep_is_catchpoint): New function. - (ep_is_shlib_catchpoint): New function. - (print_it_normal): Check for bp_catch_load, bp_catch_unload, - bp_catch_fork, bp_catch_vfork, bp_catch_exec. Also new code - to print out catchpoints properly. - (bpstat_stop_status): Check for bp_catch_fork, bp_catch_vfork, - and bp_catch_exec. Also, some code to check for catching a - shared library load/unload. - (bpstat_what): Added catch_shlib_event to class enumeration. - Defined new macro, shlr. Expanded the bpstat_what_main_action - table. Add cases for bp_catch_load, bp_catch_unload, - bp_catch_fork, bp_catch_vfork, and bp_catch_exec. - (bpstat_get_triggered_catchpoints): New function. - (breakpoint_1): Changes to bptypes definition. Also check for - bp_catch_load, bp_catch_unload, bp_catch_fork, bp_catch_vfork, - bp_catch_exec. Similar changes to the switch statement. - (set_raw_breakpoint): Initialize new breakpoint structure fields. - dll_pathname, triggered_dll_pathname, forked_inferior_pid, - exec_pathname. - (create_solib_load_unload_event_breakpoint): New function. - (create_solib_load_event_breakpoint): New function. - (create_solib_unload_event_breakpoint): New function. - (create_fork_vfork_event_catchpoint): New function. - (create_fork_event_catchpoint): New function. - (create_vfork_event_catchpoint): New function. - (mention): New cases for bp_catch_load, bp_catch_unload, - bp_catch_fork, bp_catch_vfork, bp_catch_exec. - (ep_skip_leading_whitespace): New function. - (ep_find_event_name_end): New function. - (ep_parse_optional_if_clause): New function. - (ep_parse_optional_filename): New function. - (catch_fork_kind): New enumerated type. - (catch_fork_command_1): New function. - (catch_exec_command_1): New function. - (catch_load_command_1): New function. - (catch_unload_command_1): New function. - (catch_throw_command_1): New function. - (catch_command_1): Now calls catch_throw_command_1. - (tcatch_command): New function. - (delete_breakpoint): Changed call to remove_breakpoint. - Also free the new fields in the breakpoint structure. - (breakpoint_re_set_one): Handle bp_catch_load, bp_catch_unload, - bp_catch_fork, bp_catch_vfork, bp_catch_exec. - (disable_command): Handle bp_catch_load, bp_catch_unload, - bp_catch_fork, bp_catch_vfork, bp_catch_exec. - (enable_command): Handle bp_catch_load, bp_catch_unload, - bp_catch_fork, bp_catch_vfork, bp_catch_exec. - (_initialize_breakpoint): Alter add_com call for catchpoints, - add add_com call for watchpoints. - - * breakpoint.h (enum bptype): New entries bp_catch_catch, - bp_catch_throw, and bp_none, bp_catch_load, bp_catch_unload, - bp_catch_fork, bp_catch_vfork,bp_catch_exec. Add declarations for - new functions bpstat_have_active_hw_watchpoints and - create_exec_event_catchpoint. - (tbreak_command): Add prototype. - (update_breakpoints_after_exec): Add prototype; update comments. - (reattach_breakpoints): New funct prototype declaration. - (enable): New enumerated value call_disabled. - (bpstat_find_step_resume_breakpoint): New funct decl. - (inf_context): New enumerated type. - (breakpoint_re_set_thread): New funct decl. - (breakpoint_init_inferior): New parameter. - (disable_watchpoints_before_interactive_call_start): New funct decl. - (enable_watchpoints_after_interactive_call_stop): New funct decl. - (disable_breakpoints_in_shlibs): New funct decl. - (struct breakpoint): New fields, dll_pathname,triggered_dll_pathname, - forked_inferior_pid,exec_pathname BPSTAT_WHAT_CHECK_SHLIBS_RESUME_FROM_HOOK. - (bpstat_get_triggered_catchpoints): New function. - (detach_breakpoints): New function. - (create_solib_load_event_breakpoint): New function. - (create_solib_unload_event_breakpoint) New function. - (create_fork_event_catchpoint): New function. - (create_vfork_event_catchpoint): New function. - (ep_is_catchpoint): New function. - (ep_is_shlib_catchpoint) New function. - (enum bpstat_what_main_action): New entry. - - * buildsym.c (finish_block): Get rid of processing_hp_compilation; - handle LOC_INDIRECT case. Set the BLOCK_GCC_COMPILED to the right - compiler. - (push_context): Add symbols for parameters to the context_stack. - (merge_symbol_lists): New function. Merges two symbol lists. - (struct context_stack): Add new field param. - - (processing_hp_compilation): New external var. - - * c-exp.y: Use external flag hp_som_som_object_present to decide - whether code was compiled by HP's compilers. Add two new C++ - tokens for true and false. - (yylex): Check for template name is done differently for the - HP/aCC compiler case; change some of the template processing code - for handling HP aCC templates. - - * c-lang.c (c_create_fundamental_type): Added case to handle - template args. Handle FT_BOOLEAN type. Set no sign flag for - FT_CHAR. - (cplus_builtin_types): New structure for c++ builtin types. - (cplus_language_defn): Use cplus_builtin_types instead of - c_builtin_types. - - * c-typeprint.c (c_type_print_base): Don't print 'privete' label - for a class if all members are private, similarly don't print - 'public' for a struct. Add support for sized enums (HP/aCC). get - rid of the 'static' keyword printed by the demangler for member - function, when printing the type of a class. 'static' will be - added by this function. If the demangled name is null, and the - method is not stubbed, get the signature by looking at the - information stored in the symbol structure. Remove printing of - 'const' and 'volatile' keywords for methods. This is now taken - care as part of the demangled member names. - (cp_type_print_method_args): New function. To print a C++ method - arguments and name to the output stream. - - (c_type_print_cv_qualifier): New function. Print out "const" and - "volatile" attributes. - (c_type_print_varspec_prefix): Print const or volatile qualifiers. - (c_type_print_args): Print 'void' for c++. - (c_type_print_varspec_suffix): Print 'void' for a no argument - function. - (c_type_print_base): Print const or volatile qualifiers. Do not - print 'unnamed union' if HP aCC compiler used. Distinguish - between struct and class based on the DECLARED_TYPE. Handle - HP/aCC compiler case for not printing vtable. Add Template - support. - - (cp_type_print_derivation_info): Print out 'protected' when - appropriate. This applies only to HP's compilers, not gcc. - - (c_val_print): Added parameter embedded_offset. Add - embedded_offset to valaddr in function calls; fix calls to - val_print and cp_print_value_fields. process TYPE_CODE_METHOD as - well. moved call to check_typedef out of conditional. added - embedded offset param to val_print call. - - (c_value_print): Add new parameter to call to val_print. - handle pointer to class case. Attempt to - determine the real type of the object to be printed. - ensure that const char *, const unsigned char * - come out without the type but the volatile variants - and the signed variants don't. - - * coff-solib.c (coff_solib_add): Add parameters to call - to symbol_file_add. - - * coff-solib.h: (Solib_REMOVE_INFERIOR_HOOK): New macro. defined - to 0. functionality not implemented for coff. - (SOLIB_CREATE_CATCH_LOAD_HOOK): New macro, generate error message - for coff. - (SOLIB_CREATE_CATCH_UNLOAD_HOOK): Ditto. - (SOLIB_HAVE_LOAD_EVENT): Ditto. - (SOLIB_LOADED_LIBRARY_PATHNAME): Ditto. - (SOLIB_HAVE_UNLOAD_EVENT): Ditto. - (SOLIB_UNLOADED_LIBRARY_PATHNAME): Ditto. - (SOLIB_IN_DYNAMIC_LINKER): Ditto. - (SOLIB_RESTART): Ditto. - - * command.c (find_cmd): New function. (lookup_cmd_1): Call it, - change parsing if tui_version or xdb_commands is set. - (_initialize_command): Install new alias if xdb_commands is set. - - * complaints.h: Add ifdef...endif pair at beginning and end of file. - - * config.in, configure: Regenerated. - - * config/pa/hppabsd.mh (NATDEPFILES): Added new files - hp-psymtab-read.o and hp-symtab-read.o. - * config/pa/hppahpux.mh (NATDEPFILES): Ditto. - - * config/pa/hppahpux.mh (TERMCAP): Use -lHcurses. - * config/pa/hppaosf.mh (NATDEPFILES): Ditto. - - * config/pa/hpux1020.mh (TERMCAP): Use -lHcurses. - (MH_CFLAGS): New flag, -D__HP_CURSES, this define - is used by HP's linker to find the correct curses library. - - * config/pa/hpux1020.mh: New file. - - * config/pa/hpux1020.mt: New file. - - * config/pa/hpux1100.mh (TERMCAP): Link against -lcurses, not - -lHcurses. The latter does not contain mvwaddstr, wscrl, or - wstbwlmkfzz. - - * config/pa/hpux1100.mh (TERMCAP): Use -lHcurses. - (MH_CFLAGS): New flag, -D__HP_CURSES, this define - is used by HP's linker to find the correct curses library. - - * config/pa/hpux1100.mh (TERMCAP): When hosting on hpux 11.00, use - -lHcurses rather than -lcurses. - - * config/pa/hpux1100.mh: New file. - - * config/pa/hpux1100.mt: New file. - - * config/pa/nm-hppah.h (CHILD_HAS_SYSCALL_EVENT): New macro - (CHILD_THREAD_ALIVE): New macro - (STOPPED_BY_WATCHPOINT): Add a condition to the macro, - ! stepped_after_stopped_by_watchpoint - (TARGET_ENABLE_HW_WATCHPOINTS): New macro - (hppa_enable_hw_watchpoints): New funct decl - (TARGET_DISABLE_HW_WATCHPOINTS): New macro - ( hppa_disable_hw_watchpoints): New funct decl - these are for HP's implementation of fast - watchpoints (via page protection). - (target_pid_to_str): New macro, calls hppa_pid_to_str - (target_tid_to_str): New macro, calls hppa_tid_to_str - - * config/pa/nm-hppah.h (CHILD_POST_WAIT): Delete; - (CHILD_CREATE_CATCH_FORK_HOOK): Replace with - CHILD_INSERT_FORK_CATCHPOINT and CHILD_REMOVE_FORK_CATCHPOINT. - (CHILD_CREATE_CATCH_VFORK_HOOK): Replace with - CHILD_INSERT_VFORK_CATCHPOINT and CHILD_REMOVE_VFORK_CATCHPOINT. - (CHILD_CAN_FOLLOW_VFORK_PRIOR_TO_EXEC, - CHILD_INSERT_EXEC_CATCHPOINT, CHILD_REMOVE_EXEC_CATCHPOINT, - CHILD_HAS_EXECD, CHILD_REPORTED_EXEC_EVENTS_PER_EXEC_CALL, - CHILD_POST_ATTACH, TARGET_HAS_HARDWARE_WATCHPOINTS, - TARGET_CAN_USE_HARDWARE_WATCHPOINT, - TARGET_REGION_SIZE_OK_FOR_HW_WATCHPOINT, - TARGET_RANGE_PROFITABLE_FOR_HW_WATCHPOINT, STOPPED_BY_WATCHPOINT, - HAVE_NONSTEPPABLE_WATCHPOINT, target_insert_watchpoint, - target_remote_watchpoint): New macros. - - * config/pa/nm-hppah.h (CHILD_XFER_MEMORY): Reinsert accidentally - deleted define. - - * config/pa/nm-hppah.h: - (PREPARE_TO_PROCEED): Defined macro to use - hppa_prepare_to_proceed. - (hppa_pid_to_str): Extern decl. - (hppa_tid_to_str): Extern decl. - (target_pid_or_tid_to_str): New macro definition. - (hppa_pid_or_tid_to_str): Extern decl. - (ENSURE_VFORKING_PARENT_REMAINS_STOPPED): New macro - for - handling events caused by a call to vfork. - (hppa_ensure_vforking_parent_remains_stopped): Extern decl. - (RESUME_EXECD_VFORKING_CHILD_TO_GET_PARENT_VFORK): New macro - - for handling events caused by a call to vfork. - (hppa_resume_execd_vforking_child_to_get_parent_vfork): Extern decl. - - * config/pa/nm-hppah.h: Fix PREPARE_TO_PROCEED macro. - - * config/pa/nm-hppah.h: Fix for gcc compile on HPUX, change - PT_RDUAREA to PT_RUAREA. - - * config/pa/nm-hppah.h: Introduced an HPUXHPPA define. - A bit of a hack so that I can ifdef some code that - only works for the HP wildebeest debugger. - - * config/pa/nm-hppah.h: Lots of new CHILD_ defines; - process_event_kind enum. - - * config/pa/tm-hppa.h (BREAKPOINT32): New define. - (CALL_DUMMY_HAS_COMPLETED): New define. - - * config/pa/tm-hppa.h (STACK_ALIGN): New macro. - (NO_EXTRA_ALIGNMENT_NEEDED): New macro. - (PC_REQUIRES_RUN_BEFORE_USE): New macro. - (REGISTER_NAMES): Formatting in file changed. - (CR27_REGNUM): Base register for thread local storage. - (USE_STRUCT_CONVENTION): New macro used to decide whether - a function returning a value of type type will - put it on the stack or into registers (based on the - PA risc calling conventions). - (EXTRACT_RETURN_VALUE): Fixed calculation for extracting return value. - (VALUE_RETURNED_FROM_STACK): New macro. - (TARGET_READ_PC): Declared the function used in the definition. - (SKIP_TRAMPOLINE_CODE): Declared the function used in the definition. - (TARGET_WRITE_PC): Declared the function used in the definition. - (TARGET_READ_FP): Declared the function used in the definition. - - * config/pa/tm-hppa.h (STRCAT_REGISTER): Define macro for - future use. - (pa_do_strcat_registers_info): Moved function decl from - defs.h to this HPUX specific .h file. - - * config/pa/tm-hppa.h (USE_STRUCT_CONVENTION): Type_LENGTH returns - bytes, not bits; fix off by 8 error. - - * config/pa/tm-hppa.h: - New comment for obj_unwind_info definition - New typedef, obj_private_struct - - * config/pa/tm-hppa.h: Delete most target_ macros -- use default - versions instead; remove extraneous comma from proc_wait macro. - - * config/pa/tm-hppa.h: Get rid of macro HP_COMPILED_TARGET. - - * config/pa/tm-hppa.h: Removed redefinitions of - USE_STRUCT_CONVENTION and STACK_ALIGN macros. - - * config/pa/tm-hppa.h: Some new definitions - New macros: Arg0_REGNUM, ARG1_REGNUM, ARG2_REGNUM, ARG3_REGNUM. - target_pid_to_exec_file, target_acknowledge_forked_child, - target_create_catch_fork_hook, target_create_catch_vfork_hook, - target_has_forked, target_has_vforked, require_attach, - require_detach, proc_wait - New funct decls: Hppa_pid_to_exec_file, - hppa_acknowledge_forked_child, hppa_create_catch_fork_hook, - hppa_create_catch_vfork_hook, hppa_target_has_forked, - hppa_target_has_vforked, hppa_require_attach, - hppa_require_detach, process_wait - (unwind_table_entry): Added comments to describe struct fields. - - * config/pa/tm-hppah.h (somsolib.h): Include it. - - * config/pa/tm-hppah.h: - (CHILD_ENABLE_EXCEPTION_CALLBACK): New define - (CHILD_GET_CURRENT_EXCEPTION_EVENT): New define - - * configure.host (hppa-*-hpux10.20, hppa-*-hpux11.0*): New configs. - - * configure.in (AC_CHECK_HEADERS): Add check for term.h. - - * configure.in: Add an --enable-tui argument. - - * configure.in: Construct tui/Makefile from tui/Makefile.in. - - * configure.in: Use AM_PROG_CC_STDC. If we have the GUI, then we - need this to process libgui.h. - - * convex-tdep.c (decout): Change FILE to GDB_FILE. - - * corefile.c: Include objfiles.h, symfile.h. - (core_file_command): Attempt to determine the name of the symbol - file from the core file. - (read_memory_string): New function. - - * corefile.c (core_file_command): Temporary hack to make non-hpux - work. For, non-hpux, t->to_core_file_to_sym_file does not have a - reasonable value. No target_ops vector on the stack gives it a - non-zero value. fix later. - - * corelow.c (core_file_to_sym_file): Added new local variable, - failing command, and do some explicit type castings. - (core_ops): Add three new fields: to_has_syscall_event, - to_enable_exception_callback, to_get_current_exception_event. - Necessary since we still have oldstyle initialization in - this file - - * corelow.c: Include unistd.h - (core_file_to_sym_file): New function - (core_file_thread_alive): New function - (core_ops): Added new target ops vector fields. see below. And - yes we definitiely need to initialize them here, as long as - we're using static initialization. - - * cxux-nat.c (add_shared_symbol_files): Additonal params for calls - to symbol_file_add. - - * defs.h (gdb_file_isatty): New function decl. - - * defs.h (GDB_FILE): If TUI is defined, define a structure rather - than making this an alias for FILE. - (gdb_stdout, gdb_stderr): If TUI is defined, then define these - as pointers to variables of type GDB_FILE rather than making them - be aliases for stdout and stderr. - - * defs.h (TUIDO): Add definition conditionalized on definition - (or lack thereof) of TUI. - - * defs.h (command_class): Add two additional values. - (precision_type): New enum. - - * defs.h (gdb_fclose): Add declaration. - - * defs.h (store_address): Change prototype to match function. - - * defs.h (tui_version, xdb_commands, dbx_commands): Add decl's. - - * defs.h (gdb_file_deallocate): New function declaration - - * defs.h: - (streamtype): New enumerated type to distinguish between - output to a FILE and output to a buffer. - (tui_stream): New struct type, named GDB_FILE. Contains, - streamtype, FILE, buffer, and bufferlength fields. - (gdb_stdout): Of type GDB_FILE, will pass this around gdb - rather than stdout. - (gdb_stderr): Of type GDB_FILE, will pass this around gdb - rather than stderr. - (fputs_unfiltered_hook): Change stream parameter from FILE to - GDB_FILE - (flush_hook): Change stream parameter from FILE to GDB_FILE - (gdb_fclose): Fix declaration for gdb_fclose; parameter is now of - type GDB_FILE ** - (gdb_file_adjust_strbuf): New function declaration. function lives in - utils.c. - (gdb_file_init_astring): New function declaration. function lives - in utils.c - (gdb_file_get_strbuf): New function declaration. function lives - in utils.c - - * defs.h: Additional include files included when TUI is defined. - - * defs.h: Funct decl source_full_path_of. - - * demangle.c: Add HP_DEMANGLING_STYLE_STRING. - - * demangle.c: Added new demangling style, EDG_DEMANGLING_STYLE_STRING, - to the demanglers structure. This is for support of - Kuck & Assoc.'s changes for demangling. - - * eval.c (evaluate_subexp_standard): C++ member function changes. - - * eval.c (evaluate_subexp_standard): Verify TYPE_TARGET_TYPE is - non NULL before dereferencing it. - - * eval.c (evaluate_subexp_standard): With HP/aCC compiler it is not possible - to perform inferior calls via function pointers. - Resolve calls to overloaded functions using find_overload_match. - We cannot handle HP/aCC pointers to member functions. - Deal with HP/aCC pointers to members in various kind of expressions. - - * f-lang.c (f_printchar): Change FILE to GDB_FILE. - (f_printstr): Ditto. - (emit_char): Ditto. - - * f-lang.c (f_printstr): Change stdout to gdb_stdout. - - * f-typeprint.c (f_print_type): Change FILE to GDB_FILE. - (f_type_print_varspec_prefix): Ditto. - (f_type_print_args): Ditto. - (f_type_print_varspec_suffix): Ditto. - (print_equivalent_f77_float_type): Ditto. - (f_type_print_base): Ditto. - - * findvar.c (): Hp snapshot 3 changes. (extract_address): Coerce - return value from extract_unsigned_integer to CORE_ADDR. - (store_address): Change val from CORE_ADDR to LONGEST; changes to - support machines where CORE_ADDR and LONGEST are different sizes. - (get_saved_register): Coerce arg to store_address to LONGEST. - (read_relative_register_raw_bytes): Cast last arg to - store_address to LONGEST. (read_register): Cast return from - extract_address to a CORE_ADDR. (write_register_pid): Change val - from LONGEST to CORE_ADDR. (read_pc_pid): Save and restore - inferior_pid if necessary. (write_pc_pid): Ditto. - (read_var_value): Cast arg to store_address. - - * findvar.c (read_relative_register_raw_bytes_for_frame): New - function. - (read_relative_register_raw_bytes): Call it. - - * findvar.c (symbol_read_needs_frame): Handle LOC_THREAD_LOCAL_STATIC and - LOC_INDIRECT. - - * fork-child.c (fork_inferior): Chenge fifth parameter to be a - function returning void. - - * fork-child.c (fork_inferior): Delete unused variable f. - - * fork-child.c: - (Startup_WITH_SHELL): New macro -- interim fix for a bug - (breakup_args): New function -- breaks up an argument string into - an argument suitable for passing into execvp(). - (fork_inferior): Handling problems with starting up gdb with a shell. - -- again, this appears to be an interim fix. - - * fork-child.c: - (fork_inferior): Added a comment - (clone_and_follow_inferior): New function. - (startup_inferior): Minor formatting changes. - - * fork-child.c: - (fork_inferior): Hp change is problematic. The -f option has - different meanings for different shells. It is particularly - inappropriate for bourne shells. - - * fork-child.c: - (fork_inferior): Added new parameter, pre_trace_fun. - pre_trace_fun is a function pointer. For some targets, - like HPUX, this function gets called to prepare for forking - a child. - - * fork-child.c: - (fork_inferior): Fixed call to init_trace_fun - - * fork-child.c: - Moved definition of STARTUP_WITH_SHELL to inferior.h - Added a DEBUGGING macro. Currently set to 0. May remove - later. - breakup_args: Add DEBUGGING ifdefs. more sophisticated - parsing to break up args. - (fork_inferior): Rename kshell variable to shell. new local - variable, tryname. Make use of STARTUP_WITH_SHELL macro. - More error processing if starting up with a shell. - (startup_inferior): Distinguish between starting up with a shell - and not doing so. - - * gdbthread.h: - Declarations for load_infrun_state and save_infrun_state take - an additional parameter. - - * gdbthread.h: Note that sometime between gdb 4.16 and 4.17, - thread.h was renamed gdbthread.h - (load_infrun_state): Additional parameters - (store_infrun_state): Additional parameters - - * gdbthread.h: Include breakpoint.h - - * hp-psymtab-read.c (QUICK_LOOK_UP): Redefine to be 0. - (hpread_build_psymtabs): Deal with enums. - (hpread_start_psymtab): Include section offset. - (hpread_end_psymtab): Take care of offset. - - * hp-psymtab-read.c (TRUE): Define. - (FALSE): Define. - (file_exists): New function. Checks for existance of file. - (hpread_pxdb_needed): Rewrite. - (hpread_quick_traverse): Use correct demangling style. - Handle F77 case. - (hpread_get_header): Rewrite. - (hpread_get_textlow): Add support for DOC_FUNCTION. - (hpread_build_psymtabs): Make sure we do the right thing - for pxdb and F77. - - * hp-psymtab-read.c (hpread_pxdb_check): Change parenthesis positions. - - * hp-psymtab-read.c (hpread_quick_traverse): Compare CORE_ADDR - variable end_addr to 0 instaed of NULL to get rif of gcc warning. - - * hp-psymtab-read.c: - (Hpread_get_textlow): Added param to function - Defined convennience macros and some datatypes and variables for - processing the quick lookup-tables. Looks like the code existed - before, but has been munged. - (hpread_pxdb_needed): Major rearrangements of code. Additional local - variables. Also, more extensive checking for various scenarios: - debug info for optimized code vs. unoptimized code, pxdb has been - run vs. pxdb has not been run. - (VALID_FILE): New macro - (VALID_MODULE): New macro - (VALID_PROC): New macro - (VALID_CLASS): New macro - (FILE_START): New macro - (MODULE_START): New macro - (PROC_START): New macro - (FILE_END): New macro - (MODULE_END): New macro - (PROC_END): New macro - (FILE_ISYM): New macro - (MODULE_ISYM): New macro - (PROC_ISYM): New macro - (VALID_CURR_FILE): New macro - (VALID_CURR_MODULE): New macro - (VALID_CURR_PROC): New macro - (VALID_CURR_CLASS): New macro - (CURR_FILE_START): New macro - (CURR_MODULE_START): New macro - (CURR_PROC_END): New macro - (CURR_FILE_ISYM): New macro - (CURR_MODULE_ISYM): New macro - (CURR_PROC_ISYM): New macro - (TELL_OBJFILE): New macro - (pst_syms_struct): New typedef to keep track of the start/end symbol - table (LNTT) indices of psymtabs created so far. - (pst_syms_count): New variable - (pst_syms_size): New variable - (told_objfile): New variable - (init_pst_syms): New function. sets up psymtab symbol index stuff. - (clear_pst_syms): New function. clean up psymtab symbol index stuff. - (record_pst_syms): New function. add info about newest psymtab to symbol - index table. - (find_next_pst_start): New function. Find a suitable symbol table index. - (find_next_file_isym): New function - (find_next_proc_isym): New function - (find_next_module_isym): New function - (scan_procs): New function. Scan and record partial symbols for all - functions starting from specified index and in a specified code range. - (hpread_quick_traverse: Major rearrangement of code. The function - now uses all the nifty macros. There are some new local variables. - Check for EDG_DEMANGLING style. ifdef out some code for handling F77. - Previously, the function looped over all the modules in the table. - Now, the function loops over all the files, modules, and procedures. - With HP aCC and CTTI, it is possible for a compiled object to have a - file and no module. - (hpread_build_psymtabs): Added a section of code ifdefed by - QUICK_LOOK_UP. It check to see whether or not there are any globals - in the executable. Fix number of params to hpread_start_psymtab call. - Some changes to the way DNTT_TYPE_MODULE is handled. - (hpread_get_textlow): Change in signature, minor code changes. The - function finds the low address associated with a specified symbol. - In looking for the address for the symbol avoid going of the end of - the LNTT file. - - * hp-psymtab-read.c: Change TRUE to 1 and FALSE to 0. Do some - reformatting. - - * hp-psymtab-read.c: Include demangle.h - (trans_lang): New function to let gdb know the correct language. - (hpread_quick_traverse): Use ARM style demangling. - Demangle procedures names. - Use gdb language names instead of hp language names. - Add symbol to list using its demangled name. - - * hp-psymtab-read.c: New file. - (hpread_call_pxdb): New function. Call PXDB to process our file. - (hpread_pxdb_check): New function. Return TRUE if the file needs - pre-processing by PXDB and we have thus called PXDB to do this - processing and the file needs to be re-loaded. - (hpread_quick_traverse): New function. Traverse the quick look-up - tables, building a set of psymtabs. - (hpread_get_header): New function. Get appropriate header from obj - file, based on pxdb type - (hpread_symfile_init): No change from hpread.c - (hpread_build_psymtabs): If there are quick lookup tables, read those, - then scan the global section LNTT. Otherwise, just scan the whole LNTT. - Changed: Add a global function entry to the global partial symbol list. - Handle end of symbols, for QLT case. - In case of TAGDEF, if it is a class or a template, add the name to the - var_namespace, so that it is known as a type by gdb. - In case of CONSTANT, and it is global, add it to the globals. - (hpread_symfile_finish): No change from hpread.c - (hpread_get_lntt): Make it not static - (hpread_get_gntt): No change from hpread.c - (hpread_get_slt): Make it not static - (hpread_get_textlow): No change from hpread.c - (hpread_start_psymtab): No change from hpread.c - (hpread_end_psymtab): No change from hpread.c - - * hp-symtab-read.c (hpread_get_scope_start): Renamed. It was - hpread_get_depth. - (hpread_type_translate): Distinguish between signed and unsigned char - types. - (hpread_psymtab_to_symtab): Set flag for hp compilation. - (hpread_read_function_type): Append symbols for parameters to local - list as well as to the global list. Get the parameters types from the - local list instead of the global list. - (hpread_read_struct_type): Add new field num_fn_fields to next_fn_field - structure. Rewrite handling of templates - (hpread_type_lookup): Change handling of dntt_type_modifier. - (hpread_process_one_debug_symbol): Call hpread_get_scope_start instea - of hpread_get_depth. Handle enum as well. - (hpread_get_scope_depth): New function. Get nesting depth for a - DNTT entry. - - * hp-symtab-read.c (hpread_psymtab_to_symtab): Set - processing_gcc_compilation to 0. - - * hp-symtab-read.c (hpread_psymtab_to_symtab_1): Change stdout to - gdb_stdout; change fflush to gdb_flush. - (hpread_psymtab_to_symtab): Change fflush to gdb_flush. - - * hp-symtab-read.c (hpread_read_enum_type): Declare variable. - (hpread_read_struct_type): Eliminate references - to 'args' member of fn_field. - - * hp-symtab-read.c (hpread_read_struct_type): A static member - is now indicated by the bitsize field, not the bitpos. - Initialize physname to empty. - (fix_static_member_physnames): Use new macros to deal with - physnames. - - * hp-symtab-read.c (hpread_read_struct_type): Change references - to bitpos member of struct field to use the FIELD_BITPOS macro. - - * hp-symtab-read.c (hpread_read_struct_type): Comment out reference to - obsolete field fn_field.args. - Add struct complaint definitions for complaints. - (hpread_read_struct_type): Change call to complain. - (hpread_read_array_type): Change call to complain. - (hpread_type_lookup): Change call to complain. - (hpread_process_one_debug_symbol): Change calls to complain. - (hpread_type_translate): Change calls to complain. - - * hp-symtab-read.c (hpread_read_struct_type): Make sure bitvector - has been allocated before calling has_vtable. - - * hp-symtab-read.c (hpread_read_struct_type): Revert change, - just check for vtable without checking for bitvectors too. - - * hp-symtab-read.c: - (Hpread_expand_symtab): Change name of local variable from - at_end_of_module to at_module_boundary. - Also, if demangling style is already EDG, do not reset it - to the HP demangling style. - Change at_end_of_module param to hpread_process_one_debug_symbol - call to at_module_boundary. - No longer break out of loop when reach end of module. With CTTI, - the compiler can generate function symbols which are not in - any module. Typically they show up after the end of one - module and before the start of the next module. - (hpread_read_struct_type): Check that the debug info for - a TEMPLATE_ARG is correct. - (hpread_process_one_debug_symbol): Change name of at_end_of_module_p - param to at_module_boundary_p. - Also set *at_module_boundary_p = -1 if missing a module end and set - it to 1 when finished expanding the debug info. - Handle TLS variable. - - * hp-symtab-read.c: Include defs.h, symtab.h, gdbtypes.h, complaints.h. - (fixup_class): New static variable. - (fixup_method): New static variable. - (hpread_get_location): Rewrite. - (hpread_has_name): Add cases for DNTT_TYPE_DOC_FUNCTION and - DNTT_TYPE_DOC_MEMFUNC - (hpread_expand_symtab): Use HP demangling style. - Set hp_som_som_object_present to 1. - (hpread_type_translate): Error out if not immediate. Issue warning - if there is an unhandled type code. - (error_in_hpread_type_translate_complaint): Remove this structure. - (hpread_read_enum_type): Don't assume size of enum is always 4 bytes. - (hpread_read_function_type): Add new parameter to indicate a new block. - Do not add the parameters to the symbol list. - If the type was read in earlier, do not modify the type structure. - If we are creating a new block, set the local symbol list to be the - param list. - Need to mark this type as preprocessed. - (hpread_read_doc_function_type): New function. Read and internalize - a native DOC function debug symbol. - (hpread_read_struct_type): A method can be of type doc_function and - doc_memfunc too. - Handle case in which a method is read before its class. Deal with - incomplete method types. - Handle cases in which HP/aCC compiler creates operator names w/o - the 'operator' keyword. Rewrite the loop over the fileds. - (fix_static_member_physnames): New function. Adjust the physnames for - each static member. - (fixup_class_method_type): New function. Fix-up the type structure for a - class. - (hpread_read_array_type): Change complaint to warning. - (hpread_type_lookup): Add case for DNTT_TYPE_DOC_FUNCTION. - For structures/classes set static member to point to strings with full - names. - Change calls to hpread_read_function_type to pass extra parameter. - (hpread_record_lines): Handle case for SLT_NORMAL_OFFSET. - (class_of): New function. Given a function "f" which is a member of a class, - find the classname that it is a member of. - (hpread_process_one_debug_symbol): Deal with possible alias field from the - som record for the Function or Entry type. - Do the demangling ourselves if the gdb demangler failed. - Add support for DOC functions. - For function types, add parameters to local list. - (hpread_get_scope_depth): Make this function a no-op. - (hpread_adjust_bitoffsets): New function. Adjust the bitoffsets for all - fields of an anonymous union. - (hpread_get_next_skip_over_anon_unions): New function. Skip over anonymous - unions. - - * hp-symtab-read.c: Include demangle.h - (hpread_expand_symtab): Ensure we are using ARM-style demangling. - (hpread_process_one_debug_symbol): Set the mangled and demangled - names for functions. - Record the class name to generate the demangled names of member - functions. - - * hp-symtab-read.c: New file. - (hpread_get_depth): No change from hpread.c - (hpread_get_line): No change from hpread.c - (hpread_get_location): No change from hpread.c - (hpread_has_name): Make it not static. Return 1 for DNTT_TYPE_BLOCKDATA - and DNTT_TYPE_MEMFUNC. Return 0 for CLASS_SCOPE, REFERENCE,PTRMEM, - PTRMEMFUNC, CLASS, GENFIELD, VFUNC, MEMACCESS, INHERITANCE, - FRIEND_CLASS, FRIEND_FUNC, MODIFIER, OBJECT_ID, TEMPLATE, TEMPLATE_ARG, - FUNC_TEMPLATE, LINK. - (hpread_psymtab_to_symtab_1): No changes from hpread.c - (hpread_psymtab_to_symtab): Make it a static function - (hpread_expand_symtab): Modified - (hpread_type_translate): If not typep.dntti.immediate do not abort, - but complain and return. Same for default action. Handle more HP_TYPEs. - (hpread_lookup_type): Initially allocate a correct-size type-vector. - (hpread_alloc_type): Reset type_addr only if a type was allocated. - (hpread_read_enum_type): If this has already a type associated, return. - (hpread_read_function_type): Do different things depending on whether - function is a MEMFUNC, a TEMPLATE, a FUNCTION som record. - Do not use the LOC_REGPARM_ADDR symbol class. - (hpread_read_struct_type): Handle classes and templates too. Major - rewrite. - (hpread_get_nth_template_arg): New function. - (hpread_read_templ_arg_type): New function. - (hpread_read_set_type): No change from hpread.c - (hpread_read_array_type): Modified - (hpread_read_subrange_type): Add handling of more DNTT entries. - added support for templates, classes, references, virtual functions. - (hpread_type_lookup): Handle DNNT_TYPE_MODULE. - (hpread_record_lines): No changes from hpread.c - (hpread_process_one_debug_symbol): Handle WITH, COMMON, - CLASS_SCOPE. Expand TAGDEF case to handle classes and templates. - - * hppa-tdep.c (pa_do_strcat_registers_info): Has a new parameter, - precision, which is passed into the call to pa_strcat_fp_reg to - indicate whether to display the floating point registers using - single or double preceision. - (pa_strcat_registers): Introduce local variable, precision, and - pass it into call to pa_strcat_fp_reg. - (pa_strcat_fp_reg): Modified function. New parameter, precision, - used by function to decide whether to use single or double - precision. Also added the code to put a double precision value - into a buffer. - - * hppa-tdep.c: Add'l includes <machine/save_state.h>, - <unistd.h>, declare pa_register_look_aside, define is_pa_2. - (rp_saved): Check for where to read the return pointer from. - (pa_do_registers_info): Handle is_pa_2. (pa_register_look_aside): - new function. (pa_print_registers): Handle is_pa_2. - (in_solib_call_trampoline): Handle a compiler/linker error. - (skip_trampoline_code): Changes to some masks used in examining - instructions. (inst_saves_fr): Test for FSTWS instruction. - (skip_prologue): Renamed to skip_prologue_hard_way. - (after_prologue): New function. (skip_prologue): New function. - - * hppa-tdep.c (after_prologue): If f is NULL, don't dereference - it. - - * hppa-tdep.c (after_prologue): If no debug info, return zero - telling caller that we need to find the end of the prologue via - the hard way (instruction examination). - - * hppa-tdep.c (find_unwind_entry): Avoid dereferencing a null - pointer. - - * hppa-tdep.c (hppa_pid_to_exec_file): Deleted -- no longer used. - - * hppa-tdep.c (hppa_prepare_to_proceeed): Add prototype. - (read_unwind_info): Purecov comments, bug fixes. - (find_unwind_entry): Purecov comments, bug fixes. - (find_stub_with_shl_get): Purecov comments. - (frame_chain): Additional parens. - (hppa_push_arguments): Changes to commented out version of routine. - (hppa_fix_call_dummy): Purecov comments, fix location of end.o. - (in_solib_call_trampoline): Purecov comments. - (in_solib_return_trampoline): Purecov comments. - (setup_d_pid_in_inferior): Fix location of end.o. - (initialize_hp_cxx_exception_support): Fix location of end.o. - (child_enable_exception_callback): Purecov comments. - - * hppa-tdep.c: - (Pa_do_strcat_registers_info): New routine. called by - tui/tuiRegs.c:_tuiRegisterFormat to place a register name - and value into a string buffer. Interface may change in - future. Checking this in so that we have something - functional for HP. - (pa_strcat_registers): New routine, called by - pa_do_strcat_registers_info. Does same thing as - pa_print_registers except it takes a stream parameter. - This routine should disappear in future. Checking in - so that we have something functional to give HP - (pa_strcat_fp_reg): New routine, called by - pa_do_strcat_registers_info and pa_strvat_registers - to place a floating point register name and value into - a buffer. This interface may change in future. - Checking in so that we have something functional to give HP. - - * hppa-tdep.c: (Pa_print_fp_reg): Change prototype to match def'n. - (pa_register_look_aside): Fix comment immediately before function. - - * hppa-tdep.c: Changes to better support stack unwinding, - reading and writing registers for HPUX. The HP folks had - an advantage ... access to a runtime architecture spec ;-}. - New includes: Ptrace.h - (internalize_unwinds): Initialize new fields in table. - (read_unwind_info): Entries in the table are now more complex - structures. References of the form ...->table[index].stub_type - are now ...->table[index].stub_unwind.stub_type. - (find_proc_framesize): Added a check for pc == 0. - (rp_saved): Entries in the table are now more complex - structures. References of the form ...->table[index].stub_type - are now ...->table[index].stub_unwind.stub_type. - (frameless_function_invocation): Stub_type becomes - stub_unwind.stub_type - (saved_pc_after_call): Stub_type becomes stub_unwind.stub_type - (hppa_frame_saved_pc): Stub_type becomes stub_unwind.stub_type - (frame_chain_valid): Stub_type becomes stub_unwind.stub_type - (hppa_call_dummy): Stub_type becomes stub_unwind.stub_type - (pa_print_fp_reg): Additional params to call val_print - (in_solib_call_trampoline): Stub_type becomes stub_unwind.stub_type - (in_solib_return_trampoline): Stub_type becomes stub_unwind.stub_typ - (skip_trampoline_code): Additional code to handle external - dyncalls. Also stub_type becomes stub_unwind.stub_type - (hppa_pid_to_exec_file): New funct. FOr HPUX 10.0 and beyond there - is an explicit ptrace request for getting the pathname associated - with a process id (pid). - - * hppa-tdep.c: Fix for gcc compile on HPUX - (hppa_pid_to_exec_file): Remove unwanted param from - call to call_ptrace. Note, hppa_pid_to_exec_file goes - away in subsequent hp snapshots. - - * hppa-tdep.c: Include bfd.h. - include dl.h - (args_for_find_stub): New structure. - (find_unwind_entry): Deal with null input pc value. - (rp_saved): Ditto. - For the import stub, return -24 always. - (hppa_frame_saved_pc): Save old pc value, to detect we are in a loop. - (init_extra_frame_info): Use TARGET_READ_FP. - (frame_chain): Include thread support. - If the caller's pc is zero, we loose and return, just like stack bottom. - Disable warning about being unable to find unwind info. - (hppa_push_arguments): Rewrite. - (hppa_value_returned_from_stack): New function. Handles returning a value - larger that 64 bits, stored on the stack. - (find_stub_with_shl_get): New function. To look up symbols in shlibs. - (cover_find_stub_with_shl_get): New function. Cover routine for - find_stub_with_shl_get to pass to catch_errors. - (hppa_fix_call_dummy): Comment out old stub mechanism. Rewrite using dyncall. - (target_read_fp): New function. - (pa_do_registers_info): Floating point registers start at FP4. - (pa_print_registers): Use FP4_REGNUM instead of 72. - (skip_trampoline_code): Do machine instruction matching for PA2.0. - (setup_d_pid_in_inferior): New function. Exception handling support. - (initialize_hp_cxx_exception_support): Ditto. - (child_enable_exception_callback): Ditto. - (child_get_current_exception_event): Ditto. - - * hppah-nat.c (child_post_wait, child_post_follow_vfork, - child_post_follow_inferior_by_clone): New functions. - - * hppah-nat.c (child_xfer_memory): Make sure the call to ptrace really - fails before we give up. - (hppa_pid_to_str): New function. Format a process id. - (hppa_tid_to_str): New function. Format a thread id. - - * hppah-nat.c (child_xfer_memory): Use xmalloc, not alloca. - (child_post_wait): Delete. - (child_post_follow_vfork): Delete decl of child_ops; delete - large chunks of function -- let it be handled by the normal - mechanism that notices and handles exec events, in resume(). - - * hppah-nat.c (require_notification_of_exec_events): New function; - just notify of exec events, not all events, and just the specified - pid, don't include it's children (10.20 version). - (child_acknowledge_created_inferior): Call new function - require_notification_of_exec_events instead of - require_notification_of_events. - - * hppah-nat.c [!GDB_NATIVE_HPUX_11]: Move HPUX 10.x-specific - support code here from infptrace.c. - - * hppah-nat.c: Removed #define ptrace call_ptrace - replaced all calls to ptrace with calls to call_ptrace - (parent_attach_all): Removed call to ptrace - - * hpread.c (hpread_psymtab_to_symtab_1): Change fflush to - gdb_flush; change stdout to gdb_stdout. - (hpread_psymtab_to_symtab): Change fflush to gdb_flush. - - * hpread.h: New file. Includes all includes, struct defs, defines - from hpread.c. - - * infcmd.c - (attach_command): New local variable, exec_file, added code to - determine exec_file from pid if exec_file is not already known, - call new target operation, target_post_attach -- a no-op unless - on HPUXHPPA - (detach_command): After detaching, do a SOLIB_RESTART - - * infcmd.c (objfiles.h): Fix typo on include line. - - * infcmd.c (run_command): Only call SOLIB_RESTART if it's - defined. - (detach_command): Ditto. - - * infcmd.c: - (run_stack_dummy): Add calls to - disable_watchpoints_before_interactive_call_start and - enable_watchpoints_after_interactive_call_stops - (finish_command): Alter code handling the evaluation and printing - of the target function's return value. - (attach_command): When given a pid, but no exec file, try to determine - the exec file from the process. If the process does not record a - full path name, try to qualify the filename against the source path. - (_initialize_infcmd): Add some verbiage about how to use the attach command - - * infcmd.c: - Include objfiles.h - (run_command): If program has already been started, and decide - to restart it, then kill the target, flush the caches, - call init_wait_for_inferior. Also purge old solib objfiles. - - * infcmd.c: Changed calls to val_print, using a new macro, - SOLIB_RESTART - (run_command): Calls SOLIB_RESTART - (do_registers_info): Changed calls to val_print - - * infcmd.c: Made the symfile.h include preceed the - objfiles.h include. The other ordering caused a - compile problem (incompletely defined types). - - * inferior.h (REQUIRE_DETACH): Fix default definition. - * inftarg.c (child_post_attach): Fix declaration, make static. - (proc_wait): Make globally visible. - (child_insert_fork_catchpoint, etc): Fix return type. - - * inferior.h (STARTUP_WITH_SHELL): New define. - (START_INFERIOR_TRAPS_EXPECTED): New define - - * inferior.h (fork_inferior): Change fifth parameter to be a function - returning void. - - * inferior.h (proc_wait): Declare. - - * inferior.h: - (Require_ATTACH): New macro - (REQUIRE_DETACH): New macro - (detach): Definition is now an extern - (clone_and_follow_inferior): New definition, it's also an extern - - * inferior.h: - (Require_attach): Default definition for require_attach funct - (require_detach): Default definition for require_detach funct - (pre_fork_inferior): New funct decl for function defined in - infptrace.c - (fork_inferior): New parameter in funct decl. - - * inferior.h: - New variable decls: Inferior_ignoring_startup_exec_events, - inferior_ignoring_leading_exec_events -- these variables - are used when processing an exec call. - (CALL_DUMMY_HAS_COMPLETED): New default macro -- for targets - where PC in call dummy implies that call dummy has - completed. Note, that on HPUX this inference does not hold. - - * infptrace.c - (require_notification_of_events): New function - (child_acknowledge_created_inferior): Previously named - hppa_acknowledge_forked_child. Also calling - require_notification_of_events and clearing some semaphore - variables - (child_post_startup_inferior): New function - (child_create_catch_fork_hook): Previously named - hppa_create_catch_fork_hook - (child_create_catch_vfork_hook): Previously named - hppa_create_catch_vfork_hook - (child_has_forked): Previously named hppa_target_has_forked - (child_has_vforked): Previously named hppa_target_has_vforked - (process_wait): Changed to call target_post_wait - (attach): Add call to require_notification_of_events - (child_pid_to_exec_file): New function - (hppa_require_attach): New local variable, pt_status - (hppa_get_process_events): New function - - * infptrace.c (call_ptrace): Simplify control flow. - (proc_wait): Move here from inftarg.c, add target_post_wait call. - - * infptrace.c (call_ptrace): Add some debugging code. - - * infptrace.c (child_pid_to_exec_file): Declare variable. - - * infptrace.c (kill_inferior): Clean up call to proc_wait. - - * infptrace.c: - (Call_ptrace): When the ptrace request is PT_SETTRC, - call ptrace and then call parent_attach_all. - - * infptrace.c: - (Child_has_syscall_event): New function. only applicable - (for now) on HPUX 10.30 and beyond via the ttrace call. - In infptrace.c there is a default operation. - With ttrace, it is possible to tell the kernel to - notify the debugger that the target program is about to make - or return from a syscall. - (child_thread_alive): New function. a default function. - ptrace doesn't support kernel threads. - (hppa_enable_page_protection_events): Defualt function - (hppa_disable_page_protection_events): Default function - - * infptrace.c (child_pid_to_exec_file): Fix number of params to - cal_ptrace call. - - * infptrace.c (hppa_pid_or_tid_to_str): New function. - (hppa_switched_threads): New function. - (hppa_ensure_vforking_parent_remains_stopped): New function. - (hppa_resume_execd_vforking_child_to_get_parent_vfork): New function. - - * infptrace.c: Most of the changes found in infptrace.c should - be moved to hppah-nat.c - (PT_VERSION): A new define - (startup_semaphore_t): A new struct type. it is used to - coordinate the parent and child processes after a fork and - before an exec on HPUX. - (call_ptrace): Changes to determine whether the ptrace - request is for starting the tracing of the target process. - (parent_attach_all): New funct. used on HPUX for coordinating - the parent and child processes after a fork and before and exec. - (hppa_acknowledge_forked_child): New funct. prabably belongs - in hppah-nat.c - (hppa_enable_catch_fork): New funct. probably belongs in - hppah-nat.c - (hppa_disable_catch_fork): New funct. probably belongs in - hppah-nat.c - (hppa_create_catch_fork_hook): New funct. probably belongs in - hppah-nat.c - (hppa_enable_catch_vfork): New funct. probably belongs in - hppah-nat.c - (hppa_disable_catch_vfork): New funct. probably belongs in - hppah-nat.c - (hppa_create_catch_vfork_hook): New funct. probably belongs to - hppah-nat.c - (hppa_target_has_forked): New funct. probably belongs in - hppah-nat.c - (hppa_target_has_vforked): New funct. probably belongs in - hppah-nat.c - (process_wait): New funct. also ifdefed for proc_wait. - (kill_inferior): Call proc_wait rather than wait. this is - pretty hacky. - (pre_fork_inferior): New function. used only by HPUX. - probably should be defined elsewhere. - - * infrun.c (follow_inferior_fork): Only define on HP. - (wait_for_inferior): Only call SOLIB_IN_DYNAMIC_LINKER if we have - shared libraries; restore test of IN_SOLIB_DYNSYM_RESOLVE_CODE - removed by HP. - - * infrun.c (normal_stop): Add a call to the TUIDO - macro just before the annotate_stopped label. This - updates the windows after each program stop. - - * infrun.c (normal_stop): Verify stop_command is non-zero before - dereferencing it (it won't be set if dbx_commands is set). - - * infrun.c (resume): Add #ifdef HPPAHPUX around HPUX-specific - code. - - * infrun.c (resume): Add missing semicolon. - - * infrun.c (wait_for_inferior): Fix syntax error. - - * infrun.c (follow_fork_mode_kind_names): Removed "both" option. - (follow_fork): Added parameters. additional code for handling - following of parent, following of child - (resume): Added code for deciding how to resume in presence of - fork. Additional params to follow_fork call. - - * infrun.c (follow_exec): Ifdef for HPUXHPPA for the moment, the - code in here assumes the existance of the child_ops target - vector. This is incorrect for Solaris. - - * infrun.c (resume): Fixed ifdefs, HPPAHPUX -> HPUXHPPA. - - * infrun.c (wait_for_inferior): Fixed a matching parens problem -- - matching curly brace inside ifdefed code which is not being - compiled. Change local validFlag to be an 'int' rather than a - 'bool' and fixed the corresponding assignment statements. - - * infrun.c: - Two new global variables: Inferior_ignoring_startup_exec_events and - inferior_ignoring_leading_exec_events. - New static variables: Parent_of_vfork_trap_expected_and_ignorable, - step_resume_breakpoint, through_sigtramp_breakpoint, pending_follow, - follow_vfork_when_exec - (follow_inferior_fork): Does what follow_fork did! - (follow_fork): Is now a wrapper function for follow_inferior_fork - (follow_vfork): Is now a wrapper function for follow_inferior_fork - (follow_exec): New function, handles an exec event. - (resume): Remove 3 local variables: Child_pid, has_forked, has_vforked. - move and expand code that tries to follow a fork (i.e. also check - for vfork and exec - (init_wait_for_inferior): Initialize the new structure, pending_follow - (delete_breakpoint_current_contents): When deleting all the breakpoints also - set the breakpoint struct pointer to NULL. - (wait_for_inferior): A number of changes. - The step_resume_breakpoint and through_sigtramp_breakpoint local - variables are now visible in entire module. - Changed name of variable from child_inferior_pid to saved_inferior_pid. - Added several cases to the event processing switch statement: - Target_WAITKIND_FORKED, TARGET_WAITKIND_VFORKED, TARGET_WAITKIND_EXECD. - Also, for TARGET_WAITKIND_STOPPED, check to see if expecting a trap - from the parent of a vfork (ignorable) otherwise break as usual. - When determining the value of 'random_signal' (0 or 1), no longer check for - catchpoints. - When determining how to handle unexpected signals, must now take into - account fork, vfork, and exec. - Change call to PC_IN_CALL_DUMMY to a call to CALL_DUMMY_HAS_COMPLETED - At stop_stepping label, check to see if stopped for fork or - vfork event. - - * infrun.c: New code is related to threads and fork/vfork/exec. - New static variable: Thread_step_needed - Deleted static variable: Parent_of_vfork_trap_expected_and_ignorable - Altered the pending_follow and fork_event structs - (follow_inferior_fork): Before detaching from child and removing - all breakpoints form it -- but only if forking or following - vforks as soon as they happen. Also reset the solib inferior hook. - The same kind of logic applies to hitting step_resume_breakpoints - (calling breakpoint_re_set_thread) and to resetting and inserting - breakpoints. - (follow_exec): Forward decl - (follow_vfork): Check to see if gdb followed the child. If - the child exec'd before gdb saw the parent's vfork event - then call follow_exec. - (follow_exec): If the exec occured after a vfork, then follow - the vfork as well. Do it before following the exec. - Make sure to update breakpoints after and exec - (resume): New local variable, should_resume. - Change parameters in calls to follow_fork, follow_vfork, and - follow_exec. Some changes to the way various pending_follow.kind - situations are handled (there's TARGET_WAITKIND_FORKED, - TARGET_WAITKIND_VFORKED, ARGET_WAITKIND_EXECD. Some additional - conditions to check before deciding to resume the target (i.e. - should_resume=1, stepping?, thread_step_needed?i, regular - resume?) - (proceed): When proceeded at location that does not have a breakpoint - set thread_step_needed=0 to indicate that it is not necessary to - single step thread over breakpoint. SOme additional checks to see - if it is necessary to step thread over breakpoint. - (start_remote): Remove call to clear_proceed_status. - (init_wait_for_inferior): Initialize new fields in fork_event - structure and add a call to clear_proceed_status. - (wait_for_inferior): New local variable: New_thread_event. - Initialize thread_step_needed = 0. - Minor massaging of conditions for adding a new thread to the thread list. - No longer resuming execution after adding a new thread. Let user play with thread first. - Some changes in the way TARGET_WAITKIND_FORKED, ARGET_WAITKIND_VFORKED, - TARGET_WAITKIND_EXECD are handled -- this is all HPUX related. - Simplified TARGET_WAITKIND_STOPPED -- HP previously had some - more complicated code in here. - Moved the code to resume threads to after the large case statement that processes the events. - Additional processing for stop_signal=TARGET_SIGNAL_TRAP. - Cleanup code at process_event_stop_test label. - Set thread_step_needed when processing a BPSTAT_WHAT_SINGLE. - Minor massaging of fork/vfork/exec part of stop_stepping code. - (normal_stop): Minor changes. calling show_and_print_stack_frame. - (xdb_handle_command): New function - (_initialize_infrun): Handle xdb_commands. also handle dbx commands - - * infrun.c: Changes to support following forks, and handling - catchpoints. - (follow_fork_mode_kind_names): New array - (follow_fork): New function. implements the follow parent, - or child functionality. - (resume): Additions to check whether the target process - just forked and decide which process to follow. - (wait_for_inferior): Additional variables (child_inferior_pid, - stepping_through_solib_after_catch, - - stepping_through_solib_catchpoints. - - Altered CURRENTLY_STEPPING macro to check for stepping through - a shared library after hitting a catchpoint. - - Add parameters to save_infrun_state call - - Check for fork and vfork when deciding if event is a random - signal - - When considering stops due to breakpoints, check for - BPSTAT_WHAT_CHECK_SHLIBS_RESUME_FROM_HOOK - - Check for stop due to an explicit catchpoint - - When checking for single stepping event, also check for - stepping to get out of dynamic linker's hook after catching - a shlib event - (is_internal_shlib_eventpoint): New funct. check to see if - event type is bp_shlib_event. - (stopped_for_internal_shlib_event): New funct. check for shlib - events - (stopped_for_shlib_catchpoint): New funct. check for catchpoints. - (normal_stop): Additions to check for shlib event - (set_follow_fork_mode_command): New funct. handles the new follow - fork command. - (_initialize_infrun): Additions for follow-fork-mode command. - - * infrun.c: Ifdefing references to - switched_from_inferior_pid for HPUXHPPA. They don't seem - useful for Solaris (i.e. non-HPUX) - - * infrun.c: Included tuiData.h and tuiDataWin.h, ifdefed for TUI. - Included top.h. New static variables: Switched_from_inferior_pid, - number_of_threads_in_syscalls. - (follow_inferior_fork): If there is a step_resume breakpoint - explicitly reset the thread number. - (resume): For TARGET_WAITKIND_VFORKED, removed a check for getting - the vfork event to soon. - (init_wait_for_inferior): Added parameter to call to - breakpoint_init_inferior. Initialize number_of_threads_in_syscalls. - (wait_for_inferior): New local variables: Prev_sal, - enable_hw_watchpoints_after_wait, stepping_through_sigtramp, - stepped_after_stopped_by_watchpoint. Enable watchpoints after a wait. - Added cases for TARGET_WAITKIND_SYSCALL_ENTRY and - TARGET_WAITKIND_SYSCALL_RETURN. - Do additional processing if stop due to breakpoint, but breakpoint is - only valid for a thread other than the one currently running. Additional - parameters to save_infrun_state and load_infrun_state. Some additional - processing for BPSTAT_WHAT_STEP_RESUME. Some additional processing to - handle stepping over a function. - (normal_stop): Added notification of switching threads. ifdefing some - TUI changes and leaving out non-essential TUI changes. - (restore_selected_frame): Ifdefing some TUI changes - (restore_inferior_status): Ifdefing some TUI changes - - * infrun.c: Removed the TUI ifdefs and TUI code. Also removed - include for top.h. HP introduced this. I'm taking it out. - - * inftarg.c (child_detach_from_process): Declare. - (child_attach_to_process): Declare. - (child_stop): Make static to match declaration. - - * inftarg.c (ptrace_him): Change prototype back to return int. - - * inftarg.c (ptrace_me): Remove debug output, pass NULL to - fork_inferior if not HPUX. - - * inftarg.c: - (child_require_attach): New funct prototype and definition - (child_require_detach): New funct prototype and definition - (proc_wait): Funct prototype and definition are enclosed by - proc_wait ifndef - (child_attach_to_process): New function, does most of the - work that child_attach used to do and some additional - work to determine whether gdb is already attached to the - target how to react. - (child_attach): Altered. It's now a wrapper for - child_attach_to_process. - (child_require_attach): New function, called if should attach - even when gdb is already attached to target. - (child_detach_from_process): New function, does most of the - work that child_detach used to do and some additional work - to determine whether gdb is currently attached to the target. - (child_detach): Altered. It's now a wrapper for - child_detach_from_process. - (child_require_detach): New function, called if should try to - detach even when gdb is not attached to target. - (ptrace_him): Calls a new function, target_acknowledge_forked_child. - Currently, target_acknowledge_forked_child, is only defined to - do something for HPUX. - (child_create_inferior): Changed call to fork_inferior. - (child_ops): Added to_require_attach and to_require_detach fields - to the child_ops target ops vector. - - * inftarg.c: - Some hacks for ttrace work - (child_wait): Additional local variables, additional code in - while loop to check for: Process exited, process forked, - process vforked, process execd - (child_thread_alive): John B. seems to think that the kill - call is inapproapriate for HPUX. - (child_attach_to_process): Using strtol rather than atoi. - no longer check for case where there is no known exec file. - (child_post_attach): New function, a default, a no-op - (child_insert_fork_catchpoint): New function, a default, a no-op - (child_remove_fork_catchpoint): New function, a default, a no-op - (child_create_catch_fork_hook): Deleted - (child_create_catch_vfork_hook): Deleted - (child_insert_vfork_catchpoint): New function, a default, a no-op - (child_remove_vfork_catchpoint): New function, a default, a no-op - (child_can_follow_vfork_prior_to_exec ):new function, a default, - a no-op - (child_insert_exec_catchpoint): New function, a default, a no-op - (child_remove_exec_catchpoint): New function, a default, a no-op - (child_has_execd): New function, a default, returns 0 - (child_reported_exec_events_per_exec_call): New function, a - default, returns 1 - (child_has_exited): New function, a default. - (child_core_file_to_sym_file): New function, a default, returns NULL. - (child_ops): Initialize new target_ops vector fields to the - child* functions. - * infptrace.c: - (Call_ptrace): For HPUX, handle additional requests: Pt_CONTIN1, - PT_STEP1. - (require_notification_of_events): Add several signals to the - set of events requiring notification: Ptrace_SIGNAL, - PTRACE_EXEC, PTRACE_FORK, PTRACE_VFORK - (child_acknowledge_created_inferior): This function is only - defined if CHILD_ACKNOWLEDGE_CREATED_INFERIOR is defined. - (child_post_startup_inferior): Function is only defined if - CHILD_POST_STARTUP_INFERIOR is defiend. Also, now call - require_notification_of_events. - (child_create_catch_fork_hook): Deleted - (child_create_catch_vfork_hook): Deleted - (child_insert_fork_catchpoint): New function - (child_remove_fork_catchpoint): New function - (child_insert_vfork_catchpoint): New function - (child_remove_vfork_catchpoint): New function - (child_has_forked): Now enclosed by a CHILD_HAS_FORKED ifdef - (child_has_vforked): Now enclosed by CHILD_HAS_VFORKED ifdef - (child_can_follow_vfork_prior_to_exec): New function - (child_insert_exec_catchpoint): New function - (attach): Removed call to require_notification_of_events - (child_post_attach): New function, call to - require_notification_of_events moved here. - (child_pid_to_exec_file): New enclosed by CHILD_PID_TO_EXEC_FILE ifdef - introduced the concept of a saved_inferior_pid - (hppa_require_attach): Add some code to decide if gdb is already - attached to process. Can not figure this out via a ptrace call. - (hppa_insert_hw_watchpoint): New function - (hppa_remove_hw_watchpoint): New function - - * inftarg.c: - (child_attach_to_process): Change position in file - (child_detach_from_process): Change position in file - - * inftarg.c: - (child_attach_to_process): Changed parameter to child_wait call - - * inftarg.c: - (child_post_wait): New function declaration and definition - (ptrace_him): - - change return value to a void. - - change target_acknowledge_forked_child call to - target_acknowledge_created_inferior - - call target_post_startup_inferior rather than returning pid. - (child_attach_to_process): Change param name, fail_if_already_attached - -> after_fork. - Invert a couple of if-then-else statments. - Use REQUIRE_ATTACH macro - (child_attach): Change params in child_attach_to_process call - (child_require_attach): Change params in child_attach_to_process call - (child_detach_to_process): Change param name, - fail_if_already_attached -> after_fork. - Invert a couple of if-then-else statments. - Use REQUIRE_DETACH macro - (child_detach): Change params in child_detach_from_process call - (child_require_detach): Change params in child_detach_from_process - call - (child_post_startup_inferior): New function - (child_acknowledge_created_inferior): New function - (child_clone_and_follow_inferior): New function - (child_post_follow_inferior_by_clone): New function - (child_create_catch_fork_hook): New function - (child_create_catch_vfork_hook): New function - (child_has_forked): New function - (child_has_vforked): New function - (child_post_follow_vfork): New function - (child_stop): No longer a static function - (child_pid_to_exec_file): New function - - * inftarg.c: - (child_wait): Child_pid becomes related pid. return pid - rather than inferior_pid. Changes are in code handling fork - and vfork - - * inftarg.c: - Include gdb_stat.h and sys/unistd.h - (child_wait): New local variables. Check for live threads. - Check for syscall events - (child_thread_alive): No longer a static funct. - (ptrace_him): Remove some code inserted in snap3 - (child_create_inferior): Added a bunch of code to handle a - bad interaction between start-up-with-shell and the HP - catch-fork/catch-exec logic. I am ifdefing this for - HPUXHPPA for now. - (child_has_syscall_event): New default target_ops function - (child_enable_exception_callback): New default target_ops function - (child_get_current_exception_event): New default target_ops function - (child_ops): 3 new fields - - * inftarg.c: Remove HPUX_SNAP1 and HPUX_SNAP2 ifdefs - - * inftarg.c: Reverted previous change. - - * infttrace.c (hppa_remove_hw_watchpoint): Fix check for write - access hardware watchpoint. - - * infttrace.c (proc_wait): Rename from proc_wait. - - * infttrace.c (require_notification_of_exec_events): New function; - just notify of exec events, not all events, and just the specified - pid, don't include it's children. - (child_acknowledge_created_inferior): Call new function - require_notification_of_exec_events instead of - require_notification_of_events. - (child_post_startup_inferior): Call require_notification_of_events - - * infttrace.c: Changed all references to boolean to int. - Changed all references to TRUE and FALSE to 1 and 0. - - * irix5-nat.c (symbol_add_stub): Add params to call to - symbol_file_add. - - * jv-lang.c (get_dynamics_objfile): Add 2 more parameters to call - to allocate_objfile. - - * main.c (fputs_unfiltered): Changes to prevent cursor form - jumping around in the TUI. Altered where tuiTermUnsetup and - tuiTermSetup are called - - * main.c (fputs_unfiltered): Changed function so that it - checks to see if output is to a string buffer or to a - FILE stream and does the correct action (i.e. strcat or - fputs). Fixed params for fputs call. - - * main.c (fputs_unfiltered): Don't try to call the TUI's - CommandCharCount functions when the TUI isn't enabled. - - * main.c (fputs_unfiltered): Change FILE to GDB_FILE. - - * main.c (main): If the user gives the --version or --help flags, - disable the TUI. - - * main.c (tui_version, xdb_commands, dbx_commands): New variables. - (main): New command line arguments --tui, --xdb, --dbx; add call - to tyiCleanUp via tuiDo to main loop. - (fputs_unfiltered): Tui related changes. - - * main.c: Define 2 new global variables, gdb_stdout and gdb_stderr - of type GDB_FILE. - (main): Allocate space for and initialize gdb_stdout and gdb_stdin. - - * objfiles.c (find_pc_sect_section): Make end condition be less - than s->endaddr, not less than or equal to s->endaddr. - - * objfiles.c: - (allocate_objfile): 2 new parameters: User_loaded and is_solib. - When appropriate, record in the object file that it is user loaded. - The run command can use this information to purge object file - entries associated with the old inferior and keep user loaded - object files loaded via the add-symbol-file command. - (objfile_purge_solibs): New function. deletes all objectfile entries - that are not explicitly loaded by the user. - - * objfiles.c: - (objfile_relocate): Check for LOC_INDIRECT - (find_pc_sect_section): Change condition from - pc < s->endaddr to pc <= s->endaddr - - * objfiles.h: - New variables: User_loaded and is_solib - (OBJF_SHARED): New macro. used to distinguish objfile for - shared library from "vanilla" objfile. - (allocate_objfile): Add new parameters to function decl. - (objfile_purge_solibs): New function decl. - - * objfiles.h: Add some typedefs: Importentry, ExportEntry. - Add some new variables: Import_list, import_list_size, - export_list, export_list_size - - * osfsolib.c: - (symbol_add_stub): Added params to call to symbol_file_add - - * pa/hpux1020.mh (NATDEPFILES): Add corelow.o, symbol table and - solib files. - - * pa/hpux1100.mh (NAT_FILE): Use nm-hppah11.h. - (NATDEPFILES): Add symbol table and solib files. - - * pa/nm-hppah11.h: New file, HPUX11-only definitions. - - * pa/tm-hppa.h (proc_wait): Remove decl and macro. - - * parse.c (write_dollar_variable): Handle cases in which variables - besides the debugger ones start with $ and $$. - (parse_nested_classes_for_hpacc): New function. Parse a string that - is possibly a namespace / nested class specification. - (find_template_name_end): New function. - - * procfs.c: - (procfs_init_inferior): Return value is now a void. - - * procfs.c (procfs_ops): Initializing new target ops vector fields. see list below. - - * procfs.c: - (procfs_ops): Adding new target_ops vector fields and - removing a few. see list below - - * procfs.c: Added new fields to procfs_ops. - Necessary since we still have oldstyle initialization in - this file - - * pyr-tdep.c (pyr_do_registers_info): Change stdout to gdb_stdout. - (frame_locals_address): Change stderr to gdb_stderr. - (frame_args_addr): Ditto. - - * pyr-xdep.c (fetch_inferior_registers): Change stderr to - gdb_stderr. - - * serial.c (serial_close): Call gdb_fclose, not fclose on a - GDB_FILE. - - * serial.c (serial_logchar): Change chtype to ch_type. sigh. - - * solib.c (look_for_base): The parameter to file must be - of type FILE *. So cast exec_bfd -> iostream in the call - to fileno as a FILE *, not a GDB_FILE *. This will work because - exec_bfd -> iostream is declared and given a value in bdf and - bfd will continue to use FILE rather than GDB_FILE. - - * solib.c: - (solib_add): Remove references to exec_ops. - - * solib.c: - (solib_add): Update exec_ops.to_sections - - * solib.c: - (symbol_add_stub): Added params to call to symbol_file_add - - * solib.h: - (SOLIB_REMOVE_INFERIOR_HOOK): New macro. defined to 0. - functionality not implemented for this target. - - * solib.h: Added macro definitions. These macros generate - error messages for solaris?? - (SOLIB_CREATE_CATCH_LOAD_HOOK) - (SOLIB_CREATE_CATCH_UNLOAD_HOOK) - (SOLIB_HAVE_LOAD_EVENT) - (SOLIB_LOADED_LIBRARY_PATHNAME) - (SOLIB_HAVE_UNLOAD_EVENT) - (SOLIB_UNLOADED_LIBRARY_PATHNAME) - (SOLIB_IN_DYNAMIC_LINKER) - (SOLIB_RESTART) - - * somread.c (is_in_import_list): Ditto. - - * somread.c (som_symfile_read): Added some comments - - * somread.c (som_symfile_read): Read in import and export lists. - (som_symtab_read): Change test for dynamic executable. - (is_in_import_list): New function. Check if a given symbol name - is in the import list. - (init_import_symbols): New function. Read in and initialize the - som import list. - (init_export_symbols): New function. Read in and initialize the - som export list. - - * somread.c: - (som_symfile_read): Fix missing comment delimiters - - * somsolib.c (DLD_FLAGS_MAPPRIVATE): New macro. - Define bit of __dld_flags in HP-UX a.out files. - (DLD_FLAGS_HOOKVALID): Ditto. - (DLD_FLAGS_LISTVALID): Ditto. - (DLD_FLAGS_BOR_ENABLE): Ditto. - (som_solib_total_st_size): Cumulative size in bytes of the - symbol tables of all shared objects on the so_list_head list. - (som_solib_st_size_threshhold_exceeded): Threshold for adding symbols - for shlibs. - (som_solib_sizeof_symbol_table): New function. Computes size of - symbol table for a shlib. - (som_solib_load_symbols): New function. Load symbols from shlib. - (som_solib_add): Detect if __dld_list is not valid. - Record main program's symbol table size. - Load symbols if called from command line. - Keep threshold into account when loading shlib symbols. - (som_solib_create_inferior_hook): Use dld_flags macros. - (som_sharedlibrary_info_command): Let user know if symbols were - not loaded. - (som_solib_restart): Discard all the shlibs descriptors. - (_initialize_som_solib): Chenge help message for auto-solib-add - command. - Set threshold for symbol table to 50 megabytes. - - * somsolib.c (_initialize_som_solib): Added call to som_solib_restart. - (som_solib_restart): New function - (som_solib_in_dynamic_linker): New function - (som_solib_desire_dynamic_linker_symbols): New function - (som_solib_unloaded_library_pathname): New function - (som_solib_loaded_library_pathname): New function - (som_solib_library_pathname): New function - (som_solib_have_unload_event): New function - (som_solib_have_load_event): New function - (som_solib_create_catch_unload_hook): New function - (som_solib_create_catch_load_hook): New function - (som_solib_create_inferior_hook): Rewritten - dld_cache: New struct - addr_and_unwind_t: New struct - (find_unwind_entry) added prototype - - * somsolib.c (som_solib_create_inferior_hook): Introduce new local - msymbol2 and change some msymbol's to msymbol2's -- was clobbering - msymbol, passing a NULL to lookup_minimal_symbol_solib_trampoline, - and ultimately core dumping with a SEGV. - - * somsolib.c: - Include assert.h - (som_solib_mapped_entry): Additional comments for text_addr, - text_link_addr, text_end, and tsd_start_addr fields. Commenting - out 2 tsd fields, __data_start and __data_end. - (som_solib_add_solib_objfile): Add params to calls to symbol_file_add. - Add some code for distinguishing between a shared library and other - objfiles. This appears to be a prelude to thread local storage. - (som_solib_load_symbols): Changes to printf statement - enclosed by SOLIB_DEBUG ifdef. - (som_solib_add): Change comment to correctly specify path - to end.o -- /opt/langtools/lib/end.o. changes to printf statement - enclosed by SOLIB_DEBUG ifdef. - Removed several SOLIB_DEBUG ifdefs and the associated printfs. - Add code to find the start address for the object file's thread - local storage - (som_solib_create_inferior_hook): Fix warning messages use correct - path to end.o -- /opt/langtools/lib/end.o. Change control flow. - No longer user early returns from function is cases of error. - (reset_inferior_pid): New function - (som_solib_remove_inferior_hook): New function - (so_lib_thread_start_addr): New function. used for tsd. - - * somsolib.c: Removed references to ASSERT macro. - - * somsolib.c: Add debugging macro. - (struct som_solib_mapped_entry): Add new field tsd_start_addr. - (struct so_list): Added new field solib_addr. - (som_solib_add_solib_objfile): New function. - (som_solib_load_symbols): Rewritten. - (som_solib_add): Make sure we don't load the symbols in if the - threshold was exceeded. - (som_solib_get_solib_by_pc): New function. Return the address of - handle of the shared library. - (som_solib_restart): Disable breakpoints at restart. - (_initialize_som_solib): Set threshold to 100 megabytes. - - * somsolib.c: Add include of fcntl.h so that O_RDONLY is defined. - - * somsolib.h (DISABLE_UNSETTABLE_BREAK): New macro. - (PC_SOLIB): New macro. - - * somsolib.h: - (SOLIB_CREATE_CATCH_LOAD_HOOK): Define - (SOLIB_CREATE_CATCH_UNLOAD_HOOK): Define - (SOLIB_HAVE_LOAD_EVENT): Define - (SOLIB_LOADED_LIBRARY_PATHNAME): Define - (SOLIB_HAVE_UNLOAD_EVENT): Define - (SOLIB_UNLOADED_LIBRARY_PATHNAME): Define - (SOLIB_IN_DYNAMIC_LINKER): Define - (SOLIB_RESTART): Define - - * somsolib.h: - (SOLIB_REMOVE_INFERIOR_HOOK): New macro. defined to use - som_solib_remove_inferior_hook. - - * somsolib.h: - (som_solib_create_catch_load_hook) - (som_solib_create_catch_unload_hook) - (som_solib_have_load_event) - (som_solib_loaded_library_pathname) - (som_solib_have_unload_event) - (som_solib_unloaded_library_pathname) - (som_solib_in_dynamic_linker) - Fix prototypes to use type names, not parameter names. - - * source.c (find_source_lines): Make non static. - (open_source_file): Ditto. - (source_full_path_of): New function. - (print_source_lines): Rename to print_source_lines_base and make - static; formatting. - (print_source_lines): New function. - (forward_search_command): Tui changes. - (reverse_search_command): Tui changes. - (_initialize_source): Add xdb and dbx compatibility commands. - - * source.c (list_command): Handle case of odd number of source - lines to display. - - * source.c: - (source_full_path_of): New function. file was overlooked - in merge ;-/. - - * stack.c (func_command): Make high bound be <, not <=. - - * stack.c (_initialize_stack): For the backtrace command, delete - the help line about usage, since this has to be a valid help - message for the 'where' command too. - - * stack.c (current_frame_command): Add a check for the - existance of a stack. If there is no stack produce an - error message and exit. - - * stack.c (down_silently_base, up_silently_base, - args_plus_locals_info, print_frame_info_base, - print_stack_frame_base, print_stack_frame_base_stub): Declare. - (print_frame_local_vars): Add'l parameter. - (print_stack_frame_stub): New version created, old version renamed - to show_and_print_stack_frame_base_stub. - (print_stack_frame_base_stub, print_only_stack_frame_stub, - show_and_print_stack_frame, print_only_stack_frame, - stack_publish_stopped_with_no_frame, print_frame_info, - show_stack_frame, backtrace_full_command, args_plus_locals_info, - select_and_print_frame, select_and_maybe_print_frame, - current_frame_command, func_command): New functions. - (backtrace_command): New function, old renamed to - backtrace_command_1. - (print_block_frame_locals, print_frame_local_vars): Additional - parameter, number of tabs. - (up_silently_command): New function, old renamed to - up_silently_command_base. - (down_silently_command): New function, old renamed to - down_silently_base. - (_initialize_stack): Register new commands based on values of - xdb_commands and dbx_commands variables. - - * stack.c (func_command): Make high bound be <, not <=. - - * stack.c (parse_frame_specification): Fix prototype to match - function definition. - (show_and_print_stack_frame_stub): Fix name. - (select_and_print_frame): Change uncaught tuiDO call. - - * stack.c (up_silent_base): Rename from up_silently_command_base. - - * symfile.c (symbol_file_command): Only call SOLIB_RESTART if it's - defined. - - * symfile.c (add_psymbol_with_dem_name_to_list): New function. - Adds a symbol with a long value to a psymtab. Differs from - add_psymbol_to_list in taking both a mangled and a demangled name. - - * symfile.c (compare_psymbols): Call strcmp directly, instead of - using macro. - - * symfile.c (symbol_file_add): Reindent portions. - (symbol_file_command): Add call to tuiDo. - - * symfile.c (symbol_file_command): Only call SOLIB_RESTART if it's - defined. - - * symfile.c (symfile_bfd_open): Add code to call PXDB on hpux, if - the file has not already been processed by pxdb. - Added define USE_PXDB. - - * symfile.c (symfile_bfd_open): Change parenthesis positioning - around call to hpread_pxdb_check. - - * symfile.c (symfile_bfd_open): Make not static. - (RESET_HP_UX_GLOBALS): New macro. Resets globals when new symbol - file loaded. - (USE_PXDB): Not needed. Removed. - (symbol_file_add): Add HP specific code to deal with pxdb. - (symbol_file_command): Reset HP specific globals if new symbol file - loaded. - (symfile_bfd_open): Comment out checking for pxdb. - (reread_symbols): Reset HP specific globals. - - * symfile.c (symfile_bfd_open): Uncomment hpus specific code. - - * symfile.c: - (symbol_file_add): Add user_loaded and is_solib parameters. - fixed number of parameters in call to allocate_objfile - (symbol_file_command): Added call to SOLIB_RESTART macro. - fixed number of parameters in calls to symbol_file_add. - (add_symbol_file_command): Fixed number of parameters in calls to - symbol_file_add. - - * symfile.c: Added prototype for hpread_pxdb_check. - - * symfile.c: Changed HPUX_SNAP1 ifdef to HPUXHPPA. enclosed calls to - RESET_HP_UX_GLOBALS with an HPUXHPPA ifdef - - * symfile.h (symfile_bfd_open): Add protptype. - - * symfile.h: Add prototype for add_psymbol_with_dem_name_to_list. - - * symfile.h: Clarify purpose of auto_solib_add. - - * symmisc.c (maintenance_print_symbols): Call gdb_fclose, not - fclose on a GDB_FILE* during cleanup. - (maintenance_print_psymbols): Call gdb_fclose, not fclose on a - GDB_FILE* during cleanup. - (maintenance_print_msymbols): Call gdb_fclose, not fclose on a - GDB_FILE* during cleanup. - - * symmisc.c (maintenance_print_symbols): Gdb_fclose now takes a - GDB_FILE ** parameter. Fix the local GDB_FILE variables and the - call to make_cleanup. - (maintenance_print_psymbols): Ditto - (maintenance_print_msymbols): Ditto - - * symmisc.c (print_objfile_statistics): Close quotes in - output strings. - - * symmisc.c: - (Print_symbol): Add LOC_INDIRECT to switch statement - (print_partial_symbols): Add LOC_INDIRECT to switch statement - - * symtab.c (find_pc_sect_psymtab): High bounds should be <, not <=. - (find_pc_sect_symtab): Ditto. - - * symtab.c (hp_som_som_object_present): New flag to indicate HP - compiled code. - (find_pc_sect_psymtab): Change tests to make sure we are checking - the texthigh adress as well. - (lookup_transparent_type): New function. Look up a type name - in the struct_namespace. The type returned must not be opaque. - (find_pc_sect_symtab): Make sure we check the address 'pc' itself, - too. - (find_addr_symbol): Prepare to handle LOC_INDIRECT address class, but - leave it commented out. - (find_pc_sect_line): Return correct information if pc is in import - or export stub (trampoline). - (decode_line_1): Skip two chars, if they are '$$'. Like for HP's - $$dyncall. Handle cases in which varaible and function names can start - with $. - (overload_list_add_symbol): If cannot demangle name, use it as is. - Free string after use. - (make_symbol_overload_list): Initialize oload_name to NULL and - oload_name_len to 0. If demangle not successful, use name as it is. - Free string after use. - - * symtab.c (lookup_symbol): Changed call to find_pc_sect_symtab, - to the original find_pc_symtab, in HP added fragment. - - * symtab.c (lookup_symbol): Change HPUX_SNAP1 ifdef to a HPUXHPPA ifdef - - * symtab.c (lookup_symbol): Ifdef the searching of symbol in the - minimal symbol tables, for hpux we move this check at the end - of the function. - Before we error out if symbol is not found in the symtab, look - in the statics. - Before erroring out if static symbol not found look in the globals. - - * symtab.c (lookup_symbol): Return symbol as soon as found. - (decode_line_1): Check whether we have a conditional break. Temporarily - remove it from the line, to not confure perenthesis checking. - Handle namespaces. - (overload_list_add_symbol): New function. Overload - resolution support. - (make_symbol_overload_list): Ditto. - - * symtab.c: - (find_template_name_end): New prototype decl. - (lookup_symbol): When a global or static symbol shows up in the - psymtab table, but not the symtab table, tell the user that - the symbol may be an inlined function or a template function and - provide some guidance to the user about how to more fully - specify the symbol. - (lookup_transparent_type): When a global or static symbol shows up - in the psymtab table, but not the symtab table, tell the user that - the symbol may be an inlined function or a template function and - provide some guidance to the user about how to more fully - specify the symbol. - (decode_line_1): Handle template function specification when decoding a - line. May need to be ifdefed for HP's aCC? - (_initialize_symtab): Handle dbx commands. - - * symtab.h (address_class): Add new address calss for - LOC_THREAD_LOCAL_STATIC and LOC_INDIRECT. - (lookup_transparent_type): Add prototype. - (exception_event_kind): New enum for exception catchpoints. - (exception_event_record): New structure for exception catchpoints. - (CURRENT_EXCEPTION_KIND): New macro. - (CURRENT_EXCEPTION_CATCH_SAL): New macro. - (CURRENT_EXCEPTION_CATCH_LINE): New macro. - (CURRENT_EXCEPTION_CATCH_FILE): New macro. - (CURRENT_EXCEPTION_CATCH_PC): New macro. - (CURRENT_EXCEPTION_THROW_SAL): New macro. - (CURRENT_EXCEPTION_THROW_LINE): New macro. - (CURRENT_EXCEPTION_THROW_FILE) new macro.: - (Current_EXCEPTION_THROW_PC): New macro. - - * symtab.h(make_symbol_overload_list): Add prototype. - - * symtab.h: - (symbol_file_add): Add new params to function decl. - - * target.c (cleanup_target): Changed casting of default functions for - to_has_forked, to_has_vforked, to_pid_to_exec_file to get rid of - warnings. - - * target.c (cleanup_target): Changed the default functions for - to_pid_to_exec_file and to_core_file_to_sym_file - - * target.c (cleanup_target): Fixed PARAMS for to_has_syscall_event - - * target.c (cleanup_target): Syntax error, mismatched paranthesis. - - * target.c: - (Default_clone_and_follow_inferior): New funct prototype declaration - and function definition - (dummy_target): More target_ops vector changes for HPUX - new fields. ifdefed for HPUX_SNAP2. New fields are - to_post_wait, to_post_startup_inferior - to_acknowledge_created_inferior, to_clone_and_follow_inferior, - to_post_follow_inferior_by_clone, to_create_catch_fork_hook, - to_create_catch_vfork_hook, to_has_forked, to_has_vforked, - to_post_follow_vfork, to_pid_to_exec_file - (de_fault): Add new HPUX specific target_ops operations to - the de_fault macro - (INHERIT): Add new HPUX specific target_ops operations to the - INHERIT macro - (find_default_clone_and_follow_inferior): New funct definition - (debug_to_post_wait): New funct - (debug_to_post_startup_inferior): New funct - (debug_to_acknowledge_created_inferior): New funct - (debug_to_clone_and_follow_inferior): New funct - (debug_to_post_follow_inferior_by_clone): New funct - (debug_to_create_catch_fork_hook): New funct - (debug_to_create_catch_vfork_hook): New funct - (debug_to_has_forked): New funct - (debug_to_has_vforked): New funct - (debug_to_post_follow_vfork): New funct - (setup_target_debug): Initialize new target_ops vector fields. - - * target.c: - (Cleanup_target): Fixed the return type on a few of the - default function values. - - * target.c: - (Dummy_target): Add 3 new fields - (nosupport_runtime): New function, used in cleanup_target - (cleanup_target): Changes in the de_fault macro, both to - accomodate the new target_ops vector fields and to use - more accurate default functions. - (update_current_target): Add new target_ops vector fields to the - INHERIT macro - (generic_mourn_inferior): The call to breakpoint_init_inferior now takes a - parameter - (normal_pid_to_str): Adding a \0 to the end of buf. - (debug_to_has_syscall_event): New func - (debug_to_enable_exception_callback): New func - (debug_to_get_current_exception_event): New func - (setup_target_debug): Initialize the 3 new target_ops vector fields - - * target.c: - (Struct signals): Fix message associated with SIGRETRACT. - - * target.c: - (Dummy_target): Fix syntax error - (cleanup_target): Changed the default values for the new - target_ops vector fields. HP folks inappropriately set - most of them to noprocess(). They should be a mixture - of ignore() and return_zero(). - - * target.c: - (Dummy_target): Add new target_ops vector fields and their initializations - (cleanup_target): Added new new target_ops vector fields to the de_fault - macro definition. - (update_current_target): Added new new target_ops vector fields to the INHERIT - macro definition - (return_one): New function, used by the de_fault macro - (debug_to_post_attach): New function - (debug_to_wait): Added new cases: Target_WAITKIND_FORKED, TARGET_WAITKIND_VFORKED, - TARGET_WAITKIND_EXECD - (debug_to_insert_fork_catchpoint): New function - (debug_to_remove_fork_catchpoint): New function - (debug_to_insert_vfork_catchpoint): New function - (debug_to_remove_vfork_catchpoint): New function - (debug_to_can_follow_vfork_prior_to_exec): New function - (debug_to_insert_exec_catchpoint): New function - (debug_to_remove_exec_catchpoint): New function - (debug_to_core_file_to_sym_file): New function - (setup_target_debug): Give new fields in current_target target_ops vector values. - - * target.c: Hp merge, 4/15/98 snapshot - There are new target_ops fields that pertain only - to HPUX. All the changes relate to this. First, - new fields are added to the dummy_target target_ops - vector: To_require_attach, to_require_detach. - - * target.c: Remove HPUX_SNAP1 and HPUX_SNAP2 ifdefs - - * thread.c (info_threads_command): Call print_only_stack_frame - instead of print_stack_frame. - (_initialize_thread): Make t an alias for thread only if - xdb_commands is not set. - - * thread.c (thread_command): If no arguments, don't generate an - error, instead tell the user which thread is current. - (info_threads_commands): Don't lose the users position within the - current thread -- remember it and then restore it. - - * thread.c: - (struct thread_info): Add stepping_through_sigtramp field - (add_thread): Initialize stepping_through_sigtramp field - (load_infrun_state): Add stepping_through_sigtramp param and - make sure it gets assigned a value. - (save_infrun_state): Add stepping_through_sigtramp param and - make sure that the value gets saved. - (info_threads_command): Ifdefing some local variables and - code for HPUXHPPA. HP folks want print the tid rather than pid? - Also, looks like the HP folks solved the same thread switching - problem that 4.17 solves. Taking 4.17. - (restore_current_thread): Print out the current frame after - switching threads. - (thread_apply_all_command): Ifdefing a print statement for - HPUXHPPA. The HP folks want to print out a tid rather than pid? - (thread_apply_command): Ifdefing a print statement for - HPUXHPPA. The HP folks want to print out a tid rather than pid? - (thread_command): Decided not to take HP change. - - * thread.c: Fixing gdb core dump problem causing many testsuite - failures. - (add_thread): Remove call to bpstat_clear, initialize - tp->stepping_through_solib_catchpoints = NULL; - - * thread.c: Changes for catchpoints, shared libaries, - (thread_info): Additional fields in the thread_info struct - for stepping_through_solib_after_catch and - stepping_through_solib_catchpoints. - (add_thread): Initialize the new thread_info fields. - (load_infrun_state): Additional parameters for handling - catchpoints and shared libraries. - (save_infrun_state): Additional parameters for handling - catchpoints and shared libraries. - - * top.c (command_loop): Initialize space_at_cmd_start to 0. - (set_prompt): New function. - (togglelist, stoplist): New command lists. - (command_loop): Tui changes -- paranoia to make sure - insert mode is off when not editing. - (quit_force): Clean up tui on exit. - (init_main): Make definition of info status command dependent upon - dbx mode not being set. - (fputs_unfiltered_hook): Changed stream parameter from FILE - to GDB_FILE - (flush_hook): Changed stream parameter from FILE to GDB_FILE - - * top.h (set_prompt): Declare. - - * typeprint.c (whatis_exp): Decide real runtime type. For the vtable - case. - - * utils.c (query): Changes to prevent cursor from jumping around in the - TUI. Call tuiBufferGetc explicitly, rather than passing it - into tuiDo. The tuiDo function does some additional work - that is inappropriate when handling queries. - (GDB_FILE_ISATTY): New macro that takes a GDB_FILE param and - determines whether or not it's using a tty. - (gdb_file_isatty); called by the GDB_FILE_ISATTY macro. Does - the actual work - (init_page_info): Call GDB_FILE_ISATTY rather than ISATTY - (print_spaces): Fix parameter to fputc. fix call to - gdb_file_adjust_strbuf. - (gdb_file_init_astring): Fix parameter to xmalloc - (gdb_file_deallocate): New function to deallocate - a GDB_FILE object and possibly a string buffer - (gdb_file_init_astring): Initialize buffer as the empty - string. Indent GNU style. - (gdb_fopen): Gdb_fopen is called if the GDB_FILE object is - actually afile rather than astring. The routine now allocates space - for a GDB_FILE object and initializes its fields in addition to - performing an fopen. - (gdb_flush): Fix the parameter passed into fflush. It's now - stream->ts_filestream. - (gdb_fclose): Pass in an object of type GDB_FILE **. Fix parameter - to fclose. It's now tmpstream->ts_filestream. Make sure to free - the GDB_FILE object and set the GDB_FILE * object to NULL. - (gdb_adjust_strbuf): New function. Determine if the current - ts_strbuf field contains sufficient space to concatenate a string - of length n on the end. If not, then reallocate the ts_strbuf. - (print_spaces): Check to see if the GDB_FILE is afile or - astring. If it is astring, then adjust the size of the ts_strbuf - field and concatenate the correct number of spaces onto the end of - the buffer. Otherwise continue to use fputc. - (gdb_file_get_strbuf): New function. return a ptr to the ts_strbuf - field in a GDB_FILE object. - (gdb_file_init_astring): New function to allocate space for and - initialize a GDB_FILE object when it is an astring. - (set_width): Declare it. - (pagination_enabled): Define it. - (query): Tui changes. - (init_page_info, set_width): New functions. - (set_width_command): Call set_width. - (_initialize_utils): Replace termcap stuff with call to - init_page_info; if xdb_commands set, define am and sm commands; - define pagination as a set/show command. - (vfprintf_maybe_filtered): Change FILE to GDB_FILE. - (fputs_maybe_filtered): Ditto. - (print_spaces): Ditto. - (gdb_printchar): Ditto. - (gdb_flush): Ditto. - (fputs_filtered): Ditto. - (vfprintf_filtered): Ditto. - (vfprintf_unfiltered): Ditto. - (fprintf_filtered): Ditto. - (fprintf_unfiltered): Ditto. - (fprintfi_filtered): Ditto. - (print_spaces_filtered): Ditto. - (fprintf_symbol_filtered): Ditto. - (gdb_fclose): New function. - - * valops.c (call_function_by_hand): Assign to param_type only - if function has parameters. - - * valops.c (call_function_by_hand): Ifdef the - HP_COMPILED_TARGET stuff. - (value_arg_coerce): Ditto. - - * valops.c (call_function_by_hand): Make sure param_type is - initialized to NULL. - - * valops.c (find_rt_vbase_offset): Add parameter to value_at. - (value_rtti_type): Ditto. - (value_full_object): Ditto. - - * valops.c (search_struct_field_aux): Fixed mismatching parenths - - * valops.c (search_struct_field_aux): Make sure TYPE_TAG_NAME - is not null before copying it. - - - * valops.c (search_struct_field_aux): Set found_class_name to null - if class has no name (anon unions case). Adjust base_addr - computation. - - * valops.c (value_arg_coerce): Change final arg to int. - - * valops.c (value_arg_coerce): Remove the conditional on HP - compiled target, for doing coercion of float to double. Removed - third parameter, using_gcc. - (call_function_by_hand): Do not use HP_COMPILED_TARGET, just - use the gcc_compiled variable. - - * valops.c (value_cast): Take case of the enclosing_type and - pointer_to_offset fields. - (value_at): Use VALUE_CONTENTS_ALL_RAW - (value_fetch_lazy): Ditto - (value_assign): Handle enclosing_type, embedded_offset and - pointed_to_offset fields. - (value_repeat): Use VALUE_CONTENTS_ALL_RAW and VALUE_ENCLOSING_TYPE. - (value_ind): Set enclosing_type and embedded_offset correctly, - for a pointer value being dereferenced. Target memory bytes - corresponding to the size of the enclosing type are retreived. - (value_addr): Handle enclosing_type and pointed_to_offset. - (value_push): Use VALUE_CONTENTS_ALL and VALUE_ENCLOSING_TYPE. - (value_arg_coerce): Coerce floats to doubles only if gcc was not - used to compile the target. - (call_function_by_hand): Handle pointers to functions as paramters. - (value_array): Use VALUE_CONTENTS_ALL and VALUE_ENCLOSING_TYPE. - (search_struct_method): Produce more informative error message. - (find_rt_vbase_offset): Deal with negative offsets. - (value_find_oload_method_list): New function. Return the list of - overloaded methods of a specified name. - (find_method_list): New function. Search through the methods of an - object (and its bases) to find a specified method. - (value_full_object): New function. Given a value, check its real - run-time type. - (value_rtti_target_type): New function. Given a pointer value V, find - the real (RTTI) type of the object it points to. - (value_rtti_type): New function. Find the real run-time type of a - value using RTTI. - - * valops.c: Include gdbcmd.h - Set global overload_resolution to 0. - (find_function_in_inferior): Modify error message. - (value_allocate_space_in_inferior): Modify error message. - (value_cast): Deal with HP/aCC peculiarities. - (value_of_variable): Use SYMBOL_SOURCE_NAME instead of SYMBOL_NAME. - (value_addr): Modify address value by adding the embedded offset. - (value_ind): Modify the address of the object by the pointed_to_offset. - (call_function_by_hand): Do not do any extra alignment if not needed. - Fetch the return value from the stack rather then from the register, - for the hppa architecture. - (search_struct_field): Rewritten. Now this function uses - search_struct_field_aux to do all the work. - (search_struct_field_aux): New function. This is the old - search_struct_field rewritten. - (find_rt_vbase_offset): Give error if virtual table pointer is not good. - (find_overload_match): New function. Find the best function that - matches on the argument types according to the overload resolution - rules. - (_initialize_valops): Add new set/show command for overload-resolution. - - * value.h (VALUE_POINTED_TO_OFFSET): New macro. - Add field pointed_to_offset to value structure. - Add prototypes for new functions in valops.c. - - * value.h (write_register_pid): Change prototype to match - function. - - * value.h: Hp merge, 4/15/98 snapshot - Added parameter to val_print func decl. - Added new macro, VALUE_EMBEDDED_OFFSET, and - new func decl, find_rt_vbase_offset, for C++ - support. - - * values.c (allocate_value): Allocate also for value_embedded_offset - and value_enclosing_type. - (value_copy): Copy value_embedded_offset and value_enclosing_type too. - Use all_raw in copying the value itself. - (value_primitive_field): Add handling of base subobjects. - - * values.c (value_copy): Copy the pointed_to_offset as well. - (allocate_value): Allocate the pointed_to_offset as well. - (value_virtual_fn_field): Rewrite. - - * values.c (value_primitive_field): Adjust embedded offset and - offset calculation. - - * values.c (value_static_field): Take into consideration that static - data members can be minimal symbols too. - - * values.c (value_virtual_fn_field): Fix call to value_at. - - * win32-nat.c (handle_load_dll): Added params to call to symbol_file_add. - - Other changes have to do with XDB compatability. Leave oout - for now. - - defs.h (vfprintf_filtered): Change FILE to GDB_FILE in decl. - (fprintf_filtered): Ditto. - (fprintfi_filtered): Ditto. - (vfprintf_unfiltered): Ditto. - (fprintf_unfiltered): Ditto. - - infcmd.c (_initialize_infcmd): If xdb_commands is set, make S an - alias for next and define R, lr, g. Define go. - - pyr-tdep.c (pyr_print_insn): Change FILE to GDB_FILE. - - - * breakpoint.c (create_temp_exception_breakpoint): #If it out -- - nothing calls it. - (bpstat_stop_status): Don't call SOLIB_HAVE_LOAD_EVENT if it's not - defined; don't call SOLIB_HAVE_UNLOAD_EVENT if it's not defined. - (bpstat_get_triggered_catchpoints): If we don't have shared - library support, then don't call SOLIB_LOADED_LIBRARY_PATHNAME nor - SOLIB_UNLOADED_LIBRARY_PATHNAME. - (watch_command_1): Don't require a run before a watch command - unless we're on HP [it's an HP OS bug, not a generic limitation] - (catch_load_command_1): Don't define if no shared libraries. - (catch_command_1): Don't claim to support fork catchpoints unless - CHILD_INSERT_FORK_CATCHPOINT is defined, don't claim to support - vfork catchpoints unless CHILD_INSERT_VFORK_CATCHPOINT is defined, - don't clain to support shared library load catchpoints if shared - libraries aren't supported, and don't claim to support exec - catchpoints unless CHILD_INSERT_EXEC_CATCHPOINT is defined - - There are new target_ops vector fields that pertain - only to HPUX. Added the to_require_attach and - to_require_detach fields to exec_ops. These new - fields are ifdef'ed for HPUX_SNAP1. - - * breakpoint.h: - Fix compile error in enum bptype. - - * coff-solib.h: - Fixed a number of macro definitions. SOLIB_LOADED_LIBRARY_PATHNAME, - SOLIB_HAVE_LOAD_EVENT, SOLIB_HAVE_UNLOAD_EVENT, - SOLIB_UNLOADED_LIBRARY_PATHNAME, SOLIB_IN_DYNAMIC_LINKER. These - macros are only meaningful (for now) for SOM. So, all - the macros were defined as error(...), but were used in - conditions. This caused the compile to crap out. I redefined - these (for now) to be 0. - - * procfs.c: - (procfs_create_inferior): Fix call to fork_inferior -- need another - parameter. - - * solib.h: - Fixed a number of macro definitions. SOLIB_LOADED_LIBRARY_PATHNAME, - SOLIB_HAVE_LOAD_EVENT, SOLIB_HAVE_UNLOAD_EVENT, - SOLIB_UNLOADED_LIBRARY_PATHNAME, SOLIB_IN_DYNAMIC_LINKER. These - macros are only meaningful (for now) for SOM. So, all - the macros were defined as error(...), but were used in - conditions. This caused the compile to crap out. I redefined - these (for now) to be 0. - - * valops.c: - (search_struct_field): Undeclared local variable, "assigned". - (find_rt_vbase_offset): Fixed call to value_at - - * value.h: Fix signature for find_rt_vbase_offset funct decl - (missing a param) - -Wed Dec 30 17:48:12 1998 Stan Shebs <shebs@andros.cygnus.com> - - From J.T. Conklin <jtc@redbacknetworks.com>: - * i386-stub.c: Fix error string in last change. - -1998-12-30 Jason Molenda (jsm@bugshack.cygnus.com) - - * utils.c: <Readline/readline.h> instead of "readline/readline.h". - - * configure.in (TERM_LIB): Search for the appropriate term library - on the host system. - * configure: Regenerated. - * Makefile.in (TERMCAP): Set based on autoconf check. - * config/*/*.mh: Don't override TERMCAP setting. - -Wed Dec 30 17:23:14 1998 Mark Alexander <marka@cygnus.com> - - * value.c (value_virtual_fn_field): Handle the situation where - vtbl is a pointer to a structure instead of a pointer to an array. - -Mon Dec 28 17:43:36 1998 David Taylor <taylor@texas.cygnus.com> - - The following changes were made by Jim Blandy <jimb@cygnus.com>, - Edith Epstein <eepstein@cygnus.com>, Elena Zannoni - <ezannoni@cygnus.com> Stan Shebs <shebs@cygnus.com>, and David - Taylor <taylor@cygnus.com>, as part of the project to merge in - changes originally made by HP; HP did not create ChangeLog - entries. - - * c-lang.h (cp_print_value_fields): Update prototype; fixed - prototype decl for c_val_print function -- it needed an - embedded_offset param; fixed prototype of cp_print_value_fields. - Include value.h. - (C_LANG_H): Define. - - * c-valprint.c (c_val_print): Add new parameter embedded_offset. - Add embedded_offset to valaddr in function calls. fix calls to - val_print, and cp_print_value_fields. Attempt to determine the - real type of the object to be printed. fixed call to - cp_print_value_fields. process TYPE_CODE_METHOD as well. moved - call to check_typedef out of conditional. add embedded offset - param to val_print call. - - (c_value_print): Add new parameter to call to val_print. Handle - pointer to class case. Ensure that const char *, const unsigned - char * come out without the type but the volatile variants and the - signed variants don't. - - * ch-lang.h (chill_val_print): Add parameter to decl. - - * ch-valprint.c: The various print routines have an additional - parameter. Currently, the new parameter is only used when printing - C++ expressions. So, in ch-valprint.c, the new parameter is always - 0. Changes in calls to val_print, chill_val_print, c_val_print - Affected functions are chill_val_print_array_elements, - chill_val_print, chill_print_value_fields, chill_value_print. - - * cp-valprint.c add vtable pointers names for aCC (HP) compiler. - (cp_print_class_method): Print message for HP/aCC case. - (cp_print_class_member): Add comments. - (cp_print_value): Adjust address computations for virtual base - classes. add new parameter 'offset'. Find correct offset for - base class in HP/aCC case. Change call to cp_print_value_fields - to have extra par. - (cp_print_value_fields): Do not print also if the only field is - the vtable pointer. Print out vtable ptr, for HP/aCC compiled - case. do not print leading '=' in case of anonymous union, or - struct. add new parameter 'offset'. Do not print the vtable - pointer as a member, in the HP aCC case. Changed calls to - val_print to have extra parameter. - (cp_print_hpacc_virtual_table_entries): New function. Print vtable - entries, in HP/aCC compiled case. - (cp_print_static_field): Change call to cp_print_value_fields, and - val_print. - - * d30v-tdep.c (d30v_print_register): Add embedded_offset param - to val_print call. - - * defs.h: Additional include files included when TUI is defined. - (gdb_file_isatty): New function decl. - (GDB_FILE): If TUI is defined, define a structure rather - than making this an alias for FILE. - (gdb_stdout, gdb_stderr): If TUI is defined, then define these - as pointers to variables of type GDB_FILE rather than making them - be aliases for stdout and stderr. - (TUIDO): Add definition conditionalized on definition - (or lack thereof) of TUI. - (command_class): Add two additional values. - (precision_type): New enum. - (gdb_fclose): Add decl. - (store_address): Change prototype to match function. - (tui_version, xdb_commands, dbx_commands): Add decls. - (gdb_file_deallocate): New function decl - (pa_do_strcat_registers_info): New function decl. - (streamtype): New enumerated type to distinguish between output to - a FILE and output to a buffer. - (tui_stream): New struct type, named GDB_FILE. - (gdb_stdout): Of type GDB_FILE, will pass this around gdb rather - than stdout. - (gdb_stderr): Of type GDB_FILE, will pass this around gdb rather - than stderr. - (fputs_unfiltered_hook): Change stream parameter from FILE to - GDB_FILE. - (flush_hook): Change stream parameter from FILE to GDB_FILE. - (gdb_fclose): Fix decl for gdb_fclose; parameter is now of - type GDB_FILE **. - (gdb_file_adjust_strbuf): New function decl. function lives - in utils.c. - (gdb_file_init_astring): New function decl. function lives - in utils.c. - (gdb_file_get_strbuf): New function decl. function lives in - utils.c. - (source_full_path_of): Declare. - - * exec.c (_initialize_exec): Make definition of file command be - dependent upon dbx_commands not being set. - (exec_file_attach): New function. - (exec_file_command): Call it. - (exec_ops): Add new target vector fields. - - * f-lang.h (f_print_type): Change FILE to GDB_FILE in decl. - (f_val_print): Ditto. - (f_val_print): Add parameter to the function decl. - - * f-valprint.c (_initialize_f_valprint): If xdb_commands is set, - define lc command. - (f77_create_arrayprint_offset_tbl): Change FILE to GDB_FILE. - (f77_print_array): Ditto. - (f77_print_array_1): Ditto. - (f_val_print): Ditto. - (f_val_print): Add a parameter; this new parameter is currently - only non-zero when handling C++ expressions. In this file its - value is always 0. changed fflush to gdb_flush. - - * gnu-nat.c: (init_gnu_ops): Add new target vector fields. - (gnu_create_inferior): Add param to fork_inferior call. - - * hppa-tdep.c (after_prologue): If f is NULL, don't dereference - it. if no debug info, return zero telling caller that we need to - find the end of the prologue via the hard way (instruction - examination). - (find_unwind_entry): Avoid dereferencing a null - pointer. - (hppa_pid_to_exec_file): Deleted -- no longer used. - (hppa_prepare_to_proceeed): Add prototype. - (read_unwind_info): Purecov comments, bug fixes. - (find_unwind_entry): Purecov comments, bug fixes. - (find_stub_with_shl_get): Purecov comments. - (frame_chain): Additional parens. - (hppa_push_arguments): Changes to commented out version of routine. - (hppa_fix_call_dummy): Purecov comments, fix location of end.o. - (in_solib_call_trampoline): Purecov comments. - (in_solib_return_trampoline): Purecov comments. - (setup_d_pid_in_inferior): Fix location of end.o. - (initialize_hp_cxx_exception_support): Fix location of end.o. - (child_enable_exception_callback): Purecov comments. - (pa_do_strcat_registers_info): Has a new parameter, precision, - which is passed into the call to pa_strcat_fp_reg to indicate - whether to display the floating point registers using - single or double preceision. - (pa_strcat_registers): Introduce local variable, precision, and - pass it into call to pa_strcat_fp_reg. - (pa_strcat_fp_reg): Modified function. New parameter, precision, - used by function to decide whether to use single or double - precision. Also add the code to put a double precision value - into a buffer. - (pa_do_strcat_registers_info): New routine. called by - tui/tuiRegs.c:_tuiRegisterFormat to place a register name - and value into a string buffer. Interface may change in - future. Checking this in so that we have something - functional for HP. - (pa_strcat_registers): New routine, called by - pa_do_strcat_registers_info. Does same thing as - pa_print_registers except it takes a stream parameter. - This routine should disappear in future. Checking in - so that we have something functional to give HP - (pa_strcat_fp_reg): New routine, called by - pa_do_strcat_registers_info and pa_strvat_registers - to place a floating point register name and value into - a buffer. This interface may change in future. - Checking in so that we have something functional to give HP. - (pa_print_fp_reg): Change prototype to match def'n. - (pa_register_look_aside): Fix comment immediately before function. - Changes to better support stack unwinding, reading and writing - registers for HPUX. New includes ptrace.h, bfd.h, dl.h. - (internalize_unwinds): Initialize new fields in table. - (read_unwind_info): Entries in the table are now more complex - structures. References of the form ...->table[index].stub_type are - now ...->table[index].stub_unwind.stub_type. - (find_proc_framesize): Add a check for pc == 0. - (rp_saved): Entries in the table are now more complex - structures. References of the form ...->table[index].stub_type are - now ...->table[index].stub_unwind.stub_type. - (frameless_function_invocation): Stub_type becomes - stub_unwind.stub_type - (saved_pc_after_call): Stub_type becomes stub_unwind.stub_type - (hppa_frame_saved_pc): Stub_type becomes stub_unwind.stub_type - (frame_chain_valid): Stub_type becomes stub_unwind.stub_type - (hppa_call_dummy): Stub_type becomes stub_unwind.stub_type - (pa_print_fp_reg): Additional params to call val_print - (in_solib_call_trampoline): Stub_type becomes - stub_unwind.stub_type - (in_solib_return_trampoline): Stub_type becomes - stub_unwind.stub_typ - (skip_trampoline_code): Additional code to handle external - dyncalls. Also stub_type becomes stub_unwind.stub_type - (hppa_pid_to_exec_file): New funct. FOr HPUX 10.0 and beyond there - is an explicit ptrace request for getting the pathname associated - with a process id (pid). - (hppa_pid_to_exec_file): Remove unwanted param from call to - call_ptrace. - (args_for_find_stub): New structure. - (find_unwind_entry): Deal with null input pc value. - (rp_saved): Ditto. - For the import stub, return -24 always. - (hppa_frame_saved_pc): Save old pc value, to detect we are in a loop. - (init_extra_frame_info): Use TARGET_READ_FP. - (frame_chain): Include thread support. - If the caller's pc is zero, we lose and return, just like stack - bottom. - Disable warning about being unable to find unwind info. - (hppa_push_arguments): Rewrite. - (hppa_value_returned_from_stack): New function. Handles returning - a value larger than 64 bits, stored on the stack. - (find_stub_with_shl_get): New function. To look up symbols in shlibs. - (cover_find_stub_with_shl_get): New function. Cover routine for - find_stub_with_shl_get to pass to catch_errors. - (hppa_fix_call_dummy): Comment out old stub mechanism. - Rewrite using dyncall. - (target_read_fp): New function. - (pa_do_registers_info): Floating point registers start at FP4. - (pa_print_registers): Use FP4_REGNUM instead of 72. - (skip_trampoline_code): Do machine instruction matching for PA2.0. - (setup_d_pid_in_inferior): New function. Exception handling support. - (initialize_hp_cxx_exception_support): Ditto. - (child_enable_exception_callback): Ditto. - (child_get_current_exception_event): Ditto. - - * hpux-thread.c (hpux_thread_ops): Add new target vector fields. - - * infcmd.c: Include objfiles.h. - (attach_command): New local variable, exec_file, add code to - determine exec_file from pid if exec_file is not already known, - call new target operation, target_post_attach -- a no-op unless - on HPUXHPPA. - (detach_command): After detaching, do a SOLIB_RESTART. - (objfiles.h): Fix typo on include line. - (run_command): Only call SOLIB_RESTART if it's defined. - (detach_command): Ditto. - (run_command): If program has already been started, and decide - to restart it, the kill the target, flush the caches, - call init_wait_for_inferior. Also purge old solib objfiles. - (run_stack_dummy): Add calls to - disable_watchpoints_before_interactive_call_start and - enable_watchpoints_after_interactive_call_stops. - (finish_command): Alter code handling the evaluation and printing - of the target function's return value. - (attach_command): When given a pid, but no exec file, try to - determine the exec file from the process. If the process does not - record a full path name, try to qualify the filename against the - source path. - (_initialize_infcmd): Add some verbiage about how to use the - attach command. - (do_registers_info): Changed calls to val_print - made the symfile.h include preceed the - objfiles.h include. The other ordering caused a - compile problem (incompletely defined types). - - * inftarg.c (child_post_attach): Fix decl, make static. - (proc_wait): Make globally visible. - (child_insert_fork_catchpoint, etc): Fix return type. - (child_detach_from_process): Declare. - (child_attach_to_process): Declare. - (child_stop): Make static to match decl. - (ptrace_him): Change prototype back to return int. - (ptrace_me): Remove debug output, pass NULL to fork_inferior if - not HPUX. - (proc_wait): function prototype and definition are enclosed by - proc_wait ifndef - (child_attach_to_process): New function, does most of the work - that child_attach used to do and some additional work to determine - whether gdb is already attached to the target how to react. - (child_attach): Altered. It's now a wrapper for - child_attach_to_process. - (child_require_attach): New function, called if should attach even - when gdb is already attached to target. - (child_detach_from_process): New function, does most of the work - that child_detach used to do and some additional work to determine - whether gdb is currently attached to the target. - (child_detach): Altered. It's now a wrapper for - child_detach_from_process. - (child_require_detach): New function, called if should try to - detach even when gdb is not attached to target. - (ptrace_him): Calls a new function, - target_acknowledge_forked_child. Currently, - target_acknowledge_forked_child, is only defined to do something - for HPUX. - (child_create_inferior): Changed call to fork_inferior. - (child_ops): Add to_require_attach and to_require_detach fields - to the child_ops target ops vector. - Some hacks for ttrace work: - (child_wait): Additional local variables, additional code in - while loop to check for process exited, process forked, - process vforked, process execd. - (child_thread_alive): John B. seems to think that the kill - call is inapproapriate for HPUX. - (child_attach_to_process): Using strtol rather than atoi. - no longer check for case where there is no known exec file. - (child_post_attach): New function, a default, a no-op. - (child_insert_fork_catchpoint): New function, a default, a no-op. - (child_remove_fork_catchpoint): New function, a default, a no-op. - (child_insert_vfork_catchpoint): New function, a default, a no-op. - (child_remove_vfork_catchpoint): New function, a default, a no-op. - (child_can_follow_vfork_prior_to_exec ):new function, a default, - a no-op. - (child_insert_exec_catchpoint): New function, a default, a no-op. - (child_remove_exec_catchpoint): New function, a default, a no-op. - (child_has_execd): New function, a default, returns 0. - (child_reported_exec_events_per_exec_call): New function, a - default, returns 1. - (child_has_exited): New function, a default. - (child_core_file_to_sym_file): New function, a default, returns NULL. - (child_ops): Initialize new target vector fields. - - * jv-lang.h: (Java_val_print): Add embedded_offset param to func - decl. - - * jv-valprint.c: Changing calls to val_print to accomodate new param. - (java_value_print): Add embedded_offset param to val_print call - (java_print_value_fields): Add embedded_offset param to val_print - call. - (java_val_print): Add embedded_offset param. alter call to - c_val_print to accomodate embedded_offset param. - - * language.c (lang_bool_type): Return builtin_type_bool in c++ - case. - (unk_lang_val_print): Add embedded_offset param to - prototype decl and definition. - - * language.h (LA_VAL_PRINT macro, la_val_print function decl): - altered to accomodate the new parameter to the various print - functions. - - * m2-lang.h (m2_val_print): Add a parameter to the function decl. - - * m2-valprint.c (m2_val_print): Add a parameter. - This parameter is currently only used when evaluating C++ - expressions. So, it is always 0 in this file. - - * m3-nat.c (m3_create_inferior): Add param to fork_inferior call - (m3_pid_to_exec_file): New function - (m3_ops): Add new target vector fields. - - * mac-nat.c (init_child_ops): Add new target vector fields. - - * mips-tdep.c: Chnages to accomodate additional parameter - to val_print. - (mips_print_register): Alter calls to val_print - - * monitor.c (monitor_write): Change stderr to gdb_stderr. - (monitor_remove_breakpoint): Ditto. - (init_base_monitor_ops): Add new target vector fields. - - * ppc-bdm.c (init_bdm_ppc_ops): Add new target vector fields. - - * printcmd.c (do_examine): When saving a value_ptr, remove it from - the list of value_ptr's to be freed automatically; when discarding - a previously saved value_ptr, free it. - (print_formatted): Update comments; add new comments. - (printf_command, print_insn): Purecov comments. - (_initialize_printcmd): Add assign as a command if dbx_commands is - set; create va as an alias for disassemble if xdb_commands is set. - (address_info): New cases LOC_INDIRECT and - LOC_THREAD_LOCAL_STATIC. - (display_command): If tui_version and exp starts with a '$', then - don't display it unless tui_vSetLayoutTo fails. - (disassemble_command): Add tuiDo calls. - (print_scalar_formatted): For integers that are long long, check - the print format and print out in binary octal, decimal, or - hex. Call the new print_*_chars functions in valprint.c - (print_frame_args): Altered calls to val_print, to reflect - additional parameter to val_print (case LOC_BASEREG_ARG). - - * procfs.c: (Procfs_init_inferior): Return value is now a void. - (procfs_ops): Add new target vector fields. - (procfs_create_inferior): Fix call to fork_inferior -- need another - parameter. - - * remote-adapt.c (adapt_open): Change stderr to gdb_stderr. - (adpat_insert_breakpoint): Ditto. - (init_adapt_ops): Add new target vector fields. - - * remote-array.c (array_wait): Change fflush to gdb_flush and - stdout to gdb_stdout. - (init_array_ops): Add new target vector fields. - - * remote-bug.c (bug_load): Change fflush to gdb_flush; stdout to - gdb_stdout. - (bug_wait): Change stderr to gdb_stderr. - (bug_insert_breakpoint): Ditto. - (init_bug_ops): Add new target vector fields. - - * remote-e7000.c - (init_e7000_ops): Add new target vector fields. - * remote-eb.c (init_eb_ops): Ditto. - * remote-es.c (init_es1800_ops): Ditto. - (init_es1800_child_ops): Ditto. - * remote-es.c (init_es1800_ops): Ditto. - (init_es1800_child_ops): Ditto. - * remote-hms.c (init_hms_ops): Ditto. - * remote-hms.c (init_hms_ops): Ditto. - * remote-nindy.c (init_nindy_ops): Ditto. - * remote-nrom.c (init_nrom_ops): Ditto. - * remote-os9k.c (init_rombug_ops): Ditto. - * remote-rdp.c (init_remote_rdp_ops): Ditto. - * remote-sds.c (init_sds_ops): Ditto. - * remote-sim.c (init_gdbsim_ops): Ditto. - * remote-st.c (init_st2000_ops): Ditto. - * remote-udi.c (init_udi_ops): Ditto. - * remote-vx.c (init_vx_ops): Ditto. - (init_vx_run_ops): Ditto. - * remote-vx.c: (Init_vx_ops): Ditto. - (init_vx_run_ops): Ditto. - - * remote-mips.c (mips_getstring): Change stderr to gdb_stderr. - (pmon_insert_breakpoint): Ditto. - (pmon_remove_breakpoint): Ditto. - (check_lsi_error): Ditto. - (common_breakpoint): Ditto. - (pmon_makeb64): Ditto. - - * remote-mips.c (mips_xfer_memory): Change fflush to gdb_flush; - change stdout to gdb_stdout. - - * remote-mm.c (mm_open): Change stderr to gdb_stderr. - (init_mm_ops): Add new target vector fields. - (mm_load): Fixed params in commented out call to symbol_file_add. - - * remote-nindy.c (instream): Change decl to FILE. - - * remote-udi.c (udi_load): Fixed params in call to symbol_file_add. - - * remote-vx.c (vx_add_symbols): Fixed params in call to - symbol_file_add. - - * remote.c (init_remote_ops): Cosmetic change to match expected - test output. - - * rs6000-nat.c (add_vmap): Add params to call to allocate_objfile. - - * scm-lang.h: Add parameter to scm_val_print function decl. - - * scm-valprint.c (scm_scmval_print): Cast svalue to (int); new - parameter. This parameter is currently only used when evaluating - C++ expressions. So, it is always 0 in this file. - (c_val_print): Fixed prototype decl; it needed an embedded_offset - param. - - * sol-thread.c (sol_core_ops): Add new target vector fields. - (sol_thread_ops): Ditto. - - * somsolib.c (DLD_FLAGS_MAPPRIVATE): New macro. - Define bit of __dld_flags in HP-UX a.out files. - (DLD_FLAGS_HOOKVALID): Ditto. - (DLD_FLAGS_LISTVALID): Ditto. - (DLD_FLAGS_BOR_ENABLE): Ditto. - (som_solib_total_st_size): Cumulative size in bytes of the - symbol tables of all shared objects on the so_list_head list. - (som_solib_st_size_threshhold_exceeded): Threshold for adding symbols - for shlibs. - (som_solib_sizeof_symbol_table): New function. Computes size of - symbol table for a shlib. - (som_solib_load_symbols): New function. Load symbols from shlib. - (som_solib_add): Detect if __dld_list is not valid. - Record main program's symbol table size. - Load symbols if called from command line. - Keep threshold into account when loading shlib symbols. - (som_solib_create_inferior_hook): Use dld_flags macros. - (som_sharedlibrary_info_command): Let user know if symbols were - not loaded. - (som_solib_restart): Discard all the shlibs descriptors. - (_initialize_som_solib): Chenge help message for auto-solib-add - command. - Set threshold for symbol table to 50 megabytes. - (_initialize_som_solib): Add call to som_solib_restart. - (som_solib_restart): New function - (som_solib_in_dynamic_linker): New function - (som_solib_desire_dynamic_linker_symbols): New function - (som_solib_unloaded_library_pathname): New function - (som_solib_loaded_library_pathname): New function - (som_solib_library_pathname): New function - (som_solib_have_unload_event): New function - (som_solib_have_load_event): New function - (som_solib_create_catch_unload_hook): New function - (som_solib_create_catch_load_hook): New function - (som_solib_create_inferior_hook): Rewritten - dld_cache: New struct - addr_and_unwind_t: New struct - (find_unwind_entry) add prototype - Include assert.h, remove references to ASSERT macro, - add include of fcntl.h so that O_RDONLY is defined. - (som_solib_create_inferior_hook): Introduce new local - msymbol2 and change some msymbol's to msymbol2's -- was clobbering - msymbol, passing a NULL to lookup_minimal_symbol_solib_trampoline, - and ultimately core dumping with a SEGV. - (som_solib_mapped_entry): Additional comments for text_addr, - text_link_addr, text_end, and tsd_start_addr fields. Commenting - out 2 tsd fields, __data_start and __data_end. - (som_solib_add_solib_objfile): Add params to calls to symbol_file_add. - Add some code for distinguishing between a shared library and other - objfiles. This appears to be a prelude to thread local storage. - (som_solib_load_symbols): Changes to printf statement - enclosed by SOLIB_DEBUG ifdef. - (som_solib_add): Change comment to correctly specify path - to end.o -- /opt/langtools/lib/end.o. changes to printf statement - enclosed by SOLIB_DEBUG ifdef. - Removed several SOLIB_DEBUG ifdefs and the associated printfs. - Add code to find the start address for the object file's thread - local storage - (som_solib_create_inferior_hook): Fix warning messages use correct - path to end.o -- /opt/langtools/lib/end.o. Change control flow. - No longer user early returns from function is cases of error. - (reset_inferior_pid): New function - (som_solib_remove_inferior_hook): New function - (so_lib_thread_start_addr): New function. used for tsd. - (struct som_solib_mapped_entry): Add new field tsd_start_addr. - (struct so_list): Add new field solib_addr. - (som_solib_add_solib_objfile): New function. - (som_solib_load_symbols): Rewritten. - (som_solib_add): Make sure we don't load the symbols in if the - threshold was exceeded. - (som_solib_get_solib_by_pc): New function. Return the address of - handle of the shared library. - (som_solib_restart): Disable breakpoints at restart. - - * sparcl-tdep.c (init_sparclite_ops): Add new target vector fields. - - * target.c (cleanup_target): Changed casting of default functions - for to_has_forked, to_has_vforked, to_pid_to_exec_file to get rid - of warnings. Fixed PARAMS for to_has_syscall_event. Fixed the - return type on a few of the default function values. - (cleanup_target): Changes in the de_fault macro, both to - accomodate the new target_ops vector fields and to use - more accurate default functions. - (debug_to_open): Change stderr to gdb_stderr. - (debug_to_close): Ditto. - (debug_to_attach): Ditto. - (debug_to_post_attach): Ditto. - (debug_to_require_attach): Ditto. - (debug_to_detach): Ditto. - (debug_to_require_detach): Ditto. - (debug_to_resume): Ditto. - (debug_to_wait): Ditto. - (debug_to_post_wait): Ditto. - (debug_to_fetch_registers): Ditto. - (debug_to_store_registers): Ditto. - (debug_to_prepare_to_store): Ditto. - (debug_to_xfer_memory): Ditto. - (debug_to_files_info): Ditto. - (debug_to_insert_breakpoint): Ditto. - (debug_to_remove_breakpoint): Ditto. - (debug_to_terminal_init): Ditto. - (debug_to_terminal_inferior): Ditto. - (debug_to_terminal_ours_for_output): Ditto. - (debug_to_terminal_ours): Ditto. - (debug_to_terminal_info): Ditto. - (debug_to_kill): Ditto. - (debug_to_load): Ditto. - (debug_to_lookup_symbol): Ditto. - (debug_to_create_inferior): Ditto. - (debug_to_post_startup_inferior): Ditto. - (debug_to_acknowledge_created_inferior): Ditto. - (debug_to_clone_and_follow_inferior): Ditto. - (debug_to_post_follow_inferior_by_clone): Ditto. - (debug_to_insert_fork_catchpoint): Ditto. - (debug_to_remove_fork_catchpoint): Ditto. - (debug_to_insert_vfork_catchpoint): Ditto. - (debug_to_remove_vfork_catchpoint): Ditto. - (debug_to_has_forked): Ditto. - (debug_to_has_vforked): Ditto. - (debug_to_can_follow_vfork_prior_to_exec): Ditto. - (debug_to_post_follow_vfork): Ditto. - (debug_to_insert_exec_catchpoint): Ditto. - (debug_to_remove_exec_catchpoint): Ditto. - (debug_to_has_execd): Ditto. - (debug_to_reported_exec_events_per_exec_call): Ditto. - (debug_to_has_syscall_event): Ditto. - (debug_to_has_exited): Ditto. - (debug_to_mourn_inferior): Ditto. - (debug_to_can_run): Ditto. - (debug_to_notice_signals): Ditto. - (debug_to_thread_alive): Ditto. - (debug_to_stop): Ditto. - (debug_to_enable_exception_callback): Ditto. - (debug_to_get_current_exception_event): Ditto. - (debug_to_pid_to_exec_file): Ditto. - (debug_to_core_file_to_sym_file): Ditto. - (default_clone_and_follow_inferior): New function prototype - decl and function definition. - (dummy_target): Add new target_ops vector fields and their - initializations. More target_ops vector changes for HPUX new - fields. - (de_fault): Add new HPUX specific target_ops operations to the - de_fault macro - (INHERIT): Add new HPUX specific target_ops operations. - (debug_to_post_wait): New function. - (debug_to_post_startup_inferior): Ditto. - (debug_to_acknowledge_created_inferior): Ditto. - (debug_to_clone_and_follow_inferior): Ditto. - (debug_to_post_follow_inferior_by_clone): Ditto. - (debug_to_create_catch_fork_hook): Ditto. - (debug_to_create_catch_vfork_hook): Ditto. - (debug_to_has_forked): Ditto. - (debug_to_has_vforked): Ditto. - (debug_to_post_follow_vfork): Ditto. - (setup_target_debug): Initialize new target_ops vector fields. - (nosupport_runtime): New function, used in cleanup_target - (update_current_target): Add new new target_ops vector fields to - the INHERIT macro definition. - (generic_mourn_inferior): The call to breakpoint_init_inferior now - takes a parameter. - (normal_pid_to_str): Add a \0 to the end of buf. - (debug_to_has_syscall_event): New function. - (debug_to_enable_exception_callback): New function. - (debug_to_get_current_exception_event): New function. - (setup_target_debug): Initialize the 3 new target_ops vector fields - (struct signals): Fix message associated with SIGRETRACT. - (return_one): New function, used by the de_fault macro - (debug_to_post_attach): New function. - (debug_to_wait): Add new cases TARGET_WAITKIND_FORKED, - TARGET_WAITKIND_VFORKED, TARGET_WAITKIND_EXECD. - (debug_to_insert_fork_catchpoint): New function. - (debug_to_remove_fork_catchpoint): Ditto. - (debug_to_insert_vfork_catchpoint): Ditto. - (debug_to_remove_vfork_catchpoint): Ditto. - (debug_to_can_follow_vfork_prior_to_exec): Ditto. - (debug_to_insert_exec_catchpoint): Ditto. - (debug_to_remove_exec_catchpoint): Ditto. - (debug_to_core_file_to_sym_file): Ditto. - (setup_target_debug): Give new fields in current_target target_ops - vector values. - - * target.h: Include symtab.h. - (target_waitkind): New enumerated values - TARGET_WAITKIND_SYSCALL_ENTRY, TARGET_WAITKIND_SYSCALL_RETURN, - TARGET_WAITKIND_FORKED, TARGET_WAITKIND_VFORKED, - TARGET_WAITKIND_EXECD. - (target_waitstatus): Add a syscall_id field to structure. - (child_has_syscall_event): New decl. - (child_thread_alive): New decl. - (target_ops): Add 3 new fields: To_has_syscall_event, - to_enable_exception_callback, to_get_current_exception_event - (target_enable_exception_callback): New macro. - (target_has_syscall_event): New macro. - (target_get_current_exception_event): New macro. - (TARGET_DISABLE_HW_WATCHPOINTS): New macro. - (TARGET_ENABLE_HW_WATCHPOINTS): New macro. - (PC_REQUIRES_RUN_BEFORE_USE): New macro. - (target_tid_to_str): New macro. - (target_waitstatus): Additional fields in struct to keep track - of child pid and pathname to execd file. - (target_ops): Add in the new target_ops function pointer fields. - New macros to go along with new target_ops fields. - In target_waitstatus.value, change name of child_pid field to - related_pid. - (target_pid_or_tid_to_str): Define default macro. - Add missing #endif after PC_REQUIRES_RUN_BEFORE_USE definition - (ENSURE_VFORKING_PARENT_REMAINS_STOPPED): Define default macro. - (RESUME_EXECD_VFORKING_CHILD_TO_GET_PARENT_VFORK): Define default - macro. - There are new function decls for to_require_attach - and to_require_detach. There are also new macros, - target_require_attach and target_require_detach. There are - also new function decls for find_default_require_detach - and find_default_require_attach. - (target_ops): New fields to_post_wait, to_post_startup_inferior - to_acknowledge_created_inferior, to_clone_and_follow_inferior, - to_post_follow_inferior_by_clone, to_create_catch_fork_hook, - to_create_catch_vfork_hook, to_has_forked, to_has_vforked, - to_post_follow_vfork, to_pid_to_exec_file. - New function definitions child_pid_to_exec_file, child_post_wait, - child_post_startup_inferior, child_acknowledge_created_inferior, - child_clone_and_follow_inferior, - child_post_follow_inferior_by_clone, child_create_catch_fork_hook, - child_create_catch_vfork_hook, child_has_forked, - child_has_vforked, child_acknowledge_created_inferior, - child_post_follow_vfork. - New macros target_post_startup_inferior, - target_acknowledge_created_inferior, - target_clone_and_follow_inferior, - target_post_follow_inferior_by_clone, - target_create_catch_fork_hook, target_create_catch_vfork_hook, - target_pid_to_exec_file. - (find_default_clone_and_follow_inferior): New function prototype. - - - * v850ice.c (init_850ice_ops): Init new target vector fields. - - * valprint.c (print_binary_chars): Print out long long as - a binary number. - (print_octal_chars): Print out long long as an octal number - (print_decimal_chars): Print out long long as a decimal number - (strcat_longest): Define it. - * valprint.c: Hp merge, 4/15/98 snapshot - Add parameter to val_print. This is used for - evaluating C++ expressions. - - * value.h (VALUE_POINTED_TO_OFFSET): New macro. - Add field pointed_to_offset to value structure. - Add prototypes for new functions in valops.c. - (write_register_pid): Change prototype to match - function. - (val_print function decl): Additional parameter. - (VALUE_EMBEDDED_OFFSET): New macro. - (find_rt_vbase_offset): New function decl -- for C++ support. - -Wed Dec 23 15:03:42 1998 Per Bothner <bothner@cygnus.com> - - * Makefile.in (READLINE_CFLAGS): Search $(READLINE_SRC)/.. rather - than $(READLINE_SRC) so #include <readline/readline.h> will work. - * top.c: #include <readline/history.h> instead of "history.h". - * tracepoint.c: Likewise. - * mac-xdep.c: Likewise. - -Wed Dec 23 12:32:00 1998 Andrew Cagney <cagney@chook.cygnus.com> - - * defs.h (TARGET_FLOAT_FORMAT, TARGET_DOUBLE_FORMAT): Define using - TARGET_BYTE_ORDER and not target_byte_order. - -Tue Dec 22 10:51:33 1998 Elena Zannoni <ezannoni@kwikemart.cygnus.com> - - * config/i386/cygwin.mh (TERMCAP): define. - (from Chris Faylor, cgf@cygnus.com) - - * top.c: specify directory name for including readline.h - - * tracepoint.c: ditto. - - * utils.c: ditto. - -Mon Dec 21 13:30:34 1998 Mark Alexander <marka@cygnus.com> - - * value.c (value_virtual_fn_field): Handle the situation where - vtbl is a pointer to a structure instead of a pointer to an array. - -Mon Dec 21 10:38:11 1998 Andrew Cagney <cagney@chook> - - * mips-tdep.c: (MIPS_DEFAULT_FPU_TYPE): Default to - MIPS_FPU_DOUBLE. - -1998-12-17 J.T. Conklin <jtc@redbacknetworks.com> - - * blockframe.c (get_frame_saved_regs): If the saved_regs_addr ptr - is null, ensure that saved registers are copied from the local - variable that was used to obtain them. - -Sat Dec 19 09:55:09 1998 Stu Grossman <grossman@babylon-5.cygnus.com> - - * mips-tdep.c (mips32_heuristic_proc_desc): Clear temp_saved_regs - on restart. Fixes problem with backtracing through functions that - use virtual frame pointers. - -Fri Dec 18 14:23:34 1998 Andrew Cagney <cagney@chook> - - * mips-tdep.c (mips_push_arguments): Don't left-shift small - structs being passed in a register when an O64 target. - - * config/mips/tm-mips.h (enum mips_fpu_type, mips_fpu): Move to - mips-tdep.c. - - * mips-tdep.c (mips_fpu_string): Delete variable. - (mips_fpu_type_auto): New variable. - (mips_fpu_type): Rename mips_fpu. - (_initialize_mips_tdep): Delete initialization of mips_fpu et.al. - Rewrite ``set mipsfpu'' command set. - (set_mipsfpu_command, show_mipsfpu_command, - set_mipsfpu_single_command, set_mipsfpu_double_command, - set_mipsfpu_none_command, set_mipsfpu_auto_command): New - functions, handle commands. - (mips_push_arguments, mips_push_dummy_frame, mips_pop_frame, - mips_extract_return_value): Update. - -Thu Dec 17 02:15:40 1998 Andrew Cagney <cagney@chook.cygnus.com> - - * configure.tgt (gdb_target): Identify mips64*vr4100*-*-elf* as - vr4100. - -Thu Dec 17 01:34:36 1998 Andrew Cagney <cagney@chook> - - * gdbtypes.c (build_gdbtypes): New function. - (_initialize_gdbtypes): Call. - -Wed Dec 16 11:47:00 1998 Andrew Cagney <cagney@chook> - - * gdbarch.c (show_architecture): Use TARGET_ARCHITECTURE. - * gdbarch.h, gdbarch.c: Fix typo's. Use struct's in preference to - types. - * gdbarch.h, gdbarch.c (gdbarch_debug): Add ``set archdebug'' to - command set. - -Tue Dec 15 23:46:40 1998 Andrew Cagney <cagney@chook> - - * config/mips/tm-*.h: (TARGET_BYTE_ORDER_DEFAULT, - TARGET_BYTE_ORDER_SELECTABLE_P): Replace TARGET_BYTE_ORDER and - TARGET_BYTE_ORDER_SELECTABLE. - -1998-12-14 Anthony Thompson (athompso@cambridge.arm.com) - - * remote-rdp.c (rdp_init): Don't discard first character on reset. - (translate_open_mode): Define table. - (exec_swi): Handle SWI_Clock. SWI_Open now handles stdin/stdout. - SWI_Write returns number of bytes not written. SWI_Read does the - same. SWI_Seek should return success/failure flag. Fix SWI_Flen. - -1998-12-14 J.T. Conklin <jtc@redbacknetworks.com> - - * config/i386/nbsd.mh, config/m68k/nbsd.mh, config/ns32k/nbsd.mh - (XDEPFILES): Add ser-tcp.o. - -Mon Dec 14 14:46:13 1998 Andrew Cagney <cagney@b1.cygnus.com> - - * monitor.c (monitor_expect, monitor_printf_noecho, - monitor_printf): Always compile EXTRA_RDEBUG code. - (RDEBUG): Ditto. - - From Michael Meissner <meissner@cygnus.com>: - * ppcbug-rom.c (init_ppc_cmds): Cleanup formatting. - -1998-12-08 Michael Meissner <meissner@cygnus.com> - - * monitor.c (monitor_printable_string): New function to convert a - string into a printable representation. - (monitor_error): Call error after converting string into printable - format. - (monitor_printf{,_noecho}): If EXTRA_RDEBUG is defined, convert - string into printable form before printing. - (monitor_expect): Ditto. - (monitor_read_memory{,_single}): Call monitor_error, not error. - (monitor_read_memory): Return immediately if length is 0. - - * ppcbug-rom.c (init_ppc_cmds): Fill in dump_registers field, - which is now required. - -Mon Dec 14 11:01:39 1998 Andrew Cagney <cagney@b1.cygnus.com> - - * gdbarch.h, gdbarch.c: Consolidate the semi-dynamic target system - dependant GDB parameters. - (set_gdbarch_from_file): Combine set_architecture_from_file and - set_byte_order_from_file. - * top.c, defs.h, printcmd.c: Delete them from here. - * Makefile.in: Add gdbarch.[ch]. - * exec.c (exec_file_command): Call set_gdbarch_from_file. - -Sun Dec 13 09:52:51 1998 Andrew Cagney <cagney@b1.cygnus.com> - - * defs.h (TARGET_PRINT_INSN_INFO, TARGET_PRINT_INSN): Define. - (TARGET_ARCHITECTURE, TARGET_ARCHITECTURE_AUTO): Define. - (TARGET_BYTE_ORDER_AUTO): Define. - (TARGET_BYTE_ORDER_SELECTABLE_P): Provide default. Replaces - TARGET_BYTE_ORDER_SELECTABLE. Handle compat issues. - (BITS_BIG_ENDIAN): Simplify. - (TARGET_FLOAT_FORMAT): Ditto. - (TARGET_DOUBLE_FORMAT): - - * remote-e7000.c, sh-tdep.c, printcmd.c, remote-sim.c, - remote-rdi.c, sparc-tdep.c: Update. - - * config/powerpc/tm-ppcle-eabi.h, config/rs6000/tm-rs6000.h, - config/powerpc/tm-ppc-eabi.h, config/mn10300/tm-mn10300.h: - Convert. - -Sat Dec 12 09:28:13 1998 Andrew Cagney <cagney@b1.cygnus.com> - - * frame.h (struct frame_info): Add CORE_ADDR *saved_regs and - struct frame_extra_info *extra_info. - (frame_obstack_alloc, frame_saved_regs_zalloc): Prototype. - (SIZEOF_FRAME_SAVED_REGS): Provide default. - (FRAME_INIT_SAVED_REGS): Provide default. - (struct frame_saved_regs): Deprecate. - (EXTRA_FRAME_INFO): Deprecate. - - * blockframe.c (frame_obstack_alloc, frame_saved_regs_zalloc): New - function. - (generic_get_saved_register): Use FRAME_INIT_SAVED_REGS and - frame->saved_regs. - (frame_cache_obstack): Make static. - (get_frame_saved_regs): Deprecate. Copy the saved regs into the - frame buffer. - - * stack.c (frame_info): Rewrite using frame->saved_regs and - FRAME_INIT_SAVED_REGS. - * findvar.c (find_saved_register): Ditto. - - * config/mn10300/tm-mn10300.h (EXTRA_FRAME_INFO): Delete. - (FRAME_FIND_SAVED_REGS): Replace with FRAME_INIT_SAVED_REGS. No-op. - * mn10300-tdep.c: Update. - (analyze_dummy_frame): New function. - (struct frame_extra_info): Define. - (mn10300_init_extra_frame_info): Update. - - * config/rs6000/tm-rs6000.h: (EXTRA_FRAME_INFO): Delete. - (FRAME_FIND_SAVED_REGS): Replace with FRAME_INIT_SAVED_REGS. - (FRAME_ARGS_ADDRESS): Replace with function. - - * rs6000-tdep.c (frame_get_saved_regs): Rename from - frame_get_cache_fsr. - (rs6000_init_extra_frame_info): New function. - (rs6000_frame_init_saved_regs): Call frame_get_saved_regs. - (FUNCTION_START_OFFSET): Delete references, was ZERO. - (rs6000_frame_args_address): New function. - (frame_initial_stack_address): Update - - * config/mips/tm-mips.h (EXTRA_FRAME_INFO): Remove saved_regs. - (FRAME_INIT_SAVED_REGS): Rename FRAME_FIND_SAVED_REGS, update. - * mips-tdep.c (mips_find_saved_regs, read_next_frame_reg, - init_extra_frame_info, mips_pop_frame): Update. - * config/alpha/tm-alpha.h (FRAME_INIT_SAVED_REGS, - EXTRA_FRAME_INFO), alpha-tdep.c (alpha_find_saved_regs, - alpha_pop_frame, init_extra_frame_info): Ditto. - - * i960-tdep.c, m88k-tdep.c, h8300-tdep.c: Update. - * config/sparc/tm-sparc.h, config/a29k/tm-a29k.h: Define - FRAME_INIT_SAVED_REGS as no-op. - - * z8k-tdep.c (z8k_init_frame_saved_regs): Rename - get_frame_saved_regs. - (examine_frame, z8k_skip_prologue): Update. - * config/z8k/tm-z8k.h (FRAME_INIT_SAVED_REGS): Define. - -1998-12-11 Fernando Nasser <fnasser@totem.to.cygnus.com> - - From J.T. Conklin <jtc@redbacknetworks.com>: - * i386-stub.c (handle_exception): Add support for 'P' command. - (NUMREGS): New macro. - -Fri Dec 11 09:07:05 1998 Andrew Cagney <cagney@b1.cygnus.com> - - * i386b-nat.c: Include "expression.h". - - * symtab.h: Don't include "gnu-regex.h". - - * solib.c (solib_add_common_symbols): Cast parameters passed to - make_cleanup to use the new make_cleanup_func typedef. - - * inftarg.c: Include "wait.h" after, rather than before, <wait.h>. - "wait.h" was defining all WIF* macro's instead of filling in those - that <wait.h> missed. - -Fri Dec 11 09:52:04 1998 Andrew Cagney <cagney@chook> - - * mipsm3-nat.c, hppah-nat.c, infptrace.c, i386gnu-nat.c, - hppab-nat.c, core-aout.c, arm-xdep.c, alpha-nat.c, altos-xdep.c, - pyr-xdep.c, remote-st.c, remote-os9k.c, tahoe-tdep.c, pyr-tdep.c, - vax-tdep.c: Replace reg_name with REGISTER_NAME. - -Thu Dec 10 15:19:40 1998 David Taylor <taylor@texas.cygnus.com> - - The following changes were made by Jim Blandy <jimb@cygnus.com>, - Edith Epstein <eepstein@cygnus.com>, Elena Zannoni - <ezannoni@cygnus.com> Stan Shebs <shebs@cygnus.com>, and David - Taylor <taylor@cygnus.com>, as part of the project to merge in - changes originally made by HP; HP did not create ChangeLog - entries. - - * annotate.c (annotate_catchpoint): New function. - - * annotate.h (annotate_catchpoint): declare it; add new includes - (symtab.h and gdbtypes.h). - - * buildsym.h: add external var processing_hp_compilation. - - * coff-solib.h: - (SOLIB_REMOVE_INFERIOR_HOOK): new macro. defined to 0. - functionality not implemented for coff. - (SOLIB_CREATE_CATCH_LOAD_HOOK): New macro; generate error msg for coff. - (SOLIB_CREATE_CATCH_UNLOAD_HOOK): ditto. - (SOLIB_HAVE_LOAD_EVENT): ditto. - (SOLIB_LOADED_LIBRARY_PATHNAME): ditto. - (SOLIB_HAVE_UNLOAD_EVENT): ditto. - (SOLIB_UNLOADED_LIBRARY_PATHNAME): ditto. - (SOLIB_IN_DYNAMIC_LINKER): ditto. - (SOLIB_RESTART): ditto. - - * complaints.h: add ifdef...endif pair at beginning and end of file. - - * dstread.c (dst_symfile_read): the parameter to fileno - must be of type FILE *. So cast abfd->iostream in the - call to fileno must be cast as a FILE *, not a GDB_FILE *. - This will work because abfd->iostream is declared and - given a value in bdf and bfd will continue to use FILE - rather than GDB_FILE. - - * dwarf2read.c (dwarf_bool_name): change parameter from bool - to mybool. sigh. - - * expression.h: include symtab.h - - * frame.h (print_only_stack_frame, show_stack_frame, - show_frame_info): add prototypes. - - * gdbcmd.h (togglelist, stoplist): declare. - - * gdbcore.h (read_memory_string): declare it. - (exec_file_attach): add prototype. - - * inflow.c (terminal_is_ours): make non static. - - * minsyms.c: minor spacing change. - - * parser-defs.h (parse_nested_classes_for_hpacc): add prototype. - (find_template_name_end): add prototype. - - * scm-lang.c (scm_unpack): cast svalue to (int). - - * top.h: declare it. - - * valprint.h (print_binary_chars): new prototype definition. - (print_octal_chars): new prototype definition. - (print_decimal_chars): new prototype definition. - -Thu Dec 10 07:14:56 1998 Andrew Cagney <cagney@chook> - - * config/arm/tm-arm.h, arm-tdep.c: Replace REGISTER_NAMES with - REGISTER_NAME. - * mn10300-tdep.c, config/mn10300/tm-mn10300.h: Ditto. - * sh-tdep.c, config/sh/tm-sh.h: Ditto. - - * defs.h (REGISTER_NAME): Provide default for old targets. - * defs.h, infcmd.c: Rename reg_names to gdb_register_names. - - * tracepoint.c, target.c, parse.c, infcmd.c, remote-udi.c, - expprint.c, infcmd.c, printcmd.c, eval.c, stack.c, findvar.c, - remote-udi.c, config/alpha/tm-alpha.h, remote-sim.c, d30v-tdep.c, - config/mips/tm-mips.h, hppa-tdep.c: Use REGISTER_NAME. - -1998-12-08 James E Wilson <wilson@wilson-pc.cygnus.com> - - * config/i960/mon960.mt (SIM_OBJS, SIM): Define. - -Tue Dec 8 16:49:24 1998 Stan Shebs <shebs@andros.cygnus.com> - - * NEWS: Add mentions of newly-added configurations. - -1998-12-08 Philippe De Muyter <phdm@macqel.be> - - * config/xm-aix4.h (SIGWINCH_HANDLER): Function `aix_resize_window' - must accept a signal number as parameter. - * config/rs6000/xm-rs6000.h (SIGWINCH_HANDLER): Ditto. - * utils.c (initialize_utils): Give a parameter to `SIGWINCH_HANDLER'. - - * inferior.h (register_valid): Variable's type is `SIGNED char', not - `char'. - * findvar.c (register_valid): Ditto. - - * defs.h (make_cleanup_func): Protect parameter list by `PARAMS'. - * gdbthread.h (unbind_target_thread_vector): Likewise. - -Tue Dec 8 15:09:44 1998 Edith Epstein <eepstein@sophia.cygnus.com> - - Merged in m68k-linux patch from Andreas Schwab - - 1998-12-01 Andreas Schwab <schwab@issan.cs.uni-dortmund.de> - - * Makefile.in, configure.host, configure.tgt: Add support for - m68k-linux. - * config/m68k/linux.mh: New file. - * config/m68k/linux.mt: New file. - * config/m68k/nm-linux.h: New file. - * config/m68k/tm-linux.h: New file. - * config/m68k/xm-linux.h: New file. - * gdb/m68klinux-nat.c: New file. - * gdbserver/low-linux.c: Add support for m68k-linux. - * gdb/config/m68k/tm-m68k.h (NUM_FREGS): New macro. - -1998-12-07 Jason Molenda (jsm@bugshack.cygnus.com) - - * config/i386/xm-cygwin.h: Remove REQUEST_QUIT definition. - * config/powerpc/xm-cygwin.h: Ditto. - -1998-12-07 Jim Blandy <jimb@zwingli.cygnus.com> - - * rs6000-tdep.c (pop_frame): Correctly find the registers saved in - the stack frame. Their offset from the previous stack frame is in - fdata.gpr_offset and fdata.fpr_offset, not fdata.offset. - (gdb.base/return.exp) - * config/rs6000/tm-rs6000.h: Doc fixes. - -1998-12-03 Jason Molenda (jsm@bugshack.cygnus.com) - - * monitor.c (monitor_read_memory): Zero out pattern buffers - before calling re_search. - (parse_register_dump): Ditto. - -Thu Dec 3 10:37:22 EST 1998 Zdenek Radouch (radouch@cygnus.com) - - FR30 updates - still very preliminary. - * configure.tgt - * fr30-tdep.c - * config/fr30/tm-fr30.h - -Thu Dec 3 16:30:35 1998 Andrew Cagney <cagney@b1.cygnus.com> - - * ax-gdb.c: Include target.h. - -Tue Dec 3 10:59:00 1998 Andrew Cagney <cagney@b1.cygnus.com> - - * ax-gdb.c (_initialize_ax_gdb), i960-tdep.c (pop_frame), - monitor.c (flush_monitor_dcache, longlongendswap), remote-array.c - (hexword2ascii), w89k-rom.c (init_w89k_cmds), z8k-tdep.c - (init_frame_pc, extract_return_value): Make return type void. - * monitor.c (monitor_write_even_block): Make return type explicit. - (monotor_read_memory_block): Delete function. - * monitor.h: Update. - * remote.c (remote_get_threadlist, remote_update_threads), - remote-array.c (array_get_packet), remote-rdi.c (Fail): Always - return a value. - * m32r-tdep.c (m32r_fix_call_dummy): From Michael Snyder, void - function. - * jv-valprint.c (java_val_print): From Stu Grossman. Return 0 by - default. - -Wed Dec 2 15:11:38 1998 Michael Snyder <msnyder@cleaver.cygnus.com> - - * tracepoint.c: Move default definition of - TARGET_VIRTUAL_FRAME_POINTER from here to target.h. - * target.h: Add default definition of TARGET_VIRTUAL_FRAME_POINTER. - * ax-gdb.c (gen_frame_args_address, gen_frame_locals_address): - use TARGET_VIRTUAL_FRAME_POINTER to determine frame pointer. - (gen_trace_for_expr): new argument, address of tracepoint, - gets passed to new_agent_expr and added to struct agent_expr. - (is_nontrivial_conversion): call to new_agent_expr now requires - a dummy argument. (agent_command): use get_current_frame() to - get current PC scope; pass it to gen_trace_for_expr. - * ax-general.c (new_agent_expr): new argument, address of - tracepoint; store it in new field of struct agent_expr. - * ax.h (struct agent_expr): add new field for tracepoint address. - * ax-gdb.h: change prototypes to match above changes. - - * m32r-tdep.c (decode_prologue): If no branch or push fp is found, - but there's a stack adjust, then use that as the end of prologue. - (m32r_skip_prologue): don't skip past the first line if there is - line info. (m32r_virtual_frame_pointer): new function. - (m32r_fix_call_dummy): no return value needed. - -Tue Dec 1 10:59:00 1998 Andrew Cagney <cagney@b1.cygnus.com> - - * ocd.c (remote_timeout), (BDM_BREAKPOINT), monitor.c (readchar), - remote.c: Cleanup closing of open comments. - -Mon Nov 30 16:04:03 1998 Doug Evans <devans@canuck.cygnus.com> - - * config/fr30/tm-fr30.h (INNER_THAN): Add parameters. - -Mon Nov 30 11:18:48 1998 Andrew Cagney <cagney@chook> - - * frame.h (FRAME_CHAIN_VALID): Default to - default_frame_chain_valid. - * blockframe.c (default_frame_chain_valid): New function. - - * frame.h (FRAME_CHAIN_VALID_ALTERNATIVE): Delete references - * blockframe.c (alternate_frame_chain_valid): New function. - * config/mips/tm-mipsv4.h, config/m88k/tm-delta88v4.h, - config/m68k/tm-monitor.h, config/m68k/tm-m68kv4.h, - config/i386/tm-i386v4.h, config/i386/tm-i386nw.h, - config/h8300/tm-h8300.h: Update. - - * blockframe.c (nonnull_frame_chain_valid): New function. - * config/m68k/tm-os68k.h, config/m68k/tm-vx68.h, - config/m68k/tm-apollo68b.h, config/i960/tm-vx960.h, - config/arc/tm-arc.h: Update FRAME_CHAIN_VALID. - - * hppa-tdep.c (frame_chain_valid, hppa_frame_chain_valid), - remote-vx29k.c (get_fp_contents, vx29k_frame_chain_valid), - arm-tdep.c (frame_chain_valid, arm_frame_chain_valid): Rename - functions so that they are name space clean. - * config/pa/tm-hppa.h, config/a29k/tm-vx29k.h, - config/arm/tm-arm.h: Update FRAME_CHAIN_VALID. - - * gould-tdep.c (gould_frame_chain_valid), d30v-tdep.c - (d30v_frame_chain_valid), d10v-tdep.c (d10v_frame_chain_valid): - New functions. - * config/gould/tm-np1.h, config/gould/tm-pn.h, - config/d30v/tm-d30v.h, config/d10v/tm-d10v.h: Update - FRAME_CHAIN_VALID. - -Sun Nov 29 11:18:37 1998 Andrew Cagney <cagney@b1.cygnus.com> - - * z8k-tdep.c (z8k_addr_bits_remove), w65-tdep.c - (w65_addr_bits_remove), h8500-tdep.c (h8500_addr_bits_remove), - m88k-tdep.c (m88k_addr_bits_remove): Function to clean up an - address. - * config/z8k/tm-z8k.h, config/w65/tm-w65.h, config/m88k/tm-m88k.h, - config/h8500/tm-h8500.h: Define ADDR_BITS_REMOVE to call targets - corresponding function. - * z8k-tdep.c (saved_pc_after_call): Update. - -Sat Nov 28 12:24:31 1998 Andrew Cagney <cagney@b1.cygnus.com> - - * config/z8k/tm-z8k.h, config/w65/tm-w65.h, config/vax/tm-vax.h, - config/v850/tm-v850.h, config/tahoe/tm-tahoe.h, - config/sparc/tm-sparc.h, config/sh/tm-sh.h, - config/rs6000/tm-rs6000.h, config/pyr/tm-pyr.h, - config/pa/tm-hppa.h, config/ns32k/tm-umax.h, - config/ns32k/tm-merlin.h, config/none/tm-none.h, - config/mn10300/tm-mn10300.h, config/mn10200/tm-mn10200.h, - config/mips/tm-mips.h, config/m88k/tm-m88k.h, - config/m68k/tm-m68k.h, config/m32r/tm-m32r.h, - config/i960/tm-i960.h, config/i386/tm-i386.h, - config/h8500/tm-h8500.h, config/h8300/tm-h8300.h, - config/gould/tm-pn.h, config/gould/tm-np1.h, config/arm/tm-arm.h, - config/convex/tm-convex.h, config/d10v/tm-d10v.h, - config/alpha/tm-alpha.h, config/a29k/tm-a29k.h: Add parameters to - macro INNER_THAN. - - * valops.c (push_word, value_push, call_function_by_hand), - breakpoint.c (bpstat_stop_status), blockframe.c - (generic_push_dummy_frame, generic_frame_chain_valid), inferior.h - (PC_IN_CALL_DUMMY), infrun.c (wait_for_inferior): Update use of - INNER_THAN. - -Fri Nov 27 11:00:25 1998 Andrew Cagney <cagney@chook> - - * target.h (one_stepped): Move global from here. - * infrun.c (singlestep_breakpoints_inserted_p): To here. Rename. - Make static. - (wait_for_inferior): Update. - (resume): Update. Set variable after call to SOFTWARE_SINGLE_STEP. - - * target.h (NO_SINGLE_STEP): Replace with SOFTWARE_SINGLE_STEP_P - and SOFTWARE_SINGLE_STEP. - * config/sparc/tm-sparc.h, config/rs6000/tm-rs6000.h, - config/arc/tm-arc.h: Update. - * rs6000-tdep.c (rs6000_software_single_step), sparc-tdep.c - (sparc_software_single_step), arc-tdep.c (arc_single_step): New - functions. Replace function single_step. - - * config/mips/tm-mips.h (STEP_SKIPS_DELAY_P): Define. - * infrun.c (proceed): Cleanup. - -Thu Nov 26 11:19:15 1998 Andrew Cagney <cagney@amy.cygnus.com> - - * config/alpha/tm-alpha.h (ABOUT_TO_RETURN): Replace macro. - * alpha-tdep.c (alpha_about_to_return): With new function. - (heuristic_proc_start): Update. - * config/mips/tm-mips.h (ABOUT_TO_RETURN), mips-tdep.c - (heuristic_proc_start, mips_about_to_return): Ditto. - * config/ns32k/tm-merlin.h (ABOUT_TO_RETURN), - config/ns32k/tm-umax.h (ABOUT_TO_RETURN), ns32k-tdep.c - (ns32k_about_to_return, ns32k_get_enter_addr): Ditto. - - * config/z8k/tm-z8k.h, config/w65/tm-w65.h, config/vax/tm-vax.h, - config/tahoe/tm-tahoe.h, config/sparc/tm-sparc.h, - config/sh/tm-sh.h, config/rs6000/tm-rs6000.h, config/pyr/tm-pyr.h, - config/pa/tm-hppa.h, config/m88k/tm-m88k.h, config/m68k/tm-m68k.h, - config/i960/tm-i960.h, config/i386/tm-i386.h, - config/h8500/tm-h8500.h, config/h8300/tm-h8300.h, - config/gould/tm-pn.h, config/gould/tm-np1.h, - config/convex/tm-convex.h, config/arm/tm-arm.h, - config/arc/tm-arc.h, config/a29k/tm-a29k.h: Delete macro - ABOUT_TO_RETURN. - * config/w65/tm-w65.h (RTL, RTS): Delete macros. - * h8500-tdep.c (about_to_return): Delete function. - -Thu Nov 26 11:19:15 1998 Andrew Cagney <cagney@chook.cygnus.com> - - * rs6000-tdep.c (rs6000_breakpoint_from_pc): Change big_breakpoint - and little_breakpoint to char[] from char*. - * remote-array.c (array_insert_breakpoint): Change bp_addr to - CORE_ADDR type. - -Wed Nov 25 00:13:06 1998 Andrew Cagney <cagney@b1.cygnus.com> - - * vx-share/xdr_ld.c (xdr_ldtabl): Cast second arg to char** - instead of char*. - - * configure.tgt (v850): Only build v850ice when cygwin and gui. - * configure.in: Add parameter to --enable-build-warnings. - * configure: Re-build. - - * c-exp.y (parse_number): Rewrite shift to pacify GCC. - - * config/i960/tm-i960.h (BREAKPOINT): Delete definition - simply - wrong. - - * monitor.c (compile_pattern): Make val const char*. - (monitor_wait_cleanup): Make old_timeout void*, pointing at - old_timeout. - (monitor_wait): Update. - - * remote-udi.c, remote-sim.c, remote-e7000.c, hppa-tdep.c, - remote-mips.c, sparcl-tdep.c, xcoffread.c: Cast parameters passed - to make_cleanup to use the new make_cleanup_func typedef. - - * alpha-tdep.c (MASK): Use LONGEST to avoid arithmetic overflow. - - * config/a29k/tm-a29k.h (TRANSPARENT): Rename macro to - TRANSPARENT_FRAME. Avoid name-space clash. - * a29k-tdep.c (init_frame_info): Update. - -Wed Nov 25 20:37:00 1998 Andrew Cagney <cagney@b1.cygnus.com> - - * rs6000-tdep.c (rs6000_breakpoint_from_pc): Change big_breakpoint - and little_breakpoint to char[] from char*. - * mem-break.c (memory_insert_breakpoint, - memory_remove_breakpoint): Pass address of bplen. - * remote-array.c (array_insert_breakpoint): Change bp_addr to - CORE_ADDR type. - -Tue Nov 24 15:46:33 1998 Michael Snyder <msnyder@cleaver.cygnus.com> - - * config/mn10300/tm-mn10300.h (TARGET_VIRTUAL_FRAME_POINTER): - new target macro. - * mn10300-tdep.c (mn10300_virtual_frame_pointer): new function. - * tracepoint.c (encode_actions): Use the new target macro to - determine the virtual frame pointer, for collecting locals/args. - (add_local_symbols, collect_symbol): add a register/offset pair of - arguments so that the virtual frame pointer can be passed in. - -1998-11-24 Felix Lee <flee@cygnus.com> - - * procfs.c (procfs_wait): handle syscall events first. - - * procfs.c (GDB_GREGSET_TYPE, GDB_FPREGSET_TYPE): new macros. - * config/sparc/xm-sun4sol2.h: use them. - * core-sol2.c: don't #undef gregset_t and fpregset_t. - * sol-thread.c: ditto. - * sparc-tdep.c: ditto. - -Tue Nov 24 14:13:10 1998 Andrew Cagney <cagney@chook> - - * breakpoint.c (memory_breakpoint_size): Delete global. - (read_memory_nobpt): Determine real breakpoint address and size - using BREAKPOINT_FROM_PC. - - * defs.h (breakpoint_from_pc_fn): BREAKPOINT_FROM_PC function - template. - * target.h, mem-break.c (memory_breakpoint_from_pc): - Rewrite. Always define. Return NULL when memory breakpoints are - not supported. - (memory_insert_breakpoint, memory_remove_breakpoint): Call - BREAKPOINT_FROM_PC. - * target.h (BREAKPOINT_FROM_PC): Provide default. - * gdbint.texinfo (BREAKPOINT_FROM_PC): Document. - - * config/rs6000/tm-rs6000.h (BREAKPOINT): Delete macro. - (BREAKPOINT_FROM_PC): Define. - ({BIG,LITTLE}_BREAKPOINT): Move macros from here. - * rs6000-tdep.c: To here. - (rs6000_breakpoint_from_pc): New function. - - * config/mn10300/tm-mn10300.h (BREAKPOINT): Delete macro. - (BREAKPOINT_FROM_PC): Define, call. - * mn10300-tdep.c (mn10300_breakpoint_from_pc): New function. - - * config/mips/tm-mips.h ({BIG,LITTLE}_BREAKPOINT, - IDT_{BIG,LITTLE}_BREAKPOINT, PMON_{BIG,LITTLE}_BREAKPOINT, - MIPS16_{BIG,LITTLE}_BREAKPOINT): Move macros from here. - * mips-tdep.c: To here. - - * config/arm/tm-arm.h ({BIG,LITTLE}_BREAKPOINT): Delete macros. - ({ARM,THUMB}_{BE,LE}_BREAKPOINT): Move macros from here. - * arm-tdep.c: To here. - - * remote-array.c (memory_breakpoint_size): Delete variable. - (array_insert_breakpoint): Obtain breakpoint size using - BREAKPOINT_FROM_PC. - * remote-st.c (memory_breakpoint_size, st2000_insert_breakpoint): - Ditto. - * remote-os9k.c (memory_breakpoint_size, - rombug_insert_breakpoint): Ditto. - * remote-e7000.c (memory_breakpoint_size): Ditto. - -Mon Nov 23 11:38:40 1998 Michael Snyder <msnyder@cleaver.cygnus.com> - - * symfile.c (deduce_language_from_filename): rewrite so as to - work from a table of filename extensions, modifiable by the user. - (filename_language_table): new data structure. - (set_ext_lang_command): new function for new command, "set - extension-language". (info_extension_language_command): new - function for new command "info extension-languages". - (add_filename_language, init_filename_language_table): new - support functions for the above. - * language.c (language_enum): new function. Support for above. - -Mon Nov 23 10:47:54 1998 Andrew Cagney <cagney@chook.cygnus.com> - - * config/sh/tm-sh.h, config/mn10200/tm-mn10200.h, - config/m32r/tm-m32r.h, config/arm/tm-arm.h, config/i960/tm-i960.h, - config/gould/tm-np1.h, config/d10v/tm-d10v.h, - config/v850/tm-v850.h, config/pa/tm-hppa.h, config/a29k/tm-a29k.h, - config/mn10300/tm-mn10300.h, config/mips/tm-mips.h - (USE_STRUCT_CONVENTION): Cleanup, define macro as function. - - * sh-tdep.c (sh_use_struct_convention), mn10200-tdep.c - (mn10200_use_struct_convention), i960-tdep.c - (i960_use_struct_convention), gould-tdep.c - (gould_use_struct_convention), d10v-tdep.c - (d10v_use_struct_convention), v850-tdep.c - (v850_use_struct_convention), hppa-tdep.c - (hpha_use_struct_convention), m32r-tdep.c - (m32r_use_struct_convention), arm-tdep.c - (arm_use_struct_convention), mn10300-tdep.c - (mn10300_use_struct_convention), a29k-tdep.c - (a29k_use_struct_convention), mips-tdep.c - (mips_use_struct_convention): New functions - - * value.h, values.c (generic_use_struct_convention): New function, - replace macro. - * values.c (USE_STRUCT_CONVENTION): Macro defaults to function - generic_use_struct_convention. - -Sat Nov 21 17:15:40 1998 Philippe De Muyter <phdm@macqel.be> - - * breakpoint.c (bpstat_stop_status): Do not increment hit_count - of breakpoint if condition is not true. - - * coffread.c (coff_symtab_read): Discard C_LABEL's that are not - function entry points, to avoid getting them in the stack dump - instead of the actual function. - - * config/m68k/delta68.mh (NAT_FILE): Undo 1998-08-18 change; - without NAT_FILE definition, configure will assume that GDB cannot - run native. - * config/m68k/nm-delta68.h (KERNEL_U_SIZE): New macro. - * delta68-nat.c (kernel_u_size): New function. - -Fri Nov 20 10:13:03 1998 Andrew Cagney <cagney@b1.cygnus.com> - - * buildsym.c (end_symtab): Cleanup PROCESS_LINENUMBER_HOOK. - -Thu Nov 19 15:21:04 1998 Geoffrey Noer <noer@cygnus.com> - - * rdi-share/host.h: if compiling under Cygwin, make sure new - preprocessor define is defined. Define it if not. - * rdi-share/hostchan.h: ditto - * rdi-share/aclocal.m4: regenerate - * rdi-share/configure: regenerate - -Thu Nov 19 14:43:44 1998 Geoffrey Noer <noer@cygnus.com> - - * configure.in: switch back to checking __CYGWIN32__ - * configure: regenerate - -Thu Nov 19 09:53:00 1998 Andrew Cagney <cagney@b1.cygnus.com> - - * exec.c (exec_file_command): Cleanup. Replace #if - NEED_TEXT_START_END with if(). - * config/pa/nm-hppah.h (NEED_TEXT_START_END): Redefine to be 1. - * config/convex/tm-convex.h (NEED_TEXT_START_END): Ditto. - * config/gould/tm-np1.h (NEED_TEXT_START_END): Ditto. - * config/a29k/tm-a29k.h (NEED_TEXT_START_END): Ditto. - -Thu Nov 19 13:06:22 1998 Geoffrey Noer <noer@cygnus.com> - - * main.c: Wait until more time has passed before calling - new cygwin_ funcs, revert back to the cygwin32_ ones for now. - * win32-nat.c: Ditto. - -Wed Nov 18 15:03:17 1998 Andrew Cagney <cagney@chook.cygnus.com> - - * 29k-share/udi/udip2soc.c (UDIConnect): Replace sys_errlist with - strerror. - -Mon Nov 16 14:17:05 1998 Geoffrey Noer <noer@cygnus.com> - - * defs.h: if compiling under Cygwin, define __CYGWIN__ if - __CYGWIN32__ is defined and __CYGWIN__ isn't for backwards - compatibility. - -Fri Nov 13 00:15:08 1998 Geoffrey Noer <noer@cygnus.com> - - Changes to account for name change from cygwin32 to cygwin and - clean up Win32-related ifdefs. - - * configure.tgt: check for cygwin* instead of cygwin32. - New cygwin gdb_target variable loses the "32". - * configure.host: check for cygwin* instead of cygwin32. - New cygwin gdb_host variable loses the "32". - * configure.in: test __CYGWIN__ instead of __CYGWIN32__, - rename gdb_cv_os_cygwin32 variable to drop the "32". Call - AM_EXEEXT instead of AC_EXEEXT since that isn't in a released - autoconf yet. - * configure: regenerate. - - * main.c: drop "32" from cygwin_ funcs, include sys/cygwin.h where - cygwin path conv protos live, instead of adding a proto here for - them here. - * {main.c, ser-tcp.c, ser-unix.c, top.c}: check __CYGWIN__ - instead of __CYGWIN32__. - * source.c: thoughout, check _WIN32 instead of WIN32. - - * config/i386/cygwin32.mh: delete. - * config/i386/cygwin.mh: new file, was cygwin32.mh. - * config/i386/cygwin32.mt: delete. - * config/i386/cygwin.mt: new file, was cygwin32.mt. - * config/i386/tm-cygwin32.h: delete. - * config/i386/tm-cygwin.h: new file, was tm-cygwin32.h. - * config/i386/xm-cygwin32.h: delete. - * config/i386/xm-cygwin.h: new file, was xm-cygwin32.h. - * config/i386/xm-windows.h: #include xm-cygwin.h now. - * config/powerpc/cygwin32.mh: delete. - * config/powerpc/cygwin.mh: new file, was cygwin32.mh. - * config/powerpc/cygwin32.mt: delete. - * config/powerpc/cygwin.mt: new file, was cygwin32.mt. - * config/powerpc/tm-cygwin32.h: delete. - * config/powerpc/tm-cygwin.h: new file, was tm-cygwin32.h. - * config/powerpc/xm-cygwin32.h: delete. - * config/powerpc/xm-cygwin.h: new file, was xm-cygwin32.h. - - * rdi-share/aclocal.m4: regenerate with aclocal. - * rdi-share/configure: regenerate with autoconf. - * rdi-share/{host.h, hostchan.c, hostchan.h, serdrv.c, serpardr.c, - unixcomm.c}: check __CYGWIN__ instead of __CYGWIN32__. - -Thu Nov 12 17:19:43 1998 John Metzler <jmetzler@cygnus.com> - - * remote.c (remote_get_threadinfo): Support for remote - multithread debugging. - (remote_get_threadlist): get a partial list of threads - (remote_threadlist_iterator): Step through all the threads - (init_remote_threadtests): Optional builtin unit test commands. - - * thread.c (bind_target_thread_vector): Implementa a more dynamic - way of accessing target specific thread info functions than - FIND_NEW_THREADS. - (target_thread_info): Function to get extended thread information. - - * gdbthread.h: Export internal data structures corresponding to - external detailed thread info response. This is more like a 'ps' - command than what might be expected of host based threads. This - is for embedded systems. - -Wed Nov 11 15:47:00 1998 Michael Snyder <msnyder@cleaver.cygnus.com> - - * procfs.c (proc_set_exec_trap): don't set PR_ASYNC or PR_FORK - in the child process for UnixWare (causes processes forked by - the debuggee to hang). - -Mon Nov 9 12:00:36 1998 Dave Brolley <brolley@cygnus.com> - - * config/fr30/fr30.mt: New file. - * config/fr30/tm-fr30.h: New file. - -1998-11-05 Jim Wilson <wilson@cygnus.com> - - * remote-vx.c (net_read_registers, net_write_registers, - vx_xver_memory, vx_resume, vx_attach, vx_detach, vx_kill): - Change errno to errno_num. - * vx-share/xdr_ptrace.c (xdr_ptrace_return): Likewise. - * vx-share/xdr_ptrace.h (struct ptrace_return): Likewise. - -Thu Nov 5 08:41:33 1998 Christopher Faylor <cgf@cygnus.com> - - * top.c (gdb_readline): Allow CRLF line termination on systems - which define CRLF_SOURCE_FILES. - * win32-nat.c: 1) Add thread support, 2) fix ability to attach to - a running process, and 3) implement limited support for cygwin - signals. - (thread_rec): New function. - (child_add_thread): Ditto. - (child_init_thread_list): Ditto. - (child_delete_thread): Ditto. - (do_child_fetch_inferior_registers): Ditto. - (do_child_store_inferior_registers): Ditto. - (handle_output_debug_string): Ditto. - (child_fetch_inferior_registers): Use do_* function to perform - operation. - (child_store_inferior_registers): Ditto. - (child_continue): Ditto. - (child_thread_alive): Ditto. - (cygwin_pid_to_str): Ditto. - (handle_load_dll): Reorganize, add first attempt at reading - dll names from attached processes. Change info messages to provide - more information when dll is already loaded. - (handle_exception): Changes mandated by new thread-aware structures. - (child_wait): Track thread creation/destruction. Handle cygwin - signals. - (child_create_inferior): Ditto. - (child_resume): Ditto. - (child_kill_inferior): Ditto. Close child process handle to avoid a - handle leak. - (child_ops): Fill out child_ops fields that deal with threads. - * config/i386/tm-cygwin32.h: Declare function and macro needed - for converting a cygwin "pid" to a string. - * config/i386/xm-cygwin32.h: define HAVE_SIGSETMASK as 0 since - sigsetmask is not defined in cygwin. - -Thu Nov 5 08:38:18 1998 Christopher Faylor <cgf@cygnus.com> - - * win32-nat.c: Remove obsolete PPC conditionals. - -Wed Nov 4 18:44:31 1998 Dave Brolley <brolley@cygnus.com> - - * configure.tgt: Add fr30-*-elf*. - -1998-11-03 Jim Wilson <wilson@cygnus.com> - - * c-exp.y (parse_number): Check TARGET_LONG_LONG_BIT when setting - high_bit to avoid undefined negative shift. - -Mon Nov 2 15:26:33 1998 Geoffrey Noer <noer@cygnus.com> - - * configure.in: Check cygwin* instead of cygwin32*. - * configure: regenerate - -Thu Oct 29 10:04:20 1998 Michael Snyder <msnyder@cleaver.cygnus.com> - - [Support for trace debugging: registers that were not collected.] - * remote.c (remote_fetch_registers): accept 'xxxx' in the register - packet, with the meaning "register value is not available". - Set register_valid to -1, which will connote "no value available". - * findvar.c (read_relative_register_raw_bytes): return failure if - register_valid == -1. (value_of_register): return failure if - register_valid == -1. (read_var_value): return error if - value_of_register fails for a register variable. - (value_from_register): return failure if register_valid == -1. - * eval.c (evaluate_subexp_standard): return error if - value_of_register fails for a register used in an expression. - * infcmd.c (do_registers_info): display "value not available" - for registers for which register_valid == -1. - - * tracepoint.c (set_raw_tracepoint): just save the filename as is - from the symbol table, rather than trying to prepend the dir name. - Also save the bfd section. (tracepoints_info): use the section - when looking up the function name. - * tracepoint.h: add section field to tracepoint struct. - -Wed Oct 28 08:01:38 1998 Mark Alexander <marka@cygnus.com> - - * sparcl-tdep.c (send_resp, sparclite_serial_start, - sparclite_serial_write): Use remote_timeout instead of hardcoded - two second timeout. - (download): Fix adjustment of a.out load addresses. - -Wed Oct 28 12:32:58 1998 Andrew Cagney <cagney@b1.cygnus.com> - - * configure.in (--enable-build-warnings): Finish rename from - --enable-warnings. - (enable-build-warnings): Add -Wpointer-arth, allow =* for - sim/common compatibility. - * configure: Re-generate. - -Wed Oct 21 08:44:30 1998 Andrew Cagney <cagney@b1.cygnus.com> - - * 29k-share/udi/udip2soc.c: Replace sys_errlist with strerror(). - -Thu Oct 22 09:56:55 1998 Andrew Cagney <cagney@b1.cygnus.com> - - * config/rs6000/aix4.mh (NATDEPFILES): Move xcoffread.o from here. - * config/rs6000/aix4.mt (TDEPFILES): To here. - -Wed Oct 21 10:02:31 1998 Andrew Cagney <cagney@b1.cygnus.com> - - * rdi-share/unixcomm.c: Provide definitions of SERPORT and PARPORT - on BSD hosts. - -1998-10-19 Jason Molenda (jsm@bugshack.cygnus.com) - - * configure.in (AM_EXEEXT): Use AC_EXEEXT instead. - * configure: Regenerated. - -Sat Oct 17 17:39:23 1998 Felix Lee <flee@cygnus.com> - - * core-sol2.c: #include <sys/types.h>, for sol2.7 weirdness. - -Fri Oct 16 15:31:38 1998 Michael Snyder <msnyder@cleaver.cygnus.com> - - * m32r-tdep.c (decode_prologue): Return failure if we reach - the end of the function without finding the end of the prologue. - -1998-10-16 Jason Molenda (jsm@bugshack.cygnus.com) - - * command.c copying.c copying.awk core-aout.c core-regset.c - corelow.c dcache.c i386-tdep.c i386v4-nat.c i387-tdep.c - infcmd.c infptrace.c infrun.c remote.c solib.c symfile.c - symmisc.c valarith.c: Add prototypes. - - * defs.h: Add prototype for utils.c::do_run_cleanups. - - * gdbtypes.c: Add prototypes. - (make_pointer_type): Add braces to remove nested if-else ambiguity. - (make_reference_type): Ditto. - - * printcmd.c (printf_command): Initialize 'f' and 'string' at - function startup to suppress possibly-used-before-initialized warning. - - * remote-utils.c: Add prototypes. - (sr_pollchar): Add braces to remove nested if-else ambiguity. - - * ser-tcp.c: Add prototypes. - (wait_for): Add braces to remove nested if-else ambiguity. - (tcp_readchar): Ditto. - - * ser-unix.c: Add prototypes. - (get_tty_state): Don't define errno here. - (hardwire_readchar): Only define 't' if we are compiling in a Cygwin - environment. - - * symtab.c: Add prototypes. - (find_methods): Add braces to remove nested if-else ambiguity. - (search_symbols): Set 'i' to an initial value to suppress a - possibly-used-before-initialized warning. - - * valops.c: Add prototypes. - (value_cast): Set 'eltype2' to an initial value to suppress a - possibly-used-before-initialized warning. - (value_of_variable): Add braces to remove nested if-else ambiguity. - (value_of_this): Ditto. - - * valprint.c: Add prototypes. - (print_floating): Add braces to remove nested if-else ambiguity. - -Thu Oct 15 19:50:48 1998 Stan Shebs <shebs@andros.cygnus.com> - - * tm-sp64.h (SETUP_ARBITRARY_FRAME, FRAME_SPECIFICATION_DYADIC): - Remove, nevermore used. - -Thu Oct 15 16:55:00 1998 Andrew Cagney <cagney@b1.cygnus.com> - - * command.c: Include "wait.h" after, rather than before, <wait.h>. - "wait.h" was defining all WIF* macro's instead of filling in those - that <wait.h> missed. - -1998-10-14 Jason Molenda (jsm@bugshack.cygnus.com) - - * defs.h: Move _initialize_printcmd, _initialize_stack, - _initialize_blockframe out of here and in to their respective .c - files. - * blockframe.c: Move _initialize_blockframe prototype to here. - * printcmd.c: Move _initialize_printcmd prototype to here. - * stack.c: Move _initialize_stack prototype to here. - - * source.c, symtab.h: Move _initialize_source prototype to the .c - file. - * values.c, value.h: Move _initialize_values prototype to the .c file. - * gdbthread.h, thread.c: Move _initialize_thread prototype to the .c - file. - * breakpoint.c, breakpoint.h: Move _initialize_breakpoint prototype - to the .c file. - - * abug-rom.c alpha-nat.c alpha-tdep.c annotate.c ax-gdb.c bcache.c: - Standardize comments for the prototype section of these files. - - * configure.in: Look in libc for wctype before looking for it in libc. - -Tue Oct 13 18:56:51 1998 Felix Lee <flee@cygnus.com> - - * sol-thread.c (ps_pstop, etc): simple test for proc_service.h - version didn't work for sol2.6; pushed it to autoconf. - * configure.in (gdb_cv_proc_service_is_old): new test. - * acconfig.h (PROC_SERVICE_IS_OLD): new define. - * configure, config.in: regenerate. - -1998-10-13 Jason Molenda (jsm@bugshack.cygnus.com) - - * blockframe.c (find_pc_sect_partial_function): Add braces to avoid - possible nested-if confusion. - * breakpoint.c (breakpoint_here_p): Ditto. - (breakpoint_inserted_here_p): Ditto. - (breakpoint_thread_match): Ditto. - - * gnu-regex.c: Define _REGEX_RE_COMP only if it isn't already defined. - * gnu-regex.h: Define _REGEX_RE_COMP to pick up old compatability - prototypes. - - * symtab.h: Add prototype for _initialize_source. - * value.h: Add prototype for _initialize_value. - - * defs.h: Include sys/types.h or stddef.h to get size_t. - (make_cleanup): Add make_cleanup_func typedef and switch to using - a prototype for this function. - (mfree): Add prototypes for mmalloc, mrealloc, mfree if we aren't - using mmalloc. - - * ax-gdb.c breakpoint.c coffread.c corelow.c dbxread.c - dwarf2read.c dwarfread.c elfread.c eval.c exec.c infcmd.c infrun.c - mipsread.c nlmread.c os9kread.c parse.c printcmd.c symfile.c - symmisc.c symtab.c thread.c top.c tracepoint.c typeprint.c - valops.c: Cast parameters passed to make_cleanup to use the new - make_cleanup_func typedef. - -Tue Oct 13 00:51:48 1998 Felix Lee <flee@cygnus.com> - - * sol-thread.c (ps_pstop, etc): different solaris versions have - slightly different prototypes in proc_service.h; compensate. - -1998-10-12 Jason Molenda (jsm@bugshack.cygnus.com) - - * Makefile.in (AWK): Unused; remove. - * configure.in: Remove unused autoconf checks for MINIX, memcpy, - poll, select, strings.h. - * config.in: Regenerated. - * configure: Regenerated. - -1998-10-12 Jason Molenda (jsm@bugshack.cygnus.com) - - * configure.in: Check for sys/debugreg.h, asm/debugreg.h. - * i386v-nat.c: Include asm/debugreg.h, sys/debugreg.h if it is not - present. - -Sun Oct 11 12:08:07 1998 Peter Schauer <pes@regent.e-technik.tu-muenchen.de> - - * dwarf2read.c (dwarf2_build_psymtabs_hard): Do not adjust the - address range of a compilation unit without children. - - * mdebugread.c (parse_partial_symbols): Fix handling of stabs - continuations, use xmalloc and xrealloc. - -Fri Oct 9 18:14:43 1998 Mark Alexander <marka@cygnus.com> - - * rs6000-tdep.c: Don't include tm.h twice. - -1998-10-08 Keith Seitz <keiths@cygnus.com> - - * main.c (main): Remove calls to {pre,post}_add_symbol_hooks. - There should be sufficient information/hooks now to eliminate - this hack. - - * exec.c (file_command): Add a new hook here to inform ui's - when the exec file has changed. Adding it here allows the - ui to be informed after symbol reading. - - * gdbcore.h: Add declaration of file_changed_hook. - -Thu Oct 8 08:40:42 1998 Mark Alexander <marka@cygnus.com> - - * rs6000-tdep.c (get_saved_register): Define only if - USE_GENERIC_DUMMY_FRAMES is defined. - -1998-10-06 Jason Molenda (jsm@bugshack.cygnus.com) - - Eliminate a few warnings from the compiler. - * breakpoint.h: Add prototype. - * breakpoint.c (do_enable_breakpoint): cast mem_cnt, i to (void). - * configure.in: Check if strdup declaration is necessary. - * configure: Regenerated. - * defs.h: Add prototypes. - * gdb_string.h: Only define strdup if necessary. - * gdbthread.h: Add prototypes. - * printcmd.c: Add prototyptes. - (disassemble_command): Remove unused variable 'section'. - * symtab.c: Add prototypes. - * symtab.h: Include gnu-regex.h, add prototype. - * thread.c: Add prototype. - -Mon Oct 5 19:44:39 1998 Stan Shebs <shebs@andros.cygnus.com> - - From David Purves <purves@apogee.com>: - * stabsread.c (rs6000_builtin_type): Create a complex float instead - of an error. - (read_sun_floating_type): Similarly. - (read_range_type): Create a complex float if self_subrange is - true. - -Fri Oct 2 19:42:31 1998 Stu Grossman <grossman@babylon-5.cygnus.com> - - * c-lang.c (emit_char c_printchar c_printstr), c-lang.h (c_printstr) - ch-lang.c (chill_printstr chill_printchar) c-valprint.c (c_val_print) - ch-valprint.c (chill_val_print) expprint.c (print_subexp) f-lang.c - (f_printstr f_printchar emit_char) f-valprint.c (f_val_print) - jv-lang.c (java_printchar java_emit_char) jv-valprint.c - (java_value_print java_val_print) language.c (unk_lang_printchar - unk_lang_printstr unk_lang_emit_char) language.h (struct - language_defn LA_PRINT_STRING LA_EMIT_CHAR) m2-lang.c (m2_printstr - m2_printchar emit_char) printcmd.c (print_formatted) scm-lang.c - (scm_printstr) valprint.c (val_print_string) value.h - (val_print_string): Add emit_char routines to language_desc struct - to allow finer control over language specific character output issues. - Add character width arg to printstr routines to allow handling of - wchar_t/Unicode strings. Fix c_printstr to handle wide characters. - Supply width argument to LA_PRINT_STRING and val_print_string. - - * jv-lang.c (java_object_type dynamics_objfile java_link_class_type - get_dynamics_objfile get_java_object_type) jv-lang.h - (get_java_object_type): Make lots of things static. - - * expprint.c (dump_prefix_expression dump_subexp): Move opcode name - printing to common routine (op_name). - * (dump_subexp): Add support for OP_SCOPE. - -Fri Oct 2 16:25:54 1998 Stan Shebs <shebs@andros.cygnus.com> - - * configure.host (i[3456]86-*-windows): Remove, no longer used. - * mswin: Remove directory, no longer used. - -Fri Oct 2 18:52:20 1998 Fernando Nasser <fnasser@cygnus.com> - - * sol-thread.c: Fixed prototypes and calls to supply_fpregset and - fill_fpregset - -1998-10-02 Keith Seitz <keiths@cygnus.com> - - * remote.c (remote_interrupt): Rewrite to use remote_stop. - (remote_interrupt_twice): Remove. remote_stop now handles it. - (remote_stop): New function which handles interrupting the - remote target so that CLUI and GUI use the same core functions - to achieve the same goal. - (remote_wait): Change to handle remote_stop properly. - [interrupted_already]: New static global to help remote_stop. - [remote_ops, extended_remote_ops]: Add remote_stop for to_stop member. - - * target.c: Rename static function "ignore" to "target_ignore" and - export it so that gdb can determin if some target vector member is - actually not defined. Replace all occurances of ignore. - - * target.h: Export target_ignore. - -Fri Oct 2 03:51:48 1998 Peter Schauer <pes@regent.e-technik.tu-muenchen.de> - - * target.c (target_xfer_memory): Handle requests with zero - transfer length right away. - - * values.c (unpack_double): Set up code, length and signedness of - type _after_ checking for typedef. - -Thu Oct 1 15:39:27 EDT 1998 Frank Ch. Eigler <fche@cygnus.com> - - * breakpoint.c (bpstat_stop_status): Do not consider an - untripped watchpoint as a "hit". - -Thu Oct 1 20:52:39 1998 Andrew Cagney <cagney@b1.cygnus.com> - - * exec.c (exec_file_command), convex-tdep.c (exec_file_command), - arm-xdep.c (exec_file_command), remote-rdp.c - (remote_rdp_create_inferior), remote-os9k.c - (rombug_create_inferior), remote-mm.c (mm_create_inferior), - remote-eb.c (eb_create_inferior), remote-es.c - (es1800_create_inferior), remote-rdi.c (arm_rdi_create_inferior), - remote-sim.c (gdbsim_create_inferior), remote-utils.c - (gr_create_inferior), remote-st.c (st2000_create_inferior), - remote-nindy.c (nindy_create_inferior), remote-hms.c - (hms_create_inferior), remote-e7000.c (e7000_create_inferior), - remote-array.c (array_create_inferior), remote-adapt.c - (adapt_create_inferior): Replace "exec" with "executable" in - messages. - -1998-09-25 Keith Seitz <keiths@cygnus.com> - - * rdi-share/unixcomm.c: If using cygwin32, also use the SERPORT and - PARPORT defines for win32. - (Unix_MatchValidSerialDevice): For cygwin32, valid serial port names - start with "com", not "/dev/tty". - (Unix_OpenSerial): Do not use O_NONBLOCK on cygwin32. - - * rdi-share/devsw.c (DevSW_Close): Free the device's state - (SwitcherState) so that the device may be reopened. - - * remote-rdi.c (mywritec): Send all output through gdb's *_unfiltered - functions, ignoring non-ASCII chars, so that non-tty UI's can snarf - the output from fputs_hook. - (mywrite): Ditto. - (arm_rdi_open): Set inferior_pid. - (arm_rdi_detach): Pop the target off the target stack so that - users can attach and detach multiple times. - (arm_rdi_close): Close the opened device and reset inferior_pid, too. - -1998-09-24 Jason Molenda (jsm@bugshack.cygnus.com) - - * configure.in: Change --enable-warnings to --enable-build-warnings. - * configure: Updated. - -1998-09-24 Jason Molenda (jsm@bugshack.cygnus.com) - - * configure.in (WARN_CFLAGS): Add -Wmissing-prototypes. - * configure: Regenerated. - -1998-09-24 Jason Molenda (jsm@bugshack.cygnus.com) - - * configure.in: Add --enable-warnings. - Adjust whitespace of other --with and --enable options so that - configure --help lines up correctly. - * aclocal.m4: Ditto. - * Makefile.in (WARN_CFLAGS): Add. Set by configure. - * configure: Regenerated. - -Thu Sep 24 15:44:34 1998 Stan Shebs <shebs@andros.cygnus.com> - - * remote-rdi.c: Fix formatting, remove some commented-out code. - (init_rdi_ops): Omit needless initializations. - -Wed Sep 23 18:21:03 1998 Andrew Cagney <cagney@b1.cygnus.com> - - * remote.c (remote_address_masked): New function - mask address - according to REMOTE_ADDRESS_SIZE. - (remote_address_size): New global. - (hexnumstr): New function - convert arbitrary unsigned to hex. - (remote_write_bytes, remote_read_bytes): Use hexnumstr to - construct packet address. Mask address when necessary. - (_initialize_remote): Add "set remoteaddresssize" command, set - REMOTE_ADDRESS_SIZE variable. - - * NEWS: Update. - -Wed Sep 23 18:08:52 1998 Andrew Cagney <cagney@b1.cygnus.com> - - * remote.c (_initialize_remote, packet_command, print_packet): - Pretty print code. - -Wed Sep 23 12:32:54 1998 <cagney@amy.cygnus.com> - - * remote.c (packet_command): Test REMOTE_DESC to determine if - remote connection is open. - -Tue Sep 22 22:27:24 1998 Mark Alexander <marka@cygnus.com> - - Patch from Dawn Perchik <dawn@cygnus.com>: - * rs6000-tdep.c (pop_frame): Handle generic dummy frames. - (push_arguments): Likewise. - (frame_saved_pc): Likewise. - (rs6000_frame_chain): Likewise. - (ppc_push_return_address): New function. - (get_saved_register): New function. - * config/powerpc/tm-ppc-eabi.h: Add generic dummy frame macros. - -Mon Sep 21 19:29:32 1998 Stu Grossman <grossman@babylon-5.cygnus.com> - - * defs.h utils.c (fputc_filtered): New function. Does the obvious... - * jv-lang.c (java_printchar): Fix output of chars > 0xff. Fold - java_emit_char into java_printchar. - * language.h (PRINT_LITERAL_FORM): Reformat for readability. - -Mon Sep 21 14:38:03 1998 Catherine Moore <clm@cygnus.com> - - * config/arm/tm-arm.h (*_BREAKPOINT): Define both little endian - and big endian breakpoint patterns. - - * arm-tdep.c (arm_break_point_from_pc): Insert either big endian - or little endian breakpoints depending upon target byte order. - -Fri Sep 18 07:53:08 1998 Peter Schauer <pes@regent.e-technik.tu-muenchen.de> - - * sol-thread.c (sol_thread_notice_signals): Use PIDGET when - passing pid down to procfs_notice_signals. - -Wed Sep 16 14:57:14 1998 Stu Grossman <grossman@babylon-5.cygnus.com> - - * stabsread.c (resolve_symbol_reference): Return 1 on success, 0 on - failure. - * (define_symbol): Check return value from resolve_symbol_reference, - and drop symbol if it fails. - -Tue Sep 15 15:24:16 1998 Stu Grossman <grossman@fencer.cygnus.com> - - * stabsread.c: Make all complaints static. - * Fix formatting of live range splitting code. - * (resolve_symbol_reference define_symbol resolve_live_range): Change - errors to complaints so that bad live range symbols won't abort the - entire symbol table. Handle errors by aborting just the current - symbol. - * (ref_init): Goes away. Folded into ref_add(). - * (REF_MAP_SIZE): Put parens around parameter so that args like - `1 + 2' get handled correctly (yes, this was a real bug). - * (ref_add): Remove check for allocation failures. Not necessary - when using xrealloc(). Fix pointer arithmetic problem when clearing - memory. This and the previous patch prevent random SEGV's when there - are lots of live range symbols. - -Tue Sep 15 14:02:01 1998 Nick Clifton <nickc@cygnus.com> - - * remote-rdi.c: Prevent multiple attempts to close the remote - connection. - -Tue Sep 15 10:24:17 1998 Andrew Cagney <cagney@b1.cygnus.com> - - * printcmd.c (examine_i_type): New static - type for instructions. - (do_examine): For "i" format, specify examine_i_type. - (do_examine): Call value_at_lazy instead of value_at so that - examine data is only fetched if it is used. - (x_command): If examine data was not fetched, set convenience - variable "__" to void. - (_initialize_printcmd): Initialize examine_i_type. - -Sun Sep 13 01:34:59 1998 Michael Snyder <msnyder@cleaver.cygnus.com> - - * blockframe.c (find_pc_sect_partial_function): use bfd section - of msymbol for end of section comparison. - -Fri Sep 11 14:02:49 1998 Michael Snyder <msnyder@cleaver.cygnus.com> - - * tracepoint.c: clean up several unused variables and such. - -Fri Sep 11 12:38:34 EDT 1998 Zdenek Radouch (radouch@cygnus.com) - - * arm-tdep.c (arm_push_arguments): fixed frame construction - -Thu Sep 10 20:51:23 1998 Michael Snyder <msnyder@cleaver.cygnus.com> - - * mn10300-tdep.c (mn10300_analyze_prologue): guard against NULL. - -Wed Sep 9 19:37:36 1998 Stan Shebs <shebs@andros.cygnus.com> - - * dbxread.c (IGNORE_SYMBOL): Remove definition, is never used. - * os9kread.c: Remove comment mentioning IGNORE_SYMBOL. - -Wed Sep 9 11:39:05 1998 Ron Unrau <runrau@cygnus.com> - - * blockframe.c(find_pc_sect_partial_function): look for min syms in - the same section when trying to guess the end of a function. - * symfile.c(list_overlays_command): use print_address_numeric - * remote-sim.c: export simulator_command - -1998-09-08 Jason Molenda (jsm@bugshack.cygnus.com) - - * breakpoint.c (bpstat_stop_status): Declare a bp match if the - current fp matches the bp->fp OR if the current fp is less than - the bp->fp if we're looking at a bp_step_resume breakpoint. - -Tue Sep 8 19:42:58 1998 Stan Shebs <shebs@andros.cygnus.com> - - * symtab.h (struct symtab): Remove EXTRA_SYMTAB_INFO hook, - not currently used. - * symfile.c (allocate_symtab): Deprecate use of - INIT_EXTRA_SYMTAB_INFO here. - -Fri Sep 4 15:33:25 1998 Stan Shebs <shebs@andros.cygnus.com> - - * README: Update remote debugging and testsuite info. - -Thu Sep 3 13:50:20 1998 Mark Alexander <marka@cygnus.com> - - * config/mn10300/tm-mn10300.h (FP_REGNUM): Redefine to be a - pseudo-register, not the same as a3. - (D2_REGNUM, D3_REGNUM, A2_REGNUM, A3_REGNUM): Define. - * mn10300-tdep.c (fix_frame_pointer): New function. - (set_movm_offsets): Use register number macros instead of - hard-coded constants. - (mn10300_analyze_prologue): Fix to handle redefinition of FP_REGNUM. - (mn10300_frame_chain): Fix to handle redefinition of FP_REGNUM; - use register number macros instead of hard-coded constants; - add missing parameter to call of mn10300_analyze_prologue. - (mn10300_frame_saved_pc): Use register number macros instead of - hard-coded constants. - -Tue Sep 1 12:04:57 EDT 1998 Zdenek Radouch (radouch@cygnus.com) - - Changes to support/fix ARM/ELF port. Use MAKE_MSYMBOL_SPECIAL for - both ELF and COFF; - * elfread.c (elf_symtab_read): use ELF specific macro - * coffread.c (coff_symtab_read): use COFF_MAKE_MSYMBOL_SPECIAL() - * arm-tdep.c: separate COFF and ELF thumb processing - disable --mapcs-float processing - * dwarf2read.c: Disabled building of minimal symbols - * config/arm/tm-arm.h: new macros for distinguishing arm/thumb - * config/mips/tm-mips.h: use ELF specific macro - -Mon Aug 31 15:42:10 1998 Tom Tromey <tromey@cygnus.com> - - * top.c (context_hook): Define. - -Tue Aug 25 13:21:58 1998 Michael Snyder <msnyder@cleaver.cygnus.com> - - * ax-gdb.c (gen_var_ref): Allow for typedef types. - (gen_cast, gen_bitfield_ref, gen_expr, gen_deref): ditto. - -Mon Aug 24 18:29:03 1998 Michael Snyder <msnyder@cleaver.cygnus.com> - - * tracepoint.c (collect_symbol): Handle register doubles that - are stored in two registers. - -Mon Aug 24 14:39:08 1998 Mark Alexander <marka@cygnus.com> - - * sh-stub.c (undoSStep): Improve comment. - * sparc-tdep.c (sparc_extract_struct_value_address): Simplify to use - same method on both 32-bit and 64-bit machines. - * sparcl-tdep.c (sparclite_check_watch_resources): Simulator doesn't - support hardware breakpoints. - * config/sparc/tm-sparc.h (CALL_DUMMY): Improve comments. - -1998-08-20 Jason Molenda (jsm@bugshack.cygnus.com) - - * rdi-share/Makefile.am (INCLUDES): Fix typeo. - * rdi-share/Makefile.in: Regenerated. - -1998-08-19 Jason Molenda (jsm@bugshack.cygnus.com) - - * rdi-share/Makefile.am: Use just `INCLUDES' not `libname_INCLUDES'. - * rdi-share/Makefile.in: Regenerated. - -1998-08-19 Keith Seitz <keiths@cygnus.com> - - * v850ice.c (v850ice_stop): New function to stop the ICE. - (v850ice_load) Pass filename to ICE DLL. - (ice_stepi, ice_nexti, ice_cont): Do not directly call the gdb - commands -- let the GUI do it so that it can retain control - of the display. - -Wed Aug 19 15:53:52 1998 Anthony Green <green@hoser.cygnus.com> - - * i386v4-nat.c: Include sys/reg.h if present. - -Wed Aug 19 03:07:53 1998 Richard Henderson <rth@cygnus.com> - - * config/alpha/alpha-linux (XDEPFILES): Build ser-tcp. - -1998-08-18 Fernando Nasser <fnasser@totem.to.cygnus.com> - - * symtab.c (decode_line_1): For minimal symbol, SKIP_PROLOG to - make sure we stop after the frame pointer is locaded and backtrace - prints an accurate stack. Complements changes made on Mon Jul 27 - 10:45:56 1998 - (decode_line_2): Replaced the whitespace after ">" in a prompt - which has been taken away by changes made on Sun Jul 19 02:11:45 - 1998 - -1998-08-18 Keith Seitz <keiths@cygnus.com> - - * stack.c: Define new hook, selected_frame_level_changed_hook, which - will be called whenever the selected stack level changes. - (select_frame): Call the selected_frame_level_changed_hook. - -Tue Aug 18 18:03:42 1998 Stan Shebs <shebs@andros.cygnus.com> - - * remote-rdi.c (arm_rdi_open): Pass serial device name to - Adp_OpenDevice, and include it in error reports. - -1998-08-18 Jason Molenda (jsm@bugshack.cygnus.com) - - * configure.in: Add more header files to AC_CHECK_HEADERS. - * configure: Regenerated. - - * command.c: Include wait.h or sys/wait.h if present. - * inftarg.c: Ditto. - * core-aout.c: Include ptrace.h or sys/ptrace.h if present, based - on autoconf test. - * infptrace.c: Ditto. - - * expprint.c: Include ctype.h for isprint prototype. - * i386aix-nat.c: Include sys/reg.h if autoconf says it is present. - * i386v-nat.c: Include ptrace.h, sys/ptrace.h, and sys/reg.h if - present, based on autoconf test. - - * utils.c: Include curses.h and term.h if present. - (puts_debug): Change 'carriage_return' local variable to return_p - to avoid name clash. - - * config/m68k/nm-apollo68b.h: Don't define PTRACE_IN_WRONG_PLACE, - determine it with autoconf. - * config/i386/nm-linux.h: Don't define NO_SYS_REG_H, determine it - with autoconf. - * config/i386/nm-i386sco.h: Don't define NO_PTRACE_H, determine it - with autoconf. - * config/i386/nm-i386v.h: Ditto. - * config/i386/nm-symmetry.h: Ditto. - * config/m88k/xm-cxux.h: Ditto. - * config/m88k/xm-dgux.h: Ditto. - - * config/m68k/delta68.mh (NAT_FILE): nm-delta68.h no longer necessary. - * config/m68k/nm-delta68.h: Removed. - -Fri Aug 14 11:14:03 1998 Jeffrey A Law (law@cygnus.com) - - * mn10300-tdep.c (set_movm_offsets): Change second argument to - be the actual args to movm itself. All callers changed. Only set - fi->fsr.regs[x] if reg X is saved by the movm instruction. - -Fri Aug 14 04:18:23 1998 Peter Schauer <pes@regent.e-technik.tu-muenchen.de> - - * sol-thread.c (lwp_to_thread): Fix error message for failing - td_ta_map_lwp2thr call. - (ps_lgetLDT): Mask off upper bits in GS register when comparing - with selector. - -Wed Aug 12 16:30:01 1998 Frank Ch. Eigler <fche@cygnus.com> - - * remote-sim.c (simulator_command): Reset register cache after - simulator command. - -Wed Aug 12 09:00:26 1998 Stu Grossman <grossman@babylon-5.cygnus.com> - - * expprint.c (dump_prefix/postfix_expression): Don't try to print - type expressions. - -Tue Aug 11 11:33:25 1998 Stu Grossman <grossman@babylon-5.cygnus.com> - - * c-typeprint.c (c_print_type): Don't crash if varstring is null. - * expprint.c expression.h (dump_expression): Rename to - dump_prefix_expression. - * Print out the expression in normal form. Call print_longest - instead of trying to do it ourselves. - * (dump_postfix_expression): New function, prints out the expression - with indentation and better formatting and interpretation. - * parse.c (parse_exp_1): Put calls to dump expressions under ifdef - MAINTENANCE_CMDS and expressiondebug variable. - -Thu Aug 6 13:20:02 1998 Ron Unrau <runrau@cygnus.com> - - * infrun.c (wait_for_inferior): use stop_func_name instead of - stop_func_start to decide that no debug info exists. - -Thu Jul 30 13:53:50 1998 Mark Alexander <marka@cygnus.com> - - * mips-tdep.c (mask_address_p): New variable. - (mips_addr_bits_remove): Test mask_address_p to decide whether - to mask off the upper 32 bits of addresses. - (_initialize_mips_tdep): Add command to set mask_address_p. - (mips_call_dummy_address): New function. - * config/mips/tm-mips.h (CALL_DUMMY_ADDRESS): Redefine to - call mips_call_dummy_address. - -1998-07-29 Fernando Nasser <fnasser@totem.to.cygnus.com> - - * symfile.c (add_symbol_file_command): Test for the from_tty - parameter and avoid query when not interactive. - -Mon Jul 27 16:11:42 1998 Michael Snyder <msnyder@cleaver.cygnus.com> - - * tracepoint.c (remote_set_transparent_ranges): new function. - Send the start and end addresses of all loadable read-only - sections down to the trace target, so that it can treat them - as "transparent" (ie. don't care if they were collected or not). - -Mon Jul 27 15:38:07 1998 Mark Alexander <marka@cygnus.com> - - * mn10300-tdep.c (mn10300_analyze_prologue): Undo previous fix - for setting frame address in optimized code; made unnecessary - by compiler fixes. - -Mon Jul 27 10:45:56 1998 Martin M. Hunt <hunt@cygnus.com> - - * symtab.c (decode_line_1): For minimal symbol, call - find_pc_sect_line() to make sure the line number gets set - properly. - (print_symbol_info): Redeclare function void. - -1998-07-27 Jason Molenda (jsm@bugshack.cygnus.com) - - * config/d10v/tm-d10v.h (REGISTER_NAMES): sp -> r15. The - stack pointer et al are synthesized from the SP_REGNUM (etc) - defines and should not be mentioned in REGISTER_NAMES. - -Fri Jul 24 14:41:19 1998 Michael Snyder <msnyder@cleaver.cygnus.com> - - * tracepoint.c (encode_actions): Treat register names and simple - variable names as special cases and don't convert them to byte- - codes: these things can be collected far more efficiently - without invoking the bytecode interpreter. - -Fri Jul 24 13:32:46 1998 Mark Alexander <marka@cygnus.com> - - * config/i386/tm-i386.h (STORE_STRUCT_RETURN): Make it - work on hosts of any endianness. - * config/i386/tm-i386v.h: Ditto. - -Fri Jul 24 07:41:12 1998 Mark Alexander <marka@cygnus.com> - - * mn10300-tdep.c (set_movm_offsets): New helper function - for mn10300_analyze_prologue. - (mn10300_analyze_prologue): Simplify by factoring out common code. - Fix bugs in setting frame address for optimized code. - Use read_memory_nobpt instead of target_read_memory. - -Thu Jul 23 17:01:17 1998 Michael Snyder <msnyder@cleaver.cygnus.com> - - * tracepoint.c (collect_symbol): handle LOC_ARG case. - -Thu Jul 23 15:07:40 1998 Dawn Perchik <dawn@cygnus.com> - - * sparc-tdep.c (sparc_init_extra_frame_info): Recognize when we're - in a function prologue before the SAVE instruction. - (sparc_frame_saved_pc): Ditto. - * config/sparc/tm-sparc.h (EXTRA_FRAME_INFO): Add in_prologue flag. - -Thu Jul 23 14:58:09 1998 Dawn Perchik <dawn@cygnus.com> - - * i386-tdep.c (i386_get_frame_setup): Recognize function - prologues in code compiled with -fcheck-stack. - -Thu Jul 23 14:49:27 1998 Dawn Perchik <dawn@cygnus.com> - - * remote-mips.c (remote_mips_insert_hw_breakpoint, - remote_mips_remove_hw_breakpoint): New functions for hardware - breakpoints on LSI targets. - * config/mips/tm-embed.h (target_remove_hw_breakpoint, - target_insert_hw_breakpoint): Define to call - remote_mips_insert_hw_breakpoint and remote_mips_remove_hw_breakpoint, - respectively. - -1998-07-21 Fernando Nasser <fnasser@totem.to.cygnus.com> - - * source.c (print_source_lines): Print "No such file or directory" - just once. - (directory_command): same as above; resets if user issues dir. - -Sun Jul 19 02:11:45 1998 Martin M. Hunt <hunt@cygnus.com> - - * symtab.c (decode_line_2): Instead of printing a prompt - and calling command_line_input() without a prompt, just - call it with the proper args. This makes the GUI work too. - -Fri Jul 17 9:26:50 1998 Ron Unrau <runrau@cygnus.com> - - * blockframe.c (find_pc_sect_partial_function): allow for the possi- - bility of multiple symbols at the same address when finding high. - * breakpoint.c (resolve_sal_pc): if the function based section lookup - fails, try getting the section from the minimal symbol table. - * parse.c (write_exp_msymbol): use symbol_overlayed_address to get - the LMA of a minimal symbol if unmapped. - * symtab.c (find_line_symtab): change interface to return symtab - containing the best linetable found. - (decode_line_1): use find_line_symtab to set val.symtab. This should - improve support for source files with multiple symtabs. - -Wed Jul 15 11:51:33 1998 Keith Seitz <keiths@cygnus.com> - - * main.c (main): Fix violations of GNU coding standard. - - * breakpoint.c: Export delete_command. - - * infcmd.c: Export continue_command, stepi_command, and nexti_command. - - * Makefile.in: Add target for v850ice.o. - - * configure.tgt: Add cygwin32 dependencies for v850 ice. - -Wed Jul 15 10:58:29 1998 Nick Clifton <nickc@cygnus.com> - - * tracepoint.c (set_raw_tracepoint): Cope with symbols that do not - have an associated directory. - -Mon Jul 13 15:21:04 1998 Mark Alexander <marka@cygnus.com> - - * utils.c (puts_debug): Display non-printable characters in hex - instead of octal. - -Thu Jul 9 16:16:47 1998 Jeffrey A Law (law@cygnus.com) - - * mn10300-tdep.c (mn10300_generic_register_names): New variable. - (set_machine_hook): New function. Copy the appropriate register - names into reg_names. - (_initialize_mn10300_tdep): Set up to call set_machine_hook. - * tm-mn10300 (NUM_REGS): Bump to 32. - (REGISTER_NAMES): Updated accordingly. - - -Tue Jul 7 7:40:13 1998 Ron Unrau <runrau@cygnus.com> - - * symtab.c (find_pc_sect_psymbol): allow case where textlow is 0 - -Thu Jul 2 15:57:58 1998 Frank Ch. Eigler <fche@cygnus.com> - - * breakpoint.c (resolve_sal_pc): Accept absence of innermost - Lexical block for breakpoint resolution. - -Thu Jul 2 10:22:00 1998 Dawn Perchik <dawn@cygnus.com> - - * mdebugread.c (parse_partial_symbols): Go ahead and read the .mdebug - section, but just don't add a 2nd minimal symbol if this is an .mdebug - section in an ELF file. - -1998-07-01 Jim Blandy <jimb@zwingli.cygnus.com> - - * Makefile.in (ax-general.o): Depend on $(defs_h) too. - (ax_h): Bother to define this. - -Mon Jun 29 19:01:18 1998 Jim Wilson <wilson@cygnus.com> - - * gnu-regex.c (re_comp): Add cast to char * before gettext calls. - -Sun Jun 28 11:35:48 1998 Peter Schauer <pes@regent.e-technik.tu-muenchen.de> - - Improve support for SunPro F77. - * dbxread.c (end_psymtab, process_one_symbol): Handle minimal - symbols with trailing underscore names. - * minsyms.c (find_stab_function_addr): Ditto. - * dbxread.c (process_one_symbol): Ignore N_ALIAS for now. - * partial-stab.h (case N_ALIAS): Ditto. - * stabsread.c (read_sun_builtin_type): Handle boolean types. - -Fri Jun 26 14:03:01 1998 Keith Seitz <keiths@cygnus.com> - - * symtab.h (enum namespace): Add new namespaces FUNCTIONS_NAMESPACE, - TYPES_NAMESPACE, METHODS_NAMESPACE, and VARIABLES_NAMESPACE used by - new search_symbols. - Add prototype for search_symbols and free_search_symbols. - - * symtab.c (list_symbols): Rewrite to use new search_symbols. - (file_matches): New helper function for search_symbols. - (free_search_symbols): New function which frees data returned from - search_symbols. - (print_symbol_info): New helper function which prints info about a - matched symbol to stdout. Extracted from old list_symbols. - (print_msymbol_info): New helper function which prints info about - a matched msymbol to stdout. Extracted from old list_symbols. - (symtab_symbol_info): Extracted from old list_symbols. - (variables_info): Use symtab_symbol_info. - (functions_info): Use symtab_symbol_info. - (types_info): Use symtab_symbol_info. - (rbreak_command): Rewrite to use new search_symbols. - -Thu Jun 25 22:38:32 1998 Frank Ch. Eigler <fche@cygnus.com> - - * mips-tdep.c (mips_push_arguments): Use 128-bit stack frame - alignment for inferior calls. - -Wed Jun 24 23:17:12 1998 Mark Alexander <marka@cygnus.com> - - * mn10200-tdep.c (mn10200_analyze_prologue): Fix calculation - of jsr target address. - -Tue Jun 23 19:37:46 1998 Mark Alexander <marka@cygnus.com> - - * config/mn10200/tm-mn10200.h (SAVED_PC_AFTER_CALL): Don't - zero upper byte of address. - -Tue Jun 23 17:32:26 1998 Michael Snyder <msnyder@cleaver.cygnus.com> - - * rs6000-tdep.c (pop_dummy_frame): use memcpy. - (push_arguments): use memset. - (various other places): fix up indentation and long lines. - -Tue Jun 23 11:58:35 1998 Jason Molenda (crash@bugshack.cygnus.com) - - * configure.in: s/lXext/-lXext/ for Jillian's change. - -Tue Jun 23 11:14:04 1998 Michael Snyder <msnyder@cleaver.cygnus.com> - - * source.c (find_source_lines): fix indentation. - - * config/mips/tm-irix5.h: Modify to work better on irix 6, by - making FP registers 8 bytes instead of 4. - REGISTER_BYTES: redefine. REGISTER_BYTE(): redefine. - REGISTER_VIRTUAL_TYPE: redefine. MIPS_LAST_ARG_REGNUM: redefine. - * irix5-nat.c (fetch_core_registers): read 8 bytes per FP register. - * mips-tdep.c (FP_REGISTER_DOUBLE): new macro to distinguish - targets with 8-byte FP registers (don't use TARGET_MIPS64). - (STACK_ARGSIZE): new macro, how much space is taken up on the - stack for each function argument (don't use TARGET_MIPS64). - (mips_push_arguments): modify logic to work better on Irix 6 - (n32 ABI). - -Tue Jun 23 12:29:53 1998 Jillian Ye <jillian@cygnus.com> - - * configure.in: Add -lXext to mips_extra_libs - * configure: Regenerated. - -Sun Jun 21 09:31:12 1998 Ron Unrau (runrau@cygnus.com) - - * symtab.c (find_line_pc): assumed that a PC of 0 is illegal. - Changed to pass PC as arg and return 1 if valid (0 otherwise). - * symtab.h: Change prototype to match. - * symtab.c (find_line_pc_range): Use new interface. - * breakpoint.c (resolve_sal_pc): Ditto. - -Wed Jun 17 15:50:00 1998 Ron Unrau (runrau@cygnus.com) - - * parse.c (target_map_name_to_register): Check target specific - aliases *first* so that it can over-ride architectural names - -Wed Jun 17 17:13:38 1998 Said Ziouani (saidz@park-street.cygnus.com) - - * remote-sds.c (sds_start_remote): Fix printf call. - -Tue Jun 16 16:32:08 1998 Mark Alexander <marka@cygnus.com> - - * mn10200-tdep.c (mn10200_analyze_prologue): Fix null pointer - crash when in "start". - -Tue Jun 16 14:38:40 1998 Ron Unrau (runrau@cygnus.com) - - * dbxread.c: reset function_start_offset after a finishing N_FUN - is seen. - * remote-sim.c: allow TARGET_REDEFINE_DEFAULT_OPS to override - target vectors as needed. - -Sun Jun 14 08:46:25 1998 Ron Unrau (runrau@cygnus.com) - - * partial-stab.h: 'F' and 'f' type N_FUN psymbols should pass - CUR_SYMBOL_VALUE as CORE_ADDR instead of long - * buildsym.[ch]: export pending_blocks list - -Sat Jun 13 13:02:32 1998 Dawn Perchik (dawn@cygnus.com) - - * remote.c: Fix remote help string to match that of help.exp. - -Fri Jun 12 14:22:55 1998 Jason Molenda (crash@bugshack.cygnus.com) - - * configure.in (LIBS): Add -lw to the list of libraries if needed. - -Thu Jun 11 15:05:10 1998 Jason Molenda (crash@bugshack.cygnus.com) - - * btowc.c: Removed. - * configure.in: Don't see if we need to replace btowc(). - * Makefile.in: Don't include LIBOBJS. - * configure: Regenerated. - * gnu-regex.c (regex_compile): Only support i18n [:foo:] if - we have btowc(). - -Wed Jun 10 15:39:14 1998 Stu Grossman <grossman@babylon-5.cygnus.com> - - * c-exp.y: Fix problems with parsing "'foo.bar'::func". - Some languages allow symbols with dots. - - * gdbtypes.c (check_stub_method): Cosmetic. Use more descriptive - names for parameters. - - * jv-exp.y: Parser now accepts primitive types. - * (parse_number): Use correct ifdef for scanf long double support. - * jv-lang.c (java_array_type): Initial cut at array support. - - * language.c language.h (set_language): Now returns previous language. - - * symtab.c (find_methods): Make static. Cosmetic changes, including - indentation, and adding descriptive comments. Move local variable - defs into the block they are used in. - * Don't call check_stub_method any more. Use gdb_mangle_name to - generate the full method name. find_method doesn't need all the other - goobldegook that check_stub_method does. - * (gdb_mangle_name): Use more descriptive names for parameters. Fix - comment. - * (lookup_partial_symbol lookup_block_symbol): Check for java to - ensure we can find mangled names. - * (decode_line_1): Move local variable defs into the block they are - used in. (Improves code readability.) - -Wed Jun 10 18:04:35 1998 Frank Ch. Eigler <fche@cygnus.com> - - * gdbtypes.c (get_discrete_bounds): Assign unsigned type flag for - all-positive enum. - (create_set_type): Ditto for all-positive set values. - * values.c (unpack_field_as_long): Check for typedef in struct - field unpacking. - -Wed Jun 10 14:06:05 1998 Jason Molenda (crash@bugshack.cygnus.com) - - * configure.in: Add some tests for gnu-regex.c's benefit. - See if btowc() function is provided in C library. - * configure, config.in: Regenerated. - * Makefile.in (CLIBS, CDEPS): Add @LIBOBJS@ to build btowc.c - if necessary. - * btowc.c: New file. - - * gnu-regex.c: Reorder wchar.h and wctype.h includes for Solaris' - benefit. - Drop namespace preserving defines for now. - -Wed Jun 10 11:53:42 1998 Jason Molenda (crash@bugshack.cygnus.com) - - * gnu-regex.c: Include "gnu-regex.h", not "regex.h". - -Wed Jun 10 11:34:07 1998 Jason Molenda (crash@bugshack.cygnus.com) - - * gnu-regex.c, gnu-regex.h: Change LGPL license to GPL license - to stay consistent with the rest of GDB. - -Wed Jun 10 11:27:39 1998 Jason Molenda (crash@bugshack.cygnus.com) - - * gnu-regex.c, gnu-regex.h: Update to current FSF (glibc) versions. - -Wed Jun 10 10:58:18 1998 Michael Snyder <msnyder@cleaver.cygnus.com> - - * printcmd.c (disassemble_command): move overlay mapping code - "up" into find_pc_partial_function. - * blockframe.c (find_pc_partial_function): adjust start address - and end address for overlays (mapped vs. unmapped addresses), - so that all callers of this function may benefit. - * m32r-tdep.c (m32r_skip_prologue): adjust indentation. - -Mon Jun 8 16:08:10 1998 Ron Unrau <runrau@cygnus.com> - - * objfiles.c (add_to_objfile_sections): All targets to define - TARGET_KEEP_SECTION to permit them to retain bfd sections that - GDB would otherwise have discarded. - -Fri Jun 5 13:56:19 1998 Doug Evans <devans@canuck.cygnus.com> - - * dbxread.c (read_dbx_symtab): Don't lower texthigh for last psymtab. - -Thu Jun 4 18:35:04 1998 Stan Shebs <shebs@andros.cygnus.com> - - * remote.c (init_extended_remote_ops): Make extended_remote_ops - by copying from remote_ops, move it and init_remote_ops to - usual place at end of file, remove "void" from arg lists. - -Thu Jun 4 17:51:06 1998 Mark Alexander <marka@cygnus.com> - - * sparc-tdep.c (sparc_fix_call_dummy): Byte-swap the call dummy - on bi-endian machines. - (sparc_extract_return_value): Handle values smaller than int on - machines with little-endian data. - (sparc_target_architecture_hook): Set bi_endian flag. - -Thu Jun 4 12:14:48 1998 Michael Snyder <msnyder@cleaver.cygnus.com> - - * printcmd.c (disassemble_command): Fix off-by-one error for - disassembling functions in unmapped overlay sections. - -Thu Jun 4 10:15:03 1998 Elena Zannoni <ezannoni@kwikemart.cygnus.com> - - * remote.c: merged. - - - Jim Blandy <jimb@zwingli.cygnus.com> - (print_packet, remote_packet_command): New functions. - (_initialize_remote): Register the remote-packet command. - - David Taylor <taylor@texas.cygnus.com> - (_initialize_remote): remote-compare is now - compare-sections. - - Elena Zannoni <ezannoni@kwikemart.cygnus.com> - (remote_compare_command): added warning, issued in case - of mismatch only. - -Thu Jun 4 08:25:38 1998 Michael Snyder <msnyder@cleaver.cygnus.com> - - * remote.c (remote_compare_command): New function, new command. - Compare object file binary image with corresponding memory on - remote target. Report differences. - -Tue Jun 2 19:05:04 1998 Mark Alexander <marka@cygnus.com> - - * sparc-tdep.c (sparc_target_architecture_hook): Set target - byte order only when it's selectable. - -Tue Jun 2 02:01:56 1998 Mark Alexander <marka@cygnus.com> - - * sparc-tdep.c (sparc_target_architecture_hook): New function to - set endianness based on machine type. - (_initialize_sparc_tdep): Initialize target_architecture_hook. - (sparc_print_register_hook): Print PSR and FPSR in fancy format - on 32-bit machines. - * config/sparc/tm-sparc.h (PRINT_REGISTER_HOOK): Redefine to - call sparc_print_register_hook instead of using inline code. - * config/sparc/tm-sp64.h (PRINT_REGISTER_HOOK): Remove. - -Thu May 28 17:19:14 1998 Keith Seitz <keiths@cygnus.com> - - * main.c (main): Check for NULL from getenv on CYGWIN32. - -Thu May 28 09:41:44 1998 Nick Clifton <nickc@cygnus.com> - - * monitor.c (monitor_vsprintf): Handle %%. Patch courtesy of - Felix Lee (flee@cygnus.com) - -Thu May 28 00:27:35 1998 Peter Schauer <pes@regent.e-technik.tu-muenchen.de> - - * mips-tdep.c (mips_push_dummy_frame): Fix calculation of - PROC_REG_OFFSET and PROC_FREG_OFFSET. - -Mon Apr 27 14:37:49 1998 Andrew Cagney <cagney@b1.cygnus.com> - - * config/v850/tm-v850.h (REGISTER_BYTE): FP_REGNUM and - FP_RAW_REGNUM use the same register location. - - * v850-tdep.c (v850_scan_prologue): Use FP_RAW_REGNUM instead of - FP_REGNUM. - (v850_frame_chain): Ditto. - - * config/v850/tm-v850.h (REGISTER_NAMES): Add "fp". - (NUM_REGS): Update. - (FP_REGNUM): Update. - (FP_RAW_REGNUM): Define. - -Wed May 27 14:22:31 1998 Keith Seitz <keiths@cygnus.com> - - * main.c (main): Convert the path returned from getenv to a posix - path on cygwin32 hosts. - -Mon May 25 13:31:27 1998 Keith Seitz <keiths@cygnus.com> - - * remote.c (remote_open_1): If an error occurs starting the remote, - pop the target AND return. - -Sat May 23 02:23:09 1998 Peter Schauer <pes@regent.e-technik.tu-muenchen.de> - - * dwarf2read.c (read_subroutine_type): Set TYPE_FLAG_PROTOTYPED - on C++ functions. - * valops.c (value_arg_coerce): Add new argument to indicate whether - the function has a prototype, handle integer and float promotions - accordingly. - (call_function_by_hand): Always call value_arg_coerce, pass down - prototype information. - -Fri May 22 10:56:36 1998 John Metzler <jmetzler@cygnus.com> - - * remote.c (_initialize_remote): Typo extended__remote - -Thu May 21 13:14:25 1998 John Metzler <jmetzler@cygnus.com> - - * gnu-nat.c (init_gnu_ops): Initialization of target ops by assignment. - (_initialize_gnu_nat): Call new init - * mac-nat.c (init_child_ops): Ditto. - (_initialize_mac_nat): Ditto. - * monitor.c (init_base_monitor_ops): Ditto. - (_initialize_remote_monitors): Ditto. - * ppc-bdm.c (init_bdm_ppc_ops): Ditto. - (_initialize_bdm_ppc): Ditto. - * remote-adapt.c (init_adapt_ops): Ditto. - (_initialize_remote_adapt): Ditto. - * remote-array.c (init_array_ops): Ditto. - (_initialize_array): Ditto. - * remote-bug (init_bug_ops): Ditto. - (_initialize_remote_bug): Ditto. - * remote-e7000.c (init_e7000_ops): Ditto. - (_initialize_remote_e7000): Ditto. - * remote-eb.c (init_eb_ops): Ditto. - (_initialize_remote_eb): Ditto. - * remote-es.c (init_es1800_ops): Ditto. - (init_es1800_child_ops): Ditto. - (_initialize_es1800): Ditto. - * remote-hms.c (init_hms_ops): Ditto. - (_initialize_remote_hms): Ditto. - * remote-mm.c (init_mm_ops): Ditto. - (_initialize_remote_mm): Ditto. - * remote-nindy.c (init_nindy_ops): Ditto. - (_initialize_nindy): Ditto. - * remote_nrom.c (init_nrom_ops): Ditto. - (_initialize_remote_nrom): Ditto. - * remote-os9k (init_rombug_ops): Ditto. - (_initialize_remote_os9k): Ditto. - * remote-rdi.c (init_rdi_ops): Ditto. - (_initialize_remote_rdi): Ditto. - * remote-rdp.c (init_remote_rdp_ops): Ditto. - (_initialize_remote_rdp): Ditto. - * remote-sds.c (init_sds_ops): Ditto. - (_initialize_remote_sds): Ditto. - * remote-sim.c (init_gdbsim_ops): Ditto. - (_initialize_remote_sim): Ditto. - * remote-st.c (init_st2000_ops): Ditto. - (_initialize_remote_st2000): Ditto. - * remote-udi.c (init_udi_ops): Ditto. - (_initialize_remote_udi): Ditto. - * remote-vx.c (init_vx_ops): Ditto. - (init_vx_run_ops): Ditto. - (_initialize_vx): Ditto. - * remote.c (init_remote_ops): Ditto. - (init_extended_remote_ops): Ditto. - (_initialize_remote): Ditto. - * sparcl-tdep.c (init_sparclite_ops): Ditto. - (_initialize_sparcl_tdep): Ditto. - * v850ice.c (init_850ice_ops): Ditto. - (_initialize_v850ice): Ditto. - * win32-nat.c (init_child_ops): Ditto. - (_initialize_inftarg): Ditto. - -1998-05-21 Jim Blandy <jimb@zwingli.cygnus.com> - - * ax-gdb.c (const_var_ref): Don't handle function names. I don't - want to implement all the "usual unary conversion" rules for - constants. - (gen_usual_unary): Turn "function" values into "pointer to - function" values, in accordance with ANSI. - (gen_deref): Don't do the usual unary conversions here. Let the - caller do it. Note that dereferencing a function pointer yields - a function designator, which we call an rvalue, not an lvalue. - (gen_address_of): Handle functions specially. - (gen_struct_ref): Perform the usual unary conversions before - calling gen_deref. - (gen_expr): In case for the prefix '*' operator, call - gen_usual_unary manually. - -Wed May 20 15:29:41 1998 Gavin Koch <gavin@cygnus.com> - - * mips/tm-tx39.h (MIPS_DEFAULT_FPU_TYPE): Defined as MIPS_FPU_NONE. - * mips/tm-tx39l.h: Same. - -Wed May 20 10:12:11 1998 John Metzler <jmetzler@cygnus.com> - - * m32r-tdep.c (decode_prologue): Handle frames compiled with -Os. - Split out as separate function called by skip prologue and scan - prologue. new formula handles optimization in which the prologue - is interleaved with the body of the function. Also recognizes new - variations of prologue encoding. Use of frame pointer is - essential to debugging, -fno-omit-frame-pointer - (m32r_skip_prologue): Call decode prologue, ignore line info - (m32r_scan_prologue): Call decode prologue, ignore line info. - -Tue May 19 17:23:54 1998 John Metzler <jmetzler@cygnus.com> - - * w89k-rom.c (_initialize_w89k): Call new init function - (init_w89k_cmds): Convert to dynamic initialization of monitor_ops - data structure for forward compatability with additions to the - data structure. - * dbug-rom.c (_initialize_dbug_rom): ditto - (init_dbug_cmds): ditto - * m32r-rom.c (_initialize_m32r_rom): ditto - (init_m32r_cmds): ditto - -Tue May 19 14:54:11 1998 Michael Snyder <msnyder@cleaver.cygnus.com> - - * tracepoint.c (memrange_cmp): use const void * args to avoid - ANSI compiler warnings. - -1998-05-19 Jim Blandy <jimb@zwingli.cygnus.com> - - * ax-gdb.c (gen_fetch, gen_var_ref, gen_deref, find_field, - gen_bitfield_ref, gen_expr): Call error, not abort. - * ax-general.c (read_const, generic_ext, ax_trace_quick, - ax_label, ax_const_d, ax_reg, ax_print): Same. - - * tracepoint.c: Remove the $(...) syntax for memranges. - (validate_actionline, encode_actions, trace_dump_command): Remove - clauses for the $(...) syntax. - (parse_and_eval_memrange): Function deleted. - (_initialize_tracepoint): Update function description. - - * ax-gdb.c (_initialize_ax_gdb): Make the "agent" command a - subcommand of "maintenance", as it should have been from the - beginning. #include "gdbcmd.h", to get the declaration for - maintenancelist. - * Makefile.in: Document that dependency. - -Tue May 19 12:00:58 1998 Elena Zannoni <ezannoni@kwikemart.cygnus.com> - - * tracepoint.c (get_tracepoint_by_number): new function, to access - traceframe_number for use of the GUI. - - * tracepoint.h: added prototype for get_traceframe_number. - -Mon May 18 13:34:27 1998 Keith Seitz <keiths@cygnus.com> - - * dbxread.c (process_one_symbol): If block addresses are relative to - function start addresses, reset function_start_address whenever a new - source file is seen. - -Mon May 18 13:04:27 1998 Michael Snyder <msnyder@cleaver.cygnus.com> - - * tracepoint.c (get_tracepoint_by_number): make sure to advance - arg pointer even if we fail to parse a useful number. Otherwise, - since this function is called in a loop, it may loop forever! - Also change strtol call to allow arbitrary radix. - (map_args_over_tracepoints (and other places)): add QUIT; call - to loop, to allow breakout using control-C. Not all loops were - analyzed to make sure they could terminate cleanly, but even - terminating with a messed-up tracepoint list would be better - than not terminating at all! - (tdump_command): check to see if we're connected to a trace- - capable target (currently only "remote") before doing anything - else. - -Sat May 16 22:21:48 1998 Frank Ch. Eigler <fche@cygnus.com> - - * config/d30v/tm-d30v.h (INIT_FRAME_PC_FIRST): Fill in PC into - frame struct before extracting saved register offsets. - -Fri May 15 22:47:45 1998 Michael Snyder <msnyder@cleaver.cygnus.com> - - * tracepoint.c (encode_actions): fix typo in printf format string. - -1998-05-15 Jim Blandy <jimb@zwingli.cygnus.com> - - Implement a few more tracing operators: ^ | & ~ ! - * ax-gdb.c (gen_integral_promotions, gen_logical_not, - gen_complement): New functions. - (gen_binop): New argument MAY_CARRY, indicating whether we need to - correct the upper bits of the value after performing the - operation. Callers changed. - (gen_expr): Handle BINOP_BITWISE_AND, BINOP_BITWISE_IOR, and - BINOP_BITWISE_XOR here as well, by calling gen_binop. Handle - UNOP_LOGICAL_NOT, UNOP_COMPLEMENT. - - * ax-gdb.c (gen_conversion): Reworked to avoid some unnecessary - sign extension. - - * ax-gdb.c (gen_usual_arithmetic): Renamed from gen_usual_binary, - to match the ANSI C standard better. Callers changed. - - * ax-gdb.c (gen_traced_pop): Add prototyped declaration. - -Fri May 15 18:18:38 1998 David Taylor <taylor@texas.cygnus.com> - - * tracepoint.c (stringify_collections_list): return a collection - of strings rather than a single string. - (free_actions_list): new function. - (encode_actions): process collection of strings returned by - stringify_collections_list. - -1998-05-15 Jim Blandy <jimb@zwingli.cygnus.com> - - * ax-gdb.c (gen_traced_pop): New function. - (gen_expr): Call it for comma operator. - (gen_trace_for_expr): Call it, instead of writing it out. - - Add facilities for sending arbitrary packets to the remote agent. - There are a bunch of improvements to make (make it generic; handle - 'O' replies properly), but I just want to get this onto the branch. - * remote.c (print_packet, remote_packet_command): New functions. - (_initialize_remote): Register the remote-packet command. - -Thu May 14 17:52:31 1998 Elena Zannoni <ezannoni@kwikemart.cygnus.com> - - * tracepoint.c: move actionline_type definition to tracepoint.h. - (validate_actionline): make non static. - - * tracepoint.h: move actioline_type definition from tracepoint.c. - (validate_actionline) moved prototype from tracepoint.c. - -Thu May 14 11:49:18 1998 David Taylor <taylor@texas.cygnus.com> - - * tracepoint.c (validate_actionline): add additional error - checking, remove some dead code. - (encode_actions): additional cleanups. - (trace_find_command): remove some dead code. - (trace_find_pc_command): ditto. - (trace_find_tracepoint_command): ditto. - (trace_find_line_command): ditto. - (trace_find_range_command): ditto. - (trace_find_outside_command): ditto. - -Thu May 14 5:51:00 1998 Ron Unrau <runrau@cygnus.com> - - * symtab.c (decode_line_1): set section for "break *<addr>" - -Wed May 13 20:58:02 1998 Mark Alexander <marka@cygnus.com> - - * corefile.c (reopen_exec_file): Reopen the exec file if - it has changed. - -Wed May 13 15:22:02 1998 Mark Alexander <marka@cygnus.com> - - * sparc-tdep.c (fetch_instruction): New function. - (single_step, sparc_init_extra_frame_info, examine_prologue): - Use fetch_instruction instead of read_memory_integer - to ensure that instructions are always read as big-endian. - -Wed May 13 14:42:21 1998 Ian Lance Taylor <ian@cygnus.com> - - * configure.in: Add AC_FUNC_ALLOCA. - * defs.h: Check HAVE_ALLOCA_H rather than sparc. Add _AIX pragma - alloca. - * configure: Rebuild. - * Makefile.in (jv-lang.o, jv-typeprint.o, jv-valprint.o): New - targets. - -Wed May 13 11:19:08 1998 Michael Snyder <msnyder@cleaver.cygnus.com> - - * tracepoint.c (trace_command): Remove old diagnostic code that was - preventing tracepoints from being defined with a full-path filename. - -Tue May 12 13:17:35 1998 Frank Ch. Eigler <fche@cygnus.com> - - * stabsread.c (read_one_struct_field): Check for typedef in type - tree before clearing bitfield information. - -1998-05-11 Jim Blandy <jimb@zwingli.cygnus.com> - - * ax-gdb.c (gen_binop): New function, based on gen_mul, to replace - gen_mul and gen_div, and handle `%' op as well. Correctly tests - type of arguments. - (gen_expr): Factor out common code in binary arithmetic operators. - Add support for `%'. - (gen_mul, gen_div): Removed. - -Thu May 7 14:49:38 1998 Bob Manson <manson@charmed.cygnus.com> - - * config/sparc/tm-sp64.h (CALL_DUMMY): Store and retrieve - %o0-%o5 as 64-bit values; compensate for stack bias. - (USE_STRUCT_CONVENTION): We only pass pointers to structs - if they're larger than 32 bytes. - (REG_STRUCT_HAS_ADDR): Ditto. - - * sparc-tdep.c (sparc_init_extra_frame_info): Use read_sp() - instead of read_register. If the target is a sparc64 and the frame - pointer is odd, compensate for the stack bias. - (get_saved_register): Use read_sp(). - (DUMMY_STACK_REG_BUF_SIZE): Use FP_REGISTER_BYTES. - (sparc_push_dummy_frame): Use read_sp()/write_sp(). On sparc64, - save the PC, NPC, CCR, FSR, FPRS, Y and ASI registers. - (sparc_frame_find_saved_regs): Use read_sp(). Read the PC, NPC, - CCR, FSR, FPRS, Y and ASI registers from the frame, if it's a - dummy frame. - (sparc_pop_frame): Use write_sp(). If the target is a sparc64 and - the FP is odd, compensate for stack bias. - (sparc_store_return_value): Right-justify the return value before - writing it to %o0. - (sparc_fix_call_dummy): Don't NOP out part of the call dummy on - sparc64. - (sparc64_read_sp, sparc64_read_fp, sparc64_write_sp, - sparc64_write_fp, sp64_push_arguments, - sparc64_extract_return_value): New functions to support the - sparc64 ABI. - - * dwarfread.c (handle_producer): Set processing_gcc_compilation to - the right version number. - - * dwarf2read.c (read_file_scope): Assume we're processing - GCC2 output. - -Wed May 6 16:34:03 1998 Jeffrey A Law (law@cygnus.com) - - * somsolib.c: Include gdb_stat.h. - -Mon May 4 18:34:01 1998 David Taylor <taylor@texas.cygnus.com> - - * ax-gdb.c (gen_mul): new function; (gen_div): new function; - (gen_expr): add support for * and / operators, call gen_mul and - gen_div as appropriate. - -Mon May 4 16:24:22 1998 Mark Alexander <marka@cygnus.com> - - * defs.h (make_run_cleanup): Declare. - * solib.c (find_solib): Pass correct number of arguments to - make_run_cleanup. - -Mon May 4 07:08:25 1998 Michael Snyder <msnyder@cleaver.cygnus.com> - - * tracepoint.c (trace_actions_command): actions command must set - step_count to zero (in case previous actions have set it but the - new set does not). - -Sat May 2 09:35:07 1998 Stu Grossman <grossman@babylon-5.cygnus.com> - - * ocd.h: Add new flags, function codes, and processor types to - support new Wiggler capabilities. - * (ocd_write_bytes_size): New function to allow atomic writes of - memory in sizes larger than a byte. - - * ser-unix.c (baudtab): Add 57600, 115200, 230400, and 460800 baud. - -Fri May 1 19:51:32 1998 Frank Ch. Eigler <fche@cygnus.com> - - * stabsread.c (read_one_struct_field): Do not override supplied - bitfield size for a range type value. - - * gdbtypes.c (create_range_type): For a range with positive - lower limit, declare range type as unsigned. - -Fri May 1 10:58:34 1998 John Metzler <jmetzler@cygnus.com> - - * monitor.c: Turn off debug - -Fri May 1 09:29:56 1998 Peter Schauer <pes@regent.e-technik.tu-muenchen.de> - - * breakpoint.c (delete_command): Skip internal breakpoints when - all breakpoints are requested. - - * stabsread.c (define_symbol): Record parameter types from Sunpro - function stabs in the TYPE_FIELDS of the function type. - -Thu Apr 30 15:59:54 1998 Jason Molenda (crash@bugshack.cygnus.com) - - * Makefile.in (config-check-targets, config-check-hosts): Removed. - -1998-04-30 Paul Eggert <eggert@twinsun.com> - - * Makefile.in (maintainer-clean): - Don't get ahead of yourself and delete Makefile - before running `make'. - (local-maintainer-clean, do-maintainer-clean): New rules. - -Wed Apr 29 14:02:59 1998 David Taylor <taylor@texas.cygnus.com> - - * ax-gdb.c (gen_add): when adding a pointer and an int, use - the size of the pointer, not the int (typo) to decide how - to extend the result. - -Wed Apr 29 10:20:40 1998 John Metzler <jmetzler@cygnus.com> - - * monitor.h: Defined additional hooks for dmpregs, configure_hooks - and wait_filter. These additions require that all ROM monitor - interfaces be recoded to initialize monitor ops using assignments - rather than static structure initialization. Added new bits to - flags MO_EXACT_DUMPADDR, MO_HAS_BLOCKWRITES. - - * monitor.c (RDEBUG): Conditional tracing throughout the file. - (fromhex): Now recognized upper cse hex digits - (monitor_printf_noecho): - (monitor_readchar): Tracing interferes with input timing. - (monitor_open): Register different memory write functions with - dcache_init if MO_HAS_BLOCKWRITES. - (flush_monior_dcache): Added as an additional utilty. - (monitor-resume): Call continue hook if one has been supplied. - (monitor_wait_filter): New function Factored out of monitor wait - and used if alternate wait-filter has not been provided. - (monitor_wait): call alternate wait filter if provided. Call - monitor_dump_regs, a new function factored out from inline code. - (monitor_dump_block): A new function used as a utility when - monitors must dump several blocks of registers using different - commands. - (monitor_dump_regs): Call alternate function if provided. Uses new - hook in monitor.h. - (monitor_write_memory): Engage previouly added hook - MO_FILL_USES_ADDR. - (monitor_write_even_block): new function supports writing long - blocks of 4byte words. - (longlongendswap): new internal function - (monitor_write_memory_longlongs): new function writes large blocks - using command to enter a long long. - (monitor_write-memory_block): new Function figures out which block - mod to use. - (monitor_read_memory): Can now handle dump formats in which the bytes - preceeding the requested data is not printed. - -Tue Apr 28 19:41:33 1998 Tom Tromey <tromey@cygnus.com> - - * tracepoint.c (memrange_cmp): Another typo fix; `memrbnge' -> - `memrange'. - - * tracepoint.c (memrange_cmp): Fixed typo in function intro. - -Tue Apr 28 17:41:20 1998 Philippe De Muyter <phdm@macqel.be> - - * symfile.c (overlay_auto_command): Add forgotten parameter - definitions. - (overlay_manual_command, overlay_off_command): Likewise. - (overlay_load_command): Likewise. - * tracepoint.c (memrange_cmp): Parameters have type void *, not - struct memrange *. - -Tue Apr 28 11:08:25 1998 John Metzler <jmetzler@cygnus.com> - - * rom68k-rom.c (_initialize_rom68k): Fix unresolved init_rom_68kcmds. - -Mon Apr 27 14:32:21 1998 Mark Alexander <marka@cygnus.com> - - * config/sparc/tm-sparc.h (CALL_DUMMY): Shorten it drastically, - make it work on the simulator. - (FIX_CALL_DUMMY): Convert to function call instead of inline code. - (sparc_fix_call_dummy): Declare. - * sparc-tdep.c (sparc_fix_call_dummy): New function, taken from - old FIX_CALL_DUMMY macro, with additional fixes for simulator. - (sparc_push_dummy_frame): Set registers differently on simulator - to prevent corrupted register window save areas. - -Mon Apr 27 13:46:40 1998 John Metzler <jmetzler@cygnus.com> - - * rom68k-rom.c (_initialize_rom68k, init_rom68k_cmds): - Convert all static initializations of monitor ops structures to - executable initializations in order that additions to the data - structure definition can me made without repeating this editing - exercise. - * abug-rom.c (_initialize_abug_rom, init_abug-cmds): Ditto. - * cpu32bug-rom.c (_initialize_cpu32bug_rom, init_cpu32bug_cmds): Ditto. - * mon960-rom.c (initialize_mon960, init_mon960_cmds): Ditto. - * op50-rom.c (initialize_op50n, init_op50n_cmds): Ditto. - * ppcbug-rom.c (_initialize_ppcbug_rom, init_ppc_cmds): Ditto. - * sh3-rom.c (_initialize_sh3_rom, init_sh3_cmds): Ditto. - * sparclet-rom.c (_initialize_sparclet, init_sparclet_cmds): Ditto. - * remote-est.c (_initialize_est, init_est_cmds): Ditto. - * remote-hms.c ( _initialize_remote_hms, init_hms_cmds): Ditto. - -Mon Apr 27 10:43:04 1998 Jason Molenda (crash@bugshack.cygnus.com) - - * gdb_string.h (strdup): Don't specify arguments in prototype. - -Sun Apr 26 07:57:21 1998 Peter Schauer <pes@regent.e-technik.tu-muenchen.de> - - * rs6000-nat.c (vmap_ldinfo): Issue warning instead of error if - fstat on ldinfo_fd fails. Use objfile->obfd instead of vp->bfd - to check for reference to the same file. - - * target.c (target_read_string): Handle string transfers at the - end of a memory section gracefully. - -Fri Apr 24 17:18:56 1998 Geoffrey Noer <noer@cygnus.com> - - * Makefile.in: enable EXEEXT setting - -Fri Apr 24 11:53:49 1998 David Taylor <taylor@texas.cygnus.com> - - * tracepoint.c (add_local_symbols): change type of type from - char to int so that type shows up as 'A' or 'L' not 0. - -Thu Apr 23 16:37:20 1998 Jason Molenda (crash@bugshack.cygnus.com) - - * README: Minor changes for 4.17 release. - -Thu Apr 23 15:44:39 1998 Per Bothner <bothner@cygnus.com> - - * symfile.c (deduce_language_from_filename): .class implies java. - -Thu Apr 23 12:52:21 1998 Philippe De Muyter <phdm@macqel.be> - - * configure.in (strerror): Check if function must be declared. - * acconfig.h (NEED_DECLARATION_STRERROR): New define slot. - * gdb_string.h (strerror): Function declaration issued if - NEED_DECLARATION_STRERROR. - * configure, config.in: Files regenerated. - -Thu Apr 23 12:27:43 1998 Philippe De Muyter <phdm@macqel.be> - - * symfile.c (simple_overlay_update_1): Do not prefix array address - by `&'. - * bcache.h (BCACHE_DATA_ALIGNMENT): Ditto. - * tracepoint.c (encode_actions): Ditto. - * language.c, complaints.c, utils.c (varargs.h): Do not include that - file here, it is already included indirectly by defs.h. - * dbxread.c (dbx_symfile_init, process_one_symbol): Cast xmalloc return - value to the appropriate pointer type. - * utils.c (floatformat_from_doublest): Ditto. - * tracepoint.c (read_actions, _initialize_tracepoint): Ditto. - (add_memrange): Likewise with xrealloc return value. - * stabsread.c (ref_add): Ditto. - * coffread.c (coff_symfile_init): Likewise for xmmalloc return value. - * elfread.c (elf_symfile_read): Ditto. - * os9kread.c (os9k_symfile_init): Ditto. - -Thu Apr 23 00:32:08 1998 Tom Tromey <tromey@cygnus.com> - - * config.in: Rebuilt. - * acconfig.h (ENABLE_NLS, HAVE_CATGETS, HAVE_STPCPY, HAVE_GETTEXT, - HAVE_LC_MESSAGES): Define. - -Wed Apr 22 15:38:56 1998 Tom Tromey <tromey@cygnus.com> - - * configure: Rebuilt. - * configure.in: Call CY_GNU_GETTEXT. - * Makefile.in (top_builddir): New macro. - (INTL): Define to @INTLLIBS@. - (INTL_DEPS): New macro. - (CDEPS): Reference INTL_DEPS, not INTL. - -Wed Apr 22 12:58:23 1998 Peter Schauer (pes@regent.e-technik.tu-muenchen.de) - - Handle missing shared libraries during the examination of a core - dump gracefully. - * solib.c (find_solib): Use catch_errors around call to - solib_map_sections. Use warning instead of error if reading of - the shared library name fails. - (solib_map_sections): Change return and argument types to make - it callable from catch_errors. - (symbol_add_stub): Avoid GDB core dump if solib->abfd is NULL. - * irix5-nat.c, osfsolib.c (xfer_link_map_member, solib_map_sections, - symbol_add_stub): Ditto. - -Wed Apr 22 14:34:49 1998 Michael Meissner <meissner@cygnus.com> - - * Makefile.in (INTL*): Add support to link in the intl library, - and to add -I options to its source and object directories. - (INTERNAL_CFLAGS): Ditto. - (C{LIBS,DEPS}): Ditto. - -Tue Apr 21 11:20:54 1998 Frank Ch. Eigler <fche@cygnus.com> - - * mips-tdep.c (gdb_print_insn_mips): Disassemble MIPS instructions - with subtarget-specific `mach', rather than fixed default. - * config/mips/tm-mips.h (TM_PRINT_INSN_MACH): New macro, default - disassembly `mach'. - -Mon Apr 20 15:35:03 1998 Philippe De Muyter <phdm@macqel.be> - - * coffread.c (decode_base_type): Treat a long field with size greater - than TARGET_LONG_BIT as long long. - * values.c (value_from_longest): Print code value in error message. - -Mon Apr 20 15:32:21 1998 Mark Kettenis <kettenis@phys.uva.nl> - - * gdb/gdb_string.h (strdup): Declare only if not defined as a - macro. - -Mon Apr 20 14:18:45 1998 J. Kean Johnston <jkj@sco.com> - - * procfs.c: Added replacement macros for LWP stuff. Fixed support - for UnixWare / SVR4.2MP targets and any targets which use - multi-file /proc entries. Fixed support for hardware watchpoints. - * solib.c: SCO needs some of the same code as SunOS. Change - preprocessor conditionals. - - * config/i386/i386sco5.mt: New file. - * config/i386/tm-i386sco5.h: New file. - * config/i386/i386sco5.mh (NATDEPFILES): add i386v-nat.o. - * config/i386/nm-i386v42mp.h - (TARGET_HAS_HARDWARE_WATCHPOINTS): define. - Add other macros for hardware assisted watchpoints. - * config/i386/nm-i386sco5.h: Correct attributions. - (TARGET_HAS_HARDWARE_WATCHPOINTS): define. - * config/i386/nm-linux.h (target_remote_watchpoint): Pass - 'type' through to i386_insert_watchpoint. - -Mon Apr 20 14:12:30 1998 Peter Schauer (pes@regent.e-technik.tu-muenchen.de) - - * infrun.c (wait_for_inferior): Don't add signalled processes - as new threads. - * procfs.c (wait_fd): Note if LWP has exited. - (procfs_wait): use GETPID to get process ID. - -Sat Apr 18 15:21:04 1998 Stan Cox <scox@cygnus.com> - - * configure.tgt: Added sparc86x support. - -Thu Apr 16 13:13:24 1998 Jason Molenda (crash@bugshack.cygnus.com) - - * rdi-share/etherdrv.c (EthernetWrite): Use strerror to get - error string if in an ANSI C-ish environment. - -Wed Apr 15 18:59:48 1998 Mark Alexander <marka@cygnus.com> - - * sparc-tdep.c (SPARC_HAS_FPU): Define. - (sparc_extract_return_value): New function, required to handle - machines without floating point. - (sparc_store_return_value): Ditto. - * config/sparc/tm-sparc.h (EXTRACT_RETURN_VALUE): Call - sparc_extract_return_value instead of using inline code. - (sparc_extract_return_value): Declare. - (STORE_RETURN_VALUE): Call sparc_store_return_value instead - of using inline code. - (sparc_store_return_value): Declare. - -Wed Apr 15 12:19:42 1998 Martin M. Hunt <hunt@cygnus.com> - - * solib.c (enable_break): Only call warning once - instead of three times. - -Tue Apr 14 16:52:59 1998 Mark Alexander <marka@cygnus.com> - - * sparc-tdep.c (sparc_extract_struct_value_address): Make it - work correctly on little-endian hosts. - (sparc_push_arguments): New function. - (gdb_print_insn_sparc): New function. - (_initialize_sparc_tdep): Make gdb_print_insn_sparc the default - disassembler, so that SPARClite-specific instructions will - be recognized. - * sparcl-tdep.c (readchar): Print debugging information. - (debug_serial_write): New function, a replacement for SERIAL_WRITE - that prints debugging information. - * config/sparc/tm-sparc.h (PUSH_ARGUMENTS): Define. - (sparc_push_arguments): Declare. - -Tue Apr 14 15:43:49 1998 John Metzler <jmetzler@cygnus.com> - - * gdbcfgxref (xref_menu): Call new regex and wild card searches - Now you can type in a specific triple like mips64-vr4300-elf or - somthing like mips*.h - (triple_search, wildcardsearch): The new functions - -Mon Apr 13 16:28:07 1998 Elena Zannoni <ezannoni@kwikemart.cygnus.com> - - * utils.c (warning): added call to warning_hook - - * source.c (find_source_lines): modified to call warning in case - of source vs. executable time stamp mismatch. Simplified object - file check. Initialized mtime to 0. - - * defs.h: added warning_hook prototype - - * top.c: added warning_hook prototype. - -Mon Apr 13 09:54:08 1998 Keith Seitz <keiths@andros.cygnus.com> - - * config/sparc/tm-sun4os4.h (IS_STATIC_TRANSFORM_NAME): Add missing - definition. - -Fri Apr 10 22:36:28 1998 Peter Schauer (pes@regent.e-technik.tu-muenchen.de) - - Update support for x86 Solaris 2. - * config/i386/tm-i386sol2.h, nm-i386sol2.h: New configuration - files for x86 Solaris 2. - * config/i386/i386sol2.mt, i386sol2.mh: Use them. - * config/sparc/tm-sun4sol2.h (PROCFS_GET_CARRY): New macro, extract - carry flag from a given regset. - (IS_STATIC_TRANSFORM_NAME): New macro, check if a symbol name - is a SunPro transformed name. - * i386-tdep.c (sunpro_static_transform_name): New function to - extract the source name from a SunPro transformed name. - * inferior.h (procfs_first_available, procfs_get_pid_fd): - Add prototypes. - * infrun.c (wait_for_inferior): Handle breakpoint hit in - signal handler without intervening stop in sigtramp. - * procfs.c (procfs_lwp_creation_handler): Use PROCFS_GET_CARRY - instead of direct access to the status register. - (procfs_get_pid_fd): New function, returns procfs fd for a given pid. - * sol-thread.c (ps_lgetLDT): New function, returns LDT for a given - lwpid. - (sol_find_new_threads): Handle failed libthread_db initialization - gracefully. - * stabsread.c (define_symbol): Use IS_STATIC_TRANSFORM_NAME - to check for a SunPro transformed symbol name. - -Fri Apr 10 10:35:35 1998 John Metzler <jmetzler@cygnus.com> - - * utils.c (fmthex): A formatting function for hexdumps - - * mips-tdep.c (unpack_mips16): Fixed instruction decoding, lots of - bit pattern interpretations. mips_fetch_instruction does not work - for 16 bit instructions. Some confusion remains about sign - extension in backward branches. - (mips32_relative_offset): Sign extension - (mips32_next_pc): Major debugging, bit pattern interpretation - (print_unpack): debugging printf - (fetch_mips_16): new funtion, key on PC low bit, not symbol table - (mips16_next_16): Initial major debugging of this function. Lots - of bit pattern mistakes. - (mips_next_pc): key on low bit of PC, not symbol table. - * symfile.c (generic_load): Added a download verification which - reads back the loaded code. Download chunk size is now a defined - macro. Fixed a bug in which downloading slips into loading one - byte at a time. Lower level functions in monitor.c can load long - sequences of bytes and make use of these fixups. Referencing - bfd-start_address directly was incorrectly getting zero for start. - -Thu Apr 9 19:20:32 1998 Ian Lance Taylor <ian@cygnus.com> - - * mips-tdep.c (do_fp_register_row): Use alloca rather than arrays - with dynamic size. - -Wed Apr 8 19:21:42 1998 Jason Molenda (crash@bugshack.cygnus.com) - - * top.c (print_gdb_version): Print 1998 now. - -Wed Apr 8 16:57:22 1998 Philippe De Muyter <phdm@macqel.be> - - * source.c: Remove obsolete decl of strstr(). - -Wed Apr 8 16:47:33 1998 Jason Molenda (crash@bugshack.cygnus.com) - - * solib.c (solib_create_inferior_hook): Remove Ulrich Drepper's - patch of March 23 1998. - * breakpoint.c (breakpoint_re_set_one): Remove Ulrich Drepper's - patch of March 23 1998. - -Sat Apr 4 10:05:00 1998 Dawn Perchik <dawn@cygnus.com> - - * mdebugread.c (parse_partial_symbols): If this is an .mdebug - section in an ELF file, override a symbol's ECOFF section with its - ELF section. Also, fix stabs continuation where a stabs string - continues for more than one continuation. - -Mon Apr 6 09:17:48 1998 Andrew Cagney <cagney@b1.cygnus.com> - - * mips-tdep.c (mips_push_arguments): Specify dimention of valbuf - using MAX_REGISTER_RAW_SIZE. - -Sat Apr 4 10:05:00 1998 Dawn Perchik <dawn@cygnus.com> - - * infrun.c: Fix prototype of signals_info to match static funtion. - -Thu Apr 2 12:47:41 1998 Frank Ch. Eigler <fche@cygnus.com> - - * sol-thread.c (sol_thread_store_registers): Save & restore new - value of single updated register to prevent accidental clobbering. - -Wed Apr 1 22:01:09 1998 Mark Alexander <marka@cygnus.com> - - * config/sparc/tm-sparclite.h (TARGET_BYTE_ORDER_SELECTABLE): Define. - * config/sparc/sparclite.mt: Link in the erc32 simulator. - -Wed Apr 1 16:30:49 1998 Ian Dall <Ian.Dall@dsto.defence.gov.au> - - * ns32k-tdep.c (flip_bytes, ns32k_localcount, - ns32k_get_enter_addr, sign_extend): Restore functions mysteriously - deleted. - - * ns32knbsd-nat.c: New (?) file to support fetching and storing - registers on NetBSD hosts. - - * nbsd.mh (NATDEPFILES): put ns32knbsd-nat.o instead of - ns32k-nat.o - - * ns32km3-nat.c (reg_offset): Get order of floating point - registers correct. Add extra 32382 register offsets. - (REG_ADDRESS): define to point at correct part of thread - state. Use calls to "warning" instead of "message". - - * tm-nbsd.h, tm-ns32km3.h (REGISTER_NAMES, NUM_REGS, - REGISTER_BYTES, REGISTER_BYTE): redefine allowing for 32382 - fpu registers. - -Wed Apr 1 13:43:07 1998 Philippe De Muyter <phdm@macqel.be> - - * NEWS: m68k-motorola-sysv host support added. - * coffread.c (coff_start_symtab): Accept the filename as an argument, - set it here. Callers updated. - -Wed Apr 1 23:13:23 1998 Andrew Cagney <cagney@b1.cygnus.com> - - * config/mips/tm-mips.h (REGISTER_VIRTUAL_TYPE): Handle 32 bit SR, - FSR and FIR registers. - (REGISTER_VIRTUAL_SIZE): Compute using REGISTER_VIRTUAL_TYPE. - (REGISTER_RAW_SIZE): Define using REGISTER_VIRTUAL_SIZE. - - * config/mips/tm-mips64.h: Ditto. - -Tue Mar 31 21:30:39 1998 Nick Clifton <nickc@cygnus.com> - - * arm-tdep.c (gdb_print_insn_arm): Attach a fake Thumb symbol - vector to the info structure when disassembling thumb - instructions. - - * coffread.c (coff_symtab_read, read_one_sym, - process_coff_symbol): Support Thumb symbol types. - - * dbxread.c (process_one_symbol): Call SMASH_TEXT_ADDRESS (if it - is defined) for function symbols. - -Tue Mar 31 16:39:28 1998 Michael Snyder <msnyder@cleaver.cygnus.com> - - * tracepoint.c (get_tracepoint_by_number): change warning to note. - (delete_trace_command): suppress y/n query if no tracepoints, or - if not from_tty. (trace_pass_command): reject junk at end of args. - (read_actions): an action list consisting only of "end" is discarded. - (validate_actionline (for collect command)): an argument beginning - with a dollar_sign but not recognized as a special argument is - parsed like any other expression -- if it isn't a register name, - it's rejected. Also reject an empty argument to while-stepping. - (trace_find_command): reject a negative frame number argument. - (_initialize_tracepoint): set $traceframe initially to -1. - -Mon Mar 30 16:42:12 1998 Jason Molenda (crash@bugshack.cygnus.com) - - * rdi-share/Makefile.am, rdi-share/aclocal.m4, - rdi-share/configure: New files. - * rdi-share/configure.in: Rewritten to be an autoconf input file. - * rdi-share/Makefile.in, rdi-share/configure: Generated by - automake/autoconf. - * rdi-share/dbg_hif.h, etherdrv.c, hostchan.c: Use autoconf tests - to check environment. - -Sun Mar 29 15:17:16 1998 Keith Seitz <keiths@onions.cygnus.com> - - * tracepoint.c (trace_start_command): Set trace_running_p. - (trace_stop_command): Clear trace_running_p. - -Sat Mar 28 15:19:48 1998 Stan Shebs <shebs@andros.cygnus.com> - - * NEWS: Update for 4.17 release. - -Fri Mar 27 10:15:50 1998 David Taylor <taylor@tito.cygnus.com> - - * tracepoint.c (parse_and_eval_memrange): Fix memory leaks. - (encode_actions): Use the new gen_trace_for_expr function - instead of expr_to_address_and_size; collect registers when - using expressions. (clear_collection_list): Fix memory leak. - -1998-03-26 Jim Blandy <jimb@zwingli.cygnus.com> - - * ax-gdb.h (gen_trace_for_expr): Add prototype. - -Thu Mar 26 17:24:23 1998 David Taylor <taylor@texas.cygnus.com> - - * tracepoint.c (validate_actionline): Fix memory leak. - (encode_actions): Fix memory leak. - -Thu Mar 26 16:16:55 1998 David Taylor <taylor@tito.cygnus.com> - - * tracepoint.c (trace_mention): New function. - (trace_command): Call it. - -1998-03-26 Jim Blandy <jimb@zwingli.cygnus.com> - - * ax-general.c (ax_reqs): New function. - * ax.h (enum agent_flaws, struct agent_reqs): New types. - (agent_reqs): New extern prototype. Well, actually, this was - there before, due to a premature checkin. - (struct aop_map): Add new `data_size' member. - * ax-general.c (aop_map): Supply its value. - * ax-gdb.c (agent_command): Call ax_reqs, for testing. - - * ax-general.c (ax_print): If we encounter an invalid or - incomplete opcode, don't abort; just print an error message. - - * ax-gdb.c: Generate trace bytecodes, as appropriate. - (trace_kludge): New variable. - (gen_fetch, gen_bitfield_ref): Emit trace bytecodes, if asked - nicely. - (expr_to_agent): Ask for no trace bytecodes. - (gen_trace_for_expr): New function. - (agent_command): Call it, and display the result appropriately --- - no struct axs_value, so no type or kind information. - - * ax-gdb.c: Use TARGET_CHAR_BIT throughout, not HOST_CHAR_BIT. - -Thu Mar 26 22:29:28 1998 Elena Zannoni <ezannoni@kwikemart.cygnus.com> - - * tracepoint.c (trace_status_command): Recognize a boolean return - value from the stub to indicate whether trace experiment is - running. Export this value as a global state variable. - (trace_running_p) for use by the GUI. (from Michael Snyder) - (trace_pass_command) added call to modify_tracepoint_hook. - - * tracepoint.h export trace_running_p. - -Thu Mar 26 13:08:01 1998 David Taylor <taylor@texas.cygnus.com> - - * tracepoint.c (validate_actionline): do not error out if - exp->elts[0].opcode is not on short line -- let - expr_to_address_and_size handle it. - -1998-03-26 Jim Blandy <jimb@zwingli.cygnus.com> - - * tracepoint.c: Include "ax.h", not "agentexpr.h". - - * tracepoint.c (encode_actions): Call expr_to_address_and_size, - not simply expr_to_agent. - - * ax-general.c: Comment out code in progress, so everyone else can - at least compile. - - * gdbtypes.c: Doc fix. - - * ax.h, ax-gdb.h, ax-general.c, ax-gdb.c: New files. - * Makefile.in (REMOTE_OBJS): Add ax-general.o and ax-gdb.o. - (SFILES): Add ax-general.c, ax-gdb.c. - (ax_h): New variable. - (ax-general.o, ax-gdb.o): New rules. - - -Tue Mar 24 16:22:40 1998 Stu Grossman <grossman@bhuna.cygnus.co.uk> - - * Makefile.in: Derive SHELL from configure. - * config/d10v/d10v.mt config/m32r/m32r.mt - config/mn10200/mn10200.mt config/mn10300/mn10300.mt - config/d30v/d30v.mt: Remove -lm from SIM. This prevents - dependency checking of -lm (under NT native builds). (It is - automatically added by configure if it exists.) - * doc/configure mswin/configure nlm/configure - testsuite/gdb.base/configure testsuite/gdb.c++/configure - testsuite/gdb.chill/configure testsuite/gdb.disasm/configure - testsuite/gdb.stabs/configure testsuite/gdb.threads/configure: - Regenerate with autoconf 2.12.1 to fix shell issues for NT native - builds. - -Mon Mar 23 18:10:57 1998 Ulrich Drepper (drepper@cygnus.com) - - * solib.c (solib_create_inferior_hook): Rewrite previous - change to check the type of file via BFD. - -Mon Mar 23 13:52:28 1998 Ulrich Drepper (drepper@cygnus.com) - - * breakpoint.c (breakpoint_re_set_one): Treat bp_shlib_events - like bp_breakpoints. - * solib.c (solib_create_inferior_hook): Relocate section addresses - if the alleged start address doesn't agree with the PC. - -Sat Mar 21 19:34:49 1998 Elena Zannoni <ezannoni@kwikemart.cygnus.com> - - merged changes from Foundry (list follows by file/author): - - - Tom Tromey <tromey@cygnus.com> - * Makefile.in (gdbres.o): New target. - (WINDRES): New define. - * configure: Rebuilt. - * configure.in (WINDRES): Define. - (CONFIG_OBS): Include gdbres.o on Windows. - * gdbtool.ico: New file. - * gdb.rc: New file. - - * ser-unix.c - - Keith Seitz <keiths@onions.cygnus.com> - (wait_for): Don't reset the timeout_remaining for CYGWIN32, - since we now effectively poll the serial port. - Don't reset the current_timeout, either, since this member is used - by hardwire_readchar to track the timeout and call the ui_loop_hook. - (hardwire_readchar): Poll the serial port for Cygwin32. We timeout - every second, update the UI, and loop around doing this until we - have hit the real timeout or we get data or an error. This will - allow the UI to stay active while gdb is "blocked" talking to the - target. - - Martin M. Hunt <hunt@cygnus.com> - (wait_for): Do reset current_timeout because it is only used to - keep track of what the current timeout for the scb is. - - * top.c - - Martin M. Hunt <hunt@cygnus.com> - (quit_confirm): Change exit message again - for GUI. - (pc_changed_hook): Add prototype. - - Tom Tromey <tromey@cygnus.com> - (quit_confirm): Added missing `else'. - (quit_confirm): Special-case message if init_ui_hook is - set. - - * symtab.c - - Martin M. Hunt <hunt@cygnus.com> - (find_pc_sect_line): If no symbol information - is found, return correct pc anyway. - (find_methods): Comment out an apparently - bogus error message because it messes up Foundry. - - * serial.c - - Martin M. Hunt <hunt@cygnus.com> - (_initialize_serial): Add a description of - "set remotelogbase". - - * findvar.c - - Martin M. Hunt <hunt@cygnus.com> - (write_register_gen): Add call to - pc_changed_hook if the PC is being changed. - - * defs.h - - Martin M. Hunt <hunt@cygnus.com> - (pc_changed_hook): Define. - - * command.c - - Martin M. Hunt <hunt@cygnus.com> - (do_setshow_command): If no arguments are supplied, - don't dump core, instead print out an error message. - - * breakpoint.c - - Martin M. Hunt <hunt@cygnus.com> - Make set_raw_breakpoint, set_breakpoint_count, - and breakpoint_count non-static so they are accessible from - elsewhere. - (enable_breakpoint): Enable breakpoint - with same disposition instead of changing all breakpoints - to donttouch. - - * annotate.h - - Keith Seitz <keiths@onions.cygnus.com> - Add declarations for annotation hooks. - - * annotate.c - - Keith Seitz <keiths@onions.cygnus.com> - Add hooks: annotate_starting_hook, annotate_stopped_hook, - annotate_signalled_hook, annotate_exited_hook. - (annotate_starting): If hook exists, call it instead. - (annotate_stopped): If hook exists, call it instead. - (annotate_exited): If hook exists, call it instead. - (annotate_signalled): If hook exists, call it instead. - -Fri Mar 20 14:45:36 1998 Michael Snyder <msnyder@cleaver.cygnus.com> - - * gdbserver/Makefile.in: add dependency on XM_CLIBS. - * gdbserver/low-sim.c (registers) force into alignment. - (create_inferior): Fix typo on new_argv; add abfd arg to - sim_open, sim_create_inferior. Add reg_size arg to - sim_fetch_register, sim_store_register. Make simulator - take a single-step to get into a known running state. - * gdbserver/gdbreplay.c: include fcntl.h for def'n of F_SETFL. - * gdbserver/server.c: Add remote_debug variable to control - debug output. - * gdbserver/server.h: Add prototypes for enable/disable_async_io. - * gdbserver/remote-utils.c: add verbose debugging output controlled - by "remote_debug" variable. Add call to "disable_async_io()" - to avoid being killed by async SIGIO signals. - * config/m32r/m32r.mt: define GDBSERVER_(LIBS and DEPFILES), - so that gdbserver can be built with the m32r simulator. - -Fri Mar 20 09:04:06 1998 Andrew Cagney <cagney@b1.cygnus.com> - - * gdbtypes.h (builtin_type_{,u}int{8,16,32,64}): New gdb builtin - types. - - * gdbtypes.c (_initialize_gdbtypes): Initialize new types. - - * mips-tdep.c (do_gp_register_row): Pad register value when GP - register is smaller than MIPS_REGSIZE. - - * findvar.c (value_of_register): When raw and virtual register - values identical, check that sizes are consistent. - -Thu Mar 19 11:32:15 1998 Michael Snyder (msnyder@cleaver.cygnus.com) - - * minsyms.c (compare_minimal_symbols): If addresses are identical, - then compare on names. Sorted list should have symbols with - identical addresses AND names adjacent, so dups can be discarded. - -Wed Mar 18 12:50:17 1998 Jeff Law (law@cygnus.com) - - * stabsread.c (define_symbol): Don't look for ',' as a LRS - indicator. - -Wed Mar 18 10:34:51 1998 Nick Clifton <nickc@cygnus.com> - - * rdi-share/etherdrv.c: Set sys_errlist[] as char * not const char *. - -Fri Mar 13 15:43:53 1998 Peter Schauer (pes@regent.e-technik.tu-muenchen.de) - - * config/mips/xm-mips.h (CC_HAS_LONG_LONG): Undefine for Ultrix - when compiling with native cc, the compiler has broken long long - support. - -Fri Mar 13 15:37:02 1998 Peter Schauer (pes@regent.e-technik.tu-muenchen.de) - - * config/m68k/xm-sun3os4.h: Remove malloc declarations, they - are handled via autoconf now. - * remote.c (remote_ops, extended_remote_ops): Replace static - forward declaration by moving the static definition to the top of - the file, for old K&R compilers. - * tracepoint.c (collect_symbol, trace_start_command): - Replace ANSI string concatenation with K&R compatible simple string. - -1998-03-11 Fred Fish <fnf@ninemoons.com> - - * source.c (select_source_symtab): Don't reach error if we have - a current_source_symtab from reading in partial symbol table. - -Fri Mar 6 13:10:27 1998 Fred Fish <fnf@cygnus.com> - - * utils.c (quit): Call SERIAL_DRAIN_OUTPUT rather than - SERIAL_FLUSH_OUTPUT. - * serial.h (struct serial_ops): Add drain_output, pointer to - function that waits for output to drain. - (SERIAL_DRAIN_OUTPUT): Macro to wait for output to drain. - * ser-unix.c (hardwire_drain_output): New function and prototype. - - * ser-unix.c (hardwire_ops): Add entry for drain_output function. - * ser-tcp.c (tcp_ops): Ditto. - * ser-ocd.c (ocd_ops): Ditto. - * ser-mac.c (mac_ops): Ditto. - * ser-go32.c (dos_ops): Ditto. - * ser-e7kpc.c (e7000pc_ops): Ditto. - -Thu Mar 5 16:07:41 1998 Michael Snyder (msnyder@cleaver.cygnus.com) - - * sparcl-tdep.c: fix #endif comments - -Thu Mar 5 15:10:35 1998 Jason Molenda (crash@bugshack.cygnus.com) - - * Makefile.in (BISON): Configure substitutes in @YACC@, not @BISON@. - -Thu Mar 5 14:42:41 1998 Keith Seitz <keiths@onions.cygnus.com> - - * ocd.c (ocd_open): If we fail ocd_start_remote, make sure we - error () so that we abort out of bdm_ppc_open. - -Wed Mar 4 16:53:52 1998 Martin M. Hunt <hunt@cygnus.com> - - * serial.c (_initialize_serial): Add a description of - "set remotelogbase". - - * command.c (do_setshow_command): If no arguments are supplied, - don't dump core, instead print out an error message. - -Wed Mar 4 01:39:08 1998 Ron Unrau <runrau@cygnus.com> - - * elfread.c (elf_symtab_read): merge SYMBOL_IS_SPECIAL into - MAKE_MSYMBOL_SPECIAL - * config/mips/tm-mips.h: ditto - -Tue Mar 3 17:19:08 1998 John Metzler <jmetzler@cygnus.com> - - * dwarfread.c (read_tag_pointer_type): Pointer sizes now come from - TARGET_PTR_BIT rather from sizeof(char *) on host. - -Tue Mar 3 14:37:02 1998 Peter Schauer (pes@regent.e-technik.tu-muenchen.de) - - * alpha-nat.c (fetch_osf_core_registers): Renamed from - fetch_aout_core_registers. - (alpha_osf_core_fns): Renamed from alpha_aout_core_fns, change - flavour to bfd_target_unknown_flavour for OSF core files. - -Mon Mar 2 17:44:13 1998 Michael Snyder (msnyder@cleaver.cygnus.com) - - * breakpoint.c (_initialize_breakpoint): Make "en" an alias - for "enable" (so that it doesn't conflict with "end"). - -Mon Mar 2 17:04:25 1998 Jason Molenda (crash@bugshack.cygnus.com) - - * Makefile (VERSION): Bump to 4.17.1. - -Mon Mar 2 16:59:15 1998 Jason Molenda (crash@bugshack.cygnus.com) - - * rdi-share/etherdrv.c (sys_errlist): Add correct decl for Linux. - -Mon Mar 2 16:51:44 1998 Jason Molenda (crash@bugshack.cygnus.com) - - * Makefile.in (YYFILES): Remove in maintainer-clean, not distclean. - -Mon Mar 2 16:47:11 1998 Philippe De Muyter <phdm@macqel.be> - - * Makefile.in (distclean): Add `rm $(YYFILES)'. - -Mon Mar 2 16:45:48 1998 Philippe De Muyter <phdm@macqel.be> - - * coffread.c (coff_read_enum_type): Set TYPE_FLAG_UNSIGNED if enum - is unsigned. - -Sun Mar 2 15:16:13 1998 Richard Henderson <rth@cygnus.com> - - * configure.host, configure.tgt: Add sparc-linux. - * sparc-nat.c: Include <asm/reg.h> not <machine/reg.h> for Linux. - * config/sparc/*linux*: New files. - -Mon Mar 2 12:12:41 1998 Anthony Thompson (athompso@cambridge.arm.com) - - * arm-tdep.c (gdb_print_insn_arm): Call print_insn_big_arm - if we're big endian; else call print_insn_little_arm. - -Mon Feb 24 11:24:57 1998 Richard Henderson <rth@cygnus.com> - - * Makefile.in (BISON): Don't even pretend to use yacc. - (c-exp.tab.o): Use bison -o to use a unique intermediate file. - (f-exp.tab.o, m2-exp.tab.o): Likewise. - (jv-exp.tab.o): Likewise. - -Tue Feb 24 03:32:59 1998 Andrew Cagney <cagney@b1.cygnus.com> - - * remote-sim.c (gdbsim_fetch_register): Don't abort when the - register size is wrong. - -Thu Feb 19 16:49:48 1998 John Metzler <jmetzler@cygnus.com> - - * target.c (debug_to_fetch_registers,debug_to_store_registers, - debug-to_insert_breakpoint,debug_to_remove_breakpoint): tracing - 64 bit targets crashed long long printfs. - -Tue Feb 17 16:36:22 1998 Michael Snyder (msnyder@cleaver.cygnus.com) - - * symfile.c (read_target_int_array): rename read_target_long_array - and force the sizeof an ovly_table element to sizeof(long), - instead of sizeof(int). - -Tue Feb 17 18:05:05 1998 Frank Ch. Eigler <fche@cygnus.com> - - * remote-mips.c (mips_request): Use unsigned long during parsing - returned value from monitor, to prevent accidental sign extension. - -Tue Feb 17 14:28:33 1998 Peter Schauer <pes@regent.e-technik.tu-muenchen.de> - - * acconfig.h: FORCE_MMCHECK changed to MMCHECK_FORCE. - * configure.in: Ditto. - * configure: Regenerated. - -Tue Feb 17 14:07:34 1998 Peter Schauer <pes@regent.e-technik.tu-muenchen.de> - - * gdbtypes.c (check_typedef): Do not try to resolve the length of - a type which has TYPE_FLAG_TARGET_STUB set, if the target type has - set TYPE_FLAG_TARGET_STUB as well. - -Tue Feb 17 14:32:18 1998 Andrew Cagney <cagney@b1.cygnus.com> - - * remote-sim.c (gdbsim_fetch_register, gdbsim_store_register): - Pass register size to sim_{fetch,store}_register. Check nr of - register bytes transfered is correct. - -Mon Feb 16 14:05:54 1998 Andrew Cagney <cagney@b1.cygnus.com> - - * remote-d10v.c (remote_d10v_open): Call push_remote_target - instead of open_remote_target. - - * remote.c (remote_xfer_memory): Use REMOTE_TRANSLATE_XFER_ADDRESS - to translate addr/size when defined. - (open_remote_target): Delete. - - * target.h (open_remote_target): Delete. - - * config/d10v/tm-d10v.h (REMOTE_TRANSLATE_XFER_ADDRESS): Define. - -Mon Feb 16 14:05:54 1998 Andrew Cagney <cagney@b1.cygnus.com> - - * d10v-tdep.c (d10v_extract_return_value): Wierd. GCC wants to - return odd sized register quantities with only half of the first - register used! - - * config/d10v/tm-d10v.h (USE_STRUCT_CONVENTION): Use stack when - size > 8. - -Mon Feb 16 14:05:54 1998 Andrew Cagney <cagney@b1.cygnus.com> - - * config/d10v/tm-d10v.h (USE_STRUCT_CONVENTION): Define. True when - sizeof type > 1. - -Sun Feb 15 16:10:50 1998 Ron Unrau <runrau@cygnus.com> - - * parse.c (write_dollar_variable): call new function - target_map_name_to_register to allow targets to define their own - register name aliases. - * infcmd.c (registers_info): use target_map_name_to_register so that - "print $reg" and "info reg $reg" use the same register name aliases. - -Fri Feb 13 16:40:30 1998 Stan Shebs <shebs@andros.cygnus.com> - - * config/i386/i386mk.mt (OBJFORMATS): Delete, no longer used. - * config/i386/xm-i386mk.h: Fix an include. - * config/pyr/tm-pyr.h (PC_INNER_THAN): Remove, never used. - -Thu Feb 12 16:12:07 1998 Frank Ch. Eigler <fche@cygnus.com> - - * remote-mips.c (mips_enter_debug): Sleep before sending CR to - monitor. - (mips_exit_debug): Accept any whitespace / verbiage before monitor - prompt reappears. - -Thu Feb 12 18:25:42 1998 Andrew Cagney <cagney@b1.cygnus.com> - - * d10v-tdep.c (show_regs): Avoid use of %llx when printing 8 byte - accumulators. - -Thu Feb 12 17:10:22 1998 Andrew Cagney <cagney@b1.cygnus.com> - - * valops.c (value_at): For d10v, make read pointers with - read_target_unsigned_integer, keep addresses unsigned. - (value_fetch_lazy): Ditto. - -Thu Feb 12 12:14:02 1998 Andrew Cagney <cagney@b1.cygnus.com> - - * remote-d10v.c: New file. Layer the d10v GDB->remote memory map - on top of the remote serial memory transfer functions. - - * config/d10v/d10v.mt (TDEPFILES): Add remote-d10v.o - - * Makefile.in (remote-d10v.o): Add dependencies. - - * remote.c (remote_open_1): Add arg extended_p, engage extended - protocol when extended_p. - (remote_open, extended_remote_open): Pass !extended_p / - extended_p to remote_open_1. - - * remote.c (open_remote_target), target.h: New function. - -Wed Feb 11 08:41:15 1998 Andrew Cagney <cagney@b1.cygnus.com> - - * config/i386/fbsd.mh (XDEPFILES): Add ser-tcp.o. - -Tue Feb 10 17:50:37 1998 Keith Seitz <keiths@onions.cygnus.com> - - * tracepoint.c (tracepoint_operation): Call the modify_tracepoint_hook - if it exists. - Remove static declaration of free_actions. - - * tracepoint.h: Add declaration of free_actions. - -Tue Feb 10 12:17:13 1998 Fred Fish <fnf@cygnus.com> - - * symtab.c (decode_line_1): Revert change that mistakenly - removed assignment of sals[0].pc field. - -Mon Feb 10 12:37:47 1998 Philippe De Muyter <phdm@macqel.be> - - * m68k/tm-delta68.h (EXTRACT_RETURN_VALUE): Type argument for - `REGISTER_CONVERT_TO_VIRTUAL is `TYPE', not - `REGISTER_VIRTUAL_TYPE (FP0_REGNUM)'; - (STORE_RETURN_VALUE): Ditto, and offset for `write_register_bytes' - is `REGISTER_BYTE (FP0_REGNUM)', not `FP0_REGNUM'. - (FRAME_NUM_ARGS): New macro. - * m68k/tm-news.h (EXTRACT_RETURN_VALUE, STORE_RETURN_VALUE): Ditto. - * delta68-nat.c (clear_insn_cache): New function, forgotten in previous - patch. - -Mon Feb 9 11:10:06 1998 Andrew Cagney <cagney@b1.cygnus.com> - - * d10v-tdep.c: Replace references to IMEM_ADDR and DMEM_ADDR with - D10V_MAKE_[DI]ADDR and D10V_CONVERT_[ID]ADDR_TO_RAW macros. - - * config/d10v/tm-d10v.h (IMEM_START): Move to 0x01...... - (DMEM_START): Move to 0x00...... - (STACK_START): Move to 0x00..7ffe. - (D10V_MAKE_IADDR, D10V_MAKE_DADDR): Translate unconditionally. - - * d10v-tdep.c (d10v_xlate_addr): Delete function. - -Mon Feb 9 15:10:21 1998 Fred Fish <fnf@cygnus.com> - - * symtab.c (fixup_psymbol_section): Move forward declaration to - top of file with other such decls. Make it a static function. - * symtab.h: Minor formatting tweaks. - -Mon Feb 9 13:14:12 1998 Stan Shebs <shebs@andros.cygnus.com> - - * config/a29k-udi.mt, config/i960/vxworks960.mt (REMOTE_OBS): - Remove redefinition. - * config/i960/tm-i960.h (BREAKPOINT): Define. - -Mon Feb 9 15:35:38 1998 Ian Lance Taylor <ian@cygnus.com> - - * Makefile.in (init.c): Ignore errors when making init.c. Seems - necessary to work around bug in Solaris make. - -Sun Feb 6 02:44:28 1998 Philippe De Muyter <phdm@macqel.be> - - * m68k/tm-delta68.h (CPLUS_MARKER): Macro deleted. - (EXTRACT_STRUCT_VALUE_ADDRESS): Macro defined. - (EXTRACT_RETURN_VALUE, STORE_RETURN_VALUE): Macros modified - because floating-point values return via %fp0. - (CLEAR_INSN_CACHE): New macro. - * m68k/tm-m68k.h (REGISTER_CONVERT_TO_VIRTUAL): Macro fixed - to use DOUBLEST. - (REGISTER_CONVERT_TO_RAW): Ditto. - * infptrace.c (child_xfer_memory): If CLEAR_INSN_CACHE is defined, - call it after having written in child process's memory. - * inflow.c (PROCESS_GROUP_TYPE): Macro defined if HAVE_TERMIO. - (gdb_has_a_terminal, terminal_ours_1): Functions fixed for HAVE_TERMIO. - -Fri Feb 6 16:17:30 1998 Jeffrey A Law (law@cygnus.com) - - * config/mips/tm-mips64.h (TARGET_LONG_BIT): Allow final target to - override. - (TARGET_LONG_LONG_BIT): Likewise. - (TARGET_PTR_BIT): Likewise. - -Fri Feb 6 17:42:22 1998 Andrew Cagney <cagney@b1.cygnus.com> - - * config/d10v/tm-d10v.h (D10V_CONVERT_IADDR_TO_RAW, - D10V_CONVERT_DADDR_TO_RAW): Define. - - * d10v-tdep.c (d10v_push_arguments): Re-write. Pass arguments in - registers, regardless of their size, when they fit. - -Thu Feb 5 13:16:36 1998 Andrew Cagney <cagney@b1.cygnus.com> - - * d10v-tdep.c (d10v_extract_return_value): For function pointers - translate address to IMAP area. - - * config/d10v/tm-d10v.h (EXTRA_FRAME_INFO): Delete dummy from - struct. - (POP_FRAME): Point at generic_pop_current_frame. - - * d10v-tdep.c (d10v_pop_frame): Delete code handling dummy frames, - handled earlier. - (d10v_push_return_address): New function. - (d10v_pop_dummy_frame): Delete. - (d10v_fix_call_dummy): Delete. - (d10v_call_dummy_address): Delete. - - * d10v-tdep.c (d10v_init_extra_frame_info): Clear dummy and - frameless. - - * d10v-tdep.c (d10v_push_arguments): Keep stack word aligned. - - * config/d10v/tm-d10v.h (EXTRACT_STRUCT_VALUE_ADDRESS): Extract - address of structure from first ARG1_REGNUM. - - * d10v-tdep.c (d10v_push_arguments): Force 4 byte args into - even-odd register pair. Store 1 and 2 byte args in registers. - - * valops.c (value_fetch_lazy): Ensure that a D10V function pointer - is fetched in the correct byte order. - (value_at): Ditto. Also ensure data pointers are mapped to data - segment. - - * config/d10v/tm-d10v.h (D10V_DADDR_P, D10V_IADDR_P): - - * d10v-tdep.c: Replace 2 with REGISTER_RAW_SIZE. - (d10v_pop_frame): Replace R13 with LR_REGNUM. - (d10v_push_arguments): Replace R2 with ARG1_REGNUM. - (d10v_push_arguments): Replace 6 with ARGN_REGNUM. - (d10v_extract_return_value): Access return value with RET1_REGNUM. - - * config/d10v/tm-d10v.h (ARG1_REGNUM, ARGN_REGNUM, RET1_REGNUM): - Define. - (STORE_RETURN_VALUE): Specify return register using RET1_REGNUM. - (STORE_STRUCT_RETURN): Specify ARG1_REGNUM as the struct ptr - location. - -Thu Feb 5 13:16:36 1998 Andrew Cagney <cagney@b1.cygnus.com> - - * blockframe.c (generic_pop_dummy_frame): Flush the frame, no - longer valid. - - * blockframe.c (generic_pop_current_frame), frames.h: New - function. - -Thu Feb 5 17:18:16 1998 Andrew Cagney <cagney@b1.cygnus.com> - - * remote-sim.c (gdbsim_create_inferior): clear_proceed_status - before /re/starting the simulator. - -Thu Feb 5 15:55:31 1998 C. M. Heard (heard@vvnet.com) - - * top.c (do_nothing): Remove signal handler after signal is caught. - -Thu Feb 5 11:57:06 1998 Michael Snyder (msnyder@cleaver.cygnus.com) - - * tracepoint.c (tracepoint_operation): call free_actions instead - of free. (free_actions): eliminate some memory leaks for actions. - (validate_actionline): pass string arg by reference, so we can - change the pointer. Change all memrange collection arguments to - canonical form (literal address and size), to enforce early - evaluation. Accept UNOP_MEMVAL (assembly variables) for - trace collection. (parse_and_eval_memrange): accept expressions - for the address and size fields of a memrange (and evaluate - them immediately). (several places): use -1 instead of zero - to distinguish an absolute memrange from a register-relative one. - (encode_actions): add handling for UNOP_MEMVAL (assembly variable). - -Wed Feb 4 17:40:21 1998 Jason Molenda (crash@bugshack.cygnus.com) - - * Makefile.in (SFILES): add tracepoint.c. - (LINTFILES): add @CONFIG_SRCS@. - (SOURCES): Ditto. - * configure.in (CONFIG_SRCS): Mirror use of CONFIG_OBS. - * configure: Regenerated. - -Tue Feb 3 16:12:32 1998 Gordon W. Ross (gwr@mc.com) - - * infptrace.c (child_resume): Don't try to step if - NO_SINGLE_STEP is defined. - -Mon Feb 2 19:06:13 1998 Jason Molenda (crash@bugshack.cygnus.com) - - * Makefile.in (VERSION): Bump to 4.16.2. - -Mon Feb 2 17:18:25 1998 Richard Henderson <rth@cygnus.com> - - * alpha-nat.c (fetch_aout_core_registers): Rename from - fetch_core_registers. - (fetch_elf_core_registers): New function. - (supply_gregset): Use ALPHA_REGSET_BASE. - (supply_fpregset): Likewise. - (fill_fpregset): Likewise. - (alpha_aout_core_fns): Rename from alpha_core_fns. - (alpha_elf_core_fns): New. - * config/alpha/alpha-linux.mh (NATDEPFILES): solib.o not osfsolib.o. - Disable MMALLOC. - * config/alpha/nm-linux.h (SVR4_SHARED_LIBS): Define if ELF. - (TARGET_ELF64): Likewise. - (ALPHA_REGSET_BASE): New. - * config/alpha/nm-osf.h (ALPHA_REGSET_BASE): New. - * config/alpha/tm-alphalinux.h: Include tm-sysv4.h. - - * solib.c (elf_locate_base): Add TARGET_ELF64 support. - (info_sharedlibary_command): Likewise. - - * configure.host: Match alpha*. - * configure.tgt: Likewise. - -Fri Jan 30 15:11:38 1998 David Taylor <taylor@texas.cygnus.com> - - Changes by <Peter.Schauer@Regent.E-Technik.TU-Muenchen.DE> - * infrun.c (IN_SOLIB_DYNSYM_RESOLVE_CODE): new macro for detecting - whether we are in the dynamic symbol resolution code - (wait_for_inferior): invoke it. - * solib.c (in_svr4_dynsym_resolve_code): new function - (enable_break): record start and end of the dynamic linker - text and plt sections for use in in_svr4_dynsym_resolve_code. - * solib.h (IN_SOLIB_DYNSYM_RESOLVE_CODE): add svr4 definition; - (in_svr4_dynsym_resolve_code): declare it. - * config/nm-gnu.h (solib.h): move inclusion to after definition - of SVR4_SHARED_LIBS. - * config/nm-sysv4.h (solib.h): ditto. - * config/i386/nm-i386sco5.h (solib.h): ditto. - * config/i386/nm-linux.h (solib.h): ditto. - * config/mips/nm-irix5.h (IN_SOLIB_DYNSYM_RESOLVE_CODE): undefine. - -Thu Jan 29 19:39:31 1998 Stan Shebs <shebs@andros.cygnus.com> - - * coffread.c (coff_symtab_read) [SEM]: Remove code, macro can - never be defined. - * dbxread.c (process_one_symbol) [BLOCK_ADDRESS_ABSOLUTE]: - Remove, no longer needed. - * hppa-tdep.c (N_SET_MAGIC): Remove, no longer used. - * config/pa/xm-hppab.h (SEEK_SET, SEEK_CUR, SEEK_END): Ditto. - * config/mips/tm-mipsm3.h (NUMERIC_REG_NAMES): Ditto. - * config/mips/mipsm3.mt (TDEPFILES): Remove mipsread.o. - -Wed Jan 28 14:46:52 1998 Stan Shebs <shebs@andros.cygnus.com> - - Suggested by Chris Walter <walter@budoe.bu.edu>: - * dwarfread.c (set_cu_language): Recognize Fortran. - * dwarf2read.c (set_cu_language): Ditto. - (read_array_type): Fix language test. - -Wed Jan 28 12:51:08 1998 Michael Snyder (msnyder@cleaver.cygnus.com) - - * blockframe.c (generic_frame_chain_valid): A frame pointer may - be valid if it is equal to the frame pointer of its caller (ie. - not necessarily strictly INNER_THAN). Allows frameless functions. - -Wed Jan 28 11:23:25 1998 Mark Alexander <marka@cygnus.com> - - * monitor.c (monitor_vsprintf): New function to handle - printing of large addresses using %A format specifier. - (monitor_printf_noecho, monitor_printf): Use monitor_vsprintf - instead of vsprintf. - * dve3900-rom.c (_initialize_r3900_rom): Use %A instead of %Lx - to print addresses. - -Tue Jan 27 16:14:23 1998 Jason Molenda (crash@bugshack.cygnus.com) - - * configure.in (CONFIG_LDFLAGS): Only add -export-dynamic - when using GNU ld. - -Mon Jan 26 19:07:46 1998 Jason Molenda (crash@bugshack.cygnus.com) - - * config/alpha/tm-alphalinux.h (alpha_linux_sigtramp_offset): - Add closing parenthesis. From HJ Lu. - -Mon Jan 26 17:54:45 1998 Mark Alexander <marka@cygnus.com> - - * dve3900-rom.c: Improve performance by using memory commands - that print less fluff. Minor cosmetic changes. - Eliminate compiler warnings. - -Sat Jan 24 23:44:43 1998 Martin M. Hunt <hunt@cygnus.com> - - * breakpoint.c (enable_breakpoint): Preserve breakpoint - disposition when enabling a breakpoint. - - * symtab.c (find_pc_sect_line): If no symbol information - is found, return correct pc anyway. - -Fri Jan 23 17:26:22 1998 Stan Shebs <shebs@andros.cygnus.com> - - * configure.host (i[3456]86-*-osf1mk*, mips-*-mach3*, - ns32k-*-mach3*): Fix file names. - (i[3456]86-*-os9k, m88*-*-mach3*, w65-*-*): Remove config - recognition, no source files for these. - * configure.tgt (powerpc-*-aix4*): Remove config, now identical - to powerpc-*-aix*. - * config/powerpc/{aix4.mh,aix4.mt,tm-ppc-aix4.h}: Remove files, - no longer needed. - -Fri Jan 23 16:49:41 1998 Mark Alexander <marka@cygnus.com> - - * monitor.c (monitor_write, monitor_readchar): New functions. - * monitor.h (monitor_write, monitor_readchar): Declare. - * dve3900-rom.c: Add support for fast loading on ethernet connections. - -Fri Jan 23 07:47:06 1998 Fred Fish <fnf@cygnus.com> - - * config/d10v/tm-d10v.h (CALL_DUMMY): Define as "{ 0 }". - (TARGET_READ_FP): Define to d10v_read_fp rather than d10v_read_sp. - (TARGET_WRITE_FP): Define to d10v_write_fp rather than d10v_write_sp. - (d10v_write_fp, d10v_read_fp): Add prototypes. - * symtab.c (decode_line_1): Remove assignment of sals[0].pc field. - * symfile.c (simple_overlay_update, simple_overlay_update_1): - Ignore the size of overlay sections. This check is redundant anyway. - * printcmd.c (print_frame_args): Ditto. - * valops.c (value_fetch_lazy): Ditto. - * values.c (unpack_long): Ditto. - * d10v-tdep.c (d10v_frame_chain, d10v_frame_find_saved_regs, - d10v_init_extra_frame_info): Fix some minor bugs so the finish command - works properly. - (show_regs): Change num1 and num2 types from "long long" to "LONGEST". - (d10v_read_fp, d10v_write_fp): New functions. - (d10v_push_arguments): Remove unneeded assigns to "val" and "contents". - (d10v_push_arguments): Fix for pointers and structs. - (d10v_extract_return_value): Fix for pointers and chars. - -Tue Jan 20 18:53:18 1998 Stan Shebs <shebs@andros.cygnus.com> - - * configure.tgt (i386-*-mach*, m88*-*-mach3*): Remove config - recognition, no source files for these (note that the i386 Mach - config is for pre-Mach 3). - (mips*-*-mach3*, ns32k-*-mach3*): Fix file names. - * config/mips/mipsel64.mt: Remove, never referenced. - -Mon Jan 19 14:01:28 1998 Stan Shebs <shebs@andros.cygnus.com> - - * top.c (print_gdb_version): Restore to original message. - -Mon Jan 19 13:34:40 1998 Ian Lance Taylor <ian@cygnus.com> - - From cgf@bbc.com (Chris Faylor): - * win32-nat.c (child_mourn_inferior): Call ContinueDebugEvent to - let the child exit. - (child_kill_inferior): Respond to all debug events as the child is - terminating. - - * Makefile.in (all): Change gdb dependency to gdb$(EXEEXT). - (uninstall): Add $(EXEEXT) to file name to remove. - (gdb$(EXEEXT)): Rename target from plain gdb. - (gdb1$(EXEEXT)): Rename target from plain gdb1. - (clean, mostlyclean): Add $(EXEEXT) to binary names to remove. - -1998-01-16 Felix Lee <flee@cygnus.com> - - * top.c (print_gdb_version): delete stutter. - -Thu Jan 15 12:29:13 1998 Nick Clifton <nickc@cygnus.com> - - * remote-rdi.c (arm_rdi_open): Patch from Tony.Thompson@arm.com - to prevent spurous error messages on non-ICE targets. - -Wed Jan 14 19:27:02 1998 Stan Shebs <shebs@andros.cygnus.com> - - * config/mips/{r3900.mt,r3900l.mt,tm-r3900.h,tm-r3900l.h}: - Remove, no longer used. - -Wed Jan 14 18:11:26 1998 Michael Meissner <meissner@cygnus.com> - - Patch from Jim Wilson. - * d30v-tdep.c (d30v_frame_find_saved_regs_offsets): Properly - declare void function before use. - - * config/d30v/tm-d30v.h (CALL_DUMMY): Initialize as { 0 }, not {}. - -Tue Jan 13 16:38:48 1998 Fred Fish <fnf@cygnus.com> - - * configure.in (--with-mmalloc): Add new configure arg to use the - mmalloc package. Default is to not use it. - (START_INFERIOR_TRAPS_EXPECTED): Define to the integer 2, not - the string "2". - * acconfig.h (USE_MMALLOC, FORCE_MMCHECK): Add #undef. - * configure: Regenerated. - * config.in: Regenerated. - * Makefile.in (MMALLOC_DIR, MMALLOC_SRC): Remove. - (MMALLOC): Set using configure. - (MMALLOC_CFLAGS): Set using configure. - - * config/i386/tm-linux.h (sys_quotactl): Define to 1 rather - than just defining it. - * mpw-make.sed: Undefine USE_MMALLOC rather than defining NO_MMALLOC. - * utils.c (NO_MMALLOC): Use USE_MMALLOC instead. - * objfiles.c: ditto. - * defs.h: ditto. - - * config/sparc/sun4os4.mh (MMALLOC_CFLAGS): Remove. - * config/m68k/sun3os4.mh (MMALLOC_CFLAGS): Remove. - * config/i386/cygwin32.mh (MMALLOC_CFLAGS): Remove. - * config/alpha/alpha-osf3.mh (MMALLOC_CFLAGS): Remove. - * config/alpha/alpha-osf2.mh (MMALLOC_CFLAGS): Remove. - * gdbserver/Makefile.in (MMALLOC_*): Remove. - * config/rs6000/rs6000.mh (MMALLOC, MMALLOC_CFLAGS): Remove. - * config/rs6000/aix4.mh (MMALLOC, MMALLOC_CFLAGS): Remove. - * config/powerpc/aix4.mh (MMALLOC, MMALLOC_CFLAGS): Remove. - * config/powerpc/aix.mh (MMALLOC, MMALLOC_CFLAGS): Remove. - * config/ns32k/ns32km3.mh (MMALLOC, MMALLOC_CFLAGS): Remove. - * config/mips/mipsm3.mh (MMALLOC, MMALLOC_CFLAGS): Remove. - * config/mips/decstation.mh (MMALLOC, MMALLOC_CFLAGS): Remove. - * config/m88k/cxux.mh (MMALLOC, MMALLOC_CFLAGS): Remove. - * config/i386/xm-windows.h (NO_MMALLOC, NO_MMCHECK): Remove. - * config/i386/i386mk.mh (MMALLOC, MMALLOC_CFLAGS): Remove. - * config/i386/i386m3.mh (MMALLOC, MMALLOC_CFLAGS): Remove. - * config/i386/i386gnu.mh (MMALLOC, MMALLOC_CFLAGS): Remove. - * config/alpha/alpha-osf1.mh (MMALLOC, MMALLOC_CFLAGS): Remove. - * config/alpha/alpha-linux.mh (MMALLOC, MMALLOC_CFLAGS): Remove. - -Mon Jan 12 11:46:51 1998 Michael Snyder (msnyder@cleaver.cygnus.com) - - * config/m68k/tm-m68k.h (REGISTER_VIRTUAL_TYPE): make A0 thru A7 - default to void pointer type (so that their default radix is hex). - - * symtab.c: move rbreak_command from no_class to class_breakpoint - so it will be listed under "help breakpoints". - -Sat Jan 10 14:58:04 1998 Stan Shebs <shebs@andros.cygnus.com> - - * rdi-share/hostchan.c: Remove gettimeofday declaration. - -Thu Jan 8 11:03:59 1998 Nick Clifton <nickc@cygnus.com> - - * remote-rdp.c: Applied patches submitted by Tony.Thompson@arm.com - to implement the Angel remote debugging interface. - - * Makefile.in: Add build rules for remote-rdi.c and - rdi-share/libangsd.a. - - * configure.tgt: Updated from source on branch. - * config/arm/tm-arm.h: Updated from source on branch. - * arm-tdep.c: Updated from source on branch. - - * rdi-share: New directory, RDI library contributed by ARM. - -Mon Jan 5 20:21:59 1998 Mark Alexander <marka@cygnus.com> - - * monitor.h (MO_PRINT_PROGRAM_OUTPUT): Define. - * monitor.c (monitor_wait): Echo program output. - * dve3900-rom.c (_initialize_r3900_rom): Remove MO_HANDLE_NL flag, - add MO_PRINT_PROGRAM_OUTPUT flag. - -Mon Jan 5 18:21:11 1998 David Taylor <taylor@texas.cygnus.com> - - * top.h (HAVE_SIGSETJMP): define SIGJMP_BUF, SIGSETJMP, and - SIGLONGJMP appropriately based on whether HAVE_SIGSETJMP is - defined. - * top.c (return_to_top_level, catch_errors): use the new macros - * main.c (SET_TOP_LEVEL): ditto. - * config/xm-sysv4.h (HAVE_SIGSETJMP): Define. - -Fri Jan 2 18:48:58 1998 Mark Alexander <marka@cygnus.com> - - * configure.in: Double up brackets in shell case pattern. - -Fri Jan 2 17:06:05 1998 Michael Snyder (msnyder@cleaver.cygnus.com) - - * tracepoint.c (finish_tfind_command): improved algorithm for - deciding when we've "stepped" into a new stack frame. - (map_args_over_tracepoints): loop over tracepoint list "safely", - since list elements may be deleted during loop. - (read_actions): add actions to history list. - -For older changes see ChangeLog-97 - -Local Variables: -mode: change-log -left-margin: 8 -fill-column: 74 -version-control: never -End: diff --git a/contrib/gdb/gdb/arm-convert.s b/contrib/gdb/gdb/arm-convert.s deleted file mode 100644 index 8124052bb1003..0000000000000 --- a/contrib/gdb/gdb/arm-convert.s +++ /dev/null @@ -1,16 +0,0 @@ -/* OBSOLETE .text */ -/* OBSOLETE .global _convert_from_extended */ -/* OBSOLETE */ -/* OBSOLETE _convert_from_extended: */ -/* OBSOLETE */ -/* OBSOLETE ldfe f0,[a1] */ -/* OBSOLETE stfd f0,[a2] */ -/* OBSOLETE movs pc,lr */ -/* OBSOLETE */ -/* OBSOLETE .global _convert_to_extended */ -/* OBSOLETE */ -/* OBSOLETE _convert_to_extended: */ -/* OBSOLETE */ -/* OBSOLETE ldfd f0,[a1] */ -/* OBSOLETE stfe f0,[a2] */ -/* OBSOLETE movs pc,lr */ diff --git a/contrib/gdb/gdb/arm-xdep.c b/contrib/gdb/gdb/arm-xdep.c deleted file mode 100644 index 64ca9003665e0..0000000000000 --- a/contrib/gdb/gdb/arm-xdep.c +++ /dev/null @@ -1,575 +0,0 @@ -/* OBSOLETE /* Acorn Risc Machine host machine support. */ -/* OBSOLETE Copyright (C) 1988, 1989, 1991 Free Software Foundation, Inc. */ -/* OBSOLETE */ -/* OBSOLETE This file is part of GDB. */ -/* OBSOLETE */ -/* OBSOLETE This program is free software; you can redistribute it and/or modify */ -/* OBSOLETE it under the terms of the GNU General Public License as published by */ -/* OBSOLETE the Free Software Foundation; either version 2 of the License, or */ -/* OBSOLETE (at your option) any later version. */ -/* OBSOLETE */ -/* OBSOLETE This program is distributed in the hope that it will be useful, */ -/* OBSOLETE but WITHOUT ANY WARRANTY; without even the implied warranty of */ -/* OBSOLETE MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the */ -/* OBSOLETE GNU General Public License for more details. */ -/* OBSOLETE */ -/* OBSOLETE You should have received a copy of the GNU General Public License */ -/* OBSOLETE along with this program; if not, write to the Free Software */ -/* OBSOLETE Foundation, Inc., 59 Temple Place - Suite 330, */ -/* OBSOLETE Boston, MA 02111-1307, USA. *x/ */ -/* OBSOLETE */ -/* OBSOLETE #include "defs.h" */ -/* OBSOLETE #include "frame.h" */ -/* OBSOLETE #include "inferior.h" */ -/* OBSOLETE #include "opcode/arm.h" */ -/* OBSOLETE */ -/* OBSOLETE #include <sys/param.h> */ -/* OBSOLETE #include <sys/dir.h> */ -/* OBSOLETE #include <signal.h> */ -/* OBSOLETE #include <sys/ioctl.h> */ -/* OBSOLETE #include <sys/ptrace.h> */ -/* OBSOLETE #include <machine/reg.h> */ -/* OBSOLETE */ -/* OBSOLETE #define N_TXTADDR(hdr) 0x8000 */ -/* OBSOLETE #define N_DATADDR(hdr) (hdr.a_text + 0x8000) */ -/* OBSOLETE */ -/* OBSOLETE #include "gdbcore.h" */ -/* OBSOLETE */ -/* OBSOLETE #include <sys/user.h> /* After a.out.h *x/ */ -/* OBSOLETE #include <sys/file.h> */ -/* OBSOLETE #include "gdb_stat.h" */ -/* OBSOLETE */ -/* OBSOLETE #include <errno.h> */ -/* OBSOLETE */ -/* OBSOLETE void */ -/* OBSOLETE fetch_inferior_registers (regno) */ -/* OBSOLETE int regno; /* Original value discarded *x/ */ -/* OBSOLETE { */ -/* OBSOLETE register unsigned int regaddr; */ -/* OBSOLETE char buf[MAX_REGISTER_RAW_SIZE]; */ -/* OBSOLETE register int i; */ -/* OBSOLETE */ -/* OBSOLETE struct user u; */ -/* OBSOLETE unsigned int offset = (char *) &u.u_ar0 - (char *) &u; */ -/* OBSOLETE offset = ptrace (PT_READ_U, inferior_pid, (PTRACE_ARG3_TYPE) offset, 0) */ -/* OBSOLETE - KERNEL_U_ADDR; */ -/* OBSOLETE */ -/* OBSOLETE registers_fetched (); */ -/* OBSOLETE */ -/* OBSOLETE for (regno = 0; regno < 16; regno++) */ -/* OBSOLETE { */ -/* OBSOLETE regaddr = offset + regno * 4; */ -/* OBSOLETE *(int *) &buf[0] = ptrace (PT_READ_U, inferior_pid, */ -/* OBSOLETE (PTRACE_ARG3_TYPE) regaddr, 0); */ -/* OBSOLETE if (regno == PC_REGNUM) */ -/* OBSOLETE *(int *) &buf[0] = GET_PC_PART (*(int *) &buf[0]); */ -/* OBSOLETE supply_register (regno, buf); */ -/* OBSOLETE } */ -/* OBSOLETE *(int *) &buf[0] = ptrace (PT_READ_U, inferior_pid, */ -/* OBSOLETE (PTRACE_ARG3_TYPE) (offset + PC * 4), 0); */ -/* OBSOLETE supply_register (PS_REGNUM, buf); /* set virtual register ps same as pc *x/ */ -/* OBSOLETE */ -/* OBSOLETE /* read the floating point registers *x/ */ -/* OBSOLETE offset = (char *) &u.u_fp_regs - (char *) &u; */ -/* OBSOLETE *(int *) buf = ptrace (PT_READ_U, inferior_pid, (PTRACE_ARG3_TYPE) offset, 0); */ -/* OBSOLETE supply_register (FPS_REGNUM, buf); */ -/* OBSOLETE for (regno = 16; regno < 24; regno++) */ -/* OBSOLETE { */ -/* OBSOLETE regaddr = offset + 4 + 12 * (regno - 16); */ -/* OBSOLETE for (i = 0; i < 12; i += sizeof (int)) */ -/* OBSOLETE *(int *) &buf[i] = ptrace (PT_READ_U, inferior_pid, */ -/* OBSOLETE (PTRACE_ARG3_TYPE) (regaddr + i), 0); */ -/* OBSOLETE supply_register (regno, buf); */ -/* OBSOLETE } */ -/* OBSOLETE } */ -/* OBSOLETE */ -/* OBSOLETE /* Store our register values back into the inferior. */ -/* OBSOLETE If REGNO is -1, do this for all registers. */ -/* OBSOLETE Otherwise, REGNO specifies which register (so we can save time). *x/ */ -/* OBSOLETE */ -/* OBSOLETE void */ -/* OBSOLETE store_inferior_registers (regno) */ -/* OBSOLETE int regno; */ -/* OBSOLETE { */ -/* OBSOLETE register unsigned int regaddr; */ -/* OBSOLETE char buf[80]; */ -/* OBSOLETE */ -/* OBSOLETE struct user u; */ -/* OBSOLETE unsigned long value; */ -/* OBSOLETE unsigned int offset = (char *) &u.u_ar0 - (char *) &u; */ -/* OBSOLETE offset = ptrace (PT_READ_U, inferior_pid, (PTRACE_ARG3_TYPE) offset, 0) */ -/* OBSOLETE - KERNEL_U_ADDR; */ -/* OBSOLETE */ -/* OBSOLETE if (regno >= 0) */ -/* OBSOLETE { */ -/* OBSOLETE if (regno >= 16) */ -/* OBSOLETE return; */ -/* OBSOLETE regaddr = offset + 4 * regno; */ -/* OBSOLETE errno = 0; */ -/* OBSOLETE value = read_register (regno); */ -/* OBSOLETE if (regno == PC_REGNUM) */ -/* OBSOLETE value = SET_PC_PART (read_register (PS_REGNUM), value); */ -/* OBSOLETE ptrace (PT_WRITE_U, inferior_pid, (PTRACE_ARG3_TYPE) regaddr, value); */ -/* OBSOLETE if (errno != 0) */ -/* OBSOLETE { */ -/* OBSOLETE sprintf (buf, "writing register number %d", regno); */ -/* OBSOLETE perror_with_name (buf); */ -/* OBSOLETE } */ -/* OBSOLETE } */ -/* OBSOLETE else */ -/* OBSOLETE for (regno = 0; regno < 15; regno++) */ -/* OBSOLETE { */ -/* OBSOLETE regaddr = offset + regno * 4; */ -/* OBSOLETE errno = 0; */ -/* OBSOLETE value = read_register (regno); */ -/* OBSOLETE if (regno == PC_REGNUM) */ -/* OBSOLETE value = SET_PC_PART (read_register (PS_REGNUM), value); */ -/* OBSOLETE ptrace (6, inferior_pid, (PTRACE_ARG3_TYPE) regaddr, value); */ -/* OBSOLETE if (errno != 0) */ -/* OBSOLETE { */ -/* OBSOLETE sprintf (buf, "writing all regs, number %d", regno); */ -/* OBSOLETE perror_with_name (buf); */ -/* OBSOLETE } */ -/* OBSOLETE } */ -/* OBSOLETE } */ -/* OBSOLETE */ -/* OBSOLETE /* Work with core dump and executable files, for GDB. */ -/* OBSOLETE This code would be in corefile.c if it weren't machine-dependent. *x/ */ -/* OBSOLETE */ -/* OBSOLETE /* Structure to describe the chain of shared libraries used */ -/* OBSOLETE by the execfile. */ -/* OBSOLETE e.g. prog shares Xt which shares X11 which shares c. *x/ */ -/* OBSOLETE */ -/* OBSOLETE struct shared_library */ -/* OBSOLETE { */ -/* OBSOLETE struct exec_header header; */ -/* OBSOLETE char name[SHLIBLEN]; */ -/* OBSOLETE CORE_ADDR text_start; /* CORE_ADDR of 1st byte of text, this file *x/ */ -/* OBSOLETE long data_offset; /* offset of data section in file *x/ */ -/* OBSOLETE int chan; /* file descriptor for the file *x/ */ -/* OBSOLETE struct shared_library *shares; /* library this one shares *x/ */ -/* OBSOLETE }; */ -/* OBSOLETE static struct shared_library *shlib = 0; */ -/* OBSOLETE */ -/* OBSOLETE /* Hook for `exec_file_command' command to call. *x/ */ -/* OBSOLETE */ -/* OBSOLETE extern void (*exec_file_display_hook) (); */ -/* OBSOLETE */ -/* OBSOLETE static CORE_ADDR unshared_text_start; */ -/* OBSOLETE */ -/* OBSOLETE /* extended header from exec file (for shared library info) *x/ */ -/* OBSOLETE */ -/* OBSOLETE static struct exec_header exec_header; */ -/* OBSOLETE */ -/* OBSOLETE void */ -/* OBSOLETE core_file_command (filename, from_tty) */ -/* OBSOLETE char *filename; */ -/* OBSOLETE int from_tty; */ -/* OBSOLETE { */ -/* OBSOLETE int val; */ -/* OBSOLETE */ -/* OBSOLETE /* Discard all vestiges of any previous core file */ -/* OBSOLETE and mark data and stack spaces as empty. *x/ */ -/* OBSOLETE */ -/* OBSOLETE if (corefile) */ -/* OBSOLETE free (corefile); */ -/* OBSOLETE corefile = 0; */ -/* OBSOLETE */ -/* OBSOLETE if (corechan >= 0) */ -/* OBSOLETE close (corechan); */ -/* OBSOLETE corechan = -1; */ -/* OBSOLETE */ -/* OBSOLETE data_start = 0; */ -/* OBSOLETE data_end = 0; */ -/* OBSOLETE stack_start = STACK_END_ADDR; */ -/* OBSOLETE stack_end = STACK_END_ADDR; */ -/* OBSOLETE */ -/* OBSOLETE /* Now, if a new core file was specified, open it and digest it. *x/ */ -/* OBSOLETE */ -/* OBSOLETE if (filename) */ -/* OBSOLETE { */ -/* OBSOLETE filename = tilde_expand (filename); */ -/* OBSOLETE make_cleanup (free, filename); */ -/* OBSOLETE */ -/* OBSOLETE if (have_inferior_p ()) */ -/* OBSOLETE error ("To look at a core file, you must kill the program with \"kill\"."); */ -/* OBSOLETE corechan = open (filename, O_RDONLY, 0); */ -/* OBSOLETE if (corechan < 0) */ -/* OBSOLETE perror_with_name (filename); */ -/* OBSOLETE /* 4.2-style (and perhaps also sysV-style) core dump file. *x/ */ -/* OBSOLETE { */ -/* OBSOLETE struct user u; */ -/* OBSOLETE */ -/* OBSOLETE unsigned int reg_offset, fp_reg_offset; */ -/* OBSOLETE */ -/* OBSOLETE val = myread (corechan, &u, sizeof u); */ -/* OBSOLETE if (val < 0) */ -/* OBSOLETE perror_with_name ("Not a core file: reading upage"); */ -/* OBSOLETE if (val != sizeof u) */ -/* OBSOLETE error ("Not a core file: could only read %d bytes", val); */ -/* OBSOLETE */ -/* OBSOLETE /* We are depending on exec_file_command having been called */ -/* OBSOLETE previously to set exec_data_start. Since the executable */ -/* OBSOLETE and the core file share the same text segment, the address */ -/* OBSOLETE of the data segment will be the same in both. *x/ */ -/* OBSOLETE data_start = exec_data_start; */ -/* OBSOLETE */ -/* OBSOLETE data_end = data_start + NBPG * u.u_dsize; */ -/* OBSOLETE stack_start = stack_end - NBPG * u.u_ssize; */ -/* OBSOLETE data_offset = NBPG * UPAGES; */ -/* OBSOLETE stack_offset = NBPG * (UPAGES + u.u_dsize); */ -/* OBSOLETE */ -/* OBSOLETE /* Some machines put an absolute address in here and some put */ -/* OBSOLETE the offset in the upage of the regs. *x/ */ -/* OBSOLETE reg_offset = (int) u.u_ar0; */ -/* OBSOLETE if (reg_offset > NBPG * UPAGES) */ -/* OBSOLETE reg_offset -= KERNEL_U_ADDR; */ -/* OBSOLETE fp_reg_offset = (char *) &u.u_fp_regs - (char *) &u; */ -/* OBSOLETE */ -/* OBSOLETE /* I don't know where to find this info. */ -/* OBSOLETE So, for now, mark it as not available. *x/ */ -/* OBSOLETE N_SET_MAGIC (core_aouthdr, 0); */ -/* OBSOLETE */ -/* OBSOLETE /* Read the register values out of the core file and store */ -/* OBSOLETE them where `read_register' will find them. *x/ */ -/* OBSOLETE */ -/* OBSOLETE { */ -/* OBSOLETE register int regno; */ -/* OBSOLETE */ -/* OBSOLETE for (regno = 0; regno < NUM_REGS; regno++) */ -/* OBSOLETE { */ -/* OBSOLETE char buf[MAX_REGISTER_RAW_SIZE]; */ -/* OBSOLETE */ -/* OBSOLETE if (regno < 16) */ -/* OBSOLETE val = lseek (corechan, reg_offset + 4 * regno, 0); */ -/* OBSOLETE else if (regno < 24) */ -/* OBSOLETE val = lseek (corechan, fp_reg_offset + 4 + 12 * (regno - 24), 0); */ -/* OBSOLETE else if (regno == 24) */ -/* OBSOLETE val = lseek (corechan, fp_reg_offset, 0); */ -/* OBSOLETE else if (regno == 25) */ -/* OBSOLETE val = lseek (corechan, reg_offset + 4 * PC, 0); */ -/* OBSOLETE if (val < 0 */ -/* OBSOLETE || (val = myread (corechan, buf, sizeof buf)) < 0) */ -/* OBSOLETE { */ -/* OBSOLETE char *buffer = (char *) alloca (strlen (REGISTER_NAME (regno)) */ -/* OBSOLETE + 30); */ -/* OBSOLETE strcpy (buffer, "Reading register "); */ -/* OBSOLETE strcat (buffer, REGISTER_NAME (regno)); */ -/* OBSOLETE */ -/* OBSOLETE perror_with_name (buffer); */ -/* OBSOLETE } */ -/* OBSOLETE */ -/* OBSOLETE if (regno == PC_REGNUM) */ -/* OBSOLETE *(int *) buf = GET_PC_PART (*(int *) buf); */ -/* OBSOLETE supply_register (regno, buf); */ -/* OBSOLETE } */ -/* OBSOLETE } */ -/* OBSOLETE } */ -/* OBSOLETE if (filename[0] == '/') */ -/* OBSOLETE corefile = savestring (filename, strlen (filename)); */ -/* OBSOLETE else */ -/* OBSOLETE { */ -/* OBSOLETE corefile = concat (current_directory, "/", filename, NULL); */ -/* OBSOLETE } */ -/* OBSOLETE */ -/* OBSOLETE flush_cached_frames (); */ -/* OBSOLETE select_frame (get_current_frame (), 0); */ -/* OBSOLETE validate_files (); */ -/* OBSOLETE } */ -/* OBSOLETE else if (from_tty) */ -/* OBSOLETE printf ("No core file now.\n"); */ -/* OBSOLETE } */ -/* OBSOLETE */ -/* OBSOLETE #if 0 */ -/* OBSOLETE /* Work with core dump and executable files, for GDB. */ -/* OBSOLETE This code would be in corefile.c if it weren't machine-dependent. *x/ */ -/* OBSOLETE */ -/* OBSOLETE /* Structure to describe the chain of shared libraries used */ -/* OBSOLETE by the execfile. */ -/* OBSOLETE e.g. prog shares Xt which shares X11 which shares c. *x/ */ -/* OBSOLETE */ -/* OBSOLETE struct shared_library */ -/* OBSOLETE { */ -/* OBSOLETE struct exec_header header; */ -/* OBSOLETE char name[SHLIBLEN]; */ -/* OBSOLETE CORE_ADDR text_start; /* CORE_ADDR of 1st byte of text, this file *x/ */ -/* OBSOLETE long data_offset; /* offset of data section in file *x/ */ -/* OBSOLETE int chan; /* file descriptor for the file *x/ */ -/* OBSOLETE struct shared_library *shares; /* library this one shares *x/ */ -/* OBSOLETE }; */ -/* OBSOLETE static struct shared_library *shlib = 0; */ -/* OBSOLETE */ -/* OBSOLETE /* Hook for `exec_file_command' command to call. *x/ */ -/* OBSOLETE */ -/* OBSOLETE extern void (*exec_file_display_hook) (); */ -/* OBSOLETE */ -/* OBSOLETE static CORE_ADDR unshared_text_start; */ -/* OBSOLETE */ -/* OBSOLETE /* extended header from exec file (for shared library info) *x/ */ -/* OBSOLETE */ -/* OBSOLETE static struct exec_header exec_header; */ -/* OBSOLETE */ -/* OBSOLETE void */ -/* OBSOLETE exec_file_command (filename, from_tty) */ -/* OBSOLETE char *filename; */ -/* OBSOLETE int from_tty; */ -/* OBSOLETE { */ -/* OBSOLETE int val; */ -/* OBSOLETE */ -/* OBSOLETE /* Eliminate all traces of old exec file. */ -/* OBSOLETE Mark text segment as empty. *x/ */ -/* OBSOLETE */ -/* OBSOLETE if (execfile) */ -/* OBSOLETE free (execfile); */ -/* OBSOLETE execfile = 0; */ -/* OBSOLETE data_start = 0; */ -/* OBSOLETE data_end -= exec_data_start; */ -/* OBSOLETE text_start = 0; */ -/* OBSOLETE unshared_text_start = 0; */ -/* OBSOLETE text_end = 0; */ -/* OBSOLETE exec_data_start = 0; */ -/* OBSOLETE exec_data_end = 0; */ -/* OBSOLETE if (execchan >= 0) */ -/* OBSOLETE close (execchan); */ -/* OBSOLETE execchan = -1; */ -/* OBSOLETE if (shlib) */ -/* OBSOLETE { */ -/* OBSOLETE close_shared_library (shlib); */ -/* OBSOLETE shlib = 0; */ -/* OBSOLETE } */ -/* OBSOLETE */ -/* OBSOLETE /* Now open and digest the file the user requested, if any. *x/ */ -/* OBSOLETE */ -/* OBSOLETE if (filename) */ -/* OBSOLETE { */ -/* OBSOLETE filename = tilde_expand (filename); */ -/* OBSOLETE make_cleanup (free, filename); */ -/* OBSOLETE */ -/* OBSOLETE execchan = openp (getenv ("PATH"), 1, filename, O_RDONLY, 0, */ -/* OBSOLETE &execfile); */ -/* OBSOLETE if (execchan < 0) */ -/* OBSOLETE perror_with_name (filename); */ -/* OBSOLETE */ -/* OBSOLETE { */ -/* OBSOLETE struct stat st_exec; */ -/* OBSOLETE */ -/* OBSOLETE #ifdef HEADER_SEEK_FD */ -/* OBSOLETE HEADER_SEEK_FD (execchan); */ -/* OBSOLETE #endif */ -/* OBSOLETE */ -/* OBSOLETE val = myread (execchan, &exec_header, sizeof exec_header); */ -/* OBSOLETE exec_aouthdr = exec_header.a_exec; */ -/* OBSOLETE */ -/* OBSOLETE if (val < 0) */ -/* OBSOLETE perror_with_name (filename); */ -/* OBSOLETE */ -/* OBSOLETE text_start = 0x8000; */ -/* OBSOLETE */ -/* OBSOLETE /* Look for shared library if needed *x/ */ -/* OBSOLETE if (exec_header.a_exec.a_magic & MF_USES_SL) */ -/* OBSOLETE shlib = open_shared_library (exec_header.a_shlibname, text_start); */ -/* OBSOLETE */ -/* OBSOLETE text_offset = N_TXTOFF (exec_aouthdr); */ -/* OBSOLETE exec_data_offset = N_TXTOFF (exec_aouthdr) + exec_aouthdr.a_text; */ -/* OBSOLETE */ -/* OBSOLETE if (shlib) */ -/* OBSOLETE { */ -/* OBSOLETE unshared_text_start = shared_text_end (shlib) & ~0x7fff; */ -/* OBSOLETE stack_start = shlib->header.a_exec.a_sldatabase; */ -/* OBSOLETE stack_end = STACK_END_ADDR; */ -/* OBSOLETE } */ -/* OBSOLETE else */ -/* OBSOLETE unshared_text_start = 0x8000; */ -/* OBSOLETE text_end = unshared_text_start + exec_aouthdr.a_text; */ -/* OBSOLETE */ -/* OBSOLETE exec_data_start = unshared_text_start + exec_aouthdr.a_text; */ -/* OBSOLETE exec_data_end = exec_data_start + exec_aouthdr.a_data; */ -/* OBSOLETE */ -/* OBSOLETE data_start = exec_data_start; */ -/* OBSOLETE data_end += exec_data_start; */ -/* OBSOLETE */ -/* OBSOLETE fstat (execchan, &st_exec); */ -/* OBSOLETE exec_mtime = st_exec.st_mtime; */ -/* OBSOLETE } */ -/* OBSOLETE */ -/* OBSOLETE validate_files (); */ -/* OBSOLETE } */ -/* OBSOLETE else if (from_tty) */ -/* OBSOLETE printf ("No executable file now.\n"); */ -/* OBSOLETE */ -/* OBSOLETE /* Tell display code (if any) about the changed file name. *x/ */ -/* OBSOLETE if (exec_file_display_hook) */ -/* OBSOLETE (*exec_file_display_hook) (filename); */ -/* OBSOLETE } */ -/* OBSOLETE #endif */ -/* OBSOLETE */ -/* OBSOLETE #if 0 */ -/* OBSOLETE /* Read from the program's memory (except for inferior processes). */ -/* OBSOLETE This function is misnamed, since it only reads, never writes; and */ -/* OBSOLETE since it will use the core file and/or executable file as necessary. */ -/* OBSOLETE */ -/* OBSOLETE It should be extended to write as well as read, FIXME, for patching files. */ -/* OBSOLETE */ -/* OBSOLETE Return 0 if address could be read, EIO if addresss out of bounds. *x/ */ -/* OBSOLETE */ -/* OBSOLETE int */ -/* OBSOLETE xfer_core_file (memaddr, myaddr, len) */ -/* OBSOLETE CORE_ADDR memaddr; */ -/* OBSOLETE char *myaddr; */ -/* OBSOLETE int len; */ -/* OBSOLETE { */ -/* OBSOLETE register int i; */ -/* OBSOLETE register int val; */ -/* OBSOLETE int xferchan; */ -/* OBSOLETE char **xferfile; */ -/* OBSOLETE int fileptr; */ -/* OBSOLETE int returnval = 0; */ -/* OBSOLETE */ -/* OBSOLETE while (len > 0) */ -/* OBSOLETE { */ -/* OBSOLETE xferfile = 0; */ -/* OBSOLETE xferchan = 0; */ -/* OBSOLETE */ -/* OBSOLETE /* Determine which file the next bunch of addresses reside in, */ -/* OBSOLETE and where in the file. Set the file's read/write pointer */ -/* OBSOLETE to point at the proper place for the desired address */ -/* OBSOLETE and set xferfile and xferchan for the correct file. */ -/* OBSOLETE */ -/* OBSOLETE If desired address is nonexistent, leave them zero. */ -/* OBSOLETE */ -/* OBSOLETE i is set to the number of bytes that can be handled */ -/* OBSOLETE along with the next address. */ -/* OBSOLETE */ -/* OBSOLETE We put the most likely tests first for efficiency. *x/ */ -/* OBSOLETE */ -/* OBSOLETE /* Note that if there is no core file */ -/* OBSOLETE data_start and data_end are equal. *x/ */ -/* OBSOLETE if (memaddr >= data_start && memaddr < data_end) */ -/* OBSOLETE { */ -/* OBSOLETE i = min (len, data_end - memaddr); */ -/* OBSOLETE fileptr = memaddr - data_start + data_offset; */ -/* OBSOLETE xferfile = &corefile; */ -/* OBSOLETE xferchan = corechan; */ -/* OBSOLETE } */ -/* OBSOLETE /* Note that if there is no core file */ -/* OBSOLETE stack_start and stack_end define the shared library data. *x/ */ -/* OBSOLETE else if (memaddr >= stack_start && memaddr < stack_end) */ -/* OBSOLETE { */ -/* OBSOLETE if (corechan < 0) */ -/* OBSOLETE { */ -/* OBSOLETE struct shared_library *lib; */ -/* OBSOLETE for (lib = shlib; lib; lib = lib->shares) */ -/* OBSOLETE if (memaddr >= lib->header.a_exec.a_sldatabase && */ -/* OBSOLETE memaddr < lib->header.a_exec.a_sldatabase + */ -/* OBSOLETE lib->header.a_exec.a_data) */ -/* OBSOLETE break; */ -/* OBSOLETE if (lib) */ -/* OBSOLETE { */ -/* OBSOLETE i = min (len, lib->header.a_exec.a_sldatabase + */ -/* OBSOLETE lib->header.a_exec.a_data - memaddr); */ -/* OBSOLETE fileptr = lib->data_offset + memaddr - */ -/* OBSOLETE lib->header.a_exec.a_sldatabase; */ -/* OBSOLETE xferfile = execfile; */ -/* OBSOLETE xferchan = lib->chan; */ -/* OBSOLETE } */ -/* OBSOLETE } */ -/* OBSOLETE else */ -/* OBSOLETE { */ -/* OBSOLETE i = min (len, stack_end - memaddr); */ -/* OBSOLETE fileptr = memaddr - stack_start + stack_offset; */ -/* OBSOLETE xferfile = &corefile; */ -/* OBSOLETE xferchan = corechan; */ -/* OBSOLETE } */ -/* OBSOLETE } */ -/* OBSOLETE else if (corechan < 0 */ -/* OBSOLETE && memaddr >= exec_data_start && memaddr < exec_data_end) */ -/* OBSOLETE { */ -/* OBSOLETE i = min (len, exec_data_end - memaddr); */ -/* OBSOLETE fileptr = memaddr - exec_data_start + exec_data_offset; */ -/* OBSOLETE xferfile = &execfile; */ -/* OBSOLETE xferchan = execchan; */ -/* OBSOLETE } */ -/* OBSOLETE else if (memaddr >= text_start && memaddr < text_end) */ -/* OBSOLETE { */ -/* OBSOLETE struct shared_library *lib; */ -/* OBSOLETE for (lib = shlib; lib; lib = lib->shares) */ -/* OBSOLETE if (memaddr >= lib->text_start && */ -/* OBSOLETE memaddr < lib->text_start + lib->header.a_exec.a_text) */ -/* OBSOLETE break; */ -/* OBSOLETE if (lib) */ -/* OBSOLETE { */ -/* OBSOLETE i = min (len, lib->header.a_exec.a_text + */ -/* OBSOLETE lib->text_start - memaddr); */ -/* OBSOLETE fileptr = memaddr - lib->text_start + text_offset; */ -/* OBSOLETE xferfile = &execfile; */ -/* OBSOLETE xferchan = lib->chan; */ -/* OBSOLETE } */ -/* OBSOLETE else */ -/* OBSOLETE { */ -/* OBSOLETE i = min (len, text_end - memaddr); */ -/* OBSOLETE fileptr = memaddr - unshared_text_start + text_offset; */ -/* OBSOLETE xferfile = &execfile; */ -/* OBSOLETE xferchan = execchan; */ -/* OBSOLETE } */ -/* OBSOLETE } */ -/* OBSOLETE else if (memaddr < text_start) */ -/* OBSOLETE { */ -/* OBSOLETE i = min (len, text_start - memaddr); */ -/* OBSOLETE } */ -/* OBSOLETE else if (memaddr >= text_end */ -/* OBSOLETE && memaddr < (corechan >= 0 ? data_start : exec_data_start)) */ -/* OBSOLETE { */ -/* OBSOLETE i = min (len, data_start - memaddr); */ -/* OBSOLETE } */ -/* OBSOLETE else if (corechan >= 0 */ -/* OBSOLETE && memaddr >= data_end && memaddr < stack_start) */ -/* OBSOLETE { */ -/* OBSOLETE i = min (len, stack_start - memaddr); */ -/* OBSOLETE } */ -/* OBSOLETE else if (corechan < 0 && memaddr >= exec_data_end) */ -/* OBSOLETE { */ -/* OBSOLETE i = min (len, -memaddr); */ -/* OBSOLETE } */ -/* OBSOLETE else if (memaddr >= stack_end && stack_end != 0) */ -/* OBSOLETE { */ -/* OBSOLETE i = min (len, -memaddr); */ -/* OBSOLETE } */ -/* OBSOLETE else */ -/* OBSOLETE { */ -/* OBSOLETE /* Address did not classify into one of the known ranges. */ -/* OBSOLETE This shouldn't happen; we catch the endpoints. *x/ */ -/* OBSOLETE internal_error ("Bad case logic in xfer_core_file."); */ -/* OBSOLETE } */ -/* OBSOLETE */ -/* OBSOLETE /* Now we know which file to use. */ -/* OBSOLETE Set up its pointer and transfer the data. *x/ */ -/* OBSOLETE if (xferfile) */ -/* OBSOLETE { */ -/* OBSOLETE if (*xferfile == 0) */ -/* OBSOLETE if (xferfile == &execfile) */ -/* OBSOLETE error ("No program file to examine."); */ -/* OBSOLETE else */ -/* OBSOLETE error ("No core dump file or running program to examine."); */ -/* OBSOLETE val = lseek (xferchan, fileptr, 0); */ -/* OBSOLETE if (val < 0) */ -/* OBSOLETE perror_with_name (*xferfile); */ -/* OBSOLETE val = myread (xferchan, myaddr, i); */ -/* OBSOLETE if (val < 0) */ -/* OBSOLETE perror_with_name (*xferfile); */ -/* OBSOLETE } */ -/* OBSOLETE /* If this address is for nonexistent memory, */ -/* OBSOLETE read zeros if reading, or do nothing if writing. */ -/* OBSOLETE Actually, we never right. *x/ */ -/* OBSOLETE else */ -/* OBSOLETE { */ -/* OBSOLETE memset (myaddr, '\0', i); */ -/* OBSOLETE returnval = EIO; */ -/* OBSOLETE } */ -/* OBSOLETE */ -/* OBSOLETE memaddr += i; */ -/* OBSOLETE myaddr += i; */ -/* OBSOLETE len -= i; */ -/* OBSOLETE } */ -/* OBSOLETE return returnval; */ -/* OBSOLETE } */ -/* OBSOLETE #endif */ diff --git a/contrib/gdb/gdb/c-exp.tab.c b/contrib/gdb/gdb/c-exp.tab.c deleted file mode 100644 index 46ff4363d0ee7..0000000000000 --- a/contrib/gdb/gdb/c-exp.tab.c +++ /dev/null @@ -1,2865 +0,0 @@ - -/* A Bison parser, made from c-exp.y - by GNU Bison version 1.27 - */ - -#define YYBISON 1 /* Identify Bison output. */ - -#define INT 257 -#define FLOAT 258 -#define STRING 259 -#define NAME 260 -#define TYPENAME 261 -#define NAME_OR_INT 262 -#define STRUCT 263 -#define CLASS 264 -#define UNION 265 -#define ENUM 266 -#define SIZEOF 267 -#define UNSIGNED 268 -#define COLONCOLON 269 -#define TEMPLATE 270 -#define ERROR 271 -#define SIGNED_KEYWORD 272 -#define LONG 273 -#define SHORT 274 -#define INT_KEYWORD 275 -#define CONST_KEYWORD 276 -#define VOLATILE_KEYWORD 277 -#define DOUBLE_KEYWORD 278 -#define VARIABLE 279 -#define ASSIGN_MODIFY 280 -#define THIS 281 -#define TRUEKEYWORD 282 -#define FALSEKEYWORD 283 -#define ABOVE_COMMA 284 -#define OROR 285 -#define ANDAND 286 -#define EQUAL 287 -#define NOTEQUAL 288 -#define LEQ 289 -#define GEQ 290 -#define LSH 291 -#define RSH 292 -#define UNARY 293 -#define INCREMENT 294 -#define DECREMENT 295 -#define ARROW 296 -#define BLOCKNAME 297 -#define FILENAME 298 - -#line 38 "c-exp.y" - - -#include "defs.h" -#include "gdb_string.h" -#include <ctype.h> -#include "expression.h" -#include "value.h" -#include "parser-defs.h" -#include "language.h" -#include "c-lang.h" -#include "bfd.h" /* Required by objfiles.h. */ -#include "symfile.h" /* Required by objfiles.h. */ -#include "objfiles.h" /* For have_full_symbols and have_partial_symbols */ - -/* Flag indicating we're dealing with HP-compiled objects */ -extern int hp_som_som_object_present; - -/* Remap normal yacc parser interface names (yyparse, yylex, yyerror, etc), - as well as gratuitiously global symbol names, so we can have multiple - yacc generated parsers in gdb. Note that these are only the variables - produced by yacc. If other parser generators (bison, byacc, etc) produce - additional global names that conflict at link time, then those parser - generators need to be fixed instead of adding those names to this list. */ - -#define yymaxdepth c_maxdepth -#define yyparse c_parse -#define yylex c_lex -#define yyerror c_error -#define yylval c_lval -#define yychar c_char -#define yydebug c_debug -#define yypact c_pact -#define yyr1 c_r1 -#define yyr2 c_r2 -#define yydef c_def -#define yychk c_chk -#define yypgo c_pgo -#define yyact c_act -#define yyexca c_exca -#define yyerrflag c_errflag -#define yynerrs c_nerrs -#define yyps c_ps -#define yypv c_pv -#define yys c_s -#define yy_yys c_yys -#define yystate c_state -#define yytmp c_tmp -#define yyv c_v -#define yy_yyv c_yyv -#define yyval c_val -#define yylloc c_lloc -#define yyreds c_reds /* With YYDEBUG defined */ -#define yytoks c_toks /* With YYDEBUG defined */ -#define yylhs c_yylhs -#define yylen c_yylen -#define yydefred c_yydefred -#define yydgoto c_yydgoto -#define yysindex c_yysindex -#define yyrindex c_yyrindex -#define yygindex c_yygindex -#define yytable c_yytable -#define yycheck c_yycheck - -#ifndef YYDEBUG -#define YYDEBUG 0 /* Default to no yydebug support */ -#endif - -int -yyparse PARAMS ((void)); - -static int -yylex PARAMS ((void)); - -void -yyerror PARAMS ((char *)); - - -#line 120 "c-exp.y" -typedef union - { - LONGEST lval; - struct { - LONGEST val; - struct type *type; - } typed_val_int; - struct { - DOUBLEST dval; - struct type *type; - } typed_val_float; - struct symbol *sym; - struct type *tval; - struct stoken sval; - struct ttype tsym; - struct symtoken ssym; - int voidval; - struct block *bval; - enum exp_opcode opcode; - struct internalvar *ivar; - - struct type **tvec; - int *ivec; - } YYSTYPE; -#line 145 "c-exp.y" - -/* YYSTYPE gets defined by %union */ -static int -parse_number PARAMS ((char *, int, int, YYSTYPE *)); -#include <stdio.h> - -#ifndef __cplusplus -#ifndef __STDC__ -#define const -#endif -#endif - - - -#define YYFINAL 214 -#define YYFLAG -32768 -#define YYNTBASE 69 - -#define YYTRANSLATE(x) ((unsigned)(x) <= 298 ? yytranslate[x] : 91) - -static const char yytranslate[] = { 0, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 62, 2, 2, 2, 52, 38, 2, 59, - 65, 50, 48, 30, 49, 57, 51, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 68, 2, 41, - 32, 42, 33, 47, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 58, 2, 64, 37, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 66, 36, 67, 63, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 1, 3, 4, 5, 6, - 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, - 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, - 27, 28, 29, 31, 34, 35, 39, 40, 43, 44, - 45, 46, 53, 54, 55, 56, 60, 61 -}; - -#if YYDEBUG != 0 -static const short yyprhs[] = { 0, - 0, 2, 4, 6, 8, 12, 15, 18, 21, 24, - 27, 30, 33, 36, 39, 42, 46, 50, 55, 59, - 63, 68, 73, 74, 80, 82, 83, 85, 89, 91, - 95, 100, 105, 109, 113, 117, 121, 125, 129, 133, - 137, 141, 145, 149, 153, 157, 161, 165, 169, 173, - 177, 181, 185, 191, 195, 199, 201, 203, 205, 207, - 209, 214, 216, 218, 220, 222, 224, 226, 230, 234, - 238, 243, 245, 248, 250, 252, 255, 258, 261, 265, - 269, 271, 274, 276, 279, 281, 285, 288, 290, 293, - 295, 298, 302, 305, 309, 311, 315, 317, 319, 321, - 323, 326, 330, 333, 337, 341, 346, 349, 353, 355, - 358, 361, 364, 367, 370, 373, 375, 378, 380, 386, - 389, 392, 394, 396, 398, 400, 402, 406, 408, 410, - 412, 414, 416 -}; - -static const short yyrhs[] = { 71, - 0, 70, 0, 85, 0, 72, 0, 71, 30, 72, - 0, 50, 72, 0, 38, 72, 0, 49, 72, 0, - 62, 72, 0, 63, 72, 0, 54, 72, 0, 55, - 72, 0, 72, 54, 0, 72, 55, 0, 13, 72, - 0, 72, 56, 89, 0, 72, 56, 79, 0, 72, - 56, 50, 72, 0, 72, 57, 89, 0, 72, 57, - 79, 0, 72, 57, 50, 72, 0, 72, 58, 71, - 64, 0, 0, 72, 59, 73, 75, 65, 0, 66, - 0, 0, 72, 0, 75, 30, 72, 0, 67, 0, - 74, 75, 76, 0, 74, 85, 76, 72, 0, 59, - 85, 65, 72, 0, 59, 71, 65, 0, 72, 47, - 72, 0, 72, 50, 72, 0, 72, 51, 72, 0, - 72, 52, 72, 0, 72, 48, 72, 0, 72, 49, - 72, 0, 72, 45, 72, 0, 72, 46, 72, 0, - 72, 39, 72, 0, 72, 40, 72, 0, 72, 43, - 72, 0, 72, 44, 72, 0, 72, 41, 72, 0, - 72, 42, 72, 0, 72, 38, 72, 0, 72, 37, - 72, 0, 72, 36, 72, 0, 72, 35, 72, 0, - 72, 34, 72, 0, 72, 33, 72, 68, 72, 0, - 72, 32, 72, 0, 72, 26, 72, 0, 3, 0, - 8, 0, 4, 0, 78, 0, 25, 0, 13, 59, - 85, 65, 0, 5, 0, 27, 0, 28, 0, 29, - 0, 60, 0, 61, 0, 77, 15, 89, 0, 77, - 15, 89, 0, 86, 15, 89, 0, 86, 15, 63, - 89, 0, 79, 0, 15, 89, 0, 90, 0, 86, - 0, 86, 22, 0, 86, 23, 0, 86, 81, 0, - 86, 22, 81, 0, 86, 23, 81, 0, 50, 0, - 50, 81, 0, 38, 0, 38, 81, 0, 82, 0, - 59, 81, 65, 0, 82, 83, 0, 83, 0, 82, - 84, 0, 84, 0, 58, 64, 0, 58, 3, 64, - 0, 59, 65, 0, 59, 88, 65, 0, 80, 0, - 86, 15, 50, 0, 7, 0, 21, 0, 19, 0, - 20, 0, 19, 21, 0, 14, 19, 21, 0, 19, - 19, 0, 19, 19, 21, 0, 14, 19, 19, 0, - 14, 19, 19, 21, 0, 20, 21, 0, 14, 20, - 21, 0, 24, 0, 19, 24, 0, 9, 89, 0, - 10, 89, 0, 11, 89, 0, 12, 89, 0, 14, - 87, 0, 14, 0, 18, 87, 0, 18, 0, 16, - 89, 41, 85, 42, 0, 22, 86, 0, 23, 86, - 0, 7, 0, 21, 0, 19, 0, 20, 0, 85, - 0, 88, 30, 85, 0, 6, 0, 60, 0, 7, - 0, 8, 0, 6, 0, 60, 0 -}; - -#endif - -#if YYDEBUG != 0 -static const short yyrline[] = { 0, - 230, 231, 234, 241, 242, 247, 250, 253, 257, 261, - 265, 269, 273, 277, 281, 285, 291, 299, 303, 309, - 317, 321, 325, 329, 335, 339, 342, 346, 350, 353, - 360, 366, 372, 378, 382, 386, 390, 394, 398, 402, - 406, 410, 414, 418, 422, 426, 430, 434, 438, 442, - 446, 450, 454, 458, 462, 468, 475, 486, 493, 496, - 500, 508, 533, 538, 545, 554, 562, 568, 579, 595, - 608, 632, 633, 667, 725, 731, 732, 733, 735, 737, - 741, 743, 745, 747, 749, 752, 754, 759, 766, 768, - 772, 774, 778, 780, 792, 793, 798, 800, 802, 804, - 806, 808, 810, 812, 814, 816, 818, 820, 822, 824, - 826, 829, 832, 835, 838, 840, 842, 844, 849, 856, - 857, 860, 861, 867, 873, 882, 887, 894, 895, 896, - 897, 900, 901 -}; -#endif - - -#if YYDEBUG != 0 || defined (YYERROR_VERBOSE) - -static const char * const yytname[] = { "$","error","$undefined.","INT","FLOAT", -"STRING","NAME","TYPENAME","NAME_OR_INT","STRUCT","CLASS","UNION","ENUM","SIZEOF", -"UNSIGNED","COLONCOLON","TEMPLATE","ERROR","SIGNED_KEYWORD","LONG","SHORT","INT_KEYWORD", -"CONST_KEYWORD","VOLATILE_KEYWORD","DOUBLE_KEYWORD","VARIABLE","ASSIGN_MODIFY", -"THIS","TRUEKEYWORD","FALSEKEYWORD","','","ABOVE_COMMA","'='","'?'","OROR","ANDAND", -"'|'","'^'","'&'","EQUAL","NOTEQUAL","'<'","'>'","LEQ","GEQ","LSH","RSH","'@'", -"'+'","'-'","'*'","'/'","'%'","UNARY","INCREMENT","DECREMENT","ARROW","'.'", -"'['","'('","BLOCKNAME","FILENAME","'!'","'~'","']'","')'","'{'","'}'","':'", -"start","type_exp","exp1","exp","@1","lcurly","arglist","rcurly","block","variable", -"qualified_name","ptype","abs_decl","direct_abs_decl","array_mod","func_mod", -"type","typebase","typename","nonempty_typelist","name","name_not_typename", NULL -}; -#endif - -static const short yyr1[] = { 0, - 69, 69, 70, 71, 71, 72, 72, 72, 72, 72, - 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, - 72, 72, 73, 72, 74, 75, 75, 75, 76, 72, - 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, - 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, - 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, - 72, 72, 72, 72, 72, 77, 77, 77, 78, 79, - 79, 78, 78, 78, 80, 80, 80, 80, 80, 80, - 81, 81, 81, 81, 81, 82, 82, 82, 82, 82, - 83, 83, 84, 84, 85, 85, 86, 86, 86, 86, - 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, - 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, - 86, 87, 87, 87, 87, 88, 88, 89, 89, 89, - 89, 90, 90 -}; - -static const short yyr2[] = { 0, - 1, 1, 1, 1, 3, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 3, 3, 4, 3, 3, - 4, 4, 0, 5, 1, 0, 1, 3, 1, 3, - 4, 4, 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 5, 3, 3, 1, 1, 1, 1, 1, - 4, 1, 1, 1, 1, 1, 1, 3, 3, 3, - 4, 1, 2, 1, 1, 2, 2, 2, 3, 3, - 1, 2, 1, 2, 1, 3, 2, 1, 2, 1, - 2, 3, 2, 3, 1, 3, 1, 1, 1, 1, - 2, 3, 2, 3, 3, 4, 2, 3, 1, 2, - 2, 2, 2, 2, 2, 1, 2, 1, 5, 2, - 2, 1, 1, 1, 1, 1, 3, 1, 1, 1, - 1, 1, 1 -}; - -static const short yydefact[] = { 0, - 56, 58, 62, 132, 97, 57, 0, 0, 0, 0, - 0, 116, 0, 0, 118, 99, 100, 98, 0, 0, - 109, 60, 63, 64, 65, 0, 0, 0, 0, 0, - 0, 133, 67, 0, 0, 25, 2, 1, 4, 26, - 0, 59, 72, 95, 3, 75, 74, 128, 130, 131, - 129, 111, 112, 113, 114, 0, 15, 0, 122, 124, - 125, 123, 115, 73, 0, 124, 125, 117, 103, 101, - 110, 107, 120, 121, 7, 8, 6, 11, 12, 0, - 0, 9, 10, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 13, 14, 0, 0, - 0, 23, 27, 0, 0, 0, 0, 76, 77, 83, - 81, 0, 0, 78, 85, 88, 90, 0, 0, 105, - 102, 108, 0, 104, 33, 0, 5, 55, 54, 0, - 52, 51, 50, 49, 48, 42, 43, 46, 47, 44, - 45, 40, 41, 34, 38, 39, 35, 36, 37, 130, - 0, 17, 16, 0, 20, 19, 0, 26, 0, 29, - 30, 0, 69, 96, 0, 70, 79, 80, 84, 82, - 0, 91, 93, 0, 126, 75, 0, 0, 87, 89, - 61, 106, 0, 32, 0, 18, 21, 22, 0, 28, - 31, 71, 92, 86, 0, 0, 94, 119, 53, 24, - 127, 0, 0, 0 -}; - -static const short yydefgoto[] = { 212, - 37, 80, 39, 168, 40, 114, 171, 41, 42, 43, - 44, 124, 125, 126, 127, 185, 58, 63, 187, 176, - 47 -}; - -static const short yypact[] = { 205, --32768,-32768,-32768,-32768,-32768,-32768, 46, 46, 46, 46, - 269, 57, 46, 46, 100, 134, -14,-32768, 228, 228, --32768,-32768,-32768,-32768,-32768, 205, 205, 205, 205, 205, - 205, 21,-32768, 205, 205,-32768,-32768, -16, 504, 205, - 22,-32768,-32768,-32768,-32768, 107,-32768,-32768,-32768,-32768, --32768,-32768,-32768,-32768,-32768, 205, 14, 23,-32768, 7, - 24,-32768,-32768,-32768, 10,-32768,-32768,-32768, 34,-32768, --32768,-32768,-32768,-32768, 14, 14, 14, 14, 14, -26, - -21, 14, 14, 205, 205, 205, 205, 205, 205, 205, - 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, - 205, 205, 205, 205, 205, 205,-32768,-32768, 419, 438, - 205,-32768, 504, -25, -2, 46, 53, 8, 8, 8, - 8, -1, 359,-32768, -41,-32768,-32768, 9, 42, 54, --32768,-32768, 228,-32768,-32768, 205, 504, 504, 504, 467, - 556, 580, 603, 625, 646, 665, 665, 254, 254, 254, - 254, 124, 124, 356, 416, 416, 14, 14, 14, 89, - 205,-32768,-32768, 205,-32768,-32768, -17, 205, 205,-32768, --32768, 205, 93,-32768, 46,-32768,-32768,-32768,-32768,-32768, - 45,-32768,-32768, 50,-32768, 146, -22, 128,-32768,-32768, - 333,-32768, 68, 14, 205, 14, 14,-32768, -3, 504, - 14,-32768,-32768,-32768, 67, 228,-32768,-32768, 531,-32768, --32768, 125, 126,-32768 -}; - -static const short yypgoto[] = {-32768, --32768, 3, -5,-32768,-32768, -44, 12,-32768,-32768, -76, --32768, 79,-32768, 11, 16, 1, 0, 113,-32768, 2, --32768 -}; - - -#define YYLAST 724 - - -static const short yytable[] = { 46, - 45, 181, 38, 84, 169, 57, 72, 206, 52, 53, - 54, 55, 84, 84, 64, 65, 122, 188, 73, 74, - 75, 76, 77, 78, 79, 130, 169, 131, 82, 83, - 46, 81, 162, 165, 113, -66, 116, 129, 135, 46, - 115, 170, 207, 136, 132, 120, 198, 48, 49, 50, - 133, 48, 49, 50, 134, 46, 128, 121, 48, 49, - 50, 210, 182, 59, 170, 122, 123, 107, 108, 109, - 110, 111, 112, 191, 192, 60, 61, 62, 137, 138, - 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, - 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, - 159, 51, 174, -97, 175, 51, 59, -68, 203, 208, - 163, 166, 51, 167, 204, 175, 174, 173, 66, 67, - 62, 117, 186, 199, 213, 214, 172, 68, 118, 119, - 194, 0, 186, 193, 5, 189, 7, 8, 9, 10, - 190, 12, 0, 14, 120, 15, 16, 17, 18, 19, - 20, 21, 69, 0, 70, 196, 121, 71, 197, 0, - 205, 0, 113, 200, 122, 123, 201, 118, 119, 0, - 101, 102, 103, 104, 105, 106, 202, 107, 108, 109, - 110, 111, 112, 120, 0, 194, 0, 186, 0, 209, - 0, 0, 183, 0, 0, 121, 177, 178, 179, 180, - 0, 184, 0, 122, 123, 186, 211, 1, 2, 3, - 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, - 14, 0, 15, 16, 17, 18, 19, 20, 21, 22, - 0, 23, 24, 25, 5, 0, 7, 8, 9, 10, - 0, 12, 26, 14, 0, 15, 16, 17, 18, 19, - 20, 21, 0, 27, 28, 0, 0, 0, 29, 30, - 0, 0, 0, 31, 32, 33, 34, 35, 0, 0, - 36, 1, 2, 3, 4, 5, 6, 7, 8, 9, - 10, 11, 12, 13, 14, 0, 15, 16, 17, 18, - 19, 20, 21, 22, 0, 23, 24, 25, 99, 100, - 101, 102, 103, 104, 105, 106, 26, 107, 108, 109, - 110, 111, 112, 0, 0, 0, 0, 27, 28, 0, - 0, 0, 29, 30, 0, 0, 0, 56, 32, 33, - 34, 35, 0, 0, 36, 1, 2, 3, 4, 5, - 6, 7, 8, 9, 10, 11, 12, 13, 14, 0, - 15, 16, 17, 18, 19, 20, 21, 22, 0, 23, - 24, 25, 0, 0, 0, 5, 0, 7, 8, 9, - 10, 0, 12, 0, 14, 0, 15, 16, 17, 18, - 19, 20, 21, 0, 0, 0, 29, 30, 0, 0, - 0, 31, 32, 33, 34, 35, 120, 0, 36, 0, - 0, 0, 0, 102, 103, 104, 105, 106, 121, 107, - 108, 109, 110, 111, 112, 0, 122, 123, 0, 0, - 0, 0, 0, 183, 48, 160, 50, 7, 8, 9, - 10, 0, 12, 0, 14, 0, 15, 16, 17, 18, - 19, 20, 21, 48, 160, 50, 7, 8, 9, 10, - 0, 12, 0, 14, 0, 15, 16, 17, 18, 19, - 20, 21, 0, 0, 0, 104, 105, 106, 161, 107, - 108, 109, 110, 111, 112, 0, 0, 0, 51, 0, - 0, 0, 0, 0, 0, 0, 0, 164, 0, 0, - 0, 0, 85, 0, 0, 0, 0, 51, 86, 87, - 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, - 98, 99, 100, 101, 102, 103, 104, 105, 106, 0, - 107, 108, 109, 110, 111, 112, 0, 0, 0, 85, - 0, 0, 0, 0, 195, 86, 87, 88, 89, 90, - 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, - 101, 102, 103, 104, 105, 106, 0, 107, 108, 109, - 110, 111, 112, 87, 88, 89, 90, 91, 92, 93, - 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, - 104, 105, 106, 0, 107, 108, 109, 110, 111, 112, - 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, - 99, 100, 101, 102, 103, 104, 105, 106, 0, 107, - 108, 109, 110, 111, 112, 90, 91, 92, 93, 94, - 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, - 105, 106, 0, 107, 108, 109, 110, 111, 112, 91, - 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, - 102, 103, 104, 105, 106, 0, 107, 108, 109, 110, - 111, 112, 92, 93, 94, 95, 96, 97, 98, 99, - 100, 101, 102, 103, 104, 105, 106, 0, 107, 108, - 109, 110, 111, 112, 93, 94, 95, 96, 97, 98, - 99, 100, 101, 102, 103, 104, 105, 106, 0, 107, - 108, 109, 110, 111, 112, 95, 96, 97, 98, 99, - 100, 101, 102, 103, 104, 105, 106, 0, 107, 108, - 109, 110, 111, 112 -}; - -static const short yycheck[] = { 0, - 0, 3, 0, 30, 30, 11, 21, 30, 7, 8, - 9, 10, 30, 30, 13, 14, 58, 59, 19, 20, - 26, 27, 28, 29, 30, 19, 30, 21, 34, 35, - 31, 31, 109, 110, 40, 15, 15, 15, 65, 40, - 40, 67, 65, 65, 21, 38, 64, 6, 7, 8, - 41, 6, 7, 8, 21, 56, 56, 50, 6, 7, - 8, 65, 64, 7, 67, 58, 59, 54, 55, 56, - 57, 58, 59, 65, 21, 19, 20, 21, 84, 85, - 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, - 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, - 106, 60, 50, 15, 63, 60, 7, 15, 64, 42, - 109, 110, 60, 111, 65, 63, 50, 116, 19, 20, - 21, 15, 123, 168, 0, 0, 115, 15, 22, 23, - 136, -1, 133, 133, 7, 125, 9, 10, 11, 12, - 125, 14, -1, 16, 38, 18, 19, 20, 21, 22, - 23, 24, 19, -1, 21, 161, 50, 24, 164, -1, - 15, -1, 168, 169, 58, 59, 172, 22, 23, -1, - 47, 48, 49, 50, 51, 52, 175, 54, 55, 56, - 57, 58, 59, 38, -1, 191, -1, 188, -1, 195, - -1, -1, 65, -1, -1, 50, 118, 119, 120, 121, - -1, 123, -1, 58, 59, 206, 206, 3, 4, 5, - 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, - 16, -1, 18, 19, 20, 21, 22, 23, 24, 25, - -1, 27, 28, 29, 7, -1, 9, 10, 11, 12, - -1, 14, 38, 16, -1, 18, 19, 20, 21, 22, - 23, 24, -1, 49, 50, -1, -1, -1, 54, 55, - -1, -1, -1, 59, 60, 61, 62, 63, -1, -1, - 66, 3, 4, 5, 6, 7, 8, 9, 10, 11, - 12, 13, 14, 15, 16, -1, 18, 19, 20, 21, - 22, 23, 24, 25, -1, 27, 28, 29, 45, 46, - 47, 48, 49, 50, 51, 52, 38, 54, 55, 56, - 57, 58, 59, -1, -1, -1, -1, 49, 50, -1, - -1, -1, 54, 55, -1, -1, -1, 59, 60, 61, - 62, 63, -1, -1, 66, 3, 4, 5, 6, 7, - 8, 9, 10, 11, 12, 13, 14, 15, 16, -1, - 18, 19, 20, 21, 22, 23, 24, 25, -1, 27, - 28, 29, -1, -1, -1, 7, -1, 9, 10, 11, - 12, -1, 14, -1, 16, -1, 18, 19, 20, 21, - 22, 23, 24, -1, -1, -1, 54, 55, -1, -1, - -1, 59, 60, 61, 62, 63, 38, -1, 66, -1, - -1, -1, -1, 48, 49, 50, 51, 52, 50, 54, - 55, 56, 57, 58, 59, -1, 58, 59, -1, -1, - -1, -1, -1, 65, 6, 7, 8, 9, 10, 11, - 12, -1, 14, -1, 16, -1, 18, 19, 20, 21, - 22, 23, 24, 6, 7, 8, 9, 10, 11, 12, - -1, 14, -1, 16, -1, 18, 19, 20, 21, 22, - 23, 24, -1, -1, -1, 50, 51, 52, 50, 54, - 55, 56, 57, 58, 59, -1, -1, -1, 60, -1, - -1, -1, -1, -1, -1, -1, -1, 50, -1, -1, - -1, -1, 26, -1, -1, -1, -1, 60, 32, 33, - 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, - 44, 45, 46, 47, 48, 49, 50, 51, 52, -1, - 54, 55, 56, 57, 58, 59, -1, -1, -1, 26, - -1, -1, -1, -1, 68, 32, 33, 34, 35, 36, - 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, - 47, 48, 49, 50, 51, 52, -1, 54, 55, 56, - 57, 58, 59, 33, 34, 35, 36, 37, 38, 39, - 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, - 50, 51, 52, -1, 54, 55, 56, 57, 58, 59, - 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, - 45, 46, 47, 48, 49, 50, 51, 52, -1, 54, - 55, 56, 57, 58, 59, 36, 37, 38, 39, 40, - 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, - 51, 52, -1, 54, 55, 56, 57, 58, 59, 37, - 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, - 48, 49, 50, 51, 52, -1, 54, 55, 56, 57, - 58, 59, 38, 39, 40, 41, 42, 43, 44, 45, - 46, 47, 48, 49, 50, 51, 52, -1, 54, 55, - 56, 57, 58, 59, 39, 40, 41, 42, 43, 44, - 45, 46, 47, 48, 49, 50, 51, 52, -1, 54, - 55, 56, 57, 58, 59, 41, 42, 43, 44, 45, - 46, 47, 48, 49, 50, 51, 52, -1, 54, 55, - 56, 57, 58, 59 -}; -/* -*-C-*- Note some compilers choke on comments on `#line' lines. */ -#line 3 "/usr/lib/bison.simple" -/* This file comes from bison-1.27. */ - -/* Skeleton output parser for bison, - Copyright (C) 1984, 1989, 1990 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 2, 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., 59 Temple Place - Suite 330, - Boston, MA 02111-1307, USA. */ - -/* As a special exception, when this file is copied by Bison into a - Bison output file, you may use that output file without restriction. - This special exception was added by the Free Software Foundation - in version 1.24 of Bison. */ - -/* This is the parser code that is written into each bison parser - when the %semantic_parser declaration is not specified in the grammar. - It was written by Richard Stallman by simplifying the hairy parser - used when %semantic_parser is specified. */ - -#ifndef YYSTACK_USE_ALLOCA -#ifdef alloca -#define YYSTACK_USE_ALLOCA -#else /* alloca not defined */ -#ifdef __GNUC__ -#define YYSTACK_USE_ALLOCA -#define alloca __builtin_alloca -#else /* not GNU C. */ -#if (!defined (__STDC__) && defined (sparc)) || defined (__sparc__) || defined (__sparc) || defined (__sgi) || (defined (__sun) && defined (__i386)) -#define YYSTACK_USE_ALLOCA -#include <alloca.h> -#else /* not sparc */ -/* We think this test detects Watcom and Microsoft C. */ -/* This used to test MSDOS, but that is a bad idea - since that symbol is in the user namespace. */ -#if (defined (_MSDOS) || defined (_MSDOS_)) && !defined (__TURBOC__) -#if 0 /* No need for xmalloc.h, which pollutes the namespace; - instead, just don't use alloca. */ -#endif -#else /* not MSDOS, or __TURBOC__ */ -#if defined(_AIX) -/* I don't know what this was needed for, but it pollutes the namespace. - So I turned it off. rms, 2 May 1997. */ - #pragma alloca -#define YYSTACK_USE_ALLOCA -#else /* not MSDOS, or __TURBOC__, or _AIX */ -#if 0 -#ifdef __hpux /* haible@ilog.fr says this works for HPUX 9.05 and up, - and on HPUX 10. Eventually we can turn this on. */ -#define YYSTACK_USE_ALLOCA -#define alloca __builtin_alloca -#endif /* __hpux */ -#endif -#endif /* not _AIX */ -#endif /* not MSDOS, or __TURBOC__ */ -#endif /* not sparc */ -#endif /* not GNU C */ -#endif /* alloca not defined */ -#endif /* YYSTACK_USE_ALLOCA not defined */ - -#ifdef YYSTACK_USE_ALLOCA -#define YYSTACK_ALLOC alloca -#else -#define YYSTACK_ALLOC xmalloc -#endif - -/* Note: there must be only one dollar sign in this file. - It is replaced by the list of actions, each action - as one case of the switch. */ - -#define yyerrok (yyerrstatus = 0) -#define yyclearin (yychar = YYEMPTY) -#define YYEMPTY -2 -#define YYEOF 0 -#define YYACCEPT goto yyacceptlab -#define YYABORT goto yyabortlab -#define YYERROR goto yyerrlab1 -/* Like YYERROR except do call yyerror. - This remains here temporarily to ease the - transition to the new meaning of YYERROR, for GCC. - Once GCC version 2 has supplanted version 1, this can go. */ -#define YYFAIL goto yyerrlab -#define YYRECOVERING() (!!yyerrstatus) -#define YYBACKUP(token, value) \ -do \ - if (yychar == YYEMPTY && yylen == 1) \ - { yychar = (token), yylval = (value); \ - yychar1 = YYTRANSLATE (yychar); \ - YYPOPSTACK; \ - goto yybackup; \ - } \ - else \ - { yyerror ("syntax error: cannot back up"); YYERROR; } \ -while (0) - -#define YYTERROR 1 -#define YYERRCODE 256 - -#ifndef YYPURE -#define YYLEX yylex() -#endif - -#ifdef YYPURE -#ifdef YYLSP_NEEDED -#ifdef YYLEX_PARAM -#define YYLEX yylex(&yylval, &yylloc, YYLEX_PARAM) -#else -#define YYLEX yylex(&yylval, &yylloc) -#endif -#else /* not YYLSP_NEEDED */ -#ifdef YYLEX_PARAM -#define YYLEX yylex(&yylval, YYLEX_PARAM) -#else -#define YYLEX yylex(&yylval) -#endif -#endif /* not YYLSP_NEEDED */ -#endif - -/* If nonreentrant, generate the variables here */ - -#ifndef YYPURE - -int yychar; /* the lookahead symbol */ -YYSTYPE yylval; /* the semantic value of the */ - /* lookahead symbol */ - -#ifdef YYLSP_NEEDED -YYLTYPE yylloc; /* location data for the lookahead */ - /* symbol */ -#endif - -int yynerrs; /* number of parse errors so far */ -#endif /* not YYPURE */ - -#if YYDEBUG != 0 -int yydebug; /* nonzero means print parse trace */ -/* Since this is uninitialized, it does not stop multiple parsers - from coexisting. */ -#endif - -/* YYINITDEPTH indicates the initial size of the parser's stacks */ - -#ifndef YYINITDEPTH -#define YYINITDEPTH 200 -#endif - -/* YYMAXDEPTH is the maximum size the stacks can grow to - (effective only if the built-in stack extension method is used). */ - -#if YYMAXDEPTH == 0 -#undef YYMAXDEPTH -#endif - -#ifndef YYMAXDEPTH -#define YYMAXDEPTH 10000 -#endif - -/* Define __yy_memcpy. Note that the size argument - should be passed with type unsigned int, because that is what the non-GCC - definitions require. With GCC, __builtin_memcpy takes an arg - of type size_t, but it can handle unsigned int. */ - -#if __GNUC__ > 1 /* GNU C and GNU C++ define this. */ -#define __yy_memcpy(TO,FROM,COUNT) __builtin_memcpy(TO,FROM,COUNT) -#else /* not GNU C or C++ */ -#ifndef __cplusplus - -/* This is the most reliable way to avoid incompatibilities - in available built-in functions on various systems. */ -static void -__yy_memcpy (to, from, count) - char *to; - char *from; - unsigned int count; -{ - register char *f = from; - register char *t = to; - register int i = count; - - while (i-- > 0) - *t++ = *f++; -} - -#else /* __cplusplus */ - -/* This is the most reliable way to avoid incompatibilities - in available built-in functions on various systems. */ -static void -__yy_memcpy (char *to, char *from, unsigned int count) -{ - register char *t = to; - register char *f = from; - register int i = count; - - while (i-- > 0) - *t++ = *f++; -} - -#endif -#endif - -#line 216 "/usr/lib/bison.simple" - -/* The user can define YYPARSE_PARAM as the name of an argument to be passed - into yyparse. The argument should have type void *. - It should actually point to an object. - Grammar actions can access the variable by casting it - to the proper pointer type. */ - -#ifdef YYPARSE_PARAM -#ifdef __cplusplus -#define YYPARSE_PARAM_ARG void *YYPARSE_PARAM -#define YYPARSE_PARAM_DECL -#else /* not __cplusplus */ -#define YYPARSE_PARAM_ARG YYPARSE_PARAM -#define YYPARSE_PARAM_DECL void *YYPARSE_PARAM; -#endif /* not __cplusplus */ -#else /* not YYPARSE_PARAM */ -#define YYPARSE_PARAM_ARG -#define YYPARSE_PARAM_DECL -#endif /* not YYPARSE_PARAM */ - -/* Prevent warning if -Wstrict-prototypes. */ -#ifdef __GNUC__ -#ifdef YYPARSE_PARAM -int yyparse (void *); -#else -int yyparse (void); -#endif -#endif - -int -yyparse(YYPARSE_PARAM_ARG) - YYPARSE_PARAM_DECL -{ - register int yystate; - register int yyn; - register short *yyssp; - register YYSTYPE *yyvsp; - int yyerrstatus; /* number of tokens to shift before error messages enabled */ - int yychar1 = 0; /* lookahead token as an internal (translated) token number */ - - short yyssa[YYINITDEPTH]; /* the state stack */ - YYSTYPE yyvsa[YYINITDEPTH]; /* the semantic value stack */ - - short *yyss = yyssa; /* refer to the stacks thru separate pointers */ - YYSTYPE *yyvs = yyvsa; /* to allow yyoverflow to xreallocate them elsewhere */ - -#ifdef YYLSP_NEEDED - YYLTYPE yylsa[YYINITDEPTH]; /* the location stack */ - YYLTYPE *yyls = yylsa; - YYLTYPE *yylsp; - -#define YYPOPSTACK (yyvsp--, yyssp--, yylsp--) -#else -#define YYPOPSTACK (yyvsp--, yyssp--) -#endif - - int yystacksize = YYINITDEPTH; - int yyfree_stacks = 0; - -#ifdef YYPURE - int yychar; - YYSTYPE yylval; - int yynerrs; -#ifdef YYLSP_NEEDED - YYLTYPE yylloc; -#endif -#endif - - YYSTYPE yyval; /* the variable used to return */ - /* semantic values from the action */ - /* routines */ - - int yylen; - -#if YYDEBUG != 0 - if (yydebug) - fprintf(stderr, "Starting parse\n"); -#endif - - yystate = 0; - yyerrstatus = 0; - yynerrs = 0; - yychar = YYEMPTY; /* Cause a token to be read. */ - - /* Initialize stack pointers. - Waste one element of value and location stack - so that they stay on the same level as the state stack. - The wasted elements are never initialized. */ - - yyssp = yyss - 1; - yyvsp = yyvs; -#ifdef YYLSP_NEEDED - yylsp = yyls; -#endif - -/* Push a new state, which is found in yystate . */ -/* In all cases, when you get here, the value and location stacks - have just been pushed. so pushing a state here evens the stacks. */ -yynewstate: - - *++yyssp = yystate; - - if (yyssp >= yyss + yystacksize - 1) - { - /* Give user a chance to xreallocate the stack */ - /* Use copies of these so that the &'s don't force the real ones into memory. */ - YYSTYPE *yyvs1 = yyvs; - short *yyss1 = yyss; -#ifdef YYLSP_NEEDED - YYLTYPE *yyls1 = yyls; -#endif - - /* Get the current used size of the three stacks, in elements. */ - int size = yyssp - yyss + 1; - -#ifdef yyoverflow - /* Each stack pointer address is followed by the size of - the data in use in that stack, in bytes. */ -#ifdef YYLSP_NEEDED - /* This used to be a conditional around just the two extra args, - but that might be undefined if yyoverflow is a macro. */ - yyoverflow("parser stack overflow", - &yyss1, size * sizeof (*yyssp), - &yyvs1, size * sizeof (*yyvsp), - &yyls1, size * sizeof (*yylsp), - &yystacksize); -#else - yyoverflow("parser stack overflow", - &yyss1, size * sizeof (*yyssp), - &yyvs1, size * sizeof (*yyvsp), - &yystacksize); -#endif - - yyss = yyss1; yyvs = yyvs1; -#ifdef YYLSP_NEEDED - yyls = yyls1; -#endif -#else /* no yyoverflow */ - /* Extend the stack our own way. */ - if (yystacksize >= YYMAXDEPTH) - { - yyerror("parser stack overflow"); - if (yyfree_stacks) - { - free (yyss); - free (yyvs); -#ifdef YYLSP_NEEDED - free (yyls); -#endif - } - return 2; - } - yystacksize *= 2; - if (yystacksize > YYMAXDEPTH) - yystacksize = YYMAXDEPTH; -#ifndef YYSTACK_USE_ALLOCA - yyfree_stacks = 1; -#endif - yyss = (short *) YYSTACK_ALLOC (yystacksize * sizeof (*yyssp)); - __yy_memcpy ((char *)yyss, (char *)yyss1, - size * (unsigned int) sizeof (*yyssp)); - yyvs = (YYSTYPE *) YYSTACK_ALLOC (yystacksize * sizeof (*yyvsp)); - __yy_memcpy ((char *)yyvs, (char *)yyvs1, - size * (unsigned int) sizeof (*yyvsp)); -#ifdef YYLSP_NEEDED - yyls = (YYLTYPE *) YYSTACK_ALLOC (yystacksize * sizeof (*yylsp)); - __yy_memcpy ((char *)yyls, (char *)yyls1, - size * (unsigned int) sizeof (*yylsp)); -#endif -#endif /* no yyoverflow */ - - yyssp = yyss + size - 1; - yyvsp = yyvs + size - 1; -#ifdef YYLSP_NEEDED - yylsp = yyls + size - 1; -#endif - -#if YYDEBUG != 0 - if (yydebug) - fprintf(stderr, "Stack size increased to %d\n", yystacksize); -#endif - - if (yyssp >= yyss + yystacksize - 1) - YYABORT; - } - -#if YYDEBUG != 0 - if (yydebug) - fprintf(stderr, "Entering state %d\n", yystate); -#endif - - goto yybackup; - yybackup: - -/* Do appropriate processing given the current state. */ -/* Read a lookahead token if we need one and don't already have one. */ -/* yyresume: */ - - /* First try to decide what to do without reference to lookahead token. */ - - yyn = yypact[yystate]; - if (yyn == YYFLAG) - goto yydefault; - - /* Not known => get a lookahead token if don't already have one. */ - - /* yychar is either YYEMPTY or YYEOF - or a valid token in external form. */ - - if (yychar == YYEMPTY) - { -#if YYDEBUG != 0 - if (yydebug) - fprintf(stderr, "Reading a token: "); -#endif - yychar = YYLEX; - } - - /* Convert token to internal form (in yychar1) for indexing tables with */ - - if (yychar <= 0) /* This means end of input. */ - { - yychar1 = 0; - yychar = YYEOF; /* Don't call YYLEX any more */ - -#if YYDEBUG != 0 - if (yydebug) - fprintf(stderr, "Now at end of input.\n"); -#endif - } - else - { - yychar1 = YYTRANSLATE(yychar); - -#if YYDEBUG != 0 - if (yydebug) - { - fprintf (stderr, "Next token is %d (%s", yychar, yytname[yychar1]); - /* Give the individual parser a way to print the precise meaning - of a token, for further debugging info. */ -#ifdef YYPRINT - YYPRINT (stderr, yychar, yylval); -#endif - fprintf (stderr, ")\n"); - } -#endif - } - - yyn += yychar1; - if (yyn < 0 || yyn > YYLAST || yycheck[yyn] != yychar1) - goto yydefault; - - yyn = yytable[yyn]; - - /* yyn is what to do for this token type in this state. - Negative => reduce, -yyn is rule number. - Positive => shift, yyn is new state. - New state is final state => don't bother to shift, - just return success. - 0, or most negative number => error. */ - - if (yyn < 0) - { - if (yyn == YYFLAG) - goto yyerrlab; - yyn = -yyn; - goto yyreduce; - } - else if (yyn == 0) - goto yyerrlab; - - if (yyn == YYFINAL) - YYACCEPT; - - /* Shift the lookahead token. */ - -#if YYDEBUG != 0 - if (yydebug) - fprintf(stderr, "Shifting token %d (%s), ", yychar, yytname[yychar1]); -#endif - - /* Discard the token being shifted unless it is eof. */ - if (yychar != YYEOF) - yychar = YYEMPTY; - - *++yyvsp = yylval; -#ifdef YYLSP_NEEDED - *++yylsp = yylloc; -#endif - - /* count tokens shifted since error; after three, turn off error status. */ - if (yyerrstatus) yyerrstatus--; - - yystate = yyn; - goto yynewstate; - -/* Do the default action for the current state. */ -yydefault: - - yyn = yydefact[yystate]; - if (yyn == 0) - goto yyerrlab; - -/* Do a reduction. yyn is the number of a rule to reduce with. */ -yyreduce: - yylen = yyr2[yyn]; - if (yylen > 0) - yyval = yyvsp[1-yylen]; /* implement default value of the action */ - -#if YYDEBUG != 0 - if (yydebug) - { - int i; - - fprintf (stderr, "Reducing via rule %d (line %d), ", - yyn, yyrline[yyn]); - - /* Print the symbols being reduced, and their result. */ - for (i = yyprhs[yyn]; yyrhs[i] > 0; i++) - fprintf (stderr, "%s ", yytname[yyrhs[i]]); - fprintf (stderr, " -> %s\n", yytname[yyr1[yyn]]); - } -#endif - - - switch (yyn) { - -case 3: -#line 235 "c-exp.y" -{ write_exp_elt_opcode(OP_TYPE); - write_exp_elt_type(yyvsp[0].tval); - write_exp_elt_opcode(OP_TYPE);; - break;} -case 5: -#line 243 "c-exp.y" -{ write_exp_elt_opcode (BINOP_COMMA); ; - break;} -case 6: -#line 248 "c-exp.y" -{ write_exp_elt_opcode (UNOP_IND); ; - break;} -case 7: -#line 251 "c-exp.y" -{ write_exp_elt_opcode (UNOP_ADDR); ; - break;} -case 8: -#line 254 "c-exp.y" -{ write_exp_elt_opcode (UNOP_NEG); ; - break;} -case 9: -#line 258 "c-exp.y" -{ write_exp_elt_opcode (UNOP_LOGICAL_NOT); ; - break;} -case 10: -#line 262 "c-exp.y" -{ write_exp_elt_opcode (UNOP_COMPLEMENT); ; - break;} -case 11: -#line 266 "c-exp.y" -{ write_exp_elt_opcode (UNOP_PREINCREMENT); ; - break;} -case 12: -#line 270 "c-exp.y" -{ write_exp_elt_opcode (UNOP_PREDECREMENT); ; - break;} -case 13: -#line 274 "c-exp.y" -{ write_exp_elt_opcode (UNOP_POSTINCREMENT); ; - break;} -case 14: -#line 278 "c-exp.y" -{ write_exp_elt_opcode (UNOP_POSTDECREMENT); ; - break;} -case 15: -#line 282 "c-exp.y" -{ write_exp_elt_opcode (UNOP_SIZEOF); ; - break;} -case 16: -#line 286 "c-exp.y" -{ write_exp_elt_opcode (STRUCTOP_PTR); - write_exp_string (yyvsp[0].sval); - write_exp_elt_opcode (STRUCTOP_PTR); ; - break;} -case 17: -#line 292 "c-exp.y" -{ /* exp->type::name becomes exp->*(&type::name) */ - /* Note: this doesn't work if name is a - static member! FIXME */ - write_exp_elt_opcode (UNOP_ADDR); - write_exp_elt_opcode (STRUCTOP_MPTR); ; - break;} -case 18: -#line 300 "c-exp.y" -{ write_exp_elt_opcode (STRUCTOP_MPTR); ; - break;} -case 19: -#line 304 "c-exp.y" -{ write_exp_elt_opcode (STRUCTOP_STRUCT); - write_exp_string (yyvsp[0].sval); - write_exp_elt_opcode (STRUCTOP_STRUCT); ; - break;} -case 20: -#line 310 "c-exp.y" -{ /* exp.type::name becomes exp.*(&type::name) */ - /* Note: this doesn't work if name is a - static member! FIXME */ - write_exp_elt_opcode (UNOP_ADDR); - write_exp_elt_opcode (STRUCTOP_MEMBER); ; - break;} -case 21: -#line 318 "c-exp.y" -{ write_exp_elt_opcode (STRUCTOP_MEMBER); ; - break;} -case 22: -#line 322 "c-exp.y" -{ write_exp_elt_opcode (BINOP_SUBSCRIPT); ; - break;} -case 23: -#line 328 "c-exp.y" -{ start_arglist (); ; - break;} -case 24: -#line 330 "c-exp.y" -{ write_exp_elt_opcode (OP_FUNCALL); - write_exp_elt_longcst ((LONGEST) end_arglist ()); - write_exp_elt_opcode (OP_FUNCALL); ; - break;} -case 25: -#line 336 "c-exp.y" -{ start_arglist (); ; - break;} -case 27: -#line 343 "c-exp.y" -{ arglist_len = 1; ; - break;} -case 28: -#line 347 "c-exp.y" -{ arglist_len++; ; - break;} -case 29: -#line 351 "c-exp.y" -{ yyval.lval = end_arglist () - 1; ; - break;} -case 30: -#line 354 "c-exp.y" -{ write_exp_elt_opcode (OP_ARRAY); - write_exp_elt_longcst ((LONGEST) 0); - write_exp_elt_longcst ((LONGEST) yyvsp[0].lval); - write_exp_elt_opcode (OP_ARRAY); ; - break;} -case 31: -#line 361 "c-exp.y" -{ write_exp_elt_opcode (UNOP_MEMVAL); - write_exp_elt_type (yyvsp[-2].tval); - write_exp_elt_opcode (UNOP_MEMVAL); ; - break;} -case 32: -#line 367 "c-exp.y" -{ write_exp_elt_opcode (UNOP_CAST); - write_exp_elt_type (yyvsp[-2].tval); - write_exp_elt_opcode (UNOP_CAST); ; - break;} -case 33: -#line 373 "c-exp.y" -{ ; - break;} -case 34: -#line 379 "c-exp.y" -{ write_exp_elt_opcode (BINOP_REPEAT); ; - break;} -case 35: -#line 383 "c-exp.y" -{ write_exp_elt_opcode (BINOP_MUL); ; - break;} -case 36: -#line 387 "c-exp.y" -{ write_exp_elt_opcode (BINOP_DIV); ; - break;} -case 37: -#line 391 "c-exp.y" -{ write_exp_elt_opcode (BINOP_REM); ; - break;} -case 38: -#line 395 "c-exp.y" -{ write_exp_elt_opcode (BINOP_ADD); ; - break;} -case 39: -#line 399 "c-exp.y" -{ write_exp_elt_opcode (BINOP_SUB); ; - break;} -case 40: -#line 403 "c-exp.y" -{ write_exp_elt_opcode (BINOP_LSH); ; - break;} -case 41: -#line 407 "c-exp.y" -{ write_exp_elt_opcode (BINOP_RSH); ; - break;} -case 42: -#line 411 "c-exp.y" -{ write_exp_elt_opcode (BINOP_EQUAL); ; - break;} -case 43: -#line 415 "c-exp.y" -{ write_exp_elt_opcode (BINOP_NOTEQUAL); ; - break;} -case 44: -#line 419 "c-exp.y" -{ write_exp_elt_opcode (BINOP_LEQ); ; - break;} -case 45: -#line 423 "c-exp.y" -{ write_exp_elt_opcode (BINOP_GEQ); ; - break;} -case 46: -#line 427 "c-exp.y" -{ write_exp_elt_opcode (BINOP_LESS); ; - break;} -case 47: -#line 431 "c-exp.y" -{ write_exp_elt_opcode (BINOP_GTR); ; - break;} -case 48: -#line 435 "c-exp.y" -{ write_exp_elt_opcode (BINOP_BITWISE_AND); ; - break;} -case 49: -#line 439 "c-exp.y" -{ write_exp_elt_opcode (BINOP_BITWISE_XOR); ; - break;} -case 50: -#line 443 "c-exp.y" -{ write_exp_elt_opcode (BINOP_BITWISE_IOR); ; - break;} -case 51: -#line 447 "c-exp.y" -{ write_exp_elt_opcode (BINOP_LOGICAL_AND); ; - break;} -case 52: -#line 451 "c-exp.y" -{ write_exp_elt_opcode (BINOP_LOGICAL_OR); ; - break;} -case 53: -#line 455 "c-exp.y" -{ write_exp_elt_opcode (TERNOP_COND); ; - break;} -case 54: -#line 459 "c-exp.y" -{ write_exp_elt_opcode (BINOP_ASSIGN); ; - break;} -case 55: -#line 463 "c-exp.y" -{ write_exp_elt_opcode (BINOP_ASSIGN_MODIFY); - write_exp_elt_opcode (yyvsp[-1].opcode); - write_exp_elt_opcode (BINOP_ASSIGN_MODIFY); ; - break;} -case 56: -#line 469 "c-exp.y" -{ write_exp_elt_opcode (OP_LONG); - write_exp_elt_type (yyvsp[0].typed_val_int.type); - write_exp_elt_longcst ((LONGEST)(yyvsp[0].typed_val_int.val)); - write_exp_elt_opcode (OP_LONG); ; - break;} -case 57: -#line 476 "c-exp.y" -{ YYSTYPE val; - parse_number (yyvsp[0].ssym.stoken.ptr, yyvsp[0].ssym.stoken.length, 0, &val); - write_exp_elt_opcode (OP_LONG); - write_exp_elt_type (val.typed_val_int.type); - write_exp_elt_longcst ((LONGEST)val.typed_val_int.val); - write_exp_elt_opcode (OP_LONG); - ; - break;} -case 58: -#line 487 "c-exp.y" -{ write_exp_elt_opcode (OP_DOUBLE); - write_exp_elt_type (yyvsp[0].typed_val_float.type); - write_exp_elt_dblcst (yyvsp[0].typed_val_float.dval); - write_exp_elt_opcode (OP_DOUBLE); ; - break;} -case 61: -#line 501 "c-exp.y" -{ write_exp_elt_opcode (OP_LONG); - write_exp_elt_type (builtin_type_int); - CHECK_TYPEDEF (yyvsp[-1].tval); - write_exp_elt_longcst ((LONGEST) TYPE_LENGTH (yyvsp[-1].tval)); - write_exp_elt_opcode (OP_LONG); ; - break;} -case 62: -#line 509 "c-exp.y" -{ /* C strings are converted into array constants with - an explicit null byte added at the end. Thus - the array upper bound is the string length. - There is no such thing in C as a completely empty - string. */ - char *sp = yyvsp[0].sval.ptr; int count = yyvsp[0].sval.length; - while (count-- > 0) - { - write_exp_elt_opcode (OP_LONG); - write_exp_elt_type (builtin_type_char); - write_exp_elt_longcst ((LONGEST)(*sp++)); - write_exp_elt_opcode (OP_LONG); - } - write_exp_elt_opcode (OP_LONG); - write_exp_elt_type (builtin_type_char); - write_exp_elt_longcst ((LONGEST)'\0'); - write_exp_elt_opcode (OP_LONG); - write_exp_elt_opcode (OP_ARRAY); - write_exp_elt_longcst ((LONGEST) 0); - write_exp_elt_longcst ((LONGEST) (yyvsp[0].sval.length)); - write_exp_elt_opcode (OP_ARRAY); ; - break;} -case 63: -#line 534 "c-exp.y" -{ write_exp_elt_opcode (OP_THIS); - write_exp_elt_opcode (OP_THIS); ; - break;} -case 64: -#line 539 "c-exp.y" -{ write_exp_elt_opcode (OP_LONG); - write_exp_elt_type (builtin_type_bool); - write_exp_elt_longcst ((LONGEST) 1); - write_exp_elt_opcode (OP_LONG); ; - break;} -case 65: -#line 546 "c-exp.y" -{ write_exp_elt_opcode (OP_LONG); - write_exp_elt_type (builtin_type_bool); - write_exp_elt_longcst ((LONGEST) 0); - write_exp_elt_opcode (OP_LONG); ; - break;} -case 66: -#line 555 "c-exp.y" -{ - if (yyvsp[0].ssym.sym) - yyval.bval = SYMBOL_BLOCK_VALUE (yyvsp[0].ssym.sym); - else - error ("No file or function \"%s\".", - copy_name (yyvsp[0].ssym.stoken)); - ; - break;} -case 67: -#line 563 "c-exp.y" -{ - yyval.bval = yyvsp[0].bval; - ; - break;} -case 68: -#line 569 "c-exp.y" -{ struct symbol *tem - = lookup_symbol (copy_name (yyvsp[0].sval), yyvsp[-2].bval, - VAR_NAMESPACE, (int *) NULL, - (struct symtab **) NULL); - if (!tem || SYMBOL_CLASS (tem) != LOC_BLOCK) - error ("No function \"%s\" in specified context.", - copy_name (yyvsp[0].sval)); - yyval.bval = SYMBOL_BLOCK_VALUE (tem); ; - break;} -case 69: -#line 580 "c-exp.y" -{ struct symbol *sym; - sym = lookup_symbol (copy_name (yyvsp[0].sval), yyvsp[-2].bval, - VAR_NAMESPACE, (int *) NULL, - (struct symtab **) NULL); - if (sym == 0) - error ("No symbol \"%s\" in specified context.", - copy_name (yyvsp[0].sval)); - - write_exp_elt_opcode (OP_VAR_VALUE); - /* block_found is set by lookup_symbol. */ - write_exp_elt_block (block_found); - write_exp_elt_sym (sym); - write_exp_elt_opcode (OP_VAR_VALUE); ; - break;} -case 70: -#line 596 "c-exp.y" -{ - struct type *type = yyvsp[-2].tval; - if (TYPE_CODE (type) != TYPE_CODE_STRUCT - && TYPE_CODE (type) != TYPE_CODE_UNION) - error ("`%s' is not defined as an aggregate type.", - TYPE_NAME (type)); - - write_exp_elt_opcode (OP_SCOPE); - write_exp_elt_type (type); - write_exp_string (yyvsp[0].sval); - write_exp_elt_opcode (OP_SCOPE); - ; - break;} -case 71: -#line 609 "c-exp.y" -{ - struct type *type = yyvsp[-3].tval; - struct stoken tmp_token; - if (TYPE_CODE (type) != TYPE_CODE_STRUCT - && TYPE_CODE (type) != TYPE_CODE_UNION) - error ("`%s' is not defined as an aggregate type.", - TYPE_NAME (type)); - - tmp_token.ptr = (char*) alloca (yyvsp[0].sval.length + 2); - tmp_token.length = yyvsp[0].sval.length + 1; - tmp_token.ptr[0] = '~'; - memcpy (tmp_token.ptr+1, yyvsp[0].sval.ptr, yyvsp[0].sval.length); - tmp_token.ptr[tmp_token.length] = 0; - - /* Check for valid destructor name. */ - destructor_name_p (tmp_token.ptr, type); - write_exp_elt_opcode (OP_SCOPE); - write_exp_elt_type (type); - write_exp_string (tmp_token); - write_exp_elt_opcode (OP_SCOPE); - ; - break;} -case 73: -#line 634 "c-exp.y" -{ - char *name = copy_name (yyvsp[0].sval); - struct symbol *sym; - struct minimal_symbol *msymbol; - - sym = - lookup_symbol (name, (const struct block *) NULL, - VAR_NAMESPACE, (int *) NULL, - (struct symtab **) NULL); - if (sym) - { - write_exp_elt_opcode (OP_VAR_VALUE); - write_exp_elt_block (NULL); - write_exp_elt_sym (sym); - write_exp_elt_opcode (OP_VAR_VALUE); - break; - } - - msymbol = lookup_minimal_symbol (name, NULL, NULL); - if (msymbol != NULL) - { - write_exp_msymbol (msymbol, - lookup_function_type (builtin_type_int), - builtin_type_int); - } - else - if (!have_full_symbols () && !have_partial_symbols ()) - error ("No symbol table is loaded. Use the \"file\" command."); - else - error ("No symbol \"%s\" in current context.", name); - ; - break;} -case 74: -#line 668 "c-exp.y" -{ struct symbol *sym = yyvsp[0].ssym.sym; - - if (sym) - { - if (symbol_read_needs_frame (sym)) - { - if (innermost_block == 0 || - contained_in (block_found, - innermost_block)) - innermost_block = block_found; - } - - write_exp_elt_opcode (OP_VAR_VALUE); - /* We want to use the selected frame, not - another more inner frame which happens to - be in the same block. */ - write_exp_elt_block (NULL); - write_exp_elt_sym (sym); - write_exp_elt_opcode (OP_VAR_VALUE); - } - else if (yyvsp[0].ssym.is_a_field_of_this) - { - /* C++: it hangs off of `this'. Must - not inadvertently convert from a method call - to data ref. */ - if (innermost_block == 0 || - contained_in (block_found, innermost_block)) - innermost_block = block_found; - write_exp_elt_opcode (OP_THIS); - write_exp_elt_opcode (OP_THIS); - write_exp_elt_opcode (STRUCTOP_PTR); - write_exp_string (yyvsp[0].ssym.stoken); - write_exp_elt_opcode (STRUCTOP_PTR); - } - else - { - struct minimal_symbol *msymbol; - register char *arg = copy_name (yyvsp[0].ssym.stoken); - - msymbol = - lookup_minimal_symbol (arg, NULL, NULL); - if (msymbol != NULL) - { - write_exp_msymbol (msymbol, - lookup_function_type (builtin_type_int), - builtin_type_int); - } - else if (!have_full_symbols () && !have_partial_symbols ()) - error ("No symbol table is loaded. Use the \"file\" command."); - else - error ("No symbol \"%s\" in current context.", - copy_name (yyvsp[0].ssym.stoken)); - } - ; - break;} -case 78: -#line 734 "c-exp.y" -{ yyval.tval = follow_types (yyvsp[-1].tval); ; - break;} -case 79: -#line 736 "c-exp.y" -{ yyval.tval = follow_types (yyvsp[-2].tval); ; - break;} -case 80: -#line 738 "c-exp.y" -{ yyval.tval = follow_types (yyvsp[-2].tval); ; - break;} -case 81: -#line 742 "c-exp.y" -{ push_type (tp_pointer); yyval.voidval = 0; ; - break;} -case 82: -#line 744 "c-exp.y" -{ push_type (tp_pointer); yyval.voidval = yyvsp[0].voidval; ; - break;} -case 83: -#line 746 "c-exp.y" -{ push_type (tp_reference); yyval.voidval = 0; ; - break;} -case 84: -#line 748 "c-exp.y" -{ push_type (tp_reference); yyval.voidval = yyvsp[0].voidval; ; - break;} -case 86: -#line 753 "c-exp.y" -{ yyval.voidval = yyvsp[-1].voidval; ; - break;} -case 87: -#line 755 "c-exp.y" -{ - push_type_int (yyvsp[0].lval); - push_type (tp_array); - ; - break;} -case 88: -#line 760 "c-exp.y" -{ - push_type_int (yyvsp[0].lval); - push_type (tp_array); - yyval.voidval = 0; - ; - break;} -case 89: -#line 767 "c-exp.y" -{ push_type (tp_function); ; - break;} -case 90: -#line 769 "c-exp.y" -{ push_type (tp_function); ; - break;} -case 91: -#line 773 "c-exp.y" -{ yyval.lval = -1; ; - break;} -case 92: -#line 775 "c-exp.y" -{ yyval.lval = yyvsp[-1].typed_val_int.val; ; - break;} -case 93: -#line 779 "c-exp.y" -{ yyval.voidval = 0; ; - break;} -case 94: -#line 781 "c-exp.y" -{ free ((PTR)yyvsp[-1].tvec); yyval.voidval = 0; ; - break;} -case 96: -#line 794 "c-exp.y" -{ yyval.tval = lookup_member_type (builtin_type_int, yyvsp[-2].tval); ; - break;} -case 97: -#line 799 "c-exp.y" -{ yyval.tval = yyvsp[0].tsym.type; ; - break;} -case 98: -#line 801 "c-exp.y" -{ yyval.tval = builtin_type_int; ; - break;} -case 99: -#line 803 "c-exp.y" -{ yyval.tval = builtin_type_long; ; - break;} -case 100: -#line 805 "c-exp.y" -{ yyval.tval = builtin_type_short; ; - break;} -case 101: -#line 807 "c-exp.y" -{ yyval.tval = builtin_type_long; ; - break;} -case 102: -#line 809 "c-exp.y" -{ yyval.tval = builtin_type_unsigned_long; ; - break;} -case 103: -#line 811 "c-exp.y" -{ yyval.tval = builtin_type_long_long; ; - break;} -case 104: -#line 813 "c-exp.y" -{ yyval.tval = builtin_type_long_long; ; - break;} -case 105: -#line 815 "c-exp.y" -{ yyval.tval = builtin_type_unsigned_long_long; ; - break;} -case 106: -#line 817 "c-exp.y" -{ yyval.tval = builtin_type_unsigned_long_long; ; - break;} -case 107: -#line 819 "c-exp.y" -{ yyval.tval = builtin_type_short; ; - break;} -case 108: -#line 821 "c-exp.y" -{ yyval.tval = builtin_type_unsigned_short; ; - break;} -case 109: -#line 823 "c-exp.y" -{ yyval.tval = builtin_type_double; ; - break;} -case 110: -#line 825 "c-exp.y" -{ yyval.tval = builtin_type_long_double; ; - break;} -case 111: -#line 827 "c-exp.y" -{ yyval.tval = lookup_struct (copy_name (yyvsp[0].sval), - expression_context_block); ; - break;} -case 112: -#line 830 "c-exp.y" -{ yyval.tval = lookup_struct (copy_name (yyvsp[0].sval), - expression_context_block); ; - break;} -case 113: -#line 833 "c-exp.y" -{ yyval.tval = lookup_union (copy_name (yyvsp[0].sval), - expression_context_block); ; - break;} -case 114: -#line 836 "c-exp.y" -{ yyval.tval = lookup_enum (copy_name (yyvsp[0].sval), - expression_context_block); ; - break;} -case 115: -#line 839 "c-exp.y" -{ yyval.tval = lookup_unsigned_typename (TYPE_NAME(yyvsp[0].tsym.type)); ; - break;} -case 116: -#line 841 "c-exp.y" -{ yyval.tval = builtin_type_unsigned_int; ; - break;} -case 117: -#line 843 "c-exp.y" -{ yyval.tval = lookup_signed_typename (TYPE_NAME(yyvsp[0].tsym.type)); ; - break;} -case 118: -#line 845 "c-exp.y" -{ yyval.tval = builtin_type_int; ; - break;} -case 119: -#line 850 "c-exp.y" -{ yyval.tval = lookup_template_type(copy_name(yyvsp[-3].sval), yyvsp[-1].tval, - expression_context_block); - ; - break;} -case 120: -#line 856 "c-exp.y" -{ yyval.tval = yyvsp[0].tval; ; - break;} -case 121: -#line 857 "c-exp.y" -{ yyval.tval = yyvsp[0].tval; ; - break;} -case 123: -#line 862 "c-exp.y" -{ - yyval.tsym.stoken.ptr = "int"; - yyval.tsym.stoken.length = 3; - yyval.tsym.type = builtin_type_int; - ; - break;} -case 124: -#line 868 "c-exp.y" -{ - yyval.tsym.stoken.ptr = "long"; - yyval.tsym.stoken.length = 4; - yyval.tsym.type = builtin_type_long; - ; - break;} -case 125: -#line 874 "c-exp.y" -{ - yyval.tsym.stoken.ptr = "short"; - yyval.tsym.stoken.length = 5; - yyval.tsym.type = builtin_type_short; - ; - break;} -case 126: -#line 883 "c-exp.y" -{ yyval.tvec = (struct type **) xmalloc (sizeof (struct type *) * 2); - yyval.ivec[0] = 1; /* Number of types in vector */ - yyval.tvec[1] = yyvsp[0].tval; - ; - break;} -case 127: -#line 888 "c-exp.y" -{ int len = sizeof (struct type *) * (++(yyvsp[-2].ivec[0]) + 1); - yyval.tvec = (struct type **) xrealloc ((char *) yyvsp[-2].tvec, len); - yyval.tvec[yyval.ivec[0]] = yyvsp[0].tval; - ; - break;} -case 128: -#line 894 "c-exp.y" -{ yyval.sval = yyvsp[0].ssym.stoken; ; - break;} -case 129: -#line 895 "c-exp.y" -{ yyval.sval = yyvsp[0].ssym.stoken; ; - break;} -case 130: -#line 896 "c-exp.y" -{ yyval.sval = yyvsp[0].tsym.stoken; ; - break;} -case 131: -#line 897 "c-exp.y" -{ yyval.sval = yyvsp[0].ssym.stoken; ; - break;} -} - /* the action file gets copied in in place of this dollarsign */ -#line 542 "/usr/lib/bison.simple" - - yyvsp -= yylen; - yyssp -= yylen; -#ifdef YYLSP_NEEDED - yylsp -= yylen; -#endif - -#if YYDEBUG != 0 - if (yydebug) - { - short *ssp1 = yyss - 1; - fprintf (stderr, "state stack now"); - while (ssp1 != yyssp) - fprintf (stderr, " %d", *++ssp1); - fprintf (stderr, "\n"); - } -#endif - - *++yyvsp = yyval; - -#ifdef YYLSP_NEEDED - yylsp++; - if (yylen == 0) - { - yylsp->first_line = yylloc.first_line; - yylsp->first_column = yylloc.first_column; - yylsp->last_line = (yylsp-1)->last_line; - yylsp->last_column = (yylsp-1)->last_column; - yylsp->text = 0; - } - else - { - yylsp->last_line = (yylsp+yylen-1)->last_line; - yylsp->last_column = (yylsp+yylen-1)->last_column; - } -#endif - - /* Now "shift" the result of the reduction. - Determine what state that goes to, - based on the state we popped back to - and the rule number reduced by. */ - - yyn = yyr1[yyn]; - - yystate = yypgoto[yyn - YYNTBASE] + *yyssp; - if (yystate >= 0 && yystate <= YYLAST && yycheck[yystate] == *yyssp) - yystate = yytable[yystate]; - else - yystate = yydefgoto[yyn - YYNTBASE]; - - goto yynewstate; - -yyerrlab: /* here on detecting error */ - - if (! yyerrstatus) - /* If not already recovering from an error, report this error. */ - { - ++yynerrs; - -#ifdef YYERROR_VERBOSE - yyn = yypact[yystate]; - - if (yyn > YYFLAG && yyn < YYLAST) - { - int size = 0; - char *msg; - int x, count; - - count = 0; - /* Start X at -yyn if nec to avoid negative indexes in yycheck. */ - for (x = (yyn < 0 ? -yyn : 0); - x < (sizeof(yytname) / sizeof(char *)); x++) - if (yycheck[x + yyn] == x) - size += strlen(yytname[x]) + 15, count++; - msg = (char *) xmalloc(size + 15); - if (msg != 0) - { - strcpy(msg, "parse error"); - - if (count < 5) - { - count = 0; - for (x = (yyn < 0 ? -yyn : 0); - x < (sizeof(yytname) / sizeof(char *)); x++) - if (yycheck[x + yyn] == x) - { - strcat(msg, count == 0 ? ", expecting `" : " or `"); - strcat(msg, yytname[x]); - strcat(msg, "'"); - count++; - } - } - yyerror(msg); - free(msg); - } - else - yyerror ("parse error; also virtual memory exceeded"); - } - else -#endif /* YYERROR_VERBOSE */ - yyerror("parse error"); - } - - goto yyerrlab1; -yyerrlab1: /* here on error raised explicitly by an action */ - - if (yyerrstatus == 3) - { - /* if just tried and failed to reuse lookahead token after an error, discard it. */ - - /* return failure if at end of input */ - if (yychar == YYEOF) - YYABORT; - -#if YYDEBUG != 0 - if (yydebug) - fprintf(stderr, "Discarding token %d (%s).\n", yychar, yytname[yychar1]); -#endif - - yychar = YYEMPTY; - } - - /* Else will try to reuse lookahead token - after shifting the error token. */ - - yyerrstatus = 3; /* Each real token shifted decrements this */ - - goto yyerrhandle; - -yyerrdefault: /* current state does not do anything special for the error token. */ - -#if 0 - /* This is wrong; only states that explicitly want error tokens - should shift them. */ - yyn = yydefact[yystate]; /* If its default is to accept any token, ok. Otherwise pop it.*/ - if (yyn) goto yydefault; -#endif - -yyerrpop: /* pop the current state because it cannot handle the error token */ - - if (yyssp == yyss) YYABORT; - yyvsp--; - yystate = *--yyssp; -#ifdef YYLSP_NEEDED - yylsp--; -#endif - -#if YYDEBUG != 0 - if (yydebug) - { - short *ssp1 = yyss - 1; - fprintf (stderr, "Error: state stack now"); - while (ssp1 != yyssp) - fprintf (stderr, " %d", *++ssp1); - fprintf (stderr, "\n"); - } -#endif - -yyerrhandle: - - yyn = yypact[yystate]; - if (yyn == YYFLAG) - goto yyerrdefault; - - yyn += YYTERROR; - if (yyn < 0 || yyn > YYLAST || yycheck[yyn] != YYTERROR) - goto yyerrdefault; - - yyn = yytable[yyn]; - if (yyn < 0) - { - if (yyn == YYFLAG) - goto yyerrpop; - yyn = -yyn; - goto yyreduce; - } - else if (yyn == 0) - goto yyerrpop; - - if (yyn == YYFINAL) - YYACCEPT; - -#if YYDEBUG != 0 - if (yydebug) - fprintf(stderr, "Shifting error token, "); -#endif - - *++yyvsp = yylval; -#ifdef YYLSP_NEEDED - *++yylsp = yylloc; -#endif - - yystate = yyn; - goto yynewstate; - - yyacceptlab: - /* YYACCEPT comes here. */ - if (yyfree_stacks) - { - free (yyss); - free (yyvs); -#ifdef YYLSP_NEEDED - free (yyls); -#endif - } - return 0; - - yyabortlab: - /* YYABORT comes here. */ - if (yyfree_stacks) - { - free (yyss); - free (yyvs); -#ifdef YYLSP_NEEDED - free (yyls); -#endif - } - return 1; -} -#line 911 "c-exp.y" - - -/* Take care of parsing a number (anything that starts with a digit). - Set yylval and return the token type; update lexptr. - LEN is the number of characters in it. */ - -/*** Needs some error checking for the float case ***/ - -static int -parse_number (p, len, parsed_float, putithere) - register char *p; - register int len; - int parsed_float; - YYSTYPE *putithere; -{ - /* FIXME: Shouldn't these be unsigned? We don't deal with negative values - here, and we do kind of silly things like cast to unsigned. */ - register LONGEST n = 0; - register LONGEST prevn = 0; - ULONGEST un; - - register int i = 0; - register int c; - register int base = input_radix; - int unsigned_p = 0; - - /* Number of "L" suffixes encountered. */ - int long_p = 0; - - /* We have found a "L" or "U" suffix. */ - int found_suffix = 0; - - ULONGEST high_bit; - struct type *signed_type; - struct type *unsigned_type; - - if (parsed_float) - { - /* It's a float since it contains a point or an exponent. */ - char c; - int num = 0; /* number of tokens scanned by scanf */ - char saved_char = p[len]; - - p[len] = 0; /* null-terminate the token */ - if (sizeof (putithere->typed_val_float.dval) <= sizeof (float)) - num = sscanf (p, "%g%c", (float *) &putithere->typed_val_float.dval,&c); - else if (sizeof (putithere->typed_val_float.dval) <= sizeof (double)) - num = sscanf (p, "%lg%c", (double *) &putithere->typed_val_float.dval,&c); - else - { -#ifdef SCANF_HAS_LONG_DOUBLE - num = sscanf (p, "%Lg%c", &putithere->typed_val_float.dval,&c); -#else - /* Scan it into a double, then assign it to the long double. - This at least wins with values representable in the range - of doubles. */ - double temp; - num = sscanf (p, "%lg%c", &temp,&c); - putithere->typed_val_float.dval = temp; -#endif - } - p[len] = saved_char; /* restore the input stream */ - if (num != 1) /* check scanf found ONLY a float ... */ - return ERROR; - /* See if it has `f' or `l' suffix (float or long double). */ - - c = tolower (p[len - 1]); - - if (c == 'f') - putithere->typed_val_float.type = builtin_type_float; - else if (c == 'l') - putithere->typed_val_float.type = builtin_type_long_double; - else if (isdigit (c) || c == '.') - putithere->typed_val_float.type = builtin_type_double; - else - return ERROR; - - return FLOAT; - } - - /* Handle base-switching prefixes 0x, 0t, 0d, 0 */ - if (p[0] == '0') - switch (p[1]) - { - case 'x': - case 'X': - if (len >= 3) - { - p += 2; - base = 16; - len -= 2; - } - break; - - case 't': - case 'T': - case 'd': - case 'D': - if (len >= 3) - { - p += 2; - base = 10; - len -= 2; - } - break; - - default: - base = 8; - break; - } - - while (len-- > 0) - { - c = *p++; - if (c >= 'A' && c <= 'Z') - c += 'a' - 'A'; - if (c != 'l' && c != 'u') - n *= base; - if (c >= '0' && c <= '9') - { - if (found_suffix) - return ERROR; - n += i = c - '0'; - } - else - { - if (base > 10 && c >= 'a' && c <= 'f') - { - if (found_suffix) - return ERROR; - n += i = c - 'a' + 10; - } - else if (c == 'l') - { - ++long_p; - found_suffix = 1; - } - else if (c == 'u') - { - unsigned_p = 1; - found_suffix = 1; - } - else - return ERROR; /* Char not a digit */ - } - if (i >= base) - return ERROR; /* Invalid digit in this base */ - - /* Portably test for overflow (only works for nonzero values, so make - a second check for zero). FIXME: Can't we just make n and prevn - unsigned and avoid this? */ - if (c != 'l' && c != 'u' && (prevn >= n) && n != 0) - unsigned_p = 1; /* Try something unsigned */ - - /* Portably test for unsigned overflow. - FIXME: This check is wrong; for example it doesn't find overflow - on 0x123456789 when LONGEST is 32 bits. */ - if (c != 'l' && c != 'u' && n != 0) - { - if ((unsigned_p && (ULONGEST) prevn >= (ULONGEST) n)) - error ("Numeric constant too large."); - } - prevn = n; - } - - /* An integer constant is an int, a long, or a long long. An L - suffix forces it to be long; an LL suffix forces it to be long - long. If not forced to a larger size, it gets the first type of - the above that it fits in. To figure out whether it fits, we - shift it right and see whether anything remains. Note that we - can't shift sizeof (LONGEST) * HOST_CHAR_BIT bits or more in one - operation, because many compilers will warn about such a shift - (which always produces a zero result). Sometimes TARGET_INT_BIT - or TARGET_LONG_BIT will be that big, sometimes not. To deal with - the case where it is we just always shift the value more than - once, with fewer bits each time. */ - - un = (ULONGEST)n >> 2; - if (long_p == 0 - && (un >> (TARGET_INT_BIT - 2)) == 0) - { - high_bit = ((ULONGEST)1) << (TARGET_INT_BIT-1); - - /* A large decimal (not hex or octal) constant (between INT_MAX - and UINT_MAX) is a long or unsigned long, according to ANSI, - never an unsigned int, but this code treats it as unsigned - int. This probably should be fixed. GCC gives a warning on - such constants. */ - - unsigned_type = builtin_type_unsigned_int; - signed_type = builtin_type_int; - } - else if (long_p <= 1 - && (un >> (TARGET_LONG_BIT - 2)) == 0) - { - high_bit = ((ULONGEST)1) << (TARGET_LONG_BIT-1); - unsigned_type = builtin_type_unsigned_long; - signed_type = builtin_type_long; - } - else - { - int shift; - if (sizeof (ULONGEST) * HOST_CHAR_BIT < TARGET_LONG_LONG_BIT) - /* A long long does not fit in a LONGEST. */ - shift = (sizeof (ULONGEST) * HOST_CHAR_BIT - 1); - else - shift = (TARGET_LONG_LONG_BIT - 1); - high_bit = (ULONGEST) 1 << shift; - unsigned_type = builtin_type_unsigned_long_long; - signed_type = builtin_type_long_long; - } - - putithere->typed_val_int.val = n; - - /* If the high bit of the worked out type is set then this number - has to be unsigned. */ - - if (unsigned_p || (n & high_bit)) - { - putithere->typed_val_int.type = unsigned_type; - } - else - { - putithere->typed_val_int.type = signed_type; - } - - return INT; -} - -struct token -{ - char *operator; - int token; - enum exp_opcode opcode; -}; - -static const struct token tokentab3[] = - { - {">>=", ASSIGN_MODIFY, BINOP_RSH}, - {"<<=", ASSIGN_MODIFY, BINOP_LSH} - }; - -static const struct token tokentab2[] = - { - {"+=", ASSIGN_MODIFY, BINOP_ADD}, - {"-=", ASSIGN_MODIFY, BINOP_SUB}, - {"*=", ASSIGN_MODIFY, BINOP_MUL}, - {"/=", ASSIGN_MODIFY, BINOP_DIV}, - {"%=", ASSIGN_MODIFY, BINOP_REM}, - {"|=", ASSIGN_MODIFY, BINOP_BITWISE_IOR}, - {"&=", ASSIGN_MODIFY, BINOP_BITWISE_AND}, - {"^=", ASSIGN_MODIFY, BINOP_BITWISE_XOR}, - {"++", INCREMENT, BINOP_END}, - {"--", DECREMENT, BINOP_END}, - {"->", ARROW, BINOP_END}, - {"&&", ANDAND, BINOP_END}, - {"||", OROR, BINOP_END}, - {"::", COLONCOLON, BINOP_END}, - {"<<", LSH, BINOP_END}, - {">>", RSH, BINOP_END}, - {"==", EQUAL, BINOP_END}, - {"!=", NOTEQUAL, BINOP_END}, - {"<=", LEQ, BINOP_END}, - {">=", GEQ, BINOP_END} - }; - -/* Read one token, getting characters through lexptr. */ - -static int -yylex () -{ - int c; - int namelen; - unsigned int i; - char *tokstart; - char *tokptr; - int tempbufindex; - static char *tempbuf; - static int tempbufsize; - struct symbol * sym_class = NULL; - char * token_string = NULL; - int class_prefix = 0; - int unquoted_expr; - - retry: - - unquoted_expr = 1; - - tokstart = lexptr; - /* See if it is a special token of length 3. */ - for (i = 0; i < sizeof tokentab3 / sizeof tokentab3[0]; i++) - if (STREQN (tokstart, tokentab3[i].operator, 3)) - { - lexptr += 3; - yylval.opcode = tokentab3[i].opcode; - return tokentab3[i].token; - } - - /* See if it is a special token of length 2. */ - for (i = 0; i < sizeof tokentab2 / sizeof tokentab2[0]; i++) - if (STREQN (tokstart, tokentab2[i].operator, 2)) - { - lexptr += 2; - yylval.opcode = tokentab2[i].opcode; - return tokentab2[i].token; - } - - switch (c = *tokstart) - { - case 0: - return 0; - - case ' ': - case '\t': - case '\n': - lexptr++; - goto retry; - - case '\'': - /* We either have a character constant ('0' or '\177' for example) - or we have a quoted symbol reference ('foo(int,int)' in C++ - for example). */ - lexptr++; - c = *lexptr++; - if (c == '\\') - c = parse_escape (&lexptr); - else if (c == '\'') - error ("Empty character constant."); - - yylval.typed_val_int.val = c; - yylval.typed_val_int.type = builtin_type_char; - - c = *lexptr++; - if (c != '\'') - { - namelen = skip_quoted (tokstart) - tokstart; - if (namelen > 2) - { - lexptr = tokstart + namelen; - unquoted_expr = 0; - if (lexptr[-1] != '\'') - error ("Unmatched single quote."); - namelen -= 2; - tokstart++; - goto tryname; - } - error ("Invalid character constant."); - } - return INT; - - case '(': - paren_depth++; - lexptr++; - return c; - - case ')': - if (paren_depth == 0) - return 0; - paren_depth--; - lexptr++; - return c; - - case ',': - if (comma_terminates && paren_depth == 0) - return 0; - lexptr++; - return c; - - case '.': - /* Might be a floating point number. */ - if (lexptr[1] < '0' || lexptr[1] > '9') - goto symbol; /* Nope, must be a symbol. */ - /* FALL THRU into number case. */ - - case '0': - case '1': - case '2': - case '3': - case '4': - case '5': - case '6': - case '7': - case '8': - case '9': - { - /* It's a number. */ - int got_dot = 0, got_e = 0, toktype; - register char *p = tokstart; - int hex = input_radix > 10; - - if (c == '0' && (p[1] == 'x' || p[1] == 'X')) - { - p += 2; - hex = 1; - } - else if (c == '0' && (p[1]=='t' || p[1]=='T' || p[1]=='d' || p[1]=='D')) - { - p += 2; - hex = 0; - } - - for (;; ++p) - { - /* This test includes !hex because 'e' is a valid hex digit - and thus does not indicate a floating point number when - the radix is hex. */ - if (!hex && !got_e && (*p == 'e' || *p == 'E')) - got_dot = got_e = 1; - /* This test does not include !hex, because a '.' always indicates - a decimal floating point number regardless of the radix. */ - else if (!got_dot && *p == '.') - got_dot = 1; - else if (got_e && (p[-1] == 'e' || p[-1] == 'E') - && (*p == '-' || *p == '+')) - /* This is the sign of the exponent, not the end of the - number. */ - continue; - /* We will take any letters or digits. parse_number will - complain if past the radix, or if L or U are not final. */ - else if ((*p < '0' || *p > '9') - && ((*p < 'a' || *p > 'z') - && (*p < 'A' || *p > 'Z'))) - break; - } - toktype = parse_number (tokstart, p - tokstart, got_dot|got_e, &yylval); - if (toktype == ERROR) - { - char *err_copy = (char *) alloca (p - tokstart + 1); - - memcpy (err_copy, tokstart, p - tokstart); - err_copy[p - tokstart] = 0; - error ("Invalid number \"%s\".", err_copy); - } - lexptr = p; - return toktype; - } - - case '+': - case '-': - case '*': - case '/': - case '%': - case '|': - case '&': - case '^': - case '~': - case '!': - case '@': - case '<': - case '>': - case '[': - case ']': - case '?': - case ':': - case '=': - case '{': - case '}': - symbol: - lexptr++; - return c; - - case '"': - - /* Build the gdb internal form of the input string in tempbuf, - translating any standard C escape forms seen. Note that the - buffer is null byte terminated *only* for the convenience of - debugging gdb itself and printing the buffer contents when - the buffer contains no embedded nulls. Gdb does not depend - upon the buffer being null byte terminated, it uses the length - string instead. This allows gdb to handle C strings (as well - as strings in other languages) with embedded null bytes */ - - tokptr = ++tokstart; - tempbufindex = 0; - - do { - /* Grow the static temp buffer if necessary, including allocating - the first one on demand. */ - if (tempbufindex + 1 >= tempbufsize) - { - tempbuf = (char *) xrealloc (tempbuf, tempbufsize += 64); - } - switch (*tokptr) - { - case '\0': - case '"': - /* Do nothing, loop will terminate. */ - break; - case '\\': - tokptr++; - c = parse_escape (&tokptr); - if (c == -1) - { - continue; - } - tempbuf[tempbufindex++] = c; - break; - default: - tempbuf[tempbufindex++] = *tokptr++; - break; - } - } while ((*tokptr != '"') && (*tokptr != '\0')); - if (*tokptr++ != '"') - { - error ("Unterminated string in expression."); - } - tempbuf[tempbufindex] = '\0'; /* See note above */ - yylval.sval.ptr = tempbuf; - yylval.sval.length = tempbufindex; - lexptr = tokptr; - return (STRING); - } - - if (!(c == '_' || c == '$' - || (c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z'))) - /* We must have come across a bad character (e.g. ';'). */ - error ("Invalid character '%c' in expression.", c); - - /* It's a name. See how long it is. */ - namelen = 0; - for (c = tokstart[namelen]; - (c == '_' || c == '$' || (c >= '0' && c <= '9') - || (c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z') || c == '<');) - { - /* Template parameter lists are part of the name. - FIXME: This mishandles `print $a<4&&$a>3'. */ - - if (c == '<') - { - if (hp_som_som_object_present) - { - /* Scan ahead to get rest of the template specification. Note - that we look ahead only when the '<' adjoins non-whitespace - characters; for comparison expressions, e.g. "a < b > c", - there must be spaces before the '<', etc. */ - - char * p = find_template_name_end (tokstart + namelen); - if (p) - namelen = p - tokstart; - break; - } - else - { - int i = namelen; - int nesting_level = 1; - while (tokstart[++i]) - { - if (tokstart[i] == '<') - nesting_level++; - else if (tokstart[i] == '>') - { - if (--nesting_level == 0) - break; - } - } - if (tokstart[i] == '>') - namelen = i; - else - break; - } - } - c = tokstart[++namelen]; - } - - /* The token "if" terminates the expression and is NOT - removed from the input stream. */ - if (namelen == 2 && tokstart[0] == 'i' && tokstart[1] == 'f') - { - return 0; - } - - lexptr += namelen; - - tryname: - - /* Catch specific keywords. Should be done with a data structure. */ - switch (namelen) - { - case 8: - if (STREQN (tokstart, "unsigned", 8)) - return UNSIGNED; - if (current_language->la_language == language_cplus - && STREQN (tokstart, "template", 8)) - return TEMPLATE; - if (STREQN (tokstart, "volatile", 8)) - return VOLATILE_KEYWORD; - break; - case 6: - if (STREQN (tokstart, "struct", 6)) - return STRUCT; - if (STREQN (tokstart, "signed", 6)) - return SIGNED_KEYWORD; - if (STREQN (tokstart, "sizeof", 6)) - return SIZEOF; - if (STREQN (tokstart, "double", 6)) - return DOUBLE_KEYWORD; - break; - case 5: - if (current_language->la_language == language_cplus) - { - if (STREQN (tokstart, "false", 5)) - return FALSEKEYWORD; - if (STREQN (tokstart, "class", 5)) - return CLASS; - } - if (STREQN (tokstart, "union", 5)) - return UNION; - if (STREQN (tokstart, "short", 5)) - return SHORT; - if (STREQN (tokstart, "const", 5)) - return CONST_KEYWORD; - break; - case 4: - if (STREQN (tokstart, "enum", 4)) - return ENUM; - if (STREQN (tokstart, "long", 4)) - return LONG; - if (current_language->la_language == language_cplus) - { - if (STREQN (tokstart, "true", 4)) - return TRUEKEYWORD; - - if (STREQN (tokstart, "this", 4)) - { - static const char this_name[] = - { CPLUS_MARKER, 't', 'h', 'i', 's', '\0' }; - - if (lookup_symbol (this_name, expression_context_block, - VAR_NAMESPACE, (int *) NULL, - (struct symtab **) NULL)) - return THIS; - } - } - break; - case 3: - if (STREQN (tokstart, "int", 3)) - return INT_KEYWORD; - break; - default: - break; - } - - yylval.sval.ptr = tokstart; - yylval.sval.length = namelen; - - if (*tokstart == '$') - { - write_dollar_variable (yylval.sval); - return VARIABLE; - } - - /* Look ahead and see if we can consume more of the input - string to get a reasonable class/namespace spec or a - fully-qualified name. This is a kludge to get around the - HP aCC compiler's generation of symbol names with embedded - colons for namespace and nested classes. */ - if (unquoted_expr) - { - /* Only do it if not inside single quotes */ - sym_class = parse_nested_classes_for_hpacc (yylval.sval.ptr, yylval.sval.length, - &token_string, &class_prefix, &lexptr); - if (sym_class) - { - /* Replace the current token with the bigger one we found */ - yylval.sval.ptr = token_string; - yylval.sval.length = strlen (token_string); - } - } - - /* Use token-type BLOCKNAME for symbols that happen to be defined as - functions or symtabs. If this is not so, then ... - Use token-type TYPENAME for symbols that happen to be defined - currently as names of types; NAME for other symbols. - The caller is not constrained to care about the distinction. */ - { - char *tmp = copy_name (yylval.sval); - struct symbol *sym; - int is_a_field_of_this = 0; - int hextype; - - sym = lookup_symbol (tmp, expression_context_block, - VAR_NAMESPACE, - current_language->la_language == language_cplus - ? &is_a_field_of_this : (int *) NULL, - (struct symtab **) NULL); - /* Call lookup_symtab, not lookup_partial_symtab, in case there are - no psymtabs (coff, xcoff, or some future change to blow away the - psymtabs once once symbols are read). */ - if (sym && SYMBOL_CLASS (sym) == LOC_BLOCK) - { - yylval.ssym.sym = sym; - yylval.ssym.is_a_field_of_this = is_a_field_of_this; - return BLOCKNAME; - } - else if (!sym) - { /* See if it's a file name. */ - struct symtab *symtab; - - symtab = lookup_symtab (tmp); - - if (symtab) - { - yylval.bval = BLOCKVECTOR_BLOCK (BLOCKVECTOR (symtab), STATIC_BLOCK); - return FILENAME; - } - } - - if (sym && SYMBOL_CLASS (sym) == LOC_TYPEDEF) - { -#if 1 - /* Despite the following flaw, we need to keep this code enabled. - Because we can get called from check_stub_method, if we don't - handle nested types then it screws many operations in any - program which uses nested types. */ - /* In "A::x", if x is a member function of A and there happens - to be a type (nested or not, since the stabs don't make that - distinction) named x, then this code incorrectly thinks we - are dealing with nested types rather than a member function. */ - - char *p; - char *namestart; - struct symbol *best_sym; - - /* Look ahead to detect nested types. This probably should be - done in the grammar, but trying seemed to introduce a lot - of shift/reduce and reduce/reduce conflicts. It's possible - that it could be done, though. Or perhaps a non-grammar, but - less ad hoc, approach would work well. */ - - /* Since we do not currently have any way of distinguishing - a nested type from a non-nested one (the stabs don't tell - us whether a type is nested), we just ignore the - containing type. */ - - p = lexptr; - best_sym = sym; - while (1) - { - /* Skip whitespace. */ - while (*p == ' ' || *p == '\t' || *p == '\n') - ++p; - if (*p == ':' && p[1] == ':') - { - /* Skip the `::'. */ - p += 2; - /* Skip whitespace. */ - while (*p == ' ' || *p == '\t' || *p == '\n') - ++p; - namestart = p; - while (*p == '_' || *p == '$' || (*p >= '0' && *p <= '9') - || (*p >= 'a' && *p <= 'z') - || (*p >= 'A' && *p <= 'Z')) - ++p; - if (p != namestart) - { - struct symbol *cur_sym; - /* As big as the whole rest of the expression, which is - at least big enough. */ - char *ncopy = alloca (strlen (tmp)+strlen (namestart)+3); - char *tmp1; - - tmp1 = ncopy; - memcpy (tmp1, tmp, strlen (tmp)); - tmp1 += strlen (tmp); - memcpy (tmp1, "::", 2); - tmp1 += 2; - memcpy (tmp1, namestart, p - namestart); - tmp1[p - namestart] = '\0'; - cur_sym = lookup_symbol (ncopy, expression_context_block, - VAR_NAMESPACE, (int *) NULL, - (struct symtab **) NULL); - if (cur_sym) - { - if (SYMBOL_CLASS (cur_sym) == LOC_TYPEDEF) - { - best_sym = cur_sym; - lexptr = p; - } - else - break; - } - else - break; - } - else - break; - } - else - break; - } - - yylval.tsym.type = SYMBOL_TYPE (best_sym); -#else /* not 0 */ - yylval.tsym.type = SYMBOL_TYPE (sym); -#endif /* not 0 */ - return TYPENAME; - } - if ((yylval.tsym.type = lookup_primitive_typename (tmp)) != 0) - return TYPENAME; - - /* Input names that aren't symbols but ARE valid hex numbers, - when the input radix permits them, can be names or numbers - depending on the parse. Note we support radixes > 16 here. */ - if (!sym && - ((tokstart[0] >= 'a' && tokstart[0] < 'a' + input_radix - 10) || - (tokstart[0] >= 'A' && tokstart[0] < 'A' + input_radix - 10))) - { - YYSTYPE newlval; /* Its value is ignored. */ - hextype = parse_number (tokstart, namelen, 0, &newlval); - if (hextype == INT) - { - yylval.ssym.sym = sym; - yylval.ssym.is_a_field_of_this = is_a_field_of_this; - return NAME_OR_INT; - } - } - - /* Any other kind of symbol */ - yylval.ssym.sym = sym; - yylval.ssym.is_a_field_of_this = is_a_field_of_this; - return NAME; - } -} - -void -yyerror (msg) - char *msg; -{ - error ("A %s in expression, near `%s'.", (msg ? msg : "error"), lexptr); -} diff --git a/contrib/gdb/gdb/callback.c b/contrib/gdb/gdb/callback.c deleted file mode 100644 index d59ecdabd7a1e..0000000000000 --- a/contrib/gdb/gdb/callback.c +++ /dev/null @@ -1,349 +0,0 @@ -/* Host callback routines for GDB. - Copyright 1995 Free Software Foundation, Inc. - Contributed by Cygnus Support. - - This file is part of GDB. - - 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 2 of the License, 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ - - -/* This file provides a standard way for targets to talk to the host OS - level. - - This interface will probably need a bit more banging to make it - smooth. Currently the simulator uses this file to provide the - callbacks for itself when it's built standalone, which is rather - ugly. */ - -#ifndef INSIDE_SIMULATOR -#include "defs.h" -#endif - -#include "ansidecl.h" -#include "callback.h" -#ifdef ANSI_PROTOTYPES -#include <stdarg.h> -#else -#include <varargs.h> -#endif - -#include <stdio.h> -#include <errno.h> -#include <fcntl.h> -#include <time.h> - - - -/* Set the callback copy of errno from what we see now. */ -static int -wrap (p, val) - host_callback *p; - int val; -{ - p->last_errno = errno; - return val; -} - -/* Make sure the FD provided is ok. If not, return non-zero - and set errno. */ - -static int -fdbad (p, fd) - host_callback *p; - int fd; -{ - if (fd < 0 || fd > MAX_CALLBACK_FDS || !p->fdopen[fd]) - { - p->last_errno = EINVAL; - return -1; - } - return 0; -} - -static int -fdmap (p, fd) - host_callback *p; - int fd; -{ - return p->fdmap[fd]; -} - -int -os_close (p, fd) - host_callback *p; - int fd; -{ - int result; - - result = fdbad (p, fd); - if (result) - return result; - result = wrap (p, close (fdmap (p, fd))); - return result; -} - -int -os_get_errno (p) - host_callback *p; -{ - /* !!! fixme, translate from host to taget errno value */ - return p->last_errno; -} - - -int -os_isatty (p, fd) - host_callback *p; - int fd; -{ - int result; - - result = fdbad (p, fd); - if (result) - return result; - result = wrap (p, isatty (fdmap (fd))); - return result; -} - -int -os_lseek (p, fd, off, way) - host_callback *p; - int fd; - long off; - int way; -{ - int result; - - result = fdbad (p, fd); - if (result) - return result; - result = lseek (fdmap (p, fd), off, way); - return result; -} - -int -os_open (p, name, flags) - host_callback *p; - const char *name; - int flags; -{ - int i; - for (i = 0; i < MAX_CALLBACK_FDS; i++) - { - if (!p->fdopen[i]) - { - int f = open (name, flags); - if (f < 0) - { - p->last_errno = errno; - return f; - } - p->fdopen[i] = 1; - p->fdmap[i] = f; - return i; - } - } - p->last_errno = EMFILE; - return -1; -} - -int -os_read (p, fd, buf, len) - host_callback *p; - int fd; - char *buf; - int len; -{ - int result; - - result = fdbad (p, fd); - if (result) - return result; - result = wrap (p, read (fdmap (p, fd), buf, len)); - return result; -} - -int -os_read_stdin (p, buf, len) - host_callback *p; - char *buf; - int len; -{ - return wrap (p, read (0, buf, len)); -} - -int -os_write (p, fd, buf, len) - host_callback *p; - int fd; - const char *buf; - int len; -{ - int result; - - result = fdbad (p, fd); - if (result) - return result; - result = wrap (p, write (fdmap (p, fd), buf, len)); - return result; -} - -/* ignore the grossness of INSIDE_SIMULATOR, it will go away one day. */ -int -os_write_stdout (p, buf, len) - host_callback *p; - const char *buf; - int len; -{ -#ifdef INSIDE_SIMULATOR - return os_write (p, 1, buf, len); -#else - int i; - char b[2]; - for (i = 0; i< len; i++) - { - b[0] = buf[i]; - b[1] = 0; - if (target_output_hook) - target_output_hook (b); - else - fputs_filtered (b, gdb_stdout); - } - return len; -#endif -} - -int -os_rename (p, f1, f2) - host_callback *p; - const char *f1; - const char *f2; -{ - return wrap (p, rename (f1, f2)); -} - - -int -os_system (p, s) - host_callback *p; - const char *s; -{ - return wrap (p, system (s)); -} - -long -os_time (p, t) - host_callback *p; - long *t; -{ - return wrap (p, time (t)); -} - - -int -os_unlink (p, f1) - host_callback *p; - const char *f1; -{ - return wrap (p, unlink (f1)); -} - - -int -os_shutdown (p) -host_callback *p; -{ - int i; - for (i = 0; i < MAX_CALLBACK_FDS; i++) - { - if (p->fdopen[i] && !p->alwaysopen[i]) { - close (p->fdmap[i]); - p->fdopen[i] = 0; - } - } - return 1; -} - -int os_init(p) -host_callback *p; -{ - int i; - os_shutdown (p); - for (i= 0; i < 3; i++) - { - p->fdmap[i] = i; - p->fdopen[i] = 1; - p->alwaysopen[i] = 1; - } - return 1; -} - - -/* !!fixme!! - This bit is ugly. When the interface has settled down I'll - move the whole file into sim/common and remove this bit. */ - -/* VARARGS */ -void -#ifdef ANSI_PROTOTYPES -os_printf_filtered (host_callback *p, const char *format, ...) -#else -os_printf_filtered (p, va_alist) - host_callback *p; - va_dcl -#endif -{ - va_list args; -#ifdef ANSI_PROTOTYPES - va_start (args, format); -#else - char *format; - - va_start (args); - format = va_arg (args, char *); -#endif - -#ifdef INSIDE_SIMULATOR - vprintf (format, args); -#else - vfprintf_filtered (stdout, format, args); -#endif - - va_end (args); -} - -host_callback default_callback = -{ - os_close, - os_get_errno, - os_isatty, - os_lseek, - os_open, - os_read, - os_read_stdin, - os_rename, - os_system, - os_time, - os_unlink, - os_write, - os_write_stdout, - - os_shutdown, - os_init, - - os_printf_filtered, - - 0, /* last errno */ -}; diff --git a/contrib/gdb/gdb/callback.h b/contrib/gdb/gdb/callback.h deleted file mode 100644 index b97c3b2ce81e5..0000000000000 --- a/contrib/gdb/gdb/callback.h +++ /dev/null @@ -1,41 +0,0 @@ -#ifndef CALLBACK_H -#define CALLBACK_H -typedef struct host_callback_struct host_callback; - -#define MAX_CALLBACK_FDS 10 - -struct host_callback_struct -{ - int (*close) PARAMS ((host_callback *,int)); - int (*get_errno) PARAMS ((host_callback *)); - int (*isatty) PARAMS ((host_callback *, int)); - int (*lseek) PARAMS ((host_callback *, int, long , int)); - int (*open) PARAMS ((host_callback *, const char*, int mode)); - int (*read) PARAMS ((host_callback *,int, char *, int)); - int (*read_stdin) PARAMS (( host_callback *, char *, int)); - int (*rename) PARAMS ((host_callback *, const char *, const char *)); - int (*system) PARAMS ((host_callback *, const char *)); - long (*time) PARAMS ((host_callback *, long *)); - int (*unlink) PARAMS ((host_callback *, const char *)); - int (*write) PARAMS ((host_callback *,int, const char *, int)); - int (*write_stdout) PARAMS ((host_callback *, const char *, int)); - - - /* Used when the target has gone away, so we can close open - handles and free memory etc etc. */ - int (*shutdown) PARAMS ((host_callback *)); - int (*init) PARAMS ((host_callback *)); - - /* Talk to the user on a console. */ - void (*printf_filtered) PARAMS ((host_callback *, const char *, ...)); - - int last_errno; /* host format */ - - int fdmap[MAX_CALLBACK_FDS]; - char fdopen[MAX_CALLBACK_FDS]; - char alwaysopen[MAX_CALLBACK_FDS]; -}; -#endif - - -extern host_callback default_callback; diff --git a/contrib/gdb/gdb/command.c b/contrib/gdb/gdb/command.c deleted file mode 100644 index 58af56701f5f4..0000000000000 --- a/contrib/gdb/gdb/command.c +++ /dev/null @@ -1,1564 +0,0 @@ -/* Handle lists of commands, their decoding and documentation, for GDB. - Copyright 1986, 1989, 1990, 1991, 1998 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 2 of the License, 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ - -#include "defs.h" -#include "gdbcmd.h" -#include "symtab.h" -#include "value.h" -#include <ctype.h> -#include "gdb_string.h" -#ifdef HAVE_UNISTD_H -#include <unistd.h> -#endif - -#ifdef HAVE_WAIT_H -# include <wait.h> -#else -# ifdef HAVE_SYS_WAIT_H -# include <sys/wait.h> -# endif -#endif - -#include "wait.h" - -/* Prototypes for local functions */ - -static void undef_cmd_error PARAMS ((char *, char *)); - -static void show_user PARAMS ((char *, int)); - -static void show_user_1 PARAMS ((struct cmd_list_element *, GDB_FILE *)); - -static void make_command PARAMS ((char *, int)); - -static void shell_escape PARAMS ((char *, int)); - -static int parse_binary_operation PARAMS ((char *)); - -static void print_doc_line PARAMS ((GDB_FILE *, char *)); - -void _initialize_command PARAMS ((void)); - -/* Add element named NAME. - CLASS is the top level category into which commands are broken down - for "help" purposes. - FUN should be the function to execute the command; - it will get a character string as argument, with leading - and trailing blanks already eliminated. - - DOC is a documentation string for the command. - Its first line should be a complete sentence. - It should start with ? for a command that is an abbreviation - or with * for a command that most users don't need to know about. - - Add this command to command list *LIST. - - Returns a pointer to the added command (not necessarily the head - of *LIST). */ - -struct cmd_list_element * -add_cmd (name, class, fun, doc, list) - char *name; - enum command_class class; - void (*fun) PARAMS ((char *, int)); - char *doc; - struct cmd_list_element **list; -{ - register struct cmd_list_element *c - = (struct cmd_list_element *) xmalloc (sizeof (struct cmd_list_element)); - struct cmd_list_element *p; - - delete_cmd (name, list); - - if (*list == NULL || STRCMP ((*list)->name, name) >= 0) - { - c->next = *list; - *list = c; - } - else - { - p = *list; - while (p->next && STRCMP (p->next->name, name) <= 0) - { - p = p->next; - } - c->next = p->next; - p->next = c; - } - - c->name = name; - c->class = class; - c->function.cfunc = fun; - c->doc = doc; - c->hook = NULL; - c->prefixlist = NULL; - c->prefixname = NULL; - c->allow_unknown = 0; - c->abbrev_flag = 0; - c->completer = make_symbol_completion_list; - c->type = not_set_cmd; - c->var = NULL; - c->var_type = var_boolean; - c->enums = NULL; - c->user_commands = NULL; - c->hookee = NULL; - c->cmd_pointer = NULL; - - return c; -} - -/* Same as above, except that the abbrev_flag is set. */ - -#if 0 /* Currently unused */ - -struct cmd_list_element * -add_abbrev_cmd (name, class, fun, doc, list) - char *name; - enum command_class class; - void (*fun) PARAMS ((char *, int)); - char *doc; - struct cmd_list_element **list; -{ - register struct cmd_list_element *c - = add_cmd (name, class, fun, doc, list); - - c->abbrev_flag = 1; - return c; -} - -#endif - -struct cmd_list_element * -add_alias_cmd (name, oldname, class, abbrev_flag, list) - char *name; - char *oldname; - enum command_class class; - int abbrev_flag; - struct cmd_list_element **list; -{ - /* Must do this since lookup_cmd tries to side-effect its first arg */ - char *copied_name; - register struct cmd_list_element *old; - register struct cmd_list_element *c; - copied_name = (char *) alloca (strlen (oldname) + 1); - strcpy (copied_name, oldname); - old = lookup_cmd (&copied_name, *list, "", 1, 1); - - if (old == 0) - { - delete_cmd (name, list); - return 0; - } - - c = add_cmd (name, class, old->function.cfunc, old->doc, list); - c->prefixlist = old->prefixlist; - c->prefixname = old->prefixname; - c->allow_unknown = old->allow_unknown; - c->abbrev_flag = abbrev_flag; - c->cmd_pointer = old; - return c; -} - -/* Like add_cmd but adds an element for a command prefix: - a name that should be followed by a subcommand to be looked up - in another command list. PREFIXLIST should be the address - of the variable containing that list. */ - -struct cmd_list_element * -add_prefix_cmd (name, class, fun, doc, prefixlist, prefixname, - allow_unknown, list) - char *name; - enum command_class class; - void (*fun) PARAMS ((char *, int)); - char *doc; - struct cmd_list_element **prefixlist; - char *prefixname; - int allow_unknown; - struct cmd_list_element **list; -{ - register struct cmd_list_element *c = add_cmd (name, class, fun, doc, list); - c->prefixlist = prefixlist; - c->prefixname = prefixname; - c->allow_unknown = allow_unknown; - return c; -} - -/* Like add_prefix_cmd but sets the abbrev_flag on the new command. */ - -struct cmd_list_element * -add_abbrev_prefix_cmd (name, class, fun, doc, prefixlist, prefixname, - allow_unknown, list) - char *name; - enum command_class class; - void (*fun) PARAMS ((char *, int)); - char *doc; - struct cmd_list_element **prefixlist; - char *prefixname; - int allow_unknown; - struct cmd_list_element **list; -{ - register struct cmd_list_element *c = add_cmd (name, class, fun, doc, list); - c->prefixlist = prefixlist; - c->prefixname = prefixname; - c->allow_unknown = allow_unknown; - c->abbrev_flag = 1; - return c; -} - -/* This is an empty "cfunc". */ -void -not_just_help_class_command (args, from_tty) - char *args; - int from_tty; -{ -} - -/* This is an empty "sfunc". */ -static void empty_sfunc PARAMS ((char *, int, struct cmd_list_element *)); - -static void -empty_sfunc (args, from_tty, c) - char *args; - int from_tty; - struct cmd_list_element *c; -{ -} - -/* Add element named NAME to command list LIST (the list for set - or some sublist thereof). - CLASS is as in add_cmd. - VAR_TYPE is the kind of thing we are setting. - VAR is address of the variable being controlled by this command. - DOC is the documentation string. */ - -struct cmd_list_element * -add_set_cmd (name, class, var_type, var, doc, list) - char *name; - enum command_class class; - var_types var_type; - char *var; - char *doc; - struct cmd_list_element **list; -{ - struct cmd_list_element *c - = add_cmd (name, class, NO_FUNCTION, doc, list); - - c->type = set_cmd; - c->var_type = var_type; - c->var = var; - /* This needs to be something besides NO_FUNCTION so that this isn't - treated as a help class. */ - c->function.sfunc = empty_sfunc; - return c; -} - -/* Add element named NAME to command list LIST (the list for set - or some sublist thereof). - CLASS is as in add_cmd. - ENUMLIST is a list of strings which may follow NAME. - VAR is address of the variable which will contain the matching string - (from ENUMLIST). - DOC is the documentation string. */ - -struct cmd_list_element * -add_set_enum_cmd (name, class, enumlist, var, doc, list) - char *name; - enum command_class class; - char *enumlist[]; - char *var; - char *doc; - struct cmd_list_element **list; -{ - struct cmd_list_element *c - = add_set_cmd (name, class, var_enum, var, doc, list); - c->enums = enumlist; - - return c; -} - -/* Where SETCMD has already been added, add the corresponding show - command to LIST and return a pointer to the added command (not - necessarily the head of LIST). */ -struct cmd_list_element * -add_show_from_set (setcmd, list) - struct cmd_list_element *setcmd; - struct cmd_list_element **list; -{ - struct cmd_list_element *showcmd = - (struct cmd_list_element *) xmalloc (sizeof (struct cmd_list_element)); - struct cmd_list_element *p; - - memcpy (showcmd, setcmd, sizeof (struct cmd_list_element)); - delete_cmd (showcmd->name, list); - showcmd->type = show_cmd; - - /* Replace "set " at start of docstring with "show ". */ - if (setcmd->doc[0] == 'S' && setcmd->doc[1] == 'e' - && setcmd->doc[2] == 't' && setcmd->doc[3] == ' ') - showcmd->doc = concat ("Show ", setcmd->doc + 4, NULL); - else - fprintf_unfiltered (gdb_stderr, "GDB internal error: Bad docstring for set command\n"); - - if (*list == NULL || STRCMP ((*list)->name, showcmd->name) >= 0) - { - showcmd->next = *list; - *list = showcmd; - } - else - { - p = *list; - while (p->next && STRCMP (p->next->name, showcmd->name) <= 0) - { - p = p->next; - } - showcmd->next = p->next; - p->next = showcmd; - } - - return showcmd; -} - -/* Remove the command named NAME from the command list. */ - -void -delete_cmd (name, list) - char *name; - struct cmd_list_element **list; -{ - register struct cmd_list_element *c; - struct cmd_list_element *p; - - while (*list && STREQ ((*list)->name, name)) - { - if ((*list)->hookee) - (*list)->hookee->hook = 0; /* Hook slips out of its mouth */ - p = (*list)->next; - free ((PTR)*list); - *list = p; - } - - if (*list) - for (c = *list; c->next;) - { - if (STREQ (c->next->name, name)) - { - if (c->next->hookee) - c->next->hookee->hook = 0; /* hooked cmd gets away. */ - p = c->next->next; - free ((PTR)c->next); - c->next = p; - } - else - c = c->next; - } -} - -/* This command really has to deal with two things: - * 1) I want documentation on *this string* (usually called by - * "help commandname"). - * 2) I want documentation on *this list* (usually called by - * giving a command that requires subcommands. Also called by saying - * just "help".) - * - * I am going to split this into two seperate comamnds, help_cmd and - * help_list. - */ - -void -help_cmd (command, stream) - char *command; - GDB_FILE *stream; -{ - struct cmd_list_element *c; - extern struct cmd_list_element *cmdlist; - - if (!command) - { - help_list (cmdlist, "", all_classes, stream); - return; - } - - c = lookup_cmd (&command, cmdlist, "", 0, 0); - - if (c == 0) - return; - - /* There are three cases here. - If c->prefixlist is nonzero, we have a prefix command. - Print its documentation, then list its subcommands. - - If c->function is nonzero, we really have a command. - Print its documentation and return. - - If c->function is zero, we have a class name. - Print its documentation (as if it were a command) - and then set class to the number of this class - so that the commands in the class will be listed. */ - - fputs_filtered (c->doc, stream); - fputs_filtered ("\n", stream); - - if (c->prefixlist == 0 && c->function.cfunc != NULL) - return; - fprintf_filtered (stream, "\n"); - - /* If this is a prefix command, print it's subcommands */ - if (c->prefixlist) - help_list (*c->prefixlist, c->prefixname, all_commands, stream); - - /* If this is a class name, print all of the commands in the class */ - if (c->function.cfunc == NULL) - help_list (cmdlist, "", c->class, stream); - - if (c->hook) - fprintf_filtered (stream, "\nThis command has a hook defined: %s\n", - c->hook->name); -} - -/* - * Get a specific kind of help on a command list. - * - * LIST is the list. - * CMDTYPE is the prefix to use in the title string. - * CLASS is the class with which to list the nodes of this list (see - * documentation for help_cmd_list below), As usual, ALL_COMMANDS for - * everything, ALL_CLASSES for just classes, and non-negative for only things - * in a specific class. - * and STREAM is the output stream on which to print things. - * If you call this routine with a class >= 0, it recurses. - */ -void -help_list (list, cmdtype, class, stream) - struct cmd_list_element *list; - char *cmdtype; - enum command_class class; - GDB_FILE *stream; -{ - int len; - char *cmdtype1, *cmdtype2; - - /* If CMDTYPE is "foo ", CMDTYPE1 gets " foo" and CMDTYPE2 gets "foo sub" */ - len = strlen (cmdtype); - cmdtype1 = (char *) alloca (len + 1); - cmdtype1[0] = 0; - cmdtype2 = (char *) alloca (len + 4); - cmdtype2[0] = 0; - if (len) - { - cmdtype1[0] = ' '; - strncpy (cmdtype1 + 1, cmdtype, len - 1); - cmdtype1[len] = 0; - strncpy (cmdtype2, cmdtype, len - 1); - strcpy (cmdtype2 + len - 1, " sub"); - } - - if (class == all_classes) - fprintf_filtered (stream, "List of classes of %scommands:\n\n", cmdtype2); - else - fprintf_filtered (stream, "List of %scommands:\n\n", cmdtype2); - - help_cmd_list (list, class, cmdtype, (int)class >= 0, stream); - - if (class == all_classes) - fprintf_filtered (stream, "\n\ -Type \"help%s\" followed by a class name for a list of commands in that class.", - cmdtype1); - - fprintf_filtered (stream, "\n\ -Type \"help%s\" followed by %scommand name for full documentation.\n\ -Command name abbreviations are allowed if unambiguous.\n", - cmdtype1, cmdtype2); -} - -/* Print only the first line of STR on STREAM. */ -static void -print_doc_line (stream, str) - GDB_FILE *stream; - char *str; -{ - static char *line_buffer = 0; - static int line_size; - register char *p; - - if (!line_buffer) - { - line_size = 80; - line_buffer = (char *) xmalloc (line_size); - } - - p = str; - while (*p && *p != '\n' && *p != '.' && *p != ',') - p++; - if (p - str > line_size - 1) - { - line_size = p - str + 1; - free ((PTR)line_buffer); - line_buffer = (char *) xmalloc (line_size); - } - strncpy (line_buffer, str, p - str); - line_buffer[p - str] = '\0'; - if (islower (line_buffer[0])) - line_buffer[0] = toupper (line_buffer[0]); - fputs_filtered (line_buffer, stream); -} - -/* - * Implement a help command on command list LIST. - * RECURSE should be non-zero if this should be done recursively on - * all sublists of LIST. - * PREFIX is the prefix to print before each command name. - * STREAM is the stream upon which the output should be written. - * CLASS should be: - * A non-negative class number to list only commands in that - * class. - * ALL_COMMANDS to list all commands in list. - * ALL_CLASSES to list all classes in list. - * - * Note that RECURSE will be active on *all* sublists, not just the - * ones selected by the criteria above (ie. the selection mechanism - * is at the low level, not the high-level). - */ -void -help_cmd_list (list, class, prefix, recurse, stream) - struct cmd_list_element *list; - enum command_class class; - char *prefix; - int recurse; - GDB_FILE *stream; -{ - register struct cmd_list_element *c; - - for (c = list; c; c = c->next) - { - if (c->abbrev_flag == 0 && - (class == all_commands - || (class == all_classes && c->function.cfunc == NULL) - || (class == c->class && c->function.cfunc != NULL))) - { - fprintf_filtered (stream, "%s%s -- ", prefix, c->name); - print_doc_line (stream, c->doc); - fputs_filtered ("\n", stream); - } - if (recurse - && c->prefixlist != 0 - && c->abbrev_flag == 0) - help_cmd_list (*c->prefixlist, class, c->prefixname, 1, stream); - } -} - - -/* Search the input clist for 'command'. Return the command if - found (or NULL if not), and return the number of commands - found in nfound */ - -static struct cmd_list_element * -find_cmd(command, len, clist, ignore_help_classes, nfound) - char *command; - struct cmd_list_element *clist; - int ignore_help_classes; - int *nfound; -{ - struct cmd_list_element *found, *c; - - found = (struct cmd_list_element *)NULL; - *nfound = 0; - for (c = clist; c; c = c->next) - if (!strncmp (command, c->name, len) - && (!ignore_help_classes || c->function.cfunc)) - { - found = c; - (*nfound)++; - if (c->name[len] == '\0') - { - *nfound = 1; - break; - } - } - return found; -} - -/* This routine takes a line of TEXT and a CLIST in which to start the - lookup. When it returns it will have incremented the text pointer past - the section of text it matched, set *RESULT_LIST to point to the list in - which the last word was matched, and will return a pointer to the cmd - list element which the text matches. It will return NULL if no match at - all was possible. It will return -1 (cast appropriately, ick) if ambigous - matches are possible; in this case *RESULT_LIST will be set to point to - the list in which there are ambiguous choices (and *TEXT will be set to - the ambiguous text string). - - If the located command was an abbreviation, this routine returns the base - command of the abbreviation. - - It does no error reporting whatsoever; control will always return - to the superior routine. - - In the case of an ambiguous return (-1), *RESULT_LIST will be set to point - at the prefix_command (ie. the best match) *or* (special case) will be NULL - if no prefix command was ever found. For example, in the case of "info a", - "info" matches without ambiguity, but "a" could be "args" or "address", so - *RESULT_LIST is set to the cmd_list_element for "info". So in this case - RESULT_LIST should not be interpeted as a pointer to the beginning of a - list; it simply points to a specific command. In the case of an ambiguous - return *TEXT is advanced past the last non-ambiguous prefix (e.g. - "info t" can be "info types" or "info target"; upon return *TEXT has been - advanced past "info "). - - If RESULT_LIST is NULL, don't set *RESULT_LIST (but don't otherwise - affect the operation). - - This routine does *not* modify the text pointed to by TEXT. - - If IGNORE_HELP_CLASSES is nonzero, ignore any command list elements which - are actually help classes rather than commands (i.e. the function field of - the struct cmd_list_element is NULL). */ - -struct cmd_list_element * -lookup_cmd_1 (text, clist, result_list, ignore_help_classes) - char **text; - struct cmd_list_element *clist, **result_list; - int ignore_help_classes; -{ - char *p, *command; - int len, tmp, nfound; - struct cmd_list_element *found, *c; - - while (**text == ' ' || **text == '\t') - (*text)++; - - /* Treating underscores as part of command words is important - so that "set args_foo()" doesn't get interpreted as - "set args _foo()". */ - for (p = *text; - *p && (isalnum(*p) || *p == '-' || *p == '_' || - (tui_version && - (*p == '+' || *p == '<' || *p == '>' || *p == '$')) || - (xdb_commands && (*p == '!' || *p == '/' || *p == '?'))); - p++) - ; - - /* If nothing but whitespace, return 0. */ - if (p == *text) - return 0; - - len = p - *text; - - /* *text and p now bracket the first command word to lookup (and - it's length is len). We copy this into a local temporary */ - - - command = (char *) alloca (len + 1); - for (tmp = 0; tmp < len; tmp++) - { - char x = (*text)[tmp]; - command[tmp] = x; - } - command[len] = '\0'; - - /* Look it up. */ - found = 0; - nfound = 0; - found = find_cmd(command, len, clist, ignore_help_classes, &nfound); - - /* - ** We didn't find the command in the entered case, so lower case it - ** and search again. - */ - if (!found || nfound == 0) - { - for (tmp = 0; tmp < len; tmp++) - { - char x = command[tmp]; - command[tmp] = isupper(x) ? tolower(x) : x; - } - found = find_cmd(command, len, clist, ignore_help_classes, &nfound); - } - - /* If nothing matches, we have a simple failure. */ - if (nfound == 0) - return 0; - - if (nfound > 1) - { - if (result_list != NULL) - /* Will be modified in calling routine - if we know what the prefix command is. */ - *result_list = 0; - return (struct cmd_list_element *) -1; /* Ambiguous. */ - } - - /* We've matched something on this list. Move text pointer forward. */ - - *text = p; - - /* If this was an abbreviation, use the base command instead. */ - - if (found->cmd_pointer) - found = found->cmd_pointer; - - /* If we found a prefix command, keep looking. */ - - if (found->prefixlist) - { - c = lookup_cmd_1 (text, *found->prefixlist, result_list, - ignore_help_classes); - if (!c) - { - /* Didn't find anything; this is as far as we got. */ - if (result_list != NULL) - *result_list = clist; - return found; - } - else if (c == (struct cmd_list_element *) -1) - { - /* We've gotten this far properly, but the next step - is ambiguous. We need to set the result list to the best - we've found (if an inferior hasn't already set it). */ - if (result_list != NULL) - if (!*result_list) - /* This used to say *result_list = *found->prefixlist - If that was correct, need to modify the documentation - at the top of this function to clarify what is supposed - to be going on. */ - *result_list = found; - return c; - } - else - { - /* We matched! */ - return c; - } - } - else - { - if (result_list != NULL) - *result_list = clist; - return found; - } -} - -/* All this hair to move the space to the front of cmdtype */ - -static void -undef_cmd_error (cmdtype, q) - char *cmdtype, *q; -{ - error ("Undefined %scommand: \"%s\". Try \"help%s%.*s\".", - cmdtype, - q, - *cmdtype? " ": "", - strlen(cmdtype)-1, - cmdtype); -} - -/* Look up the contents of *LINE as a command in the command list LIST. - LIST is a chain of struct cmd_list_element's. - If it is found, return the struct cmd_list_element for that command - and update *LINE to point after the command name, at the first argument. - If not found, call error if ALLOW_UNKNOWN is zero - otherwise (or if error returns) return zero. - Call error if specified command is ambiguous, - unless ALLOW_UNKNOWN is negative. - CMDTYPE precedes the word "command" in the error message. - - If INGNORE_HELP_CLASSES is nonzero, ignore any command list - elements which are actually help classes rather than commands (i.e. - the function field of the struct cmd_list_element is 0). */ - -struct cmd_list_element * -lookup_cmd (line, list, cmdtype, allow_unknown, ignore_help_classes) - char **line; - struct cmd_list_element *list; - char *cmdtype; - int allow_unknown; - int ignore_help_classes; -{ - struct cmd_list_element *last_list = 0; - struct cmd_list_element *c = - lookup_cmd_1 (line, list, &last_list, ignore_help_classes); -#if 0 - /* This is wrong for complete_command. */ - char *ptr = (*line) + strlen (*line) - 1; - - /* Clear off trailing whitespace. */ - while (ptr >= *line && (*ptr == ' ' || *ptr == '\t')) - ptr--; - *(ptr + 1) = '\0'; -#endif - - if (!c) - { - if (!allow_unknown) - { - if (!*line) - error ("Lack of needed %scommand", cmdtype); - else - { - char *p = *line, *q; - - while (isalnum(*p) || *p == '-') - p++; - - q = (char *) alloca (p - *line + 1); - strncpy (q, *line, p - *line); - q[p - *line] = '\0'; - undef_cmd_error (cmdtype, q); - } - } - else - return 0; - } - else if (c == (struct cmd_list_element *) -1) - { - /* Ambigous. Local values should be off prefixlist or called - values. */ - int local_allow_unknown = (last_list ? last_list->allow_unknown : - allow_unknown); - char *local_cmdtype = last_list ? last_list->prefixname : cmdtype; - struct cmd_list_element *local_list = - (last_list ? *(last_list->prefixlist) : list); - - if (local_allow_unknown < 0) - { - if (last_list) - return last_list; /* Found something. */ - else - return 0; /* Found nothing. */ - } - else - { - /* Report as error. */ - int amb_len; - char ambbuf[100]; - - for (amb_len = 0; - ((*line)[amb_len] && (*line)[amb_len] != ' ' - && (*line)[amb_len] != '\t'); - amb_len++) - ; - - ambbuf[0] = 0; - for (c = local_list; c; c = c->next) - if (!strncmp (*line, c->name, amb_len)) - { - if (strlen (ambbuf) + strlen (c->name) + 6 < (int)sizeof ambbuf) - { - if (strlen (ambbuf)) - strcat (ambbuf, ", "); - strcat (ambbuf, c->name); - } - else - { - strcat (ambbuf, ".."); - break; - } - } - error ("Ambiguous %scommand \"%s\": %s.", local_cmdtype, - *line, ambbuf); - return 0; /* lint */ - } - } - else - { - /* We've got something. It may still not be what the caller - wants (if this command *needs* a subcommand). */ - while (**line == ' ' || **line == '\t') - (*line)++; - - if (c->prefixlist && **line && !c->allow_unknown) - undef_cmd_error (c->prefixname, *line); - - /* Seems to be what he wants. Return it. */ - return c; - } - return 0; -} - -#if 0 -/* Look up the contents of *LINE as a command in the command list LIST. - LIST is a chain of struct cmd_list_element's. - If it is found, return the struct cmd_list_element for that command - and update *LINE to point after the command name, at the first argument. - If not found, call error if ALLOW_UNKNOWN is zero - otherwise (or if error returns) return zero. - Call error if specified command is ambiguous, - unless ALLOW_UNKNOWN is negative. - CMDTYPE precedes the word "command" in the error message. */ - -struct cmd_list_element * -lookup_cmd (line, list, cmdtype, allow_unknown) - char **line; - struct cmd_list_element *list; - char *cmdtype; - int allow_unknown; -{ - register char *p; - register struct cmd_list_element *c, *found; - int nfound; - char ambbuf[100]; - char *processed_cmd; - int i, cmd_len; - - /* Skip leading whitespace. */ - - while (**line == ' ' || **line == '\t') - (*line)++; - - /* Clear out trailing whitespace. */ - - p = *line + strlen (*line); - while (p != *line && (p[-1] == ' ' || p[-1] == '\t')) - p--; - *p = 0; - - /* Find end of command name. */ - - p = *line; - while (*p == '-' || isalnum(*p)) - p++; - - /* Look up the command name. - If exact match, keep that. - Otherwise, take command abbreviated, if unique. Note that (in my - opinion) a null string does *not* indicate ambiguity; simply the - end of the argument. */ - - if (p == *line) - { - if (!allow_unknown) - error ("Lack of needed %scommand", cmdtype); - return 0; - } - - /* Copy over to a local buffer, converting to lowercase on the way. - This is in case the command being parsed is a subcommand which - doesn't match anything, and that's ok. We want the original - untouched for the routine of the original command. */ - - processed_cmd = (char *) alloca (p - *line + 1); - for (cmd_len = 0; cmd_len < p - *line; cmd_len++) - { - char x = (*line)[cmd_len]; - if (isupper(x)) - processed_cmd[cmd_len] = tolower(x); - else - processed_cmd[cmd_len] = x; - } - processed_cmd[cmd_len] = '\0'; - - /* Check all possibilities in the current command list. */ - found = 0; - nfound = 0; - for (c = list; c; c = c->next) - { - if (!strncmp (processed_cmd, c->name, cmd_len)) - { - found = c; - nfound++; - if (c->name[cmd_len] == 0) - { - nfound = 1; - break; - } - } - } - - /* Report error for undefined command name. */ - - if (nfound != 1) - { - if (nfound > 1 && allow_unknown >= 0) - { - ambbuf[0] = 0; - for (c = list; c; c = c->next) - if (!strncmp (processed_cmd, c->name, cmd_len)) - { - if (strlen (ambbuf) + strlen (c->name) + 6 < sizeof ambbuf) - { - if (strlen (ambbuf)) - strcat (ambbuf, ", "); - strcat (ambbuf, c->name); - } - else - { - strcat (ambbuf, ".."); - break; - } - } - error ("Ambiguous %scommand \"%s\": %s.", cmdtype, - processed_cmd, ambbuf); - } - else if (!allow_unknown) - error ("Undefined %scommand: \"%s\".", cmdtype, processed_cmd); - return 0; - } - - /* Skip whitespace before the argument. */ - - while (*p == ' ' || *p == '\t') p++; - *line = p; - - if (found->prefixlist && *p) - { - c = lookup_cmd (line, *found->prefixlist, found->prefixname, - found->allow_unknown); - if (c) - return c; - } - - return found; -} -#endif - -/* Helper function for SYMBOL_COMPLETION_FUNCTION. */ - -/* Return a vector of char pointers which point to the different - possible completions in LIST of TEXT. - - WORD points in the same buffer as TEXT, and completions should be - returned relative to this position. For example, suppose TEXT is "foo" - and we want to complete to "foobar". If WORD is "oo", return - "oobar"; if WORD is "baz/foo", return "baz/foobar". */ - -char ** -complete_on_cmdlist (list, text, word) - struct cmd_list_element *list; - char *text; - char *word; -{ - struct cmd_list_element *ptr; - char **matchlist; - int sizeof_matchlist; - int matches; - int textlen = strlen (text); - - sizeof_matchlist = 10; - matchlist = (char **) xmalloc (sizeof_matchlist * sizeof (char *)); - matches = 0; - - for (ptr = list; ptr; ptr = ptr->next) - if (!strncmp (ptr->name, text, textlen) - && !ptr->abbrev_flag - && (ptr->function.cfunc - || ptr->prefixlist)) - { - if (matches == sizeof_matchlist) - { - sizeof_matchlist *= 2; - matchlist = (char **) xrealloc ((char *)matchlist, - (sizeof_matchlist - * sizeof (char *))); - } - - matchlist[matches] = (char *) - xmalloc (strlen (word) + strlen (ptr->name) + 1); - if (word == text) - strcpy (matchlist[matches], ptr->name); - else if (word > text) - { - /* Return some portion of ptr->name. */ - strcpy (matchlist[matches], ptr->name + (word - text)); - } - else - { - /* Return some of text plus ptr->name. */ - strncpy (matchlist[matches], word, text - word); - matchlist[matches][text - word] = '\0'; - strcat (matchlist[matches], ptr->name); - } - ++matches; - } - - if (matches == 0) - { - free ((PTR)matchlist); - matchlist = 0; - } - else - { - matchlist = (char **) xrealloc ((char *)matchlist, ((matches + 1) - * sizeof (char *))); - matchlist[matches] = (char *) 0; - } - - return matchlist; -} - -/* Helper function for SYMBOL_COMPLETION_FUNCTION. */ - -/* Return a vector of char pointers which point to the different - possible completions in CMD of TEXT. - - WORD points in the same buffer as TEXT, and completions should be - returned relative to this position. For example, suppose TEXT is "foo" - and we want to complete to "foobar". If WORD is "oo", return - "oobar"; if WORD is "baz/foo", return "baz/foobar". */ - -char ** -complete_on_enum (enumlist, text, word) - char **enumlist; - char *text; - char *word; -{ - char **matchlist; - int sizeof_matchlist; - int matches; - int textlen = strlen (text); - int i; - char *name; - - sizeof_matchlist = 10; - matchlist = (char **) xmalloc (sizeof_matchlist * sizeof (char *)); - matches = 0; - - for (i = 0; (name = enumlist[i]) != NULL; i++) - if (strncmp (name, text, textlen) == 0) - { - if (matches == sizeof_matchlist) - { - sizeof_matchlist *= 2; - matchlist = (char **) xrealloc ((char *)matchlist, - (sizeof_matchlist - * sizeof (char *))); - } - - matchlist[matches] = (char *) - xmalloc (strlen (word) + strlen (name) + 1); - if (word == text) - strcpy (matchlist[matches], name); - else if (word > text) - { - /* Return some portion of name. */ - strcpy (matchlist[matches], name + (word - text)); - } - else - { - /* Return some of text plus name. */ - strncpy (matchlist[matches], word, text - word); - matchlist[matches][text - word] = '\0'; - strcat (matchlist[matches], name); - } - ++matches; - } - - if (matches == 0) - { - free ((PTR)matchlist); - matchlist = 0; - } - else - { - matchlist = (char **) xrealloc ((char *)matchlist, ((matches + 1) - * sizeof (char *))); - matchlist[matches] = (char *) 0; - } - - return matchlist; -} - -static int -parse_binary_operation (arg) - char *arg; -{ - int length; - - if (!arg || !*arg) - return 1; - - length = strlen (arg); - - while (arg[length - 1] == ' ' || arg[length - 1] == '\t') - length--; - - if (!strncmp (arg, "on", length) - || !strncmp (arg, "1", length) - || !strncmp (arg, "yes", length)) - return 1; - else - if (!strncmp (arg, "off", length) - || !strncmp (arg, "0", length) - || !strncmp (arg, "no", length)) - return 0; - else - { - error ("\"on\" or \"off\" expected."); - return 0; - } -} - -/* Do a "set" or "show" command. ARG is NULL if no argument, or the text - of the argument, and FROM_TTY is nonzero if this command is being entered - directly by the user (i.e. these are just like any other - command). C is the command list element for the command. */ -void -do_setshow_command (arg, from_tty, c) - char *arg; - int from_tty; - struct cmd_list_element *c; -{ - if (c->type == set_cmd) - { - switch (c->var_type) - { - case var_string: - { - char *new; - char *p; - char *q; - int ch; - - if (arg == NULL) - arg = ""; - new = (char *) xmalloc (strlen (arg) + 2); - p = arg; q = new; - while ((ch = *p++) != '\000') - { - if (ch == '\\') - { - /* \ at end of argument is used after spaces - so they won't be lost. */ - /* This is obsolete now that we no longer strip - trailing whitespace and actually, the backslash - didn't get here in my test, readline or - something did something funky with a backslash - right before a newline. */ - if (*p == 0) - break; - ch = parse_escape (&p); - if (ch == 0) - break; /* C loses */ - else if (ch > 0) - *q++ = ch; - } - else - *q++ = ch; - } -#if 0 - if (*(p - 1) != '\\') - *q++ = ' '; -#endif - *q++ = '\0'; - new = (char *) xrealloc (new, q - new); - if (*(char **)c->var != NULL) - free (*(char **)c->var); - *(char **) c->var = new; - } - break; - case var_string_noescape: - if (arg == NULL) - arg = ""; - if (*(char **)c->var != NULL) - free (*(char **)c->var); - *(char **) c->var = savestring (arg, strlen (arg)); - break; - case var_filename: - if (arg == NULL) - error_no_arg ("filename to set it to."); - if (*(char **)c->var != NULL) - free (*(char **)c->var); - *(char **)c->var = tilde_expand (arg); - break; - case var_boolean: - *(int *) c->var = parse_binary_operation (arg); - break; - case var_uinteger: - if (arg == NULL) - error_no_arg ("integer to set it to."); - *(unsigned int *) c->var = parse_and_eval_address (arg); - if (*(unsigned int *) c->var == 0) - *(unsigned int *) c->var = UINT_MAX; - break; - case var_integer: - { - unsigned int val; - if (arg == NULL) - error_no_arg ("integer to set it to."); - val = parse_and_eval_address (arg); - if (val == 0) - *(int *) c->var = INT_MAX; - else if (val >= INT_MAX) - error ("integer %u out of range", val); - else - *(int *) c->var = val; - break; - } - case var_zinteger: - if (arg == NULL) - error_no_arg ("integer to set it to."); - *(int *) c->var = parse_and_eval_address (arg); - break; - case var_enum: - { - int i; - int len; - int nmatches; - char *match = NULL; - char *p; - - /* if no argument was supplied, print an informative error message */ - if (arg == NULL) - { - char msg[1024]; - strcpy (msg, "Requires an argument. Valid arguments are "); - for (i = 0; c->enums[i]; i++) - { - if (i != 0) - strcat (msg, ", "); - strcat (msg, c->enums[i]); - } - strcat (msg, "."); - error (msg); - } - - p = strchr (arg, ' '); - - if (p) - len = p - arg; - else - len = strlen (arg); - - nmatches = 0; - for (i = 0; c->enums[i]; i++) - if (strncmp (arg, c->enums[i], len) == 0) - { - match = c->enums[i]; - nmatches++; - } - - if (nmatches <= 0) - error ("Undefined item: \"%s\".", arg); - - if (nmatches > 1) - error ("Ambiguous item \"%s\".", arg); - - *(char **)c->var = match; - } - break; - default: - error ("gdb internal error: bad var_type in do_setshow_command"); - } - } - else if (c->type == show_cmd) - { - /* Print doc minus "show" at start. */ - print_doc_line (gdb_stdout, c->doc + 5); - - fputs_filtered (" is ", gdb_stdout); - wrap_here (" "); - switch (c->var_type) - { - case var_string: - { - unsigned char *p; - - fputs_filtered ("\"", gdb_stdout); - if (*(unsigned char **)c->var) - for (p = *(unsigned char **) c->var; *p != '\0'; p++) - gdb_printchar (*p, gdb_stdout, '"'); - fputs_filtered ("\"", gdb_stdout); - } - break; - case var_string_noescape: - case var_filename: - case var_enum: - fputs_filtered ("\"", gdb_stdout); - if (*(char **)c->var) - fputs_filtered (*(char **) c->var, gdb_stdout); - fputs_filtered ("\"", gdb_stdout); - break; - case var_boolean: - fputs_filtered (*(int *) c->var ? "on" : "off", gdb_stdout); - break; - case var_uinteger: - if (*(unsigned int *) c->var == UINT_MAX) { - fputs_filtered ("unlimited", gdb_stdout); - break; - } - /* else fall through */ - case var_zinteger: - fprintf_filtered (gdb_stdout, "%u", *(unsigned int *) c->var); - break; - case var_integer: - if (*(int *) c->var == INT_MAX) - { - fputs_filtered ("unlimited", gdb_stdout); - } - else - fprintf_filtered (gdb_stdout, "%d", *(int *) c->var); - break; - - default: - error ("gdb internal error: bad var_type in do_setshow_command"); - } - fputs_filtered (".\n", gdb_stdout); - } - else - error ("gdb internal error: bad cmd_type in do_setshow_command"); - (*c->function.sfunc) (NULL, from_tty, c); -} - -/* Show all the settings in a list of show commands. */ - -void -cmd_show_list (list, from_tty, prefix) - struct cmd_list_element *list; - int from_tty; - char *prefix; -{ - for (; list != NULL; list = list->next) { - /* If we find a prefix, run its list, prefixing our output by its - prefix (with "show " skipped). */ - if (list->prefixlist && !list->abbrev_flag) - cmd_show_list (*list->prefixlist, from_tty, list->prefixname + 5); - if (list->type == show_cmd) - { - fputs_filtered (prefix, gdb_stdout); - fputs_filtered (list->name, gdb_stdout); - fputs_filtered (": ", gdb_stdout); - do_setshow_command ((char *)NULL, from_tty, list); - } - } -} - -/* ARGSUSED */ -static void -shell_escape (arg, from_tty) - char *arg; - int from_tty; -{ -#ifdef CANT_FORK - /* FIXME: what about errors (I don't know how GO32 system() handles - them)? */ - system (arg); -#else /* Can fork. */ - int rc, status, pid; - char *p, *user_shell; - - if ((user_shell = (char *) getenv ("SHELL")) == NULL) - user_shell = "/bin/sh"; - - /* Get the name of the shell for arg0 */ - if ((p = strrchr (user_shell, '/')) == NULL) - p = user_shell; - else - p++; /* Get past '/' */ - - if ((pid = fork()) == 0) - { - if (!arg) - execl (user_shell, p, 0); - else - execl (user_shell, p, "-c", arg, 0); - - fprintf_unfiltered (gdb_stderr, "Cannot execute %s: %s\n", user_shell, - safe_strerror (errno)); - gdb_flush (gdb_stderr); - _exit (0177); - } - - if (pid != -1) - while ((rc = wait (&status)) != pid && rc != -1) - ; - else - error ("Fork failed"); -#endif /* Can fork. */ -} - -static void -make_command (arg, from_tty) - char *arg; - int from_tty; -{ - char *p; - - if (arg == 0) - p = "make"; - else - { - p = xmalloc (sizeof("make ") + strlen(arg)); - strcpy (p, "make "); - strcpy (p + sizeof("make ")-1, arg); - } - - shell_escape (p, from_tty); -} - -static void -show_user_1 (c, stream) - struct cmd_list_element *c; - GDB_FILE *stream; -{ - register struct command_line *cmdlines; - - cmdlines = c->user_commands; - if (!cmdlines) - return; - fputs_filtered ("User command ", stream); - fputs_filtered (c->name, stream); - fputs_filtered (":\n", stream); - - while (cmdlines) - { - print_command_line (cmdlines, 4); - cmdlines = cmdlines->next; - } - fputs_filtered ("\n", stream); -} - -/* ARGSUSED */ -static void -show_user (args, from_tty) - char *args; - int from_tty; -{ - struct cmd_list_element *c; - extern struct cmd_list_element *cmdlist; - - if (args) - { - c = lookup_cmd (&args, cmdlist, "", 0, 1); - if (c->class != class_user) - error ("Not a user command."); - show_user_1 (c, gdb_stdout); - } - else - { - for (c = cmdlist; c; c = c->next) - { - if (c->class == class_user) - show_user_1 (c, gdb_stdout); - } - } -} - -void -_initialize_command () -{ - add_com ("shell", class_support, shell_escape, - "Execute the rest of the line as a shell command. \n\ -With no arguments, run an inferior shell."); - - if (xdb_commands) - add_com_alias("!", "shell", class_support, 0); - - add_com ("make", class_support, make_command, - "Run the ``make'' program using the rest of the line as arguments."); - add_cmd ("user", no_class, show_user, - "Show definitions of user defined commands.\n\ -Argument is the name of the user defined command.\n\ -With no argument, show definitions of all user defined commands.", &showlist); -} diff --git a/contrib/gdb/gdb/config/i386/cygwin32.mh b/contrib/gdb/gdb/config/i386/cygwin32.mh deleted file mode 100644 index 25f15cfcd0314..0000000000000 --- a/contrib/gdb/gdb/config/i386/cygwin32.mh +++ /dev/null @@ -1,6 +0,0 @@ -MH_CFLAGS= -XM_FILE=xm-cygwin32.h -TERMCAP= -NATDEPFILES=win32-nat.o -XM_CLIBS=-lkernel32 - diff --git a/contrib/gdb/gdb/config/i386/cygwin32.mt b/contrib/gdb/gdb/config/i386/cygwin32.mt deleted file mode 100644 index 22b45473ad618..0000000000000 --- a/contrib/gdb/gdb/config/i386/cygwin32.mt +++ /dev/null @@ -1,6 +0,0 @@ -# Target: Intel 386 run win32 -TDEPFILES= i386-tdep.o i387-tdep.o -TM_FILE= tm-cygwin32.h - - - diff --git a/contrib/gdb/gdb/config/i386/nm-sun386.h b/contrib/gdb/gdb/config/i386/nm-sun386.h deleted file mode 100644 index f7a904b4f1a3d..0000000000000 --- a/contrib/gdb/gdb/config/i386/nm-sun386.h +++ /dev/null @@ -1,27 +0,0 @@ -/* Native support for Sun 386i, for GDB, the GNU debugger. - Copyright (C) 1986, 1987, 1989, 1992 Free Software Foundation, Inc. - -This file is part of GDB. - -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 2 of the License, 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ - -/* Do implement the attach and detach commands. */ - -#define ATTACH_DETACH - -/* Override copies of {fetch,store}_inferior_registers in infptrace.c. */ -#define FETCH_INFERIOR_REGISTERS - -#define CHILD_PREPARE_TO_STORE() read_register_bytes (0, NULL, REGISTER_BYTES) diff --git a/contrib/gdb/gdb/config/i386/sun386.mh b/contrib/gdb/gdb/config/i386/sun386.mh deleted file mode 100644 index d2496610b173c..0000000000000 --- a/contrib/gdb/gdb/config/i386/sun386.mh +++ /dev/null @@ -1,5 +0,0 @@ -# Host: Sun 386i -XDEPFILES= -XM_FILE= xm-sun386.h -NAT_FILE= nm-sun386.h -NATDEPFILES= infptrace.o inftarg.o fork-child.o sun386-nat.o diff --git a/contrib/gdb/gdb/config/i386/sun386.mt b/contrib/gdb/gdb/config/i386/sun386.mt deleted file mode 100644 index 665ca643fd556..0000000000000 --- a/contrib/gdb/gdb/config/i386/sun386.mt +++ /dev/null @@ -1,3 +0,0 @@ -# Target: Sun 386i target configuration file. -TDEPFILES= i386-tdep.o solib.o -TM_FILE= tm-sun386.h diff --git a/contrib/gdb/gdb/config/i386/tm-cygwin32.h b/contrib/gdb/gdb/config/i386/tm-cygwin32.h deleted file mode 100644 index f7464ba66cba2..0000000000000 --- a/contrib/gdb/gdb/config/i386/tm-cygwin32.h +++ /dev/null @@ -1,125 +0,0 @@ -/* Macro definitions for i386 running under the win32 API Unix. - Copyright 1995, 1996 Free Software Foundation, Inc. - - This file is part of GDB. - - 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 2 of the License, 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ - - -#include "i386/tm-i386v.h" - -#undef MAX_REGISTER_RAW_SIZE -#undef MAX_REGISTER_VIRTUAL_SIZE -#undef NUM_REGS -#undef REGISTER_BYTE -#undef REGISTER_BYTES -#undef REGISTER_CONVERTIBLE -#undef REGISTER_CONVERT_TO_RAW -#undef REGISTER_CONVERT_TO_VIRTUAL -#undef REGISTER_NAMES -#undef REGISTER_RAW_SIZE -#undef REGISTER_VIRTUAL_SIZE -#undef REGISTER_VIRTUAL_TYPE - -/* Number of machine registers */ - -#define NUM_REGS 24 - -/* Initializer for an array of names of registers. - There should be NUM_REGS strings in this initializer. */ - -/* the order of the first 8 registers must match the compiler's - * numbering scheme (which is the same as the 386 scheme) - * also, this table must match regmap in i386-pinsn.c. - */ - -#define REGISTER_NAMES { "eax", "ecx", "edx", "ebx", \ - "esp", "ebp", "esi", "edi", \ - "eip", "ps", "cs", "ss", \ - "ds", "es", "fs", "gs", \ - "st", "st(1)","st(2)","st(3)",\ - "st(4)","st(5)","st(6)","st(7)",} - -#define FP0_REGNUM 16 - -/* Total amount of space needed to store our copies of the machine's - register state, the array `registers'. */ - -#define REGISTER_BYTES (16 * 4 + 8 * 10) - -/* Index within `registers' of the first byte of the space for - register N. */ - -#define REGISTER_BYTE(N) (((N) < 16) ? (N) * 4 : (((N) - 16) * 10) + (16 * 4)) - -/* Number of bytes of storage in the actual machine representation - for register N. */ - -#define REGISTER_RAW_SIZE(N) (((N) < 16) ? 4 : 10) - -/* Number of bytes of storage in the program's representation - for register N. */ - -#define REGISTER_VIRTUAL_SIZE(N) (((N) < 16) ? 4 : 10) - -/* Largest value REGISTER_RAW_SIZE can have. */ - -#define MAX_REGISTER_RAW_SIZE 10 - -/* Largest value REGISTER_VIRTUAL_SIZE can have. */ - -#define MAX_REGISTER_VIRTUAL_SIZE 10 - -/* Nonzero if register N requires conversion - from raw format to virtual format. */ - -#define REGISTER_CONVERTIBLE(N) \ - ((N < FP0_REGNUM) ? 0 : 1) - -/* Convert data from raw format for register REGNUM in buffer FROM - to virtual format with type TYPE in buffer TO. */ -extern void -i387_to_double PARAMS ((char *, char *)); - - -#define REGISTER_CONVERT_TO_VIRTUAL(REGNUM,TYPE,FROM,TO) \ -{ \ - double val; \ - i387_to_double ((FROM), (char *)&val); \ - store_floating ((TO), TYPE_LENGTH (TYPE), val); \ -} - -extern void -double_to_i387 PARAMS ((char *, char *)); - -#define REGISTER_CONVERT_TO_RAW(TYPE,REGNUM,FROM,TO) \ -{ \ - double val = extract_floating ((FROM), TYPE_LENGTH (TYPE)); \ - double_to_i387((char *)&val, (TO)); \ -} - -/* Return the GDB type object for the "standard" data type - of data in register N. */ - -#define REGISTER_VIRTUAL_TYPE(N) \ - ((N < FP0_REGNUM) ? builtin_type_int : \ - builtin_type_double) - -#define NAMES_HAVE_UNDERSCORE - - -#define IN_SOLIB_CALL_TRAMPOLINE(pc, name) skip_trampoline_code (pc, name) -#define SKIP_TRAMPOLINE_CODE(pc) skip_trampoline_code (pc, 0) -extern CORE_ADDR skip_trampoline_code PARAMS ((CORE_ADDR pc, char *name)); diff --git a/contrib/gdb/gdb/config/i386/tm-sun386.h b/contrib/gdb/gdb/config/i386/tm-sun386.h deleted file mode 100644 index 259fd5182387c..0000000000000 --- a/contrib/gdb/gdb/config/i386/tm-sun386.h +++ /dev/null @@ -1,205 +0,0 @@ -/* Parameters for a Sun 386i target machine, for GDB, the GNU debugger. - Copyright 1986, 1987, 1991, 1992, 1993 Free Software Foundation, Inc. - -This file is part of GDB. - -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 2 of the License, 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ - -#if !defined (TM_SUN386_H) -#define TM_SUN386_H 1 - -#include "i386/tm-i386.h" - -#ifndef sun386 -#define sun386 -#endif -#define GDB_TARGET_IS_SUN386 1 -#define SUNOS4 -#define USE_MACHINE_REG_H - -/* Perhaps some day this will work even without the following #define */ -#define COFF_ENCAPSULATE - -#ifdef COFF_ENCAPSULATE -/* Avoid conflicts between our include files and <sys/exec.h> - (maybe not needed anymore). */ -#define _EXEC_ -#endif - -/* sun386 ptrace seems unable to change the frame pointer */ -#define PTRACE_FP_BUG - -/* Address of end of stack space. */ - -#define STACK_END_ADDR 0xfc000000 - -/* Number of machine registers */ - -#undef NUM_REGS -#define NUM_REGS 35 - -/* Initializer for an array of names of registers. There should be NUM_REGS - strings in this initializer. The order of the first 8 registers must match - the compiler's numbering scheme (which is the same as the 386 scheme) also, - this table must match regmap in i386-pinsn.c. */ - -#undef REGISTER_NAMES -#define REGISTER_NAMES { "gs", "fs", "es", "ds", \ - "edi", "esi", "ebp", "esp", \ - "ebx", "edx", "ecx", "eax", \ - "retaddr", "trapnum", "errcode", "ip", \ - "cs", "ps", "sp", "ss", \ - "fst0", "fst1", "fst2", "fst3", \ - "fst4", "fst5", "fst6", "fst7", \ - "fctrl", "fstat", "ftag", "fip", \ - "fcs", "fopoff", "fopsel" \ - } - -/* Register numbers of various important registers. - Note that some of these values are "real" register numbers, - and correspond to the general registers of the machine, - and some are "phony" register numbers which are too large - to be actual register numbers as far as the user is concerned - but do serve to get the desired values when passed to read_register. */ - -#undef FP_REGNUM -#define FP_REGNUM 6 /* (ebp) Contains address of executing stack frame */ -#undef SP_REGNUM -#define SP_REGNUM 18 /* (usp) Contains address of top of stack */ -#undef PS_REGNUM -#define PS_REGNUM 17 /* (ps) Contains processor status */ -#undef PC_REGNUM -#define PC_REGNUM 15 /* (eip) Contains program counter */ -#undef FP0_REGNUM -#define FP0_REGNUM 20 /* Floating point register 0 */ -#undef FPC_REGNUM -#define FPC_REGNUM 28 /* 80387 control register */ - -/* Total amount of space needed to store our copies of the machine's - register state, the array `registers'. */ - -#undef REGISTER_BYTES -#define REGISTER_BYTES (20*4+8*10+7*4) - -/* Index within `registers' of the first byte of the space for - register N. */ - -#undef REGISTER_BYTE -#define REGISTER_BYTE(N) \ - ((N) >= FPC_REGNUM ? (((N) - FPC_REGNUM) * 4) + 160 \ - : (N) >= FP0_REGNUM ? (((N) - FP0_REGNUM) * 10) + 80 \ - : (N) * 4) - -/* Number of bytes of storage in the actual machine representation - for register N. */ - -#undef REGISTER_RAW_SIZE -#define REGISTER_RAW_SIZE(N) (((unsigned)((N) - FP0_REGNUM)) < 8 ? 10 : 4) - -/* Number of bytes of storage in the program's representation - for register N. */ - -#undef REGISTER_VIRTUAL_SIZE -#define REGISTER_VIRTUAL_SIZE(N) (((unsigned)((N) - FP0_REGNUM)) < 8 ? 8 : 4) - -/* Nonzero if register N requires conversion - from raw format to virtual format. */ - -#undef REGISTER_CONVERTIBLE -#define REGISTER_CONVERTIBLE(N) (((unsigned)((N) - FP0_REGNUM)) < 8) - -/* Convert data from raw format for register REGNUM in buffer FROM - to virtual format with type TYPE in buffer TO. */ - -#undef REGISTER_CONVERT_TO_VIRTUAL -#define REGISTER_CONVERT_TO_VIRTUAL(REGNUM,TYPE,FROM,TO) \ -{ \ - double val; \ - i387_to_double ((FROM), (char *)&val); \ - store_floating ((TO), TYPE_LENGTH (TYPE), val); \ -} -extern void -i387_to_double PARAMS ((char *, char *)); - -/* Convert data from virtual format with type TYPE in buffer FROM - to raw format for register REGNUM in buffer TO. */ - -#undef REGISTER_CONVERT_TO_RAW -#define REGISTER_CONVERT_TO_RAW(TYPE,REGNUM,FROM,TO) \ -{ \ - double val = extract_floating ((FROM), TYPE_LENGTH (TYPE)); \ - double_to_i387((char *)&val, (TO)); \ -} -extern void -double_to_i387 PARAMS ((char *, char *)); - -/* Return the GDB type object for the "standard" data type - of data in register N. */ - -#undef REGISTER_VIRTUAL_TYPE -#define REGISTER_VIRTUAL_TYPE(N) \ - (((unsigned)((N) - FP0_REGNUM)) < 8 ? builtin_type_double : builtin_type_int) - -/* Extract from an array REGBUF containing the (raw) register state - a function return value of type TYPE, and copy that, in virtual format, - into VALBUF. */ - -#undef EXTRACT_RETURN_VALUE -#define EXTRACT_RETURN_VALUE(TYPE,REGBUF,VALBUF) \ - memcpy (VALBUF, REGBUF + REGISTER_BYTE (TYPE_CODE (TYPE) == TYPE_CODE_FLT ? FP0_REGNUM : 11), TYPE_LENGTH (TYPE)) - -/* Write into appropriate registers a function return value - of type TYPE, given in virtual format. */ - -#undef STORE_RETURN_VALUE -#define STORE_RETURN_VALUE(TYPE,VALBUF) \ - write_register_bytes (REGISTER_BYTE (TYPE_CODE (TYPE) == TYPE_CODE_FLT ? FP0_REGNUM : 11), VALBUF, TYPE_LENGTH (TYPE)) - -/* Describe the pointer in each stack frame to the previous stack frame - (its caller). */ - -/* FRAME_CHAIN takes a frame's nominal address - and produces the frame's chain-pointer. */ - -#undef FRAME_CHAIN -#define FRAME_CHAIN(thisframe) \ - (!inside_entry_file ((thisframe)->pc) ? \ - read_memory_integer ((thisframe)->frame, 4) :\ - 0) - -/* Define other aspects of the stack frame. */ - -/* A macro that tells us whether the function invocation represented - by FI does not have a frame on the stack associated with it. If it - does not, FRAMELESS is set to 1, else 0. */ - -#undef FRAMELESS_FUNCTION_INVOCATION -#define FRAMELESS_FUNCTION_INVOCATION(FI, FRAMELESS) \ -{ (FRAMELESS) = frameless_look_for_prologue (FI); } - -#undef FRAME_SAVED_PC -#define FRAME_SAVED_PC(FRAME) (read_memory_integer ((FRAME)->frame + 4, 4)) - -/* Insert the specified number of args and function address - into a call sequence of the above form stored at DUMMYNAME. */ - -#undef FIX_CALL_DUMMY -#define FIX_CALL_DUMMY(dummyname, pc, fun, nargs, args, type, gcc_p) \ -{ \ - *(int *)((char *)(dummyname) + 1) = (int)(fun) - (pc) - 5; \ -} - -#endif /* !defined (TM_SUN386_H) */ - diff --git a/contrib/gdb/gdb/config/i386/windows.mh b/contrib/gdb/gdb/config/i386/windows.mh deleted file mode 100644 index 3933a6e005335..0000000000000 --- a/contrib/gdb/gdb/config/i386/windows.mh +++ /dev/null @@ -1,17 +0,0 @@ -# gdbwin.o and ser-win32s.c have to be named because they have -# _initialize functions that need to be found by init.c -# gui.ores has to be named, or else msvc won't link it in. -XDEPFILES = \ - mswin/gdbwin.o \ - mswin/ser-win32s.o \ - mswin/gui.ores \ - mswin/libwingdb.a - -$(XDEPFILES): - rootme=`pwd` ; export rootme ; \ - ( cd mswin ; \ - $(MAKE) $(FLAGS_TO_PASS) all ) - -XM_FILE=xm-windows.h -MMALLOC= -SER_HARDWIRE = diff --git a/contrib/gdb/gdb/config/i386/xm-cygwin32.h b/contrib/gdb/gdb/config/i386/xm-cygwin32.h deleted file mode 100644 index becbebe08ba3c..0000000000000 --- a/contrib/gdb/gdb/config/i386/xm-cygwin32.h +++ /dev/null @@ -1,41 +0,0 @@ -/* Definitions for hosting on WIN32, for GDB. - Copyright 1995, 1996 Free Software Foundation, Inc. - -This file is part of GDB. - -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 2 of the License, 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ - -#define HOST_BYTE_ORDER LITTLE_ENDIAN - -#include "fopen-bin.h" - -#define GDBINIT_FILENAME "gdb.ini" - - -#define SLASH_P(X) ((X)=='\\' || (X) == '/') -#define ROOTED_P(X) ((SLASH_P((X)[0]))|| ((X)[1] ==':')) -#define SLASH_CHAR '/' -#define SLASH_STRING "/" - - -/* If we longjmp out of the signal handler we never get another one. - So disable immediate_quit inside request_quit */ -#define REQUEST_QUIT - - - - - - diff --git a/contrib/gdb/gdb/config/i386/xm-i386lynx.h b/contrib/gdb/gdb/config/i386/xm-i386lynx.h deleted file mode 100644 index 6078cb6f2cba9..0000000000000 --- a/contrib/gdb/gdb/config/i386/xm-i386lynx.h +++ /dev/null @@ -1,24 +0,0 @@ -/* Host-dependent definitions for Intel 386 running LynxOS. - Copyright 1993 Free Software Foundation, Inc. - -This file is part of GDB. - -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 2 of the License, 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ - -#define HOST_BYTE_ORDER LITTLE_ENDIAN - -/* Get generic LynxOS host definitions. */ - -#include "xm-lynx.h" diff --git a/contrib/gdb/gdb/config/i386/xm-linux.h b/contrib/gdb/gdb/config/i386/xm-linux.h deleted file mode 100644 index 217c6d4d0949d..0000000000000 --- a/contrib/gdb/gdb/config/i386/xm-linux.h +++ /dev/null @@ -1,36 +0,0 @@ -/* Native support for GNU/Linux, for GDB, the GNU debugger. - Copyright (C) 1986, 1987, 1989, 1992 Free Software Foundation, Inc. - -This file is part of GDB. - -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 2 of the License, 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ - -#ifndef XM_LINUX_H -#define XM_LINUX_H - -#define HOST_BYTE_ORDER LITTLE_ENDIAN - -#define HAVE_TERMIOS - -/* This is the amount to subtract from u.u_ar0 - to get the offset in the core file of the register values. */ -#define KERNEL_U_ADDR 0x0 - -#define NEED_POSIX_SETPGID - -/* Need R_OK etc, but USG isn't defined. */ -#include <unistd.h> - -#endif /* #ifndef XM_LINUX_H */ diff --git a/contrib/gdb/gdb/config/i386/xm-sun386.h b/contrib/gdb/gdb/config/i386/xm-sun386.h deleted file mode 100644 index 51c3b58c11b6c..0000000000000 --- a/contrib/gdb/gdb/config/i386/xm-sun386.h +++ /dev/null @@ -1,20 +0,0 @@ -/* Host support for Sun 386i, for GDB, the GNU debugger. - Copyright (C) 1986, 1987, 1989, 1992, 1996 Free Software Foundation, Inc. - -This file is part of GDB. - -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 2 of the License, 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ - -#define HOST_BYTE_ORDER LITTLE_ENDIAN diff --git a/contrib/gdb/gdb/config/i386/xm-windows.h b/contrib/gdb/gdb/config/i386/xm-windows.h deleted file mode 100644 index e083010067cdf..0000000000000 --- a/contrib/gdb/gdb/config/i386/xm-windows.h +++ /dev/null @@ -1,35 +0,0 @@ -/* Definitions for hosting on WIN32, built with Microsoft Visual C/C++, for GDB. - Copyright 1996, 1998 Free Software Foundation, Inc. - -This file is part of GDB. - -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 2 of the License, 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ - -#include "i386/xm-cygwin.h" - -#undef PRINTF_HAS_LONG_LONG -#undef HAVE_UNISTD_H -#undef HAVE_TERMIO_H -#undef HAVE_TERMIOS_H -#undef HAVE_SGTTY_H -#undef HAVE_SBRK -#define CANT_FORK - -#define MALLOC_INCOMPATIBLE - -#include <malloc.h> - -#define SIGQUIT 3 -#define SIGTRAP 5 diff --git a/contrib/gdb/gdb/config/nm-empty.h b/contrib/gdb/gdb/config/nm-empty.h deleted file mode 100644 index 7069d8c8a4e85..0000000000000 --- a/contrib/gdb/gdb/config/nm-empty.h +++ /dev/null @@ -1,2 +0,0 @@ -/* This is just a dummy file to symlink to when GDB is configured as a - cross-only debugger. */ diff --git a/contrib/gdb/gdb/config/xm-lynx.h b/contrib/gdb/gdb/config/xm-lynx.h deleted file mode 100644 index 6f19abdb8105f..0000000000000 --- a/contrib/gdb/gdb/config/xm-lynx.h +++ /dev/null @@ -1,22 +0,0 @@ -/* Host-dependent definitions for any CPU running LynxOS. - Copyright 1993 Free Software Foundation, Inc. - -This file is part of GDB. - -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 2 of the License, 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ - -/* for INT_MIN, to avoid "INT_MIN redefined" warnings from defs.h */ - -#include <limits.h> diff --git a/contrib/gdb/gdb/config/xm-mpw.h b/contrib/gdb/gdb/config/xm-mpw.h deleted file mode 100644 index 0c473d7557266..0000000000000 --- a/contrib/gdb/gdb/config/xm-mpw.h +++ /dev/null @@ -1,81 +0,0 @@ -/* Macro definitions for running GDB on Apple Macintoshes. - Copyright (C) 1994, 1995 Free Software Foundation, Inc. - -This file is part of GDB. - -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 2 of the License, 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ - -#include "mpw.h" - -#include "fopen-bin.h" - -#include "spin.h" - -#define CANT_FORK - -/* Map these standard functions to versions that can do I/O in a console - window. */ - -#define printf hacked_printf -#define fprintf hacked_fprintf -#define vprintf hacked_vfprintf -#define fputs hacked_fputs -#define fputc hacked_fputc -#undef putc -#define putc hacked_putc -#define fflush hacked_fflush - -#define fgetc hacked_fgetc - -#define POSIX_UTIME - -/* No declaration of strdup in MPW's string.h, oddly enough. */ - -char *strdup (char *s1); - -/* '.' indicates drivers on the Mac, so we need a different filename. */ - -#define GDBINIT_FILENAME "_gdbinit" - -/* Commas are more common to separate dirnames in a path on Macs. */ - -#define DIRNAME_SEPARATOR ',' - -/* This is a real crufty hack. */ - -#define HAVE_TERMIO - -/* Addons to the basic MPW-supported signal list. */ - -#ifndef SIGQUIT -#define SIGQUIT (1<<6) -#endif -#ifndef SIGHUP -#define SIGHUP (1<<7) -#endif - -/* If __STDC__ is on, then this definition will be missing. */ - -#ifndef fileno -#define fileno(p) (p)->_file -#endif - -#ifndef R_OK -#define R_OK 4 -#endif - -extern int StandAlone; - -extern int mac_app; diff --git a/contrib/gdb/gdb/doc/GDBvn.texi b/contrib/gdb/gdb/doc/GDBvn.texi deleted file mode 100644 index fd722bde8f0ed..0000000000000 --- a/contrib/gdb/gdb/doc/GDBvn.texi +++ /dev/null @@ -1 +0,0 @@ -@set GDBVN 4.18 diff --git a/contrib/gdb/gdb/doc/HPPA-cfg.texi b/contrib/gdb/gdb/doc/HPPA-cfg.texi deleted file mode 100644 index 88a138cab8b0a..0000000000000 --- a/contrib/gdb/gdb/doc/HPPA-cfg.texi +++ /dev/null @@ -1,114 +0,0 @@ -@c GDB MANUAL configuration file. -@c Copyright (c) 1993 Free Software Foundation, Inc. -@c -@c NOTE: While the GDB manual is configurable (by changing these -@c switches), its configuration is ***NOT*** automatically tied in to -@c source configuration---because the authors expect that, save in -@c unusual cases, the most inclusive form of the manual is appropriate -@c no matter how the program itself is configured. -@c -@c The only automatically-varying variable is the GDB version number, -@c which the Makefile rewrites based on the VERSION variable from -@c `../Makefile.in'. -@c -@c GDB version number is recorded in the variable GDBVN -@include GDBvn.texi -@c -@c ---------------------------------------------------------------------- -@c PLATFORM FLAGS: -@clear GENERIC -@c -@c HP PA-RISC target: -@set HPPA -@c -@c Hitachi H8/300 target: -@clear H8 -@c Hitachi H8/300 target ONLY: -@clear H8EXCLUSIVE -@c -@c remote MIPS target: -@clear MIPS -@c -@c SPARC target: -@clear SPARC -@c -@c AMD 29000 target: -@clear AMD29K -@c -@c Intel 960 target: -@clear I960 -@c -@c Tandem ST2000 (phone switch) target: -@clear ST2000 -@c -@c Zilog 8000 target: -@clear Z8K -@c -@c Wind River Systems VxWorks environment: -@clear VXWORKS -@c -@c ---------------------------------------------------------------------- -@c DOC FEATURE FLAGS: -@c -@c Bare-board target? -@clear BARETARGET -@c -@c Restrict languages discussed to C? -@c This is backward. As time permits, change this to language-specific -@c switches for what to include. -@clear CONLY -@c Discuss Fortran? -@clear FORTRAN -@c -@c Discuss Modula 2? -@clear MOD2 -@c -@c Specifically for host machine running DOS? -@clear DOSHOST -@c -@c Talk about CPU simulator targets? -@clear SIMS -@c -@c Remote serial line settings of interest? -@set SERIAL -@c -@c Discuss features requiring Posix or similar OS environment? -@set POSIX -@c -@c Discuss remote serial debugging stub? -@clear REMOTESTUB -@c -@c Discuss gdbserver? -@set GDBSERVER -@c -@c Discuss gdbserve.nlm? -@set GDBSERVE -@c -@c Refrain from discussing how to configure sw and format doc? -@clear PRECONFIGURED -@c -@c Refrain from referring to unfree publications? -@set FSFDOC -@c -@c ---------------------------------------------------------------------- -@c STRINGS: -@c -@c Name of GDB program. Used also for (gdb) prompt string. -@set GDBP gdb -@c -@c Name of GDB product. Used in running text. -@set GDBN GDB -@c -@c Name of target. -@set TARGET HP 9000 Systems -@c -@c Name of host. Should not be used in generic configs, but generic -@c value may catch some flubs. -@set HOST machine specific -@c -@c Name of GCC product -@set NGCC GCC -@c -@c Name of GCC program -@set GCC gcc - diff --git a/contrib/gdb/gdb/doc/h8-cfg.texi b/contrib/gdb/gdb/doc/h8-cfg.texi deleted file mode 100644 index 823c7c244b5ae..0000000000000 --- a/contrib/gdb/gdb/doc/h8-cfg.texi +++ /dev/null @@ -1,47 +0,0 @@ -@c GDB version number is recorded in the variable GDBVN -@include GDBvn.texi -@c -@set AGGLOMERATION -@clear AMD29K -@set BARETARGET -@clear CONLY -@set DOSHOST -@clear FORTRAN -@clear FSFDOC -@clear GDBSERVER -@clear GENERIC -@set H8 -@set H8EXCLUSIVE -@clear HAVE-FLOAT -@clear I960 -@clear MOD2 -@clear NOVEL -@clear POSIX -@set PRECONFIGURED -@clear REMOTESTUB -@set SIMS -@clear SERIAL -@clear SPARC -@clear ST2000 -@clear VXWORKS -@clear Z8K -@c ---------------------------------------------------------------------- -@c STRINGS: -@c -@c Name of GDB program. Used also for (gdb) prompt string. -@set GDBP gdb -@c -@c Name of GDB product. Used in running text. -@set GDBN GDB -@c -@c Name of GDB initialization file. -@set GDBINIT .gdbinit -@c -@c Name of target. -@set TARGET Hitachi Microprocessors -@c -@c Name of GCC product -@set NGCC GCC -@c -@c Name of GCC program -@set GCC gcc diff --git a/contrib/gdb/gdb/doc/libgdb.texinfo b/contrib/gdb/gdb/doc/libgdb.texinfo deleted file mode 100644 index 4fadcb2c9b580..0000000000000 --- a/contrib/gdb/gdb/doc/libgdb.texinfo +++ /dev/null @@ -1,878 +0,0 @@ -\input texinfo @c -*-texinfo-*- -@c %**start of header -@setfilename libgdb.info -@settitle Libgdb -@setchapternewpage off -@c %**end of header - -@ifinfo -This file documents libgdb, the GNU symbolic debugger in a library. - -This is Edition 0.3, Oct 1993, of @cite{Libgdb}. -Copyright 1993 Cygnus Support - -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. - -@ignore -Permission is granted to process this file through TeX and print the -results, provided the printed document carries copying permission -notice identical to this one except for the removal of this paragraph -(this paragraph not being relevant to the printed manual). - -@end ignore -Permission is granted to copy and distribute modified versions of this -manual under the conditions for verbatim copying, provided also that the -entire resulting derived work is distributed under the terms of a -permission notice identical to this one. - -Permission is granted to copy and distribute translations of this manual -into another language, under the above conditions for modified versions. -@end ifinfo - -@c This title page illustrates only one of the -@c two methods of forming a title page. - -@titlepage -@title Libgdb -@subtitle Version 0.3 -@subtitle Oct 1993 -@author Thomas Lord - -@c The following two commands -@c start the copyright page. -@page -@vskip 0pt plus 1filll -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. - -Copyright @copyright{} 1993 Cygnus Support -@end titlepage - -@ifinfo -@node Top, Overview, (dir), (dir) - -This info file documents libgdb: an API for GDB, the GNU symbolic debugger. - -@menu -* Overview:: The basics of libgdb and this document. -* Interpreter:: Libgdb is an Interpreter-Based Server. -* Top Level:: You Provide the Top Level for the Libgdb - Command Interpreter . -* I/O:: How the Server's I/O Can be Used. -* Invoking:: Invoking the Interpreter, Executing - Commands. -* Defining Commands:: How New Commands are Created. -* Variables:: How Builtin Variables are Defined. -* Asynchronous:: Scheduling Asynchronous Computations. -* Commands:: Debugger Commands for Libgdb Applications -@end menu - -@end ifinfo -@node Overview, Interpreter, top, top -@comment node-name, next, previous, up -@chapter Overview -@cindex overview -@cindex definitions - -@heading Function and Purpose - -Libgdb is a package which provides an API to the functionality of GDB, -the GNU symbolic debugger. It is specifically intended to support the -development of a symbolic debugger with a graphic interface. - - -@heading This Document - -This document is a specification of the libgdb API. It is written in -the form of a programmer's manual. So the goal of this document is to -explain what functions make up the API, and how they can be used in a -running application. - - -@heading Terminology - -In this document, @dfn{libgdb} refers to a library containing the -functions defined herein, @dfn{application} refers to any program built -with that library. - - -@heading Dependencies - -Programs which are linked with libgdb must be linked with libbfd, -libopcodes, libiberty, and libmmalloc. - -@heading Acknowledgments - -Essential contributions to this design were made by Stu Grossman, Jim -Kingdon, and Rich Pixley. - -@node Interpreter, Top Level, Overview, Top -@comment node-name, next, previous, up -@chapter Libgdb is an Interpreter Based Server -@cindex interpreter -@cindex server - -To understand libgdb, it is necessary to understand how the library is -structured. Historically, GDB is written as a small interpreter for a -simple command language. The commands of the language perform useful -debugging functions. - -Libgdb is built from GDB by turning the interpreter into a debugging -server. The server reads debugging commands from any source and -interprets them, directing the output arbitrarily. - -In addition to changing GDB from a tty-based program to a server, a -number of new GDB commands have been added to make the server more -useful for a program with a graphic interface. - -Finally, libgdb includes provisions for asynchronous processing within -the application. - -Most operations that can be carried out with libgdb involve the GDB -command interpreter. The usual mode of operation is that the operation -is expressed as a string of GDB commands, which the interpreter is then -invoked to carry out. The output from commands executed in this manner -can be redirected in a variety of useful ways for further processing by -the application. - -The command interpreter provides an extensive system of hooks so an -application can monitor any aspect of the debugging library's state. An -application can set its own breakpoints and attach commands and -conditions to those. It is possible to attach hooks to any debugger -command; the hooks are invoked whenever that command is about to be -invoked. By means of these, the displays of a graphical interface can -be kept fully up to date at all times. - -We show you how to define new primitives in the command language. By -defining new primitives and using them in breakpoint scripts and command -hooks, an application can schedule the execution of arbitrary C-code at -almost any point of interest in the operation of libgdb. - -We show you how to define new GDB convenience variables for which your -code computes a value on demand. Referring to such variables in a -breakpoint condition is a convenient way to conditionalize breakpoints -in novel ways. - -To summarize: in libgdb, the gdb command language is turned into a -debugging server. The server takes commands as input, and the server's -output is redirectable. An application uses libgdb by formatting -debugging commands and invoking the interpreter. The application might -maintain breakpoints, watchpoints and many kinds of hooks. An application -can define new primitives for the interpreter. - -@node Top Level, I/O, Interpreter, Top -@chapter You Provide the Top Level for the Libgdb Command Interpreter -@cindex {top level} - -When you use libgdb, your code is providing a @dfn{top level} for the -command language interpreter. The top level is significant because it -provides commands for the the interpreter to execute. In addition, the -top level is responsible for handling some kinds of errors, and -performing certain cleanup operations on behalf of the interpreter. - -@heading Initialization - -Before calling any other libgdb functions, call this: - -@deftypefun void gdb_init (void) -Perform one-time initialization for libgdb. -@end deftypefun - -An application may wish to evaluate specific gdb commands as part of its -own initialization. The details of how this can be accomplished are -explained below. - -@heading The Top-Level Loop - -There is a strong presumption in libgdb that the application has -the form of a loop. Here is what such a loop might look like: - -@example -while (gdb_still_going ()) - @{ - if (!GDB_TOP_LEVEL ()) - @{ - char * command; - gdb_start_top_loop (); - command = process_events (); - gdb_execute_command (command); - gdb_finish_top_loop (); - @} - @} -@end example - -The function @code{gdb_still_going} returns 1 until the gdb command -`quit' is run. - -The macro @code{GDB_TOP_LEVEL} invokes setjmp to set the top level error -handler. When a command results in an error, the interpreter exits with -a longjmp. There is nothing special libgdb requires of the top level -error handler other than it be present and that it restart the top level -loop. Errors are explained in detail in a later chapter. - -Each time through the top level loop two important things happen: a -debugger command is constructed on the basis of user input, and the -interpreter is invoked to execute that command. In the sample code, the -call to the imaginary function @code{process_events} represents the -point at which a graphical interface should read input events until -ready to execute a debugger command. The call to -@code{gdb_execute_command} invokes the command interpreter (what happens -to the output from the command will be explained later). - -Libgdb manages some resources using the top-level loop. The primary -reason for this is error-handling: even if a command terminates with an -error, it may already have allocated resources which need to be freed. -The freeing of such resources takes place at the top-level, regardless -of how the the command exits. The calls to @code{gdb_start_top_loop} -and @code{gdb_finish_top_loop} let libgdb know when it is safe to -perform operations associated with these resources. - -@heading Breakpoint Commands - -Breakpoint commands are scripts of GDB operations associated with -particular breakpoints. When a breakpoint is reached, its associated -commands are executed. - -Breakpoint commands are invoked by the libgdb function -@code{gdb_finish_top_loop}. - -Notice that if control returns to the top-level error handler, the -execution of breakpoint commands is bypassed. This can happen as a -result of errors during either @code{gdb_execute_command} or -@code{gdb_finish_top_loop}. - -@heading Application Initialization - -Sometimes it is inconvenient to execute commands via a command loop for -example, the commands an application uses to initialize itself. An -alternative to @code{execute_command} is @code{execute_catching_errors}. -When @code{execute_catching_errors} is used, no top level error handler -need be in effect, and it is not necessary to call -@code{gdb_start_top_loop} or @code{gdb_finish_top_loop}. - - -@heading Cleanup - -The debugger command ``quit'' performs all necessary cleanup for libgdb. -After it has done so, it changes the return value of -@code{gdb_still_going} to 0 and returns to the top level error handler. - - -@node I/O, Invoking, Top Level, Top -@comment node-name, next, previous, up -@chapter How the Server's I/O Can be Used -@cindex I/O - -In the last chapter it was pointed out that a libgdb application is -responsible for providing commands for the interpreter to execute. -However some commands require further input (for example, the ``quit'' -command might ask for confirmation). Almost all commands produce output -of some kind. The purpose of this section is to explain how libgdb -performs its I/O, and how an application can take advantage of -this. - - -@heading I/O Vectors - -Libgdb has no fixed strategy for I/O. Instead, all operations are -performed by functions called via structures of function pointers. -Applications supply theses structures and can change them at any -time. - -@deftp Type {struct gdb_input_vector} -@deftpx Type {struct gdb_output_vector} -These structures contain a set of function pointers. Each function -determines how a particular type of i/o is performed. The details of -these strucutres are explained below. - -The application allocates these structures, initializes them to all bits -zero, fills in the function pointers, and then registers names for them -them with libgdb. -@end deftp - -@deftypefun void gdb_name_input_vector (@var{name}, @var{vec}) -@deftypefunx void gdb_remove_input_vector (@var{name}, @var{vec}) -@deftypefunx void gdb_name_output_vector (@var{name}, @var{vec}) -@deftypefunx void gdb_remove_input_vector (@var{name}, @var{vec}) -@example - char * @var{name}; - struct gdb_output_vector * @var{vec}; -@end example -These functions are used to give and remove names to i/o vectors. Note -that if a name is used twice, the most recent definition applies. -@end deftypefun - - - -@subheading Output - -An output vector is a structure with at least these fields: - -@example -struct gdb_output_vector -@{ - /* output */ - void (*put_string) (struct gdb_output_vector *, char * str); -@} -@end example - -Use the function @code{memset} or something equivalent to initialize an -output vector to all bits zero. Then fill in the function pointer with -your function. - -A debugger command can produce three kinds of output: error messages -(such as when trying to delete a non-existent breakpoint), informational -messages (such as the notification printed when a breakpoint is hit), -and the output specifically requested by a command (for example, the -value printed by the ``print'' command). At any given time, then, -libgdb has three output vectors. These are called the @dfn{error}, -@dfn{info}, @dfn{value} vector respectively. - -@subheading Input - -@example -struct gdb_input_vector -@{ - int (*query) (struct gdb_input_vector *, - char * prompt, - int quit_allowed); - int * (*selection) (struct gdb_input_vector *, - char * prompt, - char ** choices); - char * (*read_string) (struct gdb_input_vector *, - char * prompt); - char ** (*read_strings) (struct gdb_input_vector *, - char * prompt); -@} -@end example - -Use the function @code{memset} or something equivalent to initialize an -input vector to all bits zero. Then fill in the function pointers with -your functions. - -There are four kinds of input requests explicitly made by libgdb. - -A @dfn{query} is a yes or no question. The user can respond to a query -with an affirmative or negative answer, or by telling gdb to abort the -command (in some cases an abort is not permitted). Query should return -'y' or 'n' or 0 to abort. - -A @dfn{selection} is a list of options from which the user selects a subset. -Selections should return a NULL terminated array of integers, which are -indexes into the array of choices. It can return NULL instead to abort -the command. The array returned by this function will be passed to -@code{free} by libgdb. - -A @dfn{read_string} asks the user to supply an arbitrary string. It may -return NULL to abort the command. The string returned by @code{read_string} -should be allocated by @code{malloc}; it will be freed by libgdb. - -A @dfn{read_strings} asks the user to supply multiple lines of input -(for example, the body of a command created using `define'). It, too, -may return NULL to abort. The array and the strings returned by this -function will be freed by libgdb. - -@heading I/O Redirection from the Application Top-Level - -@deftypefun struct gdb_io_vecs gdb_set_io (struct gdb_io_vecs *) -@example - -struct gdb_io_vecs -@{ - struct gdb_input_vector * input; - struct gdb_output_vector * error; - struct gdb_output_vector * info; - struct gdb_output_vector * value; -@} -@end example - -This establishes a new set of i/o vectors, and returns the old setting. -Any of the pointers in this structure may be NULL, indicating that the -current value should be used. - -This function is useful for setting up i/o vectors before any libgdb -commands have been invoked (hence before any input or output has taken -place). -@end deftypefun - -It is explained in a later chapter how to redirect output temporarily. -(@xref{Invoking}.) - -@heading I/O Redirection in Debugger Commands - -A libgdb application creates input and output vectors and assigns them names. -Which input and output vectors are used by libgdb is established by -executing these debugger commands: - -@defun {set input-vector} name -@defunx {set error-output-vector} name -@defunx {set info-output-vector} name -@defunx {set value-output-vector} name -Choose an I/O vector by name. -@end defun - - -A few debugger commands are for use only within commands defined using -the debugger command `define' (they have no effect at other times). -These commands exist so that an application can maintain hooks which -redirect output without affecting the global I/O vectors. - -@defun with-input-vector name -@defunx with-error-output-vector name -@defunx with-info-output-vector name -@defunx with-value-output-vector name -Set an I/O vector, but only temporarily. The setting has effect only -within the command definition in which it occurs. -@end defun - - -@heading Initial Conditions - -When libgdb is initialized, a set of default I/O vectors is put in -place. The default vectors are called @code{default-input-vector}, -@code{default-output-vector}, &c. - -The default query function always returns `y'. Other input functions -always abort. The default output functions discard output silently. - - -@node Invoking, Defining Commands, I/O, Top -@chapter Invoking the Interpreter, Executing Commands -@cindex {executing commands} -@cindex {invoking the interpreter} - -This section introduces the libgdb functions which invoke the command -interpreter. - -@deftypefun void gdb_execute_command (@var{command}) -@example -char * @var{command}; -@end example -Interpret the argument debugger command. An error handler must be set -when this function is called. (@xref{Top Level}.) -@end deftypefun - -It is possible to override the current I/O vectors for the duration of a -single command: - -@deftypefun void gdb_execute_with_io (@var{command}, @var{vecs}) -@example -char * @var{command}; -struct gdb_io_vecs * @var{vecs}; - -struct gdb_io_vecs -@{ - struct gdb_input_vector * input; - struct gdb_output_vector * error; - struct gdb_output_vector * info; - struct gdb_output_vector * value; -@} -@end example - -Execute @var{command}, temporarily using the i/o vectors in @var{vecs}. - -Any of the vectors may be NULL, indicating that the current value should -be used. An error handler must be in place when this function is used. -@end deftypefun - -@deftypefun {struct gdb_str_output} gdb_execute_for_strings (@var{cmd}) -@example -char * cmd; -@end example -@deftypefunx {struct gdb_str_output} gdb_execute_for_strings2 (@var{cmd}, @var{input}) -@example -char * cmd; -struct gdb_input_vector * input; -@end example -@page -@example -struct gdb_str_output -@{ - char * error; - char * info; - char * value; -@}; -@end example - -Execute @var{cmd}, collecting its output as strings. If no error -occurs, all three strings will be present in the structure, the -empty-string rather than NULL standing for no output of a particular -kind. - -If the command aborts with an error, then the @code{value} field will be -NULL, though the other two strings will be present. - -In all cases, the strings returned are allocated by malloc and should be -freed by the caller. - -The first form listed uses the current input vector, but overrides the -current output vector. The second form additionally allows the input -vector to be overridden. - -This function does not require that an error handler be installed. -@end deftypefun - -@deftypefun void execute_catching_errors (@var{command}) -@example -char * @var{command}; -@end example -Like @code{execute_command} except that no error handler is required. -@end deftypefun - -@deftypefun void execute_with_text (@var{command}, @var{text}) -@example -char * @var{command}; -char ** @var{text}; -@end example -Like @code{execute_catching_errors}, except that the input vector is -overridden. The new input vector handles only calls to @code{query} (by -returning 'y') and calls to @code{read_strings} by returning a copy of -@var{text} and the strings it points to. - -This form of execute_command is useful for commands like @code{define}, -@code{document}, and @code{commands}. -@end deftypefun - - - -@node Defining Commands, Variables, Invoking, Top -@comment node-name, next, previous, up -@chapter How New Commands are Created -@cindex {commands, defining} - -Applications are, of course, free to take advantage of the existing GDB -macro definition capability (the @code{define} and @code{document} -functions). - -In addition, an application can add new primitives to the GDB command -language. - -@deftypefun void gdb_define_app_command (@var{name}, @var{fn}, @var{doc}) -@example -char * @var{name}; -gdb_cmd_fn @var{fn}; -char * @var{doc}; - -typedef void (*gdb_cmd_fn) (char * args); -@end example - -Create a new command call @var{name}. The new command is in the -@code{application} help class. When invoked, the command-line arguments -to the command are passed as a single string. - -Calling this function twice with the same name replaces an earlier -definition, but application commands can not replace builtin commands of -the same name. - -The documentation string of the command is set to a copy the string -@var{doc}. -@end deftypefun - -@node Variables, Asynchronous, Defining Commands, Top -@comment node-name, next, previous, up -@chapter How Builtin Variables are Defined -@cindex {variables, defining} - -Convenience variables provide a way for values maintained by libgdb to -be referenced in expressions (e.g. @code{$bpnum}). Libgdb includes a -means by which the application can define new, integer valued -convenience variables: -@page -@deftypefun void gdb_define_int_var (@var{name}, @var{fn}, @var{fn_arg}) -@example -char * @var{name}; -int (*@var{fn}) (void *); -void * @var{fn_arg}; -@end example -This function defines (or undefines) a convenience variable called @var{name}. -If @var{fn} is NULL, the variable becomes undefined. Otherwise, -@var{fn} is a function which, when passed @var{fn_arg} returns the value -of the newly defined variable. - -No libgdb functions should be called by @var{fn}. -@end deftypefun - -One use for this function is to create breakpoint conditions computed in -novel ways. This is done by defining a convenience variable and -referring to that variable in a breakpoint condition expression. - - -@node Asynchronous, Commands, Variables, Top -@chapter Scheduling Asynchronous Computations -@cindex asynchronous - - -A running libgdb function can take a long time. Libgdb includes a hook -so that an application can run intermittently during long debugger -operations. - -@deftypefun void gdb_set_poll_fn (@var{fn}, @var{fn_arg}) -@example -void (*@var{fn})(void * fn_arg, int (*gdb_poll)()); -void * @var{fn_arg}; -@end example -Arrange to call @var{fn} periodically during lengthy debugger operations. -If @var{fn} is NULL, polling is turned off. @var{fn} should take two -arguments: an opaque pointer passed as @var{fn_arg} to -@code{gdb_set_poll_fn}, and a function pointer. The function pointer -passed to @var{fn} is provided by libgdb and points to a function that -returns 0 when the poll function should return. That is, when -@code{(*gdb_poll)()} returns 0, libgdb is ready to continue @var{fn} -should return quickly. - -It is possible that @code{(*gdb_poll)()} will return 0 the first time it -is called, so it is reasonable for an application to do minimal processing -before checking whether to return. - -No libgdb functions should be called from an application's poll function, -with one exception: @code{gdb_request_quit}. -@end deftypefun - - -@deftypefun void gdb_request_quit (void) -This function, if called from a poll function, requests that the -currently executing libgdb command be interrupted as soon as possible, -and that control be returned to the top-level via an error. - -The quit is not immediate. It will not occur until at least after the -application's poll function returns. -@end deftypefun - -@node Commands, Top, Asynchronous, Top -@comment node-name, next, previous, up -@chapter Debugger Commands for Libgdb Applications - -The debugger commands available to libgdb applications are the same commands -available interactively via GDB. This section is an overview of the -commands newly created as part of libgdb. - -This section is not by any means a complete reference to the GDB command -language. See the GDB manual for such a reference. - -@menu -* Command Hooks:: Setting Hooks to Execute With Debugger Commands. -* View Commands:: View Commands Mirror Show Commands -* Breakpoints:: The Application Can Have Its Own Breakpoints -@end menu - -@node Command Hooks, View Commands, Commands, Commands -@comment node-name, next, previous, up -@section Setting Hooks to Execute With Debugger Commands. - -Debugger commands support hooks. A command hook is executed just before -the interpreter invokes the hooked command. - -There are two hooks allowed for every command. By convention, one hook -is for use by users, the other is for use by the application. - -A user hook is created for a command XYZZY by using -@code{define-command} to create a command called @code{hook-XYZZY}. - -An application hook is created for a command XYZZY by using -@code{define-command} to create a command called @code{apphook-XYZZY}. - -Application hooks are useful for interfaces which wish to continuously -monitor certain aspects of debugger state. The application can set a -hook on all commands that might modify the watched state. When the hook -is executed, it can use i/o redirection to notify parts of the -application that previous data may be out of date. After the top-level loop -resumes, the application can recompute any values that may have changed. -(@xref{I/O}.) - -@node View Commands, Breakpoints, Command Hooks, Commands -@comment node-name, next, previous, up -@section View Commands Mirror Show Commands - -The GDB command language contains many @code{set} and @code{show} -commands. These commands are used to modify or examine parameters to -the debugger. - -It is difficult to get the current state of a parameter from the -@code{show} command because @code{show} is very verbose. - -@example -(gdb) show check type -Type checking is "auto; currently off". -(gdb) show width -Number of characters gdb thinks are in a line is 80. -@end example - -For every @code{show} command, libgdb includes a @code{view} command. -@code{view} is like @code{show} without the verbose commentary: - -@example -(gdb) view check type -auto; currently off -(gdb) view width -80 -@end example - -(The precise format of the ouput from @code{view} is subject to change. -In particular, @code{view} may one-day print values which can be used as -arguments to the corresponding @code{set} command.) - -@node Breakpoints, Structured Output, View Commands, Commands -@comment node-name, next, previous, up -@section The Application Can Have Its Own Breakpoints - -The GDB breakpoint commands were written with a strong presumption that -all breakpoints are managed by a human user. Therefore, the command -language contains commands like `delete' which affect all breakpoints -without discrimination. - -In libgdb, there is added support for breakpoints and watchpoints which -are set by the application and which should not be affected by ordinary, -indiscriminate commands. These are called @dfn{protected} breakpoints. - -@deffn {Debugger Command} break-protected ... -@deffnx {Debugger Command} watch-protected ... -These work like @code{break} and @code{watch} except that the resulting -breakpoint is given a negative number. Negative numbered breakpoints do -not appear in the output of @code{info breakpoints} but do in that of -@code{info all-breakpoints}. Negative numbered breakpoints are not -affected by commands which ordinarily affect `all' breakpoints (e.g. -@code{delete} with no arguments). - -Note that libgdb itself creates protected breakpoints, so programs -should not rely on being able to allocate particular protected -breakpoint numbers for themselves. -@end deffn - -More than one breakpoint may be set at a given location. Libgdb adds -the concept of @dfn{priority} to breakpoints. A priority is an integer, -assigned to each breakpoint. When a breakpoint is reached, the -conditions of all breakpoints at the same location are evaluated in -order of ascending priority. When breakpoint commands are executed, -they are also executed in ascending priority (until all have been -executed, an error occurs, or one set of commands continues the -target). - -@deffn {Debugger Command} priority n bplist -Set the priority for breakpoints @var{bplist} to @var{n}. -By default, breakpoints are assigned a priority of zero. -@end deffn - -@node Structured Output, Commands, Breakpoints, Commands -@comment node-name, next, previous, up -@section Structured Output, The @code{Explain} Command - -(This section may be subject to considerable revision.) - -When GDB prints a the value of an expression, the printed representation -contains information that can be usefully fed back into future commands -and expressions. For example, - -@example -(gdb) print foo -$16 = @{v = 0x38ae0, v_length = 40@} -@end example - -On the basis of this output, a user knows, for example, that -@code{$16.v} refers to a pointer valued @code{0x38ae0} - -A new output command helps to make information like this available to -the application. - -@deffn {Debugger Command} explain expression -@deffnx {Debugger Command} explain /format expression -Print the value of @var{expression} in the manner of the @code{print} -command, but embed that output in a list syntax containing information -about the structure of the output. -@end deffn - -As an example, @code{explain argv} might produce this output: - -@example -(exp-attribute - ((expression "$19") - (type "char **") - (address "48560") - (deref-expression "*$19")) - "$19 = 0x3800\n") -@end example - -The syntax of output from @code{explain} is: - -@example -<explanation> := <quoted-string> - | (exp-concat <explanation> <explanation>*) - | (exp-attribute <property-list> <explanation>) - -<property-list> := ( <property-pair>* ) - -<property-pair> := ( <property-name> <quoted-string> ) -@end example - -The string-concatenation of all of the @code{<quoted-string>} (except -those in property lists) yields the output generated by the equivalent -@code{print} command. Quoted strings may contain quotes and backslashes -if they are escaped by backslash. "\n" in a quoted string stands for -newline; unescaped newlines do not occur within the strings output by -@code{explain}. - -Property names are made up of alphabetic characters, dashes, and -underscores. - -The set of properties is open-ended. As GDB acquires support for new -source languages and other new capabilities, new property types may be -added to the output of this command. Future commands may offer -applications some selectivity concerning which properties are reported. - -The initial set of properties defined includes: - -@itemize @bullet -@item @code{expression} - -This is an expression, such as @code{$42} or @code{$42.x}. The -expression can be used to refer to the value printed in the attributed -part of the string. - -@item @code{type} - -This is a user-readable name for the type of the attributed value. - -@item @code{address} - -If the value is stored in a target register, this is a register number. -If the value is stored in a GDB convenience variable, this is an integer -that is unique among all the convenience variables. Otherwise, this is -the address in the target where the value is stored. - -@item @code{deref-expression} - -If the attributed value is a pointer type, this is an expression that -refers to the dereferenced value. -@end itemize - -Here is a larger example, using the same object passed to @code{print} -in an earlier example of this section. - -@example -(gdb) explain foo -(exp-attribute - ( (expression "$16") - (type "struct bytecode_vector") - (address 14336) ) - (exp-concat - "$16 = @{" - (exp-attribute - ( (expression "$16.v") - (type "char *") - (address 14336) - (deref-expression "*$16.v") ) - "v = 0x38ae0") - (exp-attribute - ( (expression "$16.v_length") - (type "int") - (address 14340) ) - ", v_length = 40") - "@}\n")) -@end example - -It is undefined how libgdb will indent these lines of output or -where newlines will be included. - -@bye diff --git a/contrib/gdb/gdb/doc/refcard.dvi b/contrib/gdb/gdb/doc/refcard.dvi Binary files differdeleted file mode 100644 index e152395d31db0..0000000000000 --- a/contrib/gdb/gdb/doc/refcard.dvi +++ /dev/null diff --git a/contrib/gdb/gdb/doc/remote.texi b/contrib/gdb/gdb/doc/remote.texi deleted file mode 100644 index 816b65837de99..0000000000000 --- a/contrib/gdb/gdb/doc/remote.texi +++ /dev/null @@ -1,1708 +0,0 @@ -@c -*- Texinfo -*- -@c Copyright (c) 1990 1991 1992 1993 Free Software Foundation, Inc. -@c This file is part of the source for the GDB manual. -@c This text diverted to "Remote Debugging" section in general case; -@c however, if we're doing a manual specifically for one of these, it -@c belongs up front (in "Getting In and Out" chapter). - -@ifset REMOTESTUB -@node Remote Serial -@subsection The @value{GDBN} remote serial protocol - -@cindex remote serial debugging, overview -To debug a program running on another machine (the debugging -@dfn{target} machine), you must first arrange for all the usual -prerequisites for the program to run by itself. For example, for a C -program, you need: - -@enumerate -@item -A startup routine to set up the C runtime environment; these usually -have a name like @file{crt0}. The startup routine may be supplied by -your hardware supplier, or you may have to write your own. - -@item -You probably need a C subroutine library to support your program's -subroutine calls, notably managing input and output. - -@item -A way of getting your program to the other machine---for example, a -download program. These are often supplied by the hardware -manufacturer, but you may have to write your own from hardware -documentation. -@end enumerate - -The next step is to arrange for your program to use a serial port to -communicate with the machine where @value{GDBN} is running (the @dfn{host} -machine). In general terms, the scheme looks like this: - -@table @emph -@item On the host, -@value{GDBN} already understands how to use this protocol; when everything -else is set up, you can simply use the @samp{target remote} command -(@pxref{Targets,,Specifying a Debugging Target}). - -@item On the target, -you must link with your program a few special-purpose subroutines that -implement the @value{GDBN} remote serial protocol. The file containing these -subroutines is called a @dfn{debugging stub}. - -@ifset GDBSERVER -On certain remote targets, you can use an auxiliary program -@code{gdbserver} instead of linking a stub into your program. -@xref{Server,,Using the @code{gdbserver} program}, for details. -@end ifset -@end table - -The debugging stub is specific to the architecture of the remote -machine; for example, use @file{sparc-stub.c} to debug programs on -@sc{sparc} boards. - -@cindex remote serial stub list -These working remote stubs are distributed with @value{GDBN}: - -@table @code - -@item i386-stub.c -@kindex i386-stub.c -@cindex Intel -@cindex i386 -For Intel 386 and compatible architectures. - -@item m68k-stub.c -@kindex m68k-stub.c -@cindex Motorola 680x0 -@cindex m680x0 -For Motorola 680x0 architectures. - -@item sh-stub.c -@kindex sh-stub.c -@cindex Hitachi -@cindex SH -For Hitachi SH architectures. - -@item sparc-stub.c -@kindex sparc-stub.c -@cindex Sparc -For @sc{sparc} architectures. - -@item sparcl-stub.c -@kindex sparcl-stub.c -@cindex Fujitsu -@cindex SparcLite -For Fujitsu @sc{sparclite} architectures. - -@end table - -The @file{README} file in the @value{GDBN} distribution may list other -recently added stubs. - -@menu -* Stub Contents:: What the stub can do for you -* Bootstrapping:: What you must do for the stub -* Debug Session:: Putting it all together -* Protocol:: Outline of the communication protocol -@ifset GDBSERVER -* Server:: Using the `gdbserver' program -@end ifset -@ifset GDBSERVE -* NetWare:: Using the `gdbserve.nlm' program -@end ifset -@end menu - -@node Stub Contents -@subsubsection What the stub can do for you - -@cindex remote serial stub -The debugging stub for your architecture supplies these three -subroutines: - -@table @code -@item set_debug_traps -@kindex set_debug_traps -@cindex remote serial stub, initialization -This routine arranges for @code{handle_exception} to run when your -program stops. You must call this subroutine explicitly near the -beginning of your program. - -@item handle_exception -@kindex handle_exception -@cindex remote serial stub, main routine -This is the central workhorse, but your program never calls it -explicitly---the setup code arranges for @code{handle_exception} to -run when a trap is triggered. - -@code{handle_exception} takes control when your program stops during -execution (for example, on a breakpoint), and mediates communications -with @value{GDBN} on the host machine. This is where the communications -protocol is implemented; @code{handle_exception} acts as the @value{GDBN} -representative on the target machine; it begins by sending summary -information on the state of your program, then continues to execute, -retrieving and transmitting any information @value{GDBN} needs, until you -execute a @value{GDBN} command that makes your program resume; at that point, -@code{handle_exception} returns control to your own code on the target -machine. - -@item breakpoint -@cindex @code{breakpoint} subroutine, remote -Use this auxiliary subroutine to make your program contain a -breakpoint. Depending on the particular situation, this may be the only -way for @value{GDBN} to get control. For instance, if your target -machine has some sort of interrupt button, you won't need to call this; -pressing the interrupt button transfers control to -@code{handle_exception}---in effect, to @value{GDBN}. On some machines, -simply receiving characters on the serial port may also trigger a trap; -again, in that situation, you don't need to call @code{breakpoint} from -your own program---simply running @samp{target remote} from the host -@value{GDBN} session gets control. - -Call @code{breakpoint} if none of these is true, or if you simply want -to make certain your program stops at a predetermined point for the -start of your debugging session. -@end table - -@node Bootstrapping -@subsubsection What you must do for the stub - -@cindex remote stub, support routines -The debugging stubs that come with @value{GDBN} are set up for a particular -chip architecture, but they have no information about the rest of your -debugging target machine. - -First of all you need to tell the stub how to communicate with the -serial port. - -@table @code -@item int getDebugChar() -@kindex getDebugChar -Write this subroutine to read a single character from the serial port. -It may be identical to @code{getchar} for your target system; a -different name is used to allow you to distinguish the two if you wish. - -@item void putDebugChar(int) -@kindex putDebugChar -Write this subroutine to write a single character to the serial port. -It may be identical to @code{putchar} for your target system; a -different name is used to allow you to distinguish the two if you wish. -@end table - -@cindex control C, and remote debugging -@cindex interrupting remote targets -If you want @value{GDBN} to be able to stop your program while it is -running, you need to use an interrupt-driven serial driver, and arrange -for it to stop when it receives a @code{^C} (@samp{\003}, the control-C -character). That is the character which @value{GDBN} uses to tell the -remote system to stop. - -Getting the debugging target to return the proper status to @value{GDBN} -probably requires changes to the standard stub; one quick and dirty way -is to just execute a breakpoint instruction (the ``dirty'' part is that -@value{GDBN} reports a @code{SIGTRAP} instead of a @code{SIGINT}). - -Other routines you need to supply are: - -@table @code -@item void exceptionHandler (int @var{exception_number}, void *@var{exception_address}) -@kindex exceptionHandler -Write this function to install @var{exception_address} in the exception -handling tables. You need to do this because the stub does not have any -way of knowing what the exception handling tables on your target system -are like (for example, the processor's table might be in @sc{rom}, -containing entries which point to a table in @sc{ram}). -@var{exception_number} is the exception number which should be changed; -its meaning is architecture-dependent (for example, different numbers -might represent divide by zero, misaligned access, etc). When this -exception occurs, control should be transferred directly to -@var{exception_address}, and the processor state (stack, registers, -and so on) should be just as it is when a processor exception occurs. So if -you want to use a jump instruction to reach @var{exception_address}, it -should be a simple jump, not a jump to subroutine. - -For the 386, @var{exception_address} should be installed as an interrupt -gate so that interrupts are masked while the handler runs. The gate -should be at privilege level 0 (the most privileged level). The -@sc{sparc} and 68k stubs are able to mask interrup themselves without -help from @code{exceptionHandler}. - -@item void flush_i_cache() -@kindex flush_i_cache -(sparc and sparclite only) Write this subroutine to flush the -instruction cache, if any, on your target machine. If there is no -instruction cache, this subroutine may be a no-op. - -On target machines that have instruction caches, @value{GDBN} requires this -function to make certain that the state of your program is stable. -@end table - -@noindent -You must also make sure this library routine is available: - -@table @code -@item void *memset(void *, int, int) -@kindex memset -This is the standard library function @code{memset} that sets an area of -memory to a known value. If you have one of the free versions of -@code{libc.a}, @code{memset} can be found there; otherwise, you must -either obtain it from your hardware manufacturer, or write your own. -@end table - -If you do not use the GNU C compiler, you may need other standard -library subroutines as well; this varies from one stub to another, -but in general the stubs are likely to use any of the common library -subroutines which @code{gcc} generates as inline code. - - -@node Debug Session -@subsubsection Putting it all together - -@cindex remote serial debugging summary -In summary, when your program is ready to debug, you must follow these -steps. - -@enumerate -@item -Make sure you have the supporting low-level routines -(@pxref{Bootstrapping,,What you must do for the stub}): -@display -@code{getDebugChar}, @code{putDebugChar}, -@code{flush_i_cache}, @code{memset}, @code{exceptionHandler}. -@end display - -@item -Insert these lines near the top of your program: - -@example -set_debug_traps(); -breakpoint(); -@end example - -@item -For the 680x0 stub only, you need to provide a variable called -@code{exceptionHook}. Normally you just use: - -@example -void (*exceptionHook)() = 0; -@end example - -but if before calling @code{set_debug_traps}, you set it to point to a -function in your program, that function is called when -@code{@value{GDBN}} continues after stopping on a trap (for example, bus -error). The function indicated by @code{exceptionHook} is called with -one parameter: an @code{int} which is the exception number. - -@item -Compile and link together: your program, the @value{GDBN} debugging stub for -your target architecture, and the supporting subroutines. - -@item -Make sure you have a serial connection between your target machine and -the @value{GDBN} host, and identify the serial port on the host. - -@item -@c The "remote" target now provides a `load' command, so we should -@c document that. FIXME. -Download your program to your target machine (or get it there by -whatever means the manufacturer provides), and start it. - -@item -To start remote debugging, run @value{GDBN} on the host machine, and specify -as an executable file the program that is running in the remote machine. -This tells @value{GDBN} how to find your program's symbols and the contents -of its pure text. - -@cindex serial line, @code{target remote} -Then establish communication using the @code{target remote} command. -Its argument specifies how to communicate with the target -machine---either via a devicename attached to a direct serial line, or a -TCP port (usually to a terminal server which in turn has a serial line -to the target). For example, to use a serial line connected to the -device named @file{/dev/ttyb}: - -@example -target remote /dev/ttyb -@end example - -@cindex TCP port, @code{target remote} -To use a TCP connection, use an argument of the form -@code{@var{host}:port}. For example, to connect to port 2828 on a -terminal server named @code{manyfarms}: - -@example -target remote manyfarms:2828 -@end example -@end enumerate - -Now you can use all the usual commands to examine and change data and to -step and continue the remote program. - -To resume the remote program and stop debugging it, use the @code{detach} -command. - -@cindex interrupting remote programs -@cindex remote programs, interrupting -Whenever @value{GDBN} is waiting for the remote program, if you type the -interrupt character (often @key{C-C}), @value{GDBN} attempts to stop the -program. This may or may not succeed, depending in part on the hardware -and the serial drivers the remote system uses. If you type the -interrupt character once again, @value{GDBN} displays this prompt: - -@example -Interrupted while waiting for the program. -Give up (and stop debugging it)? (y or n) -@end example - -If you type @kbd{y}, @value{GDBN} abandons the remote debugging session. -(If you decide you want to try again later, you can use @samp{target -remote} again to connect once more.) If you type @kbd{n}, @value{GDBN} -goes back to waiting. - -@node Protocol -@subsubsection Communication protocol - -@cindex debugging stub, example -@cindex remote stub, example -@cindex stub example, remote debugging -The stub files provided with @value{GDBN} implement the target side of the -communication protocol, and the @value{GDBN} side is implemented in the -@value{GDBN} source file @file{remote.c}. Normally, you can simply allow -these subroutines to communicate, and ignore the details. (If you're -implementing your own stub file, you can still ignore the details: start -with one of the existing stub files. @file{sparc-stub.c} is the best -organized, and therefore the easiest to read.) - -However, there may be occasions when you need to know something about -the protocol---for example, if there is only one serial port to your -target machine, you might want your program to do something special if -it recognizes a packet meant for @value{GDBN}. - -@cindex protocol, @value{GDBN} remote serial -@cindex serial protocol, @value{GDBN} remote -@cindex remote serial protocol -All @value{GDBN} commands and responses (other than acknowledgements, which -are single characters) are sent as a packet which includes a -checksum. A packet is introduced with the character @samp{$}, and ends -with the character @samp{#} followed by a two-digit checksum: - -@example -$@var{packet info}#@var{checksum} -@end example - -@cindex checksum, for @value{GDBN} remote -@noindent -@var{checksum} is computed as the modulo 256 sum of the @var{packet -info} characters. - -When either the host or the target machine receives a packet, the first -response expected is an acknowledgement: a single character, either -@samp{+} (to indicate the package was received correctly) or @samp{-} -(to request retransmission). - -The host (@value{GDBN}) sends commands, and the target (the debugging stub -incorporated in your program) sends data in response. The target also -sends data when your program stops. - -Command packets are distinguished by their first character, which -identifies the kind of command. - -These are some of the commands currently supported (for a complete list of -commands, look in @file{gdb/remote.c.}): - -@table @code -@item g -Requests the values of CPU registers. - -@item G -Sets the values of CPU registers. - -@item m@var{addr},@var{count} -Read @var{count} bytes at location @var{addr}. - -@item M@var{addr},@var{count}:@dots{} -Write @var{count} bytes at location @var{addr}. - -@need 500 -@item c -@itemx c@var{addr} -Resume execution at the current address (or at @var{addr} if supplied). - -@need 500 -@item s -@itemx s@var{addr} -Step the target program for one instruction, from either the current -program counter or from @var{addr} if supplied. - -@item k -Kill the target program. - -@item ? -Report the most recent signal. To allow you to take advantage of the -@value{GDBN} signal handling commands, one of the functions of the debugging -stub is to report CPU traps as the corresponding POSIX signal values. - -@item T -Allows the remote stub to send only the registers that @value{GDBN} needs -to make a quick decision about single-stepping or conditional breakpoints. -This eliminates the need to fetch the entire register set for each instruction -being stepped through. - -@value{GDBN} now implements a write-through cache for registers and only -re-reads the registers if the target has run. -@end table - -@kindex set remotedebug -@kindex show remotedebug -@cindex packets, reporting on stdout -@cindex serial connections, debugging -If you have trouble with the serial connection, you can use the command -@code{set remotedebug}. This makes @value{GDBN} report on all packets sent -back and forth across the serial line to the remote machine. The -packet-debugging information is printed on the @value{GDBN} standard output -stream. @code{set remotedebug off} turns it off, and @code{show -remotedebug} shows you its current state. - -@ifset GDBSERVER -@node Server -@subsubsection Using the @code{gdbserver} program - -@kindex gdbserver -@cindex remote connection without stubs -@code{gdbserver} is a control program for Unix-like systems, which -allows you to connect your program with a remote @value{GDBN} via -@code{target remote}---but without linking in the usual debugging stub. - -@code{gdbserver} is not a complete replacement for the debugging stubs, -because it requires essentially the same operating-system facilities -that @value{GDBN} itself does. In fact, a system that can run -@code{gdbserver} to connect to a remote @value{GDBN} could also run -@value{GDBN} locally! @code{gdbserver} is sometimes useful nevertheless, -because it is a much smaller program than @value{GDBN} itself. It is -also easier to port than all of @value{GDBN}, so you may be able to get -started more quickly on a new system by using @code{gdbserver}. -Finally, if you develop code for real-time systems, you may find that -the tradeoffs involved in real-time operation make it more convenient to -do as much development work as possible on another system, for example -by cross-compiling. You can use @code{gdbserver} to make a similar -choice for debugging. - -@value{GDBN} and @code{gdbserver} communicate via either a serial line -or a TCP connection, using the standard @value{GDBN} remote serial -protocol. - -@table @emph -@item On the target machine, -you need to have a copy of the program you want to debug. -@code{gdbserver} does not need your program's symbol table, so you can -strip the program if necessary to save space. @value{GDBN} on the host -system does all the symbol handling. - -To use the server, you must tell it how to communicate with @value{GDBN}; -the name of your program; and the arguments for your program. The -syntax is: - -@smallexample -target> gdbserver @var{comm} @var{program} [ @var{args} @dots{} ] -@end smallexample - -@var{comm} is either a device name (to use a serial line) or a TCP -hostname and portnumber. For example, to debug Emacs with the argument -@samp{foo.txt} and communicate with @value{GDBN} over the serial port -@file{/dev/com1}: - -@smallexample -target> gdbserver /dev/com1 emacs foo.txt -@end smallexample - -@code{gdbserver} waits passively for the host @value{GDBN} to communicate -with it. - -To use a TCP connection instead of a serial line: - -@smallexample -target> gdbserver host:2345 emacs foo.txt -@end smallexample - -The only difference from the previous example is the first argument, -specifying that you are communicating with the host @value{GDBN} via -TCP. The @samp{host:2345} argument means that @code{gdbserver} is to -expect a TCP connection from machine @samp{host} to local TCP port 2345. -(Currently, the @samp{host} part is ignored.) You can choose any number -you want for the port number as long as it does not conflict with any -TCP ports already in use on the target system (for example, @code{23} is -reserved for @code{telnet}).@footnote{If you choose a port number that -conflicts with another service, @code{gdbserver} prints an error message -and exits.} You must use the same port number with the host @value{GDBN} -@code{target remote} command. - -@item On the @value{GDBN} host machine, -you need an unstripped copy of your program, since @value{GDBN} needs -symbols and debugging information. Start up @value{GDBN} as usual, -using the name of the local copy of your program as the first argument. -(You may also need the @w{@samp{--baud}} option if the serial line is -running at anything other than 9600 bps.) After that, use @code{target -remote} to establish communications with @code{gdbserver}. Its argument -is either a device name (usually a serial device, like -@file{/dev/ttyb}), or a TCP port descriptor in the form -@code{@var{host}:@var{PORT}}. For example: - -@smallexample -(@value{GDBP}) target remote /dev/ttyb -@end smallexample - -@noindent -communicates with the server via serial line @file{/dev/ttyb}, and - -@smallexample -(@value{GDBP}) target remote the-target:2345 -@end smallexample - -@noindent -communicates via a TCP connection to port 2345 on host @w{@file{the-target}}. -For TCP connections, you must start up @code{gdbserver} prior to using -the @code{target remote} command. Otherwise you may get an error whose -text depends on the host system, but which usually looks something like -@samp{Connection refused}. -@end table -@end ifset - -@ifset GDBSERVE -@node NetWare -@subsubsection Using the @code{gdbserve.nlm} program - -@kindex gdbserve.nlm -@code{gdbserve.nlm} is a control program for NetWare systems, which -allows you to connect your program with a remote @value{GDBN} via -@code{target remote}. - -@value{GDBN} and @code{gdbserve.nlm} communicate via a serial line, -using the standard @value{GDBN} remote serial protocol. - -@table @emph -@item On the target machine, -you need to have a copy of the program you want to debug. -@code{gdbserve.nlm} does not need your program's symbol table, so you -can strip the program if necessary to save space. @value{GDBN} on the -host system does all the symbol handling. - -To use the server, you must tell it how to communicate with -@value{GDBN}; the name of your program; and the arguments for your -program. The syntax is: - -@smallexample -load gdbserve [ BOARD=@var{board} ] [ PORT=@var{port} ] - [ BAUD=@var{baud} ] @var{program} [ @var{args} @dots{} ] -@end smallexample - -@var{board} and @var{port} specify the serial line; @var{baud} specifies -the baud rate used by the connection. @var{port} and @var{node} default -to 0, @var{baud} defaults to 9600 bps. - -For example, to debug Emacs with the argument @samp{foo.txt}and -communicate with @value{GDBN} over serial port number 2 or board 1 -using a 19200 bps connection: - -@smallexample -load gdbserve BOARD=1 PORT=2 BAUD=19200 emacs foo.txt -@end smallexample - -@item On the @value{GDBN} host machine, -you need an unstripped copy of your program, since @value{GDBN} needs -symbols and debugging information. Start up @value{GDBN} as usual, -using the name of the local copy of your program as the first argument. -(You may also need the @w{@samp{--baud}} option if the serial line is -running at anything other than 9600 bps. After that, use @code{target -remote} to establish communications with @code{gdbserve.nlm}. Its -argument is a device name (usually a serial device, like -@file{/dev/ttyb}). For example: - -@smallexample -(@value{GDBP}) target remote /dev/ttyb -@end smallexample - -@noindent -communications with the server via serial line @file{/dev/ttyb}. -@end table -@end ifset - -@end ifset - -@ifset I960 -@node i960-Nindy Remote -@subsection @value{GDBN} with a remote i960 (Nindy) - -@cindex Nindy -@cindex i960 -@dfn{Nindy} is a ROM Monitor program for Intel 960 target systems. When -@value{GDBN} is configured to control a remote Intel 960 using Nindy, you can -tell @value{GDBN} how to connect to the 960 in several ways: - -@itemize @bullet -@item -Through command line options specifying serial port, version of the -Nindy protocol, and communications speed; - -@item -By responding to a prompt on startup; - -@item -By using the @code{target} command at any point during your @value{GDBN} -session. @xref{Target Commands, ,Commands for managing targets}. - -@end itemize - -@menu -* Nindy Startup:: Startup with Nindy -* Nindy Options:: Options for Nindy -* Nindy Reset:: Nindy reset command -@end menu - -@node Nindy Startup -@subsubsection Startup with Nindy - -If you simply start @code{@value{GDBP}} without using any command-line -options, you are prompted for what serial port to use, @emph{before} you -reach the ordinary @value{GDBN} prompt: - -@example -Attach /dev/ttyNN -- specify NN, or "quit" to quit: -@end example - -@noindent -Respond to the prompt with whatever suffix (after @samp{/dev/tty}) -identifies the serial port you want to use. You can, if you choose, -simply start up with no Nindy connection by responding to the prompt -with an empty line. If you do this and later wish to attach to Nindy, -use @code{target} (@pxref{Target Commands, ,Commands for managing targets}). - -@node Nindy Options -@subsubsection Options for Nindy - -These are the startup options for beginning your @value{GDBN} session with a -Nindy-960 board attached: - -@table @code -@item -r @var{port} -Specify the serial port name of a serial interface to be used to connect -to the target system. This option is only available when @value{GDBN} is -configured for the Intel 960 target architecture. You may specify -@var{port} as any of: a full pathname (e.g. @samp{-r /dev/ttya}), a -device name in @file{/dev} (e.g. @samp{-r ttya}), or simply the unique -suffix for a specific @code{tty} (e.g. @samp{-r a}). - -@item -O -(An uppercase letter ``O'', not a zero.) Specify that @value{GDBN} should use -the ``old'' Nindy monitor protocol to connect to the target system. -This option is only available when @value{GDBN} is configured for the Intel 960 -target architecture. - -@quotation -@emph{Warning:} if you specify @samp{-O}, but are actually trying to -connect to a target system that expects the newer protocol, the connection -fails, appearing to be a speed mismatch. @value{GDBN} repeatedly -attempts to reconnect at several different line speeds. You can abort -this process with an interrupt. -@end quotation - -@item -brk -Specify that @value{GDBN} should first send a @code{BREAK} signal to the target -system, in an attempt to reset it, before connecting to a Nindy target. - -@quotation -@emph{Warning:} Many target systems do not have the hardware that this -requires; it only works with a few boards. -@end quotation -@end table - -The standard @samp{-b} option controls the line speed used on the serial -port. - -@c @group -@node Nindy Reset -@subsubsection Nindy reset command - -@table @code -@item reset -@kindex reset -For a Nindy target, this command sends a ``break'' to the remote target -system; this is only useful if the target has been equipped with a -circuit to perform a hard reset (or some other interesting action) when -a break is detected. -@end table -@c @end group -@end ifset - -@ifset AMD29K -@node UDI29K Remote -@subsection The UDI protocol for AMD29K - -@cindex UDI -@cindex AMD29K via UDI -@value{GDBN} supports AMD's UDI (``Universal Debugger Interface'') -protocol for debugging the a29k processor family. To use this -configuration with AMD targets running the MiniMON monitor, you need the -program @code{MONTIP}, available from AMD at no charge. You can also -use @value{GDBN} with the UDI-conformant a29k simulator program -@code{ISSTIP}, also available from AMD. - -@table @code -@item target udi @var{keyword} -@kindex udi -Select the UDI interface to a remote a29k board or simulator, where -@var{keyword} is an entry in the AMD configuration file @file{udi_soc}. -This file contains keyword entries which specify parameters used to -connect to a29k targets. If the @file{udi_soc} file is not in your -working directory, you must set the environment variable @samp{UDICONF} -to its pathname. -@end table - -@node EB29K Remote -@subsection The EBMON protocol for AMD29K - -@cindex EB29K board -@cindex running 29K programs - -AMD distributes a 29K development board meant to fit in a PC, together -with a DOS-hosted monitor program called @code{EBMON}. As a shorthand -term, this development system is called the ``EB29K''. To use -@value{GDBN} from a Unix system to run programs on the EB29K board, you -must first connect a serial cable between the PC (which hosts the EB29K -board) and a serial port on the Unix system. In the following, we -assume you've hooked the cable between the PC's @file{COM1} port and -@file{/dev/ttya} on the Unix system. - -@menu -* Comms (EB29K):: Communications setup -* gdb-EB29K:: EB29K cross-debugging -* Remote Log:: Remote log -@end menu - -@node Comms (EB29K) -@subsubsection Communications setup - -The next step is to set up the PC's port, by doing something like this -in DOS on the PC: - -@example -C:\> MODE com1:9600,n,8,1,none -@end example - -@noindent -This example---run on an MS DOS 4.0 system---sets the PC port to 9600 -bps, no parity, eight data bits, one stop bit, and no ``retry'' action; -you must match the communications parameters when establishing the Unix -end of the connection as well. -@c FIXME: Who knows what this "no retry action" crud from the DOS manual may -@c mean? It's optional; leave it out? ---doc@cygnus.com, 25feb91 - -To give control of the PC to the Unix side of the serial line, type -the following at the DOS console: - -@example -C:\> CTTY com1 -@end example - -@noindent -(Later, if you wish to return control to the DOS console, you can use -the command @code{CTTY con}---but you must send it over the device that -had control, in our example over the @file{COM1} serial line). - -From the Unix host, use a communications program such as @code{tip} or -@code{cu} to communicate with the PC; for example, - -@example -cu -s 9600 -l /dev/ttya -@end example - -@noindent -The @code{cu} options shown specify, respectively, the linespeed and the -serial port to use. If you use @code{tip} instead, your command line -may look something like the following: - -@example -tip -9600 /dev/ttya -@end example - -@noindent -Your system may require a different name where we show -@file{/dev/ttya} as the argument to @code{tip}. The communications -parameters, including which port to use, are associated with the -@code{tip} argument in the ``remote'' descriptions file---normally the -system table @file{/etc/remote}. -@c FIXME: What if anything needs doing to match the "n,8,1,none" part of -@c the DOS side's comms setup? cu can support -o (odd -@c parity), -e (even parity)---apparently no settings for no parity or -@c for character size. Taken from stty maybe...? John points out tip -@c can set these as internal variables, eg ~s parity=none; man stty -@c suggests that it *might* work to stty these options with stdin or -@c stdout redirected... ---doc@cygnus.com, 25feb91 - -@kindex EBMON -Using the @code{tip} or @code{cu} connection, change the DOS working -directory to the directory containing a copy of your 29K program, then -start the PC program @code{EBMON} (an EB29K control program supplied -with your board by AMD). You should see an initial display from -@code{EBMON} similar to the one that follows, ending with the -@code{EBMON} prompt @samp{#}--- - -@example -C:\> G: - -G:\> CD \usr\joe\work29k - -G:\USR\JOE\WORK29K> EBMON -Am29000 PC Coprocessor Board Monitor, version 3.0-18 -Copyright 1990 Advanced Micro Devices, Inc. -Written by Gibbons and Associates, Inc. - -Enter '?' or 'H' for help - -PC Coprocessor Type = EB29K -I/O Base = 0x208 -Memory Base = 0xd0000 - -Data Memory Size = 2048KB -Available I-RAM Range = 0x8000 to 0x1fffff -Available D-RAM Range = 0x80002000 to 0x801fffff - -PageSize = 0x400 -Register Stack Size = 0x800 -Memory Stack Size = 0x1800 - -CPU PRL = 0x3 -Am29027 Available = No -Byte Write Available = Yes - -# ~. -@end example - -Then exit the @code{cu} or @code{tip} program (done in the example by -typing @code{~.} at the @code{EBMON} prompt). @code{EBMON} keeps -running, ready for @value{GDBN} to take over. - -For this example, we've assumed what is probably the most convenient -way to make sure the same 29K program is on both the PC and the Unix -system: a PC/NFS connection that establishes ``drive @code{G:}'' on the -PC as a file system on the Unix host. If you do not have PC/NFS or -something similar connecting the two systems, you must arrange some -other way---perhaps floppy-disk transfer---of getting the 29K program -from the Unix system to the PC; @value{GDBN} does @emph{not} download it over the -serial line. - -@node gdb-EB29K -@subsubsection EB29K cross-debugging - -Finally, @code{cd} to the directory containing an image of your 29K -program on the Unix system, and start @value{GDBN}---specifying as argument the -name of your 29K program: - -@example -cd /usr/joe/work29k -@value{GDBP} myfoo -@end example - -@need 500 -Now you can use the @code{target} command: - -@example -target amd-eb /dev/ttya 9600 MYFOO -@c FIXME: test above 'target amd-eb' as spelled, with caps! caps are meant to -@c emphasize that this is the name as seen by DOS (since I think DOS is -@c single-minded about case of letters). ---doc@cygnus.com, 25feb91 -@end example - -@noindent -In this example, we've assumed your program is in a file called -@file{myfoo}. Note that the filename given as the last argument to -@code{target amd-eb} should be the name of the program as it appears to DOS. -In our example this is simply @code{MYFOO}, but in general it can include -a DOS path, and depending on your transfer mechanism may not resemble -the name on the Unix side. - -At this point, you can set any breakpoints you wish; when you are ready -to see your program run on the 29K board, use the @value{GDBN} command -@code{run}. - -To stop debugging the remote program, use the @value{GDBN} @code{detach} -command. - -To return control of the PC to its console, use @code{tip} or @code{cu} -once again, after your @value{GDBN} session has concluded, to attach to -@code{EBMON}. You can then type the command @code{q} to shut down -@code{EBMON}, returning control to the DOS command-line interpreter. -Type @code{CTTY con} to return command input to the main DOS console, -and type @kbd{~.} to leave @code{tip} or @code{cu}. - -@node Remote Log -@subsubsection Remote log -@kindex eb.log -@cindex log file for EB29K - -The @code{target amd-eb} command creates a file @file{eb.log} in the -current working directory, to help debug problems with the connection. -@file{eb.log} records all the output from @code{EBMON}, including echoes -of the commands sent to it. Running @samp{tail -f} on this file in -another window often helps to understand trouble with @code{EBMON}, or -unexpected events on the PC side of the connection. - -@end ifset - -@ifset ST2000 -@node ST2000 Remote -@subsection @value{GDBN} with a Tandem ST2000 - -To connect your ST2000 to the host system, see the manufacturer's -manual. Once the ST2000 is physically attached, you can run: - -@example -target st2000 @var{dev} @var{speed} -@end example - -@noindent -to establish it as your debugging environment. @var{dev} is normally -the name of a serial device, such as @file{/dev/ttya}, connected to the -ST2000 via a serial line. You can instead specify @var{dev} as a TCP -connection (for example, to a serial line attached via a terminal -concentrator) using the syntax @code{@var{hostname}:@var{portnumber}}. - -The @code{load} and @code{attach} commands are @emph{not} defined for -this target; you must load your program into the ST2000 as you normally -would for standalone operation. @value{GDBN} reads debugging information -(such as symbols) from a separate, debugging version of the program -available on your host computer. -@c FIXME!! This is terribly vague; what little content is here is -@c basically hearsay. - -@cindex ST2000 auxiliary commands -These auxiliary @value{GDBN} commands are available to help you with the ST2000 -environment: - -@table @code -@item st2000 @var{command} -@kindex st2000 @var{cmd} -@cindex STDBUG commands (ST2000) -@cindex commands to STDBUG (ST2000) -Send a @var{command} to the STDBUG monitor. See the manufacturer's -manual for available commands. - -@item connect -@cindex connect (to STDBUG) -Connect the controlling terminal to the STDBUG command monitor. When -you are done interacting with STDBUG, typing either of two character -sequences gets you back to the @value{GDBN} command prompt: -@kbd{@key{RET}~.} (Return, followed by tilde and period) or -@kbd{@key{RET}~@key{C-d}} (Return, followed by tilde and control-D). -@end table -@end ifset - -@ifset VXWORKS -@node VxWorks Remote -@subsection @value{GDBN} and VxWorks -@cindex VxWorks - -@value{GDBN} enables developers to spawn and debug tasks running on networked -VxWorks targets from a Unix host. Already-running tasks spawned from -the VxWorks shell can also be debugged. @value{GDBN} uses code that runs on -both the Unix host and on the VxWorks target. The program -@code{gdb} is installed and executed on the Unix host. (It may be -installed with the name @code{vxgdb}, to distinguish it from a -@value{GDBN} for debugging programs on the host itself.) - -@table @code -@item VxWorks-timeout @var{args} -@kindex vxworks-timeout -All VxWorks-based targets now support the option @code{vxworks-timeout}. -This option is set by the user, and @var{args} represents the number of -seconds @value{GDBN} waits for responses to rpc's. You might use this if -your VxWorks target is a slow software simulator or is on the far side -of a thin network line. -@end table - -The following information on connecting to VxWorks was current when -this manual was produced; newer releases of VxWorks may use revised -procedures. - -@kindex INCLUDE_RDB -To use @value{GDBN} with VxWorks, you must rebuild your VxWorks kernel -to include the remote debugging interface routines in the VxWorks -library @file{rdb.a}. To do this, define @code{INCLUDE_RDB} in the -VxWorks configuration file @file{configAll.h} and rebuild your VxWorks -kernel. The resulting kernel contains @file{rdb.a}, and spawns the -source debugging task @code{tRdbTask} when VxWorks is booted. For more -information on configuring and remaking VxWorks, see the manufacturer's -manual. -@c VxWorks, see the @cite{VxWorks Programmer's Guide}. - -Once you have included @file{rdb.a} in your VxWorks system image and set -your Unix execution search path to find @value{GDBN}, you are ready to -run @value{GDBN}. From your Unix host, run @code{gdb} (or @code{vxgdb}, -depending on your installation). - -@value{GDBN} comes up showing the prompt: - -@example -(vxgdb) -@end example - -@menu -* VxWorks Connection:: Connecting to VxWorks -* VxWorks Download:: VxWorks download -* VxWorks Attach:: Running tasks -@end menu - -@node VxWorks Connection -@subsubsection Connecting to VxWorks - -The @value{GDBN} command @code{target} lets you connect to a VxWorks target on the -network. To connect to a target whose host name is ``@code{tt}'', type: - -@example -(vxgdb) target vxworks tt -@end example - -@need 750 -@value{GDBN} displays messages like these: - -@smallexample -Attaching remote machine across net... -Connected to tt. -@end smallexample - -@need 1000 -@value{GDBN} then attempts to read the symbol tables of any object modules -loaded into the VxWorks target since it was last booted. @value{GDBN} locates -these files by searching the directories listed in the command search -path (@pxref{Environment, ,Your program's environment}); if it fails -to find an object file, it displays a message such as: - -@example -prog.o: No such file or directory. -@end example - -When this happens, add the appropriate directory to the search path with -the @value{GDBN} command @code{path}, and execute the @code{target} -command again. - -@node VxWorks Download -@subsubsection VxWorks download - -@cindex download to VxWorks -If you have connected to the VxWorks target and you want to debug an -object that has not yet been loaded, you can use the @value{GDBN} -@code{load} command to download a file from Unix to VxWorks -incrementally. The object file given as an argument to the @code{load} -command is actually opened twice: first by the VxWorks target in order -to download the code, then by @value{GDBN} in order to read the symbol -table. This can lead to problems if the current working directories on -the two systems differ. If both systems have NFS mounted the same -filesystems, you can avoid these problems by using absolute paths. -Otherwise, it is simplest to set the working directory on both systems -to the directory in which the object file resides, and then to reference -the file by its name, without any path. For instance, a program -@file{prog.o} may reside in @file{@var{vxpath}/vw/demo/rdb} in VxWorks -and in @file{@var{hostpath}/vw/demo/rdb} on the host. To load this -program, type this on VxWorks: - -@example --> cd "@var{vxpath}/vw/demo/rdb" -@end example -v -Then, in @value{GDBN}, type: - -@example -(vxgdb) cd @var{hostpath}/vw/demo/rdb -(vxgdb) load prog.o -@end example - -@value{GDBN} displays a response similar to this: - -@smallexample -Reading symbol data from wherever/vw/demo/rdb/prog.o... done. -@end smallexample - -You can also use the @code{load} command to reload an object module -after editing and recompiling the corresponding source file. Note that -this makes @value{GDBN} delete all currently-defined breakpoints, -auto-displays, and convenience variables, and to clear the value -history. (This is necessary in order to preserve the integrity of -debugger data structures that reference the target system's symbol -table.) - -@node VxWorks Attach -@subsubsection Running tasks - -@cindex running VxWorks tasks -You can also attach to an existing task using the @code{attach} command as -follows: - -@example -(vxgdb) attach @var{task} -@end example - -@noindent -where @var{task} is the VxWorks hexadecimal task ID. The task can be running -or suspended when you attach to it. Running tasks are suspended at -the time of attachment. -@end ifset - -@ifset SPARCLET -@node Sparclet Remote -@subsection @value{GDBN} and Sparclet -@cindex Sparclet - -@value{GDBN} enables developers to debug tasks running on -Sparclet targets from a Unix host. -@value{GDBN} uses code that runs on -both the Unix host and on the Sparclet target. The program -@code{gdb} is installed and executed on the Unix host. - -@table @code -@item timeout @var{args} -@kindex remotetimeout -@value{GDBN} now supports the option @code{remotetimeout}. -This option is set by the user, and @var{args} represents the number of -seconds @value{GDBN} waits for responses. -@end table - -@kindex Compiling -When compiling for debugging, include the options "-g" to get debug -information and "-Ttext" to relocate the program to where you wish to -load it on the target. You may also want to add the options "-n" or -"-N" in order to reduce the size of the sections. - -@example -sparclet-aout-gcc prog.c -Ttext 0x12010000 -g -o prog -N -@end example - -You can use objdump to verify that the addresses are what you intended. - -@example -sparclet-aout-objdump --headers --syms prog -@end example - -@kindex Running -Once you have set -your Unix execution search path to find @value{GDBN}, you are ready to -run @value{GDBN}. From your Unix host, run @code{gdb} -(or @code{sparclet-aout-gdb}, depending on your installation). - -@value{GDBN} comes up showing the prompt: - -@example -(gdbslet) -@end example - -@menu -* Sparclet File:: Setting the file to debug -* Sparclet Connection:: Connecting to Sparclet -* Sparclet Download:: Sparclet download -* Sparclet Execution:: Running and debugging -@end menu - -@node Sparclet File -@subsubsection Setting file to debug - -The @value{GDBN} command @code{file} lets you choose with program to debug. - -@example -(gdbslet) file prog -@end example - -@need 1000 -@value{GDBN} then attempts to read the symbol table of @file{prog}. -@value{GDBN} locates -the file by searching the directories listed in the command search -path. -If the file was compiled with debug information (option "-g"), source -files will be searched as well. -@value{GDBN} locates -the source files by searching the directories listed in the directory search -path (@pxref{Environment, ,Your program's environment}). -If it fails -to find a file, it displays a message such as: - -@example -prog: No such file or directory. -@end example - -When this happens, add the appropriate directories to the search paths with -the @value{GDBN} commands @code{path} and @code{dir}, and execute the -@code{target} command again. - -@node Sparclet Connection -@subsubsection Connecting to Sparclet - -The @value{GDBN} command @code{target} lets you connect to a Sparclet target. -To connect to a target on serial port ``@code{ttya}'', type: - -@example -(gdbslet) target sparclet /dev/ttya -Remote target sparclet connected to /dev/ttya -main () at ../prog.c:3 -@end example - -@need 750 -@value{GDBN} displays messages like these: - -@smallexample -Connected to ttya. -@end smallexample - -@node Sparclet Download -@subsubsection Sparclet download - -@cindex download to Sparclet -Once connected to the Sparclet target, -you can use the @value{GDBN} -@code{load} command to download the file from the host to the target. -The file name and load offset should be given as arguments to the @code{load} -command. -Since the file format is aout, the program must be loaded to the starting -address. You can use objdump to find out what this value is. The load -offset is an offset which is added to the VMA (virtual memory address) -of each of the file's sections. -For instance, if the program -@file{prog} was linked to text address 0x1201000, with data at 0x12010160 -and bss at 0x12010170, in @value{GDBN}, type: - -@example -(gdbslet) load prog 0x12010000 -Loading section .text, size 0xdb0 vma 0x12010000 -@end example - -If the code is loaded at a different address then what the program was linked -to, you may need to use the @code{section} and @code{add-symbol-file} commands -to tell @value{GDBN} where to map the symbol table. - -@node Sparclet Execution -@subsubsection Running and debugging - -@cindex running and debugging Sparclet programs -You can now begin debugging the task using @value{GDBN}'s execution control -commands, @code{b}, @code{step}, @code{run}, etc. See the @value{GDBN} -manual for the list of commands. - -@example -(gdbslet) b main -Breakpoint 1 at 0x12010000: file prog.c, line 3. -(gdbslet) run -Starting program: prog -Breakpoint 1, main (argc=1, argv=0xeffff21c) at prog.c:3 -3 char *symarg = 0; -(gdbslet) step -4 char *execarg = "hello!"; -(gdbslet) -@end example - -@end ifset - -@ifset H8 -@node Hitachi Remote -@subsection @value{GDBN} and Hitachi microprocessors -@value{GDBN} needs to know these things to talk to your -Hitachi SH, H8/300, or H8/500: - -@enumerate -@item -that you want to use @samp{target hms}, the remote debugging interface -for Hitachi microprocessors, or @samp{target e7000}, the in-circuit -emulator for the Hitachi SH and the Hitachi 300H. (@samp{target hms} is -the default when GDB is configured specifically for the Hitachi SH, -H8/300, or H8/500.) - -@item -what serial device connects your host to your Hitachi board (the first -serial device available on your host is the default). - -@ifclear H8EXCLUSIVE -@c this is only for Unix hosts, not of interest to Hitachi -@item -what speed to use over the serial device. -@end ifclear -@end enumerate - -@menu -* Hitachi Boards:: Connecting to Hitachi boards. -* Hitachi ICE:: Using the E7000 In-Circuit Emulator. -* Hitachi Special:: Special @value{GDBN} commands for Hitachi micros. -@end menu - -@node Hitachi Boards -@subsubsection Connecting to Hitachi boards - -@ifclear H8EXCLUSIVE -@c only for Unix hosts -@kindex device -@cindex serial device, Hitachi micros -Use the special @code{@value{GDBP}} command @samp{device @var{port}} if you -need to explicitly set the serial device. The default @var{port} is the -first available port on your host. This is only necessary on Unix -hosts, where it is typically something like @file{/dev/ttya}. - -@kindex speed -@cindex serial line speed, Hitachi micros -@code{@value{GDBP}} has another special command to set the communications -speed: @samp{speed @var{bps}}. This command also is only used from Unix -hosts; on DOS hosts, set the line speed as usual from outside GDB with -the DOS @kbd{mode} command (for instance, @w{@samp{mode -com2:9600,n,8,1,p}} for a 9600 bps connection). - -The @samp{device} and @samp{speed} commands are available only when you -use a Unix host to debug your Hitachi microprocessor programs. If you -use a DOS host, -@end ifclear -@value{GDBN} depends on an auxiliary terminate-and-stay-resident program -called @code{asynctsr} to communicate with the development board -through a PC serial port. You must also use the DOS @code{mode} command -to set up the serial port on the DOS side. - -@ifset DOSHOST -The following sample session illustrates the steps needed to start a -program under @value{GDBN} control on an H8/300. The example uses a -sample H8/300 program called @file{t.x}. The procedure is the same for -the Hitachi SH and the H8/500. - -First hook up your development board. In this example, we use a -board attached to serial port @code{COM2}; if you use a different serial -port, substitute its name in the argument of the @code{mode} command. -When you call @code{asynctsr}, the auxiliary comms program used by the -degugger, you give it just the numeric part of the serial port's name; -for example, @samp{asyncstr 2} below runs @code{asyncstr} on -@code{COM2}. - -@example -C:\H8300\TEST> asynctsr 2 -C:\H8300\TEST> mode com2:9600,n,8,1,p - -Resident portion of MODE loaded - -COM2: 9600, n, 8, 1, p - -@end example - -@quotation -@emph{Warning:} We have noticed a bug in PC-NFS that conflicts with -@code{asynctsr}. If you also run PC-NFS on your DOS host, you may need to -disable it, or even boot without it, to use @code{asynctsr} to control -your development board. -@end quotation - -@kindex target hms -Now that serial communications are set up, and the development board is -connected, you can start up @value{GDBN}. Call @code{@value{GDBP}} with -the name of your program as the argument. @code{@value{GDBP}} prompts -you, as usual, with the prompt @samp{(@value{GDBP})}. Use two special -commands to begin your debugging session: @samp{target hms} to specify -cross-debugging to the Hitachi board, and the @code{load} command to -download your program to the board. @code{load} displays the names of -the program's sections, and a @samp{*} for each 2K of data downloaded. -(If you want to refresh @value{GDBN} data on symbols or on the -executable file without downloading, use the @value{GDBN} commands -@code{file} or @code{symbol-file}. These commands, and @code{load} -itself, are described in @ref{Files,,Commands to specify files}.) - -@smallexample -(eg-C:\H8300\TEST) @value{GDBP} t.x -GDB is free software and you are welcome to distribute copies - of it under certain conditions; type "show copying" to see - the conditions. -There is absolutely no warranty for GDB; type "show warranty" -for details. -GDB @value{GDBVN}, Copyright 1992 Free Software Foundation, Inc... -(gdb) target hms -Connected to remote H8/300 HMS system. -(gdb) load t.x -.text : 0x8000 .. 0xabde *********** -.data : 0xabde .. 0xad30 * -.stack : 0xf000 .. 0xf014 * -@end smallexample - -At this point, you're ready to run or debug your program. From here on, -you can use all the usual @value{GDBN} commands. The @code{break} command -sets breakpoints; the @code{run} command starts your program; -@code{print} or @code{x} display data; the @code{continue} command -resumes execution after stopping at a breakpoint. You can use the -@code{help} command at any time to find out more about @value{GDBN} commands. - -Remember, however, that @emph{operating system} facilities aren't -available on your development board; for example, if your program hangs, -you can't send an interrupt---but you can press the @sc{reset} switch! - -Use the @sc{reset} button on the development board -@itemize @bullet -@item -to interrupt your program (don't use @kbd{ctl-C} on the DOS host---it has -no way to pass an interrupt signal to the development board); and - -@item -to return to the @value{GDBN} command prompt after your program finishes -normally. The communications protocol provides no other way for @value{GDBN} -to detect program completion. -@end itemize - -In either case, @value{GDBN} sees the effect of a @sc{reset} on the -development board as a ``normal exit'' of your program. -@end ifset - -@node Hitachi ICE -@subsubsection Using the E7000 in-circuit emulator - -@kindex target e7000 -You can use the E7000 in-circuit emulator to develop code for either the -Hitachi SH or the H8/300H. Use one of these forms of the @samp{target -e7000} command to connect @value{GDBN} to your E7000: - -@table @code -@item target e7000 @var{port} @var{speed} -Use this form if your E7000 is connected to a serial port. The -@var{port} argument identifies what serial port to use (for example, -@samp{com2}). The third argument is the line speed in bits per second -(for example, @samp{9600}). - -@item target e7000 @var{hostname} -If your E7000 is installed as a host on a TCP/IP network, you can just -specify its hostname; @value{GDBN} uses @code{telnet} to connect. -@end table - -@node Hitachi Special -@subsubsection Special @value{GDBN} commands for Hitachi micros - -Some @value{GDBN} commands are available only on the H8/300 or the -H8/500 configurations: - -@table @code -@kindex set machine -@kindex show machine -@item set machine h8300 -@itemx set machine h8300h -Condition @value{GDBN} for one of the two variants of the H8/300 -architecture with @samp{set machine}. You can use @samp{show machine} -to check which variant is currently in effect. - -@kindex set memory @var{mod} -@cindex memory models, H8/500 -@item set memory @var{mod} -@itemx show memory -Specify which H8/500 memory model (@var{mod}) you are using with -@samp{set memory}; check which memory model is in effect with @samp{show -memory}. The accepted values for @var{mod} are @code{small}, -@code{big}, @code{medium}, and @code{compact}. -@end table - -@end ifset - -@ifset MIPS -@node MIPS Remote -@subsection @value{GDBN} and remote MIPS boards - -@cindex MIPS boards -@value{GDBN} can use the MIPS remote debugging protocol to talk to a -MIPS board attached to a serial line. This is available when -you configure @value{GDBN} with @samp{--target=mips-idt-ecoff}. - -@need 1000 -Use these @value{GDBN} commands to specify the connection to your target board: - -@table @code -@item target mips @var{port} -@kindex target mips @var{port} -To run a program on the board, start up @code{@value{GDBP}} with the -name of your program as the argument. To connect to the board, use the -command @samp{target mips @var{port}}, where @var{port} is the name of -the serial port connected to the board. If the program has not already -been downloaded to the board, you may use the @code{load} command to -download it. You can then use all the usual @value{GDBN} commands. - -For example, this sequence connects to the target board through a serial -port, and loads and runs a program called @var{prog} through the -debugger: - -@example -host$ @value{GDBP} @var{prog} -GDB is free software and @dots{} -(gdb) target mips /dev/ttyb -(gdb) load @var{prog} -(gdb) run -@end example - -@item target mips @var{hostname}:@var{portnumber} -On some @value{GDBN} host configurations, you can specify a TCP -connection (for instance, to a serial line managed by a terminal -concentrator) instead of a serial port, using the syntax -@samp{@var{hostname}:@var{portnumber}}. - -@item target pmon @var{port} -@kindex target pmon @var{port} - -@item target ddb @var{port} -@kindex target ddb @var{port} - -@item target lsi @var{port} -@kindex target lsi @var{port} - -@end table - - -@noindent -@value{GDBN} also supports these special commands for MIPS targets: - -@table @code -@item set processor @var{args} -@itemx show processor -@kindex set processor @var{args} -@kindex show processor -Use the @code{set processor} command to set the type of MIPS -processor when you want to access processor-type-specific registers. -For example, @code{set processor @var{r3041}} tells @value{GDBN} -to use the CPO registers appropriate for the 3041 chip. -Use the @code{show processor} command to see what MIPS processor @value{GDBN} -is using. Use the @code{info reg} command to see what registers -@value{GDBN} is using. - -@item set mipsfpu double -@itemx set mipsfpu single -@itemx set mipsfpu none -@itemx show mipsfpu -@kindex set mipsfpu -@kindex show mipsfpu -@cindex MIPS remote floating point -@cindex floating point, MIPS remote -If your target board does not support the MIPS floating point -coprocessor, you should use the command @samp{set mipsfpu none} (if you -need this, you may wish to put the command in your @value{GDBINIT} -file). This tells @value{GDBN} how to find the return value of -functions which return floating point values. It also allows -@value{GDBN} to avoid saving the floating point registers when calling -functions on the board. If you are using a floating point coprocessor -with only single precision floating point support, as on the @sc{r4650} -processor, use the command @samp{set mipsfpu single}. The default -double precision floating point coprocessor may be selected using -@samp{set mipsfpu double}. - -In previous versions the only choices were double precision or no -floating point, so @samp{set mipsfpu on} will select double precision -and @samp{set mipsfpu off} will select no floating point. - -As usual, you can inquire about the @code{mipsfpu} variable with -@samp{show mipsfpu}. - -@item set remotedebug @var{n} -@itemx show remotedebug -@kindex set remotedebug -@kindex show remotedebug -@cindex @code{remotedebug}, MIPS protocol -@cindex MIPS @code{remotedebug} protocol -@c FIXME! For this to be useful, you must know something about the MIPS -@c FIXME...protocol. Where is it described? -You can see some debugging information about communications with the board -by setting the @code{remotedebug} variable. If you set it to @code{1} using -@samp{set remotedebug 1}, every packet is displayed. If you set it -to @code{2}, every character is displayed. You can check the current value -at any time with the command @samp{show remotedebug}. - -@item set timeout @var{seconds} -@itemx set retransmit-timeout @var{seconds} -@itemx show timeout -@itemx show retransmit-timeout -@cindex @code{timeout}, MIPS protocol -@cindex @code{retransmit-timeout}, MIPS protocol -@kindex set timeout -@kindex show timeout -@kindex set retransmit-timeout -@kindex show retransmit-timeout -You can control the timeout used while waiting for a packet, in the MIPS -remote protocol, with the @code{set timeout @var{seconds}} command. The -default is 5 seconds. Similarly, you can control the timeout used while -waiting for an acknowledgement of a packet with the @code{set -retransmit-timeout @var{seconds}} command. The default is 3 seconds. -You can inspect both values with @code{show timeout} and @code{show -retransmit-timeout}. (These commands are @emph{only} available when -@value{GDBN} is configured for @samp{--target=mips-idt-ecoff}.) - -The timeout set by @code{set timeout} does not apply when @value{GDBN} -is waiting for your program to stop. In that case, @value{GDBN} waits -forever because it has no way of knowing how long the program is going -to run before stopping. -@end table -@end ifset - -@ifset SIMS -@node Simulator -@subsection Simulated CPU target - -@ifset GENERIC -@cindex simulator -@cindex simulator, Z8000 -@cindex Z8000 simulator -@cindex simulator, H8/300 or H8/500 -@cindex H8/300 or H8/500 simulator -@cindex simulator, Hitachi SH -@cindex Hitachi SH simulator -@cindex CPU simulator -For some configurations, @value{GDBN} includes a CPU simulator that you -can use instead of a hardware CPU to debug your programs. -Currently, simulators are available for ARM, D10V, D30V, FR30, H8/300, -H8/500, i960, M32R, MIPS, MN10200, MN10300, PowerPC, SH, Sparc, V850, -W65, and Z8000. -@end ifset - -@ifclear GENERIC -@ifset H8 -@cindex simulator, H8/300 or H8/500 -@cindex Hitachi H8/300 or H8/500 simulator -@cindex simulator, Hitachi SH -@cindex Hitachi SH simulator -When configured for debugging Hitachi microprocessor targets, -@value{GDBN} includes a CPU simulator for the target chip (a Hitachi SH, -H8/300, or H8/500). -@end ifset - -@ifset Z8K -@cindex simulator, Z8000 -@cindex Zilog Z8000 simulator -When configured for debugging Zilog Z8000 targets, @value{GDBN} includes -a Z8000 simulator. -@end ifset -@end ifclear - -@ifset Z8K -For the Z8000 family, @samp{target sim} simulates either the Z8002 (the -unsegmented variant of the Z8000 architecture) or the Z8001 (the -segmented variant). The simulator recognizes which architecture is -appropriate by inspecting the object code. -@end ifset - -@table @code -@item target sim @var{args} -@kindex sim -@kindex target sim -Debug programs on a simulated CPU. If the simulator supports setup -options, specify them via @var{args}. -@end table - -@noindent -After specifying this target, you can debug programs for the simulated -CPU in the same style as programs for your host computer; use the -@code{file} command to load a new program image, the @code{run} command -to run your program, and so on. - -As well as making available all the usual machine registers (see -@code{info reg}), the Z8000 simulator provides three additional items -of information as specially named registers: - -@table @code -@item cycles -Counts clock-ticks in the simulator. - -@item insts -Counts instructions run in the simulator. - -@item time -Execution time in 60ths of a second. -@end table - -You can refer to these values in @value{GDBN} expressions with the usual -conventions; for example, @w{@samp{b fputc if $cycles>5000}} sets a -conditional breakpoint that suspends only after at least 5000 -simulated clock ticks. -@end ifset - -@c need to add much more detail about sims! diff --git a/contrib/gdb/gdb/f-exp.tab.c b/contrib/gdb/gdb/f-exp.tab.c deleted file mode 100644 index c4932484bf32a..0000000000000 --- a/contrib/gdb/gdb/f-exp.tab.c +++ /dev/null @@ -1,2155 +0,0 @@ - -/* A Bison parser, made from f-exp.y - by GNU Bison version 1.27 - */ - -#define YYBISON 1 /* Identify Bison output. */ - -#define INT 257 -#define FLOAT 258 -#define STRING_LITERAL 259 -#define BOOLEAN_LITERAL 260 -#define NAME 261 -#define TYPENAME 262 -#define NAME_OR_INT 263 -#define SIZEOF 264 -#define ERROR 265 -#define INT_KEYWORD 266 -#define INT_S2_KEYWORD 267 -#define LOGICAL_S1_KEYWORD 268 -#define LOGICAL_S2_KEYWORD 269 -#define LOGICAL_KEYWORD 270 -#define REAL_KEYWORD 271 -#define REAL_S8_KEYWORD 272 -#define REAL_S16_KEYWORD 273 -#define COMPLEX_S8_KEYWORD 274 -#define COMPLEX_S16_KEYWORD 275 -#define COMPLEX_S32_KEYWORD 276 -#define BOOL_AND 277 -#define BOOL_OR 278 -#define BOOL_NOT 279 -#define CHARACTER 280 -#define VARIABLE 281 -#define ASSIGN_MODIFY 282 -#define ABOVE_COMMA 283 -#define EQUAL 284 -#define NOTEQUAL 285 -#define LESSTHAN 286 -#define GREATERTHAN 287 -#define LEQ 288 -#define GEQ 289 -#define LSH 290 -#define RSH 291 -#define UNARY 292 - -#line 43 "f-exp.y" - - -#include "defs.h" -#include "gdb_string.h" -#include "expression.h" -#include "value.h" -#include "parser-defs.h" -#include "language.h" -#include "f-lang.h" -#include "bfd.h" /* Required by objfiles.h. */ -#include "symfile.h" /* Required by objfiles.h. */ -#include "objfiles.h" /* For have_full_symbols and have_partial_symbols */ - -/* Remap normal yacc parser interface names (yyparse, yylex, yyerror, etc), - as well as gratuitiously global symbol names, so we can have multiple - yacc generated parsers in gdb. Note that these are only the variables - produced by yacc. If other parser generators (bison, byacc, etc) produce - additional global names that conflict at link time, then those parser - generators need to be fixed instead of adding those names to this list. */ - -#define yymaxdepth f_maxdepth -#define yyparse f_parse -#define yylex f_lex -#define yyerror f_error -#define yylval f_lval -#define yychar f_char -#define yydebug f_debug -#define yypact f_pact -#define yyr1 f_r1 -#define yyr2 f_r2 -#define yydef f_def -#define yychk f_chk -#define yypgo f_pgo -#define yyact f_act -#define yyexca f_exca -#define yyerrflag f_errflag -#define yynerrs f_nerrs -#define yyps f_ps -#define yypv f_pv -#define yys f_s -#define yy_yys f_yys -#define yystate f_state -#define yytmp f_tmp -#define yyv f_v -#define yy_yyv f_yyv -#define yyval f_val -#define yylloc f_lloc -#define yyreds f_reds /* With YYDEBUG defined */ -#define yytoks f_toks /* With YYDEBUG defined */ -#define yylhs f_yylhs -#define yylen f_yylen -#define yydefred f_yydefred -#define yydgoto f_yydgoto -#define yysindex f_yysindex -#define yyrindex f_yyrindex -#define yygindex f_yygindex -#define yytable f_yytable -#define yycheck f_yycheck - -#ifndef YYDEBUG -#define YYDEBUG 1 /* Default to no yydebug support */ -#endif - -int yyparse PARAMS ((void)); - -static int yylex PARAMS ((void)); - -void yyerror PARAMS ((char *)); - -static void growbuf_by_size PARAMS ((int)); - -static int match_string_literal PARAMS ((void)); - - -#line 122 "f-exp.y" -typedef union - { - LONGEST lval; - struct { - LONGEST val; - struct type *type; - } typed_val; - DOUBLEST dval; - struct symbol *sym; - struct type *tval; - struct stoken sval; - struct ttype tsym; - struct symtoken ssym; - int voidval; - struct block *bval; - enum exp_opcode opcode; - struct internalvar *ivar; - - struct type **tvec; - int *ivec; - } YYSTYPE; -#line 144 "f-exp.y" - -/* YYSTYPE gets defined by %union */ -static int parse_number PARAMS ((char *, int, int, YYSTYPE *)); -#include <stdio.h> - -#ifndef __cplusplus -#ifndef __STDC__ -#define const -#endif -#endif - - - -#define YYFINAL 125 -#define YYFLAG -32768 -#define YYNTBASE 55 - -#define YYTRANSLATE(x) ((unsigned)(x) <= 292 ? yytranslate[x] : 71) - -static const char yytranslate[] = { 0, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 49, 35, 2, 51, - 52, 47, 45, 29, 46, 2, 48, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 54, 2, 2, - 31, 2, 32, 44, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 34, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 33, 2, 53, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 1, 3, 4, 5, 6, - 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, - 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, - 27, 28, 30, 36, 37, 38, 39, 40, 41, 42, - 43, 50 -}; - -#if YYDEBUG != 0 -static const short yyprhs[] = { 0, - 0, 2, 4, 6, 10, 13, 16, 19, 22, 25, - 28, 29, 35, 36, 38, 40, 44, 48, 52, 56, - 61, 65, 69, 73, 77, 81, 85, 89, 93, 97, - 101, 105, 109, 113, 117, 121, 125, 129, 133, 137, - 141, 145, 147, 149, 151, 153, 155, 160, 162, 164, - 166, 168, 170, 173, 175, 178, 180, 183, 185, 189, - 192, 194, 197, 201, 203, 205, 207, 209, 211, 213, - 215, 217, 219, 221, 223, 225, 227, 229, 231, 235, - 237, 239, 241 -}; - -static const short yyrhs[] = { 57, - 0, 56, 0, 63, 0, 51, 57, 52, 0, 47, - 57, 0, 35, 57, 0, 46, 57, 0, 25, 57, - 0, 53, 57, 0, 10, 57, 0, 0, 57, 51, - 58, 59, 52, 0, 0, 57, 0, 60, 0, 59, - 29, 57, 0, 57, 54, 57, 0, 57, 29, 57, - 0, 51, 61, 52, 0, 51, 63, 52, 57, 0, - 57, 44, 57, 0, 57, 47, 57, 0, 57, 48, - 57, 0, 57, 49, 57, 0, 57, 45, 57, 0, - 57, 46, 57, 0, 57, 42, 57, 0, 57, 43, - 57, 0, 57, 36, 57, 0, 57, 37, 57, 0, - 57, 40, 57, 0, 57, 41, 57, 0, 57, 38, - 57, 0, 57, 39, 57, 0, 57, 35, 57, 0, - 57, 34, 57, 0, 57, 33, 57, 0, 57, 23, - 57, 0, 57, 24, 57, 0, 57, 31, 57, 0, - 57, 28, 57, 0, 3, 0, 9, 0, 4, 0, - 62, 0, 27, 0, 10, 51, 63, 52, 0, 6, - 0, 5, 0, 70, 0, 64, 0, 68, 0, 68, - 65, 0, 47, 0, 47, 65, 0, 35, 0, 35, - 65, 0, 66, 0, 51, 65, 52, 0, 66, 67, - 0, 67, 0, 51, 52, 0, 51, 69, 52, 0, - 8, 0, 12, 0, 13, 0, 26, 0, 16, 0, - 15, 0, 14, 0, 17, 0, 18, 0, 19, 0, - 20, 0, 21, 0, 22, 0, 8, 0, 63, 0, - 69, 29, 63, 0, 7, 0, 8, 0, 9, 0, - 7, 0 -}; - -#endif - -#if YYDEBUG != 0 -static const short yyrline[] = { 0, - 221, 222, 225, 231, 236, 239, 242, 246, 250, 254, - 263, 265, 271, 274, 278, 281, 285, 290, 294, 298, - 306, 310, 314, 318, 322, 326, 330, 334, 338, 342, - 346, 350, 354, 358, 362, 366, 370, 374, 379, 383, - 387, 393, 400, 409, 416, 419, 422, 430, 437, 445, - 489, 492, 493, 536, 538, 540, 542, 544, 547, 549, - 551, 555, 557, 562, 564, 566, 568, 570, 572, 574, - 576, 578, 580, 582, 584, 586, 590, 594, 599, 606, - 608, 610, 614 -}; -#endif - - -#if YYDEBUG != 0 || defined (YYERROR_VERBOSE) - -static const char * const yytname[] = { "$","error","$undefined.","INT","FLOAT", -"STRING_LITERAL","BOOLEAN_LITERAL","NAME","TYPENAME","NAME_OR_INT","SIZEOF", -"ERROR","INT_KEYWORD","INT_S2_KEYWORD","LOGICAL_S1_KEYWORD","LOGICAL_S2_KEYWORD", -"LOGICAL_KEYWORD","REAL_KEYWORD","REAL_S8_KEYWORD","REAL_S16_KEYWORD","COMPLEX_S8_KEYWORD", -"COMPLEX_S16_KEYWORD","COMPLEX_S32_KEYWORD","BOOL_AND","BOOL_OR","BOOL_NOT", -"CHARACTER","VARIABLE","ASSIGN_MODIFY","','","ABOVE_COMMA","'='","'?'","'|'", -"'^'","'&'","EQUAL","NOTEQUAL","LESSTHAN","GREATERTHAN","LEQ","GEQ","LSH","RSH", -"'@'","'+'","'-'","'*'","'/'","'%'","UNARY","'('","')'","'~'","':'","start", -"type_exp","exp","@1","arglist","substring","complexnum","variable","type","ptype", -"abs_decl","direct_abs_decl","func_mod","typebase","nonempty_typelist","name_not_typename", NULL -}; -#endif - -static const short yyr1[] = { 0, - 55, 55, 56, 57, 57, 57, 57, 57, 57, 57, - 58, 57, 59, 59, 59, 59, 60, 61, 57, 57, - 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, - 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, - 57, 57, 57, 57, 57, 57, 57, 57, 57, 62, - 63, 64, 64, 65, 65, 65, 65, 65, 66, 66, - 66, 67, 67, 68, 68, 68, 68, 68, 68, 68, - 68, 68, 68, 68, 68, 68, -1, 69, 69, -1, - -1, -1, 70 -}; - -static const short yyr2[] = { 0, - 1, 1, 1, 3, 2, 2, 2, 2, 2, 2, - 0, 5, 0, 1, 1, 3, 3, 3, 3, 4, - 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, - 3, 1, 1, 1, 1, 1, 4, 1, 1, 1, - 1, 1, 2, 1, 2, 1, 2, 1, 3, 2, - 1, 2, 3, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 3, 1, - 1, 1, 1 -}; - -static const short yydefact[] = { 0, - 42, 44, 49, 48, 83, 64, 43, 0, 65, 66, - 70, 69, 68, 71, 72, 73, 74, 75, 76, 0, - 67, 46, 0, 0, 0, 0, 0, 2, 1, 45, - 3, 51, 52, 50, 0, 10, 8, 6, 7, 5, - 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 11, 56, 54, 0, 53, - 58, 61, 0, 0, 4, 19, 0, 38, 39, 41, - 40, 37, 36, 35, 29, 30, 33, 34, 31, 32, - 27, 28, 21, 25, 26, 22, 23, 24, 13, 57, - 55, 62, 78, 0, 0, 0, 60, 47, 18, 20, - 14, 0, 15, 59, 0, 63, 0, 0, 12, 79, - 17, 16, 0, 0, 0 -}; - -static const short yydefgoto[] = { 123, - 28, 41, 99, 112, 113, 42, 30, 103, 32, 70, - 71, 72, 33, 105, 34 -}; - -static const short yypact[] = { 75, --32768,-32768,-32768,-32768,-32768,-32768,-32768, 126,-32768,-32768, --32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768, 135, --32768,-32768, 135, 135, 135, 75, 135,-32768, 309,-32768, --32768,-32768, -34,-32768, 75, -49, -49, -49, -49, -49, - 279, -46, -45, -49, 135, 135, 135, 135, 135, 135, - 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, - 135, 135, 135, 135, 135,-32768, -34, -34, 206,-32768, - -42,-32768, -36, 135,-32768,-32768, 135, 355, 336, 309, - 309, 390, 407, 161, 221, 221, -11, -11, -11, -11, - 22, 22, 58, -37, -37, -49, -49, -49, 135,-32768, --32768,-32768,-32768, -33, -26, 230,-32768, 186, 309, -49, - 250, -24,-32768,-32768, 397,-32768, 135, 135,-32768,-32768, - 309, 309, 15, 18,-32768 -}; - -static const short yypgoto[] = {-32768, --32768, 0,-32768,-32768,-32768,-32768,-32768, 4,-32768, -25, --32768, -50,-32768,-32768,-32768 -}; - - -#define YYLAST 458 - - -static const short yytable[] = { 29, - 67, 66, 115, 31, 118, 76, 77, 36, 106, 63, - 64, 65, 68, 66, 124, 108, 69, 125, 114, 37, - 107, 0, 38, 39, 40, 116, 44, 119, 0, 43, - 58, 59, 60, 61, 62, 63, 64, 65, 73, 66, - 0, 100, 101, 104, 78, 79, 80, 81, 82, 83, - 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, - 94, 95, 96, 97, 98, 60, 61, 62, 63, 64, - 65, 0, 66, 109, 0, 0, 110, 1, 2, 3, - 4, 5, 6, 7, 8, 0, 9, 10, 11, 12, - 13, 14, 15, 16, 17, 18, 19, 0, 111, 20, - 21, 22, 61, 62, 63, 64, 65, 110, 66, 23, - 0, 0, 0, 0, 0, 0, 121, 122, 120, 0, - 24, 25, 0, 0, 0, 26, 0, 27, 1, 2, - 3, 4, 5, 0, 7, 8, 0, 1, 2, 3, - 4, 5, 0, 7, 8, 0, 0, 0, 0, 0, - 20, 0, 22, 0, 0, 0, 0, 0, 0, 20, - 23, 22, 0, 0, 0, 0, 0, 0, 0, 23, - 0, 24, 25, 0, 0, 0, 35, 0, 27, 0, - 24, 25, 0, 0, 0, 26, 0, 27, 1, 2, - 3, 4, 5, 0, 7, 8, 52, 53, 54, 55, - 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, - 20, 66, 22, 6, 0, 0, 0, 9, 10, 11, - 12, 13, 14, 15, 16, 17, 18, 19, 0, 0, - 0, 21, 0, 0, 0, 0, 26, 6, 27, 0, - 67, 9, 10, 11, 12, 13, 14, 15, 16, 17, - 18, 19, 68, 0, 0, 21, 69, 102, 54, 55, - 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, - 0, 66, 45, 46, 0, 0, 0, 47, 0, 0, - 48, 102, 49, 50, 51, 52, 53, 54, 55, 56, - 57, 58, 59, 60, 61, 62, 63, 64, 65, 0, - 66, 45, 46, 117, 0, 0, 47, 74, 0, 48, - 0, 49, 50, 51, 52, 53, 54, 55, 56, 57, - 58, 59, 60, 61, 62, 63, 64, 65, 0, 66, - 75, 45, 46, 0, 0, 0, 47, 0, 0, 48, - 0, 49, 50, 51, 52, 53, 54, 55, 56, 57, - 58, 59, 60, 61, 62, 63, 64, 65, 45, 66, - 0, 0, 0, 0, 0, 0, 0, 0, 49, 50, - 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, - 61, 62, 63, 64, 65, 0, 66, 49, 50, 51, - 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, - 62, 63, 64, 65, 6, 66, 0, 0, 9, 10, - 11, 12, 13, 14, 15, 16, 17, 18, 19, 0, - 0, 0, 21, 50, 51, 52, 53, 54, 55, 56, - 57, 58, 59, 60, 61, 62, 63, 64, 65, 0, - 66, 51, 52, 53, 54, 55, 56, 57, 58, 59, - 60, 61, 62, 63, 64, 65, 0, 66 -}; - -static const short yycheck[] = { 0, - 35, 51, 29, 0, 29, 52, 52, 8, 51, 47, - 48, 49, 47, 51, 0, 52, 51, 0, 52, 20, - 71, -1, 23, 24, 25, 52, 27, 52, -1, 26, - 42, 43, 44, 45, 46, 47, 48, 49, 35, 51, - -1, 67, 68, 69, 45, 46, 47, 48, 49, 50, - 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, - 61, 62, 63, 64, 65, 44, 45, 46, 47, 48, - 49, -1, 51, 74, -1, -1, 77, 3, 4, 5, - 6, 7, 8, 9, 10, -1, 12, 13, 14, 15, - 16, 17, 18, 19, 20, 21, 22, -1, 99, 25, - 26, 27, 45, 46, 47, 48, 49, 108, 51, 35, - -1, -1, -1, -1, -1, -1, 117, 118, 115, -1, - 46, 47, -1, -1, -1, 51, -1, 53, 3, 4, - 5, 6, 7, -1, 9, 10, -1, 3, 4, 5, - 6, 7, -1, 9, 10, -1, -1, -1, -1, -1, - 25, -1, 27, -1, -1, -1, -1, -1, -1, 25, - 35, 27, -1, -1, -1, -1, -1, -1, -1, 35, - -1, 46, 47, -1, -1, -1, 51, -1, 53, -1, - 46, 47, -1, -1, -1, 51, -1, 53, 3, 4, - 5, 6, 7, -1, 9, 10, 36, 37, 38, 39, - 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, - 25, 51, 27, 8, -1, -1, -1, 12, 13, 14, - 15, 16, 17, 18, 19, 20, 21, 22, -1, -1, - -1, 26, -1, -1, -1, -1, 51, 8, 53, -1, - 35, 12, 13, 14, 15, 16, 17, 18, 19, 20, - 21, 22, 47, -1, -1, 26, 51, 52, 38, 39, - 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, - -1, 51, 23, 24, -1, -1, -1, 28, -1, -1, - 31, 52, 33, 34, 35, 36, 37, 38, 39, 40, - 41, 42, 43, 44, 45, 46, 47, 48, 49, -1, - 51, 23, 24, 54, -1, -1, 28, 29, -1, 31, - -1, 33, 34, 35, 36, 37, 38, 39, 40, 41, - 42, 43, 44, 45, 46, 47, 48, 49, -1, 51, - 52, 23, 24, -1, -1, -1, 28, -1, -1, 31, - -1, 33, 34, 35, 36, 37, 38, 39, 40, 41, - 42, 43, 44, 45, 46, 47, 48, 49, 23, 51, - -1, -1, -1, -1, -1, -1, -1, -1, 33, 34, - 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, - 45, 46, 47, 48, 49, -1, 51, 33, 34, 35, - 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, - 46, 47, 48, 49, 8, 51, -1, -1, 12, 13, - 14, 15, 16, 17, 18, 19, 20, 21, 22, -1, - -1, -1, 26, 34, 35, 36, 37, 38, 39, 40, - 41, 42, 43, 44, 45, 46, 47, 48, 49, -1, - 51, 35, 36, 37, 38, 39, 40, 41, 42, 43, - 44, 45, 46, 47, 48, 49, -1, 51 -}; -/* -*-C-*- Note some compilers choke on comments on `#line' lines. */ -#line 3 "/usr/lib/bison.simple" -/* This file comes from bison-1.27. */ - -/* Skeleton output parser for bison, - Copyright (C) 1984, 1989, 1990 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 2, 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., 59 Temple Place - Suite 330, - Boston, MA 02111-1307, USA. */ - -/* As a special exception, when this file is copied by Bison into a - Bison output file, you may use that output file without restriction. - This special exception was added by the Free Software Foundation - in version 1.24 of Bison. */ - -/* This is the parser code that is written into each bison parser - when the %semantic_parser declaration is not specified in the grammar. - It was written by Richard Stallman by simplifying the hairy parser - used when %semantic_parser is specified. */ - -#ifndef YYSTACK_USE_ALLOCA -#ifdef alloca -#define YYSTACK_USE_ALLOCA -#else /* alloca not defined */ -#ifdef __GNUC__ -#define YYSTACK_USE_ALLOCA -#define alloca __builtin_alloca -#else /* not GNU C. */ -#if (!defined (__STDC__) && defined (sparc)) || defined (__sparc__) || defined (__sparc) || defined (__sgi) || (defined (__sun) && defined (__i386)) -#define YYSTACK_USE_ALLOCA -#include <alloca.h> -#else /* not sparc */ -/* We think this test detects Watcom and Microsoft C. */ -/* This used to test MSDOS, but that is a bad idea - since that symbol is in the user namespace. */ -#if (defined (_MSDOS) || defined (_MSDOS_)) && !defined (__TURBOC__) -#if 0 /* No need for xmalloc.h, which pollutes the namespace; - instead, just don't use alloca. */ -#endif -#else /* not MSDOS, or __TURBOC__ */ -#if defined(_AIX) -/* I don't know what this was needed for, but it pollutes the namespace. - So I turned it off. rms, 2 May 1997. */ - #pragma alloca -#define YYSTACK_USE_ALLOCA -#else /* not MSDOS, or __TURBOC__, or _AIX */ -#if 0 -#ifdef __hpux /* haible@ilog.fr says this works for HPUX 9.05 and up, - and on HPUX 10. Eventually we can turn this on. */ -#define YYSTACK_USE_ALLOCA -#define alloca __builtin_alloca -#endif /* __hpux */ -#endif -#endif /* not _AIX */ -#endif /* not MSDOS, or __TURBOC__ */ -#endif /* not sparc */ -#endif /* not GNU C */ -#endif /* alloca not defined */ -#endif /* YYSTACK_USE_ALLOCA not defined */ - -#ifdef YYSTACK_USE_ALLOCA -#define YYSTACK_ALLOC alloca -#else -#define YYSTACK_ALLOC xmalloc -#endif - -/* Note: there must be only one dollar sign in this file. - It is replaced by the list of actions, each action - as one case of the switch. */ - -#define yyerrok (yyerrstatus = 0) -#define yyclearin (yychar = YYEMPTY) -#define YYEMPTY -2 -#define YYEOF 0 -#define YYACCEPT goto yyacceptlab -#define YYABORT goto yyabortlab -#define YYERROR goto yyerrlab1 -/* Like YYERROR except do call yyerror. - This remains here temporarily to ease the - transition to the new meaning of YYERROR, for GCC. - Once GCC version 2 has supplanted version 1, this can go. */ -#define YYFAIL goto yyerrlab -#define YYRECOVERING() (!!yyerrstatus) -#define YYBACKUP(token, value) \ -do \ - if (yychar == YYEMPTY && yylen == 1) \ - { yychar = (token), yylval = (value); \ - yychar1 = YYTRANSLATE (yychar); \ - YYPOPSTACK; \ - goto yybackup; \ - } \ - else \ - { yyerror ("syntax error: cannot back up"); YYERROR; } \ -while (0) - -#define YYTERROR 1 -#define YYERRCODE 256 - -#ifndef YYPURE -#define YYLEX yylex() -#endif - -#ifdef YYPURE -#ifdef YYLSP_NEEDED -#ifdef YYLEX_PARAM -#define YYLEX yylex(&yylval, &yylloc, YYLEX_PARAM) -#else -#define YYLEX yylex(&yylval, &yylloc) -#endif -#else /* not YYLSP_NEEDED */ -#ifdef YYLEX_PARAM -#define YYLEX yylex(&yylval, YYLEX_PARAM) -#else -#define YYLEX yylex(&yylval) -#endif -#endif /* not YYLSP_NEEDED */ -#endif - -/* If nonreentrant, generate the variables here */ - -#ifndef YYPURE - -int yychar; /* the lookahead symbol */ -YYSTYPE yylval; /* the semantic value of the */ - /* lookahead symbol */ - -#ifdef YYLSP_NEEDED -YYLTYPE yylloc; /* location data for the lookahead */ - /* symbol */ -#endif - -int yynerrs; /* number of parse errors so far */ -#endif /* not YYPURE */ - -#if YYDEBUG != 0 -int yydebug; /* nonzero means print parse trace */ -/* Since this is uninitialized, it does not stop multiple parsers - from coexisting. */ -#endif - -/* YYINITDEPTH indicates the initial size of the parser's stacks */ - -#ifndef YYINITDEPTH -#define YYINITDEPTH 200 -#endif - -/* YYMAXDEPTH is the maximum size the stacks can grow to - (effective only if the built-in stack extension method is used). */ - -#if YYMAXDEPTH == 0 -#undef YYMAXDEPTH -#endif - -#ifndef YYMAXDEPTH -#define YYMAXDEPTH 10000 -#endif - -/* Define __yy_memcpy. Note that the size argument - should be passed with type unsigned int, because that is what the non-GCC - definitions require. With GCC, __builtin_memcpy takes an arg - of type size_t, but it can handle unsigned int. */ - -#if __GNUC__ > 1 /* GNU C and GNU C++ define this. */ -#define __yy_memcpy(TO,FROM,COUNT) __builtin_memcpy(TO,FROM,COUNT) -#else /* not GNU C or C++ */ -#ifndef __cplusplus - -/* This is the most reliable way to avoid incompatibilities - in available built-in functions on various systems. */ -static void -__yy_memcpy (to, from, count) - char *to; - char *from; - unsigned int count; -{ - register char *f = from; - register char *t = to; - register int i = count; - - while (i-- > 0) - *t++ = *f++; -} - -#else /* __cplusplus */ - -/* This is the most reliable way to avoid incompatibilities - in available built-in functions on various systems. */ -static void -__yy_memcpy (char *to, char *from, unsigned int count) -{ - register char *t = to; - register char *f = from; - register int i = count; - - while (i-- > 0) - *t++ = *f++; -} - -#endif -#endif - -#line 216 "/usr/lib/bison.simple" - -/* The user can define YYPARSE_PARAM as the name of an argument to be passed - into yyparse. The argument should have type void *. - It should actually point to an object. - Grammar actions can access the variable by casting it - to the proper pointer type. */ - -#ifdef YYPARSE_PARAM -#ifdef __cplusplus -#define YYPARSE_PARAM_ARG void *YYPARSE_PARAM -#define YYPARSE_PARAM_DECL -#else /* not __cplusplus */ -#define YYPARSE_PARAM_ARG YYPARSE_PARAM -#define YYPARSE_PARAM_DECL void *YYPARSE_PARAM; -#endif /* not __cplusplus */ -#else /* not YYPARSE_PARAM */ -#define YYPARSE_PARAM_ARG -#define YYPARSE_PARAM_DECL -#endif /* not YYPARSE_PARAM */ - -/* Prevent warning if -Wstrict-prototypes. */ -#ifdef __GNUC__ -#ifdef YYPARSE_PARAM -int yyparse (void *); -#else -int yyparse (void); -#endif -#endif - -int -yyparse(YYPARSE_PARAM_ARG) - YYPARSE_PARAM_DECL -{ - register int yystate; - register int yyn; - register short *yyssp; - register YYSTYPE *yyvsp; - int yyerrstatus; /* number of tokens to shift before error messages enabled */ - int yychar1 = 0; /* lookahead token as an internal (translated) token number */ - - short yyssa[YYINITDEPTH]; /* the state stack */ - YYSTYPE yyvsa[YYINITDEPTH]; /* the semantic value stack */ - - short *yyss = yyssa; /* refer to the stacks thru separate pointers */ - YYSTYPE *yyvs = yyvsa; /* to allow yyoverflow to xreallocate them elsewhere */ - -#ifdef YYLSP_NEEDED - YYLTYPE yylsa[YYINITDEPTH]; /* the location stack */ - YYLTYPE *yyls = yylsa; - YYLTYPE *yylsp; - -#define YYPOPSTACK (yyvsp--, yyssp--, yylsp--) -#else -#define YYPOPSTACK (yyvsp--, yyssp--) -#endif - - int yystacksize = YYINITDEPTH; - int yyfree_stacks = 0; - -#ifdef YYPURE - int yychar; - YYSTYPE yylval; - int yynerrs; -#ifdef YYLSP_NEEDED - YYLTYPE yylloc; -#endif -#endif - - YYSTYPE yyval; /* the variable used to return */ - /* semantic values from the action */ - /* routines */ - - int yylen; - -#if YYDEBUG != 0 - if (yydebug) - fprintf(stderr, "Starting parse\n"); -#endif - - yystate = 0; - yyerrstatus = 0; - yynerrs = 0; - yychar = YYEMPTY; /* Cause a token to be read. */ - - /* Initialize stack pointers. - Waste one element of value and location stack - so that they stay on the same level as the state stack. - The wasted elements are never initialized. */ - - yyssp = yyss - 1; - yyvsp = yyvs; -#ifdef YYLSP_NEEDED - yylsp = yyls; -#endif - -/* Push a new state, which is found in yystate . */ -/* In all cases, when you get here, the value and location stacks - have just been pushed. so pushing a state here evens the stacks. */ -yynewstate: - - *++yyssp = yystate; - - if (yyssp >= yyss + yystacksize - 1) - { - /* Give user a chance to xreallocate the stack */ - /* Use copies of these so that the &'s don't force the real ones into memory. */ - YYSTYPE *yyvs1 = yyvs; - short *yyss1 = yyss; -#ifdef YYLSP_NEEDED - YYLTYPE *yyls1 = yyls; -#endif - - /* Get the current used size of the three stacks, in elements. */ - int size = yyssp - yyss + 1; - -#ifdef yyoverflow - /* Each stack pointer address is followed by the size of - the data in use in that stack, in bytes. */ -#ifdef YYLSP_NEEDED - /* This used to be a conditional around just the two extra args, - but that might be undefined if yyoverflow is a macro. */ - yyoverflow("parser stack overflow", - &yyss1, size * sizeof (*yyssp), - &yyvs1, size * sizeof (*yyvsp), - &yyls1, size * sizeof (*yylsp), - &yystacksize); -#else - yyoverflow("parser stack overflow", - &yyss1, size * sizeof (*yyssp), - &yyvs1, size * sizeof (*yyvsp), - &yystacksize); -#endif - - yyss = yyss1; yyvs = yyvs1; -#ifdef YYLSP_NEEDED - yyls = yyls1; -#endif -#else /* no yyoverflow */ - /* Extend the stack our own way. */ - if (yystacksize >= YYMAXDEPTH) - { - yyerror("parser stack overflow"); - if (yyfree_stacks) - { - free (yyss); - free (yyvs); -#ifdef YYLSP_NEEDED - free (yyls); -#endif - } - return 2; - } - yystacksize *= 2; - if (yystacksize > YYMAXDEPTH) - yystacksize = YYMAXDEPTH; -#ifndef YYSTACK_USE_ALLOCA - yyfree_stacks = 1; -#endif - yyss = (short *) YYSTACK_ALLOC (yystacksize * sizeof (*yyssp)); - __yy_memcpy ((char *)yyss, (char *)yyss1, - size * (unsigned int) sizeof (*yyssp)); - yyvs = (YYSTYPE *) YYSTACK_ALLOC (yystacksize * sizeof (*yyvsp)); - __yy_memcpy ((char *)yyvs, (char *)yyvs1, - size * (unsigned int) sizeof (*yyvsp)); -#ifdef YYLSP_NEEDED - yyls = (YYLTYPE *) YYSTACK_ALLOC (yystacksize * sizeof (*yylsp)); - __yy_memcpy ((char *)yyls, (char *)yyls1, - size * (unsigned int) sizeof (*yylsp)); -#endif -#endif /* no yyoverflow */ - - yyssp = yyss + size - 1; - yyvsp = yyvs + size - 1; -#ifdef YYLSP_NEEDED - yylsp = yyls + size - 1; -#endif - -#if YYDEBUG != 0 - if (yydebug) - fprintf(stderr, "Stack size increased to %d\n", yystacksize); -#endif - - if (yyssp >= yyss + yystacksize - 1) - YYABORT; - } - -#if YYDEBUG != 0 - if (yydebug) - fprintf(stderr, "Entering state %d\n", yystate); -#endif - - goto yybackup; - yybackup: - -/* Do appropriate processing given the current state. */ -/* Read a lookahead token if we need one and don't already have one. */ -/* yyresume: */ - - /* First try to decide what to do without reference to lookahead token. */ - - yyn = yypact[yystate]; - if (yyn == YYFLAG) - goto yydefault; - - /* Not known => get a lookahead token if don't already have one. */ - - /* yychar is either YYEMPTY or YYEOF - or a valid token in external form. */ - - if (yychar == YYEMPTY) - { -#if YYDEBUG != 0 - if (yydebug) - fprintf(stderr, "Reading a token: "); -#endif - yychar = YYLEX; - } - - /* Convert token to internal form (in yychar1) for indexing tables with */ - - if (yychar <= 0) /* This means end of input. */ - { - yychar1 = 0; - yychar = YYEOF; /* Don't call YYLEX any more */ - -#if YYDEBUG != 0 - if (yydebug) - fprintf(stderr, "Now at end of input.\n"); -#endif - } - else - { - yychar1 = YYTRANSLATE(yychar); - -#if YYDEBUG != 0 - if (yydebug) - { - fprintf (stderr, "Next token is %d (%s", yychar, yytname[yychar1]); - /* Give the individual parser a way to print the precise meaning - of a token, for further debugging info. */ -#ifdef YYPRINT - YYPRINT (stderr, yychar, yylval); -#endif - fprintf (stderr, ")\n"); - } -#endif - } - - yyn += yychar1; - if (yyn < 0 || yyn > YYLAST || yycheck[yyn] != yychar1) - goto yydefault; - - yyn = yytable[yyn]; - - /* yyn is what to do for this token type in this state. - Negative => reduce, -yyn is rule number. - Positive => shift, yyn is new state. - New state is final state => don't bother to shift, - just return success. - 0, or most negative number => error. */ - - if (yyn < 0) - { - if (yyn == YYFLAG) - goto yyerrlab; - yyn = -yyn; - goto yyreduce; - } - else if (yyn == 0) - goto yyerrlab; - - if (yyn == YYFINAL) - YYACCEPT; - - /* Shift the lookahead token. */ - -#if YYDEBUG != 0 - if (yydebug) - fprintf(stderr, "Shifting token %d (%s), ", yychar, yytname[yychar1]); -#endif - - /* Discard the token being shifted unless it is eof. */ - if (yychar != YYEOF) - yychar = YYEMPTY; - - *++yyvsp = yylval; -#ifdef YYLSP_NEEDED - *++yylsp = yylloc; -#endif - - /* count tokens shifted since error; after three, turn off error status. */ - if (yyerrstatus) yyerrstatus--; - - yystate = yyn; - goto yynewstate; - -/* Do the default action for the current state. */ -yydefault: - - yyn = yydefact[yystate]; - if (yyn == 0) - goto yyerrlab; - -/* Do a reduction. yyn is the number of a rule to reduce with. */ -yyreduce: - yylen = yyr2[yyn]; - if (yylen > 0) - yyval = yyvsp[1-yylen]; /* implement default value of the action */ - -#if YYDEBUG != 0 - if (yydebug) - { - int i; - - fprintf (stderr, "Reducing via rule %d (line %d), ", - yyn, yyrline[yyn]); - - /* Print the symbols being reduced, and their result. */ - for (i = yyprhs[yyn]; yyrhs[i] > 0; i++) - fprintf (stderr, "%s ", yytname[yyrhs[i]]); - fprintf (stderr, " -> %s\n", yytname[yyr1[yyn]]); - } -#endif - - - switch (yyn) { - -case 3: -#line 226 "f-exp.y" -{ write_exp_elt_opcode(OP_TYPE); - write_exp_elt_type(yyvsp[0].tval); - write_exp_elt_opcode(OP_TYPE); ; - break;} -case 4: -#line 232 "f-exp.y" -{ ; - break;} -case 5: -#line 237 "f-exp.y" -{ write_exp_elt_opcode (UNOP_IND); ; - break;} -case 6: -#line 240 "f-exp.y" -{ write_exp_elt_opcode (UNOP_ADDR); ; - break;} -case 7: -#line 243 "f-exp.y" -{ write_exp_elt_opcode (UNOP_NEG); ; - break;} -case 8: -#line 247 "f-exp.y" -{ write_exp_elt_opcode (UNOP_LOGICAL_NOT); ; - break;} -case 9: -#line 251 "f-exp.y" -{ write_exp_elt_opcode (UNOP_COMPLEMENT); ; - break;} -case 10: -#line 255 "f-exp.y" -{ write_exp_elt_opcode (UNOP_SIZEOF); ; - break;} -case 11: -#line 264 "f-exp.y" -{ start_arglist (); ; - break;} -case 12: -#line 266 "f-exp.y" -{ write_exp_elt_opcode (OP_F77_UNDETERMINED_ARGLIST); - write_exp_elt_longcst ((LONGEST) end_arglist ()); - write_exp_elt_opcode (OP_F77_UNDETERMINED_ARGLIST); ; - break;} -case 14: -#line 275 "f-exp.y" -{ arglist_len = 1; ; - break;} -case 15: -#line 279 "f-exp.y" -{ arglist_len = 2;; - break;} -case 16: -#line 282 "f-exp.y" -{ arglist_len++; ; - break;} -case 17: -#line 286 "f-exp.y" -{ ; - break;} -case 18: -#line 291 "f-exp.y" -{ ; - break;} -case 19: -#line 295 "f-exp.y" -{ write_exp_elt_opcode(OP_COMPLEX); ; - break;} -case 20: -#line 299 "f-exp.y" -{ write_exp_elt_opcode (UNOP_CAST); - write_exp_elt_type (yyvsp[-2].tval); - write_exp_elt_opcode (UNOP_CAST); ; - break;} -case 21: -#line 307 "f-exp.y" -{ write_exp_elt_opcode (BINOP_REPEAT); ; - break;} -case 22: -#line 311 "f-exp.y" -{ write_exp_elt_opcode (BINOP_MUL); ; - break;} -case 23: -#line 315 "f-exp.y" -{ write_exp_elt_opcode (BINOP_DIV); ; - break;} -case 24: -#line 319 "f-exp.y" -{ write_exp_elt_opcode (BINOP_REM); ; - break;} -case 25: -#line 323 "f-exp.y" -{ write_exp_elt_opcode (BINOP_ADD); ; - break;} -case 26: -#line 327 "f-exp.y" -{ write_exp_elt_opcode (BINOP_SUB); ; - break;} -case 27: -#line 331 "f-exp.y" -{ write_exp_elt_opcode (BINOP_LSH); ; - break;} -case 28: -#line 335 "f-exp.y" -{ write_exp_elt_opcode (BINOP_RSH); ; - break;} -case 29: -#line 339 "f-exp.y" -{ write_exp_elt_opcode (BINOP_EQUAL); ; - break;} -case 30: -#line 343 "f-exp.y" -{ write_exp_elt_opcode (BINOP_NOTEQUAL); ; - break;} -case 31: -#line 347 "f-exp.y" -{ write_exp_elt_opcode (BINOP_LEQ); ; - break;} -case 32: -#line 351 "f-exp.y" -{ write_exp_elt_opcode (BINOP_GEQ); ; - break;} -case 33: -#line 355 "f-exp.y" -{ write_exp_elt_opcode (BINOP_LESS); ; - break;} -case 34: -#line 359 "f-exp.y" -{ write_exp_elt_opcode (BINOP_GTR); ; - break;} -case 35: -#line 363 "f-exp.y" -{ write_exp_elt_opcode (BINOP_BITWISE_AND); ; - break;} -case 36: -#line 367 "f-exp.y" -{ write_exp_elt_opcode (BINOP_BITWISE_XOR); ; - break;} -case 37: -#line 371 "f-exp.y" -{ write_exp_elt_opcode (BINOP_BITWISE_IOR); ; - break;} -case 38: -#line 375 "f-exp.y" -{ write_exp_elt_opcode (BINOP_LOGICAL_AND); ; - break;} -case 39: -#line 380 "f-exp.y" -{ write_exp_elt_opcode (BINOP_LOGICAL_OR); ; - break;} -case 40: -#line 384 "f-exp.y" -{ write_exp_elt_opcode (BINOP_ASSIGN); ; - break;} -case 41: -#line 388 "f-exp.y" -{ write_exp_elt_opcode (BINOP_ASSIGN_MODIFY); - write_exp_elt_opcode (yyvsp[-1].opcode); - write_exp_elt_opcode (BINOP_ASSIGN_MODIFY); ; - break;} -case 42: -#line 394 "f-exp.y" -{ write_exp_elt_opcode (OP_LONG); - write_exp_elt_type (yyvsp[0].typed_val.type); - write_exp_elt_longcst ((LONGEST)(yyvsp[0].typed_val.val)); - write_exp_elt_opcode (OP_LONG); ; - break;} -case 43: -#line 401 "f-exp.y" -{ YYSTYPE val; - parse_number (yyvsp[0].ssym.stoken.ptr, yyvsp[0].ssym.stoken.length, 0, &val); - write_exp_elt_opcode (OP_LONG); - write_exp_elt_type (val.typed_val.type); - write_exp_elt_longcst ((LONGEST)val.typed_val.val); - write_exp_elt_opcode (OP_LONG); ; - break;} -case 44: -#line 410 "f-exp.y" -{ write_exp_elt_opcode (OP_DOUBLE); - write_exp_elt_type (builtin_type_f_real_s8); - write_exp_elt_dblcst (yyvsp[0].dval); - write_exp_elt_opcode (OP_DOUBLE); ; - break;} -case 47: -#line 423 "f-exp.y" -{ write_exp_elt_opcode (OP_LONG); - write_exp_elt_type (builtin_type_f_integer); - CHECK_TYPEDEF (yyvsp[-1].tval); - write_exp_elt_longcst ((LONGEST) TYPE_LENGTH (yyvsp[-1].tval)); - write_exp_elt_opcode (OP_LONG); ; - break;} -case 48: -#line 431 "f-exp.y" -{ write_exp_elt_opcode (OP_BOOL); - write_exp_elt_longcst ((LONGEST) yyvsp[0].lval); - write_exp_elt_opcode (OP_BOOL); - ; - break;} -case 49: -#line 438 "f-exp.y" -{ - write_exp_elt_opcode (OP_STRING); - write_exp_string (yyvsp[0].sval); - write_exp_elt_opcode (OP_STRING); - ; - break;} -case 50: -#line 446 "f-exp.y" -{ struct symbol *sym = yyvsp[0].ssym.sym; - - if (sym) - { - if (symbol_read_needs_frame (sym)) - { - if (innermost_block == 0 || - contained_in (block_found, - innermost_block)) - innermost_block = block_found; - } - write_exp_elt_opcode (OP_VAR_VALUE); - /* We want to use the selected frame, not - another more inner frame which happens to - be in the same block. */ - write_exp_elt_block (NULL); - write_exp_elt_sym (sym); - write_exp_elt_opcode (OP_VAR_VALUE); - break; - } - else - { - struct minimal_symbol *msymbol; - register char *arg = copy_name (yyvsp[0].ssym.stoken); - - msymbol = - lookup_minimal_symbol (arg, NULL, NULL); - if (msymbol != NULL) - { - write_exp_msymbol (msymbol, - lookup_function_type (builtin_type_int), - builtin_type_int); - } - else if (!have_full_symbols () && !have_partial_symbols ()) - error ("No symbol table is loaded. Use the \"file\" command."); - else - error ("No symbol \"%s\" in current context.", - copy_name (yyvsp[0].ssym.stoken)); - } - ; - break;} -case 53: -#line 494 "f-exp.y" -{ - /* This is where the interesting stuff happens. */ - int done = 0; - int array_size; - struct type *follow_type = yyvsp[-1].tval; - struct type *range_type; - - while (!done) - switch (pop_type ()) - { - case tp_end: - done = 1; - break; - case tp_pointer: - follow_type = lookup_pointer_type (follow_type); - break; - case tp_reference: - follow_type = lookup_reference_type (follow_type); - break; - case tp_array: - array_size = pop_type_int (); - if (array_size != -1) - { - range_type = - create_range_type ((struct type *) NULL, - builtin_type_f_integer, 0, - array_size - 1); - follow_type = - create_array_type ((struct type *) NULL, - follow_type, range_type); - } - else - follow_type = lookup_pointer_type (follow_type); - break; - case tp_function: - follow_type = lookup_function_type (follow_type); - break; - } - yyval.tval = follow_type; - ; - break;} -case 54: -#line 537 "f-exp.y" -{ push_type (tp_pointer); yyval.voidval = 0; ; - break;} -case 55: -#line 539 "f-exp.y" -{ push_type (tp_pointer); yyval.voidval = yyvsp[0].voidval; ; - break;} -case 56: -#line 541 "f-exp.y" -{ push_type (tp_reference); yyval.voidval = 0; ; - break;} -case 57: -#line 543 "f-exp.y" -{ push_type (tp_reference); yyval.voidval = yyvsp[0].voidval; ; - break;} -case 59: -#line 548 "f-exp.y" -{ yyval.voidval = yyvsp[-1].voidval; ; - break;} -case 60: -#line 550 "f-exp.y" -{ push_type (tp_function); ; - break;} -case 61: -#line 552 "f-exp.y" -{ push_type (tp_function); ; - break;} -case 62: -#line 556 "f-exp.y" -{ yyval.voidval = 0; ; - break;} -case 63: -#line 558 "f-exp.y" -{ free ((PTR)yyvsp[-1].tvec); yyval.voidval = 0; ; - break;} -case 64: -#line 563 "f-exp.y" -{ yyval.tval = yyvsp[0].tsym.type; ; - break;} -case 65: -#line 565 "f-exp.y" -{ yyval.tval = builtin_type_f_integer; ; - break;} -case 66: -#line 567 "f-exp.y" -{ yyval.tval = builtin_type_f_integer_s2; ; - break;} -case 67: -#line 569 "f-exp.y" -{ yyval.tval = builtin_type_f_character; ; - break;} -case 68: -#line 571 "f-exp.y" -{ yyval.tval = builtin_type_f_logical;; - break;} -case 69: -#line 573 "f-exp.y" -{ yyval.tval = builtin_type_f_logical_s2;; - break;} -case 70: -#line 575 "f-exp.y" -{ yyval.tval = builtin_type_f_logical_s1;; - break;} -case 71: -#line 577 "f-exp.y" -{ yyval.tval = builtin_type_f_real;; - break;} -case 72: -#line 579 "f-exp.y" -{ yyval.tval = builtin_type_f_real_s8;; - break;} -case 73: -#line 581 "f-exp.y" -{ yyval.tval = builtin_type_f_real_s16;; - break;} -case 74: -#line 583 "f-exp.y" -{ yyval.tval = builtin_type_f_complex_s8;; - break;} -case 75: -#line 585 "f-exp.y" -{ yyval.tval = builtin_type_f_complex_s16;; - break;} -case 76: -#line 587 "f-exp.y" -{ yyval.tval = builtin_type_f_complex_s32;; - break;} -case 78: -#line 595 "f-exp.y" -{ yyval.tvec = (struct type **) xmalloc (sizeof (struct type *) * 2); - yyval.ivec[0] = 1; /* Number of types in vector */ - yyval.tvec[1] = yyvsp[0].tval; - ; - break;} -case 79: -#line 600 "f-exp.y" -{ int len = sizeof (struct type *) * (++(yyvsp[-2].ivec[0]) + 1); - yyval.tvec = (struct type **) xrealloc ((char *) yyvsp[-2].tvec, len); - yyval.tvec[yyval.ivec[0]] = yyvsp[0].tval; - ; - break;} -case 80: -#line 607 "f-exp.y" -{ yyval.sval = yyvsp[0].ssym.stoken; ; - break;} -case 81: -#line 609 "f-exp.y" -{ yyval.sval = yyvsp[0].tsym.stoken; ; - break;} -case 82: -#line 611 "f-exp.y" -{ yyval.sval = yyvsp[0].ssym.stoken; ; - break;} -} - /* the action file gets copied in in place of this dollarsign */ -#line 542 "/usr/lib/bison.simple" - - yyvsp -= yylen; - yyssp -= yylen; -#ifdef YYLSP_NEEDED - yylsp -= yylen; -#endif - -#if YYDEBUG != 0 - if (yydebug) - { - short *ssp1 = yyss - 1; - fprintf (stderr, "state stack now"); - while (ssp1 != yyssp) - fprintf (stderr, " %d", *++ssp1); - fprintf (stderr, "\n"); - } -#endif - - *++yyvsp = yyval; - -#ifdef YYLSP_NEEDED - yylsp++; - if (yylen == 0) - { - yylsp->first_line = yylloc.first_line; - yylsp->first_column = yylloc.first_column; - yylsp->last_line = (yylsp-1)->last_line; - yylsp->last_column = (yylsp-1)->last_column; - yylsp->text = 0; - } - else - { - yylsp->last_line = (yylsp+yylen-1)->last_line; - yylsp->last_column = (yylsp+yylen-1)->last_column; - } -#endif - - /* Now "shift" the result of the reduction. - Determine what state that goes to, - based on the state we popped back to - and the rule number reduced by. */ - - yyn = yyr1[yyn]; - - yystate = yypgoto[yyn - YYNTBASE] + *yyssp; - if (yystate >= 0 && yystate <= YYLAST && yycheck[yystate] == *yyssp) - yystate = yytable[yystate]; - else - yystate = yydefgoto[yyn - YYNTBASE]; - - goto yynewstate; - -yyerrlab: /* here on detecting error */ - - if (! yyerrstatus) - /* If not already recovering from an error, report this error. */ - { - ++yynerrs; - -#ifdef YYERROR_VERBOSE - yyn = yypact[yystate]; - - if (yyn > YYFLAG && yyn < YYLAST) - { - int size = 0; - char *msg; - int x, count; - - count = 0; - /* Start X at -yyn if nec to avoid negative indexes in yycheck. */ - for (x = (yyn < 0 ? -yyn : 0); - x < (sizeof(yytname) / sizeof(char *)); x++) - if (yycheck[x + yyn] == x) - size += strlen(yytname[x]) + 15, count++; - msg = (char *) xmalloc(size + 15); - if (msg != 0) - { - strcpy(msg, "parse error"); - - if (count < 5) - { - count = 0; - for (x = (yyn < 0 ? -yyn : 0); - x < (sizeof(yytname) / sizeof(char *)); x++) - if (yycheck[x + yyn] == x) - { - strcat(msg, count == 0 ? ", expecting `" : " or `"); - strcat(msg, yytname[x]); - strcat(msg, "'"); - count++; - } - } - yyerror(msg); - free(msg); - } - else - yyerror ("parse error; also virtual memory exceeded"); - } - else -#endif /* YYERROR_VERBOSE */ - yyerror("parse error"); - } - - goto yyerrlab1; -yyerrlab1: /* here on error raised explicitly by an action */ - - if (yyerrstatus == 3) - { - /* if just tried and failed to reuse lookahead token after an error, discard it. */ - - /* return failure if at end of input */ - if (yychar == YYEOF) - YYABORT; - -#if YYDEBUG != 0 - if (yydebug) - fprintf(stderr, "Discarding token %d (%s).\n", yychar, yytname[yychar1]); -#endif - - yychar = YYEMPTY; - } - - /* Else will try to reuse lookahead token - after shifting the error token. */ - - yyerrstatus = 3; /* Each real token shifted decrements this */ - - goto yyerrhandle; - -yyerrdefault: /* current state does not do anything special for the error token. */ - -#if 0 - /* This is wrong; only states that explicitly want error tokens - should shift them. */ - yyn = yydefact[yystate]; /* If its default is to accept any token, ok. Otherwise pop it.*/ - if (yyn) goto yydefault; -#endif - -yyerrpop: /* pop the current state because it cannot handle the error token */ - - if (yyssp == yyss) YYABORT; - yyvsp--; - yystate = *--yyssp; -#ifdef YYLSP_NEEDED - yylsp--; -#endif - -#if YYDEBUG != 0 - if (yydebug) - { - short *ssp1 = yyss - 1; - fprintf (stderr, "Error: state stack now"); - while (ssp1 != yyssp) - fprintf (stderr, " %d", *++ssp1); - fprintf (stderr, "\n"); - } -#endif - -yyerrhandle: - - yyn = yypact[yystate]; - if (yyn == YYFLAG) - goto yyerrdefault; - - yyn += YYTERROR; - if (yyn < 0 || yyn > YYLAST || yycheck[yyn] != YYTERROR) - goto yyerrdefault; - - yyn = yytable[yyn]; - if (yyn < 0) - { - if (yyn == YYFLAG) - goto yyerrpop; - yyn = -yyn; - goto yyreduce; - } - else if (yyn == 0) - goto yyerrpop; - - if (yyn == YYFINAL) - YYACCEPT; - -#if YYDEBUG != 0 - if (yydebug) - fprintf(stderr, "Shifting error token, "); -#endif - - *++yyvsp = yylval; -#ifdef YYLSP_NEEDED - *++yylsp = yylloc; -#endif - - yystate = yyn; - goto yynewstate; - - yyacceptlab: - /* YYACCEPT comes here. */ - if (yyfree_stacks) - { - free (yyss); - free (yyvs); -#ifdef YYLSP_NEEDED - free (yyls); -#endif - } - return 0; - - yyabortlab: - /* YYABORT comes here. */ - if (yyfree_stacks) - { - free (yyss); - free (yyvs); -#ifdef YYLSP_NEEDED - free (yyls); -#endif - } - return 1; -} -#line 624 "f-exp.y" - - -/* Take care of parsing a number (anything that starts with a digit). - Set yylval and return the token type; update lexptr. - LEN is the number of characters in it. */ - -/*** Needs some error checking for the float case ***/ - -static int -parse_number (p, len, parsed_float, putithere) - register char *p; - register int len; - int parsed_float; - YYSTYPE *putithere; -{ - register LONGEST n = 0; - register LONGEST prevn = 0; - register int i; - register int c; - register int base = input_radix; - int unsigned_p = 0; - int long_p = 0; - ULONGEST high_bit; - struct type *signed_type; - struct type *unsigned_type; - - if (parsed_float) - { - /* It's a float since it contains a point or an exponent. */ - /* [dD] is not understood as an exponent by atof, change it to 'e'. */ - char *tmp, *tmp2; - - tmp = strsave (p); - for (tmp2 = tmp; *tmp2; ++tmp2) - if (*tmp2 == 'd' || *tmp2 == 'D') - *tmp2 = 'e'; - putithere->dval = atof (tmp); - free (tmp); - return FLOAT; - } - - /* Handle base-switching prefixes 0x, 0t, 0d, 0 */ - if (p[0] == '0') - switch (p[1]) - { - case 'x': - case 'X': - if (len >= 3) - { - p += 2; - base = 16; - len -= 2; - } - break; - - case 't': - case 'T': - case 'd': - case 'D': - if (len >= 3) - { - p += 2; - base = 10; - len -= 2; - } - break; - - default: - base = 8; - break; - } - - while (len-- > 0) - { - c = *p++; - if (c >= 'A' && c <= 'Z') - c += 'a' - 'A'; - if (c != 'l' && c != 'u') - n *= base; - if (c >= '0' && c <= '9') - n += i = c - '0'; - else - { - if (base > 10 && c >= 'a' && c <= 'f') - n += i = c - 'a' + 10; - else if (len == 0 && c == 'l') - long_p = 1; - else if (len == 0 && c == 'u') - unsigned_p = 1; - else - return ERROR; /* Char not a digit */ - } - if (i >= base) - return ERROR; /* Invalid digit in this base */ - - /* Portably test for overflow (only works for nonzero values, so make - a second check for zero). */ - if ((prevn >= n) && n != 0) - unsigned_p=1; /* Try something unsigned */ - /* If range checking enabled, portably test for unsigned overflow. */ - if (RANGE_CHECK && n != 0) - { - if ((unsigned_p && (unsigned)prevn >= (unsigned)n)) - range_error("Overflow on numeric constant."); - } - prevn = n; - } - - /* If the number is too big to be an int, or it's got an l suffix - then it's a long. Work out if this has to be a long by - shifting right and and seeing if anything remains, and the - target int size is different to the target long size. - - In the expression below, we could have tested - (n >> TARGET_INT_BIT) - to see if it was zero, - but too many compilers warn about that, when ints and longs - are the same size. So we shift it twice, with fewer bits - each time, for the same result. */ - - if ((TARGET_INT_BIT != TARGET_LONG_BIT - && ((n >> 2) >> (TARGET_INT_BIT-2))) /* Avoid shift warning */ - || long_p) - { - high_bit = ((ULONGEST)1) << (TARGET_LONG_BIT-1); - unsigned_type = builtin_type_unsigned_long; - signed_type = builtin_type_long; - } - else - { - high_bit = ((ULONGEST)1) << (TARGET_INT_BIT-1); - unsigned_type = builtin_type_unsigned_int; - signed_type = builtin_type_int; - } - - putithere->typed_val.val = n; - - /* If the high bit of the worked out type is set then this number - has to be unsigned. */ - - if (unsigned_p || (n & high_bit)) - putithere->typed_val.type = unsigned_type; - else - putithere->typed_val.type = signed_type; - - return INT; -} - -struct token -{ - char *operator; - int token; - enum exp_opcode opcode; -}; - -static const struct token dot_ops[] = -{ - { ".and.", BOOL_AND, BINOP_END }, - { ".AND.", BOOL_AND, BINOP_END }, - { ".or.", BOOL_OR, BINOP_END }, - { ".OR.", BOOL_OR, BINOP_END }, - { ".not.", BOOL_NOT, BINOP_END }, - { ".NOT.", BOOL_NOT, BINOP_END }, - { ".eq.", EQUAL, BINOP_END }, - { ".EQ.", EQUAL, BINOP_END }, - { ".eqv.", EQUAL, BINOP_END }, - { ".NEQV.", NOTEQUAL, BINOP_END }, - { ".neqv.", NOTEQUAL, BINOP_END }, - { ".EQV.", EQUAL, BINOP_END }, - { ".ne.", NOTEQUAL, BINOP_END }, - { ".NE.", NOTEQUAL, BINOP_END }, - { ".le.", LEQ, BINOP_END }, - { ".LE.", LEQ, BINOP_END }, - { ".ge.", GEQ, BINOP_END }, - { ".GE.", GEQ, BINOP_END }, - { ".gt.", GREATERTHAN, BINOP_END }, - { ".GT.", GREATERTHAN, BINOP_END }, - { ".lt.", LESSTHAN, BINOP_END }, - { ".LT.", LESSTHAN, BINOP_END }, - { NULL, 0, 0 } -}; - -struct f77_boolean_val -{ - char *name; - int value; -}; - -static const struct f77_boolean_val boolean_values[] = -{ - { ".true.", 1 }, - { ".TRUE.", 1 }, - { ".false.", 0 }, - { ".FALSE.", 0 }, - { NULL, 0 } -}; - -static const struct token f77_keywords[] = -{ - { "complex_16", COMPLEX_S16_KEYWORD, BINOP_END }, - { "complex_32", COMPLEX_S32_KEYWORD, BINOP_END }, - { "character", CHARACTER, BINOP_END }, - { "integer_2", INT_S2_KEYWORD, BINOP_END }, - { "logical_1", LOGICAL_S1_KEYWORD, BINOP_END }, - { "logical_2", LOGICAL_S2_KEYWORD, BINOP_END }, - { "complex_8", COMPLEX_S8_KEYWORD, BINOP_END }, - { "integer", INT_KEYWORD, BINOP_END }, - { "logical", LOGICAL_KEYWORD, BINOP_END }, - { "real_16", REAL_S16_KEYWORD, BINOP_END }, - { "complex", COMPLEX_S8_KEYWORD, BINOP_END }, - { "sizeof", SIZEOF, BINOP_END }, - { "real_8", REAL_S8_KEYWORD, BINOP_END }, - { "real", REAL_KEYWORD, BINOP_END }, - { NULL, 0, 0 } -}; - -/* Implementation of a dynamically expandable buffer for processing input - characters acquired through lexptr and building a value to return in - yylval. Ripped off from ch-exp.y */ - -static char *tempbuf; /* Current buffer contents */ -static int tempbufsize; /* Size of allocated buffer */ -static int tempbufindex; /* Current index into buffer */ - -#define GROWBY_MIN_SIZE 64 /* Minimum amount to grow buffer by */ - -#define CHECKBUF(size) \ - do { \ - if (tempbufindex + (size) >= tempbufsize) \ - { \ - growbuf_by_size (size); \ - } \ - } while (0); - - -/* Grow the static temp buffer if necessary, including allocating the first one - on demand. */ - -static void -growbuf_by_size (count) - int count; -{ - int growby; - - growby = max (count, GROWBY_MIN_SIZE); - tempbufsize += growby; - if (tempbuf == NULL) - tempbuf = (char *) xmalloc (tempbufsize); - else - tempbuf = (char *) xrealloc (tempbuf, tempbufsize); -} - -/* Blatantly ripped off from ch-exp.y. This routine recognizes F77 - string-literals. - - Recognize a string literal. A string literal is a nonzero sequence - of characters enclosed in matching single quotes, except that - a single character inside single quotes is a character literal, which - we reject as a string literal. To embed the terminator character inside - a string, it is simply doubled (I.E. 'this''is''one''string') */ - -static int -match_string_literal () -{ - char *tokptr = lexptr; - - for (tempbufindex = 0, tokptr++; *tokptr != '\0'; tokptr++) - { - CHECKBUF (1); - if (*tokptr == *lexptr) - { - if (*(tokptr + 1) == *lexptr) - tokptr++; - else - break; - } - tempbuf[tempbufindex++] = *tokptr; - } - if (*tokptr == '\0' /* no terminator */ - || tempbufindex == 0) /* no string */ - return 0; - else - { - tempbuf[tempbufindex] = '\0'; - yylval.sval.ptr = tempbuf; - yylval.sval.length = tempbufindex; - lexptr = ++tokptr; - return STRING_LITERAL; - } -} - -/* Read one token, getting characters through lexptr. */ - -static int -yylex () -{ - int c; - int namelen; - unsigned int i,token; - char *tokstart; - - retry: - - tokstart = lexptr; - - /* First of all, let us make sure we are not dealing with the - special tokens .true. and .false. which evaluate to 1 and 0. */ - - if (*lexptr == '.') - { - for (i = 0; boolean_values[i].name != NULL; i++) - { - if STREQN (tokstart, boolean_values[i].name, - strlen (boolean_values[i].name)) - { - lexptr += strlen (boolean_values[i].name); - yylval.lval = boolean_values[i].value; - return BOOLEAN_LITERAL; - } - } - } - - /* See if it is a special .foo. operator */ - - for (i = 0; dot_ops[i].operator != NULL; i++) - if (STREQN (tokstart, dot_ops[i].operator, strlen (dot_ops[i].operator))) - { - lexptr += strlen (dot_ops[i].operator); - yylval.opcode = dot_ops[i].opcode; - return dot_ops[i].token; - } - - switch (c = *tokstart) - { - case 0: - return 0; - - case ' ': - case '\t': - case '\n': - lexptr++; - goto retry; - - case '\'': - token = match_string_literal (); - if (token != 0) - return (token); - break; - - case '(': - paren_depth++; - lexptr++; - return c; - - case ')': - if (paren_depth == 0) - return 0; - paren_depth--; - lexptr++; - return c; - - case ',': - if (comma_terminates && paren_depth == 0) - return 0; - lexptr++; - return c; - - case '.': - /* Might be a floating point number. */ - if (lexptr[1] < '0' || lexptr[1] > '9') - goto symbol; /* Nope, must be a symbol. */ - /* FALL THRU into number case. */ - - case '0': - case '1': - case '2': - case '3': - case '4': - case '5': - case '6': - case '7': - case '8': - case '9': - { - /* It's a number. */ - int got_dot = 0, got_e = 0, got_d = 0, toktype; - register char *p = tokstart; - int hex = input_radix > 10; - - if (c == '0' && (p[1] == 'x' || p[1] == 'X')) - { - p += 2; - hex = 1; - } - else if (c == '0' && (p[1]=='t' || p[1]=='T' || p[1]=='d' || p[1]=='D')) - { - p += 2; - hex = 0; - } - - for (;; ++p) - { - if (!hex && !got_e && (*p == 'e' || *p == 'E')) - got_dot = got_e = 1; - else if (!hex && !got_d && (*p == 'd' || *p == 'D')) - got_dot = got_d = 1; - else if (!hex && !got_dot && *p == '.') - got_dot = 1; - else if (((got_e && (p[-1] == 'e' || p[-1] == 'E')) - || (got_d && (p[-1] == 'd' || p[-1] == 'D'))) - && (*p == '-' || *p == '+')) - /* This is the sign of the exponent, not the end of the - number. */ - continue; - /* We will take any letters or digits. parse_number will - complain if past the radix, or if L or U are not final. */ - else if ((*p < '0' || *p > '9') - && ((*p < 'a' || *p > 'z') - && (*p < 'A' || *p > 'Z'))) - break; - } - toktype = parse_number (tokstart, p - tokstart, got_dot|got_e|got_d, - &yylval); - if (toktype == ERROR) - { - char *err_copy = (char *) alloca (p - tokstart + 1); - - memcpy (err_copy, tokstart, p - tokstart); - err_copy[p - tokstart] = 0; - error ("Invalid number \"%s\".", err_copy); - } - lexptr = p; - return toktype; - } - - case '+': - case '-': - case '*': - case '/': - case '%': - case '|': - case '&': - case '^': - case '~': - case '!': - case '@': - case '<': - case '>': - case '[': - case ']': - case '?': - case ':': - case '=': - case '{': - case '}': - symbol: - lexptr++; - return c; - } - - if (!(c == '_' || c == '$' - || (c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z'))) - /* We must have come across a bad character (e.g. ';'). */ - error ("Invalid character '%c' in expression.", c); - - namelen = 0; - for (c = tokstart[namelen]; - (c == '_' || c == '$' || (c >= '0' && c <= '9') - || (c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z')); - c = tokstart[++namelen]); - - /* The token "if" terminates the expression and is NOT - removed from the input stream. */ - - if (namelen == 2 && tokstart[0] == 'i' && tokstart[1] == 'f') - return 0; - - lexptr += namelen; - - /* Catch specific keywords. */ - - for (i = 0; f77_keywords[i].operator != NULL; i++) - if (STREQN(tokstart, f77_keywords[i].operator, - strlen(f77_keywords[i].operator))) - { - /* lexptr += strlen(f77_keywords[i].operator); */ - yylval.opcode = f77_keywords[i].opcode; - return f77_keywords[i].token; - } - - yylval.sval.ptr = tokstart; - yylval.sval.length = namelen; - - if (*tokstart == '$') - { - write_dollar_variable (yylval.sval); - return VARIABLE; - } - - /* Use token-type TYPENAME for symbols that happen to be defined - currently as names of types; NAME for other symbols. - The caller is not constrained to care about the distinction. */ - { - char *tmp = copy_name (yylval.sval); - struct symbol *sym; - int is_a_field_of_this = 0; - int hextype; - - sym = lookup_symbol (tmp, expression_context_block, - VAR_NAMESPACE, - current_language->la_language == language_cplus - ? &is_a_field_of_this : NULL, - NULL); - if (sym && SYMBOL_CLASS (sym) == LOC_TYPEDEF) - { - yylval.tsym.type = SYMBOL_TYPE (sym); - return TYPENAME; - } - if ((yylval.tsym.type = lookup_primitive_typename (tmp)) != 0) - return TYPENAME; - - /* Input names that aren't symbols but ARE valid hex numbers, - when the input radix permits them, can be names or numbers - depending on the parse. Note we support radixes > 16 here. */ - if (!sym - && ((tokstart[0] >= 'a' && tokstart[0] < 'a' + input_radix - 10) - || (tokstart[0] >= 'A' && tokstart[0] < 'A' + input_radix - 10))) - { - YYSTYPE newlval; /* Its value is ignored. */ - hextype = parse_number (tokstart, namelen, 0, &newlval); - if (hextype == INT) - { - yylval.ssym.sym = sym; - yylval.ssym.is_a_field_of_this = is_a_field_of_this; - return NAME_OR_INT; - } - } - - /* Any other kind of symbol */ - yylval.ssym.sym = sym; - yylval.ssym.is_a_field_of_this = is_a_field_of_this; - return NAME; - } -} - -void -yyerror (msg) - char *msg; -{ - error ("A %s in expression, near `%s'.", (msg ? msg : "error"), lexptr); -} diff --git a/contrib/gdb/gdb/gdba.el b/contrib/gdb/gdb/gdba.el deleted file mode 100644 index 0f71586422806..0000000000000 --- a/contrib/gdb/gdb/gdba.el +++ /dev/null @@ -1,2607 +0,0 @@ -(defmacro gud (form) - (` (save-excursion (set-buffer "*gud-a.out*") (, form)))) - -(defun dbug (foo &optional fun) - (save-excursion - (set-buffer (get-buffer-create "*trace*")) - (goto-char (point-max)) - (insert "***" (symbol-name foo) "\n") - (if fun - (funcall fun)))) - - -;;; gud.el --- Grand Unified Debugger mode for gdb, sdb, dbx, or xdb -;;; under Emacs - -;; Author: Eric S. Raymond <esr@snark.thyrsus.com> -;; Maintainer: FSF -;; Version: 1.3 -;; Keywords: unix, tools - -;; Copyright (C) 1992, 1993 Free Software Foundation, Inc. - -;; This file is part of GNU Emacs. - -;; GNU Emacs 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 2, or (at your option) -;; any later version. - -;; GNU Emacs 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 GNU Emacs; if not, write to the Free Software -;; Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - -;;; Commentary: - -;; The ancestral gdb.el was by W. Schelter <wfs@rascal.ics.utexas.edu> -;; It was later rewritten by rms. Some ideas were due to Masanobu. -;; Grand Unification (sdb/dbx support) by Eric S. Raymond <esr@thyrsus.com> -;; The overloading code was then rewritten by Barry Warsaw <bwarsaw@cen.com>, -;; who also hacked the mode to use comint.el. Shane Hartman <shane@spr.com> -;; added support for xdb (HPUX debugger). - -;; Cygnus Support added support for gdb's --annotate=2. - -;;; Code: - -(require 'comint) -(require 'etags) - -;; ====================================================================== -;; GUD commands must be visible in C buffers visited by GUD - -(defvar gud-key-prefix "\C-x\C-a" - "Prefix of all GUD commands valid in C buffers.") - -(global-set-key (concat gud-key-prefix "\C-l") 'gud-refresh) -(global-set-key "\C-x " 'gud-break) ;; backward compatibility hack - -;; ====================================================================== -;; the overloading mechanism - -(defun gud-overload-functions (gud-overload-alist) - "Overload functions defined in GUD-OVERLOAD-ALIST. -This association list has elements of the form - (ORIGINAL-FUNCTION-NAME OVERLOAD-FUNCTION)" - (mapcar - (function (lambda (p) (fset (car p) (symbol-function (cdr p))))) - gud-overload-alist)) - -(defun gud-massage-args (file args) - (error "GUD not properly entered.")) - -(defun gud-marker-filter (str) - (error "GUD not properly entered.")) - -(defun gud-find-file (f) - (error "GUD not properly entered.")) - -;; ====================================================================== -;; command definition - -;; This macro is used below to define some basic debugger interface commands. -;; Of course you may use `gud-def' with any other debugger command, including -;; user defined ones. - -;; A macro call like (gud-def FUNC NAME KEY DOC) expands to a form -;; which defines FUNC to send the command NAME to the debugger, gives -;; it the docstring DOC, and binds that function to KEY in the GUD -;; major mode. The function is also bound in the global keymap with the -;; GUD prefix. - -(defmacro gud-def (func cmd key &optional doc) - "Define FUNC to be a command sending STR and bound to KEY, with -optional doc string DOC. Certain %-escapes in the string arguments -are interpreted specially if present. These are: - - %f name (without directory) of current source file. - %d directory of current source file. - %l number of current source line - %e text of the C lvalue or function-call expression surrounding point. - %a text of the hexadecimal address surrounding point - %p prefix argument to the command (if any) as a number - - The `current' source file is the file of the current buffer (if -we're in a C file) or the source file current at the last break or -step (if we're in the GUD buffer). - The `current' line is that of the current buffer (if we're in a -source file) or the source line number at the last break or step (if -we're in the GUD buffer)." - (list 'progn - (list 'defun func '(arg) - (or doc "") - '(interactive "p") - (list 'gud-call cmd 'arg)) - (if key - (list 'define-key - '(current-local-map) - (concat "\C-c" key) - (list 'quote func))) - (if key - (list 'global-set-key - (list 'concat 'gud-key-prefix key) - (list 'quote func))))) - -;; Where gud-display-frame should put the debugging arrow. This is -;; set by the marker-filter, which scans the debugger's output for -;; indications of the current program counter. -(defvar gud-last-frame nil) - -;; Used by gud-refresh, which should cause gud-display-frame to redisplay -;; the last frame, even if it's been called before and gud-last-frame has -;; been set to nil. -(defvar gud-last-last-frame nil) - -;; All debugger-specific information is collected here. -;; Here's how it works, in case you ever need to add a debugger to the mode. -;; -;; Each entry must define the following at startup: -;; -;;<name> -;; comint-prompt-regexp -;; gud-<name>-massage-args -;; gud-<name>-marker-filter -;; gud-<name>-find-file -;; -;; The job of the massage-args method is to modify the given list of -;; debugger arguments before running the debugger. -;; -;; The job of the marker-filter method is to detect file/line markers in -;; strings and set the global gud-last-frame to indicate what display -;; action (if any) should be triggered by the marker. Note that only -;; whatever the method *returns* is displayed in the buffer; thus, you -;; can filter the debugger's output, interpreting some and passing on -;; the rest. -;; -;; The job of the find-file method is to visit and return the buffer indicated -;; by the car of gud-tag-frame. This may be a file name, a tag name, or -;; something else. - -;; ====================================================================== -;; gdb functions - -;;; History of argument lists passed to gdb. -(defvar gud-gdb-history nil) - -(defun gud-gdb-massage-args (file args) - (cons "--annotate=2" (cons file args))) - - -;; -;; In this world, there are gdb instance objects (of unspecified -;; representation) and buffers associated with those objects. -;; - -;; -;; gdb-instance objects -;; - -(defun make-gdb-instance (proc) - "Create a gdb instance object from a gdb process." - (setq last-proc proc) - (let ((instance (cons 'gdb-instance proc))) - (save-excursion - (set-buffer (process-buffer proc)) - (setq gdb-buffer-instance instance) - (progn - (mapcar 'make-variable-buffer-local gdb-instance-variables) - (setq gdb-buffer-type 'gud) - ;; If we're taking over the buffer of another process, - ;; take over it's ancillery buffers as well. - ;; - (let ((dead (or old-gdb-buffer-instance))) - (mapcar - (function - (lambda (b) - (progn - (set-buffer b) - (if (eq dead gdb-buffer-instance) - (setq gdb-buffer-instance instance))))) - (buffer-list))))) - instance)) - -(defun gdb-instance-process (inst) (cdr inst)) - -;;; The list of instance variables is built up by the expansions of -;;; DEF-GDB-VARIABLE -;;; -(defvar gdb-instance-variables '() - "A list of variables that are local to the gud buffer associated -with a gdb instance.") - -(defmacro def-gdb-variable - (name accessor setter &optional default doc) - (` - (progn - (defvar (, name) (, default) (, (or doc "undocumented"))) - (if (not (memq '(, name) gdb-instance-variables)) - (setq gdb-instance-variables - (cons '(, name) gdb-instance-variables))) - (, (and accessor - (` - (defun (, accessor) (instance) - (let - ((buffer (gdb-get-instance-buffer instance 'gud))) - (and buffer - (save-excursion - (set-buffer buffer) - (, name)))))))) - (, (and setter - (` - (defun (, setter) (instance val) - (let - ((buffer (gdb-get-instance-buffer instance 'gud))) - (and buffer - (save-excursion - (set-buffer buffer) - (setq (, name) val))))))))))) - -(defmacro def-gdb-var (root-symbol &optional default doc) - (let* ((root (symbol-name root-symbol)) - (accessor (intern (concat "gdb-instance-" root))) - (setter (intern (concat "set-gdb-instance-" root))) - (var-name (intern (concat "gdb-" root)))) - (` (def-gdb-variable - (, var-name) (, accessor) (, setter) - (, default) (, doc))))) - -(def-gdb-var buffer-instance nil - "In an instance buffer, the buffer's instance.") - -(def-gdb-var buffer-type nil - "One of the symbols bound in gdb-instance-buffer-rules") - -(def-gdb-var burst "" - "A string of characters from gdb that have not yet been processed.") - -(def-gdb-var input-queue () - "A list of high priority gdb command objects.") - -(def-gdb-var idle-input-queue () - "A list of low priority gdb command objects.") - -(def-gdb-var prompting nil - "True when gdb is idle with no pending input.") - -(def-gdb-var output-sink 'user - "The disposition of the output of the current gdb command. -Possible values are these symbols: - - user -- gdb output should be copied to the gud buffer - for the user to see. - - inferior -- gdb output should be copied to the inferior-io buffer - - pre-emacs -- output should be ignored util the post-prompt - annotation is received. Then the output-sink - becomes:... - emacs -- output should be collected in the partial-output-buffer - for subsequent processing by a command. This is the - disposition of output generated by commands that - gud mode sends to gdb on its own behalf. - post-emacs -- ignore input until the prompt annotation is - received, then go to USER disposition. -") - -(def-gdb-var current-item nil - "The most recent command item sent to gdb.") - -(def-gdb-var pending-triggers '() - "A list of trigger functions that have run later than their output -handlers.") - -(defun in-gdb-instance-context (instance form) - "Funcall `form' in the gud buffer of `instance'" - (save-excursion - (set-buffer (gdb-get-instance-buffer instance 'gud)) - (funcall form))) - -;; end of instance vars - -;; -;; finding instances -;; - -(defun gdb-proc->instance (proc) - (save-excursion - (set-buffer (process-buffer proc)) - gdb-buffer-instance)) - -(defun gdb-mru-instance-buffer () - "Return the most recently used (non-auxiliary) gdb gud buffer." - (save-excursion - (gdb-goto-first-gdb-instance (buffer-list)))) - -(defun gdb-goto-first-gdb-instance (blist) - "Use gdb-mru-instance-buffer -- not this." - (and blist - (progn - (set-buffer (car blist)) - (or (and gdb-buffer-instance - (eq gdb-buffer-type 'gud) - (car blist)) - (gdb-goto-first-gdb-instance (cdr blist)))))) - -(defun buffer-gdb-instance (buf) - (save-excursion - (set-buffer buf) - gdb-buffer-instance)) - -(defun gdb-needed-default-instance () - "Return the most recently used gdb instance or signal an error." - (let ((buffer (gdb-mru-instance-buffer))) - (or (and buffer (buffer-gdb-instance buffer)) - (error "No instance of gdb found.")))) - -(defun gdb-instance-target-string (instance) - "The apparent name of the program being debugged by a gdb instance. -For sure this the root string used in smashing together the gud -buffer's name, even if that doesn't happen to be the name of a -program." - (in-gdb-instance-context - instance - (function (lambda () gud-target-name)))) - - - -;; -;; Instance Buffers. -;; - -;; More than one buffer can be associated with a gdb instance. -;; -;; Each buffer has a TYPE -- a symbol that identifies the function -;; of that particular buffer. -;; -;; The usual gud interaction buffer is given the type `gud' and -;; is constructed specially. -;; -;; Others are constructed by gdb-get-create-instance-buffer and -;; named according to the rules set forth in the gdb-instance-buffer-rules-assoc - -(defun gdb-get-instance-buffer (instance key) - "Return the instance buffer for `instance' tagged with type `key'. -The key should be one of the cars in `gdb-instance-buffer-rules-assoc'." - (save-excursion - (gdb-look-for-tagged-buffer instance key (buffer-list)))) - -(defun gdb-get-create-instance-buffer (instance key) - "Create a new gdb instance buffer of the type specified by `key'. -The key should be one of the cars in `gdb-instance-buffer-rules-assoc'." - (or (gdb-get-instance-buffer instance key) - (let* ((rules (assoc key gdb-instance-buffer-rules-assoc)) - (name (funcall (gdb-rules-name-maker rules) instance)) - (new (get-buffer-create name))) - (save-excursion - (set-buffer new) - (make-variable-buffer-local 'gdb-buffer-type) - (setq gdb-buffer-type key) - (make-variable-buffer-local 'gdb-buffer-instance) - (setq gdb-buffer-instance instance) - (if (cdr (cdr rules)) - (funcall (car (cdr (cdr rules))))) - new)))) - -(defun gdb-rules-name-maker (rules) (car (cdr rules))) - -(defun gdb-look-for-tagged-buffer (instance key bufs) - (let ((retval nil)) - (while (and (not retval) bufs) - (set-buffer (car bufs)) - (if (and (eq gdb-buffer-instance instance) - (eq gdb-buffer-type key)) - (setq retval (car bufs))) - (setq bufs (cdr bufs)) - ) - retval)) - -(defun gdb-instance-buffer-p (buf) - (save-excursion - (set-buffer buf) - (and gdb-buffer-type - (not (eq gdb-buffer-type 'gud))))) - -;; -;; This assoc maps buffer type symbols to rules. Each rule is a list of -;; at least one and possible more functions. The functions have these -;; roles in defining a buffer type: -;; -;; NAME - take an instance, return a name for this type buffer for that -;; instance. -;; The remaining function(s) are optional: -;; -;; MODE - called in new new buffer with no arguments, should establish -;; the proper mode for the buffer. -;; - -(defvar gdb-instance-buffer-rules-assoc '()) - -(defun gdb-set-instance-buffer-rules (buffer-type &rest rules) - (let ((binding (assoc buffer-type gdb-instance-buffer-rules-assoc))) - (if binding - (setcdr binding rules) - (setq gdb-instance-buffer-rules-assoc - (cons (cons buffer-type rules) - gdb-instance-buffer-rules-assoc))))) - -(gdb-set-instance-buffer-rules 'gud 'error) ; gud buffers are an exception to the rules - -;; -;; partial-output buffers -;; -;; These accumulate output from a command executed on -;; behalf of emacs (rather than the user). -;; - -(gdb-set-instance-buffer-rules 'gdb-partial-output-buffer - 'gdb-partial-output-name) - -(defun gdb-partial-output-name (instance) - (concat "*partial-output-" - (gdb-instance-target-string instance) - "*")) - - -(gdb-set-instance-buffer-rules 'gdb-inferior-io - 'gdb-inferior-io-name - 'gud-inferior-io-mode) - -(defun gdb-inferior-io-name (instance) - (concat "*input/output of " - (gdb-instance-target-string instance) - "*")) - -(defvar gdb-inferior-io-mode-map (copy-keymap comint-mode-map)) -(define-key comint-mode-map "\C-c\C-c" 'gdb-inferior-io-interrupt) -(define-key comint-mode-map "\C-c\C-z" 'gdb-inferior-io-stop) -(define-key comint-mode-map "\C-c\C-\\" 'gdb-inferior-io-quit) -(define-key comint-mode-map "\C-c\C-d" 'gdb-inferior-io-eof) - -(defun gud-inferior-io-mode () - "Major mode for gud inferior-io. - -\\{comint-mode-map}" - ;; We want to use comint because it has various nifty and familiar - ;; features. We don't need a process, but comint wants one, so create - ;; a dummy one. - (make-comint (substring (buffer-name) 1 (- (length (buffer-name)) 1)) - "/bin/cat") - (setq major-mode 'gud-inferior-io-mode) - (setq mode-name "Debuggee I/O") - (setq comint-input-sender 'gud-inferior-io-sender) -) - -(defun gud-inferior-io-sender (proc string) - (save-excursion - (set-buffer (process-buffer proc)) - (let ((instance gdb-buffer-instance)) - (set-buffer (gdb-get-instance-buffer instance 'gud)) - (let ((gud-proc (get-buffer-process (current-buffer)))) - (process-send-string gud-proc string) - (process-send-string gud-proc "\n") - )) - )) - -(defun gdb-inferior-io-interrupt (instance) - "Interrupt the program being debugged." - (interactive (list (gdb-needed-default-instance))) - (interrupt-process - (get-buffer-process (gdb-get-instance-buffer instance 'gud)) comint-ptyp)) - -(defun gdb-inferior-io-quit (instance) - "Send quit signal to the program being debugged." - (interactive (list (gdb-needed-default-instance))) - (quit-process - (get-buffer-process (gdb-get-instance-buffer instance 'gud)) comint-ptyp)) - -(defun gdb-inferior-io-stop (instance) - "Stop the program being debugged." - (interactive (list (gdb-needed-default-instance))) - (stop-process - (get-buffer-process (gdb-get-instance-buffer instance 'gud)) comint-ptyp)) - -(defun gdb-inferior-io-eof (instance) - "Send end-of-file to the program being debugged." - (interactive (list (gdb-needed-default-instance))) - (process-send-eof - (get-buffer-process (gdb-get-instance-buffer instance 'gud)))) - - -;; -;; gdb communications -;; - -;; INPUT: things sent to gdb -;; -;; Each instance has a high and low priority -;; input queue. Low priority input is sent only -;; when the high priority queue is idle. -;; -;; The queues are lists. Each element is either -;; a string (indicating user or user-like input) -;; or a list of the form: -;; -;; (INPUT-STRING HANDLER-FN) -;; -;; -;; The handler function will be called from the -;; partial-output buffer when the command completes. -;; This is the way to write commands which -;; invoke gdb commands autonomously. -;; -;; These lists are consumed tail first. -;; - -(defun gdb-send (proc string) - "A comint send filter for gdb. -This filter may simply queue output for a later time." - (let ((instance (gdb-proc->instance proc))) - (gdb-instance-enqueue-input instance (concat string "\n")))) - -;; Note: Stuff enqueued here will be sent to the next prompt, even if it -;; is a query, or other non-top-level prompt. To guarantee stuff will get -;; sent to the top-level prompt, currently it must be put in the idle queue. -;; ^^^^^^^^^ -;; [This should encourage gud extentions that invoke gdb commands to let -;; the user go first; it is not a bug. -t] -;; - -(defun gdb-instance-enqueue-input (instance item) - (if (gdb-instance-prompting instance) - (progn - (gdb-send-item instance item) - (set-gdb-instance-prompting instance nil)) - (set-gdb-instance-input-queue - instance - (cons item (gdb-instance-input-queue instance))))) - -(defun gdb-instance-dequeue-input (instance) - (let ((queue (gdb-instance-input-queue instance))) - (and queue - (if (not (cdr queue)) - (let ((answer (car queue))) - (set-gdb-instance-input-queue instance '()) - answer) - (gdb-take-last-elt queue))))) - -(defun gdb-instance-enqueue-idle-input (instance item) - (if (and (gdb-instance-prompting instance) - (not (gdb-instance-input-queue instance))) - (progn - (gdb-send-item instance item) - (set-gdb-instance-prompting instance nil)) - (set-gdb-instance-idle-input-queue - instance - (cons item (gdb-instance-idle-input-queue instance))))) - -(defun gdb-instance-dequeue-idle-input (instance) - (let ((queue (gdb-instance-idle-input-queue instance))) - (and queue - (if (not (cdr queue)) - (let ((answer (car queue))) - (set-gdb-instance-idle-input-queue instance '()) - answer) - (gdb-take-last-elt queue))))) - -; Don't use this in general. -(defun gdb-take-last-elt (l) - (if (cdr (cdr l)) - (gdb-take-last-elt (cdr l)) - (let ((answer (car (cdr l)))) - (setcdr l '()) - answer))) - - -;; -;; output -- things gdb prints to emacs -;; -;; GDB output is a stream interrupted by annotations. -;; Annotations can be recognized by their beginning -;; with \C-j\C-z\C-z<tag><opt>\C-j -;; -;; The tag is a string obeying symbol syntax. -;; -;; The optional part `<opt>' can be either the empty string -;; or a space followed by more data relating to the annotation. -;; For example, the SOURCE annotation is followed by a filename, -;; line number and various useless goo. This data must not include -;; any newlines. -;; - - -(defun gud-gdb-marker-filter (string) - "A gud marker filter for gdb." - ;; Bogons don't tell us the process except through scoping crud. - (let ((instance (gdb-proc->instance proc))) - (gdb-output-burst instance string))) - -(defvar gdb-annotation-rules - '(("frames-invalid" gdb-invalidate-frames) - ("breakpoints-invalid" gdb-invalidate-breakpoints) - ("pre-prompt" gdb-pre-prompt) - ("prompt" gdb-prompt) - ("commands" gdb-subprompt) - ("overload-choice" gdb-subprompt) - ("query" gdb-subprompt) - ("prompt-for-continue" gdb-subprompt) - ("post-prompt" gdb-post-prompt) - ("source" gdb-source) - ("starting" gdb-starting) - ("exited" gdb-stopping) - ("signalled" gdb-stopping) - ("signal" gdb-stopping) - ("breakpoint" gdb-stopping) - ("watchpoint" gdb-stopping) - ("stopped" gdb-stopped) - ) - "An assoc mapping annotation tags to functions which process them.") - - -(defun gdb-ignore-annotation (instance args) - nil) - -(defconst gdb-source-spec-regexp - "\\(.*\\):\\([0-9]*\\):[0-9]*:[a-z]*:0x[a-f0-9]*") - -;; Do not use this except as an annotation handler." -(defun gdb-source (instance args) - (string-match gdb-source-spec-regexp args) - ;; Extract the frame position from the marker. - (setq gud-last-frame - (cons - (substring args (match-beginning 1) (match-end 1)) - (string-to-int (substring args - (match-beginning 2) - (match-end 2)))))) - -;; An annotation handler for `prompt'. -;; This sends the next command (if any) to gdb. -(defun gdb-prompt (instance ignored) - (let ((sink (gdb-instance-output-sink instance))) - (cond - ((eq sink 'user) t) - ((eq sink 'post-emacs) - (set-gdb-instance-output-sink instance 'user)) - (t - (set-gdb-instance-output-sink instance 'user) - (error "Phase error in gdb-prompt (got %s)" sink)))) - (let ((highest (gdb-instance-dequeue-input instance))) - (if highest - (gdb-send-item instance highest) - (let ((lowest (gdb-instance-dequeue-idle-input instance))) - (if lowest - (gdb-send-item instance lowest) - (progn - (set-gdb-instance-prompting instance t) - (gud-display-frame))))))) - -;; An annotation handler for non-top-level prompts. -(defun gdb-subprompt (instance ignored) - (let ((highest (gdb-instance-dequeue-input instance))) - (if highest - (gdb-send-item instance highest) - (set-gdb-instance-prompting instance t)))) - -(defun gdb-send-item (instance item) - (set-gdb-instance-current-item instance item) - (if (stringp item) - (progn - (set-gdb-instance-output-sink instance 'user) - (process-send-string (gdb-instance-process instance) - item)) - (progn - (gdb-clear-partial-output instance) - (set-gdb-instance-output-sink instance 'pre-emacs) - (process-send-string (gdb-instance-process instance) - (car item))))) - -;; An annotation handler for `pre-prompt'. -;; This terminates the collection of output from a previous -;; command if that happens to be in effect. -(defun gdb-pre-prompt (instance ignored) - (let ((sink (gdb-instance-output-sink instance))) - (cond - ((eq sink 'user) t) - ((eq sink 'emacs) - (set-gdb-instance-output-sink instance 'post-emacs) - (let ((handler - (car (cdr (gdb-instance-current-item instance))))) - (save-excursion - (set-buffer (gdb-get-create-instance-buffer - instance 'gdb-partial-output-buffer)) - (funcall handler)))) - (t - (set-gdb-instance-output-sink instance 'user) - (error "Output sink phase error 1."))))) - -;; An annotation handler for `starting'. This says that I/O for the subprocess -;; is now the program being debugged, not GDB. -(defun gdb-starting (instance ignored) - (let ((sink (gdb-instance-output-sink instance))) - (cond - ((eq sink 'user) - (set-gdb-instance-output-sink instance 'inferior) - ;; FIXME: need to send queued input - ) - (t (error "Unexpected `starting' annotation"))))) - -;; An annotation handler for `exited' and other annotations which say that -;; I/O for the subprocess is now GDB, not the program being debugged. -(defun gdb-stopping (instance ignored) - (let ((sink (gdb-instance-output-sink instance))) - (cond - ((eq sink 'inferior) - (set-gdb-instance-output-sink instance 'user) - ) - (t (error "Unexpected stopping annotation"))))) - -;; An annotation handler for `stopped'. It is just like gdb-stopping, except -;; that if we already set the output sink to 'user in gdb-stopping, that is -;; fine. -(defun gdb-stopped (instance ignored) - (let ((sink (gdb-instance-output-sink instance))) - (cond - ((eq sink 'inferior) - (set-gdb-instance-output-sink instance 'user) - ) - ((eq sink 'user) - t) - (t (error "Unexpected stopping annotation"))))) - -;; An annotation handler for `post-prompt'. -;; This begins the collection of output from the current -;; command if that happens to be appropriate." -(defun gdb-post-prompt (instance ignored) - (gdb-invalidate-registers instance ignored) - (let ((sink (gdb-instance-output-sink instance))) - (cond - ((eq sink 'user) t) - ((eq sink 'pre-emacs) - (set-gdb-instance-output-sink instance 'emacs)) - - (t - (set-gdb-instance-output-sink instance 'user) - (error "Output sink phase error 3."))))) - -;; Handle a burst of output from a gdb instance. -;; This function is (indirectly) used as a gud-marker-filter. -;; It must return output (if any) to be insterted in the gud -;; buffer. - -(defun gdb-output-burst (instance string) - "Handle a burst of output from a gdb instance. -This function is (indirectly) used as a gud-marker-filter. -It must return output (if any) to be insterted in the gud -buffer." - - (save-match-data - (let ( - ;; Recall the left over burst from last time - (burst (concat (gdb-instance-burst instance) string)) - ;; Start accumulating output for the gud buffer - (output "")) - - ;; Process all the complete markers in this chunk. - - (while (string-match "\n\032\032\\(.*\\)\n" burst) - (let ((annotation (substring burst - (match-beginning 1) - (match-end 1)))) - - ;; Stuff prior to the match is just ordinary output. - ;; It is either concatenated to OUTPUT or directed - ;; elsewhere. - (setq output - (gdb-concat-output - instance - output - (substring burst 0 (match-beginning 0)))) - - ;; Take that stuff off the burst. - (setq burst (substring burst (match-end 0))) - - ;; Parse the tag from the annotation, and maybe its arguments. - (string-match "\\(\\S-*\\) ?\\(.*\\)" annotation) - (let* ((annotation-type (substring annotation - (match-beginning 1) - (match-end 1))) - (annotation-arguments (substring annotation - (match-beginning 2) - (match-end 2))) - (annotation-rule (assoc annotation-type - gdb-annotation-rules))) - ;; Call the handler for this annotation. - (if annotation-rule - (funcall (car (cdr annotation-rule)) - instance - annotation-arguments) - ;; Else the annotation is not recognized. Ignore it silently, - ;; so that GDB can add new annotations without causing - ;; us to blow up. - )))) - - - ;; Does the remaining text end in a partial line? - ;; If it does, then keep part of the burst until we get more. - (if (string-match "\n\\'\\|\n\032\\'\\|\n\032\032.*\\'" - burst) - (progn - ;; Everything before the potential marker start can be output. - (setq output - (gdb-concat-output - instance - output - (substring burst 0 (match-beginning 0)))) - - ;; Everything after, we save, to combine with later input. - (setq burst (substring burst (match-beginning 0)))) - - ;; In case we know the burst contains no partial annotations: - (progn - (setq output (gdb-concat-output instance output burst)) - (setq burst ""))) - - ;; Save the remaining burst for the next call to this function. - (set-gdb-instance-burst instance burst) - output))) - -(defun gdb-concat-output (instance so-far new) - (let ((sink (gdb-instance-output-sink instance))) - (cond - ((eq sink 'user) (concat so-far new)) - ((or (eq sink 'pre-emacs) (eq sink 'post-emacs)) so-far) - ((eq sink 'emacs) - (gdb-append-to-partial-output instance new) - so-far) - ((eq sink 'inferior) - (gdb-append-to-inferior-io instance new) - so-far) - (t (error "Bogon output sink %S" sink))))) - -(defun gdb-append-to-partial-output (instance string) - (save-excursion - (set-buffer - (gdb-get-create-instance-buffer - instance 'gdb-partial-output-buffer)) - (goto-char (point-max)) - (insert string))) - -(defun gdb-clear-partial-output (instance) - (save-excursion - (set-buffer - (gdb-get-create-instance-buffer - instance 'gdb-partial-output-buffer)) - (delete-region (point-min) (point-max)))) - -(defun gdb-append-to-inferior-io (instance string) - (save-excursion - (set-buffer - (gdb-get-create-instance-buffer - instance 'gdb-inferior-io)) - (goto-char (point-max)) - (insert-before-markers string)) - (gud-display-buffer - (gdb-get-create-instance-buffer instance - 'gdb-inferior-io))) - -(defun gdb-clear-inferior-io (instance) - (save-excursion - (set-buffer - (gdb-get-create-instance-buffer - instance 'gdb-inferior-io)) - (delete-region (point-min) (point-max)))) - - - -;; One trick is to have a command who's output is always available in -;; a buffer of it's own, and is always up to date. We build several -;; buffers of this type. -;; -;; There are two aspects to this: gdb has to tell us when the output -;; for that command might have changed, and we have to be able to run -;; the command behind the user's back. -;; -;; The idle input queue and the output phasing associated with -;; the instance variable `(gdb-instance-output-sink instance)' help -;; us to run commands behind the user's back. -;; -;; Below is the code for specificly managing buffers of output from one -;; command. -;; - - -;; The trigger function is suitable for use in the assoc GDB-ANNOTATION-RULES -;; It adds an idle input for the command we are tracking. It should be the -;; annotation rule binding of whatever gdb sends to tell us this command -;; might have changed it's output. -;; -;; NAME is the fucntion name. DEMAND-PREDICATE tests if output is really needed. -;; GDB-COMMAND is a string of such. OUTPUT-HANDLER is the function bound to the -;; input in the input queue (see comment about ``gdb communications'' above). -(defmacro def-gdb-auto-update-trigger (name demand-predicate gdb-command output-handler) - (` - (defun (, name) (instance &optional ignored) - (if (and ((, demand-predicate) instance) - (not (member '(, name) - (gdb-instance-pending-triggers instance)))) - (progn - (gdb-instance-enqueue-idle-input - instance - (list (, gdb-command) '(, output-handler))) - (set-gdb-instance-pending-triggers - instance - (cons '(, name) - (gdb-instance-pending-triggers instance)))))))) - -(defmacro def-gdb-auto-update-handler (name trigger buf-key) - (` - (defun (, name) () - (set-gdb-instance-pending-triggers - instance - (delq '(, trigger) - (gdb-instance-pending-triggers instance))) - (let ((buf (gdb-get-instance-buffer instance - '(, buf-key)))) - (and buf - (save-excursion - (set-buffer buf) - (let ((p (point)) - (buffer-read-only nil)) - (delete-region (point-min) (point-max)) - (insert-buffer (gdb-get-create-instance-buffer - instance - 'gdb-partial-output-buffer)) - (goto-char p)))))))) - -(defmacro def-gdb-auto-updated-buffer - (buffer-key trigger-name gdb-command output-handler-name) - (` - (progn - (def-gdb-auto-update-trigger (, trigger-name) - ;; The demand predicate: - (lambda (instance) - (gdb-get-instance-buffer instance '(, buffer-key))) - (, gdb-command) - (, output-handler-name)) - (def-gdb-auto-update-handler (, output-handler-name) - (, trigger-name) (, buffer-key))))) - - - -;; -;; Breakpoint buffers -;; -;; These display the output of `info breakpoints'. -;; - - -(gdb-set-instance-buffer-rules 'gdb-breakpoints-buffer - 'gdb-breakpoints-buffer-name - 'gud-breakpoints-mode) - -(def-gdb-auto-updated-buffer gdb-breakpoints-buffer - ;; This defines the auto update rule for buffers of type - ;; `gdb-breakpoints-buffer'. - ;; - ;; It defines a function to serve as the annotation handler that - ;; handles the `foo-invalidated' message. That function is called: - gdb-invalidate-breakpoints - - ;; To update the buffer, this command is sent to gdb. - "server info breakpoints\n" - - ;; This also defines a function to be the handler for the output - ;; from the command above. That function will copy the output into - ;; the appropriately typed buffer. That function will be called: - gdb-info-breakpoints-handler) - -(defun gdb-breakpoints-buffer-name (instance) - (save-excursion - (set-buffer (process-buffer (gdb-instance-process instance))) - (concat "*breakpoints of " (gdb-instance-target-string instance) "*"))) - -(defun gud-display-breakpoints-buffer (instance) - (interactive (list (gdb-needed-default-instance))) - (gud-display-buffer - (gdb-get-create-instance-buffer instance - 'gdb-breakpoints-buffer))) - -(defun gud-frame-breakpoints-buffer (instance) - (interactive (list (gdb-needed-default-instance))) - (gud-frame-buffer - (gdb-get-create-instance-buffer instance - 'gdb-breakpoints-buffer))) - -(defvar gud-breakpoints-mode-map nil) -(setq gud-breakpoints-mode-map (make-keymap)) -(suppress-keymap gud-breakpoints-mode-map) -(define-key gud-breakpoints-mode-map " " 'gud-toggle-bp-this-line) -(define-key gud-breakpoints-mode-map "d" 'gud-delete-bp-this-line) - -(defun gud-breakpoints-mode () - "Major mode for gud breakpoints. - -\\{gud-breakpoints-mode-map}" - (setq major-mode 'gud-breakpoints-mode) - (setq mode-name "Breakpoints") - (use-local-map gud-breakpoints-mode-map) - (setq buffer-read-only t) - (gdb-invalidate-breakpoints gdb-buffer-instance)) - -(defun gud-toggle-bp-this-line () - (interactive) - (save-excursion - (beginning-of-line 1) - (if (not (looking-at "\\([0-9]*\\)\\s-*\\S-*\\s-*\\S-*\\s-*\\(.\\)")) - (error "Not recognized as breakpoint line (demo foo).") - (gdb-instance-enqueue-idle-input - gdb-buffer-instance - (list - (concat - (if (eq ?y (char-after (match-beginning 2))) - "server disable " - "server enable ") - (buffer-substring (match-beginning 0) - (match-end 1)) - "\n") - '(lambda () nil))) - ))) - -(defun gud-delete-bp-this-line () - (interactive) - (save-excursion - (beginning-of-line 1) - (if (not (looking-at "\\([0-9]*\\)\\s-*\\S-*\\s-*\\S-*\\s-*\\(.\\)")) - (error "Not recognized as breakpoint line (demo foo).") - (gdb-instance-enqueue-idle-input - gdb-buffer-instance - (list - (concat - "server delete " - (buffer-substring (match-beginning 0) - (match-end 1)) - "\n") - '(lambda () nil))) - ))) - - - - -;; -;; Frames buffers. These display a perpetually correct bactracktrace -;; (from the command `where'). -;; -;; Alas, if your stack is deep, they are costly. -;; - -(gdb-set-instance-buffer-rules 'gdb-stack-buffer - 'gdb-stack-buffer-name - 'gud-frames-mode) - -(def-gdb-auto-updated-buffer gdb-stack-buffer - gdb-invalidate-frames - "server where\n" - gdb-info-frames-handler) - -(defun gdb-stack-buffer-name (instance) - (save-excursion - (set-buffer (process-buffer (gdb-instance-process instance))) - (concat "*stack frames of " - (gdb-instance-target-string instance) "*"))) - -(defun gud-display-stack-buffer (instance) - (interactive (list (gdb-needed-default-instance))) - (gud-display-buffer - (gdb-get-create-instance-buffer instance - 'gdb-stack-buffer))) - -(defun gud-frame-stack-buffer (instance) - (interactive (list (gdb-needed-default-instance))) - (gud-frame-buffer - (gdb-get-create-instance-buffer instance - 'gdb-stack-buffer))) - -(defvar gud-frames-mode-map nil) -(setq gud-frames-mode-map (make-keymap)) -(suppress-keymap gud-frames-mode-map) -(define-key gud-frames-mode-map [mouse-2] - 'gud-frames-select-by-mouse) - -(defun gud-frames-mode () - "Major mode for gud frames. - -\\{gud-frames-mode-map}" - (setq major-mode 'gud-frames-mode) - (setq mode-name "Frames") - (setq buffer-read-only t) - (use-local-map gud-frames-mode-map) - (gdb-invalidate-frames gdb-buffer-instance)) - -(defun gud-get-frame-number () - (save-excursion - (let* ((pos (re-search-backward "^#\\([0-9]*\\)" nil t)) - (n (or (and pos - (string-to-int - (buffer-substring (match-beginning 1) - (match-end 1)))) - 0))) - n))) - -(defun gud-frames-select-by-mouse (e) - (interactive "e") - (let (selection) - (save-excursion - (set-buffer (window-buffer (posn-window (event-end e)))) - (save-excursion - (goto-char (posn-point (event-end e))) - (setq selection (gud-get-frame-number)))) - (select-window (posn-window (event-end e))) - (save-excursion - (set-buffer (gdb-get-instance-buffer (gdb-needed-default-instance) 'gud)) - (gud-call "fr %p" selection) - (gud-display-frame)))) - - -;; -;; Registers buffers -;; - -(def-gdb-auto-updated-buffer gdb-registers-buffer - gdb-invalidate-registers - "server info registers\n" - gdb-info-registers-handler) - -(gdb-set-instance-buffer-rules 'gdb-registers-buffer - 'gdb-registers-buffer-name - 'gud-registers-mode) - -(defvar gud-registers-mode-map nil) -(setq gud-registers-mode-map (make-keymap)) -(suppress-keymap gud-registers-mode-map) - -(defun gud-registers-mode () - "Major mode for gud registers. - -\\{gud-registers-mode-map}" - (setq major-mode 'gud-registers-mode) - (setq mode-name "Registers") - (setq buffer-read-only t) - (use-local-map gud-registers-mode-map) - (gdb-invalidate-registers gdb-buffer-instance)) - -(defun gdb-registers-buffer-name (instance) - (save-excursion - (set-buffer (process-buffer (gdb-instance-process instance))) - (concat "*registers of " (gdb-instance-target-string instance) "*"))) - -(defun gud-display-registers-buffer (instance) - (interactive (list (gdb-needed-default-instance))) - (gud-display-buffer - (gdb-get-create-instance-buffer instance - 'gdb-registers-buffer))) - -(defun gud-frame-registers-buffer (instance) - (interactive (list (gdb-needed-default-instance))) - (gud-frame-buffer - (gdb-get-create-instance-buffer instance - 'gdb-registers-buffer))) - - - -;;;; Menu windows: - - -;; MENU-LIST is ((option option option...) (option option ...)...) -;; -(defun gud-display-menu (menu-list) - (setq fill-column (min 120 (- (window-width) - (min 8 (window-width))))) - (while menu-list - (mapcar (function (lambda (x) (insert (symbol-name x) " "))) (car menu-list)) - (fill-paragraph nil) - (insert "\n\n") - (setq menu-list (cdr menu-list))) - (goto-char (point-min)) - (while (re-search-forward "\\([^ \n]+\\)\\(\n\\| \\)" nil t) - (put-text-property (match-beginning 1) (match-end 1) - 'mouse-face 'highlight)) - (goto-char (point-min))) - -(defun gud-goto-menu (menu) - (setq gud-menu-position menu) - (let ((buffer-read-only nil)) - (delete-region (point-min) (point-max)) - (gud-display-menu menu))) - -(defun gud-menu-pick (event) - "Choose an item from a gdb command menu." - (interactive "e") - (let (choice) - (save-excursion - (set-buffer (window-buffer (posn-window (event-start event)))) - (goto-char (posn-point (event-start event))) - (let (beg end) - (skip-chars-forward "^ \t\n") - (setq end (point)) - (skip-chars-backward "^ \t\n") - (setq beg (point)) - (setq choice (buffer-substring beg end)) - (message choice) - (gud-invoke-menu (intern choice)))))) - -(defun gud-invoke-menu (symbol) - (let ((meaning (assoc symbol gud-menu-rules))) - (cond - ((and (consp meaning) - (consp (car (cdr meaning)))) - (gud-goto-menu (car (cdr meaning)))) - (meaning (call-interactively (car (cdr meaning))))))) - - - -(gdb-set-instance-buffer-rules 'gdb-command-buffer - 'gdb-command-buffer-name - 'gud-command-mode) - -(defvar gud-command-mode-map nil) -(setq gud-command-mode-map (make-keymap)) -(suppress-keymap gud-command-mode-map) -(define-key gud-command-mode-map [mouse-2] 'gud-menu-pick) - -(defun gud-command-mode () - "Major mode for gud menu. - -\\{gud-command-mode-map}" (interactive) (setq major-mode 'gud-command-mode) - (setq mode-name "Menu") (setq buffer-read-only t) (use-local-map - gud-command-mode-map) (make-variable-buffer-local 'gud-menu-position) - (if (not gud-menu-position) (gud-goto-menu gud-running-menu))) - -(defun gdb-command-buffer-name (instance) - (save-excursion - (set-buffer (process-buffer (gdb-instance-process instance))) - (concat "*menu of " (gdb-instance-target-string instance) "*"))) - -(defun gud-display-command-buffer (instance) - (interactive (list (gdb-needed-default-instance))) - (gud-display-buffer - (gdb-get-create-instance-buffer instance - 'gdb-command-buffer) - 6)) - -(defun gud-frame-command-buffer (instance) - (interactive (list (gdb-needed-default-instance))) - (gud-frame-buffer - (gdb-get-create-instance-buffer instance - 'gdb-command-buffer))) - -(defvar gud-selected-menu-titles ()) -(setq gud-selected-menu-titles - '(RUNNING STACK DATA BREAKPOINTS FILES)) - -(setq gud-running-menu - (list - '(RUNNING stack breakpoints files) - '(target run next step continue finish stepi kill help-running))) - -(setq gud-stack-menu - (list - '(running STACK breakpoints files) - '(up down frame backtrace return help-stack))) - -(setq gud-data-menu - (list - '(running stack DATA breakpoints files) - '(whatis ptype print set display undisplay disassemble help-data))) - -(setq gud-breakpoints-menu - (list - '(running stack BREAKPOINTS files) - '(awatch rwatch watch break delete enable disable condition ignore help-breakpoints))) - -(setq gud-files-menu - (list - '(running stack breakpoints FILES) - '(file core-file help-files) - '(exec-file load symbol-file add-symbol-file sharedlibrary))) - -(setq gud-menu-rules - (list - (list 'running gud-running-menu) - (list 'RUNNING gud-running-menu) - (list 'stack gud-stack-menu) - (list 'STACK gud-stack-menu) - (list 'data gud-data-menu) - (list 'DATA gud-data-menu) - (list 'breakpoints gud-breakpoints-menu) - (list 'BREAKPOINTS gud-breakpoints-menu) - (list 'files gud-files-menu) - (list 'FILES gud-files-menu) - - (list 'target 'gud-target) - (list 'kill 'gud-kill) - (list 'stepi 'gud-stepi) - (list 'step 'gud-step) - (list 'next 'gud-next) - (list 'finish 'gud-finish) - (list 'continue 'gud-cont) - (list 'run 'gud-run) - - (list 'backtrace 'gud-backtrace) - (list 'frame 'gud-frame) - (list 'down 'gud-down) - (list 'up 'gud-up) - (list 'return 'gud-return) - - (list 'file 'gud-file) - (list 'core-file 'gud-core-file) - (list 'cd 'gud-cd) - - (list 'exec-file 'gud-exec-file) - (list 'load 'gud-load) - (list 'symbol-file 'gud-symbol-file) - (list 'add-symbol-file 'gud-add-symbol-file) - (list 'sharedlibrary 'gud-sharedlibrary) - )) - - - - -(defun gdb-call-showing-gud (instance command) - (gud-display-gud-buffer instance) - (comint-input-sender (gdb-instance-process instance) command)) - -(defvar gud-target-history ()) - -(defun gud-temp-buffer-show (buf) - (let ((ow (selected-window))) - (unwind-protect - (progn - (pop-to-buffer buf) - - ;; This insertion works around a bug in emacs. - ;; The bug is that all the empty space after a - ;; highlighted word that terminates a buffer - ;; gets highlighted. That's really ugly, so - ;; make sure a highlighted word can't ever - ;; terminate the buffer. - (goto-char (point-max)) - (insert "\n") - (goto-char (point-min)) - - (if (< (window-height) 10) - (enlarge-window (- 10 (window-height))))) - (select-window ow)))) - -(defun gud-target (instance command) - (interactive - (let* ((instance (gdb-needed-default-instance)) - (temp-buffer-show-function (function gud-temp-buffer-show)) - (target-name (completing-read (format "Target type: ") - '(("remote") - ("core") - ("child") - ("exec")) - nil - t - nil - 'gud-target-history))) - (list instance - (cond - ((equal target-name "child") "run") - - ((equal target-name "core") - (concat "target core " - (read-file-name "core file: " - nil - "core" - t))) - - ((equal target-name "exec") - (concat "target exec " - (read-file-name "exec file: " - nil - "a.out" - t))) - - ((equal target-name "remote") - (concat "target remote " - (read-file-name "serial line for remote: " - "/dev/" - "ttya" - t))) - - (t "echo No such target command!"))))) - - (gud-display-gud-buffer instance) - (apply comint-input-sender - (list (gdb-instance-process instance) command))) - -(defun gud-backtrace () - (interactive) - (let ((instance (gdb-needed-default-instance))) - (gud-display-gud-buffer instance) - (apply comint-input-sender - (list (gdb-instance-process instance) - "backtrace")))) - -(defun gud-frame () - (interactive) - (let ((instance (gdb-needed-default-instance))) - (apply comint-input-sender - (list (gdb-instance-process instance) - "frame")))) - -(defun gud-return (instance command) - (interactive - (let ((temp-buffer-show-function (function gud-temp-buffer-show))) - (list (gdb-needed-default-instance) - (concat "return " (read-string "Expression to return: "))))) - (gud-display-gud-buffer instance) - (apply comint-input-sender - (list (gdb-instance-process instance) command))) - - -(defun gud-file (instance command) - (interactive - (let ((temp-buffer-show-function (function gud-temp-buffer-show))) - (list (gdb-needed-default-instance) - (concat "file " (read-file-name "Executable to debug: " - nil - "a.out" - t))))) - (gud-display-gud-buffer instance) - (apply comint-input-sender - (list (gdb-instance-process instance) command))) - -(defun gud-core-file (instance command) - (interactive - (let ((temp-buffer-show-function (function gud-temp-buffer-show))) - (list (gdb-needed-default-instance) - (concat "core " (read-file-name "Core file to debug: " - nil - "core-file" - t))))) - (gud-display-gud-buffer instance) - (apply comint-input-sender - (list (gdb-instance-process instance) command))) - -(defun gud-cd (dir) - (interactive "FChange GDB's default directory: ") - (let ((instance (gdb-needed-default-instance))) - (save-excursion - (set-buffer (gdb-get-instance-buffer instance 'gud)) - (cd dir)) - (gud-display-gud-buffer instance) - (apply comint-input-sender - (list (gdb-instance-process instance) - (concat "cd " dir))))) - - -(defun gud-exec-file (instance command) - (interactive - (let ((temp-buffer-show-function (function gud-temp-buffer-show))) - (list (gdb-needed-default-instance) - (concat "exec-file " (read-file-name "Init memory from executable: " - nil - "a.out" - t))))) - (gud-display-gud-buffer instance) - (apply comint-input-sender - (list (gdb-instance-process instance) command))) - -(defun gud-load (instance command) - (interactive - (let ((temp-buffer-show-function (function gud-temp-buffer-show))) - (list (gdb-needed-default-instance) - (concat "load " (read-file-name "Dynamicly load from file: " - nil - "a.out" - t))))) - (gud-display-gud-buffer instance) - (apply comint-input-sender - (list (gdb-instance-process instance) command))) - -(defun gud-symbol-file (instance command) - (interactive - (let ((temp-buffer-show-function (function gud-temp-buffer-show))) - (list (gdb-needed-default-instance) - (concat "symbol-file " (read-file-name "Read symbol table from file: " - nil - "a.out" - t))))) - (gud-display-gud-buffer instance) - (apply comint-input-sender - (list (gdb-instance-process instance) command))) - - -(defun gud-add-symbol-file (instance command) - (interactive - (let ((temp-buffer-show-function (function gud-temp-buffer-show))) - (list (gdb-needed-default-instance) - (concat "add-symbol-file " - (read-file-name "Add symbols from file: " - nil - "a.out" - t))))) - (gud-display-gud-buffer instance) - (apply comint-input-sender - (list (gdb-instance-process instance) command))) - - -(defun gud-sharedlibrary (instance command) - (interactive - (let ((temp-buffer-show-function (function gud-temp-buffer-show))) - (list (gdb-needed-default-instance) - (concat "sharedlibrary " - (read-string "Load symbols for files matching regexp: "))))) - (gud-display-gud-buffer instance) - (apply comint-input-sender - (list (gdb-instance-process instance) command))) - - - - - -;;;; Window management - - -;;; FIXME: This should only return true for buffers in the current instance -(defun gud-protected-buffer-p (buffer) - "Is BUFFER a buffer which we want to leave displayed?" - (save-excursion - (set-buffer buffer) - (or gdb-buffer-type - overlay-arrow-position))) - -;;; The way we abuse the dedicated-p flag is pretty gross, but seems -;;; to do the right thing. Seeing as there is no way for Lisp code to -;;; get at the use_time field of a window, I'm not sure there exists a -;;; more elegant solution without writing C code. - -(defun gud-display-buffer (buf &optional size) - (let ((must-split nil) - (answer nil)) - (unwind-protect - (progn - (walk-windows - '(lambda (win) - (if (gud-protected-buffer-p (window-buffer win)) - (set-window-dedicated-p win t)))) - (setq answer (get-buffer-window buf)) - (if (not answer) - (let ((window (get-lru-window))) - (if window - (progn - (set-window-buffer window buf) - (setq answer window)) - (setq must-split t))))) - (walk-windows - '(lambda (win) - (if (gud-protected-buffer-p (window-buffer win)) - (set-window-dedicated-p win nil))))) - (if must-split - (let* ((largest (get-largest-window)) - (cur-size (window-height largest)) - (new-size (and size (< size cur-size) (- cur-size size)))) - (setq answer (split-window largest new-size)) - (set-window-buffer answer buf))) - answer)) - -(defun existing-source-window (buffer) - (catch 'found - (save-excursion - (walk-windows - (function - (lambda (win) - (if (and overlay-arrow-position - (eq (window-buffer win) - (marker-buffer overlay-arrow-position))) - (progn - (set-window-buffer win buffer) - (throw 'found win)))))) - nil))) - -(defun gud-display-source-buffer (buffer) - (or (existing-source-window buffer) - (gud-display-buffer buffer))) - -(defun gud-frame-buffer (buf) - (save-excursion - (set-buffer buf) - (make-frame))) - - - -;;; Shared keymap initialization: - -(defun make-windows-menu (map) - (define-key map [menu-bar displays] - (cons "GDB-Windows" (make-sparse-keymap "GDB-Windows"))) - (define-key map [menu-bar displays gdb] - '("Gdb" . gud-display-gud-buffer)) - (define-key map [menu-bar displays registers] - '("Registers" . gud-display-registers-buffer)) - (define-key map [menu-bar displays frames] - '("Stack" . gud-display-stack-buffer)) - (define-key map [menu-bar displays breakpoints] - '("Breakpoints" . gud-display-breakpoints-buffer)) - (define-key map [menu-bar displays commands] - '("Commands" . gud-display-command-buffer))) - -(defun gud-display-gud-buffer (instance) - (interactive (list (gdb-needed-default-instance))) - (gud-display-buffer - (gdb-get-create-instance-buffer instance 'gud))) - -(make-windows-menu gud-breakpoints-mode-map) -(make-windows-menu gud-frames-mode-map) -(make-windows-menu gud-registers-mode-map) - - - -(defun make-frames-menu (map) - (define-key map [menu-bar frames] - (cons "GDB-Frames" (make-sparse-keymap "GDB-Frames"))) - (define-key map [menu-bar frames gdb] - '("Gdb" . gud-frame-gud-buffer)) - (define-key map [menu-bar frames registers] - '("Registers" . gud-frame-registers-buffer)) - (define-key map [menu-bar frames frames] - '("Stack" . gud-frame-stack-buffer)) - (define-key map [menu-bar frames breakpoints] - '("Breakpoints" . gud-frame-breakpoints-buffer)) - (define-key map [menu-bar displays commands] - '("Commands" . gud-display-command-buffer))) - -(defun gud-frame-gud-buffer (instance) - (interactive (list (gdb-needed-default-instance))) - (gud-frame-buffer - (gdb-get-create-instance-buffer instance 'gud))) - -(make-frames-menu gud-breakpoints-mode-map) -(make-frames-menu gud-frames-mode-map) -(make-frames-menu gud-registers-mode-map) - - -(defun gud-gdb-find-file (f) - (find-file-noselect f)) - -;;;###autoload -(defun gdb (command-line) - "Run gdb on program FILE in buffer *gud-FILE*. -The directory containing FILE becomes the initial working directory -and source-file directory for your debugger." - (interactive - (list (read-from-minibuffer "Run gdb (like this): " - (if (consp gud-gdb-history) - (car gud-gdb-history) - "gdb ") - nil nil - '(gud-gdb-history . 1)))) - (gud-overload-functions - '((gud-massage-args . gud-gdb-massage-args) - (gud-marker-filter . gud-gdb-marker-filter) - (gud-find-file . gud-gdb-find-file) - )) - - (let* ((words (gud-chop-words command-line)) - (program (car words)) - (file-word (let ((w (cdr words))) - (while (and w (= ?- (aref (car w) 0))) - (setq w (cdr w))) - (car w))) - (args (delq file-word (cdr words))) - (file (expand-file-name file-word)) - (filepart (file-name-nondirectory file)) - (buffer-name (concat "*gud-" filepart "*"))) - (setq gdb-first-time (not (get-buffer-process buffer-name)))) - - (gud-common-init command-line) - - (gud-def gud-break "break %f:%l" "\C-b" "Set breakpoint at current line.") - (gud-def gud-tbreak "tbreak %f:%l" "\C-t" "Set breakpoint at current line.") - (gud-def gud-remove "clear %l" "\C-d" "Remove breakpoint at current line") - (gud-def gud-kill "kill" nil "Kill the program.") - (gud-def gud-run "run" nil "Run the program.") - (gud-def gud-stepi "stepi %p" "\C-i" "Step one instruction with display.") - (gud-def gud-step "step %p" "\C-s" "Step one source line with display.") - (gud-def gud-next "next %p" "\C-n" "Step one line (skip functions).") - (gud-def gud-finish "finish" "\C-f" "Finish executing current function.") - (gud-def gud-cont "cont" "\C-r" "Continue with display.") - (gud-def gud-up "up %p" "<" "Up N stack frames (numeric arg).") - (gud-def gud-down "down %p" ">" "Down N stack frames (numeric arg).") - (gud-def gud-print "print %e" "\C-p" "Evaluate C expression at point.") - - (setq comint-prompt-regexp "^(.*gdb[+]?) *") - (setq comint-input-sender 'gdb-send) - (run-hooks 'gdb-mode-hook) - (let ((instance - (make-gdb-instance (get-buffer-process (current-buffer))) - )) - (if gdb-first-time (gdb-clear-inferior-io instance))) - ) - - -;; ====================================================================== -;; sdb functions - -;;; History of argument lists passed to sdb. -(defvar gud-sdb-history nil) - -(defvar gud-sdb-needs-tags (not (file-exists-p "/var")) - "If nil, we're on a System V Release 4 and don't need the tags hack.") - -(defvar gud-sdb-lastfile nil) - -(defun gud-sdb-massage-args (file args) - (cons file args)) - -(defun gud-sdb-marker-filter (string) - (cond - ;; System V Release 3.2 uses this format - ((string-match "\\(^0x\\w* in \\|^\\|\n\\)\\([^:\n]*\\):\\([0-9]*\\):.*\n" - string) - (setq gud-last-frame - (cons - (substring string (match-beginning 2) (match-end 2)) - (string-to-int - (substring string (match-beginning 3) (match-end 3)))))) - ;; System V Release 4.0 - ((string-match "^\\(BREAKPOINT\\|STEPPED\\) process [0-9]+ function [^ ]+ in \\(.+\\)\n" - string) - (setq gud-sdb-lastfile - (substring string (match-beginning 2) (match-end 2)))) - ((and gud-sdb-lastfile (string-match "^\\([0-9]+\\):" string)) - (setq gud-last-frame - (cons - gud-sdb-lastfile - (string-to-int - (substring string (match-beginning 1) (match-end 1)))))) - (t - (setq gud-sdb-lastfile nil))) - string) - -(defun gud-sdb-find-file (f) - (if gud-sdb-needs-tags - (find-tag-noselect f) - (find-file-noselect f))) - -;;;###autoload -(defun sdb (command-line) - "Run sdb on program FILE in buffer *gud-FILE*. -The directory containing FILE becomes the initial working directory -and source-file directory for your debugger." - (interactive - (list (read-from-minibuffer "Run sdb (like this): " - (if (consp gud-sdb-history) - (car gud-sdb-history) - "sdb ") - nil nil - '(gud-sdb-history . 1)))) - (if (and gud-sdb-needs-tags - (not (and (boundp 'tags-file-name) (file-exists-p tags-file-name)))) - (error "The sdb support requires a valid tags table to work.")) - (gud-overload-functions '((gud-massage-args . gud-sdb-massage-args) - (gud-marker-filter . gud-sdb-marker-filter) - (gud-find-file . gud-sdb-find-file) - )) - - (gud-common-init command-line) - - (gud-def gud-break "%l b" "\C-b" "Set breakpoint at current line.") - (gud-def gud-tbreak "%l c" "\C-t" "Set temporary breakpoint at current line.") - (gud-def gud-remove "%l d" "\C-d" "Remove breakpoint at current line") - (gud-def gud-step "s %p" "\C-s" "Step one source line with display.") - (gud-def gud-stepi "i %p" "\C-i" "Step one instruction with display.") - (gud-def gud-next "S %p" "\C-n" "Step one line (skip functions).") - (gud-def gud-cont "c" "\C-r" "Continue with display.") - (gud-def gud-print "%e/" "\C-p" "Evaluate C expression at point.") - - (setq comint-prompt-regexp "\\(^\\|\n\\)\\*") - (run-hooks 'sdb-mode-hook) - ) - -;; ====================================================================== -;; dbx functions - -;;; History of argument lists passed to dbx. -(defvar gud-dbx-history nil) - -(defun gud-dbx-massage-args (file args) - (cons file args)) - -(defun gud-dbx-marker-filter (string) - (if (or (string-match - "stopped in .* at line \\([0-9]*\\) in file \"\\([^\"]*\\)\"" - string) - (string-match - "signal .* in .* at line \\([0-9]*\\) in file \"\\([^\"]*\\)\"" - string)) - (setq gud-last-frame - (cons - (substring string (match-beginning 2) (match-end 2)) - (string-to-int - (substring string (match-beginning 1) (match-end 1)))))) - string) - -(defun gud-dbx-find-file (f) - (find-file-noselect f)) - -;;;###autoload -(defun dbx (command-line) - "Run dbx on program FILE in buffer *gud-FILE*. -The directory containing FILE becomes the initial working directory -and source-file directory for your debugger." - (interactive - (list (read-from-minibuffer "Run dbx (like this): " - (if (consp gud-dbx-history) - (car gud-dbx-history) - "dbx ") - nil nil - '(gud-dbx-history . 1)))) - (gud-overload-functions '((gud-massage-args . gud-dbx-massage-args) - (gud-marker-filter . gud-dbx-marker-filter) - (gud-find-file . gud-dbx-find-file) - )) - - (gud-common-init command-line) - - (gud-def gud-break "file \"%d%f\"\nstop at %l" - "\C-b" "Set breakpoint at current line.") -;; (gud-def gud-break "stop at \"%f\":%l" -;; "\C-b" "Set breakpoint at current line.") - (gud-def gud-remove "clear %l" "\C-d" "Remove breakpoint at current line") - (gud-def gud-step "step %p" "\C-s" "Step one line with display.") - (gud-def gud-stepi "stepi %p" "\C-i" "Step one instruction with display.") - (gud-def gud-next "next %p" "\C-n" "Step one line (skip functions).") - (gud-def gud-cont "cont" "\C-r" "Continue with display.") - (gud-def gud-up "up %p" "<" "Up (numeric arg) stack frames.") - (gud-def gud-down "down %p" ">" "Down (numeric arg) stack frames.") - (gud-def gud-print "print %e" "\C-p" "Evaluate C expression at point.") - - (setq comint-prompt-regexp "^[^)]*dbx) *") - (run-hooks 'dbx-mode-hook) - ) - -;; ====================================================================== -;; xdb (HP PARISC debugger) functions - -;;; History of argument lists passed to xdb. -(defvar gud-xdb-history nil) - -(defvar gud-xdb-directories nil - "*A list of directories that xdb should search for source code. -If nil, only source files in the program directory -will be known to xdb. - -The file names should be absolute, or relative to the directory -containing the executable being debugged.") - -(defun gud-xdb-massage-args (file args) - (nconc (let ((directories gud-xdb-directories) - (result nil)) - (while directories - (setq result (cons (car directories) (cons "-d" result))) - (setq directories (cdr directories))) - (nreverse (cons file result))) - args)) - -(defun gud-xdb-file-name (f) - "Transform a relative pathname to a full pathname in xdb mode" - (let ((result nil)) - (if (file-exists-p f) - (setq result (expand-file-name f)) - (let ((directories gud-xdb-directories)) - (while directories - (let ((path (concat (car directories) "/" f))) - (if (file-exists-p path) - (setq result (expand-file-name path) - directories nil))) - (setq directories (cdr directories))))) - result)) - -;; xdb does not print the lines all at once, so we have to accumulate them -(defvar gud-xdb-accumulation "") - -(defun gud-xdb-marker-filter (string) - (let (result) - (if (or (string-match comint-prompt-regexp string) - (string-match ".*\012" string)) - (setq result (concat gud-xdb-accumulation string) - gud-xdb-accumulation "") - (setq gud-xdb-accumulation (concat gud-xdb-accumulation string))) - (if result - (if (or (string-match "\\([^\n \t:]+\\): [^:]+: \\([0-9]+\\):" result) - (string-match "[^: \t]+:[ \t]+\\([^:]+\\): [^:]+: \\([0-9]+\\):" - result)) - (let ((line (string-to-int - (substring result (match-beginning 2) (match-end 2)))) - (file (gud-xdb-file-name - (substring result (match-beginning 1) (match-end 1))))) - (if file - (setq gud-last-frame (cons file line)))))) - (or result ""))) - -(defun gud-xdb-find-file (f) - (let ((realf (gud-xdb-file-name f))) - (if realf (find-file-noselect realf)))) - -;;;###autoload -(defun xdb (command-line) - "Run xdb on program FILE in buffer *gud-FILE*. -The directory containing FILE becomes the initial working directory -and source-file directory for your debugger. - -You can set the variable 'gud-xdb-directories' to a list of program source -directories if your program contains sources from more than one directory." - (interactive - (list (read-from-minibuffer "Run xdb (like this): " - (if (consp gud-xdb-history) - (car gud-xdb-history) - "xdb ") - nil nil - '(gud-xdb-history . 1)))) - (gud-overload-functions '((gud-massage-args . gud-xdb-massage-args) - (gud-marker-filter . gud-xdb-marker-filter) - (gud-find-file . gud-xdb-find-file))) - - (gud-common-init command-line) - - (gud-def gud-break "b %f:%l" "\C-b" "Set breakpoint at current line.") - (gud-def gud-tbreak "b %f:%l\\t" "\C-t" - "Set temporary breakpoint at current line.") - (gud-def gud-remove "db" "\C-d" "Remove breakpoint at current line") - (gud-def gud-step "s %p" "\C-s" "Step one line with display.") - (gud-def gud-next "S %p" "\C-n" "Step one line (skip functions).") - (gud-def gud-cont "c" "\C-r" "Continue with display.") - (gud-def gud-up "up %p" "<" "Up (numeric arg) stack frames.") - (gud-def gud-down "down %p" ">" "Down (numeric arg) stack frames.") - (gud-def gud-finish "bu\\t" "\C-f" "Finish executing current function.") - (gud-def gud-print "p %e" "\C-p" "Evaluate C expression at point.") - - (setq comint-prompt-regexp "^>") - (make-local-variable 'gud-xdb-accumulation) - (setq gud-xdb-accumulation "") - (run-hooks 'xdb-mode-hook)) - -;; ====================================================================== -;; perldb functions - -;;; History of argument lists passed to perldb. -(defvar gud-perldb-history nil) - -(defun gud-perldb-massage-args (file args) - (cons "-d" (cons file (cons "-emacs" args)))) - -;; There's no guarantee that Emacs will hand the filter the entire -;; marker at once; it could be broken up across several strings. We -;; might even receive a big chunk with several markers in it. If we -;; receive a chunk of text which looks like it might contain the -;; beginning of a marker, we save it here between calls to the -;; filter. -(defvar gud-perldb-marker-acc "") - -(defun gud-perldb-marker-filter (string) - (save-match-data - (setq gud-perldb-marker-acc (concat gud-perldb-marker-acc string)) - (let ((output "")) - - ;; Process all the complete markers in this chunk. - (while (string-match "^\032\032\\([^:\n]*\\):\\([0-9]*\\):.*\n" - gud-perldb-marker-acc) - (setq - - ;; Extract the frame position from the marker. - gud-last-frame - (cons (substring gud-perldb-marker-acc (match-beginning 1) (match-end 1)) - (string-to-int (substring gud-perldb-marker-acc - (match-beginning 2) - (match-end 2)))) - - ;; Append any text before the marker to the output we're going - ;; to return - we don't include the marker in this text. - output (concat output - (substring gud-perldb-marker-acc 0 (match-beginning 0))) - - ;; Set the accumulator to the remaining text. - gud-perldb-marker-acc (substring gud-perldb-marker-acc (match-end 0)))) - - ;; Does the remaining text look like it might end with the - ;; beginning of another marker? If it does, then keep it in - ;; gud-perldb-marker-acc until we receive the rest of it. Since we - ;; know the full marker regexp above failed, it's pretty simple to - ;; test for marker starts. - (if (string-match "^\032.*\\'" gud-perldb-marker-acc) - (progn - ;; Everything before the potential marker start can be output. - (setq output (concat output (substring gud-perldb-marker-acc - 0 (match-beginning 0)))) - - ;; Everything after, we save, to combine with later input. - (setq gud-perldb-marker-acc - (substring gud-perldb-marker-acc (match-beginning 0)))) - - (setq output (concat output gud-perldb-marker-acc) - gud-perldb-marker-acc "")) - - output))) - -(defun gud-perldb-find-file (f) - (find-file-noselect f)) - -;;;###autoload -(defun perldb (command-line) - "Run perldb on program FILE in buffer *gud-FILE*. -The directory containing FILE becomes the initial working directory -and source-file directory for your debugger." - (interactive - (list (read-from-minibuffer "Run perldb (like this): " - (if (consp gud-perldb-history) - (car gud-perldb-history) - "perl ") - nil nil - '(gud-perldb-history . 1)))) - (gud-overload-functions '((gud-massage-args . gud-perldb-massage-args) - (gud-marker-filter . gud-perldb-marker-filter) - (gud-find-file . gud-perldb-find-file) - )) - - (gud-common-init command-line) - - (gud-def gud-break "b %l" "\C-b" "Set breakpoint at current line.") - (gud-def gud-remove "d %l" "\C-d" "Remove breakpoint at current line") - (gud-def gud-step "s" "\C-s" "Step one source line with display.") - (gud-def gud-next "n" "\C-n" "Step one line (skip functions).") - (gud-def gud-cont "c" "\C-r" "Continue with display.") -; (gud-def gud-finish "finish" "\C-f" "Finish executing current function.") -; (gud-def gud-up "up %p" "<" "Up N stack frames (numeric arg).") -; (gud-def gud-down "down %p" ">" "Down N stack frames (numeric arg).") - (gud-def gud-print "%e" "\C-p" "Evaluate perl expression at point.") - - (setq comint-prompt-regexp "^ DB<[0-9]+> ") - (run-hooks 'perldb-mode-hook) - ) - -;; -;; End of debugger-specific information -;; - - -;;; When we send a command to the debugger via gud-call, it's annoying -;;; to see the command and the new prompt inserted into the debugger's -;;; buffer; we have other ways of knowing the command has completed. -;;; -;;; If the buffer looks like this: -;;; -------------------- -;;; (gdb) set args foo bar -;;; (gdb) -!- -;;; -------------------- -;;; (the -!- marks the location of point), and we type `C-x SPC' in a -;;; source file to set a breakpoint, we want the buffer to end up like -;;; this: -;;; -------------------- -;;; (gdb) set args foo bar -;;; Breakpoint 1 at 0x92: file make-docfile.c, line 49. -;;; (gdb) -!- -;;; -------------------- -;;; Essentially, the old prompt is deleted, and the command's output -;;; and the new prompt take its place. -;;; -;;; Not echoing the command is easy enough; you send it directly using -;;; comint-input-sender, and it never enters the buffer. However, -;;; getting rid of the old prompt is trickier; you don't want to do it -;;; when you send the command, since that will result in an annoying -;;; flicker as the prompt is deleted, redisplay occurs while Emacs -;;; waits for a response from the debugger, and the new prompt is -;;; inserted. Instead, we'll wait until we actually get some output -;;; from the subprocess before we delete the prompt. If the command -;;; produced no output other than a new prompt, that prompt will most -;;; likely be in the first chunk of output received, so we will delete -;;; the prompt and then replace it with an identical one. If the -;;; command produces output, the prompt is moving anyway, so the -;;; flicker won't be annoying. -;;; -;;; So - when we want to delete the prompt upon receipt of the next -;;; chunk of debugger output, we position gud-delete-prompt-marker at -;;; the start of the prompt; the process filter will notice this, and -;;; delete all text between it and the process output marker. If -;;; gud-delete-prompt-marker points nowhere, we leave the current -;;; prompt alone. -(defvar gud-delete-prompt-marker nil) - - -(defvar gdbish-comint-mode-map (copy-keymap comint-mode-map)) -(define-key gdbish-comint-mode-map "\C-c\M-\C-r" 'gud-display-registers-buffer) -(define-key gdbish-comint-mode-map "\C-c\M-\C-f" 'gud-display-stack-buffer) -(define-key gdbish-comint-mode-map "\C-c\M-\C-b" 'gud-display-breakpoints-buffer) - -(make-windows-menu gdbish-comint-mode-map) -(make-frames-menu gdbish-comint-mode-map) - -(defun gud-mode () - "Major mode for interacting with an inferior debugger process. - - You start it up with one of the commands M-x gdb, M-x sdb, M-x dbx, -or M-x xdb. Each entry point finishes by executing a hook; `gdb-mode-hook', -`sdb-mode-hook', `dbx-mode-hook' or `xdb-mode-hook' respectively. - -After startup, the following commands are available in both the GUD -interaction buffer and any source buffer GUD visits due to a breakpoint stop -or step operation: - -\\[gud-break] sets a breakpoint at the current file and line. In the -GUD buffer, the current file and line are those of the last breakpoint or -step. In a source buffer, they are the buffer's file and current line. - -\\[gud-remove] removes breakpoints on the current file and line. - -\\[gud-refresh] displays in the source window the last line referred to -in the gud buffer. - -\\[gud-step], \\[gud-next], and \\[gud-stepi] do a step-one-line, -step-one-line (not entering function calls), and step-one-instruction -and then update the source window with the current file and position. -\\[gud-cont] continues execution. - -\\[gud-print] tries to find the largest C lvalue or function-call expression -around point, and sends it to the debugger for value display. - -The above commands are common to all supported debuggers except xdb which -does not support stepping instructions. - -Under gdb, sdb and xdb, \\[gud-tbreak] behaves exactly like \\[gud-break], -except that the breakpoint is temporary; that is, it is removed when -execution stops on it. - -Under gdb, dbx, and xdb, \\[gud-up] pops up through an enclosing stack -frame. \\[gud-down] drops back down through one. - -If you are using gdb or xdb, \\[gud-finish] runs execution to the return from -the current function and stops. - -All the keystrokes above are accessible in the GUD buffer -with the prefix C-c, and in all buffers through the prefix C-x C-a. - -All pre-defined functions for which the concept make sense repeat -themselves the appropriate number of times if you give a prefix -argument. - -You may use the `gud-def' macro in the initialization hook to define other -commands. - -Other commands for interacting with the debugger process are inherited from -comint mode, which see." - (interactive) - (comint-mode) - (setq major-mode 'gud-mode) - (setq mode-name "Debugger") - (setq mode-line-process '(": %s")) - (use-local-map (copy-keymap gdbish-comint-mode-map)) - (setq gud-last-frame nil) - (make-local-variable 'comint-prompt-regexp) - (make-local-variable 'gud-delete-prompt-marker) - (setq gud-delete-prompt-marker (make-marker)) - (run-hooks 'gud-mode-hook) -) - -(defvar gud-comint-buffer nil) - -;; Chop STRING into words separated by SPC or TAB and return a list of them. -(defun gud-chop-words (string) - (let ((i 0) (beg 0) - (len (length string)) - (words nil)) - (while (< i len) - (if (memq (aref string i) '(?\t ? )) - (progn - (setq words (cons (substring string beg i) words) - beg (1+ i)) - (while (and (< beg len) (memq (aref string beg) '(?\t ? ))) - (setq beg (1+ beg))) - (setq i (1+ beg))) - (setq i (1+ i)))) - (if (< beg len) - (setq words (cons (substring string beg) words))) - (nreverse words))) - -(defvar gud-target-name "--unknown--" - "The apparent name of the program being debugged in a gud buffer. -For sure this the root string used in smashing together the gud -buffer's name, even if that doesn't happen to be the name of a -program.") - -;; Perform initializations common to all debuggers. -(defun gud-common-init (command-line) - (let* ((words (gud-chop-words command-line)) - (program (car words)) - (file-word (let ((w (cdr words))) - (while (and w (= ?- (aref (car w) 0))) - (setq w (cdr w))) - (car w))) - (args (delq file-word (cdr words))) - (file (expand-file-name file-word)) - (filepart (file-name-nondirectory file)) - (buffer-name (concat "*gud-" filepart "*"))) - (switch-to-buffer buffer-name) - (setq default-directory (file-name-directory file)) - (or (bolp) (newline)) - (insert "Current directory is " default-directory "\n") - (let ((old-instance gdb-buffer-instance)) - (apply 'make-comint (concat "gud-" filepart) program nil - (gud-massage-args file args)) - (gud-mode) - (make-variable-buffer-local 'old-gdb-buffer-instance) - (setq old-gdb-buffer-instance old-instance)) - (make-variable-buffer-local 'gud-target-name) - (setq gud-target-name filepart)) - (set-process-filter (get-buffer-process (current-buffer)) 'gud-filter) - (set-process-sentinel (get-buffer-process (current-buffer)) 'gud-sentinel) - (gud-set-buffer) - ) - -(defun gud-set-buffer () - (cond ((eq major-mode 'gud-mode) - (setq gud-comint-buffer (current-buffer))))) - -;; These functions are responsible for inserting output from your debugger -;; into the buffer. The hard work is done by the method that is -;; the value of gud-marker-filter. - -(defun gud-filter (proc string) - ;; Here's where the actual buffer insertion is done - (let ((inhibit-quit t)) - (save-excursion - (set-buffer (process-buffer proc)) - (let (moving output-after-point) - (save-excursion - (goto-char (process-mark proc)) - ;; If we have been so requested, delete the debugger prompt. - (if (marker-buffer gud-delete-prompt-marker) - (progn - (delete-region (point) gud-delete-prompt-marker) - (set-marker gud-delete-prompt-marker nil))) - (insert-before-markers (gud-marker-filter string)) - (setq moving (= (point) (process-mark proc))) - (setq output-after-point (< (point) (process-mark proc))) - ;; Check for a filename-and-line number. - ;; Don't display the specified file - ;; unless (1) point is at or after the position where output appears - ;; and (2) this buffer is on the screen. - (if (and gud-last-frame - (not output-after-point) - (get-buffer-window (current-buffer))) - (gud-display-frame))) - (if moving (goto-char (process-mark proc))))))) - -(defun gud-proc-died (proc) - ;; Stop displaying an arrow in a source file. - (setq overlay-arrow-position nil) - - ;; Kill the dummy process, so that C-x C-c won't worry about it. - (save-excursion - (set-buffer (process-buffer proc)) - (kill-process - (get-buffer-process - (gdb-get-instance-buffer gdb-buffer-instance 'gdb-inferior-io)))) - ) - -(defun gud-sentinel (proc msg) - (cond ((null (buffer-name (process-buffer proc))) - ;; buffer killed - (gud-proc-died proc) - (set-process-buffer proc nil)) - ((memq (process-status proc) '(signal exit)) - (gud-proc-died proc) - - ;; Fix the mode line. - (setq mode-line-process - (concat ": " - (symbol-name (process-status proc)))) - (let* ((obuf (current-buffer))) - ;; save-excursion isn't the right thing if - ;; process-buffer is current-buffer - (unwind-protect - (progn - ;; Write something in *compilation* and hack its mode line, - (set-buffer (process-buffer proc)) - ;; Force mode line redisplay soon - (set-buffer-modified-p (buffer-modified-p)) - (if (eobp) - (insert ?\n mode-name " " msg) - (save-excursion - (goto-char (point-max)) - (insert ?\n mode-name " " msg))) - ;; If buffer and mode line will show that the process - ;; is dead, we can delete it now. Otherwise it - ;; will stay around until M-x list-processes. - (delete-process proc)) - ;; Restore old buffer, but don't restore old point - ;; if obuf is the gud buffer. - (set-buffer obuf)))))) - -(defun gud-display-frame () - "Find and obey the last filename-and-line marker from the debugger. -Obeying it means displaying in another window the specified file and line." - (interactive) - (if gud-last-frame - (progn -; (gud-set-buffer) - (gud-display-line (car gud-last-frame) (cdr gud-last-frame)) - (setq gud-last-last-frame gud-last-frame - gud-last-frame nil)))) - -;; Make sure the file named TRUE-FILE is in a buffer that appears on the screen -;; and that its line LINE is visible. -;; Put the overlay-arrow on the line LINE in that buffer. -;; Most of the trickiness in here comes from wanting to preserve the current -;; region-restriction if that's possible. We use an explicit display-buffer -;; to get around the fact that this is called inside a save-excursion. - -(defun gud-display-line (true-file line) - (let* ((buffer (gud-find-file true-file)) - (window (gud-display-source-buffer buffer)) - (pos)) - (if (not window) - (error "foo bar baz")) -;;; (if (equal buffer (current-buffer)) -;;; nil -;;; (setq buffer-read-only nil)) - (save-excursion -;;; (setq buffer-read-only t) - (set-buffer buffer) - (save-restriction - (widen) - (goto-line line) - (setq pos (point)) - (setq overlay-arrow-string "=>") - (or overlay-arrow-position - (setq overlay-arrow-position (make-marker))) - (set-marker overlay-arrow-position (point) (current-buffer))) - (cond ((or (< pos (point-min)) (> pos (point-max))) - (widen) - (goto-char pos)))) - (set-window-point window overlay-arrow-position))) - -;;; The gud-call function must do the right thing whether its invoking -;;; keystroke is from the GUD buffer itself (via major-mode binding) -;;; or a C buffer. In the former case, we want to supply data from -;;; gud-last-frame. Here's how we do it: - -(defun gud-format-command (str arg) - (let ((insource (not (eq (current-buffer) gud-comint-buffer)))) - (if (string-match "\\(.*\\)%f\\(.*\\)" str) - (setq str (concat - (substring str (match-beginning 1) (match-end 1)) - (file-name-nondirectory (if insource - (buffer-file-name) - (car gud-last-frame))) - (substring str (match-beginning 2) (match-end 2))))) - (if (string-match "\\(.*\\)%d\\(.*\\)" str) - (setq str (concat - (substring str (match-beginning 1) (match-end 1)) - (file-name-directory (if insource - (buffer-file-name) - (car gud-last-frame))) - (substring str (match-beginning 2) (match-end 2))))) - (if (string-match "\\(.*\\)%l\\(.*\\)" str) - (setq str (concat - (substring str (match-beginning 1) (match-end 1)) - (if insource - (save-excursion - (beginning-of-line) - (save-restriction (widen) - (1+ (count-lines 1 (point))))) - (cdr gud-last-frame)) - (substring str (match-beginning 2) (match-end 2))))) - (if (string-match "\\(.*\\)%e\\(.*\\)" str) - (setq str (concat - (substring str (match-beginning 1) (match-end 1)) - (find-c-expr) - (substring str (match-beginning 2) (match-end 2))))) - (if (string-match "\\(.*\\)%a\\(.*\\)" str) - (setq str (concat - (substring str (match-beginning 1) (match-end 1)) - (gud-read-address) - (substring str (match-beginning 2) (match-end 2))))) - (if (string-match "\\(.*\\)%p\\(.*\\)" str) - (setq str (concat - (substring str (match-beginning 1) (match-end 1)) - (if arg (int-to-string arg) "") - (substring str (match-beginning 2) (match-end 2))))) - ) - str - ) - -(defun gud-read-address () - "Return a string containing the core-address found in the buffer at point." - (save-excursion - (let ((pt (point)) found begin) - (setq found (if (search-backward "0x" (- pt 7) t) (point))) - (cond - (found (forward-char 2) - (buffer-substring found - (progn (re-search-forward "[^0-9a-f]") - (forward-char -1) - (point)))) - (t (setq begin (progn (re-search-backward "[^0-9]") - (forward-char 1) - (point))) - (forward-char 1) - (re-search-forward "[^0-9]") - (forward-char -1) - (buffer-substring begin (point))))))) - -(defun gud-call (fmt &optional arg) - (let ((msg (gud-format-command fmt arg))) - (message "Command: %s" msg) - (sit-for 0) - (gud-basic-call msg))) - -(defun gud-basic-call (command) - "Invoke the debugger COMMAND displaying source in other window." - (interactive) - (gud-set-buffer) - (let ((proc (get-buffer-process gud-comint-buffer))) - - ;; Arrange for the current prompt to get deleted. - (save-excursion - (set-buffer gud-comint-buffer) - (goto-char (process-mark proc)) - (beginning-of-line) - (if (looking-at comint-prompt-regexp) - (set-marker gud-delete-prompt-marker (point))) - (apply comint-input-sender (list proc command))))) - -(defun gud-refresh (&optional arg) - "Fix up a possibly garbled display, and redraw the arrow." - (interactive "P") - (recenter arg) - (or gud-last-frame (setq gud-last-frame gud-last-last-frame)) - (gud-display-frame)) - -;;; Code for parsing expressions out of C code. The single entry point is -;;; find-c-expr, which tries to return an lvalue expression from around point. -;;; -;;; The rest of this file is a hacked version of gdbsrc.el by -;;; Debby Ayers <ayers@asc.slb.com>, -;;; Rich Schaefer <schaefer@asc.slb.com> Schlumberger, Austin, Tx. - -(defun find-c-expr () - "Returns the C expr that surrounds point." - (interactive) - (save-excursion - (let ((p) (expr) (test-expr)) - (setq p (point)) - (setq expr (expr-cur)) - (setq test-expr (expr-prev)) - (while (expr-compound test-expr expr) - (setq expr (cons (car test-expr) (cdr expr))) - (goto-char (car expr)) - (setq test-expr (expr-prev))) - (goto-char p) - (setq test-expr (expr-next)) - (while (expr-compound expr test-expr) - (setq expr (cons (car expr) (cdr test-expr))) - (setq test-expr (expr-next)) - ) - (buffer-substring (car expr) (cdr expr))))) - -(defun expr-cur () - "Returns the expr that point is in; point is set to beginning of expr. -The expr is represented as a cons cell, where the car specifies the point in -the current buffer that marks the beginning of the expr and the cdr specifies -the character after the end of the expr." - (let ((p (point)) (begin) (end)) - (expr-backward-sexp) - (setq begin (point)) - (expr-forward-sexp) - (setq end (point)) - (if (>= p end) - (progn - (setq begin p) - (goto-char p) - (expr-forward-sexp) - (setq end (point)) - ) - ) - (goto-char begin) - (cons begin end))) - -(defun expr-backward-sexp () - "Version of `backward-sexp' that catches errors." - (condition-case nil - (backward-sexp) - (error t))) - -(defun expr-forward-sexp () - "Version of `forward-sexp' that catches errors." - (condition-case nil - (forward-sexp) - (error t))) - -(defun expr-prev () - "Returns the previous expr, point is set to beginning of that expr. -The expr is represented as a cons cell, where the car specifies the point in -the current buffer that marks the beginning of the expr and the cdr specifies -the character after the end of the expr" - (let ((begin) (end)) - (expr-backward-sexp) - (setq begin (point)) - (expr-forward-sexp) - (setq end (point)) - (goto-char begin) - (cons begin end))) - -(defun expr-next () - "Returns the following expr, point is set to beginning of that expr. -The expr is represented as a cons cell, where the car specifies the point in -the current buffer that marks the beginning of the expr and the cdr specifies -the character after the end of the expr." - (let ((begin) (end)) - (expr-forward-sexp) - (expr-forward-sexp) - (setq end (point)) - (expr-backward-sexp) - (setq begin (point)) - (cons begin end))) - -(defun expr-compound-sep (span-start span-end) - "Returns '.' for '->' & '.', returns ' ' for white space, -returns '?' for other punctuation." - (let ((result ? ) - (syntax)) - (while (< span-start span-end) - (setq syntax (char-syntax (char-after span-start))) - (cond - ((= syntax ? ) t) - ((= syntax ?.) (setq syntax (char-after span-start)) - (cond - ((= syntax ?.) (setq result ?.)) - ((and (= syntax ?-) (= (char-after (+ span-start 1)) ?>)) - (setq result ?.) - (setq span-start (+ span-start 1))) - (t (setq span-start span-end) - (setq result ??))))) - (setq span-start (+ span-start 1))) - result)) - -(defun expr-compound (first second) - "Non-nil if concatenating FIRST and SECOND makes a single C token. -The two exprs are represented as a cons cells, where the car -specifies the point in the current buffer that marks the beginning of the -expr and the cdr specifies the character after the end of the expr. -Link exprs of the form: - Expr -> Expr - Expr . Expr - Expr (Expr) - Expr [Expr] - (Expr) Expr - [Expr] Expr" - (let ((span-start (cdr first)) - (span-end (car second)) - (syntax)) - (setq syntax (expr-compound-sep span-start span-end)) - (cond - ((= (car first) (car second)) nil) - ((= (cdr first) (cdr second)) nil) - ((= syntax ?.) t) - ((= syntax ? ) - (setq span-start (char-after (- span-start 1))) - (setq span-end (char-after span-end)) - (cond - ((= span-start ?) ) t ) - ((= span-start ?] ) t ) - ((= span-end ?( ) t ) - ((= span-end ?[ ) t ) - (t nil)) - ) - (t nil)))) - -(provide 'gud) - -;;; gud.el ends here diff --git a/contrib/gdb/gdb/gdbserver/low-linux.c b/contrib/gdb/gdb/gdbserver/low-linux.c deleted file mode 100644 index 106021057a3c7..0000000000000 --- a/contrib/gdb/gdb/gdbserver/low-linux.c +++ /dev/null @@ -1,451 +0,0 @@ -/* Low level interface to ptrace, for the remote server for GDB. - Copyright (C) 1995, 1996 Free Software Foundation, Inc. - -This file is part of GDB. - -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 2 of the License, 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ - -#include "defs.h" -#include <sys/wait.h> -#include "frame.h" -#include "inferior.h" - -#include <stdio.h> -#include <sys/param.h> -#include <sys/dir.h> -#include <sys/user.h> -#include <signal.h> -#include <sys/ioctl.h> -#if 0 -#include <sgtty.h> -#endif -#include <fcntl.h> - -/***************Begin MY defs*********************/ -int quit_flag = 0; -char registers[REGISTER_BYTES]; - -/* Index within `registers' of the first byte of the space for - register N. */ - - -char buf2[MAX_REGISTER_RAW_SIZE]; -/***************End MY defs*********************/ - -#include <sys/ptrace.h> - -#if __GLIBC__ > 2 || (__GLIBC__ == 2 && __GLIBC_MINOR__ >= 1) -#include <sys/reg.h> -#endif - -extern char **environ; -extern int errno; -extern int inferior_pid; -void quit (), perror_with_name (); -int query (); - -/* Start an inferior process and returns its pid. - ALLARGS is a vector of program-name and args. - ENV is the environment vector to pass. */ - -int -create_inferior (program, allargs) - char *program; - char **allargs; -{ - int pid; - - pid = fork (); - if (pid < 0) - perror_with_name ("fork"); - - if (pid == 0) - { - ptrace (PTRACE_TRACEME, 0, 0, 0); - - execv (program, allargs); - - fprintf (stderr, "Cannot exec %s: %s.\n", program, - errno < sys_nerr ? sys_errlist[errno] : "unknown error"); - fflush (stderr); - _exit (0177); - } - - return pid; -} - -/* Kill the inferior process. Make us have no inferior. */ - -void -kill_inferior () -{ - if (inferior_pid == 0) - return; - ptrace (PTRACE_KILL, inferior_pid, 0, 0); - wait (0); - /*************inferior_died ();****VK**************/ -} - -/* Return nonzero if the given thread is still alive. */ -int -mythread_alive (pid) - int pid; -{ - return 1; -} - -/* Wait for process, returns status */ - -unsigned char -mywait (status) - char *status; -{ - int pid; - union wait w; - - pid = wait (&w); - if (pid != inferior_pid) - perror_with_name ("wait"); - - if (WIFEXITED (w)) - { - fprintf (stderr, "\nChild exited with retcode = %x \n", WEXITSTATUS (w)); - *status = 'W'; - return ((unsigned char) WEXITSTATUS (w)); - } - else if (!WIFSTOPPED (w)) - { - fprintf (stderr, "\nChild terminated with signal = %x \n", WTERMSIG (w)); - *status = 'X'; - return ((unsigned char) WTERMSIG (w)); - } - - fetch_inferior_registers (0); - - *status = 'T'; - return ((unsigned char) WSTOPSIG (w)); -} - -/* Resume execution of the inferior process. - If STEP is nonzero, single-step it. - If SIGNAL is nonzero, give it that signal. */ - -void -myresume (step, signal) - int step; - int signal; -{ - errno = 0; - ptrace (step ? PTRACE_SINGLESTEP : PTRACE_CONT, inferior_pid, 1, signal); - if (errno) - perror_with_name ("ptrace"); -} - - -#if !defined (offsetof) -#define offsetof(TYPE, MEMBER) ((unsigned long) &((TYPE *)0)->MEMBER) -#endif - -/* U_REGS_OFFSET is the offset of the registers within the u area. */ -#if !defined (U_REGS_OFFSET) -#define U_REGS_OFFSET \ - ptrace (PT_READ_U, inferior_pid, \ - (PTRACE_ARG3_TYPE) (offsetof (struct user, u_ar0)), 0) \ - - KERNEL_U_ADDR -#endif - -#ifndef TARGET_M68K -/* this table must line up with REGISTER_NAMES in tm-i386v.h */ -/* symbols like 'EAX' come from <sys/reg.h> */ -static int regmap[] = -{ - EAX, ECX, EDX, EBX, - UESP, EBP, ESI, EDI, - EIP, EFL, CS, SS, - DS, ES, FS, GS, -}; - -int -i386_register_u_addr (blockend, regnum) - int blockend; - int regnum; -{ -#if 0 - /* this will be needed if fp registers are reinstated */ - /* for now, you can look at them with 'info float' - * sys5 wont let you change them with ptrace anyway - */ - if (regnum >= FP0_REGNUM && regnum <= FP7_REGNUM) - { - int ubase, fpstate; - struct user u; - ubase = blockend + 4 * (SS + 1) - KSTKSZ; - fpstate = ubase + ((char *)&u.u_fpstate - (char *)&u); - return (fpstate + 0x1c + 10 * (regnum - FP0_REGNUM)); - } - else -#endif - return (blockend + 4 * regmap[regnum]); - -} -#else /* TARGET_M68K */ -/* This table must line up with REGISTER_NAMES in tm-m68k.h */ -static int regmap[] = -{ -#ifdef PT_D0 - PT_D0, PT_D1, PT_D2, PT_D3, PT_D4, PT_D5, PT_D6, PT_D7, - PT_A0, PT_A1, PT_A2, PT_A3, PT_A4, PT_A5, PT_A6, PT_USP, - PT_SR, PT_PC, -#else - 14, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 15, - 17, 18, -#endif -#ifdef PT_FP0 - PT_FP0, PT_FP1, PT_FP2, PT_FP3, PT_FP4, PT_FP5, PT_FP6, PT_FP7, - PT_FPCR, PT_FPSR, PT_FPIAR -#else - 21, 24, 27, 30, 33, 36, 39, 42, 45, 46, 47 -#endif -}; - -/* BLOCKEND is the value of u.u_ar0, and points to the place where GS - is stored. */ - -int -m68k_linux_register_u_addr (blockend, regnum) - int blockend; - int regnum; -{ - return (blockend + 4 * regmap[regnum]); -} -#endif - -CORE_ADDR -register_addr (regno, blockend) - int regno; - CORE_ADDR blockend; -{ - CORE_ADDR addr; - - if (regno < 0 || regno >= ARCH_NUM_REGS) - error ("Invalid register number %d.", regno); - - REGISTER_U_ADDR (addr, blockend, regno); - - return addr; -} - -/* Fetch one register. */ - -static void -fetch_register (regno) - int regno; -{ - register unsigned int regaddr; - register int i; - - /* Offset of registers within the u area. */ - unsigned int offset; - - offset = U_REGS_OFFSET; - - regaddr = register_addr (regno, offset); - for (i = 0; i < REGISTER_RAW_SIZE (regno); i += sizeof (int)) - { - errno = 0; - *(int *) ®isters[ regno * 4 + i] = ptrace (PTRACE_PEEKUSR, inferior_pid, - (PTRACE_ARG3_TYPE) regaddr, 0); - regaddr += sizeof (int); - if (errno != 0) - { - /* Warning, not error, in case we are attached; sometimes the - kernel doesn't let us at the registers. */ - char *err = strerror (errno); - char *msg = alloca (strlen (err) + 128); - sprintf (msg, "reading register %d: %s", regno, err); - error (msg); - goto error_exit; - } - } - error_exit:; -} - -/* Fetch all registers, or just one, from the child process. */ - -void -fetch_inferior_registers (regno) - int regno; -{ - if (regno == -1 || regno == 0) - for (regno = 0; regno < NUM_REGS-NUM_FREGS; regno++) - fetch_register (regno); - else - fetch_register (regno); -} - -/* Store our register values back into the inferior. - If REGNO is -1, do this for all registers. - Otherwise, REGNO specifies which register (so we can save time). */ - -void -store_inferior_registers (regno) - int regno; -{ - register unsigned int regaddr; - register int i; - unsigned int offset = U_REGS_OFFSET; - - if (regno >= 0) - { -#if 0 - if (CANNOT_STORE_REGISTER (regno)) - return; -#endif - regaddr = register_addr (regno, offset); - errno = 0; -#if 0 - if (regno == PCOQ_HEAD_REGNUM || regno == PCOQ_TAIL_REGNUM) - { - scratch = *(int *) ®isters[REGISTER_BYTE (regno)] | 0x3; - ptrace (PT_WUREGS, inferior_pid, (PTRACE_ARG3_TYPE) regaddr, - scratch, 0); - if (errno != 0) - { - /* Error, even if attached. Failing to write these two - registers is pretty serious. */ - sprintf (buf, "writing register number %d", regno); - perror_with_name (buf); - } - } - else -#endif - for (i = 0; i < REGISTER_RAW_SIZE (regno); i += sizeof(int)) - { - errno = 0; - ptrace (PTRACE_POKEUSR, inferior_pid, (PTRACE_ARG3_TYPE) regaddr, - *(int *) ®isters[REGISTER_BYTE (regno) + i]); - if (errno != 0) - { - /* Warning, not error, in case we are attached; sometimes the - kernel doesn't let us at the registers. */ - char *err = strerror (errno); - char *msg = alloca (strlen (err) + 128); - sprintf (msg, "writing register %d: %s", - regno, err); - error (msg); - return; - } - regaddr += sizeof(int); - } - } - else - for (regno = 0; regno < NUM_REGS-NUM_FREGS; regno++) - store_inferior_registers (regno); -} - -/* NOTE! I tried using PTRACE_READDATA, etc., to read and write memory - in the NEW_SUN_PTRACE case. - It ought to be straightforward. But it appears that writing did - not write the data that I specified. I cannot understand where - it got the data that it actually did write. */ - -/* Copy LEN bytes from inferior's memory starting at MEMADDR - to debugger memory starting at MYADDR. */ - -void -read_inferior_memory (memaddr, myaddr, len) - CORE_ADDR memaddr; - char *myaddr; - int len; -{ - register int i; - /* Round starting address down to longword boundary. */ - register CORE_ADDR addr = memaddr & -sizeof (int); - /* Round ending address up; get number of longwords that makes. */ - register int count - = (((memaddr + len) - addr) + sizeof (int) - 1) / sizeof (int); - /* Allocate buffer of that many longwords. */ - register int *buffer = (int *) alloca (count * sizeof (int)); - - /* Read all the longwords */ - for (i = 0; i < count; i++, addr += sizeof (int)) - { - buffer[i] = ptrace (PTRACE_PEEKTEXT, inferior_pid, addr, 0); - } - - /* Copy appropriate bytes out of the buffer. */ - memcpy (myaddr, (char *) buffer + (memaddr & (sizeof (int) - 1)), len); -} - -/* Copy LEN bytes of data from debugger memory at MYADDR - to inferior's memory at MEMADDR. - On failure (cannot write the inferior) - returns the value of errno. */ - -int -write_inferior_memory (memaddr, myaddr, len) - CORE_ADDR memaddr; - char *myaddr; - int len; -{ - register int i; - /* Round starting address down to longword boundary. */ - register CORE_ADDR addr = memaddr & -sizeof (int); - /* Round ending address up; get number of longwords that makes. */ - register int count - = (((memaddr + len) - addr) + sizeof (int) - 1) / sizeof (int); - /* Allocate buffer of that many longwords. */ - register int *buffer = (int *) alloca (count * sizeof (int)); - extern int errno; - - /* Fill start and end extra bytes of buffer with existing memory data. */ - - buffer[0] = ptrace (PTRACE_PEEKTEXT, inferior_pid, addr, 0); - - if (count > 1) - { - buffer[count - 1] - = ptrace (PTRACE_PEEKTEXT, inferior_pid, - addr + (count - 1) * sizeof (int), 0); - } - - /* Copy data to be written over corresponding part of buffer */ - - memcpy ((char *) buffer + (memaddr & (sizeof (int) - 1)), myaddr, len); - - /* Write the entire buffer. */ - - for (i = 0; i < count; i++, addr += sizeof (int)) - { - errno = 0; - ptrace (PTRACE_POKETEXT, inferior_pid, addr, buffer[i]); - if (errno) - return errno; - } - - return 0; -} - -void -initialize () -{ - inferior_pid = 0; -} - -int -have_inferior_p () -{ - return inferior_pid != 0; -} diff --git a/contrib/gdb/gdb/gnu-regex.c b/contrib/gdb/gdb/gnu-regex.c deleted file mode 100644 index 84db70f79520b..0000000000000 --- a/contrib/gdb/gdb/gnu-regex.c +++ /dev/null @@ -1,5797 +0,0 @@ -/* Extended regular expression matching and search library, - version 0.12. - (Implements POSIX draft P1003.2/D11.2, except for some of the - internationalization features.) - Copyright (C) 1993, 94, 95, 96, 97, 98 Free Software Foundation, Inc. - - NOTE: The canonical source of this file is maintained with the - GNU C Library. Bugs can be reported to bug-glibc@prep.ai.mit.edu. - - 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 2, 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ - -/* AIX requires this to be the first thing in the file. */ -#if defined _AIX && !defined REGEX_MALLOC - #pragma alloca -#endif - -#undef _GNU_SOURCE -#define _GNU_SOURCE - -#ifdef HAVE_CONFIG_H -# include <config.h> -#endif - -#ifndef PARAMS -# if defined __GNUC__ || (defined __STDC__ && __STDC__) -# define PARAMS(args) args -# else -# define PARAMS(args) () -# endif /* GCC. */ -#endif /* Not PARAMS. */ - -#if defined STDC_HEADERS && !defined emacs -# include <stddef.h> -#else -/* We need this for `gnu-regex.h', and perhaps for the Emacs include files. */ -# include <sys/types.h> -#endif - -/* For platform which support the ISO C amendement 1 functionality we - support user defined character classes. */ -#if defined _LIBC || (defined HAVE_WCTYPE_H && defined HAVE_WCHAR_H) - /* Solaris 2.5 has a bug: <wchar.h> must be included before <wctype.h>. */ -# include <wchar.h> -# include <wctype.h> -#endif - -/* This is for other GNU distributions with internationalized messages. */ -/* CYGNUS LOCAL: ../intl will handle this for us */ -#ifdef ENABLE_NLS -# include <libintl.h> -#else -# define gettext(msgid) (msgid) -#endif - -#ifndef gettext_noop -/* This define is so xgettext can find the internationalizable - strings. */ -# define gettext_noop(String) String -#endif - -/* The `emacs' switch turns on certain matching commands - that make sense only in Emacs. */ -#ifdef emacs - -# include "lisp.h" -# include "buffer.h" -# include "syntax.h" - -#else /* not emacs */ - -/* If we are not linking with Emacs proper, - we can't use the relocating allocator - even if config.h says that we can. */ -# undef REL_ALLOC - -# if defined STDC_HEADERS || defined _LIBC -# include <stdlib.h> -# else -char *malloc (); -char *realloc (); -# endif - -/* When used in Emacs's lib-src, we need to get bzero and bcopy somehow. - If nothing else has been done, use the method below. */ -# ifdef INHIBIT_STRING_HEADER -# if !(defined HAVE_BZERO && defined HAVE_BCOPY) -# if !defined bzero && !defined bcopy -# undef INHIBIT_STRING_HEADER -# endif -# endif -# endif - -/* This is the normal way of making sure we have a bcopy and a bzero. - This is used in most programs--a few other programs avoid this - by defining INHIBIT_STRING_HEADER. */ -# ifndef INHIBIT_STRING_HEADER -# if defined HAVE_STRING_H || defined STDC_HEADERS || defined _LIBC -# include <string.h> -# ifndef bzero -# ifndef _LIBC -# define bzero(s, n) (memset (s, '\0', n), (s)) -# else -# define bzero(s, n) __bzero (s, n) -# endif -# endif -# else -# include <strings.h> -# ifndef memcmp -# define memcmp(s1, s2, n) bcmp (s1, s2, n) -# endif -# ifndef memcpy -# define memcpy(d, s, n) (bcopy (s, d, n), (d)) -# endif -# endif -# endif - -/* Define the syntax stuff for \<, \>, etc. */ - -/* This must be nonzero for the wordchar and notwordchar pattern - commands in re_match_2. */ -# ifndef Sword -# define Sword 1 -# endif - -# ifdef SWITCH_ENUM_BUG -# define SWITCH_ENUM_CAST(x) ((int)(x)) -# else -# define SWITCH_ENUM_CAST(x) (x) -# endif - -/* How many characters in the character set. */ -# define CHAR_SET_SIZE 256 - -/* GDB LOCAL: define _REGEX_RE_COMP to get BSD style re_comp and re_exec */ -#ifndef _REGEX_RE_COMP -#define _REGEX_RE_COMP -#endif - -# ifdef SYNTAX_TABLE - -extern char *re_syntax_table; - -# else /* not SYNTAX_TABLE */ - -static char re_syntax_table[CHAR_SET_SIZE]; - -static void -init_syntax_once () -{ - register int c; - static int done = 0; - - if (done) - return; - - bzero (re_syntax_table, sizeof re_syntax_table); - - for (c = 'a'; c <= 'z'; c++) - re_syntax_table[c] = Sword; - - for (c = 'A'; c <= 'Z'; c++) - re_syntax_table[c] = Sword; - - for (c = '0'; c <= '9'; c++) - re_syntax_table[c] = Sword; - - re_syntax_table['_'] = Sword; - - done = 1; -} - -# endif /* not SYNTAX_TABLE */ - -# define SYNTAX(c) re_syntax_table[c] - -#endif /* not emacs */ - -/* Get the interface, including the syntax bits. */ -/* CYGNUS LOCAL: call it gnu-regex.h, not regex.h, to avoid name conflicts */ -#include "gnu-regex.h" - -/* isalpha etc. are used for the character classes. */ -#include <ctype.h> - -/* Jim Meyering writes: - - "... Some ctype macros are valid only for character codes that - isascii says are ASCII (SGI's IRIX-4.0.5 is one such system --when - using /bin/cc or gcc but without giving an ansi option). So, all - ctype uses should be through macros like ISPRINT... If - STDC_HEADERS is defined, then autoconf has verified that the ctype - macros don't need to be guarded with references to isascii. ... - Defining isascii to 1 should let any compiler worth its salt - eliminate the && through constant folding." - Solaris defines some of these symbols so we must undefine them first. */ - -#undef ISASCII -#if defined STDC_HEADERS || (!defined isascii && !defined HAVE_ISASCII) -# define ISASCII(c) 1 -#else -# define ISASCII(c) isascii(c) -#endif - -#ifdef isblank -# define ISBLANK(c) (ISASCII (c) && isblank (c)) -#else -# define ISBLANK(c) ((c) == ' ' || (c) == '\t') -#endif -#ifdef isgraph -# define ISGRAPH(c) (ISASCII (c) && isgraph (c)) -#else -# define ISGRAPH(c) (ISASCII (c) && isprint (c) && !isspace (c)) -#endif - -#undef ISPRINT -#define ISPRINT(c) (ISASCII (c) && isprint (c)) -#define ISDIGIT(c) (ISASCII (c) && isdigit (c)) -#define ISALNUM(c) (ISASCII (c) && isalnum (c)) -#define ISALPHA(c) (ISASCII (c) && isalpha (c)) -#define ISCNTRL(c) (ISASCII (c) && iscntrl (c)) -#define ISLOWER(c) (ISASCII (c) && islower (c)) -#define ISPUNCT(c) (ISASCII (c) && ispunct (c)) -#define ISSPACE(c) (ISASCII (c) && isspace (c)) -#define ISUPPER(c) (ISASCII (c) && isupper (c)) -#define ISXDIGIT(c) (ISASCII (c) && isxdigit (c)) - -#ifndef NULL -# define NULL (void *)0 -#endif - -/* We remove any previous definition of `SIGN_EXTEND_CHAR', - since ours (we hope) works properly with all combinations of - machines, compilers, `char' and `unsigned char' argument types. - (Per Bothner suggested the basic approach.) */ -#undef SIGN_EXTEND_CHAR -#if __STDC__ -# define SIGN_EXTEND_CHAR(c) ((signed char) (c)) -#else /* not __STDC__ */ -/* As in Harbison and Steele. */ -# define SIGN_EXTEND_CHAR(c) ((((unsigned char) (c)) ^ 128) - 128) -#endif - -/* Should we use malloc or alloca? If REGEX_MALLOC is not defined, we - use `alloca' instead of `malloc'. This is because using malloc in - re_search* or re_match* could cause memory leaks when C-g is used in - Emacs; also, malloc is slower and causes storage fragmentation. On - the other hand, malloc is more portable, and easier to debug. - - Because we sometimes use alloca, some routines have to be macros, - not functions -- `alloca'-allocated space disappears at the end of the - function it is called in. */ - -#ifdef REGEX_MALLOC - -# define REGEX_ALLOCATE malloc -# define REGEX_REALLOCATE(source, osize, nsize) realloc (source, nsize) -# define REGEX_FREE free - -#else /* not REGEX_MALLOC */ - -/* Emacs already defines alloca, sometimes. */ -# ifndef alloca - -/* Make alloca work the best possible way. */ -# ifdef __GNUC__ -# define alloca __builtin_alloca -# else /* not __GNUC__ */ -# if HAVE_ALLOCA_H -# include <alloca.h> -# endif /* HAVE_ALLOCA_H */ -# endif /* not __GNUC__ */ - -# endif /* not alloca */ - -# define REGEX_ALLOCATE alloca - -/* Assumes a `char *destination' variable. */ -# define REGEX_REALLOCATE(source, osize, nsize) \ - (destination = (char *) alloca (nsize), \ - memcpy (destination, source, osize)) - -/* No need to do anything to free, after alloca. */ -# define REGEX_FREE(arg) ((void)0) /* Do nothing! But inhibit gcc warning. */ - -#endif /* not REGEX_MALLOC */ - -/* Define how to allocate the failure stack. */ - -#if defined REL_ALLOC && defined REGEX_MALLOC - -# define REGEX_ALLOCATE_STACK(size) \ - r_alloc (&failure_stack_ptr, (size)) -# define REGEX_REALLOCATE_STACK(source, osize, nsize) \ - r_re_alloc (&failure_stack_ptr, (nsize)) -# define REGEX_FREE_STACK(ptr) \ - r_alloc_free (&failure_stack_ptr) - -#else /* not using relocating allocator */ - -# ifdef REGEX_MALLOC - -# define REGEX_ALLOCATE_STACK malloc -# define REGEX_REALLOCATE_STACK(source, osize, nsize) realloc (source, nsize) -# define REGEX_FREE_STACK free - -# else /* not REGEX_MALLOC */ - -# define REGEX_ALLOCATE_STACK alloca - -# define REGEX_REALLOCATE_STACK(source, osize, nsize) \ - REGEX_REALLOCATE (source, osize, nsize) -/* No need to explicitly free anything. */ -# define REGEX_FREE_STACK(arg) - -# endif /* not REGEX_MALLOC */ -#endif /* not using relocating allocator */ - - -/* True if `size1' is non-NULL and PTR is pointing anywhere inside - `string1' or just past its end. This works if PTR is NULL, which is - a good thing. */ -#define FIRST_STRING_P(ptr) \ - (size1 && string1 <= (ptr) && (ptr) <= string1 + size1) - -/* (Re)Allocate N items of type T using malloc, or fail. */ -#define TALLOC(n, t) ((t *) malloc ((n) * sizeof (t))) -#define RETALLOC(addr, n, t) ((addr) = (t *) realloc (addr, (n) * sizeof (t))) -#define RETALLOC_IF(addr, n, t) \ - if (addr) RETALLOC((addr), (n), t); else (addr) = TALLOC ((n), t) -#define REGEX_TALLOC(n, t) ((t *) REGEX_ALLOCATE ((n) * sizeof (t))) - -#define BYTEWIDTH 8 /* In bits. */ - -#define STREQ(s1, s2) ((strcmp (s1, s2) == 0)) - -#undef MAX -#undef MIN -#define MAX(a, b) ((a) > (b) ? (a) : (b)) -#define MIN(a, b) ((a) < (b) ? (a) : (b)) - -typedef char boolean; -#define false 0 -#define true 1 - -static int re_match_2_internal PARAMS ((struct re_pattern_buffer *bufp, - const char *string1, int size1, - const char *string2, int size2, - int pos, - struct re_registers *regs, - int stop)); - -/* These are the command codes that appear in compiled regular - expressions. Some opcodes are followed by argument bytes. A - command code can specify any interpretation whatsoever for its - arguments. Zero bytes may appear in the compiled regular expression. */ - -typedef enum -{ - no_op = 0, - - /* Succeed right away--no more backtracking. */ - succeed, - - /* Followed by one byte giving n, then by n literal bytes. */ - exactn, - - /* Matches any (more or less) character. */ - anychar, - - /* Matches any one char belonging to specified set. First - following byte is number of bitmap bytes. Then come bytes - for a bitmap saying which chars are in. Bits in each byte - are ordered low-bit-first. A character is in the set if its - bit is 1. A character too large to have a bit in the map is - automatically not in the set. */ - charset, - - /* Same parameters as charset, but match any character that is - not one of those specified. */ - charset_not, - - /* Start remembering the text that is matched, for storing in a - register. Followed by one byte with the register number, in - the range 0 to one less than the pattern buffer's re_nsub - field. Then followed by one byte with the number of groups - inner to this one. (This last has to be part of the - start_memory only because we need it in the on_failure_jump - of re_match_2.) */ - start_memory, - - /* Stop remembering the text that is matched and store it in a - memory register. Followed by one byte with the register - number, in the range 0 to one less than `re_nsub' in the - pattern buffer, and one byte with the number of inner groups, - just like `start_memory'. (We need the number of inner - groups here because we don't have any easy way of finding the - corresponding start_memory when we're at a stop_memory.) */ - stop_memory, - - /* Match a duplicate of something remembered. Followed by one - byte containing the register number. */ - duplicate, - - /* Fail unless at beginning of line. */ - begline, - - /* Fail unless at end of line. */ - endline, - - /* Succeeds if at beginning of buffer (if emacs) or at beginning - of string to be matched (if not). */ - begbuf, - - /* Analogously, for end of buffer/string. */ - endbuf, - - /* Followed by two byte relative address to which to jump. */ - jump, - - /* Same as jump, but marks the end of an alternative. */ - jump_past_alt, - - /* Followed by two-byte relative address of place to resume at - in case of failure. */ - on_failure_jump, - - /* Like on_failure_jump, but pushes a placeholder instead of the - current string position when executed. */ - on_failure_keep_string_jump, - - /* Throw away latest failure point and then jump to following - two-byte relative address. */ - pop_failure_jump, - - /* Change to pop_failure_jump if know won't have to backtrack to - match; otherwise change to jump. This is used to jump - back to the beginning of a repeat. If what follows this jump - clearly won't match what the repeat does, such that we can be - sure that there is no use backtracking out of repetitions - already matched, then we change it to a pop_failure_jump. - Followed by two-byte address. */ - maybe_pop_jump, - - /* Jump to following two-byte address, and push a dummy failure - point. This failure point will be thrown away if an attempt - is made to use it for a failure. A `+' construct makes this - before the first repeat. Also used as an intermediary kind - of jump when compiling an alternative. */ - dummy_failure_jump, - - /* Push a dummy failure point and continue. Used at the end of - alternatives. */ - push_dummy_failure, - - /* Followed by two-byte relative address and two-byte number n. - After matching N times, jump to the address upon failure. */ - succeed_n, - - /* Followed by two-byte relative address, and two-byte number n. - Jump to the address N times, then fail. */ - jump_n, - - /* Set the following two-byte relative address to the - subsequent two-byte number. The address *includes* the two - bytes of number. */ - set_number_at, - - wordchar, /* Matches any word-constituent character. */ - notwordchar, /* Matches any char that is not a word-constituent. */ - - wordbeg, /* Succeeds if at word beginning. */ - wordend, /* Succeeds if at word end. */ - - wordbound, /* Succeeds if at a word boundary. */ - notwordbound /* Succeeds if not at a word boundary. */ - -#ifdef emacs - ,before_dot, /* Succeeds if before point. */ - at_dot, /* Succeeds if at point. */ - after_dot, /* Succeeds if after point. */ - - /* Matches any character whose syntax is specified. Followed by - a byte which contains a syntax code, e.g., Sword. */ - syntaxspec, - - /* Matches any character whose syntax is not that specified. */ - notsyntaxspec -#endif /* emacs */ -} re_opcode_t; - -/* Common operations on the compiled pattern. */ - -/* Store NUMBER in two contiguous bytes starting at DESTINATION. */ - -#define STORE_NUMBER(destination, number) \ - do { \ - (destination)[0] = (number) & 0377; \ - (destination)[1] = (number) >> 8; \ - } while (0) - -/* Same as STORE_NUMBER, except increment DESTINATION to - the byte after where the number is stored. Therefore, DESTINATION - must be an lvalue. */ - -#define STORE_NUMBER_AND_INCR(destination, number) \ - do { \ - STORE_NUMBER (destination, number); \ - (destination) += 2; \ - } while (0) - -/* Put into DESTINATION a number stored in two contiguous bytes starting - at SOURCE. */ - -#define EXTRACT_NUMBER(destination, source) \ - do { \ - (destination) = *(source) & 0377; \ - (destination) += SIGN_EXTEND_CHAR (*((source) + 1)) << 8; \ - } while (0) - -#ifdef DEBUG -static void extract_number _RE_ARGS ((int *dest, unsigned char *source)); -static void -extract_number (dest, source) - int *dest; - unsigned char *source; -{ - int temp = SIGN_EXTEND_CHAR (*(source + 1)); - *dest = *source & 0377; - *dest += temp << 8; -} - -# ifndef EXTRACT_MACROS /* To debug the macros. */ -# undef EXTRACT_NUMBER -# define EXTRACT_NUMBER(dest, src) extract_number (&dest, src) -# endif /* not EXTRACT_MACROS */ - -#endif /* DEBUG */ - -/* Same as EXTRACT_NUMBER, except increment SOURCE to after the number. - SOURCE must be an lvalue. */ - -#define EXTRACT_NUMBER_AND_INCR(destination, source) \ - do { \ - EXTRACT_NUMBER (destination, source); \ - (source) += 2; \ - } while (0) - -#ifdef DEBUG -static void extract_number_and_incr _RE_ARGS ((int *destination, - unsigned char **source)); -static void -extract_number_and_incr (destination, source) - int *destination; - unsigned char **source; -{ - extract_number (destination, *source); - *source += 2; -} - -# ifndef EXTRACT_MACROS -# undef EXTRACT_NUMBER_AND_INCR -# define EXTRACT_NUMBER_AND_INCR(dest, src) \ - extract_number_and_incr (&dest, &src) -# endif /* not EXTRACT_MACROS */ - -#endif /* DEBUG */ - -/* If DEBUG is defined, Regex prints many voluminous messages about what - it is doing (if the variable `debug' is nonzero). If linked with the - main program in `iregex.c', you can enter patterns and strings - interactively. And if linked with the main program in `main.c' and - the other test files, you can run the already-written tests. */ - -#ifdef DEBUG - -/* We use standard I/O for debugging. */ -# include <stdio.h> - -/* It is useful to test things that ``must'' be true when debugging. */ -# include <assert.h> - -static int debug = 0; - -# define DEBUG_STATEMENT(e) e -# define DEBUG_PRINT1(x) if (debug) printf (x) -# define DEBUG_PRINT2(x1, x2) if (debug) printf (x1, x2) -# define DEBUG_PRINT3(x1, x2, x3) if (debug) printf (x1, x2, x3) -# define DEBUG_PRINT4(x1, x2, x3, x4) if (debug) printf (x1, x2, x3, x4) -# define DEBUG_PRINT_COMPILED_PATTERN(p, s, e) \ - if (debug) print_partial_compiled_pattern (s, e) -# define DEBUG_PRINT_DOUBLE_STRING(w, s1, sz1, s2, sz2) \ - if (debug) print_double_string (w, s1, sz1, s2, sz2) - - -/* Print the fastmap in human-readable form. */ - -void -print_fastmap (fastmap) - char *fastmap; -{ - unsigned was_a_range = 0; - unsigned i = 0; - - while (i < (1 << BYTEWIDTH)) - { - if (fastmap[i++]) - { - was_a_range = 0; - putchar (i - 1); - while (i < (1 << BYTEWIDTH) && fastmap[i]) - { - was_a_range = 1; - i++; - } - if (was_a_range) - { - printf ("-"); - putchar (i - 1); - } - } - } - putchar ('\n'); -} - - -/* Print a compiled pattern string in human-readable form, starting at - the START pointer into it and ending just before the pointer END. */ - -void -print_partial_compiled_pattern (start, end) - unsigned char *start; - unsigned char *end; -{ - int mcnt, mcnt2; - unsigned char *p1; - unsigned char *p = start; - unsigned char *pend = end; - - if (start == NULL) - { - printf ("(null)\n"); - return; - } - - /* Loop over pattern commands. */ - while (p < pend) - { - printf ("%d:\t", p - start); - - switch ((re_opcode_t) *p++) - { - case no_op: - printf ("/no_op"); - break; - - case exactn: - mcnt = *p++; - printf ("/exactn/%d", mcnt); - do - { - putchar ('/'); - putchar (*p++); - } - while (--mcnt); - break; - - case start_memory: - mcnt = *p++; - printf ("/start_memory/%d/%d", mcnt, *p++); - break; - - case stop_memory: - mcnt = *p++; - printf ("/stop_memory/%d/%d", mcnt, *p++); - break; - - case duplicate: - printf ("/duplicate/%d", *p++); - break; - - case anychar: - printf ("/anychar"); - break; - - case charset: - case charset_not: - { - register int c, last = -100; - register int in_range = 0; - - printf ("/charset [%s", - (re_opcode_t) *(p - 1) == charset_not ? "^" : ""); - - assert (p + *p < pend); - - for (c = 0; c < 256; c++) - if (c / 8 < *p - && (p[1 + (c/8)] & (1 << (c % 8)))) - { - /* Are we starting a range? */ - if (last + 1 == c && ! in_range) - { - putchar ('-'); - in_range = 1; - } - /* Have we broken a range? */ - else if (last + 1 != c && in_range) - { - putchar (last); - in_range = 0; - } - - if (! in_range) - putchar (c); - - last = c; - } - - if (in_range) - putchar (last); - - putchar (']'); - - p += 1 + *p; - } - break; - - case begline: - printf ("/begline"); - break; - - case endline: - printf ("/endline"); - break; - - case on_failure_jump: - extract_number_and_incr (&mcnt, &p); - printf ("/on_failure_jump to %d", p + mcnt - start); - break; - - case on_failure_keep_string_jump: - extract_number_and_incr (&mcnt, &p); - printf ("/on_failure_keep_string_jump to %d", p + mcnt - start); - break; - - case dummy_failure_jump: - extract_number_and_incr (&mcnt, &p); - printf ("/dummy_failure_jump to %d", p + mcnt - start); - break; - - case push_dummy_failure: - printf ("/push_dummy_failure"); - break; - - case maybe_pop_jump: - extract_number_and_incr (&mcnt, &p); - printf ("/maybe_pop_jump to %d", p + mcnt - start); - break; - - case pop_failure_jump: - extract_number_and_incr (&mcnt, &p); - printf ("/pop_failure_jump to %d", p + mcnt - start); - break; - - case jump_past_alt: - extract_number_and_incr (&mcnt, &p); - printf ("/jump_past_alt to %d", p + mcnt - start); - break; - - case jump: - extract_number_and_incr (&mcnt, &p); - printf ("/jump to %d", p + mcnt - start); - break; - - case succeed_n: - extract_number_and_incr (&mcnt, &p); - p1 = p + mcnt; - extract_number_and_incr (&mcnt2, &p); - printf ("/succeed_n to %d, %d times", p1 - start, mcnt2); - break; - - case jump_n: - extract_number_and_incr (&mcnt, &p); - p1 = p + mcnt; - extract_number_and_incr (&mcnt2, &p); - printf ("/jump_n to %d, %d times", p1 - start, mcnt2); - break; - - case set_number_at: - extract_number_and_incr (&mcnt, &p); - p1 = p + mcnt; - extract_number_and_incr (&mcnt2, &p); - printf ("/set_number_at location %d to %d", p1 - start, mcnt2); - break; - - case wordbound: - printf ("/wordbound"); - break; - - case notwordbound: - printf ("/notwordbound"); - break; - - case wordbeg: - printf ("/wordbeg"); - break; - - case wordend: - printf ("/wordend"); - -# ifdef emacs - case before_dot: - printf ("/before_dot"); - break; - - case at_dot: - printf ("/at_dot"); - break; - - case after_dot: - printf ("/after_dot"); - break; - - case syntaxspec: - printf ("/syntaxspec"); - mcnt = *p++; - printf ("/%d", mcnt); - break; - - case notsyntaxspec: - printf ("/notsyntaxspec"); - mcnt = *p++; - printf ("/%d", mcnt); - break; -# endif /* emacs */ - - case wordchar: - printf ("/wordchar"); - break; - - case notwordchar: - printf ("/notwordchar"); - break; - - case begbuf: - printf ("/begbuf"); - break; - - case endbuf: - printf ("/endbuf"); - break; - - default: - printf ("?%d", *(p-1)); - } - - putchar ('\n'); - } - - printf ("%d:\tend of pattern.\n", p - start); -} - - -void -print_compiled_pattern (bufp) - struct re_pattern_buffer *bufp; -{ - unsigned char *buffer = bufp->buffer; - - print_partial_compiled_pattern (buffer, buffer + bufp->used); - printf ("%ld bytes used/%ld bytes allocated.\n", - bufp->used, bufp->allocated); - - if (bufp->fastmap_accurate && bufp->fastmap) - { - printf ("fastmap: "); - print_fastmap (bufp->fastmap); - } - - printf ("re_nsub: %d\t", bufp->re_nsub); - printf ("regs_alloc: %d\t", bufp->regs_allocated); - printf ("can_be_null: %d\t", bufp->can_be_null); - printf ("newline_anchor: %d\n", bufp->newline_anchor); - printf ("no_sub: %d\t", bufp->no_sub); - printf ("not_bol: %d\t", bufp->not_bol); - printf ("not_eol: %d\t", bufp->not_eol); - printf ("syntax: %lx\n", bufp->syntax); - /* Perhaps we should print the translate table? */ -} - - -void -print_double_string (where, string1, size1, string2, size2) - const char *where; - const char *string1; - const char *string2; - int size1; - int size2; -{ - int this_char; - - if (where == NULL) - printf ("(null)"); - else - { - if (FIRST_STRING_P (where)) - { - for (this_char = where - string1; this_char < size1; this_char++) - putchar (string1[this_char]); - - where = string2; - } - - for (this_char = where - string2; this_char < size2; this_char++) - putchar (string2[this_char]); - } -} - -void -printchar (c) - int c; -{ - putc (c, stderr); -} - -#else /* not DEBUG */ - -# undef assert -# define assert(e) - -# define DEBUG_STATEMENT(e) -# define DEBUG_PRINT1(x) -# define DEBUG_PRINT2(x1, x2) -# define DEBUG_PRINT3(x1, x2, x3) -# define DEBUG_PRINT4(x1, x2, x3, x4) -# define DEBUG_PRINT_COMPILED_PATTERN(p, s, e) -# define DEBUG_PRINT_DOUBLE_STRING(w, s1, sz1, s2, sz2) - -#endif /* not DEBUG */ - -/* Set by `re_set_syntax' to the current regexp syntax to recognize. Can - also be assigned to arbitrarily: each pattern buffer stores its own - syntax, so it can be changed between regex compilations. */ -/* This has no initializer because initialized variables in Emacs - become read-only after dumping. */ -reg_syntax_t re_syntax_options; - - -/* Specify the precise syntax of regexps for compilation. This provides - for compatibility for various utilities which historically have - different, incompatible syntaxes. - - The argument SYNTAX is a bit mask comprised of the various bits - defined in gnu-regex.h. We return the old syntax. */ - -reg_syntax_t -re_set_syntax (syntax) - reg_syntax_t syntax; -{ - reg_syntax_t ret = re_syntax_options; - - re_syntax_options = syntax; -#ifdef DEBUG - if (syntax & RE_DEBUG) - debug = 1; - else if (debug) /* was on but now is not */ - debug = 0; -#endif /* DEBUG */ - return ret; -} -#ifdef _LIBC -weak_alias (__re_set_syntax, re_set_syntax) -#endif - -/* This table gives an error message for each of the error codes listed - in gnu-regex.h. Obviously the order here has to be same as there. - POSIX doesn't require that we do anything for REG_NOERROR, - but why not be nice? */ - -static const char *re_error_msgid[] = - { - gettext_noop ("Success"), /* REG_NOERROR */ - gettext_noop ("No match"), /* REG_NOMATCH */ - gettext_noop ("Invalid regular expression"), /* REG_BADPAT */ - gettext_noop ("Invalid collation character"), /* REG_ECOLLATE */ - gettext_noop ("Invalid character class name"), /* REG_ECTYPE */ - gettext_noop ("Trailing backslash"), /* REG_EESCAPE */ - gettext_noop ("Invalid back reference"), /* REG_ESUBREG */ - gettext_noop ("Unmatched [ or [^"), /* REG_EBRACK */ - gettext_noop ("Unmatched ( or \\("), /* REG_EPAREN */ - gettext_noop ("Unmatched \\{"), /* REG_EBRACE */ - gettext_noop ("Invalid content of \\{\\}"), /* REG_BADBR */ - gettext_noop ("Invalid range end"), /* REG_ERANGE */ - gettext_noop ("Memory exhausted"), /* REG_ESPACE */ - gettext_noop ("Invalid preceding regular expression"), /* REG_BADRPT */ - gettext_noop ("Premature end of regular expression"), /* REG_EEND */ - gettext_noop ("Regular expression too big"), /* REG_ESIZE */ - gettext_noop ("Unmatched ) or \\)"), /* REG_ERPAREN */ - }; - -/* Avoiding alloca during matching, to placate r_alloc. */ - -/* Define MATCH_MAY_ALLOCATE unless we need to make sure that the - searching and matching functions should not call alloca. On some - systems, alloca is implemented in terms of malloc, and if we're - using the relocating allocator routines, then malloc could cause a - relocation, which might (if the strings being searched are in the - ralloc heap) shift the data out from underneath the regexp - routines. - - Here's another reason to avoid allocation: Emacs - processes input from X in a signal handler; processing X input may - call malloc; if input arrives while a matching routine is calling - malloc, then we're scrod. But Emacs can't just block input while - calling matching routines; then we don't notice interrupts when - they come in. So, Emacs blocks input around all regexp calls - except the matching calls, which it leaves unprotected, in the - faith that they will not malloc. */ - -/* Normally, this is fine. */ -#define MATCH_MAY_ALLOCATE - -/* When using GNU C, we are not REALLY using the C alloca, no matter - what config.h may say. So don't take precautions for it. */ -#ifdef __GNUC__ -# undef C_ALLOCA -#endif - -/* The match routines may not allocate if (1) they would do it with malloc - and (2) it's not safe for them to use malloc. - Note that if REL_ALLOC is defined, matching would not use malloc for the - failure stack, but we would still use it for the register vectors; - so REL_ALLOC should not affect this. */ -#if (defined C_ALLOCA || defined REGEX_MALLOC) && defined emacs -# undef MATCH_MAY_ALLOCATE -#endif - - -/* Failure stack declarations and macros; both re_compile_fastmap and - re_match_2 use a failure stack. These have to be macros because of - REGEX_ALLOCATE_STACK. */ - - -/* Number of failure points for which to initially allocate space - when matching. If this number is exceeded, we allocate more - space, so it is not a hard limit. */ -#ifndef INIT_FAILURE_ALLOC -# define INIT_FAILURE_ALLOC 5 -#endif - -/* Roughly the maximum number of failure points on the stack. Would be - exactly that if always used MAX_FAILURE_ITEMS items each time we failed. - This is a variable only so users of regex can assign to it; we never - change it ourselves. */ - -#ifdef INT_IS_16BIT - -# if defined MATCH_MAY_ALLOCATE -/* 4400 was enough to cause a crash on Alpha OSF/1, - whose default stack limit is 2mb. */ -long int re_max_failures = 4000; -# else -long int re_max_failures = 2000; -# endif - -union fail_stack_elt -{ - unsigned char *pointer; - long int integer; -}; - -typedef union fail_stack_elt fail_stack_elt_t; - -typedef struct -{ - fail_stack_elt_t *stack; - unsigned long int size; - unsigned long int avail; /* Offset of next open position. */ -} fail_stack_type; - -#else /* not INT_IS_16BIT */ - -# if defined MATCH_MAY_ALLOCATE -/* 4400 was enough to cause a crash on Alpha OSF/1, - whose default stack limit is 2mb. */ -int re_max_failures = 20000; -# else -int re_max_failures = 2000; -# endif - -union fail_stack_elt -{ - unsigned char *pointer; - int integer; -}; - -typedef union fail_stack_elt fail_stack_elt_t; - -typedef struct -{ - fail_stack_elt_t *stack; - unsigned size; - unsigned avail; /* Offset of next open position. */ -} fail_stack_type; - -#endif /* INT_IS_16BIT */ - -#define FAIL_STACK_EMPTY() (fail_stack.avail == 0) -#define FAIL_STACK_PTR_EMPTY() (fail_stack_ptr->avail == 0) -#define FAIL_STACK_FULL() (fail_stack.avail == fail_stack.size) - - -/* Define macros to initialize and free the failure stack. - Do `return -2' if the alloc fails. */ - -#ifdef MATCH_MAY_ALLOCATE -# define INIT_FAIL_STACK() \ - do { \ - fail_stack.stack = (fail_stack_elt_t *) \ - REGEX_ALLOCATE_STACK (INIT_FAILURE_ALLOC * sizeof (fail_stack_elt_t)); \ - \ - if (fail_stack.stack == NULL) \ - return -2; \ - \ - fail_stack.size = INIT_FAILURE_ALLOC; \ - fail_stack.avail = 0; \ - } while (0) - -# define RESET_FAIL_STACK() REGEX_FREE_STACK (fail_stack.stack) -#else -# define INIT_FAIL_STACK() \ - do { \ - fail_stack.avail = 0; \ - } while (0) - -# define RESET_FAIL_STACK() -#endif - - -/* Double the size of FAIL_STACK, up to approximately `re_max_failures' items. - - Return 1 if succeeds, and 0 if either ran out of memory - allocating space for it or it was already too large. - - REGEX_REALLOCATE_STACK requires `destination' be declared. */ - -#define DOUBLE_FAIL_STACK(fail_stack) \ - ((fail_stack).size > (unsigned) (re_max_failures * MAX_FAILURE_ITEMS) \ - ? 0 \ - : ((fail_stack).stack = (fail_stack_elt_t *) \ - REGEX_REALLOCATE_STACK ((fail_stack).stack, \ - (fail_stack).size * sizeof (fail_stack_elt_t), \ - ((fail_stack).size << 1) * sizeof (fail_stack_elt_t)), \ - \ - (fail_stack).stack == NULL \ - ? 0 \ - : ((fail_stack).size <<= 1, \ - 1))) - - -/* Push pointer POINTER on FAIL_STACK. - Return 1 if was able to do so and 0 if ran out of memory allocating - space to do so. */ -#define PUSH_PATTERN_OP(POINTER, FAIL_STACK) \ - ((FAIL_STACK_FULL () \ - && !DOUBLE_FAIL_STACK (FAIL_STACK)) \ - ? 0 \ - : ((FAIL_STACK).stack[(FAIL_STACK).avail++].pointer = POINTER, \ - 1)) - -/* Push a pointer value onto the failure stack. - Assumes the variable `fail_stack'. Probably should only - be called from within `PUSH_FAILURE_POINT'. */ -#define PUSH_FAILURE_POINTER(item) \ - fail_stack.stack[fail_stack.avail++].pointer = (unsigned char *) (item) - -/* This pushes an integer-valued item onto the failure stack. - Assumes the variable `fail_stack'. Probably should only - be called from within `PUSH_FAILURE_POINT'. */ -#define PUSH_FAILURE_INT(item) \ - fail_stack.stack[fail_stack.avail++].integer = (item) - -/* Push a fail_stack_elt_t value onto the failure stack. - Assumes the variable `fail_stack'. Probably should only - be called from within `PUSH_FAILURE_POINT'. */ -#define PUSH_FAILURE_ELT(item) \ - fail_stack.stack[fail_stack.avail++] = (item) - -/* These three POP... operations complement the three PUSH... operations. - All assume that `fail_stack' is nonempty. */ -#define POP_FAILURE_POINTER() fail_stack.stack[--fail_stack.avail].pointer -#define POP_FAILURE_INT() fail_stack.stack[--fail_stack.avail].integer -#define POP_FAILURE_ELT() fail_stack.stack[--fail_stack.avail] - -/* Used to omit pushing failure point id's when we're not debugging. */ -#ifdef DEBUG -# define DEBUG_PUSH PUSH_FAILURE_INT -# define DEBUG_POP(item_addr) *(item_addr) = POP_FAILURE_INT () -#else -# define DEBUG_PUSH(item) -# define DEBUG_POP(item_addr) -#endif - - -/* Push the information about the state we will need - if we ever fail back to it. - - Requires variables fail_stack, regstart, regend, reg_info, and - num_regs_pushed be declared. DOUBLE_FAIL_STACK requires `destination' - be declared. - - Does `return FAILURE_CODE' if runs out of memory. */ - -#define PUSH_FAILURE_POINT(pattern_place, string_place, failure_code) \ - do { \ - char *destination; \ - /* Must be int, so when we don't save any registers, the arithmetic \ - of 0 + -1 isn't done as unsigned. */ \ - /* Can't be int, since there is not a shred of a guarantee that int \ - is wide enough to hold a value of something to which pointer can \ - be assigned */ \ - active_reg_t this_reg; \ - \ - DEBUG_STATEMENT (failure_id++); \ - DEBUG_STATEMENT (nfailure_points_pushed++); \ - DEBUG_PRINT2 ("\nPUSH_FAILURE_POINT #%u:\n", failure_id); \ - DEBUG_PRINT2 (" Before push, next avail: %d\n", (fail_stack).avail);\ - DEBUG_PRINT2 (" size: %d\n", (fail_stack).size);\ - \ - DEBUG_PRINT2 (" slots needed: %ld\n", NUM_FAILURE_ITEMS); \ - DEBUG_PRINT2 (" available: %d\n", REMAINING_AVAIL_SLOTS); \ - \ - /* Ensure we have enough space allocated for what we will push. */ \ - while (REMAINING_AVAIL_SLOTS < NUM_FAILURE_ITEMS) \ - { \ - if (!DOUBLE_FAIL_STACK (fail_stack)) \ - return failure_code; \ - \ - DEBUG_PRINT2 ("\n Doubled stack; size now: %d\n", \ - (fail_stack).size); \ - DEBUG_PRINT2 (" slots available: %d\n", REMAINING_AVAIL_SLOTS);\ - } \ - \ - /* Push the info, starting with the registers. */ \ - DEBUG_PRINT1 ("\n"); \ - \ - if (1) \ - for (this_reg = lowest_active_reg; this_reg <= highest_active_reg; \ - this_reg++) \ - { \ - DEBUG_PRINT2 (" Pushing reg: %lu\n", this_reg); \ - DEBUG_STATEMENT (num_regs_pushed++); \ - \ - DEBUG_PRINT2 (" start: %p\n", regstart[this_reg]); \ - PUSH_FAILURE_POINTER (regstart[this_reg]); \ - \ - DEBUG_PRINT2 (" end: %p\n", regend[this_reg]); \ - PUSH_FAILURE_POINTER (regend[this_reg]); \ - \ - DEBUG_PRINT2 (" info: %p\n ", \ - reg_info[this_reg].word.pointer); \ - DEBUG_PRINT2 (" match_null=%d", \ - REG_MATCH_NULL_STRING_P (reg_info[this_reg])); \ - DEBUG_PRINT2 (" active=%d", IS_ACTIVE (reg_info[this_reg])); \ - DEBUG_PRINT2 (" matched_something=%d", \ - MATCHED_SOMETHING (reg_info[this_reg])); \ - DEBUG_PRINT2 (" ever_matched=%d", \ - EVER_MATCHED_SOMETHING (reg_info[this_reg])); \ - DEBUG_PRINT1 ("\n"); \ - PUSH_FAILURE_ELT (reg_info[this_reg].word); \ - } \ - \ - DEBUG_PRINT2 (" Pushing low active reg: %ld\n", lowest_active_reg);\ - PUSH_FAILURE_INT (lowest_active_reg); \ - \ - DEBUG_PRINT2 (" Pushing high active reg: %ld\n", highest_active_reg);\ - PUSH_FAILURE_INT (highest_active_reg); \ - \ - DEBUG_PRINT2 (" Pushing pattern %p:\n", pattern_place); \ - DEBUG_PRINT_COMPILED_PATTERN (bufp, pattern_place, pend); \ - PUSH_FAILURE_POINTER (pattern_place); \ - \ - DEBUG_PRINT2 (" Pushing string %p: `", string_place); \ - DEBUG_PRINT_DOUBLE_STRING (string_place, string1, size1, string2, \ - size2); \ - DEBUG_PRINT1 ("'\n"); \ - PUSH_FAILURE_POINTER (string_place); \ - \ - DEBUG_PRINT2 (" Pushing failure id: %u\n", failure_id); \ - DEBUG_PUSH (failure_id); \ - } while (0) - -/* This is the number of items that are pushed and popped on the stack - for each register. */ -#define NUM_REG_ITEMS 3 - -/* Individual items aside from the registers. */ -#ifdef DEBUG -# define NUM_NONREG_ITEMS 5 /* Includes failure point id. */ -#else -# define NUM_NONREG_ITEMS 4 -#endif - -/* We push at most this many items on the stack. */ -/* We used to use (num_regs - 1), which is the number of registers - this regexp will save; but that was changed to 5 - to avoid stack overflow for a regexp with lots of parens. */ -#define MAX_FAILURE_ITEMS (5 * NUM_REG_ITEMS + NUM_NONREG_ITEMS) - -/* We actually push this many items. */ -#define NUM_FAILURE_ITEMS \ - (((0 \ - ? 0 : highest_active_reg - lowest_active_reg + 1) \ - * NUM_REG_ITEMS) \ - + NUM_NONREG_ITEMS) - -/* How many items can still be added to the stack without overflowing it. */ -#define REMAINING_AVAIL_SLOTS ((fail_stack).size - (fail_stack).avail) - - -/* Pops what PUSH_FAIL_STACK pushes. - - We restore into the parameters, all of which should be lvalues: - STR -- the saved data position. - PAT -- the saved pattern position. - LOW_REG, HIGH_REG -- the highest and lowest active registers. - REGSTART, REGEND -- arrays of string positions. - REG_INFO -- array of information about each subexpression. - - Also assumes the variables `fail_stack' and (if debugging), `bufp', - `pend', `string1', `size1', `string2', and `size2'. */ - -#define POP_FAILURE_POINT(str, pat, low_reg, high_reg, regstart, regend, reg_info)\ -{ \ - DEBUG_STATEMENT (unsigned failure_id;) \ - active_reg_t this_reg; \ - const unsigned char *string_temp; \ - \ - assert (!FAIL_STACK_EMPTY ()); \ - \ - /* Remove failure points and point to how many regs pushed. */ \ - DEBUG_PRINT1 ("POP_FAILURE_POINT:\n"); \ - DEBUG_PRINT2 (" Before pop, next avail: %d\n", fail_stack.avail); \ - DEBUG_PRINT2 (" size: %d\n", fail_stack.size); \ - \ - assert (fail_stack.avail >= NUM_NONREG_ITEMS); \ - \ - DEBUG_POP (&failure_id); \ - DEBUG_PRINT2 (" Popping failure id: %u\n", failure_id); \ - \ - /* If the saved string location is NULL, it came from an \ - on_failure_keep_string_jump opcode, and we want to throw away the \ - saved NULL, thus retaining our current position in the string. */ \ - string_temp = POP_FAILURE_POINTER (); \ - if (string_temp != NULL) \ - str = (const char *) string_temp; \ - \ - DEBUG_PRINT2 (" Popping string %p: `", str); \ - DEBUG_PRINT_DOUBLE_STRING (str, string1, size1, string2, size2); \ - DEBUG_PRINT1 ("'\n"); \ - \ - pat = (unsigned char *) POP_FAILURE_POINTER (); \ - DEBUG_PRINT2 (" Popping pattern %p:\n", pat); \ - DEBUG_PRINT_COMPILED_PATTERN (bufp, pat, pend); \ - \ - /* Restore register info. */ \ - high_reg = (active_reg_t) POP_FAILURE_INT (); \ - DEBUG_PRINT2 (" Popping high active reg: %ld\n", high_reg); \ - \ - low_reg = (active_reg_t) POP_FAILURE_INT (); \ - DEBUG_PRINT2 (" Popping low active reg: %ld\n", low_reg); \ - \ - if (1) \ - for (this_reg = high_reg; this_reg >= low_reg; this_reg--) \ - { \ - DEBUG_PRINT2 (" Popping reg: %ld\n", this_reg); \ - \ - reg_info[this_reg].word = POP_FAILURE_ELT (); \ - DEBUG_PRINT2 (" info: %p\n", \ - reg_info[this_reg].word.pointer); \ - \ - regend[this_reg] = (const char *) POP_FAILURE_POINTER (); \ - DEBUG_PRINT2 (" end: %p\n", regend[this_reg]); \ - \ - regstart[this_reg] = (const char *) POP_FAILURE_POINTER (); \ - DEBUG_PRINT2 (" start: %p\n", regstart[this_reg]); \ - } \ - else \ - { \ - for (this_reg = highest_active_reg; this_reg > high_reg; this_reg--) \ - { \ - reg_info[this_reg].word.integer = 0; \ - regend[this_reg] = 0; \ - regstart[this_reg] = 0; \ - } \ - highest_active_reg = high_reg; \ - } \ - \ - set_regs_matched_done = 0; \ - DEBUG_STATEMENT (nfailure_points_popped++); \ -} /* POP_FAILURE_POINT */ - - - -/* Structure for per-register (a.k.a. per-group) information. - Other register information, such as the - starting and ending positions (which are addresses), and the list of - inner groups (which is a bits list) are maintained in separate - variables. - - We are making a (strictly speaking) nonportable assumption here: that - the compiler will pack our bit fields into something that fits into - the type of `word', i.e., is something that fits into one item on the - failure stack. */ - - -/* Declarations and macros for re_match_2. */ - -typedef union -{ - fail_stack_elt_t word; - struct - { - /* This field is one if this group can match the empty string, - zero if not. If not yet determined, `MATCH_NULL_UNSET_VALUE'. */ -#define MATCH_NULL_UNSET_VALUE 3 - unsigned match_null_string_p : 2; - unsigned is_active : 1; - unsigned matched_something : 1; - unsigned ever_matched_something : 1; - } bits; -} register_info_type; - -#define REG_MATCH_NULL_STRING_P(R) ((R).bits.match_null_string_p) -#define IS_ACTIVE(R) ((R).bits.is_active) -#define MATCHED_SOMETHING(R) ((R).bits.matched_something) -#define EVER_MATCHED_SOMETHING(R) ((R).bits.ever_matched_something) - - -/* Call this when have matched a real character; it sets `matched' flags - for the subexpressions which we are currently inside. Also records - that those subexprs have matched. */ -#define SET_REGS_MATCHED() \ - do \ - { \ - if (!set_regs_matched_done) \ - { \ - active_reg_t r; \ - set_regs_matched_done = 1; \ - for (r = lowest_active_reg; r <= highest_active_reg; r++) \ - { \ - MATCHED_SOMETHING (reg_info[r]) \ - = EVER_MATCHED_SOMETHING (reg_info[r]) \ - = 1; \ - } \ - } \ - } \ - while (0) - -/* Registers are set to a sentinel when they haven't yet matched. */ -static char reg_unset_dummy; -#define REG_UNSET_VALUE (®_unset_dummy) -#define REG_UNSET(e) ((e) == REG_UNSET_VALUE) - -/* Subroutine declarations and macros for regex_compile. */ - -static reg_errcode_t regex_compile _RE_ARGS ((const char *pattern, size_t size, - reg_syntax_t syntax, - struct re_pattern_buffer *bufp)); -static void store_op1 _RE_ARGS ((re_opcode_t op, unsigned char *loc, int arg)); -static void store_op2 _RE_ARGS ((re_opcode_t op, unsigned char *loc, - int arg1, int arg2)); -static void insert_op1 _RE_ARGS ((re_opcode_t op, unsigned char *loc, - int arg, unsigned char *end)); -static void insert_op2 _RE_ARGS ((re_opcode_t op, unsigned char *loc, - int arg1, int arg2, unsigned char *end)); -static boolean at_begline_loc_p _RE_ARGS ((const char *pattern, const char *p, - reg_syntax_t syntax)); -static boolean at_endline_loc_p _RE_ARGS ((const char *p, const char *pend, - reg_syntax_t syntax)); -static reg_errcode_t compile_range _RE_ARGS ((const char **p_ptr, - const char *pend, - char *translate, - reg_syntax_t syntax, - unsigned char *b)); - -/* Fetch the next character in the uncompiled pattern---translating it - if necessary. Also cast from a signed character in the constant - string passed to us by the user to an unsigned char that we can use - as an array index (in, e.g., `translate'). */ -#ifndef PATFETCH -# define PATFETCH(c) \ - do {if (p == pend) return REG_EEND; \ - c = (unsigned char) *p++; \ - if (translate) c = (unsigned char) translate[c]; \ - } while (0) -#endif - -/* Fetch the next character in the uncompiled pattern, with no - translation. */ -#define PATFETCH_RAW(c) \ - do {if (p == pend) return REG_EEND; \ - c = (unsigned char) *p++; \ - } while (0) - -/* Go backwards one character in the pattern. */ -#define PATUNFETCH p-- - - -/* If `translate' is non-null, return translate[D], else just D. We - cast the subscript to translate because some data is declared as - `char *', to avoid warnings when a string constant is passed. But - when we use a character as a subscript we must make it unsigned. */ -#ifndef TRANSLATE -# define TRANSLATE(d) \ - (translate ? (char) translate[(unsigned char) (d)] : (d)) -#endif - - -/* Macros for outputting the compiled pattern into `buffer'. */ - -/* If the buffer isn't allocated when it comes in, use this. */ -#define INIT_BUF_SIZE 32 - -/* Make sure we have at least N more bytes of space in buffer. */ -#define GET_BUFFER_SPACE(n) \ - while ((unsigned long) (b - bufp->buffer + (n)) > bufp->allocated) \ - EXTEND_BUFFER () - -/* Make sure we have one more byte of buffer space and then add C to it. */ -#define BUF_PUSH(c) \ - do { \ - GET_BUFFER_SPACE (1); \ - *b++ = (unsigned char) (c); \ - } while (0) - - -/* Ensure we have two more bytes of buffer space and then append C1 and C2. */ -#define BUF_PUSH_2(c1, c2) \ - do { \ - GET_BUFFER_SPACE (2); \ - *b++ = (unsigned char) (c1); \ - *b++ = (unsigned char) (c2); \ - } while (0) - - -/* As with BUF_PUSH_2, except for three bytes. */ -#define BUF_PUSH_3(c1, c2, c3) \ - do { \ - GET_BUFFER_SPACE (3); \ - *b++ = (unsigned char) (c1); \ - *b++ = (unsigned char) (c2); \ - *b++ = (unsigned char) (c3); \ - } while (0) - - -/* Store a jump with opcode OP at LOC to location TO. We store a - relative address offset by the three bytes the jump itself occupies. */ -#define STORE_JUMP(op, loc, to) \ - store_op1 (op, loc, (int) ((to) - (loc) - 3)) - -/* Likewise, for a two-argument jump. */ -#define STORE_JUMP2(op, loc, to, arg) \ - store_op2 (op, loc, (int) ((to) - (loc) - 3), arg) - -/* Like `STORE_JUMP', but for inserting. Assume `b' is the buffer end. */ -#define INSERT_JUMP(op, loc, to) \ - insert_op1 (op, loc, (int) ((to) - (loc) - 3), b) - -/* Like `STORE_JUMP2', but for inserting. Assume `b' is the buffer end. */ -#define INSERT_JUMP2(op, loc, to, arg) \ - insert_op2 (op, loc, (int) ((to) - (loc) - 3), arg, b) - - -/* This is not an arbitrary limit: the arguments which represent offsets - into the pattern are two bytes long. So if 2^16 bytes turns out to - be too small, many things would have to change. */ -/* Any other compiler which, like MSC, has allocation limit below 2^16 - bytes will have to use approach similar to what was done below for - MSC and drop MAX_BUF_SIZE a bit. Otherwise you may end up - reallocating to 0 bytes. Such thing is not going to work too well. - You have been warned!! */ -#if defined _MSC_VER && !defined WIN32 -/* Microsoft C 16-bit versions limit malloc to approx 65512 bytes. - The REALLOC define eliminates a flurry of conversion warnings, - but is not required. */ -# define MAX_BUF_SIZE 65500L -# define REALLOC(p,s) realloc ((p), (size_t) (s)) -#else -# define MAX_BUF_SIZE (1L << 16) -# define REALLOC(p,s) realloc ((p), (s)) -#endif - -/* Extend the buffer by twice its current size via realloc and - reset the pointers that pointed into the old block to point to the - correct places in the new one. If extending the buffer results in it - being larger than MAX_BUF_SIZE, then flag memory exhausted. */ -#define EXTEND_BUFFER() \ - do { \ - unsigned char *old_buffer = bufp->buffer; \ - if (bufp->allocated == MAX_BUF_SIZE) \ - return REG_ESIZE; \ - bufp->allocated <<= 1; \ - if (bufp->allocated > MAX_BUF_SIZE) \ - bufp->allocated = MAX_BUF_SIZE; \ - bufp->buffer = (unsigned char *) REALLOC (bufp->buffer, bufp->allocated);\ - if (bufp->buffer == NULL) \ - return REG_ESPACE; \ - /* If the buffer moved, move all the pointers into it. */ \ - if (old_buffer != bufp->buffer) \ - { \ - b = (b - old_buffer) + bufp->buffer; \ - begalt = (begalt - old_buffer) + bufp->buffer; \ - if (fixup_alt_jump) \ - fixup_alt_jump = (fixup_alt_jump - old_buffer) + bufp->buffer;\ - if (laststart) \ - laststart = (laststart - old_buffer) + bufp->buffer; \ - if (pending_exact) \ - pending_exact = (pending_exact - old_buffer) + bufp->buffer; \ - } \ - } while (0) - - -/* Since we have one byte reserved for the register number argument to - {start,stop}_memory, the maximum number of groups we can report - things about is what fits in that byte. */ -#define MAX_REGNUM 255 - -/* But patterns can have more than `MAX_REGNUM' registers. We just - ignore the excess. */ -typedef unsigned regnum_t; - - -/* Macros for the compile stack. */ - -/* Since offsets can go either forwards or backwards, this type needs to - be able to hold values from -(MAX_BUF_SIZE - 1) to MAX_BUF_SIZE - 1. */ -/* int may be not enough when sizeof(int) == 2. */ -typedef long pattern_offset_t; - -typedef struct -{ - pattern_offset_t begalt_offset; - pattern_offset_t fixup_alt_jump; - pattern_offset_t inner_group_offset; - pattern_offset_t laststart_offset; - regnum_t regnum; -} compile_stack_elt_t; - - -typedef struct -{ - compile_stack_elt_t *stack; - unsigned size; - unsigned avail; /* Offset of next open position. */ -} compile_stack_type; - - -#define INIT_COMPILE_STACK_SIZE 32 - -#define COMPILE_STACK_EMPTY (compile_stack.avail == 0) -#define COMPILE_STACK_FULL (compile_stack.avail == compile_stack.size) - -/* The next available element. */ -#define COMPILE_STACK_TOP (compile_stack.stack[compile_stack.avail]) - - -/* Set the bit for character C in a list. */ -#define SET_LIST_BIT(c) \ - (b[((unsigned char) (c)) / BYTEWIDTH] \ - |= 1 << (((unsigned char) c) % BYTEWIDTH)) - - -/* Get the next unsigned number in the uncompiled pattern. */ -#define GET_UNSIGNED_NUMBER(num) \ - { if (p != pend) \ - { \ - PATFETCH (c); \ - while (ISDIGIT (c)) \ - { \ - if (num < 0) \ - num = 0; \ - num = num * 10 + c - '0'; \ - if (p == pend) \ - break; \ - PATFETCH (c); \ - } \ - } \ - } - -#if defined _LIBC || (defined HAVE_WCTYPE_H && defined HAVE_WCHAR_H) -/* The GNU C library provides support for user-defined character classes - and the functions from ISO C amendement 1. */ -# ifdef CHARCLASS_NAME_MAX -# define CHAR_CLASS_MAX_LENGTH CHARCLASS_NAME_MAX -# else -/* This shouldn't happen but some implementation might still have this - problem. Use a reasonable default value. */ -# define CHAR_CLASS_MAX_LENGTH 256 -# endif - -# ifdef _LIBC -# define IS_CHAR_CLASS(string) __wctype (string) -# else -# define IS_CHAR_CLASS(string) wctype (string) -# endif -#else -# define CHAR_CLASS_MAX_LENGTH 6 /* Namely, `xdigit'. */ - -# define IS_CHAR_CLASS(string) \ - (STREQ (string, "alpha") || STREQ (string, "upper") \ - || STREQ (string, "lower") || STREQ (string, "digit") \ - || STREQ (string, "alnum") || STREQ (string, "xdigit") \ - || STREQ (string, "space") || STREQ (string, "print") \ - || STREQ (string, "punct") || STREQ (string, "graph") \ - || STREQ (string, "cntrl") || STREQ (string, "blank")) -#endif - -#ifndef MATCH_MAY_ALLOCATE - -/* If we cannot allocate large objects within re_match_2_internal, - we make the fail stack and register vectors global. - The fail stack, we grow to the maximum size when a regexp - is compiled. - The register vectors, we adjust in size each time we - compile a regexp, according to the number of registers it needs. */ - -static fail_stack_type fail_stack; - -/* Size with which the following vectors are currently allocated. - That is so we can make them bigger as needed, - but never make them smaller. */ -static int regs_allocated_size; - -static const char ** regstart, ** regend; -static const char ** old_regstart, ** old_regend; -static const char **best_regstart, **best_regend; -static register_info_type *reg_info; -static const char **reg_dummy; -static register_info_type *reg_info_dummy; - -/* Make the register vectors big enough for NUM_REGS registers, - but don't make them smaller. */ - -static -regex_grow_registers (num_regs) - int num_regs; -{ - if (num_regs > regs_allocated_size) - { - RETALLOC_IF (regstart, num_regs, const char *); - RETALLOC_IF (regend, num_regs, const char *); - RETALLOC_IF (old_regstart, num_regs, const char *); - RETALLOC_IF (old_regend, num_regs, const char *); - RETALLOC_IF (best_regstart, num_regs, const char *); - RETALLOC_IF (best_regend, num_regs, const char *); - RETALLOC_IF (reg_info, num_regs, register_info_type); - RETALLOC_IF (reg_dummy, num_regs, const char *); - RETALLOC_IF (reg_info_dummy, num_regs, register_info_type); - - regs_allocated_size = num_regs; - } -} - -#endif /* not MATCH_MAY_ALLOCATE */ - -static boolean group_in_compile_stack _RE_ARGS ((compile_stack_type - compile_stack, - regnum_t regnum)); - -/* `regex_compile' compiles PATTERN (of length SIZE) according to SYNTAX. - Returns one of error codes defined in `gnu-regex.h', or zero for success. - - Assumes the `allocated' (and perhaps `buffer') and `translate' - fields are set in BUFP on entry. - - If it succeeds, results are put in BUFP (if it returns an error, the - contents of BUFP are undefined): - `buffer' is the compiled pattern; - `syntax' is set to SYNTAX; - `used' is set to the length of the compiled pattern; - `fastmap_accurate' is zero; - `re_nsub' is the number of subexpressions in PATTERN; - `not_bol' and `not_eol' are zero; - - The `fastmap' and `newline_anchor' fields are neither - examined nor set. */ - -/* Return, freeing storage we allocated. */ -#define FREE_STACK_RETURN(value) \ - return (free (compile_stack.stack), value) - -static reg_errcode_t -regex_compile (pattern, size, syntax, bufp) - const char *pattern; - size_t size; - reg_syntax_t syntax; - struct re_pattern_buffer *bufp; -{ - /* We fetch characters from PATTERN here. Even though PATTERN is - `char *' (i.e., signed), we declare these variables as unsigned, so - they can be reliably used as array indices. */ - register unsigned char c, c1; - - /* A random temporary spot in PATTERN. */ - const char *p1; - - /* Points to the end of the buffer, where we should append. */ - register unsigned char *b; - - /* Keeps track of unclosed groups. */ - compile_stack_type compile_stack; - - /* Points to the current (ending) position in the pattern. */ - const char *p = pattern; - const char *pend = pattern + size; - - /* How to translate the characters in the pattern. */ - RE_TRANSLATE_TYPE translate = bufp->translate; - - /* Address of the count-byte of the most recently inserted `exactn' - command. This makes it possible to tell if a new exact-match - character can be added to that command or if the character requires - a new `exactn' command. */ - unsigned char *pending_exact = 0; - - /* Address of start of the most recently finished expression. - This tells, e.g., postfix * where to find the start of its - operand. Reset at the beginning of groups and alternatives. */ - unsigned char *laststart = 0; - - /* Address of beginning of regexp, or inside of last group. */ - unsigned char *begalt; - - /* Place in the uncompiled pattern (i.e., the {) to - which to go back if the interval is invalid. */ - const char *beg_interval; - - /* Address of the place where a forward jump should go to the end of - the containing expression. Each alternative of an `or' -- except the - last -- ends with a forward jump of this sort. */ - unsigned char *fixup_alt_jump = 0; - - /* Counts open-groups as they are encountered. Remembered for the - matching close-group on the compile stack, so the same register - number is put in the stop_memory as the start_memory. */ - regnum_t regnum = 0; - -#ifdef DEBUG - DEBUG_PRINT1 ("\nCompiling pattern: "); - if (debug) - { - unsigned debug_count; - - for (debug_count = 0; debug_count < size; debug_count++) - putchar (pattern[debug_count]); - putchar ('\n'); - } -#endif /* DEBUG */ - - /* Initialize the compile stack. */ - compile_stack.stack = TALLOC (INIT_COMPILE_STACK_SIZE, compile_stack_elt_t); - if (compile_stack.stack == NULL) - return REG_ESPACE; - - compile_stack.size = INIT_COMPILE_STACK_SIZE; - compile_stack.avail = 0; - - /* Initialize the pattern buffer. */ - bufp->syntax = syntax; - bufp->fastmap_accurate = 0; - bufp->not_bol = bufp->not_eol = 0; - - /* Set `used' to zero, so that if we return an error, the pattern - printer (for debugging) will think there's no pattern. We reset it - at the end. */ - bufp->used = 0; - - /* Always count groups, whether or not bufp->no_sub is set. */ - bufp->re_nsub = 0; - -#if !defined emacs && !defined SYNTAX_TABLE - /* Initialize the syntax table. */ - init_syntax_once (); -#endif - - if (bufp->allocated == 0) - { - if (bufp->buffer) - { /* If zero allocated, but buffer is non-null, try to realloc - enough space. This loses if buffer's address is bogus, but - that is the user's responsibility. */ - RETALLOC (bufp->buffer, INIT_BUF_SIZE, unsigned char); - } - else - { /* Caller did not allocate a buffer. Do it for them. */ - bufp->buffer = TALLOC (INIT_BUF_SIZE, unsigned char); - } - if (!bufp->buffer) FREE_STACK_RETURN (REG_ESPACE); - - bufp->allocated = INIT_BUF_SIZE; - } - - begalt = b = bufp->buffer; - - /* Loop through the uncompiled pattern until we're at the end. */ - while (p != pend) - { - PATFETCH (c); - - switch (c) - { - case '^': - { - if ( /* If at start of pattern, it's an operator. */ - p == pattern + 1 - /* If context independent, it's an operator. */ - || syntax & RE_CONTEXT_INDEP_ANCHORS - /* Otherwise, depends on what's come before. */ - || at_begline_loc_p (pattern, p, syntax)) - BUF_PUSH (begline); - else - goto normal_char; - } - break; - - - case '$': - { - if ( /* If at end of pattern, it's an operator. */ - p == pend - /* If context independent, it's an operator. */ - || syntax & RE_CONTEXT_INDEP_ANCHORS - /* Otherwise, depends on what's next. */ - || at_endline_loc_p (p, pend, syntax)) - BUF_PUSH (endline); - else - goto normal_char; - } - break; - - - case '+': - case '?': - if ((syntax & RE_BK_PLUS_QM) - || (syntax & RE_LIMITED_OPS)) - goto normal_char; - handle_plus: - case '*': - /* If there is no previous pattern... */ - if (!laststart) - { - if (syntax & RE_CONTEXT_INVALID_OPS) - FREE_STACK_RETURN (REG_BADRPT); - else if (!(syntax & RE_CONTEXT_INDEP_OPS)) - goto normal_char; - } - - { - /* Are we optimizing this jump? */ - boolean keep_string_p = false; - - /* 1 means zero (many) matches is allowed. */ - char zero_times_ok = 0, many_times_ok = 0; - - /* If there is a sequence of repetition chars, collapse it - down to just one (the right one). We can't combine - interval operators with these because of, e.g., `a{2}*', - which should only match an even number of `a's. */ - - for (;;) - { - zero_times_ok |= c != '+'; - many_times_ok |= c != '?'; - - if (p == pend) - break; - - PATFETCH (c); - - if (c == '*' - || (!(syntax & RE_BK_PLUS_QM) && (c == '+' || c == '?'))) - ; - - else if (syntax & RE_BK_PLUS_QM && c == '\\') - { - if (p == pend) FREE_STACK_RETURN (REG_EESCAPE); - - PATFETCH (c1); - if (!(c1 == '+' || c1 == '?')) - { - PATUNFETCH; - PATUNFETCH; - break; - } - - c = c1; - } - else - { - PATUNFETCH; - break; - } - - /* If we get here, we found another repeat character. */ - } - - /* Star, etc. applied to an empty pattern is equivalent - to an empty pattern. */ - if (!laststart) - break; - - /* Now we know whether or not zero matches is allowed - and also whether or not two or more matches is allowed. */ - if (many_times_ok) - { /* More than one repetition is allowed, so put in at the - end a backward relative jump from `b' to before the next - jump we're going to put in below (which jumps from - laststart to after this jump). - - But if we are at the `*' in the exact sequence `.*\n', - insert an unconditional jump backwards to the ., - instead of the beginning of the loop. This way we only - push a failure point once, instead of every time - through the loop. */ - assert (p - 1 > pattern); - - /* Allocate the space for the jump. */ - GET_BUFFER_SPACE (3); - - /* We know we are not at the first character of the pattern, - because laststart was nonzero. And we've already - incremented `p', by the way, to be the character after - the `*'. Do we have to do something analogous here - for null bytes, because of RE_DOT_NOT_NULL? */ - if (TRANSLATE (*(p - 2)) == TRANSLATE ('.') - && zero_times_ok - && p < pend && TRANSLATE (*p) == TRANSLATE ('\n') - && !(syntax & RE_DOT_NEWLINE)) - { /* We have .*\n. */ - STORE_JUMP (jump, b, laststart); - keep_string_p = true; - } - else - /* Anything else. */ - STORE_JUMP (maybe_pop_jump, b, laststart - 3); - - /* We've added more stuff to the buffer. */ - b += 3; - } - - /* On failure, jump from laststart to b + 3, which will be the - end of the buffer after this jump is inserted. */ - GET_BUFFER_SPACE (3); - INSERT_JUMP (keep_string_p ? on_failure_keep_string_jump - : on_failure_jump, - laststart, b + 3); - pending_exact = 0; - b += 3; - - if (!zero_times_ok) - { - /* At least one repetition is required, so insert a - `dummy_failure_jump' before the initial - `on_failure_jump' instruction of the loop. This - effects a skip over that instruction the first time - we hit that loop. */ - GET_BUFFER_SPACE (3); - INSERT_JUMP (dummy_failure_jump, laststart, laststart + 6); - b += 3; - } - } - break; - - - case '.': - laststart = b; - BUF_PUSH (anychar); - break; - - - case '[': - { - boolean had_char_class = false; - - if (p == pend) FREE_STACK_RETURN (REG_EBRACK); - - /* Ensure that we have enough space to push a charset: the - opcode, the length count, and the bitset; 34 bytes in all. */ - GET_BUFFER_SPACE (34); - - laststart = b; - - /* We test `*p == '^' twice, instead of using an if - statement, so we only need one BUF_PUSH. */ - BUF_PUSH (*p == '^' ? charset_not : charset); - if (*p == '^') - p++; - - /* Remember the first position in the bracket expression. */ - p1 = p; - - /* Push the number of bytes in the bitmap. */ - BUF_PUSH ((1 << BYTEWIDTH) / BYTEWIDTH); - - /* Clear the whole map. */ - bzero (b, (1 << BYTEWIDTH) / BYTEWIDTH); - - /* charset_not matches newline according to a syntax bit. */ - if ((re_opcode_t) b[-2] == charset_not - && (syntax & RE_HAT_LISTS_NOT_NEWLINE)) - SET_LIST_BIT ('\n'); - - /* Read in characters and ranges, setting map bits. */ - for (;;) - { - if (p == pend) FREE_STACK_RETURN (REG_EBRACK); - - PATFETCH (c); - - /* \ might escape characters inside [...] and [^...]. */ - if ((syntax & RE_BACKSLASH_ESCAPE_IN_LISTS) && c == '\\') - { - if (p == pend) FREE_STACK_RETURN (REG_EESCAPE); - - PATFETCH (c1); - SET_LIST_BIT (c1); - continue; - } - - /* Could be the end of the bracket expression. If it's - not (i.e., when the bracket expression is `[]' so - far), the ']' character bit gets set way below. */ - if (c == ']' && p != p1 + 1) - break; - - /* Look ahead to see if it's a range when the last thing - was a character class. */ - if (had_char_class && c == '-' && *p != ']') - FREE_STACK_RETURN (REG_ERANGE); - - /* Look ahead to see if it's a range when the last thing - was a character: if this is a hyphen not at the - beginning or the end of a list, then it's the range - operator. */ - if (c == '-' - && !(p - 2 >= pattern && p[-2] == '[') - && !(p - 3 >= pattern && p[-3] == '[' && p[-2] == '^') - && *p != ']') - { - reg_errcode_t ret - = compile_range (&p, pend, translate, syntax, b); - if (ret != REG_NOERROR) FREE_STACK_RETURN (ret); - } - - else if (p[0] == '-' && p[1] != ']') - { /* This handles ranges made up of characters only. */ - reg_errcode_t ret; - - /* Move past the `-'. */ - PATFETCH (c1); - - ret = compile_range (&p, pend, translate, syntax, b); - if (ret != REG_NOERROR) FREE_STACK_RETURN (ret); - } - - /* See if we're at the beginning of a possible character - class. */ - - else if (syntax & RE_CHAR_CLASSES && c == '[' && *p == ':') - { /* Leave room for the null. */ - char str[CHAR_CLASS_MAX_LENGTH + 1]; - - PATFETCH (c); - c1 = 0; - - /* If pattern is `[[:'. */ - if (p == pend) FREE_STACK_RETURN (REG_EBRACK); - - for (;;) - { - PATFETCH (c); - if ((c == ':' && *p == ']') || p == pend - || c1 == CHAR_CLASS_MAX_LENGTH) - break; - str[c1++] = c; - } - str[c1] = '\0'; - - /* If isn't a word bracketed by `[:' and `:]': - undo the ending character, the letters, and leave - the leading `:' and `[' (but set bits for them). */ - if (c == ':' && *p == ']') - { -/* CYGNUS LOCAL: Skip this code if we don't have btowc(). btowc() is */ -/* defined in the 1994 Amendment 1 to ISO C and may not be present on */ -/* systems where we have wchar.h and wctype.h. */ -#if defined _LIBC || (defined HAVE_WCTYPE_H && defined HAVE_WCHAR_H && defined HAVE_BTOWC) - boolean is_lower = STREQ (str, "lower"); - boolean is_upper = STREQ (str, "upper"); - wctype_t wt; - int ch; - - wt = IS_CHAR_CLASS (str); - if (wt == 0) - FREE_STACK_RETURN (REG_ECTYPE); - - /* Throw away the ] at the end of the character - class. */ - PATFETCH (c); - - if (p == pend) FREE_STACK_RETURN (REG_EBRACK); - - for (ch = 0; ch < 1 << BYTEWIDTH; ++ch) - { -# ifdef _LIBC - if (__iswctype (__btowc (ch), wt)) - SET_LIST_BIT (ch); -#else - if (iswctype (btowc (ch), wt)) - SET_LIST_BIT (ch); -#endif - - if (translate && (is_upper || is_lower) - && (ISUPPER (ch) || ISLOWER (ch))) - SET_LIST_BIT (ch); - } - - had_char_class = true; -#else - int ch; - boolean is_alnum = STREQ (str, "alnum"); - boolean is_alpha = STREQ (str, "alpha"); - boolean is_blank = STREQ (str, "blank"); - boolean is_cntrl = STREQ (str, "cntrl"); - boolean is_digit = STREQ (str, "digit"); - boolean is_graph = STREQ (str, "graph"); - boolean is_lower = STREQ (str, "lower"); - boolean is_print = STREQ (str, "print"); - boolean is_punct = STREQ (str, "punct"); - boolean is_space = STREQ (str, "space"); - boolean is_upper = STREQ (str, "upper"); - boolean is_xdigit = STREQ (str, "xdigit"); - - if (!IS_CHAR_CLASS (str)) - FREE_STACK_RETURN (REG_ECTYPE); - - /* Throw away the ] at the end of the character - class. */ - PATFETCH (c); - - if (p == pend) FREE_STACK_RETURN (REG_EBRACK); - - for (ch = 0; ch < 1 << BYTEWIDTH; ch++) - { - /* This was split into 3 if's to - avoid an arbitrary limit in some compiler. */ - if ( (is_alnum && ISALNUM (ch)) - || (is_alpha && ISALPHA (ch)) - || (is_blank && ISBLANK (ch)) - || (is_cntrl && ISCNTRL (ch))) - SET_LIST_BIT (ch); - if ( (is_digit && ISDIGIT (ch)) - || (is_graph && ISGRAPH (ch)) - || (is_lower && ISLOWER (ch)) - || (is_print && ISPRINT (ch))) - SET_LIST_BIT (ch); - if ( (is_punct && ISPUNCT (ch)) - || (is_space && ISSPACE (ch)) - || (is_upper && ISUPPER (ch)) - || (is_xdigit && ISXDIGIT (ch))) - SET_LIST_BIT (ch); - if ( translate && (is_upper || is_lower) - && (ISUPPER (ch) || ISLOWER (ch))) - SET_LIST_BIT (ch); - } - had_char_class = true; -#endif /* libc || wctype.h */ - } - else - { - c1++; - while (c1--) - PATUNFETCH; - SET_LIST_BIT ('['); - SET_LIST_BIT (':'); - had_char_class = false; - } - } - else - { - had_char_class = false; - SET_LIST_BIT (c); - } - } - - /* Discard any (non)matching list bytes that are all 0 at the - end of the map. Decrease the map-length byte too. */ - while ((int) b[-1] > 0 && b[b[-1] - 1] == 0) - b[-1]--; - b += b[-1]; - } - break; - - - case '(': - if (syntax & RE_NO_BK_PARENS) - goto handle_open; - else - goto normal_char; - - - case ')': - if (syntax & RE_NO_BK_PARENS) - goto handle_close; - else - goto normal_char; - - - case '\n': - if (syntax & RE_NEWLINE_ALT) - goto handle_alt; - else - goto normal_char; - - - case '|': - if (syntax & RE_NO_BK_VBAR) - goto handle_alt; - else - goto normal_char; - - - case '{': - if (syntax & RE_INTERVALS && syntax & RE_NO_BK_BRACES) - goto handle_interval; - else - goto normal_char; - - - case '\\': - if (p == pend) FREE_STACK_RETURN (REG_EESCAPE); - - /* Do not translate the character after the \, so that we can - distinguish, e.g., \B from \b, even if we normally would - translate, e.g., B to b. */ - PATFETCH_RAW (c); - - switch (c) - { - case '(': - if (syntax & RE_NO_BK_PARENS) - goto normal_backslash; - - handle_open: - bufp->re_nsub++; - regnum++; - - if (COMPILE_STACK_FULL) - { - RETALLOC (compile_stack.stack, compile_stack.size << 1, - compile_stack_elt_t); - if (compile_stack.stack == NULL) return REG_ESPACE; - - compile_stack.size <<= 1; - } - - /* These are the values to restore when we hit end of this - group. They are all relative offsets, so that if the - whole pattern moves because of realloc, they will still - be valid. */ - COMPILE_STACK_TOP.begalt_offset = begalt - bufp->buffer; - COMPILE_STACK_TOP.fixup_alt_jump - = fixup_alt_jump ? fixup_alt_jump - bufp->buffer + 1 : 0; - COMPILE_STACK_TOP.laststart_offset = b - bufp->buffer; - COMPILE_STACK_TOP.regnum = regnum; - - /* We will eventually replace the 0 with the number of - groups inner to this one. But do not push a - start_memory for groups beyond the last one we can - represent in the compiled pattern. */ - if (regnum <= MAX_REGNUM) - { - COMPILE_STACK_TOP.inner_group_offset = b - bufp->buffer + 2; - BUF_PUSH_3 (start_memory, regnum, 0); - } - - compile_stack.avail++; - - fixup_alt_jump = 0; - laststart = 0; - begalt = b; - /* If we've reached MAX_REGNUM groups, then this open - won't actually generate any code, so we'll have to - clear pending_exact explicitly. */ - pending_exact = 0; - break; - - - case ')': - if (syntax & RE_NO_BK_PARENS) goto normal_backslash; - - if (COMPILE_STACK_EMPTY) - { - if (syntax & RE_UNMATCHED_RIGHT_PAREN_ORD) - goto normal_backslash; - else - FREE_STACK_RETURN (REG_ERPAREN); - } - - handle_close: - if (fixup_alt_jump) - { /* Push a dummy failure point at the end of the - alternative for a possible future - `pop_failure_jump' to pop. See comments at - `push_dummy_failure' in `re_match_2'. */ - BUF_PUSH (push_dummy_failure); - - /* We allocated space for this jump when we assigned - to `fixup_alt_jump', in the `handle_alt' case below. */ - STORE_JUMP (jump_past_alt, fixup_alt_jump, b - 1); - } - - /* See similar code for backslashed left paren above. */ - if (COMPILE_STACK_EMPTY) - { - if (syntax & RE_UNMATCHED_RIGHT_PAREN_ORD) - goto normal_char; - else - FREE_STACK_RETURN (REG_ERPAREN); - } - - /* Since we just checked for an empty stack above, this - ``can't happen''. */ - assert (compile_stack.avail != 0); - { - /* We don't just want to restore into `regnum', because - later groups should continue to be numbered higher, - as in `(ab)c(de)' -- the second group is #2. */ - regnum_t this_group_regnum; - - compile_stack.avail--; - begalt = bufp->buffer + COMPILE_STACK_TOP.begalt_offset; - fixup_alt_jump - = COMPILE_STACK_TOP.fixup_alt_jump - ? bufp->buffer + COMPILE_STACK_TOP.fixup_alt_jump - 1 - : 0; - laststart = bufp->buffer + COMPILE_STACK_TOP.laststart_offset; - this_group_regnum = COMPILE_STACK_TOP.regnum; - /* If we've reached MAX_REGNUM groups, then this open - won't actually generate any code, so we'll have to - clear pending_exact explicitly. */ - pending_exact = 0; - - /* We're at the end of the group, so now we know how many - groups were inside this one. */ - if (this_group_regnum <= MAX_REGNUM) - { - unsigned char *inner_group_loc - = bufp->buffer + COMPILE_STACK_TOP.inner_group_offset; - - *inner_group_loc = regnum - this_group_regnum; - BUF_PUSH_3 (stop_memory, this_group_regnum, - regnum - this_group_regnum); - } - } - break; - - - case '|': /* `\|'. */ - if (syntax & RE_LIMITED_OPS || syntax & RE_NO_BK_VBAR) - goto normal_backslash; - handle_alt: - if (syntax & RE_LIMITED_OPS) - goto normal_char; - - /* Insert before the previous alternative a jump which - jumps to this alternative if the former fails. */ - GET_BUFFER_SPACE (3); - INSERT_JUMP (on_failure_jump, begalt, b + 6); - pending_exact = 0; - b += 3; - - /* The alternative before this one has a jump after it - which gets executed if it gets matched. Adjust that - jump so it will jump to this alternative's analogous - jump (put in below, which in turn will jump to the next - (if any) alternative's such jump, etc.). The last such - jump jumps to the correct final destination. A picture: - _____ _____ - | | | | - | v | v - a | b | c - - If we are at `b', then fixup_alt_jump right now points to a - three-byte space after `a'. We'll put in the jump, set - fixup_alt_jump to right after `b', and leave behind three - bytes which we'll fill in when we get to after `c'. */ - - if (fixup_alt_jump) - STORE_JUMP (jump_past_alt, fixup_alt_jump, b); - - /* Mark and leave space for a jump after this alternative, - to be filled in later either by next alternative or - when know we're at the end of a series of alternatives. */ - fixup_alt_jump = b; - GET_BUFFER_SPACE (3); - b += 3; - - laststart = 0; - begalt = b; - break; - - - case '{': - /* If \{ is a literal. */ - if (!(syntax & RE_INTERVALS) - /* If we're at `\{' and it's not the open-interval - operator. */ - || ((syntax & RE_INTERVALS) && (syntax & RE_NO_BK_BRACES)) - || (p - 2 == pattern && p == pend)) - goto normal_backslash; - - handle_interval: - { - /* If got here, then the syntax allows intervals. */ - - /* At least (most) this many matches must be made. */ - int lower_bound = -1, upper_bound = -1; - - beg_interval = p - 1; - - if (p == pend) - { - if (syntax & RE_NO_BK_BRACES) - goto unfetch_interval; - else - FREE_STACK_RETURN (REG_EBRACE); - } - - GET_UNSIGNED_NUMBER (lower_bound); - - if (c == ',') - { - GET_UNSIGNED_NUMBER (upper_bound); - if (upper_bound < 0) upper_bound = RE_DUP_MAX; - } - else - /* Interval such as `{1}' => match exactly once. */ - upper_bound = lower_bound; - - if (lower_bound < 0 || upper_bound > RE_DUP_MAX - || lower_bound > upper_bound) - { - if (syntax & RE_NO_BK_BRACES) - goto unfetch_interval; - else - FREE_STACK_RETURN (REG_BADBR); - } - - if (!(syntax & RE_NO_BK_BRACES)) - { - if (c != '\\') FREE_STACK_RETURN (REG_EBRACE); - - PATFETCH (c); - } - - if (c != '}') - { - if (syntax & RE_NO_BK_BRACES) - goto unfetch_interval; - else - FREE_STACK_RETURN (REG_BADBR); - } - - /* We just parsed a valid interval. */ - - /* If it's invalid to have no preceding re. */ - if (!laststart) - { - if (syntax & RE_CONTEXT_INVALID_OPS) - FREE_STACK_RETURN (REG_BADRPT); - else if (syntax & RE_CONTEXT_INDEP_OPS) - laststart = b; - else - goto unfetch_interval; - } - - /* If the upper bound is zero, don't want to succeed at - all; jump from `laststart' to `b + 3', which will be - the end of the buffer after we insert the jump. */ - if (upper_bound == 0) - { - GET_BUFFER_SPACE (3); - INSERT_JUMP (jump, laststart, b + 3); - b += 3; - } - - /* Otherwise, we have a nontrivial interval. When - we're all done, the pattern will look like: - set_number_at <jump count> <upper bound> - set_number_at <succeed_n count> <lower bound> - succeed_n <after jump addr> <succeed_n count> - <body of loop> - jump_n <succeed_n addr> <jump count> - (The upper bound and `jump_n' are omitted if - `upper_bound' is 1, though.) */ - else - { /* If the upper bound is > 1, we need to insert - more at the end of the loop. */ - unsigned nbytes = 10 + (upper_bound > 1) * 10; - - GET_BUFFER_SPACE (nbytes); - - /* Initialize lower bound of the `succeed_n', even - though it will be set during matching by its - attendant `set_number_at' (inserted next), - because `re_compile_fastmap' needs to know. - Jump to the `jump_n' we might insert below. */ - INSERT_JUMP2 (succeed_n, laststart, - b + 5 + (upper_bound > 1) * 5, - lower_bound); - b += 5; - - /* Code to initialize the lower bound. Insert - before the `succeed_n'. The `5' is the last two - bytes of this `set_number_at', plus 3 bytes of - the following `succeed_n'. */ - insert_op2 (set_number_at, laststart, 5, lower_bound, b); - b += 5; - - if (upper_bound > 1) - { /* More than one repetition is allowed, so - append a backward jump to the `succeed_n' - that starts this interval. - - When we've reached this during matching, - we'll have matched the interval once, so - jump back only `upper_bound - 1' times. */ - STORE_JUMP2 (jump_n, b, laststart + 5, - upper_bound - 1); - b += 5; - - /* The location we want to set is the second - parameter of the `jump_n'; that is `b-2' as - an absolute address. `laststart' will be - the `set_number_at' we're about to insert; - `laststart+3' the number to set, the source - for the relative address. But we are - inserting into the middle of the pattern -- - so everything is getting moved up by 5. - Conclusion: (b - 2) - (laststart + 3) + 5, - i.e., b - laststart. - - We insert this at the beginning of the loop - so that if we fail during matching, we'll - reinitialize the bounds. */ - insert_op2 (set_number_at, laststart, b - laststart, - upper_bound - 1, b); - b += 5; - } - } - pending_exact = 0; - beg_interval = NULL; - } - break; - - unfetch_interval: - /* If an invalid interval, match the characters as literals. */ - assert (beg_interval); - p = beg_interval; - beg_interval = NULL; - - /* normal_char and normal_backslash need `c'. */ - PATFETCH (c); - - if (!(syntax & RE_NO_BK_BRACES)) - { - if (p > pattern && p[-1] == '\\') - goto normal_backslash; - } - goto normal_char; - -#ifdef emacs - /* There is no way to specify the before_dot and after_dot - operators. rms says this is ok. --karl */ - case '=': - BUF_PUSH (at_dot); - break; - - case 's': - laststart = b; - PATFETCH (c); - BUF_PUSH_2 (syntaxspec, syntax_spec_code[c]); - break; - - case 'S': - laststart = b; - PATFETCH (c); - BUF_PUSH_2 (notsyntaxspec, syntax_spec_code[c]); - break; -#endif /* emacs */ - - - case 'w': - if (syntax & RE_NO_GNU_OPS) - goto normal_char; - laststart = b; - BUF_PUSH (wordchar); - break; - - - case 'W': - if (syntax & RE_NO_GNU_OPS) - goto normal_char; - laststart = b; - BUF_PUSH (notwordchar); - break; - - - case '<': - if (syntax & RE_NO_GNU_OPS) - goto normal_char; - BUF_PUSH (wordbeg); - break; - - case '>': - if (syntax & RE_NO_GNU_OPS) - goto normal_char; - BUF_PUSH (wordend); - break; - - case 'b': - if (syntax & RE_NO_GNU_OPS) - goto normal_char; - BUF_PUSH (wordbound); - break; - - case 'B': - if (syntax & RE_NO_GNU_OPS) - goto normal_char; - BUF_PUSH (notwordbound); - break; - - case '`': - if (syntax & RE_NO_GNU_OPS) - goto normal_char; - BUF_PUSH (begbuf); - break; - - case '\'': - if (syntax & RE_NO_GNU_OPS) - goto normal_char; - BUF_PUSH (endbuf); - break; - - case '1': case '2': case '3': case '4': case '5': - case '6': case '7': case '8': case '9': - if (syntax & RE_NO_BK_REFS) - goto normal_char; - - c1 = c - '0'; - - if (c1 > regnum) - FREE_STACK_RETURN (REG_ESUBREG); - - /* Can't back reference to a subexpression if inside of it. */ - if (group_in_compile_stack (compile_stack, (regnum_t) c1)) - goto normal_char; - - laststart = b; - BUF_PUSH_2 (duplicate, c1); - break; - - - case '+': - case '?': - if (syntax & RE_BK_PLUS_QM) - goto handle_plus; - else - goto normal_backslash; - - default: - normal_backslash: - /* You might think it would be useful for \ to mean - not to translate; but if we don't translate it - it will never match anything. */ - c = TRANSLATE (c); - goto normal_char; - } - break; - - - default: - /* Expects the character in `c'. */ - normal_char: - /* If no exactn currently being built. */ - if (!pending_exact - - /* If last exactn not at current position. */ - || pending_exact + *pending_exact + 1 != b - - /* We have only one byte following the exactn for the count. */ - || *pending_exact == (1 << BYTEWIDTH) - 1 - - /* If followed by a repetition operator. */ - || *p == '*' || *p == '^' - || ((syntax & RE_BK_PLUS_QM) - ? *p == '\\' && (p[1] == '+' || p[1] == '?') - : (*p == '+' || *p == '?')) - || ((syntax & RE_INTERVALS) - && ((syntax & RE_NO_BK_BRACES) - ? *p == '{' - : (p[0] == '\\' && p[1] == '{')))) - { - /* Start building a new exactn. */ - - laststart = b; - - BUF_PUSH_2 (exactn, 0); - pending_exact = b - 1; - } - - BUF_PUSH (c); - (*pending_exact)++; - break; - } /* switch (c) */ - } /* while p != pend */ - - - /* Through the pattern now. */ - - if (fixup_alt_jump) - STORE_JUMP (jump_past_alt, fixup_alt_jump, b); - - if (!COMPILE_STACK_EMPTY) - FREE_STACK_RETURN (REG_EPAREN); - - /* If we don't want backtracking, force success - the first time we reach the end of the compiled pattern. */ - if (syntax & RE_NO_POSIX_BACKTRACKING) - BUF_PUSH (succeed); - - free (compile_stack.stack); - - /* We have succeeded; set the length of the buffer. */ - bufp->used = b - bufp->buffer; - -#ifdef DEBUG - if (debug) - { - DEBUG_PRINT1 ("\nCompiled pattern: \n"); - print_compiled_pattern (bufp); - } -#endif /* DEBUG */ - -#ifndef MATCH_MAY_ALLOCATE - /* Initialize the failure stack to the largest possible stack. This - isn't necessary unless we're trying to avoid calling alloca in - the search and match routines. */ - { - int num_regs = bufp->re_nsub + 1; - - /* Since DOUBLE_FAIL_STACK refuses to double only if the current size - is strictly greater than re_max_failures, the largest possible stack - is 2 * re_max_failures failure points. */ - if (fail_stack.size < (2 * re_max_failures * MAX_FAILURE_ITEMS)) - { - fail_stack.size = (2 * re_max_failures * MAX_FAILURE_ITEMS); - -# ifdef emacs - if (! fail_stack.stack) - fail_stack.stack - = (fail_stack_elt_t *) xmalloc (fail_stack.size - * sizeof (fail_stack_elt_t)); - else - fail_stack.stack - = (fail_stack_elt_t *) xrealloc (fail_stack.stack, - (fail_stack.size - * sizeof (fail_stack_elt_t))); -# else /* not emacs */ - if (! fail_stack.stack) - fail_stack.stack - = (fail_stack_elt_t *) malloc (fail_stack.size - * sizeof (fail_stack_elt_t)); - else - fail_stack.stack - = (fail_stack_elt_t *) realloc (fail_stack.stack, - (fail_stack.size - * sizeof (fail_stack_elt_t))); -# endif /* not emacs */ - } - - regex_grow_registers (num_regs); - } -#endif /* not MATCH_MAY_ALLOCATE */ - - return REG_NOERROR; -} /* regex_compile */ - -/* Subroutines for `regex_compile'. */ - -/* Store OP at LOC followed by two-byte integer parameter ARG. */ - -static void -store_op1 (op, loc, arg) - re_opcode_t op; - unsigned char *loc; - int arg; -{ - *loc = (unsigned char) op; - STORE_NUMBER (loc + 1, arg); -} - - -/* Like `store_op1', but for two two-byte parameters ARG1 and ARG2. */ - -static void -store_op2 (op, loc, arg1, arg2) - re_opcode_t op; - unsigned char *loc; - int arg1, arg2; -{ - *loc = (unsigned char) op; - STORE_NUMBER (loc + 1, arg1); - STORE_NUMBER (loc + 3, arg2); -} - - -/* Copy the bytes from LOC to END to open up three bytes of space at LOC - for OP followed by two-byte integer parameter ARG. */ - -static void -insert_op1 (op, loc, arg, end) - re_opcode_t op; - unsigned char *loc; - int arg; - unsigned char *end; -{ - register unsigned char *pfrom = end; - register unsigned char *pto = end + 3; - - while (pfrom != loc) - *--pto = *--pfrom; - - store_op1 (op, loc, arg); -} - - -/* Like `insert_op1', but for two two-byte parameters ARG1 and ARG2. */ - -static void -insert_op2 (op, loc, arg1, arg2, end) - re_opcode_t op; - unsigned char *loc; - int arg1, arg2; - unsigned char *end; -{ - register unsigned char *pfrom = end; - register unsigned char *pto = end + 5; - - while (pfrom != loc) - *--pto = *--pfrom; - - store_op2 (op, loc, arg1, arg2); -} - - -/* P points to just after a ^ in PATTERN. Return true if that ^ comes - after an alternative or a begin-subexpression. We assume there is at - least one character before the ^. */ - -static boolean -at_begline_loc_p (pattern, p, syntax) - const char *pattern, *p; - reg_syntax_t syntax; -{ - const char *prev = p - 2; - boolean prev_prev_backslash = prev > pattern && prev[-1] == '\\'; - - return - /* After a subexpression? */ - (*prev == '(' && (syntax & RE_NO_BK_PARENS || prev_prev_backslash)) - /* After an alternative? */ - || (*prev == '|' && (syntax & RE_NO_BK_VBAR || prev_prev_backslash)); -} - - -/* The dual of at_begline_loc_p. This one is for $. We assume there is - at least one character after the $, i.e., `P < PEND'. */ - -static boolean -at_endline_loc_p (p, pend, syntax) - const char *p, *pend; - reg_syntax_t syntax; -{ - const char *next = p; - boolean next_backslash = *next == '\\'; - const char *next_next = p + 1 < pend ? p + 1 : 0; - - return - /* Before a subexpression? */ - (syntax & RE_NO_BK_PARENS ? *next == ')' - : next_backslash && next_next && *next_next == ')') - /* Before an alternative? */ - || (syntax & RE_NO_BK_VBAR ? *next == '|' - : next_backslash && next_next && *next_next == '|'); -} - - -/* Returns true if REGNUM is in one of COMPILE_STACK's elements and - false if it's not. */ - -static boolean -group_in_compile_stack (compile_stack, regnum) - compile_stack_type compile_stack; - regnum_t regnum; -{ - int this_element; - - for (this_element = compile_stack.avail - 1; - this_element >= 0; - this_element--) - if (compile_stack.stack[this_element].regnum == regnum) - return true; - - return false; -} - - -/* Read the ending character of a range (in a bracket expression) from the - uncompiled pattern *P_PTR (which ends at PEND). We assume the - starting character is in `P[-2]'. (`P[-1]' is the character `-'.) - Then we set the translation of all bits between the starting and - ending characters (inclusive) in the compiled pattern B. - - Return an error code. - - We use these short variable names so we can use the same macros as - `regex_compile' itself. */ - -static reg_errcode_t -compile_range (p_ptr, pend, translate, syntax, b) - const char **p_ptr, *pend; - RE_TRANSLATE_TYPE translate; - reg_syntax_t syntax; - unsigned char *b; -{ - unsigned this_char; - - const char *p = *p_ptr; - unsigned int range_start, range_end; - - if (p == pend) - return REG_ERANGE; - - /* Even though the pattern is a signed `char *', we need to fetch - with unsigned char *'s; if the high bit of the pattern character - is set, the range endpoints will be negative if we fetch using a - signed char *. - - We also want to fetch the endpoints without translating them; the - appropriate translation is done in the bit-setting loop below. */ - /* The SVR4 compiler on the 3B2 had trouble with unsigned const char *. */ - range_start = ((const unsigned char *) p)[-2]; - range_end = ((const unsigned char *) p)[0]; - - /* Have to increment the pointer into the pattern string, so the - caller isn't still at the ending character. */ - (*p_ptr)++; - - /* If the start is after the end, the range is empty. */ - if (range_start > range_end) - return syntax & RE_NO_EMPTY_RANGES ? REG_ERANGE : REG_NOERROR; - - /* Here we see why `this_char' has to be larger than an `unsigned - char' -- the range is inclusive, so if `range_end' == 0xff - (assuming 8-bit characters), we would otherwise go into an infinite - loop, since all characters <= 0xff. */ - for (this_char = range_start; this_char <= range_end; this_char++) - { - SET_LIST_BIT (TRANSLATE (this_char)); - } - - return REG_NOERROR; -} - -/* re_compile_fastmap computes a ``fastmap'' for the compiled pattern in - BUFP. A fastmap records which of the (1 << BYTEWIDTH) possible - characters can start a string that matches the pattern. This fastmap - is used by re_search to skip quickly over impossible starting points. - - The caller must supply the address of a (1 << BYTEWIDTH)-byte data - area as BUFP->fastmap. - - We set the `fastmap', `fastmap_accurate', and `can_be_null' fields in - the pattern buffer. - - Returns 0 if we succeed, -2 if an internal error. */ - -int -re_compile_fastmap (bufp) - struct re_pattern_buffer *bufp; -{ - int j, k; -#ifdef MATCH_MAY_ALLOCATE - fail_stack_type fail_stack; -#endif -#ifndef REGEX_MALLOC - char *destination; -#endif - - register char *fastmap = bufp->fastmap; - unsigned char *pattern = bufp->buffer; - unsigned char *p = pattern; - register unsigned char *pend = pattern + bufp->used; - -#ifdef REL_ALLOC - /* This holds the pointer to the failure stack, when - it is allocated relocatably. */ - fail_stack_elt_t *failure_stack_ptr; -#endif - - /* Assume that each path through the pattern can be null until - proven otherwise. We set this false at the bottom of switch - statement, to which we get only if a particular path doesn't - match the empty string. */ - boolean path_can_be_null = true; - - /* We aren't doing a `succeed_n' to begin with. */ - boolean succeed_n_p = false; - - assert (fastmap != NULL && p != NULL); - - INIT_FAIL_STACK (); - bzero (fastmap, 1 << BYTEWIDTH); /* Assume nothing's valid. */ - bufp->fastmap_accurate = 1; /* It will be when we're done. */ - bufp->can_be_null = 0; - - while (1) - { - if (p == pend || *p == succeed) - { - /* We have reached the (effective) end of pattern. */ - if (!FAIL_STACK_EMPTY ()) - { - bufp->can_be_null |= path_can_be_null; - - /* Reset for next path. */ - path_can_be_null = true; - - p = fail_stack.stack[--fail_stack.avail].pointer; - - continue; - } - else - break; - } - - /* We should never be about to go beyond the end of the pattern. */ - assert (p < pend); - - switch (SWITCH_ENUM_CAST ((re_opcode_t) *p++)) - { - - /* I guess the idea here is to simply not bother with a fastmap - if a backreference is used, since it's too hard to figure out - the fastmap for the corresponding group. Setting - `can_be_null' stops `re_search_2' from using the fastmap, so - that is all we do. */ - case duplicate: - bufp->can_be_null = 1; - goto done; - - - /* Following are the cases which match a character. These end - with `break'. */ - - case exactn: - fastmap[p[1]] = 1; - break; - - - case charset: - for (j = *p++ * BYTEWIDTH - 1; j >= 0; j--) - if (p[j / BYTEWIDTH] & (1 << (j % BYTEWIDTH))) - fastmap[j] = 1; - break; - - - case charset_not: - /* Chars beyond end of map must be allowed. */ - for (j = *p * BYTEWIDTH; j < (1 << BYTEWIDTH); j++) - fastmap[j] = 1; - - for (j = *p++ * BYTEWIDTH - 1; j >= 0; j--) - if (!(p[j / BYTEWIDTH] & (1 << (j % BYTEWIDTH)))) - fastmap[j] = 1; - break; - - - case wordchar: - for (j = 0; j < (1 << BYTEWIDTH); j++) - if (SYNTAX (j) == Sword) - fastmap[j] = 1; - break; - - - case notwordchar: - for (j = 0; j < (1 << BYTEWIDTH); j++) - if (SYNTAX (j) != Sword) - fastmap[j] = 1; - break; - - - case anychar: - { - int fastmap_newline = fastmap['\n']; - - /* `.' matches anything ... */ - for (j = 0; j < (1 << BYTEWIDTH); j++) - fastmap[j] = 1; - - /* ... except perhaps newline. */ - if (!(bufp->syntax & RE_DOT_NEWLINE)) - fastmap['\n'] = fastmap_newline; - - /* Return if we have already set `can_be_null'; if we have, - then the fastmap is irrelevant. Something's wrong here. */ - else if (bufp->can_be_null) - goto done; - - /* Otherwise, have to check alternative paths. */ - break; - } - -#ifdef emacs - case syntaxspec: - k = *p++; - for (j = 0; j < (1 << BYTEWIDTH); j++) - if (SYNTAX (j) == (enum syntaxcode) k) - fastmap[j] = 1; - break; - - - case notsyntaxspec: - k = *p++; - for (j = 0; j < (1 << BYTEWIDTH); j++) - if (SYNTAX (j) != (enum syntaxcode) k) - fastmap[j] = 1; - break; - - - /* All cases after this match the empty string. These end with - `continue'. */ - - - case before_dot: - case at_dot: - case after_dot: - continue; -#endif /* emacs */ - - - case no_op: - case begline: - case endline: - case begbuf: - case endbuf: - case wordbound: - case notwordbound: - case wordbeg: - case wordend: - case push_dummy_failure: - continue; - - - case jump_n: - case pop_failure_jump: - case maybe_pop_jump: - case jump: - case jump_past_alt: - case dummy_failure_jump: - EXTRACT_NUMBER_AND_INCR (j, p); - p += j; - if (j > 0) - continue; - - /* Jump backward implies we just went through the body of a - loop and matched nothing. Opcode jumped to should be - `on_failure_jump' or `succeed_n'. Just treat it like an - ordinary jump. For a * loop, it has pushed its failure - point already; if so, discard that as redundant. */ - if ((re_opcode_t) *p != on_failure_jump - && (re_opcode_t) *p != succeed_n) - continue; - - p++; - EXTRACT_NUMBER_AND_INCR (j, p); - p += j; - - /* If what's on the stack is where we are now, pop it. */ - if (!FAIL_STACK_EMPTY () - && fail_stack.stack[fail_stack.avail - 1].pointer == p) - fail_stack.avail--; - - continue; - - - case on_failure_jump: - case on_failure_keep_string_jump: - handle_on_failure_jump: - EXTRACT_NUMBER_AND_INCR (j, p); - - /* For some patterns, e.g., `(a?)?', `p+j' here points to the - end of the pattern. We don't want to push such a point, - since when we restore it above, entering the switch will - increment `p' past the end of the pattern. We don't need - to push such a point since we obviously won't find any more - fastmap entries beyond `pend'. Such a pattern can match - the null string, though. */ - if (p + j < pend) - { - if (!PUSH_PATTERN_OP (p + j, fail_stack)) - { - RESET_FAIL_STACK (); - return -2; - } - } - else - bufp->can_be_null = 1; - - if (succeed_n_p) - { - EXTRACT_NUMBER_AND_INCR (k, p); /* Skip the n. */ - succeed_n_p = false; - } - - continue; - - - case succeed_n: - /* Get to the number of times to succeed. */ - p += 2; - - /* Increment p past the n for when k != 0. */ - EXTRACT_NUMBER_AND_INCR (k, p); - if (k == 0) - { - p -= 4; - succeed_n_p = true; /* Spaghetti code alert. */ - goto handle_on_failure_jump; - } - continue; - - - case set_number_at: - p += 4; - continue; - - - case start_memory: - case stop_memory: - p += 2; - continue; - - - default: - abort (); /* We have listed all the cases. */ - } /* switch *p++ */ - - /* Getting here means we have found the possible starting - characters for one path of the pattern -- and that the empty - string does not match. We need not follow this path further. - Instead, look at the next alternative (remembered on the - stack), or quit if no more. The test at the top of the loop - does these things. */ - path_can_be_null = false; - p = pend; - } /* while p */ - - /* Set `can_be_null' for the last path (also the first path, if the - pattern is empty). */ - bufp->can_be_null |= path_can_be_null; - - done: - RESET_FAIL_STACK (); - return 0; -} /* re_compile_fastmap */ -#ifdef _LIBC -weak_alias (__re_compile_fastmap, re_compile_fastmap) -#endif - -/* Set REGS to hold NUM_REGS registers, storing them in STARTS and - ENDS. Subsequent matches using PATTERN_BUFFER and REGS will use - this memory for recording register information. STARTS and ENDS - must be allocated using the malloc library routine, and must each - be at least NUM_REGS * sizeof (regoff_t) bytes long. - - If NUM_REGS == 0, then subsequent matches should allocate their own - register data. - - Unless this function is called, the first search or match using - PATTERN_BUFFER will allocate its own register data, without - freeing the old data. */ - -void -re_set_registers (bufp, regs, num_regs, starts, ends) - struct re_pattern_buffer *bufp; - struct re_registers *regs; - unsigned num_regs; - regoff_t *starts, *ends; -{ - if (num_regs) - { - bufp->regs_allocated = REGS_REALLOCATE; - regs->num_regs = num_regs; - regs->start = starts; - regs->end = ends; - } - else - { - bufp->regs_allocated = REGS_UNALLOCATED; - regs->num_regs = 0; - regs->start = regs->end = (regoff_t *) 0; - } -} -#ifdef _LIBC -weak_alias (__re_set_registers, re_set_registers) -#endif - -/* Searching routines. */ - -/* Like re_search_2, below, but only one string is specified, and - doesn't let you say where to stop matching. */ - -int -re_search (bufp, string, size, startpos, range, regs) - struct re_pattern_buffer *bufp; - const char *string; - int size, startpos, range; - struct re_registers *regs; -{ - return re_search_2 (bufp, NULL, 0, string, size, startpos, range, - regs, size); -} -#ifdef _LIBC -weak_alias (__re_search, re_search) -#endif - - -/* Using the compiled pattern in BUFP->buffer, first tries to match the - virtual concatenation of STRING1 and STRING2, starting first at index - STARTPOS, then at STARTPOS + 1, and so on. - - STRING1 and STRING2 have length SIZE1 and SIZE2, respectively. - - RANGE is how far to scan while trying to match. RANGE = 0 means try - only at STARTPOS; in general, the last start tried is STARTPOS + - RANGE. - - In REGS, return the indices of the virtual concatenation of STRING1 - and STRING2 that matched the entire BUFP->buffer and its contained - subexpressions. - - Do not consider matching one past the index STOP in the virtual - concatenation of STRING1 and STRING2. - - We return either the position in the strings at which the match was - found, -1 if no match, or -2 if error (such as failure - stack overflow). */ - -int -re_search_2 (bufp, string1, size1, string2, size2, startpos, range, regs, stop) - struct re_pattern_buffer *bufp; - const char *string1, *string2; - int size1, size2; - int startpos; - int range; - struct re_registers *regs; - int stop; -{ - int val; - register char *fastmap = bufp->fastmap; - register RE_TRANSLATE_TYPE translate = bufp->translate; - int total_size = size1 + size2; - int endpos = startpos + range; - - /* Check for out-of-range STARTPOS. */ - if (startpos < 0 || startpos > total_size) - return -1; - - /* Fix up RANGE if it might eventually take us outside - the virtual concatenation of STRING1 and STRING2. - Make sure we won't move STARTPOS below 0 or above TOTAL_SIZE. */ - if (endpos < 0) - range = 0 - startpos; - else if (endpos > total_size) - range = total_size - startpos; - - /* If the search isn't to be a backwards one, don't waste time in a - search for a pattern that must be anchored. */ - if (bufp->used > 0 && (re_opcode_t) bufp->buffer[0] == begbuf && range > 0) - { - if (startpos > 0) - return -1; - else - range = 1; - } - -#ifdef emacs - /* In a forward search for something that starts with \=. - don't keep searching past point. */ - if (bufp->used > 0 && (re_opcode_t) bufp->buffer[0] == at_dot && range > 0) - { - range = PT - startpos; - if (range <= 0) - return -1; - } -#endif /* emacs */ - - /* Update the fastmap now if not correct already. */ - if (fastmap && !bufp->fastmap_accurate) - if (re_compile_fastmap (bufp) == -2) - return -2; - - /* Loop through the string, looking for a place to start matching. */ - for (;;) - { - /* If a fastmap is supplied, skip quickly over characters that - cannot be the start of a match. If the pattern can match the - null string, however, we don't need to skip characters; we want - the first null string. */ - if (fastmap && startpos < total_size && !bufp->can_be_null) - { - if (range > 0) /* Searching forwards. */ - { - register const char *d; - register int lim = 0; - int irange = range; - - if (startpos < size1 && startpos + range >= size1) - lim = range - (size1 - startpos); - - d = (startpos >= size1 ? string2 - size1 : string1) + startpos; - - /* Written out as an if-else to avoid testing `translate' - inside the loop. */ - if (translate) - while (range > lim - && !fastmap[(unsigned char) - translate[(unsigned char) *d++]]) - range--; - else - while (range > lim && !fastmap[(unsigned char) *d++]) - range--; - - startpos += irange - range; - } - else /* Searching backwards. */ - { - register char c = (size1 == 0 || startpos >= size1 - ? string2[startpos - size1] - : string1[startpos]); - - if (!fastmap[(unsigned char) TRANSLATE (c)]) - goto advance; - } - } - - /* If can't match the null string, and that's all we have left, fail. */ - if (range >= 0 && startpos == total_size && fastmap - && !bufp->can_be_null) - return -1; - - val = re_match_2_internal (bufp, string1, size1, string2, size2, - startpos, regs, stop); -#ifndef REGEX_MALLOC -# ifdef C_ALLOCA - alloca (0); -# endif -#endif - - if (val >= 0) - return startpos; - - if (val == -2) - return -2; - - advance: - if (!range) - break; - else if (range > 0) - { - range--; - startpos++; - } - else - { - range++; - startpos--; - } - } - return -1; -} /* re_search_2 */ -#ifdef _LIBC -weak_alias (__re_search_2, re_search_2) -#endif - -/* This converts PTR, a pointer into one of the search strings `string1' - and `string2' into an offset from the beginning of that string. */ -#define POINTER_TO_OFFSET(ptr) \ - (FIRST_STRING_P (ptr) \ - ? ((regoff_t) ((ptr) - string1)) \ - : ((regoff_t) ((ptr) - string2 + size1))) - -/* Macros for dealing with the split strings in re_match_2. */ - -#define MATCHING_IN_FIRST_STRING (dend == end_match_1) - -/* Call before fetching a character with *d. This switches over to - string2 if necessary. */ -#define PREFETCH() \ - while (d == dend) \ - { \ - /* End of string2 => fail. */ \ - if (dend == end_match_2) \ - goto fail; \ - /* End of string1 => advance to string2. */ \ - d = string2; \ - dend = end_match_2; \ - } - - -/* Test if at very beginning or at very end of the virtual concatenation - of `string1' and `string2'. If only one string, it's `string2'. */ -#define AT_STRINGS_BEG(d) ((d) == (size1 ? string1 : string2) || !size2) -#define AT_STRINGS_END(d) ((d) == end2) - - -/* Test if D points to a character which is word-constituent. We have - two special cases to check for: if past the end of string1, look at - the first character in string2; and if before the beginning of - string2, look at the last character in string1. */ -#define WORDCHAR_P(d) \ - (SYNTAX ((d) == end1 ? *string2 \ - : (d) == string2 - 1 ? *(end1 - 1) : *(d)) \ - == Sword) - -/* Disabled due to a compiler bug -- see comment at case wordbound */ -#if 0 -/* Test if the character before D and the one at D differ with respect - to being word-constituent. */ -#define AT_WORD_BOUNDARY(d) \ - (AT_STRINGS_BEG (d) || AT_STRINGS_END (d) \ - || WORDCHAR_P (d - 1) != WORDCHAR_P (d)) -#endif - -/* Free everything we malloc. */ -#ifdef MATCH_MAY_ALLOCATE -# define FREE_VAR(var) if (var) REGEX_FREE (var); var = NULL -# define FREE_VARIABLES() \ - do { \ - REGEX_FREE_STACK (fail_stack.stack); \ - FREE_VAR (regstart); \ - FREE_VAR (regend); \ - FREE_VAR (old_regstart); \ - FREE_VAR (old_regend); \ - FREE_VAR (best_regstart); \ - FREE_VAR (best_regend); \ - FREE_VAR (reg_info); \ - FREE_VAR (reg_dummy); \ - FREE_VAR (reg_info_dummy); \ - } while (0) -#else -# define FREE_VARIABLES() ((void)0) /* Do nothing! But inhibit gcc warning. */ -#endif /* not MATCH_MAY_ALLOCATE */ - -/* These values must meet several constraints. They must not be valid - register values; since we have a limit of 255 registers (because - we use only one byte in the pattern for the register number), we can - use numbers larger than 255. They must differ by 1, because of - NUM_FAILURE_ITEMS above. And the value for the lowest register must - be larger than the value for the highest register, so we do not try - to actually save any registers when none are active. */ -#define NO_HIGHEST_ACTIVE_REG (1 << BYTEWIDTH) -#define NO_LOWEST_ACTIVE_REG (NO_HIGHEST_ACTIVE_REG + 1) - -/* Matching routines. */ - -#ifndef emacs /* Emacs never uses this. */ -/* re_match is like re_match_2 except it takes only a single string. */ - -int -re_match (bufp, string, size, pos, regs) - struct re_pattern_buffer *bufp; - const char *string; - int size, pos; - struct re_registers *regs; -{ - int result = re_match_2_internal (bufp, NULL, 0, string, size, - pos, regs, size); -# ifndef REGEX_MALLOC -# ifdef C_ALLOCA - alloca (0); -# endif -# endif - return result; -} -# ifdef _LIBC -weak_alias (__re_match, re_match) -# endif -#endif /* not emacs */ - -static boolean group_match_null_string_p _RE_ARGS ((unsigned char **p, - unsigned char *end, - register_info_type *reg_info)); -static boolean alt_match_null_string_p _RE_ARGS ((unsigned char *p, - unsigned char *end, - register_info_type *reg_info)); -static boolean common_op_match_null_string_p _RE_ARGS ((unsigned char **p, - unsigned char *end, - register_info_type *reg_info)); -static int bcmp_translate _RE_ARGS ((const char *s1, const char *s2, - int len, char *translate)); - -/* re_match_2 matches the compiled pattern in BUFP against the - the (virtual) concatenation of STRING1 and STRING2 (of length SIZE1 - and SIZE2, respectively). We start matching at POS, and stop - matching at STOP. - - If REGS is non-null and the `no_sub' field of BUFP is nonzero, we - store offsets for the substring each group matched in REGS. See the - documentation for exactly how many groups we fill. - - We return -1 if no match, -2 if an internal error (such as the - failure stack overflowing). Otherwise, we return the length of the - matched substring. */ - -int -re_match_2 (bufp, string1, size1, string2, size2, pos, regs, stop) - struct re_pattern_buffer *bufp; - const char *string1, *string2; - int size1, size2; - int pos; - struct re_registers *regs; - int stop; -{ - int result = re_match_2_internal (bufp, string1, size1, string2, size2, - pos, regs, stop); -#ifndef REGEX_MALLOC -# ifdef C_ALLOCA - alloca (0); -# endif -#endif - return result; -} -#ifdef _LIBC -weak_alias (__re_match_2, re_match_2) -#endif - -/* This is a separate function so that we can force an alloca cleanup - afterwards. */ -static int -re_match_2_internal (bufp, string1, size1, string2, size2, pos, regs, stop) - struct re_pattern_buffer *bufp; - const char *string1, *string2; - int size1, size2; - int pos; - struct re_registers *regs; - int stop; -{ - /* General temporaries. */ - int mcnt; - unsigned char *p1; - - /* Just past the end of the corresponding string. */ - const char *end1, *end2; - - /* Pointers into string1 and string2, just past the last characters in - each to consider matching. */ - const char *end_match_1, *end_match_2; - - /* Where we are in the data, and the end of the current string. */ - const char *d, *dend; - - /* Where we are in the pattern, and the end of the pattern. */ - unsigned char *p = bufp->buffer; - register unsigned char *pend = p + bufp->used; - - /* Mark the opcode just after a start_memory, so we can test for an - empty subpattern when we get to the stop_memory. */ - unsigned char *just_past_start_mem = 0; - - /* We use this to map every character in the string. */ - RE_TRANSLATE_TYPE translate = bufp->translate; - - /* Failure point stack. Each place that can handle a failure further - down the line pushes a failure point on this stack. It consists of - restart, regend, and reg_info for all registers corresponding to - the subexpressions we're currently inside, plus the number of such - registers, and, finally, two char *'s. The first char * is where - to resume scanning the pattern; the second one is where to resume - scanning the strings. If the latter is zero, the failure point is - a ``dummy''; if a failure happens and the failure point is a dummy, - it gets discarded and the next next one is tried. */ -#ifdef MATCH_MAY_ALLOCATE /* otherwise, this is global. */ - fail_stack_type fail_stack; -#endif -#ifdef DEBUG - static unsigned failure_id = 0; - unsigned nfailure_points_pushed = 0, nfailure_points_popped = 0; -#endif - -#ifdef REL_ALLOC - /* This holds the pointer to the failure stack, when - it is allocated relocatably. */ - fail_stack_elt_t *failure_stack_ptr; -#endif - - /* We fill all the registers internally, independent of what we - return, for use in backreferences. The number here includes - an element for register zero. */ - size_t num_regs = bufp->re_nsub + 1; - - /* The currently active registers. */ - active_reg_t lowest_active_reg = NO_LOWEST_ACTIVE_REG; - active_reg_t highest_active_reg = NO_HIGHEST_ACTIVE_REG; - - /* Information on the contents of registers. These are pointers into - the input strings; they record just what was matched (on this - attempt) by a subexpression part of the pattern, that is, the - regnum-th regstart pointer points to where in the pattern we began - matching and the regnum-th regend points to right after where we - stopped matching the regnum-th subexpression. (The zeroth register - keeps track of what the whole pattern matches.) */ -#ifdef MATCH_MAY_ALLOCATE /* otherwise, these are global. */ - const char **regstart, **regend; -#endif - - /* If a group that's operated upon by a repetition operator fails to - match anything, then the register for its start will need to be - restored because it will have been set to wherever in the string we - are when we last see its open-group operator. Similarly for a - register's end. */ -#ifdef MATCH_MAY_ALLOCATE /* otherwise, these are global. */ - const char **old_regstart, **old_regend; -#endif - - /* The is_active field of reg_info helps us keep track of which (possibly - nested) subexpressions we are currently in. The matched_something - field of reg_info[reg_num] helps us tell whether or not we have - matched any of the pattern so far this time through the reg_num-th - subexpression. These two fields get reset each time through any - loop their register is in. */ -#ifdef MATCH_MAY_ALLOCATE /* otherwise, this is global. */ - register_info_type *reg_info; -#endif - - /* The following record the register info as found in the above - variables when we find a match better than any we've seen before. - This happens as we backtrack through the failure points, which in - turn happens only if we have not yet matched the entire string. */ - unsigned best_regs_set = false; -#ifdef MATCH_MAY_ALLOCATE /* otherwise, these are global. */ - const char **best_regstart, **best_regend; -#endif - - /* Logically, this is `best_regend[0]'. But we don't want to have to - allocate space for that if we're not allocating space for anything - else (see below). Also, we never need info about register 0 for - any of the other register vectors, and it seems rather a kludge to - treat `best_regend' differently than the rest. So we keep track of - the end of the best match so far in a separate variable. We - initialize this to NULL so that when we backtrack the first time - and need to test it, it's not garbage. */ - const char *match_end = NULL; - - /* This helps SET_REGS_MATCHED avoid doing redundant work. */ - int set_regs_matched_done = 0; - - /* Used when we pop values we don't care about. */ -#ifdef MATCH_MAY_ALLOCATE /* otherwise, these are global. */ - const char **reg_dummy; - register_info_type *reg_info_dummy; -#endif - -#ifdef DEBUG - /* Counts the total number of registers pushed. */ - unsigned num_regs_pushed = 0; -#endif - - DEBUG_PRINT1 ("\n\nEntering re_match_2.\n"); - - INIT_FAIL_STACK (); - -#ifdef MATCH_MAY_ALLOCATE - /* Do not bother to initialize all the register variables if there are - no groups in the pattern, as it takes a fair amount of time. If - there are groups, we include space for register 0 (the whole - pattern), even though we never use it, since it simplifies the - array indexing. We should fix this. */ - if (bufp->re_nsub) - { - regstart = REGEX_TALLOC (num_regs, const char *); - regend = REGEX_TALLOC (num_regs, const char *); - old_regstart = REGEX_TALLOC (num_regs, const char *); - old_regend = REGEX_TALLOC (num_regs, const char *); - best_regstart = REGEX_TALLOC (num_regs, const char *); - best_regend = REGEX_TALLOC (num_regs, const char *); - reg_info = REGEX_TALLOC (num_regs, register_info_type); - reg_dummy = REGEX_TALLOC (num_regs, const char *); - reg_info_dummy = REGEX_TALLOC (num_regs, register_info_type); - - if (!(regstart && regend && old_regstart && old_regend && reg_info - && best_regstart && best_regend && reg_dummy && reg_info_dummy)) - { - FREE_VARIABLES (); - return -2; - } - } - else - { - /* We must initialize all our variables to NULL, so that - `FREE_VARIABLES' doesn't try to free them. */ - regstart = regend = old_regstart = old_regend = best_regstart - = best_regend = reg_dummy = NULL; - reg_info = reg_info_dummy = (register_info_type *) NULL; - } -#endif /* MATCH_MAY_ALLOCATE */ - - /* The starting position is bogus. */ - if (pos < 0 || pos > size1 + size2) - { - FREE_VARIABLES (); - return -1; - } - - /* Initialize subexpression text positions to -1 to mark ones that no - start_memory/stop_memory has been seen for. Also initialize the - register information struct. */ - for (mcnt = 1; (unsigned) mcnt < num_regs; mcnt++) - { - regstart[mcnt] = regend[mcnt] - = old_regstart[mcnt] = old_regend[mcnt] = REG_UNSET_VALUE; - - REG_MATCH_NULL_STRING_P (reg_info[mcnt]) = MATCH_NULL_UNSET_VALUE; - IS_ACTIVE (reg_info[mcnt]) = 0; - MATCHED_SOMETHING (reg_info[mcnt]) = 0; - EVER_MATCHED_SOMETHING (reg_info[mcnt]) = 0; - } - - /* We move `string1' into `string2' if the latter's empty -- but not if - `string1' is null. */ - if (size2 == 0 && string1 != NULL) - { - string2 = string1; - size2 = size1; - string1 = 0; - size1 = 0; - } - end1 = string1 + size1; - end2 = string2 + size2; - - /* Compute where to stop matching, within the two strings. */ - if (stop <= size1) - { - end_match_1 = string1 + stop; - end_match_2 = string2; - } - else - { - end_match_1 = end1; - end_match_2 = string2 + stop - size1; - } - - /* `p' scans through the pattern as `d' scans through the data. - `dend' is the end of the input string that `d' points within. `d' - is advanced into the following input string whenever necessary, but - this happens before fetching; therefore, at the beginning of the - loop, `d' can be pointing at the end of a string, but it cannot - equal `string2'. */ - if (size1 > 0 && pos <= size1) - { - d = string1 + pos; - dend = end_match_1; - } - else - { - d = string2 + pos - size1; - dend = end_match_2; - } - - DEBUG_PRINT1 ("The compiled pattern is:\n"); - DEBUG_PRINT_COMPILED_PATTERN (bufp, p, pend); - DEBUG_PRINT1 ("The string to match is: `"); - DEBUG_PRINT_DOUBLE_STRING (d, string1, size1, string2, size2); - DEBUG_PRINT1 ("'\n"); - - /* This loops over pattern commands. It exits by returning from the - function if the match is complete, or it drops through if the match - fails at this starting point in the input data. */ - for (;;) - { -#ifdef _LIBC - DEBUG_PRINT2 ("\n%p: ", p); -#else - DEBUG_PRINT2 ("\n0x%x: ", p); -#endif - - if (p == pend) - { /* End of pattern means we might have succeeded. */ - DEBUG_PRINT1 ("end of pattern ... "); - - /* If we haven't matched the entire string, and we want the - longest match, try backtracking. */ - if (d != end_match_2) - { - /* 1 if this match ends in the same string (string1 or string2) - as the best previous match. */ - boolean same_str_p = (FIRST_STRING_P (match_end) - == MATCHING_IN_FIRST_STRING); - /* 1 if this match is the best seen so far. */ - boolean best_match_p; - - /* AIX compiler got confused when this was combined - with the previous declaration. */ - if (same_str_p) - best_match_p = d > match_end; - else - best_match_p = !MATCHING_IN_FIRST_STRING; - - DEBUG_PRINT1 ("backtracking.\n"); - - if (!FAIL_STACK_EMPTY ()) - { /* More failure points to try. */ - - /* If exceeds best match so far, save it. */ - if (!best_regs_set || best_match_p) - { - best_regs_set = true; - match_end = d; - - DEBUG_PRINT1 ("\nSAVING match as best so far.\n"); - - for (mcnt = 1; (unsigned) mcnt < num_regs; mcnt++) - { - best_regstart[mcnt] = regstart[mcnt]; - best_regend[mcnt] = regend[mcnt]; - } - } - goto fail; - } - - /* If no failure points, don't restore garbage. And if - last match is real best match, don't restore second - best one. */ - else if (best_regs_set && !best_match_p) - { - restore_best_regs: - /* Restore best match. It may happen that `dend == - end_match_1' while the restored d is in string2. - For example, the pattern `x.*y.*z' against the - strings `x-' and `y-z-', if the two strings are - not consecutive in memory. */ - DEBUG_PRINT1 ("Restoring best registers.\n"); - - d = match_end; - dend = ((d >= string1 && d <= end1) - ? end_match_1 : end_match_2); - - for (mcnt = 1; (unsigned) mcnt < num_regs; mcnt++) - { - regstart[mcnt] = best_regstart[mcnt]; - regend[mcnt] = best_regend[mcnt]; - } - } - } /* d != end_match_2 */ - - succeed_label: - DEBUG_PRINT1 ("Accepting match.\n"); - - /* If caller wants register contents data back, do it. */ - if (regs && !bufp->no_sub) - { - /* Have the register data arrays been allocated? */ - if (bufp->regs_allocated == REGS_UNALLOCATED) - { /* No. So allocate them with malloc. We need one - extra element beyond `num_regs' for the `-1' marker - GNU code uses. */ - regs->num_regs = MAX (RE_NREGS, num_regs + 1); - regs->start = TALLOC (regs->num_regs, regoff_t); - regs->end = TALLOC (regs->num_regs, regoff_t); - if (regs->start == NULL || regs->end == NULL) - { - FREE_VARIABLES (); - return -2; - } - bufp->regs_allocated = REGS_REALLOCATE; - } - else if (bufp->regs_allocated == REGS_REALLOCATE) - { /* Yes. If we need more elements than were already - allocated, reallocate them. If we need fewer, just - leave it alone. */ - if (regs->num_regs < num_regs + 1) - { - regs->num_regs = num_regs + 1; - RETALLOC (regs->start, regs->num_regs, regoff_t); - RETALLOC (regs->end, regs->num_regs, regoff_t); - if (regs->start == NULL || regs->end == NULL) - { - FREE_VARIABLES (); - return -2; - } - } - } - else - { - /* These braces fend off a "empty body in an else-statement" - warning under GCC when assert expands to nothing. */ - assert (bufp->regs_allocated == REGS_FIXED); - } - - /* Convert the pointer data in `regstart' and `regend' to - indices. Register zero has to be set differently, - since we haven't kept track of any info for it. */ - if (regs->num_regs > 0) - { - regs->start[0] = pos; - regs->end[0] = (MATCHING_IN_FIRST_STRING - ? ((regoff_t) (d - string1)) - : ((regoff_t) (d - string2 + size1))); - } - - /* Go through the first `min (num_regs, regs->num_regs)' - registers, since that is all we initialized. */ - for (mcnt = 1; (unsigned) mcnt < MIN (num_regs, regs->num_regs); - mcnt++) - { - if (REG_UNSET (regstart[mcnt]) || REG_UNSET (regend[mcnt])) - regs->start[mcnt] = regs->end[mcnt] = -1; - else - { - regs->start[mcnt] - = (regoff_t) POINTER_TO_OFFSET (regstart[mcnt]); - regs->end[mcnt] - = (regoff_t) POINTER_TO_OFFSET (regend[mcnt]); - } - } - - /* If the regs structure we return has more elements than - were in the pattern, set the extra elements to -1. If - we (re)allocated the registers, this is the case, - because we always allocate enough to have at least one - -1 at the end. */ - for (mcnt = num_regs; (unsigned) mcnt < regs->num_regs; mcnt++) - regs->start[mcnt] = regs->end[mcnt] = -1; - } /* regs && !bufp->no_sub */ - - DEBUG_PRINT4 ("%u failure points pushed, %u popped (%u remain).\n", - nfailure_points_pushed, nfailure_points_popped, - nfailure_points_pushed - nfailure_points_popped); - DEBUG_PRINT2 ("%u registers pushed.\n", num_regs_pushed); - - mcnt = d - pos - (MATCHING_IN_FIRST_STRING - ? string1 - : string2 - size1); - - DEBUG_PRINT2 ("Returning %d from re_match_2.\n", mcnt); - - FREE_VARIABLES (); - return mcnt; - } - - /* Otherwise match next pattern command. */ - switch (SWITCH_ENUM_CAST ((re_opcode_t) *p++)) - { - /* Ignore these. Used to ignore the n of succeed_n's which - currently have n == 0. */ - case no_op: - DEBUG_PRINT1 ("EXECUTING no_op.\n"); - break; - - case succeed: - DEBUG_PRINT1 ("EXECUTING succeed.\n"); - goto succeed_label; - - /* Match the next n pattern characters exactly. The following - byte in the pattern defines n, and the n bytes after that - are the characters to match. */ - case exactn: - mcnt = *p++; - DEBUG_PRINT2 ("EXECUTING exactn %d.\n", mcnt); - - /* This is written out as an if-else so we don't waste time - testing `translate' inside the loop. */ - if (translate) - { - do - { - PREFETCH (); - if ((unsigned char) translate[(unsigned char) *d++] - != (unsigned char) *p++) - goto fail; - } - while (--mcnt); - } - else - { - do - { - PREFETCH (); - if (*d++ != (char) *p++) goto fail; - } - while (--mcnt); - } - SET_REGS_MATCHED (); - break; - - - /* Match any character except possibly a newline or a null. */ - case anychar: - DEBUG_PRINT1 ("EXECUTING anychar.\n"); - - PREFETCH (); - - if ((!(bufp->syntax & RE_DOT_NEWLINE) && TRANSLATE (*d) == '\n') - || (bufp->syntax & RE_DOT_NOT_NULL && TRANSLATE (*d) == '\000')) - goto fail; - - SET_REGS_MATCHED (); - DEBUG_PRINT2 (" Matched `%d'.\n", *d); - d++; - break; - - - case charset: - case charset_not: - { - register unsigned char c; - boolean not = (re_opcode_t) *(p - 1) == charset_not; - - DEBUG_PRINT2 ("EXECUTING charset%s.\n", not ? "_not" : ""); - - PREFETCH (); - c = TRANSLATE (*d); /* The character to match. */ - - /* Cast to `unsigned' instead of `unsigned char' in case the - bit list is a full 32 bytes long. */ - if (c < (unsigned) (*p * BYTEWIDTH) - && p[1 + c / BYTEWIDTH] & (1 << (c % BYTEWIDTH))) - not = !not; - - p += 1 + *p; - - if (!not) goto fail; - - SET_REGS_MATCHED (); - d++; - break; - } - - - /* The beginning of a group is represented by start_memory. - The arguments are the register number in the next byte, and the - number of groups inner to this one in the next. The text - matched within the group is recorded (in the internal - registers data structure) under the register number. */ - case start_memory: - DEBUG_PRINT3 ("EXECUTING start_memory %d (%d):\n", *p, p[1]); - - /* Find out if this group can match the empty string. */ - p1 = p; /* To send to group_match_null_string_p. */ - - if (REG_MATCH_NULL_STRING_P (reg_info[*p]) == MATCH_NULL_UNSET_VALUE) - REG_MATCH_NULL_STRING_P (reg_info[*p]) - = group_match_null_string_p (&p1, pend, reg_info); - - /* Save the position in the string where we were the last time - we were at this open-group operator in case the group is - operated upon by a repetition operator, e.g., with `(a*)*b' - against `ab'; then we want to ignore where we are now in - the string in case this attempt to match fails. */ - old_regstart[*p] = REG_MATCH_NULL_STRING_P (reg_info[*p]) - ? REG_UNSET (regstart[*p]) ? d : regstart[*p] - : regstart[*p]; - DEBUG_PRINT2 (" old_regstart: %d\n", - POINTER_TO_OFFSET (old_regstart[*p])); - - regstart[*p] = d; - DEBUG_PRINT2 (" regstart: %d\n", POINTER_TO_OFFSET (regstart[*p])); - - IS_ACTIVE (reg_info[*p]) = 1; - MATCHED_SOMETHING (reg_info[*p]) = 0; - - /* Clear this whenever we change the register activity status. */ - set_regs_matched_done = 0; - - /* This is the new highest active register. */ - highest_active_reg = *p; - - /* If nothing was active before, this is the new lowest active - register. */ - if (lowest_active_reg == NO_LOWEST_ACTIVE_REG) - lowest_active_reg = *p; - - /* Move past the register number and inner group count. */ - p += 2; - just_past_start_mem = p; - - break; - - - /* The stop_memory opcode represents the end of a group. Its - arguments are the same as start_memory's: the register - number, and the number of inner groups. */ - case stop_memory: - DEBUG_PRINT3 ("EXECUTING stop_memory %d (%d):\n", *p, p[1]); - - /* We need to save the string position the last time we were at - this close-group operator in case the group is operated - upon by a repetition operator, e.g., with `((a*)*(b*)*)*' - against `aba'; then we want to ignore where we are now in - the string in case this attempt to match fails. */ - old_regend[*p] = REG_MATCH_NULL_STRING_P (reg_info[*p]) - ? REG_UNSET (regend[*p]) ? d : regend[*p] - : regend[*p]; - DEBUG_PRINT2 (" old_regend: %d\n", - POINTER_TO_OFFSET (old_regend[*p])); - - regend[*p] = d; - DEBUG_PRINT2 (" regend: %d\n", POINTER_TO_OFFSET (regend[*p])); - - /* This register isn't active anymore. */ - IS_ACTIVE (reg_info[*p]) = 0; - - /* Clear this whenever we change the register activity status. */ - set_regs_matched_done = 0; - - /* If this was the only register active, nothing is active - anymore. */ - if (lowest_active_reg == highest_active_reg) - { - lowest_active_reg = NO_LOWEST_ACTIVE_REG; - highest_active_reg = NO_HIGHEST_ACTIVE_REG; - } - else - { /* We must scan for the new highest active register, since - it isn't necessarily one less than now: consider - (a(b)c(d(e)f)g). When group 3 ends, after the f), the - new highest active register is 1. */ - unsigned char r = *p - 1; - while (r > 0 && !IS_ACTIVE (reg_info[r])) - r--; - - /* If we end up at register zero, that means that we saved - the registers as the result of an `on_failure_jump', not - a `start_memory', and we jumped to past the innermost - `stop_memory'. For example, in ((.)*) we save - registers 1 and 2 as a result of the *, but when we pop - back to the second ), we are at the stop_memory 1. - Thus, nothing is active. */ - if (r == 0) - { - lowest_active_reg = NO_LOWEST_ACTIVE_REG; - highest_active_reg = NO_HIGHEST_ACTIVE_REG; - } - else - highest_active_reg = r; - } - - /* If just failed to match something this time around with a - group that's operated on by a repetition operator, try to - force exit from the ``loop'', and restore the register - information for this group that we had before trying this - last match. */ - if ((!MATCHED_SOMETHING (reg_info[*p]) - || just_past_start_mem == p - 1) - && (p + 2) < pend) - { - boolean is_a_jump_n = false; - - p1 = p + 2; - mcnt = 0; - switch ((re_opcode_t) *p1++) - { - case jump_n: - is_a_jump_n = true; - case pop_failure_jump: - case maybe_pop_jump: - case jump: - case dummy_failure_jump: - EXTRACT_NUMBER_AND_INCR (mcnt, p1); - if (is_a_jump_n) - p1 += 2; - break; - - default: - /* do nothing */ ; - } - p1 += mcnt; - - /* If the next operation is a jump backwards in the pattern - to an on_failure_jump right before the start_memory - corresponding to this stop_memory, exit from the loop - by forcing a failure after pushing on the stack the - on_failure_jump's jump in the pattern, and d. */ - if (mcnt < 0 && (re_opcode_t) *p1 == on_failure_jump - && (re_opcode_t) p1[3] == start_memory && p1[4] == *p) - { - /* If this group ever matched anything, then restore - what its registers were before trying this last - failed match, e.g., with `(a*)*b' against `ab' for - regstart[1], and, e.g., with `((a*)*(b*)*)*' - against `aba' for regend[3]. - - Also restore the registers for inner groups for, - e.g., `((a*)(b*))*' against `aba' (register 3 would - otherwise get trashed). */ - - if (EVER_MATCHED_SOMETHING (reg_info[*p])) - { - unsigned r; - - EVER_MATCHED_SOMETHING (reg_info[*p]) = 0; - - /* Restore this and inner groups' (if any) registers. */ - for (r = *p; r < (unsigned) *p + (unsigned) *(p + 1); - r++) - { - regstart[r] = old_regstart[r]; - - /* xx why this test? */ - if (old_regend[r] >= regstart[r]) - regend[r] = old_regend[r]; - } - } - p1++; - EXTRACT_NUMBER_AND_INCR (mcnt, p1); - PUSH_FAILURE_POINT (p1 + mcnt, d, -2); - - goto fail; - } - } - - /* Move past the register number and the inner group count. */ - p += 2; - break; - - - /* \<digit> has been turned into a `duplicate' command which is - followed by the numeric value of <digit> as the register number. */ - case duplicate: - { - register const char *d2, *dend2; - int regno = *p++; /* Get which register to match against. */ - DEBUG_PRINT2 ("EXECUTING duplicate %d.\n", regno); - - /* Can't back reference a group which we've never matched. */ - if (REG_UNSET (regstart[regno]) || REG_UNSET (regend[regno])) - goto fail; - - /* Where in input to try to start matching. */ - d2 = regstart[regno]; - - /* Where to stop matching; if both the place to start and - the place to stop matching are in the same string, then - set to the place to stop, otherwise, for now have to use - the end of the first string. */ - - dend2 = ((FIRST_STRING_P (regstart[regno]) - == FIRST_STRING_P (regend[regno])) - ? regend[regno] : end_match_1); - for (;;) - { - /* If necessary, advance to next segment in register - contents. */ - while (d2 == dend2) - { - if (dend2 == end_match_2) break; - if (dend2 == regend[regno]) break; - - /* End of string1 => advance to string2. */ - d2 = string2; - dend2 = regend[regno]; - } - /* At end of register contents => success */ - if (d2 == dend2) break; - - /* If necessary, advance to next segment in data. */ - PREFETCH (); - - /* How many characters left in this segment to match. */ - mcnt = dend - d; - - /* Want how many consecutive characters we can match in - one shot, so, if necessary, adjust the count. */ - if (mcnt > dend2 - d2) - mcnt = dend2 - d2; - - /* Compare that many; failure if mismatch, else move - past them. */ - if (translate - ? bcmp_translate (d, d2, mcnt, translate) - : memcmp (d, d2, mcnt)) - goto fail; - d += mcnt, d2 += mcnt; - - /* Do this because we've match some characters. */ - SET_REGS_MATCHED (); - } - } - break; - - - /* begline matches the empty string at the beginning of the string - (unless `not_bol' is set in `bufp'), and, if - `newline_anchor' is set, after newlines. */ - case begline: - DEBUG_PRINT1 ("EXECUTING begline.\n"); - - if (AT_STRINGS_BEG (d)) - { - if (!bufp->not_bol) break; - } - else if (d[-1] == '\n' && bufp->newline_anchor) - { - break; - } - /* In all other cases, we fail. */ - goto fail; - - - /* endline is the dual of begline. */ - case endline: - DEBUG_PRINT1 ("EXECUTING endline.\n"); - - if (AT_STRINGS_END (d)) - { - if (!bufp->not_eol) break; - } - - /* We have to ``prefetch'' the next character. */ - else if ((d == end1 ? *string2 : *d) == '\n' - && bufp->newline_anchor) - { - break; - } - goto fail; - - - /* Match at the very beginning of the data. */ - case begbuf: - DEBUG_PRINT1 ("EXECUTING begbuf.\n"); - if (AT_STRINGS_BEG (d)) - break; - goto fail; - - - /* Match at the very end of the data. */ - case endbuf: - DEBUG_PRINT1 ("EXECUTING endbuf.\n"); - if (AT_STRINGS_END (d)) - break; - goto fail; - - - /* on_failure_keep_string_jump is used to optimize `.*\n'. It - pushes NULL as the value for the string on the stack. Then - `pop_failure_point' will keep the current value for the - string, instead of restoring it. To see why, consider - matching `foo\nbar' against `.*\n'. The .* matches the foo; - then the . fails against the \n. But the next thing we want - to do is match the \n against the \n; if we restored the - string value, we would be back at the foo. - - Because this is used only in specific cases, we don't need to - check all the things that `on_failure_jump' does, to make - sure the right things get saved on the stack. Hence we don't - share its code. The only reason to push anything on the - stack at all is that otherwise we would have to change - `anychar's code to do something besides goto fail in this - case; that seems worse than this. */ - case on_failure_keep_string_jump: - DEBUG_PRINT1 ("EXECUTING on_failure_keep_string_jump"); - - EXTRACT_NUMBER_AND_INCR (mcnt, p); -#ifdef _LIBC - DEBUG_PRINT3 (" %d (to %p):\n", mcnt, p + mcnt); -#else - DEBUG_PRINT3 (" %d (to 0x%x):\n", mcnt, p + mcnt); -#endif - - PUSH_FAILURE_POINT (p + mcnt, NULL, -2); - break; - - - /* Uses of on_failure_jump: - - Each alternative starts with an on_failure_jump that points - to the beginning of the next alternative. Each alternative - except the last ends with a jump that in effect jumps past - the rest of the alternatives. (They really jump to the - ending jump of the following alternative, because tensioning - these jumps is a hassle.) - - Repeats start with an on_failure_jump that points past both - the repetition text and either the following jump or - pop_failure_jump back to this on_failure_jump. */ - case on_failure_jump: - on_failure: - DEBUG_PRINT1 ("EXECUTING on_failure_jump"); - - EXTRACT_NUMBER_AND_INCR (mcnt, p); -#ifdef _LIBC - DEBUG_PRINT3 (" %d (to %p)", mcnt, p + mcnt); -#else - DEBUG_PRINT3 (" %d (to 0x%x)", mcnt, p + mcnt); -#endif - - /* If this on_failure_jump comes right before a group (i.e., - the original * applied to a group), save the information - for that group and all inner ones, so that if we fail back - to this point, the group's information will be correct. - For example, in \(a*\)*\1, we need the preceding group, - and in \(zz\(a*\)b*\)\2, we need the inner group. */ - - /* We can't use `p' to check ahead because we push - a failure point to `p + mcnt' after we do this. */ - p1 = p; - - /* We need to skip no_op's before we look for the - start_memory in case this on_failure_jump is happening as - the result of a completed succeed_n, as in \(a\)\{1,3\}b\1 - against aba. */ - while (p1 < pend && (re_opcode_t) *p1 == no_op) - p1++; - - if (p1 < pend && (re_opcode_t) *p1 == start_memory) - { - /* We have a new highest active register now. This will - get reset at the start_memory we are about to get to, - but we will have saved all the registers relevant to - this repetition op, as described above. */ - highest_active_reg = *(p1 + 1) + *(p1 + 2); - if (lowest_active_reg == NO_LOWEST_ACTIVE_REG) - lowest_active_reg = *(p1 + 1); - } - - DEBUG_PRINT1 (":\n"); - PUSH_FAILURE_POINT (p + mcnt, d, -2); - break; - - - /* A smart repeat ends with `maybe_pop_jump'. - We change it to either `pop_failure_jump' or `jump'. */ - case maybe_pop_jump: - EXTRACT_NUMBER_AND_INCR (mcnt, p); - DEBUG_PRINT2 ("EXECUTING maybe_pop_jump %d.\n", mcnt); - { - register unsigned char *p2 = p; - - /* Compare the beginning of the repeat with what in the - pattern follows its end. If we can establish that there - is nothing that they would both match, i.e., that we - would have to backtrack because of (as in, e.g., `a*a') - then we can change to pop_failure_jump, because we'll - never have to backtrack. - - This is not true in the case of alternatives: in - `(a|ab)*' we do need to backtrack to the `ab' alternative - (e.g., if the string was `ab'). But instead of trying to - detect that here, the alternative has put on a dummy - failure point which is what we will end up popping. */ - - /* Skip over open/close-group commands. - If what follows this loop is a ...+ construct, - look at what begins its body, since we will have to - match at least one of that. */ - while (1) - { - if (p2 + 2 < pend - && ((re_opcode_t) *p2 == stop_memory - || (re_opcode_t) *p2 == start_memory)) - p2 += 3; - else if (p2 + 6 < pend - && (re_opcode_t) *p2 == dummy_failure_jump) - p2 += 6; - else - break; - } - - p1 = p + mcnt; - /* p1[0] ... p1[2] are the `on_failure_jump' corresponding - to the `maybe_finalize_jump' of this case. Examine what - follows. */ - - /* If we're at the end of the pattern, we can change. */ - if (p2 == pend) - { - /* Consider what happens when matching ":\(.*\)" - against ":/". I don't really understand this code - yet. */ - p[-3] = (unsigned char) pop_failure_jump; - DEBUG_PRINT1 - (" End of pattern: change to `pop_failure_jump'.\n"); - } - - else if ((re_opcode_t) *p2 == exactn - || (bufp->newline_anchor && (re_opcode_t) *p2 == endline)) - { - register unsigned char c - = *p2 == (unsigned char) endline ? '\n' : p2[2]; - - if ((re_opcode_t) p1[3] == exactn && p1[5] != c) - { - p[-3] = (unsigned char) pop_failure_jump; - DEBUG_PRINT3 (" %c != %c => pop_failure_jump.\n", - c, p1[5]); - } - - else if ((re_opcode_t) p1[3] == charset - || (re_opcode_t) p1[3] == charset_not) - { - int not = (re_opcode_t) p1[3] == charset_not; - - if (c < (unsigned char) (p1[4] * BYTEWIDTH) - && p1[5 + c / BYTEWIDTH] & (1 << (c % BYTEWIDTH))) - not = !not; - - /* `not' is equal to 1 if c would match, which means - that we can't change to pop_failure_jump. */ - if (!not) - { - p[-3] = (unsigned char) pop_failure_jump; - DEBUG_PRINT1 (" No match => pop_failure_jump.\n"); - } - } - } - else if ((re_opcode_t) *p2 == charset) - { -#ifdef DEBUG - register unsigned char c - = *p2 == (unsigned char) endline ? '\n' : p2[2]; -#endif - -#if 0 - if ((re_opcode_t) p1[3] == exactn - && ! ((int) p2[1] * BYTEWIDTH > (int) p1[5] - && (p2[2 + p1[5] / BYTEWIDTH] - & (1 << (p1[5] % BYTEWIDTH))))) -#else - if ((re_opcode_t) p1[3] == exactn - && ! ((int) p2[1] * BYTEWIDTH > (int) p1[4] - && (p2[2 + p1[4] / BYTEWIDTH] - & (1 << (p1[4] % BYTEWIDTH))))) -#endif - { - p[-3] = (unsigned char) pop_failure_jump; - DEBUG_PRINT3 (" %c != %c => pop_failure_jump.\n", - c, p1[5]); - } - - else if ((re_opcode_t) p1[3] == charset_not) - { - int idx; - /* We win if the charset_not inside the loop - lists every character listed in the charset after. */ - for (idx = 0; idx < (int) p2[1]; idx++) - if (! (p2[2 + idx] == 0 - || (idx < (int) p1[4] - && ((p2[2 + idx] & ~ p1[5 + idx]) == 0)))) - break; - - if (idx == p2[1]) - { - p[-3] = (unsigned char) pop_failure_jump; - DEBUG_PRINT1 (" No match => pop_failure_jump.\n"); - } - } - else if ((re_opcode_t) p1[3] == charset) - { - int idx; - /* We win if the charset inside the loop - has no overlap with the one after the loop. */ - for (idx = 0; - idx < (int) p2[1] && idx < (int) p1[4]; - idx++) - if ((p2[2 + idx] & p1[5 + idx]) != 0) - break; - - if (idx == p2[1] || idx == p1[4]) - { - p[-3] = (unsigned char) pop_failure_jump; - DEBUG_PRINT1 (" No match => pop_failure_jump.\n"); - } - } - } - } - p -= 2; /* Point at relative address again. */ - if ((re_opcode_t) p[-1] != pop_failure_jump) - { - p[-1] = (unsigned char) jump; - DEBUG_PRINT1 (" Match => jump.\n"); - goto unconditional_jump; - } - /* Note fall through. */ - - - /* The end of a simple repeat has a pop_failure_jump back to - its matching on_failure_jump, where the latter will push a - failure point. The pop_failure_jump takes off failure - points put on by this pop_failure_jump's matching - on_failure_jump; we got through the pattern to here from the - matching on_failure_jump, so didn't fail. */ - case pop_failure_jump: - { - /* We need to pass separate storage for the lowest and - highest registers, even though we don't care about the - actual values. Otherwise, we will restore only one - register from the stack, since lowest will == highest in - `pop_failure_point'. */ - active_reg_t dummy_low_reg, dummy_high_reg; - unsigned char *pdummy; - const char *sdummy; - - DEBUG_PRINT1 ("EXECUTING pop_failure_jump.\n"); - POP_FAILURE_POINT (sdummy, pdummy, - dummy_low_reg, dummy_high_reg, - reg_dummy, reg_dummy, reg_info_dummy); - } - /* Note fall through. */ - - unconditional_jump: -#ifdef _LIBC - DEBUG_PRINT2 ("\n%p: ", p); -#else - DEBUG_PRINT2 ("\n0x%x: ", p); -#endif - /* Note fall through. */ - - /* Unconditionally jump (without popping any failure points). */ - case jump: - EXTRACT_NUMBER_AND_INCR (mcnt, p); /* Get the amount to jump. */ - DEBUG_PRINT2 ("EXECUTING jump %d ", mcnt); - p += mcnt; /* Do the jump. */ -#ifdef _LIBC - DEBUG_PRINT2 ("(to %p).\n", p); -#else - DEBUG_PRINT2 ("(to 0x%x).\n", p); -#endif - break; - - - /* We need this opcode so we can detect where alternatives end - in `group_match_null_string_p' et al. */ - case jump_past_alt: - DEBUG_PRINT1 ("EXECUTING jump_past_alt.\n"); - goto unconditional_jump; - - - /* Normally, the on_failure_jump pushes a failure point, which - then gets popped at pop_failure_jump. We will end up at - pop_failure_jump, also, and with a pattern of, say, `a+', we - are skipping over the on_failure_jump, so we have to push - something meaningless for pop_failure_jump to pop. */ - case dummy_failure_jump: - DEBUG_PRINT1 ("EXECUTING dummy_failure_jump.\n"); - /* It doesn't matter what we push for the string here. What - the code at `fail' tests is the value for the pattern. */ - PUSH_FAILURE_POINT (NULL, NULL, -2); - goto unconditional_jump; - - - /* At the end of an alternative, we need to push a dummy failure - point in case we are followed by a `pop_failure_jump', because - we don't want the failure point for the alternative to be - popped. For example, matching `(a|ab)*' against `aab' - requires that we match the `ab' alternative. */ - case push_dummy_failure: - DEBUG_PRINT1 ("EXECUTING push_dummy_failure.\n"); - /* See comments just above at `dummy_failure_jump' about the - two zeroes. */ - PUSH_FAILURE_POINT (NULL, NULL, -2); - break; - - /* Have to succeed matching what follows at least n times. - After that, handle like `on_failure_jump'. */ - case succeed_n: - EXTRACT_NUMBER (mcnt, p + 2); - DEBUG_PRINT2 ("EXECUTING succeed_n %d.\n", mcnt); - - assert (mcnt >= 0); - /* Originally, this is how many times we HAVE to succeed. */ - if (mcnt > 0) - { - mcnt--; - p += 2; - STORE_NUMBER_AND_INCR (p, mcnt); -#ifdef _LIBC - DEBUG_PRINT3 (" Setting %p to %d.\n", p - 2, mcnt); -#else - DEBUG_PRINT3 (" Setting 0x%x to %d.\n", p - 2, mcnt); -#endif - } - else if (mcnt == 0) - { -#ifdef _LIBC - DEBUG_PRINT2 (" Setting two bytes from %p to no_op.\n", p+2); -#else - DEBUG_PRINT2 (" Setting two bytes from 0x%x to no_op.\n", p+2); -#endif - p[2] = (unsigned char) no_op; - p[3] = (unsigned char) no_op; - goto on_failure; - } - break; - - case jump_n: - EXTRACT_NUMBER (mcnt, p + 2); - DEBUG_PRINT2 ("EXECUTING jump_n %d.\n", mcnt); - - /* Originally, this is how many times we CAN jump. */ - if (mcnt) - { - mcnt--; - STORE_NUMBER (p + 2, mcnt); -#ifdef _LIBC - DEBUG_PRINT3 (" Setting %p to %d.\n", p + 2, mcnt); -#else - DEBUG_PRINT3 (" Setting 0x%x to %d.\n", p + 2, mcnt); -#endif - goto unconditional_jump; - } - /* If don't have to jump any more, skip over the rest of command. */ - else - p += 4; - break; - - case set_number_at: - { - DEBUG_PRINT1 ("EXECUTING set_number_at.\n"); - - EXTRACT_NUMBER_AND_INCR (mcnt, p); - p1 = p + mcnt; - EXTRACT_NUMBER_AND_INCR (mcnt, p); -#ifdef _LIBC - DEBUG_PRINT3 (" Setting %p to %d.\n", p1, mcnt); -#else - DEBUG_PRINT3 (" Setting 0x%x to %d.\n", p1, mcnt); -#endif - STORE_NUMBER (p1, mcnt); - break; - } - -#if 0 - /* The DEC Alpha C compiler 3.x generates incorrect code for the - test WORDCHAR_P (d - 1) != WORDCHAR_P (d) in the expansion of - AT_WORD_BOUNDARY, so this code is disabled. Expanding the - macro and introducing temporary variables works around the bug. */ - - case wordbound: - DEBUG_PRINT1 ("EXECUTING wordbound.\n"); - if (AT_WORD_BOUNDARY (d)) - break; - goto fail; - - case notwordbound: - DEBUG_PRINT1 ("EXECUTING notwordbound.\n"); - if (AT_WORD_BOUNDARY (d)) - goto fail; - break; -#else - case wordbound: - { - boolean prevchar, thischar; - - DEBUG_PRINT1 ("EXECUTING wordbound.\n"); - if (AT_STRINGS_BEG (d) || AT_STRINGS_END (d)) - break; - - prevchar = WORDCHAR_P (d - 1); - thischar = WORDCHAR_P (d); - if (prevchar != thischar) - break; - goto fail; - } - - case notwordbound: - { - boolean prevchar, thischar; - - DEBUG_PRINT1 ("EXECUTING notwordbound.\n"); - if (AT_STRINGS_BEG (d) || AT_STRINGS_END (d)) - goto fail; - - prevchar = WORDCHAR_P (d - 1); - thischar = WORDCHAR_P (d); - if (prevchar != thischar) - goto fail; - break; - } -#endif - - case wordbeg: - DEBUG_PRINT1 ("EXECUTING wordbeg.\n"); - if (WORDCHAR_P (d) && (AT_STRINGS_BEG (d) || !WORDCHAR_P (d - 1))) - break; - goto fail; - - case wordend: - DEBUG_PRINT1 ("EXECUTING wordend.\n"); - if (!AT_STRINGS_BEG (d) && WORDCHAR_P (d - 1) - && (!WORDCHAR_P (d) || AT_STRINGS_END (d))) - break; - goto fail; - -#ifdef emacs - case before_dot: - DEBUG_PRINT1 ("EXECUTING before_dot.\n"); - if (PTR_CHAR_POS ((unsigned char *) d) >= point) - goto fail; - break; - - case at_dot: - DEBUG_PRINT1 ("EXECUTING at_dot.\n"); - if (PTR_CHAR_POS ((unsigned char *) d) != point) - goto fail; - break; - - case after_dot: - DEBUG_PRINT1 ("EXECUTING after_dot.\n"); - if (PTR_CHAR_POS ((unsigned char *) d) <= point) - goto fail; - break; - - case syntaxspec: - DEBUG_PRINT2 ("EXECUTING syntaxspec %d.\n", mcnt); - mcnt = *p++; - goto matchsyntax; - - case wordchar: - DEBUG_PRINT1 ("EXECUTING Emacs wordchar.\n"); - mcnt = (int) Sword; - matchsyntax: - PREFETCH (); - /* Can't use *d++ here; SYNTAX may be an unsafe macro. */ - d++; - if (SYNTAX (d[-1]) != (enum syntaxcode) mcnt) - goto fail; - SET_REGS_MATCHED (); - break; - - case notsyntaxspec: - DEBUG_PRINT2 ("EXECUTING notsyntaxspec %d.\n", mcnt); - mcnt = *p++; - goto matchnotsyntax; - - case notwordchar: - DEBUG_PRINT1 ("EXECUTING Emacs notwordchar.\n"); - mcnt = (int) Sword; - matchnotsyntax: - PREFETCH (); - /* Can't use *d++ here; SYNTAX may be an unsafe macro. */ - d++; - if (SYNTAX (d[-1]) == (enum syntaxcode) mcnt) - goto fail; - SET_REGS_MATCHED (); - break; - -#else /* not emacs */ - case wordchar: - DEBUG_PRINT1 ("EXECUTING non-Emacs wordchar.\n"); - PREFETCH (); - if (!WORDCHAR_P (d)) - goto fail; - SET_REGS_MATCHED (); - d++; - break; - - case notwordchar: - DEBUG_PRINT1 ("EXECUTING non-Emacs notwordchar.\n"); - PREFETCH (); - if (WORDCHAR_P (d)) - goto fail; - SET_REGS_MATCHED (); - d++; - break; -#endif /* not emacs */ - - default: - abort (); - } - continue; /* Successfully executed one pattern command; keep going. */ - - - /* We goto here if a matching operation fails. */ - fail: - if (!FAIL_STACK_EMPTY ()) - { /* A restart point is known. Restore to that state. */ - DEBUG_PRINT1 ("\nFAIL:\n"); - POP_FAILURE_POINT (d, p, - lowest_active_reg, highest_active_reg, - regstart, regend, reg_info); - - /* If this failure point is a dummy, try the next one. */ - if (!p) - goto fail; - - /* If we failed to the end of the pattern, don't examine *p. */ - assert (p <= pend); - if (p < pend) - { - boolean is_a_jump_n = false; - - /* If failed to a backwards jump that's part of a repetition - loop, need to pop this failure point and use the next one. */ - switch ((re_opcode_t) *p) - { - case jump_n: - is_a_jump_n = true; - case maybe_pop_jump: - case pop_failure_jump: - case jump: - p1 = p + 1; - EXTRACT_NUMBER_AND_INCR (mcnt, p1); - p1 += mcnt; - - if ((is_a_jump_n && (re_opcode_t) *p1 == succeed_n) - || (!is_a_jump_n - && (re_opcode_t) *p1 == on_failure_jump)) - goto fail; - break; - default: - /* do nothing */ ; - } - } - - if (d >= string1 && d <= end1) - dend = end_match_1; - } - else - break; /* Matching at this starting point really fails. */ - } /* for (;;) */ - - if (best_regs_set) - goto restore_best_regs; - - FREE_VARIABLES (); - - return -1; /* Failure to match. */ -} /* re_match_2 */ - -/* Subroutine definitions for re_match_2. */ - - -/* We are passed P pointing to a register number after a start_memory. - - Return true if the pattern up to the corresponding stop_memory can - match the empty string, and false otherwise. - - If we find the matching stop_memory, sets P to point to one past its number. - Otherwise, sets P to an undefined byte less than or equal to END. - - We don't handle duplicates properly (yet). */ - -static boolean -group_match_null_string_p (p, end, reg_info) - unsigned char **p, *end; - register_info_type *reg_info; -{ - int mcnt; - /* Point to after the args to the start_memory. */ - unsigned char *p1 = *p + 2; - - while (p1 < end) - { - /* Skip over opcodes that can match nothing, and return true or - false, as appropriate, when we get to one that can't, or to the - matching stop_memory. */ - - switch ((re_opcode_t) *p1) - { - /* Could be either a loop or a series of alternatives. */ - case on_failure_jump: - p1++; - EXTRACT_NUMBER_AND_INCR (mcnt, p1); - - /* If the next operation is not a jump backwards in the - pattern. */ - - if (mcnt >= 0) - { - /* Go through the on_failure_jumps of the alternatives, - seeing if any of the alternatives cannot match nothing. - The last alternative starts with only a jump, - whereas the rest start with on_failure_jump and end - with a jump, e.g., here is the pattern for `a|b|c': - - /on_failure_jump/0/6/exactn/1/a/jump_past_alt/0/6 - /on_failure_jump/0/6/exactn/1/b/jump_past_alt/0/3 - /exactn/1/c - - So, we have to first go through the first (n-1) - alternatives and then deal with the last one separately. */ - - - /* Deal with the first (n-1) alternatives, which start - with an on_failure_jump (see above) that jumps to right - past a jump_past_alt. */ - - while ((re_opcode_t) p1[mcnt-3] == jump_past_alt) - { - /* `mcnt' holds how many bytes long the alternative - is, including the ending `jump_past_alt' and - its number. */ - - if (!alt_match_null_string_p (p1, p1 + mcnt - 3, - reg_info)) - return false; - - /* Move to right after this alternative, including the - jump_past_alt. */ - p1 += mcnt; - - /* Break if it's the beginning of an n-th alternative - that doesn't begin with an on_failure_jump. */ - if ((re_opcode_t) *p1 != on_failure_jump) - break; - - /* Still have to check that it's not an n-th - alternative that starts with an on_failure_jump. */ - p1++; - EXTRACT_NUMBER_AND_INCR (mcnt, p1); - if ((re_opcode_t) p1[mcnt-3] != jump_past_alt) - { - /* Get to the beginning of the n-th alternative. */ - p1 -= 3; - break; - } - } - - /* Deal with the last alternative: go back and get number - of the `jump_past_alt' just before it. `mcnt' contains - the length of the alternative. */ - EXTRACT_NUMBER (mcnt, p1 - 2); - - if (!alt_match_null_string_p (p1, p1 + mcnt, reg_info)) - return false; - - p1 += mcnt; /* Get past the n-th alternative. */ - } /* if mcnt > 0 */ - break; - - - case stop_memory: - assert (p1[1] == **p); - *p = p1 + 2; - return true; - - - default: - if (!common_op_match_null_string_p (&p1, end, reg_info)) - return false; - } - } /* while p1 < end */ - - return false; -} /* group_match_null_string_p */ - - -/* Similar to group_match_null_string_p, but doesn't deal with alternatives: - It expects P to be the first byte of a single alternative and END one - byte past the last. The alternative can contain groups. */ - -static boolean -alt_match_null_string_p (p, end, reg_info) - unsigned char *p, *end; - register_info_type *reg_info; -{ - int mcnt; - unsigned char *p1 = p; - - while (p1 < end) - { - /* Skip over opcodes that can match nothing, and break when we get - to one that can't. */ - - switch ((re_opcode_t) *p1) - { - /* It's a loop. */ - case on_failure_jump: - p1++; - EXTRACT_NUMBER_AND_INCR (mcnt, p1); - p1 += mcnt; - break; - - default: - if (!common_op_match_null_string_p (&p1, end, reg_info)) - return false; - } - } /* while p1 < end */ - - return true; -} /* alt_match_null_string_p */ - - -/* Deals with the ops common to group_match_null_string_p and - alt_match_null_string_p. - - Sets P to one after the op and its arguments, if any. */ - -static boolean -common_op_match_null_string_p (p, end, reg_info) - unsigned char **p, *end; - register_info_type *reg_info; -{ - int mcnt; - boolean ret; - int reg_no; - unsigned char *p1 = *p; - - switch ((re_opcode_t) *p1++) - { - case no_op: - case begline: - case endline: - case begbuf: - case endbuf: - case wordbeg: - case wordend: - case wordbound: - case notwordbound: -#ifdef emacs - case before_dot: - case at_dot: - case after_dot: -#endif - break; - - case start_memory: - reg_no = *p1; - assert (reg_no > 0 && reg_no <= MAX_REGNUM); - ret = group_match_null_string_p (&p1, end, reg_info); - - /* Have to set this here in case we're checking a group which - contains a group and a back reference to it. */ - - if (REG_MATCH_NULL_STRING_P (reg_info[reg_no]) == MATCH_NULL_UNSET_VALUE) - REG_MATCH_NULL_STRING_P (reg_info[reg_no]) = ret; - - if (!ret) - return false; - break; - - /* If this is an optimized succeed_n for zero times, make the jump. */ - case jump: - EXTRACT_NUMBER_AND_INCR (mcnt, p1); - if (mcnt >= 0) - p1 += mcnt; - else - return false; - break; - - case succeed_n: - /* Get to the number of times to succeed. */ - p1 += 2; - EXTRACT_NUMBER_AND_INCR (mcnt, p1); - - if (mcnt == 0) - { - p1 -= 4; - EXTRACT_NUMBER_AND_INCR (mcnt, p1); - p1 += mcnt; - } - else - return false; - break; - - case duplicate: - if (!REG_MATCH_NULL_STRING_P (reg_info[*p1])) - return false; - break; - - case set_number_at: - p1 += 4; - - default: - /* All other opcodes mean we cannot match the empty string. */ - return false; - } - - *p = p1; - return true; -} /* common_op_match_null_string_p */ - - -/* Return zero if TRANSLATE[S1] and TRANSLATE[S2] are identical for LEN - bytes; nonzero otherwise. */ - -static int -bcmp_translate (s1, s2, len, translate) - const char *s1, *s2; - register int len; - RE_TRANSLATE_TYPE translate; -{ - register const unsigned char *p1 = (const unsigned char *) s1; - register const unsigned char *p2 = (const unsigned char *) s2; - while (len) - { - if (translate[*p1++] != translate[*p2++]) return 1; - len--; - } - return 0; -} - -/* Entry points for GNU code. */ - -/* re_compile_pattern is the GNU regular expression compiler: it - compiles PATTERN (of length SIZE) and puts the result in BUFP. - Returns 0 if the pattern was valid, otherwise an error string. - - Assumes the `allocated' (and perhaps `buffer') and `translate' fields - are set in BUFP on entry. - - We call regex_compile to do the actual compilation. */ - -const char * -re_compile_pattern (pattern, length, bufp) - const char *pattern; - size_t length; - struct re_pattern_buffer *bufp; -{ - reg_errcode_t ret; - - /* GNU code is written to assume at least RE_NREGS registers will be set - (and at least one extra will be -1). */ - bufp->regs_allocated = REGS_UNALLOCATED; - - /* And GNU code determines whether or not to get register information - by passing null for the REGS argument to re_match, etc., not by - setting no_sub. */ - bufp->no_sub = 0; - - /* Match anchors at newline. */ - bufp->newline_anchor = 1; - - ret = regex_compile (pattern, length, re_syntax_options, bufp); - - if (!ret) - return NULL; - return gettext (re_error_msgid[(int) ret]); -} -#ifdef _LIBC -weak_alias (__re_compile_pattern, re_compile_pattern) -#endif - -/* Entry points compatible with 4.2 BSD regex library. We don't define - them unless specifically requested. */ - -#if defined _REGEX_RE_COMP || defined _LIBC - -/* BSD has one and only one pattern buffer. */ -static struct re_pattern_buffer re_comp_buf; - -char * -#ifdef _LIBC -/* Make these definitions weak in libc, so POSIX programs can redefine - these names if they don't use our functions, and still use - regcomp/regexec below without link errors. */ -weak_function -#endif -re_comp (s) - const char *s; -{ - reg_errcode_t ret; - - if (!s) - { - if (!re_comp_buf.buffer) - return gettext ("No previous regular expression"); - return 0; - } - - if (!re_comp_buf.buffer) - { - re_comp_buf.buffer = (unsigned char *) malloc (200); - if (re_comp_buf.buffer == NULL) - return (char *) gettext (re_error_msgid[(int) REG_ESPACE]); - re_comp_buf.allocated = 200; - - re_comp_buf.fastmap = (char *) malloc (1 << BYTEWIDTH); - if (re_comp_buf.fastmap == NULL) - return (char *) gettext (re_error_msgid[(int) REG_ESPACE]); - } - - /* Since `re_exec' always passes NULL for the `regs' argument, we - don't need to initialize the pattern buffer fields which affect it. */ - - /* Match anchors at newlines. */ - re_comp_buf.newline_anchor = 1; - - ret = regex_compile (s, strlen (s), re_syntax_options, &re_comp_buf); - - if (!ret) - return NULL; - - /* Yes, we're discarding `const' here if !HAVE_LIBINTL. */ - return (char *) gettext (re_error_msgid[(int) ret]); -} - - -int -#ifdef _LIBC -weak_function -#endif -re_exec (s) - const char *s; -{ - const int len = strlen (s); - return - 0 <= re_search (&re_comp_buf, s, len, 0, len, (struct re_registers *) 0); -} - -#endif /* _REGEX_RE_COMP */ - -/* POSIX.2 functions. Don't define these for Emacs. */ - -#ifndef emacs - -/* regcomp takes a regular expression as a string and compiles it. - - PREG is a regex_t *. We do not expect any fields to be initialized, - since POSIX says we shouldn't. Thus, we set - - `buffer' to the compiled pattern; - `used' to the length of the compiled pattern; - `syntax' to RE_SYNTAX_POSIX_EXTENDED if the - REG_EXTENDED bit in CFLAGS is set; otherwise, to - RE_SYNTAX_POSIX_BASIC; - `newline_anchor' to REG_NEWLINE being set in CFLAGS; - `fastmap' and `fastmap_accurate' to zero; - `re_nsub' to the number of subexpressions in PATTERN. - - PATTERN is the address of the pattern string. - - CFLAGS is a series of bits which affect compilation. - - If REG_EXTENDED is set, we use POSIX extended syntax; otherwise, we - use POSIX basic syntax. - - If REG_NEWLINE is set, then . and [^...] don't match newline. - Also, regexec will try a match beginning after every newline. - - If REG_ICASE is set, then we considers upper- and lowercase - versions of letters to be equivalent when matching. - - If REG_NOSUB is set, then when PREG is passed to regexec, that - routine will report only success or failure, and nothing about the - registers. - - It returns 0 if it succeeds, nonzero if it doesn't. (See gnu-regex.h for - the return codes and their meanings.) */ - -int -regcomp (preg, pattern, cflags) - regex_t *preg; - const char *pattern; - int cflags; -{ - reg_errcode_t ret; - reg_syntax_t syntax - = (cflags & REG_EXTENDED) ? - RE_SYNTAX_POSIX_EXTENDED : RE_SYNTAX_POSIX_BASIC; - - /* regex_compile will allocate the space for the compiled pattern. */ - preg->buffer = 0; - preg->allocated = 0; - preg->used = 0; - - /* Don't bother to use a fastmap when searching. This simplifies the - REG_NEWLINE case: if we used a fastmap, we'd have to put all the - characters after newlines into the fastmap. This way, we just try - every character. */ - preg->fastmap = 0; - - if (cflags & REG_ICASE) - { - unsigned i; - - preg->translate - = (RE_TRANSLATE_TYPE) malloc (CHAR_SET_SIZE - * sizeof (*(RE_TRANSLATE_TYPE)0)); - if (preg->translate == NULL) - return (int) REG_ESPACE; - - /* Map uppercase characters to corresponding lowercase ones. */ - for (i = 0; i < CHAR_SET_SIZE; i++) - preg->translate[i] = ISUPPER (i) ? tolower (i) : i; - } - else - preg->translate = NULL; - - /* If REG_NEWLINE is set, newlines are treated differently. */ - if (cflags & REG_NEWLINE) - { /* REG_NEWLINE implies neither . nor [^...] match newline. */ - syntax &= ~RE_DOT_NEWLINE; - syntax |= RE_HAT_LISTS_NOT_NEWLINE; - /* It also changes the matching behavior. */ - preg->newline_anchor = 1; - } - else - preg->newline_anchor = 0; - - preg->no_sub = !!(cflags & REG_NOSUB); - - /* POSIX says a null character in the pattern terminates it, so we - can use strlen here in compiling the pattern. */ - ret = regex_compile (pattern, strlen (pattern), syntax, preg); - - /* POSIX doesn't distinguish between an unmatched open-group and an - unmatched close-group: both are REG_EPAREN. */ - if (ret == REG_ERPAREN) ret = REG_EPAREN; - - return (int) ret; -} -#ifdef _LIBC -weak_alias (__regcomp, regcomp) -#endif - - -/* regexec searches for a given pattern, specified by PREG, in the - string STRING. - - If NMATCH is zero or REG_NOSUB was set in the cflags argument to - `regcomp', we ignore PMATCH. Otherwise, we assume PMATCH has at - least NMATCH elements, and we set them to the offsets of the - corresponding matched substrings. - - EFLAGS specifies `execution flags' which affect matching: if - REG_NOTBOL is set, then ^ does not match at the beginning of the - string; if REG_NOTEOL is set, then $ does not match at the end. - - We return 0 if we find a match and REG_NOMATCH if not. */ - -int -regexec (preg, string, nmatch, pmatch, eflags) - const regex_t *preg; - const char *string; - size_t nmatch; - regmatch_t pmatch[]; - int eflags; -{ - int ret; - struct re_registers regs; - regex_t private_preg; - int len = strlen (string); - boolean want_reg_info = !preg->no_sub && nmatch > 0; - - private_preg = *preg; - - private_preg.not_bol = !!(eflags & REG_NOTBOL); - private_preg.not_eol = !!(eflags & REG_NOTEOL); - - /* The user has told us exactly how many registers to return - information about, via `nmatch'. We have to pass that on to the - matching routines. */ - private_preg.regs_allocated = REGS_FIXED; - - if (want_reg_info) - { - regs.num_regs = nmatch; - regs.start = TALLOC (nmatch, regoff_t); - regs.end = TALLOC (nmatch, regoff_t); - if (regs.start == NULL || regs.end == NULL) - return (int) REG_NOMATCH; - } - - /* Perform the searching operation. */ - ret = re_search (&private_preg, string, len, - /* start: */ 0, /* range: */ len, - want_reg_info ? ®s : (struct re_registers *) 0); - - /* Copy the register information to the POSIX structure. */ - if (want_reg_info) - { - if (ret >= 0) - { - unsigned r; - - for (r = 0; r < nmatch; r++) - { - pmatch[r].rm_so = regs.start[r]; - pmatch[r].rm_eo = regs.end[r]; - } - } - - /* If we needed the temporary register info, free the space now. */ - free (regs.start); - free (regs.end); - } - - /* We want zero return to mean success, unlike `re_search'. */ - return ret >= 0 ? (int) REG_NOERROR : (int) REG_NOMATCH; -} -#ifdef _LIBC -weak_alias (__regexec, regexec) -#endif - - -/* Returns a message corresponding to an error code, ERRCODE, returned - from either regcomp or regexec. We don't use PREG here. */ - -size_t -__regerror (errcode, preg, errbuf, errbuf_size) - int errcode; - const regex_t *preg; - char *errbuf; - size_t errbuf_size; -{ - const char *msg; - size_t msg_size; - - if (errcode < 0 - || errcode >= (int) (sizeof (re_error_msgid) - / sizeof (re_error_msgid[0]))) - /* Only error codes returned by the rest of the code should be passed - to this routine. If we are given anything else, or if other regex - code generates an invalid error code, then the program has a bug. - Dump core so we can fix it. */ - abort (); - - msg = gettext (re_error_msgid[errcode]); - - msg_size = strlen (msg) + 1; /* Includes the null. */ - - if (errbuf_size != 0) - { - if (msg_size > errbuf_size) - { -#if defined HAVE_MEMPCPY || defined _LIBC - *((char *) __mempcpy (errbuf, msg, errbuf_size - 1)) = '\0'; -#else - memcpy (errbuf, msg, errbuf_size - 1); - errbuf[errbuf_size - 1] = 0; -#endif - } - else - memcpy (errbuf, msg, msg_size); - } - - return msg_size; -} -#ifdef _LIBC -weak_alias (__regerror, regerror) -#endif - - -/* Free dynamically allocated space used by PREG. */ - -void -regfree (preg) - regex_t *preg; -{ - if (preg->buffer != NULL) - free (preg->buffer); - preg->buffer = NULL; - - preg->allocated = 0; - preg->used = 0; - - if (preg->fastmap != NULL) - free (preg->fastmap); - preg->fastmap = NULL; - preg->fastmap_accurate = 0; - - if (preg->translate != NULL) - free (preg->translate); - preg->translate = NULL; -} -#ifdef _LIBC -weak_alias (__regfree, regfree) -#endif - -#endif /* not emacs */ diff --git a/contrib/gdb/gdb/gnu-regex.h b/contrib/gdb/gdb/gnu-regex.h deleted file mode 100644 index 9153ea1b07d05..0000000000000 --- a/contrib/gdb/gdb/gnu-regex.h +++ /dev/null @@ -1,576 +0,0 @@ -/* Definitions for data structures and routines for the regular - expression library, version 0.12. - Copyright (C) 1985,89,90,91,92,93,95,96,97,98 Free Software Foundation, Inc. - - NOTE: The canonical source of this file is maintained with the - GNU C Library. Bugs can be reported to bug-glibc@prep.ai.mit.edu. - - 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 2, 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ - -#ifndef _REGEX_H -#define _REGEX_H 1 - -/* Allow the use in C++ code. */ -#ifdef __cplusplus -extern "C" { -#endif - -/* POSIX says that <sys/types.h> must be included (by the caller) before - <regex.h>. */ - -#if !defined _POSIX_C_SOURCE && !defined _POSIX_SOURCE && defined VMS -/* VMS doesn't have `size_t' in <sys/types.h>, even though POSIX says it - should be there. */ -# include <stddef.h> -#endif - -/* GDB LOCAL: define _REGEX_RE_COMP to get BSD style re_comp and re_exec */ -#ifndef _REGEX_RE_COMP -#define _REGEX_RE_COMP -#endif - -/* The following two types have to be signed and unsigned integer type - wide enough to hold a value of a pointer. For most ANSI compilers - ptrdiff_t and size_t should be likely OK. Still size of these two - types is 2 for Microsoft C. Ugh... */ -typedef long int s_reg_t; -typedef unsigned long int active_reg_t; - -/* The following bits are used to determine the regexp syntax we - recognize. The set/not-set meanings are chosen so that Emacs syntax - remains the value 0. The bits are given in alphabetical order, and - the definitions shifted by one from the previous bit; thus, when we - add or remove a bit, only one other definition need change. */ -typedef unsigned long int reg_syntax_t; - -/* If this bit is not set, then \ inside a bracket expression is literal. - If set, then such a \ quotes the following character. */ -#define RE_BACKSLASH_ESCAPE_IN_LISTS ((unsigned long int) 1) - -/* If this bit is not set, then + and ? are operators, and \+ and \? are - literals. - If set, then \+ and \? are operators and + and ? are literals. */ -#define RE_BK_PLUS_QM (RE_BACKSLASH_ESCAPE_IN_LISTS << 1) - -/* If this bit is set, then character classes are supported. They are: - [:alpha:], [:upper:], [:lower:], [:digit:], [:alnum:], [:xdigit:], - [:space:], [:print:], [:punct:], [:graph:], and [:cntrl:]. - If not set, then character classes are not supported. */ -#define RE_CHAR_CLASSES (RE_BK_PLUS_QM << 1) - -/* If this bit is set, then ^ and $ are always anchors (outside bracket - expressions, of course). - If this bit is not set, then it depends: - ^ is an anchor if it is at the beginning of a regular - expression or after an open-group or an alternation operator; - $ is an anchor if it is at the end of a regular expression, or - before a close-group or an alternation operator. - - This bit could be (re)combined with RE_CONTEXT_INDEP_OPS, because - POSIX draft 11.2 says that * etc. in leading positions is undefined. - We already implemented a previous draft which made those constructs - invalid, though, so we haven't changed the code back. */ -#define RE_CONTEXT_INDEP_ANCHORS (RE_CHAR_CLASSES << 1) - -/* If this bit is set, then special characters are always special - regardless of where they are in the pattern. - If this bit is not set, then special characters are special only in - some contexts; otherwise they are ordinary. Specifically, - * + ? and intervals are only special when not after the beginning, - open-group, or alternation operator. */ -#define RE_CONTEXT_INDEP_OPS (RE_CONTEXT_INDEP_ANCHORS << 1) - -/* If this bit is set, then *, +, ?, and { cannot be first in an re or - immediately after an alternation or begin-group operator. */ -#define RE_CONTEXT_INVALID_OPS (RE_CONTEXT_INDEP_OPS << 1) - -/* If this bit is set, then . matches newline. - If not set, then it doesn't. */ -#define RE_DOT_NEWLINE (RE_CONTEXT_INVALID_OPS << 1) - -/* If this bit is set, then . doesn't match NUL. - If not set, then it does. */ -#define RE_DOT_NOT_NULL (RE_DOT_NEWLINE << 1) - -/* If this bit is set, nonmatching lists [^...] do not match newline. - If not set, they do. */ -#define RE_HAT_LISTS_NOT_NEWLINE (RE_DOT_NOT_NULL << 1) - -/* If this bit is set, either \{...\} or {...} defines an - interval, depending on RE_NO_BK_BRACES. - If not set, \{, \}, {, and } are literals. */ -#define RE_INTERVALS (RE_HAT_LISTS_NOT_NEWLINE << 1) - -/* If this bit is set, +, ? and | aren't recognized as operators. - If not set, they are. */ -#define RE_LIMITED_OPS (RE_INTERVALS << 1) - -/* If this bit is set, newline is an alternation operator. - If not set, newline is literal. */ -#define RE_NEWLINE_ALT (RE_LIMITED_OPS << 1) - -/* If this bit is set, then `{...}' defines an interval, and \{ and \} - are literals. - If not set, then `\{...\}' defines an interval. */ -#define RE_NO_BK_BRACES (RE_NEWLINE_ALT << 1) - -/* If this bit is set, (...) defines a group, and \( and \) are literals. - If not set, \(...\) defines a group, and ( and ) are literals. */ -#define RE_NO_BK_PARENS (RE_NO_BK_BRACES << 1) - -/* If this bit is set, then \<digit> matches <digit>. - If not set, then \<digit> is a back-reference. */ -#define RE_NO_BK_REFS (RE_NO_BK_PARENS << 1) - -/* If this bit is set, then | is an alternation operator, and \| is literal. - If not set, then \| is an alternation operator, and | is literal. */ -#define RE_NO_BK_VBAR (RE_NO_BK_REFS << 1) - -/* If this bit is set, then an ending range point collating higher - than the starting range point, as in [z-a], is invalid. - If not set, then when ending range point collates higher than the - starting range point, the range is ignored. */ -#define RE_NO_EMPTY_RANGES (RE_NO_BK_VBAR << 1) - -/* If this bit is set, then an unmatched ) is ordinary. - If not set, then an unmatched ) is invalid. */ -#define RE_UNMATCHED_RIGHT_PAREN_ORD (RE_NO_EMPTY_RANGES << 1) - -/* If this bit is set, succeed as soon as we match the whole pattern, - without further backtracking. */ -#define RE_NO_POSIX_BACKTRACKING (RE_UNMATCHED_RIGHT_PAREN_ORD << 1) - -/* If this bit is set, do not process the GNU regex operators. - If not set, then the GNU regex operators are recognized. */ -#define RE_NO_GNU_OPS (RE_NO_POSIX_BACKTRACKING << 1) - -/* If this bit is set, turn on internal regex debugging. - If not set, and debugging was on, turn it off. - This only works if regex.c is compiled -DDEBUG. - We define this bit always, so that all that's needed to turn on - debugging is to recompile regex.c; the calling code can always have - this bit set, and it won't affect anything in the normal case. */ -#define RE_DEBUG (RE_NO_GNU_OPS << 1) - -/* This global variable defines the particular regexp syntax to use (for - some interfaces). When a regexp is compiled, the syntax used is - stored in the pattern buffer, so changing this does not affect - already-compiled regexps. */ -extern reg_syntax_t re_syntax_options; - -/* Define combinations of the above bits for the standard possibilities. - (The [[[ comments delimit what gets put into the Texinfo file, so - don't delete them!) */ -/* [[[begin syntaxes]]] */ -#define RE_SYNTAX_EMACS 0 - -#define RE_SYNTAX_AWK \ - (RE_BACKSLASH_ESCAPE_IN_LISTS | RE_DOT_NOT_NULL \ - | RE_NO_BK_PARENS | RE_NO_BK_REFS \ - | RE_NO_BK_VBAR | RE_NO_EMPTY_RANGES \ - | RE_DOT_NEWLINE | RE_CONTEXT_INDEP_ANCHORS \ - | RE_UNMATCHED_RIGHT_PAREN_ORD | RE_NO_GNU_OPS) - -#define RE_SYNTAX_GNU_AWK \ - ((RE_SYNTAX_POSIX_EXTENDED | RE_BACKSLASH_ESCAPE_IN_LISTS | RE_DEBUG) \ - & ~(RE_DOT_NOT_NULL | RE_INTERVALS | RE_CONTEXT_INDEP_OPS)) - -#define RE_SYNTAX_POSIX_AWK \ - (RE_SYNTAX_POSIX_EXTENDED | RE_BACKSLASH_ESCAPE_IN_LISTS \ - | RE_INTERVALS | RE_NO_GNU_OPS) - -#define RE_SYNTAX_GREP \ - (RE_BK_PLUS_QM | RE_CHAR_CLASSES \ - | RE_HAT_LISTS_NOT_NEWLINE | RE_INTERVALS \ - | RE_NEWLINE_ALT) - -#define RE_SYNTAX_EGREP \ - (RE_CHAR_CLASSES | RE_CONTEXT_INDEP_ANCHORS \ - | RE_CONTEXT_INDEP_OPS | RE_HAT_LISTS_NOT_NEWLINE \ - | RE_NEWLINE_ALT | RE_NO_BK_PARENS \ - | RE_NO_BK_VBAR) - -#define RE_SYNTAX_POSIX_EGREP \ - (RE_SYNTAX_EGREP | RE_INTERVALS | RE_NO_BK_BRACES) - -/* P1003.2/D11.2, section 4.20.7.1, lines 5078ff. */ -#define RE_SYNTAX_ED RE_SYNTAX_POSIX_BASIC - -#define RE_SYNTAX_SED RE_SYNTAX_POSIX_BASIC - -/* Syntax bits common to both basic and extended POSIX regex syntax. */ -#define _RE_SYNTAX_POSIX_COMMON \ - (RE_CHAR_CLASSES | RE_DOT_NEWLINE | RE_DOT_NOT_NULL \ - | RE_INTERVALS | RE_NO_EMPTY_RANGES) - -#define RE_SYNTAX_POSIX_BASIC \ - (_RE_SYNTAX_POSIX_COMMON | RE_BK_PLUS_QM) - -/* Differs from ..._POSIX_BASIC only in that RE_BK_PLUS_QM becomes - RE_LIMITED_OPS, i.e., \? \+ \| are not recognized. Actually, this - isn't minimal, since other operators, such as \`, aren't disabled. */ -#define RE_SYNTAX_POSIX_MINIMAL_BASIC \ - (_RE_SYNTAX_POSIX_COMMON | RE_LIMITED_OPS) - -#define RE_SYNTAX_POSIX_EXTENDED \ - (_RE_SYNTAX_POSIX_COMMON | RE_CONTEXT_INDEP_ANCHORS \ - | RE_CONTEXT_INDEP_OPS | RE_NO_BK_BRACES \ - | RE_NO_BK_PARENS | RE_NO_BK_VBAR \ - | RE_UNMATCHED_RIGHT_PAREN_ORD) - -/* Differs from ..._POSIX_EXTENDED in that RE_CONTEXT_INVALID_OPS - replaces RE_CONTEXT_INDEP_OPS and RE_NO_BK_REFS is added. */ -#define RE_SYNTAX_POSIX_MINIMAL_EXTENDED \ - (_RE_SYNTAX_POSIX_COMMON | RE_CONTEXT_INDEP_ANCHORS \ - | RE_CONTEXT_INVALID_OPS | RE_NO_BK_BRACES \ - | RE_NO_BK_PARENS | RE_NO_BK_REFS \ - | RE_NO_BK_VBAR | RE_UNMATCHED_RIGHT_PAREN_ORD) -/* [[[end syntaxes]]] */ - -/* Maximum number of duplicates an interval can allow. Some systems - (erroneously) define this in other header files, but we want our - value, so remove any previous define. */ -#ifdef RE_DUP_MAX -# undef RE_DUP_MAX -#endif -/* If sizeof(int) == 2, then ((1 << 15) - 1) overflows. */ -#define RE_DUP_MAX (0x7fff) - - -/* POSIX `cflags' bits (i.e., information for `regcomp'). */ - -/* If this bit is set, then use extended regular expression syntax. - If not set, then use basic regular expression syntax. */ -#define REG_EXTENDED 1 - -/* If this bit is set, then ignore case when matching. - If not set, then case is significant. */ -#define REG_ICASE (REG_EXTENDED << 1) - -/* If this bit is set, then anchors do not match at newline - characters in the string. - If not set, then anchors do match at newlines. */ -#define REG_NEWLINE (REG_ICASE << 1) - -/* If this bit is set, then report only success or fail in regexec. - If not set, then returns differ between not matching and errors. */ -#define REG_NOSUB (REG_NEWLINE << 1) - - -/* POSIX `eflags' bits (i.e., information for regexec). */ - -/* If this bit is set, then the beginning-of-line operator doesn't match - the beginning of the string (presumably because it's not the - beginning of a line). - If not set, then the beginning-of-line operator does match the - beginning of the string. */ -#define REG_NOTBOL 1 - -/* Like REG_NOTBOL, except for the end-of-line. */ -#define REG_NOTEOL (1 << 1) - - -/* If any error codes are removed, changed, or added, update the - `re_error_msg' table in regex.c. */ -typedef enum -{ -#if (_XOPEN_SOURCE - 0) == 500 - REG_NOSYS = -1, /* This will never happen for this implementation. */ -#endif - - REG_NOERROR = 0, /* Success. */ - REG_NOMATCH, /* Didn't find a match (for regexec). */ - - /* POSIX regcomp return error codes. (In the order listed in the - standard.) */ - REG_BADPAT, /* Invalid pattern. */ - REG_ECOLLATE, /* Not implemented. */ - REG_ECTYPE, /* Invalid character class name. */ - REG_EESCAPE, /* Trailing backslash. */ - REG_ESUBREG, /* Invalid back reference. */ - REG_EBRACK, /* Unmatched left bracket. */ - REG_EPAREN, /* Parenthesis imbalance. */ - REG_EBRACE, /* Unmatched \{. */ - REG_BADBR, /* Invalid contents of \{\}. */ - REG_ERANGE, /* Invalid range end. */ - REG_ESPACE, /* Ran out of memory. */ - REG_BADRPT, /* No preceding re for repetition op. */ - - /* Error codes we've added. */ - REG_EEND, /* Premature end. */ - REG_ESIZE, /* Compiled pattern bigger than 2^16 bytes. */ - REG_ERPAREN /* Unmatched ) or \); not returned from regcomp. */ -} reg_errcode_t; - -/* This data structure represents a compiled pattern. Before calling - the pattern compiler, the fields `buffer', `allocated', `fastmap', - `translate', and `no_sub' can be set. After the pattern has been - compiled, the `re_nsub' field is available. All other fields are - private to the regex routines. */ - -#ifndef RE_TRANSLATE_TYPE -# define RE_TRANSLATE_TYPE char * -#endif - -struct re_pattern_buffer -{ -/* [[[begin pattern_buffer]]] */ - /* Space that holds the compiled pattern. It is declared as - `unsigned char *' because its elements are - sometimes used as array indexes. */ - unsigned char *buffer; - - /* Number of bytes to which `buffer' points. */ - unsigned long int allocated; - - /* Number of bytes actually used in `buffer'. */ - unsigned long int used; - - /* Syntax setting with which the pattern was compiled. */ - reg_syntax_t syntax; - - /* Pointer to a fastmap, if any, otherwise zero. re_search uses - the fastmap, if there is one, to skip over impossible - starting points for matches. */ - char *fastmap; - - /* Either a translate table to apply to all characters before - comparing them, or zero for no translation. The translation - is applied to a pattern when it is compiled and to a string - when it is matched. */ - RE_TRANSLATE_TYPE translate; - - /* Number of subexpressions found by the compiler. */ - size_t re_nsub; - - /* Zero if this pattern cannot match the empty string, one else. - Well, in truth it's used only in `re_search_2', to see - whether or not we should use the fastmap, so we don't set - this absolutely perfectly; see `re_compile_fastmap' (the - `duplicate' case). */ - unsigned can_be_null : 1; - - /* If REGS_UNALLOCATED, allocate space in the `regs' structure - for `max (RE_NREGS, re_nsub + 1)' groups. - If REGS_REALLOCATE, reallocate space if necessary. - If REGS_FIXED, use what's there. */ -#define REGS_UNALLOCATED 0 -#define REGS_REALLOCATE 1 -#define REGS_FIXED 2 - unsigned regs_allocated : 2; - - /* Set to zero when `regex_compile' compiles a pattern; set to one - by `re_compile_fastmap' if it updates the fastmap. */ - unsigned fastmap_accurate : 1; - - /* If set, `re_match_2' does not return information about - subexpressions. */ - unsigned no_sub : 1; - - /* If set, a beginning-of-line anchor doesn't match at the - beginning of the string. */ - unsigned not_bol : 1; - - /* Similarly for an end-of-line anchor. */ - unsigned not_eol : 1; - - /* If true, an anchor at a newline matches. */ - unsigned newline_anchor : 1; - -/* [[[end pattern_buffer]]] */ -}; - -typedef struct re_pattern_buffer regex_t; - -/* Type for byte offsets within the string. POSIX mandates this. */ -typedef int regoff_t; - - -/* This is the structure we store register match data in. See - regex.texinfo for a full description of what registers match. */ -struct re_registers -{ - unsigned num_regs; - regoff_t *start; - regoff_t *end; -}; - - -/* If `regs_allocated' is REGS_UNALLOCATED in the pattern buffer, - `re_match_2' returns information about at least this many registers - the first time a `regs' structure is passed. */ -#ifndef RE_NREGS -# define RE_NREGS 30 -#endif - - -/* POSIX specification for registers. Aside from the different names than - `re_registers', POSIX uses an array of structures, instead of a - structure of arrays. */ -typedef struct -{ - regoff_t rm_so; /* Byte offset from string's start to substring's start. */ - regoff_t rm_eo; /* Byte offset from string's start to substring's end. */ -} regmatch_t; - -/* Declarations for routines. */ - -/* To avoid duplicating every routine declaration -- once with a - prototype (if we are ANSI), and once without (if we aren't) -- we - use the following macro to declare argument types. This - unfortunately clutters up the declarations a bit, but I think it's - worth it. */ - -#if __STDC__ - -# define _RE_ARGS(args) args - -#else /* not __STDC__ */ - -# define _RE_ARGS(args) () - -#endif /* not __STDC__ */ - -/* Sets the current default syntax to SYNTAX, and return the old syntax. - You can also simply assign to the `re_syntax_options' variable. */ -extern reg_syntax_t __re_set_syntax _RE_ARGS ((reg_syntax_t syntax)); -extern reg_syntax_t re_set_syntax _RE_ARGS ((reg_syntax_t syntax)); - -/* Compile the regular expression PATTERN, with length LENGTH - and syntax given by the global `re_syntax_options', into the buffer - BUFFER. Return NULL if successful, and an error string if not. */ -extern const char *__re_compile_pattern - _RE_ARGS ((const char *pattern, size_t length, - struct re_pattern_buffer *buffer)); -extern const char *re_compile_pattern - _RE_ARGS ((const char *pattern, size_t length, - struct re_pattern_buffer *buffer)); - - -/* Compile a fastmap for the compiled pattern in BUFFER; used to - accelerate searches. Return 0 if successful and -2 if was an - internal error. */ -extern int __re_compile_fastmap _RE_ARGS ((struct re_pattern_buffer *buffer)); -extern int re_compile_fastmap _RE_ARGS ((struct re_pattern_buffer *buffer)); - - -/* Search in the string STRING (with length LENGTH) for the pattern - compiled into BUFFER. Start searching at position START, for RANGE - characters. Return the starting position of the match, -1 for no - match, or -2 for an internal error. Also return register - information in REGS (if REGS and BUFFER->no_sub are nonzero). */ -extern int __re_search - _RE_ARGS ((struct re_pattern_buffer *buffer, const char *string, - int length, int start, int range, struct re_registers *regs)); -extern int re_search - _RE_ARGS ((struct re_pattern_buffer *buffer, const char *string, - int length, int start, int range, struct re_registers *regs)); - - -/* Like `re_search', but search in the concatenation of STRING1 and - STRING2. Also, stop searching at index START + STOP. */ -extern int __re_search_2 - _RE_ARGS ((struct re_pattern_buffer *buffer, const char *string1, - int length1, const char *string2, int length2, - int start, int range, struct re_registers *regs, int stop)); -extern int re_search_2 - _RE_ARGS ((struct re_pattern_buffer *buffer, const char *string1, - int length1, const char *string2, int length2, - int start, int range, struct re_registers *regs, int stop)); - - -/* Like `re_search', but return how many characters in STRING the regexp - in BUFFER matched, starting at position START. */ -extern int __re_match - _RE_ARGS ((struct re_pattern_buffer *buffer, const char *string, - int length, int start, struct re_registers *regs)); -extern int re_match - _RE_ARGS ((struct re_pattern_buffer *buffer, const char *string, - int length, int start, struct re_registers *regs)); - - -/* Relates to `re_match' as `re_search_2' relates to `re_search'. */ -extern int __re_match_2 - _RE_ARGS ((struct re_pattern_buffer *buffer, const char *string1, - int length1, const char *string2, int length2, - int start, struct re_registers *regs, int stop)); -extern int re_match_2 - _RE_ARGS ((struct re_pattern_buffer *buffer, const char *string1, - int length1, const char *string2, int length2, - int start, struct re_registers *regs, int stop)); - - -/* Set REGS to hold NUM_REGS registers, storing them in STARTS and - ENDS. Subsequent matches using BUFFER and REGS will use this memory - for recording register information. STARTS and ENDS must be - allocated with malloc, and must each be at least `NUM_REGS * sizeof - (regoff_t)' bytes long. - - If NUM_REGS == 0, then subsequent matches should allocate their own - register data. - - Unless this function is called, the first search or match using - PATTERN_BUFFER will allocate its own register data, without - freeing the old data. */ -extern void __re_set_registers - _RE_ARGS ((struct re_pattern_buffer *buffer, struct re_registers *regs, - unsigned num_regs, regoff_t *starts, regoff_t *ends)); -extern void re_set_registers - _RE_ARGS ((struct re_pattern_buffer *buffer, struct re_registers *regs, - unsigned num_regs, regoff_t *starts, regoff_t *ends)); - -#ifdef _REGEX_RE_COMP -# ifndef _CRAY -/* 4.2 bsd compatibility. */ -extern char *re_comp _RE_ARGS ((const char *)); -extern int re_exec _RE_ARGS ((const char *)); -# endif -#endif - -/* POSIX compatibility. */ -extern int __regcomp _RE_ARGS ((regex_t *__preg, const char *__pattern, - int __cflags)); -extern int regcomp _RE_ARGS ((regex_t *__preg, const char *__pattern, - int __cflags)); - -extern int __regexec _RE_ARGS ((const regex_t *__preg, - const char *__string, size_t __nmatch, - regmatch_t __pmatch[], int __eflags)); -extern int regexec _RE_ARGS ((const regex_t *__preg, - const char *__string, size_t __nmatch, - regmatch_t __pmatch[], int __eflags)); - -extern size_t __regerror _RE_ARGS ((int __errcode, const regex_t *__preg, - char *__errbuf, size_t __errbuf_size)); -extern size_t regerror _RE_ARGS ((int __errcode, const regex_t *__preg, - char *__errbuf, size_t __errbuf_size)); - -extern void __regfree _RE_ARGS ((regex_t *__preg)); -extern void regfree _RE_ARGS ((regex_t *__preg)); - - -#ifdef __cplusplus -} -#endif /* C++ */ - -#endif /* regex.h */ - -/* -Local variables: -make-backup-files: t -version-control: t -trim-versions-without-asking: nil -End: -*/ diff --git a/contrib/gdb/gdb/go32-xdep.c b/contrib/gdb/gdb/go32-xdep.c deleted file mode 100644 index 01c817a6b41bd..0000000000000 --- a/contrib/gdb/gdb/go32-xdep.c +++ /dev/null @@ -1,35 +0,0 @@ -/* Host-dependent code for dos running GO32 for GDB, the GNU debugger. - Copyright 1992 Free Software Foundation, Inc. - -This file is part of GDB. - -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 2 of the License, 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ - -#include <stdio.h> - -int -sigsetmask (mask) - int mask; -{ - return 0; -} - -void -strlwr (str) - char *str; -{ - for (; *str; str++) - *str = tolower(*str); -} diff --git a/contrib/gdb/gdb/hp-psymtab-read.c b/contrib/gdb/gdb/hp-psymtab-read.c deleted file mode 100644 index 5926ada3f3e7b..0000000000000 --- a/contrib/gdb/gdb/hp-psymtab-read.c +++ /dev/null @@ -1,2381 +0,0 @@ -/* Read hp debug symbols and convert to internal format, for GDB. - Copyright 1993, 1996, 1998, 1999 Free Software Foundation, Inc. - - This file is part of GDB. - - 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 2 of the License, 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - - Written by the Center for Software Science at the University of Utah - and by Cygnus Support. */ - -/* Common include file for hp_symtab_read.c and hp_psymtab_read.c. - This has nested includes of a bunch of stuff. */ -#include "hpread.h" -#include "demangle.h" - -/* To generate dumping code, uncomment this define. The dumping - itself is controlled by routine-local statics called "dumping". */ -/* #define DUMPING 1 */ - -/* To use the quick look-up tables, uncomment this define. */ -#define QUICK_LOOK_UP 1 - -/* To call PXDB to process un-processed files, uncomment this define. */ -#define USE_PXDB 1 - -/* Forward procedure declarations */ - -void hpread_symfile_init - PARAMS ((struct objfile *)); - -void -do_pxdb PARAMS ((bfd *)); - -void hpread_build_psymtabs - PARAMS ((struct objfile *, struct section_offsets *, int)); - -void hpread_symfile_finish - PARAMS ((struct objfile *)); - -static union dnttentry *hpread_get_gntt - PARAMS ((int, struct objfile *)); - -static unsigned long hpread_get_textlow - PARAMS ((int, int, struct objfile *, int)); - -static struct partial_symtab *hpread_start_psymtab - PARAMS ((struct objfile *, struct section_offsets *, char *, CORE_ADDR, int, - struct partial_symbol **, struct partial_symbol **)); - -static struct partial_symtab *hpread_end_psymtab - PARAMS ((struct partial_symtab *, char **, int, int, CORE_ADDR, - struct partial_symtab **, int)); - -/* End of forward routine declarations */ - -#ifdef USE_PXDB - -/* NOTE use of system files! May not be portable. */ - -#define PXDB_SVR4 "/opt/langtools/bin/pxdb" -#define PXDB_BSD "/usr/bin/pxdb" - -#include <stdlib.h> -#include <string.h> -#include <unistd.h> - -/* check for the existance of a file, given its full pathname */ -int -file_exists (filename) - char *filename; -{ - if (filename) - return (access (filename, F_OK) == 0); - return 0; -} - - -/* Translate from the "hp_language" enumeration in hp-symtab.h - used in the debug info to gdb's generic enumeration in defs.h. */ -static enum language -trans_lang (in_lang) - enum hp_language in_lang; -{ - if (in_lang == HP_LANGUAGE_C) - return language_c; - - else if (in_lang == HP_LANGUAGE_CPLUSPLUS) - return language_cplus; - - else if (in_lang == HP_LANGUAGE_F77) - return language_fortran; - - else - return language_unknown; -} - -static char main_string[] = "main"; - -/* Call PXDB to process our file. - - Approach copied from DDE's "dbgk_run_pxdb". Note: we - don't check for BSD location of pxdb, nor for existance - of pxdb itself, etc. - - NOTE: uses system function and string functions directly. - - Return value: 1 if ok, 0 if not */ -int -hpread_call_pxdb (file_name) - char *file_name; -{ - char *p; - int status; - int retval; - - if (file_exists (PXDB_SVR4)) - { - p = malloc (strlen (PXDB_SVR4) + strlen (file_name) + 2); - strcpy (p, PXDB_SVR4); - strcat (p, " "); - strcat (p, file_name); - - warning ("File not processed by pxdb--about to process now.\n"); - status = system (p); - - retval = (status == 0); - } - else - { - warning ("pxdb not found at standard location: /opt/langtools/bin\ngdb will not be able to debug %s.\nPlease install pxdb at the above location and then restart gdb.\nYou can also run pxdb on %s with the command\n\"pxdb %s\" and then restart gdb.", file_name, file_name, file_name); - - retval = 0; - } - return retval; -} /* hpread_call_pxdb */ - - -/* Return 1 if the file turns out to need pre-processing - by PXDB, and we have thus called PXDB to do this processing - and the file therefore needs to be re-loaded. Otherwise - return 0. */ -int -hpread_pxdb_needed (sym_bfd) - bfd *sym_bfd; -{ - asection *pinfo_section, *debug_section, *header_section; - unsigned int do_pxdb; - char *buf; - bfd_size_type header_section_size; - - unsigned long tmp; - unsigned int pxdbed; - - header_section = bfd_get_section_by_name (sym_bfd, "$HEADER$"); - if (!header_section) - { - return 0; /* No header at all, can't recover... */ - } - - debug_section = bfd_get_section_by_name (sym_bfd, "$DEBUG$"); - pinfo_section = bfd_get_section_by_name (sym_bfd, "$PINFO$"); - - if (pinfo_section && !debug_section) - { - /* Debug info with DOC, has different header format. - this only happens if the file was pxdbed and compiled optimized - otherwise the PINFO section is not there. */ - header_section_size = bfd_section_size (objfile->obfd, header_section); - - if (header_section_size == (bfd_size_type) sizeof (DOC_info_PXDB_header)) - { - buf = alloca (sizeof (DOC_info_PXDB_header)); - - if (!bfd_get_section_contents (sym_bfd, - header_section, - buf, 0, - header_section_size)) - error ("bfd_get_section_contents\n"); - - tmp = bfd_get_32 (sym_bfd, (bfd_byte *) (buf + sizeof (int) * 4)); - pxdbed = (tmp >> 31) & 0x1; - - if (!pxdbed) - error ("file debug header info invalid\n"); - do_pxdb = 0; - } - - else - error ("invalid $HEADER$ size in executable \n"); - } - - else - { - - /* this can be three different cases: - 1. pxdbed and not doc - - DEBUG and HEADER sections are there - - header is PXDB_header type - - pxdbed flag is set to 1 - - 2. not pxdbed and doc - - DEBUG and HEADER sections are there - - header is DOC_info_header type - - pxdbed flag is set to 0 - - 3. not pxdbed and not doc - - DEBUG and HEADER sections are there - - header is XDB_header type - - pxdbed flag is set to 0 - - NOTE: the pxdbed flag is meaningful also in the not - already pxdb processed version of the header, - because in case on non-already processed by pxdb files - that same bit in the header would be always zero. - Why? Because the bit is the leftmost bit of a word - which contains a 'length' which is always a positive value - so that bit is never set to 1 (otherwise it would be negative) - - Given the above, we have two choices : either we ignore the - size of the header itself and just look at the pxdbed field, - or we check the size and then we (for safety and paranoia related - issues) check the bit. - The first solution is used by DDE, the second by PXDB itself. - I am using the second one here, because I already wrote it, - and it is the end of a long day. - Also, using the first approach would still involve size issues - because we need to read in the contents of the header section, and - give the correct amount of stuff we want to read to the - get_bfd_section_contents function. */ - - /* decide which case depending on the size of the header section. - The size is as defined in hp-symtab.h */ - - header_section_size = bfd_section_size (objfile->obfd, header_section); - - if (header_section_size == (bfd_size_type) sizeof (PXDB_header)) /* pxdb and not doc */ - { - - buf = alloca (sizeof (PXDB_header)); - if (!bfd_get_section_contents (sym_bfd, - header_section, - buf, 0, - header_section_size)) - error ("bfd_get_section_contents\n"); - - tmp = bfd_get_32 (sym_bfd, (bfd_byte *) (buf + sizeof (int) * 3)); - pxdbed = (tmp >> 31) & 0x1; - - if (pxdbed) - do_pxdb = 0; - else - error ("file debug header invalid\n"); - } - else /*not pxdbed and doc OR not pxdbed and non doc */ - do_pxdb = 1; - } - - if (do_pxdb) - { - return 1; - } - else - { - return 0; - } -} /* hpread_pxdb_needed */ - -#endif - -/* Check whether the file needs to be preprocessed by pxdb. - If so, call pxdb. */ - -void -do_pxdb (sym_bfd) - bfd *sym_bfd; -{ - /* The following code is HP-specific. The "right" way of - doing this is unknown, but we bet would involve a target- - specific pre-file-load check using a generic mechanism. */ - - /* This code will not be executed if the file is not in SOM - format (i.e. if compiled with gcc) */ - if (hpread_pxdb_needed (sym_bfd)) - { - /*This file has not been pre-processed. Preprocess now */ - - if (hpread_call_pxdb (sym_bfd->filename)) - { - /* The call above has changed the on-disk file, - we can close the file anyway, because the - symbols will be reread in when the target is run */ - bfd_close (sym_bfd); - } - } -} - - - -#ifdef QUICK_LOOK_UP - -/* Code to handle quick lookup-tables follows. */ - - -/* Some useful macros */ -#define VALID_FILE(i) ((i) < pxdb_header_p->fd_entries) -#define VALID_MODULE(i) ((i) < pxdb_header_p->md_entries) -#define VALID_PROC(i) ((i) < pxdb_header_p->pd_entries) -#define VALID_CLASS(i) ((i) < pxdb_header_p->cd_entries) - -#define FILE_START(i) (qFD[i].adrStart) -#define MODULE_START(i) (qMD[i].adrStart) -#define PROC_START(i) (qPD[i].adrStart) - -#define FILE_END(i) (qFD[i].adrEnd) -#define MODULE_END(i) (qMD[i].adrEnd) -#define PROC_END(i) (qPD[i].adrEnd) - -#define FILE_ISYM(i) (qFD[i].isym) -#define MODULE_ISYM(i) (qMD[i].isym) -#define PROC_ISYM(i) (qPD[i].isym) - -#define VALID_CURR_FILE (curr_fd < pxdb_header_p->fd_entries) -#define VALID_CURR_MODULE (curr_md < pxdb_header_p->md_entries) -#define VALID_CURR_PROC (curr_pd < pxdb_header_p->pd_entries) -#define VALID_CURR_CLASS (curr_cd < pxdb_header_p->cd_entries) - -#define CURR_FILE_START (qFD[curr_fd].adrStart) -#define CURR_MODULE_START (qMD[curr_md].adrStart) -#define CURR_PROC_START (qPD[curr_pd].adrStart) - -#define CURR_FILE_END (qFD[curr_fd].adrEnd) -#define CURR_MODULE_END (qMD[curr_md].adrEnd) -#define CURR_PROC_END (qPD[curr_pd].adrEnd) - -#define CURR_FILE_ISYM (qFD[curr_fd].isym) -#define CURR_MODULE_ISYM (qMD[curr_md].isym) -#define CURR_PROC_ISYM (qPD[curr_pd].isym) - -#define TELL_OBJFILE \ - do { \ - if( !told_objfile ) { \ - told_objfile = 1; \ - warning ("\nIn object file \"%s\":\n", \ - objfile->name); \ - } \ - } while (0) - - - -/* Keeping track of the start/end symbol table (LNTT) indices of - psymtabs created so far */ - -typedef struct - { - int start; - int end; - } -pst_syms_struct; - -static pst_syms_struct *pst_syms_array = 0; - -static pst_syms_count = 0; -static pst_syms_size = 0; - -/* used by the TELL_OBJFILE macro */ -static boolean told_objfile = 0; - -/* Set up psymtab symbol index stuff */ -static void -init_pst_syms () -{ - pst_syms_count = 0; - pst_syms_size = 20; - pst_syms_array = (pst_syms_struct *) xmalloc (20 * sizeof (pst_syms_struct)); -} - -/* Clean up psymtab symbol index stuff */ -static void -clear_pst_syms () -{ - pst_syms_count = 0; - pst_syms_size = 0; - free (pst_syms_array); - pst_syms_array = 0; -} - -/* Add information about latest psymtab to symbol index table */ -static void -record_pst_syms (start_sym, end_sym) - int start_sym; - int end_sym; -{ - if (++pst_syms_count > pst_syms_size) - { - pst_syms_array = (pst_syms_struct *) xrealloc (pst_syms_array, - 2 * pst_syms_size * sizeof (pst_syms_struct)); - pst_syms_size *= 2; - } - pst_syms_array[pst_syms_count - 1].start = start_sym; - pst_syms_array[pst_syms_count - 1].end = end_sym; -} - -/* Find a suitable symbol table index which can serve as the upper - bound of a psymtab that starts at INDEX - - This scans backwards in the psymtab symbol index table to find a - "hole" in which the given index can fit. This is a heuristic!! - We don't search the entire table to check for multiple holes, - we don't care about overlaps, etc. - - Return 0 => not found */ -static int -find_next_pst_start (index) - int index; -{ - int i; - - for (i = pst_syms_count - 1; i >= 0; i--) - if (pst_syms_array[i].end <= index) - return (i == pst_syms_count - 1) ? 0 : pst_syms_array[i + 1].start - 1; - - if (pst_syms_array[0].start > index) - return pst_syms_array[0].start - 1; - - return 0; -} - - - -/* Utility functions to find the ending symbol index for a psymtab */ - -/* Find the next file entry that begins beyond INDEX, and return - its starting symbol index - 1. - QFD is the file table, CURR_FD is the file entry from where to start, - PXDB_HEADER_P as in hpread_quick_traverse (to allow macros to work). - - Return 0 => not found */ -static int -find_next_file_isym (index, qFD, curr_fd, pxdb_header_p) - int index; - quick_file_entry *qFD; - int curr_fd; - PXDB_header_ptr pxdb_header_p; -{ - while (VALID_CURR_FILE) - { - if (CURR_FILE_ISYM >= index) - return CURR_FILE_ISYM - 1; - curr_fd++; - } - return 0; -} - -/* Find the next procedure entry that begins beyond INDEX, and return - its starting symbol index - 1. - QPD is the procedure table, CURR_PD is the proc entry from where to start, - PXDB_HEADER_P as in hpread_quick_traverse (to allow macros to work). - - Return 0 => not found */ -static int -find_next_proc_isym (index, qPD, curr_pd, pxdb_header_p) - int index; - quick_procedure_entry *qPD; - int curr_pd; - PXDB_header_ptr pxdb_header_p; -{ - while (VALID_CURR_PROC) - { - if (CURR_PROC_ISYM >= index) - return CURR_PROC_ISYM - 1; - curr_pd++; - } - return 0; -} - -/* Find the next module entry that begins beyond INDEX, and return - its starting symbol index - 1. - QMD is the module table, CURR_MD is the modue entry from where to start, - PXDB_HEADER_P as in hpread_quick_traverse (to allow macros to work). - - Return 0 => not found */ -static int -find_next_module_isym (index, qMD, curr_md, pxdb_header_p) - int index; - quick_module_entry *qMD; - int curr_md; - PXDB_header_ptr pxdb_header_p; -{ - while (VALID_CURR_MODULE) - { - if (CURR_MODULE_ISYM >= index) - return CURR_MODULE_ISYM - 1; - curr_md++; - } - return 0; -} - -/* Scan and record partial symbols for all functions starting from index - pointed to by CURR_PD_P, and between code addresses START_ADR and END_ADR. - Other parameters are explained in comments below. */ - -/* This used to be inline in hpread_quick_traverse, but now that we do essentially the - same thing for two different cases (modules and module-less files), it's better - organized in a separate routine, although it does take lots of arguments. pai/1997-10-08 */ - -static int -scan_procs (curr_pd_p, qPD, max_procs, start_adr, end_adr, pst, vt_bits, objfile, section_offsets) - int *curr_pd_p; /* pointer to current proc index */ - quick_procedure_entry *qPD; /* the procedure quick lookup table */ - int max_procs; /* number of entries in proc. table */ - CORE_ADDR start_adr; /* beginning of code range for current psymtab */ - CORE_ADDR end_adr; /* end of code range for current psymtab */ - struct partial_symtab *pst; /* current psymtab */ - char *vt_bits; /* strings table of SOM debug space */ - struct objfile *objfile; /* current object file */ - struct section_offsets *section_offsets; /* not really used for HP-UX currently */ -{ - union dnttentry *dn_bufp; - int symbol_count = 0; /* Total number of symbols in this psymtab */ - int curr_pd = *curr_pd_p; /* Convenience variable -- avoid dereferencing pointer all the time */ - -#ifdef DUMPING - /* Turn this on for lots of debugging information in this routine */ - static int dumping = 0; -#endif - -#ifdef DUMPING - if (dumping) - { - printf ("Scan_procs called, addresses %x to %x, proc %x\n", start_adr, end_adr, curr_pd); - } -#endif - - while ((CURR_PROC_START <= end_adr) && (curr_pd < max_procs)) - { - - char *rtn_name; /* mangled name */ - char *rtn_dem_name; /* qualified demangled name */ - char *class_name; - int class; - - if ((trans_lang ((enum hp_language) qPD[curr_pd].language) == language_cplus) && - vt_bits[(long) qPD[curr_pd].sbAlias]) /* not a null string */ - { - /* Get mangled name for the procedure, and demangle it */ - rtn_name = &vt_bits[(long) qPD[curr_pd].sbAlias]; - rtn_dem_name = cplus_demangle (rtn_name, DMGL_ANSI | DMGL_PARAMS); - } - else - { - rtn_name = &vt_bits[(long) qPD[curr_pd].sbProc]; - rtn_dem_name = NULL; - } - - /* Hack to get around HP C/C++ compilers' insistence on providing - "_MAIN_" as an alternate name for "main" */ - if ((strcmp (rtn_name, "_MAIN_") == 0) && - (strcmp (&vt_bits[(long) qPD[curr_pd].sbProc], "main") == 0)) - rtn_dem_name = rtn_name = main_string; - -#ifdef DUMPING - if (dumping) - { - printf ("..add %s (demangled %s), index %x to this psymtab\n", rtn_name, rtn_dem_name, curr_pd); - } -#endif - - /* Check for module-spanning routines. */ - if (CURR_PROC_END > end_adr) - { - TELL_OBJFILE; - warning ("Procedure \"%s\" [0x%x] spans file or module boundaries.", rtn_name, curr_pd); - } - - /* Add this routine symbol to the list in the objfile. - Unfortunately we have to go to the LNTT to determine the - correct list to put it on. An alternative (which the - code used to do) would be to not check and always throw - it on the "static" list. But if we go that route, then - symbol_lookup() needs to be tweaked a bit to account - for the fact that the function might not be found on - the correct list in the psymtab. - RT */ - dn_bufp = hpread_get_lntt (qPD[curr_pd].isym, objfile); - if (dn_bufp->dfunc.global) - add_psymbol_with_dem_name_to_list (rtn_name, - strlen (rtn_name), - rtn_dem_name, - strlen (rtn_dem_name), - VAR_NAMESPACE, - LOC_BLOCK, /* "I am a routine" */ - &objfile->global_psymbols, - (qPD[curr_pd].adrStart + /* Starting address of rtn */ - ANOFFSET (section_offsets, SECT_OFF_TEXT)), - 0, /* core addr?? */ - trans_lang ((enum hp_language) qPD[curr_pd].language), - objfile); - else - add_psymbol_with_dem_name_to_list (rtn_name, - strlen (rtn_name), - rtn_dem_name, - strlen (rtn_dem_name), - VAR_NAMESPACE, - LOC_BLOCK, /* "I am a routine" */ - &objfile->static_psymbols, - (qPD[curr_pd].adrStart + /* Starting address of rtn */ - ANOFFSET (section_offsets, SECT_OFF_TEXT)), - 0, /* core addr?? */ - trans_lang ((enum hp_language) qPD[curr_pd].language), - objfile); - - symbol_count++; - *curr_pd_p = ++curr_pd; /* bump up count & reflect in caller */ - } /* loop over procedures */ - -#ifdef DUMPING - if (dumping) - { - if (symbol_count == 0) - printf ("Scan_procs: no symbols found!\n"); - } -#endif - - return symbol_count; -} - - -/* Traverse the quick look-up tables, building a set of psymtabs. - - This constructs a psymtab for modules and files in the quick lookup - tables. - - Mostly, modules correspond to compilation units, so we try to - create psymtabs that correspond to modules; however, in some cases - a file can result in a compiled object which does not have a module - entry for it, so in such cases we create a psymtab for the file. */ - -int -hpread_quick_traverse (objfile, section_offsets, gntt_bits, vt_bits, pxdb_header_p) - struct objfile *objfile; /* The object file descriptor */ - struct section_offsets *section_offsets; /* ?? Null for HP */ - char *gntt_bits; /* GNTT entries, loaded in from the file */ - char *vt_bits; /* VT (string) entries ditto. */ - PXDB_header_ptr pxdb_header_p; /* Pointer to pxdb header ditto */ -{ - struct partial_symtab *pst; - - char *addr; - - quick_procedure_entry *qPD; - quick_file_entry *qFD; - quick_module_entry *qMD; - quick_class_entry *qCD; - - int idx; - int i; - CORE_ADDR start_adr; /* current psymtab's starting code addr */ - CORE_ADDR end_adr; /* current psymtab's ending code addr */ - CORE_ADDR next_mod_adr; /* next module's starting code addr */ - int curr_pd; /* current procedure */ - int curr_fd; /* current file */ - int curr_md; /* current module */ - int start_sym; /* current psymtab's starting symbol index */ - int end_sym; /* current psymtab's ending symbol index */ - int max_LNTT_sym_index; - int syms_in_pst; - B_TYPE *class_entered; - - struct partial_symbol **global_syms; /* We'll be filling in the "global" */ - struct partial_symbol **static_syms; /* and "static" tables in the objfile - as we go, so we need a pair of - current pointers. */ - -#ifdef DUMPING - /* Turn this on for lots of debugging information in this routine. - You get a blow-by-blow account of quick lookup table reading */ - static int dumping = 0; -#endif - - pst = (struct partial_symtab *) 0; - - /* Clear out some globals */ - init_pst_syms (); - told_objfile = 0; - - /* Demangling style -- if EDG style already set, don't change it, - as HP style causes some problems with the KAI EDG compiler */ - if (current_demangling_style != edg_demangling) - { - /* Otherwise, ensure that we are using HP style demangling */ - set_demangling_style (HP_DEMANGLING_STYLE_STRING); - } - - /* First we need to find the starting points of the quick - look-up tables in the GNTT. */ - - addr = gntt_bits; - - qPD = (quick_procedure_entry_ptr) addr; - addr += pxdb_header_p->pd_entries * sizeof (quick_procedure_entry); - -#ifdef DUMPING - if (dumping) - { - printf ("\n Printing routines as we see them\n"); - for (i = 0; VALID_PROC (i); i++) - { - idx = (long) qPD[i].sbProc; - printf ("%s %x..%x\n", &vt_bits[idx], - (int) PROC_START (i), - (int) PROC_END (i)); - } - } -#endif - - qFD = (quick_file_entry_ptr) addr; - addr += pxdb_header_p->fd_entries * sizeof (quick_file_entry); - -#ifdef DUMPING - if (dumping) - { - printf ("\n Printing files as we see them\n"); - for (i = 0; VALID_FILE (i); i++) - { - idx = (long) qFD[i].sbFile; - printf ("%s %x..%x\n", &vt_bits[idx], - (int) FILE_START (i), - (int) FILE_END (i)); - } - } -#endif - - qMD = (quick_module_entry_ptr) addr; - addr += pxdb_header_p->md_entries * sizeof (quick_module_entry); - -#ifdef DUMPING - if (dumping) - { - printf ("\n Printing modules as we see them\n"); - for (i = 0; i < pxdb_header_p->md_entries; i++) - { - idx = (long) qMD[i].sbMod; - printf ("%s\n", &vt_bits[idx]); - } - } -#endif - - qCD = (quick_class_entry_ptr) addr; - addr += pxdb_header_p->cd_entries * sizeof (quick_class_entry); - -#ifdef DUMPING - if (dumping) - { - printf ("\n Printing classes as we see them\n"); - for (i = 0; VALID_CLASS (i); i++) - { - idx = (long) qCD[i].sbClass; - printf ("%s\n", &vt_bits[idx]); - } - - printf ("\n Done with dump, on to build!\n"); - } -#endif - - /* We need this index only while hp-symtab-read.c expects - a byte offset to the end of the LNTT entries for a given - psymtab. Thus the need for it should go away someday. - - When it goes away, then we won't have any need to load the - LNTT from the objfile at psymtab-time, and start-up will be - faster. To make that work, we'll need some way to create - a null pst for the "globals" pseudo-module. */ - max_LNTT_sym_index = LNTT_SYMCOUNT (objfile); - - /* Scan the module descriptors and make a psymtab for each. - - We know the MDs, FDs and the PDs are in order by starting - address. We use that fact to traverse all three arrays in - parallel, knowing when the next PD is in a new file - and we need to create a new psymtab. */ - curr_pd = 0; /* Current procedure entry */ - curr_fd = 0; /* Current file entry */ - curr_md = 0; /* Current module entry */ - - start_adr = 0; /* Current psymtab code range */ - end_adr = 0; - - start_sym = 0; /* Current psymtab symbol range */ - end_sym = 0; - - syms_in_pst = 0; /* Symbol count for psymtab */ - - /* Psts actually just have pointers into the objfile's - symbol table, not their own symbol tables. */ - global_syms = objfile->global_psymbols.list; - static_syms = objfile->static_psymbols.list; - - - /* First skip over pseudo-entries with address 0. These represent inlined - routines and abstract (uninstantiated) template routines. - FIXME: These should be read in and available -- even if we can't set - breakpoints, etc., there's some information that can be presented - to the user. pai/1997-10-08 */ - - while (VALID_CURR_PROC && (CURR_PROC_START == 0)) - curr_pd++; - - /* Loop over files, modules, and procedures in code address order. Each - time we enter an iteration of this loop, curr_pd points to the first - unprocessed procedure, curr_fd points to the first unprocessed file, and - curr_md to the first unprocessed module. Each iteration of this loop - updates these as required -- any or all of them may be bumpd up - each time around. When we exit this loop, we are done with all files - and modules in the tables -- there may still be some procedures, however. - - Note: This code used to loop only over module entries, under the assumption - that files can occur via inclusions and are thus unreliable, while a - compiled object always corresponds to a module. With CTTI in the HP aCC - compiler, it turns out that compiled objects may have only files and no - modules; so we have to loop over files and modules, creating psymtabs for - either as appropriate. Unfortunately there are some problems (notably: - 1. the lack of "SRC_FILE_END" entries in the LNTT, 2. the lack of pointers - to the ending symbol indices of a module or a file) which make it quite hard - to do this correctly. Currently it uses a bunch of heuristics to start and - end psymtabs; they seem to work well with most objects generated by aCC, but - who knows when that will change... */ - - while (VALID_CURR_FILE || VALID_CURR_MODULE) - { - - char *mod_name_string; - char *full_name_string; - - /* First check for modules like "version.c", which have no code - in them but still have qMD entries. They also have no qFD or - qPD entries. Their start address is -1 and their end address - is 0. */ - if (VALID_CURR_MODULE && (CURR_MODULE_START == -1) && (CURR_MODULE_END == 0)) - { - - mod_name_string = &vt_bits[(long) qMD[curr_md].sbMod]; - -#ifdef DUMPING - if (dumping) - printf ("Module with data only %s\n", mod_name_string); -#endif - - /* We'll skip the rest (it makes error-checking easier), and - just make an empty pst. Right now empty psts are not put - in the pst chain, so all this is for naught, but later it - might help. */ - - pst = hpread_start_psymtab (objfile, - section_offsets, /* ?? */ - mod_name_string, - CURR_MODULE_START, /* Low text address: bogus! */ - (CURR_MODULE_ISYM * sizeof (struct dntt_type_block)), - /* ldsymoff */ - global_syms, - static_syms); - - pst = hpread_end_psymtab (pst, - NULL, /* psymtab_include_list */ - 0, /* includes_used */ - end_sym * sizeof (struct dntt_type_block), - /* byte index in LNTT of end - = capping symbol offset - = LDSYMOFF of nextfile */ - 0, /* text high */ - NULL, /* dependency_list */ - 0); /* dependencies_used */ - - global_syms = objfile->global_psymbols.next; - static_syms = objfile->static_psymbols.next; - - curr_md++; - } - else if (VALID_CURR_MODULE && - ((CURR_MODULE_START == 0) || (CURR_MODULE_START == -1) || - (CURR_MODULE_END == 0) || (CURR_MODULE_END == -1))) - { - TELL_OBJFILE; - warning ("Module \"%s\" [0x%x] has non-standard addresses. It starts at 0x%x, ends at 0x%x, and will be skipped.", - mod_name_string, curr_md, start_adr, end_adr); - /* On to next module */ - curr_md++; - } - else - { - /* First check if we are looking at a file with code in it - that does not overlap the current module's code range */ - - if (VALID_CURR_FILE ? (VALID_CURR_MODULE ? (CURR_FILE_END < CURR_MODULE_START) : 1) : 0) - { - - /* Looking at file not corresponding to any module, - create a psymtab for it */ - full_name_string = &vt_bits[(long) qFD[curr_fd].sbFile]; - start_adr = CURR_FILE_START; - end_adr = CURR_FILE_END; - start_sym = CURR_FILE_ISYM; - - /* Check if there are any procedures not handled until now, that - begin before the start address of this file, and if so, adjust - this module's start address to include them. This handles routines that - are in between file or module ranges for some reason (probably - indicates a compiler bug */ - - if (CURR_PROC_START < start_adr) - { - TELL_OBJFILE; - warning ("Found procedure \"%s\" [0x%x] that is not in any file or module.", - &vt_bits[(long) qPD[curr_pd].sbProc], curr_pd); - start_adr = CURR_PROC_START; - if (CURR_PROC_ISYM < start_sym) - start_sym = CURR_PROC_ISYM; - } - - /* Sometimes (compiler bug -- COBOL) the module end address is higher - than the start address of the next module, so check for that and - adjust accordingly */ - - if (VALID_FILE (curr_fd + 1) && (FILE_START (curr_fd + 1) <= end_adr)) - { - TELL_OBJFILE; - warning ("File \"%s\" [0x%x] has ending address after starting address of next file; adjusting ending address down.", - full_name_string, curr_fd); - end_adr = FILE_START (curr_fd + 1) - 1; /* Is -4 (or -8 for 64-bit) better? */ - } - if (VALID_MODULE (curr_md) && (CURR_MODULE_START <= end_adr)) - { - TELL_OBJFILE; - warning ("File \"%s\" [0x%x] has ending address after starting address of next module; adjusting ending address down.", - full_name_string, curr_fd); - end_adr = CURR_MODULE_START - 1; /* Is -4 (or -8 for 64-bit) better? */ - } - - -#ifdef DUMPING - if (dumping) - { - printf ("Make new psymtab for file %s (%x to %x).\n", - full_name_string, start_adr, end_adr); - } -#endif - /* Create the basic psymtab, connecting it in the list - for this objfile and pointing its symbol entries - to the current end of the symbol areas in the objfile. - - The "ldsymoff" parameter is the byte offset in the LNTT - of the first symbol in this file. Some day we should - turn this into an index (fix in hp-symtab-read.c as well). - And it's not even the right byte offset, as we're using - the size of a union! FIXME! */ - pst = hpread_start_psymtab (objfile, - section_offsets, /* ?? */ - full_name_string, - start_adr, /* Low text address */ - (start_sym * sizeof (struct dntt_type_block)), - /* ldsymoff */ - global_syms, - static_syms); - - /* Set up to only enter each class referenced in this module once. */ - class_entered = malloc (B_BYTES (pxdb_header_p->cd_entries)); - B_CLRALL (class_entered, pxdb_header_p->cd_entries); - - /* Scan the procedure descriptors for procedures in the current - file, based on the starting addresses. */ - - syms_in_pst = scan_procs (&curr_pd, qPD, pxdb_header_p->pd_entries, - start_adr, end_adr, - pst, vt_bits, objfile, section_offsets); - - /* Get ending symbol offset */ - - end_sym = 0; - /* First check for starting index before previous psymtab */ - if (pst_syms_count && start_sym < pst_syms_array[pst_syms_count - 1].end) - { - end_sym = find_next_pst_start (start_sym); - } - /* Look for next start index of a file or module, or procedure */ - if (!end_sym) - { - int next_file_isym = find_next_file_isym (start_sym, qFD, curr_fd + 1, pxdb_header_p); - int next_module_isym = find_next_module_isym (start_sym, qMD, curr_md, pxdb_header_p); - int next_proc_isym = find_next_proc_isym (start_sym, qPD, curr_pd, pxdb_header_p); - - if (next_file_isym && next_module_isym) - { - /* pick lower of next file or module start index */ - end_sym = min (next_file_isym, next_module_isym); - } - else - { - /* one of them is zero, pick the other */ - end_sym = max (next_file_isym, next_module_isym); - } - - /* As a precaution, check next procedure index too */ - if (!end_sym) - end_sym = next_proc_isym; - else - end_sym = min (end_sym, next_proc_isym); - } - - /* Couldn't find procedure, file, or module, use globals as default */ - if (!end_sym) - end_sym = pxdb_header_p->globals; - -#ifdef DUMPING - if (dumping) - { - printf ("File psymtab indices: %x to %x\n", start_sym, end_sym); - } -#endif - - pst = hpread_end_psymtab (pst, - NULL, /* psymtab_include_list */ - 0, /* includes_used */ - end_sym * sizeof (struct dntt_type_block), - /* byte index in LNTT of end - = capping symbol offset - = LDSYMOFF of nextfile */ - end_adr, /* text high */ - NULL, /* dependency_list */ - 0); /* dependencies_used */ - - record_pst_syms (start_sym, end_sym); - - if (NULL == pst) - warning ("No symbols in psymtab for file \"%s\" [0x%x].", full_name_string, curr_fd); - -#ifdef DUMPING - if (dumping) - { - printf ("Made new psymtab for file %s (%x to %x), sym %x to %x.\n", - full_name_string, start_adr, end_adr, CURR_FILE_ISYM, end_sym); - } -#endif - /* Prepare for the next psymtab. */ - global_syms = objfile->global_psymbols.next; - static_syms = objfile->static_psymbols.next; - free (class_entered); - - curr_fd++; - } /* Psymtab for file */ - else - { - /* We have a module for which we create a psymtab */ - - mod_name_string = &vt_bits[(long) qMD[curr_md].sbMod]; - - /* We will include the code ranges of any files that happen to - overlap with this module */ - - /* So, first pick the lower of the file's and module's start addresses */ - start_adr = CURR_MODULE_START; - if (VALID_CURR_FILE) - { - if (CURR_FILE_START < CURR_MODULE_START) - { - TELL_OBJFILE; - warning ("File \"%s\" [0x%x] crosses beginning of module \"%s\".", - &vt_bits[(long) qFD[curr_fd].sbFile], - curr_fd, mod_name_string); - - start_adr = CURR_FILE_START; - } - } - - /* Also pick the lower of the file's and the module's start symbol indices */ - start_sym = CURR_MODULE_ISYM; - if (VALID_CURR_FILE && (CURR_FILE_ISYM < CURR_MODULE_ISYM)) - start_sym = CURR_FILE_ISYM; - - /* For the end address, we scan through the files till we find one - that overlaps the current module but ends beyond it; if no such file exists we - simply use the module's start address. - (Note, if file entries themselves overlap - we take the longest overlapping extension beyond the end of the module...) - We assume that modules never overlap. */ - - end_adr = CURR_MODULE_END; - - if (VALID_CURR_FILE) - { - while (VALID_CURR_FILE && (CURR_FILE_START < end_adr)) - { - -#ifdef DUMPING - if (dumping) - printf ("Maybe skipping file %s which overlaps with module %s\n", - &vt_bits[(long) qFD[curr_fd].sbFile], mod_name_string); -#endif - if (CURR_FILE_END > end_adr) - { - TELL_OBJFILE; - warning ("File \"%s\" [0x%x] crosses end of module \"%s\".", - &vt_bits[(long) qFD[curr_fd].sbFile], - curr_fd, mod_name_string); - end_adr = CURR_FILE_END; - } - curr_fd++; - } - curr_fd--; /* back up after going too far */ - } - - /* Sometimes (compiler bug -- COBOL) the module end address is higher - than the start address of the next module, so check for that and - adjust accordingly */ - - if (VALID_MODULE (curr_md + 1) && (MODULE_START (curr_md + 1) <= end_adr)) - { - TELL_OBJFILE; - warning ("Module \"%s\" [0x%x] has ending address after starting address of next module; adjusting ending address down.", - mod_name_string, curr_md); - end_adr = MODULE_START (curr_md + 1) - 1; /* Is -4 (or -8 for 64-bit) better? */ - } - if (VALID_FILE (curr_fd + 1) && (FILE_START (curr_fd + 1) <= end_adr)) - { - TELL_OBJFILE; - warning ("Module \"%s\" [0x%x] has ending address after starting address of next file; adjusting ending address down.", - mod_name_string, curr_md); - end_adr = FILE_START (curr_fd + 1) - 1; /* Is -4 (or -8 for 64-bit) better? */ - } - - /* Use one file to get the full name for the module. This - situation can arise if there is executable code in a #include - file. Each file with code in it gets a qFD. Files which don't - contribute code don't get a qFD, even if they include files - which do, e.g.: - - body.c: rtn.h: - int x; int main() { - #include "rtn.h" return x; - } - - There will a qFD for "rtn.h",and a qMD for "body.c", - but no qMD for "rtn.h" or qFD for "body.c"! - - We pick the name of the last file to overlap with this - module. C convention is to put include files first. In a - perfect world, we could check names and use the file whose full - path name ends with the module name. */ - - if (VALID_CURR_FILE) - full_name_string = &vt_bits[(long) qFD[curr_fd].sbFile]; - else - full_name_string = mod_name_string; - - /* Check if there are any procedures not handled until now, that - begin before the start address we have now, and if so, adjust - this psymtab's start address to include them. This handles routines that - are in between file or module ranges for some reason (probably - indicates a compiler bug */ - - if (CURR_PROC_START < start_adr) - { - TELL_OBJFILE; - warning ("Found procedure \"%s\" [0x%x] that is not in any file or module.", - &vt_bits[(long) qPD[curr_pd].sbProc], curr_pd); - start_adr = CURR_PROC_START; - if (CURR_PROC_ISYM < start_sym) - start_sym = CURR_PROC_ISYM; - } - -#ifdef DUMPING - if (dumping) - { - printf ("Make new psymtab for module %s (%x to %x), using file %s\n", - mod_name_string, start_adr, end_adr, full_name_string); - } -#endif - /* Create the basic psymtab, connecting it in the list - for this objfile and pointing its symbol entries - to the current end of the symbol areas in the objfile. - - The "ldsymoff" parameter is the byte offset in the LNTT - of the first symbol in this file. Some day we should - turn this into an index (fix in hp-symtab-read.c as well). - And it's not even the right byte offset, as we're using - the size of a union! FIXME! */ - pst = hpread_start_psymtab (objfile, - section_offsets, /* ?? */ - full_name_string, - start_adr, /* Low text address */ - (start_sym * sizeof (struct dntt_type_block)), - /* ldsymoff */ - global_syms, - static_syms); - - /* Set up to only enter each class referenced in this module once. */ - class_entered = malloc (B_BYTES (pxdb_header_p->cd_entries)); - B_CLRALL (class_entered, pxdb_header_p->cd_entries); - - /* Scan the procedure descriptors for procedures in the current - module, based on the starting addresses. */ - - syms_in_pst = scan_procs (&curr_pd, qPD, pxdb_header_p->pd_entries, - start_adr, end_adr, - pst, vt_bits, objfile, section_offsets); - - /* Get ending symbol offset */ - - end_sym = 0; - /* First check for starting index before previous psymtab */ - if (pst_syms_count && start_sym < pst_syms_array[pst_syms_count - 1].end) - { - end_sym = find_next_pst_start (start_sym); - } - /* Look for next start index of a file or module, or procedure */ - if (!end_sym) - { - int next_file_isym = find_next_file_isym (start_sym, qFD, curr_fd + 1, pxdb_header_p); - int next_module_isym = find_next_module_isym (start_sym, qMD, curr_md + 1, pxdb_header_p); - int next_proc_isym = find_next_proc_isym (start_sym, qPD, curr_pd, pxdb_header_p); - - if (next_file_isym && next_module_isym) - { - /* pick lower of next file or module start index */ - end_sym = min (next_file_isym, next_module_isym); - } - else - { - /* one of them is zero, pick the other */ - end_sym = max (next_file_isym, next_module_isym); - } - - /* As a precaution, check next procedure index too */ - if (!end_sym) - end_sym = next_proc_isym; - else - end_sym = min (end_sym, next_proc_isym); - } - - /* Couldn't find procedure, file, or module, use globals as default */ - if (!end_sym) - end_sym = pxdb_header_p->globals; - -#ifdef DUMPING - if (dumping) - { - printf ("Module psymtab indices: %x to %x\n", start_sym, end_sym); - } -#endif - - pst = hpread_end_psymtab (pst, - NULL, /* psymtab_include_list */ - 0, /* includes_used */ - end_sym * sizeof (struct dntt_type_block), - /* byte index in LNTT of end - = capping symbol offset - = LDSYMOFF of nextfile */ - end_adr, /* text high */ - NULL, /* dependency_list */ - 0); /* dependencies_used */ - - record_pst_syms (start_sym, end_sym); - - if (NULL == pst) - warning ("No symbols in psymtab for module \"%s\" [0x%x].", mod_name_string, curr_md); - -#ifdef DUMPING - if (dumping) - { - printf ("Made new psymtab for module %s (%x to %x), sym %x to %x.\n", - mod_name_string, start_adr, end_adr, CURR_MODULE_ISYM, end_sym); - } -#endif - - /* Prepare for the next psymtab. */ - global_syms = objfile->global_psymbols.next; - static_syms = objfile->static_psymbols.next; - free (class_entered); - - curr_md++; - curr_fd++; - } /* psymtab for module */ - } /* psymtab for non-bogus file or module */ - } /* End of while loop over all files & modules */ - - /* There may be some routines after all files and modules -- these will get - inserted in a separate new module of their own */ - if (VALID_CURR_PROC) - { - start_adr = CURR_PROC_START; - end_adr = qPD[pxdb_header_p->pd_entries - 1].adrEnd; - TELL_OBJFILE; - warning ("Found functions beyond end of all files and modules [0x%x].", curr_pd); -#ifdef DUMPING - if (dumping) - { - printf ("Orphan functions at end, PD %d and beyond (%x to %x)\n", - curr_pd, start_adr, end_adr); - } -#endif - pst = hpread_start_psymtab (objfile, - section_offsets, /* ?? */ - "orphans", - start_adr, /* Low text address */ - (CURR_PROC_ISYM * sizeof (struct dntt_type_block)), - /* ldsymoff */ - global_syms, - static_syms); - - scan_procs (&curr_pd, qPD, pxdb_header_p->pd_entries, - start_adr, end_adr, - pst, vt_bits, objfile, section_offsets); - - pst = hpread_end_psymtab (pst, - NULL, /* psymtab_include_list */ - 0, /* includes_used */ - pxdb_header_p->globals * sizeof (struct dntt_type_block), - /* byte index in LNTT of end - = capping symbol offset - = LDSYMOFF of nextfile */ - end_adr, /* text high */ - NULL, /* dependency_list */ - 0); /* dependencies_used */ - } - - -#ifdef NEVER_NEVER - /* Now build psts for non-module things (in the tail of - the LNTT, after the last END MODULE entry). - - If null psts were kept on the chain, this would be - a solution. FIXME */ - pst = hpread_start_psymtab (objfile, - section_offsets, - "globals", - 0, - (pxdb_header_p->globals - * sizeof (struct dntt_type_block)), - objfile->global_psymbols.next, - objfile->static_psymbols.next); - hpread_end_psymtab (pst, - NULL, 0, - (max_LNTT_sym_index * sizeof (struct dntt_type_block)), - 0, - NULL, 0); -#endif - - clear_pst_syms (); - - return 1; - -} /* End of hpread_quick_traverse. */ - - -/* Get appropriate header, based on pxdb type. - Return value: 1 if ok, 0 if not */ -int -hpread_get_header (objfile, pxdb_header_p) - struct objfile *objfile; - PXDB_header_ptr pxdb_header_p; -{ - asection *pinfo_section, *debug_section, *header_section; - -#ifdef DUMPING - /* Turn on for debugging information */ - static int dumping = 0; -#endif - - header_section = bfd_get_section_by_name (objfile->obfd, "$HEADER$"); - if (!header_section) - { - /* We don't have either PINFO or DEBUG sections. But - stuff like "libc.sl" has no debug info. There's no - need to warn the user of this, as it may be ok. The - caller will figure it out and issue any needed - messages. */ -#ifdef DUMPING - if (dumping) - printf ("==No debug info at all for %s.\n", objfile->name); -#endif - - return 0; - } - - /* We would like either a $DEBUG$ or $PINFO$ section. - Once we know which, we can understand the header - data (which we have defined to suit the more common - $DEBUG$ case). */ - debug_section = bfd_get_section_by_name (objfile->obfd, "$DEBUG$"); - pinfo_section = bfd_get_section_by_name (objfile->obfd, "$PINFO$"); - if (debug_section) - { - /* The expected case: normal pxdb header. */ - bfd_get_section_contents (objfile->obfd, header_section, - pxdb_header_p, 0, sizeof (PXDB_header)); - - if (!pxdb_header_p->pxdbed) - { - /* This shouldn't happen if we check in "symfile.c". */ - return 0; - } /* DEBUG section */ - } - - else if (pinfo_section) - { - /* The DOC case; we need to translate this into a - regular header. */ - DOC_info_PXDB_header doc_header; - -#ifdef DUMPING - if (dumping) - { - printf ("==OOps, PINFO, let's try to handle this, %s.\n", objfile->name); - } -#endif - - bfd_get_section_contents (objfile->obfd, - header_section, - &doc_header, 0, - sizeof (DOC_info_PXDB_header)); - - if (!doc_header.pxdbed) - { - /* This shouldn't happen if we check in "symfile.c". */ - warning ("File \"%s\" not processed by pxdb!", objfile->name); - return 0; - } - - /* Copy relevent fields to standard header passed in. */ - pxdb_header_p->pd_entries = doc_header.pd_entries; - pxdb_header_p->fd_entries = doc_header.fd_entries; - pxdb_header_p->md_entries = doc_header.md_entries; - pxdb_header_p->pxdbed = doc_header.pxdbed; - pxdb_header_p->bighdr = doc_header.bighdr; - pxdb_header_p->sa_header = doc_header.sa_header; - pxdb_header_p->inlined = doc_header.inlined; - pxdb_header_p->globals = doc_header.globals; - pxdb_header_p->time = doc_header.time; - pxdb_header_p->pg_entries = doc_header.pg_entries; - pxdb_header_p->functions = doc_header.functions; - pxdb_header_p->files = doc_header.files; - pxdb_header_p->cd_entries = doc_header.cd_entries; - pxdb_header_p->aa_entries = doc_header.aa_entries; - pxdb_header_p->oi_entries = doc_header.oi_entries; - pxdb_header_p->version = doc_header.version; - } /* PINFO section */ - - else - { -#ifdef DUMPING - if (dumping) - printf ("==No debug info at all for %s.\n", objfile->name); -#endif - - return 0; - - } - - return 1; -} /* End of hpread_get_header */ -#endif /* QUICK_LOOK_UP */ - - -/* Initialization for reading native HP C debug symbols from OBJFILE. - - Its only purpose in life is to set up the symbol reader's private - per-objfile data structures, and read in the raw contents of the debug - sections (attaching pointers to the debug info into the private data - structures). - - Since BFD doesn't know how to read debug symbols in a format-independent - way (and may never do so...), we have to do it ourselves. Note we may - be called on a file without native HP C debugging symbols. - - FIXME, there should be a cleaner peephole into the BFD environment - here. */ -void -hpread_symfile_init (objfile) - struct objfile *objfile; -{ - asection *vt_section, *slt_section, *lntt_section, *gntt_section; - - /* Allocate struct to keep track of the symfile */ - objfile->sym_private = (PTR) - xmmalloc (objfile->md, sizeof (struct hpread_symfile_info)); - memset (objfile->sym_private, 0, sizeof (struct hpread_symfile_info)); - - /* We haven't read in any types yet. */ - TYPE_VECTOR (objfile) = 0; - - /* Read in data from the $GNTT$ subspace. */ - gntt_section = bfd_get_section_by_name (objfile->obfd, "$GNTT$"); - if (!gntt_section) - return; - - GNTT (objfile) - = obstack_alloc (&objfile->symbol_obstack, - bfd_section_size (objfile->obfd, gntt_section)); - - bfd_get_section_contents (objfile->obfd, gntt_section, GNTT (objfile), - 0, bfd_section_size (objfile->obfd, gntt_section)); - - GNTT_SYMCOUNT (objfile) - = bfd_section_size (objfile->obfd, gntt_section) - / sizeof (struct dntt_type_block); - - /* Read in data from the $LNTT$ subspace. Also keep track of the number - of LNTT symbols. - - FIXME: this could be moved into the psymtab-to-symtab expansion - code, and save startup time. At the moment this data is - still used, though. We'd need a way to tell hp-symtab-read.c - whether or not to load the LNTT. */ - lntt_section = bfd_get_section_by_name (objfile->obfd, "$LNTT$"); - if (!lntt_section) - return; - - LNTT (objfile) - = obstack_alloc (&objfile->symbol_obstack, - bfd_section_size (objfile->obfd, lntt_section)); - - bfd_get_section_contents (objfile->obfd, lntt_section, LNTT (objfile), - 0, bfd_section_size (objfile->obfd, lntt_section)); - - LNTT_SYMCOUNT (objfile) - = bfd_section_size (objfile->obfd, lntt_section) - / sizeof (struct dntt_type_block); - - /* Read in data from the $SLT$ subspace. $SLT$ contains information - on source line numbers. */ - slt_section = bfd_get_section_by_name (objfile->obfd, "$SLT$"); - if (!slt_section) - return; - - SLT (objfile) = - obstack_alloc (&objfile->symbol_obstack, - bfd_section_size (objfile->obfd, slt_section)); - - bfd_get_section_contents (objfile->obfd, slt_section, SLT (objfile), - 0, bfd_section_size (objfile->obfd, slt_section)); - - /* Read in data from the $VT$ subspace. $VT$ contains things like - names and constants. Keep track of the number of symbols in the VT. */ - vt_section = bfd_get_section_by_name (objfile->obfd, "$VT$"); - if (!vt_section) - return; - - VT_SIZE (objfile) = bfd_section_size (objfile->obfd, vt_section); - - VT (objfile) = - (char *) obstack_alloc (&objfile->symbol_obstack, - VT_SIZE (objfile)); - - bfd_get_section_contents (objfile->obfd, vt_section, VT (objfile), - 0, VT_SIZE (objfile)); -} - -/* Scan and build partial symbols for a symbol file. - - The minimal symbol table (either SOM or HP a.out) has already been - read in; all we need to do is setup partial symbols based on the - native debugging information. - - Note that the minimal table is produced by the linker, and has - only global routines in it; the psymtab is based on compiler- - generated debug information and has non-global - routines in it as well as files and class information. - - We assume hpread_symfile_init has been called to initialize the - symbol reader's private data structures. - - SECTION_OFFSETS contains offsets relative to which the symbols in the - various sections are (depending where the sections were actually loaded). - MAINLINE is true if we are reading the main symbol table (as - opposed to a shared lib or dynamically loaded file). */ -void -hpread_build_psymtabs (objfile, section_offsets, mainline) - struct objfile *objfile; - struct section_offsets *section_offsets; - int mainline; -{ - -#ifdef DUMPING - /* Turn this on to get debugging output. */ - static int dumping = 0; -#endif - - char *namestring; - int past_first_source_file = 0; - struct cleanup *old_chain; - - int hp_symnum, symcount, i; - int scan_start = 0; - - union dnttentry *dn_bufp; - unsigned long valu; - char *p; - int texthigh = 0; - int have_name = 0; - - /* Current partial symtab */ - struct partial_symtab *pst; - - /* List of current psymtab's include files */ - char **psymtab_include_list; - int includes_allocated; - int includes_used; - - /* Index within current psymtab dependency list */ - struct partial_symtab **dependency_list; - int dependencies_used, dependencies_allocated; - - /* Just in case the stabs reader left turds lying around. */ - free_pending_blocks (); - make_cleanup ((make_cleanup_func) really_free_pendings, 0); - - pst = (struct partial_symtab *) 0; - - /* We shouldn't use alloca, instead use malloc/free. Doing so avoids - a number of problems with cross compilation and creating useless holes - in the stack when we have to allocate new entries. FIXME. */ - - includes_allocated = 30; - includes_used = 0; - psymtab_include_list = (char **) alloca (includes_allocated * - sizeof (char *)); - - dependencies_allocated = 30; - dependencies_used = 0; - dependency_list = - (struct partial_symtab **) alloca (dependencies_allocated * - sizeof (struct partial_symtab *)); - - old_chain = make_cleanup ((make_cleanup_func) free_objfile, objfile); - - last_source_file = 0; - -#ifdef QUICK_LOOK_UP - { - /* Begin code for new-style loading of quick look-up tables. */ - - /* elz: this checks whether the file has beeen processed by pxdb. - If not we would like to try to read the psymbols in - anyway, but it turns out to be not so easy. So this could - actually be commented out, but I leave it in, just in case - we decide to add support for non-pxdb-ed stuff in the future. */ - PXDB_header pxdb_header; - int found_modules_in_program; - - if (hpread_get_header (objfile, &pxdb_header)) - { - /* Build a minimal table. No types, no global variables, - no include files.... */ -#ifdef DUMPING - if (dumping) - printf ("\nNew method for %s\n", objfile->name); -#endif - - /* elz: quick_traverse returns true if it found - some modules in the main source file, other - than those in end.c - In C and C++, all the files have MODULES entries - in the LNTT, and the quick table traverse is all - based on finding these MODULES entries. Without - those it cannot work. - It happens that F77 programs don't have MODULES - so the quick traverse gets confused. F90 programs - have modules, and the quick method still works. - So, if modules (other than those in end.c) are - not found we give up on the quick table stuff, - and fall back on the slower method */ - found_modules_in_program = hpread_quick_traverse (objfile, - section_offsets, - GNTT (objfile), - VT (objfile), - &pxdb_header); - - discard_cleanups (old_chain); - - /* Set up to scan the global section of the LNTT. - - This field is not always correct: if there are - no globals, it will point to the last record in - the regular LNTT, which is usually an END MODULE. - - Since it might happen that there could be a file - with just one global record, there's no way to - tell other than by looking at the record, so that's - done below. */ - if (found_modules_in_program) - scan_start = pxdb_header.globals; - } -#ifdef DUMPING - else - { - if (dumping) - printf ("\nGoing on to old method for %s\n", objfile->name); - } -#endif - } -#endif /* QUICK_LOOK_UP */ - - /* Make two passes, one over the GNTT symbols, the other for the - LNTT symbols. - - JB comment: above isn't true--they only make one pass, over - the LNTT. */ - for (i = 0; i < 1; i++) - { - int within_function = 0; - - if (i) - symcount = GNTT_SYMCOUNT (objfile); - else - symcount = LNTT_SYMCOUNT (objfile); - - - for (hp_symnum = scan_start; hp_symnum < symcount; hp_symnum++) - { - QUIT; - if (i) - dn_bufp = hpread_get_gntt (hp_symnum, objfile); - else - dn_bufp = hpread_get_lntt (hp_symnum, objfile); - - if (dn_bufp->dblock.extension) - continue; - - /* Only handle things which are necessary for minimal symbols. - everything else is ignored. */ - switch (dn_bufp->dblock.kind) - { - case DNTT_TYPE_SRCFILE: - { -#ifdef QUICK_LOOK_UP - if (scan_start == hp_symnum - && symcount == hp_symnum + 1) - { - /* If there are NO globals in an executable, - PXDB's index to the globals will point to - the last record in the file, which - could be this record. (this happened for F77 libraries) - ignore it and be done! */ - continue; - } -#endif /* QUICK_LOOK_UP */ - - /* A source file of some kind. Note this may simply - be an included file. */ - SET_NAMESTRING (dn_bufp, &namestring, objfile); - - /* Check if this is the source file we are already working - with. */ - if (pst && !strcmp (namestring, pst->filename)) - continue; - - /* Check if this is an include file, if so check if we have - already seen it. Add it to the include list */ - p = strrchr (namestring, '.'); - if (!strcmp (p, ".h")) - { - int j, found; - - found = 0; - for (j = 0; j < includes_used; j++) - if (!strcmp (namestring, psymtab_include_list[j])) - { - found = 1; - break; - } - if (found) - continue; - - /* Add it to the list of includes seen so far and - allocate more include space if necessary. */ - psymtab_include_list[includes_used++] = namestring; - if (includes_used >= includes_allocated) - { - char **orig = psymtab_include_list; - - psymtab_include_list = (char **) - alloca ((includes_allocated *= 2) * - sizeof (char *)); - memcpy ((PTR) psymtab_include_list, (PTR) orig, - includes_used * sizeof (char *)); - } - continue; - } - - if (pst) - { - if (!have_name) - { - pst->filename = (char *) - obstack_alloc (&pst->objfile->psymbol_obstack, - strlen (namestring) + 1); - strcpy (pst->filename, namestring); - have_name = 1; - continue; - } - continue; - } - - /* This is a bonafide new source file. - End the current partial symtab and start a new one. */ - - if (pst && past_first_source_file) - { - hpread_end_psymtab (pst, psymtab_include_list, - includes_used, - (hp_symnum - * sizeof (struct dntt_type_block)), - texthigh, - dependency_list, dependencies_used); - pst = (struct partial_symtab *) 0; - includes_used = 0; - dependencies_used = 0; - } - else - past_first_source_file = 1; - - valu = hpread_get_textlow (i, hp_symnum, objfile, symcount); - valu += ANOFFSET (section_offsets, SECT_OFF_TEXT); - pst = hpread_start_psymtab (objfile, section_offsets, - namestring, valu, - (hp_symnum - * sizeof (struct dntt_type_block)), - objfile->global_psymbols.next, - objfile->static_psymbols.next); - texthigh = valu; - have_name = 1; - continue; - } - - case DNTT_TYPE_MODULE: - /* A source file. It's still unclear to me what the - real difference between a DNTT_TYPE_SRCFILE and DNTT_TYPE_MODULE - is supposed to be. */ - - /* First end the previous psymtab */ - if (pst) - { - hpread_end_psymtab (pst, psymtab_include_list, includes_used, - ((hp_symnum - 1) - * sizeof (struct dntt_type_block)), - texthigh, - dependency_list, dependencies_used); - pst = (struct partial_symtab *) 0; - includes_used = 0; - dependencies_used = 0; - have_name = 0; - } - - /* Now begin a new module and a new psymtab for it */ - SET_NAMESTRING (dn_bufp, &namestring, objfile); - valu = hpread_get_textlow (i, hp_symnum, objfile, symcount); - valu += ANOFFSET (section_offsets, SECT_OFF_TEXT); - if (!pst) - { - pst = hpread_start_psymtab (objfile, section_offsets, - namestring, valu, - (hp_symnum - * sizeof (struct dntt_type_block)), - objfile->global_psymbols.next, - objfile->static_psymbols.next); - texthigh = valu; - have_name = 0; - } - continue; - - case DNTT_TYPE_FUNCTION: - case DNTT_TYPE_ENTRY: - /* The beginning of a function. DNTT_TYPE_ENTRY may also denote - a secondary entry point. */ - valu = dn_bufp->dfunc.hiaddr + ANOFFSET (section_offsets, - SECT_OFF_TEXT); - if (valu > texthigh) - texthigh = valu; - valu = dn_bufp->dfunc.lowaddr + - ANOFFSET (section_offsets, SECT_OFF_TEXT); - SET_NAMESTRING (dn_bufp, &namestring, objfile); - if (dn_bufp->dfunc.global) - add_psymbol_to_list (namestring, strlen (namestring), - VAR_NAMESPACE, LOC_BLOCK, - &objfile->global_psymbols, valu, - 0, language_unknown, objfile); - else - add_psymbol_to_list (namestring, strlen (namestring), - VAR_NAMESPACE, LOC_BLOCK, - &objfile->static_psymbols, valu, - 0, language_unknown, objfile); - within_function = 1; - continue; - - case DNTT_TYPE_DOC_FUNCTION: - valu = dn_bufp->ddocfunc.hiaddr + ANOFFSET (section_offsets, - SECT_OFF_TEXT); - if (valu > texthigh) - texthigh = valu; - valu = dn_bufp->ddocfunc.lowaddr + - ANOFFSET (section_offsets, SECT_OFF_TEXT); - SET_NAMESTRING (dn_bufp, &namestring, objfile); - if (dn_bufp->ddocfunc.global) - add_psymbol_to_list (namestring, strlen (namestring), - VAR_NAMESPACE, LOC_BLOCK, - &objfile->global_psymbols, valu, - 0, language_unknown, objfile); - else - add_psymbol_to_list (namestring, strlen (namestring), - VAR_NAMESPACE, LOC_BLOCK, - &objfile->static_psymbols, valu, - 0, language_unknown, objfile); - within_function = 1; - continue; - - case DNTT_TYPE_BEGIN: - case DNTT_TYPE_END: - /* We don't check MODULE end here, because there can be - symbols beyond the module end which properly belong to the - current psymtab -- so we wait till the next MODULE start */ - - -#ifdef QUICK_LOOK_UP - if (scan_start == hp_symnum - && symcount == hp_symnum + 1) - { - /* If there are NO globals in an executable, - PXDB's index to the globals will point to - the last record in the file, which is - probably an END MODULE, i.e. this record. - ignore it and be done! */ - continue; - } -#endif /* QUICK_LOOK_UP */ - - /* Scope block begin/end. We only care about function - and file blocks right now. */ - - if ((dn_bufp->dend.endkind == DNTT_TYPE_FUNCTION) || - (dn_bufp->dend.endkind == DNTT_TYPE_DOC_FUNCTION)) - within_function = 0; - continue; - - case DNTT_TYPE_SVAR: - case DNTT_TYPE_DVAR: - case DNTT_TYPE_TYPEDEF: - case DNTT_TYPE_TAGDEF: - { - /* Variables, typedefs an the like. */ - enum address_class storage; - namespace_enum namespace; - - /* Don't add locals to the partial symbol table. */ - if (within_function - && (dn_bufp->dblock.kind == DNTT_TYPE_SVAR - || dn_bufp->dblock.kind == DNTT_TYPE_DVAR)) - continue; - - /* TAGDEFs go into the structure namespace. */ - if (dn_bufp->dblock.kind == DNTT_TYPE_TAGDEF) - namespace = STRUCT_NAMESPACE; - else - namespace = VAR_NAMESPACE; - - /* What kind of "storage" does this use? */ - if (dn_bufp->dblock.kind == DNTT_TYPE_SVAR) - storage = LOC_STATIC; - else if (dn_bufp->dblock.kind == DNTT_TYPE_DVAR - && dn_bufp->ddvar.regvar) - storage = LOC_REGISTER; - else if (dn_bufp->dblock.kind == DNTT_TYPE_DVAR) - storage = LOC_LOCAL; - else - storage = LOC_UNDEF; - - SET_NAMESTRING (dn_bufp, &namestring, objfile); - if (!pst) - { - pst = hpread_start_psymtab (objfile, section_offsets, - "globals", 0, - (hp_symnum - * sizeof (struct dntt_type_block)), - objfile->global_psymbols.next, - objfile->static_psymbols.next); - } - - /* Compute address of the data symbol */ - valu = dn_bufp->dsvar.location; - /* Relocate in case it's in a shared library */ - if (storage == LOC_STATIC) - valu += ANOFFSET (section_offsets, SECT_OFF_DATA); - - /* Luckily, dvar, svar, typedef, and tagdef all - have their "global" bit in the same place, so it works - (though it's bad programming practice) to reference - "dsvar.global" even though we may be looking at - any of the above four types. */ - if (dn_bufp->dsvar.global) - { - add_psymbol_to_list (namestring, strlen (namestring), - namespace, storage, - &objfile->global_psymbols, - valu, - 0, language_unknown, objfile); - } - else - { - add_psymbol_to_list (namestring, strlen (namestring), - namespace, storage, - &objfile->static_psymbols, - valu, - 0, language_unknown, objfile); - } - - /* For TAGDEF's, the above code added the tagname to the - struct namespace. This will cause tag "t" to be found - on a reference of the form "(struct t) x". But for - C++ classes, "t" will also be a typename, which we - want to find on a reference of the form "ptype t". - Therefore, we also add "t" to the var namespace. - Do the same for enum's due to the way aCC generates - debug info for these (see more extended comment - in hp-symtab-read.c). - We do the same for templates, so that "ptype t" - where "t" is a template also works. */ - if (dn_bufp->dblock.kind == DNTT_TYPE_TAGDEF && - dn_bufp->dtype.type.dnttp.index < LNTT_SYMCOUNT (objfile)) - { - int global = dn_bufp->dtag.global; - /* Look ahead to see if it's a C++ class */ - dn_bufp = hpread_get_lntt (dn_bufp->dtype.type.dnttp.index, objfile); - if (dn_bufp->dblock.kind == DNTT_TYPE_CLASS || - dn_bufp->dblock.kind == DNTT_TYPE_ENUM || - dn_bufp->dblock.kind == DNTT_TYPE_TEMPLATE) - { - if (global) - { - add_psymbol_to_list (namestring, strlen (namestring), - VAR_NAMESPACE, storage, - &objfile->global_psymbols, - dn_bufp->dsvar.location, - 0, language_unknown, objfile); - } - else - { - add_psymbol_to_list (namestring, strlen (namestring), - VAR_NAMESPACE, storage, - &objfile->static_psymbols, - dn_bufp->dsvar.location, - 0, language_unknown, objfile); - } - } - } - } - continue; - - case DNTT_TYPE_MEMENUM: - case DNTT_TYPE_CONST: - /* Constants and members of enumerated types. */ - SET_NAMESTRING (dn_bufp, &namestring, objfile); - if (!pst) - { - pst = hpread_start_psymtab (objfile, section_offsets, - "globals", 0, - (hp_symnum - * sizeof (struct dntt_type_block)), - objfile->global_psymbols.next, - objfile->static_psymbols.next); - } - if (dn_bufp->dconst.global) - add_psymbol_to_list (namestring, strlen (namestring), - VAR_NAMESPACE, LOC_CONST, - &objfile->global_psymbols, 0, - 0, language_unknown, objfile); - else - add_psymbol_to_list (namestring, strlen (namestring), - VAR_NAMESPACE, LOC_CONST, - &objfile->static_psymbols, 0, - 0, language_unknown, objfile); - continue; - default: - continue; - } - } - } - - /* End any pending partial symbol table. */ - if (pst) - { - hpread_end_psymtab (pst, psymtab_include_list, includes_used, - hp_symnum * sizeof (struct dntt_type_block), - 0, dependency_list, dependencies_used); - } - - discard_cleanups (old_chain); -} - -/* Perform any local cleanups required when we are done with a particular - objfile. I.E, we are in the process of discarding all symbol information - for an objfile, freeing up all memory held for it, and unlinking the - objfile struct from the global list of known objfiles. */ - -void -hpread_symfile_finish (objfile) - struct objfile *objfile; -{ - if (objfile->sym_private != NULL) - { - mfree (objfile->md, objfile->sym_private); - } -} - - -/* The remaining functions are all for internal use only. */ - -/* Various small functions to get entries in the debug symbol sections. */ - -union dnttentry * -hpread_get_lntt (index, objfile) - int index; - struct objfile *objfile; -{ - return (union dnttentry *) - &(LNTT (objfile)[(index * sizeof (struct dntt_type_block))]); -} - -static union dnttentry * -hpread_get_gntt (index, objfile) - int index; - struct objfile *objfile; -{ - return (union dnttentry *) - &(GNTT (objfile)[(index * sizeof (struct dntt_type_block))]); -} - -union sltentry * -hpread_get_slt (index, objfile) - int index; - struct objfile *objfile; -{ - return (union sltentry *) &(SLT (objfile)[index * sizeof (union sltentry)]); -} - -/* Get the low address associated with some symbol (typically the start - of a particular source file or module). Since that information is not - stored as part of the DNTT_TYPE_MODULE or DNTT_TYPE_SRCFILE symbol we must infer it from - the existance of DNTT_TYPE_FUNCTION symbols. */ - -static unsigned long -hpread_get_textlow (global, index, objfile, symcount) - int global; - int index; - struct objfile *objfile; - int symcount; -{ - union dnttentry *dn_bufp; - struct minimal_symbol *msymbol; - - /* Look for a DNTT_TYPE_FUNCTION symbol. */ - if (index < symcount) /* symcount is the number of symbols in */ - { /* the dbinfo, LNTT table */ - do - { - if (global) - dn_bufp = hpread_get_gntt (index++, objfile); - else - dn_bufp = hpread_get_lntt (index++, objfile); - } - while (dn_bufp->dblock.kind != DNTT_TYPE_FUNCTION - && dn_bufp->dblock.kind != DNTT_TYPE_DOC_FUNCTION - && dn_bufp->dblock.kind != DNTT_TYPE_END - && index < symcount); - } - - /* Avoid going past a DNTT_TYPE_END when looking for a DNTT_TYPE_FUNCTION. This - might happen when a sourcefile has no functions. */ - if (dn_bufp->dblock.kind == DNTT_TYPE_END) - return 0; - - /* Avoid going past the end of the LNTT file */ - if (index == symcount) - return 0; - - /* The minimal symbols are typically more accurate for some reason. */ - if (dn_bufp->dblock.kind == DNTT_TYPE_FUNCTION) - msymbol = lookup_minimal_symbol (dn_bufp->dfunc.name + VT (objfile), NULL, - objfile); - else /* must be a DNTT_TYPE_DOC_FUNCTION */ - msymbol = lookup_minimal_symbol (dn_bufp->ddocfunc.name + VT (objfile), NULL, - objfile); - - if (msymbol) - return SYMBOL_VALUE_ADDRESS (msymbol); - else - return dn_bufp->dfunc.lowaddr; -} - -/* Allocate and partially fill a partial symtab. It will be - completely filled at the end of the symbol list. - - SYMFILE_NAME is the name of the symbol-file we are reading from, and ADDR - is the address relative to which its symbols are (incremental) or 0 - (normal). */ - -static struct partial_symtab * -hpread_start_psymtab (objfile, section_offsets, - filename, textlow, ldsymoff, global_syms, static_syms) - struct objfile *objfile; - struct section_offsets *section_offsets; - char *filename; - CORE_ADDR textlow; - int ldsymoff; - struct partial_symbol **global_syms; - struct partial_symbol **static_syms; -{ - int offset = ANOFFSET (section_offsets, SECT_OFF_TEXT); - extern void hpread_psymtab_to_symtab (); - struct partial_symtab *result = - start_psymtab_common (objfile, section_offsets, - filename, textlow, global_syms, static_syms); - - result->textlow += offset; - result->read_symtab_private = (char *) - obstack_alloc (&objfile->psymbol_obstack, sizeof (struct symloc)); - LDSYMOFF (result) = ldsymoff; - result->read_symtab = hpread_psymtab_to_symtab; - - return result; -} - - -/* Close off the current usage of PST. - Returns PST or NULL if the partial symtab was empty and thrown away. - - capping_symbol_offset --Byte index in LNTT or GNTT of the - last symbol processed during the build - of the previous pst. - - FIXME: List variables and peculiarities of same. */ - -static struct partial_symtab * -hpread_end_psymtab (pst, include_list, num_includes, capping_symbol_offset, - capping_text, dependency_list, number_dependencies) - struct partial_symtab *pst; - char **include_list; - int num_includes; - int capping_symbol_offset; - CORE_ADDR capping_text; - struct partial_symtab **dependency_list; - int number_dependencies; -{ - int i; - struct objfile *objfile = pst->objfile; - int offset = ANOFFSET (pst->section_offsets, SECT_OFF_TEXT); - -#ifdef DUMPING - /* Turn on to see what kind of a psymtab we've built. */ - static int dumping = 0; -#endif - - if (capping_symbol_offset != -1) - LDSYMLEN (pst) = capping_symbol_offset - LDSYMOFF (pst); - else - LDSYMLEN (pst) = 0; - pst->texthigh = capping_text + offset; - - pst->n_global_syms = - objfile->global_psymbols.next - (objfile->global_psymbols.list + pst->globals_offset); - pst->n_static_syms = - objfile->static_psymbols.next - (objfile->static_psymbols.list + pst->statics_offset); - -#ifdef DUMPING - if (dumping) - { - printf ("\nPst %s, LDSYMOFF %x (%x), LDSYMLEN %x (%x), globals %d, statics %d\n", - pst->filename, - LDSYMOFF (pst), - LDSYMOFF (pst) / sizeof (struct dntt_type_block), - LDSYMLEN (pst), - LDSYMLEN (pst) / sizeof (struct dntt_type_block), - pst->n_global_syms, pst->n_static_syms); - } -#endif - - pst->number_of_dependencies = number_dependencies; - if (number_dependencies) - { - pst->dependencies = (struct partial_symtab **) - obstack_alloc (&objfile->psymbol_obstack, - number_dependencies * sizeof (struct partial_symtab *)); - memcpy (pst->dependencies, dependency_list, - number_dependencies * sizeof (struct partial_symtab *)); - } - else - pst->dependencies = 0; - - for (i = 0; i < num_includes; i++) - { - struct partial_symtab *subpst = - allocate_psymtab (include_list[i], objfile); - - subpst->section_offsets = pst->section_offsets; - subpst->read_symtab_private = - (char *) obstack_alloc (&objfile->psymbol_obstack, - sizeof (struct symloc)); - LDSYMOFF (subpst) = - LDSYMLEN (subpst) = - subpst->textlow = - subpst->texthigh = 0; - - /* We could save slight bits of space by only making one of these, - shared by the entire set of include files. FIXME-someday. */ - subpst->dependencies = (struct partial_symtab **) - obstack_alloc (&objfile->psymbol_obstack, - sizeof (struct partial_symtab *)); - subpst->dependencies[0] = pst; - subpst->number_of_dependencies = 1; - - subpst->globals_offset = - subpst->n_global_syms = - subpst->statics_offset = - subpst->n_static_syms = 0; - - subpst->readin = 0; - subpst->symtab = 0; - subpst->read_symtab = pst->read_symtab; - } - - sort_pst_symbols (pst); - - /* If there is already a psymtab or symtab for a file of this name, remove it. - (If there is a symtab, more drastic things also happen.) - This happens in VxWorks. */ - free_named_symtabs (pst->filename); - - if (num_includes == 0 - && number_dependencies == 0 - && pst->n_global_syms == 0 - && pst->n_static_syms == 0) - { - /* Throw away this psymtab, it's empty. We can't deallocate it, since - it is on the obstack, but we can forget to chain it on the list. - Empty psymtabs happen as a result of header files which don't have - any symbols in them. There can be a lot of them. But this check - is wrong, in that a psymtab with N_SLINE entries but nothing else - is not empty, but we don't realize that. Fixing that without slowing - things down might be tricky. - It's also wrong if we're using the quick look-up tables, as - we can get empty psymtabs from modules with no routines in - them. */ - - discard_psymtab (pst); - - /* Indicate that psymtab was thrown away. */ - pst = (struct partial_symtab *) NULL; - - } - return pst; -} - - -/* End of hp-psymtab-read.c */ - -/* Set indentation to 4 spaces for Emacs; this file is - mostly non-GNU-ish in its style :-( */ -#if 0 -***Local Variables: -***c - basic - offset:4 -*** End: -#endif - - diff --git a/contrib/gdb/gdb/hp-symtab-read.c b/contrib/gdb/gdb/hp-symtab-read.c deleted file mode 100644 index 90d4a10c6bc95..0000000000000 --- a/contrib/gdb/gdb/hp-symtab-read.c +++ /dev/null @@ -1,3988 +0,0 @@ -/* Read hp debug symbols and convert to internal format, for GDB. - Copyright 1993, 1996 Free Software Foundation, Inc. - - This file is part of GDB. - - 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 2 of the License, 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - - Written by the Center for Software Science at the University of Utah - and by Cygnus Support. */ - -/* Common include for hp-symtab-read.c and hp-psymtab-read.c. - * Note this has nested includes for a bunch of stuff. - */ -#include "defs.h" -#include "symtab.h" -#include "gdbtypes.h" -#include "hpread.h" -#include "demangle.h" -#include "complaints.h" - - - - -static struct complaint hpread_unhandled_end_common_complaint = -{ - "unhandled symbol in hp-symtab-read.c: DNTT_TYPE_COMMON/DNTT_TYPE_END.\n", 0, 0 -}; - -static struct complaint hpread_unhandled_type_complaint = -{ - "hpread_type_translate: unhandled type code.", 0, 0 -}; - -static struct complaint hpread_struct_complaint = -{ - "hpread_read_struct_type: expected SVAR type...", 0, 0 -}; - -static struct complaint hpread_array_complaint = -{ - "error in hpread_array_type.", 0, 0 -}; - -static struct complaint hpread_type_lookup_complaint = -{ - "error in hpread_type_lookup().", 0, 0 -}; - - -static struct complaint hpread_unexpected_end_complaint = -{ - "internal error in hp-symtab-read.c: Unexpected DNTT_TYPE_END kind.", 0, 0 -}; - -static struct complaint hpread_tagdef_complaint = -{ - "error processing class tagdef", 0, 0 -}; - -static struct complaint hpread_unhandled_common_complaint = -{ - "unhandled symbol in hp-symtab-read.c: DNTT_TYPE_COMMON.", 0, 0 -}; - -static struct complaint hpread_unhandled_blockdata_complaint = -{ - "unhandled symbol in hp-symtab-read.c: DNTT_TYPE_BLOCKDATA.", 0, 0 -}; - - -/* Forward procedure declarations */ - -static unsigned long hpread_get_scope_start - PARAMS ((sltpointer, struct objfile *)); - -static unsigned long hpread_get_line - PARAMS ((sltpointer, struct objfile *)); - -static CORE_ADDR hpread_get_location - PARAMS ((sltpointer, struct objfile *)); - -static void hpread_psymtab_to_symtab_1 - PARAMS ((struct partial_symtab *)); - -void hpread_psymtab_to_symtab - PARAMS ((struct partial_symtab *)); - -static struct symtab *hpread_expand_symtab - PARAMS ((struct objfile *, int, int, CORE_ADDR, int, - struct section_offsets *, char *)); - -static int hpread_type_translate - PARAMS ((dnttpointer)); - -static struct type **hpread_lookup_type - PARAMS ((dnttpointer, struct objfile *)); - -static struct type *hpread_alloc_type - PARAMS ((dnttpointer, struct objfile *)); - -static struct type *hpread_read_enum_type - PARAMS ((dnttpointer, union dnttentry *, struct objfile *)); - -static struct type *hpread_read_function_type - PARAMS ((dnttpointer, union dnttentry *, struct objfile *, int)); - -static struct type *hpread_read_doc_function_type - PARAMS ((dnttpointer, union dnttentry *, struct objfile *, int)); - -static struct type *hpread_read_struct_type - PARAMS ((dnttpointer, union dnttentry *, struct objfile *)); - -static struct type *hpread_get_nth_template_arg - PARAMS ((struct objfile *, int)); - -static struct type * hpread_read_templ_arg_type - PARAMS ((dnttpointer, union dnttentry *, struct objfile *, char *)); - -static struct type *hpread_read_set_type - PARAMS ((dnttpointer, union dnttentry *, struct objfile *)); - -static struct type * hpread_read_array_type - PARAMS ((dnttpointer, union dnttentry *dn_bufp, struct objfile *objfile)); - -static struct type *hpread_read_subrange_type - PARAMS ((dnttpointer, union dnttentry *, struct objfile *)); - -static struct type * hpread_type_lookup - PARAMS ((dnttpointer, struct objfile *)); - -static sltpointer hpread_record_lines - PARAMS ((struct subfile *, sltpointer, sltpointer, - struct objfile *, CORE_ADDR)); - -static void hpread_process_one_debug_symbol - PARAMS ((union dnttentry *, char *, struct section_offsets *, - struct objfile *, CORE_ADDR, int, char *, int, int * )); - -static int hpread_get_scope_depth - PARAMS ((union dnttentry *, struct objfile *, int)); - -static void fix_static_member_physnames - PARAMS ((struct type *, char *, struct objfile *)); - -static void fixup_class_method_type - PARAMS ((struct type *, struct type *, struct objfile *)); - -static void hpread_adjust_bitoffsets PARAMS ((struct type *, int)); - -static dnttpointer hpread_get_next_skip_over_anon_unions - PARAMS ((int, dnttpointer, union dnttentry **, struct objfile *)); - -/* Global to indicate presence of HP-compiled objects, - in particular, SOM executable file with SOM debug info - Defined in symtab.c, used in hppa-tdep.c. */ -extern int hp_som_som_object_present; - -/* Static used to indicate a class type that requires a - fix-up of one of its method types */ -static struct type * fixup_class = NULL; - -/* Static used to indicate the method type that is to be - used to fix-up the type for fixup_class */ -static struct type * fixup_method = NULL; - - - -/* Get the nesting depth for the source line identified by INDEX. */ - -static unsigned long -hpread_get_scope_start (index, objfile) - sltpointer index; - struct objfile *objfile; -{ - union sltentry *sl_bufp; - - sl_bufp = hpread_get_slt (index, objfile); - return sl_bufp->sspec.backptr.dnttp.index; -} - -/* Get the source line number the the line identified by INDEX. */ - -static unsigned long -hpread_get_line (index, objfile) - sltpointer index; - struct objfile *objfile; -{ - union sltentry *sl_bufp; - - sl_bufp = hpread_get_slt (index, objfile); - return sl_bufp->snorm.line; -} - -/* Find the code address associated with a given sltpointer */ - -static CORE_ADDR -hpread_get_location (index, objfile) - sltpointer index; - struct objfile *objfile; -{ - union sltentry *sl_bufp; - int i; - - /* code location of special sltentrys is determined from context */ - sl_bufp = hpread_get_slt (index, objfile); - - if (sl_bufp->snorm.sltdesc == SLT_END) - { - /* find previous normal sltentry and get address */ - for (i = 0; ((sl_bufp->snorm.sltdesc != SLT_NORMAL) && - (sl_bufp->snorm.sltdesc != SLT_NORMAL_OFFSET) && - (sl_bufp->snorm.sltdesc != SLT_EXIT)); i++) - sl_bufp = hpread_get_slt (index - i, objfile); - if (sl_bufp->snorm.sltdesc == SLT_NORMAL_OFFSET) - return sl_bufp->snormoff.address; - else - return sl_bufp->snorm.address; - } - - /* find next normal sltentry and get address */ - for (i = 0; ((sl_bufp->snorm.sltdesc != SLT_NORMAL) && - (sl_bufp->snorm.sltdesc != SLT_NORMAL_OFFSET) && - (sl_bufp->snorm.sltdesc != SLT_EXIT)); i++) - sl_bufp = hpread_get_slt (index + i, objfile); - if (sl_bufp->snorm.sltdesc == SLT_NORMAL_OFFSET) - return sl_bufp->snormoff.address; - else - return sl_bufp->snorm.address; -} - - -/* Return 1 if an HP debug symbol of type KIND has a name associated with - * it, else return 0. (This function is not currently used, but I'll - * leave it here in case it proves useful later on. - RT). - */ - -int -hpread_has_name (kind) - enum dntt_entry_type kind; -{ - switch (kind) - { - case DNTT_TYPE_SRCFILE: - case DNTT_TYPE_MODULE: - case DNTT_TYPE_FUNCTION: - case DNTT_TYPE_DOC_FUNCTION: - case DNTT_TYPE_ENTRY: - case DNTT_TYPE_IMPORT: - case DNTT_TYPE_LABEL: - case DNTT_TYPE_FPARAM: - case DNTT_TYPE_SVAR: - case DNTT_TYPE_DVAR: - case DNTT_TYPE_CONST: - case DNTT_TYPE_TYPEDEF: - case DNTT_TYPE_TAGDEF: - case DNTT_TYPE_MEMENUM: - case DNTT_TYPE_FIELD: - case DNTT_TYPE_SA: - case DNTT_TYPE_BLOCKDATA: - case DNTT_TYPE_MEMFUNC: - case DNTT_TYPE_DOC_MEMFUNC: - return 1; - - case DNTT_TYPE_BEGIN: - case DNTT_TYPE_END: - case DNTT_TYPE_POINTER: - case DNTT_TYPE_ENUM: - case DNTT_TYPE_SET: - case DNTT_TYPE_ARRAY: - case DNTT_TYPE_STRUCT: - case DNTT_TYPE_UNION: - case DNTT_TYPE_VARIANT: - case DNTT_TYPE_FILE: - case DNTT_TYPE_FUNCTYPE: - case DNTT_TYPE_SUBRANGE: - case DNTT_TYPE_WITH: - case DNTT_TYPE_COMMON: - case DNTT_TYPE_COBSTRUCT: - case DNTT_TYPE_XREF: - case DNTT_TYPE_MACRO: - case DNTT_TYPE_CLASS_SCOPE: - case DNTT_TYPE_REFERENCE: - case DNTT_TYPE_PTRMEM: - case DNTT_TYPE_PTRMEMFUNC: - case DNTT_TYPE_CLASS: - case DNTT_TYPE_GENFIELD: - case DNTT_TYPE_VFUNC: - case DNTT_TYPE_MEMACCESS: - case DNTT_TYPE_INHERITANCE: - case DNTT_TYPE_FRIEND_CLASS: - case DNTT_TYPE_FRIEND_FUNC: - case DNTT_TYPE_MODIFIER: - case DNTT_TYPE_OBJECT_ID: - case DNTT_TYPE_TEMPLATE: - case DNTT_TYPE_TEMPLATE_ARG: - case DNTT_TYPE_FUNC_TEMPLATE: - case DNTT_TYPE_LINK: - /* DNTT_TYPE_DYN_ARRAY_DESC ? */ - /* DNTT_TYPE_DESC_SUBRANGE ? */ - /* DNTT_TYPE_BEGIN_EXT ? */ - /* DNTT_TYPE_INLN ? */ - /* DNTT_TYPE_INLN_LIST ? */ - /* DNTT_TYPE_ALIAS ? */ - default: - return 0; - } -} - -/* Do the dirty work of reading in the full symbol from a partial symbol - table. */ - -static void -hpread_psymtab_to_symtab_1 (pst) - struct partial_symtab *pst; -{ - struct cleanup *old_chain; - int i; - - /* Get out quick if passed junk. */ - if (!pst) - return; - - /* Complain if we've already read in this symbol table. */ - if (pst->readin) - { - fprintf (stderr, "Psymtab for %s already read in. Shouldn't happen.\n", - pst->filename); - return; - } - - /* Read in all partial symtabs on which this one is dependent */ - for (i = 0; i < pst->number_of_dependencies; i++) - if (!pst->dependencies[i]->readin) - { - /* Inform about additional files that need to be read in. */ - if (info_verbose) - { - fputs_filtered (" ", gdb_stdout); - wrap_here (""); - fputs_filtered ("and ", gdb_stdout); - wrap_here (""); - printf_filtered ("%s...", pst->dependencies[i]->filename); - wrap_here (""); /* Flush output */ - gdb_flush (gdb_stdout); - } - hpread_psymtab_to_symtab_1 (pst->dependencies[i]); - } - - /* If it's real... */ - if (LDSYMLEN (pst)) - { - /* Init stuff necessary for reading in symbols */ - buildsym_init (); - old_chain = make_cleanup (really_free_pendings, 0); - - pst->symtab = - hpread_expand_symtab (pst->objfile, LDSYMOFF (pst), LDSYMLEN (pst), - pst->textlow, pst->texthigh - pst->textlow, - pst->section_offsets, pst->filename); - sort_symtab_syms (pst->symtab); - - do_cleanups (old_chain); - } - - pst->readin = 1; -} - -/* Read in all of the symbols for a given psymtab for real. - Be verbose about it if the user wants that. */ - -void -hpread_psymtab_to_symtab (pst) - struct partial_symtab *pst; -{ - /* Get out quick if given junk. */ - if (!pst) - return; - - /* Sanity check. */ - if (pst->readin) - { - fprintf (stderr, "Psymtab for %s already read in. Shouldn't happen.\n", - pst->filename); - return; - } - - /* elz: setting the flag to indicate that the code of the target - was compiled using an HP compiler (aCC, cc) - the processing_acc_compilation variable is declared in the - file buildsym.h, the HP_COMPILED_TARGET is defined to be equal - to 3 in the file tm_hppa.h*/ - - processing_gcc_compilation = 0; - - if (LDSYMLEN (pst) || pst->number_of_dependencies) - { - /* Print the message now, before reading the string table, - to avoid disconcerting pauses. */ - if (info_verbose) - { - printf_filtered ("Reading in symbols for %s...", pst->filename); - gdb_flush (gdb_stdout); - } - - hpread_psymtab_to_symtab_1 (pst); - - /* Match with global symbols. This only needs to be done once, - after all of the symtabs and dependencies have been read in. */ - scan_file_globals (pst->objfile); - - /* Finish up the debug error message. */ - if (info_verbose) - printf_filtered ("done.\n"); - } -} - -/* Read in a defined section of a specific object file's symbols. - - DESC is the file descriptor for the file, positioned at the - beginning of the symtab - SYM_OFFSET is the offset within the file of - the beginning of the symbols we want to read - SYM_SIZE is the size of the symbol info to read in. - TEXT_OFFSET is the beginning of the text segment we are reading symbols for - TEXT_SIZE is the size of the text segment read in. - SECTION_OFFSETS are the relocation offsets which get added to each symbol. */ - -static struct symtab * -hpread_expand_symtab (objfile, sym_offset, sym_size, text_offset, text_size, - section_offsets, filename) - struct objfile *objfile; - int sym_offset; - int sym_size; - CORE_ADDR text_offset; - int text_size; - struct section_offsets *section_offsets; - char *filename; -{ - char *namestring; - union dnttentry *dn_bufp; - unsigned max_symnum; - int at_module_boundary = 0; - /* 1 => at end, -1 => at beginning */ - - int sym_index = sym_offset / sizeof (struct dntt_type_block); - - current_objfile = objfile; - subfile_stack = 0; - - last_source_file = 0; - - /* Demangling style -- if EDG style already set, don't change it, - as HP style causes some problems with the KAI EDG compiler */ - if (current_demangling_style != edg_demangling) { - /* Otherwise, ensure that we are using HP style demangling */ - set_demangling_style (HP_DEMANGLING_STYLE_STRING); - } - - dn_bufp = hpread_get_lntt (sym_index, objfile); - if (!((dn_bufp->dblock.kind == (unsigned char) DNTT_TYPE_SRCFILE) || - (dn_bufp->dblock.kind == (unsigned char) DNTT_TYPE_MODULE))) - { - start_symtab ("globals", NULL, 0); - record_debugformat ("HP"); - } - - /* The psymtab builder (hp-psymtab-read.c) is the one that - * determined the "sym_size" argument (i.e. how many DNTT symbols - * are in this symtab), which we use to compute "max_symnum" - * (point in DNTT to which we read). - * - * Perhaps this should be changed so that - * process_one_debug_symbol() "knows" when - * to stop reading (based on reading from the MODULE to the matching - * END), and take out this reliance on a #-syms being passed in... - * (I'm worried about the reliability of this number). But I'll - * leave it as-is, for now. - RT - * - * The change above has been made. I've left the "for" loop control - * in to prepare for backing this out again. -JB - */ - max_symnum = sym_size / sizeof (struct dntt_type_block); - /* No reason to multiply on pst side and divide on sym side... FIXME */ - - /* Read in and process each debug symbol within the specified range. - */ - for (symnum = 0; - symnum < max_symnum; - symnum++) - { - QUIT; /* Allow this to be interruptable */ - dn_bufp = hpread_get_lntt (sym_index + symnum, objfile); - - if (dn_bufp->dblock.extension) - continue; - - /* Yow! We call SET_NAMESTRING on things without names! */ - SET_NAMESTRING (dn_bufp, &namestring, objfile); - - hpread_process_one_debug_symbol (dn_bufp, namestring, section_offsets, - objfile, text_offset, text_size, - filename, symnum + sym_index, - &at_module_boundary - ); - - /* OLD COMMENTS: This routine is only called for psts. All psts - * correspond to MODULES. If we ever do lazy-reading of globals - * from the LNTT, then there will be a pst which ends when the - * LNTT ends, and not at an END MODULE entry. Then we'll have - * to re-visit this break. - - if( at_end_of_module ) - break; - - */ - - /* We no longer break out of the loop when we reach the end of a - module. The reason is that with CTTI, the compiler can generate - function symbols (for template function instantiations) which are not - in any module; typically they show up beyond a module's end, and - before the next module's start. We include them in the current - module. However, we still don't trust the MAX_SYMNUM value from - the psymtab, so we break out if we enter a new module. */ - - if (at_module_boundary == -1) - break; - } - - current_objfile = NULL; - hp_som_som_object_present = 1; /* Indicate we've processed an HP SOM SOM file */ - - return end_symtab (text_offset + text_size, objfile, 0); -} - - - - -/* Convert basic types from HP debug format into GDB internal format. */ - -static int -hpread_type_translate (typep) - dnttpointer typep; -{ - if (!typep.dntti.immediate) { - error ("error in hpread_type_translate\n."); - return; - } - - switch (typep.dntti.type) - { - case HP_TYPE_BOOLEAN: - case HP_TYPE_BOOLEAN_S300_COMPAT: - case HP_TYPE_BOOLEAN_VAX_COMPAT: - return FT_BOOLEAN; - case HP_TYPE_CHAR: /* C signed char, C++ plain char */ - - case HP_TYPE_WIDE_CHAR: - return FT_CHAR; - case HP_TYPE_INT: - if (typep.dntti.bitlength <= 8) - return FT_SIGNED_CHAR; /* C++ signed char */ - if (typep.dntti.bitlength <= 16) - return FT_SHORT; - if (typep.dntti.bitlength <= 32) - return FT_INTEGER; - return FT_LONG_LONG; - case HP_TYPE_LONG: - if (typep.dntti.bitlength <= 8) - return FT_SIGNED_CHAR; /* C++ signed char. */ - return FT_LONG; - case HP_TYPE_UNSIGNED_LONG: - if (typep.dntti.bitlength <= 8) - return FT_UNSIGNED_CHAR; /* C/C++ unsigned char */ - if (typep.dntti.bitlength <= 16) - return FT_UNSIGNED_SHORT; - if (typep.dntti.bitlength <= 32) - return FT_UNSIGNED_LONG; - return FT_UNSIGNED_LONG_LONG; - case HP_TYPE_UNSIGNED_INT: - if (typep.dntti.bitlength <= 8) - return FT_UNSIGNED_CHAR; - if (typep.dntti.bitlength <= 16) - return FT_UNSIGNED_SHORT; - if (typep.dntti.bitlength <= 32) - return FT_UNSIGNED_INTEGER; - return FT_UNSIGNED_LONG_LONG; - case HP_TYPE_REAL: - case HP_TYPE_REAL_3000: - case HP_TYPE_DOUBLE: - if (typep.dntti.bitlength == 64) - return FT_DBL_PREC_FLOAT; - if (typep.dntti.bitlength == 128) - return FT_EXT_PREC_FLOAT; - return FT_FLOAT; - case HP_TYPE_COMPLEX: - case HP_TYPE_COMPLEXS3000: - if (typep.dntti.bitlength == 128) - return FT_DBL_PREC_COMPLEX; - if (typep.dntti.bitlength == 192) - return FT_EXT_PREC_COMPLEX; - return FT_COMPLEX; - case HP_TYPE_VOID: - return FT_VOID; - case HP_TYPE_STRING200: - case HP_TYPE_LONGSTRING200: - case HP_TYPE_FTN_STRING_SPEC: - case HP_TYPE_MOD_STRING_SPEC: - case HP_TYPE_MOD_STRING_3000: - case HP_TYPE_FTN_STRING_S300_COMPAT: - case HP_TYPE_FTN_STRING_VAX_COMPAT: - return FT_STRING; - case HP_TYPE_TEMPLATE_ARG: - return FT_TEMPLATE_ARG; - case HP_TYPE_TEXT: - case HP_TYPE_FLABEL: - case HP_TYPE_PACKED_DECIMAL: - case HP_TYPE_ANYPOINTER: - case HP_TYPE_GLOBAL_ANYPOINTER: - case HP_TYPE_LOCAL_ANYPOINTER: - default: - warning ("hpread_type_translate: unhandled type code.\n"); - return FT_VOID; - } -} - -/* Given a position in the DNTT, return a pointer to the - * already-built "struct type" (if any), for the type defined - * at that position. - */ - -static struct type ** -hpread_lookup_type (hp_type, objfile) - dnttpointer hp_type; - struct objfile *objfile; -{ - unsigned old_len; - int index = hp_type.dnttp.index; - int size_changed = 0; - - /* The immediate flag indicates this doesn't actually point to - * a type DNTT. - */ - if (hp_type.dntti.immediate) - return NULL; - - /* For each objfile, we maintain a "type vector". - * This an array of "struct type *"'s with one pointer per DNTT index. - * Given a DNTT index, we look in this array to see if we have - * already processed this DNTT and if it is a type definition. - * If so, then we can locate a pointer to the already-built - * "struct type", and not build it again. - * - * The need for this arises because our DNTT-walking code wanders - * around. In particular, it will encounter the same type multiple - * times (once for each object of that type). We don't want to - * built multiple "struct type"'s for the same thing. - * - * Having said this, I should point out that this type-vector is - * an expensive way to keep track of this. If most DNTT entries are - * 3 words, the type-vector will be 1/3 the size of the DNTT itself. - * Alternative solutions: - * - Keep a compressed or hashed table. Less memory, but more expensive - * to search and update. - * - (Suggested by JB): Overwrite the DNTT entry itself - * with the info. Create a new type code "ALREADY_BUILT", and modify - * the DNTT to have that type code and point to the already-built entry. - * -RT - */ - - if (index < LNTT_SYMCOUNT (objfile)) - { - if (index >= TYPE_VECTOR_LENGTH (objfile)) - { - old_len = TYPE_VECTOR_LENGTH (objfile); - - /* See if we need to allocate a type-vector. */ - if (old_len == 0) - { - TYPE_VECTOR_LENGTH(objfile) = LNTT_SYMCOUNT (objfile) + GNTT_SYMCOUNT (objfile); - TYPE_VECTOR (objfile) = (struct type **) - xmmalloc (objfile->md, TYPE_VECTOR_LENGTH (objfile) * sizeof (struct type *)); - memset (&TYPE_VECTOR (objfile)[old_len], 0, - (TYPE_VECTOR_LENGTH (objfile) - old_len) * - sizeof (struct type *)); - } - - /* See if we need to resize type-vector. With my change to - * initially allocate a correct-size type-vector, this code - * should no longer trigger. - */ - while (index >= TYPE_VECTOR_LENGTH (objfile)) { - TYPE_VECTOR_LENGTH (objfile) *= 2; - size_changed = 1; - } - if (size_changed) { - TYPE_VECTOR (objfile) = (struct type **) - xmrealloc (objfile -> md, - (char *) TYPE_VECTOR (objfile), - (TYPE_VECTOR_LENGTH (objfile) * sizeof (struct type *))); - - memset (&TYPE_VECTOR (objfile)[old_len], 0, - (TYPE_VECTOR_LENGTH (objfile) - old_len) * - sizeof (struct type *)); - } - - } - return &TYPE_VECTOR (objfile)[index]; - } - else - return NULL; -} - -/* Possibly allocate a GDB internal type so we can internalize HP_TYPE. - Note we'll just return the address of a GDB internal type if we already - have it lying around. */ - -static struct type * -hpread_alloc_type (hp_type, objfile) - dnttpointer hp_type; - struct objfile *objfile; -{ - struct type **type_addr; - - type_addr = hpread_lookup_type (hp_type, objfile); - if (*type_addr == 0) { - *type_addr = alloc_type (objfile); - - /* A hack - if we really are a C++ class symbol, then this default - * will get overriden later on. - */ - TYPE_CPLUS_SPECIFIC (*type_addr) - = (struct cplus_struct_type *) &cplus_struct_default; - } - - return *type_addr; -} - -/* Read a native enumerated type and return it in GDB internal form. */ - -static struct type * -hpread_read_enum_type (hp_type, dn_bufp, objfile) - dnttpointer hp_type; - union dnttentry *dn_bufp; - struct objfile *objfile; -{ - struct type *type; - struct pending **symlist, *osyms, *syms; - struct pending *local_list = NULL; - int o_nsyms, nsyms = 0; - dnttpointer mem; - union dnttentry *memp; - char *name; - long n; - struct symbol *sym; - - /* Allocate a GDB type. If we've already read in this enum type, - * it'll return the already built GDB type, so stop here. - * (Note: I added this check, to conform with what's done for - * struct, union, class. - * I assume this is OK. - RT) - */ - type = hpread_alloc_type (hp_type, objfile); - if (TYPE_CODE (type) == TYPE_CODE_ENUM) - return type; - - /* HP C supports "sized enums", where a specifier such as "short" or - "char" can be used to get enums of different sizes. So don't assume - an enum is always 4 bytes long. pai/1997-08-21 */ - TYPE_LENGTH (type) = dn_bufp->denum.bitlength / 8; - - symlist = &file_symbols; - osyms = *symlist; - o_nsyms = osyms ? osyms->nsyms : 0; - - /* Get a name for each member and add it to our list of members. - * The list of "mem" SOM records we are walking should all be - * SOM type DNTT_TYPE_MEMENUM (not checked). - */ - mem = dn_bufp->denum.firstmem; - while (mem.word && mem.word != DNTTNIL) - { - memp = hpread_get_lntt (mem.dnttp.index, objfile); - - name = VT (objfile) + memp->dmember.name; - sym = (struct symbol *) obstack_alloc (&objfile->symbol_obstack, - sizeof (struct symbol)); - memset (sym, 0, sizeof (struct symbol)); - SYMBOL_NAME (sym) = obsavestring (name, strlen (name), - &objfile->symbol_obstack); - SYMBOL_CLASS (sym) = LOC_CONST; - SYMBOL_NAMESPACE (sym) = VAR_NAMESPACE; - SYMBOL_VALUE (sym) = memp->dmember.value; - add_symbol_to_list (sym, symlist); - nsyms++; - mem = memp->dmember.nextmem; - } - - /* Now that we know more about the enum, fill in more info. */ - TYPE_CODE (type) = TYPE_CODE_ENUM; - TYPE_FLAGS (type) &= ~TYPE_FLAG_STUB; - TYPE_NFIELDS (type) = nsyms; - TYPE_FIELDS (type) = (struct field *) - obstack_alloc (&objfile->type_obstack, sizeof (struct field) * nsyms); - - /* Find the symbols for the members and put them into the type. - The symbols can be found in the symlist that we put them on - to cause them to be defined. osyms contains the old value - of that symlist; everything up to there was defined by us. - - Note that we preserve the order of the enum constants, so - that in something like "enum {FOO, LAST_THING=FOO}" we print - FOO, not LAST_THING. */ - for (syms = *symlist, n = 0; syms; syms = syms->next) - { - int j = 0; - if (syms == osyms) - j = o_nsyms; - for (; j < syms->nsyms; j++, n++) - { - struct symbol *xsym = syms->symbol[j]; - SYMBOL_TYPE (xsym) = type; - TYPE_FIELD_NAME (type, n) = SYMBOL_NAME (xsym); - TYPE_FIELD_BITPOS (type, n) = SYMBOL_VALUE (xsym); - TYPE_FIELD_BITSIZE (type, n) = 0; - } - if (syms == osyms) - break; - } - - return type; -} - -/* Read and internalize a native function debug symbol. */ - -static struct type * -hpread_read_function_type (hp_type, dn_bufp, objfile, newblock) - dnttpointer hp_type; - union dnttentry *dn_bufp; - struct objfile *objfile; - int newblock; -{ - struct type *type, *type1; - struct pending *syms; - struct pending *local_list = NULL; - int nsyms = 0; - dnttpointer param; - union dnttentry *paramp; - char *name; - long n; - struct symbol *sym; - int record_args = 1; - - /* See if we've already read in this type. */ - type = hpread_alloc_type (hp_type, objfile); - if (TYPE_CODE (type) == TYPE_CODE_FUNC) - { - record_args = 0; /* already read in, don't modify type */ - } - else - { - /* Nope, so read it in and store it away. */ - if (dn_bufp->dblock.kind == DNTT_TYPE_FUNCTION || - dn_bufp->dblock.kind == DNTT_TYPE_MEMFUNC) - type1 = lookup_function_type (hpread_type_lookup (dn_bufp->dfunc.retval, - objfile)); - else if (dn_bufp->dblock.kind == DNTT_TYPE_FUNCTYPE) - type1 = lookup_function_type (hpread_type_lookup (dn_bufp->dfunctype.retval, - objfile)); - else /* expect DNTT_TYPE_FUNC_TEMPLATE */ - type1 = lookup_function_type (hpread_type_lookup (dn_bufp->dfunc_template.retval, - objfile)); - memcpy ((char *) type, (char *) type1, sizeof (struct type)); - - /* Mark it -- in the middle of processing */ - TYPE_FLAGS (type) |= TYPE_FLAG_INCOMPLETE; - } - - /* Now examine each parameter noting its type, location, and a - wealth of other information. */ - if (dn_bufp->dblock.kind == DNTT_TYPE_FUNCTION || - dn_bufp->dblock.kind == DNTT_TYPE_MEMFUNC) - param = dn_bufp->dfunc.firstparam; - else if (dn_bufp->dblock.kind == DNTT_TYPE_FUNCTYPE) - param = dn_bufp->dfunctype.firstparam; - else /* expect DNTT_TYPE_FUNC_TEMPLATE */ - param = dn_bufp->dfunc_template.firstparam; - while (param.word && param.word != DNTTNIL) - { - paramp = hpread_get_lntt (param.dnttp.index, objfile); - nsyms++; - param = paramp->dfparam.nextparam; - - /* Get the name. */ - name = VT (objfile) + paramp->dfparam.name; - sym = (struct symbol *) obstack_alloc (&objfile->symbol_obstack, - sizeof (struct symbol)); - (void) memset (sym, 0, sizeof (struct symbol)); - SYMBOL_NAME (sym) = obsavestring (name, strlen (name), - &objfile->symbol_obstack); - - /* Figure out where it lives. */ - if (paramp->dfparam.regparam) - SYMBOL_CLASS (sym) = LOC_REGPARM; - else if (paramp->dfparam.indirect) - SYMBOL_CLASS (sym) = LOC_REF_ARG; - else - SYMBOL_CLASS (sym) = LOC_ARG; - SYMBOL_NAMESPACE (sym) = VAR_NAMESPACE; - if (paramp->dfparam.copyparam) - { - SYMBOL_VALUE (sym) = paramp->dfparam.location ; -#ifdef HPREAD_ADJUST_STACK_ADDRESS - SYMBOL_VALUE (sym) - += HPREAD_ADJUST_STACK_ADDRESS (CURRENT_FUNCTION_VALUE (objfile)); -#endif - /* This is likely a pass-by-invisible reference parameter, - Hack on the symbol class to make GDB happy. */ - /* ??rehrauer: This appears to be broken w/r/t to passing - C values of type float and struct. Perhaps this ought - to be highighted as a special case, but for now, just - allowing these to be LOC_ARGs seems to work fine. - */ -#if 0 - SYMBOL_CLASS (sym) = LOC_REGPARM_ADDR; -#endif - } - else - SYMBOL_VALUE (sym) = paramp->dfparam.location; - - /* Get its type. */ - SYMBOL_TYPE (sym) = hpread_type_lookup (paramp->dfparam.type, objfile); - /* Add it to the symbol list. */ - /* Note 1 (RT) At the moment, add_symbol_to_list() is also being - * called on FPARAM symbols from the process_one_debug_symbol() - * level... so parameters are getting added twice! (this shows - * up in the symbol dump you get from "maint print symbols ..."). - * Note 2 (RT) I took out the processing of FPARAM from the - * process_one_debug_symbol() level, so at the moment parameters are only - * being processed here. This seems to have no ill effect. - */ - /* Note 3 (pai/1997-08-11) I removed the add_symbol_to_list() which put - each fparam on the local_symbols list from here. Now we use the - local_list to which fparams are added below, and set the param_symbols - global to point to that at the end of this routine. */ - /* elz: I added this new list of symbols which is local to the function. - this list is the one which is actually used to build the type for the - function rather than the gloabal list pointed to by symlist. - Using a global list to keep track of the parameters is wrong, because - this function is called recursively if one parameter happend to be - a function itself with more parameters in it. Adding parameters to the - same global symbol list would not work! - Actually it did work in case of cc compiled programs where you do - not check the parameter lists of the arguments. */ - add_symbol_to_list (sym, &local_list); - - } - - /* If type was read in earlier, don't bother with modifying - the type struct */ - if (!record_args) - goto finish; - - /* Note how many parameters we found. */ - TYPE_NFIELDS (type) = nsyms; - TYPE_FIELDS (type) = (struct field *) - obstack_alloc (&objfile->type_obstack, - sizeof (struct field) * nsyms); - - /* Find the symbols for the parameters and - use them to fill parameter-type information into the function-type. - The parameter symbols can be found in the local_list that we just put them on. */ - /* Note that we preserve the order of the parameters, so - that in something like "enum {FOO, LAST_THING=FOO}" we print - FOO, not LAST_THING. */ - - /* get the parameters types from the local list not the global list - so that the type can be correctly constructed for functions which - have function as parameters */ - for (syms = local_list, n = 0; syms; syms = syms->next) - { - int j = 0; - for (j=0; j < syms->nsyms; j++, n++) - { - struct symbol *xsym = syms->symbol[j]; - TYPE_FIELD_NAME (type, n) = SYMBOL_NAME (xsym); - TYPE_FIELD_TYPE (type, n) = SYMBOL_TYPE (xsym); - TYPE_FIELD_BITPOS (type, n) = n; - TYPE_FIELD_BITSIZE (type, n) = 0; - } - } - /* Mark it as having been processed */ - TYPE_FLAGS (type) &= ~(TYPE_FLAG_INCOMPLETE); - - /* Check whether we need to fix-up a class type with this function's type */ - if (fixup_class && (fixup_method == type)) - { - fixup_class_method_type (fixup_class, fixup_method, objfile); - fixup_class = NULL; - fixup_method = NULL; - } - - /* Set the param list of this level of the context stack - to our local list. Do this only if this function was - called for creating a new block, and not if it was called - simply to get the function type. This prevents recursive - invocations from trashing param_symbols. */ -finish: - if (newblock) - param_symbols = local_list; - - return type; -} - - -/* Read and internalize a native DOC function debug symbol. */ -/* This is almost identical to hpread_read_function_type(), except - * for references to dn_bufp->ddocfunc instead of db_bufp->dfunc. - * Since debug information for DOC functions is more likely to be - * volatile, please leave it this way. - */ -static struct type * -hpread_read_doc_function_type (hp_type, dn_bufp, objfile, newblock) - dnttpointer hp_type; - union dnttentry *dn_bufp; - struct objfile *objfile; - int newblock; -{ - struct type *type, *type1; - struct pending *syms; - struct pending *local_list = NULL; - int nsyms = 0; - dnttpointer param; - union dnttentry *paramp; - char *name; - long n; - struct symbol *sym; - int record_args = 1; - - /* See if we've already read in this type. */ - type = hpread_alloc_type (hp_type, objfile); - if (TYPE_CODE (type) == TYPE_CODE_FUNC) - { - record_args = 0; /* already read in, don't modify type */ - } - else - { - /* Nope, so read it in and store it away. */ - if (dn_bufp->dblock.kind == DNTT_TYPE_DOC_FUNCTION || - dn_bufp->dblock.kind == DNTT_TYPE_DOC_MEMFUNC) - type1 = lookup_function_type (hpread_type_lookup (dn_bufp->ddocfunc.retval, - objfile)); - memcpy ((char *) type, (char *) type1, sizeof (struct type)); - - /* Mark it -- in the middle of processing */ - TYPE_FLAGS (type) |= TYPE_FLAG_INCOMPLETE; - } - - /* Now examine each parameter noting its type, location, and a - wealth of other information. */ - if (dn_bufp->dblock.kind == DNTT_TYPE_DOC_FUNCTION || - dn_bufp->dblock.kind == DNTT_TYPE_DOC_MEMFUNC) - param = dn_bufp->ddocfunc.firstparam; - while (param.word && param.word != DNTTNIL) - { - paramp = hpread_get_lntt (param.dnttp.index, objfile); - nsyms++; - param = paramp->dfparam.nextparam; - - /* Get the name. */ - name = VT (objfile) + paramp->dfparam.name; - sym = (struct symbol *) obstack_alloc (&objfile->symbol_obstack, - sizeof (struct symbol)); - (void) memset (sym, 0, sizeof (struct symbol)); - SYMBOL_NAME (sym) = name; - - /* Figure out where it lives. */ - if (paramp->dfparam.regparam) - SYMBOL_CLASS (sym) = LOC_REGPARM; - else if (paramp->dfparam.indirect) - SYMBOL_CLASS (sym) = LOC_REF_ARG; - else - SYMBOL_CLASS (sym) = LOC_ARG; - SYMBOL_NAMESPACE (sym) = VAR_NAMESPACE; - if (paramp->dfparam.copyparam) - { - SYMBOL_VALUE (sym) = paramp->dfparam.location ; -#ifdef HPREAD_ADJUST_STACK_ADDRESS - SYMBOL_VALUE (sym) - += HPREAD_ADJUST_STACK_ADDRESS (CURRENT_FUNCTION_VALUE (objfile)); -#endif - /* This is likely a pass-by-invisible reference parameter, - Hack on the symbol class to make GDB happy. */ - /* ??rehrauer: This appears to be broken w/r/t to passing - C values of type float and struct. Perhaps this ought - to be highighted as a special case, but for now, just - allowing these to be LOC_ARGs seems to work fine. - */ -#if 0 - SYMBOL_CLASS (sym) = LOC_REGPARM_ADDR; -#endif - } - else - SYMBOL_VALUE (sym) = paramp->dfparam.location; - - /* Get its type. */ - SYMBOL_TYPE (sym) = hpread_type_lookup (paramp->dfparam.type, objfile); - /* Add it to the symbol list. */ - /* Note 1 (RT) At the moment, add_symbol_to_list() is also being - * called on FPARAM symbols from the process_one_debug_symbol() - * level... so parameters are getting added twice! (this shows - * up in the symbol dump you get from "maint print symbols ..."). - * Note 2 (RT) I took out the processing of FPARAM from the - * process_one_debug_symbol() level, so at the moment parameters are only - * being processed here. This seems to have no ill effect. - */ - /* Note 3 (pai/1997-08-11) I removed the add_symbol_to_list() which put - each fparam on the local_symbols list from here. Now we use the - local_list to which fparams are added below, and set the param_symbols - global to point to that at the end of this routine. */ - - /* elz: I added this new list of symbols which is local to the function. - this list is the one which is actually used to build the type for the - function rather than the gloabal list pointed to by symlist. - Using a global list to keep track of the parameters is wrong, because - this function is called recursively if one parameter happend to be - a function itself with more parameters in it. Adding parameters to the - same global symbol list would not work! - Actually it did work in case of cc compiled programs where you do not check the - parameter lists of the arguments. */ - add_symbol_to_list (sym, &local_list); - } - - /* If type was read in earlier, don't bother with modifying - the type struct */ - if (!record_args) - goto finish; - - /* Note how many parameters we found. */ - TYPE_NFIELDS (type) = nsyms; - TYPE_FIELDS (type) = (struct field *) - obstack_alloc (&objfile->type_obstack, - sizeof (struct field) * nsyms); - - /* Find the symbols for the parameters and - use them to fill parameter-type information into the function-type. - The parameter symbols can be found in the local_list that we just put them on. */ - /* Note that we preserve the order of the parameters, so - that in something like "enum {FOO, LAST_THING=FOO}" we print - FOO, not LAST_THING. */ - - /* get the parameters types from the local list not the global list - so that the type can be correctly constructed for functions which - have function as parameters - */ - for (syms = local_list, n = 0; syms; syms = syms->next) - { - int j = 0; - for (j = 0; j < syms->nsyms; j++, n++) - { - struct symbol *xsym = syms->symbol[j]; - TYPE_FIELD_NAME (type, n) = SYMBOL_NAME (xsym); - TYPE_FIELD_TYPE (type, n) = SYMBOL_TYPE (xsym); - TYPE_FIELD_BITPOS (type, n) = n; - TYPE_FIELD_BITSIZE (type, n) = 0; - } - } - - /* Mark it as having been processed */ - TYPE_FLAGS (type) &= ~(TYPE_FLAG_INCOMPLETE); - - /* Check whether we need to fix-up a class type with this function's type */ - if (fixup_class && (fixup_method == type)) - { - fixup_class_method_type (fixup_class, fixup_method, objfile); - fixup_class = NULL; - fixup_method = NULL; - } - - /* Set the param list of this level of the context stack - to our local list. Do this only if this function was - called for creating a new block, and not if it was called - simply to get the function type. This prevents recursive - invocations from trashing param_symbols. */ -finish: - if (newblock) - param_symbols = local_list; - - return type; -} - - - -/* A file-level variable which keeps track of the current-template - * being processed. Set in hpread_read_struct_type() while processing - * a template type. Referred to in hpread_get_nth_templ_arg(). - * Yes, this is a kludge, but it arises from the kludge that already - * exists in symtab.h, namely the fact that they encode - * "template argument n" with fundamental type FT_TEMPLATE_ARG and - * bitlength n. This means that deep in processing fundamental types - * I need to ask the question "what template am I in the middle of?". - * The alternative to stuffing a global would be to pass an argument - * down the chain of calls just for this purpose. - * - * There may be problems handling nested templates... tough. - */ -static struct type * current_template = NULL; - -/* Read in and internalize a structure definition. - * This same routine is called for struct, union, and class types. - * Also called for templates, since they build a very similar - * type entry as for class types. - */ - -static struct type * -hpread_read_struct_type (hp_type, dn_bufp, objfile) - dnttpointer hp_type; - union dnttentry *dn_bufp; - struct objfile *objfile; -{ - /* The data members get linked together into a list of struct nextfield's */ - struct nextfield - { - struct nextfield *next; - struct field field; - unsigned char attributes; /* store visibility and virtuality info */ -# define ATTR_VIRTUAL 1 -# define ATTR_PRIVATE 2 -# define ATTR_PROTECT 3 - }; - - - /* The methods get linked together into a list of struct next_fn_field's */ - struct next_fn_field - { - struct next_fn_field *next; - struct fn_fieldlist field; - struct fn_field fn_field; - int num_fn_fields; - }; - - /* The template args get linked together into a list of struct next_template's */ - struct next_template - { - struct next_template *next; - struct template_arg arg; - }; - - /* The template instantiations get linked together into a list of these... */ - struct next_instantiation - { - struct next_instantiation * next; - struct type * t; - }; - - struct type *type; - struct type *baseclass; - struct type *memtype; - struct nextfield *list = 0, *tmp_list = 0; - struct next_fn_field *fn_list = 0; - struct next_fn_field *fn_p; - struct next_template *t_new, *t_list = 0; - struct nextfield *new; - struct next_fn_field *fn_new; - struct next_instantiation *i_new, *i_list = 0; - int n, nfields = 0, n_fn_fields = 0, n_fn_fields_total = 0; - int n_base_classes = 0, n_templ_args = 0; - int ninstantiations = 0; - dnttpointer field, fn_field, parent; - union dnttentry *fieldp, *fn_fieldp, *parentp; - int i; - int static_member = 0; - int const_member = 0; - int volatile_member = 0; - unsigned long vtbl_offset; - int need_bitvectors = 0; - char * method_name = NULL; - char * method_alias = NULL; - - - /* Is it something we've already dealt with? */ - type = hpread_alloc_type (hp_type, objfile); - if ((TYPE_CODE (type) == TYPE_CODE_STRUCT) || - (TYPE_CODE (type) == TYPE_CODE_UNION) || - (TYPE_CODE (type) == TYPE_CODE_CLASS) || - (TYPE_CODE (type) == TYPE_CODE_TEMPLATE)) - return type; - - /* Get the basic type correct. */ - if (dn_bufp->dblock.kind == DNTT_TYPE_STRUCT) - { - TYPE_CODE (type) = TYPE_CODE_STRUCT; - TYPE_LENGTH (type) = dn_bufp->dstruct.bitlength / 8; - } - else if (dn_bufp->dblock.kind == DNTT_TYPE_UNION) - { - TYPE_CODE (type) = TYPE_CODE_UNION; - TYPE_LENGTH (type) = dn_bufp->dunion.bitlength / 8; - } - else if (dn_bufp->dblock.kind == DNTT_TYPE_CLASS) - { - TYPE_CODE (type) = TYPE_CODE_CLASS; - TYPE_LENGTH (type) = dn_bufp->dclass.bitlength / 8; - - /* Overrides the TYPE_CPLUS_SPECIFIC(type) with allocated memory - * rather than &cplus_struct_default. - */ - allocate_cplus_struct_type(type); - - /* Fill in declared-type. - * (The C++ compiler will emit TYPE_CODE_CLASS - * for all 3 of "class", "struct" - * "union", and we have to look at the "class_decl" field if we - * want to know how it was really declared) - */ - /* (0==class, 1==union, 2==struct) */ - TYPE_DECLARED_TYPE(type) = dn_bufp->dclass.class_decl; - } - else if (dn_bufp->dblock.kind == DNTT_TYPE_TEMPLATE) - { - /* Get the basic type correct. */ - TYPE_CODE (type) = TYPE_CODE_TEMPLATE; - allocate_cplus_struct_type(type); - TYPE_DECLARED_TYPE(type) = DECLARED_TYPE_TEMPLATE; - } - else - return type; - - - TYPE_FLAGS (type) &= ~TYPE_FLAG_STUB; - - /* For classes, read the parent list. - * Question (RT): Do we need to do this for templates also? - */ - if (dn_bufp->dblock.kind == DNTT_TYPE_CLASS) { - - /* First read the parent-list (classes from which we derive fields) */ - parent = dn_bufp->dclass.parentlist; - while (parent.word && parent.word != DNTTNIL) { - parentp = hpread_get_lntt (parent.dnttp.index, objfile); - - /* "parentp" should point to a DNTT_TYPE_INHERITANCE record */ - - /* Get space to record the next field/data-member. */ - new = (struct nextfield *) alloca (sizeof (struct nextfield)); - new->next = list; - list = new; - - FIELD_BITSIZE (list->field) = 0; - - /* The "classname" field is actually a DNTT pointer to the base class */ - baseclass = hpread_type_lookup (parentp->dinheritance.classname, - objfile); - FIELD_TYPE (list->field) = baseclass; - - list->field.name = type_name_no_tag(FIELD_TYPE (list->field)); - - list->attributes = 0; - - /* Check for virtuality of base, and set the - * offset of the base subobject within the object. - * (Offset set to -1 for virtual bases (for now).) - */ - if (parentp->dinheritance.Virtual) - { - B_SET(&(list->attributes), ATTR_VIRTUAL); - parentp->dinheritance.offset = -1; - } - else - FIELD_BITPOS (list->field) = parentp->dinheritance.offset; - - /* Check visibility */ - switch (parentp->dinheritance.visibility) - { - case 1: - B_SET(&(list->attributes), ATTR_PROTECT); - break; - case 2: - B_SET(&(list->attributes), ATTR_PRIVATE); - break; - } - - n_base_classes++; - nfields++; - - parent = parentp->dinheritance.next; - } - } - - /* For templates, read the template argument list. - * This must be done before processing the member list, because - * the member list may refer back to this. E.g.: - * template <class T1, class T2> class q2 { - * public: - * T1 a; - * T2 b; - * }; - * We need to read the argument list "T1", "T2" first. - */ - if (dn_bufp->dblock.kind == DNTT_TYPE_TEMPLATE) { - /* Kludge alert: This stuffs a global "current_template" which - * is referred to by hpread_get_nth_templ_arg(). The global - * is cleared at the end of this routine. - */ - current_template = type; - - /* Read in the argument list */ - field = dn_bufp->dtemplate.arglist; - while (field.word && field.word != DNTTNIL) { - /* Get this template argument*/ - fieldp = hpread_get_lntt (field.dnttp.index, objfile); - if (fieldp->dblock.kind != DNTT_TYPE_TEMPLATE_ARG) - { - warning ("Invalid debug info: Template argument entry is of wrong kind"); - break; - } - /* Bump the count */ - n_templ_args++; - /* Allocate and fill in a struct next_template */ - t_new = (struct next_template *) alloca (sizeof (struct next_template)); - t_new->next = t_list; - t_list = t_new; - t_list->arg.name = VT (objfile) + fieldp->dtempl_arg.name; - t_list->arg.type = hpread_read_templ_arg_type(field, fieldp, - objfile, t_list->arg.name); - /* Walk to the next template argument */ - field = fieldp->dtempl_arg.nextarg; - } - } - - TYPE_NTEMPLATE_ARGS(type) = n_templ_args; - - if (n_templ_args > 0) - TYPE_TEMPLATE_ARGS(type) = (struct template_arg *) - obstack_alloc (&objfile->type_obstack, sizeof (struct template_arg) * n_templ_args); - for (n = n_templ_args; t_list; t_list = t_list->next) - { - n -= 1; - TYPE_TEMPLATE_ARG(type, n) = t_list->arg; - } - - /* Next read in and internalize all the fields/members. */ - if (dn_bufp->dblock.kind == DNTT_TYPE_STRUCT) - field = dn_bufp->dstruct.firstfield; - else if (dn_bufp->dblock.kind == DNTT_TYPE_UNION) - field = dn_bufp->dunion.firstfield; - else if (dn_bufp->dblock.kind == DNTT_TYPE_CLASS) - field = dn_bufp->dclass.memberlist; - else if (dn_bufp->dblock.kind == DNTT_TYPE_TEMPLATE) - field = dn_bufp->dtemplate.memberlist; - else - field.word = DNTTNIL; - - while (field.word && field.word != DNTTNIL) - { - fieldp = hpread_get_lntt (field.dnttp.index, objfile); - - /* At this point "fieldp" may point to either a DNTT_TYPE_FIELD - * or a DNTT_TYPE_GENFIELD record. - */ - vtbl_offset = 0; - static_member = 0; - const_member = 0; - volatile_member = 0; - - if (fieldp->dblock.kind == DNTT_TYPE_GENFIELD) { - - /* The type will be GENFIELD if the field is a method or - * a static member (or some other cases -- see below) - */ - - /* Follow a link to get to the record for the field. */ - fn_field = fieldp->dgenfield.field; - fn_fieldp = hpread_get_lntt(fn_field.dnttp.index, objfile); - - /* Virtual funcs are indicated by a VFUNC which points to the - * real entry - */ - if (fn_fieldp->dblock.kind == DNTT_TYPE_VFUNC) { - vtbl_offset = fn_fieldp->dvfunc.vtbl_offset; - fn_field = fn_fieldp->dvfunc.funcptr; - fn_fieldp = hpread_get_lntt(fn_field.dnttp.index, objfile); - } - - /* A function's entry may be preceded by a modifier which - * labels it static/constant/volatile. - */ - if (fn_fieldp->dblock.kind == DNTT_TYPE_MODIFIER) { - static_member = fn_fieldp->dmodifier.m_static; - const_member = fn_fieldp->dmodifier.m_const; - volatile_member = fn_fieldp->dmodifier.m_volatile; - fn_field = fn_fieldp->dmodifier.type; - fn_fieldp = hpread_get_lntt(fn_field.dnttp.index, objfile); - } - - /* Check whether we have a method */ - if ((fn_fieldp->dblock.kind == DNTT_TYPE_MEMFUNC) || - (fn_fieldp->dblock.kind == DNTT_TYPE_FUNCTION) || - (fn_fieldp->dblock.kind == DNTT_TYPE_DOC_MEMFUNC) || - (fn_fieldp->dblock.kind == DNTT_TYPE_DOC_FUNCTION)) { - /* Method found */ - - short ix = 0; - - /* Look up function type of method */ - memtype = hpread_type_lookup (fn_field, objfile); - - /* Methods can be seen before classes in the SOM records. - If we are processing this class because it's a parameter of a - method, at this point the method's type is actually incomplete; - we'll have to fix it up later; mark the class for this. */ - - if (TYPE_INCOMPLETE (memtype)) - { - TYPE_FLAGS (type) |= TYPE_FLAG_INCOMPLETE; - if (fixup_class) - warning ("Two classes to fix up for method?? Type information may be incorrect for some classes."); - if (fixup_method) - warning ("Two methods to be fixed up at once?? Type information may be incorrect for some classes."); - fixup_class = type; /* remember this class has to be fixed up */ - fixup_method = memtype; /* remember the method type to be used in fixup */ - } - - /* HP aCC generates operator names without the "operator" keyword, and - generates null strings as names for operators that are - user-defined type conversions to basic types (e.g. operator int ()). - So try to reconstruct name as best as possible. */ - - method_name = (char *) (VT (objfile) + fn_fieldp->dfunc.name); - method_alias = (char *) (VT (objfile) + fn_fieldp->dfunc.alias); - - if (!method_name || /* no name */ - !*method_name || /* or null name */ - cplus_mangle_opname (method_name, DMGL_ANSI)) /* or name is an operator like "<" */ - { - char * tmp_name = cplus_demangle (method_alias, DMGL_ANSI); - char * op_string = strstr (tmp_name, "operator"); - method_name = xmalloc (strlen (op_string) + 1); /* don't overwrite VT! */ - strcpy (method_name, op_string); - } - - /* First check if a method of the same name has already been seen. */ - fn_p = fn_list; - while (fn_p) - { - if (STREQ (fn_p->field.name, method_name)) - break; - fn_p = fn_p->next; - } - - /* If no such method was found, allocate a new entry in the list */ - if (!fn_p) - { - /* Get space to record this member function */ - /* Note: alloca used; this will disappear on routine exit */ - fn_new = (struct next_fn_field *) alloca (sizeof (struct next_fn_field)); - fn_new->next = fn_list; - fn_list = fn_new; - - /* Fill in the fields of the struct nextfield */ - - /* Record the (unmangled) method name */ - fn_list->field.name = method_name; - /* Initial space for overloaded methods */ - /* Note: xmalloc is used; this will persist after this routine exits */ - fn_list->field.fn_fields = (struct fn_field *) xmalloc (5 * (sizeof (struct fn_field))); - fn_list->field.length = 1; /* Init # of overloaded instances */ - fn_list->num_fn_fields = 5; /* # of entries for which space allocated */ - fn_p = fn_list; - ix = 0; /* array index for fn_field */ - /* Bump the total count of the distinctly named methods */ - n_fn_fields++; - } - else /* Another overloaded instance of an already seen method name */ - { - if (++(fn_p->field.length) > fn_p->num_fn_fields) - { - /* Increase space allocated for overloaded instances */ - fn_p->field.fn_fields - = (struct fn_field *) xrealloc (fn_p->field.fn_fields, - (fn_p->num_fn_fields + 5) * sizeof (struct fn_field)); - fn_p->num_fn_fields += 5; - } - ix = fn_p->field.length -1; /* array index for fn_field */ - } - - /* "physname" is intended to be the name of this overloaded instance. */ - if ((fn_fieldp->dfunc.language == HP_LANGUAGE_CPLUSPLUS) && - method_alias && - *method_alias) /* not a null string */ - fn_p->field.fn_fields[ix].physname = method_alias; - else - fn_p->field.fn_fields[ix].physname = method_name; - /* What's expected here is the function type */ - /* But mark it as NULL if the method was incompletely processed - We'll fix this up later when the method is fully processed */ - if (TYPE_INCOMPLETE (memtype)) - { - fn_p->field.fn_fields[ix].type = NULL; - fn_p->field.fn_fields[ix].args = NULL; - } - else - { - fn_p->field.fn_fields[ix].type = memtype; - - /* The argument list */ - fn_p->field.fn_fields[ix].type->type_specific.arg_types = - (struct type **) obstack_alloc(&objfile->type_obstack, - sizeof(struct type *) * (memtype->nfields + 1)); - for (i = 0; i < memtype->nfields; i++) - fn_p->field.fn_fields[ix].type->type_specific.arg_types[i] = memtype->fields[i].type; - /* void termination */ - fn_p->field.fn_fields[ix].type->type_specific.arg_types[memtype->nfields] = builtin_type_void; - - /* pai: It's not clear why this args field has to be set. Perhaps - * it should be eliminated entirely. */ - fn_p->field.fn_fields[ix].args = - (struct type **) obstack_alloc(&objfile->type_obstack, - sizeof(struct type *) * (memtype->nfields + 1)); - for (i = 0; i < memtype->nfields; i++) - fn_p->field.fn_fields[ix].args[i] = memtype->fields[i].type; - /* null-terminated, unlike arg_types above e*/ - fn_p->field.fn_fields[ix].args[memtype->nfields] = NULL; - } - /* For virtual functions, fill in the voffset field with the - * virtual table offset. (This is just copied over from the - * SOM record; not sure if it is what GDB expects here...). - * But if the function is a static method, set it to 1. - * - * Note that we have to add 1 because 1 indicates a static - * method, and 0 indicates a non-static, non-virtual method */ - - if (static_member) - fn_p->field.fn_fields[ix].voffset = VOFFSET_STATIC; - else - fn_p->field.fn_fields[ix].voffset = vtbl_offset ? vtbl_offset + 1 : 0; - - /* Also fill in the fcontext field with the current - * class. (The latter isn't quite right: should be the baseclass - * that defines the virtual function... Note we do have - * a variable "baseclass" that we could stuff into the fcontext - * field, but "baseclass" isn't necessarily right either, - * since the virtual function could have been defined more - * than one level up). - */ - - if (vtbl_offset != 0) - fn_p->field.fn_fields[ix].fcontext = type; - else - fn_p->field.fn_fields[ix].fcontext = NULL; - - /* Other random fields pertaining to this method */ - fn_p->field.fn_fields[ix].is_const = const_member; - fn_p->field.fn_fields[ix].is_volatile = volatile_member; /* ?? */ - switch (fieldp->dgenfield.visibility) { - case 1: - fn_p->field.fn_fields[ix].is_protected = 1; - fn_p->field.fn_fields[ix].is_private = 0; - break; - case 2: - fn_p->field.fn_fields[ix].is_protected = 0; - fn_p->field.fn_fields[ix].is_private = 1; - break; - default: /* public */ - fn_p->field.fn_fields[ix].is_protected = 0; - fn_p->field.fn_fields[ix].is_private = 0; - } - fn_p->field.fn_fields[ix].is_stub = 0; - - /* HP aCC emits both MEMFUNC and FUNCTION entries for a method; - if the class points to the FUNCTION, there is usually separate - code for the method; but if we have a MEMFUNC, the method has - been inlined (and there is usually no FUNCTION entry) - FIXME Not sure if this test is accurate. pai/1997-08-22 */ - if ((fn_fieldp->dblock.kind == DNTT_TYPE_MEMFUNC) || - (fn_fieldp->dblock.kind == DNTT_TYPE_DOC_MEMFUNC)) - fn_p->field.fn_fields[ix].is_inlined = 1; - else - fn_p->field.fn_fields[ix].is_inlined = 0; - - fn_p->field.fn_fields[ix].dummy = 0; - - /* Bump the total count of the member functions */ - n_fn_fields_total++; - - } else if (fn_fieldp->dblock.kind == DNTT_TYPE_SVAR) { - /* This case is for static data members of classes */ - - /* pai:: FIXME -- check that "staticmem" bit is set */ - - /* Get space to record this static member */ - new = (struct nextfield *) alloca (sizeof (struct nextfield)); - new->next = list; - list = new; - - list->field.name = VT (objfile) + fn_fieldp->dsvar.name; - FIELD_BITSIZE (list->field) = -1; /* indicates static member */ - SET_FIELD_PHYSNAME (list->field, 0); /* initialize to empty */ - memtype = hpread_type_lookup (fn_fieldp->dsvar.type, objfile); - - FIELD_TYPE (list->field) = memtype; - list->attributes = 0; - switch (fieldp->dgenfield.visibility) { - case 1: - B_SET(&(list->attributes), ATTR_PROTECT); - break; - case 2: - B_SET(&(list->attributes), ATTR_PRIVATE); - break; - } - nfields++; - } - - else if (fn_fieldp->dblock.kind == DNTT_TYPE_FIELD) - { - /* FIELDs follow GENFIELDs for fields of anonymous unions. - Code below is replicated from the case for FIELDs further - below, except that fieldp is replaced by fn_fieldp */ - if (!fn_fieldp->dfield.a_union) - warning ("Debug info inconsistent: FIELD of anonymous union doesn't have a_union bit set"); - /* Get space to record the next field/data-member. */ - new = (struct nextfield *) alloca (sizeof (struct nextfield)); - new->next = list; - list = new; - - list->field.name = VT (objfile) + fn_fieldp->dfield.name; - FIELD_BITPOS (list->field) = fn_fieldp->dfield.bitoffset; - if (fn_fieldp->dfield.bitlength % 8) - list->field.bitsize = fn_fieldp->dfield.bitlength; - else - list->field.bitsize = 0; - - memtype = hpread_type_lookup (fn_fieldp->dfield.type, objfile); - list->field.type = memtype; - list->attributes = 0; - switch (fn_fieldp->dfield.visibility) { - case 1: - B_SET(&(list->attributes), ATTR_PROTECT); - break; - case 2: - B_SET(&(list->attributes), ATTR_PRIVATE); - break; - } - nfields++; - } - else if (fn_fieldp->dblock.kind == DNTT_TYPE_SVAR) - { - /* Field of anonymous union; union is not inside a class */ - if (!fn_fieldp->dsvar.a_union) - warning ("Debug info inconsistent: SVAR field in anonymous union doesn't have a_union bit set"); - /* Get space to record the next field/data-member. */ - new = (struct nextfield *) alloca (sizeof (struct nextfield)); - new->next = list; - list = new; - - list->field.name = VT (objfile) + fn_fieldp->dsvar.name; - FIELD_BITPOS (list->field) = 0; /* FIXME is this always true? */ - FIELD_BITSIZE (list->field) = 0; /* use length from type */ - memtype = hpread_type_lookup (fn_fieldp->dsvar.type, objfile); - list->field.type = memtype; - list->attributes = 0; - /* No info to set visibility -- always public */ - nfields++; - } - else if (fn_fieldp->dblock.kind == DNTT_TYPE_DVAR) - { - /* Field of anonymous union; union is not inside a class */ - if (!fn_fieldp->ddvar.a_union) - warning ("Debug info inconsistent: DVAR field in anonymous union doesn't have a_union bit set"); - /* Get space to record the next field/data-member. */ - new = (struct nextfield *) alloca (sizeof (struct nextfield)); - new->next = list; - list = new; - - list->field.name = VT (objfile) + fn_fieldp->ddvar.name; - FIELD_BITPOS (list->field) = 0; /* FIXME is this always true? */ - FIELD_BITSIZE (list->field) = 0; /* use length from type */ - memtype = hpread_type_lookup (fn_fieldp->ddvar.type, objfile); - list->field.type = memtype; - list->attributes = 0; - /* No info to set visibility -- always public */ - nfields++; - } - else { /* Not a method, nor a static data member, nor an anon union field */ - - /* This case is for miscellaneous type entries (local enums, - local function templates, etc.) that can be present - inside a class. */ - - /* Enums -- will be handled by other code that takes care - of DNTT_TYPE_ENUM; here we see only DNTT_TYPE_MEMENUM so - it's not clear we could have handled them here at all. */ - /* FUNC_TEMPLATE: is handled by other code (??). */ - /* MEMACCESS: modified access for inherited member. Not - sure what to do with this, ignoriing it at present. */ - - /* What other entries can appear following a GENFIELD which - we do not handle above? (MODIFIER, VFUNC handled above.) */ - - if ((fn_fieldp->dblock.kind != DNTT_TYPE_MEMACCESS) && - (fn_fieldp->dblock.kind != DNTT_TYPE_MEMENUM) && - (fn_fieldp->dblock.kind != DNTT_TYPE_FUNC_TEMPLATE)) - warning ("Internal error: Unexpected debug record kind %d found following DNTT_GENFIELD", - fn_fieldp->dblock.kind); - } - /* walk to the next FIELD or GENFIELD */ - field = fieldp->dgenfield.nextfield; - - } - else if (fieldp->dblock.kind == DNTT_TYPE_FIELD) { - - /* Ordinary structure/union/class field */ - struct type * anon_union_type; - - /* Get space to record the next field/data-member. */ - new = (struct nextfield *) alloca (sizeof (struct nextfield)); - new->next = list; - list = new; - - list->field.name = VT (objfile) + fieldp->dfield.name; - - - /* A FIELD by itself (without a GENFIELD) can also be a static member */ - if (fieldp->dfield.staticmem) - { - FIELD_BITPOS (list->field) = -1; - FIELD_BITSIZE (list->field) = 0; - } - else /* Non-static data member */ - { - FIELD_BITPOS (list->field) = fieldp->dfield.bitoffset; - if (fieldp->dfield.bitlength % 8) - FIELD_BITSIZE (list->field) = fieldp->dfield.bitlength; - else - FIELD_BITSIZE (list->field) = 0; - } - - memtype = hpread_type_lookup (fieldp->dfield.type, objfile); - FIELD_TYPE (list->field) = memtype; - list->attributes = 0; - switch (fieldp->dfield.visibility) { - case 1: - B_SET(&(list->attributes), ATTR_PROTECT); - break; - case 2: - B_SET(&(list->attributes), ATTR_PRIVATE); - break; - } - nfields++; - - - /* Note 1: First, we have to check if the current field is an anonymous - union. If it is, then *its* fields are threaded along in the - nextfield chain. :-( This was supposed to help debuggers, but is - really just a nuisance since we deal with anonymous unions anyway by - checking that the name is null. So anyway, we skip over the fields - of the anonymous union. pai/1997-08-22 */ - /* Note 2: In addition, the bitoffsets for the fields of the anon union - are relative to the enclosing struct, *NOT* relative to the anon - union! This is an even bigger nuisance -- we have to go in and munge - the anon union's type information appropriately. pai/1997-08-22 */ - - /* Both tasks noted above are done by a separate function. This takes us - to the next FIELD or GENFIELD, skipping anon unions, and recursively - processing intermediate types. */ - field = hpread_get_next_skip_over_anon_unions (1, field, &fieldp, objfile); - - } else { - /* neither field nor genfield ?? is this possible?? */ - /* pai:: FIXME walk to the next -- how? */ - warning ("Internal error: unexpected DNTT kind %d encountered as field of struct"); - warning ("Skipping remaining fields of struct"); - break; /* get out of loop of fields */ - } - } - - /* If it's a template, read in the instantiation list */ - if (dn_bufp->dblock.kind == DNTT_TYPE_TEMPLATE) { - ninstantiations = 0; - field = dn_bufp->dtemplate.expansions; - while (field.word && field.word != DNTTNIL) { - fieldp = hpread_get_lntt (field.dnttp.index, objfile); - - /* The expansions or nextexp should point to a tagdef */ - if (fieldp->dblock.kind != DNTT_TYPE_TAGDEF) - break; - - i_new = (struct next_instantiation *) alloca (sizeof (struct next_instantiation)); - i_new->next = i_list; - i_list = i_new; - i_list->t = hpread_type_lookup (field, objfile); - ninstantiations++; - - /* And the "type" field of that should point to a class */ - field = fieldp->dtag.type; - fieldp = hpread_get_lntt (field.dnttp.index, objfile); - if (fieldp->dblock.kind != DNTT_TYPE_CLASS) - break; - - /* Get the next expansion */ - field = fieldp->dclass.nextexp; - } - } - TYPE_NINSTANTIATIONS(type) = ninstantiations; - if (ninstantiations > 0) - TYPE_INSTANTIATIONS(type) = (struct type **) - obstack_alloc (&objfile->type_obstack, sizeof (struct type *) * ninstantiations); - for (n = ninstantiations; i_list; i_list = i_list->next) - { - n -= 1; - TYPE_INSTANTIATION(type, n) = i_list->t; - } - - - /* Copy the field-list to GDB's symbol table */ - TYPE_NFIELDS (type) = nfields; - TYPE_N_BASECLASSES (type) = n_base_classes; - TYPE_FIELDS (type) = (struct field *) - obstack_alloc (&objfile->type_obstack, sizeof (struct field) * nfields); - /* Copy the saved-up fields into the field vector. */ - for (n = nfields, tmp_list = list; tmp_list; tmp_list = tmp_list->next) - { - n -= 1; - TYPE_FIELD (type, n) = tmp_list->field; - } - - /* Copy the "function-field-list" (i.e., the list of member - * functions in the class) to GDB's symbol table - */ - TYPE_NFN_FIELDS (type) = n_fn_fields; - TYPE_NFN_FIELDS_TOTAL (type) = n_fn_fields_total; - TYPE_FN_FIELDLISTS(type) = (struct fn_fieldlist *) - obstack_alloc (&objfile->type_obstack, sizeof (struct fn_fieldlist) * n_fn_fields); - for (n = n_fn_fields; fn_list; fn_list = fn_list->next) - { - n -= 1; - TYPE_FN_FIELDLIST(type, n) = fn_list->field; - } - - /* pai:: FIXME -- perhaps each bitvector should be created individually */ - for (n = nfields, tmp_list = list; tmp_list; tmp_list = tmp_list->next) - { - n -= 1; - if (tmp_list->attributes) - { - need_bitvectors = 1; - break; - } - } - - if (need_bitvectors) - { - /* pai:: this step probably redundant */ - ALLOCATE_CPLUS_STRUCT_TYPE (type); - - TYPE_FIELD_VIRTUAL_BITS (type) = - (B_TYPE *) TYPE_ALLOC (type, B_BYTES (nfields)); - B_CLRALL (TYPE_FIELD_VIRTUAL_BITS (type), nfields); - - TYPE_FIELD_PRIVATE_BITS (type) = - (B_TYPE *) TYPE_ALLOC (type, B_BYTES (nfields)); - B_CLRALL (TYPE_FIELD_PRIVATE_BITS (type), nfields); - - TYPE_FIELD_PROTECTED_BITS (type) = - (B_TYPE *) TYPE_ALLOC (type, B_BYTES (nfields)); - B_CLRALL (TYPE_FIELD_PROTECTED_BITS (type), nfields); - - /* this field vector isn't actually used with HP aCC */ - TYPE_FIELD_IGNORE_BITS (type) = - (B_TYPE *) TYPE_ALLOC (type, B_BYTES (nfields)); - B_CLRALL (TYPE_FIELD_IGNORE_BITS (type), nfields); - - while (nfields-- > 0) - { - if (B_TST(&(list->attributes),ATTR_VIRTUAL)) - SET_TYPE_FIELD_VIRTUAL (type, nfields); - if (B_TST(&(list->attributes),ATTR_PRIVATE)) - SET_TYPE_FIELD_PRIVATE (type, nfields); - if (B_TST(&(list->attributes),ATTR_PROTECT)) - SET_TYPE_FIELD_PROTECTED (type, nfields); - - list = list->next; - } - } - else - { - TYPE_FIELD_VIRTUAL_BITS(type) = NULL; - TYPE_FIELD_PROTECTED_BITS(type) = NULL; - TYPE_FIELD_PRIVATE_BITS(type) = NULL; - } - - if (has_vtable(type)) - { - /* Allocate space for class runtime information */ - TYPE_RUNTIME_PTR(type) = (struct runtime_info *) xmalloc (sizeof(struct runtime_info)); - /* Set flag for vtable */ - TYPE_VTABLE(type) = 1; - /* The first non-virtual base class with a vtable. */ - TYPE_PRIMARY_BASE(type) = primary_base_class(type); - /* The virtual base list. */ - TYPE_VIRTUAL_BASE_LIST(type) = virtual_base_list(type); - } - else - TYPE_RUNTIME_PTR(type) = NULL; - - /* If this is a local type (C++ - declared inside a function), record file name & line # */ - if (hpread_get_scope_depth (dn_bufp, objfile, 1 /* no need for real depth */)) - { - TYPE_LOCALTYPE_PTR (type) = (struct local_type_info *) xmalloc (sizeof (struct local_type_info)); - TYPE_LOCALTYPE_FILE (type) = (char *) xmalloc (strlen (current_subfile->name) + 1); - strcpy (TYPE_LOCALTYPE_FILE (type), current_subfile->name); - if (current_subfile->line_vector && (current_subfile->line_vector->nitems > 0)) - TYPE_LOCALTYPE_LINE (type) = current_subfile->line_vector->item[current_subfile->line_vector->nitems - 1].line; - else - TYPE_LOCALTYPE_LINE (type) = 0; - } - else - TYPE_LOCALTYPE_PTR (type) = NULL; - - /* Clear the global saying what template we are in the middle of processing */ - current_template = NULL; - - return type; -} - -/* Adjust the physnames for each static member of a struct - or class type to be something like "A::x"; then various - other pieces of code that do a lookup_symbol on the phyname - work correctly. - TYPE is a pointer to the struct/class type - NAME is a char * (string) which is the class/struct name - Void return */ - -static void -fix_static_member_physnames (type, class_name, objfile) - struct type * type; - char * class_name; - struct objfile * objfile; -{ - int i; - - /* We fix the member names only for classes or structs */ - if (TYPE_CODE (type) != TYPE_CODE_STRUCT) - return; - - for (i=0; i < TYPE_NFIELDS (type); i++) - if (TYPE_FIELD_STATIC (type, i)) - { - if (TYPE_FIELD_STATIC_PHYSNAME (type, i)) - return; /* physnames are already set */ - - SET_FIELD_PHYSNAME (type->fields[i], - obstack_alloc (&objfile->type_obstack, - strlen (class_name) + strlen (TYPE_FIELD_NAME (type, i)) + 3)); - strcpy (TYPE_FIELD_STATIC_PHYSNAME (type, i), class_name); - strcat (TYPE_FIELD_STATIC_PHYSNAME (type, i), "::"); - strcat (TYPE_FIELD_STATIC_PHYSNAME (type, i), TYPE_FIELD_NAME (type, i)); - } -} - -/* Fix-up the type structure for a CLASS so that the type entry - * for a method (previously marked with a null type in hpread_read_struct_type() - * is set correctly to METHOD. - * OBJFILE is as for other such functions. - * Void return. */ - -static void -fixup_class_method_type (class, method, objfile) - struct type * class; - struct type * method; - struct objfile * objfile; -{ - int i, j, k; - - if (!class || !method || !objfile) - return; - - /* Only for types that have methods */ - if ((TYPE_CODE (class) != TYPE_CODE_CLASS) && - (TYPE_CODE (class) != TYPE_CODE_UNION)) - return; - - /* Loop over all methods and find the one marked with a NULL type */ - for (i = 0; i < TYPE_NFN_FIELDS (class); i++) - for (j = 0; j < TYPE_FN_FIELDLIST_LENGTH (class, i); j++) - if (TYPE_FN_FIELD_TYPE (TYPE_FN_FIELDLIST1 (class, i), j) == NULL) - { - /* Set the method type */ - TYPE_FN_FIELD_TYPE (TYPE_FN_FIELDLIST1 (class, i), j) = method; - /* The argument list */ - (TYPE_FN_FIELD_TYPE (TYPE_FN_FIELDLIST1 (class, i), j))->type_specific.arg_types - = (struct type **) obstack_alloc(&objfile->type_obstack, - sizeof(struct type *) * (method->nfields + 1)); - for (k = 0; k < method->nfields; k++) - (TYPE_FN_FIELD_TYPE (TYPE_FN_FIELDLIST1 (class, i), j))->type_specific.arg_types[k] = method->fields[k].type; - /* void termination */ - (TYPE_FN_FIELD_TYPE (TYPE_FN_FIELDLIST1 (class, i), j))->type_specific.arg_types[method->nfields] = builtin_type_void; - - /* pai: It's not clear why this args field has to be set. Perhaps - * it should be eliminated entirely. */ - (TYPE_FN_FIELD (TYPE_FN_FIELDLIST1 (class, i), j)).args - = (struct type **) obstack_alloc(&objfile->type_obstack, - sizeof(struct type *) * (method->nfields + 1)); - for (k = 0; k < method->nfields; k++) - (TYPE_FN_FIELD (TYPE_FN_FIELDLIST1 (class, i), j)).args[k] = method->fields[k].type; - /* null-terminated, unlike arg_types above */ - (TYPE_FN_FIELD (TYPE_FN_FIELDLIST1 (class, i), j)).args[method->nfields] = NULL; - - /* Break out of both loops -- only one method to fix up in a class */ - goto finish; - } - -finish: - TYPE_FLAGS (class) &= ~TYPE_FLAG_INCOMPLETE; -} - - -/* If we're in the middle of processing a template, get a pointer - * to the Nth template argument. - * An example may make this clearer: - * template <class T1, class T2> class q2 { - * public: - * T1 a; - * T2 b; - * }; - * The type for "a" will be "first template arg" and - * the type for "b" will be "second template arg". - * We need to look these up in order to fill in "a" and "b"'s type. - * This is called from hpread_type_lookup(). - */ -static struct type * -hpread_get_nth_template_arg(objfile, n) - struct objfile *objfile; - int n; -{ - if (current_template != NULL) - return TYPE_TEMPLATE_ARG(current_template, n).type; - else - return lookup_fundamental_type (objfile, FT_TEMPLATE_ARG); -} - -/* Read in and internalize a TEMPL_ARG (template arg) symbol. */ - -static struct type * -hpread_read_templ_arg_type (hp_type, dn_bufp, objfile, name) - dnttpointer hp_type; - union dnttentry *dn_bufp; - struct objfile *objfile; - char * name; -{ - struct type *type; - - /* See if it's something we've already deal with. */ - type = hpread_alloc_type (hp_type, objfile); - if (TYPE_CODE (type) == TYPE_CODE_TEMPLATE_ARG) - return type; - - /* Nope. Fill in the appropriate fields. */ - TYPE_CODE (type) = TYPE_CODE_TEMPLATE_ARG; - TYPE_LENGTH (type) = 0; - TYPE_NFIELDS (type) = 0; - TYPE_NAME (type) = name; - return type; -} - -/* Read in and internalize a set debug symbol. */ - -static struct type * -hpread_read_set_type (hp_type, dn_bufp, objfile) - dnttpointer hp_type; - union dnttentry *dn_bufp; - struct objfile *objfile; -{ - struct type *type; - - /* See if it's something we've already deal with. */ - type = hpread_alloc_type (hp_type, objfile); - if (TYPE_CODE (type) == TYPE_CODE_SET) - return type; - - /* Nope. Fill in the appropriate fields. */ - TYPE_CODE (type) = TYPE_CODE_SET; - TYPE_LENGTH (type) = dn_bufp->dset.bitlength / 8; - TYPE_NFIELDS (type) = 0; - TYPE_TARGET_TYPE (type) = hpread_type_lookup (dn_bufp->dset.subtype, - objfile); - return type; -} - -/* Read in and internalize an array debug symbol. */ - -static struct type * -hpread_read_array_type (hp_type, dn_bufp, objfile) - dnttpointer hp_type; - union dnttentry *dn_bufp; - struct objfile *objfile; -{ - struct type *type; - - /* Allocate an array type symbol. - * Why no check for already-read here, like in the other - * hpread_read_xxx_type routines? Because it kept us - * from properly determining the size of the array! - */ - type = hpread_alloc_type (hp_type, objfile); - - TYPE_CODE (type) = TYPE_CODE_ARRAY; - - /* Although the hp-symtab.h does not *require* this to be the case, - * GDB is assuming that "arrayisbytes" and "elemisbytes" be consistent. - * I.e., express both array-length and element-length in bits, - * or express both array-length and element-length in bytes. - */ - if (!((dn_bufp->darray.arrayisbytes && dn_bufp->darray.elemisbytes) || - (!dn_bufp->darray.arrayisbytes && !dn_bufp->darray.elemisbytes))) { - warning ("error in hpread_array_type.\n"); - return; - } else if (dn_bufp->darray.arraylength == 0x7fffffff) { - /* The HP debug format represents char foo[]; as an array with - * length 0x7fffffff. Internally GDB wants to represent this - * as an array of length zero. - */ - TYPE_LENGTH (type) = 0; - } else if (dn_bufp->darray.arrayisbytes) - TYPE_LENGTH (type) = dn_bufp->darray.arraylength; - else /* arraylength is in bits */ - TYPE_LENGTH (type) = dn_bufp->darray.arraylength / 8; - - TYPE_TARGET_TYPE (type) = hpread_type_lookup (dn_bufp->darray.elemtype, - objfile); - - /* The one "field" is used to store the subscript type */ - /* Since C and C++ multi-dimensional arrays are simply represented - * as: array of array of ..., we only need one subscript-type - * per array. This subscript type is typically a subrange of integer. - * If this gets extended to support languages like Pascal, then - * we need to fix this to represent multi-dimensional arrays properly. - */ - TYPE_NFIELDS (type) = 1; - TYPE_FIELDS (type) = (struct field *) - obstack_alloc (&objfile->type_obstack, sizeof (struct field)); - TYPE_FIELD_TYPE (type, 0) = hpread_type_lookup (dn_bufp->darray.indextype, - objfile); - return type; -} - -/* Read in and internalize a subrange debug symbol. */ -static struct type * -hpread_read_subrange_type (hp_type, dn_bufp, objfile) - dnttpointer hp_type; - union dnttentry *dn_bufp; - struct objfile *objfile; -{ - struct type *type; - - /* Is it something we've already dealt with. */ - type = hpread_alloc_type (hp_type, objfile); - if (TYPE_CODE (type) == TYPE_CODE_RANGE) - return type; - - /* Nope, internalize it. */ - TYPE_CODE (type) = TYPE_CODE_RANGE; - TYPE_LENGTH (type) = dn_bufp->dsubr.bitlength / 8; - TYPE_NFIELDS (type) = 2; - TYPE_FIELDS (type) - = (struct field *) obstack_alloc (&objfile->type_obstack, - 2 * sizeof (struct field)); - - if (dn_bufp->dsubr.dyn_low) - TYPE_FIELD_BITPOS (type, 0) = 0; - else - TYPE_FIELD_BITPOS (type, 0) = dn_bufp->dsubr.lowbound; - - if (dn_bufp->dsubr.dyn_high) - TYPE_FIELD_BITPOS (type, 1) = -1; - else - TYPE_FIELD_BITPOS (type, 1) = dn_bufp->dsubr.highbound; - TYPE_TARGET_TYPE (type) = hpread_type_lookup (dn_bufp->dsubr.subtype, - objfile); - return type; -} - -/* struct type * hpread_type_lookup(hp_type, objfile) - * Arguments: - * hp_type: A pointer into the DNTT specifying what type we - * are about to "look up"., or else [for fundamental types - * like int, float, ...] an "immediate" structure describing - * the type. - * objfile: ? - * Return value: A pointer to a "struct type" (representation of a - * type in GDB's internal symbol table - see gdbtypes.h) - * Routine description: - * There are a variety of places when scanning the DNTT when we - * need to interpret a "type" field. The simplest and most basic - * example is when we're processing the symbol table record - * for a data symbol (a SVAR or DVAR record). That has - * a "type" field specifying the type of the data symbol. That - * "type" field is either an "immediate" type specification (for the - * fundamental types) or a DNTT pointer (for more complicated types). - * For the more complicated types, we may or may not have already - * processed the pointed-to type. (Multiple data symbols can of course - * share the same type). - * The job of hpread_type_lookup() is to process this "type" field. - * Most of the real work is done in subroutines. Here we interpret - * the immediate flag. If not immediate, chase the DNTT pointer to - * find our way to the SOM record describing the type, switch on - * the SOM kind, and then call an appropriate subroutine depending - * on what kind of type we are constructing. (e.g., an array type, - * a struct/class type, etc). - */ -static struct type * -hpread_type_lookup (hp_type, objfile) - dnttpointer hp_type; - struct objfile *objfile; -{ - union dnttentry *dn_bufp; - struct type * tmp_type; - - /* First see if it's a simple builtin type. */ - if (hp_type.dntti.immediate) - /* If this is a template argument, the argument number is - * encoded in the bitlength. All other cases, just return - * GDB's representation of this fundamental type. - */ - if (hp_type.dntti.type == HP_TYPE_TEMPLATE_ARG) - return hpread_get_nth_template_arg(objfile, hp_type.dntti.bitlength); - else - return lookup_fundamental_type (objfile, hpread_type_translate (hp_type)); - - /* Not a builtin type. We'll have to read it in. */ - if (hp_type.dnttp.index < LNTT_SYMCOUNT (objfile)) - dn_bufp = hpread_get_lntt (hp_type.dnttp.index, objfile); - else - /* This is a fancy way of returning NULL */ - return lookup_fundamental_type (objfile, FT_VOID); - - switch (dn_bufp->dblock.kind) - { - case DNTT_TYPE_SRCFILE: - case DNTT_TYPE_MODULE: - case DNTT_TYPE_ENTRY: - case DNTT_TYPE_BEGIN: - case DNTT_TYPE_END: - case DNTT_TYPE_IMPORT: - case DNTT_TYPE_LABEL: - case DNTT_TYPE_FPARAM: - case DNTT_TYPE_SVAR: - case DNTT_TYPE_DVAR: - case DNTT_TYPE_CONST: - case DNTT_TYPE_MEMENUM: - case DNTT_TYPE_VARIANT: - case DNTT_TYPE_FILE: - case DNTT_TYPE_WITH: - case DNTT_TYPE_COMMON: - case DNTT_TYPE_COBSTRUCT: - case DNTT_TYPE_XREF: - case DNTT_TYPE_SA: - case DNTT_TYPE_MACRO: - case DNTT_TYPE_BLOCKDATA: - case DNTT_TYPE_CLASS_SCOPE: - case DNTT_TYPE_MEMACCESS: - case DNTT_TYPE_INHERITANCE: - case DNTT_TYPE_OBJECT_ID: - case DNTT_TYPE_FRIEND_CLASS: - case DNTT_TYPE_FRIEND_FUNC: - /* These are not types - something went wrong. */ - /* This is a fancy way of returning NULL */ - return lookup_fundamental_type (objfile, FT_VOID); - - case DNTT_TYPE_FUNCTION: - /* We wind up here when dealing with class member functions - * (called from hpread_read_struct_type(), i.e. when processing - * the class definition itself). - */ - return hpread_read_function_type (hp_type, dn_bufp, objfile, 0); - - case DNTT_TYPE_DOC_FUNCTION: - return hpread_read_doc_function_type (hp_type, dn_bufp, objfile, 0); - - case DNTT_TYPE_TYPEDEF: - { - /* A typedef - chase it down by making a recursive call */ - struct type *structtype = hpread_type_lookup (dn_bufp->dtype.type, - objfile); - - /* The following came from the base hpread.c that we inherited. - * It is WRONG so I have commented it out. - RT - *... - - char *suffix; - suffix = VT (objfile) + dn_bufp->dtype.name; - TYPE_NAME (structtype) = suffix; - - * ... further explanation .... - * - * What we have here is a typedef pointing to a typedef. - * E.g., - * typedef int foo; - * typedef foo fum; - * - * What we desire to build is (these are pictures - * of "struct type"'s): - * - * +---------+ +----------+ +------------+ - * | typedef | | typedef | | fund. type | - * | type| -> | type| -> | | - * | "fum" | | "foo" | | "int" | - * +---------+ +----------+ +------------+ - * - * What this commented-out code is doing is smashing the - * name of pointed-to-type to be the same as the pointed-from - * type. So we wind up with something like: - * - * +---------+ +----------+ +------------+ - * | typedef | | typedef | | fund. type | - * | type| -> | type| -> | | - * | "fum" | | "fum" | | "fum" | - * +---------+ +----------+ +------------+ - * - */ - - return structtype; - } - - case DNTT_TYPE_TAGDEF: - { - /* Just a little different from above. We have to tack on - * an identifier of some kind (struct, union, enum, class, etc). - */ - struct type *structtype = hpread_type_lookup (dn_bufp->dtype.type, - objfile); - char *prefix, *suffix; - suffix = VT (objfile) + dn_bufp->dtype.name; - - /* Lookup the next type in the list. It should be a structure, - * union, class, enum, or template type. - * We will need to attach that to our name. - */ - if (dn_bufp->dtype.type.dnttp.index < LNTT_SYMCOUNT (objfile)) - dn_bufp = hpread_get_lntt (dn_bufp->dtype.type.dnttp.index, objfile); - else { - complain (&hpread_type_lookup_complaint); - return; - } - - if (dn_bufp->dblock.kind == DNTT_TYPE_STRUCT) { - prefix = "struct "; - } else if (dn_bufp->dblock.kind == DNTT_TYPE_UNION) { - prefix = "union "; - } else if (dn_bufp->dblock.kind == DNTT_TYPE_CLASS) { - /* Further field for CLASS saying how it was really declared */ - /* 0==class, 1==union, 2==struct */ - if (dn_bufp->dclass.class_decl == 0) - prefix = "class "; - else if (dn_bufp->dclass.class_decl == 1) - prefix = "union "; - else if (dn_bufp->dclass.class_decl == 2) - prefix = "struct "; - else - prefix = ""; - } else if (dn_bufp->dblock.kind == DNTT_TYPE_ENUM) { - prefix = "enum "; - } else if (dn_bufp->dblock.kind == DNTT_TYPE_TEMPLATE) { - prefix = "template "; - } else { - prefix = ""; - } - - /* Build the correct name. */ - structtype->name - = (char *) obstack_alloc (&objfile->type_obstack, - strlen (prefix) + strlen (suffix) + 1); - TYPE_NAME (structtype) = strcpy (TYPE_NAME (structtype), prefix); - TYPE_NAME (structtype) = strcat (TYPE_NAME (structtype), suffix); - TYPE_TAG_NAME (structtype) = suffix; - - /* For classes/structs, we have to set the static member "physnames" - to point to strings like "Class::Member" */ - if (TYPE_CODE (structtype) == TYPE_CODE_STRUCT) - fix_static_member_physnames (structtype, suffix, objfile); - - return structtype; - } - - case DNTT_TYPE_POINTER: - /* Pointer type - call a routine in gdbtypes.c that constructs - * the appropriate GDB type. - */ - return make_pointer_type ( - hpread_type_lookup (dn_bufp->dptr.pointsto, - objfile), - NULL); - - case DNTT_TYPE_REFERENCE: - /* C++ reference type - call a routine in gdbtypes.c that constructs - * the appropriate GDB type. - */ - return make_reference_type ( - hpread_type_lookup (dn_bufp->dreference.pointsto, - objfile), - NULL); - - case DNTT_TYPE_ENUM: - return hpread_read_enum_type (hp_type, dn_bufp, objfile); - case DNTT_TYPE_SET: - return hpread_read_set_type (hp_type, dn_bufp, objfile); - case DNTT_TYPE_SUBRANGE: - return hpread_read_subrange_type (hp_type, dn_bufp, objfile); - case DNTT_TYPE_ARRAY: - return hpread_read_array_type (hp_type, dn_bufp, objfile); - case DNTT_TYPE_STRUCT: - case DNTT_TYPE_UNION: - return hpread_read_struct_type (hp_type, dn_bufp, objfile); - case DNTT_TYPE_FIELD: - return hpread_type_lookup (dn_bufp->dfield.type, objfile); - - case DNTT_TYPE_FUNCTYPE: - /* Here we want to read the function SOMs and return a - * type for it. We get here, for instance, when processing - * pointer-to-function type. - */ - return hpread_read_function_type (hp_type, dn_bufp, objfile, 0); - - case DNTT_TYPE_PTRMEM: - /* Declares a C++ pointer-to-data-member type. - * The "pointsto" field defines the class, - * while the "memtype" field defines the pointed-to-type. - */ - { - struct type * ptrmemtype; - struct type * class_type; - struct type * memtype; - memtype = hpread_type_lookup (dn_bufp->dptrmem.memtype, - objfile), - class_type = hpread_type_lookup (dn_bufp->dptrmem.pointsto, - objfile), - ptrmemtype = alloc_type(objfile); - smash_to_member_type(ptrmemtype, class_type, memtype); - return make_pointer_type(ptrmemtype, NULL); - } - break; - - case DNTT_TYPE_PTRMEMFUNC: - /* Defines a C++ pointer-to-function-member type. - * The "pointsto" field defines the class, - * while the "memtype" field defines the pointed-to-type. - */ - { - struct type * ptrmemtype; - struct type * class_type; - struct type * functype; - struct type * retvaltype; - int nargs; - int i; - struct type ** args_type; - class_type = hpread_type_lookup (dn_bufp->dptrmem.pointsto, - objfile); - functype = hpread_type_lookup (dn_bufp->dptrmem.memtype, - objfile); - retvaltype = TYPE_TARGET_TYPE (functype); - nargs = TYPE_NFIELDS (functype); - args_type = (struct type **) xmalloc ((nargs+1) * sizeof (struct type *)); - for (i = 0; i < nargs; i++) { - args_type[i] = TYPE_FIELD_TYPE (functype, i); - } - args_type[nargs] = NULL; - ptrmemtype = alloc_type(objfile); - smash_to_method_type(ptrmemtype, class_type, retvaltype, args_type); - return make_pointer_type(ptrmemtype, NULL); - } - break; - - case DNTT_TYPE_CLASS: - return hpread_read_struct_type (hp_type, dn_bufp, objfile); - - case DNTT_TYPE_GENFIELD: - /* Chase pointer from GENFIELD to FIELD, and make recursive - * call on that. - */ - return hpread_type_lookup (dn_bufp->dgenfield.field, objfile); - - case DNTT_TYPE_VFUNC: - /* C++ virtual function. - * We get here in the course of processing a class type which - * contains virtual functions. Just go through another level - * of indirection to get to the pointed-to function SOM. - */ - return hpread_type_lookup (dn_bufp->dvfunc.funcptr, objfile); - - case DNTT_TYPE_MODIFIER: - /* Check the modifiers and then just make a recursive call on - * the "type" pointed to by the modifier DNTT. - * - * pai:: FIXME -- do we ever want to handle "m_duplicate" and - * "m_void" modifiers? Is static_flag really needed here? - * (m_static used for methods of classes, elsewhere). - */ - tmp_type = make_cv_type (dn_bufp->dmodifier.m_const, - dn_bufp->dmodifier.m_volatile, - hpread_type_lookup (dn_bufp->dmodifier.type, objfile), - 0); - return tmp_type; - - - case DNTT_TYPE_MEMFUNC: - /* Member function. Treat like a function. - * I think we get here in the course of processing a - * pointer-to-member-function type... - */ - return hpread_read_function_type (hp_type, dn_bufp, objfile, 0); - - case DNTT_TYPE_DOC_MEMFUNC: - return hpread_read_doc_function_type (hp_type, dn_bufp, objfile, 0); - - case DNTT_TYPE_TEMPLATE: - /* Template - sort of the header for a template definition, - * which like a class, points to a member list and also points - * to a TEMPLATE_ARG list of type-arguments. - */ - return hpread_read_struct_type (hp_type, dn_bufp, objfile); - - case DNTT_TYPE_TEMPLATE_ARG: - { - char * name; - /* The TEMPLATE record points to an argument list of - * TEMPLATE_ARG records, each of which describes one - * of the type-arguments. - */ - name = VT (objfile) + dn_bufp->dtempl_arg.name; - return hpread_read_templ_arg_type (hp_type, dn_bufp, objfile, name); - } - - case DNTT_TYPE_FUNC_TEMPLATE: - /* We wind up here when processing a TEMPLATE type, - * if the template has member function(s). - * Treat it like a FUNCTION. - */ - return hpread_read_function_type (hp_type, dn_bufp, objfile, 0); - - case DNTT_TYPE_LINK: - /* The LINK record is used to link up templates with instantiations. - * There is no type associated with the LINK record per se. - */ - return lookup_fundamental_type (objfile, FT_VOID); - - /* Also not yet handled... */ - /* case DNTT_TYPE_DYN_ARRAY_DESC: */ - /* case DNTT_TYPE_DESC_SUBRANGE: */ - /* case DNTT_TYPE_BEGIN_EXT: */ - /* case DNTT_TYPE_INLN: */ - /* case DNTT_TYPE_INLN_LIST: */ - /* case DNTT_TYPE_ALIAS: */ - default: - /* A fancy way of returning NULL */ - return lookup_fundamental_type (objfile, FT_VOID); - } -} - -static sltpointer -hpread_record_lines (subfile, s_idx, e_idx, objfile, offset) - struct subfile *subfile; - sltpointer s_idx, e_idx; - struct objfile *objfile; - CORE_ADDR offset; -{ - union sltentry *sl_bufp; - - while (s_idx <= e_idx) - { - sl_bufp = hpread_get_slt (s_idx, objfile); - /* Only record "normal" entries in the SLT. */ - if (sl_bufp->snorm.sltdesc == SLT_NORMAL - || sl_bufp->snorm.sltdesc == SLT_EXIT) - record_line (subfile, sl_bufp->snorm.line, - sl_bufp->snorm.address + offset); - else if (sl_bufp->snorm.sltdesc == SLT_NORMAL_OFFSET) - record_line (subfile, sl_bufp->snormoff.line, - sl_bufp->snormoff.address + offset); - s_idx++; - } - return e_idx; -} - -/* Given a function "f" which is a member of a class, find - * the classname that it is a member of. Used to construct - * the name (e.g., "c::f") which GDB will put in the - * "demangled name" field of the function's symbol. - * Called from hpread_process_one_debug_symbol() - * If "f" is not a member function, return NULL. - */ -char * class_of (functype) -struct type * functype; -{ - struct type * first_param_type; - char * first_param_name; - struct type * pointed_to_type; - char * class_name; - - /* Check that the function has a first argument "this", - * and that "this" is a pointer to a class. If not, - * functype is not a member function, so return NULL. - */ - if (TYPE_NFIELDS(functype) == 0) - return NULL; - first_param_name = TYPE_FIELD_NAME (functype, 0); - if (first_param_name == NULL) - return NULL; /* paranoia */ - if (strcmp(first_param_name, "this")) - return NULL; - first_param_type = TYPE_FIELD_TYPE (functype, 0); - if (first_param_type == NULL) - return NULL; /* paranoia */ - if (TYPE_CODE(first_param_type) != TYPE_CODE_PTR) - return NULL; - - /* Get the thing that "this" points to, check that - * it's a class, and get its class name. - */ - pointed_to_type = TYPE_TARGET_TYPE(first_param_type); - if (pointed_to_type == NULL) - return NULL; /* paranoia */ - if (TYPE_CODE(pointed_to_type) != TYPE_CODE_CLASS) - return NULL; - class_name = TYPE_NAME(pointed_to_type); - if (class_name == NULL) - return NULL; /* paranoia */ - - /* The class name may be of the form "class c", in which case - * we want to strip off the leading "class ". - */ - if (strncmp(class_name, "class ", 6) == 0) - class_name += 6; - - return class_name; -} - -/* Internalize one native debug symbol. - * Called in a loop from hpread_expand_symtab(). - * Arguments: - * dn_bufp: - * name: - * section_offsets: - * objfile: - * text_offset: - * text_size: - * filename: - * index: Index of this symbol - * at_module_boundary_p Pointer to boolean flag to control caller's loop. - */ - -static void -hpread_process_one_debug_symbol (dn_bufp, name, section_offsets, objfile, - text_offset, text_size, filename, - index, at_module_boundary_p - ) - union dnttentry *dn_bufp; - char *name; - struct section_offsets *section_offsets; - struct objfile *objfile; - CORE_ADDR text_offset; - int text_size; - char *filename; - int index; - int *at_module_boundary_p; -{ - unsigned long desc; - int type; - CORE_ADDR valu; - int offset = ANOFFSET (section_offsets, SECT_OFF_TEXT); - int data_offset = ANOFFSET (section_offsets, SECT_OFF_DATA); - union dnttentry *dn_temp; - dnttpointer hp_type; - struct symbol *sym; - struct context_stack *new; - char * class_scope_name; - extern int is_in_import_list (); /* in somread.c */ - - /* Allocate one GDB debug symbol and fill in some default values. */ - sym = (struct symbol *) obstack_alloc (&objfile->symbol_obstack, - sizeof (struct symbol)); - memset (sym, 0, sizeof (struct symbol)); - SYMBOL_NAME (sym) = obsavestring (name, strlen (name), &objfile->symbol_obstack); - SYMBOL_LANGUAGE (sym) = language_auto; - SYMBOL_NAMESPACE (sym) = VAR_NAMESPACE; - SYMBOL_LINE (sym) = 0; - SYMBOL_VALUE (sym) = 0; - SYMBOL_CLASS (sym) = LOC_TYPEDEF; - - /* Just a trick in case the SOM debug symbol is a type definition. - * There are routines that are set up to build a GDB type symbol, given - * a SOM dnttpointer. So we set up a dummy SOM dnttpointer "hp_type". - * This allows us to call those same routines. - */ - hp_type.dnttp.extension = 1; - hp_type.dnttp.immediate = 0; - hp_type.dnttp.global = 0; - hp_type.dnttp.index = index; - - /* This "type" is the type of SOM record. - * Switch on SOM type. - */ - type = dn_bufp->dblock.kind; - switch (type) - { - case DNTT_TYPE_SRCFILE: - /* This type of symbol indicates from which source file or - * include file any following data comes. It may indicate: - * - * o The start of an entirely new source file (and thus - * a new module) - * - * o The start of a different source file due to #include - * - * o The end of an include file and the return to the original - * file. Thus if "foo.c" includes "bar.h", we see first - * a SRCFILE for foo.c, then one for bar.h, and then one for - * foo.c again. - * - * If it indicates the start of a new module then we must - * finish the symbol table of the previous module - * (if any) and start accumulating a new symbol table. - */ - - valu = text_offset; - if (!last_source_file ) { - /* - * A note on "last_source_file": this is a char* pointing - * to the actual file name. "start_symtab" sets it, - * "end_symtab" clears it. - * - * So if "last_source_file" is NULL, then either this is - * the first record we are looking at, or a previous call - * to "end_symtab()" was made to close out the previous - * module. Since we're now quitting the scan loop when we - * see a MODULE END record, we should never get here, except - * in the case that we're not using the quick look-up tables - * and have to use the old system as a fall-back. - */ - start_symtab (name, NULL, valu); - record_debugformat ("HP"); - SL_INDEX (objfile) = dn_bufp->dsfile.address; - } - - else { - /* Either a new include file, or a SRCFILE record - * saying we are back in the main source (or out of - * a nested include file) again. - */ - SL_INDEX (objfile) = hpread_record_lines (current_subfile, - SL_INDEX (objfile), - dn_bufp->dsfile.address, - objfile, offset); - } - - /* A note on "start_subfile". This routine will check - * the name we pass it and look for an existing subfile - * of that name. There's thus only one sub-file for the - * actual source (e.g. for "foo.c" in foo.c), despite the - * fact that we'll see lots of SRCFILE entries for foo.c - * inside foo.c. - */ - start_subfile (name, NULL); - break; - - case DNTT_TYPE_MODULE: - /* - * We no longer ignore DNTT_TYPE_MODULE symbols. The module - * represents the meaningful semantic structure of a compilation - * unit. We expect to start the psymtab-to-symtab expansion - * looking at a MODULE entry, and to end it at the corresponding - * END MODULE entry. - * - *--Begin outdated comments - * - * This record signifies the start of a new source module - * In C/C++ there is no explicit "module" construct in the language, - * but each compilation unit is implicitly a module and they - * do emit the DNTT_TYPE_MODULE records. - * The end of the module is marked by a matching DNTT_TYPE_END record. - * - * The reason GDB gets away with ignoring the DNTT_TYPE_MODULE record - * is it notices the DNTT_TYPE_END record for the previous - * module (see comments under DNTT_TYPE_END case), and then treats - * the next DNTT_TYPE_SRCFILE record as if it were the module-start record. - * (i.e., it makes a start_symtab() call). - * This scheme seems a little convoluted, but I'll leave it - * alone on the principle "if it ain't broke don't fix - * it". (RT). - * - *-- End outdated comments - */ - - valu = text_offset; - if (!last_source_file ) - { - /* Start of a new module. We know this because "last_source_file" - * is NULL, which can only happen the first time or if we just - * made a call to end_symtab() to close out the previous module. - */ - start_symtab (name, NULL, valu); - SL_INDEX (objfile) = dn_bufp->dmodule.address; - } - else - { - /* This really shouldn't happen if we're using the quick - * look-up tables, as it would mean we'd scanned past an - * END MODULE entry. But if we're not using the tables, - * we started the module on the SRCFILE entry, so it's ok. - * For now, accept this. - */ - /* warning( "Error expanding psymtab, missed module end, found entry for %s", - * name ); - */ - *at_module_boundary_p = -1; - } - - start_subfile (name, NULL); - break; - - case DNTT_TYPE_FUNCTION: - case DNTT_TYPE_ENTRY: - /* A function or secondary entry point. */ - valu = dn_bufp->dfunc.lowaddr + offset; - - /* Record lines up to this point. */ - SL_INDEX (objfile) = hpread_record_lines (current_subfile, - SL_INDEX (objfile), - dn_bufp->dfunc.address, - objfile, offset); - - WITHIN_FUNCTION (objfile) = 1; - CURRENT_FUNCTION_VALUE (objfile) = valu; - - /* Stack must be empty now. */ - if (context_stack_depth != 0) - complain (&lbrac_unmatched_complaint, (char *) symnum); - new = push_context (0, valu); - - /* Built a type for the function. This includes processing - * the symbol records for the function parameters. - */ - SYMBOL_CLASS (sym) = LOC_BLOCK; - SYMBOL_TYPE (sym) = hpread_read_function_type (hp_type, dn_bufp, objfile, 1); - - /* The "SYMBOL_NAME" field is expected to be the mangled name - * (if any), which we get from the "alias" field of the SOM record - * if that exists. - */ - if ((dn_bufp->dfunc.language == HP_LANGUAGE_CPLUSPLUS) && - dn_bufp->dfunc.alias && /* has an alias */ - *(char *)(VT (objfile) + dn_bufp->dfunc.alias)) /* not a null string */ - SYMBOL_NAME (sym) = VT (objfile) + dn_bufp->dfunc.alias; - else - SYMBOL_NAME (sym) = VT (objfile) + dn_bufp->dfunc.name; - - /* Special hack to get around HP compilers' insistence on - * reporting "main" as "_MAIN_" for C/C++ */ - if ((strcmp (SYMBOL_NAME (sym), "_MAIN_") == 0) && - (strcmp (VT (objfile) + dn_bufp->dfunc.name, "main") == 0)) - SYMBOL_NAME (sym) = VT (objfile) + dn_bufp->dfunc.name; - - /* The SYMBOL_CPLUS_DEMANGLED_NAME field is expected to - * be the demangled name. - */ - if (dn_bufp->dfunc.language == HP_LANGUAGE_CPLUSPLUS) - { - /* SYMBOL_INIT_DEMANGLED_NAME is a macro which winds up - * calling the demangler in libiberty (cplus_demangle()) to - * do the job. This generally does the job, even though - * it's intended for the GNU compiler and not the aCC compiler - * Note that SYMBOL_INIT_DEMANGLED_NAME calls the - * demangler with arguments DMGL_PARAMS | DMGL_ANSI. - * Generally, we don't want params when we display - * a demangled name, but when I took out the DMGL_PARAMS, - * some things broke, so I'm leaving it in here, and - * working around the issue in stack.c. - RT - */ - SYMBOL_INIT_DEMANGLED_NAME (sym, &objfile->symbol_obstack); - if ((SYMBOL_NAME (sym) == VT (objfile) + dn_bufp->dfunc.alias) && - (!SYMBOL_CPLUS_DEMANGLED_NAME(sym))) { - - /* Well, the symbol name is mangled, but the - * demangler in libiberty failed so the demangled - * field is still NULL. Try to - * do the job ourselves based on the "name" field - * in the SOM record. A complication here is that - * the name field contains only the function name - * (like "f"), whereas we want the class qualification - * (as in "c::f"). Try to reconstruct that. - */ - char * basename; - char * classname; - char * dem_name; - basename = VT (objfile) + dn_bufp->dfunc.name; - classname = class_of(SYMBOL_TYPE(sym)); - if (classname) { - dem_name = xmalloc(strlen(basename)+strlen(classname)+3); - strcpy(dem_name, classname); - strcat(dem_name, "::"); - strcat(dem_name, basename); - SYMBOL_CPLUS_DEMANGLED_NAME(sym) = dem_name; - SYMBOL_LANGUAGE (sym) = language_cplus; - } - } - } - - /* Add the function symbol to the list of symbols in this blockvector */ - if (dn_bufp->dfunc.global) - add_symbol_to_list (sym, &global_symbols); - else - add_symbol_to_list (sym, &file_symbols); - new->name = sym; - - /* Search forward to the next BEGIN and also read - * in the line info up to that point. - * Not sure why this is needed. - * In HP FORTRAN this code is harmful since there - * may not be a BEGIN after the FUNCTION. - * So I made it C/C++ specific. - RT - */ - if (dn_bufp->dfunc.language == HP_LANGUAGE_C || - dn_bufp->dfunc.language == HP_LANGUAGE_CPLUSPLUS) { - while (dn_bufp->dblock.kind != DNTT_TYPE_BEGIN) - { - dn_bufp = hpread_get_lntt (++index, objfile); - if (dn_bufp->dblock.extension) - continue; - } - SL_INDEX (objfile) = hpread_record_lines (current_subfile, - SL_INDEX (objfile), - dn_bufp->dbegin.address, - objfile, offset); - SYMBOL_LINE (sym) = hpread_get_line (dn_bufp->dbegin.address, objfile); - } - record_line (current_subfile, SYMBOL_LINE (sym), valu); - break; - - case DNTT_TYPE_DOC_FUNCTION: - valu = dn_bufp->ddocfunc.lowaddr + offset; - - /* Record lines up to this point. */ - SL_INDEX (objfile) = hpread_record_lines (current_subfile, - SL_INDEX (objfile), - dn_bufp->ddocfunc.address, - objfile, offset); - - WITHIN_FUNCTION (objfile) = 1; - CURRENT_FUNCTION_VALUE (objfile) = valu; - /* Stack must be empty now. */ - if (context_stack_depth != 0) - complain (&lbrac_unmatched_complaint, (char *) symnum); - new = push_context (0, valu); - - /* Built a type for the function. This includes processing - * the symbol records for the function parameters. - */ - SYMBOL_CLASS (sym) = LOC_BLOCK; - SYMBOL_TYPE (sym) = hpread_read_doc_function_type (hp_type, dn_bufp, objfile, 1); - - /* The "SYMBOL_NAME" field is expected to be the mangled name - * (if any), which we get from the "alias" field of the SOM record - * if that exists. - */ - if ((dn_bufp->ddocfunc.language == HP_LANGUAGE_CPLUSPLUS) && - dn_bufp->ddocfunc.alias && /* has an alias */ - *(char *)(VT (objfile) + dn_bufp->ddocfunc.alias)) /* not a null string */ - SYMBOL_NAME (sym) = VT (objfile) + dn_bufp->ddocfunc.alias; - else - SYMBOL_NAME (sym) = VT (objfile) + dn_bufp->ddocfunc.name; - - /* Special hack to get around HP compilers' insistence on - * reporting "main" as "_MAIN_" for C/C++ */ - if ((strcmp (SYMBOL_NAME (sym), "_MAIN_") == 0) && - (strcmp (VT (objfile) + dn_bufp->ddocfunc.name, "main") == 0)) - SYMBOL_NAME (sym) = VT (objfile) + dn_bufp->ddocfunc.name; - - if (dn_bufp->ddocfunc.language == HP_LANGUAGE_CPLUSPLUS) { - - /* SYMBOL_INIT_DEMANGLED_NAME is a macro which winds up - * calling the demangler in libiberty (cplus_demangle()) to - * do the job. This generally does the job, even though - * it's intended for the GNU compiler and not the aCC compiler - * Note that SYMBOL_INIT_DEMANGLED_NAME calls the - * demangler with arguments DMGL_PARAMS | DMGL_ANSI. - * Generally, we don't want params when we display - * a demangled name, but when I took out the DMGL_PARAMS, - * some things broke, so I'm leaving it in here, and - * working around the issue in stack.c. - RT - */ - SYMBOL_INIT_DEMANGLED_NAME (sym, &objfile->symbol_obstack); - - if ((SYMBOL_NAME (sym) == VT (objfile) + dn_bufp->ddocfunc.alias) && - (!SYMBOL_CPLUS_DEMANGLED_NAME(sym))) { - - /* Well, the symbol name is mangled, but the - * demangler in libiberty failed so the demangled - * field is still NULL. Try to - * do the job ourselves based on the "name" field - * in the SOM record. A complication here is that - * the name field contains only the function name - * (like "f"), whereas we want the class qualification - * (as in "c::f"). Try to reconstruct that. - */ - char * basename; - char * classname; - char * dem_name; - basename = VT (objfile) + dn_bufp->ddocfunc.name; - classname = class_of(SYMBOL_TYPE(sym)); - if (classname) { - dem_name = xmalloc(strlen(basename)+strlen(classname)+3); - strcpy(dem_name, classname); - strcat(dem_name, "::"); - strcat(dem_name, basename); - SYMBOL_CPLUS_DEMANGLED_NAME(sym) = dem_name; - SYMBOL_LANGUAGE (sym) = language_cplus; - } - } - } - - /* Add the function symbol to the list of symbols in this blockvector */ - if (dn_bufp->ddocfunc.global) - add_symbol_to_list (sym, &global_symbols); - else - add_symbol_to_list (sym, &file_symbols); - new->name = sym; - - /* Search forward to the next BEGIN and also read - * in the line info up to that point. - * Not sure why this is needed. - * In HP FORTRAN this code is harmful since there - * may not be a BEGIN after the FUNCTION. - * So I made it C/C++ specific. - RT - */ - if (dn_bufp->ddocfunc.language == HP_LANGUAGE_C || - dn_bufp->ddocfunc.language == HP_LANGUAGE_CPLUSPLUS) { - while (dn_bufp->dblock.kind != DNTT_TYPE_BEGIN) - { - dn_bufp = hpread_get_lntt (++index, objfile); - if (dn_bufp->dblock.extension) - continue; - } - SL_INDEX (objfile) = hpread_record_lines (current_subfile, - SL_INDEX (objfile), - dn_bufp->dbegin.address, - objfile, offset); - SYMBOL_LINE (sym) = hpread_get_line (dn_bufp->dbegin.address, objfile); - } - record_line (current_subfile, SYMBOL_LINE (sym), valu); - break; - - case DNTT_TYPE_BEGIN: - /* Begin a new scope. */ - if (context_stack_depth == 1 /* this means we're at function level */ && - context_stack[0].name != NULL /* this means it's a function */ && - context_stack[0].depth == 0 /* this means it's the first BEGIN - we've seen after the FUNCTION */ - ) - { - /* This is the first BEGIN after a FUNCTION. - * We ignore this one, since HP compilers always insert - * at least one BEGIN, i.e. it's: - * - * FUNCTION - * argument symbols - * BEGIN - * local symbols - * (possibly nested BEGIN ... END's if there are inner { } blocks) - * END - * END - * - * By ignoring this first BEGIN, the local symbols get treated - * as belonging to the function scope, and "print func::local_sym" - * works (which is what we want). - */ - - /* All we do here is increase the depth count associated with - * the FUNCTION entry in the context stack. This ensures that - * the next BEGIN we see (if any), representing a real nested { } - * block, will get processed. - */ - - context_stack[0].depth++; - - } else { - - /* Record lines up to this SLT pointer. */ - SL_INDEX (objfile) = hpread_record_lines (current_subfile, - SL_INDEX (objfile), - dn_bufp->dbegin.address, - objfile, offset); - /* Calculate start address of new scope */ - valu = hpread_get_location (dn_bufp->dbegin.address, objfile); - valu += offset; /* Relocate for dynamic loading */ - /* We use the scope start DNTT index as nesting depth identifier! */ - desc = hpread_get_scope_start (dn_bufp->dbegin.address, objfile); - new = push_context (desc, valu); - } - break; - - case DNTT_TYPE_END: - /* End a scope. */ - - /* Valid end kinds are: - * MODULE - * FUNCTION - * WITH - * COMMON - * BEGIN - * CLASS_SCOPE - */ - - SL_INDEX (objfile) = hpread_record_lines (current_subfile, - SL_INDEX (objfile), - dn_bufp->dend.address, - objfile, offset); - switch (dn_bufp->dend.endkind) - { - case DNTT_TYPE_MODULE: - /* Ending a module ends the symbol table for that module. - * Calling end_symtab() has the side effect of clearing the - * last_source_file pointer, which in turn signals - * process_one_debug_symbol() to treat the next DNTT_TYPE_SRCFILE - * record as a module-begin. - */ - valu = text_offset + text_size + offset; - - /* Tell our caller that we're done with expanding the - * debug information for a module. - */ - *at_module_boundary_p = 1; - - /* Don't do this, as our caller will do it! - * - * (void) end_symtab (valu, objfile, 0); - */ - break; - - case DNTT_TYPE_FUNCTION: - /* Ending a function, well, ends the function's scope. */ - dn_temp = hpread_get_lntt (dn_bufp->dend.beginscope.dnttp.index, - objfile); - valu = dn_temp->dfunc.hiaddr + offset; - /* Insert func params into local list */ - merge_symbol_lists (¶m_symbols, &local_symbols); - new = pop_context (); - /* Make a block for the local symbols within. */ - finish_block (new->name, &local_symbols, new->old_blocks, - new->start_addr, valu, objfile); - WITHIN_FUNCTION (objfile) = 0; /* This may have to change for Pascal */ - local_symbols = new->locals; - param_symbols = new->params; - break; - - case DNTT_TYPE_BEGIN: - if (context_stack_depth == 1 && - context_stack[0].name != NULL && - context_stack[0].depth == 1) - { - /* This is the END corresponding to the - * BEGIN which we ignored - see DNTT_TYPE_BEGIN case above. - */ - context_stack[0].depth--; - } else { - /* Ending a local scope. */ - valu = hpread_get_location (dn_bufp->dend.address, objfile); - /* Why in the hell is this needed? */ - valu += offset + 9; /* Relocate for dynamic loading */ - new = pop_context (); - desc = dn_bufp->dend.beginscope.dnttp.index; - if (desc != new->depth) - complain (&lbrac_mismatch_complaint, (char *) symnum); - - /* Make a block for the local symbols within. */ - finish_block (new->name, &local_symbols, new->old_blocks, - new->start_addr, valu, objfile); - local_symbols = new->locals; - param_symbols = new->params; - } - break; - - case DNTT_TYPE_WITH: - /* Since we ignore the DNTT_TYPE_WITH that starts the scope, - * we can ignore the DNTT_TYPE_END that ends it. - */ - break; - - case DNTT_TYPE_COMMON: - /* End a FORTRAN common block. We don't currently handle these */ - complain (&hpread_unhandled_end_common_complaint); - break; - - case DNTT_TYPE_CLASS_SCOPE: - - /* pai: FIXME Not handling nested classes for now -- must - * maintain a stack */ - class_scope_name = NULL; - -#if 0 - /* End a class scope */ - valu = hpread_get_location (dn_bufp->dend.address, objfile); - /* Why in the hell is this needed? */ - valu += offset + 9; /* Relocate for dynamic loading */ - new = pop_context (); - desc = dn_bufp->dend.beginscope.dnttp.index; - if (desc != new->depth) - complain (&lbrac_mismatch_complaint, (char *) symnum); - /* Make a block for the local symbols within. */ - finish_block (new->name, &local_symbols, new->old_blocks, - new->start_addr, valu, objfile); - local_symbols = new->locals; - param_symbols = new->params; -#endif - break; - - default: - complain (&hpread_unexpected_end_complaint); - break; - } - break; - - /* DNTT_TYPE_IMPORT is not handled */ - - case DNTT_TYPE_LABEL: - SYMBOL_NAMESPACE (sym) = LABEL_NAMESPACE; - break; - - case DNTT_TYPE_FPARAM: - /* Function parameters. */ - /* Note 1: This code was present in the 4.16 sources, and then - removed, because fparams are handled in - hpread_read_function_type(). However, while fparam symbols - are indeed handled twice, this code here cannot be removed - because then they don't get added to the local symbol list of - the function's code block, which leads to a failure to look - up locals, "this"-relative member names, etc. So I've put - this code back in. pai/1997-07-21 */ - /* Note 2: To fix a defect, we stopped adding FPARAMS to local_symbols - in hpread_read_function_type(), so FPARAMS had to be handled - here. I changed the location to be the appropriate argument - kinds rather than LOC_LOCAL. pai/1997-08-08 */ - /* Note 3: Well, the fix in Note 2 above broke argument printing - in traceback frames, and further it makes assumptions about the - order of the FPARAM entries from HP compilers (cc and aCC in particular - generate them in reverse orders -- fixing one breaks for the other). - So I've added code in hpread_read_function_type() to add fparams - to a param_symbols list for the current context level. These are - then merged into local_symbols when a function end is reached. - pai/1997-08-11 */ - - break; /* do nothing; handled in hpread_read_function_type() */ - -#if 0 /* Old code */ - if (dn_bufp->dfparam.regparam) - SYMBOL_CLASS (sym) = LOC_REGISTER; - else if (dn_bufp->dfparam.indirect) - SYMBOL_CLASS (sym) = LOC_REF_ARG; - else - SYMBOL_CLASS (sym) = LOC_ARG; - SYMBOL_NAMESPACE (sym) = VAR_NAMESPACE; - if (dn_bufp->dfparam.copyparam) - { - SYMBOL_VALUE (sym) = dn_bufp->dfparam.location; -#ifdef HPREAD_ADJUST_STACK_ADDRESS - SYMBOL_VALUE (sym) - += HPREAD_ADJUST_STACK_ADDRESS (CURRENT_FUNCTION_VALUE (objfile)); -#endif - } - else - SYMBOL_VALUE (sym) = dn_bufp->dfparam.location; - SYMBOL_TYPE (sym) = hpread_type_lookup (dn_bufp->dfparam.type, objfile); - add_symbol_to_list (sym, &fparam_symbols); - break; -#endif - - case DNTT_TYPE_SVAR: - /* Static variables. */ - SYMBOL_CLASS (sym) = LOC_STATIC; - - /* Note: There is a case that arises with globals in shared - * libraries where we need to set the address to LOC_INDIRECT. - * This case is if you have a global "g" in one library, and - * it is referenced "extern <type> g;" in another library. - * If we're processing the symbols for the referencing library, - * we'll see a global "g", but in this case the address given - * in the symbol table contains a pointer to the real "g". - * We use the storage class LOC_INDIRECT to indicate this. RT - */ - if (is_in_import_list (SYMBOL_NAME(sym), objfile)) - SYMBOL_CLASS (sym) = LOC_INDIRECT; - - SYMBOL_VALUE_ADDRESS (sym) = dn_bufp->dsvar.location + data_offset; - SYMBOL_TYPE (sym) = hpread_type_lookup (dn_bufp->dsvar.type, objfile); - - if (dn_bufp->dsvar.global) - add_symbol_to_list (sym, &global_symbols); - - else if (WITHIN_FUNCTION (objfile)) - add_symbol_to_list (sym, &local_symbols); - - else - add_symbol_to_list (sym, &file_symbols); - - if (dn_bufp->dsvar.thread_specific) - { - /* Thread-local variable. - */ - SYMBOL_CLASS (sym) = LOC_THREAD_LOCAL_STATIC; - SYMBOL_BASEREG (sym) = CR27_REGNUM; - - if( objfile->flags & OBJF_SHARED ) { - /* - * This variable is not only thread local but - * in a shared library. - * - * Alas, the shared lib structures are private - * to "somsolib.c". But C lets us point to one. - */ - struct so_list *so; - - if( objfile->obj_private == NULL ) - error( "Internal error in reading shared library information." ); - - so = ((obj_private_data_t *)(objfile->obj_private))->so_info; - if( so == NULL ) - error( "Internal error in reading shared library information." ); - - /* Thread-locals in shared libraries do NOT have the - * standard offset ("data_offset"), so we re-calculate - * where to look for this variable, using a call-back - * to interpret the private shared-library data. - */ - SYMBOL_VALUE_ADDRESS(sym) = dn_bufp->dsvar.location + - so_lib_thread_start_addr( so ); - } - } - break; - - case DNTT_TYPE_DVAR: - /* Dynamic variables. */ - if (dn_bufp->ddvar.regvar) - SYMBOL_CLASS (sym) = LOC_REGISTER; - else - SYMBOL_CLASS (sym) = LOC_LOCAL; - - SYMBOL_VALUE (sym) = dn_bufp->ddvar.location; -#ifdef HPREAD_ADJUST_STACK_ADDRESS - SYMBOL_VALUE (sym) - += HPREAD_ADJUST_STACK_ADDRESS (CURRENT_FUNCTION_VALUE (objfile)); -#endif - SYMBOL_TYPE (sym) = hpread_type_lookup (dn_bufp->ddvar.type, objfile); - if (dn_bufp->ddvar.global) - add_symbol_to_list (sym, &global_symbols); - else if (WITHIN_FUNCTION (objfile)) - add_symbol_to_list (sym, &local_symbols); - else - add_symbol_to_list (sym, &file_symbols); - break; - - case DNTT_TYPE_CONST: - /* A constant (pascal?). */ - SYMBOL_CLASS (sym) = LOC_CONST; - SYMBOL_VALUE (sym) = dn_bufp->dconst.location; - SYMBOL_TYPE (sym) = hpread_type_lookup (dn_bufp->dconst.type, objfile); - if (dn_bufp->dconst.global) - add_symbol_to_list (sym, &global_symbols); - else if (WITHIN_FUNCTION (objfile)) - add_symbol_to_list (sym, &local_symbols); - else - add_symbol_to_list (sym, &file_symbols); - break; - - case DNTT_TYPE_TYPEDEF: - /* A typedef. We do want to process these, since a name is - * added to the namespace for the typedef'ed name. - */ - SYMBOL_NAMESPACE (sym) = VAR_NAMESPACE; - SYMBOL_TYPE (sym) = hpread_type_lookup (dn_bufp->dtype.type, objfile); - if (dn_bufp->dtype.global) - add_symbol_to_list (sym, &global_symbols); - else if (WITHIN_FUNCTION (objfile)) - add_symbol_to_list (sym, &local_symbols); - else - add_symbol_to_list (sym, &file_symbols); - break; - - case DNTT_TYPE_TAGDEF: - { - int global = dn_bufp->dtag.global; - /* Structure, union, enum, template, or class tag definition */ - /* We do want to process these, since a name is - * added to the namespace for the tag name (and if C++ class, - * for the typename also). - */ - SYMBOL_NAMESPACE (sym) = STRUCT_NAMESPACE; - - /* The tag contains in its "type" field a pointer to the - * DNTT_TYPE_STRUCT, DNTT_TYPE_UNION, DNTT_TYPE_ENUM, - * DNTT_TYPE_CLASS or DNTT_TYPE_TEMPLATE - * record that actually defines the type. - */ - SYMBOL_TYPE (sym) = hpread_type_lookup (dn_bufp->dtype.type, objfile); - TYPE_NAME (sym->type) = SYMBOL_NAME (sym); - TYPE_TAG_NAME (sym->type) = SYMBOL_NAME (sym); - if (dn_bufp->dtag.global) - add_symbol_to_list (sym, &global_symbols); - else if (WITHIN_FUNCTION (objfile)) - add_symbol_to_list (sym, &local_symbols); - else - add_symbol_to_list (sym, &file_symbols); - - /* If this is a C++ class, then we additionally - * need to define a typedef for the - * class type. E.g., so that the name "c" becomes visible as - * a type name when the user says "class c { ... }". - * In order to figure this out, we need to chase down the "type" - * field to get to the DNTT_TYPE_CLASS record. - * - * We also add the typename for ENUM. Though this isn't - * strictly correct, it is necessary because of the debug info - * generated by the aCC compiler, in which we cannot - * distinguish between: - * enum e { ... }; - * and - * typedef enum { ... } e; - * I.e., the compiler emits the same debug info for the above - * two cases, in both cases "e" appearing as a tagdef. - * Therefore go ahead and generate the typename so that - * "ptype e" will work in the above cases. - * - * We also add the typename for TEMPLATE, so as to allow "ptype t" - * when "t" is a template name. - */ - if (dn_bufp->dtype.type.dnttp.index < LNTT_SYMCOUNT (objfile)) - dn_bufp = hpread_get_lntt (dn_bufp->dtag.type.dnttp.index, objfile); - else { - complain (&hpread_tagdef_complaint); - return; - } - if (dn_bufp->dblock.kind == DNTT_TYPE_CLASS || - dn_bufp->dblock.kind == DNTT_TYPE_ENUM || - dn_bufp->dblock.kind == DNTT_TYPE_TEMPLATE) { - struct symbol *newsym; - - newsym = (struct symbol *) obstack_alloc (&objfile->symbol_obstack, - sizeof (struct symbol)); - memset (newsym, 0, sizeof (struct symbol)); - SYMBOL_NAME (newsym) = name; - SYMBOL_LANGUAGE (newsym) = language_auto; - SYMBOL_NAMESPACE (newsym) = VAR_NAMESPACE; - SYMBOL_LINE (newsym) = 0; - SYMBOL_VALUE (newsym) = 0; - SYMBOL_CLASS (newsym) = LOC_TYPEDEF; - SYMBOL_TYPE (newsym) = sym->type; - if (global) - add_symbol_to_list (newsym, &global_symbols); - else if (WITHIN_FUNCTION (objfile)) - add_symbol_to_list (newsym, &local_symbols); - else - add_symbol_to_list (newsym, &file_symbols); - } - } - break; - - case DNTT_TYPE_POINTER: - /* Declares a pointer type. Should not be necessary to do anything - * with the type at this level; these are processed - * at the hpread_type_lookup() level. - */ - break; - - case DNTT_TYPE_ENUM: - /* Declares an enum type. Should not be necessary to do anything - * with the type at this level; these are processed - * at the hpread_type_lookup() level. - */ - break; - - case DNTT_TYPE_MEMENUM: - /* Member of enum */ - /* Ignored at this level, but hpread_read_enum_type() will take - * care of walking the list of enumeration members. - */ - break; - - case DNTT_TYPE_SET: - /* Declares a set type. Should not be necessary to do anything - * with the type at this level; these are processed - * at the hpread_type_lookup() level. - */ - break; - - case DNTT_TYPE_SUBRANGE: - /* Declares a subrange type. Should not be necessary to do anything - * with the type at this level; these are processed - * at the hpread_type_lookup() level. - */ - break; - - case DNTT_TYPE_ARRAY: - /* Declares an array type. Should not be necessary to do anything - * with the type at this level; these are processed - * at the hpread_type_lookup() level. - */ - break; - - case DNTT_TYPE_STRUCT: - case DNTT_TYPE_UNION: - /* Declares an struct/union type. - * Should not be necessary to do anything - * with the type at this level; these are processed - * at the hpread_type_lookup() level. - */ - break; - - case DNTT_TYPE_FIELD: - /* Structure/union/class field */ - /* Ignored at this level, but hpread_read_struct_type() will take - * care of walking the list of structure/union/class members. - */ - break; - - /* DNTT_TYPE_VARIANT is not handled by GDB */ - - /* DNTT_TYPE_FILE is not handled by GDB */ - - case DNTT_TYPE_FUNCTYPE: - /* Function type */ - /* Ignored at this level, handled within hpread_type_lookup() */ - break; - - case DNTT_TYPE_WITH: - /* This is emitted within methods to indicate "with <class>" - * scoping rules (i.e., indicate that the class data members - * are directly visible). - * However, since GDB already infers this by looking at the - * "this" argument, interpreting the DNTT_TYPE_WITH - * symbol record is unnecessary. - */ - break; - - case DNTT_TYPE_COMMON: - /* FORTRAN common. Not yet handled. */ - complain (&hpread_unhandled_common_complaint); - break; - - /* DNTT_TYPE_COBSTRUCT is not handled by GDB. */ - /* DNTT_TYPE_XREF is not handled by GDB. */ - /* DNTT_TYPE_SA is not handled by GDB. */ - /* DNTT_TYPE_MACRO is not handled by GDB */ - - case DNTT_TYPE_BLOCKDATA: - /* Not sure what this is - part of FORTRAN support maybe? - * Anyway, not yet handled. - */ - complain (&hpread_unhandled_blockdata_complaint); - break; - - case DNTT_TYPE_CLASS_SCOPE: - - - - /* The compiler brackets member functions with a CLASS_SCOPE/END - * pair of records, presumably to put them in a different scope - * from the module scope where they are normally defined. - * E.g., in the situation: - * void f() { ... } - * void c::f() { ...} - * The member function "c::f" will be bracketed by a CLASS_SCOPE/END. - * This causes "break f" at the module level to pick the - * the file-level function f(), not the member function - * (which needs to be referenced via "break c::f"). - * - * Here we record the class name to generate the demangled names of - * member functions later. - * - * FIXME Not being used now for anything -- cplus_demangle seems - * enough for getting the class-qualified names of functions. We - * may need this for handling nested classes and types. */ - - /* pai: FIXME Not handling nested classes for now -- need to - * maintain a stack */ - - dn_temp = hpread_get_lntt (dn_bufp->dclass_scope.type.dnttp.index, objfile); - if (dn_temp->dblock.kind == DNTT_TYPE_TAGDEF) - class_scope_name = VT (objfile) + dn_temp->dtag.name; - else - class_scope_name = NULL; - -#if 0 - - /* Begin a new scope. */ - SL_INDEX (objfile) = hpread_record_lines (current_subfile, - SL_INDEX (objfile), - dn_bufp->dclass_scope.address, - objfile, offset); - valu = hpread_get_location (dn_bufp->dclass_scope.address, objfile); - valu += offset; /* Relocate for dynamic loading */ - desc = hpread_get_scope_start (dn_bufp->dclass_scope.address, objfile); - /* We use the scope start DNTT index as the nesting depth identifier! */ - new = push_context (desc, valu); -#endif - break; - - case DNTT_TYPE_REFERENCE: - /* Declares a C++ reference type. Should not be necessary to do anything - * with the type at this level; these are processed - * at the hpread_type_lookup() level. - */ - break; - - case DNTT_TYPE_PTRMEM: - /* Declares a C++ pointer-to-data-member type. This does not - * need to be handled at this level; being a type description it - * is instead handled at the hpread_type_lookup() level. - */ - break; - - case DNTT_TYPE_PTRMEMFUNC: - /* Declares a C++ pointer-to-function-member type. This does not - * need to be handled at this level; being a type description it - * is instead handled at the hpread_type_lookup() level. - */ - break; - - case DNTT_TYPE_CLASS: - /* Declares a class type. - * Should not be necessary to do anything - * with the type at this level; these are processed - * at the hpread_type_lookup() level. - */ - break; - - case DNTT_TYPE_GENFIELD: - /* I believe this is used for class member functions */ - /* Ignored at this level, but hpread_read_struct_type() will take - * care of walking the list of class members. - */ - break; - - case DNTT_TYPE_VFUNC: - /* Virtual function */ - /* This does not have to be handled at this level; handled in - * the course of processing class symbols. - */ - break; - - case DNTT_TYPE_MEMACCESS: - /* DDE ignores this symbol table record. - * It has something to do with "modified access" to class members. - * I'll assume we can safely ignore it too. - */ - break; - - case DNTT_TYPE_INHERITANCE: - /* These don't have to be handled here, since they are handled - * within hpread_read_struct_type() in the process of constructing - * a class type. - */ - break; - - case DNTT_TYPE_FRIEND_CLASS: - case DNTT_TYPE_FRIEND_FUNC: - /* These can safely be ignored, as GDB doesn't need this - * info. DDE only uses it in "describe". We may later want - * to extend GDB's "ptype" to give this info, but for now - * it seems safe enough to ignore it. - */ - break; - - case DNTT_TYPE_MODIFIER: - /* Intended to supply "modified access" to a type */ - /* From the way DDE handles this, it looks like it always - * modifies a type. Therefore it is safe to ignore it at this - * level, and handle it in hpread_type_lookup(). - */ - break; - - case DNTT_TYPE_OBJECT_ID: - /* Just ignore this - that's all DDE does */ - break; - - case DNTT_TYPE_MEMFUNC: - /* Member function */ - /* This does not have to be handled at this level; handled in - * the course of processing class symbols. - */ - break; - - case DNTT_TYPE_DOC_MEMFUNC: - /* Member function */ - /* This does not have to be handled at this level; handled in - * the course of processing class symbols. - */ - break; - - case DNTT_TYPE_TEMPLATE: - /* Template - sort of the header for a template definition, - * which like a class, points to a member list and also points - * to a TEMPLATE_ARG list of type-arguments. - * We do not need to process TEMPLATE records at this level though. - */ - break; - - case DNTT_TYPE_TEMPLATE_ARG: - /* The TEMPLATE record points to an argument list of - * TEMPLATE_ARG records, each of which describes one - * of the type-arguments. - * We do not need to process TEMPLATE_ARG records at this level though. - */ - break; - - case DNTT_TYPE_FUNC_TEMPLATE: - /* This will get emitted for member functions of templates. - * But we don't need to process this record at this level though, - * we will process it in the course of processing a TEMPLATE - * record. - */ - break; - - case DNTT_TYPE_LINK: - /* The LINK record is used to link up templates with instantiations. */ - /* It is not clear why this is needed, and furthermore aCC does - * not appear to generate this, so I think we can safely ignore it. - RT - */ - break; - - /* DNTT_TYPE_DYN_ARRAY_DESC is not handled by GDB */ - /* DNTT_TYPE_DESC_SUBRANGE is not handled by GDB */ - /* DNTT_TYPE_BEGIN_EXT is not handled by GDB */ - /* DNTT_TYPE_INLN is not handled by GDB */ - /* DNTT_TYPE_INLN_LIST is not handled by GDB */ - /* DNTT_TYPE_ALIAS is not handled by GDB */ - - default: - break; - } -} - -/* Get nesting depth for a DNTT entry. - * DN_BUFP points to a DNTT entry. - * OBJFILE is the object file. - * REPORT_NESTED is a flag; if 0, real nesting depth is - * reported, if it is 1, the function simply returns a - * non-zero value if the nesting depth is anything > 0. - * - * Return value is an integer. 0 => not a local type / name - * positive return => type or name is local to some - * block or function. - */ - - -/* elz: ATTENTION: FIXME: NOTE: WARNING!!!! - this function now returns 0 right away. It was taking too much time - at start up. Now, though, the local types are not handled correctly. -*/ - - -static int -hpread_get_scope_depth (dn_bufp, objfile, report_nested) - union dnttentry * dn_bufp; - struct objfile * objfile; - int report_nested; -{ - register int index; - register union dnttentry * dn_tmp; - register short depth = 0; -/****************************/ - return 0; -/****************************/ - - index = (((char *) dn_bufp) - LNTT (objfile)) / (sizeof (struct dntt_type_block)); - - while (--index >= 0) - { - dn_tmp = hpread_get_lntt (index, objfile); - switch (dn_tmp->dblock.kind) - { - case DNTT_TYPE_MODULE: - return depth; - case DNTT_TYPE_END: - /* index is signed int; dnttp.index is 29-bit unsigned int! */ - index = (int) dn_tmp->dend.beginscope.dnttp.index; - break; - case DNTT_TYPE_BEGIN: - case DNTT_TYPE_FUNCTION: - case DNTT_TYPE_DOC_FUNCTION: - case DNTT_TYPE_WITH: - case DNTT_TYPE_COMMON: - case DNTT_TYPE_CLASS_SCOPE: - depth++; - if (report_nested) - return 1; - break; - default: - break; - } - } - return depth; -} - -/* Adjust the bitoffsets for all fields of an anonymous union of - type TYPE by negative BITS. This handles HP aCC's hideous habit - of giving members of anonymous unions bit offsets relative to the - enclosing structure instead of relative to the union itself. */ - -static void -hpread_adjust_bitoffsets (type, bits) - struct type * type; - int bits; -{ - register int i; - - /* This is done only for unions; caller had better check that - it is an anonymous one. */ - if (TYPE_CODE (type) != TYPE_CODE_UNION) - return; - - /* Adjust each field; since this is a union, there are no base - classes. Also no static membes. Also, no need for recursion as - the members of this union if themeselves structs or unions, have - the correct bitoffsets; if an anonymous union is a member of this - anonymous union, the code in hpread_read_struct_type() will - adjust for that. */ - - for (i = 0; i < TYPE_NFIELDS (type); i++) - TYPE_FIELD_BITPOS (type, i) -= bits; -} - -/* Because of quirks in HP compilers' treatment of anonymous unions inside - classes, we have to chase through a chain of threaded FIELD entries. - If we encounter an anonymous union in the chain, we must recursively skip over - that too. - - This function does a "next" in the chain of FIELD entries, but transparently - skips over anonymous unions' fields (recursively). - - Inputs are the number of times to do "next" at the top level, the dnttpointer - (FIELD) and entry pointer (FIELDP) for the dntt record corresponding to it, - and the ubiquitous objfile parameter. (Note: FIELDP is a **.) Return value - is a dnttpointer for the new field after all the skipped ones */ - -static dnttpointer -hpread_get_next_skip_over_anon_unions (skip_fields, field, fieldp, objfile) - int skip_fields; - dnttpointer field; - union dnttentry ** fieldp; - struct objfile * objfile; -{ - struct type * anon_type; - register int i; - int bitoffset; - char * name; - - for (i=0; i < skip_fields; i++) - { - /* Get type of item we're looking at now; recursively processes the types - of these intermediate items we skip over, so they aren't lost. */ - anon_type = hpread_type_lookup ((*fieldp)->dfield.type, objfile); - anon_type = CHECK_TYPEDEF (anon_type); - bitoffset = (*fieldp)->dfield.bitoffset; - name = VT (objfile) + (*fieldp)->dfield.name; - /* First skip over one item to avoid stack death on recursion */ - field = (*fieldp)->dfield.nextfield; - *fieldp = hpread_get_lntt (field.dnttp.index, objfile); - /* Do we have another anonymous union? If so, adjust the bitoffsets - of its members and skip over its members. */ - if ((TYPE_CODE (anon_type) == TYPE_CODE_UNION) && - (!name || STREQ (name, ""))) - { - hpread_adjust_bitoffsets (anon_type, bitoffset); - field = hpread_get_next_skip_over_anon_unions (TYPE_NFIELDS (anon_type), field, fieldp, objfile); - } - } - return field; -} - - diff --git a/contrib/gdb/gdb/hpread.h b/contrib/gdb/gdb/hpread.h deleted file mode 100644 index 7864dd651502d..0000000000000 --- a/contrib/gdb/gdb/hpread.h +++ /dev/null @@ -1,150 +0,0 @@ -/* hpread.h - * Common include file for: - * hp_symtab_read.c - * hp_psymtab_read.c - */ - -/* Copyright 1993, 1996 Free Software Foundation, Inc. - - This file is part of GDB. - - 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 2 of the License, 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - - Written by the Center for Software Science at the University of Utah - and by Cygnus Support. */ - -#include "defs.h" -#include "bfd.h" -#include "gdb_string.h" -#include "hp-symtab.h" -#include "syms.h" -#include "symtab.h" -#include "symfile.h" -#include "objfiles.h" -#include "buildsym.h" -#include "complaints.h" -#include "gdb-stabs.h" -#include "gdbtypes.h" -#include "demangle.h" - -/* Private information attached to an objfile which we use to find - and internalize the HP C debug symbols within that objfile. */ - -struct hpread_symfile_info -{ - /* The contents of each of the debug sections (there are 4 of them). */ - char *gntt; - char *lntt; - char *slt; - char *vt; - - /* We keep the size of the $VT$ section for range checking. */ - unsigned int vt_size; - - /* Some routines still need to know the number of symbols in the - main debug sections ($LNTT$ and $GNTT$). */ - unsigned int lntt_symcount; - unsigned int gntt_symcount; - - /* To keep track of all the types we've processed. */ - struct type **type_vector; - int type_vector_length; - - /* Keeps track of the beginning of a range of source lines. */ - sltpointer sl_index; - - /* Some state variables we'll need. */ - int within_function; - - /* Keep track of the current function's address. We may need to look - up something based on this address. */ - unsigned int current_function_value; -}; - -/* Accessor macros to get at the fields. */ -#define HPUX_SYMFILE_INFO(o) \ - ((struct hpread_symfile_info *)((o)->sym_private)) -#define GNTT(o) (HPUX_SYMFILE_INFO(o)->gntt) -#define LNTT(o) (HPUX_SYMFILE_INFO(o)->lntt) -#define SLT(o) (HPUX_SYMFILE_INFO(o)->slt) -#define VT(o) (HPUX_SYMFILE_INFO(o)->vt) -#define VT_SIZE(o) (HPUX_SYMFILE_INFO(o)->vt_size) -#define LNTT_SYMCOUNT(o) (HPUX_SYMFILE_INFO(o)->lntt_symcount) -#define GNTT_SYMCOUNT(o) (HPUX_SYMFILE_INFO(o)->gntt_symcount) -#define TYPE_VECTOR(o) (HPUX_SYMFILE_INFO(o)->type_vector) -#define TYPE_VECTOR_LENGTH(o) (HPUX_SYMFILE_INFO(o)->type_vector_length) -#define SL_INDEX(o) (HPUX_SYMFILE_INFO(o)->sl_index) -#define WITHIN_FUNCTION(o) (HPUX_SYMFILE_INFO(o)->within_function) -#define CURRENT_FUNCTION_VALUE(o) (HPUX_SYMFILE_INFO(o)->current_function_value) - -/* Given the native debug symbol SYM, set NAMEP to the name associated - with the debug symbol. Note we may be called with a debug symbol which - has no associated name, in that case we return an empty string. - - Also note we "know" that the name for any symbol is always in the - same place. Hence we don't have to conditionalize on the symbol type. */ -#define SET_NAMESTRING(SYM, NAMEP, OBJFILE) \ - if (! hpread_has_name ((SYM)->dblock.kind)) \ - *NAMEP = ""; \ - else if (((unsigned)(SYM)->dsfile.name) >= VT_SIZE (OBJFILE)) \ - { \ - complain (&string_table_offset_complaint, (char *) symnum); \ - *NAMEP = ""; \ - } \ - else \ - *NAMEP = (SYM)->dsfile.name + VT (OBJFILE) - -/* We put a pointer to this structure in the read_symtab_private field - of the psymtab. */ - -struct symloc -{ - /* The offset within the file symbol table of first local symbol for - this file. */ - - int ldsymoff; - - /* Length (in bytes) of the section of the symbol table devoted to - this file's symbols (actually, the section bracketed may contain - more than just this file's symbols). If ldsymlen is 0, the only - reason for this thing's existence is the dependency list. - Nothing else will happen when it is read in. */ - - int ldsymlen; -}; - -#define LDSYMOFF(p) (((struct symloc *)((p)->read_symtab_private))->ldsymoff) -#define LDSYMLEN(p) (((struct symloc *)((p)->read_symtab_private))->ldsymlen) -#define SYMLOC(p) ((struct symloc *)((p)->read_symtab_private)) - -/* FIXME: Shouldn't this stuff be in a .h file somewhere? */ -/* Nonzero means give verbose info on gdb action. */ -extern int info_verbose; - -/* Complaints about the symbols we have encountered. */ -extern struct complaint string_table_offset_complaint; -extern struct complaint lbrac_unmatched_complaint; -extern struct complaint lbrac_mismatch_complaint; - -extern union sltentry *hpread_get_slt - PARAMS ((int, struct objfile *)); - -extern union dnttentry *hpread_get_lntt - PARAMS ((int, struct objfile *)); - -int hpread_has_name - PARAMS ((enum dntt_entry_type)); - -/* end of hpread.h */ diff --git a/contrib/gdb/gdb/isi-xdep.c b/contrib/gdb/gdb/isi-xdep.c deleted file mode 100644 index 8773c83ea7a94..0000000000000 --- a/contrib/gdb/gdb/isi-xdep.c +++ /dev/null @@ -1,20 +0,0 @@ -/* Copyright (C) 1993 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 2 of the License, 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ - -#include <machine/reg.h> -int rloc[] = { - R0, R1, R2, R3, R4, R5, R6, R7, R8, R9, R10, R11, R12, R13, FP, SP, PS, PC -}; diff --git a/contrib/gdb/gdb/jv-exp.tab.c b/contrib/gdb/gdb/jv-exp.tab.c deleted file mode 100644 index 39920caea20ec..0000000000000 --- a/contrib/gdb/gdb/jv-exp.tab.c +++ /dev/null @@ -1,2351 +0,0 @@ - -/* A Bison parser, made from jv-exp.y - by GNU Bison version 1.25 - */ - -#define YYBISON 1 /* Identify Bison output. */ - -#define INTEGER_LITERAL 258 -#define FLOATING_POINT_LITERAL 259 -#define IDENTIFIER 260 -#define STRING_LITERAL 261 -#define BOOLEAN_LITERAL 262 -#define TYPENAME 263 -#define NAME_OR_INT 264 -#define ERROR 265 -#define LONG 266 -#define SHORT 267 -#define BYTE 268 -#define INT 269 -#define CHAR 270 -#define BOOLEAN 271 -#define DOUBLE 272 -#define FLOAT 273 -#define VARIABLE 274 -#define ASSIGN_MODIFY 275 -#define THIS 276 -#define SUPER 277 -#define NEW 278 -#define OROR 279 -#define ANDAND 280 -#define EQUAL 281 -#define NOTEQUAL 282 -#define LEQ 283 -#define GEQ 284 -#define LSH 285 -#define RSH 286 -#define INCREMENT 287 -#define DECREMENT 288 - -#line 38 "jv-exp.y" - - -#include "defs.h" -#include "gdb_string.h" -#include <ctype.h> -#include "expression.h" -#include "value.h" -#include "parser-defs.h" -#include "language.h" -#include "jv-lang.h" -#include "bfd.h" /* Required by objfiles.h. */ -#include "symfile.h" /* Required by objfiles.h. */ -#include "objfiles.h" /* For have_full_symbols and have_partial_symbols */ - -/* Remap normal yacc parser interface names (yyparse, yylex, yyerror, etc), - as well as gratuitiously global symbol names, so we can have multiple - yacc generated parsers in gdb. Note that these are only the variables - produced by yacc. If other parser generators (bison, byacc, etc) produce - additional global names that conflict at link time, then those parser - generators need to be fixed instead of adding those names to this list. */ - -#define yymaxdepth java_maxdepth -#define yyparse java_parse -#define yylex java_lex -#define yyerror java_error -#define yylval java_lval -#define yychar java_char -#define yydebug java_debug -#define yypact java_pact -#define yyr1 java_r1 -#define yyr2 java_r2 -#define yydef java_def -#define yychk java_chk -#define yypgo java_pgo -#define yyact java_act -#define yyexca java_exca -#define yyerrflag java_errflag -#define yynerrs java_nerrs -#define yyps java_ps -#define yypv java_pv -#define yys java_s -#define yy_yys java_yys -#define yystate java_state -#define yytmp java_tmp -#define yyv java_v -#define yy_yyv java_yyv -#define yyval java_val -#define yylloc java_lloc -#define yyreds java_reds /* With YYDEBUG defined */ -#define yytoks java_toks /* With YYDEBUG defined */ -#define yylhs java_yylhs -#define yylen java_yylen -#define yydefred java_yydefred -#define yydgoto java_yydgoto -#define yysindex java_yysindex -#define yyrindex java_yyrindex -#define yygindex java_yygindex -#define yytable java_yytable -#define yycheck java_yycheck - -#ifndef YYDEBUG -#define YYDEBUG 0 /* Default to no yydebug support */ -#endif - -int -yyparse PARAMS ((void)); - -static int -yylex PARAMS ((void)); - -void -yyerror PARAMS ((char *)); - -static struct type * java_type_from_name PARAMS ((struct stoken)); -static void push_expression_name PARAMS ((struct stoken)); -static void push_fieldnames PARAMS ((struct stoken)); - -static struct expression *copy_exp PARAMS ((struct expression *, int)); -static void insert_exp PARAMS ((int, struct expression *)); - - -#line 124 "jv-exp.y" -typedef union - { - LONGEST lval; - struct { - LONGEST val; - struct type *type; - } typed_val_int; - struct { - DOUBLEST dval; - struct type *type; - } typed_val_float; - struct symbol *sym; - struct type *tval; - struct stoken sval; - struct ttype tsym; - struct symtoken ssym; - struct block *bval; - enum exp_opcode opcode; - struct internalvar *ivar; - int *ivec; - } YYSTYPE; -#line 146 "jv-exp.y" - -/* YYSTYPE gets defined by %union */ -static int -parse_number PARAMS ((char *, int, int, YYSTYPE *)); -#include <stdio.h> - -#ifndef __cplusplus -#ifndef __STDC__ -#define const -#endif -#endif - - - -#define YYFINAL 208 -#define YYFLAG -32768 -#define YYNTBASE 57 - -#define YYTRANSLATE(x) ((unsigned)(x) <= 288 ? yytranslate[x] : 112) - -static const char yytranslate[] = { 0, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 55, 2, 2, 2, 44, 31, 2, 49, - 50, 42, 40, 24, 41, 47, 43, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 56, 2, 34, - 25, 35, 26, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 48, 2, 53, 30, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 51, 29, 52, 54, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 1, 2, 3, 4, 5, - 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, - 16, 17, 18, 19, 20, 21, 22, 23, 27, 28, - 32, 33, 36, 37, 38, 39, 45, 46 -}; - -#if YYDEBUG != 0 -static const short yyprhs[] = { 0, - 0, 2, 4, 6, 8, 10, 12, 14, 16, 18, - 20, 22, 24, 26, 28, 30, 32, 34, 36, 38, - 40, 42, 44, 46, 48, 51, 54, 56, 58, 60, - 62, 64, 66, 70, 72, 76, 78, 80, 82, 84, - 88, 90, 92, 94, 96, 100, 102, 104, 110, 112, - 116, 117, 119, 124, 129, 131, 134, 138, 141, 145, - 147, 148, 152, 156, 161, 168, 175, 180, 185, 190, - 192, 194, 196, 198, 200, 203, 206, 208, 210, 213, - 216, 219, 221, 224, 227, 229, 232, 235, 237, 243, - 248, 254, 256, 260, 264, 268, 270, 274, 278, 280, - 284, 288, 290, 294, 298, 302, 306, 308, 312, 316, - 318, 322, 324, 328, 330, 334, 336, 340, 342, 346, - 348, 354, 356, 358, 362, 366, 368, 370, 372, 374 -}; - -static const short yyrhs[] = { 73, - 0, 58, 0, 59, 0, 62, 0, 68, 0, 6, - 0, 3, 0, 9, 0, 4, 0, 7, 0, 60, - 0, 63, 0, 16, 0, 64, 0, 65, 0, 13, - 0, 12, 0, 14, 0, 11, 0, 15, 0, 18, - 0, 17, 0, 69, 0, 66, 0, 62, 84, 0, - 69, 84, 0, 5, 0, 72, 0, 71, 0, 72, - 0, 5, 0, 9, 0, 69, 47, 71, 0, 111, - 0, 73, 24, 111, 0, 75, 0, 81, 0, 61, - 0, 21, 0, 49, 111, 50, 0, 78, 0, 86, - 0, 87, 0, 88, 0, 76, 79, 77, 0, 51, - 0, 52, 0, 23, 67, 49, 80, 50, 0, 111, - 0, 79, 24, 111, 0, 0, 79, 0, 23, 62, - 82, 85, 0, 23, 66, 82, 85, 0, 83, 0, - 82, 83, 0, 48, 111, 53, 0, 48, 53, 0, - 84, 48, 53, 0, 84, 0, 0, 74, 47, 71, - 0, 19, 47, 71, 0, 69, 49, 80, 50, 0, - 74, 47, 71, 49, 80, 50, 0, 22, 47, 71, - 49, 80, 50, 0, 69, 48, 111, 53, 0, 19, - 48, 111, 53, 0, 75, 48, 111, 53, 0, 74, - 0, 69, 0, 19, 0, 90, 0, 91, 0, 89, - 45, 0, 89, 46, 0, 93, 0, 94, 0, 40, - 92, 0, 41, 92, 0, 42, 92, 0, 95, 0, - 45, 92, 0, 46, 92, 0, 89, 0, 54, 92, - 0, 55, 92, 0, 96, 0, 49, 62, 85, 50, - 92, 0, 49, 111, 50, 95, 0, 49, 69, 84, - 50, 95, 0, 92, 0, 97, 42, 92, 0, 97, - 43, 92, 0, 97, 44, 92, 0, 97, 0, 98, - 40, 97, 0, 98, 41, 97, 0, 98, 0, 99, - 38, 98, 0, 99, 39, 98, 0, 99, 0, 100, - 34, 99, 0, 100, 35, 99, 0, 100, 36, 99, - 0, 100, 37, 99, 0, 100, 0, 101, 32, 100, - 0, 101, 33, 100, 0, 101, 0, 102, 31, 101, - 0, 102, 0, 103, 30, 102, 0, 103, 0, 104, - 29, 103, 0, 104, 0, 105, 28, 104, 0, 105, - 0, 106, 27, 105, 0, 106, 0, 106, 26, 111, - 56, 107, 0, 107, 0, 109, 0, 110, 25, 107, - 0, 110, 20, 107, 0, 70, 0, 19, 0, 86, - 0, 88, 0, 108, 0 -}; - -#endif - -#if YYDEBUG != 0 -static const short yyrline[] = { 0, - 203, 204, 207, 215, 217, 220, 229, 235, 243, 248, - 253, 263, 265, 269, 271, 274, 277, 279, 281, 283, - 287, 290, 301, 306, 310, 313, 317, 319, 322, 324, - 327, 329, 332, 356, 357, 361, 363, 366, 368, 371, - 372, 373, 374, 375, 376, 383, 388, 393, 398, 401, - 405, 408, 411, 414, 418, 420, 423, 427, 430, 434, - 436, 440, 443, 448, 451, 453, 457, 475, 477, 481, - 483, 485, 487, 488, 491, 496, 501, 503, 504, 505, - 507, 509, 512, 517, 522, 524, 526, 528, 531, 536, - 557, 564, 566, 568, 570, 574, 576, 578, 582, 584, - 586, 591, 593, 595, 597, 599, 604, 606, 608, 612, - 614, 618, 620, 623, 625, 629, 631, 635, 637, 641, - 643, 647, 649, 652, 655, 661, 664, 666, 667, 671 -}; -#endif - - -#if YYDEBUG != 0 || defined (YYERROR_VERBOSE) - -static const char * const yytname[] = { "$","error","$undefined.","INTEGER_LITERAL", -"FLOATING_POINT_LITERAL","IDENTIFIER","STRING_LITERAL","BOOLEAN_LITERAL","TYPENAME", -"NAME_OR_INT","ERROR","LONG","SHORT","BYTE","INT","CHAR","BOOLEAN","DOUBLE", -"FLOAT","VARIABLE","ASSIGN_MODIFY","THIS","SUPER","NEW","','","'='","'?'","OROR", -"ANDAND","'|'","'^'","'&'","EQUAL","NOTEQUAL","'<'","'>'","LEQ","GEQ","LSH", -"RSH","'+'","'-'","'*'","'/'","'%'","INCREMENT","DECREMENT","'.'","'['","'('", -"')'","'{'","'}'","']'","'~'","'!'","':'","start","type_exp","PrimitiveOrArrayType", -"StringLiteral","Literal","PrimitiveType","NumericType","IntegralType","FloatingPointType", -"ClassOrInterfaceType","ClassType","ArrayType","Name","ForcedName","SimpleName", -"QualifiedName","exp1","Primary","PrimaryNoNewArray","lcurly","rcurly","ClassInstanceCreationExpression", -"ArgumentList","ArgumentList_opt","ArrayCreationExpression","DimExprs","DimExpr", -"Dims","Dims_opt","FieldAccess","MethodInvocation","ArrayAccess","PostfixExpression", -"PostIncrementExpression","PostDecrementExpression","UnaryExpression","PreIncrementExpression", -"PreDecrementExpression","UnaryExpressionNotPlusMinus","CastExpression","MultiplicativeExpression", -"AdditiveExpression","ShiftExpression","RelationalExpression","EqualityExpression", -"AndExpression","ExclusiveOrExpression","InclusiveOrExpression","ConditionalAndExpression", -"ConditionalOrExpression","ConditionalExpression","AssignmentExpression","Assignment", -"LeftHandSide","Expression", NULL -}; -#endif - -static const short yyr1[] = { 0, - 57, 57, 58, 59, 59, 60, 61, 61, 61, 61, - 61, 62, 62, 63, 63, 64, 64, 64, 64, 64, - 65, 65, 66, 67, 68, 68, 69, 69, 70, 70, - 71, 71, 72, 73, 73, 74, 74, 75, 75, 75, - 75, 75, 75, 75, 75, 76, 77, 78, 79, 79, - 80, 80, 81, 81, 82, 82, 83, 84, 84, 85, - 85, 86, 86, 87, 87, 87, 88, 88, 88, 89, - 89, 89, 89, 89, 90, 91, 92, 92, 92, 92, - 92, 92, 93, 94, 95, 95, 95, 95, 96, 96, - 96, 97, 97, 97, 97, 98, 98, 98, 99, 99, - 99, 100, 100, 100, 100, 100, 101, 101, 101, 102, - 102, 103, 103, 104, 104, 105, 105, 106, 106, 107, - 107, 108, 108, 109, 109, 110, 110, 110, 110, 111 -}; - -static const short yyr2[] = { 0, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 2, 2, 1, 1, 1, 1, - 1, 1, 3, 1, 3, 1, 1, 1, 1, 3, - 1, 1, 1, 1, 3, 1, 1, 5, 1, 3, - 0, 1, 4, 4, 1, 2, 3, 2, 3, 1, - 0, 3, 3, 4, 6, 6, 4, 4, 4, 1, - 1, 1, 1, 1, 2, 2, 1, 1, 2, 2, - 2, 1, 2, 2, 1, 2, 2, 1, 5, 4, - 5, 1, 3, 3, 3, 1, 3, 3, 1, 3, - 3, 1, 3, 3, 3, 3, 1, 3, 3, 1, - 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, - 5, 1, 1, 3, 3, 1, 1, 1, 1, 1 -}; - -static const short yydefact[] = { 0, - 7, 9, 27, 6, 10, 8, 19, 17, 16, 18, - 20, 13, 22, 21, 72, 39, 0, 0, 0, 0, - 0, 0, 0, 0, 46, 0, 0, 2, 3, 11, - 38, 4, 12, 14, 15, 5, 71, 126, 29, 28, - 1, 70, 36, 0, 41, 37, 42, 43, 44, 85, - 73, 74, 92, 77, 78, 82, 88, 96, 99, 102, - 107, 110, 112, 114, 116, 118, 120, 122, 130, 123, - 0, 34, 0, 0, 0, 27, 0, 24, 0, 23, - 28, 8, 72, 71, 42, 44, 79, 80, 81, 83, - 84, 61, 71, 0, 86, 87, 0, 25, 0, 0, - 51, 26, 0, 0, 0, 0, 49, 75, 76, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 31, 32, 63, 0, 0, 0, 61, 55, 61, 51, - 0, 60, 0, 0, 40, 58, 0, 33, 0, 52, - 0, 35, 62, 0, 0, 47, 45, 93, 94, 95, - 97, 98, 100, 101, 103, 104, 105, 106, 108, 109, - 111, 113, 115, 117, 0, 119, 125, 124, 68, 51, - 0, 0, 56, 53, 54, 0, 0, 0, 90, 59, - 67, 64, 51, 69, 50, 0, 0, 57, 48, 89, - 91, 0, 121, 66, 65, 0, 0, 0 -}; - -static const short yydefgoto[] = { 206, - 28, 29, 30, 31, 32, 33, 34, 35, 78, 79, - 36, 84, 38, 39, 81, 41, 42, 43, 44, 157, - 45, 150, 151, 46, 137, 138, 142, 143, 85, 48, - 86, 50, 51, 52, 53, 54, 55, 56, 57, 58, - 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, - 69, 70, 71, 107 -}; - -static const short yypact[] = { 206, --32768,-32768, -5,-32768,-32768, -3,-32768,-32768,-32768,-32768, --32768,-32768,-32768,-32768, 1,-32768, -34, 225, 312, 312, - 312, 312, 312, 206,-32768, 312, 312,-32768,-32768,-32768, --32768, -23,-32768,-32768,-32768,-32768, 34,-32768,-32768, 7, - 4, -28, -17, 365,-32768,-32768, 15,-32768, 21, 74, --32768,-32768,-32768,-32768,-32768,-32768,-32768, 45, 44, 86, - 35, 96, 3, 23, 8, 51, 104,-32768,-32768,-32768, - 32,-32768, 46, 365, 46,-32768, 25, 25, 14, 55, --32768,-32768, 87, 47,-32768,-32768,-32768,-32768,-32768,-32768, --32768, -23, 34, 40,-32768,-32768, 57, 50, 46, 259, - 365, 50, 365, 46, 365, -13,-32768,-32768,-32768, 312, - 312, 312, 312, 312, 312, 312, 312, 312, 312, 312, - 312, 312, 312, 312, 312, 312, 365, 312, 312, 312, --32768,-32768,-32768, 61, 59, 365, 56,-32768, 56, 365, - 365, 50, 66, 43, 372,-32768, 69,-32768, 73, 108, - 106,-32768, 111, 109, 365,-32768,-32768,-32768,-32768,-32768, - 45, 45, 44, 44, 86, 86, 86, 86, 35, 35, - 96, 3, 23, 8, 107, 51,-32768,-32768,-32768, 365, - 112, 259,-32768,-32768,-32768, 114, 312, 372,-32768,-32768, --32768,-32768, 365,-32768,-32768, 312, 116,-32768,-32768,-32768, --32768, 118,-32768,-32768,-32768, 169, 170,-32768 -}; - -static const short yypgoto[] = {-32768, --32768,-32768,-32768,-32768, -8,-32768,-32768,-32768,-32768,-32768, --32768, 5,-32768, -66, 0,-32768,-32768,-32768,-32768,-32768, --32768, 127, -126,-32768, 94, -94, -29, -40, 6,-32768, - 12,-32768,-32768,-32768, 39,-32768,-32768, -141,-32768, 24, - 28, -42, 36, 52, 53, 49, 58, 48,-32768, -128, --32768,-32768,-32768, 18 -}; - - -#define YYLAST 427 - - -static const short yytable[] = { 40, - 177, 178, 98, 189, 37, 47, 133, 102, 135, 77, - 155, 49, 75, 186, -31, 92, -32, 72, 104, -31, - -127, -32, 80, 40, 97, -127, -30, 103, 93, 47, - 105, -30, 148, 123, -128, 49, 125, 153, 156, -128, - -129, 94, 183, 40, 183, -129, 201, 73, 74, 47, - 131, 129, 124, 197, 132, 49, 130, 87, 88, 89, - 90, 91, 140, 144, 95, 96, 202, 203, 117, 118, - 119, 120, 136, 40, 165, 166, 167, 168, 126, 47, - 99, 100, 101, 113, 114, 49, 110, 111, 112, 145, - 147, 134, 188, 99, 141, 101, 184, 147, 185, 40, - 40, 99, 40, 182, 40, 47, 47, 180, 47, 146, - 47, 49, 49, 179, 49, 187, 49, 149, 108, 109, - 152, 190, 154, 115, 116, 191, 40, 121, 122, 127, - 128, 155, 47, 73, 74, 40, 161, 162, 49, 40, - 40, 47, 163, 164, 175, 47, 47, 49, 158, 159, - 160, 49, 49, 181, 40, 192, 169, 170, 149, 193, - 47, 194, 196, 199, 198, 204, 49, 205, 207, 208, - 106, 139, 195, 173, 171, 176, 172, 0, 0, 40, - 0, 40, 0, 174, 0, 47, 0, 47, 0, 0, - 0, 49, 40, 49, 0, 0, 0, 0, 47, 181, - 0, 0, 0, 0, 49, 0, 0, 0, 1, 2, - 3, 4, 5, 0, 6, 0, 7, 8, 9, 10, - 11, 12, 13, 14, 15, 200, 16, 17, 18, 76, - 0, 0, 0, 0, 0, 7, 8, 9, 10, 11, - 12, 13, 14, 0, 0, 19, 20, 21, 0, 0, - 22, 23, 0, 0, 24, 0, 25, 0, 0, 26, - 27, 1, 2, 3, 4, 5, 0, 6, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 15, 0, 16, - 17, 18, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 19, 20, - 21, 0, 0, 22, 23, 0, 0, 24, 0, 25, - 0, 146, 26, 27, 1, 2, 76, 4, 5, 0, - 82, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 83, 0, 16, 17, 18, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 19, 20, 21, 0, 0, 22, 23, 0, 0, - 24, 0, 25, 0, 0, 26, 27, 1, 2, 3, - 4, 5, 0, 6, 1, 2, 76, 4, 5, 0, - 82, 0, 0, 15, 0, 16, 17, 18, 0, 0, - 83, 0, 16, 17, 18, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 19, 20, 21, 0, 0, 22, - 23, 0, 0, 24, 0, 25, 0, 0, 26, 27, - 24, 0, 25, 0, 0, 26, 27 -}; - -static const short yycheck[] = { 0, - 129, 130, 32, 145, 0, 0, 73, 37, 75, 18, - 24, 0, 47, 140, 20, 24, 20, 0, 47, 25, - 20, 25, 18, 24, 48, 25, 20, 24, 24, 24, - 48, 25, 99, 31, 20, 24, 29, 104, 52, 25, - 20, 24, 137, 44, 139, 25, 188, 47, 48, 44, - 5, 20, 30, 180, 9, 44, 25, 19, 20, 21, - 22, 23, 49, 93, 26, 27, 193, 196, 34, 35, - 36, 37, 48, 74, 117, 118, 119, 120, 28, 74, - 47, 48, 49, 40, 41, 74, 42, 43, 44, 50, - 48, 74, 50, 47, 48, 49, 137, 48, 139, 100, - 101, 47, 103, 48, 105, 100, 101, 49, 103, 53, - 105, 100, 101, 53, 103, 50, 105, 100, 45, 46, - 103, 53, 105, 38, 39, 53, 127, 32, 33, 26, - 27, 24, 127, 47, 48, 136, 113, 114, 127, 140, - 141, 136, 115, 116, 127, 140, 141, 136, 110, 111, - 112, 140, 141, 136, 155, 50, 121, 122, 141, 49, - 155, 53, 56, 50, 53, 50, 155, 50, 0, 0, - 44, 78, 155, 125, 123, 128, 124, -1, -1, 180, - -1, 182, -1, 126, -1, 180, -1, 182, -1, -1, - -1, 180, 193, 182, -1, -1, -1, -1, 193, 182, - -1, -1, -1, -1, 193, -1, -1, -1, 3, 4, - 5, 6, 7, -1, 9, -1, 11, 12, 13, 14, - 15, 16, 17, 18, 19, 187, 21, 22, 23, 5, - -1, -1, -1, -1, -1, 11, 12, 13, 14, 15, - 16, 17, 18, -1, -1, 40, 41, 42, -1, -1, - 45, 46, -1, -1, 49, -1, 51, -1, -1, 54, - 55, 3, 4, 5, 6, 7, -1, 9, -1, -1, - -1, -1, -1, -1, -1, -1, -1, 19, -1, 21, - 22, 23, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, 40, 41, - 42, -1, -1, 45, 46, -1, -1, 49, -1, 51, - -1, 53, 54, 55, 3, 4, 5, 6, 7, -1, - 9, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 19, -1, 21, 22, 23, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 40, 41, 42, -1, -1, 45, 46, -1, -1, - 49, -1, 51, -1, -1, 54, 55, 3, 4, 5, - 6, 7, -1, 9, 3, 4, 5, 6, 7, -1, - 9, -1, -1, 19, -1, 21, 22, 23, -1, -1, - 19, -1, 21, 22, 23, -1, -1, -1, -1, -1, - -1, -1, -1, -1, 40, 41, 42, -1, -1, 45, - 46, -1, -1, 49, -1, 51, -1, -1, 54, 55, - 49, -1, 51, -1, -1, 54, 55 -}; -/* -*-C-*- Note some compilers choke on comments on `#line' lines. */ -#line 3 "/stone/jimb/main-98r2/share/bison.simple" - -/* Skeleton output parser for bison, - Copyright (C) 1984, 1989, 1990 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 2, 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. */ - -/* As a special exception, when this file is copied by Bison into a - Bison output file, you may use that output file without restriction. - This special exception was added by the Free Software Foundation - in version 1.24 of Bison. */ - -#ifndef alloca -#ifdef __GNUC__ -#define alloca __builtin_alloca -#else /* not GNU C. */ -#if (!defined (__STDC__) && defined (sparc)) || defined (__sparc__) || defined (__sparc) || defined (__sgi) -#include <alloca.h> -#else /* not sparc */ -#if defined (MSDOS) && !defined (__TURBOC__) -#else /* not MSDOS, or __TURBOC__ */ -#if defined(_AIX) - #pragma alloca -#else /* not MSDOS, __TURBOC__, or _AIX */ -#ifdef __hpux -#ifdef __cplusplus -extern "C" { -void *alloca (unsigned int); -}; -#else /* not __cplusplus */ -void *alloca (); -#endif /* not __cplusplus */ -#endif /* __hpux */ -#endif /* not _AIX */ -#endif /* not MSDOS, or __TURBOC__ */ -#endif /* not sparc. */ -#endif /* not GNU C. */ -#endif /* alloca not defined. */ - -/* This is the parser code that is written into each bison parser - when the %semantic_parser declaration is not specified in the grammar. - It was written by Richard Stallman by simplifying the hairy parser - used when %semantic_parser is specified. */ - -/* Note: there must be only one dollar sign in this file. - It is replaced by the list of actions, each action - as one case of the switch. */ - -#define yyerrok (yyerrstatus = 0) -#define yyclearin (yychar = YYEMPTY) -#define YYEMPTY -2 -#define YYEOF 0 -#define YYACCEPT return(0) -#define YYABORT return(1) -#define YYERROR goto yyerrlab1 -/* Like YYERROR except do call yyerror. - This remains here temporarily to ease the - transition to the new meaning of YYERROR, for GCC. - Once GCC version 2 has supplanted version 1, this can go. */ -#define YYFAIL goto yyerrlab -#define YYRECOVERING() (!!yyerrstatus) -#define YYBACKUP(token, value) \ -do \ - if (yychar == YYEMPTY && yylen == 1) \ - { yychar = (token), yylval = (value); \ - yychar1 = YYTRANSLATE (yychar); \ - YYPOPSTACK; \ - goto yybackup; \ - } \ - else \ - { yyerror ("syntax error: cannot back up"); YYERROR; } \ -while (0) - -#define YYTERROR 1 -#define YYERRCODE 256 - -#ifndef YYPURE -#define YYLEX yylex() -#endif - -#ifdef YYPURE -#ifdef YYLSP_NEEDED -#ifdef YYLEX_PARAM -#define YYLEX yylex(&yylval, &yylloc, YYLEX_PARAM) -#else -#define YYLEX yylex(&yylval, &yylloc) -#endif -#else /* not YYLSP_NEEDED */ -#ifdef YYLEX_PARAM -#define YYLEX yylex(&yylval, YYLEX_PARAM) -#else -#define YYLEX yylex(&yylval) -#endif -#endif /* not YYLSP_NEEDED */ -#endif - -/* If nonreentrant, generate the variables here */ - -#ifndef YYPURE - -int yychar; /* the lookahead symbol */ -YYSTYPE yylval; /* the semantic value of the */ - /* lookahead symbol */ - -#ifdef YYLSP_NEEDED -YYLTYPE yylloc; /* location data for the lookahead */ - /* symbol */ -#endif - -int yynerrs; /* number of parse errors so far */ -#endif /* not YYPURE */ - -#if YYDEBUG != 0 -int yydebug; /* nonzero means print parse trace */ -/* Since this is uninitialized, it does not stop multiple parsers - from coexisting. */ -#endif - -/* YYINITDEPTH indicates the initial size of the parser's stacks */ - -#ifndef YYINITDEPTH -#define YYINITDEPTH 200 -#endif - -/* YYMAXDEPTH is the maximum size the stacks can grow to - (effective only if the built-in stack extension method is used). */ - -#if YYMAXDEPTH == 0 -#undef YYMAXDEPTH -#endif - -#ifndef YYMAXDEPTH -#define YYMAXDEPTH 10000 -#endif - -/* Prevent warning if -Wstrict-prototypes. */ -#ifdef __GNUC__ -int yyparse (void); -#endif - -#if __GNUC__ > 1 /* GNU C and GNU C++ define this. */ -#define __yy_memcpy(TO,FROM,COUNT) __builtin_memcpy(TO,FROM,COUNT) -#else /* not GNU C or C++ */ -#ifndef __cplusplus - -/* This is the most reliable way to avoid incompatibilities - in available built-in functions on various systems. */ -static void -__yy_memcpy (to, from, count) - char *to; - char *from; - int count; -{ - register char *f = from; - register char *t = to; - register int i = count; - - while (i-- > 0) - *t++ = *f++; -} - -#else /* __cplusplus */ - -/* This is the most reliable way to avoid incompatibilities - in available built-in functions on various systems. */ -static void -__yy_memcpy (char *to, char *from, int count) -{ - register char *f = from; - register char *t = to; - register int i = count; - - while (i-- > 0) - *t++ = *f++; -} - -#endif -#endif - -#line 196 "/stone/jimb/main-98r2/share/bison.simple" - -/* The user can define YYPARSE_PARAM as the name of an argument to be passed - into yyparse. The argument should have type void *. - It should actually point to an object. - Grammar actions can access the variable by casting it - to the proper pointer type. */ - -#ifdef YYPARSE_PARAM -#ifdef __cplusplus -#define YYPARSE_PARAM_ARG void *YYPARSE_PARAM -#define YYPARSE_PARAM_DECL -#else /* not __cplusplus */ -#define YYPARSE_PARAM_ARG YYPARSE_PARAM -#define YYPARSE_PARAM_DECL void *YYPARSE_PARAM; -#endif /* not __cplusplus */ -#else /* not YYPARSE_PARAM */ -#define YYPARSE_PARAM_ARG -#define YYPARSE_PARAM_DECL -#endif /* not YYPARSE_PARAM */ - -int -yyparse(YYPARSE_PARAM_ARG) - YYPARSE_PARAM_DECL -{ - register int yystate; - register int yyn; - register short *yyssp; - register YYSTYPE *yyvsp; - int yyerrstatus; /* number of tokens to shift before error messages enabled */ - int yychar1 = 0; /* lookahead token as an internal (translated) token number */ - - short yyssa[YYINITDEPTH]; /* the state stack */ - YYSTYPE yyvsa[YYINITDEPTH]; /* the semantic value stack */ - - short *yyss = yyssa; /* refer to the stacks thru separate pointers */ - YYSTYPE *yyvs = yyvsa; /* to allow yyoverflow to xreallocate them elsewhere */ - -#ifdef YYLSP_NEEDED - YYLTYPE yylsa[YYINITDEPTH]; /* the location stack */ - YYLTYPE *yyls = yylsa; - YYLTYPE *yylsp; - -#define YYPOPSTACK (yyvsp--, yyssp--, yylsp--) -#else -#define YYPOPSTACK (yyvsp--, yyssp--) -#endif - - int yystacksize = YYINITDEPTH; - -#ifdef YYPURE - int yychar; - YYSTYPE yylval; - int yynerrs; -#ifdef YYLSP_NEEDED - YYLTYPE yylloc; -#endif -#endif - - YYSTYPE yyval; /* the variable used to return */ - /* semantic values from the action */ - /* routines */ - - int yylen; - -#if YYDEBUG != 0 - if (yydebug) - fprintf(stderr, "Starting parse\n"); -#endif - - yystate = 0; - yyerrstatus = 0; - yynerrs = 0; - yychar = YYEMPTY; /* Cause a token to be read. */ - - /* Initialize stack pointers. - Waste one element of value and location stack - so that they stay on the same level as the state stack. - The wasted elements are never initialized. */ - - yyssp = yyss - 1; - yyvsp = yyvs; -#ifdef YYLSP_NEEDED - yylsp = yyls; -#endif - -/* Push a new state, which is found in yystate . */ -/* In all cases, when you get here, the value and location stacks - have just been pushed. so pushing a state here evens the stacks. */ -yynewstate: - - *++yyssp = yystate; - - if (yyssp >= yyss + yystacksize - 1) - { - /* Give user a chance to xreallocate the stack */ - /* Use copies of these so that the &'s don't force the real ones into memory. */ - YYSTYPE *yyvs1 = yyvs; - short *yyss1 = yyss; -#ifdef YYLSP_NEEDED - YYLTYPE *yyls1 = yyls; -#endif - - /* Get the current used size of the three stacks, in elements. */ - int size = yyssp - yyss + 1; - -#ifdef yyoverflow - /* Each stack pointer address is followed by the size of - the data in use in that stack, in bytes. */ -#ifdef YYLSP_NEEDED - /* This used to be a conditional around just the two extra args, - but that might be undefined if yyoverflow is a macro. */ - yyoverflow("parser stack overflow", - &yyss1, size * sizeof (*yyssp), - &yyvs1, size * sizeof (*yyvsp), - &yyls1, size * sizeof (*yylsp), - &yystacksize); -#else - yyoverflow("parser stack overflow", - &yyss1, size * sizeof (*yyssp), - &yyvs1, size * sizeof (*yyvsp), - &yystacksize); -#endif - - yyss = yyss1; yyvs = yyvs1; -#ifdef YYLSP_NEEDED - yyls = yyls1; -#endif -#else /* no yyoverflow */ - /* Extend the stack our own way. */ - if (yystacksize >= YYMAXDEPTH) - { - yyerror("parser stack overflow"); - return 2; - } - yystacksize *= 2; - if (yystacksize > YYMAXDEPTH) - yystacksize = YYMAXDEPTH; - yyss = (short *) alloca (yystacksize * sizeof (*yyssp)); - __yy_memcpy ((char *)yyss, (char *)yyss1, size * sizeof (*yyssp)); - yyvs = (YYSTYPE *) alloca (yystacksize * sizeof (*yyvsp)); - __yy_memcpy ((char *)yyvs, (char *)yyvs1, size * sizeof (*yyvsp)); -#ifdef YYLSP_NEEDED - yyls = (YYLTYPE *) alloca (yystacksize * sizeof (*yylsp)); - __yy_memcpy ((char *)yyls, (char *)yyls1, size * sizeof (*yylsp)); -#endif -#endif /* no yyoverflow */ - - yyssp = yyss + size - 1; - yyvsp = yyvs + size - 1; -#ifdef YYLSP_NEEDED - yylsp = yyls + size - 1; -#endif - -#if YYDEBUG != 0 - if (yydebug) - fprintf(stderr, "Stack size increased to %d\n", yystacksize); -#endif - - if (yyssp >= yyss + yystacksize - 1) - YYABORT; - } - -#if YYDEBUG != 0 - if (yydebug) - fprintf(stderr, "Entering state %d\n", yystate); -#endif - - goto yybackup; - yybackup: - -/* Do appropriate processing given the current state. */ -/* Read a lookahead token if we need one and don't already have one. */ -/* yyresume: */ - - /* First try to decide what to do without reference to lookahead token. */ - - yyn = yypact[yystate]; - if (yyn == YYFLAG) - goto yydefault; - - /* Not known => get a lookahead token if don't already have one. */ - - /* yychar is either YYEMPTY or YYEOF - or a valid token in external form. */ - - if (yychar == YYEMPTY) - { -#if YYDEBUG != 0 - if (yydebug) - fprintf(stderr, "Reading a token: "); -#endif - yychar = YYLEX; - } - - /* Convert token to internal form (in yychar1) for indexing tables with */ - - if (yychar <= 0) /* This means end of input. */ - { - yychar1 = 0; - yychar = YYEOF; /* Don't call YYLEX any more */ - -#if YYDEBUG != 0 - if (yydebug) - fprintf(stderr, "Now at end of input.\n"); -#endif - } - else - { - yychar1 = YYTRANSLATE(yychar); - -#if YYDEBUG != 0 - if (yydebug) - { - fprintf (stderr, "Next token is %d (%s", yychar, yytname[yychar1]); - /* Give the individual parser a way to print the precise meaning - of a token, for further debugging info. */ -#ifdef YYPRINT - YYPRINT (stderr, yychar, yylval); -#endif - fprintf (stderr, ")\n"); - } -#endif - } - - yyn += yychar1; - if (yyn < 0 || yyn > YYLAST || yycheck[yyn] != yychar1) - goto yydefault; - - yyn = yytable[yyn]; - - /* yyn is what to do for this token type in this state. - Negative => reduce, -yyn is rule number. - Positive => shift, yyn is new state. - New state is final state => don't bother to shift, - just return success. - 0, or most negative number => error. */ - - if (yyn < 0) - { - if (yyn == YYFLAG) - goto yyerrlab; - yyn = -yyn; - goto yyreduce; - } - else if (yyn == 0) - goto yyerrlab; - - if (yyn == YYFINAL) - YYACCEPT; - - /* Shift the lookahead token. */ - -#if YYDEBUG != 0 - if (yydebug) - fprintf(stderr, "Shifting token %d (%s), ", yychar, yytname[yychar1]); -#endif - - /* Discard the token being shifted unless it is eof. */ - if (yychar != YYEOF) - yychar = YYEMPTY; - - *++yyvsp = yylval; -#ifdef YYLSP_NEEDED - *++yylsp = yylloc; -#endif - - /* count tokens shifted since error; after three, turn off error status. */ - if (yyerrstatus) yyerrstatus--; - - yystate = yyn; - goto yynewstate; - -/* Do the default action for the current state. */ -yydefault: - - yyn = yydefact[yystate]; - if (yyn == 0) - goto yyerrlab; - -/* Do a reduction. yyn is the number of a rule to reduce with. */ -yyreduce: - yylen = yyr2[yyn]; - if (yylen > 0) - yyval = yyvsp[1-yylen]; /* implement default value of the action */ - -#if YYDEBUG != 0 - if (yydebug) - { - int i; - - fprintf (stderr, "Reducing via rule %d (line %d), ", - yyn, yyrline[yyn]); - - /* Print the symbols being reduced, and their result. */ - for (i = yyprhs[yyn]; yyrhs[i] > 0; i++) - fprintf (stderr, "%s ", yytname[yyrhs[i]]); - fprintf (stderr, " -> %s\n", yytname[yyr1[yyn]]); - } -#endif - - - switch (yyn) { - -case 3: -#line 208 "jv-exp.y" -{ - write_exp_elt_opcode(OP_TYPE); - write_exp_elt_type(yyvsp[0].tval); - write_exp_elt_opcode(OP_TYPE); - ; - break;} -case 6: -#line 222 "jv-exp.y" -{ - write_exp_elt_opcode (OP_STRING); - write_exp_string (yyvsp[0].sval); - write_exp_elt_opcode (OP_STRING); - ; - break;} -case 7: -#line 231 "jv-exp.y" -{ write_exp_elt_opcode (OP_LONG); - write_exp_elt_type (yyvsp[0].typed_val_int.type); - write_exp_elt_longcst ((LONGEST)(yyvsp[0].typed_val_int.val)); - write_exp_elt_opcode (OP_LONG); ; - break;} -case 8: -#line 236 "jv-exp.y" -{ YYSTYPE val; - parse_number (yyvsp[0].sval.ptr, yyvsp[0].sval.length, 0, &val); - write_exp_elt_opcode (OP_LONG); - write_exp_elt_type (val.typed_val_int.type); - write_exp_elt_longcst ((LONGEST)val.typed_val_int.val); - write_exp_elt_opcode (OP_LONG); - ; - break;} -case 9: -#line 244 "jv-exp.y" -{ write_exp_elt_opcode (OP_DOUBLE); - write_exp_elt_type (yyvsp[0].typed_val_float.type); - write_exp_elt_dblcst (yyvsp[0].typed_val_float.dval); - write_exp_elt_opcode (OP_DOUBLE); ; - break;} -case 10: -#line 249 "jv-exp.y" -{ write_exp_elt_opcode (OP_LONG); - write_exp_elt_type (java_boolean_type); - write_exp_elt_longcst ((LONGEST)yyvsp[0].lval); - write_exp_elt_opcode (OP_LONG); ; - break;} -case 13: -#line 266 "jv-exp.y" -{ yyval.tval = java_boolean_type; ; - break;} -case 16: -#line 276 "jv-exp.y" -{ yyval.tval = java_byte_type; ; - break;} -case 17: -#line 278 "jv-exp.y" -{ yyval.tval = java_short_type; ; - break;} -case 18: -#line 280 "jv-exp.y" -{ yyval.tval = java_int_type; ; - break;} -case 19: -#line 282 "jv-exp.y" -{ yyval.tval = java_long_type; ; - break;} -case 20: -#line 284 "jv-exp.y" -{ yyval.tval = java_char_type; ; - break;} -case 21: -#line 289 "jv-exp.y" -{ yyval.tval = java_float_type; ; - break;} -case 22: -#line 291 "jv-exp.y" -{ yyval.tval = java_double_type; ; - break;} -case 23: -#line 303 "jv-exp.y" -{ yyval.tval = java_type_from_name (yyvsp[0].sval); ; - break;} -case 25: -#line 312 "jv-exp.y" -{ yyval.tval = java_array_type (yyvsp[-1].tval, yyvsp[0].lval); ; - break;} -case 26: -#line 314 "jv-exp.y" -{ yyval.tval = java_array_type (java_type_from_name (yyvsp[-1].sval), yyvsp[0].lval); ; - break;} -case 33: -#line 334 "jv-exp.y" -{ yyval.sval.length = yyvsp[-2].sval.length + yyvsp[0].sval.length + 1; - if (yyvsp[-2].sval.ptr + yyvsp[-2].sval.length + 1 == yyvsp[0].sval.ptr - && yyvsp[-2].sval.ptr[yyvsp[-2].sval.length] == '.') - yyval.sval.ptr = yyvsp[-2].sval.ptr; /* Optimization. */ - else - { - yyval.sval.ptr = (char *) xmalloc (yyval.sval.length + 1); - make_cleanup (free, yyval.sval.ptr); - sprintf (yyval.sval.ptr, "%.*s.%.*s", - yyvsp[-2].sval.length, yyvsp[-2].sval.ptr, yyvsp[0].sval.length, yyvsp[0].sval.ptr); - } ; - break;} -case 35: -#line 358 "jv-exp.y" -{ write_exp_elt_opcode (BINOP_COMMA); ; - break;} -case 39: -#line 369 "jv-exp.y" -{ write_exp_elt_opcode (OP_THIS); - write_exp_elt_opcode (OP_THIS); ; - break;} -case 45: -#line 377 "jv-exp.y" -{ write_exp_elt_opcode (OP_ARRAY); - write_exp_elt_longcst ((LONGEST) 0); - write_exp_elt_longcst ((LONGEST) yyvsp[0].lval); - write_exp_elt_opcode (OP_ARRAY); ; - break;} -case 46: -#line 385 "jv-exp.y" -{ start_arglist (); ; - break;} -case 47: -#line 390 "jv-exp.y" -{ yyval.lval = end_arglist () - 1; ; - break;} -case 48: -#line 395 "jv-exp.y" -{ error ("FIXME - ClassInstanceCreationExpression"); ; - break;} -case 49: -#line 400 "jv-exp.y" -{ arglist_len = 1; ; - break;} -case 50: -#line 402 "jv-exp.y" -{ arglist_len++; ; - break;} -case 51: -#line 407 "jv-exp.y" -{ arglist_len = 0; ; - break;} -case 53: -#line 413 "jv-exp.y" -{ error ("FIXME - ArrayCreatiionExpression"); ; - break;} -case 54: -#line 415 "jv-exp.y" -{ error ("FIXME - ArrayCreatiionExpression"); ; - break;} -case 58: -#line 429 "jv-exp.y" -{ yyval.lval = 1; ; - break;} -case 59: -#line 431 "jv-exp.y" -{ yyval.lval = yyvsp[-2].lval + 1; ; - break;} -case 61: -#line 437 "jv-exp.y" -{ yyval.lval = 0; ; - break;} -case 62: -#line 442 "jv-exp.y" -{ push_fieldnames (yyvsp[0].sval); ; - break;} -case 63: -#line 444 "jv-exp.y" -{ push_fieldnames (yyvsp[0].sval); ; - break;} -case 64: -#line 450 "jv-exp.y" -{ error ("method invocation not implemented"); ; - break;} -case 65: -#line 452 "jv-exp.y" -{ error ("method invocation not implemented"); ; - break;} -case 66: -#line 454 "jv-exp.y" -{ error ("method invocation not implemented"); ; - break;} -case 67: -#line 459 "jv-exp.y" -{ - /* Emit code for the Name now, then exchange it in the - expout array with the Expression's code. We could - introduce a OP_SWAP code or a reversed version of - BINOP_SUBSCRIPT, but that makes the rest of GDB pay - for our parsing kludges. */ - struct expression *name_expr; - - push_expression_name (yyvsp[-3].sval); - name_expr = copy_exp (expout, expout_ptr); - expout_ptr -= name_expr->nelts; - insert_exp (expout_ptr-length_of_subexp (expout, expout_ptr), - name_expr); - free (name_expr); - write_exp_elt_opcode (BINOP_SUBSCRIPT); - ; - break;} -case 68: -#line 476 "jv-exp.y" -{ write_exp_elt_opcode (BINOP_SUBSCRIPT); ; - break;} -case 69: -#line 478 "jv-exp.y" -{ write_exp_elt_opcode (BINOP_SUBSCRIPT); ; - break;} -case 71: -#line 484 "jv-exp.y" -{ push_expression_name (yyvsp[0].sval); ; - break;} -case 75: -#line 493 "jv-exp.y" -{ write_exp_elt_opcode (UNOP_POSTINCREMENT); ; - break;} -case 76: -#line 498 "jv-exp.y" -{ write_exp_elt_opcode (UNOP_POSTDECREMENT); ; - break;} -case 80: -#line 506 "jv-exp.y" -{ write_exp_elt_opcode (UNOP_NEG); ; - break;} -case 81: -#line 508 "jv-exp.y" -{ write_exp_elt_opcode (UNOP_IND); ; - break;} -case 83: -#line 514 "jv-exp.y" -{ write_exp_elt_opcode (UNOP_PREINCREMENT); ; - break;} -case 84: -#line 519 "jv-exp.y" -{ write_exp_elt_opcode (UNOP_PREDECREMENT); ; - break;} -case 86: -#line 525 "jv-exp.y" -{ write_exp_elt_opcode (UNOP_COMPLEMENT); ; - break;} -case 87: -#line 527 "jv-exp.y" -{ write_exp_elt_opcode (UNOP_LOGICAL_NOT); ; - break;} -case 89: -#line 533 "jv-exp.y" -{ write_exp_elt_opcode (UNOP_CAST); - write_exp_elt_type (java_array_type (yyvsp[-3].tval, yyvsp[-2].lval)); - write_exp_elt_opcode (UNOP_CAST); ; - break;} -case 90: -#line 537 "jv-exp.y" -{ - int exp_size = expout_ptr; - int last_exp_size = length_of_subexp(expout, expout_ptr); - struct type *type; - int i; - int base = expout_ptr - last_exp_size - 3; - if (base < 0 || expout->elts[base+2].opcode != OP_TYPE) - error ("invalid cast expression"); - type = expout->elts[base+1].type; - /* Remove the 'Expression' and slide the - UnaryExpressionNotPlusMinus down to replace it. */ - for (i = 0; i < last_exp_size; i++) - expout->elts[base + i] = expout->elts[base + i + 3]; - expout_ptr -= 3; - if (TYPE_CODE (type) == TYPE_CODE_STRUCT) - type = lookup_pointer_type (type); - write_exp_elt_opcode (UNOP_CAST); - write_exp_elt_type (type); - write_exp_elt_opcode (UNOP_CAST); - ; - break;} -case 91: -#line 558 "jv-exp.y" -{ write_exp_elt_opcode (UNOP_CAST); - write_exp_elt_type (java_array_type (java_type_from_name (yyvsp[-3].sval), yyvsp[-2].lval)); - write_exp_elt_opcode (UNOP_CAST); ; - break;} -case 93: -#line 567 "jv-exp.y" -{ write_exp_elt_opcode (BINOP_MUL); ; - break;} -case 94: -#line 569 "jv-exp.y" -{ write_exp_elt_opcode (BINOP_DIV); ; - break;} -case 95: -#line 571 "jv-exp.y" -{ write_exp_elt_opcode (BINOP_REM); ; - break;} -case 97: -#line 577 "jv-exp.y" -{ write_exp_elt_opcode (BINOP_ADD); ; - break;} -case 98: -#line 579 "jv-exp.y" -{ write_exp_elt_opcode (BINOP_SUB); ; - break;} -case 100: -#line 585 "jv-exp.y" -{ write_exp_elt_opcode (BINOP_LSH); ; - break;} -case 101: -#line 587 "jv-exp.y" -{ write_exp_elt_opcode (BINOP_RSH); ; - break;} -case 103: -#line 594 "jv-exp.y" -{ write_exp_elt_opcode (BINOP_LESS); ; - break;} -case 104: -#line 596 "jv-exp.y" -{ write_exp_elt_opcode (BINOP_GTR); ; - break;} -case 105: -#line 598 "jv-exp.y" -{ write_exp_elt_opcode (BINOP_LEQ); ; - break;} -case 106: -#line 600 "jv-exp.y" -{ write_exp_elt_opcode (BINOP_GEQ); ; - break;} -case 108: -#line 607 "jv-exp.y" -{ write_exp_elt_opcode (BINOP_EQUAL); ; - break;} -case 109: -#line 609 "jv-exp.y" -{ write_exp_elt_opcode (BINOP_NOTEQUAL); ; - break;} -case 111: -#line 615 "jv-exp.y" -{ write_exp_elt_opcode (BINOP_BITWISE_AND); ; - break;} -case 113: -#line 621 "jv-exp.y" -{ write_exp_elt_opcode (BINOP_BITWISE_XOR); ; - break;} -case 115: -#line 626 "jv-exp.y" -{ write_exp_elt_opcode (BINOP_BITWISE_IOR); ; - break;} -case 117: -#line 632 "jv-exp.y" -{ write_exp_elt_opcode (BINOP_LOGICAL_AND); ; - break;} -case 119: -#line 638 "jv-exp.y" -{ write_exp_elt_opcode (BINOP_LOGICAL_OR); ; - break;} -case 121: -#line 644 "jv-exp.y" -{ write_exp_elt_opcode (TERNOP_COND); ; - break;} -case 124: -#line 654 "jv-exp.y" -{ write_exp_elt_opcode (BINOP_ASSIGN); ; - break;} -case 125: -#line 656 "jv-exp.y" -{ write_exp_elt_opcode (BINOP_ASSIGN_MODIFY); - write_exp_elt_opcode (yyvsp[-1].opcode); - write_exp_elt_opcode (BINOP_ASSIGN_MODIFY); ; - break;} -case 126: -#line 663 "jv-exp.y" -{ push_expression_name (yyvsp[0].sval); ; - break;} -} - /* the action file gets copied in in place of this dollarsign */ -#line 498 "/stone/jimb/main-98r2/share/bison.simple" - - yyvsp -= yylen; - yyssp -= yylen; -#ifdef YYLSP_NEEDED - yylsp -= yylen; -#endif - -#if YYDEBUG != 0 - if (yydebug) - { - short *ssp1 = yyss - 1; - fprintf (stderr, "state stack now"); - while (ssp1 != yyssp) - fprintf (stderr, " %d", *++ssp1); - fprintf (stderr, "\n"); - } -#endif - - *++yyvsp = yyval; - -#ifdef YYLSP_NEEDED - yylsp++; - if (yylen == 0) - { - yylsp->first_line = yylloc.first_line; - yylsp->first_column = yylloc.first_column; - yylsp->last_line = (yylsp-1)->last_line; - yylsp->last_column = (yylsp-1)->last_column; - yylsp->text = 0; - } - else - { - yylsp->last_line = (yylsp+yylen-1)->last_line; - yylsp->last_column = (yylsp+yylen-1)->last_column; - } -#endif - - /* Now "shift" the result of the reduction. - Determine what state that goes to, - based on the state we popped back to - and the rule number reduced by. */ - - yyn = yyr1[yyn]; - - yystate = yypgoto[yyn - YYNTBASE] + *yyssp; - if (yystate >= 0 && yystate <= YYLAST && yycheck[yystate] == *yyssp) - yystate = yytable[yystate]; - else - yystate = yydefgoto[yyn - YYNTBASE]; - - goto yynewstate; - -yyerrlab: /* here on detecting error */ - - if (! yyerrstatus) - /* If not already recovering from an error, report this error. */ - { - ++yynerrs; - -#ifdef YYERROR_VERBOSE - yyn = yypact[yystate]; - - if (yyn > YYFLAG && yyn < YYLAST) - { - int size = 0; - char *msg; - int x, count; - - count = 0; - /* Start X at -yyn if nec to avoid negative indexes in yycheck. */ - for (x = (yyn < 0 ? -yyn : 0); - x < (sizeof(yytname) / sizeof(char *)); x++) - if (yycheck[x + yyn] == x) - size += strlen(yytname[x]) + 15, count++; - msg = (char *) xmalloc(size + 15); - if (msg != 0) - { - strcpy(msg, "parse error"); - - if (count < 5) - { - count = 0; - for (x = (yyn < 0 ? -yyn : 0); - x < (sizeof(yytname) / sizeof(char *)); x++) - if (yycheck[x + yyn] == x) - { - strcat(msg, count == 0 ? ", expecting `" : " or `"); - strcat(msg, yytname[x]); - strcat(msg, "'"); - count++; - } - } - yyerror(msg); - free(msg); - } - else - yyerror ("parse error; also virtual memory exceeded"); - } - else -#endif /* YYERROR_VERBOSE */ - yyerror("parse error"); - } - - goto yyerrlab1; -yyerrlab1: /* here on error raised explicitly by an action */ - - if (yyerrstatus == 3) - { - /* if just tried and failed to reuse lookahead token after an error, discard it. */ - - /* return failure if at end of input */ - if (yychar == YYEOF) - YYABORT; - -#if YYDEBUG != 0 - if (yydebug) - fprintf(stderr, "Discarding token %d (%s).\n", yychar, yytname[yychar1]); -#endif - - yychar = YYEMPTY; - } - - /* Else will try to reuse lookahead token - after shifting the error token. */ - - yyerrstatus = 3; /* Each real token shifted decrements this */ - - goto yyerrhandle; - -yyerrdefault: /* current state does not do anything special for the error token. */ - -#if 0 - /* This is wrong; only states that explicitly want error tokens - should shift them. */ - yyn = yydefact[yystate]; /* If its default is to accept any token, ok. Otherwise pop it.*/ - if (yyn) goto yydefault; -#endif - -yyerrpop: /* pop the current state because it cannot handle the error token */ - - if (yyssp == yyss) YYABORT; - yyvsp--; - yystate = *--yyssp; -#ifdef YYLSP_NEEDED - yylsp--; -#endif - -#if YYDEBUG != 0 - if (yydebug) - { - short *ssp1 = yyss - 1; - fprintf (stderr, "Error: state stack now"); - while (ssp1 != yyssp) - fprintf (stderr, " %d", *++ssp1); - fprintf (stderr, "\n"); - } -#endif - -yyerrhandle: - - yyn = yypact[yystate]; - if (yyn == YYFLAG) - goto yyerrdefault; - - yyn += YYTERROR; - if (yyn < 0 || yyn > YYLAST || yycheck[yyn] != YYTERROR) - goto yyerrdefault; - - yyn = yytable[yyn]; - if (yyn < 0) - { - if (yyn == YYFLAG) - goto yyerrpop; - yyn = -yyn; - goto yyreduce; - } - else if (yyn == 0) - goto yyerrpop; - - if (yyn == YYFINAL) - YYACCEPT; - -#if YYDEBUG != 0 - if (yydebug) - fprintf(stderr, "Shifting error token, "); -#endif - - *++yyvsp = yylval; -#ifdef YYLSP_NEEDED - *++yylsp = yylloc; -#endif - - yystate = yyn; - goto yynewstate; -} -#line 675 "jv-exp.y" - -/* Take care of parsing a number (anything that starts with a digit). - Set yylval and return the token type; update lexptr. - LEN is the number of characters in it. */ - -/*** Needs some error checking for the float case ***/ - -static int -parse_number (p, len, parsed_float, putithere) - register char *p; - register int len; - int parsed_float; - YYSTYPE *putithere; -{ - register ULONGEST n = 0; - ULONGEST limit, limit_div_base; - - register int c; - register int base = input_radix; - - struct type *type; - - if (parsed_float) - { - /* It's a float since it contains a point or an exponent. */ - char c; - int num = 0; /* number of tokens scanned by scanf */ - char saved_char = p[len]; - - p[len] = 0; /* null-terminate the token */ - if (sizeof (putithere->typed_val_float.dval) <= sizeof (float)) - num = sscanf (p, "%g%c", (float *) &putithere->typed_val_float.dval, &c); - else if (sizeof (putithere->typed_val_float.dval) <= sizeof (double)) - num = sscanf (p, "%lg%c", (double *) &putithere->typed_val_float.dval, &c); - else - { -#ifdef SCANF_HAS_LONG_DOUBLE - num = sscanf (p, "%Lg%c", &putithere->typed_val_float.dval, &c); -#else - /* Scan it into a double, then assign it to the long double. - This at least wins with values representable in the range - of doubles. */ - double temp; - num = sscanf (p, "%lg%c", &temp, &c); - putithere->typed_val_float.dval = temp; -#endif - } - p[len] = saved_char; /* restore the input stream */ - if (num != 1) /* check scanf found ONLY a float ... */ - return ERROR; - /* See if it has `f' or `d' suffix (float or double). */ - - c = tolower (p[len - 1]); - - if (c == 'f' || c == 'F') - putithere->typed_val_float.type = builtin_type_float; - else if (isdigit (c) || c == '.' || c == 'd' || c == 'D') - putithere->typed_val_float.type = builtin_type_double; - else - return ERROR; - - return FLOATING_POINT_LITERAL; - } - - /* Handle base-switching prefixes 0x, 0t, 0d, 0 */ - if (p[0] == '0') - switch (p[1]) - { - case 'x': - case 'X': - if (len >= 3) - { - p += 2; - base = 16; - len -= 2; - } - break; - - case 't': - case 'T': - case 'd': - case 'D': - if (len >= 3) - { - p += 2; - base = 10; - len -= 2; - } - break; - - default: - base = 8; - break; - } - - c = p[len-1]; - limit = (ULONGEST)0xffffffff; - if (c == 'l' || c == 'L') - { - type = java_long_type; - len--; - /* A paranoid calculation of (1<<64)-1. */ - limit = ((limit << 16) << 16) | limit; - } - else - { - type = java_int_type; - } - limit_div_base = limit / (ULONGEST) base; - - while (--len >= 0) - { - c = *p++; - if (c >= '0' && c <= '9') - c -= '0'; - else if (c >= 'A' && c <= 'Z') - c -= 'A' - 10; - else if (c >= 'a' && c <= 'z') - c -= 'a' - 10; - else - return ERROR; /* Char not a digit */ - if (c >= base) - return ERROR; - if (n > limit_div_base - || (n *= base) > limit - c) - error ("Numeric constant too large."); - n += c; - } - - putithere->typed_val_int.val = n; - putithere->typed_val_int.type = type; - return INTEGER_LITERAL; -} - -struct token -{ - char *operator; - int token; - enum exp_opcode opcode; -}; - -static const struct token tokentab3[] = - { - {">>=", ASSIGN_MODIFY, BINOP_RSH}, - {"<<=", ASSIGN_MODIFY, BINOP_LSH} - }; - -static const struct token tokentab2[] = - { - {"+=", ASSIGN_MODIFY, BINOP_ADD}, - {"-=", ASSIGN_MODIFY, BINOP_SUB}, - {"*=", ASSIGN_MODIFY, BINOP_MUL}, - {"/=", ASSIGN_MODIFY, BINOP_DIV}, - {"%=", ASSIGN_MODIFY, BINOP_REM}, - {"|=", ASSIGN_MODIFY, BINOP_BITWISE_IOR}, - {"&=", ASSIGN_MODIFY, BINOP_BITWISE_AND}, - {"^=", ASSIGN_MODIFY, BINOP_BITWISE_XOR}, - {"++", INCREMENT, BINOP_END}, - {"--", DECREMENT, BINOP_END}, - {"&&", ANDAND, BINOP_END}, - {"||", OROR, BINOP_END}, - {"<<", LSH, BINOP_END}, - {">>", RSH, BINOP_END}, - {"==", EQUAL, BINOP_END}, - {"!=", NOTEQUAL, BINOP_END}, - {"<=", LEQ, BINOP_END}, - {">=", GEQ, BINOP_END} - }; - -/* Read one token, getting characters through lexptr. */ - -static int -yylex () -{ - int c; - int namelen; - unsigned int i; - char *tokstart; - char *tokptr; - int tempbufindex; - static char *tempbuf; - static int tempbufsize; - - retry: - - tokstart = lexptr; - /* See if it is a special token of length 3. */ - for (i = 0; i < sizeof tokentab3 / sizeof tokentab3[0]; i++) - if (STREQN (tokstart, tokentab3[i].operator, 3)) - { - lexptr += 3; - yylval.opcode = tokentab3[i].opcode; - return tokentab3[i].token; - } - - /* See if it is a special token of length 2. */ - for (i = 0; i < sizeof tokentab2 / sizeof tokentab2[0]; i++) - if (STREQN (tokstart, tokentab2[i].operator, 2)) - { - lexptr += 2; - yylval.opcode = tokentab2[i].opcode; - return tokentab2[i].token; - } - - switch (c = *tokstart) - { - case 0: - return 0; - - case ' ': - case '\t': - case '\n': - lexptr++; - goto retry; - - case '\'': - /* We either have a character constant ('0' or '\177' for example) - or we have a quoted symbol reference ('foo(int,int)' in C++ - for example). */ - lexptr++; - c = *lexptr++; - if (c == '\\') - c = parse_escape (&lexptr); - else if (c == '\'') - error ("Empty character constant."); - - yylval.typed_val_int.val = c; - yylval.typed_val_int.type = builtin_type_char; - - c = *lexptr++; - if (c != '\'') - { - namelen = skip_quoted (tokstart) - tokstart; - if (namelen > 2) - { - lexptr = tokstart + namelen; - if (lexptr[-1] != '\'') - error ("Unmatched single quote."); - namelen -= 2; - tokstart++; - goto tryname; - } - error ("Invalid character constant."); - } - return INTEGER_LITERAL; - - case '(': - paren_depth++; - lexptr++; - return c; - - case ')': - if (paren_depth == 0) - return 0; - paren_depth--; - lexptr++; - return c; - - case ',': - if (comma_terminates && paren_depth == 0) - return 0; - lexptr++; - return c; - - case '.': - /* Might be a floating point number. */ - if (lexptr[1] < '0' || lexptr[1] > '9') - goto symbol; /* Nope, must be a symbol. */ - /* FALL THRU into number case. */ - - case '0': - case '1': - case '2': - case '3': - case '4': - case '5': - case '6': - case '7': - case '8': - case '9': - { - /* It's a number. */ - int got_dot = 0, got_e = 0, toktype; - register char *p = tokstart; - int hex = input_radix > 10; - - if (c == '0' && (p[1] == 'x' || p[1] == 'X')) - { - p += 2; - hex = 1; - } - else if (c == '0' && (p[1]=='t' || p[1]=='T' || p[1]=='d' || p[1]=='D')) - { - p += 2; - hex = 0; - } - - for (;; ++p) - { - /* This test includes !hex because 'e' is a valid hex digit - and thus does not indicate a floating point number when - the radix is hex. */ - if (!hex && !got_e && (*p == 'e' || *p == 'E')) - got_dot = got_e = 1; - /* This test does not include !hex, because a '.' always indicates - a decimal floating point number regardless of the radix. */ - else if (!got_dot && *p == '.') - got_dot = 1; - else if (got_e && (p[-1] == 'e' || p[-1] == 'E') - && (*p == '-' || *p == '+')) - /* This is the sign of the exponent, not the end of the - number. */ - continue; - /* We will take any letters or digits. parse_number will - complain if past the radix, or if L or U are not final. */ - else if ((*p < '0' || *p > '9') - && ((*p < 'a' || *p > 'z') - && (*p < 'A' || *p > 'Z'))) - break; - } - toktype = parse_number (tokstart, p - tokstart, got_dot|got_e, &yylval); - if (toktype == ERROR) - { - char *err_copy = (char *) alloca (p - tokstart + 1); - - memcpy (err_copy, tokstart, p - tokstart); - err_copy[p - tokstart] = 0; - error ("Invalid number \"%s\".", err_copy); - } - lexptr = p; - return toktype; - } - - case '+': - case '-': - case '*': - case '/': - case '%': - case '|': - case '&': - case '^': - case '~': - case '!': - case '<': - case '>': - case '[': - case ']': - case '?': - case ':': - case '=': - case '{': - case '}': - symbol: - lexptr++; - return c; - - case '"': - - /* Build the gdb internal form of the input string in tempbuf, - translating any standard C escape forms seen. Note that the - buffer is null byte terminated *only* for the convenience of - debugging gdb itself and printing the buffer contents when - the buffer contains no embedded nulls. Gdb does not depend - upon the buffer being null byte terminated, it uses the length - string instead. This allows gdb to handle C strings (as well - as strings in other languages) with embedded null bytes */ - - tokptr = ++tokstart; - tempbufindex = 0; - - do { - /* Grow the static temp buffer if necessary, including allocating - the first one on demand. */ - if (tempbufindex + 1 >= tempbufsize) - { - tempbuf = (char *) xrealloc (tempbuf, tempbufsize += 64); - } - switch (*tokptr) - { - case '\0': - case '"': - /* Do nothing, loop will terminate. */ - break; - case '\\': - tokptr++; - c = parse_escape (&tokptr); - if (c == -1) - { - continue; - } - tempbuf[tempbufindex++] = c; - break; - default: - tempbuf[tempbufindex++] = *tokptr++; - break; - } - } while ((*tokptr != '"') && (*tokptr != '\0')); - if (*tokptr++ != '"') - { - error ("Unterminated string in expression."); - } - tempbuf[tempbufindex] = '\0'; /* See note above */ - yylval.sval.ptr = tempbuf; - yylval.sval.length = tempbufindex; - lexptr = tokptr; - return (STRING_LITERAL); - } - - if (!(c == '_' || c == '$' - || (c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z'))) - /* We must have come across a bad character (e.g. ';'). */ - error ("Invalid character '%c' in expression.", c); - - /* It's a name. See how long it is. */ - namelen = 0; - for (c = tokstart[namelen]; - (c == '_' - || c == '$' - || (c >= '0' && c <= '9') - || (c >= 'a' && c <= 'z') - || (c >= 'A' && c <= 'Z') - || c == '<'); - ) - { - if (c == '<') - { - int i = namelen; - while (tokstart[++i] && tokstart[i] != '>'); - if (tokstart[i] == '>') - namelen = i; - } - c = tokstart[++namelen]; - } - - /* The token "if" terminates the expression and is NOT - removed from the input stream. */ - if (namelen == 2 && tokstart[0] == 'i' && tokstart[1] == 'f') - { - return 0; - } - - lexptr += namelen; - - tryname: - - /* Catch specific keywords. Should be done with a data structure. */ - switch (namelen) - { - case 7: - if (STREQN (tokstart, "boolean", 7)) - return BOOLEAN; - break; - case 6: - if (STREQN (tokstart, "double", 6)) - return DOUBLE; - break; - case 5: - if (STREQN (tokstart, "short", 5)) - return SHORT; - if (STREQN (tokstart, "false", 5)) - { - yylval.lval = 0; - return BOOLEAN_LITERAL; - } - if (STREQN (tokstart, "super", 5)) - return SUPER; - if (STREQN (tokstart, "float", 5)) - return FLOAT; - break; - case 4: - if (STREQN (tokstart, "long", 4)) - return LONG; - if (STREQN (tokstart, "byte", 4)) - return BYTE; - if (STREQN (tokstart, "char", 4)) - return CHAR; - if (STREQN (tokstart, "true", 4)) - { - yylval.lval = 1; - return BOOLEAN_LITERAL; - } - if (current_language->la_language == language_cplus - && STREQN (tokstart, "this", 4)) - { - static const char this_name[] = - { CPLUS_MARKER, 't', 'h', 'i', 's', '\0' }; - - if (lookup_symbol (this_name, expression_context_block, - VAR_NAMESPACE, (int *) NULL, - (struct symtab **) NULL)) - return THIS; - } - break; - case 3: - if (STREQN (tokstart, "int", 3)) - return INT; - if (STREQN (tokstart, "new", 3)) - return NEW; - break; - default: - break; - } - - yylval.sval.ptr = tokstart; - yylval.sval.length = namelen; - - if (*tokstart == '$') - { - write_dollar_variable (yylval.sval); - return VARIABLE; - } - - /* Input names that aren't symbols but ARE valid hex numbers, - when the input radix permits them, can be names or numbers - depending on the parse. Note we support radixes > 16 here. */ - if (((tokstart[0] >= 'a' && tokstart[0] < 'a' + input_radix - 10) || - (tokstart[0] >= 'A' && tokstart[0] < 'A' + input_radix - 10))) - { - YYSTYPE newlval; /* Its value is ignored. */ - int hextype = parse_number (tokstart, namelen, 0, &newlval); - if (hextype == INTEGER_LITERAL) - return NAME_OR_INT; - } - return IDENTIFIER; -} - -void -yyerror (msg) - char *msg; -{ - error ("A %s in expression, near `%s'.", (msg ? msg : "error"), lexptr); -} - -static struct type * -java_type_from_name (name) - struct stoken name; - -{ - char *tmp = copy_name (name); - struct type *typ = java_lookup_class (tmp); - if (typ == NULL || TYPE_CODE (typ) != TYPE_CODE_STRUCT) - error ("No class named %s.", tmp); - return typ; -} - -/* If NAME is a valid variable name in this scope, push it and return 1. - Otherwise, return 0. */ - -static int -push_variable (name) - struct stoken name; - -{ - char *tmp = copy_name (name); - int is_a_field_of_this = 0; - struct symbol *sym; - sym = lookup_symbol (tmp, expression_context_block, VAR_NAMESPACE, - &is_a_field_of_this, (struct symtab **) NULL); - if (sym && SYMBOL_CLASS (sym) != LOC_TYPEDEF) - { - if (symbol_read_needs_frame (sym)) - { - if (innermost_block == 0 || - contained_in (block_found, innermost_block)) - innermost_block = block_found; - } - - write_exp_elt_opcode (OP_VAR_VALUE); - /* We want to use the selected frame, not another more inner frame - which happens to be in the same block. */ - write_exp_elt_block (NULL); - write_exp_elt_sym (sym); - write_exp_elt_opcode (OP_VAR_VALUE); - return 1; - } - if (is_a_field_of_this) - { - /* it hangs off of `this'. Must not inadvertently convert from a - method call to data ref. */ - if (innermost_block == 0 || - contained_in (block_found, innermost_block)) - innermost_block = block_found; - write_exp_elt_opcode (OP_THIS); - write_exp_elt_opcode (OP_THIS); - write_exp_elt_opcode (STRUCTOP_PTR); - write_exp_string (name); - write_exp_elt_opcode (STRUCTOP_PTR); - return 1; - } - return 0; -} - -/* Assuming a reference expression has been pushed, emit the - STRUCTOP_STRUCT ops to access the field named NAME. If NAME is a - qualified name (has '.'), generate a field access for each part. */ - -static void -push_fieldnames (name) - struct stoken name; -{ - int i; - struct stoken token; - token.ptr = name.ptr; - for (i = 0; ; i++) - { - if (i == name.length || name.ptr[i] == '.') - { - /* token.ptr is start of current field name. */ - token.length = &name.ptr[i] - token.ptr; - write_exp_elt_opcode (STRUCTOP_STRUCT); - write_exp_string (token); - write_exp_elt_opcode (STRUCTOP_STRUCT); - token.ptr += token.length + 1; - } - if (i >= name.length) - break; - } -} - -/* Helper routine for push_expression_name. - Handle a qualified name, where DOT_INDEX is the index of the first '.' */ - -static void -push_qualified_expression_name (name, dot_index) - struct stoken name; - int dot_index; -{ - struct stoken token; - char *tmp; - struct type *typ; - - token.ptr = name.ptr; - token.length = dot_index; - - if (push_variable (token)) - { - token.ptr = name.ptr + dot_index + 1; - token.length = name.length - dot_index - 1; - push_fieldnames (token); - return; - } - - token.ptr = name.ptr; - for (;;) - { - token.length = dot_index; - tmp = copy_name (token); - typ = java_lookup_class (tmp); - if (typ != NULL) - { - if (dot_index == name.length) - { - write_exp_elt_opcode(OP_TYPE); - write_exp_elt_type(typ); - write_exp_elt_opcode(OP_TYPE); - return; - } - dot_index++; /* Skip '.' */ - name.ptr += dot_index; - name.length -= dot_index; - dot_index = 0; - while (dot_index < name.length && name.ptr[dot_index] != '.') - dot_index++; - token.ptr = name.ptr; - token.length = dot_index; - write_exp_elt_opcode (OP_SCOPE); - write_exp_elt_type (typ); - write_exp_string (token); - write_exp_elt_opcode (OP_SCOPE); - if (dot_index < name.length) - { - dot_index++; - name.ptr += dot_index; - name.length -= dot_index; - push_fieldnames (name); - } - return; - } - else if (dot_index >= name.length) - break; - dot_index++; /* Skip '.' */ - while (dot_index < name.length && name.ptr[dot_index] != '.') - dot_index++; - } - error ("unknown type `%.*s'", name.length, name.ptr); -} - -/* Handle Name in an expression (or LHS). - Handle VAR, TYPE, TYPE.FIELD1....FIELDN and VAR.FIELD1....FIELDN. */ - -static void -push_expression_name (name) - struct stoken name; -{ - char *tmp; - struct type *typ; - char *ptr; - int i; - - for (i = 0; i < name.length; i++) - { - if (name.ptr[i] == '.') - { - /* It's a Qualified Expression Name. */ - push_qualified_expression_name (name, i); - return; - } - } - - /* It's a Simple Expression Name. */ - - if (push_variable (name)) - return; - tmp = copy_name (name); - typ = java_lookup_class (tmp); - if (typ != NULL) - { - write_exp_elt_opcode(OP_TYPE); - write_exp_elt_type(typ); - write_exp_elt_opcode(OP_TYPE); - } - else - { - struct minimal_symbol *msymbol; - - msymbol = lookup_minimal_symbol (tmp, NULL, NULL); - if (msymbol != NULL) - { - write_exp_msymbol (msymbol, - lookup_function_type (builtin_type_int), - builtin_type_int); - } - else if (!have_full_symbols () && !have_partial_symbols ()) - error ("No symbol table is loaded. Use the \"file\" command."); - else - error ("No symbol \"%s\" in current context.", tmp); - } - -} - - -/* The following two routines, copy_exp and insert_exp, aren't specific to - Java, so they could go in parse.c, but their only purpose is to support - the parsing kludges we use in this file, so maybe it's best to isolate - them here. */ - -/* Copy the expression whose last element is at index ENDPOS - 1 in EXPR - into a freshly xmalloc'ed struct expression. Its language_defn is set - to null. */ -static struct expression * -copy_exp (expr, endpos) - struct expression *expr; - int endpos; -{ - int len = length_of_subexp (expr, endpos); - struct expression *new - = (struct expression *) xmalloc (sizeof (*new) + EXP_ELEM_TO_BYTES (len)); - new->nelts = len; - memcpy (new->elts, expr->elts + endpos - len, EXP_ELEM_TO_BYTES (len)); - new->language_defn = 0; - - return new; -} - -/* Insert the expression NEW into the current expression (expout) at POS. */ -static void -insert_exp (pos, new) - int pos; - struct expression *new; -{ - int newlen = new->nelts; - - /* Grow expout if necessary. In this function's only use at present, - this should never be necessary. */ - if (expout_ptr + newlen > expout_size) - { - expout_size = max (expout_size * 2, expout_ptr + newlen + 10); - expout = (struct expression *) - xrealloc ((char *) expout, (sizeof (struct expression) - + EXP_ELEM_TO_BYTES (expout_size))); - } - - { - int i; - - for (i = expout_ptr - 1; i >= pos; i--) - expout->elts[i + newlen] = expout->elts[i]; - } - - memcpy (expout->elts + pos, new->elts, EXP_ELEM_TO_BYTES (newlen)); - expout_ptr += newlen; -} diff --git a/contrib/gdb/gdb/kdb-start.c b/contrib/gdb/gdb/kdb-start.c deleted file mode 100644 index 7a4acb712089f..0000000000000 --- a/contrib/gdb/gdb/kdb-start.c +++ /dev/null @@ -1,38 +0,0 @@ -/* Main loop for the standalone kernel debugger, for GDB, the GNU Debugger. - Copyright 1989, 1991, 1992 Free Software Foundation, Inc. - - This file is part of GDB. - - 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 2 of the License, 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., 59 Temple Place - Suite 330, - Boston, MA 02111-1307, USA. */ - -#include "defs.h" - -static char *args[] = -{"kdb", "kdb-symbols", 0}; - -static char *environment[] = -{0}; - -char **environ; - -start () -{ - INIT_STACK (kdb_stack_beg, kdb_stack_end); - - environ = environment; - - main (2, args, environment); -} diff --git a/contrib/gdb/gdb/m2-exp.tab.c b/contrib/gdb/gdb/m2-exp.tab.c deleted file mode 100644 index eefdf807ef7cd..0000000000000 --- a/contrib/gdb/gdb/m2-exp.tab.c +++ /dev/null @@ -1,2162 +0,0 @@ - -/* A Bison parser, made from m2-exp.y - by GNU Bison version 1.27 - */ - -#define YYBISON 1 /* Identify Bison output. */ - -#define INT 257 -#define HEX 258 -#define ERROR 259 -#define UINT 260 -#define M2_TRUE 261 -#define M2_FALSE 262 -#define CHAR 263 -#define FLOAT 264 -#define STRING 265 -#define NAME 266 -#define BLOCKNAME 267 -#define IDENT 268 -#define VARNAME 269 -#define TYPENAME 270 -#define SIZE 271 -#define CAP 272 -#define ORD 273 -#define HIGH 274 -#define ABS 275 -#define MIN_FUNC 276 -#define MAX_FUNC 277 -#define FLOAT_FUNC 278 -#define VAL 279 -#define CHR 280 -#define ODD 281 -#define TRUNC 282 -#define INC 283 -#define DEC 284 -#define INCL 285 -#define EXCL 286 -#define COLONCOLON 287 -#define INTERNAL_VAR 288 -#define ABOVE_COMMA 289 -#define ASSIGN 290 -#define LEQ 291 -#define GEQ 292 -#define NOTEQUAL 293 -#define IN 294 -#define OROR 295 -#define LOGICAL_AND 296 -#define DIV 297 -#define MOD 298 -#define UNARY 299 -#define DOT 300 -#define NOT 301 -#define QID 302 - -#line 40 "m2-exp.y" - - -#include "defs.h" -#include "gdb_string.h" -#include "expression.h" -#include "language.h" -#include "value.h" -#include "parser-defs.h" -#include "m2-lang.h" -#include "bfd.h" /* Required by objfiles.h. */ -#include "symfile.h" /* Required by objfiles.h. */ -#include "objfiles.h" /* For have_full_symbols and have_partial_symbols */ - -/* Remap normal yacc parser interface names (yyparse, yylex, yyerror, etc), - as well as gratuitiously global symbol names, so we can have multiple - yacc generated parsers in gdb. Note that these are only the variables - produced by yacc. If other parser generators (bison, byacc, etc) produce - additional global names that conflict at link time, then those parser - generators need to be fixed instead of adding those names to this list. */ - -#define yymaxdepth m2_maxdepth -#define yyparse m2_parse -#define yylex m2_lex -#define yyerror m2_error -#define yylval m2_lval -#define yychar m2_char -#define yydebug m2_debug -#define yypact m2_pact -#define yyr1 m2_r1 -#define yyr2 m2_r2 -#define yydef m2_def -#define yychk m2_chk -#define yypgo m2_pgo -#define yyact m2_act -#define yyexca m2_exca -#define yyerrflag m2_errflag -#define yynerrs m2_nerrs -#define yyps m2_ps -#define yypv m2_pv -#define yys m2_s -#define yy_yys m2_yys -#define yystate m2_state -#define yytmp m2_tmp -#define yyv m2_v -#define yy_yyv m2_yyv -#define yyval m2_val -#define yylloc m2_lloc -#define yyreds m2_reds /* With YYDEBUG defined */ -#define yytoks m2_toks /* With YYDEBUG defined */ -#define yylhs m2_yylhs -#define yylen m2_yylen -#define yydefred m2_yydefred -#define yydgoto m2_yydgoto -#define yysindex m2_yysindex -#define yyrindex m2_yyrindex -#define yygindex m2_yygindex -#define yytable m2_yytable -#define yycheck m2_yycheck - -#ifndef YYDEBUG -#define YYDEBUG 0 /* Default to no yydebug support */ -#endif - -int -yyparse PARAMS ((void)); - -static int -yylex PARAMS ((void)); - -void -yyerror PARAMS ((char *)); - -#if 0 -static char * -make_qualname PARAMS ((char *, char *)); -#endif - -static int -parse_number PARAMS ((int)); - -/* The sign of the number being parsed. */ -static int number_sign = 1; - -/* The block that the module specified by the qualifer on an identifer is - contained in, */ -#if 0 -static struct block *modblock=0; -#endif - - -#line 135 "m2-exp.y" -typedef union - { - LONGEST lval; - ULONGEST ulval; - DOUBLEST dval; - struct symbol *sym; - struct type *tval; - struct stoken sval; - int voidval; - struct block *bval; - enum exp_opcode opcode; - struct internalvar *ivar; - - struct type **tvec; - int *ivec; - } YYSTYPE; -#include <stdio.h> - -#ifndef __cplusplus -#ifndef __STDC__ -#define const -#endif -#endif - - - -#define YYFINAL 181 -#define YYFLAG -32768 -#define YYNTBASE 68 - -#define YYTRANSLATE(x) ((unsigned)(x) <= 302 ? yytranslate[x] : 82) - -static const char yytranslate[] = { 0, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 44, 2, 2, 48, 2, 60, - 64, 52, 50, 35, 51, 2, 53, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 38, - 42, 39, 2, 49, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 59, 2, 67, 57, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 65, 2, 66, 62, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 1, 3, 4, 5, 6, - 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, - 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, - 27, 28, 29, 30, 31, 32, 33, 34, 36, 37, - 40, 41, 43, 45, 46, 47, 54, 55, 56, 58, - 61, 63 -}; - -#if YYDEBUG != 0 -static const short yyprhs[] = { 0, - 0, 2, 4, 6, 9, 10, 14, 17, 20, 22, - 24, 29, 34, 39, 44, 49, 54, 59, 66, 71, - 76, 81, 84, 89, 96, 101, 108, 112, 114, 118, - 125, 132, 136, 141, 142, 148, 149, 155, 156, 158, - 162, 164, 168, 173, 178, 182, 186, 190, 194, 198, - 202, 206, 210, 214, 218, 222, 226, 230, 234, 238, - 242, 246, 250, 252, 254, 256, 258, 260, 262, 264, - 269, 271, 273, 275, 279, 281, 283, 287, 289 -}; - -static const short yyrhs[] = { 70, - 0, 69, 0, 81, 0, 70, 57, 0, 0, 51, - 71, 70, 0, 50, 70, 0, 72, 70, 0, 61, - 0, 62, 0, 18, 60, 70, 64, 0, 19, 60, - 70, 64, 0, 21, 60, 70, 64, 0, 20, 60, - 70, 64, 0, 22, 60, 81, 64, 0, 23, 60, - 81, 64, 0, 24, 60, 70, 64, 0, 25, 60, - 81, 35, 70, 64, 0, 26, 60, 70, 64, 0, - 27, 60, 70, 64, 0, 28, 60, 70, 64, 0, - 17, 70, 0, 29, 60, 70, 64, 0, 29, 60, - 70, 35, 70, 64, 0, 30, 60, 70, 64, 0, - 30, 60, 70, 35, 70, 64, 0, 70, 58, 12, - 0, 73, 0, 70, 45, 73, 0, 31, 60, 70, - 35, 70, 64, 0, 32, 60, 70, 35, 70, 64, - 0, 65, 76, 66, 0, 81, 65, 76, 66, 0, - 0, 70, 59, 74, 77, 67, 0, 0, 70, 60, - 75, 76, 64, 0, 0, 70, 0, 76, 35, 70, - 0, 70, 0, 77, 35, 70, 0, 65, 81, 66, - 70, 0, 81, 60, 70, 64, 0, 60, 70, 64, - 0, 70, 49, 70, 0, 70, 52, 70, 0, 70, - 53, 70, 0, 70, 54, 70, 0, 70, 55, 70, - 0, 70, 50, 70, 0, 70, 51, 70, 0, 70, - 42, 70, 0, 70, 43, 70, 0, 70, 44, 70, - 0, 70, 40, 70, 0, 70, 41, 70, 0, 70, - 38, 70, 0, 70, 39, 70, 0, 70, 47, 70, - 0, 70, 46, 70, 0, 70, 37, 70, 0, 7, - 0, 8, 0, 3, 0, 6, 0, 9, 0, 10, - 0, 80, 0, 17, 60, 81, 64, 0, 11, 0, - 79, 0, 13, 0, 78, 33, 13, 0, 79, 0, - 34, 0, 78, 33, 12, 0, 12, 0, 16, 0 -}; - -#endif - -#if YYDEBUG != 0 -static const short yyrline[] = { 0, - 204, 205, 208, 217, 220, 222, 227, 231, 235, 236, - 239, 243, 247, 251, 255, 261, 267, 271, 277, 281, - 285, 289, 294, 298, 304, 308, 314, 320, 323, 327, - 331, 334, 336, 342, 347, 353, 357, 363, 366, 370, - 375, 380, 385, 391, 397, 405, 409, 413, 417, 421, - 425, 429, 433, 437, 439, 443, 447, 451, 455, 459, - 463, 467, 474, 480, 486, 493, 502, 510, 517, 520, - 527, 534, 538, 547, 559, 567, 571, 587, 638 -}; -#endif - - -#if YYDEBUG != 0 || defined (YYERROR_VERBOSE) - -static const char * const yytname[] = { "$","error","$undefined.","INT","HEX", -"ERROR","UINT","M2_TRUE","M2_FALSE","CHAR","FLOAT","STRING","NAME","BLOCKNAME", -"IDENT","VARNAME","TYPENAME","SIZE","CAP","ORD","HIGH","ABS","MIN_FUNC","MAX_FUNC", -"FLOAT_FUNC","VAL","CHR","ODD","TRUNC","INC","DEC","INCL","EXCL","COLONCOLON", -"INTERNAL_VAR","','","ABOVE_COMMA","ASSIGN","'<'","'>'","LEQ","GEQ","'='","NOTEQUAL", -"'#'","IN","OROR","LOGICAL_AND","'&'","'@'","'+'","'-'","'*'","'/'","DIV","MOD", -"UNARY","'^'","DOT","'['","'('","NOT","'~'","QID","')'","'{'","'}'","']'","start", -"type_exp","exp","@1","not_exp","set","@2","@3","arglist","non_empty_arglist", -"block","fblock","variable","type", NULL -}; -#endif - -static const short yyr1[] = { 0, - 68, 68, 69, 70, 71, 70, 70, 70, 72, 72, - 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, - 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, - 70, 73, 73, 74, 70, 75, 70, 76, 76, 76, - 77, 77, 70, 70, 70, 70, 70, 70, 70, 70, - 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, - 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, - 70, 78, 79, 79, 80, 80, 80, 80, 81 -}; - -static const short yyr2[] = { 0, - 1, 1, 1, 2, 0, 3, 2, 2, 1, 1, - 4, 4, 4, 4, 4, 4, 4, 6, 4, 4, - 4, 2, 4, 6, 4, 6, 3, 1, 3, 6, - 6, 3, 4, 0, 5, 0, 5, 0, 1, 3, - 1, 3, 4, 4, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 1, 1, 1, 1, 1, 1, 1, 4, - 1, 1, 1, 3, 1, 1, 3, 1, 1 -}; - -static const short yydefact[] = { 0, - 65, 66, 63, 64, 67, 68, 71, 78, 73, 79, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 76, 0, 5, 0, - 9, 10, 38, 2, 1, 0, 28, 0, 75, 69, - 3, 0, 22, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, - 0, 0, 39, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 4, 0, 34, 36, 8, 0, 0, - 38, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 6, 45, 0, - 32, 0, 62, 58, 59, 56, 57, 53, 54, 55, - 38, 29, 0, 61, 60, 46, 51, 52, 47, 48, - 49, 50, 27, 0, 38, 77, 74, 0, 0, 70, - 11, 12, 14, 13, 15, 16, 17, 0, 19, 20, - 21, 0, 23, 0, 25, 0, 0, 40, 43, 41, - 0, 0, 44, 33, 0, 0, 0, 0, 0, 0, - 35, 37, 18, 24, 26, 30, 31, 42, 0, 0, - 0 -}; - -static const short yydefgoto[] = { 179, - 34, 63, 61, 36, 37, 134, 135, 64, 161, 38, - 39, 40, 44 -}; - -static const short yypact[] = { 155, --32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768, - 215, -27, -22, -20, -19, 14, 24, 26, 27, 28, - 29, 31, 32, 33, 35, 36,-32768, 155,-32768, 155, --32768,-32768, 155,-32768, 742, 155,-32768, -6, -4,-32768, - -34, 155, 5, -34, 155, 155, 155, 155, 44, 44, - 155, 44, 155, 155, 155, 155, 155, 155, 155, 5, - 155, 272, 742, -31, -41, 155, 155, 155, 155, 155, - 155, 155, 155, -15, 155, 155, 155, 155, 155, 155, - 155, 155, 155,-32768, 85,-32768,-32768, 5, -5, 155, - 155, -21, 300, 328, 356, 384, 34, 39, 412, 64, - 440, 468, 496, 78, 244, 692, 718, 5,-32768, 155, --32768, 155, 766, -37, -37, -37, -37, -37, -37, -37, - 155,-32768, 40, 141, 201, 777, 786, 786, 5, 5, - 5, 5,-32768, 155, 155,-32768,-32768, 524, -29,-32768, --32768,-32768,-32768,-32768,-32768,-32768,-32768, 155,-32768,-32768, --32768, 155,-32768, 155,-32768, 155, 155, 742, 5, 742, - -33, -32,-32768,-32768, 552, 580, 608, 636, 664, 155, --32768,-32768,-32768,-32768,-32768,-32768,-32768, 742, 100, 106, --32768 -}; - -static const short yypgoto[] = {-32768, --32768, 0,-32768,-32768, 37,-32768,-32768, -86,-32768,-32768, --32768,-32768, 52 -}; - - -#define YYLAST 846 - - -static const short yytable[] = { 35, - 10, 170, 110, 110, 139, 110, 136, 137, 75, 76, - 43, 77, 78, 79, 80, 81, 82, 83, 90, 84, - 85, 86, 87, 91, 112, 90, 89, 60, -72, 62, - 91, 172, 45, 171, 111, 88, 164, 46, 90, 47, - 48, 62, 140, 91, 93, 94, 95, 96, 162, 121, - 99, 41, 101, 102, 103, 104, 105, 106, 107, 10, - 108, 84, 85, 86, 87, 113, 114, 115, 116, 117, - 118, 119, 120, 49, 124, 125, 126, 127, 128, 129, - 130, 131, 132, 50, 65, 51, 52, 53, 54, 138, - 55, 56, 57, 92, 58, 59, 133, 145, 148, 180, - 97, 98, 146, 100, 91, 181, 0, 0, 0, 158, - 122, 159, 152, 0, 66, 67, 68, 69, 70, 71, - 72, 73, 74, 75, 76, 123, 77, 78, 79, 80, - 81, 82, 83, 160, 84, 85, 86, 87, 0, 0, - 0, 153, 0, 0, 0, 0, 0, 165, 0, 0, - 0, 166, 0, 167, 0, 168, 169, 1, 0, 0, - 2, 3, 4, 5, 6, 7, 8, 9, 0, 178, - 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, - 20, 21, 22, 23, 24, 25, 26, 76, 27, 77, - 78, 79, 80, 81, 82, 83, 0, 84, 85, 86, - 87, 0, 0, 0, 28, 29, 0, 0, 0, 0, - 0, 0, 0, 0, 30, 31, 32, 1, 0, 33, - 2, 3, 4, 5, 6, 7, 8, 9, 0, 0, - 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, - 20, 21, 22, 23, 24, 25, 26, 0, 27, 77, - 78, 79, 80, 81, 82, 83, 0, 84, 85, 86, - 87, 0, 0, 0, 28, 29, 0, 0, 0, 0, - 0, 0, 0, 0, 42, 31, 32, 0, 154, 33, - 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, - 76, 0, 77, 78, 79, 80, 81, 82, 83, 0, - 84, 85, 86, 87, 0, 0, 0, 155, 66, 67, - 68, 69, 70, 71, 72, 73, 74, 75, 76, 0, - 77, 78, 79, 80, 81, 82, 83, 0, 84, 85, - 86, 87, 0, 0, 0, 109, 66, 67, 68, 69, - 70, 71, 72, 73, 74, 75, 76, 0, 77, 78, - 79, 80, 81, 82, 83, 0, 84, 85, 86, 87, - 0, 0, 0, 141, 66, 67, 68, 69, 70, 71, - 72, 73, 74, 75, 76, 0, 77, 78, 79, 80, - 81, 82, 83, 0, 84, 85, 86, 87, 0, 0, - 0, 142, 66, 67, 68, 69, 70, 71, 72, 73, - 74, 75, 76, 0, 77, 78, 79, 80, 81, 82, - 83, 0, 84, 85, 86, 87, 0, 0, 0, 143, - 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, - 76, 0, 77, 78, 79, 80, 81, 82, 83, 0, - 84, 85, 86, 87, 0, 0, 0, 144, 66, 67, - 68, 69, 70, 71, 72, 73, 74, 75, 76, 0, - 77, 78, 79, 80, 81, 82, 83, 0, 84, 85, - 86, 87, 0, 0, 0, 147, 66, 67, 68, 69, - 70, 71, 72, 73, 74, 75, 76, 0, 77, 78, - 79, 80, 81, 82, 83, 0, 84, 85, 86, 87, - 0, 0, 0, 149, 66, 67, 68, 69, 70, 71, - 72, 73, 74, 75, 76, 0, 77, 78, 79, 80, - 81, 82, 83, 0, 84, 85, 86, 87, 0, 0, - 0, 150, 66, 67, 68, 69, 70, 71, 72, 73, - 74, 75, 76, 0, 77, 78, 79, 80, 81, 82, - 83, 0, 84, 85, 86, 87, 0, 0, 0, 151, - 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, - 76, 0, 77, 78, 79, 80, 81, 82, 83, 0, - 84, 85, 86, 87, 0, 0, 0, 163, 66, 67, - 68, 69, 70, 71, 72, 73, 74, 75, 76, 0, - 77, 78, 79, 80, 81, 82, 83, 0, 84, 85, - 86, 87, 0, 0, 0, 173, 66, 67, 68, 69, - 70, 71, 72, 73, 74, 75, 76, 0, 77, 78, - 79, 80, 81, 82, 83, 0, 84, 85, 86, 87, - 0, 0, 0, 174, 66, 67, 68, 69, 70, 71, - 72, 73, 74, 75, 76, 0, 77, 78, 79, 80, - 81, 82, 83, 0, 84, 85, 86, 87, 0, 0, - 0, 175, 66, 67, 68, 69, 70, 71, 72, 73, - 74, 75, 76, 0, 77, 78, 79, 80, 81, 82, - 83, 0, 84, 85, 86, 87, 0, 0, 0, 176, - 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, - 76, 0, 77, 78, 79, 80, 81, 82, 83, 0, - 84, 85, 86, 87, 0, 0, 156, 177, 66, 67, - 68, 69, 70, 71, 72, 73, 74, 75, 76, 0, - 77, 78, 79, 80, 81, 82, 83, 0, 84, 85, - 86, 87, 157, 0, 66, 67, 68, 69, 70, 71, - 72, 73, 74, 75, 76, 0, 77, 78, 79, 80, - 81, 82, 83, 0, 84, 85, 86, 87, 66, 67, - 68, 69, 70, 71, 72, 73, 74, 75, 76, 0, - 77, 78, 79, 80, 81, 82, 83, 0, 84, 85, - 86, 87,-32768, 67, 68, 69, 70, 71, 72, 73, - 74, 75, 76, 0, 77, 78, 79, 80, 81, 82, - 83, 0, 84, 85, 86, 87, 78, 79, 80, 81, - 82, 83, 0, 84, 85, 86, 87, 80, 81, 82, - 83, 0, 84, 85, 86, 87 -}; - -static const short yycheck[] = { 0, - 16, 35, 35, 35, 91, 35, 12, 13, 46, 47, - 11, 49, 50, 51, 52, 53, 54, 55, 60, 57, - 58, 59, 60, 65, 66, 60, 33, 28, 33, 30, - 65, 64, 60, 67, 66, 36, 66, 60, 60, 60, - 60, 42, 64, 65, 45, 46, 47, 48, 135, 65, - 51, 0, 53, 54, 55, 56, 57, 58, 59, 16, - 61, 57, 58, 59, 60, 66, 67, 68, 69, 70, - 71, 72, 73, 60, 75, 76, 77, 78, 79, 80, - 81, 82, 83, 60, 33, 60, 60, 60, 60, 90, - 60, 60, 60, 42, 60, 60, 12, 64, 35, 0, - 49, 50, 64, 52, 65, 0, -1, -1, -1, 110, - 74, 112, 35, -1, 37, 38, 39, 40, 41, 42, - 43, 44, 45, 46, 47, 74, 49, 50, 51, 52, - 53, 54, 55, 134, 57, 58, 59, 60, -1, -1, - -1, 64, -1, -1, -1, -1, -1, 148, -1, -1, - -1, 152, -1, 154, -1, 156, 157, 3, -1, -1, - 6, 7, 8, 9, 10, 11, 12, 13, -1, 170, - 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, - 26, 27, 28, 29, 30, 31, 32, 47, 34, 49, - 50, 51, 52, 53, 54, 55, -1, 57, 58, 59, - 60, -1, -1, -1, 50, 51, -1, -1, -1, -1, - -1, -1, -1, -1, 60, 61, 62, 3, -1, 65, - 6, 7, 8, 9, 10, 11, 12, 13, -1, -1, - 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, - 26, 27, 28, 29, 30, 31, 32, -1, 34, 49, - 50, 51, 52, 53, 54, 55, -1, 57, 58, 59, - 60, -1, -1, -1, 50, 51, -1, -1, -1, -1, - -1, -1, -1, -1, 60, 61, 62, -1, 35, 65, - 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, - 47, -1, 49, 50, 51, 52, 53, 54, 55, -1, - 57, 58, 59, 60, -1, -1, -1, 64, 37, 38, - 39, 40, 41, 42, 43, 44, 45, 46, 47, -1, - 49, 50, 51, 52, 53, 54, 55, -1, 57, 58, - 59, 60, -1, -1, -1, 64, 37, 38, 39, 40, - 41, 42, 43, 44, 45, 46, 47, -1, 49, 50, - 51, 52, 53, 54, 55, -1, 57, 58, 59, 60, - -1, -1, -1, 64, 37, 38, 39, 40, 41, 42, - 43, 44, 45, 46, 47, -1, 49, 50, 51, 52, - 53, 54, 55, -1, 57, 58, 59, 60, -1, -1, - -1, 64, 37, 38, 39, 40, 41, 42, 43, 44, - 45, 46, 47, -1, 49, 50, 51, 52, 53, 54, - 55, -1, 57, 58, 59, 60, -1, -1, -1, 64, - 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, - 47, -1, 49, 50, 51, 52, 53, 54, 55, -1, - 57, 58, 59, 60, -1, -1, -1, 64, 37, 38, - 39, 40, 41, 42, 43, 44, 45, 46, 47, -1, - 49, 50, 51, 52, 53, 54, 55, -1, 57, 58, - 59, 60, -1, -1, -1, 64, 37, 38, 39, 40, - 41, 42, 43, 44, 45, 46, 47, -1, 49, 50, - 51, 52, 53, 54, 55, -1, 57, 58, 59, 60, - -1, -1, -1, 64, 37, 38, 39, 40, 41, 42, - 43, 44, 45, 46, 47, -1, 49, 50, 51, 52, - 53, 54, 55, -1, 57, 58, 59, 60, -1, -1, - -1, 64, 37, 38, 39, 40, 41, 42, 43, 44, - 45, 46, 47, -1, 49, 50, 51, 52, 53, 54, - 55, -1, 57, 58, 59, 60, -1, -1, -1, 64, - 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, - 47, -1, 49, 50, 51, 52, 53, 54, 55, -1, - 57, 58, 59, 60, -1, -1, -1, 64, 37, 38, - 39, 40, 41, 42, 43, 44, 45, 46, 47, -1, - 49, 50, 51, 52, 53, 54, 55, -1, 57, 58, - 59, 60, -1, -1, -1, 64, 37, 38, 39, 40, - 41, 42, 43, 44, 45, 46, 47, -1, 49, 50, - 51, 52, 53, 54, 55, -1, 57, 58, 59, 60, - -1, -1, -1, 64, 37, 38, 39, 40, 41, 42, - 43, 44, 45, 46, 47, -1, 49, 50, 51, 52, - 53, 54, 55, -1, 57, 58, 59, 60, -1, -1, - -1, 64, 37, 38, 39, 40, 41, 42, 43, 44, - 45, 46, 47, -1, 49, 50, 51, 52, 53, 54, - 55, -1, 57, 58, 59, 60, -1, -1, -1, 64, - 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, - 47, -1, 49, 50, 51, 52, 53, 54, 55, -1, - 57, 58, 59, 60, -1, -1, 35, 64, 37, 38, - 39, 40, 41, 42, 43, 44, 45, 46, 47, -1, - 49, 50, 51, 52, 53, 54, 55, -1, 57, 58, - 59, 60, 35, -1, 37, 38, 39, 40, 41, 42, - 43, 44, 45, 46, 47, -1, 49, 50, 51, 52, - 53, 54, 55, -1, 57, 58, 59, 60, 37, 38, - 39, 40, 41, 42, 43, 44, 45, 46, 47, -1, - 49, 50, 51, 52, 53, 54, 55, -1, 57, 58, - 59, 60, 37, 38, 39, 40, 41, 42, 43, 44, - 45, 46, 47, -1, 49, 50, 51, 52, 53, 54, - 55, -1, 57, 58, 59, 60, 50, 51, 52, 53, - 54, 55, -1, 57, 58, 59, 60, 52, 53, 54, - 55, -1, 57, 58, 59, 60 -}; -/* -*-C-*- Note some compilers choke on comments on `#line' lines. */ -#line 3 "/usr/lib/bison.simple" -/* This file comes from bison-1.27. */ - -/* Skeleton output parser for bison, - Copyright (C) 1984, 1989, 1990 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 2, 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., 59 Temple Place - Suite 330, - Boston, MA 02111-1307, USA. */ - -/* As a special exception, when this file is copied by Bison into a - Bison output file, you may use that output file without restriction. - This special exception was added by the Free Software Foundation - in version 1.24 of Bison. */ - -/* This is the parser code that is written into each bison parser - when the %semantic_parser declaration is not specified in the grammar. - It was written by Richard Stallman by simplifying the hairy parser - used when %semantic_parser is specified. */ - -#ifndef YYSTACK_USE_ALLOCA -#ifdef alloca -#define YYSTACK_USE_ALLOCA -#else /* alloca not defined */ -#ifdef __GNUC__ -#define YYSTACK_USE_ALLOCA -#define alloca __builtin_alloca -#else /* not GNU C. */ -#if (!defined (__STDC__) && defined (sparc)) || defined (__sparc__) || defined (__sparc) || defined (__sgi) || (defined (__sun) && defined (__i386)) -#define YYSTACK_USE_ALLOCA -#include <alloca.h> -#else /* not sparc */ -/* We think this test detects Watcom and Microsoft C. */ -/* This used to test MSDOS, but that is a bad idea - since that symbol is in the user namespace. */ -#if (defined (_MSDOS) || defined (_MSDOS_)) && !defined (__TURBOC__) -#if 0 /* No need for xmalloc.h, which pollutes the namespace; - instead, just don't use alloca. */ -#endif -#else /* not MSDOS, or __TURBOC__ */ -#if defined(_AIX) -/* I don't know what this was needed for, but it pollutes the namespace. - So I turned it off. rms, 2 May 1997. */ - #pragma alloca -#define YYSTACK_USE_ALLOCA -#else /* not MSDOS, or __TURBOC__, or _AIX */ -#if 0 -#ifdef __hpux /* haible@ilog.fr says this works for HPUX 9.05 and up, - and on HPUX 10. Eventually we can turn this on. */ -#define YYSTACK_USE_ALLOCA -#define alloca __builtin_alloca -#endif /* __hpux */ -#endif -#endif /* not _AIX */ -#endif /* not MSDOS, or __TURBOC__ */ -#endif /* not sparc */ -#endif /* not GNU C */ -#endif /* alloca not defined */ -#endif /* YYSTACK_USE_ALLOCA not defined */ - -#ifdef YYSTACK_USE_ALLOCA -#define YYSTACK_ALLOC alloca -#else -#define YYSTACK_ALLOC xmalloc -#endif - -/* Note: there must be only one dollar sign in this file. - It is replaced by the list of actions, each action - as one case of the switch. */ - -#define yyerrok (yyerrstatus = 0) -#define yyclearin (yychar = YYEMPTY) -#define YYEMPTY -2 -#define YYEOF 0 -#define YYACCEPT goto yyacceptlab -#define YYABORT goto yyabortlab -#define YYERROR goto yyerrlab1 -/* Like YYERROR except do call yyerror. - This remains here temporarily to ease the - transition to the new meaning of YYERROR, for GCC. - Once GCC version 2 has supplanted version 1, this can go. */ -#define YYFAIL goto yyerrlab -#define YYRECOVERING() (!!yyerrstatus) -#define YYBACKUP(token, value) \ -do \ - if (yychar == YYEMPTY && yylen == 1) \ - { yychar = (token), yylval = (value); \ - yychar1 = YYTRANSLATE (yychar); \ - YYPOPSTACK; \ - goto yybackup; \ - } \ - else \ - { yyerror ("syntax error: cannot back up"); YYERROR; } \ -while (0) - -#define YYTERROR 1 -#define YYERRCODE 256 - -#ifndef YYPURE -#define YYLEX yylex() -#endif - -#ifdef YYPURE -#ifdef YYLSP_NEEDED -#ifdef YYLEX_PARAM -#define YYLEX yylex(&yylval, &yylloc, YYLEX_PARAM) -#else -#define YYLEX yylex(&yylval, &yylloc) -#endif -#else /* not YYLSP_NEEDED */ -#ifdef YYLEX_PARAM -#define YYLEX yylex(&yylval, YYLEX_PARAM) -#else -#define YYLEX yylex(&yylval) -#endif -#endif /* not YYLSP_NEEDED */ -#endif - -/* If nonreentrant, generate the variables here */ - -#ifndef YYPURE - -int yychar; /* the lookahead symbol */ -YYSTYPE yylval; /* the semantic value of the */ - /* lookahead symbol */ - -#ifdef YYLSP_NEEDED -YYLTYPE yylloc; /* location data for the lookahead */ - /* symbol */ -#endif - -int yynerrs; /* number of parse errors so far */ -#endif /* not YYPURE */ - -#if YYDEBUG != 0 -int yydebug; /* nonzero means print parse trace */ -/* Since this is uninitialized, it does not stop multiple parsers - from coexisting. */ -#endif - -/* YYINITDEPTH indicates the initial size of the parser's stacks */ - -#ifndef YYINITDEPTH -#define YYINITDEPTH 200 -#endif - -/* YYMAXDEPTH is the maximum size the stacks can grow to - (effective only if the built-in stack extension method is used). */ - -#if YYMAXDEPTH == 0 -#undef YYMAXDEPTH -#endif - -#ifndef YYMAXDEPTH -#define YYMAXDEPTH 10000 -#endif - -/* Define __yy_memcpy. Note that the size argument - should be passed with type unsigned int, because that is what the non-GCC - definitions require. With GCC, __builtin_memcpy takes an arg - of type size_t, but it can handle unsigned int. */ - -#if __GNUC__ > 1 /* GNU C and GNU C++ define this. */ -#define __yy_memcpy(TO,FROM,COUNT) __builtin_memcpy(TO,FROM,COUNT) -#else /* not GNU C or C++ */ -#ifndef __cplusplus - -/* This is the most reliable way to avoid incompatibilities - in available built-in functions on various systems. */ -static void -__yy_memcpy (to, from, count) - char *to; - char *from; - unsigned int count; -{ - register char *f = from; - register char *t = to; - register int i = count; - - while (i-- > 0) - *t++ = *f++; -} - -#else /* __cplusplus */ - -/* This is the most reliable way to avoid incompatibilities - in available built-in functions on various systems. */ -static void -__yy_memcpy (char *to, char *from, unsigned int count) -{ - register char *t = to; - register char *f = from; - register int i = count; - - while (i-- > 0) - *t++ = *f++; -} - -#endif -#endif - -#line 216 "/usr/lib/bison.simple" - -/* The user can define YYPARSE_PARAM as the name of an argument to be passed - into yyparse. The argument should have type void *. - It should actually point to an object. - Grammar actions can access the variable by casting it - to the proper pointer type. */ - -#ifdef YYPARSE_PARAM -#ifdef __cplusplus -#define YYPARSE_PARAM_ARG void *YYPARSE_PARAM -#define YYPARSE_PARAM_DECL -#else /* not __cplusplus */ -#define YYPARSE_PARAM_ARG YYPARSE_PARAM -#define YYPARSE_PARAM_DECL void *YYPARSE_PARAM; -#endif /* not __cplusplus */ -#else /* not YYPARSE_PARAM */ -#define YYPARSE_PARAM_ARG -#define YYPARSE_PARAM_DECL -#endif /* not YYPARSE_PARAM */ - -/* Prevent warning if -Wstrict-prototypes. */ -#ifdef __GNUC__ -#ifdef YYPARSE_PARAM -int yyparse (void *); -#else -int yyparse (void); -#endif -#endif - -int -yyparse(YYPARSE_PARAM_ARG) - YYPARSE_PARAM_DECL -{ - register int yystate; - register int yyn; - register short *yyssp; - register YYSTYPE *yyvsp; - int yyerrstatus; /* number of tokens to shift before error messages enabled */ - int yychar1 = 0; /* lookahead token as an internal (translated) token number */ - - short yyssa[YYINITDEPTH]; /* the state stack */ - YYSTYPE yyvsa[YYINITDEPTH]; /* the semantic value stack */ - - short *yyss = yyssa; /* refer to the stacks thru separate pointers */ - YYSTYPE *yyvs = yyvsa; /* to allow yyoverflow to xreallocate them elsewhere */ - -#ifdef YYLSP_NEEDED - YYLTYPE yylsa[YYINITDEPTH]; /* the location stack */ - YYLTYPE *yyls = yylsa; - YYLTYPE *yylsp; - -#define YYPOPSTACK (yyvsp--, yyssp--, yylsp--) -#else -#define YYPOPSTACK (yyvsp--, yyssp--) -#endif - - int yystacksize = YYINITDEPTH; - int yyfree_stacks = 0; - -#ifdef YYPURE - int yychar; - YYSTYPE yylval; - int yynerrs; -#ifdef YYLSP_NEEDED - YYLTYPE yylloc; -#endif -#endif - - YYSTYPE yyval; /* the variable used to return */ - /* semantic values from the action */ - /* routines */ - - int yylen; - -#if YYDEBUG != 0 - if (yydebug) - fprintf(stderr, "Starting parse\n"); -#endif - - yystate = 0; - yyerrstatus = 0; - yynerrs = 0; - yychar = YYEMPTY; /* Cause a token to be read. */ - - /* Initialize stack pointers. - Waste one element of value and location stack - so that they stay on the same level as the state stack. - The wasted elements are never initialized. */ - - yyssp = yyss - 1; - yyvsp = yyvs; -#ifdef YYLSP_NEEDED - yylsp = yyls; -#endif - -/* Push a new state, which is found in yystate . */ -/* In all cases, when you get here, the value and location stacks - have just been pushed. so pushing a state here evens the stacks. */ -yynewstate: - - *++yyssp = yystate; - - if (yyssp >= yyss + yystacksize - 1) - { - /* Give user a chance to xreallocate the stack */ - /* Use copies of these so that the &'s don't force the real ones into memory. */ - YYSTYPE *yyvs1 = yyvs; - short *yyss1 = yyss; -#ifdef YYLSP_NEEDED - YYLTYPE *yyls1 = yyls; -#endif - - /* Get the current used size of the three stacks, in elements. */ - int size = yyssp - yyss + 1; - -#ifdef yyoverflow - /* Each stack pointer address is followed by the size of - the data in use in that stack, in bytes. */ -#ifdef YYLSP_NEEDED - /* This used to be a conditional around just the two extra args, - but that might be undefined if yyoverflow is a macro. */ - yyoverflow("parser stack overflow", - &yyss1, size * sizeof (*yyssp), - &yyvs1, size * sizeof (*yyvsp), - &yyls1, size * sizeof (*yylsp), - &yystacksize); -#else - yyoverflow("parser stack overflow", - &yyss1, size * sizeof (*yyssp), - &yyvs1, size * sizeof (*yyvsp), - &yystacksize); -#endif - - yyss = yyss1; yyvs = yyvs1; -#ifdef YYLSP_NEEDED - yyls = yyls1; -#endif -#else /* no yyoverflow */ - /* Extend the stack our own way. */ - if (yystacksize >= YYMAXDEPTH) - { - yyerror("parser stack overflow"); - if (yyfree_stacks) - { - free (yyss); - free (yyvs); -#ifdef YYLSP_NEEDED - free (yyls); -#endif - } - return 2; - } - yystacksize *= 2; - if (yystacksize > YYMAXDEPTH) - yystacksize = YYMAXDEPTH; -#ifndef YYSTACK_USE_ALLOCA - yyfree_stacks = 1; -#endif - yyss = (short *) YYSTACK_ALLOC (yystacksize * sizeof (*yyssp)); - __yy_memcpy ((char *)yyss, (char *)yyss1, - size * (unsigned int) sizeof (*yyssp)); - yyvs = (YYSTYPE *) YYSTACK_ALLOC (yystacksize * sizeof (*yyvsp)); - __yy_memcpy ((char *)yyvs, (char *)yyvs1, - size * (unsigned int) sizeof (*yyvsp)); -#ifdef YYLSP_NEEDED - yyls = (YYLTYPE *) YYSTACK_ALLOC (yystacksize * sizeof (*yylsp)); - __yy_memcpy ((char *)yyls, (char *)yyls1, - size * (unsigned int) sizeof (*yylsp)); -#endif -#endif /* no yyoverflow */ - - yyssp = yyss + size - 1; - yyvsp = yyvs + size - 1; -#ifdef YYLSP_NEEDED - yylsp = yyls + size - 1; -#endif - -#if YYDEBUG != 0 - if (yydebug) - fprintf(stderr, "Stack size increased to %d\n", yystacksize); -#endif - - if (yyssp >= yyss + yystacksize - 1) - YYABORT; - } - -#if YYDEBUG != 0 - if (yydebug) - fprintf(stderr, "Entering state %d\n", yystate); -#endif - - goto yybackup; - yybackup: - -/* Do appropriate processing given the current state. */ -/* Read a lookahead token if we need one and don't already have one. */ -/* yyresume: */ - - /* First try to decide what to do without reference to lookahead token. */ - - yyn = yypact[yystate]; - if (yyn == YYFLAG) - goto yydefault; - - /* Not known => get a lookahead token if don't already have one. */ - - /* yychar is either YYEMPTY or YYEOF - or a valid token in external form. */ - - if (yychar == YYEMPTY) - { -#if YYDEBUG != 0 - if (yydebug) - fprintf(stderr, "Reading a token: "); -#endif - yychar = YYLEX; - } - - /* Convert token to internal form (in yychar1) for indexing tables with */ - - if (yychar <= 0) /* This means end of input. */ - { - yychar1 = 0; - yychar = YYEOF; /* Don't call YYLEX any more */ - -#if YYDEBUG != 0 - if (yydebug) - fprintf(stderr, "Now at end of input.\n"); -#endif - } - else - { - yychar1 = YYTRANSLATE(yychar); - -#if YYDEBUG != 0 - if (yydebug) - { - fprintf (stderr, "Next token is %d (%s", yychar, yytname[yychar1]); - /* Give the individual parser a way to print the precise meaning - of a token, for further debugging info. */ -#ifdef YYPRINT - YYPRINT (stderr, yychar, yylval); -#endif - fprintf (stderr, ")\n"); - } -#endif - } - - yyn += yychar1; - if (yyn < 0 || yyn > YYLAST || yycheck[yyn] != yychar1) - goto yydefault; - - yyn = yytable[yyn]; - - /* yyn is what to do for this token type in this state. - Negative => reduce, -yyn is rule number. - Positive => shift, yyn is new state. - New state is final state => don't bother to shift, - just return success. - 0, or most negative number => error. */ - - if (yyn < 0) - { - if (yyn == YYFLAG) - goto yyerrlab; - yyn = -yyn; - goto yyreduce; - } - else if (yyn == 0) - goto yyerrlab; - - if (yyn == YYFINAL) - YYACCEPT; - - /* Shift the lookahead token. */ - -#if YYDEBUG != 0 - if (yydebug) - fprintf(stderr, "Shifting token %d (%s), ", yychar, yytname[yychar1]); -#endif - - /* Discard the token being shifted unless it is eof. */ - if (yychar != YYEOF) - yychar = YYEMPTY; - - *++yyvsp = yylval; -#ifdef YYLSP_NEEDED - *++yylsp = yylloc; -#endif - - /* count tokens shifted since error; after three, turn off error status. */ - if (yyerrstatus) yyerrstatus--; - - yystate = yyn; - goto yynewstate; - -/* Do the default action for the current state. */ -yydefault: - - yyn = yydefact[yystate]; - if (yyn == 0) - goto yyerrlab; - -/* Do a reduction. yyn is the number of a rule to reduce with. */ -yyreduce: - yylen = yyr2[yyn]; - if (yylen > 0) - yyval = yyvsp[1-yylen]; /* implement default value of the action */ - -#if YYDEBUG != 0 - if (yydebug) - { - int i; - - fprintf (stderr, "Reducing via rule %d (line %d), ", - yyn, yyrline[yyn]); - - /* Print the symbols being reduced, and their result. */ - for (i = yyprhs[yyn]; yyrhs[i] > 0; i++) - fprintf (stderr, "%s ", yytname[yyrhs[i]]); - fprintf (stderr, " -> %s\n", yytname[yyr1[yyn]]); - } -#endif - - - switch (yyn) { - -case 3: -#line 209 "m2-exp.y" -{ write_exp_elt_opcode(OP_TYPE); - write_exp_elt_type(yyvsp[0].tval); - write_exp_elt_opcode(OP_TYPE); - ; - break;} -case 4: -#line 218 "m2-exp.y" -{ write_exp_elt_opcode (UNOP_IND); ; - break;} -case 5: -#line 221 "m2-exp.y" -{ number_sign = -1; ; - break;} -case 6: -#line 223 "m2-exp.y" -{ number_sign = 1; - write_exp_elt_opcode (UNOP_NEG); ; - break;} -case 7: -#line 228 "m2-exp.y" -{ write_exp_elt_opcode(UNOP_PLUS); ; - break;} -case 8: -#line 232 "m2-exp.y" -{ write_exp_elt_opcode (UNOP_LOGICAL_NOT); ; - break;} -case 11: -#line 240 "m2-exp.y" -{ write_exp_elt_opcode (UNOP_CAP); ; - break;} -case 12: -#line 244 "m2-exp.y" -{ write_exp_elt_opcode (UNOP_ORD); ; - break;} -case 13: -#line 248 "m2-exp.y" -{ write_exp_elt_opcode (UNOP_ABS); ; - break;} -case 14: -#line 252 "m2-exp.y" -{ write_exp_elt_opcode (UNOP_HIGH); ; - break;} -case 15: -#line 256 "m2-exp.y" -{ write_exp_elt_opcode (UNOP_MIN); - write_exp_elt_type (yyvsp[-1].tval); - write_exp_elt_opcode (UNOP_MIN); ; - break;} -case 16: -#line 262 "m2-exp.y" -{ write_exp_elt_opcode (UNOP_MAX); - write_exp_elt_type (yyvsp[-1].tval); - write_exp_elt_opcode (UNOP_MIN); ; - break;} -case 17: -#line 268 "m2-exp.y" -{ write_exp_elt_opcode (UNOP_FLOAT); ; - break;} -case 18: -#line 272 "m2-exp.y" -{ write_exp_elt_opcode (BINOP_VAL); - write_exp_elt_type (yyvsp[-3].tval); - write_exp_elt_opcode (BINOP_VAL); ; - break;} -case 19: -#line 278 "m2-exp.y" -{ write_exp_elt_opcode (UNOP_CHR); ; - break;} -case 20: -#line 282 "m2-exp.y" -{ write_exp_elt_opcode (UNOP_ODD); ; - break;} -case 21: -#line 286 "m2-exp.y" -{ write_exp_elt_opcode (UNOP_TRUNC); ; - break;} -case 22: -#line 290 "m2-exp.y" -{ write_exp_elt_opcode (UNOP_SIZEOF); ; - break;} -case 23: -#line 295 "m2-exp.y" -{ write_exp_elt_opcode(UNOP_PREINCREMENT); ; - break;} -case 24: -#line 299 "m2-exp.y" -{ write_exp_elt_opcode(BINOP_ASSIGN_MODIFY); - write_exp_elt_opcode(BINOP_ADD); - write_exp_elt_opcode(BINOP_ASSIGN_MODIFY); ; - break;} -case 25: -#line 305 "m2-exp.y" -{ write_exp_elt_opcode(UNOP_PREDECREMENT);; - break;} -case 26: -#line 309 "m2-exp.y" -{ write_exp_elt_opcode(BINOP_ASSIGN_MODIFY); - write_exp_elt_opcode(BINOP_SUB); - write_exp_elt_opcode(BINOP_ASSIGN_MODIFY); ; - break;} -case 27: -#line 315 "m2-exp.y" -{ write_exp_elt_opcode (STRUCTOP_STRUCT); - write_exp_string (yyvsp[0].sval); - write_exp_elt_opcode (STRUCTOP_STRUCT); ; - break;} -case 29: -#line 324 "m2-exp.y" -{ error("Sets are not implemented.");; - break;} -case 30: -#line 328 "m2-exp.y" -{ error("Sets are not implemented.");; - break;} -case 31: -#line 332 "m2-exp.y" -{ error("Sets are not implemented.");; - break;} -case 32: -#line 335 "m2-exp.y" -{ error("Sets are not implemented.");; - break;} -case 33: -#line 337 "m2-exp.y" -{ error("Sets are not implemented.");; - break;} -case 34: -#line 346 "m2-exp.y" -{ start_arglist(); ; - break;} -case 35: -#line 348 "m2-exp.y" -{ write_exp_elt_opcode (MULTI_SUBSCRIPT); - write_exp_elt_longcst ((LONGEST) end_arglist()); - write_exp_elt_opcode (MULTI_SUBSCRIPT); ; - break;} -case 36: -#line 356 "m2-exp.y" -{ start_arglist (); ; - break;} -case 37: -#line 358 "m2-exp.y" -{ write_exp_elt_opcode (OP_FUNCALL); - write_exp_elt_longcst ((LONGEST) end_arglist ()); - write_exp_elt_opcode (OP_FUNCALL); ; - break;} -case 39: -#line 367 "m2-exp.y" -{ arglist_len = 1; ; - break;} -case 40: -#line 371 "m2-exp.y" -{ arglist_len++; ; - break;} -case 41: -#line 376 "m2-exp.y" -{ arglist_len = 1; ; - break;} -case 42: -#line 381 "m2-exp.y" -{ arglist_len++; ; - break;} -case 43: -#line 386 "m2-exp.y" -{ write_exp_elt_opcode (UNOP_MEMVAL); - write_exp_elt_type (yyvsp[-2].tval); - write_exp_elt_opcode (UNOP_MEMVAL); ; - break;} -case 44: -#line 392 "m2-exp.y" -{ write_exp_elt_opcode (UNOP_CAST); - write_exp_elt_type (yyvsp[-3].tval); - write_exp_elt_opcode (UNOP_CAST); ; - break;} -case 45: -#line 398 "m2-exp.y" -{ ; - break;} -case 46: -#line 406 "m2-exp.y" -{ write_exp_elt_opcode (BINOP_REPEAT); ; - break;} -case 47: -#line 410 "m2-exp.y" -{ write_exp_elt_opcode (BINOP_MUL); ; - break;} -case 48: -#line 414 "m2-exp.y" -{ write_exp_elt_opcode (BINOP_DIV); ; - break;} -case 49: -#line 418 "m2-exp.y" -{ write_exp_elt_opcode (BINOP_INTDIV); ; - break;} -case 50: -#line 422 "m2-exp.y" -{ write_exp_elt_opcode (BINOP_REM); ; - break;} -case 51: -#line 426 "m2-exp.y" -{ write_exp_elt_opcode (BINOP_ADD); ; - break;} -case 52: -#line 430 "m2-exp.y" -{ write_exp_elt_opcode (BINOP_SUB); ; - break;} -case 53: -#line 434 "m2-exp.y" -{ write_exp_elt_opcode (BINOP_EQUAL); ; - break;} -case 54: -#line 438 "m2-exp.y" -{ write_exp_elt_opcode (BINOP_NOTEQUAL); ; - break;} -case 55: -#line 440 "m2-exp.y" -{ write_exp_elt_opcode (BINOP_NOTEQUAL); ; - break;} -case 56: -#line 444 "m2-exp.y" -{ write_exp_elt_opcode (BINOP_LEQ); ; - break;} -case 57: -#line 448 "m2-exp.y" -{ write_exp_elt_opcode (BINOP_GEQ); ; - break;} -case 58: -#line 452 "m2-exp.y" -{ write_exp_elt_opcode (BINOP_LESS); ; - break;} -case 59: -#line 456 "m2-exp.y" -{ write_exp_elt_opcode (BINOP_GTR); ; - break;} -case 60: -#line 460 "m2-exp.y" -{ write_exp_elt_opcode (BINOP_LOGICAL_AND); ; - break;} -case 61: -#line 464 "m2-exp.y" -{ write_exp_elt_opcode (BINOP_LOGICAL_OR); ; - break;} -case 62: -#line 468 "m2-exp.y" -{ write_exp_elt_opcode (BINOP_ASSIGN); ; - break;} -case 63: -#line 475 "m2-exp.y" -{ write_exp_elt_opcode (OP_BOOL); - write_exp_elt_longcst ((LONGEST) yyvsp[0].ulval); - write_exp_elt_opcode (OP_BOOL); ; - break;} -case 64: -#line 481 "m2-exp.y" -{ write_exp_elt_opcode (OP_BOOL); - write_exp_elt_longcst ((LONGEST) yyvsp[0].ulval); - write_exp_elt_opcode (OP_BOOL); ; - break;} -case 65: -#line 487 "m2-exp.y" -{ write_exp_elt_opcode (OP_LONG); - write_exp_elt_type (builtin_type_m2_int); - write_exp_elt_longcst ((LONGEST) yyvsp[0].lval); - write_exp_elt_opcode (OP_LONG); ; - break;} -case 66: -#line 494 "m2-exp.y" -{ - write_exp_elt_opcode (OP_LONG); - write_exp_elt_type (builtin_type_m2_card); - write_exp_elt_longcst ((LONGEST) yyvsp[0].ulval); - write_exp_elt_opcode (OP_LONG); - ; - break;} -case 67: -#line 503 "m2-exp.y" -{ write_exp_elt_opcode (OP_LONG); - write_exp_elt_type (builtin_type_m2_char); - write_exp_elt_longcst ((LONGEST) yyvsp[0].ulval); - write_exp_elt_opcode (OP_LONG); ; - break;} -case 68: -#line 511 "m2-exp.y" -{ write_exp_elt_opcode (OP_DOUBLE); - write_exp_elt_type (builtin_type_m2_real); - write_exp_elt_dblcst (yyvsp[0].dval); - write_exp_elt_opcode (OP_DOUBLE); ; - break;} -case 70: -#line 521 "m2-exp.y" -{ write_exp_elt_opcode (OP_LONG); - write_exp_elt_type (builtin_type_int); - write_exp_elt_longcst ((LONGEST) TYPE_LENGTH (yyvsp[-1].tval)); - write_exp_elt_opcode (OP_LONG); ; - break;} -case 71: -#line 528 "m2-exp.y" -{ write_exp_elt_opcode (OP_M2_STRING); - write_exp_string (yyvsp[0].sval); - write_exp_elt_opcode (OP_M2_STRING); ; - break;} -case 72: -#line 535 "m2-exp.y" -{ yyval.bval = SYMBOL_BLOCK_VALUE(yyvsp[0].sym); ; - break;} -case 73: -#line 539 "m2-exp.y" -{ struct symbol *sym - = lookup_symbol (copy_name (yyvsp[0].sval), expression_context_block, - VAR_NAMESPACE, 0, NULL); - yyval.sym = sym;; - break;} -case 74: -#line 548 "m2-exp.y" -{ struct symbol *tem - = lookup_symbol (copy_name (yyvsp[0].sval), yyvsp[-2].bval, - VAR_NAMESPACE, 0, NULL); - if (!tem || SYMBOL_CLASS (tem) != LOC_BLOCK) - error ("No function \"%s\" in specified context.", - copy_name (yyvsp[0].sval)); - yyval.sym = tem; - ; - break;} -case 75: -#line 560 "m2-exp.y" -{ write_exp_elt_opcode(OP_VAR_VALUE); - write_exp_elt_block (NULL); - write_exp_elt_sym (yyvsp[0].sym); - write_exp_elt_opcode (OP_VAR_VALUE); ; - break;} -case 77: -#line 572 "m2-exp.y" -{ struct symbol *sym; - sym = lookup_symbol (copy_name (yyvsp[0].sval), yyvsp[-2].bval, - VAR_NAMESPACE, 0, NULL); - if (sym == 0) - error ("No symbol \"%s\" in specified context.", - copy_name (yyvsp[0].sval)); - - write_exp_elt_opcode (OP_VAR_VALUE); - /* block_found is set by lookup_symbol. */ - write_exp_elt_block (block_found); - write_exp_elt_sym (sym); - write_exp_elt_opcode (OP_VAR_VALUE); ; - break;} -case 78: -#line 588 "m2-exp.y" -{ struct symbol *sym; - int is_a_field_of_this; - - sym = lookup_symbol (copy_name (yyvsp[0].sval), - expression_context_block, - VAR_NAMESPACE, - &is_a_field_of_this, - NULL); - if (sym) - { - if (symbol_read_needs_frame (sym)) - { - if (innermost_block == 0 || - contained_in (block_found, - innermost_block)) - innermost_block = block_found; - } - - write_exp_elt_opcode (OP_VAR_VALUE); - /* We want to use the selected frame, not - another more inner frame which happens to - be in the same block. */ - write_exp_elt_block (NULL); - write_exp_elt_sym (sym); - write_exp_elt_opcode (OP_VAR_VALUE); - } - else - { - struct minimal_symbol *msymbol; - register char *arg = copy_name (yyvsp[0].sval); - - msymbol = - lookup_minimal_symbol (arg, NULL, NULL); - if (msymbol != NULL) - { - write_exp_msymbol - (msymbol, - lookup_function_type (builtin_type_int), - builtin_type_int); - } - else if (!have_full_symbols () && !have_partial_symbols ()) - error ("No symbol table is loaded. Use the \"symbol-file\" command."); - else - error ("No symbol \"%s\" in current context.", - copy_name (yyvsp[0].sval)); - } - ; - break;} -case 79: -#line 639 "m2-exp.y" -{ yyval.tval = lookup_typename (copy_name (yyvsp[0].sval), - expression_context_block, 0); ; - break;} -} - /* the action file gets copied in in place of this dollarsign */ -#line 542 "/usr/lib/bison.simple" - - yyvsp -= yylen; - yyssp -= yylen; -#ifdef YYLSP_NEEDED - yylsp -= yylen; -#endif - -#if YYDEBUG != 0 - if (yydebug) - { - short *ssp1 = yyss - 1; - fprintf (stderr, "state stack now"); - while (ssp1 != yyssp) - fprintf (stderr, " %d", *++ssp1); - fprintf (stderr, "\n"); - } -#endif - - *++yyvsp = yyval; - -#ifdef YYLSP_NEEDED - yylsp++; - if (yylen == 0) - { - yylsp->first_line = yylloc.first_line; - yylsp->first_column = yylloc.first_column; - yylsp->last_line = (yylsp-1)->last_line; - yylsp->last_column = (yylsp-1)->last_column; - yylsp->text = 0; - } - else - { - yylsp->last_line = (yylsp+yylen-1)->last_line; - yylsp->last_column = (yylsp+yylen-1)->last_column; - } -#endif - - /* Now "shift" the result of the reduction. - Determine what state that goes to, - based on the state we popped back to - and the rule number reduced by. */ - - yyn = yyr1[yyn]; - - yystate = yypgoto[yyn - YYNTBASE] + *yyssp; - if (yystate >= 0 && yystate <= YYLAST && yycheck[yystate] == *yyssp) - yystate = yytable[yystate]; - else - yystate = yydefgoto[yyn - YYNTBASE]; - - goto yynewstate; - -yyerrlab: /* here on detecting error */ - - if (! yyerrstatus) - /* If not already recovering from an error, report this error. */ - { - ++yynerrs; - -#ifdef YYERROR_VERBOSE - yyn = yypact[yystate]; - - if (yyn > YYFLAG && yyn < YYLAST) - { - int size = 0; - char *msg; - int x, count; - - count = 0; - /* Start X at -yyn if nec to avoid negative indexes in yycheck. */ - for (x = (yyn < 0 ? -yyn : 0); - x < (sizeof(yytname) / sizeof(char *)); x++) - if (yycheck[x + yyn] == x) - size += strlen(yytname[x]) + 15, count++; - msg = (char *) xmalloc(size + 15); - if (msg != 0) - { - strcpy(msg, "parse error"); - - if (count < 5) - { - count = 0; - for (x = (yyn < 0 ? -yyn : 0); - x < (sizeof(yytname) / sizeof(char *)); x++) - if (yycheck[x + yyn] == x) - { - strcat(msg, count == 0 ? ", expecting `" : " or `"); - strcat(msg, yytname[x]); - strcat(msg, "'"); - count++; - } - } - yyerror(msg); - free(msg); - } - else - yyerror ("parse error; also virtual memory exceeded"); - } - else -#endif /* YYERROR_VERBOSE */ - yyerror("parse error"); - } - - goto yyerrlab1; -yyerrlab1: /* here on error raised explicitly by an action */ - - if (yyerrstatus == 3) - { - /* if just tried and failed to reuse lookahead token after an error, discard it. */ - - /* return failure if at end of input */ - if (yychar == YYEOF) - YYABORT; - -#if YYDEBUG != 0 - if (yydebug) - fprintf(stderr, "Discarding token %d (%s).\n", yychar, yytname[yychar1]); -#endif - - yychar = YYEMPTY; - } - - /* Else will try to reuse lookahead token - after shifting the error token. */ - - yyerrstatus = 3; /* Each real token shifted decrements this */ - - goto yyerrhandle; - -yyerrdefault: /* current state does not do anything special for the error token. */ - -#if 0 - /* This is wrong; only states that explicitly want error tokens - should shift them. */ - yyn = yydefact[yystate]; /* If its default is to accept any token, ok. Otherwise pop it.*/ - if (yyn) goto yydefault; -#endif - -yyerrpop: /* pop the current state because it cannot handle the error token */ - - if (yyssp == yyss) YYABORT; - yyvsp--; - yystate = *--yyssp; -#ifdef YYLSP_NEEDED - yylsp--; -#endif - -#if YYDEBUG != 0 - if (yydebug) - { - short *ssp1 = yyss - 1; - fprintf (stderr, "Error: state stack now"); - while (ssp1 != yyssp) - fprintf (stderr, " %d", *++ssp1); - fprintf (stderr, "\n"); - } -#endif - -yyerrhandle: - - yyn = yypact[yystate]; - if (yyn == YYFLAG) - goto yyerrdefault; - - yyn += YYTERROR; - if (yyn < 0 || yyn > YYLAST || yycheck[yyn] != YYTERROR) - goto yyerrdefault; - - yyn = yytable[yyn]; - if (yyn < 0) - { - if (yyn == YYFLAG) - goto yyerrpop; - yyn = -yyn; - goto yyreduce; - } - else if (yyn == 0) - goto yyerrpop; - - if (yyn == YYFINAL) - YYACCEPT; - -#if YYDEBUG != 0 - if (yydebug) - fprintf(stderr, "Shifting error token, "); -#endif - - *++yyvsp = yylval; -#ifdef YYLSP_NEEDED - *++yylsp = yylloc; -#endif - - yystate = yyn; - goto yynewstate; - - yyacceptlab: - /* YYACCEPT comes here. */ - if (yyfree_stacks) - { - free (yyss); - free (yyvs); -#ifdef YYLSP_NEEDED - free (yyls); -#endif - } - return 0; - - yyabortlab: - /* YYABORT comes here. */ - if (yyfree_stacks) - { - free (yyss); - free (yyvs); -#ifdef YYLSP_NEEDED - free (yyls); -#endif - } - return 1; -} -#line 644 "m2-exp.y" - - -#if 0 /* FIXME! */ -int -overflow(a,b) - long a,b; -{ - return (MAX_OF_TYPE(builtin_type_m2_int) - b) < a; -} - -int -uoverflow(a,b) - unsigned long a,b; -{ - return (MAX_OF_TYPE(builtin_type_m2_card) - b) < a; -} -#endif /* FIXME */ - -/* Take care of parsing a number (anything that starts with a digit). - Set yylval and return the token type; update lexptr. - LEN is the number of characters in it. */ - -/*** Needs some error checking for the float case ***/ - -static int -parse_number (olen) - int olen; -{ - register char *p = lexptr; - register LONGEST n = 0; - register LONGEST prevn = 0; - register int c,i,ischar=0; - register int base = input_radix; - register int len = olen; - int unsigned_p = number_sign == 1 ? 1 : 0; - - if(p[len-1] == 'H') - { - base = 16; - len--; - } - else if(p[len-1] == 'C' || p[len-1] == 'B') - { - base = 8; - ischar = p[len-1] == 'C'; - len--; - } - - /* Scan the number */ - for (c = 0; c < len; c++) - { - if (p[c] == '.' && base == 10) - { - /* It's a float since it contains a point. */ - yylval.dval = atof (p); - lexptr += len; - return FLOAT; - } - if (p[c] == '.' && base != 10) - error("Floating point numbers must be base 10."); - if (base == 10 && (p[c] < '0' || p[c] > '9')) - error("Invalid digit \'%c\' in number.",p[c]); - } - - while (len-- > 0) - { - c = *p++; - n *= base; - if( base == 8 && (c == '8' || c == '9')) - error("Invalid digit \'%c\' in octal number.",c); - if (c >= '0' && c <= '9') - i = c - '0'; - else - { - if (base == 16 && c >= 'A' && c <= 'F') - i = c - 'A' + 10; - else - return ERROR; - } - n+=i; - if(i >= base) - return ERROR; - if(!unsigned_p && number_sign == 1 && (prevn >= n)) - unsigned_p=1; /* Try something unsigned */ - /* Don't do the range check if n==i and i==0, since that special - case will give an overflow error. */ - if(RANGE_CHECK && n!=i && i) - { - if((unsigned_p && (unsigned)prevn >= (unsigned)n) || - ((!unsigned_p && number_sign==-1) && -prevn <= -n)) - range_error("Overflow on numeric constant."); - } - prevn=n; - } - - lexptr = p; - if(*p == 'B' || *p == 'C' || *p == 'H') - lexptr++; /* Advance past B,C or H */ - - if (ischar) - { - yylval.ulval = n; - return CHAR; - } - else if ( unsigned_p && number_sign == 1) - { - yylval.ulval = n; - return UINT; - } - else if((unsigned_p && (n<0))) { - range_error("Overflow on numeric constant -- number too large."); - /* But, this can return if range_check == range_warn. */ - } - yylval.lval = n; - return INT; -} - - -/* Some tokens */ - -static struct -{ - char name[2]; - int token; -} tokentab2[] = -{ - { {'<', '>'}, NOTEQUAL }, - { {':', '='}, ASSIGN }, - { {'<', '='}, LEQ }, - { {'>', '='}, GEQ }, - { {':', ':'}, COLONCOLON }, - -}; - -/* Some specific keywords */ - -struct keyword { - char keyw[10]; - int token; -}; - -static struct keyword keytab[] = -{ - {"OR" , OROR }, - {"IN", IN },/* Note space after IN */ - {"AND", LOGICAL_AND}, - {"ABS", ABS }, - {"CHR", CHR }, - {"DEC", DEC }, - {"NOT", NOT }, - {"DIV", DIV }, - {"INC", INC }, - {"MAX", MAX_FUNC }, - {"MIN", MIN_FUNC }, - {"MOD", MOD }, - {"ODD", ODD }, - {"CAP", CAP }, - {"ORD", ORD }, - {"VAL", VAL }, - {"EXCL", EXCL }, - {"HIGH", HIGH }, - {"INCL", INCL }, - {"SIZE", SIZE }, - {"FLOAT", FLOAT_FUNC }, - {"TRUNC", TRUNC }, -}; - - -/* Read one token, getting characters through lexptr. */ - -/* This is where we will check to make sure that the language and the operators used are - compatible */ - -static int -yylex () -{ - register int c; - register int namelen; - register int i; - register char *tokstart; - register char quote; - - retry: - - tokstart = lexptr; - - - /* See if it is a special token of length 2 */ - for( i = 0 ; i < (int) (sizeof tokentab2 / sizeof tokentab2[0]) ; i++) - if(STREQN(tokentab2[i].name, tokstart, 2)) - { - lexptr += 2; - return tokentab2[i].token; - } - - switch (c = *tokstart) - { - case 0: - return 0; - - case ' ': - case '\t': - case '\n': - lexptr++; - goto retry; - - case '(': - paren_depth++; - lexptr++; - return c; - - case ')': - if (paren_depth == 0) - return 0; - paren_depth--; - lexptr++; - return c; - - case ',': - if (comma_terminates && paren_depth == 0) - return 0; - lexptr++; - return c; - - case '.': - /* Might be a floating point number. */ - if (lexptr[1] >= '0' && lexptr[1] <= '9') - break; /* Falls into number code. */ - else - { - lexptr++; - return DOT; - } - -/* These are character tokens that appear as-is in the YACC grammar */ - case '+': - case '-': - case '*': - case '/': - case '^': - case '<': - case '>': - case '[': - case ']': - case '=': - case '{': - case '}': - case '#': - case '@': - case '~': - case '&': - lexptr++; - return c; - - case '\'' : - case '"': - quote = c; - for (namelen = 1; (c = tokstart[namelen]) != quote && c != '\0'; namelen++) - if (c == '\\') - { - c = tokstart[++namelen]; - if (c >= '0' && c <= '9') - { - c = tokstart[++namelen]; - if (c >= '0' && c <= '9') - c = tokstart[++namelen]; - } - } - if(c != quote) - error("Unterminated string or character constant."); - yylval.sval.ptr = tokstart + 1; - yylval.sval.length = namelen - 1; - lexptr += namelen + 1; - - if(namelen == 2) /* Single character */ - { - yylval.ulval = tokstart[1]; - return CHAR; - } - else - return STRING; - } - - /* Is it a number? */ - /* Note: We have already dealt with the case of the token '.'. - See case '.' above. */ - if ((c >= '0' && c <= '9')) - { - /* It's a number. */ - int got_dot = 0, got_e = 0; - register char *p = tokstart; - int toktype; - - for (++p ;; ++p) - { - if (!got_e && (*p == 'e' || *p == 'E')) - got_dot = got_e = 1; - else if (!got_dot && *p == '.') - got_dot = 1; - else if (got_e && (p[-1] == 'e' || p[-1] == 'E') - && (*p == '-' || *p == '+')) - /* This is the sign of the exponent, not the end of the - number. */ - continue; - else if ((*p < '0' || *p > '9') && - (*p < 'A' || *p > 'F') && - (*p != 'H')) /* Modula-2 hexadecimal number */ - break; - } - toktype = parse_number (p - tokstart); - if (toktype == ERROR) - { - char *err_copy = (char *) alloca (p - tokstart + 1); - - memcpy (err_copy, tokstart, p - tokstart); - err_copy[p - tokstart] = 0; - error ("Invalid number \"%s\".", err_copy); - } - lexptr = p; - return toktype; - } - - if (!(c == '_' || c == '$' - || (c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z'))) - /* We must have come across a bad character (e.g. ';'). */ - error ("Invalid character '%c' in expression.", c); - - /* It's a name. See how long it is. */ - namelen = 0; - for (c = tokstart[namelen]; - (c == '_' || c == '$' || (c >= '0' && c <= '9') - || (c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z')); - c = tokstart[++namelen]) - ; - - /* The token "if" terminates the expression and is NOT - removed from the input stream. */ - if (namelen == 2 && tokstart[0] == 'i' && tokstart[1] == 'f') - { - return 0; - } - - lexptr += namelen; - - /* Lookup special keywords */ - for(i = 0 ; i < (int) (sizeof(keytab) / sizeof(keytab[0])) ; i++) - if(namelen == strlen(keytab[i].keyw) && STREQN(tokstart,keytab[i].keyw,namelen)) - return keytab[i].token; - - yylval.sval.ptr = tokstart; - yylval.sval.length = namelen; - - if (*tokstart == '$') - { - write_dollar_variable (yylval.sval); - return INTERNAL_VAR; - } - - /* Use token-type BLOCKNAME for symbols that happen to be defined as - functions. If this is not so, then ... - Use token-type TYPENAME for symbols that happen to be defined - currently as names of types; NAME for other symbols. - The caller is not constrained to care about the distinction. */ - { - - - char *tmp = copy_name (yylval.sval); - struct symbol *sym; - - if (lookup_partial_symtab (tmp)) - return BLOCKNAME; - sym = lookup_symbol (tmp, expression_context_block, - VAR_NAMESPACE, 0, NULL); - if (sym && SYMBOL_CLASS (sym) == LOC_BLOCK) - return BLOCKNAME; - if (lookup_typename (copy_name (yylval.sval), expression_context_block, 1)) - return TYPENAME; - - if(sym) - { - switch(sym->aclass) - { - case LOC_STATIC: - case LOC_REGISTER: - case LOC_ARG: - case LOC_REF_ARG: - case LOC_REGPARM: - case LOC_REGPARM_ADDR: - case LOC_LOCAL: - case LOC_LOCAL_ARG: - case LOC_BASEREG: - case LOC_BASEREG_ARG: - case LOC_CONST: - case LOC_CONST_BYTES: - case LOC_OPTIMIZED_OUT: - return NAME; - - case LOC_TYPEDEF: - return TYPENAME; - - case LOC_BLOCK: - return BLOCKNAME; - - case LOC_UNDEF: - error("internal: Undefined class in m2lex()"); - - case LOC_LABEL: - case LOC_UNRESOLVED: - error("internal: Unforseen case in m2lex()"); - - default: - error ("unhandled token in m2lex()"); - break; - } - } - else - { - /* Built-in BOOLEAN type. This is sort of a hack. */ - if(STREQN(tokstart,"TRUE",4)) - { - yylval.ulval = 1; - return M2_TRUE; - } - else if(STREQN(tokstart,"FALSE",5)) - { - yylval.ulval = 0; - return M2_FALSE; - } - } - - /* Must be another type of name... */ - return NAME; - } -} - -#if 0 /* Unused */ -static char * -make_qualname(mod,ident) - char *mod, *ident; -{ - char *new = xmalloc(strlen(mod)+strlen(ident)+2); - - strcpy(new,mod); - strcat(new,"."); - strcat(new,ident); - return new; -} -#endif /* 0 */ - -void -yyerror (msg) - char *msg; -{ - error ("A %s in expression, near `%s'.", (msg ? msg : "error"), lexptr); -} diff --git a/contrib/gdb/gdb/mpw-config.in b/contrib/gdb/gdb/mpw-config.in deleted file mode 100644 index ed07878338bc5..0000000000000 --- a/contrib/gdb/gdb/mpw-config.in +++ /dev/null @@ -1,81 +0,0 @@ -# Configuration fragment for GDB. - -If "{host_canonical}" =~ /m68k-apple-mpw/ - forward-include "{srcdir}"config:m68k:xm-mpw.h xm.h - Set siow_lib '"{Libraries}"SIOW.o' - -Else If "{host_canonical}" =~ /powerpc-apple-mpw/ - forward-include "{srcdir}"config:powerpc:xm-mpw.h xm.h - Set siow_lib '"{PPCLibraries}"PPCSIOW.o' - -End If - -Set xdepfiles '"{o}"mac-xdep.c.o' - -Set enable_cflags "" - -# Make a copy of this file and give it a different name, so it -# won't be confused with GDB's serial.h. - -Duplicate -y "{CIncludes}"Serial.h MacSerial.h - -Echo "/* dummy */" >termio.h - -If "{target_canonical}" =~ /m68k-apple-macos/ - forward-include "{srcdir}"config:m68k:tm-mac.h tm.h - forward-include "{srcdir}"config:m68k:tm-m68k.h 'm68k/tm-m68k.h' - Set tdepfiles '"{o}"m68k-tdep.c.o' - -Else If "{target_canonical}" =~ /powerpc-apple-macos/ - forward-include "{srcdir}"config:powerpc:tm-macos.h tm.h - forward-include "{srcdir}"config:rs6000:tm-rs6000.h 'rs6000/tm-rs6000.h' - Set tdepfiles '"{o}"rs6000-tdep.c.o "{o}"xcoffread.c.o' - -Else If "{target_canonical}" =~ /i386-unknown-go32/ - forward-include "{srcdir}"config:i386:tm-i386v.h tm.h - Set tdepfiles '"{o}"i386-tdep.c.o' - -Else If "{target_canonical}" =~ /mips-idt-ecoff/ - forward-include "{srcdir}"config:mips:tm-embed.h tm.h - forward-include "{srcdir}"config:mips:tm-bigmips.h 'mips/tm-bigmips.h' - forward-include "{srcdir}"config:mips:tm-mips.h 'mips/tm-mips.h' - Set tdepfiles '"{o}"mips-tdep.c.o "{o}"remote-mips.c.o' - -Else If "{target_canonical}" =~ /sh-hitachi-hms/ - forward-include "{srcdir}"config:sh:tm-sh.h tm.h - Set tdepfiles '"{o}"sh-tdep.c.o' - -End If - -If "{target_canonical}" =~ /m68k-apple-macos/ - forward-include "{srcdir}"config:m68k:nm-macos.h nm.h - Set natdepfiles '"{o}"mac-nat.c.o' - -Else If "{target_canonical}" =~ /powerpc-apple-macos/ - forward-include "{srcdir}"config:powerpc:nm-macos.h nm.h - Set natdepfiles '"{o}"mac-nat.c.o' - -Else - forward-include "{srcdir}"config:nm-empty.h nm.h - Set natdepfiles ' ' - -End If - -Echo '# From mpw-config.in' > "{o}"mk.tmp -Echo "TDEPFILES = " {tdepfiles} >> "{o}"mk.tmp -Echo "XDEPFILES = " {xdepfiles} >> "{o}"mk.tmp -Echo "NATDEPFILES = " {natdepfiles} >> "{o}"mk.tmp -Echo "XM_ADD_FILES = " >> "{o}"mk.tmp -Echo "TM_ADD_FILES = " >> "{o}"mk.tmp -Echo "NAT_ADD_FILES = " >> "{o}"mk.tmp -Echo "XM_CDEPS = " >> "{o}"mk.tmp -Echo "TM_CDEPS = " >> "{o}"mk.tmp -Echo "NAT_CDEPS = " >> "{o}"mk.tmp -Echo "SIOW_LIB = " {siow_lib} >> "{o}"mk.tmp -Echo "ENABLE_CFLAGS = " {enable_cflags} >> "{o}"mk.tmp -Echo '# End from mpw-config.in' >> "{o}"mk.tmp - -Echo '/* config.h. Generated by mpw-configure. */' > "{o}"config.new -Echo '#include "mpw.h"' >> "{o}"config.new - -MoveIfChange "{o}"config.new "{o}"config.h diff --git a/contrib/gdb/gdb/mpw-make.sed b/contrib/gdb/gdb/mpw-make.sed deleted file mode 100644 index ce6a9ecdb155b..0000000000000 --- a/contrib/gdb/gdb/mpw-make.sed +++ /dev/null @@ -1,178 +0,0 @@ -# Sed commands that finish translating the GDB Unix Makefile to MPW syntax. - -/^host_alias =/s/^/#/ -/^target_alias =/s/^/#/ - -/^host_makefile_frag@$/d -/^target_makefile_frag@$/d - -/@ENABLE_CFLAGS@/s/@ENABLE_CFLAGS@/{ENABLE_CFLAGS}/g -/^ENABLE_CFLAGS=/s/^/#/ - -# Edit all the symbolic definitions pointing to various libraries and such. - -/^INCLUDE_DIR = /s/"{srcdir}":include/"{topsrcdir}"include:/ - -/^MMALLOC_DIR = /s/::mmalloc/mmalloc:/ -/^MMALLOC_SRC = /s/"{srcdir}"/"{topsrcdir}"/ -/^MMALLOC =/s/=.*$/=/ -/MMALLOC_CFLAGS =/s/=.*$/= -u USE_MMALLOC/ - -/^BFD_DIR = /s/::bfd/bfd:/ -/^BFD = /s/{BFD_DIR}:libbfd/{BFD_DIR}libbfd/ -/^BFD_SRC = /s/"{srcdir}"/"{topsrcdir}"/ - -/^READLINE_DIR = /s/::readline/readline:/ -/^READLINE =/s/=.*$/=/ -/^READLINE_SRC = /s/"{srcdir}"/"{topsrcdir}"/ - -/^INCLUDE_CFLAGS = /s/$/ -i "{topsrcdir}"include:mpw: -i ::extra-include:/ - -/^SER_HARDWIRE =/s/ser-unix/ser-mac/ - -/^TERMCAP =/s/ =.*$/ =/ - -# Whack out various autoconf vars that we don't need. -/@CONFIG_LDFLAGS@/s/@CONFIG_LDFLAGS@//g -/@HLDFLAGS@/s/@HLDFLAGS@//g -/@DEFS@/s/@DEFS@//g -/@YACC@/s/@YACC@/byacc/g -/@ENABLE_OBS@/s/@ENABLE_OBS@//g -/@ENABLE_CLIBS@/s/@ENABLE_CLIBS@//g -/@LIBS@/s/@LIBS@//g - -# Whack out autoconf hook for thread debugging. -/@THREAD_DB_OBS@/s/@THREAD_DB_OBS@//g - -# Fix up paths to include directories. -/INCLUDE_DIR/s/"{s}"{INCLUDE_DIR}/{INCLUDE_DIR}/g -/INCLUDE_DIR/s/{INCLUDE_DIR}:/{INCLUDE_DIR}/g -/INCLUDE_DIR/s/"{INCLUDE_DIR}":/"{INCLUDE_DIR}"/g - -/{BFD_DIR}/s/"{BFD_DIR}":/"{BFD_DIR}"/g -/{BFD_DIR}/s/\([ ]\){BFD_DIR}/\1::{BFD_DIR}/g -/{BFD_DIR}/s/\([ ]\)"{BFD_DIR}"/\1::"{BFD_DIR}"/g - -/{BFD_SRC}/s/"{s}"{BFD_SRC}/{BFD_SRC}/g -/{BFD_SRC}/s/{BFD_SRC}:/{BFD_SRC}/g - -/{READLINE_SRC}/s/"{s}"{READLINE_SRC}/{READLINE_SRC}/g - -/^readline_headers =/,/^$/c\ -readline_headers =\ - - -# This isn't really useful, and seems to cause nonsensical complaints. -/{ALLDEPFILES}/s/{ALLDEPFILES}//g - -/^copying.c \\Option-f /,/^$/d - -# Fix the syntax of bits of C code that go into version.c. -/char /s/'char .Option-x/'char */ - -# Point at files in the obj dir rather than src dir. -/version/s/"{s}"version\.c/"{o}"version.c/g -/version/s/^version\.c/"{o}"version.c/ -/config/s/"{s}"config\.h/"{o}"config.h/g -/config/s/^config\.h/"{o}"config.h/ -/xm/s/"{s}"xm\.h/"{o}"xm.h/g -/xm/s/^xm\.h/"{o}"xm.h/ -/tm/s/"{s}"tm\.h/"{o}"tm.h/g -/tm/s/^tm\.h/"{o}"tm.h/ -/nm/s/"{s}"nm\.h/"{o}"nm.h/g -/nm/s/^nm\.h/"{o}"nm.h/ - -/exp.tab.c/s/"{s}"\([a-z0-9]*\)-exp\.tab\.c/"{o}"\1-exp.tab.c/g -/exp.tab.c/s/^\([a-z0-9]*\)-exp\.tab\.c/"{o}"\1-exp.tab.c/ - -/y.tab/s/"{s}"y.tab\.c/"{o}"y.tab.c/g -/y.tab/s/^y.tab\.c/"{o}"y.tab.c/ - -/init/s/"{s}"init\.c-tmp/"{o}"init.c-tmp/g -/init/s/^init\.c-tmp/"{o}"init.c-tmp/ -/init/s/"{s}"init\.c/"{o}"init.c/g -/init/s/^init\.c/"{o}"init.c/ - -# Fix up the generation of version.c. -/"{o}"version.c \\Option-f Makefile/,/^$/c\ -"{o}"version.c \\Option-f Makefile\ - echo -n 'char *version = "' >"{o}"version.c\ - echo -n "{VERSION}" >>"{o}"version.c\ - echo '";' >>"{o}"version.c\ - echo -n 'char *host_name = "' >>"{o}"version.c\ - echo -n "{host_alias}" >>"{o}"version.c\ - echo '";' >>"{o}"version.c\ - echo -n 'char *target_name = "' >>"{o}"version.c\ - echo -n "{target_alias}" >>"{o}"version.c\ - echo '";' >>"{o}"version.c\ - - -/ansidecl/s/include "{s}""ansidecl.h"/include "ansidecl.h"/ - -# Open-brace in a command causes much confusion; replace with the -# result from a script. -/initialize_all_files ()/c\ - Echo -n 'void initialize_all_files () ' >> "{o}"init.c-tmp\ - open-brace >> "{o}"init.c-tmp - -# Replace the whole sed bit for init.c; it's simpler that way... -/echo {OBS} {TSOBS}/,/echo '}'/c\ - For i in {OBS} {TSOBS}\ - Set filename "`Echo {i} | sed \\Option-d\ - -e '/^Onindy.c.o/d' \\Option-d\ - -e '/^nindy.c.o/d' \\Option-d\ - -e '/ttyflush.c.o/d' \\Option-d\ - -e '/xdr_ld.c.o/d' \\Option-d\ - -e '/xdr_ptrace.c.o/d' \\Option-d\ - -e '/xdr_rdb.c.o/d' \\Option-d\ - -e '/udr.c.o/d' \\Option-d\ - -e '/udip2soc.c.o/d' \\Option-d\ - -e '/udi2go32.c.o/d' \\Option-d\ - -e '/version.c.o/d' \\Option-d\ - -e '/[a-z0-9A-Z_]*-exp.tab.c.o/d' \\Option-d\ - -e 's/\\.c\\.o/.c/' \\Option-d\ - -e 's/^://'`"\ - If "{filename}" != ""\ - sed <"{s}""{filename}" >>"{o}"init.c-tmp -n \\Option-d\ - -e '/^_initialize_[a-z_0-9A-Z]* *(/s/^\\([a-z_0-9A-Z]*\\).*/ {extern void \\1 (); \\1 ();}/p'\ - End If\ - End For\ - Echo '}' >>"{o}"init.c-tmp - -# Fix the main compile/link command. -/{CC_LD} {INTERNAL_LDFLAGS} -o gdb/,/"{o}"init.c.o {OBS} {TSOBS} {ADD_FILES} {CLIBS} {LOADLIBES}/c\ - {CC_LD} {INTERNAL_LDFLAGS} -o gdb{PROG_EXT} "{o}"init.c.o {OBS} {TSOBS} {ADD_FILES} {CLIBS} {LOADLIBES} {EXTRALIBS}\ - {MAKEPEF} gdb{PROG_EXT} -o gdb {MAKEPEF_TOOL_FLAGS} {MAKEPEF_FLAGS}\ - {REZ} "{s}"mac-gdb.r -o gdb -append -d PROG_NAME='"'gdb'"' -d VERSION_STRING='"'{version}'"'\ - -# Replace the install actions with MPW-friendly script. -/^install \\Option-f /,/^$/c\ -install \\Option-f all install-only\ -\ -install-only \\Option-f \ - NewFolderRecursive "{bindir}"\ - Duplicate -y gdb "{bindir}"gdb\ - If "`Exists SiowGDB`" != ""\ - Duplicate -y SiowGDB "{bindir}"SiowGDB\ - End If\ - - -# Don't do any recursive subdir stuff. -/ subdir_do/s/{MAKE}/null-command/ - -# Edit out actions that only confuse MPW Make. -/^config.status \\Option-f/,/^$/d -/^Makefile \\Option-f/,/^$/d - -# Don't test config.h dependencies. -/^"{o}"config.h \\Option-f/s/^/#/ - -# Add an action to build SIOWgdb. -$a\ -SIOWgdb \\Option-f {OBS} {TSOBS} {ADD_DEPS} {CDEPS} "{o}"init.c.o\ - Delete -i -y SIOWgdb\ - {CC_LD} {INTERNAL_LDFLAGS} -t 'APPL' -c 'gdb ' -o SIOWgdb{PROG_EXT} "{o}"init.c.o {OBS} {TSOBS} {ADD_FILES} {CLIBS} {SIOW_LIB} {LOADLIBES} {EXTRALIBS}\ - {MAKEPEF} SIOWgdb{PROG_EXT} -o SIOWgdb -ft 'APPL' -fc 'gdb ' {MAKEPEF_FLAGS} \ - {REZ} -o SIOWgdb "{RIncludes}"siow.r -append -d __kPrefSize=5000 -d __kMinSize=2000 -d APPNAME='"'SIOWgdb'"' \ - {REZ} "{s}"mac-gdb.r -o SIOWgdb -append -d VERSION_STRING='"'{version}'"'\ - diff --git a/contrib/gdb/gdb/news-xdep.c b/contrib/gdb/gdb/news-xdep.c deleted file mode 100644 index 7f57aeb1d46a9..0000000000000 --- a/contrib/gdb/gdb/news-xdep.c +++ /dev/null @@ -1,65 +0,0 @@ -/* Low level interface to ptrace, for GDB when running under Unix. - Copyright (C) 1986, 1987, 1989 Free Software Foundation, Inc. - -This file is part of GDB. - -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 2 of the License, 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ - -#ifdef __GNUC__ -/* Bad implement execle(3). It's depend for "/bin/cc". - - main() - { - printf("execle:\n"); - execle(FILE, ARGS, envp); - exit(1); - } - - GCC: - link a6,#0 - pea LC5 ; call printf - jbsr _printf - ; ; (not popd stack) - pea _envp ; call execle - clrl sp@- - pea LC4 - pea LC4 - pea LC4 - pea LC3 - pea LC6 - jbsr _execle - addw #32,sp ; delayed pop !! - - /bin/cc: - link.l fp,#L23 - movem.l #L24,(sp) - pea L26 ; call printf - jbsr _printf - addq.l #4,sp ; <--- popd stack !! - pea _envp ; call execle - clr.l -(sp) - pea L32 - - */ - -execle(name, args) - char *name, *args; -{ - register char **env = &args; - while (*env++) - ; - execve(name, (char **)&args, (char **)*env); -} -#endif diff --git a/contrib/gdb/gdb/ns32km3-nat.c b/contrib/gdb/gdb/ns32km3-nat.c deleted file mode 100644 index cdafb9ce0d448..0000000000000 --- a/contrib/gdb/gdb/ns32km3-nat.c +++ /dev/null @@ -1,183 +0,0 @@ -/* Low level interface to ns532 running mach 3.0. - Copyright (C) 1992 Free Software Foundation, Inc. - -This file is part of GDB. - -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 2 of the License, 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ - -#include "defs.h" -#include "inferior.h" - -#include <stdio.h> - -#include <mach.h> -#include <mach/message.h> -#include <mach/exception.h> -#include <mach_error.h> - -#define private static - - -/* Find offsets to thread states at compile time. - * If your compiler does not grok this, calculate offsets - * offsets yourself and use them (or get a compatible compiler :-) - */ - -#define REG_N_OFFSET(reg) (int)(&((struct ns532_combined_state *)0)->ts.reg) -#define REG_F_OFFSET(reg) (int)(&((struct ns532_combined_state *)0)->fs.reg) - -/* at reg_offset[i] is the offset to the ns532_combined_state - * location where the gdb registers[i] is stored. - */ - -static int reg_offset[] = -{ - REG_N_OFFSET(r0), REG_N_OFFSET(r1), REG_N_OFFSET(r2), REG_N_OFFSET(r3), - REG_N_OFFSET(r4), REG_N_OFFSET(r5), REG_N_OFFSET(r6), REG_N_OFFSET(r7), - REG_F_OFFSET(l0a), REG_F_OFFSET(l0b),REG_F_OFFSET(l2a),REG_F_OFFSET(l2b), - REG_F_OFFSET(l4a), REG_F_OFFSET(l4b),REG_F_OFFSET(l6a),REG_F_OFFSET(l6b), - REG_N_OFFSET(sp), REG_N_OFFSET(fp), REG_N_OFFSET(pc), REG_N_OFFSET(psr), - REG_F_OFFSET(fsr), - REG_F_OFFSET(l0a), REG_F_OFFSET(l1a),REG_F_OFFSET(l2a),REG_F_OFFSET(l3a), - REG_F_OFFSET(l4a), REG_F_OFFSET(l5a),REG_F_OFFSET(l6a),REG_F_OFFSET(l7a), -}; - -#define REG_ADDRESS(state,regnum) ((char *)(state)+reg_offset[regnum]) - -/* Fetch COUNT contiguous registers from thread STATE starting from REGNUM - * Caller knows that the regs handled in one transaction are of same size. - */ -#define FETCH_REGS(state, regnum, count) \ - memcpy (®isters[REGISTER_BYTE (regnum)], \ - (char *)state+reg_offset[ regnum ], \ - count*REGISTER_SIZE) - -/* Store COUNT contiguous registers to thread STATE starting from REGNUM */ -#define STORE_REGS(state, regnum, count) \ - memcpy ((char *)state+reg_offset[ regnum ], \ - ®isters[REGISTER_BYTE (regnum)], \ - count*REGISTER_SIZE) - -/* - * Fetch inferiors registers for gdb. - * REGNO specifies which (as gdb views it) register, -1 for all. - */ - -void -fetch_inferior_registers (regno) - int regno; -{ - kern_return_t ret; - thread_state_data_t state; - unsigned int stateCnt = NS532_COMBINED_STATE_COUNT; - int index; - - if (! MACH_PORT_VALID (current_thread)) - error ("fetch inferior registers: Invalid thread"); - - if (must_suspend_thread) - setup_thread (current_thread, 1); - - ret = thread_get_state (current_thread, - NS532_COMBINED_STATE, - state, - &stateCnt); - - if (ret != KERN_SUCCESS) - warning ("fetch_inferior_registers: %s ", - mach_error_string (ret)); -#if 0 - /* It may be more effective to store validate all of them, - * since we fetched them all anyway - */ - else if (regno != -1) - supply_register (regno, (char *)state+reg_offset[regno]); -#endif - else - { - for (index = 0; index < NUM_REGS; index++) - supply_register (index, (char *)state+reg_offset[index]); - } - - if (must_suspend_thread) - setup_thread (current_thread, 0); -} - -/* Store our register values back into the inferior. - * If REGNO is -1, do this for all registers. - * Otherwise, REGNO specifies which register - * - * On mach3 all registers are always saved in one call. - */ -void -store_inferior_registers (regno) - int regno; -{ - kern_return_t ret; - thread_state_data_t state; - unsigned int stateCnt = NS532_COMBINED_STATE_COUNT; - register int index; - - if (! MACH_PORT_VALID (current_thread)) - error ("store inferior registers: Invalid thread"); - - if (must_suspend_thread) - setup_thread (current_thread, 1); - - /* Fetch the state of the current thread */ - ret = thread_get_state (current_thread, - NS532_COMBINED_STATE, - state, - &stateCnt); - - if (ret != KERN_SUCCESS) - { - warning ("store_inferior_registers (get): %s", - mach_error_string (ret)); - if (must_suspend_thread) - setup_thread (current_thread, 0); - return; - } - - /* move gdb's registers to thread's state - * - * Since we save all registers anyway, save the ones - * that gdb thinks are valid (e.g. ignore the regno - * parameter) - */ -#if 0 - if (regno != -1) - STORE_REGS (state, regno, 1); - else -#endif - { - for (index = 0; index < NUM_REGS; index++) - STORE_REGS (state, index, 1); - } - - /* Write gdb's current view of register to the thread - */ - ret = thread_set_state (current_thread, - NS532_COMBINED_STATE, - state, - NS532_COMBINED_STATE_COUNT); - - if (ret != KERN_SUCCESS) - warning ("store_inferior_registers (set): %s", - mach_error_string (ret)); - - if (must_suspend_thread) - setup_thread (current_thread, 0); -} diff --git a/contrib/gdb/gdb/partial-stab.h b/contrib/gdb/gdb/partial-stab.h deleted file mode 100644 index d74c1c9ca5f44..0000000000000 --- a/contrib/gdb/gdb/partial-stab.h +++ /dev/null @@ -1,812 +0,0 @@ -/* Shared code to pre-read a stab (dbx-style), when building a psymtab. - Copyright 1986, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 1998 - Free Software Foundation, Inc. - -This file is part of GDB. - -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 2 of the License, 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ - -/* The following need to be defined: - SET_NAMESTRING() --Set namestring to name of symbol. - CUR_SYMBOL_TYPE --Type code of current symbol. - CUR_SYMBOL_VALUE --Value field of current symbol. May be adjusted here. - namestring - variable pointing to the name of the stab. - section_offsets - variable pointing to the section offsets. - pst - the partial symbol table being built. - - psymtab_include_list, includes_used, includes_allocated - list of include - file names (N_SOL) seen so far. - dependency_list, dependencies_used, dependencies_allocated - list of - N_EXCL stabs seen so far. - - END_PSYMTAB -- end a partial symbol table. - START_PSYMTAB -- start a partial symbol table. - */ - -/* End of macro definitions, now let's handle them symbols! */ - - switch (CUR_SYMBOL_TYPE) - { - char *p; - /* - * Standard, external, non-debugger, symbols - */ - - case N_TEXT | N_EXT: - case N_NBTEXT | N_EXT: - CUR_SYMBOL_VALUE += ANOFFSET (section_offsets, SECT_OFF_TEXT); - goto record_it; - - case N_DATA | N_EXT: - case N_NBDATA | N_EXT: - CUR_SYMBOL_VALUE += ANOFFSET (section_offsets, SECT_OFF_DATA); - goto record_it; - - case N_BSS: - case N_BSS | N_EXT: - case N_NBBSS | N_EXT: - case N_SETV | N_EXT: /* FIXME, is this in BSS? */ - CUR_SYMBOL_VALUE += ANOFFSET (section_offsets, SECT_OFF_BSS); - goto record_it; - - case N_ABS | N_EXT: - record_it: -#ifdef DBXREAD_ONLY - SET_NAMESTRING(); - - bss_ext_symbol: - record_minimal_symbol (namestring, CUR_SYMBOL_VALUE, - CUR_SYMBOL_TYPE, objfile); /* Always */ -#endif /* DBXREAD_ONLY */ - continue; - - /* Standard, local, non-debugger, symbols */ - - case N_NBTEXT: - - /* We need to be able to deal with both N_FN or N_TEXT, - because we have no way of knowing whether the sys-supplied ld - or GNU ld was used to make the executable. Sequents throw - in another wrinkle -- they renumbered N_FN. */ - - case N_FN: - case N_FN_SEQ: - case N_TEXT: -#ifdef DBXREAD_ONLY - CUR_SYMBOL_VALUE += ANOFFSET (section_offsets, SECT_OFF_TEXT); - SET_NAMESTRING(); - if ((namestring[0] == '-' && namestring[1] == 'l') - || (namestring [(nsl = strlen (namestring)) - 1] == 'o' - && namestring [nsl - 2] == '.')) - { - if (objfile -> ei.entry_point < CUR_SYMBOL_VALUE && - objfile -> ei.entry_point >= last_o_file_start) - { - objfile -> ei.entry_file_lowpc = last_o_file_start; - objfile -> ei.entry_file_highpc = CUR_SYMBOL_VALUE; - } - if (past_first_source_file && pst - /* The gould NP1 uses low values for .o and -l symbols - which are not the address. */ - && CUR_SYMBOL_VALUE >= pst->textlow) - { - END_PSYMTAB (pst, psymtab_include_list, includes_used, - symnum * symbol_size, - CUR_SYMBOL_VALUE > pst->texthigh - ? CUR_SYMBOL_VALUE : pst->texthigh, - dependency_list, dependencies_used, textlow_not_set); - pst = (struct partial_symtab *) 0; - includes_used = 0; - dependencies_used = 0; - } - else - past_first_source_file = 1; - last_o_file_start = CUR_SYMBOL_VALUE; - } - else - goto record_it; -#endif /* DBXREAD_ONLY */ - continue; - - case N_DATA: - CUR_SYMBOL_VALUE += ANOFFSET (section_offsets, SECT_OFF_DATA); - goto record_it; - - case N_UNDF | N_EXT: -#ifdef DBXREAD_ONLY - if (CUR_SYMBOL_VALUE != 0) { - /* This is a "Fortran COMMON" symbol. See if the target - environment knows where it has been relocated to. */ - - CORE_ADDR reladdr; - - SET_NAMESTRING(); - if (target_lookup_symbol (namestring, &reladdr)) { - continue; /* Error in lookup; ignore symbol for now. */ - } - CUR_SYMBOL_TYPE ^= (N_BSS^N_UNDF); /* Define it as a bss-symbol */ - CUR_SYMBOL_VALUE = reladdr; - goto bss_ext_symbol; - } -#endif /* DBXREAD_ONLY */ - continue; /* Just undefined, not COMMON */ - - case N_UNDF: -#ifdef DBXREAD_ONLY - if (processing_acc_compilation && CUR_SYMBOL_STRX == 1) { - /* Deal with relative offsets in the string table - used in ELF+STAB under Solaris. If we want to use the - n_strx field, which contains the name of the file, - we must adjust file_string_table_offset *before* calling - SET_NAMESTRING(). */ - past_first_source_file = 1; - file_string_table_offset = next_file_string_table_offset; - next_file_string_table_offset = - file_string_table_offset + CUR_SYMBOL_VALUE; - if (next_file_string_table_offset < file_string_table_offset) - error ("string table offset backs up at %d", symnum); - /* FIXME -- replace error() with complaint. */ - continue; - } -#endif /* DBXREAD_ONLY */ - continue; - - /* Lots of symbol types we can just ignore. */ - - case N_ABS: - case N_NBDATA: - case N_NBBSS: - continue; - - /* Keep going . . .*/ - - /* - * Special symbol types for GNU - */ - case N_INDR: - case N_INDR | N_EXT: - case N_SETA: - case N_SETA | N_EXT: - case N_SETT: - case N_SETT | N_EXT: - case N_SETD: - case N_SETD | N_EXT: - case N_SETB: - case N_SETB | N_EXT: - case N_SETV: - continue; - - /* - * Debugger symbols - */ - - case N_SO: { - unsigned long valu; - static int prev_so_symnum = -10; - static int first_so_symnum; - char *p; - int prev_textlow_not_set; - - valu = CUR_SYMBOL_VALUE + ANOFFSET (section_offsets, SECT_OFF_TEXT); - - prev_textlow_not_set = textlow_not_set; - -#ifdef SOFUN_ADDRESS_MAYBE_MISSING - /* A zero value is probably an indication for the SunPRO 3.0 - compiler. end_psymtab explicitly tests for zero, so - don't relocate it. */ - - if (CUR_SYMBOL_VALUE == 0) - { - textlow_not_set = 1; - valu = 0; - } - else - textlow_not_set = 0; -#else - textlow_not_set = 0; -#endif - past_first_source_file = 1; - - if (prev_so_symnum != symnum - 1) - { /* Here if prev stab wasn't N_SO */ - first_so_symnum = symnum; - - if (pst) - { - END_PSYMTAB (pst, psymtab_include_list, includes_used, - symnum * symbol_size, - valu > pst->texthigh ? valu : pst->texthigh, - dependency_list, dependencies_used, - prev_textlow_not_set); - pst = (struct partial_symtab *) 0; - includes_used = 0; - dependencies_used = 0; - } - } - - prev_so_symnum = symnum; - - /* End the current partial symtab and start a new one */ - - SET_NAMESTRING(); - - /* Null name means end of .o file. Don't start a new one. */ - if (*namestring == '\000') - continue; - - /* Some compilers (including gcc) emit a pair of initial N_SOs. - The first one is a directory name; the second the file name. - If pst exists, is empty, and has a filename ending in '/', - we assume the previous N_SO was a directory name. */ - - p = strrchr (namestring, '/'); - if (p && *(p+1) == '\000') - continue; /* Simply ignore directory name SOs */ - - /* Some other compilers (C++ ones in particular) emit useless - SOs for non-existant .c files. We ignore all subsequent SOs that - immediately follow the first. */ - - if (!pst) - pst = START_PSYMTAB (objfile, section_offsets, - namestring, valu, - first_so_symnum * symbol_size, - objfile -> global_psymbols.next, - objfile -> static_psymbols.next); - continue; - } - - case N_BINCL: - { -#ifdef DBXREAD_ONLY - enum language tmp_language; - /* Add this bincl to the bincl_list for future EXCLs. No - need to save the string; it'll be around until - read_dbx_symtab function returns */ - - SET_NAMESTRING(); - - tmp_language = deduce_language_from_filename (namestring); - - /* Only change the psymtab's language if we've learned - something useful (eg. tmp_language is not language_unknown). - In addition, to match what start_subfile does, never change - from C++ to C. */ - if (tmp_language != language_unknown - && (tmp_language != language_c - || psymtab_language != language_cplus)) - psymtab_language = tmp_language; - - if (pst == NULL) - { - /* FIXME: we should not get here without a PST to work on. - Attempt to recover. */ - complain (&unclaimed_bincl_complaint, namestring, symnum); - continue; - } - add_bincl_to_list (pst, namestring, CUR_SYMBOL_VALUE); - - /* Mark down an include file in the current psymtab */ - - goto record_include_file; - -#else /* DBXREAD_ONLY */ - continue; -#endif - } - - case N_SOL: - { - enum language tmp_language; - /* Mark down an include file in the current psymtab */ - - SET_NAMESTRING(); - - tmp_language = deduce_language_from_filename (namestring); - - /* Only change the psymtab's language if we've learned - something useful (eg. tmp_language is not language_unknown). - In addition, to match what start_subfile does, never change - from C++ to C. */ - if (tmp_language != language_unknown - && (tmp_language != language_c - || psymtab_language != language_cplus)) - psymtab_language = tmp_language; - - /* In C++, one may expect the same filename to come round many - times, when code is coming alternately from the main file - and from inline functions in other files. So I check to see - if this is a file we've seen before -- either the main - source file, or a previously included file. - - This seems to be a lot of time to be spending on N_SOL, but - things like "break c-exp.y:435" need to work (I - suppose the psymtab_include_list could be hashed or put - in a binary tree, if profiling shows this is a major hog). */ - if (pst && STREQ (namestring, pst->filename)) - continue; - { - register int i; - for (i = 0; i < includes_used; i++) - if (STREQ (namestring, psymtab_include_list[i])) - { - i = -1; - break; - } - if (i == -1) - continue; - } - -#ifdef DBXREAD_ONLY - record_include_file: -#endif - - psymtab_include_list[includes_used++] = namestring; - if (includes_used >= includes_allocated) - { - char **orig = psymtab_include_list; - - psymtab_include_list = (char **) - alloca ((includes_allocated *= 2) * - sizeof (char *)); - memcpy ((PTR)psymtab_include_list, (PTR)orig, - includes_used * sizeof (char *)); - } - continue; - } - case N_LSYM: /* Typedef or automatic variable. */ - case N_STSYM: /* Data seg var -- static */ - case N_LCSYM: /* BSS " */ - case N_ROSYM: /* Read-only data seg var -- static. */ - case N_NBSTS: /* Gould nobase. */ - case N_NBLCS: /* symbols. */ - case N_FUN: - case N_GSYM: /* Global (extern) variable; can be - data or bss (sigh FIXME). */ - - /* Following may probably be ignored; I'll leave them here - for now (until I do Pascal and Modula 2 extensions). */ - - case N_PC: /* I may or may not need this; I - suspect not. */ - case N_M2C: /* I suspect that I can ignore this here. */ - case N_SCOPE: /* Same. */ - - SET_NAMESTRING(); - -#ifdef DBXREAD_ONLY - /* See if this is an end of function stab. */ - if (CUR_SYMBOL_TYPE == N_FUN && *namestring == '\000') - { - unsigned long valu; - - /* It's value is the size (in bytes) of the function for - function relative stabs, or the address of the function's - end for old style stabs. */ - valu = CUR_SYMBOL_VALUE + last_function_start; - if (pst->texthigh == 0 || valu > pst->texthigh) - pst->texthigh = valu; - break; - } -#endif - - p = (char *) strchr (namestring, ':'); - if (!p) - continue; /* Not a debugging symbol. */ - - - - /* Main processing section for debugging symbols which - the initial read through the symbol tables needs to worry - about. If we reach this point, the symbol which we are - considering is definitely one we are interested in. - p must also contain the (valid) index into the namestring - which indicates the debugging type symbol. */ - - switch (p[1]) - { - case 'S': - CUR_SYMBOL_VALUE += ANOFFSET (section_offsets, SECT_OFF_DATA); -#ifdef STATIC_TRANSFORM_NAME - namestring = STATIC_TRANSFORM_NAME (namestring); -#endif - add_psymbol_to_list (namestring, p - namestring, - VAR_NAMESPACE, LOC_STATIC, - &objfile->static_psymbols, - 0, CUR_SYMBOL_VALUE, - psymtab_language, objfile); - continue; - case 'G': - CUR_SYMBOL_VALUE += ANOFFSET (section_offsets, SECT_OFF_DATA); - /* The addresses in these entries are reported to be - wrong. See the code that reads 'G's for symtabs. */ - add_psymbol_to_list (namestring, p - namestring, - VAR_NAMESPACE, LOC_STATIC, - &objfile->global_psymbols, - 0, CUR_SYMBOL_VALUE, - psymtab_language, objfile); - continue; - - case 'T': - if (p != namestring) /* a name is there, not just :T... */ - { - add_psymbol_to_list (namestring, p - namestring, - STRUCT_NAMESPACE, LOC_TYPEDEF, - &objfile->static_psymbols, - CUR_SYMBOL_VALUE, 0, - psymtab_language, objfile); - if (p[2] == 't') - { - /* Also a typedef with the same name. */ - add_psymbol_to_list (namestring, p - namestring, - VAR_NAMESPACE, LOC_TYPEDEF, - &objfile->static_psymbols, - CUR_SYMBOL_VALUE, 0, - psymtab_language, objfile); - p += 1; - } - /* The semantics of C++ state that "struct foo { ... }" - also defines a typedef for "foo". Unfortuantely, cfront - never makes the typedef when translating from C++ to C. - We make the typedef here so that "ptype foo" works as - expected for cfront translated code. */ - else if (psymtab_language == language_cplus) - { - /* Also a typedef with the same name. */ - add_psymbol_to_list (namestring, p - namestring, - VAR_NAMESPACE, LOC_TYPEDEF, - &objfile->static_psymbols, - CUR_SYMBOL_VALUE, 0, - psymtab_language, objfile); - } - } - goto check_enum; - case 't': - if (p != namestring) /* a name is there, not just :T... */ - { - add_psymbol_to_list (namestring, p - namestring, - VAR_NAMESPACE, LOC_TYPEDEF, - &objfile->static_psymbols, - CUR_SYMBOL_VALUE, 0, - psymtab_language, objfile); - } - check_enum: - /* If this is an enumerated type, we need to - add all the enum constants to the partial symbol - table. This does not cover enums without names, e.g. - "enum {a, b} c;" in C, but fortunately those are - rare. There is no way for GDB to find those from the - enum type without spending too much time on it. Thus - to solve this problem, the compiler needs to put out the - enum in a nameless type. GCC2 does this. */ - - /* We are looking for something of the form - <name> ":" ("t" | "T") [<number> "="] "e" - {<constant> ":" <value> ","} ";". */ - - /* Skip over the colon and the 't' or 'T'. */ - p += 2; - /* This type may be given a number. Also, numbers can come - in pairs like (0,26). Skip over it. */ - while ((*p >= '0' && *p <= '9') - || *p == '(' || *p == ',' || *p == ')' - || *p == '=') - p++; - - if (*p++ == 'e') - { - /* The aix4 compiler emits extra crud before the members. */ - if (*p == '-') - { - /* Skip over the type (?). */ - while (*p != ':') - p++; - - /* Skip over the colon. */ - p++; - } - - /* We have found an enumerated type. */ - /* According to comments in read_enum_type - a comma could end it instead of a semicolon. - I don't know where that happens. - Accept either. */ - while (*p && *p != ';' && *p != ',') - { - char *q; - - /* Check for and handle cretinous dbx symbol name - continuation! */ - if (*p == '\\' || (*p == '?' && p[1] == '\0')) - p = next_symbol_text (objfile); - - /* Point to the character after the name - of the enum constant. */ - for (q = p; *q && *q != ':'; q++) - ; - /* Note that the value doesn't matter for - enum constants in psymtabs, just in symtabs. */ - add_psymbol_to_list (p, q - p, - VAR_NAMESPACE, LOC_CONST, - &objfile->static_psymbols, 0, - 0, psymtab_language, objfile); - /* Point past the name. */ - p = q; - /* Skip over the value. */ - while (*p && *p != ',') - p++; - /* Advance past the comma. */ - if (*p) - p++; - } - } - continue; - case 'c': - /* Constant, e.g. from "const" in Pascal. */ - add_psymbol_to_list (namestring, p - namestring, - VAR_NAMESPACE, LOC_CONST, - &objfile->static_psymbols, CUR_SYMBOL_VALUE, - 0, psymtab_language, objfile); - continue; - - case 'f': - CUR_SYMBOL_VALUE += ANOFFSET (section_offsets, SECT_OFF_TEXT); -#ifdef DBXREAD_ONLY - /* Keep track of the start of the last function so we - can handle end of function symbols. */ - last_function_start = CUR_SYMBOL_VALUE; - /* Kludges for ELF/STABS with Sun ACC */ - last_function_name = namestring; -#ifdef SOFUN_ADDRESS_MAYBE_MISSING - /* Do not fix textlow==0 for .o or NLM files, as 0 is a legit - value for the bottom of the text seg in those cases. */ - if (pst && textlow_not_set) - { - pst->textlow = - find_stab_function_addr (namestring, pst, objfile); - textlow_not_set = 0; - } -#endif -#if 0 - if (startup_file_end == 0) - startup_file_end = CUR_SYMBOL_VALUE; -#endif - /* End kludge. */ - - /* In reordered executables this function may lie outside - the bounds created by N_SO symbols. If that's the case - use the address of this function as the low bound for - the partial symbol table. */ - if (textlow_not_set - || (CUR_SYMBOL_VALUE < pst->textlow - && CUR_SYMBOL_VALUE - != ANOFFSET (section_offsets, SECT_OFF_TEXT))) - { - pst->textlow = CUR_SYMBOL_VALUE; - textlow_not_set = 0; - } -#endif /* DBXREAD_ONLY */ - add_psymbol_to_list (namestring, p - namestring, - VAR_NAMESPACE, LOC_BLOCK, - &objfile->static_psymbols, - 0, CUR_SYMBOL_VALUE, - psymtab_language, objfile); - continue; - - /* Global functions were ignored here, but now they - are put into the global psymtab like one would expect. - They're also in the minimal symbol table. */ - case 'F': - CUR_SYMBOL_VALUE += ANOFFSET (section_offsets, SECT_OFF_TEXT); -#ifdef DBXREAD_ONLY - /* Keep track of the start of the last function so we - can handle end of function symbols. */ - last_function_start = CUR_SYMBOL_VALUE; - /* Kludges for ELF/STABS with Sun ACC */ - last_function_name = namestring; -#ifdef SOFUN_ADDRESS_MAYBE_MISSING - /* Do not fix textlow==0 for .o or NLM files, as 0 is a legit - value for the bottom of the text seg in those cases. */ - if (pst && textlow_not_set) - { - pst->textlow = - find_stab_function_addr (namestring, pst, objfile); - textlow_not_set = 0; - } -#endif -#if 0 - if (startup_file_end == 0) - startup_file_end = CUR_SYMBOL_VALUE; -#endif - /* End kludge. */ - /* In reordered executables this function may lie outside - the bounds created by N_SO symbols. If that's the case - use the address of this function as the low bound for - the partial symbol table. */ - if (textlow_not_set - || (CUR_SYMBOL_VALUE < pst->textlow - && CUR_SYMBOL_VALUE - != ANOFFSET (section_offsets, SECT_OFF_TEXT))) - { - pst->textlow = CUR_SYMBOL_VALUE; - textlow_not_set = 0; - } -#endif /* DBXREAD_ONLY */ - add_psymbol_to_list (namestring, p - namestring, - VAR_NAMESPACE, LOC_BLOCK, - &objfile->global_psymbols, - 0, CUR_SYMBOL_VALUE, - psymtab_language, objfile); - continue; - - /* Two things show up here (hopefully); static symbols of - local scope (static used inside braces) or extensions - of structure symbols. We can ignore both. */ - case 'V': - case '(': - case '0': - case '1': - case '2': - case '3': - case '4': - case '5': - case '6': - case '7': - case '8': - case '9': - case '-': - case '#': /* for symbol identification (used in live ranges) */ - /* added to support cfront stabs strings */ - case 'Z': /* for definition continuations */ - case 'P': /* for prototypes */ - continue; - - case ':': - /* It is a C++ nested symbol. We don't need to record it - (I don't think); if we try to look up foo::bar::baz, - then symbols for the symtab containing foo should get - read in, I think. */ - /* Someone says sun cc puts out symbols like - /foo/baz/maclib::/usr/local/bin/maclib, - which would get here with a symbol type of ':'. */ - continue; - - default: - /* Unexpected symbol descriptor. The second and subsequent stabs - of a continued stab can show up here. The question is - whether they ever can mimic a normal stab--it would be - nice if not, since we certainly don't want to spend the - time searching to the end of every string looking for - a backslash. */ - - complain (&unknown_symchar_complaint, p[1]); - - /* Ignore it; perhaps it is an extension that we don't - know about. */ - continue; - } - - case N_EXCL: -#ifdef DBXREAD_ONLY - - SET_NAMESTRING(); - - /* Find the corresponding bincl and mark that psymtab on the - psymtab dependency list */ - { - struct partial_symtab *needed_pst = - find_corresponding_bincl_psymtab (namestring, CUR_SYMBOL_VALUE); - - /* If this include file was defined earlier in this file, - leave it alone. */ - if (needed_pst == pst) continue; - - if (needed_pst) - { - int i; - int found = 0; - - for (i = 0; i < dependencies_used; i++) - if (dependency_list[i] == needed_pst) - { - found = 1; - break; - } - - /* If it's already in the list, skip the rest. */ - if (found) continue; - - dependency_list[dependencies_used++] = needed_pst; - if (dependencies_used >= dependencies_allocated) - { - struct partial_symtab **orig = dependency_list; - dependency_list = - (struct partial_symtab **) - alloca ((dependencies_allocated *= 2) - * sizeof (struct partial_symtab *)); - memcpy ((PTR)dependency_list, (PTR)orig, - (dependencies_used - * sizeof (struct partial_symtab *))); -#ifdef DEBUG_INFO - fprintf_unfiltered (gdb_stderr, "Had to reallocate dependency list.\n"); - fprintf_unfiltered (gdb_stderr, "New dependencies allocated: %d\n", - dependencies_allocated); -#endif - } - } - } -#endif /* DBXREAD_ONLY */ - continue; - - case N_ENDM: -#ifdef SOFUN_ADDRESS_MAYBE_MISSING - /* Solaris 2 end of module, finish current partial symbol table. - END_PSYMTAB will set pst->texthigh to the proper value, which - is necessary if a module compiled without debugging info - follows this module. */ - if (pst) - { - END_PSYMTAB (pst, psymtab_include_list, includes_used, - symnum * symbol_size, - (CORE_ADDR) 0, - dependency_list, dependencies_used, textlow_not_set); - pst = (struct partial_symtab *) 0; - includes_used = 0; - dependencies_used = 0; - } -#endif - continue; - - case N_RBRAC: -#ifdef HANDLE_RBRAC - HANDLE_RBRAC(CUR_SYMBOL_VALUE); - continue; -#endif - case N_EINCL: - case N_DSLINE: - case N_BSLINE: - case N_SSYM: /* Claim: Structure or union element. - Hopefully, I can ignore this. */ - case N_ENTRY: /* Alternate entry point; can ignore. */ - case N_MAIN: /* Can definitely ignore this. */ - case N_CATCH: /* These are GNU C++ extensions */ - case N_EHDECL: /* that can safely be ignored here. */ - case N_LENG: - case N_BCOMM: - case N_ECOMM: - case N_ECOML: - case N_FNAME: - case N_SLINE: - case N_RSYM: - case N_PSYM: - case N_LBRAC: - case N_NSYMS: /* Ultrix 4.0: symbol count */ - case N_DEFD: /* GNU Modula-2 */ - case N_ALIAS: /* SunPro F77: alias name, ignore for now. */ - - case N_OBJ: /* useless types from Solaris */ - case N_OPT: - /* These symbols aren't interesting; don't worry about them */ - - continue; - - default: - /* If we haven't found it yet, ignore it. It's probably some - new type we don't know about yet. */ - complain (&unknown_symtype_complaint, - local_hex_string (CUR_SYMBOL_TYPE)); - continue; - } diff --git a/contrib/gdb/gdb/pyr-tdep.c b/contrib/gdb/gdb/pyr-tdep.c deleted file mode 100644 index 85e9a072f3c49..0000000000000 --- a/contrib/gdb/gdb/pyr-tdep.c +++ /dev/null @@ -1,452 +0,0 @@ -/* Pyramid target-dependent code for GDB. - Copyright (C) 1988, 1989, 1991 Free Software Foundation, Inc. - -This file is part of GDB. - -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 2 of the License, 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ - -#include "defs.h" - -/*** Prettier register printing. ***/ - -/* Print registers in the same format as pyramid's dbx, adb, sdb. */ -pyr_print_registers(reg_buf, regnum) - long *reg_buf[]; -{ - register int regno; - int usp, ksp; - struct user u; - - for (regno = 0; regno < 16; regno++) { - printf_unfiltered/*_filtered*/ ("%6.6s: %8x %6.6s: %8x %6s: %8x %6s: %8x\n", - REGISTER_NAME (regno), reg_buf[regno], - REGISTER_NAME (regno+16), reg_buf[regno+16], - REGISTER_NAME (regno+32), reg_buf[regno+32], - REGISTER_NAME (regno+48), reg_buf[regno+48]); - } - usp = ptrace (3, inferior_pid, - (PTRACE_ARG3_TYPE) ((char *)&u.u_pcb.pcb_usp) - - ((char *)&u), 0); - ksp = ptrace (3, inferior_pid, - (PTRACE_ARG3_TYPE) ((char *)&u.u_pcb.pcb_ksp) - - ((char *)&u), 0); - printf_unfiltered/*_filtered*/ ("\n%6.6s: %8x %6.6s: %8x (%08x) %6.6s %8x\n", - REGISTER_NAME (CSP_REGNUM),reg_buf[CSP_REGNUM], - REGISTER_NAME (KSP_REGNUM), reg_buf[KSP_REGNUM], ksp, - "usp", usp); -} - -/* Print the register regnum, or all registers if regnum is -1. - fpregs is currently ignored. */ - -pyr_do_registers_info (regnum, fpregs) - int regnum; - int fpregs; -{ - /* On a pyr, we know a virtual register can always fit in an long. - Here (and elsewhere) we take advantage of that. Yuk. */ - long raw_regs[MAX_REGISTER_RAW_SIZE*NUM_REGS]; - register int i; - - for (i = 0 ; i < 64 ; i++) { - read_relative_register_raw_bytes(i, raw_regs+i); - } - if (regnum == -1) - pyr_print_registers (raw_regs, regnum); - else - for (i = 0; i < NUM_REGS; i++) - if (i == regnum) { - long val = raw_regs[i]; - - fputs_filtered (REGISTER_NAME (i), gdb_stdout); - printf_filtered(":"); - print_spaces_filtered (6 - strlen (REGISTER_NAME (i)), gdb_stdout); - if (val == 0) - printf_filtered ("0"); - else - printf_filtered ("%s %d", local_hex_string_custom(val,"08"), val); - printf_filtered("\n"); - } -} - -/*** Debugging editions of various macros from m-pyr.h ****/ - -CORE_ADDR frame_locals_address (frame) - struct frame_info *frame; -{ - register int addr = find_saved_register (frame,CFP_REGNUM); - register int result = read_memory_integer (addr, 4); -#ifdef PYRAMID_CONTROL_FRAME_DEBUGGING - fprintf_unfiltered (gdb_stderr, - "\t[[..frame_locals:%8x, %s= %x @%x fcfp= %x foo= %x\n\t gr13=%x pr13=%x tr13=%x @%x]]\n", - frame->frame, - REGISTER_NAME (CFP_REGNUM), - result, addr, - frame->frame_cfp, (CFP_REGNUM), - - - read_register(13), read_register(29), read_register(61), - find_saved_register(frame, 61)); -#endif /* PYRAMID_CONTROL_FRAME_DEBUGGING */ - - /* FIXME: I thought read_register (CFP_REGNUM) should be the right answer; - or at least CFP_REGNUM relative to FRAME (ie, result). - There seems to be a bug in the way the innermost frame is set up. */ - - return ((frame->next) ? result: frame->frame_cfp); -} - -CORE_ADDR frame_args_addr (frame) - struct frame_info *frame; -{ - register int addr = find_saved_register (frame,CFP_REGNUM); - register int result = read_memory_integer (addr, 4); - -#ifdef PYRAMID_CONTROL_FRAME_DEBUGGING - fprintf_unfiltered (gdb_stderr, - "\t[[..frame_args:%8x, %s= %x @%x fcfp= %x r_r= %x\n\t gr13=%x pr13=%x tr13=%x @%x]]\n", - frame->frame, - REGISTER_NAME (CFP_REGNUM), - result, addr, - frame->frame_cfp, read_register(CFP_REGNUM), - - read_register(13), read_register(29), read_register(61), - find_saved_register(frame, 61)); -#endif /* PYRAMID_CONTROL_FRAME_DEBUGGING */ - - /* FIXME: I thought read_register (CFP_REGNUM) should be the right answer; - or at least CFP_REGNUM relative to FRAME (ie, result). - There seems to be a bug in the way the innermost frame is set up. */ - return ((frame->next) ? result: frame->frame_cfp); -} - -#include "symtab.h" -#include "opcode/pyr.h" -#include "gdbcore.h" - - -/* A couple of functions used for debugging frame-handling on - Pyramids. (The Pyramid-dependent handling of register values for - windowed registers is known to be buggy.) - - When debugging, these functions can supplant the normal definitions of some - of the macros in tm-pyramid.h The quantity of information produced - when these functions are used makes the gdb unusable as a - debugger for user programs. */ - -extern unsigned pyr_saved_pc(), pyr_frame_chain(); - -CORE_ADDR pyr_frame_chain(frame) - CORE_ADDR frame; -{ - int foo=frame - CONTROL_STACK_FRAME_SIZE; - /* printf_unfiltered ("...following chain from %x: got %x\n", frame, foo);*/ - return foo; -} - -CORE_ADDR pyr_saved_pc(frame) - CORE_ADDR frame; -{ - int foo=0; - foo = read_memory_integer (((CORE_ADDR)(frame))+60, 4); - printf_unfiltered ("..reading pc from frame 0x%0x+%d regs: got %0x\n", - frame, 60/4, foo); - return foo; -} - -/* Pyramid instructions are never longer than this many bytes. */ -#define MAXLEN 24 - -/* Number of elements in the opcode table. */ -/*const*/ static int nopcodes = (sizeof (pyr_opcodes) / sizeof( pyr_opcodes[0])); -#define NOPCODES (nopcodes) - -/* Let's be byte-independent so we can use this as a cross-assembler. */ - -#define NEXTLONG(p) \ - (p += 4, (((((p[-4] << 8) + p[-3]) << 8) + p[-2]) << 8) + p[-1]) - -/* Print one instruction at address MEMADDR in debugged memory, - on STREAM. Returns length of the instruction, in bytes. */ - -int -pyr_print_insn (memaddr, stream) - CORE_ADDR memaddr; - GDB_FILE *stream; -{ - unsigned char buffer[MAXLEN]; - register int i, nargs, insn_size =4; - register unsigned char *p; - register char *d; - register int insn_opcode, operand_mode; - register int index_multiplier, index_reg_regno, op_1_regno, op_2_regno ; - long insn; /* first word of the insn, not broken down. */ - pyr_insn_format insn_decode; /* the same, broken out into op{code,erands} */ - long extra_1, extra_2; - - read_memory (memaddr, buffer, MAXLEN); - insn_decode = *((pyr_insn_format *) buffer); - insn = * ((int *) buffer); - insn_opcode = insn_decode.operator; - operand_mode = insn_decode.mode; - index_multiplier = insn_decode.index_scale; - index_reg_regno = insn_decode.index_reg; - op_1_regno = insn_decode.operand_1; - op_2_regno = insn_decode.operand_2; - - - if (*((int *)buffer) == 0x0) { - /* "halt" looks just like an invalid "jump" to the insn decoder, - so is dealt with as a special case */ - fprintf_unfiltered (stream, "halt"); - return (4); - } - - for (i = 0; i < NOPCODES; i++) - if (pyr_opcodes[i].datum.code == insn_opcode) - break; - - if (i == NOPCODES) - /* FIXME: Handle unrecognised instructions better. */ - fprintf_unfiltered (stream, "???\t#%08x\t(op=%x mode =%x)", - insn, insn_decode.operator, insn_decode.mode); - else - { - /* Print the mnemonic for the instruction. Pyramid insn operands - are so regular that we can deal with almost all of them - separately. - Unconditional branches are an exception: they are encoded as - conditional branches (branch if false condition, I think) - with no condition specified. The average user will not be - aware of this. To maintain their illusion that an - unconditional branch insn exists, we will have to FIXME to - treat the insn mnemnonic of all branch instructions here as a - special case: check the operands of branch insn and print an - appropriate mnemonic. */ - - fprintf_unfiltered (stream, "%s\t", pyr_opcodes[i].name); - - /* Print the operands of the insn (as specified in - insn.operand_mode). - Branch operands of branches are a special case: they are a word - offset, not a byte offset. */ - - if (insn_decode.operator == 0x01 || insn_decode.operator == 0x02) { - register int bit_codes=(insn >> 16)&0xf; - register int i; - register int displacement = (insn & 0x0000ffff) << 2; - - static char cc_bit_names[] = "cvzn"; /* z,n,c,v: strange order? */ - - /* Is bfc and no bits specified an unconditional branch?*/ - for (i=0;i<4;i++) { - if ((bit_codes) & 0x1) - fputc_unfiltered (cc_bit_names[i], stream); - bit_codes >>= 1; - } - - fprintf_unfiltered (stream, ",%0x", - displacement + memaddr); - return (insn_size); - } - - switch (operand_mode) { - case 0: - fprintf_unfiltered (stream, "%s,%s", - REGISTER_NAME (op_1_regno), - REGISTER_NAME (op_2_regno)); - break; - - case 1: - fprintf_unfiltered (stream, " 0x%0x,%s", - op_1_regno, - REGISTER_NAME (op_2_regno)); - break; - - case 2: - read_memory (memaddr+4, buffer, MAXLEN); - insn_size += 4; - extra_1 = * ((int *) buffer); - fprintf_unfiltered (stream, " $0x%0x,%s", - extra_1, - REGISTER_NAME (op_2_regno)); - break; - case 3: - fprintf_unfiltered (stream, " (%s),%s", - REGISTER_NAME (op_1_regno), - REGISTER_NAME (op_2_regno)); - break; - - case 4: - read_memory (memaddr+4, buffer, MAXLEN); - insn_size += 4; - extra_1 = * ((int *) buffer); - fprintf_unfiltered (stream, " 0x%0x(%s),%s", - extra_1, - REGISTER_NAME (op_1_regno), - REGISTER_NAME (op_2_regno)); - break; - - /* S1 destination mode */ - case 5: - fprintf_unfiltered (stream, - ((index_reg_regno) ? "%s,(%s)[%s*%1d]" : "%s,(%s)"), - REGISTER_NAME (op_1_regno), - REGISTER_NAME (op_2_regno), - REGISTER_NAME (index_reg_regno), - index_multiplier); - break; - - case 6: - fprintf_unfiltered (stream, - ((index_reg_regno) ? " $%#0x,(%s)[%s*%1d]" - : " $%#0x,(%s)"), - op_1_regno, - REGISTER_NAME (op_2_regno), - REGISTER_NAME (index_reg_regno), - index_multiplier); - break; - - case 7: - read_memory (memaddr+4, buffer, MAXLEN); - insn_size += 4; - extra_1 = * ((int *) buffer); - fprintf_unfiltered (stream, - ((index_reg_regno) ? " $%#0x,(%s)[%s*%1d]" - : " $%#0x,(%s)"), - extra_1, - REGISTER_NAME (op_2_regno), - REGISTER_NAME (index_reg_regno), - index_multiplier); - break; - - case 8: - fprintf_unfiltered (stream, - ((index_reg_regno) ? " (%s),(%s)[%s*%1d]" : " (%s),(%s)"), - REGISTER_NAME (op_1_regno), - REGISTER_NAME (op_2_regno), - REGISTER_NAME (index_reg_regno), - index_multiplier); - break; - - case 9: - read_memory (memaddr+4, buffer, MAXLEN); - insn_size += 4; - extra_1 = * ((int *) buffer); - fprintf_unfiltered (stream, - ((index_reg_regno) - ? "%#0x(%s),(%s)[%s*%1d]" - : "%#0x(%s),(%s)"), - extra_1, - REGISTER_NAME (op_1_regno), - REGISTER_NAME (op_2_regno), - REGISTER_NAME (index_reg_regno), - index_multiplier); - break; - - /* S2 destination mode */ - case 10: - read_memory (memaddr+4, buffer, MAXLEN); - insn_size += 4; - extra_1 = * ((int *) buffer); - fprintf_unfiltered (stream, - ((index_reg_regno) ? "%s,%#0x(%s)[%s*%1d]" : "%s,%#0x(%s)"), - REGISTER_NAME (op_1_regno), - extra_1, - REGISTER_NAME (op_2_regno), - REGISTER_NAME (index_reg_regno), - index_multiplier); - break; - case 11: - read_memory (memaddr+4, buffer, MAXLEN); - insn_size += 4; - extra_1 = * ((int *) buffer); - fprintf_unfiltered (stream, - ((index_reg_regno) ? - " $%#0x,%#0x(%s)[%s*%1d]" : " $%#0x,%#0x(%s)"), - op_1_regno, - extra_1, - REGISTER_NAME (op_2_regno), - REGISTER_NAME (index_reg_regno), - index_multiplier); - break; - case 12: - read_memory (memaddr+4, buffer, MAXLEN); - insn_size += 4; - extra_1 = * ((int *) buffer); - read_memory (memaddr+8, buffer, MAXLEN); - insn_size += 4; - extra_2 = * ((int *) buffer); - fprintf_unfiltered (stream, - ((index_reg_regno) ? - " $%#0x,%#0x(%s)[%s*%1d]" : " $%#0x,%#0x(%s)"), - extra_1, - extra_2, - REGISTER_NAME (op_2_regno), - REGISTER_NAME (index_reg_regno), - index_multiplier); - break; - - case 13: - read_memory (memaddr+4, buffer, MAXLEN); - insn_size += 4; - extra_1 = * ((int *) buffer); - fprintf_unfiltered (stream, - ((index_reg_regno) - ? " (%s),%#0x(%s)[%s*%1d]" - : " (%s),%#0x(%s)"), - REGISTER_NAME (op_1_regno), - extra_1, - REGISTER_NAME (op_2_regno), - REGISTER_NAME (index_reg_regno), - index_multiplier); - break; - case 14: - read_memory (memaddr+4, buffer, MAXLEN); - insn_size += 4; - extra_1 = * ((int *) buffer); - read_memory (memaddr+8, buffer, MAXLEN); - insn_size += 4; - extra_2 = * ((int *) buffer); - fprintf_unfiltered (stream, - ((index_reg_regno) ? "%#0x(%s),%#0x(%s)[%s*%1d]" - : "%#0x(%s),%#0x(%s) "), - extra_1, - REGISTER_NAME (op_1_regno), - extra_2, - REGISTER_NAME (op_2_regno), - REGISTER_NAME (index_reg_regno), - index_multiplier); - break; - - default: - fprintf_unfiltered (stream, - ((index_reg_regno) ? "%s,%s [%s*%1d]" : "%s,%s"), - REGISTER_NAME (op_1_regno), - REGISTER_NAME (op_2_regno), - REGISTER_NAME (index_reg_regno), - index_multiplier); - fprintf_unfiltered (stream, - "\t\t# unknown mode in %08x", - insn); - break; - } /* switch */ - } - - { - return insn_size; - } - abort (); -} diff --git a/contrib/gdb/gdb/pyr-xdep.c b/contrib/gdb/gdb/pyr-xdep.c deleted file mode 100644 index dd6d9a92400e5..0000000000000 --- a/contrib/gdb/gdb/pyr-xdep.c +++ /dev/null @@ -1,370 +0,0 @@ -/* Low level Pyramid interface to ptrace, for GDB when running under Unix. - Copyright (C) 1988, 1989, 1991 Free Software Foundation, Inc. - -This file is part of GDB. - -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 2 of the License, 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ - -#include "defs.h" -#include "frame.h" -#include "inferior.h" - -#include <sys/param.h> -#include <sys/dir.h> -#include <signal.h> -#include <sys/ioctl.h> -/* #include <fcntl.h> Can we live without this? */ - -#include "gdbcore.h" -#include <sys/user.h> /* After a.out.h */ -#include <sys/file.h> -#include "gdb_stat.h" - - -void -fetch_inferior_registers (regno) - int regno; -{ - register int datum; - register unsigned int regaddr; - int reg_buf[NUM_REGS+1]; - struct user u; - register int skipped_frames = 0; - - registers_fetched (); - - for (regno = 0; regno < 64; regno++) { - reg_buf[regno] = ptrace (3, inferior_pid, (PTRACE_ARG3_TYPE) regno, 0); - -#if defined(PYRAMID_CONTROL_FRAME_DEBUGGING) - printf_unfiltered ("Fetching register %s, got %0x\n", - REGISTER_NAME (regno), - reg_buf[regno]); -#endif /* PYRAMID_CONTROL_FRAME_DEBUGGING */ - - if (reg_buf[regno] == -1 && errno == EIO) { - printf_unfiltered("fetch_interior_registers: fetching register %s\n", - REGISTER_NAME (regno)); - errno = 0; - } - supply_register (regno, reg_buf+regno); - } - /* that leaves regs 64, 65, and 66 */ - datum = ptrace (3, inferior_pid, - (PTRACE_ARG3_TYPE) (((char *)&u.u_pcb.pcb_csp) - - ((char *)&u)), 0); - - - - /* FIXME: Find the Current Frame Pointer (CFP). CFP is a global - register (ie, NOT windowed), that gets saved in a frame iff - the code for that frame has a prologue (ie, "adsf N"). If - there is a prologue, the adsf insn saves the old cfp in - pr13, cfp is set to sp, and N bytes of locals are allocated - (sp is decremented by n). - This makes finding CFP hard. I guess the right way to do it - is: - - If this is the innermost frame, believe ptrace() or - the core area. - - Otherwise: - Find the first insn of the current frame. - - find the saved pc; - - find the call insn that saved it; - - figure out where the call is to; - - if the first insn is an adsf, we got a frame - pointer. */ - - - /* Normal processors have separate stack pointers for user and - kernel mode. Getting the last user mode frame on such - machines is easy: the kernel context of the ptrace()'d - process is on the kernel stack, and the USP points to what - we want. But Pyramids only have a single cfp for both user and - kernel mode. And processes being ptrace()'d have some - kernel-context control frames on their stack. - To avoid tracing back into the kernel context of an inferior, - we skip 0 or more contiguous control frames where the pc is - in the kernel. */ - - while (1) { - register int inferior_saved_pc; - inferior_saved_pc = ptrace (1, inferior_pid, - (PTRACE_ARG3_TYPE) (datum+((32+15)*4)), 0); - if (inferior_saved_pc > 0) break; -#if defined(PYRAMID_CONTROL_FRAME_DEBUGGING) - printf_unfiltered("skipping kernel frame %08x, pc=%08x\n", datum, - inferior_saved_pc); -#endif /* PYRAMID_CONTROL_FRAME_DEBUGGING */ - skipped_frames++; - datum -= CONTROL_STACK_FRAME_SIZE; - } - - reg_buf[CSP_REGNUM] = datum; - supply_register(CSP_REGNUM, reg_buf+CSP_REGNUM); -#ifdef PYRAMID_CONTROL_FRAME_DEBUGGING - if (skipped_frames) { - fprintf_unfiltered (gdb_stderr, - "skipped %d frames from %x to %x; cfp was %x, now %x\n", - skipped_frames, reg_buf[CSP_REGNUM]); - } -#endif /* PYRAMID_CONTROL_FRAME_DEBUGGING */ -} - -/* Store our register values back into the inferior. - If REGNO is -1, do this for all registers. - Otherwise, REGNO specifies which register (so we can save time). */ - -void -store_inferior_registers (regno) - int regno; -{ - register unsigned int regaddr; - char buf[80]; - - if (regno >= 0) - { - if ((0 <= regno) && (regno < 64)) { - /*regaddr = register_addr (regno, offset);*/ - regaddr = regno; - errno = 0; - ptrace (6, inferior_pid, (PTRACE_ARG3_TYPE) regaddr, - read_register (regno)); - if (errno != 0) - { - sprintf (buf, "writing register number %d", regno); - perror_with_name (buf); - } - } - } - else - { - for (regno = 0; regno < NUM_REGS; regno++) - { - /*regaddr = register_addr (regno, offset);*/ - regaddr = regno; - errno = 0; - ptrace (6, inferior_pid, (PTRACE_ARG3_TYPE) regaddr, - read_register (regno)); - if (errno != 0) - { - sprintf (buf, "writing all regs, number %d", regno); - perror_with_name (buf); - } - } -} - -/*** Extensions to core and dump files, for GDB. */ - -extern unsigned int last_frame_offset; - -#ifdef PYRAMID_CORE - -/* Can't make definitions here static, since corefile.c needs them - to do bounds checking on the core-file areas. O well. */ - -/* have two stacks: one for data, one for register windows. */ -extern CORE_ADDR reg_stack_start; -extern CORE_ADDR reg_stack_end; - -/* need this so we can find the global registers: they never get saved. */ -CORE_ADDR global_reg_offset; -static CORE_ADDR last_frame_address; -CORE_ADDR last_frame_offset; - - -/* Address in core file of start of register window stack area. - Don't know if is this any of meaningful, useful or necessary. */ -extern int reg_stack_offset; - -#endif /* PYRAMID_CORE */ - - -/* Work with core dump and executable files, for GDB. - This code would be in corefile.c if it weren't machine-dependent. */ - -void -core_file_command (filename, from_tty) - char *filename; - int from_tty; -{ - int val; - extern char registers[]; - - /* Discard all vestiges of any previous core file - and mark data and stack spaces as empty. */ - - if (corefile) - free (corefile); - corefile = 0; - - if (corechan >= 0) - close (corechan); - corechan = -1; - - data_start = 0; - data_end = 0; - stack_start = STACK_END_ADDR; - stack_end = STACK_END_ADDR; - -#ifdef PYRAMID_CORE - reg_stack_start = CONTROL_STACK_ADDR; - reg_stack_end = CONTROL_STACK_ADDR; /* this isn't strictly true...*/ -#endif /* PYRAMID_CORE */ - - /* Now, if a new core file was specified, open it and digest it. */ - - if (filename) - { - filename = tilde_expand (filename); - make_cleanup (free, filename); - - if (have_inferior_p ()) - error ("To look at a core file, you must kill the program with \"kill\"."); - corechan = open (filename, O_RDONLY, 0); - if (corechan < 0) - perror_with_name (filename); - /* 4.2-style (and perhaps also sysV-style) core dump file. */ - { - struct user u; - - unsigned int reg_offset; - - val = myread (corechan, &u, sizeof u); - if (val < 0) - perror_with_name ("Not a core file: reading upage"); - if (val != sizeof u) - error ("Not a core file: could only read %d bytes", val); - data_start = exec_data_start; - - data_end = data_start + NBPG * u.u_dsize; - data_offset = NBPG * UPAGES; - stack_offset = NBPG * (UPAGES + u.u_dsize); - - /* find registers in core file */ -#ifdef PYRAMID_PTRACE - stack_start = stack_end - NBPG * u.u_ussize; - reg_stack_offset = stack_offset + (NBPG *u.u_ussize); - reg_stack_end = reg_stack_start + NBPG * u.u_cssize; - - last_frame_address = ((int) u.u_pcb.pcb_csp); - last_frame_offset = reg_stack_offset + last_frame_address - - CONTROL_STACK_ADDR ; - global_reg_offset = (char *)&u - (char *)&u.u_pcb.pcb_gr0 ; - - /* skip any control-stack frames that were executed in the - kernel. */ - - while (1) { - char buf[4]; - val = lseek (corechan, last_frame_offset+(47*4), 0); - if (val < 0) - perror_with_name (filename); - val = myread (corechan, buf, sizeof buf); - if (val < 0) - perror_with_name (filename); - - if (*(int *)buf >= 0) - break; - printf_unfiltered ("skipping frame %s\n", local_hex_string (last_frame_address)); - last_frame_offset -= CONTROL_STACK_FRAME_SIZE; - last_frame_address -= CONTROL_STACK_FRAME_SIZE; - } - reg_offset = last_frame_offset; - -#if 1 || defined(PYRAMID_CONTROL_FRAME_DEBUGGING) - printf_unfiltered ("Control stack pointer = %s\n", - local_hex_string (u.u_pcb.pcb_csp)); - printf_unfiltered ("offset to control stack %d outermost frame %d (%s)\n", - reg_stack_offset, reg_offset, local_hex_string (last_frame_address)); -#endif /* PYRAMID_CONTROL_FRAME_DEBUGGING */ - -#else /* not PYRAMID_CORE */ - stack_start = stack_end - NBPG * u.u_ssize; - reg_offset = (int) u.u_ar0 - KERNEL_U_ADDR; -#endif /* not PYRAMID_CORE */ - -#ifdef __not_on_pyr_yet - /* Some machines put an absolute address in here and some put - the offset in the upage of the regs. */ - reg_offset = (int) u.u_ar0; - if (reg_offset > NBPG * UPAGES) - reg_offset -= KERNEL_U_ADDR; -#endif - - /* I don't know where to find this info. - So, for now, mark it as not available. */ - N_SET_MAGIC (core_aouthdr, 0); - - /* Read the register values out of the core file and store - them where `read_register' will find them. */ - - { - register int regno; - - for (regno = 0; regno < 64; regno++) - { - char buf[MAX_REGISTER_RAW_SIZE]; - - val = lseek (corechan, register_addr (regno, reg_offset), 0); - if (val < 0 - || (val = myread (corechan, buf, sizeof buf)) < 0) - { - char * buffer = (char *) alloca (strlen (REGISTER_NAME (regno)) - + 30); - strcpy (buffer, "Reading register "); - strcat (buffer, REGISTER_NAME (regno)); - - perror_with_name (buffer); - } - - if (val < 0) - perror_with_name (filename); -#ifdef PYRAMID_CONTROL_FRAME_DEBUGGING - printf_unfiltered ("[reg %s(%d), offset in file %s=0x%0x, addr =0x%0x, =%0x]\n", - REGISTER_NAME (regno), regno, filename, - register_addr(regno, reg_offset), - regno * 4 + last_frame_address, - *((int *)buf)); -#endif /* PYRAMID_CONTROL_FRAME_DEBUGGING */ - supply_register (regno, buf); - } - } - } - if (filename[0] == '/') - corefile = savestring (filename, strlen (filename)); - else - { - corefile = concat (current_directory, "/", filename, NULL); - } - -#if 1 || defined(PYRAMID_CONTROL_FRAME_DEBUGGING) - printf_unfiltered ("Providing CSP (%s) as nominal address of current frame.\n", - local_hex_string(last_frame_address)); -#endif PYRAMID_CONTROL_FRAME_DEBUGGING - /* FIXME: Which of the following is correct? */ -#if 0 - set_current_frame ( create_new_frame (read_register (FP_REGNUM), - read_pc ())); -#else - set_current_frame ( create_new_frame (last_frame_address, - read_pc ())); -#endif - - select_frame (get_current_frame (), 0); - validate_files (); - } - else if (from_tty) - printf_unfiltered ("No core file now.\n"); -} diff --git a/contrib/gdb/gdb/remote-d10v.c b/contrib/gdb/gdb/remote-d10v.c deleted file mode 100644 index d529b2180f6a5..0000000000000 --- a/contrib/gdb/gdb/remote-d10v.c +++ /dev/null @@ -1,228 +0,0 @@ -/* Remote target communications for d10v connected via a serial line. - Copyright 1988, 1991, 1992, 1993, 1994, 1995, 1996, 1997 Free - Software Foundation, Inc. - -This file is part of GDB. - -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 2 of the License, 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ - -#include "defs.h" -#include "gdb_string.h" -#include <fcntl.h> -#include "frame.h" -#include "inferior.h" -#include "bfd.h" -#include "symfile.h" -#include "target.h" -#include "wait.h" -/*#include "terminal.h"*/ -#include "gdbcmd.h" -#include "objfiles.h" -#include "gdb-stabs.h" -#include "gdbthread.h" - -#include "dcache.h" - -#ifdef USG -#include <sys/types.h> -#endif - -#include <signal.h> -#include "serial.h" - -/* Prototypes for local functions */ - -static void remote_d10v_open PARAMS ((char *name, int from_tty)); - -/* Define the target subroutine names */ -static struct target_ops remote_d10v_ops; - -/* Open a connection to a remote debugger. - NAME is the filename used for communication. */ - -static void -remote_d10v_open (name, from_tty) - char *name; - int from_tty; -{ - pop_target (); - push_remote_target (name, from_tty); -} - - -/* Translate a GDB virtual ADDR/LEN into a format the remote target - understands. Returns number of bytes that can be transfered - starting at taddr, ZERO if no bytes can be transfered. */ -int -remote_d10v_translate_xfer_address (memaddr, nr_bytes, taddr) - CORE_ADDR memaddr; - int nr_bytes; - CORE_ADDR *taddr; -{ - CORE_ADDR phys; - CORE_ADDR seg; - CORE_ADDR off; - char *from = "unknown"; - char *to = "unknown"; - unsigned short imap0 = read_register (IMAP0_REGNUM); - unsigned short imap1 = read_register (IMAP1_REGNUM); - unsigned short dmap = read_register (DMAP_REGNUM); - - /* GDB interprets addresses as: - - 0x00xxxxxx: Logical data address segment (DMAP translated memory) - 0x01xxxxxx: Logical instruction address segment (IMAP translated memory) - 0x10xxxxxx: Physical data memory segment (On-chip data memory) - 0x11xxxxxx: Physical instruction memory segment (On-chip insn memory) - 0x12xxxxxx: Phisical unified memory segment (Unified memory) - - The remote d10v board interprets addresses as: - - 0x00xxxxxx: Phisical unified memory segment (Unified memory) - 0x01xxxxxx: Physical instruction memory segment (On-chip insn memory) - 0x02xxxxxx: Physical data memory segment (On-chip data memory) - - Translate according to current IMAP/dmap registers */ - - enum { - targ_unified = 0x00000000, - targ_insn = 0x01000000, - targ_data = 0x02000000, - }; - - seg = (memaddr >> 24); - off = (memaddr & 0xffffffL); - - switch (seg) - { - case 0x00: /* in logical data address segment */ - { - from = "logical-data"; - if (off <= 0x7fffL) - { - /* On chip data */ - phys = targ_data + off; - if (off + nr_bytes > 0x7fffL) - /* don't cross VM boundary */ - nr_bytes = 0x7fffL - off + 1; - to = "chip-data"; - } - else if (off <= 0xbfffL) - { - short map = dmap; - if (map & 0x1000) - { - /* Instruction memory */ - phys = targ_insn | ((map & 0xf) << 14) | (off & 0x3fff); - to = "chip-insn"; - } - else - { - /* Unified memory */ - phys = targ_unified | ((map & 0x3ff) << 14) | (off & 0x3fff); - to = "unified"; - } - if (off + nr_bytes > 0xbfffL) - /* don't cross VM boundary */ - nr_bytes = (0xbfffL - off + 1); - } - else - { - /* Logical address out side of data segments, not supported */ - return (0); - } - break; - } - - case 0x01: /* in logical instruction address segment */ - { - short map; - from = "logical-insn"; - if (off <= 0x1ffffL) - { - map = imap0; - } - else if (off <= 0x3ffffL) - { - map = imap1; - } - else - { - /* Logical address outside of IMAP[01] segment, not - supported */ - return (0); - } - if ((off & 0x1ffff) + nr_bytes > 0x1ffffL) - { - /* don't cross VM boundary */ - nr_bytes = 0x1ffffL - (off & 0x1ffffL) + 1; - } - if (map & 0x1000) - /* Instruction memory */ - { - phys = targ_insn | off; - to = "chip-insn"; - } - else - { - phys = ((map & 0x7fL) << 17) + (off & 0x1ffffL); - if (phys > 0xffffffL) - /* Address outside of unified address segment */ - return (0); - phys |= targ_unified; - to = "unified"; - } - break; - } - - case 0x10: /* Physical data memory segment */ - from = "phys-data"; - phys = targ_data | off; - to = "chip-data"; - break; - - case 0x11: /* Physical instruction memory */ - from = "phys-insn"; - phys = targ_insn | off; - to = "chip-insn"; - break; - - case 0x12: /* Physical unified memory */ - from = "phys-unified"; - phys = targ_unified | off; - to = "unified"; - break; - - default: - return (0); - } - - - *taddr = phys; - return nr_bytes; -} - - -void -_initialize_remote_d10v () -{ - remote_d10v_ops.to_shortname = "d10v"; - remote_d10v_ops.to_longname = "Remote d10v serial target in gdb-specific protocol"; - remote_d10v_ops.to_doc = "Use a remote d10v via a serial line, using a gdb-specific protocol.\n\ -Specify the serial device it is connected to (e.g. /dev/ttya)."; - remote_d10v_ops.to_open = remote_d10v_open; - - add_target (&remote_d10v_ops); -} diff --git a/contrib/gdb/gdb/remote-pa.c b/contrib/gdb/gdb/remote-pa.c deleted file mode 100644 index 1121e15effaaa..0000000000000 --- a/contrib/gdb/gdb/remote-pa.c +++ /dev/null @@ -1,1540 +0,0 @@ -/* Remote target communications for serial-line targets in custom GDB protocol - Copyright 1988, 1991, 1992, 1993, 1994 Free Software Foundation, Inc. - -This file is part of GDB. - -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 2 of the License, 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ - -/* Remote communication protocol. - - A debug packet whose contents are <data> - is encapsulated for transmission in the form: - - $ <data> # CSUM1 CSUM2 - - <data> must be ASCII alphanumeric and cannot include characters - '$' or '#'. If <data> starts with two characters followed by - ':', then the existing stubs interpret this as a sequence number. - - CSUM1 and CSUM2 are ascii hex representation of an 8-bit - checksum of <data>, the most significant nibble is sent first. - the hex digits 0-9,a-f are used. - - Receiver responds with: - - + - if CSUM is correct and ready for next packet - - - if CSUM is incorrect - - <data> is as follows: - All values are encoded in ascii hex digits. - - Request Packet - - read registers g - reply XX....X Each byte of register data - is described by two hex digits. - Registers are in the internal order - for GDB, and the bytes in a register - are in the same order the machine uses. - or ENN for an error. - - write regs GXX..XX Each byte of register data - is described by two hex digits. - reply OK for success - ENN for an error - - write reg Pn...=r... Write register n... with value r..., - which contains two hex digits for each - byte in the register (target byte - order). - reply OK for success - ENN for an error - (not supported by all stubs). - - read mem mAA..AA,LLLL AA..AA is address, LLLL is length. - reply XX..XX XX..XX is mem contents - Can be fewer bytes than requested - if able to read only part of the data. - or ENN NN is errno - - write mem MAA..AA,LLLL:XX..XX - AA..AA is address, - LLLL is number of bytes, - XX..XX is data - reply OK for success - ENN for an error (this includes the case - where only part of the data was - written). - - cont cAA..AA AA..AA is address to resume - If AA..AA is omitted, - resume at same address. - - step sAA..AA AA..AA is address to resume - If AA..AA is omitted, - resume at same address. - - last signal ? Reply the current reason for stopping. - This is the same reply as is generated - for step or cont : SAA where AA is the - signal number. - - There is no immediate reply to step or cont. - The reply comes when the machine stops. - It is SAA AA is the "signal number" - - or... TAAn...:r...;n:r...;n...:r...; - AA = signal number - n... = register number - r... = register contents - or... WAA The process exited, and AA is - the exit status. This is only - applicable for certains sorts of - targets. - kill request k - - toggle debug d toggle debug flag (see 386 & 68k stubs) - reset r reset -- see sparc stub. - reserved <other> On other requests, the stub should - ignore the request and send an empty - response ($#<checksum>). This way - we can extend the protocol and GDB - can tell whether the stub it is - talking to uses the old or the new. - search tAA:PP,MM Search backwards starting at address - AA for a match with pattern PP and - mask MM. PP and MM are 4 bytes. - Not supported by all stubs. - - general query qXXXX Request info about XXXX. - general set QXXXX=yyyy Set value of XXXX to yyyy. - query sect offs qOffsets Get section offsets. Reply is - Text=xxx;Data=yyy;Bss=zzz - console output Otext Send text to stdout. Only comes from - remote target. - - Responses can be run-length encoded to save space. A '*' means that - the next character is an ASCII encoding giving a repeat count which - stands for that many repititions of the character preceding the '*'. - The encoding is n+29, yielding a printable character where n >=3 - (which is where rle starts to win). Don't use an n > 126. - - So - "0* " means the same as "0000". */ - -#include "defs.h" -#include "gdb_string.h" -#include <fcntl.h> -#include "frame.h" -#include "inferior.h" -#include "bfd.h" -#include "symfile.h" -#include "target.h" -#include "wait.h" -#include "terminal.h" -#include "gdbcmd.h" -#include "objfiles.h" -#include "gdb-stabs.h" -#include "remote-utils.h" -#include "dcache.h" - -#ifdef USG -#include <sys/types.h> -#endif - -#include <signal.h> -#include "serial.h" - -/* Prototypes for local functions */ - -static int -remote_write_bytes PARAMS ((CORE_ADDR memaddr, char *myaddr, int len)); - -static int -remote_read_bytes PARAMS ((CORE_ADDR memaddr, char *myaddr, int len)); - -static void -remote_files_info PARAMS ((struct target_ops *ignore)); - -static int -remote_xfer_memory PARAMS ((CORE_ADDR memaddr, char *myaddr, int len, - int should_write, struct target_ops *target)); - -static void -remote_prepare_to_store PARAMS ((void)); - -static void -remote_fetch_registers PARAMS ((int regno)); - -static void -remote_resume PARAMS ((int pid, int step, enum target_signal siggnal)); - -static int -remote_start_remote PARAMS ((char *dummy)); - -static void -remote_open PARAMS ((char *name, int from_tty)); - -static void -remote_close PARAMS ((int quitting)); - -static void -remote_store_registers PARAMS ((int regno)); - -static void -getpkt PARAMS ((char *buf, int forever)); - -static void -putpkt PARAMS ((char *buf)); - -static void -remote_send PARAMS ((char *buf)); - -static int -readchar PARAMS ((int timeout)); - -static int -remote_wait PARAMS ((int pid, struct target_waitstatus *status)); - -static int -tohex PARAMS ((int nib)); - -static int -fromhex PARAMS ((int a)); - -static void -remote_detach PARAMS ((char *args, int from_tty)); - -static void -remote_interrupt PARAMS ((int signo)); - -static void -remote_interrupt_twice PARAMS ((int signo)); - -static void -interrupt_query PARAMS ((void)); - -static void -hppro_load PARAMS ((char *name, int from_tty)); - -extern struct target_ops remote_ops; /* Forward decl */ - -/* This was 5 seconds, which is a long time to sit and wait. - Unless this is going though some terminal server or multiplexer or - other form of hairy serial connection, I would think 2 seconds would - be plenty. */ -static int remote_timeout = 2; - -/* Descriptor for I/O to remote machine. Initialize it to NULL so that - remote_open knows that we don't have a file open when the program - starts. */ -extern serial_t remote_desc; - -/* Having this larger than 400 causes us to be incompatible with m68k-stub.c - and i386-stub.c. Normally, no one would notice because it only matters - for writing large chunks of memory (e.g. in downloads). Also, this needs - to be more than 400 if required to hold the registers (see below, where - we round it up based on REGISTER_BYTES). */ -#define PBUFSIZ 400 - -/* Maximum number of bytes to read/write at once. The value here - is chosen to fill up a packet (the headers account for the 32). */ -#define MAXBUFBYTES ((PBUFSIZ-32)/2) - -/* Round up PBUFSIZ to hold all the registers, at least. */ -/* The blank line after the #if seems to be required to work around a - bug in HP's PA compiler. */ -#if REGISTER_BYTES > MAXBUFBYTES - -#undef PBUFSIZ -#define PBUFSIZ (REGISTER_BYTES * 2 + 32) -#endif - -/* Should we try the 'P' request? If this is set to one when the stub - doesn't support 'P', the only consequence is some unnecessary traffic. */ -static int stub_supports_P = 1; - -/* sets the download protocol, choices are srec, generic, boot */ -char *loadtype; -static char *loadtype_str; -static void set_loadtype_command -PARAMS ((char *, int, struct cmd_list_element *)); - -static void -hppro_load (file, from_tty) - char *file; - int from_tty; -{ - puts ("Loading... HA!"); -} - - -/* Clean up connection to a remote debugger. */ - -/* ARGSUSED */ -static void -remote_close (quitting) - int quitting; -{ - if (remote_desc) - SERIAL_CLOSE (remote_desc); - remote_desc = NULL; -} - -/* Query the remote side for the text, data and bss offsets. */ - -static void -get_offsets () -{ - unsigned char buf[PBUFSIZ]; - int nvals; - CORE_ADDR text_addr, data_addr, bss_addr; - struct section_offsets *offs; - - putpkt ("qOffsets"); - - getpkt (buf, 0); - - if (buf[0] == '\000') - return; /* Return silently. Stub doesn't support this - command. */ - if (buf[0] == 'E') - { - warning ("Remote failure reply: %s", buf); - return; - } - - nvals = sscanf (buf, "Text=%lx;Data=%lx;Bss=%lx", &text_addr, &data_addr, - &bss_addr); - if (nvals != 3) - error ("Malformed response to offset query, %s", buf); - - if (symfile_objfile == NULL) - return; - - offs = (struct section_offsets *) alloca (sizeof (struct section_offsets) - + symfile_objfile->num_sections - * sizeof (offs->offsets)); - memcpy (offs, symfile_objfile->section_offsets, - sizeof (struct section_offsets) - + symfile_objfile->num_sections - * sizeof (offs->offsets)); - - /* FIXME: This code assumes gdb-stabs.h is being used; it's broken - for xcoff, dwarf, sdb-coff, etc. But there is no simple - canonical representation for this stuff. (Just what does "text" - as seen by the stub mean, anyway? I think it means all sections - with SEC_CODE set, but we currently have no way to deal with that). */ - - ANOFFSET (offs, SECT_OFF_TEXT) = text_addr; - - /* This is a temporary kludge to force data and bss to use the same offsets - because that's what nlmconv does now. The real solution requires changes - to the stub and remote.c that I don't have time to do right now. */ - - ANOFFSET (offs, SECT_OFF_DATA) = data_addr; - ANOFFSET (offs, SECT_OFF_BSS) = data_addr; - - objfile_relocate (symfile_objfile, offs); -} - -#define INBUFSIZE 10 - -void -boot_board() -{ - char c; - char buf[INBUFSIZE]; - char *ptr; - - /* See if we can connect to the boot ROM command line */ - ptr = buf; - while (1) { - SERIAL_WRITE (remote_desc, "\r\n", 2); - c = readchar (2); - if ((sr_get_debug() > 2) && (isascii(c))) - putchar (c); - if (c == SERIAL_TIMEOUT) { - if (sr_get_debug()) - puts_filtered ("Timed out.\n"); - break; - } - if (c == '&') { - if (sr_get_debug() > 2) - puts ("Got ACK from stub"); - break; - } - if (c == '>') { - if (sr_get_debug() > 2) - puts ("Got prompt from ROM monitor"); - break; - } - } - -} - -/* Stub for catch_errors. */ -static int -remote_start_remote (dummy) - char *dummy; -{ - int timeout; - - immediate_quit = 1; /* Allow user to interrupt it */ - - /* Ack any packet which the remote side has already sent. */ - - if (sr_get_debug()) - puts ("Trying a '+' to ACK the target."); - - SERIAL_WRITE (remote_desc, "+", 1); - -#if 0 - boot_board(); - - get_offsets (); /* Get text, data & bss offsets */ -#endif - - putpkt ("?"); /* initiate a query from remote machine */ - immediate_quit = 0; - - start_remote (); /* Initialize gdb process mechanisms */ - - return 1; -} - -/* Open a connection to a remote debugger. - NAME is the filename used for communication. */ - -static DCACHE *remote_dcache; - -static void -remote_open (name, from_tty) - char *name; - int from_tty; -{ - if (name == 0) - error ( -"To open a remote debug connection, you need to specify what serial\n\ -device is attached to the remote system (e.g. /dev/ttya)."); - - target_preopen (from_tty); - - unpush_target (&remote_ops); - - remote_dcache = dcache_init (remote_read_bytes, remote_write_bytes); - - remote_desc = SERIAL_OPEN (name); - if (!remote_desc) - perror_with_name (name); - - if (baud_rate != -1) - { - if (SERIAL_SETBAUDRATE (remote_desc, baud_rate)) - { - SERIAL_CLOSE (remote_desc); - perror_with_name (name); - } - } - - SERIAL_RAW (remote_desc); - - /* If there is something sitting in the buffer we might take it as a - response to a command, which would be bad. */ - SERIAL_FLUSH_INPUT (remote_desc); - - if (from_tty) - { - puts_filtered ("Remote debugging using "); - puts_filtered (name); - puts_filtered ("\n"); - } - push_target (&remote_ops); /* Switch to using remote target now */ - - /* Start out by trying the 'P' request to set registers. We set this each - time that we open a new target so that if the user switches from one - stub to another, we can (if the target is closed and reopened) cope. */ - stub_supports_P = 1; - - /* Without this, some commands which require an active target (such as kill) - won't work. This variable serves (at least) double duty as both the pid - of the target process (if it has such), and as a flag indicating that a - target is active. These functions should be split out into seperate - variables, especially since GDB will someday have a notion of debugging - several processes. */ - - inferior_pid = 42000; - - /* Start the remote connection; if error (0), discard this target. - In particular, if the user quits, be sure to discard it - (we'd be in an inconsistent state otherwise). */ - if (!catch_errors (remote_start_remote, (char *)0, - "Couldn't establish connection to remote target\n", RETURN_MASK_ALL)) - pop_target(); -} - -/* remote_detach() - takes a program previously attached to and detaches it. - We better not have left any breakpoints - in the program or it'll die when it hits one. - Close the open connection to the remote debugger. - Use this when you want to detach and do something else - with your gdb. */ - -static void -remote_detach (args, from_tty) - char *args; - int from_tty; -{ - if (args) - error ("Argument given to \"detach\" when remotely debugging."); - - pop_target (); - if (from_tty) - puts_filtered ("Ending remote debugging.\n"); -} - -/* Convert hex digit A to a number. */ - -static int -fromhex (a) - int a; -{ - if (a >= '0' && a <= '9') - return a - '0'; - else if (a >= 'a' && a <= 'f') - return a - 'a' + 10; - else - error ("Reply contains invalid hex digit"); -} - -/* Convert number NIB to a hex digit. */ - -static int -tohex (nib) - int nib; -{ - if (nib < 10) - return '0'+nib; - else - return 'a'+nib-10; -} - -/* Tell the remote machine to resume. */ - -static void -remote_resume (pid, step, siggnal) - int pid, step; - enum target_signal siggnal; -{ - char buf[PBUFSIZ]; - - if (siggnal) - { - target_terminal_ours_for_output (); - printf_filtered - ("Can't send signals to a remote system. %s not sent.\n", - target_signal_to_name (siggnal)); target_terminal_inferior (); - } - - dcache_flush (remote_dcache); - - strcpy (buf, step ? "s": "c"); - - putpkt (buf); -} - -/* Send ^C to target to halt it. Target will respond, and send us a - packet. */ - -static void -remote_interrupt (signo) - int signo; -{ - /* If this doesn't work, try more severe steps. */ - signal (signo, remote_interrupt_twice); - - if (remote_debug) - printf_unfiltered ("remote_interrupt called\n"); - - SERIAL_WRITE (remote_desc, "\003", 1); /* Send a ^C */ -} - -static void (*ofunc)(); - -/* The user typed ^C twice. */ -static void -remote_interrupt_twice (signo) - int signo; -{ - signal (signo, ofunc); - - interrupt_query (); - - signal (signo, remote_interrupt); -} - -/* Ask the user what to do when an interrupt is received. */ - -static void -interrupt_query () -{ - target_terminal_ours (); - - if (query ("Interrupted while waiting for the program.\n\ -Give up (and stop debugging it)? ")) - { - target_mourn_inferior (); - return_to_top_level (RETURN_QUIT); - } - - target_terminal_inferior (); -} - -/* Wait until the remote machine stops, then return, - storing status in STATUS just as `wait' would. - Returns "pid" (though it's not clear what, if anything, that - means in the case of this target). */ - -static int -remote_wait (pid, status) - int pid; - struct target_waitstatus *status; -{ - unsigned char buf[PBUFSIZ]; - - status->kind = TARGET_WAITKIND_EXITED; - status->value.integer = 0; - - while (1) - { - unsigned char *p; - - ofunc = (void (*)()) signal (SIGINT, remote_interrupt); - getpkt ((char *) buf, 1); - signal (SIGINT, ofunc); - - switch (buf[0]) - { - case 'E': /* Error of some sort */ - warning ("Remote failure reply: %s", buf); - continue; - case 'T': /* Status with PC, SP, FP, ... */ - { - int i; - long regno; - char regs[MAX_REGISTER_RAW_SIZE]; - - /* Expedited reply, containing Signal, {regno, reg} repeat */ - /* format is: 'Tssn...:r...;n...:r...;n...:r...;#cc', where - ss = signal number - n... = register number - r... = register contents - */ - - p = &buf[3]; /* after Txx */ - - while (*p) - { - unsigned char *p1; - - regno = strtol (p, (char **) &p1, 16); /* Read the register number */ - - if (p1 == p) - warning ("Remote sent badly formed register number: %s\nPacket: '%s'\n", - p1, buf); - - p = p1; - - if (*p++ != ':') - warning ("Malformed packet (missing colon): %s\nPacket: '%s'\n", - p, buf); - - if (regno >= NUM_REGS) - warning ("Remote sent bad register number %d: %s\nPacket: '%s'\n", - regno, p, buf); - - for (i = 0; i < REGISTER_RAW_SIZE (regno); i++) - { - if (p[0] == 0 || p[1] == 0) - warning ("Remote reply is too short: %s", buf); - regs[i] = fromhex (p[0]) * 16 + fromhex (p[1]); - p += 2; - } - - if (*p++ != ';') - warning ("Remote register badly formatted: %s", buf); - - supply_register (regno, regs); - } - } - /* fall through */ - case 'S': /* Old style status, just signal only */ - status->kind = TARGET_WAITKIND_STOPPED; - status->value.sig = (enum target_signal) - (((fromhex (buf[1])) << 4) + (fromhex (buf[2]))); - - return inferior_pid; - case 'W': /* Target exited */ - { - /* The remote process exited. */ - status->kind = TARGET_WAITKIND_EXITED; - status->value.integer = (fromhex (buf[1]) << 4) + fromhex (buf[2]); - return inferior_pid; - } - case 'O': /* Console output */ - fputs_filtered (buf + 1, gdb_stdout); - continue; - default: - warning ("Invalid remote reply: %s", buf); - continue; - } - } - return inferior_pid; -} - -/* Number of bytes of registers this stub implements. */ -static int register_bytes_found; - -/* Read the remote registers into the block REGS. */ -/* Currently we just read all the registers, so we don't use regno. */ -/* ARGSUSED */ -static void -remote_fetch_registers (regno) - int regno; -{ - char buf[PBUFSIZ]; - int i; - char *p; - char regs[REGISTER_BYTES]; - - sprintf (buf, "g"); - remote_send (buf); - - /* Unimplemented registers read as all bits zero. */ - memset (regs, 0, REGISTER_BYTES); - - /* We can get out of synch in various cases. If the first character - in the buffer is not a hex character, assume that has happened - and try to fetch another packet to read. */ - while ((buf[0] < '0' || buf[0] > '9') - && (buf[0] < 'a' || buf[0] > 'f')) - { - if (remote_debug) - printf_unfiltered ("Bad register packet; fetching a new packet\n"); - getpkt (buf, 0); - } - - /* Reply describes registers byte by byte, each byte encoded as two - hex characters. Suck them all up, then supply them to the - register cacheing/storage mechanism. */ - - p = buf; - for (i = 0; i < REGISTER_BYTES; i++) - { - if (p[0] == 0) - break; - if (p[1] == 0) - { - warning ("Remote reply is of odd length: %s", buf); - /* Don't change register_bytes_found in this case, and don't - print a second warning. */ - goto supply_them; - } - regs[i] = fromhex (p[0]) * 16 + fromhex (p[1]); - p += 2; - } - - if (i != register_bytes_found) - { - register_bytes_found = i; -#ifdef REGISTER_BYTES_OK - if (!REGISTER_BYTES_OK (i)) - warning ("Remote reply is too short: %s", buf); -#endif - } - - supply_them: - for (i = 0; i < NUM_REGS; i++) - supply_register (i, ®s[REGISTER_BYTE(i)]); -} - -/* Prepare to store registers. Since we may send them all (using a - 'G' request), we have to read out the ones we don't want to change - first. */ - -static void -remote_prepare_to_store () -{ - /* Make sure the entire registers array is valid. */ - read_register_bytes (0, (char *)NULL, REGISTER_BYTES); -} - -/* Store register REGNO, or all registers if REGNO == -1, from the contents - of REGISTERS. FIXME: ignores errors. */ - -static void -remote_store_registers (regno) - int regno; -{ - char buf[PBUFSIZ]; - int i; - char *p; - - if (regno >= 0 && stub_supports_P) - { - /* Try storing a single register. */ - char *regp; - - sprintf (buf, "P%x=", regno); - p = buf + strlen (buf); - regp = ®isters[REGISTER_BYTE (regno)]; - for (i = 0; i < REGISTER_RAW_SIZE (regno); ++i) - { - *p++ = tohex ((regp[i] >> 4) & 0xf); - *p++ = tohex (regp[i] & 0xf); - } - *p = '\0'; - remote_send (buf); - if (buf[0] != '\0') - { - /* The stub understands the 'P' request. We are done. */ - return; - } - - /* The stub does not support the 'P' request. Use 'G' instead, - and don't try using 'P' in the future (it will just waste our - time). */ - stub_supports_P = 0; - } - - buf[0] = 'G'; - - /* Command describes registers byte by byte, - each byte encoded as two hex characters. */ - - p = buf + 1; - /* remote_prepare_to_store insures that register_bytes_found gets set. */ - for (i = 0; i < register_bytes_found; i++) - { - *p++ = tohex ((registers[i] >> 4) & 0xf); - *p++ = tohex (registers[i] & 0xf); - } - *p = '\0'; - - remote_send (buf); -} - -#if 0 - -/* Use of the data cache is disabled because it loses for looking at - and changing hardware I/O ports and the like. Accepting `volatile' - would perhaps be one way to fix it. Another idea would be to use the - executable file for the text segment (for all SEC_CODE sections? - For all SEC_READONLY sections?). This has problems if you want to - actually see what the memory contains (e.g. self-modifying code, - clobbered memory, user downloaded the wrong thing). */ - -/* Read a word from remote address ADDR and return it. - This goes through the data cache. */ - -static int -remote_fetch_word (addr) - CORE_ADDR addr; -{ - return dcache_fetch (remote_dcache, addr); -} - -/* Write a word WORD into remote address ADDR. - This goes through the data cache. */ - -static void -remote_store_word (addr, word) - CORE_ADDR addr; - int word; -{ - dcache_poke (remote_dcache, addr, word); -} -#endif /* 0 */ - -/* Write memory data directly to the remote machine. - This does not inform the data cache; the data cache uses this. - MEMADDR is the address in the remote memory space. - MYADDR is the address of the buffer in our space. - LEN is the number of bytes. - - Returns number of bytes transferred, or 0 for error. */ - -static int -remote_write_bytes (memaddr, myaddr, len) - CORE_ADDR memaddr; - char *myaddr; - int len; -{ - char buf[PBUFSIZ]; - int i; - char *p; - - /* FIXME-32x64: Need a version of print_address_numeric which puts the - result in a buffer like sprintf. */ - sprintf (buf, "M%lx,%x:", (unsigned long) memaddr, len); - - /* We send target system values byte by byte, in increasing byte addresses, - each byte encoded as two hex characters. */ - - p = buf + strlen (buf); - for (i = 0; i < len; i++) - { - *p++ = tohex ((myaddr[i] >> 4) & 0xf); - *p++ = tohex (myaddr[i] & 0xf); - } - *p = '\0'; - - putpkt (buf); - getpkt (buf, 0); - - if (buf[0] == 'E') - { - /* There is no correspondance between what the remote protocol uses - for errors and errno codes. We would like a cleaner way of - representing errors (big enough to include errno codes, bfd_error - codes, and others). But for now just return EIO. */ - errno = EIO; - return 0; - } - return len; -} - -/* Read memory data directly from the remote machine. - This does not use the data cache; the data cache uses this. - MEMADDR is the address in the remote memory space. - MYADDR is the address of the buffer in our space. - LEN is the number of bytes. - - Returns number of bytes transferred, or 0 for error. */ - -static int -remote_read_bytes (memaddr, myaddr, len) - CORE_ADDR memaddr; - char *myaddr; - int len; -{ - char buf[PBUFSIZ]; - int i; - char *p; - - if (len > PBUFSIZ / 2 - 1) - abort (); - - /* FIXME-32x64: Need a version of print_address_numeric which puts the - result in a buffer like sprintf. */ - sprintf (buf, "m%lx,%x", (unsigned long) memaddr, len); - putpkt (buf); - getpkt (buf, 0); - - if (buf[0] == 'E') - { - /* There is no correspondance between what the remote protocol uses - for errors and errno codes. We would like a cleaner way of - representing errors (big enough to include errno codes, bfd_error - codes, and others). But for now just return EIO. */ - errno = EIO; - return 0; - } - - /* Reply describes memory byte by byte, - each byte encoded as two hex characters. */ - - p = buf; - for (i = 0; i < len; i++) - { - if (p[0] == 0 || p[1] == 0) - /* Reply is short. This means that we were able to read only part - of what we wanted to. */ - break; - myaddr[i] = fromhex (p[0]) * 16 + fromhex (p[1]); - p += 2; - } - return i; -} - -/* Read or write LEN bytes from inferior memory at MEMADDR, transferring - to or from debugger address MYADDR. Write to inferior if SHOULD_WRITE is - nonzero. Returns length of data written or read; 0 for error. */ - -/* ARGSUSED */ -static int -remote_xfer_memory(memaddr, myaddr, len, should_write, target) - CORE_ADDR memaddr; - char *myaddr; - int len; - int should_write; - struct target_ops *target; /* ignored */ -{ - int xfersize; - int bytes_xferred; - int total_xferred = 0; - - while (len > 0) - { - if (len > MAXBUFBYTES) - xfersize = MAXBUFBYTES; - else - xfersize = len; - - if (should_write) - bytes_xferred = remote_write_bytes (memaddr, myaddr, xfersize); - else - bytes_xferred = remote_read_bytes (memaddr, myaddr, xfersize); - - /* If we get an error, we are done xferring. */ - if (bytes_xferred == 0) - break; - - memaddr += bytes_xferred; - myaddr += bytes_xferred; - len -= bytes_xferred; - total_xferred += bytes_xferred; - } - return total_xferred; -} - -#if 0 -/* Enable after 4.12. */ - -void -remote_search (len, data, mask, startaddr, increment, lorange, hirange - addr_found, data_found) - int len; - char *data; - char *mask; - CORE_ADDR startaddr; - int increment; - CORE_ADDR lorange; - CORE_ADDR hirange; - CORE_ADDR *addr_found; - char *data_found; -{ - if (increment == -4 && len == 4) - { - long mask_long, data_long; - long data_found_long; - CORE_ADDR addr_we_found; - char buf[PBUFSIZ]; - long returned_long[2]; - char *p; - - mask_long = extract_unsigned_integer (mask, len); - data_long = extract_unsigned_integer (data, len); - sprintf (buf, "t%x:%x,%x", startaddr, data_long, mask_long); - putpkt (buf); - getpkt (buf, 0); - if (buf[0] == '\0') - { - /* The stub doesn't support the 't' request. We might want to - remember this fact, but on the other hand the stub could be - switched on us. Maybe we should remember it only until - the next "target remote". */ - generic_search (len, data, mask, startaddr, increment, lorange, - hirange, addr_found, data_found); - return; - } - - if (buf[0] == 'E') - /* There is no correspondance between what the remote protocol uses - for errors and errno codes. We would like a cleaner way of - representing errors (big enough to include errno codes, bfd_error - codes, and others). But for now just use EIO. */ - memory_error (EIO, startaddr); - p = buf; - addr_we_found = 0; - while (*p != '\0' && *p != ',') - addr_we_found = (addr_we_found << 4) + fromhex (*p++); - if (*p == '\0') - error ("Protocol error: short return for search"); - - data_found_long = 0; - while (*p != '\0' && *p != ',') - data_found_long = (data_found_long << 4) + fromhex (*p++); - /* Ignore anything after this comma, for future extensions. */ - - if (addr_we_found < lorange || addr_we_found >= hirange) - { - *addr_found = 0; - return; - } - - *addr_found = addr_we_found; - *data_found = store_unsigned_integer (data_we_found, len); - return; - } - generic_search (len, data, mask, startaddr, increment, lorange, - hirange, addr_found, data_found); -} -#endif /* 0 */ - -static void -remote_files_info (ignore) - struct target_ops *ignore; -{ - puts_filtered ("Debugging a target over a serial line.\n"); -} - -/* Stuff for dealing with the packets which are part of this protocol. - See comment at top of file for details. */ - -/* Read a single character from the remote end, masking it down to 7 bits. */ - -static int -readchar (timeout) - int timeout; -{ - int ch; - - ch = SERIAL_READCHAR (remote_desc, timeout); - - switch (ch) - { - case SERIAL_EOF: - error ("Remote connection closed"); - case SERIAL_ERROR: - perror_with_name ("Remote communication error"); - case SERIAL_TIMEOUT: - return ch; - default: - return ch & 0x7f; - } -} - -/* Send the command in BUF to the remote machine, - and read the reply into BUF. - Report an error if we get an error reply. */ - -static void -remote_send (buf) - char *buf; -{ - - putpkt (buf); - getpkt (buf, 0); - - if (buf[0] == 'E') - error ("Remote failure reply: %s", buf); -} - -/* Send a packet to the remote machine, with error checking. - The data of the packet is in BUF. */ -static void -putpkt (buf) - char *buf; -{ - int i; - unsigned char csum = 0; - char buf2[PBUFSIZ]; - int cnt = strlen (buf); - int ch; - char *p; - - /* Copy the packet into buffer BUF2, encapsulating it - and giving it a checksum. */ - - if (cnt > sizeof(buf2) - 5) /* Prosanity check */ - abort(); - - p = buf2; - *p++ = '$'; - - for (i = 0; i < cnt; i++) - { - csum += buf[i]; - *p++ = buf[i]; - } - *p++ = '#'; - *p++ = tohex ((csum >> 4) & 0xf); - *p++ = tohex (csum & 0xf); - - /* Send it over and over until we get a positive ack. */ - - while (1) - { - int started_error_output = 0; - - if (remote_debug) - { - *p = '\0'; - printf_unfiltered ("Sending packet: %s...", buf2); - gdb_flush(gdb_stdout); - } - if (SERIAL_WRITE (remote_desc, buf2, p - buf2)) - perror_with_name ("putpkt: write failed"); - - /* read until either a timeout occurs (-2) or '+' is read */ - while (1) - { - ch = readchar (remote_timeout); - - if (remote_debug) - { - switch (ch) - { - case '+': - case SERIAL_TIMEOUT: - case '$': - if (started_error_output) - { - putchar_unfiltered ('\n'); - started_error_output = 0; - } - } - } - - switch (ch) - { - case '+': - if (remote_debug) - printf_unfiltered("Got Ack\n"); - return; - case SERIAL_TIMEOUT: - break; /* Retransmit buffer */ - case '$': - { - unsigned char junkbuf[PBUFSIZ]; - - /* It's probably an old response, and we're out of sync. Just - gobble up the packet and ignore it. */ - getpkt (junkbuf, 0); - continue; /* Now, go look for + */ - } - default: - if (remote_debug) - { - if (!started_error_output) - { - started_error_output = 1; - printf_unfiltered ("putpkt: Junk: "); - } - putchar_unfiltered (ch & 0177); - } - continue; - } - break; /* Here to retransmit */ - } - -#if 0 - /* This is wrong. If doing a long backtrace, the user should be - able to get out next time we call QUIT, without anything as violent - as interrupt_query. If we want to provide a way out of here - without getting to the next QUIT, it should be based on hitting - ^C twice as in remote_wait. */ - if (quit_flag) - { - quit_flag = 0; - interrupt_query (); - } -#endif - } -} - -/* Come here after finding the start of the frame. Collect the rest into BUF, - verifying the checksum, length, and handling run-length compression. - Returns 0 on any error, 1 on success. */ - -static int -read_frame (buf) - char *buf; -{ - unsigned char csum; - char *bp; - int c; - - csum = 0; - bp = buf; - - while (1) - { - c = readchar (remote_timeout); - - switch (c) - { - case SERIAL_TIMEOUT: - if (remote_debug) - puts_filtered ("Timeout in mid-packet, retrying\n"); - return 0; - case '$': - if (remote_debug) - puts_filtered ("Saw new packet start in middle of old one\n"); - return 0; /* Start a new packet, count retries */ - case '#': - { - unsigned char pktcsum; - - *bp = '\000'; - - pktcsum = fromhex (readchar (remote_timeout)) << 4; - pktcsum |= fromhex (readchar (remote_timeout)); - - if (csum == pktcsum) - return 1; - - printf_filtered ("Bad checksum, sentsum=0x%x, csum=0x%x, buf=", - pktcsum, csum); - puts_filtered (buf); - puts_filtered ("\n"); - - return 0; - } - case '*': /* Run length encoding */ - csum += c; - c = readchar (remote_timeout); - csum += c; - c = c - ' ' + 3; /* Compute repeat count */ - - if (bp + c - 1 < buf + PBUFSIZ - 1) - { - memset (bp, *(bp - 1), c); - bp += c; - continue; - } - - *bp = '\0'; - printf_filtered ("Repeat count %d too large for buffer: ", c); - puts_filtered (buf); - puts_filtered ("\n"); - return 0; - - default: - if (bp < buf + PBUFSIZ - 1) - { - *bp++ = c; - csum += c; - continue; - } - - *bp = '\0'; - puts_filtered ("Remote packet too long: "); - puts_filtered (buf); - puts_filtered ("\n"); - - return 0; - } - } -} - -/* Read a packet from the remote machine, with error checking, - and store it in BUF. BUF is expected to be of size PBUFSIZ. - If FOREVER, wait forever rather than timing out; this is used - while the target is executing user code. */ - -static void -getpkt (buf, forever) - char *buf; - int forever; -{ - char *bp; - int c; - int tries; - int timeout; - int val; - - if (forever) - timeout = -1; - else - timeout = remote_timeout; - -#define MAX_TRIES 10 - - for (tries = 1; tries <= MAX_TRIES; tries++) - { - /* This can loop forever if the remote side sends us characters - continuously, but if it pauses, we'll get a zero from readchar - because of timeout. Then we'll count that as a retry. */ - - /* Note that we will only wait forever prior to the start of a packet. - After that, we expect characters to arrive at a brisk pace. They - should show up within remote_timeout intervals. */ - - do - { - c = readchar (timeout); - - if (c == SERIAL_TIMEOUT) - { - if (remote_debug) - puts_filtered ("Timed out.\n"); - goto retry; - } - } - while (c != '$'); - - /* We've found the start of a packet, now collect the data. */ - - val = read_frame (buf); - - if (val == 1) - { - if (remote_debug) - fprintf_unfiltered (gdb_stderr, "Packet received: %s\n", buf); - SERIAL_WRITE (remote_desc, "+", 1); - return; - } - - /* Try the whole thing again. */ -retry: - SERIAL_WRITE (remote_desc, "-", 1); - } - - /* We have tried hard enough, and just can't receive the packet. Give up. */ - - printf_unfiltered ("Ignoring packet error, continuing...\n"); - SERIAL_WRITE (remote_desc, "+", 1); -} - -static void -remote_kill () -{ - putpkt ("k"); - /* Don't wait for it to die. I'm not really sure it matters whether - we do or not. For the existing stubs, kill is a noop. */ - target_mourn_inferior (); -} - -static void -remote_mourn () -{ - unpush_target (&remote_ops); - generic_mourn_inferior (); -} - -#ifdef REMOTE_BREAKPOINT - -/* On some machines, e.g. 68k, we may use a different breakpoint instruction - than other targets. */ -static unsigned char break_insn[] = REMOTE_BREAKPOINT; - -#else /* No REMOTE_BREAKPOINT. */ - -/* Same old breakpoint instruction. This code does nothing different - than mem-break.c. */ -static unsigned char break_insn[] = BREAKPOINT; - -#endif /* No REMOTE_BREAKPOINT. */ - -/* Insert a breakpoint on targets that don't have any better breakpoint - support. We read the contents of the target location and stash it, - then overwrite it with a breakpoint instruction. ADDR is the target - location in the target machine. CONTENTS_CACHE is a pointer to - memory allocated for saving the target contents. It is guaranteed - by the caller to be long enough to save sizeof BREAKPOINT bytes (this - is accomplished via BREAKPOINT_MAX). */ - -static int -remote_insert_breakpoint (addr, contents_cache) - CORE_ADDR addr; - char *contents_cache; -{ - int val; - - val = target_read_memory (addr, contents_cache, sizeof break_insn); - - if (val == 0) - val = target_write_memory (addr, (char *)break_insn, sizeof break_insn); - - return val; -} - -static int -remote_remove_breakpoint (addr, contents_cache) - CORE_ADDR addr; - char *contents_cache; -{ - return target_write_memory (addr, contents_cache, sizeof break_insn); -} - -/* Define the target subroutine names */ - -struct target_ops remote_hppro_ops = { - "hppro", /* to_shortname */ - "Remote serial target for HP-PRO targets", /* to_longname */ - "Use a remote computer via a serial line, using a gdb-specific protocol.\n\ -This is for targets that supports the HP-PRO standard.\n\ -Specify the serial device it is connected to (e.g. /dev/ttya) or telnet port.", /* to_doc */ - remote_open, /* to_open */ - remote_close, /* to_close */ - NULL, /* to_attach */ - remote_detach, /* to_detach */ - remote_resume, /* to_resume */ - remote_wait, /* to_wait */ - remote_fetch_registers, /* to_fetch_registers */ - remote_store_registers, /* to_store_registers */ - remote_prepare_to_store, /* to_prepare_to_store */ - remote_xfer_memory, /* to_xfer_memory */ - remote_files_info, /* to_files_info */ - - remote_insert_breakpoint, /* to_insert_breakpoint */ - remote_remove_breakpoint, /* to_remove_breakpoint */ - - NULL, /* to_terminal_init */ - NULL, /* to_terminal_inferior */ - NULL, /* to_terminal_ours_for_output */ - NULL, /* to_terminal_ours */ - NULL, /* to_terminal_info */ - remote_kill, /* to_kill */ - hppro_load, /* to_load */ - NULL, /* to_lookup_symbol */ - NULL, /* to_create_inferior */ - remote_mourn, /* to_mourn_inferior */ - 0, /* to_can_run */ - 0, /* to_notice_signals */ - 0, /* to_thread_alive */ - 0, /* to_stop */ - process_stratum, /* to_stratum */ - NULL, /* to_next */ - 1, /* to_has_all_memory */ - 1, /* to_has_memory */ - 1, /* to_has_stack */ - 1, /* to_has_registers */ - 1, /* to_has_execution */ - NULL, /* sections */ - NULL, /* sections_end */ - OPS_MAGIC /* to_magic */ -}; - -void -_initialize_remote_hppro () -{ - struct cmd_list_element *c; - add_target (&remote_hppro_ops); - - /* this sets the type of download protocol */ - c = add_set_cmd ("loadtype", no_class, var_string, (char *)&loadtype_str, - "Set the type of the remote load protocol.\n", &setlist); - c->function.sfunc = set_loadtype_command; - add_show_from_set (c, &showlist); - loadtype_str = savestring ("generic", 8); - - /* this adds a command to boot the board */ - add_com ("boot", class_support, boot_board, - "Boot the damn target board.\n"); -} - -static void -set_loadtype_command (ignore, from_tty, c) - char *ignore; - int from_tty; - struct cmd_list_element *c; -{ - loadtype_str = savestring (*(char **) c->var, strlen (*(char **) c->var)); -} - diff --git a/contrib/gdb/gdb/remote-sim.h b/contrib/gdb/gdb/remote-sim.h deleted file mode 100644 index 8c106a29262a7..0000000000000 --- a/contrib/gdb/gdb/remote-sim.h +++ /dev/null @@ -1,142 +0,0 @@ -/* This file defines the interface between the simulator and gdb. - Copyright (C) 1993, 1994 Free Software Foundation, Inc. - -This file is part of GDB. - -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 2 of the License, 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ - -#if !defined (REMOTE_SIM_H) -#define REMOTE_SIM_H 1 - -#include "callback.h" -/* This file is used when building stand-alone simulators, so isolate this - file from gdb. */ - -/* Pick up CORE_ADDR_TYPE if defined (from gdb), otherwise use same value as - gdb does (unsigned int - from defs.h). */ - -#ifndef CORE_ADDR_TYPE -typedef unsigned int SIM_ADDR; -#else -typedef CORE_ADDR_TYPE SIM_ADDR; -#endif - -/* Callbacks. - The simulator may use the following callbacks (gdb routines) which the - standalone program must provide. - - void printf_filtered (char *msg, ...); - void error /-* noreturn *-/ (char *msg, ...); - void *xmalloc (long size); - int sim_callback_write_stdout (char *, int len); - - The new way of doing I/O is to use the pointer provided by GDB - via the sim_set_callbacks call, look in callbacks.c to see what - can be done. -*/ - -/* Main simulator entry points ... - - All functions that can get an error must call the gdb routine `error', - they can only return upon success. */ - -/* Initialize the simulator. This function is called when the simulator - is selected from the command line. ARGS is passed from the command line - and can be used to select whatever run time options the simulator provides. - ARGS is the raw character string and must be parsed by the simulator, - which is trivial to do with the buildargv function in libiberty. - It is ok to do nothing. */ - -void sim_open PARAMS ((char *args)); - -/* Terminate usage of the simulator. This may involve freeing target memory - and closing any open files and mmap'd areas. You cannot assume sim_kill - has already been called. - QUITTING is non-zero if we cannot hang on errors. */ - -void sim_close PARAMS ((int quitting)); - -/* Load program PROG into the simulator. - Return non-zero if you wish the caller to handle it - (it is done this way because most simulators can use gr_load_image, - but defining it as a callback seems awkward). */ - -int sim_load PARAMS ((char *prog, int from_tty)); - -/* Prepare to run the simulated program. - START_ADDRESS is, yes, you guessed it, the start address of the program. - ARGV and ENV are NULL terminated lists of pointers. - Gdb will set the start address via sim_store_register as well, but - standalone versions of existing simulators are not set up to cleanly call - sim_store_register, so the START_ADDRESS argument is there as a - workaround. */ - -void sim_create_inferior PARAMS ((SIM_ADDR start_address, - char **argv, char **env)); - -/* Kill the running program. - This may involve closing any open files and deleting any mmap'd areas. */ - -void sim_kill PARAMS ((void)); - -/* Read LENGTH bytes of the simulated program's memory and store in BUF. - Result is number of bytes read, or zero if error. */ - -int sim_read PARAMS ((SIM_ADDR mem, unsigned char *buf, int length)); - -/* Store LENGTH bytes from BUF in the simulated program's memory. - Result is number of bytes write, or zero if error. */ - -int sim_write PARAMS ((SIM_ADDR mem, unsigned char *buf, int length)); - -/* Fetch register REGNO and store the raw value in BUF. */ - -void sim_fetch_register PARAMS ((int regno, unsigned char *buf)); - -/* Store register REGNO from BUF (in raw format). */ - -void sim_store_register PARAMS ((int regno, unsigned char *buf)); - -/* Print some interesting information about the simulator. - VERBOSE is non-zero for the wordy version. */ - -void sim_info PARAMS ((int verbose)); - -/* Fetch why the program stopped. - SIGRC will contain either the argument to exit() or the signal number. */ - -enum sim_stop { sim_exited, sim_stopped, sim_signalled }; - -void sim_stop_reason PARAMS ((enum sim_stop *reason, int *sigrc)); - -/* Run (or resume) the program. */ - -void sim_resume PARAMS ((int step, int siggnal)); - -/* Passthru for other commands that the simulator might support. */ - -void sim_do_command PARAMS ((char *cmd)); - - -/* Callbacks for the simulator to use. */ - -int sim_callback_write_stdout PARAMS ((char *, int)); - -/* Provide simulator with a standard host_callback_struct. */ - -void sim_set_callbacks PARAMS ((struct host_callback_struct *)); - - -#endif /* !defined (REMOTE_SIM_H) */ diff --git a/contrib/gdb/gdb/ser-mac.c b/contrib/gdb/gdb/ser-mac.c deleted file mode 100644 index df0040edbf20a..0000000000000 --- a/contrib/gdb/gdb/ser-mac.c +++ /dev/null @@ -1,362 +0,0 @@ -/* Remote serial interface for local (hardwired) serial ports for Macintosh. - Copyright 1994 Free Software Foundation, Inc. - Contributed by Cygnus Support. Written by Stan Shebs. - - This file is part of GDB. - - 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 2 of the License, 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ - -#include "defs.h" -#include "serial.h" - -#include <Types.h> -#include <Devices.h> -/* This is the regular Mac Serial.h, but copied to a different name - so as not to get confused with the GDB serial.h above. */ -#include "MacSerial.h" - -/* This is unused for now. We just return a placeholder. */ - -struct mac_ttystate - { - int bogus; - }; - -static int mac_open PARAMS ((serial_t scb, const char *name)); -static void mac_raw PARAMS ((serial_t scb)); -static int mac_readchar PARAMS ((serial_t scb, int timeout)); -static int mac_setbaudrate PARAMS ((serial_t scb, int rate)); -static int mac_write PARAMS ((serial_t scb, const char *str, int len)); -static void mac_close PARAMS ((serial_t scb)); -static serial_ttystate mac_get_tty_state PARAMS ((serial_t scb)); -static int mac_set_tty_state PARAMS ((serial_t scb, serial_ttystate state)); -static char *aptr PARAMS ((short p)); - -short input_refnum; -short output_refnum; - -char *mac_input_buffer; -char *mac_output_buffer; - -static int -mac_open (scb, name) - serial_t scb; - const char *name; -{ - OSErr err; - - /* Alloc buffer space first - that way any allocation failures are - intercepted before the serial driver gets involved. */ - if (mac_input_buffer == NULL) - mac_input_buffer = (char *) xmalloc (4096); - /* Match on a name and open a port. */ - if (strcmp (name, "modem") == 0) - { - err = OpenDriver ("\p.AIn", &input_refnum); - if (err != 0) - { - return (-1); - } - err = OpenDriver ("\p.AOut", &output_refnum); - if (err != 0) - { - CloseDriver (input_refnum); - return (-1); - } - } - else if (strcmp (name, "printer") == 0) - { - err = OpenDriver ("\p.BIn", &input_refnum); - if (err != 0) - { - return (-1); - } - err = OpenDriver ("\p.BOut", &output_refnum); - if (err != 0) - { - CloseDriver (input_refnum); - return (-1); - } - /* fake */ - scb->fd = 1; - return 0; - } - else - { - error ("You must specify a valid serial port name; your choices are `modem' or `printer'."); - errno = ENOENT; - return (-1); - } - /* We got something open. */ - if (1 /* using custom buffer */) - SerSetBuf (input_refnum, mac_input_buffer, 4096); - /* Set to a GDB-preferred state. */ - SerReset (input_refnum, stop10|noParity|data8|baud9600); - SerReset (output_refnum, stop10|noParity|data8|baud9600); - { - CntrlParam cb; - struct SerShk *handshake; - - cb.ioCRefNum = output_refnum; - cb.csCode = 14; - handshake = (struct SerShk *) &cb.csParam[0]; - handshake->fXOn = 0; - handshake->fCTS = 0; - handshake->xOn = 0; - handshake->xOff = 0; - handshake->errs = 0; - handshake->evts = 0; - handshake->fInX = 0; - handshake->fDTR = 0; - err = PBControl ((ParmBlkPtr) &cb, 0); - if (err < 0) - return (-1); - } - /* fake */ - scb->fd = 1; - return 0; -} - -static int -mac_noop (scb) - serial_t scb; -{ - return 0; -} - -static void -mac_raw (scb) - serial_t scb; -{ - /* Always effectively in raw mode. */ -} - -/* Read a character with user-specified timeout. TIMEOUT is number of seconds - to wait, or -1 to wait forever. Use timeout of 0 to effect a poll. Returns - char if successful. Returns -2 if timeout expired, EOF if line dropped - dead, or -3 for any other error (see errno in that case). */ - -static int -mac_readchar (scb, timeout) - serial_t scb; - int timeout; -{ - int status, n; - /* time_t */ unsigned long start_time, now; - OSErr err; - CntrlParam cb; - IOParam pb; - - if (scb->bufcnt-- > 0) - return *scb->bufp++; - - time (&start_time); - - while (1) - { - cb.ioCRefNum = input_refnum; - cb.csCode = 2; - err = PBStatus ((ParmBlkPtr) &cb, 0); - if (err < 0) - return SERIAL_ERROR; - n = *((long *) &cb.csParam[0]); - if (n > 0) - { - pb.ioRefNum = input_refnum; - pb.ioBuffer = (Ptr) (scb->buf); - pb.ioReqCount = (n > 64 ? 64 : n); - err = PBRead ((ParmBlkPtr) &pb, 0); - if (err < 0) - return SERIAL_ERROR; - scb->bufcnt = pb.ioReqCount; - scb->bufcnt--; - scb->bufp = scb->buf; - return *scb->bufp++; - } - else if (timeout == 0) - return SERIAL_TIMEOUT; - else if (timeout == -1) - ; - else - { - time (&now); - if (now > start_time + timeout) - return SERIAL_TIMEOUT; - } - PROGRESS (1); - } -} - -/* mac_{get set}_tty_state() are both dummys to fill out the function - vector. Someday, they may do something real... */ - -static serial_ttystate -mac_get_tty_state (scb) - serial_t scb; -{ - struct mac_ttystate *state; - - state = (struct mac_ttystate *) xmalloc (sizeof *state); - - return (serial_ttystate) state; -} - -static int -mac_set_tty_state (scb, ttystate) - serial_t scb; - serial_ttystate ttystate; -{ - return 0; -} - -static int -mac_noflush_set_tty_state (scb, new_ttystate, old_ttystate) - serial_t scb; - serial_ttystate new_ttystate; - serial_ttystate old_ttystate; -{ - return 0; -} - -static void -mac_print_tty_state (scb, ttystate) - serial_t scb; - serial_ttystate ttystate; -{ - /* Nothing to print. */ - return; -} - -/* If there is a tricky formula to relate real baud rates - to what the serial driver wants, we should use it. Until - we get one, this table will have to do. */ - -static struct { - int real_rate; - int bits; -} mac_baud_rate_table[] = { - { 57600, baud57600 }, - { 38400, 1 }, - { 19200, baud19200 }, - { 9600, baud9600 }, - { 7200, baud7200 }, - { 4800, baud4800 }, - { 3600, baud3600 }, - { 2400, baud2400 }, - { 1800, baud1800 }, - { 1200, baud1200 }, - { 600, baud600 }, - { 300, baud300 }, - { 0, 0 } -}; - -static int -mac_set_baud_rate (scb, rate) - serial_t scb; - int rate; -{ - int i, bits; - - for (i = 0; mac_baud_rate_table[i].real_rate != 0; ++i) - { - if (mac_baud_rate_table[i].real_rate == rate) - { - bits = mac_baud_rate_table[i].bits; - break; - } - } - SerReset (input_refnum, stop10|noParity|data8|bits); - SerReset (output_refnum, stop10|noParity|data8|bits); -} - -static int -mac_set_stop_bits (scb, num) - serial_t scb; - int num; -{ - return 0; -} - -int first_mac_write = 0; - -static int -mac_write (scb, str, len) - serial_t scb; - const char *str; - int len; -{ - OSErr err; - IOParam pb; - - if (first_mac_write++ < 4) - { - sleep (1); - } - pb.ioRefNum = output_refnum; - pb.ioBuffer = (Ptr) str; - pb.ioReqCount = len; - err = PBWrite ((ParmBlkPtr) &pb, 0); - if (err < 0) - { - return 1; - } - return 0; -} - -static void -mac_close (serial_t scb) -{ - if (input_refnum) - { - if (1 /* custom buffer */) - SerSetBuf (input_refnum, mac_input_buffer, 0); - CloseDriver (input_refnum); - input_refnum = 0; - } - if (output_refnum) - { - if (0 /* custom buffer */) - SerSetBuf (input_refnum, mac_output_buffer, 0); - CloseDriver (output_refnum); - output_refnum = 0; - } -} - -static struct serial_ops mac_ops = -{ - "hardwire", - 0, - mac_open, - mac_close, - mac_readchar, - mac_write, - mac_noop, /* flush output */ - mac_noop, /* flush input */ - mac_noop, /* send break -- currently only for nindy */ - mac_raw, - mac_get_tty_state, - mac_set_tty_state, - mac_print_tty_state, - mac_noflush_set_tty_state, - mac_set_baud_rate, - mac_set_stop_bits, - mac_noop, /* wait for output to drain */ -}; - -void -_initialize_ser_mac () -{ - serial_add_interface (&mac_ops); -} diff --git a/contrib/gdb/gdb/ser-ocd.c b/contrib/gdb/gdb/ser-ocd.c deleted file mode 100644 index 971f84e049c45..0000000000000 --- a/contrib/gdb/gdb/ser-ocd.c +++ /dev/null @@ -1,209 +0,0 @@ -/* Remote serial interface for Macraigor Systems implementation of - On-Chip Debugging using serial target box or serial wiggler - - Copyright 1994, 1997 Free Software Foundation, Inc. - - This file is part of GDB. - - 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 2 of the License, 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ - -#include "defs.h" -#include "serial.h" - -#ifdef _WIN32 -#include <windows.h> -#endif - -static int ser_ocd_open PARAMS ((serial_t scb, const char *name)); -static void ser_ocd_raw PARAMS ((serial_t scb)); -static int ser_ocd_readchar PARAMS ((serial_t scb, int timeout)); -static int ser_ocd_setbaudrate PARAMS ((serial_t scb, int rate)); -static int ser_ocd_write PARAMS ((serial_t scb, const char *str, int len)); -static void ser_ocd_close PARAMS ((serial_t scb)); -static serial_ttystate ser_ocd_get_tty_state PARAMS ((serial_t scb)); -static int ser_ocd_set_tty_state PARAMS ((serial_t scb, serial_ttystate state)); - -#ifdef _WIN32 -/* On Windows, this function pointer is initialized to a function in - the wiggler DLL. */ -static int (*dll_do_command) PARAMS ((const char *, char *)); -#endif - -static int -ocd_open (scb, name) - serial_t scb; - const char *name; -{ -#ifdef _WIN32 - /* Find the wiggler DLL which talks to the board. */ - if (dll_do_command == NULL) - { - HINSTANCE handle; - - /* FIXME: Should the user be able to configure this? */ - handle = LoadLibrary ("Wigglers.dll"); - if (handle == NULL) - error ("Can't load Wigglers.dll"); - - dll_do_command = ((int (*) PARAMS ((const char *, char *))) - GetProcAddress (handle, "do_command")); - if (dll_do_command == NULL) - error ("Can't find do_command function in Wigglers.dll"); - } -#else - /* No wiggler DLLs on Unix yet, fail. */ - error ("Wiggler library not available for this type of host."); -#endif /* _WIN32 */ - return 0; -} - -static int -ocd_noop (scb) - serial_t scb; -{ - return 0; -} - -static void -ocd_raw (scb) - serial_t scb; -{ - /* Always in raw mode */ -} - -static void -ocd_readremote () -{ -} - -/* We need a buffer to store responses from the Wigglers.dll */ -#define WIGGLER_BUFF_SIZE 512 -unsigned char from_wiggler_buffer[WIGGLER_BUFF_SIZE]; -unsigned char * wiggler_buffer_ptr; /* curr spot in buffer */ - -static int -ocd_readchar (scb, timeout) - serial_t scb; - int timeout; -{ - /* Catch attempts at reading past the end of the buffer */ - if (wiggler_buffer_ptr > - (from_wiggler_buffer + (sizeof (char *) * WIGGLER_BUFF_SIZE))) - error ("ocd_readchar asked to read past the end of the buffer!"); - - return (int) *wiggler_buffer_ptr++; /* return curr char and increment ptr */ -} - -struct ocd_ttystate { - int dummy; -}; - -/* ocd_{get set}_tty_state() are both dummys to fill out the function - vector. Someday, they may do something real... */ - -static serial_ttystate -ocd_get_tty_state (scb) - serial_t scb; -{ - struct ocd_ttystate *state; - - state = (struct ocd_ttystate *) xmalloc (sizeof *state); - - return (serial_ttystate) state; -} - -static int -ocd_set_tty_state (scb, ttystate) - serial_t scb; - serial_ttystate ttystate; -{ - return 0; -} - -static int -ocd_noflush_set_tty_state (scb, new_ttystate, old_ttystate) - serial_t scb; - serial_ttystate new_ttystate; - serial_ttystate old_ttystate; -{ - return 0; -} - -static void -ocd_print_tty_state (scb, ttystate) - serial_t scb; - serial_ttystate ttystate; -{ - /* Nothing to print. */ - return; -} - -static int -ocd_setbaudrate (scb, rate) - serial_t scb; - int rate; -{ - return 0; -} - -static int -ocd_write (scb, str, len) - serial_t scb; - const char *str; - int len; -{ - char c; - -#ifdef _WIN32 - /* send packet to Wigglers.dll and store response so we can give it to - remote-wiggler.c when get_packet is run */ - dll_do_command (str, from_wiggler_buffer); - wiggler_buffer_ptr = from_wiggler_buffer; -#endif - - return 0; -} - -static void -ocd_close (scb) - serial_t scb; -{ -} - -static struct serial_ops ocd_ops = -{ - "ocd", - 0, - ocd_open, - ocd_close, - ocd_readchar, - ocd_write, - ocd_noop, /* flush output */ - ocd_noop, /* flush input */ - ocd_noop, /* send break -- currently used only for nindy */ - ocd_raw, - ocd_get_tty_state, - ocd_set_tty_state, - ocd_print_tty_state, - ocd_noflush_set_tty_state, - ocd_setbaudrate, - ocd_noop, /* wait for output to drain */ -}; - -void -_initialize_ser_ocd_bdm () -{ - serial_add_interface (&ocd_ops); -} diff --git a/contrib/gdb/gdb/signals.h b/contrib/gdb/gdb/signals.h deleted file mode 100644 index a1348b6373305..0000000000000 --- a/contrib/gdb/gdb/signals.h +++ /dev/null @@ -1,27 +0,0 @@ -/* Signal handler definitions for GDB, the GNU Debugger. - Copyright (C) 1986, 1989 Free Software Foundation, Inc. - -This file is part of GDB. - -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 2 of the License, 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ - - -/* This file is almost the same as including <signal.h> except that it - eliminates certain signal names when job control is not supported, - (or, on some systems, when job control is there but doesn't work - the way GDB expects it to work). */ -/* This has been superceded by the job_control variable in serial.h. */ - -#include <signal.h> diff --git a/contrib/gdb/gdb/stuff.c b/contrib/gdb/gdb/stuff.c deleted file mode 100644 index babd29fae6f3d..0000000000000 --- a/contrib/gdb/gdb/stuff.c +++ /dev/null @@ -1,178 +0,0 @@ -/* Program to stuff files into a specially prepared space in kdb. - Copyright (C) 1986, 1989, 1991 Free Software Foundation, Inc. - - This file is part of GDB. - - 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 2 of the License, 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., 59 Temple Place - Suite 330, - Boston, MA 02111-1307, USA. */ - -/* Written 13-Mar-86 by David Bridgham. */ - -#include <stdio.h> -#include <a.out.h> -#include <sys/types.h> -#include "gdb_stat.h" -#include <sys/file.h> -#include <varargs.h> - -main (argc, argv) - int argc; - char *argv[]; -{ - register char *cp; - char *outfile; - register int i; - int offset; - int out_fd, in_fd; - struct stat stat_buf; - int size, pad; - char buf[1024]; - static char zeros[4] = - {0}; - - if (argc < 4) - err ("Not enough arguments\nUsage: %s -o kdb file1 file2 ...\n", - argv[0]); - - outfile = 0; - for (i = 1; i < argc; i++) - { - if (STREQ (argv[i], "-o")) - outfile = argv[++i]; - } - if (outfile == 0) - err ("Output file not specified\n"); - - offset = get_offset (outfile, "_heap"); - - out_fd = open (outfile, O_WRONLY); - if (out_fd < 0) - err ("Error opening %s for write: %s\n", outfile, strerror (errno)); - if (lseek (out_fd, offset, 0) < 0) - err ("Error seeking to heap in %s: %s\n", outfile, strerror (errno)); - - /* For each file listed on the command line, write it into the - * 'heap' of the output file. Make sure to skip the arguments - * that name the output file. */ - for (i = 1; i < argc; i++) - { - if (STREQ (argv[i], "-o")) - continue; - if ((in_fd = open (argv[i], O_RDONLY)) < 0) - err ("Error opening %s for read: %s\n", argv[i], - strerror (errno)); - if (fstat (in_fd, &stat_buf) < 0) - err ("Error stat'ing %s: %s\n", argv[i], strerror (errno)); - size = strlen (argv[i]); - pad = 4 - (size & 3); - size += pad + stat_buf.st_size + sizeof (int); - write (out_fd, &size, sizeof (int)); - write (out_fd, argv[i], strlen (argv[i])); - write (out_fd, zeros, pad); - while ((size = read (in_fd, buf, sizeof (buf))) > 0) - write (out_fd, buf, size); - close (in_fd); - } - size = 0; - write (out_fd, &size, sizeof (int)); - close (out_fd); - return (0); -} - -/* Read symbol table from file and returns the offset into the file - * where symbol sym_name is located. If error, print message and - * exit. */ -get_offset (file, sym_name) - char *file; - char *sym_name; -{ - int f; - struct exec file_hdr; - struct nlist *symbol_table; - int size; - char *strings; - - f = open (file, O_RDONLY); - if (f < 0) - err ("Error opening %s: %s\n", file, strerror (errno)); - if (read (f, &file_hdr, sizeof (file_hdr)) < 0) - err ("Error reading exec structure: %s\n", strerror (errno)); - if (N_BADMAG (file_hdr)) - err ("File %s not an a.out file\n", file); - - /* read in symbol table */ - if ((symbol_table = (struct nlist *) malloc (file_hdr.a_syms)) == 0) - err ("Couldn't allocate space for symbol table\n"); - if (lseek (f, N_SYMOFF (file_hdr), 0) == -1) - err ("lseek error: %s\n", strerror (errno)); - if (read (f, symbol_table, file_hdr.a_syms) == -1) - err ("Error reading symbol table from %s: %s\n", file, - strerror (errno)); - - /* read in string table */ - if (read (f, &size, 4) == -1) - err ("reading string table size: %s\n", strerror (errno)); - if ((strings = (char *) malloc (size)) == 0) - err ("Couldn't allocate memory for string table\n"); - if (read (f, strings, size - 4) == -1) - err ("reading string table: %s\n", strerror (errno)); - - /* Find the core address at which the first byte of kdb text segment - should be loaded into core when kdb is run. */ - origin = find_symbol ("_etext", symbol_table, file_hdr.a_syms, strings) - - file_hdr.a_text; - /* Find the core address at which the heap will appear. */ - coreaddr = find_symbol (sym_name, symbol_table, file_hdr.a_syms, strings); - /* Return address in file of the heap data space. */ - return (N_TXTOFF (file_hdr) + core_addr - origin); -} - -find_symbol (sym_name, symbol_table, length, strings) - char *sym_name; - struct nlist *symbol_table; - int length; - char *strings; -{ - register struct nlist *sym; - - /* Find symbol in question */ - for (sym = symbol_table; - sym != (struct nlist *) ((char *) symbol_table + length); - sym++) - { - if ((sym->n_type & N_TYPE) != N_DATA) - continue; - if (sym->n_un.n_strx == 0) - continue; - if (STREQ (sym_name, strings + sym->n_un.n_strx - 4)) - return sym->n_value; - } - err ("Data symbol %s not found in %s\n", sym_name, file); -} - -/* VARARGS */ -void -err (va_alist) - va_dcl -{ - va_list args; - char *string; - - va_start (args); - string = va_arg (args, char *); - vfprintf (gdb_stderr, string, args); - va_end (args); - exit (-1); -} diff --git a/contrib/gdb/gdb/thread.h b/contrib/gdb/gdb/thread.h deleted file mode 100644 index 6777887af2e5a..0000000000000 --- a/contrib/gdb/gdb/thread.h +++ /dev/null @@ -1,46 +0,0 @@ -/* Multi-process/thread control defs for GDB, the GNU debugger. - Copyright 1987, 1988, 1989, 1990, 1991, 1992, 1993 - - Contributed by Lynx Real-Time Systems, Inc. Los Gatos, CA. - Free Software Foundation, Inc. - -This file is part of GDB. - -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 2 of the License, 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ - -#ifndef THREAD_H -#define THREAD_H - -extern void init_thread_list PARAMS ((void)); - -extern void add_thread PARAMS ((int pid)); - -extern int in_thread_list PARAMS ((int pid)); - -extern int pid_to_thread_id PARAMS ((int pid)); - -extern int valid_thread_id PARAMS ((int thread)); - -extern void load_infrun_state PARAMS ((int, CORE_ADDR *, CORE_ADDR *, char **, - int *, struct breakpoint **, - struct breakpoint **, CORE_ADDR *, - CORE_ADDR *, CORE_ADDR *, int *, int *)); - -extern void save_infrun_state PARAMS ((int, CORE_ADDR, CORE_ADDR, char *, - int, struct breakpoint *, - struct breakpoint *, CORE_ADDR, - CORE_ADDR, CORE_ADDR, int, int)); - -#endif /* THREAD_H */ diff --git a/contrib/gdb/gdb/tui/ChangeLog b/contrib/gdb/gdb/tui/ChangeLog deleted file mode 100644 index 7dc1bf60460b4..0000000000000 --- a/contrib/gdb/gdb/tui/ChangeLog +++ /dev/null @@ -1,121 +0,0 @@ -1999-01-26 Jason Molenda (jsm@bugshack.cygnus.com) - - * tui.h: Include stdarg.h instead of varargs.h if we're on an ISO Cish - system. - -Thu Dec 31 12:08:32 1998 David Taylor <taylor@texas.cygnus.com> - - The following changes were made by Jim Blandy <jimb@cygnus.com>, - Edith Epstein <eepstein@cygnus.com>, Elena Zannoni - <ezannoni@cygnus.com> Stan Shebs <shebs@cygnus.com>, and David - Taylor <taylor@cygnus.com>, as part of the project to merge in - changes originally made by HP; HP did not create ChangeLog - entries. - - * Makefile.in: New file; we're merging HP's changes into GDB, and - we've moved the TUI files into a subdirectory, so we need a new - Makefile. - - * tui.c: - #include <term.h>, if we have it, to get declarations for - the termcap functions on Solaris. - (tgoto): Add external K&R declaration for this; Solaris doesn't - bother to actually declare it in their header files. - (_tuiReset): Ignore the #definition of TIOCGETC if USG is defined; - we'd rather use the USG mechanisms than the Berkeley mechanisms - (TIOCGETC is one of the Berkeley terminal control ioctls). - Apologies if this causes trouble later; this should all be handled - by autoconf... - (strcat_to_buf, strcat_to_buf_with_fmt): New functions, moved here - from ../utils.h. - (tuiFree): replace safe_free with free. - (strcat_to_buf): new function, copied from utils.c. - (tuiInit): Add ignored `argv0' argument, to match the type that - init_ui_hook expects; updated declaration. Call the - initialize_tui_files function constructed above. Initialize - flush_hook to NULL. - (tuiInitWindows): Call tuiSetLocatorContent, to get the first - element of the locator window's content allocated. This seems - wrong, because it must have been initialized somehow in HP's - sources, and we should do it the same way now. But we do get - further before it segfaults. [Postscript: HP didn't bother to - initialize it; they compile - (va_catch_errors, vcatch_errors): Functions moved here from - ../utils.c in HP's sources. They're not used anywhere else. - (xdb_style): Delete this variable, and remove all references to - it. It's always true. - (tuiInit, _tui_vDo): References removed. - - * tui.h: Add prototypes. - Don't #include "gendefs.h"; it's only used in the TUI. - Integrate its contents into this file: - #include <ansidecl.h> here. - (Opaque, OpaqueFuncPtr): Typedefs moved to here. - - * tuiCommand.c: #include "defs.h", so we get the appropriate - definition of GDB_FILE. - - * tuiData.c - (freeWindow): replace safe_free with free. - (tui_version): don't define it here; it's defined in main.c now. - - * tuiDisassem.c - (tuiSetDisassemContent): Call strcat_address_numeric instead of - strcat_address. Simplify the control structure. Use predefined - GDB function to print asm inst address. Use GDB_FILE to collect - output into buffers. - - * tuiIO.c - (tgoto): Add external K&R declaration for this here too. - (tuiGetc, tuiTermSetup, tuiTermUnsetup): Same. - (tuiPuts_unfiltered): change FILE to GDB_FILE. - (tui_tputs): fix prototype for 3rd argument. - - * tuiIO.h (tuiPuts_unfiltered): change declaration. - - * tuiLayout.c - (_tuiSetLayoutTo): for displaying registers, hook up the HP code - that decides which registers to display (i.e. single precision - float, double precision float, general, special). Previously, - only handled TUI_GENERAL_REGS. Now that the code is hooked up, - compiling with -z poses a problem. When the first layout command - is 'layout regs', dataWin->detail is a NULL pointer, and gdb - core dumps. - - * tuiLayout.c (_tuiSetLayoutTo): replace safe_free with free. - - * tuiRegs.c #include "defs.h" earlier, to avoid problems in - <stdarg.h>. No idea exactly what's conflicting with what, but the - errors went away... - (_tuiRegisterFormat): Change so that function creates a GDB_FILE - object, calls pa_do_strcat_registers_info, copies the register - info into a buffer, and deallocates the GDB_FILE object. Remove - some code that is not executed. Also, call to - pa_do_strcat_registers_info has an additional parameter, - precision. This code requires some new per-target functions that - we don't want to merge. Dyke it out, with #ifdef - TUI_EXTENDED_FORMATTERS. - (_tuiSetSpecialRegsContent): this function was ifdefed out. - Hooked this up. - (_tuiSetGeneralAndSpecialRegsContent): this function was ifdefed - out. Hooked it up. - (IS_64BIT): Just define this to be zero; we're not merging in the - 64-bit support. - (tuiShowRegisters): Comment out all references to the "special" - regs; we don't have a distinction between the "special" and - "non-special" regs in most of our machine descriptions. This code - is PA-specific in other ways as well, and needs to be redesigned - to be portable to other processors. - - * tuiWin.c: #include <string.h>, to get a declaration for - strchr. - - * tui.c, tuiCommand.c, tuiData.c, tuiDataWin.c, tuiDisassem.c, - tuiGeneralWin.c, tuiIO.c, tuiLayout.c, tuiRegs.c, tuiSource.c, - tuiSourceWin.c, tuiStack.c, tuiWin.c: New files (from HP). Changed - bool to int throughout. Re-indented, GNU style. - - * tui.h, tuiCommand.h, tuiData.h, tuiDataWin.h, tuiDisassem.h, - tuiGeneralWin.h, tuiIO.h, tuiLayout.h, tuiRegs.h, tuiSource.h, - tuiSourceWin.h, tuiStack.h, tuiWin.h: new files (from HP). - Changed bool to int throughout. diff --git a/contrib/gdb/gdb/tui/Makefile b/contrib/gdb/gdb/tui/Makefile deleted file mode 100644 index ed89c6e61769c..0000000000000 --- a/contrib/gdb/gdb/tui/Makefile +++ /dev/null @@ -1,182 +0,0 @@ -# Generated automatically from Makefile.in by configure. -# Copyright 1998 Free Software Foundation, Inc. - -# This file is part of GDB. - -# 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 2 of the License, 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - -all: libtui.a - -srcdir=. - -SHELL = /bin/sh - -CC=gcc -CFLAGS=-g -O2 -AR=ar -RANLIB=ranlib - -# Host and target-dependent makefile fragments come in here. - -# Host: Sun 4 or Sparcstation, running SunOS 4 -XDEPFILES= ser-tcp.o -XM_FILE= xm-sun4os4.h -NAT_FILE= nm-sun4os4.h -NATDEPFILES= fork-child.o infptrace.o inftarg.o corelow.o sparc-nat.o -HOST_IPC=-DBSD_IPC -GDBSERVER_DEPFILES= low-sparc.o -# Setting XM_CLIBS=-lresolv would let us use the DNS, but that would screw -# anyone who wants to use NIS, which includes at least one Cygnus customer -# (PR 3593). So leave it this way until/unless we find a resolver which can -# get names from either DNS or NIS from the same GDB binary. - -# Target: Sun 4 or Sparcstation, running SunOS 4 -TDEPFILES= sparc-tdep.o solib.o -TM_FILE= tm-sun4os4.h -# End of host and target-dependent makefile fragments - -# Where is our "include" directory? Typically $(srcdir)/../include. -# This is essentially the header file directory for the library -# routines in libiberty. -INCLUDE_DIR = $(srcdir)/../../include -INCLUDE_CFLAGS = -I$(INCLUDE_DIR) - -# Configured by the --with-mmalloc option to configure. -MMALLOC = -MMALLOC_CFLAGS = - -# Where is the BFD library? Typically in ../bfd. -BFD_DIR = ../../bfd -BFD_SRC = $(srcdir)/$(BFD_DIR) -BFD_CFLAGS = -I$(BFD_DIR) -I$(BFD_SRC) - -# Where is the READLINE library? Typically in ../readline. -READLINE_DIR = ../../readline -READLINE_SRC = $(srcdir)/$(READLINE_DIR) -READLINE_CFLAGS = -I$(READLINE_SRC) - -# Where is the INTL library? Typically in ../intl. -INTL_DIR = ../../intl -INTL_SRC = $(srcdir)/$(INTL_DIR) -INTL_CFLAGS = -I$(INTL_DIR) -I$(INTL_SRC) - -# Where is the TCL library? Typically in ../tcl. -TCL_CFLAGS = @TCLHDIR@ - -# Where is the TK library? Typically in ../tk. -TK_CFLAGS = @TKHDIR@ @TK_BUILD_INCLUDES@ - -# Where is Itcl? Typically in ../itcl. -ITCL_CFLAGS = @ITCLHDIR@ - -# Where is Tix? Typically in ../tix. -TIX_CFLAGS = @TIXHDIR@ - -X11_CFLAGS = @TK_XINCLUDES@ - -ENABLE_IDE= @ENABLE_IDE@ - -GUI_CFLAGS_X = -I$(srcdir)/../../libgui/src - -IDE_CFLAGS_X = -I$(srcdir)/../../libidetcl/src -I$(srcdir)/../../libide/src \ - `if [ x"$(ENABLE_IDE)" != x ] ; then \ - echo -DIDE -I$(srcdir)/../../ilu/runtime/mainloop;\ - fi` - -IDE_CFLAGS=$(GUI_CFLAGS_X) $(IDE_CFLAGS_X) - -ENABLE_CFLAGS= - -# -I. for config files. -# -I$(srcdir) for gdb internal headers and possibly for gnu-regex.h also. -# -I$(srcdir)/config for more generic config files. - -# It is also possible that you will need to add -I/usr/include/sys if -# your system doesn't have fcntl.h in /usr/include (which is where it -# should be according to Posix). -DEFS = -DHAVE_CONFIG_H -GDB_CFLAGS = -I. -I.. -I$(srcdir) -I$(srcdir)/.. -I$(srcdir)/../config $(DEFS) - -# M{H,T}_CFLAGS, if defined, have host- and target-dependent CFLAGS -# from the config directory. -GLOBAL_CFLAGS = $(MT_CFLAGS) $(MH_CFLAGS) -#PROFILE_CFLAGS = -pg - -# INTERNAL_CFLAGS is the aggregate of all other *CFLAGS macros. -INTERNAL_CFLAGS = $(CFLAGS) $(GLOBAL_CFLAGS) $(PROFILE_CFLAGS) \ - $(GDB_CFLAGS) $(READLINE_CFLAGS) $(BFD_CFLAGS) \ - $(MMALLOC_CFLAGS) $(INCLUDE_CFLAGS) $(INTL_CFLAGS) \ - $(ENABLE_CFLAGS) - -HEADERS = tuiIO.h tuiData.h tuiGeneralWin.h tuiLayout.h tuiStack.h \ - tuiSource.h tuiCommand.h tuiWin.h tuiDisassem.h \ - tuiSourceWin.h tuiRegs.h tuiDataWin.h - -SOURCES = tui.c tuiData.c tuiSource.c tuiStack.c tuiIO.c \ - tuiGeneralWin.c tuiLayout.c tuiWin.c tuiCommand.c \ - tuiDisassem.c tuiSourceWin.c tuiRegs.c tuiDataWin.c - -OBJECTS = tui.o tuiData.o tuiSource.o tuiStack.o tuiIO.o \ - tuiGeneralWin.o tuiLayout.o tuiWin.o tuiCommand.o \ - tuiDisassem.o tuiSourceWin.o tuiRegs.o tuiDataWin.o \ - tuiInit.o - - -# Prevent Sun make from putting in the machine type. Setting -# TARGET_ARCH to nothing works for SunOS 3, 4.0, but not for 4.1. -.c.o: - $(CC) -c $(INTERNAL_CFLAGS) $< -.SUFFIXES: .cpp -.c.cpp: - $(CC) -E $(INTERNAL_CFLAGS) $< > $@ - -libtui.a: $(OBJECTS) - rm -f libtui.a - $(AR) rc libtui.a $(OBJECTS) - $(RANLIB) libtui.a - -tui.o: tui.c tui.h tuiData.h tuiLayout.h tuiIO.h tuiRegs.h tuiWin.h -tuiCommand.o: tui.h tuiData.h tuiWin.h tuiIO.h -tuiData.o: tui.h tuiData.h -tuiDataWin.o: tui.h tuiData.h tuiRegs.h -tuiDisassem.o: tui.h tuiData.h tuiLayout.h tuiSourceWin.h tuiStack.h -tuiGeneralWin.o: tui.h tuiData.h tuiGeneralWin.h -tuiIO.o: tui.h tuiData.h tuiIO.h tuiCommand.h tuiWin.h -tuiLayout.o: tui.h tuiData.h tuiGeneralWin.h tuiStack.h tuiRegs.h \ - tuiDisassem.h -tuiRegs.o: tui.h tuiData.h tuiLayout.h tuiWin.h -tuiSource.o: tui.h tuiData.h tuiStack.h tuiSourceWin.h tuiSource.h -tuiSourceWin.o: tui.h tuiData.h tuiStack.h tuiSourceWin.h tuiSource.h \ - tuiDisassem.h -tuiStack.o: tui.h tuiData.h tuiStack.h tuiSourceWin.h -tuiWin.o: tui.h tuiData.h tuiGeneralWin.h tuiStack.h tuiSourceWin.h \ - tuiDataWin.h - -tuiInit.o: tuiInit.c -tuiInit.c: $(SOURCES) - @echo Making tuiInit.c - @rm -f init.c-tmp - @echo '/* Do not modify this file. */' >init.c-tmp - @echo '/* It is created automatically by the Makefile. */'>>init.c-tmp - @echo '#include "ansidecl.h"' >>init.c-tmp - @echo 'extern void initialize_tui_files PARAMS ((void));' >>init.c-tmp - @echo 'void initialize_tui_files PARAMS ((void)) {' >>init.c-tmp - @-( cd $(srcdir) ; grep '^_initialize_[a-z_0-9A-Z]* *(' $(SOURCES) ) 2>/dev/null \ - | sed -e 's/^.*://' -e 's/^\([a-z_0-9A-Z]*\).*/ {extern void \1 PARAMS ((void)); \1 ();}/' >>init.c-tmp - @echo '}' >>init.c-tmp - @mv init.c-tmp tuiInit.c - -clean: - rm -f *.o *.a diff --git a/contrib/gdb/gdb/tui/Makefile.in b/contrib/gdb/gdb/tui/Makefile.in deleted file mode 100644 index 256464b5bc5ec..0000000000000 --- a/contrib/gdb/gdb/tui/Makefile.in +++ /dev/null @@ -1,168 +0,0 @@ -# Copyright 1998 Free Software Foundation, Inc. - -# This file is part of GDB. - -# 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 2 of the License, 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - -all: libtui.a - -srcdir=@srcdir@ -VPATH = @srcdir@ - -SHELL = @SHELL@ - -CC=@CC@ -CFLAGS=@CFLAGS@ -AR=@AR@ -RANLIB=@RANLIB@ - -# Host and target-dependent makefile fragments come in here. -@host_makefile_frag@ -@target_makefile_frag@ -# End of host and target-dependent makefile fragments - -# Where is our "include" directory? Typically $(srcdir)/../include. -# This is essentially the header file directory for the library -# routines in libiberty. -INCLUDE_DIR = $(srcdir)/../../include -INCLUDE_CFLAGS = -I$(INCLUDE_DIR) - -# Configured by the --with-mmalloc option to configure. -MMALLOC = @MMALLOC@ -MMALLOC_CFLAGS = @MMALLOC_CFLAGS@ - -# Where is the BFD library? Typically in ../bfd. -BFD_DIR = ../../bfd -BFD_SRC = $(srcdir)/$(BFD_DIR) -BFD_CFLAGS = -I$(BFD_DIR) -I$(BFD_SRC) - -# Where is the READLINE library? Typically in ../readline. -READLINE_DIR = ../../readline -READLINE_SRC = $(srcdir)/$(READLINE_DIR) -READLINE_CFLAGS = -I$(READLINE_SRC) - -# Where is the INTL library? Typically in ../intl. -INTL_DIR = ../../intl -INTL_SRC = $(srcdir)/$(INTL_DIR) -INTL_CFLAGS = -I$(INTL_DIR) -I$(INTL_SRC) - -# Where is the TCL library? Typically in ../tcl. -TCL_CFLAGS = @TCLHDIR@ - -# Where is the TK library? Typically in ../tk. -TK_CFLAGS = @TKHDIR@ @TK_BUILD_INCLUDES@ - -# Where is Itcl? Typically in ../itcl. -ITCL_CFLAGS = @ITCLHDIR@ - -# Where is Tix? Typically in ../tix. -TIX_CFLAGS = @TIXHDIR@ - -X11_CFLAGS = @TK_XINCLUDES@ - -ENABLE_IDE= @ENABLE_IDE@ - -GUI_CFLAGS_X = -I$(srcdir)/../../libgui/src - -IDE_CFLAGS_X = -I$(srcdir)/../../libidetcl/src -I$(srcdir)/../../libide/src \ - `if [ x"$(ENABLE_IDE)" != x ] ; then \ - echo -DIDE -I$(srcdir)/../../ilu/runtime/mainloop;\ - fi` - -IDE_CFLAGS=$(GUI_CFLAGS_X) $(IDE_CFLAGS_X) - -ENABLE_CFLAGS= @ENABLE_CFLAGS@ - -# -I. for config files. -# -I$(srcdir) for gdb internal headers and possibly for gnu-regex.h also. -# -I$(srcdir)/config for more generic config files. - -# It is also possible that you will need to add -I/usr/include/sys if -# your system doesn't have fcntl.h in /usr/include (which is where it -# should be according to Posix). -DEFS = @DEFS@ -GDB_CFLAGS = -I. -I.. -I$(srcdir) -I$(srcdir)/.. -I$(srcdir)/../config $(DEFS) - -# M{H,T}_CFLAGS, if defined, have host- and target-dependent CFLAGS -# from the config directory. -GLOBAL_CFLAGS = $(MT_CFLAGS) $(MH_CFLAGS) -#PROFILE_CFLAGS = -pg - -# INTERNAL_CFLAGS is the aggregate of all other *CFLAGS macros. -INTERNAL_CFLAGS = $(CFLAGS) $(GLOBAL_CFLAGS) $(PROFILE_CFLAGS) \ - $(GDB_CFLAGS) $(READLINE_CFLAGS) $(BFD_CFLAGS) \ - $(MMALLOC_CFLAGS) $(INCLUDE_CFLAGS) $(INTL_CFLAGS) \ - $(ENABLE_CFLAGS) - -HEADERS = tuiIO.h tuiData.h tuiGeneralWin.h tuiLayout.h tuiStack.h \ - tuiSource.h tuiCommand.h tuiWin.h tuiDisassem.h \ - tuiSourceWin.h tuiRegs.h tuiDataWin.h - -SOURCES = tui.c tuiData.c tuiSource.c tuiStack.c tuiIO.c \ - tuiGeneralWin.c tuiLayout.c tuiWin.c tuiCommand.c \ - tuiDisassem.c tuiSourceWin.c tuiRegs.c tuiDataWin.c - -OBJECTS = tui.o tuiData.o tuiSource.o tuiStack.o tuiIO.o \ - tuiGeneralWin.o tuiLayout.o tuiWin.o tuiCommand.o \ - tuiDisassem.o tuiSourceWin.o tuiRegs.o tuiDataWin.o \ - tuiInit.o - - -# Prevent Sun make from putting in the machine type. Setting -# TARGET_ARCH to nothing works for SunOS 3, 4.0, but not for 4.1. -.c.o: - $(CC) -c $(INTERNAL_CFLAGS) $< -.SUFFIXES: .cpp -.c.cpp: - $(CC) -E $(INTERNAL_CFLAGS) $< > $@ - -libtui.a: $(OBJECTS) - rm -f libtui.a - $(AR) rc libtui.a $(OBJECTS) - $(RANLIB) libtui.a - -tui.o: tui.c tui.h tuiData.h tuiLayout.h tuiIO.h tuiRegs.h tuiWin.h -tuiCommand.o: tui.h tuiData.h tuiWin.h tuiIO.h -tuiData.o: tui.h tuiData.h -tuiDataWin.o: tui.h tuiData.h tuiRegs.h -tuiDisassem.o: tui.h tuiData.h tuiLayout.h tuiSourceWin.h tuiStack.h -tuiGeneralWin.o: tui.h tuiData.h tuiGeneralWin.h -tuiIO.o: tui.h tuiData.h tuiIO.h tuiCommand.h tuiWin.h -tuiLayout.o: tui.h tuiData.h tuiGeneralWin.h tuiStack.h tuiRegs.h \ - tuiDisassem.h -tuiRegs.o: tui.h tuiData.h tuiLayout.h tuiWin.h -tuiSource.o: tui.h tuiData.h tuiStack.h tuiSourceWin.h tuiSource.h -tuiSourceWin.o: tui.h tuiData.h tuiStack.h tuiSourceWin.h tuiSource.h \ - tuiDisassem.h -tuiStack.o: tui.h tuiData.h tuiStack.h tuiSourceWin.h -tuiWin.o: tui.h tuiData.h tuiGeneralWin.h tuiStack.h tuiSourceWin.h \ - tuiDataWin.h - -tuiInit.o: tuiInit.c -tuiInit.c: $(SOURCES) - @echo Making tuiInit.c - @rm -f init.c-tmp - @echo '/* Do not modify this file. */' >init.c-tmp - @echo '/* It is created automatically by the Makefile. */'>>init.c-tmp - @echo '#include "ansidecl.h"' >>init.c-tmp - @echo 'extern void initialize_tui_files PARAMS ((void));' >>init.c-tmp - @echo 'void initialize_tui_files PARAMS ((void)) {' >>init.c-tmp - @-( cd $(srcdir) ; grep '^_initialize_[a-z_0-9A-Z]* *(' $(SOURCES) ) 2>/dev/null \ - | sed -e 's/^.*://' -e 's/^\([a-z_0-9A-Z]*\).*/ {extern void \1 PARAMS ((void)); \1 ();}/' >>init.c-tmp - @echo '}' >>init.c-tmp - @mv init.c-tmp tuiInit.c - -clean: - rm -f *.o *.a diff --git a/contrib/gdb/gdb/tui/tui.c b/contrib/gdb/gdb/tui/tui.c deleted file mode 100644 index f64db4442a869..0000000000000 --- a/contrib/gdb/gdb/tui/tui.c +++ /dev/null @@ -1,830 +0,0 @@ -/* -** tui.c -** General functions for the WDB TUI -*/ - -#include <stdio.h> -#include <stdlib.h> -#include <ctype.h> -#include <malloc.h> -#include <curses.h> -#ifdef HAVE_TERM_H -#include <term.h> -#endif -#include <signal.h> -#include <fcntl.h> -#include <termio.h> -#include <setjmp.h> -#include "defs.h" -#include "gdbcmd.h" -#include "tui.h" -#include "tuiData.h" -#include "tuiLayout.h" -#include "tuiIO.h" -#include "tuiRegs.h" -#include "tuiWin.h" - -/* The Solaris header files seem to provide no declaration for this at - all when __STDC__ is defined. This shouldn't conflict with - anything. */ -extern char *tgoto (); - -/*********************** -** Local Definitions -************************/ -#define FILEDES 2 -/* Solaris <sys/termios.h> defines CTRL. */ -#ifndef CTRL -#define CTRL(x) (x & ~0140) -#endif -#define CHK(val, dft) (val<=0 ? dft : val) - -#define TOGGLE_USAGE "Usage:toggle breakpoints" -#define TUI_TOGGLE_USAGE "Usage:\ttoggle $fregs\n\ttoggle breakpoints" - -/***************************** -** Local static forward decls -******************************/ -static void _tuiReset PARAMS ((void)); -static void _toggle_command PARAMS ((char *, int)); -static void _tui_vToggle_command PARAMS ((va_list)); -static Opaque _tui_vDo PARAMS ((TuiOpaqueFuncPtr, va_list)); - - - -/*********************** -** Public Functions -************************/ - -/* -** tuiInit(). -*/ -void -#ifdef __STDC__ -tuiInit (char *argv0) -#else -tuiInit (argv0) - char *argv0; -#endif -{ - extern void init_page_info (); - extern void initialize_tui_files PARAMS ((void)); - - initialize_tui_files (); - initializeStaticData (); - initscr (); - refresh (); - setTermHeightTo (LINES); - setTermWidthTo (COLS); - tuiInitWindows (); - wrefresh (cmdWin->generic.handle); - init_page_info (); - /* Don't hook debugger output if doing command-window - * the XDB way. However, one thing we do want to do in - * XDB style is set up the scrolling region to be - * the bottom of the screen (tuiTermUnsetup()). - */ - fputs_unfiltered_hook = NULL; - flush_hook = NULL; - rl_initialize (); /* need readline initialization to - * create termcap sequences - */ - tuiTermUnsetup (1, cmdWin->detail.commandInfo.curch); - - return; -} /* tuiInit */ - - -/* -** tuiInitWindows(). -*/ -void -#ifdef __STDC__ -tuiInitWindows (void) -#else -tuiInitWindows () -#endif -{ - TuiWinType type; - - tuiSetLocatorContent (0); - showLayout (SRC_COMMAND); - keypad (cmdWin->generic.handle, TRUE); - echo (); - crmode (); - nl (); - tuiSetWinFocusTo (srcWin); - - return; -} /* tuiInitWindows */ - - -/* -** tuiCleanUp(). -** Kill signal handler and cleanup termination method -*/ -void -#ifdef __STDC__ -tuiResetScreen (void) -#else -tuiResetScreen () -#endif -{ - TuiWinType type = SRC_WIN; - - keypad (cmdWin->generic.handle, FALSE); - for (; type < MAX_MAJOR_WINDOWS; type++) - { - if (m_winPtrNotNull (winList[type]) && - winList[type]->generic.type != UNDEFINED_WIN && - !winList[type]->generic.isVisible) - tuiDelWindow (winList[type]); - } - endwin (); - initscr (); - refresh (); - echo (); - crmode (); - nl (); - - return; -} /* tuiResetScreen */ - - -/* -** tuiCleanUp(). -** Kill signal handler and cleanup termination method -*/ -void -#ifdef __STDC__ -tuiCleanUp (void) -#else -tuiCleanUp () -#endif -{ - char *buffer; - extern char *term_cursor_move; - - signal (SIGINT, SIG_IGN); - tuiTermSetup (0); /* Restore scrolling region to whole screen */ - keypad (cmdWin->generic.handle, FALSE); - freeAllWindows (); - endwin (); - buffer = tgoto (term_cursor_move, 0, termHeight ()); - tputs (buffer, 1, putchar); - _tuiReset (); - - return; -} /* tuiCleanUp */ - - -/* -** tuiError(). -*/ -void -#ifdef __STDC__ -tuiError ( - char *string, - int exitGdb) -#else -tuiError (string, exitGdb) - char *string; - int exitGdb; -#endif -{ - puts_unfiltered (string); - if (exitGdb) - { - tuiCleanUp (); - exit (-1); - } - - return; -} /* tuiError */ - - -/* -** tui_vError() -** tuiError with args in a va_list. -*/ -void -#ifdef __STDC__ -tui_vError ( - va_list args) -#else -tui_vError (args) - va_list args; -#endif -{ - char *string; - int exitGdb; - - string = va_arg (args, char *); - exitGdb = va_arg (args, int); - - tuiError (string, exitGdb); - - return; -} /* tui_vError */ - - -/* -** tuiFree() -** Wrapper on top of free() to ensure that input address is greater than 0x0 -*/ -void -#ifdef __STDC__ -tuiFree ( - char *ptr) -#else -tuiFree (ptr) - char *ptr; -#endif -{ - if (ptr != (char *) NULL) - { - free (ptr); - } - - return; -} /* tuiFree */ - - -/* tuiGetLowDisassemblyAddress(). -** Determine what the low address will be to display in the TUI's -** disassembly window. This may or may not be the same as the -** low address input. -*/ -Opaque -#ifdef __STDC__ -tuiGetLowDisassemblyAddress ( - Opaque low, - Opaque pc) -#else -tuiGetLowDisassemblyAddress (low, pc) - Opaque low; - Opaque pc; -#endif -{ - int line; - Opaque newLow; - - /* - ** Determine where to start the disassembly so that the pc is about in the - ** middle of the viewport. - */ - for (line = 0, newLow = pc; - (newLow > low && - line < (tuiDefaultWinViewportHeight (DISASSEM_WIN, - DISASSEM_COMMAND) / 2));) - { - bfd_byte buffer[4]; - - newLow -= sizeof (bfd_getb32 (buffer)); - line++; - } - - return newLow; -} /* tuiGetLowDisassemblyAddress */ - - -/* tui_vGetLowDisassemblyAddress(). -** Determine what the low address will be to display in the TUI's -** disassembly window with args in a va_list. -*/ -Opaque -#ifdef __STDC__ -tui_vGetLowDisassemblyAddress ( - va_list args) -#else -tui_vGetLowDisassemblyAddress (args) - va_list args; -#endif -{ - int line; - Opaque newLow; - Opaque low; - Opaque pc; - - low = va_arg (args, Opaque); - pc = va_arg (args, Opaque); - - return (tuiGetLowDisassemblyAddress (low, pc)); - -} /* tui_vGetLowDisassemblyAddress */ - - -/* -** tuiDo(). -** General purpose function to execute a tui function. Transitions -** between curses and the are handled here. This function is called -** by non-tui gdb functions. -** -** Errors are caught here. -** If there is no error, the value returned by 'func' is returned. -** If there is an error, then zero is returned. -** -** Must not be called with immediate_quit in effect (bad things might -** happen, say we got a signal in the middle of a memcpy to quit_return). -** This is an OK restriction; with very few exceptions immediate_quit can -** be replaced by judicious use of QUIT. -*/ -Opaque -#ifdef __STDC__ -tuiDo ( - TuiOpaqueFuncPtr func,...) -#else -tuiDo (func, va_alist) - TuiOpaqueFuncPtr func; - va_dcl -#endif -{ - extern int terminal_is_ours; - - Opaque ret = (Opaque) NULL; - - /* It is an error to be tuiDo'ing if we - * don't own the terminal. - */ - if (!terminal_is_ours) - return ret; - - if (tui_version) - { - va_list args; - -#ifdef __STDC__ - va_start (args, func); -#else - va_start (args); -#endif - ret = _tui_vDo (func, args); - va_end (args); - } - - return ret; -} /* tuiDo */ - - -/* -** tuiDoAndReturnToTop(). -** General purpose function to execute a tui function. Transitions -** between curses and the are handled here. This function is called -** by non-tui gdb functions who wish to reset gdb to the top level. -** After the tuiDo is performed, a return to the top level occurs. -** -** Errors are caught here. -** If there is no error, the value returned by 'func' is returned. -** If there is an error, then zero is returned. -** -** Must not be called with immediate_quit in effect (bad things might -** happen, say we got a signal in the middle of a memcpy to quit_return). -** This is an OK restriction; with very few exceptions immediate_quit can -** be replaced by judicious use of QUIT. -** -*/ -Opaque -#ifdef __STDC__ -tuiDoAndReturnToTop ( - TuiOpaqueFuncPtr func,...) -#else -tuiDoAndReturnToTop (func, va_alist) - TuiOpaqueFuncPtr func; - va_dcl -#endif -{ - extern int terminal_is_ours; - - Opaque ret = (Opaque) NULL; - - /* It is an error to be tuiDo'ing if we - * don't own the terminal. - */ - if (!terminal_is_ours) - return ret; - - if (tui_version) - { - va_list args; - -#ifdef __STDC__ - va_start (args, func); -#else - va_start (args); -#endif - ret = _tui_vDo (func, args); - - /* force a return to the top level */ - return_to_top_level (RETURN_ERROR); - } - - return ret; -} /* tuiDoAndReturnToTop */ - - -void -#ifdef __STDC__ -tui_vSelectSourceSymtab ( - va_list args) -#else -tui_vSelectSourceSymtab (args) - va_list args; -#endif -{ - struct symtab *s = va_arg (args, struct symtab *); - - select_source_symtab (s); - return; -} /* tui_vSelectSourceSymtab */ - - -/* -** _initialize_tui(). -** Function to initialize gdb commands, for tui window manipulation. -*/ -void -_initialize_tui () -{ -#if 0 - if (tui_version) - { - add_com ("toggle", class_tui, _toggle_command, - "Toggle Terminal UI Features\n\ -Usage: Toggle $fregs\n\ -\tToggles between single and double precision floating point registers.\n"); - } -#endif - char *helpStr; - - if (tui_version) - helpStr = "Toggle Specified Features\n\ -Usage:\ttoggle $fregs\n\ttoggle breakpoints"; - else - helpStr = "Toggle Specified Features\nUsage:toggle breakpoints"; - add_abbrev_prefix_cmd ("toggle", - class_tui, - _toggle_command, - helpStr, - &togglelist, - "toggle ", - 1, - &cmdlist); -} /* _initialize_tui*/ - - -/* -** va_catch_errors(). -** General purpose function to execute a function, catching errors. -** If there is no error, the value returned by 'func' is returned. -** If there is error, then zero is returned. -** Note that 'func' must take a variable argument list as well. -** -** Must not be called with immediate_quit in effect (bad things might -** happen, say we got a signal in the middle of a memcpy to quit_return). -** This is an OK restriction; with very few exceptions immediate_quit can -** be replaced by judicious use of QUIT. -*/ -Opaque -#ifdef __STDC__ -va_catch_errors ( - TuiOpaqueFuncPtr func, - va_list args) -#else -va_catch_errors (func, args) - TuiOpaqueFuncPtr func; - va_list args; -#endif -{ - Opaque ret = (Opaque) NULL; - - /* - ** We could have used catch_errors(), but it doesn't handle variable args. - ** Also, for the tui, we always want to catch all errors, so we don't - ** need to pass a mask, or an error string. - */ - jmp_buf saved_error; - jmp_buf saved_quit; - jmp_buf tmp_jmp; - struct cleanup *saved_cleanup_chain; - char *saved_error_pre_print; - char *saved_quit_pre_print; - extern jmp_buf error_return; - extern jmp_buf quit_return; - - saved_cleanup_chain = save_cleanups (); - saved_error_pre_print = error_pre_print; - saved_quit_pre_print = quit_pre_print; - - memcpy ((char *) saved_error, (char *) error_return, sizeof (jmp_buf)); - error_pre_print = ""; - memcpy (saved_quit, quit_return, sizeof (jmp_buf)); - quit_pre_print = ""; - - if (setjmp (tmp_jmp) == 0) - { - va_list argList = args; - memcpy (error_return, tmp_jmp, sizeof (jmp_buf)); - memcpy (quit_return, tmp_jmp, sizeof (jmp_buf)); - ret = func (argList); - } - restore_cleanups (saved_cleanup_chain); - memcpy (error_return, saved_error, sizeof (jmp_buf)); - error_pre_print = saved_error_pre_print; - memcpy (quit_return, saved_quit, sizeof (jmp_buf)); - quit_pre_print = saved_quit_pre_print; - - return ret; -} - -/* -** vcatch_errors(). -** Catch errors occurring in tui or non tui function, handling -** variable param lists. Note that 'func' must take a variable -** argument list as well. -*/ -Opaque -#ifdef __STDC__ -vcatch_errors ( - OpaqueFuncPtr func,...) -#else -vcatch_errors (va_alist) - va_dcl -/* -vcatch_errors(func, va_alist) - OpaqueFuncPtr func; - va_dcl -*/ -#endif -{ - Opaque ret = (Opaque) NULL; - va_list args; -#ifdef __STDC__ - va_start (args, func); -/* - va_arg(args, OpaqueFuncPtr); -*/ -#else - OpaqueFuncPtr func; - - va_start (args); - func = va_arg (args, OpaqueFuncPtr); -#endif - ret = va_catch_errors (func, args); - va_end (args); - - return ret; -} - - -void -#ifdef __STDC__ -strcat_to_buf ( - char *buf, - int buflen, - char *itemToAdd) -#else -strcat_to_buf (buf, buflen, itemToAdd) - char *buf; - int buflen; - char *itemToAdd; -#endif -{ - if (itemToAdd != (char *) NULL && buf != (char *) NULL) - { - if ((strlen (buf) + strlen (itemToAdd)) <= buflen) - strcat (buf, itemToAdd); - else - strncat (buf, itemToAdd, (buflen - strlen (buf))); - } - - return; -} /* strcat_to_buf */ - -/* VARARGS */ -void -#ifdef ANSI_PROTOTYPES -strcat_to_buf_with_fmt ( - char *buf, - int bufLen, - char *format,...) -#else -strcat_to_buf_with_fmt (va_alist) - va_dcl -#endif -{ - char *linebuffer; - struct cleanup *old_cleanups; - va_list args; -#ifdef ANSI_PROTOTYPES - va_start (args, format); -#else - char *buf; - int bufLen; - char *format; - - va_start (args); - buf = va_arg (args, char *); - bufLen = va_arg (args, int); - format = va_arg (args, char *); -#endif - vasprintf (&linebuffer, format, args); - old_cleanups = make_cleanup (free, linebuffer); - strcat_to_buf (buf, bufLen, linebuffer); - do_cleanups (old_cleanups); - va_end (args); -} - - - - - -/*********************** -** Static Functions -************************/ - - -/* -** _tui_vDo(). -** General purpose function to execute a tui function. Transitions -** between curses and the are handled here. This function is called -** by non-tui gdb functions. -** -** Errors are caught here. -** If there is no error, the value returned by 'func' is returned. -** If there is an error, then zero is returned. -** -** Must not be called with immediate_quit in effect (bad things might -** happen, say we got a signal in the middle of a memcpy to quit_return). -** This is an OK restriction; with very few exceptions immediate_quit can -** be replaced by judicious use of QUIT. -*/ -static Opaque -#ifdef __STDC__ -_tui_vDo ( - TuiOpaqueFuncPtr func, - va_list args) -#else -_tui_vDo (func, args) - TuiOpaqueFuncPtr func; - va_list args; -#endif -{ - extern int terminal_is_ours; - - Opaque ret = (Opaque) NULL; - - /* It is an error to be tuiDo'ing if we - * don't own the terminal. - */ - if (!terminal_is_ours) - return ret; - - if (tui_version) - { - /* If doing command window the "XDB way" (command window - * is unmanaged by curses... - */ - /* Set up terminal for TUI */ - tuiTermSetup (1); - - ret = va_catch_errors (func, args); - - /* Set up terminal for command window */ - tuiTermUnsetup (1, cmdWin->detail.commandInfo.curch); - } - - return ret; -} /* _tui_vDo */ - - -static void -#ifdef __STDC__ -_toggle_command ( - char *arg, - int fromTTY) -#else -_toggle_command (arg, fromTTY) - char *arg; - int fromTTY; -#endif -{ - printf_filtered ("Specify feature to toggle.\n%s\n", - (tui_version) ? TUI_TOGGLE_USAGE : TOGGLE_USAGE); -/* - tuiDo((TuiOpaqueFuncPtr)_Toggle_command, arg, fromTTY); -*/ -} - -/* -** _tui_vToggle_command(). -*/ -static void -#ifdef __STDC__ -_tui_vToggle_command ( - va_list args) -#else -_tui_vToggle_command (args) - va_list args; -#endif -{ - char *arg; - int fromTTY; - - arg = va_arg (args, char *); - - if (arg == (char *) NULL) - printf_filtered (TOGGLE_USAGE); - else - { - char *ptr = (char *) tuiStrDup (arg); - int i; - - for (i = 0; (ptr[i]); i++) - ptr[i] = toupper (arg[i]); - - if (subsetCompare (ptr, TUI_FLOAT_REGS_NAME)) - tuiToggleFloatRegs (); -/* else if (subsetCompare(ptr, "ANOTHER TOGGLE OPTION")) - ... -*/ - else - printf_filtered (TOGGLE_USAGE); - tuiFree (ptr); - } - - return; -} /* _tuiToggle_command */ - - -static void -#ifdef __STDC__ -_tuiReset (void) -#else -_tuiReset () -#endif -{ - struct termio mode; - - /* - ** reset the teletype mode bits to a sensible state. - ** Copied tset.c - */ -#if ! defined (USG) && defined (TIOCGETC) - struct tchars tbuf; -#endif /* !USG && TIOCGETC */ -#ifdef UCB_NTTY - struct ltchars ltc; - - if (ldisc == NTTYDISC) - { - ioctl (FILEDES, TIOCGLTC, <c); - ltc.t_suspc = CHK (ltc.t_suspc, CTRL ('Z')); - ltc.t_dsuspc = CHK (ltc.t_dsuspc, CTRL ('Y')); - ltc.t_rprntc = CHK (ltc.t_rprntc, CTRL ('R')); - ltc.t_flushc = CHK (ltc.t_flushc, CTRL ('O')); - ltc.t_werasc = CHK (ltc.t_werasc, CTRL ('W')); - ltc.t_lnextc = CHK (ltc.t_lnextc, CTRL ('V')); - ioctl (FILEDES, TIOCSLTC, <c); - } -#endif /* UCB_NTTY */ -#ifndef USG -#ifdef TIOCGETC - ioctl (FILEDES, TIOCGETC, &tbuf); - tbuf.t_intrc = CHK (tbuf.t_intrc, CTRL ('?')); - tbuf.t_quitc = CHK (tbuf.t_quitc, CTRL ('\\')); - tbuf.t_startc = CHK (tbuf.t_startc, CTRL ('Q')); - tbuf.t_stopc = CHK (tbuf.t_stopc, CTRL ('S')); - tbuf.t_eofc = CHK (tbuf.t_eofc, CTRL ('D')); - /* brkc is left alone */ - ioctl (FILEDES, TIOCSETC, &tbuf); -#endif /* TIOCGETC */ - mode.sg_flags &= ~(RAW -#ifdef CBREAK - | CBREAK -#endif /* CBREAK */ - | VTDELAY | ALLDELAY); - mode.sg_flags |= XTABS | ECHO | CRMOD | ANYP; -#else /*USG*/ - ioctl (FILEDES, TCGETA, &mode); - mode.c_cc[VINTR] = CHK (mode.c_cc[VINTR], CTRL ('?')); - mode.c_cc[VQUIT] = CHK (mode.c_cc[VQUIT], CTRL ('\\')); - mode.c_cc[VEOF] = CHK (mode.c_cc[VEOF], CTRL ('D')); - - mode.c_iflag &= ~(IGNBRK | PARMRK | INPCK | INLCR | IGNCR | IUCLC | IXOFF); - mode.c_iflag |= (BRKINT | ISTRIP | ICRNL | IXON); - mode.c_oflag &= ~(OLCUC | OCRNL | ONOCR | ONLRET | OFILL | OFDEL | - NLDLY | CRDLY | TABDLY | BSDLY | VTDLY | FFDLY); - mode.c_oflag |= (OPOST | ONLCR); - mode.c_cflag &= ~(CSIZE | PARODD | CLOCAL); -#ifndef hp9000s800 - mode.c_cflag |= (CS8 | CREAD); -#else /*hp9000s800*/ - mode.c_cflag |= (CS8 | CSTOPB | CREAD); -#endif /* hp9000s800 */ - mode.c_lflag &= ~(XCASE | ECHONL | NOFLSH); - mode.c_lflag |= (ISIG | ICANON | ECHO | ECHOK); - ioctl (FILEDES, TCSETAW, &mode); -#endif /* USG */ - - return; -} /* _tuiReset */ diff --git a/contrib/gdb/gdb/tui/tui.h b/contrib/gdb/gdb/tui/tui.h deleted file mode 100644 index bc9fb31e64969..0000000000000 --- a/contrib/gdb/gdb/tui/tui.h +++ /dev/null @@ -1,120 +0,0 @@ -/* External/Public TUI Header File */ - -#ifndef TUI_H -#define TUI_H -#include <curses.h> - -#ifdef ANSI_PROTOTYPES -#include <stdarg.h> -#else -#include <varargs.h> -#endif - -#include "ansidecl.h" - -#if defined(reg) -#undef reg -#endif -#if defined(chtype) -#undef chtype -#endif - -/* Opaque data type */ -typedef char *Opaque; -typedef Opaque (*OpaqueFuncPtr) PARAMS ((va_list)); -typedef char **OpaqueList; -typedef OpaqueList OpaquePtr; - -/* Generic function pointer */ -typedef void (*TuiVoidFuncPtr) PARAMS ((va_list)); -typedef int (*TuiIntFuncPtr) PARAMS ((va_list)); -/* -typedef Opaque (*TuiOpaqueFuncPtr) PARAMS ((va_list)); -*/ -typedef OpaqueFuncPtr TuiOpaqueFuncPtr; - -extern Opaque vcatch_errors PARAMS ((OpaqueFuncPtr, ...)); -extern Opaque va_catch_errors PARAMS ((OpaqueFuncPtr, va_list)); - -extern void strcat_to_buf PARAMS ((char *, int, char *)); -extern void strcat_to_buf_with_fmt PARAMS ((char *, int, char *, ...)); - -/* Types of error returns */ -typedef enum { - TUI_SUCCESS, - TUI_FAILURE -} TuiStatus, *TuiStatusPtr; - -/* Types of windows */ -typedef enum { - SRC_WIN = 0, - DISASSEM_WIN, - DATA_WIN, - CMD_WIN, - /* This must ALWAYS be AFTER the major windows last */ - MAX_MAJOR_WINDOWS, - /* auxillary windows */ - LOCATOR_WIN, - EXEC_INFO_WIN, - DATA_ITEM_WIN, - /* This must ALWAYS be next to last */ - MAX_WINDOWS, - UNDEFINED_WIN /* LAST */ -} TuiWinType, *TuiWinTypePtr; - -/* This is a point definition */ -typedef struct _TuiPoint { - int x, y; -} TuiPoint, *TuiPointPtr; - -/* Generic window information */ -typedef struct _TuiGenWinInfo { - WINDOW *handle; /* window handle */ - TuiWinType type; /* type of window */ - int width; /* window width */ - int height; /* window height */ - TuiPoint origin; /* origin of window */ - OpaquePtr content; /* content of window */ - int contentSize; /* Size of content (# of elements) */ - int contentInUse; /* Can it be used, or is it already used? */ - int viewportHeight; /* viewport height */ - int lastVisibleLine; /* index of last visible line */ - int isVisible; /* whether the window is visible or not */ -} TuiGenWinInfo, *TuiGenWinInfoPtr; - -/* GENERAL TUI FUNCTIONS */ -/* tui.c */ -extern void tuiInit PARAMS ((char *argv0)); -extern void tuiInitWindows PARAMS ((void)); -extern void tuiResetScreen PARAMS ((void)); -extern void tuiCleanUp PARAMS ((void)); -extern void tuiError PARAMS ((char *, int)); -extern void tui_vError PARAMS ((va_list)); -extern void tuiFree PARAMS ((char *)); -extern Opaque tuiDo PARAMS ((TuiOpaqueFuncPtr, ...)); -extern Opaque tuiDoAndReturnToTop PARAMS ((TuiOpaqueFuncPtr, ...)); -extern Opaque tuiGetLowDisassemblyAddress PARAMS ((Opaque, Opaque)); -extern Opaque tui_vGetLowDisassemblyAddress PARAMS ((va_list)); -extern void tui_vSelectSourceSymtab PARAMS ((va_list)); - -/* tuiDataWin.c */ -extern void tui_vCheckDataValues PARAMS ((va_list)); - -/* tuiIO.c */ -extern void tui_vStartNewLines PARAMS ((va_list)); - -/* tuiLayout.c */ -extern void tui_vAddWinToLayout PARAMS ((va_list)); -extern TuiStatus tui_vSetLayoutTo PARAMS ((va_list)); - -/* tuiSourceWin.c */ -extern void tuiDisplayMainFunction PARAMS ((void)); -extern void tuiUpdateAllExecInfos PARAMS ((void)); -extern void tuiUpdateOnEnd PARAMS ((void)); -extern void tui_vAllSetHasBreakAt PARAMS ((va_list)); -extern void tui_vUpdateSourceWindowsWithAddr PARAMS ((va_list)); - -/* tuiStack.c */ -extern void tui_vShowFrameInfo PARAMS ((va_list)); -extern void tui_vUpdateLocatorFilename PARAMS ((va_list)); -#endif /* TUI_H */ diff --git a/contrib/gdb/gdb/tui/tuiCommand.c b/contrib/gdb/gdb/tui/tuiCommand.c deleted file mode 100644 index 454dc62e8572f..0000000000000 --- a/contrib/gdb/gdb/tui/tuiCommand.c +++ /dev/null @@ -1,215 +0,0 @@ -/* -** tuiCommand.c -** This module contains functions specific to command window processing. -*/ - - -#include "defs.h" -#include "tui.h" -#include "tuiData.h" -#include "tuiWin.h" -#include "tuiIO.h" - - -/***************************************** -** STATIC LOCAL FUNCTIONS FORWARD DECLS ** -******************************************/ - - - -/***************************************** -** PUBLIC FUNCTIONS ** -******************************************/ - -/* -** tuiDispatchCtrlChar(). -** Dispatch the correct tui function based upon the control character. -*/ -unsigned int -#ifdef __STDC__ -tuiDispatchCtrlChar ( - unsigned int ch) -#else -tuiDispatchCtrlChar (ch) - unsigned int ch; -#endif -{ - TuiWinInfoPtr winInfo = tuiWinWithFocus (); - - /* - ** If the command window has the logical focus, or no-one does - ** assume it is the command window; in this case, pass the - ** character on through and do nothing here. - */ - if (winInfo == (TuiWinInfoPtr) NULL || winInfo == cmdWin) - return ch; - else - { - unsigned int c = 0, chCopy = ch; - register int i; - char *term; - - /* If this is an xterm, page next/prev keys aren't returned - ** by keypad as a single char, so we must handle them here. - ** Seems like a bug in the curses library? - */ - term = (char *) getenv ("TERM"); - for (i = 0; (term && term[i]); i++) - term[i] = toupper (term[i]); - if ((strcmp (term, "XTERM") == 0) && m_isStartSequence (ch)) - { - unsigned int pageCh = 0, tmpChar; - - tmpChar = 0; - while (!m_isEndSequence (tmpChar)) - { - tmpChar = (int) wgetch (cmdWin->generic.handle); - if (!tmpChar) - break; - if (tmpChar == 53) - pageCh = KEY_PPAGE; - else if (tmpChar == 54) - pageCh = KEY_NPAGE; - } - chCopy = pageCh; - } - - switch (chCopy) - { - case KEY_NPAGE: - tuiScrollForward (winInfo, 0); - break; - case KEY_PPAGE: - tuiScrollBackward (winInfo, 0); - break; - case KEY_DOWN: - case KEY_SF: - tuiScrollForward (winInfo, 1); - break; - case KEY_UP: - case KEY_SR: - tuiScrollBackward (winInfo, 1); - break; - case KEY_RIGHT: - tuiScrollLeft (winInfo, 1); - break; - case KEY_LEFT: - tuiScrollRight (winInfo, 1); - break; - case '\f': - tuiRefreshAll (); - break; - default: - c = chCopy; - break; - } - return c; - } -} /* tuiDispatchCtrlChar */ - - -/* -** tuiIncrCommandCharCountBy() -** Increment the current character count in the command window, -** checking for overflow. Returns the new value of the char count. -*/ -int -#ifdef __STDC__ -tuiIncrCommandCharCountBy ( - int count) -#else -tuiIncrCommandCharCountBy (count) - int count; -#endif -{ - if (tui_version) - { - if ((count + cmdWin->detail.commandInfo.curch) >= cmdWin->generic.width) - cmdWin->detail.commandInfo.curch = - (count + cmdWin->detail.commandInfo.curch) - cmdWin->generic.width; - else - cmdWin->detail.commandInfo.curch += count; - } - - return cmdWin->detail.commandInfo.curch; -} /* tuiIncrCommandCharCountBy */ - - -/* -** tuiDecrCommandCharCountBy() -** Decrement the current character count in the command window, -** checking for overflow. Returns the new value of the char count. -*/ -int -#ifdef __STDC__ -tuiDecrCommandCharCountBy ( - int count) -#else -tuiDecrCommandCharCountBy (count) - int count; -#endif -{ - if (tui_version) - { - if ((cmdWin->detail.commandInfo.curch - count) < 0) - cmdWin->detail.commandInfo.curch = - cmdWin->generic.width + (cmdWin->detail.commandInfo.curch - count); - else - cmdWin->detail.commandInfo.curch -= count; - } - - return cmdWin->detail.commandInfo.curch; -} /* tuiDecrCommandCharCountBy */ - - -/* -** tuiSetCommandCharCountTo() -** Set the character count to count. -*/ -int -#ifdef __STDC__ -tuiSetCommandCharCountTo ( - int count) -#else -tuiSetCommandCharCountTo (count) - int count; -#endif -{ - if (tui_version) - { - if (count > cmdWin->generic.width - 1) - { - cmdWin->detail.commandInfo.curch = 0; - tuiIncrCommandCharCountBy (count); - } - else - cmdWin->detail.commandInfo.curch -= count; - } - - return cmdWin->detail.commandInfo.curch; -} /* tuiSetCommandCharCountTo */ - - - -/* -** tuiClearCommandCharCount() -** Clear the character count to count. -*/ -int -#ifdef __STDC__ -tuiClearCommandCharCount (void) -#else -tuiClearCommandCharCount () -#endif -{ - if (tui_version) - cmdWin->detail.commandInfo.curch = 0; - - return cmdWin->detail.commandInfo.curch; -} /* tuiClearCommandCharCount */ - - - -/***************************************** -** STATIC LOCAL FUNCTIONS ** -******************************************/ diff --git a/contrib/gdb/gdb/tui/tuiCommand.h b/contrib/gdb/gdb/tui/tuiCommand.h deleted file mode 100644 index 206d918dd56e3..0000000000000 --- a/contrib/gdb/gdb/tui/tuiCommand.h +++ /dev/null @@ -1,24 +0,0 @@ -#ifndef _TUI_COMMAND_H -#define _TUI_COMMAND_H -/* -** This header file supports -*/ - - -/***************************************** -** TYPE DEFINITIONS ** -******************************************/ - - - -/***************************************** -** PUBLIC FUNCTION EXTERNAL DECLS ** -******************************************/ - -extern unsigned int tuiDispatchCtrlChar PARAMS ((unsigned int)); -extern int tuiIncrCommandCharCountBy PARAMS ((int)); -extern int tuiDecrCommandCharCountBy PARAMS ((int)); -extern int tuiSetCommandCharCountTo PARAMS ((int)); -extern int tuiClearCommandCharCount PARAMS ((void)); - -#endif /*_TUI_COMMAND_H*/ diff --git a/contrib/gdb/gdb/tui/tuiData.c b/contrib/gdb/gdb/tui/tuiData.c deleted file mode 100644 index 758a6cde492dc..0000000000000 --- a/contrib/gdb/gdb/tui/tuiData.c +++ /dev/null @@ -1,1624 +0,0 @@ -/* -** tuiData.c -** This module contains functions for manipulating the data -** structures used by the TUI -*/ - -#include "defs.h" -#include "tui.h" -#include "tuiData.h" - -/**************************** -** GLOBAL DECLARATIONS -****************************/ -TuiWinInfoPtr winList[MAX_MAJOR_WINDOWS]; - -/*************************** -** Private Definitions -****************************/ -#define FILE_WIDTH 30 -#define PROC_WIDTH 40 -#define LINE_WIDTH 4 -#define PC_WIDTH 8 - -/*************************** -** Private data -****************************/ -static char *_tuiNullStr = TUI_NULL_STR; -static char *_tuiBlankStr = " "; -static char *_tuiLocationStr = " >"; -static char *_tuiBreakStr = " * "; -static char *_tuiBreakLocationStr = " *>"; -static TuiLayoutType _currentLayout = UNDEFINED_LAYOUT; -static int _termHeight, _termWidth; -static int _historyLimit = DEFAULT_HISTORY_COUNT; -static TuiGenWinInfo _locator; -static TuiGenWinInfo _execInfo[2]; -static TuiWinInfoPtr _srcWinList[2]; -static TuiList _sourceWindows = -{(OpaqueList) _srcWinList, 0}; -static int _defaultTabLen = DEFAULT_TAB_LEN; -static TuiWinInfoPtr _winWithFocus = (TuiWinInfoPtr) NULL; -static TuiLayoutDef _layoutDef = -{SRC_WIN, /* displayMode */ - FALSE, /* split */ - TUI_UNDEFINED_REGS, /* regsDisplayType */ - TUI_SFLOAT_REGS}; /* floatRegsDisplayType */ -static int _winResized = FALSE; - - -/********************************* -** Static function forward decls -**********************************/ -static void freeContent PARAMS ((TuiWinContent, int, TuiWinType)); -static void freeContentElements PARAMS ((TuiWinContent, int, TuiWinType)); - - - -/********************************* -** PUBLIC FUNCTIONS -**********************************/ - -/****************************************** -** ACCESSORS & MUTATORS FOR PRIVATE DATA -******************************************/ - -/* -** tuiWinResized(). -** Answer a whether the terminal window has been resized or not -*/ -int -#ifdef __STDC__ -tuiWinResized (void) -#else -tuiWinResized () -#endif -{ - return _winResized; -} /* tuiWinResized */ - - -/* -** tuiSetWinResized(). -** Set a whether the terminal window has been resized or not -*/ -void -#ifdef __STDC__ -tuiSetWinResizedTo ( - int resized) -#else -tuiSetWinResizedTo (resized) - int resized; -#endif -{ - _winResized = resized; - - return; -} /* tuiSetWinResizedTo */ - - -/* -** tuiLayoutDef(). -** Answer a pointer to the current layout definition -*/ -TuiLayoutDefPtr -#ifdef __STDC__ -tuiLayoutDef (void) -#else -tuiLayoutDef () -#endif -{ - return &_layoutDef; -} /* tuiLayoutDef */ - - -/* -** tuiWinWithFocus(). -** Answer the window with the logical focus -*/ -TuiWinInfoPtr -#ifdef __STDC__ -tuiWinWithFocus (void) -#else -tuiWinWithFocus () -#endif -{ - return _winWithFocus; -} /* tuiWinWithFocus */ - - -/* -** tuiSetWinWithFocus(). -** Set the window that has the logical focus -*/ -void -#ifdef __STDC__ -tuiSetWinWithFocus ( - TuiWinInfoPtr winInfo) -#else -tuiSetWinWithFocus (winInfo) - TuiWinInfoPtr winInfo; -#endif -{ - _winWithFocus = winInfo; - - return; -} /* tuiSetWinWithFocus */ - - -/* -** tuiDefaultTabLen(). -** Answer the length in chars, of tabs -*/ -int -#ifdef __STDC__ -tuiDefaultTabLen (void) -#else -tuiDefaultTabLen () -#endif -{ - return _defaultTabLen; -} /* tuiDefaultTabLen */ - - -/* -** tuiSetDefaultTabLen(). -** Set the length in chars, of tabs -*/ -void -#ifdef __STDC__ -tuiSetDefaultTabLen ( - int len) -#else -tuiSetDefaultTabLen (len) - int len; -#endif -{ - _defaultTabLen = len; - - return; -} /* tuiSetDefaultTabLen */ - - -/* -** currentSourceWin() -** Accessor for the current source window. Usually there is only -** one source window (either source or disassembly), but both can -** be displayed at the same time. -*/ -TuiListPtr -#ifdef __STDC__ -sourceWindows (void) -#else -sourceWindows () -#endif -{ - return &_sourceWindows; -} /* currentSourceWindows */ - - -/* -** clearSourceWindows() -** Clear the list of source windows. Usually there is only one -** source window (either source or disassembly), but both can be -** displayed at the same time. -*/ -void -#ifdef __STDC__ -clearSourceWindows (void) -#else -clearSourceWindows () -#endif -{ - _sourceWindows.list[0] = (Opaque) NULL; - _sourceWindows.list[1] = (Opaque) NULL; - _sourceWindows.count = 0; - - return; -} /* currentSourceWindows */ - - -/* -** clearSourceWindowsDetail() -** Clear the pertinant detail in the source windows. -*/ -void -#ifdef __STDC__ -clearSourceWindowsDetail (void) -#else -clearSourceWindowsDetail () -#endif -{ - int i; - - for (i = 0; i < (sourceWindows ())->count; i++) - clearWinDetail ((TuiWinInfoPtr) (sourceWindows ())->list[i]); - - return; -} /* currentSourceWindows */ - - -/* -** addSourceWindowToList(). -** Add a window to the list of source windows. Usually there is -** only one source window (either source or disassembly), but -** both can be displayed at the same time. -*/ -void -#ifdef __STDC__ -addToSourceWindows ( - TuiWinInfoPtr winInfo) -#else -addToSourceWindows (winInfo) - TuiWinInfoPtr winInfo; -#endif -{ - if (_sourceWindows.count < 2) - _sourceWindows.list[_sourceWindows.count++] = (Opaque) winInfo; - - return; -} /* addToSourceWindows */ - - -/* -** clearWinDetail() -** Clear the pertinant detail in the windows. -*/ -void -#ifdef __STDC__ -clearWinDetail ( - TuiWinInfoPtr winInfo) -#else -clearWinDetail (winInfo) - TuiWinInfoPtr winInfo; -#endif -{ - if (m_winPtrNotNull (winInfo)) - { - switch (winInfo->generic.type) - { - case SRC_WIN: - case DISASSEM_WIN: - winInfo->detail.sourceInfo.startLineOrAddr.addr = (Opaque) NULL; - winInfo->detail.sourceInfo.horizontalOffset = 0; - break; - case CMD_WIN: - winInfo->detail.commandInfo.curLine = - winInfo->detail.commandInfo.curch = 0; - break; - case DATA_WIN: - winInfo->detail.dataDisplayInfo.dataContent = - (TuiWinContent) NULL; - winInfo->detail.dataDisplayInfo.dataContentCount = 0; - winInfo->detail.dataDisplayInfo.regsContent = - (TuiWinContent) NULL; - winInfo->detail.dataDisplayInfo.regsContentCount = 0; - winInfo->detail.dataDisplayInfo.regsDisplayType = - TUI_UNDEFINED_REGS; - winInfo->detail.dataDisplayInfo.regsColumnCount = 1; - winInfo->detail.dataDisplayInfo.displayRegs = FALSE; - break; - default: - break; - } - } - - return; -} /* clearWinDetail */ - - -/* -** blankStr() -** Accessor for the blank string. -*/ -char * -#ifdef __STDC__ -blankStr (void) -#else -blankStr () -#endif -{ - return _tuiBlankStr; -} /* blankStr */ - - -/* -** locationStr() -** Accessor for the location string. -*/ -char * -#ifdef __STDC__ -locationStr (void) -#else -locationStr () -#endif -{ - return _tuiLocationStr; -} /* locationStr */ - - -/* -** breakStr() -** Accessor for the break string. -*/ -char * -#ifdef __STDC__ -breakStr (void) -#else -breakStr () -#endif -{ - return _tuiBreakStr; -} /* breakStr */ - - -/* -** breakLocationStr() -** Accessor for the breakLocation string. -*/ -char * -#ifdef __STDC__ -breakLocationStr (void) -#else -breakLocationStr () -#endif -{ - return _tuiBreakLocationStr; -} /* breakLocationStr */ - - -/* -** nullStr() -** Accessor for the null string. -*/ -char * -#ifdef __STDC__ -nullStr (void) -#else -nullStr () -#endif -{ - return _tuiNullStr; -} /* nullStr */ - - -/* -** sourceExecInfoPtr(). -** Accessor for the source execution info ptr. -*/ -TuiGenWinInfoPtr -#ifdef __STDC__ -sourceExecInfoWinPtr (void) -#else -sourceExecInfoWinPtr () -#endif -{ - return &_execInfo[0]; -} /* sourceExecInfoWinPtr */ - - -/* -** disassemExecInfoPtr(). -** Accessor for the disassem execution info ptr. -*/ -TuiGenWinInfoPtr -#ifdef __STDC__ -disassemExecInfoWinPtr (void) -#else -disassemExecInfoWinPtr () -#endif -{ - return &_execInfo[1]; -} /* disassemExecInfoWinPtr */ - - -/* -** locatorWinInfoPtr(). -** Accessor for the locator win info. Answers a pointer to the -** static locator win info struct. -*/ -TuiGenWinInfoPtr -#ifdef __STDC__ -locatorWinInfoPtr (void) -#else -locatorWinInfoPtr () -#endif -{ - return &_locator; -} /* locatorWinInfoPtr */ - - -/* -** historyLimit(). -** Accessor for the history limit -*/ -int -#ifdef __STDC__ -historyLimit (void) -#else -historyLimit () -#endif -{ - return _historyLimit; -} /* historyLimit */ - - -/* -** setHistoryLimitTo(). -** Mutator for the history limit -*/ -void -#ifdef __STDC__ -setHistoryLimitTo ( - int h) -#else -setHistoryLimitTo (h) - int h; -#endif -{ - _historyLimit = h; - - return; -} /* setHistoryLimitTo */ - -/* -** termHeight(). -** Accessor for the termHeight -*/ -int -#ifdef __STDC__ -termHeight (void) -#else -termHeight () -#endif -{ - return _termHeight; -} /* termHeight */ - - -/* -** setTermHeightTo(). -** Mutator for the term height -*/ -void -#ifdef __STDC__ -setTermHeightTo ( - int h) -#else -setTermHeightTo (h) - int h; -#endif -{ - _termHeight = h; - - return; -} /* setTermHeightTo */ - - -/* -** termWidth(). -** Accessor for the termWidth -*/ -int -#ifdef __STDC__ -termWidth (void) -#else -termWidth () -#endif -{ - return _termWidth; -} /* termWidth */ - - -/* -** setTermWidth(). -** Mutator for the termWidth -*/ -void -#ifdef __STDC__ -setTermWidthTo ( - int w) -#else -setTermWidthTo (w) - int w; -#endif -{ - _termWidth = w; - - return; -} /* setTermWidthTo */ - - -/* -** currentLayout(). -** Accessor for the current layout -*/ -TuiLayoutType -#ifdef __STDC__ -currentLayout (void) -#else -currentLayout () -#endif -{ - return _currentLayout; -} /* currentLayout */ - - -/* -** setCurrentLayoutTo(). -** Mutator for the current layout -*/ -void -#ifdef __STDC__ -setCurrentLayoutTo ( - TuiLayoutType newLayout) -#else -setCurrentLayoutTo (newLayout) - TuiLayoutType newLayout; -#endif -{ - _currentLayout = newLayout; - - return; -} /* setCurrentLayoutTo */ - - -/* -** setGenWinOrigin(). -** Set the origin of the window -*/ -void -#ifdef __STDC__ -setGenWinOrigin ( - TuiGenWinInfoPtr winInfo, - int x, - int y) -#else -setGenWinOrigin (winInfo, x, y) - TuiGenWinInfoPtr winInfo; - int x; - int y; -#endif -{ - winInfo->origin.x = x; - winInfo->origin.y = y; - - return; -} /* setGenWinOrigin */ - - -/***************************** -** OTHER PUBLIC FUNCTIONS -*****************************/ - - -/* -** tuiNextWin(). -** Answer the next window in the list, cycling back to the top -** if necessary -*/ -TuiWinInfoPtr -#ifdef __STDC__ -tuiNextWin ( - TuiWinInfoPtr curWin) -#else -tuiNextWin (curWin) - TuiWinInfoPtr curWin; -#endif -{ - TuiWinType type = curWin->generic.type; - TuiWinInfoPtr nextWin = (TuiWinInfoPtr) NULL; - - if (curWin->generic.type == CMD_WIN) - type = SRC_WIN; - else - type = curWin->generic.type + 1; - while (type != curWin->generic.type && m_winPtrIsNull (nextWin)) - { - if (winList[type]->generic.isVisible) - nextWin = winList[type]; - else - { - if (type == CMD_WIN) - type = SRC_WIN; - else - type++; - } - } - - return nextWin; -} /* tuiNextWin */ - - -/* -** tuiPrevWin(). -** Answer the prev window in the list, cycling back to the bottom -** if necessary -*/ -TuiWinInfoPtr -#ifdef __STDC__ -tuiPrevWin ( - TuiWinInfoPtr curWin) -#else -tuiPrevWin (curWin) - TuiWinInfoPtr curWin; -#endif -{ - TuiWinType type = curWin->generic.type; - TuiWinInfoPtr prev = (TuiWinInfoPtr) NULL; - - if (curWin->generic.type == SRC_WIN) - type = CMD_WIN; - else - type = curWin->generic.type - 1; - while (type != curWin->generic.type && m_winPtrIsNull (prev)) - { - if (winList[type]->generic.isVisible) - prev = winList[type]; - else - { - if (type == SRC_WIN) - type = CMD_WIN; - else - type--; - } - } - - return prev; -} /* tuiPrevWin */ - - -/* -** displayableWinContentOf(). -** Answer a the content at the location indicated by index. Note -** that if this is a locator window, the string returned should be -** freed after use. -*/ -char * -#ifdef __STDC__ -displayableWinContentOf ( - TuiGenWinInfoPtr winInfo, - TuiWinElementPtr elementPtr) -#else -displayableWinContentOf (winInfo, elementPtr) - TuiGenWinInfoPtr winInfo; - TuiWinElementPtr elementPtr; -#endif -{ - - char *string = nullStr (); - - if (elementPtr != (TuiWinElementPtr) NULL || winInfo->type == LOCATOR_WIN) - { - /* - ** Now convert the line to a displayable string - */ - switch (winInfo->type) - { - case SRC_WIN: - case DISASSEM_WIN: - string = elementPtr->whichElement.source.line; - break; - case CMD_WIN: - string = elementPtr->whichElement.command.line; - break; - case LOCATOR_WIN: - if ((string = (char *) xmalloc ( - (termWidth () + 1) * sizeof (char))) == (char *) NULL) - string = nullStr (); - else - { - char lineNo[50], pc[50], buf[50], *fname, *pname; - register int strSize = termWidth (), i, procWidth, fileWidth; - - /* - ** First determine the amount of file/proc name width - ** we have available - */ - i = strSize - (PC_WIDTH + LINE_WIDTH - + 25 /* pc and line labels */ - + strlen (FILE_PREFIX) + 1 /* file label */ - + 15 /* procedure label */ ); - if (i >= FILE_WIDTH + PROC_WIDTH) - { - fileWidth = FILE_WIDTH; - procWidth = PROC_WIDTH; - } - else - { - fileWidth = i / 2; - procWidth = i - fileWidth; - } - - /* Now convert elements to string form */ - if (elementPtr != (TuiWinElementPtr) NULL && - *elementPtr->whichElement.locator.fileName != (char) 0 && - srcWin->generic.isVisible) - fname = elementPtr->whichElement.locator.fileName; - else - fname = "??"; - if (elementPtr != (TuiWinElementPtr) NULL && - *elementPtr->whichElement.locator.procName != (char) 0) - pname = elementPtr->whichElement.locator.procName; - else - pname = "??"; - if (elementPtr != (TuiWinElementPtr) NULL && - elementPtr->whichElement.locator.lineNo > 0) - sprintf (lineNo, "%d", - elementPtr->whichElement.locator.lineNo); - else - strcpy (lineNo, "??"); - if (elementPtr != (TuiWinElementPtr) NULL && - elementPtr->whichElement.locator.addr > (Opaque) 0) - sprintf (pc, "0x%x", - elementPtr->whichElement.locator.addr); - else - strcpy (pc, "??"); - /* - ** Now create the locator line from the string version - ** of the elements. We could use sprintf() here but - ** that wouldn't ensure that we don't overrun the size - ** of the allocated buffer. strcat_to_buf() will. - */ - *string = (char) 0; - /* Filename */ - strcat_to_buf (string, strSize, " "); - strcat_to_buf (string, strSize, FILE_PREFIX); - if (strlen (fname) > fileWidth) - { - strncpy (buf, fname, fileWidth - 1); - buf[fileWidth - 1] = '*'; - buf[fileWidth] = (char) 0; - } - else - strcpy (buf, fname); - strcat_to_buf (string, strSize, buf); - /* procedure/class name */ - sprintf (buf, "%15s", PROC_PREFIX); - strcat_to_buf (string, strSize, buf); - if (strlen (pname) > procWidth) - { - strncpy (buf, pname, procWidth - 1); - buf[procWidth - 1] = '*'; - buf[procWidth] = (char) 0; - } - else - strcpy (buf, pname); - strcat_to_buf (string, strSize, buf); - sprintf (buf, "%10s", LINE_PREFIX); - strcat_to_buf (string, strSize, buf); - strcat_to_buf (string, strSize, lineNo); - sprintf (buf, "%10s", PC_PREFIX); - strcat_to_buf (string, strSize, buf); - strcat_to_buf (string, strSize, pc); - for (i = strlen (string); i < strSize; i++) - string[i] = ' '; - string[strSize] = (char) 0; - } - break; - case EXEC_INFO_WIN: - string = elementPtr->whichElement.simpleString; - break; - default: - break; - } - } - return string; -} /* displayableWinContentOf */ - - -/* -** winContentAt(). -** Answer a the content at the location indicated by index -*/ -char * -#ifdef __STDC__ -displayableWinContentAt ( - TuiGenWinInfoPtr winInfo, - int index) -#else -displayableWinContentAt (winInfo, index) - TuiGenWinInfoPtr winInfo; - int index; -#endif -{ - return (displayableWinContentOf (winInfo, (TuiWinElementPtr) winInfo->content[index])); -} /* winContentAt */ - - -/* -** winElementHeight(). -** Answer the height of the element in lines -*/ -int -#ifdef __STDC__ -winElementHeight ( - TuiGenWinInfoPtr winInfo, - TuiWinElementPtr element) -#else -winElementHeight (winInfo, element) - TuiGenWinInfoPtr winInfo; - TuiWinElementPtr element; -#endif -{ - int h; - - if (winInfo->type == DATA_WIN) -/* FOR NOW SAY IT IS ONLY ONE LINE HIGH */ - h = 1; - else - h = 1; - - return h; -} /* winElementHeight */ - - -/* -** winByName(). -** Answer the window represented by name -*/ -TuiWinInfoPtr -#ifdef __STDC__ -winByName ( - char *name) -#else -winByName (name) - char *name; -#endif -{ - TuiWinInfoPtr winInfo = (TuiWinInfoPtr) NULL; - int i = 0; - - while (i < MAX_MAJOR_WINDOWS && m_winPtrIsNull (winInfo)) - { - if (strcmp (name, winName (&(winList[i]->generic))) == 0) - winInfo = winList[i]; - i++; - } - - return winInfo; -} /* winByName */ - - -/* -** partialWinByName(). -** Answer the window represented by name -*/ -TuiWinInfoPtr -#ifdef __STDC__ -partialWinByName ( - char *name) -#else -partialWinByName (name) - char *name; -#endif -{ - TuiWinInfoPtr winInfo = (TuiWinInfoPtr) NULL; - - if (name != (char *) NULL) - { - int i = 0; - - while (i < MAX_MAJOR_WINDOWS && m_winPtrIsNull (winInfo)) - { - char *curName = winName (&winList[i]->generic); - if (strlen (name) <= strlen (curName) && - strncmp (name, curName, strlen (name)) == 0) - winInfo = winList[i]; - i++; - } - } - - return winInfo; -} /* partialWinByName */ - - -/* -** winName(). -** Answer the name of the window -*/ -char * -#ifdef __STDC__ -winName ( - TuiGenWinInfoPtr winInfo) -#else -winName (winInfo) - TuiGenWinInfoPtr winInfo; -#endif -{ - char *name = (char *) NULL; - - switch (winInfo->type) - { - case SRC_WIN: - name = SRC_NAME; - break; - case CMD_WIN: - name = CMD_NAME; - break; - case DISASSEM_WIN: - name = DISASSEM_NAME; - break; - case DATA_WIN: - name = DATA_NAME; - break; - default: - name = ""; - break; - } - - return name; -} /* winName */ - - -/* -** initializeStaticData -*/ -void -#ifdef __STDC__ -initializeStaticData (void) -#else -initializeStaticData () -#endif -{ - initGenericPart (sourceExecInfoWinPtr ()); - initGenericPart (disassemExecInfoWinPtr ()); - initGenericPart (locatorWinInfoPtr ()); - - return; -} /* initializeStaticData */ - - -/* -** allocGenericWinInfo(). -*/ -TuiGenWinInfoPtr -#ifdef __STDC__ -allocGenericWinInfo (void) -#else -allocGenericWinInfo () -#endif -{ - TuiGenWinInfoPtr win; - - if ((win = (TuiGenWinInfoPtr) xmalloc ( - sizeof (TuiGenWinInfoPtr))) != (TuiGenWinInfoPtr) NULL) - initGenericPart (win); - - return win; -} /* allocGenericWinInfo */ - - -/* -** initGenericPart(). -*/ -void -#ifdef __STDC__ -initGenericPart ( - TuiGenWinInfoPtr win) -#else -initGenericPart (win) - TuiGenWinInfoPtr win; -#endif -{ - win->width = - win->height = - win->origin.x = - win->origin.y = - win->viewportHeight = - win->contentSize = - win->lastVisibleLine = 0; - win->handle = (WINDOW *) NULL; - win->content = (OpaquePtr) NULL; - win->contentInUse = - win->isVisible = FALSE; - - return; -} /* initGenericPart */ - - -/* -** initContentElement(). -*/ -void -#ifdef __STDC__ -initContentElement ( - TuiWinElementPtr element, - TuiWinType type) -#else -initContentElement (element, type) - TuiWinElementPtr element; - TuiWinType type; -#endif -{ - element->highlight = FALSE; - switch (type) - { - case SRC_WIN: - case DISASSEM_WIN: - element->whichElement.source.line = (char *) NULL; - element->whichElement.source.lineOrAddr.lineNo = 0; - element->whichElement.source.isExecPoint = FALSE; - element->whichElement.source.hasBreak = FALSE; - break; - case DATA_WIN: - initGenericPart (&element->whichElement.dataWindow); - element->whichElement.dataWindow.type = DATA_ITEM_WIN; - ((TuiGenWinInfoPtr) & element->whichElement.dataWindow)->content = - (OpaquePtr) allocContent (1, DATA_ITEM_WIN); - ((TuiGenWinInfoPtr) - & element->whichElement.dataWindow)->contentSize = 1; - break; - case CMD_WIN: - element->whichElement.command.line = (char *) NULL; - break; - case DATA_ITEM_WIN: - element->whichElement.data.name = (char *) NULL; - element->whichElement.data.type = TUI_REGISTER; - element->whichElement.data.itemNo = UNDEFINED_ITEM; - element->whichElement.data.value = (Opaque) NULL; - element->whichElement.data.highlight = FALSE; - break; - case LOCATOR_WIN: - element->whichElement.locator.fileName[0] = - element->whichElement.locator.procName[0] = (char) 0; - element->whichElement.locator.lineNo = 0; - element->whichElement.locator.addr = 0; - break; - case EXEC_INFO_WIN: - element->whichElement.simpleString = blankStr (); - break; - default: - break; - } - return; -} /* initContentElement */ - -/* -** initWinInfo(). -*/ -void -#ifdef __STDC__ -initWinInfo ( - TuiWinInfoPtr winInfo) -#else -initWinInfo (winInfo) - TuiWinInfoPtr winInfo; -#endif -{ - initGenericPart (&winInfo->generic); - winInfo->canHighlight = - winInfo->isHighlighted = FALSE; - switch (winInfo->generic.type) - { - case SRC_WIN: - case DISASSEM_WIN: - winInfo->detail.sourceInfo.executionInfo = (TuiGenWinInfoPtr) NULL; - winInfo->detail.sourceInfo.hasLocator = FALSE; - winInfo->detail.sourceInfo.horizontalOffset = 0; - winInfo->detail.sourceInfo.startLineOrAddr.addr = (Opaque) NULL; - break; - case DATA_WIN: - winInfo->detail.dataDisplayInfo.dataContent = (TuiWinContent) NULL; - winInfo->detail.dataDisplayInfo.dataContentCount = 0; - winInfo->detail.dataDisplayInfo.regsContent = (TuiWinContent) NULL; - winInfo->detail.dataDisplayInfo.regsContentCount = 0; - winInfo->detail.dataDisplayInfo.regsDisplayType = - TUI_UNDEFINED_REGS; - winInfo->detail.dataDisplayInfo.regsColumnCount = 1; - winInfo->detail.dataDisplayInfo.displayRegs = FALSE; - break; - case CMD_WIN: - winInfo->detail.commandInfo.curLine = 0; - winInfo->detail.commandInfo.curch = 0; - break; - default: - winInfo->detail.opaque = (Opaque) NULL; - break; - } - - return; -} /* initWinInfo */ - - -/* -** allocWinInfo(). -*/ -TuiWinInfoPtr -#ifdef __STDC__ -allocWinInfo ( - TuiWinType type) -#else -allocWinInfo (type) - TuiWinType type; -#endif -{ - TuiWinInfoPtr winInfo = (TuiWinInfoPtr) NULL; - - winInfo = (TuiWinInfoPtr) xmalloc (sizeof (TuiWinInfo)); - if (m_winPtrNotNull (winInfo)) - { - winInfo->generic.type = type; - initWinInfo (winInfo); - } - - return winInfo; -} /* allocWinInfo */ - - -/* -** allocContent(). -** Allocates the content and elements in a block. -*/ -TuiWinContent -#ifdef __STDC__ -allocContent ( - int numElements, - TuiWinType type) -#else -allocContent (numElements, type) - int numElements; - TuiWinType type; -#endif -{ - TuiWinContent content = (TuiWinContent) NULL; - char *elementBlockPtr = (char *) NULL; - int i; - - if ((content = (TuiWinContent) - xmalloc (sizeof (TuiWinElementPtr) * numElements)) != (TuiWinContent) NULL) - { /* - ** All windows, except the data window, can allocate the elements - ** in a chunk. The data window cannot because items can be - ** added/removed from the data display by the user at any time. - */ - if (type != DATA_WIN) - { - if ((elementBlockPtr = (char *) - xmalloc (sizeof (TuiWinElement) * numElements)) != (char *) NULL) - { - for (i = 0; i < numElements; i++) - { - content[i] = (TuiWinElementPtr) elementBlockPtr; - initContentElement (content[i], type); - elementBlockPtr += sizeof (TuiWinElement); - } - } - else - { - tuiFree ((char *) content); - content = (TuiWinContent) NULL; - } - } - } - - return content; -} /* allocContent */ - - -/* -** addContentElements(). -** Adds the input number of elements to the windows's content. If -** no content has been allocated yet, allocContent() is called to -** do this. The index of the first element added is returned, -** unless there is a memory allocation error, in which case, (-1) -** is returned. -*/ -int -#ifdef __STDC__ -addContentElements ( - TuiGenWinInfoPtr winInfo, - int numElements) -#else -addContentElements (winInfo, numElements) - TuiGenWinInfoPtr winInfo; - int numElements; -#endif -{ - TuiWinElementPtr elementPtr; - int i, indexStart; - - if (winInfo->content == (OpaquePtr) NULL) - { - winInfo->content = (OpaquePtr) allocContent (numElements, winInfo->type); - indexStart = 0; - } - else - indexStart = winInfo->contentSize; - if (winInfo->content != (OpaquePtr) NULL) - { - for (i = indexStart; (i < numElements + indexStart); i++) - { - if ((elementPtr = (TuiWinElementPtr) - xmalloc (sizeof (TuiWinElement))) != (TuiWinElementPtr) NULL) - { - winInfo->content[i] = (Opaque) elementPtr; - initContentElement (elementPtr, winInfo->type); - winInfo->contentSize++; - } - else /* things must be really hosed now! We ran out of memory!?*/ - return (-1); - } - } - - return indexStart; -} /* addContentElements */ - - -/* -** tuiDelWindow(). -** Delete all curses windows associated with winInfo, leaving everything -** else in tact. -*/ -void -#ifdef __STDC__ -tuiDelWindow ( - TuiWinInfoPtr winInfo) -#else -tuiDelWindow (winInfo) - TuiWinInfoPtr winInfo; -#endif -{ - Opaque detail; - int i; - TuiGenWinInfoPtr genericWin; - - - switch (winInfo->generic.type) - { - case SRC_WIN: - case DISASSEM_WIN: - genericWin = locatorWinInfoPtr (); - if (genericWin != (TuiGenWinInfoPtr) NULL) - { - tuiDelwin (genericWin->handle); - genericWin->handle = (WINDOW *) NULL; - genericWin->isVisible = FALSE; - } - genericWin = winInfo->detail.sourceInfo.executionInfo; - if (genericWin != (TuiGenWinInfoPtr) NULL) - { - tuiDelwin (genericWin->handle); - genericWin->handle = (WINDOW *) NULL; - genericWin->isVisible = FALSE; - } - break; - case DATA_WIN: - if (winInfo->generic.content != (OpaquePtr) NULL) - { - int i; - - tuiDelDataWindows ( - winInfo->detail.dataDisplayInfo.regsContent, - winInfo->detail.dataDisplayInfo.regsContentCount); - tuiDelDataWindows ( - winInfo->detail.dataDisplayInfo.dataContent, - winInfo->detail.dataDisplayInfo.dataContentCount); - } - break; - default: - break; - } - if (winInfo->generic.handle != (WINDOW *) NULL) - { - tuiDelwin (winInfo->generic.handle); - winInfo->generic.handle = (WINDOW *) NULL; - winInfo->generic.isVisible = FALSE; - } - - return; -} /* tuiDelWindow */ - - -/* -** freeWindow(). -*/ -void -#ifdef __STDC__ -freeWindow ( - TuiWinInfoPtr winInfo) -#else -freeWindow (winInfo) - TuiWinInfoPtr winInfo; -#endif -{ - Opaque detail; - int i; - TuiGenWinInfoPtr genericWin; - - - switch (winInfo->generic.type) - { - case SRC_WIN: - case DISASSEM_WIN: - genericWin = locatorWinInfoPtr (); - if (genericWin != (TuiGenWinInfoPtr) NULL) - { - tuiDelwin (genericWin->handle); - genericWin->handle = (WINDOW *) NULL; - } - freeWinContent (genericWin); - genericWin = winInfo->detail.sourceInfo.executionInfo; - if (genericWin != (TuiGenWinInfoPtr) NULL) - { - tuiDelwin (genericWin->handle); - genericWin->handle = (WINDOW *) NULL; - freeWinContent (genericWin); - } - break; - case DATA_WIN: - if (winInfo->generic.content != (OpaquePtr) NULL) - { - freeDataContent ( - winInfo->detail.dataDisplayInfo.regsContent, - winInfo->detail.dataDisplayInfo.regsContentCount); - winInfo->detail.dataDisplayInfo.regsContent = - (TuiWinContent) NULL; - winInfo->detail.dataDisplayInfo.regsContentCount = 0; - freeDataContent ( - winInfo->detail.dataDisplayInfo.dataContent, - winInfo->detail.dataDisplayInfo.dataContentCount); - winInfo->detail.dataDisplayInfo.dataContent = - (TuiWinContent) NULL; - winInfo->detail.dataDisplayInfo.dataContentCount = 0; - winInfo->detail.dataDisplayInfo.regsDisplayType = - TUI_UNDEFINED_REGS; - winInfo->detail.dataDisplayInfo.regsColumnCount = 1; - winInfo->detail.dataDisplayInfo.displayRegs = FALSE; - winInfo->generic.content = (OpaquePtr) NULL; - winInfo->generic.contentSize = 0; - } - break; - default: - break; - } - if (winInfo->generic.handle != (WINDOW *) NULL) - { - tuiDelwin (winInfo->generic.handle); - winInfo->generic.handle = (WINDOW *) NULL; - freeWinContent (&winInfo->generic); - } - free (winInfo); - - return; -} /* freeWindow */ - - -/* -** freeAllSourceWinsContent(). -*/ -void -#ifdef __STDC__ -freeAllSourceWinsContent (void) -#else -freeAllSourceWinsContent () -#endif -{ - int i; - - for (i = 0; i < (sourceWindows ())->count; i++) - { - TuiWinInfoPtr winInfo = (TuiWinInfoPtr) (sourceWindows ())->list[i]; - - if (m_winPtrNotNull (winInfo)) - { - freeWinContent (&(winInfo->generic)); - freeWinContent (winInfo->detail.sourceInfo.executionInfo); - } - } - - return; -} /* freeAllSourceWinsContent */ - - -/* -** freeWinContent(). -*/ -void -#ifdef __STDC__ -freeWinContent ( - TuiGenWinInfoPtr winInfo) -#else -freeWinContent (winInfo) - TuiGenWinInfoPtr winInfo; -#endif -{ - if (winInfo->content != (OpaquePtr) NULL) - { - freeContent ((TuiWinContent) winInfo->content, - winInfo->contentSize, - winInfo->type); - winInfo->content = (OpaquePtr) NULL; - } - winInfo->contentSize = 0; - - return; -} /* freeWinContent */ - - -/* -** freeAllWindows(). -*/ -void -#ifdef __STDC__ -freeAllWindows (void) -#else -freeAllWindows () -#endif -{ - TuiWinType type = SRC_WIN; - - for (; type < MAX_MAJOR_WINDOWS; type++) - if (m_winPtrNotNull (winList[type]) && - winList[type]->generic.type != UNDEFINED_WIN) - freeWindow (winList[type]); - return; -} /* freeAllWindows */ - - -void -#ifdef __STDC__ -tuiDelDataWindows ( - TuiWinContent content, - int contentSize) -#else -tuiDelDataWindows (content, contentSize) - TuiWinContent content; - int contentSize; -#endif -{ - int i; - - /* - ** Remember that data window content elements are of type TuiGenWinInfoPtr, - ** each of which whose single element is a data element. - */ - for (i = 0; i < contentSize; i++) - { - TuiGenWinInfoPtr genericWin = &content[i]->whichElement.dataWindow; - - if (genericWin != (TuiGenWinInfoPtr) NULL) - { - tuiDelwin (genericWin->handle); - genericWin->handle = (WINDOW *) NULL; - genericWin->isVisible = FALSE; - } - } - - return; -} /* tuiDelDataWindows */ - - -void -#ifdef __STDC__ -freeDataContent ( - TuiWinContent content, - int contentSize) -#else -freeDataContent (content, contentSize) - TuiWinContent content; - int contentSize; -#endif -{ - int i; - - /* - ** Remember that data window content elements are of type TuiGenWinInfoPtr, - ** each of which whose single element is a data element. - */ - for (i = 0; i < contentSize; i++) - { - TuiGenWinInfoPtr genericWin = &content[i]->whichElement.dataWindow; - - if (genericWin != (TuiGenWinInfoPtr) NULL) - { - tuiDelwin (genericWin->handle); - genericWin->handle = (WINDOW *) NULL; - freeWinContent (genericWin); - } - } - freeContent (content, - contentSize, - DATA_WIN); - - return; -} /* freeDataContent */ - - -/********************************** -** LOCAL STATIC FUNCTIONS ** -**********************************/ - - -/* -** freeContent(). -*/ -static void -#ifdef __STDC__ -freeContent ( - TuiWinContent content, - int contentSize, - TuiWinType winType) -#else -freeContent (content, contentSize, winType) - TuiWinContent content; - int contentSize; - TuiWinType winType; -#endif -{ - if (content != (TuiWinContent) NULL) - { - freeContentElements (content, contentSize, winType); - tuiFree ((char *) content); - } - - return; -} /* freeContent */ - - -/* -** freeContentElements(). -*/ -static void -#ifdef __STDC__ -freeContentElements ( - TuiWinContent content, - int contentSize, - TuiWinType type) -#else -freeContentElements (content, contentSize, type) - TuiWinContent content; - int contentSize; - TuiWinType type; -#endif -{ - if (content != (TuiWinContent) NULL) - { - int i; - - if (type == SRC_WIN || type == DISASSEM_WIN) - { - /* free whole source block */ - if (content[0]->whichElement.source.line != (char *) NULL) - tuiFree (content[0]->whichElement.source.line); - } - else - { - for (i = 0; i < contentSize; i++) - { - TuiWinElementPtr element; - - element = content[i]; - if (element != (TuiWinElementPtr) NULL) - { - switch (type) - { - case DATA_WIN: - tuiFree ((char *) element); - break; - case DATA_ITEM_WIN: - /* - ** Note that data elements are not allocated - ** in a single block, but individually, as needed. - */ - if (element->whichElement.data.type != TUI_REGISTER) - tuiFree ((char *) - element->whichElement.data.name); - tuiFree ((char *) element->whichElement.data.value); - tuiFree ((char *) element); - break; - case CMD_WIN: - tuiFree ((char *) element->whichElement.command.line); - break; - default: - break; - } - } - } - } - if (type != DATA_WIN && type != DATA_ITEM_WIN) - tuiFree ((char *) content[0]); /* free the element block */ - } - - return; -} /* freeContentElements */ diff --git a/contrib/gdb/gdb/tui/tuiData.h b/contrib/gdb/gdb/tui/tuiData.h deleted file mode 100644 index bb4d19c90e2d0..0000000000000 --- a/contrib/gdb/gdb/tui/tuiData.h +++ /dev/null @@ -1,302 +0,0 @@ -#ifndef TUI_DATA_H -#define TUI_DATA_H - -/* Constant definitions */ -#define DEFAULT_TAB_LEN 8 -#define NO_SRC_STRING "[ No Source Available ]" -#define NO_DISASSEM_STRING "[ No Assembly Available ]" -#define NO_REGS_STRING "[ Register Values Unavailable ]" -#define NO_DATA_STRING "[ No Data Values Displayed ]" -#define MAX_CONTENT_COUNT 100 -#define SRC_NAME "SRC" -#define CMD_NAME "CMD" -#define DATA_NAME "REGS" -#define DISASSEM_NAME "ASM" -#define TUI_NULL_STR "" -#define DEFAULT_HISTORY_COUNT 25 -#define BOX_WINDOW TRUE -#define DONT_BOX_WINDOW FALSE -#define HILITE TRUE -#define NO_HILITE FALSE -#define WITH_LOCATOR TRUE -#define NO_LOCATOR FALSE -#define EMPTY_SOURCE_PROMPT TRUE -#define NO_EMPTY_SOURCE_PROMPT FALSE -#define UNDEFINED_ITEM -1 -#define MIN_WIN_HEIGHT 3 -#define MIN_CMD_WIN_HEIGHT 3 - -#define FILE_PREFIX "File: " -#define PROC_PREFIX "Procedure: " -#define LINE_PREFIX "Line: " -#define PC_PREFIX "pc: " - -#define TUI_FLOAT_REGS_NAME "$FREGS" -#define TUI_FLOAT_REGS_NAME_LOWER "$fregs" -#define TUI_GENERAL_REGS_NAME "$GREGS" -#define TUI_GENERAL_REGS_NAME_LOWER "$gregs" -#define TUI_SPECIAL_REGS_NAME "$SREGS" -#define TUI_SPECIAL_REGS_NAME_LOWER "$sregs" -#define TUI_GENERAL_SPECIAL_REGS_NAME "$REGS" -#define TUI_GENERAL_SPECIAL_REGS_NAME_LOWER "$regs" - -/* Scroll direction enum */ -typedef enum { - FORWARD_SCROLL, - BACKWARD_SCROLL, - LEFT_SCROLL, - RIGHT_SCROLL -} TuiScrollDirection, *TuiScrollDirectionPtr; - - -/* General list struct */ -typedef struct _TuiList { - OpaqueList list; - int count; -} TuiList, *TuiListPtr; - - -/* The kinds of layouts available */ -typedef enum { - SRC_COMMAND, - DISASSEM_COMMAND, - SRC_DISASSEM_COMMAND, - SRC_DATA_COMMAND, - DISASSEM_DATA_COMMAND, - UNDEFINED_LAYOUT -} TuiLayoutType, *TuiLayoutTypePtr; - -/* Basic data types that can be displayed in the data window. */ -typedef enum _TuiDataType { - TUI_REGISTER, - TUI_SCALAR, - TUI_COMPLEX, - TUI_STRUCT -} TuiDataType, TuiDataTypePtr; - -/* Types of register displays */ -typedef enum _TuiRegisterDisplayType { - TUI_UNDEFINED_REGS, - TUI_GENERAL_REGS, - TUI_SFLOAT_REGS, - TUI_DFLOAT_REGS, - TUI_SPECIAL_REGS, - TUI_GENERAL_AND_SPECIAL_REGS -} TuiRegisterDisplayType, *TuiRegisterDisplayTypePtr; - -/* Structure describing source line or line address */ -typedef union _TuiLineOrAddress { - int lineNo; - Opaque addr; -} TuiLineOrAddress, *TuiLineOrAddressPtr; - -/* Current Layout definition */ -typedef struct _TuiLayoutDef { - TuiWinType displayMode; - int split; - TuiRegisterDisplayType regsDisplayType; - TuiRegisterDisplayType floatRegsDisplayType; -} TuiLayoutDef, *TuiLayoutDefPtr; - -/* Elements in the Source/Disassembly Window */ -typedef struct _TuiSourceElement -{ - char *line; - TuiLineOrAddress lineOrAddr; - int isExecPoint; - int hasBreak; -} TuiSourceElement, *TuiSourceElementPtr; - - -/* Elements in the data display window content */ -typedef struct _TuiDataElement -{ - char *name; - int itemNo; /* the register number, or data display number */ - TuiDataType type; - Opaque value; - int highlight; -} TuiDataElement, *TuiDataElementPtr; - - -/* Elements in the command window content */ -typedef struct _TuiCommandElement -{ - char *line; -} TuiCommandElement, *TuiCommandElementPtr; - - -#define MAX_LOCATOR_ELEMENT_LEN 100 - -/* Elements in the locator window content */ -typedef struct _TuiLocatorElement -{ - char fileName[MAX_LOCATOR_ELEMENT_LEN]; - char procName[MAX_LOCATOR_ELEMENT_LEN]; - int lineNo; - Opaque addr; -} TuiLocatorElement, *TuiLocatorElementPtr; - - -/* An content element in a window */ -typedef union -{ - TuiSourceElement source; /* the source elements */ - TuiGenWinInfo dataWindow; /* data display elements */ - TuiDataElement data; /* elements of dataWindow */ - TuiCommandElement command; /* command elements */ - TuiLocatorElement locator; /* locator elements */ - char *simpleString; /* simple char based elements */ -} TuiWhichElement, *TuiWhichElementPtr; - -typedef struct _TuiWinElement -{ - int highlight; - TuiWhichElement whichElement; -} TuiWinElement, *TuiWinElementPtr; - - -/* This describes the content of the window. */ -typedef TuiWinElementPtr *TuiWinContent; - - -/* This struct defines the specific information about a data display window */ -typedef struct _TuiDataInfo { - TuiWinContent dataContent; /* start of data display content */ - int dataContentCount; - TuiWinContent regsContent; /* start of regs display content */ - int regsContentCount; - TuiRegisterDisplayType regsDisplayType; - int regsColumnCount; - int displayRegs; /* Should regs be displayed at all? */ -} TuiDataInfo, *TuiDataInfoPtr; - - -typedef struct _TuiSourceInfo { - int hasLocator; /* Does locator belongs to this window? */ - TuiGenWinInfoPtr executionInfo; /* execution information window */ - int horizontalOffset; /* used for horizontal scroll */ - TuiLineOrAddress startLineOrAddr; -} TuiSourceInfo, *TuiSourceInfoPtr; - - -typedef struct _TuiCommandInfo { - int curLine; /* The current line position */ - int curch; /* The current cursor position */ -} TuiCommandInfo, *TuiCommandInfoPtr; - - -/* This defines information about each logical window */ -typedef struct _TuiWinInfo { - TuiGenWinInfo generic; /* general window information */ - union { - TuiSourceInfo sourceInfo; - TuiDataInfo dataDisplayInfo; - TuiCommandInfo commandInfo; - Opaque opaque; - } detail; - int canHighlight; /* Can this window ever be highlighted? */ - int isHighlighted; /* Is this window highlighted? */ -} TuiWinInfo, *TuiWinInfoPtr; - -/* MACROS (prefixed with m_) */ - -/* Testing macros */ -#define m_genWinPtrIsNull(winInfo) \ - ((winInfo) == (TuiGenWinInfoPtr)NULL) -#define m_genWinPtrNotNull(winInfo) \ - ((winInfo) != (TuiGenWinInfoPtr)NULL) -#define m_winPtrIsNull(winInfo) \ - ((winInfo) == (TuiWinInfoPtr)NULL) -#define m_winPtrNotNull(winInfo) \ - ((winInfo) != (TuiWinInfoPtr)NULL) - -#define m_winIsSourceType(type) \ - (type == SRC_WIN || type == DISASSEM_WIN) -#define m_winIsAuxillary(winType) \ - (winType > MAX_MAJOR_WINDOWS) -#define m_hasLocator(winInfo) \ - ( ((winInfo) != (TuiWinInfoPtr)NULL) ? \ - (winInfo->detail.sourceInfo.hasLocator) : \ - FALSE ) - -#define m_setWinHighlightOn(winInfo) \ - if ((winInfo) != (TuiWinInfoPtr)NULL) \ - (winInfo)->isHighlighted = TRUE -#define m_setWinHighlightOff(winInfo) \ - if ((winInfo) != (TuiWinInfoPtr)NULL) \ - (winInfo)->isHighlighted = FALSE - - -/* Global Data */ -extern TuiWinInfoPtr winList[MAX_MAJOR_WINDOWS]; -extern int tui_version; - -/* Macros */ -#define srcWin winList[SRC_WIN] -#define disassemWin winList[DISASSEM_WIN] -#define dataWin winList[DATA_WIN] -#define cmdWin winList[CMD_WIN] - -/* Data Manipulation Functions */ -extern void initializeStaticData PARAMS ((void)); -extern TuiGenWinInfoPtr allocGenericWinInfo PARAMS ((void)); -extern TuiWinInfoPtr allocWinInfo PARAMS ((TuiWinType)); -extern void initGenericPart PARAMS ((TuiGenWinInfoPtr)); -extern void initWinInfo PARAMS ((TuiWinInfoPtr)); -extern TuiWinContent allocContent PARAMS ((int, TuiWinType)); -extern int addContentElements - PARAMS ((TuiGenWinInfoPtr, int)); -extern void initContentElement - PARAMS ((TuiWinElementPtr, TuiWinType)); -extern void freeWindow PARAMS ((TuiWinInfoPtr)); -extern void freeAllWindows PARAMS ((void)); -extern void freeWinContent PARAMS ((TuiGenWinInfoPtr)); -extern void freeDataContent PARAMS ((TuiWinContent, int)); -extern void freeAllSourceWinsContent PARAMS ((void)); -extern void tuiDelWindow PARAMS ((TuiWinInfoPtr)); -extern void tuiDelDataWindows PARAMS ((TuiWinContent, int)); -extern TuiWinInfoPtr winByName PARAMS ((char *)); -extern TuiWinInfoPtr partialWinByName PARAMS ((char *)); -extern char *winName PARAMS ((TuiGenWinInfoPtr)); -extern char *displayableWinContentOf - PARAMS ((TuiGenWinInfoPtr, TuiWinElementPtr)); -extern char *displayableWinContentAt - PARAMS ((TuiGenWinInfoPtr, int)); -extern int winElementHeight - PARAMS ((TuiGenWinInfoPtr, TuiWinElementPtr)); -extern TuiLayoutType currentLayout PARAMS ((void)); -extern void setCurrentLayoutTo PARAMS ((TuiLayoutType)); -extern int termHeight PARAMS ((void)); -extern void setTermHeight PARAMS ((int)); -extern int termWidth PARAMS ((void)); -extern void setTermWidth PARAMS ((int)); -extern int historyLimit PARAMS ((void)); -extern void setHistoryLimit PARAMS ((int)); -extern void setGenWinOrigin PARAMS ((TuiGenWinInfoPtr, int, int)); -extern TuiGenWinInfoPtr locatorWinInfoPtr PARAMS ((void)); -extern TuiGenWinInfoPtr sourceExecInfoWinPtr PARAMS ((void)); -extern TuiGenWinInfoPtr disassemExecInfoWinPtr PARAMS ((void)); -extern char *nullStr PARAMS ((void)); -extern char *blankStr PARAMS ((void)); -extern char *locationStr PARAMS ((void)); -extern char *breakStr PARAMS ((void)); -extern char *breakLocationStr PARAMS ((void)); -extern TuiListPtr sourceWindows PARAMS ((void)); -extern void clearSourceWindows PARAMS ((void)); -extern void clearSourceWindowsDetail PARAMS ((void)); -extern void clearWinDetail PARAMS ((TuiWinInfoPtr winInfo)); -extern void tuiAddToSourceWindows PARAMS ((TuiWinInfoPtr)); -extern int tuiDefaultTabLen PARAMS ((void)); -extern void tuiSetDefaultTabLen PARAMS ((int)); -extern TuiWinInfoPtr tuiWinWithFocus PARAMS ((void)); -extern void tuiSetWinWithFocus PARAMS ((TuiWinInfoPtr)); -extern TuiLayoutDefPtr tuiLayoutDef PARAMS ((void)); -extern int tuiWinResized PARAMS ((void)); -extern void tuiSetWinResizedTo PARAMS ((int)); - -extern TuiWinInfoPtr tuiNextWin PARAMS ((TuiWinInfoPtr)); -extern TuiWinInfoPtr tuiPrevWin PARAMS ((TuiWinInfoPtr)); - - -#endif /* TUI_DATA_H */ diff --git a/contrib/gdb/gdb/tui/tuiDataWin.c b/contrib/gdb/gdb/tui/tuiDataWin.c deleted file mode 100644 index 522730ae2fddc..0000000000000 --- a/contrib/gdb/gdb/tui/tuiDataWin.c +++ /dev/null @@ -1,400 +0,0 @@ -/* -** tuiDataWin.c -** This module contains functions to support the data/register window display. -*/ - - -#include "defs.h" -#include "tui.h" -#include "tuiData.h" -#include "tuiRegs.h" - - -/***************************************** -** STATIC LOCAL FUNCTIONS FORWARD DECLS ** -******************************************/ - - - -/***************************************** -** PUBLIC FUNCTIONS ** -******************************************/ - - -/* -** tuiFirstDataItemDisplayed() -** Answer the index first element displayed. -** If none are displayed, then return (-1). -*/ -int -#ifdef __STDC__ -tuiFirstDataItemDisplayed (void) -#else -tuiFirstDataItemDisplayed () -#endif -{ - int elementNo = (-1); - int i; - - for (i = 0; (i < dataWin->generic.contentSize && elementNo < 0); i++) - { - TuiGenWinInfoPtr dataItemWin; - - dataItemWin = &((TuiWinContent) - dataWin->generic.content)[i]->whichElement.dataWindow; - if (dataItemWin->handle != (WINDOW *) NULL && dataItemWin->isVisible) - elementNo = i; - } - - return elementNo; -} /* tuiFirstDataItemDisplayed */ - - -/* -** tuiFirstDataElementNoInLine() -** Answer the index of the first element in lineNo. If lineNo is -** past the data area (-1) is returned. -*/ -int -#ifdef __STDC__ -tuiFirstDataElementNoInLine ( - int lineNo) -#else -tuiFirstDataElementNoInLine (lineNo) - int lineNo; -#endif -{ - int firstElementNo = (-1); - - /* - ** First see if there is a register on lineNo, and if so, set the - ** first element number - */ - if ((firstElementNo = tuiFirstRegElementNoInLine (lineNo)) == -1) - { /* - ** Looking at the general data, the 1st element on lineNo - */ - } - - return firstElementNo; -} /* tuiFirstDataElementNoInLine */ - - -/* -** tuiDeleteDataContentWindows() -** Function to delete all the item windows in the data window. -** This is usually done when the data window is scrolled. -*/ -void -#ifdef __STDC__ -tuiDeleteDataContentWindows (void) -#else -tuiDeleteDataContentWindows () -#endif -{ - int i; - TuiGenWinInfoPtr dataItemWinPtr; - - for (i = 0; (i < dataWin->generic.contentSize); i++) - { - dataItemWinPtr = &((TuiWinContent) - dataWin->generic.content)[i]->whichElement.dataWindow; - tuiDelwin (dataItemWinPtr->handle); - dataItemWinPtr->handle = (WINDOW *) NULL; - dataItemWinPtr->isVisible = FALSE; - } - - return; -} /* tuiDeleteDataContentWindows */ - - -void -#ifdef __STDC__ -tuiEraseDataContent ( - char *prompt) -#else -tuiEraseDataContent (prompt) - char *prompt; -#endif -{ - werase (dataWin->generic.handle); - checkAndDisplayHighlightIfNeeded (dataWin); - if (prompt != (char *) NULL) - { - int halfWidth = (dataWin->generic.width - 2) / 2; - int xPos; - - if (strlen (prompt) >= halfWidth) - xPos = 1; - else - xPos = halfWidth - strlen (prompt); - mvwaddstr (dataWin->generic.handle, - (dataWin->generic.height / 2), - xPos, - prompt); - } - wrefresh (dataWin->generic.handle); - - return; -} /* tuiEraseDataContent */ - - -/* -** tuiDisplayAllData(). -** This function displays the data that is in the data window's -** content. It does not set the content. -*/ -void -#ifdef __STDC__ -tuiDisplayAllData (void) -#else -tuiDisplayAllData () -#endif -{ - if (dataWin->generic.contentSize <= 0) - tuiEraseDataContent (NO_DATA_STRING); - else - { - tuiEraseDataContent ((char *) NULL); - tuiDeleteDataContentWindows (); - checkAndDisplayHighlightIfNeeded (dataWin); - tuiDisplayRegistersFrom (0); - /* - ** Then display the other data - */ - if (dataWin->detail.dataDisplayInfo.dataContent != - (TuiWinContent) NULL && - dataWin->detail.dataDisplayInfo.dataContentCount > 0) - { - } - } - return; -} /* tuiDisplayAllData */ - - -/* -** tuiDisplayDataFromLine() -** Function to display the data starting at line, lineNo, in the -** data window. -*/ -void -#ifdef __STDC__ -tuiDisplayDataFromLine ( - int lineNo) -#else -tuiDisplayDataFromLine (lineNo) - int lineNo; -#endif -{ - int _lineNo = lineNo; - - if (lineNo < 0) - _lineNo = 0; - - checkAndDisplayHighlightIfNeeded (dataWin); - - /* there is no general data, force regs to display (if there are any) */ - if (dataWin->detail.dataDisplayInfo.dataContentCount <= 0) - tuiDisplayRegistersFromLine (_lineNo, TRUE); - else - { - int elementNo, startLineNo; - int regsLastLine = tuiLastRegsLineNo (); - - - /* display regs if we can */ - if (tuiDisplayRegistersFromLine (_lineNo, FALSE) < 0) - { /* - ** _lineNo is past the regs display, so calc where the - ** start data element is - */ - if (regsLastLine < _lineNo) - { /* figure out how many lines each element is to obtain - the start elementNo */ - } - } - else - { /* - ** calculate the starting element of the data display, given - ** regsLastLine and how many lines each element is, up to - ** _lineNo - */ - } - /* Now display the data , starting at elementNo */ - } - - return; -} /* tuiDisplayDataFromLine */ - - -/* -** tuiDisplayDataFrom() -** Display data starting at element elementNo -*/ -void -#ifdef __STDC__ -tuiDisplayDataFrom ( - int elementNo, - int reuseWindows) -#else -tuiDisplayDataFrom (elementNo, reuseWindows) - int elementNo; - int reuseWindows; -#endif -{ - int firstLine = (-1); - - if (elementNo < dataWin->detail.dataDisplayInfo.regsContentCount) - firstLine = tuiLineFromRegElementNo (elementNo); - else - { /* calculate the firstLine from the element number */ - } - - if (firstLine >= 0) - { - tuiEraseDataContent ((char *) NULL); - if (!reuseWindows) - tuiDeleteDataContentWindows (); - tuiDisplayDataFromLine (firstLine); - } - - return; -} /* tuiDisplayDataFrom */ - - -/* -** tuiRefreshDataWin() -** Function to redisplay the contents of the data window. -*/ -void -#ifdef __STDC__ -tuiRefreshDataWin (void) -#else -tuiRefreshDataWin () -#endif -{ - tuiEraseDataContent ((char *) NULL); - if (dataWin->generic.contentSize > 0) - { - int firstElement = tuiFirstDataItemDisplayed (); - - if (firstElement >= 0) /* re-use existing windows */ - tuiDisplayDataFrom (firstElement, TRUE); - } - - return; -} /* tuiRefreshDataWin */ - - -/* -** tuiCheckDataValues(). -** Function to check the data values and hilite any that have changed -*/ -void -#ifdef __STDC__ -tuiCheckDataValues ( - struct frame_info *frame) -#else -tuiCheckDataValues (frame) - struct frame_info *frame; -#endif -{ - tuiCheckRegisterValues (frame); - - /* Now check any other data values that there are */ - if (m_winPtrNotNull (dataWin) && dataWin->generic.isVisible) - { - int i; - - for (i = 0; dataWin->detail.dataDisplayInfo.dataContentCount; i++) - { -#ifdef LATER - TuiDataElementPtr dataElementPtr; - TuiGenWinInfoPtr dataItemWinPtr; - Opaque newValue; - - dataItemPtr = &dataWin->detail.dataDisplayInfo. - dataContent[i]->whichElement.dataWindow; - dataElementPtr = &((TuiWinContent) - dataItemWinPtr->content)[0]->whichElement.data; - if value - has changed (dataElementPtr, frame, &newValue) - { - dataElementPtr->value = newValue; - update the display with the new value, hiliting it. - } -#endif - } - } -} /* tuiCheckDataValues */ - - -/* -** tui_vCheckDataValues(). -** Function to check the data values and hilite any that have -** changed with args in a va_list -*/ -void -#ifdef __STDC__ -tui_vCheckDataValues ( - va_list args) -#else -tui_vCheckDataValues (args) - va_list args; -#endif -{ - struct frame_info *frame = va_arg (args, struct frame_info *); - - tuiCheckDataValues (frame); - - return; -} /* tui_vCheckDataValues */ - - -/* -** tuiVerticalDataScroll() -** Scroll the data window vertically forward or backward. -*/ -void -#ifdef __STDC__ -tuiVerticalDataScroll ( - TuiScrollDirection scrollDirection, - int numToScroll) -#else -tuiVerticalDataScroll (scrollDirection, numToScroll) - TuiScrollDirection scrollDirection; - int numToScroll; -#endif -{ - int firstElementNo; - int firstLine = (-1); - - firstElementNo = tuiFirstDataItemDisplayed (); - if (firstElementNo < dataWin->detail.dataDisplayInfo.regsContentCount) - firstLine = tuiLineFromRegElementNo (firstElementNo); - else - { /* calculate the first line from the element number which is in - ** the general data content - */ - } - - if (firstLine >= 0) - { - int lastElementNo, lastLine; - - if (scrollDirection == FORWARD_SCROLL) - firstLine += numToScroll; - else - firstLine -= numToScroll; - tuiEraseDataContent ((char *) NULL); - tuiDeleteDataContentWindows (); - tuiDisplayDataFromLine (firstLine); - } - - return; -} /* tuiVerticalDataScroll */ - - -/***************************************** -** STATIC LOCAL FUNCTIONS ** -******************************************/ diff --git a/contrib/gdb/gdb/tui/tuiDataWin.h b/contrib/gdb/gdb/tui/tuiDataWin.h deleted file mode 100644 index 8f9e46d80e7ee..0000000000000 --- a/contrib/gdb/gdb/tui/tuiDataWin.h +++ /dev/null @@ -1,29 +0,0 @@ -#ifndef _TUI_DATAWIN_H -#define _TUI_DATAWIN_H -/* -** This header file supports the display of registers/data in the data window. -*/ - - -/***************************************** -** TYPE DEFINITIONS ** -******************************************/ - - - -/***************************************** -** PUBLIC FUNCTION EXTERNAL DECLS ** -******************************************/ -extern void tuiEraseDataContent PARAMS ((char *)); -extern void tuiDisplayAllData PARAMS ((void)); -extern void tuiCheckDataValues PARAMS ((struct frame_info *)); -extern void tui_vCheckDataValues PARAMS ((va_list)); -extern void tuiDisplayDataFromLine PARAMS ((int)); -extern int tuiFirstDataItemDisplayed PARAMS ((void)); -extern int tuiFirstDataElementNoInLine PARAMS ((int)); -extern void tuiDeleteDataContentWindows PARAMS ((void)); -extern void tuiRefreshDataWin PARAMS ((void)); -extern void tuiDisplayDataFrom PARAMS ((int, int)); -extern void tuiVerticalDataScroll PARAMS ((TuiScrollDirection, int)); - -#endif /*_TUI_DATAWIN_H*/ diff --git a/contrib/gdb/gdb/tui/tuiDisassem.c b/contrib/gdb/gdb/tui/tuiDisassem.c deleted file mode 100644 index ad0b70f655dfe..0000000000000 --- a/contrib/gdb/gdb/tui/tuiDisassem.c +++ /dev/null @@ -1,343 +0,0 @@ -/* -** tuiDisassem.c -** This module contains functions for handling disassembly display. -*/ - - -#include "defs.h" -#include "symtab.h" -#include "breakpoint.h" -#include "frame.h" - -#include "tui.h" -#include "tuiData.h" -#include "tuiLayout.h" -#include "tuiSourceWin.h" -#include "tuiStack.h" - - -/***************************************** -** STATIC LOCAL FUNCTIONS FORWARD DECLS ** -******************************************/ - -static struct breakpoint *_hasBreak PARAMS ((CORE_ADDR)); - - -/***************************************** -** PUBLIC FUNCTIONS ** -******************************************/ - -/* -** tuiSetDisassemContent(). -** Function to set the disassembly window's content. -*/ -TuiStatus -#ifdef __STDC__ -tuiSetDisassemContent ( - struct symtab *s, - Opaque startAddr) -#else - tuiSetDisassemContent (s, startAddr) - struct symtab *s; - Opaque startAddr; -#endif -{ - TuiStatus ret = TUI_FAILURE; - GDB_FILE *gdb_dis_out; - - if (startAddr != (Opaque) NULL) - { - register int i, desc; - - if ((ret = tuiAllocSourceBuffer (disassemWin)) == TUI_SUCCESS) - { - register int offset = disassemWin->detail.sourceInfo.horizontalOffset; - register int threshold, curLine = 0, lineWidth, maxLines; - CORE_ADDR newpc, pc; - disassemble_info asmInfo; - TuiGenWinInfoPtr locator = locatorWinInfoPtr (); - extern void strcat_address PARAMS ((CORE_ADDR, char *, int)); - extern void strcat_address_numeric PARAMS ((CORE_ADDR, int, char *, int)); - int curLen = 0; - int tab_len = tuiDefaultTabLen (); - - maxLines = disassemWin->generic.height - 2; /* account for hilite */ - lineWidth = disassemWin->generic.width - 1; - threshold = (lineWidth - 1) + offset; - - /* now init the gdb_file structure */ - gdb_dis_out = gdb_file_init_astring (threshold); - - INIT_DISASSEMBLE_INFO_NO_ARCH (asmInfo, gdb_dis_out, (fprintf_ftype) fprintf_filtered); - asmInfo.read_memory_func = dis_asm_read_memory; - asmInfo.memory_error_func = dis_asm_memory_error; - - disassemWin->detail.sourceInfo.startLineOrAddr.addr = startAddr; - - /* Now construct each line */ - for (curLine = 0, pc = (CORE_ADDR) startAddr; (curLine < maxLines);) - { - TuiWinElementPtr element = (TuiWinElementPtr)disassemWin->generic.content[curLine]; - struct breakpoint *bp; - - print_address (pc, gdb_dis_out); - - curLen = strlen (gdb_file_get_strbuf (gdb_dis_out)); - i = curLen - ((curLen / tab_len) * tab_len); - - /* adjust buffer length if necessary */ - gdb_file_adjust_strbuf ((tab_len - i > 0) ? (tab_len - i ) : 0, gdb_dis_out); - - /* Add spaces to make the instructions start onthe same column */ - while (i < tab_len) - { - gdb_file_get_strbuf (gdb_dis_out)[curLen] = ' '; - i++; - curLen++; - } - gdb_file_get_strbuf (gdb_dis_out)[curLen] = '\0'; - - newpc = pc + ((*tm_print_insn) (pc, &asmInfo)); - - /* Now copy the line taking the offset into account */ - if (strlen (gdb_file_get_strbuf (gdb_dis_out)) > offset) - strcpy (element->whichElement.source.line, - &(gdb_file_get_strbuf (gdb_dis_out)[offset])); - else - element->whichElement.source.line[0] = '\0'; - element->whichElement.source.lineOrAddr.addr = (Opaque) pc; - element->whichElement.source.isExecPoint = - (pc == (CORE_ADDR) ((TuiWinElementPtr)locator->content[0])->whichElement.locator.addr); - bp = _hasBreak (pc); - element->whichElement.source.hasBreak = - (bp != (struct breakpoint *) NULL && - (!element->whichElement.source.isExecPoint || - (bp->disposition != del || bp->hit_count <= 0))); - curLine++; - pc = newpc; - /* reset the buffer to empty */ - gdb_file_get_strbuf (gdb_dis_out)[0] = '\0'; - } - gdb_file_deallocate (&gdb_dis_out); - disassemWin->generic.contentSize = curLine; - ret = TUI_SUCCESS; - } - } - - return ret; -} /* tuiSetDisassemContent */ - - -/* -** tuiShowDisassem(). -** Function to display the disassembly window with disassembled code. -*/ -void -#ifdef __STDC__ -tuiShowDisassem ( - Opaque startAddr) -#else -tuiShowDisassem (startAddr) - Opaque startAddr; -#endif -{ - struct symtab *s = find_pc_symtab ((CORE_ADDR) startAddr); - TuiWinInfoPtr winWithFocus = tuiWinWithFocus (); - - tuiAddWinToLayout (DISASSEM_WIN); - tuiUpdateSourceWindow (disassemWin, s, startAddr, FALSE); - /* - ** if the focus was in the src win, put it in the asm win, if the - ** source view isn't split - */ - if (currentLayout () != SRC_DISASSEM_COMMAND && winWithFocus == srcWin) - tuiSetWinFocusTo (disassemWin); - - return; -} /* tuiShowDisassem */ - - -/* -** tuiShowDisassemAndUpdateSource(). -** Function to display the disassembly window. -*/ -void -#ifdef __STDC__ -tuiShowDisassemAndUpdateSource ( - Opaque startAddr) -#else -tuiShowDisassemAndUpdateSource (startAddr) - Opaque startAddr; -#endif -{ - struct symtab_and_line sal; - - tuiShowDisassem (startAddr); - if (currentLayout () == SRC_DISASSEM_COMMAND) - { - TuiGenWinInfoPtr locator = locatorWinInfoPtr (); - /* - ** Update what is in the source window if it is displayed too, - ** note that it follows what is in the disassembly window and visa-versa - */ - sal = find_pc_line ((CORE_ADDR) startAddr, 0); - current_source_symtab = sal.symtab; - tuiUpdateSourceWindow (srcWin, sal.symtab, (Opaque) sal.line, TRUE); - tuiUpdateLocatorFilename (sal.symtab->filename); - } - - return; -} /* tuiShowDisassemAndUpdateSource */ - - -/* -** tuiShowDisassemAsIs(). -** Function to display the disassembly window. This function shows -** the disassembly as specified by the horizontal offset. -*/ -void -#ifdef __STDC__ -tuiShowDisassemAsIs ( - Opaque addr) -#else -tuiShowDisassemAsIs (addr) - Opaque addr; -#endif -{ - tuiAddWinToLayout (DISASSEM_WIN); - tuiUpdateSourceWindowAsIs (disassemWin, (struct symtab *) NULL, addr, FALSE); - /* - ** Update what is in the source window if it is displayed too, not that it - ** follows what is in the disassembly window and visa-versa - */ - if (currentLayout () == SRC_DISASSEM_COMMAND) - tuiShowSourceContent (srcWin); /*???? Need to do more? */ - - return; -} /* tuiShowDisassem */ - - -/* -** tuiGetBeginAsmAddress(). -*/ -Opaque -#ifdef __STDC__ -tuiGetBeginAsmAddress (void) -#else -tuiGetBeginAsmAddress () -#endif -{ - TuiGenWinInfoPtr locator; - TuiLocatorElementPtr element; - Opaque addr; - - locator = locatorWinInfoPtr (); - element = &((TuiWinElementPtr) locator->content[0])->whichElement.locator; - - if (element->addr == (Opaque) 0) - { - /*the target is not executing, because the pc is 0*/ - - addr = (Opaque) parse_and_eval_address ("main"); - - if (addr == (Opaque) 0) - addr = (Opaque) parse_and_eval_address ("MAIN"); - - } - else /* the target is executing */ - addr = element->addr; - - return addr; -} /* tuiGetBeginAsmAddress */ - - -/* -** tuiVerticalDisassemScroll(). -** Scroll the disassembly forward or backward vertically -*/ -void -#ifdef __STDC__ -tuiVerticalDisassemScroll ( - TuiScrollDirection scrollDirection, - int numToScroll) -#else -tuiVerticalDisassemScroll (scrollDirection, numToScroll) - TuiScrollDirection scrollDirection; - int numToScroll; -#endif -{ - if (disassemWin->generic.content != (OpaquePtr) NULL) - { - Opaque pc, lowAddr; - TuiWinContent content; - struct symtab *s; - - content = (TuiWinContent) disassemWin->generic.content; - if (current_source_symtab == (struct symtab *) NULL) - s = find_pc_symtab (selected_frame->pc); - else - s = current_source_symtab; - - pc = content[0]->whichElement.source.lineOrAddr.addr; - if (find_pc_partial_function ((CORE_ADDR) pc, - (char **) NULL, - (CORE_ADDR *) & lowAddr, - (CORE_ADDR) NULL) == 0) - error ("No function contains prgram counter for selected frame.\n"); - else - { - register int line = 0; - register Opaque newLow; - bfd_byte buffer[4]; - - newLow = pc; - if (scrollDirection == FORWARD_SCROLL) - { - for (; line < numToScroll; line++) - newLow += sizeof (bfd_getb32 (buffer)); - } - else - { - for (; newLow >= (Opaque) 0 && line < numToScroll; line++) - newLow -= sizeof (bfd_getb32 (buffer)); - } - tuiUpdateSourceWindowAsIs (disassemWin, s, newLow, FALSE); - } - } - - return; -} /* tuiVerticalDisassemScroll */ - - - -/***************************************** -** STATIC LOCAL FUNCTIONS ** -******************************************/ -/* -** _hasBreak(). -** Answer whether there is a break point at the input line in the -** source file indicated -*/ -static struct breakpoint * -#ifdef __STDC__ -_hasBreak ( - CORE_ADDR addr) -#else -_hasBreak (addr) - CORE_ADDR addr; -#endif -{ - struct breakpoint *bpWithBreak = (struct breakpoint *) NULL; - struct breakpoint *bp; - extern struct breakpoint *breakpoint_chain; - - - for (bp = breakpoint_chain; - (bp != (struct breakpoint *) NULL && - bpWithBreak == (struct breakpoint *) NULL); - bp = bp->next) - if (addr == bp->address) - bpWithBreak = bp; - - return bpWithBreak; -} /* _hasBreak */ diff --git a/contrib/gdb/gdb/tui/tuiDisassem.h b/contrib/gdb/gdb/tui/tuiDisassem.h deleted file mode 100644 index 711ac48587d28..0000000000000 --- a/contrib/gdb/gdb/tui/tuiDisassem.h +++ /dev/null @@ -1,22 +0,0 @@ -#ifndef _TUI_DISASSEM_H -#define _TUI_DISASSEM_H -/* -** This header file supports -*/ - -/***************************************** -** TYPE DEFINITIONS ** -******************************************/ - - - -/***************************************** -** PUBLIC FUNCTION EXTERNAL DECLS ** -******************************************/ -extern TuiStatus tuiSetDisassemContent PARAMS ((struct symtab *, Opaque)); -extern void tuiShowDisassem PARAMS ((Opaque)); -extern void tuiShowDisassemAndUpdateSource PARAMS ((Opaque)); -extern void tuiVerticalDisassemScroll PARAMS ((TuiScrollDirection, int)); -extern Opaque tuiGetBeginAsmAddress PARAMS ((void)); - -#endif /*_TUI_DISASSEM_H*/ diff --git a/contrib/gdb/gdb/tui/tuiGeneralWin.c b/contrib/gdb/gdb/tui/tuiGeneralWin.c deleted file mode 100644 index 5af0cd7a92e82..0000000000000 --- a/contrib/gdb/gdb/tui/tuiGeneralWin.c +++ /dev/null @@ -1,469 +0,0 @@ -/* -** TuiGeneralWin.c -** This module supports general window behavior -*/ - -#include <curses.h> -#include "defs.h" -#include "tui.h" -#include "tuiData.h" -#include "tuiGeneralWin.h" - - -/* -** local support functions -*/ -static void _winResize PARAMS ((void)); - - -/*********************** -** PUBLIC FUNCTIONS -***********************/ -/* -** tuiRefreshWin() -** Refresh the window -*/ -void -#ifdef __STDC__ -tuiRefreshWin ( - TuiGenWinInfoPtr winInfo) -#else -tuiRefreshWin (winInfo) - TuiGenWinInfoPtr winInfo; -#endif -{ - if (winInfo->type == DATA_WIN && winInfo->contentSize > 0) - { - int i; - - for (i = 0; (i < winInfo->contentSize); i++) - { - TuiGenWinInfoPtr dataItemWinPtr; - - dataItemWinPtr = &((TuiWinContent) - winInfo->content)[i]->whichElement.dataWindow; - if (m_genWinPtrNotNull (dataItemWinPtr) && - dataItemWinPtr->handle != (WINDOW *) NULL) - wrefresh (dataItemWinPtr->handle); - } - } - else if (winInfo->type == CMD_WIN) - { - /* Do nothing */ - } - else - { - if (winInfo->handle != (WINDOW *) NULL) - wrefresh (winInfo->handle); - } - - return; -} /* tuiRefreshWin */ - - -/* -** tuiDelwin() -** Function to delete the curses window, checking for null -*/ -void -#ifdef __STDC__ -tuiDelwin ( - WINDOW * window) -#else -tuiDelwin (window) - WINDOW *window; -#endif -{ - if (window != (WINDOW *) NULL) - delwin (window); - - return; -} /* tuiDelwin */ - - -/* -** boxWin(). -*/ -void -#ifdef __STDC__ -boxWin ( - TuiGenWinInfoPtr winInfo, - int highlightFlag) -#else -boxWin (winInfo, highlightFlag) - TuiGenWinInfoPtr winInfo; - int highlightFlag; -#endif -{ - if (m_genWinPtrNotNull (winInfo) && winInfo->handle != (WINDOW *) NULL) - { - if (highlightFlag == HILITE) - box (winInfo->handle, '|', '-'); - else - { -/* wattron(winInfo->handle, A_DIM);*/ - box (winInfo->handle, ':', '.'); -/* wattroff(winInfo->handle, A_DIM);*/ - } - } - - return; -} /* boxWin */ - - -/* -** unhighlightWin(). -*/ -void -#ifdef __STDC__ -unhighlightWin ( - TuiWinInfoPtr winInfo) -#else -unhighlightWin (winInfo) - TuiWinInfoPtr winInfo; -#endif -{ - if (m_winPtrNotNull (winInfo) && winInfo->generic.handle != (WINDOW *) NULL) - { - boxWin ((TuiGenWinInfoPtr) winInfo, NO_HILITE); - wrefresh (winInfo->generic.handle); - m_setWinHighlightOff (winInfo); - } -} /* unhighlightWin */ - - -/* -** highlightWin(). -*/ -void -#ifdef __STDC__ -highlightWin ( - TuiWinInfoPtr winInfo) -#else -highlightWin (winInfo) - TuiWinInfoPtr winInfo; -#endif -{ - if (m_winPtrNotNull (winInfo) && - winInfo->canHighlight && winInfo->generic.handle != (WINDOW *) NULL) - { - boxWin ((TuiGenWinInfoPtr) winInfo, HILITE); - wrefresh (winInfo->generic.handle); - m_setWinHighlightOn (winInfo); - } -} /* highlightWin */ - - -/* -** checkAndDisplayHighlightIfNecessay -*/ -void -#ifdef __STDC__ -checkAndDisplayHighlightIfNeeded ( - TuiWinInfoPtr winInfo) -#else -checkAndDisplayHighlightIfNeeded (winInfo) - TuiWinInfoPtr winInfo; -#endif -{ - if (m_winPtrNotNull (winInfo) && winInfo->generic.type != CMD_WIN) - { - if (winInfo->isHighlighted) - highlightWin (winInfo); - else - unhighlightWin (winInfo); - - } - return; -} /* checkAndDisplayHighlightIfNeeded */ - - -/* -** makeWindow(). -*/ -void -#ifdef __STDC__ -makeWindow ( - TuiGenWinInfoPtr winInfo, - int boxIt) -#else -makeWindow (winInfo, boxIt) - TuiGenWinInfoPtr winInfo; - int boxIt; -#endif -{ - WINDOW *handle; - - handle = newwin (winInfo->height, - winInfo->width, - winInfo->origin.y, - winInfo->origin.x); - winInfo->handle = handle; - if (handle != (WINDOW *) NULL) - { - if (boxIt == BOX_WINDOW) - boxWin (winInfo, NO_HILITE); - winInfo->isVisible = TRUE; - scrollok (handle, TRUE); - tuiRefreshWin (winInfo); - -#ifndef FOR_TEST - if ( /*!m_WinIsAuxillary(winInfo->type) && */ - (winInfo->type != CMD_WIN) && - (winInfo->content == (OpaquePtr) NULL)) - { - mvwaddstr (handle, 1, 1, winName (winInfo)); - tuiRefreshWin (winInfo); - } -#endif /*FOR_TEST*/ - } - - return; -} /* makeWindow */ - - -/* -** tuiClearWin(). -** Clear the window of all contents without calling wclear. -*/ -void -#ifdef __STDC__ -tuiClearWin ( - TuiGenWinInfoPtr winInfo) -#else -tuiClearWin (winInfo) - TuiGenWinInfoPtr winInfo; -#endif -{ - if (m_genWinPtrNotNull (winInfo) && winInfo->handle != (WINDOW *) NULL) - { - int curRow, curCol; - - for (curRow = 0; (curRow < winInfo->height); curRow++) - for (curCol = 0; (curCol < winInfo->width); curCol++) - mvwaddch (winInfo->handle, curRow, curCol, ' '); - - tuiRefreshWin (winInfo); - } - - return; -} /* tuiClearWin */ - - -/* -** makeVisible(). -** We can't really make windows visible, or invisible. So we -** have to delete the entire window when making it visible, -** and create it again when making it visible. -*/ -void -#ifdef __STDC__ -makeVisible ( - TuiGenWinInfoPtr winInfo, - int visible) -#else -makeVisible (winInfo, visible) - TuiGenWinInfoPtr winInfo; - int visible; -#endif -{ - /* Don't tear down/recreate command window */ - if (winInfo->type == CMD_WIN) - return; - - if (visible) - { - if (!winInfo->isVisible) - { - makeWindow ( - winInfo, - (winInfo->type != CMD_WIN && !m_winIsAuxillary (winInfo->type))); - winInfo->isVisible = TRUE; - } - tuiRefreshWin (winInfo); - } - else if (!visible && - winInfo->isVisible && winInfo->handle != (WINDOW *) NULL) - { - winInfo->isVisible = FALSE; - tuiClearWin (winInfo); - tuiDelwin (winInfo->handle); - winInfo->handle = (WINDOW *) NULL; - } - - return; -} /* makeVisible */ - - -/* -** makeAllVisible(). -** Makes all windows invisible (except the command and locator windows) -*/ -void -#ifdef __STDC__ -makeAllVisible ( - int visible) -#else -makeAllVisible (visible) - int visible; -#endif -{ - int i; - - for (i = 0; i < MAX_MAJOR_WINDOWS; i++) - { - if (m_winPtrNotNull (winList[i]) && - ((winList[i])->generic.type) != CMD_WIN) - { - if (m_winIsSourceType ((winList[i])->generic.type)) - makeVisible ((winList[i])->detail.sourceInfo.executionInfo, - visible); - makeVisible ((TuiGenWinInfoPtr) winList[i], visible); - } - } - - return; -} /* makeAllVisible */ - - -/* -** scrollWinForward -*/ -void -#ifdef __STDC__ -scrollWinForward ( - TuiGenWinInfoPtr winInfo, - int numLines) -#else -scrollWinForward (winInfo, numLines) - TuiGenWinInfoPtr winInfo; - int numLines; -#endif -{ - if (winInfo->content != (OpaquePtr) NULL && - winInfo->lastVisibleLine < winInfo->contentSize - 1) - { - int i, firstLine, newLastLine; - - firstLine = winInfo->lastVisibleLine - winInfo->viewportHeight + 1; - if (winInfo->lastVisibleLine + numLines > winInfo->contentSize) - newLastLine = winInfo->contentSize - 1; - else - newLastLine = winInfo->lastVisibleLine + numLines - 1; - - for (i = (newLastLine - winInfo->viewportHeight); - (i <= newLastLine); i++) - { - TuiWinElementPtr line; - int lineHeight; - - line = (TuiWinElementPtr) winInfo->content[i]; - if (line->highlight) - wstandout (winInfo->handle); - mvwaddstr (winInfo->handle, - i - (newLastLine - winInfo->viewportHeight), - 1, - displayableWinContentOf (winInfo, line)); - if (line->highlight) - wstandend (winInfo->handle); - lineHeight = winElementHeight (winInfo, line); - newLastLine += (lineHeight - 1); - } - winInfo->lastVisibleLine = newLastLine; - } - - return; -} /* scrollWinForward */ - - -/* -** scrollWinBackward -*/ -void -#ifdef __STDC__ -scrollWinBackward ( - TuiGenWinInfoPtr winInfo, - int numLines) -#else -scrollWinBackward (winInfo, numLines) - TuiGenWinInfoPtr winInfo; - int numLines; -#endif -{ - if (winInfo->content != (OpaquePtr) NULL && - (winInfo->lastVisibleLine - winInfo->viewportHeight) > 0) - { - int i, newLastLine, firstLine; - - firstLine = winInfo->lastVisibleLine - winInfo->viewportHeight + 1; - if ((firstLine - numLines) < 0) - newLastLine = winInfo->viewportHeight - 1; - else - newLastLine = winInfo->lastVisibleLine - numLines + 1; - - for (i = newLastLine - winInfo->viewportHeight; (i <= newLastLine); i++) - { - TuiWinElementPtr line; - int lineHeight; - - line = (TuiWinElementPtr) winInfo->content[i]; - if (line->highlight) - wstandout (winInfo->handle); - mvwaddstr (winInfo->handle, - i - (newLastLine - winInfo->viewportHeight), - 1, - displayableWinContentOf (winInfo, line)); - if (line->highlight) - wstandend (winInfo->handle); - lineHeight = winElementHeight (winInfo, line); - newLastLine += (lineHeight - 1); - } - winInfo->lastVisibleLine = newLastLine; - } - - return; -} /* scrollWinBackward */ - - -/* -** refreshAll(). -** Function to refresh all the windows currently displayed -*/ -void -#ifdef __STDC__ -refreshAll ( - TuiWinInfoPtr * list) -#else -refreshAll (list) - TuiWinInfoPtr *list; -#endif -{ - TuiWinType type; - TuiGenWinInfoPtr locator = locatorWinInfoPtr (); - - for (type = SRC_WIN; (type < MAX_MAJOR_WINDOWS); type++) - { - if (list[type]->generic.isVisible) - { - if (type == SRC_WIN || type == DISASSEM_WIN) - { - touchwin (list[type]->detail.sourceInfo.executionInfo->handle); - tuiRefreshWin (list[type]->detail.sourceInfo.executionInfo); - } - touchwin (list[type]->generic.handle); - tuiRefreshWin (&list[type]->generic); - } - } - if (locator->isVisible) - { - touchwin (locator->handle); - tuiRefreshWin (locator); - } - - return; -} /* refreshAll */ - - -/********************************* -** Local Static Functions -*********************************/ diff --git a/contrib/gdb/gdb/tui/tuiGeneralWin.h b/contrib/gdb/gdb/tui/tuiGeneralWin.h deleted file mode 100644 index 559f8ab33398c..0000000000000 --- a/contrib/gdb/gdb/tui/tuiGeneralWin.h +++ /dev/null @@ -1,31 +0,0 @@ -#ifndef TUI_GENERAL_WIN_H -#define TUI_GENERAL_WIN_H - -/* -** Functions -*/ -extern void tuiClearWin PARAMS ((TuiGenWinInfoPtr)); -extern void unhighlightWin PARAMS ((TuiWinInfoPtr)); -extern void makeVisible PARAMS ((TuiGenWinInfoPtr, int)); -extern void makeAllVisible PARAMS ((int)); -extern void scrollWinForward PARAMS ((TuiGenWinInfoPtr, int)); -extern void scrollWinBackward PARAMS ((TuiGenWinInfoPtr, int)); -extern void makeWindow PARAMS ((TuiGenWinInfoPtr, int)); -extern TuiWinInfoPtr copyWin PARAMS ((TuiWinInfoPtr)); -extern void boxWin PARAMS ((TuiGenWinInfoPtr, int)); -extern void highlightWin PARAMS ((TuiWinInfoPtr)); -extern void checkAndDisplayHighlightIfNeeded PARAMS ((TuiWinInfoPtr)); -extern void refreshAll PARAMS ((TuiWinInfoPtr *)); -extern void tuiDelwin PARAMS ((WINDOW *window)); -extern void tuiRefreshWin PARAMS ((TuiGenWinInfoPtr)); - -/* -** Macros -*/ -#define m_beVisible(winInfo) makeVisible((TuiGenWinInfoPtr)(winInfo), TRUE) -#define m_beInvisible(winInfo) \ - makeVisible((TuiGenWinInfoPtr)(winInfo), FALSE) -#define m_allBeVisible() makeAllVisible(TRUE) -#define m_allBeInvisible() makeAllVisible(FALSE) - -#endif /*TUI_GENERAL_WIN_H*/ diff --git a/contrib/gdb/gdb/tui/tuiIO.c b/contrib/gdb/gdb/tui/tuiIO.c deleted file mode 100644 index 29a3613f96864..0000000000000 --- a/contrib/gdb/gdb/tui/tuiIO.c +++ /dev/null @@ -1,734 +0,0 @@ - -/* -** This module contains functions to support i/o in the TUI -*/ - - -#include <stdio.h> -#include "defs.h" -#include "terminal.h" -#include "tui.h" -#include "tuiData.h" -#include "tuiIO.h" -#include "tuiCommand.h" -#include "tuiWin.h" - -#ifdef ANSI_PROTOTYPES -#include <stdarg.h> -#else -#include <varargs.h> -#endif - -/* The Solaris header files seem to provide no declaration for this at - all when __STDC__ is defined. This shouldn't conflict with - anything. */ -extern char *tgoto (); - -int insert_mode = 0; - -/******************************************** -** LOCAL STATIC FORWARD DECLS ** -********************************************/ -static void _updateCommandInfo PARAMS ((int)); -static unsigned int _tuiHandleResizeDuringIO PARAMS ((unsigned int)); - - -/********************************************************************************* -** PUBLIC FUNCTIONS ** -*********************************************************************************/ - -/* -** tuiPuts_unfiltered(). -** Function to put a string to the command window -** When running in TUI mode, this is the "hook" -** for fputs_unfiltered(). That is, all debugger -** output eventually makes it's way to the bottom-level -** routine fputs_unfiltered (main.c), which (in TUI -** mode), calls tuiPuts_unfiltered(). -*/ -void -#ifdef __STDC__ -tuiPuts_unfiltered ( - const char *string, - GDB_FILE * stream) -#else -tuiPuts_unfiltered (string, stream) - char *string; - GDB_FILE *stream; -#endif -{ - int len = strlen (string); - int i, linech; - - for (i = 0; i < len; i++) - { - if (string[i] == '\n' || string[i] == '\r') - m_tuiStartNewLine; - else - { - if ((cmdWin->detail.commandInfo.curch + 1) > cmdWin->generic.width) - m_tuiStartNewLine; - - if (insert_mode) - { - mvwinsch (cmdWin->generic.handle, - cmdWin->detail.commandInfo.curLine, - cmdWin->detail.commandInfo.curch++, - string[i]); - wmove (cmdWin->generic.handle, - cmdWin->detail.commandInfo.curLine, - cmdWin->detail.commandInfo.curch); - } - else - mvwaddch (cmdWin->generic.handle, - cmdWin->detail.commandInfo.curLine, - cmdWin->detail.commandInfo.curch++, - string[i]); - } - } - tuiRefreshWin (&cmdWin->generic); - - return; -} /* tuiPuts_unfiltered */ - -/* A cover routine for tputs(). - * tputs() is called from the readline package to put - * out strings representing cursor positioning. - * In TUI mode (non-XDB-style), tui_tputs() is called instead. - * - * The reason we need to hook tputs() is: - * Since the output is going to curses and not to - * a raw terminal, we need to intercept these special - * sequences, and handle them them here. - * - * This function seems to be correctly handling all sequences - * aimed at hpterm's, but there is additional work to do - * for xterm's and dtterm's. I abandoned further work on this - * in favor of "XDB style". In "XDB style", the command region - * looks like terminal, not a curses window, and this routine - * is not called. - RT - */ -void -tui_tputs (str, affcnt, putfunc) - char *str; - int affcnt; - int (*putfunc) PARAMS ((int)); -{ - extern char *rl_prompt; /* the prompt string */ - - /* This set of globals are defined and initialized - * by the readline package. - * - * Note we're assuming tui_tputs() is being called - * by the readline package. That's because we're recognizing - * that a given string is being passed by - * matching the string address against readline's - * term_<whatever> global. To make this more general, - * we'd have to actually recognize the termcap sequence - * inside the string (more work than I want to do). - RT - * - * We don't see or need to handle every one of these here; - * this is just the full list defined in readline/readline.c - */ - extern char *term_backspace; - extern char *term_clreol; - extern char *term_clrpag; - extern char *term_cr; - extern char *term_dc; - extern char *term_ei; - extern char *term_goto; - extern char *term_ic; - extern char *term_im; - extern char *term_mm; - extern char *term_mo; - extern char *term_up; - extern char *term_scroll_region; - extern char *term_memory_lock; - extern char *term_memory_unlock; - extern char *term_cursor_move; - extern char *visible_bell; - - /* Sanity check - if not TUI, just call tputs() */ - if (!tui_version) - tputs (str, affcnt, putfunc); - - /* The strings we special-case are handled first */ - - if (str == term_backspace) - { - /* Backspace. */ - - /* We see this on an emacs control-B. - * I.e., it's like the left-arrow key (not like the backspace key). - * The effect that readline wants when it transmits this - * character to us is simply to back up one character - * (but not to write a space over the old character). - */ - - _updateCommandInfo (-1); - wmove (cmdWin->generic.handle, - cmdWin->detail.commandInfo.curLine, - cmdWin->detail.commandInfo.curch); - wrefresh (cmdWin->generic.handle); - - } - else if (str == term_clreol) - { - - /* Clear to end of line. */ - wclrtoeol (cmdWin->generic.handle); - wrefresh (cmdWin->generic.handle); - - } - else if (str == term_cr) - { - - /* Carriage return */ - _updateCommandInfo (-cmdWin->detail.commandInfo.curch); - wmove (cmdWin->generic.handle, - cmdWin->detail.commandInfo.curLine, - 0 /* readline will rewrite the prompt from 0 */ ); - wrefresh (cmdWin->generic.handle); - - } - else if (str == term_goto) - { - - /* This is actually a tgoto() specifying a character position, - * followed by either a term_IC/term_DC which [I think] means - * insert/delete one character at that position. - * There are complications with this one - need to either - * extract the position from the string, or have a backdoor - * means of communicating it from ../readline/display.c. - * So this one is not yet implemented. - * Not doing it seems to have no ill effects on command-line-editing - * that I've noticed so far. - RT - */ - - } - else if (str == term_dc) - { - - /* Delete character at current cursor position */ - wdelch (cmdWin->generic.handle); - wrefresh (cmdWin->generic.handle); - - } - else if (str == term_im) - { - - /* Turn on insert mode. */ - insert_mode = 1; - - } - else if (str == term_ei) - { - - /* Turn off insert mode. */ - insert_mode = 0; - - /* Strings we know about but don't handle - * specially here are just passed along to tputs(). - * - * These are not handled because (as far as I can tell) - * they are not actually emitted by the readline package - * in the course of doing command-line editing. Some of them - * theoretically could be used in the future, in which case we'd - * need to handle them. - */ - } - else if (str == term_ic || /* insert character */ - str == term_cursor_move || /* cursor move */ - str == term_clrpag ||/* clear page */ - str == term_mm || /* turn on meta key */ - str == term_mo || /* turn off meta key */ - str == term_up || /* up one line (not expected) */ - str == term_scroll_region || /* set scroll region */ - str == term_memory_lock || /* lock screen above cursor */ - str == term_memory_unlock || /* unlock screen above cursor */ - str == visible_bell) - { /* flash screen */ - tputs (str, affcnt, putfunc); - } - else - { /* something else */ - tputs (str, affcnt, putfunc); - } -} /* tui_tputs */ - - -/* -** tui_vwgetch() -** Wrapper around wgetch with the window in a va_list -*/ -unsigned int -#ifdef __STDC__ -tui_vwgetch (va_list args) -#else -tui_vwgetch (args) - va_list args; -#endif -{ - unsigned int ch; - WINDOW *window; - - window = va_arg (args, WINDOW *); - - return ((unsigned int) wgetch (window)); -} /* tui_vwgetch */ - - -/* -** tui_vread() -** Wrapper around read() with paramets in a va_list -*/ -unsigned int -#ifdef __STDC__ -tui_vread (va_list args) -#else -tui_vread (args) - va_list args; -#endif -{ - int result = 0; - int filedes = va_arg (args, int); - char *buf = va_arg (args, char *); - int nbytes = va_arg (args, int); - - result = read (filedes, buf, nbytes); - - return result; -} /* tui_vread() */ - -/* -** tuiRead() -** Function to perform a read() catching resize events -*/ -int -#ifdef __STDC__ -tuiRead ( - int filedes, - char *buf, - int nbytes) -#else -tuiRead (filedes, buf, nbytes) - int filedes; - char *buf; - int nbytes; -#endif -{ - int result = 0; - - result = (int) vcatch_errors ((OpaqueFuncPtr) tui_vread, filedes, buf, nbytes); - *buf = _tuiHandleResizeDuringIO (*buf); - - return result; -} /* tuiRead */ - - -/* -** tuiGetc(). -** Get a character from the command window. -** This is called from the readline package, -** that is, we have: -** tuiGetc() [here], called from -** readline code [in ../readline/], called from -** command_line_input() in top.c -*/ -unsigned int -#ifdef __STDC__ -tuiGetc (void) -#else -tuiGetc () -#endif -{ - unsigned int ch; - extern char *rl_prompt; - extern char *rl_line_buffer; - extern int rl_point; - - /* Call the curses routine that reads one character */ -#ifndef COMMENT - ch = (unsigned int) vcatch_errors ((OpaqueFuncPtr) tui_vwgetch, - cmdWin->generic.handle); -#else - ch = wgetch (cmdWin->generic.handle); -#endif - ch = _tuiHandleResizeDuringIO (ch); - - if (m_isCommandChar (ch)) - { /* Handle prev/next/up/down here */ - tuiTermSetup (0); - ch = tuiDispatchCtrlChar (ch); - cmdWin->detail.commandInfo.curch = strlen (rl_prompt) + rl_point; - tuiTermUnsetup (0, cmdWin->detail.commandInfo.curch); - } - if (ch == '\n' || ch == '\r' || ch == '\f') - cmdWin->detail.commandInfo.curch = 0; - else - tuiIncrCommandCharCountBy (1); - - return ch; -} /* tuiGetc */ - - -/* -** tuiBufferGetc(). -*/ -/*elz: this function reads a line of input from the user and -puts it in a static buffer. Subsequent calls to this same function -obtain one char at the time, providing the caller with a behavior -similar to fgetc. When the input is buffered, the backspaces have -the needed effect, i.e. ignore the last char active in the buffer*/ -/* so far this function is called only from the query function in -utils.c*/ - -unsigned int -#ifdef __STDC__ -tuiBufferGetc (void) -#else -tuiBufferGetc () -#endif -{ - unsigned int ch; - static unsigned char _ibuffer[512]; - static int index_read = -1; - static int length_of_answer = -1; - int pos = 0; - - if (length_of_answer == -1) - { - /* this is the first time through, need to read the answer*/ - do - { - /* Call the curses routine that reads one character */ - ch = (unsigned int) wgetch (cmdWin->generic.handle); - if (ch != '\b') - { - _ibuffer[pos] = ch; - pos++; - } - else - pos--; - } - while (ch != '\r' && ch != '\n'); - - length_of_answer = pos; - index_read = 0; - } - - ch = _ibuffer[index_read]; - index_read++; - - if (index_read == length_of_answer) - { - /*this is the last time through, reset for next query*/ - index_read = -1; - length_of_answer = -1; - } - - wrefresh (cmdWin->generic.handle); - - return (ch); -} /* tuiBufferGetc */ - - -/* -** tuiStartNewLines(). -*/ -void -#ifdef __STDC__ -tuiStartNewLines ( - int numLines) -#else -tuiStartNewLines (numLines) - int numLines; -#endif -{ - if (numLines > 0) - { - if (cmdWin->generic.viewportHeight > 1 && - cmdWin->detail.commandInfo.curLine < cmdWin->generic.viewportHeight) - cmdWin->detail.commandInfo.curLine += numLines; - else - scroll (cmdWin->generic.handle); - cmdWin->detail.commandInfo.curch = 0; - wmove (cmdWin->generic.handle, - cmdWin->detail.commandInfo.curLine, - cmdWin->detail.commandInfo.curch); - tuiRefreshWin (&cmdWin->generic); - } - - return; -} /* tuiStartNewLines */ - - -/* -** tui_vStartNewLines(). -** With numLines in a va_list -*/ -void -#ifdef __STDC__ -tui_vStartNewLines ( - va_list args) -#else -tui_vStartNewLines (args) - va_list args; -#endif -{ - int numLines = va_arg (args, int); - - tuiStartNewLines (numLines); - - return; -} /* tui_vStartNewLines */ - - -/**************************************************************************** -** LOCAL STATIC FUNCTIONS ** -*****************************************************************************/ - - -/* -** _tuiHandleResizeDuringIO -** This function manages the cleanup when a resize has occured -** From within a call to getch() or read. Returns the character -** to return from getc or read. -*/ -static unsigned int -#ifdef __STDC__ -_tuiHandleResizeDuringIO ( - unsigned int originalCh) /* the char just read */ -#else -_tuiHandleResizeDuringIO (originalCh) - unsigned int originalCh; -#endif -{ - if (tuiWinResized ()) - { - tuiDo ((TuiOpaqueFuncPtr) tuiRefreshAll); - dont_repeat (); - tuiSetWinResizedTo (FALSE); - rl_reset (); - return '\n'; - } - else - return originalCh; -} /* _tuiHandleResizeDuringIO */ - - -/* -** _updateCommandInfo(). -** Function to update the command window information. -*/ -static void -#ifdef __STDC__ -_updateCommandInfo ( - int sizeOfString) -#else -_updateCommandInfo (sizeOfString) - int sizeOfString; -#endif -{ - - if ((sizeOfString + - cmdWin->detail.commandInfo.curch) > cmdWin->generic.width) - { - int newCurch = sizeOfString + cmdWin->detail.commandInfo.curch; - - tuiStartNewLines (1); - cmdWin->detail.commandInfo.curch = newCurch - cmdWin->generic.width; - } - else - cmdWin->detail.commandInfo.curch += sizeOfString; - - return; -} /* _updateCommandInfo */ - - -/* Looked at in main.c, fputs_unfiltered(), to decide - * if it's safe to do standard output to the command window. - */ -int tui_owns_terminal = 0; - -/* Called to set up the terminal for TUI (curses) I/O. - * We do this either on our way "in" to GDB after target - * program execution, or else within tuiDo just before - * going off to TUI routines. - */ - -void -#ifdef __STDC__ -tuiTermSetup ( - int turn_off_echo) -#else -tuiTermSetup (turn_off_echo) - int turn_off_echo; -#endif -{ - char *buffer; - int start; - int end; - int endcol; - extern char *term_scroll_region; - extern char *term_cursor_move; - extern char *term_memory_lock; - extern char *term_memory_unlock; - - /* Turn off echoing, since the TUI does not - * expect echoing. Below I only put in the TERMIOS - * case, since that is what applies on HP-UX. turn_off_echo - * is 1 except for the case where we're being called - * on a "quit", in which case we want to leave echo on. - */ - if (turn_off_echo) - { -#ifdef HAVE_TERMIOS - struct termios tio; - tcgetattr (0, &tio); - tio.c_lflag &= ~(ECHO); - tcsetattr (0, TCSANOW, &tio); -#endif - } - - /* Compute the start and end lines of the command - * region. (Actually we only use end here) - */ - start = winList[CMD_WIN]->generic.origin.y; - end = start + winList[CMD_WIN]->generic.height - 1; - endcol = winList[CMD_WIN]->generic.width - 1; - - if (term_memory_unlock) - { - - /* Un-do the effect of the memory lock in terminal_inferior() */ - tputs (term_memory_unlock, 1, (int (*)PARAMS ((int))) putchar); - fflush (stdout); - - } - else if (term_scroll_region) - { - - /* Un-do the effect of setting scroll region in terminal_inferior() */ - /* I'm actually not sure how to do this (we don't know for - * sure what the scroll region was *before* we changed it), - * but I'll guess that setting it to the whole screen is - * the right thing. So, ... - */ - - /* Set scroll region to be 0..end */ - buffer = (char *) tgoto (term_scroll_region, end, 0); - tputs (buffer, 1, (int (*)PARAMS ((int))) putchar); - - } /* else we're out of luck */ - - /* This is an attempt to keep the logical & physical - * cursor in synch, going into curses. Without this, - * curses seems to be confused by the fact that - * GDB has physically moved the curser on it. One - * visible effect of removing this code is that the - * locator window fails to get updated and the line - * of text that *should* go into the locator window - * often goes to the wrong place. - */ - /* What's done here is to tell curses to write a ' ' - * at the bottom right corner of the screen. - * The idea is to wind up with the cursor in a known - * place. - * Note I'm relying on refresh() - * only writing what changed (the space), - * not the whole screen. - */ - standend (); - move (end, endcol - 1); - addch (' '); - refresh (); - - tui_owns_terminal = 1; -} /* tuiTermSetup */ - - -/* Called to set up the terminal for target program I/O, meaning I/O - * is confined to the command-window area. We also call this on our - * way out of tuiDo, thus setting up the terminal this way for - * debugger command I/O. */ -void -#ifdef __STDC__ -tuiTermUnsetup ( - int turn_on_echo, - int to_column) -#else -tuiTermUnsetup (turn_on_echo, to_column) - int turn_on_echo; - int to_column; -#endif -{ - int start; - int end; - int curline; - char *buffer; - /* The next bunch of things are from readline */ - extern char *term_scroll_region; - extern char *term_cursor_move; - extern char *term_memory_lock; - extern char *term_memory_unlock; - extern char *term_se; - - /* We need to turn on echoing, since the TUI turns it off */ - /* Below I only put in the TERMIOS case, since that - * is what applies on HP-UX. - */ - if (turn_on_echo) - { -#ifdef HAVE_TERMIOS - struct termios tio; - tcgetattr (0, &tio); - tio.c_lflag |= (ECHO); - tcsetattr (0, TCSANOW, &tio); -#endif - } - - /* Compute the start and end lines of the command - * region, as well as the last "real" line of - * the region (normally same as end, except when - * we're first populating the region) - */ - start = winList[CMD_WIN]->generic.origin.y; - end = start + winList[CMD_WIN]->generic.height - 1; - curline = start + winList[CMD_WIN]->detail.commandInfo.curLine; - - /* We want to confine target I/O to the command region. - * In order to do so, we must either have "memory lock" - * (hpterm's) or "scroll regions" (xterm's). - */ - if (term_cursor_move && term_memory_lock) - { - - /* Memory lock means lock region above cursor. - * So first position the cursor, then call memory lock. - */ - buffer = tgoto (term_cursor_move, 0, start); - tputs (buffer, 1, (int (*)PARAMS ((int))) putchar); - tputs (term_memory_lock, 1, (int (*)PARAMS ((int))) putchar); - - } - else if (term_scroll_region) - { - - /* Set the scroll region to the command window */ - buffer = tgoto (term_scroll_region, end, start); - tputs (buffer, 1, (int (*)PARAMS ((int))) putchar); - - } /* else we can't do anything about target I/O */ - - /* Also turn off standout mode, in case it is on */ - if (term_se != NULL) - tputs (term_se, 1, (int (*)PARAMS ((int))) putchar); - - /* Now go to the appropriate spot on the end line */ - buffer = tgoto (term_cursor_move, to_column, end); - tputs (buffer, 1, (int (*)PARAMS ((int))) putchar); - fflush (stdout); - - tui_owns_terminal = 0; -} /* tuiTermUnsetup */ diff --git a/contrib/gdb/gdb/tui/tuiIO.h b/contrib/gdb/gdb/tui/tuiIO.h deleted file mode 100644 index bcbeffe4edccb..0000000000000 --- a/contrib/gdb/gdb/tui/tuiIO.h +++ /dev/null @@ -1,43 +0,0 @@ -#ifndef _TUI_IO_H -#define _TUI_IO_H -/* -** This header contains defitions to support tuiIO.c -*/ - - -#include <stdio.h> - -extern void tuiPuts_unfiltered PARAMS ((const char *, GDB_FILE *)); -extern unsigned int tuiGetc PARAMS ((void)); -extern unsigned int tuiBufferGetc PARAMS ((void)); -extern int tuiRead PARAMS ((int, char *, int)); -extern void tuiStartNewLines PARAMS ((int)); -extern void tui_vStartNewLines PARAMS ((va_list)); -extern unsigned int tui_vwgetch PARAMS ((va_list)); -extern void tuiTermSetup PARAMS ((int)); -extern void tuiTermUnsetup PARAMS ((int, int)); - - - -#define m_tuiStartNewLine tuiStartNewLines(1) -#define m_isStartSequence(ch) (ch == 27) -#define m_isEndSequence(ch) (ch == 126) -#define m_isBackspace(ch) (ch == 8) -#define m_isDeleteChar(ch) (ch == KEY_DC) -#define m_isDeleteLine(ch) (ch == KEY_DL) -#define m_isDeleteToEol(ch) (ch == KEY_EOL) -#define m_isNextPage(ch) (ch == KEY_NPAGE) -#define m_isPrevPage(ch) (ch == KEY_PPAGE) -#define m_isLeftArrow(ch) (ch == KEY_LEFT) -#define m_isRightArrow(ch) (ch == KEY_RIGHT) - -#define m_isCommandChar(ch) (m_isNextPage(ch) || m_isPrevPage(ch) || \ - m_isLeftArrow(ch) || m_isRightArrow(ch) || \ - (ch == KEY_UP) || (ch == KEY_DOWN) || \ - (ch == KEY_SF) || (ch == KEY_SR) || \ - (ch == (int)'\f') || m_isStartSequence(ch)) - -#define m_isXdbStyleCommandChar(ch) (m_isNextPage(ch) || m_isPrevPage(ch)) - - -#endif /*_TUI_IO_H*/ diff --git a/contrib/gdb/gdb/tui/tuiLayout.c b/contrib/gdb/gdb/tui/tuiLayout.c deleted file mode 100644 index 6aa380cfe41ce..0000000000000 --- a/contrib/gdb/gdb/tui/tuiLayout.c +++ /dev/null @@ -1,1410 +0,0 @@ -/* -** tuiLayout.c -** This module contains procedures for handling the layout of the windows. -*/ - - -#include "defs.h" -#include "command.h" -#include "symtab.h" -#include "frame.h" - -#include "tui.h" -#include "tuiData.h" -#include "tuiGeneralWin.h" -#include "tuiStack.h" -#include "tuiRegs.h" -#include "tuiDisassem.h" - -/******************************* -** Static Local Decls -********************************/ - -static void _initGenWinInfo PARAMS - ((TuiGenWinInfoPtr, TuiWinType, int, int, int, int)); -static void _initAndMakeWin PARAMS - ((Opaque *, TuiWinType, int, int, int, int, int)); -static void _showSourceOrDisassemAndCommand PARAMS - ((TuiLayoutType)); -static void _makeSourceOrDisassemWindow PARAMS - ((TuiWinInfoPtr *, TuiWinType, int, int)); -static void _makeCommandWindow PARAMS ((TuiWinInfoPtr *, int, int)); -static void _makeSourceWindow PARAMS ((TuiWinInfoPtr *, int, int)); -static void _makeDisassemWindow PARAMS - ((TuiWinInfoPtr *, int, int)); -static void _makeDataWindow PARAMS ((TuiWinInfoPtr *, int, int)); -static void _showSourceCommand PARAMS ((void)); -static void _showDisassemCommand PARAMS ((void)); -static void _showSourceDisassemCommand PARAMS ((void)); -static void _showData PARAMS ((TuiLayoutType)); -static TuiLayoutType _nextLayout PARAMS ((void)); -static TuiLayoutType _prevLayout PARAMS ((void)); -static void _tuiLayout_command PARAMS ((char *, int)); -static void _tuiToggleLayout_command PARAMS ((char *, int)); -static void _tui_vToggleLayout_command PARAMS ((va_list)); -static void _tuiToggleSplitLayout_command PARAMS ((char *, int)); -static void _tui_vToggleSplitLayout_command PARAMS ((va_list)); -static Opaque _extractDisplayStartAddr PARAMS ((void)); -static void _tuiHandleXDBLayout PARAMS ((TuiLayoutDefPtr)); -static TuiStatus _tuiSetLayoutTo PARAMS ((char *)); - - -/*************************************** -** DEFINITIONS -***************************************/ - -#define LAYOUT_USAGE "Usage: layout prev | next | <layout_name> \n" - -/*************************************** -** Static Local Data -***************************************/ -static TuiLayoutType lastLayout = UNDEFINED_LAYOUT; - -/*************************************** -** PUBLIC FUNCTIONS -***************************************/ - -/* -** showLayout(). -** Show the screen layout defined -*/ -void -#ifdef __STDC__ -showLayout ( - TuiLayoutType layout) -#else -showLayout (layout) - TuiLayoutType layout; -#endif -{ - TuiLayoutType curLayout = currentLayout (); - - if (layout != curLayout) - { - /* - ** Since the new layout may cause changes in window size, we - ** should free the content and reallocate on next display of - ** source/asm - */ - tuiClearAllSourceWinsContent (NO_EMPTY_SOURCE_PROMPT); - freeAllSourceWinsContent (); - clearSourceWindows (); - if (layout == SRC_DATA_COMMAND || layout == DISASSEM_DATA_COMMAND) - { - _showData (layout); - refreshAll (winList); - } - else - { - /* First make the current layout be invisible */ - m_allBeInvisible (); - m_beInvisible (locatorWinInfoPtr ()); - - switch (layout) - { - /* Now show the new layout */ - case SRC_COMMAND: - _showSourceCommand (); - addToSourceWindows (srcWin); - break; - case DISASSEM_COMMAND: - _showDisassemCommand (); - addToSourceWindows (disassemWin); - break; - case SRC_DISASSEM_COMMAND: - _showSourceDisassemCommand (); - addToSourceWindows (srcWin); - addToSourceWindows (disassemWin); - break; - default: - break; - } - } - } - - return; -} /* showLayout */ - - -/* -** tuiSetLayout() -** Function to set the layout to SRC_COMMAND, DISASSEM_COMMAND, -** SRC_DISASSEM_COMMAND, SRC_DATA_COMMAND, or DISASSEM_DATA_COMMAND. -** If the layout is SRC_DATA_COMMAND, DISASSEM_DATA_COMMAND, or -** UNDEFINED_LAYOUT, then the data window is populated according -** to regsDisplayType. -*/ -TuiStatus -#ifdef __STDC__ -tuiSetLayout ( - TuiLayoutType layoutType, - TuiRegisterDisplayType regsDisplayType) -#else -tuiSetLayout (layoutType, regsDisplayType) - TuiLayoutType layoutType; - TuiRegisterDisplayType regsDisplayType; -#endif -{ - TuiStatus status = TUI_SUCCESS; - - if (layoutType != UNDEFINED_LAYOUT || regsDisplayType != TUI_UNDEFINED_REGS) - { - TuiLayoutType curLayout = currentLayout (), newLayout = UNDEFINED_LAYOUT; - int regsPopulate = FALSE; - Opaque addr = _extractDisplayStartAddr (); - TuiWinInfoPtr newWinWithFocus = (TuiWinInfoPtr) NULL, winWithFocus = tuiWinWithFocus (); - TuiLayoutDefPtr layoutDef = tuiLayoutDef (); - - - if (layoutType == UNDEFINED_LAYOUT && - regsDisplayType != TUI_UNDEFINED_REGS) - { - if (curLayout == SRC_DISASSEM_COMMAND) - newLayout = DISASSEM_DATA_COMMAND; - else if (curLayout == SRC_COMMAND || curLayout == SRC_DATA_COMMAND) - newLayout = SRC_DATA_COMMAND; - else if (curLayout == DISASSEM_COMMAND || - curLayout == DISASSEM_DATA_COMMAND) - newLayout = DISASSEM_DATA_COMMAND; - } - else - newLayout = layoutType; - - regsPopulate = (newLayout == SRC_DATA_COMMAND || - newLayout == DISASSEM_DATA_COMMAND || - regsDisplayType != TUI_UNDEFINED_REGS); - if (newLayout != curLayout || regsDisplayType != TUI_UNDEFINED_REGS) - { - if (newLayout != curLayout) - { - if (winWithFocus != cmdWin) - tuiClearWinFocus (); - showLayout (newLayout); - /* - ** Now determine where focus should be - */ - if (winWithFocus != cmdWin) - { - switch (newLayout) - { - case SRC_COMMAND: - tuiSetWinFocusTo (srcWin); - layoutDef->displayMode = SRC_WIN; - layoutDef->split = FALSE; - break; - case DISASSEM_COMMAND: - /* the previous layout was not showing - ** code. this can happen if there is no - ** source available: - ** 1. if the source file is in another dir OR - ** 2. if target was compiled without -g - ** We still want to show the assembly though! - */ - addr = vcatch_errors ((OpaqueFuncPtr) - tuiGetBeginAsmAddress); - tuiSetWinFocusTo (disassemWin); - layoutDef->displayMode = DISASSEM_WIN; - layoutDef->split = FALSE; - break; - case SRC_DISASSEM_COMMAND: - /* the previous layout was not showing - ** code. this can happen if there is no - ** source available: - ** 1. if the source file is in another dir OR - ** 2. if target was compiled without -g - ** We still want to show the assembly though! - */ - addr = vcatch_errors ((OpaqueFuncPtr) - tuiGetBeginAsmAddress); - if (winWithFocus == srcWin) - tuiSetWinFocusTo (srcWin); - else - tuiSetWinFocusTo (disassemWin); - layoutDef->split = TRUE; - break; - case SRC_DATA_COMMAND: - if (winWithFocus != dataWin) - tuiSetWinFocusTo (srcWin); - else - tuiSetWinFocusTo (dataWin); - layoutDef->displayMode = SRC_WIN; - layoutDef->split = FALSE; - break; - case DISASSEM_DATA_COMMAND: - /* the previous layout was not showing - ** code. this can happen if there is no - ** source available: - ** 1. if the source file is in another dir OR - ** 2. if target was compiled without -g - ** We still want to show the assembly though! - */ - addr = vcatch_errors ((OpaqueFuncPtr) - tuiGetBeginAsmAddress); - if (winWithFocus != dataWin) - tuiSetWinFocusTo (disassemWin); - else - tuiSetWinFocusTo (dataWin); - layoutDef->displayMode = DISASSEM_WIN; - layoutDef->split = FALSE; - break; - default: - break; - } - } - if (newWinWithFocus != (TuiWinInfoPtr) NULL) - tuiSetWinFocusTo (newWinWithFocus); - /* - ** Now update the window content - */ - if (!regsPopulate && - (newLayout == SRC_DATA_COMMAND || - newLayout == DISASSEM_DATA_COMMAND)) - tuiDisplayAllData (); - - tuiUpdateSourceWindowsWithAddr (addr); - } - if (regsPopulate) - { - layoutDef->regsDisplayType = - (regsDisplayType == TUI_UNDEFINED_REGS ? - TUI_GENERAL_REGS : regsDisplayType); - tuiShowRegisters (layoutDef->regsDisplayType); - } - } - } - else - status = TUI_FAILURE; - - return status; -} /* tuiSetLayout */ - - -/* -** tui_vSetLayoutTo() -** Function to set the layout to SRC, ASM, SPLIT, NEXT, PREV, DATA, -** REGS, $REGS, $GREGS, $FREGS, $SREGS with arguments in a va_list -*/ -TuiStatus -#ifdef __STDC__ -tui_vSetLayoutTo ( - va_list args) -#else -tui_vSetLayoutTo (args) - va_list args; -#endif -{ - char *layoutName; - - layoutName = va_arg (args, char *); - - return (_tuiSetLayoutTo (layoutName)); -} /* tui_vSetLayoutTo */ - - -/* -** tuiAddWinToLayout(). -** Add the specified window to the layout in a logical way. -** This means setting up the most logical layout given the -** window to be added. -*/ -void -#ifdef __STDC__ -tuiAddWinToLayout ( - TuiWinType type) -#else -tuiAddWinToLayout (type) - TuiWinType type; -#endif -{ - TuiLayoutType curLayout = currentLayout (); - - switch (type) - { - case SRC_WIN: - if (curLayout != SRC_COMMAND && - curLayout != SRC_DISASSEM_COMMAND && - curLayout != SRC_DATA_COMMAND) - { - clearSourceWindowsDetail (); - if (curLayout == DISASSEM_DATA_COMMAND) - showLayout (SRC_DATA_COMMAND); - else - showLayout (SRC_COMMAND); - } - break; - case DISASSEM_WIN: - if (curLayout != DISASSEM_COMMAND && - curLayout != SRC_DISASSEM_COMMAND && - curLayout != DISASSEM_DATA_COMMAND) - { - clearSourceWindowsDetail (); - if (curLayout == SRC_DATA_COMMAND) - showLayout (DISASSEM_DATA_COMMAND); - else - showLayout (DISASSEM_COMMAND); - } - break; - case DATA_WIN: - if (curLayout != SRC_DATA_COMMAND && - curLayout != DISASSEM_DATA_COMMAND) - { - if (curLayout == DISASSEM_COMMAND) - showLayout (DISASSEM_DATA_COMMAND); - else - showLayout (SRC_DATA_COMMAND); - } - break; - default: - break; - } - - return; -} /* tuiAddWinToLayout */ - - -/* -** tui_vAddWinToLayout(). -** Add the specified window to the layout in a logical way, -** with arguments in a va_list. -*/ -void -#ifdef __STDC__ -tui_vAddWinToLayout ( - va_list args) -#else -tui_vAddWinToLayout (args) - va_list args; -#endif -{ - TuiWinType type = va_arg (args, TuiWinType); - - tuiAddWinToLayout (type); - - return; -} /* tui_vAddWinToLayout */ - - -/* -** tuiDefaultWinHeight(). -** Answer the height of a window. If it hasn't been created yet, -** answer what the height of a window would be based upon its -** type and the layout. -*/ -int -#ifdef __STDC__ -tuiDefaultWinHeight ( - TuiWinType type, - TuiLayoutType layout) -#else -tuiDefaultWinHeight (type, layout) - TuiWinType type; - TuiLayoutType layout; -#endif -{ - int h; - - if (winList[type] != (TuiWinInfoPtr) NULL) - h = winList[type]->generic.height; - else - { - switch (layout) - { - case SRC_COMMAND: - case DISASSEM_COMMAND: - if (m_winPtrIsNull (cmdWin)) - h = termHeight () / 2; - else - h = termHeight () - cmdWin->generic.height; - break; - case SRC_DISASSEM_COMMAND: - case SRC_DATA_COMMAND: - case DISASSEM_DATA_COMMAND: - if (m_winPtrIsNull (cmdWin)) - h = termHeight () / 3; - else - h = (termHeight () - cmdWin->generic.height) / 2; - break; - default: - h = 0; - break; - } - } - - return h; -} /* tuiDefaultWinHeight */ - - -/* -** tuiDefaultWinViewportHeight(). -** Answer the height of a window. If it hasn't been created yet, -** answer what the height of a window would be based upon its -** type and the layout. -*/ -int -#ifdef __STDC__ -tuiDefaultWinViewportHeight ( - TuiWinType type, - TuiLayoutType layout) -#else -tuiDefaultWinViewportHeight (type, layout) - TuiWinType type; - TuiLayoutType layout; -#endif -{ - int h; - - h = tuiDefaultWinHeight (type, layout); - - if (winList[type] == cmdWin) - h -= 1; - else - h -= 2; - - return h; -} /* tuiDefaultWinViewportHeight */ - - -/* -** _initialize_tuiLayout(). -** Function to initialize gdb commands, for tui window layout -** manipulation. -*/ -void -_initialize_tuiLayout () -{ - if (tui_version) - { - add_com ("layout", class_tui, _tuiLayout_command, - "Change the layout of windows.\n\ -Usage: layout prev | next | <layout_name> \n\ -Layout names are:\n\ - src : Displays source and command windows.\n\ - asm : Displays disassembly and command windows.\n\ - split : Displays source, disassembly and command windows.\n\ - regs : Displays register window. If existing layout\n\ - is source/command or assembly/command, the \n\ - register window is displayed. If the\n\ - source/assembly/command (split) is displayed, \n\ - the register window is displayed with \n\ - the window that has current logical focus.\n"); - if (xdb_commands) - { - add_com ("td", class_tui, _tuiToggleLayout_command, - "Toggle between Source/Command and Disassembly/Command layouts.\n"); - add_com ("ts", class_tui, _tuiToggleSplitLayout_command, - "Toggle between Source/Command or Disassembly/Command and \n\ -Source/Disassembly/Command layouts.\n"); - } - } - - return; -} /* _intialize_tuiLayout */ - - -/************************* -** STATIC LOCAL FUNCTIONS -**************************/ - - -/* -** _tuiSetLayoutTo() -** Function to set the layout to SRC, ASM, SPLIT, NEXT, PREV, DATA, REGS, -** $REGS, $GREGS, $FREGS, $SREGS. -*/ -static TuiStatus -#ifdef __STDC__ -_tuiSetLayoutTo ( - char *layoutName) -#else -_tuiSetLayoutTo (layoutName) - char *layoutName; -#endif -{ - TuiStatus status = TUI_SUCCESS; - - if (layoutName != (char *) NULL) - { - register int i; - register char *bufPtr; - TuiLayoutType newLayout = UNDEFINED_LAYOUT; - TuiRegisterDisplayType dpyType = TUI_UNDEFINED_REGS; - TuiLayoutType curLayout = currentLayout (); - - bufPtr = (char *) tuiStrDup (layoutName); - for (i = 0; (i < strlen (layoutName)); i++) - bufPtr[i] = toupper (bufPtr[i]); - - /* First check for ambiguous input */ - if (strlen (bufPtr) <= 1 && (*bufPtr == 'S' || *bufPtr == '$')) - { - warning ("Ambiguous command input.\n"); - status = TUI_FAILURE; - } - else - { - if (subsetCompare (bufPtr, "SRC")) - newLayout = SRC_COMMAND; - else if (subsetCompare (bufPtr, "ASM")) - newLayout = DISASSEM_COMMAND; - else if (subsetCompare (bufPtr, "SPLIT")) - newLayout = SRC_DISASSEM_COMMAND; - else if (subsetCompare (bufPtr, "REGS") || - subsetCompare (bufPtr, TUI_GENERAL_SPECIAL_REGS_NAME) || - subsetCompare (bufPtr, TUI_GENERAL_REGS_NAME) || - subsetCompare (bufPtr, TUI_FLOAT_REGS_NAME) || - subsetCompare (bufPtr, TUI_SPECIAL_REGS_NAME)) - { - if (curLayout == SRC_COMMAND || curLayout == SRC_DATA_COMMAND) - newLayout = SRC_DATA_COMMAND; - else - newLayout = DISASSEM_DATA_COMMAND; - -/* could ifdef out the following code. when compile with -z, there are null - pointer references that cause a core dump if 'layout regs' is the first - layout command issued by the user. HP has asked us to hook up this code - - edie epstein - */ - if (subsetCompare (bufPtr, TUI_FLOAT_REGS_NAME)) - { - if (dataWin->detail.dataDisplayInfo.regsDisplayType != - TUI_SFLOAT_REGS && - dataWin->detail.dataDisplayInfo.regsDisplayType != - TUI_DFLOAT_REGS) - dpyType = TUI_SFLOAT_REGS; - else - dpyType = - dataWin->detail.dataDisplayInfo.regsDisplayType; - } - else if (subsetCompare (bufPtr, - TUI_GENERAL_SPECIAL_REGS_NAME)) - dpyType = TUI_GENERAL_AND_SPECIAL_REGS; - else if (subsetCompare (bufPtr, TUI_GENERAL_REGS_NAME)) - dpyType = TUI_GENERAL_REGS; - else if (subsetCompare (bufPtr, TUI_SPECIAL_REGS_NAME)) - dpyType = TUI_SPECIAL_REGS; - else - { - if (dataWin->detail.dataDisplayInfo.regsDisplayType != - TUI_UNDEFINED_REGS) - dpyType = - dataWin->detail.dataDisplayInfo.regsDisplayType; - else - dpyType = TUI_GENERAL_REGS; - } - -/* end of potential ifdef - */ - -/* if ifdefed out code above, then assume that the user wishes to display the - general purpose registers - */ - -/* dpyType = TUI_GENERAL_REGS; - */ - } - else if (subsetCompare (bufPtr, "NEXT")) - newLayout = _nextLayout (); - else if (subsetCompare (bufPtr, "PREV")) - newLayout = _prevLayout (); - else - status = TUI_FAILURE; - free (bufPtr); - - tuiSetLayout (newLayout, dpyType); - } - } - else - status = TUI_FAILURE; - - return status; -} /* _tuiSetLayoutTo */ - - -static Opaque -#ifdef __STDC__ -_extractDisplayStartAddr (void) -#else -_extractDisplayStartAddr () -#endif -{ - TuiLayoutType curLayout = currentLayout (); - Opaque addr; - - switch (curLayout) - { - case SRC_COMMAND: - case SRC_DATA_COMMAND: - addr = (Opaque) find_line_pc ( - current_source_symtab, - srcWin->detail.sourceInfo.startLineOrAddr.lineNo); - break; - case DISASSEM_COMMAND: - case SRC_DISASSEM_COMMAND: - case DISASSEM_DATA_COMMAND: - addr = disassemWin->detail.sourceInfo.startLineOrAddr.addr; - break; - default: - addr = (Opaque) NULL; - break; - } - - return addr; -} /* _extractDisplayStartAddr */ - - -static void -#ifdef __STDC__ -_tuiHandleXDBLayout ( - TuiLayoutDefPtr layoutDef) -#else -_tuiHandleXDBLayout (layoutDef) - TuiLayoutDefPtr layoutDef; -#endif -{ - if (layoutDef->split) - { - tuiSetLayout (SRC_DISASSEM_COMMAND, TUI_UNDEFINED_REGS); - tuiSetWinFocusTo (winList[layoutDef->displayMode]); - } - else - { - if (layoutDef->displayMode == SRC_WIN) - tuiSetLayout (SRC_COMMAND, TUI_UNDEFINED_REGS); - else - tuiSetLayout (DISASSEM_DATA_COMMAND, layoutDef->regsDisplayType); - } - - - return; -} /* _tuiHandleXDBLayout */ - - -static void -#ifdef __STDC__ -_tuiToggleLayout_command ( - char *arg, - int fromTTY) -#else -_tuiToggleLayout_command (arg, fromTTY) - char *arg; - int fromTTY; -#endif -{ - tuiDo ((TuiOpaqueFuncPtr) _tui_vToggleLayout_command, arg, fromTTY); -} - -static void -#ifdef __STDC__ -_tui_vToggleLayout_command ( - va_list args) -#else -_tui_vToggleLayout_command (args) - va_list args; -#endif -{ - TuiLayoutDefPtr layoutDef = tuiLayoutDef (); - - if (layoutDef->displayMode == SRC_WIN) - layoutDef->displayMode = DISASSEM_WIN; - else - layoutDef->displayMode = SRC_WIN; - - if (!layoutDef->split) - _tuiHandleXDBLayout (layoutDef); - - return; -} /* _tuiToggleLayout_command */ - - -static void -#ifdef __STDC__ -_tuiToggleSplitLayout_command ( - char *arg, - int fromTTY) -#else -_tuiToggleSplitLayout_command (arg, fromTTY) - char *arg; - int fromTTY; -#endif -{ - tuiDo ((TuiOpaqueFuncPtr) _tui_vToggleSplitLayout_command, arg, fromTTY); -} - -static void -#ifdef __STDC__ -_tui_vToggleSplitLayout_command ( - va_list args) -#else -_tui_vToggleSplitLayout_command (args) - va_list args; -#endif -{ - TuiLayoutDefPtr layoutDef = tuiLayoutDef (); - - layoutDef->split = (!layoutDef->split); - _tuiHandleXDBLayout (layoutDef); - - return; -} /* _tui_vToggleSplitLayout_command */ - - -static void -#ifdef __STDC__ -_tuiLayout_command ( - char *arg, - int fromTTY) -#else -_tuiLayout_command (arg, fromTTY) - char *arg; - int fromTTY; -#endif -{ - if ((TuiStatus) tuiDo ( - (TuiOpaqueFuncPtr) tui_vSetLayoutTo, arg) != TUI_SUCCESS) - warning ("Invalid layout specified.\n%s" LAYOUT_USAGE); - - return; -} /* _tuiLayout_command */ - -/* -** _nextLayout(). -** Answer the previous layout to cycle to. -*/ -static TuiLayoutType -#ifdef __STDC__ -_nextLayout (void) -#else -_nextLayout () -#endif -{ - TuiLayoutType newLayout; - - newLayout = currentLayout (); - if (newLayout == UNDEFINED_LAYOUT) - newLayout = SRC_COMMAND; - else - { - newLayout++; - if (newLayout == UNDEFINED_LAYOUT) - newLayout = SRC_COMMAND; - } - - return newLayout; -} /* _nextLayout */ - - -/* -** _prevLayout(). -** Answer the next layout to cycle to. -*/ -static TuiLayoutType -#ifdef __STDC__ -_prevLayout (void) -#else -_prevLayout () -#endif -{ - TuiLayoutType newLayout; - - newLayout = currentLayout (); - if (newLayout == SRC_COMMAND) - newLayout = DISASSEM_DATA_COMMAND; - else - { - newLayout--; - if (newLayout == UNDEFINED_LAYOUT) - newLayout = DISASSEM_DATA_COMMAND; - } - - return newLayout; -} /* _prevLayout */ - - - -/* -** _makeCommandWindow(). -*/ -static void -#ifdef __STDC__ -_makeCommandWindow ( - TuiWinInfoPtr * winInfoPtr, - int height, - int originY) -#else -_makeCommandWindow (winInfoPtr, height, originY) - TuiWinInfoPtr *winInfoPtr; - int height; - int originY; -#endif -{ - _initAndMakeWin ((Opaque *) winInfoPtr, - CMD_WIN, - height, - termWidth (), - 0, - originY, - DONT_BOX_WINDOW); - - (*winInfoPtr)->canHighlight = FALSE; - - return; -} /* _makeCommandWindow */ - - -/* -** _makeSourceWindow(). -*/ -static void -#ifdef __STDC__ -_makeSourceWindow ( - TuiWinInfoPtr * winInfoPtr, - int height, - int originY) -#else -_makeSourceWindow (winInfoPtr, height, originY) - TuiWinInfoPtr *winInfoPtr; - int height; - int originY; -#endif -{ - _makeSourceOrDisassemWindow (winInfoPtr, SRC_WIN, height, originY); - - return; -} /* _makeSourceWindow */ - - -/* -** _makeDisassemWindow(). -*/ -static void -#ifdef __STDC__ -_makeDisassemWindow ( - TuiWinInfoPtr * winInfoPtr, - int height, - int originY) -#else -_makeDisassemWindow (winInfoPtr, height, originY) - TuiWinInfoPtr *winInfoPtr; - int height; - int originY; -#endif -{ - _makeSourceOrDisassemWindow (winInfoPtr, DISASSEM_WIN, height, originY); - - return; -} /* _makeDisassemWindow */ - - -/* -** _makeDataWindow(). -*/ -static void -#ifdef __STDC__ -_makeDataWindow ( - TuiWinInfoPtr * winInfoPtr, - int height, - int originY) -#else -_makeDataWindow (winInfoPtr, height, originY) - TuiWinInfoPtr *winInfoPtr; - int height; - int originY; -#endif -{ - _initAndMakeWin ((Opaque *) winInfoPtr, - DATA_WIN, - height, - termWidth (), - 0, - originY, - BOX_WINDOW); - - return; -} /* _makeDataWindow */ - - - -/* -** _showSourceCommand(). -** Show the Source/Command layout -*/ -static void -#ifdef __STDC__ -_showSourceCommand (void) -#else -_showSourceCommand () -#endif -{ - _showSourceOrDisassemAndCommand (SRC_COMMAND); - - return; -} /* _showSourceCommand */ - - -/* -** _showDisassemCommand(). -** Show the Dissassem/Command layout -*/ -static void -#ifdef __STDC__ -_showDisassemCommand (void) -#else -_showDisassemCommand () -#endif -{ - _showSourceOrDisassemAndCommand (DISASSEM_COMMAND); - - return; -} /* _showDisassemCommand */ - - -/* -** _showSourceDisassemCommand(). -** Show the Source/Disassem/Command layout -*/ -static void -#ifdef __STDC__ -_showSourceDisassemCommand (void) -#else -_showSourceDisassemCommand () -#endif -{ - TuiGenWinInfoPtr locator = locatorWinInfoPtr (); - - if (currentLayout () != SRC_DISASSEM_COMMAND) - { - int cmdHeight, srcHeight, asmHeight; - - if (m_winPtrNotNull (cmdWin)) - cmdHeight = cmdWin->generic.height; - else - cmdHeight = termHeight () / 3; - - srcHeight = (termHeight () - cmdHeight) / 2; - asmHeight = termHeight () - (srcHeight + cmdHeight); - - if (m_winPtrIsNull (srcWin)) - _makeSourceWindow (&srcWin, srcHeight, 0); - else - { - _initGenWinInfo (&srcWin->generic, - srcWin->generic.type, - srcHeight, - srcWin->generic.width, - srcWin->detail.sourceInfo.executionInfo->width, - 0); - srcWin->canHighlight = TRUE; - _initGenWinInfo (srcWin->detail.sourceInfo.executionInfo, - EXEC_INFO_WIN, - srcHeight, - 3, - 0, - 0); - m_beVisible (srcWin); - m_beVisible (srcWin->detail.sourceInfo.executionInfo); - srcWin->detail.sourceInfo.hasLocator = FALSE;; - } - if (m_winPtrNotNull (srcWin)) - { - TuiGenWinInfoPtr locator = locatorWinInfoPtr (); - - tuiShowSourceContent (srcWin); - if (m_winPtrIsNull (disassemWin)) - { - _makeDisassemWindow (&disassemWin, asmHeight, srcHeight - 1); - _initAndMakeWin ((Opaque *) & locator, - LOCATOR_WIN, - 2 /* 1 */ , - termWidth (), - 0, - (srcHeight + asmHeight) - 1, - DONT_BOX_WINDOW); - } - else - { - _initGenWinInfo (locator, - LOCATOR_WIN, - 2 /* 1 */ , - termWidth (), - 0, - (srcHeight + asmHeight) - 1); - disassemWin->detail.sourceInfo.hasLocator = TRUE; - _initGenWinInfo ( - &disassemWin->generic, - disassemWin->generic.type, - asmHeight, - disassemWin->generic.width, - disassemWin->detail.sourceInfo.executionInfo->width, - srcHeight - 1); - _initGenWinInfo (disassemWin->detail.sourceInfo.executionInfo, - EXEC_INFO_WIN, - asmHeight, - 3, - 0, - srcHeight - 1); - disassemWin->canHighlight = TRUE; - m_beVisible (disassemWin); - m_beVisible (disassemWin->detail.sourceInfo.executionInfo); - } - if (m_winPtrNotNull (disassemWin)) - { - srcWin->detail.sourceInfo.hasLocator = FALSE; - disassemWin->detail.sourceInfo.hasLocator = TRUE; - m_beVisible (locator); - tuiShowLocatorContent (); - tuiShowSourceContent (disassemWin); - - if (m_winPtrIsNull (cmdWin)) - _makeCommandWindow (&cmdWin, - cmdHeight, - termHeight () - cmdHeight); - else - { - _initGenWinInfo (&cmdWin->generic, - cmdWin->generic.type, - cmdWin->generic.height, - cmdWin->generic.width, - 0, - cmdWin->generic.origin.y); - cmdWin->canHighlight = FALSE; - m_beVisible (cmdWin); - } - if (m_winPtrNotNull (cmdWin)) - tuiRefreshWin (&cmdWin->generic); - } - } - setCurrentLayoutTo (SRC_DISASSEM_COMMAND); - } - - return; -} /* _showSourceDisassemCommand */ - - -/* -** _showData(). -** Show the Source/Data/Command or the Dissassembly/Data/Command layout -*/ -static void -#ifdef __STDC__ -_showData ( - TuiLayoutType newLayout) -#else -_showData (newLayout) - TuiLayoutType newLayout; -#endif -{ - int totalHeight = (termHeight () - cmdWin->generic.height); - int srcHeight, dataHeight; - TuiWinType winType; - TuiGenWinInfoPtr locator = locatorWinInfoPtr (); - - - dataHeight = totalHeight / 2; - srcHeight = totalHeight - dataHeight; - m_allBeInvisible (); - m_beInvisible (locator); - _makeDataWindow (&dataWin, dataHeight, 0); - dataWin->canHighlight = TRUE; - if (newLayout == SRC_DATA_COMMAND) - winType = SRC_WIN; - else - winType = DISASSEM_WIN; - if (m_winPtrIsNull (winList[winType])) - { - if (winType == SRC_WIN) - _makeSourceWindow (&winList[winType], srcHeight, dataHeight - 1); - else - _makeDisassemWindow (&winList[winType], srcHeight, dataHeight - 1); - _initAndMakeWin ((Opaque *) & locator, - LOCATOR_WIN, - 2 /* 1 */ , - termWidth (), - 0, - totalHeight - 1, - DONT_BOX_WINDOW); - } - else - { - _initGenWinInfo (&winList[winType]->generic, - winList[winType]->generic.type, - srcHeight, - winList[winType]->generic.width, - winList[winType]->detail.sourceInfo.executionInfo->width, - dataHeight - 1); - _initGenWinInfo (winList[winType]->detail.sourceInfo.executionInfo, - EXEC_INFO_WIN, - srcHeight, - 3, - 0, - dataHeight - 1); - m_beVisible (winList[winType]); - m_beVisible (winList[winType]->detail.sourceInfo.executionInfo); - _initGenWinInfo (locator, - LOCATOR_WIN, - 2 /* 1 */ , - termWidth (), - 0, - totalHeight - 1); - } - winList[winType]->detail.sourceInfo.hasLocator = TRUE; - m_beVisible (locator); - tuiShowLocatorContent (); - addToSourceWindows (winList[winType]); - setCurrentLayoutTo (newLayout); - - return; -} /* _showData */ - -/* -** _initGenWinInfo(). -*/ -static void -#ifdef __STDC__ -_initGenWinInfo ( - TuiGenWinInfoPtr winInfo, - TuiWinType type, - int height, - int width, - int originX, - int originY) -#else -_initGenWinInfo (winInfo, type, height, width, originX, originY) - TuiGenWinInfoPtr winInfo; - TuiWinType type; - int height; - int width; - int originX; - int originY; -#endif -{ - int h = height; - - winInfo->type = type; - winInfo->width = width; - winInfo->height = h; - if (h > 1) - { - winInfo->viewportHeight = h - 1; - if (winInfo->type != CMD_WIN) - winInfo->viewportHeight--; - } - else - winInfo->viewportHeight = 1; - winInfo->origin.x = originX; - winInfo->origin.y = originY; - - return; -} /* _initGenWinInfo */ - -/* -** _initAndMakeWin(). -*/ -static void -#ifdef __STDC__ -_initAndMakeWin ( - Opaque * winInfoPtr, - TuiWinType winType, - int height, - int width, - int originX, - int originY, - int boxIt) -#else -_initAndMakeWin (winInfoPtr, winType, height, width, originX, originY, boxIt) - Opaque *winInfoPtr; - TuiWinType winType; - int height; - int width; - int originX; - int originY; - int boxIt; -#endif -{ - Opaque opaqueWinInfo = *winInfoPtr; - TuiGenWinInfoPtr generic; - - if (opaqueWinInfo == (Opaque) NULL) - { - if (m_winIsAuxillary (winType)) - opaqueWinInfo = (Opaque) allocGenericWinInfo (); - else - opaqueWinInfo = (Opaque) allocWinInfo (winType); - } - if (m_winIsAuxillary (winType)) - generic = (TuiGenWinInfoPtr) opaqueWinInfo; - else - generic = &((TuiWinInfoPtr) opaqueWinInfo)->generic; - - if (opaqueWinInfo != (Opaque) NULL) - { - _initGenWinInfo (generic, winType, height, width, originX, originY); - if (!m_winIsAuxillary (winType)) - { - if (generic->type == CMD_WIN) - ((TuiWinInfoPtr) opaqueWinInfo)->canHighlight = FALSE; - else - ((TuiWinInfoPtr) opaqueWinInfo)->canHighlight = TRUE; - } - makeWindow (generic, boxIt); - if (winType == LOCATOR_WIN) - tuiClearLocatorDisplay (); - echo (); - } - *winInfoPtr = opaqueWinInfo; - - return; -} /* _initAndMakeWin */ - - -/* -** _makeSourceOrDisassemWindow(). -*/ -static void -#ifdef __STDC__ -_makeSourceOrDisassemWindow ( - TuiWinInfoPtr * winInfoPtr, - TuiWinType type, - int height, - int originY) -#else -_makeSourceOrDisassemWindow (winInfoPtr, type, height, originY) - TuiWinInfoPtr *winInfoPtr; - TuiWinType type; - int height; - int originY; -#endif -{ - TuiGenWinInfoPtr executionInfo = (TuiGenWinInfoPtr) NULL; - - /* - ** Create the exeuction info window. - */ - if (type == SRC_WIN) - executionInfo = sourceExecInfoWinPtr (); - else - executionInfo = disassemExecInfoWinPtr (); - _initAndMakeWin ((Opaque *) & executionInfo, - EXEC_INFO_WIN, - height, - 3, - 0, - originY, - DONT_BOX_WINDOW); - /* - ** Now create the source window. - */ - _initAndMakeWin ((Opaque *) winInfoPtr, - type, - height, - termWidth () - executionInfo->width, - executionInfo->width, - originY, - BOX_WINDOW); - - (*winInfoPtr)->detail.sourceInfo.executionInfo = executionInfo; - - return; -} /* _makeSourceOrDisassemWindow */ - - -/* -** _showSourceOrDisassemAndCommand(). -** Show the Source/Command or the Disassem layout -*/ -static void -#ifdef __STDC__ -_showSourceOrDisassemAndCommand ( - TuiLayoutType layoutType) -#else -_showSourceOrDisassemAndCommand (layoutType) - TuiLayoutType layoutType; -#endif -{ - if (currentLayout () != layoutType) - { - TuiWinInfoPtr *winInfoPtr; - int areaLeft; - int srcHeight, cmdHeight; - TuiGenWinInfoPtr locator = locatorWinInfoPtr (); - - if (m_winPtrNotNull (cmdWin)) - cmdHeight = cmdWin->generic.height; - else - cmdHeight = termHeight () / 3; - srcHeight = termHeight () - cmdHeight; - - - if (layoutType == SRC_COMMAND) - winInfoPtr = &srcWin; - else - winInfoPtr = &disassemWin; - - if (m_winPtrIsNull (*winInfoPtr)) - { - if (layoutType == SRC_COMMAND) - _makeSourceWindow (winInfoPtr, srcHeight - 1, 0); - else - _makeDisassemWindow (winInfoPtr, srcHeight - 1, 0); - _initAndMakeWin ((Opaque *) & locator, - LOCATOR_WIN, - 2 /* 1 */ , - termWidth (), - 0, - srcHeight - 1, - DONT_BOX_WINDOW); - } - else - { - _initGenWinInfo (locator, - LOCATOR_WIN, - 2 /* 1 */ , - termWidth (), - 0, - srcHeight - 1); - (*winInfoPtr)->detail.sourceInfo.hasLocator = TRUE; - _initGenWinInfo ( - &(*winInfoPtr)->generic, - (*winInfoPtr)->generic.type, - srcHeight - 1, - (*winInfoPtr)->generic.width, - (*winInfoPtr)->detail.sourceInfo.executionInfo->width, - 0); - _initGenWinInfo ((*winInfoPtr)->detail.sourceInfo.executionInfo, - EXEC_INFO_WIN, - srcHeight - 1, - 3, - 0, - 0); - (*winInfoPtr)->canHighlight = TRUE; - m_beVisible (*winInfoPtr); - m_beVisible ((*winInfoPtr)->detail.sourceInfo.executionInfo); - } - if (m_winPtrNotNull (*winInfoPtr)) - { - (*winInfoPtr)->detail.sourceInfo.hasLocator = TRUE; - m_beVisible (locator); - tuiShowLocatorContent (); - tuiShowSourceContent (*winInfoPtr); - - if (m_winPtrIsNull (cmdWin)) - { - _makeCommandWindow (&cmdWin, cmdHeight, srcHeight); - tuiRefreshWin (&cmdWin->generic); - } - else - { - _initGenWinInfo (&cmdWin->generic, - cmdWin->generic.type, - cmdWin->generic.height, - cmdWin->generic.width, - cmdWin->generic.origin.x, - cmdWin->generic.origin.y); - cmdWin->canHighlight = FALSE; - m_beVisible (cmdWin); - } - } - setCurrentLayoutTo (layoutType); - } - - return; -} /* _showSourceOrDisassemAndCommand */ diff --git a/contrib/gdb/gdb/tui/tuiLayout.h b/contrib/gdb/gdb/tui/tuiLayout.h deleted file mode 100644 index 57d8bbc90b6ed..0000000000000 --- a/contrib/gdb/gdb/tui/tuiLayout.h +++ /dev/null @@ -1,15 +0,0 @@ -#ifndef TUI_LAYOUT_H -#define TUI_LAYOUT_H - -extern void showLayout PARAMS ((TuiLayoutType)); -extern void tuiAddWinToLayout PARAMS ((TuiWinType)); -extern void tui_vAddWinToLayout PARAMS ((va_list)); -extern int tuiDefaultWinHeight - PARAMS ((TuiWinType, TuiLayoutType)); -extern int tuiDefaultWinViewportHeight - PARAMS ((TuiWinType, TuiLayoutType)); -extern TuiStatus tuiSetLayout - PARAMS ((TuiLayoutType, TuiRegisterDisplayType)); -extern TuiStatus tui_vSetLayoutTo PARAMS ((va_list)); - -#endif /*TUI_LAYOUT_H*/ diff --git a/contrib/gdb/gdb/tui/tuiRegs.c b/contrib/gdb/gdb/tui/tuiRegs.c deleted file mode 100644 index b78b9bc873cd6..0000000000000 --- a/contrib/gdb/gdb/tui/tuiRegs.c +++ /dev/null @@ -1,1210 +0,0 @@ - -/* -** tuiRegs.c -** This module contains functions to support display of registers -** in the data window. -*/ - - -#include "defs.h" -#include "tui.h" -#include "tuiData.h" -#include "symtab.h" -#include "gdbtypes.h" -#include "gdbcmd.h" -#include "frame.h" -#include "inferior.h" -#include "target.h" -#include "tuiLayout.h" -#include "tuiWin.h" - - -/***************************************** -** LOCAL DEFINITIONS ** -******************************************/ -#define DOUBLE_FLOAT_LABEL_WIDTH 6 -#define DOUBLE_FLOAT_LABEL_FMT "%6.6s: " -#define DOUBLE_FLOAT_VALUE_WIDTH 30 /*min of 16 but may be in sci notation */ - -#define SINGLE_FLOAT_LABEL_WIDTH 6 -#define SINGLE_FLOAT_LABEL_FMT "%6.6s: " -#define SINGLE_FLOAT_VALUE_WIDTH 25 /* min of 8 but may be in sci notation */ - -#define SINGLE_LABEL_WIDTH 10 -#define SINGLE_LABEL_FMT "%10.10s: " -#define SINGLE_VALUE_WIDTH 14/* minimum of 8 but may be in sci notation */ - -/* In the code HP gave Cygnus, this was actually a function call to a - PA-specific function, which was supposed to determine whether the - target was a 64-bit or 32-bit processor. However, the 64-bit - support wasn't complete, so we didn't merge that in, so we leave - this here as a stub. */ -#define IS_64BIT 0 - -/***************************************** -** STATIC DATA ** -******************************************/ - - -/***************************************** -** STATIC LOCAL FUNCTIONS FORWARD DECLS ** -******************************************/ -static TuiStatus _tuiSetRegsContent - PARAMS ((int, int, struct frame_info *, - TuiRegisterDisplayType, int)); -static char *_tuiRegisterName PARAMS ((int)); -static TuiStatus _tuiGetRegisterRawValue - PARAMS ((int, char *, struct frame_info *)); -static void _tuiSetRegisterElement - PARAMS ((int, struct frame_info *, - TuiDataElementPtr, int)); -static void _tuiDisplayRegister - PARAMS ((int, TuiGenWinInfoPtr, enum precision_type)); -static void _tuiRegisterFormat - PARAMS ((char *, int, int, TuiDataElementPtr, - enum precision_type)); -static TuiStatus _tuiSetGeneralRegsContent PARAMS ((int)); -static TuiStatus _tuiSetSpecialRegsContent PARAMS ((int)); -static TuiStatus _tuiSetGeneralAndSpecialRegsContent PARAMS ((int)); -static TuiStatus _tuiSetFloatRegsContent PARAMS ((TuiRegisterDisplayType, int)); -static int _tuiRegValueHasChanged - PARAMS ((TuiDataElementPtr, struct frame_info *, - char *)); -static void _tuiShowFloat_command PARAMS ((char *, int)); -static void _tuiShowGeneral_command PARAMS ((char *, int)); -static void _tuiShowSpecial_command PARAMS ((char *, int)); -static void _tui_vShowRegisters_commandSupport PARAMS ((va_list)); -static void _tuiToggleFloatRegs_command PARAMS ((char *, int)); -static void _tuiScrollRegsForward_command PARAMS ((char *, int)); -static void _tuiScrollRegsBackward_command PARAMS ((char *, int)); -static void _tui_vShowRegisters_commandSupport PARAMS ((va_list)); - - - -/***************************************** -** PUBLIC FUNCTIONS ** -******************************************/ - -/* -** tuiLastRegsLineNo() -** Answer the number of the last line in the regs display. -** If there are no registers (-1) is returned. -*/ -int -#ifdef __STDC__ -tuiLastRegsLineNo (void) -#else -tuiLastRegsLineNo () -#endif -{ - register int numLines = (-1); - - if (dataWin->detail.dataDisplayInfo.regsContentCount > 0) - { - numLines = (dataWin->detail.dataDisplayInfo.regsContentCount / - dataWin->detail.dataDisplayInfo.regsColumnCount); - if (dataWin->detail.dataDisplayInfo.regsContentCount % - dataWin->detail.dataDisplayInfo.regsColumnCount) - numLines++; - } - return numLines; -} /* tuiLastRegsLineNo */ - - -/* -** tuiLineFromRegElementNo() -** Answer the line number that the register element at elementNo is -** on. If elementNo is greater than the number of register elements -** there are, -1 is returned. -*/ -int -#ifdef __STDC__ -tuiLineFromRegElementNo ( - int elementNo) -#else -tuiLineFromRegElementNo (elementNo) - int elementNo; -#endif -{ - if (elementNo < dataWin->detail.dataDisplayInfo.regsContentCount) - { - int i, line = (-1); - - i = 1; - while (line == (-1)) - { - if (elementNo < - (dataWin->detail.dataDisplayInfo.regsColumnCount * i)) - line = i - 1; - else - i++; - } - - return line; - } - else - return (-1); -} /* tuiLineFromRegElementNo */ - - -/* -** tuiFirstRegElementNoInLine() -** Answer the index of the first element in lineNo. If lineNo is -** past the register area (-1) is returned. -*/ -int -#ifdef __STDC__ -tuiFirstRegElementNoInLine ( - int lineNo) -#else -tuiFirstRegElementNoInLine (lineNo) - int lineNo; -#endif -{ - if ((lineNo * dataWin->detail.dataDisplayInfo.regsColumnCount) - <= dataWin->detail.dataDisplayInfo.regsContentCount) - return ((lineNo + 1) * - dataWin->detail.dataDisplayInfo.regsColumnCount) - - dataWin->detail.dataDisplayInfo.regsColumnCount; - else - return (-1); -} /* tuiFirstRegElementNoInLine */ - - -/* -** tuiLastRegElementNoInLine() -** Answer the index of the last element in lineNo. If lineNo is past -** the register area (-1) is returned. -*/ -int -#ifdef __STDC__ -tuiLastRegElementNoInLine ( - int lineNo) -#else -tuiLastRegElementNoInLine (lineNo) - int lineNo; -#endif -{ - if ((lineNo * dataWin->detail.dataDisplayInfo.regsColumnCount) <= - dataWin->detail.dataDisplayInfo.regsContentCount) - return ((lineNo + 1) * - dataWin->detail.dataDisplayInfo.regsColumnCount) - 1; - else - return (-1); -} /* tuiLastRegElementNoInLine */ - - -/* -** tuiCalculateRegsColumnCount -** Calculate the number of columns that should be used to display -** the registers. -*/ -int -#ifdef __STDC__ -tuiCalculateRegsColumnCount ( - TuiRegisterDisplayType dpyType) -#else -tuiCalculateRegsColumnCount (dpyType) - TuiRegisterDisplayType dpyType; -#endif -{ - int colCount, colWidth; - - if (IS_64BIT || dpyType == TUI_DFLOAT_REGS) - colWidth = DOUBLE_FLOAT_VALUE_WIDTH + DOUBLE_FLOAT_LABEL_WIDTH; - else - { - if (dpyType == TUI_SFLOAT_REGS) - colWidth = SINGLE_FLOAT_VALUE_WIDTH + SINGLE_FLOAT_LABEL_WIDTH; - else - colWidth = SINGLE_VALUE_WIDTH + SINGLE_LABEL_WIDTH; - } - colCount = (dataWin->generic.width - 2) / colWidth; - - return colCount; -} /* tuiCalulateRegsColumnCount */ - - -/* -** tuiShowRegisters(). -** Show the registers int the data window as indicated by dpyType. -** If there is any other registers being displayed, then they are -** cleared. What registers are displayed is dependent upon dpyType. -*/ -void -#ifdef __STDC__ -tuiShowRegisters ( - TuiRegisterDisplayType dpyType) -#else -tuiShowRegisters (dpyType) - TuiRegisterDisplayType dpyType; -#endif -{ - TuiStatus ret = TUI_FAILURE; - int refreshValuesOnly = FALSE; - - /* Say that registers should be displayed, even if there is a problem */ - dataWin->detail.dataDisplayInfo.displayRegs = TRUE; - - if (target_has_registers) - { - refreshValuesOnly = - (dpyType == dataWin->detail.dataDisplayInfo.regsDisplayType); - switch (dpyType) - { - case TUI_GENERAL_REGS: - ret = _tuiSetGeneralRegsContent (refreshValuesOnly); - break; - case TUI_SFLOAT_REGS: - case TUI_DFLOAT_REGS: - ret = _tuiSetFloatRegsContent (dpyType, refreshValuesOnly); - break; - -/* could ifdef out */ - - case TUI_SPECIAL_REGS: - ret = _tuiSetSpecialRegsContent (refreshValuesOnly); - break; - case TUI_GENERAL_AND_SPECIAL_REGS: - ret = _tuiSetGeneralAndSpecialRegsContent (refreshValuesOnly); - break; - -/* end of potential if def */ - - default: - break; - } - } - if (ret == TUI_FAILURE) - { - dataWin->detail.dataDisplayInfo.regsDisplayType = TUI_UNDEFINED_REGS; - tuiEraseDataContent (NO_REGS_STRING); - } - else - { - int i; - - /* Clear all notation of changed values */ - for (i = 0; (i < dataWin->detail.dataDisplayInfo.regsContentCount); i++) - { - TuiGenWinInfoPtr dataItemWin; - - dataItemWin = &dataWin->detail.dataDisplayInfo. - regsContent[i]->whichElement.dataWindow; - (&((TuiWinElementPtr) - dataItemWin->content[0])->whichElement.data)->highlight = FALSE; - } - dataWin->detail.dataDisplayInfo.regsDisplayType = dpyType; - tuiDisplayAllData (); - } - (tuiLayoutDef ())->regsDisplayType = dpyType; - - return; -} /* tuiShowRegisters */ - - -/* -** tuiDisplayRegistersFrom(). -** Function to display the registers in the content from -** 'startElementNo' until the end of the register content or the -** end of the display height. No checking for displaying past -** the end of the registers is done here. -*/ -void -#ifdef __STDC__ -tuiDisplayRegistersFrom ( - int startElementNo) -#else -tuiDisplayRegistersFrom (startElementNo) - int startElementNo; -#endif -{ - if (dataWin->detail.dataDisplayInfo.regsContent != (TuiWinContent) NULL && - dataWin->detail.dataDisplayInfo.regsContentCount > 0) - { - register int i = startElementNo; - int j, valueCharsWide, charsWide, itemWinWidth, curY, labelWidth; - enum precision_type precision; - - precision = (dataWin->detail.dataDisplayInfo.regsDisplayType - == TUI_DFLOAT_REGS) ? - double_precision : unspecified_precision; - if (IS_64BIT || - dataWin->detail.dataDisplayInfo.regsDisplayType == TUI_DFLOAT_REGS) - { - valueCharsWide = DOUBLE_FLOAT_VALUE_WIDTH; - labelWidth = DOUBLE_FLOAT_LABEL_WIDTH; - } - else - { - if (dataWin->detail.dataDisplayInfo.regsDisplayType == - TUI_SFLOAT_REGS) - { - valueCharsWide = SINGLE_FLOAT_VALUE_WIDTH; - labelWidth = SINGLE_FLOAT_LABEL_WIDTH; - } - else - { - valueCharsWide = SINGLE_VALUE_WIDTH; - labelWidth = SINGLE_LABEL_WIDTH; - } - } - itemWinWidth = valueCharsWide + labelWidth; - /* - ** Now create each data "sub" window, and write the display into it. - */ - curY = 1; - while (i < dataWin->detail.dataDisplayInfo.regsContentCount && - curY <= dataWin->generic.viewportHeight) - { - for (j = 0; - (j < dataWin->detail.dataDisplayInfo.regsColumnCount && - i < dataWin->detail.dataDisplayInfo.regsContentCount); j++) - { - TuiGenWinInfoPtr dataItemWin; - TuiDataElementPtr dataElementPtr; - - /* create the window if necessary*/ - dataItemWin = &dataWin->detail.dataDisplayInfo. - regsContent[i]->whichElement.dataWindow; - dataElementPtr = &((TuiWinElementPtr) - dataItemWin->content[0])->whichElement.data; - if (dataItemWin->handle == (WINDOW *) NULL) - { - dataItemWin->height = 1; - dataItemWin->width = (precision == double_precision) ? - itemWinWidth + 2 : itemWinWidth + 1; - dataItemWin->origin.x = (itemWinWidth * j) + 1; - dataItemWin->origin.y = curY; - makeWindow (dataItemWin, DONT_BOX_WINDOW); - } - /* - ** Get the printable representation of the register - ** and display it - */ - _tuiDisplayRegister ( - dataElementPtr->itemNo, dataItemWin, precision); - i++; /* next register */ - } - curY++; /* next row; */ - } - } - - return; -} /* tuiDisplayRegistersFrom */ - - -/* -** tuiDisplayRegElementAtLine(). -** Function to display the registers in the content from -** 'startElementNo' on 'startLineNo' until the end of the -** register content or the end of the display height. -** This function checks that we won't display off the end -** of the register display. -*/ -void -#ifdef __STDC__ -tuiDisplayRegElementAtLine ( - int startElementNo, - int startLineNo) -#else -tuiDisplayRegElementAtLine (startElementNo, startLineNo) - int startElementNo; - int startLineNo; -#endif -{ - if (dataWin->detail.dataDisplayInfo.regsContent != (TuiWinContent) NULL && - dataWin->detail.dataDisplayInfo.regsContentCount > 0) - { - register int elementNo = startElementNo; - - if (startElementNo != 0 && startLineNo != 0) - { - register int lastLineNo, firstLineOnLastPage; - - lastLineNo = tuiLastRegsLineNo (); - firstLineOnLastPage = lastLineNo - (dataWin->generic.height - 2); - if (firstLineOnLastPage < 0) - firstLineOnLastPage = 0; - /* - ** If there is no other data displayed except registers, - ** and the elementNo causes us to scroll past the end of the - ** registers, adjust what element to really start the display at. - */ - if (dataWin->detail.dataDisplayInfo.dataContentCount <= 0 && - startLineNo > firstLineOnLastPage) - elementNo = tuiFirstRegElementNoInLine (firstLineOnLastPage); - } - tuiDisplayRegistersFrom (elementNo); - } - - return; -} /* tuiDisplayRegElementAtLine */ - - - -/* -** tuiDisplayRegistersFromLine(). -** Function to display the registers starting at line lineNo in -** the data window. Answers the line number that the display -** actually started from. If nothing is displayed (-1) is returned. -*/ -int -#ifdef __STDC__ -tuiDisplayRegistersFromLine ( - int lineNo, - int forceDisplay) -#else -tuiDisplayRegistersFromLine (lineNo, forceDisplay) - int lineNo; - int forceDisplay; -#endif -{ - int elementNo; - - if (dataWin->detail.dataDisplayInfo.regsContentCount > 0) - { - int line, elementNo; - - if (lineNo < 0) - line = 0; - else if (forceDisplay) - { /* - ** If we must display regs (forceDisplay is true), then make - ** sure that we don't display off the end of the registers. - */ - if (lineNo >= tuiLastRegsLineNo ()) - { - if ((line = tuiLineFromRegElementNo ( - dataWin->detail.dataDisplayInfo.regsContentCount - 1)) < 0) - line = 0; - } - else - line = lineNo; - } - else - line = lineNo; - - elementNo = tuiFirstRegElementNoInLine (line); - if (elementNo < dataWin->detail.dataDisplayInfo.regsContentCount) - tuiDisplayRegElementAtLine (elementNo, line); - else - line = (-1); - - return line; - } - - return (-1); /* nothing was displayed */ -} /* tuiDisplayRegistersFromLine */ - - -/* -** tuiCheckRegisterValues() -** This function check all displayed registers for changes in -** values, given a particular frame. If the values have changed, -** they are updated with the new value and highlighted. -*/ -void -#ifdef __STDC__ -tuiCheckRegisterValues ( - struct frame_info *frame) -#else -tuiCheckRegisterValues (frame) - struct frame_info *frame; -#endif -{ - if (m_winPtrNotNull (dataWin) && dataWin->generic.isVisible) - { - if (dataWin->detail.dataDisplayInfo.regsContentCount <= 0 && - dataWin->detail.dataDisplayInfo.displayRegs) - tuiShowRegisters ((tuiLayoutDef ())->regsDisplayType); - else - { - int i, j; - char rawBuf[MAX_REGISTER_RAW_SIZE]; - - for (i = 0; - (i < dataWin->detail.dataDisplayInfo.regsContentCount); i++) - { - TuiDataElementPtr dataElementPtr; - TuiGenWinInfoPtr dataItemWinPtr; - int wasHilighted; - - dataItemWinPtr = &dataWin->detail.dataDisplayInfo. - regsContent[i]->whichElement.dataWindow; - dataElementPtr = &((TuiWinElementPtr) - dataItemWinPtr->content[0])->whichElement.data; - wasHilighted = dataElementPtr->highlight; - dataElementPtr->highlight = - _tuiRegValueHasChanged (dataElementPtr, frame, &rawBuf[0]); - if (dataElementPtr->highlight) - { - for (j = 0; j < MAX_REGISTER_RAW_SIZE; j++) - ((char *) dataElementPtr->value)[j] = rawBuf[j]; - _tuiDisplayRegister ( - dataElementPtr->itemNo, - dataItemWinPtr, - ((dataWin->detail.dataDisplayInfo.regsDisplayType == - TUI_DFLOAT_REGS) ? - double_precision : unspecified_precision)); - } - else if (wasHilighted) - { - dataElementPtr->highlight = FALSE; - _tuiDisplayRegister ( - dataElementPtr->itemNo, - dataItemWinPtr, - ((dataWin->detail.dataDisplayInfo.regsDisplayType == - TUI_DFLOAT_REGS) ? - double_precision : unspecified_precision)); - } - } - } - } - return; -} /* tuiCheckRegisterValues */ - - -/* -** tuiToggleFloatRegs(). -*/ -void -#ifdef __STDC__ -tuiToggleFloatRegs (void) -#else -tuiToggleFloatRegs () -#endif -{ - TuiLayoutDefPtr layoutDef = tuiLayoutDef (); - - if (layoutDef->floatRegsDisplayType == TUI_SFLOAT_REGS) - layoutDef->floatRegsDisplayType = TUI_DFLOAT_REGS; - else - layoutDef->floatRegsDisplayType = TUI_SFLOAT_REGS; - - if (m_winPtrNotNull (dataWin) && dataWin->generic.isVisible && - (dataWin->detail.dataDisplayInfo.regsDisplayType == TUI_SFLOAT_REGS || - dataWin->detail.dataDisplayInfo.regsDisplayType == TUI_DFLOAT_REGS)) - tuiShowRegisters (layoutDef->floatRegsDisplayType); - - return; -} /* tuiToggleFloatRegs */ - - -void -_initialize_tuiRegs () -{ - if (tui_version && xdb_commands) - { - add_com ("fr", class_tui, _tuiShowFloat_command, - "Display only floating point registers\n"); - add_com ("gr", class_tui, _tuiShowGeneral_command, - "Display only general registers\n"); - add_com ("sr", class_tui, _tuiShowSpecial_command, - "Display only special registers\n"); - add_com ("+r", class_tui, _tuiScrollRegsForward_command, - "Scroll the registers window forward\n"); - add_com ("-r", class_tui, _tuiScrollRegsBackward_command, - "Scroll the register window backward\n"); - add_com ("tf", class_tui, _tuiToggleFloatRegs_command, - "Toggle between single and double precision floating point registers.\n"); - add_cmd (TUI_FLOAT_REGS_NAME_LOWER, - class_tui, - _tuiToggleFloatRegs_command, - "Toggle between single and double precision floating point \ -registers.\n", - &togglelist); - } - - return; -} /* _initialize_tuiRegs */ - - -/***************************************** -** STATIC LOCAL FUNCTIONS ** -******************************************/ - - -/* -** _tuiRegisterName(). -** Return the register name. -*/ -static char * -#ifdef __STDC__ -_tuiRegisterName ( - int regNum) -#else -_tuiRegisterName (regNum) - int regNum; -#endif -{ - if (reg_names[regNum] != (char *) NULL && *(reg_names[regNum]) != (char) 0) - return reg_names[regNum]; - else - return ((char *) NULL); -} /* tuiGetRegisterName */ - - -/* -** _tuiRegisterFormat -** Function to format the register name and value into a buffer, -** suitable for printing or display -*/ -static void -#ifdef __STDC__ -_tuiRegisterFormat ( - char *buf, - int bufLen, - int regNum, - TuiDataElementPtr dataElement, - enum precision_type precision) -#else -_tuiRegisterFormat (buf, bufLen, regNum, dataElement, precision) - char *buf; - int bufLen; - int regNum; - TuiDataElementPtr dataElement; - enum precision_type precision; -#endif -{ - char tmpBuf[15]; - char *fmt; - GDB_FILE *stream; - - stream = gdb_file_init_astring(bufLen); - pa_do_strcat_registers_info (regNum, 0, stream, precision); - strcpy (buf, gdb_file_get_strbuf(stream)); - gdb_file_deallocate(&stream); - - return; -} /* _tuiRegisterFormat */ - - -#define NUM_GENERAL_REGS 32 -/* -** _tuiSetGeneralRegsContent(). -** Set the content of the data window to consist of the general registers. -*/ -static TuiStatus -#ifdef __STDC__ -_tuiSetGeneralRegsContent ( - int refreshValuesOnly) -#else -_tuiSetGeneralRegsContent (refreshValuesOnly) - int refreshValuesOnly; -#endif -{ - return (_tuiSetRegsContent (0, - NUM_GENERAL_REGS - 1, - selected_frame, - TUI_GENERAL_REGS, - refreshValuesOnly)); - -} /* _tuiSetGeneralRegsContent */ - - -#define START_SPECIAL_REGS PCOQ_HEAD_REGNUM -/* -** _tuiSetSpecialRegsContent(). -** Set the content of the data window to consist of the special registers. -*/ -static TuiStatus -#ifdef __STDC__ -_tuiSetSpecialRegsContent ( - int refreshValuesOnly) -#else -_tuiSetSpecialRegsContent (refreshValuesOnly) - int refreshValuesOnly; -#endif -{ - TuiStatus ret = TUI_FAILURE; - int i, endRegNum; - - endRegNum = FP0_REGNUM - 1; -#if 0 - endRegNum = (-1); - for (i = START_SPECIAL_REGS; (i < ARCH_NUM_REGS && endRegNum < 0); i++) - if (TYPE_CODE (REGISTER_VIRTUAL_TYPE (i)) == TYPE_CODE_FLT) - endRegNum = i - 1; -#endif - ret = _tuiSetRegsContent (START_SPECIAL_REGS, - endRegNum, - selected_frame, - TUI_SPECIAL_REGS, - refreshValuesOnly); - - return ret; -} /* _tuiSetSpecialRegsContent */ - - -/* -** _tuiSetGeneralAndSpecialRegsContent(). -** Set the content of the data window to consist of the special registers. -*/ -static TuiStatus -#ifdef __STDC__ -_tuiSetGeneralAndSpecialRegsContent ( - int refreshValuesOnly) -#else -_tuiSetGeneralAndSpecialRegsContent (refreshValuesOnly) - int refreshValuesOnly; -#endif -{ - TuiStatus ret = TUI_FAILURE; - int i, endRegNum = (-1); - - endRegNum = FP0_REGNUM - 1; -#if 0 - endRegNum = (-1); - for (i = 0; (i < ARCH_NUM_REGS && endRegNum < 0); i++) - if (TYPE_CODE (REGISTER_VIRTUAL_TYPE (i)) == TYPE_CODE_FLT) - endRegNum = i - 1; -#endif - ret = _tuiSetRegsContent ( - 0, endRegNum, selected_frame, TUI_SPECIAL_REGS, refreshValuesOnly); - - return ret; -} /* _tuiSetGeneralAndSpecialRegsContent */ - -/* -** _tuiSetFloatRegsContent(). -** Set the content of the data window to consist of the float registers. -*/ -static TuiStatus -#ifdef __STDC__ -_tuiSetFloatRegsContent ( - TuiRegisterDisplayType dpyType, - int refreshValuesOnly) -#else -_tuiSetFloatRegsContent (dpyType, refreshValuesOnly) - TuiRegisterDisplayType dpyType; - int refreshValuesOnly; -#endif -{ - TuiStatus ret = TUI_FAILURE; - int i, startRegNum; - - startRegNum = FP0_REGNUM; -#if 0 - startRegNum = (-1); - for (i = ARCH_NUM_REGS - 1; (i >= 0 && startRegNum < 0); i--) - if (TYPE_CODE (REGISTER_VIRTUAL_TYPE (i)) != TYPE_CODE_FLT) - startRegNum = i + 1; -#endif - ret = _tuiSetRegsContent (startRegNum, - ARCH_NUM_REGS - 1, - selected_frame, - dpyType, - refreshValuesOnly); - - return ret; -} /* _tuiSetFloatRegsContent */ - - -/* -** _tuiRegValueHasChanged(). -** Answer TRUE if the register's value has changed, FALSE otherwise. -** If TRUE, newValue is filled in with the new value. -*/ -static int -#ifdef __STDC__ -_tuiRegValueHasChanged ( - TuiDataElementPtr dataElement, - struct frame_info *frame, - char *newValue) -#else -_tuiRegValueHasChanged (dataElement, frame, newValue) - TuiDataElementPtr dataElement; - struct frame_info *frame; - char *newValue; -#endif -{ - int hasChanged = FALSE; - - if (dataElement->itemNo != UNDEFINED_ITEM && - _tuiRegisterName (dataElement->itemNo) != (char *) NULL) - { - char rawBuf[MAX_REGISTER_RAW_SIZE]; - int i; - - if (_tuiGetRegisterRawValue ( - dataElement->itemNo, rawBuf, frame) == TUI_SUCCESS) - { - for (i = 0; (i < MAX_REGISTER_RAW_SIZE && !hasChanged); i++) - hasChanged = (((char *) dataElement->value)[i] != rawBuf[i]); - if (hasChanged && newValue != (char *) NULL) - { - for (i = 0; (i < MAX_REGISTER_RAW_SIZE); i++) - newValue[i] = rawBuf[i]; - } - } - } - return hasChanged; -} /* _tuiRegValueHasChanged */ - - - -/* -** _tuiGetRegisterRawValue(). -** Get the register raw value. The raw value is returned in regValue. -*/ -static TuiStatus -#ifdef __STDC__ -_tuiGetRegisterRawValue ( - int regNum, - char *regValue, - struct frame_info *frame) -#else -_tuiGetRegisterRawValue (regNum, regValue, frame) - int regNum; - char *regValue; - struct frame_info *frame; -#endif -{ - TuiStatus ret = TUI_FAILURE; - - if (target_has_registers) - { - read_relative_register_raw_bytes_for_frame (regNum, regValue, frame); - ret = TUI_SUCCESS; - } - - return ret; -} /* _tuiGetRegisterRawValue */ - - - -/* -** _tuiSetRegisterElement(). -** Function to initialize a data element with the input and -** the register value. -*/ -static void -#ifdef __STDC__ -_tuiSetRegisterElement ( - int regNum, - struct frame_info *frame, - TuiDataElementPtr dataElement, - int refreshValueOnly) -#else -_tuiSetRegisterElement (regNum, frame, dataElement, refreshValueOnly) - int regNum; - struct frame_info *frame; - TuiDataElementPtr dataElement; - int refreshValueOnly; -#endif -{ - if (dataElement != (TuiDataElementPtr) NULL) - { - if (!refreshValueOnly) - { - dataElement->itemNo = regNum; - dataElement->name = _tuiRegisterName (regNum); - dataElement->highlight = FALSE; - } - if (dataElement->value == (Opaque) NULL) - dataElement->value = (Opaque) xmalloc (MAX_REGISTER_RAW_SIZE); - if (dataElement->value != (Opaque) NULL) - _tuiGetRegisterRawValue (regNum, dataElement->value, frame); - } - - return; -} /* _tuiSetRegisterElement */ - - -/* -** _tuiSetRegsContent(). -** Set the content of the data window to consist of the registers -** numbered from startRegNum to endRegNum. Note that if -** refreshValuesOnly is TRUE, startRegNum and endRegNum are ignored. -*/ -static TuiStatus -#ifdef __STDC__ -_tuiSetRegsContent ( - int startRegNum, - int endRegNum, - struct frame_info *frame, - TuiRegisterDisplayType dpyType, - int refreshValuesOnly) -#else -_tuiSetRegsContent (startRegNum, endRegNum, frame, dpyType, refreshValuesOnly) - int startRegNum; - int endRegNum; - struct frame_info *frame; - TuiRegisterDisplayType dpyType; - int refreshValuesOnly; -#endif -{ - TuiStatus ret = TUI_FAILURE; - int numRegs = endRegNum - startRegNum + 1; - int allocatedHere = FALSE; - - if (dataWin->detail.dataDisplayInfo.regsContentCount > 0 && - !refreshValuesOnly) - { - freeDataContent (dataWin->detail.dataDisplayInfo.regsContent, - dataWin->detail.dataDisplayInfo.regsContentCount); - dataWin->detail.dataDisplayInfo.regsContentCount = 0; - } - if (dataWin->detail.dataDisplayInfo.regsContentCount <= 0) - { - dataWin->detail.dataDisplayInfo.regsContent = - allocContent (numRegs, DATA_WIN); - allocatedHere = TRUE; - } - - if (dataWin->detail.dataDisplayInfo.regsContent != (TuiWinContent) NULL) - { - int i; - - if (!refreshValuesOnly || allocatedHere) - { - dataWin->generic.content = (OpaquePtr) NULL; - dataWin->generic.contentSize = 0; - addContentElements (&dataWin->generic, numRegs); - dataWin->detail.dataDisplayInfo.regsContent = - (TuiWinContent) dataWin->generic.content; - dataWin->detail.dataDisplayInfo.regsContentCount = numRegs; - } - /* - ** Now set the register names and values - */ - for (i = startRegNum; (i <= endRegNum); i++) - { - TuiGenWinInfoPtr dataItemWin; - - dataItemWin = &dataWin->detail.dataDisplayInfo. - regsContent[i - startRegNum]->whichElement.dataWindow; - _tuiSetRegisterElement ( - i, - frame, - &((TuiWinElementPtr) dataItemWin->content[0])->whichElement.data, - !allocatedHere && refreshValuesOnly); - } - dataWin->detail.dataDisplayInfo.regsColumnCount = - tuiCalculateRegsColumnCount (dpyType); -#ifdef LATER - if (dataWin->detail.dataDisplayInfo.dataContentCount > 0) - { - /* delete all the windows? */ - /* realloc content equal to dataContentCount + regsContentCount */ - /* append dataWin->detail.dataDisplayInfo.dataContent to content */ - } -#endif - dataWin->generic.contentSize = - dataWin->detail.dataDisplayInfo.regsContentCount + - dataWin->detail.dataDisplayInfo.dataContentCount; - ret = TUI_SUCCESS; - } - - return ret; -} /* _tuiSetRegsContent */ - - -/* -** _tuiDisplayRegister(). -** Function to display a register in a window. If hilite is TRUE, -** than the value will be displayed in reverse video -*/ -static void -#ifdef __STDC__ -_tuiDisplayRegister ( - int regNum, - TuiGenWinInfoPtr winInfo, /* the data item window */ - enum precision_type precision) -#else -_tuiDisplayRegister (regNum, winInfo, precision) - int regNum; - TuiGenWinInfoPtr winInfo; /* the data item window */ - enum precision_type precision; -#endif -{ - if (winInfo->handle != (WINDOW *) NULL) - { - char buf[100]; - int valueCharsWide, labelWidth; - TuiDataElementPtr dataElementPtr = &((TuiWinContent) - winInfo->content)[0]->whichElement.data; - - if (IS_64BIT || - dataWin->detail.dataDisplayInfo.regsDisplayType == TUI_DFLOAT_REGS) - { - valueCharsWide = DOUBLE_FLOAT_VALUE_WIDTH; - labelWidth = DOUBLE_FLOAT_LABEL_WIDTH; - } - else - { - if (dataWin->detail.dataDisplayInfo.regsDisplayType == - TUI_SFLOAT_REGS) - { - valueCharsWide = SINGLE_FLOAT_VALUE_WIDTH; - labelWidth = SINGLE_FLOAT_LABEL_WIDTH; - } - else - { - valueCharsWide = SINGLE_VALUE_WIDTH; - labelWidth = SINGLE_LABEL_WIDTH; - } - } - - buf[0] = (char) 0; - _tuiRegisterFormat (buf, - valueCharsWide + labelWidth, - regNum, - dataElementPtr, - precision); - if (dataElementPtr->highlight) - wstandout (winInfo->handle); - - werase (winInfo->handle); - wmove (winInfo->handle, 0, 0); - waddstr (winInfo->handle, buf); - - if (dataElementPtr->highlight) - wstandend (winInfo->handle); - tuiRefreshWin (winInfo); - } - return; -} /* _tuiDisplayRegister */ - - -static void -#ifdef __STDC__ -_tui_vShowRegisters_commandSupport ( - va_list args) -#else -_tui_vShowRegisters_commandSupport (args) - va_list args; -#endif -{ - TuiRegisterDisplayType dpyType = va_arg (args, TuiRegisterDisplayType); - - if (m_winPtrNotNull (dataWin) && dataWin->generic.isVisible) - { /* Data window already displayed, show the registers */ - if (dataWin->detail.dataDisplayInfo.regsDisplayType != dpyType) - tuiShowRegisters (dpyType); - } - else - (tuiLayoutDef ())->regsDisplayType = dpyType; - - return; -} /* _tui_vShowRegisters_commandSupport */ - - -static void -#ifdef __STDC__ -_tuiShowFloat_command ( - char *arg, - int fromTTY) -#else -_tuiShowFloat_command (arg, fromTTY) - char *arg; - int fromTTY; -#endif -{ - if (m_winPtrIsNull (dataWin) || !dataWin->generic.isVisible || - (dataWin->detail.dataDisplayInfo.regsDisplayType != TUI_SFLOAT_REGS && - dataWin->detail.dataDisplayInfo.regsDisplayType != TUI_DFLOAT_REGS)) - tuiDo ((TuiOpaqueFuncPtr) _tui_vShowRegisters_commandSupport, - (tuiLayoutDef ())->floatRegsDisplayType); - - return; -} /* _tuiShowFloat_command */ - - -static void -#ifdef __STDC__ -_tuiShowGeneral_command ( - char *arg, - int fromTTY) -#else -_tuiShowGeneral_command (arg, fromTTY) - char *arg; - int fromTTY; -#endif -{ - tuiDo ((TuiOpaqueFuncPtr) _tui_vShowRegisters_commandSupport, - TUI_GENERAL_REGS); - - return; -} /* _tuiShowGeneral_command */ - - -static void -#ifdef __STDC__ -_tuiShowSpecial_command ( - char *arg, - int fromTTY) -#else -_tuiShowSpecial_command (arg, fromTTY) - char *arg; - int fromTTY; -#endif -{ - tuiDo ((TuiOpaqueFuncPtr) _tui_vShowRegisters_commandSupport, - TUI_SPECIAL_REGS); - - return; -} /* _tuiShowSpecial_command */ - - -static void -#ifdef __STDC__ -_tuiToggleFloatRegs_command ( - char *arg, - int fromTTY) -#else -_tuiToggleFloatRegs_command (arg, fromTTY) - char *arg; - int fromTTY; -#endif -{ - if (m_winPtrNotNull (dataWin) && dataWin->generic.isVisible) - tuiDo ((TuiOpaqueFuncPtr) tuiToggleFloatRegs); - else - { - TuiLayoutDefPtr layoutDef = tuiLayoutDef (); - - if (layoutDef->floatRegsDisplayType == TUI_SFLOAT_REGS) - layoutDef->floatRegsDisplayType = TUI_DFLOAT_REGS; - else - layoutDef->floatRegsDisplayType = TUI_SFLOAT_REGS; - } - - - return; -} /* _tuiToggleFloatRegs_command */ - - -static void -#ifdef __STDC__ -_tuiScrollRegsForward_command ( - char *arg, - int fromTTY) -#else -_tuiScrollRegsForward_command (arg, fromTTY) - char *arg; - int fromTTY; -#endif -{ - tuiDo ((TuiOpaqueFuncPtr) tui_vScroll, FORWARD_SCROLL, dataWin, 1); - - return; -} /* _tuiScrollRegsForward_command */ - - -static void -#ifdef __STDC__ -_tuiScrollRegsBackward_command ( - char *arg, - int fromTTY) -#else -_tuiScrollRegsBackward_command (arg, fromTTY) - char *arg; - int fromTTY; -#endif -{ - tuiDo ((TuiOpaqueFuncPtr) tui_vScroll, BACKWARD_SCROLL, dataWin, 1); - - return; -} /* _tuiScrollRegsBackward_command */ diff --git a/contrib/gdb/gdb/tui/tuiRegs.h b/contrib/gdb/gdb/tui/tuiRegs.h deleted file mode 100644 index 4a777ec9a9b66..0000000000000 --- a/contrib/gdb/gdb/tui/tuiRegs.h +++ /dev/null @@ -1,28 +0,0 @@ -#ifndef _TUI_REGS_H -#define _TUI_REGS_H -/* -** This header file supports the display of registers in the data window. -*/ - -/***************************************** -** TYPE DEFINITIONS ** -******************************************/ - - - -/***************************************** -** PUBLIC FUNCTION EXTERNAL DECLS ** -******************************************/ -extern void tuiCheckRegisterValues PARAMS ((struct frame_info *)); -extern void tuiShowRegisters PARAMS ((TuiRegisterDisplayType)); -extern void tuiDisplayRegistersFrom PARAMS ((int)); -extern int tuiDisplayRegistersFromLine PARAMS ((int, int)); -extern int tuiLastRegsLineNo PARAMS ((void)); -extern int tuiFirstRegElementInLine PARAMS ((int)); -extern int tuiLastRegElementInLine PARAMS ((int)); -extern int tuiLineFromRegElementNo PARAMS ((int)); -extern void tuiToggleFloatRegs PARAMS ((void)); -extern int tuiCalculateRegsColumnCount PARAMS ((TuiRegisterDisplayType)); - - -#endif /*_TUI_REGS_H*/ diff --git a/contrib/gdb/gdb/tui/tuiSource.c b/contrib/gdb/gdb/tui/tuiSource.c deleted file mode 100644 index e0259d014b430..0000000000000 --- a/contrib/gdb/gdb/tui/tuiSource.c +++ /dev/null @@ -1,465 +0,0 @@ -/* -** tuiSource.c -** This module contains functions for displaying source in the source window -*/ - -#include "defs.h" -#include <ctype.h> -#include "symtab.h" -#include "frame.h" -#include "breakpoint.h" - -#include "tui.h" -#include "tuiData.h" -#include "tuiStack.h" -#include "tuiSourceWin.h" -#include "tuiSource.h" - - -/***************************************** -** EXTERNAL FUNCTION DECLS ** -******************************************/ - -extern int open_source_file PARAMS ((struct symtab *)); -extern void find_source_lines PARAMS ((struct symtab *, int)); - -/***************************************** -** EXTERNAL DATA DECLS ** -******************************************/ -extern int current_source_line; -extern struct symtab *current_source_symtab; - - -/***************************************** -** STATIC LOCAL FUNCTIONS FORWARD DECLS ** -******************************************/ - -static struct breakpoint *_hasBreak PARAMS ((char *, int)); - - -/***************************************** -** STATIC LOCAL DATA ** -******************************************/ - - -/***************************************** -** PUBLIC FUNCTIONS ** -******************************************/ - -/********************************* -** SOURCE/DISASSEM FUNCTIONS ** -*********************************/ - -/* -** tuiSetSourceContent(). -** Function to display source in the source window. -*/ -TuiStatus -#ifdef __STDC__ -tuiSetSourceContent ( - struct symtab *s, - int lineNo, - int noerror) -#else -tuiSetSourceContent (s, lineNo, noerror) - struct symtab *s; - int lineNo; - int noerror; -#endif -{ - TuiStatus ret = TUI_FAILURE; - - if (s != (struct symtab *) NULL && s->filename != (char *) NULL) - { - register FILE *stream; - register int i, desc, c, lineWidth, nlines; - register char *srcLine; - - if ((ret = tuiAllocSourceBuffer (srcWin)) == TUI_SUCCESS) - { - lineWidth = srcWin->generic.width - 1; - /* - ** Take hilite (window border) into account, when calculating - ** the number of lines - */ - nlines = (lineNo + (srcWin->generic.height - 2)) - lineNo; - desc = open_source_file (s); - if (desc < 0) - { - if (!noerror) - { - char *name = alloca (strlen (s->filename) + 100); - sprintf (name, "%s:%d", s->filename, lineNo); - print_sys_errmsg (name, errno); - } - ret = TUI_FAILURE; - } - else - { - if (s->line_charpos == 0) - find_source_lines (s, desc); - - if (lineNo < 1 || lineNo > s->nlines) - { - close (desc); - printf_unfiltered ( - "Line number %d out of range; %s has %d lines.\n", - lineNo, s->filename, s->nlines); - } - else if (lseek (desc, s->line_charpos[lineNo - 1], 0) < 0) - { - close (desc); - perror_with_name (s->filename); - } - else - { - register int offset, curLineNo, curLine, curLen, threshold; - TuiGenWinInfoPtr locator = locatorWinInfoPtr (); - /* - ** Determine the threshold for the length of the line - ** and the offset to start the display - */ - offset = srcWin->detail.sourceInfo.horizontalOffset; - threshold = (lineWidth - 1) + offset; - stream = fdopen (desc, FOPEN_RT); - clearerr (stream); - curLine = 0; - curLineNo = - srcWin->detail.sourceInfo.startLineOrAddr.lineNo = lineNo; - if (offset > 0) - srcLine = (char *) xmalloc ( - (threshold + 1) * sizeof (char)); - while (curLine < nlines) - { - TuiWinElementPtr element = (TuiWinElementPtr) - srcWin->generic.content[curLine]; - struct breakpoint *bp; - - /* get the first character in the line */ - c = fgetc (stream); - - if (offset == 0) - srcLine = ((TuiWinElementPtr) - srcWin->generic.content[ - curLine])->whichElement.source.line; - /* Init the line with the line number */ - sprintf (srcLine, "%-6d", curLineNo); - curLen = strlen (srcLine); - i = curLen - - ((curLen / tuiDefaultTabLen ()) * tuiDefaultTabLen ()); - while (i < tuiDefaultTabLen ()) - { - srcLine[curLen] = ' '; - i++; - curLen++; - } - srcLine[curLen] = (char) 0; - - /* - ** Set whether element is the execution point and - ** whether there is a break point on it. - */ - element->whichElement.source.lineOrAddr.lineNo = - curLineNo; - element->whichElement.source.isExecPoint = - (strcmp (((TuiWinElementPtr) - locator->content[0])->whichElement.locator.fileName, - s->filename) == 0 - && curLineNo == ((TuiWinElementPtr) - locator->content[0])->whichElement.locator.lineNo); - bp = _hasBreak (s->filename, curLineNo); - element->whichElement.source.hasBreak = - (bp != (struct breakpoint *) NULL && - (!element->whichElement.source.isExecPoint || - (bp->disposition != del || bp->hit_count <= 0))); - if (c != EOF) - { - i = strlen (srcLine) - 1; - do - { - if ((c != '\n') && - (c != '\r') && (++i < threshold)) - { - if (c < 040 && c != '\t') - { - srcLine[i++] = '^'; - srcLine[i] = c + 0100; - } - else if (c == 0177) - { - srcLine[i++] = '^'; - srcLine[i] = '?'; - } - else - { /* - ** Store the charcter in the line - ** buffer. If it is a tab, then - ** translate to the correct number of - ** chars so we don't overwrite our - ** buffer. - */ - if (c == '\t') - { - int j, maxTabLen = tuiDefaultTabLen (); - - for (j = i - ( - (i / maxTabLen) * maxTabLen); - ((j < maxTabLen) && - i < threshold); - i++, j++) - srcLine[i] = ' '; - i--; - } - else - srcLine[i] = c; - } - srcLine[i + 1] = 0; - } - else - { /* - ** if we have not reached EOL, then eat - ** chars until we do - */ - while (c != EOF && c != '\n' && c != '\r') - c = fgetc (stream); - } - } - while (c != EOF && c != '\n' && c != '\r' && - i < threshold && (c = fgetc (stream))); - } - /* Now copy the line taking the offset into account */ - if (strlen (srcLine) > offset) - strcpy (((TuiWinElementPtr) srcWin->generic.content[ - curLine])->whichElement.source.line, - &srcLine[offset]); - else - ((TuiWinElementPtr) - srcWin->generic.content[ - curLine])->whichElement.source.line[0] = (char) 0; - curLine++; - curLineNo++; - } - if (offset > 0) - tuiFree (srcLine); - fclose (stream); - srcWin->generic.contentSize = nlines; - ret = TUI_SUCCESS; - } - } - } - } - return ret; -} /* tuiSetSourceContent */ - - -/* elz: this function sets the contents of the source window to empty - except for a line in the middle with a warning message about the - source not being available. This function is called by - tuiEraseSourceContents, which in turn is invoked when the source files - cannot be accessed*/ - -void -#ifdef __STDC__ -tuiSetSourceContentNil ( - TuiWinInfoPtr winInfo, - char *warning_string) -#else -tuiSetSourceContentNil (winInfo, warning_string) - TuiWinInfoPtr winInfo; - char *warning_string; -#endif -{ - int lineWidth; - int nLines; - int curr_line = 0; - - lineWidth = winInfo->generic.width - 1; - nLines = winInfo->generic.height - 2; - - /* set to empty each line in the window, except for the one - which contains the message*/ - while (curr_line < winInfo->generic.contentSize) - { - /* set the information related to each displayed line - to null: i.e. the line number is 0, there is no bp, - it is not where the program is stopped */ - - TuiWinElementPtr element = - (TuiWinElementPtr) winInfo->generic.content[curr_line]; - element->whichElement.source.lineOrAddr.lineNo = 0; - element->whichElement.source.isExecPoint = FALSE; - element->whichElement.source.hasBreak = FALSE; - - /* set the contents of the line to blank*/ - element->whichElement.source.line[0] = (char) 0; - - /* if the current line is in the middle of the screen, then we want to - display the 'no source available' message in it. - Note: the 'weird' arithmetic with the line width and height comes from - the function tuiEraseSourceContent. We need to keep the screen and the - window's actual contents in synch */ - - if (curr_line == (nLines / 2 + 1)) - { - int i; - int xpos; - int warning_length = strlen (warning_string); - char *srcLine; - - srcLine = element->whichElement.source.line; - - if (warning_length >= ((lineWidth - 1) / 2)) - xpos = 1; - else - xpos = (lineWidth - 1) / 2 - warning_length; - - for (i = 0; i < xpos; i++) - srcLine[i] = ' '; - - sprintf (srcLine + i, "%s", warning_string); - - for (i = xpos + warning_length; i < lineWidth; i++) - srcLine[i] = ' '; - - srcLine[i] = '\n'; - - } /* end if */ - - curr_line++; - - } /* end while*/ - -} /*tuiSetSourceContentNil*/ - - - - -/* -** tuiShowSource(). -** Function to display source in the source window. This function -** initializes the horizontal scroll to 0. -*/ -void -#ifdef __STDC__ -tuiShowSource ( - struct symtab *s, - Opaque line, - int noerror) -#else -tuiShowSource (s, line, noerror) - struct symtab *s; - Opaque line; - int noerror; -#endif -{ - srcWin->detail.sourceInfo.horizontalOffset = 0; - m_tuiShowSourceAsIs (s, line, noerror); - - return; -} /* tuiShowSource */ - - -/* -** tuiSourceIsDisplayed(). -** Answer whether the source is currently displayed in the source window. -*/ -int -#ifdef __STDC__ -tuiSourceIsDisplayed ( - char *fname) -#else -tuiSourceIsDisplayed (fname) - char *fname; -#endif -{ - return (srcWin->generic.contentInUse && - (strcmp (((TuiWinElementPtr) (locatorWinInfoPtr ())-> - content[0])->whichElement.locator.fileName, fname) == 0)); -} /* tuiSourceIsDisplayed */ - - -/* -** tuiVerticalSourceScroll(). -** Scroll the source forward or backward vertically -*/ -void -#ifdef __STDC__ -tuiVerticalSourceScroll ( - TuiScrollDirection scrollDirection, - int numToScroll) -#else -tuiVerticalSourceScroll (scrollDirection, numToScroll) - TuiScrollDirection scrollDirection; - int numToScroll; -#endif -{ - if (srcWin->generic.content != (OpaquePtr) NULL) - { - int line; - Opaque addr; - struct symtab *s; - TuiWinContent content = (TuiWinContent) srcWin->generic.content; - - if (current_source_symtab == (struct symtab *) NULL) - s = find_pc_symtab (selected_frame->pc); - else - s = current_source_symtab; - - if (scrollDirection == FORWARD_SCROLL) - { - line = content[0]->whichElement.source.lineOrAddr.lineNo + - numToScroll; - if (line > s->nlines) - /*line = s->nlines - winInfo->generic.contentSize + 1;*/ - /*elz: fix for dts 23398*/ - line = content[0]->whichElement.source.lineOrAddr.lineNo; - } - else - { - line = content[0]->whichElement.source.lineOrAddr.lineNo - - numToScroll; - if (line <= 0) - line = 1; - } - tuiUpdateSourceWindowAsIs (srcWin, s, (Opaque) line, FALSE); - } - - return; -} /* tuiVerticalSourceScroll */ - - -/***************************************** -** STATIC LOCAL FUNCTIONS ** -******************************************/ - -/* -** _hasBreak(). -** Answer whether there is a break point at the input line in -** the source file indicated -*/ -static struct breakpoint * -#ifdef __STDC__ -_hasBreak ( - char *sourceFileName, - int lineNo) -#else -_hasBreak (sourceFileName, lineNo) - char *sourceFileName; - int lineNo; -#endif -{ - struct breakpoint *bpWithBreak = (struct breakpoint *) NULL; - struct breakpoint *bp; - extern struct breakpoint *breakpoint_chain; - - - for (bp = breakpoint_chain; - (bp != (struct breakpoint *) NULL && - bpWithBreak == (struct breakpoint *) NULL); - bp = bp->next) - if ((strcmp (sourceFileName, bp->source_file) == 0) && - (lineNo == bp->line_number)) - bpWithBreak = bp; - - return bpWithBreak; -} /* _hasBreak */ diff --git a/contrib/gdb/gdb/tui/tuiSource.h b/contrib/gdb/gdb/tui/tuiSource.h deleted file mode 100644 index f898c611c7140..0000000000000 --- a/contrib/gdb/gdb/tui/tuiSource.h +++ /dev/null @@ -1,27 +0,0 @@ -#ifndef _TUI_SOURCE_H -#define _TUI_SOURCE_H -/* -** This header file supports -*/ - - -#include "defs.h" -#if 0 -#include "symtab.h" -#include "breakpoint.h" -#endif - -extern TuiStatus tuiSetSourceContent PARAMS ((struct symtab *, int, int)); -extern void tuiShowSource PARAMS ((struct symtab *, Opaque, int)); -extern void tuiShowSourceAsIs PARAMS ((struct symtab *, Opaque, int)); -extern int tuiSourceIsDisplayed PARAMS ((char *)); -extern void tuiVerticalSourceScroll PARAMS ((TuiScrollDirection, int)); - - -/******************* -** MACROS ** -*******************/ -#define m_tuiShowSourceAsIs(s, line, noerror) tuiUpdateSourceWindowAsIs(srcWin, s, line, noerror) - - -#endif /*_TUI_SOURCE_H*/ diff --git a/contrib/gdb/gdb/tui/tuiSourceWin.c b/contrib/gdb/gdb/tui/tuiSourceWin.c deleted file mode 100644 index e20392598ad7a..0000000000000 --- a/contrib/gdb/gdb/tui/tuiSourceWin.c +++ /dev/null @@ -1,1098 +0,0 @@ -/* -** tuiSourceWin.c -** This module contains functions for displaying source or assembly in the "source" window. -* The "source" window may be the assembly or the source windows. -*/ - -#include "defs.h" -#include <ctype.h> -#include "symtab.h" -#include "frame.h" -#include "breakpoint.h" - -#include "tui.h" -#include "tuiData.h" -#include "tuiStack.h" -#include "tuiSourceWin.h" -#include "tuiSource.h" -#include "tuiDisassem.h" - - -/***************************************** -** EXTERNAL FUNCTION DECLS ** -******************************************/ - -/***************************************** -** EXTERNAL DATA DECLS ** -******************************************/ -extern int current_source_line; -extern struct symtab *current_source_symtab; - - -/***************************************** -** STATIC LOCAL FUNCTIONS FORWARD DECLS ** -******************************************/ - -/***************************************** -** STATIC LOCAL DATA ** -******************************************/ - - -/***************************************** -** PUBLIC FUNCTIONS ** -******************************************/ - -/********************************* -** SOURCE/DISASSEM FUNCTIONS ** -*********************************/ - -/* -** tuiSrcWinIsDisplayed(). -*/ -int -#ifdef __STDC__ -tuiSrcWinIsDisplayed (void) -#else -tuiSrcWinIsDisplayed () -#endif -{ - return (m_winPtrNotNull (srcWin) && srcWin->generic.isVisible); -} /* tuiSrcWinIsDisplayed */ - - -/* -** tuiAsmWinIsDisplayed(). -*/ -int -#ifdef __STDC__ -tuiAsmWinIsDisplayed (void) -#else -tuiAsmWinIsDisplayed () -#endif -{ - return (m_winPtrNotNull (disassemWin) && disassemWin->generic.isVisible); -} /* tuiAsmWinIsDisplayed */ - - -/* -** tuiDisplayMainFunction(). -** Function to display the "main" routine" -*/ -void -#ifdef __STDC__ -tuiDisplayMainFunction (void) -#else -tuiDisplayMainFunction () -#endif -{ - if ((sourceWindows ())->count > 0) - { - CORE_ADDR addr; - - addr = parse_and_eval_address ("main"); - if (addr <= (CORE_ADDR) 0) - addr = parse_and_eval_address ("MAIN"); - if (addr > (CORE_ADDR) 0) - { - struct symtab_and_line sal; - - tuiUpdateSourceWindowsWithAddr ((Opaque) addr); - sal = find_pc_line (addr, 0); - tuiSwitchFilename (sal.symtab->filename); - } - } - - return; -} /* tuiDisplayMainFunction */ - - - -/* -** tuiUpdateSourceWindow(). -** Function to display source in the source window. This function -** initializes the horizontal scroll to 0. -*/ -void -#ifdef __STDC__ -tuiUpdateSourceWindow ( - TuiWinInfoPtr winInfo, - struct symtab *s, - Opaque lineOrAddr, - int noerror) -#else -tuiUpdateSourceWindow (winInfo, s, lineOrAddr, noerror) - TuiWinInfoPtr winInfo; - struct symtab *s; - Opaque lineOrAddr; - int noerror; -#endif -{ - winInfo->detail.sourceInfo.horizontalOffset = 0; - tuiUpdateSourceWindowAsIs (winInfo, s, lineOrAddr, noerror); - - return; -} /* tuiUpdateSourceWindow */ - - -/* -** tuiUpdateSourceWindowAsIs(). -** Function to display source in the source/asm window. This -** function shows the source as specified by the horizontal offset. -*/ -void -#ifdef __STDC__ -tuiUpdateSourceWindowAsIs ( - TuiWinInfoPtr winInfo, - struct symtab *s, - Opaque lineOrAddr, - int noerror) -#else -tuiUpdateSourceWindowAsIs (winInfo, s, lineOrAddr, noerror) - TuiWinInfoPtr winInfo; - struct symtab *s; - Opaque lineOrAddr; - int noerror; -#endif -{ - TuiStatus ret; - - if (winInfo->generic.type == SRC_WIN) - ret = tuiSetSourceContent (s, (int) lineOrAddr, noerror); - else - ret = tuiSetDisassemContent (s, (Opaque) lineOrAddr); - - if (ret == TUI_FAILURE) - { - tuiClearSourceContent (winInfo, EMPTY_SOURCE_PROMPT); - tuiClearExecInfoContent (winInfo); - } - else - { - tuiEraseSourceContent (winInfo, NO_EMPTY_SOURCE_PROMPT); - tuiShowSourceContent (winInfo); - tuiUpdateExecInfo (winInfo); - if (winInfo->generic.type == SRC_WIN) - { - current_source_line = (int) lineOrAddr + - (winInfo->generic.contentSize - 2); - current_source_symtab = s; - /* - ** If the focus was in the asm win, put it in the src - ** win if we don't have a split layout - */ - if (tuiWinWithFocus () == disassemWin && - currentLayout () != SRC_DISASSEM_COMMAND) - tuiSetWinFocusTo (srcWin); - } - } - - - return; -} /* tuiUpdateSourceWindowAsIs */ - - -/* -** tuiUpdateSourceWindowsWithAddr(). -** Function to ensure that the source and/or disassemly windows -** reflect the input address. -*/ -void -#ifdef __STDC__ -tuiUpdateSourceWindowsWithAddr ( - Opaque addr) -#else -tuiUpdateSourceWindowsWithAddr (addr) - Opaque addr; -#endif -{ - if (addr > (Opaque) NULL) - { - struct symtab_and_line sal; - - switch (currentLayout ()) - { - case DISASSEM_COMMAND: - case DISASSEM_DATA_COMMAND: - tuiShowDisassem (addr); - break; - case SRC_DISASSEM_COMMAND: - tuiShowDisassemAndUpdateSource (addr); - break; - default: - sal = find_pc_line ((CORE_ADDR) addr, 0); - tuiShowSource (sal.symtab, - (Opaque) sal.line, - FALSE); - break; - } - } - else - { - int i; - - for (i = 0; i < (sourceWindows ())->count; i++) - { - TuiWinInfoPtr winInfo = (TuiWinInfoPtr) (sourceWindows ())->list[i]; - - tuiClearSourceContent (winInfo, EMPTY_SOURCE_PROMPT); - tuiClearExecInfoContent (winInfo); - } - } - - return; -} /* tuiUpdateSourceWindowsWithAddr */ - - -/* -** tui_vUpdateSourceWindowsWithAddr() -** Update the source window with the address in a va_list -*/ -void -#ifdef __STDC__ -tui_vUpdateSourceWindowsWithAddr ( - va_list args) -#else -tui_vUpdateSourceWindowsWithAddr (args) - va_list args; -#endif -{ - Opaque addr = va_arg (args, Opaque); - - tuiUpdateSourceWindowsWithAddr (addr); - - return; -} /* tui_vUpdateSourceWindowsWithAddr */ - - -/* -** tuiUpdateSourceWindowsWithLine(). -** Function to ensure that the source and/or disassemly windows -** reflect the input address. -*/ -void -#ifdef __STDC__ -tuiUpdateSourceWindowsWithLine ( - struct symtab *s, - int line) -#else -tuiUpdateSourceWindowsWithLine (s, line) - struct symtab *s; - int line; -#endif -{ - switch (currentLayout ()) - { - case DISASSEM_COMMAND: - case DISASSEM_DATA_COMMAND: - tuiUpdateSourceWindowsWithAddr ((Opaque) find_line_pc (s, line)); - break; - default: - tuiShowSource (s, (Opaque) line, FALSE); - if (currentLayout () == SRC_DISASSEM_COMMAND) - tuiShowDisassem ((Opaque) find_line_pc (s, line)); - break; - } - - return; -} /* tuiUpdateSourceWindowsWithLine */ - - -/* -** tui_vUpdateSourceWindowsWithLine() -** Update the source window with the line number in a va_list -*/ -void -#ifdef __STDC__ -tui_vUpdateSourceWindowsWithLine ( - va_list args) -#else -tui_vUpdateSourceWindowsWithLine (args) - va_list args; -#endif -{ - struct symtab *s = va_arg (args, struct symtab *); - int line = va_arg (args, int); - - tuiUpdateSourceWindowsWithLine (s, line); - - return; -} /* tui_vUpdateSourceWindowsWithLine */ - - -/* -** tuiClearSourceContent(). -*/ -void -#ifdef __STDC__ -tuiClearSourceContent ( - TuiWinInfoPtr winInfo, - int displayPrompt) -#else -tuiClearSourceContent (winInfo, displayPrompt) - TuiWinInfoPtr winInfo; - int displayPrompt; -#endif -{ - if (m_winPtrNotNull (winInfo)) - { - register int i; - - winInfo->generic.contentInUse = FALSE; - tuiEraseSourceContent (winInfo, displayPrompt); - for (i = 0; i < winInfo->generic.contentSize; i++) - { - TuiWinElementPtr element = - (TuiWinElementPtr) winInfo->generic.content[i]; - element->whichElement.source.hasBreak = FALSE; - element->whichElement.source.isExecPoint = FALSE; - } - } - - return; -} /* tuiClearSourceContent */ - - -/* -** tuiClearAllSourceWinsContent(). -*/ -void -#ifdef __STDC__ -tuiClearAllSourceWinsContent ( - int displayPrompt) -#else -tuiClearAllSourceWinsContent (displayPrompt) - int displayPrompt; -#endif -{ - int i; - - for (i = 0; i < (sourceWindows ())->count; i++) - tuiClearSourceContent ((TuiWinInfoPtr) (sourceWindows ())->list[i], - displayPrompt); - - return; -} /* tuiClearAllSourceWinsContent */ - - -/* -** tuiEraseSourceContent(). -*/ -void -#ifdef __STDC__ -tuiEraseSourceContent ( - TuiWinInfoPtr winInfo, - int displayPrompt) -#else -tuiEraseSourceContent (winInfo, displayPrompt) - TuiWinInfoPtr winInfo; - int displayPrompt; -#endif -{ - int xPos; - int halfWidth = (winInfo->generic.width - 2) / 2; - - if (winInfo->generic.handle != (WINDOW *) NULL) - { - werase (winInfo->generic.handle); - checkAndDisplayHighlightIfNeeded (winInfo); - if (displayPrompt == EMPTY_SOURCE_PROMPT) - { - char *noSrcStr; - - if (winInfo->generic.type == SRC_WIN) - noSrcStr = NO_SRC_STRING; - else - noSrcStr = NO_DISASSEM_STRING; - if (strlen (noSrcStr) >= halfWidth) - xPos = 1; - else - xPos = halfWidth - strlen (noSrcStr); - mvwaddstr (winInfo->generic.handle, - (winInfo->generic.height / 2), - xPos, - noSrcStr); - - /* elz: added this function call to set the real contents of - the window to what is on the screen, so that later calls - to refresh, do display - the correct stuff, and not the old image */ - - tuiSetSourceContentNil (winInfo, noSrcStr); - } - tuiRefreshWin (&winInfo->generic); - } - return; -} /* tuiEraseSourceContent */ - - -/* -** tuiEraseAllSourceContent(). -*/ -void -#ifdef __STDC__ -tuiEraseAllSourceWinsContent ( - int displayPrompt) -#else -tuiEraseAllSourceWinsContent (displayPrompt) - int displayPrompt; -#endif -{ - int i; - - for (i = 0; i < (sourceWindows ())->count; i++) - tuiEraseSourceContent ((TuiWinInfoPtr) (sourceWindows ())->list[i], - displayPrompt); - - return; -} /* tuiEraseAllSourceWinsContent */ - - -/* -** tuiShowSourceContent(). -*/ -void -#ifdef __STDC__ -tuiShowSourceContent ( - TuiWinInfoPtr winInfo) -#else -tuiShowSourceContent (winInfo) - TuiWinInfoPtr winInfo; -#endif -{ - int curLine, i, curX; - - tuiEraseSourceContent (winInfo, (winInfo->generic.contentSize <= 0)); - if (winInfo->generic.contentSize > 0) - { - char *line; - - for (curLine = 1; (curLine <= winInfo->generic.contentSize); curLine++) - mvwaddstr ( - winInfo->generic.handle, - curLine, - 1, - ((TuiWinElementPtr) - winInfo->generic.content[curLine - 1])->whichElement.source.line); - } - checkAndDisplayHighlightIfNeeded (winInfo); - tuiRefreshWin (&winInfo->generic); - winInfo->generic.contentInUse = TRUE; - - return; -} /* tuiShowSourceContent */ - - -/* -** tuiShowAllSourceWinsContent() -*/ -void -#ifdef __STDC__ -tuiShowAllSourceWinsContent (void) -#else -tuiShowAllSourceWinsContent () -#endif -{ - int i; - - for (i = 0; i < (sourceWindows ())->count; i++) - tuiShowSourceContent ((TuiWinInfoPtr) (sourceWindows ())->list[i]); - - return; -} /* tuiShowAllSourceWinsContent */ - - -/* -** tuiHorizontalSourceScroll(). -** Scroll the source forward or backward horizontally -*/ -void -#ifdef __STDC__ -tuiHorizontalSourceScroll ( - TuiWinInfoPtr winInfo, - TuiScrollDirection direction, - int numToScroll) -#else -tuiHorizontalSourceScroll (winInfo, direction, numToScroll) - TuiWinInfoPtr winInfo; - TuiScrollDirection direction; - int numToScroll; -#endif -{ - if (winInfo->generic.content != (OpaquePtr) NULL) - { - int offset; - struct symtab *s; - - if (current_source_symtab == (struct symtab *) NULL) - s = find_pc_symtab (selected_frame->pc); - else - s = current_source_symtab; - - if (direction == LEFT_SCROLL) - offset = winInfo->detail.sourceInfo.horizontalOffset + numToScroll; - else - { - if ((offset = - winInfo->detail.sourceInfo.horizontalOffset - numToScroll) < 0) - offset = 0; - } - winInfo->detail.sourceInfo.horizontalOffset = offset; - tuiUpdateSourceWindowAsIs ( - winInfo, - s, - ((winInfo == srcWin) ? - (Opaque) ((TuiWinElementPtr) - winInfo->generic.content[0])->whichElement.source.lineOrAddr.lineNo : - (Opaque) ((TuiWinElementPtr) - winInfo->generic.content[0])->whichElement.source.lineOrAddr.addr), - (int) FALSE); - } - - return; -} /* tuiHorizontalSourceScroll */ - - -/* -** tuiSetHasExecPointAt(). -** Set or clear the hasBreak flag in the line whose line is lineNo. -*/ -void -#ifdef __STDC__ -tuiSetIsExecPointAt ( - Opaque lineOrAddr, - TuiWinInfoPtr winInfo) -#else -tuiSetIsExecPointAt (lineOrAddr, winInfo) - Opaque lineOrAddr; - TuiWinInfoPtr winInfo; -#endif -{ - int i; - TuiWinContent content = (TuiWinContent) winInfo->generic.content; - - i = 0; - while (i < winInfo->generic.contentSize) - { - if (content[i]->whichElement.source.lineOrAddr.addr == lineOrAddr) - content[i]->whichElement.source.isExecPoint = TRUE; - else - content[i]->whichElement.source.isExecPoint = FALSE; - i++; - } - - return; -} /* tuiSetIsExecPointAt */ - - -/* -** tuiSetHasBreakAt(). -** Set or clear the hasBreak flag in the line whose line is lineNo. -*/ -void -#ifdef __STDC__ -tuiSetHasBreakAt ( - struct breakpoint *bp, - TuiWinInfoPtr winInfo, - int hasBreak) -#else -tuiSetHasBreakAt (bp, winInfo, hasBreak) - struct breakpoint *bp; - TuiWinInfoPtr winInfo; - int hasBreak; -#endif -{ - int i; - TuiWinContent content = (TuiWinContent) winInfo->generic.content; - - i = 0; - while (i < winInfo->generic.contentSize) - { - int gotIt; - TuiGenWinInfoPtr locator = locatorWinInfoPtr (); - - if (winInfo == srcWin) - { - char *fileNameDisplayed = (char *) NULL; - - if (((TuiWinElementPtr) - locator->content[0])->whichElement.locator.fileName != - (char *) NULL) - fileNameDisplayed = ((TuiWinElementPtr) - locator->content[0])->whichElement.locator.fileName; - else if (current_source_symtab != (struct symtab *) NULL) - fileNameDisplayed = current_source_symtab->filename; - - gotIt = (fileNameDisplayed != (char *) NULL && - (strcmp (bp->source_file, fileNameDisplayed) == 0) && - content[i]->whichElement.source.lineOrAddr.lineNo == - bp->line_number); - } - else - gotIt = (content[i]->whichElement.source.lineOrAddr.addr - == (Opaque) bp->address); - if (gotIt) - { - content[i]->whichElement.source.hasBreak = hasBreak; - break; - } - i++; - } - - return; -} /* tuiSetHasBreakAt */ - - -/* -** tuiAllSetHasBreakAt(). -** Set or clear the hasBreak flag in all displayed source windows. -*/ -void -#ifdef __STDC__ -tuiAllSetHasBreakAt ( - struct breakpoint *bp, - int hasBreak) -#else -tuiAllSetHasBreakAt (bp, hasBreak) - struct breakpoint *bp; - int hasBreak; -#endif -{ - int i; - - for (i = 0; i < (sourceWindows ())->count; i++) - tuiSetHasBreakAt (bp, - (TuiWinInfoPtr) (sourceWindows ())->list[i], hasBreak); - - return; -} /* tuiAllSetHasBreakAt */ - - -/* -** tui_vAllSetHasBreakAt() -** Set or clear the hasBreak flag in all displayed source windows, -** with params in a va_list -*/ -void -#ifdef __STDC__ -tui_vAllSetHasBreakAt ( - va_list args) -#else -tui_vAllSetHasBreakAt (args) - va_list args; -#endif -{ - struct breakpoint *bp = va_arg (args, struct breakpoint *); - int hasBreak = va_arg (args, int); - - tuiAllSetHasBreakAt (bp, hasBreak); - - return; -} /* tui_vAllSetHasBreakAt */ - - - -/********************************* -** EXECUTION INFO FUNCTIONS ** -*********************************/ - -/* -** tuiSetExecInfoContent(). -** Function to initialize the content of the execution info window, -** based upon the input window which is either the source or -** disassembly window. -*/ -TuiStatus -#ifdef __STDC__ -tuiSetExecInfoContent ( - TuiWinInfoPtr winInfo) -#else -tuiSetExecInfoContent (winInfo) - TuiWinInfoPtr winInfo; -#endif -{ - TuiStatus ret = TUI_SUCCESS; - - if (winInfo->detail.sourceInfo.executionInfo != (TuiGenWinInfoPtr) NULL) - { - TuiGenWinInfoPtr execInfoPtr = winInfo->detail.sourceInfo.executionInfo; - - if (execInfoPtr->content == (OpaquePtr) NULL) - execInfoPtr->content = - (OpaquePtr) allocContent (winInfo->generic.height, - execInfoPtr->type); - if (execInfoPtr->content != (OpaquePtr) NULL) - { - int i; - - for (i = 0; i < winInfo->generic.contentSize; i++) - { - TuiWinElementPtr element; - TuiWinElementPtr srcElement; - - element = (TuiWinElementPtr) execInfoPtr->content[i]; - srcElement = (TuiWinElementPtr) winInfo->generic.content[i]; - /* - ** First check to see if we have a breakpoint that is - ** temporary. If so, and this is our current execution point, - ** then clear the break indicator. - */ - if (srcElement->whichElement.source.hasBreak && - srcElement->whichElement.source.isExecPoint) - { - struct breakpoint *bp; - int found = FALSE; - extern struct breakpoint *breakpoint_chain; - - for (bp = breakpoint_chain; - (bp != (struct breakpoint *) NULL && !found); - bp = bp->next) - { - found = - (winInfo == srcWin && - bp->line_number == - srcElement->whichElement.source.lineOrAddr.lineNo) || - (winInfo == disassemWin && - bp->address == (CORE_ADDR) - srcElement->whichElement.source.lineOrAddr.addr); - if (found) - srcElement->whichElement.source.hasBreak = - (bp->disposition != del || bp->hit_count <= 0); - } - if (!found) - srcElement->whichElement.source.hasBreak = FALSE; - } - /* - ** Now update the exec info content based upon the state - ** of each line as indicated by the source content. - */ - if (srcElement->whichElement.source.hasBreak && - srcElement->whichElement.source.isExecPoint) - element->whichElement.simpleString = breakLocationStr (); - else if (srcElement->whichElement.source.hasBreak) - element->whichElement.simpleString = breakStr (); - else if (srcElement->whichElement.source.isExecPoint) - element->whichElement.simpleString = locationStr (); - else - element->whichElement.simpleString = blankStr (); - } - execInfoPtr->contentSize = winInfo->generic.contentSize; - } - else - ret = TUI_FAILURE; - } - - return ret; -} /* tuiSetExecInfoContent */ - - -/* -** tuiShowExecInfoContent(). -*/ -void -#ifdef __STDC__ -tuiShowExecInfoContent ( - TuiWinInfoPtr winInfo) -#else -tuiShowExecInfoContent (winInfo) - TuiWinInfoPtr winInfo; -#endif -{ - TuiGenWinInfoPtr execInfo = winInfo->detail.sourceInfo.executionInfo; - int curLine; - - werase (execInfo->handle); - tuiRefreshWin (execInfo); - for (curLine = 1; (curLine <= execInfo->contentSize); curLine++) - mvwaddstr (execInfo->handle, - curLine, - 0, - ((TuiWinElementPtr) - execInfo->content[curLine - 1])->whichElement.simpleString); - tuiRefreshWin (execInfo); - execInfo->contentInUse = TRUE; - - return; -} /* tuiShowExecInfoContent */ - - -/* -** tuiShowAllExecInfosContent() -*/ -void -#ifdef __STDC__ -tuiShowAllExecInfosContent (void) -#else -tuiShowAllExecInfosContent () -#endif -{ - int i; - - for (i = 0; i < (sourceWindows ())->count; i++) - tuiShowExecInfoContent ((TuiWinInfoPtr) (sourceWindows ())->list[i]); - - return; -} /* tuiShowAllExecInfosContent */ - - -/* -** tuiEraseExecInfoContent(). -*/ -void -#ifdef __STDC__ -tuiEraseExecInfoContent ( - TuiWinInfoPtr winInfo) -#else -tuiEraseExecInfoContent (winInfo) - TuiWinInfoPtr winInfo; -#endif -{ - TuiGenWinInfoPtr execInfo = winInfo->detail.sourceInfo.executionInfo; - - werase (execInfo->handle); - tuiRefreshWin (execInfo); - - return; -} /* tuiEraseExecInfoContent */ - - -/* -** tuiEraseAllExecInfosContent() -*/ -void -#ifdef __STDC__ -tuiEraseAllExecInfosContent (void) -#else -tuiEraseAllExecInfosContent () -#endif -{ - int i; - - for (i = 0; i < (sourceWindows ())->count; i++) - tuiEraseExecInfoContent ((TuiWinInfoPtr) (sourceWindows ())->list[i]); - - return; -} /* tuiEraseAllExecInfosContent */ - - -/* -** tuiClearExecInfoContent(). -*/ -void -#ifdef __STDC__ -tuiClearExecInfoContent ( - TuiWinInfoPtr winInfo) -#else -tuiClearExecInfoContent (winInfo) - TuiWinInfoPtr winInfo; -#endif -{ - winInfo->detail.sourceInfo.executionInfo->contentInUse = FALSE; - tuiEraseExecInfoContent (winInfo); - - return; -} /* tuiClearExecInfoContent */ - - -/* -** tuiClearAllExecInfosContent() -*/ -void -#ifdef __STDC__ -tuiClearAllExecInfosContent (void) -#else -tuiClearAllExecInfosContent () -#endif -{ - int i; - - for (i = 0; i < (sourceWindows ())->count; i++) - tuiClearExecInfoContent ((TuiWinInfoPtr) (sourceWindows ())->list[i]); - - return; -} /* tuiClearAllExecInfosContent */ - - -/* -** tuiUpdateExecInfo(). -** Function to update the execution info window -*/ -void -#ifdef __STDC__ -tuiUpdateExecInfo ( - TuiWinInfoPtr winInfo) -#else -tuiUpdateExecInfo (winInfo) - TuiWinInfoPtr winInfo; -#endif -{ - tuiSetExecInfoContent (winInfo); - tuiShowExecInfoContent (winInfo); -} /* tuiUpdateExecInfo - - -/* -** tuiUpdateAllExecInfos() -*/ -void -#ifdef __STDC__ -tuiUpdateAllExecInfos (void) -#else -tuiUpdateAllExecInfos () -#endif -{ - int i; - - for (i = 0; i < (sourceWindows ())->count; i++) - tuiUpdateExecInfo ((TuiWinInfoPtr) (sourceWindows ())->list[i]); - - return; -} /* tuiUpdateAllExecInfos*/ - - - -/* tuiUpdateOnEnd() -** elz: This function clears the execution info from the source windows -** and resets the locator to display no line info, procedure info, pc -** info. It is called by stack_publish_stopped_with_no_frame, which -** is called then the target terminates execution -*/ -void -#ifdef __STDC__ -tuiUpdateOnEnd (void) -#else -tuiUpdateOnEnd () -#endif -{ - int i; - TuiGenWinInfoPtr locator; - char *filename; - TuiWinInfoPtr winInfo; - - locator = locatorWinInfoPtr (); - - /* for all the windows (src, asm) */ - for (i = 0; i < (sourceWindows ())->count; i++) - { - winInfo = (TuiWinInfoPtr) (sourceWindows ())->list[i]; - - tuiSetIsExecPointAt ((Opaque) - 1, winInfo); /* the target is'n running */ - /* -1 should not match any line number or pc */ - tuiSetExecInfoContent (winInfo); /*set winInfo so that > is'n displayed*/ - tuiShowExecInfoContent (winInfo); /* display the new contents */ - } - - /*now update the locator*/ - tuiClearLocatorDisplay (); - tuiGetLocatorFilename (locator, &filename); - tuiSetLocatorInfo ( - filename, - (char *) NULL, - 0, - (Opaque) NULL, - &((TuiWinElementPtr) locator->content[0])->whichElement.locator); - tuiShowLocatorContent (); - - return; -} /* tuiUpdateOnEnd */ - - - -TuiStatus -#ifdef __STDC__ -tuiAllocSourceBuffer ( - TuiWinInfoPtr winInfo) -#else -tuiAllocSourceBuffer (winInfo) - TuiWinInfoPtr winInfo; -#endif -{ - register char *srcLine, *srcLineBuf; - register int i, lineWidth, c, maxLines; - TuiStatus ret = TUI_FAILURE; - - maxLines = winInfo->generic.height; /* less the highlight box */ - lineWidth = winInfo->generic.width - 1; - /* - ** Allocate the buffer for the source lines. Do this only once since they - ** will be re-used for all source displays. The only other time this will - ** be done is when a window's size changes. - */ - if (winInfo->generic.content == (OpaquePtr) NULL) - { - srcLineBuf = (char *) xmalloc ((maxLines * lineWidth) * sizeof (char)); - if (srcLineBuf == (char *) NULL) - fputs_unfiltered ( - "Unable to Allocate Memory for Source or Disassembly Display.\n", - gdb_stderr); - else - { - /* allocate the content list */ - if ((winInfo->generic.content = - (OpaquePtr) allocContent (maxLines, SRC_WIN)) == (OpaquePtr) NULL) - { - tuiFree (srcLineBuf); - srcLineBuf = (char *) NULL; - fputs_unfiltered ( - "Unable to Allocate Memory for Source or Disassembly Display.\n", - gdb_stderr); - } - } - for (i = 0; i < maxLines; i++) - ((TuiWinElementPtr) - winInfo->generic.content[i])->whichElement.source.line = - srcLineBuf + (lineWidth * i); - ret = TUI_SUCCESS; - } - else - ret = TUI_SUCCESS; - - return ret; -} /* tuiAllocSourceBuffer */ - - -/* -** tuiLineIsDisplayed(). -** Answer whether the a particular line number or address is displayed -** in the current source window. -*/ -int -#ifdef __STDC__ -tuiLineIsDisplayed ( - Opaque lineNoOrAddr, - TuiWinInfoPtr winInfo, - int checkThreshold) -#else -tuiLineIsDisplayed (lineNoOrAddr, winInfo, checkThreshold) - Opaque lineNoOrAddr; - TuiWinInfoPtr winInfo; - int checkThreshold; -#endif -{ - int isDisplayed = FALSE; - int i, threshold; - - if (checkThreshold) - threshold = SCROLL_THRESHOLD; - else - threshold = 0; - i = 0; - while (i < winInfo->generic.contentSize - threshold && !isDisplayed) - { - if (winInfo == srcWin) - isDisplayed = (((TuiWinElementPtr) - winInfo->generic.content[i])->whichElement.source.lineOrAddr.lineNo - == (int) lineNoOrAddr); - else - isDisplayed = (((TuiWinElementPtr) - winInfo->generic.content[i])->whichElement.source.lineOrAddr.addr - == lineNoOrAddr); - i++; - } - - return isDisplayed; -} /* tuiLineIsDisplayed */ - - -/***************************************** -** STATIC LOCAL FUNCTIONS ** -******************************************/ diff --git a/contrib/gdb/gdb/tui/tuiSourceWin.h b/contrib/gdb/gdb/tui/tuiSourceWin.h deleted file mode 100644 index 13f3a78ab1801..0000000000000 --- a/contrib/gdb/gdb/tui/tuiSourceWin.h +++ /dev/null @@ -1,74 +0,0 @@ -#ifndef _TUI_SOURCEWIN_H -#define _TUI_SOURCEWIN_H -/* -** This header file supports -*/ - - -extern void tuiDisplayMainFunction PARAMS ((void)); -extern void tuiUpdateSourceWindow PARAMS - ((TuiWinInfoPtr, struct symtab *, Opaque, int)); -extern void tuiUpdateSourceWindowAsIs PARAMS - ((TuiWinInfoPtr, struct symtab *, Opaque, int)); -extern void tuiUpdateSourceWindowsWithAddr PARAMS ((Opaque)); -extern void tui_vUpdateSourceWindowsWithAddr PARAMS ((va_list)); -extern void tuiUpdateSourceWindowsWithLine PARAMS ((struct symtab *, int)); -extern void tui_vUpdateSourceWindowsWithLine PARAMS ((va_list)); -extern void tuiUpdateSourceWindowsFromLocator PARAMS ((void)); -extern void tuiClearSourceContent PARAMS ((TuiWinInfoPtr, int)); -extern void tuiClearAllSourceWinsContent PARAMS ((int)); -extern void tuiEraseSourceContent PARAMS ((TuiWinInfoPtr, int)); -extern void tuiEraseAllSourceWinsContent PARAMS ((int)); -extern void tuiSetSourceContentNil PARAMS ((TuiWinInfoPtr, char *)); -extern void tuiShowSourceContent PARAMS ((TuiWinInfoPtr)); -extern void tuiShowAllSourceWinsContent PARAMS ((void)); -extern void tuiHorizontalSourceScroll PARAMS ((TuiWinInfoPtr, TuiScrollDirection, int)); -extern void tuiUpdateOnEnd PARAMS ((void)); - -extern TuiStatus tuiSetExecInfoContent PARAMS ((TuiWinInfoPtr)); -extern void tuiShowExecInfoContent PARAMS ((TuiWinInfoPtr)); -extern void tuiShowAllExecInfosContent PARAMS ((void)); -extern void tuiEraseExecInfoContent PARAMS ((TuiWinInfoPtr)); -extern void tuiEraseAllExecInfosContent PARAMS ((void)); -extern void tuiClearExecInfoContent PARAMS ((TuiWinInfoPtr)); -extern void tuiClearAllExecInfosContent PARAMS ((void)); -extern void tuiUpdateExecInfo PARAMS ((TuiWinInfoPtr)); -extern void tuiUpdateAllExecInfos PARAMS ((void)); - -extern void tuiSetIsExecPointAt PARAMS ((Opaque, TuiWinInfoPtr)); -extern void tuiSetHasBreakAt PARAMS ((struct breakpoint *, TuiWinInfoPtr, int)); -extern void tuiAllSetHasBreakAt PARAMS ((struct breakpoint *, int)); -extern void tui_vAllSetHasBreakAt PARAMS ((va_list)); -extern TuiStatus tuiAllocSourceBuffer PARAMS ((TuiWinInfoPtr)); -extern int tuiLineIsDisplayed PARAMS ((Opaque, TuiWinInfoPtr, int)); - - -/* -** Constant definitions -*/ -#define SCROLL_THRESHOLD 2 /* threshold for lazy scroll */ - - -/* -** Macros -*/ -#define m_tuiSetBreakAt(bp, winInfo) tuiSetHasBreakAt((bp, winInfo, TRUE) -#define m_tuiClearBreakAt(bp, winInfo) tuiSetHasBreakAt(bp, winInfo, FALSE) - -#define m_tuiAllSetBreakAt(bp) tuiAllSetHasBreakAt(bp, TRUE) -#define m_tuiAllClearBreakAt(bp) tuiAllSetHasBreakAt(bp, FALSE) - -#define m_tuiSrcLineDisplayed(lineNo) tuiLineIsDisplayed((Opaque)(lineNo), srcWin, FALSE) -#define m_tuiSrcAddrDisplayed(addr) tuiLineIsDisplayed((Opaque)(addr), disassemWin, FALSE) -#define m_tuiSrcLineDisplayedWithinThreshold(lineNo) \ - tuiLineIsDisplayed((Opaque)(lineNo), srcWin, TRUE) -#define m_tuiSrcAddrDisplayedWithinThreshold(addr) \ - tuiLineIsDisplayed((Opaque)(addr), disassemWin, TRUE) -#define m_tuiLineDisplayedWithinThreshold(winInfo, lineOrAddr) \ - ( (winInfo == srcWin) ? \ - m_tuiSrcLineDisplayedWithinThreshold(lineOrAddr) : \ - m_tuiSrcAddrDisplayedWithinThreshold(lineOrAddr) ) - - - -#endif /*_TUI_SOURCEWIN_H */ diff --git a/contrib/gdb/gdb/tui/tuiStack.c b/contrib/gdb/gdb/tui/tuiStack.c deleted file mode 100644 index 401dfe23d82c4..0000000000000 --- a/contrib/gdb/gdb/tui/tuiStack.c +++ /dev/null @@ -1,554 +0,0 @@ -/* -** This module contains functions for displaying the locator information in the locator window. -*/ - -#include "defs.h" -#include "symtab.h" -#include "breakpoint.h" -#include "frame.h" - -#include "tui.h" -#include "tuiData.h" -#include "tuiStack.h" -#include "tuiSourceWin.h" - - -/***************************************** -** STATIC LOCAL FUNCTIONS FORWARD DECLS ** -******************************************/ - -static char *_getFuncNameFromFrame PARAMS ((struct frame_info *)); -static void _tuiUpdateLocation_command PARAMS ((char *, int)); - - - -/***************************************** -** PUBLIC FUNCTION ** -******************************************/ - -/* -** tuiClearLocatorDisplay() -*/ -void -#ifdef __STDC__ -tuiClearLocatorDisplay (void) -#else -tuiClearLocatorDisplay () -#endif -{ - TuiGenWinInfoPtr locator = locatorWinInfoPtr (); - int i; - - if (locator->handle != (WINDOW *) NULL) - { - /* No need to werase, since writing a line of - * blanks which we do below, is equivalent. - */ - /* werase(locator->handle); */ - wmove (locator->handle, 0, 0); - wstandout (locator->handle); - for (i = 0; i < locator->width; i++) - waddch (locator->handle, ' '); - wstandend (locator->handle); - tuiRefreshWin (locator); - wmove (locator->handle, 0, 0); - locator->contentInUse = FALSE; - } - - return; -} /* tuiClearLocatorDisplay */ - - -/* -** tuiShowLocatorContent() -*/ -void -#ifdef __STDC__ -tuiShowLocatorContent (void) -#else -tuiShowLocatorContent () -#endif -{ - char *string; - TuiGenWinInfoPtr locator; - - locator = locatorWinInfoPtr (); - - if (m_genWinPtrNotNull (locator) && locator->handle != (WINDOW *) NULL) - { - string = displayableWinContentAt (locator, 0); - if (string != (char *) NULL) - { - wmove (locator->handle, 0, 0); - wstandout (locator->handle); - waddstr (locator->handle, string); - wstandend (locator->handle); - tuiRefreshWin (locator); - wmove (locator->handle, 0, 0); - if (string != nullStr ()) - tuiFree (string); - locator->contentInUse = TRUE; - } - } - - return; -} /* tuiShowLocatorContent */ - - -/* -** tuiSetLocatorInfo(). -** Function to update the locator, with the provided arguments. -*/ -void -#ifdef __STDC__ -tuiSetLocatorInfo ( - char *fname, - char *procname, - int lineNo, - Opaque addr, - TuiLocatorElementPtr element) -#else -tuiSetLocatorInfo (fname, procname, lineNo, addr, element) - char *fname; - char *procname; - int lineNo; - Opaque addr; - TuiLocatorElementPtr element; -#endif -{ -#ifdef COMMENT - /* first free the old info */ - if (element->fileName) - tuiFree (element->fileName); - if (element->procName) - tuiFree (element->procName); - - if (fname == (char *) NULL) - element->fileName = fname; - else - element->fileName = tuiStrDup (fname); - if (procname == (char *) NULL) - element->procName = procname; - else - element->procName = tuiStrDup (procname); -#else - element->fileName[0] = (char) 0; - element->procName[0] = (char) 0; - strcat_to_buf (element->fileName, MAX_LOCATOR_ELEMENT_LEN, fname); - strcat_to_buf (element->procName, MAX_LOCATOR_ELEMENT_LEN, procname); -#endif - element->lineNo = lineNo; - element->addr = (Opaque) addr; - - return; -} /* tuiSetLocatorInfo */ - - -/* -** tuiUpdateLocatorFilename(). -** Update only the filename portion of the locator. -*/ -void -#ifdef __STDC__ -tuiUpdateLocatorFilename ( - char *fileName) -#else -tuiUpdateLocatorFilename (fileName) - char *fileName; -#endif -{ - TuiGenWinInfoPtr locator = locatorWinInfoPtr (); - - if (locator->content[0] == (Opaque) NULL) - tuiSetLocatorContent ((struct frame_info *) NULL); - ((TuiWinElementPtr) locator->content[0])->whichElement.locator.fileName[0] = (char) 0; - strcat_to_buf (((TuiWinElementPtr) locator->content[0])->whichElement.locator.fileName, - MAX_LOCATOR_ELEMENT_LEN, - fileName); - - tuiShowLocatorContent (); - - return; -} /* tuiUpdateLocatorFilename */ - - -/* -** tui_vUpdateLocatorFilename(). -** Update only the filename portion of the locator with args in a va_list. -*/ -void -#ifdef __STDC__ -tui_vUpdateLocatorFilename ( - va_list args) -#else -tui_vUpdateLocatorFilename (args) - va_list args; -#endif -{ - char *fileName; - - fileName = va_arg (args, char *); - tuiUpdateLocatorFilename (fileName); - - return; -} /* tui_vUpdateLocatorFilename */ - - -/* -** tuiSwitchFilename(). -** Update the filename portion of the locator. Clear the other info in locator. -** (elz) -*/ -void -#ifdef __STDC__ -tuiSwitchFilename ( - char *fileName) -#else -tuiSwitchFilename (fileName) - char *fileName; -#endif -{ - TuiGenWinInfoPtr locator = locatorWinInfoPtr (); - - if (locator->content[0] == (Opaque) NULL) - tuiSetLocatorContent ((struct frame_info *) NULL); - ((TuiWinElementPtr) locator->content[0])->whichElement.locator.fileName[0] = (char) 0; - - tuiSetLocatorInfo (fileName, - (char *) NULL, - 0, - (Opaque) NULL, - &((TuiWinElementPtr) locator->content[0])->whichElement.locator); - - tuiShowLocatorContent (); - - return; -} /* tuiSwitchFilename */ - - -/* -** tuiGetLocatorFilename(). -** Get the filename portion of the locator. -** (elz) -*/ -void -#ifdef __STDC__ -tuiGetLocatorFilename ( - TuiGenWinInfoPtr locator, - char **filename) -#else -tuiGetLocatorFilename (locator, filename) - TuiGenWinInfoPtr locator; - char **filename; -#endif -{ - - /* the current filename could be non known, in which case the xmalloc would - allocate no memory, because the length would be 0 */ - if (((TuiWinElementPtr) locator->content[0])->whichElement.locator.fileName) - { - int name_length = - strlen (((TuiWinElementPtr) locator->content[0])->whichElement.locator.fileName); - - (*filename) = (char *) xmalloc (name_length + 1); - strcpy ((*filename), - ((TuiWinElementPtr) locator->content[0])->whichElement.locator.fileName); - } - - return; -} /* tuiGetLocatorFilename */ - - -/* -** tuiUpdateLocatorInfoFromFrame(). -** Function to update the locator, with the information extracted from frameInfo -*/ -void -#ifdef __STDC__ -tuiUpdateLocatorInfoFromFrame ( - struct frame_info *frameInfo, - TuiLocatorElementPtr element) -#else -tuiUpdateLocatorInfoFromFrame (frameInfo, element) - struct frame_info *frameInfo; - TuiLocatorElementPtr element; -#endif -{ - struct symtab_and_line symtabAndLine; - - /* now get the new info */ - symtabAndLine = find_pc_line (frameInfo->pc, - (frameInfo->next != (struct frame_info *) NULL && - !frameInfo->next->signal_handler_caller && - !frame_in_dummy (frameInfo->next))); - if (symtabAndLine.symtab && symtabAndLine.symtab->filename) - tuiSetLocatorInfo (symtabAndLine.symtab->filename, - _getFuncNameFromFrame (frameInfo), - symtabAndLine.line, - (Opaque) frameInfo->pc, - element); - else - tuiSetLocatorInfo ((char *) NULL, - _getFuncNameFromFrame (frameInfo), - 0, - (Opaque) frameInfo->pc, - element); - - return; -} /* tuiUpdateLocatorInfoFromFrame */ - - -/* -** tuiSetLocatorContent(). -** Function to set the content of the locator -*/ -void -#ifdef __STDC__ -tuiSetLocatorContent ( - struct frame_info *frameInfo) -#else -tuiSetLocatorContent (frameInfo) - struct frame_info *frameInfo; -#endif -{ - TuiGenWinInfoPtr locator = locatorWinInfoPtr (); - TuiWinElementPtr element; - struct symtab_and_line symtabAndLine; - - /* Allocate the element if necessary */ - if (locator->contentSize <= 0) - { - TuiWinContent contentPtr; - - if ((locator->content = (OpaquePtr) allocContent (1, locator->type)) == (OpaquePtr) NULL) - error ("Unable to Allocate Memory to Display Location."); - locator->contentSize = 1; - } - - if (frameInfo != (struct frame_info *) NULL) - tuiUpdateLocatorInfoFromFrame (frameInfo, - &((TuiWinElementPtr) locator->content[0])->whichElement.locator); - else - tuiSetLocatorInfo ((char *) NULL, - (char *) NULL, - 0, - (Opaque) NULL, - &((TuiWinElementPtr) locator->content[0])->whichElement.locator); - return; -} /* tuiSetLocatorContent */ - - -/* -** tuiUpdateLocatorDisplay(). -** Function to update the locator display -*/ -void -#ifdef __STDC__ -tuiUpdateLocatorDisplay ( - struct frame_info *frameInfo) -#else -tuiUpdateLocatorDisplay (frameInfo) - struct frame_info *frameInfo; -#endif -{ - tuiClearLocatorDisplay (); - tuiSetLocatorContent (frameInfo); - tuiShowLocatorContent (); - - return; -} /* tuiUpdateLocatorDisplay */ - - -/* -** tuiShowFrameInfo(). -** Function to print the frame inforrmation for the TUI. -*/ -void -#ifdef __STDC__ -tuiShowFrameInfo ( - struct frame_info *fi) -#else -tuiShowFrameInfo (fi) - struct frame_info *fi; -#endif -{ - TuiWinInfoPtr winInfo; - register int i; - - if (fi) - { - register int startLine, i; - register struct symtab *s; - CORE_ADDR low; - TuiGenWinInfoPtr locator = locatorWinInfoPtr (); - int sourceAlreadyDisplayed; - - - s = find_pc_symtab (fi->pc); - sourceAlreadyDisplayed = tuiSourceIsDisplayed (s->filename); - tuiUpdateLocatorDisplay (fi); - for (i = 0; i < (sourceWindows ())->count; i++) - { - winInfo = (TuiWinInfoPtr) (sourceWindows ())->list[i]; - if (winInfo == srcWin) - { - startLine = - (((TuiWinElementPtr) locator->content[0])->whichElement.locator.lineNo - - (winInfo->generic.viewportHeight / 2)) + 1; - if (startLine <= 0) - startLine = 1; - } - else - { - if (find_pc_partial_function (fi->pc, (char **) NULL, &low, (CORE_ADDR) NULL) == 0) - error ("No function contains program counter for selected frame.\n"); - else - low = (CORE_ADDR) tuiGetLowDisassemblyAddress ((Opaque) low, (Opaque) fi->pc); - } - - if (winInfo == srcWin) - { - if (!(sourceAlreadyDisplayed && m_tuiLineDisplayedWithinThreshold ( - winInfo, - ((TuiWinElementPtr) locator->content[0])->whichElement.locator.lineNo))) - tuiUpdateSourceWindow (winInfo, s, (Opaque) startLine, TRUE); - else - tuiSetIsExecPointAt ((Opaque) - ((TuiWinElementPtr) locator->content[0])->whichElement.locator.lineNo, - winInfo); - } - else - { - if (winInfo == disassemWin) - { - if (!m_tuiLineDisplayedWithinThreshold (winInfo, - ((TuiWinElementPtr) locator->content[0])->whichElement.locator.addr)) - tuiUpdateSourceWindow (winInfo, s, (Opaque) low, TRUE); - else - tuiSetIsExecPointAt ((Opaque) - ((TuiWinElementPtr) locator->content[0])->whichElement.locator.addr, - winInfo); - } - } - tuiUpdateExecInfo (winInfo); - } - } - else - { - tuiUpdateLocatorDisplay (fi); - for (i = 0; i < (sourceWindows ())->count; i++) - { - winInfo = (TuiWinInfoPtr) (sourceWindows ())->list[i]; - tuiClearSourceContent (winInfo, EMPTY_SOURCE_PROMPT); - tuiUpdateExecInfo (winInfo); - } - } - - return; -} /* tuiShowFrameInfo */ - - -/* -** tui_vShowFrameInfo(). -** Function to print the frame inforrmation for the TUI with args in a va_list. -*/ -void -#ifdef __STDC__ -tui_vShowFrameInfo ( - va_list args) -#else -tui_vShowFrameInfo (args) - va_list args; -#endif -{ - struct frame_info *fi; - - fi = va_arg (args, struct frame_info *); - tuiShowFrameInfo (fi); - - return; -} /* tui_vShowFrameInfo */ - - -/* -** _initialize_tuiStack(). -** Function to initialize gdb commands, for tui window stack manipulation. -*/ -void -_initialize_tuiStack () -{ - if (tui_version) - { - add_com ("update", class_tui, _tuiUpdateLocation_command, - "Update the source window and locator to display the current execution point.\n"); - } - - return; -} /* _initialize_tuiStack */ - - -/***************************************** -** STATIC LOCAL FUNCTIONS ** -******************************************/ - -/* -** _getFuncNameFromFrame(). -*/ -static char * -#ifdef __STDC__ -_getFuncNameFromFrame ( - struct frame_info *frameInfo) -#else -_getFuncNameFromFrame (frameInfo) - struct frame_info *frameInfo; -#endif -{ - char *funcName = (char *) NULL; - - find_pc_partial_function (frameInfo->pc, - &funcName, - (CORE_ADDR *) NULL, - (CORE_ADDR *) NULL); - return funcName; -} /* _getFuncNameFromFrame */ - - -/* -** _tuiUpdateLocation_command(). -** Command to update the display with the current execution point -*/ -static void -#ifdef __STDC__ -_tuiUpdateLocation_command ( - char *arg, - int fromTTY) -#else -_tuiUpdateLocation_command (arg, fromTTY) - char *arg; - int fromTTY; -#endif -{ -#ifndef TRY - extern void frame_command PARAMS ((char *, int)); - frame_command ("0", FALSE); -#else - struct frame_info *curFrame; - - /* Obtain the current execution point */ - if ((curFrame = get_current_frame ()) != (struct frame_info *) NULL) - { - struct frame_info *frame; - int curLevel = 0; - - for (frame = get_prev_frame (curLevel); - (frame != (struct frame_info *) NULL && (frame != curFrame)); - frame = get_prev_frame (frame)) - curLevel++; - - if (curFrame != (struct frame_info *) NULL) - print_frame_info (frame, curLevel, 0, 1); - } -#endif - - return; -} /* _tuiUpdateLocation_command */ diff --git a/contrib/gdb/gdb/tui/tuiStack.h b/contrib/gdb/gdb/tui/tuiStack.h deleted file mode 100644 index 20e9a92c61c2b..0000000000000 --- a/contrib/gdb/gdb/tui/tuiStack.h +++ /dev/null @@ -1,22 +0,0 @@ -#ifndef _TUI_STACK_H -#define _TUI_STACK_H -/* -** This header file supports -*/ - -extern void tuiSetLocatorInfo PARAMS ((char *, char *, int, Opaque, TuiLocatorElementPtr)); -extern void tuiUpdateLocatorFilename PARAMS ((char *)); -extern void tui_vUpdateLocatorFilename PARAMS ((va_list)); -extern void tuiUpdateLocatorInfoFromFrame - PARAMS ((struct frame_info *, TuiLocatorElementPtr)); -extern void tuiUpdateLocatorDisplay PARAMS ((struct frame_info *)); -extern void tuiSetLocatorContent PARAMS ((struct frame_info *)); -extern void tuiShowLocatorContent PARAMS ((void)); -extern void tuiClearLocatorContent PARAMS ((void)); -extern void tuiSwitchFilename PARAMS ((char *)); -extern void tuiShowFrameInfo PARAMS ((struct frame_info *)); -extern void tui_vShowFrameInfo PARAMS ((va_list)); -extern void tuiGetLocatorFilename PARAMS ((TuiGenWinInfoPtr, char **)); - - -#endif /*_TUI_STACK_H*/ diff --git a/contrib/gdb/gdb/tui/tuiWin.c b/contrib/gdb/gdb/tui/tuiWin.c deleted file mode 100644 index 45bb0f6a4e921..0000000000000 --- a/contrib/gdb/gdb/tui/tuiWin.c +++ /dev/null @@ -1,1650 +0,0 @@ -/* -** tuiWin.c -** This module contains procedures for handling tui window functions -** like resize, scrolling, scrolling, changing focus, etc. -** -** Author: Susan B. Macchia -*/ - - -#include <string.h> -#include "defs.h" -#include "command.h" -#include "symtab.h" -#include "breakpoint.h" -#include "frame.h" - -#include "tui.h" -#include "tuiData.h" -#include "tuiGeneralWin.h" -#include "tuiStack.h" -#include "tuiSourceWin.h" -#include "tuiDataWin.h" - -/******************************* -** External Declarations -********************************/ -extern void init_page_info (); - -/******************************* -** Static Local Decls -********************************/ -static void _makeVisibleWithNewHeight PARAMS ((TuiWinInfoPtr)); -static void _makeInvisibleAndSetNewHeight PARAMS ((TuiWinInfoPtr, int)); -static TuiStatus _tuiAdjustWinHeights PARAMS ((TuiWinInfoPtr, int)); -static int _newHeightOk PARAMS ((TuiWinInfoPtr, int)); -static void _tuiSetTabWidth_command PARAMS ((char *, int)); -static void _tuiRefreshAll_command PARAMS ((char *, int)); -static void _tuiSetWinHeight_command PARAMS ((char *, int)); -static void _tuiXDBsetWinHeight_command PARAMS ((char *, int)); -static void _tuiAllWindowsInfo PARAMS ((char *, int)); -static void _tuiSetFocus_command PARAMS ((char *, int)); -static void _tuiScrollForward_command PARAMS ((char *, int)); -static void _tuiScrollBackward_command PARAMS ((char *, int)); -static void _tuiScrollLeft_command PARAMS ((char *, int)); -static void _tuiScrollRight_command PARAMS ((char *, int)); -static void _parseScrollingArgs PARAMS ((char *, TuiWinInfoPtr *, int *)); - - -/*************************************** -** DEFINITIONS -***************************************/ -#define WIN_HEIGHT_USAGE "Usage: winheight <win_name> [+ | -] <#lines>\n" -#define XDBWIN_HEIGHT_USAGE "Usage: w <#lines>\n" -#define FOCUS_USAGE "Usage: focus {<win> | next | prev}\n" - -/*************************************** -** PUBLIC FUNCTIONS -***************************************/ - -/* -** _initialize_tuiWin(). -** Function to initialize gdb commands, for tui window manipulation. -*/ -void -_initialize_tuiWin () -{ - if (tui_version) - { - add_com ("refresh", class_tui, _tuiRefreshAll_command, - "Refresh the terminal display.\n"); - if (xdb_commands) - add_com_alias ("U", "refresh", class_tui, 0); - add_com ("tabset", class_tui, _tuiSetTabWidth_command, - "Set the width (in characters) of tab stops.\n\ -Usage: tabset <n>\n"); - add_com ("winheight", class_tui, _tuiSetWinHeight_command, - "Set the height of a specified window.\n\ -Usage: winheight <win_name> [+ | -] <#lines>\n\ -Window names are:\n\ -src : the source window\n\ -cmd : the command window\n\ -asm : the disassembly window\n\ -regs : the register display\n"); - add_com_alias ("wh", "winheight", class_tui, 0); - add_info ("win", _tuiAllWindowsInfo, - "List of all displayed windows.\n"); - add_com ("focus", class_tui, _tuiSetFocus_command, - "Set focus to named window or next/prev window.\n\ -Usage: focus {<win> | next | prev}\n\ -Valid Window names are:\n\ -src : the source window\n\ -asm : the disassembly window\n\ -regs : the register display\n\ -cmd : the command window\n"); - add_com_alias ("fs", "focus", class_tui, 0); - add_com ("+", class_tui, _tuiScrollForward_command, - "Scroll window forward.\nUsage: + [win] [n]\n"); - add_com ("-", class_tui, _tuiScrollBackward_command, - "Scroll window backward.\nUsage: - [win] [n]\n"); - add_com ("<", class_tui, _tuiScrollLeft_command, - "Scroll window forward.\nUsage: < [win] [n]\n"); - add_com (">", class_tui, _tuiScrollRight_command, - "Scroll window backward.\nUsage: > [win] [n]\n"); - if (xdb_commands) - add_com ("w", class_xdb, _tuiXDBsetWinHeight_command, - "XDB compatibility command for setting the height of a command window.\n\ -Usage: w <#lines>\n"); - } - - return; -} /* _intialize_tuiWin */ - - -/* -** tuiClearWinFocusFrom -** Clear the logical focus from winInfo -*/ -void -#ifdef __STDC__ -tuiClearWinFocusFrom ( - TuiWinInfoPtr winInfo) -#else -tuiClearWinFocusFrom (winInfo) - TuiWinInfoPtr winInfo; -#endif -{ - if (m_winPtrNotNull (winInfo)) - { - if (winInfo->generic.type != CMD_WIN) - unhighlightWin (winInfo); - tuiSetWinWithFocus ((TuiWinInfoPtr) NULL); - } - - return; -} /* tuiClearWinFocusFrom */ - - -/* -** tuiClearWinFocus(). -** Clear the window that has focus. -*/ -void -#ifdef __STDC__ -tuiClearWinFocus (void) -#else -tuiClearWinFocus () -#endif -{ - tuiClearWinFocusFrom (tuiWinWithFocus ()); - - return; -} /* tuiClearWinFocus */ - - -/* -** tuiSetWinFocusTo -** Set the logical focus to winInfo -*/ -void -#ifdef __STDC__ -tuiSetWinFocusTo ( - TuiWinInfoPtr winInfo) -#else -tuiSetWinFocusTo (winInfo) - TuiWinInfoPtr winInfo; -#endif -{ - if (m_winPtrNotNull (winInfo)) - { - TuiWinInfoPtr winWithFocus = tuiWinWithFocus (); - - if (m_winPtrNotNull (winWithFocus) && - winWithFocus->generic.type != CMD_WIN) - unhighlightWin (winWithFocus); - tuiSetWinWithFocus (winInfo); - if (winInfo->generic.type != CMD_WIN) - highlightWin (winInfo); - } - - return; -} /* tuiSetWinFocusTo */ - - -char * -#ifdef __STDC__ -tuiStrDup ( - char *str) -#else -tuiStrDup (str) - char *str; -#endif -{ - char *newStr = (char *) NULL; - - if (str != (char *) NULL) - { - newStr = (char *) xmalloc (strlen (str) + 1); - strcpy (newStr, str); - } - - return newStr; -} /* tuiStrDup */ - - -/* -** tuiScrollForward(). -*/ -void -#ifdef __STDC__ -tuiScrollForward ( - TuiWinInfoPtr winToScroll, - int numToScroll) -#else -tuiScrollForward (winToScroll, numToScroll) - TuiWinInfoPtr winToScroll; - int numToScroll; -#endif -{ - if (winToScroll != cmdWin) - { - int _numToScroll = numToScroll; - - if (numToScroll == 0) - _numToScroll = winToScroll->generic.height - 3; - /* - ** If we are scrolling the source or disassembly window, do a - ** "psuedo" scroll since not all of the source is in memory, - ** only what is in the viewport. If winToScroll is the - ** command window do nothing since the term should handle it. - */ - if (winToScroll == srcWin) - tuiVerticalSourceScroll (FORWARD_SCROLL, _numToScroll); - else if (winToScroll == disassemWin) - tuiVerticalDisassemScroll (FORWARD_SCROLL, _numToScroll); - else if (winToScroll == dataWin) - tuiVerticalDataScroll (FORWARD_SCROLL, _numToScroll); - } - - return; -} /* tuiScrollForward */ - - -/* -** tuiScrollBackward(). -*/ -void -#ifdef __STDC__ -tuiScrollBackward ( - TuiWinInfoPtr winToScroll, - int numToScroll) -#else -tuiScrollBackward (winToScroll, numToScroll) - TuiWinInfoPtr winToScroll; - int numToScroll; -#endif -{ - if (winToScroll != cmdWin) - { - int _numToScroll = numToScroll; - - if (numToScroll == 0) - _numToScroll = winToScroll->generic.height - 3; - /* - ** If we are scrolling the source or disassembly window, do a - ** "psuedo" scroll since not all of the source is in memory, - ** only what is in the viewport. If winToScroll is the - ** command window do nothing since the term should handle it. - */ - if (winToScroll == srcWin) - tuiVerticalSourceScroll (BACKWARD_SCROLL, _numToScroll); - else if (winToScroll == disassemWin) - tuiVerticalDisassemScroll (BACKWARD_SCROLL, _numToScroll); - else if (winToScroll == dataWin) - tuiVerticalDataScroll (BACKWARD_SCROLL, _numToScroll); - } - return; -} /* tuiScrollBackward */ - - -/* -** tuiScrollLeft(). -*/ -void -#ifdef __STDC__ -tuiScrollLeft ( - TuiWinInfoPtr winToScroll, - int numToScroll) -#else -tuiScrollLeft (winToScroll, numToScroll) - TuiWinInfoPtr winToScroll; - int numToScroll; -#endif -{ - if (winToScroll != cmdWin) - { - int _numToScroll = numToScroll; - - if (_numToScroll == 0) - _numToScroll = 1; - /* - ** If we are scrolling the source or disassembly window, do a - ** "psuedo" scroll since not all of the source is in memory, - ** only what is in the viewport. If winToScroll is the - ** command window do nothing since the term should handle it. - */ - if (winToScroll == srcWin || winToScroll == disassemWin) - tuiHorizontalSourceScroll (winToScroll, LEFT_SCROLL, _numToScroll); - } - return; -} /* tuiScrollLeft */ - - -/* -** tuiScrollRight(). -*/ -void -#ifdef __STDC__ -tuiScrollRight ( - TuiWinInfoPtr winToScroll, - int numToScroll) -#else -tuiScrollRight (winToScroll, numToScroll) - TuiWinInfoPtr winToScroll; - int numToScroll; -#endif -{ - if (winToScroll != cmdWin) - { - int _numToScroll = numToScroll; - - if (_numToScroll == 0) - _numToScroll = 1; - /* - ** If we are scrolling the source or disassembly window, do a - ** "psuedo" scroll since not all of the source is in memory, - ** only what is in the viewport. If winToScroll is the - ** command window do nothing since the term should handle it. - */ - if (winToScroll == srcWin || winToScroll == disassemWin) - tuiHorizontalSourceScroll (winToScroll, RIGHT_SCROLL, _numToScroll); - } - return; -} /* tuiScrollRight */ - - -/* -** tui_vScroll(). -** Scroll a window. Arguments are passed through a va_list. -*/ -void -#ifdef __STDC__ -tui_vScroll ( - va_list args) -#else -tui_vScroll (args) - va_list args; -#endif -{ - TuiScrollDirection direction = va_arg (args, TuiScrollDirection); - TuiWinInfoPtr winToScroll = va_arg (args, TuiWinInfoPtr); - int numToScroll = va_arg (args, int); - - switch (direction) - { - case FORWARD_SCROLL: - tuiScrollForward (winToScroll, numToScroll); - break; - case BACKWARD_SCROLL: - tuiScrollBackward (winToScroll, numToScroll); - break; - case LEFT_SCROLL: - tuiScrollLeft (winToScroll, numToScroll); - break; - case RIGHT_SCROLL: - tuiScrollRight (winToScroll, numToScroll); - break; - default: - break; - } - - return; -} /* tui_vScroll */ - - -/* -** tuiRefreshAll(). -*/ -void -#ifdef __STDC__ -tuiRefreshAll (void) -#else -tuiRefreshAll () -#endif -{ - TuiWinType type; - - refreshAll (winList); - for (type = SRC_WIN; type < MAX_MAJOR_WINDOWS; type++) - { - if (winList[type]->generic.isVisible) - { - switch (type) - { - case SRC_WIN: - case DISASSEM_WIN: - tuiClearWin (&winList[type]->generic); - if (winList[type]->detail.sourceInfo.hasLocator) - tuiClearLocatorDisplay (); - tuiShowSourceContent (winList[type]); - checkAndDisplayHighlightIfNeeded (winList[type]); - tuiEraseExecInfoContent (winList[type]); - tuiUpdateExecInfo (winList[type]); - break; - case DATA_WIN: - tuiRefreshDataWin (); - break; - default: - break; - } - } - } - tuiClearLocatorDisplay (); - tuiShowLocatorContent (); - - return; -} /* tuiRefreshAll */ - - -/* -** tuiResizeAll(). -** Resize all the windows based on the the terminal size. This -** function gets called from within the readline sinwinch handler. -*/ -void -#ifdef __STDC__ -tuiResizeAll (void) -#else -tuiResizeAll () -#endif -{ - int heightDiff, widthDiff; - extern int screenheight, screenwidth; /* in readline */ - - widthDiff = screenwidth - termWidth (); - heightDiff = screenheight - termHeight (); - if (heightDiff || widthDiff) - { - TuiLayoutType curLayout = currentLayout (); - TuiWinInfoPtr winWithFocus = tuiWinWithFocus (); - TuiWinInfoPtr firstWin, secondWin; - TuiGenWinInfoPtr locator = locatorWinInfoPtr (); - TuiWinType winType; - int i, newHeight, splitDiff, cmdSplitDiff, numWinsDisplayed = 2; - - /* turn keypad off while we resize */ - if (winWithFocus != cmdWin) - keypad (cmdWin->generic.handle, FALSE); - init_page_info (); - setTermHeightTo (screenheight); - setTermWidthTo (screenwidth); - if (curLayout == SRC_DISASSEM_COMMAND || - curLayout == SRC_DATA_COMMAND || curLayout == DISASSEM_DATA_COMMAND) - numWinsDisplayed++; - splitDiff = heightDiff / numWinsDisplayed; - cmdSplitDiff = splitDiff; - if (heightDiff % numWinsDisplayed) - { - if (heightDiff < 0) - cmdSplitDiff--; - else - cmdSplitDiff++; - } - /* now adjust each window */ - clear (); - refresh (); - switch (curLayout) - { - case SRC_COMMAND: - case DISASSEM_COMMAND: - firstWin = (TuiWinInfoPtr) (sourceWindows ())->list[0]; - firstWin->generic.width += widthDiff; - locator->width += widthDiff; - /* check for invalid heights */ - if (heightDiff == 0) - newHeight = firstWin->generic.height; - else if ((firstWin->generic.height + splitDiff) >= - (screenheight - MIN_CMD_WIN_HEIGHT - 1)) - newHeight = screenheight - MIN_CMD_WIN_HEIGHT - 1; - else if ((firstWin->generic.height + splitDiff) <= 0) - newHeight = MIN_WIN_HEIGHT; - else - newHeight = firstWin->generic.height + splitDiff; - - _makeInvisibleAndSetNewHeight (firstWin, newHeight); - cmdWin->generic.origin.y = locator->origin.y + 1; - cmdWin->generic.width += widthDiff; - newHeight = screenheight - cmdWin->generic.origin.y; - _makeInvisibleAndSetNewHeight (cmdWin, newHeight); - _makeVisibleWithNewHeight (firstWin); - _makeVisibleWithNewHeight (cmdWin); - if (firstWin->generic.contentSize <= 0) - tuiEraseSourceContent (firstWin, EMPTY_SOURCE_PROMPT); - break; - default: - if (curLayout == SRC_DISASSEM_COMMAND) - { - firstWin = srcWin; - firstWin->generic.width += widthDiff; - secondWin = disassemWin; - secondWin->generic.width += widthDiff; - } - else - { - firstWin = dataWin; - firstWin->generic.width += widthDiff; - secondWin = (TuiWinInfoPtr) (sourceWindows ())->list[0]; - secondWin->generic.width += widthDiff; - } - /* Change the first window's height/width */ - /* check for invalid heights */ - if (heightDiff == 0) - newHeight = firstWin->generic.height; - else if ((firstWin->generic.height + - secondWin->generic.height + (splitDiff * 2)) >= - (screenheight - MIN_CMD_WIN_HEIGHT - 1)) - newHeight = (screenheight - MIN_CMD_WIN_HEIGHT - 1) / 2; - else if ((firstWin->generic.height + splitDiff) <= 0) - newHeight = MIN_WIN_HEIGHT; - else - newHeight = firstWin->generic.height + splitDiff; - _makeInvisibleAndSetNewHeight (firstWin, newHeight); - - if (firstWin == dataWin && widthDiff != 0) - firstWin->detail.dataDisplayInfo.regsColumnCount = - tuiCalculateRegsColumnCount ( - firstWin->detail.dataDisplayInfo.regsDisplayType); - locator->width += widthDiff; - - /* Change the second window's height/width */ - /* check for invalid heights */ - if (heightDiff == 0) - newHeight = secondWin->generic.height; - else if ((firstWin->generic.height + - secondWin->generic.height + (splitDiff * 2)) >= - (screenheight - MIN_CMD_WIN_HEIGHT - 1)) - { - newHeight = screenheight - MIN_CMD_WIN_HEIGHT - 1; - if (newHeight % 2) - newHeight = (newHeight / 2) + 1; - else - newHeight /= 2; - } - else if ((secondWin->generic.height + splitDiff) <= 0) - newHeight = MIN_WIN_HEIGHT; - else - newHeight = secondWin->generic.height + splitDiff; - secondWin->generic.origin.y = firstWin->generic.height - 1; - _makeInvisibleAndSetNewHeight (secondWin, newHeight); - - /* Change the command window's height/width */ - cmdWin->generic.origin.y = locator->origin.y + 1; - _makeInvisibleAndSetNewHeight ( - cmdWin, cmdWin->generic.height + cmdSplitDiff); - _makeVisibleWithNewHeight (firstWin); - _makeVisibleWithNewHeight (secondWin); - _makeVisibleWithNewHeight (cmdWin); - if (firstWin->generic.contentSize <= 0) - tuiEraseSourceContent (firstWin, EMPTY_SOURCE_PROMPT); - if (secondWin->generic.contentSize <= 0) - tuiEraseSourceContent (secondWin, EMPTY_SOURCE_PROMPT); - break; - } - /* - ** Now remove all invisible windows, and their content so that they get - ** created again when called for with the new size - */ - for (winType = SRC_WIN; (winType < MAX_MAJOR_WINDOWS); winType++) - { - if (winType != CMD_WIN && m_winPtrNotNull (winList[winType]) && - !winList[winType]->generic.isVisible) - { - freeWindow (winList[winType]); - winList[winType] = (TuiWinInfoPtr) NULL; - } - } - tuiSetWinResizedTo (TRUE); - /* turn keypad back on, unless focus is in the command window */ - if (winWithFocus != cmdWin) - keypad (cmdWin->generic.handle, TRUE); - } - return; -} /* tuiResizeAll */ - - -/* -** tuiSigwinchHandler() -** SIGWINCH signal handler for the tui. This signal handler is -** always called, even when the readline package clears signals -** because it is set as the old_sigwinch() (TUI only) -*/ -void -#ifdef __STDC__ -tuiSigwinchHandler ( - int signal) -#else -tuiSigwinchHandler (signal) - int signal; -#endif -{ - /* - ** Say that a resize was done so that the readline can do it - ** later when appropriate. - */ - tuiSetWinResizedTo (TRUE); - - return; -} /* tuiSigwinchHandler */ - - - -/************************* -** STATIC LOCAL FUNCTIONS -**************************/ - - -/* -** _tuiScrollForward_command(). -*/ -static void -#ifdef __STDC__ -_tuiScrollForward_command ( - char *arg, - int fromTTY) -#else -_tuiScrollForward_command (arg, fromTTY) - char *arg; - int fromTTY; -#endif -{ - int numToScroll = 1; - TuiWinInfoPtr winToScroll; - - if (arg == (char *) NULL) - _parseScrollingArgs (arg, &winToScroll, (int *) NULL); - else - _parseScrollingArgs (arg, &winToScroll, &numToScroll); - tuiDo ((TuiOpaqueFuncPtr) tui_vScroll, - FORWARD_SCROLL, - winToScroll, - numToScroll); - - return; -} /* _tuiScrollForward_command */ - - -/* -** _tuiScrollBackward_command(). -*/ -static void -#ifdef __STDC__ -_tuiScrollBackward_command ( - char *arg, - int fromTTY) -#else -_tuiScrollBackward_command (arg, fromTTY) - char *arg; - int fromTTY; -#endif -{ - int numToScroll = 1; - TuiWinInfoPtr winToScroll; - - if (arg == (char *) NULL) - _parseScrollingArgs (arg, &winToScroll, (int *) NULL); - else - _parseScrollingArgs (arg, &winToScroll, &numToScroll); - tuiDo ((TuiOpaqueFuncPtr) tui_vScroll, - BACKWARD_SCROLL, - winToScroll, - numToScroll); - - return; -} /* _tuiScrollBackward_command */ - - -/* -** _tuiScrollLeft_command(). -*/ -static void -#ifdef __STDC__ -_tuiScrollLeft_command ( - char *arg, - int fromTTY) -#else -_tuiScrollLeft_command (arg, fromTTY) - char *arg; - int fromTTY; -#endif -{ - int numToScroll; - TuiWinInfoPtr winToScroll; - - _parseScrollingArgs (arg, &winToScroll, &numToScroll); - tuiDo ((TuiOpaqueFuncPtr) tui_vScroll, - LEFT_SCROLL, - winToScroll, - numToScroll); - - return; -} /* _tuiScrollLeft_command */ - - -/* -** _tuiScrollRight_command(). -*/ -static void -#ifdef __STDC__ -_tuiScrollRight_command ( - char *arg, - int fromTTY) -#else -_tuiScrollRight_command (arg, fromTTY) - char *arg; - int fromTTY; -#endif -{ - int numToScroll; - TuiWinInfoPtr winToScroll; - - _parseScrollingArgs (arg, &winToScroll, &numToScroll); - tuiDo ((TuiOpaqueFuncPtr) tui_vScroll, - RIGHT_SCROLL, - winToScroll, - numToScroll); - - return; -} /* _tuiScrollRight_command */ - - -/* -** _tuiSetFocus(). -** Set focus to the window named by 'arg' -*/ -static void -#ifdef __STDC__ -_tuiSetFocus ( - char *arg, - int fromTTY) -#else -_tuiSetFocus (arg, fromTTY) - char *arg; - int fromTTY; -#endif -{ - if (arg != (char *) NULL) - { - char *bufPtr = (char *) tuiStrDup (arg); - int i; - TuiWinInfoPtr winInfo = (TuiWinInfoPtr) NULL; - - for (i = 0; (i < strlen (bufPtr)); i++) - bufPtr[i] = toupper (arg[i]); - - if (subsetCompare (bufPtr, "NEXT")) - winInfo = tuiNextWin (tuiWinWithFocus ()); - else if (subsetCompare (bufPtr, "PREV")) - winInfo = tuiPrevWin (tuiWinWithFocus ()); - else - winInfo = partialWinByName (bufPtr); - - if (winInfo == (TuiWinInfoPtr) NULL || !winInfo->generic.isVisible) - warning ("Invalid window specified. \n\ -The window name specified must be valid and visible.\n"); - else - { - tuiSetWinFocusTo (winInfo); - keypad (cmdWin->generic.handle, (winInfo != cmdWin)); - } - - if (dataWin->generic.isVisible) - tuiRefreshDataWin (); - tuiFree (bufPtr); - printf_filtered ("Focus set to %s window.\n", - winName ((TuiGenWinInfoPtr) tuiWinWithFocus ())); - } - else - warning ("Incorrect Number of Arguments.\n%s", FOCUS_USAGE); - - return; -} /* _tuiSetFocus */ - - -/* -** _tui_vSetFocus() -*/ -static void -#ifdef __STDC__ -_tui_vSetFocus ( - va_list args) -#else -_tui_vSetFocus (args) - va_list args; -#endif -{ - char *arg = va_arg (args, char *); - int fromTTY = va_arg (args, int); - - _tuiSetFocus (arg, fromTTY); - - return; -} /* tui_vSetFocus */ - - -/* -** _tuiSetFocus_command() -*/ -static void -#ifdef __STDC__ -_tuiSetFocus_command ( - char *arg, - int fromTTY) -#else -_tuiSetFocus_command (arg, fromTTY) - char *arg; - int fromTTY; -#endif -{ - tuiDo ((TuiOpaqueFuncPtr) _tui_vSetFocus, arg, fromTTY); - - return; -} /* tui_SetFocus */ - - -/* -** _tuiAllWindowsInfo(). -*/ -static void -#ifdef __STDC__ -_tuiAllWindowsInfo ( - char *arg, - int fromTTY) -#else -_tuiAllWindowsInfo (arg, fromTTY) - char *arg; - int fromTTY; -#endif -{ - TuiWinType type; - TuiWinInfoPtr winWithFocus = tuiWinWithFocus (); - - for (type = SRC_WIN; (type < MAX_MAJOR_WINDOWS); type++) - if (winList[type]->generic.isVisible) - { - if (winWithFocus == winList[type]) - printf_filtered (" %s\t(%d lines) <has focus>\n", - winName (&winList[type]->generic), - winList[type]->generic.height); - else - printf_filtered (" %s\t(%d lines)\n", - winName (&winList[type]->generic), - winList[type]->generic.height); - } - - return; -} /* _tuiAllWindowsInfo */ - - -/* -** _tuiRefreshAll_command(). -*/ -static void -#ifdef __STDC__ -_tuiRefreshAll_command ( - char *arg, - int fromTTY) -#else -_tuiRefreshAll_command (arg, fromTTY) - char *arg; - int fromTTY; -#endif -{ - tuiDo ((TuiOpaqueFuncPtr) tuiRefreshAll); -} - - -/* -** _tuiSetWinTabWidth_command(). -** Set the height of the specified window. -*/ -static void -#ifdef __STDC__ -_tuiSetTabWidth_command ( - char *arg, - int fromTTY) -#else -_tuiSetTabWidth_command (arg, fromTTY) - char *arg; - int fromTTY; -#endif -{ - if (arg != (char *) NULL) - { - int ts; - - ts = atoi (arg); - if (ts > 0) - tuiSetDefaultTabLen (ts); - else - warning ("Tab widths greater than 0 must be specified.\n"); - } - - return; -} /* _tuiSetTabWidth_command */ - - -/* -** _tuiSetWinHeight(). -** Set the height of the specified window. -*/ -static void -#ifdef __STDC__ -_tuiSetWinHeight ( - char *arg, - int fromTTY) -#else -_tuiSetWinHeight (arg, fromTTY) - char *arg; - int fromTTY; -#endif -{ - if (arg != (char *) NULL) - { - char *buf = tuiStrDup (arg); - char *bufPtr = buf; - char *wname = (char *) NULL; - int newHeight, i; - TuiWinInfoPtr winInfo; - - wname = bufPtr; - bufPtr = strchr (bufPtr, ' '); - if (bufPtr != (char *) NULL) - { - *bufPtr = (char) 0; - - /* - ** Validate the window name - */ - for (i = 0; i < strlen (wname); i++) - wname[i] = toupper (wname[i]); - winInfo = partialWinByName (wname); - - if (winInfo == (TuiWinInfoPtr) NULL || !winInfo->generic.isVisible) - warning ("Invalid window specified. \n\ -The window name specified must be valid and visible.\n"); - else - { - /* Process the size */ - while (*(++bufPtr) == ' ') - ; - - if (*bufPtr != (char) 0) - { - int negate = FALSE; - int fixedSize = TRUE; - int inputNo;; - - if (*bufPtr == '+' || *bufPtr == '-') - { - if (*bufPtr == '-') - negate = TRUE; - fixedSize = FALSE; - bufPtr++; - } - inputNo = atoi (bufPtr); - if (inputNo > 0) - { - if (negate) - inputNo *= (-1); - if (fixedSize) - newHeight = inputNo; - else - newHeight = winInfo->generic.height + inputNo; - /* - ** Now change the window's height, and adjust all - ** other windows around it - */ - if (_tuiAdjustWinHeights (winInfo, - newHeight) == TUI_FAILURE) - warning ("Invalid window height specified.\n%s", - WIN_HEIGHT_USAGE); - else - init_page_info (); - } - else - warning ("Invalid window height specified.\n%s", - WIN_HEIGHT_USAGE); - } - } - } - else - printf_filtered (WIN_HEIGHT_USAGE); - - if (buf != (char *) NULL) - tuiFree (buf); - } - else - printf_filtered (WIN_HEIGHT_USAGE); - - return; -} /* _tuiSetWinHeight */ - - -/* -** _tui_vSetWinHeight(). -** Set the height of the specified window, with va_list. -*/ -static void -#ifdef __STDC__ -_tui_vSetWinHeight ( - va_list args) -#else -_tui_vSetWinHeight (args) - va_list args; -#endif -{ - char *arg = va_arg (args, char *); - int fromTTY = va_arg (args, int); - - _tuiSetWinHeight (arg, fromTTY); - - return; -} /* _tui_vSetWinHeight */ - - -/* -** _tuiSetWinHeight_command(). -** Set the height of the specified window, with va_list. -*/ -static void -#ifdef __STDC__ -_tuiSetWinHeight_command ( - char *arg, - int fromTTY) -#else -_tuiSetWinHeight_command (arg, fromTTY) - char *arg; - int fromTTY; -#endif -{ - tuiDo ((TuiOpaqueFuncPtr) _tui_vSetWinHeight, arg, fromTTY); - - return; -} /* _tuiSetWinHeight_command */ - - -/* -** _tuiXDBsetWinHeight(). -** XDB Compatibility command for setting the window height. This will -** increase or decrease the command window by the specified amount. -*/ -static void -#ifdef __STDC__ -_tuiXDBsetWinHeight ( - char *arg, - int fromTTY) -#else -_tuiXDBsetWinHeight (arg, fromTTY) - char *arg; - int fromTTY; -#endif -{ - if (arg != (char *) NULL) - { - int inputNo = atoi (arg); - - if (inputNo > 0) - { /* Add 1 for the locator */ - int newHeight = termHeight () - (inputNo + 1); - - if (!_newHeightOk (winList[CMD_WIN], newHeight) || - _tuiAdjustWinHeights (winList[CMD_WIN], - newHeight) == TUI_FAILURE) - warning ("Invalid window height specified.\n%s", - XDBWIN_HEIGHT_USAGE); - } - else - warning ("Invalid window height specified.\n%s", - XDBWIN_HEIGHT_USAGE); - } - else - warning ("Invalid window height specified.\n%s", XDBWIN_HEIGHT_USAGE); - - return; -} /* _tuiXDBsetWinHeight */ - - -/* -** _tui_vXDBsetWinHeight(). -** Set the height of the specified window, with va_list. -*/ -static void -#ifdef __STDC__ -_tui_vXDBsetWinHeight ( - va_list args) -#else -_tui_vXDBsetWinHeight (args) - va_list args; -#endif -{ - char *arg = va_arg (args, char *); - int fromTTY = va_arg (args, int); - - _tuiXDBsetWinHeight (arg, fromTTY); - - return; -} /* _tui_vXDBsetWinHeight */ - - -/* -** _tuiSetWinHeight_command(). -** Set the height of the specified window, with va_list. -*/ -static void -#ifdef __STDC__ -_tuiXDBsetWinHeight_command ( - char *arg, - int fromTTY) -#else -_tuiXDBsetWinHeight_command (arg, fromTTY) - char *arg; - int fromTTY; -#endif -{ - tuiDo ((TuiOpaqueFuncPtr) _tui_vXDBsetWinHeight, arg, fromTTY); - - return; -} /* _tuiXDBsetWinHeight_command */ - - -/* -** _tuiAdjustWinHeights(). -** Function to adjust all window heights around the primary -*/ -static TuiStatus -#ifdef __STDC__ -_tuiAdjustWinHeights ( - TuiWinInfoPtr primaryWinInfo, - int newHeight) -#else -_tuiAdjustWinHeights (primaryWinInfo, newHeight) - TuiWinInfoPtr primaryWinInfo; - int newHeight; -#endif -{ - TuiStatus status = TUI_FAILURE; - - if (_newHeightOk (primaryWinInfo, newHeight)) - { - status = TUI_SUCCESS; - if (newHeight != primaryWinInfo->generic.height) - { - int i, diff; - TuiWinInfoPtr winInfo; - TuiGenWinInfoPtr locator = locatorWinInfoPtr (); - TuiLayoutType curLayout = currentLayout (); - - diff = (newHeight - primaryWinInfo->generic.height) * (-1); - if (curLayout == SRC_COMMAND || curLayout == DISASSEM_COMMAND) - { - TuiWinInfoPtr srcWinInfo; - - _makeInvisibleAndSetNewHeight (primaryWinInfo, newHeight); - if (primaryWinInfo->generic.type == CMD_WIN) - { - winInfo = (TuiWinInfoPtr) (sourceWindows ())->list[0]; - srcWinInfo = winInfo; - } - else - { - winInfo = winList[CMD_WIN]; - srcWinInfo = primaryWinInfo; - } - _makeInvisibleAndSetNewHeight (winInfo, - winInfo->generic.height + diff); - cmdWin->generic.origin.y = locator->origin.y + 1; - _makeVisibleWithNewHeight (winInfo); - _makeVisibleWithNewHeight (primaryWinInfo); - if (srcWinInfo->generic.contentSize <= 0) - tuiEraseSourceContent (srcWinInfo, EMPTY_SOURCE_PROMPT); - } - else - { - TuiWinInfoPtr firstWin, secondWin; - - if (curLayout == SRC_DISASSEM_COMMAND) - { - firstWin = srcWin; - secondWin = disassemWin; - } - else - { - firstWin = dataWin; - secondWin = (TuiWinInfoPtr) (sourceWindows ())->list[0]; - } - if (primaryWinInfo == cmdWin) - { /* - ** Split the change in height accross the 1st & 2nd windows - ** adjusting them as well. - */ - int firstSplitDiff = diff / 2; /* subtract the locator */ - int secondSplitDiff = firstSplitDiff; - - if (diff % 2) - { - if (firstWin->generic.height > - secondWin->generic.height) - if (diff < 0) - firstSplitDiff--; - else - firstSplitDiff++; - else - { - if (diff < 0) - secondSplitDiff--; - else - secondSplitDiff++; - } - } - /* make sure that the minimum hieghts are honored */ - while ((firstWin->generic.height + firstSplitDiff) < 3) - { - firstSplitDiff++; - secondSplitDiff--; - } - while ((secondWin->generic.height + secondSplitDiff) < 3) - { - secondSplitDiff++; - firstSplitDiff--; - } - _makeInvisibleAndSetNewHeight ( - firstWin, - firstWin->generic.height + firstSplitDiff); - secondWin->generic.origin.y = firstWin->generic.height - 1; - _makeInvisibleAndSetNewHeight ( - secondWin, secondWin->generic.height + secondSplitDiff); - cmdWin->generic.origin.y = locator->origin.y + 1; - _makeInvisibleAndSetNewHeight (cmdWin, newHeight); - } - else - { - if ((cmdWin->generic.height + diff) < 1) - { /* - ** If there is no way to increase the command window - ** take real estate from the 1st or 2nd window. - */ - if ((cmdWin->generic.height + diff) < 1) - { - int i; - for (i = cmdWin->generic.height + diff; - (i < 1); i++) - if (primaryWinInfo == firstWin) - secondWin->generic.height--; - else - firstWin->generic.height--; - } - } - if (primaryWinInfo == firstWin) - _makeInvisibleAndSetNewHeight (firstWin, newHeight); - else - _makeInvisibleAndSetNewHeight ( - firstWin, - firstWin->generic.height); - secondWin->generic.origin.y = firstWin->generic.height - 1; - if (primaryWinInfo == secondWin) - _makeInvisibleAndSetNewHeight (secondWin, newHeight); - else - _makeInvisibleAndSetNewHeight ( - secondWin, secondWin->generic.height); - cmdWin->generic.origin.y = locator->origin.y + 1; - if ((cmdWin->generic.height + diff) < 1) - _makeInvisibleAndSetNewHeight (cmdWin, 1); - else - _makeInvisibleAndSetNewHeight ( - cmdWin, cmdWin->generic.height + diff); - } - _makeVisibleWithNewHeight (cmdWin); - _makeVisibleWithNewHeight (secondWin); - _makeVisibleWithNewHeight (firstWin); - if (firstWin->generic.contentSize <= 0) - tuiEraseSourceContent (firstWin, EMPTY_SOURCE_PROMPT); - if (secondWin->generic.contentSize <= 0) - tuiEraseSourceContent (secondWin, EMPTY_SOURCE_PROMPT); - } - } - } - - return status; -} /* _tuiAdjustWinHeights */ - - -/* -** _makeInvisibleAndSetNewHeight(). -** Function make the target window (and auxillary windows associated -** with the targer) invisible, and set the new height and location. -*/ -static void -#ifdef __STDC__ -_makeInvisibleAndSetNewHeight ( - TuiWinInfoPtr winInfo, - int height) -#else -_makeInvisibleAndSetNewHeight (winInfo, height) - TuiWinInfoPtr winInfo; - int height; -#endif -{ - int i; - struct symtab *s; - TuiGenWinInfoPtr genWinInfo; - - - m_beInvisible (&winInfo->generic); - winInfo->generic.height = height; - if (height > 1) - winInfo->generic.viewportHeight = height - 1; - else - winInfo->generic.viewportHeight = height; - if (winInfo != cmdWin) - winInfo->generic.viewportHeight--; - - /* Now deal with the auxillary windows associated with winInfo */ - switch (winInfo->generic.type) - { - case SRC_WIN: - case DISASSEM_WIN: - genWinInfo = winInfo->detail.sourceInfo.executionInfo; - m_beInvisible (genWinInfo); - genWinInfo->height = height; - genWinInfo->origin.y = winInfo->generic.origin.y; - if (height > 1) - genWinInfo->viewportHeight = height - 1; - else - genWinInfo->viewportHeight = height; - if (winInfo != cmdWin) - genWinInfo->viewportHeight--; - - if (m_hasLocator (winInfo)) - { - genWinInfo = locatorWinInfoPtr (); - m_beInvisible (genWinInfo); - genWinInfo->origin.y = winInfo->generic.origin.y + height; - } - break; - case DATA_WIN: - /* delete all data item windows */ - for (i = 0; i < winInfo->generic.contentSize; i++) - { - genWinInfo = (TuiGenWinInfoPtr) & ((TuiWinElementPtr) - winInfo->generic.content[i])->whichElement.dataWindow; - tuiDelwin (genWinInfo->handle); - genWinInfo->handle = (WINDOW *) NULL; - } - break; - default: - break; - } - - return; -} /* _makeInvisibleAndSetNewHeight */ - - -/* -** _makeVisibleWithNewHeight(). -** Function to make the windows with new heights visible. -** This means re-creating the windows' content since the window -** had to be destroyed to be made invisible. -*/ -static void -#ifdef __STDC__ -_makeVisibleWithNewHeight ( - TuiWinInfoPtr winInfo) -#else -_makeVisibleWithNewHeight (winInfo) - TuiWinInfoPtr winInfo; -#endif -{ - int i; - struct symtab *s; - - m_beVisible (&winInfo->generic); - checkAndDisplayHighlightIfNeeded (winInfo); - switch (winInfo->generic.type) - { - case SRC_WIN: - case DISASSEM_WIN: - freeWinContent (winInfo->detail.sourceInfo.executionInfo); - m_beVisible (winInfo->detail.sourceInfo.executionInfo); - if (winInfo->generic.content != (OpaquePtr) NULL) - { - TuiLineOrAddress lineOrAddr; - - if (winInfo->generic.type == SRC_WIN) - lineOrAddr.lineNo = - winInfo->detail.sourceInfo.startLineOrAddr.lineNo; - else - lineOrAddr.addr = - winInfo->detail.sourceInfo.startLineOrAddr.addr; - freeWinContent (&winInfo->generic); - tuiUpdateSourceWindow (winInfo, - current_source_symtab, - ((winInfo->generic.type == SRC_WIN) ? - (Opaque) lineOrAddr.lineNo : - lineOrAddr.addr), - TRUE); - } - else if (selected_frame != (struct frame_info *) NULL) - { - Opaque line = 0; - extern int current_source_line; - - s = find_pc_symtab (selected_frame->pc); - if (winInfo->generic.type == SRC_WIN) - line = (Opaque) current_source_line; - else - line = (Opaque) find_line_pc (s, current_source_line); - tuiUpdateSourceWindow (winInfo, s, line, TRUE); - } - if (m_hasLocator (winInfo)) - { - m_beVisible (locatorWinInfoPtr ()); - tuiClearLocatorDisplay (); - tuiShowLocatorContent (); - } - break; - case DATA_WIN: - tuiDisplayAllData (); - break; - case CMD_WIN: - winInfo->detail.commandInfo.curLine = 0; - winInfo->detail.commandInfo.curch = 0; - wmove (winInfo->generic.handle, - winInfo->detail.commandInfo.curLine, - winInfo->detail.commandInfo.curch); - break; - default: - break; - } - - return; -} /* _makeVisibleWithNewHeight */ - - -static int -#ifdef __STDC__ -_newHeightOk ( - TuiWinInfoPtr primaryWinInfo, - int newHeight) -#else -_newHeightOk (primaryWinInfo, newHeight) - TuiWinInfoPtr primaryWinInfo; - int newHeight; -#endif -{ - int ok = (newHeight < termHeight ()); - - if (ok) - { - int diff, curHeight; - TuiLayoutType curLayout = currentLayout (); - - diff = (newHeight - primaryWinInfo->generic.height) * (-1); - if (curLayout == SRC_COMMAND || curLayout == DISASSEM_COMMAND) - { - ok = ((primaryWinInfo->generic.type == CMD_WIN && - newHeight <= (termHeight () - 4) && - newHeight >= MIN_CMD_WIN_HEIGHT) || - (primaryWinInfo->generic.type != CMD_WIN && - newHeight <= (termHeight () - 2) && - newHeight >= MIN_WIN_HEIGHT)); - if (ok) - { /* check the total height */ - TuiWinInfoPtr winInfo; - - if (primaryWinInfo == cmdWin) - winInfo = (TuiWinInfoPtr) (sourceWindows ())->list[0]; - else - winInfo = cmdWin; - ok = ((newHeight + - (winInfo->generic.height + diff)) <= termHeight ()); - } - } - else - { - int curTotalHeight, totalHeight, minHeight; - TuiWinInfoPtr firstWin, secondWin; - - if (curLayout == SRC_DISASSEM_COMMAND) - { - firstWin = srcWin; - secondWin = disassemWin; - } - else - { - firstWin = dataWin; - secondWin = (TuiWinInfoPtr) (sourceWindows ())->list[0]; - } - /* - ** We could simply add all the heights to obtain the same result - ** but below is more explicit since we subtract 1 for the - ** line that the first and second windows share, and add one - ** for the locator. - */ - curTotalHeight = - (firstWin->generic.height + secondWin->generic.height - 1) - + cmdWin->generic.height + 1 /*locator*/ ; - if (primaryWinInfo == cmdWin) - { - /* locator included since first & second win share a line */ - ok = ((firstWin->generic.height + - secondWin->generic.height + diff) >= - (MIN_WIN_HEIGHT * 2) && - newHeight >= MIN_CMD_WIN_HEIGHT); - if (ok) - { - totalHeight = newHeight + (firstWin->generic.height + - secondWin->generic.height + diff); - minHeight = MIN_CMD_WIN_HEIGHT; - } - } - else - { - minHeight = MIN_WIN_HEIGHT; - /* - ** First see if we can increase/decrease the command - ** window. And make sure that the command window is - ** at least 1 line - */ - ok = ((cmdWin->generic.height + diff) > 0); - if (!ok) - { /* - ** Looks like we have to increase/decrease one of - ** the other windows - */ - if (primaryWinInfo == firstWin) - ok = (secondWin->generic.height + diff) >= minHeight; - else - ok = (firstWin->generic.height + diff) >= minHeight; - } - if (ok) - { - if (primaryWinInfo == firstWin) - totalHeight = newHeight + - secondWin->generic.height + - cmdWin->generic.height + diff; - else - totalHeight = newHeight + - firstWin->generic.height + - cmdWin->generic.height + diff; - } - } - /* - ** Now make sure that the proposed total height doesn't exceed - ** the old total height. - */ - if (ok) - ok = (newHeight >= minHeight && totalHeight <= curTotalHeight); - } - } - - return ok; -} /* _newHeightOk */ - - -/* -** _parseScrollingArgs(). -*/ -static void -#ifdef __STDC__ -_parseScrollingArgs ( - char *arg, - TuiWinInfoPtr * winToScroll, - int *numToScroll) -#else -_parseScrollingArgs (arg, winToScroll, numToScroll) - char *arg; - TuiWinInfoPtr *winToScroll; - int *numToScroll; -#endif -{ - if (numToScroll) - *numToScroll = 0; - *winToScroll = tuiWinWithFocus (); - - /* - ** First set up the default window to scroll, in case there is no - ** window name arg - */ - if (arg != (char *) NULL) - { - char *buf, *bufPtr; - - /* process the number of lines to scroll */ - buf = bufPtr = tuiStrDup (arg); - if (isdigit (*bufPtr)) - { - char *numStr; - - numStr = bufPtr; - bufPtr = strchr (bufPtr, ' '); - if (bufPtr != (char *) NULL) - { - *bufPtr = (char) 0; - if (numToScroll) - *numToScroll = atoi (numStr); - bufPtr++; - } - else if (numToScroll) - *numToScroll = atoi (numStr); - } - - /* process the window name if one is specified */ - if (bufPtr != (char *) NULL) - { - char *wname; - int i; - - if (*bufPtr == ' ') - while (*(++bufPtr) == ' ') - ; - - if (*bufPtr != (char) 0) - wname = bufPtr; - - /* Validate the window name */ - for (i = 0; i < strlen (wname); i++) - wname[i] = toupper (wname[i]); - *winToScroll = partialWinByName (wname); - - if (*winToScroll == (TuiWinInfoPtr) NULL || - !(*winToScroll)->generic.isVisible) - warning ("Invalid window specified. \n\ -The window name specified must be valid and visible.\n"); - else if (*winToScroll == cmdWin) - *winToScroll = (TuiWinInfoPtr) (sourceWindows ())->list[0]; - } - tuiFree (buf); - } - - return; -} /* _parseScrollingArgs */ diff --git a/contrib/gdb/gdb/tui/tuiWin.h b/contrib/gdb/gdb/tui/tuiWin.h deleted file mode 100644 index cb8455dd8e081..0000000000000 --- a/contrib/gdb/gdb/tui/tuiWin.h +++ /dev/null @@ -1,28 +0,0 @@ -#ifndef _TUI_WIN_H -#define _TUI_WIN_H -/* -** This header file supports -*/ - -/***************************************** -** TYPE DEFINITIONS ** -******************************************/ - - - -/***************************************** -** PUBLIC FUNCTION EXTERNAL DECLS ** -******************************************/ -extern void tuiScrollForward PARAMS ((TuiWinInfoPtr, int)); -extern void tuiScrollBackward PARAMS ((TuiWinInfoPtr, int)); -extern void tuiScrollLeft PARAMS ((TuiWinInfoPtr, int)); -extern void tuiScrollRight PARAMS ((TuiWinInfoPtr, int)); -extern void tui_vScroll PARAMS ((va_list)); -extern void tuiSetWinFocusTo PARAMS ((TuiWinInfoPtr)); -extern void tuiClearWinFocusFrom PARAMS ((TuiWinInfoPtr)); -extern void tuiClearWinFocus PARAMS ((void)); -extern void tuiResizeAll PARAMS ((void)); -extern void tuiRefreshAll PARAMS ((void)); -extern void tuiSigwinchHandler PARAMS ((int)); - -#endif /*_TUI_WIN_H*/ diff --git a/contrib/gdb/gdb/umax-xdep.c b/contrib/gdb/gdb/umax-xdep.c deleted file mode 100644 index d54519e63846a..0000000000000 --- a/contrib/gdb/gdb/umax-xdep.c +++ /dev/null @@ -1,133 +0,0 @@ -/* umax host stuff. - Copyright (C) 1986, 1987, 1989, 1991 Free Software Foundation, Inc. - -This file is part of GDB. - -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 2 of the License, 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ - -#include "defs.h" -#include "frame.h" -#include "inferior.h" - -#include <sys/param.h> -#include <sys/dir.h> -#include <signal.h> -#include <sys/ioctl.h> -#include <fcntl.h> - -#include "gdbcore.h" -#include <sys/ptrace.h> -#define PTRACE_ATTACH PT_ATTACH -#define PTRACE_DETACH PT_FREEPROC - -#include <sys/file.h> -#include "gdb_stat.h" - -/* Work with core dump and executable files, for GDB. - This code would be in corefile.c if it weren't machine-dependent. */ - -void -core_file_command (filename, from_tty) - char *filename; - int from_tty; -{ - int val; - extern char registers[]; - - /* Discard all vestiges of any previous core file - and mark data and stack spaces as empty. */ - - if (corefile) - free (corefile); - corefile = 0; - - if (corechan >= 0) - close (corechan); - corechan = -1; - - data_start = 0; - data_end = 0; - stack_start = STACK_END_ADDR; - stack_end = STACK_END_ADDR; - - /* Now, if a new core file was specified, open it and digest it. */ - - if (filename) - { - filename = tilde_expand (filename); - make_cleanup (free, filename); - - if (have_inferior_p ()) - error ("To look at a core file, you must kill the program with \"kill\"."); - corechan = open (filename, O_RDONLY, 0); - if (corechan < 0) - perror_with_name (filename); - /* 4.2-style (and perhaps also sysV-style) core dump file. */ - { - struct ptrace_user u; - int reg_offset; - - val = myread (corechan, &u, sizeof u); - if (val < 0) - perror_with_name (filename); - data_start = exec_data_start; - - data_end = data_start + u.pt_dsize; - stack_start = stack_end - u.pt_ssize; - data_offset = sizeof u; - stack_offset = data_offset + u.pt_dsize; - reg_offset = 0; - - memcpy (&core_aouthdr, &u.pt_aouthdr, sizeof (AOUTHDR)); - printf_unfiltered ("Core file is from \"%s\".\n", u.pt_comm); - if (u.pt_signal > 0) - printf_unfiltered ("Program terminated with signal %d, %s.\n", - u.pt_signal, safe_strsignal (u.pt_signal)); - - /* Read the register values out of the core file and store - them where `read_register' will find them. */ - - { - register int regno; - - for (regno = 0; regno < NUM_REGS; regno++) - { - char buf[MAX_REGISTER_RAW_SIZE]; - - val = lseek (corechan, register_addr (regno, reg_offset), 0); - if (val < 0) - perror_with_name (filename); - - val = myread (corechan, buf, sizeof buf); - if (val < 0) - perror_with_name (filename); - supply_register (regno, buf); - } - } - } - if (filename[0] == '/') - corefile = savestring (filename, strlen (filename)); - else - { - corefile = concat (current_directory, "/", filename, NULL); - } - - flush_cached_frames (); - select_frame (get_current_frame (), 0); - validate_files (); - } - else if (from_tty) - printf_unfiltered ("No core file now.\n"); -} diff --git a/contrib/gdb/include/COPYING b/contrib/gdb/include/COPYING deleted file mode 100644 index a43ea2126fb6b..0000000000000 --- a/contrib/gdb/include/COPYING +++ /dev/null @@ -1,339 +0,0 @@ - GNU GENERAL PUBLIC LICENSE - Version 2, June 1991 - - Copyright (C) 1989, 1991 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 licenses for most software are designed to take away your -freedom to share and change it. By contrast, the GNU 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. This -General Public License applies to most of the Free Software -Foundation's software and to any other program whose authors commit to -using it. (Some other Free Software Foundation software is covered by -the GNU Library General Public License instead.) You can apply it to -your programs, too. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -this service if you wish), 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 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 show them these terms so they know 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. - - Finally, any free program is threatened constantly by software -patents. We wish to avoid the danger that redistributors of a free -program will individually obtain patent licenses, in effect making the -program proprietary. To prevent this, we have made it clear that any -patent must be licensed for everyone's free use or not licensed at all. - - 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 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 derivative work under copyright law: -that is to say, a work containing the Program or a portion of it, -either verbatim or with modifications and/or translated into another -language. (Hereinafter, translation is included without limitation in -the term "modification".) Each licensee is addressed as "you". - -Activities other than copying, distribution and modification are not -covered by this License; they are outside its scope. The act of -running the Program is not restricted, and the output from the Program -is covered only if its contents constitute a work based on the -Program (independent of having been made by running the Program). -Whether that is true depends on what the Program does. - - 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 License and to the absence of any warranty; -and give any other recipients of the Program a copy of this License -along with the Program. - -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. - - 2. You may modify your copy or copies of the Program or any portion -of it, thus forming a work based on the Program, and copy and -distribute such modifications or work under the terms of Section 1 -above, provided that you also meet all of these conditions: - - a) You must cause the modified files to carry prominent notices - stating that you changed the files and the date of any change. - - b) You must cause any work that you distribute or publish, that in - whole or in part contains or is derived from the Program or any - part thereof, to be licensed as a whole at no charge to all third - parties under the terms of this License. - - c) If the modified program normally reads commands interactively - when run, you must cause it, when started running for such - interactive use in the most ordinary 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 - License. (Exception: if the Program itself is interactive but - does not normally print such an announcement, your work based on - the Program is not required to print an announcement.) - -These requirements apply to the modified work as a whole. If -identifiable sections of that work are not derived from the Program, -and can be reasonably considered independent and separate works in -themselves, then this License, and its terms, do not apply to those -sections when you distribute them as separate works. But when you -distribute the same sections as part of a whole which is a work based -on the Program, the distribution of the whole must be on the terms of -this License, whose permissions for other licensees extend to the -entire whole, and thus to each and every part regardless of who wrote it. - -Thus, it is not the intent of this section to claim rights or contest -your rights to work written entirely by you; rather, the intent is to -exercise the right to control the distribution of derivative or -collective works based on the Program. - -In addition, mere aggregation of another work not based on the Program -with the Program (or with a work based on the Program) on a volume of -a storage or distribution medium does not bring the other work under -the scope of this License. - - 3. You may copy and distribute the Program (or a work based on it, -under Section 2) in object code or executable form under the terms of -Sections 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 Sections - 1 and 2 above on a medium customarily used for software interchange; or, - - b) Accompany it with a written offer, valid for at least three - years, to give any third party, for a charge no more than your - cost of physically performing source distribution, a complete - machine-readable copy of the corresponding source code, to be - distributed under the terms of Sections 1 and 2 above on a medium - customarily used for software interchange; or, - - c) Accompany it with the information you received as to the offer - to distribute corresponding source code. (This alternative is - allowed only for noncommercial distribution and only if you - received the program in object code or executable form with such - an offer, in accord with Subsection b above.) - -The source code for a work means the preferred form of the work for -making modifications to it. For an executable work, complete source -code means all the source code for all modules it contains, plus any -associated interface definition files, plus the scripts used to -control compilation and installation of the executable. However, as a -special exception, the source code distributed need not include -anything that is normally distributed (in either source or binary -form) with the major components (compiler, kernel, and so on) of the -operating system on which the executable runs, unless that component -itself accompanies the executable. - -If distribution of executable or object code is made by offering -access to copy from a designated place, then offering equivalent -access to copy the source code from the same place counts as -distribution of the source code, even though third parties are not -compelled to copy the source along with the object code. - - 4. You may not copy, modify, sublicense, or distribute the Program -except as expressly provided under this License. Any attempt -otherwise to copy, modify, sublicense or distribute the Program is -void, and will automatically terminate your rights under this License. -However, parties who have received copies, or rights, from you under -this License will not have their licenses terminated so long as such -parties remain in full compliance. - - 5. You are not required to accept this License, since you have not -signed it. However, nothing else grants you permission to modify or -distribute the Program or its derivative works. These actions are -prohibited by law if you do not accept this License. Therefore, by -modifying or distributing 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 for copying, distributing or modifying -the Program or works based on it. - - 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. -You are not responsible for enforcing compliance by third parties to -this License. - - 7. If, as a consequence of a court judgment or allegation of patent -infringement or for any other reason (not limited to patent issues), -conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot -distribute so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you -may not distribute the Program at all. For example, if a patent -license would not permit royalty-free redistribution of the Program by -all those who receive copies directly or indirectly through you, then -the only way you could satisfy both it and this License would be to -refrain entirely from distribution of the Program. - -If any portion of this section is held invalid or unenforceable under -any particular circumstance, the balance of the section is intended to -apply and the section as a whole is intended to apply in other -circumstances. - -It is not the purpose of this section to induce you to infringe any -patents or other property right claims or to contest validity of any -such claims; this section has the sole purpose of protecting the -integrity of the free software distribution system, which is -implemented by public license practices. Many people have made -generous contributions to the wide range of software distributed -through that system in reliance on consistent application of that -system; it is up to the author/donor to decide if he or she is willing -to distribute software through any other system and a licensee cannot -impose that choice. - -This section is intended to make thoroughly clear what is believed to -be a consequence of the rest of this License. - - 8. If the distribution and/or use of the Program is restricted in -certain countries either by patents or by copyrighted interfaces, the -original copyright holder who places the Program under this License -may add an explicit geographical distribution limitation excluding -those countries, so that distribution is permitted only in or among -countries not thus excluded. In such case, this License incorporates -the limitation as if written in the body of this License. - - 9. 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 this 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 -this License, you may choose any version ever published by the Free Software -Foundation. - - 10. 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 - - 11. 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. - - 12. 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 the public, 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 2 of the License, 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) 19yy 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 is a sample; alter the names: - - Yoyodyne, Inc., hereby disclaims all copyright interest in the program - `Gnomovision' (which makes passes at compilers) written by James Hacker. - - <signature of Ty Coon>, 1 April 1989 - Ty Coon, President of Vice - -This General Public License does not permit incorporating your program into -proprietary programs. If your program is a subroutine library, you may -consider it more useful to permit linking proprietary applications with the -library. If this is what you want to do, use the GNU Library General -Public License instead of this License. diff --git a/contrib/gdb/include/ChangeLog b/contrib/gdb/include/ChangeLog deleted file mode 100644 index 3594591bb9628..0000000000000 --- a/contrib/gdb/include/ChangeLog +++ /dev/null @@ -1,973 +0,0 @@ -Tue Mar 12 17:29:46 1996 Ian Lance Taylor <ian@cygnus.com> - - * bfdlink.h (bfd_wrapped_link_hash_lookup): Declare. - (struct bfd_link_info): Add wrap_hash field. - -Wed Feb 14 16:49:17 1996 Martin Anantharaman <martin@mail.imech.uni-duisburg.de> - - * ieee.h (ieee_record_enum_type): Define - ieee_external_reference_info_enum. - -Fri Feb 2 17:09:25 1996 Doug Evans <dje@charmed.cygnus.com> - - * dis-asm.h (DISASM_RAW_INSN): Delete. - -Tue Jan 23 09:21:47 1996 Doug Evans <dje@charmed.cygnus.com> - - * dis-asm.h (INIT_DISASSEMBLE_INFO): Set endian to BFD_ENDIAN_UNKNOWN. - New argument FPRINTF_FUNC. - -Mon Jan 22 16:37:59 1996 Doug Evans <dje@charmed.cygnus.com> - - * dis-asm.h (disassemble_info): New members arch, mach, endian. - (INIT_DISASSEMBLE_INFO): Initialize them. - (DISASM_RAW_INSN{,FLAG}): Define. - -Thu Jan 18 11:32:38 1996 Ian Lance Taylor <ian@cygnus.com> - - * demangle.h (cplus_demangle_opname): Change opname parameter to - const char *. - (cplus_mangle_opname): Change return type and opname parameter to - const char *. - -Fri Jan 5 00:01:22 1996 Ian Lance Taylor <ian@cygnus.com> - - * ieee.h (enum ieee_record): Add ieee_asn_record_enum, - ieee_at_record_enum, ieee_ty_record_enum, ieee_atn_record_enum, - ieee_bb_record_enum, and ieee_be_record_enum. - -Wed Jan 3 13:12:09 1996 Fred Fish <fnf@cygnus.com> - - * obstack.h: Update copyright to 1996. - (_obstack_memory_used): Declare. - (obstack_memory_used): Define macro. - -Thu Dec 28 11:42:12 1995 Ian Lance Taylor <ian@cygnus.com> - - * libiberty.h (xstrdup): Declare. - -Thu Dec 21 14:47:17 1995 Michael Meissner <meissner@tiktok.cygnus.com> - - * wait.h: Protect all macros with #ifndef. - -Tue Oct 24 21:45:40 1995 Ian Lance Taylor <ian@cygnus.com> - - * bfdlink.h (struct bfd_link_info): Add static_link field. - -Tue Sep 12 16:28:04 1995 Ian Lance Taylor <ian@cygnus.com> - - * bfdlink.h (struct bfd_link_callbacks): Add symbol parameter to - warning callback. - -Fri Sep 1 13:11:51 1995 Ian Lance Taylor <ian@cygnus.com> - - * bfdlink.h (struct bfd_link_callbacks): Change warning callback - to take BFD, section, and address arguments. - -Thu Aug 31 16:45:12 1995 steve chamberlain <sac@slash.cygnus.com> - - * bfdlink.h (struct bfd_link_info): Remove PE stuff. - -Tue Aug 22 03:18:23 1995 Ken Raeburn <raeburn@kr-laptop.cygnus.com> - - * libiberty.h: Declare xstrerror. From Pat Rankin. - -Mon Aug 21 18:11:36 1995 steve chamberlain <sac@slash.cygnus.com> - - * bfdlink.h (struct bfd_link_info): Remove PE stuff. - -Wed Aug 2 08:14:12 1995 Doug Evans <dje@canuck.cygnus.com> - - * dis-asm.h (print_insn_sparc64): Declare. - -Mon Jul 10 13:26:49 1995 Eric Youngdale <eric@aib.com> - - * bfdlink.h (struct bfd_link_info): Add new field symbolic. - -Sun Jul 2 17:48:40 1995 Ian Lance Taylor <ian@cygnus.com> - - * bfdlink.h (struct bfd_link_info): Change type of base_file to - PTR. - -Thu Jun 29 00:02:45 1995 Steve Chamberlain <sac@slash.cygnus.com> - - * bfdlink.h (struct bfd_link_info): Added base_file member. - -Tue Jun 20 16:40:04 1995 Steve Chamberlain <sac@slash.cygnus.com> - - * ansidecl.h: win32s is ANSI enough. - -Thu May 18 04:25:50 1995 Ken Raeburn <raeburn@kr-laptop.cygnus.com> - - Wed May 10 14:28:16 1995 Richard Earnshaw (rearnsha@armltd.co.uk) - - * dis-asm.h (print_insn_arm): Delete declaration. - (print_insn_{little,big}_arm): New declarations. - - * floatformat.h (floatformat_arm_ext): Declare. - -Sat May 13 10:14:08 1995 Steve Chamberlain <sac@slash.cygnus.com> - - * coff/pe.h: New file. - * bfdlink.h (subsytem, stack_heap_parameters): New. - * coff/i386.h (NT_SECTION_ALIGNMENT, NT_FILE_ALIGNMENT, - NT_DEF_RESERVE, NT_DEF_COMMIT): New. - * coff/internal.h (internal_filehdr): New fields for PE. - (IMAGE_DATA_DIRECTORY): New. - (internal_aouthdr): New fields for PE. - -Thu May 4 14:36:42 1995 Jason Merrill <jason@phydeaux.cygnus.com> - - * demangle.h: Don't include ansidecl.h if IN_GCC. - - -Tue Feb 21 00:37:28 1995 Jeff Law (law@snake.cs.utah.edu) - - * hp-symtab.h: Don't use bitfield enumerations, the HP C compiler - does not handle them correctly. - - -Thu Feb 9 14:20:27 1995 Ian Lance Taylor <ian@cygnus.com> - - * libiberty.h (basename): Don't declare parameter type; some - systems have this in their header files. - -Wed Feb 8 17:35:38 1995 Ian Lance Taylor <ian@cygnus.com> - - * bfdlink.h (struct bfd_link_hash_entry): Change format of common - symbol information, to remove restrictions on maximum size and - alignment power, by using a pointer to a structure instead. - -Mon Feb 6 14:55:32 1995 Ian Lance Taylor <ian@cygnus.com> - - * bfdlink.h (enum bfd_link_hash_type): Rename bfd_link_hash_weak - to bfd_link_hash_undefweak. Add bfd_link_hash_defweak. - -Mon Jan 16 21:00:23 1995 Stan Shebs <shebs@andros.cygnus.com> - - * dis-asm.h (GDB_INIT_DISASSEMBLE_INFO, etc): Remove all - GDB-specific definitions. - -Sun Jan 15 18:39:35 1995 Steve Chamberlain <sac@splat> - - * dis-asm.h (print_insn_w65): Declare. - -Thu Jan 12 17:51:17 1995 Ken Raeburn <raeburn@cujo.cygnus.com> - - * libiberty.h (hex_p): Fix sense of test. - -Wed Jan 11 22:36:40 1995 Ken Raeburn <raeburn@cujo.cygnus.com> - - * libiberty.h (_hex_array_size, _hex_bad, _hex_value, hex_init, - hex_p, hex_value): New macros and declarations, for hex.c. - -Fri Jan 6 17:44:14 1995 Ian Lance Taylor <ian@sanguine.cygnus.com> - - * dis-asm.h: Make idempotent. - -Wed Dec 14 13:08:43 1994 Stan Shebs <shebs@andros.cygnus.com> - - * progress.h: New file, empty definitions for progress macros. - - -Fri Nov 25 00:14:05 1994 Jeff Law (law@snake.cs.utah.edu) - - * hp-symtab.h: New file describing the debug symbols emitted - by the HP C compilers. - -Fri Nov 11 15:48:37 1994 Ian Lance Taylor <ian@sanguine.cygnus.com> - - * bfdlink.h (struct bfd_link_hash_entry): Change u.c.size from 24 - to 26 bits, and change u.c.alignment_power from 8 to 6 bits. 6 - bit in the alignment power is enough for a 64 bit address space. - -Mon Oct 31 13:02:51 1994 Stan Shebs (shebs@andros.cygnus.com) - - * demangle.h (cplus_mangle_opname): Declare. - -Tue Oct 25 11:38:02 1994 Ian Lance Taylor <ian@sanguine.cygnus.com> - - * bfdlink.h (struct bfd_link_callbacks): Fix comments for - multiple_common field. - -Sun Sep 04 17:58:10 1994 Richard Earnshaw (rwe@pegasus.esprit.ec.org) - - * aout/aout64.h: Only define QMAGIC if it isn't already defined. - - * dis-asm.h: Add support for the ARM. - -Wed Aug 10 12:51:41 1994 Doug Evans (dje@canuck.cygnus.com) - - * libiberty.h (strsignal): Document its existence even if we - can't declare it. - -Tue Aug 2 14:40:03 1994 Jim Kingdon (kingdon@lioth.cygnus.com) - - * os9k.h: Remove u_int16, u_int32, and owner_id typedefs and - expand their uses. Those names conflict with Mach headers. - -Fri Jul 22 14:17:12 1994 Ian Lance Taylor (ian@sanguine.cygnus.com) - - * bfdlink.h (struct bfd_link_hash_entry): Change u.c.size into a - bitfield. Add field u.c.alignment_power. - -Sun Jul 10 00:26:39 1994 Ian Dall (dall@hfrd.dsto.gov.au) - - * dis-asm.h: Add print_insn_ns32k declaration. - -Mon Jun 20 17:13:29 1994 Ian Lance Taylor (ian@sanguine.cygnus.com) - - * bfdlink.h (bfd_link_hash_table): Make creator a const pointer. - -Sat Jun 18 16:09:32 1994 Stan Shebs (shebs@andros.cygnus.com) - - * demangle.h (cplus_demangle_opname): Declare. - -Thu Jun 16 15:19:03 1994 Ian Lance Taylor (ian@tweedledumb.cygnus.com) - - * bfdlink.h (struct bfd_link_info): Add new field shared. - -Mon Jun 6 14:39:44 1994 Ian Lance Taylor (ian@tweedledumb.cygnus.com) - - * bfdlink.h (struct bfd_link_hash_entry): Remove written field: - not needed for all backends. - -Thu Apr 28 19:06:50 1994 Ken Raeburn (raeburn@cujo.cygnus.com) - - * dis-asm.h (disassembler): Declare. - -Fri Apr 1 00:38:17 1994 Jim Wilson (wilson@mole.gnu.ai.mit.edu) - - * obstack.h: Delete use of IN_GCC to control whether - stddef.h or gstddef.h is included. - -Tue Mar 22 13:06:02 1994 Ian Lance Taylor (ian@tweedledumb.cygnus.com) - - * bfdlink.h (enum bfd_link_order_type): Add bfd_data_link_order. - (struct bfd_link_order): Add data field to union. - -Mon Mar 21 18:45:26 1994 Ian Lance Taylor (ian@tweedledumb.cygnus.com) - - * bfdlink.h (struct bfd_link_callbacks): Change bitsize argument - to add_to_set to reloc. Remove bitsize argument from constructor. - Comment that reloc_overflow, reloc_dangerous and unattached_reloc - must handle NULL pointers for reloc location. - (enum bfd_link_order_type): Add bfd_section_reloc_link_order and - bfd_symbol_reloc_link_order. - (struct bfd_link_order): Add reloc field to union. - (struct bfd_link_order_reloc): Define. - -Mon Mar 14 12:27:50 1994 Ian Lance Taylor (ian@cygnus.com) - - * ieee-float.h: Removed; no longer used. - -Tue Mar 1 18:10:49 1994 Kung Hsu (kung@mexican.cygnus.com) - - * os9k.h: os9000 target specific header file, the header of the - object file is used now. - -Sun Feb 27 21:52:26 1994 Jim Kingdon (kingdon@deneb.cygnus.com) - - * floatformat.h: New file, intended to replace ieee-float.h. - -Sun Feb 20 17:15:42 1994 Ian Lance Taylor (ian@lisa.cygnus.com) - - * ansidecl.h (ANSI_PROTOTYPES): Define if using ANSI prototypes. - -Wed Feb 16 01:07:12 1994 Ian Lance Taylor (ian@tweedledumb.cygnus.com) - - * libiberty.h: Don't declare strsignal, to avoid conflicts with - Solaris system header files. - -Sat Feb 12 22:11:32 1994 Jeffrey A. Law (law@snake.cs.utah.edu) - - * libiberty.h (xexit): Use __volatile__ to avoid losing if - compiling with gcc -traditional. - -Thu Feb 10 14:05:41 1994 Ian Lance Taylor (ian@cygnus.com) - - * libiberty.h: New file. Declares functions provided by - libiberty. - -Tue Feb 8 05:19:52 1994 David J. Mackenzie (djm@thepub.cygnus.com) - - Handle obstack_chunk_alloc returning NULL. This allows - obstacks to be used by libraries, without forcing them - to call exit or longjmp. - * obstack.h (struct obstack): Add alloc_failed flag. - _obstack_begin, _obstack_begin_1): Declare to return int, not void. - (obstack_finish): If alloc_failed, return NULL. - (obstack_base, obstack_next_free, objstack_object_size): - If alloc_failed, return 0. - (obstack_grow, obstack_grow0, obstack_1grow, obstack_ptr_grow, - obstack_int_grow, obstack_blank): If alloc_failed, do nothing that - could corrupt the obstack. - -Mon Jan 24 15:06:05 1994 Ian Lance Taylor (ian@tweedledumb.cygnus.com) - - * bfdlink.h (struct bfd_link_callbacks): Add name, reloc_name and - addend argments to reloc_overflow callback. - -Fri Jan 21 19:13:12 1994 Ian Lance Taylor (ian@tweedledumb.cygnus.com) - - * dis-asm.h (print_insn_big_powerpc, print_insn_little_powerpc, - print_insn_rs6000): Declare. - -Thu Jan 6 14:15:55 1994 Ian Lance Taylor (ian@tweedledumb.cygnus.com) - - * bfdlink.h (struct bfd_link_callbacks): Add bitsize argument to - add_to_set field. Add new callback named constructor. - -Thu Dec 30 10:44:06 1993 Ian Lance Taylor (ian@rtl.cygnus.com) - - * bfdlink.h: New file for new BFD linker backend routines. - -Mon Nov 29 10:43:57 1993 Ian Lance Taylor (ian@tweedledumb.cygnus.com) - - * dis-asm.h (enum dis_insn_tyupe): Remove non-ANSI trailing comma. - -Sat Oct 2 20:42:26 1993 Jim Kingdon (kingdon@lioth.cygnus.com) - - * dis-asm.h: Move comment to right place. - -Mon Aug 9 19:03:35 1993 David J. Mackenzie (djm@thepub.cygnus.com) - - * obstack.h (obstack_chunkfun, obstack_freefun): Add defns from - previous version. Are these Cygnus local changes? - -Fri Aug 6 17:05:47 1993 David J. Mackenzie (djm@thepub.cygnus.com) - - * getopt.h, obstack.h: Update to latest FSF version. - -Mon Aug 2 16:37:14 1993 Stu Grossman (grossman at cygnus.com) - - * coff/i386.h: Add Lynx magic number. - -Mon Aug 2 14:45:29 1993 John Gilmore (gnu@cygnus.com) - - * dis-asm.h: Move enum outside of struct defn to avoid warnings. - -Mon Aug 2 08:49:30 1993 Stu Grossman (grossman at cygnus.com) - - * wait.h (WEXITSTATUS, WSTOPSIG): Mask down to 8 bits. This is - for systems that store stuff into the high 16 bits of a wait - status. - -Fri Jul 30 18:38:02 1993 John Gilmore (gnu@cygnus.com) - - * dis-asm.h: Add new fields insn_info_valid, branch_delay_insns, - data_size, insn_type, target, target2. These are used to return - information from the instruction decoders back to the calling - program. Add comments, make more readable. - -Mon Jul 19 22:14:14 1993 Fred Fish (fnf@deneb.cygnus.com) - - * nlm: New directory containing NLM/NetWare includes. - -Thu Jul 15 12:10:04 1993 Ken Raeburn (raeburn@cambridge.cygnus.com) - - * dis-asm.h (struct disassemble_info): New field application_data. - -Thu Jul 15 12:41:15 1993 Ian Lance Taylor (ian@tweedledumb.cygnus.com) - - * dis-asm.h: Added declaration of print_insn_m88k. - -Thu Jul 8 09:05:26 1993 Doug Evans (dje@canuck.cygnus.com) - - * opcode/h8300.h: Lots of little fixes for the h8/300h. - -Fri Jul 2 10:31:59 1993 Ian Lance Taylor (ian@cygnus.com) - - * ansidecl.h: Use ANSI macros if __mips and _SYSTYPE_SVR4 are - defined, since RISC/OS cc handles ANSI declarations in SVR4 mode - but does not define __STDC__. - -Sun Jun 20 18:27:52 1993 Ken Raeburn (raeburn@poseidon.cygnus.com) - - * dis-asm.h: Don't need to include ansidecl.h any more. - -Fri Jun 18 03:22:10 1993 John Gilmore (gnu@cygnus.com) - - * oasys.h: Eliminate "int8_type", "int16_type", "int32_type", and - their variants. These changes are coordinated with corresponding - changes in ../bfd/oasys.c. - -Wed Jun 16 10:43:08 1993 Fred Fish (fnf@cygnus.com) - - * bfd.h: Note that it has been removed. - -Tue Jun 8 12:16:03 1993 Steve Chamberlain (sac@phydeaux.cygnus.com) - - Support for H8/300-H - * dis-asm.h (print_insn_h8300, print_insn_h8300h): Declare it. - * coff/h8300.h: New magic number. - * coff/internal.h: New relocations. - * opcode/h8300.h: Lots of new opcodes. - -Tue Jun 1 07:35:03 1993 Ken Raeburn (raeburn@kr-pc.cygnus.com) - - * ansidecl.h (const): Don't define it if it's already defined. - -Thu May 27 18:19:51 1993 Ken Raeburn (raeburn@cambridge.cygnus.com) - - * dis-asm.h (print_insn_hppa): Declare it. - - * bfd.h: Moved to bfd directory. Small stub here includes it - without requiring "-I../bfd". - -Thu Apr 29 12:06:13 1993 Ken Raeburn (raeburn@deneb.cygnus.com) - - * bfd.h: Updated with BSF_FUNCTION. - -Mon Apr 26 18:15:50 1993 Steve Chamberlain (sac@thepub.cygnus.com) - - * bfd.h, dis-asm.h: Updated with Hitachi SH. - -Fri Apr 23 18:41:38 1993 Steve Chamberlain (sac@thepub.cygnus.com) - - * bfd.h: Updated with alpha changes. - * dis-asm.h: Added alpha. - -Fri Apr 16 17:35:30 1993 Jim Kingdon (kingdon@cygnus.com) - - * bfd.h: Update for signed bfd_*get_*. - -Thu Apr 15 09:24:21 1993 Jim Kingdon (kingdon@cygnus.com) - - * bfd.h: Updated for file_truncated error. - -Thu Apr 8 10:53:47 1993 Ian Lance Taylor (ian@cygnus.com) - - * ansidecl.h: If no ANSI, define const to be empty. - -Thu Apr 1 09:00:10 1993 Jim Kingdon (kingdon@cygnus.com) - - * dis-asm.h: Declare a29k and i960 print_insn_*. - - * dis-asm.h: Add print_address_func and related stuff. - - * dis-asm.h (dis_asm_read_memory): Fix prototype. - -Wed Mar 31 17:40:16 1993 Jim Kingdon (kingdon@lioth.cygnus.com) - - * dis-asm.h: Add print_insn_sparc. - -Wed Mar 31 17:51:42 1993 Ian Lance Taylor (ian@cygnus.com) - - * bfd.h: Updated for BFD_RELOC_MIPS_GPREL and bfd_[gs]et_gp_size - prototypes. - -Wed Mar 31 16:35:12 1993 Stu Grossman (grossman@cygnus.com) - - * dis-asm.h: (disassemble_info): Fix typo in prototype of - dis_asm_memory_error(). - -Tue Mar 30 19:09:23 1993 Jim Kingdon (kingdon@lioth.cygnus.com) - - * dis-asm.h (disassembler_info): Add read_memory_func, - memory_error_func, buffer, and length. - ({GDB_,}INIT_DISASSEMBLE_INFO): Set them. - print_insn_*: Remove second argument. - -Tue Mar 30 14:48:55 1993 Steve Chamberlain (sac@thepub.cygnus.com) - - * bfd.h: Update for lma field of section. - -Tue Mar 30 12:22:55 1993 Jim Kingdon (kingdon@cygnus.com) - - * ansidecl.h: Use ANSI versions on AIX regardless of __STDC__. - -Fri Mar 19 14:49:49 1993 Steve Chamberlain (sac@thepub.cygnus.com) - - * dis-asm.h: Add h8500. - -Thu Mar 18 13:49:09 1993 Per Bothner (bothner@rtl.cygnus.com) - - * ieee-float.h: Moved from ../gdb. - * dis-asm.h: New file. Interface to dis-assembler. - -Thu Mar 11 10:52:57 1993 Fred Fish (fnf@cygnus.com) - - * demangle.h (DMGL_NO_OPTS): Add define (set to 0) to use - in place of bare 0, for readability reasons. - -Tue Mar 2 17:50:11 1993 Fred Fish (fnf@cygnus.com) - - * demangle.h: Replace all references to cfront with ARM. - -Tue Feb 23 12:21:14 1993 Ian Lance Taylor (ian@cygnus.com) - - * bfd.h: Update for new elements in JUMP_TABLE. - -Tue Feb 16 00:51:30 1993 John Gilmore (gnu@cygnus.com) - - * bfd.h: Update for BFD_VERSION 2.1. - -Tue Jan 26 11:49:20 1993 Ian Lance Taylor (ian@cygnus.com) - - * bfd.h: Update for SEC_IS_COMMON flag. - -Tue Jan 19 12:25:12 1993 Ian Lance Taylor (ian@tweedledumb.cygnus.com) - - * bfd.h: Update for bfd_asymbol_value bug fix. - -Fri Jan 8 16:37:18 1993 Ian Lance Taylor (ian@tweedledumb.cygnus.com) - - * bfd.h: Update to include ECOFF tdata and target_flavour. - -Sun Dec 27 17:52:30 1992 Fred Fish (fnf@cygnus.com) - - * bfd.h: Add declaration for bfd_get_size(). - -Tue Dec 22 22:42:46 1992 Fred Fish (fnf@cygnus.com) - - * demangle.h: Protect file from multiple inclusions with - #if !defined(DEMANGLE_H)...#define DEMANGLE_H...#endif. - -Mon Dec 21 21:25:50 1992 Stu Grossman (grossman at cygnus.com) - - * bfd.h: Update to get hppa_core_struct from bfd.c. - -Thu Dec 17 00:42:35 1992 John Gilmore (gnu@cygnus.com) - - * bfd.h: Update to get tekhex tdata name change from bfd. - -Mon Nov 9 23:55:42 1992 John Gilmore (gnu@cygnus.com) - - * ansidecl.h: Update comments to discourage use of EXFUN. - -Thu Nov 5 16:35:44 1992 Ian Lance Taylor (ian@cygnus.com) - - * bfd.h: Update to bring in SEC_SHARED_LIBRARY. - -Thu Nov 5 03:21:32 1992 John Gilmore (gnu@cygnus.com) - - * bfd.h: Update to match EXFUN, bfd_seclet_struct, and SDEF - cleanups in bfd. - -Wed Nov 4 07:28:05 1992 Ken Raeburn (raeburn@cygnus.com) - - * bout.h (N_CALLNAME, N_BALNAME): Define as char-type values, so - widening works consistently. - -Fri Oct 16 03:17:08 1992 John Gilmore (gnu@cygnus.com) - - * getopt.h: Update to Revised Standard FSF Version. - -Thu Oct 15 21:43:22 1992 K. Richard Pixley (rich@sendai.cygnus.com) - - * getopt.h (struct option): use the provided enum for has_arg. - - * demangle.h (AUTO_DEMANGLING, GNU_DEMANGLING, - LUCID_DEMANGLING): ultrix compilers require enums to be - enums and ints to be ints and casts where they meet. cast some - enums into ints. - -Thu Oct 15 04:35:51 1992 John Gilmore (gnu@cygnus.com) - - * bfd.h: Update after comment changes. - -Thu Oct 8 09:03:02 1992 Steve Chamberlain (sac@thepub.cygnus.com) - - * bfd.h (bfd_get_symbol_leading_char): new macro for getting in xvec - -Thu Sep 3 09:10:50 1992 Stu Grossman (grossman at cygnus.com) - - * bfd.h (struct reloc_howto_struct): size needs to be signed if - it's going to hold negative values. - -Sun Aug 30 17:50:27 1992 Per Bothner (bothner@rtl.cygnus.com) - - * demangle.h: New file, moved from ../gdb. Made independent - of gdb. Allow demangling style option to be passed as a - parameter to cplus_demangle(), but using the - current_demangling_style global as the default. - -Sat Aug 29 10:07:55 1992 Fred Fish (fnf@cygnus.com) - - * obstack.h: Merge comment change from current FSF version. - -Thu Aug 27 12:59:29 1992 Brendan Kehoe (brendan@cygnus.com) - - * bfd.h: add we32k - -Tue Aug 25 15:07:47 1992 Steve Chamberlain (sac@thepub.cygnus.com) - - * bfd.h: new after Z8000 stuff - -Mon Aug 17 09:01:23 1992 Ken Raeburn (raeburn@cygnus.com) - - * bfd.h: Regenerated after page/segment size changes. - -Sat Aug 1 13:46:31 1992 Fred Fish (fnf@cygnus.com) - - * obstack.h: Merge changes from current FSF version. - -Mon Jul 20 21:06:23 1992 Fred Fish (fnf@cygnus.com) - - * obstack.h (area_id, flags): Remove, replace with extra_arg, - use_extra_arg, and maybe_empty_object. - * obstack.h (OBSTACK_MAYBE_EMPTY_OBJECT, OBSTACK_MMALLOC_LIKE): - Remove, replaced by maybe_empty_object and use_extra_arg bitfields. - * obstack.h (obstack_full_begin, _obstack_begin): Remove area_id - and flags arguments. - * obstack.h (obstack_alloc_arg): New macro to set extra_arg. - -Thu Jul 16 08:12:44 1992 Steve Chamberlain (sac@thepub.cygnus.com) - - * bfd.h: new after adding BFD_IS_RELAXABLE - -Sat Jul 4 03:22:23 1992 John Gilmore (gnu at cygnus.com) - - * bfd.h: Regen after adding BSF_FILE. - -Mon Jun 29 14:18:36 1992 Fred Fish (fnf at sunfish) - - * obstack.h: Convert bcopy() use to memcpy(), which is more - portable, more standard, and can take advantage of gcc's builtin - functions for increased performance. - -Thu Jun 25 04:46:08 1992 John Gilmore (gnu at cygnus.com) - - * ansidecl.h (PARAMS): Incorporate this macro from gdb's defs.h. - It's a cleaner way to forward-declare function prototypes. - -Fri Jun 19 15:46:32 1992 Stu Grossman (grossman at cygnus.com) - - * bfd.h: HPPA merge. - -Tue Jun 16 21:30:56 1992 K. Richard Pixley (rich@cygnus.com) - - * getopt.h: gratuitous white space changes merged from other prep - releases. - -Thu Jun 11 01:10:55 1992 John Gilmore (gnu at cygnus.com) - - * bfd.h: Regen'd from bfd.c after removing elf_core_tdata_struct. - -Mon May 18 17:29:03 1992 K. Richard Pixley (rich@cygnus.com) - - * getopt.h: merged changes from make-3.62.11. - - * getopt.h: merged changes from grep-1.6 (alpha). - -Fri May 8 14:53:32 1992 K. Richard Pixley (rich@cygnus.com) - - * getopt.h: merged changes from bison-1.18. - -Sat Mar 14 17:25:20 1992 Fred Fish (fnf@cygnus.com) - - * obstack.h: Add "area_id" and "flags" members to obstack - structure. Add obstack_chunkfun() and obstack_freefun() to - set functions explicitly. Convert maybe_empty_object to - a bit in "flags". - -Thu Feb 27 22:01:02 1992 Per Bothner (bothner@cygnus.com) - - * wait.h (WIFSTOPPED): Add IBM rs6000-specific version. - -Fri Feb 21 20:49:20 1992 John Gilmore (gnu at cygnus.com) - - * obstack.h: Add obstack_full_begin. - * bfd.h, obstack.h: Protolint. - -Thu Jan 30 01:18:42 1992 John Gilmore (gnu at cygnus.com) - - * bfd.h: Remove comma from enum declaration. - -Mon Jan 27 22:01:13 1992 Steve Chamberlain (sac at cygnus.com) - - * bfd.h : new target entr, bfd_relax_section - -Wed Dec 18 17:19:44 1991 Stu Grossman (grossman at cygnus.com) - - * bfd.h, ieee.h, opcode/m68k.h, opcode/sparc.h: ANSIfy enums. - -Thu Dec 12 20:59:56 1991 John Gilmore (gnu at cygnus.com) - - * fopen-same.h, fopen-bin.h: New files for configuring - whether fopen distinguishes binary files or not. For use - by host-dependent config files. - -Sat Nov 30 20:46:43 1991 Steve Chamberlain (sac at rtl.cygnus.com) - - * bfd.h: change the documentation format. - - * created coff, elf and opcode and aout directories. Moved: - - aout64.h ==> aout/aout64.h - ar.h ==> aout/ar.h - a.out.encap.h ==> aout/encap.h - a.out.host.h ==> aout/host.h - a.out.hp.h ==> aout/hp.h - a.out.sun4.h ==> aout/sun4.h - ranlib.h ==> aout/ranlib.h - reloc.h ==> aout/reloc.h - stab.def ==> aout/stab.def - stab.gnu.h ==> aout/stab_gnu.h - - coff-a29k.h ==> coff/a29k.h - coff-h8300.h ==> coff/h8300.h - coff-i386.h ==> coff/i386.h - coff-i960.h ==> coff/i960.h - internalcoff.h ==> coff/internal.h - coff-m68k.h ==> coff/m68k.h - coff-m88k.h ==> coff/m88k.h - coff-mips.h ==> coff/mips.h - coff-rs6000.h ==> coff/rs6000.h - - elf-common.h ==> elf/common.h - dwarf.h ==> elf/dwarf.h - elf-external.h ==> elf/external.h - elf-internal.h ==> elf/internal.h - - a29k-opcode.h ==> opcode/a29k.h - arm-opcode.h ==> opcode/arm.h - h8300-opcode.h ==> opcode/h8300.h - i386-opcode.h ==> opcode/i386.h - i860-opcode.h ==> opcode/i860.h - i960-opcode.h ==> opcode/i960.h - m68k-opcode.h ==> opcode/m68k.h - m88k-opcode.h ==> opcode/m88k.h - mips-opcode.h ==> opcode/mips.h - np1-opcode.h ==> opcode/np1.h - ns32k-opcode.h ==> opcode/ns32k.h - pn-opcode.h ==> opcode/pn.h - pyr-opcode.h ==> opcode/pyr.h - sparc-opcode.h ==> opcode/sparc.h - tahoe-opcode.h ==> opcode/tahoe.h - vax-opcode.h ==> opcode/vax.h - - - -Wed Nov 27 10:38:31 1991 Steve Chamberlain (sac at rtl.cygnus.com) - - * internalcoff.h: (internal_scnhdr) took out #def dependency, now - s_nreloc and s_nlnno are always long. (internal_reloc): allways - has an offset field now. - -Fri Nov 22 08:12:58 1991 John Gilmore (gnu at cygnus.com) - - * coff-rs6000.h: Lint; use unsigned chars for external fields. - * internalcoff.h: Lint; cast storage classes to signed char. - -Thu Nov 21 21:01:05 1991 Per Bothner (bothner at cygnus.com) - - * stab.def: Remove the GNU extended type codes (e.g. N_SETT). - * aout64.h: The heuristic for distinguishing between - sunos-style and bsd-style ZMAGIC files (wrt. where the - text segment starts) is moved into (the default definition of) - the macro N_HEADER_IN_TEXT. This definition is only used - if no other definition is used - e.g. bfd/newsos3.c defines - N_HEADER_IN_TEXT(x) to be always 0 (as before). - -Thu Nov 21 11:53:03 1991 John Gilmore (gnu at cygnus.com) - - * aout64.h (N_TXTADDR, N_TXTOFF, N_TXTSIZE): New definitions - that should handle all uses. LOGICAL_ versions deleted. - Eliminate N_HEADER_IN_TEXT, using a_entry to determine which - kind of zmagic a.out file we are looking at. - * coff-rs6000.h: Typo. - -Tue Nov 19 18:43:37 1991 Per Bothner (bothner at cygnus.com) - - (Note: This is a revised entry, as was aout64.h.) - * aout64.h: Some cleanups of N_TXTADDR and N_TXTOFF: - Will now work for both old- and new-style ZMAGIC files, - depending on N_HEADER_IN_TEXT macro. - Add LOGICAL_TXTADDR, LOICAL_TXTOFF and LOGICAL_TXTSIZE - that don't count the exec header as part - of the text segment, to be consistent with bfd. - * a.out.sun4.h: Simplified/fixed for previous change. - -Mon Nov 18 00:02:06 1991 Fred Fish (fnf at cygnus.com) - - * dwarf.h: Update to DWARF draft 5 version from gcc2. - -Thu Nov 14 19:44:59 1991 Per Bothner (bothner at cygnus.com) - - * stab.def: Added defs for extended GNU symbol types, - such as N_SETT. These are normally ifdef'd out (because - of conflicts with a.out.gnu.h), but are used by bfb_stab_name(). - -Thu Nov 14 19:17:03 1991 Fred Fish (fnf at cygnus.com) - - * elf-common.h: Add defines to support ELF symbol table code. - -Mon Nov 11 19:01:06 1991 Fred Fish (fnf at cygnus.com) - - * elf-internal.h, elf-external.h, elf-common.h: Add support for - note sections, which are used in ELF core files to hold copies - of various /proc structures. - -Thu Nov 7 08:58:26 1991 Steve Chamberlain (sac at cygnus.com) - - * internalcoff.h: took out the M88 dependency in the lineno - struct. - * coff-m88k.h: defines GET_LINENO_LNNO and PUT_LINENO_LNNO to use - 32bit linno entries. - * a29k-opcode.h: fixed encoding of mtacc - -Sun Nov 3 11:54:22 1991 Per Bothner (bothner at cygnus.com) - - * bfd.h: Updated from ../bfd/bfd-in.h (q.v). - -Fri Nov 1 11:13:53 1991 John Gilmore (gnu at cygnus.com) - - * internalcoff.h: Add x_csect defines. - -Fri Oct 25 03:18:20 1991 John Gilmore (gnu at cygnus.com) - - * Rename COFF-related files in `coff-ARCH.h' form. - coff-a29k.h, coff-i386.h, coff-i960.h, coff-m68k.h, coff-m88k.h, - coff-mips.h, coff-rs6000.h to be exact. - -Thu Oct 24 22:11:11 1991 John Gilmore (gnu at cygnus.com) - - RS/6000 support, by Metin G. Ozisik, Mimi Phûông-Thåo Võ, and - John Gilmore. - - * a.out.gnu.h: Update slightly. - * bfd.h: Add new error code, fix doc, add bfd_arch_rs6000. - * internalcoff.h: Add more F_ codes for filehdr. Add - rs/6000-dependent fields to aouthdr. Add storage classes - to syments. Add 6000-specific auxent. Add r_size in reloc. - * rs6000coff.c: New file. - -Thu Oct 24 04:13:20 1991 Fred Fish (fnf at cygnus.com) - - * dwarf.h: New file for dwarf support. Copied from gcc2 - distribution. - -Wed Oct 16 13:31:45 1991 John Gilmore (gnu at cygnus.com) - - * aout64.h: Remove PAGE_SIZE defines; they are target-dependent. - Add N_FN_SEQ for N_FN symbol type used on Sequent machines. - * stab.def: Include N_FN_SEQ in table. - * bout.h: External formats of structures use unsigned chars. - -Fri Oct 11 12:40:43 1991 Steve Chamberlain (steve at cygnus.com) - - * bfd.h:upgrade from bfd.c - * internalcoff.h: add n_name, n_zeroes and n_offset macros - * amdcoff.h: Define OMAGIC and AOUTHDRSZ. - -Fri Oct 11 10:58:06 1991 Per Bothner (bothner at cygnus.com) - - * a.out.host.h: Change SEGMENT_SIZE to 0x1000 for Sony. - * bfd.h (align_power): Add (actually move) comment. - -Tue Oct 8 15:29:32 1991 Per Bothner (bothner at cygnus.com) - - * sys/h-rtbsd.h: Define MISSING_VFPRINT (for binutils/bucomm.c). - -Sun Oct 6 19:24:39 1991 John Gilmore (gnu at cygnus.com) - - * aout64.h: Move struct internal_exec to ../bfd/libaout.h so - it can be shared by all `a.out-family' code. Rename - EXTERNAL_LIST_SIZE to EXTERNAL_NLIST_SIZE. Use basic types - for nlist members, and make strx integral rather than pointer. - More commentary on n_type values. - * bout.h: Provide a struct external_exec rather than an - internal_exec. - * m68kcoff.h: Remove `tagentries' which snuck in from the i960 - COFF port. - -Fri Oct 4 01:25:59 1991 John Gilmore (gnu at cygnus.com) - - * h8300-opcode.h: Remove `_enum' from the typedef for an enum. - * bfd.h: Update to match bfd changes. - - * sys/h-i386mach.h, sysdep.h: Add 386 Mach host support. - -Tue Oct 1 04:58:42 1991 John Gilmore (gnu at cygnus.com) - - * bfd.h, elf-common.h, elf-external.h, elf-internal.h: - Add preliminary ELF support, sufficient for GDB, from Fred Fish. - * sysdep.h, sys/h-amix.h: Support Amiga SVR4. - - * sys/h-vaxult.h: Make it work. (David Taylor <taylor@think.com>) - * a.out.vax.h: Remove unused and confusing file. - -Mon Sep 30 12:52:35 1991 Per Bothner (bothner at cygnus.com) - - * sysdep.h: Define NEWSOS3_SYS, and use it. - -Fri Sep 20 13:38:21 1991 John Gilmore (gnu at cygnus.com) - - * a.out.gnu.h (N_FN): Its value *really is* 0x1F. - Fix it, and add comments warning about or-ing N_EXT with it - and/or N_WARNING. - * aout64.h (N_FN): Fix value, add comments about N_EXT. - * stab.def (table at end): Update to show all the type - values <0x20, including low order bits. Move N_FN to - its rightful place. - -Tue Sep 17 17:41:37 1991 Stu Grossman (grossman at cygnus.com) - - * sys/h-irix3.h: sgi/irix support. - -Tue Sep 17 07:52:59 1991 John Gilmore (gnu at cygint.cygnus.com) - - * stab.def (N_DEFD): Add GNU Modula-2 debug stab, from Andrew - Beers. - -Thu Sep 12 14:12:59 1991 John Gilmore (gnu at cygint.cygnus.com) - - * internalcoff.h (SYMNMLEN, FILNMLEN, DIMNUM): Define these - for internalcoff, separately from the various external coff's. - * amdcoff.h, bcs88kcoff.h, i386coff.h, intel-coff.h, m68kcoff.h, - m88k-bcs.h: Prefix SYMNMLEN, FILNMLEN, and DIMNUM with E_'s for - the external struct definitions. - * ecoff.h: Remove these #define's, kludge no longer needed. - - * sys/h-ultra3.h: Add new Ultracomputer host. - * sysdep.h: Add ULTRA3_SYM1_SYS and use it. - -Tue Sep 10 10:11:46 1991 John Gilmore (gnu at cygint.cygnus.com) - - * i386coff.h (LINESZ): Always 6, not based on sizeof(). - (Fix from Peter Schauer <pes@regent.e-technik.tu-muenchen.de>.) - -Wed Sep 4 08:58:37 1991 John Gilmore (gnu at cygint.cygnus.com) - - * a.out.gnu.h, aout64.h: Add N_WARNING. Change N_FN to 0x0E, - to match SunOS and BSD. Add N_COMM as 0x12 for SunOS shared lib - support. - * stab.def: Add N_COMM to table, fix overlap comment. - -Tue Sep 3 06:29:20 1991 John Gilmore (gnu at cygint.cygnus.com) - - Merge with latest FSF versions of these files. - - * stab.gnu.h: Add LAST_UNUSED_STAB_CODE. - * stab.def: Update to GPL2. Move N_WARNING out, since not a - debug symbol. Change comments, and reorder table to numeric - order. Update final table comment. - (N_DSLINE, N_BSLINE): Renumber from 0x66 and 0x68, to 0x46 and 0x48. - - * obstack.h: GPL2. Merge. - -Fri Aug 23 01:54:23 1991 John Gilmore (gnu at cygint.cygnus.com) - - * a.out.gnu.h, a.out.sun4.h: Make SEGMENT_SIZE able to depend - on the particular a.out being examined. - * a.out.sun4.h: Define segment sizes for Sun-3's and Sun-4's. - * FIXME: a.out.gnu.h is almost obsolete. - * FIXME: a.out.sun4.h should be renamed a.out.sun.h now. - -Wed Aug 21 20:32:13 1991 John Gilmore (gnu at cygint.cygnus.com) - - * Start a ChangeLog for the includes directory. - - * a.out.gnu.h (N_FN): Fix value -- was 15, should be 0x1E. - * stab.def: Update allocation table in comments at end, - to reflect reality as I know it. - - -Local Variables: -mode: indented-text -left-margin: 8 -fill-column: 74 -version-control: never -End: diff --git a/contrib/gdb/include/ansidecl.h b/contrib/gdb/include/ansidecl.h deleted file mode 100644 index be04e42d56a3b..0000000000000 --- a/contrib/gdb/include/ansidecl.h +++ /dev/null @@ -1,141 +0,0 @@ -/* ANSI and traditional C compatability macros - Copyright 1991, 1992 Free Software Foundation, Inc. - This file is part of the GNU C Library. - -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 2 of the License, 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ - -/* ANSI and traditional C compatibility macros - - ANSI C is assumed if __STDC__ is #defined. - - Macro ANSI C definition Traditional C definition - ----- ---- - ---------- ----------- - ---------- - PTR `void *' `char *' - LONG_DOUBLE `long double' `double' - VOLATILE `volatile' `' - SIGNED `signed' `' - PTRCONST `void *const' `char *' - ANSI_PROTOTYPES 1 not defined - - CONST is also defined, but is obsolete. Just use const. - - DEFUN (name, arglist, args) - - Defines function NAME. - - ARGLIST lists the arguments, separated by commas and enclosed in - parentheses. ARGLIST becomes the argument list in traditional C. - - ARGS list the arguments with their types. It becomes a prototype in - ANSI C, and the type declarations in traditional C. Arguments should - be separated with `AND'. For functions with a variable number of - arguments, the last thing listed should be `DOTS'. - - DEFUN_VOID (name) - - Defines a function NAME, which takes no arguments. - - obsolete -- EXFUN (name, (prototype)) -- obsolete. - - Replaced by PARAMS. Do not use; will disappear someday soon. - Was used in external function declarations. - In ANSI C it is `NAME PROTOTYPE' (so PROTOTYPE should be enclosed in - parentheses). In traditional C it is `NAME()'. - For a function that takes no arguments, PROTOTYPE should be `(void)'. - - PARAMS ((args)) - - We could use the EXFUN macro to handle prototype declarations, but - the name is misleading and the result is ugly. So we just define a - simple macro to handle the parameter lists, as in: - - static int foo PARAMS ((int, char)); - - This produces: `static int foo();' or `static int foo (int, char);' - - EXFUN would have done it like this: - - static int EXFUN (foo, (int, char)); - - but the function is not external...and it's hard to visually parse - the function name out of the mess. EXFUN should be considered - obsolete; new code should be written to use PARAMS. - - For example: - extern int printf PARAMS ((CONST char *format DOTS)); - int DEFUN(fprintf, (stream, format), - FILE *stream AND CONST char *format DOTS) { ... } - void DEFUN_VOID(abort) { ... } -*/ - -#ifndef _ANSIDECL_H - -#define _ANSIDECL_H 1 - - -/* Every source file includes this file, - so they will all get the switch for lint. */ -/* LINTLIBRARY */ - - -#if defined (__STDC__) || defined (_AIX) || (defined (__mips) && defined (_SYSTYPE_SVR4)) || defined(WIN32) -/* All known AIX compilers implement these things (but don't always - define __STDC__). The RISC/OS MIPS compiler defines these things - in SVR4 mode, but does not define __STDC__. */ - -#define PTR void * -#define PTRCONST void *CONST -#define LONG_DOUBLE long double - -#define AND , -#define NOARGS void -#define CONST const -#define VOLATILE volatile -#define SIGNED signed -#define DOTS , ... - -#define EXFUN(name, proto) name proto -#define DEFUN(name, arglist, args) name(args) -#define DEFUN_VOID(name) name(void) - -#define PROTO(type, name, arglist) type name arglist -#define PARAMS(paramlist) paramlist -#define ANSI_PROTOTYPES 1 - -#else /* Not ANSI C. */ - -#define PTR char * -#define PTRCONST PTR -#define LONG_DOUBLE double - -#define AND ; -#define NOARGS -#define CONST -#ifndef const /* some systems define it in header files for non-ansi mode */ -#define const -#endif -#define VOLATILE -#define SIGNED -#define DOTS - -#define EXFUN(name, proto) name() -#define DEFUN(name, arglist, args) name arglist args; -#define DEFUN_VOID(name) name() -#define PROTO(type, name, arglist) type name () -#define PARAMS(paramlist) () - -#endif /* ANSI C. */ - -#endif /* ansidecl.h */ diff --git a/contrib/gdb/include/aout/ChangeLog b/contrib/gdb/include/aout/ChangeLog deleted file mode 100644 index 307448bc87fd6..0000000000000 --- a/contrib/gdb/include/aout/ChangeLog +++ /dev/null @@ -1,174 +0,0 @@ -Mon Mar 11 12:15:52 1996 Ian Lance Taylor <ian@cygnus.com> - - * stab.def: Use __define_stab_duplicate rather than __define_stab - for duplicate entries N_BROWS and N_MOD2. - * stab_gnu.h (__define_stab_duplicate): Define before including - stab.def. - -Fri Oct 27 17:47:16 1995 Niklas Hallqvist <niklas@appli.se> - - * aout64.h, host.h, hp300hpux.h, sun4.h: Changed PAGE_SIZE to - TARGET_PAGE_SIZE. - -Tue Sep 12 12:07:02 1995 Ian Lance Taylor <ian@cygnus.com> - - * sun4.h (struct internal_sun4_dynamic_link): Change all fields - from long to unsigned long. - -Wed Jul 12 00:15:13 1995 Ken Raeburn <raeburn@kr-pc.cygnus.com> - - * sun4.h (PAGE_SIZE): Undefine before defining. - -Thu Jun 16 14:22:55 1994 Ian Lance Taylor (ian@tweedledumb.cygnus.com) - - * aout64.h (BMAGIC): Define. - -Sat Jun 11 16:16:09 1994 Ian Lance Taylor (ian@tweedledumb.cygnus.com) - - Add weak symbols as an extension to a.out. - * aout64.h (N_WEAKU, N_WEAKA, N_WEAKT, N_WEAKD, N_WEAKB): Define. - * stab.def: Update symbol value table. - -Thu Jun 2 17:13:38 1994 Ian Lance Taylor (ian@tweedledumb.cygnus.com) - - * sun4.h (EXTERNAL_SUN4_DYNAMIC_DEBUGGER_SIZE): Correct from 28 to - 24. Fix up ld_got comment. - -Wed Mar 30 00:31:49 1994 Peter Schauer (pes@regent.e-technik.tu-muenchen.de) - - * dynix3.h: Cleanup, adapt to current bfd version. - -Sat Feb 26 10:25:53 1994 Ian Lance Taylor (ian@cygnus.com) - - * aout64.h: Add casts to avoid warnings from SVR4 cc. - -Fri Feb 11 12:56:04 1994 Stan Shebs (shebs@andros.cygnus.com) - - * ar.h (ARMAG, ARMAGB, ARFMAG): Change '\n' to '\012', for greater - portability. - -Fri Jan 21 00:59:06 1994 Ian Lance Taylor (ian@tweedledumb.cygnus.com) - - * sun4.h: Added information about SunOS shared libraries. - -Fri Jan 7 08:20:13 1994 Jim Kingdon (kingdon@deneb.cygnus.com) - - * aout64.h (N_TXTADDR): Add comment regarding OMAGIC and NMAGIC. - -Sat Dec 25 14:55:41 1993 Jim Kingdon (kingdon@lioth.cygnus.com) - - * aout64.h (N_DATOFF): Don't pad (revert change of 8 Jul 1993). - -Tue Nov 16 15:43:46 1993 Jim Kingdon (kingdon@lioth.cygnus.com) - - * aout64.h: New macros ZMAGIC_DISK_BLOCK_SIZE and N_DISK_BLOCK_SIZE - for Linux ZMAGIC. - (N_TXTOFF, N_DATOFF): Use them. - -Thu Nov 4 00:33:48 1993 Ken Raeburn (raeburn@kr-pc.cygnus.com) - - * aout64.h (RELOC_STD_BITS_RELATIVE_LITTLE): Fixed value to match - sun3 system; used to overlap other fields. - (RELOC_STD_BITS_JMPTABLE_LITTLE): Likewise. - -Wed Nov 3 13:48:27 1993 David J. Mackenzie (djm@thepub.cygnus.com) - - * aout64.h (RELOC_STD_BITS_BASEREL_LITTLE): Make it 0x10 (Ken's - suggestion) to avoid conflict with RELOC_STD_BITS_EXTERN_LITTLE. - -Fri Oct 29 15:09:52 1993 Ian Lance Taylor (ian@tweedledumb.cygnus.com) - - * hp300hpux.h (N_SHARED_LIB): Define to be 0. - -Mon Sep 13 21:00:56 1993 John Gilmore (gnu@cygnus.com) - - * ar.h (ARMAP_TIME_OFFSET): Add and describe. - -Mon Aug 23 Sean Fagan (sef@cygnus.com) - - * aout64.h [ARCH_SIZE != 64]: Allow N_BADMAG to be overridden. - -Mon Aug 16 14:30:14 1993 Jim Kingdon (kingdon@lioth.cygnus.com) - - * stab_gnu.h: Include aout/stab.def not just stab.def. - -Sun Jul 18 21:41:47 1993 Jim Kingdon (kingdon@rtl.cygnus.com) - - * dynix3.h: New, for symmetry running dynix. - -Thu Jul 8 12:52:22 1993 Jim Kingdon (kingdon@lioth.cygnus.com) - - * aout64.h (N_BADMAG): Recognize QMAGIC. - N_TXTOFF, N_TXTADDR, N_TXTSIZE: Special code for QMAGIC. - N_DATOFF: Pad text size if we need to. - -Fri Jun 18 19:19:38 1993 Jim Kingdon (kingdon@lioth.cygnus.com) - - * stab.def (N_ECOML): Fix comment. - -Mon May 31 09:21:30 1993 Jim Kingdon (kingdon@cygnus.com) - - * stab.def: Remove Solaris information on N_FUN stabstring grammar; - I've transferred it to gdb/doc/stabs.texinfo, where it belongs. - -Mon May 10 05:48:43 1993 Ken Raeburn (raeburn@kr-pc.cygnus.com) - - * hp300hpux.h: Patch from Glenn Engel for linker problem and - compatibility fix: - (OMAGIC, NMAGIC): New definitions. - (SHAREMAGIC): Deleted. - (HPUX_DOT_O_MAGIC): New macro. - (_N_BADMAG): Adjusted. - (N_HEADER_IN_TEXT, N_DATADDR): New macros. - -Thu Apr 29 12:07:37 1993 Ken Raeburn (raeburn@deneb.cygnus.com) - - * hp300hpux.h: New file from Glenn Engel, glenne@lsid.hp.com. - -Tue Apr 27 05:51:04 1993 Ken Raeburn (raeburn@kr-pc.cygnus.com) - - * aout64.h (struct external_exec, *MAGIC, N_BADMAG): Don't define - if `external_exec' is already defined as a macro. - (N_DATOFF, N_TRELOFF, N_DRELOFF, N_SYMOFF, N_STROFF): Don't define - if already defined. - (struct external_nlist, EXTERNAL_NLIST_SIZE): Don't define if - `external_nlist' is already defined as a macro. - -Sat Aug 15 04:23:02 1992 John Gilmore (gnu@cygnus.com) - - * adobe.h: Add description of a.out.adobe format. - -Fri Jul 3 00:36:52 1992 John Gilmore (gnu at cygnus.com) - - * stab.def: Update more Solaris definitions. - * stab_gnu.h: Add N_SO language types, and Solaris basic float types. - -Sun Jun 14 10:53:53 1992 John Gilmore (gnu at cygnus.com) - - * stab.def: Update descriptions of Solaris-2 stabs; add N_UNDF. - -Thu Jun 11 01:12:07 1992 John Gilmore (gnu at cygnus.com) - - * stab.def: Add N_OBJ and N_OPT from Solaris-2. - -Thu Jan 30 18:12:44 1992 John Gilmore (gnu at cygnus.com) - - * aout/aout64.h: N_TXTSIZE needs some more parentheses. - I don't trust C precedence. - -Wed Dec 18 14:32:01 1991 Per Bothner (bothner at cygnus.com) - - * aout/aout64.h: Move common sunos-specific test - to recognize shared libraries into new macro N_SHARED_LIB. - Use it to simplify&reformat N_TXTADDR, N_TXTOFF, N_TXTSIZE. - -Sat Nov 30 20:34:52 1991 Steve Chamberlain (sac at rtl.cygnus.com) - - * ChangeLog, aout64.h, ar.h, encap.h, host.h, hp.h, ranlib.h, - reloc.h, stab.def, stab_gnu.h, sun4.h: All moved from the - devo/include directory - - -Local Variables: -version-control: never -End: diff --git a/contrib/gdb/include/aout/adobe.h b/contrib/gdb/include/aout/adobe.h deleted file mode 100644 index 3d2f15c6cb726..0000000000000 --- a/contrib/gdb/include/aout/adobe.h +++ /dev/null @@ -1,297 +0,0 @@ -/* `a.out.adobe' differences from standard a.out files */ - -#ifndef __A_OUT_ADOBE_H__ -#define __A_OUT_ADOBE_H__ - -#define BYTES_IN_WORD 4 - -/* Struct external_exec is the same. */ - -/* This is the layout on disk of the 32-bit or 64-bit exec header. */ - -struct external_exec -{ - bfd_byte e_info[4]; /* magic number and stuff */ - bfd_byte e_text[BYTES_IN_WORD]; /* length of text section in bytes */ - bfd_byte e_data[BYTES_IN_WORD]; /* length of data section in bytes */ - bfd_byte e_bss[BYTES_IN_WORD]; /* length of bss area in bytes */ - bfd_byte e_syms[BYTES_IN_WORD]; /* length of symbol table in bytes */ - bfd_byte e_entry[BYTES_IN_WORD]; /* start address */ - bfd_byte e_trsize[BYTES_IN_WORD]; /* length of text relocation info */ - bfd_byte e_drsize[BYTES_IN_WORD]; /* length of data relocation info */ -}; - -#define EXEC_BYTES_SIZE (4 + BYTES_IN_WORD * 7) - -/* Magic numbers for a.out files */ - -#undef ZMAGIC -#define ZMAGIC 0xAD0BE /* Cute, eh? */ -#undef OMAGIC -#undef NMAGIC - -#define N_BADMAG(x) ((x).a_info != ZMAGIC) - -/* By default, segment size is constant. But some machines override this - to be a function of the a.out header (e.g. machine type). */ -#ifndef N_SEGSIZE -#define N_SEGSIZE(x) SEGMENT_SIZE -#endif -#undef N_SEGSIZE /* FIXMEXXXX */ - -/* Segment information for the a.out.Adobe format is specified after the - file header. It contains N segment descriptors, followed by one with - a type of zero. - - The actual text of the segments starts at N_TXTOFF in the file, - regardless of how many or how few segment headers there are. */ - -struct external_segdesc { - unsigned char e_type[1]; - unsigned char e_size[3]; - unsigned char e_virtbase[4]; - unsigned char e_filebase[4]; -}; - -struct internal_segdesc { - unsigned int a_type:8; /* Segment type N_TEXT, N_DATA, 0 */ - unsigned int a_size:24; /* Segment size */ - bfd_vma a_virtbase; /* Virtual address */ - unsigned int a_filebase; /* Base address in object file */ -}; - -#define N_TXTADDR(x) \ - -/* This is documented to be at 1024, but appears to really be at 2048. - FIXME?! */ -#define N_TXTOFF(x) 2048 - -#define N_TXTSIZE(x) ((x).a_text) - -#define N_DATADDR(x) - -#define N_BSSADDR(x) - -/* Offsets of the various portions of the file after the text segment. */ - -#define N_DATOFF(x) ( N_TXTOFF(x) + N_TXTSIZE(x) ) -#define N_TRELOFF(x) ( N_DATOFF(x) + (x).a_data ) -#define N_DRELOFF(x) ( N_TRELOFF(x) + (x).a_trsize ) -#define N_SYMOFF(x) ( N_DRELOFF(x) + (x).a_drsize ) -#define N_STROFF(x) ( N_SYMOFF(x) + (x).a_syms ) - -/* Symbols */ -struct external_nlist { - bfd_byte e_strx[BYTES_IN_WORD]; /* index into string table of name */ - bfd_byte e_type[1]; /* type of symbol */ - bfd_byte e_other[1]; /* misc info (usually empty) */ - bfd_byte e_desc[2]; /* description field */ - bfd_byte e_value[BYTES_IN_WORD]; /* value of symbol */ -}; - -#define EXTERNAL_NLIST_SIZE (BYTES_IN_WORD+4+BYTES_IN_WORD) - -struct internal_nlist { - unsigned long n_strx; /* index into string table of name */ - unsigned char n_type; /* type of symbol */ - unsigned char n_other; /* misc info (usually empty) */ - unsigned short n_desc; /* description field */ - bfd_vma n_value; /* value of symbol */ -}; - -/* The n_type field is the symbol type, containing: */ - -#define N_UNDF 0 /* Undefined symbol */ -#define N_ABS 2 /* Absolute symbol -- defined at particular addr */ -#define N_TEXT 4 /* Text sym -- defined at offset in text seg */ -#define N_DATA 6 /* Data sym -- defined at offset in data seg */ -#define N_BSS 8 /* BSS sym -- defined at offset in zero'd seg */ -#define N_COMM 0x12 /* Common symbol (visible after shared lib dynlink) */ -#define N_FN 0x1f /* File name of .o file */ -#define N_FN_SEQ 0x0C /* N_FN from Sequent compilers (sigh) */ -/* Note: N_EXT can only be usefully OR-ed with N_UNDF, N_ABS, N_TEXT, - N_DATA, or N_BSS. When the low-order bit of other types is set, - (e.g. N_WARNING versus N_FN), they are two different types. */ -#define N_EXT 1 /* External symbol (as opposed to local-to-this-file) */ -#define N_TYPE 0x1e -#define N_STAB 0xe0 /* If any of these bits are on, it's a debug symbol */ - -#define N_INDR 0x0a - -/* 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 - elements 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. */ - -/* Warning symbol. The text gives a warning message, the next symbol - in the table will be undefined. When the symbol is referenced, the - message is printed. */ - -#define N_WARNING 0x1e - -/* Relocations - - There are two types of relocation flavours for a.out systems, - standard and extended. The standard form is used on systems where the - instruction has room for all the bits of an offset to the operand, whilst - the extended form is used when an address operand has to be split over n - instructions. Eg, on the 68k, each move instruction can reference - the target with a displacement of 16 or 32 bits. On the sparc, move - instructions use an offset of 14 bits, so the offset is stored in - the reloc field, and the data in the section is ignored. -*/ - -/* 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 reloc_std_external { - bfd_byte r_address[BYTES_IN_WORD]; /* offset of of data to relocate */ - bfd_byte r_index[3]; /* symbol table index of symbol */ - bfd_byte r_type[1]; /* relocation type */ -}; - -#define RELOC_STD_BITS_PCREL_BIG 0x80 -#define RELOC_STD_BITS_PCREL_LITTLE 0x01 - -#define RELOC_STD_BITS_LENGTH_BIG 0x60 -#define RELOC_STD_BITS_LENGTH_SH_BIG 5 /* To shift to units place */ -#define RELOC_STD_BITS_LENGTH_LITTLE 0x06 -#define RELOC_STD_BITS_LENGTH_SH_LITTLE 1 - -#define RELOC_STD_BITS_EXTERN_BIG 0x10 -#define RELOC_STD_BITS_EXTERN_LITTLE 0x08 - -#define RELOC_STD_BITS_BASEREL_BIG 0x08 -#define RELOC_STD_BITS_BASEREL_LITTLE 0x08 - -#define RELOC_STD_BITS_JMPTABLE_BIG 0x04 -#define RELOC_STD_BITS_JMPTABLE_LITTLE 0x04 - -#define RELOC_STD_BITS_RELATIVE_BIG 0x02 -#define RELOC_STD_BITS_RELATIVE_LITTLE 0x02 - -#define RELOC_STD_SIZE (BYTES_IN_WORD + 3 + 1) /* Bytes per relocation entry */ - -struct reloc_std_internal -{ - bfd_vma r_address; /* Address (within segment) to be relocated. */ - /* 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 files 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; - /* The next three bits are for SunOS shared libraries, and seem to - be undocumented. */ - unsigned int r_baserel:1; /* Linkage table relative */ - unsigned int r_jmptable:1; /* pc-relative to jump table */ - unsigned int r_relative:1; /* "relative relocation" */ - /* unused */ - unsigned int r_pad:1; /* Padding -- set to zero */ -}; - - -/* EXTENDED RELOCS */ - -struct reloc_ext_external { - bfd_byte r_address[BYTES_IN_WORD]; /* offset of of data to relocate */ - bfd_byte r_index[3]; /* symbol table index of symbol */ - bfd_byte r_type[1]; /* relocation type */ - bfd_byte r_addend[BYTES_IN_WORD]; /* datum addend */ -}; - -#define RELOC_EXT_BITS_EXTERN_BIG 0x80 -#define RELOC_EXT_BITS_EXTERN_LITTLE 0x01 - -#define RELOC_EXT_BITS_TYPE_BIG 0x1F -#define RELOC_EXT_BITS_TYPE_SH_BIG 0 -#define RELOC_EXT_BITS_TYPE_LITTLE 0xF8 -#define RELOC_EXT_BITS_TYPE_SH_LITTLE 3 - -/* Bytes per relocation entry */ -#define RELOC_EXT_SIZE (BYTES_IN_WORD + 3 + 1 + BYTES_IN_WORD) - -enum reloc_type -{ - /* simple relocations */ - RELOC_8, /* data[0:7] = addend + sv */ - RELOC_16, /* data[0:15] = addend + sv */ - RELOC_32, /* data[0:31] = addend + sv */ - /* pc-rel displacement */ - RELOC_DISP8, /* data[0:7] = addend - pc + sv */ - RELOC_DISP16, /* data[0:15] = addend - pc + sv */ - RELOC_DISP32, /* data[0:31] = addend - pc + sv */ - /* Special */ - RELOC_WDISP30, /* data[0:29] = (addend + sv - pc)>>2 */ - RELOC_WDISP22, /* data[0:21] = (addend + sv - pc)>>2 */ - RELOC_HI22, /* data[0:21] = (addend + sv)>>10 */ - RELOC_22, /* data[0:21] = (addend + sv) */ - RELOC_13, /* data[0:12] = (addend + sv) */ - RELOC_LO10, /* data[0:9] = (addend + sv) */ - RELOC_SFA_BASE, - RELOC_SFA_OFF13, - /* P.I.C. (base-relative) */ - RELOC_BASE10, /* Not sure - maybe we can do this the */ - RELOC_BASE13, /* right way now */ - RELOC_BASE22, - /* for some sort of pc-rel P.I.C. (?) */ - RELOC_PC10, - RELOC_PC22, - /* P.I.C. jump table */ - RELOC_JMP_TBL, - /* reputedly for shared libraries somehow */ - RELOC_SEGOFF16, - RELOC_GLOB_DAT, - RELOC_JMP_SLOT, - RELOC_RELATIVE, - - RELOC_11, - RELOC_WDISP2_14, - RELOC_WDISP19, - RELOC_HHI22, /* data[0:21] = (addend + sv) >> 42 */ - RELOC_HLO10, /* data[0:9] = (addend + sv) >> 32 */ - - /* 29K relocation types */ - RELOC_JUMPTARG, - RELOC_CONST, - RELOC_CONSTH, - - NO_RELOC - }; - - -struct reloc_internal { - bfd_vma r_address; /* offset of of data to relocate */ - long r_index; /* symbol table index of symbol */ - enum reloc_type r_type; /* relocation type */ - bfd_vma r_addend; /* datum addend */ -}; - -#endif /* __A_OUT_ADOBE_H__ */ diff --git a/contrib/gdb/include/aout/aout64.h b/contrib/gdb/include/aout/aout64.h deleted file mode 100644 index 76f1140b68269..0000000000000 --- a/contrib/gdb/include/aout/aout64.h +++ /dev/null @@ -1,475 +0,0 @@ -/* `a.out' object-file definitions, including extensions to 64-bit fields */ - -#ifndef __A_OUT_64_H__ -#define __A_OUT_64_H__ - -/* This is the layout on disk of the 32-bit or 64-bit exec header. */ - -#ifndef external_exec -struct external_exec -{ - bfd_byte e_info[4]; /* magic number and stuff */ - bfd_byte e_text[BYTES_IN_WORD]; /* length of text section in bytes */ - bfd_byte e_data[BYTES_IN_WORD]; /* length of data section in bytes */ - bfd_byte e_bss[BYTES_IN_WORD]; /* length of bss area in bytes */ - bfd_byte e_syms[BYTES_IN_WORD]; /* length of symbol table in bytes */ - bfd_byte e_entry[BYTES_IN_WORD]; /* start address */ - bfd_byte e_trsize[BYTES_IN_WORD]; /* length of text relocation info */ - bfd_byte e_drsize[BYTES_IN_WORD]; /* length of data relocation info */ -}; - -#define EXEC_BYTES_SIZE (4 + BYTES_IN_WORD * 7) - -/* Magic numbers for a.out files */ - -#if ARCH_SIZE==64 -#define OMAGIC 0x1001 /* Code indicating object file */ -#define ZMAGIC 0x1002 /* Code indicating demand-paged executable. */ -#define NMAGIC 0x1003 /* Code indicating pure executable. */ - -/* There is no 64-bit QMAGIC as far as I know. */ - -#define N_BADMAG(x) (N_MAGIC(x) != OMAGIC \ - && N_MAGIC(x) != NMAGIC \ - && N_MAGIC(x) != ZMAGIC) -#else -#define OMAGIC 0407 /* ...object file or impure executable. */ -#define NMAGIC 0410 /* Code indicating pure executable. */ -#define ZMAGIC 0413 /* Code indicating demand-paged executable. */ -#define BMAGIC 0415 /* Used by a b.out object. */ - -/* This indicates a demand-paged executable with the header in the text. - It is used by 386BSD (and variants) and Linux, at least. */ -#ifndef QMAGIC -#define QMAGIC 0314 -#endif -# ifndef N_BADMAG -# define N_BADMAG(x) (N_MAGIC(x) != OMAGIC \ - && N_MAGIC(x) != NMAGIC \ - && N_MAGIC(x) != ZMAGIC \ - && N_MAGIC(x) != QMAGIC) -# endif /* N_BADMAG */ -#endif - -#endif - -#ifdef QMAGIC -#define N_IS_QMAGIC(x) (N_MAGIC (x) == QMAGIC) -#else -#define N_IS_QMAGIC(x) (0) -#endif - -/* The difference between TARGET_PAGE_SIZE and N_SEGSIZE is that TARGET_PAGE_SIZE is - the finest granularity at which you can page something, thus it - controls the padding (if any) before the text segment of a ZMAGIC - file. N_SEGSIZE is the resolution at which things can be marked as - read-only versus read/write, so it controls the padding between the - text segment and the data segment (in memory; on disk the padding - between them is TARGET_PAGE_SIZE). TARGET_PAGE_SIZE and N_SEGSIZE are the same - for most machines, but different for sun3. */ - -/* By default, segment size is constant. But some machines override this - to be a function of the a.out header (e.g. machine type). */ - -#ifndef N_SEGSIZE -#define N_SEGSIZE(x) SEGMENT_SIZE -#endif - -/* Virtual memory address of the text section. - This is getting very complicated. A good reason to discard a.out format - for something that specifies these fields explicitly. But til then... - - * OMAGIC and NMAGIC files: - (object files: text for "relocatable addr 0" right after the header) - start at 0, offset is EXEC_BYTES_SIZE, size as stated. - * The text address, offset, and size of ZMAGIC files depend - on the entry point of the file: - * entry point below TEXT_START_ADDR: - (hack for SunOS shared libraries) - start at 0, offset is 0, size as stated. - * If N_HEADER_IN_TEXT(x) is true (which defaults to being the - case when the entry point is EXEC_BYTES_SIZE or further into a page): - no padding is needed; text can start after exec header. Sun - considers the text segment of such files to include the exec header; - for BFD's purposes, we don't, which makes more work for us. - start at TEXT_START_ADDR + EXEC_BYTES_SIZE, offset is EXEC_BYTES_SIZE, - size as stated minus EXEC_BYTES_SIZE. - * If N_HEADER_IN_TEXT(x) is false (which defaults to being the case when - the entry point is less than EXEC_BYTES_SIZE into a page (e.g. page - aligned)): (padding is needed so that text can start at a page boundary) - start at TEXT_START_ADDR, offset TARGET_PAGE_SIZE, size as stated. - - Specific configurations may want to hardwire N_HEADER_IN_TEXT, - for efficiency or to allow people to play games with the entry point. - In that case, you would #define N_HEADER_IN_TEXT(x) as 1 for sunos, - and as 0 for most other hosts (Sony News, Vax Ultrix, etc). - (Do this in the appropriate bfd target file.) - (The default is a heuristic that will break if people try changing - the entry point, perhaps with the ld -e flag.) - - * QMAGIC is always like a ZMAGIC for which N_HEADER_IN_TEXT is true, - and for which the starting address is TARGET_PAGE_SIZE (or should this be - SEGMENT_SIZE?) (TEXT_START_ADDR only applies to ZMAGIC, not to QMAGIC). - */ - -/* This macro is only relevant for ZMAGIC files; QMAGIC always has the header - in the text. */ -#ifndef N_HEADER_IN_TEXT -#define N_HEADER_IN_TEXT(x) (((x).a_entry & (TARGET_PAGE_SIZE-1)) >= EXEC_BYTES_SIZE) -#endif - -/* Sun shared libraries, not linux. This macro is only relevant for ZMAGIC - files. */ -#ifndef N_SHARED_LIB -#define N_SHARED_LIB(x) ((x).a_entry < TEXT_START_ADDR) -#endif - -/* Returning 0 not TEXT_START_ADDR for OMAGIC and NMAGIC is based on - the assumption that we are dealing with a .o file, not an - executable. This is necessary for OMAGIC (but means we don't work - right on the output from ld -N); more questionable for NMAGIC. */ - -#ifndef N_TXTADDR -#define N_TXTADDR(x) \ - (/* The address of a QMAGIC file is always one page in, */ \ - /* with the header in the text. */ \ - N_IS_QMAGIC (x) ? TARGET_PAGE_SIZE + EXEC_BYTES_SIZE : \ - N_MAGIC(x) != ZMAGIC ? 0 : /* object file or NMAGIC */\ - N_SHARED_LIB(x) ? 0 : \ - N_HEADER_IN_TEXT(x) ? \ - TEXT_START_ADDR + EXEC_BYTES_SIZE : /* no padding */\ - TEXT_START_ADDR /* a page of padding */\ - ) -#endif - -/* If N_HEADER_IN_TEXT is not true for ZMAGIC, there is some padding - to make the text segment start at a certain boundary. For most - systems, this boundary is TARGET_PAGE_SIZE. But for Linux, in the - time-honored tradition of crazy ZMAGIC hacks, it is 1024 which is - not what TARGET_PAGE_SIZE needs to be for QMAGIC. */ - -#ifndef ZMAGIC_DISK_BLOCK_SIZE -#define ZMAGIC_DISK_BLOCK_SIZE TARGET_PAGE_SIZE -#endif - -#define N_DISK_BLOCK_SIZE(x) \ - (N_MAGIC(x) == ZMAGIC ? ZMAGIC_DISK_BLOCK_SIZE : TARGET_PAGE_SIZE) - -/* Offset in an a.out of the start of the text section. */ -#ifndef N_TXTOFF -#define N_TXTOFF(x) \ - (/* For {O,N,Q}MAGIC, no padding. */ \ - N_MAGIC(x) != ZMAGIC ? EXEC_BYTES_SIZE : \ - N_SHARED_LIB(x) ? 0 : \ - N_HEADER_IN_TEXT(x) ? \ - EXEC_BYTES_SIZE : /* no padding */\ - ZMAGIC_DISK_BLOCK_SIZE /* a page of padding */\ - ) -#endif -/* Size of the text section. It's always as stated, except that we - offset it to `undo' the adjustment to N_TXTADDR and N_TXTOFF - for ZMAGIC files that nominally include the exec header - as part of the first page of text. (BFD doesn't consider the - exec header to be part of the text segment.) */ -#ifndef N_TXTSIZE -#define N_TXTSIZE(x) \ - (/* For QMAGIC, we don't consider the header part of the text section. */\ - N_IS_QMAGIC (x) ? (x).a_text - EXEC_BYTES_SIZE : \ - (N_MAGIC(x) != ZMAGIC || N_SHARED_LIB(x)) ? (x).a_text : \ - N_HEADER_IN_TEXT(x) ? \ - (x).a_text - EXEC_BYTES_SIZE: /* no padding */\ - (x).a_text /* a page of padding */\ - ) -#endif -/* The address of the data segment in virtual memory. - It is the text segment address, plus text segment size, rounded - up to a N_SEGSIZE boundary for pure or pageable files. */ -#ifndef N_DATADDR -#define N_DATADDR(x) \ - (N_MAGIC(x)==OMAGIC? (N_TXTADDR(x)+N_TXTSIZE(x)) \ - : (N_SEGSIZE(x) + ((N_TXTADDR(x)+N_TXTSIZE(x)-1) & ~(N_SEGSIZE(x)-1)))) -#endif -/* The address of the BSS segment -- immediately after the data segment. */ - -#define N_BSSADDR(x) (N_DATADDR(x) + (x).a_data) - -/* Offsets of the various portions of the file after the text segment. */ - -/* For {Q,Z}MAGIC, there is padding to make the data segment start on - a page boundary. Most of the time the a_text field (and thus - N_TXTSIZE) already contains this padding. It is possible that for - BSDI and/or 386BSD it sometimes doesn't contain the padding, and - perhaps we should be adding it here. But this seems kind of - questionable and probably should be BSDI/386BSD-specific if we do - do it. - - For NMAGIC (at least for hp300 BSD, probably others), there is - padding in memory only, not on disk, so we must *not* ever pad here - for NMAGIC. */ - -#ifndef N_DATOFF -#define N_DATOFF(x) \ - (N_TXTOFF(x) + N_TXTSIZE(x)) -#endif - -#ifndef N_TRELOFF -#define N_TRELOFF(x) ( N_DATOFF(x) + (x).a_data ) -#endif -#ifndef N_DRELOFF -#define N_DRELOFF(x) ( N_TRELOFF(x) + (x).a_trsize ) -#endif -#ifndef N_SYMOFF -#define N_SYMOFF(x) ( N_DRELOFF(x) + (x).a_drsize ) -#endif -#ifndef N_STROFF -#define N_STROFF(x) ( N_SYMOFF(x) + (x).a_syms ) -#endif - -/* Symbols */ -#ifndef external_nlist -struct external_nlist { - bfd_byte e_strx[BYTES_IN_WORD]; /* index into string table of name */ - bfd_byte e_type[1]; /* type of symbol */ - bfd_byte e_other[1]; /* misc info (usually empty) */ - bfd_byte e_desc[2]; /* description field */ - bfd_byte e_value[BYTES_IN_WORD]; /* value of symbol */ -}; -#define EXTERNAL_NLIST_SIZE (BYTES_IN_WORD+4+BYTES_IN_WORD) -#endif - -struct internal_nlist { - unsigned long n_strx; /* index into string table of name */ - unsigned char n_type; /* type of symbol */ - unsigned char n_other; /* misc info (usually empty) */ - unsigned short n_desc; /* description field */ - bfd_vma n_value; /* value of symbol */ -}; - -/* The n_type field is the symbol type, containing: */ - -#define N_UNDF 0 /* Undefined symbol */ -#define N_ABS 2 /* Absolute symbol -- defined at particular addr */ -#define N_TEXT 4 /* Text sym -- defined at offset in text seg */ -#define N_DATA 6 /* Data sym -- defined at offset in data seg */ -#define N_BSS 8 /* BSS sym -- defined at offset in zero'd seg */ -#define N_COMM 0x12 /* Common symbol (visible after shared lib dynlink) */ -#define N_FN 0x1f /* File name of .o file */ -#define N_FN_SEQ 0x0C /* N_FN from Sequent compilers (sigh) */ -/* Note: N_EXT can only be usefully OR-ed with N_UNDF, N_ABS, N_TEXT, - N_DATA, or N_BSS. When the low-order bit of other types is set, - (e.g. N_WARNING versus N_FN), they are two different types. */ -#define N_EXT 1 /* External symbol (as opposed to local-to-this-file) */ -#define N_TYPE 0x1e -#define N_STAB 0xe0 /* If any of these bits are on, it's a debug symbol */ - -#define N_INDR 0x0a - -/* 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 - elements 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. */ - -/* Warning symbol. The text gives a warning message, the next symbol - in the table will be undefined. When the symbol is referenced, the - message is printed. */ - -#define N_WARNING 0x1e - -/* Weak symbols. These are a GNU extension to the a.out format. The - semantics are those of ELF weak symbols. Weak symbols are always - externally visible. The N_WEAK? values are squeezed into the - available slots. The value of a N_WEAKU symbol is 0. The values - of the other types are the definitions. */ -#define N_WEAKU 0x0d /* Weak undefined symbol. */ -#define N_WEAKA 0x0e /* Weak absolute symbol. */ -#define N_WEAKT 0x0f /* Weak text symbol. */ -#define N_WEAKD 0x10 /* Weak data symbol. */ -#define N_WEAKB 0x11 /* Weak bss symbol. */ - -/* Relocations - - There are two types of relocation flavours for a.out systems, - standard and extended. The standard form is used on systems where the - instruction has room for all the bits of an offset to the operand, whilst - the extended form is used when an address operand has to be split over n - instructions. Eg, on the 68k, each move instruction can reference - the target with a displacement of 16 or 32 bits. On the sparc, move - instructions use an offset of 14 bits, so the offset is stored in - the reloc field, and the data in the section is ignored. -*/ - -/* 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 reloc_std_external { - bfd_byte r_address[BYTES_IN_WORD]; /* offset of of data to relocate */ - bfd_byte r_index[3]; /* symbol table index of symbol */ - bfd_byte r_type[1]; /* relocation type */ -}; - -#define RELOC_STD_BITS_PCREL_BIG ((unsigned int) 0x80) -#define RELOC_STD_BITS_PCREL_LITTLE ((unsigned int) 0x01) - -#define RELOC_STD_BITS_LENGTH_BIG ((unsigned int) 0x60) -#define RELOC_STD_BITS_LENGTH_SH_BIG 5 -#define RELOC_STD_BITS_LENGTH_LITTLE ((unsigned int) 0x06) -#define RELOC_STD_BITS_LENGTH_SH_LITTLE 1 - -#define RELOC_STD_BITS_EXTERN_BIG ((unsigned int) 0x10) -#define RELOC_STD_BITS_EXTERN_LITTLE ((unsigned int) 0x08) - -#define RELOC_STD_BITS_BASEREL_BIG ((unsigned int) 0x08) -#define RELOC_STD_BITS_BASEREL_LITTLE ((unsigned int) 0x10) - -#define RELOC_STD_BITS_JMPTABLE_BIG ((unsigned int) 0x04) -#define RELOC_STD_BITS_JMPTABLE_LITTLE ((unsigned int) 0x20) - -#define RELOC_STD_BITS_RELATIVE_BIG ((unsigned int) 0x02) -#define RELOC_STD_BITS_RELATIVE_LITTLE ((unsigned int) 0x40) - -#define RELOC_STD_SIZE (BYTES_IN_WORD + 3 + 1) /* Bytes per relocation entry */ - -struct reloc_std_internal -{ - bfd_vma r_address; /* Address (within segment) to be relocated. */ - /* 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 files 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; - /* The next three bits are for SunOS shared libraries, and seem to - be undocumented. */ - unsigned int r_baserel:1; /* Linkage table relative */ - unsigned int r_jmptable:1; /* pc-relative to jump table */ - unsigned int r_relative:1; /* "relative relocation" */ - /* unused */ - unsigned int r_pad:1; /* Padding -- set to zero */ -}; - - -/* EXTENDED RELOCS */ - -struct reloc_ext_external { - bfd_byte r_address[BYTES_IN_WORD]; /* offset of of data to relocate */ - bfd_byte r_index[3]; /* symbol table index of symbol */ - bfd_byte r_type[1]; /* relocation type */ - bfd_byte r_addend[BYTES_IN_WORD]; /* datum addend */ -}; - -#define RELOC_EXT_BITS_EXTERN_BIG ((unsigned int) 0x80) -#define RELOC_EXT_BITS_EXTERN_LITTLE ((unsigned int) 0x01) - -#define RELOC_EXT_BITS_TYPE_BIG ((unsigned int) 0x1F) -#define RELOC_EXT_BITS_TYPE_SH_BIG 0 -#define RELOC_EXT_BITS_TYPE_LITTLE ((unsigned int) 0xF8) -#define RELOC_EXT_BITS_TYPE_SH_LITTLE 3 - -/* Bytes per relocation entry */ -#define RELOC_EXT_SIZE (BYTES_IN_WORD + 3 + 1 + BYTES_IN_WORD) - -enum reloc_type -{ - /* simple relocations */ - RELOC_8, /* data[0:7] = addend + sv */ - RELOC_16, /* data[0:15] = addend + sv */ - RELOC_32, /* data[0:31] = addend + sv */ - /* pc-rel displacement */ - RELOC_DISP8, /* data[0:7] = addend - pc + sv */ - RELOC_DISP16, /* data[0:15] = addend - pc + sv */ - RELOC_DISP32, /* data[0:31] = addend - pc + sv */ - /* Special */ - RELOC_WDISP30, /* data[0:29] = (addend + sv - pc)>>2 */ - RELOC_WDISP22, /* data[0:21] = (addend + sv - pc)>>2 */ - RELOC_HI22, /* data[0:21] = (addend + sv)>>10 */ - RELOC_22, /* data[0:21] = (addend + sv) */ - RELOC_13, /* data[0:12] = (addend + sv) */ - RELOC_LO10, /* data[0:9] = (addend + sv) */ - RELOC_SFA_BASE, - RELOC_SFA_OFF13, - /* P.I.C. (base-relative) */ - RELOC_BASE10, /* Not sure - maybe we can do this the */ - RELOC_BASE13, /* right way now */ - RELOC_BASE22, - /* for some sort of pc-rel P.I.C. (?) */ - RELOC_PC10, - RELOC_PC22, - /* P.I.C. jump table */ - RELOC_JMP_TBL, - /* reputedly for shared libraries somehow */ - RELOC_SEGOFF16, - RELOC_GLOB_DAT, - RELOC_JMP_SLOT, - RELOC_RELATIVE, - - RELOC_11, - RELOC_WDISP2_14, - RELOC_WDISP19, - RELOC_HHI22, /* data[0:21] = (addend + sv) >> 42 */ - RELOC_HLO10, /* data[0:9] = (addend + sv) >> 32 */ - - /* 29K relocation types */ - RELOC_JUMPTARG, - RELOC_CONST, - RELOC_CONSTH, - - /* All the new ones I can think of, for sparc v9 */ - - RELOC_64, /* data[0:63] = addend + sv */ - RELOC_DISP64, /* data[0:63] = addend - pc + sv */ - RELOC_WDISP21, /* data[0:20] = (addend + sv - pc)>>2 */ - RELOC_DISP21, /* data[0:20] = addend - pc + sv */ - RELOC_DISP14, /* data[0:13] = addend - pc + sv */ - /* Q . - What are the other ones, - Since this is a clean slate, can we throw away the ones we dont - understand ? Should we sort the values ? What about using a - microcode format like the 68k ? - */ - NO_RELOC - }; - - -struct reloc_internal { - bfd_vma r_address; /* offset of of data to relocate */ - long r_index; /* symbol table index of symbol */ - enum reloc_type r_type; /* relocation type */ - bfd_vma r_addend; /* datum addend */ -}; - -/* Q. - Should the length of the string table be 4 bytes or 8 bytes ? - - Q. - What about archive indexes ? - - */ - -#endif /* __A_OUT_64_H__ */ diff --git a/contrib/gdb/include/aout/ar.h b/contrib/gdb/include/aout/ar.h deleted file mode 100644 index 7b5dcdabd106d..0000000000000 --- a/contrib/gdb/include/aout/ar.h +++ /dev/null @@ -1,36 +0,0 @@ -/* archive file definition for GNU software */ - -/* So far this is correct for BSDish archives. Don't forget that - files must begin on an even byte boundary. */ - -#ifndef __GNU_AR_H__ -#define __GNU_AR_H__ - -/* Note that the usual '\n' in magic strings may translate to different - characters, as allowed by ANSI. '\012' has a fixed value, and remains - compatible with existing BSDish archives. */ - -#define ARMAG "!<arch>\012" /* For COFF and a.out archives */ -#define ARMAGB "!<bout>\012" /* For b.out archives */ -#define SARMAG 8 -#define ARFMAG "`\012" - -/* The ar_date field of the armap (__.SYMDEF) member of an archive - must be greater than the modified date of the entire file, or - BSD-derived linkers complain. We originally write the ar_date with - this offset from the real file's mod-time. After finishing the - file, we rewrite ar_date if it's not still greater than the mod date. */ - -#define ARMAP_TIME_OFFSET 60 - -struct ar_hdr { - char ar_name[16]; /* name of this member */ - char ar_date[12]; /* file mtime */ - char ar_uid[6]; /* owner uid; printed as decimal */ - char ar_gid[6]; /* owner gid; printed as decimal */ - char ar_mode[8]; /* file mode, printed as octal */ - char ar_size[10]; /* file size, printed as decimal */ - char ar_fmag[2]; /* should contain ARFMAG */ -}; - -#endif /* __GNU_AR_H__ */ diff --git a/contrib/gdb/include/aout/dynix3.h b/contrib/gdb/include/aout/dynix3.h deleted file mode 100644 index efeeebfc4ccd0..0000000000000 --- a/contrib/gdb/include/aout/dynix3.h +++ /dev/null @@ -1,71 +0,0 @@ -/* - * a.out specifics for Sequent Symmetry running Dynix 3.x - */ -#ifndef A_OUT_DYNIX3_H -#define A_OUT_DYNIX3_H - -#define external_exec dynix_external_exec - -/* struct exec for Dynix 3 - * - * a_gdtbl and a_bootstrap are only for standalone binaries. - * Shared data fields are not supported by the kernel as of Dynix 3.1, - * but are supported by Dynix compiler programs. - */ -struct dynix_external_exec { - unsigned char e_info[4]; - unsigned char e_text[4]; - unsigned char e_data[4]; - unsigned char e_bss[4]; - unsigned char e_syms[4]; - unsigned char e_entry[4]; - unsigned char e_trsize[4]; - unsigned char e_drsize[4]; - unsigned char e_g_code[8], e_g_data[8], e_g_desc[8]; - unsigned char e_shdata[4]; - unsigned char e_shbss[4]; - unsigned char e_shdrsize[4]; - unsigned char e_bootstrap[44]; - unsigned char e_reserved[12]; - unsigned char e_version[4]; -}; - -#define EXEC_BYTES_SIZE (128) - -/* - * All executables under Dynix are demand paged with read-only text, - * Thus no NMAGIC. - * - * ZMAGIC has a page of 0s at virtual 0, - * XMAGIC has an invalid page at virtual 0 - */ -#define OMAGIC 0x12eb /* .o */ -#define ZMAGIC 0x22eb /* zero @ 0, demand load */ -#define XMAGIC 0x32eb /* invalid @ 0, demand load */ -#define SMAGIC 0x42eb /* standalone, not supported here */ - -#define N_BADMAG(x) ((OMAGIC != N_MAGIC(x)) && \ - (ZMAGIC != N_MAGIC(x)) && \ - (XMAGIC != N_MAGIC(x)) && \ - (SMAGIC != N_MAGIC(x))) - -#define N_ADDRADJ(x) ((ZMAGIC == N_MAGIC(x) || XMAGIC == N_MAGIC(x)) ? 0x1000 : 0) - -#define N_TXTOFF(x) (EXEC_BYTES_SIZE) -#define N_DATOFF(x) (N_TXTOFF(x) + N_TXTSIZE(x)) -#define N_SHDATOFF(x) (N_DATOFF(x) + (x).a_data) -#define N_TRELOFF(x) (N_SHDATOFF(x) + (x).a_shdata) -#define N_DRELOFF(x) (N_TRELOFF(x) + (x).a_trsize) -#define N_SHDRELOFF(x) (N_DRELOFF(x) + (x).a_drsize) -#define N_SYMOFF(x) (N_SHDRELOFF(x) + (x).a_shdrsize) -#define N_STROFF(x) (N_SYMOFF(x) + (x).a_syms) - -#define N_TXTADDR(x) \ - (((OMAGIC == N_MAGIC(x)) || (SMAGIC == N_MAGIC(x))) ? 0 \ - : TEXT_START_ADDR + EXEC_BYTES_SIZE) - -#define N_TXTSIZE(x) \ - (((OMAGIC == N_MAGIC(x)) || (SMAGIC == N_MAGIC(x))) ? ((x).a_text) \ - : ((x).a_text - N_ADDRADJ(x) - EXEC_BYTES_SIZE)) - -#endif /* A_OUT_DYNIX3_H */ diff --git a/contrib/gdb/include/aout/encap.h b/contrib/gdb/include/aout/encap.h deleted file mode 100644 index b215d49be168a..0000000000000 --- a/contrib/gdb/include/aout/encap.h +++ /dev/null @@ -1,135 +0,0 @@ -/* Yet Another Try at encapsulating bsd object files in coff. - Copyright (C) 1988, 1989, 1991 Free Software Foundation, Inc. - Written by Pace Willisson 12/9/88 - - This file is obsolete. It needs to be converted to just define a bunch - of stuff that BFD can use to do coff-encapsulated files. --gnu@cygnus.com - -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 2 of the License, 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ - -/* - * We only use the coff headers to tell the kernel - * how to exec the file. Therefore, the only fields that need to - * be filled in are the scnptr and vaddr for the text and data - * sections, and the vaddr for the bss. As far as coff is concerned, - * there is no symbol table, relocation, or line numbers. - * - * A normal bsd header (struct exec) is placed after the coff headers, - * and before the real text. I defined a the new fields 'a_machtype' - * and a_flags. If a_machtype is M_386, and a_flags & A_ENCAP is - * true, then the bsd header is preceeded by a coff header. Macros - * like N_TXTOFF and N_TXTADDR use this field to find the bsd header. - * - * The only problem is to track down the bsd exec header. The - * macros HEADER_OFFSET, etc do this. - */ - -#define N_FLAGS_COFF_ENCAPSULATE 0x20 /* coff header precedes bsd header */ - -/* Describe the COFF header used for encapsulation. */ - -struct coffheader -{ - /* filehdr */ - unsigned short f_magic; - unsigned short f_nscns; - long f_timdat; - long f_symptr; - long f_nsyms; - unsigned short f_opthdr; - unsigned short f_flags; - /* aouthdr */ - short magic; - short vstamp; - long tsize; - long dsize; - long bsize; - long entry; - long text_start; - long data_start; - struct coffscn - { - char s_name[8]; - long s_paddr; - long s_vaddr; - long s_size; - long s_scnptr; - long s_relptr; - long s_lnnoptr; - unsigned short s_nreloc; - unsigned short s_nlnno; - long s_flags; - } scns[3]; -}; - -/* Describe some of the parameters of the encapsulation, - including how to find the encapsulated BSD header. */ - -/* FIXME, this is dumb. The same tools can't handle a.outs for different - architectures, just because COFF_MAGIC is different; so you need a - separate GNU nm for every architecture!!? Unfortunately, it needs to - be this way, since the COFF_MAGIC value is determined by the kernel - we're trying to fool here. */ - -#define COFF_MAGIC_I386 0514 /* I386MAGIC */ -#define COFF_MAGIC_M68K 0520 /* MC68MAGIC */ -#define COFF_MAGIC_A29K 0x17A /* Used by asm29k cross-tools */ - -#ifdef COFF_MAGIC -short __header_offset_temp; -#define HEADER_OFFSET(f) \ - (__header_offset_temp = 0, \ - fread ((char *)&__header_offset_temp, sizeof (short), 1, (f)), \ - fseek ((f), -sizeof (short), 1), \ - __header_offset_temp==COFF_MAGIC ? sizeof(struct coffheader) : 0) -#else -#define HEADER_OFFSET(f) 0 -#endif - -#define HEADER_SEEK(f) (fseek ((f), HEADER_OFFSET((f)), 1)) - -/* Describe the characteristics of the BSD header - that appears inside the encapsulation. */ - -/* Encapsulated coff files that are linked ZMAGIC have a text segment - offset just past the header (and a matching TXTADDR), excluding - the headers from the text segment proper but keeping the physical - layout and the virtual memory layout page-aligned. - - Non-encapsulated a.out files that are linked ZMAGIC have a text - segment that starts at 0 and an N_TXTADR similarly offset to 0. - They too are page-aligned with each other, but they include the - a.out header as part of the text. - - The _N_HDROFF gets sizeof struct exec added to it, so we have - to compensate here. See <a.out.gnu.h>. */ - -#undef _N_HDROFF -#undef N_TXTADDR -#undef N_DATADDR - -#define _N_HDROFF(x) ((N_FLAGS(x) & N_FLAGS_COFF_ENCAPSULATE) ? \ - sizeof (struct coffheader) : 0) - -/* Address of text segment in memory after it is loaded. */ -#define N_TXTADDR(x) \ - ((N_FLAGS(x) & N_FLAGS_COFF_ENCAPSULATE) ? \ - sizeof (struct coffheader) + sizeof (struct exec) : 0) -#define SEGMENT_SIZE 0x400000 - -#define N_DATADDR(x) \ - ((N_FLAGS(x) & N_FLAGS_COFF_ENCAPSULATE) ? \ - (SEGMENT_SIZE + ((N_TXTADDR(x)+(x).a_text-1) & ~(SEGMENT_SIZE-1))) : \ - (N_TXTADDR(x)+(x).a_text)) diff --git a/contrib/gdb/include/aout/host.h b/contrib/gdb/include/aout/host.h deleted file mode 100644 index 8e36212716c1c..0000000000000 --- a/contrib/gdb/include/aout/host.h +++ /dev/null @@ -1,22 +0,0 @@ -/* Parameters about the a.out format, based on the host system on which - the program is compiled. */ - -/* Address of data segment in memory after it is loaded. - It is up to you to define SEGMENT_SIZE - on machines not listed here. */ -#ifndef SEGMENT_SIZE -#if defined(hp300) || defined(pyr) -#define SEGMENT_SIZE page_size -#endif -#ifdef sony -#define SEGMENT_SIZE 0x1000 -#endif /* Sony. */ -#ifdef is68k -#define SEGMENT_SIZE 0x20000 -#endif -#if defined(m68k) && defined(PORTAR) -#define TARGET_PAGE_SIZE 0x400 -#define SEGMENT_SIZE TARGET_PAGE_SIZE -#endif -#endif /*!defined(SEGMENT_SIZE)*/ - diff --git a/contrib/gdb/include/aout/hp.h b/contrib/gdb/include/aout/hp.h deleted file mode 100644 index 002f49cf453d6..0000000000000 --- a/contrib/gdb/include/aout/hp.h +++ /dev/null @@ -1,82 +0,0 @@ -/* Special version of <a.out.h> for use under hp-ux. - Copyright 1988, 1991 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 2 of the License, 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ - -/* THIS FILE IS OBSOLETE. It needs to be revised as a variant "external" - a.out format for use with BFD. */ - -/* The `exec' structure and overall layout must be close to HP's when - we are running on an HP system, otherwise we will not be able to - execute the resulting file. */ - -/* Allow this file to be included twice. */ -#ifndef __GNU_EXEC_MACROS__ - -struct exec -{ - unsigned short a_machtype; /* machine type */ - unsigned short a_magic; /* magic number */ - unsigned long a_spare1; - unsigned long a_spare2; - unsigned long a_text; /* length of text, in bytes */ - unsigned long a_data; /* length of data, in bytes */ - unsigned long a_bss; /* length of uninitialized data area for file, in bytes */ - unsigned long a_trsize; /* length of relocation info for text, in bytes */ - unsigned long a_drsize; /* length of relocation info for data, in bytes */ - unsigned long a_spare3; /* HP = pascal interface size */ - unsigned long a_spare4; /* HP = symbol table size */ - unsigned long a_spare5; /* HP = debug name table size */ - unsigned long a_entry; /* start address */ - unsigned long a_spare6; /* HP = source line table size */ - unsigned long a_spare7; /* HP = value table size */ - unsigned long a_syms; /* length of symbol table data in file, in bytes */ - unsigned long a_spare8; -}; - -/* Tell a.out.gnu.h not to define `struct exec'. */ -#define __STRUCT_EXEC_OVERRIDE__ - -#include "../a.out.gnu.h" - -#undef N_MAGIC -#undef N_MACHTYPE -#undef N_FLAGS -#undef N_SET_INFO -#undef N_SET_MAGIC -#undef N_SET_MACHTYPE -#undef N_SET_FLAGS - -#define N_MAGIC(exec) ((exec) . a_magic) -#define N_MACHTYPE(exec) ((exec) . a_machtype) -#define N_SET_MAGIC(exec, magic) (((exec) . a_magic) = (magic)) -#define N_SET_MACHTYPE(exec, machtype) (((exec) . a_machtype) = (machtype)) - -#undef N_BADMAG -#define N_BADMAG(x) ((_N_BADMAG (x)) || (_N_BADMACH (x))) - -#define _N_BADMACH(x) \ -(((N_MACHTYPE (x)) != HP9000S200_ID) && \ - ((N_MACHTYPE (x)) != HP98x6_ID)) - -#define HP98x6_ID 0x20A -#define HP9000S200_ID 0x20C - -#undef _N_HDROFF -#define _N_HDROFF(x) (SEGMENT_SIZE - (sizeof (struct exec))) - -#define SEGMENT_SIZE 0x1000 - -#endif /* __GNU_EXEC_MACROS__ */ diff --git a/contrib/gdb/include/aout/hp300hpux.h b/contrib/gdb/include/aout/hp300hpux.h deleted file mode 100644 index 44d5196144da6..0000000000000 --- a/contrib/gdb/include/aout/hp300hpux.h +++ /dev/null @@ -1,119 +0,0 @@ -/* Special version of <a.out.h> for use under hp-ux. - Copyright (C) 1988,1993 Free Software Foundation, Inc. */ - -struct hp300hpux_exec_bytes -{ - unsigned char e_info[4]; /* a_machtype/a_magic */ - unsigned char e_spare1[4]; - unsigned char e_spare2[4]; - unsigned char e_text[4]; /* length of text, in bytes */ - unsigned char e_data[4]; /* length of data, in bytes */ - unsigned char e_bss[4]; /* length of uninitialized data area , in bytes */ - unsigned char e_trsize[4]; /* length of relocation info for text, in bytes*/ - unsigned char e_drsize[4]; /* length of relocation info for data, in bytes*/ - unsigned char e_passize[4];/* HP = pascal interface size */ - unsigned char e_syms[4]; /* HP = symbol table size */ - unsigned char e_spare5[4]; /* HP = debug name table size */ - unsigned char e_entry[4]; /* start address */ - unsigned char e_spare6[4]; /* HP = source line table size */ - unsigned char e_supsize[4];/* HP = value table size */ - unsigned char e_drelocs[4]; - unsigned char e_extension[4]; /* file offset of extension */ -}; -#define EXEC_BYTES_SIZE 64 - -struct hp300hpux_nlist_bytes - { - unsigned char e_value[4]; - unsigned char e_type[1]; - unsigned char e_length[1]; /* length of ascii symbol name */ - unsigned char e_almod[2]; /* alignment mod */ - unsigned char e_shlib[2]; /* info about dynamic linking */ - }; -#define EXTERNAL_NLIST_SIZE 10 - -struct hp300hpux_reloc - { - unsigned char r_address[4];/* offset of of data to relocate */ - unsigned char r_index[2]; /* symbol table index of symbol */ - unsigned char r_type[1]; /* relocation type */ - unsigned char r_length[1]; /* length of item to reloc */ - }; - -struct hp300hpux_header_extension -{ - unsigned char e_syms[4]; - unsigned char unique_headers[12*4]; - unsigned char e_header[2]; /* type of header */ - unsigned char e_version[2]; /* version */ - unsigned char e_size[4]; /* bytes following*/ - unsigned char e_extension[4];/* file offset of next extension */ -}; -#define EXTERNAL_EXTENSION_HEADER_SIZE (16*4) - -/* hpux separates object files (0x106) and impure executables (0x107) */ -/* but the bfd code does not distinguish between them. Since we want to*/ -/* read hpux .o files, we add an special define and use it below in */ -/* offset and address calculations. */ - -#define HPUX_DOT_O_MAGIC 0x106 -#define OMAGIC 0x107 /* object file or impure executable. */ -#define NMAGIC 0x108 /* Code indicating pure executable. */ -#define ZMAGIC 0x10B /* demand-paged executable. */ - -#define N_HEADER_IN_TEXT(x) 0 - -#if 0 /* libaout.h only uses the lower 8 bits */ -#define HP98x6_ID 0x20A -#define HP9000S200_ID 0x20C -#endif -#define HP98x6_ID 0x0A -#define HP9000S200_ID 0x0C - -#define N_BADMAG(x) ((_N_BADMAG (x)) || (_N_BADMACH (x))) - -#define N_DATADDR(x) \ - ((N_MAGIC(x)==OMAGIC || N_MAGIC(x)==HPUX_DOT_O_MAGIC) ? \ - (N_TXTADDR(x)+N_TXTSIZE(x)) \ - : (N_SEGSIZE(x) + ((N_TXTADDR(x)+N_TXTSIZE(x)-1) & ~(N_SEGSIZE(x)-1)))) - -#define _N_BADMACH(x) \ -(((N_MACHTYPE (x)) != HP9000S200_ID) && \ - ((N_MACHTYPE (x)) != HP98x6_ID)) - -#define _N_BADMAG(x) (N_MAGIC(x) != HPUX_DOT_O_MAGIC \ - && N_MAGIC(x) != OMAGIC \ - && N_MAGIC(x) != NMAGIC \ - && N_MAGIC(x) != ZMAGIC ) - -#undef _N_HDROFF -#define _N_HDROFF(x) (SEGMENT_SIZE - (sizeof (struct exec))) - -#undef N_DATOFF -#undef N_PASOFF -#undef N_SYMOFF -#undef N_SUPOFF -#undef N_TRELOFF -#undef N_DRELOFF -#undef N_STROFF - -#define N_DATOFF(x) ( N_TXTOFF(x) + N_TXTSIZE(x) ) -#define N_PASOFF(x) ( N_DATOFF(x) + (x).a_data) -#define N_SYMOFF(x) ( N_PASOFF(x) /* + (x).a_passize*/ ) -#define N_SUPOFF(x) ( N_SYMOFF(x) + (x).a_syms ) -#define N_TRELOFF(x) ( N_SUPOFF(x) /* + 0 (x).a_supsize*/ ) -#define N_DRELOFF(x) ( N_TRELOFF(x) + (x).a_trsize ) -#define N_EXTHOFF(x) ( N_DRELOFF(x) /* + 0 (x).a_drsize */) -#define N_STROFF(x) ( 0 /* no string table */ ) - -/* use these when the file has gnu symbol tables */ -#define N_GNU_TRELOFF(x) (N_DATOFF(x) + (x).a_data) -#define N_GNU_DRELOFF(x) (N_GNU_TRELOFF(x) + (x).a_trsize) -#define N_GNU_SYMOFF(x) (N_GNU_DRELOFF(x) + (x).a_drsize) - -#define TARGET_PAGE_SIZE 0x1000 -#define SEGMENT_SIZE 0x1000 -#define TEXT_START_ADDR 0 - -#undef N_SHARED_LIB -#define N_SHARED_LIB(x) ( 0 /* no shared libraries */ ) diff --git a/contrib/gdb/include/aout/hppa.h b/contrib/gdb/include/aout/hppa.h deleted file mode 100644 index 7e185de768a49..0000000000000 --- a/contrib/gdb/include/aout/hppa.h +++ /dev/null @@ -1,7 +0,0 @@ -#include "filehdr.h" -#include "aouthdr.h" -#include "scnhdr.h" -#include "spacehdr.h" -#include "syms.h" - - diff --git a/contrib/gdb/include/aout/ranlib.h b/contrib/gdb/include/aout/ranlib.h deleted file mode 100644 index 982600514b659..0000000000000 --- a/contrib/gdb/include/aout/ranlib.h +++ /dev/null @@ -1,62 +0,0 @@ -/* ranlib.h -- archive library index member definition for GNU. - Copyright 1990-1991 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 2 of the License, 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ - -/* The Symdef member of an archive contains two things: - a table that maps symbol-string offsets to file offsets, - and a symbol-string table. All the symbol names are - run together (each with trailing null) in the symbol-string - table. There is a single longword bytecount on the front - of each of these tables. Thus if we have two symbols, - "foo" and "_bar", that are in archive members at offsets - 200 and 900, it would look like this: - 16 ; byte count of index table - 0 ; offset of "foo" in string table - 200 ; offset of foo-module in file - 4 ; offset of "bar" in string table - 900 ; offset of bar-module in file - 9 ; byte count of string table - "foo\0_bar\0" ; string table */ - -#define RANLIBMAG "__.SYMDEF" /* Archive file name containing index */ -#define RANLIBSKEW 3 /* Creation time offset */ - -/* Format of __.SYMDEF: - First, a longword containing the size of the 'symdef' data that follows. - Second, zero or more 'symdef' structures. - Third, a longword containing the length of symbol name strings. - Fourth, zero or more symbol name strings (each followed by a null). */ - -struct symdef - { - union - { - unsigned long string_offset; /* In the file */ - char *name; /* In memory, sometimes */ - } s; - /* this points to the front of the file header (AKA member header -- - a struct ar_hdr), not to the front of the file or into the file). - in other words it only tells you which file to read */ - unsigned long file_offset; - }; - -/* Compatability with BSD code */ - -#define ranlib symdef -#define ran_un s -#define ran_strx string_offset -#define ran_name name -#define ran_off file_offset diff --git a/contrib/gdb/include/aout/reloc.h b/contrib/gdb/include/aout/reloc.h deleted file mode 100644 index 563c552a3578f..0000000000000 --- a/contrib/gdb/include/aout/reloc.h +++ /dev/null @@ -1,66 +0,0 @@ -/* reloc.h -- Header file for relocation information. - Copyright 1989-1991 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 2 of the License, 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ - -/* Relocation types for a.out files using reloc_info_extended - (SPARC and AMD 29000). */ - -#ifndef _RELOC_H_READ_ -#define _RELOC_H_READ_ 1 - -enum reloc_type - { - RELOC_8, RELOC_16, RELOC_32, /* simple relocations */ - RELOC_DISP8, RELOC_DISP16, RELOC_DISP32, /* pc-rel displacement */ - RELOC_WDISP30, RELOC_WDISP22, - RELOC_HI22, RELOC_22, - RELOC_13, RELOC_LO10, - RELOC_SFA_BASE, RELOC_SFA_OFF13, - RELOC_BASE10, RELOC_BASE13, RELOC_BASE22, /* P.I.C. (base-relative) */ - RELOC_PC10, RELOC_PC22, /* for some sort of pc-rel P.I.C. (?) */ - RELOC_JMP_TBL, /* P.I.C. jump table */ - RELOC_SEGOFF16, /* reputedly for shared libraries somehow */ - RELOC_GLOB_DAT, RELOC_JMP_SLOT, RELOC_RELATIVE, - RELOC_11, - RELOC_WDISP2_14, - RELOC_WDISP19, - RELOC_HHI22, - RELOC_HLO10, - - /* 29K relocation types */ - RELOC_JUMPTARG, RELOC_CONST, RELOC_CONSTH, - - RELOC_WDISP14, RELOC_WDISP21, - - NO_RELOC - }; - -#define RELOC_TYPE_NAMES \ -"8", "16", "32", "DISP8", \ -"DISP16", "DISP32", "WDISP30", "WDISP22", \ -"HI22", "22", "13", "LO10", \ -"SFA_BASE", "SFAOFF13", "BASE10", "BASE13", \ -"BASE22", "PC10", "PC22", "JMP_TBL", \ -"SEGOFF16", "GLOB_DAT", "JMP_SLOT", "RELATIVE", \ -"11", "WDISP2_14", "WDISP19", "HHI22", \ -"HLO10", \ -"JUMPTARG", "CONST", "CONSTH", "WDISP14", \ -"WDISP21", \ -"NO_RELOC" - -#endif /* _RELOC_H_READ_ */ - -/* end of reloc.h */ diff --git a/contrib/gdb/include/aout/stab.def b/contrib/gdb/include/aout/stab.def deleted file mode 100644 index 3c6b456d3a97d..0000000000000 --- a/contrib/gdb/include/aout/stab.def +++ /dev/null @@ -1,264 +0,0 @@ -/* Table of DBX symbol codes for the GNU system. - Copyright (C) 1988, 91, 92, 93, 94, 95, 1996 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 2 of the License, 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ - -/* New stab from Solaris 2. This uses an n_type of 0, which in a.out files - overlaps the N_UNDF used for ordinary symbols. In ELF files, the - debug information is in a different file section, so there is no conflict. - This symbol's n_value gives the size of the string section associated - with this file. The symbol's n_strx (relative to the just-updated - string section start address) gives the name of the source file, - e.g. "foo.c", without any path information. The symbol's n_desc gives - the count of upcoming symbols associated with this file (not including - this one). */ -/* __define_stab (N_UNDF, 0x00, "UNDF") */ - -/* Global variable. Only the name is significant. - To find the address, look in the corresponding external symbol. */ -__define_stab (N_GSYM, 0x20, "GSYM") - -/* Function name for BSD Fortran. Only the name is significant. - To find the address, look in the corresponding external symbol. */ -__define_stab (N_FNAME, 0x22, "FNAME") - -/* Function name or text-segment variable for C. Value is its address. - Desc is supposedly starting line number, but GCC doesn't set it - and DBX seems not to miss it. */ -__define_stab (N_FUN, 0x24, "FUN") - -/* Data-segment variable with internal linkage. Value is its address. - "Static Sym". */ -__define_stab (N_STSYM, 0x26, "STSYM") - -/* BSS-segment variable with internal linkage. Value is its address. */ -__define_stab (N_LCSYM, 0x28, "LCSYM") - -/* Name of main routine. Only the name is significant. */ -__define_stab (N_MAIN, 0x2a, "MAIN") - -/* Solaris2: Read-only data symbols. */ -__define_stab (N_ROSYM, 0x2c, "ROSYM") - -/* Global symbol in Pascal. - Supposedly the value is its line number; I'm skeptical. */ -__define_stab (N_PC, 0x30, "PC") - -/* Number of symbols: 0, files,,funcs,lines according to Ultrix V4.0. */ -__define_stab (N_NSYMS, 0x32, "NSYMS") - -/* "No DST map for sym: name, ,0,type,ignored" according to Ultrix V4.0. */ -__define_stab (N_NOMAP, 0x34, "NOMAP") - -/* New stab from Solaris 2. Like N_SO, but for the object file. Two in - a row provide the build directory and the relative path of the .o from it. - Solaris2 uses this to avoid putting the stabs info into the linked - executable; this stab goes into the ".stab.index" section, and the debugger - reads the real stabs directly from the .o files instead. */ -__define_stab (N_OBJ, 0x38, "OBJ") - -/* New stab from Solaris 2. Options for the debugger, related to the - source language for this module. E.g. whether to use ANSI - integral promotions or traditional integral promotions. */ -__define_stab (N_OPT, 0x3c, "OPT") - -/* Register variable. Value is number of register. */ -__define_stab (N_RSYM, 0x40, "RSYM") - -/* Modula-2 compilation unit. Can someone say what info it contains? */ -__define_stab (N_M2C, 0x42, "M2C") - -/* Line number in text segment. Desc is the line number; - value is corresponding address. On Solaris2, the line number is - relative to the start of the current function. */ -__define_stab (N_SLINE, 0x44, "SLINE") - -/* Similar, for data segment. */ -__define_stab (N_DSLINE, 0x46, "DSLINE") - -/* Similar, for bss segment. */ -__define_stab (N_BSLINE, 0x48, "BSLINE") - -/* Sun's source-code browser stabs. ?? Don't know what the fields are. - Supposedly the field is "path to associated .cb file". THIS VALUE - OVERLAPS WITH N_BSLINE! */ -__define_stab_duplicate (N_BROWS, 0x48, "BROWS") - -/* GNU Modula-2 definition module dependency. Value is the modification time - of the definition file. Other is non-zero if it is imported with the - GNU M2 keyword %INITIALIZE. Perhaps N_M2C can be used if there - are enough empty fields? */ -__define_stab(N_DEFD, 0x4a, "DEFD") - -/* New in Solaris2. Function start/body/end line numbers. */ -__define_stab(N_FLINE, 0x4C, "FLINE") - -/* THE FOLLOWING TWO STAB VALUES CONFLICT. Happily, one is for Modula-2 - and one is for C++. Still,... */ -/* GNU C++ exception variable. Name is variable name. */ -__define_stab (N_EHDECL, 0x50, "EHDECL") -/* Modula2 info "for imc": name,,0,0,0 according to Ultrix V4.0. */ -__define_stab_duplicate (N_MOD2, 0x50, "MOD2") - -/* GNU C++ `catch' clause. Value is its address. Desc is nonzero if - this entry is immediately followed by a CAUGHT stab saying what exception - was caught. Multiple CAUGHT stabs means that multiple exceptions - can be caught here. If Desc is 0, it means all exceptions are caught - here. */ -__define_stab (N_CATCH, 0x54, "CATCH") - -/* Structure or union element. Value is offset in the structure. */ -__define_stab (N_SSYM, 0x60, "SSYM") - -/* Solaris2: Last stab emitted for module. */ -__define_stab (N_ENDM, 0x62, "ENDM") - -/* Name of main source file. - Value is starting text address of the compilation. - If multiple N_SO's appear, the first to contain a trailing / is the - compilation directory. The first to not contain a trailing / is the - source file name, relative to the compilation directory. Others (perhaps - resulting from cfront) are ignored. - On Solaris2, value is undefined, but desc is a source-language code. */ - -__define_stab (N_SO, 0x64, "SO") - -/* Automatic variable in the stack. Value is offset from frame pointer. - Also used for type descriptions. */ -__define_stab (N_LSYM, 0x80, "LSYM") - -/* Beginning of an include file. Only Sun uses this. - In an object file, only the name is significant. - The Sun linker puts data into some of the other fields. */ -__define_stab (N_BINCL, 0x82, "BINCL") - -/* Name of sub-source file (#include file). - Value is starting text address of the compilation. */ -__define_stab (N_SOL, 0x84, "SOL") - -/* Parameter variable. Value is offset from argument pointer. - (On most machines the argument pointer is the same as the frame pointer. */ -__define_stab (N_PSYM, 0xa0, "PSYM") - -/* End of an include file. No name. - This and N_BINCL act as brackets around the file's output. - In an object file, there is no significant data in this entry. - The Sun linker puts data into some of the fields. */ -__define_stab (N_EINCL, 0xa2, "EINCL") - -/* Alternate entry point. Value is its address. */ -__define_stab (N_ENTRY, 0xa4, "ENTRY") - -/* Beginning of lexical block. - The desc is the nesting level in lexical blocks. - The value is the address of the start of the text for the block. - The variables declared inside the block *precede* the N_LBRAC symbol. - On Solaris2, the value is relative to the start of the current function. */ -__define_stab (N_LBRAC, 0xc0, "LBRAC") - -/* Place holder for deleted include file. Replaces a N_BINCL and everything - up to the corresponding N_EINCL. The Sun linker generates these when - it finds multiple identical copies of the symbols from an include file. - This appears only in output from the Sun linker. */ -__define_stab (N_EXCL, 0xc2, "EXCL") - -/* Modula-2 scope information. Can someone say what info it contains? */ -__define_stab (N_SCOPE, 0xc4, "SCOPE") - -/* End of a lexical block. Desc matches the N_LBRAC's desc. - The value is the address of the end of the text for the block. - On Solaris2, the value is relative to the start of the current function. */ -__define_stab (N_RBRAC, 0xe0, "RBRAC") - -/* Begin named common block. Only the name is significant. */ -__define_stab (N_BCOMM, 0xe2, "BCOMM") - -/* End named common block. Only the name is significant - (and it should match the N_BCOMM). */ -__define_stab (N_ECOMM, 0xe4, "ECOMM") - -/* Member of a common block; value is offset within the common block. - This should occur within a BCOMM/ECOMM pair. */ -__define_stab (N_ECOML, 0xe8, "ECOML") - -/* Solaris2: Pascal "with" statement: type,,0,0,offset */ -__define_stab (N_WITH, 0xea, "WITH") - -/* These STAB's are used on Gould systems for Non-Base register symbols - or something like that. FIXME. I have assigned the values at random - since I don't have a Gould here. Fixups from Gould folk welcome... */ -__define_stab (N_NBTEXT, 0xF0, "NBTEXT") -__define_stab (N_NBDATA, 0xF2, "NBDATA") -__define_stab (N_NBBSS, 0xF4, "NBBSS") -__define_stab (N_NBSTS, 0xF6, "NBSTS") -__define_stab (N_NBLCS, 0xF8, "NBLCS") - -/* Second symbol entry containing a length-value for the preceding entry. - The value is the length. */ -__define_stab (N_LENG, 0xfe, "LENG") - -/* The above information, in matrix format. - - STAB MATRIX - _________________________________________________ - | 00 - 1F are not dbx stab symbols | - | In most cases, the low bit is the EXTernal bit| - - | 00 UNDEF | 02 ABS | 04 TEXT | 06 DATA | - | 01 |EXT | 03 |EXT | 05 |EXT | 07 |EXT | - - | 08 BSS | 0A INDR | 0C FN_SEQ | 0E WEAKA | - | 09 |EXT | 0B | 0D WEAKU | 0F WEAKT | - - | 10 WEAKD | 12 COMM | 14 SETA | 16 SETT | - | 11 WEAKB | 13 | 15 | 17 | - - | 18 SETD | 1A SETB | 1C SETV | 1E WARNING| - | 19 | 1B | 1D | 1F FN | - - |_______________________________________________| - | Debug entries with bit 01 set are unused. | - | 20 GSYM | 22 FNAME | 24 FUN | 26 STSYM | - | 28 LCSYM | 2A MAIN | 2C ROSYM | 2E | - | 30 PC | 32 NSYMS | 34 NOMAP | 36 | - | 38 OBJ | 3A | 3C OPT | 3E | - | 40 RSYM | 42 M2C | 44 SLINE | 46 DSLINE | - | 48 BSLINE*| 4A DEFD | 4C FLINE | 4E | - | 50 EHDECL*| 52 | 54 CATCH | 56 | - | 58 | 5A | 5C | 5E | - | 60 SSYM | 62 ENDM | 64 SO | 66 | - | 68 | 6A | 6C | 6E | - | 70 | 72 | 74 | 76 | - | 78 | 7A | 7C | 7E | - | 80 LSYM | 82 BINCL | 84 SOL | 86 | - | 88 | 8A | 8C | 8E | - | 90 | 92 | 94 | 96 | - | 98 | 9A | 9C | 9E | - | A0 PSYM | A2 EINCL | A4 ENTRY | A6 | - | A8 | AA | AC | AE | - | B0 | B2 | B4 | B6 | - | B8 | BA | BC | BE | - | C0 LBRAC | C2 EXCL | C4 SCOPE | C6 | - | C8 | CA | CC | CE | - | D0 | D2 | D4 | D6 | - | D8 | DA | DC | DE | - | E0 RBRAC | E2 BCOMM | E4 ECOMM | E6 | - | E8 ECOML | EA WITH | EC | EE | - | F0 | F2 | F4 | F6 | - | F8 | FA | FC | FE LENG | - +-----------------------------------------------+ - * 50 EHDECL is also MOD2. - * 48 BSLINE is also BROWS. - */ diff --git a/contrib/gdb/include/aout/stab_gnu.h b/contrib/gdb/include/aout/stab_gnu.h deleted file mode 100644 index 7d18e14a26340..0000000000000 --- a/contrib/gdb/include/aout/stab_gnu.h +++ /dev/null @@ -1,37 +0,0 @@ -#ifndef __GNU_STAB__ - -/* Indicate the GNU stab.h is in use. */ - -#define __GNU_STAB__ - -#define __define_stab(NAME, CODE, STRING) NAME=CODE, -#define __define_stab_duplicate(NAME, CODE, STRING) NAME=CODE, - -enum __stab_debug_code -{ -#include "aout/stab.def" -LAST_UNUSED_STAB_CODE -}; - -#undef __define_stab - -/* Definitions of "desc" field for N_SO stabs in Solaris2. */ - -#define N_SO_AS 1 -#define N_SO_C 2 -#define N_SO_ANSI_C 3 -#define N_SO_CC 4 /* C++ */ -#define N_SO_FORTRAN 5 -#define N_SO_PASCAL 6 - -/* Solaris2: Floating point type values in basic types. */ - -#define NF_NONE 0 -#define NF_SINGLE 1 /* IEEE 32-bit */ -#define NF_DOUBLE 2 /* IEEE 64-bit */ -#define NF_COMPLEX 3 /* Fortran complex */ -#define NF_COMPLEX16 4 /* Fortran double complex */ -#define NF_COMPLEX32 5 /* Fortran complex*16 */ -#define NF_LDOUBLE 6 /* Long double (whatever that is) */ - -#endif /* __GNU_STAB_ */ diff --git a/contrib/gdb/include/aout/sun4.h b/contrib/gdb/include/aout/sun4.h deleted file mode 100644 index f42a0dd45988f..0000000000000 --- a/contrib/gdb/include/aout/sun4.h +++ /dev/null @@ -1,219 +0,0 @@ -/* SPARC-specific values for a.out files */ - -/* Some systems, e.g., AIX, may have defined this in header files already - included. */ -#undef TARGET_PAGE_SIZE -#define TARGET_PAGE_SIZE 0x2000 /* 8K. aka NBPG in <sys/param.h> */ -/* Note that some SPARCs have 4K pages, some 8K, some others. */ - -#define SEG_SIZE_SPARC TARGET_PAGE_SIZE -#define SEG_SIZE_SUN3 0x20000 /* Resolution of r/w protection hw */ - -#define TEXT_START_ADDR TARGET_PAGE_SIZE /* Location 0 is not accessible */ -#define N_HEADER_IN_TEXT(x) 1 - -/* Non-default definitions of the accessor macros... */ - -/* Segment size varies on Sun-3 versus Sun-4. */ - -#define N_SEGSIZE(x) (N_MACHTYPE(x) == M_SPARC? SEG_SIZE_SPARC: \ - N_MACHTYPE(x) == M_68020? SEG_SIZE_SUN3: \ - /* Guess? */ TARGET_PAGE_SIZE) - -/* Virtual Address of text segment from the a.out file. For OMAGIC, - (almost always "unlinked .o's" these days), should be zero. - Sun added a kludge so that shared libraries linked ZMAGIC get - an address of zero if a_entry (!!!) is lower than the otherwise - expected text address. These kludges have gotta go! - For linked files, should reflect reality if we know it. */ - -/* This differs from the version in aout64.h (which we override by defining - it here) only for NMAGIC (we return TEXT_START_ADDR+EXEC_BYTES_SIZE; - they return 0). */ - -#define N_TXTADDR(x) \ - (N_MAGIC(x)==OMAGIC? 0 \ - : (N_MAGIC(x) == ZMAGIC && (x).a_entry < TEXT_START_ADDR)? 0 \ - : TEXT_START_ADDR+EXEC_BYTES_SIZE) - -/* When a file is linked against a shared library on SunOS 4, the - dynamic bit in the exec header is set, and the first symbol in the - symbol table is __DYNAMIC. Its value is the address of the - following structure. */ - -struct external_sun4_dynamic -{ - /* The version number of the structure. SunOS 4.1.x creates files - with version number 3, which is what this structure is based on. - According to gdb, version 2 is similar. I believe that version 2 - used a different type of procedure linkage table, and there may - have been other differences. */ - bfd_byte ld_version[4]; - /* The virtual address of a 28 byte structure used in debugging. - The contents are filled in at run time by ld.so. */ - bfd_byte ldd[4]; - /* The virtual address of another structure with information about - how to relocate the executable at run time. */ - bfd_byte ld[4]; -}; - -/* The size of the debugging structure pointed to by the debugger - field of __DYNAMIC. */ -#define EXTERNAL_SUN4_DYNAMIC_DEBUGGER_SIZE (24) - -/* The structure pointed to by the linker field of __DYNAMIC. As far - as I can tell, most of the addresses in this structure are offsets - within the file, but some are actually virtual addresses. */ - -struct internal_sun4_dynamic_link -{ - /* Linked list of loaded objects. This is filled in at runtime by - ld.so and probably by dlopen. */ - unsigned long ld_loaded; - - /* The address of the list of names of shared objects which must be - included at runtime. Each entry in the list is 16 bytes: the 4 - byte address of the string naming the object (e.g., for -lc this - is "c"); 4 bytes of flags--the high bit is whether to search for - the object using the library path; the 2 byte major version - number; the 2 byte minor version number; the 4 byte address of - the next entry in the list (zero if this is the last entry). The - version numbers seem to only be non-zero when doing library - searching. */ - unsigned long ld_need; - - /* The address of the path to search for the shared objects which - must be included. This points to a string in PATH format which - is generated from the -L arguments to the linker. According to - the man page, ld.so implicitly adds ${LD_LIBRARY_PATH} to the - beginning of this string and /lib:/usr/lib:/usr/local/lib to the - end. The string is terminated by a null byte. This field is - zero if there is no additional path. */ - unsigned long ld_rules; - - /* The address of the global offset table. This appears to be a - virtual address, not a file offset. The first entry in the - global offset table seems to be the virtual address of the - sun4_dynamic structure (the same value as the __DYNAMIC symbol). - The global offset table is used for PIC code to hold the - addresses of variables. A dynamically linked file which does not - itself contain PIC code has a four byte global offset table. */ - unsigned long ld_got; - - /* The address of the procedure linkage table. This appears to be a - virtual address, not a file offset. - - On a SPARC, the table is composed of 12 byte entries, each of - which consists of three instructions. The first entry is - sethi %hi(0),%g1 - jmp %g1 - nop - These instructions are changed by ld.so into a jump directly into - ld.so itself. Each subsequent entry is - save %sp, -96, %sp - call <address of first entry in procedure linkage table> - <reloc_number | 0x01000000> - The reloc_number is the number of the reloc to use to resolve - this entry. The reloc will be a JMP_SLOT reloc against some - symbol that is not defined in this object file but should be - defined in a shared object (if it is not, ld.so will report a - runtime error and exit). The constant 0x010000000 turns the - reloc number into a sethi of %g0, which does nothing since %g0 is - hardwired to zero. - - When one of these entries is executed, it winds up calling into - ld.so. ld.so looks at the reloc number, available via the return - address, to determine which entry this is. It then looks at the - reloc and patches up the entry in the table into a sethi and jmp - to the real address followed by a nop. This means that the reloc - lookup only has to happen once, and it also means that the - relocation only needs to be done if the function is actually - called. The relocation is expensive because ld.so must look up - the symbol by name. - - The size of the procedure linkage table is given by the ld_plt_sz - field. */ - unsigned long ld_plt; - - /* The address of the relocs. These are in the same format as - ordinary relocs. Symbol index numbers refer to the symbols - pointed to by ld_stab. I think the only way to determine the - number of relocs is to assume that all the bytes from ld_rel to - ld_hash contain reloc entries. */ - unsigned long ld_rel; - - /* The address of a hash table of symbols. The hash table has - roughly the same number of entries as there are dynamic symbols; - I think the only way to get the exact size is to assume that - every byte from ld_hash to ld_stab is devoted to the hash table. - - Each entry in the hash table is eight bytes. The first four - bytes are a symbol index into the dynamic symbols. The second - four bytes are the index of the next hash table entry in the - bucket. The ld_buckets field gives the number of buckets, say B. - The first B entries in the hash table each start a bucket which - is chained through the second four bytes of each entry. A value - of zero ends the chain. - - The hash function is simply - h = 0; - while (*string != '\0') - h = (h << 1) + *string++; - h &= 0x7fffffff; - - To look up a symbol, compute the hash value of the name. Take - the modulos of hash value and the number of buckets. Start at - that entry in the hash table. See if the symbol (from the first - four bytes of the hash table entry) has the name you are looking - for. If not, use the chain field (the second four bytes of the - hash table entry) to move on to the next entry in this bucket. - If the chain field is zero you have reached the end of the - bucket, and the symbol is not in the hash table. */ - unsigned long ld_hash; - - /* The address of the symbol table. This is a list of - external_nlist structures. The string indices are relative to - the ld_symbols field. I think the only way to determine the - number of symbols is to assume that all the bytes between ld_stab - and ld_symbols are external_nlist structures. */ - unsigned long ld_stab; - - /* I don't know what this is for. It seems to always be zero. */ - unsigned long ld_stab_hash; - - /* The number of buckets in the hash table. */ - unsigned long ld_buckets; - - /* The address of the symbol string table. The first string in this - string table need not be the empty string. */ - unsigned long ld_symbols; - - /* The size in bytes of the symbol string table. */ - unsigned long ld_symb_size; - - /* The size in bytes of the text segment. */ - unsigned long ld_text; - - /* The size in bytes of the procedure linkage table. */ - unsigned long ld_plt_sz; -}; - -/* The external form of the structure. */ - -struct external_sun4_dynamic_link -{ - bfd_byte ld_loaded[4]; - bfd_byte ld_need[4]; - bfd_byte ld_rules[4]; - bfd_byte ld_got[4]; - bfd_byte ld_plt[4]; - bfd_byte ld_rel[4]; - bfd_byte ld_hash[4]; - bfd_byte ld_stab[4]; - bfd_byte ld_stab_hash[4]; - bfd_byte ld_buckets[4]; - bfd_byte ld_symbols[4]; - bfd_byte ld_symb_size[4]; - bfd_byte ld_text[4]; - bfd_byte ld_plt_sz[4]; -}; diff --git a/contrib/gdb/include/bfdlink.h b/contrib/gdb/include/bfdlink.h deleted file mode 100644 index 47d80b8c195f5..0000000000000 --- a/contrib/gdb/include/bfdlink.h +++ /dev/null @@ -1,452 +0,0 @@ -/* bfdlink.h -- header file for BFD link routines - Copyright 1993 Free Software Foundation, Inc. - Written by Steve Chamberlain and Ian Lance Taylor, Cygnus Support. - -This file is part of BFD, the Binary File Descriptor library. - -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 2 of the License, 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ - -#ifndef BFDLINK_H -#define BFDLINK_H - -/* Which symbols to strip during a link. */ -enum bfd_link_strip -{ - strip_none, /* Don't strip any symbols. */ - strip_debugger, /* Strip debugging symbols. */ - strip_some, /* keep_hash is the list of symbols to keep. */ - strip_all /* Strip all symbols. */ -}; - -/* Which local symbols to discard during a link. This is irrelevant - if strip_all is used. */ -enum bfd_link_discard -{ - discard_none, /* Don't discard any locals. */ - discard_l, /* Discard locals with a certain prefix. */ - discard_all /* Discard all locals. */ -}; - -/* These are the possible types of an entry in the BFD link hash - table. */ - -enum bfd_link_hash_type -{ - bfd_link_hash_new, /* Symbol is new. */ - bfd_link_hash_undefined, /* Symbol seen before, but undefined. */ - bfd_link_hash_undefweak, /* Symbol is weak and undefined. */ - bfd_link_hash_defined, /* Symbol is defined. */ - bfd_link_hash_defweak, /* Symbol is weak and defined. */ - bfd_link_hash_common, /* Symbol is common. */ - bfd_link_hash_indirect, /* Symbol is an indirect link. */ - bfd_link_hash_warning /* Like indirect, but warn if referenced. */ -}; - -/* The linking routines use a hash table which uses this structure for - its elements. */ - -struct bfd_link_hash_entry -{ - /* Base hash table entry structure. */ - struct bfd_hash_entry root; - /* Type of this entry. */ - enum bfd_link_hash_type type; - - /* Undefined and common symbols are kept in a linked list through - this field. This field is not in the union because that would - force us to remove entries from the list when we changed their - type, which would force the list to be doubly linked, which would - waste more memory. When an undefined or common symbol is - created, it should be added to this list, the head of which is in - the link hash table itself. As symbols are defined, they need - not be removed from the list; anything which reads the list must - doublecheck the symbol type. - - Weak symbols are not kept on this list. - - Defined and defweak symbols use this field as a reference marker. - If the field is not NULL, or this structure is the tail of the - undefined symbol list, the symbol has been referenced. If the - symbol is undefined and becomes defined, this field will - automatically be non-NULL since the symbol will have been on the - undefined symbol list. */ - struct bfd_link_hash_entry *next; - /* A union of information depending upon the type. */ - union - { - /* Nothing is kept for bfd_hash_new. */ - /* bfd_link_hash_undefined, bfd_link_hash_undefweak. */ - struct - { - bfd *abfd; /* BFD symbol was found in. */ - } undef; - /* bfd_link_hash_defined, bfd_link_hash_defweak. */ - struct - { - bfd_vma value; /* Symbol value. */ - asection *section; /* Symbol section. */ - } def; - /* bfd_link_hash_indirect, bfd_link_hash_warning. */ - struct - { - struct bfd_link_hash_entry *link; /* Real symbol. */ - const char *warning; /* Warning (bfd_link_hash_warning only). */ - } i; - /* bfd_link_hash_common. */ - struct - { - /* The linker needs to know three things about common - symbols: the size, the alignment, and the section in - which the symbol should be placed. We store the size - here, and we allocate a small structure to hold the - section and the alignment. The alignment is stored as a - power of two. We don't store all the information - directly because we don't want to increase the size of - the union; this structure is a major space user in the - linker. */ - bfd_size_type size; /* Common symbol size. */ - struct bfd_link_hash_common_entry - { - unsigned int alignment_power; /* Alignment. */ - asection *section; /* Symbol section. */ - } *p; - } c; - } u; -}; - -/* This is the link hash table. It is a derived class of - bfd_hash_table. */ - -struct bfd_link_hash_table -{ - /* The hash table itself. */ - struct bfd_hash_table table; - /* The back end which created this hash table. This indicates the - type of the entries in the hash table, which is sometimes - important information when linking object files of different - types together. */ - const bfd_target *creator; - /* A linked list of undefined and common symbols, linked through the - next field in the bfd_link_hash_entry structure. */ - struct bfd_link_hash_entry *undefs; - /* Entries are added to the tail of the undefs list. */ - struct bfd_link_hash_entry *undefs_tail; -}; - -/* Look up an entry in a link hash table. If FOLLOW is true, this - follows bfd_link_hash_indirect and bfd_link_hash_warning links to - the real symbol. */ -extern struct bfd_link_hash_entry *bfd_link_hash_lookup - PARAMS ((struct bfd_link_hash_table *, const char *, boolean create, - boolean copy, boolean follow)); - -/* Look up an entry in the main linker hash table if the symbol might - be wrapped. This should only be used for references to an - undefined symbol, not for definitions of a symbol. */ - -extern struct bfd_link_hash_entry *bfd_wrapped_link_hash_lookup - PARAMS ((bfd *, struct bfd_link_info *, const char *, boolean, boolean, - boolean)); - -/* Traverse a link hash table. */ -extern void bfd_link_hash_traverse - PARAMS ((struct bfd_link_hash_table *, - boolean (*) (struct bfd_link_hash_entry *, PTR), - PTR)); - -/* Add an entry to the undefs list. */ -extern void bfd_link_add_undef - PARAMS ((struct bfd_link_hash_table *, struct bfd_link_hash_entry *)); - -/* This structure holds all the information needed to communicate - between BFD and the linker when doing a link. */ - -struct bfd_link_info -{ - /* Function callbacks. */ - const struct bfd_link_callbacks *callbacks; - /* true if BFD should generate a relocateable object file. */ - boolean relocateable; - /* true if BFD should generate a shared object. */ - boolean shared; - /* true if BFD should pre-bind symbols in a shared object. */ - boolean symbolic; - /* true if shared objects should be linked directly, not shared. */ - boolean static_link; - /* Which symbols to strip. */ - enum bfd_link_strip strip; - /* Which local symbols to discard. */ - enum bfd_link_discard discard; - /* The local symbol prefix to discard if using discard_l. */ - unsigned int lprefix_len; - const char *lprefix; - /* true if symbols should be retained in memory, false if they - should be freed and reread. */ - boolean keep_memory; - /* The list of input BFD's involved in the link. These are chained - together via the link_next field. */ - bfd *input_bfds; - /* If a symbol should be created for each input BFD, this is section - where those symbols should be placed. It must be a section in - the output BFD. It may be NULL, in which case no such symbols - will be created. This is to support CREATE_OBJECT_SYMBOLS in the - linker command language. */ - asection *create_object_symbols_section; - /* Hash table handled by BFD. */ - struct bfd_link_hash_table *hash; - /* Hash table of symbols to keep. This is NULL unless strip is - strip_some. */ - struct bfd_hash_table *keep_hash; - /* Hash table of symbols to report back via notice_callback. If - this is NULL no symbols are reported back. */ - struct bfd_hash_table *notice_hash; - /* Hash table of symbols which are being wrapped (the --wrap linker - option). If this is NULL, no symbols are being wrapped. */ - struct bfd_hash_table *wrap_hash; - - /* If a base output file is wanted, then this points to it */ - PTR base_file; -}; - -/* This structures holds a set of callback functions. These are - called by the BFD linker routines. The first argument to each - callback function is the bfd_link_info structure being used. Each - function returns a boolean value. If the function returns false, - then the BFD function which called it will return with a failure - indication. */ - -struct bfd_link_callbacks -{ - /* A function which is called when an object is added from an - archive. ABFD is the archive element being added. NAME is the - name of the symbol which caused the archive element to be pulled - in. */ - boolean (*add_archive_element) PARAMS ((struct bfd_link_info *, - bfd *abfd, - const char *name)); - /* A function which is called when a symbol is found with multiple - definitions. NAME is the symbol which is defined multiple times. - OBFD is the old BFD, OSEC is the old section, OVAL is the old - value, NBFD is the new BFD, NSEC is the new section, and NVAL is - the new value. OBFD may be NULL. OSEC and NSEC may be - bfd_com_section or bfd_ind_section. */ - boolean (*multiple_definition) PARAMS ((struct bfd_link_info *, - const char *name, - bfd *obfd, - asection *osec, - bfd_vma oval, - bfd *nbfd, - asection *nsec, - bfd_vma nval)); - /* A function which is called when a common symbol is defined - multiple times. NAME is the symbol appearing multiple times. - OBFD is the BFD of the existing symbol; it may be NULL if this is - not known. OTYPE is the type of the existing symbol, which may - be bfd_link_hash_defined, bfd_link_hash_defweak, - bfd_link_hash_common, or bfd_link_hash_indirect. If OTYPE is - bfd_link_hash_common, OSIZE is the size of the existing symbol. - NBFD is the BFD of the new symbol. NTYPE is the type of the new - symbol, one of bfd_link_hash_defined, bfd_link_hash_common, or - bfd_link_hash_indirect. If NTYPE is bfd_link_hash_common, NSIZE - is the size of the new symbol. */ - boolean (*multiple_common) PARAMS ((struct bfd_link_info *, - const char *name, - bfd *obfd, - enum bfd_link_hash_type otype, - bfd_vma osize, - bfd *nbfd, - enum bfd_link_hash_type ntype, - bfd_vma nsize)); - /* A function which is called to add a symbol to a set. ENTRY is - the link hash table entry for the set itself (e.g., - __CTOR_LIST__). RELOC is the relocation to use for an entry in - the set when generating a relocateable file, and is also used to - get the size of the entry when generating an executable file. - ABFD, SEC and VALUE identify the value to add to the set. */ - boolean (*add_to_set) PARAMS ((struct bfd_link_info *, - struct bfd_link_hash_entry *entry, - bfd_reloc_code_real_type reloc, - bfd *abfd, asection *sec, bfd_vma value)); - /* A function which is called when the name of a g++ constructor or - destructor is found. This is only called by some object file - formats. CONSTRUCTOR is true for a constructor, false for a - destructor. This will use BFD_RELOC_CTOR when generating a - relocateable file. NAME is the name of the symbol found. ABFD, - SECTION and VALUE are the value of the symbol. */ - boolean (*constructor) PARAMS ((struct bfd_link_info *, - boolean constructor, - const char *name, bfd *abfd, asection *sec, - bfd_vma value)); - /* A function which is called to issue a linker warning. For - example, this is called when there is a reference to a warning - symbol. WARNING is the warning to be issued. SYMBOL is the name - of the symbol which triggered the warning; it may be NULL if - there is none. ABFD, SECTION and ADDRESS identify the location - which trigerred the warning; either ABFD or SECTION or both may - be NULL if the location is not known. */ - boolean (*warning) PARAMS ((struct bfd_link_info *, - const char *warning, const char *symbol, - bfd *abfd, asection *section, - bfd_vma address)); - /* A function which is called when a relocation is attempted against - an undefined symbol. NAME is the symbol which is undefined. - ABFD, SECTION and ADDRESS identify the location from which the - reference is made. In some cases SECTION may be NULL. */ - boolean (*undefined_symbol) PARAMS ((struct bfd_link_info *, - const char *name, bfd *abfd, - asection *section, bfd_vma address)); - /* A function which is called when a reloc overflow occurs. NAME is - the name of the symbol or section the reloc is against, - RELOC_NAME is the name of the relocation, and ADDEND is any - addend that is used. ABFD, SECTION and ADDRESS identify the - location at which the overflow occurs; if this is the result of a - bfd_section_reloc_link_order or bfd_symbol_reloc_link_order, then - ABFD will be NULL. */ - boolean (*reloc_overflow) PARAMS ((struct bfd_link_info *, - const char *name, - const char *reloc_name, bfd_vma addend, - bfd *abfd, asection *section, - bfd_vma address)); - /* A function which is called when a dangerous reloc is performed. - The canonical example is an a29k IHCONST reloc which does not - follow an IHIHALF reloc. MESSAGE is an appropriate message. - ABFD, SECTION and ADDRESS identify the location at which the - problem occurred; if this is the result of a - bfd_section_reloc_link_order or bfd_symbol_reloc_link_order, then - ABFD will be NULL. */ - boolean (*reloc_dangerous) PARAMS ((struct bfd_link_info *, - const char *message, - bfd *abfd, asection *section, - bfd_vma address)); - /* A function which is called when a reloc is found to be attached - to a symbol which is not being written out. NAME is the name of - the symbol. ABFD, SECTION and ADDRESS identify the location of - the reloc; if this is the result of a - bfd_section_reloc_link_order or bfd_symbol_reloc_link_order, then - ABFD will be NULL. */ - boolean (*unattached_reloc) PARAMS ((struct bfd_link_info *, - const char *name, - bfd *abfd, asection *section, - bfd_vma address)); - /* A function which is called when a symbol in notice_hash is - defined or referenced. NAME is the symbol. ABFD, SECTION and - ADDRESS are the value of the symbol. If SECTION is - bfd_und_section, this is a reference. */ - boolean (*notice) PARAMS ((struct bfd_link_info *, const char *name, - bfd *abfd, asection *section, bfd_vma address)); -}; - -/* The linker builds link_order structures which tell the code how to - include input data in the output file. */ - -/* These are the types of link_order structures. */ - -enum bfd_link_order_type -{ - bfd_undefined_link_order, /* Undefined. */ - bfd_indirect_link_order, /* Built from a section. */ - bfd_fill_link_order, /* Fill with a 16 bit constant. */ - bfd_data_link_order, /* Set to explicit data. */ - bfd_section_reloc_link_order, /* Relocate against a section. */ - bfd_symbol_reloc_link_order /* Relocate against a symbol. */ -}; - -/* This is the link_order structure itself. These form a chain - attached to the section whose contents they are describing. */ - -struct bfd_link_order -{ - /* Next link_order in chain. */ - struct bfd_link_order *next; - /* Type of link_order. */ - enum bfd_link_order_type type; - /* Offset within output section. */ - bfd_vma offset; - /* Size within output section. */ - bfd_size_type size; - /* Type specific information. */ - union - { - struct - { - /* Section to include. If this is used, then - section->output_section must be the section the - link_order is attached to, section->output_offset must - equal the link_order offset field, and section->_raw_size - must equal the link_order size field. Maybe these - restrictions should be relaxed someday. */ - asection *section; - } indirect; - struct - { - /* Value to fill with. */ - unsigned int value; - } fill; - struct - { - /* Data to put into file. The size field gives the number - of bytes which this field points to. */ - bfd_byte *contents; - } data; - struct - { - /* Description of reloc to generate. Used for - bfd_section_reloc_link_order and - bfd_symbol_reloc_link_order. */ - struct bfd_link_order_reloc *p; - } reloc; - } u; -}; - -/* A linker order of type bfd_section_reloc_link_order or - bfd_symbol_reloc_link_order means to create a reloc against a - section or symbol, respectively. This is used to implement -Ur to - generate relocs for the constructor tables. The - bfd_link_order_reloc structure describes the reloc that BFD should - create. It is similar to a arelent, but I didn't use arelent - because the linker does not know anything about most symbols, and - any asymbol structure it creates will be partially meaningless. - This information could logically be in the bfd_link_order struct, - but I didn't want to waste the space since these types of relocs - are relatively rare. */ - -struct bfd_link_order_reloc -{ - /* Reloc type. */ - bfd_reloc_code_real_type reloc; - - union - { - /* For type bfd_section_reloc_link_order, this is the section - the reloc should be against. This must be a section in the - output BFD, not any of the input BFDs. */ - asection *section; - /* For type bfd_symbol_reloc_link_order, this is the name of the - symbol the reloc should be against. */ - const char *name; - } u; - - /* Addend to use. The object file should contain zero. The BFD - backend is responsible for filling in the contents of the object - file correctly. For some object file formats (e.g., COFF) the - addend must be stored into in the object file, and for some - (e.g., SPARC a.out) it is kept in the reloc. */ - bfd_vma addend; -}; - -/* Allocate a new link_order for a section. */ -extern struct bfd_link_order *bfd_new_link_order PARAMS ((bfd *, asection *)); - -#endif diff --git a/contrib/gdb/include/bout.h b/contrib/gdb/include/bout.h deleted file mode 100644 index 8fc28cc3d6d7f..0000000000000 --- a/contrib/gdb/include/bout.h +++ /dev/null @@ -1,182 +0,0 @@ -/* - * This file is a modified version of 'a.out.h'. It is to be used in all - * GNU tools modified to support the i80960 (or tools that operate on - * object files created by such tools). - * - * All i80960 development is done in a CROSS-DEVELOPMENT environment. I.e., - * object code is generated on, and executed under the direction of a symbolic - * debugger running on, a host system. We do not want to be subject to the - * vagaries of which host it is or whether it supports COFF or a.out format, - * or anything else. We DO want to: - * - * o always generate the same format object files, regardless of host. - * - * o have an 'a.out' header that we can modify for our own purposes - * (the 80960 is typically an embedded processor and may require - * enhanced linker support that the normal a.out.h header can't - * accommodate). - * - * As for byte-ordering, the following rules apply: - * - * o Text and data that is actually downloaded to the target is always - * in i80960 (little-endian) order. - * - * o All other numbers (in the header, symbols, relocation directives) - * are in host byte-order: object files CANNOT be lifted from a - * little-end host and used on a big-endian (or vice versa) without - * modification. - * ==> THIS IS NO LONGER TRUE USING BFD. WE CAN GENERATE ANY BYTE ORDER - * FOR THE HEADER, AND READ ANY BYTE ORDER. PREFERENCE WOULD BE TO - * USE LITTLE-ENDIAN BYTE ORDER THROUGHOUT, REGARDLESS OF HOST. <== - * - * o The downloader ('comm960') takes care to generate a pseudo-header - * with correct (i80960) byte-ordering before shipping text and data - * off to the NINDY monitor in the target systems. Symbols and - * relocation info are never sent to the target. - */ - - -#define BMAGIC 0415 -/* We don't accept the following (see N_BADMAG macro). - * They're just here so GNU code will compile. - */ -#define OMAGIC 0407 /* old impure format */ -#define NMAGIC 0410 /* read-only text */ -#define ZMAGIC 0413 /* demand load format */ - -/* FILE HEADER - * All 'lengths' are given as a number of bytes. - * All 'alignments' are for relinkable files only; an alignment of - * 'n' indicates the corresponding segment must begin at an - * address that is a multiple of (2**n). - */ -struct external_exec { - /* Standard stuff */ - unsigned char e_info[4]; /* Identifies this as a b.out file */ - unsigned char e_text[4]; /* Length of text */ - unsigned char e_data[4]; /* Length of data */ - unsigned char e_bss[4]; /* Length of uninitialized data area */ - unsigned char e_syms[4]; /* Length of symbol table */ - unsigned char e_entry[4]; /* Runtime start address */ - unsigned char e_trsize[4]; /* Length of text relocation info */ - unsigned char e_drsize[4]; /* Length of data relocation info */ - - /* Added for i960 */ - unsigned char e_tload[4]; /* Text runtime load address */ - unsigned char e_dload[4]; /* Data runtime load address */ - unsigned char e_talign[1]; /* Alignment of text segment */ - unsigned char e_dalign[1]; /* Alignment of data segment */ - unsigned char e_balign[1]; /* Alignment of bss segment */ - unsigned char e_relaxable[1]; /* Assembled with enough info to allow linker to relax */ -}; - -#define EXEC_BYTES_SIZE (sizeof (struct external_exec)) - -/* These macros use the a_xxx field names, since they operate on the exec - structure after it's been byte-swapped and realigned on the host machine. */ -#define N_BADMAG(x) (((x).a_info)!=BMAGIC) -#define N_TXTOFF(x) EXEC_BYTES_SIZE -#define N_DATOFF(x) ( N_TXTOFF(x) + (x).a_text ) -#define N_TROFF(x) ( N_DATOFF(x) + (x).a_data ) -#define N_TRELOFF N_TROFF -#define N_DROFF(x) ( N_TROFF(x) + (x).a_trsize ) -#define N_DRELOFF N_DROFF -#define N_SYMOFF(x) ( N_DROFF(x) + (x).a_drsize ) -#define N_STROFF(x) ( N_SYMOFF(x) + (x).a_syms ) -#define N_DATADDR(x) ( (x).a_dload ) - -/* Address of text segment in memory after it is loaded. */ -#if !defined (N_TXTADDR) -#define N_TXTADDR(x) 0 -#endif - -/* A single entry in the symbol table - */ -struct nlist { - union { - char *n_name; - struct nlist *n_next; - long n_strx; /* Index into string table */ - } n_un; - unsigned char n_type; /* See below */ - char n_other; /* Used in i80960 support -- see below */ - short n_desc; - unsigned long n_value; -}; - - -/* Legal values of n_type - */ -#define N_UNDF 0 /* Undefined symbol */ -#define N_ABS 2 /* Absolute symbol */ -#define N_TEXT 4 /* Text symbol */ -#define N_DATA 6 /* Data symbol */ -#define N_BSS 8 /* BSS symbol */ -#define N_FN 31 /* Filename symbol */ - -#define N_EXT 1 /* External symbol (OR'd in with one of above) */ -#define N_TYPE 036 /* Mask for all the type bits */ -#define N_STAB 0340 /* Mask for all bits used for SDB entries */ - -/* MEANING OF 'n_other' - * - * If non-zero, the 'n_other' fields indicates either a leaf procedure or - * a system procedure, as follows: - * - * 1 <= n_other <= 32 : - * The symbol is the entry point to a system procedure. - * 'n_value' is the address of the entry, as for any other - * procedure. The system procedure number (which can be used in - * a 'calls' instruction) is (n_other-1). These entries come from - * '.sysproc' directives. - * - * n_other == N_CALLNAME - * the symbol is the 'call' entry point to a leaf procedure. - * The *next* symbol in the symbol table must be the corresponding - * 'bal' entry point to the procedure (see following). These - * entries come from '.leafproc' directives in which two different - * symbols are specified (the first one is represented here). - * - * - * n_other == N_BALNAME - * the symbol is the 'bal' entry point to a leaf procedure. - * These entries result from '.leafproc' directives in which only - * one symbol is specified, or in which the same symbol is - * specified twice. - * - * Note that an N_CALLNAME entry *must* have a corresponding N_BALNAME entry, - * but not every N_BALNAME entry must have an N_CALLNAME entry. - */ -#define N_CALLNAME ((char)-1) -#define N_BALNAME ((char)-2) -#define IS_CALLNAME(x) (N_CALLNAME == (x)) -#define IS_BALNAME(x) (N_BALNAME == (x)) -#define IS_OTHER(x) ((x)>0 && (x) <=32) - -#define b_out_relocation_info relocation_info -struct relocation_info { - int r_address; /* File address of item to be relocated */ - unsigned -#define r_index r_symbolnum - r_symbolnum:24,/* Index of symbol on which relocation is based, - * if r_extern is set. Otherwise set to - * either N_TEXT, N_DATA, or N_BSS to - * indicate section on which relocation is - * based. - */ - r_pcrel:1, /* 1 => relocate PC-relative; else absolute - * On i960, pc-relative implies 24-bit - * address, absolute implies 32-bit. - */ - r_length:2, /* Number of bytes to relocate: - * 0 => 1 byte - * 1 => 2 bytes -- used for 13 bit pcrel - * 2 => 4 bytes - */ - r_extern:1, - r_bsr:1, /* Something for the GNU NS32K assembler */ - r_disp:1, /* Something for the GNU NS32K assembler */ - r_callj:1, /* 1 if relocation target is an i960 'callj' */ - r_relaxable:1; /* 1 if enough info is left to relax - the data */ -}; diff --git a/contrib/gdb/include/coff/ChangeLog b/contrib/gdb/include/coff/ChangeLog deleted file mode 100644 index 06c7f80f468aa..0000000000000 --- a/contrib/gdb/include/coff/ChangeLog +++ /dev/null @@ -1,622 +0,0 @@ -Thu Mar 14 15:22:44 1996 Jeffrey A Law (law@cygnus.com) - - * internal.h (R_MEM_INDIRECT): New reloc for the h8300. - -Fri Feb 9 10:44:11 1996 Ian Lance Taylor <ian@cygnus.com> - - * aux-coff.h: Rename from aux.h, to avoid problems on hapless DOS - systems which think that aux is a com port. - -Mon Feb 5 18:35:00 1996 Ian Lance Taylor <ian@cygnus.com> - - * i960.h (F_I960HX): Define. - -Wed Jan 31 13:11:54 1996 Richard Henderson <rth@tamu.edu> - - * aux.h: New file. - * internal.h, m68k.h: Protect against multiple inclusion. - -Wed Nov 22 13:48:39 1995 Ian Lance Taylor <ian@cygnus.com> - - * ecoff.h (_RCONST, STYP_RCONST, RELOC_SECTION_RCONST): Define. - (NUM_RELOC_SECTIONS): Update. - * symconst.h (scRConst): Define. - -Tue Nov 14 18:54:29 1995 Ian Lance Taylor <ian@cygnus.com> - - * internal.h (C_NT_WEAK): Define. - -Thu Nov 9 14:08:30 1995 Ian Lance Taylor <ian@cygnus.com> - - * rs6000.h (STYP_OVRFLO): Define. - -Tue Nov 7 14:38:45 1995 Kim Knuttila <krk@cygnus.com> - - * coff/powerpc.h (IMAGE_NT_OPTIONAL_HDR_MAGIC): Added define. - * coff/pe.h: Added defines for file level flags - -Mon Nov 6 17:28:01 1995 Harry Dolan <dolan@ssd.intel.com> - - * i860.h: New file, based on i386.h. - -Wed Nov 1 15:25:18 1995 Manfred Hollstein KS/EF4A 60/1F/110 #40283 <manfred@lts.sel.alcatel.de> - - * m68k.h (PAGEMAGICEXECSWAPPED): Define. - (PAGEMAGICPEXECSWAPPED): Define. - (PAGEMAGICPEXECTSHLIB): Define. - (PAGEMAGICPEXECPAGED): Define. - (_COMMENT): DEFINE. - * m88k.h (_COMMENT): Define. - -Wed Oct 18 18:36:19 1995 Geoffrey Noer <noer@cygnus.com> - - * sym.h: #if 0'd out runtime_pdr struct because it chokes - Visual C++ and there aren't any references to it elsewhere in gdb. - -Mon Oct 16 11:12:24 1995 Ian Lance Taylor <ian@cygnus.com> - - * rs6000.h (SMALL_AOUTSZ): Define. - - * internal.h (XMC_TD): Define. - -Tue Oct 10 18:41:03 1995 Ian Lance Taylor <ian@cygnus.com> - - * internal.h (struct internal_aouthdr): Add o_cputype field. - * rs6000.h (AOUTHDR): Rename o_resv1 to o_cputype. - -Mon Oct 9 14:45:46 1995 Ian Lance Taylor <ian@cygnus.com> - - * rs6000.h (AOUTHDR): Add o_maxdata field. Add comments. - (_PAD, _LOADER): Define. - (STYP_LOADER): Define. - * internal.h (struct internal_aouthdr): Add o_maxdata field. - -Thu Oct 5 10:02:57 1995 Ian Lance Taylor <ian@cygnus.com> - - * ecoff.h: Define section name macros and STYP macros for various - Alpha sections: .got, .hash, .dynsym, .dynstr, .rel.dyn, .conflic, - .comment, .liblist, .dynamic. - -Wed Oct 4 10:56:35 1995 Kim Knuttila <krk@cygnus.com> - - * pe.h: Moved DOSMAGIC and NT_SIGNATURE defines here - * powerpc.h: removed DOSMAGIC, NT_SIGNATURE, and DEFAULT_* defines - Also removed other unused defines (various MAGIC ones) - * i386.h: removed DOSMAGIC, NT_SIGNATURE, and DEFAULT_* defines - * arm.h: removed DOSMAGIC, NT_SIGNATURE, and DEFAULT_* defines - * apollo.h: removed unused DEFAULT_* defines - * alpha.h: removed unused DEFAULT_* defines - * h8500.h: removed unused DEFAULT_* defines - * h8300.h: removed unused DEFAULT_* defines - * i960.h: removed unused DEFAULT_* defines - * m88k.h: removed unused DEFAULT_* defines - * we32k.h: removed unused DEFAULT_* defines - * rs6000.h: removed unused DEFAULT_* defines - * mips.h: removed unused DEFAULT_* defines - * m68k.h: removed unused DEFAULT_* defines - * z8k.h: removed unused DEFAULT_* defines - * w65.h: removed unused DEFAULT_* defines - * sparc.h: removed unused DEFAULT_* defines - * sh.h: removed unused DEFAULT_* defines - -Fri Sep 29 08:40:08 1995 Kim Knuttila <krk@cygnus.com> - - * powerpc.h: Reformatted to GNU coding conventions. - -Wed Sep 27 06:50:50 1995 Kim Knuttila <krk@nellie> - - * pe.h: added defines for more section characteristics - * powerpc.h (new file): base coff definitions for ppc PE - -Tue Sep 12 12:08:20 1995 Ian Lance Taylor <ian@cygnus.com> - - * internal.h (struct internal_syment): Change n_numaux field from - char to unsigned char. - -Fri Sep 1 15:39:36 1995 Kazumoto Kojima <kkojima@info.kanagawa-u.ac.jp> - - * mips.h (struct rpdr_ext): Define. - -Thu Aug 31 16:51:50 1995 steve chamberlain <sac@slash.cygnus.com> - - * internal.h (internal_aouthdr, internal_filehdr): - don't indirect the pe stuff. - -Tue Aug 29 14:16:07 1995 steve chamberlain <sac@slash.cygnus.com> - - * i386.h (NT_DEF_RESERVE, NT_DEF_COMMIT): Make the same - as 'the other' compiler. - * internal.h (NT_IMAGE_BASE): Deleted. - (NT_EXE_IMAGE_BASE, NT_DLL_IMAGE_BASE): New. - (PE_DEF_SECTION_ALIGNMENT, PE_DEF_FILE_ALIGNMENT): New. - (R_IMAGEBASE): New. - -Mon Aug 21 18:12:19 1995 steve chamberlain <sac@slash.cygnus.com> - - * internal.h: (internal_filehdr): Moved PE stuff into - internal_extra_pe_filehdr. - (internal_aouthdr): Moved PE stuff into - interanl_extra_pe_aouthdr. - -Mon Jul 24 14:05:39 1995 Ian Lance Taylor <ian@cygnus.com> - - * internal.h: Move R_SH_* relocs from here... - * sh.h: ...to here. - (R_SH_SWITCH16, R_SH_SWITCH32): Define. - (R_SH_USES, R_SH_COUNT, R_SH_ALIGN): Define. - -Thu Jun 29 00:04:25 1995 Steve Chamberlain <sac@slash.cygnus.com> - - * internal.h (NT_DEF_RESERVE, NT_DEF_COMMIT): Increase a lot. - -Tue May 16 15:08:20 1995 Ken Raeburn <raeburn@cujo.cygnus.com> - - * internal.h (NT_subsystem, NT_stack_heap): Delete - -Tue May 16 15:08:20 1995 Ken Raeburn <raeburn@cujo.cygnus.com> - - * internal.h (NT_subsystem, NT_stack_heap): Now extern. - -Tue Feb 14 17:59:37 1995 Ian Lance Taylor <ian@cygnus.com> - - * ecoff.h (struct ecoff_fdrtab_entry): Define. - (struct ecoff_find_line): Define. - -Sat Feb 4 14:38:03 1995 David Mosberger-Tang <davidm@piston.cs.arizona.edu> - - * sym.h (struct pdr): field "prof" added. - - * alpha.h (PDR_BITS1_PROF_*): added, macros for PDR_BITS*_RESERVED_* - updated accordingly. - -Sun Jan 15 18:38:33 1995 Steve Chamberlain <sac@splat> - - * w65.h: New file. - -Wed Nov 23 22:43:38 1994 Steve Chamberlain (sac@jonny.cygnus.com) - - * sh.h (SH_ARCH_MAGIC_BIG, SH_ARCH_MAGIC_LITTLE): New. - (SHBADMAG): Changed to suit. - -Tue Jul 26 17:46:08 1994 Ken Raeburn (raeburn@cujo.cygnus.com) - - * i960.h (F_I960JX): New macro. - -Wed Jul 6 00:48:57 1994 Peter Schauer (pes@regent.e-technik.tu-muenchen.de) - - * alpha.h: Add definitions for alpha file header flags, encoding - the object type of the file. - -Mon Jun 20 13:47:01 1994 Ian Lance Taylor (ian@sanguine.cygnus.com) - - * ecoff.h (ecoff_swap_tir_in): Remove declaration. - (ecoff_swap_tir_out): Likewise. - (ecoff_swap_rndx_in, ecoff_swap_rndx_out): Likewise. - (struct ecoff_debug_swap): Add new fields: swap_tir_in, - swap_rndx_in, swap_tir_out, swap_rndx_out, read_debug_info. - -Sun Jun 12 03:51:52 1994 Peter Schauer (pes@regent.e-technik.tu-muenchen.de) - - * symconst.h: Pick up SGI define for stIndirect. - -Fri Apr 22 13:05:28 1994 Ian Lance Taylor (ian@tweedledumb.cygnus.com) - - * ecoff.h (REGINFO): Don't define. - (struct ecoff_reginfo): Don't define. - - * sh.h (SH_ARCH_MAGIC): Rename from SHMAGIC. SHMAGIC is used by - several targets to mean a shared library. - (SHBADMAG): Corresponding change. - -Thu Apr 14 13:00:53 1994 Ian Lance Taylor (ian@tweedledumb.cygnus.com) - - * mips.h (RELOC_BITS3_TYPE_BIG): Changed from 0x1e to 0x3e. - (RELOC_BITS3_TYPEHI_LITTLE): Define. - (RELOC_BITS3_TYPEHI_SH_LITTLE): Define. - (MIPS_R_PCREL16): Change value from 8 to 12 to match Irix 4. - (MIPS_R_RELHI): Define. - (MIPS_R_RELLO): Define. - (MIPS_R_SWITCH): Change value from 9 to 22. - -Thu Apr 7 14:19:35 1994 Ian Lance Taylor (ian@tweedledumb.cygnus.com) - - * mips.h (MIPS_R_SWITCH): Define. - -Thu Mar 31 19:28:33 1994 Ken Raeburn (raeburn@cujo.cygnus.com) - - * internal.h (internal_aouthdr): Added comments for Apollo fields. - -Thu Mar 31 16:28:02 1994 Ian Lance Taylor (ian@tweedledumb.cygnus.com) - - * ecoff.h (STYP_ECOFF_LIB): Define as used on Irix 4. - -Fri Mar 25 17:16:55 1994 Ian Lance Taylor (ian@tweedledumb.cygnus.com) - - * ecoff.h (struct ecoff_debug_info): Add adjust field. - (struct ecoff_value_adjust): Define. - -Tue Mar 22 13:22:47 1994 Ian Lance Taylor (ian@tweedledumb.cygnus.com) - - * mips.h (MIPS_R_PCREL16): Define. - -Sat Feb 26 10:26:38 1994 Ian Lance Taylor (ian@cygnus.com) - - * ecoff.h: Add casts to avoid warnings from SVR4 cc. - -Mon Feb 21 09:48:46 1994 Ian Lance Taylor (ian@lisa.cygnus.com) - - * sym.h (struct runtime_pdr): Make field adr bfd_vma, not unsigned - long. - (SYMR): Make field value bfd_vma, not long. - -Fri Feb 4 23:35:53 1994 Ian Lance Taylor (ian@tweedledumb.cygnus.com) - - * rs6000.h (STYP_DEBUG): Define. - -Wed Feb 2 14:31:37 1994 Ian Lance Taylor (ian@tweedledumb.cygnus.com) - - * internal.h (union internal_auxent): Change x_csect.x_scnlen into - a union of a long and a pointer to a symbol. XCOFF sometimes uses - this field as a symbol index. - -Mon Jan 10 23:54:25 1994 Ian Lance Taylor (ian@tweedledumb.cygnus.com) - - * ecoff.h (ecoff_debug_info): Remove fields line_end, - external_dnr_end, external_pdr_end, external_sym_end, - external_opt_end, external_aux_end, ss_end, external_fdr_end. - Replace ifdbase with ifdmap. - -Wed Jan 5 17:05:36 1994 Ken Raeburn (raeburn@deneb.cygnus.com) - - * ecoff.h (STYP_EXTENDESC, STYP_COMMENT, STYP_XDATA, STYP_PDATA): - Define. - -Wed Jan 5 16:58:24 1994 Ian Lance Taylor (ian@tweedledumb.cygnus.com) - - * ecoff.h (NUM_RELOC_SECTIONS): Define. - -Tue Dec 21 09:24:56 1993 Ken Raeburn (raeburn@rtl.cygnus.com) - - * sparc.h (struct external_reloc): Rename field r_addend to - r_offset. - -Sat Dec 11 16:12:32 1993 Steve Chamberlain (sac@thepub.cygnus.com) - - * internal.h (R_DISP7, R_SH_IMM16): New reloc types. - -Tue Nov 23 14:23:19 1993 Ian Lance Taylor (ian@tweedledumb.cygnus.com) - - * ecoff.h (struct ecoff_debug_swap): Added *_end fields for all - the symbolic information pointers. - - * sym.h: Named the EXTR structure ecoff_extr. - -Fri Nov 19 08:21:18 1993 Ken Raeburn (raeburn@rover.cygnus.com) - - * sparc.h (RELSZ): Use correct size. - -Wed Nov 17 17:18:16 1993 Ian Lance Taylor (ian@tweedledumb.cygnus.com) - - * mips.h (struct ecoff_debug_info): Define. - -Tue Nov 2 17:56:57 1993 Ian Lance Taylor (ian@tweedledumb.cygnus.com) - - * ecoff.h (struct ecoff_debug_swap): Define. - -Thu Oct 28 17:07:50 1993 Stan Shebs (shebs@rtl.cygnus.com) - - * i386.h (I386LYNXMAGIC): Rename to LYNXCOFFMAGIC. - * m68k.h (LYNXCOFFMAGIC): Define. - * sparc.h: New file. - -Tue Oct 19 15:34:50 1993 Ian Lance Taylor (ian@tweedledumb.cygnus.com) - - * alpha.h (external_aouthdr): Split four byte padding field into - two byte bldrev field and two byte padding field. - - * ecoff.h (_LITA, _PDATA, _XDATA, STYP_LITA): Defined. - -Wed Oct 13 15:52:34 1993 Ken Raeburn (raeburn@cygnus.com) - - Sun Oct 10 17:27:10 1993 Troy Rollo (troy@cbme.unsw.edu.au) - - * coff/internal.h: Added o_sri, o_inlib and o_vid for Apollos - as well as R_DIR16. - - * coff/apollo.h: New file - -Mon Oct 11 17:16:48 1993 Ian Lance Taylor (ian@tweedledumb.cygnus.com) - - * ecoff.h (REGINFO, struct ecoff_reginfo): Define. - -Tue Oct 5 10:52:53 1993 Jim Kingdon (kingdon@lioth.cygnus.com) - - * rs6000.h: Change non-ASCII characters in comment to octal - escapes. - -Tue Sep 28 03:27:04 1993 Peter Schauer (pes@regent.e-technik.tu-muenchen.de) - - * ecoff.h (_FINI, STYP_ECOFF_FINI): Add to support .fini section. - -Fri Sep 24 11:53:53 1993 Ian Lance Taylor (ian@tweedledumb.cygnus.com) - - * mips.h (BADMAG): Recognize MIPS_MAGIC_LITTLE3 and MIPS_MAGIC_BIG3. - * ecoff.h: Define MIPS_MAGIC_LITTLE3 and MIPS_MAGIC_BIG3. - -Thu Sep 23 21:07:14 1993 Jim Kingdon (kingdon@lioth.cygnus.com) - - * mips.h (BADMAG): Recognize MIPS_MAGIC_LITTLE2 and MIPS_MAGIC_BIG2. - * ecoff.h: Define MIPS_MAGIC_LITTLE2 and MIPS_MAGIC_BIG2. - -Thu Sep 16 20:27:21 1993 Jim Kingdon (kingdon@cirdan.cygnus.com) - - * sym.h, symconst.h: Add comment stating these files are not part - of GDB, GAS, etc. In 1991, when we asked rms whether we could - include these files in GDB (although they are copyrighted by - someone besides the FSF), he said it was OK if they were not - considered part of GDB. - -Fri Sep 10 17:40:35 1993 Ian Lance Taylor (ian@tweedledumb.cygnus.com) - - * ecoff.h (AUX_PUT_ANY): Cast val argument to bfd_vma. - - * alpha.c (external_aouthdr): Need four bytes of padding between - vstamp and tsize. - -Tue Sep 7 14:20:43 1993 Ian Lance Taylor (ian@tweedledumb.cygnus.com) - - * ecoff.h (AUX_GET_ANY, AUX_PUT_ANY): Changed to reflect further - change in bfd swapping routine names. - -Tue Sep 7 10:15:17 1993 Jim Kingdon (kingdon@lioth.cygnus.com) - - * ecoff.h (AUX_GET_ANY): Change name of _do_getb32 to reflect bfd - changes. - -Fri Aug 13 14:30:32 1993 Ian Lance Taylor (ian@cygnus.com) - - * ecoff.h (RELOC_SECTION_NONE): Define. - -Thu Aug 12 11:24:42 1993 Ian Lance Taylor (ian@cygnus.com) - - * alpha.h (struct external_reloc): Add r_symndx field. - (RELSZ): Correct. - (RELOC_BITS*): Correct. - (ALPHA_R_*): Define. - * ecoff.h (RELOC_SECTION_{XDATA,PDATA,FINI,LITA,ABS}): Define. - (r_extern): Undefine. - * internal.h (struct internal_reloc): Make r_vaddr bfd_vma rather - than long. Add r_extern field. - - * alpha.h (PDR_BITS*): Define. - * sym.h (PDR): Give correct names to new fields. - - * ecoff.h: Moved MIPS reloc definitions from here... - * mips.h: to here. - -Tue Aug 3 11:17:53 1993 Ian Lance Taylor (ian@cygnus.com) - - * alpha.h: Corrected external symbolic debugging structures to - match actual usage. - * internal.h (internal_filehdr, internal_aouthdr, - internal_scnhdr): Changed type of some fields to bfd_vma so they - can hold 64 bits. - * sym.h (HDRR, FDR, PDR, EXTR): Likewise. - (PDR): Added new fields found on Alpha. - * symconst.h (magicSym2): Define; new value found on Alpha. - - * ecoff.h: New file. - * alpha.h, mips.h: Moved common information into ecoff.h. Moved - external structure definitions in from ecoff-ext.h. - * ecoff-ext.h: Removed; information now in alpha.h and mips.h. - -Sun Jul 18 21:43:59 1993 Jim Kingdon (kingdon@rtl.cygnus.com) - - * i386.h: Recognize I386PTXMAGIC. - -Fri Jul 16 09:54:35 1993 Ian Lance Taylor (ian@cygnus.com) - - * mips.h (MIPS_AOUT_{OZ}MAGIC): Renamed from {OZ}MAGIC. - -Thu Jul 15 12:23:55 1993 Ian Lance Taylor (ian@tweedledumb.cygnus.com) - - * m88k.h (union external_auxent): Move x_fcn back inside x_fcnary. - ({GET,PUT}_FCN_{LNNOPTR,ENDNDX}): Adjust accordingly. - -Sun Jul 11 18:00:18 1993 Jim Kingdon (kingdon@lioth.cygnus.com) - - * m68k.h: Define MC68KBCSMAGIC. - -Thu Jun 10 11:46:28 1993 Ian Lance Taylor (ian@cygnus.com) - - * mips.h (_INIT, STYP_MIPS_INIT): Define (used on Irix4). - (STYP_OTHER_LOAD): Define as STYP_MIPS_INIT. - -Wed Jun 9 15:09:09 1993 Ian Lance Taylor (ian@cygnus.com) - - * mips.h (OMAGIC): Define. - -Mon Apr 26 18:04:47 1993 Steve Chamberlain (sac@thepub.cygnus.com) - - * internal.h, sh.h: Support for SH. - -Sat Apr 24 21:34:59 1993 Jim Kingdon (kingdon@cygnus.com) - - * a29k.h: Define _LIT. - -Fri Apr 23 18:41:23 1993 Steve Chamberlain (sac@thepub.cygnus.com) - - * alpha.h: New file. - -Thu Apr 8 12:36:34 1993 Ian Lance Taylor (ian@cygnus.com) - - * internal.h (C_SHADOW, C_VERSION): Copied in from m88k.h. - * m88k.h, i386.h, we32k.h: Don't define all the storage classes; - they're already in internal.h. - -Wed Apr 7 11:51:24 1993 Jim Kingdon (kingdon@cygnus.com) - - * internal.h: Change n_sclass to unsigned char. - Change C_EFCN to 0xff, change RS/6000 dbx symbols - to no longer be signed. - -Fri Mar 19 14:52:56 1993 Steve Chamberlain (sac@thepub.cygnus.com) - - * internal.h: Add H8/500 reloc types. - -Wed Mar 17 09:46:03 1993 Ian Lance Taylor (ian@cygnus.com) - - * ecoff-ext.h (AUX_PUT_ANY): Don't use void values in branches of - conditional expression. - -Thu Mar 4 14:12:06 1993 Ian Lance Taylor (ian@cygnus.com) - - * ecoff-ext.h (AUX_GET_*): Rewrote to use new macro AUX_GET_ANY. - (AUX_PUT_*): New macros corresponding to the AUX_GET macros. - (ecoff_swap_tir_out): Added prototype. - - * mips.h (N_BTMASK, N_TMASK, N_BTSHFT, N_TSHIFT): Define; these - are needed to interpret gcc debugging output. - -Tue Feb 9 07:43:27 1993 Ian Lance Taylor (ian@cygnus.com) - - * we32k.h (BTYPE, ISPTR, ISFCN, ISARY, DECREF): Removed - more definitions duplicated in internal.h. - -Wed Feb 3 09:18:24 1993 Ian Lance Taylor (ian@cygnus.com) - - * mips.h (RELOC_BITS3_TYPE_*): Correct for big endian machines. - -Mon Jan 25 11:35:51 1993 Ian Lance Taylor (ian@cygnus.com) - - * internal.h (internal_aouthdr): Added additional fields used only - by MIPS ECOFF. - -Thu Jan 21 10:28:38 1993 Ian Lance Taylor (ian@cygnus.com) - - * mips.h (AOUTHDR): Added additional fields used by ECOFF. - -Tue Jan 19 12:21:19 1993 Ian Lance Taylor (ian@tweedledumb.cygnus.com) - - * i386.h, we32k.h (N_*, T_*, DT_*): Removed still more definitions - duplicated in internal.h. - - * mips.h (RELOC_SECTION_*, ECOFF_R_*): Defined constants for ECOFF - relocs. - -Fri Jan 15 18:17:00 1993 Ian Lance Taylor (ian@tweedledumb.cygnus.com) - - * ecoff-ext.h: Added prototypes for new ECOFF swapping functions. - (opt_ext): New structure. - * mips.h (ZMAGIC): Defined to be 0413. - (_LIB): Defined to be ".lib" - (external_reloc): MIPS ECOFF relocs are only 8 bytes. Added - macros to aid in swapping. - -Fri Jan 8 16:19:26 1993 Ian Lance Taylor (ian@tweedledumb.cygnus.com) - - * ecoff-ext.h: Added prototypes for ECOFF swapping functions. - * internal.h (internal_scnhdr): Always provide s_align field, not - just on i960. - (internal_reloc): Always provide r_size field, not just on - RS/6000. - * mips.h (_RDATA, _SDATA, _SBSS, _LIT4, _LIT8, STYP_RDATA, - STYP_SDATA, STYP_SBSS, STYP_LIT4, STYP_LIT8): Defined. - (CODE_MASK, MIPS_IS_STAB, MIPS_MARK_STAB, MIPS_UNMARK_STAB, - STABS_SYMBOL): Moved in from gdb/mipsread.c. - -Wed Jan 6 14:01:46 1993 Ian Lance Taylor (ian@tweedledumb.cygnus.com) - - * i386.h, we32k.h: removed STYP_* defines, since they duplicated - those in internal.h. - -Tue Dec 29 15:40:07 1992 Ian Lance Taylor (ian@cygnus.com) - - * i386.h: define I386AIXMAGIC for Danbury AIX PS/2 compiler. - -Sat Dec 12 16:07:57 1992 Ian Lance Taylor (ian@cygnus.com) - - * i386.h: don't define BTYPE, ISPTR, ISFCN, ISARY, DECREF: they - are defined in internal.h. - -Thu Nov 12 09:52:01 1992 Steve Chamberlain (sac@thepub.cygnus.com) - - * internal.h: (internal_reloc): r_offset is now a long. - * z8k.h: slight comment enhancement - -Wed Sep 30 07:46:08 1992 Steve Chamberlain (sac@thepub.cygnus.com) - - * internal.h: changed z8k reloc types - -Fri Aug 28 10:16:31 1992 Brendan Kehoe (brendan@cygnus.com) - - * we32k.h: new file - -Thu Aug 27 13:00:01 1992 Brendan Kehoe (brendan@cygnus.com) - - * symconst.h: comment out cruft at the end of #endif - -Tue Aug 25 15:06:49 1992 Steve Chamberlain (sac@thepub.cygnus.com) - - * internal.h: added #define for STYP_LIT, removed from a29k and - h8300. - - * z8k.h: added z8000 support - -Thu Jul 16 16:32:00 1992 Steve Chamberlain (sac@thepub.cygnus.com) - - * internal.h: added R_RELLONG_NEG reloc type - -Fri Jun 12 20:11:04 1992 John Gilmore (gnu at cygnus.com) - - * symconst.h: Fix unterminated comment. - -Wed Jun 10 07:57:49 1992 Steve Chamberlain (sac@thepub.cygnus.com) - - * i386.h: a.out magic numbers from - mohring@informatik.tu-muenchen.de - -Mon Jun 8 20:13:33 1992 John Gilmore (gnu at cygnus.com) - - * ecoff-ext.h, mips.h: Use unsigned chars everywhere. - (Suggested by Antti Miettinen.) - -Tue Apr 14 15:18:44 1992 John Gilmore (gnu at cygnus.com) - - * sym.h: Add comments. - * symconst.h: Merge with Fred's changes. - -Tue Apr 14 14:30:05 1992 Fred Fish (fnf@cygnus.com) - - * symconst.h: Pick up SGI defines for stStruct, stUnion, stEnum, - langCplusplus, and langCplusplusV2. - -Thu Apr 2 19:47:43 1992 John Gilmore (gnu at cygnus.com) - - * sym.h, symconst.h: MIPS has provided redistributable versions - of these files. Thanks! - * ecoff-ext.h: Add weakext bit to match new sym.h. - -Fri Mar 6 00:10:46 1992 John Gilmore (gnu at cygnus.com) - - * ecoff-ext.h: Add relative file descriptors. - -Thu Feb 27 11:53:04 1992 John Gilmore (gnu at cygnus.com) - - * ecoff-ext.h: New file for external (in-file) form of ecoff - symbol structures. - -Thu Feb 6 11:33:32 1992 Steve Chamberlain (sac at rtl.cygnus.com) - - * h8300.h: made the external_lineno l_lnno field 4 bytes wide. - andded GET/PUT_LINENO_LNNO macros - -Sat Nov 30 20:38:35 1991 Steve Chamberlain (sac at rtl.cygnus.com) - - * ChangeLog, a29k.h, h8300.h, i386.h, i960.h, internal.h, m68k.h, - m88k.h, mips.h, rs6000.h: move from above coff-<foo>.h - - -Local Variables: -version-control: never -End: diff --git a/contrib/gdb/include/coff/a29k.h b/contrib/gdb/include/coff/a29k.h deleted file mode 100644 index 13b35f251afde..0000000000000 --- a/contrib/gdb/include/coff/a29k.h +++ /dev/null @@ -1,305 +0,0 @@ -/* COFF spec for AMD 290*0 - Contributed by David Wood @ New York University. - */ - -#ifndef AMD -# define AMD -#endif - -/****************************************************************/ - -/* -** File Header and related definitions -*/ - -struct external_filehdr -{ - char f_magic[2]; /* magic number */ - char f_nscns[2]; /* number of sections */ - char f_timdat[4]; /* time & date stamp */ - char f_symptr[4]; /* file pointer to symtab */ - char f_nsyms[4]; /* number of symtab entries */ - char f_opthdr[2]; /* sizeof(optional hdr) */ - char f_flags[2]; /* flags */ -}; - -#define FILHDR struct external_filehdr -#define FILHSZ sizeof (FILHDR) - -/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/ - -/* -** Magic numbers for Am29000 -** (AT&T will assign the "real" magic number) -*/ - -#define SIPFBOMAGIC 0572 /* Am29000 (Byte 0 is MSB) */ -#define SIPRBOMAGIC 0573 /* Am29000 (Byte 0 is LSB) */ - - -#define A29K_MAGIC_BIG SIPFBOMAGIC -#define A29K_MAGIC_LITTLE SIPRBOMAGIC -#define A29KBADMAG(x) (((x).f_magic!=A29K_MAGIC_BIG) && \ - ((x).f_magic!=A29K_MAGIC_LITTLE)) - -#define OMAGIC A29K_MAGIC_BIG -/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/ - -/* -** File header flags currently known to us. -** -** Am29000 will use the F_AR32WR and F_AR32W flags to indicate -** the byte ordering in the file. -*/ - -/*--------------------------------------------------------------*/ - -/* -** Optional (a.out) header -*/ - -typedef struct external_aouthdr -{ - char magic[2]; /* type of file */ - char vstamp[2]; /* version stamp */ - char tsize[4]; /* text size in bytes, padded to FW bdry*/ - char dsize[4]; /* initialized data " " */ - char bsize[4]; /* uninitialized data " " */ - char entry[4]; /* entry pt. */ - char text_start[4]; /* base of text used for this file */ - char data_start[4]; /* base of data used for this file */ -} AOUTHDR; - -#define AOUTSZ (sizeof(AOUTHDR)) -#define AOUTHDRSZ (sizeof(AOUTHDR)) - -/* aouthdr magic numbers */ -#define NMAGIC 0410 /* separate i/d executable */ -#define SHMAGIC 0406 /* NYU/Ultra3 shared data executable - (writable text) */ - -#define _ETEXT "_etext" - -/*--------------------------------------------------------------*/ - -/* -** Section header and related definitions -*/ - -struct external_scnhdr -{ - char s_name[8]; /* section name */ - char s_paddr[4]; /* physical address, aliased s_nlib */ - char s_vaddr[4]; /* virtual address */ - char s_size[4]; /* section size */ - char s_scnptr[4]; /* file ptr to raw data for section */ - char s_relptr[4]; /* file ptr to relocation */ - char s_lnnoptr[4]; /* file ptr to line numbers */ - char s_nreloc[2]; /* number of relocation entries */ - char s_nlnno[2]; /* number of line number entries*/ - char s_flags[4]; /* flags */ -}; - -#define SCNHDR struct external_scnhdr -#define SCNHSZ sizeof (SCNHDR) - -/* - * names of "special" sections - */ -#define _TEXT ".text" -#define _DATA ".data" -#define _BSS ".bss" -#define _LIT ".lit" - -/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/ - -/* -** Section types - with additional section type for global -** registers which will be relocatable for the Am29000. -** -** In instances where it is necessary for a linker to produce an -** output file which contains text or data not based at virtual -** address 0, e.g. for a ROM, then the linker should accept -** address base information as command input and use PAD sections -** to skip over unused addresses. -*/ - -#define STYP_BSSREG 0x1200 /* Global register area (like STYP_INFO) */ -#define STYP_ENVIR 0x2200 /* Environment (like STYP_INFO) */ -#define STYP_ABS 0x4000 /* Absolute (allocated, not reloc, loaded) */ - -/*--------------------------------------------------------------*/ - -/* -** Relocation information declaration and related definitions -*/ - -struct external_reloc { - char r_vaddr[4]; /* (virtual) address of reference */ - char r_symndx[4]; /* index into symbol table */ - char r_type[2]; /* relocation type */ -}; - -#define RELOC struct external_reloc -#define RELSZ 10 /* sizeof (RELOC) */ - -/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/ - -/* -** Relocation types for the Am29000 -*/ - -#define R_ABS 0 /* reference is absolute */ - -#define R_IREL 030 /* instruction relative (jmp/call) */ -#define R_IABS 031 /* instruction absolute (jmp/call) */ -#define R_ILOHALF 032 /* instruction low half (const) */ -#define R_IHIHALF 033 /* instruction high half (consth) part 1 */ -#define R_IHCONST 034 /* instruction high half (consth) part 2 */ - /* constant offset of R_IHIHALF relocation */ -#define R_BYTE 035 /* relocatable byte value */ -#define R_HWORD 036 /* relocatable halfword value */ -#define R_WORD 037 /* relocatable word value */ - -#define R_IGLBLRC 040 /* instruction global register RC */ -#define R_IGLBLRA 041 /* instruction global register RA */ -#define R_IGLBLRB 042 /* instruction global register RB */ - -/* -NOTE: -All the "I" forms refer to 29000 instruction formats. The linker is -expected to know how the numeric information is split and/or aligned -within the instruction word(s). R_BYTE works for instructions, too. - -If the parameter to a CONSTH instruction is a relocatable type, two -relocation records are written. The first has an r_type of R_IHIHALF -(33 octal) and a normal r_vaddr and r_symndx. The second relocation -record has an r_type of R_IHCONST (34 octal), a normal r_vaddr (which -is redundant), and an r_symndx containing the 32-bit constant offset -to the relocation instead of the actual symbol table index. This -second record is always written, even if the constant offset is zero. -The constant fields of the instruction are set to zero. -*/ - -/*--------------------------------------------------------------*/ - -/* -** Line number entry declaration and related definitions -*/ - -struct external_lineno -{ - union { - char l_symndx[4]; /* function name symbol index, iff l_lnno == 0*/ - char l_paddr[4]; /* (physical) address of line number */ - } l_addr; - char l_lnno[2]; /* line number */ -}; - -#define LINENO struct external_lineno -#define LINESZ 6 /* sizeof (LINENO) */ - -/*--------------------------------------------------------------*/ - -/* -** Symbol entry declaration and related definitions -*/ - -#define E_SYMNMLEN 8 /* Number of characters in a symbol name */ - -struct external_syment -{ - union { - char e_name[E_SYMNMLEN]; - struct { - char e_zeroes[4]; - char e_offset[4]; - } e; - } e; - char e_value[4]; - char e_scnum[2]; - char e_type[2]; - char e_sclass[1]; - char e_numaux[1]; -}; - -#define SYMENT struct external_syment -#define SYMESZ sizeof(SYMENT) - -/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/ - -/* -** Storage class definitions - new classes for global registers. -*/ - -#define C_GLBLREG 19 /* global register */ -#define C_EXTREG 20 /* external global register */ -#define C_DEFREG 21 /* ext. def. of global register */ - - -/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/ - -/* -** Derived symbol mask/shifts. -*/ - -#define N_BTMASK (0xf) -#define N_BTSHFT (4) -#define N_TMASK (0x30) -#define N_TSHIFT (2) - -/*--------------------------------------------------------------*/ - -/* -** Auxiliary symbol table entry declaration and related -** definitions. -*/ - -#define E_FILNMLEN 14 /* # characters in a file name */ -#define E_DIMNUM 4 /* # array dimensions in auxiliary entry */ - -union external_auxent { - struct { - char x_tagndx[4]; /* str, un, or enum tag indx */ - union { - struct { - char x_lnno[2]; /* declaration line number */ - char x_size[2]; /* str/union/array size */ - } x_lnsz; - char x_fsize[4]; /* size of function */ - } x_misc; - union { - struct { /* if ISFCN, tag, or .bb */ - char x_lnnoptr[4]; /* ptr to fcn line # */ - char x_endndx[4]; /* entry ndx past block end */ - } x_fcn; - struct { /* if ISARY, up to 4 dimen. */ - char x_dimen[E_DIMNUM][2]; - } x_ary; - } x_fcnary; - char x_tvndx[2]; /* tv index */ - } x_sym; - - union { - char x_fname[E_FILNMLEN]; - struct { - char x_zeroes[4]; - char x_offset[4]; - } x_n; - } x_file; - - struct { - char x_scnlen[4]; /* section length */ - char x_nreloc[2]; /* # relocation entries */ - char x_nlinno[2]; /* # line numbers */ - } x_scn; - - struct { - char x_tvfill[4]; /* tv fill value */ - char x_tvlen[2]; /* length of .tv */ - char x_tvran[2][2]; /* tv range */ - } x_tv; /* info about .tv section (in auxent of symbol .tv)) */ -}; - -#define AUXENT union external_auxent -#define AUXESZ 18 diff --git a/contrib/gdb/include/coff/alpha.h b/contrib/gdb/include/coff/alpha.h deleted file mode 100644 index 1f1bfb6ccc7ff..0000000000000 --- a/contrib/gdb/include/coff/alpha.h +++ /dev/null @@ -1,342 +0,0 @@ -/* ECOFF support on Alpha machines. - coff/ecoff.h must be included before this file. */ - -/********************** FILE HEADER **********************/ - -struct external_filehdr { - unsigned char f_magic[2]; /* magic number */ - unsigned char f_nscns[2]; /* number of sections */ - unsigned char f_timdat[4]; /* time & date stamp */ - unsigned char f_symptr[8]; /* file pointer to symtab */ - unsigned char f_nsyms[4]; /* number of symtab entries */ - unsigned char f_opthdr[2]; /* sizeof(optional hdr) */ - unsigned char f_flags[2]; /* flags */ -}; - -/* Magic numbers are defined in coff/ecoff.h. */ -#define ALPHA_ECOFF_BADMAG(x) ((x).f_magic!=ALPHA_MAGIC) - -/* The object type is encoded in the f_flags. */ -#define F_ALPHA_OBJECT_TYPE_MASK 0x3000 -#define F_ALPHA_NO_SHARED 0x1000 -#define F_ALPHA_SHARABLE 0x2000 -#define F_ALPHA_CALL_SHARED 0x3000 - -#define FILHDR struct external_filehdr -#define FILHSZ sizeof(FILHDR) - -/********************** AOUT "OPTIONAL HEADER" **********************/ - - -typedef struct external_aouthdr -{ - unsigned char magic[2]; /* type of file */ - unsigned char vstamp[2]; /* version stamp */ - unsigned char bldrev[2]; /* ?? */ - unsigned char padding[2]; /* pad to quadword boundary */ - unsigned char tsize[8]; /* text size in bytes */ - unsigned char dsize[8]; /* initialized data " " */ - unsigned char bsize[8]; /* uninitialized data " " */ - unsigned char entry[8]; /* entry pt. */ - unsigned char text_start[8]; /* base of text used for this file */ - unsigned char data_start[8]; /* base of data used for this file */ - unsigned char bss_start[8]; /* base of bss used for this file */ - unsigned char gprmask[4]; /* bitmask of general registers used */ - unsigned char fprmask[4]; /* bitmask of floating point registers used */ - unsigned char gp_value[8]; /* value for gp register */ -} AOUTHDR; - -/* compute size of a header */ - -#define AOUTSZ (sizeof(AOUTHDR)) - -/********************** SECTION HEADER **********************/ - -struct external_scnhdr { - unsigned char s_name[8]; /* section name */ - unsigned char s_paddr[8]; /* physical address, aliased s_nlib */ - unsigned char s_vaddr[8]; /* virtual address */ - unsigned char s_size[8]; /* section size */ - unsigned char s_scnptr[8]; /* file ptr to raw data for section */ - unsigned char s_relptr[8]; /* file ptr to relocation */ - unsigned char s_lnnoptr[8]; /* file ptr to line numbers */ - unsigned char s_nreloc[2]; /* number of relocation entries */ - unsigned char s_nlnno[2]; /* number of line number entries*/ - unsigned char s_flags[4]; /* flags */ -}; - -#define SCNHDR struct external_scnhdr -#define SCNHSZ sizeof(SCNHDR) - -/********************** RELOCATION DIRECTIVES **********************/ - -struct external_reloc { - unsigned char r_vaddr[8]; - unsigned char r_symndx[4]; - unsigned char r_bits[4]; -}; - -#define RELOC struct external_reloc -#define RELSZ 16 - -/* Constants to unpack the r_bits field. The Alpha seems to always be - little endian, so I haven't bothered to define big endian variants - of these. */ - -#define RELOC_BITS0_TYPE_LITTLE 0xff -#define RELOC_BITS0_TYPE_SH_LITTLE 0 - -#define RELOC_BITS1_EXTERN_LITTLE 0x01 - -#define RELOC_BITS1_OFFSET_LITTLE 0x7e -#define RELOC_BITS1_OFFSET_SH_LITTLE 1 - -#define RELOC_BITS1_RESERVED_LITTLE 0x80 -#define RELOC_BITS1_RESERVED_SH_LITTLE 7 -#define RELOC_BITS2_RESERVED_LITTLE 0xff -#define RELOC_BITS2_RESERVED_SH_LEFT_LITTLE 1 -#define RELOC_BITS3_RESERVED_LITTLE 0x03 -#define RELOC_BITS3_RESERVED_SH_LEFT_LITTLE 9 - -#define RELOC_BITS3_SIZE_LITTLE 0xfc -#define RELOC_BITS3_SIZE_SH_LITTLE 2 - -/* The r_type field in a reloc is one of the following values. */ -#define ALPHA_R_IGNORE 0 -#define ALPHA_R_REFLONG 1 -#define ALPHA_R_REFQUAD 2 -#define ALPHA_R_GPREL32 3 -#define ALPHA_R_LITERAL 4 -#define ALPHA_R_LITUSE 5 -#define ALPHA_R_GPDISP 6 -#define ALPHA_R_BRADDR 7 -#define ALPHA_R_HINT 8 -#define ALPHA_R_SREL16 9 -#define ALPHA_R_SREL32 10 -#define ALPHA_R_SREL64 11 -#define ALPHA_R_OP_PUSH 12 -#define ALPHA_R_OP_STORE 13 -#define ALPHA_R_OP_PSUB 14 -#define ALPHA_R_OP_PRSHIFT 15 -#define ALPHA_R_GPVALUE 16 - -/********************** SYMBOLIC INFORMATION **********************/ - -/* Written by John Gilmore. */ - -/* ECOFF uses COFF-like section structures, but its own symbol format. - This file defines the symbol format in fields whose size and alignment - will not vary on different host systems. */ - -/* File header as a set of bytes */ - -struct hdr_ext { - unsigned char h_magic[2]; - unsigned char h_vstamp[2]; - unsigned char h_ilineMax[4]; - unsigned char h_idnMax[4]; - unsigned char h_ipdMax[4]; - unsigned char h_isymMax[4]; - unsigned char h_ioptMax[4]; - unsigned char h_iauxMax[4]; - unsigned char h_issMax[4]; - unsigned char h_issExtMax[4]; - unsigned char h_ifdMax[4]; - unsigned char h_crfd[4]; - unsigned char h_iextMax[4]; - unsigned char h_cbLine[8]; - unsigned char h_cbLineOffset[8]; - unsigned char h_cbDnOffset[8]; - unsigned char h_cbPdOffset[8]; - unsigned char h_cbSymOffset[8]; - unsigned char h_cbOptOffset[8]; - unsigned char h_cbAuxOffset[8]; - unsigned char h_cbSsOffset[8]; - unsigned char h_cbSsExtOffset[8]; - unsigned char h_cbFdOffset[8]; - unsigned char h_cbRfdOffset[8]; - unsigned char h_cbExtOffset[8]; -}; - -/* File descriptor external record */ - -struct fdr_ext { - unsigned char f_adr[8]; - unsigned char f_cbLineOffset[8]; - unsigned char f_cbLine[8]; - unsigned char f_cbSs[8]; - unsigned char f_rss[4]; - unsigned char f_issBase[4]; - unsigned char f_isymBase[4]; - unsigned char f_csym[4]; - unsigned char f_ilineBase[4]; - unsigned char f_cline[4]; - unsigned char f_ioptBase[4]; - unsigned char f_copt[4]; - unsigned char f_ipdFirst[4]; - unsigned char f_cpd[4]; - unsigned char f_iauxBase[4]; - unsigned char f_caux[4]; - unsigned char f_rfdBase[4]; - unsigned char f_crfd[4]; - unsigned char f_bits1[1]; - unsigned char f_bits2[3]; - unsigned char f_padding[4]; -}; - -#define FDR_BITS1_LANG_BIG 0xF8 -#define FDR_BITS1_LANG_SH_BIG 3 -#define FDR_BITS1_LANG_LITTLE 0x1F -#define FDR_BITS1_LANG_SH_LITTLE 0 - -#define FDR_BITS1_FMERGE_BIG 0x04 -#define FDR_BITS1_FMERGE_LITTLE 0x20 - -#define FDR_BITS1_FREADIN_BIG 0x02 -#define FDR_BITS1_FREADIN_LITTLE 0x40 - -#define FDR_BITS1_FBIGENDIAN_BIG 0x01 -#define FDR_BITS1_FBIGENDIAN_LITTLE 0x80 - -#define FDR_BITS2_GLEVEL_BIG 0xC0 -#define FDR_BITS2_GLEVEL_SH_BIG 6 -#define FDR_BITS2_GLEVEL_LITTLE 0x03 -#define FDR_BITS2_GLEVEL_SH_LITTLE 0 - -/* We ignore the `reserved' field in bits2. */ - -/* Procedure descriptor external record */ - -struct pdr_ext { - unsigned char p_adr[8]; - unsigned char p_cbLineOffset[8]; - unsigned char p_isym[4]; - unsigned char p_iline[4]; - unsigned char p_regmask[4]; - unsigned char p_regoffset[4]; - unsigned char p_iopt[4]; - unsigned char p_fregmask[4]; - unsigned char p_fregoffset[4]; - unsigned char p_frameoffset[4]; - unsigned char p_lnLow[4]; - unsigned char p_lnHigh[4]; - unsigned char p_gp_prologue[1]; - unsigned char p_bits1[1]; - unsigned char p_bits2[1]; - unsigned char p_localoff[1]; - unsigned char p_framereg[2]; - unsigned char p_pcreg[2]; -}; - -#define PDR_BITS1_GP_USED_BIG 0x80 -#define PDR_BITS1_REG_FRAME_BIG 0x40 -#define PDR_BITS1_PROF_BIG 0x20 -#define PDR_BITS1_RESERVED_BIG 0x1f -#define PDR_BITS1_RESERVED_SH_LEFT_BIG 8 -#define PDR_BITS2_RESERVED_BIG 0xff -#define PDR_BITS2_RESERVED_SH_BIG 0 - -#define PDR_BITS1_GP_USED_LITTLE 0x01 -#define PDR_BITS1_REG_FRAME_LITTLE 0x02 -#define PDR_BITS1_PROF_LITTLE 0x04 -#define PDR_BITS1_RESERVED_LITTLE 0xf8 -#define PDR_BITS1_RESERVED_SH_LITTLE 3 -#define PDR_BITS2_RESERVED_LITTLE 0xff -#define PDR_BITS2_RESERVED_SH_LEFT_LITTLE 5 - -/* Line numbers */ - -struct line_ext { - unsigned char l_line[4]; -}; - -/* Symbol external record */ - -struct sym_ext { - unsigned char s_value[8]; - unsigned char s_iss[4]; - unsigned char s_bits1[1]; - unsigned char s_bits2[1]; - unsigned char s_bits3[1]; - unsigned char s_bits4[1]; -}; - -#define SYM_BITS1_ST_BIG 0xFC -#define SYM_BITS1_ST_SH_BIG 2 -#define SYM_BITS1_ST_LITTLE 0x3F -#define SYM_BITS1_ST_SH_LITTLE 0 - -#define SYM_BITS1_SC_BIG 0x03 -#define SYM_BITS1_SC_SH_LEFT_BIG 3 -#define SYM_BITS1_SC_LITTLE 0xC0 -#define SYM_BITS1_SC_SH_LITTLE 6 - -#define SYM_BITS2_SC_BIG 0xE0 -#define SYM_BITS2_SC_SH_BIG 5 -#define SYM_BITS2_SC_LITTLE 0x07 -#define SYM_BITS2_SC_SH_LEFT_LITTLE 2 - -#define SYM_BITS2_RESERVED_BIG 0x10 -#define SYM_BITS2_RESERVED_LITTLE 0x08 - -#define SYM_BITS2_INDEX_BIG 0x0F -#define SYM_BITS2_INDEX_SH_LEFT_BIG 16 -#define SYM_BITS2_INDEX_LITTLE 0xF0 -#define SYM_BITS2_INDEX_SH_LITTLE 4 - -#define SYM_BITS3_INDEX_SH_LEFT_BIG 8 -#define SYM_BITS3_INDEX_SH_LEFT_LITTLE 4 - -#define SYM_BITS4_INDEX_SH_LEFT_BIG 0 -#define SYM_BITS4_INDEX_SH_LEFT_LITTLE 12 - -/* External symbol external record */ - -struct ext_ext { - struct sym_ext es_asym; - unsigned char es_bits1[1]; - unsigned char es_bits2[3]; - unsigned char es_ifd[4]; -}; - -#define EXT_BITS1_JMPTBL_BIG 0x80 -#define EXT_BITS1_JMPTBL_LITTLE 0x01 - -#define EXT_BITS1_COBOL_MAIN_BIG 0x40 -#define EXT_BITS1_COBOL_MAIN_LITTLE 0x02 - -#define EXT_BITS1_WEAKEXT_BIG 0x20 -#define EXT_BITS1_WEAKEXT_LITTLE 0x04 - -/* Dense numbers external record */ - -struct dnr_ext { - unsigned char d_rfd[4]; - unsigned char d_index[4]; -}; - -/* Relative file descriptor */ - -struct rfd_ext { - unsigned char rfd[4]; -}; - -/* Optimizer symbol external record */ - -struct opt_ext { - unsigned char o_bits1[1]; - unsigned char o_bits2[1]; - unsigned char o_bits3[1]; - unsigned char o_bits4[1]; - struct rndx_ext o_rndx; - unsigned char o_offset[4]; -}; - -#define OPT_BITS2_VALUE_SH_LEFT_BIG 16 -#define OPT_BITS2_VALUE_SH_LEFT_LITTLE 0 - -#define OPT_BITS3_VALUE_SH_LEFT_BIG 8 -#define OPT_BITS3_VALUE_SH_LEFT_LITTLE 8 - -#define OPT_BITS4_VALUE_SH_LEFT_BIG 0 -#define OPT_BITS4_VALUE_SH_LEFT_LITTLE 16 diff --git a/contrib/gdb/include/coff/apollo.h b/contrib/gdb/include/coff/apollo.h deleted file mode 100644 index c481d482e8bff..0000000000000 --- a/contrib/gdb/include/coff/apollo.h +++ /dev/null @@ -1,248 +0,0 @@ -/*** coff information for Apollo M68K */ - -/********************** FILE HEADER **********************/ - -struct external_filehdr { - char f_magic[2]; /* magic number */ - char f_nscns[2]; /* number of sections */ - char f_timdat[4]; /* time & date stamp */ - char f_symptr[4]; /* file pointer to symtab */ - char f_nsyms[4]; /* number of symtab entries */ - char f_opthdr[2]; /* sizeof(optional hdr) */ - char f_flags[2]; /* flags */ -}; - - -/* Motorola 68000/68008/68010/68020 */ -#define MC68MAGIC 0520 -#define MC68KWRMAGIC 0520 /* writeable text segments */ -#define MC68TVMAGIC 0521 -#define MC68KROMAGIC 0521 /* readonly shareable text segments */ -#define MC68KPGMAGIC 0522 /* demand paged text segments */ -#define M68MAGIC 0210 -#define M68TVMAGIC 0211 - -/* Apollo 68000-based machines have a different magic number. This comes - * from /usr/include/apollo/filehdr.h - */ -#define APOLLOM68KMAGIC 0627 - -#define OMAGIC M68MAGIC -#define M68KBADMAG(x) (((x).f_magic!=MC68MAGIC) && ((x).f_magic!=MC68KWRMAGIC) && ((x).f_magic!=MC68TVMAGIC) && \ - ((x).f_magic!=MC68KROMAGIC) && ((x).f_magic!=MC68KPGMAGIC) && ((x).f_magic!=M68MAGIC) && ((x).f_magic!=M68TVMAGIC) && \ - ((x).f_magic!=APOLLOM68KMAGIC) ) - - -#define FILHDR struct external_filehdr -#define FILHSZ sizeof(FILHDR) - - -/********************** AOUT "OPTIONAL HEADER" **********************/ - -typedef struct -{ - char magic[2]; /* type of file */ - char vstamp[2]; /* version stamp */ - char tsize[4]; /* text size in bytes, padded to FW bdry*/ - char dsize[4]; /* initialized data " " */ - char bsize[4]; /* uninitialized data " " */ - char entry[4]; /* entry pt. */ - char text_start[4]; /* base of text used for this file */ - char data_start[4]; /* base of data used for this file */ - char o_sri[4]; /* Apollo specific - .sri data pointer */ - char o_inlib[4]; /* Apollo specific - .inlib data pointer */ - char vid[8]; /* Apollo specific - 64 bit version ID */ -} -AOUTHDR; - -#define APOLLO_COFF_VERSION_NUMBER 1 /* the value of the aouthdr magic */ -#define AOUTHDRSZ (sizeof(AOUTHDR)) -#define AOUTSZ (sizeof(AOUTHDR)) - - - -/********************** SECTION HEADER **********************/ - -struct external_scnhdr { - /* Apollo allow for larger section names by allowing it to be in - * the string table. - */ - char s_name[8]; - char s_paddr[4]; /* physical address, aliased s_nlib */ - char s_vaddr[4]; /* virtual address */ - char s_size[4]; /* section size */ - char s_scnptr[4]; /* file ptr to raw data for section */ - char s_relptr[4]; /* file ptr to relocation */ - char s_lnnoptr[4]; /* file ptr to line numbers */ - char s_nreloc[2]; /* number of relocation entries */ - char s_nlnno[2]; /* number of line number entries*/ - char s_flags[4]; /* flags */ -}; - -/* If s_zeores is all zeroes, s_offset gives the real location of the name - * in the string table. - */ - -#define s_zeroes section_name.s_name -#define s_offset (section_name.s_name+4) - -/* - * names of "special" sections - */ -#define _TEXT ".text" -#define _DATA ".data" -#define _BSS ".bss" -#define _TV ".tv" -#define _INIT ".init" -#define _FINI ".fini" -#define _LINES ".lines" -#define _BLOCKS ".blocks" -#define _SRI ".sri" /* Static Resource Information (systype, - et al.) */ -#define _MIR ".mir" /* Module Information Records */ -#define _APTV ".aptv" /* Apollo-style transfer vectors. */ -#define _INLIB ".inlib" /* Shared Library information */ -#define _RWDI ".rwdi" /* Read/write data initialization directives for - compressed sections */ -#define _UNWIND ".unwind" /* Stack unwind information */ - -#define SCNHDR struct external_scnhdr -#define SCNHSZ sizeof(SCNHDR) - - -/********************** LINE NUMBERS **********************/ - -/* 1 line number entry for every "breakpointable" source line in a section. - * Line numbers are grouped on a per function basis; first entry in a function - * grouping will have l_lnno = 0 and in place of physical address will be the - * symbol table index of the function name. - */ -struct external_lineno { - union { - char l_symndx[4]; /* function name symbol index, iff l_lnno == 0*/ - char l_paddr[4]; /* (physical) address of line number */ - } l_addr; - char l_lnno[2]; /* line number */ -}; - - -#define LINENO struct external_lineno -#define LINESZ sizeof(LINENO) - - -/********************** SYMBOLS **********************/ - -#define E_SYMNMLEN 8 /* # characters in a symbol name */ -#define E_FILNMLEN 14 /* # characters in a file name */ -#define E_DIMNUM 4 /* # array dimensions in auxiliary entry */ - -struct external_syment -{ - union { - char e_name[E_SYMNMLEN]; - struct { - char e_zeroes[4]; - char e_offset[4]; - } e; - } e; - char e_value[4]; - char e_scnum[2]; - char e_type[2]; - char e_sclass[1]; - char e_numaux[1]; -}; - - - -#define N_BTMASK (017) -#define N_TMASK (060) -#define N_BTSHFT (4) -#define N_TSHIFT (2) - - -union external_auxent { - struct { - char x_tagndx[4]; /* str, un, or enum tag indx */ - union { - struct { - char x_lnno[2]; /* declaration line number */ - char x_size[2]; /* str/union/array size */ - } x_lnsz; - char x_fsize[4]; /* size of function */ - } x_misc; - union { - struct { /* if ISFCN, tag, or .bb */ - char x_lnnoptr[4]; /* ptr to fcn line # */ - char x_endndx[4]; /* entry ndx past block end */ - } x_fcn; - struct { /* if ISARY, up to 4 dimen. */ - char x_dimen[E_DIMNUM][2]; - } x_ary; - } x_fcnary; - char x_tvndx[2]; /* tv index */ - } x_sym; - - union { - char x_fname[E_FILNMLEN]; - struct { - char x_zeroes[4]; - char x_offset[4]; - } x_n; - } x_file; - - struct { - char x_scnlen[4]; /* section length */ - char x_nreloc[2]; /* # relocation entries */ - char x_nlinno[2]; /* # line numbers */ - } x_scn; - - struct { - char x_tvfill[4]; /* tv fill value */ - char x_tvlen[2]; /* length of .tv */ - char x_tvran[2][2]; /* tv range */ - } x_tv; /* info about .tv section (in auxent of symbol .tv)) */ - - -}; - -#define SYMENT struct external_syment -#define SYMESZ 18 -#define AUXENT union external_auxent -#define AUXESZ 18 - - - -/********************** RELOCATION DIRECTIVES **********************/ - - -struct external_reloc { - char r_vaddr[4]; - char r_symndx[4]; - char r_type[2]; -#ifdef M68K_COFF_OFFSET - char r_offset[4]; -#endif - -}; - - -#define RELOC struct external_reloc - -#define RELSZ sizeof(struct external_reloc) - -/* Apollo specific STYP flags */ - -#define STYP_RELOCATED_NOT_LOADED 0x00010000 /* Section is relocated normally during linking, but need - not be loaded during program execution */ -#define STYP_DEBUG 0x00020000 /* debug section */ -#define STYP_OVERLAY 0x00040000 /* Section is overlayed */ -#define STYP_INSTRUCTION 0x00200000 /* Section contains executable code */ - -#define STYP_ZERO 0x00800000 /* Section is initialized to zero */ -#define STYP_INSTALLED 0x02000000 /* Section should be installable in KGT */ -#define STYP_LOOK_INSTALLED 0x04000000 /* Look for section in KGT */ -#define STYP_SECALIGN1 0x08000000 /* Specially aligned section */ -#define STYP_SECALIGN2 0x10000000 /* " " " */ -#define STYP_COMPRESSED 0x20000000 /* No section data per se (s_scnptr = 0), but there are - initialization directives for it in .rwdi section - (used in conjunction with STYP_BSS) */ diff --git a/contrib/gdb/include/coff/arm.h b/contrib/gdb/include/coff/arm.h deleted file mode 100644 index 33b11cbb1de84..0000000000000 --- a/contrib/gdb/include/coff/arm.h +++ /dev/null @@ -1,215 +0,0 @@ -/*** coff information for the ARM */ - - -/********************** FILE HEADER **********************/ - -struct external_filehdr { - char f_magic[2]; /* magic number */ - char f_nscns[2]; /* number of sections */ - char f_timdat[4]; /* time & date stamp */ - char f_symptr[4]; /* file pointer to symtab */ - char f_nsyms[4]; /* number of symtab entries */ - char f_opthdr[2]; /* sizeof(optional hdr) */ - char f_flags[2]; /* flags */ -}; - -/* Bits for f_flags: - * F_RELFLG relocation info stripped from file - * F_EXEC file is executable (no unresolved external references) - * F_LNNO line numbers stripped from file - * F_LSYMS local symbols stripped from file - * F_AR32WR file has byte ordering of an AR32WR machine (e.g. vax) - */ - -#define F_RELFLG (0x0001) -#define F_EXEC (0x0002) -#define F_LNNO (0x0004) -#define F_LSYMS (0x0008) - - - -#define ARMMAGIC 0xa00 /* I just made these up */ - -#define ARMBADMAG(x) (((x).f_magic != ARMMAGIC)) - -#define FILHDR struct external_filehdr -#define FILHSZ sizeof(FILHDR) - - -/********************** AOUT "OPTIONAL HEADER" **********************/ - - -typedef struct -{ - char magic[2]; /* type of file */ - char vstamp[2]; /* version stamp */ - char tsize[4]; /* text size in bytes, padded to FW bdry*/ - char dsize[4]; /* initialized data " " */ - char bsize[4]; /* uninitialized data " " */ - char entry[4]; /* entry pt. */ - char text_start[4]; /* base of text used for this file */ - char data_start[4]; /* base of data used for this file */ - - -} -AOUTHDR; - - -#define AOUTSZ (sizeof(AOUTHDR)) - -#define OMAGIC 0404 /* object files, eg as output */ -#define ZMAGIC 0413 /* demand load format, eg normal ld output */ -#define STMAGIC 0401 /* target shlib */ -#define SHMAGIC 0443 /* host shlib */ - - -/* define some NT default values */ -/* #define NT_IMAGE_BASE 0x400000 moved to internal.h */ -#define NT_SECTION_ALIGNMENT 0x1000 -#define NT_FILE_ALIGNMENT 0x200 -#define NT_DEF_RESERVE 0x100000 -#define NT_DEF_COMMIT 0x1000 - -/********************** SECTION HEADER **********************/ - - -struct external_scnhdr { - char s_name[8]; /* section name */ - char s_paddr[4]; /* physical address, aliased s_nlib */ - char s_vaddr[4]; /* virtual address */ - char s_size[4]; /* section size */ - char s_scnptr[4]; /* file ptr to raw data for section */ - char s_relptr[4]; /* file ptr to relocation */ - char s_lnnoptr[4]; /* file ptr to line numbers */ - char s_nreloc[2]; /* number of relocation entries */ - char s_nlnno[2]; /* number of line number entries*/ - char s_flags[4]; /* flags */ -}; - -#define SCNHDR struct external_scnhdr -#define SCNHSZ sizeof(SCNHDR) - -/* - * names of "special" sections - */ -#define _TEXT ".text" -#define _DATA ".data" -#define _BSS ".bss" -#define _COMMENT ".comment" -#define _LIB ".lib" - -/********************** LINE NUMBERS **********************/ - -/* 1 line number entry for every "breakpointable" source line in a section. - * Line numbers are grouped on a per function basis; first entry in a function - * grouping will have l_lnno = 0 and in place of physical address will be the - * symbol table index of the function name. - */ -struct external_lineno { - union { - char l_symndx[4]; /* function name symbol index, iff l_lnno == 0*/ - char l_paddr[4]; /* (physical) address of line number */ - } l_addr; - char l_lnno[2]; /* line number */ -}; - - -#define LINENO struct external_lineno -#define LINESZ 6 - - -/********************** SYMBOLS **********************/ - -#define E_SYMNMLEN 8 /* # characters in a symbol name */ -#define E_FILNMLEN 14 /* # characters in a file name */ -#define E_DIMNUM 4 /* # array dimensions in auxiliary entry */ - -struct external_syment -{ - union { - char e_name[E_SYMNMLEN]; - struct { - char e_zeroes[4]; - char e_offset[4]; - } e; - } e; - char e_value[4]; - char e_scnum[2]; - char e_type[2]; - char e_sclass[1]; - char e_numaux[1]; -}; - -#define N_BTMASK (0xf) -#define N_TMASK (0x30) -#define N_BTSHFT (4) -#define N_TSHIFT (2) - -union external_auxent { - struct { - char x_tagndx[4]; /* str, un, or enum tag indx */ - union { - struct { - char x_lnno[2]; /* declaration line number */ - char x_size[2]; /* str/union/array size */ - } x_lnsz; - char x_fsize[4]; /* size of function */ - } x_misc; - union { - struct { /* if ISFCN, tag, or .bb */ - char x_lnnoptr[4]; /* ptr to fcn line # */ - char x_endndx[4]; /* entry ndx past block end */ - } x_fcn; - struct { /* if ISARY, up to 4 dimen. */ - char x_dimen[E_DIMNUM][2]; - } x_ary; - } x_fcnary; - char x_tvndx[2]; /* tv index */ - } x_sym; - - union { - char x_fname[E_FILNMLEN]; - struct { - char x_zeroes[4]; - char x_offset[4]; - } x_n; - } x_file; - - struct { - char x_scnlen[4]; /* section length */ - char x_nreloc[2]; /* # relocation entries */ - char x_nlinno[2]; /* # line numbers */ - } x_scn; - - struct { - char x_tvfill[4]; /* tv fill value */ - char x_tvlen[2]; /* length of .tv */ - char x_tvran[2][2]; /* tv range */ - } x_tv; /* info about .tv section (in auxent of symbol .tv)) */ - - -}; - -#define SYMENT struct external_syment -#define SYMESZ 18 -#define AUXENT union external_auxent -#define AUXESZ 18 - - -# define _ETEXT "etext" - - -/********************** RELOCATION DIRECTIVES **********************/ - - - -struct external_reloc { - char r_vaddr[4]; - char r_symndx[4]; - char r_type[2]; - char r_offset[4]; -}; - - -#define RELOC struct external_reloc -#define RELSZ sizeof (RELOC) diff --git a/contrib/gdb/include/coff/aux-coff.h b/contrib/gdb/include/coff/aux-coff.h deleted file mode 100644 index c89c124d3e05f..0000000000000 --- a/contrib/gdb/include/coff/aux-coff.h +++ /dev/null @@ -1,31 +0,0 @@ -/* Modifications of internal.h and m68k.h needed by A/UX - Suggested by Ian Lance Taylor <ian@cygnus.com> */ - -#ifndef GNU_COFF_AUX_H -#define GNU_COFF_AUX_H 1 - -#include "coff/internal.h" -#include "coff/m68k.h" - -/* Section contains 64-byte padded pathnames of shared libraries */ -#undef STYP_LIB -#define STYP_LIB 0x200 - -/* Section contains shared library initialization code */ -#undef STYP_INIT -#define STYP_INIT 0x400 - -/* Section contains .ident information */ -#undef STYP_IDENT -#define STYP_IDENT 0x800 - -/* Section types used by bfd and gas not defined (directly) by A/UX */ -#undef STYP_OVER -#define STYP_OVER 0 -#undef STYP_INFO -#define STYP_INFO STYP_IDENT - -/* Traditional name of the section tagged with STYP_LIB */ -#define _LIB ".lib" - -#endif /* GNU_COFF_AUX_H */ diff --git a/contrib/gdb/include/coff/ecoff.h b/contrib/gdb/include/coff/ecoff.h deleted file mode 100644 index 120f88849e0e8..0000000000000 --- a/contrib/gdb/include/coff/ecoff.h +++ /dev/null @@ -1,408 +0,0 @@ -#ifndef ECOFF_H -#define ECOFF_H - -/* Generic ECOFF support. - This does not include symbol information, found in sym.h and - symconst.h. */ - -/* Mips magic numbers used in filehdr. MIPS_MAGIC_LITTLE is used on - little endian machines. MIPS_MAGIC_BIG is used on big endian - machines. Where is MIPS_MAGIC_1 from? */ -#define MIPS_MAGIC_1 0x0180 -#define MIPS_MAGIC_LITTLE 0x0162 -#define MIPS_MAGIC_BIG 0x0160 - -/* These are the magic numbers used for MIPS code compiled at ISA - level 2. */ -#define MIPS_MAGIC_LITTLE2 0x0166 -#define MIPS_MAGIC_BIG2 0x0163 - -/* These are the magic numbers used for MIPS code compiled at ISA - level 3. */ -#define MIPS_MAGIC_LITTLE3 0x142 -#define MIPS_MAGIC_BIG3 0x140 - -/* Alpha magic numbers used in filehdr. */ -#define ALPHA_MAGIC 0x183 - -/* Magic numbers used in a.out header. */ -#define ECOFF_AOUT_OMAGIC 0407 /* not demand paged (ld -N). */ -#define ECOFF_AOUT_ZMAGIC 0413 /* demand load format, eg normal ld output */ - -/* Names of special sections. */ -#define _TEXT ".text" -#define _DATA ".data" -#define _BSS ".bss" -#define _RDATA ".rdata" -#define _SDATA ".sdata" -#define _SBSS ".sbss" -#define _LITA ".lita" -#define _LIT4 ".lit4" -#define _LIT8 ".lit8" -#define _LIB ".lib" -#define _INIT ".init" -#define _FINI ".fini" -#define _PDATA ".pdata" -#define _XDATA ".xdata" -#define _GOT ".got" -#define _HASH ".hash" -#define _DYNSYM ".dynsym" -#define _DYNSTR ".dynstr" -#define _RELDYN ".rel.dyn" -#define _CONFLIC ".conflic" -#define _COMMENT ".comment" -#define _LIBLIST ".liblist" -#define _DYNAMIC ".dynamic" -#define _RCONST ".rconst" - -/* ECOFF uses some additional section flags. */ -#define STYP_RDATA 0x100 -#define STYP_SDATA 0x200 -#define STYP_SBSS 0x400 -#define STYP_GOT 0x1000 -#define STYP_DYNAMIC 0x2000 -#define STYP_DYNSYM 0x4000 -#define STYP_RELDYN 0x8000 -#define STYP_DYNSTR 0x10000 -#define STYP_HASH 0x20000 -#define STYP_LIBLIST 0x40000 -#define STYP_CONFLIC 0x100000 -#define STYP_ECOFF_FINI 0x1000000 -#define STYP_EXTENDESC 0x2000000 /* 0x02FFF000 bits => scn type, rest clr */ -#define STYP_LITA 0x4000000 -#define STYP_LIT8 0x8000000 -#define STYP_LIT4 0x10000000 -#define STYP_ECOFF_LIB 0x40000000 -#define STYP_ECOFF_INIT 0x80000000 -#define STYP_OTHER_LOAD (STYP_ECOFF_INIT | STYP_ECOFF_FINI) - -/* extended section types */ -#define STYP_COMMENT 0x2100000 -#define STYP_RCONST 0x2200000 -#define STYP_XDATA 0x2400000 -#define STYP_PDATA 0x2800000 - -/* The linker needs a section to hold small common variables while - linking. There is no convenient way to create it when the linker - needs it, so we always create one for each BFD. We then avoid - writing it out. */ -#define SCOMMON ".scommon" - -/* If the extern bit in a reloc is 1, then r_symndx is an index into - the external symbol table. If the extern bit is 0, then r_symndx - indicates a section, and is one of the following values. */ -#define RELOC_SECTION_NONE 0 -#define RELOC_SECTION_TEXT 1 -#define RELOC_SECTION_RDATA 2 -#define RELOC_SECTION_DATA 3 -#define RELOC_SECTION_SDATA 4 -#define RELOC_SECTION_SBSS 5 -#define RELOC_SECTION_BSS 6 -#define RELOC_SECTION_INIT 7 -#define RELOC_SECTION_LIT8 8 -#define RELOC_SECTION_LIT4 9 -#define RELOC_SECTION_XDATA 10 -#define RELOC_SECTION_PDATA 11 -#define RELOC_SECTION_FINI 12 -#define RELOC_SECTION_LITA 13 -#define RELOC_SECTION_ABS 14 -#define RELOC_SECTION_RCONST 15 - -#define NUM_RELOC_SECTIONS 16 - -/********************** STABS **********************/ - -/* gcc uses mips-tfile to output type information in special stabs - entries. These must match the corresponding definition in - gcc/config/mips.h. At some point, these should probably go into a - shared include file, but currently gcc and gdb do not share any - directories. */ -#define CODE_MASK 0x8F300 -#define ECOFF_IS_STAB(sym) (((sym)->index & 0xFFF00) == CODE_MASK) -#define ECOFF_MARK_STAB(code) ((code)+CODE_MASK) -#define ECOFF_UNMARK_STAB(code) ((code)-CODE_MASK) -#define STABS_SYMBOL "@stabs" - -/********************** COFF **********************/ - -/* gcc also uses mips-tfile to output COFF debugging information. - These are the values it uses when outputting the .type directive. - These should also be in a shared include file. */ -#define N_BTMASK (017) -#define N_TMASK (060) -#define N_BTSHFT (4) -#define N_TSHIFT (2) - -/********************** AUX **********************/ - -/* The auxiliary type information is the same on all known ECOFF - targets. I can't see any reason that it would ever change, so I am - going to gamble and define the external structures here, in the - target independent ECOFF header file. The internal forms are - defined in coff/sym.h, which was originally donated by MIPS - Computer Systems. */ - -/* Type information external record */ - -struct tir_ext { - unsigned char t_bits1[1]; - unsigned char t_tq45[1]; - unsigned char t_tq01[1]; - unsigned char t_tq23[1]; -}; - -#define TIR_BITS1_FBITFIELD_BIG ((unsigned int) 0x80) -#define TIR_BITS1_FBITFIELD_LITTLE ((unsigned int) 0x01) - -#define TIR_BITS1_CONTINUED_BIG ((unsigned int) 0x40) -#define TIR_BITS1_CONTINUED_LITTLE ((unsigned int) 0x02) - -#define TIR_BITS1_BT_BIG ((unsigned int) 0x3F) -#define TIR_BITS1_BT_SH_BIG 0 -#define TIR_BITS1_BT_LITTLE ((unsigned int) 0xFC) -#define TIR_BITS1_BT_SH_LITTLE 2 - -#define TIR_BITS_TQ4_BIG ((unsigned int) 0xF0) -#define TIR_BITS_TQ4_SH_BIG 4 -#define TIR_BITS_TQ5_BIG ((unsigned int) 0x0F) -#define TIR_BITS_TQ5_SH_BIG 0 -#define TIR_BITS_TQ4_LITTLE ((unsigned int) 0x0F) -#define TIR_BITS_TQ4_SH_LITTLE 0 -#define TIR_BITS_TQ5_LITTLE ((unsigned int) 0xF0) -#define TIR_BITS_TQ5_SH_LITTLE 4 - -#define TIR_BITS_TQ0_BIG ((unsigned int) 0xF0) -#define TIR_BITS_TQ0_SH_BIG 4 -#define TIR_BITS_TQ1_BIG ((unsigned int) 0x0F) -#define TIR_BITS_TQ1_SH_BIG 0 -#define TIR_BITS_TQ0_LITTLE ((unsigned int) 0x0F) -#define TIR_BITS_TQ0_SH_LITTLE 0 -#define TIR_BITS_TQ1_LITTLE ((unsigned int) 0xF0) -#define TIR_BITS_TQ1_SH_LITTLE 4 - -#define TIR_BITS_TQ2_BIG ((unsigned int) 0xF0) -#define TIR_BITS_TQ2_SH_BIG 4 -#define TIR_BITS_TQ3_BIG ((unsigned int) 0x0F) -#define TIR_BITS_TQ3_SH_BIG 0 -#define TIR_BITS_TQ2_LITTLE ((unsigned int) 0x0F) -#define TIR_BITS_TQ2_SH_LITTLE 0 -#define TIR_BITS_TQ3_LITTLE ((unsigned int) 0xF0) -#define TIR_BITS_TQ3_SH_LITTLE 4 - -/* Relative symbol external record */ - -struct rndx_ext { - unsigned char r_bits[4]; -}; - -#define RNDX_BITS0_RFD_SH_LEFT_BIG 4 -#define RNDX_BITS1_RFD_BIG ((unsigned int) 0xF0) -#define RNDX_BITS1_RFD_SH_BIG 4 - -#define RNDX_BITS0_RFD_SH_LEFT_LITTLE 0 -#define RNDX_BITS1_RFD_LITTLE ((unsigned int) 0x0F) -#define RNDX_BITS1_RFD_SH_LEFT_LITTLE 8 - -#define RNDX_BITS1_INDEX_BIG ((unsigned int) 0x0F) -#define RNDX_BITS1_INDEX_SH_LEFT_BIG 16 -#define RNDX_BITS2_INDEX_SH_LEFT_BIG 8 -#define RNDX_BITS3_INDEX_SH_LEFT_BIG 0 - -#define RNDX_BITS1_INDEX_LITTLE ((unsigned int) 0xF0) -#define RNDX_BITS1_INDEX_SH_LITTLE 4 -#define RNDX_BITS2_INDEX_SH_LEFT_LITTLE 4 -#define RNDX_BITS3_INDEX_SH_LEFT_LITTLE 12 - -/* Auxiliary symbol information external record */ - -union aux_ext { - struct tir_ext a_ti; - struct rndx_ext a_rndx; - unsigned char a_dnLow[4]; - unsigned char a_dnHigh[4]; - unsigned char a_isym[4]; - unsigned char a_iss[4]; - unsigned char a_width[4]; - unsigned char a_count[4]; -}; - -#define AUX_GET_ANY(bigend, ax, field) \ - ((bigend) ? bfd_getb32 ((ax)->field) : bfd_getl32 ((ax)->field)) - -#define AUX_GET_DNLOW(bigend, ax) AUX_GET_ANY ((bigend), (ax), a_dnLow) -#define AUX_GET_DNHIGH(bigend, ax) AUX_GET_ANY ((bigend), (ax), a_dnHigh) -#define AUX_GET_ISYM(bigend, ax) AUX_GET_ANY ((bigend), (ax), a_isym) -#define AUX_GET_ISS(bigend, ax) AUX_GET_ANY ((bigend), (ax), a_iss) -#define AUX_GET_WIDTH(bigend, ax) AUX_GET_ANY ((bigend), (ax), a_width) -#define AUX_GET_COUNT(bigend, ax) AUX_GET_ANY ((bigend), (ax), a_count) - -#define AUX_PUT_ANY(bigend, val, ax, field) \ - ((bigend) \ - ? (bfd_putb32 ((bfd_vma) (val), (ax)->field), 0) \ - : (bfd_putl32 ((bfd_vma) (val), (ax)->field), 0)) - -#define AUX_PUT_DNLOW(bigend, val, ax) \ - AUX_PUT_ANY ((bigend), (val), (ax), a_dnLow) -#define AUX_PUT_DNHIGH(bigend, val, ax) \ - AUX_PUT_ANY ((bigend), (val), (ax), a_dnHigh) -#define AUX_PUT_ISYM(bigend, val, ax) \ - AUX_PUT_ANY ((bigend), (val), (ax), a_isym) -#define AUX_PUT_ISS(bigend, val, ax) \ - AUX_PUT_ANY ((bigend), (val), (ax), a_iss) -#define AUX_PUT_WIDTH(bigend, val, ax) \ - AUX_PUT_ANY ((bigend), (val), (ax), a_width) -#define AUX_PUT_COUNT(bigend, val, ax) \ - AUX_PUT_ANY ((bigend), (val), (ax), a_count) - -/********************** SYMBOLS **********************/ - -/* For efficiency, gdb deals directly with the unswapped symbolic - information (that way it only takes the time to swap information - that it really needs to read). gdb originally retrieved the - information directly from the BFD backend information, but that - strategy, besides being sort of ugly, does not work for MIPS ELF, - which also uses ECOFF debugging information. This structure holds - pointers to the (mostly) unswapped symbolic information. */ - -struct ecoff_debug_info -{ - /* The swapped ECOFF symbolic header. */ - HDRR symbolic_header; - - /* Pointers to the unswapped symbolic information. Note that the - pointers to external structures point to different sorts of - information on different ECOFF targets. The ecoff_debug_swap - structure provides the sizes of the structures and the functions - needed to swap the information in and out. These pointers are - all pointers to arrays, not single structures. They will be NULL - if there are no instances of the relevant structure. These - fields are also used by the assembler to output ECOFF debugging - information. */ - unsigned char *line; - PTR external_dnr; /* struct dnr_ext */ - PTR external_pdr; /* struct pdr_ext */ - PTR external_sym; /* struct sym_ext */ - PTR external_opt; /* struct opt_ext */ - union aux_ext *external_aux; - char *ss; - char *ssext; - PTR external_fdr; /* struct fdr_ext */ - PTR external_rfd; /* struct rfd_ext */ - PTR external_ext; /* struct ext_ext */ - - /* These fields are used when linking. They may disappear at some - point. */ - char *ssext_end; - PTR external_ext_end; - - /* When linking, this field holds a mapping from the input FDR - numbers to the output numbers, and is used when writing out the - external symbols. It is NULL if no mapping is required. */ - RFDT *ifdmap; - - /* The swapped FDR information. Currently this is never NULL, but - code using this structure should probably double-check in case - this changes in the future. This is a pointer to an array, not a - single structure. */ - FDR *fdr; - - /* When relaxing MIPS embedded PIC code, we may need to adjust - symbol values when they are output. This is a linked list of - structures indicating how values should be adjusted. There is no - requirement that the entries be in any order, or that they not - overlap. This field is normally NULL, in which case no - adjustments need to be made. */ - struct ecoff_value_adjust *adjust; -}; - -/* This structure describes how to adjust symbol values when - outputting MIPS embedded PIC code. These adjustments only apply to - the internal symbols, as the external symbol values will come from - the hash table and have already been adjusted. */ - -struct ecoff_value_adjust -{ - /* Next entry on adjustment list. */ - struct ecoff_value_adjust *next; - /* Starting VMA of adjustment. This is the VMA in the ECOFF file, - not the offset from the start of the section. Thus it should - indicate a particular section. */ - bfd_vma start; - /* Ending VMA of adjustment. */ - bfd_vma end; - /* Adjustment. This should be added to the value of the symbol, or - FDR. This is zero for the last entry in the array. */ - long adjust; -}; - -/* These structures are used by the ECOFF find_nearest_line function. */ - -struct ecoff_fdrtab_entry -{ - /* Base address in .text of this FDR. */ - bfd_vma base_addr; - FDR *fdr; -}; - -struct ecoff_find_line -{ - /* Allocated memory to hold function and file names. */ - char *find_buffer; - - /* FDR table, sorted by address: */ - long fdrtab_len; - struct ecoff_fdrtab_entry *fdrtab; -}; - -/********************** SWAPPING **********************/ - -/* The generic ECOFF code needs to be able to swap debugging - information in and out in the specific format used by a particular - ECOFF implementation. This structure provides the information - needed to do this. */ - -struct ecoff_debug_swap -{ - /* Symbol table magic number. */ - int sym_magic; - /* Alignment of debugging information. E.g., 4. */ - bfd_size_type debug_align; - /* Sizes of external symbolic information. */ - bfd_size_type external_hdr_size; - bfd_size_type external_dnr_size; - bfd_size_type external_pdr_size; - bfd_size_type external_sym_size; - bfd_size_type external_opt_size; - bfd_size_type external_fdr_size; - bfd_size_type external_rfd_size; - bfd_size_type external_ext_size; - /* Functions to swap in external symbolic data. */ - void (*swap_hdr_in) PARAMS ((bfd *, PTR, HDRR *)); - void (*swap_dnr_in) PARAMS ((bfd *, PTR, DNR *)); - void (*swap_pdr_in) PARAMS ((bfd *, PTR, PDR *)); - void (*swap_sym_in) PARAMS ((bfd *, PTR, SYMR *)); - void (*swap_opt_in) PARAMS ((bfd *, PTR, OPTR *)); - void (*swap_fdr_in) PARAMS ((bfd *, PTR, FDR *)); - void (*swap_rfd_in) PARAMS ((bfd *, PTR, RFDT *)); - void (*swap_ext_in) PARAMS ((bfd *, PTR, EXTR *)); - void (*swap_tir_in) PARAMS ((int, const struct tir_ext *, TIR *)); - void (*swap_rndx_in) PARAMS ((int, const struct rndx_ext *, RNDXR *)); - /* Functions to swap out external symbolic data. */ - void (*swap_hdr_out) PARAMS ((bfd *, const HDRR *, PTR)); - void (*swap_dnr_out) PARAMS ((bfd *, const DNR *, PTR)); - void (*swap_pdr_out) PARAMS ((bfd *, const PDR *, PTR)); - void (*swap_sym_out) PARAMS ((bfd *, const SYMR *, PTR)); - void (*swap_opt_out) PARAMS ((bfd *, const OPTR *, PTR)); - void (*swap_fdr_out) PARAMS ((bfd *, const FDR *, PTR)); - void (*swap_rfd_out) PARAMS ((bfd *, const RFDT *, PTR)); - void (*swap_ext_out) PARAMS ((bfd *, const EXTR *, PTR)); - void (*swap_tir_out) PARAMS ((int, const TIR *, struct tir_ext *)); - void (*swap_rndx_out) PARAMS ((int, const RNDXR *, struct rndx_ext *)); - /* Function to read symbol data and set up pointers in - ecoff_debug_info structure. The section argument is used for - ELF, not straight ECOFF. */ - boolean (*read_debug_info) PARAMS ((bfd *, asection *, - struct ecoff_debug_info *)); -}; - -#endif /* ! defined (ECOFF_H) */ diff --git a/contrib/gdb/include/coff/h8300.h b/contrib/gdb/include/coff/h8300.h deleted file mode 100644 index 8fe8f6165fed1..0000000000000 --- a/contrib/gdb/include/coff/h8300.h +++ /dev/null @@ -1,203 +0,0 @@ -/*** coff information for Hitachi H8/300 and H8/300-H */ - -/********************** FILE HEADER **********************/ - -struct external_filehdr { - char f_magic[2]; /* magic number */ - char f_nscns[2]; /* number of sections */ - char f_timdat[4]; /* time & date stamp */ - char f_symptr[4]; /* file pointer to symtab */ - char f_nsyms[4]; /* number of symtab entries */ - char f_opthdr[2]; /* sizeof(optional hdr) */ - char f_flags[2]; /* flags */ -}; - - - -#define H8300MAGIC 0x8300 -#define H8300HMAGIC 0x8301 - - -#define H8300BADMAG(x) (((x).f_magic!=H8300MAGIC)) -#define H8300HBADMAG(x) (((x).f_magic!=H8300HMAGIC)) - -#define FILHDR struct external_filehdr -#define FILHSZ sizeof(FILHDR) - - -/********************** AOUT "OPTIONAL HEADER" **********************/ - - -typedef struct -{ - char magic[2]; /* type of file */ - char vstamp[2]; /* version stamp */ - char tsize[4]; /* text size in bytes, padded to FW bdry*/ - char dsize[4]; /* initialized data " " */ - char bsize[4]; /* uninitialized data " " */ - char entry[4]; /* entry pt. */ - char text_start[4]; /* base of text used for this file */ - char data_start[4]; /* base of data used for this file */ -} -AOUTHDR; - - -#define AOUTHDRSZ (sizeof(AOUTHDR)) -#define AOUTSZ (sizeof(AOUTHDR)) - - - - -/********************** SECTION HEADER **********************/ - - -struct external_scnhdr { - char s_name[8]; /* section name */ - char s_paddr[4]; /* physical address, aliased s_nlib */ - char s_vaddr[4]; /* virtual address */ - char s_size[4]; /* section size */ - char s_scnptr[4]; /* file ptr to raw data for section */ - char s_relptr[4]; /* file ptr to relocation */ - char s_lnnoptr[4]; /* file ptr to line numbers */ - char s_nreloc[2]; /* number of relocation entries */ - char s_nlnno[2]; /* number of line number entries*/ - char s_flags[4]; /* flags */ -}; - -/* - * names of "special" sections - */ -#define _TEXT ".text" -#define _DATA ".data" -#define _BSS ".bss" - - -#define SCNHDR struct external_scnhdr -#define SCNHSZ sizeof(SCNHDR) - - -/********************** LINE NUMBERS **********************/ - -/* 1 line number entry for every "breakpointable" source line in a section. - * Line numbers are grouped on a per function basis; first entry in a function - * grouping will have l_lnno = 0 and in place of physical address will be the - * symbol table index of the function name. - */ -struct external_lineno { - union { - char l_symndx[4]; /* function name symbol index, iff l_lnno == 0*/ - char l_paddr[4]; /* (physical) address of line number */ - } l_addr; - char l_lnno[4]; /* line number */ -}; - -#define GET_LINENO_LNNO(abfd, ext) bfd_h_get_32(abfd, (bfd_byte *) (ext->l_lnno)); -#define PUT_LINENO_LNNO(abfd,val, ext) bfd_h_put_32(abfd,val, (bfd_byte *) (ext->l_lnno)); - -#define LINENO struct external_lineno -#define LINESZ sizeof(LINENO) - - -/********************** SYMBOLS **********************/ - -#define E_SYMNMLEN 8 /* # characters in a symbol name */ -#define E_FILNMLEN 14 /* # characters in a file name */ -#define E_DIMNUM 4 /* # array dimensions in auxiliary entry */ - -struct external_syment -{ - union { - char e_name[E_SYMNMLEN]; - struct { - char e_zeroes[4]; - char e_offset[4]; - } e; - } e; - char e_value[4]; - char e_scnum[2]; - char e_type[2]; - char e_sclass[1]; - char e_numaux[1]; -}; - - - -#define N_BTMASK (017) -#define N_TMASK (060) -#define N_BTSHFT (4) -#define N_TSHIFT (2) - - -union external_auxent { - struct { - char x_tagndx[4]; /* str, un, or enum tag indx */ - union { - struct { - char x_lnno[2]; /* declaration line number */ - char x_size[2]; /* str/union/array size */ - } x_lnsz; - char x_fsize[4]; /* size of function */ - } x_misc; - union { - struct { /* if ISFCN, tag, or .bb */ - char x_lnnoptr[4]; /* ptr to fcn line # */ - char x_endndx[4]; /* entry ndx past block end */ - } x_fcn; - struct { /* if ISARY, up to 4 dimen. */ - char x_dimen[E_DIMNUM][2]; - } x_ary; - } x_fcnary; - char x_tvndx[2]; /* tv index */ - } x_sym; - - union { - char x_fname[E_FILNMLEN]; - struct { - char x_zeroes[4]; - char x_offset[4]; - } x_n; - } x_file; - - struct { - char x_scnlen[4]; /* section length */ - char x_nreloc[2]; /* # relocation entries */ - char x_nlinno[2]; /* # line numbers */ - } x_scn; - - struct { - char x_tvfill[4]; /* tv fill value */ - char x_tvlen[2]; /* length of .tv */ - char x_tvran[2][2]; /* tv range */ - } x_tv; /* info about .tv section (in auxent of symbol .tv)) */ - - -}; - -#define SYMENT struct external_syment -#define SYMESZ 18 -#define AUXENT union external_auxent -#define AUXESZ 18 - - - -/********************** RELOCATION DIRECTIVES **********************/ - -/* The external reloc has an offset field, because some of the reloc - types on the h8 don't have room in the instruction for the entire - offset - eg the strange jump and high page addressing modes */ - -struct external_reloc { - char r_vaddr[4]; - char r_symndx[4]; - char r_offset[4]; - char r_type[2]; - char r_stuff[2]; -}; - - -#define RELOC struct external_reloc -#define RELSZ 16 - - - - diff --git a/contrib/gdb/include/coff/h8500.h b/contrib/gdb/include/coff/h8500.h deleted file mode 100644 index 5a8c9feace903..0000000000000 --- a/contrib/gdb/include/coff/h8500.h +++ /dev/null @@ -1,201 +0,0 @@ -/*** coff information for Hitachi H8/500 */ - -/********************** FILE HEADER **********************/ - -struct external_filehdr { - char f_magic[2]; /* magic number */ - char f_nscns[2]; /* number of sections */ - char f_timdat[4]; /* time & date stamp */ - char f_symptr[4]; /* file pointer to symtab */ - char f_nsyms[4]; /* number of symtab entries */ - char f_opthdr[2]; /* sizeof(optional hdr) */ - char f_flags[2]; /* flags */ -}; - - - -#define H8500MAGIC 0x8500 - - -#define H8500BADMAG(x) ((0xffff && ((x).f_magic)!=H8500MAGIC)) - -#define FILHDR struct external_filehdr -#define FILHSZ sizeof(FILHDR) - - -/********************** AOUT "OPTIONAL HEADER" **********************/ - - -typedef struct -{ - char magic[2]; /* type of file */ - char vstamp[2]; /* version stamp */ - char tsize[4]; /* text size in bytes, padded to FW bdry*/ - char dsize[4]; /* initialized data " " */ - char bsize[4]; /* uninitialized data " " */ - char entry[4]; /* entry pt. */ - char text_start[4]; /* base of text used for this file */ - char data_start[4]; /* base of data used for this file */ -} -AOUTHDR; - - -#define AOUTHDRSZ (sizeof(AOUTHDR)) -#define AOUTSZ (sizeof(AOUTHDR)) - - - - -/********************** SECTION HEADER **********************/ - - -struct external_scnhdr { - char s_name[8]; /* section name */ - char s_paddr[4]; /* physical address, aliased s_nlib */ - char s_vaddr[4]; /* virtual address */ - char s_size[4]; /* section size */ - char s_scnptr[4]; /* file ptr to raw data for section */ - char s_relptr[4]; /* file ptr to relocation */ - char s_lnnoptr[4]; /* file ptr to line numbers */ - char s_nreloc[2]; /* number of relocation entries */ - char s_nlnno[2]; /* number of line number entries*/ - char s_flags[4]; /* flags */ -}; - -/* - * names of "special" sections - */ -#define _TEXT ".text" -#define _DATA ".data" -#define _BSS ".bss" - - -#define SCNHDR struct external_scnhdr -#define SCNHSZ sizeof(SCNHDR) - - -/********************** LINE NUMBERS **********************/ - -/* 1 line number entry for every "breakpointable" source line in a section. - * Line numbers are grouped on a per function basis; first entry in a function - * grouping will have l_lnno = 0 and in place of physical address will be the - * symbol table index of the function name. - */ -struct external_lineno { - union { - char l_symndx[4]; /* function name symbol index, iff l_lnno == 0*/ - char l_paddr[4]; /* (physical) address of line number */ - } l_addr; - char l_lnno[4]; /* line number */ -}; - -#define GET_LINENO_LNNO(abfd, ext) bfd_h_get_32(abfd, (bfd_byte *) (ext->l_lnno)); -#define PUT_LINENO_LNNO(abfd,val, ext) bfd_h_put_32(abfd,val, (bfd_byte *) (ext->l_lnno)); - -#define LINENO struct external_lineno -#define LINESZ sizeof(LINENO) - - -/********************** SYMBOLS **********************/ - -#define E_SYMNMLEN 8 /* # characters in a symbol name */ -#define E_FILNMLEN 14 /* # characters in a file name */ -#define E_DIMNUM 4 /* # array dimensions in auxiliary entry */ - -struct external_syment -{ - union { - char e_name[E_SYMNMLEN]; - struct { - char e_zeroes[4]; - char e_offset[4]; - } e; - } e; - char e_value[4]; - char e_scnum[2]; - char e_type[2]; - char e_sclass[1]; - char e_numaux[1]; -}; - - - -#define N_BTMASK (017) -#define N_TMASK (060) -#define N_BTSHFT (4) -#define N_TSHIFT (2) - - -union external_auxent { - struct { - char x_tagndx[4]; /* str, un, or enum tag indx */ - union { - struct { - char x_lnno[2]; /* declaration line number */ - char x_size[2]; /* str/union/array size */ - } x_lnsz; - char x_fsize[4]; /* size of function */ - } x_misc; - union { - struct { /* if ISFCN, tag, or .bb */ - char x_lnnoptr[4]; /* ptr to fcn line # */ - char x_endndx[4]; /* entry ndx past block end */ - } x_fcn; - struct { /* if ISARY, up to 4 dimen. */ - char x_dimen[E_DIMNUM][2]; - } x_ary; - } x_fcnary; - char x_tvndx[2]; /* tv index */ - } x_sym; - - union { - char x_fname[E_FILNMLEN]; - struct { - char x_zeroes[4]; - char x_offset[4]; - } x_n; - } x_file; - - struct { - char x_scnlen[4]; /* section length */ - char x_nreloc[2]; /* # relocation entries */ - char x_nlinno[2]; /* # line numbers */ - } x_scn; - - struct { - char x_tvfill[4]; /* tv fill value */ - char x_tvlen[2]; /* length of .tv */ - char x_tvran[2][2]; /* tv range */ - } x_tv; /* info about .tv section (in auxent of symbol .tv)) */ - - -}; - -#define SYMENT struct external_syment -#define SYMESZ 18 -#define AUXENT union external_auxent -#define AUXESZ 18 - - - -/********************** RELOCATION DIRECTIVES **********************/ - -/* The external reloc has an offset field, because some of the reloc - types on the h8 don't have room in the instruction for the entire - offset - eg the strange jump and high page addressing modes */ - -struct external_reloc { - char r_vaddr[4]; - char r_symndx[4]; - char r_offset[4]; - char r_type[2]; - char r_stuff[2]; -}; - - -#define RELOC struct external_reloc -#define RELSZ 16 - - - - diff --git a/contrib/gdb/include/coff/i386.h b/contrib/gdb/include/coff/i386.h deleted file mode 100644 index b7ecf0b6e1404..0000000000000 --- a/contrib/gdb/include/coff/i386.h +++ /dev/null @@ -1,224 +0,0 @@ -/*** coff information for Intel 386/486. */ - - -/********************** FILE HEADER **********************/ - -struct external_filehdr { - char f_magic[2]; /* magic number */ - char f_nscns[2]; /* number of sections */ - char f_timdat[4]; /* time & date stamp */ - char f_symptr[4]; /* file pointer to symtab */ - char f_nsyms[4]; /* number of symtab entries */ - char f_opthdr[2]; /* sizeof(optional hdr) */ - char f_flags[2]; /* flags */ -}; - -/* Bits for f_flags: - * F_RELFLG relocation info stripped from file - * F_EXEC file is executable (no unresolved external references) - * F_LNNO line numbers stripped from file - * F_LSYMS local symbols stripped from file - * F_AR32WR file has byte ordering of an AR32WR machine (e.g. vax) - */ - -#define F_RELFLG (0x0001) -#define F_EXEC (0x0002) -#define F_LNNO (0x0004) -#define F_LSYMS (0x0008) - - - -#define I386MAGIC 0x14c -#define I386PTXMAGIC 0x154 -#define I386AIXMAGIC 0x175 - -/* This is Lynx's all-platform magic number for executables. */ - -#define LYNXCOFFMAGIC 0415 - -#define I386BADMAG(x) (((x).f_magic != I386MAGIC) \ - && (x).f_magic != I386AIXMAGIC \ - && (x).f_magic != I386PTXMAGIC \ - && (x).f_magic != LYNXCOFFMAGIC) - -#define FILHDR struct external_filehdr -#define FILHSZ sizeof(FILHDR) - - -/********************** AOUT "OPTIONAL HEADER" **********************/ - - -typedef struct -{ - char magic[2]; /* type of file */ - char vstamp[2]; /* version stamp */ - char tsize[4]; /* text size in bytes, padded to FW bdry*/ - char dsize[4]; /* initialized data " " */ - char bsize[4]; /* uninitialized data " " */ - char entry[4]; /* entry pt. */ - char text_start[4]; /* base of text used for this file */ - char data_start[4]; /* base of data used for this file */ - - -} -AOUTHDR; - - -#define AOUTSZ (sizeof(AOUTHDR)) - -#define OMAGIC 0404 /* object files, eg as output */ -#define ZMAGIC 0413 /* demand load format, eg normal ld output */ -#define STMAGIC 0401 /* target shlib */ -#define SHMAGIC 0443 /* host shlib */ - - -/* define some NT default values */ -/* #define NT_IMAGE_BASE 0x400000 moved to internal.h */ -#define NT_SECTION_ALIGNMENT 0x1000 -#define NT_FILE_ALIGNMENT 0x200 -#define NT_DEF_RESERVE 0x100000 -#define NT_DEF_COMMIT 0x1000 - -/********************** SECTION HEADER **********************/ - - -struct external_scnhdr { - char s_name[8]; /* section name */ - char s_paddr[4]; /* physical address, aliased s_nlib */ - char s_vaddr[4]; /* virtual address */ - char s_size[4]; /* section size */ - char s_scnptr[4]; /* file ptr to raw data for section */ - char s_relptr[4]; /* file ptr to relocation */ - char s_lnnoptr[4]; /* file ptr to line numbers */ - char s_nreloc[2]; /* number of relocation entries */ - char s_nlnno[2]; /* number of line number entries*/ - char s_flags[4]; /* flags */ -}; - -#define SCNHDR struct external_scnhdr -#define SCNHSZ sizeof(SCNHDR) - -/* - * names of "special" sections - */ -#define _TEXT ".text" -#define _DATA ".data" -#define _BSS ".bss" -#define _COMMENT ".comment" -#define _LIB ".lib" - -/********************** LINE NUMBERS **********************/ - -/* 1 line number entry for every "breakpointable" source line in a section. - * Line numbers are grouped on a per function basis; first entry in a function - * grouping will have l_lnno = 0 and in place of physical address will be the - * symbol table index of the function name. - */ -struct external_lineno { - union { - char l_symndx[4]; /* function name symbol index, iff l_lnno == 0*/ - char l_paddr[4]; /* (physical) address of line number */ - } l_addr; - char l_lnno[2]; /* line number */ -}; - - -#define LINENO struct external_lineno -#define LINESZ 6 - - -/********************** SYMBOLS **********************/ - -#define E_SYMNMLEN 8 /* # characters in a symbol name */ -#define E_FILNMLEN 14 /* # characters in a file name */ -#define E_DIMNUM 4 /* # array dimensions in auxiliary entry */ - -struct external_syment -{ - union { - char e_name[E_SYMNMLEN]; - struct { - char e_zeroes[4]; - char e_offset[4]; - } e; - } e; - char e_value[4]; - char e_scnum[2]; - char e_type[2]; - char e_sclass[1]; - char e_numaux[1]; -}; - -#define N_BTMASK (0xf) -#define N_TMASK (0x30) -#define N_BTSHFT (4) -#define N_TSHIFT (2) - -union external_auxent { - struct { - char x_tagndx[4]; /* str, un, or enum tag indx */ - union { - struct { - char x_lnno[2]; /* declaration line number */ - char x_size[2]; /* str/union/array size */ - } x_lnsz; - char x_fsize[4]; /* size of function */ - } x_misc; - union { - struct { /* if ISFCN, tag, or .bb */ - char x_lnnoptr[4]; /* ptr to fcn line # */ - char x_endndx[4]; /* entry ndx past block end */ - } x_fcn; - struct { /* if ISARY, up to 4 dimen. */ - char x_dimen[E_DIMNUM][2]; - } x_ary; - } x_fcnary; - char x_tvndx[2]; /* tv index */ - } x_sym; - - union { - char x_fname[E_FILNMLEN]; - struct { - char x_zeroes[4]; - char x_offset[4]; - } x_n; - } x_file; - - struct { - char x_scnlen[4]; /* section length */ - char x_nreloc[2]; /* # relocation entries */ - char x_nlinno[2]; /* # line numbers */ - } x_scn; - - struct { - char x_tvfill[4]; /* tv fill value */ - char x_tvlen[2]; /* length of .tv */ - char x_tvran[2][2]; /* tv range */ - } x_tv; /* info about .tv section (in auxent of symbol .tv)) */ - - -}; - -#define SYMENT struct external_syment -#define SYMESZ 18 -#define AUXENT union external_auxent -#define AUXESZ 18 - - -# define _ETEXT "etext" - - -/********************** RELOCATION DIRECTIVES **********************/ - - - -struct external_reloc { - char r_vaddr[4]; - char r_symndx[4]; - char r_type[2]; -}; - - -#define RELOC struct external_reloc -#define RELSZ 10 - diff --git a/contrib/gdb/include/coff/i860.h b/contrib/gdb/include/coff/i860.h deleted file mode 100644 index e09ec5f0e51b8..0000000000000 --- a/contrib/gdb/include/coff/i860.h +++ /dev/null @@ -1,204 +0,0 @@ -/* This file was hacked from i386.h [dolan@ssd.intel.com] */ - -/*** coff information for Intel 860. */ - - -/********************** FILE HEADER **********************/ - -struct external_filehdr { - char f_magic[2]; /* magic number */ - char f_nscns[2]; /* number of sections */ - char f_timdat[4]; /* time & date stamp */ - char f_symptr[4]; /* file pointer to symtab */ - char f_nsyms[4]; /* number of symtab entries */ - char f_opthdr[2]; /* sizeof(optional hdr) */ - char f_flags[2]; /* flags */ -}; - - -/* Bits for f_flags: - * F_RELFLG relocation info stripped from file - * F_EXEC file is executable (no unresolved external references) - * F_LNNO line numbers stripped from file - * F_LSYMS local symbols stripped from file - * F_AR32WR file has byte ordering of an AR32WR machine (e.g. vax) - */ - -#define F_RELFLG (0x0001) -#define F_EXEC (0x0002) -#define F_LNNO (0x0004) -#define F_LSYMS (0x0008) - - - -#define I860MAGIC 0x14d - -#define I860BADMAG(x) ((x).f_magic != I860MAGIC) - -#define FILHDR struct external_filehdr -#define FILHSZ sizeof(FILHDR) - - -/********************** AOUT "OPTIONAL HEADER" **********************/ - - -typedef struct -{ - char magic[2]; /* type of file */ - char vstamp[2]; /* version stamp */ - char tsize[4]; /* text size in bytes, padded to FW bdry*/ - char dsize[4]; /* initialized data " " */ - char bsize[4]; /* uninitialized data " " */ - char entry[4]; /* entry pt. */ - char text_start[4]; /* base of text used for this file */ - char data_start[4]; /* base of data used for this file */ -} -AOUTHDR; - - -#define AOUTSZ (sizeof(AOUTHDR)) - -/* FIXME: What are the a.out magic numbers? */ - -/********************** SECTION HEADER **********************/ - - -struct external_scnhdr { - char s_name[8]; /* section name */ - char s_paddr[4]; /* physical address, aliased s_nlib */ - char s_vaddr[4]; /* virtual address */ - char s_size[4]; /* section size */ - char s_scnptr[4]; /* file ptr to raw data for section */ - char s_relptr[4]; /* file ptr to relocation */ - char s_lnnoptr[4]; /* file ptr to line numbers */ - char s_nreloc[2]; /* number of relocation entries */ - char s_nlnno[2]; /* number of line number entries*/ - char s_flags[4]; /* flags */ -}; - -#define SCNHDR struct external_scnhdr -#define SCNHSZ sizeof(SCNHDR) - -/* - * names of "special" sections - */ -#define _TEXT ".text" -#define _DATA ".data" -#define _BSS ".bss" -#define _COMMENT ".comment" -#define _LIB ".lib" - -/********************** LINE NUMBERS **********************/ - -/* 1 line number entry for every "breakpointable" source line in a section. - * Line numbers are grouped on a per function basis; first entry in a function - * grouping will have l_lnno = 0 and in place of physical address will be the - * symbol table index of the function name. - */ -struct external_lineno { - union { - char l_symndx[4]; /* function name symbol index, iff l_lnno == 0*/ - char l_paddr[4]; /* (physical) address of line number */ - } l_addr; - char l_lnno[2]; /* line number */ -}; - - -#define LINENO struct external_lineno -#define LINESZ 6 - - -/********************** SYMBOLS **********************/ - -#define E_SYMNMLEN 8 /* # characters in a symbol name */ -#define E_FILNMLEN 14 /* # characters in a file name */ -#define E_DIMNUM 4 /* # array dimensions in auxiliary entry */ - -struct external_syment -{ - union { - char e_name[E_SYMNMLEN]; - struct { - char e_zeroes[4]; - char e_offset[4]; - } e; - } e; - char e_value[4]; - char e_scnum[2]; - char e_type[2]; - char e_sclass[1]; - char e_numaux[1]; -}; - -#define N_BTMASK (0xf) -#define N_TMASK (0x30) -#define N_BTSHFT (4) -#define N_TSHIFT (2) - -union external_auxent { - struct { - char x_tagndx[4]; /* str, un, or enum tag indx */ - union { - struct { - char x_lnno[2]; /* declaration line number */ - char x_size[2]; /* str/union/array size */ - } x_lnsz; - char x_fsize[4]; /* size of function */ - } x_misc; - union { - struct { /* if ISFCN, tag, or .bb */ - char x_lnnoptr[4]; /* ptr to fcn line # */ - char x_endndx[4]; /* entry ndx past block end */ - } x_fcn; - struct { /* if ISARY, up to 4 dimen. */ - char x_dimen[E_DIMNUM][2]; - } x_ary; - } x_fcnary; - char x_tvndx[2]; /* tv index */ - } x_sym; - - union { - char x_fname[E_FILNMLEN]; - struct { - char x_zeroes[4]; - char x_offset[4]; - } x_n; - } x_file; - - struct { - char x_scnlen[4]; /* section length */ - char x_nreloc[2]; /* # relocation entries */ - char x_nlinno[2]; /* # line numbers */ - } x_scn; - - struct { - char x_tvfill[4]; /* tv fill value */ - char x_tvlen[2]; /* length of .tv */ - char x_tvran[2][2]; /* tv range */ - } x_tv; /* info about .tv section (in auxent of symbol .tv)) */ - - -}; - -#define SYMENT struct external_syment -#define SYMESZ 18 -#define AUXENT union external_auxent -#define AUXESZ 18 - - -# define _ETEXT "etext" - - -/********************** RELOCATION DIRECTIVES **********************/ - - - -struct external_reloc { - char r_vaddr[4]; - char r_symndx[4]; - char r_type[2]; -}; - - -#define RELOC struct external_reloc -#define RELSZ 10 diff --git a/contrib/gdb/include/coff/i960.h b/contrib/gdb/include/coff/i960.h deleted file mode 100644 index c20893c947819..0000000000000 --- a/contrib/gdb/include/coff/i960.h +++ /dev/null @@ -1,251 +0,0 @@ -/*** coff information for 80960. Origins: Intel corp, natch. */ - -/* NOTE: Tagentries (cf TAGBITS) are no longer used by the 960 */ - -/********************** FILE HEADER **********************/ - -struct external_filehdr { - char f_magic[2]; /* magic number */ - char f_nscns[2]; /* number of sections */ - char f_timdat[4]; /* time & date stamp */ - char f_symptr[4]; /* file pointer to symtab */ - char f_nsyms[4]; /* number of symtab entries */ - char f_opthdr[2]; /* sizeof(optional hdr) */ - char f_flags[2]; /* flags */ -}; - -#define OMAGIC (0407) /* old impure format. data immediately - follows text. both sections are rw. */ -#define NMAGIC (0410) /* split i&d, read-only text */ - -/* -* Intel 80960 (I960) processor flags. -* F_I960TYPE == mask for processor type field. -*/ - -#define F_I960TYPE (0xf000) -#define F_I960CORE (0x1000) -#define F_I960KB (0x2000) -#define F_I960SB (0x2000) -#define F_I960MC (0x3000) -#define F_I960XA (0x4000) -#define F_I960CA (0x5000) -#define F_I960KA (0x6000) -#define F_I960SA (0x6000) -#define F_I960JX (0x7000) -#define F_I960HX (0x8000) - - -/** i80960 Magic Numbers -*/ - -#define I960ROMAGIC (0x160) /* read-only text segments */ -#define I960RWMAGIC (0x161) /* read-write text segments */ - -#define I960BADMAG(x) (((x).f_magic!=I960ROMAGIC) && ((x).f_magic!=I960RWMAGIC)) - -#define FILHDR struct external_filehdr -#define FILHSZ 20 - -/********************** AOUT "OPTIONAL HEADER" **********************/ - -typedef struct { - unsigned long phys_addr; - unsigned long bitarray; -} TAGBITS; - - - -typedef struct -{ - char magic[2]; /* type of file */ - char vstamp[2]; /* version stamp */ - char tsize[4]; /* text size in bytes, padded to FW bdry*/ - char dsize[4]; /* initialized data " " */ - char bsize[4]; /* uninitialized data " " */ - char entry[4]; /* entry pt. */ - char text_start[4]; /* base of text used for this file */ - char data_start[4]; /* base of data used for this file */ - char tagentries[4]; /* number of tag entries to follow */ -} -AOUTHDR; - -/* return a pointer to the tag bits array */ - -#define TAGPTR(aout) ((TAGBITS *) (&(aout.tagentries)+1)) - -/* compute size of a header */ - -/*#define AOUTSZ(aout) (sizeof(AOUTHDR)+(aout.tagentries*sizeof(TAGBITS)))*/ -#define AOUTSZ (sizeof(AOUTHDR)) - - - -/********************** SECTION HEADER **********************/ - - -struct external_scnhdr { - char s_name[8]; /* section name */ - char s_paddr[4]; /* physical address, aliased s_nlib */ - char s_vaddr[4]; /* virtual address */ - char s_size[4]; /* section size */ - char s_scnptr[4]; /* file ptr to raw data for section */ - char s_relptr[4]; /* file ptr to relocation */ - char s_lnnoptr[4]; /* file ptr to line numbers */ - char s_nreloc[2]; /* number of relocation entries */ - char s_nlnno[2]; /* number of line number entries*/ - char s_flags[4]; /* flags */ - char s_align[4]; /* section alignment */ -}; - - -#define SCNHDR struct external_scnhdr -#define SCNHSZ sizeof(SCNHDR) - -/* - * names of "special" sections - */ -#define _TEXT ".text" -#define _DATA ".data" -#define _BSS ".bss" - -/********************** LINE NUMBERS **********************/ - -/* 1 line number entry for every "breakpointable" source line in a section. - * Line numbers are grouped on a per function basis; first entry in a function - * grouping will have l_lnno = 0 and in place of physical address will be the - * symbol table index of the function name. - */ -struct external_lineno { - union { - char l_symndx[4]; /* function name symbol index, iff l_lnno == 0*/ - char l_paddr[4]; /* (physical) address of line number */ - } l_addr; - char l_lnno[2]; /* line number */ - char padding[2]; /* force alignment */ -}; - - -#define LINENO struct external_lineno -#define LINESZ 8 - - -/********************** SYMBOLS **********************/ - -#define E_SYMNMLEN 8 /* # characters in a symbol name */ -#define E_FILNMLEN 14 /* # characters in a file name */ -#define E_DIMNUM 4 /* # array dimensions in auxiliary entry */ - -struct external_syment -{ - union { - char e_name[E_SYMNMLEN]; - struct { - char e_zeroes[4]; - char e_offset[4]; - } e; - } e; - char e_value[4]; - char e_scnum[2]; - char e_flags[2]; - char e_type[4]; - char e_sclass[1]; - char e_numaux[1]; - char pad2[2]; -}; - - - - -#define N_BTMASK (0x1f) -#define N_TMASK (0x60) -#define N_BTSHFT (5) -#define N_TSHIFT (2) - -union external_auxent { - struct { - char x_tagndx[4]; /* str, un, or enum tag indx */ - union { - struct { - char x_lnno[2]; /* declaration line number */ - char x_size[2]; /* str/union/array size */ - } x_lnsz; - char x_fsize[4]; /* size of function */ - } x_misc; - union { - struct { /* if ISFCN, tag, or .bb */ - char x_lnnoptr[4]; /* ptr to fcn line # */ - char x_endndx[4]; /* entry ndx past block end */ - } x_fcn; - struct { /* if ISARY, up to 4 dimen. */ - char x_dimen[E_DIMNUM][2]; - } x_ary; - } x_fcnary; - char x_tvndx[2]; /* tv index */ - } x_sym; - - union { - char x_fname[E_FILNMLEN]; - struct { - char x_zeroes[4]; - char x_offset[4]; - } x_n; - } x_file; - - struct { - char x_scnlen[4]; /* section length */ - char x_nreloc[2]; /* # relocation entries */ - char x_nlinno[2]; /* # line numbers */ - } x_scn; - - struct { - char x_tvfill[4]; /* tv fill value */ - char x_tvlen[2]; /* length of .tv */ - char x_tvran[2][2]; /* tv range */ - } x_tv; /* info about .tv section (in auxent of symbol .tv)) */ - - /****************************************** - * I960-specific *2nd* aux. entry formats - ******************************************/ - struct { - /* This is a very old typo that keeps getting propagated. */ -#define x_stdindx x_stindx - char x_stindx[4]; /* sys. table entry */ - } x_sc; /* system call entry */ - - struct { - char x_balntry[4]; /* BAL entry point */ - } x_bal; /* BAL-callable function */ - - struct { - char x_timestamp[4]; /* time stamp */ - char x_idstring[20]; /* producer identity string */ - } x_ident; /* Producer ident info */ - -}; - - - -#define SYMENT struct external_syment -#define SYMESZ sizeof(SYMENT) /* FIXME - calc by hand */ -#define AUXENT union external_auxent -#define AUXESZ sizeof(AUXENT) /* FIXME - calc by hand */ - -# define _ETEXT "_etext" - -/********************** RELOCATION DIRECTIVES **********************/ - -struct external_reloc { - char r_vaddr[4]; - char r_symndx[4]; - char r_type[2]; - char pad[2]; -}; - - -/* Relevent values for r_type and i960. Would someone please document them */ - - -#define RELOC struct external_reloc -#define RELSZ 12 - diff --git a/contrib/gdb/include/coff/internal.h b/contrib/gdb/include/coff/internal.h deleted file mode 100644 index b43cf766421c7..0000000000000 --- a/contrib/gdb/include/coff/internal.h +++ /dev/null @@ -1,648 +0,0 @@ -/* Internal format of COFF object file data structures, for GNU BFD. - This file is part of BFD, the Binary File Descriptor library. */ - -#ifndef GNU_COFF_INTERNAL_H -#define GNU_COFF_INTERNAL_H 1 - -/* First, make "signed char" work, even on old compilers. */ -#ifndef signed -#ifndef __STDC__ -#define signed /**/ -#endif -#endif - -/********************** FILE HEADER **********************/ - -/* extra stuff in a PE header. */ - -struct internal_extra_pe_filehdr -{ - /* DOS header data follows for PE stuff */ - unsigned short e_magic; /* Magic number, 0x5a4d */ - unsigned short e_cblp; /* Bytes on last page of file, 0x90 */ - unsigned short e_cp; /* Pages in file, 0x3 */ - unsigned short e_crlc; /* Relocations, 0x0 */ - unsigned short e_cparhdr; /* Size of header in paragraphs, 0x4 */ - unsigned short e_minalloc; /* Minimum extra paragraphs needed, 0x0 */ - unsigned short e_maxalloc; /* Maximum extra paragraphs needed, 0xFFFF */ - unsigned short e_ss; /* Initial (relative) SS value, 0x0 */ - unsigned short e_sp; /* Initial SP value, 0xb8 */ - unsigned short e_csum; /* Checksum, 0x0 */ - unsigned short e_ip; /* Initial IP value, 0x0 */ - unsigned short e_cs; /* Initial (relative) CS value, 0x0 */ - unsigned short e_lfarlc; /* File address of relocation table, 0x40 */ - unsigned short e_ovno; /* Overlay number, 0x0 */ - unsigned short e_res[4]; /* Reserved words, all 0x0 */ - unsigned short e_oemid; /* OEM identifier (for e_oeminfo), 0x0 */ - unsigned short e_oeminfo; /* OEM information; e_oemid specific, 0x0 */ - unsigned short e_res2[10]; /* Reserved words, all 0x0 */ - bfd_vma e_lfanew; /* File address of new exe header, 0x80 */ - unsigned long dos_message[16]; /* text which always follows dos header */ - bfd_vma nt_signature; /* required NT signature, 0x4550 */ -}; - -struct internal_filehdr -{ - struct internal_extra_pe_filehdr pe; - - /* standard coff internal info */ - unsigned short f_magic; /* magic number */ - unsigned short f_nscns; /* number of sections */ - long f_timdat; /* time & date stamp */ - bfd_vma f_symptr; /* file pointer to symtab */ - long f_nsyms; /* number of symtab entries */ - unsigned short f_opthdr; /* sizeof(optional hdr) */ - unsigned short f_flags; /* flags */ -}; - - -/* Bits for f_flags: - * F_RELFLG relocation info stripped from file - * F_EXEC file is executable (no unresolved external references) - * F_LNNO line numbers stripped from file - * F_LSYMS local symbols stripped from file - * F_AR16WR file is 16-bit little-endian - * F_AR32WR file is 32-bit little-endian - * F_AR32W file is 32-bit big-endian - * F_DYNLOAD rs/6000 aix: dynamically loadable w/imports & exports - * F_SHROBJ rs/6000 aix: file is a shared object - * F_DLL PE format DLL - */ - -#define F_RELFLG (0x0001) -#define F_EXEC (0x0002) -#define F_LNNO (0x0004) -#define F_LSYMS (0x0008) -#define F_AR16WR (0x0080) -#define F_AR32WR (0x0100) -#define F_AR32W (0x0200) -#define F_DYNLOAD (0x1000) -#define F_SHROBJ (0x2000) -#define F_DLL (0x2000) - -/* extra structure which is used in the optional header */ -typedef struct _IMAGE_DATA_DIRECTORY -{ - bfd_vma VirtualAddress; - long Size; -} IMAGE_DATA_DIRECTORY; -#define IMAGE_NUMBEROF_DIRECTORY_ENTRIES 16 - -/* default image base for NT */ -#define NT_EXE_IMAGE_BASE 0x400000 -#define NT_DLL_IMAGE_BASE 0x10000000 - -/* Extra stuff in a PE aouthdr */ - -#define PE_DEF_SECTION_ALIGNMENT 0x1000 -#define PE_DEF_FILE_ALIGNMENT 0x200 - -struct internal_extra_pe_aouthdr -{ - /* PE stuff */ - bfd_vma ImageBase; /* address of specific location in memory that - file is located, NT default 0x10000 */ - - bfd_vma SectionAlignment; /* section alignment default 0x1000 */ - bfd_vma FileAlignment; /* file alignment default 0x200 */ - short MajorOperatingSystemVersion; /* minimum version of the operating */ - short MinorOperatingSystemVersion; /* system req'd for exe, default to 1*/ - short MajorImageVersion; /* user defineable field to store version of */ - short MinorImageVersion; /* exe or dll being created, default to 0 */ - short MajorSubsystemVersion; /* minimum subsystem version required to */ - short MinorSubsystemVersion; /* run exe; default to 3.1 */ - long Reserved1; /* seems to be 0 */ - long SizeOfImage; /* size of memory to allocate for prog */ - long SizeOfHeaders; /* size of PE header and section table */ - long CheckSum; /* set to 0 */ - short Subsystem; - - /* type of subsystem exe uses for user interface, - possible values: - 1 - NATIVE Doesn't require a subsystem - 2 - WINDOWS_GUI runs in Windows GUI subsystem - 3 - WINDOWS_CUI runs in Windows char sub. (console app) - 5 - OS2_CUI runs in OS/2 character subsystem - 7 - POSIX_CUI runs in Posix character subsystem */ - short DllCharacteristics; /* flags for DLL init, use 0 */ - bfd_vma SizeOfStackReserve; /* amount of memory to reserve */ - bfd_vma SizeOfStackCommit; /* amount of memory initially committed for - initial thread's stack, default is 0x1000 */ - bfd_vma SizeOfHeapReserve; /* amount of virtual memory to reserve and */ - bfd_vma SizeOfHeapCommit; /* commit, don't know what to defaut it to */ - long LoaderFlags; /* can probably set to 0 */ - long NumberOfRvaAndSizes; /* number of entries in next entry, 16 */ - IMAGE_DATA_DIRECTORY DataDirectory[IMAGE_NUMBEROF_DIRECTORY_ENTRIES]; -}; - -/********************** AOUT "OPTIONAL HEADER" **********************/ -struct internal_aouthdr -{ - short magic; /* type of file */ - short vstamp; /* version stamp */ - bfd_vma tsize; /* text size in bytes, padded to FW bdry*/ - bfd_vma dsize; /* initialized data " " */ - bfd_vma bsize; /* uninitialized data " " */ - bfd_vma entry; /* entry pt. */ - bfd_vma text_start; /* base of text used for this file */ - bfd_vma data_start; /* base of data used for this file */ - - /* i960 stuff */ - unsigned long tagentries; /* number of tag entries to follow */ - - /* RS/6000 stuff */ - unsigned long o_toc; /* address of TOC */ - short o_snentry; /* section number for entry point */ - short o_sntext; /* section number for text */ - short o_sndata; /* section number for data */ - short o_sntoc; /* section number for toc */ - short o_snloader; /* section number for loader section */ - short o_snbss; /* section number for bss */ - short o_algntext; /* max alignment for text */ - short o_algndata; /* max alignment for data */ - short o_modtype; /* Module type field, 1R,RE,RO */ - short o_cputype; /* Encoded CPU type */ - unsigned long o_maxstack; /* max stack size allowed. */ - unsigned long o_maxdata; /* max data size allowed. */ - - /* ECOFF stuff */ - bfd_vma bss_start; /* Base of bss section. */ - bfd_vma gp_value; /* GP register value. */ - unsigned long gprmask; /* General registers used. */ - unsigned long cprmask[4]; /* Coprocessor registers used. */ - unsigned long fprmask; /* Floating pointer registers used. */ - - /* Apollo stuff */ - long o_inlib; /* inlib data */ - long o_sri; /* Static Resource Information */ - long vid[2]; /* Version id */ - - - struct internal_extra_pe_aouthdr pe; - -}; - -/********************** STORAGE CLASSES **********************/ - -/* This used to be defined as -1, but now n_sclass is unsigned. */ -#define C_EFCN 0xff /* physical end of function */ -#define C_NULL 0 -#define C_AUTO 1 /* automatic variable */ -#define C_EXT 2 /* external symbol */ -#define C_STAT 3 /* static */ -#define C_REG 4 /* register variable */ -#define C_EXTDEF 5 /* external definition */ -#define C_LABEL 6 /* label */ -#define C_ULABEL 7 /* undefined label */ -#define C_MOS 8 /* member of structure */ -#define C_ARG 9 /* function argument */ -#define C_STRTAG 10 /* structure tag */ -#define C_MOU 11 /* member of union */ -#define C_UNTAG 12 /* union tag */ -#define C_TPDEF 13 /* type definition */ -#define C_USTATIC 14 /* undefined static */ -#define C_ENTAG 15 /* enumeration tag */ -#define C_MOE 16 /* member of enumeration */ -#define C_REGPARM 17 /* register parameter */ -#define C_FIELD 18 /* bit field */ -#define C_AUTOARG 19 /* auto argument */ -#define C_LASTENT 20 /* dummy entry (end of block) */ -#define C_BLOCK 100 /* ".bb" or ".eb" */ -#define C_FCN 101 /* ".bf" or ".ef" */ -#define C_EOS 102 /* end of structure */ -#define C_FILE 103 /* file name */ -#define C_LINE 104 /* line # reformatted as symbol table entry */ -#define C_ALIAS 105 /* duplicate tag */ -#define C_HIDDEN 106 /* ext symbol in dmert public lib */ - -/* New storage classes for WINDOWS_NT */ -#define C_SECTION 104 /* section name */ -#define C_NT_WEAK 105 /* weak external */ - - /* New storage classes for 80960 */ - -/* C_LEAFPROC is obsolete. Use C_LEAFEXT or C_LEAFSTAT */ -#define C_LEAFPROC 108 /* Leaf procedure, "call" via BAL */ - -#define C_SCALL 107 /* Procedure reachable via system call */ -#define C_LEAFEXT 108 /* External leaf */ -#define C_LEAFSTAT 113 /* Static leaf */ -#define C_OPTVAR 109 /* Optimized variable */ -#define C_DEFINE 110 /* Preprocessor #define */ -#define C_PRAGMA 111 /* Advice to compiler or linker */ -#define C_SEGMENT 112 /* 80960 segment name */ - - /* Storage classes for m88k */ -#define C_SHADOW 107 /* shadow symbol */ -#define C_VERSION 108 /* coff version symbol */ - - /* New storage classes for RS/6000 */ -#define C_HIDEXT 107 /* Un-named external symbol */ -#define C_BINCL 108 /* Marks beginning of include file */ -#define C_EINCL 109 /* Marks ending of include file */ - - /* storage classes for stab symbols for RS/6000 */ -#define C_GSYM (0x80) -#define C_LSYM (0x81) -#define C_PSYM (0x82) -#define C_RSYM (0x83) -#define C_RPSYM (0x84) -#define C_STSYM (0x85) -#define C_TCSYM (0x86) -#define C_BCOMM (0x87) -#define C_ECOML (0x88) -#define C_ECOMM (0x89) -#define C_DECL (0x8c) -#define C_ENTRY (0x8d) -#define C_FUN (0x8e) -#define C_BSTAT (0x8f) -#define C_ESTAT (0x90) - -/********************** SECTION HEADER **********************/ -struct internal_scnhdr -{ - char s_name[8]; /* section name */ - bfd_vma s_paddr; /* physical address, aliased s_nlib */ - bfd_vma s_vaddr; /* virtual address */ - bfd_vma s_size; /* section size */ - bfd_vma s_scnptr; /* file ptr to raw data for section */ - bfd_vma s_relptr; /* file ptr to relocation */ - bfd_vma s_lnnoptr; /* file ptr to line numbers */ - unsigned long s_nreloc; /* number of relocation entries */ - unsigned long s_nlnno; /* number of line number entries*/ - long s_flags; /* flags */ - long s_align; /* used on I960 */ -}; - -/* - * s_flags "type" - */ -#define STYP_REG (0x0000) /* "regular": allocated, relocated, loaded */ -#define STYP_DSECT (0x0001) /* "dummy": relocated only*/ -#define STYP_NOLOAD (0x0002) /* "noload": allocated, relocated, not loaded */ -#define STYP_GROUP (0x0004) /* "grouped": formed of input sections */ -#define STYP_PAD (0x0008) /* "padding": not allocated, not relocated, loaded */ -#define STYP_COPY (0x0010) /* "copy": for decision function used by field update; not allocated, not relocated, - loaded; reloc & lineno entries processed normally */ -#define STYP_TEXT (0x0020) /* section contains text only */ -#define S_SHRSEG (0x0020) /* In 3b Update files (output of ogen), sections which appear in SHARED segments of the Pfile - will have the S_SHRSEG flag set by ogen, to inform dufr that updating 1 copy of the proc. will - update all process invocations. */ -#define STYP_DATA (0x0040) /* section contains data only */ -#define STYP_BSS (0x0080) /* section contains bss only */ -#define S_NEWFCN (0x0100) /* In a minimal file or an update file, a new function (as compared with a replaced function) */ -#define STYP_INFO (0x0200) /* comment: not allocated not relocated, not loaded */ -#define STYP_OVER (0x0400) /* overlay: relocated not allocated or loaded */ -#define STYP_LIB (0x0800) /* for .lib: same as INFO */ -#define STYP_MERGE (0x2000) /* merge section -- combines with text, data or bss sections only */ -#define STYP_REVERSE_PAD (0x4000) /* section will be padded with no-op instructions wherever padding is necessary and there is a - - word of contiguous bytes - beginning on a word boundary. */ - -#define STYP_LIT 0x8020 /* Literal data (like STYP_TEXT) */ - - - -/********************** LINE NUMBERS **********************/ - -/* 1 line number entry for every "breakpointable" source line in a section. - * Line numbers are grouped on a per function basis; first entry in a function - * grouping will have l_lnno = 0 and in place of physical address will be the - * symbol table index of the function name. - */ - -struct internal_lineno -{ - union - { - long l_symndx; /* function name symbol index, iff l_lnno == 0*/ - long l_paddr; /* (physical) address of line number */ - } l_addr; - unsigned long l_lnno; /* line number */ -}; - -/********************** SYMBOLS **********************/ - -#define SYMNMLEN 8 /* # characters in a symbol name */ -#define FILNMLEN 14 /* # characters in a file name */ -#define DIMNUM 4 /* # array dimensions in auxiliary entry */ - -struct internal_syment -{ - union - { - char _n_name[SYMNMLEN]; /* old COFF version */ - struct - { - long _n_zeroes; /* new == 0 */ - long _n_offset; /* offset into string table */ - } _n_n; - char *_n_nptr[2]; /* allows for overlaying */ - } _n; - long n_value; /* value of symbol */ - short n_scnum; /* section number */ - unsigned short n_flags; /* copy of flags from filhdr */ - unsigned short n_type; /* type and derived type */ - unsigned char n_sclass; /* storage class */ - unsigned char n_numaux; /* number of aux. entries */ -}; - -#define n_name _n._n_name -#define n_zeroes _n._n_n._n_zeroes -#define n_offset _n._n_n._n_offset - - -/* Relocatable symbols have number of the section in which they are defined, - or one of the following: */ - -#define N_UNDEF ((short)0) /* undefined symbol */ -#define N_ABS ((short)-1) /* value of symbol is absolute */ -#define N_DEBUG ((short)-2) /* debugging symbol -- value is meaningless */ -#define N_TV ((short)-3) /* indicates symbol needs preload transfer vector */ -#define P_TV ((short)-4) /* indicates symbol needs postload transfer vector*/ - -/* - * Type of a symbol, in low N bits of the word - */ -#define T_NULL 0 -#define T_VOID 1 /* function argument (only used by compiler) */ -#define T_CHAR 2 /* character */ -#define T_SHORT 3 /* short integer */ -#define T_INT 4 /* integer */ -#define T_LONG 5 /* long integer */ -#define T_FLOAT 6 /* floating point */ -#define T_DOUBLE 7 /* double word */ -#define T_STRUCT 8 /* structure */ -#define T_UNION 9 /* union */ -#define T_ENUM 10 /* enumeration */ -#define T_MOE 11 /* member of enumeration*/ -#define T_UCHAR 12 /* unsigned character */ -#define T_USHORT 13 /* unsigned short */ -#define T_UINT 14 /* unsigned integer */ -#define T_ULONG 15 /* unsigned long */ -#define T_LNGDBL 16 /* long double */ - -/* - * derived types, in n_type -*/ -#define DT_NON (0) /* no derived type */ -#define DT_PTR (1) /* pointer */ -#define DT_FCN (2) /* function */ -#define DT_ARY (3) /* array */ - -#define BTYPE(x) ((x) & N_BTMASK) - -#define ISPTR(x) (((x) & N_TMASK) == (DT_PTR << N_BTSHFT)) -#define ISFCN(x) (((x) & N_TMASK) == (DT_FCN << N_BTSHFT)) -#define ISARY(x) (((x) & N_TMASK) == (DT_ARY << N_BTSHFT)) -#define ISTAG(x) ((x)==C_STRTAG||(x)==C_UNTAG||(x)==C_ENTAG) -#define DECREF(x) ((((x)>>N_TSHIFT)&~N_BTMASK)|((x)&N_BTMASK)) - - -union internal_auxent -{ - struct - { - - union - { - long l; /* str, un, or enum tag indx */ - struct coff_ptr_struct *p; - } x_tagndx; - - union - { - struct - { - unsigned short x_lnno; /* declaration line number */ - unsigned short x_size; /* str/union/array size */ - } x_lnsz; - long x_fsize; /* size of function */ - } x_misc; - - union - { - struct - { /* if ISFCN, tag, or .bb */ - long x_lnnoptr; /* ptr to fcn line # */ - union - { /* entry ndx past block end */ - long l; - struct coff_ptr_struct *p; - } x_endndx; - } x_fcn; - - struct - { /* if ISARY, up to 4 dimen. */ - unsigned short x_dimen[DIMNUM]; - } x_ary; - } x_fcnary; - - unsigned short x_tvndx; /* tv index */ - } x_sym; - - union - { - char x_fname[FILNMLEN]; - struct - { - long x_zeroes; - long x_offset; - } x_n; - } x_file; - - struct - { - long x_scnlen; /* section length */ - unsigned short x_nreloc; /* # relocation entries */ - unsigned short x_nlinno; /* # line numbers */ - } x_scn; - - struct - { - long x_tvfill; /* tv fill value */ - unsigned short x_tvlen; /* length of .tv */ - unsigned short x_tvran[2]; /* tv range */ - } x_tv; /* info about .tv section (in auxent of symbol .tv)) */ - - /****************************************** - * RS/6000-specific auxent - last auxent for every external symbol - ******************************************/ - struct - { - union - { /* csect length or enclosing csect */ - long l; - struct coff_ptr_struct *p; - } x_scnlen; - long x_parmhash; /* parm type hash index */ - unsigned short x_snhash; /* sect num with parm hash */ - unsigned char x_smtyp; /* symbol align and type */ - /* 0-4 - Log 2 of alignment */ - /* 5-7 - symbol type */ - unsigned char x_smclas; /* storage mapping class */ - long x_stab; /* dbx stab info index */ - unsigned short x_snstab; /* sect num with dbx stab */ - } x_csect; /* csect definition information */ - -/* x_smtyp values: */ - -#define SMTYP_ALIGN(x) ((x) >> 3) /* log2 of alignment */ -#define SMTYP_SMTYP(x) ((x) & 0x7) /* symbol type */ -/* Symbol type values: */ -#define XTY_ER 0 /* External reference */ -#define XTY_SD 1 /* Csect definition */ -#define XTY_LD 2 /* Label definition */ -#define XTY_CM 3 /* .BSS */ -#define XTY_EM 4 /* Error message */ -#define XTY_US 5 /* "Reserved for internal use" */ - -/* x_smclas values: */ - -#define XMC_PR 0 /* Read-only program code */ -#define XMC_RO 1 /* Read-only constant */ -#define XMC_DB 2 /* Read-only debug dictionary table */ -#define XMC_TC 3 /* Read-write general TOC entry */ -#define XMC_UA 4 /* Read-write unclassified */ -#define XMC_RW 5 /* Read-write data */ -#define XMC_GL 6 /* Read-only global linkage */ -#define XMC_XO 7 /* Read-only extended operation */ -#define XMC_SV 8 /* Read-only supervisor call */ -#define XMC_BS 9 /* Read-write BSS */ -#define XMC_DS 10 /* Read-write descriptor csect */ -#define XMC_UC 11 /* Read-write unnamed Fortran common */ -#define XMC_TI 12 /* Read-only traceback index csect */ -#define XMC_TB 13 /* Read-only traceback table csect */ -/* 14 ??? */ -#define XMC_TC0 15 /* Read-write TOC anchor */ -#define XMC_TD 16 /* Read-write data in TOC */ - - /****************************************** - * I960-specific *2nd* aux. entry formats - ******************************************/ - struct - { - /* This is a very old typo that keeps getting propagated. */ -#define x_stdindx x_stindx - long x_stindx; /* sys. table entry */ - } x_sc; /* system call entry */ - - struct - { - unsigned long x_balntry; /* BAL entry point */ - } x_bal; /* BAL-callable function */ - - struct - { - unsigned long x_timestamp; /* time stamp */ - char x_idstring[20]; /* producer identity string */ - } x_ident; /* Producer ident info */ - -}; - -/********************** RELOCATION DIRECTIVES **********************/ - -struct internal_reloc -{ - bfd_vma r_vaddr; /* Virtual address of reference */ - long r_symndx; /* Index into symbol table */ - unsigned short r_type; /* Relocation type */ - unsigned char r_size; /* Used by RS/6000 and ECOFF */ - unsigned char r_extern; /* Used by ECOFF */ - unsigned long r_offset; /* Used by Alpha ECOFF, SPARC, others */ -}; - -#define R_RELBYTE 017 -#define R_RELWORD 020 -#define R_PCRBYTE 022 -#define R_PCRWORD 023 -#define R_PCRLONG 024 - -#define R_DIR16 01 -#define R_DIR32 06 -#define R_PCLONG 020 -#define R_RELBYTE 017 -#define R_RELWORD 020 -#define R_IMAGEBASE 07 - - -#define R_PCR16L 128 -#define R_PCR26L 129 -#define R_VRT16 130 -#define R_HVRT16 131 -#define R_LVRT16 132 -#define R_VRT32 133 -#define R_RELLONG (0x11) /* Direct 32-bit relocation */ -#define R_IPRSHORT (0x18) -#define R_IPRMED (0x19) /* 24-bit ip-relative relocation */ -#define R_IPRLONG (0x1a) -#define R_OPTCALL (0x1b) /* 32-bit optimizable call (leafproc/sysproc) */ -#define R_OPTCALLX (0x1c) /* 64-bit optimizable call (leafproc/sysproc) */ -#define R_GETSEG (0x1d) -#define R_GETPA (0x1e) -#define R_TAGWORD (0x1f) -#define R_JUMPTARG 0x20 /* strange 29k 00xx00xx reloc */ - - -#define R_MOVB1 0x41 /* Special h8 16bit or 8 bit reloc for mov.b */ -#define R_MOVB2 0x42 /* Special h8 opcode for 8bit which could be 16 */ -#define R_JMP1 0x43 /* Special h8 16bit jmp which could be pcrel */ -#define R_JMP2 0x44 /* a branch which used to be a jmp */ -#define R_RELLONG_NEG 0x45 - -#define R_JMPL1 0x46 /* Special h8 24bit jmp which could be pcrel */ -#define R_JMPL_B8 0x47 /* a 8 bit pcrel which used to be a jmp */ - -#define R_MOVLB1 0x48 /* Special h8 24bit or 8 bit reloc for mov.b */ -#define R_MOVLB2 0x49 /* Special h8 opcode for 8bit which could be 24 */ - -/* An h8300 memory indirect jump/call. Forces the address of the jump/call - target into the function vector (in page zero), and the address of the - vector entry to be placed in the jump/call instruction. */ -#define R_MEM_INDIRECT 0x4a - -/* Z8k modes */ -#define R_IMM16 0x01 /* 16 bit abs */ -#define R_JR 0x02 /* jr 8 bit disp */ -#define R_IMM4L 0x23 /* low nibble */ -#define R_IMM8 0x22 /* 8 bit abs */ -#define R_IMM32 R_RELLONG /* 32 bit abs */ -#define R_CALL R_DA /* Absolute address which could be a callr */ -#define R_JP R_DA /* Absolute address which could be a jp */ -#define R_REL16 0x04 /* 16 bit PC rel */ -#define R_CALLR 0x05 /* callr 12 bit disp */ -#define R_SEG 0x10 /* set if in segmented mode */ -#define R_IMM4H 0x24 /* high nibble */ -#define R_DISP7 0x25 /* djnz displacement */ - -/* H8500 modes */ - -#define R_H8500_IMM8 1 /* 8 bit immediate */ -#define R_H8500_IMM16 2 /* 16 bit immediate */ -#define R_H8500_PCREL8 3 /* 8 bit pcrel */ -#define R_H8500_PCREL16 4 /* 16 bit pcrel */ -#define R_H8500_HIGH8 5 /* high 8 bits of 24 bit address */ -#define R_H8500_LOW16 7 /* low 16 bits of 24 bit immediate */ -#define R_H8500_IMM24 6 /* 24 bit immediate */ -#define R_H8500_IMM32 8 /* 32 bit immediate */ -#define R_H8500_HIGH16 9 /* high 16 bits of 32 bit immediate */ - -/* W65 modes */ - -#define R_W65_ABS8 1 /* addr & 0xff */ -#define R_W65_ABS16 2 /* addr & 0xffff */ -#define R_W65_ABS24 3 /* addr & 0xffffff */ - -#define R_W65_ABS8S8 4 /* (addr >> 8) & 0xff */ -#define R_W65_ABS8S16 5 /* (addr >> 16) & 0xff */ - -#define R_W65_ABS16S8 6 /* (addr >> 8) & 0ffff */ -#define R_W65_ABS16S16 7 /* (addr >> 16) & 0ffff */ - -#define R_W65_PCR8 8 -#define R_W65_PCR16 9 - -#define R_W65_DP 10 /* direct page 8 bits only */ - -#endif /* GNU_COFF_INTERNAL_H */ diff --git a/contrib/gdb/include/coff/m68k.h b/contrib/gdb/include/coff/m68k.h deleted file mode 100644 index a3c15be161848..0000000000000 --- a/contrib/gdb/include/coff/m68k.h +++ /dev/null @@ -1,221 +0,0 @@ -/*** coff information for M68K */ - -#ifndef GNU_COFF_M68K_H -#define GNU_COFF_M68K_H 1 - -/********************** FILE HEADER **********************/ - -struct external_filehdr { - char f_magic[2]; /* magic number */ - char f_nscns[2]; /* number of sections */ - char f_timdat[4]; /* time & date stamp */ - char f_symptr[4]; /* file pointer to symtab */ - char f_nsyms[4]; /* number of symtab entries */ - char f_opthdr[2]; /* sizeof(optional hdr) */ - char f_flags[2]; /* flags */ -}; - - -/* Motorola 68000/68008/68010/68020 */ -#define MC68MAGIC 0520 -#define MC68KWRMAGIC 0520 /* writeable text segments */ -#define MC68TVMAGIC 0521 -#define MC68KROMAGIC 0521 /* readonly shareable text segments */ -#define MC68KPGMAGIC 0522 /* demand paged text segments */ -#define M68MAGIC 0210 -#define M68TVMAGIC 0211 - -/* this is the magic of the Bull dpx/2 */ -#define MC68KBCSMAGIC 0526 - -/* This is Lynx's all-platform magic number for executables. */ - -#define LYNXCOFFMAGIC 0415 - -#define OMAGIC M68MAGIC - -/* This intentionally does not include MC68KBCSMAGIC; it only includes - magic numbers which imply that names do not have underscores. */ -#define M68KBADMAG(x) (((x).f_magic!=MC68MAGIC) && ((x).f_magic!=MC68KWRMAGIC) && ((x).f_magic!=MC68TVMAGIC) && \ - ((x).f_magic!=MC68KROMAGIC) && ((x).f_magic!=MC68KPGMAGIC) && ((x).f_magic!=M68MAGIC) && ((x).f_magic!=M68TVMAGIC) && ((x).f_magic!=LYNXCOFFMAGIC) ) - -/* Magic numbers for the a.out header. */ - -#define PAGEMAGICEXECSWAPPED 0407 /* executable (swapped) */ -#define PAGEMAGICPEXECSWAPPED 0410 /* pure executable (swapped) */ -#define PAGEMAGICPEXECTSHLIB 0443 /* pure executable (target shared library) */ -#define PAGEMAGICPEXECPAGED 0413 /* pure executable (paged) */ - -#define FILHDR struct external_filehdr -#define FILHSZ sizeof(FILHDR) - - -/********************** AOUT "OPTIONAL HEADER" **********************/ - - -typedef struct -{ - char magic[2]; /* type of file */ - char vstamp[2]; /* version stamp */ - char tsize[4]; /* text size in bytes, padded to FW bdry*/ - char dsize[4]; /* initialized data " " */ - char bsize[4]; /* uninitialized data " " */ - char entry[4]; /* entry pt. */ - char text_start[4]; /* base of text used for this file */ - char data_start[4]; /* base of data used for this file */ -} -AOUTHDR; - -#define AOUTSZ (sizeof(AOUTHDR)) - - - -/********************** SECTION HEADER **********************/ - - -struct external_scnhdr { - char s_name[8]; /* section name */ - char s_paddr[4]; /* physical address, aliased s_nlib */ - char s_vaddr[4]; /* virtual address */ - char s_size[4]; /* section size */ - char s_scnptr[4]; /* file ptr to raw data for section */ - char s_relptr[4]; /* file ptr to relocation */ - char s_lnnoptr[4]; /* file ptr to line numbers */ - char s_nreloc[2]; /* number of relocation entries */ - char s_nlnno[2]; /* number of line number entries*/ - char s_flags[4]; /* flags */ -}; - -/* - * names of "special" sections - */ -#define _TEXT ".text" -#define _DATA ".data" -#define _BSS ".bss" -#define _COMMENT ".comment" - -#define SCNHDR struct external_scnhdr -#define SCNHSZ sizeof(SCNHDR) - - -/********************** LINE NUMBERS **********************/ - -/* 1 line number entry for every "breakpointable" source line in a section. - * Line numbers are grouped on a per function basis; first entry in a function - * grouping will have l_lnno = 0 and in place of physical address will be the - * symbol table index of the function name. - */ -struct external_lineno { - union { - char l_symndx[4]; /* function name symbol index, iff l_lnno == 0*/ - char l_paddr[4]; /* (physical) address of line number */ - } l_addr; - char l_lnno[2]; /* line number */ -}; - - -#define LINENO struct external_lineno -#define LINESZ sizeof(LINENO) - - -/********************** SYMBOLS **********************/ - -#define E_SYMNMLEN 8 /* # characters in a symbol name */ -#define E_FILNMLEN 14 /* # characters in a file name */ -#define E_DIMNUM 4 /* # array dimensions in auxiliary entry */ - -struct external_syment -{ - union { - char e_name[E_SYMNMLEN]; - struct { - char e_zeroes[4]; - char e_offset[4]; - } e; - } e; - char e_value[4]; - char e_scnum[2]; - char e_type[2]; - char e_sclass[1]; - char e_numaux[1]; -}; - - - -#define N_BTMASK (017) -#define N_TMASK (060) -#define N_BTSHFT (4) -#define N_TSHIFT (2) - - -union external_auxent { - struct { - char x_tagndx[4]; /* str, un, or enum tag indx */ - union { - struct { - char x_lnno[2]; /* declaration line number */ - char x_size[2]; /* str/union/array size */ - } x_lnsz; - char x_fsize[4]; /* size of function */ - } x_misc; - union { - struct { /* if ISFCN, tag, or .bb */ - char x_lnnoptr[4]; /* ptr to fcn line # */ - char x_endndx[4]; /* entry ndx past block end */ - } x_fcn; - struct { /* if ISARY, up to 4 dimen. */ - char x_dimen[E_DIMNUM][2]; - } x_ary; - } x_fcnary; - char x_tvndx[2]; /* tv index */ - } x_sym; - - union { - char x_fname[E_FILNMLEN]; - struct { - char x_zeroes[4]; - char x_offset[4]; - } x_n; - } x_file; - - struct { - char x_scnlen[4]; /* section length */ - char x_nreloc[2]; /* # relocation entries */ - char x_nlinno[2]; /* # line numbers */ - } x_scn; - - struct { - char x_tvfill[4]; /* tv fill value */ - char x_tvlen[2]; /* length of .tv */ - char x_tvran[2][2]; /* tv range */ - } x_tv; /* info about .tv section (in auxent of symbol .tv)) */ - - -}; - -#define SYMENT struct external_syment -#define SYMESZ 18 -#define AUXENT union external_auxent -#define AUXESZ 18 - - - -/********************** RELOCATION DIRECTIVES **********************/ - - -struct external_reloc { - char r_vaddr[4]; - char r_symndx[4]; - char r_type[2]; -#ifdef M68K_COFF_OFFSET - char r_offset[4]; -#endif - -}; - - -#define RELOC struct external_reloc - -#define RELSZ sizeof(struct external_reloc) - -#endif /* GNU_COFF_M68K_H */ diff --git a/contrib/gdb/include/coff/m88k.h b/contrib/gdb/include/coff/m88k.h deleted file mode 100644 index 9068dd3f1245d..0000000000000 --- a/contrib/gdb/include/coff/m88k.h +++ /dev/null @@ -1,218 +0,0 @@ -/*** coff information for 88k bcs */ - -/********************** FILE HEADER **********************/ -struct external_filehdr { - char f_magic[2]; /* magic number */ - char f_nscns[2]; /* number of sections */ - char f_timdat[4]; /* time & date stamp */ - char f_symptr[4]; /* file pointer to symtab */ - char f_nsyms[4]; /* number of symtab entries */ - char f_opthdr[2]; /* sizeof(optional hdr) */ - char f_flags[2]; /* flags */ -}; - -#define MC88MAGIC 0540 /* 88k BCS executable */ -#define MC88DMAGIC 0541 /* DG/UX executable */ -#define MC88OMAGIC 0555 /* Object file */ - -#define MC88BADMAG(x) (((x).f_magic!=MC88MAGIC) &&((x).f_magic!=MC88DMAGIC) && ((x).f_magic != MC88OMAGIC)) - -#define FILHDR struct external_filehdr -#define FILHSZ sizeof(FILHDR) - - -/********************** AOUT "OPTIONAL HEADER" **********************/ - - -#define PAGEMAGIC3 0414 /* Split i&d, zero mapped */ -#define PAGEMAGICBCS 0413 - - -typedef struct -{ - char magic[2]; /* type of file */ - char vstamp[2]; /* version stamp */ - char tsize[4]; /* text size in bytes, padded to FW bdry*/ - char dsize[4]; /* initialized data " " */ - char bsize[4]; /* uninitialized data " " */ - char entry[4]; /* entry pt. */ - char text_start[4]; /* base of text used for this file */ - char data_start[4]; /* base of data used for this file */ -} -AOUTHDR; - - -/* compute size of a header */ - -#define AOUTSZ (sizeof(AOUTHDR)) - - -/********************** SECTION HEADER **********************/ - - -struct external_scnhdr -{ - char s_name[8]; /* section name */ - char s_paddr[4]; /* physical address, aliased s_nlib */ - char s_vaddr[4]; /* virtual address */ - char s_size[4]; /* section size */ - char s_scnptr[4]; /* file ptr to raw data for section */ - char s_relptr[4]; /* file ptr to relocation */ - char s_lnnoptr[4]; /* file ptr to line numbers */ - char s_nreloc[4]; /* number of relocation entries */ - char s_nlnno[4]; /* number of line number entries*/ - char s_flags[4]; /* flags */ -}; - - -#define SCNHDR struct external_scnhdr -#define SCNHSZ sizeof(SCNHDR) - -/* - * names of "special" sections - */ -#define _TEXT ".text" -#define _DATA ".data" -#define _BSS ".bss" -#define _COMMENT ".comment" - -/********************** LINE NUMBERS **********************/ - -/* 1 line number entry for every "breakpointable" source line in a section. - * Line numbers are grouped on a per function basis; first entry in a function - * grouping will have l_lnno = 0 and in place of physical address will be the - * symbol table index of the function name. - */ -struct external_lineno{ - union { - char l_symndx[4]; /* function name symbol index, iff l_lnno == 0*/ - char l_paddr[4]; /* (physical) address of line number */ - } l_addr; - - char l_lnno[4]; - -}; - -#define LINENO struct external_lineno -#define LINESZ 8 - - -/********************** SYMBOLS **********************/ - -#define E_SYMNMLEN 8 /* # characters in a symbol name */ -#define E_FILNMLEN 14 /* # characters in a file name */ -#define E_DIMNUM 4 /* # array dimensions in auxiliary entry */ - -struct external_syment -{ - union { - char e_name[E_SYMNMLEN]; - struct { - char e_zeroes[4]; - char e_offset[4]; - } e; - } e; - char e_value[4]; - char e_scnum[2]; - char e_type[2]; - char e_sclass[1]; - char e_numaux[1]; - char pad2[2]; -}; - - - - -#define N_BTMASK 017 -#define N_TMASK 060 -#define N_BTSHFT 4 -#define N_TSHIFT 2 - - -/* Note that this isn't the same shape as other coffs */ -union external_auxent { - struct { - char x_tagndx[4]; /* str, un, or enum tag indx */ - /* 4 */ - union { - char x_fsize[4]; /* size of function */ - struct { - char x_lnno[4]; /* declaration line number */ - char x_size[4]; /* str/union/array size */ - } x_lnsz; - } x_misc; - - /* 12 */ - union { - struct { /* if ISFCN, tag, or .bb */ - char x_lnnoptr[4]; /* ptr to fcn line # */ - char x_endndx[4]; /* entry ndx past block end */ - } x_fcn; - struct { /* if ISARY, up to 4 dimen. */ - char x_dimen[E_DIMNUM][2]; - } x_ary; - } x_fcnary; - /* 20 */ - - } x_sym; - - union { - char x_fname[E_FILNMLEN]; - struct { - char x_zeroes[4]; - char x_offset[4]; - } x_n; - } x_file; - - struct { - char x_scnlen[4]; /* section length */ - char x_nreloc[4]; /* # relocation entries */ - char x_nlinno[4]; /* # line numbers */ - } x_scn; - - struct { - char x_tvfill[4]; /* tv fill value */ - char x_tvlen[2]; /* length of .tv */ - char x_tvran[2][2]; /* tv range */ - } x_tv; /* info about .tv section (in auxent of symbol .tv)) */ - -}; - -#define GET_FCN_LNNOPTR(abfd, ext) bfd_h_get_32(abfd, (bfd_byte *)ext->x_sym.x_fcnary.x_fcn.x_lnnoptr) -#define GET_FCN_ENDNDX(abfd, ext) bfd_h_get_32(abfd, (bfd_byte *) ext->x_sym.x_fcnary.x_fcn.x_endndx) -#define PUT_FCN_LNNOPTR(abfd, in, ext) bfd_h_put_32(abfd, in, (bfd_byte *) ext->x_sym.x_fcnary.x_fcn.x_lnnoptr) -#define PUT_FCN_ENDNDX(abfd, in, ext) bfd_h_put_32(abfd, in, (bfd_byte *) ext->x_sym.x_fcnary.x_fcn.x_endndx) -#define GET_LNSZ_SIZE(abfd, ext) bfd_h_get_32(abfd, (bfd_byte *) ext->x_sym.x_misc.x_lnsz.x_size) -#define GET_LNSZ_LNNO(abfd, ext) bfd_h_get_32(abfd, (bfd_byte *) ext->x_sym.x_misc.x_lnsz.x_lnno) -#define PUT_LNSZ_LNNO(abfd, in, ext) bfd_h_put_32(abfd, in, (bfd_byte *) ext->x_sym.x_misc.x_lnsz.x_lnno) -#define PUT_LNSZ_SIZE(abfd, in, ext) bfd_h_put_32(abfd, in, (bfd_byte *) ext->x_sym.x_misc.x_lnsz.x_size) -#define GET_SCN_SCNLEN(abfd, ext) bfd_h_get_32(abfd, (bfd_byte *) ext->x_scn.x_scnlen) -#define GET_SCN_NRELOC(abfd, ext) bfd_h_get_32(abfd, (bfd_byte *) ext->x_scn.x_nreloc) -#define GET_SCN_NLINNO(abfd, ext) bfd_h_get_32(abfd, (bfd_byte *) ext->x_scn.x_nlinno) -#define PUT_SCN_SCNLEN(abfd,in, ext) bfd_h_put_32(abfd, in, (bfd_byte *) ext->x_scn.x_scnlen) -#define PUT_SCN_NRELOC(abfd,in, ext) bfd_h_put_32(abfd, in, (bfd_byte *)ext->x_scn.x_nreloc) -#define PUT_SCN_NLINNO(abfd,in, ext) bfd_h_put_32(abfd,in, (bfd_byte *) ext->x_scn.x_nlinno) -#define GET_LINENO_LNNO(abfd, ext) bfd_h_get_32(abfd, (bfd_byte *) (ext->l_lnno)) -#define PUT_LINENO_LNNO(abfd,val, ext) bfd_h_put_32(abfd,val, (bfd_byte *) (ext->l_lnno)); - - - -#define SYMENT struct external_syment -#define SYMESZ 20 -#define AUXENT union external_auxent -#define AUXESZ 20 - - -/********************** RELOCATION DIRECTIVES **********************/ - -struct external_reloc { - char r_vaddr[4]; - char r_symndx[4]; - char r_type[2]; - char r_offset[2]; -}; - -#define RELOC struct external_reloc -#define RELSZ 12 - -#define NO_TVNDX diff --git a/contrib/gdb/include/coff/mips.h b/contrib/gdb/include/coff/mips.h deleted file mode 100644 index f35187e83b174..0000000000000 --- a/contrib/gdb/include/coff/mips.h +++ /dev/null @@ -1,368 +0,0 @@ -/* ECOFF support on MIPS machines. - coff/ecoff.h must be included before this file. */ - -/********************** FILE HEADER **********************/ - -struct external_filehdr { - unsigned char f_magic[2]; /* magic number */ - unsigned char f_nscns[2]; /* number of sections */ - unsigned char f_timdat[4]; /* time & date stamp */ - unsigned char f_symptr[4]; /* file pointer to symtab */ - unsigned char f_nsyms[4]; /* number of symtab entries */ - unsigned char f_opthdr[2]; /* sizeof(optional hdr) */ - unsigned char f_flags[2]; /* flags */ -}; - -/* Magic numbers are defined in coff/ecoff.h. */ -#define MIPS_ECOFF_BADMAG(x) (((x).f_magic!=MIPS_MAGIC_1) && \ - ((x).f_magic!=MIPS_MAGIC_LITTLE) &&\ - ((x).f_magic!=MIPS_MAGIC_BIG) && \ - ((x).f_magic!=MIPS_MAGIC_LITTLE2) && \ - ((x).f_magic!=MIPS_MAGIC_BIG2) && \ - ((x).f_magic!=MIPS_MAGIC_LITTLE3) && \ - ((x).f_magic!=MIPS_MAGIC_BIG3)) - -#define FILHDR struct external_filehdr -#define FILHSZ 20 - -/********************** AOUT "OPTIONAL HEADER" **********************/ - - -typedef struct external_aouthdr -{ - unsigned char magic[2]; /* type of file */ - unsigned char vstamp[2]; /* version stamp */ - unsigned char tsize[4]; /* text size in bytes, padded to FW bdry*/ - unsigned char dsize[4]; /* initialized data " " */ - unsigned char bsize[4]; /* uninitialized data " " */ - unsigned char entry[4]; /* entry pt. */ - unsigned char text_start[4]; /* base of text used for this file */ - unsigned char data_start[4]; /* base of data used for this file */ - unsigned char bss_start[4]; /* base of bss used for this file */ - unsigned char gprmask[4]; /* ?? */ - unsigned char cprmask[4][4]; /* ?? */ - unsigned char gp_value[4]; /* value for gp register */ -} AOUTHDR; - -/* compute size of a header */ - -#define AOUTSZ (sizeof(AOUTHDR)) - -/********************** SECTION HEADER **********************/ - -struct external_scnhdr { - unsigned char s_name[8]; /* section name */ - unsigned char s_paddr[4]; /* physical address, aliased s_nlib */ - unsigned char s_vaddr[4]; /* virtual address */ - unsigned char s_size[4]; /* section size */ - unsigned char s_scnptr[4]; /* file ptr to raw data for section */ - unsigned char s_relptr[4]; /* file ptr to relocation */ - unsigned char s_lnnoptr[4]; /* file ptr to line numbers */ - unsigned char s_nreloc[2]; /* number of relocation entries */ - unsigned char s_nlnno[2]; /* number of line number entries*/ - unsigned char s_flags[4]; /* flags */ -}; - -#define SCNHDR struct external_scnhdr -#define SCNHSZ sizeof(SCNHDR) - -/********************** RELOCATION DIRECTIVES **********************/ - -struct external_reloc { - unsigned char r_vaddr[4]; - unsigned char r_bits[4]; -}; - -#define RELOC struct external_reloc -#define RELSZ 8 - -/* MIPS ECOFF uses a packed 8 byte format for relocs. These constants - are used to unpack the r_bits field. */ - -#define RELOC_BITS0_SYMNDX_SH_LEFT_BIG 16 -#define RELOC_BITS0_SYMNDX_SH_LEFT_LITTLE 0 - -#define RELOC_BITS1_SYMNDX_SH_LEFT_BIG 8 -#define RELOC_BITS1_SYMNDX_SH_LEFT_LITTLE 8 - -#define RELOC_BITS2_SYMNDX_SH_LEFT_BIG 0 -#define RELOC_BITS2_SYMNDX_SH_LEFT_LITTLE 16 - -/* Originally, ECOFF used four bits for the reloc type and had three - reserved bits. Irix 4 added another bit for the reloc type, which - was easy because it was big endian and one of the spare bits became - the new most significant bit. To make this also work for little - endian ECOFF, we need to wrap one of the reserved bits around to - become the most significant bit of the reloc type. */ -#define RELOC_BITS3_TYPE_BIG 0x3E -#define RELOC_BITS3_TYPE_SH_BIG 1 -#define RELOC_BITS3_TYPE_LITTLE 0x78 -#define RELOC_BITS3_TYPE_SH_LITTLE 3 -#define RELOC_BITS3_TYPEHI_LITTLE 0x04 -#define RELOC_BITS3_TYPEHI_SH_LITTLE 2 - -#define RELOC_BITS3_EXTERN_BIG 0x01 -#define RELOC_BITS3_EXTERN_LITTLE 0x80 - -/* The r_type field in a reloc is one of the following values. I - don't know if any other values can appear. These seem to be all - that occur in the Ultrix 4.2 libraries. */ -#define MIPS_R_IGNORE 0 -#define MIPS_R_REFHALF 1 -#define MIPS_R_REFWORD 2 -#define MIPS_R_JMPADDR 3 -#define MIPS_R_REFHI 4 -#define MIPS_R_REFLO 5 -#define MIPS_R_GPREL 6 -#define MIPS_R_LITERAL 7 - -/* These reloc types are a Cygnus extension used when generating - position independent code for embedded systems. The numbers are - taken from Irix 4, but at least for internal relocs Irix 5 does not - give them the same meaning. For an internal reloc the symbol index - of RELHI and RELLO is modified as described below for - MIPS_R_SWITCH. */ -#define MIPS_R_PCREL16 12 -#define MIPS_R_RELHI 13 -#define MIPS_R_RELLO 14 - -/* This reloc type is a Cygnus extension used when generating position - independent code for embedded systems. It is used for an entry in - a switch table, which looks like this: - .word $L3-$LS12 - The object file will contain the correct difference, and does not - require adjustment. However, when the linker is relaxing PC - relative calls, it is possible for $L3 to move farther away. This - reloc always appears in the .text section, and is always against - the .text section. However, the symbol index is not - RELOC_SECTION_TEXT. It is, instead, the distance between this - switch table entry and $LS12. Thus, the original value of $L12 is - vaddr - symndx - and the original value of $L3 is - vaddr - symndx + addend - where addend is the value in the object file. Knowing this, the - linker can know whether the addend in the object file must be - adjusted. */ -#define MIPS_R_SWITCH 22 - -/********************** STABS **********************/ - -#define MIPS_IS_STAB ECOFF_IS_STAB -#define MIPS_MARK_STAB ECOFF_MARK_STAB -#define MIPS_UNMARK_STAB ECOFF_UNMARK_STAB - -/********************** SYMBOLIC INFORMATION **********************/ - -/* Written by John Gilmore. */ - -/* ECOFF uses COFF-like section structures, but its own symbol format. - This file defines the symbol format in fields whose size and alignment - will not vary on different host systems. */ - -/* File header as a set of bytes */ - -struct hdr_ext { - unsigned char h_magic[2]; - unsigned char h_vstamp[2]; - unsigned char h_ilineMax[4]; - unsigned char h_cbLine[4]; - unsigned char h_cbLineOffset[4]; - unsigned char h_idnMax[4]; - unsigned char h_cbDnOffset[4]; - unsigned char h_ipdMax[4]; - unsigned char h_cbPdOffset[4]; - unsigned char h_isymMax[4]; - unsigned char h_cbSymOffset[4]; - unsigned char h_ioptMax[4]; - unsigned char h_cbOptOffset[4]; - unsigned char h_iauxMax[4]; - unsigned char h_cbAuxOffset[4]; - unsigned char h_issMax[4]; - unsigned char h_cbSsOffset[4]; - unsigned char h_issExtMax[4]; - unsigned char h_cbSsExtOffset[4]; - unsigned char h_ifdMax[4]; - unsigned char h_cbFdOffset[4]; - unsigned char h_crfd[4]; - unsigned char h_cbRfdOffset[4]; - unsigned char h_iextMax[4]; - unsigned char h_cbExtOffset[4]; -}; - -/* File descriptor external record */ - -struct fdr_ext { - unsigned char f_adr[4]; - unsigned char f_rss[4]; - unsigned char f_issBase[4]; - unsigned char f_cbSs[4]; - unsigned char f_isymBase[4]; - unsigned char f_csym[4]; - unsigned char f_ilineBase[4]; - unsigned char f_cline[4]; - unsigned char f_ioptBase[4]; - unsigned char f_copt[4]; - unsigned char f_ipdFirst[2]; - unsigned char f_cpd[2]; - unsigned char f_iauxBase[4]; - unsigned char f_caux[4]; - unsigned char f_rfdBase[4]; - unsigned char f_crfd[4]; - unsigned char f_bits1[1]; - unsigned char f_bits2[3]; - unsigned char f_cbLineOffset[4]; - unsigned char f_cbLine[4]; -}; - -#define FDR_BITS1_LANG_BIG 0xF8 -#define FDR_BITS1_LANG_SH_BIG 3 -#define FDR_BITS1_LANG_LITTLE 0x1F -#define FDR_BITS1_LANG_SH_LITTLE 0 - -#define FDR_BITS1_FMERGE_BIG 0x04 -#define FDR_BITS1_FMERGE_LITTLE 0x20 - -#define FDR_BITS1_FREADIN_BIG 0x02 -#define FDR_BITS1_FREADIN_LITTLE 0x40 - -#define FDR_BITS1_FBIGENDIAN_BIG 0x01 -#define FDR_BITS1_FBIGENDIAN_LITTLE 0x80 - -#define FDR_BITS2_GLEVEL_BIG 0xC0 -#define FDR_BITS2_GLEVEL_SH_BIG 6 -#define FDR_BITS2_GLEVEL_LITTLE 0x03 -#define FDR_BITS2_GLEVEL_SH_LITTLE 0 - -/* We ignore the `reserved' field in bits2. */ - -/* Procedure descriptor external record */ - -struct pdr_ext { - unsigned char p_adr[4]; - unsigned char p_isym[4]; - unsigned char p_iline[4]; - unsigned char p_regmask[4]; - unsigned char p_regoffset[4]; - unsigned char p_iopt[4]; - unsigned char p_fregmask[4]; - unsigned char p_fregoffset[4]; - unsigned char p_frameoffset[4]; - unsigned char p_framereg[2]; - unsigned char p_pcreg[2]; - unsigned char p_lnLow[4]; - unsigned char p_lnHigh[4]; - unsigned char p_cbLineOffset[4]; -}; - -/* Runtime procedure table */ - -struct rpdr_ext { - unsigned char p_adr[4]; - unsigned char p_regmask[4]; - unsigned char p_regoffset[4]; - unsigned char p_fregmask[4]; - unsigned char p_fregoffset[4]; - unsigned char p_frameoffset[4]; - unsigned char p_framereg[2]; - unsigned char p_pcreg[2]; - unsigned char p_irpss[4]; - unsigned char p_reserved[4]; - unsigned char p_exception_info[4]; -}; - -/* Line numbers */ - -struct line_ext { - unsigned char l_line[4]; -}; - -/* Symbol external record */ - -struct sym_ext { - unsigned char s_iss[4]; - unsigned char s_value[4]; - unsigned char s_bits1[1]; - unsigned char s_bits2[1]; - unsigned char s_bits3[1]; - unsigned char s_bits4[1]; -}; - -#define SYM_BITS1_ST_BIG 0xFC -#define SYM_BITS1_ST_SH_BIG 2 -#define SYM_BITS1_ST_LITTLE 0x3F -#define SYM_BITS1_ST_SH_LITTLE 0 - -#define SYM_BITS1_SC_BIG 0x03 -#define SYM_BITS1_SC_SH_LEFT_BIG 3 -#define SYM_BITS1_SC_LITTLE 0xC0 -#define SYM_BITS1_SC_SH_LITTLE 6 - -#define SYM_BITS2_SC_BIG 0xE0 -#define SYM_BITS2_SC_SH_BIG 5 -#define SYM_BITS2_SC_LITTLE 0x07 -#define SYM_BITS2_SC_SH_LEFT_LITTLE 2 - -#define SYM_BITS2_RESERVED_BIG 0x10 -#define SYM_BITS2_RESERVED_LITTLE 0x08 - -#define SYM_BITS2_INDEX_BIG 0x0F -#define SYM_BITS2_INDEX_SH_LEFT_BIG 16 -#define SYM_BITS2_INDEX_LITTLE 0xF0 -#define SYM_BITS2_INDEX_SH_LITTLE 4 - -#define SYM_BITS3_INDEX_SH_LEFT_BIG 8 -#define SYM_BITS3_INDEX_SH_LEFT_LITTLE 4 - -#define SYM_BITS4_INDEX_SH_LEFT_BIG 0 -#define SYM_BITS4_INDEX_SH_LEFT_LITTLE 12 - -/* External symbol external record */ - -struct ext_ext { - unsigned char es_bits1[1]; - unsigned char es_bits2[1]; - unsigned char es_ifd[2]; - struct sym_ext es_asym; -}; - -#define EXT_BITS1_JMPTBL_BIG 0x80 -#define EXT_BITS1_JMPTBL_LITTLE 0x01 - -#define EXT_BITS1_COBOL_MAIN_BIG 0x40 -#define EXT_BITS1_COBOL_MAIN_LITTLE 0x02 - -#define EXT_BITS1_WEAKEXT_BIG 0x20 -#define EXT_BITS1_WEAKEXT_LITTLE 0x04 - -/* Dense numbers external record */ - -struct dnr_ext { - unsigned char d_rfd[4]; - unsigned char d_index[4]; -}; - -/* Relative file descriptor */ - -struct rfd_ext { - unsigned char rfd[4]; -}; - -/* Optimizer symbol external record */ - -struct opt_ext { - unsigned char o_bits1[1]; - unsigned char o_bits2[1]; - unsigned char o_bits3[1]; - unsigned char o_bits4[1]; - struct rndx_ext o_rndx; - unsigned char o_offset[4]; -}; - -#define OPT_BITS2_VALUE_SH_LEFT_BIG 16 -#define OPT_BITS2_VALUE_SH_LEFT_LITTLE 0 - -#define OPT_BITS3_VALUE_SH_LEFT_BIG 8 -#define OPT_BITS3_VALUE_SH_LEFT_LITTLE 8 - -#define OPT_BITS4_VALUE_SH_LEFT_BIG 0 -#define OPT_BITS4_VALUE_SH_LEFT_LITTLE 16 diff --git a/contrib/gdb/include/coff/pe.h b/contrib/gdb/include/coff/pe.h deleted file mode 100644 index f13b8b979ea60..0000000000000 --- a/contrib/gdb/include/coff/pe.h +++ /dev/null @@ -1,161 +0,0 @@ -/* PE COFF header information */ - -#ifndef _PE_H -#define _PE_H - -/* NT specific file attributes */ -#define IMAGE_FILE_RELOCS_STRIPPED 0x0001 -#define IMAGE_FILE_EXECUTABLE_IMAGE 0x0002 -#define IMAGE_FILE_LINE_NUMS_STRIPPED 0x0004 -#define IMAGE_FILE_LOCAL_SYMS_STRIPPED 0x0008 -#define IMAGE_FILE_BYTES_REVERSED_LO 0x0080 -#define IMAGE_FILE_32BIT_MACHINE 0x0100 -#define IMAGE_FILE_DEBUG_STRIPPED 0x0200 -#define IMAGE_FILE_SYSTEM 0x1000 -#define IMAGE_FILE_DLL 0x2000 -#define IMAGE_FILE_BYTES_REVERSED_HI 0x8000 - -/* additional flags to be set for section headers to allow the NT loader to - read and write to the section data (to replace the addresses of data in - dlls for one thing); also to execute the section in .text's case */ -#define IMAGE_SCN_MEM_DISCARDABLE 0x02000000 -#define IMAGE_SCN_MEM_EXECUTE 0x20000000 -#define IMAGE_SCN_MEM_READ 0x40000000 -#define IMAGE_SCN_MEM_WRITE 0x80000000 - -/* - * Section characteristics added for ppc-nt - */ - -#define IMAGE_SCN_TYPE_NO_PAD 0x00000008 /* Reserved. */ - -#define IMAGE_SCN_CNT_CODE 0x00000020 /* Section contains code. */ -#define IMAGE_SCN_CNT_INITIALIZED_DATA 0x00000040 /* Section contains initialized data. */ -#define IMAGE_SCN_CNT_UNINITIALIZED_DATA 0x00000080 /* Section contains uninitialized data. */ - -#define IMAGE_SCN_LNK_OTHER 0x00000100 /* Reserved. */ -#define IMAGE_SCN_LNK_INFO 0x00000200 /* Section contains comments or some other type of information. */ -#define IMAGE_SCN_LNK_REMOVE 0x00000800 /* Section contents will not become part of image. */ -#define IMAGE_SCN_LNK_COMDAT 0x00001000 /* Section contents comdat. */ - -#define IMAGE_SCN_MEM_FARDATA 0x00008000 - -#define IMAGE_SCN_MEM_PURGEABLE 0x00020000 -#define IMAGE_SCN_MEM_16BIT 0x00020000 -#define IMAGE_SCN_MEM_LOCKED 0x00040000 -#define IMAGE_SCN_MEM_PRELOAD 0x00080000 - -#define IMAGE_SCN_ALIGN_1BYTES 0x00100000 -#define IMAGE_SCN_ALIGN_2BYTES 0x00200000 -#define IMAGE_SCN_ALIGN_4BYTES 0x00300000 -#define IMAGE_SCN_ALIGN_8BYTES 0x00400000 -#define IMAGE_SCN_ALIGN_16BYTES 0x00500000 /* Default alignment if no others are specified. */ -#define IMAGE_SCN_ALIGN_32BYTES 0x00600000 -#define IMAGE_SCN_ALIGN_64BYTES 0x00700000 - - -#define IMAGE_SCN_LNK_NRELOC_OVFL 0x01000000 /* Section contains extended relocations. */ -#define IMAGE_SCN_MEM_NOT_CACHED 0x04000000 /* Section is not cachable. */ -#define IMAGE_SCN_MEM_NOT_PAGED 0x08000000 /* Section is not pageable. */ -#define IMAGE_SCN_MEM_SHARED 0x10000000 /* Section is shareable. */ - - -/* Magic values that are true for all dos/nt implementations */ -#define DOSMAGIC 0x5a4d -#define NT_SIGNATURE 0x00004550 - - /* NT allows long filenames, we want to accommodate this. This may break - some of the bfd functions */ -#undef FILNMLEN -#define FILNMLEN 18 /* # characters in a file name */ - - -#ifdef COFF_IMAGE_WITH_PE -/* The filehdr is only weired in images */ - -#undef FILHDR -struct external_PE_filehdr -{ - /* DOS header fields */ - char e_magic[2]; /* Magic number, 0x5a4d */ - char e_cblp[2]; /* Bytes on last page of file, 0x90 */ - char e_cp[2]; /* Pages in file, 0x3 */ - char e_crlc[2]; /* Relocations, 0x0 */ - char e_cparhdr[2]; /* Size of header in paragraphs, 0x4 */ - char e_minalloc[2]; /* Minimum extra paragraphs needed, 0x0 */ - char e_maxalloc[2]; /* Maximum extra paragraphs needed, 0xFFFF */ - char e_ss[2]; /* Initial (relative) SS value, 0x0 */ - char e_sp[2]; /* Initial SP value, 0xb8 */ - char e_csum[2]; /* Checksum, 0x0 */ - char e_ip[2]; /* Initial IP value, 0x0 */ - char e_cs[2]; /* Initial (relative) CS value, 0x0 */ - char e_lfarlc[2]; /* File address of relocation table, 0x40 */ - char e_ovno[2]; /* Overlay number, 0x0 */ - char e_res[4][2]; /* Reserved words, all 0x0 */ - char e_oemid[2]; /* OEM identifier (for e_oeminfo), 0x0 */ - char e_oeminfo[2]; /* OEM information; e_oemid specific, 0x0 */ - char e_res2[10][2]; /* Reserved words, all 0x0 */ - char e_lfanew[4]; /* File address of new exe header, 0x80 */ - char dos_message[16][4]; /* other stuff, always follow DOS header */ - char nt_signature[4]; /* required NT signature, 0x4550 */ - - /* From standard header */ - - - char f_magic[2]; /* magic number */ - char f_nscns[2]; /* number of sections */ - char f_timdat[4]; /* time & date stamp */ - char f_symptr[4]; /* file pointer to symtab */ - char f_nsyms[4]; /* number of symtab entries */ - char f_opthdr[2]; /* sizeof(optional hdr) */ - char f_flags[2]; /* flags */ - -}; - - -#define FILHDR struct external_PE_filehdr - - -#endif - -typedef struct -{ - AOUTHDR standard; - - /* NT extra fields; see internal.h for descriptions */ - char ImageBase[4]; - char SectionAlignment[4]; - char FileAlignment[4]; - char MajorOperatingSystemVersion[2]; - char MinorOperatingSystemVersion[2]; - char MajorImageVersion[2]; - char MinorImageVersion[2]; - char MajorSubsystemVersion[2]; - char MinorSubsystemVersion[2]; - char Reserved1[4]; - char SizeOfImage[4]; - char SizeOfHeaders[4]; - char CheckSum[4]; - char Subsystem[2]; - char DllCharacteristics[2]; - char SizeOfStackReserve[4]; - char SizeOfStackCommit[4]; - char SizeOfHeapReserve[4]; - char SizeOfHeapCommit[4]; - char LoaderFlags[4]; - char NumberOfRvaAndSizes[4]; - /* IMAGE_DATA_DIRECTORY DataDirectory[IMAGE_NUMBEROF_DIRECTORY_ENTRIES]; */ - char DataDirectory[16][2][4]; /* 16 entries, 2 elements/entry, 4 chars */ - -} PEAOUTHDR; - - -#undef AOUTSZ -#define AOUTSZ sizeof(PEAOUTHDR) - -#undef E_FILNMLEN -#define E_FILNMLEN 18 /* # characters in a file name */ -#endif - - - diff --git a/contrib/gdb/include/coff/powerpc.h b/contrib/gdb/include/coff/powerpc.h deleted file mode 100644 index 6866fc8a0dc7c..0000000000000 --- a/contrib/gdb/include/coff/powerpc.h +++ /dev/null @@ -1,196 +0,0 @@ -/* Basic coff information for the PowerPC - * - * Based on coff/rs6000.h, coff/i386.h and others. - * - * Initial release: Kim Knuttila (krk@cygnus.com) - */ - -/********************** FILE HEADER **********************/ - -struct external_filehdr { - char f_magic[2]; /* magic number */ - char f_nscns[2]; /* number of sections */ - char f_timdat[4]; /* time & date stamp */ - char f_symptr[4]; /* file pointer to symtab */ - char f_nsyms[4]; /* number of symtab entries */ - char f_opthdr[2]; /* sizeof(optional hdr) */ - char f_flags[2]; /* flags */ -}; - -#define FILHDR struct external_filehdr -#define FILHSZ sizeof(FILHDR) - -/* Bits for f_flags: - * F_RELFLG relocation info stripped from file - * F_EXEC file is executable (no unresolved external references) - * F_LNNO line numbers stripped from file - * F_LSYMS local symbols stripped from file - * F_AR32WR file has byte ordering of an AR32WR machine (e.g. vax) - */ - -#define F_RELFLG (0x0001) -#define F_EXEC (0x0002) -#define F_LNNO (0x0004) -#define F_LSYMS (0x0008) - -/* extra NT defines */ -#define PPCMAGIC 0760 /* peeked on aa PowerPC Windows NT box */ -#define DOSMAGIC 0x5a4d /* from arm.h, i386.h */ -#define NT_SIGNATURE 0x00004550 /* from arm.h, i386.h */ - -/* from winnt.h */ -#define IMAGE_NT_OPTIONAL_HDR_MAGIC 0x10b - -#define PPCBADMAG(x) ((x).f_magic != PPCMAGIC) - -/********************** AOUT "OPTIONAL HEADER" **********************/ - -typedef struct -{ - char magic[2]; /* type of file */ - char vstamp[2]; /* version stamp */ - char tsize[4]; /* text size in bytes, padded to FW bdry*/ - char dsize[4]; /* initialized data " " */ - char bsize[4]; /* uninitialized data " " */ - char entry[4]; /* entry pt. */ - char text_start[4]; /* base of text used for this file */ - char data_start[4]; /* base of data used for this file */ -} -AOUTHDR; - -#define AOUTSZ (sizeof(AOUTHDR)) - - -/********************** SECTION HEADER **********************/ - -struct external_scnhdr { - char s_name[8]; /* section name */ - char s_paddr[4]; /* physical address, aliased s_nlib */ - char s_vaddr[4]; /* virtual address */ - char s_size[4]; /* section size */ - char s_scnptr[4]; /* file ptr to raw data for section */ - char s_relptr[4]; /* file ptr to relocation */ - char s_lnnoptr[4]; /* file ptr to line numbers */ - char s_nreloc[2]; /* number of relocation entries */ - char s_nlnno[2]; /* number of line number entries */ - char s_flags[4]; /* flags */ -}; - -#define SCNHDR struct external_scnhdr -#define SCNHSZ sizeof(SCNHDR) - -/* - * names of "special" sections - */ -#define _TEXT ".text" -#define _DATA ".data" -#define _BSS ".bss" -#define _COMMENT ".comment" -#define _LIB ".lib" - -/********************** LINE NUMBERS **********************/ - -/* 1 line number entry for every "breakpointable" source line in a section. - * Line numbers are grouped on a per function basis; first entry in a function - * grouping will have l_lnno = 0 and in place of physical address will be the - * symbol table index of the function name. - */ -struct external_lineno { - union { - char l_symndx[4]; /* function name symbol index, iff l_lnno == 0 */ - char l_paddr[4]; /* (physical) address of line number */ - } l_addr; - char l_lnno[2]; /* line number */ -}; - -#define LINENO struct external_lineno -#define LINESZ 6 - -/********************** SYMBOLS **********************/ - -#define E_SYMNMLEN 8 /* # characters in a symbol name */ - -/* Allow the file name length to be overridden in the including file */ -#ifndef E_FILNMLEN -#define E_FILNMLEN 14 -#endif - -#define E_DIMNUM 4 /* # array dimensions in auxiliary entry */ - -struct external_syment -{ - union { - char e_name[E_SYMNMLEN]; - struct { - char e_zeroes[4]; - char e_offset[4]; - } e; - } e; - char e_value[4]; - char e_scnum[2]; - char e_type[2]; - char e_sclass[1]; - char e_numaux[1]; -}; - -#define SYMENT struct external_syment -#define SYMESZ 18 - -#define N_BTMASK (0xf) -#define N_TMASK (0x30) -#define N_BTSHFT (4) -#define N_TSHIFT (2) - -union external_auxent { - struct { - char x_tagndx[4]; /* str, un, or enum tag indx */ - union { - struct { - char x_lnno[2]; /* declaration line number */ - char x_size[2]; /* str/union/array size */ - } x_lnsz; - char x_fsize[4]; /* size of function */ - } x_misc; - union { - struct { /* if ISFCN, tag, or .bb */ - char x_lnnoptr[4]; /* ptr to fcn line # */ - char x_endndx[4]; /* entry ndx past block end */ - } x_fcn; - struct { /* if ISARY, up to 4 dimen. */ - char x_dimen[E_DIMNUM][2]; - } x_ary; - } x_fcnary; - char x_tvndx[2]; /* tv index */ - } x_sym; - - union { - char x_fname[E_FILNMLEN]; - struct { - char x_zeroes[4]; - char x_offset[4]; - } x_n; - } x_file; - - struct { - char x_scnlen[4]; /* section length */ - char x_nreloc[2]; /* # relocation entries */ - char x_nlinno[2]; /* # line numbers */ - } x_scn; -}; - -#define AUXENT union external_auxent -#define AUXESZ 18 - -#define _ETEXT "etext" - -/********************** RELOCATION DIRECTIVES **********************/ - -struct external_reloc { - char r_vaddr[4]; - char r_symndx[4]; - char r_type[2]; -}; - -#define RELOC struct external_reloc -#define RELSZ 10 - diff --git a/contrib/gdb/include/coff/rs6000.h b/contrib/gdb/include/coff/rs6000.h deleted file mode 100644 index 62a6f86cc7c83..0000000000000 --- a/contrib/gdb/include/coff/rs6000.h +++ /dev/null @@ -1,242 +0,0 @@ -/* IBM RS/6000 "XCOFF" file definitions for BFD. - Copyright (C) 1990, 1991 Free Software Foundation, Inc. - FIXME: Can someone provide a transliteration of this name into ASCII? - Using the following chars caused a compiler warning on HIUX (so I replaced - them with octal escapes), and isn't useful without an understanding of what - character set it is. - Written by Mimi Ph\373\364ng-Th\345o V\365 of IBM - and John Gilmore of Cygnus Support. */ - -/********************** FILE HEADER **********************/ - -struct external_filehdr { - char f_magic[2]; /* magic number */ - char f_nscns[2]; /* number of sections */ - char f_timdat[4]; /* time & date stamp */ - char f_symptr[4]; /* file pointer to symtab */ - char f_nsyms[4]; /* number of symtab entries */ - char f_opthdr[2]; /* sizeof(optional hdr) */ - char f_flags[2]; /* flags */ -}; - - /* IBM RS/6000 */ -#define U802WRMAGIC 0730 /* writeable text segments **chh** */ -#define U802ROMAGIC 0735 /* readonly sharable text segments */ -#define U802TOCMAGIC 0737 /* readonly text segments and TOC */ - -#define BADMAG(x) \ - ((x).f_magic != U802ROMAGIC && (x).f_magic != U802WRMAGIC && \ - (x).f_magic != U802TOCMAGIC) - -#define FILHDR struct external_filehdr -#define FILHSZ sizeof(FILHDR) - - -/********************** AOUT "OPTIONAL HEADER" **********************/ - - -typedef struct -{ - unsigned char magic[2]; /* type of file */ - unsigned char vstamp[2]; /* version stamp */ - unsigned char tsize[4]; /* text size in bytes, padded to FW bdry */ - unsigned char dsize[4]; /* initialized data " " */ - unsigned char bsize[4]; /* uninitialized data " " */ - unsigned char entry[4]; /* entry pt. */ - unsigned char text_start[4]; /* base of text used for this file */ - unsigned char data_start[4]; /* base of data used for this file */ - unsigned char o_toc[4]; /* address of TOC */ - unsigned char o_snentry[2]; /* section number of entry point */ - unsigned char o_sntext[2]; /* section number of .text section */ - unsigned char o_sndata[2]; /* section number of .data section */ - unsigned char o_sntoc[2]; /* section number of TOC */ - unsigned char o_snloader[2]; /* section number of .loader section */ - unsigned char o_snbss[2]; /* section number of .bss section */ - unsigned char o_algntext[2]; /* .text alignment */ - unsigned char o_algndata[2]; /* .data alignment */ - unsigned char o_modtype[2]; /* module type (??) */ - unsigned char o_cputype[2]; /* cpu type */ - unsigned char o_maxstack[4]; /* max stack size (??) */ - unsigned char o_maxdata[4]; /* max data size (??) */ - unsigned char o_resv2[12]; /* reserved */ -} -AOUTHDR; - -#define AOUTSZ (sizeof(AOUTHDR)) -#define SMALL_AOUTSZ (28) - -#define RS6K_AOUTHDR_OMAGIC 0x0107 /* old: text & data writeable */ -#define RS6K_AOUTHDR_NMAGIC 0x0108 /* new: text r/o, data r/w */ -#define RS6K_AOUTHDR_ZMAGIC 0x010B /* paged: text r/o, both page-aligned */ - - -/********************** SECTION HEADER **********************/ - - -struct external_scnhdr { - char s_name[8]; /* section name */ - char s_paddr[4]; /* physical address, aliased s_nlib */ - char s_vaddr[4]; /* virtual address */ - char s_size[4]; /* section size */ - char s_scnptr[4]; /* file ptr to raw data for section */ - char s_relptr[4]; /* file ptr to relocation */ - char s_lnnoptr[4]; /* file ptr to line numbers */ - char s_nreloc[2]; /* number of relocation entries */ - char s_nlnno[2]; /* number of line number entries*/ - char s_flags[4]; /* flags */ -}; - -/* - * names of "special" sections - */ -#define _TEXT ".text" -#define _DATA ".data" -#define _BSS ".bss" -#define _PAD ".pad" -#define _LOADER ".loader" - -#define SCNHDR struct external_scnhdr -#define SCNHSZ sizeof(SCNHDR) - -/* XCOFF uses a special .loader section with type STYP_LOADER. */ -#define STYP_LOADER 0x1000 - -/* XCOFF uses a special .debug section with type STYP_DEBUG. */ -#define STYP_DEBUG 0x2000 - -/* XCOFF handles line number or relocation overflow by creating - another section header with STYP_OVRFLO set. */ -#define STYP_OVRFLO 0x8000 - -/********************** LINE NUMBERS **********************/ - -/* 1 line number entry for every "breakpointable" source line in a section. - * Line numbers are grouped on a per function basis; first entry in a function - * grouping will have l_lnno = 0 and in place of physical address will be the - * symbol table index of the function name. - */ -struct external_lineno { - union { - char l_symndx[4]; /* function name symbol index, iff l_lnno == 0*/ - char l_paddr[4]; /* (physical) address of line number */ - } l_addr; - char l_lnno[2]; /* line number */ -}; - - -#define LINENO struct external_lineno -#define LINESZ sizeof(LINENO) - - -/********************** SYMBOLS **********************/ - -#define E_SYMNMLEN 8 /* # characters in a symbol name */ -#define E_FILNMLEN 14 /* # characters in a file name */ -#define E_DIMNUM 4 /* # array dimensions in auxiliary entry */ - -struct external_syment -{ - union { - char e_name[E_SYMNMLEN]; - struct { - char e_zeroes[4]; - char e_offset[4]; - } e; - } e; - char e_value[4]; - char e_scnum[2]; - char e_type[2]; - char e_sclass[1]; - char e_numaux[1]; -}; - - - -#define N_BTMASK (017) -#define N_TMASK (060) -#define N_BTSHFT (4) -#define N_TSHIFT (2) - - -union external_auxent { - struct { - char x_tagndx[4]; /* str, un, or enum tag indx */ - union { - struct { - char x_lnno[2]; /* declaration line number */ - char x_size[2]; /* str/union/array size */ - } x_lnsz; - char x_fsize[4]; /* size of function */ - } x_misc; - union { - struct { /* if ISFCN, tag, or .bb */ - char x_lnnoptr[4]; /* ptr to fcn line # */ - char x_endndx[4]; /* entry ndx past block end */ - } x_fcn; - struct { /* if ISARY, up to 4 dimen. */ - char x_dimen[E_DIMNUM][2]; - } x_ary; - } x_fcnary; - char x_tvndx[2]; /* tv index */ - } x_sym; - - union { - char x_fname[E_FILNMLEN]; - struct { - char x_zeroes[4]; - char x_offset[4]; - } x_n; - } x_file; - - struct { - char x_scnlen[4]; /* section length */ - char x_nreloc[2]; /* # relocation entries */ - char x_nlinno[2]; /* # line numbers */ - } x_scn; - - struct { - char x_tvfill[4]; /* tv fill value */ - char x_tvlen[2]; /* length of .tv */ - char x_tvran[2][2]; /* tv range */ - } x_tv; /* info about .tv section (in auxent of symbol .tv)) */ - - struct { - unsigned char x_scnlen[4]; - unsigned char x_parmhash[4]; - unsigned char x_snhash[2]; - unsigned char x_smtyp[1]; - unsigned char x_smclas[1]; - unsigned char x_stab[4]; - unsigned char x_snstab[2]; - } x_csect; - -}; - -#define SYMENT struct external_syment -#define SYMESZ 18 -#define AUXENT union external_auxent -#define AUXESZ 18 -#define DBXMASK 0x80 /* for dbx storage mask */ -#define SYMNAME_IN_DEBUG(symptr) ((symptr)->n_sclass & DBXMASK) - - - -/********************** RELOCATION DIRECTIVES **********************/ - - -struct external_reloc { - char r_vaddr[4]; - char r_symndx[4]; - char r_size[1]; - char r_type[1]; -}; - - -#define RELOC struct external_reloc -#define RELSZ 10 - -#define DEFAULT_DATA_SECTION_ALIGNMENT 4 -#define DEFAULT_BSS_SECTION_ALIGNMENT 4 -#define DEFAULT_TEXT_SECTION_ALIGNMENT 4 -/* For new sections we havn't heard of before */ -#define DEFAULT_SECTION_ALIGNMENT 4 diff --git a/contrib/gdb/include/coff/sh.h b/contrib/gdb/include/coff/sh.h deleted file mode 100644 index af49674a9ee88..0000000000000 --- a/contrib/gdb/include/coff/sh.h +++ /dev/null @@ -1,253 +0,0 @@ -/*** coff information for Hitachi SH */ - -/********************** FILE HEADER **********************/ - -struct external_filehdr { - char f_magic[2]; /* magic number */ - char f_nscns[2]; /* number of sections */ - char f_timdat[4]; /* time & date stamp */ - char f_symptr[4]; /* file pointer to symtab */ - char f_nsyms[4]; /* number of symtab entries */ - char f_opthdr[2]; /* sizeof(optional hdr) */ - char f_flags[2]; /* flags */ -}; - - - -#define SH_ARCH_MAGIC_BIG 0x0500 -#define SH_ARCH_MAGIC_LITTLE 0x0550 /* Little endian SH */ - - -#define SHBADMAG(x) \ - (((x).f_magic!=SH_ARCH_MAGIC_BIG) && \ - ((x).f_magic!=SH_ARCH_MAGIC_LITTLE)) - -#define FILHDR struct external_filehdr -#define FILHSZ sizeof(FILHDR) - - -/********************** AOUT "OPTIONAL HEADER" **********************/ - - -typedef struct -{ - char magic[2]; /* type of file */ - char vstamp[2]; /* version stamp */ - char tsize[4]; /* text size in bytes, padded to FW bdry*/ - char dsize[4]; /* initialized data " " */ - char bsize[4]; /* uninitialized data " " */ - char entry[4]; /* entry pt. */ - char text_start[4]; /* base of text used for this file */ - char data_start[4]; /* base of data used for this file */ -} -AOUTHDR; - - -#define AOUTHDRSZ (sizeof(AOUTHDR)) -#define AOUTSZ (sizeof(AOUTHDR)) - - - - -/********************** SECTION HEADER **********************/ - - -struct external_scnhdr { - char s_name[8]; /* section name */ - char s_paddr[4]; /* physical address, aliased s_nlib */ - char s_vaddr[4]; /* virtual address */ - char s_size[4]; /* section size */ - char s_scnptr[4]; /* file ptr to raw data for section */ - char s_relptr[4]; /* file ptr to relocation */ - char s_lnnoptr[4]; /* file ptr to line numbers */ - char s_nreloc[2]; /* number of relocation entries */ - char s_nlnno[2]; /* number of line number entries*/ - char s_flags[4]; /* flags */ -}; - -/* - * names of "special" sections - */ -#define _TEXT ".text" -#define _DATA ".data" -#define _BSS ".bss" - - -#define SCNHDR struct external_scnhdr -#define SCNHSZ sizeof(SCNHDR) - - -/********************** LINE NUMBERS **********************/ - -/* 1 line number entry for every "breakpointable" source line in a section. - * Line numbers are grouped on a per function basis; first entry in a function - * grouping will have l_lnno = 0 and in place of physical address will be the - * symbol table index of the function name. - */ -struct external_lineno { - union { - char l_symndx[4]; /* function name symbol index, iff l_lnno == 0*/ - char l_paddr[4]; /* (physical) address of line number */ - } l_addr; - char l_lnno[4]; /* line number */ -}; - -#define GET_LINENO_LNNO(abfd, ext) bfd_h_get_32(abfd, (bfd_byte *) (ext->l_lnno)); -#define PUT_LINENO_LNNO(abfd,val, ext) bfd_h_put_32(abfd,val, (bfd_byte *) (ext->l_lnno)); - -#define LINENO struct external_lineno -#define LINESZ sizeof(LINENO) - - -/********************** SYMBOLS **********************/ - -#define E_SYMNMLEN 8 /* # characters in a symbol name */ -#define E_FILNMLEN 14 /* # characters in a file name */ -#define E_DIMNUM 4 /* # array dimensions in auxiliary entry */ - -struct external_syment -{ - union { - char e_name[E_SYMNMLEN]; - struct { - char e_zeroes[4]; - char e_offset[4]; - } e; - } e; - char e_value[4]; - char e_scnum[2]; - char e_type[2]; - char e_sclass[1]; - char e_numaux[1]; -}; - - - -#define N_BTMASK (017) -#define N_TMASK (060) -#define N_BTSHFT (4) -#define N_TSHIFT (2) - - -union external_auxent { - struct { - char x_tagndx[4]; /* str, un, or enum tag indx */ - union { - struct { - char x_lnno[2]; /* declaration line number */ - char x_size[2]; /* str/union/array size */ - } x_lnsz; - char x_fsize[4]; /* size of function */ - } x_misc; - union { - struct { /* if ISFCN, tag, or .bb */ - char x_lnnoptr[4]; /* ptr to fcn line # */ - char x_endndx[4]; /* entry ndx past block end */ - } x_fcn; - struct { /* if ISARY, up to 4 dimen. */ - char x_dimen[E_DIMNUM][2]; - } x_ary; - } x_fcnary; - char x_tvndx[2]; /* tv index */ - } x_sym; - - union { - char x_fname[E_FILNMLEN]; - struct { - char x_zeroes[4]; - char x_offset[4]; - } x_n; - } x_file; - - struct { - char x_scnlen[4]; /* section length */ - char x_nreloc[2]; /* # relocation entries */ - char x_nlinno[2]; /* # line numbers */ - } x_scn; - - struct { - char x_tvfill[4]; /* tv fill value */ - char x_tvlen[2]; /* length of .tv */ - char x_tvran[2][2]; /* tv range */ - } x_tv; /* info about .tv section (in auxent of symbol .tv)) */ - - -}; - -#define SYMENT struct external_syment -#define SYMESZ 18 -#define AUXENT union external_auxent -#define AUXESZ 18 - - - -/********************** RELOCATION DIRECTIVES **********************/ - -/* The external reloc has an offset field, because some of the reloc - types on the h8 don't have room in the instruction for the entire - offset - eg the strange jump and high page addressing modes */ - -struct external_reloc { - char r_vaddr[4]; - char r_symndx[4]; - char r_offset[4]; - char r_type[2]; - char r_stuff[2]; -}; - - -#define RELOC struct external_reloc -#define RELSZ 16 - -/* SH relocation types. Not all of these are actually used. */ - -#define R_SH_UNUSED 0 /* only used internally */ -#define R_SH_PCREL8 3 /* 8 bit pcrel */ -#define R_SH_PCREL16 4 /* 16 bit pcrel */ -#define R_SH_HIGH8 5 /* high 8 bits of 24 bit address */ -#define R_SH_LOW16 7 /* low 16 bits of 24 bit immediate */ -#define R_SH_IMM24 6 /* 24 bit immediate */ -#define R_SH_PCDISP8BY4 9 /* PC rel 8 bits *4 +ve */ -#define R_SH_PCDISP8BY2 10 /* PC rel 8 bits *2 +ve */ -#define R_SH_PCDISP8 11 /* 8 bit branch */ -#define R_SH_PCDISP 12 /* 12 bit branch */ -#define R_SH_IMM32 14 /* 32 bit immediate */ -#define R_SH_IMM8 16 /* 8 bit immediate */ -#define R_SH_IMM8BY2 17 /* 8 bit immediate *2 */ -#define R_SH_IMM8BY4 18 /* 8 bit immediate *4 */ -#define R_SH_IMM4 19 /* 4 bit immediate */ -#define R_SH_IMM4BY2 20 /* 4 bit immediate *2 */ -#define R_SH_IMM4BY4 21 /* 4 bit immediate *4 */ -#define R_SH_PCRELIMM8BY2 22 /* PC rel 8 bits *2 unsigned */ -#define R_SH_PCRELIMM8BY4 23 /* PC rel 8 bits *4 unsigned */ -#define R_SH_IMM16 24 /* 16 bit immediate */ - -/* The switch table reloc types are used for relaxing. They are - generated for expressions such as - .word L1 - L2 - The r_offset field holds the difference between the reloc address - and L2. */ -#define R_SH_SWITCH16 25 /* 16 bit switch table entry */ -#define R_SH_SWITCH32 26 /* 16 bit switch table entry */ - -/* The USES reloc type is used for relaxing. The compiler will - generate .uses pseudo-ops when it finds a function call which it - can relax. The r_offset field of the USES reloc holds the PC - relative offset to the instruction which loads the register used in - the function call. */ -#define R_SH_USES 27 /* .uses pseudo-op */ - -/* The COUNT reloc type is used for relaxing. The assembler will - generate COUNT relocs for addresses referred to by the register - loads associated with USES relocs. The r_offset field of the COUNT - reloc holds the number of times the address is references in the - object file. */ -#define R_SH_COUNT 28 /* Count of constant pool uses */ - -/* The ALIGN reloc type is used for relaxing. The r_offset field is - the power of two to which subsequent portions of the object file - must be aligned. */ -#define R_SH_ALIGN 29 /* .align pseudo-op */ - - - diff --git a/contrib/gdb/include/coff/sparc.h b/contrib/gdb/include/coff/sparc.h deleted file mode 100644 index 0e3217b25f137..0000000000000 --- a/contrib/gdb/include/coff/sparc.h +++ /dev/null @@ -1,209 +0,0 @@ -/*** coff information for Sparc. */ - -/* This file is an amalgamation of several standard include files that - define coff format, such as filehdr.h, aouthdr.h, and so forth. In - addition, all datatypes have been translated into character arrays of - (presumed) equivalent size. This is necessary so that this file can - be used with different systems while still yielding the same results. */ - -/********************** FILE HEADER **********************/ - -struct external_filehdr -{ - char f_magic[2]; /* magic number */ - char f_nscns[2]; /* number of sections */ - char f_timdat[4]; /* time & date stamp */ - char f_symptr[4]; /* file pointer to symtab */ - char f_nsyms[4]; /* number of symtab entries */ - char f_opthdr[2]; /* sizeof(optional hdr) */ - char f_flags[2]; /* flags */ -}; - -#define F_RELFLG (0x0001) /* relocation info stripped */ -#define F_EXEC (0x0002) /* file is executable */ -#define F_LNNO (0x0004) /* line numbers stripped */ -#define F_LSYMS (0x0008) /* local symbols stripped */ - -#define SPARCMAGIC (0540) - -/* This is Lynx's all-platform magic number for executables. */ - -#define LYNXCOFFMAGIC (0415) - -#define FILHDR struct external_filehdr -#define FILHSZ sizeof(FILHDR) - -/********************** AOUT "OPTIONAL HEADER" **********************/ - -typedef struct -{ - char magic[2]; /* type of file */ - char vstamp[2]; /* version stamp */ - char tsize[4]; /* text size in bytes, padded to FW bdry*/ - char dsize[4]; /* initialized data " " */ - char bsize[4]; /* uninitialized data " " */ - char entry[4]; /* entry pt. */ - char text_start[4]; /* base of text used for this file */ - char data_start[4]; /* base of data used for this file */ -} -AOUTHDR; - -#define AOUTSZ (sizeof(AOUTHDR)) - -#define OMAGIC 0404 /* object files, eg as output */ -#define ZMAGIC 0413 /* demand load format, eg normal ld output */ -#define STMAGIC 0401 /* target shlib */ -#define SHMAGIC 0443 /* host shlib */ - -/********************** SECTION HEADER **********************/ - -struct external_scnhdr -{ - char s_name[8]; /* section name */ - char s_paddr[4]; /* physical address, aliased s_nlib */ - char s_vaddr[4]; /* virtual address */ - char s_size[4]; /* section size */ - char s_scnptr[4]; /* file ptr to raw data for section */ - char s_relptr[4]; /* file ptr to relocation */ - char s_lnnoptr[4]; /* file ptr to line numbers */ - char s_nreloc[2]; /* number of relocation entries */ - char s_nlnno[2]; /* number of line number entries*/ - char s_flags[4]; /* flags */ -}; - -#define SCNHDR struct external_scnhdr -#define SCNHSZ sizeof(SCNHDR) - -/* Names of "special" sections. */ - -#define _TEXT ".text" -#define _DATA ".data" -#define _BSS ".bss" -#define _TV ".tv" -#define _INIT ".init" -#define _FINI ".fini" -#define _COMMENT ".comment" -#define _LIB ".lib" - -/********************** LINE NUMBERS **********************/ - -/* 1 line number entry for every "breakpointable" source line in a section. - Line numbers are grouped on a per function basis; first entry in a function - grouping will have l_lnno = 0 and in place of physical address will be the - symbol table index of the function name. */ - -struct external_lineno -{ - union { - char l_symndx[4]; /* fn name symbol index, iff l_lnno == 0 */ - char l_paddr[4]; /* (physical) address of line number */ - } l_addr; - char l_lnno[2]; /* line number */ -}; - -#define LINENO struct external_lineno -#define LINESZ (6) - -/********************** SYMBOLS **********************/ - -#define E_SYMNMLEN (8) /* # characters in a symbol name */ -#define E_FILNMLEN (14) /* # characters in a file name */ -#define E_DIMNUM (4) /* # array dimensions in auxiliary entry */ - -struct external_syment -{ - union { - char e_name[E_SYMNMLEN]; - struct { - char e_zeroes[4]; - char e_offset[4]; - } e; -#if 0 /* of doubtful value */ - char e_nptr[2][4]; - struct { - char e_leading_zero[1]; - char e_dbx_type[1]; - char e_dbx_desc[2]; - } e_dbx; -#endif - } e; - - char e_value[4]; - char e_scnum[2]; - char e_type[2]; - char e_sclass[1]; - char e_numaux[1]; - char padding[2]; -}; - -#define N_BTMASK (0xf) -#define N_TMASK (0x30) -#define N_BTSHFT (4) -#define N_TSHIFT (2) - -union external_auxent -{ - struct { - char x_tagndx[4]; /* str, un, or enum tag indx */ - union { - struct { - char x_lnno[2]; /* declaration line number */ - char x_size[2]; /* str/union/array size */ - } x_lnsz; - char x_fsize[4]; /* size of function */ - } x_misc; - union { - struct { /* if ISFCN, tag, or .bb */ - char x_lnnoptr[4]; /* ptr to fcn line # */ - char x_endndx[4]; /* entry ndx past block end */ - } x_fcn; - struct { /* if ISARY, up to 4 dimen. */ - char x_dimen[E_DIMNUM][2]; - } x_ary; - } x_fcnary; - char x_tvndx[2]; /* tv index */ - } x_sym; - - union { - char x_fname[E_FILNMLEN]; - struct { - char x_zeroes[4]; - char x_offset[4]; - } x_n; - } x_file; - - struct { - char x_scnlen[4]; /* section length */ - char x_nreloc[2]; /* # relocation entries */ - char x_nlinno[2]; /* # line numbers */ - } x_scn; - - struct { - char x_tvfill[4]; /* tv fill value */ - char x_tvlen[2]; /* length of .tv */ - char x_tvran[2][2]; /* tv range */ - } x_tv; /* .tv section info (in auxent of sym .tv)) */ - - char x_fill[20]; /* forces to 20-byte size */ -}; - -#define SYMENT struct external_syment -#define SYMESZ 20 -#define AUXENT union external_auxent -#define AUXESZ 20 - -#define _ETEXT "etext" - -/********************** RELOCATION DIRECTIVES **********************/ - -struct external_reloc { - char r_vaddr[4]; - char r_symndx[4]; - char r_type[2]; - char r_spare[2]; - char r_offset[4]; -}; - -#define RELOC struct external_reloc -#define RELSZ sizeof (RELOC) - diff --git a/contrib/gdb/include/coff/sym.h b/contrib/gdb/include/coff/sym.h deleted file mode 100644 index 76204af59adc8..0000000000000 --- a/contrib/gdb/include/coff/sym.h +++ /dev/null @@ -1,484 +0,0 @@ -/* Declarations of internal format of MIPS ECOFF symbols. - Originally contributed by MIPS Computer Systems and Third Eye Software. - Changes contributed by Cygnus Support are in the public domain. - - This file is just aggregated with the files that make up the GNU - release; it is not considered part of GAS, GDB, or other GNU - programs. */ - -/* - * |-----------------------------------------------------------| - * | Copyright (c) 1992, 1991, 1990 MIPS Computer Systems, Inc.| - * | MIPS Computer Systems, Inc. grants reproduction and use | - * | rights to all parties, PROVIDED that this comment is | - * | maintained in the copy. | - * |-----------------------------------------------------------| - */ -#ifndef _SYM_H -#define _SYM_H - -/* (C) Copyright 1984 by Third Eye Software, Inc. - * - * Third Eye Software, Inc. grants reproduction and use rights to - * all parties, PROVIDED that this comment is maintained in the copy. - * - * Third Eye makes no claims about the applicability of this - * symbol table to a particular use. - */ - -/* - * This file contains the definition of the Third Eye Symbol Table. - * - * Symbols are assumed to be in 'encounter order' - i.e. the order that - * the things they represent were encountered by the compiler/assembler/loader. - * EXCEPT for globals! These are assumed to be bunched together, - * probably right after the last 'normal' symbol. Globals ARE sorted - * in ascending order. - * - * ----------------------------------------------------------------------- - * A brief word about Third Eye naming/use conventions: - * - * All arrays and index's are 0 based. - * All "ifooMax" values are the highest legal value PLUS ONE. This makes - * them good for allocating arrays, etc. All checks are "ifoo < ifooMax". - * - * "isym" Index into the SYMbol table. - * "ipd" Index into the Procedure Descriptor array. - * "ifd" Index into the File Descriptor array. - * "iss" Index into String Space. - * "cb" Count of Bytes. - * "rgPd" array whose domain is "0..ipdMax-1" and RanGe is PDR. - * "rgFd" array whose domain is "0..ifdMax-1" and RanGe is FDR. - */ - - -/* - * Symbolic Header (HDR) structure. - * As long as all the pointers are set correctly, - * we don't care WHAT order the various sections come out in! - * - * A file produced solely for the use of CDB will probably NOT have - * any instructions or data areas in it, as these are available - * in the original. - */ - -typedef struct { - short magic; /* to verify validity of the table */ - short vstamp; /* version stamp */ - long ilineMax; /* number of line number entries */ - bfd_vma cbLine; /* number of bytes for line number entries */ - bfd_vma cbLineOffset; /* offset to start of line number entries*/ - long idnMax; /* max index into dense number table */ - bfd_vma cbDnOffset; /* offset to start dense number table */ - long ipdMax; /* number of procedures */ - bfd_vma cbPdOffset; /* offset to procedure descriptor table */ - long isymMax; /* number of local symbols */ - bfd_vma cbSymOffset; /* offset to start of local symbols*/ - long ioptMax; /* max index into optimization symbol entries */ - bfd_vma cbOptOffset; /* offset to optimization symbol entries */ - long iauxMax; /* number of auxillary symbol entries */ - bfd_vma cbAuxOffset; /* offset to start of auxillary symbol entries*/ - long issMax; /* max index into local strings */ - bfd_vma cbSsOffset; /* offset to start of local strings */ - long issExtMax; /* max index into external strings */ - bfd_vma cbSsExtOffset; /* offset to start of external strings */ - long ifdMax; /* number of file descriptor entries */ - bfd_vma cbFdOffset; /* offset to file descriptor table */ - long crfd; /* number of relative file descriptor entries */ - bfd_vma cbRfdOffset; /* offset to relative file descriptor table */ - long iextMax; /* max index into external symbols */ - bfd_vma cbExtOffset; /* offset to start of external symbol entries*/ - /* If you add machine dependent fields, add them here */ - } HDRR, *pHDRR; -#define cbHDRR sizeof(HDRR) -#define hdrNil ((pHDRR)0) - -/* - * The FDR and PDR structures speed mapping of address <-> name. - * They are sorted in ascending memory order and are kept in - * memory by CDB at runtime. - */ - -/* - * File Descriptor - * - * There is one of these for EVERY FILE, whether compiled with - * full debugging symbols or not. The name of a file should be - * the path name given to the compiler. This allows the user - * to simply specify the names of the directories where the COMPILES - * were done, and we will be able to find their files. - * A field whose comment starts with "R - " indicates that it will be - * setup at runtime. - */ -typedef struct fdr { - bfd_vma adr; /* memory address of beginning of file */ - long rss; /* file name (of source, if known) */ - long issBase; /* file's string space */ - bfd_vma cbSs; /* number of bytes in the ss */ - long isymBase; /* beginning of symbols */ - long csym; /* count file's of symbols */ - long ilineBase; /* file's line symbols */ - long cline; /* count of file's line symbols */ - long ioptBase; /* file's optimization entries */ - long copt; /* count of file's optimization entries */ - unsigned short ipdFirst;/* start of procedures for this file */ - short cpd; /* count of procedures for this file */ - long iauxBase; /* file's auxiliary entries */ - long caux; /* count of file's auxiliary entries */ - long rfdBase; /* index into the file indirect table */ - long crfd; /* count file indirect entries */ - unsigned lang: 5; /* language for this file */ - unsigned fMerge : 1; /* whether this file can be merged */ - unsigned fReadin : 1; /* true if it was read in (not just created) */ - unsigned fBigendian : 1;/* if set, was compiled on big endian machine */ - /* aux's will be in compile host's sex */ - unsigned glevel : 2; /* level this file was compiled with */ - unsigned reserved : 22; /* reserved for future use */ - bfd_vma cbLineOffset; /* byte offset from header for this file ln's */ - bfd_vma cbLine; /* size of lines for this file */ - } FDR, *pFDR; -#define cbFDR sizeof(FDR) -#define fdNil ((pFDR)0) -#define ifdNil -1 -#define ifdTemp 0 -#define ilnNil -1 - - -/* - * Procedure Descriptor - * - * There is one of these for EVERY TEXT LABEL. - * If a procedure is in a file with full symbols, then isym - * will point to the PROC symbols, else it will point to the - * global symbol for the label. - */ - -typedef struct pdr { - bfd_vma adr; /* memory address of start of procedure */ - long isym; /* start of local symbol entries */ - long iline; /* start of line number entries*/ - long regmask; /* save register mask */ - long regoffset; /* save register offset */ - long iopt; /* start of optimization symbol entries*/ - long fregmask; /* save floating point register mask */ - long fregoffset; /* save floating point register offset */ - long frameoffset; /* frame size */ - short framereg; /* frame pointer register */ - short pcreg; /* offset or reg of return pc */ - long lnLow; /* lowest line in the procedure */ - long lnHigh; /* highest line in the procedure */ - bfd_vma cbLineOffset; /* byte offset for this procedure from the fd base */ - /* These fields are new for 64 bit ECOFF. */ - unsigned gp_prologue : 8; /* byte size of GP prologue */ - unsigned gp_used : 1; /* true if the procedure uses GP */ - unsigned reg_frame : 1; /* true if register frame procedure */ - unsigned prof : 1; /* true if compiled with -pg */ - unsigned reserved : 13; /* reserved: must be zero */ - unsigned localoff : 8; /* offset of local variables from vfp */ - } PDR, *pPDR; -#define cbPDR sizeof(PDR) -#define pdNil ((pPDR) 0) -#define ipdNil -1 - -/* - * The structure of the runtime procedure descriptor created by the loader - * for use by the static exception system. - */ -/* - * If 0'd out because exception_info chokes Visual C++ and because there - * don't seem to be any references to this structure elsewhere in gdb. - */ -#if 0 -typedef struct runtime_pdr { - bfd_vma adr; /* memory address of start of procedure */ - long regmask; /* save register mask */ - long regoffset; /* save register offset */ - long fregmask; /* save floating point register mask */ - long fregoffset; /* save floating point register offset */ - long frameoffset; /* frame size */ - short framereg; /* frame pointer register */ - short pcreg; /* offset or reg of return pc */ - long irpss; /* index into the runtime string table */ - long reserved; - struct exception_info *exception_info;/* pointer to exception array */ -} RPDR, *pRPDR; -#define cbRPDR sizeof(RPDR) -#define rpdNil ((pRPDR) 0) -#endif - -/* - * Line Numbers - * - * Line Numbers are segregated from the normal symbols because they - * are [1] smaller , [2] are of no interest to your - * average loader, and [3] are never needed in the middle of normal - * scanning and therefore slow things down. - * - * By definition, the first LINER for any given procedure will have - * the first line of a procedure and represent the first address. - */ - -typedef long LINER, *pLINER; -#define lineNil ((pLINER)0) -#define cbLINER sizeof(LINER) -#define ilineNil -1 - - - -/* - * The Symbol Structure (GFW, to those who Know!) - */ - -typedef struct { - long iss; /* index into String Space of name */ - bfd_vma value; /* value of symbol */ - unsigned st : 6; /* symbol type */ - unsigned sc : 5; /* storage class - text, data, etc */ - unsigned reserved : 1; /* reserved */ - unsigned index : 20; /* index into sym/aux table */ - } SYMR, *pSYMR; -#define symNil ((pSYMR)0) -#define cbSYMR sizeof(SYMR) -#define isymNil -1 -#define indexNil 0xfffff -#define issNil -1 -#define issNull 0 - - -/* The following converts a memory resident string to an iss. - * This hack is recognized in SbFIss, in sym.c of the debugger. - */ -#define IssFSb(sb) (0x80000000 | ((unsigned long)(sb))) - -/* E X T E R N A L S Y M B O L R E C O R D - * - * Same as the SYMR except it contains file context to determine where - * the index is. - */ -typedef struct ecoff_extr { - unsigned jmptbl:1; /* symbol is a jump table entry for shlibs */ - unsigned cobol_main:1; /* symbol is a cobol main procedure */ - unsigned weakext:1; /* symbol is weak external */ - unsigned reserved:13; /* reserved for future use */ - int ifd; /* where the iss and index fields point into */ - SYMR asym; /* symbol for the external */ - } EXTR, *pEXTR; -#define extNil ((pEXTR)0) -#define cbEXTR sizeof(EXTR) - - -/* A U X I L L A R Y T Y P E I N F O R M A T I O N */ - -/* - * Type Information Record - */ -typedef struct { - unsigned fBitfield : 1; /* set if bit width is specified */ - unsigned continued : 1; /* indicates additional TQ info in next AUX */ - unsigned bt : 6; /* basic type */ - unsigned tq4 : 4; - unsigned tq5 : 4; - /* ---- 16 bit boundary ---- */ - unsigned tq0 : 4; - unsigned tq1 : 4; /* 6 type qualifiers - tqPtr, etc. */ - unsigned tq2 : 4; - unsigned tq3 : 4; - } TIR, *pTIR; -#define cbTIR sizeof(TIR) -#define tiNil ((pTIR)0) -#define itqMax 6 - -/* - * Relative symbol record - * - * If the rfd field is 4095, the index field indexes into the global symbol - * table. - */ - -typedef struct { - unsigned rfd : 12; /* index into the file indirect table */ - unsigned index : 20; /* index int sym/aux/iss tables */ - } RNDXR, *pRNDXR; -#define cbRNDXR sizeof(RNDXR) -#define rndxNil ((pRNDXR)0) - -/* dense numbers or sometimes called block numbers are stored in this type, - * a rfd of 0xffffffff is an index into the global table. - */ -typedef struct { - unsigned long rfd; /* index into the file table */ - unsigned long index; /* index int sym/aux/iss tables */ - } DNR, *pDNR; -#define cbDNR sizeof(DNR) -#define dnNil ((pDNR)0) - - - -/* - * Auxillary information occurs only if needed. - * It ALWAYS occurs in this order when present. - - isymMac used by stProc only - TIR type info - TIR additional TQ info (if first TIR was not enough) - rndx if (bt == btStruct,btUnion,btEnum,btSet,btRange, - btTypedef): - rsym.index == iaux for btSet or btRange - else rsym.index == isym - dimLow btRange, btSet - dimMac btRange, btSet - rndx0 As many as there are tq arrays - dimLow0 - dimHigh0 - ... - rndxMax-1 - dimLowMax-1 - dimHighMax-1 - width in bits if (bit field), width in bits. - */ -#define cAuxMax (6 + (idimMax*3)) - -/* a union of all possible info in the AUX universe */ -typedef union { - TIR ti; /* type information record */ - RNDXR rndx; /* relative index into symbol table */ - long dnLow; /* low dimension */ - long dnHigh; /* high dimension */ - long isym; /* symbol table index (end of proc) */ - long iss; /* index into string space (not used) */ - long width; /* width for non-default sized struc fields */ - long count; /* count of ranges for variant arm */ - } AUXU, *pAUXU; -#define cbAUXU sizeof(AUXU) -#define auxNil ((pAUXU)0) -#define iauxNil -1 - - -/* - * Optimization symbols - * - * Optimization symbols contain some overlap information with the normal - * symbol table. In particular, the proc information - * is somewhat redundant but necessary to easily find the other information - * present. - * - * All of the offsets are relative to the beginning of the last otProc - */ - -typedef struct { - unsigned ot: 8; /* optimization type */ - unsigned value: 24; /* address where we are moving it to */ - RNDXR rndx; /* points to a symbol or opt entry */ - unsigned long offset; /* relative offset this occured */ - } OPTR, *pOPTR; -#define optNil ((pOPTR) 0) -#define cbOPTR sizeof(OPTR) -#define ioptNil -1 - -/* - * File Indirect - * - * When a symbol is referenced across files the following procedure is used: - * 1) use the file index to get the File indirect entry. - * 2) use the file indirect entry to get the File descriptor. - * 3) add the sym index to the base of that file's sym table - * - */ - -typedef long RFDT, *pRFDT; -#define cbRFDT sizeof(RFDT) -#define rfdNil -1 - -/* - * The file indirect table in the mips loader is known as an array of FITs. - * This is done to keep the code in the loader readable in the area where - * these tables are merged. Note this is only a name change. - */ -typedef long FIT, *pFIT; -#define cbFIT sizeof(FIT) -#define ifiNil -1 -#define fiNil ((pFIT) 0) - -#ifdef _LANGUAGE_PASCAL -#define ifdNil -1 -#define ilnNil -1 -#define ipdNil -1 -#define ilineNil -1 -#define isymNil -1 -#define indexNil 16#fffff -#define issNil -1 -#define issNull 0 -#define itqMax 6 -#define iauxNil -1 -#define ioptNil -1 -#define rfdNil -1 -#define ifiNil -1 -#endif /* _LANGUAGE_PASCAL */ - - -/* Dense numbers - * - * Rather than use file index, symbol index pairs to represent symbols - * and globals, we use dense number so that they can be easily embeded - * in intermediate code and the programs that process them can - * use direct access tabls instead of hash table (which would be - * necesary otherwise because of the sparse name space caused by - * file index, symbol index pairs. Dense number are represented - * by RNDXRs. - */ - -/* - * The following table defines the meaning of each SYM field as - * a function of the "st". (scD/B == scData OR scBss) - * - * Note: the value "isymMac" is used by symbols that have the concept - * of enclosing a block of related information. This value is the - * isym of the first symbol AFTER the end associated with the primary - * symbol. For example if a procedure was at isym==90 and had an - * isymMac==155, the associated end would be at isym==154, and the - * symbol at 155 would probably (although not necessarily) be the - * symbol for the next procedure. This allows rapid skipping over - * internal information of various sorts. "stEnd"s ALWAYS have the - * isym of the primary symbol that started the block. - * - -ST SC VALUE INDEX --------- ------ -------- ------ -stFile scText address isymMac -stLabel scText address --- -stGlobal scD/B address iaux -stStatic scD/B address iaux -stParam scAbs offset iaux -stLocal scAbs offset iaux -stProc scText address iaux (isymMac is first AUX) -stStaticProc scText address iaux (isymMac is first AUX) - -stMember scNil ordinal --- (if member of enum) - (mipsread thinks the case below has a bit, not byte, offset.) -stMember scNil byte offset iaux (if member of struct/union) -stMember scBits bit offset iaux (bit field spec) - -stBlock scText address isymMac (text block) - (the code seems to think that rather than scNil, we see scInfo for - the two cases below.) -stBlock scNil cb isymMac (struct/union member define) -stBlock scNil cMembers isymMac (enum member define) - - (New types added by SGI to simplify things:) -stStruct scInfo cb isymMac (struct type define) -stUnion scInfo cb isymMac (union type define) -stEnum scInfo cMembers isymMac (enum type define) - -stEnd scText address isymStart -stEnd scNil ------- isymStart (struct/union/enum) - -stTypedef scNil ------- iaux -stRegReloc sc??? value old register number -stForward sc??? new address isym to original symbol - -stConstant scInfo value --- (scalar) -stConstant scInfo iss --- (complex, e.g. string) - - * - */ -#endif diff --git a/contrib/gdb/include/coff/symconst.h b/contrib/gdb/include/coff/symconst.h deleted file mode 100644 index f40eef2a31156..0000000000000 --- a/contrib/gdb/include/coff/symconst.h +++ /dev/null @@ -1,177 +0,0 @@ -/* Declarations of constants for internal format of MIPS ECOFF symbols. - Originally contributed by MIPS Computer Systems and Third Eye Software. - Changes contributed by Cygnus Support are in the public domain. - - This file is just aggregated with the files that make up the GNU - release; it is not considered part of GAS, GDB, or other GNU - programs. */ - -/* - * |-----------------------------------------------------------| - * | Copyright (c) 1992, 1991, 1990 MIPS Computer Systems, Inc.| - * | MIPS Computer Systems, Inc. grants reproduction and use | - * | rights to all parties, PROVIDED that this comment is | - * | maintained in the copy. | - * |-----------------------------------------------------------| - */ - -/* (C) Copyright 1984 by Third Eye Software, Inc. - * - * Third Eye Software, Inc. grants reproduction and use rights to - * all parties, PROVIDED that this comment is maintained in the copy. - * - * Third Eye makes no claims about the applicability of this - * symbol table to a particular use. - */ - -/* glevels for field in FDR */ -#define GLEVEL_0 2 -#define GLEVEL_1 1 -#define GLEVEL_2 0 /* for upward compat reasons. */ -#define GLEVEL_3 3 - -/* magic number fo symheader */ -#define magicSym 0x7009 -/* The Alpha uses this value instead, for some reason. */ -#define magicSym2 0x1992 - -/* Language codes */ -#define langC 0 -#define langPascal 1 -#define langFortran 2 -#define langAssembler 3 /* one Assembley inst might map to many mach */ -#define langMachine 4 -#define langNil 5 -#define langAda 6 -#define langPl1 7 -#define langCobol 8 -#define langStdc 9 /* FIXME: Collides with SGI langCplusplus */ -#define langCplusplus 9 /* FIXME: Collides with langStdc */ -#define langCplusplusV2 10 /* SGI addition */ -#define langMax 11 /* maximun allowed 32 -- 5 bits */ - -/* The following are value definitions for the fields in the SYMR */ - -/* - * Storage Classes - */ - -#define scNil 0 -#define scText 1 /* text symbol */ -#define scData 2 /* initialized data symbol */ -#define scBss 3 /* un-initialized data symbol */ -#define scRegister 4 /* value of symbol is register number */ -#define scAbs 5 /* value of symbol is absolute */ -#define scUndefined 6 /* who knows? */ -#define scCdbLocal 7 /* variable's value is IN se->va.?? */ -#define scBits 8 /* this is a bit field */ -#define scCdbSystem 9 /* variable's value is IN CDB's address space */ -#define scDbx 9 /* overlap dbx internal use */ -#define scRegImage 10 /* register value saved on stack */ -#define scInfo 11 /* symbol contains debugger information */ -#define scUserStruct 12 /* address in struct user for current process */ -#define scSData 13 /* load time only small data */ -#define scSBss 14 /* load time only small common */ -#define scRData 15 /* load time only read only data */ -#define scVar 16 /* Var parameter (fortran,pascal) */ -#define scCommon 17 /* common variable */ -#define scSCommon 18 /* small common */ -#define scVarRegister 19 /* Var parameter in a register */ -#define scVariant 20 /* Variant record */ -#define scSUndefined 21 /* small undefined(external) data */ -#define scInit 22 /* .init section symbol */ -#define scBasedVar 23 /* Fortran or PL/1 ptr based var */ -#define scXData 24 /* exception handling data */ -#define scPData 25 /* Procedure section */ -#define scFini 26 /* .fini section */ -#define scRConst 27 /* .rconst section */ -#define scMax 32 - - -/* - * Symbol Types - */ - -#define stNil 0 /* Nuthin' special */ -#define stGlobal 1 /* external symbol */ -#define stStatic 2 /* static */ -#define stParam 3 /* procedure argument */ -#define stLocal 4 /* local variable */ -#define stLabel 5 /* label */ -#define stProc 6 /* " " Procedure */ -#define stBlock 7 /* beginnning of block */ -#define stEnd 8 /* end (of anything) */ -#define stMember 9 /* member (of anything - struct/union/enum */ -#define stTypedef 10 /* type definition */ -#define stFile 11 /* file name */ -#define stRegReloc 12 /* register relocation */ -#define stForward 13 /* forwarding address */ -#define stStaticProc 14 /* load time only static procs */ -#define stConstant 15 /* const */ -#define stStaParam 16 /* Fortran static parameters */ - /* These new symbol types have been recently added to SGI machines. */ -#define stStruct 26 /* Beginning of block defining a struct type */ -#define stUnion 27 /* Beginning of block defining a union type */ -#define stEnum 28 /* Beginning of block defining an enum type */ -#define stIndirect 34 /* Indirect type specification */ - /* Pseudo-symbols - internal to debugger */ -#define stStr 60 /* string */ -#define stNumber 61 /* pure number (ie. 4 NOR 2+2) */ -#define stExpr 62 /* 2+2 vs. 4 */ -#define stType 63 /* post-coersion SER */ -#define stMax 64 - -/* definitions for fields in TIR */ - -/* type qualifiers for ti.tq0 -> ti.(itqMax-1) */ -#define tqNil 0 /* bt is what you see */ -#define tqPtr 1 /* pointer */ -#define tqProc 2 /* procedure */ -#define tqArray 3 /* duh */ -#define tqFar 4 /* longer addressing - 8086/8 land */ -#define tqVol 5 /* volatile */ -#define tqConst 6 /* const */ -#define tqMax 8 - -/* basic types as seen in ti.bt */ -#define btNil 0 /* undefined (also, enum members) */ -#define btAdr 1 /* address - integer same size as pointer */ -#define btChar 2 /* character */ -#define btUChar 3 /* unsigned character */ -#define btShort 4 /* short */ -#define btUShort 5 /* unsigned short */ -#define btInt 6 /* int */ -#define btUInt 7 /* unsigned int */ -#define btLong 8 /* long */ -#define btULong 9 /* unsigned long */ -#define btFloat 10 /* float (real) */ -#define btDouble 11 /* Double (real) */ -#define btStruct 12 /* Structure (Record) */ -#define btUnion 13 /* Union (variant) */ -#define btEnum 14 /* Enumerated */ -#define btTypedef 15 /* defined via a typedef, isymRef points */ -#define btRange 16 /* subrange of int */ -#define btSet 17 /* pascal sets */ -#define btComplex 18 /* fortran complex */ -#define btDComplex 19 /* fortran double complex */ -#define btIndirect 20 /* forward or unnamed typedef */ -#define btFixedDec 21 /* Fixed Decimal */ -#define btFloatDec 22 /* Float Decimal */ -#define btString 23 /* Varying Length Character String */ -#define btBit 24 /* Aligned Bit String */ -#define btPicture 25 /* Picture */ -#define btVoid 26 /* void */ -#define btLongLong 27 /* long long */ -#define btULongLong 28 /* unsigned long long */ -#define btMax 64 - -#if (_MFG == _MIPS) -/* optimization type codes */ -#define otNil 0 -#define otReg 1 /* move var to reg */ -#define otBlock 2 /* begin basic block */ -#define otProc 3 /* procedure */ -#define otInline 4 /* inline procedure */ -#define otEnd 5 /* whatever you started */ -#define otMax 6 /* KEEP UP TO DATE */ -#endif /* (_MFG == _MIPS) */ diff --git a/contrib/gdb/include/coff/w65.h b/contrib/gdb/include/coff/w65.h deleted file mode 100644 index c80b9fee5de02..0000000000000 --- a/contrib/gdb/include/coff/w65.h +++ /dev/null @@ -1,201 +0,0 @@ -/*** coff information for WDC 65816 */ - -/********************** FILE HEADER **********************/ - -struct external_filehdr { - char f_magic[2]; /* magic number */ - char f_nscns[2]; /* number of sections */ - char f_timdat[4]; /* time & date stamp */ - char f_symptr[4]; /* file pointer to symtab */ - char f_nsyms[4]; /* number of symtab entries */ - char f_opthdr[2]; /* sizeof(optional hdr) */ - char f_flags[2]; /* flags */ -}; - - - -#define W65MAGIC 0x6500 - - -#define W65BADMAG(x) (((x).f_magic!=W65MAGIC)) - -#define FILHDR struct external_filehdr -#define FILHSZ sizeof(FILHDR) - - -/********************** AOUT "OPTIONAL HEADER" **********************/ - - -typedef struct -{ - char magic[2]; /* type of file */ - char vstamp[2]; /* version stamp */ - char tsize[4]; /* text size in bytes, padded to FW bdry*/ - char dsize[4]; /* initialized data " " */ - char bsize[4]; /* uninitialized data " " */ - char entry[4]; /* entry pt. */ - char text_start[4]; /* base of text used for this file */ - char data_start[4]; /* base of data used for this file */ -} -AOUTHDR; - - -#define AOUTHDRSZ (sizeof(AOUTHDR)) -#define AOUTSZ (sizeof(AOUTHDR)) - - - - -/********************** SECTION HEADER **********************/ - - -struct external_scnhdr { - char s_name[8]; /* section name */ - char s_paddr[4]; /* physical address, aliased s_nlib */ - char s_vaddr[4]; /* virtual address */ - char s_size[4]; /* section size */ - char s_scnptr[4]; /* file ptr to raw data for section */ - char s_relptr[4]; /* file ptr to relocation */ - char s_lnnoptr[4]; /* file ptr to line numbers */ - char s_nreloc[2]; /* number of relocation entries */ - char s_nlnno[2]; /* number of line number entries*/ - char s_flags[4]; /* flags */ -}; - -/* - * names of "special" sections - */ -#define _TEXT ".text" -#define _DATA ".data" -#define _BSS ".bss" - - -#define SCNHDR struct external_scnhdr -#define SCNHSZ sizeof(SCNHDR) - - -/********************** LINE NUMBERS **********************/ - -/* 1 line number entry for every "breakpointable" source line in a section. - * Line numbers are grouped on a per function basis; first entry in a function - * grouping will have l_lnno = 0 and in place of physical address will be the - * symbol table index of the function name. - */ -struct external_lineno { - union { - char l_symndx[4]; /* function name symbol index, iff l_lnno == 0*/ - char l_paddr[4]; /* (physical) address of line number */ - } l_addr; - char l_lnno[4]; /* line number */ -}; - -#define GET_LINENO_LNNO(abfd, ext) bfd_h_get_32(abfd, (bfd_byte *) (ext->l_lnno)); -#define PUT_LINENO_LNNO(abfd,val, ext) bfd_h_put_32(abfd,val, (bfd_byte *) (ext->l_lnno)); - -#define LINENO struct external_lineno -#define LINESZ sizeof(LINENO) - - -/********************** SYMBOLS **********************/ - -#define E_SYMNMLEN 8 /* # characters in a symbol name */ -#define E_FILNMLEN 14 /* # characters in a file name */ -#define E_DIMNUM 4 /* # array dimensions in auxiliary entry */ - -struct external_syment -{ - union { - char e_name[E_SYMNMLEN]; - struct { - char e_zeroes[4]; - char e_offset[4]; - } e; - } e; - char e_value[4]; - char e_scnum[2]; - char e_type[2]; - char e_sclass[1]; - char e_numaux[1]; -}; - - - -#define N_BTMASK (017) -#define N_TMASK (060) -#define N_BTSHFT (4) -#define N_TSHIFT (2) - - -union external_auxent { - struct { - char x_tagndx[4]; /* str, un, or enum tag indx */ - union { - struct { - char x_lnno[2]; /* declaration line number */ - char x_size[2]; /* str/union/array size */ - } x_lnsz; - char x_fsize[4]; /* size of function */ - } x_misc; - union { - struct { /* if ISFCN, tag, or .bb */ - char x_lnnoptr[4]; /* ptr to fcn line # */ - char x_endndx[4]; /* entry ndx past block end */ - } x_fcn; - struct { /* if ISARY, up to 4 dimen. */ - char x_dimen[E_DIMNUM][2]; - } x_ary; - } x_fcnary; - char x_tvndx[2]; /* tv index */ - } x_sym; - - union { - char x_fname[E_FILNMLEN]; - struct { - char x_zeroes[4]; - char x_offset[4]; - } x_n; - } x_file; - - struct { - char x_scnlen[4]; /* section length */ - char x_nreloc[2]; /* # relocation entries */ - char x_nlinno[2]; /* # line numbers */ - } x_scn; - - struct { - char x_tvfill[4]; /* tv fill value */ - char x_tvlen[2]; /* length of .tv */ - char x_tvran[2][2]; /* tv range */ - } x_tv; /* info about .tv section (in auxent of symbol .tv)) */ - - -}; - -#define SYMENT struct external_syment -#define SYMESZ 18 -#define AUXENT union external_auxent -#define AUXESZ 18 - - - -/********************** RELOCATION DIRECTIVES **********************/ - -/* The external reloc has an offset field, because some of the reloc - types on the w65 don't have room in the instruction for the entire - offset - eg the strange jump and high page addressing modes */ - -struct external_reloc { - char r_vaddr[4]; - char r_symndx[4]; - char r_offset[4]; - char r_type[2]; - char r_stuff[2]; -}; - - -#define RELOC struct external_reloc -#define RELSZ 16 - - - - diff --git a/contrib/gdb/include/coff/we32k.h b/contrib/gdb/include/coff/we32k.h deleted file mode 100644 index 414c4506e0b05..0000000000000 --- a/contrib/gdb/include/coff/we32k.h +++ /dev/null @@ -1,206 +0,0 @@ -/*** coff information for we32k */ - -/********************** FILE HEADER **********************/ - -struct external_filehdr { - char f_magic[2]; /* magic number */ - char f_nscns[2]; /* number of sections */ - char f_timdat[4]; /* time & date stamp */ - char f_symptr[4]; /* file pointer to symtab */ - char f_nsyms[4]; /* number of symtab entries */ - char f_opthdr[2]; /* sizeof(optional hdr) */ - char f_flags[2]; /* flags */ -}; - - -/* Bits for f_flags: - * F_RELFLG relocation info stripped from file - * F_EXEC file is executable (no unresolved external references) - * F_LNNO line numbers stripped from file - * F_LSYMS local symbols stripped from file - * F_AR32WR file has byte ordering of an AR32WR machine (e.g. vax) - */ - -#define F_RELFLG (0x0001) -#define F_EXEC (0x0002) -#define F_LNNO (0x0004) -#define F_LSYMS (0x0008) -#define F_BM32B (0020000) -#define F_BM32MAU (0040000) - -#define WE32KMAGIC 0x170 /* we32k sans transfer vector */ -#define FBOMAGIC 0x170 /* we32k sans transfer vector */ -#define MTVMAGIC 0x171 /* we32k with transfer vector */ -#define RBOMAGIC 0x172 /* reserved */ -#define WE32KBADMAG(x) (((x).f_magic != WE32KMAGIC) \ - && ((x).f_magic != FBOMAGIC) \ - && ((x).f_magic != RBOMAGIC) \ - && ((x).f_magic != MTVMAGIC)) - -#define FILHDR struct external_filehdr -#define FILHSZ sizeof(FILHDR) - - -/********************** AOUT "OPTIONAL HEADER" **********************/ - - -typedef struct -{ - char magic[2]; /* type of file */ - char vstamp[2]; /* version stamp */ - char tsize[4]; /* text size in bytes, padded to FW bdry*/ - char dsize[4]; /* initialized data " " */ - char bsize[4]; /* uninitialized data " " */ - char entry[4]; /* entry pt. */ - char text_start[4]; /* base of text used for this file */ - char data_start[4]; /* base of data used for this file */ -} -AOUTHDR; - -#define AOUTSZ (sizeof(AOUTHDR)) - - -/********************** SECTION HEADER **********************/ - - -struct external_scnhdr { - char s_name[8]; /* section name */ - char s_paddr[4]; /* physical address, aliased s_nlib */ - char s_vaddr[4]; /* virtual address */ - char s_size[4]; /* section size */ - char s_scnptr[4]; /* file ptr to raw data for section */ - char s_relptr[4]; /* file ptr to relocation */ - char s_lnnoptr[4]; /* file ptr to line numbers */ - char s_nreloc[2]; /* number of relocation entries */ - char s_nlnno[2]; /* number of line number entries*/ - char s_flags[4]; /* flags */ -}; - -#define SCNHDR struct external_scnhdr -#define SCNHSZ sizeof(SCNHDR) - -/* - * names of "special" sections - */ -#define _TEXT ".text" -#define _DATA ".data" -#define _BSS ".bss" -#define _TV ".tv" -#define _INIT ".init" -#define _FINI ".fini" - -/********************** LINE NUMBERS **********************/ - -/* 1 line number entry for every "breakpointable" source line in a section. - * Line numbers are grouped on a per function basis; first entry in a function - * grouping will have l_lnno = 0 and in place of physical address will be the - * symbol table index of the function name. - */ -struct external_lineno { - union { - char l_symndx[4]; /* function name symbol index, iff l_lnno == 0*/ - char l_paddr[4]; /* (physical) address of line number */ - } l_addr; - char l_lnno[2]; /* line number */ -}; - - -#define LINENO struct external_lineno -#define LINESZ sizeof(LINENO) - - -/********************** SYMBOLS **********************/ - -#define E_SYMNMLEN 8 /* # characters in a symbol name */ -#define E_FILNMLEN 14 /* # characters in a file name */ -#define E_DIMNUM 4 /* # array dimensions in auxiliary entry */ - -struct external_syment -{ - union { - char e_name[E_SYMNMLEN]; - struct { - char e_zeroes[4]; - char e_offset[4]; - } e; - } e; - char e_value[4]; - char e_scnum[2]; - char e_type[2]; - char e_sclass[1]; - char e_numaux[1]; -}; - -#define N_BTMASK (0xf) -#define N_TMASK (0x30) -#define N_BTSHFT (4) -#define N_TSHIFT (2) - -union external_auxent { - struct { - char x_tagndx[4]; /* str, un, or enum tag indx */ - union { - struct { - char x_lnno[2]; /* declaration line number */ - char x_size[2]; /* str/union/array size */ - } x_lnsz; - char x_fsize[4]; /* size of function */ - } x_misc; - union { - struct { /* if ISFCN, tag, or .bb */ - char x_lnnoptr[4]; /* ptr to fcn line # */ - char x_endndx[4]; /* entry ndx past block end */ - } x_fcn; - struct { /* if ISARY, up to 4 dimen. */ - char x_dimen[E_DIMNUM][2]; - } x_ary; - } x_fcnary; - char x_tvndx[2]; /* tv index */ - } x_sym; - - union { - char x_fname[E_FILNMLEN]; - struct { - char x_zeroes[4]; - char x_offset[4]; - } x_n; - } x_file; - - struct { - char x_scnlen[4]; /* section length */ - char x_nreloc[2]; /* # relocation entries */ - char x_nlinno[2]; /* # line numbers */ - } x_scn; - - struct { - char x_tvfill[4]; /* tv fill value */ - char x_tvlen[2]; /* length of .tv */ - char x_tvran[2][2]; /* tv range */ - } x_tv; /* info about .tv section (in auxent of symbol .tv)) */ - - -}; - -#define SYMENT struct external_syment -#define SYMESZ 18 -#define AUXENT union external_auxent -#define AUXESZ 18 - - -# define _ETEXT "etext" - - -/********************** RELOCATION DIRECTIVES **********************/ - - - -struct external_reloc { - char r_vaddr[4]; - char r_symndx[4]; - char r_type[2]; -}; - - -#define RELOC struct external_reloc -#define RELSZ sizeof(RELOC) - diff --git a/contrib/gdb/include/coff/z8k.h b/contrib/gdb/include/coff/z8k.h deleted file mode 100644 index 48817952829f2..0000000000000 --- a/contrib/gdb/include/coff/z8k.h +++ /dev/null @@ -1,201 +0,0 @@ -/*** coff information for Zilog Z800N */ - -/********************** FILE HEADER **********************/ - -struct external_filehdr { - char f_magic[2]; /* magic number */ - char f_nscns[2]; /* number of sections */ - char f_timdat[4]; /* time & date stamp */ - char f_symptr[4]; /* file pointer to symtab */ - char f_nsyms[4]; /* number of symtab entries */ - char f_opthdr[2]; /* sizeof(optional hdr) */ - char f_flags[2]; /* flags */ -}; - - -/* Type of cpu is stored in flags */ -#define F_Z8001 0x1000 -#define F_Z8002 0x2000 -#define F_MACHMASK 0xf000 - -#define Z8KMAGIC 0x8000 - -#define Z8KBADMAG(x) (((x).f_magic!=Z8KMAGIC)) - -#define FILHDR struct external_filehdr -#define FILHSZ sizeof(FILHDR) - - -/********************** AOUT "OPTIONAL HEADER" **********************/ - - -typedef struct -{ - char magic[2]; /* type of file */ - char vstamp[2]; /* version stamp */ - char tsize[4]; /* text size in bytes, padded to FW bdry*/ - char dsize[4]; /* initialized data " " */ - char bsize[4]; /* uninitialized data " " */ - char entry[4]; /* entry pt. */ - char text_start[4]; /* base of text used for this file */ - char data_start[4]; /* base of data used for this file */ -} -AOUTHDR; - - -#define AOUTHDRSZ (sizeof(AOUTHDR)) -#define AOUTSZ (sizeof(AOUTHDR)) - - - - -/********************** SECTION HEADER **********************/ - - -struct external_scnhdr { - char s_name[8]; /* section name */ - char s_paddr[4]; /* physical address, aliased s_nlib */ - char s_vaddr[4]; /* virtual address */ - char s_size[4]; /* section size */ - char s_scnptr[4]; /* file ptr to raw data for section */ - char s_relptr[4]; /* file ptr to relocation */ - char s_lnnoptr[4]; /* file ptr to line numbers */ - char s_nreloc[2]; /* number of relocation entries */ - char s_nlnno[2]; /* number of line number entries*/ - char s_flags[4]; /* flags */ -}; - -/* - * names of "special" sections - */ -#define _TEXT ".text" -#define _DATA ".data" -#define _BSS ".bss" - - -#define SCNHDR struct external_scnhdr -#define SCNHSZ sizeof(SCNHDR) - - -/********************** LINE NUMBERS **********************/ - -/* 1 line number entry for every "breakpointable" source line in a section. - * Line numbers are grouped on a per function basis; first entry in a function - * grouping will have l_lnno = 0 and in place of physical address will be the - * symbol table index of the function name. - */ -struct external_lineno { - union { - char l_symndx[4]; /* function name symbol index, iff l_lnno == 0*/ - char l_paddr[4]; /* (physical) address of line number */ - } l_addr; - char l_lnno[4]; /* line number */ -}; - -#define GET_LINENO_LNNO(abfd, ext) bfd_h_get_32(abfd, (bfd_byte *) (ext->l_lnno)); -#define PUT_LINENO_LNNO(abfd,val, ext) bfd_h_put_32(abfd,val, (bfd_byte *) (ext->l_lnno)); - -#define LINENO struct external_lineno -#define LINESZ sizeof(LINENO) - - -/********************** SYMBOLS **********************/ - -#define E_SYMNMLEN 8 /* # characters in a symbol name */ -#define E_FILNMLEN 14 /* # characters in a file name */ -#define E_DIMNUM 4 /* # array dimensions in auxiliary entry */ - -struct external_syment -{ - union { - char e_name[E_SYMNMLEN]; - struct { - char e_zeroes[4]; - char e_offset[4]; - } e; - } e; - char e_value[4]; - char e_scnum[2]; - char e_type[2]; - char e_sclass[1]; - char e_numaux[1]; -}; - - - -#define N_BTMASK (017) -#define N_TMASK (060) -#define N_BTSHFT (4) -#define N_TSHIFT (2) - - -union external_auxent { - struct { - char x_tagndx[4]; /* str, un, or enum tag indx */ - union { - struct { - char x_lnno[2]; /* declaration line number */ - char x_size[2]; /* str/union/array size */ - } x_lnsz; - char x_fsize[4]; /* size of function */ - } x_misc; - union { - struct { /* if ISFCN, tag, or .bb */ - char x_lnnoptr[4]; /* ptr to fcn line # */ - char x_endndx[4]; /* entry ndx past block end */ - } x_fcn; - struct { /* if ISARY, up to 4 dimen. */ - char x_dimen[E_DIMNUM][2]; - } x_ary; - } x_fcnary; - char x_tvndx[2]; /* tv index */ - } x_sym; - - union { - char x_fname[E_FILNMLEN]; - struct { - char x_zeroes[4]; - char x_offset[4]; - } x_n; - } x_file; - - struct { - char x_scnlen[4]; /* section length */ - char x_nreloc[2]; /* # relocation entries */ - char x_nlinno[2]; /* # line numbers */ - } x_scn; - - struct { - char x_tvfill[4]; /* tv fill value */ - char x_tvlen[2]; /* length of .tv */ - char x_tvran[2][2]; /* tv range */ - } x_tv; /* info about .tv section (in auxent of symbol .tv)) */ - - -}; - -#define SYMENT struct external_syment -#define SYMESZ 18 -#define AUXENT union external_auxent -#define AUXESZ 18 - - - -/********************** RELOCATION DIRECTIVES **********************/ - -/* The external reloc has an offset field, because some of the reloc - types on the z8k don't have room in the instruction for the entire - offset - eg with segments */ - -struct external_reloc { - char r_vaddr[4]; - char r_symndx[4]; - char r_offset[4]; - char r_type[2]; - char r_stuff[2]; -}; - - -#define RELOC struct external_reloc -#define RELSZ 16 - diff --git a/contrib/gdb/include/demangle.h b/contrib/gdb/include/demangle.h deleted file mode 100644 index d4d0a3f428e37..0000000000000 --- a/contrib/gdb/include/demangle.h +++ /dev/null @@ -1,108 +0,0 @@ -/* Defs for interface to demanglers. - Copyright 1992, 1995, 1996 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 2, 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., 59 Temple Place - Suite 330, - Boston, MA 02111-1307, USA. */ - - -#if !defined (DEMANGLE_H) -#define DEMANGLE_H - -#ifdef IN_GCC - -/* Add prototype support. */ -#ifndef PROTO -#if defined (USE_PROTOTYPES) ? USE_PROTOTYPES : defined (__STDC__) -#define PROTO(ARGS) ARGS -#else -#define PROTO(ARGS) () -#endif -#endif - -#define PARAMS(ARGS) PROTO(ARGS) - -#ifdef __STDC__ -#define PTR void * -#else -#ifndef const -#define const -#endif -#define PTR char * -#endif - -#else /* ! IN_GCC */ -#include <ansidecl.h> -#endif /* IN_GCC */ - -/* Options passed to cplus_demangle (in 2nd parameter). */ - -#define DMGL_NO_OPTS 0 /* For readability... */ -#define DMGL_PARAMS (1 << 0) /* Include function args */ -#define DMGL_ANSI (1 << 1) /* Include const, volatile, etc */ - -#define DMGL_AUTO (1 << 8) -#define DMGL_GNU (1 << 9) -#define DMGL_LUCID (1 << 10) -#define DMGL_ARM (1 << 11) -/* If none of these are set, use 'current_demangling_style' as the default. */ -#define DMGL_STYLE_MASK (DMGL_AUTO|DMGL_GNU|DMGL_LUCID|DMGL_ARM) - -/* Enumeration of possible demangling styles. - - Lucid and ARM styles are still kept logically distinct, even though - they now both behave identically. The resulting style is actual the - union of both. I.E. either style recognizes both "__pt__" and "__rf__" - for operator "->", even though the first is lucid style and the second - is ARM style. (FIXME?) */ - -extern enum demangling_styles -{ - unknown_demangling = 0, - auto_demangling = DMGL_AUTO, - gnu_demangling = DMGL_GNU, - lucid_demangling = DMGL_LUCID, - arm_demangling = DMGL_ARM -} current_demangling_style; - -/* Define string names for the various demangling styles. */ - -#define AUTO_DEMANGLING_STYLE_STRING "auto" -#define GNU_DEMANGLING_STYLE_STRING "gnu" -#define LUCID_DEMANGLING_STYLE_STRING "lucid" -#define ARM_DEMANGLING_STYLE_STRING "arm" - -/* Some macros to test what demangling style is active. */ - -#define CURRENT_DEMANGLING_STYLE current_demangling_style -#define AUTO_DEMANGLING (((int) CURRENT_DEMANGLING_STYLE) & DMGL_AUTO) -#define GNU_DEMANGLING (((int) CURRENT_DEMANGLING_STYLE) & DMGL_GNU) -#define LUCID_DEMANGLING (((int) CURRENT_DEMANGLING_STYLE) & DMGL_LUCID) -#define ARM_DEMANGLING (CURRENT_DEMANGLING_STYLE & DMGL_ARM) - -extern char * -cplus_demangle PARAMS ((const char *mangled, int options)); - -extern int -cplus_demangle_opname PARAMS ((const char *opname, char *result, int options)); - -extern const char * -cplus_mangle_opname PARAMS ((const char *opname, int options)); - -/* Note: This sets global state. FIXME if you care about multi-threading. */ - -extern void -set_cplus_marker_for_demangling PARAMS ((int ch)); - -#endif /* DEMANGLE_H */ diff --git a/contrib/gdb/include/dis-asm.h b/contrib/gdb/include/dis-asm.h deleted file mode 100644 index d70bd514e9cd7..0000000000000 --- a/contrib/gdb/include/dis-asm.h +++ /dev/null @@ -1,175 +0,0 @@ -/* Interface between the opcode library and its callers. - Written by Cygnus Support, 1993. - - The opcode library (libopcodes.a) provides instruction decoders for - a large variety of instruction sets, callable with an identical - interface, for making instruction-processing programs more independent - of the instruction set being processed. */ - -#ifndef DIS_ASM_H -#define DIS_ASM_H - -#include <stdio.h> -#include "bfd.h" - -typedef int (*fprintf_ftype) PARAMS((FILE*, const char*, ...)); - -enum dis_insn_type { - dis_noninsn, /* Not a valid instruction */ - dis_nonbranch, /* Not a branch instruction */ - dis_branch, /* Unconditional branch */ - dis_condbranch, /* Conditional branch */ - dis_jsr, /* Jump to subroutine */ - dis_condjsr, /* Conditional jump to subroutine */ - dis_dref, /* Data reference instruction */ - dis_dref2 /* Two data references in instruction */ -}; - -/* This struct is passed into the instruction decoding routine, - and is passed back out into each callback. The various fields are used - for conveying information from your main routine into your callbacks, - for passing information into the instruction decoders (such as the - addresses of the callback functions), or for passing information - back from the instruction decoders to their callers. - - It must be initialized before it is first passed; this can be done - by hand, or using one of the initialization macros below. */ - -typedef struct disassemble_info { - fprintf_ftype fprintf_func; - FILE *stream; - PTR application_data; - - /* Target description. We could replace this with a pointer to the bfd, - but that would require one. There currently isn't any such requirement - so to avoid introducing one we record these explicitly. */ - /* The bfd_arch value. */ - enum bfd_architecture arch; - /* The bfd_mach value. */ - unsigned long mach; - /* Endianness (for bi-endian cpus). Mono-endian cpus can ignore this. */ - enum bfd_endian endian; - - /* For use by the disassembler. - The top 16 bits are reserved for public use (and are documented here). - The bottom 16 bits are for the internal use of the disassembler. */ - unsigned long flags; - PTR private_data; - - /* Function used to get bytes to disassemble. MEMADDR is the - address of the stuff to be disassembled, MYADDR is the address to - put the bytes in, and LENGTH is the number of bytes to read. - INFO is a pointer to this struct. - Returns an errno value or 0 for success. */ - int (*read_memory_func) - PARAMS ((bfd_vma memaddr, bfd_byte *myaddr, int length, - struct disassemble_info *info)); - - /* Function which should be called if we get an error that we can't - recover from. STATUS is the errno value from read_memory_func and - MEMADDR is the address that we were trying to read. INFO is a - pointer to this struct. */ - void (*memory_error_func) - PARAMS ((int status, bfd_vma memaddr, struct disassemble_info *info)); - - /* Function called to print ADDR. */ - void (*print_address_func) - PARAMS ((bfd_vma addr, struct disassemble_info *info)); - - /* These are for buffer_read_memory. */ - bfd_byte *buffer; - bfd_vma buffer_vma; - int buffer_length; - - /* Results from instruction decoders. Not all decoders yet support - this information. This info is set each time an instruction is - decoded, and is only valid for the last such instruction. - - To determine whether this decoder supports this information, set - insn_info_valid to 0, decode an instruction, then check it. */ - - char insn_info_valid; /* Branch info has been set. */ - char branch_delay_insns; /* How many sequential insn's will run before - a branch takes effect. (0 = normal) */ - char data_size; /* Size of data reference in insn, in bytes */ - enum dis_insn_type insn_type; /* Type of instruction */ - bfd_vma target; /* Target address of branch or dref, if known; - zero if unknown. */ - bfd_vma target2; /* Second target address for dref2 */ - -} disassemble_info; - - -/* Standard disassemblers. Disassemble one instruction at the given - target address. Return number of bytes processed. */ -typedef int (*disassembler_ftype) - PARAMS((bfd_vma, disassemble_info *)); - -extern int print_insn_big_mips PARAMS ((bfd_vma, disassemble_info*)); -extern int print_insn_little_mips PARAMS ((bfd_vma, disassemble_info*)); -extern int print_insn_i386 PARAMS ((bfd_vma, disassemble_info*)); -extern int print_insn_m68k PARAMS ((bfd_vma, disassemble_info*)); -extern int print_insn_z8001 PARAMS ((bfd_vma, disassemble_info*)); -extern int print_insn_z8002 PARAMS ((bfd_vma, disassemble_info*)); -extern int print_insn_h8300 PARAMS ((bfd_vma, disassemble_info*)); -extern int print_insn_h8300h PARAMS ((bfd_vma, disassemble_info*)); -extern int print_insn_h8500 PARAMS ((bfd_vma, disassemble_info*)); -extern int print_insn_alpha PARAMS ((bfd_vma, disassemble_info*)); -extern int print_insn_big_arm PARAMS ((bfd_vma, disassemble_info*)); -extern int print_insn_little_arm PARAMS ((bfd_vma, disassemble_info*)); -extern int print_insn_sparc PARAMS ((bfd_vma, disassemble_info*)); -extern int print_insn_sparc64 PARAMS ((bfd_vma, disassemble_info*)); -extern int print_insn_big_a29k PARAMS ((bfd_vma, disassemble_info*)); -extern int print_insn_little_a29k PARAMS ((bfd_vma, disassemble_info*)); -extern int print_insn_i960 PARAMS ((bfd_vma, disassemble_info*)); -extern int print_insn_sh PARAMS ((bfd_vma, disassemble_info*)); -extern int print_insn_shl PARAMS ((bfd_vma, disassemble_info*)); -extern int print_insn_hppa PARAMS ((bfd_vma, disassemble_info*)); -extern int print_insn_m88k PARAMS ((bfd_vma, disassemble_info*)); -extern int print_insn_ns32k PARAMS ((bfd_vma, disassemble_info*)); -extern int print_insn_big_powerpc PARAMS ((bfd_vma, disassemble_info*)); -extern int print_insn_little_powerpc PARAMS ((bfd_vma, disassemble_info*)); -extern int print_insn_rs6000 PARAMS ((bfd_vma, disassemble_info*)); -extern int print_insn_w65 PARAMS ((bfd_vma, disassemble_info*)); - -/* Fetch the disassembler for a given BFD, if that support is available. */ -extern disassembler_ftype disassembler PARAMS ((bfd *)); - - -/* This block of definitions is for particular callers who read instructions - into a buffer before calling the instruction decoder. */ - -/* Here is a function which callers may wish to use for read_memory_func. - It gets bytes from a buffer. */ -extern int buffer_read_memory - PARAMS ((bfd_vma, bfd_byte *, int, struct disassemble_info *)); - -/* This function goes with buffer_read_memory. - It prints a message using info->fprintf_func and info->stream. */ -extern void perror_memory PARAMS ((int, bfd_vma, struct disassemble_info *)); - - -/* Just print the address in hex. This is included for completeness even - though both GDB and objdump provide their own (to print symbolic - addresses). */ -extern void generic_print_address - PARAMS ((bfd_vma, struct disassemble_info *)); - -/* Macro to initialize a disassemble_info struct. This should be called - by all applications creating such a struct. */ -#define INIT_DISASSEMBLE_INFO(INFO, STREAM, FPRINTF_FUNC) \ - (INFO).fprintf_func = (FPRINTF_FUNC), \ - (INFO).stream = (STREAM), \ - (INFO).buffer = NULL, \ - (INFO).buffer_vma = 0, \ - (INFO).buffer_length = 0, \ - (INFO).read_memory_func = buffer_read_memory, \ - (INFO).memory_error_func = perror_memory, \ - (INFO).print_address_func = generic_print_address, \ - (INFO).arch = bfd_arch_unknown, \ - (INFO).mach = 0, \ - (INFO).endian = BFD_ENDIAN_UNKNOWN, \ - (INFO).flags = 0, \ - (INFO).insn_info_valid = 0 - -#endif /* ! defined (DIS_ASM_H) */ diff --git a/contrib/gdb/include/elf/ChangeLog b/contrib/gdb/include/elf/ChangeLog deleted file mode 100644 index b56f9bb1d8ddd..0000000000000 --- a/contrib/gdb/include/elf/ChangeLog +++ /dev/null @@ -1,195 +0,0 @@ -Mon Feb 19 01:55:56 1996 Doug Evans <dje@charmed.cygnus.com> - - * sparc.h (R_SPARC_{PLT32,HIPLT22,LOPLT10,PCPLT32,PCPLT22, - PCPLT10,5,6}): Don't define ifdef SPARC64_OLD_RELOCS. - -Tue Feb 6 11:33:58 1996 Doug Evans <dje@charmed.cygnus.com> - - * sparc.h (enum sparc_elf_reloc_type): Define. - -Wed Jan 17 09:09:16 1996 Doug Evans <dje@canuck.cygnus.com> - - * common.h: Define EM_SPARC32PLUS. - * sparc.h: New file. - -Thu Jan 11 16:27:34 1996 Michael Meissner <meissner@tiktok.cygnus.com> - - * ppc.h (SHF_EXCLUDE, SHT_ORDERED): New fields from the abi. - -Thu Nov 30 16:47:18 1995 Ian Lance Taylor <ian@cygnus.com> - - * internal.h (struct elf_segment_map): Add includes_filehdr and - includes_phdrs fields. - -Tue Nov 28 16:58:10 1995 Ian Lance Taylor <ian@cygnus.com> - - * internal.h (struct elf_segment_map): Define. - -Tue Oct 31 15:19:36 1995 Fred Fish <fnf@cygnus.com> - - * common.h, dwarf.h, external.h, hppa.h, internal.h, - mips.h, ppc.h: Protect against multiple inclusions. - -Thu Sep 21 13:51:58 1995 Michael Meissner <meissner@tiktok.cygnus.com> - - * ppc.h (EF_PPC_RELOCATABLE_LIB): Add new flag bit. - -Fri Sep 1 15:32:17 1995 Kazumoto Kojima <kkojima@info.kanagawa-u.ac.jp> - - * mips.h: Add some definitions used on Irix 5. - -Tue Jun 20 10:18:28 1995 Jeff Law (law@snake.cs.utah.edu) - - * hppa.h (CPU_PA_RISC1_0): Protect from redefinitions. - (CPU_PA_RISC1_1): Likewise. - -Wed Mar 8 18:14:37 1995 Michael Meissner <meissner@tiktok.cygnus.com> - - * ppc.h: New file for PowerPC support. - -Tue Feb 14 13:59:13 1995 Michael Meissner <meissner@tiktok.cygnus.com> - - * common.h (EM_PPC): Use offical value of 20, not 17. - (EM_PPC_OLD): Define this to be the old value of EM_PPC. - - -Tue Jan 24 09:40:59 1995 Michael Meissner <meissner@tiktok.cygnus.com> - - * common.h (EM_PPC): New macro, PowerPC machine id. - -Tue Jan 17 10:51:38 1995 Ian Lance Taylor <ian@sanguine.cygnus.com> - - * mips.h (SHT_MIPS_MSYM, SHT_MIPS_DWARF, SHT_MIPS_EVENTS): Define. - - -Mon Oct 17 13:43:59 1994 Ian Lance Taylor <ian@sanguine.cygnus.com> - - * internal.h (Elf_Internal_Shdr): Remove rawdata and size fields. - Add bfd_section field. - -Tue May 24 16:11:50 1994 Ian Lance Taylor (ian@tweedledumb.cygnus.com) - - * mips.h (Elf32_External_gptab): Define. - -Mon May 16 13:22:04 1994 Jeff Law (law@snake.cs.utah.edu) - - * common.h (EM_HPPA): Delete. - (EM_PARISC): Add. - * hppa.h: New file. - -Mon May 9 13:27:03 1994 Ian Lance Taylor (ian@tweedledumb.cygnus.com) - - * common.h (SHN_LORESERVE): Rename from SHN_LORESERV. - (ELF32_R_TYPE, ELF32_R_INFO): Don't rely on size of unsigned char. - (ELF64_R_TYPE): Don't rely on size of unsigned long. - -Mon Apr 25 15:53:09 1994 Ian Lance Taylor (ian@tweedledumb.cygnus.com) - - * internal.h (Elf_Internal_Shdr): Use PTR, not void *. - -Fri Mar 11 00:34:59 1994 Peter Schauer (pes@regent.e-technik.tu-muenchen.de) - - * mips.h (SHN_MIPS_TEXT, SHN_MIPS_DATA): Define. - -Sat Mar 5 14:08:54 1994 Peter Schauer (pes@regent.e-technik.tu-muenchen.de) - - * internal.h: Remove Elf32_*, Elf64_* typedefs. These names - cause conflicts with system headers, e.g. link.h in gdb/solib.c. - Combine 32- and 64-bit versions of *_Internal_Dyn. - * common.h: Replace uses of Elf64_Word, Elf64_Xword typedefs - by their expansion. - * mips.h: Replace uses of Elf32_Word, Elf32_Sword, Elf32_Addr - typedefs by their expansion. Add DT_MIPS_RLD_MAP definition. - -Fri Feb 18 10:39:54 1994 Ian Lance Taylor (ian@tweedledumb.cygnus.com) - - * common.h (EM_CYGNUS_POWERPC): Define. This may be temporary, - depending upon how quickly I can find a real PowerPC ABI. - -Mon Feb 7 08:27:13 1994 Jim Kingdon (kingdon@lioth.cygnus.com) - - * internal.h: Change HOST_64_BIT to BFD_HOST_64_BIT. - -Wed Feb 2 14:12:18 1994 Jim Kingdon (kingdon@lioth.cygnus.com) - - * common.h: Add comments regarding value of EM_HPPA and how to - pick an unofficial value. - -Wed Nov 17 17:14:26 1993 Ian Lance Taylor (ian@tweedledumb.cygnus.com) - - * mips.h (SHT_MIPS_OPTIONS): Define. - -Mon Nov 8 17:57:00 1993 Ian Lance Taylor (ian@tweedledumb.cygnus.com) - - * mips.h: Added some more MIPS ABI macro definitions. - -Wed Nov 3 22:07:17 1993 Ken Raeburn (raeburn@rtl.cygnus.com) - - * common.h (EM_MIPS_RS4_BE): New macro. - -Tue Oct 12 07:28:18 1993 Ian Lance Taylor (ian@cygnus.com) - - * mips.h: New file. MIPS ABI specific information. - -Mon Jun 21 13:13:43 1993 Ken Raeburn (raeburn@poseidon.cygnus.com) - - * internal.h: Combined 32- and 64-bit versions of all structures - except *_Internal_Dyn. This will simply the assembler interface, - and some bfd code. - -Tue May 25 02:00:16 1993 Ken Raeburn (raeburn@cambridge.cygnus.com) - - * external.h, internal.h, common.h: Added 64-bit versions of some - structures and macros. Renamed old versions to put "32" in the - name. Some are unchanged. - -Thu Apr 29 12:12:20 1993 Ken Raeburn (raeburn@deneb.cygnus.com) - - * common.h (EM_HPPA, NT_VERSION, STN_UNDEF, DT_*): New macros. - * external.h (Elf_External_Dyn): New type. - - * internal.h (Elf_Intenral_Shdr): New field `size'. - (Elf_Internal_Dyn): New type. - -Tue Apr 20 16:03:45 1993 Fred Fish (fnf@cygnus.com) - - * dwarf.h (LANG_CHILL): Change value to one randomly picked in - the user defined range, to reduce probability of collisions. - -Sun Nov 15 09:34:02 1992 Fred Fish (fnf@cygnus.com) - - * dwarf.h (AT_src_coords): Whitespace change only. - * dwarf.h (AT_body_begin, AT_body_end, LANG_MODULA2): - Add from latest gcc. - * dwarf.h (LANG_CHILL): Add as GNU extension. - -Sat Aug 1 13:46:53 1992 Fred Fish (fnf@cygnus.com) - - * dwarf.h: Replace with current version from gcc distribution. - -Fri Jun 19 19:05:09 1992 John Gilmore (gnu at cygnus.com) - - * internal.h: Add real struct tags to all the Type_Defs, so they - can be used in prototypes where the Type_Defs are not known. - -Fri Apr 3 20:58:58 1992 Mark Eichin (eichin at cygnus.com) - - * common.h: added ELF_R_{SYM,TYPE,INFO} for handling relocation - info - added EM_MIPS, and corrected value of EM_860 based on System V ABI - manual. - - * external.h: added Elf_External_{Rel,Rela}. - - * internal.h: added Elf_Internal_{Rel,Rela}. - added rawdata to Elf_Internal_Shdr. - -Sat Nov 30 20:43:59 1991 Steve Chamberlain (sac at rtl.cygnus.com) - - * common.h, dwarf.h, external.h, internal.h, ChangeLog; moved from - ../elf-<foo> - - -Local Variables: -version-control: never -End: diff --git a/contrib/gdb/include/elf/common.h b/contrib/gdb/include/elf/common.h deleted file mode 100644 index c9e74741c575a..0000000000000 --- a/contrib/gdb/include/elf/common.h +++ /dev/null @@ -1,239 +0,0 @@ -/* ELF support for BFD. - Copyright (C) 1991, 1992, 1993, 1994, 1996 Free Software Foundation, Inc. - - Written by Fred Fish @ Cygnus Support, from information published - in "UNIX System V Release 4, Programmers Guide: ANSI C and - Programming Support Tools". - -This file is part of BFD, the Binary File Descriptor library. - -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 2 of the License, 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ - - -/* This file is part of ELF support for BFD, and contains the portions - that are common to both the internal and external representations. - For example, ELFMAG0 is the byte 0x7F in both the internal (in-memory) - and external (in-file) representations. */ - -#ifndef _ELF_COMMON_H -#define _ELF_COMMON_H - -/* Fields in e_ident[] */ - -#define EI_MAG0 0 /* File identification byte 0 index */ -#define ELFMAG0 0x7F /* Magic number byte 0 */ - -#define EI_MAG1 1 /* File identification byte 1 index */ -#define ELFMAG1 'E' /* Magic number byte 1 */ - -#define EI_MAG2 2 /* File identification byte 2 index */ -#define ELFMAG2 'L' /* Magic number byte 2 */ - -#define EI_MAG3 3 /* File identification byte 3 index */ -#define ELFMAG3 'F' /* Magic number byte 3 */ - -#define EI_CLASS 4 /* File class */ -#define ELFCLASSNONE 0 /* Invalid class */ -#define ELFCLASS32 1 /* 32-bit objects */ -#define ELFCLASS64 2 /* 64-bit objects */ - -#define EI_DATA 5 /* Data encoding */ -#define ELFDATANONE 0 /* Invalid data encoding */ -#define ELFDATA2LSB 1 /* 2's complement, little endian */ -#define ELFDATA2MSB 2 /* 2's complement, big endian */ - -#define EI_VERSION 6 /* File version */ - -#define EI_PAD 7 /* Start of padding bytes */ - - -/* Values for e_type, which identifies the object file type */ - -#define ET_NONE 0 /* No file type */ -#define ET_REL 1 /* Relocatable file */ -#define ET_EXEC 2 /* Executable file */ -#define ET_DYN 3 /* Shared object file */ -#define ET_CORE 4 /* Core file */ -#define ET_LOPROC 0xFF00 /* Processor-specific */ -#define ET_HIPROC 0xFFFF /* Processor-specific */ - -/* Values for e_machine, which identifies the architecture */ - -#define EM_NONE 0 /* No machine */ -#define EM_M32 1 /* AT&T WE 32100 */ -#define EM_SPARC 2 /* SUN SPARC */ -#define EM_386 3 /* Intel 80386 */ -#define EM_68K 4 /* Motorola m68k family */ -#define EM_88K 5 /* Motorola m88k family */ -#define EM_860 7 /* Intel 80860 */ -#define EM_MIPS 8 /* MIPS R3000 (officially, big-endian only) */ - -#define EM_MIPS_RS4_BE 10 /* MIPS R4000 big-endian */ - -#define EM_SPARC64 11 /* SPARC v9 (not official) 64-bit */ - -#define EM_PARISC 15 /* HPPA */ - -#define EM_SPARC32PLUS 18 /* Sun's "v8plus" */ - -#define EM_PPC 20 /* PowerPC */ - -/* If it is necessary to assign new unofficial EM_* values, please pick large - random numbers (0x8523, 0xa7f2, etc.) to minimize the chances of collision - with official or non-GNU unofficial values. */ - -/* Cygnus PowerPC ELF backend. Written in the absence of an ABI. */ -#define EM_CYGNUS_POWERPC 0x9025 - -/* Old version of PowerPC, this should be removed shortly. */ -#define EM_PPC_OLD 17 - - -/* Values for e_version */ - -#define EV_NONE 0 /* Invalid ELF version */ -#define EV_CURRENT 1 /* Current version */ - -/* Values for program header, p_type field */ - -#define PT_NULL 0 /* Program header table entry unused */ -#define PT_LOAD 1 /* Loadable program segment */ -#define PT_DYNAMIC 2 /* Dynamic linking information */ -#define PT_INTERP 3 /* Program interpreter */ -#define PT_NOTE 4 /* Auxiliary information */ -#define PT_SHLIB 5 /* Reserved, unspecified semantics */ -#define PT_PHDR 6 /* Entry for header table itself */ -#define PT_LOPROC 0x70000000 /* Processor-specific */ -#define PT_HIPROC 0x7FFFFFFF /* Processor-specific */ - -/* Program segment permissions, in program header p_flags field */ - -#define PF_X (1 << 0) /* Segment is executable */ -#define PF_W (1 << 1) /* Segment is writable */ -#define PF_R (1 << 2) /* Segment is readable */ -#define PF_MASKPROC 0xF0000000 /* Processor-specific reserved bits */ - -/* Values for section header, sh_type field */ - -#define SHT_NULL 0 /* Section header table entry unused */ -#define SHT_PROGBITS 1 /* Program specific (private) data */ -#define SHT_SYMTAB 2 /* Link editing symbol table */ -#define SHT_STRTAB 3 /* A string table */ -#define SHT_RELA 4 /* Relocation entries with addends */ -#define SHT_HASH 5 /* A symbol hash table */ -#define SHT_DYNAMIC 6 /* Information for dynamic linking */ -#define SHT_NOTE 7 /* Information that marks file */ -#define SHT_NOBITS 8 /* Section occupies no space in file */ -#define SHT_REL 9 /* Relocation entries, no addends */ -#define SHT_SHLIB 10 /* Reserved, unspecified semantics */ -#define SHT_DYNSYM 11 /* Dynamic linking symbol table */ -#define SHT_LOPROC 0x70000000 /* Processor-specific semantics, lo */ -#define SHT_HIPROC 0x7FFFFFFF /* Processor-specific semantics, hi */ -#define SHT_LOUSER 0x80000000 /* Application-specific semantics */ -#define SHT_HIUSER 0x8FFFFFFF /* Application-specific semantics */ - -/* Values for section header, sh_flags field */ - -#define SHF_WRITE (1 << 0) /* Writable data during execution */ -#define SHF_ALLOC (1 << 1) /* Occupies memory during execution */ -#define SHF_EXECINSTR (1 << 2) /* Executable machine instructions */ -#define SHF_MASKPROC 0xF0000000 /* Processor-specific semantics */ - -/* Values of note segment descriptor types for core files. */ - -#define NT_PRSTATUS 1 /* Contains copy of prstatus struct */ -#define NT_FPREGSET 2 /* Contains copy of fpregset struct */ -#define NT_PRPSINFO 3 /* Contains copy of prpsinfo struct */ - -/* Values of note segment descriptor types for object files. */ -/* (Only for hppa right now. Should this be moved elsewhere?) */ - -#define NT_VERSION 1 /* Contains a version string. */ - -/* These three macros disassemble and assemble a symbol table st_info field, - which contains the symbol binding and symbol type. The STB_ and STT_ - defines identify the binding and type. */ - -#define ELF_ST_BIND(val) (((unsigned int)(val)) >> 4) -#define ELF_ST_TYPE(val) ((val) & 0xF) -#define ELF_ST_INFO(bind,type) (((bind) << 4) + ((type) & 0xF)) - -#define STN_UNDEF 0 /* undefined symbol index */ - -#define STB_LOCAL 0 /* Symbol not visible outside obj */ -#define STB_GLOBAL 1 /* Symbol visible outside obj */ -#define STB_WEAK 2 /* Like globals, lower precedence */ -#define STB_LOPROC 13 /* Application-specific semantics */ -#define STB_HIPROC 15 /* Application-specific semantics */ - -#define STT_NOTYPE 0 /* Symbol type is unspecified */ -#define STT_OBJECT 1 /* Symbol is a data object */ -#define STT_FUNC 2 /* Symbol is a code object */ -#define STT_SECTION 3 /* Symbol associated with a section */ -#define STT_FILE 4 /* Symbol gives a file name */ -#define STT_LOPROC 13 /* Application-specific semantics */ -#define STT_HIPROC 15 /* Application-specific semantics */ - -/* Special section indices, which may show up in st_shndx fields, among - other places. */ - -#define SHN_UNDEF 0 /* Undefined section reference */ -#define SHN_LORESERVE 0xFF00 /* Begin range of reserved indices */ -#define SHN_LOPROC 0xFF00 /* Begin range of appl-specific */ -#define SHN_HIPROC 0xFF1F /* End range of appl-specific */ -#define SHN_ABS 0xFFF1 /* Associated symbol is absolute */ -#define SHN_COMMON 0xFFF2 /* Associated symbol is in common */ -#define SHN_HIRESERVE 0xFFFF /* End range of reserved indices */ - -/* relocation info handling macros */ - -#define ELF32_R_SYM(i) ((i) >> 8) -#define ELF32_R_TYPE(i) ((i) & 0xff) -#define ELF32_R_INFO(s,t) (((s) << 8) + ((t) & 0xff)) - -#define ELF64_R_SYM(i) ((i) >> 32) -#define ELF64_R_TYPE(i) ((i) & 0xffffffff) -#define ELF64_R_INFO(s,t) (((bfd_vma) (s) << 32) + (bfd_vma) (t)) - -/* Dynamic section tags */ - -#define DT_NULL 0 -#define DT_NEEDED 1 -#define DT_PLTRELSZ 2 -#define DT_PLTGOT 3 -#define DT_HASH 4 -#define DT_STRTAB 5 -#define DT_SYMTAB 6 -#define DT_RELA 7 -#define DT_RELASZ 8 -#define DT_RELAENT 9 -#define DT_STRSZ 10 -#define DT_SYMENT 11 -#define DT_INIT 12 -#define DT_FINI 13 -#define DT_SONAME 14 -#define DT_RPATH 15 -#define DT_SYMBOLIC 16 -#define DT_REL 17 -#define DT_RELSZ 18 -#define DT_RELENT 19 -#define DT_PLTREL 20 -#define DT_DEBUG 21 -#define DT_TEXTREL 22 -#define DT_JMPREL 23 -#define DT_LOPROC 0x70000000 -#define DT_HIPROC 0x7fffffff - -#endif /* _ELF_COMMON_H */ diff --git a/contrib/gdb/include/elf/dwarf.h b/contrib/gdb/include/elf/dwarf.h deleted file mode 100644 index 4333d5eda40f3..0000000000000 --- a/contrib/gdb/include/elf/dwarf.h +++ /dev/null @@ -1,319 +0,0 @@ -/* Declarations and definitions of codes relating to the DWARF symbolic - debugging information format. - - Written by Ron Guilmette (rfg@ncd.com) - -Copyright (C) 1992 Free Software Foundation, Inc. - -This file is part of GNU CC. - -GNU CC 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 2, or (at your option) -any later version. - -GNU CC 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 GNU CC; see the file COPYING. If not, write to -the Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ - -/* This file is derived from the DWARF specification (a public document) - Revision 1.0.1 (April 8, 1992) developed by the UNIX International - Programming Languages Special Interest Group (UI/PLSIG) and distributed - by UNIX International. Copies of this specification are available from - UNIX International, 20 Waterview Boulevard, Parsippany, NJ, 07054. -*/ - -#ifndef _ELF_DWARF_H -#define _ELF_DWARF_H - -/* Tag names and codes. */ - -enum dwarf_tag { - TAG_padding = 0x0000, - TAG_array_type = 0x0001, - TAG_class_type = 0x0002, - TAG_entry_point = 0x0003, - TAG_enumeration_type = 0x0004, - TAG_formal_parameter = 0x0005, - TAG_global_subroutine = 0x0006, - TAG_global_variable = 0x0007, - /* 0x0008 -- reserved */ - /* 0x0009 -- reserved */ - TAG_label = 0x000a, - TAG_lexical_block = 0x000b, - TAG_local_variable = 0x000c, - TAG_member = 0x000d, - /* 0x000e -- reserved */ - TAG_pointer_type = 0x000f, - TAG_reference_type = 0x0010, - TAG_compile_unit = 0x0011, - TAG_string_type = 0x0012, - TAG_structure_type = 0x0013, - TAG_subroutine = 0x0014, - TAG_subroutine_type = 0x0015, - TAG_typedef = 0x0016, - TAG_union_type = 0x0017, - TAG_unspecified_parameters = 0x0018, - TAG_variant = 0x0019, - TAG_common_block = 0x001a, - TAG_common_inclusion = 0x001b, - TAG_inheritance = 0x001c, - TAG_inlined_subroutine = 0x001d, - TAG_module = 0x001e, - TAG_ptr_to_member_type = 0x001f, - TAG_set_type = 0x0020, - TAG_subrange_type = 0x0021, - TAG_with_stmt = 0x0022, - - /* GNU extensions */ - - TAG_format_label = 0x8000, /* for FORTRAN 77 and Fortran 90 */ - TAG_namelist = 0x8001, /* For Fortran 90 */ - TAG_function_template = 0x8002, /* for C++ */ - TAG_class_template = 0x8003 /* for C++ */ -}; - -#define TAG_lo_user 0x8000 /* implementation-defined range start */ -#define TAG_hi_user 0xffff /* implementation-defined range end */ -#define TAG_source_file TAG_compile_unit /* for backward compatibility */ - -/* Form names and codes. */ - -enum dwarf_form { - FORM_ADDR = 0x1, - FORM_REF = 0x2, - FORM_BLOCK2 = 0x3, - FORM_BLOCK4 = 0x4, - FORM_DATA2 = 0x5, - FORM_DATA4 = 0x6, - FORM_DATA8 = 0x7, - FORM_STRING = 0x8 -}; - -/* Attribute names and codes. */ - -enum dwarf_attribute { - AT_sibling = (0x0010|FORM_REF), - AT_location = (0x0020|FORM_BLOCK2), - AT_name = (0x0030|FORM_STRING), - AT_fund_type = (0x0050|FORM_DATA2), - AT_mod_fund_type = (0x0060|FORM_BLOCK2), - AT_user_def_type = (0x0070|FORM_REF), - AT_mod_u_d_type = (0x0080|FORM_BLOCK2), - AT_ordering = (0x0090|FORM_DATA2), - AT_subscr_data = (0x00a0|FORM_BLOCK2), - AT_byte_size = (0x00b0|FORM_DATA4), - AT_bit_offset = (0x00c0|FORM_DATA2), - AT_bit_size = (0x00d0|FORM_DATA4), - /* (0x00e0|FORM_xxxx) -- reserved */ - AT_element_list = (0x00f0|FORM_BLOCK4), - AT_stmt_list = (0x0100|FORM_DATA4), - AT_low_pc = (0x0110|FORM_ADDR), - AT_high_pc = (0x0120|FORM_ADDR), - AT_language = (0x0130|FORM_DATA4), - AT_member = (0x0140|FORM_REF), - AT_discr = (0x0150|FORM_REF), - AT_discr_value = (0x0160|FORM_BLOCK2), - /* (0x0170|FORM_xxxx) -- reserved */ - /* (0x0180|FORM_xxxx) -- reserved */ - AT_string_length = (0x0190|FORM_BLOCK2), - AT_common_reference = (0x01a0|FORM_REF), - AT_comp_dir = (0x01b0|FORM_STRING), - AT_const_value_string = (0x01c0|FORM_STRING), - AT_const_value_data2 = (0x01c0|FORM_DATA2), - AT_const_value_data4 = (0x01c0|FORM_DATA4), - AT_const_value_data8 = (0x01c0|FORM_DATA8), - AT_const_value_block2 = (0x01c0|FORM_BLOCK2), - AT_const_value_block4 = (0x01c0|FORM_BLOCK4), - AT_containing_type = (0x01d0|FORM_REF), - AT_default_value_addr = (0x01e0|FORM_ADDR), - AT_default_value_data2 = (0x01e0|FORM_DATA2), - AT_default_value_data4 = (0x01e0|FORM_DATA4), - AT_default_value_data8 = (0x01e0|FORM_DATA8), - AT_default_value_string = (0x01e0|FORM_STRING), - AT_friends = (0x01f0|FORM_BLOCK2), - AT_inline = (0x0200|FORM_STRING), - AT_is_optional = (0x0210|FORM_STRING), - AT_lower_bound_ref = (0x0220|FORM_REF), - AT_lower_bound_data2 = (0x0220|FORM_DATA2), - AT_lower_bound_data4 = (0x0220|FORM_DATA4), - AT_lower_bound_data8 = (0x0220|FORM_DATA8), - AT_private = (0x0240|FORM_STRING), - AT_producer = (0x0250|FORM_STRING), - AT_program = (0x0230|FORM_STRING), - AT_protected = (0x0260|FORM_STRING), - AT_prototyped = (0x0270|FORM_STRING), - AT_public = (0x0280|FORM_STRING), - AT_pure_virtual = (0x0290|FORM_STRING), - AT_return_addr = (0x02a0|FORM_BLOCK2), - AT_abstract_origin = (0x02b0|FORM_REF), - AT_start_scope = (0x02c0|FORM_DATA4), - AT_stride_size = (0x02e0|FORM_DATA4), - AT_upper_bound_ref = (0x02f0|FORM_REF), - AT_upper_bound_data2 = (0x02f0|FORM_DATA2), - AT_upper_bound_data4 = (0x02f0|FORM_DATA4), - AT_upper_bound_data8 = (0x02f0|FORM_DATA8), - AT_virtual = (0x0300|FORM_STRING), - - /* GNU extensions. */ - - AT_sf_names = (0x8000|FORM_DATA4), - AT_src_info = (0x8010|FORM_DATA4), - AT_mac_info = (0x8020|FORM_DATA4), - AT_src_coords = (0x8030|FORM_DATA4), - AT_body_begin = (0x8040|FORM_ADDR), - AT_body_end = (0x8050|FORM_ADDR) -}; - -#define AT_lo_user 0x8000 /* implementation-defined range start */ -#define AT_hi_user 0xffff /* implementation-defined range end */ - -/* Location atom names and codes. */ - -enum dwarf_location_atom { - OP_REG = 0x01, - OP_BASEREG = 0x02, - OP_ADDR = 0x03, - OP_CONST = 0x04, - OP_DEREF2 = 0x05, - OP_DEREF4 = 0x06, - OP_ADD = 0x07 -}; - -#define OP_LO_USER 0x80 /* implementation-defined range start */ -#define OP_HI_USER 0xff /* implementation-defined range end */ - -/* Fundamental type names and codes. */ - -enum dwarf_fundamental_type { - FT_char = 0x0001, - FT_signed_char = 0x0002, - FT_unsigned_char = 0x0003, - FT_short = 0x0004, - FT_signed_short = 0x0005, - FT_unsigned_short = 0x0006, - FT_integer = 0x0007, - FT_signed_integer = 0x0008, - FT_unsigned_integer = 0x0009, - FT_long = 0x000a, - FT_signed_long = 0x000b, - FT_unsigned_long = 0x000c, - FT_pointer = 0x000d, /* an alias for (void *) */ - FT_float = 0x000e, - FT_dbl_prec_float = 0x000f, - FT_ext_prec_float = 0x0010, /* breaks "classic" svr4 SDB */ - FT_complex = 0x0011, /* breaks "classic" svr4 SDB */ - FT_dbl_prec_complex = 0x0012, /* breaks "classic" svr4 SDB */ - /* 0x0013 -- reserved */ - FT_void = 0x0014, - FT_boolean = 0x0015, /* breaks "classic" svr4 SDB */ - FT_ext_prec_complex = 0x0016, /* breaks "classic" svr4 SDB */ - FT_label = 0x0017, - - /* GNU extensions - The low order byte must indicate the size (in bytes) for the type. - All of these types will probably break "classic" svr4 SDB */ - - FT_long_long = 0x8008, - FT_signed_long_long = 0x8108, - FT_unsigned_long_long = 0x8208, - - FT_int8 = 0x9001, - FT_signed_int8 = 0x9101, - FT_unsigned_int8 = 0x9201, - FT_int16 = 0x9302, - FT_signed_int16 = 0x9402, - FT_unsigned_int16 = 0x9502, - FT_int32 = 0x9604, - FT_signed_int32 = 0x9704, - FT_unsigned_int32 = 0x9804, - FT_int64 = 0x9908, - FT_signed_int64 = 0x9a08, - FT_unsigned_int64 = 0x9b08, - - FT_real32 = 0xa004, - FT_real64 = 0xa108, - FT_real96 = 0xa20c, - FT_real128 = 0xa310 -}; - -#define FT_lo_user 0x8000 /* implementation-defined range start */ -#define FT_hi_user 0xffff /* implementation defined range end */ - -/* Type modifier names and codes. */ - -enum dwarf_type_modifier { - MOD_pointer_to = 0x01, - MOD_reference_to = 0x02, - MOD_const = 0x03, - MOD_volatile = 0x04 -}; - -#define MOD_lo_user 0x80 /* implementation-defined range start */ -#define MOD_hi_user 0xff /* implementation-defined range end */ - -/* Array ordering names and codes. */ - -enum dwarf_array_dim_ordering { - ORD_row_major = 0, - ORD_col_major = 1 -}; - -/* Array subscript format names and codes. */ - -enum dwarf_subscr_data_formats { - FMT_FT_C_C = 0x0, - FMT_FT_C_X = 0x1, - FMT_FT_X_C = 0x2, - FMT_FT_X_X = 0x3, - FMT_UT_C_C = 0x4, - FMT_UT_C_X = 0x5, - FMT_UT_X_C = 0x6, - FMT_UT_X_X = 0x7, - FMT_ET = 0x8 -}; - -/* Derived from above for ease of use. */ - -#define FMT_CODE(_FUNDAMENTAL_TYPE_P, _UB_CONST_P, _LB_CONST_P) \ - (((_FUNDAMENTAL_TYPE_P) ? 0 : 4) \ - | ((_UB_CONST_P) ? 0 : 2) \ - | ((_LB_CONST_P) ? 0 : 1)) - -/* Source language names and codes. */ - -enum dwarf_source_language { - LANG_C89 = 0x00000001, - LANG_C = 0x00000002, - LANG_ADA83 = 0x00000003, - LANG_C_PLUS_PLUS = 0x00000004, - LANG_COBOL74 = 0x00000005, - LANG_COBOL85 = 0x00000006, - LANG_FORTRAN77 = 0x00000007, - LANG_FORTRAN90 = 0x00000008, - LANG_PASCAL83 = 0x00000009, - LANG_MODULA2 = 0x0000000a, - - /* GNU extensions */ - - LANG_CHILL = 0x00009af3 /* random value for GNU Chill */ -}; - -#define LANG_lo_user 0x00008000 /* implementation-defined range start */ -#define LANG_hi_user 0x0000ffff /* implementation-defined range end */ - -/* Names and codes for GNU "macinfo" extension. */ - -enum dwarf_macinfo_record_type { - MACINFO_start = 's', - MACINFO_resume = 'r', - MACINFO_define = 'd', - MACINFO_undef = 'u' -}; - -#endif /* _ELF_DWARF_H */ diff --git a/contrib/gdb/include/elf/external.h b/contrib/gdb/include/elf/external.h deleted file mode 100644 index e6618cb752fa3..0000000000000 --- a/contrib/gdb/include/elf/external.h +++ /dev/null @@ -1,195 +0,0 @@ -/* ELF support for BFD. - Copyright (C) 1991, 1992 Free Software Foundation, Inc. - - Written by Fred Fish @ Cygnus Support, from information published - in "UNIX System V Release 4, Programmers Guide: ANSI C and - Programming Support Tools". - -This file is part of BFD, the Binary File Descriptor library. - -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 2 of the License, 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ - - -/* This file is part of ELF support for BFD, and contains the portions - that describe how ELF is represented externally by the BFD library. - I.E. it describes the in-file representation of ELF. It requires - the elf-common.h file which contains the portions that are common to - both the internal and external representations. */ - -/* The 64-bit stuff is kind of random. Perhaps someone will publish a - spec someday. */ - -#ifndef _ELF_EXTERNAL_H -#define _ELF_EXTERNAL_H - -/* ELF Header (32-bit implementations) */ - -typedef struct { - unsigned char e_ident[16]; /* ELF "magic number" */ - unsigned char e_type[2]; /* Identifies object file type */ - unsigned char e_machine[2]; /* Specifies required architecture */ - unsigned char e_version[4]; /* Identifies object file version */ - unsigned char e_entry[4]; /* Entry point virtual address */ - unsigned char e_phoff[4]; /* Program header table file offset */ - unsigned char e_shoff[4]; /* Section header table file offset */ - unsigned char e_flags[4]; /* Processor-specific flags */ - unsigned char e_ehsize[2]; /* ELF header size in bytes */ - unsigned char e_phentsize[2]; /* Program header table entry size */ - unsigned char e_phnum[2]; /* Program header table entry count */ - unsigned char e_shentsize[2]; /* Section header table entry size */ - unsigned char e_shnum[2]; /* Section header table entry count */ - unsigned char e_shstrndx[2]; /* Section header string table index */ -} Elf32_External_Ehdr; - -typedef struct { - unsigned char e_ident[16]; /* ELF "magic number" */ - unsigned char e_type[2]; /* Identifies object file type */ - unsigned char e_machine[2]; /* Specifies required architecture */ - unsigned char e_version[4]; /* Identifies object file version */ - unsigned char e_entry[8]; /* Entry point virtual address */ - unsigned char e_phoff[8]; /* Program header table file offset */ - unsigned char e_shoff[8]; /* Section header table file offset */ - unsigned char e_flags[4]; /* Processor-specific flags */ - unsigned char e_ehsize[2]; /* ELF header size in bytes */ - unsigned char e_phentsize[2]; /* Program header table entry size */ - unsigned char e_phnum[2]; /* Program header table entry count */ - unsigned char e_shentsize[2]; /* Section header table entry size */ - unsigned char e_shnum[2]; /* Section header table entry count */ - unsigned char e_shstrndx[2]; /* Section header string table index */ -} Elf64_External_Ehdr; - -/* Program header */ - -typedef struct { - unsigned char p_type[4]; /* Identifies program segment type */ - unsigned char p_offset[4]; /* Segment file offset */ - unsigned char p_vaddr[4]; /* Segment virtual address */ - unsigned char p_paddr[4]; /* Segment physical address */ - unsigned char p_filesz[4]; /* Segment size in file */ - unsigned char p_memsz[4]; /* Segment size in memory */ - unsigned char p_flags[4]; /* Segment flags */ - unsigned char p_align[4]; /* Segment alignment, file & memory */ -} Elf32_External_Phdr; - -typedef struct { - unsigned char p_type[4]; /* Identifies program segment type */ - unsigned char p_flags[4]; /* Segment flags */ - unsigned char p_offset[8]; /* Segment file offset */ - unsigned char p_vaddr[8]; /* Segment virtual address */ - unsigned char p_paddr[8]; /* Segment physical address */ - unsigned char p_filesz[8]; /* Segment size in file */ - unsigned char p_memsz[8]; /* Segment size in memory */ - unsigned char p_align[8]; /* Segment alignment, file & memory */ -} Elf64_External_Phdr; - -/* Section header */ - -typedef struct { - unsigned char sh_name[4]; /* Section name, index in string tbl */ - unsigned char sh_type[4]; /* Type of section */ - unsigned char sh_flags[4]; /* Miscellaneous section attributes */ - unsigned char sh_addr[4]; /* Section virtual addr at execution */ - unsigned char sh_offset[4]; /* Section file offset */ - unsigned char sh_size[4]; /* Size of section in bytes */ - unsigned char sh_link[4]; /* Index of another section */ - unsigned char sh_info[4]; /* Additional section information */ - unsigned char sh_addralign[4]; /* Section alignment */ - unsigned char sh_entsize[4]; /* Entry size if section holds table */ -} Elf32_External_Shdr; - -typedef struct { - unsigned char sh_name[4]; /* Section name, index in string tbl */ - unsigned char sh_type[4]; /* Type of section */ - unsigned char sh_flags[8]; /* Miscellaneous section attributes */ - unsigned char sh_addr[8]; /* Section virtual addr at execution */ - unsigned char sh_offset[8]; /* Section file offset */ - unsigned char sh_size[8]; /* Size of section in bytes */ - unsigned char sh_link[4]; /* Index of another section */ - unsigned char sh_info[4]; /* Additional section information */ - unsigned char sh_addralign[8]; /* Section alignment */ - unsigned char sh_entsize[8]; /* Entry size if section holds table */ -} Elf64_External_Shdr; - -/* Symbol table entry */ - -typedef struct { - unsigned char st_name[4]; /* Symbol name, index in string tbl */ - unsigned char st_value[4]; /* Value of the symbol */ - unsigned char st_size[4]; /* Associated symbol size */ - unsigned char st_info[1]; /* Type and binding attributes */ - unsigned char st_other[1]; /* No defined meaning, 0 */ - unsigned char st_shndx[2]; /* Associated section index */ -} Elf32_External_Sym; - -typedef struct { - unsigned char st_name[4]; /* Symbol name, index in string tbl */ - unsigned char st_info[1]; /* Type and binding attributes */ - unsigned char st_other[1]; /* No defined meaning, 0 */ - unsigned char st_shndx[2]; /* Associated section index */ - unsigned char st_value[8]; /* Value of the symbol */ - unsigned char st_size[8]; /* Associated symbol size */ -} Elf64_External_Sym; - -/* Note segments */ - -typedef struct { - unsigned char namesz[4]; /* Size of entry's owner string */ - unsigned char descsz[4]; /* Size of the note descriptor */ - unsigned char type[4]; /* Interpretation of the descriptor */ - char name[1]; /* Start of the name+desc data */ -} Elf_External_Note; - -/* Relocation Entries */ -typedef struct { - unsigned char r_offset[4]; /* Location at which to apply the action */ - unsigned char r_info[4]; /* index and type of relocation */ -} Elf32_External_Rel; - -typedef struct { - unsigned char r_offset[4]; /* Location at which to apply the action */ - unsigned char r_info[4]; /* index and type of relocation */ - unsigned char r_addend[4]; /* Constant addend used to compute value */ -} Elf32_External_Rela; - -typedef struct { - unsigned char r_offset[8]; /* Location at which to apply the action */ - unsigned char r_info[8]; /* index and type of relocation */ -} Elf64_External_Rel; - -typedef struct { - unsigned char r_offset[8]; /* Location at which to apply the action */ - unsigned char r_info[8]; /* index and type of relocation */ - unsigned char r_addend[8]; /* Constant addend used to compute value */ -} Elf64_External_Rela; - -/* dynamic section structure */ - -typedef struct { - unsigned char d_tag[4]; /* entry tag value */ - union { - unsigned char d_val[4]; - unsigned char d_ptr[4]; - } d_un; -} Elf32_External_Dyn; - -typedef struct { - unsigned char d_tag[8]; /* entry tag value */ - union { - unsigned char d_val[8]; - unsigned char d_ptr[8]; - } d_un; -} Elf64_External_Dyn; - -#endif /* _ELF_EXTERNAL_H */ diff --git a/contrib/gdb/include/elf/hppa.h b/contrib/gdb/include/elf/hppa.h deleted file mode 100644 index c34077fa1947f..0000000000000 --- a/contrib/gdb/include/elf/hppa.h +++ /dev/null @@ -1,94 +0,0 @@ -/* HPPA ELF support for BFD. - Copyright (C) 1993, 1994 Free Software Foundation, Inc. - -This file is part of BFD, the Binary File Descriptor library. - -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 2 of the License, 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ - -/* This file holds definitions specific to the HPPA ELF ABI. Note - that most of this is not actually implemented by BFD. */ - -#ifndef _ELF_HPPA_H -#define _ELF_HPPA_H - -/* Processor specific flags for the ELF header e_flags field. */ - -/* Target processor IDs to be placed in the low 16 bits of the flags - field. Note these names are shared with SOM, and therefore do not - follow ELF naming conventions. */ - -/* PA 1.0 big endian. */ -#ifndef CPU_PA_RISC1_0 -#define CPU_PA_RISC1_0 0x0000020b -#endif - -/* PA 1.1 big endian. */ -#ifndef CPU_PA_RISC1_1 -#define CPU_PA_RISC1_1 0x00000210 -#endif - -/* PA 1.0 little endian (unsupported) is 0x0000028b. */ -/* PA 1.1 little endian (unsupported) is 0x00000290. */ - -/* Trap null address dereferences. */ -#define ELF_PARISC_TRAPNIL 0x00010000 - -/* .PARISC.archext section is present. */ -#define EF_PARISC_EXT 0x00020000 - -/* Processor specific section types. */ - -/* Holds the global offset table, a table of pointers to external - data. */ -#define SHT_PARISC_GOT SHT_LOPROC+0 - -/* Nonloadable section containing information in architecture - extensions used by the code. */ -#define SHT_PARISC_ARCH SHT_LOPROC+1 - -/* Section in which $global$ is defined. */ -#define SHT_PARISC_GLOBAL SHT_LOPROC+2 - -/* Section holding millicode routines (mul, div, rem, dyncall, etc. */ -#define SHT_PARISC_MILLI SHT_LOPROC+3 - -/* Section holding unwind information for use by debuggers. */ -#define SHT_PARISC_UNWIND SHT_LOPROC+4 - -/* Section holding the procedure linkage table. */ -#define SHT_PARISC_PLT SHT_LOPROC+5 - -/* Short initialized and uninitialized data. */ -#define SHT_PARISC_SDATA SHT_LOPROC+6 -#define SHT_PARISC_SBSS SHT_LOPROC+7 - -/* Optional section holding argument location/relocation info. */ -#define SHT_PARISC_SYMEXTN SHT_LOPROC+8 - -/* Option section for linker stubs. */ -#define SHT_PARISC_STUBS SHT_LOPROC+9 - -/* Processor specific section flags. */ - -/* This section is near the global data pointer and thus allows short - addressing modes to be used. */ -#define SHF_PARISC_SHORT 0x20000000 - -/* Processor specific symbol types. */ - -/* Millicode function entry point. */ -#define STT_PARISC_MILLICODE STT_LOPROC+0 - -#endif /* _ELF_HPPA_H */ diff --git a/contrib/gdb/include/elf/internal.h b/contrib/gdb/include/elf/internal.h deleted file mode 100644 index 6375e892051d9..0000000000000 --- a/contrib/gdb/include/elf/internal.h +++ /dev/null @@ -1,207 +0,0 @@ -/* ELF support for BFD. - Copyright (C) 1991, 1992, 1993, 1994 Free Software Foundation, Inc. - - Written by Fred Fish @ Cygnus Support, from information published - in "UNIX System V Release 4, Programmers Guide: ANSI C and - Programming Support Tools". - -This file is part of BFD, the Binary File Descriptor library. - -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 2 of the License, 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ - - -/* This file is part of ELF support for BFD, and contains the portions - that describe how ELF is represented internally in the BFD library. - I.E. it describes the in-memory representation of ELF. It requires - the elf-common.h file which contains the portions that are common to - both the internal and external representations. */ - - -/* NOTE that these structures are not kept in the same order as they appear - in the object file. In some cases they've been reordered for more optimal - packing under various circumstances. */ - -#ifndef _ELF_INTERNAL_H -#define _ELF_INTERNAL_H - -/* ELF Header */ - -#define EI_NIDENT 16 /* Size of e_ident[] */ - -typedef struct elf_internal_ehdr { - unsigned char e_ident[EI_NIDENT]; /* ELF "magic number" */ - bfd_vma e_entry; /* Entry point virtual address */ - bfd_signed_vma e_phoff; /* Program header table file offset */ - bfd_signed_vma e_shoff; /* Section header table file offset */ - unsigned long e_version; /* Identifies object file version */ - unsigned long e_flags; /* Processor-specific flags */ - unsigned short e_type; /* Identifies object file type */ - unsigned short e_machine; /* Specifies required architecture */ - unsigned short e_ehsize; /* ELF header size in bytes */ - unsigned short e_phentsize; /* Program header table entry size */ - unsigned short e_phnum; /* Program header table entry count */ - unsigned short e_shentsize; /* Section header table entry size */ - unsigned short e_shnum; /* Section header table entry count */ - unsigned short e_shstrndx; /* Section header string table index */ -} Elf_Internal_Ehdr; - -#define elf32_internal_ehdr elf_internal_ehdr -#define Elf32_Internal_Ehdr Elf_Internal_Ehdr -#define elf64_internal_ehdr elf_internal_ehdr -#define Elf64_Internal_Ehdr Elf_Internal_Ehdr - -/* Program header */ - -struct elf_internal_phdr { - unsigned long p_type; /* Identifies program segment type */ - unsigned long p_flags; /* Segment flags */ - bfd_vma p_offset; /* Segment file offset */ - bfd_vma p_vaddr; /* Segment virtual address */ - bfd_vma p_paddr; /* Segment physical address */ - bfd_vma p_filesz; /* Segment size in file */ - bfd_vma p_memsz; /* Segment size in memory */ - bfd_vma p_align; /* Segment alignment, file & memory */ -}; - -typedef struct elf_internal_phdr Elf_Internal_Phdr; -#define elf32_internal_phdr elf_internal_phdr -#define Elf32_Internal_Phdr Elf_Internal_Phdr -#define elf64_internal_phdr elf_internal_phdr -#define Elf64_Internal_Phdr Elf_Internal_Phdr - -/* Section header */ - -typedef struct elf_internal_shdr { - unsigned int sh_name; /* Section name, index in string tbl */ - unsigned int sh_type; /* Type of section */ - bfd_vma sh_flags; /* Miscellaneous section attributes */ - bfd_vma sh_addr; /* Section virtual addr at execution */ - bfd_size_type sh_size; /* Size of section in bytes */ - bfd_size_type sh_entsize; /* Entry size if section holds table */ - unsigned long sh_link; /* Index of another section */ - unsigned long sh_info; /* Additional section information */ - file_ptr sh_offset; /* Section file offset */ - unsigned int sh_addralign; /* Section alignment */ - - /* The internal rep also has some cached info associated with it. */ - asection * bfd_section; /* Associated BFD section. */ - PTR contents; /* Section contents. */ -} Elf_Internal_Shdr; - -#define elf32_internal_shdr elf_internal_shdr -#define Elf32_Internal_Shdr Elf_Internal_Shdr -#define elf64_internal_shdr elf_internal_shdr -#define Elf64_Internal_Shdr Elf_Internal_Shdr - -/* Symbol table entry */ - -struct elf_internal_sym { - bfd_vma st_value; /* Value of the symbol */ - bfd_vma st_size; /* Associated symbol size */ - unsigned long st_name; /* Symbol name, index in string tbl */ - unsigned char st_info; /* Type and binding attributes */ - unsigned char st_other; /* No defined meaning, 0 */ - unsigned short st_shndx; /* Associated section index */ -}; - -typedef struct elf_internal_sym Elf_Internal_Sym; - -#define elf32_internal_sym elf_internal_sym -#define elf64_internal_sym elf_internal_sym -#define Elf32_Internal_Sym Elf_Internal_Sym -#define Elf64_Internal_Sym Elf_Internal_Sym - -/* Note segments */ - -typedef struct elf_internal_note { - unsigned long namesz; /* Size of entry's owner string */ - unsigned long descsz; /* Size of the note descriptor */ - unsigned long type; /* Interpretation of the descriptor */ - char name[1]; /* Start of the name+desc data */ -} Elf_Internal_Note; -#define Elf32_Internal_Note Elf_Internal_Note -#define elf32_internal_note elf_internal_note - -/* Relocation Entries */ - -typedef struct elf_internal_rel { - bfd_vma r_offset; /* Location at which to apply the action */ - /* This needs to support 64-bit values in elf64. */ - bfd_vma r_info; /* index and type of relocation */ -} Elf_Internal_Rel; - -#define elf32_internal_rel elf_internal_rel -#define Elf32_Internal_Rel Elf_Internal_Rel -#define elf64_internal_rel elf_internal_rel -#define Elf64_Internal_Rel Elf_Internal_Rel - -typedef struct elf_internal_rela { - bfd_vma r_offset; /* Location at which to apply the action */ - bfd_vma r_info; /* Index and Type of relocation */ - bfd_signed_vma r_addend; /* Constant addend used to compute value */ -} Elf_Internal_Rela; - -#define elf32_internal_rela elf_internal_rela -#define elf64_internal_rela elf_internal_rela -#define Elf32_Internal_Rela Elf_Internal_Rela -#define Elf64_Internal_Rela Elf_Internal_Rela - -/* dynamic section structure */ - -typedef struct elf_internal_dyn { - /* This needs to support 64-bit values in elf64. */ - bfd_vma d_tag; /* entry tag value */ - union { - /* This needs to support 64-bit values in elf64. */ - bfd_vma d_val; - bfd_vma d_ptr; - } d_un; -} Elf_Internal_Dyn; - -#define elf32_internal_dyn elf_internal_dyn -#define elf64_internal_dyn elf_internal_dyn -#define Elf32_Internal_Dyn Elf_Internal_Dyn -#define Elf64_Internal_Dyn Elf_Internal_Dyn - -/* This structure is used to describe how sections should be assigned - to program segments. */ - -struct elf_segment_map -{ - /* Next program segment. */ - struct elf_segment_map *next; - /* Program segment type. */ - unsigned long p_type; - /* Program segment flags. */ - unsigned long p_flags; - /* Program segment physical address. */ - bfd_vma p_paddr; - /* Whether the p_flags field is valid; if not, the flags are based - on the section flags. */ - unsigned int p_flags_valid : 1; - /* Whether the p_paddr field is valid; if not, the physical address - is based on the section lma values. */ - unsigned int p_paddr_valid : 1; - /* Whether this segment includes the file header. */ - unsigned int includes_filehdr : 1; - /* Whether this segment includes the program headers. */ - unsigned int includes_phdrs : 1; - /* Number of sections (may be 0). */ - unsigned int count; - /* Sections. Actual number of elements is in count field. */ - asection *sections[1]; -}; - -#endif /* _ELF_INTERNAL_H */ diff --git a/contrib/gdb/include/elf/mips.h b/contrib/gdb/include/elf/mips.h deleted file mode 100644 index f0d8cd7896508..0000000000000 --- a/contrib/gdb/include/elf/mips.h +++ /dev/null @@ -1,298 +0,0 @@ -/* MIPS ELF support for BFD. - Copyright (C) 1993, 1994 Free Software Foundation, Inc. - - By Ian Lance Taylor, Cygnus Support, <ian@cygnus.com>, from - information in the System V Application Binary Interface, MIPS - Processor Supplement. - -This file is part of BFD, the Binary File Descriptor library. - -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 2 of the License, 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ - -/* This file holds definitions specific to the MIPS ELF ABI. Note - that most of this is not actually implemented by BFD. */ - -#ifndef _ELF_MIPS_H -#define _ELF_MIPS_H - -/* Processor specific flags for the ELF header e_flags field. */ - -/* At least one .noreorder directive appears in the source. */ -#define EF_MIPS_NOREORDER 0x00000001 - -/* File contains position independent code. */ -#define EF_MIPS_PIC 0x00000002 - -/* Code in file uses the standard calling sequence for calling - position independent code. */ -#define EF_MIPS_CPIC 0x00000004 - -/* Four bit MIPS architecture field. */ -#define EF_MIPS_ARCH 0xf0000000 - -/* -mips1 code. */ -#define E_MIPS_ARCH_1 0x00000000 - -/* -mips2 code. */ -#define E_MIPS_ARCH_2 0x10000000 - -/* -mips3 code. */ -#define E_MIPS_ARCH_3 0x20000000 - -/* Processor specific section indices. These sections do not actually - exist. Symbols with a st_shndx field corresponding to one of these - values have a special meaning. */ - -/* Defined and allocated common symbol. Value is virtual address. If - relocated, alignment must be preserved. */ -#define SHN_MIPS_ACOMMON 0xff00 - -/* Defined and allocated text symbol. Value is virtual address. - Occur in the dynamic symbol table of Alpha OSF/1 and Irix 5 executables. */ -#define SHN_MIPS_TEXT 0xff01 - -/* Defined and allocated data symbol. Value is virtual address. - Occur in the dynamic symbol table of Alpha OSF/1 and Irix 5 executables. */ -#define SHN_MIPS_DATA 0xff02 - -/* Small common symbol. */ -#define SHN_MIPS_SCOMMON 0xff03 - -/* Small undefined symbol. */ -#define SHN_MIPS_SUNDEFINED 0xff04 - -/* Processor specific section types. */ - -/* Section contains the set of dynamic shared objects used when - statically linking. */ -#define SHT_MIPS_LIBLIST 0x70000000 - -/* I'm not sure what this is, but it's used on Irix 5. */ -#define SHT_MIPS_MSYM 0x70000001 - -/* Section contains list of symbols whose definitions conflict with - symbols defined in shared objects. */ -#define SHT_MIPS_CONFLICT 0x70000002 - -/* Section contains the global pointer table. */ -#define SHT_MIPS_GPTAB 0x70000003 - -/* Section contains microcode information. The exact format is - unspecified. */ -#define SHT_MIPS_UCODE 0x70000004 - -/* Section contains some sort of debugging information. The exact - format is unspecified. It's probably ECOFF symbols. */ -#define SHT_MIPS_DEBUG 0x70000005 - -/* Section contains register usage information. */ -#define SHT_MIPS_REGINFO 0x70000006 - -/* Section contains miscellaneous options (used on Irix). */ -#define SHT_MIPS_OPTIONS 0x7000000d - -/* DWARF debugging section (used on Irix 6). */ -#define SHT_MIPS_DWARF 0x7000001e - -/* Events section. This appears on Irix 6. I don't know what it - means. */ -#define SHT_MIPS_EVENTS 0x70000021 - -/* A section of type SHT_MIPS_LIBLIST contains an array of the - following structure. The sh_link field is the section index of the - string table. The sh_info field is the number of entries in the - section. */ -typedef struct -{ - /* String table index for name of shared object. */ - unsigned long l_name; - /* Time stamp. */ - unsigned long l_time_stamp; - /* Checksum of symbol names and common sizes. */ - unsigned long l_checksum; - /* String table index for version. */ - unsigned long l_version; - /* Flags. */ - unsigned long l_flags; -} Elf32_Lib; - -/* The l_flags field of an Elf32_Lib structure may contain the - following flags. */ - -/* Require an exact match at runtime. */ -#define LL_EXACT_MATCH 0x00000001 - -/* Ignore version incompatibilities at runtime. */ -#define LL_IGNORE_INT_VER 0x00000002 - -/* A section of type SHT_MIPS_CONFLICT is an array of indices into the - .dynsym section. Each element has the following type. */ -typedef unsigned long Elf32_Conflict; - -/* A section of type SHT_MIPS_GPTAB contains information about how - much GP space would be required for different -G arguments. This - information is only used so that the linker can provide informative - suggestions as to the best -G value to use. The sh_info field is - the index of the section for which this information applies. The - contents of the section are an array of the following union. The - first element uses the gt_header field. The remaining elements use - the gt_entry field. */ -typedef union -{ - struct - { - /* -G value actually used for this object file. */ - unsigned long gt_current_g_value; - /* Unused. */ - unsigned long gt_unused; - } gt_header; - struct - { - /* If this -G argument has been used... */ - unsigned long gt_g_value; - /* ...this many GP section bytes would be required. */ - unsigned long gt_bytes; - } gt_entry; -} Elf32_gptab; - -/* The external version of Elf32_gptab. */ - -typedef union -{ - struct - { - unsigned char gt_current_g_value[4]; - unsigned char gt_unused[4]; - } gt_header; - struct - { - unsigned char gt_g_value[4]; - unsigned char gt_bytes[4]; - } gt_entry; -} Elf32_External_gptab; - -/* A section of type SHT_MIPS_REGINFO contains the following - structure. */ -typedef struct -{ - /* Mask of general purpose registers used. */ - unsigned long ri_gprmask; - /* Mask of co-processor registers used. */ - unsigned long ri_cprmask[4]; - /* GP register value for this object file. */ - long ri_gp_value; -} Elf32_RegInfo; - -/* The external version of the Elf_RegInfo structure. */ -typedef struct -{ - unsigned char ri_gprmask[4]; - unsigned char ri_cprmask[4][4]; - unsigned char ri_gp_value[4]; -} Elf32_External_RegInfo; - -/* MIPS ELF .reginfo swapping routines. */ -extern void bfd_mips_elf32_swap_reginfo_in - PARAMS ((bfd *, const Elf32_External_RegInfo *, Elf32_RegInfo *)); -extern void bfd_mips_elf32_swap_reginfo_out - PARAMS ((bfd *, const Elf32_RegInfo *, Elf32_External_RegInfo *)); - -/* Processor specific section flags. */ - -/* This section must be in the global data area. */ -#define SHF_MIPS_GPREL 0x10000000 - -/* Processor specific program header types. */ - -/* Register usage information. Identifies one .reginfo section. */ -#define PT_MIPS_REGINFO 0x70000000 - -/* Runtime procedure table. */ -#define PT_MIPS_RTPROC 0x70000001 - -/* Processor specific dynamic array tags. */ - -/* 32 bit version number for runtime linker interface. */ -#define DT_MIPS_RLD_VERSION 0x70000001 - -/* Time stamp. */ -#define DT_MIPS_TIME_STAMP 0x70000002 - -/* Checksum of external strings and common sizes. */ -#define DT_MIPS_ICHECKSUM 0x70000003 - -/* Index of version string in string table. */ -#define DT_MIPS_IVERSION 0x70000004 - -/* 32 bits of flags. */ -#define DT_MIPS_FLAGS 0x70000005 - -/* Base address of the segment. */ -#define DT_MIPS_BASE_ADDRESS 0x70000006 - -/* Address of .conflict section. */ -#define DT_MIPS_CONFLICT 0x70000008 - -/* Address of .liblist section. */ -#define DT_MIPS_LIBLIST 0x70000009 - -/* Number of local global offset table entries. */ -#define DT_MIPS_LOCAL_GOTNO 0x7000000a - -/* Number of entries in the .conflict section. */ -#define DT_MIPS_CONFLICTNO 0x7000000b - -/* Number of entries in the .liblist section. */ -#define DT_MIPS_LIBLISTNO 0x70000010 - -/* Number of entries in the .dynsym section. */ -#define DT_MIPS_SYMTABNO 0x70000011 - -/* Index of first external dynamic symbol not referenced locally. */ -#define DT_MIPS_UNREFEXTNO 0x70000012 - -/* Index of first dynamic symbol in global offset table. */ -#define DT_MIPS_GOTSYM 0x70000013 - -/* Number of page table entries in global offset table. */ -#define DT_MIPS_HIPAGENO 0x70000014 - -/* Address of run time loader map, used for debugging. */ -#define DT_MIPS_RLD_MAP 0x70000016 - -/* Flags which may appear in a DT_MIPS_FLAGS entry. */ - -/* No flags. */ -#define RHF_NONE 0x00000000 - -/* Uses shortcut pointers. */ -#define RHF_QUICKSTART 0x00000001 - -/* Hash size is not a power of two. */ -#define RHF_NOTPOT 0x00000002 - -/* Ignore LD_LIBRARY_PATH. */ -#define RHS_NO_LIBRARY_REPLACEMENT \ - 0x00000004 - -/* Special values for the st_other field in the symbol table. These - are used in an Irix 5 dynamic symbol table. */ - -#define STO_DEFAULT 0x00 -#define STO_INTERNAL 0x01 -#define STO_HIDDEN 0x02 -#define STO_PROTECTED 0x03 - -#endif /* _ELF_MIPS_H */ diff --git a/contrib/gdb/include/elf/ppc.h b/contrib/gdb/include/elf/ppc.h deleted file mode 100644 index 1da118ddd842e..0000000000000 --- a/contrib/gdb/include/elf/ppc.h +++ /dev/null @@ -1,54 +0,0 @@ -/* PPC ELF support for BFD. - Copyright (C) 1995 Free Software Foundation, Inc. - - By Michael Meissner, Cygnus Support, <meissner@cygnus.com>, from information - in the System V Application Binary Interface, PowerPC Processor Supplement - and the PowerPC Embedded Application Binary Interface (eabi). - -This file is part of BFD, the Binary File Descriptor library. - -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 2 of the License, 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ - -/* This file holds definitions specific to the PPC ELF ABI. Note - that most of this is not actually implemented by BFD. */ - -#ifndef _ELF_PPC_H -#define _ELF_PPC_H - -/* Processor specific flags for the ELF header e_flags field. */ - -#define EF_PPC_EMB 0x80000000 /* PowerPC embedded flag */ - - /* CYGNUS local bits below */ -#define EF_PPC_RELOCATABLE 0x00010000 /* PowerPC -mrelocatable flag */ -#define EF_PPC_RELOCATABLE_LIB 0x00008000 /* PowerPC -mrelocatable-lib flag */ - -/* Processor specific section headers, sh_type field */ - -#define SHT_ORDERED SHT_HIPROC /* Link editor is to sort the \ - entries in this section \ - based on the address \ - specified in the associated \ - symbol table entry. */ - -/* Processor specific section flags, sh_flags field */ - -#define SHF_EXCLUDE 0x80000000 /* Link editor is to exclude \ - this section from executable \ - and shared objects that it \ - builds when those objects \ - are not to be furhter \ - relocated. */ -#endif /* _ELF_PPC_H */ diff --git a/contrib/gdb/include/elf/sparc.h b/contrib/gdb/include/elf/sparc.h deleted file mode 100644 index 84408e31addae..0000000000000 --- a/contrib/gdb/include/elf/sparc.h +++ /dev/null @@ -1,73 +0,0 @@ -/* SPARC ELF support for BFD. - Copyright (C) 1996 Free Software Foundation, Inc. - - By Doug Evans, Cygnus Support, <dje@cygnus.com>. - -This file is part of BFD, the Binary File Descriptor library. - -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 2 of the License, 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ - -#ifndef _ELF_SPARC_H -#define _ELF_SPARC_H - -/* Processor specific flags for the ELF header e_flags field. */ - -/* These are defined by Sun. */ - -#define EF_SPARC_32PLUS_MASK 0xffff00 /* bits indicating V8+ type */ -#define EF_SPARC_32PLUS 0x000100 /* generic V8+ features */ -#define EF_SPARC_SUN_US1 0x000200 /* Sun UltraSPARC1 extensions */ - -/* Relocation types. */ - -enum elf_sparc_reloc_type { - R_SPARC_NONE = 0, - R_SPARC_8, R_SPARC_16, R_SPARC_32, - R_SPARC_DISP8, R_SPARC_DISP16, R_SPARC_DISP32, - R_SPARC_WDISP30, R_SPARC_WDISP22, - R_SPARC_HI22, R_SPARC_22, - R_SPARC_13, R_SPARC_LO10, - R_SPARC_GOT10, R_SPARC_GOT13, R_SPARC_GOT22, - R_SPARC_PC10, R_SPARC_PC22, - R_SPARC_WPLT30, - R_SPARC_COPY, - R_SPARC_GLOB_DAT, R_SPARC_JMP_SLOT, - R_SPARC_RELATIVE, - R_SPARC_UA32, - - /* ??? These 6 relocs are new but not currently used. For binary - compatility in the sparc64-elf toolchain, we leave them out. - A non-binary upward compatible change is expected for sparc64-elf. */ -#ifndef SPARC64_OLD_RELOCS - /* ??? New relocs on the UltraSPARC. Not sure what they're for yet. */ - R_SPARC_PLT32, R_SPARC_HIPLT22, R_SPARC_LOPLT10, - R_SPARC_PCPLT32, R_SPARC_PCPLT22, R_SPARC_PCPLT10, -#endif - - /* v9 relocs */ - R_SPARC_10, R_SPARC_11, R_SPARC_64, - R_SPARC_OLO10, R_SPARC_HH22, R_SPARC_HM10, R_SPARC_LM22, - R_SPARC_PC_HH22, R_SPARC_PC_HM10, R_SPARC_PC_LM22, - R_SPARC_WDISP16, R_SPARC_WDISP19, - R_SPARC_GLOB_JMP, - R_SPARC_7, -#ifndef SPARC64_OLD_RELOCS - R_SPARC_5, R_SPARC_6, -#endif - - R_SPARC_max -}; - -#endif /* _ELF_SPARC_H */ diff --git a/contrib/gdb/include/floatformat.h b/contrib/gdb/include/floatformat.h deleted file mode 100644 index 01e3dcb2944dd..0000000000000 --- a/contrib/gdb/include/floatformat.h +++ /dev/null @@ -1,88 +0,0 @@ -/* IEEE floating point support declarations, for GDB, the GNU Debugger. - Copyright (C) 1991 Free Software Foundation, Inc. - -This file is part of GDB. - -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 2 of the License, 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ - -#if !defined (FLOATFORMAT_H) -#define FLOATFORMAT_H 1 - -#include "ansidecl.h" - -/* A floatformat consists of a sign bit, an exponent and a mantissa. Once the - bytes are concatenated according to the byteorder flag, then each of those - fields is contiguous. We number the bits with 0 being the most significant - (i.e. BITS_BIG_ENDIAN type numbering), and specify which bits each field - contains with the *_start and *_len fields. */ - -enum floatformat_byteorders { floatformat_little, floatformat_big }; - -enum floatformat_intbit { floatformat_intbit_yes, floatformat_intbit_no }; - -struct floatformat -{ - enum floatformat_byteorders byteorder; - unsigned int totalsize; /* Total size of number in bits */ - - /* Sign bit is always one bit long. 1 means negative, 0 means positive. */ - unsigned int sign_start; - - unsigned int exp_start; - unsigned int exp_len; - /* Amount added to "true" exponent. 0x3fff for many IEEE extendeds. */ - unsigned int exp_bias; - /* Exponent value which indicates NaN. This is the actual value stored in - the float, not adjusted by the exp_bias. This usually consists of all - one bits. */ - unsigned int exp_nan; - - unsigned int man_start; - unsigned int man_len; - - /* Is the integer bit explicit or implicit? */ - enum floatformat_intbit intbit; -}; - -/* floatformats for IEEE single and double, big and little endian. */ - -extern const struct floatformat floatformat_ieee_single_big; -extern const struct floatformat floatformat_ieee_single_little; -extern const struct floatformat floatformat_ieee_double_big; -extern const struct floatformat floatformat_ieee_double_little; - -/* floatformats for various extendeds. */ - -extern const struct floatformat floatformat_i387_ext; -extern const struct floatformat floatformat_m68881_ext; -extern const struct floatformat floatformat_i960_ext; -extern const struct floatformat floatformat_m88110_ext; -extern const struct floatformat floatformat_arm_ext; - -/* Convert from FMT to a double. - FROM is the address of the extended float. - Store the double in *TO. */ - -extern void -floatformat_to_double PARAMS ((const struct floatformat *, char *, double *)); - -/* The converse: convert the double *FROM to FMT - and store where TO points. */ - -extern void -floatformat_from_double PARAMS ((const struct floatformat *, - double *, char *)); - -#endif /* defined (FLOATFORMAT_H) */ diff --git a/contrib/gdb/include/fopen-bin.h b/contrib/gdb/include/fopen-bin.h deleted file mode 100644 index b868f63d46d11..0000000000000 --- a/contrib/gdb/include/fopen-bin.h +++ /dev/null @@ -1,27 +0,0 @@ -/* Macros for the 'type' part of an fopen, freopen or fdopen. - - <Read|Write>[Update]<Binary file|text file> - - This version is for "binary" systems, where text and binary files are - different. An example is Mess-Dose. Many Unix systems could also - cope with a "b" in the string, indicating binary files, but some reject this - (and thereby don't conform to ANSI C, but what else is new?). - - This file is designed for inclusion by host-dependent .h files. No - user application should include it directly, since that would make - the application unable to be configured for both "same" and "binary" - variant systems. */ - -#define FOPEN_RB "rb" -#define FOPEN_WB "wb" -#define FOPEN_AB "ab" -#define FOPEN_RUB "r+b" -#define FOPEN_WUB "w+b" -#define FOPEN_AUB "a+b" - -#define FOPEN_RT "r" -#define FOPEN_WT "w" -#define FOPEN_AT "a" -#define FOPEN_RUT "r+" -#define FOPEN_WUT "w+" -#define FOPEN_AUT "a+" diff --git a/contrib/gdb/include/fopen-same.h b/contrib/gdb/include/fopen-same.h deleted file mode 100644 index 0f37529d33e01..0000000000000 --- a/contrib/gdb/include/fopen-same.h +++ /dev/null @@ -1,27 +0,0 @@ -/* Macros for the 'type' part of an fopen, freopen or fdopen. - - <Read|Write>[Update]<Binary file|text file> - - This version is for "same" systems, where text and binary files are - the same. An example is Unix. Many Unix systems could also add a - "b" to the string, indicating binary files, but some reject this - (and thereby don't conform to ANSI C, but what else is new?). - - This file is designed for inclusion by host-dependent .h files. No - user application should include it directly, since that would make - the application unable to be configured for both "same" and "binary" - variant systems. */ - -#define FOPEN_RB "r" -#define FOPEN_WB "w" -#define FOPEN_AB "a" -#define FOPEN_RUB "r+" -#define FOPEN_WUB "w+" -#define FOPEN_AUB "a+" - -#define FOPEN_RT "r" -#define FOPEN_WT "w" -#define FOPEN_AT "a" -#define FOPEN_RUT "r+" -#define FOPEN_WUT "w+" -#define FOPEN_AUT "a+" diff --git a/contrib/gdb/include/gdbm.h b/contrib/gdb/include/gdbm.h deleted file mode 100644 index 3ebc26d198a77..0000000000000 --- a/contrib/gdb/include/gdbm.h +++ /dev/null @@ -1,91 +0,0 @@ -/* GNU DBM - DataBase Manager include file - Copyright 1989, 1991 Free Software Foundation, Inc. - Written by Philip A. Nelson. - -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 2 of the License, 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ - -/* You may contact the author by: - e-mail: phil@wwu.edu - us-mail: Philip A. Nelson - Computer Science Department - Western Washington University - Bellingham, WA 98226 - phone: (206) 676-3035 - -*************************************************************************/ - -/* Parameters to gdbm_open for READERS, WRITERS, and WRITERS who - can create the database. */ -#define GDBM_READER 0 -#define GDBM_WRITER 1 -#define GDBM_WRCREAT 2 -#define GDBM_NEWDB 3 - -/* Parameters to gdbm_store for simple insertion or replacement. */ -#define GDBM_INSERT 0 -#define GDBM_REPLACE 1 - - -/* The data and key structure. This structure is defined for compatibility. */ -typedef struct { - char *dptr; - int dsize; - } datum; - - -/* The file information header. This is good enough for most applications. */ -typedef struct {int dummy[10];} *GDBM_FILE; - - -/* These are the routines! */ - -extern GDBM_FILE gdbm_open (); - -extern void gdbm_close (); - -extern datum gdbm_fetch (); - -extern int gdbm_store (); - -extern int gdbm_delete (); - -extern datum gdbm_firstkey (); - -extern datum gdbm_nextkey (); - -extern int gdbm_reorganize (); - - -/* gdbm sends back the following error codes in the variable gdbm_errno. */ -typedef enum { NO_ERROR, - MALLOC_ERROR, - BLOCK_SIZE_ERROR, - FILE_OPEN_ERROR, - FILE_WRITE_ERROR, - FILE_SEEK_ERROR, - FILE_READ_ERROR, - BAD_MAGIC_NUMBER, - EMPTY_DATABASE, - CANT_BE_READER, - CANT_BE_WRITER, - READER_CANT_RECOVER, - READER_CANT_DELETE, - READER_CANT_STORE, - READER_CANT_REORGANIZE, - UNKNOWN_UPDATE, - ITEM_NOT_FOUND, - REORGANIZE_FAILED, - CANNOT_REPLACE} - gdbm_error; diff --git a/contrib/gdb/include/getopt.h b/contrib/gdb/include/getopt.h deleted file mode 100644 index abf915383200a..0000000000000 --- a/contrib/gdb/include/getopt.h +++ /dev/null @@ -1,129 +0,0 @@ -/* Declarations for getopt. - Copyright (C) 1989, 1990, 1991, 1992, 1993 Free Software Foundation, Inc. - - This program is free software; you can redistribute it and/or - modify it under the terms of the GNU Library General Public License - as published by the Free Software Foundation; either version 2, 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 Library General Public License for more details. - - You should have received a copy of the GNU Library General Public License - along with this program; if not, write to the Free Software - Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ - -#ifndef _GETOPT_H -#define _GETOPT_H 1 - -#ifdef __cplusplus -extern "C" { -#endif - -/* For communication from `getopt' to the caller. - When `getopt' finds an option that takes an argument, - the argument value is returned here. - Also, when `ordering' is RETURN_IN_ORDER, - each non-option ARGV-element is returned here. */ - -extern char *optarg; - -/* Index in ARGV of the next element to be scanned. - This is used for communication to and from the caller - and for communication between successive calls to `getopt'. - - On entry to `getopt', zero means this is the first call; initialize. - - When `getopt' returns EOF, this is the index of the first of the - non-option elements that the caller should itself scan. - - Otherwise, `optind' communicates from one call to the next - how much of ARGV has been scanned so far. */ - -extern int optind; - -/* Callers store zero here to inhibit the error message `getopt' prints - for unrecognized options. */ - -extern int opterr; - -/* Set to an option character which was unrecognized. */ - -extern int optopt; - -/* Describe the long-named options requested by the application. - The LONG_OPTIONS argument to getopt_long or getopt_long_only is a vector - of `struct option' terminated by an element containing a name which is - zero. - - The field `has_arg' is: - no_argument (or 0) if the option does not take an argument, - required_argument (or 1) if the option requires an argument, - optional_argument (or 2) if the option takes an optional argument. - - If the field `flag' is not NULL, it points to a variable that is set - to the value given in the field `val' when the option is found, but - left unchanged if the option is not found. - - To have a long-named option do something other than set an `int' to - a compiled-in constant, such as set a value from `optarg', set the - option's `flag' field to zero and its `val' field to a nonzero - value (the equivalent single-letter option character, if there is - one). For long options that have a zero `flag' field, `getopt' - returns the contents of the `val' field. */ - -struct option -{ -#if __STDC__ - const char *name; -#else - char *name; -#endif - /* has_arg can't be an enum because some compilers complain about - type mismatches in all the code that assumes it is an int. */ - int has_arg; - int *flag; - int val; -}; - -/* Names for the values of the `has_arg' field of `struct option'. */ - -#define no_argument 0 -#define required_argument 1 -#define optional_argument 2 - -#if __STDC__ -#if defined(__GNU_LIBRARY__) -/* Many other libraries have conflicting prototypes for getopt, with - differences in the consts, in stdlib.h. To avoid compilation - errors, only prototype getopt for the GNU C library. */ -extern int getopt (int argc, char *const *argv, const char *shortopts); -#else /* not __GNU_LIBRARY__ */ -extern int getopt (); -#endif /* not __GNU_LIBRARY__ */ -extern int getopt_long (int argc, char *const *argv, const char *shortopts, - const struct option *longopts, int *longind); -extern int getopt_long_only (int argc, char *const *argv, - const char *shortopts, - const struct option *longopts, int *longind); - -/* Internal only. Users should not call this directly. */ -extern int _getopt_internal (int argc, char *const *argv, - const char *shortopts, - const struct option *longopts, int *longind, - int long_only); -#else /* not __STDC__ */ -extern int getopt (); -extern int getopt_long (); -extern int getopt_long_only (); - -extern int _getopt_internal (); -#endif /* not __STDC__ */ - -#ifdef __cplusplus -} -#endif - -#endif /* _GETOPT_H */ diff --git a/contrib/gdb/include/hp-symtab.h b/contrib/gdb/include/hp-symtab.h deleted file mode 100644 index 051c4c63ed2d9..0000000000000 --- a/contrib/gdb/include/hp-symtab.h +++ /dev/null @@ -1,983 +0,0 @@ -/* Definitions and structures for reading debug symbols from the - native HP C compiler. - - Written by the Center for Software Science at the University of Utah - and by Cygnus Support. - - Copyright 1994 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 2 of the License, 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ - -#ifndef HP_SYMTAB_INCLUDED -#define HP_SYMTAB_INCLUDED - -/* General information: - - This header file defines and describes only the basic data structures - necessary to read debug symbols produced by the HP C compiler using the - SOM object file format. Definitions and structures used by other compilers - for other languages or object file formats may be missing. - (For a full description of the debug format, ftp hpux-symtab.h from - jaguar.cs.utah.edu:/dist). - - - Debug symbols are contained entirely within an unloadable space called - $DEBUG$. $DEBUG$ contains several subspaces which group related - debug symbols. - - $GNTT$ contains information for global variables, types and contants. - - $LNTT$ contains information for procedures (including nesting), scoping - information, local variables, types, and constants. - - $SLT$ contains source line information so that code addresses may be - mapped to source lines. - - $VT$ contains various strings and constants for named objects (variables, - typedefs, functions, etc). Strings are stored as null-terminated character - lists. Constants always begin on word boundaries. The first byte of - the VT must be zero (a null string). - - $XT$ is not currently used by GDB. - - Many structures within the subspaces point to other structures within - the same subspace, or to structures within a different subspace. These - pointers are represented as a structure index from the beginning of - the appropriate subspace. */ - -/* Used to describe where a constant is stored. */ -enum location_type -{ - LOCATION_IMMEDIATE, - LOCATION_PTR, - LOCATION_VT, -}; - -/* Languages supported by this debug format. Within the data structures - this type is limited to 4 bits for a maximum of 16 languages. */ -enum hp_language -{ - HP_LANGUAGE_UNKNOWN, - HP_LANGUAGE_C, - HP_LANGUAGE_F77, - HP_LANGUAGE_PASCAL, - HP_LANGUAGE_COBOL, - HP_LANGUAGE_BASIC, - HP_LANGUAGE_ADA, - HP_LANGUAGE_CPLUSPLUS, -}; - - -/* Basic data types available in this debug format. Within the data - structures this type is limited to 5 bits for a maximum of 32 basic - data types. */ -enum hp_type -{ - HP_TYPE_UNDEFINED, - HP_TYPE_BOOLEAN, - HP_TYPE_CHAR, - HP_TYPE_INT, - HP_TYPE_UNSIGNED_INT, - HP_TYPE_REAL, - HP_TYPE_COMPLEX, - HP_TYPE_STRING200, - HP_TYPE_LONGSTRING200, - HP_TYPE_TEXT, - HP_TYPE_FLABEL, - HP_TYPE_FTN_STRING_SPEC, - HP_TYPE_MOD_STRING_SPEC, - HP_TYPE_PACKED_DECIMAL, - HP_TYPE_REAL_3000, - HP_TYPE_MOD_STRING_3000, - HP_TYPE_ANYPOINTER, - HP_TYPE_GLOBAL_ANYPOINTER, - HP_TYPE_LOCAL_ANYPOINTER, - HP_TYPE_COMPLEXS3000, - HP_TYPE_FTN_STRING_S300_COMPAT, - HP_TYPE_FTN_STRING_VAX_COMPAT, - HP_TYPE_BOOLEAN_S300_COMPAT, - HP_TYPE_BOOLEAN_VAX_COMPAT, - HP_TYPE_WIDE_CHAR, - HP_TYPE_LONG, - HP_TYPE_UNSIGNED_LONG, - HP_TYPE_DOUBLE, - HP_TYPE_TEMPLATE_ARG, -}; - -/* An immediate name and type table entry. - - extension and immediate will always be one. - global will always be zero. - hp_type is the basic type this entry describes. - bitlength is the length in bits for the basic type. */ -struct dnttp_immediate -{ - unsigned int extension: 1; - unsigned int immediate: 1; - unsigned int global: 1; - unsigned int type: 5; - unsigned int bitlength: 24; -}; - -/* A nonimmediate name and type table entry. - - extension will always be one. - immediate will always be zero. - if global is zero, this entry points into the LNTT - if global is one, this entry points into the GNTT - index is the index within the GNTT or LNTT for this entry. */ -struct dnttp_nonimmediate -{ - unsigned int extension: 1; - unsigned int immediate: 1; - unsigned int global: 1; - unsigned int index: 29; -}; - -/* A pointer to an entry in the GNTT and LNTT tables. It has two - forms depending on the type being described. - - The immediate form is used for simple entries and is one - word. - - The nonimmediate form is used for complex entries and contains - an index into the LNTT or GNTT which describes the entire type. - - If a dnttpointer is -1, then it is a NIL entry. */ - -#define DNTTNIL (-1) -typedef union dnttpointer -{ - struct dnttp_immediate dntti; - struct dnttp_nonimmediate dnttp; - int word; -} dnttpointer; - -/* An index into the source line table. As with dnttpointers, a sltpointer - of -1 indicates a NIL entry. */ -#define SLTNIL (-1) -typedef int sltpointer; - -/* Unsigned byte offset into the VT. */ -typedef unsigned int vtpointer; - -/* A DNTT entry (used within the GNTT and LNTT). - - DNTT entries are variable sized objects, but are always a multiple - of 3 words (we call each group of 3 words a "block"). - - The first bit in each block is an extension bit. This bit is zero - for the first block of a DNTT entry. If the entry requires more - than one block, then this bit is set to one in all blocks after - the first one. */ - -/* Each DNTT entry describes a particular debug symbol (beginning of - a source file, a function, variables, structures, etc. - - The type of the DNTT entry is stored in the "kind" field within the - DNTT entry itself. */ - -enum dntt_entry_type -{ - DNTT_TYPE_NIL = -1, - DNTT_TYPE_SRCFILE, - DNTT_TYPE_MODULE, - DNTT_TYPE_FUNCTION, - DNTT_TYPE_ENTRY, - DNTT_TYPE_BEGIN, - DNTT_TYPE_END, - DNTT_TYPE_IMPORT, - DNTT_TYPE_LABEL, - DNTT_TYPE_FPARAM, - DNTT_TYPE_SVAR, - DNTT_TYPE_DVAR, - DNTT_TYPE_HOLE1, - DNTT_TYPE_CONST, - DNTT_TYPE_TYPEDEF, - DNTT_TYPE_TAGDEF, - DNTT_TYPE_POINTER, - DNTT_TYPE_ENUM, - DNTT_TYPE_MEMENUM, - DNTT_TYPE_SET, - DNTT_TYPE_SUBRANGE, - DNTT_TYPE_ARRAY, - DNTT_TYPE_STRUCT, - DNTT_TYPE_UNION, - DNTT_TYPE_FIELD, - DNTT_TYPE_VARIANT, - DNTT_TYPE_FILE, - DNTT_TYPE_FUNCTYPE, - DNTT_TYPE_WITH, - DNTT_TYPE_COMMON, - DNTT_TYPE_COBSTRUCT, - DNTT_TYPE_XREF, - DNTT_TYPE_SA, - DNTT_TYPE_MACRO, - DNTT_TYPE_BLOCKDATA, - DNTT_TYPE_CLASS_SCOPE, - DNTT_TYPE_REFERENCE, - DNTT_TYPE_PTRMEM, - DNTT_TYPE_PTRMEMFUNC, - DNTT_TYPE_CLASS, - DNTT_TYPE_GENFIELD, - DNTT_TYPE_VFUNC, - DNTT_TYPE_MEMACCESS, - DNTT_TYPE_INHERITANCE, - DNTT_TYPE_FRIEND_CLASS, - DNTT_TYPE_FRIEND_FUNC, - DNTT_TYPE_MODIFIER, - DNTT_TYPE_OBJECT_ID, - DNTT_TYPE_MEMFUNC, - DNTT_TYPE_TEMPLATE, - DNTT_TYPE_TEMPLATE_ARG, - DNTT_TYPE_FUNC_TEMPLATE, - DNTT_TYPE_LINK, - DNTT_TYPE_MAX, -}; - -/* DNTT_TYPE_SRCFILE: - - One DNTT_TYPE_SRCFILE symbol is output for the start of each source - file and at the begin and end of an included file. A DNTT_TYPE_SRCFILE - entry is also output before each DNTT_TYPE_FUNC symbol so that debuggers - can determine what file a function was defined in. - - LANGUAGE describes the source file's language. - - NAME points to an VT entry providing the source file's name. - - Note the name used for DNTT_TYPE_SRCFILE entries are exactly as seen - by the compiler (ie they may be relative or absolute). C include files - via <> inclusion must use absolute paths. - - ADDRESS points to an SLT entry from which line number and code locations - may be determined. */ - -struct dntt_type_srcfile -{ - unsigned int extension: 1; - unsigned int kind: 10; - unsigned int language: 4; - unsigned int unused: 17; - vtpointer name; - sltpointer address; -}; - -/* DNTT_TYPE_MODULE: - - A DNTT_TYPE_MODULE symbol is emitted for the start of a pascal - module or C source file. - - Each DNTT_TYPE_MODULE must have an associated DNTT_TYPE_END symbol. - - NAME points to a VT entry providing the module's name. Note C - source files are considered nameless modules. - - ALIAS point to a VT entry providing a secondary name. - - ADDRESS points to an SLT entry from which line number and code locations - may be determined. */ - -struct dntt_type_module -{ - unsigned int extension: 1; - unsigned int kind: 10; - unsigned int unused: 21; - vtpointer name; - vtpointer alias; - dnttpointer unused2; - sltpointer address; -}; - -/* DNTT_TYPE_FUNCTION: - - A DNTT_TYPE_FUNCTION symbol is emitted for each function definition; - a DNTT_TYPE_ENTRY symbols is used for secondary entry points. Both - symbols used the dntt_type_function structure. - - Each DNTT_TYPE_FUNCTION must have a matching DNTT_TYPE_END. - - GLOBAL is nonzero if the function has global scope. - - LANGUAGE describes the function's source language. - - OPT_LEVEL describes the optimization level the function was compiled - with. - - VARARGS is nonzero if the function uses varargs. - - NAME points to a VT entry providing the function's name. - - ALIAS points to a VT entry providing a secondary name for the function. - - FIRSTPARAM points to a LNTT entry which describes the parameter list. - - ADDRESS points to an SLT entry from which line number and code locations - may be determined. - - ENTRYADDR is the memory address corresponding the the function's entry point - - RETVAL points to a LNTT entry describing the function's return value. - - LOWADDR is the lowest memory address associated with this function. - - HIADDR is the highest memory address associated with this function. */ - -struct dntt_type_function -{ - unsigned int extension: 1; - unsigned int kind: 10; - unsigned int global: 1; - unsigned int language: 4; - unsigned int nest_level: 5; - unsigned int opt_level: 2; - unsigned int varargs: 1; - unsigned int lang_info: 4; - unsigned int inlined: 1; - unsigned int localalloc: 1; - unsigned int expansion: 1; - unsigned int unused: 1; - vtpointer name; - vtpointer alias; - dnttpointer firstparam; - sltpointer address; - CORE_ADDR entryaddr; - dnttpointer retval; - CORE_ADDR lowaddr; - CORE_ADDR hiaddr; -}; - -/* DNTT_TYPE_BEGIN: - - A DNTT_TYPE_BEGIN symbol is emitted to begin a new nested scope. - Every DNTT_TYPE_BEGIN symbol must have a matching DNTT_TYPE_END symbol. - - CLASSFLAG is nonzero if this is the beginning of a c++ class definition. - - ADDRESS points to an SLT entry from which line number and code locations - may be determined. */ - -struct dntt_type_begin -{ - unsigned int extension: 1; - unsigned int kind: 10; - unsigned int classflag: 1; - unsigned int unused: 20; - sltpointer address; -}; - -/* DNTT_TYPE_END: - - A DNTT_TYPE_END symbol is emitted when closing a scope started by - a DNTT_TYPE_MODULE, DNTT_TYPE_FUNCTION, and DNTT_TYPE_BEGIN symbols. - - ENDKIND describes what type of scope the DNTT_TYPE_END is closing - (DNTT_TYPE_MODULE, DNTT_TYPE_BEGIN, etc). - - CLASSFLAG is nonzero if this is the end of a c++ class definition. - - ADDRESS points to an SLT entry from which line number and code locations - may be determined. - - BEGINSCOPE points to the LNTT entry which opened the scope. */ - -struct dntt_type_end -{ - unsigned int extension: 1; - unsigned int kind: 10; - unsigned int endkind: 10; - unsigned int classflag: 1; - unsigned int unused: 10; - sltpointer address; - dnttpointer beginscope; -}; - -/* DNTT_TYPE_IMPORT is unused by GDB. */ -/* DNTT_TYPE_LABEL is unused by GDB. */ - -/* DNTT_TYPE_FPARAM: - - A DNTT_TYPE_FPARAM symbol is emitted for a function argument. When - chained together the symbols represent an argument list for a function. - - REGPARAM is nonzero if this parameter was passed in a register. - - INDIRECT is nonzero if this parameter is a pointer to the parameter - (pass by reference or pass by value for large items). - - LONGADDR is nonzero if the parameter is a 64bit pointer. - - NAME is a pointer into the VT for the parameter's name. - - LOCATION describes where the parameter is stored. Depending on the - parameter type LOCATION could be a register number, or an offset - from the stack pointer. - - TYPE points to a NTT entry describing the type of this parameter. - - NEXTPARAM points to the LNTT entry describing the next parameter. */ - -struct dntt_type_fparam -{ - unsigned int extension: 1; - unsigned int kind: 10; - unsigned int regparam: 1; - unsigned int indirect: 1; - unsigned int longaddr: 1; - unsigned int copyparam: 1; - unsigned int dflt: 1; - unsigned int unused: 16; - vtpointer name; - int location; - dnttpointer type; - dnttpointer nextparam; - int misc; -}; - -/* DNTT_TYPE_SVAR: - - A DNTT_TYPE_SVAR is emitted to describe a variable in static storage. - - GLOBAL is nonzero if the variable has global scope. - - INDIRECT is nonzero if the variable is a pointer to an object. - - LONGADDR is nonzero if the variable is in long pointer space. - - STATICMEM is nonzero if the variable is a member of a class. - - A_UNION is nonzero if the variable is an anonymous union member. - - NAME is a pointer into the VT for the variable's name. - - LOCATION provides the memory address for the variable. - - TYPE is a pointer into either the GNTT or LNTT which describes - the type of this variable. */ - -struct dntt_type_svar -{ - unsigned int extension: 1; - unsigned int kind: 10; - unsigned int global: 1; - unsigned int indirect: 1; - unsigned int longaddr: 1; - unsigned int staticmem: 1; - unsigned int a_union: 1; - unsigned int unused: 16; - vtpointer name; - CORE_ADDR location; - dnttpointer type; - unsigned int offset; - unsigned int displacement; -}; - -/* DNTT_TYPE_DVAR: - - A DNTT_TYPE_DVAR is emitted to describe automatic variables and variables - held in registers. - - GLOBAL is nonzero if the variable has global scope. - - INDIRECT is nonzero if the variable is a pointer to an object. - - REGVAR is nonzero if the variable is in a register. - - A_UNION is nonzero if the variable is an anonymous union member. - - NAME is a pointer into the VT for the variable's name. - - LOCATION provides the memory address or register number for the variable. - - TYPE is a pointer into either the GNTT or LNTT which describes - the type of this variable. */ - -struct dntt_type_dvar -{ - unsigned int extension: 1; - unsigned int kind: 10; - unsigned int global: 1; - unsigned int indirect: 1; - unsigned int regvar: 1; - unsigned int a_union: 1; - unsigned int unused: 17; - vtpointer name; - int location; - dnttpointer type; - unsigned int offset; -}; - -/* DNTT_TYPE_CONST: - - A DNTT_TYPE_CONST symbol is emitted for program constants. - - GLOBAL is nonzero if the constant has global scope. - - INDIRECT is nonzero if the constant is a pointer to an object. - - LOCATION_TYPE describes where to find the constant's value - (in the VT, memory, or embedded in an instruction). - - CLASSMEM is nonzero if the constant is a member of a class. - - NAME is a pointer into the VT for the constant's name. - - LOCATION provides the memory address, register number or pointer - into the VT for the constant's value. - - TYPE is a pointer into either the GNTT or LNTT which describes - the type of this variable. */ - -struct dntt_type_const -{ - unsigned int extension: 1; - unsigned int kind: 10; - unsigned int global: 1; - unsigned int indirect: 1; - unsigned int: 3; - unsigned int classmem: 1; - unsigned int unused: 15; - vtpointer name; - CORE_ADDR location; - dnttpointer type; - unsigned int offset; - unsigned int displacement; -}; - -/* DNTT_TYPE_TYPEDEF and DNTT_TYPE_TAGDEF: - - The same structure is used to describe typedefs and tagdefs. - - DNTT_TYPE_TYPEDEFS are associated with C "typedefs". - - DNTT_TYPE_TAGDEFs are associated with C "struct", "union", and "enum" - tags, which may have the same name as a typedef in the same scope. - - GLOBAL is nonzero if the typedef/tagdef has global scope. - - TYPEINFO is used to determine if full type information is available - for a tag. (usually 1, but can be zero for opaque types in C). - - NAME is a pointer into the VT for the constant's name. - - TYPE points to the underlying type for the typedef/tagdef in the - GNTT or LNTT. */ - -struct dntt_type_type -{ - unsigned int extension: 1; - unsigned int kind: 10; - unsigned int global: 1; - unsigned int typeinfo: 1; - unsigned int unused: 19; - vtpointer name; - dnttpointer type; -}; - -/* DNTT_TYPE_POINTER: - - Used to describe a pointer to an underlying type. - - POINTSTO is a pointer into the GNTT or LNTT for the type which this - pointer points to. - - BITLENGTH is the length of the pointer (not the underlying type). */ - -struct dntt_type_pointer -{ - unsigned int extension: 1; - unsigned int kind: 10; - unsigned int unused: 21; - dnttpointer pointsto; - unsigned int bitlength; -}; - - -/* DNTT_TYPE_ENUM: - - Used to describe enumerated types. - - FIRSTMEM is a pointer to a DNTT_TYPE_MEMENUM in the GNTT/LNTT which - describes the first member (and contains a pointer to the chain of - members). - - BITLENGTH is the number of bits used to hold the values of the enum's - members. */ - -struct dntt_type_enum -{ - unsigned int extension: 1; - unsigned int kind: 10; - unsigned int unused: 21; - dnttpointer firstmem; - unsigned int bitlength; -}; - -/* DNTT_TYPE_MEMENUM - - Used to describe members of an enumerated type. - - CLASSMEM is nonzero if this member is part of a class. - - NAME points into the VT for the name of this member. - - VALUE is the value of this enumeration member. - - NEXTMEM points to the next DNTT_TYPE_MEMENUM in the chain. */ - -struct dntt_type_memenum -{ - unsigned int extension: 1; - unsigned int kind: 10; - unsigned int classmem: 1; - unsigned int unused: 20; - vtpointer name; - unsigned int value; - dnttpointer nextmem; -}; - -/* DNTT_TYPE_SET - - DECLARATION describes the bitpacking of the set. - - SUBTYPE points to a DNTT entry describing the type of the members. - - BITLENGTH is the size of the set. */ - -struct dntt_type_set -{ - unsigned int extension: 1; - unsigned int kind: 10; - unsigned int declaration: 2; - unsigned int unused: 19; - dnttpointer subtype; - unsigned int bitlength; -}; - -/* DNTT_TYPE_SUBRANGE - - DYN_LOW describes the lower bound of the subrange: - - 00 for a constant lower bound (found in LOWBOUND). - - 01 for a dynamic lower bound with the lower bound found in the the - memory address pointed to by LOWBOUND. - - 10 for a dynamic lower bound described by an variable found in the - DNTT/LNTT (LOWBOUND would be a pointer into the DNTT/LNTT). - - DYN_HIGH is similar to DYN_LOW, except it describes the upper bound. - - SUBTYPE points to the type of the subrange. - - BITLENGTH is the length in bits needed to describe the subrange's - values. */ - -struct dntt_type_subrange -{ - unsigned int extension: 1; - unsigned int kind: 10; - unsigned int dyn_low: 2; - unsigned int dyn_high: 2; - unsigned int unused: 17; - int lowbound; - int highbound; - dnttpointer subtype; - unsigned int bitlength; -}; - -/* DNTT_TYPE_ARRAY - - DECLARATION describes the bit packing used in the array. - - ARRAYISBYTES is nonzero if the field in arraylength describes the - length in bytes rather than in bits. A value of zero is used to - describe an array with size 2**32. - - ELEMISBYTES is nonzero if the length if each element in the array - is describes in bytes rather than bits. A value of zero is used - to an element with size 2**32. - - ELEMORDER is nonzero if the elements are indexed in increasing order. - - JUSTIFIED if the elements are left justified to index zero. - - ARRAYLENGTH is the length of the array. - - INDEXTYPE is a DNTT pointer to the type used to index the array. - - ELEMTYPE is a DNTT pointer to the type for the array elements. - - ELEMLENGTH is the length of each element in the array (including - any padding). - - Multi-dimensional arrays are represented by ELEMTYPE pointing to - another DNTT_TYPE_ARRAY. */ - -struct dntt_type_array -{ - unsigned int extension: 1; - unsigned int kind: 10; - unsigned int declaration: 2; - unsigned int dyn_low: 2; - unsigned int dyn_high: 2; - unsigned int arrayisbytes: 1; - unsigned int elemisbytes: 1; - unsigned int elemorder: 1; - unsigned int justified: 1; - unsigned int unused: 11; - unsigned int arraylength; - dnttpointer indextype; - dnttpointer elemtype; - unsigned int elemlength; -}; - -/* DNTT_TYPE_STRUCT - - DNTT_TYPE_STRUCT is used to describe a C structure. - - DECLARATION describes the bitpacking used. - - FIRSTFIELD is a DNTT pointer to the first field of the structure - (each field contains a pointer to the next field, walk the list - to access all fields of the structure). - - VARTAGFIELD and VARLIST are used for Pascal variant records. - - BITLENGTH is the size of the structure in bits. */ - -struct dntt_type_struct -{ - unsigned int extension: 1; - unsigned int kind: 10; - unsigned int declaration: 2; - unsigned int unused: 19; - dnttpointer firstfield; - dnttpointer vartagfield; - dnttpointer varlist; - unsigned int bitlength; -}; - -/* DNTT_TYPE_UNION - - DNTT_TYPE_UNION is used to describe a C union. - - FIRSTFIELD is a DNTT pointer to the beginning of the field chain. - - BITLENGTH is the size of the union in bits. */ - -struct dntt_type_union -{ - unsigned int extension: 1; - unsigned int kind: 10; - unsigned int unused: 21; - dnttpointer firstfield; - unsigned int bitlength; -}; - -/* DNTT_TYPE_FIELD - - DNTT_TYPE_FIELD describes one field in a structure or union. - - VISIBILITY is used to describe the visibility of the field - (for c++. public = 0, protected = 1, private = 2). - - A_UNION is nonzero if this field is a member of an anonymous union. - - STATICMEM is nonzero if this field is a static member of a template. - - NAME is a pointer into the VT for the name of the field. - - BITOFFSET gives the offset of this field in bits from the beginning - of the structure or union this field is a member of. - - TYPE is a DNTT pointer to the type describing this field. - - BITLENGTH is the size of the entry in bits. - - NEXTFIELD is a DNTT pointer to the next field in the chain. */ - -struct dntt_type_field -{ - unsigned int extension: 1; - unsigned int kind: 10; - unsigned int visibility: 2; - unsigned int a_union: 1; - unsigned int staticmem: 1; - unsigned int unused: 17; - vtpointer name; - unsigned int bitoffset; - dnttpointer type; - unsigned int bitlength; - dnttpointer nextfield; -}; - -/* DNTT_TYPE_VARIANT is unused by GDB. */ -/* DNTT_TYPE_FILE is unused by GDB. */ - -/* DNTT_TYPE_COMMON is unused by GDB. */ -/* DNTT_TYPE_LINK is unused by GDB. */ -/* DNTT_TYPE_FFUNC_LINK is unused by GDB. */ -/* DNTT_TYPE_TEMPLATE is unused by GDB. */ - -/* DNTT_TYPE_FUNCTYPE - - VARARGS is nonzero if this function uses varargs. - - FIRSTPARAM is a DNTT pointer to the first entry in the parameter - chain. - - RETVAL is a DNTT pointer to the type of the return value. */ - -struct dntt_type_functype -{ - unsigned int extension: 1; - unsigned int kind: 10; - unsigned int varargs: 1; - unsigned int info: 4; - unsigned int unused: 16; - unsigned int bitlength; - dnttpointer firstparam; - dnttpointer retval; -}; - -/* DNTT_TYPE_WITH is unued by GDB. */ -/* DNTT_TYPE_COBSTRUCT is unused by GDB. */ -/* DNTT_TYPE_MODIFIER is unused by GDB. */ -/* DNTT_TYPE_GENFIELD is unused by GDB. */ -/* DNTT_TYPE_MEMACCESS is unused by GDB. */ -/* DNTT_TYPE_VFUNC is unused by GDB. */ -/* DNTT_TYPE_CLASS_SCOPE is unused by GDB. */ -/* DNTT_TYPE_FRIEND_CLASS is unused by GDB. */ -/* DNTT_TYPE_FRIEND_FUNC is unused by GDB. */ -/* DNTT_TYPE_CLASS unused by GDB. */ -/* DNTT_TYPE_TEMPLATE unused by GDB. */ -/* DNTT_TYPE_TEMPL_ARG is unused by GDB. */ -/* DNTT_TYPE_PTRMEM not used by GDB */ -/* DNTT_TYPE_INHERITANCE is unused by GDB. */ -/* DNTT_TYPE_OBJECT_ID is unused by GDB. */ -/* DNTT_TYPE_XREF is unused by GDB. */ -/* DNTT_TYPE_SA is unused by GDB. */ - -/* DNTT_TYPE_GENERIC and DNTT_TYPE_BLOCK are convience structures - so we can examine a DNTT entry in a generic fashion. */ -struct dntt_type_generic -{ - unsigned int word[9]; -}; - -struct dntt_type_block -{ - unsigned int extension: 1; - unsigned int kind: 10; - unsigned int unused: 21; - unsigned int word[2]; -}; - -/* One entry in a DNTT (either the LNTT or GNTT). */ -union dnttentry -{ - struct dntt_type_srcfile dsfile; - struct dntt_type_module dmodule; - struct dntt_type_function dfunc; - struct dntt_type_function dentry; - struct dntt_type_begin dbegin; - struct dntt_type_end dend; - struct dntt_type_fparam dfparam; - struct dntt_type_svar dsvar; - struct dntt_type_dvar ddvar; - struct dntt_type_const dconst; - struct dntt_type_type dtype; - struct dntt_type_type dtag; - struct dntt_type_pointer dptr; - struct dntt_type_enum denum; - struct dntt_type_memenum dmember; - struct dntt_type_set dset; - struct dntt_type_subrange dsubr; - struct dntt_type_array darray; - struct dntt_type_struct dstruct; - struct dntt_type_union dunion; - struct dntt_type_field dfield; - struct dntt_type_functype dfunctype; - struct dntt_type_generic dgeneric; - struct dntt_type_block dblock; -}; - -/* Source line entry types. */ -enum slttype -{ - SLT_NORMAL, - SLT_SRCFILE, - SLT_MODULE, - SLT_FUNCTION, - SLT_ENTRY, - SLT_BEGIN, - SLT_END, - SLT_WITH, - SLT_EXIT, - SLT_ASSIST, - SLT_MARKER, -}; - -/* A normal source line entry. Simply provides a mapping of a source - line number to a code address. - - SLTDESC will always be SLT_NORMAL or SLT_EXIT. */ - -struct slt_normal -{ - unsigned int sltdesc: 4; - unsigned int line: 28; - CORE_ADDR address; -}; - -/* A special source line entry. Provides a mapping of a declaration - to a line number. These entries point back into the DNTT which - references them. */ - -struct slt_special -{ - unsigned int sltdesc: 4; - unsigned int line: 28; - dnttpointer backptr; -}; - -/* Used to describe nesting. - - For nested languages, an slt_assist entry must follow each SLT_FUNC - entry in the SLT. The address field will point forward to the - first slt_normal entry within the function's scope. */ - -struct slt_assist -{ - unsigned int sltdesc: 4; - unsigned int unused: 28; - sltpointer address; -}; - -struct slt_generic -{ - unsigned int word[2]; -}; - -union sltentry -{ - struct slt_normal snorm; - struct slt_special sspec; - struct slt_assist sasst; - struct slt_generic sgeneric; -}; - -#endif /* HP_SYMTAB_INCLUDED */ diff --git a/contrib/gdb/include/ieee.h b/contrib/gdb/include/ieee.h deleted file mode 100644 index 5ade39d33e351..0000000000000 --- a/contrib/gdb/include/ieee.h +++ /dev/null @@ -1,139 +0,0 @@ -/* IEEE Standard 695-1980 "Universal Format for Object Modules" header file - Contributed by Cygnus Support. */ - -#define N_W_VARIABLES 8 -#define Module_Beginning 0xe0 - -typedef struct ieee_module { - char *processor; - char *module_name; -} ieee_module_begin_type; - -#define Address_Descriptor 0xec -typedef struct ieee_address { -bfd_vma number_of_bits_mau; - bfd_vma number_of_maus_in_address; - - unsigned char byte_order; -#define IEEE_LITTLE 0xcc -#define IEEE_BIG 0xcd -} ieee_address_descriptor_type; - -typedef union ieee_w_variable { - file_ptr offset[N_W_VARIABLES]; - struct { - file_ptr extension_record; - file_ptr environmental_record; - file_ptr section_part; - file_ptr external_part; - file_ptr debug_information_part; - file_ptr data_part; - file_ptr trailer_part; - file_ptr me_record; - } r; -} ieee_w_variable_type; - - - - - -typedef enum ieee_record -{ - ieee_number_start_enum = 0x00, - ieee_number_end_enum=0x7f, - ieee_number_repeat_start_enum = 0x80, - ieee_number_repeat_end_enum = 0x88, - ieee_number_repeat_4_enum = 0x84, - ieee_number_repeat_3_enum = 0x83, - ieee_number_repeat_2_enum = 0x82, - ieee_number_repeat_1_enum = 0x81, - ieee_module_beginning_enum = 0xe0, - ieee_module_end_enum = 0xe1, - ieee_extension_length_1_enum = 0xde, - ieee_extension_length_2_enum = 0xdf, - ieee_section_type_enum = 0xe6, - ieee_section_alignment_enum = 0xe7, - ieee_external_symbol_enum = 0xe8, - ieee_comma = 0x90, - ieee_external_reference_enum = 0xe9, - ieee_set_current_section_enum = 0xe5, - ieee_address_descriptor_enum = 0xec, - ieee_load_constant_bytes_enum = 0xed, - ieee_load_with_relocation_enum = 0xe4, - - ieee_variable_A_enum = 0xc1, - ieee_variable_B_enum = 0xc2, - ieee_variable_C_enum = 0xc3, - ieee_variable_D_enum = 0xc4, - ieee_variable_E_enum = 0xc5, - ieee_variable_F_enum = 0xc6, - ieee_variable_G_enum = 0xc7, - ieee_variable_H_enum = 0xc8, - ieee_variable_I_enum = 0xc9, - ieee_variable_J_enum = 0xca, - ieee_variable_K_enum = 0xcb, - ieee_variable_L_enum = 0xcc, - ieee_variable_M_enum = 0xcd, - ieee_variable_N_enum = 0xce, - ieee_variable_O_enum = 0xcf, - ieee_variable_P_enum = 0xd0, - ieee_variable_Q_enum = 0xd1, - ieee_variable_R_enum = 0xd2, - ieee_variable_S_enum = 0xd3, - ieee_variable_T_enum = 0xd4, - ieee_variable_U_enum = 0xd5, - ieee_variable_V_enum = 0xd6, - ieee_variable_W_enum = 0xd7, - ieee_variable_X_enum = 0xd8, - ieee_variable_Y_enum = 0xd9, - ieee_variable_Z_enum = 0xda, - ieee_function_plus_enum = 0xa5, - ieee_function_minus_enum = 0xa6, - ieee_function_signed_open_b_enum = 0xba, - ieee_function_signed_close_b_enum = 0xbb, - - ieee_function_unsigned_open_b_enum = 0xbc, - ieee_function_unsigned_close_b_enum = 0xbd, - - ieee_function_either_open_b_enum = 0xbe, - ieee_function_either_close_b_enum = 0xbf, - ieee_record_seperator_enum = 0xdb, - - ieee_e2_first_byte_enum = 0xe2, - ieee_section_size_enum = 0xe2d3, - ieee_physical_region_size_enum = 0xe2c1, - ieee_region_base_address_enum = 0xe2c2, - ieee_mau_size_enum = 0xe2c6, - ieee_m_value_enum = 0xe2cd, - ieee_section_base_address_enum = 0xe2cc, - ieee_asn_record_enum = 0xe2ce, - ieee_section_offset_enum = 0xe2d2, - ieee_value_starting_address_enum = 0xe2c7, - ieee_assign_value_to_variable_enum = 0xe2d7, - ieee_set_current_pc_enum = 0xe2d0, - ieee_value_record_enum = 0xe2c9, - ieee_nn_record = 0xf0, - ieee_at_record_enum = 0xf1, - ieee_ty_record_enum = 0xf2, - ieee_attribute_record_enum = 0xf1c9, - ieee_atn_record_enum = 0xf1ce, - ieee_external_reference_info_record_enum = 0xf1d8, - ieee_weak_external_reference_enum= 0xf4, - ieee_repeat_data_enum = 0xf7, - ieee_bb_record_enum = 0xf8, - ieee_be_record_enum = 0xf9 -} ieee_record_enum_type; - - -typedef struct ieee_section { - unsigned int section_index; - unsigned int section_type; - char *section_name; - unsigned int parent_section_index; - unsigned int sibling_section_index; - unsigned int context_index; -} ieee_section_type; -#define IEEE_REFERENCE_BASE 11 -#define IEEE_PUBLIC_BASE 32 -#define IEEE_SECTION_NUMBER_BASE 1 - diff --git a/contrib/gdb/include/libiberty.h b/contrib/gdb/include/libiberty.h deleted file mode 100644 index dc083c8fe38a4..0000000000000 --- a/contrib/gdb/include/libiberty.h +++ /dev/null @@ -1,133 +0,0 @@ -/* Function declarations for libiberty. - Written by Cygnus Support, 1994. - - The libiberty library provides a number of functions which are - missing on some operating systems. We do not declare those here, - to avoid conflicts with the system header files on operating - systems that do support those functions. In this file we only - declare those functions which are specific to libiberty. */ - -#ifndef LIBIBERTY_H -#define LIBIBERTY_H - -#include "ansidecl.h" - -/* Build an argument vector from a string. Allocates memory using - malloc. Use freeargv to free the vector. */ - -extern char **buildargv PARAMS ((char *)); - -/* Free a vector returned by buildargv. */ - -extern void freeargv PARAMS ((char **)); - -/* Return the last component of a path name. */ - -extern char *basename (); - -/* Concatenate an arbitrary number of strings, up to (char *) NULL. - Allocates memory using xmalloc. */ - -extern char *concat PARAMS ((const char *, ...)); - -/* Check whether two file descriptors refer to the same file. */ - -extern int fdmatch PARAMS ((int fd1, int fd2)); - -/* Get the amount of time the process has run, in microseconds. */ - -extern long get_run_time PARAMS ((void)); - -/* Allocate memory filled with spaces. Allocates using malloc. */ - -extern const char *spaces PARAMS ((int count)); - -/* Return the maximum error number for which strerror will return a - string. */ - -extern int errno_max PARAMS ((void)); - -/* Return the name of an errno value (e.g., strerrno (EINVAL) returns - "EINVAL"). */ - -extern const char *strerrno PARAMS ((int)); - -/* Given the name of an errno value, return the value. */ - -extern int strtoerrno PARAMS ((const char *)); - -/* ANSI's strerror(), but more robust. */ - -extern char *xstrerror PARAMS ((int)); - -/* Return the maximum signal number for which strsignal will return a - string. */ - -extern int signo_max PARAMS ((void)); - -/* Return a signal message string for a signal number - (e.g., strsignal (SIGHUP) returns something like "Hangup"). */ -/* This is commented out as it can conflict with one in system headers. - We still document its existence though. */ - -/*extern const char *strsignal PARAMS ((int));*/ - -/* Return the name of a signal number (e.g., strsigno (SIGHUP) returns - "SIGHUP"). */ - -extern const char *strsigno PARAMS ((int)); - -/* Given the name of a signal, return its number. */ - -extern int strtosigno PARAMS ((const char *)); - -/* Register a function to be run by xexit. Returns 0 on success. */ - -extern int xatexit PARAMS ((void (*fn) (void))); - -/* Exit, calling all the functions registered with xatexit. */ - -#ifndef __GNUC__ -extern void xexit PARAMS ((int status)); -#else -typedef void libiberty_voidfn PARAMS ((int status)); -__volatile__ libiberty_voidfn xexit; -#endif - -/* Set the program name used by xmalloc. */ - -extern void xmalloc_set_program_name PARAMS ((const char *)); - -/* Allocate memory without fail. If malloc fails, this will print a - message to stderr (using the name set by xmalloc_set_program_name, - if any) and then call xexit. - - FIXME: We do not declare the parameter type (size_t) in order to - avoid conflicts with other declarations of xmalloc that exist in - programs which use libiberty. */ - -extern PTR xmalloc (); - -/* Reallocate memory without fail. This works like xmalloc. - - FIXME: We do not declare the parameter types for the same reason as - xmalloc. */ - -extern PTR xrealloc (); - -/* Copy a string into a memory buffer without fail. */ - -extern char *xstrdup PARAMS ((const char *)); - -/* hex character manipulation routines */ - -#define _hex_array_size 256 -#define _hex_bad 99 -extern char _hex_value[_hex_array_size]; -extern void hex_init PARAMS ((void)); -#define hex_p(c) (hex_value (c) != _hex_bad) -/* If you change this, note well: Some code relies on side effects in - the argument being performed exactly once. */ -#define hex_value(c) (_hex_value[(unsigned char) (c)]) - -#endif /* ! defined (LIBIBERTY_H) */ diff --git a/contrib/gdb/include/mpw/ChangeLog b/contrib/gdb/include/mpw/ChangeLog deleted file mode 100644 index 8dbad87eab478..0000000000000 --- a/contrib/gdb/include/mpw/ChangeLog +++ /dev/null @@ -1,61 +0,0 @@ -Tue Feb 27 12:23:04 1996 Raymond Jou <rjou@mexican.cygnus.com> - - * mpw.h (HAVE_VPRINTF): Add and define to have the value 1. - -Fri Dec 29 14:40:46 1995 Stan Shebs <shebs@andros.cygnus.com> - - * mpw.h (HAVE_STDLIB_H, etc): Define to have the value 1. - (HAVE_FCNTL_H): Define. - -Mon Dec 11 15:39:06 1995 Stan Shebs <shebs@andros.cygnus.com> - - * mpw.h (open, access): Define as mpw_open and mpw_access. - -Thu Nov 9 15:38:37 1995 Stan Shebs <shebs@andros.cygnus.com> - - * mpw.h: Include unix.h if USE_MW_HEADERS, otherwise include - various original MPW include files (ioctl.h, etc). - (EIO): Define if not defined. - * sys/ioctl.h: Remove, not needed. - -Wed Oct 25 12:30:44 1995 Stan Shebs <shebs@andros.cygnus.com> - - * mpw.h: Don't include errno.h or ioctl.h. - (ENOENT, EACCES, ENOSYS): Define if not defined. - (fdopen): Declare if __STDC__. - (R_OK, W_OK, X_OK): Define if not defined. - -Tue Sep 26 14:57:21 1995 Stan Shebs <shebs@andros.cygnus.com> - - * mpw.h: New file, universally useful MPW host definitions. - Many of these used to live in bfd/hosts/mpw.h. - * grp.h: Remove RCS comment. - * sys/ioctl.h: Add a comment line. - -Wed Dec 14 13:12:14 1994 Stan Shebs <shebs@andros.cygnus.com> - - * spin.h: New file, cursor spinning for progress. - -Thu Jun 30 15:32:07 1994 Stan Shebs (shebs@andros.cygnus.com) - - * fcntl.h (open): Allow optional third arg. - -Thu Apr 14 12:54:51 1994 Stan Shebs (shebs@andros.cygnus.com) - - * dir.h, dirent.h, fcntl.h, grp.h, pwd.h, stat.h: New files. - * sys/ioctl.h: New file. - -Mon Feb 21 09:44:45 1994 Stan Shebs (shebs@andros.cygnus.com) - - * sys/stat.h (struct stat): New field st_rsize. - (S_IFMT, etc): Use different bit positions. - (fstat): Add parameter names to prototype. - -Mon Jan 31 19:30:16 1994 Stan Shebs (shebs@andros.cygnus.com) - - * README: New file. - * utime.h, varargs.h: New files, simulated Posix. - * sys/{file,param,resource,stat,time,types}.h: New files, more - simulated Posix. - - diff --git a/contrib/gdb/include/mpw/README b/contrib/gdb/include/mpw/README deleted file mode 100644 index 10e92de79f68a..0000000000000 --- a/contrib/gdb/include/mpw/README +++ /dev/null @@ -1 +0,0 @@ -This is a collection of include files that help imitate Posix in MPW. diff --git a/contrib/gdb/include/mpw/dir.h b/contrib/gdb/include/mpw/dir.h deleted file mode 100644 index e6ccd2d592279..0000000000000 --- a/contrib/gdb/include/mpw/dir.h +++ /dev/null @@ -1,23 +0,0 @@ -/* The <dir.h> header gives the layout of a directory. */ - -#pragma once - -#ifndef _DIR_H -#define _DIR_H - -#ifndef _TYPES_H /* not quite right */ -#include <sys/types.h> -#endif - -#define DIRBLKSIZ 512 /* size of directory block */ - -#ifndef DIRSIZ -#define DIRSIZ 14 -#endif - -struct direct { - ino_t d_ino; - char d_name[DIRSIZ]; -}; - -#endif /* _DIR_H */ diff --git a/contrib/gdb/include/mpw/dirent.h b/contrib/gdb/include/mpw/dirent.h deleted file mode 100644 index 38000b2c5f36c..0000000000000 --- a/contrib/gdb/include/mpw/dirent.h +++ /dev/null @@ -1,31 +0,0 @@ -#ifndef __dirent_h -#define __dirent_h - -#include "sys/dir.h" - -struct dirent { - long d_ino; /* inode number of entry */ - off_t d_off; /* offset of disk directory entry */ - unsigned short d_reclen; /* length of this record */ - char d_name[1]; /* name of file */ -}; - -/* -#define DIRENTBASESIZE \ - (((struct dirent *) 0)->d_name - (char *) 0) -#define DIRENTSIZE(namelen) \ - ((DIRENTBASESIZE + (namelen) + NBPW) & ~(NBPW - 1)) -*/ - -/* from Mips posix/dirent.h */ - -/* -#undef rewinddir -*/ - -extern DIR *opendir(); -extern struct dirent *readdir(); -extern void rewinddir(); -extern int closedir(); - -#endif /* ! __dirent_h */ diff --git a/contrib/gdb/include/mpw/fcntl.h b/contrib/gdb/include/mpw/fcntl.h deleted file mode 100644 index 30999b4b17df4..0000000000000 --- a/contrib/gdb/include/mpw/fcntl.h +++ /dev/null @@ -1,124 +0,0 @@ -/* - * FCntl.h -- faccess(), fcntl(), and open() mode flags - * - * Portions copyright American Telephone & Telegraph - * Used with permission, Apple Computer Inc. (1985,1988,1990,1992) - * All rights reserved. - */ - -#ifndef __FCNTL__ -#define __FCNTL__ - -#ifndef __TYPES__ -#include <Types.h> -#endif - -/* - * For use by lseek(): - */ - -#ifndef __STDIO__ /* these defns exactly paralled in StdIO.h for fseek() */ -#define SEEK_CUR 1 -#define SEEK_END 2 -#define SEEK_SET 0 -#endif - -/* - * faccess() commands; for general use - */ - /* 'd' => "directory" ops */ -#define F_DELETE (('d'<<8)|0x01) -#define F_RENAME (('d'<<8)|0x02) - -/* - * more faccess() commands; for use only by MPW tools - */ - -#define F_OPEN (('d'<<8)|0x00) /* reserved for operating system use */ - /* 'e' => "editor" ops */ -#define F_GTABINFO (('e'<<8)|0x00) /* get tab offset for file */ -#define F_STABINFO (('e'<<8)|0x01) /* set " " " " */ -#define F_GFONTINFO (('e'<<8)|0x02) /* get font number and size for file */ -#define F_SFONTINFO (('e'<<8)|0x03) /* set " " " " " " */ -#define F_GPRINTREC (('e'<<8)|0x04) /* get print record for file */ -#define F_SPRINTREC (('e'<<8)|0x05) /* set " " " " */ -#define F_GSELINFO (('e'<<8)|0x06) /* get selection information for file */ -#define F_SSELINFO (('e'<<8)|0x07) /* set " " " " */ -#define F_GWININFO (('e'<<8)|0x08) /* get current window position */ -#define F_SWININFO (('e'<<8)|0x09) /* set " " " */ -#define F_GSCROLLINFO (('e'<<8)|0x0A) /* get scroll information */ -#define F_SSCROLLINFO (('e'<<8)|0x0B) /* set " " */ -#define F_GMARKER (('e'<<8)|0x0D) /* Get Marker */ -#define F_SMARKER (('e'<<8)|0x0C) /* Set " */ -#define F_GSAVEONCLOSE (('e'<<8)|0x0F) /* Get Save on close */ -#define F_SSAVEONCLOSE (('e'<<8)|0x0E) /* Set " " " */ - -/* - * argument structures used by various faccess() commands - */ - -struct MarkElement { - int start; /* start position of mark */ - int end; /* end position */ - unsigned char charCount; /* number of chars in mark name */ - char name[64]; /* mark name */ -} ; /* note: marker names may be up to 64 characters long */ - -#ifndef __cplusplus -typedef struct MarkElement MarkElement; -#endif - -struct SelectionRecord { - long startingPos; - long endingPos; - long displayTop; -}; - -#ifndef __cplusplus -typedef struct SelectionRecord SelectionRecord; -#endif - - -/* - * Mode values accessible to open() - */ -#define O_RDONLY 0 /* Bits 0 and 1 are used internally */ -#define O_WRONLY 1 /* Values 0..2 are historical */ -#define O_RDWR 2 /* NOTE: it goes 0, 1, 2, *!* 8, 16, 32, ... */ -#define O_APPEND (1<< 3) /* append (writes guaranteed at the end) */ -#define O_RSRC (1<< 4) /* Open the resource fork */ -#define O_ALIAS (1<< 5) /* Open alias file */ -#define O_CREAT (1<< 8) /* Open with file create */ -#define O_TRUNC (1<< 9) /* Open with truncation */ -#define O_EXCL (1<<10) /* w/ O_CREAT: Exclusive "create-only" */ -#define O_BINARY (1<<11) /* Open as a binary stream */ -#define O_NRESOLVE (1<<14) /* Don't resolve any aliases */ - -#ifdef __cplusplus -extern "C" { -#endif - -/* - * function prototypes - */ -int close(int); -int creat(const char*); -int dup(int filedes); /* OBSOLETE: fcntl(filedes, F_DUPFD, 0) is preferred */ -int faccess(char*, unsigned int, long*); -int fcntl(int, unsigned int, int); -long lseek(int, long, int); -int open(const char*, int, ...); -int read(int, char*, unsigned); -int unlink(char*); -int write(int, const char*, unsigned); - -#ifdef __cplusplus -} -#endif - -/* - * fcntl() commands - */ -#define F_DUPFD 0 /* Duplicate files (file descriptor) */ - -#endif __FCNTL__ diff --git a/contrib/gdb/include/mpw/grp.h b/contrib/gdb/include/mpw/grp.h deleted file mode 100644 index faf2c6a6be9b8..0000000000000 --- a/contrib/gdb/include/mpw/grp.h +++ /dev/null @@ -1,10 +0,0 @@ -#pragma once - -#include "sys/types.h" - -struct group { - char *gr_name; - gid_t gr_gid; - char *gr_passwd; - char **gr_mem; -}; diff --git a/contrib/gdb/include/mpw/mpw.h b/contrib/gdb/include/mpw/mpw.h deleted file mode 100644 index 58702e725ff83..0000000000000 --- a/contrib/gdb/include/mpw/mpw.h +++ /dev/null @@ -1,130 +0,0 @@ -/* Mac MPW host-specific definitions. */ - -#ifndef __INCLUDE_MPW_H -#define __INCLUDE_MPW_H - -#ifndef MPW -#define MPW -#endif - -/* MPW C is basically ANSI, but doesn't actually enable __STDC__, - nor does it allow __STDC__ to be #defined. */ - -#ifndef ALMOST_STDC -#define ALMOST_STDC -#endif - -#include <stdio.h> -#include <ctype.h> -#include <errno.h> - -#define HAVE_TIME_T_IN_TIME_H 1 - -#define HAVE_STDLIB_H 1 - -#define HAVE_ERRNO_H 1 - -#define HAVE_STDDEF_H 1 - -#define HAVE_STRING_H 1 - -#define HAVE_STDARG_H 1 - -#define HAVE_VPRINTF 1 - -#ifdef USE_MW_HEADERS - -#include <unix.h> - -#else - -#include <fcntl.h> -#include <ioctl.h> -#include <sys/stat.h> - -#define HAVE_FCNTL_H 1 - -#ifndef O_ACCMODE -#define O_ACCMODE (O_RDONLY | O_WRONLY | O_RDWR) -#endif - -#ifndef fileno -#define fileno(fp) ((fp)->_file) -#endif - -/* stdio.h does not define this if __STDC__, so define here. */ - -#ifdef __STDC__ -FILE *fdopen(int fildes, const char *mode); -#endif - -#endif /* USE_MW_HEADERS */ - -/* Add ersatz definitions, for systems that lack them. */ - -#ifndef EIO -#define EIO 96 -#endif -#ifndef ENOENT -#define ENOENT 97 -#endif -#ifndef EACCES -#define EACCES 98 -#endif -#ifndef ENOSYS -#define ENOSYS 99 -#endif - -#ifndef R_OK -#define R_OK 4 -#define W_OK 2 -#define X_OK 1 -#endif - -/* Binary files have different characteristics; for instance, no cr/nl - translation. */ - -#define USE_BINARY_FOPEN - -#include <spin.h> - -#ifdef MPW_C -#undef __PTR_TO_INT -#define __PTR_TO_INT(P) ((int)(P)) -#undef __INT_TO_PTR -#define __INT_TO_PTR(P) ((char *)(P)) -#endif /* MPW_C */ - -#define NO_FCNTL - -int fstat (); - -FILE *mpw_fopen (); -int mpw_fseek (); -int mpw_fread (); -int mpw_fwrite (); -int mpw_access (); -int mpw_open (); -int mpw_creat (); -void mpw_abort (void); - -/* Map these standard functions to improved versions in libiberty. */ - -#define fopen mpw_fopen -#define fseek mpw_fseek -#define fread mpw_fread -#define fwrite mpw_fwrite -#define open mpw_open -#define access mpw_access -#define creat mpw_creat -#define abort mpw_abort - -#define POSIX_UTIME - -#define LOSING_TOTALLY - -/* Define this so that files will be closed before being unlinked. */ - -#define CLOSE_BEFORE_UNLINK - -#endif /* __INCLUDE_MPW_H */ diff --git a/contrib/gdb/include/mpw/pwd.h b/contrib/gdb/include/mpw/pwd.h deleted file mode 100644 index 2d4fb70401aa3..0000000000000 --- a/contrib/gdb/include/mpw/pwd.h +++ /dev/null @@ -1,15 +0,0 @@ -#ifndef __pwd_h -#define __pwd_h - -#include <sys/types.h> - -struct passwd { - char *pw_name; - uid_t pw_uid; - gid_t pw_gid; - char *pw_dir; - char *pw_shell; - char *pw_passwd; -}; - -#endif /* ! __pwd_h */ diff --git a/contrib/gdb/include/mpw/spin.h b/contrib/gdb/include/mpw/spin.h deleted file mode 100644 index 867d14502c00c..0000000000000 --- a/contrib/gdb/include/mpw/spin.h +++ /dev/null @@ -1,64 +0,0 @@ -/* Progress macros that use SpinCursor in MPW. - Copyright (C) 1994 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 2 of the License, 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ - -#ifndef _SPIN_H -#define _SPIN_H - -/* For MPW, progress macros just need to "spin the cursor" frequently, - preferably several times per second on a 68K Mac. */ - -/* In order to determine if we're meeting the goal, define this macro - and information about frequency of spinning will be collected and - displayed. */ - -#define SPIN_MEASUREMENT - -#include <CursorCtl.h> - -/* Programs use this macro to indicate the start of a lengthy - activity. STR identifies the particular activity, while N - indicates the expected duration, in unspecified units. If N is - zero, then the expected time to completion is unknown. */ - -#undef START_PROGRESS -#define START_PROGRESS(STR,N) mpw_start_progress (STR, N, __FILE__, __LINE__); - -/* Programs use this macro to indicate that progress has been made on a - lengthy activity. */ - -#undef PROGRESS -#ifdef SPIN_MEASUREMENT -#define PROGRESS(X) mpw_progress_measured (X, __FILE__, __LINE__); -#else -#define PROGRESS(X) mpw_progress (X); -#endif - -/* Programs use this macro to indicate the end of a lengthy activity. - STR must match a STR passed to START_PROGRESS previously. */ - -#undef END_PROGRESS -#define END_PROGRESS(STR) mpw_end_progress (STR, __FILE__, __LINE__); - -extern void mpw_start_progress (char *, int, char *, int); - -extern void mpw_progress (int); - -extern void mpw_progress_measured (int, char *, int); - -extern void mpw_end_progress (char *, char *, int); - -#endif /* _SPIN_H */ diff --git a/contrib/gdb/include/mpw/stat.h b/contrib/gdb/include/mpw/stat.h deleted file mode 100644 index 057b8d531139c..0000000000000 --- a/contrib/gdb/include/mpw/stat.h +++ /dev/null @@ -1,75 +0,0 @@ -/* The <sys/stat.h> header defines a struct that is used in the stat() and - * fstat functions. The information in this struct comes from the i-node of - * some file. These calls are the only approved way to inspect i-nodes. - */ - -#ifndef _STAT_H -#define _STAT_H - -#ifndef _TYPES_H /* not quite right */ -#include <sys/types.h> -#endif - -struct stat { - dev_t st_dev; /* major/minor device number */ - ino_t st_ino; /* i-node number */ - mode_t st_mode; /* file mode, protection bits, etc. */ - short int st_nlink; /* # links; TEMPORARY HACK: should be nlink_t*/ - uid_t st_uid; /* uid of the file's owner */ - short int st_gid; /* gid; TEMPORARY HACK: should be gid_t */ - dev_t st_rdev; - off_t st_size; /* file size */ - time_t st_atime; /* time of last access */ - time_t st_mtime; /* time of last data modification */ - time_t st_ctime; /* time of last file status change */ -}; - -/* Traditional mask definitions for st_mode. */ -#define S_IFMT 0170000 /* type of file */ -#define S_IFREG 0100000 /* regular */ -#define S_IFBLK 0060000 /* block special */ -#define S_IFDIR 0040000 /* directory */ -#define S_IFCHR 0020000 /* character special */ -#define S_IFIFO 0010000 /* this is a FIFO */ -#define S_ISUID 0004000 /* set user id on execution */ -#define S_ISGID 0002000 /* set group id on execution */ - /* next is reserved for future use */ -#define S_ISVTX 01000 /* save swapped text even after use */ - -/* POSIX masks for st_mode. */ -#define S_IRWXU 00700 /* owner: rwx------ */ -#define S_IRUSR 00400 /* owner: r-------- */ -#define S_IWUSR 00200 /* owner: -w------- */ -#define S_IXUSR 00100 /* owner: --x------ */ - -#define S_IRWXG 00070 /* group: ---rwx--- */ -#define S_IRGRP 00040 /* group: ---r----- */ -#define S_IWGRP 00020 /* group: ----w---- */ -#define S_IXGRP 00010 /* group: -----x--- */ - -#define S_IRWXO 00007 /* others: ------rwx */ -#define S_IROTH 00004 /* others: ------r-- */ -#define S_IWOTH 00002 /* others: -------w- */ -#define S_IXOTH 00001 /* others: --------x */ - -/* The following macros test st_mode (from POSIX Sec. 5.6.1.1. */ -#define S_ISREG(m) ((m & S_IFMT) == S_IFREG) /* is a reg file */ -#define S_ISDIR(m) ((m & S_IFMT) == S_IFDIR) /* is a directory */ -#define S_ISCHR(m) ((m & S_IFMT) == S_IFCHR) /* is a char spec */ -#define S_ISBLK(m) ((m & S_IFMT) == S_IFBLK) /* is a block spec */ -#define S_ISFIFO(m) ((m & S_IFMT) == S_IFIFO) /* is a pipe/FIFO */ - - -/* Function Prototypes. */ -#ifndef _ANSI_H -#include <ansi.h> -#endif - -_PROTOTYPE( int chmod, (const char *_path, int _mode) ); -_PROTOTYPE( int fstat, (int _fildes, struct stat *_buf) ); -_PROTOTYPE( int mkdir, (const char *_path, int _mode) ); -_PROTOTYPE( int mkfifo, (const char *_path, int _mode) ); -_PROTOTYPE( int stat , (const char *_path, struct stat *_buf) ); -_PROTOTYPE( mode_t umask, (int _cmask) ); - -#endif /* _STAT_H */ diff --git a/contrib/gdb/include/mpw/sys/file.h b/contrib/gdb/include/mpw/sys/file.h deleted file mode 100644 index 40a8c178f10d9..0000000000000 --- a/contrib/gdb/include/mpw/sys/file.h +++ /dev/null @@ -1 +0,0 @@ -/* empty */ diff --git a/contrib/gdb/include/mpw/sys/param.h b/contrib/gdb/include/mpw/sys/param.h deleted file mode 100644 index 40a8c178f10d9..0000000000000 --- a/contrib/gdb/include/mpw/sys/param.h +++ /dev/null @@ -1 +0,0 @@ -/* empty */ diff --git a/contrib/gdb/include/mpw/sys/resource.h b/contrib/gdb/include/mpw/sys/resource.h deleted file mode 100644 index d39439d61d52e..0000000000000 --- a/contrib/gdb/include/mpw/sys/resource.h +++ /dev/null @@ -1,9 +0,0 @@ -#ifndef __SYS_RESOURCE_H__ -#define __SYS_RESOURCE_H__ - -struct rusage { - struct timeval ru_utime; - struct timeval ru_stime; -}; - -#endif /* __SYS_RESOURCE_H__ */ diff --git a/contrib/gdb/include/mpw/sys/stat.h b/contrib/gdb/include/mpw/sys/stat.h deleted file mode 100644 index b65c72e10c6a6..0000000000000 --- a/contrib/gdb/include/mpw/sys/stat.h +++ /dev/null @@ -1,44 +0,0 @@ -/* Imitation sys/stat.h. */ - -#ifndef __SYS_STAT_H__ -#define __SYS_STAT_H__ - -#include <sys/types.h> -#include <time.h> - -struct stat { - dev_t st_dev; - ino_t st_ino; - mode_t st_mode; - short st_nlink; - uid_t st_uid; - gid_t st_gid; - dev_t st_rdev; - off_t st_size; - off_t st_rsize; - time_t st_atime; - int st_spare1; - time_t st_mtime; - int st_spare2; - time_t st_ctime; - int st_spare3; - long st_blksize; - long st_blocks; - long st_spare4[2]; -}; - -#define S_IFMT 0170000L -#define S_IFDIR 0040000L -#define S_IFREG 0100000L -#define S_IREAD 0400 -#define S_IWRITE 0200 -#define S_IEXEC 0100 - -#define S_IFIFO 010000 /* FIFO special */ -#define S_IFCHR 020000 /* character special */ -#define S_IFBLK 030000 /* block special */ - -int stat (char *path, struct stat *buf); -int fstat (int fd, struct stat *buf); - -#endif /* __SYS_STAT_H___ */ diff --git a/contrib/gdb/include/mpw/sys/time.h b/contrib/gdb/include/mpw/sys/time.h deleted file mode 100644 index f9e485232a219..0000000000000 --- a/contrib/gdb/include/mpw/sys/time.h +++ /dev/null @@ -1,13 +0,0 @@ -/* Imitation sys/time.h. */ - -#ifndef __SYS_TIME_H__ -#define __SYS_TIME_H__ - -#include <time.h> - -struct timeval { - long tv_sec; - long tv_usec; -}; - -#endif /* __SYS_TIME_H__ */ diff --git a/contrib/gdb/include/mpw/sys/types.h b/contrib/gdb/include/mpw/sys/types.h deleted file mode 100644 index d7d9c9f44ba03..0000000000000 --- a/contrib/gdb/include/mpw/sys/types.h +++ /dev/null @@ -1,15 +0,0 @@ -/* Imitation sys/types.h. */ - -#ifndef __SYS_TYPES_H__ -#define __SYS_TYPES_H__ - -#include <Types.h> - -typedef short dev_t; -typedef short ino_t; -typedef unsigned short mode_t; -typedef unsigned short uid_t; -typedef unsigned short gid_t; -typedef long off_t; - -#endif /* __SYS_TYPES_H__ */ diff --git a/contrib/gdb/include/mpw/utime.h b/contrib/gdb/include/mpw/utime.h deleted file mode 100644 index e8bf66f2ba5c9..0000000000000 --- a/contrib/gdb/include/mpw/utime.h +++ /dev/null @@ -1,7 +0,0 @@ - -struct utimbuf { - time_t actime; - time_t modtime; -}; - -int utime (char *, struct utimbuf *); diff --git a/contrib/gdb/include/mpw/varargs.h b/contrib/gdb/include/mpw/varargs.h deleted file mode 100644 index acb9e4504a2df..0000000000000 --- a/contrib/gdb/include/mpw/varargs.h +++ /dev/null @@ -1,9 +0,0 @@ -/* varargs.h. */ -#ifndef __va_list__ -#define __va_list__ -typedef char *va_list; -#endif -#define va_dcl int va_alist; -#define va_start(list) list = (char *) &va_alist -#define va_end(list) -#define va_arg(list,mode) ((mode *)(list += sizeof(mode)))[-1] diff --git a/contrib/gdb/include/nlm/ChangeLog b/contrib/gdb/include/nlm/ChangeLog deleted file mode 100644 index d9ea3d09e0aac..0000000000000 --- a/contrib/gdb/include/nlm/ChangeLog +++ /dev/null @@ -1,83 +0,0 @@ -Fri May 6 13:31:04 1994 Ian Lance Taylor (ian@tweedledumb.cygnus.com) - - * external.h (nlmNAME(External_Custom_Header)): Add length, - dataOffset, and dataStamp field. - (nlmNAME(External_Cygnus_Ext_Header)): Remove. - * internal.h (Nlm_Internal_Custom_Header): Add hdrLength, - dataOffset, dataStamp and hdr fields. - -Fri Apr 22 11:12:39 1994 Ian Lance Taylor (ian@tweedledumb.cygnus.com) - - * external.h (struct nlmNAME(external_cygnus_ext_header)): Rename - from nlmNAME(external_cygnus_section_header). Change stamp field - to 8 bytes. Add bytes field. - * internal.h (nlm_internal_cygnus_ext_header): Rename from - nlm_internal_cygnus_section_header. Change stamp field to 8 - bytes. - -Thu Apr 21 11:57:09 1994 Ian Lance Taylor (ian@tweedledumb.cygnus.com) - - * internal.h (struct nlm_internal_cygnus_section_header): Define. - * external.h (struct nlmNAME(external_cygnus_section_header): - Define. - -Wed Apr 20 14:27:43 1994 Ian Lance Taylor (ian@tweedledumb.cygnus.com) - - * internal.h (struct nlm_internal_custom_header): Remove - debugRecOffset and debugRecLength fields. Add data field. - * external.h (struct nlmNAME(external_custom_header)): Remove - debugRecOffset and debugRecLength fields. - -Mon Feb 7 08:28:40 1994 Jim Kingdon (kingdon@lioth.cygnus.com) - - * internal.h: Change HOST_64_BIT to BFD_HOST_64_BIT. - -Thu Dec 2 14:14:48 1993 Ian Lance Taylor (ian@tweedledumb.cygnus.com) - - * alpha-ext.h: New file describing formats of information in Alpha - NetWare files. - * common.h: Define some non-external Alpha information. - -Wed Nov 17 17:38:58 1993 Sean Eric Fagan (sef@cygnus.com) - - * external.h: Don't define external_fixed_header here. - * i386-ext.h, sparc32-ext.h: New header files to define - external_fixed_header for particular CPU's. - -Wed Oct 27 11:45:56 1993 Ian Lance Taylor (ian@tweedledumb.cygnus.com) - - * internal.h (Nlm_Internal_Extended_Header): Added fields - sharedDebugRecordOffset and sharedDebugRecordCount. - * external.h (NlmNAME(External_Extended_Header)): Likewise. - - * common.h (NLM_SIGNATURE): Do not define (it's different for each - backend). - -Tue Aug 31 13:24:15 1993 Ian Lance Taylor (ian@tweedledumb.cygnus.com) - - * internal.h: Change length fields of type char to type unsigned - char. - -Sat Jul 31 02:12:14 1993 Ian Lance Taylor (ian@tweedledumb.cygnus.com) - - * common.h (NLM_HIBIT, NLM_HEADER_VERSION): Define. - -Thu Jul 22 16:09:47 1993 Fred Fish (fnf@deneb.cygnus.com) - - * common.h (NLM_CAT*, NLM_ARCH_SIZE, NLM_TARGET_LONG_SIZE, - NLM_TARGET_ADDRESS_SIZE, NLM_NAME, NlmNAME, nlmNAME): New - macros. - * external.h (TARGET_LONG_SIZE, TARGET_ADDRESS_SIZE): Remove - macros, convert usages to NLM_ equivalents. - * external.h: Use nlmNAME and NlmNAME macros to derive both - 32 and 64 bit versions. - -Mon Jul 19 22:12:40 1993 Fred Fish (fnf@deneb.cygnus.com) - - * (common.h, external.h, internal.h): New files for NLM/NetWare - support. - - -Local Variables: -version-control: never -End: diff --git a/contrib/gdb/include/nlm/alpha-ext.h b/contrib/gdb/include/nlm/alpha-ext.h deleted file mode 100644 index 37199dd1dc0db..0000000000000 --- a/contrib/gdb/include/nlm/alpha-ext.h +++ /dev/null @@ -1,166 +0,0 @@ -/* Alpha NLM (NetWare Loadable Module) support for BFD. - Copyright (C) 1993 Free Software Foundation, Inc. - By Ian Lance Taylor, Cygnus Support - -This file is part of BFD, the Binary File Descriptor library. - -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 2 of the License, 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ - -/* An Alpha NLM starts with an instance of this structure. */ - -struct nlm32_alpha_external_prefix_header -{ - /* Magic number. Must be NLM32_ALPHA_MAGIC. */ - unsigned char magic[4]; - /* Format descriptor. Current value is 2. */ - unsigned char format[4]; - /* Size of prefix header. */ - unsigned char size[4]; - /* Padding. */ - unsigned char pad1[4]; - /* More fields may be added later, supposedly. */ -}; - -/* The external format of an Alpha NLM reloc. This is the same as an - Alpha ECOFF reloc. */ - -struct nlm32_alpha_external_reloc -{ - unsigned char r_vaddr[8]; - unsigned char r_symndx[4]; - unsigned char r_bits[4]; -}; - -/* Constants to unpack the r_bits field of a reloc. */ - -#define RELOC_BITS0_TYPE_LITTLE 0xff -#define RELOC_BITS0_TYPE_SH_LITTLE 0 - -#define RELOC_BITS1_EXTERN_LITTLE 0x01 - -#define RELOC_BITS1_OFFSET_LITTLE 0x7e -#define RELOC_BITS1_OFFSET_SH_LITTLE 1 - -#define RELOC_BITS1_RESERVED_LITTLE 0x80 -#define RELOC_BITS1_RESERVED_SH_LITTLE 7 -#define RELOC_BITS2_RESERVED_LITTLE 0xff -#define RELOC_BITS2_RESERVED_SH_LEFT_LITTLE 1 -#define RELOC_BITS3_RESERVED_LITTLE 0x03 -#define RELOC_BITS3_RESERVED_SH_LEFT_LITTLE 9 - -#define RELOC_BITS3_SIZE_LITTLE 0xfc -#define RELOC_BITS3_SIZE_SH_LITTLE 2 - -/* The external format of the fixed header. */ - -typedef struct nlm32_alpha_external_fixed_header -{ - - /* The signature field identifies the file as an NLM. It must contain - the signature string, which depends upon the NLM target. */ - - unsigned char signature[24]; - - /* The version of the header. At this time, the highest version number - is 4. */ - - unsigned char version[4]; - - /* The name of the module, which must be a DOS name (1-8 characters followed - by a period and a 1-3 character extension). The first byte is the byte - length of the name and the last byte is a null terminator byte. This - field is fixed length, and any unused bytes should be null bytes. The - value is set by the OUTPUT keyword to NLMLINK. */ - - unsigned char moduleName[14]; - - /* Padding to make it come out correct. */ - - unsigned char pad1[2]; - - /* The byte offset of the code image from the start of the file. */ - - unsigned char codeImageOffset[4]; - - /* The size of the code image, in bytes. */ - - unsigned char codeImageSize[4]; - - /* The byte offset of the data image from the start of the file. */ - - unsigned char dataImageOffset[4]; - - /* The size of the data image, in bytes. */ - - unsigned char dataImageSize[4]; - - /* The size of the uninitialized data region that the loader is to be - allocated at load time. Uninitialized data follows the initialized - data in the NLM address space. */ - - unsigned char uninitializedDataSize[4]; - - /* The byte offset of the custom data from the start of the file. The - custom data is set by the CUSTOM keyword to NLMLINK. It is possible - for this to be EOF if there is no custom data. */ - - unsigned char customDataOffset[4]; - - /* The size of the custom data, in bytes. */ - - unsigned char customDataSize[4]; - - /* The byte offset of the module dependencies from the start of the file. - The module dependencies are determined by the MODULE keyword in - NLMLINK. */ - - unsigned char moduleDependencyOffset[4]; - - /* The number of module dependencies at the moduleDependencyOffset. */ - - unsigned char numberOfModuleDependencies[4]; - - /* The byte offset of the relocation fixup data from the start of the file */ - - unsigned char relocationFixupOffset[4]; - - unsigned char numberOfRelocationFixups[4]; - - unsigned char externalReferencesOffset[4]; - - unsigned char numberOfExternalReferences[4]; - - unsigned char publicsOffset[4]; - - unsigned char numberOfPublics[4]; - - /* The byte offset of the internal debug info from the start of the file. - It is possible for this to be EOF if there is no debug info. */ - - unsigned char debugInfoOffset[4]; - - unsigned char numberOfDebugRecords[4]; - - unsigned char codeStartOffset[4]; - - unsigned char exitProcedureOffset[4]; - - unsigned char checkUnloadProcedureOffset[4]; - - unsigned char moduleType[4]; - - unsigned char flags[4]; - -} Nlm32_alpha_External_Fixed_Header; diff --git a/contrib/gdb/include/nlm/common.h b/contrib/gdb/include/nlm/common.h deleted file mode 100644 index e96550a92f6da..0000000000000 --- a/contrib/gdb/include/nlm/common.h +++ /dev/null @@ -1,124 +0,0 @@ -/* NLM (NetWare Loadable Module) support for BFD. - Copyright (C) 1993 Free Software Foundation, Inc. - - Written by Fred Fish @ Cygnus Support - -This file is part of BFD, the Binary File Descriptor library. - -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 2 of the License, 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ - - -/* This file is part of NLM support for BFD, and contains the portions - that are common to both the internal and external representations. */ - -/* Semi-portable string concatenation in cpp. - The NLM_CAT4 hack is to avoid a problem with some strict ANSI C - preprocessors. The problem is, "32_" or "64_" are not a valid - preprocessing tokens, and we don't want extra underscores (e.g., - "nlm_32_"). The XNLM_CAT2 macro will cause the inner NLM_CAT macros - to be evaluated first, producing still-valid pp-tokens. Then the - final concatenation can be done. (Sigh.) */ - -#ifdef SABER -# define NLM_CAT(a,b) a##b -# define NLM_CAT3(a,b,c) a##b##c -# define NLM_CAT4(a,b,c,d) a##b##c##d -#else -# ifdef __STDC__ -# define NLM_CAT(a,b) a##b -# define NLM_CAT3(a,b,c) a##b##c -# define XNLM_CAT2(a,b) NLM_CAT(a,b) -# define NLM_CAT4(a,b,c,d) XNLM_CAT2(NLM_CAT(a,b),NLM_CAT(c,d)) -# else -# define NLM_CAT(a,b) a/**/b -# define NLM_CAT3(a,b,c) a/**/b/**/c -# define NLM_CAT4(a,b,c,d) a/**/b/**/c/**/d -# endif -#endif - -/* If NLM_ARCH_SIZE is not defined, default to 32. NLM_ARCH_SIZE is - optionally defined by the application. */ - -#ifndef NLM_ARCH_SIZE -# define NLM_ARCH_SIZE 32 -#endif - -#if NLM_ARCH_SIZE == 32 -# define NLM_TARGET_LONG_SIZE 4 -# define NLM_TARGET_ADDRESS_SIZE 4 -# define NLM_NAME(x,y) NLM_CAT4(x,32,_,y) -# define NLM_HIBIT (((bfd_vma) 1) << 31) -#endif -#if NLM_ARCH_SIZE == 64 -# define NLM_TARGET_LONG_SIZE 8 -# define NLM_TARGET_ADDRESS_SIZE 8 -# define NLM_NAME(x,y) NLM_CAT4(x,64,_,y) -# define NLM_HIBIT (((bfd_vma) 1) << 63) -#endif - -#define NlmNAME(X) NLM_NAME(Nlm,X) -#define nlmNAME(X) NLM_NAME(nlm,X) - -/* Give names to things that should not change. */ - -#define NLM_MAX_DESCRIPTION_LENGTH 127 -#define NLM_MAX_SCREEN_NAME_LENGTH 71 -#define NLM_MAX_THREAD_NAME_LENGTH 71 -#define NLM_MAX_COPYRIGHT_MESSAGE_LENGTH 255 -#define NLM_OTHER_DATA_LENGTH 400 /* FIXME */ -#define NLM_OLD_THREAD_NAME_LENGTH 5 -#define NLM_SIGNATURE_SIZE 24 -#define NLM_HEADER_VERSION 4 -#define NLM_MODULE_NAME_SIZE 14 -#define NLM_DEFAULT_STACKSIZE (8 * 1024) - -/* Alpha information. This should probably be in a separate Alpha - header file, but it can't go in alpha-ext.h because some of it is - needed by nlmconv.c. */ - -/* Magic number in Alpha prefix header. */ -#define NLM32_ALPHA_MAGIC (0x83561840) - -/* The r_type field in an Alpha reloc is one of the following values. */ -#define ALPHA_R_IGNORE 0 -#define ALPHA_R_REFLONG 1 -#define ALPHA_R_REFQUAD 2 -#define ALPHA_R_GPREL32 3 -#define ALPHA_R_LITERAL 4 -#define ALPHA_R_LITUSE 5 -#define ALPHA_R_GPDISP 6 -#define ALPHA_R_BRADDR 7 -#define ALPHA_R_HINT 8 -#define ALPHA_R_SREL16 9 -#define ALPHA_R_SREL32 10 -#define ALPHA_R_SREL64 11 -#define ALPHA_R_OP_PUSH 12 -#define ALPHA_R_OP_STORE 13 -#define ALPHA_R_OP_PSUB 14 -#define ALPHA_R_OP_PRSHIFT 15 -#define ALPHA_R_GPVALUE 16 -#define ALPHA_R_NW_RELOC 250 - -/* A local reloc, other than ALPHA_R_GPDISP or ALPHA_R_IGNORE, must be - against one of these symbol indices. */ -#define ALPHA_RELOC_SECTION_TEXT 1 -#define ALPHA_RELOC_SECTION_DATA 3 - -/* An ALPHA_R_NW_RELOC has one of these values in the size field. If - it is SETGP, the r_vaddr field holds the GP value to use. If it is - LITA, the r_vaddr field holds the address of the .lita section and - the r_symndx field holds the size of the .lita section. */ -#define ALPHA_R_NW_RELOC_SETGP 1 -#define ALPHA_R_NW_RELOC_LITA 2 diff --git a/contrib/gdb/include/nlm/external.h b/contrib/gdb/include/nlm/external.h deleted file mode 100644 index f77a5bb3dda07..0000000000000 --- a/contrib/gdb/include/nlm/external.h +++ /dev/null @@ -1,174 +0,0 @@ -/* NLM (NetWare Loadable Module) support for BFD. - Copyright (C) 1993 Free Software Foundation, Inc. - - Written by Fred Fish @ Cygnus Support - -This file is part of BFD, the Binary File Descriptor library. - -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 2 of the License, 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ - - -/* This file is part of NLM support for BFD, and contains the portions - that describe how NLM is represented externally by the BFD library. - I.E. it describes the in-file representation of NLM. It requires - the nlm/common.h file which contains the portions that are common to - both the internal and external representations. - - Note that an NLM header consists of three parts: - - (1) A fixed length header that has specific fields of known length, - at specific offsets in the file. - - (2) A variable length header that has specific fields in a specific - order, but some fields may be variable length. - - (3) A auxiliary header that has various optional fields in no specific - order. There is no way to identify the end of the auxiliary headers - except by finding a header without a recognized 'stamp'. - - The exact format of the fixed length header unfortunately varies - from one NLM target to another, due to padding. Each target - defines the correct external format in a separate header file. - -*/ - -/* NLM Header */ - -/* The version header is one of the optional auxiliary headers and - follows the fixed length and variable length NLM headers. */ - -typedef struct nlmNAME(external_version_header) -{ - - /* The header is recognized by "VeRsIoN#" in the stamp field. */ - char stamp[8]; - - unsigned char majorVersion[NLM_TARGET_LONG_SIZE]; - - unsigned char minorVersion[NLM_TARGET_LONG_SIZE]; - - unsigned char revision[NLM_TARGET_LONG_SIZE]; - - unsigned char year[NLM_TARGET_LONG_SIZE]; - - unsigned char month[NLM_TARGET_LONG_SIZE]; - - unsigned char day[NLM_TARGET_LONG_SIZE]; - -} NlmNAME(External_Version_Header); - - -typedef struct nlmNAME(external_copyright_header) -{ - - /* The header is recognized by "CoPyRiGhT=" in the stamp field. */ - - char stamp[10]; - - unsigned char copyrightMessageLength[1]; - - /* There is a variable length field here called 'copyrightMessage' - that is the length specified by copyrightMessageLength. */ - -} NlmNAME(External_Copyright_Header); - - -typedef struct nlmNAME(external_extended_header) -{ - - /* The header is recognized by "MeSsAgEs" in the stamp field. */ - - char stamp[8]; - - unsigned char languageID[NLM_TARGET_LONG_SIZE]; - - unsigned char messageFileOffset[NLM_TARGET_LONG_SIZE]; - - unsigned char messageFileLength[NLM_TARGET_LONG_SIZE]; - - unsigned char messageCount[NLM_TARGET_LONG_SIZE]; - - unsigned char helpFileOffset[NLM_TARGET_LONG_SIZE]; - - unsigned char helpFileLength[NLM_TARGET_LONG_SIZE]; - - unsigned char RPCDataOffset[NLM_TARGET_LONG_SIZE]; - - unsigned char RPCDataLength[NLM_TARGET_LONG_SIZE]; - - unsigned char sharedCodeOffset[NLM_TARGET_LONG_SIZE]; - - unsigned char sharedCodeLength[NLM_TARGET_LONG_SIZE]; - - unsigned char sharedDataOffset[NLM_TARGET_LONG_SIZE]; - - unsigned char sharedDataLength[NLM_TARGET_LONG_SIZE]; - - unsigned char sharedRelocationFixupOffset[NLM_TARGET_LONG_SIZE]; - - unsigned char sharedRelocationFixupCount[NLM_TARGET_LONG_SIZE]; - - unsigned char sharedExternalReferenceOffset[NLM_TARGET_LONG_SIZE]; - - unsigned char sharedExternalReferenceCount[NLM_TARGET_LONG_SIZE]; - - unsigned char sharedPublicsOffset[NLM_TARGET_LONG_SIZE]; - - unsigned char sharedPublicsCount[NLM_TARGET_LONG_SIZE]; - - unsigned char sharedDebugRecordOffset[NLM_TARGET_LONG_SIZE]; - - unsigned char sharedDebugRecordCount[NLM_TARGET_LONG_SIZE]; - - unsigned char sharedInitializationOffset[NLM_TARGET_ADDRESS_SIZE]; - - unsigned char SharedExitProcedureOffset[NLM_TARGET_ADDRESS_SIZE]; - - unsigned char productID[NLM_TARGET_LONG_SIZE]; - - unsigned char reserved0[NLM_TARGET_LONG_SIZE]; - - unsigned char reserved1[NLM_TARGET_LONG_SIZE]; - - unsigned char reserved2[NLM_TARGET_LONG_SIZE]; - - unsigned char reserved3[NLM_TARGET_LONG_SIZE]; - - unsigned char reserved4[NLM_TARGET_LONG_SIZE]; - - unsigned char reserved5[NLM_TARGET_LONG_SIZE]; - -} NlmNAME(External_Extended_Header); - - -typedef struct nlmNAME(external_custom_header) -{ - - /* The header is recognized by "CuStHeAd" in the stamp field. */ - char stamp[8]; - - /* Length of this header. */ - unsigned char length[NLM_TARGET_LONG_SIZE]; - - /* Offset to data. */ - unsigned char dataOffset[NLM_TARGET_LONG_SIZE]; - - /* Length of data. */ - unsigned char dataLength[NLM_TARGET_LONG_SIZE]; - - /* Stamp for this customer header--we recognize "CyGnUsEx". */ - char dataStamp[8]; - -} NlmNAME(External_Custom_Header); diff --git a/contrib/gdb/include/nlm/i386-ext.h b/contrib/gdb/include/nlm/i386-ext.h deleted file mode 100644 index d33ad2da770a3..0000000000000 --- a/contrib/gdb/include/nlm/i386-ext.h +++ /dev/null @@ -1,116 +0,0 @@ -/* i386 NLM (NetWare Loadable Module) support for BFD. - Copyright (C) 1993 Free Software Foundation, Inc. - -This file is part of BFD, the Binary File Descriptor library. - -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 2 of the License, 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ - -/* The external format of the fixed header. */ - -typedef struct nlm32_i386_external_fixed_header -{ - - /* The signature field identifies the file as an NLM. It must contain - the signature string, which depends upon the NLM target. */ - - unsigned char signature[24]; - - /* The version of the header. At this time, the highest version number - is 4. */ - - unsigned char version[4]; - - /* The name of the module, which must be a DOS name (1-8 characters followed - by a period and a 1-3 character extension). The first byte is the byte - length of the name and the last byte is a null terminator byte. This - field is fixed length, and any unused bytes should be null bytes. The - value is set by the OUTPUT keyword to NLMLINK. */ - - unsigned char moduleName[14]; - - /* The byte offset of the code image from the start of the file. */ - - unsigned char codeImageOffset[4]; - - /* The size of the code image, in bytes. */ - - unsigned char codeImageSize[4]; - - /* The byte offset of the data image from the start of the file. */ - - unsigned char dataImageOffset[4]; - - /* The size of the data image, in bytes. */ - - unsigned char dataImageSize[4]; - - /* The size of the uninitialized data region that the loader is to be - allocated at load time. Uninitialized data follows the initialized - data in the NLM address space. */ - - unsigned char uninitializedDataSize[4]; - - /* The byte offset of the custom data from the start of the file. The - custom data is set by the CUSTOM keyword to NLMLINK. It is possible - for this to be EOF if there is no custom data. */ - - unsigned char customDataOffset[4]; - - /* The size of the custom data, in bytes. */ - - unsigned char customDataSize[4]; - - /* The byte offset of the module dependencies from the start of the file. - The module dependencies are determined by the MODULE keyword in - NLMLINK. */ - - unsigned char moduleDependencyOffset[4]; - - /* The number of module dependencies at the moduleDependencyOffset. */ - - unsigned char numberOfModuleDependencies[4]; - - /* The byte offset of the relocation fixup data from the start of the file */ - - unsigned char relocationFixupOffset[4]; - - unsigned char numberOfRelocationFixups[4]; - - unsigned char externalReferencesOffset[4]; - - unsigned char numberOfExternalReferences[4]; - - unsigned char publicsOffset[4]; - - unsigned char numberOfPublics[4]; - - /* The byte offset of the internal debug info from the start of the file. - It is possible for this to be EOF if there is no debug info. */ - - unsigned char debugInfoOffset[4]; - - unsigned char numberOfDebugRecords[4]; - - unsigned char codeStartOffset[4]; - - unsigned char exitProcedureOffset[4]; - - unsigned char checkUnloadProcedureOffset[4]; - - unsigned char moduleType[4]; - - unsigned char flags[4]; - -} Nlm32_i386_External_Fixed_Header; diff --git a/contrib/gdb/include/nlm/internal.h b/contrib/gdb/include/nlm/internal.h deleted file mode 100644 index dd27dc407f590..0000000000000 --- a/contrib/gdb/include/nlm/internal.h +++ /dev/null @@ -1,309 +0,0 @@ -/* NLM (NetWare Loadable Module) support for BFD. - Copyright (C) 1993 Free Software Foundation, Inc. - - Written by Fred Fish @ Cygnus Support. - -This file is part of BFD, the Binary File Descriptor library. - -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 2 of the License, 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ - - -/* This file is part of NLM support for BFD, and contains the portions - that describe how NLM is represented internally in the BFD library. - I.E. it describes the in-memory representation of NLM. It requires - the nlm/common.h file which contains the portions that are common to - both the internal and external representations. */ - -#if 0 - -/* Types used by various structures, functions, etc. */ - -typedef unsigned long Nlm32_Addr; /* Unsigned program address */ -typedef unsigned long Nlm32_Off; /* Unsigned file offset */ -typedef long Nlm32_Sword; /* Signed large integer */ -typedef unsigned long Nlm32_Word; /* Unsigned large integer */ -typedef unsigned short Nlm32_Half; /* Unsigned medium integer */ -typedef unsigned char Nlm32_Char; /* Unsigned tiny integer */ - -#ifdef BFD_HOST_64_BIT -typedef unsigned BFD_HOST_64_BIT Nlm64_Addr; -typedef unsigned BFD_HOST_64_BIT Nlm64_Off; -typedef BFD_HOST_64_BIT Nlm64_Sxword; -typedef unsigned BFD_HOST_64_BIT Nlm64_Xword; -#endif -typedef long Nlm64_Sword; -typedef unsigned long Nlm64_Word; -typedef unsigned short Nlm64_Half; - -#endif /* 0 */ - -/* This structure contains the internal form of the portion of the NLM - header that is fixed length. */ - -typedef struct nlm_internal_fixed_header -{ - /* The signature field identifies the file as an NLM. It must contain - the signature string, which depends upon the NLM target. */ - - char signature[NLM_SIGNATURE_SIZE]; - - /* The version of the header. At this time, the highest version number - is 4. */ - - long version; - - /* The name of the module, which must be a DOS name (1-8 characters followed - by a period and a 1-3 character extension. The first byte is the byte - length of the name and the last byte is a null terminator byte. This - field is fixed length, and any unused bytes should be null bytes. The - value is set by the OUTPUT keyword to NLMLINK. */ - - char moduleName[NLM_MODULE_NAME_SIZE]; - - /* The byte offset of the code image from the start of the file. */ - - file_ptr codeImageOffset; - - /* The size of the code image, in bytes. */ - - bfd_size_type codeImageSize; - - /* The byte offset of the data image from the start of the file. */ - - file_ptr dataImageOffset; - - /* The size of the data image, in bytes. */ - - bfd_size_type dataImageSize; - - /* The size of the uninitialized data region that the loader is to be - allocated at load time. Uninitialized data follows the initialized - data in the NLM address space. */ - - bfd_size_type uninitializedDataSize; - - /* The byte offset of the custom data from the start of the file. The - custom data is set by the CUSTOM keyword to NLMLINK. */ - - file_ptr customDataOffset; - - /* The size of the custom data, in bytes. */ - - bfd_size_type customDataSize; - - /* The byte offset of the module dependencies from the start of the file. - The module dependencies are determined by the MODULE keyword in - NLMLINK. */ - - file_ptr moduleDependencyOffset; - - /* The number of module dependencies at the moduleDependencyOffset. */ - - long numberOfModuleDependencies; - - /* The byte offset of the relocation fixup data from the start of the file */ - - file_ptr relocationFixupOffset; - long numberOfRelocationFixups; - file_ptr externalReferencesOffset; - long numberOfExternalReferences; - file_ptr publicsOffset; - long numberOfPublics; - file_ptr debugInfoOffset; - long numberOfDebugRecords; - file_ptr codeStartOffset; - file_ptr exitProcedureOffset; - file_ptr checkUnloadProcedureOffset; - long moduleType; - long flags; -} Nlm_Internal_Fixed_Header; - -#define nlm32_internal_fixed_header nlm_internal_fixed_header -#define Nlm32_Internal_Fixed_Header Nlm_Internal_Fixed_Header -#define nlm64_internal_fixed_header nlm_internal_fixed_header -#define Nlm64_Internal_Fixed_Header Nlm_Internal_Fixed_Header - -/* This structure contains the portions of the NLM header that are either - variable in size in the external representation, or else are not at a - fixed offset relative to the start of the NLM header due to preceding - variable sized fields. - - Note that all the fields must exist in the external header, and in - the order used here (the same order is used in the internal form - for consistency, not out of necessity). */ - -typedef struct nlm_internal_variable_header -{ - - /* The descriptionLength field contains the length of the text in - descriptionText, excluding the null terminator. The descriptionText - field contains the NLM description obtained from the DESCRIPTION - keyword in NLMLINK plus the null byte terminator. The descriptionText - can be up to NLM_MAX_DESCRIPTION_LENGTH characters. */ - - unsigned char descriptionLength; - char descriptionText[NLM_MAX_DESCRIPTION_LENGTH + 1]; - - /* The stackSize field contains the size of the stack in bytes, as - specified by the STACK or STACKSIZE keyword in NLMLINK. If no size - is specified, the default is NLM_DEFAULT_STACKSIZE. */ - - long stackSize; - - /* The reserved field is included only for completeness. It should contain - zero. */ - - long reserved; - - /* This field is fixed length, should contain " LONG" (note leading - space), and is unused. */ - - char oldThreadName[NLM_OLD_THREAD_NAME_LENGTH]; - - /* The screenNameLength field contains the length of the actual text stored - in the screenName field, excluding the null byte terminator. The - screenName field contains the screen name as specified by the SCREENNAME - keyword in NLMLINK, and can be up to NLM_MAX_SCREEN_NAME_LENGTH - characters. */ - - unsigned char screenNameLength; - char screenName[NLM_MAX_SCREEN_NAME_LENGTH + 1]; - - /* The threadNameLength field contains the length of the actual text stored - in the threadName field, excluding the null byte terminator. The - threadName field contains the thread name as specified by the THREADNAME - keyword in NLMLINK, and can be up to NLM_MAX_THREAD_NAME_LENGTH - characters. */ - - unsigned char threadNameLength; - char threadName[NLM_MAX_THREAD_NAME_LENGTH + 1]; - -} Nlm_Internal_Variable_Header; - -#define nlm32_internal_variable_header nlm_internal_variable_header -#define Nlm32_Internal_Variable_Header Nlm_Internal_Variable_Header -#define nlm64_internal_variable_header nlm_internal_variable_header -#define Nlm64_Internal_Variable_Header Nlm_Internal_Variable_Header - -/* The version header is one of the optional auxiliary headers and - follows the fixed length and variable length NLM headers. */ - -typedef struct nlm_internal_version_header -{ - /* The header is recognized by "VeRsIoN#" in the stamp field. */ - char stamp[8]; - long majorVersion; - long minorVersion; - long revision; - long year; - long month; - long day; -} Nlm_Internal_Version_Header; - -#define nlm32_internal_version_header nlm_internal_version_header -#define Nlm32_Internal_Version_Header Nlm_Internal_Version_Header -#define nlm64_internal_version_header nlm_internal_version_header -#define Nlm64_Internal_Version_Header Nlm_Internal_Version_Header - -typedef struct nlm_internal_copyright_header -{ - /* The header is recognized by "CoPyRiGhT=" in the stamp field. */ - char stamp[10]; - unsigned char copyrightMessageLength; - char copyrightMessage[NLM_MAX_COPYRIGHT_MESSAGE_LENGTH]; -} Nlm_Internal_Copyright_Header; - -#define nlm32_internal_copyright_header nlm_internal_copyright_header -#define Nlm32_Internal_Copyright_Header Nlm_Internal_Copyright_Header -#define nlm64_internal_copyright_header nlm_internal_copyright_header -#define Nlm64_Internal_Copyright_Header Nlm_Internal_Copyright_Header - -typedef struct nlm_internal_extended_header -{ - /* The header is recognized by "MeSsAgEs" in the stamp field. */ - char stamp[8]; - long languageID; - file_ptr messageFileOffset; - bfd_size_type messageFileLength; - long messageCount; - file_ptr helpFileOffset; - bfd_size_type helpFileLength; - file_ptr RPCDataOffset; - bfd_size_type RPCDataLength; - file_ptr sharedCodeOffset; - bfd_size_type sharedCodeLength; - file_ptr sharedDataOffset; - bfd_size_type sharedDataLength; - file_ptr sharedRelocationFixupOffset; - long sharedRelocationFixupCount; - file_ptr sharedExternalReferenceOffset; - long sharedExternalReferenceCount; - file_ptr sharedPublicsOffset; - long sharedPublicsCount; - file_ptr sharedDebugRecordOffset; - long sharedDebugRecordCount; - bfd_vma SharedInitializationOffset; - bfd_vma SharedExitProcedureOffset; - long productID; - long reserved0; - long reserved1; - long reserved2; - long reserved3; - long reserved4; - long reserved5; -} Nlm_Internal_Extended_Header; - -#define nlm32_internal_extended_header nlm_internal_extended_header -#define Nlm32_Internal_Extended_Header Nlm_Internal_Extended_Header -#define nlm64_internal_extended_header nlm_internal_extended_header -#define Nlm64_Internal_Extended_Header Nlm_Internal_Extended_Header - -/* The format of a custom header as stored internally is different - from the external format. This is how we store a custom header - which we do not recognize. */ - -typedef struct nlm_internal_custom_header -{ - /* The header is recognized by "CuStHeAd" in the stamp field. */ - char stamp[8]; - bfd_size_type hdrLength; - file_ptr dataOffset; - bfd_size_type dataLength; - char dataStamp[8]; - PTR hdr; -} Nlm_Internal_Custom_Header; - -#define nlm32_internal_custom_header nlm_internal_custom_header -#define Nlm32_Internal_Custom_Header Nlm_Internal_Custom_Header -#define nlm64_internal_custom_header nlm_internal_custom_header -#define Nlm64_Internal_Custom_Header Nlm_Internal_Custom_Header - -/* The internal Cygnus header is written out externally as a custom - header. We don't try to replicate that structure here. */ - -typedef struct nlm_internal_cygnus_ext_header -{ - /* The header is recognized by "CyGnUsEx" in the stamp field. */ - char stamp[8]; - /* File location of debugging information. */ - file_ptr offset; - /* Length of debugging information. */ - bfd_size_type length; -} Nlm_Internal_Cygnus_Ext_Header; - -#define nlm32_internal_cygnus_ext_header nlm_internal_cygnus_ext_header -#define Nlm32_Internal_Cygnus_Ext_Header Nlm_Internal_Cygnus_Ext_Header -#define nlm64_internal_cygnus_ext_header nlm_internal_cygnus_ext_header -#define Nlm64_Internal_Cygnus_Ext_Header Nlm_Internal_Cygnus_Ext_Header diff --git a/contrib/gdb/include/nlm/ppc-ext.h b/contrib/gdb/include/nlm/ppc-ext.h deleted file mode 100644 index 0aae10772f567..0000000000000 --- a/contrib/gdb/include/nlm/ppc-ext.h +++ /dev/null @@ -1,163 +0,0 @@ -/* PowerPC NLM (NetWare Loadable Module) support for BFD. - Copyright (C) 1994 Free Software Foundation, Inc. - -This file is part of BFD, the Binary File Descriptor library. - -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 2 of the License, 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ - -#ifdef OLDFORMAT - -/* The format of a PowerPC NLM changed. These structures are only - used in the old format. */ - -/* A PowerPC NLM starts with an instance of this structure. */ - -struct nlm32_powerpc_external_prefix_header -{ - /* Signature. Must be "AppleNLM". */ - char signature[8]; - /* Version number. Current value is 1. */ - unsigned char headerVersion[4]; - /* ??. Should be set to 0. */ - unsigned char origins[4]; - /* File creation date in standard Unix time format (seconds since - 1/1/70). */ - unsigned char date[4]; -}; - -#define NLM32_POWERPC_SIGNATURE "AppleNLM" -#define NLM32_POWERPC_HEADER_VERSION 1 - -/* The external format of a PowerPC NLM reloc. This is the same as an - XCOFF dynamic reloc. */ - -struct nlm32_powerpc_external_reloc -{ - /* Address. */ - unsigned char l_vaddr[4]; - /* Symbol table index. This is 0 for .text and 1 for .data. 2 - means .bss, but I don't know if it is used. In XCOFF, larger - numbers are indices into the dynamic symbol table, but they are - presumably not used in an NLM. */ - unsigned char l_symndx[4]; - /* Relocation type. */ - unsigned char l_rtype[2]; - /* Section number being relocated. */ - unsigned char l_rsecnm[2]; -}; - -#endif /* OLDFORMAT */ - -/* The external format of the fixed header. */ - -typedef struct nlm32_powerpc_external_fixed_header -{ - - /* The signature field identifies the file as an NLM. It must contain - the signature string, which depends upon the NLM target. */ - - unsigned char signature[24]; - - /* The version of the header. At this time, the highest version number - is 4. */ - - unsigned char version[4]; - - /* The name of the module, which must be a DOS name (1-8 characters followed - by a period and a 1-3 character extension). The first byte is the byte - length of the name and the last byte is a null terminator byte. This - field is fixed length, and any unused bytes should be null bytes. The - value is set by the OUTPUT keyword to NLMLINK. */ - - unsigned char moduleName[14]; - - /* Padding to make it come out correct. */ - - unsigned char pad1[2]; - - /* The byte offset of the code image from the start of the file. */ - - unsigned char codeImageOffset[4]; - - /* The size of the code image, in bytes. */ - - unsigned char codeImageSize[4]; - - /* The byte offset of the data image from the start of the file. */ - - unsigned char dataImageOffset[4]; - - /* The size of the data image, in bytes. */ - - unsigned char dataImageSize[4]; - - /* The size of the uninitialized data region that the loader is to be - allocated at load time. Uninitialized data follows the initialized - data in the NLM address space. */ - - unsigned char uninitializedDataSize[4]; - - /* The byte offset of the custom data from the start of the file. The - custom data is set by the CUSTOM keyword to NLMLINK. It is possible - for this to be EOF if there is no custom data. */ - - unsigned char customDataOffset[4]; - - /* The size of the custom data, in bytes. */ - - unsigned char customDataSize[4]; - - /* The byte offset of the module dependencies from the start of the file. - The module dependencies are determined by the MODULE keyword in - NLMLINK. */ - - unsigned char moduleDependencyOffset[4]; - - /* The number of module dependencies at the moduleDependencyOffset. */ - - unsigned char numberOfModuleDependencies[4]; - - /* The byte offset of the relocation fixup data from the start of the file */ - - unsigned char relocationFixupOffset[4]; - - unsigned char numberOfRelocationFixups[4]; - - unsigned char externalReferencesOffset[4]; - - unsigned char numberOfExternalReferences[4]; - - unsigned char publicsOffset[4]; - - unsigned char numberOfPublics[4]; - - /* The byte offset of the internal debug info from the start of the file. - It is possible for this to be EOF if there is no debug info. */ - - unsigned char debugInfoOffset[4]; - - unsigned char numberOfDebugRecords[4]; - - unsigned char codeStartOffset[4]; - - unsigned char exitProcedureOffset[4]; - - unsigned char checkUnloadProcedureOffset[4]; - - unsigned char moduleType[4]; - - unsigned char flags[4]; - -} Nlm32_powerpc_External_Fixed_Header; diff --git a/contrib/gdb/include/nlm/sparc32-ext.h b/contrib/gdb/include/nlm/sparc32-ext.h deleted file mode 100644 index 0deb2dee9230e..0000000000000 --- a/contrib/gdb/include/nlm/sparc32-ext.h +++ /dev/null @@ -1,120 +0,0 @@ -/* SPARC NLM (NetWare Loadable Module) support for BFD. - Copyright (C) 1993 Free Software Foundation, Inc. - -This file is part of BFD, the Binary File Descriptor library. - -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 2 of the License, 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ - -/* The external format of the fixed header. */ - -typedef struct nlm32_sparc_external_fixed_header -{ - - /* The signature field identifies the file as an NLM. It must contain - the signature string, which depends upon the NLM target. */ - - unsigned char signature[24]; - - /* The version of the header. At this time, the highest version number - is 4. */ - - unsigned char version[4]; - - /* The name of the module, which must be a DOS name (1-8 characters followed - by a period and a 1-3 character extension). The first byte is the byte - length of the name and the last byte is a null terminator byte. This - field is fixed length, and any unused bytes should be null bytes. The - value is set by the OUTPUT keyword to NLMLINK. */ - - unsigned char moduleName[14]; - - /* Padding to make it come out correct. */ - - unsigned char pad1[2]; - - /* The byte offset of the code image from the start of the file. */ - - unsigned char codeImageOffset[4]; - - /* The size of the code image, in bytes. */ - - unsigned char codeImageSize[4]; - - /* The byte offset of the data image from the start of the file. */ - - unsigned char dataImageOffset[4]; - - /* The size of the data image, in bytes. */ - - unsigned char dataImageSize[4]; - - /* The size of the uninitialized data region that the loader is to be - allocated at load time. Uninitialized data follows the initialized - data in the NLM address space. */ - - unsigned char uninitializedDataSize[4]; - - /* The byte offset of the custom data from the start of the file. The - custom data is set by the CUSTOM keyword to NLMLINK. It is possible - for this to be EOF if there is no custom data. */ - - unsigned char customDataOffset[4]; - - /* The size of the custom data, in bytes. */ - - unsigned char customDataSize[4]; - - /* The byte offset of the module dependencies from the start of the file. - The module dependencies are determined by the MODULE keyword in - NLMLINK. */ - - unsigned char moduleDependencyOffset[4]; - - /* The number of module dependencies at the moduleDependencyOffset. */ - - unsigned char numberOfModuleDependencies[4]; - - /* The byte offset of the relocation fixup data from the start of the file */ - - unsigned char relocationFixupOffset[4]; - - unsigned char numberOfRelocationFixups[4]; - - unsigned char externalReferencesOffset[4]; - - unsigned char numberOfExternalReferences[4]; - - unsigned char publicsOffset[4]; - - unsigned char numberOfPublics[4]; - - /* The byte offset of the internal debug info from the start of the file. - It is possible for this to be EOF if there is no debug info. */ - - unsigned char debugInfoOffset[4]; - - unsigned char numberOfDebugRecords[4]; - - unsigned char codeStartOffset[4]; - - unsigned char exitProcedureOffset[4]; - - unsigned char checkUnloadProcedureOffset[4]; - - unsigned char moduleType[4]; - - unsigned char flags[4]; - -} Nlm32_sparc_External_Fixed_Header; diff --git a/contrib/gdb/include/oasys.h b/contrib/gdb/include/oasys.h deleted file mode 100644 index 867d2503134ec..0000000000000 --- a/contrib/gdb/include/oasys.h +++ /dev/null @@ -1,152 +0,0 @@ -/* Oasys object format header file for BFD. - Contributed by Cygnus Support. */ - -#define OASYS_MAX_SEC_COUNT 16 -/* **** */ - -typedef struct oasys_archive_header { - unsigned int version; - char create_date[12]; - char revision_date[12]; - unsigned int mod_count; - file_ptr mod_tbl_offset; - unsigned int sym_tbl_size; - unsigned int sym_count; - file_ptr sym_tbl_offset; - unsigned int xref_count; - file_ptr xref_lst_offset; -} oasys_archive_header_type; - -typedef struct oasys_extarchive_header { - bfd_byte version[4]; - bfd_byte create_date[12]; - bfd_byte revision_date[12]; - bfd_byte mod_count[4]; - bfd_byte mod_tbl_offset[4]; - bfd_byte sym_tbl_size[4]; - bfd_byte sym_count[4]; - bfd_byte sym_tbl_offset[4]; - bfd_byte xref_count[4]; - bfd_byte xref_lst_offset[4]; -} oasys_extarchive_header_type; - -typedef struct oasys_module_table { - int mod_number; - char mod_date[12]; - unsigned int mod_size; - unsigned int dep_count; - unsigned int depee_count; - file_ptr file_offset; - unsigned int sect_count; - char *module_name; - unsigned int module_name_size; -} oasys_module_table_type; - - -typedef struct oasys_extmodule_table_a { - bfd_byte mod_number[4]; - bfd_byte mod_date[12]; - bfd_byte mod_size[4]; - bfd_byte dep_count[4]; - bfd_byte depee_count[4]; - bfd_byte sect_count[4]; - bfd_byte file_offset[4]; - bfd_byte mod_name[32]; -} oasys_extmodule_table_type_a_type; - -typedef struct oasys_extmodule_table_b { - bfd_byte mod_number[4]; - bfd_byte mod_date[12]; - bfd_byte mod_size[4]; - bfd_byte dep_count[4]; - bfd_byte depee_count[4]; - bfd_byte sect_count[4]; - bfd_byte file_offset[4]; - bfd_byte mod_name_length[4]; -} oasys_extmodule_table_type_b_type; - - -typedef enum oasys_record { - oasys_record_is_end_enum = 0, - oasys_record_is_data_enum = 1, - oasys_record_is_symbol_enum = 2, - oasys_record_is_header_enum = 3, - oasys_record_is_named_section_enum = 4, - oasys_record_is_com_enum = 5, - oasys_record_is_debug_enum = 6, - oasys_record_is_section_enum = 7, - oasys_record_is_debug_file_enum = 8, - oasys_record_is_module_enum = 9, - oasys_record_is_local_enum = 10 -} oasys_record_enum_type; - - - -typedef struct oasys_record_header { - unsigned char length; - unsigned char check_sum; - unsigned char type; - unsigned char fill; -} oasys_record_header_type; - -typedef struct oasys_data_record { - oasys_record_header_type header; - unsigned char relb; - bfd_byte addr[4]; - /* maximum total size of data record is 255 bytes */ - bfd_byte data[246]; -} oasys_data_record_type; - -typedef struct oasys_header_record { - oasys_record_header_type header; - unsigned char version_number; - unsigned char rev_number; - char module_name[26-6]; - char description[64-26]; -} oasys_header_record_type; - -#define OASYS_VERSION_NUMBER 0 -#define OASYS_REV_NUMBER 0 - -typedef struct oasys_symbol_record { - oasys_record_header_type header; - unsigned char relb; - bfd_byte value[4]; - bfd_byte refno[2]; - char name[64]; -} oasys_symbol_record_type; - -#define RELOCATION_PCREL_BIT 0x80 -#define RELOCATION_32BIT_BIT 0x40 -#define RELOCATION_TYPE_BITS 0x30 -#define RELOCATION_TYPE_ABS 0x00 -#define RELOCATION_TYPE_REL 0x10 -#define RELOCATION_TYPE_UND 0x20 -#define RELOCATION_TYPE_COM 0x30 -#define RELOCATION_SECT_BITS 0x0f - -typedef struct oasys_section_record { - oasys_record_header_type header; - unsigned char relb; - bfd_byte value[4]; - bfd_byte vma[4]; - bfd_byte fill[3]; -} oasys_section_record_type; - -typedef struct oasys_end_record { - oasys_record_header_type header; - unsigned char relb; - bfd_byte entry[4]; - bfd_byte fill[2]; - bfd_byte zero; -} oasys_end_record_type; - -typedef union oasys_record_union { - oasys_record_header_type header; - oasys_data_record_type data; - oasys_section_record_type section; - oasys_symbol_record_type symbol; - oasys_header_record_type first; - oasys_end_record_type end; - bfd_byte pad[256]; -} oasys_record_union_type; diff --git a/contrib/gdb/include/obstack.h b/contrib/gdb/include/obstack.h deleted file mode 100644 index 416b8bf531518..0000000000000 --- a/contrib/gdb/include/obstack.h +++ /dev/null @@ -1,518 +0,0 @@ -/* obstack.h - object stack macros - Copyright (C) 1988, 89, 90, 91, 92, 93, 94, 95, 96 Free Software Foundation, Inc. - -This program is free software; you can redistribute it and/or modify it -under the terms of the GNU Library General Public License as published by the -Free Software Foundation; either version 2, 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 Library General Public License for more details. - -You should have received a copy of the GNU Library General Public License -along with this program; if not, write to the Free Software -Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, 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' an 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 __OBSTACK_H__ -#define __OBSTACK_H__ - -/* 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 - -/* We need the type of the resulting object. In ANSI C it is ptrdiff_t - but in traditional C it is usually long. If we are in ANSI C and - don't already have ptrdiff_t get it. */ - -#if defined (__STDC__) && ! defined (offsetof) -#if defined (__GNUC__) && defined (IN_GCC) -/* On Next machine, the system's stddef.h screws up if included - after we have defined just ptrdiff_t, so include all of stddef.h. - Otherwise, define just ptrdiff_t, which is all we need. */ -#ifndef __NeXT__ -#define __need_ptrdiff_t -#endif -#endif - -#include <stddef.h> -#endif - -#ifdef __STDC__ -#define PTR_INT_TYPE ptrdiff_t -#else -#define PTR_INT_TYPE long -#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 */ - PTR_INT_TYPE 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. */ - char *extra_arg; /* first arg for chunk alloc/dealloc funcs */ - unsigned use_extra_arg:1; /* chunk alloc/dealloc funcs take extra arg */ - unsigned maybe_empty_object:1;/* There is a possibility that the current - chunk contains a zero-length object. This - prevents freeing the chunk if we allocate - a bigger chunk to replace it. */ - unsigned alloc_failed:1; /* chunk alloc func returned 0 */ -}; - -/* 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 int _obstack_begin (struct obstack *, int, int, - void *(*) (), void (*) ()); -extern int _obstack_begin_1 (struct obstack *, int, int, - void *(*) (), void (*) (), void *); -extern int _obstack_memory_used (struct obstack *); -#else -extern void _obstack_newchunk (); -extern void _obstack_free (); -extern int _obstack_begin (); -extern int _obstack_begin_1 (); -extern int _obstack_memory_used (); -#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); -int obstack_memory_used (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)->alloc_failed ? 0 : (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)->alloc_failed ? 0 : (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, (void (*) ()) obstack_chunk_free) - -#define obstack_begin(h, size) \ - _obstack_begin ((h), (size), 0, \ - (void *(*) ()) obstack_chunk_alloc, (void (*) ()) obstack_chunk_free) - -#define obstack_specify_allocation(h, size, alignment, chunkfun, freefun) \ - _obstack_begin ((h), (size), (alignment), \ - (void *(*) ()) (chunkfun), (void (*) ()) (freefun)) - -#define obstack_specify_allocation_with_arg(h, size, alignment, chunkfun, freefun, arg) \ - _obstack_begin_1 ((h), (size), (alignment), \ - (void *(*) ()) (chunkfun), (void (*) ()) (freefun), (arg)) - -#define obstack_chunkfun(h, newchunkfun) \ - ((h) -> chunkfun = (struct _obstack_chunk *(*)()) (newchunkfun)) - -#define obstack_freefun(h, newfreefun) \ - ((h) -> freefun = (void (*)()) (newfreefun)) - -#define obstack_1grow_fast(h,achar) (*((h)->next_free)++ = achar) - -#define obstack_blank_fast(h,n) ((h)->next_free += (n)) - -#define obstack_memory_used(h) _obstack_memory_used (h) - -#if defined (__GNUC__) && defined (__STDC__) -#if __GNUC__ < 2 -#define __extension__ -#endif - -/* 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) \ - __extension__ \ - ({ struct obstack *__o = (OBSTACK); \ - __o->alloc_failed ? 0 : \ - (unsigned) (__o->next_free - __o->object_base); }) - -#define obstack_room(OBSTACK) \ - __extension__ \ - ({ struct obstack *__o = (OBSTACK); \ - (unsigned) (__o->chunk_limit - __o->next_free); }) - -#define obstack_grow(OBSTACK,where,length) \ -__extension__ \ -({ struct obstack *__o = (OBSTACK); \ - int __len = (length); \ - if (__o->next_free + __len > __o->chunk_limit) \ - _obstack_newchunk (__o, __len); \ - if (!__o->alloc_failed) \ - { \ - bcopy (where, __o->next_free, __len); \ - __o->next_free += __len; \ - } \ - (void) 0; }) - -#define obstack_grow0(OBSTACK,where,length) \ -__extension__ \ -({ struct obstack *__o = (OBSTACK); \ - int __len = (length); \ - if (__o->next_free + __len + 1 > __o->chunk_limit) \ - _obstack_newchunk (__o, __len + 1); \ - if (!__o->alloc_failed) \ - { \ - bcopy (where, __o->next_free, __len); \ - __o->next_free += __len; \ - *(__o->next_free)++ = 0; \ - } \ - (void) 0; }) - -#define obstack_1grow(OBSTACK,datum) \ -__extension__ \ -({ struct obstack *__o = (OBSTACK); \ - if (__o->next_free + 1 > __o->chunk_limit) \ - _obstack_newchunk (__o, 1); \ - if (!__o->alloc_failed) \ - *(__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) \ -__extension__ \ -({ struct obstack *__o = (OBSTACK); \ - if (__o->next_free + sizeof (void *) > __o->chunk_limit) \ - _obstack_newchunk (__o, sizeof (void *)); \ - if (!__o->alloc_failed) \ - *((void **)__o->next_free)++ = ((void *)datum); \ - (void) 0; }) - -#define obstack_int_grow(OBSTACK,datum) \ -__extension__ \ -({ struct obstack *__o = (OBSTACK); \ - if (__o->next_free + sizeof (int) > __o->chunk_limit) \ - _obstack_newchunk (__o, sizeof (int)); \ - if (!__o->alloc_failed) \ - *((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) \ -__extension__ \ -({ struct obstack *__o = (OBSTACK); \ - int __len = (length); \ - if (__o->chunk_limit - __o->next_free < __len) \ - _obstack_newchunk (__o, __len); \ - if (!__o->alloc_failed) \ - __o->next_free += __len; \ - (void) 0; }) - -#define obstack_alloc(OBSTACK,length) \ -__extension__ \ -({ struct obstack *__h = (OBSTACK); \ - obstack_blank (__h, (length)); \ - obstack_finish (__h); }) - -#define obstack_copy(OBSTACK,where,length) \ -__extension__ \ -({ struct obstack *__h = (OBSTACK); \ - obstack_grow (__h, (where), (length)); \ - obstack_finish (__h); }) - -#define obstack_copy0(OBSTACK,where,length) \ -__extension__ \ -({ struct obstack *__h = (OBSTACK); \ - obstack_grow0 (__h, (where), (length)); \ - obstack_finish (__h); }) - -/* The local variable is named __o1 to avoid a name conflict - when obstack_blank is called. */ -#define obstack_finish(OBSTACK) \ -__extension__ \ -({ struct obstack *__o1 = (OBSTACK); \ - void *value; \ - if (__o1->alloc_failed) \ - value = 0; \ - else \ - { \ - value = (void *) __o1->object_base; \ - if (__o1->next_free == value) \ - __o1->maybe_empty_object = 1; \ - __o1->next_free \ - = __INT_TO_PTR ((__PTR_TO_INT (__o1->next_free)+__o1->alignment_mask)\ - & ~ (__o1->alignment_mask)); \ - if (__o1->next_free - (char *)__o1->chunk \ - > __o1->chunk_limit - (char *)__o1->chunk) \ - __o1->next_free = __o1->chunk_limit; \ - __o1->object_base = __o1->next_free; \ - } \ - value; }) - -#define obstack_free(OBSTACK, OBJ) \ -__extension__ \ -({ 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)->alloc_failed ? 0 : (h)->next_free - (h)->object_base) - -#define obstack_room(h) \ - (unsigned) ((h)->chunk_limit - (h)->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(h,where,length) \ -( (h)->temp = (length), \ - (((h)->next_free + (h)->temp > (h)->chunk_limit) \ - ? (_obstack_newchunk ((h), (h)->temp), 0) : 0), \ - ((h)->alloc_failed ? 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), \ - ((h)->alloc_failed ? 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)->alloc_failed ? 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), \ - ((h)->alloc_failed ? 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), \ - ((h)->alloc_failed ? 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)->alloc_failed ? 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)->alloc_failed ? 0 : \ - (((h)->next_free == (h)->object_base \ - ? (((h)->maybe_empty_object = 1), 0) \ - : 0), \ - (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 __OBSTACK_H__ */ diff --git a/contrib/gdb/include/opcode/ChangeLog b/contrib/gdb/include/opcode/ChangeLog deleted file mode 100644 index f56df4bd59858..0000000000000 --- a/contrib/gdb/include/opcode/ChangeLog +++ /dev/null @@ -1,812 +0,0 @@ -Thu Mar 7 15:08:23 1996 Doug Evans <dje@charmed.cygnus.com> - - * sparc.h (O): Mark operand letter as in use. - -Tue Feb 20 20:46:21 1996 Doug Evans <dje@charmed.cygnus.com> - - * sparc.h (sparc_{encode,decode}_sparclet_cpreg): Declare. - Mark operand letters uU as in use. - -Mon Feb 19 01:59:08 1996 Doug Evans <dje@charmed.cygnus.com> - - * sparc.h (sparc_opcode_arch_val): Add SPARC_OPCODE_ARCH_SPARCLET. - (sparc_opcode_arch): Delete member `conflicts'. Add `supported'. - (SPARC_OPCODE_SUPPORTED): New macro. - (SPARC_OPCODE_CONFLICT_P): Rewrite. - (F_NOTV9): Delete. - -Fri Feb 16 12:23:34 1996 Jeffrey A Law (law@cygnus.com) - - * sparc.h (sparc_opcode_lookup_arch) Make return type in - declaration consistent with return type in definition. - -Wed Feb 14 18:14:11 1996 Alan Modra <alan@spri.levels.unisa.edu.au> - - * i386.h (i386_optab): Remove Data32 from pushf and popf. - -Thu Feb 8 14:27:21 1996 James Carlson <carlson@xylogics.com> - - * i386.h (i386_regtab): Add 80486 test registers. - -Mon Feb 5 18:35:46 1996 Ian Lance Taylor <ian@cygnus.com> - - * i960.h (I_HX): Define. - (i960_opcodes): Add HX instruction. - -Mon Jan 29 12:43:39 1996 Ken Raeburn <raeburn@cygnus.com> - - * i386.h: Fix waiting forms of finit, fstenv, fsave, fstsw, fstcw, - and fclex. - -Wed Jan 24 22:36:59 1996 Doug Evans <dje@charmed.cygnus.com> - - * sparc.h (enum sparc_opcode_arch_val): Replaces sparc_architecture. - (SPARC_OPCODE_CONFLICT_P): Renamed from ARCHITECTURES_CONFLICT_P. - (bfd_* defines): Delete. - (sparc_opcode_archs): Replaces architecture_pname. - (sparc_opcode_lookup_arch): Declare. - (NUMOPCODES): Delete. - -Mon Jan 22 08:24:32 1996 Doug Evans <dje@charmed.cygnus.com> - - * sparc.h (enum sparc_architecture): Add v9a. - (ARCHITECTURES_CONFLICT_P): Update. - -Thu Dec 28 13:27:53 1995 John Hassey <hassey@rtp.dg.com> - - * i386.h: Added Pentium Pro instructions. - -Thu Nov 2 22:59:22 1995 Ian Lance Taylor <ian@cygnus.com> - - * m68k.h: Document new 'W' operand place. - -Tue Oct 24 10:49:10 1995 Jeffrey A Law (law@cygnus.com) - - * hppa.h: Add lci and syncdma instructions. - -Mon Oct 23 11:09:16 1995 James G. Smith <jsmith@pasanda.cygnus.co.uk> - - * mips.h: Added INSN_4100 flag to mark NEC VR4100 specific - instructions. - -Mon Oct 16 10:28:15 1995 Michael Meissner <meissner@tiktok.cygnus.com> - - * ppc.h (PPC_OPCODE_{COMMON,ANY}): New opcode flags for - assembler's -mcom and -many switches. - -Wed Oct 11 16:56:33 1995 Ken Raeburn <raeburn@cygnus.com> - - * i386.h: Fix cmpxchg8b extension opcode description. - -Thu Oct 5 18:03:36 1995 Ken Raeburn <raeburn@cygnus.com> - - * i386.h: Add Pentium instructions wrmsr, rdtsc, rdmsr, cmpxchg8b, - and register cr4. - -Tue Sep 19 15:26:43 1995 Ian Lance Taylor <ian@cygnus.com> - - * m68k.h: Change comment: split type P into types 0, 1 and 2. - -Wed Aug 30 13:50:55 1995 Doug Evans <dje@canuck.cygnus.com> - - * sparc.h (sparc_{encode,decode}_prefetch): Declare. - -Tue Aug 29 15:34:58 1995 Doug Evans <dje@canuck.cygnus.com> - - * sparc.h (sparc_{encode,decode}_{asi,membar}): Declare. - -Wed Aug 2 18:32:19 1995 Ian Lance Taylor <ian@cygnus.com> - - * m68kmri.h: Remove. - - * m68k.h: Move tables into opcodes/m68k-opc.c, leaving just the - declarations. Remove F_ALIAS and flag field of struct - m68k_opcode. Change arch field of struct m68k_opcode to unsigned - int. Make name and args fields of struct m68k_opcode const. - -Wed Aug 2 08:16:46 1995 Doug Evans <dje@canuck.cygnus.com> - - * sparc.h (F_NOTV9): Define. - -Tue Jul 11 14:20:42 1995 Jeff Spiegel <jeffs@lsil.com> - - * mips.h (INSN_4010): Define. - -Wed Jun 21 18:49:51 1995 Ken Raeburn <raeburn@cujo.cygnus.com> - - * m68k.h (TBL1): Reverse sense of "round" argument in result. - - Changes from Andreas Schwab <schwab@issan.informatik.uni-dortmund.de>: - * m68k.h: Fix argument descriptions of coprocessor - instructions to allow only alterable operands where appropriate. - [!NO_DEFAULT_SIZES]: An omitted size defaults to `w'. - (m68k_opcode_aliases): Add more aliases. - - -Fri Apr 14 22:15:34 1995 Ken Raeburn <raeburn@cujo.cygnus.com> - - * m68k.h: Added explcitly short-sized conditional branches, and a - bunch of aliases (fmov*, ftest*, tdivul) to support gcc's - svr4-based configurations. - - -Mon Mar 13 21:30:01 1995 Ken Raeburn <raeburn@cujo.cygnus.com> - - Mon Feb 27 08:36:39 1995 Bryan Ford <baford@cs.utah.edu> - * i386.h: added missing Data16/Data32 flags to a few instructions. - -Wed Mar 8 15:19:53 1995 Ian Lance Taylor <ian@cygnus.com> - - * mips.h (OP_MASK_FR, OP_SH_FR): Define. - (OP_MASK_BCC, OP_SH_BCC): Define. - (OP_MASK_PREFX, OP_SH_PREFX): Define. - (OP_MASK_CCC, OP_SH_CCC): Define. - (INSN_READ_FPR_R): Define. - (INSN_RFE): Delete. - -Wed Mar 8 03:13:23 1995 Ken Raeburn <raeburn@cujo.cygnus.com> - - * m68k.h (enum m68k_architecture): Deleted. - (struct m68k_opcode_alias): New type. - (m68k_opcodes): Now const. Deleted opcode aliases with exactly - matching constraints, values and flags. As a side effect of this, - the MOTOROLA_SYNTAX_ONLY and MIT_SYNTAX_ONLY macros, which so far - as I know were never used, now may need re-examining. - (numopcodes): Now const. - (m68k_opcode_aliases, numaliases): New variables. - (endop): Deleted. - [DONT_DEFINE_TABLE]: Declare numopcodes, numaliases, and - m68k_opcode_aliases; update declaration of m68k_opcodes. - - -Mon Mar 6 10:02:00 1995 Jeff Law (law@snake.cs.utah.edu) - - * hppa.h (delay_type): Delete unused enumeration. - (pa_opcode): Replace unused delayed field with an architecture - field. - (pa_opcodes): Mark each instruction as either PA1.0 or PA1.1. - -Fri Mar 3 16:10:24 1995 Ian Lance Taylor <ian@cygnus.com> - - * mips.h (INSN_ISA4): Define. - -Fri Feb 24 19:13:37 1995 Ian Lance Taylor <ian@cygnus.com> - - * mips.h (M_DLA_AB, M_DLI): Define. - -Thu Feb 23 17:33:09 1995 Jeff Law (law@snake.cs.utah.edu) - - * hppa.h (fstwx): Fix single-bit error. - -Wed Feb 15 12:19:52 1995 Ian Lance Taylor <ian@cygnus.com> - - * mips.h (M_ULD, M_ULD_A, M_USD, M_USD_A): Define. - - -Mon Feb 6 10:35:23 1995 J.T. Conklin <jtc@rtl.cygnus.com> - - * i386.h: added cpuid instruction , and dr[0-7] aliases for the - debug registers. From Charles Hannum (mycroft@netbsd.org). - -Mon Feb 6 03:31:54 1995 Ken Raeburn <raeburn@cujo.cygnus.com> - - Changes from Bryan Ford <baford@schirf.cs.utah.edu> for 16-bit - i386 support: - * i386.h (MOV_AX_DISP32): New macro. - (i386_optab): Added Data16 and Data32 as needed. Added "w" forms - of several call/return instructions. - (ADDR_PREFIX_OPCODE): New macro. - -Mon Jan 23 16:45:43 1995 Ken Raeburn <raeburn@cujo.cygnus.com> - - Sat Jan 21 17:50:38 1995 Pat Rankin (rankin@eql.caltech.edu) - - * ../include/opcode/vax.h (struct vot_wot, field `args'): make - it pointer to const char; - (struct vot, field `name'): ditto. - -Thu Jan 19 14:47:53 1995 Ken Raeburn <raeburn@cujo.cygnus.com> - - * vax.h: Supply and properly group all values in end sentinel. - -Tue Jan 17 10:55:30 1995 Ian Lance Taylor <ian@sanguine.cygnus.com> - - * mips.h (INSN_ISA, INSN_4650): Define. - - - -Wed Oct 19 13:34:17 1994 Ian Lance Taylor <ian@sanguine.cygnus.com> - - * a29k.h: Add operand type 'I' for `inv' and `iretinv'. On - systems with a separate instruction and data cache, such as the - 29040, these instructions take an optional argument. - -Wed Sep 14 17:44:20 1994 Ian Lance Taylor (ian@sanguine.cygnus.com) - - * mips.h (INSN_STORE_MEMORY): Correct value to not conflict with - INSN_TRAP. - -Tue Sep 6 11:39:08 1994 Ian Lance Taylor (ian@sanguine.cygnus.com) - - * mips.h (INSN_STORE_MEMORY): Define. - -Thu Jul 28 19:28:07 1994 Ken Raeburn (raeburn@cujo.cygnus.com) - - * sparc.h: Document new operand type 'x'. - -Tue Jul 26 17:48:05 1994 Ken Raeburn (raeburn@cujo.cygnus.com) - - * i960.h (I_CX2): New instruction category. It includes - instructions available on Cx and Jx processors. - (I_JX): New instruction category, for JX-only instructions. - (i960_opcodes): Put eshro and sysctl in I_CX2 category. Added - Jx-only instructions, in I_JX category. - -Wed Jul 13 18:43:47 1994 Ken Raeburn (raeburn@cujo.cygnus.com) - - * ns32k.h (endop): Made pointer const too. - -Sun Jul 10 11:01:09 1994 Ian Dall (dall@hfrd.dsto.gov.au) - - * ns32k.h: Drop Q operand type as there is no correct use - for it. Add I and Z operand types which allow better checking. - -Thu Jul 7 12:34:48 1994 Steve Chamberlain (sac@jonny.cygnus.com) - - * h8300.h (xor.l) :fix bit pattern. - (L_2): New size of operand. - (trapa): Use it. - -Fri Jun 10 16:38:11 1994 Ian Lance Taylor (ian@tweedledumb.cygnus.com) - - * m68k.h: Move "trap" before "tpcc" to change disassembly. - -Fri Jun 3 15:57:36 1994 Ken Raeburn (raeburn@cujo.cygnus.com) - - * sparc.h: Include v9 definitions. - -Thu Jun 2 12:23:17 1994 Ken Raeburn (raeburn@cujo.cygnus.com) - - * m68k.h (m68060): Defined. - (m68040up, mfloat, mmmu): Include it. - (struct m68k_opcode): Widen `arch' field. - (m68k_opcodes): Updated for M68060. Removed comments that were - instructions commented out by "JF" years ago. - -Thu Apr 28 18:31:14 1994 Ken Raeburn (raeburn@cujo.cygnus.com) - - * m68k.h (struct m68k_opcode): Shorten `arch' field to 8 bits, and - add a one-bit `flags' field. - (F_ALIAS): New macro. - -Wed Apr 27 11:29:52 1994 Steve Chamberlain (sac@cygnus.com) - - * h8300.h (dec, inc): Get encoding right. - -Mon Apr 4 13:12:43 1994 Ian Lance Taylor (ian@tweedledumb.cygnus.com) - - * ppc.h (struct powerpc_operand): Removed signedp field; just use - a flag instead. - (PPC_OPERAND_SIGNED): Define. - (PPC_OPERAND_SIGNOPT): Define. - -Thu Mar 31 19:34:08 1994 Ken Raeburn (raeburn@cujo.cygnus.com) - - * i386.h (IS_JUMP_ON_ECX_ZERO, "jcxz" pattern): Operand size - prefix is 0x66, not 0x67. Patch from H.J. Lu (hlu@nynexst.com). - -Thu Mar 3 15:51:05 1994 Ken Raeburn (raeburn@cujo.cygnus.com) - - * i386.h: Reverse last change. It'll be handled in gas instead. - -Thu Feb 24 15:29:05 1994 Ken Raeburn (raeburn@cujo.cygnus.com) - - * i386.h (sar): Disabled the two-operand Imm1 form, since it was - slower on the 486 and used the implicit shift count despite the - explicit operand. The one-operand form is still available to get - the shorter form with the implicit shift count. - -Thu Feb 17 12:27:52 1994 Torbjorn Granlund (tege@mexican.cygnus.com) - - * hppa.h: Fix typo in fstws arg string. - -Wed Feb 9 21:23:52 1994 Ian Lance Taylor (ian@tweedledumb.cygnus.com) - - * ppc.h (struct powerpc_opcode): Make operands field unsigned. - -Mon Feb 7 19:14:58 1994 Ian Lance Taylor (ian@tweedledumb.cygnus.com) - - * ppc.h (PPC_OPCODE_601): Define. - -Fri Feb 4 23:43:50 1994 Jeffrey A. Law (law@snake.cs.utah.edu) - - * hppa.h (addb): Use '@' for addb and addib pseudo ops. - (so we can determine valid completers for both addb and addb[tf].) - - * hppa.h (xmpyu): No floating point format specifier for the - xmpyu instruction. - -Fri Feb 4 23:36:52 1994 Ian Lance Taylor (ian@tweedledumb.cygnus.com) - - * ppc.h (PPC_OPERAND_NEXT): Define. - (PPC_OPERAND_NEGATIVE): Change value to make room for above. - (struct powerpc_macro): Define. - (powerpc_macros, powerpc_num_macros): Declare. - -Fri Jan 21 19:13:50 1994 Ian Lance Taylor (ian@tweedledumb.cygnus.com) - - * ppc.h: New file. Header file for PowerPC opcode table. - -Mon Jan 17 00:14:23 1994 Jeffrey A. Law (law@snake.cs.utah.edu) - - * hppa.h: More minor template fixes for sfu and copr (to allow - for easier disassembly). - - * hppa.h: Fix templates for all the sfu and copr instructions. - -Wed Dec 15 15:12:42 1993 Ken Raeburn (raeburn@cujo.cygnus.com) - - * i386.h (push): Permit Imm16 operand too. - -Sat Dec 11 16:14:06 1993 Steve Chamberlain (sac@thepub.cygnus.com) - - * h8300.h (andc): Exists in base arch. - -Wed Dec 1 12:15:32 1993 Jeffrey A. Law (law@snake.cs.utah.edu) - - * From Hisashi MINAMINO <minamino@sramhc.sra.co.jp> - * hppa.h: #undef NONE to avoid conflict with hiux include files. - -Sun Nov 21 22:06:57 1993 Jeffrey A. Law (law@snake.cs.utah.edu) - - * hppa.h: Add FP quadword store instructions. - -Wed Nov 17 17:13:16 1993 Ian Lance Taylor (ian@tweedledumb.cygnus.com) - - * mips.h: (M_J_A): Added. - (M_LA): Removed. - -Mon Nov 8 12:12:47 1993 Ian Lance Taylor (ian@tweedledumb.cygnus.com) - - * mips.h (OP_MASK_CACHE, OP_SH_CACHE): Define. From Ted Lemon - <mellon@pepper.ncd.com>. - -Sun Nov 7 00:30:11 1993 Jeffrey A. Law (law@snake.cs.utah.edu) - - * hppa.h: Immediate field in probei instructions is unsigned, - not low-sign extended. - -Wed Nov 3 10:30:00 1993 Jim Kingdon (kingdon@lioth.cygnus.com) - - * m88k.h (RRI10MASK): Change from 0xfc00ffe0 to 0xfc00fc00. - -Tue Nov 2 12:41:30 1993 Ken Raeburn (raeburn@rover.cygnus.com) - - * i386.h: Add "fxch" without operand. - -Mon Nov 1 18:13:03 1993 Ian Lance Taylor (ian@tweedledumb.cygnus.com) - - * mips.h (M_JAL_1, M_JAL_2, M_JAL_A): Added. - -Sat Oct 2 22:26:11 1993 Jeffrey A Law (law@snake.cs.utah.edu) - - * hppa.h: Add gfw and gfr to the opcode table. - -Wed Sep 29 16:23:00 1993 K. Richard Pixley (rich@sendai.cygnus.com) - - * m88k.h: extended to handle m88110. - -Tue Sep 28 19:19:08 1993 Jeffrey A Law (law@snake.cs.utah.edu) - - * hppa.h (be, ble): Use operand type 'z' to denote absolute branch - addresses. - -Tue Sep 14 14:04:35 1993 Ian Lance Taylor (ian@tweedledumb.cygnus.com) - - * i960.h (i960_opcodes): Properly bracket initializers. - -Mon Sep 13 12:50:52 1993 K. Richard Pixley (rich@sendai.cygnus.com) - - * m88k.h (BOFLAG): rewrite to avoid nested comment. - -Mon Sep 13 15:46:06 1993 Ian Lance Taylor (ian@tweedledumb.cygnus.com) - - * m68k.h (two): Protect second argument with parentheses. - -Fri Sep 10 16:29:47 1993 Ken Raeburn (raeburn@cambridge.cygnus.com) - - * i386.h (i386_optab): Added new instruction "rsm" (for i386sl). - Deleted old in/out instructions in "#if 0" section. - -Thu Sep 9 17:42:19 1993 Ian Lance Taylor (ian@tweedledumb.cygnus.com) - - * i386.h (i386_optab): Properly bracket initializers. - -Wed Aug 25 13:50:56 1993 Ken Raeburn (raeburn@cambridge.cygnus.com) - - * hppa.h (pa_opcode): Use '|' for movb and movib insns. (From - Jeff Law, law@cs.utah.edu). - -Mon Aug 23 16:55:03 1993 Ken Raeburn (raeburn@cambridge.cygnus.com) - - * i386.h (lcall): Accept Imm32 operand also. - -Mon Aug 23 12:43:11 1993 Ian Lance Taylor (ian@tweedledumb.cygnus.com) - - * mips.h (M_ABSU): Removed (absolute value of unsigned number??). - (M_DABS): Added. - -Thu Aug 19 15:08:37 1993 Ian Lance Taylor (ian@tweedledumb.cygnus.com) - - * mips.h (INSN_*): Changed values. Removed unused definitions. - Added INSN_COND_BRANCH_LIKELY, INSN_ISA2 and INSN_ISA3. Split - INSN_LOAD_DELAY into INSN_LOAD_MEMORY_DELAY and - INSN_LOAD_COPROC_DELAY. Split INSN_COPROC_DELAY into - INSN_COPROC_MOVE_DELAY and INSN_COPROC_MEMORY_DELAY. - (M_*): Added new values for r6000 and r4000 macros. - (ANY_DELAY): Removed. - -Wed Aug 18 15:37:48 1993 Ian Lance Taylor (ian@tweedledumb.cygnus.com) - - * mips.h: Added M_LI_S and M_LI_SS. - -Tue Aug 17 07:08:08 1993 Steve Chamberlain (sac@phydeaux.cygnus.com) - - * h8300.h: Get some rare mov.bs correct. - -Thu Aug 5 09:15:17 1993 Jim Kingdon (kingdon@lioth.cygnus.com) - - * sparc.h: Don't define const ourself; rely on ansidecl.h having - been included. - -Fri Jul 30 18:41:11 1993 John Gilmore (gnu@cygnus.com) - - * sparc.h (F_JSR, F_UNBR, F_CONDBR): Add new flags to mark - jump instructions, for use in disassemblers. - -Thu Jul 22 07:25:27 1993 Ian Lance Taylor (ian@cygnus.com) - - * m88k.h: Make bitfields just unsigned, not unsigned long or - unsigned short. - -Wed Jul 21 11:55:31 1993 Jim Kingdon (kingdon@deneb.cygnus.com) - - * hppa.h: New argument type 'y'. Use in various float instructions. - -Mon Jul 19 17:17:03 1993 Jim Kingdon (kingdon@deneb.cygnus.com) - - * hppa.h (break): First immediate field is unsigned. - - * hppa.h: Add rfir instruction. - -Sun Jul 18 16:28:08 1993 Jim Kingdon (kingdon@rtl.cygnus.com) - - * mips.h: Split the actual table out into ../../opcodes/mips-opc.c. - -Fri Jul 16 09:59:29 1993 Ian Lance Taylor (ian@cygnus.com) - - * mips.h: Reworked the hazard information somewhat, and fixed some - bugs in the instruction hazard descriptions. - -Thu Jul 15 12:42:01 1993 Ian Lance Taylor (ian@tweedledumb.cygnus.com) - - * m88k.h: Corrected a couple of opcodes. - -Tue Jul 6 15:17:35 1993 Ian Lance Taylor (ian@cygnus.com) - - * mips.h: Replaced with version from Ralph Campbell and OSF. The - new version includes instruction hazard information, but is - otherwise reasonably similar. - -Thu Jul 1 20:36:17 1993 Doug Evans (dje@canuck.cygnus.com) - - * h8300.h: Fix typo in UNOP3 (affected sh[al][lr].l). - -Fri Jun 11 18:38:44 1993 Ken Raeburn (raeburn@cygnus.com) - - Patches from Jeff Law, law@cs.utah.edu: - * hppa.h: Clean up some of the OLD_TABLE, non-OLD_TABLE braindamage. - Make the tables be the same for the following instructions: - "bb", "addb[tf]", "addib[tf]", "add", "add[loc]", "addco", - "sh[123]add", "sh[123]add[lo]", "sub", "sub[obt]", "sub[bt]o", - "ds", "comclr", "addi", "addi[ot]", "addito", "subi", "subio", - "comiclr", "fadd", "fsub", "fmpy", "fdiv", "fsqrt", "fabs", - "frnd", "fcpy", "fcnvff", "fcnvxf", "fcnvfx", "fcnvfxt", - "fcmp", and "ftest". - - * hppa.h: Make new and old tables the same for "break", "mtctl", - "mfctl", "bb", "ssm", "rsm", "xmpyu", "fmpyadd", "fmpysub". - Fix typo in last patch. Collapse several #ifdefs into a - single #ifdef. - - * hppa.h: Delete remaining OLD_TABLE code. Bring some - of the comments up-to-date. - - * hppa.h: Update "free list" of letters and update - comments describing each letter's function. - -Fri Jun 4 15:41:37 1993 Steve Chamberlain (sac@phydeaux.cygnus.com) - - * h8300.h: checkpoint, includes H8/300-H opcodes. - -Thu Jun 3 15:42:59 1993 Stu Grossman (grossman@cygnus.com) - - * Patches from Jeffrey Law <law@cs.utah.edu>. - * hppa.h: Rework single precision FP - instructions so that they correctly disassemble code - PA1.1 code. - -Thu May 27 19:21:22 1993 Bruce Bauman (boot@osf.org) - - * i386.h (i386_optab, mov pattern): Remove Mem16 restriction from - mov to allow instructions like mov ss,xyz(ecx) to assemble. - -Tue May 25 00:39:40 1993 Ken Raeburn (raeburn@cygnus.com) - - * hppa.h: Use new version from Utah if OLD_TABLE isn't defined; - gdb will define it for now. - -Mon May 24 15:20:06 1993 Ken Raeburn (raeburn@cambridge.cygnus.com) - - * sparc.h: Don't end enumerator list with comma. - -Fri May 14 15:15:50 1993 Ian Lance Taylor (ian@cygnus.com) - - * Based on patches from davidj@ICSI.Berkeley.EDU (David Johnson): - * mips.h (OP_MASK_COPZ, OP_SH_COPZ): Define. - ("bc2t"): Correct typo. - ("[ls]wc[023]"): Use T rather than t. - ("c[0123]"): Define general coprocessor instructions. - -Mon May 10 06:02:25 1993 Ken Raeburn (raeburn@kr-pc.cygnus.com) - - * m68k.h: Move split point for gcc compilation more towards - middle. - -Fri Apr 9 13:26:16 1993 Jim Kingdon (kingdon@cygnus.com) - - * rs6k.h: Clean up instructions for primary opcode 19 (many were - simply wrong, ics, rfi, & rfsvc were missing). - Add "a" to opr_ext for "bb". Doc fix. - -Thu Mar 18 13:45:31 1993 Per Bothner (bothner@rtl.cygnus.com) - - * i386.h: 486 extensions from John Hassey (hassey@dg-rtp.dg.com). - * mips.h: Add casts, to suppress warnings about shifting too much. - * m68k.h: Document the placement code '9'. - -Thu Feb 18 02:03:14 1993 John Gilmore (gnu@cygnus.com) - - * m68k.h (BREAK_UP_BIG_DECL, AND_OTHER_PART): Add kludge which - allows callers to break up the large initialized struct full of - opcodes into two half-sized ones. This permits GCC to compile - this module, since it takes exponential space for initializers. - (numopcodes, endop): Revise to use AND_OTHER_PART in size calcs. - -Thu Feb 4 02:06:56 1993 John Gilmore (gnu@cygnus.com) - - * a29k.h: Remove RCS crud, update GPL to v2, update copyrights. - * convex.h: Added, from GDB's convx-opcode.h. Added CONST to all - initialized structs in it. - -Thu Jan 28 21:32:22 1993 John Gilmore (gnu@cygnus.com) - - Delta 88 changes inspired by Carl Greco, <cgreco@Creighton.Edu>: - * m88k.h (PMEM): Avoid previous definition from <sys/param.h>. - (AND): Change to AND_ to avoid ansidecl.h `AND' conflict. - -Sat Jan 23 18:10:49 PST 1993 Ralph Campbell (ralphc@pyramid.com) - - * mips.h: document "i" and "j" operands correctly. - -Thu Jan 7 15:58:13 1993 Ian Lance Taylor (ian@tweedledumb.cygnus.com) - - * mips.h: Removed endianness dependency. - -Sun Jan 3 14:13:35 1993 Steve Chamberlain (sac@thepub.cygnus.com) - - * h8300.h: include info on number of cycles per instruction. - -Mon Dec 21 21:29:08 1992 Stu Grossman (grossman at cygnus.com) - - * hppa.h: Move handy aliases to the front. Fix masks for extract - and deposit instructions. - -Sat Dec 12 16:09:48 1992 Ian Lance Taylor (ian@cygnus.com) - - * i386.h: accept shld and shrd both with and without the shift - count argument, which is always %cl. - -Fri Nov 27 17:13:18 1992 Ken Raeburn (raeburn at cygnus.com) - - * i386.h (i386_optab_end, i386_regtab_end): Now const. - (one_byte_segment_defaults, two_byte_segment_defaults, - i386_prefixtab_end): Ditto. - -Mon Nov 23 10:47:25 1992 Ken Raeburn (raeburn@cygnus.com) - - * vax.h (bb*): Use "v" (bitfield type), not "a" (address operand) - for operand 2; from John Carr, jfc@dsg.dec.com. - -Wed Nov 4 07:36:49 1992 Ken Raeburn (raeburn@cygnus.com) - - * m68k.h: Define FIXED_SIZE_BRANCH, so bsr and bra instructions - always use 16-bit offsets. Makes calculated-size jump tables - feasible. - -Fri Oct 16 22:52:43 1992 Ken Raeburn (raeburn@cygnus.com) - - * i386.h: Fix one-operand forms of in* and out* patterns. - -Tue Sep 22 14:08:14 1992 Ken Raeburn (raeburn@cambridge.cygnus.com) - - * m68k.h: Added CPU32 support. - -Tue Sep 22 00:38:41 1992 John Gilmore (gnu@cygnus.com) - - * mips.h (break): Disassemble the argument. Patch from - jonathan@cs.stanford.edu (Jonathan Stone). - -Wed Sep 9 11:25:28 1992 Ian Lance Taylor (ian@cygnus.com) - - * m68k.h: merged Motorola and MIT syntax. - -Thu Sep 3 09:33:22 1992 Steve Chamberlain (sac@thepub.cygnus.com) - - * m68k.h (pmove): make the tests less strict, the 68k book is - wrong. - -Tue Aug 25 23:25:19 1992 Ken Raeburn (raeburn@cambridge.cygnus.com) - - * m68k.h (m68ec030): Defined as alias for 68030. - (m68k_opcodes): New type characters "3" for 68030 MMU regs and "t" - for immediate 0-7 added. Set up some opcodes (ptest, bkpt) to use - them. Tightened description of "fmovex" to distinguish it from - some "pmove" encodings. Added "pmove" for 68030 MMU regs, cleaned - up descriptions that claimed versions were available for chips not - supporting them. Added "pmovefd". - -Mon Aug 24 12:04:51 1992 Steve Chamberlain (sac@thepub.cygnus.com) - - * m68k.h: fix where the . goes in divull - -Wed Aug 19 11:22:24 1992 Ian Lance Taylor (ian@cygnus.com) - - * m68k.h: the cas2 instruction is supposed to be written with - indirection on the last two operands, which can be either data or - address registers. Added a new operand type 'r' which accepts - either register type. Added new cases for cas2l and cas2w which - use them. Corrected masks for cas2 which failed to recognize use - of address register. - -Fri Aug 14 14:20:38 1992 Per Bothner (bothner@cygnus.com) - - * m68k.h: Merged in patches (mostly m68040-specific) from - Colin Smith <colin@wrs.com>. - - * m68k.h: Merged m68kmri.h and m68k.h (using the former as a - base). Also cleaned up duplicates, re-ordered instructions for - the sake of dis-assembling (so aliases come after standard names). - * m68kmri.h: Now just defines some macros, and #includes m68k.h. - -Wed Aug 12 16:38:15 1992 Steve Chamberlain (sac@thepub.cygnus.com) - - * m68kmri.h: added various opcodes. Moved jbxx to bxxes. Filled in - all missing .s - -Mon Aug 10 23:22:33 1992 Ken Raeburn (raeburn@cygnus.com) - - * sparc.h: Moved tables to BFD library. - - * i386.h (i386_optab): Add fildq, fistpq aliases used by gcc. - -Sun Jun 28 13:29:03 1992 Fred Fish (fnf@cygnus.com) - - * h8300.h: Finish filling in all the holes in the opcode table, - so that the Lucid C compiler can digest this as well... - -Fri Jun 26 21:27:17 1992 John Gilmore (gnu at cygnus.com) - - * i386.h: Add setc, setnc, addr16, data16, repz, repnz aliases. - Fix opcodes on various sizes of fild/fist instructions - (16bit=no suffix, 32bit="l" suffix, 64bit="ll" suffix). - Use tabs to indent for comments. Fixes suggested by Minh Tran-Le. - -Thu Jun 25 16:13:26 1992 Stu Grossman (grossman at cygnus.com) - - * h8300.h: Fill in all the holes in the opcode table so that the - losing HPUX C compiler can digest this... - -Thu Jun 11 12:15:25 1992 John Gilmore (gnu at cygnus.com) - - * mips.h: Fix decoding of coprocessor instructions, somewhat. - (Fix by Eric Anderson, 3jean@maas-neotek.arc.nasa.gov.) - -Thu May 28 11:17:44 1992 Jim Wilson (wilson@sphagnum.cygnus.com) - - * sparc.h: Add new architecture variant sparclite; add its scan - and divscc opcodes. Define ARCHITECTURES_CONFLICT_P macro. - -Tue May 5 14:23:27 1992 Per Bothner (bothner@rtl.cygnus.com) - - * mips.h: Add some more opcode synonyms (from Frank Yellin, - fy@lucid.com). - -Thu Apr 16 18:25:26 1992 Per Bothner (bothner@cygnus.com) - - * rs6k.h: New version from IBM (Metin). - -Thu Apr 9 00:31:19 1992 Per Bothner (bothner@rtl.cygnus.com) - - * rs6k.h: Fix incorrect extended opcode for instructions `fm' - and `fd'. (From metin@ibmpa.awdpa.ibm.com (Metin G. Ozisik).) - -Tue Apr 7 13:38:47 1992 Stu Grossman (grossman at cygnus.com) - - * rs6k.h: Move from ../../gdb/rs6k-opcode.h. - -Fri Apr 3 11:30:20 1992 Fred Fish (fnf@cygnus.com) - - * m68k.h (one, two): Cast macro args to unsigned to suppress - complaints from compiler and lint about integer overflow during - shift. - -Sun Mar 29 12:22:08 1992 John Gilmore (gnu at cygnus.com) - - * sparc.h (OP): Avoid signed overflow when shifting to high order bit. - -Fri Mar 6 00:22:38 1992 John Gilmore (gnu at cygnus.com) - - * mips.h: Make bitfield layout depend on the HOST compiler, - not on the TARGET system. - -Fri Feb 21 01:29:51 1992 K. Richard Pixley (rich@cygnus.com) - - * i386.h: added inb, inw, outb, outw opcodes, added att syntax for - scmp, slod, smov, ssca, ssto. Curtesy Minh Tran-Le - <TRANLE@INTELLICORP.COM>. - -Thu Jan 30 07:31:44 1992 Steve Chamberlain (sac at rtl.cygnus.com) - - * h8300.h: turned op_type enum into #define list - -Thu Jan 30 01:07:24 1992 John Gilmore (gnu at cygnus.com) - - * sparc.h: Remove "cypress" architecture. Remove "fitox" and - similar instructions -- they've been renamed to "fitoq", etc. - REALLY fix tsubcctv. Fix "fcmpeq" and "fcmpq" which had wrong - number of arguments. - * h8300.h: Remove extra ; which produces compiler warning. - -Tue Jan 28 22:59:22 1992 Stu Grossman (grossman at cygnus.com) - - * sparc.h: fix opcode for tsubcctv. - -Tue Jan 7 17:19:39 1992 K. Richard Pixley (rich at cygnus.com) - - * sparc.h: fba and cba are now aliases for fb and cb respectively. - -Fri Dec 27 10:55:50 1991 Per Bothner (bothner at cygnus.com) - - * sparc.h (nop): Made the 'lose' field be even tighter, - so only a standard 'nop' is disassembled as a nop. - -Sun Dec 22 12:18:18 1991 Michael Tiemann (tiemann at cygnus.com) - - * sparc.h (nop): Add RD_GO to `lose' so that only %g0 in dest is - disassembled as a nop. - -Tue Dec 10 00:22:20 1991 K. Richard Pixley (rich at rtl.cygnus.com) - - * sparc.h: fix a typo. - -Sat Nov 30 20:40:51 1991 Steve Chamberlain (sac at rtl.cygnus.com) - - * a29k.h, arm.h, h8300.h, i386.h, i860.h, i960.h , m68k.h, - m88k.h, mips.h , np1.h, ns32k.h, pn.h, pyr.h, sparc.h, tahoe.h, - vax.h, ChangeLog: renamed from ../<foo>-opcode.h - - -Local Variables: -version-control: never -End: diff --git a/contrib/gdb/include/opcode/a29k.h b/contrib/gdb/include/opcode/a29k.h deleted file mode 100644 index 002e127d15ef4..0000000000000 --- a/contrib/gdb/include/opcode/a29k.h +++ /dev/null @@ -1,285 +0,0 @@ -/* Table of opcodes for the AMD 29000 family. - Copyright 1990, 1991, 1992, 1993 Free Software Foundation, Inc. - -This file is part of GDB and GAS. - -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 2 of the License, 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ - -struct a29k_opcode { - /* Name of the instruction. */ - char *name; - - /* Opcode word */ - unsigned long opcode; - - /* A string of characters which describe the operands. - Valid characters are: - , Itself. The character appears in the assembly code. - a RA. The register number is in bits 8-15 of the instruction. - b RB. The register number is in bits 0-7 of the instruction. - c RC. The register number is in bits 16-23 of the instruction. - i An immediate operand is in bits 0-7 of the instruction. - x Bits 0-7 and 16-23 of the instruction are bits 0-7 and 8-15 - (respectively) of the immediate operand. - h Same as x but the instruction contains bits 16-31 of the - immediate operand. - X Same as x but bits 16-31 of the signed immediate operand - are set to 1 (thus the operand is always negative). - P,A Bits 0-7 and 16-23 of the instruction are bits 2-9 and 10-17 - (respectively) of the immediate operand. - P=PC-relative, sign-extended to 32 bits. - A=Absolute, zero-extended to 32 bits. - e CE bit (bit 23) for a load/store instruction. - n Control field (bits 16-22) for a load/store instruction. - v Immediate operand in bits 16-23 of the instruction. - (used for trap numbers). - s SA. Special-purpose register number in bits 8-15 - of the instruction. - u UI--bit 7 of the instruction. - r RND--bits 4-6 of the instruction. - d FD--bits 2-3 of the instruction. - f FS--bits 0-1 of the instruction. - I ID--bits 16-17 of the instruction. - - Extensions for 29050: - - d FMT--bits 2-3 of the instruction (not really new). - f ACN--bits 0-1 of the instruction (not really new). - F FUNC--Special function in bits 18-21 of the instruction. - C ACN--bits 16-17 specifying the accumlator register. */ - char *args; -}; - -#ifndef CONST -#define CONST -#endif /* CONST */ - -static CONST struct a29k_opcode a29k_opcodes[] = -{ - -{ "add", 0x14000000, "c,a,b" }, -{ "add", 0x15000000, "c,a,i" }, -{ "addc", 0x1c000000, "c,a,b" }, -{ "addc", 0x1d000000, "c,a,i" }, -{ "addcs", 0x18000000, "c,a,b" }, -{ "addcs", 0x19000000, "c,a,i" }, -{ "addcu", 0x1a000000, "c,a,b" }, -{ "addcu", 0x1b000000, "c,a,i" }, -{ "adds", 0x10000000, "c,a,b" }, -{ "adds", 0x11000000, "c,a,i" }, -{ "addu", 0x12000000, "c,a,b" }, -{ "addu", 0x13000000, "c,a,i" }, -{ "and", 0x90000000, "c,a,b" }, -{ "and", 0x91000000, "c,a,i" }, -{ "andn", 0x9c000000, "c,a,b" }, -{ "andn", 0x9d000000, "c,a,i" }, -{ "aseq", 0x70000000, "v,a,b" }, -{ "aseq", 0x71000000, "v,a,i" }, -{ "asge", 0x5c000000, "v,a,b" }, -{ "asge", 0x5d000000, "v,a,i" }, -{ "asgeu", 0x5e000000, "v,a,b" }, -{ "asgeu", 0x5f000000, "v,a,i" }, -{ "asgt", 0x58000000, "v,a,b" }, -{ "asgt", 0x59000000, "v,a,i" }, -{ "asgtu", 0x5a000000, "v,a,b" }, -{ "asgtu", 0x5b000000, "v,a,i" }, -{ "asle", 0x54000000, "v,a,b" }, -{ "asle", 0x55000000, "v,a,i" }, -{ "asleu", 0x56000000, "v,a,b" }, -{ "asleu", 0x57000000, "v,a,i" }, -{ "aslt", 0x50000000, "v,a,b" }, -{ "aslt", 0x51000000, "v,a,i" }, -{ "asltu", 0x52000000, "v,a,b" }, -{ "asltu", 0x53000000, "v,a,i" }, -{ "asneq", 0x72000000, "v,a,b" }, -{ "asneq", 0x73000000, "v,a,i" }, -{ "call", 0xa8000000, "a,P" }, -{ "call", 0xa9000000, "a,A" }, -{ "calli", 0xc8000000, "a,b" }, -{ "class", 0xe6000000, "c,a,f" }, -{ "clz", 0x08000000, "c,b" }, -{ "clz", 0x09000000, "c,i" }, -{ "const", 0x03000000, "a,x" }, -{ "consth", 0x02000000, "a,h" }, -{ "consthz", 0x05000000, "a,h" }, -{ "constn", 0x01000000, "a,X" }, -{ "convert", 0xe4000000, "c,a,u,r,d,f" }, -{ "cpbyte", 0x2e000000, "c,a,b" }, -{ "cpbyte", 0x2f000000, "c,a,i" }, -{ "cpeq", 0x60000000, "c,a,b" }, -{ "cpeq", 0x61000000, "c,a,i" }, -{ "cpge", 0x4c000000, "c,a,b" }, -{ "cpge", 0x4d000000, "c,a,i" }, -{ "cpgeu", 0x4e000000, "c,a,b" }, -{ "cpgeu", 0x4f000000, "c,a,i" }, -{ "cpgt", 0x48000000, "c,a,b" }, -{ "cpgt", 0x49000000, "c,a,i" }, -{ "cpgtu", 0x4a000000, "c,a,b" }, -{ "cpgtu", 0x4b000000, "c,a,i" }, -{ "cple", 0x44000000, "c,a,b" }, -{ "cple", 0x45000000, "c,a,i" }, -{ "cpleu", 0x46000000, "c,a,b" }, -{ "cpleu", 0x47000000, "c,a,i" }, -{ "cplt", 0x40000000, "c,a,b" }, -{ "cplt", 0x41000000, "c,a,i" }, -{ "cpltu", 0x42000000, "c,a,b" }, -{ "cpltu", 0x43000000, "c,a,i" }, -{ "cpneq", 0x62000000, "c,a,b" }, -{ "cpneq", 0x63000000, "c,a,i" }, -{ "dadd", 0xf1000000, "c,a,b" }, -{ "ddiv", 0xf7000000, "c,a,b" }, -{ "deq", 0xeb000000, "c,a,b" }, -{ "dge", 0xef000000, "c,a,b" }, -{ "dgt", 0xed000000, "c,a,b" }, -{ "div", 0x6a000000, "c,a,b" }, -{ "div", 0x6b000000, "c,a,i" }, -{ "div0", 0x68000000, "c,b" }, -{ "div0", 0x69000000, "c,i" }, -{ "divide", 0xe1000000, "c,a,b" }, -{ "dividu", 0xe3000000, "c,a,b" }, -{ "divl", 0x6c000000, "c,a,b" }, -{ "divl", 0x6d000000, "c,a,i" }, -{ "divrem", 0x6e000000, "c,a,b" }, -{ "divrem", 0x6f000000, "c,a,i" }, -{ "dmac", 0xd9000000, "F,C,a,b" }, -{ "dmsm", 0xdb000000, "c,a,b" }, -{ "dmul", 0xf5000000, "c,a,b" }, -{ "dsub", 0xf3000000, "c,a,b" }, -{ "emulate", 0xd7000000, "v,a,b" }, -{ "exbyte", 0x0a000000, "c,a,b" }, -{ "exbyte", 0x0b000000, "c,a,i" }, -{ "exhw", 0x7c000000, "c,a,b" }, -{ "exhw", 0x7d000000, "c,a,i" }, -{ "exhws", 0x7e000000, "c,a" }, -{ "extract", 0x7a000000, "c,a,b" }, -{ "extract", 0x7b000000, "c,a,i" }, -{ "fadd", 0xf0000000, "c,a,b" }, -{ "fdiv", 0xf6000000, "c,a,b" }, -{ "fdmul", 0xf9000000, "c,a,b" }, -{ "feq", 0xea000000, "c,a,b" }, -{ "fge", 0xee000000, "c,a,b" }, -{ "fgt", 0xec000000, "c,a,b" }, -{ "fmac", 0xd8000000, "F,C,a,b" }, -{ "fmsm", 0xda000000, "c,a,b" }, -{ "fmul", 0xf4000000, "c,a,b" }, -{ "fsub", 0xf2000000, "c,a,b" }, -{ "halt", 0x89000000, "" }, -{ "inbyte", 0x0c000000, "c,a,b" }, -{ "inbyte", 0x0d000000, "c,a,i" }, -{ "inhw", 0x78000000, "c,a,b" }, -{ "inhw", 0x79000000, "c,a,i" }, -{ "inv", 0x9f000000, "I" }, -{ "iret", 0x88000000, "" }, -{ "iretinv", 0x8c000000, "I" }, -{ "jmp", 0xa0000000, "P" }, -{ "jmp", 0xa1000000, "A" }, -{ "jmpf", 0xa4000000, "a,P" }, -{ "jmpf", 0xa5000000, "a,A" }, -{ "jmpfdec", 0xb4000000, "a,P" }, -{ "jmpfdec", 0xb5000000, "a,A" }, -{ "jmpfi", 0xc4000000, "a,b" }, -{ "jmpi", 0xc0000000, "b" }, -{ "jmpt", 0xac000000, "a,P" }, -{ "jmpt", 0xad000000, "a,A" }, -{ "jmpti", 0xcc000000, "a,b" }, -{ "load", 0x16000000, "e,n,a,b" }, -{ "load", 0x17000000, "e,n,a,i" }, -{ "loadl", 0x06000000, "e,n,a,b" }, -{ "loadl", 0x07000000, "e,n,a,i" }, -{ "loadm", 0x36000000, "e,n,a,b" }, -{ "loadm", 0x37000000, "e,n,a,i" }, -{ "loadset", 0x26000000, "e,n,a,b" }, -{ "loadset", 0x27000000, "e,n,a,i" }, -{ "mfacc", 0xe9000100, "c,d,f" }, -{ "mfsr", 0xc6000000, "c,s" }, -{ "mftlb", 0xb6000000, "c,a" }, -{ "mtacc", 0xe8010000, "a,d,f" }, -{ "mtsr", 0xce000000, "s,b" }, -{ "mtsrim", 0x04000000, "s,x" }, -{ "mttlb", 0xbe000000, "a,b" }, -{ "mul", 0x64000000, "c,a,b" }, -{ "mul", 0x65000000, "c,a,i" }, -{ "mull", 0x66000000, "c,a,b" }, -{ "mull", 0x67000000, "c,a,i" }, -{ "multiplu", 0xe2000000, "c,a,b" }, -{ "multiply", 0xe0000000, "c,a,b" }, -{ "multm", 0xde000000, "c,a,b" }, -{ "multmu", 0xdf000000, "c,a,b" }, -{ "mulu", 0x74000000, "c,a,b" }, -{ "mulu", 0x75000000, "c,a,i" }, -{ "nand", 0x9a000000, "c,a,b" }, -{ "nand", 0x9b000000, "c,a,i" }, -{ "nop", 0x70400101, "" }, -{ "nor", 0x98000000, "c,a,b" }, -{ "nor", 0x99000000, "c,a,i" }, -{ "or", 0x92000000, "c,a,b" }, -{ "or", 0x93000000, "c,a,i" }, -{ "orn", 0xaa000000, "c,a,b" }, -{ "orn", 0xab000000, "c,a,i" }, - -/* The description of "setip" in Chapter 8 ("instruction set") of the user's - manual claims that these are absolute register numbers. But section - 7.2.1 explains that they are not. The latter is correct, so print - these normally ("lr0", "lr5", etc.). */ -{ "setip", 0x9e000000, "c,a,b" }, - -{ "sll", 0x80000000, "c,a,b" }, -{ "sll", 0x81000000, "c,a,i" }, -{ "sqrt", 0xe5000000, "c,a,f" }, -{ "sra", 0x86000000, "c,a,b" }, -{ "sra", 0x87000000, "c,a,i" }, -{ "srl", 0x82000000, "c,a,b" }, -{ "srl", 0x83000000, "c,a,i" }, -{ "store", 0x1e000000, "e,n,a,b" }, -{ "store", 0x1f000000, "e,n,a,i" }, -{ "storel", 0x0e000000, "e,n,a,b" }, -{ "storel", 0x0f000000, "e,n,a,i" }, -{ "storem", 0x3e000000, "e,n,a,b" }, -{ "storem", 0x3f000000, "e,n,a,i" }, -{ "sub", 0x24000000, "c,a,b" }, -{ "sub", 0x25000000, "c,a,i" }, -{ "subc", 0x2c000000, "c,a,b" }, -{ "subc", 0x2d000000, "c,a,i" }, -{ "subcs", 0x28000000, "c,a,b" }, -{ "subcs", 0x29000000, "c,a,i" }, -{ "subcu", 0x2a000000, "c,a,b" }, -{ "subcu", 0x2b000000, "c,a,i" }, -{ "subr", 0x34000000, "c,a,b" }, -{ "subr", 0x35000000, "c,a,i" }, -{ "subrc", 0x3c000000, "c,a,b" }, -{ "subrc", 0x3d000000, "c,a,i" }, -{ "subrcs", 0x38000000, "c,a,b" }, -{ "subrcs", 0x39000000, "c,a,i" }, -{ "subrcu", 0x3a000000, "c,a,b" }, -{ "subrcu", 0x3b000000, "c,a,i" }, -{ "subrs", 0x30000000, "c,a,b" }, -{ "subrs", 0x31000000, "c,a,i" }, -{ "subru", 0x32000000, "c,a,b" }, -{ "subru", 0x33000000, "c,a,i" }, -{ "subs", 0x20000000, "c,a,b" }, -{ "subs", 0x21000000, "c,a,i" }, -{ "subu", 0x22000000, "c,a,b" }, -{ "subu", 0x23000000, "c,a,i" }, -{ "xnor", 0x96000000, "c,a,b" }, -{ "xnor", 0x97000000, "c,a,i" }, -{ "xor", 0x94000000, "c,a,b" }, -{ "xor", 0x95000000, "c,a,i" }, - -{ "", 0x0, "" } /* Dummy entry, not included in NUM_OPCODES. This - lets code examine entry i+1 without checking - if we've run off the end of the table. */ -}; - -CONST unsigned int num_opcodes = (((sizeof a29k_opcodes) / (sizeof a29k_opcodes[0])) - 1); diff --git a/contrib/gdb/include/opcode/arm.h b/contrib/gdb/include/opcode/arm.h deleted file mode 100644 index c7087eb9ed4c2..0000000000000 --- a/contrib/gdb/include/opcode/arm.h +++ /dev/null @@ -1,294 +0,0 @@ -/* ARM opcode list. - Copyright (C) 1989, Free Software Foundation, Inc. - -This file is part of GDB and GAS. - -GDB and GAS are 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. - -GDB and GAS are 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 GDB or GAS; see the file COPYING. If not, write to -the Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ - -/* types of instruction (encoded in bits 26 and 27 of the instruction) */ - -#define TYPE_ARITHMETIC 0 -#define TYPE_LDR_STR 1 -#define TYPE_BLOCK_BRANCH 2 -#define TYPE_SWI 3 - -/* bit 25 decides whether an instruction is a block move or a branch */ -#define SUBTYPE_BLOCK 0 -#define SUBTYPE_BRANCH 1 - -/* codes to distinguish the arithmetic instructions */ - -#define OPCODE_AND 0 -#define OPCODE_EOR 1 -#define OPCODE_SUB 2 -#define OPCODE_RSB 3 -#define OPCODE_ADD 4 -#define OPCODE_ADC 5 -#define OPCODE_SBC 6 -#define OPCODE_RSC 7 -#define OPCODE_TST 8 -#define OPCODE_TEQ 9 -#define OPCODE_CMP 10 -#define OPCODE_CMN 11 -#define OPCODE_ORR 12 -#define OPCODE_MOV 13 -#define OPCODE_BIC 14 -#define OPCODE_MVN 15 - -/* condition codes */ - -#define COND_EQ 0 -#define COND_NE 1 -#define COND_CS 2 -#define COND_CC 3 -#define COND_MI 4 -#define COND_PL 5 -#define COND_VS 6 -#define COND_VC 7 -#define COND_HI 8 -#define COND_LS 9 -#define COND_GE 10 -#define COND_LT 11 -#define COND_GT 12 -#define COND_LE 13 -#define COND_AL 14 -#define COND_NV 15 - -/* Describes the format of an ARM machine instruction */ - -struct generic_fmt { - unsigned rest :25; /* the rest of the instruction */ - unsigned subtype :1; /* used to decide between block and branch */ - unsigned type :2; /* one of TYPE_* */ - unsigned cond :4; /* one of COND_* defined above */ -}; - -struct arith_fmt { - unsigned operand2 :12; /* #nn or rn or rn shift #m or rn shift rm */ - unsigned dest :4; /* place where the answer goes */ - unsigned operand1 :4; /* first operand to instruction */ - unsigned set :1; /* == 1 means set processor flags */ - unsigned opcode :4; /* one of OPCODE_* defined above */ - unsigned immed :1; /* operand2 is an immediate value */ - unsigned type :2; /* == TYPE_ARITHMETIC */ - unsigned cond :4; /* one of COND_* defined above */ -}; - -struct ldr_str_fmt { - unsigned offset :12; /* #nn or rn or rn shift #m */ - unsigned reg :4; /* destination for LDR, source for STR */ - unsigned base :4; /* base register */ - unsigned is_load :1; /* == 1 for LDR */ - unsigned writeback :1; /* == 1 means write back (base+offset) into base */ - unsigned byte :1; /* == 1 means byte access else word */ - unsigned up :1; /* == 1 means add offset else subtract it */ - unsigned pre_index :1; /* == 1 means [a,b] form else [a],b form */ - unsigned immed :1; /* == 0 means immediate offset */ - unsigned type :2; /* == TYPE_LDR_STR */ - unsigned cond :4; /* one of COND_* defined above */ -}; - -struct block_fmt { - unsigned mask :16; /* register mask */ - unsigned base :4; /* register used as base of move */ - unsigned is_load :1; /* == 1 for LDM */ - unsigned writeback :1; /* == 1 means update base after move */ - unsigned set :1; /* == 1 means set flags in pc if included in mask */ - unsigned increment :1; /* == 1 means increment base register */ - unsigned before :1; /* == 1 means inc/dec before each move */ - unsigned is_block :1; /* == SUBTYPE_BLOCK */ - unsigned type :2; /* == TYPE_BLOCK_BRANCH */ - unsigned cond :4; /* one of COND_* defined above */ -}; - -struct branch_fmt { - unsigned dest :24; /* destination of the branch */ - unsigned link :1; /* branch with link (function call) */ - unsigned is_branch :1; /* == SUBTYPE_BRANCH */ - unsigned type :2; /* == TYPE_BLOCK_BRANCH */ - unsigned cond :4; /* one of COND_* defined above */ -}; - -#define ROUND_N 0 -#define ROUND_P 1 -#define ROUND_M 2 -#define ROUND_Z 3 - -#define FLOAT2_MVF 0 -#define FLOAT2_MNF 1 -#define FLOAT2_ABS 2 -#define FLOAT2_RND 3 -#define FLOAT2_SQT 4 -#define FLOAT2_LOG 5 -#define FLOAT2_LGN 6 -#define FLOAT2_EXP 7 -#define FLOAT2_SIN 8 -#define FLOAT2_COS 9 -#define FLOAT2_TAN 10 -#define FLOAT2_ASN 11 -#define FLOAT2_ACS 12 -#define FLOAT2_ATN 13 - -#define FLOAT3_ADF 0 -#define FLOAT3_MUF 1 -#define FLOAT3_SUF 2 -#define FLOAT3_RSF 3 -#define FLOAT3_DVF 4 -#define FLOAT3_RDF 5 -#define FLOAT3_POW 6 -#define FLOAT3_RPW 7 -#define FLOAT3_RMF 8 -#define FLOAT3_FML 9 -#define FLOAT3_FDV 10 -#define FLOAT3_FRD 11 -#define FLOAT3_POL 12 - -struct float2_fmt { - unsigned operand2 :3; /* second operand */ - unsigned immed :1; /* == 1 if second operand is a constant */ - unsigned pad1 :1; /* == 0 */ - unsigned rounding :2; /* ROUND_* */ - unsigned is_double :1; /* == 1 if precision is double (only if not extended) */ - unsigned pad2 :4; /* == 1 */ - unsigned dest :3; /* destination */ - unsigned is_2_op :1; /* == 1 if 2 operand ins */ - unsigned operand1 :3; /* first operand (only of is_2_op == 0) */ - unsigned is_extended :1; /* == 1 if precision is extended */ - unsigned opcode :4; /* FLOAT2_* or FLOAT3_* depending on is_2_op */ - unsigned must_be_2 :2; /* == 2 */ - unsigned type :2; /* == TYPE_SWI */ - unsigned cond :4; /* COND_* */ -}; - -struct swi_fmt { - unsigned argument :24; /* argument to SWI (syscall number) */ - unsigned must_be_3 :2; /* == 3 */ - unsigned type :2; /* == TYPE_SWI */ - unsigned cond :4; /* one of COND_* defined above */ -}; - -union insn_fmt { - struct generic_fmt generic; - struct arith_fmt arith; - struct ldr_str_fmt ldr_str; - struct block_fmt block; - struct branch_fmt branch; - struct swi_fmt swi; - unsigned long ins; -}; - -struct opcode { - unsigned long value, mask; /* recognise instruction if (op&mask)==value */ - char *assembler; /* how to disassemble this instruction */ -}; - -/* format of the assembler string : - - %% % - %<bitfield>d print the bitfield in decimal - %<bitfield>x print the bitfield in hex - %<bitfield>r print as an ARM register - %<bitfield>f print a floating point constant if >7 else an fp register - %c print condition code (always bits 28-31) - %P print floating point precision in arithmetic insn - %Q print floating point precision in ldf/stf insn - %R print floating point rounding mode - %<bitnum>'c print specified char iff bit is one - %<bitnum>`c print specified char iff bit is zero - %<bitnum>?ab print a if bit is one else print b - %p print 'p' iff bits 12-15 are 15 - %o print operand2 (immediate or register + shift) - %a print address for ldr/str instruction - %b print branch destination - %A print address for ldc/stc/ldf/stf instruction - %m print register mask for ldm/stm instruction -*/ - -static struct opcode opcodes[] = { - /* ARM instructions */ - 0x00000090, 0x0fe000f0, "mul%20's %12-15r, %16-19r, %0-3r", - 0x00200090, 0x0fe000f0, "mla%20's %12-15r, %16-19r, %0-3r, %8-11r", - 0x00000000, 0x0de00000, "and%c%20's %12-15r, %16-19r, %o", - 0x00200000, 0x0de00000, "eor%c%20's %12-15r, %16-19r, %o", - 0x00400000, 0x0de00000, "sub%c%20's %12-15r, %16-19r, %o", - 0x00600000, 0x0de00000, "rsb%c%20's %12-15r, %16-19r, %o", - 0x00800000, 0x0de00000, "add%c%20's %12-15r, %16-19r, %o", - 0x00a00000, 0x0de00000, "adc%c%20's %12-15r, %16-19r, %o", - 0x00c00000, 0x0de00000, "sbc%c%20's %12-15r, %16-19r, %o", - 0x00e00000, 0x0de00000, "rsc%c%20's %12-15r, %16-19r, %o", - 0x01000000, 0x0de00000, "tst%c%p %16-19r, %o", - 0x01200000, 0x0de00000, "teq%c%p %16-19r, %o", - 0x01400000, 0x0de00000, "cmp%c%p %16-19r, %o", - 0x01600000, 0x0de00000, "cmn%c%p %16-19r, %o", - 0x01800000, 0x0de00000, "orr%c%20's %12-15r, %16-19r, %o", - 0x01a00000, 0x0de00000, "mov%c%20's %12-15r, %o", - 0x01c00000, 0x0de00000, "bic%c%20's %12-15r, %16-19r, %o", - 0x01e00000, 0x0de00000, "mvn%c%20's %12-15r, %o", - 0x04000000, 0x0c100000, "str%c%22'b %12-15r, %a", - 0x04100000, 0x0c100000, "ldr%c%22'b %12-15r, %a", - 0x08000000, 0x0e100000, "stm%c%23?id%24?ba %16-19r%22`!, %m", - 0x08100000, 0x0e100000, "ldm%c%23?id%24?ba %16-19r%22`!, %m%22'^", - 0x0a000000, 0x0e000000, "b%c%24'l %b", - 0x0f000000, 0x0f000000, "swi%c %0-23x", - /* Floating point coprocessor instructions */ - 0x0e000100, 0x0ff08f10, "adf%c%P%R %12-14f, %16-18f, %0-3f", - 0x0e100100, 0x0ff08f10, "muf%c%P%R %12-14f, %16-18f, %0-3f", - 0x0e200100, 0x0ff08f10, "suf%c%P%R %12-14f, %16-18f, %0-3f", - 0x0e300100, 0x0ff08f10, "rsf%c%P%R %12-14f, %16-18f, %0-3f", - 0x0e400100, 0x0ff08f10, "dvf%c%P%R %12-14f, %16-18f, %0-3f", - 0x0e500100, 0x0ff08f10, "rdf%c%P%R %12-14f, %16-18f, %0-3f", - 0x0e600100, 0x0ff08f10, "pow%c%P%R %12-14f, %16-18f, %0-3f", - 0x0e700100, 0x0ff08f10, "rpw%c%P%R %12-14f, %16-18f, %0-3f", - 0x0e800100, 0x0ff08f10, "rmf%c%P%R %12-14f, %16-18f, %0-3f", - 0x0e900100, 0x0ff08f10, "fml%c%P%R %12-14f, %16-18f, %0-3f", - 0x0ea00100, 0x0ff08f10, "fdv%c%P%R %12-14f, %16-18f, %0-3f", - 0x0eb00100, 0x0ff08f10, "frd%c%P%R %12-14f, %16-18f, %0-3f", - 0x0ec00100, 0x0ff08f10, "pol%c%P%R %12-14f, %16-18f, %0-3f", - 0x0e008100, 0x0ff08f10, "mvf%c%P%R %12-14f, %0-3f", - 0x0e108100, 0x0ff08f10, "mnf%c%P%R %12-14f, %0-3f", - 0x0e208100, 0x0ff08f10, "abs%c%P%R %12-14f, %0-3f", - 0x0e308100, 0x0ff08f10, "rnd%c%P%R %12-14f, %0-3f", - 0x0e408100, 0x0ff08f10, "sqt%c%P%R %12-14f, %0-3f", - 0x0e508100, 0x0ff08f10, "log%c%P%R %12-14f, %0-3f", - 0x0e608100, 0x0ff08f10, "lgn%c%P%R %12-14f, %0-3f", - 0x0e708100, 0x0ff08f10, "exp%c%P%R %12-14f, %0-3f", - 0x0e808100, 0x0ff08f10, "sin%c%P%R %12-14f, %0-3f", - 0x0e908100, 0x0ff08f10, "cos%c%P%R %12-14f, %0-3f", - 0x0ea08100, 0x0ff08f10, "tan%c%P%R %12-14f, %0-3f", - 0x0eb08100, 0x0ff08f10, "asn%c%P%R %12-14f, %0-3f", - 0x0ec08100, 0x0ff08f10, "acs%c%P%R %12-14f, %0-3f", - 0x0ed08100, 0x0ff08f10, "atn%c%P%R %12-14f, %0-3f", - 0x0e000110, 0x0ff00f1f, "flt%c%P%R %16-18f, %12-15r", - 0x0e100110, 0x0fff0f98, "fix%c%R %12-15r, %0-2f", - 0x0e200110, 0x0fff0fff, "wfs%c %12-15r", - 0x0e300110, 0x0fff0fff, "rfs%c %12-15r", - 0x0e400110, 0x0fff0fff, "wfc%c %12-15r", - 0x0e500110, 0x0fff0fff, "rfc%c %12-15r", - 0x0e90f110, 0x0ff8fff0, "cmf%c %16-18f, %0-3f", - 0x0eb0f110, 0x0ff8fff0, "cnf%c %16-18f, %0-3f", - 0x0ed0f110, 0x0ff8fff0, "cmfe%c %16-18f, %0-3f", - 0x0ef0f110, 0x0ff8fff0, "cnfe%c %16-18f, %0-3f", - 0x0c000100, 0x0e100f00, "stf%c%Q %12-14f, %A", - 0x0c100100, 0x0e100f00, "ldf%c%Q %12-14f, %A", - /* Generic coprocessor instructions */ - 0x0e000000, 0x0f000010, "cdp%c %8-11d, %20-23d, cr%12-15d, cr%16-19d, cr%0-3d, {%5-7d}", - 0x0e000010, 0x0f100010, "mrc%c %8-11d, %21-23d, %12-15r, cr%16-19d, cr%0-3d, {%5-7d}", - 0x0e100010, 0x0f100010, "mcr%c %8-11d, %21-23d, %12-15r, cr%16-19d, cr%0-3d, {%5-7d}", - 0x0c000000, 0x0e100000, "stc%c%22`l %8-11d, cr%12-15d, %A", - 0x0c100000, 0x0e100000, "ldc%c%22`l %8-11d, cr%12-15d, %A", - /* the rest */ - 0x00000000, 0x00000000, "undefined instruction %0-31x", -}; -#define N_OPCODES (sizeof opcodes / sizeof opcodes[0]) diff --git a/contrib/gdb/include/opcode/convex.h b/contrib/gdb/include/opcode/convex.h deleted file mode 100644 index efaeebb65a5f1..0000000000000 --- a/contrib/gdb/include/opcode/convex.h +++ /dev/null @@ -1,1711 +0,0 @@ -/* Information for instruction disassembly on the Convex. - Copyright 1989, 1993 Free Software Foundation. - -This file is part of GDB. - -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 2 of the License, 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ - -#ifndef CONST -#define CONST -#endif /* CONST */ - -#define xxx 0 -#define rrr 1 -#define rr 2 -#define rxr 3 -#define r 4 -#define nops 5 -#define nr 6 -#define pcrel 7 -#define lr 8 -#define rxl 9 -#define rlr 10 -#define rrl 11 -#define iml 12 -#define imr 13 -#define a1r 14 -#define a1l 15 -#define a2r 16 -#define a2l 17 -#define a3 18 -#define a4 19 -#define a5 20 -#define V 1 -#define S 2 -#define VM 3 -#define A 4 -#define VL 5 -#define VS 6 -#define VLS 7 -#define PSW 8 -/* Prevent an error during "make depend". */ -#if !defined (PC) -#define PC 9 -#endif -#define ITR 10 -#define VV 11 -#define ITSR 12 -#define TOC 13 -#define CIR 14 -#define TTR 15 -#define VMU 16 -#define VML 17 -#define ICR 18 -#define TCPU 19 -#define CPUID 20 -#define TID 21 - -CONST char *op[] = { - "", - "v0\0v1\0v2\0v3\0v4\0v5\0v6\0v7", - "s0\0s1\0s2\0s3\0s4\0s5\0s6\0s7", - "vm", - "sp\0a1\0a2\0a3\0a4\0a5\0ap\0fp", - "vl", - "vs", - "vls", - "psw", - "pc", - "itr", - "vv", - "itsr", - "toc", - "cir", - "ttr", - "vmu", - "vml", - "icr", - "tcpu", - "cpuid", - "tid", -}; - -CONST struct formstr format0[] = { - {0,0,rrr,V,S,S}, /* mov */ - {0,0,rrr,S,S,V}, /* mov */ - {1,1,rrr,V,V,V}, /* merg.t */ - {2,1,rrr,V,V,V}, /* mask.t */ - {1,2,rrr,V,S,V}, /* merg.f */ - {2,2,rrr,V,S,V}, /* mask.f */ - {1,1,rrr,V,S,V}, /* merg.t */ - {2,1,rrr,V,S,V}, /* mask.t */ - {3,3,rrr,V,V,V}, /* mul.s */ - {3,4,rrr,V,V,V}, /* mul.d */ - {4,3,rrr,V,V,V}, /* div.s */ - {4,4,rrr,V,V,V}, /* div.d */ - {3,3,rrr,V,S,V}, /* mul.s */ - {3,4,rrr,V,S,V}, /* mul.d */ - {4,3,rrr,V,S,V}, /* div.s */ - {4,4,rrr,V,S,V}, /* div.d */ - {5,0,rrr,V,V,V}, /* and */ - {6,0,rrr,V,V,V}, /* or */ - {7,0,rrr,V,V,V}, /* xor */ - {8,0,rrr,V,V,V}, /* shf */ - {5,0,rrr,V,S,V}, /* and */ - {6,0,rrr,V,S,V}, /* or */ - {7,0,rrr,V,S,V}, /* xor */ - {8,0,rrr,V,S,V}, /* shf */ - {9,3,rrr,V,V,V}, /* add.s */ - {9,4,rrr,V,V,V}, /* add.d */ - {10,3,rrr,V,V,V}, /* sub.s */ - {10,4,rrr,V,V,V}, /* sub.d */ - {9,3,rrr,V,S,V}, /* add.s */ - {9,4,rrr,V,S,V}, /* add.d */ - {10,3,rrr,V,S,V}, /* sub.s */ - {10,4,rrr,V,S,V}, /* sub.d */ - {9,5,rrr,V,V,V}, /* add.b */ - {9,6,rrr,V,V,V}, /* add.h */ - {9,7,rrr,V,V,V}, /* add.w */ - {9,8,rrr,V,V,V}, /* add.l */ - {9,5,rrr,V,S,V}, /* add.b */ - {9,6,rrr,V,S,V}, /* add.h */ - {9,7,rrr,V,S,V}, /* add.w */ - {9,8,rrr,V,S,V}, /* add.l */ - {10,5,rrr,V,V,V}, /* sub.b */ - {10,6,rrr,V,V,V}, /* sub.h */ - {10,7,rrr,V,V,V}, /* sub.w */ - {10,8,rrr,V,V,V}, /* sub.l */ - {10,5,rrr,V,S,V}, /* sub.b */ - {10,6,rrr,V,S,V}, /* sub.h */ - {10,7,rrr,V,S,V}, /* sub.w */ - {10,8,rrr,V,S,V}, /* sub.l */ - {3,5,rrr,V,V,V}, /* mul.b */ - {3,6,rrr,V,V,V}, /* mul.h */ - {3,7,rrr,V,V,V}, /* mul.w */ - {3,8,rrr,V,V,V}, /* mul.l */ - {3,5,rrr,V,S,V}, /* mul.b */ - {3,6,rrr,V,S,V}, /* mul.h */ - {3,7,rrr,V,S,V}, /* mul.w */ - {3,8,rrr,V,S,V}, /* mul.l */ - {4,5,rrr,V,V,V}, /* div.b */ - {4,6,rrr,V,V,V}, /* div.h */ - {4,7,rrr,V,V,V}, /* div.w */ - {4,8,rrr,V,V,V}, /* div.l */ - {4,5,rrr,V,S,V}, /* div.b */ - {4,6,rrr,V,S,V}, /* div.h */ - {4,7,rrr,V,S,V}, /* div.w */ - {4,8,rrr,V,S,V}, /* div.l */ -}; - -CONST struct formstr format1[] = { - {11,0,xxx,0,0,0}, /* exit */ - {12,0,a3,0,0,0}, /* jmp */ - {13,2,a3,0,0,0}, /* jmpi.f */ - {13,1,a3,0,0,0}, /* jmpi.t */ - {14,2,a3,0,0,0}, /* jmpa.f */ - {14,1,a3,0,0,0}, /* jmpa.t */ - {15,2,a3,0,0,0}, /* jmps.f */ - {15,1,a3,0,0,0}, /* jmps.t */ - {16,0,a3,0,0,0}, /* tac */ - {17,0,a1r,A,0,0}, /* ldea */ - {18,8,a1l,VLS,0,0}, /* ld.l */ - {18,9,a1l,VM,0,0}, /* ld.x */ - {19,0,a3,0,0,0}, /* tas */ - {20,0,a3,0,0,0}, /* pshea */ - {21,8,a2l,VLS,0,0}, /* st.l */ - {21,9,a2l,VM,0,0}, /* st.x */ - {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}, - {22,0,a3,0,0,0}, /* call */ - {23,0,a3,0,0,0}, /* calls */ - {24,0,a3,0,0,0}, /* callq */ - {25,0,a1r,A,0,0}, /* pfork */ - {26,5,a2r,S,0,0}, /* ste.b */ - {26,6,a2r,S,0,0}, /* ste.h */ - {26,7,a2r,S,0,0}, /* ste.w */ - {26,8,a2r,S,0,0}, /* ste.l */ - {18,5,a1r,A,0,0}, /* ld.b */ - {18,6,a1r,A,0,0}, /* ld.h */ - {18,7,a1r,A,0,0}, /* ld.w */ - {27,7,a1r,A,0,0}, /* incr.w */ - {21,5,a2r,A,0,0}, /* st.b */ - {21,6,a2r,A,0,0}, /* st.h */ - {21,7,a2r,A,0,0}, /* st.w */ - {27,8,a1r,S,0,0}, /* incr.l */ - {18,5,a1r,S,0,0}, /* ld.b */ - {18,6,a1r,S,0,0}, /* ld.h */ - {18,7,a1r,S,0,0}, /* ld.w */ - {18,8,a1r,S,0,0}, /* ld.l */ - {21,5,a2r,S,0,0}, /* st.b */ - {21,6,a2r,S,0,0}, /* st.h */ - {21,7,a2r,S,0,0}, /* st.w */ - {21,8,a2r,S,0,0}, /* st.l */ - {18,5,a1r,V,0,0}, /* ld.b */ - {18,6,a1r,V,0,0}, /* ld.h */ - {18,7,a1r,V,0,0}, /* ld.w */ - {18,8,a1r,V,0,0}, /* ld.l */ - {21,5,a2r,V,0,0}, /* st.b */ - {21,6,a2r,V,0,0}, /* st.h */ - {21,7,a2r,V,0,0}, /* st.w */ - {21,8,a2r,V,0,0}, /* st.l */ -}; - -CONST struct formstr format2[] = { - {28,5,rr,A,A,0}, /* cvtw.b */ - {28,6,rr,A,A,0}, /* cvtw.h */ - {29,7,rr,A,A,0}, /* cvtb.w */ - {30,7,rr,A,A,0}, /* cvth.w */ - {28,5,rr,S,S,0}, /* cvtw.b */ - {28,6,rr,S,S,0}, /* cvtw.h */ - {29,7,rr,S,S,0}, /* cvtb.w */ - {30,7,rr,S,S,0}, /* cvth.w */ - {28,3,rr,S,S,0}, /* cvtw.s */ - {31,7,rr,S,S,0}, /* cvts.w */ - {32,3,rr,S,S,0}, /* cvtd.s */ - {31,4,rr,S,S,0}, /* cvts.d */ - {31,8,rr,S,S,0}, /* cvts.l */ - {32,8,rr,S,S,0}, /* cvtd.l */ - {33,3,rr,S,S,0}, /* cvtl.s */ - {33,4,rr,S,S,0}, /* cvtl.d */ - {34,0,rr,A,A,0}, /* ldpa */ - {8,0,nr,A,0,0}, /* shf */ - {18,6,nr,A,0,0}, /* ld.h */ - {18,7,nr,A,0,0}, /* ld.w */ - {33,7,rr,S,S,0}, /* cvtl.w */ - {28,8,rr,S,S,0}, /* cvtw.l */ - {35,1,rr,S,S,0}, /* plc.t */ - {36,0,rr,S,S,0}, /* tzc */ - {37,6,rr,A,A,0}, /* eq.h */ - {37,7,rr,A,A,0}, /* eq.w */ - {37,6,nr,A,0,0}, /* eq.h */ - {37,7,nr,A,0,0}, /* eq.w */ - {37,5,rr,S,S,0}, /* eq.b */ - {37,6,rr,S,S,0}, /* eq.h */ - {37,7,rr,S,S,0}, /* eq.w */ - {37,8,rr,S,S,0}, /* eq.l */ - {38,6,rr,A,A,0}, /* leu.h */ - {38,7,rr,A,A,0}, /* leu.w */ - {38,6,nr,A,0,0}, /* leu.h */ - {38,7,nr,A,0,0}, /* leu.w */ - {38,5,rr,S,S,0}, /* leu.b */ - {38,6,rr,S,S,0}, /* leu.h */ - {38,7,rr,S,S,0}, /* leu.w */ - {38,8,rr,S,S,0}, /* leu.l */ - {39,6,rr,A,A,0}, /* ltu.h */ - {39,7,rr,A,A,0}, /* ltu.w */ - {39,6,nr,A,0,0}, /* ltu.h */ - {39,7,nr,A,0,0}, /* ltu.w */ - {39,5,rr,S,S,0}, /* ltu.b */ - {39,6,rr,S,S,0}, /* ltu.h */ - {39,7,rr,S,S,0}, /* ltu.w */ - {39,8,rr,S,S,0}, /* ltu.l */ - {40,6,rr,A,A,0}, /* le.h */ - {40,7,rr,A,A,0}, /* le.w */ - {40,6,nr,A,0,0}, /* le.h */ - {40,7,nr,A,0,0}, /* le.w */ - {40,5,rr,S,S,0}, /* le.b */ - {40,6,rr,S,S,0}, /* le.h */ - {40,7,rr,S,S,0}, /* le.w */ - {40,8,rr,S,S,0}, /* le.l */ - {41,6,rr,A,A,0}, /* lt.h */ - {41,7,rr,A,A,0}, /* lt.w */ - {41,6,nr,A,0,0}, /* lt.h */ - {41,7,nr,A,0,0}, /* lt.w */ - {41,5,rr,S,S,0}, /* lt.b */ - {41,6,rr,S,S,0}, /* lt.h */ - {41,7,rr,S,S,0}, /* lt.w */ - {41,8,rr,S,S,0}, /* lt.l */ - {9,7,rr,S,A,0}, /* add.w */ - {8,0,rr,A,A,0}, /* shf */ - {0,0,rr,A,A,0}, /* mov */ - {0,0,rr,S,A,0}, /* mov */ - {0,7,rr,S,S,0}, /* mov.w */ - {8,0,rr,S,S,0}, /* shf */ - {0,0,rr,S,S,0}, /* mov */ - {0,0,rr,A,S,0}, /* mov */ - {5,0,rr,A,A,0}, /* and */ - {6,0,rr,A,A,0}, /* or */ - {7,0,rr,A,A,0}, /* xor */ - {42,0,rr,A,A,0}, /* not */ - {5,0,rr,S,S,0}, /* and */ - {6,0,rr,S,S,0}, /* or */ - {7,0,rr,S,S,0}, /* xor */ - {42,0,rr,S,S,0}, /* not */ - {40,3,rr,S,S,0}, /* le.s */ - {40,4,rr,S,S,0}, /* le.d */ - {41,3,rr,S,S,0}, /* lt.s */ - {41,4,rr,S,S,0}, /* lt.d */ - {9,3,rr,S,S,0}, /* add.s */ - {9,4,rr,S,S,0}, /* add.d */ - {10,3,rr,S,S,0}, /* sub.s */ - {10,4,rr,S,S,0}, /* sub.d */ - {37,3,rr,S,S,0}, /* eq.s */ - {37,4,rr,S,S,0}, /* eq.d */ - {43,6,rr,A,A,0}, /* neg.h */ - {43,7,rr,A,A,0}, /* neg.w */ - {3,3,rr,S,S,0}, /* mul.s */ - {3,4,rr,S,S,0}, /* mul.d */ - {4,3,rr,S,S,0}, /* div.s */ - {4,4,rr,S,S,0}, /* div.d */ - {9,6,rr,A,A,0}, /* add.h */ - {9,7,rr,A,A,0}, /* add.w */ - {9,6,nr,A,0,0}, /* add.h */ - {9,7,nr,A,0,0}, /* add.w */ - {9,5,rr,S,S,0}, /* add.b */ - {9,6,rr,S,S,0}, /* add.h */ - {9,7,rr,S,S,0}, /* add.w */ - {9,8,rr,S,S,0}, /* add.l */ - {10,6,rr,A,A,0}, /* sub.h */ - {10,7,rr,A,A,0}, /* sub.w */ - {10,6,nr,A,0,0}, /* sub.h */ - {10,7,nr,A,0,0}, /* sub.w */ - {10,5,rr,S,S,0}, /* sub.b */ - {10,6,rr,S,S,0}, /* sub.h */ - {10,7,rr,S,S,0}, /* sub.w */ - {10,8,rr,S,S,0}, /* sub.l */ - {3,6,rr,A,A,0}, /* mul.h */ - {3,7,rr,A,A,0}, /* mul.w */ - {3,6,nr,A,0,0}, /* mul.h */ - {3,7,nr,A,0,0}, /* mul.w */ - {3,5,rr,S,S,0}, /* mul.b */ - {3,6,rr,S,S,0}, /* mul.h */ - {3,7,rr,S,S,0}, /* mul.w */ - {3,8,rr,S,S,0}, /* mul.l */ - {4,6,rr,A,A,0}, /* div.h */ - {4,7,rr,A,A,0}, /* div.w */ - {4,6,nr,A,0,0}, /* div.h */ - {4,7,nr,A,0,0}, /* div.w */ - {4,5,rr,S,S,0}, /* div.b */ - {4,6,rr,S,S,0}, /* div.h */ - {4,7,rr,S,S,0}, /* div.w */ - {4,8,rr,S,S,0}, /* div.l */ -}; - -CONST struct formstr format3[] = { - {32,3,rr,V,V,0}, /* cvtd.s */ - {31,4,rr,V,V,0}, /* cvts.d */ - {33,4,rr,V,V,0}, /* cvtl.d */ - {32,8,rr,V,V,0}, /* cvtd.l */ - {0,0,rrl,S,S,VM}, /* mov */ - {0,0,rlr,S,VM,S}, /* mov */ - {0,0,0,0,0,0}, - {44,0,rr,S,S,0}, /* lop */ - {36,0,rr,V,V,0}, /* tzc */ - {44,0,rr,V,V,0}, /* lop */ - {0,0,0,0,0,0}, - {42,0,rr,V,V,0}, /* not */ - {8,0,rr,S,V,0}, /* shf */ - {35,1,rr,V,V,0}, /* plc.t */ - {45,2,rr,V,V,0}, /* cprs.f */ - {45,1,rr,V,V,0}, /* cprs.t */ - {37,3,rr,V,V,0}, /* eq.s */ - {37,4,rr,V,V,0}, /* eq.d */ - {43,3,rr,V,V,0}, /* neg.s */ - {43,4,rr,V,V,0}, /* neg.d */ - {37,3,rr,S,V,0}, /* eq.s */ - {37,4,rr,S,V,0}, /* eq.d */ - {43,3,rr,S,S,0}, /* neg.s */ - {43,4,rr,S,S,0}, /* neg.d */ - {40,3,rr,V,V,0}, /* le.s */ - {40,4,rr,V,V,0}, /* le.d */ - {41,3,rr,V,V,0}, /* lt.s */ - {41,4,rr,V,V,0}, /* lt.d */ - {40,3,rr,S,V,0}, /* le.s */ - {40,4,rr,S,V,0}, /* le.d */ - {41,3,rr,S,V,0}, /* lt.s */ - {41,4,rr,S,V,0}, /* lt.d */ - {37,5,rr,V,V,0}, /* eq.b */ - {37,6,rr,V,V,0}, /* eq.h */ - {37,7,rr,V,V,0}, /* eq.w */ - {37,8,rr,V,V,0}, /* eq.l */ - {37,5,rr,S,V,0}, /* eq.b */ - {37,6,rr,S,V,0}, /* eq.h */ - {37,7,rr,S,V,0}, /* eq.w */ - {37,8,rr,S,V,0}, /* eq.l */ - {40,5,rr,V,V,0}, /* le.b */ - {40,6,rr,V,V,0}, /* le.h */ - {40,7,rr,V,V,0}, /* le.w */ - {40,8,rr,V,V,0}, /* le.l */ - {40,5,rr,S,V,0}, /* le.b */ - {40,6,rr,S,V,0}, /* le.h */ - {40,7,rr,S,V,0}, /* le.w */ - {40,8,rr,S,V,0}, /* le.l */ - {41,5,rr,V,V,0}, /* lt.b */ - {41,6,rr,V,V,0}, /* lt.h */ - {41,7,rr,V,V,0}, /* lt.w */ - {41,8,rr,V,V,0}, /* lt.l */ - {41,5,rr,S,V,0}, /* lt.b */ - {41,6,rr,S,V,0}, /* lt.h */ - {41,7,rr,S,V,0}, /* lt.w */ - {41,8,rr,S,V,0}, /* lt.l */ - {43,5,rr,V,V,0}, /* neg.b */ - {43,6,rr,V,V,0}, /* neg.h */ - {43,7,rr,V,V,0}, /* neg.w */ - {43,8,rr,V,V,0}, /* neg.l */ - {43,5,rr,S,S,0}, /* neg.b */ - {43,6,rr,S,S,0}, /* neg.h */ - {43,7,rr,S,S,0}, /* neg.w */ - {43,8,rr,S,S,0}, /* neg.l */ -}; - -CONST struct formstr format4[] = { - {46,0,nops,0,0,0}, /* nop */ - {47,0,pcrel,0,0,0}, /* br */ - {48,2,pcrel,0,0,0}, /* bri.f */ - {48,1,pcrel,0,0,0}, /* bri.t */ - {49,2,pcrel,0,0,0}, /* bra.f */ - {49,1,pcrel,0,0,0}, /* bra.t */ - {50,2,pcrel,0,0,0}, /* brs.f */ - {50,1,pcrel,0,0,0}, /* brs.t */ -}; - -CONST struct formstr format5[] = { - {51,5,rr,V,V,0}, /* ldvi.b */ - {51,6,rr,V,V,0}, /* ldvi.h */ - {51,7,rr,V,V,0}, /* ldvi.w */ - {51,8,rr,V,V,0}, /* ldvi.l */ - {28,3,rr,V,V,0}, /* cvtw.s */ - {31,7,rr,V,V,0}, /* cvts.w */ - {28,8,rr,V,V,0}, /* cvtw.l */ - {33,7,rr,V,V,0}, /* cvtl.w */ - {52,5,rxr,V,V,0}, /* stvi.b */ - {52,6,rxr,V,V,0}, /* stvi.h */ - {52,7,rxr,V,V,0}, /* stvi.w */ - {52,8,rxr,V,V,0}, /* stvi.l */ - {52,5,rxr,S,V,0}, /* stvi.b */ - {52,6,rxr,S,V,0}, /* stvi.h */ - {52,7,rxr,S,V,0}, /* stvi.w */ - {52,8,rxr,S,V,0}, /* stvi.l */ -}; - -CONST struct formstr format6[] = { - {53,0,r,A,0,0}, /* ldsdr */ - {54,0,r,A,0,0}, /* ldkdr */ - {55,3,r,S,0,0}, /* ln.s */ - {55,4,r,S,0,0}, /* ln.d */ - {56,0,nops,0,0,0}, /* patu */ - {57,0,r,A,0,0}, /* pate */ - {58,0,nops,0,0,0}, /* pich */ - {59,0,nops,0,0,0}, /* plch */ - {0,0,lr,PSW,A,0}, /* mov */ - {0,0,rxl,A,PSW,0}, /* mov */ - {0,0,lr,PC,A,0}, /* mov */ - {60,0,r,S,0,0}, /* idle */ - {0,0,lr,ITR,S,0}, /* mov */ - {0,0,rxl,S,ITR,0}, /* mov */ - {0,0,0,0,0,0}, - {0,0,rxl,S,ITSR,0}, /* mov */ - {61,0,nops,0,0,0}, /* rtnq */ - {62,0,nops,0,0,0}, /* cfork */ - {63,0,nops,0,0,0}, /* rtn */ - {64,0,nops,0,0,0}, /* wfork */ - {65,0,nops,0,0,0}, /* join */ - {66,0,nops,0,0,0}, /* rtnc */ - {67,3,r,S,0,0}, /* exp.s */ - {67,4,r,S,0,0}, /* exp.d */ - {68,3,r,S,0,0}, /* sin.s */ - {68,4,r,S,0,0}, /* sin.d */ - {0,0,0,0,0,0}, - {0,0,0,0,0,0}, - {69,3,r,S,0,0}, /* cos.s */ - {69,4,r,S,0,0}, /* cos.d */ - {0,0,0,0,0,0}, - {0,0,0,0,0,0}, - {70,7,r,A,0,0}, /* psh.w */ - {0,0,0,0,0,0}, - {71,7,r,A,0,0}, /* pop.w */ - {0,0,0,0,0,0}, - {70,7,r,S,0,0}, /* psh.w */ - {70,8,r,S,0,0}, /* psh.l */ - {71,7,r,S,0,0}, /* pop.w */ - {71,8,r,S,0,0}, /* pop.l */ - {72,0,nops,0,0,0}, /* eni */ - {73,0,nops,0,0,0}, /* dsi */ - {74,0,nops,0,0,0}, /* bkpt */ - {75,0,nops,0,0,0}, /* msync */ - {76,0,r,S,0,0}, /* mski */ - {77,0,r,S,0,0}, /* xmti */ - {0,0,rxl,S,VV,0}, /* mov */ - {78,0,nops,0,0,0}, /* tstvv */ - {0,0,lr,VS,A,0}, /* mov */ - {0,0,rxl,A,VS,0}, /* mov */ - {0,0,lr,VL,A,0}, /* mov */ - {0,0,rxl,A,VL,0}, /* mov */ - {0,7,lr,VS,S,0}, /* mov.w */ - {0,7,rxl,S,VS,0}, /* mov.w */ - {0,7,lr,VL,S,0}, /* mov.w */ - {0,7,rxl,S,VL,0}, /* mov.w */ - {79,0,r,A,0,0}, /* diag */ - {80,0,nops,0,0,0}, /* pbkpt */ - {81,3,r,S,0,0}, /* sqrt.s */ - {81,4,r,S,0,0}, /* sqrt.d */ - {82,0,nops,0,0,0}, /* casr */ - {0,0,0,0,0,0}, - {83,3,r,S,0,0}, /* atan.s */ - {83,4,r,S,0,0}, /* atan.d */ -}; - -CONST struct formstr format7[] = { - {84,5,r,V,0,0}, /* sum.b */ - {84,6,r,V,0,0}, /* sum.h */ - {84,7,r,V,0,0}, /* sum.w */ - {84,8,r,V,0,0}, /* sum.l */ - {85,0,r,V,0,0}, /* all */ - {86,0,r,V,0,0}, /* any */ - {87,0,r,V,0,0}, /* parity */ - {0,0,0,0,0,0}, - {88,5,r,V,0,0}, /* max.b */ - {88,6,r,V,0,0}, /* max.h */ - {88,7,r,V,0,0}, /* max.w */ - {88,8,r,V,0,0}, /* max.l */ - {89,5,r,V,0,0}, /* min.b */ - {89,6,r,V,0,0}, /* min.h */ - {89,7,r,V,0,0}, /* min.w */ - {89,8,r,V,0,0}, /* min.l */ - {84,3,r,V,0,0}, /* sum.s */ - {84,4,r,V,0,0}, /* sum.d */ - {90,3,r,V,0,0}, /* prod.s */ - {90,4,r,V,0,0}, /* prod.d */ - {88,3,r,V,0,0}, /* max.s */ - {88,4,r,V,0,0}, /* max.d */ - {89,3,r,V,0,0}, /* min.s */ - {89,4,r,V,0,0}, /* min.d */ - {90,5,r,V,0,0}, /* prod.b */ - {90,6,r,V,0,0}, /* prod.h */ - {90,7,r,V,0,0}, /* prod.w */ - {90,8,r,V,0,0}, /* prod.l */ - {35,2,lr,VM,S,0}, /* plc.f */ - {35,1,lr,VM,S,0}, /* plc.t */ - {0,0,0,0,0,0}, - {0,0,0,0,0,0}, -}; - -CONST struct formstr formatx[] = { - {0,0,0,0,0,0}, -}; - -CONST struct formstr format1a[] = { - {91,0,imr,A,0,0}, /* halt */ - {92,0,a4,0,0,0}, /* sysc */ - {18,6,imr,A,0,0}, /* ld.h */ - {18,7,imr,A,0,0}, /* ld.w */ - {5,0,imr,A,0,0}, /* and */ - {6,0,imr,A,0,0}, /* or */ - {7,0,imr,A,0,0}, /* xor */ - {8,0,imr,A,0,0}, /* shf */ - {9,6,imr,A,0,0}, /* add.h */ - {9,7,imr,A,0,0}, /* add.w */ - {10,6,imr,A,0,0}, /* sub.h */ - {10,7,imr,A,0,0}, /* sub.w */ - {3,6,imr,A,0,0}, /* mul.h */ - {3,7,imr,A,0,0}, /* mul.w */ - {4,6,imr,A,0,0}, /* div.h */ - {4,7,imr,A,0,0}, /* div.w */ - {18,7,iml,VL,0,0}, /* ld.w */ - {18,7,iml,VS,0,0}, /* ld.w */ - {0,0,0,0,0,0}, - {8,7,imr,S,0,0}, /* shf.w */ - {93,0,a5,0,0,0}, /* trap */ - {0,0,0,0,0,0}, - {37,6,imr,A,0,0}, /* eq.h */ - {37,7,imr,A,0,0}, /* eq.w */ - {38,6,imr,A,0,0}, /* leu.h */ - {38,7,imr,A,0,0}, /* leu.w */ - {39,6,imr,A,0,0}, /* ltu.h */ - {39,7,imr,A,0,0}, /* ltu.w */ - {40,6,imr,A,0,0}, /* le.h */ - {40,7,imr,A,0,0}, /* le.w */ - {41,6,imr,A,0,0}, /* lt.h */ - {41,7,imr,A,0,0}, /* lt.w */ -}; - -CONST struct formstr format1b[] = { - {18,4,imr,S,0,0}, /* ld.d */ - {18,10,imr,S,0,0}, /* ld.u */ - {18,8,imr,S,0,0}, /* ld.l */ - {18,7,imr,S,0,0}, /* ld.w */ - {5,0,imr,S,0,0}, /* and */ - {6,0,imr,S,0,0}, /* or */ - {7,0,imr,S,0,0}, /* xor */ - {8,0,imr,S,0,0}, /* shf */ - {9,6,imr,S,0,0}, /* add.h */ - {9,7,imr,S,0,0}, /* add.w */ - {10,6,imr,S,0,0}, /* sub.h */ - {10,7,imr,S,0,0}, /* sub.w */ - {3,6,imr,S,0,0}, /* mul.h */ - {3,7,imr,S,0,0}, /* mul.w */ - {4,6,imr,S,0,0}, /* div.h */ - {4,7,imr,S,0,0}, /* div.w */ - {9,3,imr,S,0,0}, /* add.s */ - {10,3,imr,S,0,0}, /* sub.s */ - {3,3,imr,S,0,0}, /* mul.s */ - {4,3,imr,S,0,0}, /* div.s */ - {40,3,imr,S,0,0}, /* le.s */ - {41,3,imr,S,0,0}, /* lt.s */ - {37,6,imr,S,0,0}, /* eq.h */ - {37,7,imr,S,0,0}, /* eq.w */ - {38,6,imr,S,0,0}, /* leu.h */ - {38,7,imr,S,0,0}, /* leu.w */ - {39,6,imr,S,0,0}, /* ltu.h */ - {39,7,imr,S,0,0}, /* ltu.w */ - {40,6,imr,S,0,0}, /* le.h */ - {40,7,imr,S,0,0}, /* le.w */ - {41,6,imr,S,0,0}, /* lt.h */ - {41,7,imr,S,0,0}, /* lt.w */ -}; - -CONST struct formstr e0_format0[] = { - {10,3,rrr,S,V,V}, /* sub.s */ - {10,4,rrr,S,V,V}, /* sub.d */ - {4,3,rrr,S,V,V}, /* div.s */ - {4,4,rrr,S,V,V}, /* div.d */ - {10,11,rrr,S,V,V}, /* sub.s.f */ - {10,12,rrr,S,V,V}, /* sub.d.f */ - {4,11,rrr,S,V,V}, /* div.s.f */ - {4,12,rrr,S,V,V}, /* div.d.f */ - {3,11,rrr,V,V,V}, /* mul.s.f */ - {3,12,rrr,V,V,V}, /* mul.d.f */ - {4,11,rrr,V,V,V}, /* div.s.f */ - {4,12,rrr,V,V,V}, /* div.d.f */ - {3,11,rrr,V,S,V}, /* mul.s.f */ - {3,12,rrr,V,S,V}, /* mul.d.f */ - {4,11,rrr,V,S,V}, /* div.s.f */ - {4,12,rrr,V,S,V}, /* div.d.f */ - {5,2,rrr,V,V,V}, /* and.f */ - {6,2,rrr,V,V,V}, /* or.f */ - {7,2,rrr,V,V,V}, /* xor.f */ - {8,2,rrr,V,V,V}, /* shf.f */ - {5,2,rrr,V,S,V}, /* and.f */ - {6,2,rrr,V,S,V}, /* or.f */ - {7,2,rrr,V,S,V}, /* xor.f */ - {8,2,rrr,V,S,V}, /* shf.f */ - {9,11,rrr,V,V,V}, /* add.s.f */ - {9,12,rrr,V,V,V}, /* add.d.f */ - {10,11,rrr,V,V,V}, /* sub.s.f */ - {10,12,rrr,V,V,V}, /* sub.d.f */ - {9,11,rrr,V,S,V}, /* add.s.f */ - {9,12,rrr,V,S,V}, /* add.d.f */ - {10,11,rrr,V,S,V}, /* sub.s.f */ - {10,12,rrr,V,S,V}, /* sub.d.f */ - {9,13,rrr,V,V,V}, /* add.b.f */ - {9,14,rrr,V,V,V}, /* add.h.f */ - {9,15,rrr,V,V,V}, /* add.w.f */ - {9,16,rrr,V,V,V}, /* add.l.f */ - {9,13,rrr,V,S,V}, /* add.b.f */ - {9,14,rrr,V,S,V}, /* add.h.f */ - {9,15,rrr,V,S,V}, /* add.w.f */ - {9,16,rrr,V,S,V}, /* add.l.f */ - {10,13,rrr,V,V,V}, /* sub.b.f */ - {10,14,rrr,V,V,V}, /* sub.h.f */ - {10,15,rrr,V,V,V}, /* sub.w.f */ - {10,16,rrr,V,V,V}, /* sub.l.f */ - {10,13,rrr,V,S,V}, /* sub.b.f */ - {10,14,rrr,V,S,V}, /* sub.h.f */ - {10,15,rrr,V,S,V}, /* sub.w.f */ - {10,16,rrr,V,S,V}, /* sub.l.f */ - {3,13,rrr,V,V,V}, /* mul.b.f */ - {3,14,rrr,V,V,V}, /* mul.h.f */ - {3,15,rrr,V,V,V}, /* mul.w.f */ - {3,16,rrr,V,V,V}, /* mul.l.f */ - {3,13,rrr,V,S,V}, /* mul.b.f */ - {3,14,rrr,V,S,V}, /* mul.h.f */ - {3,15,rrr,V,S,V}, /* mul.w.f */ - {3,16,rrr,V,S,V}, /* mul.l.f */ - {4,13,rrr,V,V,V}, /* div.b.f */ - {4,14,rrr,V,V,V}, /* div.h.f */ - {4,15,rrr,V,V,V}, /* div.w.f */ - {4,16,rrr,V,V,V}, /* div.l.f */ - {4,13,rrr,V,S,V}, /* div.b.f */ - {4,14,rrr,V,S,V}, /* div.h.f */ - {4,15,rrr,V,S,V}, /* div.w.f */ - {4,16,rrr,V,S,V}, /* div.l.f */ -}; - -CONST struct formstr e0_format1[] = { - {0,0,0,0,0,0}, - {94,0,a3,0,0,0}, /* tst */ - {95,0,a3,0,0,0}, /* lck */ - {96,0,a3,0,0,0}, /* ulk */ - {17,0,a1r,S,0,0}, /* ldea */ - {97,0,a1r,A,0,0}, /* spawn */ - {98,0,a1r,A,0,0}, /* ldcmr */ - {99,0,a2r,A,0,0}, /* stcmr */ - {100,0,a1r,A,0,0}, /* popr */ - {101,0,a2r,A,0,0}, /* pshr */ - {102,7,a1r,A,0,0}, /* rcvr.w */ - {103,7,a2r,A,0,0}, /* matm.w */ - {104,7,a2r,A,0,0}, /* sndr.w */ - {104,8,a2r,S,0,0}, /* sndr.l */ - {102,8,a1r,S,0,0}, /* rcvr.l */ - {103,8,a2r,S,0,0}, /* matm.l */ - {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}, - {105,7,a2r,A,0,0}, /* putr.w */ - {105,8,a2r,S,0,0}, /* putr.l */ - {106,7,a1r,A,0,0}, /* getr.w */ - {106,8,a1r,S,0,0}, /* getr.l */ - {26,13,a2r,S,0,0}, /* ste.b.f */ - {26,14,a2r,S,0,0}, /* ste.h.f */ - {26,15,a2r,S,0,0}, /* ste.w.f */ - {26,16,a2r,S,0,0}, /* ste.l.f */ - {107,7,a2r,A,0,0}, /* matr.w */ - {108,7,a2r,A,0,0}, /* mat.w */ - {109,7,a1r,A,0,0}, /* get.w */ - {110,7,a1r,A,0,0}, /* rcv.w */ - {0,0,0,0,0,0}, - {111,7,a1r,A,0,0}, /* inc.w */ - {112,7,a2r,A,0,0}, /* put.w */ - {113,7,a2r,A,0,0}, /* snd.w */ - {107,8,a2r,S,0,0}, /* matr.l */ - {108,8,a2r,S,0,0}, /* mat.l */ - {109,8,a1r,S,0,0}, /* get.l */ - {110,8,a1r,S,0,0}, /* rcv.l */ - {0,0,0,0,0,0}, - {111,8,a1r,S,0,0}, /* inc.l */ - {112,8,a2r,S,0,0}, /* put.l */ - {113,8,a2r,S,0,0}, /* snd.l */ - {18,13,a1r,V,0,0}, /* ld.b.f */ - {18,14,a1r,V,0,0}, /* ld.h.f */ - {18,15,a1r,V,0,0}, /* ld.w.f */ - {18,16,a1r,V,0,0}, /* ld.l.f */ - {21,13,a2r,V,0,0}, /* st.b.f */ - {21,14,a2r,V,0,0}, /* st.h.f */ - {21,15,a2r,V,0,0}, /* st.w.f */ - {21,16,a2r,V,0,0}, /* st.l.f */ -}; - -CONST struct formstr e0_format2[] = { - {28,5,rr,V,V,0}, /* cvtw.b */ - {28,6,rr,V,V,0}, /* cvtw.h */ - {29,7,rr,V,V,0}, /* cvtb.w */ - {30,7,rr,V,V,0}, /* cvth.w */ - {28,13,rr,V,V,0}, /* cvtw.b.f */ - {28,14,rr,V,V,0}, /* cvtw.h.f */ - {29,15,rr,V,V,0}, /* cvtb.w.f */ - {30,15,rr,V,V,0}, /* cvth.w.f */ - {31,8,rr,V,V,0}, /* cvts.l */ - {32,7,rr,V,V,0}, /* cvtd.w */ - {33,3,rr,V,V,0}, /* cvtl.s */ - {28,4,rr,V,V,0}, /* cvtw.d */ - {31,16,rr,V,V,0}, /* cvts.l.f */ - {32,15,rr,V,V,0}, /* cvtd.w.f */ - {33,11,rr,V,V,0}, /* cvtl.s.f */ - {28,12,rr,V,V,0}, /* cvtw.d.f */ - {114,0,rr,S,S,0}, /* enal */ - {8,7,rr,S,S,0}, /* shf.w */ - {115,0,rr,S,S,0}, /* enag */ - {0,0,0,0,0,0}, - {28,4,rr,S,S,0}, /* cvtw.d */ - {32,7,rr,S,S,0}, /* cvtd.w */ - {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}, - {116,3,rr,S,S,0}, /* frint.s */ - {116,4,rr,S,S,0}, /* frint.d */ - {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,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,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}, - {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}, - {116,3,rr,V,V,0}, /* frint.s */ - {116,4,rr,V,V,0}, /* frint.d */ - {0,0,0,0,0,0}, - {0,0,0,0,0,0}, - {116,11,rr,V,V,0}, /* frint.s.f */ - {116,12,rr,V,V,0}, /* frint.d.f */ - {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}, - {81,3,rr,V,V,0}, /* sqrt.s */ - {81,4,rr,V,V,0}, /* sqrt.d */ - {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}, - {81,11,rr,V,V,0}, /* sqrt.s.f */ - {81,12,rr,V,V,0}, /* sqrt.d.f */ - {0,0,0,0,0,0}, - {0,0,0,0,0,0}, -}; - -CONST struct formstr e0_format3[] = { - {32,11,rr,V,V,0}, /* cvtd.s.f */ - {31,12,rr,V,V,0}, /* cvts.d.f */ - {33,12,rr,V,V,0}, /* cvtl.d.f */ - {32,16,rr,V,V,0}, /* cvtd.l.f */ - {0,0,0,0,0,0}, - {0,0,0,0,0,0}, - {0,0,0,0,0,0}, - {0,0,0,0,0,0}, - {36,2,rr,V,V,0}, /* tzc.f */ - {44,2,rr,V,V,0}, /* lop.f */ - {117,2,rr,V,V,0}, /* xpnd.f */ - {42,2,rr,V,V,0}, /* not.f */ - {8,2,rr,S,V,0}, /* shf.f */ - {35,17,rr,V,V,0}, /* plc.t.f */ - {0,0,0,0,0,0}, - {0,0,0,0,0,0}, - {37,11,rr,V,V,0}, /* eq.s.f */ - {37,12,rr,V,V,0}, /* eq.d.f */ - {43,11,rr,V,V,0}, /* neg.s.f */ - {43,12,rr,V,V,0}, /* neg.d.f */ - {37,11,rr,S,V,0}, /* eq.s.f */ - {37,12,rr,S,V,0}, /* eq.d.f */ - {0,0,0,0,0,0}, - {0,0,0,0,0,0}, - {40,11,rr,V,V,0}, /* le.s.f */ - {40,12,rr,V,V,0}, /* le.d.f */ - {41,11,rr,V,V,0}, /* lt.s.f */ - {41,12,rr,V,V,0}, /* lt.d.f */ - {40,11,rr,S,V,0}, /* le.s.f */ - {40,12,rr,S,V,0}, /* le.d.f */ - {41,11,rr,S,V,0}, /* lt.s.f */ - {41,12,rr,S,V,0}, /* lt.d.f */ - {37,13,rr,V,V,0}, /* eq.b.f */ - {37,14,rr,V,V,0}, /* eq.h.f */ - {37,15,rr,V,V,0}, /* eq.w.f */ - {37,16,rr,V,V,0}, /* eq.l.f */ - {37,13,rr,S,V,0}, /* eq.b.f */ - {37,14,rr,S,V,0}, /* eq.h.f */ - {37,15,rr,S,V,0}, /* eq.w.f */ - {37,16,rr,S,V,0}, /* eq.l.f */ - {40,13,rr,V,V,0}, /* le.b.f */ - {40,14,rr,V,V,0}, /* le.h.f */ - {40,15,rr,V,V,0}, /* le.w.f */ - {40,16,rr,V,V,0}, /* le.l.f */ - {40,13,rr,S,V,0}, /* le.b.f */ - {40,14,rr,S,V,0}, /* le.h.f */ - {40,15,rr,S,V,0}, /* le.w.f */ - {40,16,rr,S,V,0}, /* le.l.f */ - {41,13,rr,V,V,0}, /* lt.b.f */ - {41,14,rr,V,V,0}, /* lt.h.f */ - {41,15,rr,V,V,0}, /* lt.w.f */ - {41,16,rr,V,V,0}, /* lt.l.f */ - {41,13,rr,S,V,0}, /* lt.b.f */ - {41,14,rr,S,V,0}, /* lt.h.f */ - {41,15,rr,S,V,0}, /* lt.w.f */ - {41,16,rr,S,V,0}, /* lt.l.f */ - {43,13,rr,V,V,0}, /* neg.b.f */ - {43,14,rr,V,V,0}, /* neg.h.f */ - {43,15,rr,V,V,0}, /* neg.w.f */ - {43,16,rr,V,V,0}, /* neg.l.f */ - {0,0,0,0,0,0}, - {0,0,0,0,0,0}, - {0,0,0,0,0,0}, - {0,0,0,0,0,0}, -}; - -CONST struct formstr e0_format4[] = { - {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}, -}; - -CONST struct formstr e0_format5[] = { - {51,13,rr,V,V,0}, /* ldvi.b.f */ - {51,14,rr,V,V,0}, /* ldvi.h.f */ - {51,15,rr,V,V,0}, /* ldvi.w.f */ - {51,16,rr,V,V,0}, /* ldvi.l.f */ - {28,11,rr,V,V,0}, /* cvtw.s.f */ - {31,15,rr,V,V,0}, /* cvts.w.f */ - {28,16,rr,V,V,0}, /* cvtw.l.f */ - {33,15,rr,V,V,0}, /* cvtl.w.f */ - {52,13,rxr,V,V,0}, /* stvi.b.f */ - {52,14,rxr,V,V,0}, /* stvi.h.f */ - {52,15,rxr,V,V,0}, /* stvi.w.f */ - {52,16,rxr,V,V,0}, /* stvi.l.f */ - {52,13,rxr,S,V,0}, /* stvi.b.f */ - {52,14,rxr,S,V,0}, /* stvi.h.f */ - {52,15,rxr,S,V,0}, /* stvi.w.f */ - {52,16,rxr,S,V,0}, /* stvi.l.f */ -}; - -CONST struct formstr e0_format6[] = { - {0,0,rxl,S,CIR,0}, /* mov */ - {0,0,lr,CIR,S,0}, /* mov */ - {0,0,lr,TOC,S,0}, /* mov */ - {0,0,lr,CPUID,S,0}, /* mov */ - {0,0,rxl,S,TTR,0}, /* mov */ - {0,0,lr,TTR,S,0}, /* mov */ - {118,0,nops,0,0,0}, /* ctrsl */ - {119,0,nops,0,0,0}, /* ctrsg */ - {0,0,rxl,S,VMU,0}, /* mov */ - {0,0,lr,VMU,S,0}, /* mov */ - {0,0,rxl,S,VML,0}, /* mov */ - {0,0,lr,VML,S,0}, /* mov */ - {0,0,rxl,S,ICR,0}, /* mov */ - {0,0,lr,ICR,S,0}, /* mov */ - {0,0,rxl,S,TCPU,0}, /* mov */ - {0,0,lr,TCPU,S,0}, /* mov */ - {0,0,0,0,0,0}, - {0,0,0,0,0,0}, - {0,0,0,0,0,0}, - {0,0,0,0,0,0}, - {120,0,nops,0,0,0}, /* stop */ - {0,0,0,0,0,0}, - {0,0,rxl,S,TID,0}, /* mov */ - {0,0,lr,TID,S,0}, /* mov */ - {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,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,0,0,0,0}, - {0,0,0,0,0,0}, - {0,0,0,0,0,0}, -}; - -CONST struct formstr e0_format7[] = { - {84,13,r,V,0,0}, /* sum.b.f */ - {84,14,r,V,0,0}, /* sum.h.f */ - {84,15,r,V,0,0}, /* sum.w.f */ - {84,16,r,V,0,0}, /* sum.l.f */ - {85,2,r,V,0,0}, /* all.f */ - {86,2,r,V,0,0}, /* any.f */ - {87,2,r,V,0,0}, /* parity.f */ - {0,0,0,0,0,0}, - {88,13,r,V,0,0}, /* max.b.f */ - {88,14,r,V,0,0}, /* max.h.f */ - {88,15,r,V,0,0}, /* max.w.f */ - {88,16,r,V,0,0}, /* max.l.f */ - {89,13,r,V,0,0}, /* min.b.f */ - {89,14,r,V,0,0}, /* min.h.f */ - {89,15,r,V,0,0}, /* min.w.f */ - {89,16,r,V,0,0}, /* min.l.f */ - {84,11,r,V,0,0}, /* sum.s.f */ - {84,12,r,V,0,0}, /* sum.d.f */ - {90,11,r,V,0,0}, /* prod.s.f */ - {90,12,r,V,0,0}, /* prod.d.f */ - {88,11,r,V,0,0}, /* max.s.f */ - {88,12,r,V,0,0}, /* max.d.f */ - {89,11,r,V,0,0}, /* min.s.f */ - {89,12,r,V,0,0}, /* min.d.f */ - {90,13,r,V,0,0}, /* prod.b.f */ - {90,14,r,V,0,0}, /* prod.h.f */ - {90,15,r,V,0,0}, /* prod.w.f */ - {90,16,r,V,0,0}, /* prod.l.f */ - {0,0,0,0,0,0}, - {0,0,0,0,0,0}, - {0,0,0,0,0,0}, - {0,0,0,0,0,0}, -}; - -CONST struct formstr e1_format0[] = { - {0,0,0,0,0,0}, - {0,0,0,0,0,0}, - {0,0,0,0,0,0}, - {0,0,0,0,0,0}, - {10,18,rrr,S,V,V}, /* sub.s.t */ - {10,19,rrr,S,V,V}, /* sub.d.t */ - {4,18,rrr,S,V,V}, /* div.s.t */ - {4,19,rrr,S,V,V}, /* div.d.t */ - {3,18,rrr,V,V,V}, /* mul.s.t */ - {3,19,rrr,V,V,V}, /* mul.d.t */ - {4,18,rrr,V,V,V}, /* div.s.t */ - {4,19,rrr,V,V,V}, /* div.d.t */ - {3,18,rrr,V,S,V}, /* mul.s.t */ - {3,19,rrr,V,S,V}, /* mul.d.t */ - {4,18,rrr,V,S,V}, /* div.s.t */ - {4,19,rrr,V,S,V}, /* div.d.t */ - {5,1,rrr,V,V,V}, /* and.t */ - {6,1,rrr,V,V,V}, /* or.t */ - {7,1,rrr,V,V,V}, /* xor.t */ - {8,1,rrr,V,V,V}, /* shf.t */ - {5,1,rrr,V,S,V}, /* and.t */ - {6,1,rrr,V,S,V}, /* or.t */ - {7,1,rrr,V,S,V}, /* xor.t */ - {8,1,rrr,V,S,V}, /* shf.t */ - {9,18,rrr,V,V,V}, /* add.s.t */ - {9,19,rrr,V,V,V}, /* add.d.t */ - {10,18,rrr,V,V,V}, /* sub.s.t */ - {10,19,rrr,V,V,V}, /* sub.d.t */ - {9,18,rrr,V,S,V}, /* add.s.t */ - {9,19,rrr,V,S,V}, /* add.d.t */ - {10,18,rrr,V,S,V}, /* sub.s.t */ - {10,19,rrr,V,S,V}, /* sub.d.t */ - {9,20,rrr,V,V,V}, /* add.b.t */ - {9,21,rrr,V,V,V}, /* add.h.t */ - {9,22,rrr,V,V,V}, /* add.w.t */ - {9,23,rrr,V,V,V}, /* add.l.t */ - {9,20,rrr,V,S,V}, /* add.b.t */ - {9,21,rrr,V,S,V}, /* add.h.t */ - {9,22,rrr,V,S,V}, /* add.w.t */ - {9,23,rrr,V,S,V}, /* add.l.t */ - {10,20,rrr,V,V,V}, /* sub.b.t */ - {10,21,rrr,V,V,V}, /* sub.h.t */ - {10,22,rrr,V,V,V}, /* sub.w.t */ - {10,23,rrr,V,V,V}, /* sub.l.t */ - {10,20,rrr,V,S,V}, /* sub.b.t */ - {10,21,rrr,V,S,V}, /* sub.h.t */ - {10,22,rrr,V,S,V}, /* sub.w.t */ - {10,23,rrr,V,S,V}, /* sub.l.t */ - {3,20,rrr,V,V,V}, /* mul.b.t */ - {3,21,rrr,V,V,V}, /* mul.h.t */ - {3,22,rrr,V,V,V}, /* mul.w.t */ - {3,23,rrr,V,V,V}, /* mul.l.t */ - {3,20,rrr,V,S,V}, /* mul.b.t */ - {3,21,rrr,V,S,V}, /* mul.h.t */ - {3,22,rrr,V,S,V}, /* mul.w.t */ - {3,23,rrr,V,S,V}, /* mul.l.t */ - {4,20,rrr,V,V,V}, /* div.b.t */ - {4,21,rrr,V,V,V}, /* div.h.t */ - {4,22,rrr,V,V,V}, /* div.w.t */ - {4,23,rrr,V,V,V}, /* div.l.t */ - {4,20,rrr,V,S,V}, /* div.b.t */ - {4,21,rrr,V,S,V}, /* div.h.t */ - {4,22,rrr,V,S,V}, /* div.w.t */ - {4,23,rrr,V,S,V}, /* div.l.t */ -}; - -CONST struct formstr e1_format1[] = { - {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,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}, - {26,20,a2r,S,0,0}, /* ste.b.t */ - {26,21,a2r,S,0,0}, /* ste.h.t */ - {26,22,a2r,S,0,0}, /* ste.w.t */ - {26,23,a2r,S,0,0}, /* ste.l.t */ - {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}, - {18,20,a1r,V,0,0}, /* ld.b.t */ - {18,21,a1r,V,0,0}, /* ld.h.t */ - {18,22,a1r,V,0,0}, /* ld.w.t */ - {18,23,a1r,V,0,0}, /* ld.l.t */ - {21,20,a2r,V,0,0}, /* st.b.t */ - {21,21,a2r,V,0,0}, /* st.h.t */ - {21,22,a2r,V,0,0}, /* st.w.t */ - {21,23,a2r,V,0,0}, /* st.l.t */ -}; - -CONST struct formstr e1_format2[] = { - {0,0,0,0,0,0}, - {0,0,0,0,0,0}, - {0,0,0,0,0,0}, - {0,0,0,0,0,0}, - {28,20,rr,V,V,0}, /* cvtw.b.t */ - {28,21,rr,V,V,0}, /* cvtw.h.t */ - {29,22,rr,V,V,0}, /* cvtb.w.t */ - {30,22,rr,V,V,0}, /* cvth.w.t */ - {0,0,0,0,0,0}, - {0,0,0,0,0,0}, - {0,0,0,0,0,0}, - {0,0,0,0,0,0}, - {31,23,rr,V,V,0}, /* cvts.l.t */ - {32,22,rr,V,V,0}, /* cvtd.w.t */ - {33,18,rr,V,V,0}, /* cvtl.s.t */ - {28,19,rr,V,V,0}, /* cvtw.d.t */ - {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,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,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}, - {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,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}, - {116,18,rr,V,V,0}, /* frint.s.t */ - {116,19,rr,V,V,0}, /* frint.d.t */ - {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,0,0}, - {0,0,0,0,0,0}, - {81,18,rr,V,V,0}, /* sqrt.s.t */ - {81,19,rr,V,V,0}, /* sqrt.d.t */ - {0,0,0,0,0,0}, - {0,0,0,0,0,0}, -}; - -CONST struct formstr e1_format3[] = { - {32,18,rr,V,V,0}, /* cvtd.s.t */ - {31,19,rr,V,V,0}, /* cvts.d.t */ - {33,19,rr,V,V,0}, /* cvtl.d.t */ - {32,23,rr,V,V,0}, /* cvtd.l.t */ - {0,0,0,0,0,0}, - {0,0,0,0,0,0}, - {0,0,0,0,0,0}, - {0,0,0,0,0,0}, - {36,1,rr,V,V,0}, /* tzc.t */ - {44,1,rr,V,V,0}, /* lop.t */ - {117,1,rr,V,V,0}, /* xpnd.t */ - {42,1,rr,V,V,0}, /* not.t */ - {8,1,rr,S,V,0}, /* shf.t */ - {35,24,rr,V,V,0}, /* plc.t.t */ - {0,0,0,0,0,0}, - {0,0,0,0,0,0}, - {37,18,rr,V,V,0}, /* eq.s.t */ - {37,19,rr,V,V,0}, /* eq.d.t */ - {43,18,rr,V,V,0}, /* neg.s.t */ - {43,19,rr,V,V,0}, /* neg.d.t */ - {37,18,rr,S,V,0}, /* eq.s.t */ - {37,19,rr,S,V,0}, /* eq.d.t */ - {0,0,0,0,0,0}, - {0,0,0,0,0,0}, - {40,18,rr,V,V,0}, /* le.s.t */ - {40,19,rr,V,V,0}, /* le.d.t */ - {41,18,rr,V,V,0}, /* lt.s.t */ - {41,19,rr,V,V,0}, /* lt.d.t */ - {40,18,rr,S,V,0}, /* le.s.t */ - {40,19,rr,S,V,0}, /* le.d.t */ - {41,18,rr,S,V,0}, /* lt.s.t */ - {41,19,rr,S,V,0}, /* lt.d.t */ - {37,20,rr,V,V,0}, /* eq.b.t */ - {37,21,rr,V,V,0}, /* eq.h.t */ - {37,22,rr,V,V,0}, /* eq.w.t */ - {37,23,rr,V,V,0}, /* eq.l.t */ - {37,20,rr,S,V,0}, /* eq.b.t */ - {37,21,rr,S,V,0}, /* eq.h.t */ - {37,22,rr,S,V,0}, /* eq.w.t */ - {37,23,rr,S,V,0}, /* eq.l.t */ - {40,20,rr,V,V,0}, /* le.b.t */ - {40,21,rr,V,V,0}, /* le.h.t */ - {40,22,rr,V,V,0}, /* le.w.t */ - {40,23,rr,V,V,0}, /* le.l.t */ - {40,20,rr,S,V,0}, /* le.b.t */ - {40,21,rr,S,V,0}, /* le.h.t */ - {40,22,rr,S,V,0}, /* le.w.t */ - {40,23,rr,S,V,0}, /* le.l.t */ - {41,20,rr,V,V,0}, /* lt.b.t */ - {41,21,rr,V,V,0}, /* lt.h.t */ - {41,22,rr,V,V,0}, /* lt.w.t */ - {41,23,rr,V,V,0}, /* lt.l.t */ - {41,20,rr,S,V,0}, /* lt.b.t */ - {41,21,rr,S,V,0}, /* lt.h.t */ - {41,22,rr,S,V,0}, /* lt.w.t */ - {41,23,rr,S,V,0}, /* lt.l.t */ - {43,20,rr,V,V,0}, /* neg.b.t */ - {43,21,rr,V,V,0}, /* neg.h.t */ - {43,22,rr,V,V,0}, /* neg.w.t */ - {43,23,rr,V,V,0}, /* neg.l.t */ - {0,0,0,0,0,0}, - {0,0,0,0,0,0}, - {0,0,0,0,0,0}, - {0,0,0,0,0,0}, -}; - -CONST struct formstr e1_format4[] = { - {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}, -}; - -CONST struct formstr e1_format5[] = { - {51,20,rr,V,V,0}, /* ldvi.b.t */ - {51,21,rr,V,V,0}, /* ldvi.h.t */ - {51,22,rr,V,V,0}, /* ldvi.w.t */ - {51,23,rr,V,V,0}, /* ldvi.l.t */ - {28,18,rr,V,V,0}, /* cvtw.s.t */ - {31,22,rr,V,V,0}, /* cvts.w.t */ - {28,23,rr,V,V,0}, /* cvtw.l.t */ - {33,22,rr,V,V,0}, /* cvtl.w.t */ - {52,20,rxr,V,V,0}, /* stvi.b.t */ - {52,21,rxr,V,V,0}, /* stvi.h.t */ - {52,22,rxr,V,V,0}, /* stvi.w.t */ - {52,23,rxr,V,V,0}, /* stvi.l.t */ - {52,20,rxr,S,V,0}, /* stvi.b.t */ - {52,21,rxr,S,V,0}, /* stvi.h.t */ - {52,22,rxr,S,V,0}, /* stvi.w.t */ - {52,23,rxr,S,V,0}, /* stvi.l.t */ -}; - -CONST struct formstr e1_format6[] = { - {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,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,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}, - {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}, -}; - -CONST struct formstr e1_format7[] = { - {84,20,r,V,0,0}, /* sum.b.t */ - {84,21,r,V,0,0}, /* sum.h.t */ - {84,22,r,V,0,0}, /* sum.w.t */ - {84,23,r,V,0,0}, /* sum.l.t */ - {85,1,r,V,0,0}, /* all.t */ - {86,1,r,V,0,0}, /* any.t */ - {87,1,r,V,0,0}, /* parity.t */ - {0,0,0,0,0,0}, - {88,20,r,V,0,0}, /* max.b.t */ - {88,21,r,V,0,0}, /* max.h.t */ - {88,22,r,V,0,0}, /* max.w.t */ - {88,23,r,V,0,0}, /* max.l.t */ - {89,20,r,V,0,0}, /* min.b.t */ - {89,21,r,V,0,0}, /* min.h.t */ - {89,22,r,V,0,0}, /* min.w.t */ - {89,23,r,V,0,0}, /* min.l.t */ - {84,18,r,V,0,0}, /* sum.s.t */ - {84,19,r,V,0,0}, /* sum.d.t */ - {90,18,r,V,0,0}, /* prod.s.t */ - {90,19,r,V,0,0}, /* prod.d.t */ - {88,18,r,V,0,0}, /* max.s.t */ - {88,19,r,V,0,0}, /* max.d.t */ - {89,18,r,V,0,0}, /* min.s.t */ - {89,19,r,V,0,0}, /* min.d.t */ - {90,20,r,V,0,0}, /* prod.b.t */ - {90,21,r,V,0,0}, /* prod.h.t */ - {90,22,r,V,0,0}, /* prod.w.t */ - {90,23,r,V,0,0}, /* prod.l.t */ - {0,0,0,0,0,0}, - {0,0,0,0,0,0}, - {0,0,0,0,0,0}, - {0,0,0,0,0,0}, -}; - -char *lop[] = { - "mov", /* 0 */ - "merg", /* 1 */ - "mask", /* 2 */ - "mul", /* 3 */ - "div", /* 4 */ - "and", /* 5 */ - "or", /* 6 */ - "xor", /* 7 */ - "shf", /* 8 */ - "add", /* 9 */ - "sub", /* 10 */ - "exit", /* 11 */ - "jmp", /* 12 */ - "jmpi", /* 13 */ - "jmpa", /* 14 */ - "jmps", /* 15 */ - "tac", /* 16 */ - "ldea", /* 17 */ - "ld", /* 18 */ - "tas", /* 19 */ - "pshea", /* 20 */ - "st", /* 21 */ - "call", /* 22 */ - "calls", /* 23 */ - "callq", /* 24 */ - "pfork", /* 25 */ - "ste", /* 26 */ - "incr", /* 27 */ - "cvtw", /* 28 */ - "cvtb", /* 29 */ - "cvth", /* 30 */ - "cvts", /* 31 */ - "cvtd", /* 32 */ - "cvtl", /* 33 */ - "ldpa", /* 34 */ - "plc", /* 35 */ - "tzc", /* 36 */ - "eq", /* 37 */ - "leu", /* 38 */ - "ltu", /* 39 */ - "le", /* 40 */ - "lt", /* 41 */ - "not", /* 42 */ - "neg", /* 43 */ - "lop", /* 44 */ - "cprs", /* 45 */ - "nop", /* 46 */ - "br", /* 47 */ - "bri", /* 48 */ - "bra", /* 49 */ - "brs", /* 50 */ - "ldvi", /* 51 */ - "stvi", /* 52 */ - "ldsdr", /* 53 */ - "ldkdr", /* 54 */ - "ln", /* 55 */ - "patu", /* 56 */ - "pate", /* 57 */ - "pich", /* 58 */ - "plch", /* 59 */ - "idle", /* 60 */ - "rtnq", /* 61 */ - "cfork", /* 62 */ - "rtn", /* 63 */ - "wfork", /* 64 */ - "join", /* 65 */ - "rtnc", /* 66 */ - "exp", /* 67 */ - "sin", /* 68 */ - "cos", /* 69 */ - "psh", /* 70 */ - "pop", /* 71 */ - "eni", /* 72 */ - "dsi", /* 73 */ - "bkpt", /* 74 */ - "msync", /* 75 */ - "mski", /* 76 */ - "xmti", /* 77 */ - "tstvv", /* 78 */ - "diag", /* 79 */ - "pbkpt", /* 80 */ - "sqrt", /* 81 */ - "casr", /* 82 */ - "atan", /* 83 */ - "sum", /* 84 */ - "all", /* 85 */ - "any", /* 86 */ - "parity", /* 87 */ - "max", /* 88 */ - "min", /* 89 */ - "prod", /* 90 */ - "halt", /* 91 */ - "sysc", /* 92 */ - "trap", /* 93 */ - "tst", /* 94 */ - "lck", /* 95 */ - "ulk", /* 96 */ - "spawn", /* 97 */ - "ldcmr", /* 98 */ - "stcmr", /* 99 */ - "popr", /* 100 */ - "pshr", /* 101 */ - "rcvr", /* 102 */ - "matm", /* 103 */ - "sndr", /* 104 */ - "putr", /* 105 */ - "getr", /* 106 */ - "matr", /* 107 */ - "mat", /* 108 */ - "get", /* 109 */ - "rcv", /* 110 */ - "inc", /* 111 */ - "put", /* 112 */ - "snd", /* 113 */ - "enal", /* 114 */ - "enag", /* 115 */ - "frint", /* 116 */ - "xpnd", /* 117 */ - "ctrsl", /* 118 */ - "ctrsg", /* 119 */ - "stop", /* 120 */ -}; - -char *rop[] = { - "", /* 0 */ - ".t", /* 1 */ - ".f", /* 2 */ - ".s", /* 3 */ - ".d", /* 4 */ - ".b", /* 5 */ - ".h", /* 6 */ - ".w", /* 7 */ - ".l", /* 8 */ - ".x", /* 9 */ - ".u", /* 10 */ - ".s.f", /* 11 */ - ".d.f", /* 12 */ - ".b.f", /* 13 */ - ".h.f", /* 14 */ - ".w.f", /* 15 */ - ".l.f", /* 16 */ - ".t.f", /* 17 */ - ".s.t", /* 18 */ - ".d.t", /* 19 */ - ".b.t", /* 20 */ - ".h.t", /* 21 */ - ".w.t", /* 22 */ - ".l.t", /* 23 */ - ".t.t", /* 24 */ -}; diff --git a/contrib/gdb/include/opcode/h8300.h b/contrib/gdb/include/opcode/h8300.h deleted file mode 100644 index 9d726e2e38e60..0000000000000 --- a/contrib/gdb/include/opcode/h8300.h +++ /dev/null @@ -1,550 +0,0 @@ -/* Opcode table for the H8-300 - Copyright (C) 1991,1992 Free Software Foundation. - Written by Steve Chamberlain, sac@cygnus.com. - - This file is part of GDB, the GNU Debugger and GAS, the GNU Assembler. - - 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 2 of the License, 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ - -/* Instructions are stored as a sequence of nibbles. - If the nibble has value 15 or less then the representation is complete. - Otherwise, we record what it contains with several flags. */ - -typedef int op_type; - -#define Hex0 0 -#define Hex1 1 -#define Hex2 2 -#define Hex3 3 -#define Hex4 4 -#define Hex5 5 -#define Hex6 6 -#define Hex7 7 -#define Hex8 8 -#define Hex9 9 -#define HexA 10 -#define HexB 11 -#define HexC 12 -#define HexD 13 -#define HexE 14 -#define HexF 15 - -#define START 0x20 -#define SRC 0x40 -#define DST 0x80 -#define L_8 0x01 -#define L_16 0x02 -#define L_32 0x04 -#define L_P 0x08 -#define L_24 0x10 - -#define REG 0x100 -#define IMM 0x1000 -#define DISP 0x2000 -#define IND 0x4000 -#define INC 0x8000 -#define DEC 0x10000 -#define L_3 0x20000 -#define KBIT 0x40000 -#define DBIT 0x80000 -#define DISPREG 0x100000 -#define IGNORE 0x200000 -#define E 0x400000 /* FIXME: end of nibble sequence? */ -#define L_2 0x800000 -#define CCR 0x4000000 -#define ABS 0x8000000 -#define B30 0x1000000 /* bit 3 must be low */ -#define B31 0x2000000 /* bit 3 must be high */ -#define ABSJMP 0x10000000 -#define ABSMOV 0x20000000 -#define PCREL 0x40000000 -#define MEMIND 0x80000000 - -#define IMM3 IMM|L_3 -#define IMM2 IMM|L_2 - -#define SIZE (L_2|L_3|L_8|L_16|L_32|L_P|L_24) -#define MODE (REG|IMM|DISP|IND|INC|DEC|CCR|ABS|MEMIND) - -#define RD8 (DST|L_8|REG) -#define RD16 (DST|L_16|REG) -#define RD32 (DST|L_32|REG) -#define RS8 (SRC|L_8|REG) -#define RS16 (SRC|L_16|REG) -#define RS32 (SRC|L_32|REG) - -#define RSP (SRC|L_P|REG) -#define RDP (DST|L_P|REG) - -#define IMM8 (IMM|SRC|L_8) -#define IMM16 (IMM|SRC|L_16) -#define IMM32 (IMM|SRC|L_32) - -#define ABS8SRC (SRC|ABS|L_8) -#define ABS8DST (DST|ABS|L_8) - -#define DISP8 (PCREL|L_8) -#define DISP16 (PCREL|L_16) - -#define DISP8SRC (DISP|L_8|SRC) -#define DISP16SRC (DISP|L_16|SRC) - -#define DISP8DST (DISP|L_8|DST) -#define DISP16DST (DISP|L_16|DST) - -#define ABS16SRC (SRC|ABS|L_16) -#define ABS16DST (DST|ABS|L_16) -#define ABS24SRC (SRC|ABS|L_24) -#define ABS24DST (DST|ABS|L_24) - -#define RDDEC (DST|DEC) -#define RSINC (SRC|INC) - -#define RDIND (DST|IND) -#define RSIND (SRC|IND) - -#if 1 -#define OR8 RS8 /* ??? OR as in One Register? */ -#define OR16 RS16 -#define OR32 RS32 -#else -#define OR8 RD8 -#define OR16 RD16 -#define OR32 RD32 -#endif - -struct code -{ - op_type nib[30]; -}; - -struct arg -{ - op_type nib[3]; -}; - -struct h8_opcode -{ - int how; - int inbase; - int time; - char *name; - struct arg args; - struct code data; - int length; - int noperands; - int idx; - int size; -}; - -#ifdef DEFINE_TABLE - -#define BITOP(code, imm, name, op00, op01,op10,op11, op20,op21)\ -{ code, 1, 2, name, {imm,RD8,E}, {op00, op01, imm, RD8, E, 0, 0, 0, 0}, 0, 0, 0, 0},\ -{ code, 1, 6, name, {imm,RDIND,E}, {op10, op11, B30|RDIND, 0, op00,op01, imm, 0, E}, 0, 0, 0, 0},\ -{ code, 1, 6, name, {imm,ABS8DST,E},{op20, op21, ABS8DST, IGNORE, op00,op01, imm, 0,E}, 0, 0, 0, 0} - -#define EBITOP(code, imm, name, op00, op01,op10,op11, op20,op21)\ - BITOP(code,imm, name, op00+1, op01, op10,op11, op20,op21),\ - BITOP(code,RS8, name, op00, op01, op10,op11, op20,op21) - -#define WTWOP(code,name, op1, op2) \ -{ code, 1, 2, name, {RS16, RD16, E}, { op1, op2, RS16, RD16, E, 0, 0, 0, 0}, 0, 0, 0, 0} - -#define BRANCH(code, name, op) \ -{ code, 1, 4,name,{DISP8,E,0}, { 0x4, op, DISP8, IGNORE, E, 0, 0, 0, 0}, 0, 0, 0, 0}, \ -{ code, 0, 6,name,{DISP16,E,0}, { 0x5, 0x8, op, 0x0, DISP16, IGNORE, IGNORE, IGNORE, E,0}, 0, 0, 0, 0} - -#define SOP(code, x,name) \ -{code, 1, x, name - -#define NEW_SOP(code, in,x,name) \ -{code, in, x, name -#define EOP ,0,0,0 } - -#define TWOOP(code, name, op1, op2,op3) \ -{ code,1, 2,name, {IMM8, RD8, E}, { op1, RD8, IMM8, IGNORE, E, 0, 0, 0, 0}, 0, 0, 0, 0},\ -{ code, 1, 2,name, {RS8, RD8, E}, { op2, op3, RS8, RD8, E, 0, 0, 0, 0}, 0, 0, 0, 0} - -#define UNOP(code,name, op1, op2) \ -{ code, 1, 2, name, {OR8, E, 0}, { op1, op2, 0, OR8, E, 0, 0, 0, 0}, 0, 0, 0, 0} - -#define UNOP3(code, name, op1, op2, op3) \ -{ O(code,SB), 1, 2, name, {OR8, E, 0}, {op1, op2, op3+0, OR8, E, 0, 0, 0, 0}, 0, 0, 0, 0}, \ -{ O(code,SW), 0, 2, name, {OR16, E, 0}, {op1, op2, op3+1, OR16, E, 0, 0, 0, 0}, 0, 0, 0, 0}, \ -{ O(code,SL), 0, 2, name, {OR32, E, 0}, {op1, op2, op3+3, OR32|B30, E, 0, 0, 0, 0}, 0, 0, 0, 0} - -#define IMM32LIST IMM32,IGNORE,IGNORE,IGNORE,IGNORE,IGNORE,IGNORE,IGNORE -#define IMM24LIST IMM24,IGNORE,IGNORE,IGNORE,IGNORE,IGNORE -#define IMM16LIST IMM16,IGNORE,IGNORE,IGNORE -#define A16LIST L_16,IGNORE,IGNORE,IGNORE -#define DISP24LIST DISP|L_24,IGNORE,IGNORE,IGNORE,IGNORE,IGNORE -#define ABS24LIST ABS|L_24,IGNORE,IGNORE,IGNORE,IGNORE,IGNORE -#define A24LIST L_24,IGNORE,IGNORE,IGNORE,IGNORE,IGNORE -#define PREFIX32 0x0,0x1,0x0,0x0 -#define PREFIXLDC 0x0,0x1,0x4,0x0 - - -#define O(op, size) (op*4+size) - -#define O_RECOMPILE 0 -#define O_ADD 1 -#define O_ADDX 2 -#define O_AND 3 -#define O_BAND 4 -#define O_BRA 5 -#define O_BRN 6 -#define O_BHI 7 -#define O_BLS 8 -#define O_BCC 9 -#define O_BCS 10 -#define O_BNE 11 -#define O_BVC 12 -#define O_BVS 13 -#define O_BPL 14 -#define O_BMI 15 -#define O_BGE 16 -#define O_BLT 17 -#define O_BGT 18 -#define O_BLE 19 -#define O_ANDC 20 -#define O_BEQ 21 -#define O_BCLR 22 -#define O_BIAND 23 -#define O_BILD 24 -#define O_BIOR 25 -#define O_BIXOR 26 -#define O_BIST 27 -#define O_BLD 28 -#define O_BNOT 29 -#define O_BSET 30 -#define O_BSR 31 -#define O_BXOR 32 -#define O_CMP 33 -#define O_DAA 34 -#define O_DAS 35 -#define O_DEC 36 -#define O_DIVU 37 -#define O_DIVS 38 -#define O_INC 39 -#define O_LDC 40 -#define O_MOV_TO_MEM 41 -#define O_OR 42 -#define O_ROTL 43 -#define O_ROTR 44 -#define O_ROTXL 45 -#define O_ROTXR 46 -#define O_BPT 47 -#define O_SHAL 48 -#define O_SHAR 49 -#define O_SHLL 50 -#define O_SHLR 51 -#define O_SUB 52 -#define O_SUBS 53 -#define O_TRAPA 54 -#define O_XOR 55 -#define O_XORC 56 -#define O_BOR 57 -#define O_BST 58 -#define O_BTST 59 -#define O_EEPMOV 60 -#define O_EXTS 61 -#define O_EXTU 62 -#define O_JMP 63 -#define O_JSR 64 -#define O_MULU 65 -#define O_MULS 66 -#define O_NOP 67 -#define O_NOT 68 -#define O_ORC 69 -#define O_RTE 70 -#define O_STC 71 -#define O_SUBX 72 -#define O_NEG 73 -#define O_RTS 74 -#define O_SLEEP 75 -#define O_ILL 76 -#define O_ADDS 77 -#define O_SYSCALL 78 -#define O_MOV_TO_REG 79 -#define O_LAST 80 -#define SB 0 -#define SW 1 -#define SL 2 - - -/* FIXME: Lots of insns have "E, 0, 0, 0, 0" in the nibble code sequences. - Methinks the zeroes aren't necessary. Once confirmed, nuke 'em. */ - -struct h8_opcode h8_opcodes[] = -{ - TWOOP(O(O_ADD,SB),"add.b", 0x8, 0x0,0x8), - - NEW_SOP(O(O_ADD,SW),1,2,"add.w"),{RS16,RD16,E },{0x0,0x9,RS16,RD16,E} EOP, - NEW_SOP(O(O_ADD,SW),0,4,"add.w"),{IMM16,RD16,E },{0x7,0x9,0x1,RD16,IMM16,IGNORE,IGNORE,IGNORE,E} EOP, - NEW_SOP(O(O_ADD,SL),0,2,"add.l"),{RS32,RD32,E }, {0x0,0xA,B31|RS32,B30|RD32,E} EOP, - NEW_SOP(O(O_ADD,SL),0,6,"add.l"),{IMM32,RD32,E },{0x7,0xA,0x1,B30|RD32,IMM32LIST,E} EOP, - NEW_SOP(O(O_ADDS,SL),1,2,"adds"), {KBIT,RDP,E}, {0x0,0xB,KBIT,RDP,E,0,0,0,0} EOP, - - TWOOP(O(O_ADDX,SB),"addx",0x9,0x0,0xE), - TWOOP(O(O_AND,SB), "and.b",0xE,0x1,0x6), - - NEW_SOP(O(O_AND,SW),0,2,"and.w"),{RS16,RD16,E },{0x6,0x6,RS16,RD16,E} EOP, - NEW_SOP(O(O_AND,SW),0,4,"and.w"),{IMM16,RD16,E },{0x7,0x9,0x6,RD16,IMM16,IGNORE,IGNORE,IGNORE,E} EOP, - - NEW_SOP(O(O_AND,SL),0,6,"and.l"),{IMM32,RD32,E },{0x7,0xA,0x6,B30|RD32,IMM32LIST,E} EOP, - NEW_SOP(O(O_AND,SL),0,2,"and.l") ,{RS32,RD32,E },{0x0,0x1,0xF,0x0,0x6,0x6,B30|RS32,B30|RD32,E} EOP, - - NEW_SOP(O(O_ANDC,SB),1,2,"andc"), {IMM8,CCR,E},{ 0x0,0x6,IMM8,IGNORE,E,0,0,0,0} EOP, - - BITOP(O(O_BAND,SB), IMM3,"band",0x7,0x6,0x7,0xC,0x7,0xE), - BRANCH(O(O_BRA,SB),"bra",0x0), - BRANCH(O(O_BRA,SB),"bt",0x0), - BRANCH(O(O_BRN,SB),"brn",0x1), - BRANCH(O(O_BRN,SB),"bf",0x1), - BRANCH(O(O_BHI,SB),"bhi",0x2), - BRANCH(O(O_BLS,SB),"bls",0x3), - BRANCH(O(O_BCC,SB),"bcc",0x4), - BRANCH(O(O_BCC,SB),"bhs",0x4), - BRANCH(O(O_BCS,SB),"bcs",0x5), - BRANCH(O(O_BCS,SB),"blo",0x5), - BRANCH(O(O_BNE,SB),"bne",0x6), - BRANCH(O(O_BEQ,SB),"beq",0x7), - BRANCH(O(O_BVC,SB),"bvc",0x8), - BRANCH(O(O_BVS,SB),"bvs",0x9), - BRANCH(O(O_BPL,SB),"bpl",0xA), - BRANCH(O(O_BMI,SB),"bmi",0xB), - BRANCH(O(O_BGE,SB),"bge",0xC), - BRANCH(O(O_BLT,SB),"blt",0xD), - BRANCH(O(O_BGT,SB),"bgt",0xE), - BRANCH(O(O_BLE,SB),"ble",0xF), - - EBITOP(O(O_BCLR,SB),IMM3, "bclr", 0x6,0x2,0x7,0xD,0x7,0xF), - BITOP(O(O_BIAND,SB),IMM3|B31,"biand",0x7,0x6,0x7,0xC,0x7,0xE), - BITOP(O(O_BILD,SB), IMM3|B31,"bild", 0x7,0x7,0x7,0xC,0x7,0xE), - BITOP(O(O_BIOR,SB), IMM3|B31,"bior", 0x7,0x4,0x7,0xC,0x7,0xE), - BITOP(O(O_BIST,SB), IMM3|B31,"bist", 0x6,0x7,0x7,0xD,0x7,0xF), - BITOP(O(O_BIXOR,SB),IMM3|B31,"bixor",0x7,0x5,0x7,0xC,0x7,0xE), - BITOP(O(O_BLD,SB), IMM3|B30,"bld", 0x7,0x7,0x7,0xC,0x7,0xE), - EBITOP(O(O_BNOT,SB),IMM3|B30,"bnot", 0x6,0x1,0x7,0xD,0x7,0xF), - BITOP(O(O_BOR,SB), IMM3|B30,"bor", 0x7,0x4,0x7,0xC,0x7,0xE), - EBITOP(O(O_BSET,SB),IMM3|B30,"bset", 0x6,0x0,0x7,0xD,0x7,0xF), - - SOP(O(O_BSR,SB),6,"bsr"),{DISP8,E,0},{ 0x5,0x5,DISP8,IGNORE,E,0,0,0,0} EOP, - SOP(O(O_BSR,SB),6,"bsr"),{DISP16,E,0},{ 0x5,0xC,0x0,0x0,DISP16,IGNORE,IGNORE,IGNORE,E,0,0,0,0} EOP, - BITOP(O(O_BST,SB), IMM3|B30,"bst",0x6,0x7,0x7,0xD,0x7,0xF), - EBITOP(O(O_BTST,SB), IMM3|B30,"btst",0x6,0x3,0x7,0xC,0x7,0xE), - BITOP(O(O_BXOR,SB), IMM3|B30,"bxor",0x7,0x5,0x7,0xC,0x7,0xE), - - TWOOP(O(O_CMP,SB), "cmp.b",0xA,0x1,0xC), - WTWOP(O(O_CMP,SW), "cmp.w",0x1,0xD), - - NEW_SOP(O(O_CMP,SW),1,2,"cmp.w"),{RS16,RD16,E },{0x1,0xD,RS16,RD16,E} EOP, - NEW_SOP(O(O_CMP,SW),0,4,"cmp.w"),{IMM16,RD16,E },{0x7,0x9,0x2,RD16,IMM16,IGNORE,IGNORE,IGNORE,E} EOP, - - NEW_SOP(O(O_CMP,SL),0,6,"cmp.l"),{IMM32,RD32,E },{0x7,0xA,0x2,B30|RD32,IMM32LIST,E} EOP, - NEW_SOP(O(O_CMP,SL),0,2,"cmp.l") ,{RS32,RD32,E },{0x1,0xF,B31|RS32,B30|RD32,E} EOP, - - UNOP(O(O_DAA,SB), "daa",0x0,0xF), - UNOP(O(O_DAS,SB), "das",0x1,0xF), - UNOP(O(O_DEC,SB), "dec.b",0x1,0xA), - - NEW_SOP(O(O_DEC, SW),0,2,"dec.w") ,{DBIT,RD16,E },{0x1,0xB,0x5|DBIT,RD16,E} EOP, - NEW_SOP(O(O_DEC, SL),0,2,"dec.l") ,{DBIT,RD32,E },{0x1,0xB,0x7|DBIT,RD32|B30,E} EOP, - - NEW_SOP(O(O_DIVU,SB),1,6,"divxu.b"), {RS8,RD16,E}, {0x5,0x1,RS8,RD16,E,0,0,0,0}EOP, - NEW_SOP(O(O_DIVU,SW),0,20,"divxu.w"),{RS16,RD32,E},{0x5,0x3,RS16,B30|RD32,E}EOP, - - NEW_SOP(O(O_DIVS,SB),0,20,"divxs.b") ,{RS8,RD16,E },{0x0,0x1,0xD,0x0,0x5,0x1,RS8,RD16,E} EOP, - NEW_SOP(O(O_DIVS,SW),0,02,"divxs.w") ,{RS16,RD32,E },{0x0,0x1,0xD,0x0,0x5,0x3,RS16,B30|RD32,E} EOP, - - NEW_SOP(O(O_EEPMOV,SB),1,50,"eepmov"),{ E,0,0},{0x7,0xB,0x5,0xC,0x5,0x9,0x8,0xF,E}EOP, - NEW_SOP(O(O_EEPMOV,SW),0,50,"eepmovw"),{E,0,0},{0x7,0xB,0xD,0x4,0x5,0x9,0x8,0xF,E} EOP, - - NEW_SOP(O(O_EXTS,SW),0,2,"exts.w"),{OR16,E,0},{0x1,0x7,0xD,OR16,E }EOP, - NEW_SOP(O(O_EXTS,SL),0,2,"exts.l"),{OR32,E,0},{0x1,0x7,0xF,OR32|B30,E }EOP, - - NEW_SOP(O(O_EXTU,SW),0,2,"extu.w"),{OR16,E,0},{0x1,0x7,0x5,OR16,E }EOP, - NEW_SOP(O(O_EXTU,SL),0,2,"extu.l"),{OR32,E,0},{0x1,0x7,0x7,OR32|B30,E }EOP, - - UNOP(O(O_INC,SB), "inc",0x0,0xA), - - NEW_SOP(O(O_INC,SW),0,2,"inc.w") ,{DBIT,RD16,E },{0x0,0xB,0x5|DBIT,RD16,E} EOP, - NEW_SOP(O(O_INC,SL),0,2,"inc.l") ,{DBIT,RD32,E },{0x0,0xB,0x7|DBIT,RD32|B30,E} EOP, - - SOP(O(O_JMP,SB),4,"jmp"),{RSIND,E,0},{0x5,0x9,B30|RSIND,0x0,E,0,0,0,0}EOP, - SOP(O(O_JMP,SB),6,"jmp"),{SRC|ABSJMP,E,0},{0x5,0xA,SRC|ABSJMP,IGNORE,IGNORE,IGNORE,IGNORE,IGNORE,E}EOP, - SOP(O(O_JMP,SB),8,"jmp"),{SRC|MEMIND,E,0},{0x5,0xB,SRC|MEMIND,IGNORE,E,0,0,0,0}EOP, - - SOP(O(O_JSR,SB),6,"jsr"),{SRC|RSIND,E,0}, {0x5,0xD,B30|RSIND,0x0,E,0,0,0,0}EOP, - SOP(O(O_JSR,SB),8,"jsr"),{SRC|ABSJMP,E,0},{0x5,0xE,SRC|ABSJMP,IGNORE,IGNORE,IGNORE,IGNORE,IGNORE,E}EOP, - SOP(O(O_JSR,SB),8,"jsr"),{SRC|MEMIND,E,0},{0x5,0xF,SRC|MEMIND,IGNORE,E,0,0,0,0}EOP, - - NEW_SOP(O(O_LDC,SB),1,2,"ldc"),{IMM8,CCR,E}, { 0x0,0x7,IMM8,IGNORE,E,0,0,0,0}EOP, - NEW_SOP(O(O_LDC,SB),1,2,"ldc"),{OR8,CCR,E}, { 0x0,0x3,0x0,OR8,E,0,0,0,0}EOP, - NEW_SOP(O(O_LDC,SB),0,2,"ldc"),{ABS16SRC,CCR,E}, {PREFIXLDC,0x6,0xB,0x0,0x0,ABS16SRC,IGNORE,IGNORE,IGNORE,E}EOP, - NEW_SOP(O(O_LDC,SB),0,2,"ldc"),{ABS24SRC,CCR,E}, {PREFIXLDC,0x6,0xB,0x2,0x0,0x0,0x0,SRC|ABS24LIST,E}EOP, - NEW_SOP(O(O_LDC,SB),0,2,"ldc"),{DISP|SRC|L_16,CCR,E},{PREFIXLDC,0x6,0x9,B30|DISPREG,0,DISP|L_16,IGNORE,IGNORE,IGNORE,E}EOP, - NEW_SOP(O(O_LDC,SB),0,2,"ldc"),{DISP|SRC|L_24,CCR,E},{PREFIXLDC,0x7,0x8,B30|DISPREG,0,0x6,0xB,0x2,0x0,0x0,0x0,SRC|DISP24LIST,E}EOP, - NEW_SOP(O(O_LDC,SB),0,2,"ldc"),{RSINC,CCR,E}, {PREFIXLDC,0x6,0xD,B30|RSINC,0x0,E}EOP, - NEW_SOP(O(O_LDC,SB),0,2,"ldc"),{RSIND,CCR,E}, {PREFIXLDC,0x6,0x9,B30|RDIND,0x0,E} EOP, - - - SOP(O(O_MOV_TO_REG,SB),4,"mov.b"),{ABSMOV|ABS|SRC|L_16,RD8,E}, { 0x6,0xA,0x0,RD8,ABSMOV|SRC|ABS|A16LIST,E}EOP, - SOP(O(O_MOV_TO_REG,SB),6,"mov.b"),{ABSMOV|ABS|SRC|L_24,RD8,E }, { 0x6,0xA,0x2,RD8,0x0,0x0,SRC|ABSMOV|ABS|A24LIST,E }EOP, - SOP(O(O_MOV_TO_MEM,SB),4,"mov.b"),{RS8,ABSMOV|ABS|L_16|DST,E}, { 0x6,0xA,0x8,RS8,ABSMOV|DST|ABS|A16LIST,E}EOP, - SOP(O(O_MOV_TO_MEM,SB),6,"mov.b"),{RS8,ABSMOV|ABS|DST|L_24,E }, { 0x6,0xA,0xA,RS8,0x0,0x0,DST|ABSMOV|ABS|A24LIST,E }EOP, - - SOP(O(O_MOV_TO_REG,SB),6,"mov.b"),{DISP|L_24|SRC,RD8,E}, { 0x7,0x8,B30|DISPREG,0x0,0x6,0xA,0x2,RD8,0x0,0x0,SRC|DISP24LIST,E}EOP, - SOP(O(O_MOV_TO_MEM,SB),6,"mov.b"),{RS8,DISP|L_24|DST,E}, { 0x7,0x8,B30|DISPREG,0x0,0x6,0xA,0xA,RS8,0x0,0x0,DST|DISP24LIST,E}EOP, - - - - SOP(O(O_MOV_TO_REG,SB),2,"mov.b"),{RS8,RD8,E}, { 0x0,0xC,RS8,RD8,E,0,0,0,0}EOP, - SOP(O(O_MOV_TO_REG,SB),2,"mov.b"),{IMM8,RD8,E}, { 0xF,RD8,IMM8,IGNORE,E,0,0,0,0}EOP, - SOP(O(O_MOV_TO_REG,SB),4,"mov.b"),{RSIND,RD8,E}, { 0x6,0x8,B30|RSIND,RD8,E,0,0,0,0}EOP, - SOP(O(O_MOV_TO_REG,SB),6,"mov.b"),{DISP16SRC,RD8,E}, { 0x6,0xE,B30|DISPREG,RD8,DISP16SRC,IGNORE,IGNORE,IGNORE,E}EOP, - SOP(O(O_MOV_TO_REG,SB),6,"mov.b"),{RSINC,RD8,E}, { 0x6,0xC,B30|RSINC,RD8,E,0,0,0,0}EOP, - - SOP(O(O_MOV_TO_REG,SB),4,"mov.b"),{ABS8SRC,RD8,E}, { 0x2,RD8,ABS8SRC,IGNORE,E,0,0,0,0}EOP, - SOP(O(O_MOV_TO_MEM,SB),4,"mov.b"),{RS8,RDIND,E}, { 0x6,0x8,RDIND|B31,RS8,E,0,0,0,0}EOP, - SOP(O(O_MOV_TO_MEM,SB),6,"mov.b"),{RS8,DISP16DST,E}, { 0x6,0xE,DISPREG|B31,RS8,DISP16DST,IGNORE,IGNORE,IGNORE,E}EOP, - SOP(O(O_MOV_TO_MEM,SB),6,"mov.b"),{RS8,RDDEC|B31,E}, { 0x6,0xC,RDDEC|B31,RS8,E,0,0,0,0}EOP, - - SOP(O(O_MOV_TO_MEM,SB),4,"mov.b"),{RS8,ABS8DST,E}, { 0x3,RS8,ABS8DST,IGNORE,E,0,0,0,0}EOP, - - SOP(O(O_MOV_TO_MEM,SW),6,"mov.w"),{RS16,RDIND,E}, { 0x6,0x9,RDIND|B31,RS16,E,0,0,0,0}EOP, - SOP(O(O_MOV_TO_REG,SW),6,"mov.w"),{DISP|L_24|SRC,RD16,E},{ 0x7,0x8,B30|DISPREG,0x0,0x6,0xB,0x2,RD16,0x0,0x0,SRC|DISP24LIST,E}EOP, - SOP(O(O_MOV_TO_MEM,SW),6,"mov.w"),{RS16,DISP|L_24|DST,E},{ 0x7,0x8,B30|DISPREG,0x0,0x6,0xB,0xA,RS16,0x0,0x0,DST|DISP24LIST,E}EOP, - SOP(O(O_MOV_TO_REG,SW),6,"mov.w"),{ABS|L_24|SRC,RD16,E },{ 0x6,0xB,0x2,RD16,0x0,0x0,SRC|ABS24LIST,E }EOP, - SOP(O(O_MOV_TO_MEM,SW),6,"mov.w"),{RS16,ABS|L_24|DST,E },{ 0x6,0xB,0xA,RS16,0x0,0x0,DST|ABS24LIST,E }EOP, - SOP(O(O_MOV_TO_REG,SW),2,"mov.w"),{RS16,RD16,E}, { 0x0,0xD,RS16, RD16,E,0,0,0,0}EOP, - SOP(O(O_MOV_TO_REG,SW),4,"mov.w"),{IMM16,RD16,E}, { 0x7,0x9,0x0,RD16,IMM16,IGNORE,IGNORE,IGNORE,E}EOP, - SOP(O(O_MOV_TO_REG,SW),4,"mov.w"),{RSIND,RD16,E}, { 0x6,0x9,B30|RSIND,RD16,E,0,0,0,0}EOP, - SOP(O(O_MOV_TO_REG,SW),6,"mov.w"),{DISP16SRC,RD16,E}, { 0x6,0xF,B30|DISPREG,RD16,DISP16SRC,IGNORE,IGNORE,IGNORE,E}EOP, - SOP(O(O_MOV_TO_REG,SW),6,"mov.w"),{RSINC,RD16,E}, { 0x6,0xD,B30|RSINC,RD16,E,0,0,0,0}EOP, - SOP(O(O_MOV_TO_REG,SW),6,"mov.w"),{ABS16SRC,RD16,E}, { 0x6,0xB,0x0,RD16,ABS16SRC,IGNORE,IGNORE,IGNORE,E}EOP, - - SOP(O(O_MOV_TO_MEM,SW),6,"mov.w"),{RS16,DISP16DST,E}, { 0x6,0xF,DISPREG|B31,RS16,DISP16DST,IGNORE,IGNORE,IGNORE,E}EOP, - SOP(O(O_MOV_TO_MEM,SW),6,"mov.w"),{RS16,RDDEC,E}, { 0x6,0xD,RDDEC|B31,RS16,E,0,0,0,0}EOP, - SOP(O(O_MOV_TO_MEM,SW),6,"mov.w"),{RS16,ABS16DST,E}, { 0x6,0xB,0x8,RS16,ABS16DST,IGNORE,IGNORE,IGNORE,E}EOP, - - SOP(O(O_MOV_TO_REG,SL),4,"mov.l"),{IMM32,RD32,E}, { 0x7,0xA,0x0,B30|RD32,IMM32LIST,E}EOP, - SOP(O(O_MOV_TO_REG,SL),2,"mov.l"),{RS32,RD32,E}, { 0x0,0xF,B31|RS32,B30|RD32,E,0,0,0,0}EOP, - - SOP(O(O_MOV_TO_REG,SL),4,"mov.l"),{RSIND,RD32,E}, { PREFIX32,0x6,0x9,RSIND|B30,B30|RD32,E,0,0,0,0 }EOP, - SOP(O(O_MOV_TO_REG,SL),6,"mov.l"),{DISP16SRC,RD32,E}, { PREFIX32,0x6,0xF,DISPREG|B30,B30|RD32,DISP16SRC,IGNORE,IGNORE,IGNORE,E }EOP, - SOP(O(O_MOV_TO_REG,SL),6,"mov.l"),{DISP|L_24|SRC,RD32,E},{ PREFIX32,0x7,0x8,B30|DISPREG,0x0,0x6,0xB,0x2,B30|RD32,0x0,0x0,SRC|DISP24LIST,E }EOP, - SOP(O(O_MOV_TO_REG,SL),6,"mov.l"),{RSINC,RD32,E}, { PREFIX32,0x6,0xD,B30|RSINC,B30|RD32,E,0,0,0,0 }EOP, - SOP(O(O_MOV_TO_REG,SL),6,"mov.l"),{ABS16SRC,RD32,E}, { PREFIX32,0x6,0xB,0x0,B30|RD32,ABS16SRC,IGNORE,IGNORE,IGNORE,E }EOP, - SOP(O(O_MOV_TO_REG,SL),6,"mov.l"),{ABS24SRC,RD32,E }, { PREFIX32,0x6,0xB,0x2,B30|RD32,0x0,0x0,SRC|ABS24LIST,E }EOP, - SOP(O(O_MOV_TO_MEM,SL),6,"mov.l"),{RS32,RDIND,E}, { PREFIX32,0x6,0x9,RDIND|B31,B30|RS32,E,0,0,0,0 }EOP, - SOP(O(O_MOV_TO_MEM,SL),6,"mov.l"),{RS32,DISP16DST,E}, { PREFIX32,0x6,0xF,DISPREG|B31,B30|RS32,DISP16DST,IGNORE,IGNORE,IGNORE,E }EOP, - SOP(O(O_MOV_TO_MEM,SL),6,"mov.l"),{RS32,DISP|L_24|DST,E},{ PREFIX32,0x7,0x8,B31|DISPREG,0x0,0x6,0xB,0xA,B30|RS32,0x0,0x0,DST|DISP24LIST,E }EOP, - SOP(O(O_MOV_TO_MEM,SL),6,"mov.l"),{RS32,RDDEC,E}, { PREFIX32,0x6,0xD,RDDEC|B31,B30|RS32,E,0,0,0,0 }EOP, - SOP(O(O_MOV_TO_MEM,SL),6,"mov.l"),{RS32,ABS16DST,E}, { PREFIX32,0x6,0xB,0x8,B30|RS32,ABS16DST,IGNORE,IGNORE,IGNORE,E }EOP, - SOP(O(O_MOV_TO_MEM,SL),6,"mov.l"),{RS32,ABS24DST,E }, { PREFIX32,0x6,0xB,0xA,B30|RS32,0x0,0x0,DST|ABS24LIST,E }EOP, - - SOP(O(O_MOV_TO_REG,SB),10,"movfpe"),{ABS16SRC,RD8,E},{ 0x6,0xA,0x4,RD8,ABS16SRC,IGNORE,IGNORE,IGNORE,E}EOP, - SOP(O(O_MOV_TO_MEM,SB),10,"movtpe"),{RS8,ABS16DST,E},{ 0x6,0xA,0xC,RS8,ABS16DST,IGNORE,IGNORE,IGNORE,E}EOP, - - NEW_SOP(O(O_MULU,SB),1,14,"mulxu.b"),{RS8,RD16,E}, { 0x5,0x0,RS8,RD16,E,0,0,0,0}EOP, - NEW_SOP(O(O_MULU,SW),0,14,"mulxu.w"),{RS16,RD32,E},{ 0x5,0x2,RS16,B30|RD32,E,0,0,0,0}EOP, - - NEW_SOP(O(O_MULS,SB),0,20,"mulxs.b"),{RS8,RD16,E}, { 0x0,0x1,0xc,0x0,0x5,0x0,RS8,RD16,E}EOP, - NEW_SOP(O(O_MULS,SW),0,20,"mulxs.w"),{RS16,RD32,E},{ 0x0,0x1,0xc,0x0,0x5,0x2,RS16,B30|RD32,E}EOP, - - /* ??? This can use UNOP3. */ - NEW_SOP(O(O_NEG,SB),1,2,"neg.b"),{ OR8,E, 0},{ 0x1,0x7,0x8,OR8,E,0,0,0,0}EOP, - NEW_SOP(O(O_NEG,SW),0,2,"neg.w"),{ OR16,E,0},{ 0x1,0x7,0x9,OR16,E}EOP, - NEW_SOP(O(O_NEG,SL),0,2,"neg.l"),{ OR32,E,0},{ 0x1,0x7,0xB,B30|OR32,E}EOP, - - NEW_SOP(O(O_NOP,SB),1,2,"nop"),{E,0,0},{ 0x0,0x0,0x0,0x0,E,0,0,0,0}EOP, - - /* ??? This can use UNOP3. */ - NEW_SOP(O(O_NOT,SB),1,2,"not.b"),{ OR8,E, 0},{ 0x1,0x7,0x0,OR8,E,0,0,0,0}EOP, - NEW_SOP(O(O_NOT,SW),0,2,"not.w"),{ OR16,E,0},{ 0x1,0x7,0x1,OR16,E}EOP, - NEW_SOP(O(O_NOT,SL),0,2,"not.l"),{ OR32,E,0},{ 0x1,0x7,0x3,B30|OR32,E}EOP, - - TWOOP(O(O_OR, SB),"or.b",0xC,0x1,0x4), - NEW_SOP(O(O_OR,SW),0,4,"or.w"),{IMM16,RD16,E },{0x7,0x9,0x4,RD16,IMM16,IGNORE,IGNORE,IGNORE,E} EOP, - NEW_SOP(O(O_OR,SW),0,2,"or.w"),{RS16,RD16,E },{0x6,0x4,RS16,RD16,E} EOP, - - NEW_SOP(O(O_OR,SL),0,6,"or.l"),{IMM32,RD32,E },{0x7,0xA,0x4,B30|RD32,IMM32LIST,E} EOP, - NEW_SOP(O(O_OR,SL),0,2,"or.l"),{RS32,RD32,E },{0x0,0x1,0xF,0x0,0x6,0x4,B30|RS32,B30|RD32,E} EOP, - - NEW_SOP(O(O_ORC,SB),1,2,"orc"),{IMM8,CCR,E},{ 0x0,0x4,IMM8,IGNORE,E,0,0,0,0}EOP, - - NEW_SOP(O(O_MOV_TO_REG,SW),1,6,"pop.w"),{OR16,E,0},{ 0x6,0xD,0x7,OR16,E,0,0,0,0}EOP, - NEW_SOP(O(O_MOV_TO_REG,SL),0,6,"pop.l"),{OR32,E,0},{ PREFIX32,0x6,0xD,0x7,OR32|B30,E,0,0,0,0}EOP, - NEW_SOP(O(O_MOV_TO_MEM,SW),1,6,"push.w"),{OR16,E,0},{ 0x6,0xD,0xF,OR16,E,0,0,0,0}EOP, - NEW_SOP(O(O_MOV_TO_MEM,SL),0,6,"push.l"),{OR32,E,0},{ PREFIX32,0x6,0xD,0xF,OR32|B30,E,0,0,0,0}EOP, - - UNOP3(O_ROTL, "rotl", 0x1,0x2,0x8), - UNOP3(O_ROTR, "rotr", 0x1,0x3,0x8), - UNOP3(O_ROTXL, "rotxl",0x1,0x2,0x0), - UNOP3(O_ROTXR, "rotxr",0x1,0x3,0x0), - - SOP(O(O_BPT,SB), 10,"bpt"),{E,0,0},{ 0x7,0xA,0xF,0xF,E,0,0,0,0}EOP, - SOP(O(O_RTE,SB), 10,"rte"),{E,0,0},{ 0x5,0x6,0x7,0x0,E,0,0,0,0}EOP, - SOP(O(O_RTS,SB), 8,"rts"),{E,0,0},{ 0x5,0x4,0x7,0x0,E,0,0,0,0}EOP, - - UNOP3(O_SHAL, "shal",0x1,0x0,0x8), - UNOP3(O_SHAR, "shar",0x1,0x1,0x8), - UNOP3(O_SHLL, "shll",0x1,0x0,0x0), - UNOP3(O_SHLR, "shlr",0x1,0x1,0x0), - - SOP(O(O_SLEEP,SB),2,"sleep"),{E,0,0},{ 0x0,0x1,0x8,0x0,E,0,0,0,0} EOP, - - NEW_SOP(O(O_STC,SB), 1,2,"stc"),{CCR,RD8,E},{ 0x0,0x2,0x0,RD8,E,0,0,0,0} EOP, - - NEW_SOP(O(O_STC,SB),0,2,"stc"),{CCR,RSIND,E}, {PREFIXLDC,0x6,0x9,B31|RDIND,0x0,E} EOP, - NEW_SOP(O(O_STC,SB),0,2,"stc"),{CCR,DISP|DST|L_16,E},{PREFIXLDC,0x6,0x9,B31|DISPREG,0,DST|DISP|L_16,IGNORE,IGNORE,IGNORE,E}EOP, - NEW_SOP(O(O_STC,SB),0,2,"stc"),{CCR,DISP|DST|L_24,E},{PREFIXLDC,0x7,0x8,B31|DISPREG,0,0x6,0xB,0x2,0x0,0x0,0x0,DST|DISP24LIST,E}EOP, - NEW_SOP(O(O_STC,SB),0,2,"stc"),{CCR,RDDEC,E}, {PREFIXLDC,0x6,0xD,B31|RDDEC,0x0,E}EOP, - - NEW_SOP(O(O_STC,SB),0,2,"stc"),{CCR,ABS16SRC,E}, {PREFIXLDC,0x6,0xB,0x8,0x0,ABS16DST,IGNORE,IGNORE,IGNORE,E}EOP, - NEW_SOP(O(O_STC,SB),0,2,"stc"),{CCR,ABS24SRC,E}, {PREFIXLDC,0x6,0xB,0xA,0x0,0x0,0x0,DST|ABS24LIST,E}EOP, - - SOP(O(O_SUB,SB),2,"sub.b"),{RS8,RD8,E},{ 0x1,0x8,RS8,RD8,E,0,0,0,0}EOP, - - NEW_SOP(O(O_SUB,SW),1,2,"sub.w"),{RS16,RD16,E }, {0x1,0x9,RS16,RD16,E} EOP, - NEW_SOP(O(O_SUB,SW),0,4,"sub.w"),{IMM16,RD16,E }, {0x7,0x9,0x3,RD16,IMM16,IGNORE,IGNORE,IGNORE,E} EOP, - NEW_SOP(O(O_SUB,SL),0,2,"sub.l") ,{RS32,RD32,E }, {0x1,0xA,B31|RS32,B30|RD32,E} EOP, - NEW_SOP(O(O_SUB,SL),0,6,"sub.l"), {IMM32,RD32,E },{0x7,0xA,0x3,B30|RD32,IMM32LIST,E} EOP, - - SOP(O(O_SUBS,SL),2,"subs"),{KBIT,RDP,E},{ 0x1,0xB,KBIT,RDP,E,0,0,0,0}EOP, - TWOOP(O(O_SUBX,SB),"subx",0xB,0x1,0xE), - - NEW_SOP(O(O_TRAPA,SB),0,2,"trapa"),{ IMM2,E}, {0x5,0x7,IMM2,IGNORE,E }EOP, - - TWOOP(O(O_XOR, SB),"xor",0xD,0x1,0x5), - - NEW_SOP(O(O_XOR,SW),0,4,"xor.w"),{IMM16,RD16,E },{0x7,0x9,0x5,RD16,IMM16,IGNORE,IGNORE,IGNORE,E} EOP, - NEW_SOP(O(O_XOR,SW),0,2,"xor.w"),{RS16,RD16,E },{0x6,0x5,RS16,RD16,E} EOP, - - NEW_SOP(O(O_XOR,SL),0,6,"xor.l"),{IMM32,RD32,E },{0x7,0xA,0x5,B30|RD32,IMM32LIST,E} EOP, - NEW_SOP(O(O_XOR,SL),0,2,"xor.l") ,{RS32,RD32,E },{0x0,0x1,0xF,0x0,0x6,0x5,B30|RS32,B30|RD32,E} EOP, - - SOP(O(O_XORC,SB),2,"xorc"),{IMM8,CCR,E},{ 0x0,0x5,IMM8,IGNORE,E,0,0,0,0}EOP, - 0 -}; -#else -extern struct h8_opcode h8_opcodes[] ; -#endif - - - - diff --git a/contrib/gdb/include/opcode/hppa.h b/contrib/gdb/include/opcode/hppa.h deleted file mode 100644 index 6f50e6bbea625..0000000000000 --- a/contrib/gdb/include/opcode/hppa.h +++ /dev/null @@ -1,471 +0,0 @@ -/* Table of opcodes for the PA-RISC. - Copyright (C) 1990, 1991, 1993, 1995 Free Software Foundation, Inc. - - Contributed by the Center for Software Science at the - University of Utah (pa-gdb-bugs@cs.utah.edu). - -This file is part of GAS, the GNU Assembler, and GDB, the GNU disassembler. - -GAS/GDB 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/GDB 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 or GDB; see the file COPYING. If not, write to -the Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ - -#if !defined(__STDC__) && !defined(const) -#define const -#endif - -/* - * Structure of an opcode table entry. - */ - -/* There are two kinds of delay slot nullification: normal which is - * controled by the nullification bit, and conditional, which depends - * on the direction of the branch and its success or failure. - * - * NONE is unfortunately #defined in the hiux system include files. - * #undef it away. - */ -#undef NONE -struct pa_opcode -{ - const char *name; - unsigned long int match; /* Bits that must be set... */ - unsigned long int mask; /* ... in these bits. */ - char *args; - enum pa_arch arch; -}; - -/* - All hppa opcodes are 32 bits. - - The match component is a mask saying which bits must match a - particular opcode in order for an instruction to be an instance - of that opcode. - - The args component is a string containing one character - for each operand of the instruction. - - Bit positions in this description follow HP usage of lsb = 31, - "at" is lsb of field. - - In the args field, the following characters must match exactly: - - '+,() ' - - In the args field, the following characters are unused: - - ' "#$% *+- ./ 3 :; = ' - ' B L [\] _' - ' e gh lm qr { } ' - - Here are all the characters: - - ' !"#$%&'()*+-,./0123456789:;<=>?@' - 'ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_' - 'abcdefghijklmnopqrstuvwxyz{|}~' - -Kinds of operands: - x integer register field at 15. - b integer register field at 10. - t integer register field at 31. - y floating point register field at 31 - 5 5 bit immediate at 15. - s 2 bit space specifier at 17. - S 3 bit space specifier at 18. - c indexed load completer. - C short load and store completer. - Y Store Bytes Short completer - < non-negated compare/subtract conditions. - a compare/subtract conditions - d non-negated add conditions - & logical instruction conditions - U unit instruction conditions - > shift/extract/deposit conditions. - ~ bvb,bb conditions - V 5 bit immediate value at 31 - i 11 bit immediate value at 31 - j 14 bit immediate value at 31 - k 21 bit immediate value at 31 - n nullification for branch instructions - N nullification for spop and copr instructions - w 12 bit branch displacement - W 17 bit branch displacement (PC relative) - z 17 bit branch displacement (just a number, not an address) - -Also these: - - p 5 bit shift count at 26 (to support the SHD instruction) encoded as - 31-p - P 5 bit bit position at 26 - T 5 bit field length at 31 (encoded as 32-T) - A 13 bit immediate at 18 (to support the BREAK instruction) - ^ like b, but describes a control register - Z System Control Completer (to support LPA, LHA, etc.) - D 26 bit immediate at 31 (to support the DIAG instruction) - - f 3 bit Special Function Unit identifier at 25 - O 20 bit Special Function Unit operation split between 15 bits at 20 - and 5 bits at 31 - o 15 bit Special Function Unit operation at 20 - 2 22 bit Special Function Unit operation split between 17 bits at 20 - and 5 bits at 31 - 1 15 bit Special Function Unit operation split between 10 bits at 20 - and 5 bits at 31 - 0 10 bit Special Function Unit operation split between 5 bits at 20 - and 5 bits at 31 - u 3 bit coprocessor unit identifier at 25 - F Source Floating Point Operand Format Completer encoded 2 bits at 20 - I Source Floating Point Operand Format Completer encoded 1 bits at 20 - (for 0xe format FP instructions) - G Destination Floating Point Operand Format Completer encoded 2 bits at 18 - M Floating-Point Compare Conditions (encoded as 5 bits at 31) - ? non-negated/negated compare/subtract conditions. - @ non-negated/negated add conditions. - ! non-negated add conditions. - - s 2 bit space specifier at 17. - b register field at 10. - r 5 bit immediate value at 31 (for the break instruction) - (very similar to V above, except the value is unsigned instead of - low_sign_ext) - R 5 bit immediate value at 15 (for the ssm, rsm, probei instructions) - (same as r above, except the value is in a different location) - Q 5 bit immediate value at 10 (a bit position specified in - the bb instruction. It's the same as r above, except the - value is in a different location) - | shift/extract/deposit conditions when used in a conditional branch - -And these (PJH) for PA-89 F.P. registers and instructions: - - v a 't' operand type extended to handle L/R register halves. - E a 'b' operand type extended to handle L/R register halves. - X an 'x' operand type extended to handle L/R register halves. - J a 'b' operand type further extended to handle extra 1.1 registers - K a 'x' operand type further extended to handle extra 1.1 registers - 4 a variation of the 'b' operand type for 'fmpyadd' and 'fmpysub' - 6 a variation of the 'x' operand type for 'fmpyadd' and 'fmpysub' - 7 a variation of the 't' operand type for 'fmpyadd' and 'fmpysub' - 8 5 bit register field at 20 (used in 'fmpyadd' and 'fmpysub') - 9 5 bit register field at 25 (used in 'fmpyadd' and 'fmpysub') - H Floating Point Operand Format at 26 for 'fmpyadd' and 'fmpysub' - (very similar to 'F') -*/ - -/* The order of the opcodes in this table is significant: - - * The assembler requires that all instances of the same mnemonic must be - consecutive. If they aren't, the assembler will bomb at runtime. - - * The disassembler should not care about the order of the opcodes. */ - -static const struct pa_opcode pa_opcodes[] = -{ - -/* pseudo-instructions */ - -{ "b", 0xe8000000, 0xffe0e000, "nW", pa10}, /* bl foo,r0 */ -{ "ldi", 0x34000000, 0xffe0c000, "j,x", pa10}, /* ldo val(r0),r */ -{ "comib", 0x84000000, 0xfc000000, "?n5,b,w", pa10}, /* comib{tf}*/ -{ "comb", 0x80000000, 0xfc000000, "?nx,b,w", pa10}, /* comb{tf} */ -{ "addb", 0xa0000000, 0xfc000000, "@nx,b,w", pa10}, /* addb{tf} */ -{ "addib", 0xa4000000, 0xfc000000, "@n5,b,w", pa10}, /* addib{tf}*/ -{ "nop", 0x08000240, 0xffffffff, "", pa10}, /* or 0,0,0 */ -{ "copy", 0x08000240, 0xffe0ffe0, "x,t", pa10}, /* or r,0,t */ -{ "mtsar", 0x01601840, 0xffe0ffff, "x", pa10}, /* mtctl r,cr11 */ - -/* Loads and Stores for integer registers. */ -{ "ldw", 0x48000000, 0xfc000000, "j(s,b),x", pa10}, -{ "ldw", 0x48000000, 0xfc000000, "j(b),x", pa10}, -{ "ldh", 0x44000000, 0xfc000000, "j(s,b),x", pa10}, -{ "ldh", 0x44000000, 0xfc000000, "j(b),x", pa10}, -{ "ldb", 0x40000000, 0xfc000000, "j(s,b),x", pa10}, -{ "ldb", 0x40000000, 0xfc000000, "j(b),x", pa10}, -{ "stw", 0x68000000, 0xfc000000, "x,j(s,b)", pa10}, -{ "stw", 0x68000000, 0xfc000000, "x,j(b)", pa10}, -{ "sth", 0x64000000, 0xfc000000, "x,j(s,b)", pa10}, -{ "sth", 0x64000000, 0xfc000000, "x,j(b)", pa10}, -{ "stb", 0x60000000, 0xfc000000, "x,j(s,b)", pa10}, -{ "stb", 0x60000000, 0xfc000000, "x,j(b)", pa10}, -{ "ldwm", 0x4c000000, 0xfc000000, "j(s,b),x", pa10}, -{ "ldwm", 0x4c000000, 0xfc000000, "j(b),x", pa10}, -{ "stwm", 0x6c000000, 0xfc000000, "x,j(s,b)", pa10}, -{ "stwm", 0x6c000000, 0xfc000000, "x,j(b)", pa10}, -{ "ldwx", 0x0c000080, 0xfc001fc0, "cx(s,b),t", pa10}, -{ "ldwx", 0x0c000080, 0xfc001fc0, "cx(b),t", pa10}, -{ "ldhx", 0x0c000040, 0xfc001fc0, "cx(s,b),t", pa10}, -{ "ldhx", 0x0c000040, 0xfc001fc0, "cx(b),t", pa10}, -{ "ldbx", 0x0c000000, 0xfc001fc0, "cx(s,b),t", pa10}, -{ "ldbx", 0x0c000000, 0xfc001fc0, "cx(b),t", pa10}, -{ "ldwax", 0x0c000180, 0xfc00dfc0, "cx(b),t", pa10}, -{ "ldcwx", 0x0c0001c0, 0xfc001fc0, "cx(s,b),t", pa10}, -{ "ldcwx", 0x0c0001c0, 0xfc001fc0, "cx(b),t", pa10}, -{ "ldws", 0x0c001080, 0xfc001fc0, "C5(s,b),t", pa10}, -{ "ldws", 0x0c001080, 0xfc001fc0, "C5(b),t", pa10}, -{ "ldhs", 0x0c001040, 0xfc001fc0, "C5(s,b),t", pa10}, -{ "ldhs", 0x0c001040, 0xfc001fc0, "C5(b),t", pa10}, -{ "ldbs", 0x0c001000, 0xfc001fc0, "C5(s,b),t", pa10}, -{ "ldbs", 0x0c001000, 0xfc001fc0, "C5(b),t", pa10}, -{ "ldwas", 0x0c001180, 0xfc00dfc0, "C5(b),t", pa10}, -{ "ldcws", 0x0c0011c0, 0xfc001fc0, "C5(s,b),t", pa10}, -{ "ldcws", 0x0c0011c0, 0xfc001fc0, "C5(b),t", pa10}, -{ "stws", 0x0c001280, 0xfc001fc0, "Cx,V(s,b)", pa10}, -{ "stws", 0x0c001280, 0xfc001fc0, "Cx,V(b)", pa10}, -{ "sths", 0x0c001240, 0xfc001fc0, "Cx,V(s,b)", pa10}, -{ "sths", 0x0c001240, 0xfc001fc0, "Cx,V(b)", pa10}, -{ "stbs", 0x0c001200, 0xfc001fc0, "Cx,V(s,b)", pa10}, -{ "stbs", 0x0c001200, 0xfc001fc0, "Cx,V(b)", pa10}, -{ "stwas", 0x0c001380, 0xfc00dfc0, "Cx,V(b)", pa10}, -{ "stbys", 0x0c001300, 0xfc001fc0, "Yx,V(s,b)", pa10}, -{ "stbys", 0x0c001300, 0xfc001fc0, "Yx,V(b)", pa10}, - -/* Immediate instructions. */ -{ "ldo", 0x34000000, 0xfc00c000, "j(b),x", pa10}, -{ "ldil", 0x20000000, 0xfc000000, "k,b", pa10}, -{ "addil", 0x28000000, 0xfc000000, "k,b", pa10}, - -/* Branching instructions. */ -{ "bl", 0xe8000000, 0xfc00e000, "nW,b", pa10}, -{ "gate", 0xe8002000, 0xfc00e000, "nW,b", pa10}, -{ "blr", 0xe8004000, 0xfc00e001, "nx,b", pa10}, -{ "bv", 0xe800c000, 0xfc00e001, "nx(b)", pa10}, -{ "bv", 0xe800c000, 0xfc00e001, "n(b)", pa10}, -{ "be", 0xe0000000, 0xfc000000, "nz(S,b)", pa10}, -{ "ble", 0xe4000000, 0xfc000000, "nz(S,b)", pa10}, -{ "movb", 0xc8000000, 0xfc000000, "|nx,b,w", pa10}, -{ "movib", 0xcc000000, 0xfc000000, "|n5,b,w", pa10}, -{ "combt", 0x80000000, 0xfc000000, "<nx,b,w", pa10}, -{ "combf", 0x88000000, 0xfc000000, "<nx,b,w", pa10}, -{ "comibt", 0x84000000, 0xfc000000, "<n5,b,w", pa10}, -{ "comibf", 0x8c000000, 0xfc000000, "<n5,b,w", pa10}, -{ "addbt", 0xa0000000, 0xfc000000, "!nx,b,w", pa10}, -{ "addbf", 0xa8000000, 0xfc000000, "!nx,b,w", pa10}, -{ "addibt", 0xa4000000, 0xfc000000, "!n5,b,w", pa10}, -{ "addibf", 0xac000000, 0xfc000000, "!n5,b,w", pa10}, -{ "bvb", 0xc0000000, 0xffe00000, "~nx,w", pa10}, -{ "bb", 0xc4000000, 0xfc000000, "~nx,Q,w", pa10}, - -/* Computation Instructions */ - -{ "add", 0x08000600, 0xfc000fe0, "dx,b,t", pa10}, -{ "addl", 0x08000a00, 0xfc000fe0, "dx,b,t", pa10}, -{ "addo", 0x08000e00, 0xfc000fe0, "dx,b,t", pa10}, -{ "addc", 0x08000700, 0xfc000fe0, "dx,b,t", pa10}, -{ "addco", 0x08000f00, 0xfc000fe0, "dx,b,t", pa10}, -{ "sh1add", 0x08000640, 0xfc000fe0, "dx,b,t", pa10}, -{ "sh1addl", 0x08000a40, 0xfc000fe0, "dx,b,t", pa10}, -{ "sh1addo", 0x08000e40, 0xfc000fe0, "dx,b,t", pa10}, -{ "sh2add", 0x08000680, 0xfc000fe0, "dx,b,t", pa10}, -{ "sh2addl", 0x08000a80, 0xfc000fe0, "dx,b,t", pa10}, -{ "sh2addo", 0x08000e80, 0xfc000fe0, "dx,b,t", pa10}, -{ "sh3add", 0x080006c0, 0xfc000fe0, "dx,b,t", pa10}, -{ "sh3addl", 0x08000ac0, 0xfc000fe0, "dx,b,t", pa10}, -{ "sh3addo", 0x08000ec0, 0xfc000fe0, "dx,b,t", pa10}, -{ "sub", 0x08000400, 0xfc000fe0, "ax,b,t", pa10}, -{ "subo", 0x08000c00, 0xfc000fe0, "ax,b,t", pa10}, -{ "subb", 0x08000500, 0xfc000fe0, "ax,b,t", pa10}, -{ "subbo", 0x08000d00, 0xfc000fe0, "ax,b,t", pa10}, -{ "subt", 0x080004c0, 0xfc000fe0, "ax,b,t", pa10}, -{ "subto", 0x08000cc0, 0xfc000fe0, "ax,b,t", pa10}, -{ "ds", 0x08000440, 0xfc000fe0, "ax,b,t", pa10}, -{ "comclr", 0x08000880, 0xfc000fe0, "ax,b,t", pa10}, -{ "or", 0x08000240, 0xfc000fe0, "&x,b,t", pa10}, -{ "xor", 0x08000280, 0xfc000fe0, "&x,b,t", pa10}, -{ "and", 0x08000200, 0xfc000fe0, "&x,b,t", pa10}, -{ "andcm", 0x08000000, 0xfc000fe0, "&x,b,t", pa10}, -{ "uxor", 0x08000380, 0xfc000fe0, "Ux,b,t", pa10}, -{ "uaddcm", 0x08000980, 0xfc000fe0, "Ux,b,t", pa10}, -{ "uaddcmt", 0x080009c0, 0xfc000fe0, "Ux,b,t", pa10}, -{ "dcor", 0x08000b80, 0xfc1f0fe0, "Ub,t", pa10}, -{ "idcor", 0x08000bc0, 0xfc1f0fe0, "Ub,t", pa10}, -{ "addi", 0xb4000000, 0xfc000800, "di,b,x", pa10}, -{ "addio", 0xb4000800, 0xfc000800, "di,b,x", pa10}, -{ "addit", 0xb0000000, 0xfc000800, "di,b,x", pa10}, -{ "addito", 0xb0000800, 0xfc000800, "di,b,x", pa10}, -{ "subi", 0x94000000, 0xfc000800, "ai,b,x", pa10}, -{ "subio", 0x94000800, 0xfc000800, "ai,b,x", pa10}, -{ "comiclr", 0x90000000, 0xfc000800, "ai,b,x", pa10}, - -/* Extract and Deposit Instructions */ - -{ "vshd", 0xd0000000, 0xfc001fe0, ">x,b,t", pa10}, -{ "shd", 0xd0000800, 0xfc001c00, ">x,b,p,t", pa10}, -{ "vextru", 0xd0001000, 0xfc001fe0, ">b,T,x", pa10}, -{ "vextrs", 0xd0001400, 0xfc001fe0, ">b,T,x", pa10}, -{ "extru", 0xd0001800, 0xfc001c00, ">b,P,T,x", pa10}, -{ "extrs", 0xd0001c00, 0xfc001c00, ">b,P,T,x", pa10}, -{ "zvdep", 0xd4000000, 0xfc001fe0, ">x,T,b", pa10}, -{ "vdep", 0xd4000400, 0xfc001fe0, ">x,T,b", pa10}, -{ "zdep", 0xd4000800, 0xfc001c00, ">x,p,T,b", pa10}, -{ "dep", 0xd4000c00, 0xfc001c00, ">x,p,T,b", pa10}, -{ "zvdepi", 0xd4001000, 0xfc001fe0, ">5,T,b", pa10}, -{ "vdepi", 0xd4001400, 0xfc001fe0, ">5,T,b", pa10}, -{ "zdepi", 0xd4001800, 0xfc001c00, ">5,p,T,b", pa10}, -{ "depi", 0xd4001c00, 0xfc001c00, ">5,p,T,b", pa10}, - -/* System Control Instructions */ - -{ "break", 0x00000000, 0xfc001fe0, "r,A", pa10}, -{ "rfi", 0x00000c00, 0xffffffff, "", pa10}, -{ "rfir", 0x00000ca0, 0xffffffff, "", pa11}, -{ "ssm", 0x00000d60, 0xffe0ffe0, "R,t", pa10}, -{ "rsm", 0x00000e60, 0xffe0ffe0, "R,t", pa10}, -{ "mtsm", 0x00001860, 0xffe0ffff, "x", pa10}, -{ "ldsid", 0x000010a0, 0xfc1f3fe0, "(s,b),t", pa10}, -{ "ldsid", 0x000010a0, 0xfc1f3fe0, "(b),t", pa10}, -{ "mtsp", 0x00001820, 0xffe01fff, "x,S", pa10}, -{ "mtctl", 0x00001840, 0xfc00ffff, "x,^", pa10}, -{ "mfsp", 0x000004a0, 0xffff1fe0, "S,t", pa10}, -{ "mfctl", 0x000008a0, 0xfc1fffe0, "^,t", pa10}, -{ "sync", 0x00000400, 0xffffffff, "", pa10}, -{ "syncdma", 0x00100400, 0xffffffff, "", pa10}, -{ "prober", 0x04001180, 0xfc003fe0, "(s,b),x,t", pa10}, -{ "prober", 0x04001180, 0xfc003fe0, "(b),x,t", pa10}, -{ "proberi", 0x04003180, 0xfc003fe0, "(s,b),R,t", pa10}, -{ "proberi", 0x04003180, 0xfc003fe0, "(b),R,t", pa10}, -{ "probew", 0x040011c0, 0xfc003fe0, "(s,b),x,t", pa10}, -{ "probew", 0x040011c0, 0xfc003fe0, "(b),x,t", pa10}, -{ "probewi", 0x040031c0, 0xfc003fe0, "(s,b),R,t", pa10}, -{ "probewi", 0x040031c0, 0xfc003fe0, "(b),R,t", pa10}, -{ "lpa", 0x04001340, 0xfc003fc0, "Zx(s,b),t", pa10}, -{ "lpa", 0x04001340, 0xfc003fc0, "Zx(b),t", pa10}, -{ "lha", 0x04001300, 0xfc003fc0, "Zx(s,b),t", pa10}, -{ "lha", 0x04001300, 0xfc003fc0, "Zx(b),t", pa10}, -{ "lci", 0x04001300, 0xfc003fe0, "x(s,b),t", pa10}, -{ "lci", 0x04001300, 0xfc003fe0, "x(b),t", pa10}, -{ "pdtlb", 0x04001200, 0xfc003fdf, "Zx(s,b)", pa10}, -{ "pdtlb", 0x04001200, 0xfc003fdf, "Zx(b)", pa10}, -{ "pitlb", 0x04000200, 0xfc003fdf, "Zx(s,b)", pa10}, -{ "pitlb", 0x04000200, 0xfc003fdf, "Zx(b)", pa10}, -{ "pdtlbe", 0x04001240, 0xfc003fdf, "Zx(s,b)", pa10}, -{ "pdtlbe", 0x04001240, 0xfc003fdf, "Zx(b)", pa10}, -{ "pitlbe", 0x04000240, 0xfc003fdf, "Zx(s,b)", pa10}, -{ "pitlbe", 0x04000240, 0xfc003fdf, "Zx(b)", pa10}, -{ "idtlba", 0x04001040, 0xfc003fff, "x,(s,b)", pa10}, -{ "idtlba", 0x04001040, 0xfc003fff, "x,(b)", pa10}, -{ "iitlba", 0x04000040, 0xfc003fff, "x,(s,b)", pa10}, -{ "iitlba", 0x04000040, 0xfc003fff, "x,(b)", pa10}, -{ "idtlbp", 0x04001000, 0xfc003fff, "x,(s,b)", pa10}, -{ "idtlbp", 0x04001000, 0xfc003fff, "x,(b)", pa10}, -{ "iitlbp", 0x04000000, 0xfc003fff, "x,(s,b)", pa10}, -{ "iitlbp", 0x04000000, 0xfc003fff, "x,(b)", pa10}, -{ "pdc", 0x04001380, 0xfc003fdf, "Zx(s,b)", pa10}, -{ "pdc", 0x04001380, 0xfc003fdf, "Zx(b)", pa10}, -{ "fdc", 0x04001280, 0xfc003fdf, "Zx(s,b)", pa10}, -{ "fdc", 0x04001280, 0xfc003fdf, "Zx(b)", pa10}, -{ "fic", 0x04000280, 0xfc003fdf, "Zx(s,b)", pa10}, -{ "fic", 0x04000280, 0xfc003fdf, "Zx(b)", pa10}, -{ "fdce", 0x040012c0, 0xfc003fdf, "Zx(s,b)", pa10}, -{ "fdce", 0x040012c0, 0xfc003fdf, "Zx(b)", pa10}, -{ "fice", 0x040002c0, 0xfc003fdf, "Zx(s,b)", pa10}, -{ "fice", 0x040002c0, 0xfc003fdf, "Zx(b)", pa10}, -{ "diag", 0x14000000, 0xfc000000, "D", pa10}, - -/* gfw and gfr are not in the HP PA 1.1 manual, but they are in either - the Timex FPU or the Mustang ERS (not sure which) manual. */ -{ "gfw", 0x04001680, 0xfc003fdf, "Zx(s,b)", pa11}, -{ "gfw", 0x04001680, 0xfc003fdf, "Zx(b)", pa11}, -{ "gfr", 0x04001a80, 0xfc003fdf, "Zx(s,b)", pa11}, -{ "gfr", 0x04001a80, 0xfc003fdf, "Zx(b)", pa11}, - -/* Floating Point Coprocessor Instructions */ - -{ "fldwx", 0x24000000, 0xfc001f80, "cx(s,b),v", pa10}, -{ "fldwx", 0x24000000, 0xfc001f80, "cx(b),v", pa10}, -{ "flddx", 0x2c000000, 0xfc001fc0, "cx(s,b),y", pa10}, -{ "flddx", 0x2c000000, 0xfc001fc0, "cx(b),y", pa10}, -{ "fstwx", 0x24000200, 0xfc001f80, "cv,x(s,b)", pa10}, -{ "fstwx", 0x24000200, 0xfc001f80, "cv,x(b)", pa10}, -{ "fstdx", 0x2c000200, 0xfc001fc0, "cy,x(s,b)", pa10}, -{ "fstdx", 0x2c000200, 0xfc001fc0, "cy,x(b)", pa10}, -{ "fstqx", 0x3c000200, 0xfc001fc0, "cy,x(s,b)", pa10}, -{ "fstqx", 0x3c000200, 0xfc001fc0, "cy,x(b)", pa10}, -{ "fldws", 0x24001000, 0xfc001f80, "C5(s,b),v", pa10}, -{ "fldws", 0x24001000, 0xfc001f80, "C5(b),v", pa10}, -{ "fldds", 0x2c001000, 0xfc001fc0, "C5(s,b),y", pa10}, -{ "fldds", 0x2c001000, 0xfc001fc0, "C5(b),y", pa10}, -{ "fstws", 0x24001200, 0xfc001f80, "Cv,5(s,b)", pa10}, -{ "fstws", 0x24001200, 0xfc001f80, "Cv,5(b)", pa10}, -{ "fstds", 0x2c001200, 0xfc001fc0, "Cy,5(s,b)", pa10}, -{ "fstds", 0x2c001200, 0xfc001fc0, "Cy,5(b)", pa10}, -{ "fstqs", 0x3c001200, 0xfc001fc0, "Cy,5(s,b)", pa10}, -{ "fstqs", 0x3c001200, 0xfc001fc0, "Cy,5(b)", pa10}, -{ "fadd", 0x30000600, 0xfc00e7e0, "FE,X,v", pa10}, -{ "fadd", 0x38000600, 0xfc00e720, "IJ,K,v", pa10}, -{ "fsub", 0x30002600, 0xfc00e7e0, "FE,X,v", pa10}, -{ "fsub", 0x38002600, 0xfc00e720, "IJ,K,v", pa10}, -{ "fmpy", 0x30004600, 0xfc00e7e0, "FE,X,v", pa10}, -{ "fmpy", 0x38004600, 0xfc00e720, "IJ,K,v", pa10}, -{ "fdiv", 0x30006600, 0xfc00e7e0, "FE,X,v", pa10}, -{ "fdiv", 0x38006600, 0xfc00e720, "IJ,K,v", pa10}, -{ "fsqrt", 0x30008000, 0xfc1fe7e0, "FE,v", pa10}, -{ "fsqrt", 0x38008000, 0xfc1fe720, "FJ,v", pa10}, -{ "fabs", 0x30006000, 0xfc1fe7e0, "FE,v", pa10}, -{ "fabs", 0x38006000, 0xfc1fe720, "FJ,v", pa10}, -{ "frem", 0x30008600, 0xfc00e7e0, "FE,X,v", pa10}, -{ "frem", 0x38008600, 0xfc00e720, "FJ,K,v", pa10}, -{ "frnd", 0x3000a000, 0xfc1fe7e0, "FE,v", pa10}, -{ "frnd", 0x3800a000, 0xfc1fe720, "FJ,v", pa10}, -{ "fcpy", 0x30004000, 0xfc1fe7e0, "FE,v", pa10}, -{ "fcpy", 0x38004000, 0xfc1fe720, "FJ,v", pa10}, -{ "fcnvff", 0x30000200, 0xfc1f87e0, "FGE,v", pa10}, -{ "fcnvff", 0x38000200, 0xfc1f8720, "FGJ,v", pa10}, -{ "fcnvxf", 0x30008200, 0xfc1f87e0, "FGE,v", pa10}, -{ "fcnvxf", 0x38008200, 0xfc1f8720, "FGJ,v", pa10}, -{ "fcnvfx", 0x30010200, 0xfc1f87e0, "FGE,v", pa10}, -{ "fcnvfx", 0x38010200, 0xfc1f8720, "FGJ,v", pa10}, -{ "fcnvfxt", 0x30018200, 0xfc1f87e0, "FGE,v", pa10}, -{ "fcnvfxt", 0x38018200, 0xfc1f8720, "FGJ,v", pa10}, -{ "fcmp", 0x30000400, 0xfc00e7e0, "FME,X", pa10}, -{ "fcmp", 0x38000400, 0xfc00e720, "IMJ,K", pa10}, -{ "xmpyu", 0x38004700, 0xfc00e720, "E,X,v", pa11}, -{ "fmpyadd", 0x18000000, 0xfc000000, "H4,6,7,9,8", pa11}, -{ "fmpysub", 0x98000000, 0xfc000000, "H4,6,7,9,8", pa11}, -{ "ftest", 0x30002420, 0xffffffff, "", pa10}, - - -/* Assist Instructions */ - -{ "spop0", 0x10000000, 0xfc000600, "f,ON", pa10}, -{ "spop1", 0x10000200, 0xfc000600, "f,oNt", pa10}, -{ "spop2", 0x10000400, 0xfc000600, "f,1Nb", pa10}, -{ "spop3", 0x10000600, 0xfc000600, "f,0Nx,b", pa10}, -{ "copr", 0x30000000, 0xfc000000, "u,2N", pa10}, -{ "cldwx", 0x24000000, 0xfc001e00, "ucx(s,b),t", pa10}, -{ "cldwx", 0x24000000, 0xfc001e00, "ucx(b),t", pa10}, -{ "clddx", 0x2c000000, 0xfc001e00, "ucx(s,b),t", pa10}, -{ "clddx", 0x2c000000, 0xfc001e00, "ucx(b),t", pa10}, -{ "cstwx", 0x24000200, 0xfc001e00, "uct,x(s,b)", pa10}, -{ "cstwx", 0x24000200, 0xfc001e00, "uct,x(b)", pa10}, -{ "cstdx", 0x2c000200, 0xfc001e00, "uct,x(s,b)", pa10}, -{ "cstdx", 0x2c000200, 0xfc001e00, "uct,x(b)", pa10}, -{ "cldws", 0x24001000, 0xfc001e00, "uC5(s,b),t", pa10}, -{ "cldws", 0x24001000, 0xfc001e00, "uC5(b),t", pa10}, -{ "cldds", 0x2c001000, 0xfc001e00, "uC5(s,b),t", pa10}, -{ "cldds", 0x2c001000, 0xfc001e00, "uC5(b),t", pa10}, -{ "cstws", 0x24001200, 0xfc001e00, "uCt,5(s,b)", pa10}, -{ "cstws", 0x24001200, 0xfc001e00, "uCt,5(b)", pa10}, -{ "cstds", 0x2c001200, 0xfc001e00, "uCt,5(s,b)", pa10}, -{ "cstds", 0x2c001200, 0xfc001e00, "uCt,5(b)", pa10}, -}; - -#define NUMOPCODES ((sizeof pa_opcodes)/(sizeof pa_opcodes[0])) - -/* SKV 12/18/92. Added some denotations for various operands. */ - -#define PA_IMM11_AT_31 'i' -#define PA_IMM14_AT_31 'j' -#define PA_IMM21_AT_31 'k' -#define PA_DISP12 'w' -#define PA_DISP17 'W' - -#define N_HPPA_OPERAND_FORMATS 5 diff --git a/contrib/gdb/include/opcode/i386.h b/contrib/gdb/include/opcode/i386.h deleted file mode 100644 index 849a86fa7b252..0000000000000 --- a/contrib/gdb/include/opcode/i386.h +++ /dev/null @@ -1,898 +0,0 @@ -/* i386-opcode.h -- Intel 80386 opcode table - Copyright 1989, 1991, 1992, 1995 Free Software Foundation. - -This file is part of GAS, the GNU Assembler, and GDB, the GNU Debugger. - -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 2 of the License, 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ - -static const template i386_optab[] = { - -#define _ None -/* move instructions */ -#define MOV_AX_DISP32 0xa0 -{ "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|Mem, 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|Data32, { Reg8|Mem, Reg32, 0} }, -{"movsbw", 2, 0x0fbe, _, ReverseRegRegmem|Modrm|Data16, { 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 } }, -{"in", 1, 0xe4, _, W|NoModrm, { Imm8, 0, 0 } }, -{"in", 1, 0xec, _, W|NoModrm, { InOutPortReg, 0, 0 } }, -{"out", 2, 0xe6, _, W|NoModrm, { Acc, Imm8, 0 } }, -{"out", 2, 0xee, _, W|NoModrm, { Acc, InOutPortReg, 0 } }, -{"out", 1, 0xe6, _, W|NoModrm, { Imm8, 0, 0 } }, -{"out", 1, 0xee, _, W|NoModrm, { InOutPortReg, 0, 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} }, -{"pushfl", 0, 0x9c, _, NoModrm|Data32, { 0, 0, 0} }, -{"popfl", 0, 0x9d, _, NoModrm|Data32, { 0, 0, 0} }, -{"pushfw", 0, 0x9c, _, NoModrm|Data16, { 0, 0, 0} }, -{"popfw", 0, 0x9d, _, NoModrm|Data16, { 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, 0x98, _, NoModrm|Data16, { 0, 0, 0} }, -{"cwd", 0, 0x99, _, NoModrm|Data16, { 0, 0, 0} }, -{"cwde", 0, 0x98, _, NoModrm|Data32, { 0, 0, 0} }, -{"cdq", 0, 0x99, _, NoModrm|Data32, { 0, 0, 0} }, -/* att naming */ -{"cbtw", 0, 0x98, _, NoModrm|Data16, { 0, 0, 0} }, -{"cwtl", 0, 0x98, _, NoModrm|Data32, { 0, 0, 0} }, -{"cwtd", 0, 0x99, _, NoModrm|Data16, { 0, 0, 0} }, -{"cltd", 0, 0x99, _, NoModrm|Data32, { 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 operand 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} }, -{"shld", 2, 0x0fa5, _, Modrm, { WordReg, WordReg|Mem, 0} }, - -{"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} }, -{"shrd", 2, 0x0fad, _, Modrm, { WordReg, WordReg|Mem, 0} }, - -{"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|Data32, { Reg|Mem|JumpAbsolute, 0, 0} }, -{"callw", 1, 0xff, 2, Modrm|Data16, { Reg|Mem|JumpAbsolute, 0, 0} }, -#define CALL_FAR_IMMEDIATE 0x9a -{"lcall", 2, 0x9a, _, JumpInterSegment, { Imm16, Abs32|Imm32, 0} }, -{"lcall", 1, 0xff, 3, Modrm|Data32, { Mem, 0, 0} }, -{"lcallw", 1, 0xff, 3, Modrm|Data16, { 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|Data32, { Mem, 0, 0} }, - -{"ret", 0, 0xc3, _, NoModrm|Data32, { 0, 0, 0} }, -{"ret", 1, 0xc2, _, NoModrm|Data32, { Imm16, 0, 0} }, -{"retw", 0, 0xc3, _, NoModrm|Data16, { 0, 0, 0} }, -{"retw", 1, 0xc2, _, NoModrm|Data16, { Imm16, 0, 0} }, -{"lret", 0, 0xcb, _, NoModrm|Data32, { 0, 0, 0} }, -{"lret", 1, 0xca, _, NoModrm|Data32, { Imm16, 0, 0} }, -{"lretw", 0, 0xcb, _, NoModrm|Data16, { 0, 0, 0} }, -{"lretw", 1, 0xca, _, NoModrm|Data16, { Imm16, 0, 0} }, -{"enter", 2, 0xc8, _, NoModrm|Data32, { Imm16, Imm8, 0} }, -{"leave", 0, 0xc9, _, NoModrm|Data32, { 0, 0, 0} }, -{"enterw", 2, 0xc8, _, NoModrm|Data16, { Imm16, Imm8, 0} }, -{"leavew", 0, 0xc9, _, NoModrm|Data16, { 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} }, - -#if 0 /* XXX where are these macros used? - To get them working again, they need to take - an entire template as the parameter, - and check for Data16/Data32 flags. */ -/* these turn into pseudo operations when disp is larger than 8 bits */ -#define IS_JUMP_ON_CX_ZERO(o) \ - (o == 0x66e3) -#define IS_JUMP_ON_ECX_ZERO(o) \ - (o == 0xe3) -#endif - -{"jcxz", 1, 0xe3, _, JumpByte|Data16, { Disp, 0, 0} }, -{"jecxz", 1, 0xe3, _, JumpByte|Data32, { 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} }, -{"setc", 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} }, -{"setnc", 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} }, -{"scmp", 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} }, -{"slod", 0, 0xac, _, W|NoModrm, { 0, 0, 0} }, -{"movs", 0, 0xa4, _, W|NoModrm, { 0, 0, 0} }, -{"smov", 0, 0xa4, _, W|NoModrm, { 0, 0, 0} }, -{"scas", 0, 0xae, _, W|NoModrm, { 0, 0, 0} }, -{"ssca", 0, 0xae, _, W|NoModrm, { 0, 0, 0} }, -{"stos", 0, 0xaa, _, W|NoModrm, { 0, 0, 0} }, -{"ssto", 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 gas/config/tc-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|Data32, { 0, 0, 0} }, -{"iretw", 0, 0xcf, _, NoModrm|Data16, { 0, 0, 0} }, -/* i386sl, i486sl, later 486, and Pentium */ -{"rsm", 0, 0x0faa, _, NoModrm,{ 0, 0, 0} }, - -{"boundl", 2, 0x62, _, Modrm|Data32, { Reg32, Mem, 0} }, -{"boundw", 2, 0x62, _, Modrm|Data16, { 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 */ -{"fldl", 1, 0xdd, 0, Modrm, { Mem, 0, 0} }, /* %st0 <-- mem double */ -{"fldl", 1, 0xd9c0, _, ShortForm, { FloatReg, 0, 0} }, /* register */ -{"fild", 1, 0xdf, 0, Modrm, { Mem, 0, 0} }, /* %st0 <-- mem word (16) */ -{"fildl", 1, 0xdb, 0, Modrm, { Mem, 0, 0} }, /* %st0 <-- mem dword (32) */ -{"fildq",1, 0xdf, 5, Modrm, { Mem, 0, 0} }, /* %st0 <-- mem qword (64) */ -{"fildll",1, 0xdf, 5, Modrm, { Mem, 0, 0} }, /* %st0 <-- mem qword (64) */ -{"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 */ -{"fstl", 1, 0xdd, 2, Modrm, { Mem, 0, 0} }, /* %st0 --> mem double */ -{"fstl", 1, 0xddd0, _, ShortForm, { FloatReg, 0, 0} }, /* register */ -{"fist", 1, 0xdf, 2, Modrm, { Mem, 0, 0} }, /* %st0 --> mem word (16) */ -{"fistl", 1, 0xdb, 2, Modrm, { Mem, 0, 0} }, /* %st0 --> mem dword (32) */ - -/* store (with pop) */ -{"fstp", 1, 0xddd8, _, ShortForm, { FloatReg, 0, 0} }, /* register */ -{"fstps", 1, 0xd9, 3, Modrm, { Mem, 0, 0} }, /* %st0 --> mem float */ -{"fstpl", 1, 0xdd, 3, Modrm, { Mem, 0, 0} }, /* %st0 --> mem double */ -{"fstpl", 1, 0xddd8, _, ShortForm, { FloatReg, 0, 0} }, /* register */ -{"fistp", 1, 0xdf, 3, Modrm, { Mem, 0, 0} }, /* %st0 --> mem word (16) */ -{"fistpl",1, 0xdb, 3, Modrm, { Mem, 0, 0} }, /* %st0 --> mem dword (32) */ -{"fistpq",1, 0xdf, 7, Modrm, { Mem, 0, 0} }, /* %st0 --> mem qword (64) */ -{"fistpll",1,0xdf, 7, Modrm, { Mem, 0, 0} }, /* %st0 --> mem qword (64) */ -{"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} }, -{"fxch", 0, 0xd9c9, _, NoModrm, { 0, 0, 0} }, /* alias for fxch %st, %st(1) */ - -/* 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 2 */ - -/* 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, 0x9bdbe3, _, NoModrm, { 0, 0, 0} }, -{"fldcw", 1, 0xd9, 5, Modrm, { Mem, 0, 0} }, -{"fnstcw", 1, 0xd9, 7, Modrm, { Mem, 0, 0} }, -{"fstcw", 1, 0x9bd9, 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, 0x9bdfe0, _, NoModrm, { Acc, 0, 0} }, -{"fstsw", 1, 0x9bdd, 7, Modrm, { Mem, 0, 0} }, -{"fstsw", 0, 0x9bdfe0, _, NoModrm, { 0, 0, 0} }, -{"fnclex", 0, 0xdbe2, _, NoModrm, { 0, 0, 0} }, -{"fclex", 0, 0x9bdbe2, _, 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, 0x9bd9, 6, Modrm, { Mem, 0, 0} }, -{"fldenv", 1, 0xd9, 4, Modrm, { Mem, 0, 0} }, -{"fnsave", 1, 0xdd, 6, Modrm, { Mem, 0, 0} }, -{"fsave", 1, 0x9bdd, 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} }, -{"addr16", 0, 0x67, _, NoModrm, { 0, 0, 0} }, -{"word", 0, 0x66, _, NoModrm, { 0, 0, 0} }, -{"data16", 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} }, -{"repz", 0, 0xf3, _, NoModrm, { 0, 0, 0} }, -{"repne", 0, 0xf2, _, NoModrm, { 0, 0, 0} }, -{"repnz", 0, 0xf2, _, NoModrm, { 0, 0, 0} }, - -/* 486 extensions */ - -{"bswap", 1, 0x0fc8, _, ShortForm, { Reg32,0,0 } }, -{"xadd", 2, 0x0fc0, _, DW|Modrm, { Reg, Reg|Mem, 0 } }, -{"cmpxchg", 2, 0x0fb0, _, DW|Modrm, { Reg, Reg|Mem, 0 } }, -{"invd", 0, 0x0f08, _, NoModrm, { 0, 0, 0} }, -{"wbinvd", 0, 0x0f09, _, NoModrm, { 0, 0, 0} }, -{"invlpg", 1, 0x0f01, 7, Modrm, { Mem, 0, 0} }, - -/* 586 and late 486 extensions */ -{"cpuid", 0, 0x0fa2, _, NoModrm, { 0, 0, 0} }, - -/* Pentium extensions */ -{"wrmsr", 0, 0x0f30, _, NoModrm, { 0, 0, 0} }, -{"rdtsc", 0, 0x0f31, _, NoModrm, { 0, 0, 0} }, -{"rdmsr", 0, 0x0f32, _, NoModrm, { 0, 0, 0} }, -{"cmpxchg8b", 1, 0x0fc7, 1, Modrm, { Mem, 0, 0} }, - -/* Pentium Pro extensions */ -{"rdpmc", 0, 0x0f33, _, NoModrm, { 0, 0, 0} }, - -{"cmovo", 2, 0x0f40, _, W|Modrm|ReverseRegRegmem, { WordReg|WordMem, WordReg, 0} }, -{"cmovno", 2, 0x0f41, _, W|Modrm|ReverseRegRegmem, { WordReg|WordMem, WordReg, 0} }, -{"cmovb", 2, 0x0f42, _, W|Modrm|ReverseRegRegmem, { WordReg|WordMem, WordReg, 0} }, -{"cmovae", 2, 0x0f43, _, W|Modrm|ReverseRegRegmem, { WordReg|WordMem, WordReg, 0} }, -{"cmove", 2, 0x0f44, _, W|Modrm|ReverseRegRegmem, { WordReg|WordMem, WordReg, 0} }, -{"cmovne", 2, 0x0f45, _, W|Modrm|ReverseRegRegmem, { WordReg|WordMem, WordReg, 0} }, -{"cmovbe", 2, 0x0f46, _, W|Modrm|ReverseRegRegmem, { WordReg|WordMem, WordReg, 0} }, -{"cmova", 2, 0x0f47, _, W|Modrm|ReverseRegRegmem, { WordReg|WordMem, WordReg, 0} }, -{"cmovs", 2, 0x0f48, _, W|Modrm|ReverseRegRegmem, { WordReg|WordMem, WordReg, 0} }, -{"cmovns", 2, 0x0f49, _, W|Modrm|ReverseRegRegmem, { WordReg|WordMem, WordReg, 0} }, -{"cmovp", 2, 0x0f4a, _, W|Modrm|ReverseRegRegmem, { WordReg|WordMem, WordReg, 0} }, -{"cmovnp", 2, 0x0f4b, _, W|Modrm|ReverseRegRegmem, { WordReg|WordMem, WordReg, 0} }, -{"cmovl", 2, 0x0f4c, _, W|Modrm|ReverseRegRegmem, { WordReg|WordMem, WordReg, 0} }, -{"cmovge", 2, 0x0f4d, _, W|Modrm|ReverseRegRegmem, { WordReg|WordMem, WordReg, 0} }, -{"cmovle", 2, 0x0f4e, _, W|Modrm|ReverseRegRegmem, { WordReg|WordMem, WordReg, 0} }, -{"cmovg", 2, 0x0f4f, _, W|Modrm|ReverseRegRegmem, { WordReg|WordMem, WordReg, 0} }, - -{"fcmovb", 2, 0xdac0, _, ShortForm, { FloatReg, FloatAcc, 0} }, -{"fcmove", 2, 0xdac8, _, ShortForm, { FloatReg, FloatAcc, 0} }, -{"fcmovbe",2, 0xdad0, _, ShortForm, { FloatReg, FloatAcc, 0} }, -{"fcmovu", 2, 0xdad8, _, ShortForm, { FloatReg, FloatAcc, 0} }, -{"fcmovnb", 2, 0xdbc0, _, ShortForm, { FloatReg, FloatAcc, 0} }, -{"fcmovne", 2, 0xdbc8, _, ShortForm, { FloatReg, FloatAcc, 0} }, -{"fcmovnbe",2, 0xdbd0, _, ShortForm, { FloatReg, FloatAcc, 0} }, -{"fcmovnu", 2, 0xdbd8, _, ShortForm, { FloatReg, FloatAcc, 0} }, - -{"fcomi", 2, 0xdbf0, _, ShortForm, { FloatReg, FloatAcc, 0} }, -{"fucomi", 2, 0xdbe8, _, ShortForm, { FloatReg, FloatAcc, 0} }, -{"fcomip", 2, 0xdff0, _, ShortForm, { FloatReg, FloatAcc, 0} }, -{"fucomip",2, 0xdfe8, _, ShortForm, { FloatReg, FloatAcc, 0} }, - -{"", 0, 0, 0, 0, { 0, 0, 0} } /* sentinel */ -}; -#undef _ - -static const template *const i386_optab_end - = i386_optab + sizeof (i386_optab)/sizeof(i386_optab[0]); - -/* 386 register table */ - -static const 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}, - {"cr4", Control, 4}, - /* debug registers */ - {"db0", Debug, 0}, {"db1", Debug, 1}, {"db2", Debug, 2}, - {"db3", Debug, 3}, {"db6", Debug, 6}, {"db7", Debug, 7}, - {"dr0", Debug, 0}, {"dr1", Debug, 1}, {"dr2", Debug, 2}, - {"dr3", Debug, 3}, {"dr6", Debug, 6}, {"dr7", Debug, 7}, - /* test registers */ - {"tr3", Test, 3}, {"tr4", Test, 4}, {"tr5", Test, 5}, - {"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 */ - -static const reg_entry *const i386_regtab_end - = i386_regtab + sizeof(i386_regtab)/sizeof(i386_regtab[0]); - -/* segment stuff */ -static const seg_entry cs = { "cs", 0x2e }; -static const seg_entry ds = { "ds", 0x3e }; -static const seg_entry ss = { "ss", 0x36 }; -static const seg_entry es = { "es", 0x26 }; -static const seg_entry fs = { "fs", 0x64 }; -static const seg_entry gs = { "gs", 0x65 }; -static const 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; -*/ -static const seg_entry *const 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 */ -}; - -static const seg_entry *const 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 */ -}; - -static const prefix_entry i386_prefixtab[] = { -#define ADDR_PREFIX_OPCODE 0x67 - { "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 }, /* repeat string instructions */ - { "repe", 0xf3 }, { "repz", 0xf3 }, - { "repne", 0xf2 }, { "repnz", 0xf2 } -}; - -static const prefix_entry *const i386_prefixtab_end - = i386_prefixtab + sizeof(i386_prefixtab)/sizeof(i386_prefixtab[0]); - -/* end of i386-opcode.h */ diff --git a/contrib/gdb/include/opcode/i860.h b/contrib/gdb/include/opcode/i860.h deleted file mode 100644 index b6ebd25c6487e..0000000000000 --- a/contrib/gdb/include/opcode/i860.h +++ /dev/null @@ -1,491 +0,0 @@ -/* Table of opcodes for the i860. - Copyright (C) 1989 Free Software Foundation, Inc. - -This file is part of GAS, the GNU Assembler, and GDB, the GNU disassembler. - -GAS/GDB 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/GDB 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 or GDB; see the file COPYING. If not, write to -the Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ - -#if !defined(__STDC__) && !defined(const) -#define const -#endif - -/* - * Structure of an opcode table entry. - */ -struct i860_opcode -{ - const char *name; - unsigned long match; /* Bits that must be set. */ - unsigned long lose; /* Bits that must not be set. */ - const char *args; - /* Nonzero if this is a possible expand-instruction. */ - char expand; -}; - -enum expand_type -{ - E_MOV = 1, E_ADDR, E_U32, E_AND, E_S32, E_DELAY -}; - -/* - All i860 opcodes are 32 bits, except for the pseudoinstructions - and the operations utilizing a 32-bit address expression, an - unsigned 32-bit constant, or a signed 32-bit constant. - These opcodes are expanded into a two-instruction sequence for - any situation where the immediate operand does not fit in 32 bits. - In the case of the add and subtract operations the expansion is - to a three-instruction sequence (ex: orh, or, adds). In cases - where the address is to be relocated, the instruction is - expanded to handle the worse case, this could be optimized at - the final link if the actual address were known. - - The pseudoinstructions are: mov, fmov, pmov, nop, and fnop. - These instructions are implemented as a one or two instruction - sequence of other operations. - - The match component is a mask saying which bits must match a - particular opcode in order for an instruction to be an instance - of that opcode. - - The args component is a string containing one character - for each operand of the instruction. - -Kinds of operands: - # Number used by optimizer. It is ignored. - 1 src1 integer register. - 2 src2 integer register. - d dest register. - c ctrlreg control register. - i 16 bit immediate. - I 16 bit immediate, aligned. - 5 5 bit immediate. - l lbroff 26 bit PC relative immediate. - r sbroff 16 bit PC relative immediate. - s split 16 bit immediate. - S split 16 bit immediate, aligned. - e src1 floating point register. - f src2 floating point register. - g dest floating point register. - -*/ - -/* The order of the opcodes in this table is significant: - - * The assembler requires that all instances of the same mnemonic must be - consecutive. If they aren't, the assembler will bomb at runtime. - - * The disassembler should not care about the order of the opcodes. */ - -static struct i860_opcode i860_opcodes[] = -{ - -/* REG-Format Instructions */ -{ "ld.c", 0x30000000, 0xcc000000, "c,d", 0 }, /* ld.c csrc2,idest */ -{ "ld.b", 0x00000000, 0xfc000000, "1(2),d", 0 }, /* ld.b isrc1(isrc2),idest */ -{ "ld.b", 0x04000000, 0xf8000000, "I(2),d", E_ADDR }, /* ld.b #const(isrc2),idest */ -{ "ld.s", 0x10000000, 0xec000001, "1(2),d", 0 }, /* ld.s isrc1(isrc2),idest */ -{ "ld.s", 0x14000001, 0xe8000000, "I(2),d", E_ADDR }, /* ld.s #const(isrc2),idest */ -{ "ld.l", 0x10000001, 0xec000000, "1(2),d", 0 }, /* ld.l isrc1(isrc2),idest */ -{ "ld.l", 0x14000001, 0xe8000000, "I(2),d", E_ADDR }, /* ld.l #const(isrc2),idest */ - -{ "st.c", 0x38000000, 0xc4000000, "1,c", 0 }, /* st.c isrc1ni,csrc2 */ -{ "st.b", 0x0c000000, 0xf0000000, "1,S(2)", E_ADDR }, /* st.b isrc1ni,#const(isrc2) */ -{ "st.s", 0x1c000000, 0xe0000000, "1,S(2)", E_ADDR }, /* st.s isrc1ni,#const(isrc2) */ -{ "st.l", 0x1c000001, 0xe0000000, "1,S(2)", E_ADDR }, /* st.l isrc1ni,#const(isrc2) */ - -{ "ixfr", 0x08000000, 0xf4000000, "1,g", 0 }, /* ixfr isrc1ni,fdest */ - -{ "fld.l", 0x20000002, 0xdc000001, "1(2),g", 0 }, /* fld.l isrc1(isrc2),fdest */ -{ "fld.l", 0x24000002, 0xd8000001, "i(2),g", E_ADDR }, /* fld.l #const(isrc2),fdest */ -{ "fld.l", 0x20000003, 0xdc000000, "1(2)++,g", 0 }, /* fld.l isrc1(isrc2)++,fdest */ -{ "fld.l", 0x24000003, 0xd8000000, "i(2)++,g", E_ADDR }, /* fld.l #const(isrc2)++,fdest */ -{ "fld.d", 0x20000000, 0xdc000007, "1(2),g", 0 }, /* fld.d isrc1(isrc2),fdest */ -{ "fld.d", 0x24000000, 0xd8000007, "i(2),g", E_ADDR }, /* fld.d #const(isrc2),fdest */ -{ "fld.d", 0x20000001, 0xdc000006, "1(2)++,g", 0 }, /* fld.d isrc1(isrc2)++,fdest */ -{ "fld.d", 0x24000001, 0xd8000006, "i(2)++,g", E_ADDR }, /* fld.d #const(isrc2)++,fdest */ -{ "fld.q", 0x20000004, 0xdc000003, "1(2),g", 0 }, /* fld.q isrc1(isrc2),fdest */ -{ "fld.q", 0x24000004, 0xd8000003, "i(2),g", E_ADDR }, /* fld.q #const(isrc2),fdest */ -{ "fld.q", 0x20000005, 0xdc000002, "1(2)++,g", 0 }, /* fld.q isrc1(isrc2)++,fdest */ -{ "fld.q", 0x24000005, 0xd8000002, "i(2)++,g", E_ADDR }, /* fld.q #const(isrc2)++,fdest */ - -{ "pfld.l", 0x60000000, 0x9c000003, "1(2),g", 0 }, /* pfld.l isrc1(isrc2),fdest */ -{ "pfld.l", 0x64000000, 0x98000003, "i(2),g", E_ADDR }, /* pfld.l #const(isrc2),fdest */ -{ "pfld.l", 0x60000001, 0x9c000002, "1(2)++,g", 0 }, /* pfld.l isrc1(isrc2)++,fdest */ -{ "pfld.l", 0x64000001, 0x98000002, "i(2)++,g", E_ADDR }, /* pfld.l #const(isrc2)++,fdest */ -{ "pfld.d", 0x60000000, 0x9c000007, "1(2),g", 0 }, /* pfld.d isrc1(isrc2),fdest */ -{ "pfld.d", 0x64000000, 0x98000007, "i(2),g", E_ADDR }, /* pfld.d #const(isrc2),fdest */ -{ "pfld.d", 0x60000001, 0x9c000006, "1(2)++,g", 0 }, /* pfld.d isrc1(isrc2)++,fdest */ -{ "pfld.d", 0x64000001, 0x98000006, "i(2)++,g", E_ADDR }, /* pfld.d #const(isrc2)++,fdest */ - -{ "fst.l", 0x28000002, 0xd4000001, "g,1(2)", 0 }, /* fst.l fdest,isrc1(isrc2) */ -{ "fst.l", 0x2c000002, 0xd0000001, "g,i(2)", E_ADDR }, /* fst.l fdest,#const(isrc2) */ -{ "fst.l", 0x28000003, 0xd4000000, "g,1(2)++", 0 }, /* fst.l fdest,isrc1(isrc2)++ */ -{ "fst.l", 0x2c000003, 0xd0000000, "g,i(2)++", E_ADDR }, /* fst.l fdest,#const(isrc2)++ */ -{ "fst.d", 0x28000000, 0xd4000007, "g,1(2)", 0 }, /* fst.d fdest,isrc1(isrc2) */ -{ "fst.d", 0x2c000000, 0xd0000007, "g,i(2)", E_ADDR }, /* fst.d fdest,#const(isrc2) */ -{ "fst.d", 0x28000001, 0xd4000006, "g,1(2)++", 0 }, /* fst.d fdest,isrc1(isrc2)++ */ -{ "fst.d", 0x2c000001, 0xd0000006, "g,i(2)++", E_ADDR }, /* fst.d fdest,#const(isrc2)++ */ - -{ "pst.d", 0x3c000000, 0xc0000007, "g,i(2)", E_ADDR }, /* pst.d fdest,#const(isrc2) */ -{ "pst.d", 0x3c000001, 0xc0000006, "g,i(2)++", E_ADDR }, /* pst.d fdest,#const(isrc2)++ */ - -{ "addu", 0x80000000, 0x7c000000, "1,2,d", 0 }, /* addu isrc1,isrc2,idest */ -{ "addu", 0x84000000, 0x78000000, "i,2,d", E_S32 }, /* addu #const,isrc2,idest */ -{ "adds", 0x90000000, 0x6c000000, "1,2,d", 0 }, /* adds isrc1,isrc2,idest */ -{ "adds", 0x94000000, 0x68000000, "i,2,d", E_S32 }, /* adds #const,isrc2,idest */ -{ "subu", 0x88000000, 0x74000000, "1,2,d", 0 }, /* subu isrc1,isrc2,idest */ -{ "subu", 0x8c000000, 0x70000000, "i,2,d", E_S32 }, /* subu #const,isrc2,idest */ -{ "subs", 0x98000000, 0x64000000, "1,2,d", 0 }, /* subs isrc1,isrc2,idest */ -{ "subs", 0x9c000000, 0x60000000, "i,2,d", E_S32 }, /* subs #const,isrc2,idest */ - -{ "shl", 0xa0000000, 0x5c000000, "1,2,d", 0 }, /* shl isrc1,isrc2,idest */ -{ "shl", 0xa4000000, 0x58000000, "i,2,d", 0 }, /* shl #const,isrc2,idest */ -{ "shr", 0xa8000000, 0x54000000, "1,2,d", 0 }, /* shr isrc1,isrc2,idest */ -{ "shr", 0xac000000, 0x50000000, "i,2,d", 0 }, /* shr #const,isrc2,idest */ -{ "shrd", 0xb0000000, 0x4c000000, "1,2,d", 0 }, /* shrd isrc1,isrc2,idest */ -{ "shra", 0xb8000000, 0x44000000, "1,2,d", 0 }, /* shra isrc1,isrc2,idest */ -{ "shra", 0xbc000000, 0x40000000, "i,2,d", 0 }, /* shra #const,isrc2,idest */ - -{ "mov", 0xa0000000, 0x5c00f800, "2,d", 0 }, /* shl r0,isrc2,idest */ -{ "mov", 0x94000000, 0x69e00000, "i,d", E_MOV }, /* adds #const,r0,idest */ -{ "nop", 0xa0000000, 0x5ffff800, "", 0 }, /* shl r0,r0,r0 */ -{ "fnop", 0xb0000000, 0x4ffff800, "", 0 }, /* shrd r0,r0,r0 */ - -{ "trap", 0x44000000, 0xb8000000, "1,2,d", 0 }, /* trap isrc1ni,isrc2,idest */ - -{ "flush", 0x34000000, 0xc81f0001, "i(2)", E_ADDR }, /* flush #const(isrc2) */ -{ "flush", 0x34000001, 0xc81f0000, "i(2)++", E_ADDR }, /* flush #const(isrc2)++ */ - -{ "and", 0xc0000000, 0x3c000000, "1,2,d", 0 }, /* and isrc1,isrc2,idest */ -{ "and", 0xc4000000, 0x38000000, "i,2,d", E_AND }, /* and #const,isrc2,idest */ -{ "andh", 0xc8000000, 0x34000000, "1,2,d", 0 }, /* andh isrc1,isrc2,idest */ -{ "andh", 0xcc000000, 0x30000000, "i,2,d", 0 }, /* andh #const,isrc2,idest */ -{ "andnot", 0xd0000000, 0x2c000000, "1,2,d", 0 }, /* andnot isrc1,isrc2,idest */ -{ "andnot", 0xd4000000, 0x28000000, "i,2,d", E_U32 }, /* andnot #const,isrc2,idest */ -{ "andnoth", 0xd8000000, 0x24000000, "1,2,d", 0 }, /* andnoth isrc1,isrc2,idest */ -{ "andnoth", 0xdc000000, 0x20000000, "i,2,d", 0 }, /* andnoth #const,isrc2,idest */ -{ "or", 0xe0000000, 0x1c000000, "1,2,d", 0 }, /* or isrc1,isrc2,idest */ -{ "or", 0xe4000000, 0x18000000, "i,2,d", E_U32 }, /* or #const,isrc2,idest */ -{ "orh", 0xe8000000, 0x14000000, "1,2,d", 0 }, /* orh isrc1,isrc2,idest */ -{ "orh", 0xec000000, 0x10000000, "i,2,d", 0 }, /* orh #const,isrc2,idest */ -{ "xor", 0xf0000000, 0x0c000000, "1,2,d", 0 }, /* xor isrc1,isrc2,idest */ -{ "xor", 0xf4000000, 0x08000000, "i,2,d", E_U32 }, /* xor #const,isrc2,idest */ -{ "xorh", 0xf8000000, 0x04000000, "1,2,d", 0 }, /* xorh isrc1,isrc2,idest */ -{ "xorh", 0xfc000000, 0x00000000, "i,2,d", 0 }, /* xorh #const,isrc2,idest */ - -{ "bte", 0x58000000, 0xa4000000, "1,2,s", 0 }, /* bte isrc1s,isrc2,sbroff */ -{ "bte", 0x5c000000, 0xa0000000, "5,2,s", 0 }, /* bte #const5,isrc2,sbroff */ -{ "btne", 0x50000000, 0xac000000, "1,2,s", 0 }, /* btne isrc1s,isrc2,sbroff */ -{ "btne", 0x54000000, 0xa8000000, "5,2,s", 0 }, /* btne #const5,isrc2,sbroff */ -{ "bla", 0xb4000000, 0x48000000, "1,2,s", E_DELAY }, /* bla isrc1s,isrc2,sbroff */ -{ "bri", 0x40000000, 0xbc000000, "1", E_DELAY }, /* bri isrc1ni */ - -/* Core Escape Instruction Format */ -{ "lock", 0x4c000001, 0xb000001e, "", 0 }, /* lock set BL in dirbase */ -{ "calli", 0x4c000002, 0xb000001d, "1", E_DELAY }, /* calli isrc1ni */ -{ "intovr", 0x4c000004, 0xb000001b, "", 0 }, /* intovr trap on integer overflow */ -{ "unlock", 0x4c000007, 0xb0000018, "", 0 }, /* unlock clear BL in dirbase */ - -/* CTRL-Format Instructions */ -{ "br", 0x68000000, 0x94000000, "l", E_DELAY }, /* br lbroff */ -{ "call", 0x6c000000, 0x90000000, "l", E_DELAY }, /* call lbroff */ -{ "bc", 0x70000000, 0x8c000000, "l", 0 }, /* bc lbroff */ -{ "bc.t", 0x74000000, 0x88000000, "l", E_DELAY }, /* bc.t lbroff */ -{ "bnc", 0x78000000, 0x84000000, "l", 0 }, /* bnc lbroff */ -{ "bnc.t", 0x7c000000, 0x80000000, "l", E_DELAY }, /* bnc.t lbroff */ - -/* Floating Point Escape Instruction Format - pfam.p fsrc1,fsrc2,fdest */ -{ "r2p1.ss", 0x48000400, 0xb40003ff, "e,f,g", 0 }, -{ "r2p1.sd", 0x48000480, 0xb400037f, "e,f,g", 0 }, -{ "r2p1.dd", 0x48000580, 0xb400027f, "e,f,g", 0 }, -{ "r2pt.ss", 0x48000401, 0xb40003fe, "e,f,g", 0 }, -{ "r2pt.sd", 0x48000481, 0xb400037e, "e,f,g", 0 }, -{ "r2pt.dd", 0x48000581, 0xb400027e, "e,f,g", 0 }, -{ "r2ap1.ss", 0x48000402, 0xb40003fd, "e,f,g", 0 }, -{ "r2ap1.sd", 0x48000482, 0xb400037d, "e,f,g", 0 }, -{ "r2ap1.dd", 0x48000582, 0xb400027d, "e,f,g", 0 }, -{ "r2apt.ss", 0x48000403, 0xb40003fc, "e,f,g", 0 }, -{ "r2apt.sd", 0x48000483, 0xb400037c, "e,f,g", 0 }, -{ "r2apt.dd", 0x48000583, 0xb400027c, "e,f,g", 0 }, -{ "i2p1.ss", 0x48000404, 0xb40003fb, "e,f,g", 0 }, -{ "i2p1.sd", 0x48000484, 0xb400037b, "e,f,g", 0 }, -{ "i2p1.dd", 0x48000584, 0xb400027b, "e,f,g", 0 }, -{ "i2pt.ss", 0x48000405, 0xb40003fa, "e,f,g", 0 }, -{ "i2pt.sd", 0x48000485, 0xb400037a, "e,f,g", 0 }, -{ "i2pt.dd", 0x48000585, 0xb400027a, "e,f,g", 0 }, -{ "i2ap1.ss", 0x48000406, 0xb40003f9, "e,f,g", 0 }, -{ "i2ap1.sd", 0x48000486, 0xb4000379, "e,f,g", 0 }, -{ "i2ap1.dd", 0x48000586, 0xb4000279, "e,f,g", 0 }, -{ "i2apt.ss", 0x48000407, 0xb40003f8, "e,f,g", 0 }, -{ "i2apt.sd", 0x48000487, 0xb4000378, "e,f,g", 0 }, -{ "i2apt.dd", 0x48000587, 0xb4000278, "e,f,g", 0 }, -{ "rat1p2.ss", 0x48000408, 0xb40003f7, "e,f,g", 0 }, -{ "rat1p2.sd", 0x48000488, 0xb4000377, "e,f,g", 0 }, -{ "rat1p2.dd", 0x48000588, 0xb4000277, "e,f,g", 0 }, -{ "m12apm.ss", 0x48000409, 0xb40003f6, "e,f,g", 0 }, -{ "m12apm.sd", 0x48000489, 0xb4000376, "e,f,g", 0 }, -{ "m12apm.dd", 0x48000589, 0xb4000276, "e,f,g", 0 }, -{ "ra1p2.ss", 0x4800040a, 0xb40003f5, "e,f,g", 0 }, -{ "ra1p2.sd", 0x4800048a, 0xb4000375, "e,f,g", 0 }, -{ "ra1p2.dd", 0x4800058a, 0xb4000275, "e,f,g", 0 }, -{ "m12ttpa.ss", 0x4800040b, 0xb40003f4, "e,f,g", 0 }, -{ "m12ttpa.sd", 0x4800048b, 0xb4000374, "e,f,g", 0 }, -{ "m12ttpa.dd", 0x4800058b, 0xb4000274, "e,f,g", 0 }, -{ "iat1p2.ss", 0x4800040c, 0xb40003f3, "e,f,g", 0 }, -{ "iat1p2.sd", 0x4800048c, 0xb4000373, "e,f,g", 0 }, -{ "iat1p2.dd", 0x4800058c, 0xb4000273, "e,f,g", 0 }, -{ "m12tpm.ss", 0x4800040d, 0xb40003f2, "e,f,g", 0 }, -{ "m12tpm.sd", 0x4800048d, 0xb4000372, "e,f,g", 0 }, -{ "m12tpm.dd", 0x4800058d, 0xb4000272, "e,f,g", 0 }, -{ "ia1p2.ss", 0x4800040e, 0xb40003f1, "e,f,g", 0 }, -{ "ia1p2.sd", 0x4800048e, 0xb4000371, "e,f,g", 0 }, -{ "ia1p2.dd", 0x4800058e, 0xb4000271, "e,f,g", 0 }, -{ "m12tpa.ss", 0x4800040f, 0xb40003f0, "e,f,g", 0 }, -{ "m12tpa.sd", 0x4800048f, 0xb4000370, "e,f,g", 0 }, -{ "m12tpa.dd", 0x4800058f, 0xb4000270, "e,f,g", 0 }, - -/* Floating Point Escape Instruction Format - pfsm.p fsrc1,fsrc2,fdest */ -{ "r2s1.ss", 0x48000410, 0xb40003ef, "e,f,g", 0 }, -{ "r2s1.sd", 0x48000490, 0xb400036f, "e,f,g", 0 }, -{ "r2s1.dd", 0x48000590, 0xb400026f, "e,f,g", 0 }, -{ "r2st.ss", 0x48000411, 0xb40003ee, "e,f,g", 0 }, -{ "r2st.sd", 0x48000491, 0xb400036e, "e,f,g", 0 }, -{ "r2st.dd", 0x48000591, 0xb400026e, "e,f,g", 0 }, -{ "r2as1.ss", 0x48000412, 0xb40003ed, "e,f,g", 0 }, -{ "r2as1.sd", 0x48000492, 0xb400036d, "e,f,g", 0 }, -{ "r2as1.dd", 0x48000592, 0xb400026d, "e,f,g", 0 }, -{ "r2ast.ss", 0x48000413, 0xb40003ec, "e,f,g", 0 }, -{ "r2ast.sd", 0x48000493, 0xb400036c, "e,f,g", 0 }, -{ "r2ast.dd", 0x48000593, 0xb400026c, "e,f,g", 0 }, -{ "i2s1.ss", 0x48000414, 0xb40003eb, "e,f,g", 0 }, -{ "i2s1.sd", 0x48000494, 0xb400036b, "e,f,g", 0 }, -{ "i2s1.dd", 0x48000594, 0xb400026b, "e,f,g", 0 }, -{ "i2st.ss", 0x48000415, 0xb40003ea, "e,f,g", 0 }, -{ "i2st.sd", 0x48000495, 0xb400036a, "e,f,g", 0 }, -{ "i2st.dd", 0x48000595, 0xb400026a, "e,f,g", 0 }, -{ "i2as1.ss", 0x48000416, 0xb40003e9, "e,f,g", 0 }, -{ "i2as1.sd", 0x48000496, 0xb4000369, "e,f,g", 0 }, -{ "i2as1.dd", 0x48000596, 0xb4000269, "e,f,g", 0 }, -{ "i2ast.ss", 0x48000417, 0xb40003e8, "e,f,g", 0 }, -{ "i2ast.sd", 0x48000497, 0xb4000368, "e,f,g", 0 }, -{ "i2ast.dd", 0x48000597, 0xb4000268, "e,f,g", 0 }, -{ "rat1s2.ss", 0x48000418, 0xb40003e7, "e,f,g", 0 }, -{ "rat1s2.sd", 0x48000498, 0xb4000367, "e,f,g", 0 }, -{ "rat1s2.dd", 0x48000598, 0xb4000267, "e,f,g", 0 }, -{ "m12asm.ss", 0x48000419, 0xb40003e6, "e,f,g", 0 }, -{ "m12asm.sd", 0x48000499, 0xb4000366, "e,f,g", 0 }, -{ "m12asm.dd", 0x48000599, 0xb4000266, "e,f,g", 0 }, -{ "ra1s2.ss", 0x4800041a, 0xb40003e5, "e,f,g", 0 }, -{ "ra1s2.sd", 0x4800049a, 0xb4000365, "e,f,g", 0 }, -{ "ra1s2.dd", 0x4800059a, 0xb4000265, "e,f,g", 0 }, -{ "m12ttsa.ss", 0x4800041b, 0xb40003e4, "e,f,g", 0 }, -{ "m12ttsa.sd", 0x4800049b, 0xb4000364, "e,f,g", 0 }, -{ "m12ttsa.dd", 0x4800059b, 0xb4000264, "e,f,g", 0 }, -{ "iat1s2.ss", 0x4800041c, 0xb40003e3, "e,f,g", 0 }, -{ "iat1s2.sd", 0x4800049c, 0xb4000363, "e,f,g", 0 }, -{ "iat1s2.dd", 0x4800059c, 0xb4000263, "e,f,g", 0 }, -{ "m12tsm.ss", 0x4800041d, 0xb40003e2, "e,f,g", 0 }, -{ "m12tsm.sd", 0x4800049d, 0xb4000362, "e,f,g", 0 }, -{ "m12tsm.dd", 0x4800059d, 0xb4000262, "e,f,g", 0 }, -{ "ia1s2.ss", 0x4800041e, 0xb40003e1, "e,f,g", 0 }, -{ "ia1s2.sd", 0x4800049e, 0xb4000361, "e,f,g", 0 }, -{ "ia1s2.dd", 0x4800059e, 0xb4000261, "e,f,g", 0 }, -{ "m12tsa.ss", 0x4800041f, 0xb40003e0, "e,f,g", 0 }, -{ "m12tsa.sd", 0x4800049f, 0xb4000360, "e,f,g", 0 }, -{ "m12tsa.dd", 0x4800059f, 0xb4000260, "e,f,g", 0 }, - -/* Floating Point Escape Instruction Format - pfmam.p fsrc1,fsrc2,fdest */ -{ "mr2p1.ss", 0x48000000, 0xb40007ff, "e,f,g", 0 }, -{ "mr2p1.sd", 0x48000080, 0xb400077f, "e,f,g", 0 }, -{ "mr2p1.dd", 0x48000180, 0xb400067f, "e,f,g", 0 }, -{ "mr2pt.ss", 0x48000001, 0xb40007fe, "e,f,g", 0 }, -{ "mr2pt.sd", 0x48000081, 0xb400077e, "e,f,g", 0 }, -{ "mr2pt.dd", 0x48000181, 0xb400067e, "e,f,g", 0 }, -{ "mr2mp1.ss", 0x48000002, 0xb40007fd, "e,f,g", 0 }, -{ "mr2mp1.sd", 0x48000082, 0xb400077d, "e,f,g", 0 }, -{ "mr2mp1.dd", 0x48000182, 0xb400067d, "e,f,g", 0 }, -{ "mr2mpt.ss", 0x48000003, 0xb40007fc, "e,f,g", 0 }, -{ "mr2mpt.sd", 0x48000083, 0xb400077c, "e,f,g", 0 }, -{ "mr2mpt.dd", 0x48000183, 0xb400067c, "e,f,g", 0 }, -{ "mi2p1.ss", 0x48000004, 0xb40007fb, "e,f,g", 0 }, -{ "mi2p1.sd", 0x48000084, 0xb400077b, "e,f,g", 0 }, -{ "mi2p1.dd", 0x48000184, 0xb400067b, "e,f,g", 0 }, -{ "mi2pt.ss", 0x48000005, 0xb40007fa, "e,f,g", 0 }, -{ "mi2pt.sd", 0x48000085, 0xb400077a, "e,f,g", 0 }, -{ "mi2pt.dd", 0x48000185, 0xb400067a, "e,f,g", 0 }, -{ "mi2mp1.ss", 0x48000006, 0xb40007f9, "e,f,g", 0 }, -{ "mi2mp1.sd", 0x48000086, 0xb4000779, "e,f,g", 0 }, -{ "mi2mp1.dd", 0x48000186, 0xb4000679, "e,f,g", 0 }, -{ "mi2mpt.ss", 0x48000007, 0xb40007f8, "e,f,g", 0 }, -{ "mi2mpt.sd", 0x48000087, 0xb4000778, "e,f,g", 0 }, -{ "mi2mpt.dd", 0x48000187, 0xb4000678, "e,f,g", 0 }, -{ "mrmt1p2.ss", 0x48000008, 0xb40007f7, "e,f,g", 0 }, -{ "mrmt1p2.sd", 0x48000088, 0xb4000777, "e,f,g", 0 }, -{ "mrmt1p2.dd", 0x48000188, 0xb4000677, "e,f,g", 0 }, -{ "mm12mpm.ss", 0x48000009, 0xb40007f6, "e,f,g", 0 }, -{ "mm12mpm.sd", 0x48000089, 0xb4000776, "e,f,g", 0 }, -{ "mm12mpm.dd", 0x48000189, 0xb4000676, "e,f,g", 0 }, -{ "mrm1p2.ss", 0x4800000a, 0xb40007f5, "e,f,g", 0 }, -{ "mrm1p2.sd", 0x4800008a, 0xb4000775, "e,f,g", 0 }, -{ "mrm1p2.dd", 0x4800018a, 0xb4000675, "e,f,g", 0 }, -{ "mm12ttpm.ss",0x4800000b, 0xb40007f4, "e,f,g", 0 }, -{ "mm12ttpm.sd",0x4800008b, 0xb4000774, "e,f,g", 0 }, -{ "mm12ttpm.dd",0x4800018b, 0xb4000674, "e,f,g", 0 }, -{ "mimt1p2.ss", 0x4800000c, 0xb40007f3, "e,f,g", 0 }, -{ "mimt1p2.sd", 0x4800008c, 0xb4000773, "e,f,g", 0 }, -{ "mimt1p2.dd", 0x4800018c, 0xb4000673, "e,f,g", 0 }, -{ "mm12tpm.ss", 0x4800000d, 0xb40007f2, "e,f,g", 0 }, -{ "mm12tpm.sd", 0x4800008d, 0xb4000772, "e,f,g", 0 }, -{ "mm12tpm.dd", 0x4800018d, 0xb4000672, "e,f,g", 0 }, -{ "mim1p2.ss", 0x4800000e, 0xb40007f1, "e,f,g", 0 }, -{ "mim1p2.sd", 0x4800008e, 0xb4000771, "e,f,g", 0 }, -{ "mim1p2.dd", 0x4800018e, 0xb4000671, "e,f,g", 0 }, - -/* Floating Point Escape Instruction Format - pfmsm.p fsrc1,fsrc2,fdest */ -{ "mr2s1.ss", 0x48000010, 0xb40007ef, "e,f,g", 0 }, -{ "mr2s1.sd", 0x48000090, 0xb400076f, "e,f,g", 0 }, -{ "mr2s1.dd", 0x48000190, 0xb400066f, "e,f,g", 0 }, -{ "mr2st.ss", 0x48000011, 0xb40007ee, "e,f,g", 0 }, -{ "mr2st.sd", 0x48000091, 0xb400076e, "e,f,g", 0 }, -{ "mr2st.dd", 0x48000191, 0xb400066e, "e,f,g", 0 }, -{ "mr2ms1.ss", 0x48000012, 0xb40007ed, "e,f,g", 0 }, -{ "mr2ms1.sd", 0x48000092, 0xb400076d, "e,f,g", 0 }, -{ "mr2ms1.dd", 0x48000192, 0xb400066d, "e,f,g", 0 }, -{ "mr2mst.ss", 0x48000013, 0xb40007ec, "e,f,g", 0 }, -{ "mr2mst.sd", 0x48000093, 0xb400076c, "e,f,g", 0 }, -{ "mr2mst.dd", 0x48000193, 0xb400066c, "e,f,g", 0 }, -{ "mi2s1.ss", 0x48000014, 0xb40007eb, "e,f,g", 0 }, -{ "mi2s1.sd", 0x48000094, 0xb400076b, "e,f,g", 0 }, -{ "mi2s1.dd", 0x48000194, 0xb400066b, "e,f,g", 0 }, -{ "mi2st.ss", 0x48000015, 0xb40007ea, "e,f,g", 0 }, -{ "mi2st.sd", 0x48000095, 0xb400076a, "e,f,g", 0 }, -{ "mi2st.dd", 0x48000195, 0xb400066a, "e,f,g", 0 }, -{ "mi2ms1.ss", 0x48000016, 0xb40007e9, "e,f,g", 0 }, -{ "mi2ms1.sd", 0x48000096, 0xb4000769, "e,f,g", 0 }, -{ "mi2ms1.dd", 0x48000196, 0xb4000669, "e,f,g", 0 }, -{ "mi2mst.ss", 0x48000017, 0xb40007e8, "e,f,g", 0 }, -{ "mi2mst.sd", 0x48000097, 0xb4000768, "e,f,g", 0 }, -{ "mi2mst.dd", 0x48000197, 0xb4000668, "e,f,g", 0 }, -{ "mrmt1s2.ss", 0x48000018, 0xb40007e7, "e,f,g", 0 }, -{ "mrmt1s2.sd", 0x48000098, 0xb4000767, "e,f,g", 0 }, -{ "mrmt1s2.dd", 0x48000198, 0xb4000667, "e,f,g", 0 }, -{ "mm12msm.ss", 0x48000019, 0xb40007e6, "e,f,g", 0 }, -{ "mm12msm.sd", 0x48000099, 0xb4000766, "e,f,g", 0 }, -{ "mm12msm.dd", 0x48000199, 0xb4000666, "e,f,g", 0 }, -{ "mrm1s2.ss", 0x4800001a, 0xb40007e5, "e,f,g", 0 }, -{ "mrm1s2.sd", 0x4800009a, 0xb4000765, "e,f,g", 0 }, -{ "mrm1s2.dd", 0x4800019a, 0xb4000665, "e,f,g", 0 }, -{ "mm12ttsm.ss",0x4800001b, 0xb40007e4, "e,f,g", 0 }, -{ "mm12ttsm.sd",0x4800009b, 0xb4000764, "e,f,g", 0 }, -{ "mm12ttsm.dd",0x4800019b, 0xb4000664, "e,f,g", 0 }, -{ "mimt1s2.ss", 0x4800001c, 0xb40007e3, "e,f,g", 0 }, -{ "mimt1s2.sd", 0x4800009c, 0xb4000763, "e,f,g", 0 }, -{ "mimt1s2.dd", 0x4800019c, 0xb4000663, "e,f,g", 0 }, -{ "mm12tsm.ss", 0x4800001d, 0xb40007e2, "e,f,g", 0 }, -{ "mm12tsm.sd", 0x4800009d, 0xb4000762, "e,f,g", 0 }, -{ "mm12tsm.dd", 0x4800019d, 0xb4000662, "e,f,g", 0 }, -{ "mim1s2.ss", 0x4800001e, 0xb40007e1, "e,f,g", 0 }, -{ "mim1s2.sd", 0x4800009e, 0xb4000761, "e,f,g", 0 }, -{ "mim1s2.dd", 0x4800019e, 0xb4000661, "e,f,g", 0 }, - - -{ "fmul.ss", 0x48000020, 0xb40007df, "e,f,g", 0 }, /* fmul.p fsrc1,fsrc2,fdest */ -{ "fmul.sd", 0x480000a0, 0xb400075f, "e,f,g", 0 }, /* fmul.p fsrc1,fsrc2,fdest */ -{ "fmul.dd", 0x480001a0, 0xb400065f, "e,f,g", 0 }, /* fmul.p fsrc1,fsrc2,fdest */ -{ "pfmul.ss", 0x48000420, 0xb40003df, "e,f,g", 0 }, /* pfmul.p fsrc1,fsrc2,fdest */ -{ "pfmul.sd", 0x480004a0, 0xb400035f, "e,f,g", 0 }, /* pfmul.p fsrc1,fsrc2,fdest */ -{ "pfmul.dd", 0x480005a0, 0xb400025f, "e,f,g", 0 }, /* pfmul.p fsrc1,fsrc2,fdest */ -{ "pfmul3.dd", 0x480005a4, 0xb400025b, "e,f,g", 0 }, /* pfmul3.p fsrc1,fsrc2,fdest */ -{ "fmlow.dd", 0x480001a1, 0xb400065e, "e,f,g", 0 }, /* fmlow.dd fsrc1,fsrc2,fdest */ -{ "frcp.ss", 0x48000022, 0xb40007dd, "f,g", 0 }, /* frcp.p fsrc2,fdest */ -{ "frcp.sd", 0x480000a2, 0xb400075d, "f,g", 0 }, /* frcp.p fsrc2,fdest */ -{ "frcp.dd", 0x480001a2, 0xb400065d, "f,g", 0 }, /* frcp.p fsrc2,fdest */ -{ "frsqr.ss", 0x48000023, 0xb40007dc, "f,g", 0 }, /* frsqr.p fsrc2,fdest */ -{ "frsqr.sd", 0x480000a3, 0xb400075c, "f,g", 0 }, /* frsqr.p fsrc2,fdest */ -{ "frsqr.dd", 0x480001a3, 0xb400065c, "f,g", 0 }, /* frsqr.p fsrc2,fdest */ -{ "fadd.ss", 0x48000030, 0xb40007cf, "e,f,g", 0 }, /* fadd.p fsrc1,fsrc2,fdest */ -{ "fadd.sd", 0x480000b0, 0xb400074f, "e,f,g", 0 }, /* fadd.p fsrc1,fsrc2,fdest */ -{ "fadd.dd", 0x480001b0, 0xb400064f, "e,f,g", 0 }, /* fadd.p fsrc1,fsrc2,fdest */ -{ "pfadd.ss", 0x48000430, 0xb40003cf, "e,f,g", 0 }, /* pfadd.p fsrc1,fsrc2,fdest */ -{ "pfadd.sd", 0x480004b0, 0xb400034f, "e,f,g", 0 }, /* pfadd.p fsrc1,fsrc2,fdest */ -{ "pfadd.dd", 0x480005b0, 0xb400024f, "e,f,g", 0 }, /* pfadd.p fsrc1,fsrc2,fdest */ -{ "fsub.ss", 0x48000031, 0xb40007ce, "e,f,g", 0 }, /* fsub.p fsrc1,fsrc2,fdest */ -{ "fsub.sd", 0x480000b1, 0xb400074e, "e,f,g", 0 }, /* fsub.p fsrc1,fsrc2,fdest */ -{ "fsub.dd", 0x480001b1, 0xb400064e, "e,f,g", 0 }, /* fsub.p fsrc1,fsrc2,fdest */ -{ "pfsub.ss", 0x48000431, 0xb40003ce, "e,f,g", 0 }, /* pfsub.p fsrc1,fsrc2,fdest */ -{ "pfsub.sd", 0x480004b1, 0xb400034e, "e,f,g", 0 }, /* pfsub.p fsrc1,fsrc2,fdest */ -{ "pfsub.dd", 0x480005b1, 0xb400024e, "e,f,g", 0 }, /* pfsub.p fsrc1,fsrc2,fdest */ -{ "fix.ss", 0x48000032, 0xb40007cd, "e,g", 0 }, /* fix.p fsrc1,fdest */ -{ "fix.sd", 0x480000b2, 0xb400074d, "e,g", 0 }, /* fix.p fsrc1,fdest */ -{ "fix.dd", 0x480001b2, 0xb400064d, "e,g", 0 }, /* fix.p fsrc1,fdest */ -{ "pfix.ss", 0x48000432, 0xb40003cd, "e,g", 0 }, /* pfix.p fsrc1,fdest */ -{ "pfix.sd", 0x480004b2, 0xb400034d, "e,g", 0 }, /* pfix.p fsrc1,fdest */ -{ "pfix.dd", 0x480005b2, 0xb400024d, "e,g", 0 }, /* pfix.p fsrc1,fdest */ -{ "famov.ss", 0x48000033, 0xb40007cc, "e,g", 0 }, /* famov.p fsrc1,fdest */ -{ "famov.ds", 0x48000133, 0xb40006cc, "e,g", 0 }, /* famov.p fsrc1,fdest */ -{ "famov.sd", 0x480000b3, 0xb400074c, "e,g", 0 }, /* famov.p fsrc1,fdest */ -{ "famov.dd", 0x480001b3, 0xb400064c, "e,g", 0 }, /* famov.p fsrc1,fdest */ -{ "pfamov.ss", 0x48000433, 0xb40003cc, "e,g", 0 }, /* pfamov.p fsrc1,fdest */ -{ "pfamov.ds", 0x48000533, 0xb40002cc, "e,g", 0 }, /* pfamov.p fsrc1,fdest */ -{ "pfamov.sd", 0x480004b3, 0xb400034c, "e,g", 0 }, /* pfamov.p fsrc1,fdest */ -{ "pfamov.dd", 0x480005b3, 0xb400024c, "e,g", 0 }, /* pfamov.p fsrc1,fdest */ -/* pfgt has R bit cleared; pfle has R bit set */ -{ "pfgt.ss", 0x48000434, 0xb40003cb, "e,f,g", 0 }, /* pfgt.p fsrc1,fsrc2,fdest */ -{ "pfgt.sd", 0x48000434, 0xb40003cb, "e,f,g", 0 }, /* pfgt.p fsrc1,fsrc2,fdest */ -{ "pfgt.dd", 0x48000534, 0xb40002cb, "e,f,g", 0 }, /* pfgt.p fsrc1,fsrc2,fdest */ -/* pfgt has R bit cleared; pfle has R bit set */ -{ "pfle.ss", 0x480004b4, 0xb400034b, "e,f,g", 0 }, /* pfle.p fsrc1,fsrc2,fdest */ -{ "pfle.sd", 0x480004b4, 0xb400034b, "e,f,g", 0 }, /* pfle.p fsrc1,fsrc2,fdest */ -{ "pfle.dd", 0x480005b4, 0xb400024b, "e,f,g", 0 }, /* pfle.p fsrc1,fsrc2,fdest */ -{ "ftrunc.ss", 0x4800003a, 0xb40007c5, "e,g", 0 }, /* ftrunc.p fsrc1,fdest */ -{ "ftrunc.sd", 0x480000ba, 0xb4000745, "e,g", 0 }, /* ftrunc.p fsrc1,fdest */ -{ "ftrunc.dd", 0x480001ba, 0xb4000645, "e,g", 0 }, /* ftrunc.p fsrc1,fdest */ -{ "pftrunc.ss", 0x4800043a, 0xb40003c5, "e,g", 0 }, /* pftrunc.p fsrc1,fdest */ -{ "pftrunc.sd", 0x480004ba, 0xb4000345, "e,g", 0 }, /* pftrunc.p fsrc1,fdest */ -{ "pftrunc.dd", 0x480005ba, 0xb4000245, "e,g", 0 }, /* pftrunc.p fsrc1,fdest */ -{ "fxfr", 0x48000040, 0xb40007bf, "e,d", 0 }, /* fxfr fsrc1,idest */ -{ "fiadd.ss", 0x48000049, 0xb40007b6, "e,f,g", 0 }, /* fiadd.w fsrc1,fsrc2,fdest */ -{ "fiadd.dd", 0x480001c9, 0xb4000636, "e,f,g", 0 }, /* fiadd.w fsrc1,fsrc2,fdest */ -{ "pfiadd.ss", 0x48000449, 0xb40003b6, "e,f,g", 0 }, /* pfiadd.w fsrc1,fsrc2,fdest */ -{ "pfiadd.dd", 0x480005c9, 0xb4000236, "e,f,g", 0 }, /* pfiadd.w fsrc1,fsrc2,fdest */ -{ "fisub.ss", 0x4800004d, 0xb40007b2, "e,f,g", 0 }, /* fisub.w fsrc1,fsrc2,fdest */ -{ "fisub.dd", 0x480001cd, 0xb4000632, "e,f,g", 0 }, /* fisub.w fsrc1,fsrc2,fdest */ -{ "pfisub.ss", 0x4800044d, 0xb40003b2, "e,f,g", 0 }, /* pfisub.w fsrc1,fsrc2,fdest */ -{ "pfisub.dd", 0x480005cd, 0xb4000232, "e,f,g", 0 }, /* pfisub.w fsrc1,fsrc2,fdest */ -{ "fzchkl", 0x48000057, 0xb40007a8, "e,f,g", 0 }, /* fzchkl fsrc1,fsrc2,fdest */ -{ "pfzchkl", 0x48000457, 0xb40003a8, "e,f,g", 0 }, /* pfzchkl fsrc1,fsrc2,fdest */ -{ "fzchks", 0x4800005f, 0xb40007a0, "e,f,g", 0 }, /* fzchks fsrc1,fsrc2,fdest */ -{ "pfzchks", 0x4800045f, 0xb40003a0, "e,f,g", 0 }, /* pfzchks fsrc1,fsrc2,fdest */ -{ "faddp", 0x48000050, 0xb40007af, "e,f,g", 0 }, /* faddp fsrc1,fsrc2,fdest */ -{ "pfaddp", 0x48000450, 0xb40003af, "e,f,g", 0 }, /* pfaddp fsrc1,fsrc2,fdest */ -{ "faddz", 0x48000051, 0xb40007ae, "e,f,g", 0 }, /* faddz fsrc1,fsrc2,fdest */ -{ "pfaddz", 0x48000451, 0xb40003ae, "e,f,g", 0 }, /* pfaddz fsrc1,fsrc2,fdest */ -{ "form", 0x4800005a, 0xb40007a5, "e,g", 0 }, /* form fsrc1,fdest */ -{ "pform", 0x4800045a, 0xb40003a5, "e,g", 0 }, /* pform fsrc1,fdest */ - -/* Floating point pseudo-instructions */ -{ "fmov.ss", 0x48000049, 0xb7e007b6, "e,g", 0 }, /* fiadd.ss fsrc1,f0,fdest */ -{ "fmov.dd", 0x480001c9, 0xb7e00636, "e,g", 0 }, /* fiadd.dd fsrc1,f0,fdest */ -{ "fmov.sd", 0x480000b0, 0xb7e0074f, "e,g", 0 }, /* fadd.sd fsrc1,f0,fdest */ -{ "fmov.ds", 0x48000130, 0xb7e006cf, "e,g", 0 }, /* fadd.ds fsrc1,f0,fdest */ -{ "pfmov.ds", 0x48000530, 0xb73002cf, "e,g", 0 }, /* pfadd.ds fsrc1,f0,fdest */ -{ "pfmov.dd", 0x480005c9, 0xb7e00236, "e,g", 0 }, /* pfiadd.dd fsrc1,f0,fdest */ - - -}; - -#define NUMOPCODES ((sizeof i860_opcodes)/(sizeof i860_opcodes[0])) - - diff --git a/contrib/gdb/include/opcode/i960.h b/contrib/gdb/include/opcode/i960.h deleted file mode 100644 index 8030ad8a843ee..0000000000000 --- a/contrib/gdb/include/opcode/i960.h +++ /dev/null @@ -1,509 +0,0 @@ -/* Basic 80960 instruction formats. - * - * The 'COJ' instructions are actually COBR instructions with the 'b' in - * the mnemonic replaced by a 'j'; they are ALWAYS "de-optimized" if necessary: - * if the displacement will not fit in 13 bits, the assembler will replace them - * with the corresponding compare and branch instructions. - * - * All of the 'MEMn' instructions are the same format; the 'n' in the name - * indicates the default index scale factor (the size of the datum operated on). - * - * The FBRA formats are not actually an instruction format. They are the - * "convenience directives" for branching on floating-point comparisons, - * each of which generates 2 instructions (a 'bno' and one other branch). - * - * The CALLJ format is not actually an instruction format. It indicates that - * the instruction generated (a CTRL-format 'call') should have its relocation - * specially flagged for link-time replacement with a 'bal' or 'calls' if - * appropriate. - */ - -#define CTRL 0 -#define COBR 1 -#define COJ 2 -#define REG 3 -#define MEM1 4 -#define MEM2 5 -#define MEM4 6 -#define MEM8 7 -#define MEM12 8 -#define MEM16 9 -#define FBRA 10 -#define CALLJ 11 - -/* Masks for the mode bits in REG format instructions */ -#define M1 0x0800 -#define M2 0x1000 -#define M3 0x2000 - -/* Generate the 12-bit opcode for a REG format instruction by placing the - * high 8 bits in instruction bits 24-31, the low 4 bits in instruction bits - * 7-10. - */ - -#define REG_OPC(opc) ((opc & 0xff0) << 20) | ((opc & 0xf) << 7) - -/* Generate a template for a REG format instruction: place the opcode bits - * in the appropriate fields and OR in mode bits for the operands that will not - * be used. I.e., - * set m1=1, if src1 will not be used - * set m2=1, if src2 will not be used - * set m3=1, if dst will not be used - * - * Setting the "unused" mode bits to 1 speeds up instruction execution(!). - * The information is also useful to us because some 1-operand REG instructions - * use the src1 field, others the dst field; and some 2-operand REG instructions - * use src1/src2, others src1/dst. The set mode bits enable us to distinguish. - */ -#define R_0(opc) ( REG_OPC(opc) | M1 | M2 | M3 ) /* No operands */ -#define R_1(opc) ( REG_OPC(opc) | M2 | M3 ) /* 1 operand: src1 */ -#define R_1D(opc) ( REG_OPC(opc) | M1 | M2 ) /* 1 operand: dst */ -#define R_2(opc) ( REG_OPC(opc) | M3 ) /* 2 ops: src1/src2 */ -#define R_2D(opc) ( REG_OPC(opc) | M2 ) /* 2 ops: src1/dst */ -#define R_3(opc) ( REG_OPC(opc) ) /* 3 operands */ - -/* DESCRIPTOR BYTES FOR REGISTER OPERANDS - * - * Interpret names as follows: - * R: global or local register only - * RS: global, local, or (if target allows) special-function register only - * RL: global or local register, or integer literal - * RSL: global, local, or (if target allows) special-function register; - * or integer literal - * F: global, local, or floating-point register - * FL: global, local, or floating-point register; or literal (including - * floating point) - * - * A number appended to a name indicates that registers must be aligned, - * as follows: - * 2: register number must be multiple of 2 - * 4: register number must be multiple of 4 - */ - -#define SFR 0x10 /* Mask for the "sfr-OK" bit */ -#define LIT 0x08 /* Mask for the "literal-OK" bit */ -#define FP 0x04 /* Mask for "floating-point-OK" bit */ - -/* This macro ors the bits together. Note that 'align' is a mask - * for the low 0, 1, or 2 bits of the register number, as appropriate. - */ -#define OP(align,lit,fp,sfr) ( align | lit | fp | sfr ) - -#define R OP( 0, 0, 0, 0 ) -#define RS OP( 0, 0, 0, SFR ) -#define RL OP( 0, LIT, 0, 0 ) -#define RSL OP( 0, LIT, 0, SFR ) -#define F OP( 0, 0, FP, 0 ) -#define FL OP( 0, LIT, FP, 0 ) -#define R2 OP( 1, 0, 0, 0 ) -#define RL2 OP( 1, LIT, 0, 0 ) -#define F2 OP( 1, 0, FP, 0 ) -#define FL2 OP( 1, LIT, FP, 0 ) -#define R4 OP( 3, 0, 0, 0 ) -#define RL4 OP( 3, LIT, 0, 0 ) -#define F4 OP( 3, 0, FP, 0 ) -#define FL4 OP( 3, LIT, FP, 0 ) - -#define M 0x7f /* Memory operand (MEMA & MEMB format instructions) */ - -/* Macros to extract info from the register operand descriptor byte 'od'. - */ -#define SFR_OK(od) (od & SFR) /* TRUE if sfr operand allowed */ -#define LIT_OK(od) (od & LIT) /* TRUE if literal operand allowed */ -#define FP_OK(od) (od & FP) /* TRUE if floating-point op allowed */ -#define REG_ALIGN(od,n) ((od & 0x3 & n) == 0) - /* TRUE if reg #n is properly aligned */ -#define MEMOP(od) (od == M) /* TRUE if operand is a memory operand*/ - -/* Description of a single i80960 instruction */ -struct i960_opcode { - long opcode; /* 32 bits, constant fields filled in, rest zeroed */ - char *name; /* Assembler mnemonic */ - short iclass; /* Class: see #defines below */ - char format; /* REG, COBR, CTRL, MEMn, COJ, FBRA, or CALLJ */ - char num_ops; /* Number of operands */ - char operand[3];/* Operand descriptors; same order as assembler instr */ -}; - -/* Classes of 960 intructions: - * - each instruction falls into one class. - * - each target architecture supports one or more classes. - * - * EACH CONSTANT MUST CONTAIN 1 AND ONLY 1 SET BIT!: see targ_has_iclass(). - */ -#define I_BASE 0x01 /* 80960 base instruction set */ -#define I_CX 0x02 /* 80960Cx instruction */ -#define I_DEC 0x04 /* Decimal instruction */ -#define I_FP 0x08 /* Floating point instruction */ -#define I_KX 0x10 /* 80960Kx instruction */ -#define I_MIL 0x20 /* Military instruction */ -#define I_CASIM 0x40 /* CA simulator instruction */ -#define I_CX2 0x80 /* Cx/Jx/Hx instructions */ -#define I_JX 0x100 /* Jx/Hx instruction */ -#define I_HX 0x200 /* Hx instructions */ - -/****************************************************************************** - * - * TABLE OF i960 INSTRUCTION DESCRIPTIONS - * - ******************************************************************************/ - -const struct i960_opcode i960_opcodes[] = { - - /* if a CTRL instruction has an operand, it's always a displacement */ - - /* callj default=='call' */ - { 0x09000000, "callj", I_BASE, CALLJ, 1, { 0, 0, 0 } }, - { 0x08000000, "b", I_BASE, CTRL, 1, { 0, 0, 0 } }, - { 0x09000000, "call", I_BASE, CTRL, 1, { 0, 0, 0 } }, - { 0x0a000000, "ret", I_BASE, CTRL, 0, { 0, 0, 0 } }, - { 0x0b000000, "bal", I_BASE, CTRL, 1, { 0, 0, 0 } }, - { 0x10000000, "bno", I_BASE, CTRL, 1, { 0, 0, 0 } }, - /* bf same as bno */ - { 0x10000000, "bf", I_BASE, CTRL, 1, { 0, 0, 0 } }, - /* bru same as bno */ - { 0x10000000, "bru", I_BASE, CTRL, 1, { 0, 0, 0 } }, - { 0x11000000, "bg", I_BASE, CTRL, 1, { 0, 0, 0 } }, - /* brg same as bg */ - { 0x11000000, "brg", I_BASE, CTRL, 1, { 0, 0, 0 } }, - { 0x12000000, "be", I_BASE, CTRL, 1, { 0, 0, 0 } }, - /* bre same as be */ - { 0x12000000, "bre", I_BASE, CTRL, 1, { 0, 0, 0 } }, - { 0x13000000, "bge", I_BASE, CTRL, 1, { 0, 0, 0 } }, - /* brge same as bge */ - { 0x13000000, "brge", I_BASE, CTRL, 1, { 0, 0, 0 } }, - { 0x14000000, "bl", I_BASE, CTRL, 1, { 0, 0, 0 } }, - /* brl same as bl */ - { 0x14000000, "brl", I_BASE, CTRL, 1, { 0, 0, 0 } }, - { 0x15000000, "bne", I_BASE, CTRL, 1, { 0, 0, 0 } }, - /* brlg same as bne */ - { 0x15000000, "brlg", I_BASE, CTRL, 1, { 0, 0, 0 } }, - { 0x16000000, "ble", I_BASE, CTRL, 1, { 0, 0, 0 } }, - /* brle same as ble */ - { 0x16000000, "brle", I_BASE, CTRL, 1, { 0, 0, 0 } }, - { 0x17000000, "bo", I_BASE, CTRL, 1, { 0, 0, 0 } }, - /* bt same as bo */ - { 0x17000000, "bt", I_BASE, CTRL, 1, { 0, 0, 0 } }, - /* bro same as bo */ - { 0x17000000, "bro", I_BASE, CTRL, 1, { 0, 0, 0 } }, - { 0x18000000, "faultno", I_BASE, CTRL, 0, { 0, 0, 0 } }, - /* faultf same as faultno */ - { 0x18000000, "faultf", I_BASE, CTRL, 0, { 0, 0, 0 } }, - { 0x19000000, "faultg", I_BASE, CTRL, 0, { 0, 0, 0 } }, - { 0x1a000000, "faulte", I_BASE, CTRL, 0, { 0, 0, 0 } }, - { 0x1b000000, "faultge", I_BASE, CTRL, 0, { 0, 0, 0 } }, - { 0x1c000000, "faultl", I_BASE, CTRL, 0, { 0, 0, 0 } }, - { 0x1d000000, "faultne", I_BASE, CTRL, 0, { 0, 0, 0 } }, - { 0x1e000000, "faultle", I_BASE, CTRL, 0, { 0, 0, 0 } }, - { 0x1f000000, "faulto", I_BASE, CTRL, 0, { 0, 0, 0 } }, - /* faultt syn for faulto */ - { 0x1f000000, "faultt", I_BASE, CTRL, 0, { 0, 0, 0 } }, - - { 0x01000000, "syscall", I_CASIM,CTRL, 0, { 0, 0, 0 } }, - - /* If a COBR (or COJ) has 3 operands, the last one is always a - * displacement and does not appear explicitly in the table. - */ - - { 0x20000000, "testno", I_BASE, COBR, 1, { R, 0, 0 } }, - { 0x21000000, "testg", I_BASE, COBR, 1, { R, 0, 0 } }, - { 0x22000000, "teste", I_BASE, COBR, 1, { R, 0, 0 } }, - { 0x23000000, "testge", I_BASE, COBR, 1, { R, 0, 0 } }, - { 0x24000000, "testl", I_BASE, COBR, 1, { R, 0, 0 } }, - { 0x25000000, "testne", I_BASE, COBR, 1, { R, 0, 0 } }, - { 0x26000000, "testle", I_BASE, COBR, 1, { R, 0, 0 } }, - { 0x27000000, "testo", I_BASE, COBR, 1, { R, 0, 0 } }, - { 0x30000000, "bbc", I_BASE, COBR, 3, { RL, RS, 0 } }, - { 0x31000000, "cmpobg", I_BASE, COBR, 3, { RL, RS, 0 } }, - { 0x32000000, "cmpobe", I_BASE, COBR, 3, { RL, RS, 0 } }, - { 0x33000000, "cmpobge", I_BASE, COBR, 3, { RL, RS, 0 } }, - { 0x34000000, "cmpobl", I_BASE, COBR, 3, { RL, RS, 0 } }, - { 0x35000000, "cmpobne", I_BASE, COBR, 3, { RL, RS, 0 } }, - { 0x36000000, "cmpoble", I_BASE, COBR, 3, { RL, RS, 0 } }, - { 0x37000000, "bbs", I_BASE, COBR, 3, { RL, RS, 0 } }, - { 0x38000000, "cmpibno", I_BASE, COBR, 3, { RL, RS, 0 } }, - { 0x39000000, "cmpibg", I_BASE, COBR, 3, { RL, RS, 0 } }, - { 0x3a000000, "cmpibe", I_BASE, COBR, 3, { RL, RS, 0 } }, - { 0x3b000000, "cmpibge", I_BASE, COBR, 3, { RL, RS, 0 } }, - { 0x3c000000, "cmpibl", I_BASE, COBR, 3, { RL, RS, 0 } }, - { 0x3d000000, "cmpibne", I_BASE, COBR, 3, { RL, RS, 0 } }, - { 0x3e000000, "cmpible", I_BASE, COBR, 3, { RL, RS, 0 } }, - { 0x3f000000, "cmpibo", I_BASE, COBR, 3, { RL, RS, 0 } }, - { 0x31000000, "cmpojg", I_BASE, COJ, 3, { RL, RS, 0 } }, - { 0x32000000, "cmpoje", I_BASE, COJ, 3, { RL, RS, 0 } }, - { 0x33000000, "cmpojge", I_BASE, COJ, 3, { RL, RS, 0 } }, - { 0x34000000, "cmpojl", I_BASE, COJ, 3, { RL, RS, 0 } }, - { 0x35000000, "cmpojne", I_BASE, COJ, 3, { RL, RS, 0 } }, - { 0x36000000, "cmpojle", I_BASE, COJ, 3, { RL, RS, 0 } }, - { 0x38000000, "cmpijno", I_BASE, COJ, 3, { RL, RS, 0 } }, - { 0x39000000, "cmpijg", I_BASE, COJ, 3, { RL, RS, 0 } }, - { 0x3a000000, "cmpije", I_BASE, COJ, 3, { RL, RS, 0 } }, - { 0x3b000000, "cmpijge", I_BASE, COJ, 3, { RL, RS, 0 } }, - { 0x3c000000, "cmpijl", I_BASE, COJ, 3, { RL, RS, 0 } }, - { 0x3d000000, "cmpijne", I_BASE, COJ, 3, { RL, RS, 0 } }, - { 0x3e000000, "cmpijle", I_BASE, COJ, 3, { RL, RS, 0 } }, - { 0x3f000000, "cmpijo", I_BASE, COJ, 3, { RL, RS, 0 } }, - - { 0x80000000, "ldob", I_BASE, MEM1, 2, { M, R, 0 } }, - { 0x82000000, "stob", I_BASE, MEM1, 2, { R, M, 0 } }, - { 0x84000000, "bx", I_BASE, MEM1, 1, { M, 0, 0 } }, - { 0x85000000, "balx", I_BASE, MEM1, 2, { M, R, 0 } }, - { 0x86000000, "callx", I_BASE, MEM1, 1, { M, 0, 0 } }, - { 0x88000000, "ldos", I_BASE, MEM2, 2, { M, R, 0 } }, - { 0x8a000000, "stos", I_BASE, MEM2, 2, { R, M, 0 } }, - { 0x8c000000, "lda", I_BASE, MEM1, 2, { M, R, 0 } }, - { 0x90000000, "ld", I_BASE, MEM4, 2, { M, R, 0 } }, - { 0x92000000, "st", I_BASE, MEM4, 2, { R, M, 0 } }, - { 0x98000000, "ldl", I_BASE, MEM8, 2, { M, R2, 0 } }, - { 0x9a000000, "stl", I_BASE, MEM8, 2, { R2, M, 0 } }, - { 0xa0000000, "ldt", I_BASE, MEM12, 2, { M, R4, 0 } }, - { 0xa2000000, "stt", I_BASE, MEM12, 2, { R4, M, 0 } }, - { 0xb0000000, "ldq", I_BASE, MEM16, 2, { M, R4, 0 } }, - { 0xb2000000, "stq", I_BASE, MEM16, 2, { R4, M, 0 } }, - { 0xc0000000, "ldib", I_BASE, MEM1, 2, { M, R, 0 } }, - { 0xc2000000, "stib", I_BASE, MEM1, 2, { R, M, 0 } }, - { 0xc8000000, "ldis", I_BASE, MEM2, 2, { M, R, 0 } }, - { 0xca000000, "stis", I_BASE, MEM2, 2, { R, M, 0 } }, - - { R_3(0x580), "notbit", I_BASE, REG, 3, { RSL,RSL,RS } }, - { R_3(0x581), "and", I_BASE, REG, 3, { RSL,RSL,RS } }, - { R_3(0x582), "andnot", I_BASE, REG, 3, { RSL,RSL,RS } }, - { R_3(0x583), "setbit", I_BASE, REG, 3, { RSL,RSL,RS } }, - { R_3(0x584), "notand", I_BASE, REG, 3, { RSL,RSL,RS } }, - { R_3(0x586), "xor", I_BASE, REG, 3, { RSL,RSL,RS } }, - { R_3(0x587), "or", I_BASE, REG, 3, { RSL,RSL,RS } }, - { R_3(0x588), "nor", I_BASE, REG, 3, { RSL,RSL,RS } }, - { R_3(0x589), "xnor", I_BASE, REG, 3, { RSL,RSL,RS } }, - { R_2D(0x58a), "not", I_BASE, REG, 2, { RSL,RS, 0 } }, - { R_3(0x58b), "ornot", I_BASE, REG, 3, { RSL,RSL,RS } }, - { R_3(0x58c), "clrbit", I_BASE, REG, 3, { RSL,RSL,RS } }, - { R_3(0x58d), "notor", I_BASE, REG, 3, { RSL,RSL,RS } }, - { R_3(0x58e), "nand", I_BASE, REG, 3, { RSL,RSL,RS } }, - { R_3(0x58f), "alterbit", I_BASE, REG, 3, { RSL,RSL,RS } }, - { R_3(0x590), "addo", I_BASE, REG, 3, { RSL,RSL,RS } }, - { R_3(0x591), "addi", I_BASE, REG, 3, { RSL,RSL,RS } }, - { R_3(0x592), "subo", I_BASE, REG, 3, { RSL,RSL,RS } }, - { R_3(0x593), "subi", I_BASE, REG, 3, { RSL,RSL,RS } }, - { R_3(0x598), "shro", I_BASE, REG, 3, { RSL,RSL,RS } }, - { R_3(0x59a), "shrdi", I_BASE, REG, 3, { RSL,RSL,RS } }, - { R_3(0x59b), "shri", I_BASE, REG, 3, { RSL,RSL,RS } }, - { R_3(0x59c), "shlo", I_BASE, REG, 3, { RSL,RSL,RS } }, - { R_3(0x59d), "rotate", I_BASE, REG, 3, { RSL,RSL,RS } }, - { R_3(0x59e), "shli", I_BASE, REG, 3, { RSL,RSL,RS } }, - { R_2(0x5a0), "cmpo", I_BASE, REG, 2, { RSL,RSL, 0 } }, - { R_2(0x5a1), "cmpi", I_BASE, REG, 2, { RSL,RSL, 0 } }, - { R_2(0x5a2), "concmpo", I_BASE, REG, 2, { RSL,RSL, 0 } }, - { R_2(0x5a3), "concmpi", I_BASE, REG, 2, { RSL,RSL, 0 } }, - { R_3(0x5a4), "cmpinco", I_BASE, REG, 3, { RSL,RSL,RS } }, - { R_3(0x5a5), "cmpinci", I_BASE, REG, 3, { RSL,RSL,RS } }, - { R_3(0x5a6), "cmpdeco", I_BASE, REG, 3, { RSL,RSL,RS } }, - { R_3(0x5a7), "cmpdeci", I_BASE, REG, 3, { RSL,RSL,RS } }, - { R_2(0x5ac), "scanbyte", I_BASE, REG, 2, { RSL,RSL, 0 } }, - { R_2(0x5ae), "chkbit", I_BASE, REG, 2, { RSL,RSL, 0 } }, - { R_3(0x5b0), "addc", I_BASE, REG, 3, { RSL,RSL,RS } }, - { R_3(0x5b2), "subc", I_BASE, REG, 3, { RSL,RSL,RS } }, - { R_2D(0x5cc), "mov", I_BASE, REG, 2, { RSL,RS, 0 } }, - { R_2D(0x5dc), "movl", I_BASE, REG, 2, { RL2,R2, 0 } }, - { R_2D(0x5ec), "movt", I_BASE, REG, 2, { RL4,R4, 0 } }, - { R_2D(0x5fc), "movq", I_BASE, REG, 2, { RL4,R4, 0 } }, - { R_3(0x610), "atmod", I_BASE, REG, 3, { RS, RSL,R } }, - { R_3(0x612), "atadd", I_BASE, REG, 3, { RS, RSL,RS } }, - { R_2D(0x640), "spanbit", I_BASE, REG, 2, { RSL,RS, 0 } }, - { R_2D(0x641), "scanbit", I_BASE, REG, 2, { RSL,RS, 0 } }, - { R_3(0x645), "modac", I_BASE, REG, 3, { RSL,RSL,RS } }, - { R_3(0x650), "modify", I_BASE, REG, 3, { RSL,RSL,R } }, - { R_3(0x651), "extract", I_BASE, REG, 3, { RSL,RSL,R } }, - { R_3(0x654), "modtc", I_BASE, REG, 3, { RSL,RSL,RS } }, - { R_3(0x655), "modpc", I_BASE, REG, 3, { RSL,RSL,R } }, - { R_1(0x660), "calls", I_BASE, REG, 1, { RSL, 0, 0 } }, - { R_0(0x66b), "mark", I_BASE, REG, 0, { 0, 0, 0 } }, - { R_0(0x66c), "fmark", I_BASE, REG, 0, { 0, 0, 0 } }, - { R_0(0x66d), "flushreg", I_BASE, REG, 0, { 0, 0, 0 } }, - { R_0(0x66f), "syncf", I_BASE, REG, 0, { 0, 0, 0 } }, - { R_3(0x670), "emul", I_BASE, REG, 3, { RSL,RSL,R2 } }, - { R_3(0x671), "ediv", I_BASE, REG, 3, { RSL,RL2,RS } }, - { R_2D(0x672), "cvtadr", I_CASIM,REG, 2, { RL, R2, 0 } }, - { R_3(0x701), "mulo", I_BASE, REG, 3, { RSL,RSL,RS } }, - { R_3(0x708), "remo", I_BASE, REG, 3, { RSL,RSL,RS } }, - { R_3(0x70b), "divo", I_BASE, REG, 3, { RSL,RSL,RS } }, - { R_3(0x741), "muli", I_BASE, REG, 3, { RSL,RSL,RS } }, - { R_3(0x748), "remi", I_BASE, REG, 3, { RSL,RSL,RS } }, - { R_3(0x749), "modi", I_BASE, REG, 3, { RSL,RSL,RS } }, - { R_3(0x74b), "divi", I_BASE, REG, 3, { RSL,RSL,RS } }, - - /* Floating-point instructions */ - - { R_2D(0x674), "cvtir", I_FP, REG, 2, { RL, F, 0 } }, - { R_2D(0x675), "cvtilr", I_FP, REG, 2, { RL, F, 0 } }, - { R_3(0x676), "scalerl", I_FP, REG, 3, { RL, FL2,F2 } }, - { R_3(0x677), "scaler", I_FP, REG, 3, { RL, FL, F } }, - { R_3(0x680), "atanr", I_FP, REG, 3, { FL, FL, F } }, - { R_3(0x681), "logepr", I_FP, REG, 3, { FL, FL, F } }, - { R_3(0x682), "logr", I_FP, REG, 3, { FL, FL, F } }, - { R_3(0x683), "remr", I_FP, REG, 3, { FL, FL, F } }, - { R_2(0x684), "cmpor", I_FP, REG, 2, { FL, FL, 0 } }, - { R_2(0x685), "cmpr", I_FP, REG, 2, { FL, FL, 0 } }, - { R_2D(0x688), "sqrtr", I_FP, REG, 2, { FL, F, 0 } }, - { R_2D(0x689), "expr", I_FP, REG, 2, { FL, F, 0 } }, - { R_2D(0x68a), "logbnr", I_FP, REG, 2, { FL, F, 0 } }, - { R_2D(0x68b), "roundr", I_FP, REG, 2, { FL, F, 0 } }, - { R_2D(0x68c), "sinr", I_FP, REG, 2, { FL, F, 0 } }, - { R_2D(0x68d), "cosr", I_FP, REG, 2, { FL, F, 0 } }, - { R_2D(0x68e), "tanr", I_FP, REG, 2, { FL, F, 0 } }, - { R_1(0x68f), "classr", I_FP, REG, 1, { FL, 0, 0 } }, - { R_3(0x690), "atanrl", I_FP, REG, 3, { FL2,FL2,F2 } }, - { R_3(0x691), "logeprl", I_FP, REG, 3, { FL2,FL2,F2 } }, - { R_3(0x692), "logrl", I_FP, REG, 3, { FL2,FL2,F2 } }, - { R_3(0x693), "remrl", I_FP, REG, 3, { FL2,FL2,F2 } }, - { R_2(0x694), "cmporl", I_FP, REG, 2, { FL2,FL2, 0 } }, - { R_2(0x695), "cmprl", I_FP, REG, 2, { FL2,FL2, 0 } }, - { R_2D(0x698), "sqrtrl", I_FP, REG, 2, { FL2,F2, 0 } }, - { R_2D(0x699), "exprl", I_FP, REG, 2, { FL2,F2, 0 } }, - { R_2D(0x69a), "logbnrl", I_FP, REG, 2, { FL2,F2, 0 } }, - { R_2D(0x69b), "roundrl", I_FP, REG, 2, { FL2,F2, 0 } }, - { R_2D(0x69c), "sinrl", I_FP, REG, 2, { FL2,F2, 0 } }, - { R_2D(0x69d), "cosrl", I_FP, REG, 2, { FL2,F2, 0 } }, - { R_2D(0x69e), "tanrl", I_FP, REG, 2, { FL2,F2, 0 } }, - { R_1(0x69f), "classrl", I_FP, REG, 1, { FL2, 0, 0 } }, - { R_2D(0x6c0), "cvtri", I_FP, REG, 2, { FL, R, 0 } }, - { R_2D(0x6c1), "cvtril", I_FP, REG, 2, { FL, R2, 0 } }, - { R_2D(0x6c2), "cvtzri", I_FP, REG, 2, { FL, R, 0 } }, - { R_2D(0x6c3), "cvtzril", I_FP, REG, 2, { FL, R2, 0 } }, - { R_2D(0x6c9), "movr", I_FP, REG, 2, { FL, F, 0 } }, - { R_2D(0x6d9), "movrl", I_FP, REG, 2, { FL2,F2, 0 } }, - { R_2D(0x6e1), "movre", I_FP, REG, 2, { FL4,F4, 0 } }, - { R_3(0x6e2), "cpysre", I_FP, REG, 3, { FL4,FL4,F4 } }, - { R_3(0x6e3), "cpyrsre", I_FP, REG, 3, { FL4,FL4,F4 } }, - { R_3(0x78b), "divr", I_FP, REG, 3, { FL, FL, F } }, - { R_3(0x78c), "mulr", I_FP, REG, 3, { FL, FL, F } }, - { R_3(0x78d), "subr", I_FP, REG, 3, { FL, FL, F } }, - { R_3(0x78f), "addr", I_FP, REG, 3, { FL, FL, F } }, - { R_3(0x79b), "divrl", I_FP, REG, 3, { FL2,FL2,F2 } }, - { R_3(0x79c), "mulrl", I_FP, REG, 3, { FL2,FL2,F2 } }, - { R_3(0x79d), "subrl", I_FP, REG, 3, { FL2,FL2,F2 } }, - { R_3(0x79f), "addrl", I_FP, REG, 3, { FL2,FL2,F2 } }, - - /* These are the floating point branch instructions. Each actually - * generates 2 branch instructions: the first a CTRL instruction with - * the indicated opcode, and the second a 'bno'. - */ - - { 0x12000000, "brue", I_FP, FBRA, 1, { 0, 0, 0 } }, - { 0x11000000, "brug", I_FP, FBRA, 1, { 0, 0, 0 } }, - { 0x13000000, "bruge", I_FP, FBRA, 1, { 0, 0, 0 } }, - { 0x14000000, "brul", I_FP, FBRA, 1, { 0, 0, 0 } }, - { 0x16000000, "brule", I_FP, FBRA, 1, { 0, 0, 0 } }, - { 0x15000000, "brulg", I_FP, FBRA, 1, { 0, 0, 0 } }, - - - /* Decimal instructions */ - - { R_3(0x642), "daddc", I_DEC, REG, 3, { RSL,RSL,RS } }, - { R_3(0x643), "dsubc", I_DEC, REG, 3, { RSL,RSL,RS } }, - { R_2D(0x644), "dmovt", I_DEC, REG, 2, { RSL,RS, 0 } }, - - - /* KX extensions */ - - { R_2(0x600), "synmov", I_KX, REG, 2, { R, R, 0 } }, - { R_2(0x601), "synmovl", I_KX, REG, 2, { R, R, 0 } }, - { R_2(0x602), "synmovq", I_KX, REG, 2, { R, R, 0 } }, - { R_2D(0x615), "synld", I_KX, REG, 2, { R, R, 0 } }, - - - /* MC extensions */ - - { R_3(0x603), "cmpstr", I_MIL, REG, 3, { R, R, RL } }, - { R_3(0x604), "movqstr", I_MIL, REG, 3, { R, R, RL } }, - { R_3(0x605), "movstr", I_MIL, REG, 3, { R, R, RL } }, - { R_2D(0x613), "inspacc", I_MIL, REG, 2, { R, R, 0 } }, - { R_2D(0x614), "ldphy", I_MIL, REG, 2, { R, R, 0 } }, - { R_3(0x617), "fill", I_MIL, REG, 3, { R, RL, RL } }, - { R_2D(0x646), "condrec", I_MIL, REG, 2, { R, R, 0 } }, - { R_2D(0x656), "receive", I_MIL, REG, 2, { R, R, 0 } }, - { R_3(0x662), "send", I_MIL, REG, 3, { R, RL, R } }, - { R_1(0x663), "sendserv", I_MIL, REG, 1, { R, 0, 0 } }, - { R_1(0x664), "resumprcs", I_MIL, REG, 1, { R, 0, 0 } }, - { R_1(0x665), "schedprcs", I_MIL, REG, 1, { R, 0, 0 } }, - { R_0(0x666), "saveprcs", I_MIL, REG, 0, { 0, 0, 0 } }, - { R_1(0x668), "condwait", I_MIL, REG, 1, { R, 0, 0 } }, - { R_1(0x669), "wait", I_MIL, REG, 1, { R, 0, 0 } }, - { R_1(0x66a), "signal", I_MIL, REG, 1, { R, 0, 0 } }, - { R_1D(0x673), "ldtime", I_MIL, REG, 1, { R2, 0, 0 } }, - - - /* CX extensions */ - - { R_3(0x5d8), "eshro", I_CX2, REG, 3, { RSL,RSL,RS } }, - { R_3(0x630), "sdma", I_CX, REG, 3, { RSL,RSL,RL } }, - { R_3(0x631), "udma", I_CX, REG, 0, { 0, 0, 0 } }, - { R_3(0x659), "sysctl", I_CX2, REG, 3, { RSL,RSL,RL } }, - - - /* Jx extensions. */ - { R_3(0x780), "addono", I_JX, REG, 3, { RSL,RSL,RS } }, - { R_3(0x790), "addog", I_JX, REG, 3, { RSL,RSL,RS } }, - { R_3(0x7a0), "addoe", I_JX, REG, 3, { RSL,RSL,RS } }, - { R_3(0x7b0), "addoge", I_JX, REG, 3, { RSL,RSL,RS } }, - { R_3(0x7c0), "addol", I_JX, REG, 3, { RSL,RSL,RS } }, - { R_3(0x7d0), "addone", I_JX, REG, 3, { RSL,RSL,RS } }, - { R_3(0x7e0), "addole", I_JX, REG, 3, { RSL,RSL,RS } }, - { R_3(0x7f0), "addoo", I_JX, REG, 3, { RSL,RSL,RS } }, - { R_3(0x781), "addino", I_JX, REG, 3, { RSL,RSL,RS } }, - { R_3(0x791), "addig", I_JX, REG, 3, { RSL,RSL,RS } }, - { R_3(0x7a1), "addie", I_JX, REG, 3, { RSL,RSL,RS } }, - { R_3(0x7b1), "addige", I_JX, REG, 3, { RSL,RSL,RS } }, - { R_3(0x7c1), "addil", I_JX, REG, 3, { RSL,RSL,RS } }, - { R_3(0x7d1), "addine", I_JX, REG, 3, { RSL,RSL,RS } }, - { R_3(0x7e1), "addile", I_JX, REG, 3, { RSL,RSL,RS } }, - { R_3(0x7f1), "addio", I_JX, REG, 3, { RSL,RSL,RS } }, - - { R_2D(0x5ad), "bswap", I_JX, REG, 2, { RSL, RS, 0 } }, - - { R_2(0x594), "cmpob", I_JX, REG, 2, { RSL,RSL, 0 } }, - { R_2(0x595), "cmpib", I_JX, REG, 2, { RSL,RSL, 0 } }, - { R_2(0x596), "cmpos", I_JX, REG, 2, { RSL,RSL, 0 } }, - { R_2(0x597), "cmpis", I_JX, REG, 2, { RSL,RSL, 0 } }, - - { R_3(0x784), "selno", I_JX, REG, 3, { RSL,RSL,RS } }, - { R_3(0x794), "selg", I_JX, REG, 3, { RSL,RSL,RS } }, - { R_3(0x7a4), "sele", I_JX, REG, 3, { RSL,RSL,RS } }, - { R_3(0x7b4), "selge", I_JX, REG, 3, { RSL,RSL,RS } }, - { R_3(0x7c4), "sell", I_JX, REG, 3, { RSL,RSL,RS } }, - { R_3(0x7d4), "selne", I_JX, REG, 3, { RSL,RSL,RS } }, - { R_3(0x7e4), "selle", I_JX, REG, 3, { RSL,RSL,RS } }, - { R_3(0x7f4), "selo", I_JX, REG, 3, { RSL,RSL,RS } }, - - { R_3(0x782), "subono", I_JX, REG, 3, { RSL,RSL,RS } }, - { R_3(0x792), "subog", I_JX, REG, 3, { RSL,RSL,RS } }, - { R_3(0x7a2), "suboe", I_JX, REG, 3, { RSL,RSL,RS } }, - { R_3(0x7b2), "suboge", I_JX, REG, 3, { RSL,RSL,RS } }, - { R_3(0x7c2), "subol", I_JX, REG, 3, { RSL,RSL,RS } }, - { R_3(0x7d2), "subone", I_JX, REG, 3, { RSL,RSL,RS } }, - { R_3(0x7e2), "subole", I_JX, REG, 3, { RSL,RSL,RS } }, - { R_3(0x7f2), "suboo", I_JX, REG, 3, { RSL,RSL,RS } }, - { R_3(0x783), "subino", I_JX, REG, 3, { RSL,RSL,RS } }, - { R_3(0x793), "subig", I_JX, REG, 3, { RSL,RSL,RS } }, - { R_3(0x7a3), "subie", I_JX, REG, 3, { RSL,RSL,RS } }, - { R_3(0x7b3), "subige", I_JX, REG, 3, { RSL,RSL,RS } }, - { R_3(0x7c3), "subil", I_JX, REG, 3, { RSL,RSL,RS } }, - { R_3(0x7d3), "subine", I_JX, REG, 3, { RSL,RSL,RS } }, - { R_3(0x7e3), "subile", I_JX, REG, 3, { RSL,RSL,RS } }, - { R_3(0x7f3), "subio", I_JX, REG, 3, { RSL,RSL,RS } }, - - { R_3(0x65c), "dcctl", I_JX, REG, 3, { RSL,RSL,RL } }, - { R_3(0x65b), "icctl", I_JX, REG, 3, { RSL,RSL,RS } }, - { R_2D(0x658), "intctl", I_JX, REG, 2, { RSL, RS, 0 } }, - { R_0(0x5b4), "intdis", I_JX, REG, 0, { 0, 0, 0 } }, - { R_0(0x5b5), "inten", I_JX, REG, 0, { 0, 0, 0 } }, - { R_0(0x65d), "halt", I_JX, REG, 0, { 0, 0, 0 } }, - - /* Hx extensions. */ - { 0xac000000, "dcinva", I_HX, MEM1, 1, { M, 0, 0 } }, - - /* END OF TABLE */ - - { 0, NULL, 0, 0, 0, { 0, 0, 0 } } -}; - - /* end of i960-opcode.h */ diff --git a/contrib/gdb/include/opcode/m68k.h b/contrib/gdb/include/opcode/m68k.h deleted file mode 100644 index e0b371c92bb78..0000000000000 --- a/contrib/gdb/include/opcode/m68k.h +++ /dev/null @@ -1,297 +0,0 @@ -/* Opcode table header for m680[01234]0/m6888[12]/m68851. - Copyright 1989, 1991, 1992, 1993, 1994, 1995 Free Software Foundation. - -This file is part of GDB, GAS, and the GNU binutils. - -GDB, GAS, and the GNU binutils are free software; you can redistribute -them and/or modify them 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. - -GDB, GAS, and the GNU binutils are distributed in the hope that they -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 file; see the file COPYING. If not, write to the Free -Software Foundation, 59 Temple Place - Suite 330, Boston, MA -02111-1307, USA. */ - -/* These are used as bit flags for the arch field in the m68k_opcode - structure. */ -#define _m68k_undef 0 -#define m68000 0x001 -#define m68008 m68000 /* synonym for -m68000. otherwise unused. */ -#define m68010 0x002 -#define m68020 0x004 -#define m68030 0x008 -#define m68ec030 m68030 /* similar enough to -m68030 to ignore differences; - gas will deal with the few differences. */ -#define m68040 0x010 -/* there is no 68050 */ -#define m68060 0x020 -#define m68881 0x040 -#define m68882 m68881 /* synonym for -m68881. otherwise unused. */ -#define m68851 0x080 -#define cpu32 0x100 /* e.g., 68332 */ - - /* handy aliases */ -#define m68040up (m68040 | m68060) -#define m68030up (m68030 | m68040up) -#define m68020up (m68020 | m68030up) -#define m68010up (m68010 | cpu32 | m68020up) -#define m68000up (m68000 | m68010up) - -#define mfloat (m68881 | m68882 | m68040 | m68060) -#define mmmu (m68851 | m68030 | m68040 | m68060) - -/* The structure used to hold information for an opcode. */ - -struct m68k_opcode -{ - /* The opcode name. */ - const char *name; - /* The opcode itself. */ - unsigned long opcode; - /* The mask used by the disassembler. */ - unsigned long match; - /* The arguments. */ - const char *args; - /* The architectures which support this opcode. */ - unsigned int arch; -}; - -/* The structure used to hold information for an opcode alias. */ - -struct m68k_opcode_alias -{ - /* The alias name. */ - const char *alias; - /* The instruction for which this is an alias. */ - const char *primary; -}; - -/* We store four bytes of opcode for all opcodes because that is the - most any of them need. The actual length of an instruction is - always at least 2 bytes, and is as much longer as necessary to hold - the operands it has. - - The match field is a mask saying which bits must match particular - opcode in order for an instruction to be an instance of that - opcode. - - The args field is a string containing two characters for each - operand of the instruction. The first specifies the kind of - operand; the second, the place it is stored. */ - -/* Kinds of operands: - Characters used: AaBCcDdFfIJkLlMOQRrSsTtUVWXYZ0123|*~%;@!&$?/#^+- - - D data register only. Stored as 3 bits. - A address register only. Stored as 3 bits. - a address register indirect only. Stored as 3 bits. - R either kind of register. Stored as 4 bits. - r either kind of register indirect only. Stored as 4 bits. - At the moment, used only for cas2 instruction. - F floating point coprocessor register only. Stored as 3 bits. - O an offset (or width): immediate data 0-31 or data register. - Stored as 6 bits in special format for BF... insns. - + autoincrement only. Stored as 3 bits (number of the address register). - - autodecrement only. Stored as 3 bits (number of the address register). - Q quick immediate data. Stored as 3 bits. - This matches an immediate operand only when value is in range 1 .. 8. - M moveq immediate data. Stored as 8 bits. - This matches an immediate operand only when value is in range -128..127 - T trap vector immediate data. Stored as 4 bits. - - k K-factor for fmove.p instruction. Stored as a 7-bit constant or - a three bit register offset, depending on the field type. - - # immediate data. Stored in special places (b, w or l) - which say how many bits to store. - ^ immediate data for floating point instructions. Special places - are offset by 2 bytes from '#'... - B pc-relative address, converted to an offset - that is treated as immediate data. - d displacement and register. Stores the register as 3 bits - and stores the displacement in the entire second word. - - C the CCR. No need to store it; this is just for filtering validity. - S the SR. No need to store, just as with CCR. - U the USP. No need to store, just as with CCR. - - I Coprocessor ID. Not printed if 1. The Coprocessor ID is always - extracted from the 'd' field of word one, which means that an extended - coprocessor opcode can be skipped using the 'i' place, if needed. - - s System Control register for the floating point coprocessor. - - J Misc register for movec instruction, stored in 'j' format. - Possible values: - 0x000 SFC Source Function Code reg [60, 40, 30, 20, 10] - 0x001 DFC Data Function Code reg [60, 40, 30, 20, 10] - 0x002 CACR Cache Control Register [60, 40, 30, 20] - 0x003 TC MMU Translation Control [60, 40] - 0x004 ITT0 Instruction Transparent - Translation reg 0 [60, 40] - 0x005 ITT1 Instruction Transparent - Translation reg 1 [60, 40] - 0x006 DTT0 Data Transparent - Translation reg 0 [60, 40] - 0x007 DTT1 Data Transparent - Translation reg 1 [60, 40] - 0x008 BUSCR Bus Control Register [60] - 0x800 USP User Stack Pointer [60, 40, 30, 20, 10] - 0x801 VBR Vector Base reg [60, 40, 30, 20, 10] - 0x802 CAAR Cache Address Register [ 30, 20] - 0x803 MSP Master Stack Pointer [ 40, 30, 20] - 0x804 ISP Interrupt Stack Pointer [ 40, 30, 20] - 0x805 MMUSR MMU Status reg [ 40] - 0x806 URP User Root Pointer [60, 40] - 0x807 SRP Supervisor Root Pointer [60, 40] - 0x808 PCR Processor Configuration reg [60] - - L Register list of the type d0-d7/a0-a7 etc. - (New! Improved! Can also hold fp0-fp7, as well!) - The assembler tries to see if the registers match the insn by - looking at where the insn wants them stored. - - l Register list like L, but with all the bits reversed. - Used for going the other way. . . - - c cache identifier which may be "nc" for no cache, "ic" - for instruction cache, "dc" for data cache, or "bc" - for both caches. Used in cinv and cpush. Always - stored in position "d". - - The remainder are all stored as 6 bits using an address mode and a - register number; they differ in which addressing modes they match. - - * all (modes 0-6,7.*) - ~ alterable memory (modes 2-6,7.0,7.1) - (not 0,1,7.~) - % alterable (modes 0-6,7.0,7.1)(not 7.~) - ; data (modes 0,2-6,7.*)(not 1) - @ data, but not immediate (modes 0,2-6,7.? ? ?) - (not 1,7.?) - This may really be ;, - the 68020 book says it is - ! control (modes 2,5,6,7.*-) - (not 0,1,3,4,7.4) - & alterable control (modes 2,5,6,7.0,7.1) - (not 0,1,7.? ? ?) - $ alterable data (modes 0,2-6,7.0,7.1) - (not 1,7.~) - ? alterable control, or data register (modes 0,2,5,6,7.0,7.1) - (not 1,3,4,7.~) - / control, or data register (modes 0,2,5,6,7.0,7.1,7.2,7.3) - (not 1,3,4,7.4) - ` control, plus pre-dec, not simple indir. (modes 4,5,6,7.*-) - (not 0,1,2,3,7.4) */ - -/* For the 68851: */ -/* - I didn't use much imagination in choosing the - following codes, so many of them aren't very - mnemonic. -rab - - 0 32 bit pmmu register - Possible values: - 000 TC Translation Control Register (68030, 68851) - - 1 16 bit pmmu register - 111 AC Access Control (68851) - - 2 8 bit pmmu register - 100 CAL Current Access Level (68851) - 101 VAL Validate Access Level (68851) - 110 SCC Stack Change Control (68851) - - 3 68030-only pmmu registers (32 bit) - 010 TT0 Transparent Translation reg 0 - (aka Access Control reg 0 -- AC0 -- on 68ec030) - 011 TT1 Transparent Translation reg 1 - (aka Access Control reg 1 -- AC1 -- on 68ec030) - - W wide pmmu registers - Possible values: - 001 DRP Dma Root Pointer (68851) - 010 SRP Supervisor Root Pointer (68030, 68851) - 011 CRP Cpu Root Pointer (68030, 68851) - - f function code register (68030, 68851) - 0 SFC - 1 DFC - - V VAL register only (68851) - - X BADx, BACx (16 bit) - 100 BAD Breakpoint Acknowledge Data (68851) - 101 BAC Breakpoint Acknowledge Control (68851) - - Y PSR (68851) (MMUSR on 68030) (ACUSR on 68ec030) - Z PCSR (68851) - - | memory (modes 2-6, 7.*) - - t address test level (68030 only) - Stored as 3 bits, range 0-7. - Also used for breakpoint instruction now. - -*/ - -/* Places to put an operand, for non-general operands: - s source, low bits of first word. - d dest, shifted 9 in first word - 1 second word, shifted 12 - 2 second word, shifted 6 - 3 second word, shifted 0 - 4 third word, shifted 12 - 5 third word, shifted 6 - 6 third word, shifted 0 - 7 second word, shifted 7 - 8 second word, shifted 10 - 9 second word, shifted 5 - D store in both place 1 and place 3; for divul and divsl. - B first word, low byte, for branch displacements - W second word (entire), for branch displacements - L second and third words (entire), for branch displacements - (also overloaded for move16) - b second word, low byte - w second word (entire) [variable word/long branch offset for dbra] - W second word (entire) (must be signed 16 bit value) - l second and third word (entire) - g variable branch offset for bra and similar instructions. - The place to store depends on the magnitude of offset. - t store in both place 7 and place 8; for floating point operations - c branch offset for cpBcc operations. - The place to store is word two if bit six of word one is zero, - and words two and three if bit six of word one is one. - i Increment by two, to skip over coprocessor extended operands. Only - works with the 'I' format. - k Dynamic K-factor field. Bits 6-4 of word 2, used as a register number. - Also used for dynamic fmovem instruction. - C floating point coprocessor constant - 7 bits. Also used for static - K-factors... - j Movec register #, stored in 12 low bits of second word. - - Places to put operand, for general operands: - d destination, shifted 6 bits in first word - b source, at low bit of first word, and immediate uses one byte - w source, at low bit of first word, and immediate uses two bytes - l source, at low bit of first word, and immediate uses four bytes - s source, at low bit of first word. - Used sometimes in contexts where immediate is not allowed anyway. - f single precision float, low bit of 1st word, immediate uses 4 bytes - F double precision float, low bit of 1st word, immediate uses 8 bytes - x extended precision float, low bit of 1st word, immediate uses 12 bytes - p packed float, low bit of 1st word, immediate uses 12 bytes -*/ - -extern const struct m68k_opcode m68k_opcodes[]; -extern const struct m68k_opcode_alias m68k_opcode_aliases[]; - -extern const int m68k_numopcodes, m68k_numaliases; - -/* end of m68k-opcode.h */ diff --git a/contrib/gdb/include/opcode/m88k.h b/contrib/gdb/include/opcode/m88k.h deleted file mode 100644 index a17fa0361dac9..0000000000000 --- a/contrib/gdb/include/opcode/m88k.h +++ /dev/null @@ -1,923 +0,0 @@ -/* Table of opcodes for the motorola 88k family. - Copyright 1989, 1990, 1991, 1992, 1993 Free Software Foundation, Inc. - -This file is part of GDB and GAS. - -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 2 of the License, 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ - -/* - * Disassembler Instruction Table - * - * The first field of the table is the opcode field. If an opcode - * is specified which has any non-opcode bits on, a system error - * will occur when the system attempts the install it into the - * instruction table. The second parameter is a pointer to the - * instruction mnemonic. Each operand is specified by offset, width, - * and type. The offset is the bit number of the least significant - * bit of the operand with bit 0 being the least significant bit of - * the instruction. The width is the number of bits used to specify - * the operand. The type specifies the output format to be used for - * the operand. The valid formats are: register, register indirect, - * hex constant, and bit field specification. The last field is a - * pointer to the next instruction in the linked list. These pointers - * are initialized by init_disasm(). - * - * Structure Format - * - * struct INSTAB { - * UPINT opcode; - * char *mnemonic; - * struct OPSPEC op1,op2,op3; - * struct SIM_FLAGS flgs; - * struct INSTAB *next; - * } - * - * struct OPSPEC { - * UPINT offset:5; - * UPINT width:6; - * UPINT type:5; - * } - * - * Revision History - * - * Revision 1.0 11/08/85 Creation date - * 1.1 02/05/86 Updated instruction mnemonic table MD - * 1.2 06/16/86 Updated SIM_FLAGS for floating point - * 1.3 09/20/86 Updated for new encoding - * 05/11/89 R. Trawick adapted from Motorola disassembler - */ - -#include <stdio.h> - - -/* - * This file contains the structures and constants needed to build the M88000 - * simulator. It is the main include file, containing all the - * structures, macros and definitions except for the floating point - * instruction set. - */ - -/* - * The following flag informs the Simulator as to what type of byte ordering - * will be used. For instance, a BOFLAG = 1 indicates a DEC VAX and IBM type - * of ordering shall be used. -*/ - -/* # define BOFLAG 1 */ /* BYTE ORDERING FLAG */ - -/* define the number of bits in the primary opcode field of the instruction, - * the destination field, the source 1 and source 2 fields. - */ -# define OP 8 /* size of opcode field */ -# define DEST 6 /* size of destination */ -# define SOURCE1 6 /* size of source1 */ -# define SOURCE2 6 /* size of source2 */ - -# define REGs 32 /* number of registers */ - -# define WORD long -# define FLAG unsigned -# define STATE short - -# define TRUE 1 -# define FALSE 0 - -# define READ 0 -# define WRITE 1 - -/* The next four equates define the priorities that the various classes - * of instructions have regarding writing results back into registers and - * signalling exceptions. - */ -/* PMEM is also defined in <sys/param.h> on Delta 88's. Sigh! */ -#undef PMEM - -# define PINT 0 /* Integer Priority */ -# define PFLT 1 /* Floating Point Priority */ -# define PMEM 2 /* Memory Priority */ -# define NA 3 /* Not Applicable, instruction doesnt write to regs */ -# define HIPRI 3 /* highest of these priorities */ - -/* The instruction registers are an artificial mechanism to speed up - * simulator execution. In the real processor, an instruction register - * is 32 bits wide. In the simulator, the 32 bit instruction is kept in - * a structure field called rawop, and the instruction is partially decoded, - * and split into various fields and flags which make up the other fields - * of the structure. - * The partial decode is done when the instructions are initially loaded - * into simulator memory. The simulator code memory is not an array of - * 32 bit words, but is an array of instruction register structures. - * Yes this wastes memory, but it executes much quicker. - */ - -struct IR_FIELDS { - unsigned op:OP, - dest: DEST, - src1: SOURCE1, - src2: SOURCE2; - int ltncy, - extime, - wb_pri; /* writeback priority */ - unsigned imm_flags:2,/* immediate size */ - rs1_used:1, /* register source 1 used */ - rs2_used:1, /* register source 2 used */ - rsd_used:1, /* register source/dest. used */ - c_flag:1, /* complement */ - u_flag:1, /* upper half word */ - n_flag:1, /* execute next */ - wb_flag:1, /* uses writeback slot */ - dest_64:1, /* dest size */ - s1_64:1, /* source 1 size */ - s2_64:1, /* source 2 size */ - scale_flag:1, /* scaled register */ - brk_flg:1; - }; - -struct mem_segs { - struct mem_wrd *seg; /* pointer (returned by calloc) to segment */ - unsigned long baseaddr; /* base load address from file headers */ - unsigned long endaddr; /* Ending address of segment */ - int flags; /* segment control flags (none defined 12/5/86) */ -}; - -#define MAXSEGS (10) /* max number of segment allowed */ -#define MEMSEGSIZE (sizeof(struct mem_segs))/* size of mem_segs structure */ - - -#define BRK_RD (0x01) /* break on memory read */ -#define BRK_WR (0x02) /* break on memory write */ -#define BRK_EXEC (0x04) /* break on execution */ -#define BRK_CNT (0x08) /* break on terminal count */ - - -struct mem_wrd { - struct IR_FIELDS opcode; /* simulator instruction break down */ - union { - unsigned long l; /* memory element break down */ - unsigned short s[2]; - unsigned char c[4]; - } mem; -}; - -#define MEMWRDSIZE (sizeof(struct mem_wrd)) /* size of each 32 bit memory model */ - -/* External declarations */ - -extern struct mem_segs memory[]; -extern struct PROCESSOR m78000; - -struct PROCESSOR { - unsigned WORD - ip, /* execute instruction pointer */ - vbr, /* vector base register */ - psr; /* processor status register */ - - WORD S1bus, /* source 1 */ - S2bus, /* source 2 */ - Dbus, /* destination */ - DAbus, /* data address bus */ - ALU, - Regs[REGs], /* data registers */ - time_left[REGs], /* max clocks before reg is available */ - wb_pri[REGs], /* writeback priority of reg */ - SFU0_regs[REGs], /* integer unit control regs */ - SFU1_regs[REGs], /* floating point control regs */ - Scoreboard[REGs], - Vbr; - unsigned WORD scoreboard, - Psw, - Tpsw; - FLAG jump_pending:1; /* waiting for a jump instr. */ - }; - -# define i26bit 1 /* size of immediate field */ -# define i16bit 2 -# define i10bit 3 - -/* Definitions for fields in psr */ - -# define mode 31 -# define rbo 30 -# define ser 29 -# define carry 28 -# define sf7m 11 -# define sf6m 10 -# define sf5m 9 -# define sf4m 8 -# define sf3m 7 -# define sf2m 6 -# define sf1m 5 -# define mam 4 -# define inm 3 -# define exm 2 -# define trm 1 -# define ovfm 0 - -#define MODEMASK (1<<(mode-1)) -# define SILENT 0 /* simulate without output to crt */ -# define VERBOSE 1 /* simulate in verbose mode */ -# define PR_INSTR 2 /* only print instructions */ - -# define RESET 16 /* reset phase */ - -# define PHASE1 0 /* data path phases */ -# define PHASE2 1 - -/* the 1 clock operations */ - -# define ADDU 1 -# define ADDC 2 -# define ADDUC 3 -# define ADD 4 - -# define SUBU ADD+1 -# define SUBB ADD+2 -# define SUBUB ADD+3 -# define SUB ADD+4 - -# define AND_ ADD+5 -# define OR ADD+6 -# define XOR ADD+7 -# define CMP ADD+8 - -/* the LOADS */ - -# define LDAB CMP+1 -# define LDAH CMP+2 -# define LDA CMP+3 -# define LDAD CMP+4 - -# define LDB LDAD+1 -# define LDH LDAD+2 -# define LD LDAD+3 -# define LDD LDAD+4 -# define LDBU LDAD+5 -# define LDHU LDAD+6 - -/* the STORES */ - -# define STB LDHU+1 -# define STH LDHU+2 -# define ST LDHU+3 -# define STD LDHU+4 - -/* the exchange */ - -# define XMEMBU LDHU+5 -# define XMEM LDHU+6 - -/* the branches */ -# define JSR STD+1 -# define BSR STD+2 -# define BR STD+3 -# define JMP STD+4 -# define BB1 STD+5 -# define BB0 STD+6 -# define RTN STD+7 -# define BCND STD+8 - -/* the TRAPS */ -# define TB1 BCND+1 -# define TB0 BCND+2 -# define TCND BCND+3 -# define RTE BCND+4 -# define TBND BCND+5 - -/* the MISC instructions */ -# define MUL TBND + 1 -# define DIV MUL +2 -# define DIVU MUL +3 -# define MASK MUL +4 -# define FF0 MUL +5 -# define FF1 MUL +6 -# define CLR MUL +7 -# define SET MUL +8 -# define EXT MUL +9 -# define EXTU MUL +10 -# define MAK MUL +11 -# define ROT MUL +12 - -/* control register manipulations */ - -# define LDCR ROT +1 -# define STCR ROT +2 -# define XCR ROT +3 - -# define FLDCR ROT +4 -# define FSTCR ROT +5 -# define FXCR ROT +6 - - -# define NOP XCR +1 - -/* floating point instructions */ - -# define FADD NOP +1 -# define FSUB NOP +2 -# define FMUL NOP +3 -# define FDIV NOP +4 -# define FSQRT NOP +5 -# define FCMP NOP +6 -# define FIP NOP +7 -# define FLT NOP +8 -# define INT NOP +9 -# define NINT NOP +10 -# define TRNC NOP +11 -# define FLDC NOP +12 -# define FSTC NOP +13 -# define FXC NOP +14 - -# define UEXT(src,off,wid) ((((unsigned int)(src))>>(off)) & ((1<<(wid)) - 1)) -# define SEXT(src,off,wid) (((((int)(src))<<(32-((off)+(wid)))) >>(32-(wid))) ) -# define MAKE(src,off,wid) \ - ((((unsigned int)(src)) & ((1<<(wid)) - 1)) << (off)) - -# define opword(n) (unsigned long) (memaddr->mem.l) - -/* Constants and Masks */ - -#define SFU0 0x80000000 -#define SFU1 0x84000000 -#define SFU7 0x9c000000 -#define RRI10 0xf0000000 -#define RRR 0xf4000000 -#define SFUMASK 0xfc00ffe0 -#define RRRMASK 0xfc00ffe0 -#define RRI10MASK 0xfc00fc00 -#define DEFMASK 0xfc000000 -#define CTRL 0x0000f000 -#define CTRLMASK 0xfc00f800 - -/* Operands types */ - -enum operand_type { - HEX = 1, - REG = 2, - CONT = 3, - IND = 3, - BF = 4, - REGSC = 5 /* scaled register */, - CRREG = 6 /* control register */, - FCRREG = 7 /* floating point control register */, - PCREL = 8, - CONDMASK = 9, - XREG = 10, /* extended register */ - DEC = 11, /* decimal */ -}; - -/* Hashing Specification */ - -#define HASHVAL 79 - -/* Type definitions */ - -typedef unsigned int UINT; - -/* Structure templates */ - -#if never -typedef struct { - unsigned int offset:5; - unsigned int width:6; - unsigned int type:5; -} OPSPEC; -#endif - -typedef struct { - unsigned int offset; - unsigned int width; - enum operand_type type; -} OPSPEC; - - struct SIM_FLAGS { - int ltncy, /* latency (max number of clocks needed to execute) */ - extime, /* execution time (min number of clocks needed to execute) */ - wb_pri; /* writeback slot priority */ - unsigned op:OP, /* simulator version of opcode */ - imm_flags:2, /* 10,16 or 26 bit immediate flags */ - rs1_used:1, /* register source 1 used */ - rs2_used:1, /* register source 2 used */ - rsd_used:1, /* register source/dest used */ - c_flag:1, /* complement */ - u_flag:1, /* upper half word */ - n_flag:1, /* execute next */ - wb_flag:1, /* uses writeback slot */ - dest_64:1, /* double precision dest */ - s1_64:1, /* double precision source 1 */ - s2_64:1, /* double precision source 2 */ - scale_flag:1; /* register is scaled */ -}; - -typedef struct INSTRUCTAB { - unsigned int opcode; - char *mnemonic; - OPSPEC op1,op2,op3; - struct SIM_FLAGS flgs; - struct INSTRUCTAB *next; -} INSTAB; - - -#define NO_OPERAND {0,0,0} - -/* Opcode Mnemonic Op 1 Spec Op 2 Spec Op 3 Spec Simflags Next */ - -static INSTAB instructions[] = { - {0xf400c800,"jsr ",{0,5,REG} ,NO_OPERAND ,NO_OPERAND , {2,2,NA,JSR , 0,0,1,0,0,0,0,1,0,0,0,0}, NULL }, - {0xf400cc00,"jsr.n ",{0,5,REG} ,NO_OPERAND ,NO_OPERAND , {1,1,NA,JSR , 0,0,1,0,0,0,1,1,0,0,0,0}, NULL }, - {0xf400c000,"jmp ",{0,5,REG} ,NO_OPERAND ,NO_OPERAND , {2,2,NA,JMP , 0,0,1,0,0,0,0,1,0,0,0,0}, NULL }, - {0xf400c400,"jmp.n ",{0,5,REG} ,NO_OPERAND ,NO_OPERAND , {1,1,NA,JMP , 0,0,1,0,0,0,1,1,0,0,0,0}, NULL }, - {0xc8000000,"bsr ",{0,26,PCREL},NO_OPERAND ,NO_OPERAND , {2,2,NA,BSR , i26bit,0,0,0,0,0,0,1,0,0,0,0}, NULL }, - {0xcc000000,"bsr.n ",{0,26,PCREL},NO_OPERAND ,NO_OPERAND , {1,1,NA,BSR , i26bit,0,0,0,0,0,1,1,0,0,0,0}, NULL }, - {0xc0000000,"br ",{0,26,PCREL},NO_OPERAND ,NO_OPERAND , {2,2,NA,BR , i26bit,0,0,0,0,0,0,1,0,0,0,0}, NULL }, - {0xc4000000,"br.n ",{0,26,PCREL},NO_OPERAND ,NO_OPERAND , {1,1,NA,BR , i26bit,0,0,0,0,0,1,1,0,0,0,0}, NULL }, - {0xd0000000,"bb0 ",{21,5,HEX} ,{16,5,REG} ,{0,16,PCREL},{2,2,NA,BB0, i16bit,0,1,0,0,0,0,1,0,0,0,0}, NULL }, - {0xd4000000,"bb0.n ",{21,5,HEX} ,{16,5,REG} ,{0,16,PCREL},{1,1,NA,BB0, i16bit,0,1,0,0,0,1,1,0,0,0,0}, NULL }, - {0xd8000000,"bb1 ",{21,5,HEX},{16,5,REG} ,{0,16,PCREL},{2,2,NA,BB1, i16bit,0,1,0,0,0,0,1,0,0,0,0}, NULL }, - {0xdc000000,"bb1.n ",{21,5,HEX},{16,5,REG} ,{0,16,PCREL},{1,1,NA,BB1, i16bit,0,1,0,0,0,1,1,0,0,0,0}, NULL }, - {0xf000d000,"tb0 ",{21,5,HEX} ,{16,5,REG} ,{0,10,HEX}, {2,2,NA,TB0 , i10bit,0,1,0,0,0,0,1,0,0,0,0}, NULL }, - {0xf000d800,"tb1 ",{21,5,HEX} ,{16,5,REG} ,{0,10,HEX}, {2,2,NA,TB1 , i10bit,0,1,0,0,0,0,1,0,0,0,0}, NULL }, - {0xe8000000,"bcnd ",{21,5,CONDMASK},{16,5,REG},{0,16,PCREL},{2,2,NA,BCND, i16bit,0,1,0,0,0,0,1,0,0,0,0}, NULL }, - {0xec000000,"bcnd.n ",{21,5,CONDMASK},{16,5,REG},{0,16,PCREL},{1,1,NA,BCND, i16bit,0,1,0,0,0,1,1,0,0,0,0}, NULL }, - {0xf000e800,"tcnd ",{21,5,CONDMASK},{16,5,REG},{0,10,HEX}, {2,2,NA,TCND, i10bit,0,1,0,0,0,0,1,0,0,0,0}, NULL }, - {0xf8000000,"tbnd ",{16,5,REG} ,{0,16,HEX} ,NO_OPERAND , {2,2,NA,TBND, i10bit,1,0,0,0,0,0,1,0,0,0,0}, NULL }, - {0xf400f800,"tbnd ",{16,5,REG} ,{0,5,REG} ,NO_OPERAND , {2,2,NA,TBND, 0,1,1,0,0,0,0,1,0,0,0,0}, NULL }, - {0xf400fc00,"rte ",NO_OPERAND ,NO_OPERAND ,NO_OPERAND , {2,2,NA,RTE , 0,0,0,0,0,0,0,1,0,0,0,0}, NULL }, - {0x1c000000,"ld.b ",{21,5,REG} ,{16,5,REG} ,{0,16,HEX}, {3,1,PMEM,LDB ,i16bit,1,0,1,0,0,0,1,0,0,0,0}, NULL }, - {0xf4001c00,"ld.b ",{21,5,REG} ,{16,5,REG} ,{0,5,REG} , {3,1,PMEM,LDB , 0,1,1,1,0,0,0,1,0,0,0,0}, NULL }, - {0x0c000000,"ld.bu ",{21,5,REG} ,{16,5,REG} ,{0,16,HEX}, {3,1,PMEM,LDBU, i16bit,1,0,1,0,0,0,1,0,0,0,0}, NULL }, - {0xf4000c00,"ld.bu ",{21,5,REG} ,{16,5,REG} ,{0,5,REG} , {3,1,PMEM,LDBU ,0,1,1,1,0,0,0,1,0,0,0,0}, NULL }, - {0x18000000,"ld.h ",{21,5,REG} ,{16,5,REG} ,{0,16,HEX}, {3,1,PMEM,LDH ,i16bit,1,0,1,0,0,0,1,0,0,0,0}, NULL }, - {0xf4001800,"ld.h ",{21,5,REG} ,{16,5,REG} ,{0,5,REG} , {3,1,PMEM,LDH ,0,1,1,1,0,0,0,1,0,0,0,0}, NULL }, - {0xf4001a00,"ld.h ",{21,5,REG} ,{16,5,REG} ,{0,5,REGSC},{3,1,PMEM,LDH ,0,1,1,1,0,0,0,1,0,0,0,1}, NULL }, - {0x08000000,"ld.hu ",{21,5,REG} ,{16,5,REG} ,{0,16,HEX}, {3,1,PMEM,LDHU, i16bit,1,0,1,0,0,0,1,0,0,0,0}, NULL }, - {0xf4000800,"ld.hu ",{21,5,REG} ,{16,5,REG} ,{0,5,REG} , {3,1,PMEM,LDHU ,0,1,1,1,0,0,0,1,0,0,0,0}, NULL }, - {0xf4000a00,"ld.hu ",{21,5,REG} ,{16,5,REG} ,{0,5,REGSC},{3,1,PMEM,LDHU ,0,1,1,1,0,0,0,1,0,0,0,1}, NULL }, - {0x14000000,"ld ",{21,5,REG} ,{16,5,REG} ,{0,16,HEX}, {3,1,PMEM,LD ,i16bit,1,0,1,0,0,0,1,0,0,0,0}, NULL }, - {0xf4001400,"ld ",{21,5,REG} ,{16,5,REG} ,{0,5,REG} , {3,1,PMEM,LD ,0,1,1,1,0,0,0,1,0,0,0,0}, NULL }, - {0xf4001600,"ld ",{21,5,REG} ,{16,5,REG} ,{0,5,REGSC},{3,1,PMEM,LD ,0,1,1,1,0,0,0,1,0,0,0,1}, NULL }, - {0x10000000,"ld.d ",{21,5,REG} ,{16,5,REG} ,{0,16,HEX}, {3,1,PMEM,LDD ,i16bit,1,0,1,0,0,0,1,0,0,0,0}, NULL }, - {0xf4001000,"ld.d ",{21,5,REG} ,{16,5,REG} ,{0,5,REG} , {3,1,PMEM,LDD ,0,1,1,1,0,0,0,1,0,0,0,0}, NULL }, - {0xf4001200,"ld.d ",{21,5,REG} ,{16,5,REG} ,{0,5,REGSC},{3,1,PMEM,LDD ,0,1,1,1,0,0,0,1,0,0,0,1}, NULL }, - {0xf4001500,"ld.usr ",{21,5,REG} ,{16,5,REG} ,{0,5,REG} , {3,1,PMEM,LD ,0,1,1,1,0,0,0,1,0,0,0,0}, NULL }, - {0xf4001700,"ld.usr ",{21,5,REG} ,{16,5,REG} ,{0,5,REGSC},{3,1,PMEM,LD ,0,1,1,1,0,0,0,1,0,0,0,1}, NULL }, - {0x2c000000,"st.b ",{21,5,REG} ,{16,5,REG} ,{0,16,HEX}, {1,1,NA,STB ,i16bit,1,0,1,0,0,0,1,0,0,0,0}, NULL }, - {0xf4002c00,"st.b ",{21,5,REG} ,{16,5,REG} ,{0,5,REG} , {1,1,NA,STB ,0,1,1,1,0,0,0,1,0,0,0,0}, NULL }, - {0x28000000,"st.h ",{21,5,REG} ,{16,5,REG} ,{0,16,HEX}, {1,1,NA,STH ,i16bit,1,0,1,0,0,0,1,0,0,0,0}, NULL }, - {0xf4002800,"st.h ",{21,5,REG} ,{16,5,REG} ,{0,5,REG} , {1,1,NA,STH ,0,1,1,1,0,0,0,1,0,0,0,0}, NULL }, - {0xf4002a00,"st.h ",{21,5,REG} ,{16,5,REG} ,{0,5,REGSC},{1,1,NA,STH ,0,1,1,1,0,0,0,1,0,0,0,1}, NULL }, - {0x24000000,"st ",{21,5,REG} ,{16,5,REG} ,{0,16,HEX}, {1,1,NA,ST ,i16bit,1,0,1,0,0,0,1,0,0,0,0}, NULL }, - {0xf4002400,"st ",{21,5,REG} ,{16,5,REG} ,{0,5,REG} , {1,1,NA,ST ,0,1,1,1,0,0,0,1,0,0,0,0} ,NULL }, - {0xf4002600,"st ",{21,5,REG} ,{16,5,REG} ,{0,5,REGSC},{1,1,NA,ST ,0,1,1,1,0,0,0,1,0,0,0,1} ,NULL }, - {0x20000000,"st.d ",{21,5,REG} ,{16,5,REG} ,{0,16,HEX}, {1,1,NA,STD ,i16bit,0,1,0,0,0,0,1,0,0,0,0} ,NULL }, - {0xf4002000,"st.d ",{21,5,REG} ,{16,5,REG} ,{0,5,REG} , {1,1,NA,STD ,0,1,1,1,0,0,0,1,0,0,0,0} ,NULL }, - {0xf4002200,"st.d ",{21,5,REG} ,{16,5,REG} ,{0,5,REGSC},{1,1,NA,STD ,0,1,1,1,0,0,0,1,0,0,0,1} ,NULL }, - {0xf4002500,"st.usr ",{21,5,REG} ,{16,5,REG} ,{0,5,REG} , {1,1,NA,ST ,0,1,1,1,0,0,0,1,0,0,0,0} ,NULL }, - {0xf4002700,"st.usr ",{21,5,REG} ,{16,5,REG} ,{0,5,REGSC},{1,1,NA,ST ,0,1,1,1,0,0,0,1,0,0,0,1} ,NULL }, -/* m88100 only: - {0x00000000,"xmem.bu ",{21,5,REG} ,{16,5,REG} ,{0,16,HEX}, {3,1,PMEM,XMEMBU ,i16bit,1,1,1,0,0,0,1,0,0,0,0} ,NULL }, - */ - {0xf4000000,"xmem.bu ",{21,5,REG} ,{16,5,REG} ,{0,5,REG} , {3,1,PMEM,XMEM ,0,1,1,1,0,0,0,1,0,0,0,0} ,NULL }, -/* m88100 only: - {0x04000000,"xmem ",{21,5,REG} ,{16,5,REG} ,{0,16,HEX}, {3,1,PMEM,XMEM ,i16bit,1,1,1,0,0,0,1,0,0,0,0} ,NULL }, - */ - {0xf4000400,"xmem ",{21,5,REG} ,{16,5,REG} ,{0,5,REG} , {3,1,PMEM,XMEM ,0,1,1,1,0,0,0,1,0,0,0,0} ,NULL }, - {0xf4000600,"xmem ",{21,5,REG} ,{16,5,REG} ,{0,5,REGSC},{3,1,PMEM,XMEM ,0,1,1,1,0,0,0,1,0,0,0,1} ,NULL }, - {0xf4000500,"xmem.usr ",{21,5,REG} ,{16,5,REG} ,{0,5,REG} , {3,1,PMEM,XMEM ,0,1,1,1,0,0,0,1,0,0,0,0} ,NULL }, - {0xf4000700,"xmem.usr ",{21,5,REG} ,{16,5,REG} ,{0,5,REGSC},{3,1,PMEM,XMEM ,0,1,1,1,0,0,0,1,0,0,0,1} ,NULL }, -/* m88100 only: - {0xf4003e00,"lda.b ",{21,5,REG} ,{16,5,REG} ,{0,5,REGSC},{1,1,PINT,LDAH, 0,1,1,1,0,0,0,0,0,0,0,1} ,NULL }, - */ - {0xf4003e00,"lda.x ",{21,5,REG} ,{16,5,REG} ,{0,5,REGSC},{1,1,PINT,LDAH, 0,1,1,1,0,0,0,0,0,0,0,1} ,NULL }, - {0xf4003a00,"lda.h ",{21,5,REG} ,{16,5,REG} ,{0,5,REGSC},{1,1,PINT,LDAH, 0,1,1,1,0,0,0,0,0,0,0,1} ,NULL }, - {0xf4003600,"lda ",{21,5,REG} ,{16,5,REG} ,{0,5,REGSC},{1,1,PINT,LDA , 0,1,1,1,0,0,0,0,0,0,0,1} ,NULL }, - {0xf4003200,"lda.d ",{21,5,REG} ,{16,5,REG} ,{0,5,REGSC},{1,1,PINT,LDAD, 0,1,1,1,0,0,0,0,0,0,0,1} ,NULL }, - - {0x80004000,"ldcr ",{21,5,REG} ,{5,6,CRREG} ,NO_OPERAND ,{1,1,PINT,LDCR, 0,1,1,1,0,0,0,0,0,0,0,0} ,NULL }, - {0x80008000,"stcr ",{16,5,REG} ,{5,6,CRREG} ,NO_OPERAND ,{1,1,PINT,STCR, 0,1,1,1,0,0,0,0,0,0,0,0} ,NULL }, - {0x8000c000,"xcr ",{21,5,REG} ,{16,5,REG} ,{5,6,CRREG},{1,1,PINT,XCR, 0,1,1,1,0,0,0,0,0,0,0,0} ,NULL }, - - {0xf4006000,"addu ",{21,5,REG} ,{16,5,REG} ,{0,5,REG} , {1,1,PINT,ADDU, 0,1,1,1,0,0,0,0,0,0,0,0} ,NULL }, - {0xf4006200,"addu.ci ",{21,5,REG} ,{16,5,REG} ,{0,5,REG} , {1,1,PINT,ADDU, 0,1,1,1,0,0,0,0,0,0,0,0} ,NULL }, - {0xf4006100,"addu.co ",{21,5,REG} ,{16,5,REG} ,{0,5,REG} , {1,1,PINT,ADDU, 0,1,1,1,0,0,0,0,0,0,0,0} ,NULL }, - {0xf4006300,"addu.cio ",{21,5,REG} ,{16,5,REG} ,{0,5,REG} , {1,1,PINT,ADDU, 0,1,1,1,0,0,0,0,0,0,0,0} ,NULL }, - {0xf4006400,"subu ",{21,5,REG} ,{16,5,REG} ,{0,5,REG} , {1,1,PINT,SUBU, 0,1,1,1,0,0,0,0,0,0,0,0} ,NULL }, - {0xf4006600,"subu.ci ",{21,5,REG} ,{16,5,REG} ,{0,5,REG} , {1,1,PINT,SUBU, 0,1,1,1,0,0,0,0,0,0,0,0} ,NULL }, - {0xf4006500,"subu.co ",{21,5,REG} ,{16,5,REG} ,{0,5,REG} , {1,1,PINT,SUBU, 0,1,1,1,0,0,0,0,0,0,0,0} ,NULL }, - {0xf4006700,"subu.cio ",{21,5,REG} ,{16,5,REG} ,{0,5,REG} , {1,1,PINT,SUBU, 0,1,1,1,0,0,0,0,0,0,0,0} ,NULL }, - {0xf4006800,"divu ",{21,5,REG} ,{16,5,REG} ,{0,5,REG} , {32,32,PINT,DIVU, 0,1,1,1,0,0,0,0,0,0,0,0} ,NULL }, - {0xf4006900,"divu.d ",{21,5,REG} ,{16,5,REG} ,{0,5,REG} , {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,}, NULL }, - {0xf4006e00,"muls ",{21,5,REG} ,{16,5,REG} ,{0,5,REG} , {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,}, NULL }, - {0xf4006c00,"mulu ",{21,5,REG} ,{16,5,REG} ,{0,5,REG} , {1,4,PINT,MUL, 0,1,1,1,0,0,0,0,0,0,0,0} ,NULL }, - {0xf4007000,"add ",{21,5,REG} ,{16,5,REG} ,{0,5,REG} , {1,1,PINT,ADD , 0,1,1,1,0,0,0,0,0,0,0,0} ,NULL }, - {0xf4007200,"add.ci ",{21,5,REG} ,{16,5,REG} ,{0,5,REG} , {1,1,PINT,ADD , 0,1,1,1,0,0,0,0,0,0,0,0} ,NULL }, - {0xf4007100,"add.co ",{21,5,REG} ,{16,5,REG} ,{0,5,REG} , {1,1,PINT,ADD , 0,1,1,1,0,0,0,0,0,0,0,0} ,NULL }, - {0xf4007300,"add.cio ",{21,5,REG} ,{16,5,REG} ,{0,5,REG} , {1,1,PINT,ADD , 0,1,1,1,0,0,0,0,0,0,0,0} ,NULL }, - {0xf4007400,"sub ",{21,5,REG} ,{16,5,REG} ,{0,5,REG} , {1,1,PINT,SUB , 0,1,1,1,0,0,0,0,0,0,0,0} ,NULL }, - {0xf4007600,"sub.ci ",{21,5,REG} ,{16,5,REG} ,{0,5,REG} , {1,1,PINT,SUB , 0,1,1,1,0,0,0,0,0,0,0,0} ,NULL }, - {0xf4007500,"sub.co ",{21,5,REG} ,{16,5,REG} ,{0,5,REG} , {1,1,PINT,SUB , 0,1,1,1,0,0,0,0,0,0,0,0} ,NULL }, - {0xf4007700,"sub.cio ",{21,5,REG} ,{16,5,REG} ,{0,5,REG} , {1,1,PINT,SUB , 0,1,1,1,0,0,0,0,0,0,0,0} ,NULL }, - {0xf4007800,"divs ",{21,5,REG} ,{16,5,REG} ,{0,5,REG} , {32,32,PINT,DIV , 0,1,1,1,0,0,0,0,0,0,0,0} ,NULL }, - {0xf4007c00,"cmp ",{21,5,REG} ,{16,5,REG} ,{0,5,REG} , {1,1,PINT,CMP, 0,1,1,1,0,0,0,0,0,0,0,0} ,NULL }, - - {0x60000000,"addu ",{21,5,REG} ,{16,5,REG} ,{0,16,HEX}, {1,1,PINT,ADDU, i16bit,1,0,1,0,0,0,0,0,0,0,0} ,NULL }, - {0x64000000,"subu ",{21,5,REG} ,{16,5,REG} ,{0,16,HEX}, {1,1,PINT,SUBU, i16bit,1,0,1,0,0,0,0,0,0,0,0} ,NULL }, - - {0x68000000,"divu ",{21,5,REG} ,{16,5,REG} ,{0,16,HEX}, {32,32,PINT,DIVU, i16bit,1,0,1,0,0,0,0,0,0,0,0} ,NULL }, - {0x6c000000,"mulu ",{21,5,REG} ,{16,5,REG} ,{0,16,HEX}, {4,1,PINT,MUL, i16bit,1,0,1,0,0,0,0,0,0,0,0} ,NULL }, - {0x70000000,"add ",{21,5,REG} ,{16,5,REG} ,{0,16,HEX}, {1,1,PINT,ADD, i16bit,1,0,1,0,0,0,0,0,0,0,0} ,NULL }, - {0x74000000,"sub ",{21,5,REG} ,{16,5,REG} ,{0,16,HEX}, {1,1,PINT,SUB, i16bit,1,0,1,0,0,0,0,0,0,0,0} ,NULL }, - {0x78000000,"divs ",{21,5,REG} ,{16,5,REG} ,{0,16,HEX}, {32,32,PINT,DIV, i16bit,1,0,1,0,0,0,0,0,0,0,0} ,NULL }, - {0x7c000000,"cmp ",{21,5,REG} ,{16,5,REG} ,{0,16,HEX}, {1,1,PINT,CMP, i16bit,1,0,1,0,0,0,0,0,0,0,0} ,NULL }, - - {0xf4004000,"and ",{21,5,REG} ,{16,5,REG} ,{0,5,REG} , {1,1,PINT,AND_ ,0,1,1,1,0,0,0,0,0,0,0,0} ,NULL }, - {0xf4004400,"and.c ",{21,5,REG} ,{16,5,REG} ,{0,5,REG} , {1,1,PINT,AND_ ,0,1,1,1,1,0,0,0,0,0,0,0} ,NULL }, - {0xf4005800,"or ",{21,5,REG} ,{16,5,REG} ,{0,5,REG} , {1,1,PINT,OR ,0,1,1,1,0,0,0,0,0,0,0,0} ,NULL }, - {0xf4005c00,"or.c ",{21,5,REG} ,{16,5,REG} ,{0,5,REG} , {1,1,PINT,OR ,0,1,1,1,1,0,0,0,0,0,0,0} ,NULL }, - {0xf4005000,"xor ",{21,5,REG} ,{16,5,REG} ,{0,5,REG} , {1,1,PINT,XOR ,0,1,1,1,0,0,0,0,0,0,0,0} ,NULL }, - {0xf4005400,"xor.c ",{21,5,REG} ,{16,5,REG} ,{0,5,REG} , {1,1,PINT,XOR ,0,1,1,1,1,0,0,0,0,0,0,0} ,NULL }, - {0x40000000,"and ",{21,5,REG} ,{16,5,REG} ,{0,16,HEX}, {1,1,PINT,AND_ ,i16bit,1,0,1,0,0,0,0,0,0,0,0} ,NULL }, - {0x44000000,"and.u ",{21,5,REG} ,{16,5,REG} ,{0,16,HEX}, {1,1,PINT,AND_ ,i16bit,1,0,1,0,1,0,0,0,0,0,0} ,NULL }, - {0x58000000,"or ",{21,5,REG} ,{16,5,REG} ,{0,16,HEX}, {1,1,PINT,OR ,i16bit,1,0,1,0,0,0,0,0,0,0,0} ,NULL }, - {0x5c000000,"or.u ",{21,5,REG} ,{16,5,REG} ,{0,16,HEX}, {1,1,PINT,OR ,i16bit,1,0,1,0,1,0,0,0,0,0,0} ,NULL }, - {0x50000000,"xor ",{21,5,REG} ,{16,5,REG} ,{0,16,HEX}, {1,1,PINT,XOR ,i16bit,1,0,1,0,0,0,0,0,0,0,0} ,NULL }, - {0x54000000,"xor.u ",{21,5,REG} ,{16,5,REG} ,{0,16,HEX}, {1,1,PINT,XOR ,i16bit,1,0,1,0,1,0,0,0,0,0,0} ,NULL }, - {0x48000000,"mask ",{21,5,REG} ,{16,5,REG} ,{0,16,HEX}, {1,1,PINT,MASK ,i16bit,1,0,1,0,0,0,0,0,0,0,0} ,NULL }, - {0x4c000000,"mask.u ",{21,5,REG} ,{16,5,REG} ,{0,16,HEX}, {1,1,PINT,MASK ,i16bit,1,0,1,0,1,0,0,0,0,0,0} ,NULL }, - {0xf400ec00,"ff0 ",{21,5,REG} ,{0,5,REG} ,NO_OPERAND , {1,1,PINT,FF0 ,0,0,1,1,0,0,0,0,0,0,0,0} ,NULL }, - {0xf400e800,"ff1 ",{21,5,REG} ,{0,5,REG} ,NO_OPERAND , {1,1,PINT,FF1 ,0,0,1,1,0,0,0,0,0,0,0,0} ,NULL }, - {0xf0008000,"clr ",{21,5,REG} ,{16,5,REG} ,{0,10,BF} , {1,1,PINT,CLR ,i10bit,1,0,1,0,0,0,0,0,0,0,0} ,NULL }, - {0xf0008800,"set ",{21,5,REG} ,{16,5,REG} ,{0,10,BF} , {1,1,PINT,SET ,i10bit,1,0,1,0,0,0,0,0,0,0,0} ,NULL }, - {0xf0009000,"ext ",{21,5,REG} ,{16,5,REG} ,{0,10,BF} , {1,1,PINT,EXT ,i10bit,1,0,1,0,0,0,0,0,0,0,0} ,NULL }, - {0xf0009800,"extu ",{21,5,REG} ,{16,5,REG} ,{0,10,BF} , {1,1,PINT,EXTU ,i10bit,1,0,1,0,0,0,0,0,0,0,0} ,NULL }, - {0xf000a000,"mak ",{21,5,REG} ,{16,5,REG} ,{0,10,BF} , {1,1,PINT,MAK ,i10bit,1,0,1,0,0,0,0,0,0,0,0} ,NULL }, - {0xf000a800,"rot ",{21,5,REG} ,{16,5,REG} ,{0,10,BF} , {1,1,PINT,ROT ,i10bit,1,0,1,0,0,0,0,0,0,0,0} ,NULL }, - {0xf4008000,"clr ",{21,5,REG} ,{16,5,REG} ,{0,5,REG} , {1,1,PINT,CLR ,0,1,1,1,0,0,0,0,0,0,0,0} ,NULL }, - {0xf4008800,"set ",{21,5,REG} ,{16,5,REG} ,{0,5,REG} , {1,1,PINT,SET ,0,1,1,1,0,0,0,0,0,0,0,0} ,NULL }, - {0xf4009000,"ext ",{21,5,REG} ,{16,5,REG} ,{0,5,REG} , {1,1,PINT,EXT ,0,1,1,1,0,0,0,0,0,0,0,0} ,NULL }, - {0xf4009800,"extu ",{21,5,REG} ,{16,5,REG} ,{0,5,REG} , {1,1,PINT,EXTU ,0,1,1,1,0,0,0,0,0,0,0,0} ,NULL }, - {0xf400a000,"mak ",{21,5,REG} ,{16,5,REG} ,{0,5,REG} , {1,1,PINT,MAK ,0,1,1,1,0,0,0,0,0,0,0,0} ,NULL }, - {0xf400a800,"rot ",{21,5,REG} ,{16,5,REG} ,{0,5,REG} , {1,1,PINT,ROT ,0,1,1,1,0,0,0,0,0,0,0,0} ,NULL }, - - {0x84002800,"fadd.sss ",{21,5,REG} ,{16,5,REG} ,{0,5,REG} , {5,1,PFLT,FADD ,0,1,1,1,0,0,0,1,0,0,0,0} ,NULL }, - {0x84002880,"fadd.ssd ",{21,5,REG} ,{16,5,REG} ,{0,5,REG} , {6,2,PFLT,FADD ,0,1,1,1,0,0,0,1,0,0,1,0} ,NULL }, - {0x84002a00,"fadd.sds ",{21,5,REG} ,{16,5,REG} ,{0,5,REG} , {6,2,PFLT,FADD ,0,1,1,1,0,0,0,1,0,1,0,0} ,NULL }, - {0x84002a80,"fadd.sdd ",{21,5,REG} ,{16,5,REG} ,{0,5,REG} , {6,2,PFLT,FADD ,0,1,1,1,0,0,0,1,0,1,1,0} ,NULL }, - {0x84002820,"fadd.dss ",{21,5,REG} ,{16,5,REG} ,{0,5,REG} , {6,2,PFLT,FADD ,0,1,1,1,0,0,0,1,1,0,0,0} ,NULL }, - {0x840028a0,"fadd.dsd ",{21,5,REG} ,{16,5,REG} ,{0,5,REG} , {6,2,PFLT,FADD ,0,1,1,1,0,0,0,1,1,0,1,0} ,NULL }, - {0x84002a20,"fadd.dds ",{21,5,REG} ,{16,5,REG} ,{0,5,REG} , {6,2,PFLT,FADD ,0,1,1,1,0,0,0,1,1,1,0,0} ,NULL }, - {0x84002aa0,"fadd.ddd ",{21,5,REG} ,{16,5,REG} ,{0,5,REG} , {6,2,PFLT,FADD ,0,1,1,1,0,0,0,1,1,1,1,0} ,NULL }, - {0x84003000,"fsub.sss ",{21,5,REG} ,{16,5,REG} ,{0,5,REG} , {5,1,PFLT,FSUB ,0,1,1,1,0,0,0,1,0,0,0,0} ,NULL }, - {0x84003080,"fsub.ssd ",{21,5,REG} ,{16,5,REG} ,{0,5,REG} , {6,2,PFLT,FSUB ,0,1,1,1,0,0,0,1,0,0,1,0} ,NULL }, - {0x84003200,"fsub.sds ",{21,5,REG} ,{16,5,REG} ,{0,5,REG} , {6,2,PFLT,FSUB ,0,1,1,1,0,0,0,1,0,1,0,0} ,NULL }, - {0x84003280,"fsub.sdd ",{21,5,REG} ,{16,5,REG} ,{0,5,REG} , {6,2,PFLT,FSUB ,0,1,1,1,0,0,0,1,0,1,1,0} ,NULL }, - {0x84003020,"fsub.dss ",{21,5,REG} ,{16,5,REG} ,{0,5,REG} , {6,2,PFLT,FSUB ,0,1,1,1,0,0,0,1,1,0,0,0} ,NULL }, - {0x840030a0,"fsub.dsd ",{21,5,REG} ,{16,5,REG} ,{0,5,REG} , {6,2,PFLT,FSUB ,0,1,1,1,0,0,0,1,1,0,1,0} ,NULL }, - {0x84003220,"fsub.dds ",{21,5,REG} ,{16,5,REG} ,{0,5,REG} , {6,2,PFLT,FSUB ,0,1,1,1,0,0,0,1,1,1,0,0} ,NULL }, - {0x840032a0,"fsub.ddd ",{21,5,REG} ,{16,5,REG} ,{0,5,REG} , {6,2,PFLT,FSUB ,0,1,1,1,0,0,0,1,1,1,1,0} ,NULL }, - {0x84000000,"fmul.sss ",{21,5,REG} ,{16,5,REG} ,{0,5,REG} , {6,1,PFLT,FMUL ,0,1,1,1,0,0,0,1,0,0,0,0} ,NULL }, - {0x84000080,"fmul.ssd ",{21,5,REG} ,{16,5,REG} ,{0,5,REG} , {9,2,PFLT,FMUL ,0,1,1,1,0,0,0,1,0,0,1,0} ,NULL }, - {0x84000200,"fmul.sds ",{21,5,REG} ,{16,5,REG} ,{0,5,REG} , {9,2,PFLT,FMUL ,0,1,1,1,0,0,0,1,0,1,0,0} ,NULL }, - {0x84000280,"fmul.sdd ",{21,5,REG} ,{16,5,REG} ,{0,5,REG} , {9,2,PFLT,FMUL ,0,1,1,1,0,0,0,1,0,1,1,0} ,NULL }, - {0x84000020,"fmul.dss ",{21,5,REG} ,{16,5,REG} ,{0,5,REG} , {9,2,PFLT,FMUL ,0,1,1,1,0,0,0,1,1,0,0,0} ,NULL }, - {0x840000a0,"fmul.dsd ",{21,5,REG} ,{16,5,REG} ,{0,5,REG} , {9,2,PFLT,FMUL ,0,1,1,1,0,0,0,1,1,0,1,0} ,NULL }, - {0x84000220,"fmul.dds ",{21,5,REG} ,{16,5,REG} ,{0,5,REG} , {9,2,PFLT,FMUL ,0,1,1,1,0,0,0,1,1,1,0,0} ,NULL }, - {0x840002a0,"fmul.ddd ",{21,5,REG} ,{16,5,REG} ,{0,5,REG} , {9,2,PFLT,FMUL ,0,1,1,1,0,0,0,1,1,1,1,0} ,NULL }, - {0x84007000,"fdiv.sss ",{21,5,REG} ,{16,5,REG} ,{0,5,REG} , {30,30,PFLT,FDIV ,0,1,1,1,0,0,0,1,0,0,0,0} ,NULL }, - {0x84007080,"fdiv.ssd ",{21,5,REG} ,{16,5,REG} ,{0,5,REG} , {60,60,PFLT,FDIV ,0,1,1,1,0,0,0,1,0,0,1,0} ,NULL }, - {0x84007200,"fdiv.sds ",{21,5,REG} ,{16,5,REG} ,{0,5,REG} , {60,60,PFLT,FDIV ,0,1,1,1,0,0,0,1,0,1,0,0} ,NULL }, - {0x84007280,"fdiv.sdd ",{21,5,REG} ,{16,5,REG} ,{0,5,REG} , {60,60,PFLT,FDIV ,0,1,1,1,0,0,0,1,0,1,1,0} ,NULL }, - {0x84007020,"fdiv.dss ",{21,5,REG} ,{16,5,REG} ,{0,5,REG} , {60,60,PFLT,FDIV ,0,1,1,1,0,0,0,1,1,0,0,0} ,NULL }, - {0x840070a0,"fdiv.dsd ",{21,5,REG} ,{16,5,REG} ,{0,5,REG} , {60,60,PFLT,FDIV ,0,1,1,1,0,0,0,1,1,0,1,0} ,NULL }, - {0x84007220,"fdiv.dds ",{21,5,REG} ,{16,5,REG} ,{0,5,REG} , {60,60,PFLT,FDIV ,0,1,1,1,0,0,0,1,1,1,0,0} ,NULL }, - {0x840072a0,"fdiv.ddd ",{21,5,REG} ,{16,5,REG} ,{0,5,REG} , {60,60,PFLT,FDIV ,0,1,1,1,0,0,0,1,1,1,1,0} ,NULL }, - {0x84007800,"fsqrt.ss ",{21,5,REG} ,{0,5,REG} ,NO_OPERAND , {5,1,PFLT,FLT ,0,0,1,1,0,0,0,1,0,0,0,0} ,NULL }, - {0x84007820,"fsqrt.sd ",{21,5,REG} ,{0,5,REG} ,NO_OPERAND , {5,1,PFLT,FLT ,0,0,1,1,0,0,0,1,0,0,0,0} ,NULL }, - {0x84007880,"fsqrt.ds ",{21,5,REG} ,{0,5,REG} ,NO_OPERAND , {5,1,PFLT,FLT ,0,0,1,1,0,0,0,1,0,0,0,0} ,NULL }, - {0x840078a0,"fsqrt.dd ",{21,5,REG} ,{0,5,REG} ,NO_OPERAND , {6,1,PFLT,FLT ,0,0,1,1,0,0,0,1,1,0,0,0} ,NULL }, - {0x84003800,"fcmp.ss ",{21,5,REG} ,{16,5,REG} ,{0,5,REG} , {5,1,PFLT,FCMP ,0,1,1,1,0,0,0,1,0,0,0,0} ,NULL }, - {0x84003880,"fcmp.sd ",{21,5,REG} ,{16,5,REG} ,{0,5,REG} , {6,1,PFLT,FCMP ,0,1,1,1,0,0,0,1,0,1,0,0} ,NULL }, - {0x84003a00,"fcmp.ds ",{21,5,REG} ,{16,5,REG} ,{0,5,REG} , {6,1,PFLT,FCMP ,0,1,1,1,0,0,0,1,1,0,0,0} ,NULL }, - {0x84003a80,"fcmp.dd ",{21,5,REG} ,{16,5,REG} ,{0,5,REG} , {6,1,PFLT,FCMP ,0,1,1,1,0,0,0,1,1,1,0,0} ,NULL }, - {0x84002000,"flt.s ",{21,5,REG} ,{0,5,REG} ,NO_OPERAND , {5,1,PFLT,FLT ,0,0,1,1,0,0,0,1,0,0,0,0} ,NULL }, - {0x84002020,"flt.d ",{21,5,REG} ,{0,5,REG} ,NO_OPERAND , {6,1,PFLT,FLT ,0,0,1,1,0,0,0,1,1,0,0,0} ,NULL }, - {0x84004800,"int.s ",{21,5,REG} ,{0,5,REG} ,NO_OPERAND , {5,1,PFLT,INT ,0,0,1,1,0,0,0,1,0,0,0,0} ,NULL }, - {0x84004880,"int.d ",{21,5,REG} ,{0,5,REG} ,NO_OPERAND , {6,1,PFLT,INT ,0,0,1,1,0,0,0,1,1,0,0,0} ,NULL }, - {0x84005000,"nint.s ",{21,5,REG} ,{0,5,REG} ,NO_OPERAND , {5,1,PFLT,INT ,0,0,1,1,0,0,0,1,0,0,0,0} ,NULL }, - {0x84005080,"nint.d ",{21,5,REG} ,{0,5,REG} ,NO_OPERAND , {6,1,PFLT,INT ,0,0,1,1,0,0,0,1,1,0,0,0} ,NULL }, - {0x84005800,"trnc.s ",{21,5,REG} ,{0,5,REG} ,NO_OPERAND , {5,1,PFLT,TRNC ,0,0,1,1,0,0,0,1,0,0,0,0} ,NULL }, - {0x84005880,"trnc.d ",{21,5,REG} ,{0,5,REG} ,NO_OPERAND , {6,1,PFLT,TRNC ,0,0,1,1,0,0,0,1,1,0,0,0} ,NULL }, - - {0x80004800,"fldcr ",{21,5,REG} ,{5,6,FCRREG} ,NO_OPERAND , {1,1,PFLT,FLDC ,0,0,1,1,0,0,0,1,0,0,0,0} ,NULL }, - {0x80008800,"fstcr ",{16,5,REG} ,{5,6,FCRREG} ,NO_OPERAND , {1,1,PFLT,FSTC ,0,0,1,1,0,0,0,1,0,0,0,0} ,NULL }, - {0x8000c800,"fxcr ",{21,5,REG} ,{16,5,REG} ,{5,6,FCRREG} , {1,1,PFLT,FXC ,0,0,1,1,0,0,0,1,0,0,0,0} ,NULL }, - -/* The following are new for the 88110. */ - - {0x8400aaa0,"fadd.ddd ",{21,5,XREG} ,{16,5,XREG} ,{0,5,XREG}, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, NULL }, - {0x8400aa80,"fadd.dds ",{21,5,XREG} ,{16,5,XREG} ,{0,5,XREG}, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, NULL }, - {0x8400aac0,"fadd.ddx ",{21,5,XREG} ,{16,5,XREG} ,{0,5,XREG}, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, NULL }, - {0x8400aa20,"fadd.dsd ",{21,5,XREG} ,{16,5,XREG} ,{0,5,XREG}, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, NULL }, - {0x8400aa00,"fadd.dss ",{21,5,XREG} ,{16,5,XREG} ,{0,5,XREG}, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, NULL }, - {0x8400aa40,"fadd.dsx ",{21,5,XREG} ,{16,5,XREG} ,{0,5,XREG}, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, NULL }, - {0x8400ab20,"fadd.dxd ",{21,5,XREG} ,{16,5,XREG} ,{0,5,XREG}, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, NULL }, - {0x8400ab00,"fadd.dxs ",{21,5,XREG} ,{16,5,XREG} ,{0,5,XREG}, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, NULL }, - {0x8400ab40,"fadd.dxx ",{21,5,XREG} ,{16,5,XREG} ,{0,5,XREG}, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, NULL }, - {0x8400a8a0,"fadd.sdd ",{21,5,XREG} ,{16,5,XREG} ,{0,5,XREG}, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, NULL }, - {0x8400a880,"fadd.sds ",{21,5,XREG} ,{16,5,XREG} ,{0,5,XREG}, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, NULL }, - {0x8400a8c0,"fadd.sdx ",{21,5,XREG} ,{16,5,XREG} ,{0,5,XREG}, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, NULL }, - {0x8400a820,"fadd.ssd ",{21,5,XREG} ,{16,5,XREG} ,{0,5,XREG}, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, NULL }, - {0x8400a800,"fadd.sss ",{21,5,XREG} ,{16,5,XREG} ,{0,5,XREG}, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, NULL }, - {0x8400a840,"fadd.ssx ",{21,5,XREG} ,{16,5,XREG} ,{0,5,XREG}, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, NULL }, - {0x8400a920,"fadd.sxd ",{21,5,XREG} ,{16,5,XREG} ,{0,5,XREG}, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, NULL }, - {0x8400a900,"fadd.sxs ",{21,5,XREG} ,{16,5,XREG} ,{0,5,XREG}, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, NULL }, - {0x8400a940,"fadd.sxx ",{21,5,XREG} ,{16,5,XREG} ,{0,5,XREG}, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, NULL }, - {0x8400aca0,"fadd.xdd ",{21,5,XREG} ,{16,5,XREG} ,{0,5,XREG}, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, NULL }, - {0x8400ac80,"fadd.xds ",{21,5,XREG} ,{16,5,XREG} ,{0,5,XREG}, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, NULL }, - {0x8400acc0,"fadd.xdx ",{21,5,XREG} ,{16,5,XREG} ,{0,5,XREG}, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, NULL }, - {0x8400ac20,"fadd.xsd ",{21,5,XREG} ,{16,5,XREG} ,{0,5,XREG}, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, NULL }, - {0x8400ac00,"fadd.xss ",{21,5,XREG} ,{16,5,XREG} ,{0,5,XREG}, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, NULL }, - {0x8400ac40,"fadd.xsx ",{21,5,XREG} ,{16,5,XREG} ,{0,5,XREG}, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, NULL }, - {0x8400ad20,"fadd.xxd ",{21,5,XREG} ,{16,5,XREG} ,{0,5,XREG}, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, NULL }, - {0x8400ad00,"fadd.xxs ",{21,5,XREG} ,{16,5,XREG} ,{0,5,XREG}, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, NULL }, - {0x8400ad40,"fadd.xxx ",{21,5,XREG} ,{16,5,XREG} ,{0,5,XREG}, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, NULL }, - - {0x8400ba80,"fcmp.sdd ",{21,5,REG} ,{16,5,XREG} ,{0,5,XREG}, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, NULL }, - {0x8400ba00,"fcmp.sds ",{21,5,REG} ,{16,5,XREG} ,{0,5,XREG}, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, NULL }, - {0x8400bb00,"fcmp.sdx ",{21,5,REG} ,{16,5,XREG} ,{0,5,XREG}, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, NULL }, - {0x8400b880,"fcmp.ssd ",{21,5,REG} ,{16,5,XREG} ,{0,5,XREG}, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, NULL }, - {0x8400b800,"fcmp.sss ",{21,5,REG} ,{16,5,XREG} ,{0,5,XREG}, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, NULL }, - {0x8400b900,"fcmp.ssx ",{21,5,REG} ,{16,5,XREG} ,{0,5,XREG}, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, NULL }, - {0x8400bc80,"fcmp.sxd ",{21,5,REG} ,{16,5,XREG} ,{0,5,XREG}, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, NULL }, - {0x8400bc00,"fcmp.sxs ",{21,5,REG} ,{16,5,XREG} ,{0,5,XREG}, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, NULL }, - {0x8400bd00,"fcmp.sxx ",{21,5,REG} ,{16,5,XREG} ,{0,5,XREG}, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, NULL }, - - {0x8400baa0,"fcmpu.sdd ",{21,5,REG} ,{16,5,XREG} ,{0,5,XREG}, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, NULL }, - {0x8400ba20,"fcmpu.sds ",{21,5,REG} ,{16,5,XREG} ,{0,5,XREG}, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, NULL }, - {0x8400bb20,"fcmpu.sdx ",{21,5,REG} ,{16,5,XREG} ,{0,5,XREG}, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, NULL }, - {0x8400b8a0,"fcmpu.ssd ",{21,5,REG} ,{16,5,XREG} ,{0,5,XREG}, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, NULL }, - {0x8400b820,"fcmpu.sss ",{21,5,REG} ,{16,5,XREG} ,{0,5,XREG}, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, NULL }, - {0x8400b920,"fcmpu.ssx ",{21,5,REG} ,{16,5,XREG} ,{0,5,XREG}, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, NULL }, - {0x8400bca0,"fcmpu.sxd ",{21,5,REG} ,{16,5,XREG} ,{0,5,XREG}, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, NULL }, - {0x8400bc20,"fcmpu.sxs ",{21,5,REG} ,{16,5,XREG} ,{0,5,XREG}, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, NULL }, - {0x8400bd20,"fcmpu.sxx ",{21,5,REG} ,{16,5,XREG} ,{0,5,XREG}, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, NULL }, - - {0x84000820,"fcvt.sd ",{21,5,REG} ,{0,5,REG} ,NO_OPERAND, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, NULL }, - {0x84000880,"fcvt.ds ",{21,5,REG} ,{0,5,REG} ,NO_OPERAND, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, NULL }, - - {0x84008880,"fcvt.ds ",{21,5,XREG} ,{0,5,XREG} ,NO_OPERAND, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, NULL }, - {0x840088c0,"fcvt.dx ",{21,5,XREG} ,{0,5,XREG} ,NO_OPERAND, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, NULL }, - {0x84008820,"fcvt.sd ",{21,5,XREG} ,{0,5,XREG} ,NO_OPERAND, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, NULL }, - {0x84008840,"fcvt.sx ",{21,5,XREG} ,{0,5,XREG} ,NO_OPERAND, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, NULL }, - {0x84008920,"fcvt.xd ",{21,5,XREG} ,{0,5,XREG} ,NO_OPERAND, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, NULL }, - {0x84008900,"fcvt.xs ",{21,5,XREG} ,{0,5,XREG} ,NO_OPERAND, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, NULL }, - - {0x8400f2a0,"fdiv.ddd ",{21,5,XREG} ,{16,5,XREG} ,{0,5,XREG}, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, NULL }, - {0x8400f280,"fdiv.dds ",{21,5,XREG} ,{16,5,XREG} ,{0,5,XREG}, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, NULL }, - {0x8400f2c0,"fdiv.ddx ",{21,5,XREG} ,{16,5,XREG} ,{0,5,XREG}, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, NULL }, - {0x8400f220,"fdiv.dsd ",{21,5,XREG} ,{16,5,XREG} ,{0,5,XREG}, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, NULL }, - {0x8400f200,"fdiv.dss ",{21,5,XREG} ,{16,5,XREG} ,{0,5,XREG}, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, NULL }, - {0x8400f240,"fdiv.dsx ",{21,5,XREG} ,{16,5,XREG} ,{0,5,XREG}, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, NULL }, - {0x8400f320,"fdiv.dxd ",{21,5,XREG} ,{16,5,XREG} ,{0,5,XREG}, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, NULL }, - {0x8400f300,"fdiv.dxs ",{21,5,XREG} ,{16,5,XREG} ,{0,5,XREG}, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, NULL }, - {0x8400f340,"fdiv.dxx ",{21,5,XREG} ,{16,5,XREG} ,{0,5,XREG}, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, NULL }, - {0x8400f0a0,"fdiv.sdd ",{21,5,XREG} ,{16,5,XREG} ,{0,5,XREG}, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, NULL }, - {0x8400f080,"fdiv.sds ",{21,5,XREG} ,{16,5,XREG} ,{0,5,XREG}, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, NULL }, - {0x8400f0c0,"fdiv.sdx ",{21,5,XREG} ,{16,5,XREG} ,{0,5,XREG}, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, NULL }, - {0x8400f020,"fdiv.ssd ",{21,5,XREG} ,{16,5,XREG} ,{0,5,XREG}, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, NULL }, - {0x8400f000,"fdiv.sss ",{21,5,XREG} ,{16,5,XREG} ,{0,5,XREG}, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, NULL }, - {0x8400f040,"fdiv.ssx ",{21,5,XREG} ,{16,5,XREG} ,{0,5,XREG}, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, NULL }, - {0x8400f120,"fdiv.sxd ",{21,5,XREG} ,{16,5,XREG} ,{0,5,XREG}, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, NULL }, - {0x8400f100,"fdiv.sxs ",{21,5,XREG} ,{16,5,XREG} ,{0,5,XREG}, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, NULL }, - {0x8400f140,"fdiv.sxx ",{21,5,XREG} ,{16,5,XREG} ,{0,5,XREG}, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, NULL }, - {0x8400f4a0,"fdiv.xdd ",{21,5,XREG} ,{16,5,XREG} ,{0,5,XREG}, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, NULL }, - {0x8400f480,"fdiv.xds ",{21,5,XREG} ,{16,5,XREG} ,{0,5,XREG}, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, NULL }, - {0x8400f4c0,"fdiv.xdx ",{21,5,XREG} ,{16,5,XREG} ,{0,5,XREG}, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, NULL }, - {0x8400f420,"fdiv.xsd ",{21,5,XREG} ,{16,5,XREG} ,{0,5,XREG}, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, NULL }, - {0x8400f400,"fdiv.xss ",{21,5,XREG} ,{16,5,XREG} ,{0,5,XREG}, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, NULL }, - {0x8400f440,"fdiv.xsx ",{21,5,XREG} ,{16,5,XREG} ,{0,5,XREG}, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, NULL }, - {0x8400f520,"fdiv.xxd ",{21,5,XREG} ,{16,5,XREG} ,{0,5,XREG}, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, NULL }, - {0x8400f500,"fdiv.xxs ",{21,5,XREG} ,{16,5,XREG} ,{0,5,XREG}, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, NULL }, - {0x8400f540,"fdiv.xxx ",{21,5,XREG} ,{16,5,XREG} ,{0,5,XREG}, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, NULL }, - - {0x84002220,"flt.ds ",{21,5,XREG} ,{0,5,REG} ,NO_OPERAND, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, NULL }, - {0x84002200,"flt.ss ",{21,5,XREG} ,{0,5,REG} ,NO_OPERAND, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, NULL }, - {0x84002240,"flt.xs ",{21,5,XREG} ,{0,5,REG} ,NO_OPERAND, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, NULL }, - - {0x840082a0,"fmul.ddd ",{21,5,XREG} ,{16,5,XREG} ,{0,5,XREG}, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, NULL }, - {0x84008280,"fmul.dds ",{21,5,XREG} ,{16,5,XREG} ,{0,5,XREG}, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, NULL }, - {0x840082c0,"fmul.ddx ",{21,5,XREG} ,{16,5,XREG} ,{0,5,XREG}, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, NULL }, - {0x84008220,"fmul.dsd ",{21,5,XREG} ,{16,5,XREG} ,{0,5,XREG}, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, NULL }, - {0x84008200,"fmul.dss ",{21,5,XREG} ,{16,5,XREG} ,{0,5,XREG}, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, NULL }, - {0x84008240,"fmul.dsx ",{21,5,XREG} ,{16,5,XREG} ,{0,5,XREG}, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, NULL }, - {0x84008320,"fmul.dxd ",{21,5,XREG} ,{16,5,XREG} ,{0,5,XREG}, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, NULL }, - {0x84008300,"fmul.dxs ",{21,5,XREG} ,{16,5,XREG} ,{0,5,XREG}, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, NULL }, - {0x84008340,"fmul.dxx ",{21,5,XREG} ,{16,5,XREG} ,{0,5,XREG}, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, NULL }, - {0x840080a0,"fmul.sdd ",{21,5,XREG} ,{16,5,XREG} ,{0,5,XREG}, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, NULL }, - {0x84008080,"fmul.sds ",{21,5,XREG} ,{16,5,XREG} ,{0,5,XREG}, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, NULL }, - {0x840080c0,"fmul.sdx ",{21,5,XREG} ,{16,5,XREG} ,{0,5,XREG}, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, NULL }, - {0x84008020,"fmul.ssd ",{21,5,XREG} ,{16,5,XREG} ,{0,5,XREG}, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, NULL }, - {0x84008000,"fmul.sss ",{21,5,XREG} ,{16,5,XREG} ,{0,5,XREG}, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, NULL }, - {0x84008040,"fmul.ssx ",{21,5,XREG} ,{16,5,XREG} ,{0,5,XREG}, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, NULL }, - {0x84008120,"fmul.sxd ",{21,5,XREG} ,{16,5,XREG} ,{0,5,XREG}, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, NULL }, - {0x84008100,"fmul.sxs ",{21,5,XREG} ,{16,5,XREG} ,{0,5,XREG}, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, NULL }, - {0x84008140,"fmul.sxx ",{21,5,XREG} ,{16,5,XREG} ,{0,5,XREG}, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, NULL }, - {0x840084a0,"fmul.xdd ",{21,5,XREG} ,{16,5,XREG} ,{0,5,XREG}, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, NULL }, - {0x84008480,"fmul.xds ",{21,5,XREG} ,{16,5,XREG} ,{0,5,XREG}, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, NULL }, - {0x840084c0,"fmul.xdx ",{21,5,XREG} ,{16,5,XREG} ,{0,5,XREG}, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, NULL }, - {0x84008420,"fmul.xsd ",{21,5,XREG} ,{16,5,XREG} ,{0,5,XREG}, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, NULL }, - {0x84008400,"fmul.xss ",{21,5,XREG} ,{16,5,XREG} ,{0,5,XREG}, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, NULL }, - {0x84008440,"fmul.xsx ",{21,5,XREG} ,{16,5,XREG} ,{0,5,XREG}, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, NULL }, - {0x84008520,"fmul.xxd ",{21,5,XREG} ,{16,5,XREG} ,{0,5,XREG}, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, NULL }, - {0x84008500,"fmul.xxs ",{21,5,XREG} ,{16,5,XREG} ,{0,5,XREG}, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, NULL }, - {0x84008540,"fmul.xxx ",{21,5,XREG} ,{16,5,XREG} ,{0,5,XREG}, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, NULL }, - - {0x8400f8a0,"fsqrt.dd ",{21,5,XREG}, {0,5,XREG}, NO_OPERAND, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, NULL }, - {0x8400f880,"fsqrt.ds ",{21,5,XREG}, {0,5,XREG}, NO_OPERAND, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, NULL }, - {0x8400f8c0,"fsqrt.dx ",{21,5,XREG}, {0,5,XREG}, NO_OPERAND, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, NULL }, - {0x8400f820,"fsqrt.sd ",{21,5,XREG}, {0,5,XREG}, NO_OPERAND, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, NULL }, - {0x8400f800,"fsqrt.ss ",{21,5,XREG}, {0,5,XREG}, NO_OPERAND, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, NULL }, - {0x8400f840,"fsqrt.sx ",{21,5,XREG}, {0,5,XREG}, NO_OPERAND, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, NULL }, - {0x8400f920,"fsqrt.xd ",{21,5,XREG}, {0,5,XREG}, NO_OPERAND, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, NULL }, - {0x8400f900,"fsqrt.xs ",{21,5,XREG}, {0,5,XREG}, NO_OPERAND, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, NULL }, - {0x8400f940,"fsqrt.xx ",{21,5,XREG}, {0,5,XREG}, NO_OPERAND, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, NULL }, - - {0x8400b2a0,"fsub.ddd ",{21,5,XREG} ,{16,5,XREG} ,{0,5,XREG}, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, NULL }, - {0x8400b280,"fsub.dds ",{21,5,XREG} ,{16,5,XREG} ,{0,5,XREG}, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, NULL }, - {0x8400b2c0,"fsub.ddx ",{21,5,XREG} ,{16,5,XREG} ,{0,5,XREG}, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, NULL }, - {0x8400b220,"fsub.dsd ",{21,5,XREG} ,{16,5,XREG} ,{0,5,XREG}, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, NULL }, - {0x8400b200,"fsub.dss ",{21,5,XREG} ,{16,5,XREG} ,{0,5,XREG}, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, NULL }, - {0x8400b240,"fsub.dsx ",{21,5,XREG} ,{16,5,XREG} ,{0,5,XREG}, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, NULL }, - {0x8400b320,"fsub.dxd ",{21,5,XREG} ,{16,5,XREG} ,{0,5,XREG}, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, NULL }, - {0x8400b300,"fsub.dxs ",{21,5,XREG} ,{16,5,XREG} ,{0,5,XREG}, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, NULL }, - {0x8400b340,"fsub.dxx ",{21,5,XREG} ,{16,5,XREG} ,{0,5,XREG}, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, NULL }, - {0x8400b0a0,"fsub.sdd ",{21,5,XREG} ,{16,5,XREG} ,{0,5,XREG}, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, NULL }, - {0x8400b080,"fsub.sds ",{21,5,XREG} ,{16,5,XREG} ,{0,5,XREG}, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, NULL }, - {0x8400b0c0,"fsub.sdx ",{21,5,XREG} ,{16,5,XREG} ,{0,5,XREG}, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, NULL }, - {0x8400b020,"fsub.ssd ",{21,5,XREG} ,{16,5,XREG} ,{0,5,XREG}, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, NULL }, - {0x8400b000,"fsub.sss ",{21,5,XREG} ,{16,5,XREG} ,{0,5,XREG}, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, NULL }, - {0x8400b040,"fsub.ssx ",{21,5,XREG} ,{16,5,XREG} ,{0,5,XREG}, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, NULL }, - {0x8400b120,"fsub.sxd ",{21,5,XREG} ,{16,5,XREG} ,{0,5,XREG}, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, NULL }, - {0x8400b100,"fsub.sxs ",{21,5,XREG} ,{16,5,XREG} ,{0,5,XREG}, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, NULL }, - {0x8400b140,"fsub.sxx ",{21,5,XREG} ,{16,5,XREG} ,{0,5,XREG}, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, NULL }, - {0x8400b4a0,"fsub.xdd ",{21,5,XREG} ,{16,5,XREG} ,{0,5,XREG}, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, NULL }, - {0x8400b480,"fsub.xds ",{21,5,XREG} ,{16,5,XREG} ,{0,5,XREG}, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, NULL }, - {0x8400b4c0,"fsub.xdx ",{21,5,XREG} ,{16,5,XREG} ,{0,5,XREG}, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, NULL }, - {0x8400b420,"fsub.xsd ",{21,5,XREG} ,{16,5,XREG} ,{0,5,XREG}, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, NULL }, - {0x8400b400,"fsub.xss ",{21,5,XREG} ,{16,5,XREG} ,{0,5,XREG}, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, NULL }, - {0x8400b440,"fsub.xsx ",{21,5,XREG} ,{16,5,XREG} ,{0,5,XREG}, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, NULL }, - {0x8400b520,"fsub.xxd ",{21,5,XREG} ,{16,5,XREG} ,{0,5,XREG}, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, NULL }, - {0x8400b500,"fsub.xxs ",{21,5,XREG} ,{16,5,XREG} ,{0,5,XREG}, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, NULL }, - {0x8400b540,"fsub.xxx ",{21,5,XREG} ,{16,5,XREG} ,{0,5,XREG}, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, NULL }, - - {0x8400fc00,"illop", {0,2,DEC}, NO_OPERAND, NO_OPERAND, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, NULL }, - - {0x8400c800,"int.ss ", {21,5,REG}, {0,5,XREG}, NO_OPERAND, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, NULL }, - {0x8400c880,"int.sd ", {21,5,REG}, {0,5,XREG}, NO_OPERAND, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, NULL }, - {0x8400c900,"int.sx ", {21,5,REG}, {0,5,XREG}, NO_OPERAND, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, NULL }, - - {0x04000000,"ld ", {21,5,XREG}, {16,5,REG}, {0,16,HEX}, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, NULL }, - {0x00000000,"ld.d ", {21,5,XREG}, {16,5,REG}, {0,16,HEX}, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, NULL }, - {0x3c000000,"ld.x ", {21,5,XREG}, {16,5,REG}, {0,16,HEX}, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, NULL }, - - {0xf0001400,"ld ", {21,5,XREG}, {16,5,REG}, {0,5,REG}, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, NULL }, - {0xf0001000,"ld.d ", {21,5,XREG}, {16,5,REG}, {0,5,REG}, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, NULL }, - {0xf0001800,"ld.x ", {21,5,XREG}, {16,5,REG}, {0,5,REG}, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, NULL }, - {0xf0001500,"ld.usr ", {21,5,XREG}, {16,5,REG}, {0,5,REG}, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, NULL }, - {0xf0001100,"ld.d.usr ", {21,5,XREG}, {16,5,REG}, {0,5,REG}, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, NULL }, - {0xf0001900,"ld.x.usr ", {21,5,XREG}, {16,5,REG}, {0,5,REG}, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, NULL }, - - {0xf0001600,"ld ", {21,5,XREG}, {16,5,REG}, {0,5,REGSC}, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, NULL }, - {0xf0001200,"ld.d ", {21,5,XREG}, {16,5,REG}, {0,5,REGSC}, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, NULL }, - {0xf0001a00,"ld.x ", {21,5,XREG}, {16,5,REG}, {0,5,REGSC}, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, NULL }, - {0xf0001700,"ld.usr ", {21,5,XREG}, {16,5,REG}, {0,5,REGSC}, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, NULL }, - {0xf0001300,"ld.d.usr ", {21,5,XREG}, {16,5,REG}, {0,5,REGSC}, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, NULL }, - {0xf0001b00,"ld.x.usr ", {21,5,XREG}, {16,5,REG}, {0,5,REGSC}, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, NULL }, - - {0x8400c000,"mov.s ", {21,5,REG}, {0,5,XREG}, NO_OPERAND, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, NULL }, - {0x8400c080,"mov.d ", {21,5,REG}, {0,5,XREG}, NO_OPERAND, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, NULL }, - {0x84004200,"mov.s ", {21,5,XREG}, {0,5,REG}, NO_OPERAND, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, NULL }, - {0x84004280,"mov.d ", {21,5,XREG}, {0,5,REG}, NO_OPERAND, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, NULL }, - {0x8400c300,"mov ", {21,5,XREG}, {0,5,XREG}, NO_OPERAND, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, NULL }, - - {0xf4006d00,"mulu.d ", {21,5,REG}, {16,5,REG}, {0,5,REG}, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, NULL }, - - {0x8400d080,"nint.sd ", {21,5,REG}, {0,5,XREG}, NO_OPERAND, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, NULL }, - {0x8400d000,"nint.ss ", {21,5,REG}, {0,5,XREG}, NO_OPERAND, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, NULL }, - {0x8400d100,"nint.sx ", {21,5,REG}, {0,5,XREG}, NO_OPERAND, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, NULL }, - - {0x88002020,"padd.b ", {21,5,REG}, {16,5,REG}, {0,5,REG}, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, NULL }, - {0x88002040,"padd.h ", {21,5,REG}, {16,5,REG}, {0,5,REG}, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, NULL }, - {0x88002060,"padd ", {21,5,REG}, {16,5,REG}, {0,5,REG}, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, NULL }, - - {0x880021e0,"padds.s ", {21,5,REG}, {16,5,REG}, {0,5,REG}, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, NULL }, - {0x880021a0,"padds.s.b ", {21,5,REG}, {16,5,REG}, {0,5,REG}, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, NULL }, - {0x880021c0,"padds.s.h ", {21,5,REG}, {16,5,REG}, {0,5,REG}, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, NULL }, - {0x880020e0,"padds.u ", {21,5,REG}, {16,5,REG}, {0,5,REG}, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, NULL }, - {0x880020a0,"padds.u.b ", {21,5,REG}, {16,5,REG}, {0,5,REG}, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, NULL }, - {0x880020c0,"padds.u.h ", {21,5,REG}, {16,5,REG}, {0,5,REG}, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, NULL }, - {0x88002160,"padds.us ", {21,5,REG}, {16,5,REG}, {0,5,REG}, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, NULL }, - {0x88002120,"padds.us.b ", {21,5,REG}, {16,5,REG}, {0,5,REG}, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, NULL }, - {0x88002140,"padds.us.h ", {21,5,REG}, {16,5,REG}, {0,5,REG}, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, NULL }, - - {0x88003860,"pcmp ", {21,5,REG}, {16,5,REG}, {0,5,REG}, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, NULL }, - - {0x88000000,"pmul ", {21,5,REG}, {16,5,REG}, {0,5,REG}, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, NULL }, - - {0x88006260,"ppack.16 ", {21,5,REG}, {16,5,REG}, {0,5,REG}, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, NULL }, - {0x88006240,"ppack.16.h ", {21,5,REG}, {16,5,REG}, {0,5,REG}, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, NULL }, - {0x88006460,"ppack.32 ", {21,5,REG}, {16,5,REG}, {0,5,REG}, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, NULL }, - {0x88006420,"ppack.32.b ", {21,5,REG}, {16,5,REG}, {0,5,REG}, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, NULL }, - {0x88006440,"ppack.32.h ", {21,5,REG}, {16,5,REG}, {0,5,REG}, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, NULL }, - {0x88006160,"ppack.8 ", {21,5,REG}, {16,5,REG}, {0,5,REG}, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, NULL }, - - {0x88007200,"prot ", {21,5,REG}, {16,5,REG}, {5,6,HEX}, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, NULL }, - {0x88007800,"prot ", {21,5,REG}, {16,5,REG}, {0,5,REG}, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, NULL }, - - {0x88003020,"psub.b ", {21,5,REG}, {16,5,REG}, {0,5,REG}, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, NULL }, - {0x88003040,"psub.h ", {21,5,REG}, {16,5,REG}, {0,5,REG}, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, NULL }, - {0x88003060,"psub ", {21,5,REG}, {16,5,REG}, {0,5,REG}, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, NULL }, - - {0x880031e0,"psubs.s ", {21,5,REG}, {16,5,REG}, {0,5,REG}, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, NULL }, - {0x880031a0,"psubs.s.b ", {21,5,REG}, {16,5,REG}, {0,5,REG}, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, NULL }, - {0x880031c0,"psubs.s.h ", {21,5,REG}, {16,5,REG}, {0,5,REG}, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, NULL }, - {0x880030e0,"psubs.u ", {21,5,REG}, {16,5,REG}, {0,5,REG}, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, NULL }, - {0x880030a0,"psubs.u.b ", {21,5,REG}, {16,5,REG}, {0,5,REG}, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, NULL }, - {0x880030c0,"psubs.u.h ", {21,5,REG}, {16,5,REG}, {0,5,REG}, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, NULL }, - {0x88003160,"psubs.us ", {21,5,REG}, {16,5,REG}, {0,5,REG}, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, NULL }, - {0x88003120,"psubs.us.b ", {21,5,REG}, {16,5,REG}, {0,5,REG}, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, NULL }, - {0x88003140,"psubs.us.h ", {21,5,REG}, {16,5,REG}, {0,5,REG}, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, NULL }, - - {0x88006800,"punpk.n ", {21,5,REG}, {16,5,REG}, NO_OPERAND, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, NULL }, - {0x88006820,"punpk.b ", {21,5,REG}, {16,5,REG}, NO_OPERAND, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, NULL }, - - {0x34000000,"st ", {21,5,XREG}, {16,5,REG}, {0,16,HEX}, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, NULL }, - {0x30000000,"st.d ", {21,5,XREG}, {16,5,REG}, {0,16,HEX}, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, NULL }, - {0x38000000,"st.x ", {21,5,XREG}, {16,5,REG}, {0,16,HEX}, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, NULL }, - - {0xf4002c80,"st.b.wt ", {21,5,REG}, {16,5,REG}, {0,5,REG}, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, NULL }, - {0xf4002880,"st.h.wt ", {21,5,REG}, {16,5,REG}, {0,5,REG}, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, NULL }, - {0xf4002480,"st.wt ", {21,5,REG}, {16,5,REG}, {0,5,REG}, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, NULL }, - {0xf4002080,"st.d.wt ", {21,5,REG}, {16,5,REG}, {0,5,REG}, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, NULL }, - {0xf4002d80,"st.b.usr.wt ", {21,5,REG}, {16,5,REG}, {0,5,REG}, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, NULL }, - {0xf4002980,"st.h.usr.wt ", {21,5,REG}, {16,5,REG}, {0,5,REG}, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, NULL }, - {0xf4002580,"st.usr.wt ", {21,5,REG}, {16,5,REG}, {0,5,REG}, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, NULL }, - {0xf4002180,"st.d.usr.wt ", {21,5,REG}, {16,5,REG}, {0,5,REG}, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, NULL }, - - {0xf0002400,"st ", {21,5,XREG}, {16,5,REG}, {0,5,REG}, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, NULL }, - {0xf0002000,"st.d ", {21,5,XREG}, {16,5,REG}, {0,5,REG}, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, NULL }, - {0xf0002100,"st.d.usr ", {21,5,XREG}, {16,5,REG}, {0,5,REG}, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, NULL }, - {0xf0002180,"st.d.usr.wt ", {21,5,XREG}, {16,5,REG}, {0,5,REG}, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, NULL }, - {0xf0002080,"st.d.wt ", {21,5,XREG}, {16,5,REG}, {0,5,REG}, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, NULL }, - {0xf0002500,"st.usr ", {21,5,XREG}, {16,5,REG}, {0,5,REG}, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, NULL }, - {0xf0002580,"st.usr.wt ", {21,5,XREG}, {16,5,REG}, {0,5,REG}, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, NULL }, - {0xf0002480,"st.wt ", {21,5,XREG}, {16,5,REG}, {0,5,REG}, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, NULL }, - {0xf0002800,"st.x ", {21,5,XREG}, {16,5,REG}, {0,5,REG}, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, NULL }, - {0xf0002900,"st.x.usr ", {21,5,XREG}, {16,5,REG}, {0,5,REG}, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, NULL }, - {0xf0002980,"st.x.usr.wt ", {21,5,XREG}, {16,5,REG}, {0,5,REG}, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, NULL }, - {0xf0002880,"st.x.wt ", {21,5,XREG}, {16,5,REG}, {0,5,REG}, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, NULL }, - - {0xf4002f80,"st.b.usr.wt ", {21,5,REG}, {16,5,REG}, {0,5,REGSC}, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, NULL }, - {0xf4002e80,"st.b.wt ", {21,5,REG}, {16,5,REG}, {0,5,REGSC}, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, NULL }, - {0xf4002380,"st.d.usr.wt ", {21,5,REG}, {16,5,REG}, {0,5,REGSC}, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, NULL }, - {0xf4002280,"st.d.wt ", {21,5,REG}, {16,5,REG}, {0,5,REGSC}, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, NULL }, - {0xf4002b80,"st.h.usr.wt ", {21,5,REG}, {16,5,REG}, {0,5,REGSC}, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, NULL }, - {0xf4002a80,"st.h.wt ", {21,5,REG}, {16,5,REG}, {0,5,REGSC}, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, NULL }, - {0xf4002780,"st.usr.wt ", {21,5,REG}, {16,5,REG}, {0,5,REGSC}, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, NULL }, - {0xf4002680,"st.wt ", {21,5,REG}, {16,5,REG}, {0,5,REGSC}, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, NULL }, - - {0xf0002600,"st ", {21,5,XREG}, {16,5,REG}, {0,5,REGSC}, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, NULL }, - {0xf0002200,"st.d ", {21,5,XREG}, {16,5,REG}, {0,5,REGSC}, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, NULL }, - {0xf0002300,"st.d.usr ", {21,5,XREG}, {16,5,REG}, {0,5,REGSC}, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, NULL }, - {0xf0002380,"st.d.usr.wt ", {21,5,XREG}, {16,5,REG}, {0,5,REGSC}, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, NULL }, - {0xf0002280,"st.d.wt ", {21,5,XREG}, {16,5,REG}, {0,5,REGSC}, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, NULL }, - {0xf0002700,"st.usr ", {21,5,XREG}, {16,5,REG}, {0,5,REGSC}, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, NULL }, - {0xf0002780,"st.usr.wt ", {21,5,XREG}, {16,5,REG}, {0,5,REGSC}, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, NULL }, - {0xf0002680,"st.wt ", {21,5,XREG}, {16,5,REG}, {0,5,REGSC}, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, NULL }, - {0xf0002a00,"st.x ", {21,5,XREG}, {16,5,REG}, {0,5,REGSC}, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, NULL }, - {0xf0002b00,"st.x.usr ", {21,5,XREG}, {16,5,REG}, {0,5,REGSC}, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, NULL }, - {0xf0002b80,"st.x.usr.wt ", {21,5,XREG}, {16,5,REG}, {0,5,REGSC}, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, NULL }, - {0xf0002a80,"st.x.wt ", {21,5,XREG}, {16,5,REG}, {0,5,REGSC}, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, NULL }, - - {0x8400d880,"trnc.sd ", {21,5,REG}, {0,5,XREG}, NO_OPERAND, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, NULL }, - {0x8400d800,"trnc.ss ", {21,5,REG}, {0,5,XREG}, NO_OPERAND, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, NULL }, - {0x8400d900,"trnc.sx ", {21,5,REG}, {0,5,XREG}, NO_OPERAND, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, NULL }, - -}; - -/* - * Local Variables: - * fill-column: 131 - * End: - */ diff --git a/contrib/gdb/include/opcode/mips.h b/contrib/gdb/include/opcode/mips.h deleted file mode 100644 index 14ceec96119ac..0000000000000 --- a/contrib/gdb/include/opcode/mips.h +++ /dev/null @@ -1,481 +0,0 @@ -/* mips.h. Mips opcode list for GDB, the GNU debugger. - Copyright 1993, 1995 Free Software Foundation, Inc. - Contributed by Ralph Campbell and OSF - Commented and modified by Ian Lance Taylor, Cygnus Support - -This file is part of GDB, GAS, and the GNU binutils. - -GDB, GAS, and the GNU binutils are free software; you can redistribute -them and/or modify them 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. - -GDB, GAS, and the GNU binutils are distributed in the hope that they -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 file; see the file COPYING. If not, write to the Free -Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ - -/* These are bit masks and shift counts to use to access the various - fields of an instruction. To retrieve the X field of an - instruction, use the expression - (i >> OP_SH_X) & OP_MASK_X - To set the same field (to j), use - i = (i &~ (OP_MASK_X << OP_SH_X)) | (j << OP_SH_X) - - Make sure you use fields that are appropriate for the instruction, - of course. - - The 'i' format uses OP, RS, RT and IMMEDIATE. - - The 'j' format uses OP and TARGET. - - The 'r' format uses OP, RS, RT, RD, SHAMT and FUNCT. - - The 'b' format uses OP, RS, RT and DELTA. - - The floating point 'i' format uses OP, RS, RT and IMMEDIATE. - - The floating point 'r' format uses OP, FMT, FT, FS, FD and FUNCT. - - A breakpoint instruction uses OP, CODE and SPEC (10 bits of the - breakpoint instruction are not defined; Kane says the breakpoint - code field in BREAK is 20 bits; yet MIPS assemblers and debuggers - only use ten bits). - - The syscall instruction uses SYSCALL. - - The general coprocessor instructions use COPZ. */ - -#define OP_MASK_OP 0x3f -#define OP_SH_OP 26 -#define OP_MASK_RS 0x1f -#define OP_SH_RS 21 -#define OP_MASK_FR 0x1f -#define OP_SH_FR 21 -#define OP_MASK_FMT 0x1f -#define OP_SH_FMT 21 -#define OP_MASK_BCC 0x7 -#define OP_SH_BCC 18 -#define OP_MASK_CODE 0x3ff -#define OP_SH_CODE 16 -#define OP_MASK_RT 0x1f -#define OP_SH_RT 16 -#define OP_MASK_FT 0x1f -#define OP_SH_FT 16 -#define OP_MASK_CACHE 0x1f -#define OP_SH_CACHE 16 -#define OP_MASK_RD 0x1f -#define OP_SH_RD 11 -#define OP_MASK_FS 0x1f -#define OP_SH_FS 11 -#define OP_MASK_PREFX 0x1f -#define OP_SH_PREFX 11 -#define OP_MASK_CCC 0x7 -#define OP_SH_CCC 8 -#define OP_MASK_SYSCALL 0xfffff -#define OP_SH_SYSCALL 6 -#define OP_MASK_SHAMT 0x1f -#define OP_SH_SHAMT 6 -#define OP_MASK_FD 0x1f -#define OP_SH_FD 6 -#define OP_MASK_TARGET 0x3ffffff -#define OP_SH_TARGET 0 -#define OP_MASK_COPZ 0x1ffffff -#define OP_SH_COPZ 0 -#define OP_MASK_IMMEDIATE 0xffff -#define OP_SH_IMMEDIATE 0 -#define OP_MASK_DELTA 0xffff -#define OP_SH_DELTA 0 -#define OP_MASK_FUNCT 0x3f -#define OP_SH_FUNCT 0 -#define OP_MASK_SPEC 0x3f -#define OP_SH_SPEC 0 - -/* This structure holds information for a particular instruction. */ - -struct mips_opcode -{ - /* The name of the instruction. */ - const char *name; - /* A string describing the arguments for this instruction. */ - const char *args; - /* The basic opcode for the instruction. When assembling, this - opcode is modified by the arguments to produce the actual opcode - that is used. If pinfo is INSN_MACRO, then this is instead the - ISA level of the macro (0 or 1 is always supported, 2 is ISA 2, - etc.). */ - unsigned long match; - /* If pinfo is not INSN_MACRO, then this is a bit mask for the - relevant portions of the opcode when disassembling. If the - actual opcode anded with the match field equals the opcode field, - then we have found the correct instruction. If pinfo is - INSN_MACRO, then this field is the macro identifier. */ - unsigned long mask; - /* For a macro, this is INSN_MACRO. Otherwise, it is a collection - of bits describing the instruction, notably any relevant hazard - information. */ - unsigned long pinfo; -}; - -/* These are the characters which may appears in the args field of an - instruction. They appear in the order in which the fields appear - when the instruction is used. Commas and parentheses in the args - string are ignored when assembling, and written into the output - when disassembling. - - Each of these characters corresponds to a mask field defined above. - - "<" 5 bit shift amount (OP_*_SHAMT) - ">" shift amount between 32 and 63, stored after subtracting 32 (OP_*_SHAMT) - "a" 26 bit target address (OP_*_TARGET) - "b" 5 bit base register (OP_*_RS) - "c" 10 bit breakpoint code (OP_*_CODE) - "d" 5 bit destination register specifier (OP_*_RD) - "h" 5 bit prefx hint (OP_*_PREFX) - "i" 16 bit unsigned immediate (OP_*_IMMEDIATE) - "j" 16 bit signed immediate (OP_*_DELTA) - "k" 5 bit cache opcode in target register position (OP_*_CACHE) - "o" 16 bit signed offset (OP_*_DELTA) - "p" 16 bit PC relative branch target address (OP_*_DELTA) - "r" 5 bit same register used as both source and target (OP_*_RS) - "s" 5 bit source register specifier (OP_*_RS) - "t" 5 bit target register (OP_*_RT) - "u" 16 bit upper 16 bits of address (OP_*_IMMEDIATE) - "v" 5 bit same register used as both source and destination (OP_*_RS) - "w" 5 bit same register used as both target and destination (OP_*_RT) - "C" 25 bit coprocessor function code (OP_*_COPZ) - "B" 20 bit syscall function code (OP_*_SYSCALL) - "x" accept and ignore register name - "z" must be zero register - - Floating point instructions: - "D" 5 bit destination register (OP_*_FD) - "M" 3 bit compare condition code (OP_*_CCC) (only used for mips4 and up) - "N" 3 bit branch condition code (OP_*_BCC) (only used for mips4 and up) - "S" 5 bit fs source 1 register (OP_*_FS) - "T" 5 bit ft source 2 register (OP_*_FT) - "R" 5 bit fr source 3 register (OP_*_FR) - "V" 5 bit same register used as floating source and destination (OP_*_FS) - "W" 5 bit same register used as floating target and destination (OP_*_FT) - - Coprocessor instructions: - "E" 5 bit target register (OP_*_RT) - "G" 5 bit destination register (OP_*_RD) - - Macro instructions: - "A" General 32 bit expression - "I" 32 bit immediate - "F" 64 bit floating point constant in .rdata - "L" 64 bit floating point constant in .lit8 - "f" 32 bit floating point constant - "l" 32 bit floating point constant in .lit4 -*/ - -/* These are the bits which may be set in the pinfo field of an - instructions, if it is not equal to INSN_MACRO. */ - -/* Modifies the general purpose register in OP_*_RD. */ -#define INSN_WRITE_GPR_D 0x00000001 -/* Modifies the general purpose register in OP_*_RT. */ -#define INSN_WRITE_GPR_T 0x00000002 -/* Modifies general purpose register 31. */ -#define INSN_WRITE_GPR_31 0x00000004 -/* Modifies the floating point register in OP_*_FD. */ -#define INSN_WRITE_FPR_D 0x00000008 -/* Modifies the floating point register in OP_*_FS. */ -#define INSN_WRITE_FPR_S 0x00000010 -/* Modifies the floating point register in OP_*_FT. */ -#define INSN_WRITE_FPR_T 0x00000020 -/* Reads the general purpose register in OP_*_RS. */ -#define INSN_READ_GPR_S 0x00000040 -/* Reads the general purpose register in OP_*_RT. */ -#define INSN_READ_GPR_T 0x00000080 -/* Reads the floating point register in OP_*_FS. */ -#define INSN_READ_FPR_S 0x00000100 -/* Reads the floating point register in OP_*_FT. */ -#define INSN_READ_FPR_T 0x00000200 -/* Reads the floating point register in OP_*_FR. */ -#define INSN_READ_FPR_R 0x00000400 -/* Modifies coprocessor condition code. */ -#define INSN_WRITE_COND_CODE 0x00000800 -/* Reads coprocessor condition code. */ -#define INSN_READ_COND_CODE 0x00001000 -/* TLB operation. */ -#define INSN_TLB 0x00002000 -/* Reads coprocessor register other than floating point register. */ -#define INSN_COP 0x00004000 -/* Instruction loads value from memory, requiring delay. */ -#define INSN_LOAD_MEMORY_DELAY 0x00008000 -/* Instruction loads value from coprocessor, requiring delay. */ -#define INSN_LOAD_COPROC_DELAY 0x00010000 -/* Instruction has unconditional branch delay slot. */ -#define INSN_UNCOND_BRANCH_DELAY 0x00020000 -/* Instruction has conditional branch delay slot. */ -#define INSN_COND_BRANCH_DELAY 0x00040000 -/* Conditional branch likely: if branch not taken, insn nullified. */ -#define INSN_COND_BRANCH_LIKELY 0x00080000 -/* Moves to coprocessor register, requiring delay. */ -#define INSN_COPROC_MOVE_DELAY 0x00100000 -/* Loads coprocessor register from memory, requiring delay. */ -#define INSN_COPROC_MEMORY_DELAY 0x00200000 -/* Reads the HI register. */ -#define INSN_READ_HI 0x00400000 -/* Reads the LO register. */ -#define INSN_READ_LO 0x00800000 -/* Modifies the HI register. */ -#define INSN_WRITE_HI 0x01000000 -/* Modifies the LO register. */ -#define INSN_WRITE_LO 0x02000000 -/* Takes a trap (easier to keep out of delay slot). */ -#define INSN_TRAP 0x04000000 -/* Instruction stores value into memory. */ -#define INSN_STORE_MEMORY 0x08000000 -/* MIPS ISA field--CPU level at which insn is supported. */ -#define INSN_ISA 0x70000000 -/* MIPS ISA 2 instruction (R6000 or R4000). */ -#define INSN_ISA2 0x10000000 -/* MIPS ISA 3 instruction (R4000). */ -#define INSN_ISA3 0x20000000 -/* MIPS R4650 instruction. */ -#define INSN_4650 0x30000000 -/* MIPS ISA 4 instruction (R8000). */ -#define INSN_ISA4 0x40000000 -/* LSI R4010 instruction. */ -#define INSN_4010 0x50000000 -/* NEC VR4100 instruction. */ -#define INSN_4100 0x60000000 - -/* Instruction is actually a macro. It should be ignored by the - disassembler, and requires special treatment by the assembler. */ -#define INSN_MACRO 0xffffffff - -/* This is a list of macro expanded instructions. - * - * _I appended means immediate - * _A appended means address - * _AB appended means address with base register - * _D appended means 64 bit floating point constant - * _S appended means 32 bit floating point constant - */ -enum { - M_ABS, - M_ADD_I, - M_ADDU_I, - M_AND_I, - M_BEQ_I, - M_BEQL_I, - M_BGE, - M_BGEL, - M_BGE_I, - M_BGEL_I, - M_BGEU, - M_BGEUL, - M_BGEU_I, - M_BGEUL_I, - M_BGT, - M_BGTL, - M_BGT_I, - M_BGTL_I, - M_BGTU, - M_BGTUL, - M_BGTU_I, - M_BGTUL_I, - M_BLE, - M_BLEL, - M_BLE_I, - M_BLEL_I, - M_BLEU, - M_BLEUL, - M_BLEU_I, - M_BLEUL_I, - M_BLT, - M_BLTL, - M_BLT_I, - M_BLTL_I, - M_BLTU, - M_BLTUL, - M_BLTU_I, - M_BLTUL_I, - M_BNE_I, - M_BNEL_I, - M_DABS, - M_DADD_I, - M_DADDU_I, - M_DDIV_3, - M_DDIV_3I, - M_DDIVU_3, - M_DDIVU_3I, - M_DIV_3, - M_DIV_3I, - M_DIVU_3, - M_DIVU_3I, - M_DLA_AB, - M_DLI, - M_DMUL, - M_DMUL_I, - M_DMULO, - M_DMULO_I, - M_DMULOU, - M_DMULOU_I, - M_DREM_3, - M_DREM_3I, - M_DREMU_3, - M_DREMU_3I, - M_DSUB_I, - M_DSUBU_I, - M_J_A, - M_JAL_1, - M_JAL_2, - M_JAL_A, - M_L_DOB, - M_L_DAB, - M_LA_AB, - M_LB_A, - M_LB_AB, - M_LBU_A, - M_LBU_AB, - M_LD_A, - M_LD_OB, - M_LD_AB, - M_LDC1_AB, - M_LDC2_AB, - M_LDC3_AB, - M_LDL_AB, - M_LDR_AB, - M_LH_A, - M_LH_AB, - M_LHU_A, - M_LHU_AB, - M_LI, - M_LI_D, - M_LI_DD, - M_LI_S, - M_LI_SS, - M_LL_AB, - M_LLD_AB, - M_LS_A, - M_LW_A, - M_LW_AB, - M_LWC0_A, - M_LWC0_AB, - M_LWC1_A, - M_LWC1_AB, - M_LWC2_A, - M_LWC2_AB, - M_LWC3_A, - M_LWC3_AB, - M_LWL_A, - M_LWL_AB, - M_LWR_A, - M_LWR_AB, - M_LWU_AB, - M_MUL, - M_MUL_I, - M_MULO, - M_MULO_I, - M_MULOU, - M_MULOU_I, - M_NOR_I, - M_OR_I, - M_REM_3, - M_REM_3I, - M_REMU_3, - M_REMU_3I, - M_ROL, - M_ROL_I, - M_ROR, - M_ROR_I, - M_S_DA, - M_S_DOB, - M_S_DAB, - M_S_S, - M_SC_AB, - M_SCD_AB, - M_SD_A, - M_SD_OB, - M_SD_AB, - M_SDC1_AB, - M_SDC2_AB, - M_SDC3_AB, - M_SDL_AB, - M_SDR_AB, - M_SEQ, - M_SEQ_I, - M_SGE, - M_SGE_I, - M_SGEU, - M_SGEU_I, - M_SGT, - M_SGT_I, - M_SGTU, - M_SGTU_I, - M_SLE, - M_SLE_I, - M_SLEU, - M_SLEU_I, - M_SLT_I, - M_SLTU_I, - M_SNE, - M_SNE_I, - M_SB_A, - M_SB_AB, - M_SH_A, - M_SH_AB, - M_SW_A, - M_SW_AB, - M_SWC0_A, - M_SWC0_AB, - M_SWC1_A, - M_SWC1_AB, - M_SWC2_A, - M_SWC2_AB, - M_SWC3_A, - M_SWC3_AB, - M_SWL_A, - M_SWL_AB, - M_SWR_A, - M_SWR_AB, - M_SUB_I, - M_SUBU_I, - M_TEQ_I, - M_TGE_I, - M_TGEU_I, - M_TLT_I, - M_TLTU_I, - M_TNE_I, - M_TRUNCWD, - M_TRUNCWS, - M_ULD, - M_ULD_A, - M_ULH, - M_ULH_A, - M_ULHU, - M_ULHU_A, - M_ULW, - M_ULW_A, - M_USH, - M_USH_A, - M_USW, - M_USW_A, - M_USD, - M_USD_A, - M_XOR_I -}; - -/* The order of overloaded instructions matters. Label arguments and - register arguments look the same. Instructions that can have either - for arguments must apear in the correct order in this table for the - assembler to pick the right one. In other words, entries with - immediate operands must apear after the same instruction with - registers. - - Many instructions are short hand for other instructions (i.e., The - jal <register> instruction is short for jalr <register>). */ - -extern const struct mips_opcode mips_opcodes[]; -extern const int bfd_mips_num_opcodes; -#define NUMOPCODES bfd_mips_num_opcodes diff --git a/contrib/gdb/include/opcode/np1.h b/contrib/gdb/include/opcode/np1.h deleted file mode 100644 index d23adc7566cf5..0000000000000 --- a/contrib/gdb/include/opcode/np1.h +++ /dev/null @@ -1,422 +0,0 @@ -/* Print GOULD NPL instructions for GDB, the GNU debugger. - Copyright (C) 1986, 1987, 1989 Free Software Foundation, Inc. - -This file is part of GDB. - -GDB 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. - -GDB 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 GDB; see the file COPYING. If not, write to -the Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ - -struct gld_opcode -{ - char *name; - unsigned long opcode; - unsigned long mask; - char *args; - int length; -}; - -/* We store four bytes of opcode for all opcodes because that - is the most any of them need. The actual length of an instruction - is always at least 2 bytes, and at most four. The length of the - instruction is based on the opcode. - - The mask component is a mask saying which bits must match - particular opcode in order for an instruction to be an instance - of that opcode. - - The args component is a string containing characters - that are used to format the arguments to the instruction. */ - -/* Kinds of operands: - r Register in first field - R Register in second field - b Base register in first field - B Base register in second field - v Vector register in first field - V Vector register in first field - A Optional address register (base register) - X Optional index register - I Immediate data (16bits signed) - O Offset field (16bits signed) - h Offset field (15bits signed) - d Offset field (14bits signed) - S Shift count field - - any other characters are printed as is... -*/ - -/* The assembler requires that this array be sorted as follows: - all instances of the same mnemonic must be consecutive. - All instances of the same mnemonic with the same number of operands - must be consecutive. - */ -struct gld_opcode gld_opcodes[] = -{ -{ "lb", 0xb4080000, 0xfc080000, "r,xOA,X", 4 }, -{ "lnb", 0xb8080000, 0xfc080000, "r,xOA,X", 4 }, -{ "lbs", 0xec080000, 0xfc080000, "r,xOA,X", 4 }, -{ "lh", 0xb4000001, 0xfc080001, "r,xOA,X", 4 }, -{ "lnh", 0xb8000001, 0xfc080001, "r,xOA,X", 4 }, -{ "lw", 0xb4000000, 0xfc080000, "r,xOA,X", 4 }, -{ "lnw", 0xb8000000, 0xfc080000, "r,xOA,X", 4 }, -{ "ld", 0xb4000002, 0xfc080002, "r,xOA,X", 4 }, -{ "lnd", 0xb8000002, 0xfc080002, "r,xOA,X", 4 }, -{ "li", 0xf8000000, 0xfc7f0000, "r,I", 4 }, -{ "lpa", 0x50080000, 0xfc080000, "r,xOA,X", 4 }, -{ "la", 0x50000000, 0xfc080000, "r,xOA,X", 4 }, -{ "labr", 0x58080000, 0xfc080000, "b,xOA,X", 4 }, -{ "lbp", 0x90080000, 0xfc080000, "r,xOA,X", 4 }, -{ "lhp", 0x90000001, 0xfc080001, "r,xOA,X", 4 }, -{ "lwp", 0x90000000, 0xfc080000, "r,xOA,X", 4 }, -{ "ldp", 0x90000002, 0xfc080002, "r,xOA,X", 4 }, -{ "suabr", 0x58000000, 0xfc080000, "b,xOA,X", 4 }, -{ "lf", 0xbc000000, 0xfc080000, "r,xOA,X", 4 }, -{ "lfbr", 0xbc080000, 0xfc080000, "b,xOA,X", 4 }, -{ "lwbr", 0x5c000000, 0xfc080000, "b,xOA,X", 4 }, -{ "stb", 0xd4080000, 0xfc080000, "r,xOA,X", 4 }, -{ "sth", 0xd4000001, 0xfc080001, "r,xOA,X", 4 }, -{ "stw", 0xd4000000, 0xfc080000, "r,xOA,X", 4 }, -{ "std", 0xd4000002, 0xfc080002, "r,xOA,X", 4 }, -{ "stf", 0xdc000000, 0xfc080000, "r,xOA,X", 4 }, -{ "stfbr", 0xdc080000, 0xfc080000, "b,xOA,X", 4 }, -{ "stwbr", 0x54000000, 0xfc080000, "b,xOA,X", 4 }, -{ "zmb", 0xd8080000, 0xfc080000, "r,xOA,X", 4 }, -{ "zmh", 0xd8000001, 0xfc080001, "r,xOA,X", 4 }, -{ "zmw", 0xd8000000, 0xfc080000, "r,xOA,X", 4 }, -{ "zmd", 0xd8000002, 0xfc080002, "r,xOA,X", 4 }, -{ "stbp", 0x94080000, 0xfc080000, "r,xOA,X", 4 }, -{ "sthp", 0x94000001, 0xfc080001, "r,xOA,X", 4 }, -{ "stwp", 0x94000000, 0xfc080000, "r,xOA,X", 4 }, -{ "stdp", 0x94000002, 0xfc080002, "r,xOA,X", 4 }, -{ "lil", 0xf80b0000, 0xfc7f0000, "r,D", 4 }, -{ "lwsl1", 0xec000000, 0xfc080000, "r,xOA,X", 4 }, -{ "lwsl2", 0xfc000000, 0xfc080000, "r,xOA,X", 4 }, -{ "lwsl3", 0xfc080000, 0xfc080000, "r,xOA,X", 4 }, - -{ "lvb", 0xb0080000, 0xfc080000, "v,xOA,X", 4 }, -{ "lvh", 0xb0000001, 0xfc080001, "v,xOA,X", 4 }, -{ "lvw", 0xb0000000, 0xfc080000, "v,xOA,X", 4 }, -{ "lvd", 0xb0000002, 0xfc080002, "v,xOA,X", 4 }, -{ "liv", 0x3c040000, 0xfc0f0000, "v,R", 2 }, -{ "livf", 0x3c080000, 0xfc0f0000, "v,R", 2 }, -{ "stvb", 0xd0080000, 0xfc080000, "v,xOA,X", 4 }, -{ "stvh", 0xd0000001, 0xfc080001, "v,xOA,X", 4 }, -{ "stvw", 0xd0000000, 0xfc080000, "v,xOA,X", 4 }, -{ "stvd", 0xd0000002, 0xfc080002, "v,xOA,X", 4 }, - -{ "trr", 0x2c000000, 0xfc0f0000, "r,R", 2 }, -{ "trn", 0x2c040000, 0xfc0f0000, "r,R", 2 }, -{ "trnd", 0x2c0c0000, 0xfc0f0000, "r,R", 2 }, -{ "trabs", 0x2c010000, 0xfc0f0000, "r,R", 2 }, -{ "trabsd", 0x2c090000, 0xfc0f0000, "r,R", 2 }, -{ "trc", 0x2c030000, 0xfc0f0000, "r,R", 2 }, -{ "xcr", 0x28040000, 0xfc0f0000, "r,R", 2 }, -{ "cxcr", 0x2c060000, 0xfc0f0000, "r,R", 2 }, -{ "cxcrd", 0x2c0e0000, 0xfc0f0000, "r,R", 2 }, -{ "tbrr", 0x2c020000, 0xfc0f0000, "r,B", 2 }, -{ "trbr", 0x28030000, 0xfc0f0000, "b,R", 2 }, -{ "xcbr", 0x28020000, 0xfc0f0000, "b,B", 2 }, -{ "tbrbr", 0x28010000, 0xfc0f0000, "b,B", 2 }, - -{ "trvv", 0x28050000, 0xfc0f0000, "v,V", 2 }, -{ "trvvn", 0x2c050000, 0xfc0f0000, "v,V", 2 }, -{ "trvvnd", 0x2c0d0000, 0xfc0f0000, "v,V", 2 }, -{ "trvab", 0x2c070000, 0xfc0f0000, "v,V", 2 }, -{ "trvabd", 0x2c0f0000, 0xfc0f0000, "v,V", 2 }, -{ "cmpv", 0x14060000, 0xfc0f0000, "v,V", 2 }, -{ "expv", 0x14070000, 0xfc0f0000, "v,V", 2 }, -{ "mrvvlt", 0x10030000, 0xfc0f0000, "v,V", 2 }, -{ "mrvvle", 0x10040000, 0xfc0f0000, "v,V", 2 }, -{ "mrvvgt", 0x14030000, 0xfc0f0000, "v,V", 2 }, -{ "mrvvge", 0x14040000, 0xfc0f0000, "v,V", 2 }, -{ "mrvveq", 0x10050000, 0xfc0f0000, "v,V", 2 }, -{ "mrvvne", 0x10050000, 0xfc0f0000, "v,V", 2 }, -{ "mrvrlt", 0x100d0000, 0xfc0f0000, "v,R", 2 }, -{ "mrvrle", 0x100e0000, 0xfc0f0000, "v,R", 2 }, -{ "mrvrgt", 0x140d0000, 0xfc0f0000, "v,R", 2 }, -{ "mrvrge", 0x140e0000, 0xfc0f0000, "v,R", 2 }, -{ "mrvreq", 0x100f0000, 0xfc0f0000, "v,R", 2 }, -{ "mrvrne", 0x140f0000, 0xfc0f0000, "v,R", 2 }, -{ "trvr", 0x140b0000, 0xfc0f0000, "r,V", 2 }, -{ "trrv", 0x140c0000, 0xfc0f0000, "v,R", 2 }, - -{ "bu", 0x40000000, 0xff880000, "xOA,X", 4 }, -{ "bns", 0x70080000, 0xff880000, "xOA,X", 4 }, -{ "bnco", 0x70880000, 0xff880000, "xOA,X", 4 }, -{ "bge", 0x71080000, 0xff880000, "xOA,X", 4 }, -{ "bne", 0x71880000, 0xff880000, "xOA,X", 4 }, -{ "bunge", 0x72080000, 0xff880000, "xOA,X", 4 }, -{ "bunle", 0x72880000, 0xff880000, "xOA,X", 4 }, -{ "bgt", 0x73080000, 0xff880000, "xOA,X", 4 }, -{ "bnany", 0x73880000, 0xff880000, "xOA,X", 4 }, -{ "bs" , 0x70000000, 0xff880000, "xOA,X", 4 }, -{ "bco", 0x70800000, 0xff880000, "xOA,X", 4 }, -{ "blt", 0x71000000, 0xff880000, "xOA,X", 4 }, -{ "beq", 0x71800000, 0xff880000, "xOA,X", 4 }, -{ "buge", 0x72000000, 0xff880000, "xOA,X", 4 }, -{ "bult", 0x72800000, 0xff880000, "xOA,X", 4 }, -{ "ble", 0x73000000, 0xff880000, "xOA,X", 4 }, -{ "bany", 0x73800000, 0xff880000, "xOA,X", 4 }, -{ "brlnk", 0x44000000, 0xfc080000, "r,xOA,X", 4 }, -{ "bib", 0x48000000, 0xfc080000, "r,xOA,X", 4 }, -{ "bih", 0x48080000, 0xfc080000, "r,xOA,X", 4 }, -{ "biw", 0x4c000000, 0xfc080000, "r,xOA,X", 4 }, -{ "bid", 0x4c080000, 0xfc080000, "r,xOA,X", 4 }, -{ "bivb", 0x60000000, 0xfc080000, "r,xOA,X", 4 }, -{ "bivh", 0x60080000, 0xfc080000, "r,xOA,X", 4 }, -{ "bivw", 0x64000000, 0xfc080000, "r,xOA,X", 4 }, -{ "bivd", 0x64080000, 0xfc080000, "r,xOA,X", 4 }, -{ "bvsb", 0x68000000, 0xfc080000, "r,xOA,X", 4 }, -{ "bvsh", 0x68080000, 0xfc080000, "r,xOA,X", 4 }, -{ "bvsw", 0x6c000000, 0xfc080000, "r,xOA,X", 4 }, -{ "bvsd", 0x6c080000, 0xfc080000, "r,xOA,X", 4 }, - -{ "camb", 0x80080000, 0xfc080000, "r,xOA,X", 4 }, -{ "camh", 0x80000001, 0xfc080001, "r,xOA,X", 4 }, -{ "camw", 0x80000000, 0xfc080000, "r,xOA,X", 4 }, -{ "camd", 0x80000002, 0xfc080002, "r,xOA,X", 4 }, -{ "car", 0x10000000, 0xfc0f0000, "r,R", 2 }, -{ "card", 0x14000000, 0xfc0f0000, "r,R", 2 }, -{ "ci", 0xf8050000, 0xfc7f0000, "r,I", 4 }, -{ "chkbnd", 0x5c080000, 0xfc080000, "r,xOA,X", 4 }, - -{ "cavv", 0x10010000, 0xfc0f0000, "v,V", 2 }, -{ "cavr", 0x10020000, 0xfc0f0000, "v,R", 2 }, -{ "cavvd", 0x10090000, 0xfc0f0000, "v,V", 2 }, -{ "cavrd", 0x100b0000, 0xfc0f0000, "v,R", 2 }, - -{ "anmb", 0x84080000, 0xfc080000, "r,xOA,X", 4 }, -{ "anmh", 0x84000001, 0xfc080001, "r,xOA,X", 4 }, -{ "anmw", 0x84000000, 0xfc080000, "r,xOA,X", 4 }, -{ "anmd", 0x84000002, 0xfc080002, "r,xOA,X", 4 }, -{ "anr", 0x04000000, 0xfc0f0000, "r,R", 2 }, -{ "ani", 0xf8080000, 0xfc7f0000, "r,I", 4 }, -{ "ormb", 0xb8080000, 0xfc080000, "r,xOA,X", 4 }, -{ "ormh", 0xb8000001, 0xfc080001, "r,xOA,X", 4 }, -{ "ormw", 0xb8000000, 0xfc080000, "r,xOA,X", 4 }, -{ "ormd", 0xb8000002, 0xfc080002, "r,xOA,X", 4 }, -{ "orr", 0x08000000, 0xfc0f0000, "r,R", 2 }, -{ "oi", 0xf8090000, 0xfc7f0000, "r,I", 4 }, -{ "eomb", 0x8c080000, 0xfc080000, "r,xOA,X", 4 }, -{ "eomh", 0x8c000001, 0xfc080001, "r,xOA,X", 4 }, -{ "eomw", 0x8c000000, 0xfc080000, "r,xOA,X", 4 }, -{ "eomd", 0x8c000002, 0xfc080002, "r,xOA,X", 4 }, -{ "eor", 0x0c000000, 0xfc0f0000, "r,R", 2 }, -{ "eoi", 0xf80a0000, 0xfc7f0000, "r,I", 4 }, - -{ "anvv", 0x04010000, 0xfc0f0000, "v,V", 2 }, -{ "anvr", 0x04020000, 0xfc0f0000, "v,R", 2 }, -{ "orvv", 0x08010000, 0xfc0f0000, "v,V", 2 }, -{ "orvr", 0x08020000, 0xfc0f0000, "v,R", 2 }, -{ "eovv", 0x0c010000, 0xfc0f0000, "v,V", 2 }, -{ "eovr", 0x0c020000, 0xfc0f0000, "v,R", 2 }, - -{ "sacz", 0x100c0000, 0xfc0f0000, "r,R", 2 }, -{ "sla", 0x1c400000, 0xfc600000, "r,S", 2 }, -{ "sll", 0x1c600000, 0xfc600000, "r,S", 2 }, -{ "slc", 0x24400000, 0xfc600000, "r,S", 2 }, -{ "slad", 0x20400000, 0xfc600000, "r,S", 2 }, -{ "slld", 0x20600000, 0xfc600000, "r,S", 2 }, -{ "sra", 0x1c000000, 0xfc600000, "r,S", 2 }, -{ "srl", 0x1c200000, 0xfc600000, "r,S", 2 }, -{ "src", 0x24000000, 0xfc600000, "r,S", 2 }, -{ "srad", 0x20000000, 0xfc600000, "r,S", 2 }, -{ "srld", 0x20200000, 0xfc600000, "r,S", 2 }, -{ "sda", 0x3c030000, 0xfc0f0000, "r,R", 2 }, -{ "sdl", 0x3c020000, 0xfc0f0000, "r,R", 2 }, -{ "sdc", 0x3c010000, 0xfc0f0000, "r,R", 2 }, -{ "sdad", 0x3c0b0000, 0xfc0f0000, "r,R", 2 }, -{ "sdld", 0x3c0a0000, 0xfc0f0000, "r,R", 2 }, - -{ "svda", 0x3c070000, 0xfc0f0000, "v,R", 2 }, -{ "svdl", 0x3c060000, 0xfc0f0000, "v,R", 2 }, -{ "svdc", 0x3c050000, 0xfc0f0000, "v,R", 2 }, -{ "svdad", 0x3c0e0000, 0xfc0f0000, "v,R", 2 }, -{ "svdld", 0x3c0d0000, 0xfc0f0000, "v,R", 2 }, - -{ "sbm", 0xac080000, 0xfc080000, "f,xOA,X", 4 }, -{ "zbm", 0xac000000, 0xfc080000, "f,xOA,X", 4 }, -{ "tbm", 0xa8080000, 0xfc080000, "f,xOA,X", 4 }, -{ "incmb", 0xa0000000, 0xfc080000, "xOA,X", 4 }, -{ "incmh", 0xa0080000, 0xfc080000, "xOA,X", 4 }, -{ "incmw", 0xa4000000, 0xfc080000, "xOA,X", 4 }, -{ "incmd", 0xa4080000, 0xfc080000, "xOA,X", 4 }, -{ "sbmd", 0x7c080000, 0xfc080000, "r,xOA,X", 4 }, -{ "zbmd", 0x7c000000, 0xfc080000, "r,xOA,X", 4 }, -{ "tbmd", 0x78080000, 0xfc080000, "r,xOA,X", 4 }, - -{ "ssm", 0x9c080000, 0xfc080000, "f,xOA,X", 4 }, -{ "zsm", 0x9c000000, 0xfc080000, "f,xOA,X", 4 }, -{ "tsm", 0x98080000, 0xfc080000, "f,xOA,X", 4 }, - -{ "admb", 0xc8080000, 0xfc080000, "r,xOA,X", 4 }, -{ "admh", 0xc8000001, 0xfc080001, "r,xOA,X", 4 }, -{ "admw", 0xc8000000, 0xfc080000, "r,xOA,X", 4 }, -{ "admd", 0xc8000002, 0xfc080002, "r,xOA,X", 4 }, -{ "adr", 0x38000000, 0xfc0f0000, "r,R", 2 }, -{ "armb", 0xe8080000, 0xfc080000, "r,xOA,X", 4 }, -{ "armh", 0xe8000001, 0xfc080001, "r,xOA,X", 4 }, -{ "armw", 0xe8000000, 0xfc080000, "r,xOA,X", 4 }, -{ "armd", 0xe8000002, 0xfc080002, "r,xOA,X", 4 }, -{ "adi", 0xf8010000, 0xfc0f0000, "r,I", 4 }, -{ "sumb", 0xcc080000, 0xfc080000, "r,xOA,X", 4 }, -{ "sumh", 0xcc000001, 0xfc080001, "r,xOA,X", 4 }, -{ "sumw", 0xcc000000, 0xfc080000, "r,xOA,X", 4 }, -{ "sumd", 0xcc000002, 0xfc080002, "r,xOA,X", 4 }, -{ "sur", 0x3c000000, 0xfc0f0000, "r,R", 2 }, -{ "sui", 0xf8020000, 0xfc0f0000, "r,I", 4 }, -{ "mpmb", 0xc0080000, 0xfc080000, "r,xOA,X", 4 }, -{ "mpmh", 0xc0000001, 0xfc080001, "r,xOA,X", 4 }, -{ "mpmw", 0xc0000000, 0xfc080000, "r,xOA,X", 4 }, -{ "mpr", 0x38020000, 0xfc0f0000, "r,R", 2 }, -{ "mprd", 0x3c0f0000, 0xfc0f0000, "r,R", 2 }, -{ "mpi", 0xf8030000, 0xfc0f0000, "r,I", 4 }, -{ "dvmb", 0xc4080000, 0xfc080000, "r,xOA,X", 4 }, -{ "dvmh", 0xc4000001, 0xfc080001, "r,xOA,X", 4 }, -{ "dvmw", 0xc4000000, 0xfc080000, "r,xOA,X", 4 }, -{ "dvr", 0x380a0000, 0xfc0f0000, "r,R", 2 }, -{ "dvi", 0xf8040000, 0xfc0f0000, "r,I", 4 }, -{ "exs", 0x38080000, 0xfc0f0000, "r,R", 2 }, - -{ "advv", 0x30000000, 0xfc0f0000, "v,V", 2 }, -{ "advvd", 0x30080000, 0xfc0f0000, "v,V", 2 }, -{ "adrv", 0x34000000, 0xfc0f0000, "v,R", 2 }, -{ "adrvd", 0x34080000, 0xfc0f0000, "v,R", 2 }, -{ "suvv", 0x30010000, 0xfc0f0000, "v,V", 2 }, -{ "suvvd", 0x30090000, 0xfc0f0000, "v,V", 2 }, -{ "surv", 0x34010000, 0xfc0f0000, "v,R", 2 }, -{ "survd", 0x34090000, 0xfc0f0000, "v,R", 2 }, -{ "mpvv", 0x30020000, 0xfc0f0000, "v,V", 2 }, -{ "mprv", 0x34020000, 0xfc0f0000, "v,R", 2 }, - -{ "adfw", 0xe0080000, 0xfc080000, "r,xOA,X", 4 }, -{ "adfd", 0xe0080002, 0xfc080002, "r,xOA,X", 4 }, -{ "adrfw", 0x38010000, 0xfc0f0000, "r,R", 2 }, -{ "adrfd", 0x38090000, 0xfc0f0000, "r,R", 2 }, -{ "surfw", 0xe0000000, 0xfc080000, "r,xOA,X", 4 }, -{ "surfd", 0xe0000002, 0xfc080002, "r,xOA,X", 4 }, -{ "surfw", 0x38030000, 0xfc0f0000, "r,R", 2 }, -{ "surfd", 0x380b0000, 0xfc0f0000, "r,R", 2 }, -{ "mpfw", 0xe4080000, 0xfc080000, "r,xOA,X", 4 }, -{ "mpfd", 0xe4080002, 0xfc080002, "r,xOA,X", 4 }, -{ "mprfw", 0x38060000, 0xfc0f0000, "r,R", 2 }, -{ "mprfd", 0x380e0000, 0xfc0f0000, "r,R", 2 }, -{ "rfw", 0xe4000000, 0xfc080000, "r,xOA,X", 4 }, -{ "rfd", 0xe4000002, 0xfc080002, "r,xOA,X", 4 }, -{ "rrfw", 0x0c0e0000, 0xfc0f0000, "r", 2 }, -{ "rrfd", 0x0c0f0000, 0xfc0f0000, "r", 2 }, - -{ "advvfw", 0x30040000, 0xfc0f0000, "v,V", 2 }, -{ "advvfd", 0x300c0000, 0xfc0f0000, "v,V", 2 }, -{ "adrvfw", 0x34040000, 0xfc0f0000, "v,R", 2 }, -{ "adrvfd", 0x340c0000, 0xfc0f0000, "v,R", 2 }, -{ "suvvfw", 0x30050000, 0xfc0f0000, "v,V", 2 }, -{ "suvvfd", 0x300d0000, 0xfc0f0000, "v,V", 2 }, -{ "survfw", 0x34050000, 0xfc0f0000, "v,R", 2 }, -{ "survfd", 0x340d0000, 0xfc0f0000, "v,R", 2 }, -{ "mpvvfw", 0x30060000, 0xfc0f0000, "v,V", 2 }, -{ "mpvvfd", 0x300e0000, 0xfc0f0000, "v,V", 2 }, -{ "mprvfw", 0x34060000, 0xfc0f0000, "v,R", 2 }, -{ "mprvfd", 0x340e0000, 0xfc0f0000, "v,R", 2 }, -{ "rvfw", 0x30070000, 0xfc0f0000, "v", 2 }, -{ "rvfd", 0x300f0000, 0xfc0f0000, "v", 2 }, - -{ "fltw", 0x38070000, 0xfc0f0000, "r,R", 2 }, -{ "fltd", 0x380f0000, 0xfc0f0000, "r,R", 2 }, -{ "fixw", 0x38050000, 0xfc0f0000, "r,R", 2 }, -{ "fixd", 0x380d0000, 0xfc0f0000, "r,R", 2 }, -{ "cfpds", 0x3c090000, 0xfc0f0000, "r,R", 2 }, - -{ "fltvw", 0x080d0000, 0xfc0f0000, "v,V", 2 }, -{ "fltvd", 0x080f0000, 0xfc0f0000, "v,V", 2 }, -{ "fixvw", 0x080c0000, 0xfc0f0000, "v,V", 2 }, -{ "fixvd", 0x080e0000, 0xfc0f0000, "v,V", 2 }, -{ "cfpvds", 0x0c0d0000, 0xfc0f0000, "v,V", 2 }, - -{ "orvrn", 0x000a0000, 0xfc0f0000, "r,V", 2 }, -{ "andvrn", 0x00080000, 0xfc0f0000, "r,V", 2 }, -{ "frsteq", 0x04090000, 0xfc0f0000, "r,V", 2 }, -{ "sigma", 0x0c080000, 0xfc0f0000, "r,V", 2 }, -{ "sigmad", 0x0c0a0000, 0xfc0f0000, "r,V", 2 }, -{ "sigmf", 0x08080000, 0xfc0f0000, "r,V", 2 }, -{ "sigmfd", 0x080a0000, 0xfc0f0000, "r,V", 2 }, -{ "prodf", 0x04080000, 0xfc0f0000, "r,V", 2 }, -{ "prodfd", 0x040a0000, 0xfc0f0000, "r,V", 2 }, -{ "maxv", 0x10080000, 0xfc0f0000, "r,V", 2 }, -{ "maxvd", 0x100a0000, 0xfc0f0000, "r,V", 2 }, -{ "minv", 0x14080000, 0xfc0f0000, "r,V", 2 }, -{ "minvd", 0x140a0000, 0xfc0f0000, "r,V", 2 }, - -{ "lpsd", 0xf0000000, 0xfc080000, "xOA,X", 4 }, -{ "ldc", 0xf0080000, 0xfc080000, "xOA,X", 4 }, -{ "spm", 0x040c0000, 0xfc0f0000, "r", 2 }, -{ "rpm", 0x040d0000, 0xfc0f0000, "r", 2 }, -{ "tritr", 0x00070000, 0xfc0f0000, "r", 2 }, -{ "trrit", 0x00060000, 0xfc0f0000, "r", 2 }, -{ "rpswt", 0x04080000, 0xfc0f0000, "r", 2 }, -{ "exr", 0xf8070000, 0xfc0f0000, "", 4 }, -{ "halt", 0x00000000, 0xfc0f0000, "", 2 }, -{ "wait", 0x00010000, 0xfc0f0000, "", 2 }, -{ "nop", 0x00020000, 0xfc0f0000, "", 2 }, -{ "eiae", 0x00030000, 0xfc0f0000, "", 2 }, -{ "efae", 0x000d0000, 0xfc0f0000, "", 2 }, -{ "diae", 0x000e0000, 0xfc0f0000, "", 2 }, -{ "dfae", 0x000f0000, 0xfc0f0000, "", 2 }, -{ "spvc", 0xf8060000, 0xfc0f0000, "r,T,N", 4 }, -{ "rdsts", 0x00090000, 0xfc0f0000, "r", 2 }, -{ "setcpu", 0x000c0000, 0xfc0f0000, "r", 2 }, -{ "cmc", 0x000b0000, 0xfc0f0000, "r", 2 }, -{ "trrcu", 0x00040000, 0xfc0f0000, "r", 2 }, -{ "attnio", 0x00050000, 0xfc0f0000, "", 2 }, -{ "fudit", 0x28080000, 0xfc0f0000, "", 2 }, -{ "break", 0x28090000, 0xfc0f0000, "", 2 }, -{ "frzss", 0x280a0000, 0xfc0f0000, "", 2 }, -{ "ripi", 0x04040000, 0xfc0f0000, "r,R", 2 }, -{ "xcp", 0x04050000, 0xfc0f0000, "r", 2 }, -{ "block", 0x04060000, 0xfc0f0000, "", 2 }, -{ "unblock", 0x04070000, 0xfc0f0000, "", 2 }, -{ "trsc", 0x08060000, 0xfc0f0000, "r,R", 2 }, -{ "tscr", 0x08070000, 0xfc0f0000, "r,R", 2 }, -{ "fq", 0x04080000, 0xfc0f0000, "r", 2 }, -{ "flupte", 0x2c080000, 0xfc0f0000, "r", 2 }, -{ "rviu", 0x040f0000, 0xfc0f0000, "", 2 }, -{ "ldel", 0x280c0000, 0xfc0f0000, "r,R", 2 }, -{ "ldu", 0x280d0000, 0xfc0f0000, "r,R", 2 }, -{ "stdecc", 0x280b0000, 0xfc0f0000, "r,R", 2 }, -{ "trpc", 0x08040000, 0xfc0f0000, "r", 2 }, -{ "tpcr", 0x08050000, 0xfc0f0000, "r", 2 }, -{ "ghalt", 0x0c050000, 0xfc0f0000, "r", 2 }, -{ "grun", 0x0c040000, 0xfc0f0000, "", 2 }, -{ "tmpr", 0x2c0a0000, 0xfc0f0000, "r,R", 2 }, -{ "trmp", 0x2c0b0000, 0xfc0f0000, "r,R", 2 }, - -{ "trrve", 0x28060000, 0xfc0f0000, "r", 2 }, -{ "trver", 0x28070000, 0xfc0f0000, "r", 2 }, -{ "trvlr", 0x280f0000, 0xfc0f0000, "r", 2 }, - -{ "linkfl", 0x18000000, 0xfc0f0000, "r,R", 2 }, -{ "linkbl", 0x18020000, 0xfc0f0000, "r,R", 2 }, -{ "linkfp", 0x18010000, 0xfc0f0000, "r,R", 2 }, -{ "linkbp", 0x18030000, 0xfc0f0000, "r,R", 2 }, -{ "linkpl", 0x18040000, 0xfc0f0000, "r,R", 2 }, -{ "ulinkl", 0x18080000, 0xfc0f0000, "r,R", 2 }, -{ "ulinkp", 0x18090000, 0xfc0f0000, "r,R", 2 }, -{ "ulinktl", 0x180a0000, 0xfc0f0000, "r,R", 2 }, -{ "ulinktp", 0x180b0000, 0xfc0f0000, "r,R", 2 }, -}; - -int numopcodes = sizeof(gld_opcodes) / sizeof(gld_opcodes[0]); - -struct gld_opcode *endop = gld_opcodes + sizeof(gld_opcodes) / - sizeof(gld_opcodes[0]); diff --git a/contrib/gdb/include/opcode/ns32k.h b/contrib/gdb/include/opcode/ns32k.h deleted file mode 100644 index 42bb8b87aad6a..0000000000000 --- a/contrib/gdb/include/opcode/ns32k.h +++ /dev/null @@ -1,491 +0,0 @@ -/* ns32k-opcode.h -- Opcode table for National Semi 32k 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, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ - - -#ifdef SEQUENT_COMPATABILITY -#define DEF_MODEC 20 -#define DEF_MODEL 21 -#endif - -#ifndef DEF_MODEC -#define DEF_MODEC 20 -#endif - -#ifndef DEF_MODEL -#define DEF_MODEL 20 -#endif -/* - After deciding the instruction entry (via hash.c) the instruction parser - will try to match the operands after the instruction to the required set - given in the entry operandfield. Every operand will result in a change in - the opcode or the addition of data to the opcode. - The operands in the source instruction are checked for inconsistent - semantics. - - F : 32 bit float general form - L : 64 bit float " - B : byte " - W : word " - D : double-word " - A : double-word gen-address-form ie no regs, no immediate - I : integer writeable gen int except immediate (A + reg) - Z : floating writeable gen float except immediate (Z + freg) - d : displacement - b : displacement - pc relative addressing acb - p : displacement - pc relative addressing br bcond bsr cxp - q : quick - i : immediate (8 bits) - This is not a standard ns32k operandtype, it is used to build - instructions like svc arg1,arg2 - Svc is the instruction SuperVisorCall and is sometimes used to - call OS-routines from usermode. Some args might be handy! - r : register number (3 bits) - O : setcfg instruction optionslist - C : cinv instruction optionslist - S : stringinstruction optionslist - U : registerlist save,enter - u : registerlist restore,exit - M : mmu register - P : cpu register - g : 3:rd operand of inss or exts instruction - G : 4:th operand of inss or exts instruction - Those operands are encoded in the same byte. - This byte is placed last in the instruction. - f : operand of sfsr - H : sequent-hack for bsr (Warning) - -column 1 instructions - 2 number of bits in opcode. - 3 number of bits in opcode explicitly - determined by the instruction type. - 4 opcodeseed, the number we build our opcode - from. - 5 operandtypes, used by operandparser. - 6 size in bytes of immediate -*/ -struct ns32k_opcode { - char *name; - unsigned char opcode_id_size; /* not used by the assembler */ - unsigned char opcode_size; - unsigned long opcode_seed; - char *operands; - unsigned char im_size; /* not used by dissassembler */ - char *default_args; /* default to those args when none given */ - char default_modec; /* default to this addr-mode when ambigous - ie when the argument of a general addr-mode - is a plain constant */ - char default_model; /* is a plain label */ -}; - -#ifdef comment -/* This section was from the gdb version of this file. */ - -#ifndef ns32k_opcodeT -#define ns32k_opcodeT int -#endif /* no ns32k_opcodeT */ - -struct not_wot /* ns32k opcode table: wot to do with this */ - /* particular opcode */ -{ - int obits; /* number of opcode bits */ - int ibits; /* number of instruction bits */ - ns32k_opcodeT code; /* op-code (may be > 8 bits!) */ - char *args; /* how to compile said opcode */ -}; - -struct not /* ns32k opcode text */ -{ - char * name; /* opcode name: lowercase string [key] */ - struct not_wot detail; /* rest of opcode table [datum] */ -}; - -/* Instructions look like this: - - basic instruction--1, 2, or 3 bytes - index byte for operand A, if operand A is indexed--1 byte - index byte for operand B, if operand B is indexed--1 byte - addressing extension for operand A - addressing extension for operand B - implied operands - - Operand A is the operand listed first in the following opcode table. - Operand B is the operand listed second in the following opcode table. - All instructions have at most 2 general operands, so this is enough. - The implied operands are associated with operands other than A and B. - - Each operand has a digit and a letter. - - The digit gives the position in the assembly language. The letter, - one of the following, tells us what kind of operand it is. */ - -/* F : 32 bit float - * L : 64 bit float - * B : byte - * W : word - * D : double-word - * I : integer not immediate - * Z : floating not immediate - * d : displacement - * q : quick - * i : immediate (8 bits) - * r : register number (3 bits) - * p : displacement - pc relative addressing -*/ - - -#endif /* comment */ - -static const struct ns32k_opcode ns32k_opcodes[]= -{ - { "absf", 14,24, 0x35be, "1F2Z", 4, "", DEF_MODEC,DEF_MODEL }, - { "absl", 14,24, 0x34be, "1L2Z", 8, "", DEF_MODEC,DEF_MODEL }, - { "absb", 14,24, 0x304e, "1B2I", 1, "", DEF_MODEC,DEF_MODEL }, - { "absw", 14,24, 0x314e, "1W2I", 2, "", DEF_MODEC,DEF_MODEL }, - { "absd", 14,24, 0x334e, "1D2I", 4, "", DEF_MODEC,DEF_MODEL }, - { "acbb", 7,16, 0x4c, "2I1q3p", 1, "", DEF_MODEC,DEF_MODEL }, - { "acbw", 7,16, 0x4d, "2I1q3p", 2, "", DEF_MODEC,DEF_MODEL }, - { "acbd", 7,16, 0x4f, "2I1q3p", 4, "", DEF_MODEC,DEF_MODEL }, - { "addf", 14,24, 0x01be, "1F2Z", 4, "", DEF_MODEC,DEF_MODEL }, - { "addl", 14,24, 0x00be, "1L2Z", 8, "", DEF_MODEC,DEF_MODEL }, - { "addb", 6,16, 0x00, "1B2I", 1, "", DEF_MODEC,DEF_MODEL }, - { "addw", 6,16, 0x01, "1W2I", 2, "", DEF_MODEC,DEF_MODEL }, - { "addd", 6,16, 0x03, "1D2I", 4, "", DEF_MODEC,DEF_MODEL }, - { "addcb", 6,16, 0x10, "1B2I", 1, "", DEF_MODEC,DEF_MODEL }, - { "addcw", 6,16, 0x11, "1W2I", 2, "", DEF_MODEC,DEF_MODEL }, - { "addcd", 6,16, 0x13, "1D2I", 4, "", DEF_MODEC,DEF_MODEL }, - { "addpb", 14,24, 0x3c4e, "1B2I", 1, "", DEF_MODEC,DEF_MODEL }, - { "addpw", 14,24, 0x3d4e, "1W2I", 2, "", DEF_MODEC,DEF_MODEL }, - { "addpd", 14,24, 0x3f4e, "1D2I", 4, "", DEF_MODEC,DEF_MODEL }, - { "addqb", 7,16, 0x0c, "2I1q", 1, "", DEF_MODEC,DEF_MODEL }, - { "addqw", 7,16, 0x0d, "2I1q", 2, "", DEF_MODEC,DEF_MODEL }, - { "addqd", 7,16, 0x0f, "2I1q", 4, "", DEF_MODEC,DEF_MODEL }, - { "addr", 6,16, 0x27, "1A2I", 4, "", 21,21 }, - { "adjspb", 11,16, 0x057c, "1B", 1, "", DEF_MODEC,DEF_MODEL }, - { "adjspw", 11,16, 0x057d, "1W", 2, "", DEF_MODEC,DEF_MODEL }, - { "adjspd", 11,16, 0x057f, "1D", 4, "", DEF_MODEC,DEF_MODEL }, - { "andb", 6,16, 0x28, "1B2I", 1, "", DEF_MODEC,DEF_MODEL }, - { "andw", 6,16, 0x29, "1W2I", 2, "", DEF_MODEC,DEF_MODEL }, - { "andd", 6,16, 0x2b, "1D2I", 4, "", DEF_MODEC,DEF_MODEL }, - { "ashb", 14,24, 0x044e, "1B2I", 1, "", DEF_MODEC,DEF_MODEL }, - { "ashw", 14,24, 0x054e, "1B2I", 1, "", DEF_MODEC,DEF_MODEL }, - { "ashd", 14,24, 0x074e, "1B2I", 1, "", DEF_MODEC,DEF_MODEL }, - { "beq", 8,8, 0x0a, "1p", 0, "", 21,21 }, - { "bne", 8,8, 0x1a, "1p", 0, "", 21,21 }, - { "bcs", 8,8, 0x2a, "1p", 0, "", 21,21 }, - { "bcc", 8,8, 0x3a, "1p", 0, "", 21,21 }, - { "bhi", 8,8, 0x4a, "1p", 0, "", 21,21 }, - { "bls", 8,8, 0x5a, "1p", 0, "", 21,21 }, - { "bgt", 8,8, 0x6a, "1p", 0, "", 21,21 }, - { "ble", 8,8, 0x7a, "1p", 0, "", 21,21 }, - { "bfs", 8,8, 0x8a, "1p", 0, "", 21,21 }, - { "bfc", 8,8, 0x9a, "1p", 0, "", 21,21 }, - { "blo", 8,8, 0xaa, "1p", 0, "", 21,21 }, - { "bhs", 8,8, 0xba, "1p", 0, "", 21,21 }, - { "blt", 8,8, 0xca, "1p", 0, "", 21,21 }, - { "bge", 8,8, 0xda, "1p", 0, "", 21,21 }, - { "but", 8,8, 0xea, "1p", 0, "", 21,21 }, - { "buf", 8,8, 0xfa, "1p", 0, "", 21,21 }, - { "bicb", 6,16, 0x08, "1B2I", 1, "", DEF_MODEC,DEF_MODEL }, - { "bicw", 6,16, 0x09, "1W2I", 2, "", DEF_MODEC,DEF_MODEL }, - { "bicd", 6,16, 0x0b, "1D2I", 4, "", DEF_MODEC,DEF_MODEL }, - { "bicpsrb", 11,16, 0x17c, "1B", 1, "", DEF_MODEC,DEF_MODEL }, - { "bicpsrw", 11,16, 0x17d, "1W", 2, "", DEF_MODEC,DEF_MODEL }, - { "bispsrb", 11,16, 0x37c, "1B", 1, "", DEF_MODEC,DEF_MODEL }, - { "bispsrw", 11,16, 0x37d, "1W", 2, "", DEF_MODEC,DEF_MODEL }, - { "bpt", 8,8, 0xf2, "", 0, "", DEF_MODEC,DEF_MODEL }, - { "br", 8,8, 0xea, "1p", 0, "", 21,21 }, -#ifdef SEQUENT_COMPATABILITY - { "bsr", 8,8, 0x02, "1H", 0, "", 21,21 }, -#else - { "bsr", 8,8, 0x02, "1p", 0, "", 21,21 }, -#endif - { "caseb", 11,16, 0x77c, "1B", 1, "", DEF_MODEC,DEF_MODEL }, - { "casew", 11,16, 0x77d, "1W", 2, "", DEF_MODEC,DEF_MODEL }, - { "cased", 11,16, 0x77f, "1D", 4, "", DEF_MODEC,DEF_MODEL }, - { "cbitb", 14,24, 0x084e, "1B2I", 1, "", DEF_MODEC,DEF_MODEL }, - { "cbitw", 14,24, 0x094e, "1W2I", 2, "", DEF_MODEC,DEF_MODEL }, - { "cbitd", 14,24, 0x0b4e, "1D2I", 4, "", DEF_MODEC,DEF_MODEL }, - { "cbitib", 14,24, 0x0c4e, "1B2I", 1, "", DEF_MODEC,DEF_MODEL }, - { "cbitiw", 14,24, 0x0d4e, "1W2I", 2, "", DEF_MODEC,DEF_MODEL }, - { "cbitid", 14,24, 0x0f4e, "1D2I", 4, "", DEF_MODEC,DEF_MODEL }, - { "checkb", 11,24, 0x0ee, "2A3B1r", 1, "", DEF_MODEC,DEF_MODEL }, - { "checkw", 11,24, 0x1ee, "2A3W1r", 2, "", DEF_MODEC,DEF_MODEL }, - { "checkd", 11,24, 0x3ee, "2A3D1r", 4, "", DEF_MODEC,DEF_MODEL }, - { "cinv", 14,24, 0x271e, "2D1C", 4, "", DEF_MODEC,DEF_MODEL }, - { "cmpf", 14,24, 0x09be, "1F2F", 4, "", DEF_MODEC,DEF_MODEL }, - { "cmpl", 14,24, 0x08be, "1L2L", 8, "", DEF_MODEC,DEF_MODEL }, - { "cmpb", 6,16, 0x04, "1B2B", 1, "", DEF_MODEC,DEF_MODEL }, - { "cmpw", 6,16, 0x05, "1W2W", 2, "", DEF_MODEC,DEF_MODEL }, - { "cmpd", 6,16, 0x07, "1D2D", 4, "", DEF_MODEC,DEF_MODEL }, - { "cmpmb", 14,24, 0x04ce, "1A2A3b", 1, "", DEF_MODEC,DEF_MODEL }, - { "cmpmw", 14,24, 0x05ce, "1A2A3b", 2, "", DEF_MODEC,DEF_MODEL }, - { "cmpmd", 14,24, 0x07ce, "1A2A3b", 4, "", DEF_MODEC,DEF_MODEL }, - { "cmpqb", 7,16, 0x1c, "2B1q", 1, "", DEF_MODEC,DEF_MODEL }, - { "cmpqw", 7,16, 0x1d, "2W1q", 2, "", DEF_MODEC,DEF_MODEL }, - { "cmpqd", 7,16, 0x1f, "2D1q", 4, "", DEF_MODEC,DEF_MODEL }, - { "cmpsb", 16,24, 0x040e, "1S", 0, "[]", DEF_MODEC,DEF_MODEL }, - { "cmpsw", 16,24, 0x050e, "1S", 0, "[]", DEF_MODEC,DEF_MODEL }, - { "cmpsd", 16,24, 0x070e, "1S", 0, "[]", DEF_MODEC,DEF_MODEL }, - { "cmpst", 16,24, 0x840e, "1S", 0, "[]", DEF_MODEC,DEF_MODEL }, - { "comb", 14,24, 0x344e, "1B2I", 1, "", DEF_MODEC,DEF_MODEL }, - { "comw", 14,24, 0x354e, "1W2I", 2, "", DEF_MODEC,DEF_MODEL }, - { "comd", 14,24, 0x374e, "1D2I", 4, "", DEF_MODEC,DEF_MODEL }, - { "cvtp", 11,24, 0x036e, "2A3D1r", 4, "", DEF_MODEC,DEF_MODEL }, - { "cxp", 8,8, 0x22, "1p", 0, "", 21,21 }, - { "cxpd", 11,16, 0x07f, "1A", 4, "", DEF_MODEC,DEF_MODEL }, - { "deib", 14,24, 0x2cce, "1B2I", 1, "", DEF_MODEC,DEF_MODEL }, - { "deiw", 14,24, 0x2dce, "1W2I", 2, "", DEF_MODEC,DEF_MODEL }, - { "deid", 14,24, 0x2fce, "1D2I", 4, "", DEF_MODEC,DEF_MODEL }, - { "dia", 8,8, 0xc2, "", 1, "", DEF_MODEC,DEF_MODEL }, - { "divf", 14,24, 0x21be, "1F2Z", 4, "", DEF_MODEC,DEF_MODEL }, - { "divl", 14,24, 0x20be, "1L2Z", 8, "", DEF_MODEC,DEF_MODEL }, - { "divb", 14,24, 0x3cce, "1B2I", 1, "", DEF_MODEC,DEF_MODEL }, - { "divw", 14,24, 0x3dce, "1W2I", 2, "", DEF_MODEC,DEF_MODEL }, - { "divd", 14,24, 0x3fce, "1D2I", 4, "", DEF_MODEC,DEF_MODEL }, - { "enter", 8,8, 0x82, "1U2d", 0, "", DEF_MODEC,DEF_MODEL }, - { "exit", 8,8, 0x92, "1u", 0, "", DEF_MODEC,DEF_MODEL }, - { "extb", 11,24, 0x02e, "2I3B1r4d", 1, "", DEF_MODEC,DEF_MODEL }, - { "extw", 11,24, 0x12e, "2I3W1r4d", 2, "", DEF_MODEC,DEF_MODEL }, - { "extd", 11,24, 0x32e, "2I3D1r4d", 4, "", DEF_MODEC,DEF_MODEL }, - { "extsb", 14,24, 0x0cce, "1I2I4G3g", 1, "", DEF_MODEC,DEF_MODEL }, - { "extsw", 14,24, 0x0dce, "1I2I4G3g", 2, "", DEF_MODEC,DEF_MODEL }, - { "extsd", 14,24, 0x0fce, "1I2I4G3g", 4, "", DEF_MODEC,DEF_MODEL }, - { "ffsb", 14,24, 0x046e, "1B2I", 1, "", DEF_MODEC,DEF_MODEL }, - { "ffsw", 14,24, 0x056e, "1W2I", 2, "", DEF_MODEC,DEF_MODEL }, - { "ffsd", 14,24, 0x076e, "1D2I", 4, "", DEF_MODEC,DEF_MODEL }, - { "flag", 8,8, 0xd2, "", 0, "", DEF_MODEC,DEF_MODEL }, - { "floorfb", 14,24, 0x3c3e, "1F2I", 4, "", DEF_MODEC,DEF_MODEL }, - { "floorfw", 14,24, 0x3d3e, "1F2I", 4, "", DEF_MODEC,DEF_MODEL }, - { "floorfd", 14,24, 0x3f3e, "1F2I", 4, "", DEF_MODEC,DEF_MODEL }, - { "floorlb", 14,24, 0x383e, "1L2I", 8, "", DEF_MODEC,DEF_MODEL }, - { "floorlw", 14,24, 0x393e, "1L2I", 8, "", DEF_MODEC,DEF_MODEL }, - { "floorld", 14,24, 0x3b3e, "1L2I", 8, "", DEF_MODEC,DEF_MODEL }, - { "ibitb", 14,24, 0x384e, "1B2I", 1, "", DEF_MODEC,DEF_MODEL }, - { "ibitw", 14,24, 0x394e, "1W2I", 2, "", DEF_MODEC,DEF_MODEL }, - { "ibitd", 14,24, 0x3b4e, "1D2I", 4, "", DEF_MODEC,DEF_MODEL }, - { "indexb", 11,24, 0x42e, "2B3B1r", 1, "", DEF_MODEC,DEF_MODEL }, - { "indexw", 11,24, 0x52e, "2W3W1r", 2, "", DEF_MODEC,DEF_MODEL }, - { "indexd", 11,24, 0x72e, "2D3D1r", 4, "", DEF_MODEC,DEF_MODEL }, - { "insb", 11,24, 0x0ae, "2B3I1r4d", 1, "", DEF_MODEC,DEF_MODEL }, - { "insw", 11,24, 0x1ae, "2W3I1r4d", 2, "", DEF_MODEC,DEF_MODEL }, - { "insd", 11,24, 0x3ae, "2D3I1r4d", 4, "", DEF_MODEC,DEF_MODEL }, - { "inssb", 14,24, 0x08ce, "1B2I4G3g", 1, "", DEF_MODEC,DEF_MODEL }, - { "inssw", 14,24, 0x09ce, "1W2I4G3g", 2, "", DEF_MODEC,DEF_MODEL }, - { "inssd", 14,24, 0x0bce, "1D2I4G3g", 4, "", DEF_MODEC,DEF_MODEL }, - { "jsr", 11,16, 0x67f, "1A", 4, "", 21,21 }, - { "jump", 11,16, 0x27f, "1A", 4, "", 21,21 }, - { "lfsr", 19,24, 0x00f3e,"1D", 4, "", DEF_MODEC,DEF_MODEL }, - { "lmr", 15,24, 0x0b1e, "2D1M", 4, "", DEF_MODEC,DEF_MODEL }, - { "lprb", 7,16, 0x6c, "2B1P", 1, "", DEF_MODEC,DEF_MODEL }, - { "lprw", 7,16, 0x6d, "2W1P", 2, "", DEF_MODEC,DEF_MODEL }, - { "lprd", 7,16, 0x6f, "2D1P", 4, "", DEF_MODEC,DEF_MODEL }, - { "lshb", 14,24, 0x144e, "1B2I", 1, "", DEF_MODEC,DEF_MODEL }, - { "lshw", 14,24, 0x154e, "1B2I", 1, "", DEF_MODEC,DEF_MODEL }, - { "lshd", 14,24, 0x174e, "1B2I", 1, "", DEF_MODEC,DEF_MODEL }, - { "meib", 14,24, 0x24ce, "1B2I", 1, "", DEF_MODEC,DEF_MODEL }, - { "meiw", 14,24, 0x25ce, "1W2I", 2, "", DEF_MODEC,DEF_MODEL }, - { "meid", 14,24, 0x27ce, "1D2I", 4, "", DEF_MODEC,DEF_MODEL }, - { "modb", 14,24, 0x38ce, "1B2I", 1, "", DEF_MODEC,DEF_MODEL }, - { "modw", 14,24, 0x39ce, "1W2I", 2, "", DEF_MODEC,DEF_MODEL }, - { "modd", 14,24, 0x3bce, "1D2I", 4, "", DEF_MODEC,DEF_MODEL }, - { "movf", 14,24, 0x05be, "1F2Z", 4, "", DEF_MODEC,DEF_MODEL }, - { "movl", 14,24, 0x04be, "1L2Z", 8, "", DEF_MODEC,DEF_MODEL }, - { "movb", 6,16, 0x14, "1B2I", 1, "", DEF_MODEC,DEF_MODEL }, - { "movw", 6,16, 0x15, "1W2I", 2, "", DEF_MODEC,DEF_MODEL }, - { "movd", 6,16, 0x17, "1D2I", 4, "", DEF_MODEC,DEF_MODEL }, - { "movbf", 14,24, 0x043e, "1B2Z", 1, "", DEF_MODEC,DEF_MODEL }, - { "movwf", 14,24, 0x053e, "1W2Z", 2, "", DEF_MODEC,DEF_MODEL }, - { "movdf", 14,24, 0x073e, "1D2Z", 4, "", DEF_MODEC,DEF_MODEL }, - { "movbl", 14,24, 0x003e, "1B2Z", 1, "", DEF_MODEC,DEF_MODEL }, - { "movwl", 14,24, 0x013e, "1W2Z", 2, "", DEF_MODEC,DEF_MODEL }, - { "movdl", 14,24, 0x033e, "1D2Z", 4, "", DEF_MODEC,DEF_MODEL }, - { "movfl", 14,24, 0x1b3e, "1F2Z", 4, "", DEF_MODEC,DEF_MODEL }, - { "movlf", 14,24, 0x163e, "1L2Z", 8, "", DEF_MODEC,DEF_MODEL }, - { "movmb", 14,24, 0x00ce, "1A2A3b", 1, "", DEF_MODEC,DEF_MODEL }, - { "movmw", 14,24, 0x01ce, "1A2A3b", 2, "", DEF_MODEC,DEF_MODEL }, - { "movmd", 14,24, 0x03ce, "1A2A3b", 4, "", DEF_MODEC,DEF_MODEL }, - { "movqb", 7,16, 0x5c, "2I1q", 1, "", DEF_MODEC,DEF_MODEL }, - { "movqw", 7,16, 0x5d, "2I1q", 2, "", DEF_MODEC,DEF_MODEL }, - { "movqd", 7,16, 0x5f, "2I1q", 4, "", DEF_MODEC,DEF_MODEL }, - { "movsb", 16,24, 0x000e, "1S", 0, "[]", DEF_MODEC,DEF_MODEL }, - { "movsw", 16,24, 0x010e, "1S", 0, "[]", DEF_MODEC,DEF_MODEL }, - { "movsd", 16,24, 0x030e, "1S", 0, "[]", DEF_MODEC,DEF_MODEL }, - { "movst", 16,24, 0x800e, "1S", 0, "[]", DEF_MODEC,DEF_MODEL }, - { "movsub", 14,24, 0x0cae, "1A2A", 1, "", DEF_MODEC,DEF_MODEL }, - { "movsuw", 14,24, 0x0dae, "1A2A", 2, "", DEF_MODEC,DEF_MODEL }, - { "movsud", 14,24, 0x0fae, "1A2A", 4, "", DEF_MODEC,DEF_MODEL }, - { "movusb", 14,24, 0x1cae, "1A2A", 1, "", DEF_MODEC,DEF_MODEL }, - { "movusw", 14,24, 0x1dae, "1A2A", 2, "", DEF_MODEC,DEF_MODEL }, - { "movusd", 14,24, 0x1fae, "1A2A", 4, "", DEF_MODEC,DEF_MODEL }, - { "movxbd", 14,24, 0x1cce, "1B2I", 1, "", DEF_MODEC,DEF_MODEL }, - { "movxwd", 14,24, 0x1dce, "1W2I", 2, "", DEF_MODEC,DEF_MODEL }, - { "movxbw", 14,24, 0x10ce, "1B2I", 1, "", DEF_MODEC,DEF_MODEL }, - { "movzbd", 14,24, 0x18ce, "1B2I", 1, "", DEF_MODEC,DEF_MODEL }, - { "movzwd", 14,24, 0x19ce, "1W2I", 2, "", DEF_MODEC,DEF_MODEL }, - { "movzbw", 14,24, 0x14ce, "1B2I", 1, "", DEF_MODEC,DEF_MODEL }, - { "mulf", 14,24, 0x31be, "1F2Z", 4, "", DEF_MODEC,DEF_MODEL }, - { "mull", 14,24, 0x30be, "1L2Z", 8, "", DEF_MODEC,DEF_MODEL }, - { "mulb", 14,24, 0x20ce, "1B2I", 1, "", DEF_MODEC,DEF_MODEL }, - { "mulw", 14,24, 0x21ce, "1W2I", 2, "", DEF_MODEC,DEF_MODEL }, - { "muld", 14,24, 0x23ce, "1D2I", 4, "", DEF_MODEC,DEF_MODEL }, - { "negf", 14,24, 0x15be, "1F2Z", 4, "", DEF_MODEC,DEF_MODEL }, - { "negl", 14,24, 0x14be, "1L2Z", 8, "", DEF_MODEC,DEF_MODEL }, - { "negb", 14,24, 0x204e, "1B2I", 1, "", DEF_MODEC,DEF_MODEL }, - { "negw", 14,24, 0x214e, "1W2I", 2, "", DEF_MODEC,DEF_MODEL }, - { "negd", 14,24, 0x234e, "1D2I", 4, "", DEF_MODEC,DEF_MODEL }, - { "nop", 8,8, 0xa2, "", 0, "", DEF_MODEC,DEF_MODEL }, - { "notb", 14,24, 0x244e, "1B2I", 1, "", DEF_MODEC,DEF_MODEL }, - { "notw", 14,24, 0x254e, "1W2I", 2, "", DEF_MODEC,DEF_MODEL }, - { "notd", 14,24, 0x274e, "1D2I", 4, "", DEF_MODEC,DEF_MODEL }, - { "orb", 6,16, 0x18, "1B2I", 1, "", DEF_MODEC,DEF_MODEL }, - { "orw", 6,16, 0x19, "1W2I", 2, "", DEF_MODEC,DEF_MODEL }, - { "ord", 6,16, 0x1b, "1D2I", 4, "", DEF_MODEC,DEF_MODEL }, - { "quob", 14,24, 0x30ce, "1B2I", 1, "", DEF_MODEC,DEF_MODEL }, - { "quow", 14,24, 0x31ce, "1W2I", 2, "", DEF_MODEC,DEF_MODEL }, - { "quod", 14,24, 0x33ce, "1D2I", 4, "", DEF_MODEC,DEF_MODEL }, - { "rdval", 19,24, 0x0031e,"1A", 4, "", DEF_MODEC,DEF_MODEL }, - { "remb", 14,24, 0x34ce, "1B2I", 1, "", DEF_MODEC,DEF_MODEL }, - { "remw", 14,24, 0x35ce, "1W2I", 2, "", DEF_MODEC,DEF_MODEL }, - { "remd", 14,24, 0x37ce, "1D2I", 4, "", DEF_MODEC,DEF_MODEL }, - { "restore", 8,8, 0x72, "1u", 0, "", DEF_MODEC,DEF_MODEL }, - { "ret", 8,8, 0x12, "1d", 0, "", DEF_MODEC,DEF_MODEL }, - { "reti", 8,8, 0x52, "", 0, "", DEF_MODEC,DEF_MODEL }, - { "rett", 8,8, 0x42, "1d", 0, "", DEF_MODEC,DEF_MODEL }, - { "rotb", 14,24, 0x004e, "1B2I", 1, "", DEF_MODEC,DEF_MODEL }, - { "rotw", 14,24, 0x014e, "1B2I", 1, "", DEF_MODEC,DEF_MODEL }, - { "rotd", 14,24, 0x034e, "1B2I", 1, "", DEF_MODEC,DEF_MODEL }, - { "roundfb", 14,24, 0x243e, "1F2I", 4, "", DEF_MODEC,DEF_MODEL }, - { "roundfw", 14,24, 0x253e, "1F2I", 4, "", DEF_MODEC,DEF_MODEL }, - { "roundfd", 14,24, 0x273e, "1F2I", 4, "", DEF_MODEC,DEF_MODEL }, - { "roundlb", 14,24, 0x203e, "1L2I", 8, "", DEF_MODEC,DEF_MODEL }, - { "roundlw", 14,24, 0x213e, "1L2I", 8, "", DEF_MODEC,DEF_MODEL }, - { "roundld", 14,24, 0x233e, "1L2I", 8, "", DEF_MODEC,DEF_MODEL }, - { "rxp", 8,8, 0x32, "1d", 0, "", DEF_MODEC,DEF_MODEL }, - { "seqb", 11,16, 0x3c, "1B", 0, "", DEF_MODEC,DEF_MODEL }, - { "seqw", 11,16, 0x3d, "1W", 0, "", DEF_MODEC,DEF_MODEL }, - { "seqd", 11,16, 0x3f, "1D", 0, "", DEF_MODEC,DEF_MODEL }, - { "sneb", 11,16, 0xbc, "1B", 0, "", DEF_MODEC,DEF_MODEL }, - { "snew", 11,16, 0xbd, "1W", 0, "", DEF_MODEC,DEF_MODEL }, - { "sned", 11,16, 0xbf, "1D", 0, "", DEF_MODEC,DEF_MODEL }, - { "scsb", 11,16, 0x13c, "1B", 0, "", DEF_MODEC,DEF_MODEL }, - { "scsw", 11,16, 0x13d, "1W", 0, "", DEF_MODEC,DEF_MODEL }, - { "scsd", 11,16, 0x13f, "1D", 0, "", DEF_MODEC,DEF_MODEL }, - { "sccb", 11,16, 0x1bc, "1B", 0, "", DEF_MODEC,DEF_MODEL }, - { "sccw", 11,16, 0x1bd, "1W", 0, "", DEF_MODEC,DEF_MODEL }, - { "sccd", 11,16, 0x1bf, "1D", 0, "", DEF_MODEC,DEF_MODEL }, - { "shib", 11,16, 0x23c, "1B", 0, "", DEF_MODEC,DEF_MODEL }, - { "shiw", 11,16, 0x23d, "1W", 0, "", DEF_MODEC,DEF_MODEL }, - { "shid", 11,16, 0x23f, "1D", 0, "", DEF_MODEC,DEF_MODEL }, - { "slsb", 11,16, 0x2bc, "1B", 0, "", DEF_MODEC,DEF_MODEL }, - { "slsw", 11,16, 0x2bd, "1W", 0, "", DEF_MODEC,DEF_MODEL }, - { "slsd", 11,16, 0x2bf, "1D", 0, "", DEF_MODEC,DEF_MODEL }, - { "sgtb", 11,16, 0x33c, "1B", 0, "", DEF_MODEC,DEF_MODEL }, - { "sgtw", 11,16, 0x33d, "1W", 0, "", DEF_MODEC,DEF_MODEL }, - { "sgtd", 11,16, 0x33f, "1D", 0, "", DEF_MODEC,DEF_MODEL }, - { "sleb", 11,16, 0x3bc, "1B", 0, "", DEF_MODEC,DEF_MODEL }, - { "slew", 11,16, 0x3bd, "1W", 0, "", DEF_MODEC,DEF_MODEL }, - { "sled", 11,16, 0x3bf, "1D", 0, "", DEF_MODEC,DEF_MODEL }, - { "sfsb", 11,16, 0x43c, "1B", 0, "", DEF_MODEC,DEF_MODEL }, - { "sfsw", 11,16, 0x43d, "1W", 0, "", DEF_MODEC,DEF_MODEL }, - { "sfsd", 11,16, 0x43f, "1D", 0, "", DEF_MODEC,DEF_MODEL }, - { "sfcb", 11,16, 0x4bc, "1B", 0, "", DEF_MODEC,DEF_MODEL }, - { "sfcw", 11,16, 0x4bd, "1W", 0, "", DEF_MODEC,DEF_MODEL }, - { "sfcd", 11,16, 0x4bf, "1D", 0, "", DEF_MODEC,DEF_MODEL }, - { "slob", 11,16, 0x53c, "1B", 0, "", DEF_MODEC,DEF_MODEL }, - { "slow", 11,16, 0x53d, "1W", 0, "", DEF_MODEC,DEF_MODEL }, - { "slod", 11,16, 0x53f, "1D", 0, "", DEF_MODEC,DEF_MODEL }, - { "shsb", 11,16, 0x5bc, "1B", 0, "", DEF_MODEC,DEF_MODEL }, - { "shsw", 11,16, 0x5bd, "1W", 0, "", DEF_MODEC,DEF_MODEL }, - { "shsd", 11,16, 0x5bf, "1D", 0, "", DEF_MODEC,DEF_MODEL }, - { "sltb", 11,16, 0x63c, "1B", 0, "", DEF_MODEC,DEF_MODEL }, - { "sltw", 11,16, 0x63d, "1W", 0, "", DEF_MODEC,DEF_MODEL }, - { "sltd", 11,16, 0x63f, "1D", 0, "", DEF_MODEC,DEF_MODEL }, - { "sgeb", 11,16, 0x6bc, "1B", 0, "", DEF_MODEC,DEF_MODEL }, - { "sgew", 11,16, 0x6bd, "1W", 0, "", DEF_MODEC,DEF_MODEL }, - { "sged", 11,16, 0x6bf, "1D", 0, "", DEF_MODEC,DEF_MODEL }, - { "sutb", 11,16, 0x73c, "1B", 0, "", DEF_MODEC,DEF_MODEL }, - { "sutw", 11,16, 0x73d, "1W", 0, "", DEF_MODEC,DEF_MODEL }, - { "sutd", 11,16, 0x73f, "1D", 0, "", DEF_MODEC,DEF_MODEL }, - { "sufb", 11,16, 0x7bc, "1B", 0, "", DEF_MODEC,DEF_MODEL }, - { "sufw", 11,16, 0x7bd, "1W", 0, "", DEF_MODEC,DEF_MODEL }, - { "sufd", 11,16, 0x7bf, "1D", 0, "", DEF_MODEC,DEF_MODEL }, - { "save", 8,8, 0x62, "1U", 0, "", DEF_MODEC,DEF_MODEL }, - { "sbitb", 14,24, 0x184e, "1B2A", 1, "", DEF_MODEC,DEF_MODEL }, - { "sbitw", 14,24, 0x194e, "1W2A", 2, "", DEF_MODEC,DEF_MODEL }, - { "sbitd", 14,24, 0x1b4e, "1D2A", 4, "", DEF_MODEC,DEF_MODEL }, - { "sbitib", 14,24, 0x1c4e, "1B2A", 1, "", DEF_MODEC,DEF_MODEL }, - { "sbitiw", 14,24, 0x1d4e, "1W2A", 2, "", DEF_MODEC,DEF_MODEL }, - { "sbitid", 14,24, 0x1f4e, "1D2A", 4, "", DEF_MODEC,DEF_MODEL }, - { "setcfg", 15,24, 0x0b0e, "1O", 0, "", DEF_MODEC,DEF_MODEL }, - { "sfsr", 14,24, 0x373e, "1f", 0, "", DEF_MODEC,DEF_MODEL }, - { "skpsb", 16,24, 0x0c0e, "1S", 0, "[]", DEF_MODEC,DEF_MODEL }, - { "skpsw", 16,24, 0x0d0e, "1S", 0, "[]", DEF_MODEC,DEF_MODEL }, - { "skpsd", 16,24, 0x0f0e, "1S", 0, "[]", DEF_MODEC,DEF_MODEL }, - { "skpst", 16,24, 0x8c0e, "1S", 0, "[]", DEF_MODEC,DEF_MODEL }, - { "smr", 15,24, 0x0f1e, "2I1M", 4, "", DEF_MODEC,DEF_MODEL }, - { "sprb", 7,16, 0x2c, "2I1P", 1, "", DEF_MODEC,DEF_MODEL }, - { "sprw", 7,16, 0x2d, "2I1P", 2, "", DEF_MODEC,DEF_MODEL }, - { "sprd", 7,16, 0x2f, "2I1P", 4, "", DEF_MODEC,DEF_MODEL }, - { "subf", 14,24, 0x11be, "1F2Z", 4, "", DEF_MODEC,DEF_MODEL }, - { "subl", 14,24, 0x10be, "1L2Z", 8, "", DEF_MODEC,DEF_MODEL }, - { "subb", 6,16, 0x20, "1B2I", 1, "", DEF_MODEC,DEF_MODEL }, - { "subw", 6,16, 0x21, "1W2I", 2, "", DEF_MODEC,DEF_MODEL }, - { "subd", 6,16, 0x23, "1D2I", 4, "", DEF_MODEC,DEF_MODEL }, - { "subcb", 6,16, 0x30, "1B2I", 1, "", DEF_MODEC,DEF_MODEL }, - { "subcw", 6,16, 0x31, "1W2I", 2, "", DEF_MODEC,DEF_MODEL }, - { "subcd", 6,16, 0x33, "1D2I", 4, "", DEF_MODEC,DEF_MODEL }, - { "subpb", 14,24, 0x2c4e, "1B2I", 1, "", DEF_MODEC,DEF_MODEL }, - { "subpw", 14,24, 0x2d4e, "1W2I", 2, "", DEF_MODEC,DEF_MODEL }, - { "subpd", 14,24, 0x2f4e, "1D2I", 4, "", DEF_MODEC,DEF_MODEL }, -#ifdef NS32K_SVC_IMMED_OPERANDS - { "svc", 8,8, 0xe2, "2i1i", 1, "", DEF_MODEC,DEF_MODEL }, /* not really, but some unix uses it */ -#else - { "svc", 8,8, 0xe2, "", 0, "", DEF_MODEC,DEF_MODEL }, -#endif - { "tbitb", 6,16, 0x34, "1B2A", 1, "", DEF_MODEC,DEF_MODEL }, - { "tbitw", 6,16, 0x35, "1W2A", 2, "", DEF_MODEC,DEF_MODEL }, - { "tbitd", 6,16, 0x37, "1D2A", 4, "", DEF_MODEC,DEF_MODEL }, - { "truncfb", 14,24, 0x2c3e, "1F2I", 4, "", DEF_MODEC,DEF_MODEL }, - { "truncfw", 14,24, 0x2d3e, "1F2I", 4, "", DEF_MODEC,DEF_MODEL }, - { "truncfd", 14,24, 0x2f3e, "1F2I", 4, "", DEF_MODEC,DEF_MODEL }, - { "trunclb", 14,24, 0x283e, "1L2I", 8, "", DEF_MODEC,DEF_MODEL }, - { "trunclw", 14,24, 0x293e, "1L2I", 8, "", DEF_MODEC,DEF_MODEL }, - { "truncld", 14,24, 0x2b3e, "1L2I", 8, "", DEF_MODEC,DEF_MODEL }, - { "wait", 8,8, 0xb2, "", 0, "", DEF_MODEC,DEF_MODEL }, - { "wrval", 19,24, 0x0071e,"1A", 0, "", DEF_MODEC,DEF_MODEL }, - { "xorb", 6,16, 0x38, "1B2I", 1, "", DEF_MODEC,DEF_MODEL }, - { "xorw", 6,16, 0x39, "1W2I", 2, "", DEF_MODEC,DEF_MODEL }, - { "xord", 6,16, 0x3b, "1D2I", 4, "", DEF_MODEC,DEF_MODEL }, - { "dotf", 14,24, 0x0dfe, "1F2F", 4, "", DEF_MODEC,DEF_MODEL }, - { "dotl", 14,24, 0x0cfe, "1L2L", 8, "", DEF_MODEC,DEF_MODEL }, - { "logbf", 14,24, 0x15fe, "1F2Z", 4, "", DEF_MODEC,DEF_MODEL }, - { "logbl", 14,24, 0x14fe, "1L2Z", 8, "", DEF_MODEC,DEF_MODEL }, - { "polyf", 14,24, 0x09fe, "1F2F", 4, "", DEF_MODEC,DEF_MODEL }, - { "polyl", 14,24, 0x08fe, "1L2L", 8, "", DEF_MODEC,DEF_MODEL }, - { "scalbf", 14,24, 0x11fe, "1F2Z", 4, "", DEF_MODEC,DEF_MODEL }, - { "scalbl", 14,24, 0x10fe, "1L2Z", 8, "", DEF_MODEC,DEF_MODEL }, -}; - -static const int numopcodes=sizeof(ns32k_opcodes)/sizeof(ns32k_opcodes[0]); - -static const struct ns32k_opcode *const endop = ns32k_opcodes+sizeof(ns32k_opcodes)/sizeof(ns32k_opcodes[0]); - -#define MAX_ARGS 4 -#define ARG_LEN 50 - diff --git a/contrib/gdb/include/opcode/pn.h b/contrib/gdb/include/opcode/pn.h deleted file mode 100644 index 0f59a2a53ce9d..0000000000000 --- a/contrib/gdb/include/opcode/pn.h +++ /dev/null @@ -1,282 +0,0 @@ -/* Print GOULD PN (PowerNode) instructions for GDB, the GNU debugger. - Copyright (C) 1986, 1987, 1989 Free Software Foundation, Inc. - -This file is part of GDB. - -GDB 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. - -GDB 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 GDB; see the file COPYING. If not, write to -the Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ - -struct gld_opcode -{ - char *name; - unsigned long opcode; - unsigned long mask; - char *args; - int length; -}; - -/* We store four bytes of opcode for all opcodes because that - is the most any of them need. The actual length of an instruction - is always at least 2 bytes, and at most four. The length of the - instruction is based on the opcode. - - The mask component is a mask saying which bits must match - particular opcode in order for an instruction to be an instance - of that opcode. - - The args component is a string containing characters - that are used to format the arguments to the instruction. */ - -/* Kinds of operands: - r Register in first field - R Register in second field - b Base register in first field - B Base register in second field - v Vector register in first field - V Vector register in first field - A Optional address register (base register) - X Optional index register - I Immediate data (16bits signed) - O Offset field (16bits signed) - h Offset field (15bits signed) - d Offset field (14bits signed) - S Shift count field - - any other characters are printed as is... -*/ - -/* The assembler requires that this array be sorted as follows: - all instances of the same mnemonic must be consecutive. - All instances of the same mnemonic with the same number of operands - must be consecutive. - */ -struct gld_opcode gld_opcodes[] = -{ -{ "abm", 0xa0080000, 0xfc080000, "f,xOA,X", 4 }, -{ "abr", 0x18080000, 0xfc0c0000, "r,f", 2 }, -{ "aci", 0xfc770000, 0xfc7f8000, "r,I", 4 }, -{ "adfd", 0xe0080002, 0xfc080002, "r,xOA,X", 4 }, -{ "adfw", 0xe0080000, 0xfc080000, "r,xOA,X", 4 }, -{ "adi", 0xc8010000, 0xfc7f0000, "r,I", 4 }, -{ "admb", 0xb8080000, 0xfc080000, "r,xOA,X", 4 }, -{ "admd", 0xb8000002, 0xfc080002, "r,xOA,X", 4 }, -{ "admh", 0xb8000001, 0xfc080001, "r,xOA,X", 4 }, -{ "admw", 0xb8000000, 0xfc080000, "r,xOA,X", 4 }, -{ "adr", 0x38000000, 0xfc0f0000, "r,R", 2 }, -{ "adrfd", 0x38090000, 0xfc0f0000, "r,R", 2 }, -{ "adrfw", 0x38010000, 0xfc0f0000, "r,R", 2 }, -{ "adrm", 0x38080000, 0xfc0f0000, "r,R", 2 }, -{ "ai", 0xfc030000, 0xfc07ffff, "I", 4 }, -{ "anmb", 0x84080000, 0xfc080000, "r,xOA,X", 4 }, -{ "anmd", 0x84000002, 0xfc080002, "r,xOA,X", 4 }, -{ "anmh", 0x84000001, 0xfc080001, "r,xOA,X", 4 }, -{ "anmw", 0x84000000, 0xfc080000, "r,xOA,X", 4 }, -{ "anr", 0x04000000, 0xfc0f0000, "r,R", 2 }, -{ "armb", 0xe8080000, 0xfc080000, "r,xOA,X", 4 }, -{ "armd", 0xe8000002, 0xfc080002, "r,xOA,X", 4 }, -{ "armh", 0xe8000001, 0xfc080001, "r,xOA,X", 4 }, -{ "armw", 0xe8000000, 0xfc080000, "r,xOA,X", 4 }, -{ "bcf", 0xf0000000, 0xfc080000, "I,xOA,X", 4 }, -{ "bct", 0xec000000, 0xfc080000, "I,xOA,X", 4 }, -{ "bei", 0x00060000, 0xffff0000, "", 2 }, -{ "bft", 0xf0000000, 0xff880000, "xOA,X", 4 }, -{ "bib", 0xf4000000, 0xfc780000, "r,xOA", 4 }, -{ "bid", 0xf4600000, 0xfc780000, "r,xOA", 4 }, -{ "bih", 0xf4200000, 0xfc780000, "r,xOA", 4 }, -{ "biw", 0xf4400000, 0xfc780000, "r,xOA", 4 }, -{ "bl", 0xf8800000, 0xff880000, "xOA,X", 4 }, -{ "bsub", 0x5c080000, 0xff8f0000, "", 2 }, -{ "bsubm", 0x28080000, 0xfc080000, "", 4 }, -{ "bu", 0xec000000, 0xff880000, "xOA,X", 4 }, -{ "call", 0x28080000, 0xfc0f0000, "", 2 }, -{ "callm", 0x5c080000, 0xff880000, "", 4 }, -{ "camb", 0x90080000, 0xfc080000, "r,xOA,X", 4 }, -{ "camd", 0x90000002, 0xfc080002, "r,xOA,X", 4 }, -{ "camh", 0x90000001, 0xfc080001, "r,xOA,X", 4 }, -{ "camw", 0x90000000, 0xfc080000, "r.xOA,X", 4 }, -{ "car", 0x10000000, 0xfc0f0000, "r,R", 2 }, -{ "cd", 0xfc060000, 0xfc070000, "r,f", 4 }, -{ "cea", 0x000f0000, 0xffff0000, "", 2 }, -{ "ci", 0xc8050000, 0xfc7f0000, "r,I", 4 }, -{ "cmc", 0x040a0000, 0xfc7f0000, "r", 2 }, -{ "cmmb", 0x94080000, 0xfc080000, "r,xOA,X", 4 }, -{ "cmmd", 0x94000002, 0xfc080002, "r,xOA,X", 4 }, -{ "cmmh", 0x94000001, 0xfc080001, "r,xOA,X", 4 }, -{ "cmmw", 0x94000000, 0xfc080000, "r,xOA,X", 4 }, -{ "cmr", 0x14000000, 0xfc0f0000, "r,R", 2 }, -{ "daci", 0xfc7f0000, 0xfc7f8000, "r,I", 4 }, -{ "dae", 0x000e0000, 0xffff0000, "", 2 }, -{ "dai", 0xfc040000, 0xfc07ffff, "I", 4 }, -{ "dci", 0xfc6f0000, 0xfc7f8000, "r,I", 4 }, -{ "di", 0xfc010000, 0xfc07ffff, "I", 4 }, -{ "dvfd", 0xe4000002, 0xfc080002, "r,xOA,X", 4 }, -{ "dvfw", 0xe4000000, 0xfc080000, "r,xOA,X", 4 }, -{ "dvi", 0xc8040000, 0xfc7f0000, "r,I", 4 }, -{ "dvmb", 0xc4080000, 0xfc080000, "r,xOA,X", 4 }, -{ "dvmh", 0xc4000001, 0xfc080001, "r,xOA,X", 4 }, -{ "dvmw", 0xc4000000, 0xfc080000, "r,xOA,X", 4 }, -{ "dvr", 0x380a0000, 0xfc0f0000, "r,R", 2 }, -{ "dvrfd", 0x380c0000, 0xfc0f0000, "r,R", 4 }, -{ "dvrfw", 0x38040000, 0xfc0f0000, "r,xOA,X", 4 }, -{ "eae", 0x00080000, 0xffff0000, "", 2 }, -{ "eci", 0xfc670000, 0xfc7f8080, "r,I", 4 }, -{ "ecwcs", 0xfc4f0000, 0xfc7f8000, "", 4 }, -{ "ei", 0xfc000000, 0xfc07ffff, "I", 4 }, -{ "eomb", 0x8c080000, 0xfc080000, "r,xOA,X", 4 }, -{ "eomd", 0x8c000002, 0xfc080002, "r,xOA,X", 4 }, -{ "eomh", 0x8c000001, 0xfc080001, "r,xOA,X", 4 }, -{ "eomw", 0x8c000000, 0xfc080000, "r,xOA,X", 4 }, -{ "eor", 0x0c000000, 0xfc0f0000, "r,R", 2 }, -{ "eorm", 0x0c080000, 0xfc0f0000, "r,R", 2 }, -{ "es", 0x00040000, 0xfc7f0000, "r", 2 }, -{ "exm", 0xa8000000, 0xff880000, "xOA,X", 4 }, -{ "exr", 0xc8070000, 0xfc7f0000, "r", 2 }, -{ "exrr", 0xc8070002, 0xfc7f0002, "r", 2 }, -{ "fixd", 0x380d0000, 0xfc0f0000, "r,R", 2 }, -{ "fixw", 0x38050000, 0xfc0f0000, "r,R", 2 }, -{ "fltd", 0x380f0000, 0xfc0f0000, "r,R", 2 }, -{ "fltw", 0x38070000, 0xfc0f0000, "r,R", 2 }, -{ "grio", 0xfc3f0000, 0xfc7f8000, "r,I", 4 }, -{ "halt", 0x00000000, 0xffff0000, "", 2 }, -{ "hio", 0xfc370000, 0xfc7f8000, "r,I", 4 }, -{ "jwcs", 0xfa080000, 0xff880000, "xOA,X", 4 }, -{ "la", 0x50000000, 0xfc000000, "r,xOA,X", 4 }, -{ "labr", 0x58080000, 0xfc080000, "b,xOA,X", 4 }, -{ "lb", 0xac080000, 0xfc080000, "r,xOA,X", 4 }, -{ "lcs", 0x00030000, 0xfc7f0000, "r", 2 }, -{ "ld", 0xac000002, 0xfc080002, "r,xOA,X", 4 }, -{ "lear", 0x80000000, 0xfc080000, "r,xOA,X", 4 }, -{ "lf", 0xcc000000, 0xfc080000, "r,xOA,X", 4 }, -{ "lfbr", 0xcc080000, 0xfc080000, "b,xOA,X", 4 }, -{ "lh", 0xac000001, 0xfc080001, "r,xOA,X", 4 }, -{ "li", 0xc8000000, 0xfc7f0000, "r,I", 4 }, -{ "lmap", 0x2c070000, 0xfc7f0000, "r", 2 }, -{ "lmb", 0xb0080000, 0xfc080000, "r,xOA,X", 4 }, -{ "lmd", 0xb0000002, 0xfc080002, "r,xOA,X", 4 }, -{ "lmh", 0xb0000001, 0xfc080001, "r,xOA,X", 4 }, -{ "lmw", 0xb0000000, 0xfc080000, "r,xOA,X", 4 }, -{ "lnb", 0xb4080000, 0xfc080000, "r,xOA,X", 4 }, -{ "lnd", 0xb4000002, 0xfc080002, "r,xOA,X", 4 }, -{ "lnh", 0xb4000001, 0xfc080001, "r,xOA,X", 4 }, -{ "lnw", 0xb4000000, 0xfc080000, "r,xOA,X", 4 }, -{ "lpsd", 0xf9800000, 0xff880000, "r,xOA,X", 4 }, -{ "lpsdcm", 0xfa800000, 0xff880000, "r,xOA,X", 4 }, -{ "lw", 0xac000000, 0xfc080000, "r,xOA,X", 4 }, -{ "lwbr", 0x5c000000, 0xfc080000, "b,xOA,X", 4 }, -{ "mpfd", 0xe4080002, 0xfc080002, "r,xOA,X", 4 }, -{ "mpfw", 0xe4080000, 0xfc080000, "r,xOA,X", 4 }, -{ "mpi", 0xc8030000, 0xfc7f0000, "r,I", 4 }, -{ "mpmb", 0xc0080000, 0xfc080000, "r,xOA,X", 4 }, -{ "mpmh", 0xc0000001, 0xfc080001, "r,xOA,X", 4 }, -{ "mpmw", 0xc0000000, 0xfc080000, "r,xOA,X", 4 }, -{ "mpr", 0x38020000, 0xfc0f0000, "r,R", 2 }, -{ "mprfd", 0x380e0000, 0xfc0f0000, "r,R", 2 }, -{ "mprfw", 0x38060000, 0xfc0f0000, "r,R", 2 }, -{ "nop", 0x00020000, 0xffff0000, "", 2 }, -{ "ormb", 0x88080000, 0xfc080000, "r,xOA,X", 4 }, -{ "ormd", 0x88000002, 0xfc080002, "r,xOA,X", 4 }, -{ "ormh", 0x88000001, 0xfc080001, "r,xOA,X", 4 }, -{ "ormw", 0x88000000, 0xfc080000, "r,xOA,X", 4 }, -{ "orr", 0x08000000, 0xfc0f0000, "r,R", 2 }, -{ "orrm", 0x08080000, 0xfc0f0000, "r,R", 2 }, -{ "rdsts", 0x00090000, 0xfc7f0000, "r", 2 }, -{ "return", 0x280e0000, 0xfc7f0000, "", 2 }, -{ "ri", 0xfc020000, 0xfc07ffff, "I", 4 }, -{ "rnd", 0x00050000, 0xfc7f0000, "r", 2 }, -{ "rpswt", 0x040b0000, 0xfc7f0000, "r", 2 }, -{ "rschnl", 0xfc2f0000, 0xfc7f8000, "r,I", 4 }, -{ "rsctl", 0xfc470000, 0xfc7f8000, "r,I", 4 }, -{ "rwcs", 0x000b0000, 0xfc0f0000, "r,R", 2 }, -{ "sacz", 0x10080000, 0xfc0f0000, "r,R", 2 }, -{ "sbm", 0x98080000, 0xfc080000, "f,xOA,X", 4 }, -{ "sbr", 0x18000000, 0xfc0c0000, "r,f", 4 }, -{ "sea", 0x000d0000, 0xffff0000, "", 2 }, -{ "setcpu", 0x2c090000, 0xfc7f0000, "r", 2 }, -{ "sio", 0xfc170000, 0xfc7f8000, "r,I", 4 }, -{ "sipu", 0x000a0000, 0xffff0000, "", 2 }, -{ "sla", 0x1c400000, 0xfc600000, "r,S", 2 }, -{ "slad", 0x20400000, 0xfc600000, "r,S", 2 }, -{ "slc", 0x24400000, 0xfc600000, "r,S", 2 }, -{ "sll", 0x1c600000, 0xfc600000, "r,S", 2 }, -{ "slld", 0x20600000, 0xfc600000, "r,S", 2 }, -{ "smc", 0x04070000, 0xfc070000, "", 2 }, -{ "sra", 0x1c000000, 0xfc600000, "r,S", 2 }, -{ "srad", 0x20000000, 0xfc600000, "r,S", 2 }, -{ "src", 0x24000000, 0xfc600000, "r,S", 2 }, -{ "srl", 0x1c200000, 0xfc600000, "r,S", 2 }, -{ "srld", 0x20200000, 0xfc600000, "r,S", 2 }, -{ "stb", 0xd4080000, 0xfc080000, "r,xOA,X", 4 }, -{ "std", 0xd4000002, 0xfc080002, "r,xOA,X", 4 }, -{ "stf", 0xdc000000, 0xfc080000, "r,xOA,X", 4 }, -{ "stfbr", 0x54000000, 0xfc080000, "b,xOA,X", 4 }, -{ "sth", 0xd4000001, 0xfc080001, "r,xOA,X", 4 }, -{ "stmb", 0xd8080000, 0xfc080000, "r,xOA,X", 4 }, -{ "stmd", 0xd8000002, 0xfc080002, "r,xOA,X", 4 }, -{ "stmh", 0xd8000001, 0xfc080001, "r,xOA,X", 4 }, -{ "stmw", 0xd8000000, 0xfc080000, "r,xOA,X", 4 }, -{ "stpio", 0xfc270000, 0xfc7f8000, "r,I", 4 }, -{ "stw", 0xd4000000, 0xfc080000, "r,xOA,X", 4 }, -{ "stwbr", 0x54000000, 0xfc080000, "b,xOA,X", 4 }, -{ "suabr", 0x58000000, 0xfc080000, "b,xOA,X", 4 }, -{ "sufd", 0xe0000002, 0xfc080002, "r,xOA,X", 4 }, -{ "sufw", 0xe0000000, 0xfc080000, "r,xOA,X", 4 }, -{ "sui", 0xc8020000, 0xfc7f0000, "r,I", 4 }, -{ "sumb", 0xbc080000, 0xfc080000, "r,xOA,X", 4 }, -{ "sumd", 0xbc000002, 0xfc080002, "r,xOA,X", 4 }, -{ "sumh", 0xbc000001, 0xfc080001, "r,xOA,X", 4 }, -{ "sumw", 0xbc000000, 0xfc080000, "r,xOA,X", 4 }, -{ "sur", 0x3c000000, 0xfc0f0000, "r,R", 2 }, -{ "surfd", 0x380b0000, 0xfc0f0000, "r,xOA,X", 4 }, -{ "surfw", 0x38030000, 0xfc0f0000, "r,R", 2 }, -{ "surm", 0x3c080000, 0xfc0f0000, "r,R", 2 }, -{ "svc", 0xc8060000, 0xffff0000, "", 4 }, -{ "tbm", 0xa4080000, 0xfc080000, "f,xOA,X", 4 }, -{ "tbr", 0x180c0000, 0xfc0c0000, "r,f", 2 }, -{ "tbrr", 0x2c020000, 0xfc0f0000, "r,B", 2 }, -{ "tccr", 0x28040000, 0xfc7f0000, "", 2 }, -{ "td", 0xfc050000, 0xfc070000, "r,f", 4 }, -{ "tio", 0xfc1f0000, 0xfc7f8000, "r,I", 4 }, -{ "tmapr", 0x2c0a0000, 0xfc0f0000, "r,R", 2 }, -{ "tpcbr", 0x280c0000, 0xfc7f0000, "r", 2 }, -{ "trbr", 0x2c010000, 0xfc0f0000, "b,R", 2 }, -{ "trc", 0x2c030000, 0xfc0f0000, "r,R", 2 }, -{ "trcc", 0x28050000, 0xfc7f0000, "", 2 }, -{ "trcm", 0x2c0b0000, 0xfc0f0000, "r,R", 2 }, -{ "trn", 0x2c040000, 0xfc0f0000, "r,R", 2 }, -{ "trnm", 0x2c0c0000, 0xfc0f0000, "r,R", 2 }, -{ "trr", 0x2c000000, 0xfc0f0000, "r,R", 2 }, -{ "trrm", 0x2c080000, 0xfc0f0000, "r,R", 2 }, -{ "trsc", 0x2c0e0000, 0xfc0f0000, "r,R", 2 }, -{ "trsw", 0x28000000, 0xfc7f0000, "r", 2 }, -{ "tscr", 0x2c0f0000, 0xfc0f0000, "r,R", 2 }, -{ "uei", 0x00070000, 0xffff0000, "", 2 }, -{ "wait", 0x00010000, 0xffff0000, "", 2 }, -{ "wcwcs", 0xfc5f0000, 0xfc7f8000, "", 4 }, -{ "wwcs", 0x000c0000, 0xfc0f0000, "r,R", 2 }, -{ "xcbr", 0x28020000, 0xfc0f0000, "b,B", 2 }, -{ "xcr", 0x2c050000, 0xfc0f0000, "r,R", 2 }, -{ "xcrm", 0x2c0d0000, 0xfc0f0000, "r,R", 2 }, -{ "zbm", 0x9c080000, 0xfc080000, "f,xOA,X", 4 }, -{ "zbr", 0x18040000, 0xfc0c0000, "r,f", 2 }, -{ "zmb", 0xf8080000, 0xfc080000, "r,xOA,X", 4 }, -{ "zmd", 0xf8000002, 0xfc080002, "r,xOA,X", 4 }, -{ "zmh", 0xf8000001, 0xfc080001, "r,xOA,X", 4 }, -{ "zmw", 0xf8000000, 0xfc080000, "r,xOA,X", 4 }, -{ "zr", 0x0c000000, 0xfc0f0000, "r", 2 }, -}; - -int numopcodes = sizeof(gld_opcodes) / sizeof(gld_opcodes[0]); - -struct gld_opcode *endop = gld_opcodes + sizeof(gld_opcodes) / - sizeof(gld_opcodes[0]); diff --git a/contrib/gdb/include/opcode/ppc.h b/contrib/gdb/include/opcode/ppc.h deleted file mode 100644 index a9e3b24ab30ea..0000000000000 --- a/contrib/gdb/include/opcode/ppc.h +++ /dev/null @@ -1,248 +0,0 @@ -/* ppc.h -- Header file for PowerPC opcode table - Copyright 1994, 1995 Free Software Foundation, Inc. - Written by Ian Lance Taylor, Cygnus Support - -This file is part of GDB, GAS, and the GNU binutils. - -GDB, GAS, and the GNU binutils are free software; you can redistribute -them and/or modify them 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. - -GDB, GAS, and the GNU binutils are distributed in the hope that they -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 file; see the file COPYING. If not, write to the Free -Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ - -#ifndef PPC_H -#define PPC_H - -/* The opcode table is an array of struct powerpc_opcode. */ - -struct powerpc_opcode -{ - /* The opcode name. */ - const char *name; - - /* The opcode itself. Those bits which will be filled in with - operands are zeroes. */ - unsigned long opcode; - - /* The opcode mask. This is used by the disassembler. This is a - mask containing ones indicating those bits which must match the - opcode field, and zeroes indicating those bits which need not - match (and are presumably filled in by operands). */ - unsigned long mask; - - /* One bit flags for the opcode. These are used to indicate which - specific processors support the instructions. The defined values - are listed below. */ - unsigned long flags; - - /* An array of operand codes. Each code is an index into the - operand table. They appear in the order which the operands must - appear in assembly code, and are terminated by a zero. */ - unsigned char operands[8]; -}; - -/* The table itself is sorted by major opcode number, and is otherwise - in the order in which the disassembler should consider - instructions. */ -extern const struct powerpc_opcode powerpc_opcodes[]; -extern const int powerpc_num_opcodes; - -/* Values defined for the flags field of a struct powerpc_opcode. */ - -/* Opcode is defined for the PowerPC architecture. */ -#define PPC_OPCODE_PPC (01) - -/* Opcode is defined for the POWER (RS/6000) architecture. */ -#define PPC_OPCODE_POWER (02) - -/* Opcode is defined for the POWER2 (Rios 2) architecture. */ -#define PPC_OPCODE_POWER2 (04) - -/* Opcode is only defined on 32 bit architectures. */ -#define PPC_OPCODE_32 (010) - -/* Opcode is only defined on 64 bit architectures. */ -#define PPC_OPCODE_64 (020) - -/* Opcode is supported by the Motorola PowerPC 601 processor. The 601 - is assumed to support all PowerPC (PPC_OPCODE_PPC) instructions, - but it also supports many additional POWER instructions. */ -#define PPC_OPCODE_601 (040) - -/* Opcode is supported in both the Power and PowerPC architectures - (ie, compiler's -mcpu=common or assembler's -mcom). */ -#define PPC_OPCODE_COMMON (0100) - -/* Opcode is supported for any Power or PowerPC platform (this is - for the assembler's -many option, and it eliminates duplicates). */ -#define PPC_OPCODE_ANY (0200) - -/* A macro to extract the major opcode from an instruction. */ -#define PPC_OP(i) (((i) >> 26) & 0x3f) - -/* The operands table is an array of struct powerpc_operand. */ - -struct powerpc_operand -{ - /* The number of bits in the operand. */ - int bits; - - /* How far the operand is left shifted in the instruction. */ - int shift; - - /* Insertion function. This is used by the assembler. To insert an - operand value into an instruction, check this field. - - If it is NULL, execute - i |= (op & ((1 << o->bits) - 1)) << o->shift; - (i is the instruction which we are filling in, o is a pointer to - this structure, and op is the opcode value; this assumes twos - complement arithmetic). - - If this field is not NULL, then simply call it with the - instruction and the operand value. It will return the new value - of the instruction. If the ERRMSG argument is not NULL, then if - the operand value is illegal, *ERRMSG will be set to a warning - string (the operand will be inserted in any case). If the - operand value is legal, *ERRMSG will be unchanged (most operands - can accept any value). */ - unsigned long (*insert) PARAMS ((unsigned long instruction, long op, - const char **errmsg)); - - /* Extraction function. This is used by the disassembler. To - extract this operand type from an instruction, check this field. - - If it is NULL, compute - op = ((i) >> o->shift) & ((1 << o->bits) - 1); - if ((o->flags & PPC_OPERAND_SIGNED) != 0 - && (op & (1 << (o->bits - 1))) != 0) - op -= 1 << o->bits; - (i is the instruction, o is a pointer to this structure, and op - is the result; this assumes twos complement arithmetic). - - If this field is not NULL, then simply call it with the - instruction value. It will return the value of the operand. If - the INVALID argument is not NULL, *INVALID will be set to - non-zero if this operand type can not actually be extracted from - this operand (i.e., the instruction does not match). If the - operand is valid, *INVALID will not be changed. */ - long (*extract) PARAMS ((unsigned long instruction, int *invalid)); - - /* One bit syntax flags. */ - unsigned long flags; -}; - -/* Elements in the table are retrieved by indexing with values from - the operands field of the powerpc_opcodes table. */ - -extern const struct powerpc_operand powerpc_operands[]; - -/* Values defined for the flags field of a struct powerpc_operand. */ - -/* This operand takes signed values. */ -#define PPC_OPERAND_SIGNED (01) - -/* This operand takes signed values, but also accepts a full positive - range of values when running in 32 bit mode. That is, if bits is - 16, it takes any value from -0x8000 to 0xffff. In 64 bit mode, - this flag is ignored. */ -#define PPC_OPERAND_SIGNOPT (02) - -/* This operand does not actually exist in the assembler input. This - is used to support extended mnemonics such as mr, for which two - operands fields are identical. The assembler should call the - insert function with any op value. The disassembler should call - the extract function, ignore the return value, and check the value - placed in the valid argument. */ -#define PPC_OPERAND_FAKE (04) - -/* The next operand should be wrapped in parentheses rather than - separated from this one by a comma. This is used for the load and - store instructions which want their operands to look like - reg,displacement(reg) - */ -#define PPC_OPERAND_PARENS (010) - -/* This operand may use the symbolic names for the CR fields, which - are - lt 0 gt 1 eq 2 so 3 un 3 - cr0 0 cr1 1 cr2 2 cr3 3 - cr4 4 cr5 5 cr6 6 cr7 7 - These may be combined arithmetically, as in cr2*4+gt. These are - only supported on the PowerPC, not the POWER. */ -#define PPC_OPERAND_CR (020) - -/* This operand names a register. The disassembler uses this to print - register names with a leading 'r'. */ -#define PPC_OPERAND_GPR (040) - -/* This operand names a floating point register. The disassembler - prints these with a leading 'f'. */ -#define PPC_OPERAND_FPR (0100) - -/* This operand is a relative branch displacement. The disassembler - prints these symbolically if possible. */ -#define PPC_OPERAND_RELATIVE (0200) - -/* This operand is an absolute branch address. The disassembler - prints these symbolically if possible. */ -#define PPC_OPERAND_ABSOLUTE (0400) - -/* This operand is optional, and is zero if omitted. This is used for - the optional BF and L fields in the comparison instructions. The - assembler must count the number of operands remaining on the line, - and the number of operands remaining for the opcode, and decide - whether this operand is present or not. The disassembler should - print this operand out only if it is not zero. */ -#define PPC_OPERAND_OPTIONAL (01000) - -/* This flag is only used with PPC_OPERAND_OPTIONAL. If this operand - is omitted, then for the next operand use this operand value plus - 1, ignoring the next operand field for the opcode. This wretched - hack is needed because the Power rotate instructions can take - either 4 or 5 operands. The disassembler should print this operand - out regardless of the PPC_OPERAND_OPTIONAL field. */ -#define PPC_OPERAND_NEXT (02000) - -/* This operand should be regarded as a negative number for the - purposes of overflow checking (i.e., the normal most negative - number is disallowed and one more than the normal most positive - number is allowed). This flag will only be set for a signed - operand. */ -#define PPC_OPERAND_NEGATIVE (04000) - -/* The POWER and PowerPC assemblers use a few macros. We keep them - with the operands table for simplicity. The macro table is an - array of struct powerpc_macro. */ - -struct powerpc_macro -{ - /* The macro name. */ - const char *name; - - /* The number of operands the macro takes. */ - unsigned int operands; - - /* One bit flags for the opcode. These are used to indicate which - specific processors support the instructions. The values are the - same as those for the struct powerpc_opcode flags field. */ - unsigned long flags; - - /* A format string to turn the macro into a normal instruction. - Each %N in the string is replaced with operand number N (zero - based). */ - const char *format; -}; - -extern const struct powerpc_macro powerpc_macros[]; -extern const int powerpc_num_macros; - -#endif /* PPC_H */ diff --git a/contrib/gdb/include/opcode/pyr.h b/contrib/gdb/include/opcode/pyr.h deleted file mode 100644 index 06632b8d91970..0000000000000 --- a/contrib/gdb/include/opcode/pyr.h +++ /dev/null @@ -1,287 +0,0 @@ -/* pyramid.opcode.h -- gdb initial attempt. */ - -/* pyramid opcode table: wot to do with this - particular opcode */ - -struct pyr_datum -{ - char nargs; - char * args; /* how to compile said opcode */ - unsigned long mask; /* Bit vector: which operand modes are valid - for this opcode */ - unsigned char code; /* op-code (always 6(?) bits */ -}; - -typedef struct pyr_insn_format { - unsigned int mode :4; - unsigned int operator :8; - unsigned int index_scale :2; - unsigned int index_reg :6; - unsigned int operand_1 :6; - unsigned int operand_2:6; -} pyr_insn_format; - - -/* We store four bytes of opcode for all opcodes. - Pyramid is sufficiently RISCy that: - - insns are always an integral number of words; - - the length of any insn can be told from the first word of - the insn. (ie, if there are zero, one, or two words of - immediate operand/offset). - - - The args component is a string containing two characters for each - operand of the instruction. The first specifies the kind of operand; - the second, the place it is stored. */ - -/* Kinds of operands: - mask assembler syntax description - 0x0001: movw Rn,Rn register to register - 0x0002: movw K,Rn quick immediate to register - 0x0004: movw I,Rn long immediate to register - 0x0008: movw (Rn),Rn register indirect to register - movw (Rn)[x],Rn register indirect to register - 0x0010: movw I(Rn),Rn offset register indirect to register - movw I(Rn)[x],Rn offset register indirect, indexed, to register - - 0x0020: movw Rn,(Rn) register to register indirect - 0x0040: movw K,(Rn) quick immediate to register indirect - 0x0080: movw I,(Rn) long immediate to register indirect - 0x0100: movw (Rn),(Rn) register indirect to-register indirect - 0x0100: movw (Rn),(Rn) register indirect to-register indirect - 0x0200: movw I(Rn),(Rn) register indirect+offset to register indirect - 0x0200: movw I(Rn),(Rn) register indirect+offset to register indirect - - 0x0400: movw Rn,I(Rn) register to register indirect+offset - 0x0800: movw K,I(Rn) quick immediate to register indirect+offset - 0x1000: movw I,I(Rn) long immediate to register indirect+offset - 0x1000: movw (Rn),I(Rn) register indirect to-register indirect+offset - 0x1000: movw I(Rn),I(Rn) register indirect+offset to register indirect - +offset - 0x0000: (irregular) ??? - - - Each insn has a four-bit field encoding the type(s) of its operands. -*/ - -/* Some common combinations - */ - -/* the first 5,(0x1|0x2|0x4|0x8|0x10) ie (1|2|4|8|16), ie ( 32 -1)*/ -#define GEN_TO_REG (31) - -#define UNKNOWN ((unsigned long)-1) -#define ANY (GEN_TO_REG | (GEN_TO_REG << 5) | (GEN_TO_REG << 15)) - -#define CONVERT (1|8|0x10|0x20|0x200) - -#define K_TO_REG (2) -#define I_TO_REG (4) -#define NOTK_TO_REG (GEN_TO_REG & ~K_TO_REG) -#define NOTI_TO_REG (GEN_TO_REG & ~I_TO_REG) - -/* The assembler requires that this array be sorted as follows: - all instances of the same mnemonic must be consecutive. - All instances of the same mnemonic with the same number of operands - must be consecutive. - */ - -struct pyr_opcode /* pyr opcode text */ -{ - char * name; /* opcode name: lowercase string [key] */ - struct pyr_datum datum; /* rest of opcode table [datum] */ -}; - -#define pyr_how args -#define pyr_nargs nargs -#define pyr_mask mask -#define pyr_name name - -struct pyr_opcode pyr_opcodes[] = -{ - {"movb", { 2, "", UNKNOWN, 0x11}, }, - {"movh", { 2, "", UNKNOWN, 0x12} }, - {"movw", { 2, "", ANY, 0x10} }, - {"movl", { 2, "", ANY, 0x13} }, - {"mnegw", { 2, "", (0x1|0x8|0x10), 0x14} }, - {"mnegf", { 2, "", 0x1, 0x15} }, - {"mnegd", { 2, "", 0x1, 0x16} }, - {"mcomw", { 2, "", (0x1|0x8|0x10), 0x17} }, - {"mabsw", { 2, "", (0x1|0x8|0x10), 0x18} }, - {"mabsf", { 2, "", 0x1, 0x19} }, - {"mabsd", { 2, "", 0x1, 0x1a} }, - {"mtstw", { 2, "", (0x1|0x8|0x10), 0x1c} }, - {"mtstf", { 2, "", 0x1, 0x1d} }, - {"mtstd", { 2, "", 0x1, 0x1e} }, - {"mova", { 2, "", 0x8|0x10, 0x1f} }, - {"movzbw", { 2, "", (0x1|0x8|0x10), 0x20} }, - {"movzhw", { 2, "", (0x1|0x8|0x10), 0x21} }, - /* 2 insns out of order here */ - {"movbl", { 2, "", 1, 0x4f} }, - {"filbl", { 2, "", 1, 0x4e} }, - - {"cvtbw", { 2, "", CONVERT, 0x22} }, - {"cvthw", { 2, "", CONVERT, 0x23} }, - {"cvtwb", { 2, "", CONVERT, 0x24} }, - {"cvtwh", { 2, "", CONVERT, 0x25} }, - {"cvtwf", { 2, "", CONVERT, 0x26} }, - {"cvtwd", { 2, "", CONVERT, 0x27} }, - {"cvtfw", { 2, "", CONVERT, 0x28} }, - {"cvtfd", { 2, "", CONVERT, 0x29} }, - {"cvtdw", { 2, "", CONVERT, 0x2a} }, - {"cvtdf", { 2, "", CONVERT, 0x2b} }, - - {"addw", { 2, "", GEN_TO_REG, 0x40} }, - {"addwc", { 2, "", GEN_TO_REG, 0x41} }, - {"subw", { 2, "", GEN_TO_REG, 0x42} }, - {"subwb", { 2, "", GEN_TO_REG, 0x43} }, - {"rsubw", { 2, "", GEN_TO_REG, 0x44} }, - {"mulw", { 2, "", GEN_TO_REG, 0x45} }, - {"emul", { 2, "", GEN_TO_REG, 0x47} }, - {"umulw", { 2, "", GEN_TO_REG, 0x46} }, - {"divw", { 2, "", GEN_TO_REG, 0x48} }, - {"ediv", { 2, "", GEN_TO_REG, 0x4a} }, - {"rdivw", { 2, "", GEN_TO_REG, 0x4b} }, - {"udivw", { 2, "", GEN_TO_REG, 0x49} }, - {"modw", { 2, "", GEN_TO_REG, 0x4c} }, - {"umodw", { 2, "", GEN_TO_REG, 0x4d} }, - - - {"addf", { 2, "", 1, 0x50} }, - {"addd", { 2, "", 1, 0x51} }, - {"subf", { 2, "", 1, 0x52} }, - {"subd", { 2, "", 1, 0x53} }, - {"mulf", { 2, "", 1, 0x56} }, - {"muld", { 2, "", 1, 0x57} }, - {"divf", { 2, "", 1, 0x58} }, - {"divd", { 2, "", 1, 0x59} }, - - - {"cmpb", { 2, "", UNKNOWN, 0x61} }, - {"cmph", { 2, "", UNKNOWN, 0x62} }, - {"cmpw", { 2, "", UNKNOWN, 0x60} }, - {"ucmpb", { 2, "", UNKNOWN, 0x66} }, - /* WHY no "ucmph"??? */ - {"ucmpw", { 2, "", UNKNOWN, 0x65} }, - {"xchw", { 2, "", UNKNOWN, 0x0f} }, - - - {"andw", { 2, "", GEN_TO_REG, 0x30} }, - {"orw", { 2, "", GEN_TO_REG, 0x31} }, - {"xorw", { 2, "", GEN_TO_REG, 0x32} }, - {"bicw", { 2, "", GEN_TO_REG, 0x33} }, - {"lshlw", { 2, "", GEN_TO_REG, 0x38} }, - {"ashlw", { 2, "", GEN_TO_REG, 0x3a} }, - {"ashll", { 2, "", GEN_TO_REG, 0x3c} }, - {"ashrw", { 2, "", GEN_TO_REG, 0x3b} }, - {"ashrl", { 2, "", GEN_TO_REG, 0x3d} }, - {"rotlw", { 2, "", GEN_TO_REG, 0x3e} }, - {"rotrw", { 2, "", GEN_TO_REG, 0x3f} }, - - /* push and pop insns are "going away next release". */ - {"pushw", { 2, "", GEN_TO_REG, 0x0c} }, - {"popw", { 2, "", (0x1|0x8|0x10), 0x0d} }, - {"pusha", { 2, "", (0x8|0x10), 0x0e} }, - - {"bitsw", { 2, "", UNKNOWN, 0x35} }, - {"bitcw", { 2, "", UNKNOWN, 0x36} }, - /* some kind of ibra/dbra insns??*/ - {"icmpw", { 2, "", UNKNOWN, 0x67} }, - {"dcmpw", { 2, "", (1|4|0x20|0x80|0x400|0x1000), 0x69} },/*FIXME*/ - {"acmpw", { 2, "", 1, 0x6b} }, - - /* Call is written as a 1-op insn, but is always (dis)assembled as a 2-op - insn with a 2nd op of tr14. The assembler will have to grok this. */ - {"call", { 2, "", GEN_TO_REG, 0x04} }, - {"call", { 1, "", GEN_TO_REG, 0x04} }, - - {"callk", { 1, "", UNKNOWN, 0x06} },/* system call?*/ - /* Ret is usually written as a 0-op insn, but gets disassembled as a - 1-op insn. The operand is always tr15. */ - {"ret", { 0, "", UNKNOWN, 0x09} }, - {"ret", { 1, "", UNKNOWN, 0x09} }, - {"adsf", { 2, "", (1|2|4), 0x08} }, - {"retd", { 2, "", UNKNOWN, 0x0a} }, - {"btc", { 2, "", UNKNOWN, 0x01} }, - {"bfc", { 2, "", UNKNOWN, 0x02} }, - /* Careful: halt is 0x00000000. Jump must have some other (mode?)bit set?? */ - {"jump", { 1, "", UNKNOWN, 0x00} }, - {"btp", { 2, "", UNKNOWN, 0xf00} }, - /* read control-stack pointer is another 1-or-2 operand insn. */ - {"rcsp", { 2, "", UNKNOWN, 0x01f} }, - {"rcsp", { 1, "", UNKNOWN, 0x01f} } -}; - -/* end: pyramid.opcode.h */ -/* One day I will have to take the time to find out what operands - are valid for these insns, and guess at what they mean. - - I can't imagine what the "I???" insns (iglob, etc) do. - - the arithmetic-sounding insns ending in "p" sound awfully like BCD - arithmetic insns: - dshlp -> Decimal SHift Left Packed - dshrp -> Decimal SHift Right Packed - and cvtlp would be convert long to packed. - I have no idea how the operands are interpreted; but having them be - a long register with (address, length) of an in-memory packed BCD operand - would not be surprising. - They are unlikely to be a packed bcd string: 64 bits of long give - is only 15 digits+sign, which isn't enough for COBOL. - */ -#if 0 - {"wcsp", { 2, "", UNKNOWN, 0x00} }, /*write csp?*/ - /* The OSx Operating System Porting Guide claims SSL does things - with tr12 (a register reserved to it) to do with static block-structure - references. SSL=Set Static Link? It's "Going away next release". */ - {"ssl", { 2, "", UNKNOWN, 0x00} }, - {"ccmps", { 2, "", UNKNOWN, 0x00} }, - {"lcd", { 2, "", UNKNOWN, 0x00} }, - {"uemul", { 2, "", UNKNOWN, 0x00} }, /*unsigned emul*/ - {"srf", { 2, "", UNKNOWN, 0x00} }, /*Gidget time???*/ - {"mnegp", { 2, "", UNKNOWN, 0x00} }, /move-neg phys?*/ - {"ldp", { 2, "", UNKNOWN, 0x00} }, /*load phys?*/ - {"ldti", { 2, "", UNKNOWN, 0x00} }, - {"ldb", { 2, "", UNKNOWN, 0x00} }, - {"stp", { 2, "", UNKNOWN, 0x00} }, - {"stti", { 2, "", UNKNOWN, 0x00} }, - {"stb", { 2, "", UNKNOWN, 0x00} }, - {"stu", { 2, "", UNKNOWN, 0x00} }, - {"addp", { 2, "", UNKNOWN, 0x00} }, - {"subp", { 2, "", UNKNOWN, 0x00} }, - {"mulp", { 2, "", UNKNOWN, 0x00} }, - {"divp", { 2, "", UNKNOWN, 0x00} }, - {"dshlp", { 2, "", UNKNOWN, 0x00} }, /* dec shl packed? */ - {"dshrp", { 2, "", UNKNOWN, 0x00} }, /* dec shr packed? */ - {"movs", { 2, "", UNKNOWN, 0x00} }, /*move (string?)?*/ - {"cmpp", { 2, "", UNKNOWN, 0x00} }, /* cmp phys?*/ - {"cmps", { 2, "", UNKNOWN, 0x00} }, /* cmp (string?)?*/ - {"cvtlp", { 2, "", UNKNOWN, 0x00} }, /* cvt long to p??*/ - {"cvtpl", { 2, "", UNKNOWN, 0x00} }, /* cvt p to l??*/ - {"dintr", { 2, "", UNKNOWN, 0x00} }, /* ?? intr ?*/ - {"rphysw", { 2, "", UNKNOWN, 0x00} }, /* read phys word?*/ - {"wphysw", { 2, "", UNKNOWN, 0x00} }, /* write phys word?*/ - {"cmovs", { 2, "", UNKNOWN, 0x00} }, - {"rsubw", { 2, "", UNKNOWN, 0x00} }, - {"bicpsw", { 2, "", UNKNOWN, 0x00} }, /* clr bit in psw? */ - {"bispsw", { 2, "", UNKNOWN, 0x00} }, /* set bit in psw? */ - {"eio", { 2, "", UNKNOWN, 0x00} }, /* ?? ?io ? */ - {"callp", { 2, "", UNKNOWN, 0x00} }, /* call phys?*/ - {"callr", { 2, "", UNKNOWN, 0x00} }, - {"lpcxt", { 2, "", UNKNOWN, 0x00} }, /*load proc context*/ - {"rei", { 2, "", UNKNOWN, 0x00} }, /*ret from intrpt*/ - {"rport", { 2, "", UNKNOWN, 0x00} }, /*read-port?*/ - {"rtod", { 2, "", UNKNOWN, 0x00} }, /*read-time-of-day?*/ - {"ssi", { 2, "", UNKNOWN, 0x00} }, - {"vtpa", { 2, "", UNKNOWN, 0x00} }, /*virt-to-phys-addr?*/ - {"wicl", { 2, "", UNKNOWN, 0x00} }, /* write icl ? */ - {"wport", { 2, "", UNKNOWN, 0x00} }, /*write-port?*/ - {"wtod", { 2, "", UNKNOWN, 0x00} }, /*write-time-of-day?*/ - {"flic", { 2, "", UNKNOWN, 0x00} }, - {"iglob", { 2, "", UNKNOWN, 0x00} }, /* I global? */ - {"iphys", { 2, "", UNKNOWN, 0x00} }, /* I physical? */ - {"ipid", { 2, "", UNKNOWN, 0x00} }, /* I pid? */ - {"ivect", { 2, "", UNKNOWN, 0x00} }, /* I vector? */ - {"lamst", { 2, "", UNKNOWN, 0x00} }, - {"tio", { 2, "", UNKNOWN, 0x00} }, -#endif diff --git a/contrib/gdb/include/opcode/rs6k.h b/contrib/gdb/include/opcode/rs6k.h deleted file mode 100644 index fac9cf43f3545..0000000000000 --- a/contrib/gdb/include/opcode/rs6k.h +++ /dev/null @@ -1,254 +0,0 @@ -/* IBM RS/6000 instruction set definitions, for GNU software. */ - -/* These are all possible instruction formats as used in IBM Assembler - Language Reference, Appendix A. */ - -typedef enum { A=0, B, D, I, M, SC, X, XL, XO, XFL, XFX } InsnFmt; - -/* Extended opcode masks. Used for extracting extended opcode values from - instructions. Each instruction's format decides which mask applies. - They *should* retain the same order as the above formats. */ - -static int eopMask[] = - { 0x1f, 0, 0, 0, 0, 0, 0x3ff, 0x3ff, 0x1ff, 0x3ff, 0x3ff }; - -/* All the things you need to know about an opcode. */ - -typedef struct rs6000_insn { - char *operator; /* opcode name */ - char *opr_ext; /* opcode name extension */ - InsnFmt format; /* opcode format */ - char p_opcode; /* primary opcode */ - int e_opcode; /* extended opcode */ - char oprnd_format[6]; /* operand format */ -} OPCODE; - -/* operand format specifiers */ - -#define TO 1 -#define RA 2 -#define SI 3 -#define RT 4 -#define UI 5 -#define BF 6 -#define BFA 7 -#define BT 8 -#define BA 9 -#define BB 10 -#define BO 11 -#define BI 12 -#define RB 13 -#define RS 14 -#define SH 15 -#define MB 16 -#define ME 17 -#define SPR 18 -#define DIS 19 -#define FXM 21 -#define FRT 22 -#define NB 23 -#define FRS 24 -#define FRA 25 -#define FRB 26 -#define FRC 27 -#define FLM 28 -#define I 29 -#define LI 30 -#define A2 31 -#define TA14 32 /* 14 bit representation of target address */ -#define TA24 33 /* 24 bit representation of target address */ -#define FL1 34 -#define FL2 35 -#define LEV 36 - -/* RS/6000 INSTRUCTION SET - (sorted on primary and extended opcode) - - oprtr primary ext. -operator ext format opcode opcode operand format -------- ------- ------ ------- ------ --------------- */ - -struct rs6000_insn rs6k_ops [] = { - -{"ti", 0, D, 3, -1, {TO,RA,SI,0} }, -{"muli", 0, D, 7, -1, {RT,RA,SI,0} }, -{"sfi", 0, D, 8, -1, {RT,RA,SI,0} }, -{"dozi", 0, D, 9, -1, {RT,RA,SI,0} }, -{"cmpli", 0, D, 10, -1, {BF,RA,UI,0} }, -{"cmpi", 0, D, 11, -1, {BF,RA,SI,0} }, -{"ai", 0, D, 12, -1, {RT,RA,SI,0} }, -{"ai.", 0, D, 13, -1, {RT,RA,SI,0} }, -{"lil", 0, D, 14, -1, {RT,SI,0} }, /* same as `cal' */ -{"cal", 0, D, 14, -1, {RT,DIS,RA,0} }, -{"liu", 0, D, 15, -1, {RT, UI,0} }, /* same as `cau' */ -{"cau", 0, D, 15, -1, {RT,RA,UI,0} }, - -/* "1" indicates an exception--"bb" is only usable for some values of - BO, so the disassembler first matches this instruction and then changes - it to "bc" if that is the case. */ -{"bb", "1tfla", B, 16, -1, {LI,A2,0} }, -{"bc", "la", B, 16, -1, {BO,BI,TA14,0} }, - -{"svc", "la", SC, 17, -1, {LEV,FL1,FL2,0} }, -{"b", "la", I, 18, -1, {TA24,0} }, -{"mcrf", 0, XL, 19, 0, {BF,BFA,0} }, -{"bcr", "l", XL, 19, 16, {BO,BI,0} }, -{"crnor", 0, XL, 19, 33, {BT,BA,BB,0} }, -{"rfi", 0, X, 19, 50, {0} }, -{"rfsvc", 0, X, 19, 82, {0} }, -{"crandc", 0, XL, 19, 129, {BT,BA,BB,0} }, -{"ics", 0, X, 19, 150, {0} }, -{"crxor", 0, XL, 19, 193, {BT,BA,BB,0} }, -{"crnand", 0, XL, 19, 225, {BT,BA,BB,0} }, -{"crand", 0, XL, 19, 257, {BT,BA,BB,0} }, -{"creqv", 0, XL, 19, 289, {BT,BA,BB,0} }, -{"crorc", 0, XL, 19, 417, {BT,BA,BB,0} }, -{"cror", 0, XL, 19, 449, {BT,BA,BB,0} }, -{"bcc", "l", XL, 19, 528, {BO,BI,0} }, -{"rlimi", ".", M, 20, -1, {RA,RS,SH,MB,ME,0} /*??*/}, -{"rlinm", ".", M, 21, -1, {RA,RS,SH,MB,ME,0} /*??*/}, -{"rlmi", ".", M, 22, -1, {RA,RS,RB,MB,ME,0} /*??*/}, -{"rlnm", ".", M, 23, -1, {RA,RS,RB,MB,ME,0} /*??*/}, -{"oril", 0, D, 24, -1, {RA,RS,UI,0} }, -{"oriu", 0, D, 25, -1, {RA,RS,UI,0} }, -{"xoril", 0, D, 26, -1, {RA,RS,UI,0} }, -{"xoriu", 0, D, 27, -1, {RA,RS,UI,0} }, -{"andil.", 0, D, 28, -1, {RA,RS,UI,0} }, -{"andiu.", 0, D, 29, -1, {RA,RS,UI,0} }, -{"cmp", 0, X, 31, 0, {BF,RA,RB,0} }, -{"t", 0, X, 31, 4, {TO,RA,RB,0} }, -{"sf", "o.", XO, 31, 8, {RT,RA,RB,0} }, -{"a", "o.", XO, 31, 10, {RT,RA,RB,0} }, -{"mfcr", 0, X, 31, 19, {RT,0} }, -{"lx", 0, X, 31, 23, {RT,RA,RB,0} }, -{"sl", ".", X, 31, 24, {RA,RS,RB,0} }, -{"cntlz", ".", XO, 31, 26, {RA,RS,0} }, -{"and", ".", X, 31, 28, {RA,RS,RB,0} }, -{"maskg", ".", X, 31, 29, {RA,RS,RB,0} }, -{"cmpl", 0, X, 31, 32, {BF,RA,RB,0} }, -{"sfe", "o.", XO, 31, 136, {RT,RA,RB,0} }, -{"lux", 0, X, 31, 55, {RT,RA,RB,0} }, -{"andc", ".", X, 31, 60, {RA,RS,RB,0} }, -{"mfmsr", 0, X, 31, 83, {RT,0} }, -{"lbzx", 0, X, 31, 87, {RT,RA,RB,0} }, -{"neg", "o.", XO, 31, 104, {RT,RA,0} }, -{"mul", "o.", XO, 31, 107, {RT,RA,RB,0} }, -{"lbzux", 0, X, 31, 119, {RT,RA,RB,0} }, -{"nor", ".", X, 31, 124, {RA,RS,RB,0} }, -{"ae", "o.", XO, 31, 138, {RT,RA,RB,0} }, -{"mtcrf", 0, XFX, 31, 144, {FXM,RS,0} }, -{"stx", 0, X, 31, 151, {RS,RA,RB,0} }, -{"slq", ".", X, 31, 152, {RA,RS,RB,0} }, -{"sle", ".", X, 31, 153, {RA,RS,RB,0} }, -{"stux", 0, X, 31, 183, {RS,RA,RB,0} }, -{"sliq", ".", X, 31, 184, {RA,RS,SH,0} }, -{"sfze", "o.", XO, 31, 200, {RT,RA,0} }, -{"aze", "o.", XO, 31, 202, {RT,RA,0} }, -{"stbx", 0, X, 31, 215, {RS,RA,RB,0} }, -{"sllq", ".", X, 31, 216, {RA,RS,RB,0} }, -{"sleq", ".", X, 31, 217, {RA,RS,RB,0} }, -{"sfme", "o.", XO, 31, 232, {RT,RA,0} }, -{"ame", "o.", XO, 31, 234, {RT,RA,0} }, -{"muls", "o.", XO, 31, 235, {RT,RA,RB,0} }, -{"stbux", 0, X, 31, 247, {RS,RA,RB,0} }, -{"slliq", ".", X, 31, 248, {RA,RS,SH,0} }, -{"doz", "o.", X, 31, 264, {RT,RA,RB,0} }, -{"cax", "o.", XO, 31, 266, {RT,RA,RB,0} }, -{"lscbx", ".", X, 31, 277, {RT,RA,RB,0} }, -{"lhzx", 0, X, 31, 279, {RT,RA,RB,0} }, -{"eqv", ".", X, 31, 284, {RA,RS,RB,0} }, -{"lhzux", 0, X, 31, 311, {RT,RA,RB,0} }, -{"xor", ".", X, 31, 316, {RA,RS,RB,0} }, -{"div", "o.", XO, 31, 331, {RT,RA,RB,0} }, -{"mfspr", 0, X, 31, 339, {RT,SPR,0} }, -{"lhax", 0, X, 31, 343, {RT,RA,RB,0} }, -{"abs", "o.", XO, 31, 360, {RT,RA,0} }, -{"divs", "o.", XO, 31, 363, {RT,RA,RB,0} }, -{"lhaux", 0, X, 31, 375, {RT,RA,RB,0} }, -{"sthx", 0, X, 31, 407, {RS,RA,RB,0} }, -{"orc", ".", X, 31, 412, {RA,RS,RB,0} }, -{"sthux", 0, X, 31, 439, {RS,RA,RB,0} }, -{"or", ".", X, 31, 444, {RA,RS,RB,0} }, -{"mtspr", 0, X, 31, 467, {SPR,RS,0} }, -{"nand", ".", X, 31, 476, {RA,RS,RB,0} }, -{"nabs", "o.", XO, 31, 488, {RT,RA,0} }, -{"mcrxr", 0, X, 31, 512, {BF,0} }, -{"lsx", 0, X, 31, 533, {RT,RA,RB,0} }, -{"lbrx", 0, X, 31, 534, {RT,RA,RB,0} }, -{"lfsx", 0, X, 31, 535, {FRT,RA,RB,0} }, -{"sr", ".", X, 31, 536, {RA,RS,RB,0} }, -{"rrib", ".", X, 31, 537, {RA,RS,RB,0} }, -{"maskir", ".", X, 31, 541, {RA,RS,RB,0} }, -{"lfsux", 0, X, 31, 567, {FRT,RA,RB,0} }, -{"lsi", 0, X, 31, 597, {RT,RA,NB,0} }, -{"lfdx", 0, X, 31, 599, {FRT,RA,RB,0} }, -{"lfdux", 0, X, 31, 631, {FRT,RA,RB,0} }, -{"stsx", 0, X, 31, 661, {RS,RA,RB,0} }, -{"stbrx", 0, X, 31, 662, {RS,RA,RB,0} }, -{"stfsx", 0, X, 31, 663, {FRS,RA,RB,0} }, -{"srq", ".", X, 31, 664, {RA,RS,RB,0} }, -{"sre", ".", X, 31, 665, {RA,RS,RB,0} }, -{"stfsux", 0, X, 31, 695, {FRS,RA,RB,0} }, -{"sriq", ".", X, 31, 696, {RA,RS,SH,0} }, -{"stsi", 0, X, 31, 725, {RS,RA,NB,0} }, -{"stfdx", 0, X, 31, 727, {FRS,RA,RB,0} }, -{"srlq", ".", X, 31, 728, {RA,RS,RB,0} }, -{"sreq", ".", X, 31, 729, {RA,RS,RB,0} }, -{"stfdux", 0, X, 31, 759, {FRS,RA,RB,0} }, -{"srliq", ".", X, 31, 760, {RA,RS,SH,0} }, -{"lhbrx", 0, X, 31, 790, {RT,RA,RB,0} }, -{"sra", ".", X, 31, 792, {RA,RS,RB,0} }, -{"srai", ".", X, 31, 824, {RA,RS,SH,0} }, -{"sthbrx", 0, X, 31, 918, {RS,RA,RB,0} }, -{"sraq", ".", X, 31, 920, {RA,RS,RB,0} }, -{"srea", ".", X, 31, 921, {RA,RS,RB,0} }, -{"exts", ".", X, 31, 922, {RA,RS,0} }, -{"sraiq", ".", X, 31, 952, {RA,RS,SH,0} }, -{"l", 0, D, 32, -1, {RT,DIS,RA,0} }, -{"lu", 0, D, 33, -1, {RT,DIS,RA,0} }, -{"lbz", 0, D, 34, -1, {RT,DIS,RA,0} }, -{"lbzu", 0, D, 35, -1, {RT,DIS,RA,0} }, -{"st", 0, D, 36, -1, {RS,DIS,RA,0} }, -{"stu", 0, D, 37, -1, {RS,DIS,RA,0} }, -{"stb", 0, D, 38, -1, {RS,DIS,RA,0} }, -{"stbu", 0, D, 39, -1, {RS,DIS,RA,0} }, -{"lhz", 0, D, 40, -1, {RT,DIS,RA,0} }, -{"lhzu", 0, D, 41, -1, {RT,DIS,RA,0} }, -{"lha", 0, D, 42, -1, {RT,DIS,RA,0} }, -{"lhau", 0, D, 43, -1, {RT,DIS,RA,0} }, -{"sth", 0, D, 44, -1, {RS,DIS,RA,0} }, -{"sthu", 0, D, 45, -1, {RS,DIS,RA,0} }, -{"lm", 0, D, 46, -1, {RT,DIS,RA,0} }, -{"stm", 0, D, 47, -1, {RS,DIS,RA,0} }, -{"lfs", 0, D, 48, -1, {FRT,DIS,RA,0} }, -{"lfsu", 0, D, 49, -1, {FRT,DIS,RA,0} }, -{"lfd", 0, D, 50, -1, {FRT,DIS,RA,0} }, -{"lfdu", 0, D, 51, -1, {FRT,DIS,RA,0} }, -{"stfs", 0, D, 52, -1, {FRS,DIS,RA,0} }, -{"stfsu", 0, D, 53, -1, {FRS,DIS,RA,0} }, -{"stfd", 0, D, 54, -1, {FRS,DIS,RA,0} }, -{"stfdu", 0, D, 55, -1, {FRS,DIS,RA,0} }, -{"fcmpu", 0, X, 63, 0, {BF,FRA,FRB,0} }, -{"frsp", ".", X, 63, 12, {FRT,FRB,0} }, -{"fd", ".", A, 63, 18, {FRT,FRA,FRB,0} }, -{"fs", ".", A, 63, 20, {FRT,FRA,FRB,0} }, -{"fa", ".", A, 63, 21, {FRT,FRA,FRB,0} }, -{"fm", ".", A, 63, 25, {FRT,FRA,FRC,0} }, -{"fms", ".", A, 63, 28, {FRT,FRA,FRC,FRB,0} }, -{"fma", ".", A, 63, 29, {FRT,FRA,FRC,FRB,0} }, -{"fnms", ".", A, 63, 30, {FRT,FRA,FRC,FRB,0} }, -{"fnma", ".", A, 63, 31, {FRT,FRA,FRC,FRB,0} }, -{"fcmpo", 0, X, 63, 32, {BF,FRA,FRB,0} }, -{"mtfsb1", ".", X, 63, 38, {BT,0} }, -{"fneg", ".", X, 63, 40, {FRT,FRB,0} }, -{"mcrfs", 0, X, 63, 64, {BF,BFA,0} }, -{"mtfsb0", ".", X, 63, 70, {BT,0} }, -{"fmr", ".", X, 63, 72, {FRT,FRB,0} }, -{"mtfsfi", ".", X, 63, 134, {BF,I,0} }, -{"fnabs", ".", X, 63, 136, {FRT,FRB,0} }, -{"fabs", ".", X, 63, 264, {FRT,FRB,0} }, -{"mffs", ".", X, 63, 583, {FRT,0} }, -{"mtfsf", ".", XFL, 63, 711, {FLM,FRB,0} }, -}; - -#define NOPCODES (sizeof (rs6k_ops) / sizeof (struct rs6000_insn)) diff --git a/contrib/gdb/include/opcode/sparc.h b/contrib/gdb/include/opcode/sparc.h deleted file mode 100644 index b9281e6070cb5..0000000000000 --- a/contrib/gdb/include/opcode/sparc.h +++ /dev/null @@ -1,220 +0,0 @@ -/* Definitions for opcode table for the sparc. - Copyright (C) 1989, 1991, 1992, 1995, 1996 Free Software Foundation, Inc. - -This file is part of GAS, the GNU Assembler, GDB, the GNU debugger, and -the GNU Binutils. - -GAS/GDB 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 2, or (at your option) -any later version. - -GAS/GDB 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 or GDB; see the file COPYING. If not, write to -the Free Software Foundation, 59 Temple Place - Suite 330, -Boston, MA 02111-1307, USA. */ - -/* The SPARC opcode table (and other related data) is defined in - the opcodes library in sparc-opc.c. If you change anything here, make - sure you fix up that file, and vice versa. */ - - /* FIXME-someday: perhaps the ,a's and such should be embedded in the - instruction's name rather than the args. This would make gas faster, pinsn - slower, but would mess up some macros a bit. xoxorich. */ - -/* List of instruction sets variations. - These values are such that each element is either a superset of a - preceding each one or they conflict in which case SPARC_OPCODE_CONFLICT_P - returns non-zero. - The values are indices into `sparc_opcode_archs' defined in sparc-opc.c. - Don't change this without updating sparc-opc.c. */ - -enum sparc_opcode_arch_val { - SPARC_OPCODE_ARCH_V6 = 0, - SPARC_OPCODE_ARCH_V7, - SPARC_OPCODE_ARCH_V8, - SPARC_OPCODE_ARCH_SPARCLET, - SPARC_OPCODE_ARCH_SPARCLITE, - /* v9 variants must appear last */ - SPARC_OPCODE_ARCH_V9, - SPARC_OPCODE_ARCH_V9A, /* v9 with ultrasparc additions */ - SPARC_OPCODE_ARCH_BAD /* error return from sparc_opcode_lookup_arch */ -}; - -/* The highest architecture in the table. */ -#define SPARC_OPCODE_ARCH_MAX (SPARC_OPCODE_ARCH_BAD - 1) - -/* Table of cpu variants. */ - -struct sparc_opcode_arch { - const char *name; - /* Mask of sparc_opcode_arch_val's supported. - EG: For v7 this would be ((1 << v6) | (1 << v7)). */ - /* These are short's because sparc_opcode.architecture is. */ - short supported; -}; - -extern const struct sparc_opcode_arch sparc_opcode_archs[]; - -/* Given architecture name, look up it's sparc_opcode_arch_val value. */ -extern enum sparc_opcode_arch_val sparc_opcode_lookup_arch (); - -/* Return the bitmask of supported architectures for ARCH. */ -#define SPARC_OPCODE_SUPPORTED(ARCH) (sparc_opcode_archs[ARCH].supported) - -/* Non-zero if ARCH1 conflicts with ARCH2. - IE: ARCH1 as a supported bit set that ARCH2 doesn't, and vice versa. */ -#define SPARC_OPCODE_CONFLICT_P(ARCH1, ARCH2) \ -(((SPARC_OPCODE_SUPPORTED (ARCH1) & SPARC_OPCODE_SUPPORTED (ARCH2)) \ - != SPARC_OPCODE_SUPPORTED (ARCH1)) \ - && ((SPARC_OPCODE_SUPPORTED (ARCH1) & SPARC_OPCODE_SUPPORTED (ARCH2)) \ - != SPARC_OPCODE_SUPPORTED (ARCH2))) - -/* Structure of an opcode table entry. */ - -struct sparc_opcode { - const char *name; - unsigned long match; /* Bits that must be set. */ - unsigned long lose; /* Bits that must not be set. */ - const char *args; - /* This was called "delayed" in versions before the flags. */ - char flags; - short architecture; /* Bitmask of sparc_opcode_arch_val's. */ -}; - -#define F_DELAYED 1 /* Delayed branch */ -#define F_ALIAS 2 /* Alias for a "real" instruction */ -#define F_UNBR 4 /* Unconditional branch */ -#define F_CONDBR 8 /* Conditional branch */ -#define F_JSR 16 /* Subroutine call */ -/* FIXME: Add F_ANACHRONISTIC flag for v9. */ - -/* - -All sparc opcodes are 32 bits, except for the `set' instruction (really a -macro), which is 64 bits. It is handled as a special case. - -The match component is a mask saying which bits must match a particular -opcode in order for an instruction to be an instance of that opcode. - -The args component is a string containing one character for each operand of the -instruction. - -Kinds of operands: - # Number used by optimizer. It is ignored. - 1 rs1 register. - 2 rs2 register. - d rd register. - e frs1 floating point register. - v frs1 floating point register (double/even). - V frs1 floating point register (quad/multiple of 4). - f frs2 floating point register. - B frs2 floating point register (double/even). - R frs2 floating point register (quad/multiple of 4). - g frsd floating point register. - H frsd floating point register (double/even). - J frsd floating point register (quad/multiple of 4). - b crs1 coprocessor register - c crs2 coprocessor register - D crsd coprocessor register - m alternate space register (asr) in rd - M alternate space register (asr) in rs1 - h 22 high bits. - K MEMBAR mask (7 bits). (v9) - j 10 bit Immediate. (v9) - I 11 bit Immediate. (v9) - i 13 bit Immediate. - n 22 bit immediate. - k 2+14 bit PC relative immediate. (v9) - G 19 bit PC relative immediate. (v9) - l 22 bit PC relative immediate. - L 30 bit PC relative immediate. - a Annul. The annul bit is set. - A Alternate address space. Stored as 8 bits. - C Coprocessor state register. - F floating point state register. - p Processor state register. - N Branch predict clear ",pn" (v9) - T Branch predict set ",pt" (v9) - z %icc. (v9) - Z %xcc. (v9) - q Floating point queue. - r Single register that is both rs1 and rd. - O Single register that is both rs2 and rd. - Q Coprocessor queue. - S Special case. - t Trap base register. - w Window invalid mask register. - y Y register. - u sparclet coprocessor registers in rd position - U sparclet coprocessor registers in rs1 position - E %ccr. (v9) - s %fprs. (v9) - P %pc. (v9) - W %tick. (v9) - o %asi. (v9) - 6 %fcc0. (v9) - 7 %fcc1. (v9) - 8 %fcc2. (v9) - 9 %fcc3. (v9) - ! Privileged Register in rd (v9) - ? Privileged Register in rs1 (v9) - * Prefetch function constant. (v9) - x OPF field (v9 impdep). - -The following chars are unused: (note: ,[] are used as punctuation) -[XY3450] - -*/ - -#define OP2(x) (((x)&0x7) << 22) /* op2 field of format2 insns */ -#define OP3(x) (((x)&0x3f) << 19) /* op3 field of format3 insns */ -#define OP(x) ((unsigned)((x)&0x3) << 30) /* op field of all insns */ -#define OPF(x) (((x)&0x1ff) << 5) /* opf field of float insns */ -#define OPF_LOW5(x) OPF((x)&0x1f) /* v9 */ -#define F3F(x, y, z) (OP(x) | OP3(y) | OPF(z)) /* format3 float insns */ -#define F3I(x) (((x)&0x1) << 13) /* immediate field of format 3 insns */ -#define F2(x, y) (OP(x) | OP2(y)) /* format 2 insns */ -#define F3(x, y, z) (OP(x) | OP3(y) | F3I(z)) /* format3 insns */ -#define F1(x) (OP(x)) -#define DISP30(x) ((x)&0x3fffffff) -#define ASI(x) (((x)&0xff) << 5) /* asi field of format3 insns */ -#define RS2(x) ((x)&0x1f) /* rs2 field */ -#define SIMM13(x) ((x)&0x1fff) /* simm13 field */ -#define RD(x) (((x)&0x1f) << 25) /* destination register field */ -#define RS1(x) (((x)&0x1f) << 14) /* rs1 field */ -#define ASI_RS2(x) (SIMM13(x)) -#define MEMBAR(x) ((x)&0x7f) - -#define ANNUL (1<<29) -#define BPRED (1<<19) /* v9 */ -#define IMMED F3I(1) -#define RD_G0 RD(~0) -#define RS1_G0 RS1(~0) -#define RS2_G0 RS2(~0) - -extern struct sparc_opcode sparc_opcodes[]; -extern const int sparc_num_opcodes; - -int sparc_encode_asi (); -char *sparc_decode_asi (); -int sparc_encode_membar (); -char *sparc_decode_membar (); -int sparc_encode_prefetch (); -char *sparc_decode_prefetch (); -int sparc_encode_sparclet_cpreg (); -char *sparc_decode_sparclet_cpreg (); - -/* - * Local Variables: - * fill-column: 131 - * comment-column: 0 - * End: - */ - -/* end of sparc.h */ diff --git a/contrib/gdb/include/opcode/tahoe.h b/contrib/gdb/include/opcode/tahoe.h deleted file mode 100644 index b5cee249ee44f..0000000000000 --- a/contrib/gdb/include/opcode/tahoe.h +++ /dev/null @@ -1,213 +0,0 @@ -/* - * Ported by the State University of New York at Buffalo by the Distributed - * Computer Systems Lab, Department of Computer Science, 1991. - */ - -#ifndef tahoe_opcodeT -#define tahoe_opcodeT int -#endif /* no tahoe_opcodeT */ - -struct vot_wot /* tahoe opcode table: wot to do with this */ - /* particular opcode */ -{ - char * args; /* how to compile said opcode */ - tahoe_opcodeT code; /* op-code (may be > 8 bits!) */ -}; - -struct vot /* tahoe opcode text */ -{ - char * name; /* opcode name: lowercase string [key] */ - struct vot_wot detail; /* rest of opcode table [datum] */ -}; - -#define vot_how args -#define vot_code code -#define vot_detail detail -#define vot_name name - -static struct vot -votstrs[] = -{ -{ "halt", {"", 0x00 } }, -{ "sinf", {"", 0x05 } }, -{ "ldf", {"rl", 0x06 } }, -{ "ldd", {"rq", 0x07 } }, -{ "addb2", {"rbmb", 0x08 } }, -{ "movb", {"rbwb", 0x09 } }, -{ "addw2", {"rwmw", 0x0a } }, -{ "movw", {"rwww", 0x0b } }, -{ "addl2", {"rlml", 0x0c } }, -{ "movl", {"rlwl", 0x0d } }, -{ "bbs", {"rlvlbw", 0x0e } }, -{ "nop", {"", 0x10 } }, -{ "brb", {"bb", 0x11 } }, -{ "brw", {"bw", 0x13 } }, -{ "cosf", {"", 0x15 } }, -{ "lnf", {"rl", 0x16 } }, -{ "lnd", {"rq", 0x17 } }, -{ "addb3", {"rbrbwb", 0x18 } }, -{ "cmpb", {"rbwb", 0x19 } }, -{ "addw3", {"rwrwww", 0x1a } }, -{ "cmpw", {"rwww", 0x1b } }, -{ "addl3", {"rlrlwl", 0x1c } }, -{ "cmpl", {"rlwl", 0x1d } }, -{ "bbc", {"rlvlbw", 0x1e } }, -{ "rei", {"", 0x20 } }, -{ "bneq", {"bb", 0x21 } }, -{ "bnequ", {"bb", 0x21 } }, -{ "cvtwl", {"rwwl", 0x23 } }, -{ "stf", {"wl", 0x26 } }, -{ "std", {"wq", 0x27 } }, -{ "subb2", {"rbmb", 0x28 } }, -{ "mcomb", {"rbwb", 0x29 } }, -{ "subw2", {"rwmw", 0x2a } }, -{ "mcomw", {"rwww", 0x2b } }, -{ "subl2", {"rlml", 0x2c } }, -{ "mcoml", {"rlwl", 0x2d } }, -{ "emul", {"rlrlrlwq", 0x2e } }, -{ "aoblss", {"rlmlbw", 0x2f } }, -{ "bpt", {"", 0x30 } }, -{ "beql", {"bb", 0x31 } }, -{ "beqlu", {"bb", 0x31 } }, -{ "cvtwb", {"rwwb", 0x33 } }, -{ "logf", {"", 0x35 } }, -{ "cmpf", {"rl", 0x36 } }, -{ "cmpd", {"rq", 0x37 } }, -{ "subb3", {"rbrbwb", 0x38 } }, -{ "bitb", {"rbrb", 0x39 } }, -{ "subw3", {"rwrwww", 0x3a } }, -{ "bitw", {"rwrw", 0x3b } }, -{ "subl3", {"rlrlwl", 0x3c } }, -{ "bitl", {"rlrl", 0x3d } }, -{ "ediv", {"rlrqwlwl", 0x3e } }, -{ "aobleq", {"rlmlbw", 0x3f } }, -{ "ret", {"", 0x40 } }, -{ "bgtr", {"bb", 0x41 } }, -{ "sqrtf", {"", 0x45 } }, -{ "cmpf2", {"rl", 0x46 } }, -{ "cmpd2", {"rqrq", 0x47 } }, -{ "shll", {"rbrlwl", 0x48 } }, -{ "clrb", {"wb", 0x49 } }, -{ "shlq", {"rbrqwq", 0x4a } }, -{ "clrw", {"ww", 0x4b } }, -{ "mull2", {"rlml", 0x4c } }, -{ "clrl", {"wl", 0x4d } }, -{ "shal", {"rbrlwl", 0x4e } }, -{ "bleq", {"bb", 0x51 } }, -{ "expf", {"", 0x55 } }, -{ "tstf", {"", 0x56 } }, -{ "tstd", {"", 0x57 } }, -{ "shrl", {"rbrlwl", 0x58 } }, -{ "tstb", {"rb", 0x59 } }, -{ "shrq", {"rbrqwq", 0x5a } }, -{ "tstw", {"rw", 0x5b } }, -{ "mull3", {"rlrlwl", 0x5c } }, -{ "tstl", {"rl", 0x5d } }, -{ "shar", {"rbrlwl", 0x5e } }, -{ "bbssi", {"rlmlbw", 0x5f } }, -{ "ldpctx", {"", 0x60 } }, -{ "pushd", {"", 0x67 } }, -{ "incb", {"mb", 0x69 } }, -{ "incw", {"mw", 0x6b } }, -{ "divl2", {"rlml", 0x6c } }, -{ "incl", {"ml", 0x6d } }, -{ "cvtlb", {"rlwb", 0x6f } }, -{ "svpctx", {"", 0x70 } }, -{ "jmp", {"ab", 0x71 } }, -{ "cvlf", {"rl", 0x76 } }, -{ "cvld", {"rl", 0x77 } }, -{ "decb", {"mb", 0x79 } }, -{ "decw", {"mw", 0x7b } }, -{ "divl3", {"rlrlwl", 0x7c } }, -{ "decl", {"ml", 0x7d } }, -{ "cvtlw", {"rlww", 0x7f } }, -{ "bgeq", {"bb", 0x81 } }, -{ "movs2", {"abab", 0x82 } }, -{ "cvfl", {"wl", 0x86 } }, -{ "cvdl", {"wl", 0x87 } }, -{ "orb2", {"rbmb", 0x88 } }, -{ "cvtbl", {"rbwl", 0x89 } }, -{ "orw2", {"rwmw", 0x8a } }, -{ "bispsw", {"rw", 0x8b } }, -{ "orl2", {"rlml", 0x8c } }, -{ "adwc", {"rlml", 0x8d } }, -{ "adda", {"rlml", 0x8e } }, -{ "blss", {"bb", 0x91 } }, -{ "cmps2", {"abab", 0x92 } }, -{ "ldfd", {"rl", 0x97 } }, -{ "orb3", {"rbrbwb", 0x98 } }, -{ "cvtbw", {"rbww", 0x99 } }, -{ "orw3", {"rwrwww", 0x9a } }, -{ "bicpsw", {"rw", 0x9b } }, -{ "orl3", {"rlrlwl", 0x9c } }, -{ "sbwc", {"rlml", 0x9d } }, -{ "suba", {"rlml", 0x9e } }, -{ "bgtru", {"bb", 0xa1 } }, -{ "cvdf", {"", 0xa6 } }, -{ "andb2", {"rbmb", 0xa8 } }, -{ "movzbl", {"rbwl", 0xa9 } }, -{ "andw2", {"rwmw", 0xaa } }, -{ "loadr", {"rwal", 0xab } }, -{ "andl2", {"rlml", 0xac } }, -{ "mtpr", {"rlrl", 0xad } }, -{ "ffs", {"rlwl", 0xae } }, -{ "blequ", {"bb", 0xb1 } }, -{ "negf", {"", 0xb6 } }, -{ "negd", {"", 0xb7 } }, -{ "andb3", {"rbrbwb", 0xb8 } }, -{ "movzbw", {"rbww", 0xb9 } }, -{ "andw3", {"rwrwww", 0xba } }, -{ "storer", {"rwal", 0xbb } }, -{ "andl3", {"rlrlwl", 0xbc } }, -{ "mfpr", {"rlwl", 0xbd } }, -{ "ffc", {"rlwl", 0xbe } }, -{ "calls", {"rbab", 0xbf } }, -{ "prober", {"rbabrl", 0xc0 } }, -{ "bvc", {"bb", 0xc1 } }, -{ "movs3", {"ababrw", 0xc2 } }, -{ "movzwl", {"rwwl", 0xc3 } }, -{ "addf", {"rl", 0xc6 } }, -{ "addd", {"rq", 0xc7 } }, -{ "xorb2", {"rbmb", 0xc8 } }, -{ "movob", {"rbwb", 0xc9 } }, -{ "xorw2", {"rwmw", 0xca } }, -{ "movow", {"rwww", 0xcb } }, -{ "xorl2", {"rlml", 0xcc } }, -{ "movpsl", {"wl", 0xcd } }, -{ "kcall", {"rw", 0xcf } }, -{ "probew", {"rbabrl", 0xd0 } }, -{ "bvs", {"bb", 0xd1 } }, -{ "cmps3", {"ababrw", 0xd2 } }, -{ "subf", {"rq", 0xd6 } }, -{ "subd", {"rq", 0xd7 } }, -{ "xorb3", {"rbrbwb", 0xd8 } }, -{ "pushb", {"rb", 0xd9 } }, -{ "xorw3", {"rwrwww", 0xda } }, -{ "pushw", {"rw", 0xdb } }, -{ "xorl3", {"rlrlwl", 0xdc } }, -{ "pushl", {"rl", 0xdd } }, -{ "insque", {"abab", 0xe0 } }, -{ "bcs", {"bb", 0xe1 } }, -{ "bgequ", {"bb", 0xe1 } }, -{ "mulf", {"rq", 0xe6 } }, -{ "muld", {"rq", 0xe7 } }, -{ "mnegb", {"rbwb", 0xe8 } }, -{ "movab", {"abwl", 0xe9 } }, -{ "mnegw", {"rwww", 0xea } }, -{ "movaw", {"awwl", 0xeb } }, -{ "mnegl", {"rlwl", 0xec } }, -{ "moval", {"alwl", 0xed } }, -{ "remque", {"ab", 0xf0 } }, -{ "bcc", {"bb", 0xf1 } }, -{ "blssu", {"bb", 0xf1 } }, -{ "divf", {"rq", 0xf6 } }, -{ "divd", {"rq", 0xf7 } }, -{ "movblk", {"alalrw", 0xf8 } }, -{ "pushab", {"ab", 0xf9 } }, -{ "pushaw", {"aw", 0xfb } }, -{ "casel", {"rlrlrl", 0xfc } }, -{ "pushal", {"al", 0xfd } }, -{ "callf", {"rbab", 0xfe } }, -{ "" , "" } /* empty is end sentinel */ - -}; diff --git a/contrib/gdb/include/opcode/vax.h b/contrib/gdb/include/opcode/vax.h deleted file mode 100644 index f3afebde7e3bf..0000000000000 --- a/contrib/gdb/include/opcode/vax.h +++ /dev/null @@ -1,382 +0,0 @@ -/* Vax opcde list. - Copyright (C) 1989, 1995 Free Software Foundation, Inc. - -This file is part of GDB and GAS. - -GDB and GAS are 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. - -GDB and GAS are 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 GDB or GAS; see the file COPYING. If not, write to -the Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ - -#ifndef vax_opcodeT -#define vax_opcodeT int -#endif /* no vax_opcodeT */ - -struct vot_wot /* vax opcode table: wot to do with this */ - /* particular opcode */ -{ - const char *args; /* how to compile said opcode */ - vax_opcodeT code; /* op-code (may be > 8 bits!) */ -}; - -struct vot /* vax opcode text */ -{ - const char *name; /* opcode name: lowercase string [key] */ - struct vot_wot detail; /* rest of opcode table [datum] */ -}; - -#define vot_how args -#define vot_code code -#define vot_detail detail -#define vot_name name - -static const struct vot -votstrs[] = -{ -{ "halt", {"", 0x00 } }, -{ "nop", {"", 0x01 } }, -{ "rei", {"", 0x02 } }, -{ "bpt", {"", 0x03 } }, -{ "ret", {"", 0x04 } }, -{ "rsb", {"", 0x05 } }, -{ "ldpctx", {"", 0x06 } }, -{ "svpctx", {"", 0x07 } }, -{ "cvtps", {"rwabrwab", 0x08 } }, -{ "cvtsp", {"rwabrwab", 0x09 } }, -{ "index", {"rlrlrlrlrlwl", 0x0a } }, -{ "crc", {"abrlrwab", 0x0b } }, -{ "prober", {"rbrwab", 0x0c } }, -{ "probew", {"rbrwab", 0x0d } }, -{ "insque", {"abab", 0x0e } }, -{ "remque", {"abwl", 0x0f } }, -{ "bsbb", {"bb", 0x10 } }, -{ "brb", {"bb", 0x11 } }, -{ "bneq", {"bb", 0x12 } }, -{ "bnequ", {"bb", 0x12 } }, -{ "beql", {"bb", 0x13 } }, -{ "beqlu", {"bb", 0x13 } }, -{ "bgtr", {"bb", 0x14 } }, -{ "bleq", {"bb", 0x15 } }, -{ "jsb", {"ab", 0x16 } }, -{ "jmp", {"ab", 0x17 } }, -{ "bgeq", {"bb", 0x18 } }, -{ "blss", {"bb", 0x19 } }, -{ "bgtru", {"bb", 0x1a } }, -{ "blequ", {"bb", 0x1b } }, -{ "bvc", {"bb", 0x1c } }, -{ "bvs", {"bb", 0x1d } }, -{ "bcc", {"bb", 0x1e } }, -{ "bgequ", {"bb", 0x1e } }, -{ "blssu", {"bb", 0x1f } }, -{ "bcs", {"bb", 0x1f } }, -{ "addp4", {"rwabrwab", 0x20 } }, -{ "addp6", {"rwabrwabrwab", 0x21 } }, -{ "subp4", {"rwabrwab", 0x22 } }, -{ "subp6", {"rwabrwabrwab", 0x23 } }, -{ "cvtpt", {"rwababrwab", 0x24 } }, -{ "mulp", {"rwabrwabrwab", 0x25 } }, -{ "cvttp", {"rwababrwab", 0x26 } }, -{ "divp", {"rwabrwabrwab", 0x27 } }, -{ "movc3", {"rwabab", 0x28 } }, -{ "cmpc3", {"rwabab", 0x29 } }, -{ "scanc", {"rwababrb", 0x2a } }, -{ "spanc", {"rwababrb", 0x2b } }, -{ "movc5", {"rwabrbrwab", 0x2c } }, -{ "cmpc5", {"rwabrbrwab", 0x2d } }, -{ "movtc", {"rwabrbabrwab", 0x2e } }, -{ "movtuc", {"rwabrbabrwab", 0x2f } }, -{ "bsbw", {"bw", 0x30 } }, -{ "brw", {"bw", 0x31 } }, -{ "cvtwl", {"rwwl", 0x32 } }, -{ "cvtwb", {"rwwb", 0x33 } }, -{ "movp", {"rwabab", 0x34 } }, -{ "cmpp3", {"rwabab", 0x35 } }, -{ "cvtpl", {"rwabwl", 0x36 } }, -{ "cmpp4", {"rwabrwab", 0x37 } }, -{ "editpc", {"rwababab", 0x38 } }, -{ "matchc", {"rwabrwab", 0x39 } }, -{ "locc", {"rbrwab", 0x3a } }, -{ "skpc", {"rbrwab", 0x3b } }, -{ "movzwl", {"rwwl", 0x3c } }, -{ "acbw", {"rwrwmwbw", 0x3d } }, -{ "movaw", {"awwl", 0x3e } }, -{ "pushaw", {"aw", 0x3f } }, -{ "addf2", {"rfmf", 0x40 } }, -{ "addf3", {"rfrfwf", 0x41 } }, -{ "subf2", {"rfmf", 0x42 } }, -{ "subf3", {"rfrfwf", 0x43 } }, -{ "mulf2", {"rfmf", 0x44 } }, -{ "mulf3", {"rfrfwf", 0x45 } }, -{ "divf2", {"rfmf", 0x46 } }, -{ "divf3", {"rfrfwf", 0x47 } }, -{ "cvtfb", {"rfwb", 0x48 } }, -{ "cvtfw", {"rfww", 0x49 } }, -{ "cvtfl", {"rfwl", 0x4a } }, -{ "cvtrfl", {"rfwl", 0x4b } }, -{ "cvtbf", {"rbwf", 0x4c } }, -{ "cvtwf", {"rwwf", 0x4d } }, -{ "cvtlf", {"rlwf", 0x4e } }, -{ "acbf", {"rfrfmfbw", 0x4f } }, -{ "movf", {"rfwf", 0x50 } }, -{ "cmpf", {"rfrf", 0x51 } }, -{ "mnegf", {"rfwf", 0x52 } }, -{ "tstf", {"rf", 0x53 } }, -{ "emodf", {"rfrbrfwlwf", 0x54 } }, -{ "polyf", {"rfrwab", 0x55 } }, -{ "cvtfd", {"rfwd", 0x56 } }, - /* opcode 57 is not defined yet */ -{ "adawi", {"rwmw", 0x58 } }, - /* opcode 59 is not defined yet */ - /* opcode 5a is not defined yet */ - /* opcode 5b is not defined yet */ -{ "insqhi", {"abaq", 0x5c } }, -{ "insqti", {"abaq", 0x5d } }, -{ "remqhi", {"aqwl", 0x5e } }, -{ "remqti", {"aqwl", 0x5f } }, -{ "addd2", {"rdmd", 0x60 } }, -{ "addd3", {"rdrdwd", 0x61 } }, -{ "subd2", {"rdmd", 0x62 } }, -{ "subd3", {"rdrdwd", 0x63 } }, -{ "muld2", {"rdmd", 0x64 } }, -{ "muld3", {"rdrdwd", 0x65 } }, -{ "divd2", {"rdmd", 0x66 } }, -{ "divd3", {"rdrdwd", 0x67 } }, -{ "cvtdb", {"rdwb", 0x68 } }, -{ "cvtdw", {"rdww", 0x69 } }, -{ "cvtdl", {"rdwl", 0x6a } }, -{ "cvtrdl", {"rdwl", 0x6b } }, -{ "cvtbd", {"rbwd", 0x6c } }, -{ "cvtwd", {"rwwd", 0x6d } }, -{ "cvtld", {"rlwd", 0x6e } }, -{ "acbd", {"rdrdmdbw", 0x6f } }, -{ "movd", {"rdwd", 0x70 } }, -{ "cmpd", {"rdrd", 0x71 } }, -{ "mnegd", {"rdwd", 0x72 } }, -{ "tstd", {"rd", 0x73 } }, -{ "emodd", {"rdrbrdwlwd", 0x74 } }, -{ "polyd", {"rdrwab", 0x75 } }, -{ "cvtdf", {"rdwf", 0x76 } }, - /* opcode 77 is not defined yet */ -{ "ashl", {"rbrlwl", 0x78 } }, -{ "ashq", {"rbrqwq", 0x79 } }, -{ "emul", {"rlrlrlwq", 0x7a } }, -{ "ediv", {"rlrqwlwl", 0x7b } }, -{ "clrd", {"wd", 0x7c } }, -{ "clrg", {"wg", 0x7c } }, -{ "clrq", {"wd", 0x7c } }, -{ "movq", {"rqwq", 0x7d } }, -{ "movaq", {"aqwl", 0x7e } }, -{ "movad", {"adwl", 0x7e } }, -{ "pushaq", {"aq", 0x7f } }, -{ "pushad", {"ad", 0x7f } }, -{ "addb2", {"rbmb", 0x80 } }, -{ "addb3", {"rbrbwb", 0x81 } }, -{ "subb2", {"rbmb", 0x82 } }, -{ "subb3", {"rbrbwb", 0x83 } }, -{ "mulb2", {"rbmb", 0x84 } }, -{ "mulb3", {"rbrbwb", 0x85 } }, -{ "divb2", {"rbmb", 0x86 } }, -{ "divb3", {"rbrbwb", 0x87 } }, -{ "bisb2", {"rbmb", 0x88 } }, -{ "bisb3", {"rbrbwb", 0x89 } }, -{ "bicb2", {"rbmb", 0x8a } }, -{ "bicb3", {"rbrbwb", 0x8b } }, -{ "xorb2", {"rbmb", 0x8c } }, -{ "xorb3", {"rbrbwb", 0x8d } }, -{ "mnegb", {"rbwb", 0x8e } }, -{ "caseb", {"rbrbrb", 0x8f } }, -{ "movb", {"rbwb", 0x90 } }, -{ "cmpb", {"rbrb", 0x91 } }, -{ "mcomb", {"rbwb", 0x92 } }, -{ "bitb", {"rbrb", 0x93 } }, -{ "clrb", {"wb", 0x94 } }, -{ "tstb", {"rb", 0x95 } }, -{ "incb", {"mb", 0x96 } }, -{ "decb", {"mb", 0x97 } }, -{ "cvtbl", {"rbwl", 0x98 } }, -{ "cvtbw", {"rbww", 0x99 } }, -{ "movzbl", {"rbwl", 0x9a } }, -{ "movzbw", {"rbww", 0x9b } }, -{ "rotl", {"rbrlwl", 0x9c } }, -{ "acbb", {"rbrbmbbw", 0x9d } }, -{ "movab", {"abwl", 0x9e } }, -{ "pushab", {"ab", 0x9f } }, -{ "addw2", {"rwmw", 0xa0 } }, -{ "addw3", {"rwrwww", 0xa1 } }, -{ "subw2", {"rwmw", 0xa2 } }, -{ "subw3", {"rwrwww", 0xa3 } }, -{ "mulw2", {"rwmw", 0xa4 } }, -{ "mulw3", {"rwrwww", 0xa5 } }, -{ "divw2", {"rwmw", 0xa6 } }, -{ "divw3", {"rwrwww", 0xa7 } }, -{ "bisw2", {"rwmw", 0xa8 } }, -{ "bisw3", {"rwrwww", 0xa9 } }, -{ "bicw2", {"rwmw", 0xaa } }, -{ "bicw3", {"rwrwww", 0xab } }, -{ "xorw2", {"rwmw", 0xac } }, -{ "xorw3", {"rwrwww", 0xad } }, -{ "mnegw", {"rwww", 0xae } }, -{ "casew", {"rwrwrw", 0xaf } }, -{ "movw", {"rwww", 0xb0 } }, -{ "cmpw", {"rwrw", 0xb1 } }, -{ "mcomw", {"rwww", 0xb2 } }, -{ "bitw", {"rwrw", 0xb3 } }, -{ "clrw", {"ww", 0xb4 } }, -{ "tstw", {"rw", 0xb5 } }, -{ "incw", {"mw", 0xb6 } }, -{ "decw", {"mw", 0xb7 } }, -{ "bispsw", {"rw", 0xb8 } }, -{ "bicpsw", {"rw", 0xb9 } }, -{ "popr", {"rw", 0xba } }, -{ "pushr", {"rw", 0xbb } }, -{ "chmk", {"rw", 0xbc } }, -{ "chme", {"rw", 0xbd } }, -{ "chms", {"rw", 0xbe } }, -{ "chmu", {"rw", 0xbf } }, -{ "addl2", {"rlml", 0xc0 } }, -{ "addl3", {"rlrlwl", 0xc1 } }, -{ "subl2", {"rlml", 0xc2 } }, -{ "subl3", {"rlrlwl", 0xc3 } }, -{ "mull2", {"rlml", 0xc4 } }, -{ "mull3", {"rlrlwl", 0xc5 } }, -{ "divl2", {"rlml", 0xc6 } }, -{ "divl3", {"rlrlwl", 0xc7 } }, -{ "bisl2", {"rlml", 0xc8 } }, -{ "bisl3", {"rlrlwl", 0xc9 } }, -{ "bicl2", {"rlml", 0xca } }, -{ "bicl3", {"rlrlwl", 0xcb } }, -{ "xorl2", {"rlml", 0xcc } }, -{ "xorl3", {"rlrlwl", 0xcd } }, -{ "mnegl", {"rlwl", 0xce } }, -{ "casel", {"rlrlrl", 0xcf } }, -{ "movl", {"rlwl", 0xd0 } }, -{ "cmpl", {"rlrl", 0xd1 } }, -{ "mcoml", {"rlwl", 0xd2 } }, -{ "bitl", {"rlrl", 0xd3 } }, -{ "clrf", {"wf", 0xd4 } }, -{ "clrl", {"wl", 0xd4 } }, -{ "tstl", {"rl", 0xd5 } }, -{ "incl", {"ml", 0xd6 } }, -{ "decl", {"ml", 0xd7 } }, -{ "adwc", {"rlml", 0xd8 } }, -{ "sbwc", {"rlml", 0xd9 } }, -{ "mtpr", {"rlrl", 0xda } }, -{ "mfpr", {"rlwl", 0xdb } }, -{ "movpsl", {"wl", 0xdc } }, -{ "pushl", {"rl", 0xdd } }, -{ "moval", {"alwl", 0xde } }, -{ "movaf", {"afwl", 0xde } }, -{ "pushal", {"al", 0xdf } }, -{ "pushaf", {"af", 0xdf } }, -{ "bbs", {"rlvbbb", 0xe0 } }, -{ "bbc", {"rlvbbb", 0xe1 } }, -{ "bbss", {"rlvbbb", 0xe2 } }, -{ "bbcs", {"rlvbbb", 0xe3 } }, -{ "bbsc", {"rlvbbb", 0xe4 } }, -{ "bbcc", {"rlvbbb", 0xe5 } }, -{ "bbssi", {"rlvbbb", 0xe6 } }, -{ "bbcci", {"rlvbbb", 0xe7 } }, -{ "blbs", {"rlbb", 0xe8 } }, -{ "blbc", {"rlbb", 0xe9 } }, -{ "ffs", {"rlrbvbwl", 0xea } }, -{ "ffc", {"rlrbvbwl", 0xeb } }, -{ "cmpv", {"rlrbvbrl", 0xec } }, -{ "cmpzv", {"rlrbvbrl", 0xed } }, -{ "extv", {"rlrbvbwl", 0xee } }, -{ "extzv", {"rlrbvbwl", 0xef } }, -{ "insv", {"rlrlrbvb", 0xf0 } }, -{ "acbl", {"rlrlmlbw", 0xf1 } }, -{ "aoblss", {"rlmlbb", 0xf2 } }, -{ "aobleq", {"rlmlbb", 0xf3 } }, -{ "sobgeq", {"mlbb", 0xf4 } }, -{ "sobgtr", {"mlbb", 0xf5 } }, -{ "cvtlb", {"rlwb", 0xf6 } }, -{ "cvtlw", {"rlww", 0xf7 } }, -{ "ashp", {"rbrwabrbrwab", 0xf8 } }, -{ "cvtlp", {"rlrwab", 0xf9 } }, -{ "callg", {"abab", 0xfa } }, -{ "calls", {"rlab", 0xfb } }, -{ "xfc", {"", 0xfc } }, - /* undefined opcodes here */ -{ "cvtdh", {"rdwh", 0x32fd } }, -{ "cvtgf", {"rgwh", 0x33fd } }, -{ "addg2", {"rgmg", 0x40fd } }, -{ "addg3", {"rgrgwg", 0x41fd } }, -{ "subg2", {"rgmg", 0x42fd } }, -{ "subg3", {"rgrgwg", 0x43fd } }, -{ "mulg2", {"rgmg", 0x44fd } }, -{ "mulg3", {"rgrgwg", 0x45fd } }, -{ "divg2", {"rgmg", 0x46fd } }, -{ "divg3", {"rgrgwg", 0x47fd } }, -{ "cvtgb", {"rgwb", 0x48fd } }, -{ "cvtgw", {"rgww", 0x49fd } }, -{ "cvtgl", {"rgwl", 0x4afd } }, -{ "cvtrgl", {"rgwl", 0x4bfd } }, -{ "cvtbg", {"rbwg", 0x4cfd } }, -{ "cvtwg", {"rwwg", 0x4dfd } }, -{ "cvtlg", {"rlwg", 0x4efd } }, -{ "acbg", {"rgrgmgbw", 0x4ffd } }, -{ "movg", {"rgwg", 0x50fd } }, -{ "cmpg", {"rgrg", 0x51fd } }, -{ "mnegg", {"rgwg", 0x52fd } }, -{ "tstg", {"rg", 0x53fd } }, -{ "emodg", {"rgrwrgwlwg", 0x54fd } }, -{ "polyg", {"rgrwab", 0x55fd } }, -{ "cvtgh", {"rgwh", 0x56fd } }, - /* undefined opcodes here */ -{ "addh2", {"rhmh", 0x60fd } }, -{ "addh3", {"rhrhwh", 0x61fd } }, -{ "subh2", {"rhmh", 0x62fd } }, -{ "subh3", {"rhrhwh", 0x63fd } }, -{ "mulh2", {"rhmh", 0x64fd } }, -{ "mulh3", {"rhrhwh", 0x65fd } }, -{ "divh2", {"rhmh", 0x66fd } }, -{ "divh3", {"rhrhwh", 0x67fd } }, -{ "cvthb", {"rhwb", 0x68fd } }, -{ "cvthw", {"rhww", 0x69fd } }, -{ "cvthl", {"rhwl", 0x6afd } }, -{ "cvtrhl", {"rhwl", 0x6bfd } }, -{ "cvtbh", {"rbwh", 0x6cfd } }, -{ "cvtwh", {"rwwh", 0x6dfd } }, -{ "cvtlh", {"rlwh", 0x6efd } }, -{ "acbh", {"rhrhmhbw", 0x6ffd } }, -{ "movh", {"rhwh", 0x70fd } }, -{ "cmph", {"rhrh", 0x71fd } }, -{ "mnegh", {"rhwh", 0x72fd } }, -{ "tsth", {"rh", 0x73fd } }, -{ "emodh", {"rhrwrhwlwh", 0x74fd } }, -{ "polyh", {"rhrwab", 0x75fd } }, -{ "cvthg", {"rhwg", 0x76fd } }, - /* undefined opcodes here */ -{ "clrh", {"wh", 0x7cfd } }, -{ "clro", {"wo", 0x7cfd } }, -{ "movo", {"rowo", 0x7dfd } }, -{ "movah", {"ahwl", 0x7efd } }, -{ "movao", {"aowl", 0x7efd } }, -{ "pushah", {"ah", 0x7ffd } }, -{ "pushao", {"ao", 0x7ffd } }, - /* undefined opcodes here */ -{ "cvtfh", {"rfwh", 0x98fd } }, -{ "cvtfg", {"rfwg", 0x99fd } }, - /* undefined opcodes here */ -{ "cvthf", {"rhwf", 0xf6fd } }, -{ "cvthd", {"rhwd", 0xf7fd } }, - /* undefined opcodes here */ -{ "bugl", {"rl", 0xfdff } }, -{ "bugw", {"rw", 0xfeff } }, - /* undefined opcodes here */ - -{ "", {"", 0} } /* empty is end sentinel */ - -}; /* votstrs */ - -/* end: vax.opcode.h */ diff --git a/contrib/gdb/include/os9k.h b/contrib/gdb/include/os9k.h deleted file mode 100644 index 0f2eed2d3b1b1..0000000000000 --- a/contrib/gdb/include/os9k.h +++ /dev/null @@ -1,169 +0,0 @@ -#if !defined(_MODULE_H) -#define _MODULE_H - -/* OS-9000 i386 module header definitions */ -#define _MPF386 - -/* sizeof common header less parity field */ -#define N_M_PARITY (sizeof(mh_com)-sizeof(unisgned short)) -#define OLD_M_PARITY 46 -#define M_PARITY N_M_PARITY - -#ifdef _MPF68K -#define MODSYNC 0x4afd /* module header sync code for 680x0 processors */ -#endif - -#ifdef _MPF386 -#define MODSYNC 0x4afc /* module header sync code for 80386 processors */ -#endif - -#define MODREV 1 /* module format revision 1 */ -#define CRCCON 0x800fe3 /* crc polynomial constant */ - -/* Module access permission values */ -#define MP_OWNER_READ 0x0001 -#define MP_OWNER_WRITE 0x0002 -#define MP_OWNER_EXEC 0x0004 -#define MP_GROUP_READ 0x0010 -#define MP_GROUP_WRITE 0x0020 -#define MP_GROUP_EXEC 0x0040 -#define MP_WORLD_READ 0x0100 -#define MP_WORLD_WRITE 0x0200 -#define MP_WORLD_EXEC 0x0400 -#define MP_WORLD_ACCESS 0x0777 -#define MP_OWNER_MASK 0x000f -#define MP_GROUP_MASK 0x00f0 -#define MP_WORLD_MASK 0x0f00 -#define MP_SYSTM_MASK 0xf000 - -/* Module Type/Language values */ -#define MT_ANY 0 -#define MT_PROGRAM 0x0001 -#define MT_SUBROUT 0x0002 -#define MT_MULTI 0x0003 -#define MT_DATA 0x0004 -#define MT_TRAPLIB 0x000b -#define MT_SYSTEM 0x000c -#define MT_FILEMAN 0x000d -#define MT_DEVDRVR 0x000e -#define MT_DEVDESC 0x000f -#define MT_MASK 0xff00 - -#define ML_ANY 0 -#define ML_OBJECT 1 -#define ML_ICODE 2 -#define ML_PCODE 3 -#define ML_CCODE 4 -#define ML_CBLCODE 5 -#define ML_FRTNCODE 6 -#define ML_MASK 0x00ff - -#define mktypelang(type,lang) (((type)<<8)|(lang)) - -/* Module Attribute values */ -#define MA_REENT 0x80 -#define MA_GHOST 0x40 -#define MA_SUPER 0x20 -#define MA_MASK 0xff00 -#define MR_MASK 0x00ff - -#define mkattrevs(attr, revs) (((attr)<<8)|(revs)) - -#define m_user m_owner.grp_usr.usr -#define m_group m_owner.grp_usr.grp -#define m_group_user m_owner.group_user - -/* macro definitions for accessing module header fields */ -#define MODNAME(mod) ((u_char*)((u_char*)mod + ((Mh_com)mod)->m_name)) -#if 0 -/* Appears not to be used, and the u_int32 typedef is gone (because it - conflicted with a Mach header. */ -#define MODSIZE(mod) ((u_int32)((Mh_com)mod)->m_size) -#endif /* 0 */ -#define MHCOM_BYTES_SIZE 80 -#define N_BADMAG(a) (((a).a_info) != MODSYNC) - -typedef struct mh_com { - /* sync bytes ($4afc). */ - unsigned char m_sync[2]; - unsigned char m_sysrev[2]; /* system revision check value */ - unsigned char - m_size[4]; /* module size */ - unsigned char - m_owner[4]; /* group/user id */ - unsigned char - m_name[4]; /* offset to module name */ - unsigned char - m_access[2], /* access permissions */ - m_tylan[2], /* type/lang */ - m_attrev[2], /* rev/attr */ - m_edit[2]; /* edition */ - unsigned char - m_needs[4], /* module hardware requirements flags. (reserved) */ - m_usage[4], /* comment string offset */ - m_symbol[4], /* symbol table offset */ - m_exec[4], /* offset to execution entry point */ - m_excpt[4], /* offset to exception entry point */ - m_data[4], /* data storage requirement */ - m_stack[4], /* stack size */ - m_idata[4], /* offset to initialized data */ - m_idref[4], /* offset to data reference lists */ - m_init[4], /* initialization routine offset */ - m_term[4]; /* termination routine offset */ - unsigned char - m_ident[2]; /* ident code for ident program */ - char - m_spare[8]; /* reserved bytes */ - unsigned char - m_parity[2]; /* header parity */ -} mh_com,*Mh_com; - -/* Executable memory module */ -typedef mh_com *Mh_exec,mh_exec; - -/* Data memory module */ -typedef mh_com *Mh_data,mh_data; - -/* File manager memory module */ -typedef mh_com *Mh_fman,mh_fman; - -/* device driver module */ -typedef mh_com *Mh_drvr,mh_drvr; - -/* trap handler module */ -typedef mh_com mh_trap, *Mh_trap; - -/* Device descriptor module */ -typedef mh_com *Mh_dev,mh_dev; - -/* Configuration module */ -typedef mh_com *Mh_config, mh_config; - -#if 0 - -#if !defined(_MODDIR_H) -/* go get _os_fmod (and others) */ -#include <moddir.h> -#endif - -error_code _os_crc(void *, u_int32, int *); -error_code _os_datmod(char *, u_int32, u_int16 *, u_int16 *, u_int32, void **, mh_data **); -error_code _os_get_moddir(void *, u_int32 *); -error_code _os_initdata(mh_com *, void *); -error_code _os_link(char **, mh_com **, void **, u_int16 *, u_int16 *); -error_code _os_linkm(mh_com *, void **, u_int16 *, u_int16 *); -error_code _os_load(char *, mh_com **, void **, u_int32, u_int16 *, u_int16 *, u_int32); -error_code _os_mkmodule(char *, u_int32, u_int16 *, u_int16 *, u_int32, void **, mh_com **, u_int32); -error_code _os_modaddr(void *, mh_com **); -error_code _os_setcrc(mh_com *); -error_code _os_slink(u_int32, char *, void **, void **, mh_com **); -error_code _os_slinkm(u_int32, mh_com *, void **, void **); -error_code _os_unlink(mh_com *); -error_code _os_unload(char *, u_int32); -error_code _os_tlink(u_int32, char *, void **, mh_trap **, void *, u_int32); -error_code _os_tlinkm(u_int32, mh_com *, void **, void *, u_int32); -error_code _os_iodel(mh_com *); -error_code _os_vmodul(mh_com *, mh_com *, u_int32); -#endif /* 0 */ - -#endif diff --git a/contrib/gdb/include/progress.h b/contrib/gdb/include/progress.h deleted file mode 100644 index f18318a451409..0000000000000 --- a/contrib/gdb/include/progress.h +++ /dev/null @@ -1,37 +0,0 @@ -/* Default definitions for progress macros. - Copyright (C) 1994 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 2 of the License, 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ - -/* The default definitions below are intended to be replaced by real - definitions, if building the tools for an interactive programming - environment. */ - -#ifndef _PROGRESS_H -#define _PROGRESS_H - -#ifndef START_PROGRESS -#define START_PROGRESS(STR,N) -#endif - -#ifndef PROGRESS -#define PROGRESS(X) -#endif - -#ifndef END_PROGRESS -#define END_PROGRESS(STR) -#endif - -#endif /* _PROGRESS_H */ diff --git a/contrib/gdb/include/wait.h b/contrib/gdb/include/wait.h deleted file mode 100644 index fa3c9ccb1d7e1..0000000000000 --- a/contrib/gdb/include/wait.h +++ /dev/null @@ -1,63 +0,0 @@ -/* Define how to access the int that the wait system call stores. - This has been compatible in all Unix systems since time immemorial, - but various well-meaning people have defined various different - words for the same old bits in the same old int (sometimes claimed - to be a struct). We just know it's an int and we use these macros - to access the bits. */ - -/* The following macros are defined equivalently to their definitions - in POSIX.1. We fail to define WNOHANG and WUNTRACED, which POSIX.1 - <sys/wait.h> defines, since our code does not use waitpid(). We - also fail to declare wait() and waitpid(). */ - -#ifndef WIFEXITED -#define WIFEXITED(w) (((w)&0377) == 0) -#endif - -#ifndef WIFSIGNALED -#define WIFSIGNALED(w) (((w)&0377) != 0177 && ((w)&~0377) == 0) -#endif - -#ifndef WIFSTOPPED -#ifdef IBM6000 - -/* Unfortunately, the above comment (about being compatible in all Unix - systems) is not quite correct for AIX, sigh. And AIX 3.2 can generate - status words like 0x57c (sigtrap received after load), and gdb would - choke on it. */ - -#define WIFSTOPPED(w) ((w)&0x40) - -#else -#define WIFSTOPPED(w) (((w)&0377) == 0177) -#endif -#endif - -#ifndef WEXITSTATUS -#define WEXITSTATUS(w) (((w) >> 8) & 0377) /* same as WRETCODE */ -#endif - -#ifndef WTERMSIG -#define WTERMSIG(w) ((w) & 0177) -#endif - -#ifndef WSTOPSIG -#define WSTOPSIG WEXITSTATUS -#endif - -/* These are not defined in POSIX, but are used by our programs. */ - -#define WAITTYPE int - -#ifndef WCOREDUMP -#define WCOREDUMP(w) (((w)&0200) != 0) -#endif - -#ifndef WSETEXIT -#define WSETEXIT(w,status) ((w) = (0 | ((status) << 8))) -#endif - -#ifndef WSETSTOP -#define WSETSTOP(w,sig) ((w) = (0177 | ((sig) << 8))) -#endif - diff --git a/contrib/gdb/install.sh b/contrib/gdb/install.sh deleted file mode 100755 index c92d510dd11b6..0000000000000 --- a/contrib/gdb/install.sh +++ /dev/null @@ -1,236 +0,0 @@ -#!/bin/sh -# -# install - install a program, script, or datafile -# This comes from X11R5. -# -# $XConsortium: install.sh,v 1.2 89/12/18 14:47:22 jim Exp $ -# -# This script is compatible with the BSD install script, but was written -# from scratch. -# - - -# set DOITPROG to echo to test this script - -# Don't use :- since 4.3BSD and earlier shells don't like it. -doit="${DOITPROG-}" - - -# put in absolute paths if you don't have them in your path; or use env. vars. - -mvprog="${MVPROG-mv}" -cpprog="${CPPROG-cp}" -chmodprog="${CHMODPROG-chmod}" -chownprog="${CHOWNPROG-chown}" -chgrpprog="${CHGRPPROG-chgrp}" -stripprog="${STRIPPROG-strip}" -rmprog="${RMPROG-rm}" -mkdirprog="${MKDIRPROG-mkdir}" - -transformbasename="" -transform_arg="" -instcmd="$mvprog" -chmodcmd="$chmodprog 0755" -chowncmd="" -chgrpcmd="" -stripcmd="" -rmcmd="$rmprog -f" -mvcmd="$mvprog" -src="" -dst="" -dir_arg="" - -while [ x"$1" != x ]; do - case $1 in - -c) instcmd="$cpprog" - shift - continue;; - - -d) dir_arg=true - shift - continue;; - - -m) chmodcmd="$chmodprog $2" - shift - shift - continue;; - - -o) chowncmd="$chownprog $2" - shift - shift - continue;; - - -g) chgrpcmd="$chgrpprog $2" - shift - shift - continue;; - - -s) stripcmd="$stripprog" - shift - continue;; - - -t=*) transformarg=`echo $1 | sed 's/-t=//'` - shift - continue;; - - -b=*) transformbasename=`echo $1 | sed 's/-b=//'` - shift - continue;; - - *) if [ x"$src" = x ] - then - src=$1 - else - # this colon is to work around a 386BSD /bin/sh bug - : - dst=$1 - fi - shift - continue;; - esac -done - -if [ x"$src" = x ] -then - echo "install: no input file specified" - exit 1 -else - true -fi - -if [ x"$dir_arg" != x ]; then - dst=$src - src="" - - if [ -d $dst ]; then - instcmd=: - else - instcmd=mkdir - fi -else - -# Waiting for this to be detected by the "$instcmd $src $dsttmp" command -# might cause directories to be created, which would be especially bad -# if $src (and thus $dsttmp) contains '*'. - - if [ -f $src -o -d $src ] - then - true - else - echo "install: $src does not exist" - exit 1 - fi - - if [ x"$dst" = x ] - then - echo "install: no destination specified" - exit 1 - else - true - fi - -# If destination is a directory, append the input filename; if your system -# does not like double slashes in filenames, you may need to add some logic - - if [ -d $dst ] - then - dst="$dst"/`basename $src` - else - true - fi -fi - -## this sed command emulates the dirname command -dstdir=`echo $dst | sed -e 's,[^/]*$,,;s,/$,,;s,^$,.,'` - -# Make sure that the destination directory exists. -# this part is taken from Noah Friedman's mkinstalldirs script - -# Skip lots of stat calls in the usual case. -if [ ! -d "$dstdir" ]; then -defaultIFS=' -' -IFS="${IFS-${defaultIFS}}" - -oIFS="${IFS}" -# Some sh's can't handle IFS=/ for some reason. -IFS='%' -set - `echo ${dstdir} | sed -e 's@/@%@g' -e 's@^%@/@'` -IFS="${oIFS}" - -pathcomp='' - -while [ $# -ne 0 ] ; do - pathcomp="${pathcomp}${1}" - shift - - if [ ! -d "${pathcomp}" ] ; - then - $mkdirprog "${pathcomp}" - else - true - fi - - pathcomp="${pathcomp}/" -done -fi - -if [ x"$dir_arg" != x ] -then - $doit $instcmd $dst && - - if [ x"$chowncmd" != x ]; then $doit $chowncmd $dst; else true ; fi && - if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd $dst; else true ; fi && - if [ x"$stripcmd" != x ]; then $doit $stripcmd $dst; else true ; fi && - if [ x"$chmodcmd" != x ]; then $doit $chmodcmd $dst; else true ; fi -else - -# If we're going to rename the final executable, determine the name now. - - if [ x"$transformarg" = x ] - then - dstfile=`basename $dst` - else - dstfile=`basename $dst $transformbasename | - sed $transformarg`$transformbasename - fi - -# don't allow the sed command to completely eliminate the filename - - if [ x"$dstfile" = x ] - then - dstfile=`basename $dst` - else - true - fi - -# Make a temp file name in the proper directory. - - dsttmp=$dstdir/#inst.$$# - -# Move or copy the file name to the temp name - - $doit $instcmd $src $dsttmp && - - trap "rm -f ${dsttmp}" 0 && - -# and set any options; do chmod last to preserve setuid bits - -# If any of these fail, we abort the whole thing. If we want to -# ignore errors from any of these, just make sure not to ignore -# errors from the above "$doit $instcmd $src $dsttmp" command. - - if [ x"$chowncmd" != x ]; then $doit $chowncmd $dsttmp; else true;fi && - if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd $dsttmp; else true;fi && - if [ x"$stripcmd" != x ]; then $doit $stripcmd $dsttmp; else true;fi && - if [ x"$chmodcmd" != x ]; then $doit $chmodcmd $dsttmp; else true;fi && - -# Now rename the file to the real destination. - - $doit $rmcmd -f $dstdir/$dstfile && - $doit $mvcmd $dsttmp $dstdir/$dstfile - -fi && - - -exit 0 diff --git a/contrib/gdb/libiberty/COPYING.LIB b/contrib/gdb/libiberty/COPYING.LIB deleted file mode 100644 index eb685a5ec981b..0000000000000 --- a/contrib/gdb/libiberty/COPYING.LIB +++ /dev/null @@ -1,481 +0,0 @@ - GNU LIBRARY GENERAL PUBLIC LICENSE - Version 2, June 1991 - - Copyright (C) 1991 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. - -[This is the first released version of the library GPL. It is - numbered 2 because it goes with version 2 of the ordinary GPL.] - - Preamble - - The licenses for most software are designed to take away your -freedom to share and change it. By contrast, the GNU General Public -Licenses are intended to guarantee your freedom to share and change -free software--to make sure the software is free for all its users. - - This license, the Library General Public License, applies to some -specially designated Free Software Foundation software, and to any -other libraries whose authors decide to use it. You can use it for -your libraries, too. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -this service if you wish), 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 library, or if you modify it. - - For example, if you distribute copies of the library, whether gratis -or for a fee, you must give the recipients all the rights that we gave -you. You must make sure that they, too, receive or can get the source -code. If you link a program with the library, you must provide -complete object files to the recipients so that they can relink them -with the library, after making changes to the library and recompiling -it. And you must show them these terms so they know their rights. - - Our method of protecting your rights has two steps: (1) copyright -the library, and (2) offer you this license which gives you legal -permission to copy, distribute and/or modify the library. - - Also, for each distributor's protection, we want to make certain -that everyone understands that there is no warranty for this free -library. If the library is modified by someone else and passed on, we -want its recipients to know that what they have is not the original -version, so that any problems introduced by others will not reflect on -the original authors' reputations. - - Finally, any free program is threatened constantly by software -patents. We wish to avoid the danger that companies distributing free -software will individually obtain patent licenses, thus in effect -transforming the program into proprietary software. To prevent this, -we have made it clear that any patent must be licensed for everyone's -free use or not licensed at all. - - Most GNU software, including some libraries, is covered by the ordinary -GNU General Public License, which was designed for utility programs. This -license, the GNU Library General Public License, applies to certain -designated libraries. This license is quite different from the ordinary -one; be sure to read it in full, and don't assume that anything in it is -the same as in the ordinary license. - - The reason we have a separate public license for some libraries is that -they blur the distinction we usually make between modifying or adding to a -program and simply using it. Linking a program with a library, without -changing the library, is in some sense simply using the library, and is -analogous to running a utility program or application program. However, in -a textual and legal sense, the linked executable is a combined work, a -derivative of the original library, and the ordinary General Public License -treats it as such. - - Because of this blurred distinction, using the ordinary General -Public License for libraries did not effectively promote software -sharing, because most developers did not use the libraries. We -concluded that weaker conditions might promote sharing better. - - However, unrestricted linking of non-free programs would deprive the -users of those programs of all benefit from the free status of the -libraries themselves. This Library General Public License is intended to -permit developers of non-free programs to use free libraries, while -preserving your freedom as a user of such programs to change the free -libraries that are incorporated in them. (We have not seen how to achieve -this as regards changes in header files, but we have achieved it as regards -changes in the actual functions of the Library.) The hope is that this -will lead to faster development of free libraries. - - The precise terms and conditions for copying, distribution and -modification follow. Pay close attention to the difference between a -"work based on the library" and a "work that uses the library". The -former contains code derived from the library, while the latter only -works together with the library. - - Note that it is possible for a library to be covered by the ordinary -General Public License rather than by this special one. - - GNU LIBRARY GENERAL PUBLIC LICENSE - TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION - - 0. This License Agreement applies to any software library which -contains a notice placed by the copyright holder or other authorized -party saying it may be distributed under the terms of this Library -General Public License (also called "this License"). Each licensee is -addressed as "you". - - A "library" means a collection of software functions and/or data -prepared so as to be conveniently linked with application programs -(which use some of those functions and data) to form executables. - - The "Library", below, refers to any such software library or work -which has been distributed under these terms. A "work based on the -Library" means either the Library or any derivative work under -copyright law: that is to say, a work containing the Library or a -portion of it, either verbatim or with modifications and/or translated -straightforwardly into another language. (Hereinafter, translation is -included without limitation in the term "modification".) - - "Source code" for a work means the preferred form of the work for -making modifications to it. For a library, complete source code means -all the source code for all modules it contains, plus any associated -interface definition files, plus the scripts used to control compilation -and installation of the library. - - Activities other than copying, distribution and modification are not -covered by this License; they are outside its scope. The act of -running a program using the Library is not restricted, and output from -such a program is covered only if its contents constitute a work based -on the Library (independent of the use of the Library in a tool for -writing it). Whether that is true depends on what the Library does -and what the program that uses the Library does. - - 1. You may copy and distribute verbatim copies of the Library's -complete 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 License and to the absence of any -warranty; and distribute a copy of this License along with the -Library. - - 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. - - 2. You may modify your copy or copies of the Library or any portion -of it, thus forming a work based on the Library, and copy and -distribute such modifications or work under the terms of Section 1 -above, provided that you also meet all of these conditions: - - a) The modified work must itself be a software library. - - b) You must cause the files modified to carry prominent notices - stating that you changed the files and the date of any change. - - c) You must cause the whole of the work to be licensed at no - charge to all third parties under the terms of this License. - - d) If a facility in the modified Library refers to a function or a - table of data to be supplied by an application program that uses - the facility, other than as an argument passed when the facility - is invoked, then you must make a good faith effort to ensure that, - in the event an application does not supply such function or - table, the facility still operates, and performs whatever part of - its purpose remains meaningful. - - (For example, a function in a library to compute square roots has - a purpose that is entirely well-defined independent of the - application. Therefore, Subsection 2d requires that any - application-supplied function or table used by this function must - be optional: if the application does not supply it, the square - root function must still compute square roots.) - -These requirements apply to the modified work as a whole. If -identifiable sections of that work are not derived from the Library, -and can be reasonably considered independent and separate works in -themselves, then this License, and its terms, do not apply to those -sections when you distribute them as separate works. But when you -distribute the same sections as part of a whole which is a work based -on the Library, the distribution of the whole must be on the terms of -this License, whose permissions for other licensees extend to the -entire whole, and thus to each and every part regardless of who wrote -it. - -Thus, it is not the intent of this section to claim rights or contest -your rights to work written entirely by you; rather, the intent is to -exercise the right to control the distribution of derivative or -collective works based on the Library. - -In addition, mere aggregation of another work not based on the Library -with the Library (or with a work based on the Library) on a volume of -a storage or distribution medium does not bring the other work under -the scope of this License. - - 3. You may opt to apply the terms of the ordinary GNU General Public -License instead of this License to a given copy of the Library. To do -this, you must alter all the notices that refer to this License, so -that they refer to the ordinary GNU General Public License, version 2, -instead of to this License. (If a newer version than version 2 of the -ordinary GNU General Public License has appeared, then you can specify -that version instead if you wish.) Do not make any other change in -these notices. - - Once this change is made in a given copy, it is irreversible for -that copy, so the ordinary GNU General Public License applies to all -subsequent copies and derivative works made from that copy. - - This option is useful when you wish to copy part of the code of -the Library into a program that is not a library. - - 4. You may copy and distribute the Library (or a portion or -derivative of it, under Section 2) in object code or executable form -under the terms of Sections 1 and 2 above provided that you accompany -it with the complete corresponding machine-readable source code, which -must be distributed under the terms of Sections 1 and 2 above on a -medium customarily used for software interchange. - - If distribution of object code is made by offering access to copy -from a designated place, then offering equivalent access to copy the -source code from the same place satisfies the requirement to -distribute the source code, even though third parties are not -compelled to copy the source along with the object code. - - 5. A program that contains no derivative of any portion of the -Library, but is designed to work with the Library by being compiled or -linked with it, is called a "work that uses the Library". Such a -work, in isolation, is not a derivative work of the Library, and -therefore falls outside the scope of this License. - - However, linking a "work that uses the Library" with the Library -creates an executable that is a derivative of the Library (because it -contains portions of the Library), rather than a "work that uses the -library". The executable is therefore covered by this License. -Section 6 states terms for distribution of such executables. - - When a "work that uses the Library" uses material from a header file -that is part of the Library, the object code for the work may be a -derivative work of the Library even though the source code is not. -Whether this is true is especially significant if the work can be -linked without the Library, or if the work is itself a library. The -threshold for this to be true is not precisely defined by law. - - If such an object file uses only numerical parameters, data -structure layouts and accessors, and small macros and small inline -functions (ten lines or less in length), then the use of the object -file is unrestricted, regardless of whether it is legally a derivative -work. (Executables containing this object code plus portions of the -Library will still fall under Section 6.) - - Otherwise, if the work is a derivative of the Library, you may -distribute the object code for the work under the terms of Section 6. -Any executables containing that work also fall under Section 6, -whether or not they are linked directly with the Library itself. - - 6. As an exception to the Sections above, you may also compile or -link a "work that uses the Library" with the Library to produce a -work containing portions of the Library, and distribute that work -under terms of your choice, provided that the terms permit -modification of the work for the customer's own use and reverse -engineering for debugging such modifications. - - You must give prominent notice with each copy of the work that the -Library is used in it and that the Library and its use are covered by -this License. You must supply a copy of this License. If the work -during execution displays copyright notices, you must include the -copyright notice for the Library among them, as well as a reference -directing the user to the copy of this License. Also, you must do one -of these things: - - a) Accompany the work with the complete corresponding - machine-readable source code for the Library including whatever - changes were used in the work (which must be distributed under - Sections 1 and 2 above); and, if the work is an executable linked - with the Library, with the complete machine-readable "work that - uses the Library", as object code and/or source code, so that the - user can modify the Library and then relink to produce a modified - executable containing the modified Library. (It is understood - that the user who changes the contents of definitions files in the - Library will not necessarily be able to recompile the application - to use the modified definitions.) - - b) Accompany the work with a written offer, valid for at - least three years, to give the same user the materials - specified in Subsection 6a, above, for a charge no more - than the cost of performing this distribution. - - c) If distribution of the work is made by offering access to copy - from a designated place, offer equivalent access to copy the above - specified materials from the same place. - - d) Verify that the user has already received a copy of these - materials or that you have already sent this user a copy. - - For an executable, the required form of the "work that uses the -Library" must include any data and utility programs needed for -reproducing the executable from it. However, as a special exception, -the source code distributed need not include anything that is normally -distributed (in either source or binary form) with the major -components (compiler, kernel, and so on) of the operating system on -which the executable runs, unless that component itself accompanies -the executable. - - It may happen that this requirement contradicts the license -restrictions of other proprietary libraries that do not normally -accompany the operating system. Such a contradiction means you cannot -use both them and the Library together in an executable that you -distribute. - - 7. You may place library facilities that are a work based on the -Library side-by-side in a single library together with other library -facilities not covered by this License, and distribute such a combined -library, provided that the separate distribution of the work based on -the Library and of the other library facilities is otherwise -permitted, and provided that you do these two things: - - a) Accompany the combined library with a copy of the same work - based on the Library, uncombined with any other library - facilities. This must be distributed under the terms of the - Sections above. - - b) Give prominent notice with the combined library of the fact - that part of it is a work based on the Library, and explaining - where to find the accompanying uncombined form of the same work. - - 8. You may not copy, modify, sublicense, link with, or distribute -the Library except as expressly provided under this License. Any -attempt otherwise to copy, modify, sublicense, link with, or -distribute the Library is void, and will automatically terminate your -rights under this License. However, parties who have received copies, -or rights, from you under this License will not have their licenses -terminated so long as such parties remain in full compliance. - - 9. You are not required to accept this License, since you have not -signed it. However, nothing else grants you permission to modify or -distribute the Library or its derivative works. These actions are -prohibited by law if you do not accept this License. Therefore, by -modifying or distributing the Library (or any work based on the -Library), you indicate your acceptance of this License to do so, and -all its terms and conditions for copying, distributing or modifying -the Library or works based on it. - - 10. Each time you redistribute the Library (or any work based on the -Library), the recipient automatically receives a license from the -original licensor to copy, distribute, link with or modify the Library -subject to these terms and conditions. You may not impose any further -restrictions on the recipients' exercise of the rights granted herein. -You are not responsible for enforcing compliance by third parties to -this License. - - 11. If, as a consequence of a court judgment or allegation of patent -infringement or for any other reason (not limited to patent issues), -conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot -distribute so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you -may not distribute the Library at all. For example, if a patent -license would not permit royalty-free redistribution of the Library by -all those who receive copies directly or indirectly through you, then -the only way you could satisfy both it and this License would be to -refrain entirely from distribution of the Library. - -If any portion of this section is held invalid or unenforceable under any -particular circumstance, the balance of the section is intended to apply, -and the section as a whole is intended to apply in other circumstances. - -It is not the purpose of this section to induce you to infringe any -patents or other property right claims or to contest validity of any -such claims; this section has the sole purpose of protecting the -integrity of the free software distribution system which is -implemented by public license practices. Many people have made -generous contributions to the wide range of software distributed -through that system in reliance on consistent application of that -system; it is up to the author/donor to decide if he or she is willing -to distribute software through any other system and a licensee cannot -impose that choice. - -This section is intended to make thoroughly clear what is believed to -be a consequence of the rest of this License. - - 12. If the distribution and/or use of the Library is restricted in -certain countries either by patents or by copyrighted interfaces, the -original copyright holder who places the Library under this License may add -an explicit geographical distribution limitation excluding those countries, -so that distribution is permitted only in or among countries not thus -excluded. In such case, this License incorporates the limitation as if -written in the body of this License. - - 13. The Free Software Foundation may publish revised and/or new -versions of the Library 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 Library -specifies a version number of this 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 Library does not specify a -license version number, you may choose any version ever published by -the Free Software Foundation. - - 14. If you wish to incorporate parts of the Library into other free -programs whose distribution conditions are incompatible with these, -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 - - 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO -WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. -EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR -OTHER PARTIES PROVIDE THE LIBRARY "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 -LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME -THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - - 16. 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 LIBRARY 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 -LIBRARY (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 LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), 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 Libraries - - If you develop a new library, and you want it to be of the greatest -possible use to the public, we recommend making it free software that -everyone can redistribute and change. You can do so by permitting -redistribution under these terms (or, alternatively, under the terms of the -ordinary General Public License). - - To apply these terms, attach the following notices to the library. 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 library's name and a brief idea of what it does.> - Copyright (C) <year> <name of author> - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Library General Public - License as published by the Free Software Foundation; either - version 2 of the License, or (at your option) any later version. - - This library 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 - Library General Public License for more details. - - You should have received a copy of the GNU Library General Public - License along with this library; 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. - -You should also get your employer (if you work as a programmer) or your -school, if any, to sign a "copyright disclaimer" for the library, if -necessary. Here is a sample; alter the names: - - Yoyodyne, Inc., hereby disclaims all copyright interest in the - library `Frob' (a library for tweaking knobs) written by James Random Hacker. - - <signature of Ty Coon>, 1 April 1990 - Ty Coon, President of Vice - -That's all there is to it! diff --git a/contrib/gdb/libiberty/ChangeLog b/contrib/gdb/libiberty/ChangeLog deleted file mode 100644 index b28ef2f6ed52a..0000000000000 --- a/contrib/gdb/libiberty/ChangeLog +++ /dev/null @@ -1,1815 +0,0 @@ -Tue Mar 19 22:02:07 1996 Jason Merrill <jason@yorick.cygnus.com> - - * cplus-dem.c (demangle_template): Fix for non-mangled pointer - arguments. - -Fri Mar 8 17:24:18 1996 Ian Lance Taylor <ian@cygnus.com> - - * configure.in: If srcdir is `.' and with_target_subdir is not - `.', then set MULTISRCTOP before calling config-ml.in. - -Thu Mar 7 13:37:10 1996 Stan Shebs <shebs@andros.cygnus.com> - - * mpw.c (mpw_open): Add debugging output option. - -Wed Mar 6 17:36:03 1996 Jason Merrill <jason@yorick.cygnus.com> - - * cplus-dem.c (demangle_template): Fix for address-of-extern arguments. - -Tue Feb 27 12:00:50 1996 Raymond Jou <rjou@mexican.cygnus.com> - - * mpw.c (mpwify_filename): Change 6 to 5 in - strncmp (unixname, "/tmp/", 5). - -Tue Feb 20 10:55:53 1996 Ian Lance Taylor <ian@cygnus.com> - - * cplus-dem.c (demangle_template): Initialize is_bool. Correctly - handle 0 as a pointer value parameter. - -Mon Feb 5 16:41:44 1996 Ian Lance Taylor <ian@cygnus.com> - - * Makefile.in (all): Depend upon required-list. - (required-list): New target. - (clean): Remove required-list. - -Wed Jan 31 10:19:41 1996 Steve Chamberlain <sac@slash.cygnus.com> - - * win32.c: Deleted. - * config.table (i386-*-win32): Deleted. - * config/mh-i386win32: Deleted. - -Thu Jan 18 11:34:17 1996 Ian Lance Taylor <ian@cygnus.com> - - * cplus-dem.c (cplus_demangle_opname): Change opname parameter to - const char *. - (cplus_mangle_opname): Change return type and opname parameter to - const char *. Don't cast return value. - -Tue Jan 16 12:13:11 1996 Stan Shebs <shebs@andros.cygnus.com> - - * mpw.c: Include Timer.h, in order to get m68k Microseconds trap - definition. - -Wed Jan 3 13:15:04 1996 Fred Fish <fnf@cygnus.com> - - * obstack.c: Update copyright to 1996. - (_obstack_memory_used): Define new function. Called via - obstack_memory_used macro. - -Thu Dec 28 11:39:40 1995 Ian Lance Taylor <ian@cygnus.com> - - * xstrdup.c: New file. - * Makefile.in (CFILES): Add xstrdup.c. - (REQUIRED_OFILES): Add xstrdup.o. - (xstrdup.o): New target. - -Mon Dec 11 18:18:52 1995 Mike Stump <mrs@cygnus.com> - - * atexit.c: New stub to provide atexit on systems that have - on_exit, like SunOS 4.1.x systems. - * functions.def (on_exit, atexit): Ditto. - -Mon Dec 11 15:42:14 1995 Stan Shebs <shebs@andros.cygnus.com> - - * mpw.c (mpw_abort): Remove decl. - (mpw_access): Move debugging printf. - -Sat Dec 2 01:25:23 1995 Ian Lance Taylor <ian@cygnus.com> - - * config.table: Consistently use ${host} rather than ${xhost} or - ${target}. - * configure.in: Don't bother to set ${xhost} before calling - config.table. - -Tue Nov 28 14:16:57 1995 Brendan Kehoe <brendan@lisa.cygnus.com> - - * Makefile.in (.c.o): Use test instead of the left bracket, to - avoid problems with some versions of make. - -Tue Nov 28 11:45:17 1995 Stan Shebs <shebs@andros.cygnus.com> - - * mpw-make.sed: Fix INCDIR edit to work with Nov 14 change. - -Tue Nov 21 11:26:34 1995 Fred Fish <fnf@rtl.cygnus.com> - - * config/mh-hpux: Remove. It was only used to define EXTRA_OFILES, - which was set to just alloca.o, which is now automatically marked - as needed by the autoconfiguration process. - -Tue Nov 21 14:15:06 1995 Ian Lance Taylor <ian@cygnus.com> - - * config.table: Check ${with_cross_host} rather than comparing - ${host} and ${target}. - -Thu Nov 16 14:34:42 1995 Ian Lance Taylor <ian@cygnus.com> - - * configure.in: If with_target_subdir is empty, set xhost to - ${host} rather than ${target} before calling config.table. - -Tue Nov 14 01:38:30 1995 Doug Evans <dje@canuck.cygnus.com> - - * Makefile.in (MULTITOP): Deleted. - (MULTISRCTOP, MULTIBUILDTOP): New. - (FLAGS_TO_PASS): Delete INCDIR. - (INCDIR): Add $(MULTISRCTOP). - (install_to_libdir): Add $(MULTISUBDIR). Call $(MULTIDO). - * configure.in: Delete call to cfg-ml-com.in. Call config-ml.in - instead of cfg-ml-pos.in. - (cross-compile check): Change to test for with_target_subdir. - (EXTRA_LINKS): Delete. - -Sun Nov 12 12:13:04 1995 Stan Shebs <shebs@andros.cygnus.com> - - * mpw-make.sed: Add getpagesize.c.o to needed-list. - * mpw.c [USE_MW_HEADERS]: Conditionalize compiling of - functions that are supplied by Metrowerks libraries. - (fstat): Clean up descriptor->pointer conversion code. - (InstallConsole, etc): Empty definitions, for when linking - with SIOUX. - -Sun Nov 5 19:25:27 1995 Per Bothner <bothner@kalessin.cygnus.com> - - * Makefile.in (FLAGS_TO_PASS): Also pass PICFLAGS. - (.c.o): Stylistic change. - -Thu Nov 2 12:06:29 1995 Ian Lance Taylor <ian@cygnus.com> - - * strtol.c, strtoul.c: Don't include <stdlib.h>. From - phdm@info.ucl.ac.be (Philippe De Muyter). - -Wed Nov 1 11:59:36 1995 Ian Lance Taylor <ian@cygnus.com> - - * configure.in: Correct sed call. - -Mon Oct 30 13:03:45 1995 Per Bothner <bothner@kalessin.cygnus.com> - - * configure.in: Clean up / simplify for native. - - * configure.in: Merge in stuff from ../xiberty/configure.in. - * Makefile.in (CC): Add definition (so it can be overrridden - by ../configure). - -Tue Oct 24 17:57:27 1995 Stan Shebs <shebs@andros.cygnus.com> - - * mpw-make.sed: Leave strerror.c.o in standard list of functions. - * mpw.c (R_OK, ENOENT, EACCESS, ENOSYS): Remove. - (link): Remove useless definition with error return. - (last_microseconds, warn_if_spin_delay, record_for_spin_delay): - Use UnsignedWide type for microsecond counts. - -Thu Oct 19 10:52:07 1995 Michael Meissner <meissner@wogglebug.tiac.net> - - * memcmp.c (memcmp): Argument types are const void *, not void - *const. - - * strncasecmp.c (strncasecmp): Include ansidecl.h/stdarg.h, not - sys/types.h. - * strcasecmp.c (strcasecmp): Ditto. - -Tue Oct 10 11:03:24 1995 Fred Fish <fnf@cygnus.com> - - * Makefile.in (BISON): Remove macro. - -Tue Sep 26 15:06:46 1995 Stan Shebs <shebs@andros.cygnus.com> - - * Makefile.in (HFILES): Add default empty definition. - * mpw-config.in (config.h): Only update if changed. - * mpw-make.in: Remove. - * mpw-make.sed: New file, edits Makefile.in into MPW makefile. - * mpw.c: Remove semi-clone of strerror code. - (sys_nerr, sys_errlist): Define here. - (Microseconds): Only define as A-line trap if m68k Mac. - -Wed Sep 20 12:53:32 1995 Ian Lance Taylor <ian@cygnus.com> - - * Makefile.in (maintainer-clean): New synonym for distclean. - -Mon Aug 28 19:47:52 1995 Per Bothner <bothner@kalessin.cygnus.com> - - * config.table: For host, generalize rs6000-ibm-aix* - to *-ibm-aix* so we also include powerpc. - -Tue Aug 22 03:18:05 1995 Ken Raeburn <raeburn@kr-laptop.cygnus.com> - - Fri Jun 16 18:35:40 1995 Pat Rankin (rankin@eql.caltech.edu) - - * xstrerror.c: New file. - * Makefile.in, vmsbuild.com: Compile it. - -Mon Jul 31 12:16:32 1995 steve chamberlain <sac@slash.cygnus.com> - - * config.table (i386-*-win32): New. - -Fri Jul 21 11:35:52 1995 Doug Evans <dje@canuck.cygnus.com> - - * Makefile.in (MULTITOP): New variable. - (MULTIDIRS, MULTISUBDIR, MULTIDO, MULTICLEAN): Likewise. - (all): Add multilib support. - (install_to_tooldir, *clean): Likewise. - -Mon Jul 10 11:47:27 1995 Ken Raeburn <raeburn@cygnus.com> - - * makefile.dos (OBJS): Add hex.o. From DJ Delorie. - -Fri Jun 30 17:28:59 1995 Pat Rankin (rankin@eql.caltech.edu) - - * vmsbuild.com: create "new-lib.olb", build libiberty under that - name, and then make it become "liberty.olb" when done, so that an - incomplete build attempt never leaves behind something which looks - like a complete library. - -Thu Jun 29 00:22:02 1995 Steve Chamberlain <sac@slash.cygnus.com> - - * config/mh-i386pe: New file for PE hosts. - * config.table: Understand PE hosts. - -Wed Jun 28 19:13:23 1995 Jason Merrill <jason@phydeaux.cygnus.com> - - * cplus-dem.c: Update from gcc. - - * argv.c, dummy.c: If __STDC__, #include "alloca-conf.h" after - <stddef.h>. - * alloca-norm.h: If __STDC__, declare alloca with its parameter. - -Thu Jun 22 18:57:47 1995 Stan Shebs <shebs@andros.cygnus.com> - - * mpw-make.in (ALL_CFLAGS): Define NEED_basename. - * mpw.c: Only test DebugPI once whenever printing debug info. - (mpwify_filename): If filename is /tmp/foo, change it into :_foo, - also fix to not write on input filename buffer. - (mpw_access): Use stat() instead of open(), works for directories - as well as files. - -Mon Jun 19 00:33:22 1995 Jason Merrill <jason@phydeaux.cygnus.com> - - * Makefile.in: Massage broken shells that require 'else true'. - -Sat Jun 17 23:21:58 1995 Fred Fish <fnf@cygnus.com> - - * alloca-norm.h: Declare alloca as type "PTR" to match functions.def. - Declare __builtin_alloca in the sparc case, as argv.c did. - * argv.c: Replace inline version of alloca-norm.h at start of file with - a #include of alloca-conf.h. Precede it with an include of ansidecl.h - because alloca-norm.h needs to declare alloca as "PTR". - -Mon Jun 12 14:24:26 1995 Steve Chamberlain <sac@slash.cygnus.com> - - * win32.c: New file. - -Fri Jun 9 15:16:14 1995 Jason Merrill <jason@phydeaux.cygnus.com> - - * dummy.c: #include "alloca-conf.h". - -Wed Jun 7 11:46:23 1995 Jason Merrill <jason@phydeaux.cygnus.com> - - * Makefile.in (mostlyclean): Remove stamp-picdir. - (clean): Don't. - -Mon Jun 5 18:46:06 1995 Jason Merrill <jason@phydeaux.cygnus.com> - - * config.table (frags): Use toplevel pic frags. - - * Makefile.in (PICFLAG): New macro. - (all): Depend on stamp-picdir. - (needed-list): Ditto. - (.c.o): Also build pic object. - (stamp-picdir): New rule. - (mostlyclean): Remove pic. - (clean): Remove stamp-picdir. - -Fri Mar 24 16:55:48 1995 Pat Rankin (rankin@eql.caltech.edu) - - * vmsbuild.com (config.h): Add `#define NEED_basename'. - -Tue May 23 10:12:46 1995 Per Bothner <bothner@kalessin.cygnus.com> - - * clock.c, getopt.c, strtod.c, vsprintf.c: Change from using LGPL - to libio-style copyright. - * getpagesize.c: Remove FSF copyright. - -Sat May 20 12:30:23 1995 Ken Raeburn <raeburn@kr-laptop.cygnus.com> - - Added improved VMS support from Pat Rankin: - - Fri Mar 17 18:40:36 1995 Pat Rankin (rankin@eql.caltech.edu) - - * vmsbuild.com: new file. - - * getpagesize.c (getpagesize): implement for VMS; - * strerror.c (strerror, strerrno, strtoerrno): add rudimentary - support for EVMSERR. - -Thu May 18 17:01:42 1995 Ken Raeburn <raeburn@kr-laptop.cygnus.com> - - Wed May 10 14:28:16 1995 Richard Earnshaw (rearnsha@armltd.co.uk) - - * floatformat.c (floatformat_arm_ext): Define. - -Tue May 16 13:30:59 1995 Per Bothner <bothner@kalessin.cygnus.com> - - * basename.c, bcmp.c, getcwd.c, insque.c, rename.c, sigsetmask.c, - strerror.c, strsignal.c: Remove FSF copyright. - * sigsetmask.c: #include <sys/types.h> - seems to be needed by ISC. - -Mon May 15 19:53:17 1995 Per Bothner <bothner@kalessin.cygnus.com> - - * bcopy.c, bzero.c, memcmp.c, memcpy.c, memset.c, strchr.c, - strrchr.c, strstr.c, vfork.c: Remove FSF Copyright, because this - might contaminate libstdc++ with the LGPL. (OK'd by RMS 11 Oct 94.) - * strchr.c, strrchr.c: Add cast to suppress const warning. - -Thu May 4 14:36:42 1995 Jason Merrill <jason@phydeaux.cygnus.com> - - * cplus-dem.c: Use const instead of CONST. Don't include - ansidecl.h directly. - -Wed Apr 19 01:30:27 1995 Jason Merrill <jason@phydeaux.cygnus.com> - - * cplus-dem.c: Don't include libiberty.h. Do declare xmalloc and - xrealloc. - (-DMAIN): Don't rely on an externally-defined version number; - instead, require the version number to be defined as a - preprocessor macro. Handle the RS/6000 leading dot. Define - xmalloc, xrealloc and fatal. Don't strip a leading underscore - if we couldn't demangle the word. - -Tue Apr 4 13:03:51 1995 Stan Shebs <shebs@andros.cygnus.com> - - (Old mpw.c change descriptions retained for informational value.) - * mpw.c (warning_threshold): Default to .4 sec. - (overflow_count, current_progress): New globals. - (warn_if_spin_delay): Include current progress type, - such as program name, in message. - (mpw_start_progress): Set current_progress variable from arg. - (mpw_end_progress): Report spin delays by power-of-two-size - buckets instead of constant-size buckets. - - * mpw.c: Clean up formatting, types, returns, etc. - (ENOSYS): Define. - (mpw_fread, mpw_fwrite): Define. - (sleep): Define correctly. - - * mpw.c: New code to implement cursor spinning support. - (umask): New function. - (mpw_fopen, mpw_fseek, stat, fstat): Call PROGRESS. - - * mpw.c (mpw_basename, mpw_mixed_basename): New functions, find - basenames for MPW and MPW/Unix filenames. - (mpw_special_init): New function, calls Macsbug if desired. - - * mpw.c: Add GPL notice. - (mpwify_filename): Add more transformations. - (mpw_fopen): Call mpwify_filename on file names. - (rename): Remove. - (chdir, getcwd): Add simple definitions. - - * mpw.c: Random cleanups, remove unused code bits. - Added copy of strerror.c for gcc's use. - (stat, fstat, _stat): New versions based on Guido van Rossum code. - - * mpw.c (mpw_fseek): Make it work correctly when doing SEEK_CUR. - - * mpw.c (stat): Remove hack definition, get from sys/stat.h. - (fork, vfork, etc): Print error messages if called. - (getrusage, sbrk, environ, isatty, link, utime, mkdir, rmdir, - rename, chown): Define. - - * mpw-config.in: New file, MPW version of configure.in. - * mpw-make.in: New file, MPW version of Makefile.in. - * mpw.c: New file, MPW compatibility routines. - -Fri Mar 24 14:10:30 1995 Jim Kingdon (kingdon@lioth.cygnus.com) - - * basename.c: Include config.h before checking for NEED_basename. - -Thu Mar 23 19:09:54 1995 Jason Merrill <jason@phydeaux.cygnus.com> - - * functions.def: Add DEFFUNC for basename. - - * basename.c: Only define basename if NEED_basename. - -Thu Mar 16 13:36:05 1995 Jason Merrill <jason@phydeaux.cygnus.com> - - * config.table: Fix --enable-shared logic for native builds. - -Mon Mar 13 11:05:11 1995 Jason Merrill <jason@phydeaux.cygnus.com> - - * cplus-dem.c (demangle_template): Demangle bool literals properly. - -Mon Mar 6 23:57:28 1995 Stu Grossman (grossman@cygnus.com) - - * strtol.c strtoul.c: Replace these with less buggy versions from - NetBSD. (strtoul in particular couldn't handle base 16.) - -Wed Mar 1 15:59:01 1995 Ian Lance Taylor <ian@cygnus.com> - - * config/mt-vxworks5 (HDEFINES): Define NO_SYS_PARAM_H. - - * clock.c: If NO_SYS_PARAM_H is defined, don't include - <sys/param.h>. - * getcwd.c, getpagesize.c, getruntime.c: Likewise. - -Fri Feb 17 15:40:55 1995 Ian Lance Taylor <ian@cygnus.com> - - * getruntime.c (get_run_time): Don't assume that CLOCKS_PER_SEC is - a number; ANSI appears to permit any expression, including a - function call. - - * config.table (*-*-vxworks5*): Use mt-vxworks5 when configuring - xiberty. - * config/mt-vxworks5: New file. - -Thu Feb 9 14:19:45 1995 Ian Lance Taylor <ian@cygnus.com> - - * basename.c (basename): Change argument to be const. - -Wed Feb 8 18:06:52 1995 Jason Merrill <jason@phydeaux.cygnus.com> - - * Makefile.in (lneeded-list): Don't worry about xmalloc. - -Sun Jan 15 00:40:36 1995 Jeff Law (law@snake.cs.utah.edu) - - * Makefile.in (distclean): Delete xhost-mkfrag. - -Thu Jan 12 16:54:18 1995 Jason Merrill <jason@phydeaux.cygnus.com> - - * Makefile.in (lneeded-list): If alloca.o is needed, so is xmalloc.o. - -Wed Jan 11 22:39:56 1995 Ken Raeburn <raeburn@cujo.cygnus.com> - - * hex.c: New file. - * Makefile.in (REQUIRED_OFILES, CFILES): List it. - (hex.o): Add dependencies. - - * cplus-dem.c (demangle_prefix): For GNU style constructor and - destructor names, try demangling the remainder of the string. - -Wed Dec 28 00:49:15 1994 Ian Lance Taylor <ian@tweedledumb.cygnus.com> - - * vasprintf.c (int_vasprintf): New static function. - (vasprintf): Use int_vasprintf. Removes assumption that va_list - is assignment compatible. - -Sat Nov 5 19:29:12 1994 Jason Merrill (jason@phydeaux.cygnus.com) - - * Makefile.in (LIBCFLAGS): New variable. - (FLAGS_TO_PASS): Pass it. - (.c.o): Use it. - -Thu Nov 3 19:09:47 1994 Ken Raeburn <raeburn@cujo.cygnus.com> - - * getopt.c, getopt1.c: Do compile these functions under Linux, - since many native versions are based on glibc but are buggy. - -Mon Oct 24 15:16:46 1994 Per Bothner <bothner@kalessin.cygnus.com> - - * vasprintf.c: Make 'format' arg be const, to avoid a mismatch - with prototype in GNU libc. Support stdarg.h as well as varargs.h. - -Tue Oct 11 17:48:27 1994 Jason Merrill (jason@phydeaux.cygnus.com) - - * Makefile.in (REQUIRED_OFILES): Add vasprintf.o. - * functions.def: Remove vasprintf. - -Wed Sep 14 17:04:55 1994 Ian Lance Taylor (ian@sanguine.cygnus.com) - - * xmalloc.c (first_break): New static variable. - (xmalloc_set_program_name): Record sbrk (0) in first_break. - (xmalloc): If memory allocation fails, try to report how much - memory was allocated by the program up to this point. - (xrealloc): Likewise. - -Sun Sep 04 17:58:10 1994 Richard Earnshaw (rwe@pegasus.esprit.ec.org) - - * Makefile.in (ERRORS_CC): New variable, defaulted to $(CC). Use it - when linking dummy. - * config.table: Add host RISCiX Makefile frag. - * config/mh-riscix: New file. - -Thu Aug 25 17:29:44 1994 Ian Lance Taylor (ian@sanguine.cygnus.com) - - * Makefile.in (FLAGS_TO_PASS): Define. - ($(RULE1)): Use $(FLAGS_TO_PASS). - -Wed Aug 24 17:08:47 1994 Ian Lance Taylor (ian@sanguine.cygnus.com) - - * vasprintf.c: Include <string.h>. - (vasprintf): Add casts to void for va_arg to avoid gcc warnings. - * xatexit.c: Declare malloc. - -Fri Aug 19 15:29:12 1994 Kung Hsu (kung@mexican.cygnus.com) - - * cplus-dem.c (demangle_args): Fix a bug in previous patch (the - one below). - -Thu Aug 18 14:37:14 1994 Kung Hsu (kung@mexican.cygnus.com) - - * cplus-dem.c (demangle args): Handle ARM repeat encoding where - the type index is greater than 9. - -Wed Aug 17 16:13:49 1994 Kung Hsu (kung@mexican.cygnus.com) - - * cplus-dem.c (demangle_qualified): accept optional '_' between - qualified name. This is baecause the template name may end with - numeric and can mixed up with the length of next qualified name. - -Wed Aug 3 05:52:14 1994 D. V. Henkel-Wallace (gumby@cygnus.com) - - * config/mt-sunos4: Use our standard location for cross-includes - and cross-libs when the target is also a "host" environment (ie no - newlib; includes and such don't belong to us). This is specific - to the Cygnus Support environment. - -Tue Aug 2 15:25:12 1994 Kung Hsu (kung@mexican.cygnus.com) - - * cplus-dem.c (demangle_template): demangle as xxx<'Q'> not - xxx<ch=81>. - -Mon Aug 1 17:02:48 1994 Kung Hsu (kung@mexican.cygnus.com) - - * cplus-dem.c (main): flush stdout to make pipe work. - -Sat Jul 16 12:56:32 1994 Stan Shebs (shebs@andros.cygnus.com) - - * config.table (*-*-cxux7*): Recognize. - * floatformat.c (floatformat_m88110_ext) [HARRIS_FLOAT_FORMAT]: - Harris-specific float format. - * config/mh-cxux7: New file. - -Wed Jun 29 00:26:17 1994 Peter Schauer (pes@regent.e-technik.tu-muenchen.de) - - * cplus-dem.c (demangle_template): Make sure that the result of - consume_count doesn't index beyond the end of the string. - -Mon Jun 20 23:54:37 1994 Peter Schauer (pes@regent.e-technik.tu-muenchen.de) - - * cplus-dem.c (gnu_special): Handle vtable mangling of gcc-2.4.5 and - earlier. Improve test for new vtable mangling. Change output back - to `virtual table'. - -Mon Jun 20 11:37:30 1994 Ian Lance Taylor (ian@sanguine.cygnus.com) - - * obstack.c: Always compile this code, even if using the GNU - library. Avoids problems with relatively recent binary - incompatibility. - -Thu Jun 16 17:54:01 1994 Ian Lance Taylor (ian@tweedledumb.cygnus.com) - - * cplus-dem.c: Include libiberty.h. - (xmalloc, xrealloc, free): Don't declare. - (strstr): Don't declare parameters. - (xmalloc, xrealloc): Don't define. - (long_options): Add no-strip-underscores. - (main): Call xmalloc_set_program_name. Pass n in short options to - getopt_long. Handle option 'n' to not strip underscores. - (usage): Mention -n and --no-strip-underscores. - -Sun Jun 12 01:37:09 1994 Jason Merrill (jason@deneb.cygnus.com) - - * cplus-dem.c (demangle_template): Separate consecutive >'s with a - space. - (gnu_special): Demangle template and qualified names in a vtable name. - -Fri May 27 12:27:52 1994 Ken Raeburn (raeburn@cujo.cygnus.com) - - From gas-2.3 and binutils-2.4 net releases: - - Wed May 11 22:32:00 1994 DJ Delorie (dj@ctron.com) - - * makefile.dos: [new] Makefile for dos/go32 - * configure.bat: update for latest files - * msdos.c: remove some functions now in libc.a - -Fri May 20 18:53:32 1994 Per Bothner (bothner@kalessin.cygnus.com) - - * cplus-dem.c (gnu_special): Recognize thunks, as well as - the new naming style for vtables (when -fvtable-thunks). - -Wed May 18 13:34:06 1994 Ian Lance Taylor (ian@tweedledumb.cygnus.com) - - * Makefile.in (XTRAFLAGS): Don't define. - (.c.o, dummy.o): Don't use XTRAFLAGS. - ($(RULE1)): Don't pass XTRAFLAGS down in recursive call. - -Fri May 13 16:02:12 1994 Jim Kingdon (kingdon@lioth.cygnus.com) - - * vasprintf.c: New file. - * Makefile.in, functions.def: Add it. - -Fri May 13 16:20:28 1994 Jason Merrill (jason@deneb.cygnus.com) - - * cplus-dem.c (demangle_fund_type): Grok bool. - -Fri May 6 14:44:21 1994 Steve Chamberlain (sac@cygnus.com) - - * config.table: Add go32 - * config/mh-go32: New template. - -Fri May 6 11:01:59 1994 D. V. Henkel-Wallace (gumby@rtl.cygnus.com) - - * config.table, config/mt-sunos4: config for when sun4 is cross target. - -Mon Apr 11 00:54:33 1994 Richard Stallman (rms@mole.gnu.ai.mit.edu) - - * getopt.c [not __GNU_LIBRARY__] [__GCC__] [not __STDC__]: - Declare strlen to return int. Don't include stddef.h. - -Fri Apr 1 00:38:17 1994 Jim Wilson (wilson@mole.gnu.ai.mit.edu) - - * getopt.c: Delete use of IN_GCC to control whether - stddef.h or gstddef.h is included. - -Thu Apr 14 14:00:56 1994 Kung Hsu (kung@mexican.cygnus.com) - - * cplus-dem.c (demangle_signature): Fix a bug in template function - type numbering. - -Wed Apr 13 17:23:03 1994 Kung Hsu (kung@mexican.cygnus.com) - - * cplus-dem.c (demangle_signature): Fix template function with arm - style argument type number, Tn. - -Wed Apr 13 17:11:15 1994 Jason Merrill (jason@deneb.cygnus.com) - - * cplus-dem.c (optable): Add new[] and delete[]. - -Fri Apr 8 11:21:42 1994 Jim Kingdon (kingdon@deneb.cygnus.com) - - * argv.c (buildargv): Don't produce empty argument just because - there is trailing whitespace. - -Wed Apr 6 11:42:14 1994 Kung Hsu (kung@mexican.cygnus.com) - - * cplus-dem.c (demangle_template): fix 'Q' qualified name bug. - Handle 'p' same as 'P'. - * cplus-dem.c (do_type): Handle 'p' same as 'P'. - -Sat Mar 26 12:00:13 1994 Peter Schauer (pes@regent.e-technik.tu-muenchen.de) - - * floatformat.c (get_field, put_field): Fix off by one error in - little endian case. - -Thu Mar 24 10:40:19 1994 Jim Kingdon (kingdon@lioth.cygnus.com) - - * floatformat.c (floatformat_from_double): Pass unsigned char *, - not char *, to put_field. - -Fri Mar 18 12:34:33 1994 Per Bothner (bothner@kalessin.cygnus.com) - - * memmove.c: Re-wrote; placed in public domain. - -Wed Mar 16 10:33:07 1994 Jim Kingdon (kingdon@lioth.cygnus.com) - - * cplus-dem.c (demangle_prefix): If ARM demangling, don't treat - __Q* as a constructor. - -Mon Mar 14 12:26:02 1994 Ian Lance Taylor (ian@cygnus.com) - - * ieee-float.c: Removed; no longer used. - * Makefile.in: Changed accordingly. - -Mon Mar 7 12:28:17 1994 Ian Lance Taylor (ian@tweedledumb.cygnus.com) - - * floatformat.c (get_field): Removed unused local variable i. - (put_field): Removed unused local variable i. - -Sun Feb 27 21:50:11 1994 Jim Kingdon (kingdon@deneb.cygnus.com) - - * floatformat.c: New file, intended to replace ieee-float.c. - * Makefile.in: Change accordingly. - -Thu Feb 24 11:51:12 1994 David J. Mackenzie (djm@rtl.cygnus.com) - - * getopt.c: Remove #ifdef GETOPT_COMPAT and #if 0 code. - (_getopt_initialize): New function, broken out of _getopt_internal. - (_getopt_internal): - If long_only and the ARGV-element has the form "-f", where f is - a valid short option, don't consider it an abbreviated form of - a long option that starts with f. Otherwise there would be no - way to give the -f short option. - -Thu Feb 10 14:44:16 1994 Richard Stallman (rms@mole.gnu.ai.mit.edu) - - * getopt.c [not __GNU_LIBRARY__] [__GNUC__] [not IN_GCC]: - Test just __STDC__, not emacs. - -Wed Feb 9 00:14:00 1994 Richard Stallman (rms@mole.gnu.ai.mit.edu) - - * getopt.c [not __GNU_LIBRARY__] [__GNUC__] [not IN_GCC] - [emacs] [not __STDC__]: Don't include stddef.h. Don't declare strlen. - -Fri Dec 24 19:43:00 1993 Noah Friedman (friedman@nutrimat.gnu.ai.mit.edu) - - * getopt.c (_NO_PROTO): Define before config.h is included. - -Mon Sep 20 15:59:03 1993 Roland McGrath (roland@churchy.gnu.ai.mit.edu) - - * getopt.c, getopt1.c [emacs || CONFIG_BROKETS]: Include - <config.h> only under these, else "config.h". - -Thu Aug 12 18:16:49 1993 Roland McGrath (roland@churchy.gnu.ai.mit.edu) - - * getopt.c, getopt1.c [HAVE_CONFIG_H]: Include - <config.h> instead of "config.h". - -Sun Feb 20 17:17:01 1994 Ian Lance Taylor (ian@lisa.cygnus.com) - - * concat.c: Check ANSI_PROTOTYPES rather than __STDC__ to decide - whether to use prototypes or not. - * strerror.c (const): Never undefine; let ansidecl.h handle it. - * strsignal.c (const): Likewise. - -Thu Feb 17 13:27:35 1994 Ian Lance Taylor (ian@tweedledumb.cygnus.com) - - * xatexit.c (_xexit_cleanup): Declare as extern; don't initialize. - Merging common and initialized variables need not be supported by - ANSI C compilers. - (xatexit): Initialize _xexit_cleanup if not already set. - * xexit.c: Comment fix. - -Wed Feb 16 01:15:36 1994 Ian Lance Taylor (ian@tweedledumb.cygnus.com) - - * xmalloc.c: Don't declare xexit; it's declared in libiberty.h. - (xrealloc): If oldmem is NULL, allocate with malloc, rather than - assuming that realloc works correctly. - -Tue Feb 15 09:26:16 1994 Peter Schauer (pes@regent.e-technik.tu-muenchen.de) - - * concat.c, ieee-float.c: Replace inclusion of <string.h> - with explicit function declarations, as recommended by Ian Taylor. - -Sat Feb 12 10:31:11 1994 David J. Mackenzie (djm@rtl.cygnus.com) - - * xmalloc.c (xmalloc, xrealloc): Use PTR and size_t throughout. - (malloc, realloc): Declare. - -Thu Feb 10 17:08:19 1994 Ian Lance Taylor (ian@tweedledumb.cygnus.com) - - * argv.c, basename.c: Include ansidecl.h and libiberty.h. - * concat.c, fdmatch.c, getruntime.c, spaces.c: Likewise. - * strerror.c, strsignal.c, xatexit.c, xexit.c: Likewise. - * xmalloc.c: Likewise. - * concat.c: Don't declare xmalloc. If __STDC__, use <stdarg.h> - macros, not <varargs.h> macros. - * spaces.c (spaces): Make return type const. Don't crash if - malloc returns NULL. - * strerror.c (struct error_info): Make name and msg fields const. - (error_names): Make const. - (strerrno): Make const. - (strtoerrno): Make argument const. - * strsignal.c (struct signal_info): Make name and msg fields - const. - (signal_names, sys_siglist): Make const. - (strsignal, strsigno): Make const. - (strtosigno): Make argument const. - * xatexit.c: Declare parameter types. - * xmalloc.c (name): Make const. - (xmalloc_set_program_name): Make argument const. - * Makefile.in (INCDIR): Define. - (.c.o): Use $(INCDIR). - (dummy.o): Likewise. - (argv.o, basename.o): New targets; depend on libiberty.h. - (concat.o, fdmatch.o, getruntime.o, spaces.o): Likewise. - (strerror.o, strsignal.o, xatexit.o, xexit.o): Likewise. - (xmalloc.o): Likewise. - (cplus-dem.o): New target; depend on demangle.h. - (getopt.o, getopt1.o): New targets; depend on getopt.h. - (ieee-float.o): New target; depend on ieee-float.h. - (obstack.o): New target; depend on obstack.h. - -Tue Feb 8 05:29:08 1994 David J. Mackenzie (djm@thepub.cygnus.com) - - Handle obstack_chunk_alloc returning NULL. This allows - obstacks to be used by libraries, without forcing them - to call exit or longjmp. - * obstack.c (_obstack_begin, _obstack_begin_1, _obstack_newchunk): - If CALL_CHUNKFUN returns NULL, set alloc_failed, else clear it. - (_obstack_begin, _obstack_begin_1): Return 1 if successful, 0 if not. - -Tue Feb 8 00:32:28 1994 Peter Schauer (pes@regent.e-technik.tu-muenchen.de) - - * concat.c, ieee-float.c: Include <string.h>. - -Sun Feb 6 21:28:46 1994 David J. Mackenzie (djm@thepub.cygnus.com) - - * xmalloc.c (xmalloc_set_program_name): New function. - (xmalloc, xrealloc): Include the name in the error message, if set. - - * Replace atexit.c with xatexit.c. - * Makefile.in (CFILES), functions.def: Change references. - -Sat Feb 5 14:02:32 1994 Stan Shebs (shebs@andros.cygnus.com) - - * getruntime.c (get_run_time): Use getrusage or times if - HAVE_GETRUSAGE or HAVE_TIMES are defined. - -Fri Feb 4 15:49:38 1994 David J. Mackenzie (djm@thepub.cygnus.com) - - * atexit.c: New file. - * Makefile.in (CFILES), functions.def: Add it. - * xexit.c: New file. - * Makefile.in (CFILES, REQUIRED_OFILES): Add it. - * xmalloc.c (xmalloc, xrealloc): Call xexit instead of exit. - Change request for 0 bytes into request for 1 byte. - -Wed Feb 2 11:36:49 1994 Ian Lance Taylor (ian@tweedledumb.cygnus.com) - - * xmalloc.c (xmalloc, xrealloc): Print size using %lu, and cast to - unsigned long, to avoid warnings. - -Fri Jan 28 17:49:06 1994 Ken Raeburn (raeburn@cujo.cygnus.com) - - * dummy.c: Don't include time.h ever; always define clock_t as - "unsigned long". Until gcc/fixincludes ensures that clock_t - exists, __STDC__ isn't a sufficient test. And if clock() doesn't - exist, clock_t probably doesn't either. - -Mon Jan 24 11:52:31 1994 Stan Shebs (shebs@andros.cygnus.com) - - * clock.c, getruntime.c: New files. - * Makefile.in: Add to file lists. - * functions.def (clock): Add to list. - * dummy.c (time.h): Add if __STDC__. - (clock_t): #define as "unsigned long" if not __STDC__. - -Tue Jan 11 11:27:44 1994 Ian Lance Taylor (ian@tweedledumb.cygnus.com) - - * strtod.c: Declare atof. From edler@jan.ultra.nyu.edu (Jan - Edler). - -Tue Dec 28 14:17:30 1993 Ian Lance Taylor (ian@tweedledumb.cygnus.com) - - * Makefile.in (errors): Use CFLAGS as well as LDFLAGS when - linking. - -Fri Dec 17 12:26:07 1993 Kung Hsu (kung@cirdan.cygnus.com) - - * cplus-dem.c (demangle_arm_pt): New function. Common code - for ARM template demangling. - * cplus-dem.c (demangle_class_name): Use demangle_arm_pt. - * cplus-dem.c (demangle_prefix): Likewise. - -Tue Nov 30 15:47:48 1993 Jason Merrill (jason@deneb.cygnus.com) - - * cplus-dem.c (cplus_demangle_opname): Add CONST to please gcc. - -Sat Nov 27 11:05:50 1993 Fred Fish (fnf@cygnus.com) - - Merge changes from tom@basil.icce.rug.nl (Tom R.Hageman) - * strerror.c, strsignal.c: As a small space optimization, don't - include messages when they aren't actually used. - - Merge changes from takefive.co.at!joe (Josef Leherbauer) - * cplus-dem.c (demangle_prefix, demangle_function_name, - cplus_demangle_opname): Fixes for systems where cplus_marker - is something other than '$'. - -Fri Nov 26 13:51:11 1993 Per Bothner (bothner@kalessin.cygnus.com) - - * waitpid.c: Simple-minded approcimation to waitpid - using vanilla wait. - * functions.def, Makefile.in: Update accordingly, - -Thu Nov 18 18:01:15 1993 Kung Hsu (kung@cirdan.cygnus.com) - - * cplus-dem.c(demangle_template): fix bug template instantiation - with value of user defined type. - -Wed Nov 17 18:30:21 1993 Kung Hsu (kung@cirdan.cygnus.com) - - * cplus-dem.c(cplus_demangle_opname): add the subject new function - to support unified search of operator in class. - -Wed Nov 10 09:47:22 1993 Jim Kingdon (kingdon@lioth.cygnus.com) - - gcc -Wall lint: - * strtoul.c (strtoul): use "(digit = *s) != '\0'" not just - "digit = *s" as condition in while loop. - -Tue Nov 9 15:52:22 1993 Mark Eichin (eichin@cygnus.com) - - * Makefile.in: pass SHELL to recursive make - -Thu Nov 4 12:09:26 1993 Per Bothner (bothner@kalessin.cygnus.com) - - * vfprintf.c, vprintf.c, vsprintf.c: Make format arg - be (const char*), for ANSI (and gcc w/fixproto) consistency. - -Thu Nov 4 08:29:04 1993 Jim Kingdon (kingdon@lioth.cygnus.com) - - * config.table: Make *-*-hiux* use mh-hpux. - -Fri Oct 22 07:53:15 1993 Jim Kingdon (kingdon@lioth.cygnus.com) - - * config.table: Add * to end of all OS names. - -Tue Oct 19 17:12:01 1993 david d `zoo' zuhn (zoo@rtl.cygnus.com) - - * Makefile.in (lneeded-list): ensure that object file names are - not duplicated, as multiple instances of the same object file in - a library causes problems on some machines - -Mon Oct 18 21:59:28 1993 Jim Kingdon (kingdon@lioth.cygnus.com) - - * strcasecmp.c, strncasecmp.c: Change u_char to unsigned char. - -Fri Oct 15 22:17:11 1993 david d `zoo' zuhn (zoo@rtl.cygnus.com) - - * strncasecmp.c: new file, implements strncasecmp - * strcasecmp.c: new file, implement strcasecmp - - * Makefile.in (CFILES): list these two new source files - - * functions.def: add strcasecmp and strncasecmp entries - -Fri Oct 15 14:53:05 1993 Ian Lance Taylor (ian@tweedledumb.cygnus.com) - - * strtoul.c (strtoul), strtol.c (strtol): Handle overflow - according to ANSI C. - -Thu Oct 14 16:34:19 1993 Kung Hsu (kung@cirdan.cygnus.com) - - * cplus-dem.c: add support of ARM global constructor/destructor, - and 'G' for passing record or union in parameter. - -Wed Oct 13 13:36:19 1993 Jim Kingdon (kingdon@lioth.cygnus.com) - - * Makefile.in: Fix comment to clarify that stuff in REQUIRED_OFILES - should not be in functions.def. - -Wed Oct 13 13:13:38 1993 Ian Lance Taylor (ian@tweedledumb.cygnus.com) - - * functions.def: Removed xmalloc. Stuff in REQUIRED_OFILES should - not be in functions.def. - -Mon Oct 4 18:26:39 1993 Kung Hsu (kung@cirdan.cygnus.com) - - * cplus-dem.c: change globl constructor/destructor to proper name - -Tue Sep 28 18:11:07 1993 Kung Hsu (kung@cirdan.cygnus.com) - - * cplus-dem.c: fix bug in constructor/destructor - -Tue Sep 28 16:20:49 1993 Kung Hsu (kung@cirdan.cygnus.com) - - * cplus-dem.c: support both old and new _vt$... vtbl mangled names - -Fri Sep 24 19:07:16 1993 Jason Merrill (jason@deneb.cygnus.com) - - * cplus-dem.c: Fix demangle_template prototype - -Fri Sep 24 17:32:55 1993 Kung Hsu (kung@cirdan.cygnus.com) - - * cplus-dem.c: fix template demangling - * cplus-dem.c: fix const type demangling - * cplus-dem.c: fix constructor/destructor, virtual table, - qualifier, global constructor/destructor demangling - -Wed Sep 1 23:13:11 1993 Jim Kingdon (kingdon@lioth.cygnus.com) - - * strsignal.c, strerror.c: Use fully-bracketed initializer to - keep gcc -Wall happy. - -Fri Aug 27 10:30:09 1993 Jason Merrill (jason@deneb.cygnus.com) - - * cplus-dem.c (do_type): Add CONSTS to make gcc happy with last - patch. - -Fri Aug 27 11:24:54 1993 Jim Kingdon (kingdon@lioth.cygnus.com) - - Patch from Paul Flinders: - * cplus-dem.c (do_type): Deal with arrays. - -Tue Aug 24 14:23:50 1993 Jim Kingdon (kingdon@lioth.cygnus.com) - - * cplus-dem.c (demangle_qualified: Deal with GNU format for more - than 9 classes. - -Wed Aug 18 19:50:29 1993 Jason Merrill (jason@deneb.cygnus.com) - - * Makefile.in (dummy.o): Redirect to /dev/null to avoid "variable - not initialized" warnings under HP/UX - -Sun Aug 15 20:42:40 1993 Jim Kingdon (kingdon@lioth.cygnus.com) - - * strerror.c: Move include of stdio.h after sys_errlist #define. - Also remove NULL definition (stdio.h always defines NULL, so it - never did anything but clutter up the code). - -Sat Aug 14 14:21:49 1993 david d `zoo' zuhn (zoo@rtl.cygnus.com) - - * Makefile.in, functions.def: handle xmalloc.c - - * xmalloc.c: provide xmalloc and xrealloc functions - -Thu Aug 12 17:38:57 1993 David J. Mackenzie (djm@thepub.cygnus.com) - - * cplus-dem.c: Fix a comment. - -Sat Aug 7 13:56:35 1993 David J. Mackenzie (djm@thepub.cygnus.com) - - * getopt1.c: Declare const the way getopt.c does. - -Fri Aug 6 17:03:13 1993 David J. Mackenzie (djm@thepub.cygnus.com) - - * obstack.c, alloca.c: Update from FSF. - * getopt.c, getopt1.c: Update to current FSF version, which - doesn't use alloca. - -Tue Jul 27 14:03:57 1993 Brendan Kehoe (brendan@lisa.cygnus.com) - - * Makefile.in (demangle): Add the target with a message saying - where demangle went. - -Mon Jul 26 15:49:54 1993 Jim Kingdon (kingdon@lioth.cygnus.com) - - * Makefile.in: Remove obsolete `demangle' target. - -Thu Jul 22 08:31:01 1993 Fred Fish (fnf@deneb.cygnus.com) - - * cplus-dem.c (arm_special): Apply patch from arg@lucid.com to - avoid infinite loop on vtbl symbols with disambiguating "junk" - tacked on the end. - -Mon Jul 19 14:10:37 1993 david d `zoo' zuhn (zoo@rtl.cygnus.com) - - * strsignal.c: work around some systems losing definitions of - sys_siglist - - * config/mh-lynxos: this system has a losing definition of - sys_siglist - - * config.table: use mh-lynxos for *-*-lynxos - -Mon Jul 19 17:08:52 1993 Ken Raeburn (raeburn@rtl.cygnus.com) - - * config.table: Add support for HPPA BSD hosts. - - * config/mh-hpbsd: New file. - -Mon Jul 12 18:00:40 1993 K. Richard Pixley (rich@cygnus.com) - - * Makefile.in (TAGS): make work when srcdir != objdir. - -Sun Jun 27 15:35:31 1993 David J. Mackenzie (djm@thepub.cygnus.com) - - * cplus-dem.c (main): Add long options, including --help and - --version. - (usage): New function from code in main. - -Tue Jun 22 11:37:38 1993 Per Bothner (bothner@deneb.cygnus.com) - - * config.table: New shell scipt, sourced by both ./configure,in - and ../xiberty/configure.in, to avoid maintainance lossages. - * configure.in and ../xiberty/configure.in: Use config.table. - - * configure.in: Don't use mh-aix for AIX 3.2, only for 3.1. - * configure.in: Map *-*-irix* (except irix4) to mh-sysv. - * ../xiberty/configure.in: Update from ./configure.in. - -Tue Jun 15 17:05:31 1993 david d `zoo' zuhn (zoo at cirdan.cygnus.com) - - * Makefile.in: remove parentdir support - -Wed May 26 12:59:09 1993 Peter Schauer (pes@regent.e-technik.tu-muenchen.de) - - * cplus-dem.c (xrealloc): Match definition with prototype. - -Tue May 25 14:27:51 1993 Peter Schauer (pes@regent.e-technik.tu-muenchen.de) - - * cplus-dem.c (demangle_prefix): Demangle cfront - local variables as an extension to ARM demangling. - -Fri May 21 09:53:57 1993 Jim Kingdon (kingdon@lioth.cygnus.com) - - * ieee-float.c: Don't require pointers to double to be aligned. - -Tue May 18 17:12:10 1993 Fred Fish (fnf@cygnus.com) - - (merge changes from dlong@cse.ucsc.edu) - * cplus-dem.c (consume_count): Simplify. - * cplus-dem.c (arm_pt, demangle_class_name): New functions. - * cplus-dem.c (various): Calls to arm_pt, demangle_class_name. - - * cplus-dem.c (xmalloc, xrealloc, strstr): Make extern decls into - full prototypes. - * cplus-dem.c (free): Add prototype. - * cplus-dem.c (optable): Fully bracketize initializer. - -Fri May 14 17:13:05 1993 Per Bothner (bothner@cygnus.com) - - * cplus-dem.c: Whether initial underscores are stripped - depends on the external variable prepends_underscore - (which is generated by the binutils Makefile). - -Fri May 14 07:32:20 1993 Ken Raeburn (raeburn@deneb.cygnus.com) - - * cplus-dem.c (mop_up, arm_special): Remove some unused variables. - -Tue May 4 20:31:59 1993 Fred Fish (fnf@cygnus.com) - - * cplus-dem.c (consume_count): Return zero if arg does not - start with digit, and don't consume any input. - -Tue May 4 08:10:28 1993 Jim Kingdon (kingdon@cygnus.com) - - * Makefile.in (demangle): Use ${srcdir} not $^. - - * strtod.c: New file, needed at least for BSD 4.3. - -Sun May 2 11:30:42 1993 Fred Fish (fnf@cygnus.com) - - * strsignal.c (sys_siglist): For ANSI compilations, type is - "const char *const". Also remove conditionalization on __STDC__ - since const is defined away for non-ANSI. - -Wed Apr 28 19:29:55 1993 Ken Raeburn (raeburn@deneb.cygnus.com) - - * configure.in: Recognize *-*-hpux. - * config/mh-hpux: New file. - -Tue Apr 27 15:22:19 1993 Per Bothner (bothner@cygnus.com) - - * tmpnam.c: Added ANSI tmpnam() function. - * functions.def, Makefile.in: Update accordingly. - -Tue Apr 27 13:38:38 1993 Peter Schauer (pes@regent.e-technik.tu-muenchen.de) - - * cplus-dem.c (demangle_function_name): Get the demangling of - stop__1A right. - -Fri Apr 16 23:48:24 1993 Jim Kingdon (kingdon at calvin) - - * cplus-dem.c: Declare strstr return type. - -Fri Mar 26 12:01:26 1993 Jim Kingdon (kingdon@cygnus.com) - - * strsignal.c: Add some AIX signals. - -Thu Mar 25 15:17:23 1993 Ian Lance Taylor (ian@cygnus.com) - - * Makefile.in (MAKEOVERRIDES): Define to be empty. - -Wed Mar 24 01:59:25 1993 david d `zoo' zuhn (zoo at poseidon.cygnus.com) - - * Makefile.in: add installcheck & dvi targets - -Thu Mar 18 14:05:44 1993 Per Bothner (bothner@rtl.cygnus.com) - - * ieee-float.c: New file, moved from ../gdb (since it is - needed by ../opcode/m68k-dis.c). - -Tue Mar 2 17:47:31 1993 Fred Fish (fnf@cygnus.com) - - * cplus-dem.c: Replace all references to cfront with ARM. - -Fri Feb 26 00:17:07 1993 Per Bothner (bothner@rtl.cygnus.com) - - * cplus-dem.c: Fix main program (when compiled with -DMAIN) - to be more useful as a filter. - -Sat Feb 20 21:41:39 1993 Brendan Kehoe (brendan@lisa.cygnus.com) - - * Makefile.in (install_to_libdir, install_to_tooldir): Go into the - destination directory before running $(RANLIB), in case that - program tries to create a file in the current directory as part of - its work. - -Thu Feb 18 23:00:19 1993 John Gilmore (gnu@cygnus.com) - - * strsignal.c (sys_siglist): Remove yet another *%^&%&$# "const" - because BSD 4.4 lacks one. Isn't this fun? - -Thu Feb 18 11:24:25 1993 Fred Fish (fnf@cygnus.com) - - * cplus-dem.c (demangle_signature): Set func_done after - demangling a template. - * cplus-dem.c (demangle_template): Fix several small bugs - in demangling GNU style templates. - * cplus-dem.c (demangle_prefix): Fix for templates in GNU - style constructors. - * cplus-dem.c (gnu_special): Fix for templates in GNU style - static data members. - -Tue Feb 16 17:28:35 1993 Fred Fish (fnf@cygnus.com) - - * cplus-dem.c (demangle_signature): Modify to include type - modifiers like static and const in remembered types. - -Thu Feb 11 22:20:47 1993 Fred Fish (fnf@cygnus.com) - - * cplus-dem.c (demangled_qualified): Add new parameter that tells - whether to prepend or append the qualifiers. - * cplus-dem.c (string_prepends): Used now, remove #if 0. - * cplus-dem.c (demangle_signature): Call demangle_qualified - with prepending. - * cplus_dem.c (gnu_special): Recognize static data members that - use qualified names. - * cplus-dem.c (demangle_qualified): Accumulate qualifiers in a - temporary buffer and the prepend or append them to the result, - as specified by the new "append" flag. - * cplus-dem.c (do_type): Call demangled_qualified with - appending. - -Mon Dec 28 10:47:19 1992 Ken Raeburn (raeburn@cygnus.com) - - * strsignal.c (signal_table): Now const. - (init_signal_tables): Variable eip now points to const. - - * strerror.c (error_table): Now const. - (init_error_tables): Variable eip now points to const. - -Tue Dec 15 15:36:50 1992 Per Bothner (bothner@cygnus.com) - - * memchr.c (memchr): New (ANSI standard) function. - * Makefile.in, functions.def: Added memchr. - * Makefile.in (AR_FLAGS): Use rc instad of non-standard cq. - -Wed Dec 2 22:49:10 1992 david d `zoo' zuhn (zoo at cirdan.cygnus.com) - - * getopt.c: remove use of USG around <alloca.h>, which never meant - anything anyway - - * config/mh-{aix,apollo68,ncr3000,sysv,sysv4}: removed definitions - of USG and USGr4 - -Thu Nov 19 03:09:33 1992 Brendan Kehoe (brendan@lisa.cygnus.com) - - * cplus-dem.c (demangle_fund_type): Recognize `w', a wide character; - it's now a type according to the ANSI X3J16 working paper; output - "wchar_t" for it. - (demangle_template): Accept `w' as an integral type. - (xmalloc, xrealloc): Use `char *', not `PTR'. Cast calls to their - counterparts malloc and realloc to `char *'. - (main): Exit with a 0 status. - * Makefile.in (demangle): Don't expect the user to define - DEMANGLE, instead force to be cplus-dem.c. Look in $(srcdir)/../include - for demangle.h. Pass it any HDEFINES or XTRAFLAGS. - -Wed Nov 18 18:56:20 1992 John Gilmore (gnu@cygnus.com) - - * Makefile.in (AR_FLAGS): Avoid verbosity. - * config/mh-sysv4: Remove AR_FLAGS override, use INSTALL=cp, - replace USGr4 with HAVE_SYSCONF. - * config/mh-solaris: Remove; mh-sysv4 works now. - * getpagesize.c: Replace USGr4 with HAVE_SYSCONF. - * configure.in: Simplify host matching table, remove separate - solaris config file. - -Sun Nov 15 09:35:16 1992 Fred Fish (fnf@cygnus.com) - - * configure.in (i[34]86-*-solaris2*): Add, use mh-sysv4. - -Tue Nov 3 21:27:03 1992 Brendan Kehoe (brendan@cygnus.com) - - * cplus-dem.c (xmalloc, xrealloc): Add decls. - (remember_type): Don't cast xmalloc. - (string_need): Likewise; don't cast xrealloc either. - -Fri Oct 23 08:52:01 1992 Ian Lance Taylor (ian@cygnus.com) - - * Makefile.in, functions.defs, rename.c: added simple - implementation of rename, since some binutils programs use it. - -Thu Oct 15 15:18:22 1992 Per Bothner (bothner@cygnus.com) - - * strsignal.c: Add appropriate 'const' to sys_siglist - extern declaration (if __STDC__). (Needed for Linux.) - * strsignal.c (strsignal): Add cast to remove const-ness. - -Fri Oct 9 03:22:55 1992 John Gilmore (gnu@cygnus.com) - - * Makefile.in (needed.awk, needed2.awk): Remove erroneous \'s - before "'s, diagnosed by BSD 4.4 awk. - -Thu Oct 8 15:25:12 1992 Ian Lance Taylor (ian@cygnus.com) - - * Makefile.in: create config.h and needed-list through $(CONFIG_H) - and $(NEEDED_LIST), to give some hooks for xiberty. - -Thu Oct 1 23:31:42 1992 david d `zoo' zuhn (zoo at cirdan.cygnus.com) - - * configure.in: use cpu-vendor-triple instead of nested cases - -Wed Sep 30 11:26:59 1992 Per Bothner (bothner@rtl.cygnus.com) - - * Makefile.in, argv.c, basename.c, bcmp.c, bcopy.c, bzero.c, - concat.c, cplus-dem.c, fdmatch.c, getcwd.c, getopt.c, getopt1.c, - getpagesize.c, insque.c, memcmp.c, memcpy.c, memmove.c, memset.c, - obstack.c, sigsetmask.c, spaces.c, strchr.c, strerror.c, - strrchr.c, strsignal.c, strstr.c, vfork.c, vsprintf.c: - Convert from using GPL to LGPL. - -Sat Sep 26 04:01:30 1992 John Gilmore (gnu@cygnus.com) - - * Makefile.in (errors): Leave dummy.o and dummy around so that - we can see how the needed list was generated (it's sometimes wrong). - (mostlyclean): Remove them. - -Mon Sep 21 14:50:42 1992 Ian Lance Taylor (ian@cygnus.com) - - * getcwd.c: supply a default if MAXPATHLEN is not defined. - - * config/mh-irix4: set EXTRA_OFILES to alloca.o, from WRS. - -Wed Sep 9 12:41:48 1992 Ian Lance Taylor (ian@cygnus.com) - - * Makefile.in: Use XTRAFLAGS when compiling, so that xiberty works - when cross-compiling. - -Thu Sep 3 13:29:39 1992 K. Richard Pixley (rich@sendai.cygnus.com) - - * cplus-dem.c: (demangle_prefix): reduction in strength of strstr - as a time optimization. - - * cplus-dem.c (cplus_demangle): remove strpbrk test. Appears to - be more expensive than simply demangling. - - * cplus-dem.c (cplus_match): new function. - -Tue Sep 1 15:24:04 1992 Per Bothner (bothner@rtl.cygnus.com) - - * cplus-dem.c: #include <stdio.h>, to define NULL. - Define current_demangling_style. - -Sun Aug 30 17:58:19 1992 Per Bothner (bothner@rtl.cygnus.com) - - * cplus-dem.c: New file, moved from ../gdb. - * cplus-dem.c (set_cplus_marker_for_demangling): New exported - function, to avoid compiling in target-dependency for CPLUS_MARKER. - * cplus-dem.c (cplus_demangle): Allow demangling style option - to be passed as a parameter, but using the global variable - current_demangling_style as a default. - * Makefile.in: Update for cplus-dem.c - -Sat Aug 29 10:44:09 1992 Fred Fish (fnf@cygnus.com) - - * obstack.c: Merge in comment changes from FSF version. Now - matches the FSF version exactly. - -Fri Aug 28 18:39:08 1992 John Gilmore (gnu@cygnus.com) - - * obstack.c (CALL_FREEFUN): Can't use ?: with void values (at - least on losing DECstations!); use if-then-else instead. - -Wed Aug 19 14:40:34 1992 Ian Lance Taylor (ian@cygnus.com) - - * Makefile.in: always create installation directories. - -Mon Aug 10 17:33:40 1992 david d `zoo' zuhn (zoo at cirdan.cygnus.com) - - * Makefile.in: clean up definition of CFILES, more comments - -Sat Aug 8 23:10:59 1992 Fred Fish (fnf@cygnus.com) - - * getopt.c (my_index): Make first arg const to match strchr, - which it sometimes is remapped to. - -Sat Aug 1 13:48:50 1992 Fred Fish (fnf@cygnus.com) - - * obstack.c (DEFAULT_ALIGNMENT): Update to match FSF version. - * obstack.c (_obstack_begin): Initialize use_extra_arg. - * obstack.c (_obstack_begin_1): New, from FSF version. - -Mon Jul 20 21:07:58 1992 Fred Fish (fnf@cygnus.com) - - * obstack.c (CALL_CHECKFUN, CALL_FREEFUN): Use use_extra_arg and - extra_arg. - * obstack.c (_obstack_begin): Remove area_id and flags arguments - (previously added for mmalloc support, interface has changed). - Also convert flags usage to use use_extra_arg and maybe_empty_object. - -Fri Jul 10 00:41:53 1992 Fred Fish (fnf@cygnus.com) - - * argv.c: Move expandargv inline and eliminate static variables. - Rewrite to always allocate in powers of two. Fix to return an - argv with a single null string arg if passed a null string. - -Fri Jul 3 20:27:29 1992 Fred Fish (fnf@cygnus.com) - - * random.c, sigsetmask.c, strerror.c, strsignal.c: Remove - "(void)" casts from function calls where the return value is - ignored, in accordance with GNU coding standards. - -Mon Jun 29 10:54:19 1992 Fred Fish (fnf at cygnus.com) - - * bcopy.c, strerror.c, strsignal.c: Lint. - -Thu Jun 25 09:18:41 1992 K. Richard Pixley (rich@rtl.cygnus.com) - - * getopt.c: merge changes from make. - -Thu Jun 25 04:43:22 1992 John Gilmore (gnu at cygnus.com) - - * alloca.c: Incorporate fixes from gdb/alloca.c. - FIXME: Eventually move gdb's alloca configuration files here, - and remove gdb/alloca.c and its Makefile.in support. - -Tue Jun 23 21:56:30 1992 Fred Fish (fnf@cygnus.com) - - * dummy.c: Define NOTHING to /*nothing*/, change return type - of main to int and return zero. - * functions.def: Supply NOTHING as the fourth arg to macros - that don't have an explicit arg, to satisfy picky preprocessors. - -Wed Jun 17 18:13:58 1992 Per Bothner (bothner@rtl.cygnus.com) - - * Makefile.in: Clean up *clean rules, as per standards.texi. - -Tue Jun 16 16:11:59 1992 K. Richard Pixley (rich@rtl.cygnus.com) - - * getopt.c, getopt1.c: merged largely gratuitous, mostly - whitespace diffs from other prep distributions. - -Mon Jun 15 12:25:46 1992 Fred Fish (fnf@cygnus.com) - - * config/mh-ncr3000 (INSTALL): Don't use /usr/ucb/install, - it is broken on ncr 3000's. - -Mon Jun 15 01:03:26 1992 John Gilmore (gnu at cygnus.com) - - * sigsetmask.c: Rewrite. Old one was very confused about its - arguments and result. New one can't do much, but at least knows - what it can't do, and it's good enough for GDB's use. - -Sun Jun 14 15:17:40 1992 Stu Grossman (grossman at cygnus.com) - - * functions.def: Use proper prototype for strtoul. - -Fri Jun 12 19:22:40 1992 John Gilmore (gnu at cygnus.com) - - * Makefile.in: Add random.c. - * config/mh-*: Use "true" rather than "echo >/dev/null" for ranlib. - * configure.in: update solaris2 config. - -Wed Jun 10 16:31:29 1992 Fred Fish (fnf@cygnus.com) - - * random.c: Add for random() and srandom(). - * functions.def: Add random - -Tue Jun 9 17:27:18 1992 Fred Fish (fnf@cygnus.com) - - * config/{mh-ncr3000, mh-sysv4}: Add definition for INSTALL - using /usr/ucb/install. - -Mon Jun 1 13:20:17 1992 Per Bothner (bothner@rtl.cygnus.com) - - * strerror.c: Kludge to guard against a conflict with - possible declaration of sys_errlist in errno.h. - -Sun May 31 15:07:47 1992 Mark Eichin (eichin at cygnus.com) - - * configure.in, config/mh-solaris: add solaris2 config support. - -Fri May 29 17:23:23 1992 Per Bothner (bothner@rtl.cygnus.com) - - * sigsetmask.c: #ifdef out sigsetmask if SIG_SETMASK - is not defined (should be defined in signal.h, says Posix.). - -Mon May 18 17:35:04 1992 K. Richard Pixley (rich@cygnus.com) - - * getopt.c: merged changes from make-3.62.11. - -Fri May 8 14:53:07 1992 K. Richard Pixley (rich@cygnus.com) - - * getopt.c: merged changes from bison-1.18. - -Tue May 5 11:51:40 1992 Per Bothner (bothner@rtl.cygnus.com) - - * Makefile.in: Don't have $(EXTRA_OFILES) depend on config.h, - since that introduces a circular dependency. - ($(EXTRA_OFILES) are used to build config.h.) - - * strtoul.c: Fixes to handle non-decimal bases better. - -Wed Apr 22 09:27:51 1992 Fred Fish (fnf@cygnus.com) - - * config/mh-ncr3000: Replace MINUS_G with CFLAGS. - * Makefile.dos: Finish MINUS_G eradication. - * Makefile.in (CFILES): Add strsignal.c. - * Makefile.in (REQUIRED_OFILES): Add strerror.o strsignal.o - * Makefile.in (needed-list): Split creation of errors file to - separate make target. - * Makefile.in (config.h, needed2.awk, errors): New targets. - * Makefile.in (clean): Split to multiple lines, add needed2.awk - and config.h. - * dummy.c (DEFFUNC, DEFVAR): Add defines and undefs. - * functions.def (strerror): Remove from optional list. - * functions.def (sys_nerr, sys_errlist, sys_siglist): DEFVAR's - * functions.def (strerror, psignal): DEFFUNC's - * strerror.c: Rewrite from scratch to use sys_errlist only if - available, add errno_max(), add strerrno(), add strtoerrno(), - add test driver. - * strsignal.c: New file, signal equivalent to strerror.c. - Uses sys_siglist if available, defines signo_max(), strsignal(), - strsigno(), strtosigno(), psignal(), and test driver. - -Mon Apr 20 20:49:32 1992 K. Richard Pixley (rich@cygnus.com) - - * Makefile.in: do not print recursion line. - - * Makefile.in: allow CFLAGS to be passed in from command line. - Removed MINUS_G. Default CFLAGS to -g. - -Mon Apr 20 12:57:46 1992 Per Bothner (bothner@rtl.cygnus.com) - - * config/mh-aix: New. EXTRA_OFILES lists copysign.o, - so libg++ users don't have to be inconvenienced by a - libc.a bug (libc.a needs copysign, but doesn't define it!). - * configure.in: Use config/mh-aix. - * strtoul.c: Handle '-' as required by ANSI. - Clean up radix handling. - * strstr.c: Fix buggy algorithm. - * Makefile.in: Change so that ${EXTRA_OFILES} is - appended to needed-list (which is used by libg++). - -Fri Apr 10 22:51:41 1992 Fred Fish (fnf@cygnus.com) - - * configure.in: Recognize new ncr3000 config. - * config/mh-ncr3000: New config file. - -Wed Apr 1 23:31:43 1992 John Gilmore (gnu at cygnus.com) - - * argv.c, dummy.c: Lint. - -Tue Mar 31 18:46:44 1992 Fred Fish (fnf@cygnus.com) - - * config/mh-sysv4: New config file. - * configure.in (host_makefile_frag): Set to config/mh-sysv4 for - host_os == sysv4. - * getpagesize.c: For SVR4, use sysconf(_SC_PAGESIZE) to get - pagesize. - -Sun Mar 29 12:26:42 1992 John Gilmore (gnu at cygnus.com) - - * getopt.c: Lint. - -Fri Mar 27 08:32:55 1992 Fred Fish (fnf@cygnus.com) - - * functions.def (alloca): Fix return type and args to avoid - type clash with gcc's builtin alloca. - -Tue Mar 24 23:33:42 1992 K. Richard Pixley (rich@cygnus.com) - - * configure.in, config/mh-irix4: irix4 support. - - * Makefile.in, functions.def, alloca.c: added alloca. - -Tue Mar 24 17:34:46 1992 Stu Grossman (grossman at cygnus.com) - - * obstack.c (CALL_FREEFUN): Make it compile on DECstations. - -Thu Mar 19 13:57:42 1992 Fred Fish (fnf@cygnus.com) - - * argv.c: Fix various external function definitions to be - correct in an ANSI compilation environment. - -Sat Mar 14 17:28:17 1992 Fred Fish (fnf@cygnus.com) - - * obstack.c: Changes to support calling mmalloc functions, - which take an additional argument over malloc functions. - -Fri Mar 6 22:01:10 1992 K. Richard Pixley (rich@cygnus.com) - - * added check target. - -Thu Feb 27 22:19:39 1992 Per Bothner (bothner@cygnus.com) - - * argv.c: #include alloca-conf.h (needed by AIX). - -Wed Feb 26 18:04:40 1992 K. Richard Pixley (rich@cygnus.com) - - * Makefile.in, configure.in: removed traces of namesubdir, - -subdirs, $(subdir), $(unsubdir), some rcs triggers. Forced - copyrights to '92, changed some from Cygnus to FSF. - -Sat Feb 22 01:09:21 1992 Stu Grossman (grossman at cygnus.com) - - * argv.c: Check in Fred's version which fixes problems with - alloca(). - -Fri Feb 7 21:46:08 1992 Stu Grossman (grossman at cygnus.com) - - * makefile.dos: Remove NUL to keep patch from failing. - -Thu Jan 30 22:48:41 1992 Stu Grossman (grossman at cygnus.com) - - * getopt.c (_getopt_internal): Fix usage of enum has_arg. - -Mon Jan 20 18:53:23 1992 Stu Grossman (grossman at cygnus.com) - - * getopt.c, getopt1.c, ../include/getopt.h: Get latest versions. - -Sat Jan 18 16:53:01 1992 Fred Fish (fnf at cygnus.com) - - * argv.c: New file to build and destroy standard argument - vectors from a command string. - - * Makefile.in: Add argv.c and argv.o to appropriate macros. - -Fri Dec 20 12:12:57 1991 Fred Fish (fnf at cygnus.com) - - * configure.in: Change svr4 references to sysv4. - - * rindex.c: Declare return type of externally used function - strrchr(). - -Thu Dec 19 18:35:03 1991 John Gilmore (gnu at cygnus.com) - - * Makefile.in: Remove "***" in normal output, since Make produces - this on errors, and it's convenient to search for. - -Tue Dec 17 23:21:30 1991 Per Bothner (bothner at cygnus.com) - - * memcmp.c, memcpy.c, memmove.c, memset.c, strchr.c, strrchr.c: - New ANSI functions. The old non-ANSI functions (such as bcopy) - should be avoided. - * bcopy.c: Fix to correctly handle overlapping regions. - * index.c, rindex.c: Re-write in terms of strchr() and strrchr(). - * functions.def: Add the new functions. - * functions.def: Add 4th parameter to DEF macro, - an ansidecl.h-style prototype. - * dummy.c: Use expanded DEF macro to create a dummy function - call, with correct parameter types. (This avoids some - complaints from gcc about predefined builtins.) - - Move the functionality of config/mh-default into Makefile.in. - This avoid duplication, and simplifies things slightly. - * Makefile.in: Tweak so we don't need config/mh-default. - * README: Update. - * configure.in: No longer need config/mh-default. - * config/mh-default: Deleted. - * config/mh-sysv: Remove lines copied from old mh-default. - -Tue Dec 17 05:46:46 1991 John Gilmore (gnu at cygnus.com) - - * fdmatch.c (fdmatch): Don't compare st_rdev, which is for - 'mknod' device numbers. - -Mon Dec 16 12:25:34 1991 Fred Fish (fnf at cygnus.com) - - * fdmatch.c, Makefile.in: Add new function that takes two - open file descriptors and returns nonzero if they refer to - the same file, zero otherwise. (used in gdb) - -Wed Dec 11 17:40:39 1991 Steve Chamberlain (sac at rtl.cygnus.com) - From DJ: - * msdos.c: stub functions for dos. - * makefile.dos, configdj.bat: new. - * getopt.c: Don't include alloca-conf.h in a GO32 world. - - -Tue Dec 10 04:14:49 1991 K. Richard Pixley (rich at rtl.cygnus.com) - - * Makefile.in: infodir belongs in datadir. - -Fri Dec 6 23:26:45 1991 K. Richard Pixley (rich at rtl.cygnus.com) - - * Makefile.in: remove spaces following hyphens because bsd make - can't cope. added standards.text support. install using - INSTALL_DATA. - - * configure.in: remove commontargets as it is no longer a - recognized hook. - -Thu Dec 5 22:46:46 1991 K. Richard Pixley (rich at rtl.cygnus.com) - - * Makefile.in: idestdir and ddestdir go away. Added copyrights - and shift gpl to v2. Added ChangeLog if it didn't exist. docdir - and mandir now keyed off datadir by default. - -Fri Nov 22 19:15:29 1991 John Gilmore (gnu at cygnus.com) - - * Makefile.in: find-needed.awk does not fit in 14 chars. - - * Makefile.in: Suppress error checking when compiling the test - program, because Ultrix make/sh aborts there due to a bug. - -Fri Nov 22 12:23:17 1991 Per Bothner (bothner at cygnus.com) - - * Makefile.in: Re-did how EXTRA_OFILES is used to be more useful. - * README: Explained how the auto-configuration works, - and how to add new files and/or configurations. - -Fri Nov 22 09:45:23 1991 John Gilmore (gnu at cygnus.com) - - * strtoul.c: Avoid defining ULONG_MAX if already defined; - cast a const char * to char * for pedants. - - * getopt.c: Only define "const" after local include files get to, - and only if they haven't defined it. - -Thu Nov 21 16:58:53 1991 John Gilmore (gnu at cygnus.com) - - * getcwd.c (remove getwd.c): GNU code should call getcwd(). We - emulate it with getwd() if available. This avoids callers having - to find a MAXPATHLEN or PATH_MAX value from somewhere. - * Makefile.in, functions.def: getwd->getcwd. - * configure.in: Use generic case for every system. - * config/mh-{delta88,mach,rs6000,svr4}: Remove. - * config/mh-sysv: Use default handling, just add -DUSG. - -Thu Nov 14 10:58:05 1991 Per Bothner (bothner at cygnus.com) - - * Makefile.in, config/mh-default: Re-do make magic - so that for the default ("automatic") mode we only - compile the files we actually need. Do this using - a recursive make: The top-level generates the list - of needed files (loosely, the ones missing in libc), - and then passes that list to the recursive make. - * config/mh-mach: Remove obsolete STRERROR-{C,O} macros. - -Tue Nov 12 19:10:57 1991 John Gilmore (gnu at cygnus.com) - - RS/6000 host support (grumble). - - * configure.in: Build alloca-conf.h file from alloca-norm.h - (everything else) or alloca-botch.h (rs/6000). - * Makefile.in: Include . on the include path. - * getopt.c: Use alloca-conf.h. - * alloca-norm.h: How to declare alloca on reasonable machines. - * alloca-botch.h: How to declare alloca on braindead machines. - -Tue Nov 12 09:21:48 1991 Fred Fish (fnf at cygnus.com) - - * concat.c : New file, like concat() in gdb but can take a - variable number of arguments rather than fixed at 3 args. For - now, client applications must supply an xmalloc(), which is a - front end function to malloc() that deals with out-of-memory - conditions. - - * Makefile.in: Add concat.c and concat.o to appropriate macros. - -Sat Nov 9 13:29:59 1991 Fred Fish (fnf at cygnus.com) - - * config/mh-svr4: Add sigsetmask to list of required functions. - -Sun Nov 3 11:57:56 1991 Per Bothner (bothner at cygnus.com) - - * vsprintf.c: New file. - * functions.def, Makefile.in: Add vsprintf. - -Sun Oct 27 16:31:22 1991 John Gilmore (gnu at cygnus.com) - - * configure.in, config/mh-rs6000: Add rs/6000 host support. - * Makefile.in: Compile with debug info. - -Fri Oct 25 17:01:12 1991 Per Bothner (bothner at cygnus.com) - - * Makefile.in, configure.in, and new files: dummy.c, functions.def, - config/mf-default: Added a default configuration mode, - which includes into libiberty.a functions that are "missing" in libc. - * strdup.c, vprintf.c, vfprintf.c: New files. - -Thu Oct 24 02:29:26 1991 Fred Fish (fnf at cygnus.com) - - * config/hmake-svr4: New file. - - * config/hmake-sysv: Add HOST_CFILES and HOST_OFILES. - - * basename.c, bcmp.c, bcopy.c, bzero.c, getpagesize.c getwd.c, - index.c, insque.c, rindex.c, spaces.c, strstr.c, vfork.c: New - files containing either portable C versions or emulations using - native library calls. - - * strerror.c: Add copyright, internal documentation, etc. - - * strtol.c: Replace hardwired hex constants with some more - portable macros. Remove illegal (according to gcc) cast. - - * strtoul.c: Replace hardwired hex constant with more portable - macro. - - * Makefile.in: Move TARGETLIB and CFLAGS where makefile fragments - can override them. Add new source and object file names to CFILES - and OFILES respectively. - - * configure.in: Add support for SVR4 makefile fragments. - -Tue Oct 22 19:00:23 1991 Steve Chamberlain (steve at cygnus.com) - - * Makefile.in: Move RANLIB, AR and AR_FLAGS to where they can be - over-ridden by config/hmake-* - * configure.in: added m88kcvs to sysv list - -Fri Oct 4 01:29:08 1991 John Gilmore (gnu at cygnus.com) - - * Makefile.in: Most hosts need strerror, but one or two don't, - and they override these definitions in the host-dependent makefile - fragment. - * config/hmake-mach: The odd man out on strerror -- it's supplied. - * strerror.c: New file. - - * strtol.c, strtoul.c: Add strtol to libiberty, since Mach lacks - it and bfd uses it. - * configure.in, Makefile.in, config/hmake-mach: Only configure - strtol & strotoul in on Mach. - -Tue Sep 3 06:36:23 1991 John Gilmore (gnu at cygint.cygnus.com) - - * obstack.c: Merge with latest FSF version. - - -Local Variables: -version-control: never -End: diff --git a/contrib/gdb/libiberty/Makefile.in b/contrib/gdb/libiberty/Makefile.in deleted file mode 100644 index 7f11d51439de2..0000000000000 --- a/contrib/gdb/libiberty/Makefile.in +++ /dev/null @@ -1,321 +0,0 @@ -# -# Makefile -# Copyright (C) 1990, 1991, 1992, 1995 Free Software Foundation -# -# This file is part of the libiberty library. -# Libiberty is free software; you can redistribute it and/or -# modify it under the terms of the GNU Library General Public -# License as published by the Free Software Foundation; either -# version 2 of the License, or (at your option) any later version. -# -# Libiberty 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 -# Library General Public License for more details. -# -# You should have received a copy of the GNU Library General Public -# License along with libiberty; see the file COPYING.LIB. If -# not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, -# Boston, MA 02111-1307, USA. -# - -# This file was written, and is maintained by K. Richard Pixley -# <rich@cygnus.com>. - -# -# Makefile for libiberty directory -# - -srcdir = . - -prefix = /usr/local - -exec_prefix = $(prefix) -bindir = $(exec_prefix)/bin -libdir = $(exec_prefix)/lib - -datadir = $(prefix)/lib - -mandir = $(prefix)/man -man1dir = $(mandir)/man1 -man2dir = $(mandir)/man2 -man3dir = $(mandir)/man3 -man4dir = $(mandir)/man4 -man5dir = $(mandir)/man5 -man6dir = $(mandir)/man6 -man7dir = $(mandir)/man7 -man8dir = $(mandir)/man8 -man9dir = $(mandir)/man9 -infodir = $(prefix)/info -includedir = $(prefix)/include -oldincludedir = -docdir = $(datadir)/doc - -SHELL = /bin/sh - -# Multilib support variables. -MULTISRCTOP = -MULTIBUILDTOP = -MULTIDIRS = -MULTISUBDIR = -MULTIDO = true -MULTICLEAN = true - -INSTALL = install -c -INSTALL_PROGRAM = $(INSTALL) -INSTALL_DATA = $(INSTALL) - -AR = ar -AR_FLAGS = rc - -ERRORS_CC = $(CC) -CC = cc -CFLAGS = -g -LIBCFLAGS = $(CFLAGS) -MAKEINFO = makeinfo -RANLIB = ranlib - -PICFLAG = - -MAKEOVERRIDES = - -TARGETLIB = libiberty.a - -CONFIG_H = lconfig.h -NEEDED_LIST = lneeded-list - -# HOST_OFILES contains the list of objects that should be in the -# library (in addition to the REQUIRED_OFILES and EXTRA_OFILES). -# A configuration may override this with a fixed list a object files -# names (hard to maintain), or some other way to generate a list. -HOST_OFILES=`cat needed-list` - -# Extra targets that the top-level target depends on. -# Specifically, what needs to be made before HOST_OFILES can be used. -# Can be empty if HOST_OFILES is just a list of file names. -DO_ALSO = needed-list - -# A configuration can specify extra .o files that should be included, -# even if they are in libc. (Perhaps the libc version is buggy.) -EXTRA_OFILES = - -# Flags to pass to a recursive make. -FLAGS_TO_PASS = \ - "AR=$(AR)" \ - "AR_FLAGS=$(AR_FLAGS)" \ - "CC=$(CC)" \ - "CFLAGS=$(CFLAGS)" \ - "LIBCFLAGS=$(LIBCFLAGS)" \ - "EXTRA_OFILES=$(EXTRA_OFILES)" \ - "HDEFINES=$(HDEFINES)" \ - "LDFLAGS=$(LDFLAGS)" \ - "LOADLIBES=$(LOADLIBES)" \ - "PICFLAG=$(PICFLAG)" \ - "RANLIB=$(RANLIB)" \ - "SHELL=$(SHELL)" - -all: stamp-picdir $(TARGETLIB) required-list - @if [ "$(RULE1)" != "not-used" ]; then \ - $(MULTIDO) $(FLAGS_TO_PASS) multi-do DO=all; \ - else true; \ - fi - -.PHONY: check installcheck -check installcheck: - - -#### Host, target, and site specific Makefile fragments come in here. -### - -INCDIR=$(srcdir)/$(MULTISRCTOP)../include - -COMPILE.c = $(CC) -c $(LIBCFLAGS) -I. -I$(INCDIR) $(HDEFINES) -.c.o: - test -z "$(PICFLAG)" || \ - $(COMPILE.c) $(PICFLAG) $< -o pic/$@ - $(COMPILE.c) $< - -# The default target just invokes make recursively. -# However, the automatic configuration (in config/mh_default). -# first causes it to figure out the objects missing in libc. -info install-info clean-info dvi: - -# Include files that are in this directory. -HFILES = - -# NOTE: If you add new files to the library, add them to this list -# (alphabetical), and add them to REQUIRED_OFILES or 'functions.def'. -CFILES = alloca.c argv.c basename.c bcmp.c bcopy.c bzero.c \ - clock.c concat.c cplus-dem.c fdmatch.c \ - getcwd.c getopt.c getopt1.c getpagesize.c getruntime.c \ - floatformat.c hex.c index.c insque.c \ - memchr.c memcmp.c memcpy.c memmove.c memset.c \ - obstack.c random.c rename.c rindex.c sigsetmask.c spaces.c \ - strcasecmp.c strncasecmp.c \ - strchr.c strdup.c strerror.c strrchr.c strsignal.c \ - strstr.c strtod.c strtol.c strtoul.c tmpnam.c \ - vasprintf.c vfork.c vfprintf.c vprintf.c vsprintf.c waitpid.c \ - xatexit.c xexit.c xmalloc.c xstrdup.c xstrerror.c -# These are always included in the library. -REQUIRED_OFILES = argv.o basename.o concat.o cplus-dem.o fdmatch.o \ - getopt.o getopt1.o getruntime.o hex.o \ - floatformat.o obstack.o spaces.o strerror.o strsignal.o \ - vasprintf.o xatexit.o xexit.o xmalloc.o xstrdup.o xstrerror.o - -# Do we want/need any config overrides? -# - -STAGESTUFF = $(TARGETLIB) *.o - -INSTALL_DEST = libdir -install: install_to_$(INSTALL_DEST) - -install_to_libdir: all - $(INSTALL_DATA) $(TARGETLIB) $(libdir)/$(TARGETLIB).n - ( cd $(libdir) ; $(RANLIB) $(libdir)/$(TARGETLIB).n ) - mv -f $(libdir)/$(TARGETLIB).n $(libdir)$(MULTISUBDIR)/$(TARGETLIB) - @$(MULTIDO) $(FLAGS_TO_PASS) multi-do DO=install - -install_to_tooldir: all - $(INSTALL_DATA) $(TARGETLIB) $(tooldir)/lib/$(TARGETLIB).n - ( cd $(tooldir) ; $(RANLIB) $(tooldir)/lib/$(TARGETLIB).n ) - mv -f $(tooldir)/lib/$(TARGETLIB).n $(tooldir)/lib$(MULTISUBDIR)/$(TARGETLIB) - @$(MULTIDO) $(FLAGS_TO_PASS) multi-do DO=install - -# The default configuration adds to libiberty all those functions that are -# missing in libc. More precisely, it includes whatever $(CC) fails to find. -# Then a sed+awk combination translates the ld error messages into -# a list of .o files. - -needed-list: stamp-picdir $(NEEDED_LIST) - cp $(NEEDED_LIST) needed-list - -lneeded-list: $(EXTRA_OFILES) needed.awk errors - rm -f lneeded-list - f=""; \ - for i in `awk -f needed.awk <errors` $(EXTRA_OFILES) ; do \ - case " $$f " in \ - *" $$i "*) ;; \ - *) f="$$f $$i" ;; \ - esac ; \ - done ; \ - echo $$f >>lneeded-list - -# Generate an awk script that looks for functions in functions.def - -needed.awk: $(srcdir)/functions.def Makefile - echo "# !Automatically generated from $(srcdir)/functions.def"\ - "- DO NOT EDIT!" >needed.awk - grep '^DEF(' < $(srcdir)/functions.def \ - | sed -e '/DEF/s|DEF.\([^,]*\).*|/\1/ { printf "\1.o " }|' \ - >>needed.awk - -config.h: $(CONFIG_H) - cp $(CONFIG_H) config.h - -lconfig.h: needed2.awk errors - echo "/* !Automatically generated from $(srcdir)/functions.def"\ - "- DO NOT EDIT! */" >lconfig.h - awk -f needed2.awk <errors >>lconfig.h - -# Generate an awk script that looks for variables in functions.def - -needed2.awk: $(srcdir)/functions.def Makefile - echo "# !Automatically generated from $(srcdir)/functions.def"\ - "- DO NOT EDIT!" >needed2.awk - grep '^DEFVAR(' < $(srcdir)/functions.def \ - | sed -e '/DEFVAR/s|DEFVAR.\([^,]*\).*|/\1/ { printf "#ifndef NEED_\1\\n#define NEED_\1\\n#endif\\n" }|' \ - >>needed2.awk - grep '^DEFFUNC(' < $(srcdir)/functions.def \ - | sed -e '/DEFFUNC/s|DEFFUNC.\([^,]*\).*|/\1/ { printf "#ifndef NEED_\1\\n#define NEED_\1\\n#endif\\n" }|' \ - >>needed2.awk - -dummy.o: $(srcdir)/dummy.c $(srcdir)/functions.def - $(CC) -c $(CFLAGS) -I. -I$(INCDIR) $(HDEFINES) $(srcdir)/dummy.c 2>/dev/null - -errors: dummy.o $(EXTRA_OFILES) - -($(ERRORS_CC) -o dummy $(CFLAGS) $(LDFLAGS) $(ERRORS_LDFLAGS) dummy.o $(EXTRA_OFILES) $(LOADLIBES)) >errors 2>&1 || true - -# required-list is used when building a shared bfd/opcodes/libiberty library. -required-list: Makefile - echo $(REQUIRED_OFILES) > required-list - -$(HOST_OFILES) $(REQUIRED_OFILES) : config.h - -RULE1 = $(TARGETLIB) -$(RULE1): $(REQUIRED_OFILES) $(DO_ALSO) .always. - @$(MAKE) RULE1=not-used RULE2=$(TARGETLIB) $(FLAGS_TO_PASS) \ - "HOST_OFILES=$(HOST_OFILES)" - -# Rule invoked by recursive make in $(RULE1). -RULE2 = not-used -$(RULE2): $(REQUIRED_OFILES) $(HOST_OFILES) - rm -rf $(TARGETLIB) - $(AR) $(AR_FLAGS) $(TARGETLIB) \ - $(REQUIRED_OFILES) $(HOST_OFILES) - $(RANLIB) $(TARGETLIB) - -stamp-picdir: - if [ -n "$(PICFLAG)" ] && [ ! -d pic ]; then \ - mkdir pic; \ - else true; fi - touch stamp-picdir - -.always.: -# Do nothing. - -.PHONY: all etags tags ls clean stage1 stage2 .always. - -etags tags: TAGS - -TAGS: $(CFILES) $(HFILES) - etags `for i in $(HFILES) $(CFILES); do echo $(srcdir)/$$i ; done` - -# The standalone demangler (c++filt) has been moved to binutils. -demangle: - @echo "The standalone demangler, now named c++filt, is now" - @echo "a part of binutils." - @false - -ls: - @echo Makefile $(HFILES) $(CFILES) - -# Need to deal with profiled libraries, too. - -mostlyclean: - rm -rf *.o pic core errs \#* *.E a.out - rm -f needed.awk needed2.awk errors dummy needed-list config.h - rm -f $(CONFIG_H) $(NEEDED_LIST) stamp-picdir - @$(MULTICLEAN) multi-clean DO=mostlyclean -clean: mostlyclean - rm -f *.a required-list - @$(MULTICLEAN) multi-clean DO=clean -distclean: clean - rm -f *~ Makefile config.status alloca-conf.h xhost-mkfrag TAGS - @$(MULTICLEAN) multi-clean DO=distclean -maintainer-clean realclean: distclean - -force: - -Makefile: $(srcdir)/Makefile.in $(host_makefile_frag) $(target_makefile_frag) - $(SHELL) ./config.status - -argv.o: $(INCDIR)/libiberty.h -basename.o: $(INCDIR)/libiberty.h -concat.o: $(INCDIR)/libiberty.h -cplus-dem.o: $(INCDIR)/demangle.h -fdmatch.o: $(INCDIR)/libiberty.h -getopt.o: $(INCDIR)/getopt.h -getopt1.o: $(INCDIR)/getopt.h -getruntime.o: $(INCDIR)/libiberty.h -hex.o: $(INCDIR)/libiberty.h -floatformat.o: $(INCDIR)/floatformat.h -obstack.o: $(INCDIR)/obstack.h -spaces.o: $(INCDIR)/libiberty.h -strerror.o: $(INCDIR)/libiberty.h -strsignal.o: $(INCDIR)/libiberty.h -xatexit.o: $(INCDIR)/libiberty.h -xexit.o: $(INCDIR)/libiberty.h -xmalloc.o: $(INCDIR)/libiberty.h -xstrdup.o: $(INCDIR)/libiberty.h -xstrerror.o: $(INCDIR)/libiberty.h diff --git a/contrib/gdb/libiberty/README b/contrib/gdb/libiberty/README deleted file mode 100644 index 5081bbac19681..0000000000000 --- a/contrib/gdb/libiberty/README +++ /dev/null @@ -1,129 +0,0 @@ -This directory contains the -liberty library of free software. -It is a collection of subroutines used by various GNU programs. -Current members include: - - getopt -- get options from command line - obstack -- stacks of arbitrarily-sized objects - strerror -- error message strings corresponding to errno - strtol -- string-to-long conversion - strtoul -- string-to-unsigned-long conversion - -We expect many of the GNU subroutines that are floating around to -eventually arrive here. - -To build the library, do: - - ./configure HOSTTYPE - make - -Please report bugs and fixes to "bug-gnu-utils@prep.ai.mit.edu". Thank you. - -ADDING A NEW FILE -================= - -There are two sets of files: Those that are "required" will be -included in the library for all configurations, while those -that are "optional" will be included in the library only if "needed." - -To add a new required file, edit Makefile to add the source file -name to CFILES and the object file to REQUIRED_OFILES. - -Adding a new optional file is more fragile. As a general rule, -an optional file will be included in the library if it provides -functionality missing in the "standard" C library. -For most hosts, the Makefile automatically figures out which -functionality is missing by compiling and linking a dummy test -program, and examining the error messages. - -So to get this to work, you should do the following: - -1) Select one function defined in the file you're adding. -For example, the getcwd function. -2) Add that function to the list in the file functions.def. -3) The name of the new file must be the same as the function -you've chosen with the .c suffix added. E.g. getcwd() must be -defined in getcwd.c. (The file can define other functions as well.) -4) In Makefile.in, add the name of the source file (e.g. getcwd.c) -to CFILES. - -The file you've added (e.g. getcwd.c) should compile and work -on all hosts where it is needed (e.g. not found when linking -the dummy.c program). It does not have to work or even -compile on hosts where it is not needed. - -HOW THE AUTOMATIC CONFIGURATION WORKS -===================================== - -The libiberty.a target (in RULE1) depends on $(DO_ALSO). -For normal configurations, DO_ALSO=needed-list. - -So needed-list is first made. The needed-list rule compiles -dummy.c. Because dummy.c includes functions.def, the -resulting object file will contain a call to each of the -optional functions (for simplicity assume each optional file -defines a single function). This object file will be linked -against the standard libraries (as defined by using $(CC) -and various flags). Any function missing will causes the -linker to emit an error message. We assume the name -of the missing function(s) are in the error message(s). -The awk script find-needed.awk has been generated from -functions.def. It is used to search the linker output -messages for words that match the functions listed in -functions.def. The list of functions found is written -on a single line to the file needed-list. - -After needed-list has been generated, the libiberty.a -target (in RULE1) just calls 'make' recursively. -It passes the contents of needed-list using the -definition (expanded) HOST_OFILES="`cat needed-list`". -It also tells the inferior 'make' to use RULE2. - -The inferior 'make' is very conventional: The main -rule is $(RULE2) (which is libiberty.a). It depends -on a list of object files: $(REQUIRED_OFILES) $(HOST_OFILES) -(and $(EXTRA_OFILES), which is usually empty). The superior -'make' passes in $(HOST_OFILES); the others are fixed -in the Makefile. - -ADDING A NEW CONFIGURATION -========================== - -On most hosts you should be able to use the scheme for automatically -figuring out which files are needed. In that case, you probably -don't need a special Makefile stub for that configuration. - -If the fully automatic scheme doesn't work, you may be able to get -by with defining EXTRA_OFILES in your Makefile stub. This is -a list of object file names that should be treated as required -for this configuration - they will be included in libiberty.a, -regardless of whatever might be in the C library. Moreover, -when the dummy.c program is linked, it will be linked with -$(EXTRA_OFILES). Therefore, if a function in functions.def -is defined by one of the EXTRA_OFILES, it will not be listed as -"needed". Thus if your hal9000 host needs a special implementation -of getcwd, you can just create hal9000-getcwd.c, and define: - EXTRA_OFILES=hal9000-getcwd.o -Or if you want to use the libiberty version of strstr(), -even though there is a version in the C library (it might be -buggy or slow), just define: - EXTRA_OFILES=strstr.o - -You can create a "manual" host configuration FOO with a file -config/mh-FOO. In it, the HOST_OFILES macro should explicitly -list that subset of the optional files that should be in the -library. You should also set: - DO_ALSO = -This overrides all of the magic needed to automatically -determine which files are "needed." However, keeping that list -up to date is another matter... - -HOW THE MANUAL CONFIGURATION WORKS -================================== - -This also uses a recursive make, but the superior make -does not do anything interesting - it just calls the -inferior make with HOST_OFILES defined as $(HOST_OFILES), -which is the list you created in your configuration. - -You probably don't want to depend on manual configuration, -because keeping the HOST_OFILES list up-to-date will be a pain. diff --git a/contrib/gdb/libiberty/alloca-botch.h b/contrib/gdb/libiberty/alloca-botch.h deleted file mode 100644 index c909573f58c63..0000000000000 --- a/contrib/gdb/libiberty/alloca-botch.h +++ /dev/null @@ -1,5 +0,0 @@ -/* RS/6000 AIX botched alloca and requires a pragma, which ordinary compilers - throw up about, so we have to put it in a specially-configured file. - Like this one. */ - -#pragma alloca diff --git a/contrib/gdb/libiberty/alloca-norm.h b/contrib/gdb/libiberty/alloca-norm.h deleted file mode 100644 index 8d91b5ad42956..0000000000000 --- a/contrib/gdb/libiberty/alloca-norm.h +++ /dev/null @@ -1,16 +0,0 @@ -/* "Normal" configuration for alloca. */ - -#ifdef __GNUC__ -#define alloca __builtin_alloca -#else /* not __GNUC__ */ -#ifdef sparc -#include <alloca.h> -extern char *__builtin_alloca(); /* Stupid include file doesn't declare it */ -#else -#ifdef __STDC__ -PTR alloca (size_t); -#else -PTR alloca (); /* must agree with functions.def */ -#endif -#endif /* sparc */ -#endif /* not __GNUC__ */ diff --git a/contrib/gdb/libiberty/alloca.c b/contrib/gdb/libiberty/alloca.c deleted file mode 100644 index 9c472ead6dfc9..0000000000000 --- a/contrib/gdb/libiberty/alloca.c +++ /dev/null @@ -1,475 +0,0 @@ -/* alloca.c -- allocate automatically reclaimed memory - (Mostly) portable public-domain implementation -- D A Gwyn - - This implementation of the PWB library alloca function, - which is used to allocate space off the run-time stack so - that it is automatically reclaimed upon procedure exit, - was inspired by discussions with J. Q. Johnson of Cornell. - J.Otto Tennant <jot@cray.com> contributed the Cray support. - - There are some preprocessor constants that can - be defined when compiling for your specific system, for - improved efficiency; however, the defaults should be okay. - - The general concept of this implementation is to keep - track of all alloca-allocated blocks, and reclaim any - that are found to be deeper in the stack than the current - invocation. This heuristic does not reclaim storage as - soon as it becomes invalid, but it will do so eventually. - - As a special case, alloca(0) reclaims storage without - allocating any. It is a good idea to use alloca(0) in - your main control loop, etc. to force garbage collection. */ - -#ifdef HAVE_CONFIG_H -#include "config.h" -#endif - -/* If compiling with GCC, this file's not needed. */ -#ifndef alloca - -#ifdef emacs -#ifdef static -/* actually, only want this if static is defined as "" - -- this is for usg, in which emacs must undefine static - in order to make unexec workable - */ -#ifndef STACK_DIRECTION -you -lose --- must know STACK_DIRECTION at compile-time -#endif /* STACK_DIRECTION undefined */ -#endif /* static */ -#endif /* emacs */ - -/* If your stack is a linked list of frames, you have to - provide an "address metric" ADDRESS_FUNCTION macro. */ - -#if defined (CRAY) && defined (CRAY_STACKSEG_END) -long i00afunc (); -#define ADDRESS_FUNCTION(arg) (char *) i00afunc (&(arg)) -#else -#define ADDRESS_FUNCTION(arg) &(arg) -#endif - -#if __STDC__ -typedef void *pointer; -#else -typedef char *pointer; -#endif - -#define NULL 0 - -/* Different portions of Emacs need to call different versions of - malloc. The Emacs executable needs alloca to call xmalloc, because - ordinary malloc isn't protected from input signals. On the other - hand, the utilities in lib-src need alloca to call malloc; some of - them are very simple, and don't have an xmalloc routine. - - Non-Emacs programs expect this to call use xmalloc. - - Callers below should use malloc. */ - -#ifndef emacs -#define malloc xmalloc -extern pointer xmalloc (); -#endif - -/* Define STACK_DIRECTION if you know the direction of stack - growth for your system; otherwise it will be automatically - deduced at run-time. - - STACK_DIRECTION > 0 => grows toward higher addresses - STACK_DIRECTION < 0 => grows toward lower addresses - STACK_DIRECTION = 0 => direction of growth unknown */ - -#ifndef STACK_DIRECTION -#define STACK_DIRECTION 0 /* Direction unknown. */ -#endif - -#if STACK_DIRECTION != 0 - -#define STACK_DIR STACK_DIRECTION /* Known at compile-time. */ - -#else /* STACK_DIRECTION == 0; need run-time code. */ - -static int stack_dir; /* 1 or -1 once known. */ -#define STACK_DIR stack_dir - -static void -find_stack_direction () -{ - static char *addr = NULL; /* Address of first `dummy', once known. */ - auto char dummy; /* To get stack address. */ - - if (addr == NULL) - { /* Initial entry. */ - addr = ADDRESS_FUNCTION (dummy); - - find_stack_direction (); /* Recurse once. */ - } - else - { - /* Second entry. */ - if (ADDRESS_FUNCTION (dummy) > addr) - stack_dir = 1; /* Stack grew upward. */ - else - stack_dir = -1; /* Stack grew downward. */ - } -} - -#endif /* STACK_DIRECTION == 0 */ - -/* An "alloca header" is used to: - (a) chain together all alloca'ed blocks; - (b) keep track of stack depth. - - It is very important that sizeof(header) agree with malloc - alignment chunk size. The following default should work okay. */ - -#ifndef ALIGN_SIZE -#define ALIGN_SIZE sizeof(double) -#endif - -typedef union hdr -{ - char align[ALIGN_SIZE]; /* To force sizeof(header). */ - struct - { - union hdr *next; /* For chaining headers. */ - char *deep; /* For stack depth measure. */ - } h; -} header; - -static header *last_alloca_header = NULL; /* -> last alloca header. */ - -/* Return a pointer to at least SIZE bytes of storage, - which will be automatically reclaimed upon exit from - the procedure that called alloca. Originally, this space - was supposed to be taken from the current stack frame of the - caller, but that method cannot be made to work for some - implementations of C, for example under Gould's UTX/32. */ - -pointer -alloca (size) - unsigned size; -{ - auto char probe; /* Probes stack depth: */ - register char *depth = ADDRESS_FUNCTION (probe); - -#if STACK_DIRECTION == 0 - if (STACK_DIR == 0) /* Unknown growth direction. */ - find_stack_direction (); -#endif - - /* Reclaim garbage, defined as all alloca'd storage that - was allocated from deeper in the stack than currently. */ - - { - register header *hp; /* Traverses linked list. */ - - for (hp = last_alloca_header; hp != NULL;) - if ((STACK_DIR > 0 && hp->h.deep > depth) - || (STACK_DIR < 0 && hp->h.deep < depth)) - { - register header *np = hp->h.next; - - free ((pointer) hp); /* Collect garbage. */ - - hp = np; /* -> next header. */ - } - else - break; /* Rest are not deeper. */ - - last_alloca_header = hp; /* -> last valid storage. */ - } - - if (size == 0) - return NULL; /* No allocation required. */ - - /* Allocate combined header + user data storage. */ - - { - register pointer new = malloc (sizeof (header) + size); - /* Address of header. */ - - ((header *) new)->h.next = last_alloca_header; - ((header *) new)->h.deep = depth; - - last_alloca_header = (header *) new; - - /* User storage begins just after header. */ - - return (pointer) ((char *) new + sizeof (header)); - } -} - -#if defined (CRAY) && defined (CRAY_STACKSEG_END) - -#ifdef DEBUG_I00AFUNC -#include <stdio.h> -#endif - -#ifndef CRAY_STACK -#define CRAY_STACK -#ifndef CRAY2 -/* Stack structures for CRAY-1, CRAY X-MP, and CRAY Y-MP */ -struct stack_control_header - { - long shgrow:32; /* Number of times stack has grown. */ - long shaseg:32; /* Size of increments to stack. */ - long shhwm:32; /* High water mark of stack. */ - long shsize:32; /* Current size of stack (all segments). */ - }; - -/* The stack segment linkage control information occurs at - the high-address end of a stack segment. (The stack - grows from low addresses to high addresses.) The initial - part of the stack segment linkage control information is - 0200 (octal) words. This provides for register storage - for the routine which overflows the stack. */ - -struct stack_segment_linkage - { - long ss[0200]; /* 0200 overflow words. */ - long sssize:32; /* Number of words in this segment. */ - long ssbase:32; /* Offset to stack base. */ - long:32; - long sspseg:32; /* Offset to linkage control of previous - segment of stack. */ - long:32; - long sstcpt:32; /* Pointer to task common address block. */ - long sscsnm; /* Private control structure number for - microtasking. */ - long ssusr1; /* Reserved for user. */ - long ssusr2; /* Reserved for user. */ - long sstpid; /* Process ID for pid based multi-tasking. */ - long ssgvup; /* Pointer to multitasking thread giveup. */ - long sscray[7]; /* Reserved for Cray Research. */ - long ssa0; - long ssa1; - long ssa2; - long ssa3; - long ssa4; - long ssa5; - long ssa6; - long ssa7; - long sss0; - long sss1; - long sss2; - long sss3; - long sss4; - long sss5; - long sss6; - long sss7; - }; - -#else /* CRAY2 */ -/* The following structure defines the vector of words - returned by the STKSTAT library routine. */ -struct stk_stat - { - long now; /* Current total stack size. */ - long maxc; /* Amount of contiguous space which would - be required to satisfy the maximum - stack demand to date. */ - long high_water; /* Stack high-water mark. */ - long overflows; /* Number of stack overflow ($STKOFEN) calls. */ - long hits; /* Number of internal buffer hits. */ - long extends; /* Number of block extensions. */ - long stko_mallocs; /* Block allocations by $STKOFEN. */ - long underflows; /* Number of stack underflow calls ($STKRETN). */ - long stko_free; /* Number of deallocations by $STKRETN. */ - long stkm_free; /* Number of deallocations by $STKMRET. */ - long segments; /* Current number of stack segments. */ - long maxs; /* Maximum number of stack segments so far. */ - long pad_size; /* Stack pad size. */ - long current_address; /* Current stack segment address. */ - long current_size; /* Current stack segment size. This - number is actually corrupted by STKSTAT to - include the fifteen word trailer area. */ - long initial_address; /* Address of initial segment. */ - long initial_size; /* Size of initial segment. */ - }; - -/* The following structure describes the data structure which trails - any stack segment. I think that the description in 'asdef' is - out of date. I only describe the parts that I am sure about. */ - -struct stk_trailer - { - long this_address; /* Address of this block. */ - long this_size; /* Size of this block (does not include - this trailer). */ - long unknown2; - long unknown3; - long link; /* Address of trailer block of previous - segment. */ - long unknown5; - long unknown6; - long unknown7; - long unknown8; - long unknown9; - long unknown10; - long unknown11; - long unknown12; - long unknown13; - long unknown14; - }; - -#endif /* CRAY2 */ -#endif /* not CRAY_STACK */ - -#ifdef CRAY2 -/* Determine a "stack measure" for an arbitrary ADDRESS. - I doubt that "lint" will like this much. */ - -static long -i00afunc (long *address) -{ - struct stk_stat status; - struct stk_trailer *trailer; - long *block, size; - long result = 0; - - /* We want to iterate through all of the segments. The first - step is to get the stack status structure. We could do this - more quickly and more directly, perhaps, by referencing the - $LM00 common block, but I know that this works. */ - - STKSTAT (&status); - - /* Set up the iteration. */ - - trailer = (struct stk_trailer *) (status.current_address - + status.current_size - - 15); - - /* There must be at least one stack segment. Therefore it is - a fatal error if "trailer" is null. */ - - if (trailer == 0) - abort (); - - /* Discard segments that do not contain our argument address. */ - - while (trailer != 0) - { - block = (long *) trailer->this_address; - size = trailer->this_size; - if (block == 0 || size == 0) - abort (); - trailer = (struct stk_trailer *) trailer->link; - if ((block <= address) && (address < (block + size))) - break; - } - - /* Set the result to the offset in this segment and add the sizes - of all predecessor segments. */ - - result = address - block; - - if (trailer == 0) - { - return result; - } - - do - { - if (trailer->this_size <= 0) - abort (); - result += trailer->this_size; - trailer = (struct stk_trailer *) trailer->link; - } - while (trailer != 0); - - /* We are done. Note that if you present a bogus address (one - not in any segment), you will get a different number back, formed - from subtracting the address of the first block. This is probably - not what you want. */ - - return (result); -} - -#else /* not CRAY2 */ -/* Stack address function for a CRAY-1, CRAY X-MP, or CRAY Y-MP. - Determine the number of the cell within the stack, - given the address of the cell. The purpose of this - routine is to linearize, in some sense, stack addresses - for alloca. */ - -static long -i00afunc (long address) -{ - long stkl = 0; - - long size, pseg, this_segment, stack; - long result = 0; - - struct stack_segment_linkage *ssptr; - - /* Register B67 contains the address of the end of the - current stack segment. If you (as a subprogram) store - your registers on the stack and find that you are past - the contents of B67, you have overflowed the segment. - - B67 also points to the stack segment linkage control - area, which is what we are really interested in. */ - - stkl = CRAY_STACKSEG_END (); - ssptr = (struct stack_segment_linkage *) stkl; - - /* If one subtracts 'size' from the end of the segment, - one has the address of the first word of the segment. - - If this is not the first segment, 'pseg' will be - nonzero. */ - - pseg = ssptr->sspseg; - size = ssptr->sssize; - - this_segment = stkl - size; - - /* It is possible that calling this routine itself caused - a stack overflow. Discard stack segments which do not - contain the target address. */ - - while (!(this_segment <= address && address <= stkl)) - { -#ifdef DEBUG_I00AFUNC - fprintf (stderr, "%011o %011o %011o\n", this_segment, address, stkl); -#endif - if (pseg == 0) - break; - stkl = stkl - pseg; - ssptr = (struct stack_segment_linkage *) stkl; - size = ssptr->sssize; - pseg = ssptr->sspseg; - this_segment = stkl - size; - } - - result = address - this_segment; - - /* If you subtract pseg from the current end of the stack, - you get the address of the previous stack segment's end. - This seems a little convoluted to me, but I'll bet you save - a cycle somewhere. */ - - while (pseg != 0) - { -#ifdef DEBUG_I00AFUNC - fprintf (stderr, "%011o %011o\n", pseg, size); -#endif - stkl = stkl - pseg; - ssptr = (struct stack_segment_linkage *) stkl; - size = ssptr->sssize; - pseg = ssptr->sspseg; - result += size; - } - return (result); -} - -#endif /* not CRAY2 */ -#endif /* CRAY */ - -#endif /* no alloca */ diff --git a/contrib/gdb/libiberty/argv.c b/contrib/gdb/libiberty/argv.c deleted file mode 100644 index 40582abe40824..0000000000000 --- a/contrib/gdb/libiberty/argv.c +++ /dev/null @@ -1,328 +0,0 @@ -/* Create and destroy argument vectors (argv's) - Copyright (C) 1992 Free Software Foundation, Inc. - Written by Fred Fish @ Cygnus Support - -This file is part of the libiberty library. -Libiberty is free software; you can redistribute it and/or -modify it under the terms of the GNU Library General Public -License as published by the Free Software Foundation; either -version 2 of the License, or (at your option) any later version. - -Libiberty 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 -Library General Public License for more details. - -You should have received a copy of the GNU Library General Public -License along with libiberty; see the file COPYING.LIB. If -not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, -Boston, MA 02111-1307, USA. */ - - -/* Create and destroy argument vectors. An argument vector is simply an - array of string pointers, terminated by a NULL pointer. */ - -#include "ansidecl.h" -#include "libiberty.h" - -#define isspace(ch) ((ch) == ' ' || (ch) == '\t') - -/* Routines imported from standard C runtime libraries. */ - -#ifdef __STDC__ - -#include <stddef.h> -extern void *memcpy (void *s1, const void *s2, size_t n); /* 4.11.2.1 */ -extern size_t strlen (const char *s); /* 4.11.6.3 */ -extern void *malloc (size_t size); /* 4.10.3.3 */ -extern void *realloc (void *ptr, size_t size); /* 4.10.3.4 */ -extern void free (void *ptr); /* 4.10.3.2 */ -extern char *strdup (const char *s); /* Non-ANSI */ - -#else /* !__STDC__ */ - -extern char *memcpy (); /* Copy memory region */ -extern int strlen (); /* Count length of string */ -extern char *malloc (); /* Standard memory allocater */ -extern char *realloc (); /* Standard memory reallocator */ -extern void free (); /* Free malloc'd memory */ -extern char *strdup (); /* Duplicate a string */ - -#endif /* __STDC__ */ - -#include "alloca-conf.h" - -#ifndef NULL -#define NULL 0 -#endif - -#ifndef EOS -#define EOS '\0' -#endif - -#define INITIAL_MAXARGC 8 /* Number of args + NULL in initial argv */ - - -/* - -NAME - - freeargv -- free an argument vector - -SYNOPSIS - - void freeargv (vector) - char **vector; - -DESCRIPTION - - Free an argument vector that was built using buildargv. Simply scans - through the vector, freeing the memory for each argument until the - terminating NULL is found, and then frees the vector itself. - -RETURNS - - No value. - -*/ - -void freeargv (vector) -char **vector; -{ - register char **scan; - - if (vector != NULL) - { - for (scan = vector; *scan != NULL; scan++) - { - free (*scan); - } - free (vector); - } -} - -/* - -NAME - - buildargv -- build an argument vector from a string - -SYNOPSIS - - char **buildargv (sp) - char *sp; - -DESCRIPTION - - Given a pointer to a string, parse the string extracting fields - separated by whitespace and optionally enclosed within either single - or double quotes (which are stripped off), and build a vector of - pointers to copies of the string for each field. The input string - remains unchanged. - - All of the memory for the pointer array and copies of the string - is obtained from malloc. All of the memory can be returned to the - system with the single function call freeargv, which takes the - returned result of buildargv, as it's argument. - - The memory for the argv array is dynamically expanded as necessary. - -RETURNS - - Returns a pointer to the argument vector if successful. Returns NULL - if the input string pointer is NULL or if there is insufficient - memory to complete building the argument vector. - -NOTES - - In order to provide a working buffer for extracting arguments into, - with appropriate stripping of quotes and translation of backslash - sequences, we allocate a working buffer at least as long as the input - string. This ensures that we always have enough space in which to - work, since the extracted arg is never larger than the input string. - - If the input is a null string (as opposed to a NULL pointer), then - buildarg returns an argv that has one arg, a null string. - - Argv is always kept terminated with a NULL arg pointer, so it can - be passed to freeargv at any time, or returned, as appropriate. -*/ - -char **buildargv (input) -char *input; -{ - char *arg; - char *copybuf; - int squote = 0; - int dquote = 0; - int bsquote = 0; - int argc = 0; - int maxargc = 0; - char **argv = NULL; - char **nargv; - - if (input != NULL) - { - copybuf = alloca (strlen (input) + 1); - /* Is a do{}while to always execute the loop once. Always return an - argv, even for null strings. See NOTES above, test case below. */ - do - { - /* Pick off argv[argc] */ - while (isspace (*input)) - { - input++; - } - if ((maxargc == 0) || (argc >= (maxargc - 1))) - { - /* argv needs initialization, or expansion */ - if (argv == NULL) - { - maxargc = INITIAL_MAXARGC; - nargv = (char **) malloc (maxargc * sizeof (char *)); - } - else - { - maxargc *= 2; - nargv = (char **) realloc (argv, maxargc * sizeof (char *)); - } - if (nargv == NULL) - { - if (argv != NULL) - { - freeargv (argv); - argv = NULL; - } - break; - } - argv = nargv; - argv[argc] = NULL; - } - /* Begin scanning arg */ - arg = copybuf; - while (*input != EOS) - { - if (isspace (*input) && !squote && !dquote && !bsquote) - { - break; - } - else - { - if (bsquote) - { - bsquote = 0; - *arg++ = *input; - } - else if (*input == '\\') - { - bsquote = 1; - } - else if (squote) - { - if (*input == '\'') - { - squote = 0; - } - else - { - *arg++ = *input; - } - } - else if (dquote) - { - if (*input == '"') - { - dquote = 0; - } - else - { - *arg++ = *input; - } - } - else - { - if (*input == '\'') - { - squote = 1; - } - else if (*input == '"') - { - dquote = 1; - } - else - { - *arg++ = *input; - } - } - input++; - } - } - *arg = EOS; - argv[argc] = strdup (copybuf); - if (argv[argc] == NULL) - { - freeargv (argv); - argv = NULL; - break; - } - argc++; - argv[argc] = NULL; - - while (isspace (*input)) - { - input++; - } - } - while (*input != EOS); - } - return (argv); -} - -#ifdef MAIN - -/* Simple little test driver. */ - -static char *tests[] = -{ - "a simple command line", - "arg 'foo' is single quoted", - "arg \"bar\" is double quoted", - "arg \"foo bar\" has embedded whitespace", - "arg 'Jack said \\'hi\\'' has single quotes", - "arg 'Jack said \\\"hi\\\"' has double quotes", - "a b c d e f g h i j k l m n o p q r s t u v w x y z 1 2 3 4 5 6 7 8 9", - - /* This should be expanded into only one argument. */ - "trailing-whitespace ", - - "", - NULL -}; - -main () -{ - char **argv; - char **test; - char **targs; - - for (test = tests; *test != NULL; test++) - { - printf ("buildargv(\"%s\")\n", *test); - if ((argv = buildargv (*test)) == NULL) - { - printf ("failed!\n\n"); - } - else - { - for (targs = argv; *targs != NULL; targs++) - { - printf ("\t\"%s\"\n", *targs); - } - printf ("\n"); - } - freeargv (argv); - } - -} - -#endif /* MAIN */ diff --git a/contrib/gdb/libiberty/atexit.c b/contrib/gdb/libiberty/atexit.c deleted file mode 100644 index 4463cb6950184..0000000000000 --- a/contrib/gdb/libiberty/atexit.c +++ /dev/null @@ -1,14 +0,0 @@ -/* Wrapper to implement ANSI C's atexit using SunOS's on_exit. */ -/* This function is in the public domain. --Mike Stump. */ - -#ifndef NEED_on_exit -int -atexit(f) - void (*f)(); -{ - /* If the system doesn't provide a definition for atexit, use on_exit - if the system provides that. */ - on_exit (f, 0); - return 0; -} -#endif diff --git a/contrib/gdb/libiberty/basename.c b/contrib/gdb/libiberty/basename.c deleted file mode 100644 index 689b0c2d39a06..0000000000000 --- a/contrib/gdb/libiberty/basename.c +++ /dev/null @@ -1,43 +0,0 @@ -/* Return the basename of a pathname. - This file is in the public domain. */ - -/* -NAME - basename -- return pointer to last component of a pathname - -SYNOPSIS - char *basename (const char *name) - -DESCRIPTION - Given a pointer to a string containing a typical pathname - (/usr/src/cmd/ls/ls.c for example), returns a pointer to the - last component of the pathname ("ls.c" in this case). - -BUGS - Presumes a UNIX style path with UNIX style separators. -*/ - -#include "ansidecl.h" -#include "libiberty.h" - -#include "config.h" - -#ifdef NEED_basename - -char * -basename (name) - const char *name; -{ - const char *base = name; - - while (*name) - { - if (*name++ == '/') - { - base = name; - } - } - return (char *) base; -} - -#endif diff --git a/contrib/gdb/libiberty/bcmp.c b/contrib/gdb/libiberty/bcmp.c deleted file mode 100644 index 11e4417db159e..0000000000000 --- a/contrib/gdb/libiberty/bcmp.c +++ /dev/null @@ -1,49 +0,0 @@ -/* bcmp - This function is in the public domain. */ - -/* - -NAME - - bcmp -- compare two memory regions - -SYNOPSIS - - int bcmp (char *from, char *to, int count) - -DESCRIPTION - - Compare two memory regions and return zero if they are identical, - non-zero otherwise. If count is zero, return zero. - -NOTES - - No guarantee is made about the non-zero returned value. In - particular, the results may be signficantly different than - strcmp(), where the return value is guaranteed to be less than, - equal to, or greater than zero, according to lexicographical - sorting of the compared regions. - -BUGS - -*/ - - -int -bcmp (from, to, count) - char *from, *to; - int count; -{ - int rtnval = 0; - - while (count-- > 0) - { - if (*from++ != *to++) - { - rtnval = 1; - break; - } - } - return (rtnval); -} - diff --git a/contrib/gdb/libiberty/bcopy.c b/contrib/gdb/libiberty/bcopy.c deleted file mode 100644 index b655363d879e5..0000000000000 --- a/contrib/gdb/libiberty/bcopy.c +++ /dev/null @@ -1,35 +0,0 @@ -/* bcopy -- copy memory regions of arbitary length - -NAME - bcopy -- copy memory regions of arbitrary length - -SYNOPSIS - void bcopy (char *in, char *out, int length) - -DESCRIPTION - Copy LENGTH bytes from memory region pointed to by IN to memory - region pointed to by OUT. - -BUGS - Significant speed improvements can be made in some cases by - implementing copies of multiple bytes simultaneously, or unrolling - the copy loop. - -*/ - -void -bcopy (src, dest, len) - register char *src, *dest; - int len; -{ - if (dest < src) - while (len--) - *dest++ = *src++; - else - { - char *lasts = src + (len-1); - char *lastd = dest + (len-1); - while (len--) - *(char *)lastd-- = *(char *)lasts--; - } -} diff --git a/contrib/gdb/libiberty/bzero.c b/contrib/gdb/libiberty/bzero.c deleted file mode 100644 index d01644b7f4b8a..0000000000000 --- a/contrib/gdb/libiberty/bzero.c +++ /dev/null @@ -1,31 +0,0 @@ -/* Portable version of bzero for systems without it. - This function is in the public domain. */ - -/* -NAME - bzero -- zero the contents of a specified memory region - -SYNOPSIS - void bzero (char *to, int count) - -DESCRIPTION - Zero COUNT bytes of memory pointed to by TO. - -BUGS - Significant speed enhancements may be made in some environments - by zeroing more than a single byte at a time, or by unrolling the - loop. - -*/ - - -void -bzero (to, count) - char *to; - int count; -{ - while (count-- > 0) - { - *to++ = 0; - } -} diff --git a/contrib/gdb/libiberty/clock.c b/contrib/gdb/libiberty/clock.c deleted file mode 100644 index b60de1657a456..0000000000000 --- a/contrib/gdb/libiberty/clock.c +++ /dev/null @@ -1,73 +0,0 @@ -/* ANSI-compatible clock function. - Copyright (C) 1994, 1995 Free Software Foundation, Inc. - -This file is part of the libiberty library. This library 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 2, or (at your option) -any later version. - -This library 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 GNU CC; see the file COPYING. If not, write to -the Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - -As a special exception, if you link this library with files -compiled with a GNU compiler to produce an executable, this does not cause -the resulting executable to be covered by the GNU General Public License. -This exception does not however invalidate any other reasons why -the executable file might be covered by the GNU General Public License. */ - -#ifdef HAVE_GETRUSAGE -#include <sys/time.h> -#include <sys/resource.h> -#endif - -#ifdef HAVE_TIMES -#ifndef NO_SYS_PARAM_H -#include <sys/param.h> -#endif -#include <sys/times.h> -#endif - -/* FIXME: should be able to declare as clock_t. */ - -long -clock () -{ -#ifdef HAVE_GETRUSAGE - struct rusage rusage; - - getrusage (0, &rusage); - return (rusage.ru_utime.tv_sec * 1000000 + rusage.ru_utime.tv_usec - + rusage.ru_stime.tv_sec * 1000000 + rusage.ru_stime.tv_usec); -#else -#ifdef HAVE_TIMES - struct tms tms; - - times (&tms); - return (tms.tms_utime + tms.tms_stime) * (1000000 / HZ); -#else -#ifdef VMS - struct - { - int proc_user_time; - int proc_system_time; - int child_user_time; - int child_system_time; - } vms_times; - - times (&vms_times); - return (vms_times.proc_user_time + vms_times.proc_system_time) * 10000; -#else - /* A fallback, if nothing else available. */ - return 0; -#endif /* VMS */ -#endif /* HAVE_TIMES */ -#endif /* HAVE_GETRUSAGE */ -} - diff --git a/contrib/gdb/libiberty/concat.c b/contrib/gdb/libiberty/concat.c deleted file mode 100644 index 5b132c85764f8..0000000000000 --- a/contrib/gdb/libiberty/concat.c +++ /dev/null @@ -1,167 +0,0 @@ -/* Concatenate variable number of strings. - Copyright (C) 1991, 1994 Free Software Foundation, Inc. - Written by Fred Fish @ Cygnus Support - -This file is part of the libiberty library. -Libiberty is free software; you can redistribute it and/or -modify it under the terms of the GNU Library General Public -License as published by the Free Software Foundation; either -version 2 of the License, or (at your option) any later version. - -Libiberty 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 -Library General Public License for more details. - -You should have received a copy of the GNU Library General Public -License along with libiberty; see the file COPYING.LIB. If -not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, -Boston, MA 02111-1307, USA. */ - - -/* - -NAME - - concat -- concatenate a variable number of strings - -SYNOPSIS - - #include <varargs.h> - - char *concat (s1, s2, s3, ..., NULL) - -DESCRIPTION - - Concatenate a variable number of strings and return the result - in freshly malloc'd memory. - - Returns NULL if insufficient memory is available. The argument - list is terminated by the first NULL pointer encountered. Pointers - to empty strings are ignored. - -NOTES - - This function uses xmalloc() which is expected to be a front end - function to malloc() that deals with low memory situations. In - typical use, if malloc() returns NULL then xmalloc() diverts to an - error handler routine which never returns, and thus xmalloc will - never return a NULL pointer. If the client application wishes to - deal with low memory situations itself, it should supply an xmalloc - that just directly invokes malloc and blindly returns whatever - malloc returns. -*/ - - -#include "ansidecl.h" -#include "libiberty.h" - -#ifdef ANSI_PROTOTYPES -#include <stdarg.h> -#else -#include <varargs.h> -#endif - -#ifdef __STDC__ -#include <stddef.h> -extern size_t strlen (const char *s); -#else -extern int strlen (); -#endif - -#define NULLP (char *)0 - -/* VARARGS */ -#ifdef ANSI_PROTOTYPES -char * -concat (const char *first, ...) -#else -char * -concat (va_alist) - va_dcl -#endif -{ - register int length; - register char *newstr; - register char *end; - register const char *arg; - va_list args; -#ifndef ANSI_PROTOTYPES - const char *first; -#endif - - /* First compute the size of the result and get sufficient memory. */ - -#ifdef ANSI_PROTOTYPES - va_start (args, first); -#else - va_start (args); - first = va_arg (args, const char *); -#endif - - if (first == NULLP) - length = 0; - else - { - length = strlen (first); - while ((arg = va_arg (args, const char *)) != NULLP) - { - length += strlen (arg); - } - } - newstr = (char *) xmalloc (length + 1); - va_end (args); - - /* Now copy the individual pieces to the result string. */ - - if (newstr != NULLP) - { -#ifdef ANSI_PROTOTYPES - va_start (args, first); -#else - va_start (args); - first = va_arg (args, const char *); -#endif - end = newstr; - if (first != NULLP) - { - arg = first; - while (*arg) - { - *end++ = *arg++; - } - while ((arg = va_arg (args, const char *)) != NULLP) - { - while (*arg) - { - *end++ = *arg++; - } - } - } - *end = '\000'; - va_end (args); - } - - return (newstr); -} - -#ifdef MAIN - -/* Simple little test driver. */ - -#include <stdio.h> - -int -main () -{ - printf ("\"\" = \"%s\"\n", concat (NULLP)); - printf ("\"a\" = \"%s\"\n", concat ("a", NULLP)); - printf ("\"ab\" = \"%s\"\n", concat ("a", "b", NULLP)); - printf ("\"abc\" = \"%s\"\n", concat ("a", "b", "c", NULLP)); - printf ("\"abcd\" = \"%s\"\n", concat ("ab", "cd", NULLP)); - printf ("\"abcde\" = \"%s\"\n", concat ("ab", "c", "de", NULLP)); - printf ("\"abcdef\" = \"%s\"\n", concat ("", "a", "", "bcd", "ef", NULLP)); - return 0; -} - -#endif diff --git a/contrib/gdb/libiberty/config.table b/contrib/gdb/libiberty/config.table deleted file mode 100644 index 1b67dd5ae8833..0000000000000 --- a/contrib/gdb/libiberty/config.table +++ /dev/null @@ -1,63 +0,0 @@ -case "${host}" in - rs6000-ibm-aix3.1 | rs6000-ibm-aix) - frag=mh-aix - files=${xsrcdir}alloca-botch.h ;; - *-ibm-aix*) files=${xsrcdir}alloca-botch.h ;; - arm-*-riscix*) frag=mh-riscix ;; - m68k-apollo-bsd*) frag=mh-a68bsd ;; - m68k-apollo-sysv*) frag=mh-apollo68 ;; - i[345]86-ncr-sysv4*) frag=mh-ncr3000 ;; - *-*-cxux7*) frag=mh-cxux7 ;; - *-*-lynxos*) frag=mh-lynxos ;; - *-*-dgux*) frag=mh-sysv ;; - hppa*-hp-bsd*) frag=mh-hpbsd ;; - *-*-hpux*) frag=mh-hpux ;; - *-*-hiux*) frag=mh-hpux ;; - *-*-irix4*) frag=mh-irix4 ;; - *-*-irix*) frag=mh-sysv ;; - *-*-m88kbcs*) frag=mh-sysv ;; - *-*-solaris2*) frag=mh-sysv4 ;; - *-*-sysv4*) frag=mh-sysv4 ;; - *-*-sysv*) frag=mh-sysv ;; - *-*-go32) frag=mh-go32 ;; - - *-*-vxworks5*) - # VxWorks 5 needs special action, because the usual - # autoconfiguration scheme does not work. - frag=mt-vxworks5 - ;; -esac - -# Try to handle funky case of solaris 2 -> sun 4. -case "${host}" in - sparc-sun-sunos4.1.3) - if [ "${with_cross_host}" != "${host}" ] ; then - frag=mt-sunos4 - fi - ;; -esac - -frags=$frag - -# If they didn't specify --enable-shared, don't generate shared libs. -if [ "${enable_shared}" = "yes" ]; then - case "${host}" in - hppa*-*-*) frags="${frags} ../../config/mh-papic" ;; - i[345]86-*-*) frags="${frags} ../../config/mh-x86pic" ;; - *-*-*) frags="${frags} ../../config/mh-${host_cpu}pic" ;; - esac -fi - -echo "# Warning: this fragment is automatically generated" > temp-frag - -for frag in ${frags}; do - frag=${srcdir}/${xsrcdir}config/$frag - if [ -f ${frag} ]; then - echo "Appending ${frag} to xhost-mkfrag" - echo "# Following fragment copied from ${frag}" >> temp-frag - cat ${frag} >> temp-frag - fi -done - -frag=xhost-mkfrag -${moveifchange} temp-frag xhost-mkfrag diff --git a/contrib/gdb/libiberty/config/mh-a68bsd b/contrib/gdb/libiberty/config/mh-a68bsd deleted file mode 100644 index 3c5a237e60ba8..0000000000000 --- a/contrib/gdb/libiberty/config/mh-a68bsd +++ /dev/null @@ -1,2 +0,0 @@ -RANLIB=ranlib -CC= cc -A ansi -A runtype,any -A systype,any -U__STDC__ diff --git a/contrib/gdb/libiberty/config/mh-aix b/contrib/gdb/libiberty/config/mh-aix deleted file mode 100644 index c7b848d976aad..0000000000000 --- a/contrib/gdb/libiberty/config/mh-aix +++ /dev/null @@ -1,10 +0,0 @@ -HDEFINES = -D__IEEE_BIG_ENDIAN -RANLIB=true -INSTALL=cp - -# Most releases of AIX 3.1 include an incorrect internal version of copysign -# in libc.a for use by some libc public functions including modf. The public -# version of copysign in libm.a is usable. For the sake of libg++ (which -# uses modf), we add copysign here. Supposedly, this problem is fixed in AIX -# 3.1.8 and above, including all releases of AIX 3.2. -EXTRA_OFILES = copysign.o diff --git a/contrib/gdb/libiberty/config/mh-apollo68 b/contrib/gdb/libiberty/config/mh-apollo68 deleted file mode 100644 index 651770ce31cd1..0000000000000 --- a/contrib/gdb/libiberty/config/mh-apollo68 +++ /dev/null @@ -1,2 +0,0 @@ -RANLIB=true -CC= cc -A ansi -A runtype,any -A systype,any -U__STDC__ diff --git a/contrib/gdb/libiberty/config/mh-cxux7 b/contrib/gdb/libiberty/config/mh-cxux7 deleted file mode 100644 index 6d4d30bf46ff4..0000000000000 --- a/contrib/gdb/libiberty/config/mh-cxux7 +++ /dev/null @@ -1,3 +0,0 @@ -HDEFINES = -DHAVE_SYSCONF -DHARRIS_FLOAT_FORMAT -RANLIB=true -INSTALL = cp diff --git a/contrib/gdb/libiberty/config/mh-go32 b/contrib/gdb/libiberty/config/mh-go32 deleted file mode 100644 index 7c9fe4fa0bf00..0000000000000 --- a/contrib/gdb/libiberty/config/mh-go32 +++ /dev/null @@ -1,4 +0,0 @@ -HDEFINES=-DHAVE_GETRUSAGE -CC=i386-go32-gcc -O2 -fno-omit-frame-pointer -AR=i386-go32-ar -RANLIB=i386-go32-ranlib diff --git a/contrib/gdb/libiberty/config/mh-hpbsd b/contrib/gdb/libiberty/config/mh-hpbsd deleted file mode 100644 index ce11dcd6ac980..0000000000000 --- a/contrib/gdb/libiberty/config/mh-hpbsd +++ /dev/null @@ -1,2 +0,0 @@ -# HPPA hosts using BSD -RANLIB=true diff --git a/contrib/gdb/libiberty/config/mh-irix4 b/contrib/gdb/libiberty/config/mh-irix4 deleted file mode 100644 index ace7678271221..0000000000000 --- a/contrib/gdb/libiberty/config/mh-irix4 +++ /dev/null @@ -1,4 +0,0 @@ -CC = cc -cckr -RANLIB = true -INSTALL = cp -EXTRA_OFILES = alloca.o diff --git a/contrib/gdb/libiberty/config/mh-lynxos b/contrib/gdb/libiberty/config/mh-lynxos deleted file mode 100644 index 2f22110e880c1..0000000000000 --- a/contrib/gdb/libiberty/config/mh-lynxos +++ /dev/null @@ -1 +0,0 @@ -HDEFINES = -DLOSING_SYS_SIGLIST diff --git a/contrib/gdb/libiberty/config/mh-ncr3000 b/contrib/gdb/libiberty/config/mh-ncr3000 deleted file mode 100644 index 3a45c22b12812..0000000000000 --- a/contrib/gdb/libiberty/config/mh-ncr3000 +++ /dev/null @@ -1,19 +0,0 @@ -# Host configuration file for an NCR 3000 (i486/SVR4) system. - -# The NCR 3000 ships with a MetaWare compiler installed as /bin/cc. -# This compiler not only emits obnoxious copyright messages every time -# you run it, but it chokes and dies on a whole bunch of GNU source -# files. Default to using the AT&T compiler installed in /usr/ccs/ATT/cc. -# Unfortunately though, the AT&T compiler sometimes generates code that -# the assembler barfs on if -g is used, so disable it by default as well. -CC = /usr/ccs/ATT/cc -CFLAGS = - -RANLIB = true - -# The /usr/ucb/install program is incompatible (complains about unknown -# group staff). Use good old cp... -INSTALL = cp - -# The l flag generates a warning from the SVR4 archiver, remove it. -AR_FLAGS = cq diff --git a/contrib/gdb/libiberty/config/mh-riscix b/contrib/gdb/libiberty/config/mh-riscix deleted file mode 100644 index 0209279de56a0..0000000000000 --- a/contrib/gdb/libiberty/config/mh-riscix +++ /dev/null @@ -1,6 +0,0 @@ -# The native linker only reports the first undefined symbol if linking with a -# shared library. So build using gcc and link statically (this requires -# gcc 2.6.0 or above). - -ERRORS_CC = gcc -ERRORS_LDFLAGS = -static diff --git a/contrib/gdb/libiberty/config/mh-sysv b/contrib/gdb/libiberty/config/mh-sysv deleted file mode 100644 index eb102d5501089..0000000000000 --- a/contrib/gdb/libiberty/config/mh-sysv +++ /dev/null @@ -1 +0,0 @@ -RANLIB=true diff --git a/contrib/gdb/libiberty/config/mh-sysv4 b/contrib/gdb/libiberty/config/mh-sysv4 deleted file mode 100644 index 4d1aa3cd61d54..0000000000000 --- a/contrib/gdb/libiberty/config/mh-sysv4 +++ /dev/null @@ -1,3 +0,0 @@ -HDEFINES = -DHAVE_SYSCONF -RANLIB=true -INSTALL = cp diff --git a/contrib/gdb/libiberty/config/mt-sunos4 b/contrib/gdb/libiberty/config/mt-sunos4 deleted file mode 100644 index c25baa6ead68d..0000000000000 --- a/contrib/gdb/libiberty/config/mt-sunos4 +++ /dev/null @@ -1,2 +0,0 @@ -XTRAFLAGS = -isystem /s1/cygnus/dejagnu/sparc-sun-sunos4.1.3/include/ -LOADLIBES = -L/s1/cygnus/dejagnu/sparc-sun-sunos4.1.3/lib diff --git a/contrib/gdb/libiberty/config/mt-vxworks5 b/contrib/gdb/libiberty/config/mt-vxworks5 deleted file mode 100644 index f1a46d361ae2e..0000000000000 --- a/contrib/gdb/libiberty/config/mt-vxworks5 +++ /dev/null @@ -1,27 +0,0 @@ -# VxWorks 5.x target Makefile fragment. -# The autoconfiguration fails for a VxWorks target, because the -# libraries are actually on the target board, not in the file system. -# Therefore, we compute the dependencies by hand. - -HDEFINES = -DNO_SYS_PARAM_H -CONFIG_H = vxconfig.h -NEEDED_LIST = vxneeded-list - -vxconfig.h: Makefile - if [ -f ../newlib/Makefile ]; then \ - $(MAKE) $(FLAGS_TO_PASS) xconfig.h; \ - cp xconfig.h vxconfig.h; \ - else \ - echo "#define NEED_sys_nerr 1" >vxconfig.h; \ - echo "#define NEED_sys_errlist 1" >>vxconfig.h; \ - echo "#define NEED_sys_siglist 1" >>vxconfig.h; \ - echo "#define NEED_psignal 1" >>vxconfig.h; \ - fi - -vxneeded-list: Makefile - if [ -f ../newlib/Makefile ]; then \ - $(MAKE) $(FLAGS_TO_PASS) xneeded-list; \ - cp xneeded-list vxneeded-list; \ - else \ - echo getopt.o getpagesize.o insque.o random.o strcasecmp.o strncasecmp.o strdup.o vfork.o sigsetmask.o waitpid.o >vxneeded-list; \ - fi diff --git a/contrib/gdb/libiberty/configure.bat b/contrib/gdb/libiberty/configure.bat deleted file mode 100644 index ed33777174b37..0000000000000 --- a/contrib/gdb/libiberty/configure.bat +++ /dev/null @@ -1,15 +0,0 @@ -@echo off
-if "%1" == "h8/300" goto h8300
-
-echo Configuring libiberty for go32
-copy Makefile.dos Makefile
-echo #define NEED_sys_siglist 1 >> config.h
-echo #define NEED_psignal 1 >> config.h
-update alloca-normal.h alloca-conf.h
-goto exit
-
-:h8300
-echo Configuring libiberty for H8/300
-copy Makefile.dos Makefile
-
-:exit
diff --git a/contrib/gdb/libiberty/configure.in b/contrib/gdb/libiberty/configure.in deleted file mode 100644 index 84e4eac6c89e5..0000000000000 --- a/contrib/gdb/libiberty/configure.in +++ /dev/null @@ -1,77 +0,0 @@ -# This file is a shell script fragment that supplies the information -# necessary for a configure script to process the program in -# this directory. For more information, look at ../configure. - -configdirs= -srctrigger=getopt1.c -srcname="-liberty library" - -# per-host: - -files="alloca-norm.h" -links="alloca-conf.h" - -. ${srcdir}/config.table -host_makefile_frag=${frag} - -# per-target: - -# post-target: - -# If this is the target libiberty, check at compile time whether we are using -# newlib. If we are, we already know the files we need, since the linker -# will fail when run on some of the newlib targets. -if [ -n "${with_target_subdir}" ] ; then - cat > Makefile.tem <<'!EOF!' -CONFIG_H = xconfig.h -NEEDED_LIST = xneeded-list - -xconfig.h: Makefile - if [ -f ../newlib/Makefile ]; then \ - echo "#define NEED_sys_nerr 1" >xconfig.h; \ - echo "#define NEED_sys_errlist 1" >>xconfig.h; \ - echo "#define NEED_sys_siglist 1" >>xconfig.h; \ - echo "#define NEED_psignal 1" >>xconfig.h; \ - else \ - $(MAKE) $(FLAGS_TO_PASS) lconfig.h; \ - cp lconfig.h xconfig.h; \ - fi - -xneeded-list: Makefile - if [ -f ../newlib/Makefile ]; then \ - echo insque.o random.o strdup.o alloca.o >xneeded-list; \ - else \ - $(MAKE) $(FLAGS_TO_PASS) lneeded-list; \ - cp lneeded-list xneeded-list; \ - fi -!EOF! -sed -e "/^####/ r Makefile.tem" \ - -e '/INSTALL_DEST =/s/libdir/tooldir/' ${Makefile} > Makefile.tem3 -mv Makefile.tem3 ${Makefile} -rm -f Makefile.tem -fi - -# We need multilib support, but only if configuring for the target. -if [ -n "${with_target_subdir}" ] ; then - case ${srcdir} in - .) - if [ "${with_target_subdir}" != "." ] ; then - - # Set MULTISRCTOP to the value we need if we are not doing - # multilib. This will be overridden if --enable-multilib was - # used. - sed -e "s:^MULTISRCTOP[ ]*=.*$:MULTISRCTOP = ../:" \ - ${Makefile} > Makefile.tem - rm -f ${Makefile} - mv Makefile.tem ${Makefile} - - . ${srcdir}/${with_multisrctop}../../config-ml.in - else - . ${srcdir}/${with_multisrctop}../config-ml.in - fi - ;; - *) - . ${srcdir}/../config-ml.in - ;; - esac -fi diff --git a/contrib/gdb/libiberty/copysign.c b/contrib/gdb/libiberty/copysign.c deleted file mode 100644 index 0b5f8c3d9df86..0000000000000 --- a/contrib/gdb/libiberty/copysign.c +++ /dev/null @@ -1,140 +0,0 @@ -#include <ansidecl.h> - -#ifdef __IEEE_BIG_ENDIAN - -typedef union -{ - double value; - struct - { - unsigned int sign : 1; - unsigned int exponent: 11; - unsigned int fraction0:4; - unsigned int fraction1:16; - unsigned int fraction2:16; - unsigned int fraction3:16; - - } number; - struct - { - unsigned int sign : 1; - unsigned int exponent: 11; - unsigned int quiet:1; - unsigned int function0:3; - unsigned int function1:16; - unsigned int function2:16; - unsigned int function3:16; - } nan; - struct - { - unsigned long msw; - unsigned long lsw; - } parts; - long aslong[2]; -} __ieee_double_shape_type; - -#endif - -#ifdef __IEEE_LITTLE_ENDIAN - -typedef union -{ - double value; - struct - { -#ifdef __SMALL_BITFIELDS - unsigned int fraction3:16; - unsigned int fraction2:16; - unsigned int fraction1:16; - unsigned int fraction0: 4; -#else - unsigned int fraction1:32; - unsigned int fraction0:20; -#endif - unsigned int exponent :11; - unsigned int sign : 1; - } number; - struct - { -#ifdef __SMALL_BITFIELDS - unsigned int function3:16; - unsigned int function2:16; - unsigned int function1:16; - unsigned int function0:3; -#else - unsigned int function1:32; - unsigned int function0:19; -#endif - unsigned int quiet:1; - unsigned int exponent: 11; - unsigned int sign : 1; - } nan; - struct - { - unsigned long lsw; - unsigned long msw; - } parts; - - long aslong[2]; - -} __ieee_double_shape_type; - -#endif - -#ifdef __IEEE_BIG_ENDIAN -typedef union -{ - float value; - struct - { - unsigned int sign : 1; - unsigned int exponent: 8; - unsigned int fraction0: 7; - unsigned int fraction1: 16; - } number; - struct - { - unsigned int sign:1; - unsigned int exponent:8; - unsigned int quiet:1; - unsigned int function0:6; - unsigned int function1:16; - } nan; - long p1; - -} __ieee_float_shape_type; -#endif - -#ifdef __IEEE_LITTLE_ENDIAN -typedef union -{ - float value; - struct - { - unsigned int fraction0: 7; - unsigned int fraction1: 16; - unsigned int exponent: 8; - unsigned int sign : 1; - } number; - struct - { - unsigned int function1:16; - unsigned int function0:6; - unsigned int quiet:1; - unsigned int exponent:8; - unsigned int sign:1; - } nan; - long p1; - -} __ieee_float_shape_type; -#endif - - -double DEFUN(copysign, (x, y), double x AND double y) -{ - __ieee_double_shape_type a,b; - b.value = y; - a.value = x; - a.number.sign =b.number.sign; - return a.value; -} diff --git a/contrib/gdb/libiberty/cplus-dem.c b/contrib/gdb/libiberty/cplus-dem.c deleted file mode 100644 index a7f8680227892..0000000000000 --- a/contrib/gdb/libiberty/cplus-dem.c +++ /dev/null @@ -1,3019 +0,0 @@ -/* Demangler for GNU C++ - Copyright 1989, 1991, 1994, 1995, 1996 Free Software Foundation, Inc. - Written by James Clark (jjc@jclark.uucp) - Rewritten by Fred Fish (fnf@cygnus.com) for ARM and Lucid demangling - -This file is part of the libiberty library. -Libiberty is free software; you can redistribute it and/or -modify it under the terms of the GNU Library General Public -License as published by the Free Software Foundation; either -version 2 of the License, or (at your option) any later version. - -Libiberty 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 -Library General Public License for more details. - -You should have received a copy of the GNU Library General Public -License along with libiberty; see the file COPYING.LIB. If -not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, -Boston, MA 02111-1307, USA. */ - -/* This file exports two functions; cplus_mangle_opname and cplus_demangle. - - This file imports xmalloc and xrealloc, which are like malloc and - realloc except that they generate a fatal error if there is no - available memory. */ - -#include <ctype.h> -#include <string.h> -#include <stdio.h> - -#include <demangle.h> -#undef CURRENT_DEMANGLING_STYLE -#define CURRENT_DEMANGLING_STYLE work->options - -extern char *xmalloc PARAMS((unsigned)); -extern char *xrealloc PARAMS((char *, unsigned)); - -char * -mystrstr (s1, s2) - char *s1, *s2; -{ - register char *p = s1; - register int len = strlen (s2); - - for (; (p = strchr (p, *s2)) != 0; p++) - { - if (strncmp (p, s2, len) == 0) - { - return (p); - } - } - return (0); -} - -/* In order to allow a single demangler executable to demangle strings - using various common values of CPLUS_MARKER, as well as any specific - one set at compile time, we maintain a string containing all the - commonly used ones, and check to see if the marker we are looking for - is in that string. CPLUS_MARKER is usually '$' on systems where the - assembler can deal with that. Where the assembler can't, it's usually - '.' (but on many systems '.' is used for other things). We put the - current defined CPLUS_MARKER first (which defaults to '$'), followed - by the next most common value, followed by an explicit '$' in case - the value of CPLUS_MARKER is not '$'. - - We could avoid this if we could just get g++ to tell us what the actual - cplus marker character is as part of the debug information, perhaps by - ensuring that it is the character that terminates the gcc<n>_compiled - marker symbol (FIXME). */ - -#if !defined (CPLUS_MARKER) -#define CPLUS_MARKER '$' -#endif - -enum demangling_styles current_demangling_style = gnu_demangling; - -static char cplus_markers[] = { CPLUS_MARKER, '.', '$', '\0' }; - -void -set_cplus_marker_for_demangling (ch) - int ch; -{ - cplus_markers[0] = ch; -} - -/* Stuff that is shared between sub-routines. - * Using a shared structure allows cplus_demangle to be reentrant. */ - -struct work_stuff -{ - int options; - char **typevec; - int ntypes; - int typevec_size; - int constructor; - int destructor; - int static_type; /* A static member function */ - int const_type; /* A const member function */ -}; - -#define PRINT_ANSI_QUALIFIERS (work -> options & DMGL_ANSI) -#define PRINT_ARG_TYPES (work -> options & DMGL_PARAMS) - -static const struct optable -{ - const char *in; - const char *out; - int flags; -} optable[] = { - {"nw", " new", DMGL_ANSI}, /* new (1.92, ansi) */ - {"dl", " delete", DMGL_ANSI}, /* new (1.92, ansi) */ - {"new", " new", 0}, /* old (1.91, and 1.x) */ - {"delete", " delete", 0}, /* old (1.91, and 1.x) */ - {"vn", " new []", DMGL_ANSI}, /* GNU, pending ansi */ - {"vd", " delete []", DMGL_ANSI}, /* GNU, pending ansi */ - {"as", "=", DMGL_ANSI}, /* ansi */ - {"ne", "!=", DMGL_ANSI}, /* old, ansi */ - {"eq", "==", DMGL_ANSI}, /* old, ansi */ - {"ge", ">=", DMGL_ANSI}, /* old, ansi */ - {"gt", ">", DMGL_ANSI}, /* old, ansi */ - {"le", "<=", DMGL_ANSI}, /* old, ansi */ - {"lt", "<", DMGL_ANSI}, /* old, ansi */ - {"plus", "+", 0}, /* old */ - {"pl", "+", DMGL_ANSI}, /* ansi */ - {"apl", "+=", DMGL_ANSI}, /* ansi */ - {"minus", "-", 0}, /* old */ - {"mi", "-", DMGL_ANSI}, /* ansi */ - {"ami", "-=", DMGL_ANSI}, /* ansi */ - {"mult", "*", 0}, /* old */ - {"ml", "*", DMGL_ANSI}, /* ansi */ - {"amu", "*=", DMGL_ANSI}, /* ansi (ARM/Lucid) */ - {"aml", "*=", DMGL_ANSI}, /* ansi (GNU/g++) */ - {"convert", "+", 0}, /* old (unary +) */ - {"negate", "-", 0}, /* old (unary -) */ - {"trunc_mod", "%", 0}, /* old */ - {"md", "%", DMGL_ANSI}, /* ansi */ - {"amd", "%=", DMGL_ANSI}, /* ansi */ - {"trunc_div", "/", 0}, /* old */ - {"dv", "/", DMGL_ANSI}, /* ansi */ - {"adv", "/=", DMGL_ANSI}, /* ansi */ - {"truth_andif", "&&", 0}, /* old */ - {"aa", "&&", DMGL_ANSI}, /* ansi */ - {"truth_orif", "||", 0}, /* old */ - {"oo", "||", DMGL_ANSI}, /* ansi */ - {"truth_not", "!", 0}, /* old */ - {"nt", "!", DMGL_ANSI}, /* ansi */ - {"postincrement","++", 0}, /* old */ - {"pp", "++", DMGL_ANSI}, /* ansi */ - {"postdecrement","--", 0}, /* old */ - {"mm", "--", DMGL_ANSI}, /* ansi */ - {"bit_ior", "|", 0}, /* old */ - {"or", "|", DMGL_ANSI}, /* ansi */ - {"aor", "|=", DMGL_ANSI}, /* ansi */ - {"bit_xor", "^", 0}, /* old */ - {"er", "^", DMGL_ANSI}, /* ansi */ - {"aer", "^=", DMGL_ANSI}, /* ansi */ - {"bit_and", "&", 0}, /* old */ - {"ad", "&", DMGL_ANSI}, /* ansi */ - {"aad", "&=", DMGL_ANSI}, /* ansi */ - {"bit_not", "~", 0}, /* old */ - {"co", "~", DMGL_ANSI}, /* ansi */ - {"call", "()", 0}, /* old */ - {"cl", "()", DMGL_ANSI}, /* ansi */ - {"alshift", "<<", 0}, /* old */ - {"ls", "<<", DMGL_ANSI}, /* ansi */ - {"als", "<<=", DMGL_ANSI}, /* ansi */ - {"arshift", ">>", 0}, /* old */ - {"rs", ">>", DMGL_ANSI}, /* ansi */ - {"ars", ">>=", DMGL_ANSI}, /* ansi */ - {"component", "->", 0}, /* old */ - {"pt", "->", DMGL_ANSI}, /* ansi; Lucid C++ form */ - {"rf", "->", DMGL_ANSI}, /* ansi; ARM/GNU form */ - {"indirect", "*", 0}, /* old */ - {"method_call", "->()", 0}, /* old */ - {"addr", "&", 0}, /* old (unary &) */ - {"array", "[]", 0}, /* old */ - {"vc", "[]", DMGL_ANSI}, /* ansi */ - {"compound", ", ", 0}, /* old */ - {"cm", ", ", DMGL_ANSI}, /* ansi */ - {"cond", "?:", 0}, /* old */ - {"cn", "?:", DMGL_ANSI}, /* pseudo-ansi */ - {"max", ">?", 0}, /* old */ - {"mx", ">?", DMGL_ANSI}, /* pseudo-ansi */ - {"min", "<?", 0}, /* old */ - {"mn", "<?", DMGL_ANSI}, /* pseudo-ansi */ - {"nop", "", 0}, /* old (for operator=) */ - {"rm", "->*", DMGL_ANSI} /* ansi */ -}; - - -typedef struct string /* Beware: these aren't required to be */ -{ /* '\0' terminated. */ - char *b; /* pointer to start of string */ - char *p; /* pointer after last character */ - char *e; /* pointer after end of allocated space */ -} string; - -#define STRING_EMPTY(str) ((str) -> b == (str) -> p) -#define PREPEND_BLANK(str) {if (!STRING_EMPTY(str)) \ - string_prepend(str, " ");} -#define APPEND_BLANK(str) {if (!STRING_EMPTY(str)) \ - string_append(str, " ");} - -#define ARM_VTABLE_STRING "__vtbl__" /* Lucid/ARM virtual table prefix */ -#define ARM_VTABLE_STRLEN 8 /* strlen (ARM_VTABLE_STRING) */ - -/* Prototypes for local functions */ - -static char * -mop_up PARAMS ((struct work_stuff *, string *, int)); - -#if 0 -static int -demangle_method_args PARAMS ((struct work_stuff *work, const char **, string *)); -#endif - -static int -demangle_template PARAMS ((struct work_stuff *work, const char **, string *, - string *)); - -static int -demangle_qualified PARAMS ((struct work_stuff *, const char **, string *, - int, int)); - -static int -demangle_class PARAMS ((struct work_stuff *, const char **, string *)); - -static int -demangle_fund_type PARAMS ((struct work_stuff *, const char **, string *)); - -static int -demangle_signature PARAMS ((struct work_stuff *, const char **, string *)); - -static int -demangle_prefix PARAMS ((struct work_stuff *, const char **, string *)); - -static int -gnu_special PARAMS ((struct work_stuff *, const char **, string *)); - -static int -arm_special PARAMS ((struct work_stuff *, const char **, string *)); - -static void -string_need PARAMS ((string *, int)); - -static void -string_delete PARAMS ((string *)); - -static void -string_init PARAMS ((string *)); - -static void -string_clear PARAMS ((string *)); - -#if 0 -static int -string_empty PARAMS ((string *)); -#endif - -static void -string_append PARAMS ((string *, const char *)); - -static void -string_appends PARAMS ((string *, string *)); - -static void -string_appendn PARAMS ((string *, const char *, int)); - -static void -string_prepend PARAMS ((string *, const char *)); - -static void -string_prependn PARAMS ((string *, const char *, int)); - -static int -get_count PARAMS ((const char **, int *)); - -static int -consume_count PARAMS ((const char **)); - -static int -demangle_args PARAMS ((struct work_stuff *, const char **, string *)); - -static int -do_type PARAMS ((struct work_stuff *, const char **, string *)); - -static int -do_arg PARAMS ((struct work_stuff *, const char **, string *)); - -static void -demangle_function_name PARAMS ((struct work_stuff *, const char **, string *, - const char *)); - -static void -remember_type PARAMS ((struct work_stuff *, const char *, int)); - -static void -forget_types PARAMS ((struct work_stuff *)); - -static void -string_prepends PARAMS ((string *, string *)); - -/* Translate count to integer, consuming tokens in the process. - Conversion terminates on the first non-digit character. - Trying to consume something that isn't a count results in - no consumption of input and a return of 0. */ - -static int -consume_count (type) - const char **type; -{ - int count = 0; - - while (isdigit (**type)) - { - count *= 10; - count += **type - '0'; - (*type)++; - } - return (count); -} - -int -cplus_demangle_opname (opname, result, options) - const char *opname; - char *result; - int options; -{ - int len, i, len1, ret; - string type; - struct work_stuff work[1]; - const char *tem; - - len = strlen(opname); - result[0] = '\0'; - ret = 0; - work->options = options; - - if (opname[0] == '_' && opname[1] == '_' - && opname[2] == 'o' && opname[3] == 'p') - { - /* ANSI. */ - /* type conversion operator. */ - tem = opname + 4; - if (do_type (work, &tem, &type)) - { - strcat (result, "operator "); - strncat (result, type.b, type.p - type.b); - string_delete (&type); - ret = 1; - } - } - else if (opname[0] == '_' && opname[1] == '_' - && opname[2] >= 'a' && opname[2] <= 'z' - && opname[3] >= 'a' && opname[3] <= 'z') - { - if (opname[4] == '\0') - { - /* Operator. */ - for (i = 0; i < sizeof (optable) / sizeof (optable[0]); i++) - { - if (strlen (optable[i].in) == 2 - && memcmp (optable[i].in, opname + 2, 2) == 0) - { - strcat (result, "operator"); - strcat (result, optable[i].out); - ret = 1; - break; - } - } - } - else - { - if (opname[2] == 'a' && opname[5] == '\0') - { - /* Assignment. */ - for (i = 0; i < sizeof (optable) / sizeof (optable[0]); i++) - { - if (strlen (optable[i].in) == 3 - && memcmp (optable[i].in, opname + 2, 3) == 0) - { - strcat (result, "operator"); - strcat (result, optable[i].out); - ret = 1; - break; - } - } - } - } - } - else if (len >= 3 - && opname[0] == 'o' - && opname[1] == 'p' - && strchr (cplus_markers, opname[2]) != NULL) - { - /* see if it's an assignment expression */ - if (len >= 10 /* op$assign_ */ - && memcmp (opname + 3, "assign_", 7) == 0) - { - for (i = 0; i < sizeof (optable) / sizeof (optable[0]); i++) - { - len1 = len - 10; - if (strlen (optable[i].in) == len1 - && memcmp (optable[i].in, opname + 10, len1) == 0) - { - strcat (result, "operator"); - strcat (result, optable[i].out); - strcat (result, "="); - ret = 1; - break; - } - } - } - else - { - for (i = 0; i < sizeof (optable) / sizeof (optable[0]); i++) - { - len1 = len - 3; - if (strlen (optable[i].in) == len1 - && memcmp (optable[i].in, opname + 3, len1) == 0) - { - strcat (result, "operator"); - strcat (result, optable[i].out); - ret = 1; - break; - } - } - } - } - else if (len >= 5 && memcmp (opname, "type", 4) == 0 - && strchr (cplus_markers, opname[4]) != NULL) - { - /* type conversion operator */ - tem = opname + 5; - if (do_type (work, &tem, &type)) - { - strcat (result, "operator "); - strncat (result, type.b, type.p - type.b); - string_delete (&type); - ret = 1; - } - } - return ret; - -} -/* Takes operator name as e.g. "++" and returns mangled - operator name (e.g. "postincrement_expr"), or NULL if not found. - - If OPTIONS & DMGL_ANSI == 1, return the ANSI name; - if OPTIONS & DMGL_ANSI == 0, return the old GNU name. */ - -const char * -cplus_mangle_opname (opname, options) - const char *opname; - int options; -{ - int i; - int len; - - len = strlen (opname); - for (i = 0; i < sizeof (optable) / sizeof (optable[0]); i++) - { - if (strlen (optable[i].out) == len - && (options & DMGL_ANSI) == (optable[i].flags & DMGL_ANSI) - && memcmp (optable[i].out, opname, len) == 0) - return optable[i].in; - } - return (0); -} - -/* check to see whether MANGLED can match TEXT in the first TEXT_LEN - characters. */ - -int cplus_match (mangled, text, text_len) - const char *mangled; - char *text; - int text_len; -{ - if (strncmp (mangled, text, text_len) != 0) { - return(0); /* cannot match either */ - } else { - return(1); /* matches mangled, may match demangled */ - } -} - -/* char *cplus_demangle (const char *mangled, int options) - - If MANGLED is a mangled function name produced by GNU C++, then - a pointer to a malloced string giving a C++ representation - of the name will be returned; otherwise NULL will be returned. - It is the caller's responsibility to free the string which - is returned. - - The OPTIONS arg may contain one or more of the following bits: - - DMGL_ANSI ANSI qualifiers such as `const' and `void' are - included. - DMGL_PARAMS Function parameters are included. - - For example, - - cplus_demangle ("foo__1Ai", DMGL_PARAMS) => "A::foo(int)" - cplus_demangle ("foo__1Ai", DMGL_PARAMS | DMGL_ANSI) => "A::foo(int)" - cplus_demangle ("foo__1Ai", 0) => "A::foo" - - cplus_demangle ("foo__1Afe", DMGL_PARAMS) => "A::foo(float,...)" - cplus_demangle ("foo__1Afe", DMGL_PARAMS | DMGL_ANSI)=> "A::foo(float,...)" - cplus_demangle ("foo__1Afe", 0) => "A::foo" - - Note that any leading underscores, or other such characters prepended by - the compilation system, are presumed to have already been stripped from - MANGLED. */ - -char * -cplus_demangle (mangled, options) - const char *mangled; - int options; -{ - string decl; - int success = 0; - struct work_stuff work[1]; - char *demangled = NULL; - - if ((mangled != NULL) && (*mangled != '\0')) - { - memset ((char *) work, 0, sizeof (work)); - work -> options = options; - if ((work->options & DMGL_STYLE_MASK) == 0) - work->options |= (int)current_demangling_style & DMGL_STYLE_MASK; - - string_init (&decl); - - /* First check to see if gnu style demangling is active and if the - string to be demangled contains a CPLUS_MARKER. If so, attempt to - recognize one of the gnu special forms rather than looking for a - standard prefix. In particular, don't worry about whether there - is a "__" string in the mangled string. Consider "_$_5__foo" for - example. */ - - if ((AUTO_DEMANGLING || GNU_DEMANGLING)) - { - success = gnu_special (work, &mangled, &decl); - } - if (!success) - { - success = demangle_prefix (work, &mangled, &decl); - } - if (success && (*mangled != '\0')) - { - success = demangle_signature (work, &mangled, &decl); - } - if (work->constructor == 2) - { - string_prepend(&decl, "global constructors keyed to "); - work->constructor = 0; - } - else if (work->destructor == 2) - { - string_prepend(&decl, "global destructors keyed to "); - work->destructor = 0; - } - demangled = mop_up (work, &decl, success); - } - return (demangled); -} - -static char * -mop_up (work, declp, success) - struct work_stuff *work; - string *declp; - int success; -{ - char *demangled = NULL; - - /* Discard the remembered types, if any. */ - - forget_types (work); - if (work -> typevec != NULL) - { - free ((char *) work -> typevec); - } - - /* If demangling was successful, ensure that the demangled string is null - terminated and return it. Otherwise, free the demangling decl. */ - - if (!success) - { - string_delete (declp); - } - else - { - string_appendn (declp, "", 1); - demangled = declp -> b; - } - return (demangled); -} - -/* - -LOCAL FUNCTION - - demangle_signature -- demangle the signature part of a mangled name - -SYNOPSIS - - static int - demangle_signature (struct work_stuff *work, const char **mangled, - string *declp); - -DESCRIPTION - - Consume and demangle the signature portion of the mangled name. - - DECLP is the string where demangled output is being built. At - entry it contains the demangled root name from the mangled name - prefix. I.E. either a demangled operator name or the root function - name. In some special cases, it may contain nothing. - - *MANGLED points to the current unconsumed location in the mangled - name. As tokens are consumed and demangling is performed, the - pointer is updated to continuously point at the next token to - be consumed. - - Demangling GNU style mangled names is nasty because there is no - explicit token that marks the start of the outermost function - argument list. -*/ - -static int -demangle_signature (work, mangled, declp) - struct work_stuff *work; - const char **mangled; - string *declp; -{ - int success = 1; - int func_done = 0; - int expect_func = 0; - const char *oldmangled = NULL; - string trawname; - string tname; - - while (success && (**mangled != '\0')) - { - switch (**mangled) - { - case 'Q': - oldmangled = *mangled; - success = demangle_qualified (work, mangled, declp, 1, 0); - if (success) - { - remember_type (work, oldmangled, *mangled - oldmangled); - } - if (AUTO_DEMANGLING || GNU_DEMANGLING) - { - expect_func = 1; - } - oldmangled = NULL; - break; - - case 'S': - /* Static member function */ - if (oldmangled == NULL) - { - oldmangled = *mangled; - } - (*mangled)++; - work -> static_type = 1; - break; - - case 'C': - /* a const member function */ - if (oldmangled == NULL) - { - oldmangled = *mangled; - } - (*mangled)++; - work -> const_type = 1; - break; - - case '0': case '1': case '2': case '3': case '4': - case '5': case '6': case '7': case '8': case '9': - if (oldmangled == NULL) - { - oldmangled = *mangled; - } - success = demangle_class (work, mangled, declp); - if (success) - { - remember_type (work, oldmangled, *mangled - oldmangled); - } - if (AUTO_DEMANGLING || GNU_DEMANGLING) - { - expect_func = 1; - } - oldmangled = NULL; - break; - - case 'F': - /* Function */ - /* ARM style demangling includes a specific 'F' character after - the class name. For GNU style, it is just implied. So we can - safely just consume any 'F' at this point and be compatible - with either style. */ - - oldmangled = NULL; - func_done = 1; - (*mangled)++; - - /* For lucid/ARM style we have to forget any types we might - have remembered up to this point, since they were not argument - types. GNU style considers all types seen as available for - back references. See comment in demangle_args() */ - - if (LUCID_DEMANGLING || ARM_DEMANGLING) - { - forget_types (work); - } - success = demangle_args (work, mangled, declp); - break; - - case 't': - /* G++ Template */ - string_init(&trawname); - string_init(&tname); - if (oldmangled == NULL) - { - oldmangled = *mangled; - } - success = demangle_template (work, mangled, &tname, &trawname); - if (success) - { - remember_type (work, oldmangled, *mangled - oldmangled); - } - string_append(&tname, "::"); - string_prepends(declp, &tname); - if (work -> destructor & 1) - { - string_prepend (&trawname, "~"); - string_appends (declp, &trawname); - work->destructor -= 1; - } - if ((work->constructor & 1) || (work->destructor & 1)) - { - string_appends (declp, &trawname); - work->constructor -= 1; - } - string_delete(&trawname); - string_delete(&tname); - oldmangled = NULL; - expect_func = 1; - break; - - case '_': - /* At the outermost level, we cannot have a return type specified, - so if we run into another '_' at this point we are dealing with - a mangled name that is either bogus, or has been mangled by - some algorithm we don't know how to deal with. So just - reject the entire demangling. */ - success = 0; - break; - - default: - if (AUTO_DEMANGLING || GNU_DEMANGLING) - { - /* Assume we have stumbled onto the first outermost function - argument token, and start processing args. */ - func_done = 1; - success = demangle_args (work, mangled, declp); - } - else - { - /* Non-GNU demanglers use a specific token to mark the start - of the outermost function argument tokens. Typically 'F', - for ARM-demangling, for example. So if we find something - we are not prepared for, it must be an error. */ - success = 0; - } - break; - } -/* - if (AUTO_DEMANGLING || GNU_DEMANGLING) -*/ - { - if (success && expect_func) - { - func_done = 1; - success = demangle_args (work, mangled, declp); - } - } - } - if (success && !func_done) - { - if (AUTO_DEMANGLING || GNU_DEMANGLING) - { - /* With GNU style demangling, bar__3foo is 'foo::bar(void)', and - bar__3fooi is 'foo::bar(int)'. We get here when we find the - first case, and need to ensure that the '(void)' gets added to - the current declp. Note that with ARM, the first case - represents the name of a static data member 'foo::bar', - which is in the current declp, so we leave it alone. */ - success = demangle_args (work, mangled, declp); - } - } - if (success && work -> static_type && PRINT_ARG_TYPES) - { - string_append (declp, " static"); - } - if (success && work -> const_type && PRINT_ARG_TYPES) - { - string_append (declp, " const"); - } - return (success); -} - -#if 0 - -static int -demangle_method_args (work, mangled, declp) - struct work_stuff *work; - const char **mangled; - string *declp; -{ - int success = 0; - - if (work -> static_type) - { - string_append (declp, *mangled + 1); - *mangled += strlen (*mangled); - success = 1; - } - else - { - success = demangle_args (work, mangled, declp); - } - return (success); -} - -#endif - -static int -demangle_template (work, mangled, tname, trawname) - struct work_stuff *work; - const char **mangled; - string *tname; - string *trawname; -{ - int i; - int is_pointer; - int is_real; - int is_integral; - int is_char; - int is_bool; - int r; - int need_comma = 0; - int success = 0; - int done; - const char *old_p; - const char *start; - int symbol_len; - string temp; - - (*mangled)++; - start = *mangled; - /* get template name */ - if ((r = consume_count (mangled)) == 0 || strlen (*mangled) < r) - { - return (0); - } - if (trawname) - string_appendn (trawname, *mangled, r); - string_appendn (tname, *mangled, r); - *mangled += r; - string_append (tname, "<"); - /* get size of template parameter list */ - if (!get_count (mangled, &r)) - { - return (0); - } - for (i = 0; i < r; i++) - { - if (need_comma) - { - string_append (tname, ", "); - } - /* Z for type parameters */ - if (**mangled == 'Z') - { - (*mangled)++; - /* temp is initialized in do_type */ - success = do_type (work, mangled, &temp); - if (success) - { - string_appends (tname, &temp); - } - string_delete(&temp); - if (!success) - { - break; - } - } - else - { - /* otherwise, value parameter */ - old_p = *mangled; - is_pointer = 0; - is_real = 0; - is_integral = 0; - is_char = 0; - is_bool = 0; - done = 0; - /* temp is initialized in do_type */ - success = do_type (work, mangled, &temp); -/* - if (success) - { - string_appends (tname, &temp); - } -*/ - string_delete(&temp); - if (!success) - { - break; - } -/* - string_append (tname, "="); -*/ - while (*old_p && !done) - { - switch (*old_p) - { - case 'P': - case 'p': - case 'R': - done = is_pointer = 1; - break; - case 'C': /* const */ - case 'S': /* explicitly signed [char] */ - case 'U': /* unsigned */ - case 'V': /* volatile */ - case 'F': /* function */ - case 'M': /* member function */ - case 'O': /* ??? */ - old_p++; - continue; - case 'Q': /* qualified name */ - done = is_integral = 1; - break; - case 'T': /* remembered type */ - abort (); - break; - case 'v': /* void */ - abort (); - break; - case 'x': /* long long */ - case 'l': /* long */ - case 'i': /* int */ - case 's': /* short */ - case 'w': /* wchar_t */ - done = is_integral = 1; - break; - case 'b': /* bool */ - done = is_bool = 1; - break; - case 'c': /* char */ - done = is_char = 1; - break; - case 'r': /* long double */ - case 'd': /* double */ - case 'f': /* float */ - done = is_real = 1; - break; - default: - /* it's probably user defined type, let's assume - it's integral, it seems hard to figure out - what it really is */ - done = is_integral = 1; - } - } - if (is_integral) - { - if (**mangled == 'm') - { - string_appendn (tname, "-", 1); - (*mangled)++; - } - while (isdigit (**mangled)) - { - string_appendn (tname, *mangled, 1); - (*mangled)++; - } - } - else if (is_char) - { - char tmp[2]; - int val; - if (**mangled == 'm') - { - string_appendn (tname, "-", 1); - (*mangled)++; - } - string_appendn (tname, "'", 1); - val = consume_count(mangled); - if (val == 0) - { - success = 0; - break; - } - tmp[0] = (char)val; - tmp[1] = '\0'; - string_appendn (tname, &tmp[0], 1); - string_appendn (tname, "'", 1); - } - else if (is_bool) - { - int val = consume_count (mangled); - if (val == 0) - string_appendn (tname, "false", 5); - else if (val == 1) - string_appendn (tname, "true", 4); - else - success = 0; - } - else if (is_real) - { - if (**mangled == 'm') - { - string_appendn (tname, "-", 1); - (*mangled)++; - } - while (isdigit (**mangled)) - { - string_appendn (tname, *mangled, 1); - (*mangled)++; - } - if (**mangled == '.') /* fraction */ - { - string_appendn (tname, ".", 1); - (*mangled)++; - while (isdigit (**mangled)) - { - string_appendn (tname, *mangled, 1); - (*mangled)++; - } - } - if (**mangled == 'e') /* exponent */ - { - string_appendn (tname, "e", 1); - (*mangled)++; - while (isdigit (**mangled)) - { - string_appendn (tname, *mangled, 1); - (*mangled)++; - } - } - } - else if (is_pointer) - { - if (!get_count (mangled, &symbol_len)) - { - success = 0; - break; - } - if (symbol_len == 0) - string_appendn (tname, "0", 1); - else - { - char *p = xmalloc (symbol_len + 1), *q; - strncpy (p, *mangled, symbol_len); - p [symbol_len] = '\0'; - q = cplus_demangle (p, work->options); - string_appendn (tname, "&", 1); - if (q) - { - string_append (tname, q); - free (q); - } - else - string_append (tname, p); - free (p); - } - *mangled += symbol_len; - } - } - need_comma = 1; - } - if (tname->p[-1] == '>') - string_append (tname, " "); - string_append (tname, ">"); - -/* - if (work -> static_type) - { - string_append (declp, *mangled + 1); - *mangled += strlen (*mangled); - success = 1; - } - else - { - success = demangle_args (work, mangled, declp); - } - } -*/ - return (success); -} - -static int -arm_pt (work, mangled, n, anchor, args) - struct work_stuff *work; - const char *mangled; - int n; - const char **anchor, **args; -{ - /* ARM template? */ - if (ARM_DEMANGLING && (*anchor = mystrstr (mangled, "__pt__"))) - { - int len; - *args = *anchor + 6; - len = consume_count (args); - if (*args + len == mangled + n && **args == '_') - { - ++*args; - return 1; - } - } - return 0; -} - -static void -demangle_arm_pt (work, mangled, n, declp) - struct work_stuff *work; - const char **mangled; - int n; - string *declp; -{ - const char *p; - const char *args; - const char *e = *mangled + n; - - /* ARM template? */ - if (arm_pt (work, *mangled, n, &p, &args)) - { - string arg; - string_init (&arg); - string_appendn (declp, *mangled, p - *mangled); - string_append (declp, "<"); - /* should do error checking here */ - while (args < e) { - string_clear (&arg); - do_type (work, &args, &arg); - string_appends (declp, &arg); - string_append (declp, ","); - } - string_delete (&arg); - --declp->p; - string_append (declp, ">"); - } - else - { - string_appendn (declp, *mangled, n); - } - *mangled += n; -} - -static int -demangle_class_name (work, mangled, declp) - struct work_stuff *work; - const char **mangled; - string *declp; -{ - int n; - int success = 0; - - n = consume_count (mangled); - if (strlen (*mangled) >= n) - { - demangle_arm_pt (work, mangled, n, declp); - success = 1; - } - - return (success); -} - -/* - -LOCAL FUNCTION - - demangle_class -- demangle a mangled class sequence - -SYNOPSIS - - static int - demangle_class (struct work_stuff *work, const char **mangled, - strint *declp) - -DESCRIPTION - - DECLP points to the buffer into which demangling is being done. - - *MANGLED points to the current token to be demangled. On input, - it points to a mangled class (I.E. "3foo", "13verylongclass", etc.) - On exit, it points to the next token after the mangled class on - success, or the first unconsumed token on failure. - - If the CONSTRUCTOR or DESTRUCTOR flags are set in WORK, then - we are demangling a constructor or destructor. In this case - we prepend "class::class" or "class::~class" to DECLP. - - Otherwise, we prepend "class::" to the current DECLP. - - Reset the constructor/destructor flags once they have been - "consumed". This allows demangle_class to be called later during - the same demangling, to do normal class demangling. - - Returns 1 if demangling is successful, 0 otherwise. - -*/ - -static int -demangle_class (work, mangled, declp) - struct work_stuff *work; - const char **mangled; - string *declp; -{ - int success = 0; - string class_name; - - string_init (&class_name); - if (demangle_class_name (work, mangled, &class_name)) - { - if ((work->constructor & 1) || (work->destructor & 1)) - { - string_prepends (declp, &class_name); - if (work -> destructor & 1) - { - string_prepend (declp, "~"); - work -> destructor -= 1; - } - else - { - work -> constructor -= 1; - } - } - string_prepend (declp, "::"); - string_prepends (declp, &class_name); - success = 1; - } - string_delete (&class_name); - return (success); -} - -/* - -LOCAL FUNCTION - - demangle_prefix -- consume the mangled name prefix and find signature - -SYNOPSIS - - static int - demangle_prefix (struct work_stuff *work, const char **mangled, - string *declp); - -DESCRIPTION - - Consume and demangle the prefix of the mangled name. - - DECLP points to the string buffer into which demangled output is - placed. On entry, the buffer is empty. On exit it contains - the root function name, the demangled operator name, or in some - special cases either nothing or the completely demangled result. - - MANGLED points to the current pointer into the mangled name. As each - token of the mangled name is consumed, it is updated. Upon entry - the current mangled name pointer points to the first character of - the mangled name. Upon exit, it should point to the first character - of the signature if demangling was successful, or to the first - unconsumed character if demangling of the prefix was unsuccessful. - - Returns 1 on success, 0 otherwise. - */ - -static int -demangle_prefix (work, mangled, declp) - struct work_stuff *work; - const char **mangled; - string *declp; -{ - int success = 1; - const char *scan; - int i; - - if (strlen(*mangled) >= 11 && strncmp(*mangled, "_GLOBAL_", 8) == 0) - { - char *marker = strchr (cplus_markers, (*mangled)[8]); - if (marker != NULL && *marker == (*mangled)[10]) - { - if ((*mangled)[9] == 'D') - { - /* it's a GNU global destructor to be executed at program exit */ - (*mangled) += 11; - work->destructor = 2; - if (gnu_special (work, mangled, declp)) - return success; - } - else if ((*mangled)[9] == 'I') - { - /* it's a GNU global constructor to be executed at program init */ - (*mangled) += 11; - work->constructor = 2; - if (gnu_special (work, mangled, declp)) - return success; - } - } - } - else if (ARM_DEMANGLING && strncmp(*mangled, "__std__", 7) == 0) - { - /* it's a ARM global destructor to be executed at program exit */ - (*mangled) += 7; - work->destructor = 2; - } - else if (ARM_DEMANGLING && strncmp(*mangled, "__sti__", 7) == 0) - { - /* it's a ARM global constructor to be executed at program initial */ - (*mangled) += 7; - work->constructor = 2; - } - -/* This block of code is a reduction in strength time optimization - of: - scan = mystrstr (*mangled, "__"); */ - - { - scan = *mangled; - - do { - scan = strchr (scan, '_'); - } while (scan != NULL && *++scan != '_'); - - if (scan != NULL) --scan; - } - - if (scan != NULL) - { - /* We found a sequence of two or more '_', ensure that we start at - the last pair in the sequence. */ - i = strspn (scan, "_"); - if (i > 2) - { - scan += (i - 2); - } - } - - if (scan == NULL) - { - success = 0; - } - else if (work -> static_type) - { - if (!isdigit (scan[0]) && (scan[0] != 't')) - { - success = 0; - } - } - else if ((scan == *mangled) && - (isdigit (scan[2]) || (scan[2] == 'Q') || (scan[2] == 't'))) - { - /* The ARM says nothing about the mangling of local variables. - But cfront mangles local variables by prepending __<nesting_level> - to them. As an extension to ARM demangling we handle this case. */ - if ((LUCID_DEMANGLING || ARM_DEMANGLING) && isdigit (scan[2])) - { - *mangled = scan + 2; - consume_count (mangled); - string_append (declp, *mangled); - *mangled += strlen (*mangled); - success = 1; - } - else - { - /* A GNU style constructor starts with __[0-9Qt]. But cfront uses - names like __Q2_3foo3bar for nested type names. So don't accept - this style of constructor for cfront demangling. */ - if (!(LUCID_DEMANGLING || ARM_DEMANGLING)) - work -> constructor += 1; - *mangled = scan + 2; - } - } - else if ((scan == *mangled) && !isdigit (scan[2]) && (scan[2] != 't')) - { - /* Mangled name starts with "__". Skip over any leading '_' characters, - then find the next "__" that separates the prefix from the signature. - */ - if (!(ARM_DEMANGLING || LUCID_DEMANGLING) - || (arm_special (work, mangled, declp) == 0)) - { - while (*scan == '_') - { - scan++; - } - if ((scan = mystrstr (scan, "__")) == NULL || (*(scan + 2) == '\0')) - { - /* No separator (I.E. "__not_mangled"), or empty signature - (I.E. "__not_mangled_either__") */ - success = 0; - } - else - { - demangle_function_name (work, mangled, declp, scan); - } - } - } - else if (ARM_DEMANGLING && scan[2] == 'p' && scan[3] == 't') - { - /* Cfront-style parameterized type. Handled later as a signature. */ - success = 1; - - /* ARM template? */ - demangle_arm_pt (work, mangled, strlen (*mangled), declp); - } - else if (*(scan + 2) != '\0') - { - /* Mangled name does not start with "__" but does have one somewhere - in there with non empty stuff after it. Looks like a global - function name. */ - demangle_function_name (work, mangled, declp, scan); - } - else - { - /* Doesn't look like a mangled name */ - success = 0; - } - - if (!success && (work->constructor == 2 || work->destructor == 2)) - { - string_append (declp, *mangled); - *mangled += strlen (*mangled); - success = 1; - } - return (success); -} - -/* - -LOCAL FUNCTION - - gnu_special -- special handling of gnu mangled strings - -SYNOPSIS - - static int - gnu_special (struct work_stuff *work, const char **mangled, - string *declp); - - -DESCRIPTION - - Process some special GNU style mangling forms that don't fit - the normal pattern. For example: - - _$_3foo (destructor for class foo) - _vt$foo (foo virtual table) - _vt$foo$bar (foo::bar virtual table) - __vt_foo (foo virtual table, new style with thunks) - _3foo$varname (static data member) - _Q22rs2tu$vw (static data member) - __t6vector1Zii (constructor with template) - __thunk_4__$_7ostream (virtual function thunk) - */ - -static int -gnu_special (work, mangled, declp) - struct work_stuff *work; - const char **mangled; - string *declp; -{ - int n; - int success = 1; - const char *p; - - if ((*mangled)[0] == '_' - && strchr (cplus_markers, (*mangled)[1]) != NULL - && (*mangled)[2] == '_') - { - /* Found a GNU style destructor, get past "_<CPLUS_MARKER>_" */ - (*mangled) += 3; - work -> destructor += 1; - } - else if ((*mangled)[0] == '_' - && (((*mangled)[1] == '_' - && (*mangled)[2] == 'v' - && (*mangled)[3] == 't' - && (*mangled)[4] == '_') - || ((*mangled)[1] == 'v' - && (*mangled)[2] == 't' - && strchr (cplus_markers, (*mangled)[3]) != NULL))) - { - /* Found a GNU style virtual table, get past "_vt<CPLUS_MARKER>" - and create the decl. Note that we consume the entire mangled - input string, which means that demangle_signature has no work - to do. */ - if ((*mangled)[2] == 'v') - (*mangled) += 5; /* New style, with thunks: "__vt_" */ - else - (*mangled) += 4; /* Old style, no thunks: "_vt<CPLUS_MARKER>" */ - while (**mangled != '\0') - { - p = strpbrk (*mangled, cplus_markers); - switch (**mangled) - { - case 'Q': - success = demangle_qualified (work, mangled, declp, 0, 1); - break; - case 't': - success = demangle_template (work, mangled, declp, 0); - break; - default: - if (isdigit(*mangled[0])) - { - n = consume_count(mangled); - } - else - { - n = strcspn (*mangled, cplus_markers); - } - string_appendn (declp, *mangled, n); - (*mangled) += n; - } - - if (success && ((p == NULL) || (p == *mangled))) - { - if (p != NULL) - { - string_append (declp, "::"); - (*mangled)++; - } - } - else - { - success = 0; - break; - } - } - if (success) - string_append (declp, " virtual table"); - } - else if ((*mangled)[0] == '_' - && (strchr("0123456789Qt", (*mangled)[1]) != NULL) - && (p = strpbrk (*mangled, cplus_markers)) != NULL) - { - /* static data member, "_3foo$varname" for example */ - (*mangled)++; - switch (**mangled) - { - case 'Q': - success = demangle_qualified (work, mangled, declp, 0, 1); - break; - case 't': - success = demangle_template (work, mangled, declp, 0); - break; - default: - n = consume_count (mangled); - string_appendn (declp, *mangled, n); - (*mangled) += n; - } - if (success && (p == *mangled)) - { - /* Consumed everything up to the cplus_marker, append the - variable name. */ - (*mangled)++; - string_append (declp, "::"); - n = strlen (*mangled); - string_appendn (declp, *mangled, n); - (*mangled) += n; - } - else - { - success = 0; - } - } - else if (strncmp (*mangled, "__thunk_", 8) == 0) - { - int delta = ((*mangled) += 8, consume_count (mangled)); - char *method = cplus_demangle (++*mangled, work->options); - if (method) - { - char buf[50]; - sprintf (buf, "virtual function thunk (delta:%d) for ", -delta); - string_append (declp, buf); - string_append (declp, method); - free (method); - n = strlen (*mangled); - (*mangled) += n; - } - else - { - success = 0; - } - } - else - { - success = 0; - } - return (success); -} - -/* - -LOCAL FUNCTION - - arm_special -- special handling of ARM/lucid mangled strings - -SYNOPSIS - - static int - arm_special (struct work_stuff *work, const char **mangled, - string *declp); - - -DESCRIPTION - - Process some special ARM style mangling forms that don't fit - the normal pattern. For example: - - __vtbl__3foo (foo virtual table) - __vtbl__3foo__3bar (bar::foo virtual table) - - */ - -static int -arm_special (work, mangled, declp) - struct work_stuff *work; - const char **mangled; - string *declp; -{ - int n; - int success = 1; - const char *scan; - - if (strncmp (*mangled, ARM_VTABLE_STRING, ARM_VTABLE_STRLEN) == 0) - { - /* Found a ARM style virtual table, get past ARM_VTABLE_STRING - and create the decl. Note that we consume the entire mangled - input string, which means that demangle_signature has no work - to do. */ - scan = *mangled + ARM_VTABLE_STRLEN; - while (*scan != '\0') /* first check it can be demangled */ - { - n = consume_count (&scan); - if (n==0) - { - return (0); /* no good */ - } - scan += n; - if (scan[0] == '_' && scan[1] == '_') - { - scan += 2; - } - } - (*mangled) += ARM_VTABLE_STRLEN; - while (**mangled != '\0') - { - n = consume_count (mangled); - string_prependn (declp, *mangled, n); - (*mangled) += n; - if ((*mangled)[0] == '_' && (*mangled)[1] == '_') - { - string_prepend (declp, "::"); - (*mangled) += 2; - } - } - string_append (declp, " virtual table"); - } - else - { - success = 0; - } - return (success); -} - -/* - -LOCAL FUNCTION - - demangle_qualified -- demangle 'Q' qualified name strings - -SYNOPSIS - - static int - demangle_qualified (struct work_stuff *, const char *mangled, - string *result, int isfuncname, int append); - -DESCRIPTION - - Demangle a qualified name, such as "Q25Outer5Inner" which is - the mangled form of "Outer::Inner". The demangled output is - prepended or appended to the result string according to the - state of the append flag. - - If isfuncname is nonzero, then the qualified name we are building - is going to be used as a member function name, so if it is a - constructor or destructor function, append an appropriate - constructor or destructor name. I.E. for the above example, - the result for use as a constructor is "Outer::Inner::Inner" - and the result for use as a destructor is "Outer::Inner::~Inner". - -BUGS - - Numeric conversion is ASCII dependent (FIXME). - - */ - -static int -demangle_qualified (work, mangled, result, isfuncname, append) - struct work_stuff *work; - const char **mangled; - string *result; - int isfuncname; - int append; -{ - int qualifiers; - int namelength; - int success = 1; - const char *p; - char num[2]; - string temp; - - string_init (&temp); - switch ((*mangled)[1]) - { - case '_': - /* GNU mangled name with more than 9 classes. The count is preceded - by an underscore (to distinguish it from the <= 9 case) and followed - by an underscore. */ - p = *mangled + 2; - qualifiers = atoi (p); - if (!isdigit (*p) || *p == '0') - success = 0; - - /* Skip the digits. */ - while (isdigit (*p)) - ++p; - - if (*p != '_') - success = 0; - - *mangled = p + 1; - break; - - case '1': - case '2': - case '3': - case '4': - case '5': - case '6': - case '7': - case '8': - case '9': - /* The count is in a single digit. */ - num[0] = (*mangled)[1]; - num[1] = '\0'; - qualifiers = atoi (num); - - /* If there is an underscore after the digit, skip it. This is - said to be for ARM-qualified names, but the ARM makes no - mention of such an underscore. Perhaps cfront uses one. */ - if ((*mangled)[2] == '_') - { - (*mangled)++; - } - (*mangled) += 2; - break; - - case '0': - default: - success = 0; - } - - if (!success) - return success; - - /* Pick off the names and collect them in the temp buffer in the order - in which they are found, separated by '::'. */ - - while (qualifiers-- > 0) - { - if (*mangled[0] == '_') - *mangled = *mangled + 1; - if (*mangled[0] == 't') - { - success = demangle_template(work, mangled, &temp, 0); - if (!success) break; - } - else - { - namelength = consume_count (mangled); - if (strlen (*mangled) < namelength) - { - /* Simple sanity check failed */ - success = 0; - break; - } - string_appendn (&temp, *mangled, namelength); - *mangled += namelength; - } - if (qualifiers > 0) - { - string_appendn (&temp, "::", 2); - } - } - - /* If we are using the result as a function name, we need to append - the appropriate '::' separated constructor or destructor name. - We do this here because this is the most convenient place, where - we already have a pointer to the name and the length of the name. */ - - if (isfuncname && (work->constructor & 1 || work->destructor & 1)) - { - string_appendn (&temp, "::", 2); - if (work -> destructor & 1) - { - string_append (&temp, "~"); - } - string_appendn (&temp, (*mangled) - namelength, namelength); - } - - /* Now either prepend the temp buffer to the result, or append it, - depending upon the state of the append flag. */ - - if (append) - { - string_appends (result, &temp); - } - else - { - if (!STRING_EMPTY (result)) - { - string_appendn (&temp, "::", 2); - } - string_prepends (result, &temp); - } - - string_delete (&temp); - return (success); -} - -/* - -LOCAL FUNCTION - - get_count -- convert an ascii count to integer, consuming tokens - -SYNOPSIS - - static int - get_count (const char **type, int *count) - -DESCRIPTION - - Return 0 if no conversion is performed, 1 if a string is converted. -*/ - -static int -get_count (type, count) - const char **type; - int *count; -{ - const char *p; - int n; - - if (!isdigit (**type)) - { - return (0); - } - else - { - *count = **type - '0'; - (*type)++; - if (isdigit (**type)) - { - p = *type; - n = *count; - do - { - n *= 10; - n += *p - '0'; - p++; - } - while (isdigit (*p)); - if (*p == '_') - { - *type = p + 1; - *count = n; - } - } - } - return (1); -} - -/* result will be initialised here; it will be freed on failure */ - -static int -do_type (work, mangled, result) - struct work_stuff *work; - const char **mangled; - string *result; -{ - int n; - int done; - int success; - string decl; - const char *remembered_type; - int constp; - int volatilep; - - string_init (&decl); - string_init (result); - - done = 0; - success = 1; - while (success && !done) - { - int member; - switch (**mangled) - { - - /* A pointer type */ - case 'P': - case 'p': - (*mangled)++; - string_prepend (&decl, "*"); - break; - - /* A reference type */ - case 'R': - (*mangled)++; - string_prepend (&decl, "&"); - break; - - /* An array */ - case 'A': - { - const char *p = ++(*mangled); - - string_prepend (&decl, "("); - string_append (&decl, ")["); - /* Copy anything up until the next underscore (the size of the - array). */ - while (**mangled && **mangled != '_') - ++(*mangled); - if (**mangled == '_') - { - string_appendn (&decl, p, *mangled - p); - string_append (&decl, "]"); - *mangled += 1; - } - else - success = 0; - break; - } - - /* A back reference to a previously seen type */ - case 'T': - (*mangled)++; - if (!get_count (mangled, &n) || n >= work -> ntypes) - { - success = 0; - } - else - { - remembered_type = work -> typevec[n]; - mangled = &remembered_type; - } - break; - - /* A function */ - case 'F': - (*mangled)++; - if (!STRING_EMPTY (&decl) && decl.b[0] == '*') - { - string_prepend (&decl, "("); - string_append (&decl, ")"); - } - /* After picking off the function args, we expect to either find the - function return type (preceded by an '_') or the end of the - string. */ - if (!demangle_args (work, mangled, &decl) - || (**mangled != '_' && **mangled != '\0')) - { - success = 0; - } - if (success && (**mangled == '_')) - { - (*mangled)++; - } - break; - - case 'M': - case 'O': - { - constp = 0; - volatilep = 0; - - member = **mangled == 'M'; - (*mangled)++; - if (!isdigit (**mangled)) - { - success = 0; - break; - } - n = consume_count (mangled); - if (strlen (*mangled) < n) - { - success = 0; - break; - } - string_append (&decl, ")"); - string_prepend (&decl, "::"); - string_prependn (&decl, *mangled, n); - string_prepend (&decl, "("); - *mangled += n; - if (member) - { - if (**mangled == 'C') - { - (*mangled)++; - constp = 1; - } - if (**mangled == 'V') - { - (*mangled)++; - volatilep = 1; - } - if (*(*mangled)++ != 'F') - { - success = 0; - break; - } - } - if ((member && !demangle_args (work, mangled, &decl)) - || **mangled != '_') - { - success = 0; - break; - } - (*mangled)++; - if (! PRINT_ANSI_QUALIFIERS) - { - break; - } - if (constp) - { - APPEND_BLANK (&decl); - string_append (&decl, "const"); - } - if (volatilep) - { - APPEND_BLANK (&decl); - string_append (&decl, "volatile"); - } - break; - } - case 'G': - (*mangled)++; - break; - - case 'C': - (*mangled)++; -/* - if ((*mangled)[1] == 'P') - { -*/ - if (PRINT_ANSI_QUALIFIERS) - { - if (!STRING_EMPTY (&decl)) - { - string_prepend (&decl, " "); - } - string_prepend (&decl, "const"); - } - break; -/* - } -*/ - - /* fall through */ - default: - done = 1; - break; - } - } - - switch (**mangled) - { - /* A qualified name, such as "Outer::Inner". */ - case 'Q': - success = demangle_qualified (work, mangled, result, 0, 1); - break; - - default: - success = demangle_fund_type (work, mangled, result); - break; - } - - if (success) - { - if (!STRING_EMPTY (&decl)) - { - string_append (result, " "); - string_appends (result, &decl); - } - } - else - { - string_delete (result); - } - string_delete (&decl); - return (success); -} - -/* Given a pointer to a type string that represents a fundamental type - argument (int, long, unsigned int, etc) in TYPE, a pointer to the - string in which the demangled output is being built in RESULT, and - the WORK structure, decode the types and add them to the result. - - For example: - - "Ci" => "const int" - "Sl" => "signed long" - "CUs" => "const unsigned short" - - */ - -static int -demangle_fund_type (work, mangled, result) - struct work_stuff *work; - const char **mangled; - string *result; -{ - int done = 0; - int success = 1; - - /* First pick off any type qualifiers. There can be more than one. */ - - while (!done) - { - switch (**mangled) - { - case 'C': - (*mangled)++; - if (PRINT_ANSI_QUALIFIERS) - { - APPEND_BLANK (result); - string_append (result, "const"); - } - break; - case 'U': - (*mangled)++; - APPEND_BLANK (result); - string_append (result, "unsigned"); - break; - case 'S': /* signed char only */ - (*mangled)++; - APPEND_BLANK (result); - string_append (result, "signed"); - break; - case 'V': - (*mangled)++; - if (PRINT_ANSI_QUALIFIERS) - { - APPEND_BLANK (result); - string_append (result, "volatile"); - } - break; - default: - done = 1; - break; - } - } - - /* Now pick off the fundamental type. There can be only one. */ - - switch (**mangled) - { - case '\0': - case '_': - break; - case 'v': - (*mangled)++; - APPEND_BLANK (result); - string_append (result, "void"); - break; - case 'x': - (*mangled)++; - APPEND_BLANK (result); - string_append (result, "long long"); - break; - case 'l': - (*mangled)++; - APPEND_BLANK (result); - string_append (result, "long"); - break; - case 'i': - (*mangled)++; - APPEND_BLANK (result); - string_append (result, "int"); - break; - case 's': - (*mangled)++; - APPEND_BLANK (result); - string_append (result, "short"); - break; - case 'b': - (*mangled)++; - APPEND_BLANK (result); - string_append (result, "bool"); - break; - case 'c': - (*mangled)++; - APPEND_BLANK (result); - string_append (result, "char"); - break; - case 'w': - (*mangled)++; - APPEND_BLANK (result); - string_append (result, "wchar_t"); - break; - case 'r': - (*mangled)++; - APPEND_BLANK (result); - string_append (result, "long double"); - break; - case 'd': - (*mangled)++; - APPEND_BLANK (result); - string_append (result, "double"); - break; - case 'f': - (*mangled)++; - APPEND_BLANK (result); - string_append (result, "float"); - break; - case 'G': - (*mangled)++; - if (!isdigit (**mangled)) - { - success = 0; - break; - } - /* fall through */ - /* An explicit type, such as "6mytype" or "7integer" */ - case '0': - case '1': - case '2': - case '3': - case '4': - case '5': - case '6': - case '7': - case '8': - case '9': - APPEND_BLANK (result); - if (!demangle_class_name (work, mangled, result)) { - --result->p; - success = 0; - } - break; - case 't': - success = demangle_template(work,mangled, result, 0); - break; - default: - success = 0; - break; - } - - return (success); -} - -/* `result' will be initialized in do_type; it will be freed on failure */ - -static int -do_arg (work, mangled, result) - struct work_stuff *work; - const char **mangled; - string *result; -{ - const char *start = *mangled; - - if (!do_type (work, mangled, result)) - { - return (0); - } - else - { - remember_type (work, start, *mangled - start); - return (1); - } -} - -static void -remember_type (work, start, len) - struct work_stuff *work; - const char *start; - int len; -{ - char *tem; - - if (work -> ntypes >= work -> typevec_size) - { - if (work -> typevec_size == 0) - { - work -> typevec_size = 3; - work -> typevec = - (char **) xmalloc (sizeof (char *) * work -> typevec_size); - } - else - { - work -> typevec_size *= 2; - work -> typevec = - (char **) xrealloc ((char *)work -> typevec, - sizeof (char *) * work -> typevec_size); - } - } - tem = xmalloc (len + 1); - memcpy (tem, start, len); - tem[len] = '\0'; - work -> typevec[work -> ntypes++] = tem; -} - -/* Forget the remembered types, but not the type vector itself. */ - -static void -forget_types (work) - struct work_stuff *work; -{ - int i; - - while (work -> ntypes > 0) - { - i = --(work -> ntypes); - if (work -> typevec[i] != NULL) - { - free (work -> typevec[i]); - work -> typevec[i] = NULL; - } - } -} - -/* Process the argument list part of the signature, after any class spec - has been consumed, as well as the first 'F' character (if any). For - example: - - "__als__3fooRT0" => process "RT0" - "complexfunc5__FPFPc_PFl_i" => process "PFPc_PFl_i" - - DECLP must be already initialised, usually non-empty. It won't be freed - on failure. - - Note that g++ differs significantly from ARM and lucid style mangling - with regards to references to previously seen types. For example, given - the source fragment: - - class foo { - public: - foo::foo (int, foo &ia, int, foo &ib, int, foo &ic); - }; - - foo::foo (int, foo &ia, int, foo &ib, int, foo &ic) { ia = ib = ic; } - void foo (int, foo &ia, int, foo &ib, int, foo &ic) { ia = ib = ic; } - - g++ produces the names: - - __3fooiRT0iT2iT2 - foo__FiR3fooiT1iT1 - - while lcc (and presumably other ARM style compilers as well) produces: - - foo__FiR3fooT1T2T1T2 - __ct__3fooFiR3fooT1T2T1T2 - - Note that g++ bases it's type numbers starting at zero and counts all - previously seen types, while lucid/ARM bases it's type numbers starting - at one and only considers types after it has seen the 'F' character - indicating the start of the function args. For lucid/ARM style, we - account for this difference by discarding any previously seen types when - we see the 'F' character, and subtracting one from the type number - reference. - - */ - -static int -demangle_args (work, mangled, declp) - struct work_stuff *work; - const char **mangled; - string *declp; -{ - string arg; - int need_comma = 0; - int r; - int t; - const char *tem; - char temptype; - - if (PRINT_ARG_TYPES) - { - string_append (declp, "("); - if (**mangled == '\0') - { - string_append (declp, "void"); - } - } - - while (**mangled != '_' && **mangled != '\0' && **mangled != 'e') - { - if ((**mangled == 'N') || (**mangled == 'T')) - { - temptype = *(*mangled)++; - - if (temptype == 'N') - { - if (!get_count (mangled, &r)) - { - return (0); - } - } - else - { - r = 1; - } - if (ARM_DEMANGLING && work -> ntypes >= 10) - { - /* If we have 10 or more types we might have more than a 1 digit - index so we'll have to consume the whole count here. This - will lose if the next thing is a type name preceded by a - count but it's impossible to demangle that case properly - anyway. Eg if we already have 12 types is T12Pc "(..., type1, - Pc, ...)" or "(..., type12, char *, ...)" */ - if ((t = consume_count(mangled)) == 0) - { - return (0); - } - } - else - { - if (!get_count (mangled, &t)) - { - return (0); - } - } - if (LUCID_DEMANGLING || ARM_DEMANGLING) - { - t--; - } - /* Validate the type index. Protect against illegal indices from - malformed type strings. */ - if ((t < 0) || (t >= work -> ntypes)) - { - return (0); - } - while (--r >= 0) - { - tem = work -> typevec[t]; - if (need_comma && PRINT_ARG_TYPES) - { - string_append (declp, ", "); - } - if (!do_arg (work, &tem, &arg)) - { - return (0); - } - if (PRINT_ARG_TYPES) - { - string_appends (declp, &arg); - } - string_delete (&arg); - need_comma = 1; - } - } - else - { - if (need_comma & PRINT_ARG_TYPES) - { - string_append (declp, ", "); - } - if (!do_arg (work, mangled, &arg)) - { - return (0); - } - if (PRINT_ARG_TYPES) - { - string_appends (declp, &arg); - } - string_delete (&arg); - need_comma = 1; - } - } - - if (**mangled == 'e') - { - (*mangled)++; - if (PRINT_ARG_TYPES) - { - if (need_comma) - { - string_append (declp, ","); - } - string_append (declp, "..."); - } - } - - if (PRINT_ARG_TYPES) - { - string_append (declp, ")"); - } - return (1); -} - -static void -demangle_function_name (work, mangled, declp, scan) - struct work_stuff *work; - const char **mangled; - string *declp; - const char *scan; -{ - int i; - int len; - string type; - const char *tem; - - string_appendn (declp, (*mangled), scan - (*mangled)); - string_need (declp, 1); - *(declp -> p) = '\0'; - - /* Consume the function name, including the "__" separating the name - from the signature. We are guaranteed that SCAN points to the - separator. */ - - (*mangled) = scan + 2; - - if (LUCID_DEMANGLING || ARM_DEMANGLING) - { - - /* See if we have an ARM style constructor or destructor operator. - If so, then just record it, clear the decl, and return. - We can't build the actual constructor/destructor decl until later, - when we recover the class name from the signature. */ - - if (strcmp (declp -> b, "__ct") == 0) - { - work -> constructor += 1; - string_clear (declp); - return; - } - else if (strcmp (declp -> b, "__dt") == 0) - { - work -> destructor += 1; - string_clear (declp); - return; - } - } - - if (declp->p - declp->b >= 3 - && declp->b[0] == 'o' - && declp->b[1] == 'p' - && strchr (cplus_markers, declp->b[2]) != NULL) - { - /* see if it's an assignment expression */ - if (declp->p - declp->b >= 10 /* op$assign_ */ - && memcmp (declp->b + 3, "assign_", 7) == 0) - { - for (i = 0; i < sizeof (optable) / sizeof (optable[0]); i++) - { - len = declp->p - declp->b - 10; - if (strlen (optable[i].in) == len - && memcmp (optable[i].in, declp->b + 10, len) == 0) - { - string_clear (declp); - string_append (declp, "operator"); - string_append (declp, optable[i].out); - string_append (declp, "="); - break; - } - } - } - else - { - for (i = 0; i < sizeof (optable) / sizeof (optable[0]); i++) - { - int len = declp->p - declp->b - 3; - if (strlen (optable[i].in) == len - && memcmp (optable[i].in, declp->b + 3, len) == 0) - { - string_clear (declp); - string_append (declp, "operator"); - string_append (declp, optable[i].out); - break; - } - } - } - } - else if (declp->p - declp->b >= 5 && memcmp (declp->b, "type", 4) == 0 - && strchr (cplus_markers, declp->b[4]) != NULL) - { - /* type conversion operator */ - tem = declp->b + 5; - if (do_type (work, &tem, &type)) - { - string_clear (declp); - string_append (declp, "operator "); - string_appends (declp, &type); - string_delete (&type); - } - } - else if (declp->b[0] == '_' && declp->b[1] == '_' - && declp->b[2] == 'o' && declp->b[3] == 'p') - { - /* ANSI. */ - /* type conversion operator. */ - tem = declp->b + 4; - if (do_type (work, &tem, &type)) - { - string_clear (declp); - string_append (declp, "operator "); - string_appends (declp, &type); - string_delete (&type); - } - } - else if (declp->b[0] == '_' && declp->b[1] == '_' - && declp->b[2] >= 'a' && declp->b[2] <= 'z' - && declp->b[3] >= 'a' && declp->b[3] <= 'z') - { - if (declp->b[4] == '\0') - { - /* Operator. */ - for (i = 0; i < sizeof (optable) / sizeof (optable[0]); i++) - { - if (strlen (optable[i].in) == 2 - && memcmp (optable[i].in, declp->b + 2, 2) == 0) - { - string_clear (declp); - string_append (declp, "operator"); - string_append (declp, optable[i].out); - break; - } - } - } - else - { - if (declp->b[2] == 'a' && declp->b[5] == '\0') - { - /* Assignment. */ - for (i = 0; i < sizeof (optable) / sizeof (optable[0]); i++) - { - if (strlen (optable[i].in) == 3 - && memcmp (optable[i].in, declp->b + 2, 3) == 0) - { - string_clear (declp); - string_append (declp, "operator"); - string_append (declp, optable[i].out); - break; - } - } - } - } - } -} - -/* a mini string-handling package */ - -static void -string_need (s, n) - string *s; - int n; -{ - int tem; - - if (s->b == NULL) - { - if (n < 32) - { - n = 32; - } - s->p = s->b = xmalloc (n); - s->e = s->b + n; - } - else if (s->e - s->p < n) - { - tem = s->p - s->b; - n += tem; - n *= 2; - s->b = xrealloc (s->b, n); - s->p = s->b + tem; - s->e = s->b + n; - } -} - -static void -string_delete (s) - string *s; -{ - if (s->b != NULL) - { - free (s->b); - s->b = s->e = s->p = NULL; - } -} - -static void -string_init (s) - string *s; -{ - s->b = s->p = s->e = NULL; -} - -static void -string_clear (s) - string *s; -{ - s->p = s->b; -} - -#if 0 - -static int -string_empty (s) - string *s; -{ - return (s->b == s->p); -} - -#endif - -static void -string_append (p, s) - string *p; - const char *s; -{ - int n; - if (s == NULL || *s == '\0') - return; - n = strlen (s); - string_need (p, n); - memcpy (p->p, s, n); - p->p += n; -} - -static void -string_appends (p, s) - string *p, *s; -{ - int n; - - if (s->b != s->p) - { - n = s->p - s->b; - string_need (p, n); - memcpy (p->p, s->b, n); - p->p += n; - } -} - -static void -string_appendn (p, s, n) - string *p; - const char *s; - int n; -{ - if (n != 0) - { - string_need (p, n); - memcpy (p->p, s, n); - p->p += n; - } -} - -static void -string_prepend (p, s) - string *p; - const char *s; -{ - if (s != NULL && *s != '\0') - { - string_prependn (p, s, strlen (s)); - } -} - -static void -string_prepends (p, s) - string *p, *s; -{ - if (s->b != s->p) - { - string_prependn (p, s->b, s->p - s->b); - } -} - -static void -string_prependn (p, s, n) - string *p; - const char *s; - int n; -{ - char *q; - - if (n != 0) - { - string_need (p, n); - for (q = p->p - 1; q >= p->b; q--) - { - q[n] = q[0]; - } - memcpy (p->b, s, n); - p->p += n; - } -} - -/* To generate a standalone demangler program for testing purposes, - just compile and link this file with -DMAIN and libiberty.a. When - run, it demangles each command line arg, or each stdin string, and - prints the result on stdout. */ - -#ifdef MAIN - -static void -demangle_it (mangled_name) - char *mangled_name; -{ - char *result; - - result = cplus_demangle (mangled_name, DMGL_PARAMS | DMGL_ANSI); - if (result == NULL) - { - printf ("%s\n", mangled_name); - } - else - { - printf ("%s\n", result); - free (result); - } -} - -#include "getopt.h" - -static char *program_name; -static char *program_version = VERSION; - -static void -usage (stream, status) - FILE *stream; - int status; -{ - fprintf (stream, "\ -Usage: %s [-_] [-n] [-s {gnu,lucid,arm}] [--strip-underscores]\n\ - [--no-strip-underscores] [--format={gnu,lucid,arm}]\n\ - [--help] [--version] [arg...]\n", - program_name); - exit (status); -} - -#define MBUF_SIZE 512 -char mbuffer[MBUF_SIZE]; - -/* Defined in the automatically-generated underscore.c. */ -extern int prepends_underscore; - -int strip_underscore = 0; - -static struct option long_options[] = { - {"strip-underscores", no_argument, 0, '_'}, - {"format", required_argument, 0, 's'}, - {"help", no_argument, 0, 'h'}, - {"no-strip-underscores", no_argument, 0, 'n'}, - {"version", no_argument, 0, 'v'}, - {0, no_argument, 0, 0} -}; - -int -main (argc, argv) - int argc; - char **argv; -{ - char *result; - int c; - - program_name = argv[0]; - - strip_underscore = prepends_underscore; - - while ((c = getopt_long (argc, argv, "_ns:", long_options, (int *) 0)) != EOF) - { - switch (c) - { - case '?': - usage (stderr, 1); - break; - case 'h': - usage (stdout, 0); - case 'n': - strip_underscore = 0; - break; - case 'v': - printf ("GNU %s version %s\n", program_name, program_version); - exit (0); - case '_': - strip_underscore = 1; - break; - case 's': - if (strcmp (optarg, "gnu") == 0) - { - current_demangling_style = gnu_demangling; - } - else if (strcmp (optarg, "lucid") == 0) - { - current_demangling_style = lucid_demangling; - } - else if (strcmp (optarg, "arm") == 0) - { - current_demangling_style = arm_demangling; - } - else - { - fprintf (stderr, "%s: unknown demangling style `%s'\n", - program_name, optarg); - exit (1); - } - break; - } - } - - if (optind < argc) - { - for ( ; optind < argc; optind++) - { - demangle_it (argv[optind]); - } - } - else - { - for (;;) - { - int i = 0; - c = getchar (); - /* Try to read a label. */ - while (c != EOF && (isalnum(c) || c == '_' || c == '$' || c == '.')) - { - if (i >= MBUF_SIZE-1) - break; - mbuffer[i++] = c; - c = getchar (); - } - if (i > 0) - { - int skip_first = 0; - - if (mbuffer[0] == '.') - ++skip_first; - if (strip_underscore && mbuffer[skip_first] == '_') - ++skip_first; - - if (skip_first > i) - skip_first = i; - - mbuffer[i] = 0; - - result = cplus_demangle (mbuffer + skip_first, - DMGL_PARAMS | DMGL_ANSI); - if (result) - { - if (mbuffer[0] == '.') - putc ('.', stdout); - fputs (result, stdout); - free (result); - } - else - fputs (mbuffer, stdout); - - fflush (stdout); - } - if (c == EOF) - break; - putchar (c); - } - } - - exit (0); -} - -static void -fatal (str) - char *str; -{ - fprintf (stderr, "%s: %s\n", program_name, str); - exit (1); -} - -char * malloc (); -char * realloc (); - -char * -xmalloc (size) - unsigned size; -{ - register char *value = (char *) malloc (size); - if (value == 0) - fatal ("virtual memory exhausted"); - return value; -} - -char * -xrealloc (ptr, size) - char *ptr; - unsigned size; -{ - register char *value = (char *) realloc (ptr, size); - if (value == 0) - fatal ("virtual memory exhausted"); - return value; -} -#endif /* main */ diff --git a/contrib/gdb/libiberty/dummy.c b/contrib/gdb/libiberty/dummy.c deleted file mode 100644 index 08da647e30eba..0000000000000 --- a/contrib/gdb/libiberty/dummy.c +++ /dev/null @@ -1,49 +0,0 @@ -#include <ansidecl.h> - -#ifdef __STDC__ -#include <stddef.h> -#define clock_t unsigned long -#define DEF(NAME, RETURN_TYPE, ARGLIST, ARGS) extern RETURN_TYPE NAME (ARGS); -#define DEFFUNC(NAME, RETURN_TYPE, ARGLIST, ARGS) extern RETURN_TYPE NAME (ARGS); -#else -#define void int -#define size_t unsigned long -#define clock_t unsigned long -#define DEF(NAME, RETURN_TYPE, ARGLIST, ARGS) extern RETURN_TYPE NAME (); -#define DEFFUNC(NAME, RETURN_TYPE, ARGLIST, ARGS) extern RETURN_TYPE NAME (); -#endif - -#define DEFVAR(NAME,DECL,USE) extern DECL; - -#define NOTHING /*nothing*/ - -#include "alloca-conf.h" -#include "functions.def" - -/* Always use our: getopt.o getopt1.o obstack.o spaces.o */ - -int -main (argc, argv) - int argc; char **argv; -{ - -/* Create a dummy function call for each DEF-defined function. */ - -#undef DEF -#undef DEFVAR -#undef DEFFUNC -#undef AND -#define AND = 0; -/* ARGS expands into a set of declaration. NAME ARG_LIST expands - info a function call that uses those variables as actual parameters. - If the function has been DEF'ed correctly, we can pass the right - number and types of parameters, which is nice. (E.g. gcc may - otherwise complain about the wrong number of parameters to certain - builtins.) */ -#define DEF(NAME, RETURN_TYPE, ARG_LIST, ARGS) { ARGS; NAME ARG_LIST; } -#define DEFVAR(NAME, DECL, USE) { USE; } -#define DEFFUNC(NAME, RETURN_TYPE, ARG_LIST, ARGS) { ARGS; NAME ARG_LIST; } -#include "functions.def" - - return (0); -} diff --git a/contrib/gdb/libiberty/fdmatch.c b/contrib/gdb/libiberty/fdmatch.c deleted file mode 100644 index 7af039f5a2b86..0000000000000 --- a/contrib/gdb/libiberty/fdmatch.c +++ /dev/null @@ -1,73 +0,0 @@ -/* Compare two open file descriptors to see if they refer to the same file. - Copyright (C) 1991 Free Software Foundation, Inc. - -This file is part of the libiberty library. -Libiberty is free software; you can redistribute it and/or -modify it under the terms of the GNU Library General Public -License as published by the Free Software Foundation; either -version 2 of the License, or (at your option) any later version. - -Libiberty 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 -Library General Public License for more details. - -You should have received a copy of the GNU Library General Public -License along with libiberty; see the file COPYING.LIB. If -not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, -Boston, MA 02111-1307, USA. */ - - -/* - -NAME - - fdmatch -- see if two file descriptors refer to same file - -SYNOPSIS - - int fdmatch (int fd1, int fd2) - -DESCRIPTION - - Check to see if two open file descriptors refer to the same file. - This is useful, for example, when we have an open file descriptor - for an unnamed file, and the name of a file that we believe to - correspond to that fd. This can happen when we are exec'd with - an already open file (stdout for example) or from the SVR4 /proc - calls that return open file descriptors for mapped address spaces. - All we have to do is open the file by name and check the two file - descriptors for a match, which is done by comparing major&minor - device numbers and inode numbers. - -BUGS - - (FIXME: does this work for networks?) - It works for NFS, which assigns a device number to each mount. - -*/ - -#include "ansidecl.h" -#include "libiberty.h" -#include <sys/types.h> -#include <sys/stat.h> - -int fdmatch (fd1, fd2) - int fd1; - int fd2; -{ - struct stat sbuf1; - struct stat sbuf2; - - if ((fstat (fd1, &sbuf1) == 0) && - (fstat (fd2, &sbuf2) == 0) && - (sbuf1.st_dev == sbuf2.st_dev) && - (sbuf1.st_ino == sbuf2.st_ino)) - { - return (1); - } - else - { - return (0); - } -} diff --git a/contrib/gdb/libiberty/floatformat.c b/contrib/gdb/libiberty/floatformat.c deleted file mode 100644 index 655f4ea9264b0..0000000000000 --- a/contrib/gdb/libiberty/floatformat.c +++ /dev/null @@ -1,385 +0,0 @@ -/* IEEE floating point support routines, for GDB, the GNU Debugger. - Copyright (C) 1991, 1994 Free Software Foundation, Inc. - -This file is part of GDB. - -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 2 of the License, 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ - -#include "floatformat.h" -#include <math.h> /* ldexp */ -#ifdef __STDC__ -#include <stddef.h> -extern void *memcpy (void *s1, const void *s2, size_t n); -extern void *memset (void *s, int c, size_t n); -#else -extern char *memcpy (); -extern char *memset (); -#endif - -/* The odds that CHAR_BIT will be anything but 8 are low enough that I'm not - going to bother with trying to muck around with whether it is defined in - a system header, what we do if not, etc. */ -#define FLOATFORMAT_CHAR_BIT 8 - -/* floatformats for IEEE single and double, big and little endian. */ -const struct floatformat floatformat_ieee_single_big = -{ - floatformat_big, 32, 0, 1, 8, 127, 255, 9, 23, floatformat_intbit_no -}; -const struct floatformat floatformat_ieee_single_little = -{ - floatformat_little, 32, 0, 1, 8, 127, 255, 9, 23, floatformat_intbit_no -}; -const struct floatformat floatformat_ieee_double_big = -{ - floatformat_big, 64, 0, 1, 11, 1023, 2047, 12, 52, floatformat_intbit_no -}; -const struct floatformat floatformat_ieee_double_little = -{ - floatformat_little, 64, 0, 1, 11, 1023, 2047, 12, 52, floatformat_intbit_no -}; - -const struct floatformat floatformat_i387_ext = -{ - floatformat_little, 80, 0, 1, 15, 0x3fff, 0x7fff, 16, 64, - floatformat_intbit_yes -}; -const struct floatformat floatformat_m68881_ext = -{ - /* Note that the bits from 16 to 31 are unused. */ - floatformat_big, 96, 0, 1, 15, 0x3fff, 0x7fff, 32, 64, floatformat_intbit_yes -}; -const struct floatformat floatformat_i960_ext = -{ - /* Note that the bits from 0 to 15 are unused. */ - floatformat_little, 96, 16, 17, 15, 0x3fff, 0x7fff, 32, 64, - floatformat_intbit_yes -}; -const struct floatformat floatformat_m88110_ext = -{ -#ifdef HARRIS_FLOAT_FORMAT - /* Harris uses raw format 128 bytes long, but the number is just an ieee - double, and the last 64 bits are wasted. */ - floatformat_big,128, 0, 1, 11, 0x3ff, 0x7ff, 12, 52, - floatformat_intbit_no -#else - floatformat_big, 80, 0, 1, 15, 0x3fff, 0x7fff, 16, 64, - floatformat_intbit_yes -#endif /* HARRIS_FLOAT_FORMAT */ -}; -const struct floatformat floatformat_arm_ext = -{ - /* Bits 1 to 16 are unused. */ - floatformat_big, 96, 0, 17, 15, 0x3fff, 0x7fff, 32, 64, - floatformat_intbit_yes -}; - -static unsigned long get_field PARAMS ((unsigned char *, - enum floatformat_byteorders, - unsigned int, - unsigned int, - unsigned int)); - -/* Extract a field which starts at START and is LEN bytes long. DATA and - TOTAL_LEN are the thing we are extracting it from, in byteorder ORDER. */ -static unsigned long -get_field (data, order, total_len, start, len) - unsigned char *data; - enum floatformat_byteorders order; - unsigned int total_len; - unsigned int start; - unsigned int len; -{ - unsigned long result; - unsigned int cur_byte; - int cur_bitshift; - - /* Start at the least significant part of the field. */ - cur_byte = (start + len) / FLOATFORMAT_CHAR_BIT; - if (order == floatformat_little) - cur_byte = (total_len / FLOATFORMAT_CHAR_BIT) - cur_byte - 1; - cur_bitshift = - ((start + len) % FLOATFORMAT_CHAR_BIT) - FLOATFORMAT_CHAR_BIT; - result = *(data + cur_byte) >> (-cur_bitshift); - cur_bitshift += FLOATFORMAT_CHAR_BIT; - if (order == floatformat_little) - ++cur_byte; - else - --cur_byte; - - /* Move towards the most significant part of the field. */ - while (cur_bitshift < len) - { - if (len - cur_bitshift < FLOATFORMAT_CHAR_BIT) - /* This is the last byte; zero out the bits which are not part of - this field. */ - result |= - (*(data + cur_byte) & ((1 << (len - cur_bitshift)) - 1)) - << cur_bitshift; - else - result |= *(data + cur_byte) << cur_bitshift; - cur_bitshift += FLOATFORMAT_CHAR_BIT; - if (order == floatformat_little) - ++cur_byte; - else - --cur_byte; - } - return result; -} - -/* Convert from FMT to a double. - FROM is the address of the extended float. - Store the double in *TO. */ - -void -floatformat_to_double (fmt, from, to) - const struct floatformat *fmt; - char *from; - double *to; -{ - unsigned char *ufrom = (unsigned char *)from; - double dto; - long exponent; - unsigned long mant; - unsigned int mant_bits, mant_off; - int mant_bits_left; - - exponent = get_field (ufrom, fmt->byteorder, fmt->totalsize, - fmt->exp_start, fmt->exp_len); - /* Note that if exponent indicates a NaN, we can't really do anything useful - (not knowing if the host has NaN's, or how to build one). So it will - end up as an infinity or something close; that is OK. */ - - mant_bits_left = fmt->man_len; - mant_off = fmt->man_start; - dto = 0.0; - exponent -= fmt->exp_bias; - - /* Build the result algebraically. Might go infinite, underflow, etc; - who cares. */ - while (mant_bits_left > 0) - { - int exp_bits; - exp_bits = mant_bits_left < 32 ? mant_bits_left : 32; - if (mant_bits_left == fmt->man_len - && exp_bits == 32 - && fmt->intbit == floatformat_intbit_no) - { - /* If there is no integer bit, we need to get only 31 bits - so we have room for an integer bit that we create. */ - mant_bits = 31; - } - else - mant_bits = exp_bits; - - mant = get_field (ufrom, fmt->byteorder, fmt->totalsize, - mant_off, mant_bits); - if (mant_bits_left == fmt->man_len) - mant |= 0x80000000; - dto += ldexp ((double)mant, exponent - (exp_bits - 1)); - exponent -= exp_bits; - mant_off += mant_bits; - mant_bits_left -= mant_bits; - } - - /* Negate it if negative. */ - if (get_field (ufrom, fmt->byteorder, fmt->totalsize, fmt->sign_start, 1)) - dto = -dto; - memcpy (to, &dto, sizeof (dto)); -} - -static void put_field PARAMS ((unsigned char *, enum floatformat_byteorders, - unsigned int, - unsigned int, - unsigned int, - unsigned long)); - -/* Set a field which starts at START and is LEN bytes long. DATA and - TOTAL_LEN are the thing we are extracting it from, in byteorder ORDER. */ -static void -put_field (data, order, total_len, start, len, stuff_to_put) - unsigned char *data; - enum floatformat_byteorders order; - unsigned int total_len; - unsigned int start; - unsigned int len; - unsigned long stuff_to_put; -{ - unsigned int cur_byte; - int cur_bitshift; - - /* Start at the least significant part of the field. */ - cur_byte = (start + len) / FLOATFORMAT_CHAR_BIT; - if (order == floatformat_little) - cur_byte = (total_len / FLOATFORMAT_CHAR_BIT) - cur_byte - 1; - cur_bitshift = - ((start + len) % FLOATFORMAT_CHAR_BIT) - FLOATFORMAT_CHAR_BIT; - *(data + cur_byte) &= - ~(((1 << ((start + len) % FLOATFORMAT_CHAR_BIT)) - 1) << (-cur_bitshift)); - *(data + cur_byte) |= - (stuff_to_put & ((1 << FLOATFORMAT_CHAR_BIT) - 1)) << (-cur_bitshift); - cur_bitshift += FLOATFORMAT_CHAR_BIT; - if (order == floatformat_little) - ++cur_byte; - else - --cur_byte; - - /* Move towards the most significant part of the field. */ - while (cur_bitshift < len) - { - if (len - cur_bitshift < FLOATFORMAT_CHAR_BIT) - { - /* This is the last byte. */ - *(data + cur_byte) &= - ~((1 << (len - cur_bitshift)) - 1); - *(data + cur_byte) |= (stuff_to_put >> cur_bitshift); - } - else - *(data + cur_byte) = ((stuff_to_put >> cur_bitshift) - & ((1 << FLOATFORMAT_CHAR_BIT) - 1)); - cur_bitshift += FLOATFORMAT_CHAR_BIT; - if (order == floatformat_little) - ++cur_byte; - else - --cur_byte; - } -} - -/* The converse: convert the double *FROM to an extended float - and store where TO points. Neither FROM nor TO have any alignment - restrictions. */ - -void -floatformat_from_double (fmt, from, to) - CONST struct floatformat *fmt; - double *from; - char *to; -{ - double dfrom; - int exponent; - double mant; - unsigned int mant_bits, mant_off; - int mant_bits_left; - unsigned char *uto = (unsigned char *)to; - - memcpy (&dfrom, from, sizeof (dfrom)); - memset (uto, 0, fmt->totalsize / FLOATFORMAT_CHAR_BIT); - if (dfrom == 0) - return; /* Result is zero */ - if (dfrom != dfrom) - { - /* From is NaN */ - put_field (uto, fmt->byteorder, fmt->totalsize, fmt->exp_start, - fmt->exp_len, fmt->exp_nan); - /* Be sure it's not infinity, but NaN value is irrel */ - put_field (uto, fmt->byteorder, fmt->totalsize, fmt->man_start, - 32, 1); - return; - } - - /* If negative, set the sign bit. */ - if (dfrom < 0) - { - put_field (uto, fmt->byteorder, fmt->totalsize, fmt->sign_start, 1, 1); - dfrom = -dfrom; - } - - /* How to tell an infinity from an ordinary number? FIXME-someday */ - - mant = frexp (dfrom, &exponent); - put_field (uto, fmt->byteorder, fmt->totalsize, fmt->exp_start, fmt->exp_len, - exponent + fmt->exp_bias - 1); - - mant_bits_left = fmt->man_len; - mant_off = fmt->man_start; - while (mant_bits_left > 0) - { - unsigned long mant_long; - mant_bits = mant_bits_left < 32 ? mant_bits_left : 32; - - mant *= 4294967296.0; - mant_long = (unsigned long)mant; - mant -= mant_long; - - /* If the integer bit is implicit, then we need to discard it. - If we are discarding a zero, we should be (but are not) creating - a denormalized number which means adjusting the exponent - (I think). */ - if (mant_bits_left == fmt->man_len - && fmt->intbit == floatformat_intbit_no) - { - mant_long &= 0x7fffffff; - mant_bits -= 1; - } - else if (mant_bits < 32) - { - /* The bits we want are in the most significant MANT_BITS bits of - mant_long. Move them to the least significant. */ - mant_long >>= 32 - mant_bits; - } - - put_field (uto, fmt->byteorder, fmt->totalsize, - mant_off, mant_bits, mant_long); - mant_off += mant_bits; - mant_bits_left -= mant_bits; - } -} - - -#ifdef IEEE_DEBUG - -/* This is to be run on a host which uses IEEE floating point. */ - -void -ieee_test (n) - double n; -{ - double result; - char exten[16]; - - floatformat_to_double (&floatformat_ieee_double_big, &n, &result); - if (n != result) - printf ("Differ(to): %.20g -> %.20g\n", n, result); - floatformat_from_double (&floatformat_ieee_double_big, &n, &result); - if (n != result) - printf ("Differ(from): %.20g -> %.20g\n", n, result); - - floatformat_from_double (&floatformat_m68881_ext, &n, exten); - floatformat_to_double (&floatformat_m68881_ext, exten, &result); - if (n != result) - printf ("Differ(to+from): %.20g -> %.20g\n", n, result); - -#if IEEE_DEBUG > 1 - /* This is to be run on a host which uses 68881 format. */ - { - long double ex = *(long double *)exten; - if (ex != n) - printf ("Differ(from vs. extended): %.20g\n", n); - } -#endif -} - -int -main () -{ - ieee_test (0.5); - ieee_test (256.0); - ieee_test (0.12345); - ieee_test (234235.78907234); - ieee_test (-512.0); - ieee_test (-0.004321); - return 0; -} -#endif diff --git a/contrib/gdb/libiberty/functions.def b/contrib/gdb/libiberty/functions.def deleted file mode 100644 index 8becc89fc64b5..0000000000000 --- a/contrib/gdb/libiberty/functions.def +++ /dev/null @@ -1,67 +0,0 @@ -/* - * List of function definitions that may *optionally* be included - * in libiberty.a. The function names must match the filenames, - * e.g. bzero() is defined in bzero.c. (While each file can contain - * extra functions, do not list them.) - * - * In the default libiberty configuration, these object files - * (e.g bzero.o) are included if and only if cc fails to find - * the corresponding function in libc. - */ - -DEF(atexit, int, (f), void (*f)()) -DEF(bcmp, int, (s1, s2, length), char *s1 AND char *s2 AND int length ) -DEF(bcopy, void, (s1, s2, length), char *s1 AND char *s2 AND int length ) -DEF(bzero, void, (s, length), char *s AND int length) -DEF(clock, clock_t, (), NOTHING) -DEF(getopt, int, (argc, argv, optstring), - int argc AND char **argv AND CONST char *optstring) -DEF(getpagesize, int , (), NOTHING) -DEF(getcwd, char*, (buf, len), char *buf AND int len) -DEF(index, char*, (s, c), char *s AND int c) -DEF(insque, void, (), NOTHING) -DEF(memchr, PTR, (s, c, length), CONST PTR s AND int c AND size_t length) -DEF(memcmp, int, (s1, s2, length), - CONST PTR s1 AND CONST PTR s2 AND size_t length) -DEF(memcpy, PTR, (s1, s2, length), PTR s1 AND CONST PTR s2 AND size_t length) -DEF(memmove, PTR, (s1, s2, length), PTR s1 AND CONST PTR s2 AND size_t length) -DEF(memset, PTR, (s, val, length), PTR s AND int val AND size_t length ) -DEF(random, long int, (), NOTHING) -DEF(rename, int, (f, t), char *f AND char *t) -DEF(rindex, char*, (s, c), char *s AND int c) -DEF(strcasecmp, int, (s1, s2), char *s1 AND char *s2) -DEF(strncasecmp, int, (s1, s2, n), char *s1 AND char *s2 AND int n) -DEF(strchr, char*, (s, c), CONST char *s AND int c) -DEF(strdup, char*, (s1), char * s1) -DEF(strrchr, char*, (s, c), CONST char *s AND int c) -DEF(strstr, char*, (), NOTHING) -DEF(strtod, double, (), NOTHING) -DEF(strtol, long, (), NOTHING) -DEF(strtoul, unsigned long, (), NOTHING) -DEF(tmpnam, char *, (s), char * s) -DEF(vfork, int, (), NOTHING) -DEF(vfprintf, int, (), NOTHING) -DEF(vprintf, int, (), NOTHING) -DEF(vsprintf, int, (), NOTHING) -DEF(sigsetmask, int, (), NOTHING) -DEF(alloca, PTR, (size), size_t size) -DEF(waitpid, int, (pid, statp, opts), int pid AND int* statp AND int opts ) - -/* List of global variables that we want to look for in the host - environment, and to generate an entry NEED_<variable> in config.h - if they are not found. The first arg is the variable name, the - second arg is how to declare the variable, and the third is how to - use it. */ - -DEFVAR(sys_nerr, int sys_nerr, sys_nerr = 0) -DEFVAR(sys_errlist, char *sys_errlist[], sys_errlist[0] = 0) -DEFVAR(sys_siglist, char *sys_siglist[], sys_siglist[0] = 0) - -/* List of global functions that we want to look for in the host - environment, and to generate an entry NEED_<funcname> in config.h - if they are not found. */ - -DEFFUNC(strerror, char*, (), NOTHING) -DEFFUNC(psignal, void, (signo, message), unsigned signo AND char *message) -DEFFUNC(basename, char *, (name), CONST char *name) -DEFFUNC(on_exit, void, (f, arg), void (*f)() AND char *arg) diff --git a/contrib/gdb/libiberty/getcwd.c b/contrib/gdb/libiberty/getcwd.c deleted file mode 100644 index 60c1dd84eed98..0000000000000 --- a/contrib/gdb/libiberty/getcwd.c +++ /dev/null @@ -1,52 +0,0 @@ -/* Emulate getcwd using getwd. - This function is in the public domain. */ - -/* -NAME - getcwd -- get absolute pathname for current working directory - -SYNOPSIS - char *getcwd (char pathname[len], len) - -DESCRIPTION - Copy the absolute pathname for the current working directory into - the supplied buffer and return a pointer to the buffer. If the - current directory's path doesn't fit in LEN characters, the result - is NULL and errno is set. - -BUGS - Emulated via the getwd() call, which is reasonable for most - systems that do not have getcwd(). - -*/ - -#ifndef NO_SYS_PARAM_H -#include <sys/param.h> -#endif -#include <errno.h> - -extern char *getwd (); -extern int errno; - -#ifndef MAXPATHLEN -#define MAXPATHLEN 1024 -#endif - -char * -getcwd (buf, len) - char *buf; - int len; -{ - char ourbuf[MAXPATHLEN]; - char *result; - - result = getwd (ourbuf); - if (result) { - if (strlen (ourbuf) >= len) { - errno = ERANGE; - return 0; - } - strcpy (buf, ourbuf); - } - return buf; -} diff --git a/contrib/gdb/libiberty/getopt.c b/contrib/gdb/libiberty/getopt.c deleted file mode 100644 index 458dca22b448c..0000000000000 --- a/contrib/gdb/libiberty/getopt.c +++ /dev/null @@ -1,757 +0,0 @@ -/* Getopt for GNU. - NOTE: getopt is now part of the C library, so if you don't know what - "Keep this file name-space clean" means, talk to roland@gnu.ai.mit.edu - before changing it! - - Copyright (C) 1987, 88, 89, 90, 91, 92, 93, 94, 95 - Free Software Foundation, Inc. - -This file is part of the libiberty library. This library 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 2, or (at your option) -any later version. - -This library 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 GNU CC; see the file COPYING. If not, write to -the Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - -As a special exception, if you link this library with files -compiled with a GNU compiler to produce an executable, this does not cause -the resulting executable to be covered by the GNU General Public License. -This exception does not however invalidate any other reasons why -the executable file might be covered by the GNU General Public License. */ - -/* This tells Alpha OSF/1 not to define a getopt prototype in <stdio.h>. - Ditto for AIX 3.2 and <stdlib.h>. */ -#ifndef _NO_PROTO -#define _NO_PROTO -#endif - -#ifdef HAVE_CONFIG_H -#if defined (emacs) || defined (CONFIG_BROKETS) -/* We use <config.h> instead of "config.h" so that a compilation - using -I. -I$srcdir will use ./config.h rather than $srcdir/config.h - (which it would do because it found this file in $srcdir). */ -#include <config.h> -#else -#include "config.h" -#endif -#endif - -#ifndef __STDC__ -/* This is a separate conditional since some stdc systems - reject `defined (const)'. */ -#ifndef const -#define const -#endif -#endif - -#include <stdio.h> - -/* Comment out all this code if we are using the GNU C Library, and are not - actually compiling the library itself. This code is part of the GNU C - Library, but also included in many other GNU distributions. Compiling - and linking in this code is a waste when using the GNU C library - (especially if it is a shared library). Rather than having every GNU - program understand `configure --with-gnu-libc' and omit the object files, - it is simpler to just do this in the source for each such file. */ -/* Many versions of the Linux C library include older, broken versions - of these routines, which will break the linker's command-line - parsing. */ - -#if defined (_LIBC) || !defined (__GNU_LIBRARY__) || defined (__linux__) - - -/* This needs to come after some library #include - to get __GNU_LIBRARY__ defined. */ -#ifdef __GNU_LIBRARY__ -/* Don't include stdlib.h for non-GNU C libraries because some of them - contain conflicting prototypes for getopt. */ -#include <stdlib.h> -#endif /* GNU C library. */ - -/* This version of `getopt' appears to the caller like standard Unix `getopt' - but it behaves differently for the user, since it allows the user - to intersperse the options with the other arguments. - - As `getopt' works, it permutes the elements of ARGV so that, - when it is done, all the options precede everything else. Thus - all application programs are extended to handle flexible argument order. - - Setting the environment variable POSIXLY_CORRECT disables permutation. - Then the behavior is completely standard. - - GNU application programs can use a third alternative mode in which - they can distinguish the relative order of options and other arguments. */ - -#include "getopt.h" - -/* For communication from `getopt' to the caller. - When `getopt' finds an option that takes an argument, - the argument value is returned here. - Also, when `ordering' is RETURN_IN_ORDER, - each non-option ARGV-element is returned here. */ - -char *optarg = NULL; - -/* Index in ARGV of the next element to be scanned. - This is used for communication to and from the caller - and for communication between successive calls to `getopt'. - - On entry to `getopt', zero means this is the first call; initialize. - - When `getopt' returns EOF, this is the index of the first of the - non-option elements that the caller should itself scan. - - Otherwise, `optind' communicates from one call to the next - how much of ARGV has been scanned so far. */ - -/* XXX 1003.2 says this must be 1 before any call. */ -int optind = 0; - -/* The next char to be scanned in the option-element - in which the last option character we returned was found. - This allows us to pick up the scan where we left off. - - If this is zero, or a null string, it means resume the scan - by advancing to the next ARGV-element. */ - -static char *nextchar; - -/* Callers store zero here to inhibit the error message - for unrecognized options. */ - -int opterr = 1; - -/* Set to an option character which was unrecognized. - This must be initialized on some systems to avoid linking in the - system's own getopt implementation. */ - -int optopt = '?'; - -/* Describe how to deal with options that follow non-option ARGV-elements. - - If the caller did not specify anything, - the default is REQUIRE_ORDER if the environment variable - POSIXLY_CORRECT is defined, PERMUTE otherwise. - - REQUIRE_ORDER means don't recognize them as options; - stop option processing when the first non-option is seen. - This is what Unix does. - This mode of operation is selected by either setting the environment - variable POSIXLY_CORRECT, or using `+' as the first character - of the list of option characters. - - PERMUTE is the default. We permute the contents of ARGV as we scan, - so that eventually all the non-options are at the end. This allows options - to be given in any order, even with programs that were not written to - expect this. - - RETURN_IN_ORDER is an option available to programs that were written - to expect options and other ARGV-elements in any order and that care about - the ordering of the two. We describe each non-option ARGV-element - as if it were the argument of an option with character code 1. - Using `-' as the first character of the list of option characters - selects this mode of operation. - - The special argument `--' forces an end of option-scanning regardless - of the value of `ordering'. In the case of RETURN_IN_ORDER, only - `--' can cause `getopt' to return EOF with `optind' != ARGC. */ - -static enum -{ - REQUIRE_ORDER, PERMUTE, RETURN_IN_ORDER -} ordering; - -#ifdef __GNU_LIBRARY__ -/* We want to avoid inclusion of string.h with non-GNU libraries - because there are many ways it can cause trouble. - On some systems, it contains special magic macros that don't work - in GCC. */ -#include <string.h> -#define my_index strchr -#else - -/* Avoid depending on library functions or files - whose names are inconsistent. */ - -char *getenv (); - -static char * -my_index (str, chr) - const char *str; - int chr; -{ - while (*str) - { - if (*str == chr) - return (char *) str; - str++; - } - return 0; -} - -/* If using GCC, we can safely declare strlen this way. - If not using GCC, it is ok not to declare it. */ -#ifdef __GNUC__ -/* Note that Motorola Delta 68k R3V7 comes with GCC but not stddef.h. - That was relevant to code that was here before. */ -#ifndef __STDC__ -/* gcc with -traditional declares the built-in strlen to return int, - and has done so at least since version 2.4.5. -- rms. */ -extern int strlen (const char *); -#endif /* not __STDC__ */ -#endif /* __GNUC__ */ - -#endif /* not __GNU_LIBRARY__ */ - -/* Handle permutation of arguments. */ - -/* Describe the part of ARGV that contains non-options that have - been skipped. `first_nonopt' is the index in ARGV of the first of them; - `last_nonopt' is the index after the last of them. */ - -static int first_nonopt; -static int last_nonopt; - -/* Exchange two adjacent subsequences of ARGV. - One subsequence is elements [first_nonopt,last_nonopt) - which contains all the non-options that have been skipped so far. - The other is elements [last_nonopt,optind), which contains all - the options processed since those non-options were skipped. - - `first_nonopt' and `last_nonopt' are relocated so that they describe - the new indices of the non-options in ARGV after they are moved. */ - -static void -exchange (argv) - char **argv; -{ - int bottom = first_nonopt; - int middle = last_nonopt; - int top = optind; - char *tem; - - /* Exchange the shorter segment with the far end of the longer segment. - That puts the shorter segment into the right place. - It leaves the longer segment in the right place overall, - but it consists of two parts that need to be swapped next. */ - - while (top > middle && middle > bottom) - { - if (top - middle > middle - bottom) - { - /* Bottom segment is the short one. */ - int len = middle - bottom; - register int i; - - /* Swap it with the top part of the top segment. */ - for (i = 0; i < len; i++) - { - tem = argv[bottom + i]; - argv[bottom + i] = argv[top - (middle - bottom) + i]; - argv[top - (middle - bottom) + i] = tem; - } - /* Exclude the moved bottom segment from further swapping. */ - top -= len; - } - else - { - /* Top segment is the short one. */ - int len = top - middle; - register int i; - - /* Swap it with the bottom part of the bottom segment. */ - for (i = 0; i < len; i++) - { - tem = argv[bottom + i]; - argv[bottom + i] = argv[middle + i]; - argv[middle + i] = tem; - } - /* Exclude the moved top segment from further swapping. */ - bottom += len; - } - } - - /* Update records for the slots the non-options now occupy. */ - - first_nonopt += (optind - last_nonopt); - last_nonopt = optind; -} - -/* Initialize the internal data when the first call is made. */ - -static const char * -_getopt_initialize (optstring) - const char *optstring; -{ - /* Start processing options with ARGV-element 1 (since ARGV-element 0 - is the program name); the sequence of previously skipped - non-option ARGV-elements is empty. */ - - first_nonopt = last_nonopt = optind = 1; - - nextchar = NULL; - - /* Determine how to handle the ordering of options and nonoptions. */ - - if (optstring[0] == '-') - { - ordering = RETURN_IN_ORDER; - ++optstring; - } - else if (optstring[0] == '+') - { - ordering = REQUIRE_ORDER; - ++optstring; - } - else if (getenv ("POSIXLY_CORRECT") != NULL) - ordering = REQUIRE_ORDER; - else - ordering = PERMUTE; - - return optstring; -} - -/* Scan elements of ARGV (whose length is ARGC) for option characters - given in OPTSTRING. - - If an element of ARGV starts with '-', and is not exactly "-" or "--", - then it is an option element. The characters of this element - (aside from the initial '-') are option characters. If `getopt' - is called repeatedly, it returns successively each of the option characters - from each of the option elements. - - If `getopt' finds another option character, it returns that character, - updating `optind' and `nextchar' so that the next call to `getopt' can - resume the scan with the following option character or ARGV-element. - - If there are no more option characters, `getopt' returns `EOF'. - Then `optind' is the index in ARGV of the first ARGV-element - that is not an option. (The ARGV-elements have been permuted - so that those that are not options now come last.) - - OPTSTRING is a string containing the legitimate option characters. - If an option character is seen that is not listed in OPTSTRING, - return '?' after printing an error message. If you set `opterr' to - zero, the error message is suppressed but we still return '?'. - - If a char in OPTSTRING is followed by a colon, that means it wants an arg, - so the following text in the same ARGV-element, or the text of the following - ARGV-element, is returned in `optarg'. Two colons mean an option that - wants an optional arg; if there is text in the current ARGV-element, - it is returned in `optarg', otherwise `optarg' is set to zero. - - If OPTSTRING starts with `-' or `+', it requests different methods of - handling the non-option ARGV-elements. - See the comments about RETURN_IN_ORDER and REQUIRE_ORDER, above. - - Long-named options begin with `--' instead of `-'. - Their names may be abbreviated as long as the abbreviation is unique - or is an exact match for some defined option. If they have an - argument, it follows the option name in the same ARGV-element, separated - from the option name by a `=', or else the in next ARGV-element. - When `getopt' finds a long-named option, it returns 0 if that option's - `flag' field is nonzero, the value of the option's `val' field - if the `flag' field is zero. - - The elements of ARGV aren't really const, because we permute them. - But we pretend they're const in the prototype to be compatible - with other systems. - - LONGOPTS is a vector of `struct option' terminated by an - element containing a name which is zero. - - LONGIND returns the index in LONGOPT of the long-named option found. - It is only valid when a long-named option has been found by the most - recent call. - - If LONG_ONLY is nonzero, '-' as well as '--' can introduce - long-named options. */ - -int -_getopt_internal (argc, argv, optstring, longopts, longind, long_only) - int argc; - char *const *argv; - const char *optstring; - const struct option *longopts; - int *longind; - int long_only; -{ - optarg = NULL; - - if (optind == 0) - optstring = _getopt_initialize (optstring); - - if (nextchar == NULL || *nextchar == '\0') - { - /* Advance to the next ARGV-element. */ - - if (ordering == PERMUTE) - { - /* If we have just processed some options following some non-options, - exchange them so that the options come first. */ - - if (first_nonopt != last_nonopt && last_nonopt != optind) - exchange ((char **) argv); - else if (last_nonopt != optind) - first_nonopt = optind; - - /* Skip any additional non-options - and extend the range of non-options previously skipped. */ - - while (optind < argc - && (argv[optind][0] != '-' || argv[optind][1] == '\0')) - optind++; - last_nonopt = optind; - } - - /* The special ARGV-element `--' means premature end of options. - Skip it like a null option, - then exchange with previous non-options as if it were an option, - then skip everything else like a non-option. */ - - if (optind != argc && !strcmp (argv[optind], "--")) - { - optind++; - - if (first_nonopt != last_nonopt && last_nonopt != optind) - exchange ((char **) argv); - else if (first_nonopt == last_nonopt) - first_nonopt = optind; - last_nonopt = argc; - - optind = argc; - } - - /* If we have done all the ARGV-elements, stop the scan - and back over any non-options that we skipped and permuted. */ - - if (optind == argc) - { - /* Set the next-arg-index to point at the non-options - that we previously skipped, so the caller will digest them. */ - if (first_nonopt != last_nonopt) - optind = first_nonopt; - return EOF; - } - - /* If we have come to a non-option and did not permute it, - either stop the scan or describe it to the caller and pass it by. */ - - if ((argv[optind][0] != '-' || argv[optind][1] == '\0')) - { - if (ordering == REQUIRE_ORDER) - return EOF; - optarg = argv[optind++]; - return 1; - } - - /* We have found another option-ARGV-element. - Skip the initial punctuation. */ - - nextchar = (argv[optind] + 1 - + (longopts != NULL && argv[optind][1] == '-')); - } - - /* Decode the current option-ARGV-element. */ - - /* Check whether the ARGV-element is a long option. - - If long_only and the ARGV-element has the form "-f", where f is - a valid short option, don't consider it an abbreviated form of - a long option that starts with f. Otherwise there would be no - way to give the -f short option. - - On the other hand, if there's a long option "fubar" and - the ARGV-element is "-fu", do consider that an abbreviation of - the long option, just like "--fu", and not "-f" with arg "u". - - This distinction seems to be the most useful approach. */ - - if (longopts != NULL - && (argv[optind][1] == '-' - || (long_only && (argv[optind][2] || !my_index (optstring, argv[optind][1]))))) - { - char *nameend; - const struct option *p; - const struct option *pfound = NULL; - int exact = 0; - int ambig = 0; - int indfound; - int option_index; - - for (nameend = nextchar; *nameend && *nameend != '='; nameend++) - /* Do nothing. */ ; - - /* Test all long options for either exact match - or abbreviated matches. */ - for (p = longopts, option_index = 0; p->name; p++, option_index++) - if (!strncmp (p->name, nextchar, nameend - nextchar)) - { - if (nameend - nextchar == strlen (p->name)) - { - /* Exact match found. */ - pfound = p; - indfound = option_index; - exact = 1; - break; - } - else if (pfound == NULL) - { - /* First nonexact match found. */ - pfound = p; - indfound = option_index; - } - else - /* Second or later nonexact match found. */ - ambig = 1; - } - - if (ambig && !exact) - { - if (opterr) - fprintf (stderr, "%s: option `%s' is ambiguous\n", - argv[0], argv[optind]); - nextchar += strlen (nextchar); - optind++; - return '?'; - } - - if (pfound != NULL) - { - option_index = indfound; - optind++; - if (*nameend) - { - /* Don't test has_arg with >, because some C compilers don't - allow it to be used on enums. */ - if (pfound->has_arg) - optarg = nameend + 1; - else - { - if (opterr) - { - if (argv[optind - 1][1] == '-') - /* --option */ - fprintf (stderr, - "%s: option `--%s' doesn't allow an argument\n", - argv[0], pfound->name); - else - /* +option or -option */ - fprintf (stderr, - "%s: option `%c%s' doesn't allow an argument\n", - argv[0], argv[optind - 1][0], pfound->name); - } - nextchar += strlen (nextchar); - return '?'; - } - } - else if (pfound->has_arg == 1) - { - if (optind < argc) - optarg = argv[optind++]; - else - { - if (opterr) - fprintf (stderr, "%s: option `%s' requires an argument\n", - argv[0], argv[optind - 1]); - nextchar += strlen (nextchar); - return optstring[0] == ':' ? ':' : '?'; - } - } - nextchar += strlen (nextchar); - if (longind != NULL) - *longind = option_index; - if (pfound->flag) - { - *(pfound->flag) = pfound->val; - return 0; - } - return pfound->val; - } - - /* Can't find it as a long option. If this is not getopt_long_only, - or the option starts with '--' or is not a valid short - option, then it's an error. - Otherwise interpret it as a short option. */ - if (!long_only || argv[optind][1] == '-' - || my_index (optstring, *nextchar) == NULL) - { - if (opterr) - { - if (argv[optind][1] == '-') - /* --option */ - fprintf (stderr, "%s: unrecognized option `--%s'\n", - argv[0], nextchar); - else - /* +option or -option */ - fprintf (stderr, "%s: unrecognized option `%c%s'\n", - argv[0], argv[optind][0], nextchar); - } - nextchar = (char *) ""; - optind++; - return '?'; - } - } - - /* Look at and handle the next short option-character. */ - - { - char c = *nextchar++; - char *temp = my_index (optstring, c); - - /* Increment `optind' when we start to process its last character. */ - if (*nextchar == '\0') - ++optind; - - if (temp == NULL || c == ':') - { - if (opterr) - { - /* 1003.2 specifies the format of this message. */ - fprintf (stderr, "%s: illegal option -- %c\n", argv[0], c); - } - optopt = c; - return '?'; - } - if (temp[1] == ':') - { - if (temp[2] == ':') - { - /* This is an option that accepts an argument optionally. */ - if (*nextchar != '\0') - { - optarg = nextchar; - optind++; - } - else - optarg = NULL; - nextchar = NULL; - } - else - { - /* This is an option that requires an argument. */ - if (*nextchar != '\0') - { - optarg = nextchar; - /* If we end this ARGV-element by taking the rest as an arg, - we must advance to the next element now. */ - optind++; - } - else if (optind == argc) - { - if (opterr) - { - /* 1003.2 specifies the format of this message. */ - fprintf (stderr, "%s: option requires an argument -- %c\n", - argv[0], c); - } - optopt = c; - if (optstring[0] == ':') - c = ':'; - else - c = '?'; - } - else - /* We already incremented `optind' once; - increment it again when taking next ARGV-elt as argument. */ - optarg = argv[optind++]; - nextchar = NULL; - } - } - return c; - } -} - -int -getopt (argc, argv, optstring) - int argc; - char *const *argv; - const char *optstring; -{ - return _getopt_internal (argc, argv, optstring, - (const struct option *) 0, - (int *) 0, - 0); -} - -#endif /* _LIBC or not __GNU_LIBRARY__. */ - -#ifdef TEST - -/* Compile with -DTEST to make an executable for use in testing - the above definition of `getopt'. */ - -int -main (argc, argv) - int argc; - char **argv; -{ - int c; - int digit_optind = 0; - - while (1) - { - int this_option_optind = optind ? optind : 1; - - c = getopt (argc, argv, "abc:d:0123456789"); - if (c == EOF) - break; - - switch (c) - { - case '0': - case '1': - case '2': - case '3': - case '4': - case '5': - case '6': - case '7': - case '8': - case '9': - if (digit_optind != 0 && digit_optind != this_option_optind) - printf ("digits occur in two different argv-elements.\n"); - digit_optind = this_option_optind; - printf ("option %c\n", c); - break; - - case 'a': - printf ("option a\n"); - break; - - case 'b': - printf ("option b\n"); - break; - - case 'c': - printf ("option c with value `%s'\n", optarg); - break; - - case '?': - break; - - default: - printf ("?? getopt returned character code 0%o ??\n", c); - } - } - - if (optind < argc) - { - printf ("non-option ARGV-elements: "); - while (optind < argc) - printf ("%s ", argv[optind++]); - printf ("\n"); - } - - exit (0); -} - -#endif /* TEST */ diff --git a/contrib/gdb/libiberty/getopt1.c b/contrib/gdb/libiberty/getopt1.c deleted file mode 100644 index c3400e5b64361..0000000000000 --- a/contrib/gdb/libiberty/getopt1.c +++ /dev/null @@ -1,190 +0,0 @@ -/* getopt_long and getopt_long_only entry points for GNU getopt. - Copyright (C) 1987, 88, 89, 90, 91, 92, 1993 - Free Software Foundation, Inc. - - This program is free software; you can redistribute it and/or - modify it under the terms of the GNU Library General Public License - as published by the Free Software Foundation; either version 2, 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 Library General Public License for more details. - - You should have received a copy of the GNU Library General Public License - along with this program; if not, write to the Free Software - Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ - -#ifdef HAVE_CONFIG_H -#if defined (emacs) || defined (CONFIG_BROKETS) -/* We use <config.h> instead of "config.h" so that a compilation - using -I. -I$srcdir will use ./config.h rather than $srcdir/config.h - (which it would do because it found this file in $srcdir). */ -#include <config.h> -#else -#include "config.h" -#endif -#endif - -#include "getopt.h" - -#ifndef __STDC__ -/* This is a separate conditional since some stdc systems - reject `defined (const)'. */ -#ifndef const -#define const -#endif -#endif - -#include <stdio.h> - -/* Comment out all this code if we are using the GNU C Library, and are not - actually compiling the library itself. This code is part of the GNU C - Library, but also included in many other GNU distributions. Compiling - and linking in this code is a waste when using the GNU C library - (especially if it is a shared library). Rather than having every GNU - program understand `configure --with-gnu-libc' and omit the object files, - it is simpler to just do this in the source for each such file. */ -/* Many versions of the Linux C library include older, broken versions - of these routines, which will break the linker's command-line - parsing. */ - -#if defined (_LIBC) || !defined (__GNU_LIBRARY__) || defined (__linux__) - - -/* This needs to come after some library #include - to get __GNU_LIBRARY__ defined. */ -#ifdef __GNU_LIBRARY__ -#include <stdlib.h> -#else -char *getenv (); -#endif - -#ifndef NULL -#define NULL 0 -#endif - -int -getopt_long (argc, argv, options, long_options, opt_index) - int argc; - char *const *argv; - const char *options; - const struct option *long_options; - int *opt_index; -{ - return _getopt_internal (argc, argv, options, long_options, opt_index, 0); -} - -/* Like getopt_long, but '-' as well as '--' can indicate a long option. - If an option that starts with '-' (not '--') doesn't match a long option, - but does match a short option, it is parsed as a short option - instead. */ - -int -getopt_long_only (argc, argv, options, long_options, opt_index) - int argc; - char *const *argv; - const char *options; - const struct option *long_options; - int *opt_index; -{ - return _getopt_internal (argc, argv, options, long_options, opt_index, 1); -} - - -#endif /* _LIBC or not __GNU_LIBRARY__. */ - -#ifdef TEST - -#include <stdio.h> - -int -main (argc, argv) - int argc; - char **argv; -{ - int c; - int digit_optind = 0; - - while (1) - { - int this_option_optind = optind ? optind : 1; - int option_index = 0; - static struct option long_options[] = - { - {"add", 1, 0, 0}, - {"append", 0, 0, 0}, - {"delete", 1, 0, 0}, - {"verbose", 0, 0, 0}, - {"create", 0, 0, 0}, - {"file", 1, 0, 0}, - {0, 0, 0, 0} - }; - - c = getopt_long (argc, argv, "abc:d:0123456789", - long_options, &option_index); - if (c == EOF) - break; - - switch (c) - { - case 0: - printf ("option %s", long_options[option_index].name); - if (optarg) - printf (" with arg %s", optarg); - printf ("\n"); - break; - - case '0': - case '1': - case '2': - case '3': - case '4': - case '5': - case '6': - case '7': - case '8': - case '9': - if (digit_optind != 0 && digit_optind != this_option_optind) - printf ("digits occur in two different argv-elements.\n"); - digit_optind = this_option_optind; - printf ("option %c\n", c); - break; - - case 'a': - printf ("option a\n"); - break; - - case 'b': - printf ("option b\n"); - break; - - case 'c': - printf ("option c with value `%s'\n", optarg); - break; - - case 'd': - printf ("option d with value `%s'\n", optarg); - break; - - case '?': - break; - - default: - printf ("?? getopt returned character code 0%o ??\n", c); - } - } - - if (optind < argc) - { - printf ("non-option ARGV-elements: "); - while (optind < argc) - printf ("%s ", argv[optind++]); - printf ("\n"); - } - - exit (0); -} - -#endif /* TEST */ diff --git a/contrib/gdb/libiberty/getpagesize.c b/contrib/gdb/libiberty/getpagesize.c deleted file mode 100644 index e9784b8520b89..0000000000000 --- a/contrib/gdb/libiberty/getpagesize.c +++ /dev/null @@ -1,89 +0,0 @@ -/* Emulation of getpagesize() for systems that need it. */ - -/* - -NAME - - getpagesize -- return the number of bytes in page of memory - -SYNOPSIS - - int getpagesize (void) - -DESCRIPTION - - Returns the number of bytes in a page of memory. This is the - granularity of many of the system memory management routines. - No guarantee is made as to whether or not it is the same as the - basic memory management hardware page size. - -BUGS - - Is intended as a reasonable replacement for systems where this - is not provided as a system call. The value of 4096 may or may - not be correct for the systems where it is returned as the default - value. - -*/ - -#ifndef VMS - -#include <sys/types.h> -#ifndef NO_SYS_PARAM_H -#include <sys/param.h> -#endif - -#ifdef HAVE_SYSCONF -#include <unistd.h> -#define GNU_OUR_PAGESIZE sysconf(_SC_PAGESIZE) -#else -#ifdef PAGESIZE -#define GNU_OUR_PAGESIZE PAGESIZE -#else /* no PAGESIZE */ -#ifdef EXEC_PAGESIZE -#define GNU_OUR_PAGESIZE EXEC_PAGESIZE -#else /* no EXEC_PAGESIZE */ -#ifdef NBPG -#define GNU_OUR_PAGESIZE (NBPG * CLSIZE) -#ifndef CLSIZE -#define CLSIZE 1 -#endif /* CLSIZE */ -#else /* no NBPG */ -#ifdef NBPC -#define GNU_OUR_PAGESIZE NBPC -#else /* no NBPC */ -#define GNU_OUR_PAGESIZE 4096 /* Just punt and use reasonable value */ -#endif /* NBPC */ -#endif /* NBPG */ -#endif /* EXEC_PAGESIZE */ -#endif /* PAGESIZE */ -#endif /* HAVE_SYSCONF */ - -int -getpagesize () -{ - return (GNU_OUR_PAGESIZE); -} - -#else /* VMS */ - -#if 0 /* older distributions of gcc-vms are missing <syidef.h> */ -#include <syidef.h> -#endif -#ifndef SYI$_PAGE_SIZE /* VMS V5.4 and earlier didn't have this yet */ -#define SYI$_PAGE_SIZE 4452 -#endif -extern unsigned long lib$getsyi(const unsigned short *,...); - -int getpagesize () -{ - long pagsiz = 0L; - unsigned short itmcod = SYI$_PAGE_SIZE; - - (void) lib$getsyi (&itmcod, (void *) &pagsiz); - if (pagsiz == 0L) - pagsiz = 512L; /* VAX default */ - return (int) pagsiz; -} - -#endif /* VMS */ diff --git a/contrib/gdb/libiberty/getruntime.c b/contrib/gdb/libiberty/getruntime.c deleted file mode 100644 index 1be3b4c4a2a07..0000000000000 --- a/contrib/gdb/libiberty/getruntime.c +++ /dev/null @@ -1,82 +0,0 @@ -/* Return time used so far, in microseconds. - Copyright (C) 1994 Free Software Foundation, Inc. - -This file is part of the libiberty library. -Libiberty is free software; you can redistribute it and/or -modify it under the terms of the GNU Library General Public -License as published by the Free Software Foundation; either -version 2 of the License, or (at your option) any later version. - -Libiberty 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 -Library General Public License for more details. - -You should have received a copy of the GNU Library General Public -License along with libiberty; see the file COPYING.LIB. If -not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, -Boston, MA 02111-1307, USA. */ - -#include "ansidecl.h" -#include "libiberty.h" - -/* There are several ways to get elapsed execution time; unfortunately no - single way is available for all host systems, nor are there reliable - ways to find out which way is correct for a given host. */ - -#include <time.h> - -/* These should go away when libiberty uses autoconf. */ - -#if defined(__sun__) && !defined(__svr4__) -#define HAVE_GETRUSAGE -#endif - -#ifdef HAVE_SYSCONF -#define HAVE_TIMES -#endif - -#ifdef HAVE_GETRUSAGE -#include <sys/time.h> -#include <sys/resource.h> -#endif - -#ifdef HAVE_TIMES -#ifndef NO_SYS_PARAM_H -#include <sys/param.h> -#endif -#include <sys/times.h> -#endif - -/* This is a fallback; if wrong, it will likely make obviously wrong - results. */ - -#ifndef CLOCKS_PER_SEC -#define CLOCKS_PER_SEC 1 -#endif - -long -get_run_time () -{ -#ifdef HAVE_GETRUSAGE - struct rusage rusage; - - getrusage (0, &rusage); - return (rusage.ru_utime.tv_sec * 1000000 + rusage.ru_utime.tv_usec - + rusage.ru_stime.tv_sec * 1000000 + rusage.ru_stime.tv_usec); -#else /* ! HAVE_GETRUSAGE */ -#ifdef HAVE_TIMES - struct tms tms; - - times (&tms); - return (tms.tms_utime + tms.tms_stime) * (1000000 / HZ); -#else /* ! HAVE_TIMES */ - /* Fall back on clock and hope it's correctly implemented. */ - const long clocks_per_sec = CLOCKS_PER_SEC; - if (clocks_per_sec <= 1000000) - return clock () * (1000000 / clocks_per_sec); - else - return clock () / clocks_per_sec; -#endif /* HAVE_TIMES */ -#endif /* HAVE_GETRUSAGE */ -} diff --git a/contrib/gdb/libiberty/hex.c b/contrib/gdb/libiberty/hex.c deleted file mode 100644 index 3a2eef03d4c07..0000000000000 --- a/contrib/gdb/libiberty/hex.c +++ /dev/null @@ -1,33 +0,0 @@ -/* Hex character manipulation support. - Copyright (C) 1995 Free Software Foundation, Inc. - -This file is part of the libiberty library. -Libiberty is free software; you can redistribute it and/or -modify it under the terms of the GNU Library General Public -License as published by the Free Software Foundation; either -version 2 of the License, or (at your option) any later version. - -Libiberty 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 -Library General Public License for more details. - -You should have received a copy of the GNU Library General Public -License along with libiberty; see the file COPYING.LIB. If -not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, -Boston, MA 02111-1307, USA. */ - -#include "libiberty.h" - -char _hex_value[_hex_array_size]; - -void hex_init () -{ - int i; - for (i = 0; i < _hex_array_size; i++) - _hex_value[i] = _hex_bad; - for (i = 0; i < 10; i++) - _hex_value['0' + i] = i; - for (i = 0; i < 6; i++) - _hex_value['a' + i] = _hex_value['A' + i] = 10 + i; -} diff --git a/contrib/gdb/libiberty/index.c b/contrib/gdb/libiberty/index.c deleted file mode 100644 index e5a00f54d9468..0000000000000 --- a/contrib/gdb/libiberty/index.c +++ /dev/null @@ -1,11 +0,0 @@ -/* Stub implementation of (obsolete) index(). */ - -extern char * strchr(); - -char * -index (s, c) - char *s; - int c; -{ - return strchr (s, c); -} diff --git a/contrib/gdb/libiberty/insque.c b/contrib/gdb/libiberty/insque.c deleted file mode 100644 index 775019f8fffc9..0000000000000 --- a/contrib/gdb/libiberty/insque.c +++ /dev/null @@ -1,50 +0,0 @@ -/* insque(3C) routines - This file is in the public domain. */ - -/* -NAME - insque, remque -- insert, remove an element from a queue - -SYNOPSIS - struct qelem { - struct qelem *q_forw; - struct qelem *q_back; - char q_data[]; - }; - - void insque (struct qelem *elem, struct qelem *pred) - - void remque (struct qelem *elem) - -DESCRIPTION - Routines to manipulate queues built from doubly linked lists. - The insque routine inserts ELEM in the queue immediately after - PRED. The remque routine removes ELEM from its containing queue. -*/ - - -struct qelem { - struct qelem *q_forw; - struct qelem *q_back; -}; - - -void -insque (elem, pred) - struct qelem *elem; - struct qelem *pred; -{ - elem -> q_forw = pred -> q_forw; - pred -> q_forw -> q_back = elem; - elem -> q_back = pred; - pred -> q_forw = elem; -} - - -void -remque (elem) - struct qelem *elem; -{ - elem -> q_forw -> q_back = elem -> q_back; - elem -> q_back -> q_forw = elem -> q_forw; -} diff --git a/contrib/gdb/libiberty/makefile.dos b/contrib/gdb/libiberty/makefile.dos deleted file mode 100644 index 7eba62c339531..0000000000000 --- a/contrib/gdb/libiberty/makefile.dos +++ /dev/null @@ -1,29 +0,0 @@ -CFLAGS=-O2 - -OBJS = \ - argv.o \ - basename.o \ - concat.o \ - cplus-dem.o \ - fdmatch.o \ - floatformat.o \ - getopt.o \ - getopt1.o \ - getruntime.o \ - hex.o \ - msdos.o \ - obstack.o \ - spaces.o \ - strerror.o \ - strsignal.o \ - xatexit.o \ - xexit.o \ - xmalloc.o \ - $E - -.c.o: - gcc -I../include $(CFLAGS) -c $< - -libiberty.a : $(OBJS) - -rm libiberty.a - ar rvs libiberty.a $(OBJS) diff --git a/contrib/gdb/libiberty/memchr.c b/contrib/gdb/libiberty/memchr.c deleted file mode 100644 index 93ef43d3f88d5..0000000000000 --- a/contrib/gdb/libiberty/memchr.c +++ /dev/null @@ -1,60 +0,0 @@ -/* -FUNCTION - <<memchr>>---find character in memory - -INDEX - memchr - -ANSI_SYNOPSIS - #include <string.h> - void *memchr(const void *<[src]>, int <[c]>, size_t <[length]>); - -TRAD_SYNOPSIS - #include <string.h> - void *memchr(<[src]>, <[c]>, <[length]>) - void *<[src]>; - void *<[c]>; - size_t <[length]>; - -DESCRIPTION - This function searches memory starting at <<*<[src]>>> for the - character <[c]>. The search only ends with the first - occurrence of <[c]>, or after <[length]> characters; in - particular, <<NULL>> does not terminate the search. - -RETURNS - If the character <[c]> is found within <[length]> characters - of <<*<[src]>>>, a pointer to the character is returned. If - <[c]> is not found, then <<NULL>> is returned. - -PORTABILITY -<<memchr>> requires no supporting OS subroutines. - -QUICKREF - memchr ansi pure - -*/ - -#include <ansidecl.h> -#ifdef __STDC__ -#include <stddef.h> -#else -#define size_t unsigned long -#endif - -PTR -memchr (src_void, c, length) - register CONST PTR src_void; - int c; - size_t length; -{ - CONST unsigned char *src = (CONST unsigned char *)src_void; - - while (--length >= 0) - { - if (*src == c) - return (PTR)src; - src++; - } - return NULL; -} diff --git a/contrib/gdb/libiberty/memcmp.c b/contrib/gdb/libiberty/memcmp.c deleted file mode 100644 index 127ae0c8019d2..0000000000000 --- a/contrib/gdb/libiberty/memcmp.c +++ /dev/null @@ -1,38 +0,0 @@ -/* memcmp -- compare two memory regions. - This function is in the public domain. */ - -/* -NAME - memcmp -- compare two memory regions - -SYNOPSIS - int memcmp (const void *from, const void *to, size_t count) - -DESCRIPTION - Compare two memory regions and return less than, - equal to, or greater than zero, according to lexicographical - ordering of the compared regions. -*/ - -#include <ansidecl.h> -#ifdef __STDC__ -#include <stddef.h> -#else -#define size_t unsigned long -#endif - -int -DEFUN(memcmp, (str1, str2, count), - const PTR str1 AND const PTR str2 AND size_t count) -{ - register unsigned char *s1 = (unsigned char*)str1; - register unsigned char *s2 = (unsigned char*)str2; - - while (count-- > 0) - { - if (*s1++ != *s2++) - return s1[-1] < s2[-1] ? -1 : 1; - } - return 0; -} - diff --git a/contrib/gdb/libiberty/memcpy.c b/contrib/gdb/libiberty/memcpy.c deleted file mode 100644 index c28208a0f7e81..0000000000000 --- a/contrib/gdb/libiberty/memcpy.c +++ /dev/null @@ -1,28 +0,0 @@ -/* memcpy (the standard C function) - This function is in the public domain. */ - -/* -NAME - memcpy -- copy memory regions of arbitary length - -SYNOPSIS - void* memcpy (void *out, const void *in, size_t n); - -DESCRIPTION - Copy LENGTH bytes from memory region pointed to by IN to memory - region pointed to by OUT. -*/ - -#include <ansidecl.h> -#ifdef __STDC__ -#include <stddef.h> -#else -#define size_t unsigned long -#endif - -PTR -DEFUN(memcpy, (out, in, length), PTR out AND CONST PTR in AND size_t length) -{ - bcopy(in, out, length); - return out; -} diff --git a/contrib/gdb/libiberty/memmove.c b/contrib/gdb/libiberty/memmove.c deleted file mode 100644 index 818fc2496622e..0000000000000 --- a/contrib/gdb/libiberty/memmove.c +++ /dev/null @@ -1,18 +0,0 @@ -/* Wrapper to implement ANSI C's memmove using BSD's bcopy. */ -/* This function is in the public domain. --Per Bothner. */ -#include <ansidecl.h> -#ifdef __STDC__ -#include <stddef.h> -#else -#define size_t unsigned long -#endif - -PTR -memmove (s1, s2, n) - PTR s1; - CONST PTR s2; - size_t n; -{ - bcopy (s2, s1, n); - return s1; -} diff --git a/contrib/gdb/libiberty/memset.c b/contrib/gdb/libiberty/memset.c deleted file mode 100644 index 5f54831e83c46..0000000000000 --- a/contrib/gdb/libiberty/memset.c +++ /dev/null @@ -1,19 +0,0 @@ -/* memset - This implementation is in the public domain. */ - -#include <ansidecl.h> -#ifdef __STDC__ -#include <stddef.h> -#else -#define size_t unsigned long -#endif - -PTR -DEFUN(memset, (dest, val, len), - PTR dest AND register int val AND register size_t len) -{ - register unsigned char *ptr = (unsigned char*)dest; - while (len-- > 0) - *ptr++ = val; - return dest; -} diff --git a/contrib/gdb/libiberty/mpw-config.in b/contrib/gdb/libiberty/mpw-config.in deleted file mode 100644 index 829d8e730d466..0000000000000 --- a/contrib/gdb/libiberty/mpw-config.in +++ /dev/null @@ -1,9 +0,0 @@ -# MPW configuration fragment for libiberty. - -forward-include "{srcdir}"alloca-norm.h alloca-conf.h - -Echo '/* config.h. Generated by mpw-configure. */' > "{o}"config.new - -MoveIfChange "{o}"config.new "{o}"config.h - - diff --git a/contrib/gdb/libiberty/mpw-make.sed b/contrib/gdb/libiberty/mpw-make.sed deleted file mode 100644 index f99eb1a440740..0000000000000 --- a/contrib/gdb/libiberty/mpw-make.sed +++ /dev/null @@ -1,49 +0,0 @@ -# Sed commands to finish translating libiberty's Unix makefile to MPW syntax. - -# Comment out a useless thing. -/^\.always\./s/^/#/ - -# Replace the auto-generated list with the list of what we know we need. -s/`cat needed-list`/"{o}"alloca.c.o "{o}"bcopy.c.o "{o}"getpagesize.c.o "{o}"insque.c.o "{o}"mpw.c.o "{o}"strcasecmp.c.o "{o}"strdup.c.o "{o}"strncasecmp.c.o/ - -# Paste in some desirable definitions. -/^###$/a\ -\ -HDEFINES = -d NEED_sys_siglist -d NEED_sys_errlist -d NEED_basename -d NEED_strcasecmp -d NEED_strncasecmp\ -INCLUDES = -i : -i {INCDIR}: -i {INCDIR}:mpw: -i ::extra-include: -i "{s}"\ -\ -.c.o \\Option-f .c\ - {CC} {DepDir}{Default}.c {LIBCFLAGS} {INCLUDES} {HDEFINES} @SEGMENT_FLAG@ -o {TargDir}{Default}.c.o\ - -# Remove dependency on needed-list, which we don't use. -/DO_ALSO =/s/needed-list// - -/INCDIR=/s/"{srcdir}"{MULTISRCTOP}::/"{topsrcdir}"/ - -# Whack out the COMPILE.c trickiness. -/^COMPILE.c /,/^$/d - -# Remove the multido trickiness from the "all" target. -/^all \\Option-f/,/^$/c\ -all \\Option-f {TARGETLIB}\ - - -# Remove the RULE1/RULE2 crud. -/if \[/,/fi/d -/^RULE1 =/,/RULE2 =/d -/RULE2/s/RULE2/TARGETLIB/ - -# Don't want fdmatch ever. -s/ "{o}"fdmatch.c.o// - -# Fix paths to generated files. -/config.h/s/"{s}"config.h/"{o}"config.h/ - -# Whack out config rebuild rules. -/^"{o}"config.h \\Option-f/,/^$/d - - - - - - diff --git a/contrib/gdb/libiberty/mpw.c b/contrib/gdb/libiberty/mpw.c deleted file mode 100644 index b93e1008697b6..0000000000000 --- a/contrib/gdb/libiberty/mpw.c +++ /dev/null @@ -1,1010 +0,0 @@ -/* MPW-Unix compatibility library. - Copyright (C) 1993, 1994, 1995, 1996 Free Software Foundation, Inc. - -This file is part of the libiberty library. -Libiberty is free software; you can redistribute it and/or -modify it under the terms of the GNU Library General Public -License as published by the Free Software Foundation; either -version 2 of the License, or (at your option) any later version. - -Libiberty 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 -Library General Public License for more details. - -You should have received a copy of the GNU Library General Public -License along with libiberty; see the file COPYING.LIB. If -not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, -Boston, MA 02111-1307, USA. */ - -/* This should only be compiled and linked under MPW. */ - -#include "mpw.h" - -#include <stdlib.h> - -#ifndef USE_MW_HEADERS -#include <sys/time.h> -#include <sys/resource.h> -#endif - -#include <Types.h> -#include <Files.h> - -#include <Timer.h> - -/* Initialize to 0 at first, then set to errno_max() later. */ - -int sys_nerr = 0; - -/* Debug flag for pathname hacking. Set this to one and rebuild. */ - -int DebugPI = 0; - -void -mpwify_filename(char *unixname, char *macname) -{ - int i, j, in_middle, terminate = 0; - - /* (should truncate 255 chars from end of name, not beginning) */ - if (strlen (unixname) > 255) - { - fprintf (stderr, "Pathname \"%s\" is too long for Macs, truncating\n", - unixname); - terminate = 1; - } - /* Abs Unix path to abs Mac path. */ - if (*unixname == '/') - { - if (strncmp (unixname, "/tmp/", 5) == 0) - { - /* A temporary name, make a more Mac-flavored tmpname. */ - /* A better choice would be {Boot}Trash:foo, but that would - require being able to identify the boot disk's and trashcan's - name. Another option would be to have an env var, so user - can point it at a ramdisk. */ - strncpy (macname, unixname, 255); - if (terminate) - macname[255] = '\0'; - macname[0] = ':'; - macname[4] = '_'; - } - else - { - /* Assume that the leading component is a valid disk name. */ - strncpy (macname, unixname + 1, 255); - } - } - else - { - /* If this is a "Unix-only" pathname, assume relative. */ - if (strchr (unixname, '/') && ! strchr (unixname, ':')) - { - macname[0] = ':'; - strncpy (macname + 1, unixname, 255); - } - else - { - /* Otherwise copy it verbatim. */ - /* ... but if of the form ":/foo", lose the extra colon; - the slash will be made into a colon shortly. */ - if (unixname[0] == ':' && unixname[1] == '/') - ++unixname; - strncpy (macname, unixname, 255); - } - } - if (terminate) - macname[255] = '\0'; - for (i = 0; macname[i] != '\0'; ++i) - { - if (macname[i] == '/') - macname[i] = ':'; - } - in_middle = 0; - j = 0; - for (i = 0; macname[i] != '\0'; ++i) - { - /* We're in the middle of the name when a char is not a colon. */ - if (macname[i] != ':') - in_middle = 1; - /* Copy chars verbatim, *unless* the char is the first of a pair - of colons in the middle of a pathname. */ - if (!(in_middle && macname[i] == ':' && macname[i+1] == ':')) - macname[j++] = macname[i]; - } - macname[j] = '\0'; - /* If we have a trailing ":.", make it into a ":". */ - if (j >= 2 && macname[j-2] == ':' && macname[j-1] == '.') - macname[j-1] = '\0'; - if (DebugPI) - { - fprintf (stderr, "# Made \"%s\"\n", unixname); - fprintf (stderr, "# into \"%s\"\n", macname); - } -} - -/* MPW-flavored basename finder. */ - -char * -mpw_basename (name) - char *name; -{ - char *base = name; - - while (*name) - { - if (*name++ == ':') - { - base = name; - } - } - return base; -} - -/* Mixed MPW/Unix basename finder. This can be led astray by - filenames with slashes in them and come up with a basename that - either corresponds to no file or (worse) to some other file, so - should only be tried if other methods of finding a file via a - basename have failed. */ - -char * -mpw_mixed_basename (name) - char *name; -{ - char *base = name; - - while (*name) - { - if (*name == '/' || *name == ':') - { - base = name + 1; - } - ++name; - } - return base; -} - -/* This function is fopen() modified to create files that are type TEXT - or 'BIN ', and always of type 'MPS '. */ - -FILE * -mpw_fopen (char *name, char *mode) -{ -#undef fopen - int errnum; - FILE *fp; - char tmpname[256]; - - mpwify_filename (name, tmpname); - PROGRESS (1); - fp = fopen (tmpname, mode); - errnum = errno; - - /* If writing, need to set type and creator usefully. */ - if (strchr (mode, 'w')) - { - char *pname = (char *) malloc (strlen (tmpname) + 2); - OSErr e; - struct FInfo fi; - - pname[0] = strlen (tmpname); - strcpy (pname+1, tmpname); - - e = GetFInfo ((ConstStr255Param) pname, 0, &fi); - /* should do spiffier error handling */ - if (e != 0) - fprintf(stderr, "GetFInfo returns %d\n", e); - if (strchr (mode, 'b')) - { - fi.fdType = (OSType) 'BIN '; - } - else - { - fi.fdType = (OSType) 'TEXT'; - } - fi.fdCreator = (OSType) 'MPS '; - e = SetFInfo ((ConstStr255Param) pname, 0, &fi); - if (e != 0) - fprintf(stderr, "SetFInfo returns %d\n", e); - free (pname); - } - if (fp == NULL) - errno = errnum; - return fp; -} - -/* This is a version of fseek() modified to fill the file with zeros - if seeking past the end of it. */ - -#define ZEROBLKSIZE 4096 - -char zeros[ZEROBLKSIZE]; - -int -mpw_fseek (FILE *fp, int offset, int whence) -{ -#undef fseek - int cursize, numleft; - - PROGRESS (1); - if (whence == SEEK_SET) - { - fseek (fp, 0, SEEK_END); - cursize = ftell (fp); - if (offset > cursize) - { - numleft = offset - cursize; - while (numleft > ZEROBLKSIZE) - { - /* This might fail, should check for that. */ - PROGRESS (1); - fwrite (zeros, 1, ZEROBLKSIZE, fp); - numleft -= ZEROBLKSIZE; - } - PROGRESS (1); - fwrite (zeros, 1, numleft, fp); - fflush (fp); - } - } - return fseek (fp, offset, whence); -} - -int -mpw_fread (char *ptr, int size, int nitems, FILE *stream) -{ -#undef fread - int rslt; - - PROGRESS (1); - rslt = fread (ptr, size, nitems, stream); - PROGRESS (1); - return rslt; -} - -int -mpw_fwrite (char *ptr, int size, int nitems, FILE *stream) -{ -#undef fwrite - int rslt; - - PROGRESS (1); - rslt = fwrite (ptr, size, nitems, stream); - PROGRESS (1); - return rslt; -} - -int -link () -{ - fprintf (stderr, "link not available!\n"); - mpw_abort (); -} - -int -fork () -{ - fprintf (stderr, "fork not available!\n"); - mpw_abort (); -} - -int -vfork () -{ - fprintf (stderr, "vfork not available!\n"); - mpw_abort (); - return (-1); -} - -int -pipe (int *fd) -{ - fprintf (stderr, "pipe not available!\n"); - mpw_abort (); - return (-1); -} - -#ifndef USE_MW_HEADERS -int -execvp (char *file, char **argv) -{ - fprintf (stderr, "execvp not available!\n"); - mpw_abort (); - return (-1); -} - -int -execv (char *path, char **argv) -{ - fprintf (stderr, "execv not available!\n"); - mpw_abort (); - return (-1); -} -#endif - -int -kill (int pid, int sig) -{ - fprintf (stderr, "kill not available!\n"); - mpw_abort (); - return (-1); -} - -int -wait (int *status) -{ - *status = 0; - return 0; -} - -#ifndef USE_MW_HEADERS -int -sleep (int seconds) -{ - unsigned long start_time, now; - - time (&start_time); - - while (1) - { - PROGRESS (1); - time (&now); - if (now > start_time + seconds) - return 0; - } -} -#endif - -void -putenv (char *str) -{ - /* The GCC driver calls this to do things for collect2, but we - don't care about collect2. */ -} - -int -chmod (char *path, int mode) -{ - /* Pretend it was all OK. */ - return 0; -} - -#ifndef USE_MW_HEADERS -int -getuid () -{ - /* One value is as good as another... */ - return 0; -} - -int -getgid () -{ - /* One value is as good as another... */ - return 0; -} -#endif - -/* Instead of coredumping, which is not a normal Mac facility, we - drop into Macsbug. If we then "g" from Macsbug, the program will - exit cleanly. */ - -void -mpw_abort () -{ - /* Make sure no output still buffered up, then zap into MacsBug. */ - fflush(stdout); - fflush(stderr); - printf("## Abort! ##\n"); -#ifdef MPW_SADE - SysError(8005); -#else - Debugger(); -#endif - /* "g" in MacsBug will then cause a regular error exit. */ - exit (1); -} - -/* Imitation getrusage based on the ANSI clock() function. */ - -int -getrusage (int who, struct rusage *rusage) -{ - int clk = clock (); - -#if 0 - rusage->ru_utime.tv_sec = clk / CLOCKS_PER_SEC; - rusage->ru_utime.tv_usec = ((clk * 1000) / CLOCKS_PER_SEC) * 1000; - rusage->ru_stime.tv_sec = 0; - rusage->ru_stime.tv_usec = 0; -#endif -} - -int -sbrk () -{ - return 0; -} - -#ifndef USE_MW_HEADERS -int -isatty (int fd) -{ - return 0; -} - -/* This is inherited from Timothy Murray's Posix library. */ - -#include "utime.h" - -int -utime (char *filename, struct utimbuf *times) -{ - CInfoPBRec cipbr; - HFileInfo *fpb = (HFileInfo *) &cipbr; - DirInfo *dpb = (DirInfo *) &cipbr; - unsigned char pname[256]; - short err; - - strcpy ((char *) pname, filename); - c2pstr (pname); - - dpb->ioDrDirID = 0L; - fpb->ioNamePtr = pname; - fpb->ioVRefNum = 0; - fpb->ioFDirIndex = 0; - fpb->ioFVersNum = 0; - err = PBGetCatInfo (&cipbr, 0); - if (err != noErr) { - errno = ENOENT; - return -1; - } - dpb->ioDrDirID = 0L; - fpb->ioFlMdDat = times->modtime; - fpb->ioFlCrDat = times->actime; - err = PBSetCatInfo (&cipbr, 0); - if (err != noErr) { - errno = EACCES; - return -1; - } - return 0; -} - -int -mkdir (char *path, int mode) -{ - errno = ENOSYS; - return -1; -} - -int -rmdir () -{ - errno = ENOSYS; - return -1; -} -#endif - -chown () -{ - errno = ENOSYS; - return -1; -} - -char *myenviron[] = {NULL}; - -char **environ = myenviron; - -#ifndef USE_MW_HEADERS - -/* Minimal 'stat' emulation: tells directories from files and - gives length and mtime. - - Derived from code written by Guido van Rossum, CWI, Amsterdam - and placed by him in the public domain. */ - -extern int __uid, __gid; - -int __uid = 0; -int __gid = 0; - -/* Bits in ioFlAttrib: */ -#define LOCKBIT (1<<0) /* File locked */ -#define DIRBIT (1<<4) /* It's a directory */ - -/* Macified "stat" in which filename is given relative to a directory, - specified by long DirID. */ - -static int -_stat (char *name, long dirid, struct stat *buf) -{ - CInfoPBRec cipbr; - HFileInfo *fpb = (HFileInfo*) &cipbr; - DirInfo *dpb = (DirInfo*) &cipbr; - Str255 pname; - short err; - - /* Make a temp copy of the name and pascalize. */ - strcpy ((char *) pname, name); - c2pstr (pname); - - cipbr.dirInfo.ioDrDirID = dirid; - cipbr.hFileInfo.ioNamePtr = pname; - cipbr.hFileInfo.ioVRefNum = 0; - cipbr.hFileInfo.ioFDirIndex = 0; - cipbr.hFileInfo.ioFVersNum = 0; - err = PBGetCatInfo (&cipbr, 0); - if (err != noErr) - { - errno = ENOENT; - return -1; - } - /* Mac files are readable if they can be accessed at all. */ - buf->st_mode = 0444; - /* Mark unlocked files as writeable. */ - if (!(fpb->ioFlAttrib & LOCKBIT)) - buf->st_mode |= 0222; - if (fpb->ioFlAttrib & DIRBIT) - { - /* Mark directories as "executable". */ - buf->st_mode |= 0111 | S_IFDIR; - buf->st_size = dpb->ioDrNmFls; - buf->st_rsize = 0; - } - else - { - buf->st_mode |= S_IFREG; - /* Mark apps as "executable". */ - if (fpb->ioFlFndrInfo.fdType == 'APPL') - buf->st_mode |= 0111; - /* Fill in the sizes of data and resource forks. */ - buf->st_size = fpb->ioFlLgLen; - buf->st_rsize = fpb->ioFlRLgLen; - } - /* Fill in various times. */ - buf->st_atime = fpb->ioFlCrDat; - buf->st_mtime = fpb->ioFlMdDat; - buf->st_ctime = fpb->ioFlCrDat; - /* Set up an imitation inode number. */ - buf->st_ino = (unsigned short) fpb->ioDirID; - /* Set up an imitation device. */ - GetVRefNum (buf->st_ino, &buf->st_dev); - buf->st_uid = __uid; - buf->st_gid = __gid; -/* buf->st_FlFndrInfo = fpb->ioFlFndrInfo; */ - return 0; -} - -/* stat() sets up an empty dirid. */ - -int -stat (char *path, struct stat *buf) -{ - long rslt, errnum; - char tmpname[256]; - - mpwify_filename (path, tmpname); - if (DebugPI) - fprintf (stderr, "# stat (%s, %x)", tmpname, buf); - PROGRESS (1); - rslt = _stat (tmpname, 0L, buf); - errnum = errno; - if (DebugPI) - { - fprintf (stderr, " -> %d", rslt); - if (rslt != 0) - fprintf (stderr, " (errno is %d)", errnum); - fprintf (stderr, "\n"); - fflush (stderr); - } - if (rslt != 0) - errno = errnum; - return rslt; -} - -int -fstat (int fd, struct stat *buf) -{ - FCBPBRec fcb; - FILE *fp; - Str255 pathname; - long dirid = 0L, temp; - long rslt, errnum; - short err; - - if (DebugPI) - fprintf (stderr, "# fstat (%d, %x)", fd, buf); - PROGRESS (1); - pathname[0] = 0; -#ifdef FIOFNAME - /* Use an MPW-specific ioctl to get the pathname associated with - the file descriptor. */ - ioctl (fd, FIOFNAME, (long *) pathname); -#else - you lose -#endif - if (DebugPI) - fprintf (stderr, " (name is %s)", pathname); - dirid = 0L /* fcb.ioFCBParID */ ; - rslt = _stat ((char *) pathname, dirid, buf); - errnum = errno; - if (DebugPI) - { - fprintf (stderr, " -> %d", rslt); - if (rslt != 0) - fprintf (stderr, " (errno is %d)", errnum); - fprintf (stderr, "\n"); - fflush (stderr); - } - if (rslt != 0) - errno = errnum; - return rslt; -} - -#endif /* n USE_MW_HEADERS */ - -chdir () -{ - errno = ENOSYS; - return (-1); -} - -char * -getcwd (char *buf, int size) -{ - if (buf == NULL) - buf = (char *) malloc (size); - strcpy(buf, ":"); - return buf; -} - -/* This should probably be more elaborate for MPW. */ - -char * -getpwd () -{ - return ":"; -} - -int -mpw_open (char *filename, int arg2, int arg3) -{ -#undef open - int fd, errnum = 0; - char tmpname[256]; - - mpwify_filename (filename, tmpname); - fd = open (tmpname, arg2); - errnum = errno; - - if (DebugPI) - { - fprintf (stderr, "# open (%s, %d, %d)", tmpname, arg2, arg3); - fprintf (stderr, " -> %d", fd); - if (fd == -1) - fprintf (stderr, " (errno is %d)", errnum); - fprintf (stderr, "\n"); - } - if (fd == -1) - errno = errnum; - return fd; -} - -int -mpw_access (char *filename, unsigned int cmd) -{ -#undef access - - int rslt, errnum = 0; - struct stat st; - char tmpname[256]; - - mpwify_filename (filename, tmpname); - if (cmd & R_OK || cmd & X_OK) - { - rslt = stat (tmpname, &st); - errnum = errno; - if (rslt >= 0) - { - if (((st.st_mode & 004 == 0) && (cmd & R_OK)) - || ((st.st_mode & 002 == 0) && (cmd & W_OK)) - || ((st.st_mode & 001 == 0) && (cmd & X_OK))) - { - rslt = -1; - errnum = EACCES; - } - } - } - if (DebugPI) - { - fprintf (stderr, "# mpw_access (%s, %d)", tmpname, cmd); - fprintf (stderr, " -> %d", rslt); - if (rslt != 0) - fprintf (stderr, " (errno is %d)", errnum); - fprintf (stderr, "\n"); - } - if (rslt != 0) - errno = errnum; - return rslt; -} - -/* The MPW library creat() has no mode argument. */ - -int -mpw_creat (char *path, /* mode_t */ int mode) -{ -#undef creat - -#ifdef USE_MW_HEADERS - return creat (path, mode); -#else - return creat (path); -#endif -} - -/* This is a hack to get control in an MPW tool before it crashes the - machine. */ - -mpw_special_init (name) - char *name; -{ - if (strstr (name, "DEBUG")) - DebugStr("\pat beginning of program"); -} - -static int current_umask; - -int -umask(int mask) -{ - int oldmask = current_umask; - - current_umask = mask; - return oldmask; -} - -/* Cursor-spinning stuff that includes metering of spin rate and delays. */ - -/* Nonzero when cursor spinning has been set up properly. */ - -int cursor_inited; - -/* Nonzero if spin should be measured and excessive delays reported. */ - -int measure_spin; - -/* Nonzero if spin histogram and rate data should be written out. */ - -int dump_spin_data; - -long warning_threshold = 400000; - -long bucket_size = 1024; - -long bucket_power = 10; - -long numbuckets = 300; - -int *delay_counts; - -int overflow_count; - -char *current_progress; - -static UnsignedWide last_microseconds; - -static char *last_spin_file = ""; - -static int last_spin_line; - -void -warn_if_spin_delay (char *file, int line) -{ - long diff, ix; - UnsignedWide now; - - Microseconds(&now); - - diff = now.lo - last_microseconds.lo; - - if (diff > warning_threshold) - fprintf (stderr, "# %s: %ld.%06ld sec delay getting from %s:%d to %s:%d\n", - (current_progress ? current_progress : ""), - diff / 1000000, diff % 1000000, - last_spin_file, last_spin_line, file, line); - if (dump_spin_data) - { - if (diff >= 0) - { - ix = diff >> bucket_power; - if (ix >= 0 && ix < numbuckets && delay_counts != NULL) - ++delay_counts[ix]; - else - ++overflow_count; - } - else - fprintf (stderr, "raw diff is %ld (?)\n", diff); - } -} - -void -record_for_spin_delay (char *file, int line) -{ - Microseconds (&last_microseconds); - last_spin_file = file; - last_spin_line = line; -} - -void -mpw_start_progress (char *str, int n, char *file, int line) -{ - int i; - char *measure, *threshold; - - if (!cursor_inited) - { - InitCursorCtl (nil); - cursor_inited = 1; - record_for_spin_delay (file, line); - measure = getenv ("MEASURE_SPIN"); - if (measure != NULL && measure[0] != '\0') - { - measure_spin = 1; - if (strcmp (measure, "all") == 0) - dump_spin_data = 1; - } - threshold = getenv ((const char *) "SPIN_WARN_THRESHOLD"); - if (threshold != NULL && threshold[0] != '\0') - warning_threshold = atol (threshold); - if (dump_spin_data) - { - if (delay_counts == NULL) - delay_counts = (int *) malloc (numbuckets * sizeof (int)); - for (i = 0; i < numbuckets; ++i) - delay_counts[i] = 0; - overflow_count = 0; - } - } - current_progress = str; - - sys_nerr = errno_max (); - - mpw_special_init (str); -} - -void -mpw_progress (int n) -{ - SpinCursor (32); -} - -void -mpw_progress_measured (int n, char *file, int line) -{ - if (measure_spin) - warn_if_spin_delay (file, line); - SpinCursor (32); - if (measure_spin) - record_for_spin_delay (file, line); -} - -void -mpw_end_progress (char *str, char *file, int line) -{ - long i, delay, count = 0, sum = 0, avgdelay, spinrate; - long curpower = 0, curgroup = 0; - - /* Warn if it's been a while since the last spin. */ - if (measure_spin) - warn_if_spin_delay (file, line); - - /* Dump all the nonzero delay counts and an approximation of the delay. */ - if (dump_spin_data && delay_counts != NULL) - { - for (i = 0; i < numbuckets; ++i) - { - delay = (i + 1) * bucket_size; - sum += delay_counts[i] * (i + 1); - count += delay_counts[i]; - if (delay <= (1 << curpower)) - { - curgroup += delay_counts[i]; - } - else - { - if (curgroup > 0) - fprintf (stderr, - "# %s: %d delays between %ld.%06ld and %ld.%06ld sec\n", - (str ? str : ""), - curgroup, - (1 << curpower) / 1000000, - (1 << curpower) % 1000000, - (1 << (curpower + 1)) / 1000000, - (1 << (curpower + 1)) % 1000000); - ++curpower; - curgroup = 0; - } - } - if (count > 0) - { - avgdelay = (sum * bucket_size) / count; - spinrate = 1000000 / avgdelay; - fprintf (stderr, "# %s: Average spin rate is %d times/sec\n", - (str ? str : ""), spinrate); - } - } -} - -#ifdef PROGRESS_TEST - -/* Test program. */ - -main () -{ - int i, j; - double x = 1.0, y = 2.4; - long start = Microseconds (), tm; FIXME - - START_PROGRESS ("hi", 0); - - for (i = 0; i < 1000; ++i) - { - PROGRESS (1); - - for (j = 0; j < (i * 100); ++j) - { - x += (x * y) / j; - } - } - - END_PROGRESS ("hi"); - - tm = Microseconds () - start; - - printf ("Total time is %d.%d secs\n", tm / 1000000, tm % 1000000); -} - -#endif - -#ifdef USE_MW_HEADERS -/* Empty definitions for Metrowerks' SIOUX console library. */ - -#ifndef __CONSOLE__ -#include <console.h> -#endif - -short -InstallConsole(short fd) -{ -#pragma unused (fd) - return 0; -} - -void -RemoveConsole(void) -{ -} - -long -WriteCharsToConsole(char *buf, long n) -{ -#pragma unused (buf, n) - return 0; -} - -long ReadCharsFromConsole(char *buf, long n) -{ -#pragma unused (buf, n) - return 0; -} - -extern char * -__ttyname(long fd) -{ - static char *__devicename = "null device"; - - if (fd >= 0 && fd <= 2) - return (__devicename); - return NULL; -} - -#endif diff --git a/contrib/gdb/libiberty/msdos.c b/contrib/gdb/libiberty/msdos.c deleted file mode 100644 index 923e64d4ede60..0000000000000 --- a/contrib/gdb/libiberty/msdos.c +++ /dev/null @@ -1,15 +0,0 @@ -char msg[] = "No vfork available - aborting\n"; -vfork() -{ - write(1, msg, sizeof(msg)); -} - -sigsetmask() -{ - /* no signals support in go32 (yet) */ -} - -waitpid() -{ - return -1; -} diff --git a/contrib/gdb/libiberty/obstack.c b/contrib/gdb/libiberty/obstack.c deleted file mode 100644 index 2d380940efce1..0000000000000 --- a/contrib/gdb/libiberty/obstack.c +++ /dev/null @@ -1,507 +0,0 @@ -/* obstack.c - subroutines used implicitly by object stack macros - Copyright (C) 1988, 89, 90, 91, 92, 93, 94, 95, 96 Free Software Foundation, Inc. - -This program is free software; you can redistribute it and/or modify it -under the terms of the GNU Library General Public License as published by the -Free Software Foundation; either version 2, 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 Library General Public License for more details. - -You should have received a copy of the GNU Library General Public License -along with this program; if not, write to the Free Software -Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ - -#include "obstack.h" - -/* This is just to get __GNU_LIBRARY__ defined. */ -#include <stdio.h> - -/* Comment out all this code if we are using the GNU C Library, and are not - actually compiling the library itself. This code is part of the GNU C - Library, but also included in many other GNU distributions. Compiling - and linking in this code is a waste when using the GNU C library - (especially if it is a shared library). Rather than having every GNU - program understand `configure --with-gnu-libc' and omit the object files, - it is simpler to just do this in the source for each such file. */ - -/* CYGNUS LOCAL. No, don't comment the code out. We will be using - ../include/obstack.h, which was changed relatively recently in a - way that is not binary compatible. Until we feel confident that - nobody is using the old obstack.c code, force the use of this code. - This issue will arise anytime a change is made which is not binary - compatible. -#if defined (_LIBC) || !defined (__GNU_LIBRARY__) -*/ -#if 1 - - -#ifdef __STDC__ -#define POINTER void * -#else -#define POINTER char * -#endif - -/* Determine default alignment. */ -struct fooalign {char x; double d;}; -#define DEFAULT_ALIGNMENT \ - ((PTR_INT_TYPE) ((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; - -/* Define a macro that either calls functions with the traditional malloc/free - calling interface, or calls functions with the mmalloc/mfree interface - (that adds an extra first argument), based on the state of use_extra_arg. - For free, do not use ?:, since some compilers, like the MIPS compilers, - do not allow (expr) ? void : void. */ - -#define CALL_CHUNKFUN(h, size) \ - (((h) -> use_extra_arg) \ - ? (*(h)->chunkfun) ((h)->extra_arg, (size)) \ - : (*(h)->chunkfun) ((size))) - -#define CALL_FREEFUN(h, old_chunk) \ - do { \ - if ((h) -> use_extra_arg) \ - (*(h)->freefun) ((h)->extra_arg, (old_chunk)); \ - else \ - (*(h)->freefun) ((old_chunk)); \ - } while (0) - - -/* 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. - - Return nonzero if successful, zero if out of memory. - To recover from an out of memory error, - free up some memory, then call this again. */ - -int -_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; - h->use_extra_arg = 0; - - chunk = h->chunk = CALL_CHUNKFUN (h, h -> chunk_size); - if (!chunk) - { - h->alloc_failed = 1; - return 0; - } - h->alloc_failed = 0; - h->next_free = h->object_base = chunk->contents; - h->chunk_limit = chunk->limit - = (char *) chunk + h->chunk_size; - chunk->prev = 0; - /* The initial chunk now contains no empty object. */ - h->maybe_empty_object = 0; - return 1; -} - -int -_obstack_begin_1 (h, size, alignment, chunkfun, freefun, arg) - struct obstack *h; - int size; - int alignment; - POINTER (*chunkfun) (); - void (*freefun) (); - POINTER arg; -{ - 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; - h->extra_arg = arg; - h->use_extra_arg = 1; - - chunk = h->chunk = CALL_CHUNKFUN (h, h -> chunk_size); - if (!chunk) - { - h->alloc_failed = 1; - return 0; - } - h->alloc_failed = 0; - h->next_free = h->object_base = chunk->contents; - h->chunk_limit = chunk->limit - = (char *) chunk + h->chunk_size; - chunk->prev = 0; - /* The initial chunk now contains no empty object. */ - h->maybe_empty_object = 0; - return 1; -} - -/* 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 = CALL_CHUNKFUN (h, new_size); - if (!new_chunk) - { - h->alloc_failed = 1; - return; - } - h->alloc_failed = 0; - h->chunk = new_chunk; - 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. - But not if that chunk might contain an empty object. */ - if (h->object_base == old_chunk->contents && ! h->maybe_empty_object) - { - new_chunk->prev = old_chunk->prev; - CALL_FREEFUN (h, old_chunk); - } - - h->object_base = new_chunk->contents; - h->next_free = h->object_base + obj_size; - /* The new chunk certainly contains no empty object yet. */ - h->maybe_empty_object = 0; -} - -/* 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. */ - -#ifdef __STDC__ -/* Suppress -Wmissing-prototypes warning. We don't want to declare this in - obstack.h because it is just for debugging. */ -int _obstack_allocated_p (struct obstack *h, POINTER obj); -#endif - -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; - /* We use >= rather than > since the object cannot be exactly at - the beginning of the chunk but might be an empty object exactly - at the end of an adjacent 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. */ - -#undef obstack_free - -/* This function has two names with identical definitions. - This is the first one, called from non-ANSI code. */ - -void -_obstack_free (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; - /* 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; - CALL_FREEFUN (h, lp); - lp = plp; - /* If we switch chunks, we can't tell whether the new current - chunk contains an empty object, so assume that it may. */ - h->maybe_empty_object = 1; - } - 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 (); -} - -/* This function is used from ANSI code. */ - -void -obstack_free (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; - /* 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; - CALL_FREEFUN (h, lp); - lp = plp; - /* If we switch chunks, we can't tell whether the new current - chunk contains an empty object, so assume that it may. */ - h->maybe_empty_object = 1; - } - 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 (); -} - -int -_obstack_memory_used (h) - struct obstack *h; -{ - register struct _obstack_chunk* lp; - register int nbytes = 0; - - for (lp = h->chunk; lp != 0; lp = lp->prev) - { - nbytes += lp->limit - (char *) lp; - } - return nbytes; -} - -#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 */ - -#endif /* _LIBC or not __GNU_LIBRARY__. */ diff --git a/contrib/gdb/libiberty/random.c b/contrib/gdb/libiberty/random.c deleted file mode 100644 index e205719832b9f..0000000000000 --- a/contrib/gdb/libiberty/random.c +++ /dev/null @@ -1,373 +0,0 @@ -/* - * Copyright (c) 1983 Regents of the University of California. - * All rights reserved. - * - * Redistribution and use in source and binary forms are permitted - * provided that the above copyright notice and this paragraph are - * duplicated in all such forms and that any documentation, - * advertising materials, and other materials related to such - * distribution and use acknowledge that the software was developed - * by the University of California, Berkeley. The name of the - * University may not be used to endorse or promote products derived - * from this software without specific prior written permission. - * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR - * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED - * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. - */ - -/* - * This is derived from the Berkeley source: - * @(#)random.c 5.5 (Berkeley) 7/6/88 - * It was reworked for the GNU C Library by Roland McGrath. - */ - -#include <errno.h> - -#if 0 - -#include <ansidecl.h> -#include <limits.h> -#include <stddef.h> -#include <stdlib.h> - -#else - -#define ULONG_MAX ((unsigned long)(~0L)) /* 0xFFFFFFFF for 32-bits */ -#define LONG_MAX ((long)(ULONG_MAX >> 1)) /* 0x7FFFFFFF for 32-bits*/ - -#ifdef __STDC__ -# define PTR void * -# define NULL (void *) 0 -#else -# define PTR char * -# define NULL 0 -#endif - -#endif - -long int random (); - -/* An improved random number generation package. In addition to the standard - rand()/srand() like interface, this package also has a special state info - interface. The initstate() routine is called with a seed, an array of - bytes, and a count of how many bytes are being passed in; this array is - then initialized to contain information for random number generation with - that much state information. Good sizes for the amount of state - information are 32, 64, 128, and 256 bytes. The state can be switched by - calling the setstate() function with the same array as was initiallized - with initstate(). By default, the package runs with 128 bytes of state - information and generates far better random numbers than a linear - congruential generator. If the amount of state information is less than - 32 bytes, a simple linear congruential R.N.G. is used. Internally, the - state information is treated as an array of longs; the zeroeth element of - the array is the type of R.N.G. being used (small integer); the remainder - of the array is the state information for the R.N.G. Thus, 32 bytes of - state information will give 7 longs worth of state information, which will - allow a degree seven polynomial. (Note: The zeroeth word of state - information also has some other information stored in it; see setstate - for details). The random number generation technique is a linear feedback - shift register approach, employing trinomials (since there are fewer terms - to sum up that way). In this approach, the least significant bit of all - the numbers in the state table will act as a linear feedback shift register, - and will have period 2^deg - 1 (where deg is the degree of the polynomial - being used, assuming that the polynomial is irreducible and primitive). - The higher order bits will have longer periods, since their values are - also influenced by pseudo-random carries out of the lower bits. The - total period of the generator is approximately deg*(2**deg - 1); thus - doubling the amount of state information has a vast influence on the - period of the generator. Note: The deg*(2**deg - 1) is an approximation - only good for large deg, when the period of the shift register is the - dominant factor. With deg equal to seven, the period is actually much - longer than the 7*(2**7 - 1) predicted by this formula. */ - - - -/* For each of the currently supported random number generators, we have a - break value on the amount of state information (you need at least thi - bytes of state info to support this random number generator), a degree for - the polynomial (actually a trinomial) that the R.N.G. is based on, and - separation between the two lower order coefficients of the trinomial. */ - -/* Linear congruential. */ -#define TYPE_0 0 -#define BREAK_0 8 -#define DEG_0 0 -#define SEP_0 0 - -/* x**7 + x**3 + 1. */ -#define TYPE_1 1 -#define BREAK_1 32 -#define DEG_1 7 -#define SEP_1 3 - -/* x**15 + x + 1. */ -#define TYPE_2 2 -#define BREAK_2 64 -#define DEG_2 15 -#define SEP_2 1 - -/* x**31 + x**3 + 1. */ -#define TYPE_3 3 -#define BREAK_3 128 -#define DEG_3 31 -#define SEP_3 3 - -/* x**63 + x + 1. */ -#define TYPE_4 4 -#define BREAK_4 256 -#define DEG_4 63 -#define SEP_4 1 - - -/* Array versions of the above information to make code run faster. - Relies on fact that TYPE_i == i. */ - -#define MAX_TYPES 5 /* Max number of types above. */ - -static int degrees[MAX_TYPES] = { DEG_0, DEG_1, DEG_2, DEG_3, DEG_4 }; -static int seps[MAX_TYPES] = { SEP_0, SEP_1, SEP_2, SEP_3, SEP_4 }; - - - -/* Initially, everything is set up as if from: - initstate(1, randtbl, 128); - Note that this initialization takes advantage of the fact that srandom - advances the front and rear pointers 10*rand_deg times, and hence the - rear pointer which starts at 0 will also end up at zero; thus the zeroeth - element of the state information, which contains info about the current - position of the rear pointer is just - (MAX_TYPES * (rptr - state)) + TYPE_3 == TYPE_3. */ - -static long int randtbl[DEG_3 + 1] = - { TYPE_3, - 0x9a319039, 0x32d9c024, 0x9b663182, 0x5da1f342, - 0xde3b81e0, 0xdf0a6fb5, 0xf103bc02, 0x48f340fb, - 0x7449e56b, 0xbeb1dbb0, 0xab5c5918, 0x946554fd, - 0x8c2e680f, 0xeb3d799f, 0xb11ee0b7, 0x2d436b86, - 0xda672e2a, 0x1588ca88, 0xe369735d, 0x904f35f7, - 0xd7158fd6, 0x6fa6f051, 0x616e6b96, 0xac94efdc, - 0x36413f93, 0xc622c298, 0xf5a42ab8, 0x8a88d77b, - 0xf5ad9d0e, 0x8999220b, 0x27fb47b9 - }; - -/* FPTR and RPTR are two pointers into the state info, a front and a rear - pointer. These two pointers are always rand_sep places aparts, as they - cycle through the state information. (Yes, this does mean we could get - away with just one pointer, but the code for random is more efficient - this way). The pointers are left positioned as they would be from the call: - initstate(1, randtbl, 128); - (The position of the rear pointer, rptr, is really 0 (as explained above - in the initialization of randtbl) because the state table pointer is set - to point to randtbl[1] (as explained below).) */ - -static long int *fptr = &randtbl[SEP_3 + 1]; -static long int *rptr = &randtbl[1]; - - - -/* The following things are the pointer to the state information table, - the type of the current generator, the degree of the current polynomial - being used, and the separation between the two pointers. - Note that for efficiency of random, we remember the first location of - the state information, not the zeroeth. Hence it is valid to access - state[-1], which is used to store the type of the R.N.G. - Also, we remember the last location, since this is more efficient than - indexing every time to find the address of the last element to see if - the front and rear pointers have wrapped. */ - -static long int *state = &randtbl[1]; - -static int rand_type = TYPE_3; -static int rand_deg = DEG_3; -static int rand_sep = SEP_3; - -static long int *end_ptr = &randtbl[sizeof(randtbl) / sizeof(randtbl[0])]; - -/* Initialize the random number generator based on the given seed. If the - type is the trivial no-state-information type, just remember the seed. - Otherwise, initializes state[] based on the given "seed" via a linear - congruential generator. Then, the pointers are set to known locations - that are exactly rand_sep places apart. Lastly, it cycles the state - information a given number of times to get rid of any initial dependencies - introduced by the L.C.R.N.G. Note that the initialization of randtbl[] - for default usage relies on values produced by this routine. */ -void -srandom (x) - unsigned int x; -{ - state[0] = x; - if (rand_type != TYPE_0) - { - register long int i; - for (i = 1; i < rand_deg; ++i) - state[i] = (1103515145 * state[i - 1]) + 12345; - fptr = &state[rand_sep]; - rptr = &state[0]; - for (i = 0; i < 10 * rand_deg; ++i) - random(); - } -} - -/* Initialize the state information in the given array of N bytes for - future random number generation. Based on the number of bytes we - are given, and the break values for the different R.N.G.'s, we choose - the best (largest) one we can and set things up for it. srandom is - then called to initialize the state information. Note that on return - from srandom, we set state[-1] to be the type multiplexed with the current - value of the rear pointer; this is so successive calls to initstate won't - lose this information and will be able to restart with setstate. - Note: The first thing we do is save the current state, if any, just like - setstate so that it doesn't matter when initstate is called. - Returns a pointer to the old state. */ -PTR -initstate (seed, arg_state, n) - unsigned int seed; - PTR arg_state; - unsigned long n; -{ - PTR ostate = (PTR) &state[-1]; - - if (rand_type == TYPE_0) - state[-1] = rand_type; - else - state[-1] = (MAX_TYPES * (rptr - state)) + rand_type; - if (n < BREAK_1) - { - if (n < BREAK_0) - { - errno = EINVAL; - return NULL; - } - rand_type = TYPE_0; - rand_deg = DEG_0; - rand_sep = SEP_0; - } - else if (n < BREAK_2) - { - rand_type = TYPE_1; - rand_deg = DEG_1; - rand_sep = SEP_1; - } - else if (n < BREAK_3) - { - rand_type = TYPE_2; - rand_deg = DEG_2; - rand_sep = SEP_2; - } - else if (n < BREAK_4) - { - rand_type = TYPE_3; - rand_deg = DEG_3; - rand_sep = SEP_3; - } - else - { - rand_type = TYPE_4; - rand_deg = DEG_4; - rand_sep = SEP_4; - } - - state = &((long int *) arg_state)[1]; /* First location. */ - /* Must set END_PTR before srandom. */ - end_ptr = &state[rand_deg]; - srandom(seed); - if (rand_type == TYPE_0) - state[-1] = rand_type; - else - state[-1] = (MAX_TYPES * (rptr - state)) + rand_type; - - return ostate; -} - -/* Restore the state from the given state array. - Note: It is important that we also remember the locations of the pointers - in the current state information, and restore the locations of the pointers - from the old state information. This is done by multiplexing the pointer - location into the zeroeth word of the state information. Note that due - to the order in which things are done, it is OK to call setstate with the - same state as the current state - Returns a pointer to the old state information. */ - -PTR -setstate (arg_state) - PTR arg_state; -{ - register long int *new_state = (long int *) arg_state; - register int type = new_state[0] % MAX_TYPES; - register int rear = new_state[0] / MAX_TYPES; - PTR ostate = (PTR) &state[-1]; - - if (rand_type == TYPE_0) - state[-1] = rand_type; - else - state[-1] = (MAX_TYPES * (rptr - state)) + rand_type; - - switch (type) - { - case TYPE_0: - case TYPE_1: - case TYPE_2: - case TYPE_3: - case TYPE_4: - rand_type = type; - rand_deg = degrees[type]; - rand_sep = seps[type]; - break; - default: - /* State info munged. */ - errno = EINVAL; - return NULL; - } - - state = &new_state[1]; - if (rand_type != TYPE_0) - { - rptr = &state[rear]; - fptr = &state[(rear + rand_sep) % rand_deg]; - } - /* Set end_ptr too. */ - end_ptr = &state[rand_deg]; - - return ostate; -} - -/* If we are using the trivial TYPE_0 R.N.G., just do the old linear - congruential bit. Otherwise, we do our fancy trinomial stuff, which is the - same in all ther other cases due to all the global variables that have been - set up. The basic operation is to add the number at the rear pointer into - the one at the front pointer. Then both pointers are advanced to the next - location cyclically in the table. The value returned is the sum generated, - reduced to 31 bits by throwing away the "least random" low bit. - Note: The code takes advantage of the fact that both the front and - rear pointers can't wrap on the same call by not testing the rear - pointer if the front one has wrapped. Returns a 31-bit random number. */ - -long int -random () -{ - if (rand_type == TYPE_0) - { - state[0] = ((state[0] * 1103515245) + 12345) & LONG_MAX; - return state[0]; - } - else - { - long int i; - *fptr += *rptr; - /* Chucking least random bit. */ - i = (*fptr >> 1) & LONG_MAX; - ++fptr; - if (fptr >= end_ptr) - { - fptr = state; - ++rptr; - } - else - { - ++rptr; - if (rptr >= end_ptr) - rptr = state; - } - return i; - } -} diff --git a/contrib/gdb/libiberty/rename.c b/contrib/gdb/libiberty/rename.c deleted file mode 100644 index ae26e2d004079..0000000000000 --- a/contrib/gdb/libiberty/rename.c +++ /dev/null @@ -1,22 +0,0 @@ -/* rename -- rename a file - This function is in the public domain. */ - -/* Rename a file. */ - -#include <errno.h> - -int -rename (zfrom, zto) - char *zfrom; - char *zto; -{ - if (link (zfrom, zto) < 0) - { - if (errno != EEXIST) - return -1; - if (unlink (zto) < 0 - || link (zfrom, zto) < 0) - return -1; - } - return unlink (zfrom); -} diff --git a/contrib/gdb/libiberty/rindex.c b/contrib/gdb/libiberty/rindex.c deleted file mode 100644 index 061d1269f178e..0000000000000 --- a/contrib/gdb/libiberty/rindex.c +++ /dev/null @@ -1,11 +0,0 @@ -/* Stub implementation of (obsolete) rindex(). */ - -extern char *strrchr (); - -char * -rindex (s, c) - char *s; - int c; -{ - return strrchr (s, c); -} diff --git a/contrib/gdb/libiberty/sigsetmask.c b/contrib/gdb/libiberty/sigsetmask.c deleted file mode 100644 index 2a09e6a6c5ac5..0000000000000 --- a/contrib/gdb/libiberty/sigsetmask.c +++ /dev/null @@ -1,30 +0,0 @@ -/* Version of sigsetmask.c - Written by Steve Chamberlain (sac@cygnus.com). - Contributed by Cygnus Support. - This file is in the public doamin. */ - -/* Set the current signal mask to the set provided, and return the - previous value */ - -#define _POSIX_SOURCE -#include <ansidecl.h> -/* Including <sys/types.h> seems to be needed by ISC. */ -#include <sys/types.h> -#include <signal.h> - -#ifdef SIG_SETMASK -int -DEFUN(sigsetmask,(set), - int set) -{ - sigset_t new; - sigset_t old; - - sigemptyset (&new); - if (set != 0) { - abort(); /* FIXME, we don't know how to translate old mask to new */ - } - sigprocmask(SIG_SETMASK, &new, &old); - return 1; /* FIXME, we always return 1 as old value. */ -} -#endif diff --git a/contrib/gdb/libiberty/spaces.c b/contrib/gdb/libiberty/spaces.c deleted file mode 100644 index 7ea8532d7f6f8..0000000000000 --- a/contrib/gdb/libiberty/spaces.c +++ /dev/null @@ -1,71 +0,0 @@ -/* Allocate memory region filled with spaces. - Copyright (C) 1991 Free Software Foundation, Inc. - -This file is part of the libiberty library. -Libiberty is free software; you can redistribute it and/or -modify it under the terms of the GNU Library General Public -License as published by the Free Software Foundation; either -version 2 of the License, or (at your option) any later version. - -Libiberty 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 -Library General Public License for more details. - -You should have received a copy of the GNU Library General Public -License along with libiberty; see the file COPYING.LIB. If -not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, -Boston, MA 02111-1307, USA. */ - -/* - -NAME - - spaces -- return a pointer to a buffer full of spaces - -SYNOPSIS - - char *spaces (int count) - -DESCRIPTION - - Returns a pointer to a memory region filled with the specified - number of spaces and null terminated. The returned pointer is - valid until at least the next call. - -BUGS - -*/ - -#include "ansidecl.h" -#include "libiberty.h" - -const char * -spaces (count) - int count; -{ - register char *t; - static char *buf; - static int maxsize; - extern char *malloc (); - extern void free (); - - if (count > maxsize) - { - if (buf) - { - free (buf); - } - buf = malloc (count + 1); - if (buf == (char *) 0) - return 0; - for (t = buf + count ; t != buf ; ) - { - *--t = ' '; - } - maxsize = count; - buf[count] = '\0'; - } - return (const char *) (buf + maxsize - count); -} - diff --git a/contrib/gdb/libiberty/strcasecmp.c b/contrib/gdb/libiberty/strcasecmp.c deleted file mode 100644 index 53387ca1b3ee8..0000000000000 --- a/contrib/gdb/libiberty/strcasecmp.c +++ /dev/null @@ -1,81 +0,0 @@ -/* - * Copyright (c) 1987 Regents of the University of California. - * All rights reserved. - * - * Redistribution and use in source and binary forms are permitted - * provided that this notice is preserved and that due credit is given - * to the University of California at Berkeley. The name of the University - * may not be used to endorse or promote products derived from this - * software without specific written prior permission. This software - * is provided ``as is'' without express or implied warranty. - */ - -#if defined(LIBC_SCCS) && !defined(lint) -static char sccsid[] = "@(#)strcasecmp.c 5.5 (Berkeley) 11/24/87"; -#endif /* LIBC_SCCS and not lint */ - -#include <ansidecl.h> -#ifdef __STDC__ -#include <stddef.h> -#else -#define size_t unsigned long -#endif - -/* - * This array is designed for mapping upper and lower case letter - * together for a case independent comparison. The mappings are - * based upon ascii character sequences. - */ -static unsigned char charmap[] = { - '\000', '\001', '\002', '\003', '\004', '\005', '\006', '\007', - '\010', '\011', '\012', '\013', '\014', '\015', '\016', '\017', - '\020', '\021', '\022', '\023', '\024', '\025', '\026', '\027', - '\030', '\031', '\032', '\033', '\034', '\035', '\036', '\037', - '\040', '\041', '\042', '\043', '\044', '\045', '\046', '\047', - '\050', '\051', '\052', '\053', '\054', '\055', '\056', '\057', - '\060', '\061', '\062', '\063', '\064', '\065', '\066', '\067', - '\070', '\071', '\072', '\073', '\074', '\075', '\076', '\077', - '\100', '\141', '\142', '\143', '\144', '\145', '\146', '\147', - '\150', '\151', '\152', '\153', '\154', '\155', '\156', '\157', - '\160', '\161', '\162', '\163', '\164', '\165', '\166', '\167', - '\170', '\171', '\172', '\133', '\134', '\135', '\136', '\137', - '\140', '\141', '\142', '\143', '\144', '\145', '\146', '\147', - '\150', '\151', '\152', '\153', '\154', '\155', '\156', '\157', - '\160', '\161', '\162', '\163', '\164', '\165', '\166', '\167', - '\170', '\171', '\172', '\173', '\174', '\175', '\176', '\177', - '\200', '\201', '\202', '\203', '\204', '\205', '\206', '\207', - '\210', '\211', '\212', '\213', '\214', '\215', '\216', '\217', - '\220', '\221', '\222', '\223', '\224', '\225', '\226', '\227', - '\230', '\231', '\232', '\233', '\234', '\235', '\236', '\237', - '\240', '\241', '\242', '\243', '\244', '\245', '\246', '\247', - '\250', '\251', '\252', '\253', '\254', '\255', '\256', '\257', - '\260', '\261', '\262', '\263', '\264', '\265', '\266', '\267', - '\270', '\271', '\272', '\273', '\274', '\275', '\276', '\277', - '\300', '\341', '\342', '\343', '\344', '\345', '\346', '\347', - '\350', '\351', '\352', '\353', '\354', '\355', '\356', '\357', - '\360', '\361', '\362', '\363', '\364', '\365', '\366', '\367', - '\370', '\371', '\372', '\333', '\334', '\335', '\336', '\337', - '\340', '\341', '\342', '\343', '\344', '\345', '\346', '\347', - '\350', '\351', '\352', '\353', '\354', '\355', '\356', '\357', - '\360', '\361', '\362', '\363', '\364', '\365', '\366', '\367', - '\370', '\371', '\372', '\373', '\374', '\375', '\376', '\377', -}; - -int -strcasecmp(s1, s2) - const char *s1, *s2; -{ - register unsigned char u1, u2; - - for (;;) { - u1 = (unsigned char) *s1++; - u2 = (unsigned char) *s2++; - if (charmap[u1] != charmap[u2]) { - return charmap[u1] - charmap[u2]; - } - if (u1 == '\0') { - return 0; - } - } -} - diff --git a/contrib/gdb/libiberty/strchr.c b/contrib/gdb/libiberty/strchr.c deleted file mode 100644 index 22976ce248af9..0000000000000 --- a/contrib/gdb/libiberty/strchr.c +++ /dev/null @@ -1,34 +0,0 @@ -/* Portable version of strchr() - This function is in the public domain. */ - -/* -NAME - strchr -- return pointer to first occurance of a character - -SYNOPSIS - char *strchr (const char *s, int c) - -DESCRIPTION - Returns a pointer to the first occurance of character C in - string S, or a NULL pointer if no occurance is found. - -BUGS - Behavior when character is the null character is implementation - dependent. -*/ - -#include <ansidecl.h> - -char * -strchr (s, c) - register CONST char *s; - int c; -{ - do { - if (*s == c) - { - return (char*)s; - } - } while (*s++); - return (0); -} diff --git a/contrib/gdb/libiberty/strdup.c b/contrib/gdb/libiberty/strdup.c deleted file mode 100644 index 1785b34f2745a..0000000000000 --- a/contrib/gdb/libiberty/strdup.c +++ /dev/null @@ -1,10 +0,0 @@ -char * -strdup(s) - char *s; -{ - char *result = (char*)malloc(strlen(s) + 1); - if (result == (char*)0) - return (char*)0; - strcpy(result, s); - return result; -} diff --git a/contrib/gdb/libiberty/strerror.c b/contrib/gdb/libiberty/strerror.c deleted file mode 100644 index 9f3f92b3d1a7b..0000000000000 --- a/contrib/gdb/libiberty/strerror.c +++ /dev/null @@ -1,829 +0,0 @@ -/* Extended support for using errno values. - Written by Fred Fish. fnf@cygnus.com - This file is in the public domain. --Per Bothner. */ - -#include "ansidecl.h" -#include "libiberty.h" - -#include "config.h" - -#ifndef NEED_sys_errlist -/* Note that errno.h (not sure what OS) or stdio.h (BSD 4.4, at least) - might declare sys_errlist in a way that the compiler might consider - incompatible with our later declaration, perhaps by using const - attributes. So we hide the declaration in errno.h (if any) using a - macro. */ -#define sys_errlist sys_errlist__ -#endif - -#include <stdio.h> -#include <errno.h> - -#ifndef NEED_sys_errlist -#undef sys_errlist -#endif - -/* Routines imported from standard C runtime libraries. */ - -#ifdef __STDC__ -#include <stddef.h> -extern void *malloc (size_t size); /* 4.10.3.3 */ -extern void *memset (void *s, int c, size_t n); /* 4.11.6.1 */ -#else /* !__STDC__ */ -extern char *malloc (); /* Standard memory allocater */ -extern char *memset (); -#endif /* __STDC__ */ - -#ifndef MAX -# define MAX(a,b) ((a) > (b) ? (a) : (b)) -#endif - -/* Translation table for errno values. See intro(2) in most UNIX systems - Programmers Reference Manuals. - - Note that this table is generally only accessed when it is used at runtime - to initialize errno name and message tables that are indexed by errno - value. - - Not all of these errnos will exist on all systems. This table is the only - thing that should have to be updated as new error numbers are introduced. - It's sort of ugly, but at least its portable. */ - -struct error_info -{ - int value; /* The numeric value from <errno.h> */ - const char *name; /* The equivalent symbolic value */ -#ifdef NEED_sys_errlist - const char *msg; /* Short message about this value */ -#endif -}; - -#ifdef NEED_sys_errlist -# define ENTRY(value, name, msg) {value, name, msg} -#else -# define ENTRY(value, name, msg) {value, name} -#endif - -static const struct error_info error_table[] = -{ -#if defined (EPERM) - ENTRY(EPERM, "EPERM", "Not owner"), -#endif -#if defined (ENOENT) - ENTRY(ENOENT, "ENOENT", "No such file or directory"), -#endif -#if defined (ESRCH) - ENTRY(ESRCH, "ESRCH", "No such process"), -#endif -#if defined (EINTR) - ENTRY(EINTR, "EINTR", "Interrupted system call"), -#endif -#if defined (EIO) - ENTRY(EIO, "EIO", "I/O error"), -#endif -#if defined (ENXIO) - ENTRY(ENXIO, "ENXIO", "No such device or address"), -#endif -#if defined (E2BIG) - ENTRY(E2BIG, "E2BIG", "Arg list too long"), -#endif -#if defined (ENOEXEC) - ENTRY(ENOEXEC, "ENOEXEC", "Exec format error"), -#endif -#if defined (EBADF) - ENTRY(EBADF, "EBADF", "Bad file number"), -#endif -#if defined (ECHILD) - ENTRY(ECHILD, "ECHILD", "No child processes"), -#endif -#if defined (EWOULDBLOCK) /* Put before EAGAIN, sometimes aliased */ - ENTRY(EWOULDBLOCK, "EWOULDBLOCK", "Operation would block"), -#endif -#if defined (EAGAIN) - ENTRY(EAGAIN, "EAGAIN", "No more processes"), -#endif -#if defined (ENOMEM) - ENTRY(ENOMEM, "ENOMEM", "Not enough space"), -#endif -#if defined (EACCES) - ENTRY(EACCES, "EACCES", "Permission denied"), -#endif -#if defined (EFAULT) - ENTRY(EFAULT, "EFAULT", "Bad address"), -#endif -#if defined (ENOTBLK) - ENTRY(ENOTBLK, "ENOTBLK", "Block device required"), -#endif -#if defined (EBUSY) - ENTRY(EBUSY, "EBUSY", "Device busy"), -#endif -#if defined (EEXIST) - ENTRY(EEXIST, "EEXIST", "File exists"), -#endif -#if defined (EXDEV) - ENTRY(EXDEV, "EXDEV", "Cross-device link"), -#endif -#if defined (ENODEV) - ENTRY(ENODEV, "ENODEV", "No such device"), -#endif -#if defined (ENOTDIR) - ENTRY(ENOTDIR, "ENOTDIR", "Not a directory"), -#endif -#if defined (EISDIR) - ENTRY(EISDIR, "EISDIR", "Is a directory"), -#endif -#if defined (EINVAL) - ENTRY(EINVAL, "EINVAL", "Invalid argument"), -#endif -#if defined (ENFILE) - ENTRY(ENFILE, "ENFILE", "File table overflow"), -#endif -#if defined (EMFILE) - ENTRY(EMFILE, "EMFILE", "Too many open files"), -#endif -#if defined (ENOTTY) - ENTRY(ENOTTY, "ENOTTY", "Not a typewriter"), -#endif -#if defined (ETXTBSY) - ENTRY(ETXTBSY, "ETXTBSY", "Text file busy"), -#endif -#if defined (EFBIG) - ENTRY(EFBIG, "EFBIG", "File too large"), -#endif -#if defined (ENOSPC) - ENTRY(ENOSPC, "ENOSPC", "No space left on device"), -#endif -#if defined (ESPIPE) - ENTRY(ESPIPE, "ESPIPE", "Illegal seek"), -#endif -#if defined (EROFS) - ENTRY(EROFS, "EROFS", "Read-only file system"), -#endif -#if defined (EMLINK) - ENTRY(EMLINK, "EMLINK", "Too many links"), -#endif -#if defined (EPIPE) - ENTRY(EPIPE, "EPIPE", "Broken pipe"), -#endif -#if defined (EDOM) - ENTRY(EDOM, "EDOM", "Math argument out of domain of func"), -#endif -#if defined (ERANGE) - ENTRY(ERANGE, "ERANGE", "Math result not representable"), -#endif -#if defined (ENOMSG) - ENTRY(ENOMSG, "ENOMSG", "No message of desired type"), -#endif -#if defined (EIDRM) - ENTRY(EIDRM, "EIDRM", "Identifier removed"), -#endif -#if defined (ECHRNG) - ENTRY(ECHRNG, "ECHRNG", "Channel number out of range"), -#endif -#if defined (EL2NSYNC) - ENTRY(EL2NSYNC, "EL2NSYNC", "Level 2 not synchronized"), -#endif -#if defined (EL3HLT) - ENTRY(EL3HLT, "EL3HLT", "Level 3 halted"), -#endif -#if defined (EL3RST) - ENTRY(EL3RST, "EL3RST", "Level 3 reset"), -#endif -#if defined (ELNRNG) - ENTRY(ELNRNG, "ELNRNG", "Link number out of range"), -#endif -#if defined (EUNATCH) - ENTRY(EUNATCH, "EUNATCH", "Protocol driver not attached"), -#endif -#if defined (ENOCSI) - ENTRY(ENOCSI, "ENOCSI", "No CSI structure available"), -#endif -#if defined (EL2HLT) - ENTRY(EL2HLT, "EL2HLT", "Level 2 halted"), -#endif -#if defined (EDEADLK) - ENTRY(EDEADLK, "EDEADLK", "Deadlock condition"), -#endif -#if defined (ENOLCK) - ENTRY(ENOLCK, "ENOLCK", "No record locks available"), -#endif -#if defined (EBADE) - ENTRY(EBADE, "EBADE", "Invalid exchange"), -#endif -#if defined (EBADR) - ENTRY(EBADR, "EBADR", "Invalid request descriptor"), -#endif -#if defined (EXFULL) - ENTRY(EXFULL, "EXFULL", "Exchange full"), -#endif -#if defined (ENOANO) - ENTRY(ENOANO, "ENOANO", "No anode"), -#endif -#if defined (EBADRQC) - ENTRY(EBADRQC, "EBADRQC", "Invalid request code"), -#endif -#if defined (EBADSLT) - ENTRY(EBADSLT, "EBADSLT", "Invalid slot"), -#endif -#if defined (EDEADLOCK) - ENTRY(EDEADLOCK, "EDEADLOCK", "File locking deadlock error"), -#endif -#if defined (EBFONT) - ENTRY(EBFONT, "EBFONT", "Bad font file format"), -#endif -#if defined (ENOSTR) - ENTRY(ENOSTR, "ENOSTR", "Device not a stream"), -#endif -#if defined (ENODATA) - ENTRY(ENODATA, "ENODATA", "No data available"), -#endif -#if defined (ETIME) - ENTRY(ETIME, "ETIME", "Timer expired"), -#endif -#if defined (ENOSR) - ENTRY(ENOSR, "ENOSR", "Out of streams resources"), -#endif -#if defined (ENONET) - ENTRY(ENONET, "ENONET", "Machine is not on the network"), -#endif -#if defined (ENOPKG) - ENTRY(ENOPKG, "ENOPKG", "Package not installed"), -#endif -#if defined (EREMOTE) - ENTRY(EREMOTE, "EREMOTE", "Object is remote"), -#endif -#if defined (ENOLINK) - ENTRY(ENOLINK, "ENOLINK", "Link has been severed"), -#endif -#if defined (EADV) - ENTRY(EADV, "EADV", "Advertise error"), -#endif -#if defined (ESRMNT) - ENTRY(ESRMNT, "ESRMNT", "Srmount error"), -#endif -#if defined (ECOMM) - ENTRY(ECOMM, "ECOMM", "Communication error on send"), -#endif -#if defined (EPROTO) - ENTRY(EPROTO, "EPROTO", "Protocol error"), -#endif -#if defined (EMULTIHOP) - ENTRY(EMULTIHOP, "EMULTIHOP", "Multihop attempted"), -#endif -#if defined (EDOTDOT) - ENTRY(EDOTDOT, "EDOTDOT", "RFS specific error"), -#endif -#if defined (EBADMSG) - ENTRY(EBADMSG, "EBADMSG", "Not a data message"), -#endif -#if defined (ENAMETOOLONG) - ENTRY(ENAMETOOLONG, "ENAMETOOLONG", "File name too long"), -#endif -#if defined (EOVERFLOW) - ENTRY(EOVERFLOW, "EOVERFLOW", "Value too large for defined data type"), -#endif -#if defined (ENOTUNIQ) - ENTRY(ENOTUNIQ, "ENOTUNIQ", "Name not unique on network"), -#endif -#if defined (EBADFD) - ENTRY(EBADFD, "EBADFD", "File descriptor in bad state"), -#endif -#if defined (EREMCHG) - ENTRY(EREMCHG, "EREMCHG", "Remote address changed"), -#endif -#if defined (ELIBACC) - ENTRY(ELIBACC, "ELIBACC", "Can not access a needed shared library"), -#endif -#if defined (ELIBBAD) - ENTRY(ELIBBAD, "ELIBBAD", "Accessing a corrupted shared library"), -#endif -#if defined (ELIBSCN) - ENTRY(ELIBSCN, "ELIBSCN", ".lib section in a.out corrupted"), -#endif -#if defined (ELIBMAX) - ENTRY(ELIBMAX, "ELIBMAX", "Attempting to link in too many shared libraries"), -#endif -#if defined (ELIBEXEC) - ENTRY(ELIBEXEC, "ELIBEXEC", "Cannot exec a shared library directly"), -#endif -#if defined (EILSEQ) - ENTRY(EILSEQ, "EILSEQ", "Illegal byte sequence"), -#endif -#if defined (ENOSYS) - ENTRY(ENOSYS, "ENOSYS", "Operation not applicable"), -#endif -#if defined (ELOOP) - ENTRY(ELOOP, "ELOOP", "Too many symbolic links encountered"), -#endif -#if defined (ERESTART) - ENTRY(ERESTART, "ERESTART", "Interrupted system call should be restarted"), -#endif -#if defined (ESTRPIPE) - ENTRY(ESTRPIPE, "ESTRPIPE", "Streams pipe error"), -#endif -#if defined (ENOTEMPTY) - ENTRY(ENOTEMPTY, "ENOTEMPTY", "Directory not empty"), -#endif -#if defined (EUSERS) - ENTRY(EUSERS, "EUSERS", "Too many users"), -#endif -#if defined (ENOTSOCK) - ENTRY(ENOTSOCK, "ENOTSOCK", "Socket operation on non-socket"), -#endif -#if defined (EDESTADDRREQ) - ENTRY(EDESTADDRREQ, "EDESTADDRREQ", "Destination address required"), -#endif -#if defined (EMSGSIZE) - ENTRY(EMSGSIZE, "EMSGSIZE", "Message too long"), -#endif -#if defined (EPROTOTYPE) - ENTRY(EPROTOTYPE, "EPROTOTYPE", "Protocol wrong type for socket"), -#endif -#if defined (ENOPROTOOPT) - ENTRY(ENOPROTOOPT, "ENOPROTOOPT", "Protocol not available"), -#endif -#if defined (EPROTONOSUPPORT) - ENTRY(EPROTONOSUPPORT, "EPROTONOSUPPORT", "Protocol not supported"), -#endif -#if defined (ESOCKTNOSUPPORT) - ENTRY(ESOCKTNOSUPPORT, "ESOCKTNOSUPPORT", "Socket type not supported"), -#endif -#if defined (EOPNOTSUPP) - ENTRY(EOPNOTSUPP, "EOPNOTSUPP", "Operation not supported on transport endpoint"), -#endif -#if defined (EPFNOSUPPORT) - ENTRY(EPFNOSUPPORT, "EPFNOSUPPORT", "Protocol family not supported"), -#endif -#if defined (EAFNOSUPPORT) - ENTRY(EAFNOSUPPORT, "EAFNOSUPPORT", "Address family not supported by protocol"), -#endif -#if defined (EADDRINUSE) - ENTRY(EADDRINUSE, "EADDRINUSE", "Address already in use"), -#endif -#if defined (EADDRNOTAVAIL) - ENTRY(EADDRNOTAVAIL, "EADDRNOTAVAIL","Cannot assign requested address"), -#endif -#if defined (ENETDOWN) - ENTRY(ENETDOWN, "ENETDOWN", "Network is down"), -#endif -#if defined (ENETUNREACH) - ENTRY(ENETUNREACH, "ENETUNREACH", "Network is unreachable"), -#endif -#if defined (ENETRESET) - ENTRY(ENETRESET, "ENETRESET", "Network dropped connection because of reset"), -#endif -#if defined (ECONNABORTED) - ENTRY(ECONNABORTED, "ECONNABORTED", "Software caused connection abort"), -#endif -#if defined (ECONNRESET) - ENTRY(ECONNRESET, "ECONNRESET", "Connection reset by peer"), -#endif -#if defined (ENOBUFS) - ENTRY(ENOBUFS, "ENOBUFS", "No buffer space available"), -#endif -#if defined (EISCONN) - ENTRY(EISCONN, "EISCONN", "Transport endpoint is already connected"), -#endif -#if defined (ENOTCONN) - ENTRY(ENOTCONN, "ENOTCONN", "Transport endpoint is not connected"), -#endif -#if defined (ESHUTDOWN) - ENTRY(ESHUTDOWN, "ESHUTDOWN", "Cannot send after transport endpoint shutdown"), -#endif -#if defined (ETOOMANYREFS) - ENTRY(ETOOMANYREFS, "ETOOMANYREFS", "Too many references: cannot splice"), -#endif -#if defined (ETIMEDOUT) - ENTRY(ETIMEDOUT, "ETIMEDOUT", "Connection timed out"), -#endif -#if defined (ECONNREFUSED) - ENTRY(ECONNREFUSED, "ECONNREFUSED", "Connection refused"), -#endif -#if defined (EHOSTDOWN) - ENTRY(EHOSTDOWN, "EHOSTDOWN", "Host is down"), -#endif -#if defined (EHOSTUNREACH) - ENTRY(EHOSTUNREACH, "EHOSTUNREACH", "No route to host"), -#endif -#if defined (EALREADY) - ENTRY(EALREADY, "EALREADY", "Operation already in progress"), -#endif -#if defined (EINPROGRESS) - ENTRY(EINPROGRESS, "EINPROGRESS", "Operation now in progress"), -#endif -#if defined (ESTALE) - ENTRY(ESTALE, "ESTALE", "Stale NFS file handle"), -#endif -#if defined (EUCLEAN) - ENTRY(EUCLEAN, "EUCLEAN", "Structure needs cleaning"), -#endif -#if defined (ENOTNAM) - ENTRY(ENOTNAM, "ENOTNAM", "Not a XENIX named type file"), -#endif -#if defined (ENAVAIL) - ENTRY(ENAVAIL, "ENAVAIL", "No XENIX semaphores available"), -#endif -#if defined (EISNAM) - ENTRY(EISNAM, "EISNAM", "Is a named type file"), -#endif -#if defined (EREMOTEIO) - ENTRY(EREMOTEIO, "EREMOTEIO", "Remote I/O error"), -#endif - ENTRY(0, NULL, NULL) -}; - -#ifdef EVMSERR -/* This is not in the table, because the numeric value of EVMSERR (32767) - lies outside the range of sys_errlist[]. */ -static struct { int value; const char *name, *msg; } - evmserr = { EVMSERR, "EVMSERR", "VMS-specific error" }; -#endif - -/* Translation table allocated and initialized at runtime. Indexed by the - errno value to find the equivalent symbolic value. */ - -static const char **error_names; -static int num_error_names = 0; - -/* Translation table allocated and initialized at runtime, if it does not - already exist in the host environment. Indexed by the errno value to find - the descriptive string. - - We don't export it for use in other modules because even though it has the - same name, it differs from other implementations in that it is dynamically - initialized rather than statically initialized. */ - -#ifdef NEED_sys_errlist - -static int sys_nerr; -static const char **sys_errlist; - -#else - -extern int sys_nerr; -extern char *sys_errlist[]; - -#endif - - -/* - -NAME - - init_error_tables -- initialize the name and message tables - -SYNOPSIS - - static void init_error_tables (); - -DESCRIPTION - - Using the error_table, which is initialized at compile time, generate - the error_names and the sys_errlist (if needed) tables, which are - indexed at runtime by a specific errno value. - -BUGS - - The initialization of the tables may fail under low memory conditions, - in which case we don't do anything particularly useful, but we don't - bomb either. Who knows, it might succeed at a later point if we free - some memory in the meantime. In any case, the other routines know - how to deal with lack of a table after trying to initialize it. This - may or may not be considered to be a bug, that we don't specifically - warn about this particular failure mode. - -*/ - -static void -init_error_tables () -{ - const struct error_info *eip; - int nbytes; - - /* If we haven't already scanned the error_table once to find the maximum - errno value, then go find it now. */ - - if (num_error_names == 0) - { - for (eip = error_table; eip -> name != NULL; eip++) - { - if (eip -> value >= num_error_names) - { - num_error_names = eip -> value + 1; - } - } - } - - /* Now attempt to allocate the error_names table, zero it out, and then - initialize it from the statically initialized error_table. */ - - if (error_names == NULL) - { - nbytes = num_error_names * sizeof (char *); - if ((error_names = (const char **) malloc (nbytes)) != NULL) - { - memset (error_names, 0, nbytes); - for (eip = error_table; eip -> name != NULL; eip++) - { - error_names[eip -> value] = eip -> name; - } - } - } - -#ifdef NEED_sys_errlist - - /* Now attempt to allocate the sys_errlist table, zero it out, and then - initialize it from the statically initialized error_table. */ - - if (sys_errlist == NULL) - { - nbytes = num_error_names * sizeof (char *); - if ((sys_errlist = (const char **) malloc (nbytes)) != NULL) - { - memset (sys_errlist, 0, nbytes); - sys_nerr = num_error_names; - for (eip = error_table; eip -> name != NULL; eip++) - { - sys_errlist[eip -> value] = eip -> msg; - } - } - } - -#endif - -} - -/* - -NAME - - errno_max -- return the max errno value - -SYNOPSIS - - int errno_max (); - -DESCRIPTION - - Returns the maximum errno value for which a corresponding symbolic - name or message is available. Note that in the case where - we use the sys_errlist supplied by the system, it is possible for - there to be more symbolic names than messages, or vice versa. - In fact, the manual page for perror(3C) explicitly warns that one - should check the size of the table (sys_nerr) before indexing it, - since new error codes may be added to the system before they are - added to the table. Thus sys_nerr might be smaller than value - implied by the largest errno value defined in <errno.h>. - - We return the maximum value that can be used to obtain a meaningful - symbolic name or message. - -*/ - -int -errno_max () -{ - int maxsize; - - if (error_names == NULL) - { - init_error_tables (); - } - maxsize = MAX (sys_nerr, num_error_names); - return (maxsize - 1); -} - -#ifdef NEED_strerror - -/* - -NAME - - strerror -- map an error number to an error message string - -SYNOPSIS - - char *strerror (int errnoval) - -DESCRIPTION - - Maps an errno number to an error message string, the contents of - which are implementation defined. On systems which have the external - variables sys_nerr and sys_errlist, these strings will be the same - as the ones used by perror(). - - If the supplied error number is within the valid range of indices - for the sys_errlist, but no message is available for the particular - error number, then returns the string "Error NUM", where NUM is the - error number. - - If the supplied error number is not a valid index into sys_errlist, - returns NULL. - - The returned string is only guaranteed to be valid only until the - next call to strerror. - -*/ - -char * -strerror (errnoval) - int errnoval; -{ - char *msg; - static char buf[32]; - -#ifdef NEED_sys_errlist - - if (error_names == NULL) - { - init_error_tables (); - } - -#endif - - if ((errnoval < 0) || (errnoval >= sys_nerr)) - { -#ifdef EVMSERR - if (errnoval == evmserr.value) - msg = evmserr.msg; - else -#endif - /* Out of range, just return NULL */ - msg = NULL; - } - else if ((sys_errlist == NULL) || (sys_errlist[errnoval] == NULL)) - { - /* In range, but no sys_errlist or no entry at this index. */ - sprintf (buf, "Error %d", errnoval); - msg = buf; - } - else - { - /* In range, and a valid message. Just return the message. */ - msg = (char *) sys_errlist[errnoval]; - } - - return (msg); -} - -#endif /* NEED_strerror */ - - -/* - -NAME - - strerrno -- map an error number to a symbolic name string - -SYNOPSIS - - const char *strerrno (int errnoval) - -DESCRIPTION - - Given an error number returned from a system call (typically - returned in errno), returns a pointer to a string containing the - symbolic name of that error number, as found in <errno.h>. - - If the supplied error number is within the valid range of indices - for symbolic names, but no name is available for the particular - error number, then returns the string "Error NUM", where NUM is - the error number. - - If the supplied error number is not within the range of valid - indices, then returns NULL. - -BUGS - - The contents of the location pointed to are only guaranteed to be - valid until the next call to strerrno. - -*/ - -const char * -strerrno (errnoval) - int errnoval; -{ - const char *name; - static char buf[32]; - - if (error_names == NULL) - { - init_error_tables (); - } - - if ((errnoval < 0) || (errnoval >= num_error_names)) - { -#ifdef EVMSERR - if (errnoval == evmserr.value) - name = evmserr.name; - else -#endif - /* Out of range, just return NULL */ - name = NULL; - } - else if ((error_names == NULL) || (error_names[errnoval] == NULL)) - { - /* In range, but no error_names or no entry at this index. */ - sprintf (buf, "Error %d", errnoval); - name = (const char *) buf; - } - else - { - /* In range, and a valid name. Just return the name. */ - name = error_names[errnoval]; - } - - return (name); -} - -/* - -NAME - - strtoerrno -- map a symbolic errno name to a numeric value - -SYNOPSIS - - int strtoerrno (char *name) - -DESCRIPTION - - Given the symbolic name of a error number, map it to an errno value. - If no translation is found, returns 0. - -*/ - -int -strtoerrno (name) - const char *name; -{ - int errnoval = 0; - - if (name != NULL) - { - if (error_names == NULL) - { - init_error_tables (); - } - for (errnoval = 0; errnoval < num_error_names; errnoval++) - { - if ((error_names[errnoval] != NULL) && - (strcmp (name, error_names[errnoval]) == 0)) - { - break; - } - } - if (errnoval == num_error_names) - { -#ifdef EVMSERR - if (strcmp (name, evmserr.name) == 0) - errnoval = evmserr.value; - else -#endif - errnoval = 0; - } - } - return (errnoval); -} - - -/* A simple little main that does nothing but print all the errno translations - if MAIN is defined and this file is compiled and linked. */ - -#ifdef MAIN - -#include <stdio.h> - -int -main () -{ - int errn; - int errnmax; - const char *name; - char *msg; - char *strerror (); - - errnmax = errno_max (); - printf ("%d entries in names table.\n", num_error_names); - printf ("%d entries in messages table.\n", sys_nerr); - printf ("%d is max useful index.\n", errnmax); - - /* Keep printing values until we get to the end of *both* tables, not - *either* table. Note that knowing the maximum useful index does *not* - relieve us of the responsibility of testing the return pointer for - NULL. */ - - for (errn = 0; errn <= errnmax; errn++) - { - name = strerrno (errn); - name = (name == NULL) ? "<NULL>" : name; - msg = strerror (errn); - msg = (msg == NULL) ? "<NULL>" : msg; - printf ("%-4d%-18s%s\n", errn, name, msg); - } - - return 0; -} - -#endif diff --git a/contrib/gdb/libiberty/strncasecmp.c b/contrib/gdb/libiberty/strncasecmp.c deleted file mode 100644 index 4485cac7a6a22..0000000000000 --- a/contrib/gdb/libiberty/strncasecmp.c +++ /dev/null @@ -1,82 +0,0 @@ -/* - * Copyright (c) 1987 Regents of the University of California. - * All rights reserved. - * - * Redistribution and use in source and binary forms are permitted - * provided that this notice is preserved and that due credit is given - * to the University of California at Berkeley. The name of the University - * may not be used to endorse or promote products derived from this - * software without specific written prior permission. This software - * is provided ``as is'' without express or implied warranty. - */ - -#if defined(LIBC_SCCS) && !defined(lint) -static char sccsid[] = "@(#)strcasecmp.c 5.5 (Berkeley) 11/24/87"; -#endif /* LIBC_SCCS and not lint */ - -#include <ansidecl.h> -#ifdef __STDC__ -#include <stddef.h> -#else -#define size_t unsigned long -#endif - -/* - * This array is designed for mapping upper and lower case letter - * together for a case independent comparison. The mappings are - * based upon ascii character sequences. - */ -static unsigned char charmap[] = { - '\000', '\001', '\002', '\003', '\004', '\005', '\006', '\007', - '\010', '\011', '\012', '\013', '\014', '\015', '\016', '\017', - '\020', '\021', '\022', '\023', '\024', '\025', '\026', '\027', - '\030', '\031', '\032', '\033', '\034', '\035', '\036', '\037', - '\040', '\041', '\042', '\043', '\044', '\045', '\046', '\047', - '\050', '\051', '\052', '\053', '\054', '\055', '\056', '\057', - '\060', '\061', '\062', '\063', '\064', '\065', '\066', '\067', - '\070', '\071', '\072', '\073', '\074', '\075', '\076', '\077', - '\100', '\141', '\142', '\143', '\144', '\145', '\146', '\147', - '\150', '\151', '\152', '\153', '\154', '\155', '\156', '\157', - '\160', '\161', '\162', '\163', '\164', '\165', '\166', '\167', - '\170', '\171', '\172', '\133', '\134', '\135', '\136', '\137', - '\140', '\141', '\142', '\143', '\144', '\145', '\146', '\147', - '\150', '\151', '\152', '\153', '\154', '\155', '\156', '\157', - '\160', '\161', '\162', '\163', '\164', '\165', '\166', '\167', - '\170', '\171', '\172', '\173', '\174', '\175', '\176', '\177', - '\200', '\201', '\202', '\203', '\204', '\205', '\206', '\207', - '\210', '\211', '\212', '\213', '\214', '\215', '\216', '\217', - '\220', '\221', '\222', '\223', '\224', '\225', '\226', '\227', - '\230', '\231', '\232', '\233', '\234', '\235', '\236', '\237', - '\240', '\241', '\242', '\243', '\244', '\245', '\246', '\247', - '\250', '\251', '\252', '\253', '\254', '\255', '\256', '\257', - '\260', '\261', '\262', '\263', '\264', '\265', '\266', '\267', - '\270', '\271', '\272', '\273', '\274', '\275', '\276', '\277', - '\300', '\341', '\342', '\343', '\344', '\345', '\346', '\347', - '\350', '\351', '\352', '\353', '\354', '\355', '\356', '\357', - '\360', '\361', '\362', '\363', '\364', '\365', '\366', '\367', - '\370', '\371', '\372', '\333', '\334', '\335', '\336', '\337', - '\340', '\341', '\342', '\343', '\344', '\345', '\346', '\347', - '\350', '\351', '\352', '\353', '\354', '\355', '\356', '\357', - '\360', '\361', '\362', '\363', '\364', '\365', '\366', '\367', - '\370', '\371', '\372', '\373', '\374', '\375', '\376', '\377', -}; - -int -strncasecmp(s1, s2, n) - const char *s1, *s2; - register size_t n; -{ - register unsigned char u1, u2; - - for (; n != 0; --n) { - u1 = (unsigned char) *s1++; - u2 = (unsigned char) *s2++; - if (charmap[u1] != charmap[u2]) { - return charmap[u1] - charmap[u2]; - } - if (u1 == '\0') { - return 0; - } - } - return 0; -} diff --git a/contrib/gdb/libiberty/strrchr.c b/contrib/gdb/libiberty/strrchr.c deleted file mode 100644 index 30f9e8a3658ae..0000000000000 --- a/contrib/gdb/libiberty/strrchr.c +++ /dev/null @@ -1,34 +0,0 @@ -/* Portable version of strrchr(). - This function is in the public domain. */ - -/* -NAME - strrchr -- return pointer to last occurance of a character - -SYNOPSIS - char *strrchr (const char *s, int c) - -DESCRIPTION - Returns a pointer to the last occurance of character C in - string S, or a NULL pointer if no occurance is found. - -BUGS - Behavior when character is the null character is implementation - dependent. -*/ - -#include <ansidecl.h> - -char * -strrchr (s, c) - register CONST char *s; - int c; -{ - char *rtnval = 0; - - do { - if (*s == c) - rtnval = (char*) s; - } while (*s++); - return (rtnval); -} diff --git a/contrib/gdb/libiberty/strsignal.c b/contrib/gdb/libiberty/strsignal.c deleted file mode 100644 index c4dd63c809815..0000000000000 --- a/contrib/gdb/libiberty/strsignal.c +++ /dev/null @@ -1,627 +0,0 @@ -/* Extended support for using signal values. - Written by Fred Fish. fnf@cygnus.com - This file is in the public domain. */ - -#include "ansidecl.h" -#include "libiberty.h" - -#include "config.h" - -#ifdef LOSING_SYS_SIGLIST -#define sys_siglist no_such_symbol -#endif - -#include <stdio.h> -#include <signal.h> - -/* Routines imported from standard C runtime libraries. */ - -#ifdef __STDC__ -#include <stddef.h> -extern void *malloc (size_t size); /* 4.10.3.3 */ -extern void *memset (void *s, int c, size_t n); /* 4.11.6.1 */ -#else /* !__STDC__ */ -extern char *malloc (); /* Standard memory allocater */ -extern char *memset (); -#endif /* __STDC__ */ - -#ifdef LOSING_SYS_SIGLIST -#undef sys_siglist -#endif - - -#ifndef NULL -# ifdef __STDC__ -# define NULL (void *) 0 -# else -# define NULL 0 -# endif -#endif - -#ifndef MAX -# define MAX(a,b) ((a) > (b) ? (a) : (b)) -#endif - -/* Translation table for signal values. - - Note that this table is generally only accessed when it is used at runtime - to initialize signal name and message tables that are indexed by signal - value. - - Not all of these signals will exist on all systems. This table is the only - thing that should have to be updated as new signal numbers are introduced. - It's sort of ugly, but at least its portable. */ - -struct signal_info -{ - int value; /* The numeric value from <signal.h> */ - const char *name; /* The equivalent symbolic value */ -#ifdef NEED_sys_siglist - const char *msg; /* Short message about this value */ -#endif -}; - -#ifdef NEED_sys_siglist -# define ENTRY(value, name, msg) {value, name, msg} -#else -# define ENTRY(value, name, msg) {value, name} -#endif - -static const struct signal_info signal_table[] = -{ -#if defined (SIGHUP) - ENTRY(SIGHUP, "SIGHUP", "Hangup"), -#endif -#if defined (SIGINT) - ENTRY(SIGINT, "SIGINT", "Interrupt"), -#endif -#if defined (SIGQUIT) - ENTRY(SIGQUIT, "SIGQUIT", "Quit"), -#endif -#if defined (SIGILL) - ENTRY(SIGILL, "SIGILL", "Illegal instruction"), -#endif -#if defined (SIGTRAP) - ENTRY(SIGTRAP, "SIGTRAP", "Trace/breakpoint trap"), -#endif -/* Put SIGIOT before SIGABRT, so that if SIGIOT==SIGABRT then SIGABRT - overrides SIGIOT. SIGABRT is in ANSI and POSIX.1, and SIGIOT isn't. */ -#if defined (SIGIOT) - ENTRY(SIGIOT, "SIGIOT", "IOT trap"), -#endif -#if defined (SIGABRT) - ENTRY(SIGABRT, "SIGABRT", "Aborted"), -#endif -#if defined (SIGEMT) - ENTRY(SIGEMT, "SIGEMT", "Emulation trap"), -#endif -#if defined (SIGFPE) - ENTRY(SIGFPE, "SIGFPE", "Arithmetic exception"), -#endif -#if defined (SIGKILL) - ENTRY(SIGKILL, "SIGKILL", "Killed"), -#endif -#if defined (SIGBUS) - ENTRY(SIGBUS, "SIGBUS", "Bus error"), -#endif -#if defined (SIGSEGV) - ENTRY(SIGSEGV, "SIGSEGV", "Segmentation fault"), -#endif -#if defined (SIGSYS) - ENTRY(SIGSYS, "SIGSYS", "Bad system call"), -#endif -#if defined (SIGPIPE) - ENTRY(SIGPIPE, "SIGPIPE", "Broken pipe"), -#endif -#if defined (SIGALRM) - ENTRY(SIGALRM, "SIGALRM", "Alarm clock"), -#endif -#if defined (SIGTERM) - ENTRY(SIGTERM, "SIGTERM", "Terminated"), -#endif -#if defined (SIGUSR1) - ENTRY(SIGUSR1, "SIGUSR1", "User defined signal 1"), -#endif -#if defined (SIGUSR2) - ENTRY(SIGUSR2, "SIGUSR2", "User defined signal 2"), -#endif -/* Put SIGCLD before SIGCHLD, so that if SIGCLD==SIGCHLD then SIGCHLD - overrides SIGCLD. SIGCHLD is in POXIX.1 */ -#if defined (SIGCLD) - ENTRY(SIGCLD, "SIGCLD", "Child status changed"), -#endif -#if defined (SIGCHLD) - ENTRY(SIGCHLD, "SIGCHLD", "Child status changed"), -#endif -#if defined (SIGPWR) - ENTRY(SIGPWR, "SIGPWR", "Power fail/restart"), -#endif -#if defined (SIGWINCH) - ENTRY(SIGWINCH, "SIGWINCH", "Window size changed"), -#endif -#if defined (SIGURG) - ENTRY(SIGURG, "SIGURG", "Urgent I/O condition"), -#endif -#if defined (SIGIO) - /* "I/O pending" has also been suggested, but is misleading since the - signal only happens when the process has asked for it, not everytime - I/O is pending. */ - ENTRY(SIGIO, "SIGIO", "I/O possible"), -#endif -#if defined (SIGPOLL) - ENTRY(SIGPOLL, "SIGPOLL", "Pollable event occurred"), -#endif -#if defined (SIGSTOP) - ENTRY(SIGSTOP, "SIGSTOP", "Stopped (signal)"), -#endif -#if defined (SIGTSTP) - ENTRY(SIGTSTP, "SIGTSTP", "Stopped (user)"), -#endif -#if defined (SIGCONT) - ENTRY(SIGCONT, "SIGCONT", "Continued"), -#endif -#if defined (SIGTTIN) - ENTRY(SIGTTIN, "SIGTTIN", "Stopped (tty input)"), -#endif -#if defined (SIGTTOU) - ENTRY(SIGTTOU, "SIGTTOU", "Stopped (tty output)"), -#endif -#if defined (SIGVTALRM) - ENTRY(SIGVTALRM, "SIGVTALRM", "Virtual timer expired"), -#endif -#if defined (SIGPROF) - ENTRY(SIGPROF, "SIGPROF", "Profiling timer expired"), -#endif -#if defined (SIGXCPU) - ENTRY(SIGXCPU, "SIGXCPU", "CPU time limit exceeded"), -#endif -#if defined (SIGXFSZ) - ENTRY(SIGXFSZ, "SIGXFSZ", "File size limit exceeded"), -#endif -#if defined (SIGWIND) - ENTRY(SIGWIND, "SIGWIND", "SIGWIND"), -#endif -#if defined (SIGPHONE) - ENTRY(SIGPHONE, "SIGPHONE", "SIGPHONE"), -#endif -#if defined (SIGLOST) - ENTRY(SIGLOST, "SIGLOST", "Resource lost"), -#endif -#if defined (SIGWAITING) - ENTRY(SIGWAITING, "SIGWAITING", "Process's LWPs are blocked"), -#endif -#if defined (SIGLWP) - ENTRY(SIGLWP, "SIGLWP", "Signal LWP"), -#endif -#if defined (SIGDANGER) - ENTRY(SIGDANGER, "SIGDANGER", "Swap space dangerously low"), -#endif -#if defined (SIGGRANT) - ENTRY(SIGGRANT, "SIGGRANT", "Monitor mode granted"), -#endif -#if defined (SIGRETRACT) - ENTRY(SIGRETRACT, "SIGRETRACT", "Need to relinguish monitor mode"), -#endif -#if defined (SIGMSG) - ENTRY(SIGMSG, "SIGMSG", "Monitor mode data available"), -#endif -#if defined (SIGSOUND) - ENTRY(SIGSOUND, "SIGSOUND", "Sound completed"), -#endif -#if defined (SIGSAK) - ENTRY(SIGSAK, "SIGSAK", "Secure attention"), -#endif - ENTRY(0, NULL, NULL) -}; - -/* Translation table allocated and initialized at runtime. Indexed by the - signal value to find the equivalent symbolic value. */ - -static const char **signal_names; -static int num_signal_names = 0; - -/* Translation table allocated and initialized at runtime, if it does not - already exist in the host environment. Indexed by the signal value to find - the descriptive string. - - We don't export it for use in other modules because even though it has the - same name, it differs from other implementations in that it is dynamically - initialized rather than statically initialized. */ - -#ifdef NEED_sys_siglist - -static int sys_nsig; -static const char **sys_siglist; - -#else - -static int sys_nsig = NSIG; -extern const char * const sys_siglist[]; - -#endif - - -/* - -NAME - - init_signal_tables -- initialize the name and message tables - -SYNOPSIS - - static void init_signal_tables (); - -DESCRIPTION - - Using the signal_table, which is initialized at compile time, generate - the signal_names and the sys_siglist (if needed) tables, which are - indexed at runtime by a specific signal value. - -BUGS - - The initialization of the tables may fail under low memory conditions, - in which case we don't do anything particularly useful, but we don't - bomb either. Who knows, it might succeed at a later point if we free - some memory in the meantime. In any case, the other routines know - how to deal with lack of a table after trying to initialize it. This - may or may not be considered to be a bug, that we don't specifically - warn about this particular failure mode. - -*/ - -static void -init_signal_tables () -{ - const struct signal_info *eip; - int nbytes; - - /* If we haven't already scanned the signal_table once to find the maximum - signal value, then go find it now. */ - - if (num_signal_names == 0) - { - for (eip = signal_table; eip -> name != NULL; eip++) - { - if (eip -> value >= num_signal_names) - { - num_signal_names = eip -> value + 1; - } - } - } - - /* Now attempt to allocate the signal_names table, zero it out, and then - initialize it from the statically initialized signal_table. */ - - if (signal_names == NULL) - { - nbytes = num_signal_names * sizeof (char *); - if ((signal_names = (const char **) malloc (nbytes)) != NULL) - { - memset (signal_names, 0, nbytes); - for (eip = signal_table; eip -> name != NULL; eip++) - { - signal_names[eip -> value] = eip -> name; - } - } - } - -#ifdef NEED_sys_siglist - - /* Now attempt to allocate the sys_siglist table, zero it out, and then - initialize it from the statically initialized signal_table. */ - - if (sys_siglist == NULL) - { - nbytes = num_signal_names * sizeof (char *); - if ((sys_siglist = (const char **) malloc (nbytes)) != NULL) - { - memset (sys_siglist, 0, nbytes); - sys_nsig = num_signal_names; - for (eip = signal_table; eip -> name != NULL; eip++) - { - sys_siglist[eip -> value] = eip -> msg; - } - } - } - -#endif - -} - - -/* - -NAME - - signo_max -- return the max signo value - -SYNOPSIS - - int signo_max (); - -DESCRIPTION - - Returns the maximum signo value for which a corresponding symbolic - name or message is available. Note that in the case where - we use the sys_siglist supplied by the system, it is possible for - there to be more symbolic names than messages, or vice versa. - In fact, the manual page for psignal(3b) explicitly warns that one - should check the size of the table (NSIG) before indexing it, - since new signal codes may be added to the system before they are - added to the table. Thus NSIG might be smaller than value - implied by the largest signo value defined in <signal.h>. - - We return the maximum value that can be used to obtain a meaningful - symbolic name or message. - -*/ - -int -signo_max () -{ - int maxsize; - - if (signal_names == NULL) - { - init_signal_tables (); - } - maxsize = MAX (sys_nsig, num_signal_names); - return (maxsize - 1); -} - - -/* - -NAME - - strsignal -- map a signal number to a signal message string - -SYNOPSIS - - const char *strsignal (int signo) - -DESCRIPTION - - Maps an signal number to an signal message string, the contents of - which are implementation defined. On systems which have the external - variable sys_siglist, these strings will be the same as the ones used - by psignal(). - - If the supplied signal number is within the valid range of indices - for the sys_siglist, but no message is available for the particular - signal number, then returns the string "Signal NUM", where NUM is the - signal number. - - If the supplied signal number is not a valid index into sys_siglist, - returns NULL. - - The returned string is only guaranteed to be valid only until the - next call to strsignal. - -*/ - -const char * -strsignal (signo) - int signo; -{ - const char *msg; - static char buf[32]; - -#ifdef NEED_sys_siglist - - if (signal_names == NULL) - { - init_signal_tables (); - } - -#endif - - if ((signo < 0) || (signo >= sys_nsig)) - { - /* Out of range, just return NULL */ - msg = NULL; - } - else if ((sys_siglist == NULL) || (sys_siglist[signo] == NULL)) - { - /* In range, but no sys_siglist or no entry at this index. */ - sprintf (buf, "Signal %d", signo); - msg = (const char *) buf; - } - else - { - /* In range, and a valid message. Just return the message. */ - msg = (const char *) sys_siglist[signo]; - } - - return (msg); -} - - -/* - -NAME - - strsigno -- map an signal number to a symbolic name string - -SYNOPSIS - - const char *strsigno (int signo) - -DESCRIPTION - - Given an signal number, returns a pointer to a string containing - the symbolic name of that signal number, as found in <signal.h>. - - If the supplied signal number is within the valid range of indices - for symbolic names, but no name is available for the particular - signal number, then returns the string "Signal NUM", where NUM is - the signal number. - - If the supplied signal number is not within the range of valid - indices, then returns NULL. - -BUGS - - The contents of the location pointed to are only guaranteed to be - valid until the next call to strsigno. - -*/ - -const char * -strsigno (signo) - int signo; -{ - const char *name; - static char buf[32]; - - if (signal_names == NULL) - { - init_signal_tables (); - } - - if ((signo < 0) || (signo >= num_signal_names)) - { - /* Out of range, just return NULL */ - name = NULL; - } - else if ((signal_names == NULL) || (signal_names[signo] == NULL)) - { - /* In range, but no signal_names or no entry at this index. */ - sprintf (buf, "Signal %d", signo); - name = (const char *) buf; - } - else - { - /* In range, and a valid name. Just return the name. */ - name = signal_names[signo]; - } - - return (name); -} - - -/* - -NAME - - strtosigno -- map a symbolic signal name to a numeric value - -SYNOPSIS - - int strtosigno (char *name) - -DESCRIPTION - - Given the symbolic name of a signal, map it to a signal number. - If no translation is found, returns 0. - -*/ - -int -strtosigno (name) - const char *name; -{ - int signo = 0; - - if (name != NULL) - { - if (signal_names == NULL) - { - init_signal_tables (); - } - for (signo = 0; signo < num_signal_names; signo++) - { - if ((signal_names[signo] != NULL) && - (strcmp (name, signal_names[signo]) == 0)) - { - break; - } - } - if (signo == num_signal_names) - { - signo = 0; - } - } - return (signo); -} - - -/* - -NAME - - psignal -- print message about signal to stderr - -SYNOPSIS - - void psignal (unsigned signo, char *message); - -DESCRIPTION - - Print to the standard error the message, followed by a colon, - followed by the description of the signal specified by signo, - followed by a newline. -*/ - -#ifdef NEED_psignal - -void -psignal (signo, message) - unsigned signo; - char *message; -{ - if (signal_names == NULL) - { - init_signal_tables (); - } - if ((signo <= 0) || (signo >= sys_nsig)) - { - fprintf (stderr, "%s: unknown signal\n", message); - } - else - { - fprintf (stderr, "%s: %s\n", message, sys_siglist[signo]); - } -} - -#endif /* NEED_psignal */ - - -/* A simple little main that does nothing but print all the signal translations - if MAIN is defined and this file is compiled and linked. */ - -#ifdef MAIN - -#include <stdio.h> - -int -main () -{ - int signo; - int maxsigno; - const char *name; - const char *msg; - - maxsigno = signo_max (); - printf ("%d entries in names table.\n", num_signal_names); - printf ("%d entries in messages table.\n", sys_nsig); - printf ("%d is max useful index.\n", maxsigno); - - /* Keep printing values until we get to the end of *both* tables, not - *either* table. Note that knowing the maximum useful index does *not* - relieve us of the responsibility of testing the return pointer for - NULL. */ - - for (signo = 0; signo <= maxsigno; signo++) - { - name = strsigno (signo); - name = (name == NULL) ? "<NULL>" : name; - msg = strsignal (signo); - msg = (msg == NULL) ? "<NULL>" : msg; - printf ("%-4d%-18s%s\n", signo, name, msg); - } - - return 0; -} - -#endif diff --git a/contrib/gdb/libiberty/strstr.c b/contrib/gdb/libiberty/strstr.c deleted file mode 100644 index fab36e3fb3d4e..0000000000000 --- a/contrib/gdb/libiberty/strstr.c +++ /dev/null @@ -1,51 +0,0 @@ -/* Simple implementation of strstr for systems without it. - This function is in the public domain. */ - -/* - -NAME - - strstr -- locate first occurance of a substring - -SYNOPSIS - - #include <string.h> - - char *strstr (char *s1, char *s2) - -DESCRIPTION - - Locates the first occurance in the string pointed to by S1 of - the string pointed to by S2. Returns a pointer to the substring - found, or a NULL pointer if not found. If S2 points to a string - with zero length, the function returns S1. - -BUGS - -*/ - - -/* FIXME: The above description is ANSI compiliant. This routine has not - been validated to comply with it. -fnf */ - -char * -strstr (s1, s2) - char *s1, *s2; -{ - register char *p = s1; - extern char *strchr (); - extern int strncmp (); -#if __GNUC__==2 - extern __SIZE_TYPE__ strlen (); -#endif - register int len = strlen (s2); - - for (; (p = strchr (p, *s2)) != 0; p++) - { - if (strncmp (p, s2, len) == 0) - { - return (p); - } - } - return (0); -} diff --git a/contrib/gdb/libiberty/strtod.c b/contrib/gdb/libiberty/strtod.c deleted file mode 100644 index c86c73de9b387..0000000000000 --- a/contrib/gdb/libiberty/strtod.c +++ /dev/null @@ -1,122 +0,0 @@ -/* Implementation of strtod for systems with atof. - Copyright (C) 1991, 1995 Free Software Foundation, Inc. - -This file is part of the libiberty library. This library 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 2, or (at your option) -any later version. - -This library 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 GNU CC; see the file COPYING. If not, write to -the Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - -As a special exception, if you link this library with files -compiled with a GNU compiler to produce an executable, this does not cause -the resulting executable to be covered by the GNU General Public License. -This exception does not however invalidate any other reasons why -the executable file might be covered by the GNU General Public License. */ - -#include <ctype.h> - -extern double atof (); - -/* Disclaimer: this is currently just used by CHILL in GDB and therefore - has not been tested well. It may have been tested for nothing except - that it compiles. */ - -double -strtod (str, ptr) - char *str; - char **ptr; -{ - char *p; - - if (ptr == (char **)0) - return atof (str); - - p = str; - - while (isspace (*p)) - ++p; - - if (*p == '+' || *p == '-') - ++p; - - /* INF or INFINITY. */ - if ((p[0] == 'i' || p[0] == 'I') - && (p[1] == 'n' || p[1] == 'N') - && (p[2] == 'f' || p[2] == 'F')) - { - if ((p[3] == 'i' || p[3] == 'I') - && (p[4] == 'n' || p[4] == 'N') - && (p[5] == 'i' || p[5] == 'I') - && (p[6] == 't' || p[6] == 'T') - && (p[7] == 'y' || p[7] == 'Y')) - { - *ptr = p + 7; - return atof (str); - } - else - { - *ptr = p + 3; - return atof (str); - } - } - - /* NAN or NAN(foo). */ - if ((p[0] == 'n' || p[0] == 'N') - && (p[1] == 'a' || p[1] == 'A') - && (p[2] == 'n' || p[2] == 'N')) - { - p += 3; - if (*p == '(') - { - ++p; - while (*p != '\0' && *p != ')') - ++p; - if (*p == ')') - ++p; - } - *ptr = p; - return atof (str); - } - - /* digits, with 0 or 1 periods in it. */ - if (isdigit (*p) || *p == '.') - { - int got_dot = 0; - while (isdigit (*p) || (!got_dot && *p == '.')) - { - if (*p == '.') - got_dot = 1; - ++p; - } - - /* Exponent. */ - if (*p == 'e' || *p == 'E') - { - int i; - i = 1; - if (p[i] == '+' || p[i] == '-') - ++i; - if (isdigit (p[i])) - { - while (isdigit (p[i])) - ++i; - *ptr = p + i; - return atof (str); - } - } - *ptr = p; - return atof (str); - } - /* Didn't find any digits. Doesn't look like a number. */ - *ptr = str; - return 0.0; -} diff --git a/contrib/gdb/libiberty/strtol.c b/contrib/gdb/libiberty/strtol.c deleted file mode 100644 index db27ee0a8759a..0000000000000 --- a/contrib/gdb/libiberty/strtol.c +++ /dev/null @@ -1,143 +0,0 @@ -/*- - * Copyright (c) 1990 The Regents of the University of California. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the University of - * California, Berkeley and its contributors. - * 4. Neither the name of the University nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - */ - -#include <limits.h> -#include <ctype.h> -#include <errno.h> -#if 0 -#include <stdlib.h> -#endif -#include "ansidecl.h" - -/* FIXME: It'd be nice to configure around these, but the include files are too - painful. These macros should at least be more portable than hardwired hex - constants. */ - -#ifndef ULONG_MAX -#define ULONG_MAX ((unsigned long)(~0L)) /* 0xFFFFFFFF */ -#endif - -#ifndef LONG_MAX -#define LONG_MAX ((long)(ULONG_MAX >> 1)) /* 0x7FFFFFFF */ -#endif - -#ifndef LONG_MIN -#define LONG_MIN ((long)(~LONG_MAX)) /* 0x80000000 */ -#endif - -/* - * Convert a string to a long integer. - * - * Ignores `locale' stuff. Assumes that the upper and lower case - * alphabets and digits are each contiguous. - */ -long -strtol(nptr, endptr, base) - CONST char *nptr; - char **endptr; - register int base; -{ - register CONST char *s = nptr; - register unsigned long acc; - register int c; - register unsigned long cutoff; - register int neg = 0, any, cutlim; - - /* - * Skip white space and pick up leading +/- sign if any. - * If base is 0, allow 0x for hex and 0 for octal, else - * assume decimal; if base is already 16, allow 0x. - */ - do { - c = *s++; - } while (isspace(c)); - if (c == '-') { - neg = 1; - c = *s++; - } else if (c == '+') - c = *s++; - if ((base == 0 || base == 16) && - c == '0' && (*s == 'x' || *s == 'X')) { - c = s[1]; - s += 2; - base = 16; - } - if (base == 0) - base = c == '0' ? 8 : 10; - - /* - * Compute the cutoff value between legal numbers and illegal - * numbers. That is the largest legal value, divided by the - * base. An input number that is greater than this value, if - * followed by a legal input character, is too big. One that - * is equal to this value may be valid or not; the limit - * between valid and invalid numbers is then based on the last - * digit. For instance, if the range for longs is - * [-2147483648..2147483647] and the input base is 10, - * cutoff will be set to 214748364 and cutlim to either - * 7 (neg==0) or 8 (neg==1), meaning that if we have accumulated - * a value > 214748364, or equal but the next digit is > 7 (or 8), - * the number is too big, and we will return a range error. - * - * Set any if any `digits' consumed; make it negative to indicate - * overflow. - */ - cutoff = neg ? -(unsigned long)LONG_MIN : LONG_MAX; - cutlim = cutoff % (unsigned long)base; - cutoff /= (unsigned long)base; - for (acc = 0, any = 0;; c = *s++) { - if (isdigit(c)) - c -= '0'; - else if (isalpha(c)) - c -= isupper(c) ? 'A' - 10 : 'a' - 10; - else - break; - if (c >= base) - break; - if (any < 0 || acc > cutoff || acc == cutoff && c > cutlim) - any = -1; - else { - any = 1; - acc *= base; - acc += c; - } - } - if (any < 0) { - acc = neg ? LONG_MIN : LONG_MAX; - errno = ERANGE; - } else if (neg) - acc = -acc; - if (endptr != 0) - *endptr = (char *) (any ? s - 1 : nptr); - return (acc); -} diff --git a/contrib/gdb/libiberty/strtoul.c b/contrib/gdb/libiberty/strtoul.c deleted file mode 100644 index 40902452fed36..0000000000000 --- a/contrib/gdb/libiberty/strtoul.c +++ /dev/null @@ -1,110 +0,0 @@ -/* - * Copyright (c) 1990 Regents of the University of California. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the University of - * California, Berkeley and its contributors. - * 4. Neither the name of the University nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - */ - -#include <limits.h> -#include <ctype.h> -#include <errno.h> -#if 0 -#include <stdlib.h> -#endif -#include "ansidecl.h" - -#ifndef ULONG_MAX -#define ULONG_MAX ((unsigned long)(~0L)) /* 0xFFFFFFFF */ -#endif - -/* - * Convert a string to an unsigned long integer. - * - * Ignores `locale' stuff. Assumes that the upper and lower case - * alphabets and digits are each contiguous. - */ -unsigned long -strtoul(nptr, endptr, base) - CONST char *nptr; - char **endptr; - register int base; -{ - register CONST char *s = nptr; - register unsigned long acc; - register int c; - register unsigned long cutoff; - register int neg = 0, any, cutlim; - - /* - * See strtol for comments as to the logic used. - */ - do { - c = *s++; - } while (isspace(c)); - if (c == '-') { - neg = 1; - c = *s++; - } else if (c == '+') - c = *s++; - if ((base == 0 || base == 16) && - c == '0' && (*s == 'x' || *s == 'X')) { - c = s[1]; - s += 2; - base = 16; - } - if (base == 0) - base = c == '0' ? 8 : 10; - cutoff = (unsigned long)ULONG_MAX / (unsigned long)base; - cutlim = (unsigned long)ULONG_MAX % (unsigned long)base; - for (acc = 0, any = 0;; c = *s++) { - if (isdigit(c)) - c -= '0'; - else if (isalpha(c)) - c -= isupper(c) ? 'A' - 10 : 'a' - 10; - else - break; - if (c >= base) - break; - if (any < 0 || acc > cutoff || acc == cutoff && c > cutlim) - any = -1; - else { - any = 1; - acc *= base; - acc += c; - } - } - if (any < 0) { - acc = ULONG_MAX; - errno = ERANGE; - } else if (neg) - acc = -acc; - if (endptr != 0) - *endptr = (char *) (any ? s - 1 : nptr); - return (acc); -} diff --git a/contrib/gdb/libiberty/tmpnam.c b/contrib/gdb/libiberty/tmpnam.c deleted file mode 100644 index c06146774252f..0000000000000 --- a/contrib/gdb/libiberty/tmpnam.c +++ /dev/null @@ -1,39 +0,0 @@ -#include <stdio.h> - -#ifndef L_tmpnam -#define L_tmpname 100 -#endif -#ifndef P_tmpdir -#define P_tmpdir "/usr/tmp" -#endif - -static char tmpnam_buffer[L_tmpnam]; -static int tmpnam_counter; - -extern int getpid (); - -char * -tmpnam (s) - char *s; -{ - int pid = getpid (); - - if (s == NULL) - s = tmpnam_buffer; - - /* Generate the filename and make sure that there isn't one called - it already. */ - - while (1) - { - FILE *f; - sprintf (s, "%s/%s%x.%x", P_tmpdir, "t", pid, tmpnam_counter); - f = fopen (s, "r"); - if (f == NULL) - break; - tmpnam_counter++; - fclose (f); - } - - return s; -} diff --git a/contrib/gdb/libiberty/vasprintf.c b/contrib/gdb/libiberty/vasprintf.c deleted file mode 100644 index 3794cbd2c4fb4..0000000000000 --- a/contrib/gdb/libiberty/vasprintf.c +++ /dev/null @@ -1,165 +0,0 @@ -/* Like vsprintf but provides a pointer to malloc'd storage, which must - be freed by the caller. - Copyright (C) 1994 Free Software Foundation, Inc. - -This file is part of the libiberty library. -Libiberty is free software; you can redistribute it and/or -modify it under the terms of the GNU Library General Public -License as published by the Free Software Foundation; either -version 2 of the License, or (at your option) any later version. - -Libiberty 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 -Library General Public License for more details. - -You should have received a copy of the GNU Library General Public -License along with libiberty; see the file COPYING.LIB. If -not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, -Boston, MA 02111-1307, USA. */ - -#include <stdio.h> -#include <string.h> -#include <ansidecl.h> -#ifdef __STDC__ -#include <stdarg.h> -#else -#include <varargs.h> -#endif - -#ifdef TEST -int global_total_width; -#endif - -unsigned long strtoul (); -char *malloc (); - -static int -int_vasprintf (result, format, args) - char **result; - const char *format; - va_list *args; -{ - const char *p = format; - /* Add one to make sure that it is never zero, which might cause malloc - to return NULL. */ - int total_width = strlen (format) + 1; - va_list ap; - - memcpy ((PTR) &ap, (PTR) args, sizeof (va_list)); - - while (*p != '\0') - { - if (*p++ == '%') - { - while (strchr ("-+ #0", *p)) - ++p; - if (*p == '*') - { - ++p; - total_width += abs (va_arg (ap, int)); - } - else - total_width += strtoul (p, &p, 10); - if (*p == '.') - { - ++p; - if (*p == '*') - { - ++p; - total_width += abs (va_arg (ap, int)); - } - else - total_width += strtoul (p, &p, 10); - } - while (strchr ("hlL", *p)) - ++p; - /* Should be big enough for any format specifier except %s. */ - total_width += 30; - switch (*p) - { - case 'd': - case 'i': - case 'o': - case 'u': - case 'x': - case 'X': - case 'c': - (void) va_arg (ap, int); - break; - case 'f': - case 'e': - case 'E': - case 'g': - case 'G': - (void) va_arg (ap, double); - break; - case 's': - total_width += strlen (va_arg (ap, char *)); - break; - case 'p': - case 'n': - (void) va_arg (ap, char *); - break; - } - } - } -#ifdef TEST - global_total_width = total_width; -#endif - *result = malloc (total_width); - if (*result != NULL) - return vsprintf (*result, format, *args); - else - return 0; -} - -int -vasprintf (result, format, args) - char **result; - const char *format; - va_list args; -{ - return int_vasprintf (result, format, &args); -} - -#ifdef TEST -void -checkit -#ifdef __STDC__ - (const char* format, ...) -#else - (va_alist) - va_dcl -#endif -{ - va_list args; - char *result; - -#ifdef __STDC__ - va_start (args, format); -#else - char *format; - va_start (args); - format = va_arg (args, char *); -#endif - vasprintf (&result, format, args); - if (strlen (result) < global_total_width) - printf ("PASS: "); - else - printf ("FAIL: "); - printf ("%d %s\n", global_total_width, result); -} - -int -main () -{ - checkit ("%d", 0x12345678); - checkit ("%200d", 5); - checkit ("%.300d", 6); - checkit ("%100.150d", 7); - checkit ("%s", "jjjjjjjjjiiiiiiiiiiiiiiioooooooooooooooooppppppppppppaa\n\ -777777777777777777333333333333366666666666622222222222777777777777733333"); - checkit ("%f%s%d%s", 1.0, "foo", 77, "asdjffffffffffffffiiiiiiiiiiixxxxx"); -} -#endif /* TEST */ diff --git a/contrib/gdb/libiberty/vfork.c b/contrib/gdb/libiberty/vfork.c deleted file mode 100644 index 86c45919f660f..0000000000000 --- a/contrib/gdb/libiberty/vfork.c +++ /dev/null @@ -1,8 +0,0 @@ -/* Emulate vfork using just plain fork, for systems without a real vfork. - This function is in the public domain. */ - -int -vfork () -{ - return (fork ()); -} diff --git a/contrib/gdb/libiberty/vfprintf.c b/contrib/gdb/libiberty/vfprintf.c deleted file mode 100644 index ce3fdf9c47453..0000000000000 --- a/contrib/gdb/libiberty/vfprintf.c +++ /dev/null @@ -1,13 +0,0 @@ -#include <stdio.h> -#include <varargs.h> -#include <ansidecl.h> -#undef vfprintf - -int -vfprintf (file, format, ap) - FILE *file; - const char *format; - va_list ap; -{ - return _doprnt (format, ap, file); -} diff --git a/contrib/gdb/libiberty/vmsbuild.com b/contrib/gdb/libiberty/vmsbuild.com deleted file mode 100644 index e1c203f9f4722..0000000000000 --- a/contrib/gdb/libiberty/vmsbuild.com +++ /dev/null @@ -1,142 +0,0 @@ -$! libiberty/vmsbuild.com -- build liberty.olb for VMS host, VMS target -$! -$ CC = "gcc /noVerbose/Debug/Incl=([],[-.include])" -$ LIBR = "library /Obj" -$ LINK = "link" -$ DELETE= "delete /noConfirm" -$ SEARCH= "search /Exact" -$ ECHO = "write sys$output" -$ ABORT = "exit %x002C" -$! -$ LIB_NAME = "liberty.olb" !this is what we're going to construct -$ WORK_LIB = "new-lib.olb" !used to guard against an incomplete build -$ -$! manually copied from Makefile.in -$ REQUIRED_OFILES = "argv.o basename.o concat.o cplus-dem.o fdmatch.o "- - + "getopt.o getopt1.o getruntime.o hex.o "- - + "floatformat.o obstack.o spaces.o strerror.o strsignal.o "- - + "vasprintf.o xatexit.o xexit.o xmalloc.o xstrerror.o" -$! anything not caught by link+search of dummy.* should be added here -$ EXTRA_OFILES = "" -$! -$! move to the directory which contains this command procedure -$ old_dir = f$environ("DEFAULT") -$ new_dir = f$parse("_._;",f$environ("PROCEDURE")) - "_._;" -$ set default 'new_dir' -$ -$ ECHO "Starting libiberty build..." -$ create config.h -/* libiberty config.h for VMS */ -#define NEED_sys_siglist -#define NEED_psignal -#define NEED_basename -$ if f$search("alloca-conf.h").eqs."" then - - copy alloca-norm.h alloca-conf.h -$ LIBR 'WORK_LIB' /Create -$ -$! first pass: compile "required" modules -$ ofiles = REQUIRED_OFILES + " " + EXTRA_OFILES -$ gosub do_ofiles -$ -$! second pass: process dummy.c, using the first pass' results -$ ECHO " now checking run-time library for missing functionality" -$ if f$search("dummy.obj").nes."" then DELETE dummy.obj;* -$ define/noLog sys$error _NL: !can't use /User_Mode here due to gcc -$ define/noLog sys$output _NL: ! driver's use of multiple image activation -$ on error then continue -$ 'CC' dummy.c -$ deassign sys$error !restore, more or less -$ deassign sys$output -$ if f$search("dummy.obj").eqs."" then goto pass2_failure1 -$! link dummy.obj, capturing full linker feedback in dummy.map -$ oldmsg = f$environ("MESSAGE") -$ set message /Facility/Severity/Identification/Text -$ define/User sys$output _NL: -$ define/User sys$error _NL: -$ LINK/Map=dummy.map/noExe dummy.obj,'WORK_LIB'/Libr,- - gnu_cc:[000000]gcclib.olb/Libr,sys$library:vaxcrtl.olb/Libr -$ set message 'oldmsg' -$ if f$search("dummy.map").eqs."" then goto pass2_failure2 -$ DELETE dummy.obj;* -$ SEARCH dummy.map "%LINK-I-UDFSYM" /Output=dummy.list -$ DELETE dummy.map;* -$ ECHO " check completed" -$! we now have a file with one entry per line of unresolvable symbols -$ ofiles = "" -$ if f$trnlnm("IFILE$").nes."" then close/noLog ifile$ -$ open/Read ifile$ dummy.list -$iloop: read/End=idone ifile$ iline -$ iline = f$edit(iline,"COMPRESS,TRIM,LOWERCASE") -$ ofiles = ofiles + " " + f$element(1," ",iline) + ".o" -$ goto iloop -$idone: close ifile$ -$ DELETE dummy.list;* -$ -$! third pass: compile "missing" modules collected in pass 2 -$ gosub do_ofiles -$ -$! finish up -$ LIBR 'WORK_LIB' /Compress /Output='LIB_NAME' !new-lib.olb -> liberty.olb -$ DELETE 'WORK_LIB';* -$ -$! all done -$ ECHO "Completed libiberty build." -$ type sys$input: - - You many wish to do - $ COPY LIBERTY.OLB GNU_CC:[000000] - so that this run-time library resides in the same location as gcc's - support library. When building gas, be sure to leave the original - copy of liberty.olb here so that gas's build procedure can find it. - -$ set default 'old_dir' -$ exit -$ -$! -$! compile each element of the space-delimited list 'ofiles' -$! -$do_ofiles: -$ ofiles = f$edit(ofiles,"COMPRESS,TRIM") -$ i = 0 -$oloop: -$ f = f$element(i," ",ofiles) -$ if f.eqs." " then goto odone -$ f = f - ".o" !strip dummy suffix -$ ECHO " ''f'" -$ 'CC' 'f'.c -$ LIBR 'WORK_LIB' 'f'.obj /Insert -$ DELETE 'f'.obj;* -$ i = i + 1 -$ goto oloop -$odone: -$ return -$ -$! -$pass2_failure1: -$! if we reach here, dummy.c failed to compile and we're really stuck -$ type sys$input: - - Cannot compile the library contents checker (dummy.c + functions.def), - so cannot continue! - -$! attempt the compile again, without suppressing diagnostic messages this time -$ on error then ABORT +0*f$verify(v) -$ v = f$verify(1) -$ 'CC' dummy.c -$ ABORT +0*f$verify(v) !'f$verify(0)' -$! -$pass2_failure2: -$! should never reach here.. -$ type sys$input: - - Cannot link the library contents checker (dummy.obj), so cannot continue! - -$! attempt the link again, without suppressing diagnostic messages this time -$ on error then ABORT +0*f$verify(v) -$ v = f$verify(1) -$ LINK/Map=dummy.map/noExe dummy.obj,'WORK_LIB'/Libr,- - gnu_cc:[000000]gcclib.olb/Libr,sys$library:vaxcrtl.olb/Libr -$ ABORT +0*f$verify(v) !'f$verify(0)' -$ -$! not reached -$ exit diff --git a/contrib/gdb/libiberty/vprintf.c b/contrib/gdb/libiberty/vprintf.c deleted file mode 100644 index 63ac53c965ad6..0000000000000 --- a/contrib/gdb/libiberty/vprintf.c +++ /dev/null @@ -1,11 +0,0 @@ -#include <stdio.h> -#include <varargs.h> -#include <ansidecl.h> -#undef vprintf -int -vprintf (format, ap) - const char *format; - va_list ap; -{ - return vfprintf (stdout, format, ap); -} diff --git a/contrib/gdb/libiberty/vsprintf.c b/contrib/gdb/libiberty/vsprintf.c deleted file mode 100644 index bf0760cf6d38b..0000000000000 --- a/contrib/gdb/libiberty/vsprintf.c +++ /dev/null @@ -1,55 +0,0 @@ -/* Simple implementation of vsprintf for systems without it. - Highly system-dependent, but should work on most "traditional" - implementations of stdio; newer ones should already have vsprintf. - Written by Per Bothner of Cygnus Support. - Based on libg++'s "form" (written by Doug Lea; dl@rocky.oswego.edu). - Copyright (C) 1991, 1995 Free Software Foundation, Inc. - -This file is part of the libiberty library. This library 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 2, or (at your option) -any later version. - -This library 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 GNU CC; see the file COPYING. If not, write to -the Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - -As a special exception, if you link this library with files -compiled with a GNU compiler to produce an executable, this does not cause -the resulting executable to be covered by the GNU General Public License. -This exception does not however invalidate any other reasons why -the executable file might be covered by the GNU General Public License. */ - -#include <varargs.h> -#include <stdio.h> -#include <ansidecl.h> -#undef vsprintf - -int -vsprintf (buf, format, ap) - char *buf; - const char *format; - va_list ap; -{ - FILE b; - int ret; -#ifdef VMS - b->_flag = _IOWRT|_IOSTRG; - b->_ptr = buf; - b->_cnt = 12000; -#else - b._flag = _IOWRT|_IOSTRG; - b._ptr = buf; - b._cnt = 12000; -#endif - ret = _doprnt(format, ap, &b); - putc('\0', &b); - return ret; - -} diff --git a/contrib/gdb/libiberty/waitpid.c b/contrib/gdb/libiberty/waitpid.c deleted file mode 100644 index 23db0b932d2e2..0000000000000 --- a/contrib/gdb/libiberty/waitpid.c +++ /dev/null @@ -1,11 +0,0 @@ -int -waitpid (pid, stat_loc, options) - int pid, *stat_loc, options; -{ - for (;;) - { - int wpid = wait(stat_loc); - if (wpid == pid || wpid == -1) - return wpid; - } -} diff --git a/contrib/gdb/libiberty/xatexit.c b/contrib/gdb/libiberty/xatexit.c deleted file mode 100644 index 7dd27e143f815..0000000000000 --- a/contrib/gdb/libiberty/xatexit.c +++ /dev/null @@ -1,82 +0,0 @@ -/* - * Copyright (c) 1990 Regents of the University of California. - * All rights reserved. - * - * %sccs.include.redist.c% - */ - -/* Adapted from newlib/libc/stdlib/{,at}exit.[ch]. - If you use xatexit, you must call xexit instead of exit. */ - -#include "ansidecl.h" -#include "libiberty.h" - -#include <stdio.h> - -#ifdef __STDC__ -#include <stddef.h> -#else -#define size_t unsigned long -#endif - -/* For systems with larger pointers than ints, this must be declared. */ -PTR malloc PARAMS ((size_t)); - -static void xatexit_cleanup PARAMS ((void)); - -/* Pointer to function run by xexit. */ -extern void (*_xexit_cleanup) (); - -#define XATEXIT_SIZE 32 - -struct xatexit { - struct xatexit *next; /* next in list */ - int ind; /* next index in this table */ - void (*fns[XATEXIT_SIZE]) PARAMS ((void)); /* the table itself */ -}; - -/* Allocate one struct statically to guarantee that we can register - at least a few handlers. */ -static struct xatexit xatexit_first; - -/* Points to head of LIFO stack. */ -static struct xatexit *xatexit_head = &xatexit_first; - -/* Register function FN to be run by xexit. - Return 0 if successful, -1 if not. */ - -int -xatexit (fn) - void (*fn) PARAMS ((void)); -{ - register struct xatexit *p; - - /* Tell xexit to call xatexit_cleanup. */ - if (!_xexit_cleanup) - _xexit_cleanup = xatexit_cleanup; - - p = xatexit_head; - if (p->ind >= XATEXIT_SIZE) - { - if ((p = (struct xatexit *) malloc (sizeof *p)) == NULL) - return -1; - p->ind = 0; - p->next = xatexit_head; - xatexit_head = p; - } - p->fns[p->ind++] = fn; - return 0; -} - -/* Call any cleanup functions. */ - -static void -xatexit_cleanup () -{ - register struct xatexit *p; - register int n; - - for (p = xatexit_head; p; p = p->next) - for (n = p->ind; --n >= 0;) - (*p->fns[n]) (); -} diff --git a/contrib/gdb/libiberty/xexit.c b/contrib/gdb/libiberty/xexit.c deleted file mode 100644 index 98baeca475d92..0000000000000 --- a/contrib/gdb/libiberty/xexit.c +++ /dev/null @@ -1,36 +0,0 @@ -/* xexit.c -- Run any exit handlers, then exit. - Copyright (C) 1994 Free Software Foundation, Inc. - -This file is part of the libiberty library. -Libiberty is free software; you can redistribute it and/or -modify it under the terms of the GNU Library General Public -License as published by the Free Software Foundation; either -version 2 of the License, or (at your option) any later version. - -Libiberty 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 -Library General Public License for more details. - -You should have received a copy of the GNU Library General Public -License along with libiberty; see the file COPYING.LIB. If -not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, -Boston, MA 02111-1307, USA. */ - -#include "ansidecl.h" -#include "libiberty.h" - -#include <stdio.h> - -/* This variable is set by xatexit if it is called. This way, xmalloc - doesn't drag xatexit into the link. */ -void (*_xexit_cleanup) (); - -void -xexit (code) - int code; -{ - if (_xexit_cleanup != NULL) - (*_xexit_cleanup) (); - exit (code); -} diff --git a/contrib/gdb/libiberty/xmalloc.c b/contrib/gdb/libiberty/xmalloc.c deleted file mode 100644 index 95967abe3004f..0000000000000 --- a/contrib/gdb/libiberty/xmalloc.c +++ /dev/null @@ -1,106 +0,0 @@ -/* memory allocation routines with error checking. - Copyright 1989, 90, 91, 92, 93, 94 Free Software Foundation, Inc. - -This file is part of the libiberty library. -Libiberty is free software; you can redistribute it and/or -modify it under the terms of the GNU Library General Public -License as published by the Free Software Foundation; either -version 2 of the License, or (at your option) any later version. - -Libiberty 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 -Library General Public License for more details. - -You should have received a copy of the GNU Library General Public -License along with libiberty; see the file COPYING.LIB. If -not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, -Boston, MA 02111-1307, USA. */ - -#include "ansidecl.h" -#include "libiberty.h" - -#include <stdio.h> - -#ifdef __STDC__ -#include <stddef.h> -#else -#define size_t unsigned long -#endif - -/* For systems with larger pointers than ints, these must be declared. */ -PTR malloc PARAMS ((size_t)); -PTR realloc PARAMS ((PTR, size_t)); - -/* The program name if set. */ -static const char *name = ""; - -/* The initial sbrk, set when the program name is set. */ -static char *first_break = NULL; - -void -xmalloc_set_program_name (s) - const char *s; -{ - name = s; - if (first_break == NULL) - first_break = (char *) sbrk (0); -} - -PTR -xmalloc (size) - size_t size; -{ - PTR newmem; - - if (size == 0) - size = 1; - newmem = malloc (size); - if (!newmem) - { - extern char **environ; - size_t allocated; - - if (first_break != NULL) - allocated = (char *) sbrk (0) - first_break; - else - allocated = (char *) sbrk (0) - (char *) &environ; - fprintf (stderr, - "\n%s%sCan not allocate %lu bytes after allocating %lu bytes\n", - name, *name ? ": " : "", - (unsigned long) size, (unsigned long) allocated); - xexit (1); - } - return (newmem); -} - -PTR -xrealloc (oldmem, size) - PTR oldmem; - size_t size; -{ - PTR newmem; - - if (size == 0) - size = 1; - if (!oldmem) - newmem = malloc (size); - else - newmem = realloc (oldmem, size); - if (!newmem) - { - extern char **environ; - size_t allocated; - - if (first_break != NULL) - allocated = (char *) sbrk (0) - first_break; - else - allocated = (char *) sbrk (0) - (char *) &environ; - fprintf (stderr, - "\n%s%sCan not reallocate %lu bytes after allocating %lu bytes\n", - name, *name ? ": " : "", - (unsigned long) size, (unsigned long) allocated); - xexit (1); - } - return (newmem); -} diff --git a/contrib/gdb/libiberty/xstrdup.c b/contrib/gdb/libiberty/xstrdup.c deleted file mode 100644 index 9d08bc704055d..0000000000000 --- a/contrib/gdb/libiberty/xstrdup.c +++ /dev/null @@ -1,17 +0,0 @@ -/* xstrdup.c -- Duplicate a string in memory, using xmalloc. - This trivial function is in the public domain. - Ian Lance Taylor, Cygnus Support, December 1995. */ - -#include "ansidecl.h" -#include "libiberty.h" - -char * -xstrdup (s) - const char *s; -{ - char *ret; - - ret = xmalloc (strlen (s) + 1); - strcpy (ret, s); - return ret; -} diff --git a/contrib/gdb/libiberty/xstrerror.c b/contrib/gdb/libiberty/xstrerror.c deleted file mode 100644 index d05369ac9725f..0000000000000 --- a/contrib/gdb/libiberty/xstrerror.c +++ /dev/null @@ -1,54 +0,0 @@ -/* xstrerror.c -- jacket routine for more robust strerror() usage. - Fri Jun 16 18:30:00 1995 Pat Rankin <rankin@eql.caltech.edu> - This code is in the public domain. */ - -#include "libiberty.h" -#include "config.h" - -#ifdef VMS -#include <errno.h> -#if !defined (__STRICT_ANSI__) && !defined (__HIDE_FORBIDDEN_NAMES) -extern char *strerror PARAMS ((int,...)); -#define DONT_DECLARE_STRERROR -#endif -#endif /* VMS */ - -#ifndef DONT_DECLARE_STRERROR -extern char *strerror PARAMS ((int)); -#endif - -/* If strerror returns NULL, we'll format the number into a static buffer. */ - -#define ERRSTR_FMT "undocumented error #%d" -static char xstrerror_buf[sizeof ERRSTR_FMT + 20]; - -/* Like strerror, but result is never a null pointer. */ - -char * -xstrerror (errnum) - int errnum; -{ - char *errstr; -#ifdef VMS - char *(*vmslib_strerror) PARAMS ((int,...)); - - /* Override any possibly-conflicting declaration from system header. */ - vmslib_strerror = (char *(*) PARAMS ((int,...))) strerror; - /* Second argument matters iff first is EVMSERR, but it's simpler to - pass it unconditionally. `vaxc$errno' is declared in <errno.h> - and maintained by the run-time library in parallel to `errno'. - We assume that `errnum' corresponds to the last value assigned to - errno by the run-time library, hence vaxc$errno will be relevant. */ - errstr = (*vmslib_strerror) (errnum, vaxc$errno); -#else - errstr = strerror (errnum); -#endif - - /* If `errnum' is out of range, result might be NULL. We'll fix that. */ - if (!errstr) - { - sprintf (xstrerror_buf, ERRSTR_FMT, errnum); - errstr = xstrerror_buf; - } - return errstr; -} diff --git a/contrib/gdb/opcodes/ChangeLog b/contrib/gdb/opcodes/ChangeLog deleted file mode 100644 index 589c1a234ac76..0000000000000 --- a/contrib/gdb/opcodes/ChangeLog +++ /dev/null @@ -1,1772 +0,0 @@ -Sun Apr 7 15:06:17 1996 Fred Fish <fnf@cygnus.com> - - From: Miles Bader <miles@gnu.ai.mit.edu> - * configure.in: Use AC_CHECK_TOOL to find AR & RANLIB. - * configure: Regenerate with autoconf. - -Sat Mar 16 13:04:07 1996 Fred Fish <fnf@cygnus.com> - - * z8kgen.c (internal, gas): Call xmalloc rather than unchecked - malloc. - -Tue Mar 12 12:14:10 1996 Ian Lance Taylor <ian@cygnus.com> - - * configure: Rebuild with autoconf 2.8. - -Thu Mar 7 15:11:10 1996 Doug Evans <dje@charmed.cygnus.com> - - * sparc-dis.c (print_insn_sparc): Handle 'O' operand char like 'r'. - * sparc-opc.c (sparc_opcodes): Use 'O' operand char for `neg reg'. - -Tue Mar 5 15:51:57 1996 Ian Lance Taylor <ian@cygnus.com> - - * configure.in: Don't set SHLIB or SHLINK to an empty string, - since they appear as targets in Makefile.in. - * configure: Rebuild. - -Mon Feb 26 13:03:40 1996 Stan Shebs <shebs@andros.cygnus.com> - - * mpw-make.sed: Edit out shared library support bits. - -Tue Feb 20 20:48:28 1996 Doug Evans <dje@charmed.cygnus.com> - - * sparc-opc.c (v8,v6notv9): Add MASK_SPARCLET. - (sparc_opcode_archs): Add MASK_V8 to sparclet entry. - (sparc_opcodes): Add sparclet insns. - (sparclet_cpreg_table): New static local. - (sparc_{encode,decode}_sparclet_cpreg): New functions. - * sparc-dis.c (print_insn_sparc): Handle sparclet cpregs. - -Tue Feb 20 11:02:44 1996 Alan Modra <alan@mullet.Levels.UniSA.Edu.Au> - - * i386-dis.c (index16): New static variable. - (putop): Print jecxz for 32 bit case, jcxz for 16 bit, not the - other way around. - (OP_indirE): Return result of OP_E. - (OP_E): Check for 16 bit addressing mode, and disassemble - correctly. Optimised 32 bit case a little. Don't print - "(base,index,scale)" when sib specifies only an offset. - -Mon Feb 19 12:32:17 1996 Ian Lance Taylor <ian@cygnus.com> - - * configure.in: Set and substitute SHLIB_DEP. - * configure: Rebuild. - * Makefile.in (SHLIB_DEP): New variable. - (LIBIBERTY_LISTS, BFD_LIST): New variables. - (stamp-piclist): Depend upon LIBIBERTY_LISTS and BFD_LIST. If - COMMON_SHLIB, add them to piclist with appropriate modifications. - ($(SHLIB)): Depend upon $(SHLIB_DEP). Don't check COMMON_SHLIB - here: just use piclist. - -Mon Feb 19 02:03:50 1996 Doug Evans <dje@charmed.cygnus.com> - - * sparc-dis.c (MASK_V9,V9_ONLY_P,V9_P): Define. - (print_insn_sparc): Rewrite v9/not-v9 tests. - (compare_opcodes): Likewise. - * sparc-opc.c (MASK_<ARCH>): Define. - (v6,v7,v8,sparclite,v9,v9a): Redefine. - (sparclet,v6notv9): Define. - (sparc_opcode_archs): Delete member `conflicts'. Add `supported'. - (sparc_opcodes): Delete F_NOTV9, use v6notv9 instead. - -Thu Feb 15 14:45:05 1996 Ian Lance Taylor <ian@cygnus.com> - - * configure.in: Call AC_PROG_CC before configure.host. - * configure: Rebuild. - - * Makefile.in (SONAME): Remove leading ../bfd/ from $(SHLIB). - -Wed Feb 14 19:01:27 1996 Alan Modra <alan@spri.levels.unisa.edu.au> - - * i386-dis.c (onebyte_has_modrm): New static array. - (twobyte_has_modrm): New static array. - (print_insn_i386): Only fetch the mod/reg/rm byte if it is needed. - -Tue Feb 13 15:15:01 1996 Ian Lance Taylor <ian@cygnus.com> - - * Makefile.in ($(SHLINK)): Check ts against $(SHLIB), not - $(SHLINK). - -Mon Feb 12 16:26:06 1996 Michael Meissner <meissner@tiktok.cygnus.com> - - * ppc-opc.c (PPC): Undef, so default defination on Windows NT - doesn't conflict. - -Wed Feb 7 13:59:54 1996 Ian Lance Taylor <ian@cygnus.com> - - * m68k-opc.c (m68k_opcodes): The bkpt instruction is supported on - m68010up, not just m68020up | cpu32. - - * Makefile.in (SONAME): New variable. - ($(SHLINK)): Make a link to the transformed name, as well. - (stamp-tshlink): New target. - (install): Skip stamp-tshlink during install. - -Tue Feb 6 12:28:54 1996 Ian Lance Taylor <ian@cygnus.com> - - * configure.in: Call AC_ARG_PROGRAM. - * configure: Rebuild. - * Makefile.in (program_transform_name): New variable. - (install): Transform library name before installing it. - -Mon Feb 5 16:14:42 1996 Ian Lance Taylor <ian@cygnus.com> - - * i960-dis.c (mem): Add HX dcinva instruction. - - Support for building as a shared library, based on patches from - Alan Modra <alan@spri.levels.unisa.edu.au>: - * configure.in: Add AC_ARG_ENABLE for shared and commonbfdlib. - New substitutions: ALLLIBS, PICFLAG, SHLIB, SHLIB_CC, - SHLIB_CFLAGS, COMMON_SHLIB, SHLINK. - * configure: Rebuild. - * Makefile.in (ALLLIBS): New variable. - (PICFLAG, SHLIB, SHLIB_CC, SHLIB_CFLAGS): New variables. - (COMMON_SHLIB, SHLINK): New variables. - (.c.o): If PICFLAG is set, compile twice, once PIC, once normal. - (STAGESTUFF): Remove variable. - (all): Depend upon $(ALLLIBS) rather than $(TARGETLIB). - (stamp-piclist, piclist): New targets. - ($(SHLIB), $(SHLINK)): New targets. - ($(OFILES)): Depend upon stamp-picdir. - (disassemble.o): Build twice if PICFLAG is set. - (MOSTLYCLEAN): Add pic/*.o. - (clean): Remove $(SHLIB), $(SHLINK), piclist, and stamp-piclist. - (distclean): Remove pic and stamp-picdir. - (install): Install shared libraries. - (stamp-picdir): New target. - -Fri Feb 2 17:15:25 1996 Doug Evans <dje@charmed.cygnus.com> - - * sparc-dis.c (print_insn_sparc): Delete DISASM_RAW_INSN support. - Print unknown instruction as "unknown", rather than in hex. - -Tue Jan 30 14:06:08 1996 Ian Lance Taylor <ian@cygnus.com> - - * dis-buf.c: Include "sysdep.h" before "dis-asm.h". - -Thu Jan 25 20:24:07 1996 Doug Evans <dje@charmed.cygnus.com> - - * sparc-opc.c (sparc_opcode_archs): Mark v8/sparclite as conflicting. - -Thu Jan 25 11:56:49 1996 Ian Lance Taylor <ian@cygnus.com> - - * i386-dis.c (print_insn_i386): Only fetch the mod/reg/rm byte - when necessary. From Ulrich Drepper - <drepper@myware.rz.uni-karlsruhe.de>. - -Thu Jan 25 03:39:10 1996 Doug Evans <dje@charmed.cygnus.com> - - * sparc-dis.c (print_insn_sparc): NUMOPCODES replaced with - sparc_num_opcodes. Update architecture enum values. - * sparc-opc.c (sparc_opcode_archs): Replaces architecture_pname. - (sparc_opcode_lookup_arch): New function. - (sparc_num_opcodes): Renamed from bfd_sparc_num_opcodes. - (sparc_opcodes): Add v9a shutdown insn. - -Mon Jan 22 08:29:59 1996 Doug Evans <dje@charmed.cygnus.com> - - * sparc-dis.c (print_insn_sparc): Renamed from print_insn. - If DISASM_RAW_INSN, print insn in hex. Handle v9a as opcode - architecture. - (print_insn_sparc64): Deleted. - * disassemble.c (disassembler, case bfd_arch_sparc): Always use - print_insn_sparc. - - * sparc-opc.c (architecture_pname): Add v9a. - -Fri Jan 12 14:35:58 1996 David Mosberger-Tang <davidm@AZStarNet.com> - - * alpha-opc.h (alpha_insn_set): VAX floating point opcode was - incorrectly defined as 0x16 when it should be 0x15. - (FLOAT_FORMAT_MASK): function code is 11 bits, not just 7 bits! - (alpha_insn_set): added cvtst and cvttq float ops. Also added - excb (exception barrier) which is defined in the Alpha - Architecture Handbook version 2. - * alpha-dis.c (print_insn_alpha): Fixed special-case decoding for - OPERATE_FORMAT_CODE type instructions. The bug caused mulq to be - disassembled as or, for example. - -Wed Jan 10 12:37:22 1996 Ian Lance Taylor <ian@cygnus.com> - - * mips-dis.c (print_insn_arg): Print cases 'i' and 'u' in hex. - (_print_insn_mips): Change i from int to unsigned int. - -Thu Jan 4 17:21:10 1996 David Edelsohn <edelsohn@mhpcc.edu> - - * ppc-opc.c (powerpc_opcodes): tlbi POWER opcode form different - from tlbie PowerPC opcode. Add PPC603 tlbld and tlbli. - -Thu Dec 28 13:29:19 1995 John Hassey <hassey@rtp.dg.com> - - * i386-dis.c: Added Pentium Pro instructions. - -Tue Dec 19 22:56:35 1995 Michael Meissner <meissner@tiktok.cygnus.com> - - * ppc-opc.c (fsqrt{,.}): Duplicate for PowerPC in addition to - being for Power2. - -Fri Dec 15 14:14:15 1995 J.T. Conklin <jtc@rtl.cygnus.com> - - * sh-opc.h (sh_nibble_type): Added REG_B. - (sh_arg_type): Added A_REG_B. - (sh_table): Added pref and bank reg versions of ldc, ldc.l, stc - and stc.l opcodes. - * sh-dis.c (print_insn_shx): Added cases for REG_B and A_REG_B. - -Fri Dec 15 16:44:31 1995 Ian Lance Taylor <ian@cygnus.com> - - * disassemble.c (disassembler): Use new bfd_big_endian macro. - -Tue Dec 12 12:22:24 1995 Ian Lance Taylor <ian@cygnus.com> - - * Makefile.in (distclean): Remove stamp-h. From Ronald - F. Guilmette <rfg@monkeys.com>. - -Tue Dec 5 13:42:44 1995 Stan Shebs <shebs@andros.cygnus.com> - - From David Mosberger-Tang <davidm@azstarnet.com>: - * alpha-dis.c (print_insn_alpha): fixed decoding of cpys - instruction. - -Mon Dec 4 12:29:05 1995 J.T. Conklin <jtc@rtl.cygnus.com> - - * sh-opc.h (sh_arg_type): Added A_SSR and A_SPC. - (sh_table): Added many SH3 opcodes. - * sh-dis.c (print_insn_shx): Added cases for A_SSR and A_SPC. - -Fri Dec 1 07:42:18 1995 Michael Meissner <meissner@tiktok.cygnus.com> - - * ppc-opc.c (subfc., subfco): Mark this PPCCOM, not PPC. - (subco,subco.): Mark this PPC, not PPCCOM. - -Mon Nov 27 13:09:52 1995 Ian Lance Taylor <ian@cygnus.com> - - * configure: Rebuild with autoconf 2.7. - -Tue Nov 21 18:28:06 1995 Ian Lance Taylor <ian@cygnus.com> - - * configure: Rebuild with autoconf 2.6. - -Wed Nov 15 19:02:53 1995 Ken Raeburn <raeburn@cygnus.com> - - * configure.in: Sort list of architectures. Accept but do nothing - for alliant, convex, pyramid, romp, and tahoe. - -Wed Nov 8 20:18:59 1995 Ian Lance Taylor <ian@cygnus.com> - - * a29k-dis.c (print_special): Change num to unsigned int. - -Wed Nov 8 20:10:35 1995 Eric Freudenthal <freudenthal@nyu.edu> - - * a29k-dis.c (print_insn): Cast insn24 to unsigned long when - shifting it. - -Tue Nov 7 15:21:06 1995 Ian Lance Taylor <ian@cygnus.com> - - * configure.in: Call AC_CHECK_PROG to find and cache AR. - * configure: Rebuilt. - -Mon Nov 6 17:39:47 1995 Harry Dolan <dolan@ssd.intel.com> - - * configure.in: Add case for bfd_i860_arch. - * configure: Rebuild. - -Fri Nov 3 12:45:31 1995 Ian Lance Taylor <ian@cygnus.com> - - * m68k-opc.c (m68k_opcodes): Correct fmoveml operands. - * m68k-dis.c (NEXTSINGLE): Change i to unsigned int. - (NEXTDOUBLE): Likewise. - (print_insn_m68k): Don't match fmoveml if there is more than one - register in the list. - (print_insn_arg): Handle a place of '8' for a type of 'L'. - -Thu Nov 2 23:06:33 1995 Ian Lance Taylor <ian@cygnus.com> - - * m68k-opc.c: Use #W rather than #w. - * m68k-dis.c (print_insn_arg): Handle new 'W' place. - -Wed Nov 1 13:30:24 1995 Ian Lance Taylor <ian@cygnus.com> - - * m68k-opc.c (m68k_opcode_aliases): Add dbfw as an alias for dbf, - and likewise for all the dbxx opcodes. - -Mon Oct 30 20:50:40 1995 Fred Fish <fnf@cygnus.com> - - * arc-dis.c: Include elf-bfd.h rather than libelf.h. - -Mon Oct 23 11:11:34 1995 James G. Smith <jsmith@pasanda.cygnus.co.uk> - - * mips-opc.c: Added shorthand (V1) for INSN_4100 manifest. Added - the VR4100 specific instructions to the mips_opcodes structure. - -Thu Oct 19 11:05:23 1995 Stan Shebs <shebs@andros.cygnus.com> - - * mpw-config.in, mpw-make.sed: Remove ugly workaround for - ugly Metrowerks bug in CW6, is fixed in CW7. - -Mon Oct 16 12:59:01 1995 Michael Meissner <meissner@tiktok.cygnus.com> - - * ppc-opc.c (whole file): Add flags for common/any support. - -Tue Oct 10 11:06:07 1995 Fred Fish <fnf@cygnus.com> - - * Makefile.in (BISON): Remove macro. - (FLAGS_TO_PASS): Remove BISON. - -Fri Oct 6 16:26:45 1995 Ken Raeburn <raeburn@cygnus.com> - - Mon Sep 25 22:49:32 1995 Andreas Schwab <schwab@issan.informatik.uni-dortmund.de> - - * m68k-dis.c (print_insn_m68k): Recognize all two-word - instructions that take no args by looking at the match mask. - (print_insn_arg): Always print "%" before register names. - [case 'c']: Use "nc" for the no-cache case, as recognized by gas. - [case '_']: Don't print "@#" before address. - [case 'J']: Use "%s" as format string, not register name. - [case 'B']: Treat place == 'C' like 'l' and 'L'. - -Thu Oct 5 22:16:20 1995 Ken Raeburn <raeburn@cygnus.com> - - * i386-dis.c: Describe cmpxchg8b operand, and spell the opcode - name correctly. - -Tue Oct 3 08:30:20 1995 steve chamberlain <sac@slash.cygnus.com> - - From David Mosberger-Tang <davidm@azstarnet.com> - - * alpha-opc.h (MEMORY_FUNCTION_FORMAT_MASK): added. - (alpha_insn_set): added definitions for VAX floating point - instructions (Unix compilers don't generate these, but handcoded - assembly might still use them). - - * alpha-dis.c (print_insn_alpha): added support for disassembling - the miscellaneous instructions in the Alpha instruction set. - -Tue Sep 26 18:47:20 1995 Stan Shebs <shebs@andros.cygnus.com> - - * mpw-config.in: Add m68k-opc.c.o to BFD_MACHINES for m68k, - no longer create sysdep.h, sed ppc-opc.c to work around a - serious Metrowerks C bug. - * mpw-make.in: Remove. - * mpw-make.sed: New file, used by mpw-configure to edit - Makefile.in into an MPW makefile. - -Wed Sep 20 12:55:28 1995 Ian Lance Taylor <ian@cygnus.com> - - * Makefile.in (maintainer-clean): New synonym for realclean. - -Tue Sep 19 15:28:36 1995 Ian Lance Taylor <ian@cygnus.com> - - * m68k-opc.c: Split pmove patterns which use 'P' into patterns - which use '0', '1', and '2' instead. Specify the proper size for - a pmove immediate operand. Correct the pmovefd patterns to be - moves to a register, not from a register. - * m68k-dis.c (print_insn_arg): Replace 'P' with '0', '1', '2'. - -Thu Sep 14 11:58:22 1995 Doug Evans <dje@canuck.cygnus.com> - - * sparc-opc.c (sparc_opcodes): Mark all insns that reference - %psr, %wim, %tbr as F_NOTV9. - -Fri Sep 8 01:07:38 1995 Ian Lance Taylor <ian@cygnus.com> - - * Makefile.in (Makefile): Just rebuild Makefile when running - config.status. - (config.h, stamp-h): New targets. - * configure.in: Call AC_CONFIG_HEADER and AC_CANONICAL_SYSTEM - earlier. Don't bother to call AC_ARG_PROGRAM. Touch stamp-h when - rebuilding config.h. - * configure: Rebuild. - - * mips-opc.c: Change unaligned loads and stores with "t,A" - operands to use "t,A(b)". - -Thu Sep 7 19:02:46 1995 Jim Wilson <wilson@chestnut.cygnus.com> - - * sh-dis.c (print_insn_shx): Add F_FR0 support. - -Thu Sep 7 19:02:46 1995 Jim Wilson <wilson@chestnut.cygnus.com> - - * sh-dis.c (print_insn_shx): Change loop over op->arg[n] to iterate - until 3 instead of until 2. - -Wed Sep 6 21:21:33 1995 Ian Lance Taylor <ian@cygnus.com> - - * Makefile.in (ALL_CFLAGS): Define. - (.c.o, disassemble.o): Use $(ALL_CFLAGS). - (MOSTLYCLEAN): Add config.log. - (distclean): Don't remove config.log. - * configure.in: Substitute HDEFINES. - * configure: Rebuild. - -Wed Sep 6 15:08:09 1995 Jim Wilson <wilson@chestnut.cygnus.com> - - * sh-opc.h (sh_arg_type): Add F_FR0. - (sh_table, case fmac): Add F_FR0 as first argument. - -Wed Sep 6 15:08:09 1995 Jim Wilson <wilson@chestnut.cygnus.com> - - * sh-opc.h (sh_opcode_info): Increase arg array size to 4. - -Tue Sep 5 18:28:10 1995 Doug Evans <dje@canuck.cygnus.com> - - * sparc-dis.c: Remove all references to NO_V9. - -Tue Sep 5 20:03:26 1995 Ian Lance Taylor <ian@cygnus.com> - - * aclocal.m4: Just include ../bfd/aclocal.m4. - * configure: Rebuild. - -Tue Sep 5 16:09:59 1995 Doug Evans <dje@canuck.cygnus.com> - - * sparc-dis.c (X_DISP19): Define. - (print_insn, case 'G'): Use it. - (print_insn, case 'L'): Sign extend displacement. - -Mon Sep 4 14:28:46 1995 Ian Lance Taylor <ian@cygnus.com> - - * configure.in: Run ../bfd/configure.host before AC_PROG_CC. - Subsitute CFLAGS and AR. Call AC_PROG_INSTALL. Don't substitute - host_makefile_frag or frags. - * aclocal.m4: New file. - * configure: Rebuild. - * Makefile.in (INSTALL): Set to @INSTALL@. - (INSTALL_PROGRAM): Set to @INSTALL_PROGRAM@. - (INSTALL_DATA): Set to @INSTALL_DATA@. - (AR): Set to @AR@. - (AR_FLAGS): Set to rc rather than qc. - (CC): Define as @CC@. - (CFLAGS): Set to @CFLAGS@. - (@host_makefile_frag@): Remove. - (config.status): Remove dependency upon @frags@. - - * configure.in: ../bfd/config.bfd now just sets shell variables. - Use them rather than looking through target Makefile fragments. - * configure: Rebuild. - -Thu Aug 31 12:35:32 1995 Jim Wilson <wilson@chestnut.cygnus.com> - - * sh-opc.h (ftrc): Change FPUL_N to FPUL_M. - -Wed Aug 30 13:52:28 1995 Doug Evans <dje@canuck.cygnus.com> - - * sparc-opc.c (sparc_opcodes): Delete duplicate wr %y insn. - Add clrx, iprefetch, signx, clruw, cas, casl, casx, casxl synthetic - sparc64 insns. - - * sparc-opc.c (sparc_opcodes): Fix prefetcha insn. - (lookup_{name,value}): New functions. - (prefetch_table): New static local. - (sparc_{encode,decode}_prefetch): New functions. - * sparc-dis.c (print_insn): Handle '*' arg (prefetch function). - -Wed Aug 30 11:11:58 1995 Jim Wilson <wilson@chestnut.cygnus.com> - - * sh-opc.h: Add blank lines to improve readabililty of sh3e - instructions. - -Wed Aug 30 11:09:38 1995 Jim Wilson <wilson@chestnut.cygnus.com> - - * sh-dis.c: Correct comment on first line of file. - -Tue Aug 29 15:37:18 1995 Doug Evans <dje@canuck.cygnus.com> - - * disassemble.c (disassembler): Handle bfd_mach_sparc64. - - * sparc-opc.c (asi, membar): New static locals. - (sparc_{encode,decode}_{asi,membar}): New functions. - (sparc_opcodes, membar insn): Fix. - * sparc-dis.c (print_insn): Call sparc_decode_asi. - Support decoding of membar masks. - (X_MEMBAR): Define. - -Sat Aug 26 21:22:48 1995 Ian Lance Taylor <ian@cygnus.com> - - * m68k-opc.c (m68k_opcode_aliases): Add br, brs, brb, brw, brl. - -Mon Aug 21 17:33:36 1995 Ian Lance Taylor <ian@cygnus.com> - - * m68k-opc.c (m68k_opcode_aliases): Add bhib as an alias for bhis, - and likewise for the other branches. Add bhs as an alias for bcc, - and likewise for the size variants. Add dbhs as an alias for - dbcc. - -Fri Aug 11 13:40:24 1995 Jeff Law (law@snake.cs.utah.edu) - - * sh-opc.h (FP sts instructions): Update to match reality. - -Mon Aug 7 16:12:58 1995 Ian Lance Taylor <ian@cygnus.com> - - * m68k-dis.c: (fpcr_names): Add % before all register names. - (reg_names): Likewise. - (print_insn_arg): Don't explicitly print % before register names. - Add % before register names in static array names. In case 'r', - print data registers as `@(Dn)', not `Dn@'. When printing a - memory address, don't print @# before it. - (print_indexed): Change base_disp and outer_disp from int to - bfd_vma. Print using MIT syntax, not mutant invalid Motorola - syntax. Sign extend 8 byte displacement correctly. - (print_base): Print using MIT syntax. Print zpc when appropriate. - Change parameter disp from int to bfd_vma. - - * m68k-opc.c (m68k_opcode_aliases): Add jsrl and jsrs as aliases - for jsr. - -Mon Aug 7 02:21:40 1995 Jeff Law (law@snake.cs.utah.edu) - - * sh-dis.c (print_insn_shx): Handle new operand types F_REG_N, - F_REG_M, FPSCR_M, FPSCR_N, FPUL_M and FPUL_N. - * sh-opc.h (sh_arg_type): Add new operand types. - (sh_table): Add new opcodes from SH3E Floating Point ISA. - -Sat Aug 5 16:50:14 1995 Fred Fish <fnf@cygnus.com> - - * Makefile.in (distclean): Remove generated file config.h. - -Sat Aug 5 16:50:14 1995 Fred Fish <fnf@cygnus.com> - - * Makefile.in (distclean): Remove generated file config.h. - -Wed Aug 2 18:33:40 1995 Ian Lance Taylor <ian@cygnus.com> - - * m68k-opc.c: New file, holding tables from include/opcode/m68k.h. - Clean up tables. - * m68k-dis.c: Remove BREAK_UP_BIG_DECL stuff. - (opcode): Remove. - (print_insn_m68k): Change d to be const. Use m68k_numopcodes - rather than numopcodes. Use m68k_opcodes rather than removed - opcode function. Don't check F_ALIAS. - (print_insn_arg): Change first parameter to be const char *. - * Makefile.in (ALL_MACHINES): Add m68k-opc.o. - (m68k-opc.o): New target. - * configure.in: Build m68k-opc.o for bfd_m68k_arch. - * configure: Rebuild. - -Wed Aug 2 08:23:38 1995 Doug Evans <dje@canuck.cygnus.com> - - * sparc-dis.c (HASH_SIZE, HASH_INSN): Define. - (opcode_bits, opcode_hash_table): New variables. - (opcodes_initialized): Renamed from opcodes_sorted. - (build_hash_table): New function. - (is_delayed_branch): Use hash table. - (print_insn): Renamed from print_insn_sparc, made static. - Build and use hash table. If !sparc64, ignore sparc64 insns, - and vice-versa if sparc64. - (print_insn_sparc, print_insn_sparc64): New functions. - (compare_opcodes): Move sparc64 opcodes to end. - Print commutative insns with constant second. - * sparc-opc.c (all non-v9 insns): Use flag F_NOTV9 instead of F_ALIAS. - -Tue Aug 1 00:12:49 1995 Ian Lance Taylor <ian@cygnus.com> - - * sh-dis.c (print_insn_shx): Remove unused local dslot. Use - print_address_func for A_BDISP12 and A_BDISP8. Correct test which - avoids printing a delay slot in a delay slot. - * sh-opc.h (sh_table): Fully bracket last entry. - -Mon Jul 31 12:04:47 1995 Doug Evans <dje@canuck.cygnus.com> - - * sparc-opc.c (sllx, srax, srlx): Fix disassembly. - -Wed Jul 12 00:59:34 1995 Ken Raeburn <raeburn@kr-pc.cygnus.com> - - * configure.in: Get host_makefile_frag from ${srcdir}. - - * configure.in: Autoconfiscated. Check for string[s].h. Create - config.h from config.in. Don't set up sysdep.h link. - * sysdep.h: New file. - * configure, config.in: New files, generated from configure.in. - * Makefile.in: Updated to be processed autoconf-style. - (distclean): Keep sysdep.h. Remove config.log and config.cache. - (Makefile): Depend on config.status. - (config.status): New rule. - * configure.bat: Update Makefile substitutions. - -Tue Jul 11 14:23:37 1995 Jeff Spiegel <jeffs@lsil.com> - - * mips-opc.c (L1): Define. - (mips_opcodes): Add R4010 instructions: flushi, flushd, flushid, - addciu, madd, maddu, ffc, ffs, msub, msubu, selsi, selsr, waiti, - and wb. - -Tue Jul 11 11:49:49 1995 Ian Lance Taylor <ian@cygnus.com> - - * mips-opc.c (mips_opcodes): For the move pseudo-op, prefer daddu - if ISA 3 and addu otherwise, replacing or, since some MIPS chips - have multiple add units but only a single logical unit. - - * ppc-opc.c (powerpc_operands): Change CR to use a bitsize of 3, - shifted by 18, without any insertion or extraction function. - (insert_cr, extract_cr): Remove. - -Wed Jun 21 20:05:39 1995 Ken Raeburn <raeburn@cujo.cygnus.com> - - * m68k-dis.c (print_insn_arg, print_indexed): Print "%" before - register names. - -Thu Jun 15 17:23:31 1995 Stan Shebs <shebs@andros.cygnus.com> - - * mpw-config.in: Add sh and i386 configs, remove sparc config. - * sh-opc.h: Add copyright. - -Mon Jun 5 03:30:43 1995 Ken Raeburn <raeburn@kr-laptop.cygnus.com> - - * Makefile.in (crunch-m68k): Delete extra target accidentally - checked in a while ago. - -Wed May 24 16:22:13 1995 Jim Wilson <wilson@chestnut.cygnus.com> - - * sh-opc.h (sh_table): Add SH3 support. - -Wed May 24 14:16:08 1995 Steve Chamberlain <sac@slash.cygnus.com> - - * sh-opc.h: Added bsrf and braf. - -Wed May 10 14:28:16 1995 Richard Earnshaw (rearnsha@armltd.co.uk) - - * arm-opc.h (arm_opcodes): Add 64-bit multiply patterns. Delete - bogus [ls]fm{ea,fd} patterns. - - * arm-opc.h (arm_opcodes): Correct typos in stm, ldm, std, and ldc. - * arm-dis.c (print_insn_arm): Make GIVEN a parameter, don't try and - initialize it from memory. Make function static. - (print_insn_{big,little}_arm): New functions. - * disassemble.c (disassembler, case bfd_arch_arm): Disassemble for - the correct endianness. - - -Mon Apr 24 14:18:05 1995 Jason Molenda (crash@phydeaux.cygnus.com> - - * sh-opc.h (sh_nibble_type, sh_arg_type): remove trailing , from - enum list. - -Wed Apr 19 14:07:03 1995 Michael Meissner <meissner@tiktok.cygnus.com> - - * m68k-dis.c (opcode): Finish change made by Kung Hsu on April - 17th, so that it builds again using GCC as the compiler. - -Tue Apr 18 12:14:51 1995 Ken Raeburn <raeburn@cujo.cygnus.com> - - * mips-dis.c (print_insn_little_mips): Cast return value from - bfd_getl32 from bfd_vma to unsigned long, because _print_insn_mips - expects an unsigned long, and that might be fewer words of - argument storage (e.g., if bfd_vma is long long on a 32-bit - machine). - (print_insn_big_mips): Likewise with bfd_getb32 value. - (_print_insn_mips): Now static. - -Mon Apr 17 12:23:28 1995 Kung Hsu <kung@rtl.cygnus.com> - - * m68k-dis.c: Take out #define BREAK_UP_BIG_DECL kludge, because - gcc memory hog problem with initializer is fixed. - - -Mon Apr 10 15:55:01 1995 Stan Shebs <shebs@andros.cygnus.com> - - Merge in support for Mac MPW as a host. - (Old change descriptions retained for informational value.) - - * mpw-config.in (archname): Compute from the config. - (BFD_MACHINES, ARCHDEFS): Put into mk.tmp. - - * mpw-config.in (target_arch): Compute from canonical target. - (m68k, mips, powerpc, sparc): Add architectures. - * mpw-make.in (disassemble.c.o): Add. - (ALL_CFLAGS): Remove special flags (-mc68020 -mc68881 -model far). - - * mpw-config.in (BFD_MACHINES): Set to a default value. - * mpw-make.in (BFD_MACHINES): Remove wired-in value. - - * mpw-make.in (CSEARCH): Add extra-include to search path. - - * mpw-config.in (varargs.h): Don't create. - (sysdep.h): Create using forward-include. - * mpw-make.in (CSEARCH): Add include/mpw to search path. - - * mpw-config.in: New file, MPW version of configure.in. - * mpw-make.in: New file, MPW version of Makefile.in. - - -Fri Mar 31 14:23:38 1995 Ken Raeburn <raeburn@cujo.cygnus.com> - - * alpha-dis.c (print_insn_alpha): Put empty statement after - default label. - -Tue Mar 21 10:51:40 1995 Jeff Law (law@snake.cs.utah.edu) - - * hppa-dis.c (sign_extend): Delete, redundant with libhppa.h version. - (low_sign_extend): Likewise. - (get_field): Delete unused function. - (set_field, deposit_14, deposit_21): Likewise. - -Fri Mar 17 15:55:53 1995 J.T. Conklin <jtc@rtl.cygnus.com> - - * i386-dis.c: Support for more pentium opcodes. From Guy Harris - (guy@netapp.com). - -Tue Mar 14 00:52:57 1995 Ken Raeburn (raeburn@kr-pc.cygnus.com) - - Sat Feb 11 17:22:41 1995 Klaus Kaempf (kkaempf@didymus.rmi.de) - - * alpha-opc.h (OSF_ASMCODE): define - print pal-code names as defined in App C of the - Alpha Architecture Reference Manual - - * alpha-dis.c: cleaned up output - print stylized code forms as defined in App A.4.3 of the - Alpha Architecture Reference Manual - -Wed Mar 8 15:21:14 1995 Ian Lance Taylor <ian@cygnus.com> - - * mips-opc.c: Add new mips4 instructions. Don't set INSN_RFE for - `rfe'. - * mips-dis.c (print_insn_arg): Handle new argument types 'h', 'R', - 'N', and 'M'. - -Wed Mar 8 02:54:05 1995 Ken Raeburn <raeburn@cujo.cygnus.com> - - * m68k-dis.c (opcode): New function. Returns address of opcode - table entry given index, even if the opcode table was split to - work around gcc bugs. - (print_insn_m68k): Call opcode instead of referencing m68k_opcodes - directly. - (BREAK_UP_BIG_DECL): Make secondary array static and const. - (reg_names): Now const. - (print_insn_arg): Arrays cacheFieldName and names now const. - (print_indexed): Array scales now const. - - -Tue Mar 7 16:41:21 1995 Ian Lance Taylor <ian@cygnus.com> - - * ppc-opc.c: Sort recently added instructions by minor opcode - number within major opcode number. - -Mon Mar 6 10:04:36 1995 Jeff Law (law@snake.cs.utah.edu) - - * hppa-dis.c: Include libhppa.h. - -Fri Feb 24 19:15:36 1995 Ian Lance Taylor <ian@cygnus.com> - - * mips-opc.c: Change dli to use M_DLI, and add dla. - -Mon Feb 20 23:54:38 1995 Peter Schauer (pes@regent.e-technik.tu-muenchen.de) - - * Makefile.in (ALL_MACHINES): Add w65-dis.o. - - -Thu Feb 16 17:34:41 1995 Ian Lance Taylor <ian@cygnus.com> - - * mips-opc.c: Add r4650 mul instruction. - -Wed Feb 15 15:45:20 1995 Ian Lance Taylor <ian@cygnus.com> - - * mips-opc.c: Add uld and usd macros for unaligned double load and - store. - -Tue Feb 14 13:17:37 1995 Michael Meissner <meissner@tiktok.cygnus.com> - - * ppc-opc.c (powerpc_opcodes): Add 403GA opcodes rfci, dccci, - mfdcr, mtdcr, icbt, iccci. - - -Thu Feb 9 12:28:13 1995 Stan Shebs <shebs@andros.cygnus.com> - - * i960-dis.c (struct tabent, struct sparse_tabent): Change the - signed char fields to shorts, more portable. - -Wed Feb 8 17:29:29 1995 Stan Shebs <shebs@andros.cygnus.com> - - * i960-dis.c (struct tabent, struct sparse_tabent): Declare the - char fields as signed chars, since they may have negative values. - -Mon Feb 6 10:52:06 1995 J.T. Conklin <jtc@rtl.cygnus.com> - - * i386-dis.c (dis386_twobyte): Add cpuid, From Charles Hannum - (mycroft@netbsd.org). - -Mon Jan 30 12:38:00 1995 Ian Lance Taylor <ian@cygnus.com> - - From "Logg, Ed" <elogg@ea.com>: - * ppc-opc.c (extract_bdm): Correct parenthezisation. - * ppc-dis.c (print_insn_powerpc): Print .long before unrecognized - value. - -Thu Jan 26 18:32:08 1995 Ian Lance Taylor <ian@cygnus.com> - - * ppc-opc.c: Changes based on patch from David Edelsohn - <edelsohn@mhpcc.edu>. - (powerpc_operands): Add operands SPRBAT and SPRG. Split TBR out of - SPR. - (FXM_MASK): Define. - (insert_tbr): New static function. - (extract_tbr): New static function. - (XFXFXM_MASK, XFXM): Define. - (XSPRBAT_MASK, XSPRG_MASK): Define. - (powerpc_opcodes): Add instructions to access special registers by - name. Add mtcr and mftbu. - -Tue Jan 17 10:56:43 1995 Ian Lance Taylor <ian@sanguine.cygnus.com> - - * mips-opc.c (P3): Define. - (mips_opcodes): Add mad and madu. - -Sun Jan 15 16:32:59 1995 Steve Chamberlain <sac@splat> - - * configure.in: Add W65 support. - * disassemble.c: Likewise. - * w65-opc.h, w65-dis.c: New files. - -Wed Dec 28 22:15:33 1994 Steve Chamberlain (sac@jonny.cygnus.com) - - * h8300-dis.c (bfd_h8_disassemble): Add support for 2 bit - immediates. - - -Tue Dec 20 11:25:12 1994 Ian Lance Taylor <ian@sanguine.cygnus.com> - - * mips-opc.c: Add dli as a synonym for li. - - -Thu Dec 8 18:23:31 1994 Ken Raeburn <raeburn@cujo.cygnus.com> - - * alpha-dis.c (print_insn_alpha): Handle call_pal instruction, and - print something for reserved opcode values, even if it won't - assemble again. - - * mips-dis.c (_print_insn_mips): When initializing, shift right - and mask, to avoid sign extension problems on the Alpha. - - * m68k-dis.c (print_insn_arg, case 'J'): Handle buscr and pcr - control registers. - - -Wed Nov 23 22:34:51 1994 Steve Chamberlain (sac@jonny.cygnus.com) - - * sh-opc.h (mov.l gbr): Get direction right. - * sh-dis.c (print_insn_shx): New function. - (print_insn_shl, print_insn_sh): Call print_insn_shx to - print opcodes with right byte order. - -Thu Nov 3 19:32:22 1994 Ken Raeburn <raeburn@cujo.cygnus.com> - - * ns32k-dis.c (struct ns32k_option): Renamed from struct option, - to avoid conflicts with getopt. - -Mon Oct 31 18:48:10 1994 Ian Lance Taylor <ian@sanguine.cygnus.com> - - * hppa-dis.c (print_insn_hppa): Read the instruction using - bfd_getb32, so that it works on a little endian or 64 bit host. - Remove unused local variable op. - -Tue Oct 25 17:07:57 1994 Ian Lance Taylor <ian@sanguine.cygnus.com> - - * mips-opc.c: Use or instead of addu for pseudo-op move, since - addu does not work correctly if -mips3. - -Wed Oct 19 13:40:16 1994 Ian Lance Taylor <ian@sanguine.cygnus.com> - - * a29k-dis.c (print_special): Add special register names defined - on 29030, 29040 and 29050. - (print_insn): Handle new operand type 'I'. - -Wed Oct 12 11:59:55 1994 Ian Lance Taylor <ian@sanguine.cygnus.com> - - * Makefile.in (INSTALL): Use top level install.sh script. - -Wed Oct 5 19:16:29 1994 Ian Lance Taylor <ian@sanguine.cygnus.com> - - * sparc-dis.c: Rewrite to use bitfields, rather than a union, so - that it works on a little endian host. - -Tue Oct 4 12:14:21 1994 Ian Lance Taylor <ian@sanguine.cygnus.com> - - * configure.in: Use ${config_shell} when running config.bfd. - -Wed Sep 21 18:49:12 1994 Ian Lance Taylor (ian@sanguine.cygnus.com) - - * mips-opc.c (mips_opcodes): "dabs" is only available with -mips3. - -Thu Sep 15 16:30:22 1994 Ian Lance Taylor (ian@sanguine.cygnus.com) - - * a29k-dis.c (print_insn): Print the opcode. - -Wed Sep 14 17:52:14 1994 Ian Lance Taylor (ian@sanguine.cygnus.com) - - * mips-opc.c (mips_opcodes): Set WR_t for sc and scd. - -Sun Sep 11 22:32:17 1994 Jeff Law (law@snake.cs.utah.edu) - - * hppa-dis.c (reg_names): Use r26-r23 for arg0-arg3. - -Tue Sep 6 11:37:12 1994 Ian Lance Taylor (ian@sanguine.cygnus.com) - - * mips-opc.c: Set INSN_STORE_MEMORY flag for all instructions - which store a value into memory. - -Sun Sep 04 17:58:10 1994 Richard Earnshaw (rwe@pegasus.esprit.ec.org) - - * configure.in, Makefile.in, disassemble.c: Add support for the ARM. - * arm-dis.c, arm-opc.h: New files. - -Fri Aug 5 14:00:05 1994 Stan Shebs (shebs@andros.cygnus.com) - - * Makefile.in (ns32k-dis.o): Add dependency. - * ns32k-dis.c (print_insn_arg): Declare initialized local as - string, not as array of chars. - -Thu Jul 28 18:14:16 1994 Ken Raeburn (raeburn@cujo.cygnus.com) - - * sparc-dis.c (print_insn_sparc): Handle new operand type 'x'. - - * sparc-opc.c: Added sparclite extended FP operations, and - versions of v9 impdep* instructions permitting specification of - the OPF field. - -Tue Jul 26 16:36:03 1994 Ken Raeburn (raeburn@cujo.cygnus.com) - - * i960-dis.c (reg_names): Now const. - (struct sparse_tabent): New type, copied from array type in mem - function. - (ctrl): Local static array ctrl_tab now const. - (cobr): Local static array cobr_tab now const. - (mem): Local variables reg1, reg2, reg3 now point to const. Local - static variable mem_tab no longer explicitly initialized. Changed - mem_init to const array of struct sparse_tabent. - (reg): Local static variable reg_tab no longer explicitly - initialized. Changed reg_init to const array of struct - sparse_tabent. - (ea): Local static array scale_tab now const. - - * i960-dis.c (reg): Added i960JX instructions to reg_init table. - (REG_MAX): Updated. - -Tue Jul 19 21:00:00 1994 DJ Delorie (dj@ctron.com) - - * configure.bat: the disassember needs to be enabled for - "objdump -d" to work in djgpp. - -Wed Jul 13 18:01:58 1994 Ken Raeburn (raeburn@cujo.cygnus.com) - - * ns32k-dis.c: Deleted all code in "#ifdef GDB". - (invalid_float): Enabled general version, doesn't require running - on ns32k host. Changed to take char* argument, and test for - explicitly specified sizes, instead of using sizeof() on host CPU - types. - (INVALID_FLOAT): Cast first argument. - (opt_u, opt_U, opt_O, opt_C, opt_S, list_P532, list_M532, - list_P032, list_M032): Now const. - (optlist, list_search): Made appropriate arguments now point to - const. - (print_insn_arg): Changed static array of one-character-string - pointers into a static const array of characters; fixed sprintf - statement accordingly. - -Sun Jul 10 00:27:47 1994 Ian Dall (dall@hfrd.dsto.gov.au) - - * opcodes/ns32k-dis.c: Semi-new file. Had apparently been dropped - from distribution. A ns32k-dis.c from a previous distribution has - been brought up to date and supports the new interface. - - * disassemble.c: define ARCH_ns32k and add case bfd_arch_ns32k. - - * configure.in: add bfd_ns32k_arch target support. - - * Makefile.in: add ns32k-dis.o to ALL_MACHINES. - Add ns32k-dis.c to CFILES. Add dependencies for ns32k-dis.o. - -Wed Jun 29 22:10:37 1994 Steve Chamberlain (sac@cygnus.com) - - * h8300-dis.c (bfd_h8_disassemble): Get 16bit branch - disassembly right. - -Tue Jun 28 13:22:06 1994 Stan Shebs (shebs@andros.cygnus.com) - - * h8300-dis.c, mips-dis.c: Don't use true and false. - -Thu Jun 23 12:53:19 1994 David J. Mackenzie (djm@rtl.cygnus.com) - - * configure.in: Change --with-targets to --enable-targets. - -Wed Jun 22 13:38:32 1994 Ian Lance Taylor (ian@sanguine.cygnus.com) - - * mips-dis.c (_print_insn_mips): Build a static hash table mapping - opcodes to the first instruction with that opcode, to speed - disassembly of large files. From ralphc@pyramid.com (Ralph - Campbell). - -Tue Jun 7 12:49:44 1994 Ian Lance Taylor (ian@tweedledumb.cygnus.com) - - * Makefile.in (mostlyclean): Fix typo (was mostyclean). - -Wed May 11 22:32:00 1994 DJ Delorie (dj@ctron.com) - - * configure.bat: update to latest makefile.in - -Sat May 7 17:13:21 1994 Steve Chamberlain (sac@cygnus.com) - - * a29k-dis.c (print_insn): Print 'x' type operand in hex. - * h8300-dis.c (bfd_h8_disassemble): Print 16bit rels correctly. - * sh-dis.c (print_insn_sh): Don't recur endlessly if delay - slot insn is in a delay slot. - * z8k-opc.h: (resflg): Fix patterns. - * h8500-opc.h Fix CR insn patterns. - -Fri May 6 14:34:46 1994 Ian Lance Taylor (ian@tweedledumb.cygnus.com) - - * ppc-opc.c (powerpc_opcodes): Put PowerPC versions of "cmp" and - "cmpl" before POWER versions, so that gas -many uses them. - -Thu Apr 28 18:32:36 1994 Ken Raeburn (raeburn@cujo.cygnus.com) - - * disassemble.c: New file. - * Makefile.in (OFILES): Add disassemble.o. - (disassemble.o): Provide dependencies; compile with $(ARCHDEFS). - * configure.in: Define ARCHDEFS in Makefile. Code taken from - binutils/configure.in. - - * m68k-dis.c (print_insn_m68k): If F_ALIAS flag is set, skip the - opcode being examined. - -Thu Apr 21 17:08:40 1994 Ian Lance Taylor (ian@tweedledumb.cygnus.com) - - * ppc-opc.c (powerpc_operands): Added RAL, RAM and RAS. - (insert_ral, insert_ram, insert_ras): New functions. - (powerpc_opcodes): Use RAL for load with update, RAM for lmw, and - RAS for store with update. - -Sat Apr 16 23:41:44 1994 Ian Lance Taylor (ian@tweedledumb.cygnus.com) - - * ppc-opc.c (powerpc_opcodes): Correct fcir. From David Edelsohn - (edelsohn@npac.syr.edu). - -Wed Apr 6 17:11:45 1994 Ian Lance Taylor (ian@tweedledumb.cygnus.com) - - * mips-opc.c (mips_opcodes): Correct operands of "nor" with an - immediate argument. - -Mon Apr 4 16:30:46 1994 Doug Evans (dje@canuck.cygnus.com) - - * sparc-opc.c (sparc_opcodes): Fix "rd %fprs,%l0". - -Mon Apr 4 13:22:00 1994 Ian Lance Taylor (ian@tweedledumb.cygnus.com) - - * ppc-opc.c (powerpc_operands): The signedp field has been - removed, so don't initialize it. Set the PPC_OPERAND_SIGNED flag - instead. Add new operand SISIGNOPT. - (powerpc_opcodes): For lis, liu, addis, and cau use SISIGNOPT. - Based on patch from David Edelsohn (edelsohn@npac.syr.edu). - * ppc-dis.c (print_insn_powerpc): Check PPC_OPERAND_SIGNED rather - than signedp field. - -Wed Mar 30 00:31:49 1994 Peter Schauer (pes@regent.e-technik.tu-muenchen.de) - - * i386-dis.c (struct private): Renamed to dis_private. `private' - is a reserved word for dynix cc. - -Mon Mar 28 13:00:15 1994 Ian Lance Taylor (ian@tweedledumb.cygnus.com) - - * configure.in: Change error message to refer to bfd/config.bfd - rather than bfd/configure.in. - -Mon Mar 28 12:28:30 1994 David Edelsohn (edelsohn@npac.syr.edu) - - * ppc-opc.c: Define POWER2 as short alias flag. - (powerpc_opcodes): Add POWER/2 opcodes lfq*, stfq*, fcir[z], and - fsqrt. - -Wed Mar 23 12:23:05 1994 Ian Lance Taylor (ian@tweedledumb.cygnus.com) - - * i960-dis.c (print_insn_i960): Don't read a second word for - opcodes 0, 1, 2 and 3. - -Wed Mar 16 15:37:58 1994 Ian Lance Taylor (ian@tweedledumb.cygnus.com) - - * configure.in: Don't build m68881-ext.o for bfd_m68k_arch. - -Mon Mar 14 14:53:50 1994 Ian Lance Taylor (ian@tweedledumb.cygnus.com) - - * m68881-ext.c: Removed; no longer used. - * Makefile.in: Changed accordingly. - - * m68k-dis.c (ext_format_68881): Don't declare. - (print_insn_m68k): If an instruction uses place 'i', it uses at - least four fixed bytes. - (print_insn_arg): Don't bump p by 2 for case 'I', place 'i'. For - extended float, convert to double using floatformat_to_double, not - ieee_extended_to_double, and fetch the data before converting it. - -Tue Mar 8 18:12:25 1994 Ian Lance Taylor (ian@tweedledumb.cygnus.com) - - * mips-opc.c: It's sqrt.s, not sqrt.w. From - davidj@ICSI.Berkeley.EDU (David Johnson). - -Tue Feb 8 16:55:27 1994 Ian Lance Taylor (ian@tweedledumb.cygnus.com) - - * ppc-opc.c (powerpc_opcodes): The POWER uses bdn[l][a] where the - PowerPC uses bdnz[l][a]. - -Tue Feb 8 00:32:28 1994 Peter Schauer (pes@regent.e-technik.tu-muenchen.de) - - * dis-buf.c, i386-dis.c: Include sysdep.h. - -Mon Feb 7 19:22:23 1994 Ian Lance Taylor (ian@tweedledumb.cygnus.com) - - * configure.in (bfd_powerpc_arch): Use ppc-dis.o and ppc-opc.o. - - * ppc-opc.c (powerpc_opcodes): Mark POWER instructions supported - by Motorola PowerPC 601 with PPC_OPCODE_601. - * ppc-dis.c (print_insn_big_powerpc, print_insn_little_powerpc): - Disassemble Motorola PowerPC 601 instructions as well as normal - PowerPC instructions. - -Sun Feb 6 07:45:17 1994 Jim Kingdon (kingdon@lioth.cygnus.com) - - * i960-dis.c (reg, mem): Just use a static array instead of - calling xmalloc. - -Sat Feb 5 00:04:02 1994 Jeffrey A. Law (law@snake.cs.utah.edu) - - * hppa-dis.c (print_insn_hppa): For '?' and '@' only adjust the - condition name index if this is for a negated condition. - - * hppa-dis.c (print_insn_hppa): No space before 'H' operand. - Floating point format for 'H' operand is backwards from normal - case (0 == double, 1 == single). For '4', '6', '7', '9', and '8' - operands (fmpyadd and fmpysub), handle bizarre register - translation correctly for single precision format. - - * hppa-dis.c (print_insn_hppa): Do not emit a space after 'F' - or 'I' operands if the next format specifier is 'M' (fcmp - condition completer). - -Feb 4 23:38:03 1994 Ian Lance Taylor (ian@tweedledumb.cygnus.com) - - * ppc-opc.c (powerpc_operands): New operand type MBE to handle a - single number giving a bitmask for the MB and ME fields of an M - form instruction. Change NB to accept 32, and turn it into 0; - also turn 0 into 32 when disassembling. Seperated SH from NB. - (insert_mbe, extract_mbe): New functions. - (insert_nb, extract_nb): New functions. - (SC_MASK): Mask out SA and LK bits. - (powerpc_opcodes): Change "cal" to use RT, D, RA rather than RT, - RA, SI. Change "liu" and "cau" to use UI rather than SI. Mark - "bctr" and "bctrl" as accepted by POWER. Change "rlwimi", - "rlimi", "rlwimi.", "rlimi.", "rlwinm", "rlinm", "rlwinm.", - "rlinm.", "rlmi", "rlmi.", "rlwnm", "rlnm", "rlwnm.", "rlnm." to - use MBE rather than MB. Add "mfmq" and "mtmq" POWER instructions. - (powerpc_macros): Define table of macro definitions. - (powerpc_num_macros): Define. - - * ppc-dis.c (print_insn_powerpc): Don't skip optional operands - if PPC_OPERAND_NEXT is set. - -Sat Jan 22 23:10:07 1994 Ian Lance Taylor (ian@tweedledumb.cygnus.com) - - * i960-dis.c (print_insn_i960): Make buffer bfd_byte instead of - char. Retrieve contents using bfd_getl32 instead of shifting. - -Fri Jan 21 19:01:39 1994 Ian Lance Taylor (ian@tweedledumb.cygnus.com) - - * ppc-opc.c: New file. Opcode table for PowerPC, including - opcodes for POWER (RS/6000). - * ppc-dis.c: New file. PowerPC and Power (RS/6000) disassembler. - * Makefile.in (ALL_MACHINES): Add ppc-dis.o and ppc-opc.o. - (CFILES): Add ppc-dis.c. - (ppc-dis.o, ppc-opc.o): New targets. - * configure.in: Build ppc-dis.o and ppc-opc.o for bfd_rs6000_arch. - -Mon Jan 17 20:05:49 1994 Jeffrey A. Law (law@snake.cs.utah.edu) - - * hppa-dis.c (print_insn_hppa): Handle 'N' in assembler template. - No space before 'u', 'f', or 'N'. - -Sun Jan 16 14:20:16 1994 Jim Kingdon (kingdon@deneb.cygnus.com) - - * i386-dis.c (print_insn_i386): Add FIXME comment regarding reading - farther than we should. - - * i386-dis.c (dis386): Use Yb and Yv for scasb and scasS. - -Thu Jan 6 12:38:05 1994 David J. Mackenzie (djm@thepub.cygnus.com) - - * sparc-dis.c m68k-dis.c alpha-dis.c a29k-dis.c: Fix comments. - -Wed Jan 5 11:56:21 1994 David J. Mackenzie (djm@thepub.cygnus.com) - - * i960-dis.c (print_insn_i960): Only read word2 if the instruction - needs it, to prevent reading past the end of a section. - -Wed Nov 17 17:20:12 1993 Ian Lance Taylor (ian@tweedledumb.cygnus.com) - - * mips-opc.h: Use macro for j instruction, to support SVR4 PIC. - Removed t,A case for la; always use t,A(b) case. - -Mon Nov 8 12:37:36 1993 Ian Lance Taylor (ian@tweedledumb.cygnus.com) - - From Ted Lemen <mellon@pepper.ncd.com> - * mips-dis.c (print_insn_arg): Handle 'k'. - * mips-opc.c: Make cache use k, not t. - -Sun Nov 7 23:52:34 1993 Peter Schauer (pes@regent.e-technik.tu-muenchen.de) - - * alpha-opc.h, alpha-dis.c (print_insn_alpha): Add - FLOAT_MEMORY_FORMAT_CODE, FLOAT_BRANCH_FORMAT_CODE, correct - FLOAT_FORMAT_CODE to put out floating point register names. - -Mon Nov 1 18:17:51 1993 Ian Lance Taylor (ian@tweedledumb.cygnus.com) - - * mips-opc.c: Use macros for jal variants, to support SVR4 PIC. - -Thu Oct 28 17:42:23 1993 Ian Lance Taylor (ian@tweedledumb.cygnus.com) - - * a29k-dis.c (print_insn): Use 0x%08x, not 0x%8x. - -Wed Oct 27 11:48:01 1993 Ian Lance Taylor (ian@tweedledumb.cygnus.com) - - * mips-opc.c (dsll, dsra, dsrl): Added '>' cases for shift counts - larger than 32. Moved dsxx32 variants first for disassembler. - -Mon Oct 25 11:33:14 1993 Steve Chamberlain (sac@phydeaux.cygnus.com) - - * z8kgen.c, z8k-opc.h: Add full lda information. - -Tue Oct 19 12:39:25 1993 Jeffrey A Law (law@cs.utah.edu) - - * hppa-dis.c (print_insn_hppa): Do not emit a space after - movb instructions. Any necessary space will be emitted by - the code to handle nullification completers. - -Wed Oct 13 16:19:07 1993 Ian Lance Taylor (ian@tweedledumb.cygnus.com) - - * mips-opc.c: Moved l.d down so that it disassembles as ldc1. - -Fri Oct 8 02:34:21 1993 Peter Schauer (pes@regent.e-technik.tu-muenchen.de) - - * alpha-opc.h: Add ldl_l, fix typo for ldq_u. - * alpha-dis.c (print_insn_alpha): Add code for PAL_FORMAT_CODE. - -Tue Oct 5 17:47:53 1993 Ian Lance Taylor (ian@tweedledumb.cygnus.com) - - * mips-opc.c: Correct lwu opcode value (book had it wrong). - -Thu Sep 30 11:26:18 1993 Steve Chamberlain (sac@phydeaux.cygnus.com) - - * z8k-dis.c (FETCH_DATA): get just the right amount of data. - (unpack_instr): Cope with ARG_IMM4M1 type instructions. - -Wed Sep 29 16:24:49 1993 K. Richard Pixley (rich@sendai.cygnus.com) - - * m88k-dis.c (m88kdis): comment change. Remove space after - printing mnemonic. - (printop): handle new arg types DEC and XREG for m88110. - -Tue Sep 28 19:20:16 1993 Jeffrey A Law (law@snake.cs.utah.edu) - - * hppa-dis.c (print_insn_hppa): Handle 'z' operand - type for absolute branch addresses. Delete special - "ble" and "be" code in 'W' operand code. - -Fri Sep 24 14:08:33 1993 Ian Lance Taylor (ian@tweedledumb.cygnus.com) - - * mips-opc.c: Set hazard information correctly for branch - likely instructions. - -Fri Sep 17 04:41:17 1993 Peter Schauer (pes@regent.e-technik.tu-muenchen.de) - - * alpha-dis.c (print_insn_alpha), alpha-opc.h: Fix bugs, use - info->fprintf_func for printing and info->print_address_func for - address output. - -Wed Sep 15 12:12:07 1993 Ian Lance Taylor (ian@tweedledumb.cygnus.com) - - * mips-opc.c: Set INSN_TRAP for tXX instructions. - -Thu Sep 9 10:11:27 1993 Ian Lance Taylor (ian@tweedledumb.cygnus.com) - - * mips-opc.c: From davidj@ICSI.Berkeley.EDU (David Johnson): - Corrected second case of "b" for disassembler. - -Tue Sep 7 14:25:15 1993 Ian Lance Taylor (ian@tweedledumb.cygnus.com) - - * mips-dis.c, m88k-dis.c: Don't include libbfd.h. Changed calls - to BFD swapping routines to correspond to BFD name changes. - -Thu Sep 2 10:35:25 1993 Ian Lance Taylor (ian@tweedledumb.cygnus.com) - - * mips-opc.c: Change div machine instruction to be z,s,t rather - than s,t. Change div macro to be d,v,t rather than d,s,t. - Likewise for divu, ddiv, ddivu. Added z,s,t case for drem, dremu, - rem and remu which generates only the corresponding div - instruction. This is for compatibility with the MIPS assembler, - which only generates the simple machine instruction when an - explicit destination of $0 is used. - * mips-dis.c (print_insn_arg): Handle 'z' (always register zero). - -Thu Aug 26 17:41:44 1993 Ian Lance Taylor (ian@tweedledumb.cygnus.com) - - * mips-opc.c: From davidj@ICSI.Berkeley.EDU (David Johnson): Set - WR_31 hazard for bal, bgezal, bltzal. - -Thu Aug 26 17:20:02 1993 Jim Kingdon (kingdon@lioth.cygnus.com) - - * hppa-dis.c (print_insn_hppa): Use print function - from within the disassemble_info, not fprintf_filtered. - -Wed Aug 25 13:51:40 1993 Ken Raeburn (raeburn@cambridge.cygnus.com) - - * hppa-dis.c (print_insn_hppa): Handle '|' like '>'. (From Jeff - Law, law@cs.utah.edu.) - -Mon Aug 23 12:44:05 1993 Ian Lance Taylor (ian@tweedledumb.cygnus.com) - - * mips-opc.c ("absu"): Removed. - ("dabs"): Added. - -Fri Aug 20 10:52:52 1993 Ian Lance Taylor (ian@tweedledumb.cygnus.com) - - * mips-opc.c: Added r6000 and r4000 instructions and macros. - Changed hazard information to distinguish between memory load - delays and coprocessor load delays. - -Wed Aug 18 15:39:23 1993 Ian Lance Taylor (ian@tweedledumb.cygnus.com) - - * mips-opc.c: li.d uses "T,L", not "S,F". Added li.s. - -Tue Aug 17 09:44:42 1993 David J. Mackenzie (djm@thepub.cygnus.com) - - * configure.in: Don't pass cpu to config.bfd. - -Tue Aug 17 12:23:52 1993 Ian Lance Taylor (ian@tweedledumb.cygnus.com) - - * m88k-dis.c (m88kdis): Make class unsigned. - -Thu Aug 12 15:08:18 1993 Ian Lance Taylor (ian@cygnus.com) - - * alpha-dis.c (print_insn_alpha): One branch format case was - missing the instruction name. - -Wed Aug 11 19:29:39 1993 David J. Mackenzie (djm@thepub.cygnus.com) - - * Makefile.in (ALL_MACHINES): Renamed from DIS_LIBS. - Add the arch-specific auxiliary files. - (OFILES): Remove the arch-specific auxiliary files - and use BFD_MACHINES instead of DIS_LIBS. - * configure.in: Set BFD_MACHINES based on --with-targets option. - -Thu Aug 12 12:04:53 1993 Ian Lance Taylor (ian@tweedledumb.cygnus.com) - - * mips-opc.c: Added lwc1 E,A(b) to go with lwc1 T,A(b). Similarly - for swc1. - -Sun Aug 8 15:09:30 1993 Jim Kingdon (kingdon@lioth.cygnus.com) - - * sparc-opc.c: Change CONST to const to deal with gcc - -Dconst=__const -traditional. - -Fri Aug 6 10:58:55 1993 Ian Lance Taylor (ian@tweedledumb.cygnus.com) - - * mips-opc.c: From davidj@ICSI.Berkeley.EDU (David Johnson): Took - coprocessor instructions out of #if 0, and made them use new - argument type "C". - -Thu Aug 5 17:11:06 1993 Jim Kingdon (kingdon@lioth.cygnus.com) - - * sparc-dis.c: Include ansidecl.h before opcodes/sparc.h. - -Fri Jul 30 18:48:15 1993 John Gilmore (gnu@cygnus.com) - - * sparc-opc.c: Add F_JSR, F_UNBR, or F_CONDBR flags to each branch - instruction, for use by the disassembler. - - * sparc-dis.c (SEX): Add sign extension macro. Replace many - hand-coded sign extensions that depended on 32-bit host ints. - FIXME, we still depend on big-endian host bitfield ordering. - (sparc_print_insn): Set the insn_info_valid field, and the - other fields that describe the instruction being printed. - -Tue Jul 27 17:04:58 1993 Jim Wilson (wilson@sphagnum.cygnus.com) - - * sparc-opc.c (call): Accept all 6 addressing modes valid for - `jmp' instead of just one of them. - -Wed Jul 21 11:43:32 1993 Jim Kingdon (kingdon@deneb.cygnus.com) - - * hppa-dis.c: Move floating registers from reg_names to fp_reg_names. - (fput_fp_reg_r): Renamed from fput_reg_r. - (fput_fp_reg): New function. - (print_insn_hppa): Use fput_fp_reg{,_r} where appropriate. - - * hppa-dis.c (print_insn_hppa, cases 'a', 'd'): Print space afterwards. - - * hppa-dis.c (print_insn_hppa, case 'd'): Use GET_COND not GET_FIELD. - -Mon Jul 19 13:52:21 1993 Jim Kingdon (kingdon@deneb.cygnus.com) - - * hppa-dis.c (print_insn_hppa): Use extract_5r_store for 'r'. - - * hppa-dis.c (print_insn_hppa, case '>'): If next character is 'n', - don't output a space. - - * hppa-dis.c (float_format_names): 10 is undefined, and 11 is quad. - -Sun Jul 18 16:30:02 1993 Jim Kingdon (kingdon@rtl.cygnus.com) - - * mips-opc.c: New file, containing opcode table from - ../include/opcode/mips.h. - * Makefile.in: Add it. - -Thu Jul 15 12:37:05 1993 Ian Lance Taylor (ian@tweedledumb.cygnus.com) - - * m88k-dis.c: New file, moved in from gdb and changed to use the - new dis-asm.h disassembler interface. - * Makefile.in (DIS_LIBS): Added m88k-dis.o. - (m88k-dis.o): New target. - -Tue Jul 13 10:04:16 1993 Ian Lance Taylor (ian@cygnus.com) - - * mips-dis.c (print_insn_arg, _print_insn_mips): Made pointer to - argument string const char * to correspond to opcode/mips.h. - -Tue Jul 6 15:18:37 1993 Ian Lance Taylor (ian@cygnus.com) - - * mips-dis.c: Updated to account for name changes in new version - of opcode/mips.h. - * Makefile.in: Added header file dependencies. - -Sat Jul 3 23:47:56 1993 Doug Evans (dje@canuck.cygnus.com) - - * h8300-dis.c (bfd_h8_disassemble): Correct fetching of instruction. - -Thu Jul 1 12:23:38 1993 Jim Kingdon (kingdon@lioth.cygnus.com) - - * m68k-dis.c (NEXTWORD, NEXTLONG): Use ((x) ^ 0x8000) - 0x8000 to sign - extend, rather than shifts. - -Sun Jun 20 20:56:56 1993 Ken Raeburn (raeburn@poseidon.cygnus.com) - - * Makefile.in: Undo 15 June change. - -Fri Jun 18 14:15:15 1993 Per Bothner (bothner@deneb.cygnus.com) - - * m68k-dis.c (print_insn_arg): Change return value to byte count - or error code. - * m68k-dis.c: Re-write to detect invalid operands before - printing anything, so we can handle this the same way we - handle invalid opcodes. - -Thu Jun 17 15:01:36 1993 Steve Chamberlain (sac@phydeaux.cygnus.com) - - * sh-dis.c, sh-opc.h: Understand some more opcodes. - -Wed Jun 16 13:48:05 1993 Ian Lance Taylor (ian@cygnus.com) - - * hppa-dis.c: Include <ansidecl.h> and sysdep.h before other - header files. - -Tue Jun 15 21:45:26 1993 Ken Raeburn (raeburn@cambridge.cygnus.com) - - * sparc-dis.c: Don't declare qsort, since sysdep.h might. - - * configure.in: Do make sysdep.h link. - * Makefile.in: Search ../include. Don't search ../bfd. - -Tue Jun 15 13:36:10 1993 Stu Grossman (grossman@cygnus.com) - - Changes from Jeff Law, law@cs.utah.edu: - * hppa-dis.c: Fix typo. 'a' and 'd' were reversed. - Do not print a space before the completers specified by - 'a' and 'd'. - -Fri Jun 11 18:40:21 1993 Ken Raeburn (raeburn@cygnus.com) - - * mips-dis.c: No longer need to bomb out if HOST_64_BIT is - defined, since gdb has been fixed. - - Changes from Jeff Law, law@cs.utah.edu: - * hppa-dis.c (print_insn_hppa): Last argument to fput_reg, - fput_reg_r, fput_creg, fput_const, and fputs_filtered should - be a *disassemble_info, not a *FILE. - * hppa-dis.c: Support 'd', '!', and 'a'. - * hppa-dis.c: Support 's' to extract a 2 bit space register. - * hppa-dis.c: Delete cases which are no longer needed. - -Fri Jun 11 07:53:48 1993 Jim Kingdon (kingdon@cygnus.com) - - * m68k-dis.c (print_insn_{m68k,arg}): Add MMU codes. - -Tue Jun 8 12:25:01 1993 Steve Chamberlain (sac@phydeaux.cygnus.com) - - * h8300-dis.c: New file, removed from bfd/cpu-h8300.c, with - H8/300-H opcodes. - -Mon Jun 7 12:58:49 1993 Per Bothner (bothner@rtl.cygnus.com) - - * Makefile.in (CSEARCH): Add -I../bfd for sysdep.h and bfd.h. - * configure.in: No longer need to configure to get sysdep.h. - -Thu Jun 3 15:56:49 1993 Stu Grossman (grossman@cygnus.com) - - * Patches from Jeffrey Law <law@cs.utah.edu>. - * hppa-dis.c: Support 'I', 'J', and 'K' in output - templates for 1.1 FP computational instructions. - -Tue May 25 13:05:48 1993 Ken Raeburn (raeburn@cambridge.cygnus.com) - - * h8500-dis.c (print_insn_h8500): Address argument is type - bfd_vma. - * z8k-dis.c (print_insn_z8k, print_insn_z8001, print_insn_z8002): - Ditto. - - * h8500-opc.h (addr_class_type): No comma at end of enumerator. - * sh-opc.h (sh_nibble_type, sh_arg_type): Ditto. - - * sparc-dis.c (compare_opcodes): Move static declaration to - top-level. - -Fri May 21 14:17:37 1993 Peter Schauer (pes@regent.e-technik.tu-muenchen.de) - - * sparc-dis.c (print_insn_sparc): Implement 'n' argument for unimp - instruction, remove unimp hack from 'l' argument. - -Wed May 19 15:35:54 1993 Stu Grossman (grossman@cygnus.com) - - * z8k-dis.c (fetch_data): Use unsigned char to make ancient gcc's - happy. - -Fri May 14 15:22:46 1993 Ian Lance Taylor (ian@cygnus.com) - - * Based on patches from davidj@ICSI.Berkeley.EDU (David Johnson): - * mips-dis.c (print_insn_arg): Handle 'C' for general coprocessor - instructions. - -Fri May 14 00:09:14 1993 Ken Raeburn (raeburn@cambridge.cygnus.com) - - * hppa-dis.c: Include dis-asm.h before sysdep.h. Changed some - arrays of string pointers to 2-d arrays of chars, to save - space. - -Thu May 6 20:51:17 1993 Fred Fish (fnf@cygnus.com) - - * a29k-dis.c, alpha-dis.c, i960-dis.c, sparc-dis.c, z8k-dis.c: - Cast second arg to read_memory_func to "bfd_byte *", as necessary. - -Tue May 4 20:31:10 1993 Ken Raeburn (raeburn@cambridge.cygnus.com) - - * hppa-dis.c: New file from Utah, adapted to new disassembler - calling interface. - * Makefile.in: Include it. - -Mon Apr 26 18:17:42 1993 Steve Chamberlain (sac@thepub.cygnus.com) - - * sh-dis.c, sh-opc.h: New files. - -Fri Apr 23 18:51:22 1993 Steve Chamberlain (sac@thepub.cygnus.com) - - * alpha-dis.c, alpha-opc.h: New files. - -Tue Apr 6 12:54:08 1993 Peter Schauer (pes@regent.e-technik.tu-muenchen.de) - - * mips-dis.c: Sign extend 'j' and 'b' arguments, delta is a signed - value. - -Mon Apr 5 17:37:37 1993 John Gilmore (gnu@cygnus.com) - - * sparc-dis.c: Make "ta" the default trap instruction, "t" the alias. - -Fri Apr 2 07:24:27 1993 Ian Lance Taylor (ian@cygnus.com) - - * a29k-dis.c, sparc-dis.c, sparc-opc.c: Use CONST rather than - const. - -Thu Apr 1 11:20:43 1993 Jim Kingdon (kingdon@cygnus.com) - - * sparc-dis.c: Use fprintf_func a few places where I forgot, - and double percent signs a few places. - - * a29k-dis.c, i960-dis.c: New, merged from gdb and binutils. - - * i386-dis.c, m68k-dis.c, mips-dis.c, sparc-dis.c: - Use info->print_address_func not print_address. - - * dis-buf.c (generic_print_address): New function. - -Wed Mar 31 10:07:04 1993 Jim Kingdon (kingdon@lioth.cygnus.com) - - * Makefile.in: Add sparc-dis.c. - sparc-dis.c: New file, merges binutils and gdb versions as follows: - From GDB: - Add `add' instruction to the set that get checked - for a preceding `sethi' in order to print an absolute address. - * (print_insn): Disassembly prefers real instructions. - (is_delayed_branch): Speed up. - * sparc-opcode.h: Add ALIAS bit to aliases. Fix up opcode tables. - Still missing some float ops, and needs testing. - * sparc-pinsn.c (print_insn): Eliminate 'set' test, subsumed by - F_ALIAS. Use printf, not fprintf, when not passing a file - pointer... - (compare_opcodes): Check that identical instructions have - identical opcodes, complain otherwise. - From binutils: - * New 'm' arg. - * Include reg_names. - From neither: - Use dis-asm.h/read_memory_func interface. - -Wed Mar 31 20:49:06 1993 K. Richard Pixley (rich@rtl.cygnus.com) - - * h8500-dis.c, i386-dis.c, m68k-dis.c, z8k-dis.c (fetch_data): - deliberately return non-zero to setjmp from longjmp. Otherwise - this code fails to compile. - -Wed Mar 31 17:04:31 1993 Stu Grossman (grossman@cygnus.com) - - * m68k-dis.c: Fix prototype for fetch_arg(). - -Wed Mar 31 10:07:04 1993 Jim Kingdon (kingdon@lioth.cygnus.com) - - * dis-buf.c: New file, for new read_memory_func interface. - Makefile.in (OFILES): Include it. - m68k-dis.c, i386-dis.c, h8500-dis.c, mips-dis.c, z8k-dis.c: - Use new read_memory_func interface. - -Mon Mar 29 14:02:17 1993 Steve Chamberlain (sac@thepub.cygnus.com) - - * h8500-dis.c (print_insn_h8500): Get sign of fp offsets right. - * h8500-opc.h: Fix couple of opcodes. - -Wed Mar 24 02:03:36 1993 david d `zoo' zuhn (zoo at poseidon.cygnus.com) - - * Makefile.in: add dvi & installcheck targets - -Mon Mar 22 18:55:04 1993 John Gilmore (gnu@cygnus.com) - - * Makefile.in: Update for h8500-dis.c. - -Fri Mar 19 14:27:17 1993 Steve Chamberlain (sac@thepub.cygnus.com) - - * h8500-dis.c, h8500-opc.h: New files - -Thu Mar 18 14:12:37 1993 Per Bothner (bothner@rtl.cygnus.com) - - * mips-dis.c, z8k-dis.c: Converted to use interface defined in - ../include/dis-asm.h. - * m68k-dis.c: New file (merge of ../binutils/m68k-pinsn.c - and ../gdb/m68k-pinsn.c). - * i386-dis.c: New file (merge of ../binutils/i386-pinsn.c - and ../gdb/i386-pinsn.c). - * m68881-ext.c: New file. Moved definition of - ext_format ext_format_68881 from ../gdb/m68k-tdep.c. - * Makefile.in: Adjust for new files. - * i386-dis.c: Patches from John Hassey (hassey@dg-rtp.dg.com). - * m68k-dis.c: Recognize '9' placement code, so (say) pflush - can be dis-assembled. - -Wed Feb 17 09:19:47 1993 Ken Raeburn (raeburn@cambridge.cygnus.com) - - * mips-dis.c (print_insn_arg): Now returns void. - -Mon Jan 11 16:09:16 1993 Fred Fish (fnf@cygnus.com) - - * mips-dis.c (ansidecl.h): Include for benefit of sysdep.h - files that use the macros. - -Thu Jan 7 13:15:17 1993 Ian Lance Taylor (ian@tweedledumb.cygnus.com) - - * mips-dis.c: New file, from gdb/mips-pinsn.c. - * Makefile.in (DIS_LIBS): Added mips-dis.o. - (CFILES): Added mips-dis.c. - -Thu Jan 7 07:36:33 1993 Steve Chamberlain (sac@thepub.cygnus.com) - - * z8k-dis.c (print_insn_z8001, print_insn_z8002): new routines - * z8kgen.c, z8k-opc.h: fix sizes of some shifts. - -Tue Dec 22 15:42:44 1992 Per Bothner (bothner@rtl.cygnus.com) - - * Makefile.in: Improve *clean rules. - * configure.in: Allow a default host. - -Tue Nov 17 19:53:54 1992 david d `zoo' zuhn (zoo at cirdan.cygnus.com) - - * Makefile.in: also use -I$(srcdir)/../bfd, since some sysdep - files include other sysdep files - -Thu Nov 12 16:10:37 1992 Steve Chamberlain (sac@thepub.cygnus.com) - - * z8k-dis.c z8k-opc.h z8kgen.c: checkpoint - -Fri Oct 9 04:56:05 1992 John Gilmore (gnu@cygnus.com) - - * configure.in: For host support, use ../bfd/configure.host - so it stays in sync with the ../bfd/hosts database. - -Thu Oct 1 23:38:54 1992 david d `zoo' zuhn (zoo at cirdan.cygnus.com) - - * configure.in: use cpu-vendor-os triple instead of nested cases - -Wed Sep 30 16:09:20 1992 Michael Werner (mtw@cygnus.com) - - * z8k-dis.c (unparse_instr): fix bug where opcode returned was - *always* the wrong one. - -Wed Sep 30 07:42:17 1992 Steve Chamberlain (sac@thepub.cygnus.com) - - * z8kgen.c: added copyright info - -Tue Sep 29 12:20:21 1992 Steve Chamberlain (sac@thepub.cygnus.com) - - * z8k-dis.c (unparse_instr): prettier tabs - * z8kgen.c -> z8k-opc.h: bug fixes in tables - -Fri Sep 25 12:50:32 1992 Stu Grossman (grossman at cygnus.com) - - * configure.in: Add ncr* configuration. - * z8k-dis.c (struct instr_data_s): Make instr_asmsrc char to make - picayune ANSI compilers happy. - -Sep 20 08:50:55 1992 Fred Fish (fnf@cygnus.com) - - * configure.in (i386): Make i386 and i486 synonymous for now. - * configure.in (i[34]86-*-sysv4): Add my_host definition. - -Fri Sep 18 17:01:23 1992 Ken Raeburn (raeburn@cambridge.cygnus.com) - - * Makefile.in (install): Fix typo. - -Fri Sep 18 02:04:24 1992 John Gilmore (gnu@cygnus.com) - - * Makefile.in (make): Remove obsolete crud. - (sparc-opc.o): Avoid Sun Make VPATH bug. - -Tue Sep 8 17:29:27 1992 K. Richard Pixley (rich@sendai.cygnus.com) - - * Makefile.in: since there are no SUBDIRS, remove rule and - references of subdir_do. - -Tue Sep 8 17:02:58 1992 Ken Raeburn (raeburn@cambridge.cygnus.com) - - * Makefile.in (install): Get the library name right here too. - Don't install bfd.h, since it's unrelated to this library. No - subdirs to recurse into, either. - (CFILES): The source file has a .c suffix, not .o. - - * sparc-opc.c: New file, moved from BFD. - * Makefile.in (OFILES): Build it. - -Thu Sep 3 16:59:20 1992 Michael Werner (mtw@cygnus.com) - - * z8k-dis.c: fixed forward refferences of some declarations. - -Mon Aug 31 16:09:45 1992 Michael Werner (mtw@cygnus.com) - - * Makefile.in: get the name of the library right - -Mon Aug 31 13:47:35 1992 Steve Chamberlain (sac@thepub.cygnus.com) - - * z8k-dis.c: knows how to disassemble z8k stuff - * z8k-opc.h: new file full of z8000 opcodes - - -Local Variables: -version-control: never -End: diff --git a/contrib/gdb/opcodes/Makefile.in b/contrib/gdb/opcodes/Makefile.in deleted file mode 100644 index c274cb173a462..0000000000000 --- a/contrib/gdb/opcodes/Makefile.in +++ /dev/null @@ -1,305 +0,0 @@ -# Makefile template for Configure for the opcodes library. -# Copyright (C) 1990, 1991, 1992, 1995 Free Software Foundation, Inc. -# Written by Cygnus Support. -# -# 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 2 of the License, 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - -VPATH = @srcdir@ -srcdir = @srcdir@ - -prefix = @prefix@ - -program_transform_name = @program_transform_name@ -exec_prefix = @exec_prefix@ -bindir = $(exec_prefix)/bin -libdir = $(exec_prefix)/lib - -datadir = $(prefix)/lib -mandir = $(prefix)/man -man1dir = $(mandir)/man1 -man2dir = $(mandir)/man2 -man3dir = $(mandir)/man3 -man4dir = $(mandir)/man4 -man5dir = $(mandir)/man5 -man6dir = $(mandir)/man6 -man7dir = $(mandir)/man7 -man8dir = $(mandir)/man8 -man9dir = $(mandir)/man9 -infodir = $(prefix)/info -includedir = $(prefix)/include -oldincludedir = -docdir = $(srcdir)/doc - -SHELL = /bin/sh - -INSTALL = @INSTALL@ -INSTALL_PROGRAM = @INSTALL_PROGRAM@ -INSTALL_DATA = @INSTALL_DATA@ - -AR = @AR@ -AR_FLAGS = rc -CC = @CC@ -CFLAGS = @CFLAGS@ -MAKEINFO = makeinfo -RANLIB = @RANLIB@ - -ALLLIBS = @ALLLIBS@ - -PICFLAG = @PICFLAG@ -SHLIB = @SHLIB@ -SHLIB_CC = @SHLIB_CC@ -SHLIB_CFLAGS = @SHLIB_CFLAGS@ -COMMON_SHLIB = @COMMON_SHLIB@ -SHLIB_DEP = @SHLIB_DEP@ -SHLINK = @SHLINK@ - -SONAME = lib`echo $(SHLIB) | sed -e 's,^\.\./bfd/,,' -e 's/^lib//' | sed '$(program_transform_name)'` - -INCDIR = $(srcdir)/../include -BFDDIR = $(srcdir)/../bfd -CSEARCH = -I. -I$(srcdir) -I../bfd -I$(INCDIR) -I$(BFDDIR) -DEP = mkdep - -TARGETLIB = libopcodes.a - -# To circumvent a Sun make VPATH bug, each file listed here -# should also have a foo.o: foo.c line further along in this file. - -ALL_MACHINES = a29k-dis.o alpha-dis.o h8300-dis.o h8500-dis.o \ - hppa-dis.o i386-dis.o i960-dis.o m68k-dis.o m68k-opc.o \ - m88k-dis.o mips-dis.o mips-opc.o sh-dis.o sparc-dis.o \ - sparc-opc.o z8k-dis.o ns32k-dis.o ppc-dis.o ppc-opc.o \ - arm-dis.o w65-dis.o - -OFILES = @BFD_MACHINES@ dis-buf.o disassemble.o - -FLAGS_TO_PASS = \ - "against=$(against)" \ - "AR=$(AR)" \ - "AR_FLAGS=$(AR_FLAGS)" \ - "CC=$(CC)" \ - "CFLAGS=$(CFLAGS)" \ - "RANLIB=$(RANLIB)" \ - "MAKEINFO=$(MAKEINFO)" \ - "INSTALL=$(INSTALL)" \ - "INSTALL_DATA=$(INSTALL_DATA)" \ - "INSTALL_PROGRAM=$(INSTALL_PROGRAM)" - -ALL_CFLAGS = $(CSEARCH) @HDEFINES@ $(CFLAGS) - -.c.o: - if [ -n "$(PICFLAG)" ]; then \ - $(CC) -c $(PICFLAG) $(ALL_CFLAGS) $< -o pic/$@; \ - else true; fi - $(CC) -c $(ALL_CFLAGS) $< - -# C source files that correspond to .o's. -CFILES = i386-dis.c z8k-dis.c m68k-dis.c mips-dis.c ns32k-dis.c ppc-dis.c - -all: $(ALLLIBS) - -.NOEXPORT: - -installcheck check: - -info: -clean-info: -install-info: -dvi: - -# HDEPFILES comes from the host config; TDEPFILES from the target config. - - -$(TARGETLIB): $(OFILES) - rm -f $(TARGETLIB) - $(AR) $(AR_FLAGS) $(TARGETLIB) $(OFILES) - $(RANLIB) $(TARGETLIB) - -LIBIBERTY_LISTS = ../libiberty/required-list ../libiberty/needed-list -BFD_LIST = ../bfd/piclist - -stamp-piclist: Makefile $(LIBIBERTY_LISTS) $(BFD_LIST) - rm -f tpiclist - if [ -n "$(PICFLAG)" ]; then \ - echo $(OFILES) | sed -e 's,\([^ ][^ ]*\),pic/\1,g' > tpiclist; \ - else \ - echo $(OFILES) > tpiclist; \ - fi - if [ "$(COMMON_SHLIB)" = "yes" ]; then \ - lobjs=`cat $(LIBIBERTY_LISTS)`; \ - if [ -n "$(PICFLAG)" ]; then \ - lobjs=`echo $$lobjs | sed -e 's,\([^ ][^ ]*\),pic/\1,g'`; \ - fi; \ - lobjs=`echo $$lobjs | sed -e 's,\([^ ][^ ]*\),../libiberty/\1,g'`; \ - echo $$lobjs >> tpiclist; \ - sed -e 's,\([^ ][^ ]*\),../bfd/\1,g' $(BFD_LIST) >> tpiclist; \ - else true; fi - $(srcdir)/../move-if-change tpiclist piclist - touch stamp-piclist - -piclist: stamp-piclist ; @true - -$(SHLIB): stamp-picdir $(OFILES) piclist $(SHLIB_DEP) - rm -f $(SHLIB) - $(SHLIB_CC) $(SHLIB_CFLAGS) -o $(SHLIB) `cat piclist` - -$(SHLINK): $(SHLIB) - ts=lib`echo $(SHLIB) | sed -e 's,^\.\./bfd/,,' -e 's/^lib//' | sed -e '$(program_transform_name)'`; \ - if [ "$(COMMON_SHLIB)" = "yes" ]; then \ - ts=../bfd/$$ts; \ - fi; \ - if [ "$$ts" != "$(SHLIB)" ]; then \ - rm -f $$ts; \ - ln -sf `echo $(SHLIB) | sed -e 's,^\.\./bfd/,,'` $$ts; \ - else true; fi - rm -f $(SHLINK) - ln -sf `echo $(SHLIB) | sed -e 's,^\.\./bfd/,,'` $(SHLINK) - -# This target creates libTARGET-opcodes.so.VERSION as a symlink to -# libopcodes.so.VERSION. It is used on SunOS, which does not have SONAME. -stamp-tshlink: $(SHLIB) - tf=lib`echo $(SHLIB) | sed -e 's,\.\./bfd/,,' -e 's/^lib//' | sed '$(program_transform_name)'`; \ - if [ "$(COMMON_SHLIB)" = "yes" ]; then \ - tf=../bfd/$$tf; \ - fi; \ - if [ "$$tf" != "$(SHLIB)" ]; then \ - rm -f $$tf; \ - ln -sf $(SHLIB) $$tf; \ - else true; fi - if [ "$(COMMON_SHLIB)" = "yes" ]; then \ - tf=lib`echo $(TARGETLIB) | sed -e 's/^lib//' | sed '$(program_transform_name)'`; \ - if [ "$$tf" != "$(TARGETLIB)" ]; then \ - rm -f $$tf; \ - ln -sf $(TARGETLIB) $$tf; \ - else true; fi; \ - else true; fi - touch stamp-tshlink - -$(OFILES): stamp-picdir - -disassemble.o: disassemble.c $(INCDIR)/dis-asm.h - if [ -n "$(PICFLAG)" ]; then \ - $(CC) -c @archdefs@ $(PICFLAG) $(ALL_CFLAGS) $(srcdir)/disassemble.c -o pic/disassemble.o; \ - else true; fi - $(CC) -c @archdefs@ $(ALL_CFLAGS) $(srcdir)/disassemble.c - -a29k-dis.o: a29k-dis.c $(INCDIR)/dis-asm.h $(INCDIR)/opcode/a29k.h -dis-buf.o: dis-buf.c $(INCDIR)/dis-asm.h -h8500-dis.o: h8500-dis.c h8500-opc.h $(INCDIR)/dis-asm.h -h8300-dis.o: h8300-dis.c $(INCDIR)/dis-asm.h $(INCDIR)/opcode/h8300.h -i386-dis.o: i386-dis.c $(INCDIR)/dis-asm.h -i960-dis.o: i960-dis.c $(INCDIR)/dis-asm.h -w65-dis.o: w65-dis.c -m68k-dis.o: m68k-dis.c $(INCDIR)/dis-asm.h $(INCDIR)/floatformat.h \ - $(INCDIR)/opcode/m68k.h -m68k-opc.o: m68k-opc.c $(INCDIR)/dis-asm.h $(INCDIR)/opcode/m68k.h -mips-dis.o: mips-dis.c $(INCDIR)/dis-asm.h $(INCDIR)/opcode/mips.h -mips-opc.o: mips-opc.c $(INCDIR)/opcode/mips.h -ppc-dis.o: ppc-dis.c $(INCDIR)/dis-asm.h $(INCDIR)/opcode/ppc.h -ppc-opc.o: ppc-opc.c $(INCDIR)/opcode/ppc.h -sparc-dis.o: sparc-dis.c $(INCDIR)/dis-asm.h $(INCDIR)/opcode/sparc.h -sparc-opc.o: sparc-opc.c $(INCDIR)/opcode/sparc.h -z8k-dis.o: z8k-dis.c z8k-opc.h $(INCDIR)/dis-asm.h -ns32k-dis.o: ns32k-dis.c $(INCDIR)/dis-asm.h $(INCDIR)/opcode/ns32k.h -sh-dis.o: sh-dis.c sh-opc.h $(INCDIR)/dis-asm.h -alpha-dis.o: alpha-dis.c alpha-opc.h $(INCDIR)/dis-asm.h -hppa-dis.o: hppa-dis.c $(INCDIR)/dis-asm.h $(INCDIR)/opcode/hppa.h -m88k-dis.o: m88k-dis.c $(INCDIR)/dis-asm.h $(INCDIR)/opcode/m88k.h -arm-dis.o: arm-dis.c arm-opc.h $(INCDIR)/dis-asm.h - -tags etags: TAGS - -TAGS: force - etags $(INCDIR)/*.h $(srcdir)/*.h $(srcdir)/*.c - -MOSTLYCLEAN = *.o core *.E *.p *.ip config.log pic/*.o -mostlyclean: - rm -rf $(MOSTLYCLEAN) -clean: - rm -f *.a $(MOSTLYCLEAN) $(SHLIB) $(SHLINK) piclist stamp-piclist -distclean: clean - rm -rf Makefile config.status TAGS config.cache config.h stamp-h \ - pic stamp-picdir -clobber realclean maintainer-clean: distclean - -# Mark everything as depending on config.status, since the timestamp on -# sysdep.h might actually move backwards if we reconfig and relink it -# to a different hosts/h-xxx.h file. This will force a recompile anyway. -RECONFIG = config.status - - - -# This target should be invoked before building a new release. -# 'VERSION' file must be present and contain a string of the form "x.y" -# -roll: - @V=`cat VERSION` ; \ - MAJ=`sed 's/\..*//' VERSION` ; \ - MIN=`sed 's/.*\.//' VERSION` ; \ - V=$$MAJ.`expr $$MIN + 1` ; \ - rm -f VERSION ; \ - echo $$V >VERSION ; \ - echo Version $$V - -# Dummy target to force execution of dependent targets. -# -force: - -install: $(ALLLIBS) - for f in $(ALLLIBS); do \ - if [ "$$f" = "stamp-tshlink" ]; then \ - continue; \ - fi; \ - tf=lib`echo $$f | sed -e 's,^\.\./bfd/,,' -e 's/^lib//' | sed '$(program_transform_name)'`; \ - rm -f $(libdir)/$$tf; \ - if [ "$$f" = "$(SHLINK)" ]; then \ - ts=lib`echo $(SHLIB) | sed -e 's,^\.\./bfd/,,' -e 's/^lib//' | sed '$(program_transform_name)'`; \ - ln -sf $$ts $(libdir)/$$tf; \ - elif [ "$$f" = "$(SHLIB)" ]; then \ - $(INSTALL_PROGRAM) $$f $(libdir)/$$tf; \ - else \ - $(INSTALL_DATA) $$f $(libdir)/$$tf; \ - $(RANLIB) $(libdir)/$$tf; \ - chmod a-x $(libdir)/$$tf; \ - fi; \ - done - -Makefile: Makefile.in config.status - CONFIG_FILES=Makefile CONFIG_HEADERS= $(SHELL) ./config.status - -config.h: stamp-h ; @true -stamp-h: config.in config.status - CONFIG_FILES= CONFIG_HEADERS=config.h:config.in $(SHELL) ./config.status - -config.status : configure $(srcdir)/../bfd/configure.host $(srcdir)/../bfd/config.bfd - $(SHELL) config.status --recheck - -dep: $(CFILES) - mkdep $(CFLAGS) $? - -stamp-picdir: - if [ -n "$(PICFLAG)" ] && [ ! -d pic ]; then \ - mkdir pic; \ - else true; fi - touch stamp-picdir - -# What appears below is generated by a hacked mkdep using gcc -MM. - -# DO NOT DELETE THIS LINE -- mkdep uses it. -# DO NOT PUT ANYTHING AFTER THIS LINE, IT WILL GO AWAY. - - -# IF YOU PUT ANYTHING HERE IT WILL GO AWAY - diff --git a/contrib/gdb/opcodes/config.in b/contrib/gdb/opcodes/config.in deleted file mode 100644 index ea534ec66ce28..0000000000000 --- a/contrib/gdb/opcodes/config.in +++ /dev/null @@ -1,7 +0,0 @@ -/* config.in. Generated automatically from configure.in by autoheader. */ - -/* Define if you have the <string.h> header file. */ -#undef HAVE_STRING_H - -/* Define if you have the <strings.h> header file. */ -#undef HAVE_STRINGS_H diff --git a/contrib/gdb/opcodes/configure b/contrib/gdb/opcodes/configure deleted file mode 100755 index 5f19335a3af0d..0000000000000 --- a/contrib/gdb/opcodes/configure +++ /dev/null @@ -1,1538 +0,0 @@ -#! /bin/sh - -# Guess values for system-dependent variables and create Makefiles. -# Generated automatically using autoconf version 2.8 -# Copyright (C) 1992, 1993, 1994 Free Software Foundation, Inc. -# -# This configure script is free software; the Free Software Foundation -# gives unlimited permission to copy, distribute and modify it. - -# Defaults: -ac_help= -ac_default_prefix=/usr/local -# Any additions from configure.in: -ac_help="$ac_help - --enable-targets alternative target configurations" -ac_help="$ac_help - --enable-shared build shared opcodes library" -ac_help="$ac_help - --enable-commonbfdlib build shared BFD/opcodes/libiberty library" - -# Initialize some variables set by options. -# The variables have the same names as the options, with -# dashes changed to underlines. -build=NONE -cache_file=./config.cache -exec_prefix=NONE -host=NONE -no_create= -nonopt=NONE -no_recursion= -prefix=NONE -program_prefix=NONE -program_suffix=NONE -program_transform_name=s,x,x, -silent= -site= -srcdir= -target=NONE -verbose= -x_includes=NONE -x_libraries=NONE -bindir='${exec_prefix}/bin' -sbindir='${exec_prefix}/sbin' -libexecdir='${exec_prefix}/libexec' -datadir='${prefix}/share' -sysconfdir='${prefix}/etc' -sharedstatedir='${prefix}/com' -localstatedir='${prefix}/var' -libdir='${exec_prefix}/lib' -includedir='${prefix}/include' -oldincludedir='/usr/include' -infodir='${prefix}/info' -mandir='${prefix}/man' - -# Initialize some other variables. -subdirs= -MFLAGS= MAKEFLAGS= - -ac_prev= -for ac_option -do - - # If the previous option needs an argument, assign it. - if test -n "$ac_prev"; then - eval "$ac_prev=\$ac_option" - ac_prev= - continue - fi - - case "$ac_option" in - -*=*) ac_optarg=`echo "$ac_option" | sed 's/[-_a-zA-Z0-9]*=//'` ;; - *) ac_optarg= ;; - esac - - # Accept the important Cygnus configure options, so we can diagnose typos. - - case "$ac_option" in - - -bindir | --bindir | --bindi | --bind | --bin | --bi) - ac_prev=bindir ;; - -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*) - bindir="$ac_optarg" ;; - - -build | --build | --buil | --bui | --bu) - ac_prev=build ;; - -build=* | --build=* | --buil=* | --bui=* | --bu=*) - build="$ac_optarg" ;; - - -cache-file | --cache-file | --cache-fil | --cache-fi \ - | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c) - ac_prev=cache_file ;; - -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \ - | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*) - cache_file="$ac_optarg" ;; - - -datadir | --datadir | --datadi | --datad | --data | --dat | --da) - ac_prev=datadir ;; - -datadir=* | --datadir=* | --datadi=* | --datad=* | --data=* | --dat=* \ - | --da=*) - datadir="$ac_optarg" ;; - - -disable-* | --disable-*) - ac_feature=`echo $ac_option|sed -e 's/-*disable-//'` - # Reject names that are not valid shell variable names. - if test -n "`echo $ac_feature| sed 's/[-a-zA-Z0-9_]//g'`"; then - { echo "configure: error: $ac_feature: invalid feature name" 1>&2; exit 1; } - fi - ac_feature=`echo $ac_feature| sed 's/-/_/g'` - eval "enable_${ac_feature}=no" ;; - - -enable-* | --enable-*) - ac_feature=`echo $ac_option|sed -e 's/-*enable-//' -e 's/=.*//'` - # Reject names that are not valid shell variable names. - if test -n "`echo $ac_feature| sed 's/[-_a-zA-Z0-9]//g'`"; then - { echo "configure: error: $ac_feature: invalid feature name" 1>&2; exit 1; } - fi - ac_feature=`echo $ac_feature| sed 's/-/_/g'` - case "$ac_option" in - *=*) ;; - *) ac_optarg=yes ;; - esac - eval "enable_${ac_feature}='$ac_optarg'" ;; - - -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \ - | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \ - | --exec | --exe | --ex) - ac_prev=exec_prefix ;; - -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \ - | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \ - | --exec=* | --exe=* | --ex=*) - exec_prefix="$ac_optarg" ;; - - -gas | --gas | --ga | --g) - # Obsolete; use --with-gas. - with_gas=yes ;; - - -help | --help | --hel | --he) - # Omit some internal or obsolete options to make the list less imposing. - # This message is too long to be a string in the A/UX 3.1 sh. - cat << EOF -Usage: configure [options] [host] -Options: [defaults in brackets after descriptions] -Configuration: - --cache-file=FILE cache test results in FILE - --help print this message - --no-create do not create output files - --quiet, --silent do not print \`checking...' messages - --version print the version of autoconf that created configure -Directory and file names: - --prefix=PREFIX install architecture-independent files in PREFIX - [$ac_default_prefix] - --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX - [same as prefix] - --bindir=DIR user executables in DIR [EPREFIX/bin] - --sbindir=DIR system admin executables in DIR [EPREFIX/sbin] - --libexecdir=DIR program executables in DIR [EPREFIX/libexec] - --datadir=DIR read-only architecture-independent data in DIR - [PREFIX/share] - --sysconfdir=DIR read-only single-machine data in DIR [PREFIX/etc] - --sharedstatedir=DIR modifiable architecture-independent data in DIR - [PREFIX/com] - --localstatedir=DIR modifiable single-machine data in DIR [PREFIX/var] - --libdir=DIR object code libraries in DIR [EPREFIX/lib] - --includedir=DIR C header files in DIR [PREFIX/include] - --oldincludedir=DIR C header files for non-gcc in DIR [/usr/include] - --infodir=DIR info documentation in DIR [PREFIX/info] - --mandir=DIR man documentation in DIR [PREFIX/man] - --srcdir=DIR find the sources in DIR [configure dir or ..] - --program-prefix=PREFIX prepend PREFIX to installed program names - --program-suffix=SUFFIX append SUFFIX to installed program names - --program-transform-name=PROGRAM - run sed PROGRAM on installed program names -EOF - cat << EOF -Host type: - --build=BUILD configure for building on BUILD [BUILD=HOST] - --host=HOST configure for HOST [guessed] - --target=TARGET configure for TARGET [TARGET=HOST] -Features and packages: - --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no) - --enable-FEATURE[=ARG] include FEATURE [ARG=yes] - --with-PACKAGE[=ARG] use PACKAGE [ARG=yes] - --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no) - --x-includes=DIR X include files are in DIR - --x-libraries=DIR X library files are in DIR -EOF - if test -n "$ac_help"; then - echo "--enable and --with options recognized:$ac_help" - fi - exit 0 ;; - - -host | --host | --hos | --ho) - ac_prev=host ;; - -host=* | --host=* | --hos=* | --ho=*) - host="$ac_optarg" ;; - - -includedir | --includedir | --includedi | --included | --include \ - | --includ | --inclu | --incl | --inc) - ac_prev=includedir ;; - -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \ - | --includ=* | --inclu=* | --incl=* | --inc=*) - includedir="$ac_optarg" ;; - - -infodir | --infodir | --infodi | --infod | --info | --inf) - ac_prev=infodir ;; - -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*) - infodir="$ac_optarg" ;; - - -libdir | --libdir | --libdi | --libd) - ac_prev=libdir ;; - -libdir=* | --libdir=* | --libdi=* | --libd=*) - libdir="$ac_optarg" ;; - - -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \ - | --libexe | --libex | --libe) - ac_prev=libexecdir ;; - -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \ - | --libexe=* | --libex=* | --libe=*) - libexecdir="$ac_optarg" ;; - - -localstatedir | --localstatedir | --localstatedi | --localstated \ - | --localstate | --localstat | --localsta | --localst \ - | --locals | --local | --loca | --loc | --lo) - ac_prev=localstatedir ;; - -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \ - | --localstate=* | --localstat=* | --localsta=* | --localst=* \ - | --locals=* | --local=* | --loca=* | --loc=* | --lo=*) - localstatedir="$ac_optarg" ;; - - -mandir | --mandir | --mandi | --mand | --man | --ma | --m) - ac_prev=mandir ;; - -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*) - mandir="$ac_optarg" ;; - - -nfp | --nfp | --nf) - # Obsolete; use --without-fp. - with_fp=no ;; - - -no-create | --no-create | --no-creat | --no-crea | --no-cre \ - | --no-cr | --no-c) - no_create=yes ;; - - -no-recursion | --no-recursion | --no-recursio | --no-recursi \ - | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) - no_recursion=yes ;; - - -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \ - | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \ - | --oldin | --oldi | --old | --ol | --o) - ac_prev=oldincludedir ;; - -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \ - | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \ - | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*) - oldincludedir="$ac_optarg" ;; - - -prefix | --prefix | --prefi | --pref | --pre | --pr | --p) - ac_prev=prefix ;; - -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*) - prefix="$ac_optarg" ;; - - -program-prefix | --program-prefix | --program-prefi | --program-pref \ - | --program-pre | --program-pr | --program-p) - ac_prev=program_prefix ;; - -program-prefix=* | --program-prefix=* | --program-prefi=* \ - | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*) - program_prefix="$ac_optarg" ;; - - -program-suffix | --program-suffix | --program-suffi | --program-suff \ - | --program-suf | --program-su | --program-s) - ac_prev=program_suffix ;; - -program-suffix=* | --program-suffix=* | --program-suffi=* \ - | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*) - program_suffix="$ac_optarg" ;; - - -program-transform-name | --program-transform-name \ - | --program-transform-nam | --program-transform-na \ - | --program-transform-n | --program-transform- \ - | --program-transform | --program-transfor \ - | --program-transfo | --program-transf \ - | --program-trans | --program-tran \ - | --progr-tra | --program-tr | --program-t) - ac_prev=program_transform_name ;; - -program-transform-name=* | --program-transform-name=* \ - | --program-transform-nam=* | --program-transform-na=* \ - | --program-transform-n=* | --program-transform-=* \ - | --program-transform=* | --program-transfor=* \ - | --program-transfo=* | --program-transf=* \ - | --program-trans=* | --program-tran=* \ - | --progr-tra=* | --program-tr=* | --program-t=*) - program_transform_name="$ac_optarg" ;; - - -q | -quiet | --quiet | --quie | --qui | --qu | --q \ - | -silent | --silent | --silen | --sile | --sil) - silent=yes ;; - - -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb) - ac_prev=sbindir ;; - -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \ - | --sbi=* | --sb=*) - sbindir="$ac_optarg" ;; - - -sharedstatedir | --sharedstatedir | --sharedstatedi \ - | --sharedstated | --sharedstate | --sharedstat | --sharedsta \ - | --sharedst | --shareds | --shared | --share | --shar \ - | --sha | --sh) - ac_prev=sharedstatedir ;; - -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \ - | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \ - | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \ - | --sha=* | --sh=*) - sharedstatedir="$ac_optarg" ;; - - -site | --site | --sit) - ac_prev=site ;; - -site=* | --site=* | --sit=*) - site="$ac_optarg" ;; - - -srcdir | --srcdir | --srcdi | --srcd | --src | --sr) - ac_prev=srcdir ;; - -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*) - srcdir="$ac_optarg" ;; - - -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \ - | --syscon | --sysco | --sysc | --sys | --sy) - ac_prev=sysconfdir ;; - -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \ - | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*) - sysconfdir="$ac_optarg" ;; - - -target | --target | --targe | --targ | --tar | --ta | --t) - ac_prev=target ;; - -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*) - target="$ac_optarg" ;; - - -v | -verbose | --verbose | --verbos | --verbo | --verb) - verbose=yes ;; - - -version | --version | --versio | --versi | --vers) - echo "configure generated by autoconf version 2.8" - exit 0 ;; - - -with-* | --with-*) - ac_package=`echo $ac_option|sed -e 's/-*with-//' -e 's/=.*//'` - # Reject names that are not valid shell variable names. - if test -n "`echo $ac_package| sed 's/[-_a-zA-Z0-9]//g'`"; then - { echo "configure: error: $ac_package: invalid package name" 1>&2; exit 1; } - fi - ac_package=`echo $ac_package| sed 's/-/_/g'` - case "$ac_option" in - *=*) ;; - *) ac_optarg=yes ;; - esac - eval "with_${ac_package}='$ac_optarg'" ;; - - -without-* | --without-*) - ac_package=`echo $ac_option|sed -e 's/-*without-//'` - # Reject names that are not valid shell variable names. - if test -n "`echo $ac_package| sed 's/[-a-zA-Z0-9_]//g'`"; then - { echo "configure: error: $ac_package: invalid package name" 1>&2; exit 1; } - fi - ac_package=`echo $ac_package| sed 's/-/_/g'` - eval "with_${ac_package}=no" ;; - - --x) - # Obsolete; use --with-x. - with_x=yes ;; - - -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \ - | --x-incl | --x-inc | --x-in | --x-i) - ac_prev=x_includes ;; - -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \ - | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*) - x_includes="$ac_optarg" ;; - - -x-libraries | --x-libraries | --x-librarie | --x-librari \ - | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l) - ac_prev=x_libraries ;; - -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \ - | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*) - x_libraries="$ac_optarg" ;; - - -*) { echo "configure: error: $ac_option: invalid option; use --help to show usage" 1>&2; exit 1; } - ;; - - *) - if test -n "`echo $ac_option| sed 's/[-a-z0-9.]//g'`"; then - echo "configure: warning: $ac_option: invalid host type" 1>&2 - fi - if test "x$nonopt" != xNONE; then - { echo "configure: error: can only configure for one host and one target at a time" 1>&2; exit 1; } - fi - nonopt="$ac_option" - ;; - - esac -done - -if test -n "$ac_prev"; then - { echo "configure: error: missing argument to --`echo $ac_prev | sed 's/_/-/g'`" 1>&2; exit 1; } -fi - -trap 'rm -fr conftest* confdefs* core core.* *.core $ac_clean_files; exit 1' 1 2 15 - -# File descriptor usage: -# 0 standard input -# 1 file creation -# 2 errors and warnings -# 3 some systems may open it to /dev/tty -# 4 used on the Kubota Titan -# 6 checking for... messages and results -# 5 compiler messages saved in config.log -if test "$silent" = yes; then - exec 6>/dev/null -else - exec 6>&1 -fi -exec 5>./config.log - -echo "\ -This file contains any messages produced by compilers while -running configure, to aid debugging if configure makes a mistake. -" 1>&5 - -# Strip out --no-create and --no-recursion so they do not pile up. -# Also quote any args containing shell metacharacters. -ac_configure_args= -for ac_arg -do - case "$ac_arg" in - -no-create | --no-create | --no-creat | --no-crea | --no-cre \ - | --no-cr | --no-c) ;; - -no-recursion | --no-recursion | --no-recursio | --no-recursi \ - | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) ;; - *" "*|*" "*|*[\[\]\~\#\$\^\&\*\(\)\{\}\\\|\;\<\>\?]*) - ac_configure_args="$ac_configure_args '$ac_arg'" ;; - *) ac_configure_args="$ac_configure_args $ac_arg" ;; - esac -done - -# NLS nuisances. -# Only set LANG and LC_ALL to C if already set. -# These must not be set unconditionally because not all systems understand -# e.g. LANG=C (notably SCO). -if test "${LC_ALL+set}" = set; then LC_ALL=C; export LC_ALL; fi -if test "${LANG+set}" = set; then LANG=C; export LANG; fi - -# confdefs.h avoids OS command line length limits that DEFS can exceed. -rm -rf conftest* confdefs.h -# AIX cpp loses on an empty file, so make sure it contains at least a newline. -echo > confdefs.h - -# A filename unique to this package, relative to the directory that -# configure is in, which we can look for to find out if srcdir is correct. -ac_unique_file=z8k-dis.c - -# Find the source files, if location was not specified. -if test -z "$srcdir"; then - ac_srcdir_defaulted=yes - # Try the directory containing this script, then its parent. - ac_prog=$0 - ac_confdir=`echo $ac_prog|sed 's%/[^/][^/]*$%%'` - test "x$ac_confdir" = "x$ac_prog" && ac_confdir=. - srcdir=$ac_confdir - if test ! -r $srcdir/$ac_unique_file; then - srcdir=.. - fi -else - ac_srcdir_defaulted=no -fi -if test ! -r $srcdir/$ac_unique_file; then - if test "$ac_srcdir_defaulted" = yes; then - { echo "configure: error: can not find sources in $ac_confdir or .." 1>&2; exit 1; } - else - { echo "configure: error: can not find sources in $srcdir" 1>&2; exit 1; } - fi -fi -srcdir=`echo "${srcdir}" | sed 's%\([^/]\)/*$%\1%'` - -# Prefer explicitly selected file to automatically selected ones. -if test -z "$CONFIG_SITE"; then - if test "x$prefix" != xNONE; then - CONFIG_SITE="$prefix/share/config.site $prefix/etc/config.site" - else - CONFIG_SITE="$ac_default_prefix/share/config.site $ac_default_prefix/etc/config.site" - fi -fi -for ac_site_file in $CONFIG_SITE; do - if test -r "$ac_site_file"; then - echo "loading site script $ac_site_file" - . "$ac_site_file" - fi -done - -if test -r "$cache_file"; then - echo "loading cache $cache_file" - . $cache_file -else - echo "creating cache $cache_file" - > $cache_file -fi - -ac_ext=c -# CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options. -ac_cpp='$CPP $CPPFLAGS' -ac_compile='${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5' -ac_link='${CC-cc} -o conftest $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5' - -if (echo "testing\c"; echo 1,2,3) | grep c >/dev/null; then - # Stardent Vistra SVR4 grep lacks -e, says ghazi@caip.rutgers.edu. - if (echo -n testing; echo 1,2,3) | sed s/-n/xn/ | grep xn >/dev/null; then - ac_n= ac_c=' -' ac_t=' ' - else - ac_n=-n ac_c= ac_t= - fi -else - ac_n= ac_c='\c' ac_t= -fi - - -# configure.in script for the opcodes library. -# Copyright (C) 1995, 1996 Free Software Foundation, Inc. -# Written by Cygnus Support. -# -# 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 2 of the License, 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - -# Check whether --enable-targets or --disable-targets was given. -if test "${enable_targets+set}" = set; then - enableval="$enable_targets" - case "${enableval}" in - yes | "") { echo "configure: error: enable-targets option must specify target names or 'all'" 1>&2; exit 1; } - ;; - no) enable_targets= ;; - *) enable_targets=$enableval ;; -esac -fi -# Check whether --enable-shared or --disable-shared was given. -if test "${enable_shared+set}" = set; then - enableval="$enable_shared" - case "${enableval}" in - yes) shared=true ;; - no) shared=false ;; - *) { echo "configure: error: bad value ${enableval} for opcodes shared option" 1>&2; exit 1; } ;; -esac -fi -# Check whether --enable-commonbfdlib or --disable-commonbfdlib was given. -if test "${enable_commonbfdlib+set}" = set; then - enableval="$enable_commonbfdlib" - case "${enableval}" in - yes) commonbfdlib=true ;; - no) commonbfdlib=false ;; - *) { echo "configure: error: bad value ${enableval} for opcodes commonbfdlib option" 1>&2; exit 1; } ;; -esac -fi - - - -ac_aux_dir= -for ac_dir in `cd $srcdir/..;pwd` $srcdir/`cd $srcdir/..;pwd`; do - if test -f $ac_dir/install-sh; then - ac_aux_dir=$ac_dir - ac_install_sh="$ac_aux_dir/install-sh -c" - break - elif test -f $ac_dir/install.sh; then - ac_aux_dir=$ac_dir - ac_install_sh="$ac_aux_dir/install.sh -c" - break - fi -done -if test -z "$ac_aux_dir"; then - { echo "configure: error: can not find install-sh or install.sh in `cd $srcdir/..;pwd` $srcdir/`cd $srcdir/..;pwd`" 1>&2; exit 1; } -fi -ac_config_guess=$ac_aux_dir/config.guess -ac_config_sub=$ac_aux_dir/config.sub -ac_configure=$ac_aux_dir/configure # This should be Cygnus configure. - - -# Do some error checking and defaulting for the host and target type. -# The inputs are: -# configure --host=HOST --target=TARGET --build=BUILD NONOPT -# -# The rules are: -# 1. You are not allowed to specify --host, --target, and nonopt at the -# same time. -# 2. Host defaults to nonopt. -# 3. If nonopt is not specified, then host defaults to the current host, -# as determined by config.guess. -# 4. Target and build default to nonopt. -# 5. If nonopt is not specified, then target and build default to host. - -# The aliases save the names the user supplied, while $host etc. -# will get canonicalized. -case $host---$target---$nonopt in -NONE---*---* | *---NONE---* | *---*---NONE) ;; -*) { echo "configure: error: can only configure for one host and one target at a time" 1>&2; exit 1; } ;; -esac - - -# Make sure we can run config.sub. -if $ac_config_sub sun4 >/dev/null 2>&1; then : -else { echo "configure: error: can not run $ac_config_sub" 1>&2; exit 1; } -fi - -echo $ac_n "checking host system type""... $ac_c" 1>&6 - -host_alias=$host -case "$host_alias" in -NONE) - case $nonopt in - NONE) - if host_alias=`$ac_config_guess`; then : - else { echo "configure: error: can not guess host type; you must specify one" 1>&2; exit 1; } - fi ;; - *) host_alias=$nonopt ;; - esac ;; -esac - -host=`$ac_config_sub $host_alias` -host_cpu=`echo $host | sed 's/^\(.*\)-\(.*\)-\(.*\)$/\1/'` -host_vendor=`echo $host | sed 's/^\(.*\)-\(.*\)-\(.*\)$/\2/'` -host_os=`echo $host | sed 's/^\(.*\)-\(.*\)-\(.*\)$/\3/'` -echo "$ac_t""$host" 1>&6 - -echo $ac_n "checking target system type""... $ac_c" 1>&6 - -target_alias=$target -case "$target_alias" in -NONE) - case $nonopt in - NONE) target_alias=$host_alias ;; - *) target_alias=$nonopt ;; - esac ;; -esac - -target=`$ac_config_sub $target_alias` -target_cpu=`echo $target | sed 's/^\(.*\)-\(.*\)-\(.*\)$/\1/'` -target_vendor=`echo $target | sed 's/^\(.*\)-\(.*\)-\(.*\)$/\2/'` -target_os=`echo $target | sed 's/^\(.*\)-\(.*\)-\(.*\)$/\3/'` -echo "$ac_t""$target" 1>&6 - -echo $ac_n "checking build system type""... $ac_c" 1>&6 - -build_alias=$build -case "$build_alias" in -NONE) - case $nonopt in - NONE) build_alias=$host_alias ;; - *) build_alias=$nonopt ;; - esac ;; -esac - -build=`$ac_config_sub $build_alias` -build_cpu=`echo $build | sed 's/^\(.*\)-\(.*\)-\(.*\)$/\1/'` -build_vendor=`echo $build | sed 's/^\(.*\)-\(.*\)-\(.*\)$/\2/'` -build_os=`echo $build | sed 's/^\(.*\)-\(.*\)-\(.*\)$/\3/'` -echo "$ac_t""$build" 1>&6 - -test "$host_alias" != "$target_alias" && - test "$program_prefix$program_suffix$program_transform_name" = \ - NONENONEs,x,x, && - program_prefix=${target_alias}- - -if test -z "$target" ; then - { echo "configure: error: Unrecognized target system type; please check config.sub." 1>&2; exit 1; } -fi -if test "$program_transform_name" = s,x,x,; then - program_transform_name= -else - # Double any \ or $. echo might interpret backslashes. - cat <<\EOF_SED > conftestsed -s,\\,\\\\,g; s,\$,$$,g -EOF_SED - program_transform_name="`echo $program_transform_name|sed -f conftestsed`" - rm -f conftestsed -fi -test "$program_prefix" != NONE && - program_transform_name="s,^,${program_prefix},; $program_transform_name" -# Use a double $ so make ignores it. -test "$program_suffix" != NONE && - program_transform_name="s,\$\$,${program_suffix},; $program_transform_name" - -# sed with no file args requires a program. -test "$program_transform_name" = "" && program_transform_name="s,x,x," - - -# host-specific stuff: - -ALLLIBS='$(TARGETLIB)' -PICFLAG= -SHLIB=unused-shlib -SHLINK=unused-shlink -if test "${shared}" = "true"; then - ALLLIBS='$(TARGETLIB) $(SHLIB) $(SHLINK)' - PICFLAG=-fpic - if test "${commonbfdlib}" = "true"; then - SHLIB=../bfd/libbfd.so.`sed -e 's/[^0-9]*\([0-9.]*\).*/\1/' ${srcdir}/../bfd/VERSION` - SHLINK=../bfd/libbfd.so - else - SHLIB=libopcodes.so.`sed -e 's/[^0-9]*\([0-9.]*\).*/\1/' ${srcdir}/../bfd/VERSION` - SHLINK=libopcodes.so - fi -fi - -# Extract the first word of "gcc", so it can be a program name with args. -set dummy gcc; ac_word=$2 -echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 -if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - if test -n "$CC"; then - ac_cv_prog_CC="$CC" # Let the user override the test. -else - IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:" - for ac_dir in $PATH; do - test -z "$ac_dir" && ac_dir=. - if test -f $ac_dir/$ac_word; then - ac_cv_prog_CC="gcc" - break - fi - done - IFS="$ac_save_ifs" -fi -fi -CC="$ac_cv_prog_CC" -if test -n "$CC"; then - echo "$ac_t""$CC" 1>&6 -else - echo "$ac_t""no" 1>&6 -fi - -if test -z "$CC"; then - # Extract the first word of "cc", so it can be a program name with args. -set dummy cc; ac_word=$2 -echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 -if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - if test -n "$CC"; then - ac_cv_prog_CC="$CC" # Let the user override the test. -else - IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:" - ac_prog_rejected=no - for ac_dir in $PATH; do - test -z "$ac_dir" && ac_dir=. - if test -f $ac_dir/$ac_word; then - if test "$ac_dir/$ac_word" = "/usr/ucb/cc"; then - ac_prog_rejected=yes - continue - fi - ac_cv_prog_CC="cc" - break - fi - done - IFS="$ac_save_ifs" -if test $ac_prog_rejected = yes; then - # We found a bogon in the path, so make sure we never use it. - set dummy $ac_cv_prog_CC - shift - if test $# -gt 0; then - # We chose a different compiler from the bogus one. - # However, it has the same basename, so the bogon will be chosen - # first if we set CC to just the basename; use the full file name. - shift - set dummy "$ac_dir/$ac_word" "$@" - shift - ac_cv_prog_CC="$@" - fi -fi -fi -fi -CC="$ac_cv_prog_CC" -if test -n "$CC"; then - echo "$ac_t""$CC" 1>&6 -else - echo "$ac_t""no" 1>&6 -fi - - test -z "$CC" && { echo "configure: error: no acceptable cc found in \$PATH" 1>&2; exit 1; } -fi - -echo $ac_n "checking whether we are using GNU C""... $ac_c" 1>&6 -if eval "test \"`echo '$''{'ac_cv_prog_gcc'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - cat > conftest.c <<EOF -#ifdef __GNUC__ - yes; -#endif -EOF -if { ac_try='${CC-cc} -E conftest.c'; { (eval echo configure:803: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; } | egrep yes >/dev/null 2>&1; then - ac_cv_prog_gcc=yes -else - ac_cv_prog_gcc=no -fi -fi - -echo "$ac_t""$ac_cv_prog_gcc" 1>&6 -if test $ac_cv_prog_gcc = yes; then - GCC=yes - if test "${CFLAGS+set}" != set; then - echo $ac_n "checking whether ${CC-cc} accepts -g""... $ac_c" 1>&6 -if eval "test \"`echo '$''{'ac_cv_prog_gcc_g'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - echo 'void f(){}' > conftest.c -if test -z "`${CC-cc} -g -c conftest.c 2>&1`"; then - ac_cv_prog_gcc_g=yes -else - ac_cv_prog_gcc_g=no -fi -rm -f conftest* - -fi - -echo "$ac_t""$ac_cv_prog_gcc_g" 1>&6 - if test $ac_cv_prog_gcc_g = yes; then - CFLAGS="-g -O" - else - CFLAGS="-O" - fi - fi -else - GCC= - test "${CFLAGS+set}" = set || CFLAGS="-g" -fi - - -. ${srcdir}/../bfd/configure.host - - -if test $host != $build; then - ac_tool_prefix=${host_alias}- -else - ac_tool_prefix= -fi - -# Extract the first word of "${ac_tool_prefix}ar", so it can be a program name with args. -set dummy ${ac_tool_prefix}ar; ac_word=$2 -echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 -if eval "test \"`echo '$''{'ac_cv_prog_AR'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - if test -n "$AR"; then - ac_cv_prog_AR="$AR" # Let the user override the test. -else - IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:" - for ac_dir in $PATH; do - test -z "$ac_dir" && ac_dir=. - if test -f $ac_dir/$ac_word; then - ac_cv_prog_AR="${ac_tool_prefix}ar" - break - fi - done - IFS="$ac_save_ifs" - test -z "$ac_cv_prog_AR" && ac_cv_prog_AR="ar" -fi -fi -AR="$ac_cv_prog_AR" -if test -n "$AR"; then - echo "$ac_t""$AR" 1>&6 -else - echo "$ac_t""no" 1>&6 -fi - - - -# Extract the first word of "${ac_tool_prefix}ranlib", so it can be a program name with args. -set dummy ${ac_tool_prefix}ranlib; ac_word=$2 -echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 -if eval "test \"`echo '$''{'ac_cv_prog_RANLIB'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - if test -n "$RANLIB"; then - ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test. -else - IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:" - for ac_dir in $PATH; do - test -z "$ac_dir" && ac_dir=. - if test -f $ac_dir/$ac_word; then - ac_cv_prog_RANLIB="${ac_tool_prefix}ranlib" - break - fi - done - IFS="$ac_save_ifs" -fi -fi -RANLIB="$ac_cv_prog_RANLIB" -if test -n "$RANLIB"; then - echo "$ac_t""$RANLIB" 1>&6 -else - echo "$ac_t""no" 1>&6 -fi - - -if test -z "$ac_cv_prog_RANLIB"; then -if test -n "$ac_tool_prefix"; then - # Extract the first word of "ranlib", so it can be a program name with args. -set dummy ranlib; ac_word=$2 -echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 -if eval "test \"`echo '$''{'ac_cv_prog_RANLIB'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - if test -n "$RANLIB"; then - ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test. -else - IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:" - for ac_dir in $PATH; do - test -z "$ac_dir" && ac_dir=. - if test -f $ac_dir/$ac_word; then - ac_cv_prog_RANLIB="ranlib" - break - fi - done - IFS="$ac_save_ifs" - test -z "$ac_cv_prog_RANLIB" && ac_cv_prog_RANLIB=":" -fi -fi -RANLIB="$ac_cv_prog_RANLIB" -if test -n "$RANLIB"; then - echo "$ac_t""$RANLIB" 1>&6 -else - echo "$ac_t""no" 1>&6 -fi - -else - RANLIB=":" -fi -fi - -# Find a good install program. We prefer a C program (faster), -# so one script is as good as another. But avoid the broken or -# incompatible versions: -# SysV /etc/install, /usr/sbin/install -# SunOS /usr/etc/install -# IRIX /sbin/install -# AIX /bin/install -# AFS /usr/afsws/bin/install, which mishandles nonexistent args -# SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff" -# ./install, which can be erroneously created by make from ./install.sh. -echo $ac_n "checking for a BSD compatible install""... $ac_c" 1>&6 -if test -z "$INSTALL"; then -if eval "test \"`echo '$''{'ac_cv_path_install'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:" - for ac_dir in $PATH; do - # Account for people who put trailing slashes in PATH elements. - case "$ac_dir/" in - /|./|.//|/etc/*|/usr/sbin/*|/usr/etc/*|/sbin/*|/usr/afsws/bin/*|/usr/ucb/*) ;; - *) - # OSF1 and SCO ODT 3.0 have their own names for install. - for ac_prog in ginstall installbsd scoinst install; do - if test -f $ac_dir/$ac_prog; then - if test $ac_prog = install && - grep dspmsg $ac_dir/$ac_prog >/dev/null 2>&1; then - # AIX install. It has an incompatible calling convention. - # OSF/1 installbsd also uses dspmsg, but is usable. - : - else - ac_cv_path_install="$ac_dir/$ac_prog -c" - break 2 - fi - fi - done - ;; - esac - done - IFS="$ac_save_ifs" - -fi - if test "${ac_cv_path_install+set}" = set; then - INSTALL="$ac_cv_path_install" - else - # As a last resort, use the slow shell script. We don't cache a - # path for INSTALL within a source directory, because that will - # break other packages using the cache if that directory is - # removed, or if the path is relative. - INSTALL="$ac_install_sh" - fi -fi -echo "$ac_t""$INSTALL" 1>&6 - -# Use test -z because SunOS4 sh mishandles braces in ${var-val}. -# It thinks the first close brace ends the variable substitution. -test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}' - -test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644' - - -if test "${shared}" = "true"; then - if test "${GCC}" != "yes" && test "${shared_non_gcc}" != "yes"; then - echo "configure: warning: opcodes --enable-shared only supported when using gcc" 1>&2 - shared=false - ALLLIBS='$(TARGETLIB)' - PICFLAG= - SHLIB=unused-shlib - fi -fi - - - - - - -if test "${commonbfdlib}" = "true"; then - COMMON_SHLIB=yes - # Rebuild the shared library if libiberty or libbfd changes. - SHLIB_DEP="../libiberty/libiberty.a ../bfd/libbfd.a" -else - COMMON_SHLIB= - SHLIB_DEP= -fi - - - - -echo $ac_n "checking how to run the C preprocessor""... $ac_c" 1>&6 -# On Suns, sometimes $CPP names a directory. -if test -n "$CPP" && test -d "$CPP"; then - CPP= -fi -if test -z "$CPP"; then -if eval "test \"`echo '$''{'ac_cv_prog_CPP'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - # This must be in double quotes, not single quotes, because CPP may get - # substituted into the Makefile and "${CC-cc}" will confuse make. - CPP="${CC-cc} -E" - # On the NeXT, cc -E runs the code through the compiler's parser, - # not just through cpp. - cat > conftest.$ac_ext <<EOF -#line 1045 "configure" -#include "confdefs.h" -#include <assert.h> -Syntax Error -EOF -ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" -{ (eval echo configure:1051: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } -ac_err=`grep -v '^ *+' conftest.out` -if test -z "$ac_err"; then - : -else - echo "$ac_err" >&5 - rm -rf conftest* - CPP="${CC-cc} -E -traditional-cpp" - cat > conftest.$ac_ext <<EOF -#line 1060 "configure" -#include "confdefs.h" -#include <assert.h> -Syntax Error -EOF -ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" -{ (eval echo configure:1066: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } -ac_err=`grep -v '^ *+' conftest.out` -if test -z "$ac_err"; then - : -else - echo "$ac_err" >&5 - rm -rf conftest* - CPP=/lib/cpp -fi -rm -f conftest* -fi -rm -f conftest* - ac_cv_prog_CPP="$CPP" -fi - CPP="$ac_cv_prog_CPP" -else - ac_cv_prog_CPP="$CPP" -fi -echo "$ac_t""$CPP" 1>&6 - -for ac_hdr in string.h strings.h -do -ac_safe=`echo "$ac_hdr" | tr './\055' '___'` -echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6 -if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - cat > conftest.$ac_ext <<EOF -#line 1094 "configure" -#include "confdefs.h" -#include <$ac_hdr> -EOF -ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" -{ (eval echo configure:1099: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } -ac_err=`grep -v '^ *+' conftest.out` -if test -z "$ac_err"; then - rm -rf conftest* - eval "ac_cv_header_$ac_safe=yes" -else - echo "$ac_err" >&5 - rm -rf conftest* - eval "ac_cv_header_$ac_safe=no" -fi -rm -f conftest* -fi -if eval "test \"`echo '$ac_cv_header_'$ac_safe`\" = yes"; then - echo "$ac_t""yes" 1>&6 - ac_tr_hdr=HAVE_`echo $ac_hdr | tr 'abcdefghijklmnopqrstuvwxyz./\055' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ___'` - cat >> confdefs.h <<EOF -#define $ac_tr_hdr 1 -EOF - -else - echo "$ac_t""no" 1>&6 -fi -done - - -# target-specific stuff: - -# Canonicalize the secondary target names. -if test -n "$enable_targets" ; then - for targ in `echo $enable_targets | sed 's/,/ /g'` - do - result=`$ac_config_sub $targ 2>/dev/null` - if test -n "$result" ; then - canon_targets="$canon_targets $result" - else - # Allow targets that config.sub doesn't recognize, like "all". - canon_targets="$canon_targets $targ" - fi - done -fi - -all_targets=false -selarchs= -for targ in $target $canon_targets -do - if test "x$targ" = "xall" ; then - all_targets=true - else - . $srcdir/../bfd/config.bfd - selarchs="$selarchs $targ_archs" - fi -done - -# We don't do any links based on the target system, just makefile config. - -if test x${all_targets} = xfalse ; then - - # Target architecture .o files. - ta= - - for arch in $selarchs - do - ad=`echo $arch | sed -e s/bfd_//g -e s/_arch//g` - archdefs="$archdefs -DARCH_$ad" - case "$arch" in - bfd_a29k_arch) ta="$ta a29k-dis.o" ;; - bfd_alliant_arch) ;; - bfd_alpha_arch) ta="$ta alpha-dis.o" ;; - bfd_arm_arch) ta="$ta arm-dis.o" ;; - bfd_convex_arch) ;; - bfd_h8300_arch) ta="$ta h8300-dis.o" ;; - bfd_h8500_arch) ta="$ta h8500-dis.o" ;; - bfd_hppa_arch) ta="$ta hppa-dis.o" ;; - bfd_i386_arch) ta="$ta i386-dis.o" ;; - bfd_i860_arch) ;; - bfd_i960_arch) ta="$ta i960-dis.o" ;; - bfd_m68k_arch) ta="$ta m68k-dis.o m68k-opc.o" ;; - bfd_m88k_arch) ta="$ta m88k-dis.o" ;; - bfd_mips_arch) ta="$ta mips-dis.o mips-opc.o" ;; - bfd_ns32k_arch) ta="$ta ns32k-dis.o" ;; - bfd_powerpc_arch) ta="$ta ppc-dis.o ppc-opc.o" ;; - bfd_pyramid_arch) ;; - bfd_romp_arch) ;; - bfd_rs6000_arch) ta="$ta ppc-dis.o ppc-opc.o" ;; - bfd_sh_arch) ta="$ta sh-dis.o" ;; - bfd_sparc_arch) ta="$ta sparc-dis.o sparc-opc.o" ;; - bfd_tahoe_arch) ;; - bfd_vax_arch) ;; - bfd_w65_arch) ta="$ta w65-dis.o" ;; - bfd_we32k_arch) ;; - bfd_z8k_arch) ta="$ta z8k-dis.o" ;; - - "") ;; - *) { echo "configure: error: *** unknown target architecture $arch" 1>&2; exit 1; } ;; - esac - done - - # Weed out duplicate .o files. - f="" - for i in $ta ; do - case " $f " in - *" $i "*) ;; - *) f="$f $i" ;; - esac - done - ta="$f" - - # And duplicate -D flags. - f="" - for i in $archdefs ; do - case " $f " in - *" $i "*) ;; - *) f="$f $i" ;; - esac - done - archdefs="$f" - - BFD_MACHINES="$ta" - -else # all_targets is true - archdefs=-DARCH_all - BFD_MACHINES='$(ALL_MACHINES)' -fi - - - - -trap '' 1 2 15 -cat > confcache <<\EOF -# This file is a shell script that caches the results of configure -# tests run on this system so they can be shared between configure -# scripts and configure runs. It is not useful on other systems. -# If it contains results you don't want to keep, you may remove or edit it. -# -# By default, configure uses ./config.cache as the cache file, -# creating it if it does not exist already. You can give configure -# the --cache-file=FILE option to use a different cache file; that is -# what configure does when it calls configure scripts in -# subdirectories, so they share the cache. -# Giving --cache-file=/dev/null disables caching, for debugging configure. -# config.status only pays attention to the cache file if you give it the -# --recheck option to rerun configure. -# -EOF -# Ultrix sh set writes to stderr and can't be redirected directly, -# and sets the high bit in the cache file unless we assign to the vars. -(set) 2>&1 | - sed -n "s/^\([a-zA-Z0-9_]*_cv_[a-zA-Z0-9_]*\)=\(.*\)/\1=\${\1='\2'}/p" \ - >> confcache -if cmp -s $cache_file confcache; then - : -else - if test -w $cache_file; then - echo "updating cache $cache_file" - cat confcache > $cache_file - else - echo "not updating unwritable cache $cache_file" - fi -fi -rm -f confcache - -trap 'rm -fr conftest* confdefs* core core.* *.core $ac_clean_files; exit 1' 1 2 15 - -test "x$prefix" = xNONE && prefix=$ac_default_prefix -# Let make expand exec_prefix. -test "x$exec_prefix" = xNONE && exec_prefix='${prefix}' - -# Any assignment to VPATH causes Sun make to only execute -# the first set of double-colon rules, so remove it if not needed. -# If there is a colon in the path, we need to keep it. -if test "x$srcdir" = x.; then - ac_vpsub='/^[ ]*VPATH[ ]*=[^:]*$/d' -fi - -trap 'rm -f $CONFIG_STATUS conftest*; exit 1' 1 2 15 - -DEFS=-DHAVE_CONFIG_H - -# Without the "./", some shells look in PATH for config.status. -: ${CONFIG_STATUS=./config.status} - -echo creating $CONFIG_STATUS -rm -f $CONFIG_STATUS -cat > $CONFIG_STATUS <<EOF -#! /bin/sh -# Generated automatically by configure. -# Run this file to recreate the current configuration. -# This directory was configured as follows, -# on host `(hostname || uname -n) 2>/dev/null | sed 1q`: -# -# $0 $ac_configure_args -# -# Compiler output produced by configure, useful for debugging -# configure, is in ./config.log if it exists. - -ac_cs_usage="Usage: $CONFIG_STATUS [--recheck] [--version] [--help]" -for ac_option -do - case "\$ac_option" in - -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) - echo "running \${CONFIG_SHELL-/bin/sh} $0 $ac_configure_args --no-create --no-recursion" - exec \${CONFIG_SHELL-/bin/sh} $0 $ac_configure_args --no-create --no-recursion ;; - -version | --version | --versio | --versi | --vers | --ver | --ve | --v) - echo "$CONFIG_STATUS generated by autoconf version 2.8" - exit 0 ;; - -help | --help | --hel | --he | --h) - echo "\$ac_cs_usage"; exit 0 ;; - *) echo "\$ac_cs_usage"; exit 1 ;; - esac -done - -ac_given_srcdir=$srcdir -ac_given_INSTALL="$INSTALL" - -trap 'rm -fr `echo "Makefile config.h:config.in" | sed "s/:[^ ]*//g"` conftest*; exit 1' 1 2 15 -EOF -cat >> $CONFIG_STATUS <<EOF - -# Protect against being on the right side of a sed subst in config.status. -sed 's/%@/@@/; s/@%/@@/; s/%g\$/@g/; /@g\$/s/[\\\\&%]/\\\\&/g; - s/@@/%@/; s/@@/@%/; s/@g\$/%g/' > conftest.subs <<\\CEOF -$ac_vpsub -$extrasub -s%@CFLAGS@%$CFLAGS%g -s%@CPPFLAGS@%$CPPFLAGS%g -s%@CXXFLAGS@%$CXXFLAGS%g -s%@DEFS@%$DEFS%g -s%@LDFLAGS@%$LDFLAGS%g -s%@LIBS@%$LIBS%g -s%@exec_prefix@%$exec_prefix%g -s%@prefix@%$prefix%g -s%@program_transform_name@%$program_transform_name%g -s%@bindir@%$bindir%g -s%@sbindir@%$sbindir%g -s%@libexecdir@%$libexecdir%g -s%@datadir@%$datadir%g -s%@sysconfdir@%$sysconfdir%g -s%@sharedstatedir@%$sharedstatedir%g -s%@localstatedir@%$localstatedir%g -s%@libdir@%$libdir%g -s%@includedir@%$includedir%g -s%@oldincludedir@%$oldincludedir%g -s%@infodir@%$infodir%g -s%@mandir@%$mandir%g -s%@host@%$host%g -s%@host_alias@%$host_alias%g -s%@host_cpu@%$host_cpu%g -s%@host_vendor@%$host_vendor%g -s%@host_os@%$host_os%g -s%@target@%$target%g -s%@target_alias@%$target_alias%g -s%@target_cpu@%$target_cpu%g -s%@target_vendor@%$target_vendor%g -s%@target_os@%$target_os%g -s%@build@%$build%g -s%@build_alias@%$build_alias%g -s%@build_cpu@%$build_cpu%g -s%@build_vendor@%$build_vendor%g -s%@build_os@%$build_os%g -s%@CC@%$CC%g -s%@HDEFINES@%$HDEFINES%g -s%@AR@%$AR%g -s%@RANLIB@%$RANLIB%g -s%@INSTALL_PROGRAM@%$INSTALL_PROGRAM%g -s%@INSTALL_DATA@%$INSTALL_DATA%g -s%@ALLLIBS@%$ALLLIBS%g -s%@PICFLAG@%$PICFLAG%g -s%@SHLIB@%$SHLIB%g -s%@SHLIB_CC@%$SHLIB_CC%g -s%@SHLIB_CFLAGS@%$SHLIB_CFLAGS%g -s%@COMMON_SHLIB@%$COMMON_SHLIB%g -s%@SHLIB_DEP@%$SHLIB_DEP%g -s%@SHLINK@%$SHLINK%g -s%@CPP@%$CPP%g -s%@archdefs@%$archdefs%g -s%@BFD_MACHINES@%$BFD_MACHINES%g - -CEOF -EOF -cat >> $CONFIG_STATUS <<EOF - -CONFIG_FILES=\${CONFIG_FILES-"Makefile"} -EOF -cat >> $CONFIG_STATUS <<\EOF -for ac_file in .. $CONFIG_FILES; do if test "x$ac_file" != x..; then - # Support "outfile[:infile]", defaulting infile="outfile.in". - case "$ac_file" in - *:*) ac_file_in=`echo "$ac_file"|sed 's%.*:%%'` - ac_file=`echo "$ac_file"|sed 's%:.*%%'` ;; - *) ac_file_in="${ac_file}.in" ;; - esac - - # Adjust relative srcdir, etc. for subdirectories. - - # Remove last slash and all that follows it. Not all systems have dirname. - ac_dir=`echo $ac_file|sed 's%/[^/][^/]*$%%'` - if test "$ac_dir" != "$ac_file" && test "$ac_dir" != .; then - # The file is in a subdirectory. - test ! -d "$ac_dir" && mkdir "$ac_dir" - ac_dir_suffix="/`echo $ac_dir|sed 's%^\./%%'`" - # A "../" for each directory in $ac_dir_suffix. - ac_dots=`echo $ac_dir_suffix|sed 's%/[^/]*%../%g'` - else - ac_dir_suffix= ac_dots= - fi - - case "$ac_given_srcdir" in - .) srcdir=. - if test -z "$ac_dots"; then top_srcdir=. - else top_srcdir=`echo $ac_dots|sed 's%/$%%'`; fi ;; - /*) srcdir="$ac_given_srcdir$ac_dir_suffix"; top_srcdir="$ac_given_srcdir" ;; - *) # Relative path. - srcdir="$ac_dots$ac_given_srcdir$ac_dir_suffix" - top_srcdir="$ac_dots$ac_given_srcdir" ;; - esac - - case "$ac_given_INSTALL" in - [/$]*) INSTALL="$ac_given_INSTALL" ;; - *) INSTALL="$ac_dots$ac_given_INSTALL" ;; - esac - echo creating "$ac_file" - rm -f "$ac_file" - configure_input="Generated automatically from `echo $ac_file_in|sed 's%.*/%%'` by configure." - case "$ac_file" in - *Makefile*) ac_comsub="1i\\ -# $configure_input" ;; - *) ac_comsub= ;; - esac - sed -e "$ac_comsub -s%@configure_input@%$configure_input%g -s%@srcdir@%$srcdir%g -s%@top_srcdir@%$top_srcdir%g -s%@INSTALL@%$INSTALL%g -" -f conftest.subs $ac_given_srcdir/$ac_file_in > $ac_file -fi; done -rm -f conftest.subs - -# These sed commands are passed to sed as "A NAME B NAME C VALUE D", where -# NAME is the cpp macro being defined and VALUE is the value it is being given. -# -# ac_d sets the value in "#define NAME VALUE" lines. -ac_dA='s%^\([ ]*\)#\([ ]*define[ ][ ]*\)' -ac_dB='\([ ][ ]*\)[^ ]*%\1#\2' -ac_dC='\3' -ac_dD='%g' -# ac_u turns "#undef NAME" with trailing blanks into "#define NAME VALUE". -ac_uA='s%^\([ ]*\)#\([ ]*\)undef\([ ][ ]*\)' -ac_uB='\([ ]\)%\1#\2define\3' -ac_uC=' ' -ac_uD='\4%g' -# ac_e turns "#undef NAME" without trailing blanks into "#define NAME VALUE". -ac_eA='s%^\([ ]*\)#\([ ]*\)undef\([ ][ ]*\)' -ac_eB='$%\1#\2define\3' -ac_eC=' ' -ac_eD='%g' - -CONFIG_HEADERS=${CONFIG_HEADERS-"config.h:config.in"} -for ac_file in .. $CONFIG_HEADERS; do if test "x$ac_file" != x..; then - # Support "outfile[:infile]", defaulting infile="outfile.in". - case "$ac_file" in - *:*) ac_file_in=`echo "$ac_file"|sed 's%.*:%%'` - ac_file=`echo "$ac_file"|sed 's%:.*%%'` ;; - *) ac_file_in="${ac_file}.in" ;; - esac - - echo creating $ac_file - - rm -f conftest.frag conftest.in conftest.out - cp $ac_given_srcdir/$ac_file_in conftest.in - -EOF - -# Transform confdefs.h into a sed script conftest.vals that substitutes -# the proper values into config.h.in to produce config.h. And first: -# Protect against being on the right side of a sed subst in config.status. -# Protect against being in an unquoted here document in config.status. -rm -f conftest.vals -cat > conftest.hdr <<\EOF -s/[\\&%]/\\&/g -s%[\\$`]%\\&%g -s%#define \([A-Za-z_][A-Za-z0-9_]*\) \(.*\)%${ac_dA}\1${ac_dB}\1${ac_dC}\2${ac_dD}%gp -s%ac_d%ac_u%gp -s%ac_u%ac_e%gp -EOF -sed -n -f conftest.hdr confdefs.h > conftest.vals -rm -f conftest.hdr - -# This sed command replaces #undef with comments. This is necessary, for -# example, in the case of _POSIX_SOURCE, which is predefined and required -# on some systems where configure will not decide to define it. -cat >> conftest.vals <<\EOF -s%^[ ]*#[ ]*undef[ ][ ]*[a-zA-Z_][a-zA-Z_0-9]*%/* & */% -EOF - -# Break up conftest.vals because some shells have a limit on -# the size of here documents, and old seds have small limits too. -# Maximum number of lines to put in a single here document. -ac_max_here_lines=12 - -rm -f conftest.tail -while : -do - ac_lines=`grep -c . conftest.vals` - # grep -c gives empty output for an empty file on some AIX systems. - if test -z "$ac_lines" || test "$ac_lines" -eq 0; then break; fi - # Write a limited-size here document to conftest.frag. - echo ' cat > conftest.frag <<CEOF' >> $CONFIG_STATUS - sed ${ac_max_here_lines}q conftest.vals >> $CONFIG_STATUS - echo 'CEOF - sed -f conftest.frag conftest.in > conftest.out - rm -f conftest.in - mv conftest.out conftest.in -' >> $CONFIG_STATUS - sed 1,${ac_max_here_lines}d conftest.vals > conftest.tail - rm -f conftest.vals - mv conftest.tail conftest.vals -done -rm -f conftest.vals - -cat >> $CONFIG_STATUS <<\EOF - rm -f conftest.frag conftest.h - echo "/* $ac_file. Generated automatically by configure. */" > conftest.h - cat conftest.in >> conftest.h - rm -f conftest.in - if cmp -s $ac_file conftest.h 2>/dev/null; then - echo "$ac_file is unchanged" - rm -f conftest.h - else - rm -f $ac_file - mv conftest.h $ac_file - fi -fi; done - - -case x$CONFIG_HEADERS in xconfig.h:config.in) echo > stamp-h ;; esac -exit 0 -EOF -chmod +x $CONFIG_STATUS -rm -fr confdefs* $ac_clean_files -test "$no_create" = yes || ${CONFIG_SHELL-/bin/sh} $CONFIG_STATUS || exit 1 - diff --git a/contrib/gdb/opcodes/configure.in b/contrib/gdb/opcodes/configure.in deleted file mode 100644 index e0c4f58e7c290..0000000000000 --- a/contrib/gdb/opcodes/configure.in +++ /dev/null @@ -1,216 +0,0 @@ -AC_PREREQ(2.0) -AC_INIT(z8k-dis.c) -# configure.in script for the opcodes library. -# Copyright (C) 1995, 1996 Free Software Foundation, Inc. -# Written by Cygnus Support. -# -# 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 2 of the License, 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - -AC_ARG_ENABLE(targets, -[ --enable-targets alternative target configurations], -[case "${enableval}" in - yes | "") AC_ERROR(enable-targets option must specify target names or 'all') - ;; - no) enable_targets= ;; - *) enable_targets=$enableval ;; -esac])dnl -AC_ARG_ENABLE(shared, -[ --enable-shared build shared opcodes library], -[case "${enableval}" in - yes) shared=true ;; - no) shared=false ;; - *) AC_MSG_ERROR([bad value ${enableval} for opcodes shared option]) ;; -esac])dnl -AC_ARG_ENABLE(commonbfdlib, -[ --enable-commonbfdlib build shared BFD/opcodes/libiberty library], -[case "${enableval}" in - yes) commonbfdlib=true ;; - no) commonbfdlib=false ;; - *) AC_MSG_ERROR([bad value ${enableval} for opcodes commonbfdlib option]) ;; -esac])dnl - -AC_CONFIG_HEADER(config.h:config.in) - -AC_CONFIG_AUX_DIR(`cd $srcdir/..;pwd`) -AC_CANONICAL_SYSTEM -if test -z "$target" ; then - AC_MSG_ERROR(Unrecognized target system type; please check config.sub.) -fi -AC_ARG_PROGRAM - -# host-specific stuff: - -ALLLIBS='$(TARGETLIB)' -PICFLAG= -SHLIB=unused-shlib -SHLINK=unused-shlink -if test "${shared}" = "true"; then - ALLLIBS='$(TARGETLIB) $(SHLIB) $(SHLINK)' - PICFLAG=-fpic - if test "${commonbfdlib}" = "true"; then -changequote(,)dnl - SHLIB=../bfd/libbfd.so.`sed -e 's/[^0-9]*\([0-9.]*\).*/\1/' ${srcdir}/../bfd/VERSION` -changequote([,])dnl - SHLINK=../bfd/libbfd.so - else -changequote(,)dnl - SHLIB=libopcodes.so.`sed -e 's/[^0-9]*\([0-9.]*\).*/\1/' ${srcdir}/../bfd/VERSION` -changequote([,])dnl - SHLINK=libopcodes.so - fi -fi - -AC_PROG_CC - -. ${srcdir}/../bfd/configure.host - -AC_SUBST(HDEFINES) -AC_CHECK_TOOL(AR, ar) -AC_CHECK_TOOL(RANLIB, ranlib, :) -AC_PROG_INSTALL - -if test "${shared}" = "true"; then - if test "${GCC}" != "yes" && test "${shared_non_gcc}" != "yes"; then - AC_MSG_WARN([opcodes --enable-shared only supported when using gcc]) - shared=false - ALLLIBS='$(TARGETLIB)' - PICFLAG= - SHLIB=unused-shlib - fi -fi - -AC_SUBST(ALLLIBS) -AC_SUBST(PICFLAG) -AC_SUBST(SHLIB) -AC_SUBST(SHLIB_CC) -AC_SUBST(SHLIB_CFLAGS) -if test "${commonbfdlib}" = "true"; then - COMMON_SHLIB=yes - # Rebuild the shared library if libiberty or libbfd changes. - SHLIB_DEP="../libiberty/libiberty.a ../bfd/libbfd.a" -else - COMMON_SHLIB= - SHLIB_DEP= -fi -AC_SUBST(COMMON_SHLIB) -AC_SUBST(SHLIB_DEP) -AC_SUBST(SHLINK) - -AC_CHECK_HEADERS(string.h strings.h) - -# target-specific stuff: - -# Canonicalize the secondary target names. -if test -n "$enable_targets" ; then - for targ in `echo $enable_targets | sed 's/,/ /g'` - do - result=`$ac_config_sub $targ 2>/dev/null` - if test -n "$result" ; then - canon_targets="$canon_targets $result" - else - # Allow targets that config.sub doesn't recognize, like "all". - canon_targets="$canon_targets $targ" - fi - done -fi - -all_targets=false -selarchs= -for targ in $target $canon_targets -do - if test "x$targ" = "xall" ; then - all_targets=true - else - . $srcdir/../bfd/config.bfd - selarchs="$selarchs $targ_archs" - fi -done - -# We don't do any links based on the target system, just makefile config. - -if test x${all_targets} = xfalse ; then - - # Target architecture .o files. - ta= - - for arch in $selarchs - do - ad=`echo $arch | sed -e s/bfd_//g -e s/_arch//g` - archdefs="$archdefs -DARCH_$ad" - case "$arch" in - bfd_a29k_arch) ta="$ta a29k-dis.o" ;; - bfd_alliant_arch) ;; - bfd_alpha_arch) ta="$ta alpha-dis.o" ;; - bfd_arm_arch) ta="$ta arm-dis.o" ;; - bfd_convex_arch) ;; - bfd_h8300_arch) ta="$ta h8300-dis.o" ;; - bfd_h8500_arch) ta="$ta h8500-dis.o" ;; - bfd_hppa_arch) ta="$ta hppa-dis.o" ;; - bfd_i386_arch) ta="$ta i386-dis.o" ;; - bfd_i860_arch) ;; - bfd_i960_arch) ta="$ta i960-dis.o" ;; - bfd_m68k_arch) ta="$ta m68k-dis.o m68k-opc.o" ;; - bfd_m88k_arch) ta="$ta m88k-dis.o" ;; - bfd_mips_arch) ta="$ta mips-dis.o mips-opc.o" ;; - bfd_ns32k_arch) ta="$ta ns32k-dis.o" ;; - bfd_powerpc_arch) ta="$ta ppc-dis.o ppc-opc.o" ;; - bfd_pyramid_arch) ;; - bfd_romp_arch) ;; - bfd_rs6000_arch) ta="$ta ppc-dis.o ppc-opc.o" ;; - bfd_sh_arch) ta="$ta sh-dis.o" ;; - bfd_sparc_arch) ta="$ta sparc-dis.o sparc-opc.o" ;; - bfd_tahoe_arch) ;; - bfd_vax_arch) ;; - bfd_w65_arch) ta="$ta w65-dis.o" ;; - bfd_we32k_arch) ;; - bfd_z8k_arch) ta="$ta z8k-dis.o" ;; - - "") ;; - *) AC_MSG_ERROR(*** unknown target architecture $arch) ;; - esac - done - - # Weed out duplicate .o files. - f="" - for i in $ta ; do - case " $f " in - *" $i "*) ;; - *) f="$f $i" ;; - esac - done - ta="$f" - - # And duplicate -D flags. - f="" - for i in $archdefs ; do - case " $f " in - *" $i "*) ;; - *) f="$f $i" ;; - esac - done - archdefs="$f" - - BFD_MACHINES="$ta" - -else # all_targets is true - archdefs=-DARCH_all - BFD_MACHINES='$(ALL_MACHINES)' -fi - -AC_SUBST(archdefs) -AC_SUBST(BFD_MACHINES) - -AC_OUTPUT(Makefile, -[case x$CONFIG_HEADERS in xconfig.h:config.in) echo > stamp-h ;; esac]) diff --git a/contrib/gdb/opcodes/dis-buf.c b/contrib/gdb/opcodes/dis-buf.c deleted file mode 100644 index 47a2e33ef44a9..0000000000000 --- a/contrib/gdb/opcodes/dis-buf.c +++ /dev/null @@ -1,70 +0,0 @@ -/* Disassemble from a buffer, for GNU. - Copyright (C) 1993, 1994 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 2 of the License, 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ - -#include "sysdep.h" -#include "dis-asm.h" -#include <errno.h> - -/* Get LENGTH bytes from info's buffer, at target address memaddr. - Transfer them to myaddr. */ -int -buffer_read_memory (memaddr, myaddr, length, info) - bfd_vma memaddr; - bfd_byte *myaddr; - int length; - struct disassemble_info *info; -{ - if (memaddr < info->buffer_vma - || memaddr + length > info->buffer_vma + info->buffer_length) - /* Out of bounds. Use EIO because GDB uses it. */ - return EIO; - memcpy (myaddr, info->buffer + (memaddr - info->buffer_vma), length); - return 0; -} - -/* Print an error message. We can assume that this is in response to - an error return from buffer_read_memory. */ -void -perror_memory (status, memaddr, info) - int status; - bfd_vma memaddr; - struct disassemble_info *info; -{ - if (status != EIO) - /* Can't happen. */ - (*info->fprintf_func) (info->stream, "Unknown error %d\n", status); - else - /* Actually, address between memaddr and memaddr + len was - out of bounds. */ - (*info->fprintf_func) (info->stream, - "Address 0x%x is out of bounds.\n", memaddr); -} - -/* This could be in a separate file, to save miniscule amounts of space - in statically linked executables. */ - -/* Just print the address is hex. This is included for completeness even - though both GDB and objdump provide their own (to print symbolic - addresses). */ - -void -generic_print_address (addr, info) - bfd_vma addr; - struct disassemble_info *info; -{ - (*info->fprintf_func) (info->stream, "0x%x", addr); -} diff --git a/contrib/gdb/opcodes/disassemble.c b/contrib/gdb/opcodes/disassemble.c deleted file mode 100644 index b5d37aed476ec..0000000000000 --- a/contrib/gdb/opcodes/disassemble.c +++ /dev/null @@ -1,166 +0,0 @@ -/* Select disassembly routine for specified architecture. - Copyright (C) 1994, 1995 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 2 of the License, 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ - -#include "ansidecl.h" -#include "dis-asm.h" - -#ifdef ARCH_all -#define ARCH_a29k -#define ARCH_alpha -#define ARCH_arm -#define ARCH_h8300 -#define ARCH_h8500 -#define ARCH_hppa -#define ARCH_i386 -#define ARCH_i960 -#define ARCH_m68k -#define ARCH_m88k -#define ARCH_mips -#define ARCH_ns32k -#define ARCH_powerpc -#define ARCH_rs6000 -#define ARCH_sh -#define ARCH_sparc -#define ARCH_w65 -#define ARCH_z8k -#endif - -disassembler_ftype -disassembler (abfd) - bfd *abfd; -{ - enum bfd_architecture a = bfd_get_arch (abfd); - disassembler_ftype disassemble; - - switch (a) - { - /* If you add a case to this table, also add it to the - ARCH_all definition right above this function. */ -#ifdef ARCH_a29k - case bfd_arch_a29k: - /* As far as I know we only handle big-endian 29k objects. */ - disassemble = print_insn_big_a29k; - break; -#endif -#ifdef ARCH_alpha - case bfd_arch_alpha: - disassemble = print_insn_alpha; - break; -#endif -#ifdef ARCH_arm - case bfd_arch_arm: - if (bfd_big_endian (abfd)) - disassemble = print_insn_big_arm; - else - disassemble = print_insn_little_arm; - break; -#endif -#ifdef ARCH_h8300 - case bfd_arch_h8300: - if (bfd_get_mach(abfd) == bfd_mach_h8300h) - disassemble = print_insn_h8300h; - else - disassemble = print_insn_h8300; - break; -#endif -#ifdef ARCH_h8500 - case bfd_arch_h8500: - disassemble = print_insn_h8500; - break; -#endif -#ifdef ARCH_hppa - case bfd_arch_hppa: - disassemble = print_insn_hppa; - break; -#endif -#ifdef ARCH_i386 - case bfd_arch_i386: - disassemble = print_insn_i386; - break; -#endif -#ifdef ARCH_i960 - case bfd_arch_i960: - disassemble = print_insn_i960; - break; -#endif -#ifdef ARCH_m68k - case bfd_arch_m68k: - disassemble = print_insn_m68k; - break; -#endif -#ifdef ARCH_m88k - case bfd_arch_m88k: - disassemble = print_insn_m88k; - break; -#endif -#ifdef ARCH_ns32k - case bfd_arch_ns32k: - disassemble = print_insn_ns32k; - break; -#endif -#ifdef ARCH_mips - case bfd_arch_mips: - if (bfd_big_endian (abfd)) - disassemble = print_insn_big_mips; - else - disassemble = print_insn_little_mips; - break; -#endif -#ifdef ARCH_powerpc - case bfd_arch_powerpc: - if (bfd_big_endian (abfd)) - disassemble = print_insn_big_powerpc; - else - disassemble = print_insn_little_powerpc; - break; -#endif -#ifdef ARCH_rs6000 - case bfd_arch_rs6000: - disassemble = print_insn_rs6000; - break; -#endif -#ifdef ARCH_sh - case bfd_arch_sh: - if (bfd_big_endian (abfd)) - disassemble = print_insn_sh; - else - disassemble = print_insn_shl; - break; -#endif -#ifdef ARCH_sparc - case bfd_arch_sparc: - disassemble = print_insn_sparc; - break; -#endif -#ifdef ARCH_w65 - case bfd_arch_w65: - disassemble = print_insn_w65; - break; -#endif -#ifdef ARCH_z8k - case bfd_arch_z8k: - if (bfd_get_mach(abfd) == bfd_mach_z8001) - disassemble = print_insn_z8001; - else - disassemble = print_insn_z8002; - break; -#endif - default: - return 0; - } - return disassemble; -} diff --git a/contrib/gdb/opcodes/i386-dis.c b/contrib/gdb/opcodes/i386-dis.c deleted file mode 100644 index b781edc320791..0000000000000 --- a/contrib/gdb/opcodes/i386-dis.c +++ /dev/null @@ -1,2031 +0,0 @@ -/* Print i386 instructions for GDB, the GNU debugger. - Copyright (C) 1988, 89, 91, 93, 94, 95, 1996 Free Software Foundation, Inc. - -This file is part of GDB. - -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 2 of the License, 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ - -/* - * 80386 instruction printer by Pace Willisson (pace@prep.ai.mit.edu) - * July 1988 - * modified by John Hassey (hassey@dg-rtp.dg.com) - */ - -/* - * The main tables describing the instructions is essentially a copy - * of the "Opcode Map" chapter (Appendix A) of the Intel 80386 - * Programmers Manual. Usually, there is a capital letter, followed - * by a small letter. The capital letter tell the addressing mode, - * and the small letter tells about the operand size. Refer to - * the Intel manual for details. - */ - -#include "dis-asm.h" -#include "sysdep.h" - -#define MAXLEN 20 - -#include <setjmp.h> - -struct dis_private -{ - /* Points to first byte not fetched. */ - bfd_byte *max_fetched; - bfd_byte the_buffer[MAXLEN]; - bfd_vma insn_start; - jmp_buf bailout; -}; - -/* Make sure that bytes from INFO->PRIVATE_DATA->BUFFER (inclusive) - to ADDR (exclusive) are valid. Returns 1 for success, longjmps - on error. */ -#define FETCH_DATA(info, addr) \ - ((addr) <= ((struct dis_private *)(info->private_data))->max_fetched \ - ? 1 : fetch_data ((info), (addr))) - -static int -fetch_data (info, addr) - struct disassemble_info *info; - bfd_byte *addr; -{ - int status; - struct dis_private *priv = (struct dis_private *)info->private_data; - bfd_vma start = priv->insn_start + (priv->max_fetched - priv->the_buffer); - - status = (*info->read_memory_func) (start, - priv->max_fetched, - addr - priv->max_fetched, - info); - if (status != 0) - { - (*info->memory_error_func) (status, start, info); - longjmp (priv->bailout, 1); - } - else - priv->max_fetched = addr; - return 1; -} - -#define Eb OP_E, b_mode -#define indirEb OP_indirE, b_mode -#define Gb OP_G, b_mode -#define Ev OP_E, v_mode -#define indirEv OP_indirE, v_mode -#define Ew OP_E, w_mode -#define Ma OP_E, v_mode -#define M OP_E, 0 -#define Mp OP_E, 0 /* ? */ -#define Gv OP_G, v_mode -#define Gw OP_G, w_mode -#define Rw OP_rm, w_mode -#define Rd OP_rm, d_mode -#define Ib OP_I, b_mode -#define sIb OP_sI, b_mode /* sign extened byte */ -#define Iv OP_I, v_mode -#define Iw OP_I, w_mode -#define Jb OP_J, b_mode -#define Jv OP_J, v_mode -#define ONE OP_ONE, 0 -#define Cd OP_C, d_mode -#define Dd OP_D, d_mode -#define Td OP_T, d_mode - -#define eAX OP_REG, eAX_reg -#define eBX OP_REG, eBX_reg -#define eCX OP_REG, eCX_reg -#define eDX OP_REG, eDX_reg -#define eSP OP_REG, eSP_reg -#define eBP OP_REG, eBP_reg -#define eSI OP_REG, eSI_reg -#define eDI OP_REG, eDI_reg -#define AL OP_REG, al_reg -#define CL OP_REG, cl_reg -#define DL OP_REG, dl_reg -#define BL OP_REG, bl_reg -#define AH OP_REG, ah_reg -#define CH OP_REG, ch_reg -#define DH OP_REG, dh_reg -#define BH OP_REG, bh_reg -#define AX OP_REG, ax_reg -#define DX OP_REG, dx_reg -#define indirDX OP_REG, indir_dx_reg - -#define Sw OP_SEG, w_mode -#define Ap OP_DIR, lptr -#define Av OP_DIR, v_mode -#define Ob OP_OFF, b_mode -#define Ov OP_OFF, v_mode -#define Xb OP_DSSI, b_mode -#define Xv OP_DSSI, v_mode -#define Yb OP_ESDI, b_mode -#define Yv OP_ESDI, v_mode - -#define es OP_REG, es_reg -#define ss OP_REG, ss_reg -#define cs OP_REG, cs_reg -#define ds OP_REG, ds_reg -#define fs OP_REG, fs_reg -#define gs OP_REG, gs_reg - -int OP_E(), OP_indirE(), OP_G(), OP_I(), OP_sI(), OP_REG(); -int OP_J(), OP_SEG(); -int OP_DIR(), OP_OFF(), OP_DSSI(), OP_ESDI(), OP_ONE(), OP_C(); -int OP_D(), OP_T(), OP_rm(); - -static void dofloat (), putop (), append_prefix (), set_op (); -static int get16 (), get32 (); - -#define b_mode 1 -#define v_mode 2 -#define w_mode 3 -#define d_mode 4 - -#define es_reg 100 -#define cs_reg 101 -#define ss_reg 102 -#define ds_reg 103 -#define fs_reg 104 -#define gs_reg 105 -#define eAX_reg 107 -#define eCX_reg 108 -#define eDX_reg 109 -#define eBX_reg 110 -#define eSP_reg 111 -#define eBP_reg 112 -#define eSI_reg 113 -#define eDI_reg 114 - -#define lptr 115 - -#define al_reg 116 -#define cl_reg 117 -#define dl_reg 118 -#define bl_reg 119 -#define ah_reg 120 -#define ch_reg 121 -#define dh_reg 122 -#define bh_reg 123 - -#define ax_reg 124 -#define cx_reg 125 -#define dx_reg 126 -#define bx_reg 127 -#define sp_reg 128 -#define bp_reg 129 -#define si_reg 130 -#define di_reg 131 - -#define indir_dx_reg 150 - -#define GRP1b NULL, NULL, 0 -#define GRP1S NULL, NULL, 1 -#define GRP1Ss NULL, NULL, 2 -#define GRP2b NULL, NULL, 3 -#define GRP2S NULL, NULL, 4 -#define GRP2b_one NULL, NULL, 5 -#define GRP2S_one NULL, NULL, 6 -#define GRP2b_cl NULL, NULL, 7 -#define GRP2S_cl NULL, NULL, 8 -#define GRP3b NULL, NULL, 9 -#define GRP3S NULL, NULL, 10 -#define GRP4 NULL, NULL, 11 -#define GRP5 NULL, NULL, 12 -#define GRP6 NULL, NULL, 13 -#define GRP7 NULL, NULL, 14 -#define GRP8 NULL, NULL, 15 -#define GRP9 NULL, NULL, 16 - -#define FLOATCODE 50 -#define FLOAT NULL, NULL, FLOATCODE - -struct dis386 { - char *name; - int (*op1)(); - int bytemode1; - int (*op2)(); - int bytemode2; - int (*op3)(); - int bytemode3; -}; - -struct dis386 dis386[] = { - /* 00 */ - { "addb", Eb, Gb }, - { "addS", Ev, Gv }, - { "addb", Gb, Eb }, - { "addS", Gv, Ev }, - { "addb", AL, Ib }, - { "addS", eAX, Iv }, - { "pushl", es }, - { "popl", es }, - /* 08 */ - { "orb", Eb, Gb }, - { "orS", Ev, Gv }, - { "orb", Gb, Eb }, - { "orS", Gv, Ev }, - { "orb", AL, Ib }, - { "orS", eAX, Iv }, - { "pushl", cs }, - { "(bad)" }, /* 0x0f extended opcode escape */ - /* 10 */ - { "adcb", Eb, Gb }, - { "adcS", Ev, Gv }, - { "adcb", Gb, Eb }, - { "adcS", Gv, Ev }, - { "adcb", AL, Ib }, - { "adcS", eAX, Iv }, - { "pushl", ss }, - { "popl", ss }, - /* 18 */ - { "sbbb", Eb, Gb }, - { "sbbS", Ev, Gv }, - { "sbbb", Gb, Eb }, - { "sbbS", Gv, Ev }, - { "sbbb", AL, Ib }, - { "sbbS", eAX, Iv }, - { "pushl", ds }, - { "popl", ds }, - /* 20 */ - { "andb", Eb, Gb }, - { "andS", Ev, Gv }, - { "andb", Gb, Eb }, - { "andS", Gv, Ev }, - { "andb", AL, Ib }, - { "andS", eAX, Iv }, - { "(bad)" }, /* SEG ES prefix */ - { "daa" }, - /* 28 */ - { "subb", Eb, Gb }, - { "subS", Ev, Gv }, - { "subb", Gb, Eb }, - { "subS", Gv, Ev }, - { "subb", AL, Ib }, - { "subS", eAX, Iv }, - { "(bad)" }, /* SEG CS prefix */ - { "das" }, - /* 30 */ - { "xorb", Eb, Gb }, - { "xorS", Ev, Gv }, - { "xorb", Gb, Eb }, - { "xorS", Gv, Ev }, - { "xorb", AL, Ib }, - { "xorS", eAX, Iv }, - { "(bad)" }, /* SEG SS prefix */ - { "aaa" }, - /* 38 */ - { "cmpb", Eb, Gb }, - { "cmpS", Ev, Gv }, - { "cmpb", Gb, Eb }, - { "cmpS", Gv, Ev }, - { "cmpb", AL, Ib }, - { "cmpS", eAX, Iv }, - { "(bad)" }, /* SEG DS prefix */ - { "aas" }, - /* 40 */ - { "incS", eAX }, - { "incS", eCX }, - { "incS", eDX }, - { "incS", eBX }, - { "incS", eSP }, - { "incS", eBP }, - { "incS", eSI }, - { "incS", eDI }, - /* 48 */ - { "decS", eAX }, - { "decS", eCX }, - { "decS", eDX }, - { "decS", eBX }, - { "decS", eSP }, - { "decS", eBP }, - { "decS", eSI }, - { "decS", eDI }, - /* 50 */ - { "pushS", eAX }, - { "pushS", eCX }, - { "pushS", eDX }, - { "pushS", eBX }, - { "pushS", eSP }, - { "pushS", eBP }, - { "pushS", eSI }, - { "pushS", eDI }, - /* 58 */ - { "popS", eAX }, - { "popS", eCX }, - { "popS", eDX }, - { "popS", eBX }, - { "popS", eSP }, - { "popS", eBP }, - { "popS", eSI }, - { "popS", eDI }, - /* 60 */ - { "pusha" }, - { "popa" }, - { "boundS", Gv, Ma }, - { "arpl", Ew, Gw }, - { "(bad)" }, /* seg fs */ - { "(bad)" }, /* seg gs */ - { "(bad)" }, /* op size prefix */ - { "(bad)" }, /* adr size prefix */ - /* 68 */ - { "pushS", Iv }, /* 386 book wrong */ - { "imulS", Gv, Ev, Iv }, - { "pushl", sIb }, /* push of byte really pushes 4 bytes */ - { "imulS", Gv, Ev, Ib }, - { "insb", Yb, indirDX }, - { "insS", Yv, indirDX }, - { "outsb", indirDX, Xb }, - { "outsS", indirDX, Xv }, - /* 70 */ - { "jo", Jb }, - { "jno", Jb }, - { "jb", Jb }, - { "jae", Jb }, - { "je", Jb }, - { "jne", Jb }, - { "jbe", Jb }, - { "ja", Jb }, - /* 78 */ - { "js", Jb }, - { "jns", Jb }, - { "jp", Jb }, - { "jnp", Jb }, - { "jl", Jb }, - { "jnl", Jb }, - { "jle", Jb }, - { "jg", Jb }, - /* 80 */ - { GRP1b }, - { GRP1S }, - { "(bad)" }, - { GRP1Ss }, - { "testb", Eb, Gb }, - { "testS", Ev, Gv }, - { "xchgb", Eb, Gb }, - { "xchgS", Ev, Gv }, - /* 88 */ - { "movb", Eb, Gb }, - { "movS", Ev, Gv }, - { "movb", Gb, Eb }, - { "movS", Gv, Ev }, - { "movw", Ew, Sw }, - { "leaS", Gv, M }, - { "movw", Sw, Ew }, - { "popS", Ev }, - /* 90 */ - { "nop" }, - { "xchgS", eCX, eAX }, - { "xchgS", eDX, eAX }, - { "xchgS", eBX, eAX }, - { "xchgS", eSP, eAX }, - { "xchgS", eBP, eAX }, - { "xchgS", eSI, eAX }, - { "xchgS", eDI, eAX }, - /* 98 */ - { "cwtl" }, - { "cltd" }, - { "lcall", Ap }, - { "(bad)" }, /* fwait */ - { "pushf" }, - { "popf" }, - { "sahf" }, - { "lahf" }, - /* a0 */ - { "movb", AL, Ob }, - { "movS", eAX, Ov }, - { "movb", Ob, AL }, - { "movS", Ov, eAX }, - { "movsb", Yb, Xb }, - { "movsS", Yv, Xv }, - { "cmpsb", Yb, Xb }, - { "cmpsS", Yv, Xv }, - /* a8 */ - { "testb", AL, Ib }, - { "testS", eAX, Iv }, - { "stosb", Yb, AL }, - { "stosS", Yv, eAX }, - { "lodsb", AL, Xb }, - { "lodsS", eAX, Xv }, - { "scasb", AL, Yb }, - { "scasS", eAX, Yv }, - /* b0 */ - { "movb", AL, Ib }, - { "movb", CL, Ib }, - { "movb", DL, Ib }, - { "movb", BL, Ib }, - { "movb", AH, Ib }, - { "movb", CH, Ib }, - { "movb", DH, Ib }, - { "movb", BH, Ib }, - /* b8 */ - { "movS", eAX, Iv }, - { "movS", eCX, Iv }, - { "movS", eDX, Iv }, - { "movS", eBX, Iv }, - { "movS", eSP, Iv }, - { "movS", eBP, Iv }, - { "movS", eSI, Iv }, - { "movS", eDI, Iv }, - /* c0 */ - { GRP2b }, - { GRP2S }, - { "ret", Iw }, - { "ret" }, - { "lesS", Gv, Mp }, - { "ldsS", Gv, Mp }, - { "movb", Eb, Ib }, - { "movS", Ev, Iv }, - /* c8 */ - { "enter", Iw, Ib }, - { "leave" }, - { "lret", Iw }, - { "lret" }, - { "int3" }, - { "int", Ib }, - { "into" }, - { "iret" }, - /* d0 */ - { GRP2b_one }, - { GRP2S_one }, - { GRP2b_cl }, - { GRP2S_cl }, - { "aam", Ib }, - { "aad", Ib }, - { "(bad)" }, - { "xlat" }, - /* d8 */ - { FLOAT }, - { FLOAT }, - { FLOAT }, - { FLOAT }, - { FLOAT }, - { FLOAT }, - { FLOAT }, - { FLOAT }, - /* e0 */ - { "loopne", Jb }, - { "loope", Jb }, - { "loop", Jb }, - { "jCcxz", Jb }, - { "inb", AL, Ib }, - { "inS", eAX, Ib }, - { "outb", Ib, AL }, - { "outS", Ib, eAX }, - /* e8 */ - { "call", Av }, - { "jmp", Jv }, - { "ljmp", Ap }, - { "jmp", Jb }, - { "inb", AL, indirDX }, - { "inS", eAX, indirDX }, - { "outb", indirDX, AL }, - { "outS", indirDX, eAX }, - /* f0 */ - { "(bad)" }, /* lock prefix */ - { "(bad)" }, - { "(bad)" }, /* repne */ - { "(bad)" }, /* repz */ - { "hlt" }, - { "cmc" }, - { GRP3b }, - { GRP3S }, - /* f8 */ - { "clc" }, - { "stc" }, - { "cli" }, - { "sti" }, - { "cld" }, - { "std" }, - { GRP4 }, - { GRP5 }, -}; - -struct dis386 dis386_twobyte[] = { - /* 00 */ - { GRP6 }, - { GRP7 }, - { "larS", Gv, Ew }, - { "lslS", Gv, Ew }, - { "(bad)" }, - { "(bad)" }, - { "clts" }, - { "(bad)" }, - /* 08 */ - { "invd" }, - { "wbinvd" }, - { "(bad)" }, { "ud2a" }, - { "(bad)" }, { "(bad)" }, { "(bad)" }, { "(bad)" }, - /* 10 */ - { "(bad)" }, { "(bad)" }, { "(bad)" }, { "(bad)" }, - { "(bad)" }, { "(bad)" }, { "(bad)" }, { "(bad)" }, - /* 18 */ - { "(bad)" }, { "(bad)" }, { "(bad)" }, { "(bad)" }, - { "(bad)" }, { "(bad)" }, { "(bad)" }, { "(bad)" }, - /* 20 */ - /* these are all backward in appendix A of the intel book */ - { "movl", Rd, Cd }, - { "movl", Rd, Dd }, - { "movl", Cd, Rd }, - { "movl", Dd, Rd }, - { "movl", Rd, Td }, - { "(bad)" }, - { "movl", Td, Rd }, - { "(bad)" }, - /* 28 */ - { "(bad)" }, { "(bad)" }, { "(bad)" }, { "(bad)" }, - { "(bad)" }, { "(bad)" }, { "(bad)" }, { "(bad)" }, - /* 30 */ - { "wrmsr" }, { "rdtsc" }, { "rdmsr" }, { "rdpmc" }, - { "(bad)" }, { "(bad)" }, { "(bad)" }, { "(bad)" }, - /* 38 */ - { "(bad)" }, { "(bad)" }, { "(bad)" }, { "(bad)" }, - { "(bad)" }, { "(bad)" }, { "(bad)" }, { "(bad)" }, - /* 40 */ - { "cmovo", Gv,Ev }, { "cmovno", Gv,Ev }, { "cmovb", Gv,Ev }, { "cmovae", Gv,Ev }, - { "cmove", Gv,Ev }, { "cmovne", Gv,Ev }, { "cmovbe", Gv,Ev }, { "cmova", Gv,Ev }, - /* 48 */ - { "cmovs", Gv,Ev }, { "cmovns", Gv,Ev }, { "cmovp", Gv,Ev }, { "cmovnp", Gv,Ev }, - { "cmovl", Gv,Ev }, { "cmovge", Gv,Ev }, { "cmovle", Gv,Ev }, { "cmovg", Gv,Ev }, - /* 50 */ - { "(bad)" }, { "(bad)" }, { "(bad)" }, { "(bad)" }, - { "(bad)" }, { "(bad)" }, { "(bad)" }, { "(bad)" }, - /* 58 */ - { "(bad)" }, { "(bad)" }, { "(bad)" }, { "(bad)" }, - { "(bad)" }, { "(bad)" }, { "(bad)" }, { "(bad)" }, - /* 60 */ - { "(bad)" }, { "(bad)" }, { "(bad)" }, { "(bad)" }, - { "(bad)" }, { "(bad)" }, { "(bad)" }, { "(bad)" }, - /* 68 */ - { "(bad)" }, { "(bad)" }, { "(bad)" }, { "(bad)" }, - { "(bad)" }, { "(bad)" }, { "(bad)" }, { "(bad)" }, - /* 70 */ - { "(bad)" }, { "(bad)" }, { "(bad)" }, { "(bad)" }, - { "(bad)" }, { "(bad)" }, { "(bad)" }, { "(bad)" }, - /* 78 */ - { "(bad)" }, { "(bad)" }, { "(bad)" }, { "(bad)" }, - { "(bad)" }, { "(bad)" }, { "(bad)" }, { "(bad)" }, - /* 80 */ - { "jo", Jv }, - { "jno", Jv }, - { "jb", Jv }, - { "jae", Jv }, - { "je", Jv }, - { "jne", Jv }, - { "jbe", Jv }, - { "ja", Jv }, - /* 88 */ - { "js", Jv }, - { "jns", Jv }, - { "jp", Jv }, - { "jnp", Jv }, - { "jl", Jv }, - { "jge", Jv }, - { "jle", Jv }, - { "jg", Jv }, - /* 90 */ - { "seto", Eb }, - { "setno", Eb }, - { "setb", Eb }, - { "setae", Eb }, - { "sete", Eb }, - { "setne", Eb }, - { "setbe", Eb }, - { "seta", Eb }, - /* 98 */ - { "sets", Eb }, - { "setns", Eb }, - { "setp", Eb }, - { "setnp", Eb }, - { "setl", Eb }, - { "setge", Eb }, - { "setle", Eb }, - { "setg", Eb }, - /* a0 */ - { "pushl", fs }, - { "popl", fs }, - { "cpuid" }, - { "btS", Ev, Gv }, - { "shldS", Ev, Gv, Ib }, - { "shldS", Ev, Gv, CL }, - { "(bad)" }, - { "(bad)" }, - /* a8 */ - { "pushl", gs }, - { "popl", gs }, - { "rsm" }, - { "btsS", Ev, Gv }, - { "shrdS", Ev, Gv, Ib }, - { "shrdS", Ev, Gv, CL }, - { "(bad)" }, - { "imulS", Gv, Ev }, - /* b0 */ - { "cmpxchgb", Eb, Gb }, - { "cmpxchgS", Ev, Gv }, - { "lssS", Gv, Mp }, /* 386 lists only Mp */ - { "btrS", Ev, Gv }, - { "lfsS", Gv, Mp }, /* 386 lists only Mp */ - { "lgsS", Gv, Mp }, /* 386 lists only Mp */ - { "movzbS", Gv, Eb }, - { "movzwS", Gv, Ew }, - /* b8 */ - { "ud2b" }, - { "(bad)" }, - { GRP8 }, - { "btcS", Ev, Gv }, - { "bsfS", Gv, Ev }, - { "bsrS", Gv, Ev }, - { "movsbS", Gv, Eb }, - { "movswS", Gv, Ew }, - /* c0 */ - { "xaddb", Eb, Gb }, - { "xaddS", Ev, Gv }, - { "(bad)" }, - { "(bad)" }, - { "(bad)" }, - { "(bad)" }, - { "(bad)" }, - { GRP9 }, - /* c8 */ - { "bswap", eAX }, - { "bswap", eCX }, - { "bswap", eDX }, - { "bswap", eBX }, - { "bswap", eSP }, - { "bswap", eBP }, - { "bswap", eSI }, - { "bswap", eDI }, - /* d0 */ - { "(bad)" }, { "(bad)" }, { "(bad)" }, { "(bad)" }, - { "(bad)" }, { "(bad)" }, { "(bad)" }, { "(bad)" }, - /* d8 */ - { "(bad)" }, { "(bad)" }, { "(bad)" }, { "(bad)" }, - { "(bad)" }, { "(bad)" }, { "(bad)" }, { "(bad)" }, - /* e0 */ - { "(bad)" }, { "(bad)" }, { "(bad)" }, { "(bad)" }, - { "(bad)" }, { "(bad)" }, { "(bad)" }, { "(bad)" }, - /* e8 */ - { "(bad)" }, { "(bad)" }, { "(bad)" }, { "(bad)" }, - { "(bad)" }, { "(bad)" }, { "(bad)" }, { "(bad)" }, - /* f0 */ - { "(bad)" }, { "(bad)" }, { "(bad)" }, { "(bad)" }, - { "(bad)" }, { "(bad)" }, { "(bad)" }, { "(bad)" }, - /* f8 */ - { "(bad)" }, { "(bad)" }, { "(bad)" }, { "(bad)" }, - { "(bad)" }, { "(bad)" }, { "(bad)" }, { "(bad)" }, -}; - -static const unsigned char onebyte_has_modrm[256] = { - 1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0, - 1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0, - 1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0, - 1,1,1,1,0,0,0,0,1,1,1,1,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,1,1,0,0,0,0,0,1,0,1,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, - 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, - 1,1,0,0,1,1,1,1,0,0,0,0,0,0,0,0, - 1,1,1,1,0,0,0,0,1,1,1,1,1,1,1,1, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1 -}; - -static const unsigned char twobyte_has_modrm[256] = { - 1,1,1,1,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, - 1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, - 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, - 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, - 0,0,0,1,1,1,1,1,0,0,0,1,1,1,1,1, - 1,1,1,1,1,1,1,1,0,0,1,1,1,1,1,1, - 1,1,1,1,1,1,1,1,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 -}; - -static char obuf[100]; -static char *obufp; -static char scratchbuf[100]; -static unsigned char *start_codep; -static unsigned char *codep; -static disassemble_info *the_info; -static int mod; -static int rm; -static int reg; -static void oappend (); - -static char *names32[]={ - "%eax","%ecx","%edx","%ebx", "%esp","%ebp","%esi","%edi", -}; -static char *names16[] = { - "%ax","%cx","%dx","%bx","%sp","%bp","%si","%di", -}; -static char *names8[] = { - "%al","%cl","%dl","%bl","%ah","%ch","%dh","%bh", -}; -static char *names_seg[] = { - "%es","%cs","%ss","%ds","%fs","%gs","%?","%?", -}; -static char *index16[] = { - "bx+si","bx+di","bp+si","bp+di","si","di","bp","bx" -}; - -struct dis386 grps[][8] = { - /* GRP1b */ - { - { "addb", Eb, Ib }, - { "orb", Eb, Ib }, - { "adcb", Eb, Ib }, - { "sbbb", Eb, Ib }, - { "andb", Eb, Ib }, - { "subb", Eb, Ib }, - { "xorb", Eb, Ib }, - { "cmpb", Eb, Ib } - }, - /* GRP1S */ - { - { "addS", Ev, Iv }, - { "orS", Ev, Iv }, - { "adcS", Ev, Iv }, - { "sbbS", Ev, Iv }, - { "andS", Ev, Iv }, - { "subS", Ev, Iv }, - { "xorS", Ev, Iv }, - { "cmpS", Ev, Iv } - }, - /* GRP1Ss */ - { - { "addS", Ev, sIb }, - { "orS", Ev, sIb }, - { "adcS", Ev, sIb }, - { "sbbS", Ev, sIb }, - { "andS", Ev, sIb }, - { "subS", Ev, sIb }, - { "xorS", Ev, sIb }, - { "cmpS", Ev, sIb } - }, - /* GRP2b */ - { - { "rolb", Eb, Ib }, - { "rorb", Eb, Ib }, - { "rclb", Eb, Ib }, - { "rcrb", Eb, Ib }, - { "shlb", Eb, Ib }, - { "shrb", Eb, Ib }, - { "(bad)" }, - { "sarb", Eb, Ib }, - }, - /* GRP2S */ - { - { "rolS", Ev, Ib }, - { "rorS", Ev, Ib }, - { "rclS", Ev, Ib }, - { "rcrS", Ev, Ib }, - { "shlS", Ev, Ib }, - { "shrS", Ev, Ib }, - { "(bad)" }, - { "sarS", Ev, Ib }, - }, - /* GRP2b_one */ - { - { "rolb", Eb }, - { "rorb", Eb }, - { "rclb", Eb }, - { "rcrb", Eb }, - { "shlb", Eb }, - { "shrb", Eb }, - { "(bad)" }, - { "sarb", Eb }, - }, - /* GRP2S_one */ - { - { "rolS", Ev }, - { "rorS", Ev }, - { "rclS", Ev }, - { "rcrS", Ev }, - { "shlS", Ev }, - { "shrS", Ev }, - { "(bad)" }, - { "sarS", Ev }, - }, - /* GRP2b_cl */ - { - { "rolb", Eb, CL }, - { "rorb", Eb, CL }, - { "rclb", Eb, CL }, - { "rcrb", Eb, CL }, - { "shlb", Eb, CL }, - { "shrb", Eb, CL }, - { "(bad)" }, - { "sarb", Eb, CL }, - }, - /* GRP2S_cl */ - { - { "rolS", Ev, CL }, - { "rorS", Ev, CL }, - { "rclS", Ev, CL }, - { "rcrS", Ev, CL }, - { "shlS", Ev, CL }, - { "shrS", Ev, CL }, - { "(bad)" }, - { "sarS", Ev, CL } - }, - /* GRP3b */ - { - { "testb", Eb, Ib }, - { "(bad)", Eb }, - { "notb", Eb }, - { "negb", Eb }, - { "mulb", AL, Eb }, - { "imulb", AL, Eb }, - { "divb", AL, Eb }, - { "idivb", AL, Eb } - }, - /* GRP3S */ - { - { "testS", Ev, Iv }, - { "(bad)" }, - { "notS", Ev }, - { "negS", Ev }, - { "mulS", eAX, Ev }, - { "imulS", eAX, Ev }, - { "divS", eAX, Ev }, - { "idivS", eAX, Ev }, - }, - /* GRP4 */ - { - { "incb", Eb }, - { "decb", Eb }, - { "(bad)" }, - { "(bad)" }, - { "(bad)" }, - { "(bad)" }, - { "(bad)" }, - { "(bad)" }, - }, - /* GRP5 */ - { - { "incS", Ev }, - { "decS", Ev }, - { "call", indirEv }, - { "lcall", indirEv }, - { "jmp", indirEv }, - { "ljmp", indirEv }, - { "pushS", Ev }, - { "(bad)" }, - }, - /* GRP6 */ - { - { "sldt", Ew }, - { "str", Ew }, - { "lldt", Ew }, - { "ltr", Ew }, - { "verr", Ew }, - { "verw", Ew }, - { "(bad)" }, - { "(bad)" } - }, - /* GRP7 */ - { - { "sgdt", Ew }, - { "sidt", Ew }, - { "lgdt", Ew }, - { "lidt", Ew }, - { "smsw", Ew }, - { "(bad)" }, - { "lmsw", Ew }, - { "invlpg", Ew }, - }, - /* GRP8 */ - { - { "(bad)" }, - { "(bad)" }, - { "(bad)" }, - { "(bad)" }, - { "btS", Ev, Ib }, - { "btsS", Ev, Ib }, - { "btrS", Ev, Ib }, - { "btcS", Ev, Ib }, - }, - /* GRP9 */ - { - { "(bad)" }, - { "cmpxchg8b", Ev }, - { "(bad)" }, - { "(bad)" }, - { "(bad)" }, - { "(bad)" }, - { "(bad)" }, - { "(bad)" }, - } -}; - -#define PREFIX_REPZ 1 -#define PREFIX_REPNZ 2 -#define PREFIX_LOCK 4 -#define PREFIX_CS 8 -#define PREFIX_SS 0x10 -#define PREFIX_DS 0x20 -#define PREFIX_ES 0x40 -#define PREFIX_FS 0x80 -#define PREFIX_GS 0x100 -#define PREFIX_DATA 0x200 -#define PREFIX_ADR 0x400 -#define PREFIX_FWAIT 0x800 - -static int prefixes; - -static void -ckprefix () -{ - prefixes = 0; - while (1) - { - FETCH_DATA (the_info, codep + 1); - switch (*codep) - { - case 0xf3: - prefixes |= PREFIX_REPZ; - break; - case 0xf2: - prefixes |= PREFIX_REPNZ; - break; - case 0xf0: - prefixes |= PREFIX_LOCK; - break; - case 0x2e: - prefixes |= PREFIX_CS; - break; - case 0x36: - prefixes |= PREFIX_SS; - break; - case 0x3e: - prefixes |= PREFIX_DS; - break; - case 0x26: - prefixes |= PREFIX_ES; - break; - case 0x64: - prefixes |= PREFIX_FS; - break; - case 0x65: - prefixes |= PREFIX_GS; - break; - case 0x66: - prefixes |= PREFIX_DATA; - break; - case 0x67: - prefixes |= PREFIX_ADR; - break; - case 0x9b: - prefixes |= PREFIX_FWAIT; - break; - default: - return; - } - codep++; - } -} - -static int dflag; -static int aflag; - -static char op1out[100], op2out[100], op3out[100]; -static int op_address[3], op_ad, op_index[3]; -static int start_pc; - - -/* - * On the 386's of 1988, the maximum length of an instruction is 15 bytes. - * (see topic "Redundant prefixes" in the "Differences from 8086" - * section of the "Virtual 8086 Mode" chapter.) - * 'pc' should be the address of this instruction, it will - * be used to print the target address if this is a relative jump or call - * The function returns the length of this instruction in bytes. - */ - -int -print_insn_i386 (pc, info) - bfd_vma pc; - disassemble_info *info; -{ - struct dis386 *dp; - int i; - int enter_instruction; - char *first, *second, *third; - int needcomma; - unsigned char need_modrm; - - struct dis_private priv; - bfd_byte *inbuf = priv.the_buffer; - - info->private_data = (PTR) &priv; - priv.max_fetched = priv.the_buffer; - priv.insn_start = pc; - if (setjmp (priv.bailout) != 0) - /* Error return. */ - return -1; - - obuf[0] = 0; - op1out[0] = 0; - op2out[0] = 0; - op3out[0] = 0; - - op_index[0] = op_index[1] = op_index[2] = -1; - - the_info = info; - start_pc = pc; - start_codep = inbuf; - codep = inbuf; - - ckprefix (); - - FETCH_DATA (info, codep + 1); - if (*codep == 0xc8) - enter_instruction = 1; - else - enter_instruction = 0; - - obufp = obuf; - - if (prefixes & PREFIX_REPZ) - oappend ("repz "); - if (prefixes & PREFIX_REPNZ) - oappend ("repnz "); - if (prefixes & PREFIX_LOCK) - oappend ("lock "); - - if ((prefixes & PREFIX_FWAIT) - && ((*codep < 0xd8) || (*codep > 0xdf))) - { - /* fwait not followed by floating point instruction */ - (*info->fprintf_func) (info->stream, "fwait"); - return (1); - } - - /* these would be initialized to 0 if disassembling for 8086 or 286 */ - dflag = 1; - aflag = 1; - - if (prefixes & PREFIX_DATA) - dflag ^= 1; - - if (prefixes & PREFIX_ADR) - { - aflag ^= 1; - oappend ("addr16 "); - } - - if (*codep == 0x0f) - { - FETCH_DATA (info, codep + 2); - dp = &dis386_twobyte[*++codep]; - need_modrm = twobyte_has_modrm[*codep]; - } - else - { - dp = &dis386[*codep]; - need_modrm = onebyte_has_modrm[*codep]; - } - codep++; - - if (need_modrm) - { - FETCH_DATA (info, codep + 1); - mod = (*codep >> 6) & 3; - reg = (*codep >> 3) & 7; - rm = *codep & 7; - } - - if (dp->name == NULL && dp->bytemode1 == FLOATCODE) - { - dofloat (); - } - else - { - if (dp->name == NULL) - dp = &grps[dp->bytemode1][reg]; - - putop (dp->name); - - obufp = op1out; - op_ad = 2; - if (dp->op1) - (*dp->op1)(dp->bytemode1); - - obufp = op2out; - op_ad = 1; - if (dp->op2) - (*dp->op2)(dp->bytemode2); - - obufp = op3out; - op_ad = 0; - if (dp->op3) - (*dp->op3)(dp->bytemode3); - } - - obufp = obuf + strlen (obuf); - for (i = strlen (obuf); i < 6; i++) - oappend (" "); - oappend (" "); - (*info->fprintf_func) (info->stream, "%s", obuf); - - /* enter instruction is printed with operands in the - * same order as the intel book; everything else - * is printed in reverse order - */ - if (enter_instruction) - { - first = op1out; - second = op2out; - third = op3out; - op_ad = op_index[0]; - op_index[0] = op_index[2]; - op_index[2] = op_ad; - } - else - { - first = op3out; - second = op2out; - third = op1out; - } - needcomma = 0; - if (*first) - { - if (op_index[0] != -1) - (*info->print_address_func) (op_address[op_index[0]], info); - else - (*info->fprintf_func) (info->stream, "%s", first); - needcomma = 1; - } - if (*second) - { - if (needcomma) - (*info->fprintf_func) (info->stream, ","); - if (op_index[1] != -1) - (*info->print_address_func) (op_address[op_index[1]], info); - else - (*info->fprintf_func) (info->stream, "%s", second); - needcomma = 1; - } - if (*third) - { - if (needcomma) - (*info->fprintf_func) (info->stream, ","); - if (op_index[2] != -1) - (*info->print_address_func) (op_address[op_index[2]], info); - else - (*info->fprintf_func) (info->stream, "%s", third); - } - return (codep - inbuf); -} - -char *float_mem[] = { - /* d8 */ - "fadds", - "fmuls", - "fcoms", - "fcomps", - "fsubs", - "fsubrs", - "fdivs", - "fdivrs", - /* d9 */ - "flds", - "(bad)", - "fsts", - "fstps", - "fldenv", - "fldcw", - "fNstenv", - "fNstcw", - /* da */ - "fiaddl", - "fimull", - "ficoml", - "ficompl", - "fisubl", - "fisubrl", - "fidivl", - "fidivrl", - /* db */ - "fildl", - "(bad)", - "fistl", - "fistpl", - "(bad)", - "fldt", - "(bad)", - "fstpt", - /* dc */ - "faddl", - "fmull", - "fcoml", - "fcompl", - "fsubl", - "fsubrl", - "fdivl", - "fdivrl", - /* dd */ - "fldl", - "(bad)", - "fstl", - "fstpl", - "frstor", - "(bad)", - "fNsave", - "fNstsw", - /* de */ - "fiadd", - "fimul", - "ficom", - "ficomp", - "fisub", - "fisubr", - "fidiv", - "fidivr", - /* df */ - "fild", - "(bad)", - "fist", - "fistp", - "fbld", - "fildll", - "fbstp", - "fistpll", -}; - -#define ST OP_ST, 0 -#define STi OP_STi, 0 -int OP_ST(), OP_STi(); - -#define FGRPd9_2 NULL, NULL, 0 -#define FGRPd9_4 NULL, NULL, 1 -#define FGRPd9_5 NULL, NULL, 2 -#define FGRPd9_6 NULL, NULL, 3 -#define FGRPd9_7 NULL, NULL, 4 -#define FGRPda_5 NULL, NULL, 5 -#define FGRPdb_4 NULL, NULL, 6 -#define FGRPde_3 NULL, NULL, 7 -#define FGRPdf_4 NULL, NULL, 8 - -struct dis386 float_reg[][8] = { - /* d8 */ - { - { "fadd", ST, STi }, - { "fmul", ST, STi }, - { "fcom", STi }, - { "fcomp", STi }, - { "fsub", ST, STi }, - { "fsubr", ST, STi }, - { "fdiv", ST, STi }, - { "fdivr", ST, STi }, - }, - /* d9 */ - { - { "fld", STi }, - { "fxch", STi }, - { FGRPd9_2 }, - { "(bad)" }, - { FGRPd9_4 }, - { FGRPd9_5 }, - { FGRPd9_6 }, - { FGRPd9_7 }, - }, - /* da */ - { - { "fcmovb", ST, STi }, - { "fcmove", ST, STi }, - { "fcmovbe",ST, STi }, - { "fcmovu", ST, STi }, - { "(bad)" }, - { FGRPda_5 }, - { "(bad)" }, - { "(bad)" }, - }, - /* db */ - { - { "fcmovnb",ST, STi }, - { "fcmovne",ST, STi }, - { "fcmovnbe",ST, STi }, - { "fcmovnu",ST, STi }, - { FGRPdb_4 }, - { "fucomi", ST, STi }, - { "fcomi", ST, STi }, - { "(bad)" }, - }, - /* dc */ - { - { "fadd", STi, ST }, - { "fmul", STi, ST }, - { "(bad)" }, - { "(bad)" }, - { "fsub", STi, ST }, - { "fsubr", STi, ST }, - { "fdiv", STi, ST }, - { "fdivr", STi, ST }, - }, - /* dd */ - { - { "ffree", STi }, - { "(bad)" }, - { "fst", STi }, - { "fstp", STi }, - { "fucom", STi }, - { "fucomp", STi }, - { "(bad)" }, - { "(bad)" }, - }, - /* de */ - { - { "faddp", STi, ST }, - { "fmulp", STi, ST }, - { "(bad)" }, - { FGRPde_3 }, - { "fsubp", STi, ST }, - { "fsubrp", STi, ST }, - { "fdivp", STi, ST }, - { "fdivrp", STi, ST }, - }, - /* df */ - { - { "(bad)" }, - { "(bad)" }, - { "(bad)" }, - { "(bad)" }, - { FGRPdf_4 }, - { "fucomip",ST, STi }, - { "fcomip", ST, STi }, - { "(bad)" }, - }, -}; - - -char *fgrps[][8] = { - /* d9_2 0 */ - { - "fnop","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)", - }, - - /* d9_4 1 */ - { - "fchs","fabs","(bad)","(bad)","ftst","fxam","(bad)","(bad)", - }, - - /* d9_5 2 */ - { - "fld1","fldl2t","fldl2e","fldpi","fldlg2","fldln2","fldz","(bad)", - }, - - /* d9_6 3 */ - { - "f2xm1","fyl2x","fptan","fpatan","fxtract","fprem1","fdecstp","fincstp", - }, - - /* d9_7 4 */ - { - "fprem","fyl2xp1","fsqrt","fsincos","frndint","fscale","fsin","fcos", - }, - - /* da_5 5 */ - { - "(bad)","fucompp","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)", - }, - - /* db_4 6 */ - { - "feni(287 only)","fdisi(287 only)","fNclex","fNinit", - "fNsetpm(287 only)","(bad)","(bad)","(bad)", - }, - - /* de_3 7 */ - { - "(bad)","fcompp","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)", - }, - - /* df_4 8 */ - { - "fNstsw","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)", - }, -}; - -static void -dofloat () -{ - struct dis386 *dp; - unsigned char floatop; - - floatop = codep[-1]; - - if (mod != 3) - { - putop (float_mem[(floatop - 0xd8) * 8 + reg]); - obufp = op1out; - OP_E (v_mode); - return; - } - codep++; - - dp = &float_reg[floatop - 0xd8][reg]; - if (dp->name == NULL) - { - putop (fgrps[dp->bytemode1][rm]); - /* instruction fnstsw is only one with strange arg */ - if (floatop == 0xdf - && FETCH_DATA (the_info, codep + 1) - && *codep == 0xe0) - strcpy (op1out, "%eax"); - } - else - { - putop (dp->name); - obufp = op1out; - if (dp->op1) - (*dp->op1)(dp->bytemode1); - obufp = op2out; - if (dp->op2) - (*dp->op2)(dp->bytemode2); - } -} - -/* ARGSUSED */ -int -OP_ST (ignore) - int ignore; -{ - oappend ("%st"); - return (0); -} - -/* ARGSUSED */ -int -OP_STi (ignore) - int ignore; -{ - sprintf (scratchbuf, "%%st(%d)", rm); - oappend (scratchbuf); - return (0); -} - - -/* capital letters in template are macros */ -static void -putop (template) - char *template; -{ - char *p; - - for (p = template; *p; p++) - { - switch (*p) - { - default: - *obufp++ = *p; - break; - case 'C': /* For jcxz/jecxz */ - if (aflag) - *obufp++ = 'e'; - break; - case 'N': - if ((prefixes & PREFIX_FWAIT) == 0) - *obufp++ = 'n'; - break; - case 'S': - /* operand size flag */ - if (dflag) - *obufp++ = 'l'; - else - *obufp++ = 'w'; - break; - } - } - *obufp = 0; -} - -static void -oappend (s) - char *s; -{ - strcpy (obufp, s); - obufp += strlen (s); - *obufp = 0; -} - -static void -append_prefix () -{ - if (prefixes & PREFIX_CS) - oappend ("%cs:"); - if (prefixes & PREFIX_DS) - oappend ("%ds:"); - if (prefixes & PREFIX_SS) - oappend ("%ss:"); - if (prefixes & PREFIX_ES) - oappend ("%es:"); - if (prefixes & PREFIX_FS) - oappend ("%fs:"); - if (prefixes & PREFIX_GS) - oappend ("%gs:"); -} - -int -OP_indirE (bytemode) - int bytemode; -{ - oappend ("*"); - return OP_E (bytemode); -} - -int -OP_E (bytemode) - int bytemode; -{ - int disp; - - /* skip mod/rm byte */ - codep++; - - if (mod == 3) - { - switch (bytemode) - { - case b_mode: - oappend (names8[rm]); - break; - case w_mode: - oappend (names16[rm]); - break; - case v_mode: - if (dflag) - oappend (names32[rm]); - else - oappend (names16[rm]); - break; - default: - oappend ("<bad dis table>"); - break; - } - return 0; - } - - disp = 0; - append_prefix (); - - if (aflag) /* 32 bit address mode */ - { - int havesib; - int havebase; - int base; - int index; - int scale; - - havesib = 0; - havebase = 1; - base = rm; - - if (base == 4) - { - havesib = 1; - FETCH_DATA (the_info, codep + 1); - scale = (*codep >> 6) & 3; - index = (*codep >> 3) & 7; - base = *codep & 7; - codep++; - } - - switch (mod) - { - case 0: - if (base == 5) - { - havebase = 0; - disp = get32 (); - } - break; - case 1: - FETCH_DATA (the_info, codep + 1); - disp = *(char *)codep++; - break; - case 2: - disp = get32 (); - break; - } - - if (mod != 0 || base == 5) - { - sprintf (scratchbuf, "0x%x", disp); - oappend (scratchbuf); - } - - if (havebase || (havesib && (index != 4 || scale != 0))) - { - oappend ("("); - if (havebase) - oappend (names32[base]); - if (havesib) - { - if (index != 4) - { - sprintf (scratchbuf, ",%s", names32[index]); - oappend (scratchbuf); - } - sprintf (scratchbuf, ",%d", 1 << scale); - oappend (scratchbuf); - } - oappend (")"); - } - } - else - { /* 16 bit address mode */ - switch (mod) - { - case 0: - if (rm == 6) - disp = (short) get16 (); - break; - case 1: - FETCH_DATA (the_info, codep + 1); - disp = *(char *)codep++; - break; - case 2: - disp = (short) get16 (); - break; - } - - if (mod != 0 || rm == 6) - { - sprintf (scratchbuf, "0x%x", disp); - oappend (scratchbuf); - } - - if (mod != 0 || rm != 6) - { - oappend ("("); - oappend (index16[rm]); - oappend (")"); - } - } - return 0; -} - -int -OP_G (bytemode) - int bytemode; -{ - switch (bytemode) - { - case b_mode: - oappend (names8[reg]); - break; - case w_mode: - oappend (names16[reg]); - break; - case d_mode: - oappend (names32[reg]); - break; - case v_mode: - if (dflag) - oappend (names32[reg]); - else - oappend (names16[reg]); - break; - default: - oappend ("<internal disassembler error>"); - break; - } - return (0); -} - -static int -get32 () -{ - int x = 0; - - FETCH_DATA (the_info, codep + 4); - x = *codep++ & 0xff; - x |= (*codep++ & 0xff) << 8; - x |= (*codep++ & 0xff) << 16; - x |= (*codep++ & 0xff) << 24; - return (x); -} - -static int -get16 () -{ - int x = 0; - - FETCH_DATA (the_info, codep + 2); - x = *codep++ & 0xff; - x |= (*codep++ & 0xff) << 8; - return (x); -} - -static void -set_op (op) - int op; -{ - op_index[op_ad] = op_ad; - op_address[op_ad] = op; -} - -int -OP_REG (code) - int code; -{ - char *s; - - switch (code) - { - case indir_dx_reg: s = "(%dx)"; break; - case ax_reg: case cx_reg: case dx_reg: case bx_reg: - case sp_reg: case bp_reg: case si_reg: case di_reg: - s = names16[code - ax_reg]; - break; - case es_reg: case ss_reg: case cs_reg: - case ds_reg: case fs_reg: case gs_reg: - s = names_seg[code - es_reg]; - break; - case al_reg: case ah_reg: case cl_reg: case ch_reg: - case dl_reg: case dh_reg: case bl_reg: case bh_reg: - s = names8[code - al_reg]; - break; - case eAX_reg: case eCX_reg: case eDX_reg: case eBX_reg: - case eSP_reg: case eBP_reg: case eSI_reg: case eDI_reg: - if (dflag) - s = names32[code - eAX_reg]; - else - s = names16[code - eAX_reg]; - break; - default: - s = "<internal disassembler error>"; - break; - } - oappend (s); - return (0); -} - -int -OP_I (bytemode) - int bytemode; -{ - int op; - - switch (bytemode) - { - case b_mode: - FETCH_DATA (the_info, codep + 1); - op = *codep++ & 0xff; - break; - case v_mode: - if (dflag) - op = get32 (); - else - op = get16 (); - break; - case w_mode: - op = get16 (); - break; - default: - oappend ("<internal disassembler error>"); - return (0); - } - sprintf (scratchbuf, "$0x%x", op); - oappend (scratchbuf); - return (0); -} - -int -OP_sI (bytemode) - int bytemode; -{ - int op; - - switch (bytemode) - { - case b_mode: - FETCH_DATA (the_info, codep + 1); - op = *(char *)codep++; - break; - case v_mode: - if (dflag) - op = get32 (); - else - op = (short)get16(); - break; - case w_mode: - op = (short)get16 (); - break; - default: - oappend ("<internal disassembler error>"); - return (0); - } - sprintf (scratchbuf, "$0x%x", op); - oappend (scratchbuf); - return (0); -} - -int -OP_J (bytemode) - int bytemode; -{ - int disp; - int mask = -1; - - switch (bytemode) - { - case b_mode: - FETCH_DATA (the_info, codep + 1); - disp = *(char *)codep++; - break; - case v_mode: - if (dflag) - disp = get32 (); - else - { - disp = (short)get16 (); - /* for some reason, a data16 prefix on a jump instruction - means that the pc is masked to 16 bits after the - displacement is added! */ - mask = 0xffff; - } - break; - default: - oappend ("<internal disassembler error>"); - return (0); - } - disp = (start_pc + codep - start_codep + disp) & mask; - set_op (disp); - sprintf (scratchbuf, "0x%x", disp); - oappend (scratchbuf); - return (0); -} - -/* ARGSUSED */ -int -OP_SEG (dummy) - int dummy; -{ - static char *sreg[] = { - "%es","%cs","%ss","%ds","%fs","%gs","%?","%?", - }; - - oappend (sreg[reg]); - return (0); -} - -int -OP_DIR (size) - int size; -{ - int seg, offset; - - switch (size) - { - case lptr: - if (aflag) - { - offset = get32 (); - seg = get16 (); - } - else - { - offset = get16 (); - seg = get16 (); - } - sprintf (scratchbuf, "0x%x,0x%x", seg, offset); - oappend (scratchbuf); - break; - case v_mode: - if (aflag) - offset = get32 (); - else - offset = (short)get16 (); - - offset = start_pc + codep - start_codep + offset; - set_op (offset); - sprintf (scratchbuf, "0x%x", offset); - oappend (scratchbuf); - break; - default: - oappend ("<internal disassembler error>"); - break; - } - return (0); -} - -/* ARGSUSED */ -int -OP_OFF (bytemode) - int bytemode; -{ - int off; - - if (aflag) - off = get32 (); - else - off = get16 (); - - sprintf (scratchbuf, "0x%x", off); - oappend (scratchbuf); - return (0); -} - -/* ARGSUSED */ -int -OP_ESDI (dummy) - int dummy; -{ - oappend ("%es:("); - oappend (aflag ? "%edi" : "%di"); - oappend (")"); - return (0); -} - -/* ARGSUSED */ -int -OP_DSSI (dummy) - int dummy; -{ - oappend ("%ds:("); - oappend (aflag ? "%esi" : "%si"); - oappend (")"); - return (0); -} - -/* ARGSUSED */ -int -OP_ONE (dummy) - int dummy; -{ - oappend ("1"); - return (0); -} - -/* ARGSUSED */ -int -OP_C (dummy) - int dummy; -{ - codep++; /* skip mod/rm */ - sprintf (scratchbuf, "%%cr%d", reg); - oappend (scratchbuf); - return (0); -} - -/* ARGSUSED */ -int -OP_D (dummy) - int dummy; -{ - codep++; /* skip mod/rm */ - sprintf (scratchbuf, "%%db%d", reg); - oappend (scratchbuf); - return (0); -} - -/* ARGSUSED */ -int -OP_T (dummy) - int dummy; -{ - codep++; /* skip mod/rm */ - sprintf (scratchbuf, "%%tr%d", reg); - oappend (scratchbuf); - return (0); -} - -int -OP_rm (bytemode) - int bytemode; -{ - switch (bytemode) - { - case d_mode: - oappend (names32[rm]); - break; - case w_mode: - oappend (names16[rm]); - break; - } - return (0); -} diff --git a/contrib/gdb/opcodes/sysdep.h b/contrib/gdb/opcodes/sysdep.h deleted file mode 100644 index f1556da1f2eac..0000000000000 --- a/contrib/gdb/opcodes/sysdep.h +++ /dev/null @@ -1,38 +0,0 @@ -/* Random host-dependent support code. - Copyright (C) 1995 Free Software Foundation, Inc. - Written by Ken Raeburn. - -This file is part of libopcodes, the opcodes library. - -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 2 of the License, 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ - -/* Do system-dependent stuff, mainly driven by autoconf-detected info. - - Well, some generic common stuff is done here too, like including - ansidecl.h. That's because the .h files in bfd/hosts files I'm - trying to replace often did that. If it can be dropped from this - file (check in a non-ANSI environment!), it should be. */ - -#include "config.h" - -#include <ansidecl.h> - -#ifdef HAVE_STRING_H -#include <string.h> -#else -#ifdef HAVE_STRINGS_H -#include <strings.h> -#endif -#endif diff --git a/contrib/gdb/opcodes/z8k-dis.c b/contrib/gdb/opcodes/z8k-dis.c deleted file mode 100644 index 8890e123120ca..0000000000000 --- a/contrib/gdb/opcodes/z8k-dis.c +++ /dev/null @@ -1,571 +0,0 @@ -/* -This file is part of GNU Binutils. - -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 2 of the License, 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ - -#include <ansidecl.h> -#include "sysdep.h" -#include "dis-asm.h" - -#define DEFINE_TABLE -#include "z8k-opc.h" - - -#include <setjmp.h> - - -typedef struct -{ - /* These are all indexed by nibble number (i.e only every other entry - of bytes is used, and every 4th entry of words). */ - unsigned char nibbles[24]; - unsigned char bytes[24]; - unsigned short words[24]; - - /* Nibble number of first word not yet fetched. */ - int max_fetched; - bfd_vma insn_start; - jmp_buf bailout; - - long tabl_index; - char instr_asmsrc[80]; - unsigned long arg_reg[0x0f]; - unsigned long immediate; - unsigned long displacement; - unsigned long address; - unsigned long cond_code; - unsigned long ctrl_code; - unsigned long flags; - unsigned long interrupts; -} -instr_data_s; - -/* Make sure that bytes from INFO->PRIVATE_DATA->BUFFER (inclusive) - to ADDR (exclusive) are valid. Returns 1 for success, longjmps - on error. */ -#define FETCH_DATA(info, nibble) \ - ((nibble) < ((instr_data_s *)(info->private_data))->max_fetched \ - ? 1 : fetch_data ((info), (nibble))) - -static int -fetch_data (info, nibble) - struct disassemble_info *info; - int nibble; -{ - unsigned char mybuf[20]; - int status; - instr_data_s *priv = (instr_data_s *)info->private_data; - bfd_vma start; - - if ((nibble % 4) != 0) - abort (); - - status = (*info->read_memory_func) (priv->insn_start, - (bfd_byte *) mybuf, - nibble / 2, - info); - if (status != 0) - { - (*info->memory_error_func) (status, priv->insn_start, info); - longjmp (priv->bailout, 1); - } - - { - int i; - unsigned char *p = mybuf ; - - for (i = 0; i < nibble;) - { - priv->words[i] = (p[0] << 8) | p[1]; - - priv->bytes[i] = *p; - priv->nibbles[i++] = *p >> 4; - priv->nibbles[i++] = *p &0xf; - - ++p; - priv->bytes[i] = *p; - priv->nibbles[i++] = *p >> 4; - priv->nibbles[i++] = *p & 0xf; - - ++p; - } - } - priv->max_fetched = nibble; - return 1; -} - -static char *codes[16] = -{ - "f", - "lt", - "le", - "ule", - "ov/pe", - "mi", - "eq", - "c/ult", - "t", - "ge", - "gt", - "ugt", - "nov/po", - "pl", - "ne", - "nc/uge" -}; - -int z8k_lookup_instr PARAMS ((unsigned char*, disassemble_info *)); -static void output_instr - PARAMS ((instr_data_s *, unsigned long, disassemble_info *)); -static void unpack_instr PARAMS ((instr_data_s *, int, disassemble_info *)); -static void unparse_instr PARAMS ((instr_data_s *)); - -static int -print_insn_z8k (addr, info, is_segmented) - bfd_vma addr; - disassemble_info *info; - int is_segmented; -{ - instr_data_s instr_data; - - info->private_data = (PTR) &instr_data; - instr_data.max_fetched = 0; - instr_data.insn_start = addr; - if (setjmp (instr_data.bailout) != 0) - /* Error return. */ - return -1; - - instr_data.tabl_index = z8k_lookup_instr (instr_data.nibbles, info); - if (instr_data.tabl_index > 0) - { - unpack_instr (&instr_data, is_segmented, info); - unparse_instr (&instr_data); - output_instr (&instr_data, addr, info); - return z8k_table[instr_data.tabl_index].length; - } - else - { - FETCH_DATA (info, 4); - (*info->fprintf_func) (info->stream, ".word %02x%02x", - instr_data.bytes[0], instr_data.bytes[2]); - return 2; - } -} - -print_insn_z8001 (addr, info) - bfd_vma addr; - disassemble_info *info; -{ - return print_insn_z8k (addr, info, 1); -} - -print_insn_z8002 (addr, info) - bfd_vma addr; - disassemble_info *info; -{ - return print_insn_z8k (addr, info, 0); -} - -int -z8k_lookup_instr (nibbles, info) - unsigned char *nibbles; - disassemble_info *info; -{ - - int nibl_index, tabl_index; - int nibl_matched; - unsigned short instr_nibl; - unsigned short tabl_datum, datum_class, datum_value; - - nibl_matched = 0; - tabl_index = 0; - while (!nibl_matched && z8k_table[tabl_index].name) - { - nibl_matched = 1; - for (nibl_index = 0; nibl_index < z8k_table[tabl_index].length * 2 && nibl_matched; nibl_index++) - { - if ((nibl_index % 4) == 0) - /* Fetch one word at a time. */ - FETCH_DATA (info, nibl_index + 4); - instr_nibl = nibbles[nibl_index]; - - tabl_datum = z8k_table[tabl_index].byte_info[nibl_index]; - datum_class = tabl_datum & CLASS_MASK; - datum_value = ~CLASS_MASK & tabl_datum; - - switch (datum_class) - { - case CLASS_BIT: - if (datum_value != instr_nibl) - nibl_matched = 0; - break; - case CLASS_00II: - if (!((~instr_nibl) & 0x4)) - nibl_matched = 0; - break; - case CLASS_01II: - if (!(instr_nibl & 0x4)) - nibl_matched = 0; - break; - case CLASS_0CCC: - if (!((~instr_nibl) & 0x8)) - nibl_matched = 0; - break; - case CLASS_1CCC: - if (!(instr_nibl & 0x8)) - nibl_matched = 0; - break; - case CLASS_0DISP7: - if (!((~instr_nibl) & 0x8)) - nibl_matched = 0; - nibl_index += 1; - break; - case CLASS_1DISP7: - if (!(instr_nibl & 0x8)) - nibl_matched = 0; - nibl_index += 1; - break; - case CLASS_REGN0: - if (instr_nibl == 0) - nibl_matched = 0; - break; - case CLASS_BIT_1OR2: - if ((instr_nibl | 0x2) != (datum_value | 0x2)) - nibl_matched = 0; - break; - default: - break; - } - } - if (nibl_matched) - { - return tabl_index; - } - - tabl_index++; - } - return -1; - -} - -static void -output_instr (instr_data, addr, info) - instr_data_s *instr_data; - unsigned long addr; - disassemble_info *info; -{ - int loop, loop_limit; - char tmp_str[20]; - char out_str[100]; - - strcpy (out_str, "\t"); - - loop_limit = z8k_table[instr_data->tabl_index].length * 2; - FETCH_DATA (info, loop_limit); - for (loop = 0; loop < loop_limit; loop++) - { - sprintf (tmp_str, "%x", instr_data->nibbles[loop]); - strcat (out_str, tmp_str); - } - - while (loop++ < 8) - { - strcat (out_str, " "); - } - - strcat (out_str, instr_data->instr_asmsrc); - - (*info->fprintf_func) (info->stream, "%s", out_str); -} - -static void -unpack_instr (instr_data, is_segmented, info) - instr_data_s *instr_data; - int is_segmented; - disassemble_info *info; -{ - int nibl_count, loop; - unsigned short instr_nibl, instr_byte, instr_word; - long instr_long; - unsigned short tabl_datum, datum_class, datum_value; - - nibl_count = 0; - loop = 0; - while (z8k_table[instr_data->tabl_index].byte_info[loop] != 0) - { - FETCH_DATA (info, nibl_count + 4 - (nibl_count % 4)); - instr_nibl = instr_data->nibbles[nibl_count]; - instr_byte = instr_data->bytes[nibl_count]; - instr_word = instr_data->words[nibl_count]; - - tabl_datum = z8k_table[instr_data->tabl_index].byte_info[loop]; - datum_class = tabl_datum & CLASS_MASK; - datum_value = tabl_datum & ~CLASS_MASK; - - switch (datum_class) - { - case CLASS_X: - instr_data->address = instr_nibl; - break; - case CLASS_BA: - instr_data->displacement = instr_nibl; - break; - case CLASS_BX: - instr_data->arg_reg[datum_value] = instr_nibl; - break; - case CLASS_DISP: - switch (datum_value) - { - case ARG_DISP16: - instr_data->displacement = instr_word; - nibl_count += 3; - break; - case ARG_DISP12: - instr_data->displacement = instr_word & 0x0fff; - nibl_count += 2; - break; - default: - break; - } - break; - case CLASS_IMM: - switch (datum_value) - { - case ARG_IMM4: - instr_data->immediate = instr_nibl; - break; - case ARG_NIM8: - instr_data->immediate = (-instr_byte); - nibl_count += 1; - break; - case ARG_IMM8: - instr_data->immediate = instr_byte; - nibl_count += 1; - break; - case ARG_IMM16: - instr_data->immediate = instr_word; - nibl_count += 3; - break; - case ARG_IMM32: - FETCH_DATA (info, nibl_count + 8); - instr_long = (instr_data->words[nibl_count] << 16) - | (instr_data->words[nibl_count + 4]); - instr_data->immediate = instr_long; - nibl_count += 7; - break; - case ARG_IMMN: - instr_data->immediate = instr_nibl - 1; - break; - case ARG_IMM4M1: - instr_data->immediate = instr_nibl + 1; - break; - case ARG_IMM_1: - instr_data->immediate = 1; - break; - case ARG_IMM_2: - instr_data->immediate = 2; - break; - case ARG_IMM2: - instr_data->immediate = instr_nibl & 0x3; - break; - default: - break; - } - break; - case CLASS_CC: - instr_data->cond_code = instr_nibl; - break; - case CLASS_CTRL: - instr_data->ctrl_code = instr_nibl; - break; - case CLASS_DA: - case CLASS_ADDRESS: - if (is_segmented) - { - if (instr_nibl & 0x8) - { - FETCH_DATA (info, nibl_count + 8); - instr_long = (instr_data->words[nibl_count] << 16) - | (instr_data->words[nibl_count + 4]); - instr_data->address = ((instr_word & 0x7f00) << 8) + - (instr_long & 0xffff); - nibl_count += 7; - } - else - { - instr_data->address = ((instr_word & 0x7f00) << 8) + - (instr_word & 0x00ff); - nibl_count += 3; - } - } - else - { - instr_data->address = instr_word; - nibl_count += 3; - } - break; - case CLASS_0CCC: - instr_data->cond_code = instr_nibl & 0x7; - break; - case CLASS_1CCC: - instr_data->cond_code = instr_nibl & 0x7; - break; - case CLASS_0DISP7: - instr_data->displacement = instr_byte & 0x7f; - nibl_count += 1; - break; - case CLASS_1DISP7: - instr_data->displacement = instr_byte & 0x7f; - nibl_count += 1; - break; - case CLASS_01II: - instr_data->interrupts = instr_nibl & 0x3; - break; - case CLASS_00II: - instr_data->interrupts = instr_nibl & 0x3; - break; - case CLASS_BIT: - /* do nothing */ - break; - case CLASS_IR: - instr_data->arg_reg[datum_value] = instr_nibl; - break; - case CLASS_FLAGS: - instr_data->flags = instr_nibl; - break; - case CLASS_REG: - instr_data->arg_reg[datum_value] = instr_nibl; - break; - case CLASS_REG_BYTE: - instr_data->arg_reg[datum_value] = instr_nibl; - break; - case CLASS_REG_WORD: - instr_data->arg_reg[datum_value] = instr_nibl; - break; - case CLASS_REG_QUAD: - instr_data->arg_reg[datum_value] = instr_nibl; - break; - case CLASS_REG_LONG: - instr_data->arg_reg[datum_value] = instr_nibl; - break; - case CLASS_REGN0: - instr_data->arg_reg[datum_value] = instr_nibl; - break; - default: - break; - } - - loop += 1; - nibl_count += 1; - } -} - -static void -unparse_instr (instr_data) - instr_data_s *instr_data; -{ - unsigned short tabl_datum, datum_class, datum_value; - int loop, loop_limit; - char out_str[80], tmp_str[25]; - - sprintf (out_str, "\t%s\t", z8k_table[instr_data->tabl_index].name); - - loop_limit = z8k_table[instr_data->tabl_index].noperands; - for (loop = 0; loop < loop_limit; loop++) - { - if (loop) - strcat (out_str, ","); - - tabl_datum = z8k_table[instr_data->tabl_index].arg_info[loop]; - datum_class = tabl_datum & CLASS_MASK; - datum_value = tabl_datum & ~CLASS_MASK; - - switch (datum_class) - { - case CLASS_X: - sprintf (tmp_str, "0x%0x(R%d)", instr_data->address, - instr_data->arg_reg[datum_value]); - strcat (out_str, tmp_str); - break; - case CLASS_BA: - sprintf (tmp_str, "r%d(#%x)", instr_data->arg_reg[datum_value], - instr_data->immediate); - strcat (out_str, tmp_str); - break; - case CLASS_BX: - sprintf (tmp_str, "r%d(R%d)", instr_data->arg_reg[datum_value], - instr_data->arg_reg[ARG_RX]); - strcat (out_str, tmp_str); - break; - case CLASS_DISP: - sprintf (tmp_str, "#0x%0x", instr_data->displacement); - strcat (out_str, tmp_str); - break; - case CLASS_IMM: - sprintf (tmp_str, "#0x%0x", instr_data->immediate); - strcat (out_str, tmp_str); - break; - case CLASS_CC: - sprintf (tmp_str, "%s", codes[instr_data->cond_code]); - strcat (out_str, tmp_str); - break; - case CLASS_CTRL: - sprintf (tmp_str, "0x%0x", instr_data->ctrl_code); - strcat (out_str, tmp_str); - break; - case CLASS_DA: - case CLASS_ADDRESS: - sprintf (tmp_str, "#0x%0x", instr_data->address); - strcat (out_str, tmp_str); - break; - case CLASS_IR: - sprintf (tmp_str, "@R%d", instr_data->arg_reg[datum_value]); - strcat (out_str, tmp_str); - break; - case CLASS_FLAGS: - sprintf (tmp_str, "0x%0x", instr_data->flags); - strcat (out_str, tmp_str); - break; - case CLASS_REG_BYTE: - if (instr_data->arg_reg[datum_value] >= 0x8) - { - sprintf (tmp_str, "rl%d", - instr_data->arg_reg[datum_value] - 0x8); - } - else - { - sprintf (tmp_str, "rh%d", instr_data->arg_reg[datum_value]); - } - strcat (out_str, tmp_str); - break; - case CLASS_REG_WORD: - sprintf (tmp_str, "r%d", instr_data->arg_reg[datum_value]); - strcat (out_str, tmp_str); - break; - case CLASS_REG_QUAD: - sprintf (tmp_str, "rq%d", instr_data->arg_reg[datum_value]); - strcat (out_str, tmp_str); - break; - case CLASS_REG_LONG: - sprintf (tmp_str, "rr%d", instr_data->arg_reg[datum_value]); - strcat (out_str, tmp_str); - break; - default: - break; - } - } - - strcpy (instr_data->instr_asmsrc, out_str); -} diff --git a/contrib/gdb/readline/doc/ChangeLog b/contrib/gdb/readline/doc/ChangeLog deleted file mode 100644 index 2520a8522cd1c..0000000000000 --- a/contrib/gdb/readline/doc/ChangeLog +++ /dev/null @@ -1,12 +0,0 @@ -Wed Sep 20 12:57:29 1995 Ian Lance Taylor <ian@cygnus.com> - - * Makefile.in (maintainer-clean): New synonym for realclean. - -Tue Feb 2 11:40:04 1993 Roland H. Pesch (pesch@fowanton.cygnus.com) - - * Makefile.in: configurable (and useable) Makefile template - * Makefile: removed, replaced with configurable Makefile.in - * texindex.c texinfo.tex: remove, replacing w/refs to tools - elsewhere in distribution tree - * configure.in: pro forma configure stub - * ChangeLog: new file diff --git a/contrib/gdb/readline/doc/Makefile.in b/contrib/gdb/readline/doc/Makefile.in deleted file mode 100644 index 451b9fec336f7..0000000000000 --- a/contrib/gdb/readline/doc/Makefile.in +++ /dev/null @@ -1,94 +0,0 @@ -## Copyright (C) 1993 Free Software Foundation, Inc. - -# Makefile for Readline documentation. - -# 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 2 of the License, 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. - -srcdir = . - -prefix = /usr/local - -infodir = $(prefix)/info - -SHELL = /bin/sh - -INSTALL = install -c -INSTALL_DATA = $(INSTALL) - -# where to find texinfo -TEXIDIR=$(srcdir)/../../texinfo - -# where to find makeinfo, preferably one designed for texinfo-2 -MAKEINFO=makeinfo - -# auxiliary program for sorting Texinfo indices -TEXINDEX=texindex - -# Don Knuth's TeX formatter -TEX=tex - -#### Host, target, and site specific Makefile fragments come in here. -### - -all: info dvi - -install: install-info - -info: history.info readline.info - -dvi: history.dvi readline.dvi - -install-info: info - -parent=`echo $(infodir)|sed -e 's@/[^/]*$$@@'`; \ - if [ -d $$parent ] ; then true ; else mkdir $$parent ; fi - -if [ -d $(infodir) ] ; then true ; else mkdir $(infodir) ; fi - for i in *.info* ; do \ - $(INSTALL_DATA) $$i $(infodir)/$$i ; \ - done - -history.info: hist.texinfo hsuser.texinfo hstech.texinfo - $(MAKEINFO) -I $(srcdir) -o ./history.info $(srcdir)/hist.texinfo - -history.dvi: hist.texinfo hsuser.texinfo hstech.texinfo $(TEXIDIR)/texinfo.tex - TEXINPUTS=${TEXIDIR}:$(srcdir):$$TEXINPUTS $(TEX) hist.texinfo - $(TEXINDEX) hist.?? - TEXINPUTS=${TEXIDIR}:$(srcdir):$$TEXINPUTS $(TEX) hist.texinfo - -readline.info: rlman.texinfo rluser.texinfo rltech.texinfo - $(MAKEINFO) -I $(srcdir) -o ./readline.info $(srcdir)/rlman.texinfo - -readline.dvi: rlman.texinfo rluser.texinfo rltech.texinfo - TEXINPUTS=${TEXIDIR}:$(srcdir):$$TEXINPUTS $(TEX) rlman.texinfo - $(TEXINDEX) rlman.?? - TEXINPUTS=${TEXIDIR}:$(srcdir):$$TEXINPUTS $(TEX) rlman.texinfo - -distclean: clean - rm -f Makefile config.status - -mostlyclean: clean - -realclean maintainer-clean: distclean - -clean: clean-info clean-dvi - -clean-info: - rm -f history.info* readline.info* - -clean-dvi: - rm -f hist.?? hist.??? - rm -f rlman.?? rlman.??? - -Makefile: $(srcdir)/Makefile.in $(host_makefile_frag) $(target_makefile_frag) - $(SHELL) ./config.status diff --git a/contrib/gdb/readline/doc/configure.in b/contrib/gdb/readline/doc/configure.in deleted file mode 100644 index c082c568c65c4..0000000000000 --- a/contrib/gdb/readline/doc/configure.in +++ /dev/null @@ -1,8 +0,0 @@ -srcname="READLINE doc" -srctrigger=rlman.texinfo -# per-host: - -# per-target: - -files="" -links="" diff --git a/contrib/gdb/readline/doc/hist.texinfo b/contrib/gdb/readline/doc/hist.texinfo deleted file mode 100644 index 6292738104452..0000000000000 --- a/contrib/gdb/readline/doc/hist.texinfo +++ /dev/null @@ -1,106 +0,0 @@ -\input texinfo @c -*-texinfo-*- -@comment %**start of header (This is for running Texinfo on a region.) -@setfilename history.info -@settitle GNU Readline Library -@comment %**end of header (This is for running Texinfo on a region.) -@synindex vr fn -@setchapternewpage odd - -@ifinfo -This document describes the GNU History library, a programming tool that -provides a consistent user interface for recalling lines of previously -typed input. - -Copyright (C) 1988, 1991 Free Software Foundation, Inc. - -Permission is granted to make and distribute verbatim copies of -this manual provided the copyright notice and this permission notice -pare preserved on all copies. - -@ignore -Permission is granted to process this file through TeX and print the -results, provided the printed document carries copying permission -notice identical to this one except for the removal of this paragraph -(this paragraph not being relevant to the printed manual). -@end ignore - -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. - -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 stated in a translation approved -by the Foundation. -@end ifinfo - -@titlepage -@sp 10 -@center @titlefont{GNU History Library} -@center Brian Fox -@center Free Software Foundation -@center Version 1.1 -@center April 1991 - -@c Include the Distribution inside the titlepage environment so -@c that headings are turned off. - -@page - -This document describes the GNU History library, a programming tool that -provides a consistent user interface for recalling lines of previously -typed input. - -Published by the Free Software Foundation @* -675 Massachusetts Avenue, @* -Cambridge, MA 02139 USA - -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. - -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. - -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 stated in a translation approved -by the Foundation. - -@vskip 0pt plus 1filll -Copyright @copyright{} 1989, 1991 Free Software Foundation, Inc. -@end titlepage - -@ifinfo -@node Top -@top GNU History Library - -This document describes the GNU History library, a programming tool that -provides a consistent user interface for recalling lines of previously -typed input. - -@menu -* Using History Interactively:: GNU History User's Manual. -* Programming with GNU History:: GNU History Programmer's Manual. -* Concept Index:: Index of concepts described in this manual. -* Function and Variable Index:: Index of externally visible functions - and variables. -@end menu -@end ifinfo - -@include hsuser.texinfo -@include hstech.texinfo - -@node Concept Index -@appendix Concept Index -@printindex cp - -@node Function and Variable Index -@appendix Function and Variable Index -@printindex vr -@contents - -@bye diff --git a/contrib/gdb/readline/doc/hstech.texinfo b/contrib/gdb/readline/doc/hstech.texinfo deleted file mode 100644 index c3fe3f6a11fc2..0000000000000 --- a/contrib/gdb/readline/doc/hstech.texinfo +++ /dev/null @@ -1,311 +0,0 @@ -@ignore -This file documents the user interface to the GNU History library. - -Copyright (C) 1988, 1991 Free Software Foundation, Inc. -Authored by Brian Fox. - -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. - -Permission is granted to process this file through Tex and print the -results, provided the printed document carries copying permission notice -identical to this one except for the removal of this paragraph (this -paragraph not being relevant to the printed manual). - -Permission is granted to copy and distribute modified versions of this -manual under the conditions for verbatim copying, provided also that the -GNU Copyright statement is available to the distributee, and provided that -the entire resulting derived work is distributed under the terms of a -permission notice identical to this one. - -Permission is granted to copy and distribute translations of this manual -into another language, under the above conditions for modified versions. -@end ignore - -@node Programming with GNU History -@chapter Programming with GNU History - -This chapter describes how to interface the GNU History Library with -programs that you write. It should be considered a technical guide. -For information on the interactive use of GNU History, @pxref{Using -History Interactively}. - -@menu -* Introduction to History:: What is the GNU History library for? -* History Storage:: How information is stored. -* History Functions:: Functions that you can use. -* History Variables:: Variables that control behaviour. -* History Programming Example:: Example of using the GNU History Library. -@end menu - -@node Introduction to History -@section Introduction to History - -Many programs read input from the user a line at a time. The GNU history -library is able to keep track of those lines, associate arbitrary data with -each line, and utilize information from previous lines in making up new -ones. - -The programmer using the History library has available to him functions -for remembering lines on a history stack, associating arbitrary data -with a line, removing lines from the stack, searching through the stack -for a line containing an arbitrary text string, and referencing any line -on the stack directly. In addition, a history @dfn{expansion} function -is available which provides for a consistent user interface across many -different programs. - -The end-user using programs written with the History library has the -benifit of a consistent user interface, with a set of well-known -commands for manipulating the text of previous lines and using that text -in new commands. The basic history manipulation commands are similar to -the history substitution used by @code{Csh}. - -If the programmer desires, he can use the Readline library, which -includes some history manipulation by default, and has the added -advantage of Emacs style command line editing. - -@node History Storage -@section History Storage - -@example -typedef struct _hist_entry @{ - char *line; - char *data; -@} HIST_ENTRY; -@end example - -@node History Functions -@section History Functions - -This section describes the calling sequence for the various functions -present in GNU History. - -@defun {void using_history} () -Begin a session in which the history functions might be used. This -just initializes the interactive variables. -@end defun - -@defun {void add_history} (char *string) -Place @var{string} at the end of the history list. The associated data -field (if any) is set to @code{NULL}. -@end defun - -@defun {int where_history} () -Returns the number which says what history element we are now looking -at. -@end defun - -@defun {int history_set_pos} (int pos) -Set the position in the history list to @var{pos}. -@end defun - -@defun {int history_search_pos} (char *string, int direction, int pos) -Search for @var{string} in the history list, starting at @var{pos}, an -absolute index into the list. @var{direction}, if negative, says to search -backwards from @var{pos}, else forwards. Returns the absolute index of -the history element where @var{string} was found, or -1 otherwise. -@end defun - -@defun {HIST_ENTRY *remove_history} (); -Remove history element @var{which} from the history. The removed -element is returned to you so you can free the line, data, -and containing structure. -@end defun - -@defun {void stifle_history} (int max) -Stifle the history list, remembering only @var{max} number of entries. -@end defun - -@defun {int unstifle_history} (); -Stop stifling the history. This returns the previous amount the -history was stifled by. The value is positive if the history was -stifled, negative if it wasn't. -@end defun - -@defun {int read_history} (char *filename) -Add the contents of @var{filename} to the history list, a line at a -time. If @var{filename} is @code{NULL}, then read from -@file{~/.history}. Returns 0 if successful, or errno if not. -@end defun - -@defun {int read_history_range} (char *filename, int from, int to) -Read a range of lines from @var{filename}, adding them to the history list. -Start reading at the @var{from}'th line and end at the @var{to}'th. If -@var{from} is zero, start at the beginning. If @var{to} is less than -@var{from}, then read until the end of the file. If @var{filename} is -@code{NULL}, then read from @file{~/.history}. Returns 0 if successful, -or @code{errno} if not. -@end defun - -@defun {int write_history} (char *filename) -Append the current history to @var{filename}. If @var{filename} is -@code{NULL}, then append the history list to @file{~/.history}. Values -returned are as in @code{read_history ()}. -@end defun - -@defun {int append_history} (int nelements, char *filename) -Append @var{nelement} entries to @var{filename}. The entries appended -are from the end of the list minus @var{nelements} up to the end of the -list. -@end defun - -@defun {HIST_ENTRY *replace_history_entry} () -Make the history entry at @var{which} have @var{line} and @var{data}. -This returns the old entry so you can dispose of the data. In the case -of an invalid @var{which}, a @code{NULL} pointer is returned. -@end defun - -@defun {HIST_ENTRY *current_history} () -Return the history entry at the current position, as determined by -@code{history_offset}. If there is no entry there, return a @code{NULL} -pointer. -@end defun - -@defun {HIST_ENTRY *previous_history} () -Back up @var{history_offset} to the previous history entry, and return a -pointer to that entry. If there is no previous entry, return a -@code{NULL} pointer. -@end defun - -@defun {HIST_ENTRY *next_history} () -Move @code{history_offset} forward to the next history entry, and return -the a pointer to that entry. If there is no next entry, return a -@code{NULL} pointer. -@end defun - -@defun {HIST_ENTRY **history_list} () -Return a @code{NULL} terminated array of @code{HIST_ENTRY} which is the -current input history. Element 0 of this list is the beginning of time. -If there is no history, return @code{NULL}. -@end defun - -@defun {int history_search} (char *string, int direction) -Search the history for @var{string}, starting at @code{history_offset}. -If @var{direction} < 0, then the search is through previous entries, -else through subsequent. If @var{string} is found, then -@code{current_history ()} is the history entry, and the value of this -function is the offset in the line of that history entry that the -@var{string} was found in. Otherwise, nothing is changed, and a -1 is -returned. -@end defun - -@defun {int history_expand} (char *string, char **output) -Expand @var{string}, placing the result into @var{output}, a pointer -to a string. Returns: -@table @code -@item 0 -If no expansions took place (or, if the only change in -the text was the de-slashifying of the history expansion -character), -@item 1 -if expansions did take place, or -@item -1 -if there was an error in expansion. -@end table - -If an error ocurred in expansion, then @var{output} contains a descriptive -error message. -@end defun - -@defun {char *history_arg_extract} (int first, int last, char *string) -Extract a string segment consisting of the @var{first} through @var{last} -arguments present in @var{string}. Arguments are broken up as in -the GNU Bash shell. -@end defun - -@defun {int history_total_bytes} (); -Return the number of bytes that the primary history entries are using. -This just adds up the lengths of @code{the_history->lines}. -@end defun - -@node History Variables -@section History Variables - -This section describes the variables in GNU History that are externally -visible. - -@defvar {int history_base} -For convenience only. You set this when interpreting history commands. -It is the logical offset of the first history element. -@end defvar - -@node History Programming Example -@section History Programming Example - -The following snippet of code demonstrates simple use of the GNU History -Library. - -@smallexample -main () -@{ - char line[1024], *t; - int done = 0; - - line[0] = 0; - - while (!done) - @{ - fprintf (stdout, "history%% "); - t = gets (line); - - if (!t) - strcpy (line, "quit"); - - if (line[0]) - @{ - char *expansion; - int result; - - using_history (); - - result = history_expand (line, &expansion); - strcpy (line, expansion); - free (expansion); - if (result) - fprintf (stderr, "%s\n", line); - - if (result < 0) - continue; - - add_history (line); - @} - - if (strcmp (line, "quit") == 0) done = 1; - if (strcmp (line, "save") == 0) write_history (0); - if (strcmp (line, "read") == 0) read_history (0); - if (strcmp (line, "list") == 0) - @{ - register HIST_ENTRY **the_list = history_list (); - register int i; - - if (the_list) - for (i = 0; the_list[i]; i++) - fprintf (stdout, "%d: %s\n", - i + history_base, the_list[i]->line); - @} - if (strncmp (line, "delete", strlen ("delete")) == 0) - @{ - int which; - if ((sscanf (line + strlen ("delete"), "%d", &which)) == 1) - @{ - HIST_ENTRY *entry = remove_history (which); - if (!entry) - fprintf (stderr, "No such entry %d\n", which); - else - @{ - free (entry->line); - free (entry); - @} - @} - else - @{ - fprintf (stderr, "non-numeric arg given to `delete'\n"); - @} - @} - @} -@} -@end smallexample - - - diff --git a/contrib/gdb/readline/doc/hsuser.texinfo b/contrib/gdb/readline/doc/hsuser.texinfo deleted file mode 100644 index cda0a688c74a8..0000000000000 --- a/contrib/gdb/readline/doc/hsuser.texinfo +++ /dev/null @@ -1,153 +0,0 @@ -@ignore -This file documents the user interface to the GNU History library. - -Copyright (C) 1988, 1991 Free Software Foundation, Inc. -Authored by Brian Fox. - -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. - -Permission is granted to process this file through Tex and print the -results, provided the printed document carries copying permission notice -identical to this one except for the removal of this paragraph (this -paragraph not being relevant to the printed manual). - -Permission is granted to copy and distribute modified versions of this -manual under the conditions for verbatim copying, provided also that the -GNU Copyright statement is available to the distributee, and provided that -the entire resulting derived work is distributed under the terms of a -permission notice identical to this one. - -Permission is granted to copy and distribute translations of this manual -into another language, under the above conditions for modified versions. -@end ignore - -@node Using History Interactively -@chapter Using History Interactively - -This chapter describes how to use the GNU History Library interactively, -from a user's standpoint. It should be considered a user's guide. For -information on using the GNU History Library in your own programs, -@pxref{Programming with GNU History}. - -@menu -* History Interaction:: What it feels like using History as a user. -@end menu - -@node History Interaction -@section History Interaction -@cindex expansion - -The History library provides a history expansion feature that is similar -to the history expansion in Csh. The following text describes the sytax -that you use to manipulate the history information. - -History expansion takes place in two parts. The first is to determine -which line from the previous history should be used during substitution. -The second is to select portions of that line for inclusion into the -current one. The line selected from the previous history is called the -@dfn{event}, and the portions of that line that are acted upon are -called @dfn{words}. The line is broken into words in the same fashion -that the Bash shell does, so that several English (or Unix) words -surrounded by quotes are considered as one word. - -@menu -* Event Designators:: How to specify which history line to use. -* Word Designators:: Specifying which words are of interest. -* Modifiers:: Modifying the results of susbstitution. -@end menu - -@node Event Designators -@subsection Event Designators -@cindex event designators - -An event designator is a reference to a command line entry in the -history list. - -@table @asis - -@item @code{!} -Start a history subsititution, except when followed by a space, tab, or -the end of the line... @key{=} or @key{(}. - -@item @code{!!} -Refer to the previous command. This is a synonym for @code{!-1}. - -@item @code{!n} -Refer to command line @var{n}. - -@item @code{!-n} -Refer to the command line @var{n} lines back. - -@item @code{!string} -Refer to the most recent command starting with @var{string}. - -@item @code{!?string}[@code{?}] -Refer to the most recent command containing @var{string}. - -@end table - -@node Word Designators -@subsection Word Designators - -A @key{:} separates the event specification from the word designator. It -can be omitted if the word designator begins with a @key{^}, @key{$}, -@key{*} or @key{%}. Words are numbered from the beginning of the line, -with the first word being denoted by a 0 (zero). - -@table @code - -@item 0 (zero) -The zero'th word. For many applications, this is the command word. - -@item n -The @var{n}'th word. - -@item ^ -The first argument. that is, word 1. - -@item $ -The last argument. - -@item % -The word matched by the most recent @code{?string?} search. - -@item x-y -A range of words; @code{-@var{y}} Abbreviates @code{0-@var{y}}. - -@item * -All of the words, excepting the zero'th. This is a synonym for @code{1-$}. -It is not an error to use @key{*} if there is just one word in the event. -The empty string is returned in that case. - -@end table - -@node Modifiers -@subsection Modifiers - -After the optional word designator, you can add a sequence of one or more -of the following modifiers, each preceded by a @key{:}. - -@table @code - -@item # -The entire command line typed so far. This means the current command, -not the previous command, so it really isn't a word designator, and doesn't -belong in this section. - -@item h -Remove a trailing pathname component, leaving only the head. - -@item r -Remove a trailing suffix of the form @samp{.}@var{suffix}, leaving the basename. - -@item e -Remove all but the suffix. - -@item t -Remove all leading pathname components, leaving the tail. - -@item p -Print the new command but do not execute it. -@end table diff --git a/contrib/gdb/readline/doc/inc-hist.texi b/contrib/gdb/readline/doc/inc-hist.texi deleted file mode 100644 index 9cdde401cd2b2..0000000000000 --- a/contrib/gdb/readline/doc/inc-hist.texi +++ /dev/null @@ -1,159 +0,0 @@ -@ignore -This file is completely identical to hsuser.texinfo, except that it has the -reference to the programming manual removed. There are definately better ways -to do this! - -This file documents the user interface to the GNU History library. - -Copyright (C) 1988, 1991 Free Software Foundation, Inc. -Authored by Brian Fox. - -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. - -Permission is granted to process this file through Tex and print the -results, provided the printed document carries copying permission notice -identical to this one except for the removal of this paragraph (this -paragraph not being relevant to the printed manual). - -Permission is granted to copy and distribute modified versions of this -manual under the conditions for verbatim copying, provided also that the -GNU Copyright statement is available to the distributee, and provided that -the entire resulting derived work is distributed under the terms of a -permission notice identical to this one. - -Permission is granted to copy and distribute translations of this manual -into another language, under the above conditions for modified versions. -@end ignore - -@node Using History Interactively -@appendix Using History Interactively - -This chapter describes how to use the GNU History Library interactively, -from a user's standpoint. - -@menu -* History Interaction:: What it feels like using History as a user. -@end menu - -@node History Interaction -@section History Interaction -@cindex expansion - -The History library provides a history expansion feature similar -to the history expansion in @code{csh}. The following text describes the -syntax you use to manipulate history information. - -History expansion takes two parts. In the first part, determine -which line from the previous history will be used for substitution. -This line is called the @dfn{event}. -In the second part, select portions of that line for inclusion into the -current line. These portions are called @dfn{words}. -@value{GDBN} breaks the line into words in the same -way that the Bash shell does, so that several English (or Unix) words -surrounded by quotes are considered one word. - -@menu -* Event Designators:: How to specify which history line to use. -* Word Designators:: Specifying which words are of interest. -* Modifiers:: Modifying the results of susbstitution. -@end menu - -@node Event Designators -@subsection Event Designators -@cindex event designators - -An @dfn{event designator} is a reference to a command line entry in the -history list. - -@table @asis - -@item @code{!} -Start a history subsititution, except when followed by a space, tab, or -the end of the line... @key{=} or @key{(}. - -@item @code{!!} -Refer to the previous command. This is a synonym for @code{!-1}. - -@item @code{!n} -Refer to command line @var{n}. - -@item @code{!-n} -Refer to the command line @var{n} lines back. - -@item @code{!string} -Refer to the most recent command starting with @var{string}. - -@item @code{!?string}[@code{?}] -Refer to the most recent command containing @var{string}. - -@end table - -@node Word Designators -@subsection Word Designators - -A @key{:} separates the event designator from the @dfn{word designator}. -It can be omitted if the word designator begins with a @key{^}, @key{$}, -@key{*} or @key{%}. Words are numbered from the beginning of the line, -with the first word being denoted by a 0 (zero). - -@table @code - -@item 0 (zero) -The zero'th word. For many applications, this is the command word. - -@item n -The @var{n}'th word. - -@item ^ -The first argument. that is, word 1. - -@item $ -The last argument. - -@item % -The word matched by the most recent @code{?string?} search. - -@item x-y -A range of words; @code{-@var{y}} Abbreviates @code{0-@var{y}}. - -@item * -All of the words, excepting the zero'th. This is a synonym for @code{1-$}. -It is not an error to use @key{*} if there is just one word in the event. -The empty string is returned in that case. - -@end table - -@node Modifiers -@subsection Modifiers - -After the optional word designator, you can add a sequence of one or more -of the following @dfn{modifiers}, each preceded by a @key{:}. - -@table @code - -@item # -The entire command line typed so far. This means the current command, -not the previous command. -@c -@c FIXME: If it doesn't belong here, let's put it where it does. -@c -@c so it technically isn't a word designator and doesn't belong in -@c this section. - -@item h -Remove a trailing pathname component, leaving only the head. - -@item r -Remove a trailing suffix of the form @samp{.}@var{suffix}, leaving the basename. - -@item e -Remove all but the suffix. - -@item t -Remove all leading pathname components, leaving the tail. - -@item p -Print the new command but do not execute it. -@end table diff --git a/contrib/gdb/readline/doc/rlman.texinfo b/contrib/gdb/readline/doc/rlman.texinfo deleted file mode 100644 index f2e7fb6db919b..0000000000000 --- a/contrib/gdb/readline/doc/rlman.texinfo +++ /dev/null @@ -1,103 +0,0 @@ -\input texinfo @c -*-texinfo-*- -@comment %**start of header (This is for running Texinfo on a region.) -@setfilename readline.info -@settitle GNU Readline Library -@comment %**end of header (This is for running Texinfo on a region.) -@synindex vr fn -@setchapternewpage odd - -@ifinfo -This document describes the GNU Readline Library, a utility which aids -in the consistency of user interface across discrete programs that need -to provide a command line interface. - -Copyright (C) 1988, 1991 Free Software Foundation, Inc. - -Permission is granted to make and distribute verbatim copies of -this manual provided the copyright notice and this permission notice -pare preserved on all copies. - -@ignore -Permission is granted to process this file through TeX and print the -results, provided the printed document carries copying permission -notice identical to this one except for the removal of this paragraph -(this paragraph not being relevant to the printed manual). -@end ignore - -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. - -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 stated in a translation approved -by the Foundation. -@end ifinfo - -@titlepage -@sp 10 -@center @titlefont{GNU Readline Library} -@center Brian Fox -@center Free Software Foundation -@center Version 1.1 -@center April 1991 - -@page -This document describes the GNU Readline Library, a utility which aids -in the consistency of user interface across discrete programs that need -to provide a command line interface. - -Published by the Free Software Foundation @* -675 Massachusetts Avenue, @* -Cambridge, MA 02139 USA - -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. - -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. - -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 stated in a translation approved -by the Foundation. - -@vskip 0pt plus 1filll -Copyright @copyright{} 1989, 1991 Free Software Foundation, Inc. -@end titlepage - -@ifinfo -@node Top -@top GNU Readline Library - -This document describes the GNU Readline Library, a utility which aids -in the consistency of user interface across discrete programs that need -to provide a command line interface. - -@menu -* Command Line Editing:: GNU Readline User's Manual. -* Programming with GNU Readline:: GNU Readline Programmer's Manual. -* Concept Index:: Index of concepts described in this manual. -* Function and Variable Index:: Index of externally visible functions - and variables. -@end menu -@end ifinfo - -@include rluser.texinfo -@include rltech.texinfo - -@node Concept Index -@unnumbered Concept Index -@printindex cp - -@node Function and Variable Index -@unnumbered Function and Variable Index -@printindex fn - -@contents -@bye - diff --git a/contrib/gdb/readline/doc/rltech.texinfo b/contrib/gdb/readline/doc/rltech.texinfo deleted file mode 100644 index 2048b7c29dfbc..0000000000000 --- a/contrib/gdb/readline/doc/rltech.texinfo +++ /dev/null @@ -1,1012 +0,0 @@ -@comment %**start of header (This is for running Texinfo on a region.) -@setfilename rltech.info -@comment %**end of header (This is for running Texinfo on a region.) -@setchapternewpage odd - -@ifinfo -This document describes the GNU Readline Library, a utility for aiding -in the consitency of user interface across discrete programs that need -to provide a command line interface. - -Copyright (C) 1988 Free Software Foundation, Inc. - -Permission is granted to make and distribute verbatim copies of -this manual provided the copyright notice and this permission notice -pare preserved on all copies. - -@ignore -Permission is granted to process this file through TeX and print the -results, provided the printed document carries copying permission -notice identical to this one except for the removal of this paragraph -(this paragraph not being relevant to the printed manual). -@end ignore - -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. - -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 stated in a translation approved -by the Foundation. -@end ifinfo - -@node Programming with GNU Readline -@chapter Programming with GNU Readline - -This manual describes the interface between the GNU Readline Library and -user programs. If you are a programmer, and you wish to include the -features found in GNU Readline in your own programs, such as completion, -line editing, and interactive history manipulation, this documentation -is for you. - -@menu -* Default Behaviour:: Using the default behaviour of Readline. -* Custom Functions:: Adding your own functions to Readline. -* Custom Completers:: Supplanting or supplementing Readline's - completion functions. -@end menu - -@node Default Behaviour -@section Default Behaviour - -Many programs provide a command line interface, such as @code{mail}, -@code{ftp}, and @code{sh}. For such programs, the default behaviour of -Readline is sufficient. This section describes how to use Readline in -the simplest way possible, perhaps to replace calls in your code to -@code{gets ()}. - -@findex readline () -@cindex readline, function -The function @code{readline} prints a prompt and then reads and returns -a single line of text from the user. The line which @code{readline ()} -returns is allocated with @code{malloc ()}; you should @code{free ()} -the line when you are done with it. The declaration for @code{readline} -in ANSI C is - -@example -@code{char *readline (char *@var{prompt});} -@end example - -So, one might say -@example -@code{char *line = readline ("Enter a line: ");} -@end example -in order to read a line of text from the user. - -The line which is returned has the final newline removed, so only the -text of the line remains. - -If readline encounters an @code{EOF} while reading the line, and the -line is empty at that point, then @code{(char *)NULL} is returned. -Otherwise, the line is ended just as if a newline was typed. - -If you want the user to be able to get at the line later, (with -@key{C-p} for example), you must call @code{add_history ()} to save the -line away in a @dfn{history} list of such lines. - -@example -@code{add_history (line)}; -@end example - -For full details on the GNU History Library, see the associated manual. - -It is polite to avoid saving empty lines on the history list, since it -is rare than someone has a burning need to reuse a blank line. Here is -a function which usefully replaces the standard @code{gets ()} library -function: - -@example -/* A static variable for holding the line. */ -static char *line_read = (char *)NULL; - -/* Read a string, and return a pointer to it. Returns NULL on EOF. */ -char * -do_gets () -@{ - /* If the buffer has already been allocated, return the memory - to the free pool. */ - if (line_read != (char *)NULL) - @{ - free (line_read); - line_read = (char *)NULL; - @} - - /* Get a line from the user. */ - line_read = readline (""); - - /* If the line has any text in it, save it on the history. */ - if (line_read && *line_read) - add_history (line_read); - - return (line_read); -@} -@end example - -The above code gives the user the default behaviour of @key{TAB} -completion: completion on file names. If you do not want readline to -complete on filenames, you can change the binding of the @key{TAB} key -with @code{rl_bind_key ()}. - -@findex rl_bind_key () -@example -@code{int rl_bind_key (int @var{key}, int (*@var{function})());} -@end example - -@code{rl_bind_key ()} takes 2 arguments; @var{key} is the character that -you want to bind, and @var{function} is the address of the function to -run when @var{key} is pressed. Binding @key{TAB} to @code{rl_insert ()} -makes @key{TAB} just insert itself. - -@code{rl_bind_key ()} returns non-zero if @var{key} is not a valid -ASCII character code (between 0 and 255). - -@example -@code{rl_bind_key ('\t', rl_insert);} -@end example - -This code should be executed once at the start of your program; you -might write a function called @code{initialize_readline ()} which -performs this and other desired initializations, such as installing -custom completers, etc. - -@node Custom Functions -@section Custom Functions - -Readline provides a great many functions for manipulating the text of -the line. But it isn't possible to anticipate the needs of all -programs. This section describes the various functions and variables -defined in within the Readline library which allow a user program to add -customized functionality to Readline. - -@menu -* The Function Type:: C declarations to make code readable. -* Function Naming:: How to give a function you write a name. -* Keymaps:: Making keymaps. -* Binding Keys:: Changing Keymaps. -* Function Writing:: Variables and calling conventions. -* Allowing Undoing:: How to make your functions undoable. -@end menu - -@node The Function Type -@subsection The Function Type - -For the sake of readabilty, we declare a new type of object, called -@dfn{Function}. A @code{Function} is a C language function which -returns an @code{int}. The type declaration for @code{Function} is: - -@noindent -@code{typedef int Function ();} - -The reason for declaring this new type is to make it easier to write -code describing pointers to C functions. Let us say we had a variable -called @var{func} which was a pointer to a function. Instead of the -classic C declaration - -@code{int (*)()func;} - -we have - -@code{Function *func;} - -@node Function Naming -@subsection Naming a Function - -The user can dynamically change the bindings of keys while using -Readline. This is done by representing the function with a descriptive -name. The user is able to type the descriptive name when referring to -the function. Thus, in an init file, one might find - -@example -Meta-Rubout: backward-kill-word -@end example - -This binds the keystroke @key{Meta-Rubout} to the function -@emph{descriptively} named @code{backward-kill-word}. You, as the -programmer, should bind the functions you write to descriptive names as -well. Readline provides a function for doing that: - -@defun rl_add_defun (char *name, Function *function, int key) -Add @var{name} to the list of named functions. Make @var{function} be -the function that gets called. If @var{key} is not -1, then bind it to -@var{function} using @code{rl_bind_key ()}. -@end defun - -Using this function alone is sufficient for most applications. It is -the recommended way to add a few functions to the default functions that -Readline has built in already. If you need to do more or different -things than adding a function to Readline, you may need to use the -underlying functions described below. - -@node Keymaps -@subsection Selecting a Keymap - -Key bindings take place on a @dfn{keymap}. The keymap is the -association between the keys that the user types and the functions that -get run. You can make your own keymaps, copy existing keymaps, and tell -Readline which keymap to use. - -@defun {Keymap rl_make_bare_keymap} () -Returns a new, empty keymap. The space for the keymap is allocated with -@code{malloc ()}; you should @code{free ()} it when you are done. -@end defun - -@defun {Keymap rl_copy_keymap} (Keymap map) -Return a new keymap which is a copy of @var{map}. -@end defun - -@defun {Keymap rl_make_keymap} () -Return a new keymap with the printing characters bound to rl_insert, -the lowercase Meta characters bound to run their equivalents, and -the Meta digits bound to produce numeric arguments. -@end defun - -@node Binding Keys -@subsection Binding Keys - -You associate keys with functions through the keymap. Here are -functions for doing that. - -@defun {int rl_bind_key} (int key, Function *function) -Binds @var{key} to @var{function} in the currently selected keymap. -Returns non-zero in the case of an invalid @var{key}. -@end defun - -@defun {int rl_bind_key_in_map} (int key, Function *function, Keymap map) -Bind @var{key} to @var{function} in @var{map}. Returns non-zero in the case -of an invalid @var{key}. -@end defun - -@defun {int rl_unbind_key} (int key) -Make @var{key} do nothing in the currently selected keymap. -Returns non-zero in case of error. -@end defun - -@defun {int rl_unbind_key_in_map} (int key, Keymap map) -Make @var{key} be bound to the null function in @var{map}. -Returns non-zero in case of error. -@end defun - -@defun rl_generic_bind (int type, char *keyseq, char *data, Keymap map) -Bind the key sequence represented by the string @var{keyseq} to the arbitrary -pointer @var{data}. @var{type} says what kind of data is pointed to by -@var{data}; right now this can be a function (@code{ISFUNC}), a macro -(@code{ISMACR}), or a keymap (@code{ISKMAP}). This makes new keymaps as -necessary. The initial place to do bindings is in @var{map}. -@end defun - -@node Function Writing -@subsection Writing a New Function - -In order to write new functions for Readline, you need to know the -calling conventions for keyboard invoked functions, and the names of the -variables that describe the current state of the line gathered so far. - -@defvar {char *rl_line_buffer} -This is the line gathered so far. You are welcome to modify the -contents of this, but see Undoing, below. -@end defvar - -@defvar {int rl_point} -The offset of the current cursor position in @var{rl_line_buffer}. -@end defvar - -@defvar {int rl_end} -The number of characters present in @code{rl_line_buffer}. When -@code{rl_point} is at the end of the line, then @code{rl_point} and -@code{rl_end} are equal. -@end defvar - -The calling sequence for a command @code{foo} looks like - -@example -@code{foo (int count, int key)} -@end example - -where @var{count} is the numeric argument (or 1 if defaulted) and -@var{key} is the key that invoked this function. - -It is completely up to the function as to what should be done with the -numeric argument; some functions use it as a repeat count, other -functions as a flag, and some choose to ignore it. In general, if a -function uses the numeric argument as a repeat count, it should be able -to do something useful with a negative argument as well as a positive -argument. At the very least, it should be aware that it can be passed a -negative argument. - -@node Allowing Undoing -@subsection Allowing Undoing - -Supporting the undo command is a painless thing to do, and makes your -functions much more useful to the end user. It is certainly easy to try -something if you know you can undo it. I could use an undo function for -the stock market. - -If your function simply inserts text once, or deletes text once, and it -calls @code{rl_insert_text ()} or @code{rl_delete_text ()} to do it, then -undoing is already done for you automatically, and you can safely skip -this section. - -If you do multiple insertions or multiple deletions, or any combination -of these operations, you should group them together into one operation. -This can be done with @code{rl_begin_undo_group ()} and -@code{rl_end_undo_group ()}. - -@defun rl_begin_undo_group () -Begins saving undo information in a group construct. The undo -information usually comes from calls to @code{rl_insert_text ()} and -@code{rl_delete_text ()}, but they could be direct calls to -@code{rl_add_undo ()}. -@end defun - -@defun rl_end_undo_group () -Closes the current undo group started with @code{rl_begin_undo_group -()}. There should be exactly one call to @code{rl_end_undo_group ()} -for every call to @code{rl_begin_undo_group ()}. -@end defun - -Finally, if you neither insert nor delete text, but directly modify the -existing text (e.g. change its case), you call @code{rl_modifying ()} -once, just before you modify the text. You must supply the indices of -the text range that you are going to modify. - -@defun rl_modifying (int start, int end) -Tell Readline to save the text between @var{start} and @var{end} as a -single undo unit. It is assumed that subsequent to this call you will -modify that range of text in some way. -@end defun - -@subsection An Example - -Here is a function which changes lowercase characters to the uppercase -equivalents, and uppercase characters to the lowercase equivalents. If -this function was bound to @samp{M-c}, then typing @samp{M-c} would -change the case of the character under point. Typing @samp{10 M-c} -would change the case of the following 10 characters, leaving the cursor on -the last character changed. - -@example -/* Invert the case of the COUNT following characters. */ -invert_case_line (count, key) - int count, key; -@{ - register int start, end; - - start = rl_point; - - if (count < 0) - @{ - direction = -1; - count = -count; - @} - else - direction = 1; - - /* Find the end of the range to modify. */ - end = start + (count * direction); - - /* Force it to be within range. */ - if (end > rl_end) - end = rl_end; - else if (end < 0) - end = -1; - - if (start > end) - @{ - int temp = start; - start = end; - end = temp; - @} - - if (start == end) - return; - - /* Tell readline that we are modifying the line, so save the undo - information. */ - rl_modifying (start, end); - - for (; start != end; start += direction) - @{ - if (uppercase_p (rl_line_buffer[start])) - rl_line_buffer[start] = to_lower (rl_line_buffer[start]); - else if (lowercase_p (rl_line_buffer[start])) - rl_line_buffer[start] = to_upper (rl_line_buffer[start]); - @} - /* Move point to on top of the last character changed. */ - rl_point = end - direction; -@} -@end example - -@node Custom Completers -@section Custom Completers - -Typically, a program that reads commands from the user has a way of -disambiguating commands and data. If your program is one of these, then -it can provide completion for either commands, or data, or both commands -and data. The following sections describe how your program and Readline -cooperate to provide this service to end users. - -@menu -* How Completing Works:: The logic used to do completion. -* Completion Functions:: Functions provided by Readline. -* Completion Variables:: Variables which control completion. -* A Short Completion Example:: An example of writing completer subroutines. -@end menu - -@node How Completing Works -@subsection How Completing Works - -In order to complete some text, the full list of possible completions -must be available. That is to say, it is not possible to accurately -expand a partial word without knowing what all of the possible words -that make sense in that context are. The GNU Readline library provides -the user interface to completion, and additionally, two of the most common -completion functions; filename and username. For completing other types -of text, you must write your own completion function. This section -describes exactly what those functions must do, and provides an example -function. - -There are three major functions used to perform completion: - -@enumerate -@item -The user-interface function @code{rl_complete ()}. This function is -called interactively with the same calling conventions as other -functions in readline intended for interactive use; i.e. @var{count}, -and @var{invoking-key}. It isolates the word to be completed and calls -@code{completion_matches ()} to generate a list of possible completions. -It then either lists the possible completions or actually performs the -completion, depending on which behaviour is desired. - -@item -The internal function @code{completion_matches ()} uses your -@dfn{generator} function to generate the list of possible matches, and -then returns the array of these matches. You should place the address -of your generator function in @code{rl_completion_entry_function}. - -@item -The generator function is called repeatedly from -@code{completion_matches ()}, returning a string each time. The -arguments to the generator function are @var{text} and @var{state}. -@var{text} is the partial word to be completed. @var{state} is zero the -first time the function is called, and a positive non-zero integer for -each subsequent call. When the generator function returns @code{(char -*)NULL} this signals @code{completion_matches ()} that there are no more -possibilities left. - -@end enumerate - -@defun rl_complete (int ignore, int invoking_key) -Complete the word at or before point. You have supplied the function -that does the initial simple matching selection algorithm (see -@code{completion_matches ()}). The default is to do filename completion. -@end defun - -Note that @code{rl_complete ()} has the identical calling conventions as -any other key-invokable function; this is because by default it is bound -to the @samp{TAB} key. - -@defvar {Function *rl_completion_entry_function} -This is a pointer to the generator function for @code{completion_matches -()}. If the value of @code{rl_completion_entry_function} is -@code{(Function *)NULL} then the default filename generator function is -used, namely @code{filename_entry_function ()}. -@end defvar - -@node Completion Functions -@subsection Completion Functions - -Here is the complete list of callable completion functions present in -Readline. - -@defun rl_complete_internal (int what_to_do) -Complete the word at or before point. @var{what_to_do} says what to do -with the completion. A value of @samp{?} means list the possible -completions. @samp{TAB} means do standard completion. @samp{*} means -insert all of the possible completions. -@end defun - -@defun rl_complete (int ignore, int invoking_key) -Complete the word at or before point. You have supplied the function -that does the initial simple matching selection algorithm (see -@code{completion_matches ()}). The default is to do filename -completion. This just calls @code{rl_complete_internal ()} with an -argument of @samp{TAB}. -@end defun - -@defun rl_possible_completions () -List the possible completions. See description of @code{rl_complete -()}. This just calls @code{rl_complete_internal ()} with an argument of -@samp{?}. -@end defun - -@defun {char **completion_matches} (char *text, char *(*entry_function) ()) -Returns an array of @code{(char *)} which is a list of completions for -@var{text}. If there are no completions, returns @code{(char **)NULL}. -The first entry in the returned array is the substitution for @var{text}. -The remaining entries are the possible completions. The array is -terminated with a @code{NULL} pointer. - -@var{entry_function} is a function of two args, and returns a -@code{(char *)}. The first argument is @var{text}. The second is a -state argument; it is zero on the first call, and non-zero on subsequent -calls. It returns a @code{NULL} pointer to the caller when there are -no more matches. -@end defun - -@defun {char *filename_completion_function} (char *text, int state) -A generator function for filename completion in the general case. Note -that completion in the Bash shell is a little different because of all -the pathnames that must be followed when looking up the completion for a -command. -@end defun - -@defun {char *username_completion_function} (char *text, int state) -A completion generator for usernames. @var{text} contains a partial -username preceded by a random character (usually @samp{~}). -@end defun - -@node Completion Variables -@subsection Completion Variables - -@defvar {Function *rl_completion_entry_function} -A pointer to the generator function for @code{completion_matches ()}. -@code{NULL} means to use @code{filename_entry_function ()}, the default -filename completer. -@end defvar - -@defvar {Function *rl_attempted_completion_function} -A pointer to an alternative function to create matches. -The function is called with @var{text}, @var{start}, and @var{end}. -@var{start} and @var{end} are indices in @code{rl_line_buffer} saying -what the boundaries of @var{text} are. If this function exists and -returns @code{NULL} then @code{rl_complete ()} will call the value of -@code{rl_completion_entry_function} to generate matches, otherwise the -array of strings returned will be used. -@end defvar - -@defvar {int rl_completion_query_items} -Up to this many items will be displayed in response to a -possible-completions call. After that, we ask the user if she is sure -she wants to see them all. The default value is 100. -@end defvar - -@defvar {char *rl_basic_word_break_characters} -The basic list of characters that signal a break between words for the -completer routine. The contents of this variable is what breaks words -in the Bash shell, i.e. " \t\n\"\\'`@@$><=;|&@{(". -@end defvar - -@defvar {char *rl_completer_word_break_characters} -The list of characters that signal a break between words for -@code{rl_complete_internal ()}. The default list is the contents of -@code{rl_basic_word_break_characters}. -@end defvar - -@defvar {char *rl_special_prefixes} -The list of characters that are word break characters, but should be -left in @var{text} when it is passed to the completion function. -Programs can use this to help determine what kind of completing to do. -@end defvar - -@defvar {int rl_ignore_completion_duplicates} -If non-zero, then disallow duplicates in the matches. Default is 1. -@end defvar - -@defvar {int rl_filename_completion_desired} -Non-zero means that the results of the matches are to be treated as -filenames. This is @emph{always} zero on entry, and can only be changed -within a completion entry generator function. -@end defvar - -@defvar {Function *rl_ignore_some_completions_function} -This function, if defined, is called by the completer when real filename -completion is done, after all the matching names have been generated. -It is passed a @code{NULL} terminated array of @code{(char *)} known as -@var{matches} in the code. The 1st element (@code{matches[0]}) is the -maximal substring that is common to all matches. This function can -re-arrange the list of matches as required, but each deleted element of -the array must be @code{free()}'d. -@end defvar - -@node A Short Completion Example -@subsection A Short Completion Example - -Here is a small application demonstrating the use of the GNU Readline -library. It is called @code{fileman}, and the source code resides in -@file{readline/examples/fileman.c}. This sample application provides -completion of command names, line editing features, and access to the -history list. - -@page -@smallexample -/* fileman.c -- A tiny application which demonstrates how to use the - GNU Readline library. This application interactively allows users - to manipulate files and their modes. */ - -#include <stdio.h> -#include <readline/readline.h> -#include <readline/history.h> -#include <sys/types.h> -#include <sys/file.h> -#include <sys/stat.h> -#include <sys/errno.h> - -/* The names of functions that actually do the manipulation. */ -int com_list (), com_view (), com_rename (), com_stat (), com_pwd (); -int com_delete (), com_help (), com_cd (), com_quit (); - -/* A structure which contains information on the commands this program - can understand. */ - -typedef struct @{ - char *name; /* User printable name of the function. */ - Function *func; /* Function to call to do the job. */ - char *doc; /* Documentation for this function. */ -@} COMMAND; - -COMMAND commands[] = @{ - @{ "cd", com_cd, "Change to directory DIR" @}, - @{ "delete", com_delete, "Delete FILE" @}, - @{ "help", com_help, "Display this text" @}, - @{ "?", com_help, "Synonym for `help'" @}, - @{ "list", com_list, "List files in DIR" @}, - @{ "ls", com_list, "Synonym for `list'" @}, - @{ "pwd", com_pwd, "Print the current working directory" @}, - @{ "quit", com_quit, "Quit using Fileman" @}, - @{ "rename", com_rename, "Rename FILE to NEWNAME" @}, - @{ "stat", com_stat, "Print out statistics on FILE" @}, - @{ "view", com_view, "View the contents of FILE" @}, - @{ (char *)NULL, (Function *)NULL, (char *)NULL @} -@}; - -/* The name of this program, as taken from argv[0]. */ -char *progname; - -/* When non-zero, this global means the user is done using this program. */ -int done = 0; -@page -main (argc, argv) - int argc; - char **argv; -@{ - progname = argv[0]; - - initialize_readline (); /* Bind our completer. */ - - /* Loop reading and executing lines until the user quits. */ - while (!done) - @{ - char *line; - - line = readline ("FileMan: "); - - if (!line) - @{ - done = 1; /* Encountered EOF at top level. */ - @} - else - @{ - /* Remove leading and trailing whitespace from the line. - Then, if there is anything left, add it to the history list - and execute it. */ - stripwhite (line); - - if (*line) - @{ - add_history (line); - execute_line (line); - @} - @} - - if (line) - free (line); - @} - exit (0); -@} - -/* Execute a command line. */ -execute_line (line) - char *line; -@{ - register int i; - COMMAND *find_command (), *command; - char *word; - - /* Isolate the command word. */ - i = 0; - while (line[i] && !whitespace (line[i])) - i++; - - word = line; - - if (line[i]) - line[i++] = '\0'; - - command = find_command (word); - - if (!command) - @{ - fprintf (stderr, "%s: No such command for FileMan.\n", word); - return; - @} - - /* Get argument to command, if any. */ - while (whitespace (line[i])) - i++; - - word = line + i; - - /* Call the function. */ - (*(command->func)) (word); -@} - -/* Look up NAME as the name of a command, and return a pointer to that - command. Return a NULL pointer if NAME isn't a command name. */ -COMMAND * -find_command (name) - char *name; -@{ - register int i; - - for (i = 0; commands[i].name; i++) - if (strcmp (name, commands[i].name) == 0) - return (&commands[i]); - - return ((COMMAND *)NULL); -@} - -/* Strip whitespace from the start and end of STRING. */ -stripwhite (string) - char *string; -@{ - register int i = 0; - - while (whitespace (string[i])) - i++; - - if (i) - strcpy (string, string + i); - - i = strlen (string) - 1; - - while (i > 0 && whitespace (string[i])) - i--; - - string[++i] = '\0'; -@} -@page -/* **************************************************************** */ -/* */ -/* Interface to Readline Completion */ -/* */ -/* **************************************************************** */ - -/* Tell the GNU Readline library how to complete. We want to try to complete - on command names if this is the first word in the line, or on filenames - if not. */ -initialize_readline () -@{ - char **fileman_completion (); - - /* Allow conditional parsing of the ~/.inputrc file. */ - rl_readline_name = "FileMan"; - - /* Tell the completer that we want a crack first. */ - rl_attempted_completion_function = (Function *)fileman_completion; -@} - -/* Attempt to complete on the contents of TEXT. START and END show the - region of TEXT that contains the word to complete. We can use the - entire line in case we want to do some simple parsing. Return the - array of matches, or NULL if there aren't any. */ -char ** -fileman_completion (text, start, end) - char *text; - int start, end; -@{ - char **matches; - char *command_generator (); - - matches = (char **)NULL; - - /* If this word is at the start of the line, then it is a command - to complete. Otherwise it is the name of a file in the current - directory. */ - if (start == 0) - matches = completion_matches (text, command_generator); - - return (matches); -@} - -/* Generator function for command completion. STATE lets us know whether - to start from scratch; without any state (i.e. STATE == 0), then we - start at the top of the list. */ -char * -command_generator (text, state) - char *text; - int state; -@{ - static int list_index, len; - char *name; - - /* If this is a new word to complete, initialize now. This includes - saving the length of TEXT for efficiency, and initializing the index - variable to 0. */ - if (!state) - @{ - list_index = 0; - len = strlen (text); - @} - - /* Return the next name which partially matches from the command list. */ - while (name = commands[list_index].name) - @{ - list_index++; - - if (strncmp (name, text, len) == 0) - return (name); - @} - - /* If no names matched, then return NULL. */ - return ((char *)NULL); -@} -@page -/* **************************************************************** */ -/* */ -/* FileMan Commands */ -/* */ -/* **************************************************************** */ - -/* String to pass to system (). This is for the LIST, VIEW and RENAME - commands. */ -static char syscom[1024]; - -/* List the file(s) named in arg. */ -com_list (arg) - char *arg; -@{ - if (!arg) - arg = "*"; - - sprintf (syscom, "ls -FClg %s", arg); - system (syscom); -@} - -com_view (arg) - char *arg; -@{ - if (!valid_argument ("view", arg)) - return; - - sprintf (syscom, "cat %s | more", arg); - system (syscom); -@} - -com_rename (arg) - char *arg; -@{ - too_dangerous ("rename"); -@} - -com_stat (arg) - char *arg; -@{ - struct stat finfo; - - if (!valid_argument ("stat", arg)) - return; - - if (stat (arg, &finfo) == -1) - @{ - perror (arg); - return; - @} - - printf ("Statistics for `%s':\n", arg); - - printf ("%s has %d link%s, and is %d bytes in length.\n", arg, - finfo.st_nlink, (finfo.st_nlink == 1) ? "" : "s", finfo.st_size); - printf (" Created on: %s", ctime (&finfo.st_ctime)); - printf (" Last access at: %s", ctime (&finfo.st_atime)); - printf ("Last modified at: %s", ctime (&finfo.st_mtime)); -@} - -com_delete (arg) - char *arg; -@{ - too_dangerous ("delete"); -@} - -/* Print out help for ARG, or for all of the commands if ARG is - not present. */ -com_help (arg) - char *arg; -@{ - register int i; - int printed = 0; - - for (i = 0; commands[i].name; i++) - @{ - if (!*arg || (strcmp (arg, commands[i].name) == 0)) - @{ - printf ("%s\t\t%s.\n", commands[i].name, commands[i].doc); - printed++; - @} - @} - - if (!printed) - @{ - printf ("No commands match `%s'. Possibilties are:\n", arg); - - for (i = 0; commands[i].name; i++) - @{ - /* Print in six columns. */ - if (printed == 6) - @{ - printed = 0; - printf ("\n"); - @} - - printf ("%s\t", commands[i].name); - printed++; - @} - - if (printed) - printf ("\n"); - @} -@} - -/* Change to the directory ARG. */ -com_cd (arg) - char *arg; -@{ - if (chdir (arg) == -1) - perror (arg); - - com_pwd (""); -@} - -/* Print out the current working directory. */ -com_pwd (ignore) - char *ignore; -@{ - char dir[1024]; - - (void) getwd (dir); - - printf ("Current directory is %s\n", dir); -@} - -/* The user wishes to quit using this program. Just set DONE non-zero. */ -com_quit (arg) - char *arg; -@{ - done = 1; -@} - -/* Function which tells you that you can't do this. */ -too_dangerous (caller) - char *caller; -@{ - fprintf (stderr, - "%s: Too dangerous for me to distribute. Write it yourself.\n", - caller); -@} - -/* Return non-zero if ARG is a valid argument for CALLER, else print - an error message and return zero. */ -int -valid_argument (caller, arg) - char *caller, *arg; -@{ - if (!arg || !*arg) - @{ - fprintf (stderr, "%s: Argument required.\n", caller); - return (0); - @} - - return (1); -@} -@end smallexample diff --git a/contrib/gdb/readline/doc/rluser.texinfo b/contrib/gdb/readline/doc/rluser.texinfo deleted file mode 100644 index da1111148bf92..0000000000000 --- a/contrib/gdb/readline/doc/rluser.texinfo +++ /dev/null @@ -1,566 +0,0 @@ -@ignore -This file documents the end user interface to the GNU command line -editing feautres. It is to be an appendix to manuals for programs which -use these features. There is a document entitled "readline.texinfo" -which contains both end-user and programmer documentation for the GNU -Readline Library. - -Copyright (C) 1988 Free Software Foundation, Inc. - -Authored by Brian Fox. - -Permission is granted to process this file through Tex and print the -results, provided the printed document carries copying permission notice -identical to this one except for the removal of this paragraph (this -paragraph not being relevant to the printed manual). - -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. - -Permission is granted to copy and distribute modified versions of this -manual under the conditions for verbatim copying, provided also that the -GNU Copyright statement is available to the distributee, and provided that -the entire resulting derived work is distributed under the terms of a -permission notice identical to this one. - -Permission is granted to copy and distribute translations of this manual -into another language, under the above conditions for modified versions. -@end ignore - -@node Command Line Editing -@appendix Command Line Editing - -This text describes GNU's command line editing interface. - -@menu -* Introduction and Notation:: Notation used in this text. -* Readline Interaction:: The minimum set of commands for editing a line. -* Readline Init File:: Customizing Readline from a user's view. -@end menu - -@node Introduction and Notation -@section Introduction to Line Editing - -The following paragraphs describe the notation we use to represent -keystrokes. - -The text @key{C-k} is read as `Control-K' and describes the character -produced when the Control key is depressed and the @key{k} key is struck. - -The text @key{M-k} is read as `Meta-K' and describes the character -produced when the meta key (if you have one) is depressed, and the @key{k} -key is struck. If you do not have a meta key, the identical keystroke -can be generated by typing @key{ESC} @i{first}, and then typing @key{k}. -Either process is known as @dfn{metafying} the @key{k} key. - -The text @key{M-C-k} is read as `Meta-Control-k' and describes the -character produced by @dfn{metafying} @key{C-k}. - -In addition, several keys have their own names. Specifically, -@key{DEL}, @key{ESC}, @key{LFD}, @key{SPC}, @key{RET}, and @key{TAB} all -stand for themselves when seen in this text, or in an init file -(@pxref{Readline Init File}, for more info). - -@node Readline Interaction -@section Readline Interaction -@cindex interaction, readline - -Often during an interactive session you type in a long line of text, -only to notice that the first word on the line is misspelled. The -Readline library gives you a set of commands for manipulating the text -as you type it in, allowing you to just fix your typo, and not forcing -you to retype the majority of the line. Using these editing commands, -you move the cursor to the place that needs correction, and delete or -insert the text of the corrections. Then, when you are satisfied with -the line, you simply press @key{RET}. You do not have to be at the -end of the line to press @key{RET}; the entire line is accepted -regardless of the location of the cursor within the line. - -@menu -* Readline Bare Essentials:: The least you need to know about Readline. -* Readline Movement Commands:: Moving about the input line. -* Readline Killing Commands:: How to delete text, and how to get it back! -* Readline Arguments:: Giving numeric arguments to commands. -@end menu - -@node Readline Bare Essentials -@subsection Readline Bare Essentials - -In order to enter characters into the line, simply type them. The typed -character appears where the cursor was, and then the cursor moves one -space to the right. If you mistype a character, you can use @key{DEL} to -back up, and delete the mistyped character. - -Sometimes you may miss typing a character that you wanted to type, and -not notice your error until you have typed several other characters. In -that case, you can type @key{C-b} to move the cursor to the left, and then -correct your mistake. Aftwerwards, you can move the cursor to the right -with @key{C-f}. - -When you add text in the middle of a line, you will notice that characters -to the right of the cursor get `pushed over' to make room for the text -that you have inserted. Likewise, when you delete text behind the cursor, -characters to the right of the cursor get `pulled back' to fill in the -blank space created by the removal of the text. A list of the basic bare -essentials for editing the text of an input line follows. - -@table @asis -@item @key{C-b} -Move back one character. -@item @key{C-f} -Move forward one character. -@item @key{DEL} -Delete the character to the left of the cursor. -@item @key{C-d} -Delete the character underneath the cursor. -@item @w{Printing characters} -Insert itself into the line at the cursor. -@item @key{C-_} -Undo the last thing that you did. You can undo all the way back to an -empty line. -@end table - -@node Readline Movement Commands -@subsection Readline Movement Commands - -The above table describes the most basic possible keystrokes that you need -in order to do editing of the input line. For your convenience, many -other commands have been added in addition to @key{C-b}, @key{C-f}, -@key{C-d}, and @key{DEL}. Here are some commands for moving more rapidly -about the line. - -@table @key -@item C-a -Move to the start of the line. -@item C-e -Move to the end of the line. -@item M-f -Move forward a word. -@item M-b -Move backward a word. -@item C-l -Clear the screen, reprinting the current line at the top. -@end table - -Notice how @key{C-f} moves forward a character, while @key{M-f} moves -forward a word. It is a loose convention that control keystrokes -operate on characters while meta keystrokes operate on words. - -@node Readline Killing Commands -@subsection Readline Killing Commands - -@dfn{Killing} text means to delete the text from the line, but to save -it away for later use, usually by @dfn{yanking} it back into the line. -If the description for a command says that it `kills' text, then you can -be sure that you can get the text back in a different (or the same) -place later. - -Here is the list of commands for killing text. - -@table @key -@item C-k -Kill the text from the current cursor position to the end of the line. - -@item M-d -Kill from the cursor to the end of the current word, or if between -words, to the end of the next word. - -@item M-DEL -Kill from the cursor to the start of the previous word, or if between -words, to the start of the previous word. - -@item C-w -Kill from the cursor to the previous whitespace. This is different than -@key{M-DEL} because the word boundaries differ. - -@end table - -And, here is how to @dfn{yank} the text back into the line. - -@table @key -@item C-y -Yank the most recently killed text back into the buffer at the cursor. - -@item M-y -Rotate the kill-ring, and yank the new top. You can only do this if -the prior command is @key{C-y} or @key{M-y}. -@end table - -When you use a kill command, the text is saved in a @dfn{kill-ring}. -Any number of consecutive kills save all of the killed text together, so -that when you yank it back, you get it in one clean sweep. The kill -ring is not line specific; the text that you killed on a previously -typed line is available to be yanked back later, when you are typing -another line. - -@node Readline Arguments -@subsection Readline Arguments - -You can pass numeric arguments to Readline commands. Sometimes the -argument acts as a repeat count, other times it is the @i{sign} of the -argument that is significant. If you pass a negative argument to a -command which normally acts in a forward direction, that command will -act in a backward direction. For example, to kill text back to the -start of the line, you might type @key{M--} @key{C-k}. - -The general way to pass numeric arguments to a command is to type meta -digits before the command. If the first `digit' you type is a minus -sign (@key{-}), then the sign of the argument will be negative. Once -you have typed one meta digit to get the argument started, you can type -the remainder of the digits, and then the command. For example, to give -the @key{C-d} command an argument of 10, you could type @key{M-1 0 C-d}. - - -@node Readline Init File -@section Readline Init File - -Although the Readline library comes with a set of @sc{gnu} Emacs-like -keybindings, it is possible that you would like to use a different set -of keybindings. You can customize programs that use Readline by putting -commands in an @dfn{init} file in your home directory. The name of this -file is @file{~/.inputrc}. - -When a program which uses the Readline library starts up, the -@file{~/.inputrc} file is read, and the keybindings are set. - -In addition, the @key{C-x C-r} command re-reads this init file, thus -incorporating any changes that you might have made to it. - -@menu -* Readline Init Syntax:: Syntax for the commands in @file{~/.inputrc}. -* Readline vi Mode:: Switching to @code{vi} mode in Readline. -@end menu - -@node Readline Init Syntax -@subsection Readline Init Syntax - -There are only four constructs allowed in the @file{~/.inputrc} -file: - -@table @asis -@item Variable Settings -You can change the state of a few variables in Readline. You do this by -using the @code{set} command within the init file. Here is how you -would specify that you wish to use @code{vi} line editing commands: - -@example -set editing-mode vi -@end example - -Right now, there are only a few variables which can be set; so few in -fact, that we just iterate them here: - -@table @code - -@item editing-mode -@vindex editing-mode -The @code{editing-mode} variable controls which editing mode you are -using. By default, @sc{gnu} Readline starts up in Emacs editing mode, where -the keystrokes are most similar to Emacs. This variable can either be -set to @code{emacs} or @code{vi}. - -@item horizontal-scroll-mode -@vindex horizontal-scroll-mode -This variable can either be set to @code{On} or @code{Off}. Setting it -to @code{On} means that the text of the lines that you edit will scroll -horizontally on a single screen line when they are larger than the width -of the screen, instead of wrapping onto a new screen line. By default, -this variable is set to @code{Off}. - -@item mark-modified-lines -@vindex mark-modified-lines -This variable when set to @code{On}, says to display an asterisk -(@samp{*}) at the starts of history lines which have been modified. -This variable is off by default. - -@item prefer-visible-bell -@vindex prefer-visible-bell -If this variable is set to @code{On} it means to use a visible bell if -one is available, rather than simply ringing the terminal bell. By -default, the value is @code{Off}. -@end table - -@item Key Bindings -The syntax for controlling keybindings in the @file{~/.inputrc} file is -simple. First you have to know the @i{name} of the command that you -want to change. The following pages contain tables of the command name, -the default keybinding, and a short description of what the command -does. - -Once you know the name of the command, simply place the name of the key -you wish to bind the command to, a colon, and then the name of the -command on a line in the @file{~/.inputrc} file. The name of the key -can be expressed in different ways, depending on which is most -comfortable for you. - -@table @asis -@item @w{@var{keyname}: @var{function-name} or @var{macro}} -@var{keyname} is the name of a key spelled out in English. For example: -@example -Control-u: universal-argument -Meta-Rubout: backward-kill-word -Control-o: ">&output" -@end example - -In the above example, @key{C-u} is bound to the function -@code{universal-argument}, and @key{C-o} is bound to run the macro -expressed on the right hand side (that is, to insert the text -@samp{>&output} into the line). - -@item @w{"@var{keyseq}": @var{function-name} or @var{macro}} -@var{keyseq} differs from @var{keyname} above in that strings denoting -an entire key sequence can be specified. Simply place the key sequence -in double quotes. @sc{gnu} Emacs style key escapes can be used, as in the -following example: - -@example -"\C-u": universal-argument -"\C-x\C-r": re-read-init-file -"\e[11~": "Function Key 1" -@end example - -In the above example, @key{C-u} is bound to the function -@code{universal-argument} (just as it was in the first example), -@key{C-x C-r} is bound to the function @code{re-read-init-file}, and -@key{ESC [ 1 1 ~} is bound to insert the text @samp{Function Key 1}. - -@end table -@end table - -@menu -* Commands For Moving:: Moving about the line. -* Commands For History:: Getting at previous lines. -* Commands For Text:: Commands for changing text. -* Commands For Killing:: Commands for killing and yanking. -* Numeric Arguments:: Specifying numeric arguments, repeat counts. -* Commands For Completion:: Getting Readline to do the typing for you. -* Miscellaneous Commands:: Other miscillaneous commands. -@end menu - -@need 2000 -@node Commands For Moving -@subsubsection Commands For Moving - -@ftable @code -@item beginning-of-line (@key{C-a}) -Move to the start of the current line. - -@item end-of-line (@key{C-e}) -Move to the end of the line. - -@item forward-char (@key{C-f}) -Move forward a character. - -@item backward-char (@key{C-b}) -Move back a character. - -@item forward-word (@key{M-f}) -Move forward to the end of the next word. - -@item backward-word (@key{M-b}) -Move back to the start of this, or the previous, word. - -@item clear-screen (@key{C-l}) -Clear the screen leaving the current line at the top of the screen. - -@end ftable - -@need 2000 -@node Commands For History -@subsubsection Commands For Manipulating The History - -@ftable @code -@item accept-line (Newline, Return) -Accept the line regardless of where the cursor is. If this line is -non-empty, add it to the history list. If this line was a history -line, then restore the history line to its original state. - -@item previous-history (@key{C-p}) -Move `up' through the history list. - -@item next-history (@key{C-n}) -Move `down' through the history list. - -@item beginning-of-history (@key{M-<}) -Move to the first line in the history. - -@item end-of-history (@key{M->}) -Move to the end of the input history, i.e., the line you are entering. - -@item reverse-search-history (@key{C-r}) -Search backward starting at the current line and moving `up' through -the history as necessary. This is an incremental search. - -@item forward-search-history (@key{C-s}) -Search forward starting at the current line and moving `down' through -the the history as necessary. - -@end ftable - -@need 2000 -@node Commands For Text -@subsubsection Commands For Changing Text - -@ftable @code -@item delete-char (@key{C-d}) -Delete the character under the cursor. If the cursor is at the -beginning of the line, and there are no characters in the line, and -the last character typed was not @key{C-d}, then return EOF. - -@item backward-delete-char (Rubout) -Delete the character behind the cursor. A numeric argument says to kill -the characters instead of deleting them. - -@item quoted-insert (@key{C-q}, @key{C-v}) -Add the next character that you type to the line verbatim. This is -how to insert things like @key{C-q} for example. - -@item tab-insert (@key{M-TAB}) -Insert a tab character. - -@item self-insert (a, b, A, 1, !, ...) -Insert yourself. - -@item transpose-chars (@key{C-t}) -Drag the character before point forward over the character at point. -Point moves forward as well. If point is at the end of the line, then -transpose the two characters before point. Negative arguments don't work. - -@item transpose-words (@key{M-t}) -Drag the word behind the cursor past the word in front of the cursor -moving the cursor over that word as well. - -@item upcase-word (@key{M-u}) -Uppercase all letters in the current (or following) word. With a -negative argument, do the previous word, but do not move point. - -@item downcase-word (@key{M-l}) -Lowercase all letters in the current (or following) word. With a -negative argument, do the previous word, but do not move point. - -@item capitalize-word (@key{M-c}) -Uppercase the first letter in the current (or following) word. With a -negative argument, do the previous word, but do not move point. - -@end ftable - -@need 2000 -@node Commands For Killing -@subsubsection Killing And Yanking - -@ftable @code -@item kill-line (@key{C-k}) -Kill the text from the current cursor position to the end of the line. - -@item backward-kill-line () -Kill backward to the beginning of the line. This is normally unbound. - -@item kill-word (@key{M-d}) -Kill from the cursor to the end of the current word, or if between -words, to the end of the next word. - -@item backward-kill-word (@key{M-DEL}) -Kill the word behind the cursor. - -@item unix-line-discard (@key{C-u}) -Kill the whole line the way @key{C-u} used to in Unix line input. -The killed text is saved on the kill-ring. - -@item unix-word-rubout (@key{C-w}) -Kill the word the way @key{C-w} used to in Unix line input. -The killed text is saved on the kill-ring. This is different than -backward-kill-word because the word boundaries differ. - -@item yank (@key{C-y}) -Yank the top of the kill ring into the buffer at point. - -@item yank-pop (@key{M-y}) -Rotate the kill-ring, and yank the new top. You can only do this if -the prior command is yank or yank-pop. -@end ftable - -@need 2000 -@node Numeric Arguments -@subsubsection Specifying Numeric Arguments - -@ftable @code - -@item digit-argument (@key{M-0}, @key{M-1}, ... @key{M--}) -Add this digit to the argument already accumulating, or start a new -argument. @key{M--} starts a negative argument. - -@item universal-argument () -Do what @key{C-u} does in @sc{gnu} Emacs. By default, this is not bound. -@end ftable - - -@need 2000 -@node Commands For Completion -@subsubsection Letting Readline Type For You - -@ftable @code -@item complete (TAB) -Attempt to do completion on the text before point. This is -implementation defined. Generally, if you are typing a filename -argument, you can do filename completion; if you are typing a command, -you can do command completion, if you are typing in a symbol to GDB, you -can do symbol name completion, if you are typing in a variable to Bash, -you can do variable name completion. - -@item possible-completions (M-?) -List the possible completions of the text before point. -@end ftable - -@need 2000 -@node Miscellaneous Commands -@subsubsection Some Miscellaneous Commands - -@ftable @code - -@item re-read-init-file (@key{C-x} @key{C-r}) -Read in the contents of your @file{~/.inputrc} file, and incorporate -any bindings found there. - -@item abort (@key{C-g}) -Stop running the current editing command. - -@ignore -@c I have no idea what this means, and can't figure it out by -@c experiment, and can't find it in the readline source. -@c doc@cygnus.com, 20may1993. -@item do-uppercase-version (@key{M-a}, @key{M-b}, ...) -Run the command that is bound to your uppercase brother. -@end ignore - -@item prefix-meta (ESC) -Make the next character that you type be metafied. This is for people -without a meta key. Typing @key{ESC f} is equivalent to typing -@key{M-f}. - -@item undo (@key{C-_}) -Incremental undo, separately remembered for each line. - -@item revert-line (@key{M-r}) -Undo all changes made to this line. This is like typing the `undo' -command enough times to get back to the beginning. -@end ftable - -@need 2000 -@node Readline vi Mode -@subsection Readline @code{vi} Mode - -@cindex @code{vi} style command editing -@kindex toggle-editing-mode -While the Readline library does not have a full set of @code{vi} editing -functions, it does contain enough to allow simple editing of the line. - -In order to switch interactively between @sc{gnu} Emacs and @code{vi} -editing modes, use the command @key{M-C-j} (toggle-editing-mode). - -When you enter a line in @code{vi} mode, you are already placed in `insertion' -mode, as if you had typed an `i'. Pressing @key{ESC} switches you into -`edit' mode, where you can edit the text of the line with the standard -@code{vi} movement keys, move to previous history lines with `k', and following -lines with `j', and so forth. - |